{"version":3,"file":"js/vendors.js","mappings":";mFACA,IAAIA,EAAa,EAAQ,MAEzBC,EAAOC,QAAU,SAAUC,GACzB,MAAoB,iBAANA,EAAwB,OAAPA,EAAcH,EAAWG,EAC1D,C,yBCHAD,EAAQE,YAAa,EACrBF,EAAiB,aAAS,EAE1B,IAIgCG,EAJ5BC,GAI4BD,EAJQ,EAAQ,QAIKA,EAAID,WAAaC,EAAM,CAAE,QAAWA,GAFrFE,EAAS,EAAQ,MAMrB,SAASC,EAAgBC,EAAGC,GAA+G,OAA1GF,EAAkBG,OAAOC,gBAAkB,SAAyBH,EAAGC,GAAsB,OAAjBD,EAAEI,UAAYH,EAAUD,CAAG,EAAUD,EAAgBC,EAAGC,EAAI,CAEzK,IAAII,EAAmB,SAAUC,GAJjC,IAAwBC,EAAUC,EAOhC,SAASH,EAAII,GACX,IAAIC,EAIJ,OAFAA,EAAQJ,EAAWK,KAAKC,KAAMH,IAASG,MACjCC,KAAOf,EAAOgB,IACbJ,CACT,CAEA,OAfgCF,EAKZF,GALEC,EAKPF,GALwCU,UAAYb,OAAOc,OAAOR,EAAWO,WAAYR,EAASQ,UAAUE,YAAcV,EAAUR,EAAgBQ,EAAUC,GAetKH,CACT,CAZuB,CAYrBR,EAAoB,SAEtBJ,EAAiB,QAAIY,EACrBb,EAAOC,QAAUA,EAAQyB,O,yBC7BzB,IAAIP,EAAO,EAAQ,MACfQ,EAAY,EAAQ,MACpBC,EAAW,EAAQ,MACnBC,EAAc,EAAQ,MACtBC,EAAoB,EAAQ,KAE5BC,EAAaC,UAEjBhC,EAAOC,QAAU,SAAUgC,EAAUC,GACnC,IAAIC,EAAiBC,UAAUC,OAAS,EAAIP,EAAkBG,GAAYC,EAC1E,GAAIP,EAAUQ,GAAiB,OAAOP,EAAST,EAAKgB,EAAgBF,IACpE,MAAM,IAAIF,EAAWF,EAAYI,GAAY,mBAC/C,C,yBCZAvB,OAAO4B,eAAerC,EAAS,aAAc,CACzCsC,OAAO,IAEX,SAAiBC,EAAQC,GACrB,IAAI,IAAIC,KAAQD,EAAI/B,OAAO4B,eAAeE,EAAQE,EAAM,CACpDC,YAAY,EACZC,IAAKH,EAAIC,IAEjB,CACAG,CAAQ5C,EAAS,CACb6C,WAAY,WACR,OAAOA,CACX,EACAC,YAAa,WACT,OAAOA,CACX,IAEJ,MAAMC,EAA4BC,EAAyB,EAAQ,OACnE,SAASA,EAAyB7C,GAC9B,OAAOA,GAAOA,EAAID,WAAaC,EAAM,CACjCsB,QAAStB,EAEjB,CACA,IAAI8C,EAAM,wDACNC,EAAY,4CACZC,EAAQ,qBACRC,EAAM,kBACNC,EAAY,aACZC,EAAkB,yDAClBC,EAAM,IAAIC,OAAO,mBAAmBL,EAAMM,UAAUH,EAAgBG,aAAaL,EAAIK,UAAUN,EAAMM,UAAUH,EAAgBG,eAAeL,EAAIK,UAAUN,EAAMM,UAAUH,EAAgBG,eAAeJ,EAAUI,UAAUN,EAAMM,UAAUH,EAAgBG,qBAC/PC,EAAM,IAAIF,OAAO,sBAAsBL,EAAMM,iCAAiCH,EAAgBG,aAAaL,EAAIK,UAAUN,EAAMM,UAAUH,EAAgBG,eAAeL,EAAIK,UAAUN,EAAMM,UAAUH,EAAgBG,eAAeJ,EAAUI,UAAUN,EAAMM,UAAUH,EAAgBG,qBAC7R,SAASZ,EAAWP,GAAO,MAAEqB,GAAO,GAAW,CAAC,GAC5C,IAAIC,EAASC,EACb,GAAqB,iBAAVvB,EACP,OAAO,KAGX,GAAc,iBADdA,EAAQA,EAAMwB,QAEV,MAAO,CACHC,KAAM,MACNC,MAAO,CACH,IACA,IACA,KAEJC,MAAO,KAGf,GAAI3B,KAASS,EAAYtB,QACrB,MAAO,CACHsC,KAAM,MACNC,MAAOjB,EAAYtB,QAAQa,GAAO4B,IAAKC,GAAIA,EAAEC,aAGrD,IAAIC,EAAM/B,EAAMgC,QAAQpB,EAAW,CAACqB,EAAGC,EAAGC,EAAGC,EAAGC,IAAI,CAC5C,IACAH,EACAA,EACAC,EACAA,EACAC,EACAA,EACAC,EAAIA,EAAIA,EAAI,IACdC,KAAK,KAAKC,MAAM5B,GACtB,GAAY,OAARoB,EACA,MAAO,CACHN,KAAM,MACNC,MAAO,CACHc,SAAST,EAAI,GAAI,IACjBS,SAAST,EAAI,GAAI,IACjBS,SAAST,EAAI,GAAI,KACnBH,IAAKC,GAAIA,EAAEC,YACbH,MAAOI,EAAI,IAAMS,SAAST,EAAI,GAAI,IAAM,KAAKD,gBAAaW,GAGlE,IAAIC,EACJ,IAAIH,EAA8C,QAArCG,EAAe1C,EAAMuC,MAAMtB,UAAwC,IAAtByB,EAA0BA,EAAe1C,EAAMuC,MAAMnB,GAC/G,GAAc,OAAVmB,EACA,OAAO,KAEX,IAAIb,EAAQ,CACRa,EAAM,GACNA,EAAM,GACNA,EAAM,IACRI,OAAOC,SAAShB,IAAKC,GAAIA,EAAEC,YAG7B,OAAqB,IAAjBJ,EAAM5B,QAAgB4B,EAAM,GAAGmB,WAAW,QACnC,CACHpB,KAAMc,EAAM,GACZb,MAAO,CACHA,EAAM,IAEVC,MAAOD,EAAM,IAGhBL,GAA0B,IAAjBK,EAAM5B,OAGhB4B,EAAM5B,OAAS,IAAM4B,EAAMoB,KAAMC,GAAO,eAAeC,KAAKD,IACrD,KAEJ,CACHtB,KAAMc,EAAM,GACZb,QACAC,MAAgC,QAAxBL,EAAUiB,EAAM,UAAiC,IAAjBjB,GAAwE,QAAzCC,EAAmBD,EAAQQ,gBAAgD,IAA1BP,OAAtD,EAA6FA,EAAiB3C,KAAK0C,IAR9K,IAUf,CACA,SAASd,GAAY,KAAEiB,EAAK,MAAEC,EAAM,MAAEC,IAClC,IAAIsB,OAAqBR,IAAVd,EACf,MAAa,SAATF,GAA4B,SAATA,EACZ,GAAGA,KAAQC,EAAMY,KAAK,QAAQW,EAAW,KAAKtB,IAAU,MAE5D,GAAGF,KAAQC,EAAMY,KAAK,OAAOW,EAAW,MAAMtB,IAAU,KACnE,C,0BClHA,IAAIuB,EAAI,EAAQ,MACZC,EAAQ,aACRC,EAAmB,EAAQ,MAE3BC,EAAO,OACPC,GAAc,EAIdD,IAAQ,IAAIE,MAAM,GAAGF,GAAM,WAAcC,GAAc,CAAO,GAIlEJ,EAAE,CAAEjD,OAAQ,QAASuD,OAAO,EAAMC,OAAQH,GAAe,CACvDI,KAAM,SAAcC,GAClB,OAAOR,EAAMtE,KAAM8E,EAAY9D,UAAUC,OAAS,EAAID,UAAU,QAAK4C,EACvE,IAIFW,EAAiBC,E,wBCXjB,IAGIO,EAAiB,4BAOjBC,EAAmB,iBAGnBC,EAAU,qBAMVC,EAAU,oBAKVC,EAAY,kBA2BZC,EAAe,8BAGfC,EAAW,mBAGXC,EAAiB,CAAC,EACtBA,EAxBiB,yBAwBYA,EAvBZ,yBAwBjBA,EAvBc,sBAuBYA,EAtBX,uBAuBfA,EAtBe,uBAsBYA,EArBZ,uBAsBfA,EArBsB,8BAqBYA,EApBlB,wBAqBhBA,EApBgB,yBAoBY,EAC5BA,EAAeL,GAAWK,EAjDX,kBAkDfA,EAhCqB,wBAgCYA,EAhDnB,oBAiDdA,EAhCkB,qBAgCYA,EAhDhB,iBAiDdA,EAhDe,kBAgDYA,EAAeJ,GAC1CI,EA9Ca,gBA8CYA,EA7CT,mBA8ChBA,EAAeH,GAAaG,EA1CZ,mBA2ChBA,EA1Ca,gBA0CYA,EAzCT,mBA0ChBA,EAxCiB,qBAwCY,EAG7B,IAoIMC,EAtBWC,EAAMC,EA9GnBC,EAA8B,iBAAV,EAAApC,GAAsB,EAAAA,GAAU,EAAAA,EAAOhE,SAAWA,QAAU,EAAAgE,EAGhFqC,EAA0B,iBAARC,MAAoBA,MAAQA,KAAKtG,SAAWA,QAAUsG,KAGxEC,EAAOH,GAAcC,GAAYG,SAAS,cAATA,GAGjCC,EAA4ClH,IAAYA,EAAQmH,UAAYnH,EAG5EoH,EAAaF,GAA4CnH,IAAWA,EAAOoH,UAAYpH,EAGvFsH,EAAgBD,GAAcA,EAAWpH,UAAYkH,EAGrDI,EAAcD,GAAiBR,EAAWU,QAG1CC,EAAY,WACd,IAIE,OAFYJ,GAAcA,EAAWK,SAAWL,EAAWK,QAAQ,QAAQC,OAOpEJ,GAAeA,EAAYK,SAAWL,EAAYK,QAAQ,OACnE,CAAE,MAAOC,GAAI,CACf,CAZe,GAeXC,EAAmBL,GAAYA,EAASM,aAiFxCC,EAAalC,MAAMvE,UACnB0G,EAAYf,SAAS3F,UACrB2G,EAAcxH,OAAOa,UAGrB4G,EAAalB,EAAK,sBAGlBmB,EAAeH,EAAU5D,SAGzBgE,EAAiBH,EAAYG,eAG7BC,GACE3B,EAAM,SAAS4B,KAAKJ,GAAcA,EAAWK,MAAQL,EAAWK,KAAKC,UAAY,KACvE,iBAAmB9B,EAAO,GAQtC+B,EAAuBR,EAAY7D,SAGnCsE,EAAmBP,EAAajH,KAAKT,QAGrCkI,EAAanF,OAAO,IACtB2E,EAAajH,KAAKkH,GAAgB9D,QA7KjB,sBA6KuC,QACvDA,QAAQ,yDAA0D,SAAW,KAI5EsE,EAASvB,EAAgBL,EAAK4B,YAAS7D,EACvC8D,EAAS7B,EAAK6B,OACdC,EAAa9B,EAAK8B,WAElBC,GADcH,GAASA,EAAOI,YA9CjBrC,EA+CUlG,OAAOwI,eA/CXrC,EA+C2BnG,OA9CzC,SAASyI,GACd,OAAOvC,EAAKC,EAAUsC,GACxB,GA6CEC,EAAe1I,OAAOc,OACtB6H,EAAuBnB,EAAYmB,qBACnCC,EAAStB,EAAWsB,OACpBC,EAAiBT,EAASA,EAAOU,iBAAcxE,EAE/C1C,EAAkB,WACpB,IACE,IAAIsE,EAAO6C,GAAU/I,OAAQ,kBAE7B,OADAkG,EAAK,CAAC,EAAG,GAAI,CAAC,GACPA,CACT,CAAE,MAAOiB,GAAI,CACf,CANqB,GASjB6B,EAAiBb,EAASA,EAAOc,cAAW3E,EAC5C4E,EAAYC,KAAKC,IACjBC,EAAYC,KAAKC,IAGjBC,EAAMT,GAAUxC,EAAM,OACtBkD,EAAeV,GAAU/I,OAAQ,UAUjC0J,EAAc,WAChB,SAASC,IAAU,CACnB,OAAO,SAAStE,GACd,IAAKuE,GAASvE,GACZ,MAAO,CAAC,EAEV,GAAIqD,EACF,OAAOA,EAAarD,GAEtBsE,EAAO9I,UAAYwE,EACnB,IAAIwE,EAAS,IAAIF,EAEjB,OADAA,EAAO9I,eAAYyD,EACZuF,CACT,CACF,CAdiB,GAuBjB,SAASC,EAAKC,GACZ,IAAIC,GAAS,EACTrI,EAAoB,MAAXoI,EAAkB,EAAIA,EAAQpI,OAG3C,IADAjB,KAAKuJ,UACID,EAAQrI,GAAQ,CACvB,IAAIuI,EAAQH,EAAQC,GACpBtJ,KAAKyJ,IAAID,EAAM,GAAIA,EAAM,GAC3B,CACF,CA6FA,SAASE,EAAUL,GACjB,IAAIC,GAAS,EACTrI,EAAoB,MAAXoI,EAAkB,EAAIA,EAAQpI,OAG3C,IADAjB,KAAKuJ,UACID,EAAQrI,GAAQ,CACvB,IAAIuI,EAAQH,EAAQC,GACpBtJ,KAAKyJ,IAAID,EAAM,GAAIA,EAAM,GAC3B,CACF,CA0GA,SAASG,EAASN,GAChB,IAAIC,GAAS,EACTrI,EAAoB,MAAXoI,EAAkB,EAAIA,EAAQpI,OAG3C,IADAjB,KAAKuJ,UACID,EAAQrI,GAAQ,CACvB,IAAIuI,EAAQH,EAAQC,GACpBtJ,KAAKyJ,IAAID,EAAM,GAAIA,EAAM,GAC3B,CACF,CA4FA,SAASI,EAAMP,GACb,IAAIQ,EAAO7J,KAAK8J,SAAW,IAAIJ,EAAUL,GACzCrJ,KAAK+J,KAAOF,EAAKE,IACnB,CAsIA,SAASC,EAAiBf,EAAQgB,EAAK9I,SACtByC,IAAVzC,IAAwB+I,GAAGjB,EAAOgB,GAAM9I,SAC9ByC,IAAVzC,KAAyB8I,KAAOhB,KACnCkB,GAAgBlB,EAAQgB,EAAK9I,EAEjC,CAYA,SAASiJ,EAAYnB,EAAQgB,EAAK9I,GAChC,IAAIkJ,EAAWpB,EAAOgB,GAChBhD,EAAelH,KAAKkJ,EAAQgB,IAAQC,GAAGG,EAAUlJ,UACxCyC,IAAVzC,GAAyB8I,KAAOhB,IACnCkB,GAAgBlB,EAAQgB,EAAK9I,EAEjC,CAUA,SAASmJ,GAAaC,EAAON,GAE3B,IADA,IAAIhJ,EAASsJ,EAAMtJ,OACZA,KACL,GAAIiJ,GAAGK,EAAMtJ,GAAQ,GAAIgJ,GACvB,OAAOhJ,EAGX,OAAQ,CACV,CAWA,SAASkJ,GAAgBlB,EAAQgB,EAAK9I,GACzB,aAAP8I,GAAsB/I,EACxBA,EAAe+H,EAAQgB,EAAK,CAC1B,cAAgB,EAChB,YAAc,EACd,MAAS9I,EACT,UAAY,IAGd8H,EAAOgB,GAAO9I,CAElB,CA7aAiI,EAAKjJ,UAAUoJ,MAvEf,WACEvJ,KAAK8J,SAAWf,EAAeA,EAAa,MAAQ,CAAC,EACrD/I,KAAK+J,KAAO,CACd,EAqEAX,EAAKjJ,UAAkB,OAzDvB,SAAoB8J,GAClB,IAAId,EAASnJ,KAAKwK,IAAIP,WAAejK,KAAK8J,SAASG,GAEnD,OADAjK,KAAK+J,MAAQZ,EAAS,EAAI,EACnBA,CACT,EAsDAC,EAAKjJ,UAAUqB,IA3Cf,SAAiByI,GACf,IAAIJ,EAAO7J,KAAK8J,SAChB,GAAIf,EAAc,CAChB,IAAII,EAASU,EAAKI,GAClB,OAAOd,IAAWpE,OAAiBnB,EAAYuF,CACjD,CACA,OAAOlC,EAAelH,KAAK8J,EAAMI,GAAOJ,EAAKI,QAAOrG,CACtD,EAqCAwF,EAAKjJ,UAAUqK,IA1Bf,SAAiBP,GACf,IAAIJ,EAAO7J,KAAK8J,SAChB,OAAOf,OAA8BnF,IAAdiG,EAAKI,GAAsBhD,EAAelH,KAAK8J,EAAMI,EAC9E,EAwBAb,EAAKjJ,UAAUsJ,IAZf,SAAiBQ,EAAK9I,GACpB,IAAI0I,EAAO7J,KAAK8J,SAGhB,OAFA9J,KAAK+J,MAAQ/J,KAAKwK,IAAIP,GAAO,EAAI,EACjCJ,EAAKI,GAAQlB,QAA0BnF,IAAVzC,EAAuB4D,EAAiB5D,EAC9DnB,IACT,EAsHA0J,EAAUvJ,UAAUoJ,MApFpB,WACEvJ,KAAK8J,SAAW,GAChB9J,KAAK+J,KAAO,CACd,EAkFAL,EAAUvJ,UAAkB,OAvE5B,SAAyB8J,GACvB,IAAIJ,EAAO7J,KAAK8J,SACZR,EAAQgB,GAAaT,EAAMI,GAE/B,QAAIX,EAAQ,IAIRA,GADYO,EAAK5I,OAAS,EAE5B4I,EAAKY,MAELvC,EAAOnI,KAAK8J,EAAMP,EAAO,KAEzBtJ,KAAK+J,KACA,GACT,EAyDAL,EAAUvJ,UAAUqB,IA9CpB,SAAsByI,GACpB,IAAIJ,EAAO7J,KAAK8J,SACZR,EAAQgB,GAAaT,EAAMI,GAE/B,OAAOX,EAAQ,OAAI1F,EAAYiG,EAAKP,GAAO,EAC7C,EA0CAI,EAAUvJ,UAAUqK,IA/BpB,SAAsBP,GACpB,OAAOK,GAAatK,KAAK8J,SAAUG,IAAQ,CAC7C,EA8BAP,EAAUvJ,UAAUsJ,IAlBpB,SAAsBQ,EAAK9I,GACzB,IAAI0I,EAAO7J,KAAK8J,SACZR,EAAQgB,GAAaT,EAAMI,GAQ/B,OANIX,EAAQ,KACRtJ,KAAK+J,KACPF,EAAKa,KAAK,CAACT,EAAK9I,KAEhB0I,EAAKP,GAAO,GAAKnI,EAEZnB,IACT,EAwGA2J,EAASxJ,UAAUoJ,MAtEnB,WACEvJ,KAAK+J,KAAO,EACZ/J,KAAK8J,SAAW,CACd,KAAQ,IAAIV,EACZ,IAAO,IAAKN,GAAOY,GACnB,OAAU,IAAIN,EAElB,EAgEAO,EAASxJ,UAAkB,OArD3B,SAAwB8J,GACtB,IAAId,EAASwB,GAAW3K,KAAMiK,GAAa,OAAEA,GAE7C,OADAjK,KAAK+J,MAAQZ,EAAS,EAAI,EACnBA,CACT,EAkDAQ,EAASxJ,UAAUqB,IAvCnB,SAAqByI,GACnB,OAAOU,GAAW3K,KAAMiK,GAAKzI,IAAIyI,EACnC,EAsCAN,EAASxJ,UAAUqK,IA3BnB,SAAqBP,GACnB,OAAOU,GAAW3K,KAAMiK,GAAKO,IAAIP,EACnC,EA0BAN,EAASxJ,UAAUsJ,IAdnB,SAAqBQ,EAAK9I,GACxB,IAAI0I,EAAOc,GAAW3K,KAAMiK,GACxBF,EAAOF,EAAKE,KAIhB,OAFAF,EAAKJ,IAAIQ,EAAK9I,GACdnB,KAAK+J,MAAQF,EAAKE,MAAQA,EAAO,EAAI,EAC9B/J,IACT,EAuGA4J,EAAMzJ,UAAUoJ,MA3EhB,WACEvJ,KAAK8J,SAAW,IAAIJ,EACpB1J,KAAK+J,KAAO,CACd,EAyEAH,EAAMzJ,UAAkB,OA9DxB,SAAqB8J,GACnB,IAAIJ,EAAO7J,KAAK8J,SACZX,EAASU,EAAa,OAAEI,GAG5B,OADAjK,KAAK+J,KAAOF,EAAKE,KACVZ,CACT,EAyDAS,EAAMzJ,UAAUqB,IA9ChB,SAAkByI,GAChB,OAAOjK,KAAK8J,SAAStI,IAAIyI,EAC3B,EA6CAL,EAAMzJ,UAAUqK,IAlChB,SAAkBP,GAChB,OAAOjK,KAAK8J,SAASU,IAAIP,EAC3B,EAiCAL,EAAMzJ,UAAUsJ,IArBhB,SAAkBQ,EAAK9I,GACrB,IAAI0I,EAAO7J,KAAK8J,SAChB,GAAID,aAAgBH,EAAW,CAC7B,IAAIkB,EAAQf,EAAKC,SACjB,IAAKhB,GAAQ8B,EAAM3J,OAAS4J,IAG1B,OAFAD,EAAMF,KAAK,CAACT,EAAK9I,IACjBnB,KAAK+J,OAASF,EAAKE,KACZ/J,KAET6J,EAAO7J,KAAK8J,SAAW,IAAIH,EAASiB,EACtC,CAGA,OAFAf,EAAKJ,IAAIQ,EAAK9I,GACdnB,KAAK+J,KAAOF,EAAKE,KACV/J,IACT,EA0IA,SAAS8K,GAAW3J,GAClB,OAAa,MAATA,OACeyC,IAAVzC,EA7xBQ,qBANL,gBAqyBJgH,GAAkBA,KAAkB7I,OAAO6B,GA6YrD,SAAmBA,GACjB,IAAI4J,EAAQ9D,EAAelH,KAAKoB,EAAOgH,GACnC6C,EAAM7J,EAAMgH,GAEhB,IACEhH,EAAMgH,QAAkBvE,EACxB,IAAIqH,GAAW,CACjB,CAAE,MAAOxE,GAAI,CAEb,IAAI0C,EAAS7B,EAAqBvH,KAAKoB,GAQvC,OAPI8J,IACEF,EACF5J,EAAMgH,GAAkB6C,SAEjB7J,EAAMgH,IAGVgB,CACT,CA9ZM+B,CAAU/J,GAwhBhB,SAAwBA,GACtB,OAAOmG,EAAqBvH,KAAKoB,EACnC,CAzhBMgK,CAAehK,EACrB,CASA,SAASiK,GAAgBjK,GACvB,OAAOkK,GAAalK,IAAU2J,GAAW3J,IAAU8D,CACrD,CA+DA,SAASqG,GAAUrC,EAAQ3G,EAAQiJ,EAAUC,EAAYC,GACnDxC,IAAW3G,GA4QR,SAAS2G,EAAQyC,EAAUC,GAMhC,IALA,IAAIrC,GAAS,EACTsC,EAAWtM,OAAO2J,GAClB4C,EAAQF,EAAS1C,GACjBhI,EAAS4K,EAAM5K,OAEZA,KAAU,CACf,IAAIgJ,EAAM4B,IAA6BvC,GACvC,IAA+C,IAA3CoC,EAASE,EAAS3B,GAAMA,EAAK2B,GAC/B,KAEJ,CAEF,CAtRAE,CAAQxJ,EAAQ,SAASyJ,EAAU9B,GAEjC,GADAwB,IAAUA,EAAQ,IAAI7B,GAClBV,GAAS6C,IA+BjB,SAAuB9C,EAAQ3G,EAAQ2H,EAAKsB,EAAUS,EAAWR,EAAYC,GAC3E,IAAIpB,EAAW4B,GAAQhD,EAAQgB,GAC3B8B,EAAWE,GAAQ3J,EAAQ2H,GAC3BiC,EAAUT,EAAMjK,IAAIuK,GAExB,GAAIG,EACFlC,EAAiBf,EAAQgB,EAAKiC,OADhC,CAIA,IA0HuBC,EACnBC,EAfoBC,EACpBlD,EA2iBqBhI,EAxpBrBmL,EAAWd,EACXA,EAAWnB,EAAU0B,EAAW9B,EAAM,GAAKhB,EAAQ3G,EAAQmJ,QAC3D7H,EAEA2I,OAAwB3I,IAAb0I,EAEf,GAAIC,EAAU,CACZ,IAAIC,EAAQC,GAAQV,GAChBW,GAAUF,GAASjE,GAASwD,GAC5BY,GAAWH,IAAUE,GAAU/F,GAAaoF,GAEhDO,EAAWP,EACPS,GAASE,GAAUC,EACjBF,GAAQpC,GACViC,EAAWjC,EA2oBVgB,GADkBlK,EAxoBMkJ,IAyoBDuC,GAAYzL,GAxoBpCmL,EAsHR,SAAmBhK,EAAQiI,GACzB,IAAIjB,GAAS,EACTrI,EAASqB,EAAOrB,OAGpB,IADAsJ,IAAUA,EAAQ7F,MAAMzD,MACfqI,EAAQrI,GACfsJ,EAAMjB,GAAShH,EAAOgH,GAExB,OAAOiB,CACT,CA/HmBsC,CAAUxC,GAEdqC,GACPH,GAAW,EACXD,EAqER,SAAqBF,GAEjB,OAAOA,EAAOU,OAOlB,CA9EmBC,CAAYhB,IAEhBY,GACPJ,GAAW,EAqFbpD,EAAS,IADWkD,GAcDF,EAjGUJ,GAkGiBK,QAdrB/L,YAAYgM,EAAYW,YACrD,IAAIrF,EAAWwB,GAAQM,IAAI,IAAI9B,EAAW0E,IAatCD,EAZGjD,EAtFDmD,EAmGC,IAAIH,EAAW9L,YAAY+L,EAAQD,EAAWc,WAAYd,EAAWlL,SAhGtEqL,EAAW,GAmyBnB,SAAuBnL,GACrB,IAAKkK,GAAalK,IAAU2J,GAAW3J,IAAUgE,EAC/C,OAAO,EAET,IAAIR,EAAQiD,EAAazG,GACzB,GAAc,OAAVwD,EACF,OAAO,EAET,IAAIuI,EAAOjG,EAAelH,KAAK4E,EAAO,gBAAkBA,EAAMtE,YAC9D,MAAsB,mBAAR6M,GAAsBA,aAAgBA,GAClDlG,EAAajH,KAAKmN,IAAS3F,CAC/B,CA3yBa4F,CAAcpB,IAAaqB,GAAYrB,IAC9CO,EAAWjC,EACP+C,GAAY/C,GACdiC,EAq1BR,SAAuBnL,GACrB,OA5tBF,SAAoBmB,EAAQuJ,EAAO5C,GACjC,IAAIoE,GAASpE,EACbA,IAAWA,EAAS,CAAC,GAKrB,IAHA,IAAIK,GAAS,EACTrI,EAAS4K,EAAM5K,SAEVqI,EAAQrI,GAAQ,CACvB,IAAIgJ,EAAM4B,EAAMvC,GAEZgD,OAEA1I,OAEaA,IAAb0I,IACFA,EAAWhK,EAAO2H,IAEhBoD,EACFlD,GAAgBlB,EAAQgB,EAAKqC,GAE7BlC,EAAYnB,EAAQgB,EAAKqC,EAE7B,CACA,OAAOrD,CACT,CAosBSqE,CAAWnM,EAAOoM,GAAOpM,GAClC,CAv1BmBqM,CAAcnD,GAEjBnB,GAASmB,KAAaoD,GAAWpD,KACzCiC,EAwQR,SAAyBrD,GACvB,MAAqC,mBAAtBA,EAAO5I,aAA8BqN,GAAYzE,GAE5D,CAAC,EADDD,EAAWpB,EAAaqB,GAE9B,CA5QmB0E,CAAgB5B,KAI7BQ,GAAW,CAEf,CACIA,IAEFd,EAAMhC,IAAIsC,EAAUO,GACpBN,EAAUM,EAAUP,EAAUR,EAAUC,EAAYC,GACpDA,EAAc,OAAEM,IAElB/B,EAAiBf,EAAQgB,EAAKqC,EAnD9B,CAoDF,CA1FMsB,CAAc3E,EAAQ3G,EAAQ2H,EAAKsB,EAAUD,GAAWE,EAAYC,OAEjE,CACH,IAAIa,EAAWd,EACXA,EAAWS,GAAQhD,EAAQgB,GAAM8B,EAAW9B,EAAM,GAAKhB,EAAQ3G,EAAQmJ,QACvE7H,OAEaA,IAAb0I,IACFA,EAAWP,GAEb/B,EAAiBf,EAAQgB,EAAKqC,EAChC,CACF,EAAGiB,GACL,CAmGA,IAAIM,GAAmB3M,EAA4B,SAASsE,EAAMsI,GAChE,OAAO5M,EAAesE,EAAM,WAAY,CACtC,cAAgB,EAChB,YAAc,EACd,OA+3BcrE,EA/3BI2M,EAg4Bb,WACL,OAAO3M,CACT,GAj4BE,UAAY,IA83BhB,IAAkBA,CA53BlB,EAPwC4M,GA8KxC,SAASpD,GAAW5H,EAAKkH,GACvB,IA4GiB9I,EACblB,EA7GA4J,EAAO9G,EAAI+G,SACf,OA6GgB,WADZ7J,SADakB,EA3GA8I,KA6GmB,UAARhK,GAA4B,UAARA,GAA4B,WAARA,EACrD,cAAVkB,EACU,OAAVA,GA9GD0I,EAAmB,iBAAPI,EAAkB,SAAW,QACzCJ,EAAK9G,GACX,CAUA,SAASsF,GAAUY,EAAQgB,GACzB,IAAI9I,EAnhCN,SAAkB8H,EAAQgB,GACxB,OAAiB,MAAVhB,OAAiBrF,EAAYqF,EAAOgB,EAC7C,CAihCc+D,CAAS/E,EAAQgB,GAC7B,OA3WF,SAAsB9I,GACpB,SAAK+H,GAAS/H,IAodhB,SAAkBqE,GAChB,QAAS0B,GAAeA,KAAc1B,CACxC,CAtd0ByI,CAAS9M,MAGnBsM,GAAWtM,GAASqG,EAAapC,GAChCjB,KAgmBjB,SAAkBqB,GAChB,GAAY,MAARA,EAAc,CAChB,IACE,OAAOwB,EAAajH,KAAKyF,EAC3B,CAAE,MAAOiB,GAAI,CACb,IACE,OAAQjB,EAAO,EACjB,CAAE,MAAOiB,GAAI,CACf,CACA,MAAO,EACT,CA1mBsByH,CAAS/M,GAC/B,CAqWSgN,CAAahN,GAASA,OAAQyC,CACvC,CAkDA,SAASwK,GAAQjN,EAAOF,GACtB,IAAIhB,SAAckB,EAGlB,SAFAF,EAAmB,MAAVA,EAAiB+D,EAAmB/D,KAGlC,UAARhB,GACU,UAARA,GAAoBoF,EAASlB,KAAKhD,KAChCA,GAAS,GAAKA,EAAQ,GAAK,GAAKA,EAAQF,CACjD,CA0DA,SAASyM,GAAYvM,GACnB,IAAI+L,EAAO/L,GAASA,EAAMd,YAG1B,OAAOc,KAFqB,mBAAR+L,GAAsBA,EAAK/M,WAAc2G,EAG/D,CAsEA,SAASmF,GAAQhD,EAAQgB,GACvB,IAAY,gBAARA,GAAgD,mBAAhBhB,EAAOgB,KAIhC,aAAPA,EAIJ,OAAOhB,EAAOgB,EAChB,CAUA,IAAIoE,GAWJ,SAAkB7I,GAChB,IAAI8I,EAAQ,EACRC,EAAa,EAEjB,OAAO,WACL,IAAIC,EAAQ7F,IACR8F,EA75CO,IA65CiBD,EAAQD,GAGpC,GADAA,EAAaC,EACTC,EAAY,GACd,KAAMH,GAl6CI,IAm6CR,OAAOtN,UAAU,QAGnBsN,EAAQ,EAEV,OAAO9I,EAAKkJ,WAAM9K,EAAW5C,UAC/B,CACF,CA7BkB2N,CAASd,IAkF3B,SAAS3D,GAAG/I,EAAOyN,GACjB,OAAOzN,IAAUyN,GAAUzN,GAAUA,GAASyN,GAAUA,CAC1D,CAoBA,IAAIxB,GAAchC,GAAgB,WAAa,OAAOpK,SAAW,CAA/B,IAAsCoK,GAAkB,SAASjK,GACjG,OAAOkK,GAAalK,IAAU8F,EAAelH,KAAKoB,EAAO,YACtD8G,EAAqBlI,KAAKoB,EAAO,SACtC,EAyBIsL,GAAU/H,MAAM+H,QA2BpB,SAASG,GAAYzL,GACnB,OAAgB,MAATA,GAAiB0N,GAAS1N,EAAMF,UAAYwM,GAAWtM,EAChE,CAgDA,IAAIoH,GAAWD,GAsUf,WACE,OAAO,CACT,EArTA,SAASmF,GAAWtM,GAClB,IAAK+H,GAAS/H,GACZ,OAAO,EAIT,IAAI6J,EAAMF,GAAW3J,GACrB,OAAO6J,GAAO9F,GA1mDH,8BA0mDc8F,GA/mDZ,0BA+mD6BA,GArmD7B,kBAqmDgDA,CAC/D,CA4BA,SAAS6D,GAAS1N,GAChB,MAAuB,iBAATA,GACZA,GAAS,GAAKA,EAAQ,GAAK,GAAKA,GAAS6D,CAC7C,CA2BA,SAASkE,GAAS/H,GAChB,IAAIlB,SAAckB,EAClB,OAAgB,MAATA,IAA0B,UAARlB,GAA4B,YAARA,EAC/C,CA0BA,SAASoL,GAAalK,GACpB,OAAgB,MAATA,GAAiC,iBAATA,CACjC,CA4DA,IAAIwF,GAAeD,EAvnDnB,SAAmBlB,GACjB,OAAO,SAASrE,GACd,OAAOqE,EAAKrE,EACd,CACF,CAmnDsC2N,CAAUpI,GAj7BhD,SAA0BvF,GACxB,OAAOkK,GAAalK,IAClB0N,GAAS1N,EAAMF,WAAaqE,EAAewF,GAAW3J,GAC1D,EAm+BA,SAASoM,GAAOtE,GACd,OAAO2D,GAAY3D,GA3oCrB,SAAuB9H,EAAO4N,GAC5B,IAAIvC,EAAQC,GAAQtL,GAChB6N,GAASxC,GAASY,GAAYjM,GAC9BuL,GAAUF,IAAUwC,GAASzG,GAASpH,GACtC8N,GAAUzC,IAAUwC,IAAUtC,GAAU/F,GAAaxF,GACrD+N,EAAc1C,GAASwC,GAAStC,GAAUuC,EAC1C9F,EAAS+F,EAzjBf,SAAmBC,EAAGzD,GAIpB,IAHA,IAAIpC,GAAS,EACTH,EAASzE,MAAMyK,KAEV7F,EAAQ6F,GACfhG,EAAOG,GAASoC,EAASpC,GAE3B,OAAOH,CACT,CAijB6BiG,CAAUjO,EAAMF,OAAQoO,QAAU,GACzDpO,EAASkI,EAAOlI,OAEpB,IAAK,IAAIgJ,KAAO9I,GACT4N,IAAa9H,EAAelH,KAAKoB,EAAO8I,IACvCiF,IAEQ,UAAPjF,GAECyC,IAAkB,UAAPzC,GAA0B,UAAPA,IAE9BgF,IAAkB,UAAPhF,GAA0B,cAAPA,GAA8B,cAAPA,IAEtDmE,GAAQnE,EAAKhJ,KAElBkI,EAAOuB,KAAKT,GAGhB,OAAOd,CACT,CAknC+BmG,CAAcrG,GAAQ,GA39BrD,SAAoBA,GAClB,IAAKC,GAASD,GACZ,OAmdJ,SAAsBA,GACpB,IAAIE,EAAS,GACb,GAAc,MAAVF,EACF,IAAK,IAAIgB,KAAO3K,OAAO2J,GACrBE,EAAOuB,KAAKT,GAGhB,OAAOd,CACT,CA3dWoG,CAAatG,GAEtB,IAAIuG,EAAU9B,GAAYzE,GACtBE,EAAS,GAEb,IAAK,IAAIc,KAAOhB,GACD,eAAPgB,IAAyBuF,GAAYvI,EAAelH,KAAKkJ,EAAQgB,KACrEd,EAAOuB,KAAKT,GAGhB,OAAOd,CACT,CA88B6DsG,CAAWxG,EACxE,CAiCA,IAxvBwByG,GAwvBpBC,IAxvBoBD,GAwvBG,SAASzG,EAAQ3G,EAAQiJ,GAClDD,GAAUrC,EAAQ3G,EAAQiJ,EAC5B,EA13BA,SAAkB/F,EAAMoK,GACtB,OAAOvB,GA6WT,SAAkB7I,EAAMoK,EAAOnK,GAE7B,OADAmK,EAAQpH,OAAoB5E,IAAVgM,EAAuBpK,EAAKvE,OAAS,EAAK2O,EAAO,GAC5D,WAML,IALA,IAAIC,EAAO7O,UACPsI,GAAS,EACTrI,EAASuH,EAAUqH,EAAK5O,OAAS2O,EAAO,GACxCrF,EAAQ7F,MAAMzD,KAETqI,EAAQrI,GACfsJ,EAAMjB,GAASuG,EAAKD,EAAQtG,GAE9BA,GAAS,EAET,IADA,IAAIwG,EAAYpL,MAAMkL,EAAQ,KACrBtG,EAAQsG,GACfE,EAAUxG,GAASuG,EAAKvG,GAG1B,OADAwG,EAAUF,GAASnK,EAAU8E,GAzvCjC,SAAe/E,EAAMuK,EAASF,GAC5B,OAAQA,EAAK5O,QACX,KAAK,EAAG,OAAOuE,EAAKzF,KAAKgQ,GACzB,KAAK,EAAG,OAAOvK,EAAKzF,KAAKgQ,EAASF,EAAK,IACvC,KAAK,EAAG,OAAOrK,EAAKzF,KAAKgQ,EAASF,EAAK,GAAIA,EAAK,IAChD,KAAK,EAAG,OAAOrK,EAAKzF,KAAKgQ,EAASF,EAAK,GAAIA,EAAK,GAAIA,EAAK,IAE3D,OAAOrK,EAAKkJ,MAAMqB,EAASF,EAC7B,CAkvCWnB,CAAMlJ,EAAMxF,KAAM8P,EAC3B,CACF,CAhYqBE,CAASxK,EAAMoK,EAAO7B,IAAWvI,EAAO,GAC7D,CA+HSyK,CAAS,SAAShH,EAAQiH,GAC/B,IAAI5G,GAAS,EACTrI,EAASiP,EAAQjP,OACjBuK,EAAavK,EAAS,EAAIiP,EAAQjP,EAAS,QAAK2C,EAChDuM,EAAQlP,EAAS,EAAIiP,EAAQ,QAAKtM,EAWtC,IATA4H,EAAckE,GAASzO,OAAS,GAA0B,mBAAduK,GACvCvK,IAAUuK,QACX5H,EAEAuM,GAuIR,SAAwBhP,EAAOmI,EAAOL,GACpC,IAAKC,GAASD,GACZ,OAAO,EAET,IAAIhJ,SAAcqJ,EAClB,SAAY,UAARrJ,EACK2M,GAAY3D,IAAWmF,GAAQ9E,EAAOL,EAAOhI,QACrC,UAARhB,GAAoBqJ,KAASL,IAE7BiB,GAAGjB,EAAOK,GAAQnI,EAG7B,CAnJiBiP,CAAeF,EAAQ,GAAIA,EAAQ,GAAIC,KAClD3E,EAAavK,EAAS,OAAI2C,EAAY4H,EACtCvK,EAAS,GAEXgI,EAAS3J,OAAO2J,KACPK,EAAQrI,GAAQ,CACvB,IAAIqB,EAAS4N,EAAQ5G,GACjBhH,GACFoN,GAASzG,EAAQ3G,EAAQgH,EAE7B,CACA,OAAOL,CACT,IA8wBF,SAAS8E,GAAS5M,GAChB,OAAOA,CACT,CAmBAvC,EAAOC,QAAU8Q,E,6CCx7DjB,MAAMU,EAAE,CAACA,EAAE5J,EAAE,OAAO4J,EAAEC,WAAWD,EAAE,KAAK,EAAE5H,KAAK8H,OAAOF,EAAEG,OAAOC,SAAShK,GAAGA,GAAGA,EAAE,SAAS4J,GAAG,KAAKA,GAAGA,aAAaK,SAASL,EAAEM,cAAc,OAAM,EAAG,MAAMlK,EAAE4J,EAAEO,aAAaP,EAAEQ,aAAaC,EAAEC,OAAOC,iBAAiBX,GAAGY,UAAU9B,GAAG,IAAI2B,EAAEI,QAAQ,UAAUC,GAAG,IAAIL,EAAEI,QAAQ,WAAW,OAAOzK,IAAI0I,IAAIgC,CAAC,EAAEL,EAAE,SAAST,EAAElB,OAAO,GAAG,SAASkB,GAAGA,IAAIe,SAASC,MAAMlC,GAAGkB,IAAIlB,KAAK1I,EAAE4J,GAAGA,EAAES,EAAET,EAAEiB,cAAcnC,GAAG,EAAEA,EAAE,SAASkB,GAAG,IAAI5J,GAAE,IAAK8K,WAAWC,gBAAgBnB,EAAE,aAAagB,KAAK,GAAG5K,EAAEgL,kBAAkB,EAAE,CAAC,IAAI,IAAIX,EAAEM,SAASM,cAAc,OAAOjL,EAAEkL,YAAYb,EAAEc,YAAYnL,EAAEkL,YAAY,OAAOb,CAAC,CAAC,OAAOrK,EAAEkL,UAAU,EAAER,EAAEd,GAAG,GAAGA,GAAG,KAAKwB,MAAM,KAAK/N,OAAQuM,KAAKA,GAAIjR,EAAE,CAACiR,EAAE5J,EAAEqK,KAAKT,GAAGc,EAAE1K,GAAGqL,QAASrL,IAAI4J,EAAE0B,UAAUC,OAAOvL,EAAEqK,IAAG,EAAI,IAAI,MAAMtN,EAAE,WAAAnD,CAAYgQ,GAAG/Q,OAAO4B,eAAelB,KAAK,QAAQ,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,WAAW,IAAI7B,OAAO4B,eAAelB,KAAK,QAAQ,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,WAAW,IAAI7B,OAAO4B,eAAelB,KAAK,UAAU,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,WAAW,IAAI7B,OAAO4B,eAAelB,KAAK,UAAU,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,WAAW,IAAI7B,OAAO4B,eAAelB,KAAK,KAAK,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,WAAW,IAAI7B,OAAO4B,eAAelB,KAAK,OAAO,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,WAAW,IAAI7B,OAAO4B,eAAelB,KAAK,gBAAgB,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,WAAW,IAAInB,KAAKmS,cAAc9B,EAAErQ,KAAKoS,MAAM/B,EAAE+B,MAAMpS,KAAKqS,MAAMhC,EAAEgC,MAAMrS,KAAKsS,QAAQjC,EAAEiC,QAAQtS,KAAKuS,QAAQlC,EAAEkC,QAAQvS,KAAKwS,GAAG5M,KAAK6M,OAAOpC,aAAaoC,MAAMpC,EAAEqC,YAAY,EAAE1S,KAAK2S,KAAK/J,KAAKC,KAAK,EAAE,MAAMxF,EAAE,CAACuP,SAAQ,GAAI,MAAMC,EAAE,WAAAxS,CAAYgQ,GAAGT,MAAMnJ,EAAE,KAAK,EAAIqM,KAAKhC,EAAE,KAAO,EAAEiC,IAAI5D,EAAE,KAAO,IAAI7P,OAAO4B,eAAelB,KAAK,UAAU,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,WAAW,IAAI7B,OAAO4B,eAAelB,KAAK,gBAAgB,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,WAAW,IAAI7B,OAAO4B,eAAelB,KAAK,eAAe,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,WAAW,IAAI7B,OAAO4B,eAAelB,KAAK,cAAc,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,WAAW,IAAI7B,OAAO4B,eAAelB,KAAK,kBAAkB,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAM,KAAK7B,OAAO4B,eAAelB,KAAK,gBAAgB,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAM,KAAKnB,KAAKgT,QAAQ3C,EAAErQ,KAAKiT,cAAcxM,EAAEzG,KAAKkT,aAAapC,EAAE9Q,KAAKmT,YAAYhE,EAAE,IAAI,MAAMkB,IAAI,CAAC,iBAAiB,eAAe,SAAS,aAAa,eAAe,gBAAgBrQ,KAAKqQ,GAAGrQ,KAAKqQ,GAAG+C,KAAKpT,MAAMA,KAAKgT,QAAQK,iBAAiB,YAAYrT,KAAKsT,eAAejQ,GAAGrD,KAAKgT,QAAQK,iBAAiB,aAAarT,KAAKuT,aAAalQ,GAAGrD,KAAKgT,QAAQK,iBAAiB,YAAYrT,KAAKwT,OAAOnQ,GAAGrD,KAAKgT,QAAQK,iBAAiB,WAAWrT,KAAKyT,YAAYzT,KAAKgT,QAAQK,iBAAiB,cAAcrT,KAAKyT,WAAW,CAAC,cAAAH,CAAejD,GAAG,IAAIA,EAAEqD,SAAS,IAAIrD,EAAEsD,OAAO,OAAO,MAAMlN,EAAE,IAAIjD,EAAE6M,GAAGrQ,KAAK4T,gBAAgB3P,KAAMoM,GAAGA,EAAEmC,KAAK/L,EAAE+L,KAAMxS,KAAK6T,oBAAoBpN,EAAE4J,KAAKU,OAAOsC,iBAAiB,YAAYrT,KAAKwT,QAAQzC,OAAOsC,iBAAiB,UAAUrT,KAAK8T,cAAc/C,OAAOsC,iBAAiB,OAAOrT,KAAK+T,cAAc,CAAC,YAAAR,CAAalD,GAAG,IAAI,MAAM5J,KAAK/B,MAAMsP,KAAK3D,EAAE4D,gBAAgB,IAAIjU,KAAK6T,oBAAoB,IAAIrQ,EAAEiD,GAAG4J,GAAGU,OAAOsC,iBAAiB,OAAOrT,KAAK+T,aAAa,CAAC,MAAAP,CAAOnD,GAAG,MAAM5J,EAAEzG,KAAK4T,gBAAgB9G,QAAQgE,EAAE,mBAAmBT,EAAE3L,MAAMsP,KAAK3D,EAAE4D,gBAAgB,IAAIlR,IAAKsN,GAAG,IAAI7M,EAAE6M,IAAK,CAAC,IAAI7M,EAAE6M,IAAIlB,EAAE,GAAG,IAAI,MAAMkB,KAAKS,EAAE,CAAC,MAAMrK,EAAEzG,KAAK4T,gBAAgBM,UAAWzN,GAAGA,EAAE+L,KAAKnC,EAAEmC,IAAK/L,EAAE,IAAI0I,EAAEzE,KAAK2F,GAAGrQ,KAAK4T,gBAAgBnN,GAAG4J,EAAE,CAAClB,EAAElO,QAAQjB,KAAKkT,aAAa7C,EAAErQ,KAAK4T,gBAAgB9G,QAAQrG,EAAE,CAAC,YAAAqN,CAAazD,GAAGA,EAAEqD,QAAQ,GAAG,IAAIrD,EAAEsD,SAAS3T,KAAKmU,kBAAkB9D,EAAE,IAAI7M,EAAE6M,IAAIU,OAAOqD,oBAAoB,YAAYpU,KAAKwT,QAAQzC,OAAOqD,oBAAoB,UAAUpU,KAAK8T,cAAc/C,OAAOqD,oBAAoB,OAAOpU,KAAK+T,cAAc,CAAC,UAAAN,CAAWpD,GAAG,IAAI,MAAM5J,KAAK/B,MAAMsP,KAAK3D,EAAE4D,gBAAgB,IAAIjU,KAAKmU,kBAAkB9D,EAAE,IAAI7M,EAAEiD,GAAG,CAAC,mBAAAoN,CAAoBxD,EAAE5J,GAAG,QAAQzG,KAAKiT,cAAcxM,EAAE4J,EAAErQ,KAAK4T,gBAAgB9G,WAAW9M,KAAK4T,gBAAgBlJ,KAAK2F,GAAGrQ,KAAKqU,cAAc3J,KAAK2F,IAAG,EAAG,CAAC,iBAAA8D,CAAkB9D,EAAE5J,GAAG,MAAMqK,EAAE9Q,KAAK4T,gBAAgBM,UAAW7D,GAAGA,EAAEmC,KAAK/L,EAAE+L,IAAK1B,EAAE,IAAI9Q,KAAK4T,gBAAgB1L,OAAO4I,EAAE,GAAG9Q,KAAKqU,cAAcnM,OAAO4I,EAAE,GAAG9Q,KAAKmT,YAAY9C,EAAE5J,EAAEzG,KAAK4T,gBAAgB9G,SAAS,CAAC,YAAAiH,GAAe/T,KAAKuJ,OAAO,CAAC,KAAAA,GAAQ,KAAKvJ,KAAK4T,gBAAgB3S,QAAQ,CAAC,MAAMoP,EAAErQ,KAAK4T,gBAAgB5T,KAAK4T,gBAAgB3S,OAAO,GAAGjB,KAAK4T,gBAAgB1L,OAAOlI,KAAK4T,gBAAgB3S,OAAO,EAAE,GAAGjB,KAAKqU,cAAcnM,OAAOlI,KAAK4T,gBAAgB3S,OAAO,EAAE,GAAGjB,KAAKmT,YAAY,IAAImB,MAAM,WAAW,CAACC,SAAQ,EAAGC,YAAW,EAAGlC,QAAQjC,EAAEiC,QAAQC,QAAQlC,EAAEkC,UAAUlC,EAAErQ,KAAK4T,gBAAgB9G,QAAQ,CAAC,CAAC,IAAA2H,GAAOzU,KAAKgT,QAAQoB,oBAAoB,YAAYpU,KAAKsT,eAAejQ,GAAGrD,KAAKgT,QAAQoB,oBAAoB,aAAapU,KAAKuT,aAAalQ,GAAGrD,KAAKgT,QAAQoB,oBAAoB,YAAYpU,KAAKwT,OAAOnQ,GAAGrD,KAAKgT,QAAQoB,oBAAoB,WAAWpU,KAAKyT,YAAYzT,KAAKgT,QAAQoB,oBAAoB,cAAcpU,KAAKyT,YAAY1C,OAAOqD,oBAAoB,YAAYpU,KAAKwT,QAAQzC,OAAOqD,oBAAoB,UAAUpU,KAAK8T,cAAc/C,OAAOqD,oBAAoB,OAAOpU,KAAK+T,aAAa,EAAE,SAASW,EAAErE,EAAE5J,GAAG,OAAOA,EAAEgC,KAAKkM,KAAKlM,KAAKmM,IAAInO,EAAE6L,QAAQjC,EAAEiC,QAAQ,GAAG7J,KAAKmM,IAAInO,EAAE8L,QAAQlC,EAAEkC,QAAQ,IAAI,CAAC,CAAC,SAASsC,EAAExE,EAAE5J,GAAG,OAAOA,EAAE,CAAC6L,SAASjC,EAAEiC,QAAQ7L,EAAE6L,SAAS,EAAEC,SAASlC,EAAEkC,QAAQ9L,EAAE8L,SAAS,GAAGlC,CAAC,CAAC,MAAMyE,EAAEzE,GAAG,iBAAiBA,GAAG,OAAOA,GAAGA,EAAEhQ,cAAcf,QAAQ,oBAAoBA,OAAOa,UAAU8C,SAASlD,KAAKsQ,GAAG0E,EAAE,CAAC1E,KAAK5J,KAAK,MAAMqK,EAAErK,EAAExF,OAAO,IAAI,IAAIkO,EAAE,EAAEA,EAAE2B,EAAE3B,IAAI,CAAC,MAAM2B,EAAErK,EAAE0I,IAAI,CAAC,EAAE7P,OAAO+J,QAAQyH,GAAGgB,QAAQ,EAAGrL,EAAEqK,MAAM,MAAM3B,EAAEzK,MAAM+H,QAAQqE,GAAG,GAAG,CAAC,EAAET,EAAE5J,IAAInH,OAAO0V,OAAO3E,EAAE,CAAC,CAAC5J,GAAG0I,IAAI2F,EAAEhE,GAAGxR,OAAO0V,OAAO3E,EAAE5J,GAAGsO,EAAE5F,EAAE2B,IAAIpM,MAAM+H,QAAQqE,GAAGxR,OAAO0V,OAAO3E,EAAE,CAAC,CAAC5J,GAAG,IAAIqK,KAAKxR,OAAO0V,OAAO3E,EAAE,CAAC,CAAC5J,GAAGqK,GAAI,EAAE,CAAC,OAAOT,GAAGhR,EAAE,SAASgR,EAAE5J,GAAG,OAAO4J,EAAEwB,MAAM,KAAKoD,OAAO,CAAE5E,EAAE5J,IAAI,iBAAiB4J,EAAEA,EAAE5J,QAAQ,EAAGA,EAAE,EAAE,MAAMyO,EAAE,WAAA7U,CAAYgQ,EAAE,CAAC,GAAG/Q,OAAO4B,eAAelB,KAAK,UAAU,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAMkP,IAAI/Q,OAAO4B,eAAelB,KAAK,SAAS,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAM,IAAI2H,MAAM9I,KAAKmV,WAAW9E,GAAG,IAAI,MAAMA,KAAK/Q,OAAO8V,oBAAoB9V,OAAOwI,eAAe9H,OAAOqQ,EAAErM,WAAW,OAAO,mBAAmBhE,KAAKqQ,KAAKrQ,KAAKqQ,GAAGrQ,KAAKqQ,GAAG+C,KAAKpT,MAAM,CAAC,UAAAmV,CAAW9E,GAAGrQ,KAAKqV,QAAQhF,EAAE0E,EAAE,CAAC,EAAE/U,KAAKK,YAAYiV,SAASjF,GAAG,CAAC,EAAE,IAAI,MAAMA,EAAE5J,KAAKnH,OAAO+J,QAAQrJ,KAAKuV,OAAO,OAAO,CAAC,GAAGvV,KAAKwV,GAAGnF,EAAE5J,EAAE,CAAC,MAAA8O,CAAOlF,KAAK5J,GAAG,IAAIqK,EAAEzR,EAAEgR,EAAErQ,KAAKqV,SAAS,OAAOvE,GAAG,mBAAmBA,IAAIA,EAAEA,EAAE/Q,KAAKC,KAAKA,QAAQyG,IAAIqK,CAAC,CAAC,SAAA2E,CAAUpF,EAAE5J,EAAEqK,KAAK3B,GAAG,IAAIgC,EAAE9R,EAAEoH,EAAE4J,GAAG,IAAIjR,EAAE,iBAAiBA,EAAE+R,IAAIuE,MAAMtW,IAAIsW,MAAMpF,WAAWlR,MAAM+R,EAAEb,WAAWa,IAAI,SAASA,IAAIA,GAAE,GAAI,UAAUA,IAAIA,GAAE,GAAIA,GAAG,mBAAmBA,IAAIA,EAAEA,EAAEpR,KAAKC,KAAKA,KAAKqQ,KAAKlB,IAAI,IAAI3L,EAAEnE,EAAEoH,EAAEzG,KAAKqV,SAAS,OAAO7R,GAAG,mBAAmBA,EAAE2N,EAAE3N,EAAEzD,KAAKC,KAAKA,KAAKqQ,KAAKlB,EAAEgC,QAAQ,IAAIA,IAAIA,EAAE3N,QAAQ,IAAI2N,EAAEL,EAAEK,CAAC,CAAC,EAAAwE,CAAGtF,GAAG,MAAM5J,EAAEzG,KAAKqV,QAAQO,QAAQ,OAAOnP,GAAGA,EAAE4J,IAAI,EAAE,CAAC,QAAAwF,CAASxF,EAAE5J,EAAE,IAAI4J,EAAEhB,OAAOgB,GAAGlN,QAAQ,yBAAyB,CAAEkN,EAAE5J,EAAEqK,KAAK,IAAI3B,EAAE,GAAG,OAAO2B,EAAE3B,EAAEnP,KAAKuV,OAAO,GAAG9O,EAAE,GAAGA,EAAEqP,cAAcC,UAAU,WAAWjF,KAAKrK,IAAI0I,EAAEnP,KAAKuV,OAAO,QAAQ9O,MAAM0I,IAAIA,EAAEkB,GAAGlB,CAAE,GAAG,IAAI,IAAI2B,EAAE,EAAEA,EAAErK,EAAExF,OAAO6P,IAAIT,EAAEA,EAAEwB,MAAMpL,EAAEqK,GAAG,IAAIrN,KAAKgD,EAAEqK,GAAG,IAAI,OAAST,EAAElN,QAAQ,iBAAiB,CAAEkN,EAAE5J,IAAIA,EAAG,CAAC,EAAA+O,CAAGnF,EAAE5J,GAAG,IAAIqK,EAAE,GAAG,iBAAiBT,EAAES,EAAET,EAAEwB,MAAM,KAAKnN,MAAM+H,QAAQ4D,KAAKS,EAAET,GAAGrQ,KAAKgW,SAAShW,KAAKgW,OAAO,IAAIlN,KAAKgI,EAAEgB,QAASzB,IAAI,IAAIS,EAAE9Q,KAAKgW,OAAOxU,IAAI6O,GAAGS,IAAI9Q,KAAKgW,OAAOvM,IAAI4G,EAAE,IAAIS,EAAE,IAAIA,EAAEmF,SAASxP,IAAIqK,EAAEpG,KAAKjE,GAAGzG,KAAKgW,OAAOvM,IAAI4G,EAAES,EAAG,EAAE,CAAC,GAAAoF,CAAI7F,EAAE5J,GAAG,IAAIqK,EAAE,GAAG,iBAAiBT,EAAES,EAAET,EAAEwB,MAAM,KAAKnN,MAAM+H,QAAQ4D,KAAKS,EAAET,GAAGS,EAAEgB,QAASzB,IAAI,MAAMS,EAAE9Q,KAAKgW,OAAOxU,IAAI6O,GAAG,GAAG3L,MAAM+H,QAAQqE,GAAG,CAAC,MAAMT,EAAES,EAAEI,QAAQzK,GAAG4J,GAAG,GAAGS,EAAE5I,OAAOmI,EAAE,EAAE,CAAE,EAAE,CAAC,IAAA8F,CAAK9F,KAAK5J,GAAG,IAAIzG,KAAKgW,OAAOxU,IAAI6O,IAAI,IAAIyB,QAASzB,GAAGA,EAAErQ,QAAQyG,IAAK,MAAM4J,GAAGrQ,KAAKmW,KAAK,IAAI9F,KAAK5J,EAAE,EAAEnH,OAAO4B,eAAegU,EAAE,UAAU,CAAC3T,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAM,WAAW7B,OAAO4B,eAAegU,EAAE,WAAW,CAAC3T,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAM,CAAC,IAAI,MAAMmC,UAAU4R,EAAE,WAAA7U,CAAYgQ,EAAE,CAAC,GAAG+F,MAAM/F,GAAG/Q,OAAO4B,eAAelB,KAAK,UAAU,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAM,CAAC,GAAG,CAAC,aAAAkV,CAAchG,EAAE,CAAC,GAAG,MAAM5J,EAAE,IAAIqC,IAAI,IAAI,MAAMgI,EAAE3B,KAAK7P,OAAO+J,QAAQgH,GAAG,CAAC,MAAMA,EAAErQ,KAAKuV,OAAOzE,GAAGK,EAAEnR,KAAKsW,QAAQxF,GAAGK,IAAG,IAAKd,EAAEc,IAAG,IAAKd,IAAIc,EAAEoF,gBAAgBvW,KAAKsW,QAAQxF,IAAIrK,EAAEgD,IAAIqH,EAAE,IAAI3B,EAAEnP,KAAKqQ,GAAG,CAAC,GAAG,CAAC,IAAI,MAAMA,EAAES,KAAKrK,EAAEzG,KAAKsW,QAAQjG,GAAGS,EAAEA,EAAE0F,QAAQ,CAAC,aAAAC,CAAcpG,GAAGA,EAAEA,GAAG/Q,OAAO8H,KAAKpH,KAAKsW,SAAS,IAAI,MAAM7P,KAAK4J,EAAE,CAAC,MAAMA,EAAErQ,KAAKsW,QAAQ7P,GAAG4J,GAAGA,EAAEkG,gBAAgBvW,KAAKsW,QAAQ7P,EAAE,CAAC,OAAOzG,KAAKmW,KAAK,iBAAiBnW,IAAI,EAAE,IAAI0W,GAAG,SAASrG,GAAGA,EAAEA,EAAEsG,KAAK,GAAG,OAAOtG,EAAEA,EAAEuG,MAAM,GAAG,QAAQvG,EAAEA,EAAEwG,MAAM,GAAG,QAAQxG,EAAEA,EAAEyG,QAAQ,GAAG,UAAUzG,EAAEA,EAAE0G,UAAU,GAAG,YAAY1G,EAAEA,EAAE2G,QAAQ,GAAG,SAAS,CAAvJ,CAAyJN,IAAIA,EAAE,CAAC,IAAI,MAAM1T,EAAE,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,KAAKO,EAAE,CAAC0T,MAAM,UAAUC,QAAQ,YAAYC,QAAQ,YAAYC,SAAS,aAAaC,OAAO,UAAUC,QAAQ,WAAWC,WAAW,oBAAoBC,WAAW,oBAAoBC,YAAY,oBAAoBC,UAAU,0BAA0BC,SAAS,mBAAmBC,MAAM,oBAAoBC,MAAM,kBAAkBC,KAAK,mBAAmBC,KAAK,iBAAiBC,MAAM,QAAQC,SAAS,qBAAqBC,EAAE,CAACC,QAAQ,KAAKC,MAAM,OAAOC,OAAO,OAAOC,QAAQ,OAAOC,OAAM,EAAGC,iBAAiB,EAAEC,UAAS,EAAGC,gBAAgB,EAAEC,kBAAkB,IAAIC,MAAK,EAAGC,aAAY,EAAGC,cAAc,OAAOC,SAAS,EAAEC,SAAS,EAAEC,SAAS,IAAIC,aAAa,IAAIC,cAAc,IAAIC,MAAM,aAAaC,UAAS,EAAGC,MAAM,OAAOC,WAAW,EAAEC,SAAQ,EAAGC,OAAO,OAAOC,UAAS,EAAGC,YAAW,EAAGC,QAAO,EAAGC,YAAY,GAAGC,iBAAgB,EAAGlE,QAAQ,CAACuC,QAAQ,qBAAqB4B,UAAU,aAAaC,UAAU,cAAcC,WAAW,eAAeC,YAAY,eAAeC,WAAW,cAAcC,aAAa,gBAAgBC,kBAAkB,8BAA8BC,KAAK/W,GAAGgX,EAAE,2CAA2CC,EAAE,mDAAmDD,EAAEA,EAAE,eAAeE,EAAEpK,GAAGA,GAAG,OAAOA,GAAGA,aAAaK,SAAS,aAAaL,EAAEqK,EAAE,CAACrK,EAAE5J,KAAK4J,GAAGc,EAAE1K,GAAGqL,QAASrL,IAAI4J,EAAE0B,UAAU4I,OAAOlU,EAAG,IAAImU,EAAE,CAACvK,EAAE5J,KAAK4J,GAAGc,EAAE1K,GAAGqL,QAASrL,IAAI4J,EAAE0B,UAAU8I,IAAIpU,EAAG,IAAIqU,EAAE,CAACtX,EAAE,EAAED,EAAE,EAAEmR,EAAE,EAAEI,EAAE,EAAErO,EAAE,EAAEyO,EAAE,GAAS6F,EAAE,IAAIC,EAAE,YAAYC,EAAE,OAAOC,EAAE,UAAUC,EAAE,OAAO,IAAIC,EAAE,KAAKC,EAAE,KAAK,MAAMC,UAAUhY,EAAE,QAAIiY,GAAO,OAAOvb,KAAKwb,YAAYpD,MAAMpY,KAAKwb,YAAYC,SAAS,GAAGzb,KAAKwb,YAAYnD,OAAOrY,KAAKwb,YAAYE,UAAU,CAAC,CAAC,iBAAIC,GAAgB,OAAO,OAAON,IAAIA,EAAEtK,OAAO6K,WAAW,iBAAiBC,SAASR,CAAC,CAAC,YAAIS,GAAW,OAAO,OAAOV,IAAIA,EAAE,4BAA4BjX,KAAK4X,UAAUC,YAAYZ,CAAC,CAAC,WAAI9C,GAAU,OAAOtY,KAAKqV,QAAQiD,UAAU0C,GAAGhb,KAAK2b,cAAcV,EAAED,CAAC,CAAC,iBAAIlC,GAAgB,MAAMzI,EAAErQ,KAAKqV,QAAQyD,cAAc,OAAOzI,IAAI8K,EAAEnb,KAAK2b,cAActL,CAAC,CAAC,cAAI4L,GAAa,OAAOjc,KAAKuV,OAAO,WAAW,CAAC,SAAI2G,GAAQ,OAAO,IAAIzT,KAAK0T,MAAMnc,KAAKoc,QAAQ7Y,EAAEvD,KAAKoc,QAAQ5Y,GAAGiF,KAAK4T,IAAI,CAAC,CAAC,eAAIC,GAAc,OAAO,IAAI7T,KAAK0T,MAAMnc,KAAKoB,OAAOmC,EAAEvD,KAAKoB,OAAOoC,GAAGiF,KAAK4T,IAAI,CAAC,CAAC,SAAIE,GAAQ,MAAM/Y,EAAE6M,EAAE9M,EAAEkD,GAAGzG,KAAKoc,QAAQ,OAAO3T,KAAKkM,KAAKtE,EAAEA,EAAE5J,EAAEA,IAAI,CAAC,CAAC,eAAI+V,GAAc,MAAMhZ,EAAE6M,EAAE9M,EAAEkD,GAAGzG,KAAKoB,OAAO,OAAOqH,KAAKkM,KAAKtE,EAAEA,EAAE5J,EAAEA,IAAI,CAAC,CAAC,YAAIsS,GAAW,OAAO/Y,KAAKuV,OAAO,aAAa,CAAC,CAAC,aAAIkH,GAAY,MAAMjB,YAAYnL,GAAGrQ,KAAK,OAAOqQ,EAAEqM,UAAUrM,EAAEoL,UAAU,CAAC,CAAC,YAAIzC,GAAW,OAAOhZ,KAAKyc,WAAWzc,KAAKuV,OAAO,aAAa,IAAI,CAAC,CAAC,cAAIoH,GAAa,MAAMC,cAAcvM,EAAEmL,YAAY/U,GAAGzG,KAAK8Q,EAAErI,KAAKC,IAAI2H,EAAEgI,OAAO5R,EAAEiV,UAAUrL,EAAE+H,MAAM3R,EAAEgV,WAAW,EAAE,OAAOhT,KAAKoU,IAAI7c,KAAKyc,UAAU3L,EAAE,CAAC,aAAIgM,GAAY,OAAOrU,KAAKsU,IAAI/c,KAAKwc,YAAYxc,KAAKuc,OAAO,OAAOvc,KAAKgd,SAAS,CAAC,oBAAIC,GAAmB,MAAM5M,EAAErQ,KAAKmY,QAAQ,SAAS9H,GAAGA,aAAa6M,oBAAoB7M,EAAE8M,QAAQ,CAAC,aAAIH,GAAY,GAAGhd,KAAKod,aAAapd,KAAKqd,YAAY,OAAM,EAAG,IAAI,MAAMhN,KAAKrN,EAAE,CAAC,MAAMyD,EAAE,KAAK4J,GAAG,MAAMA,EAAE,KAAK,KAAK,GAAG5H,KAAKsU,IAAI/c,KAAKoB,OAAOiP,GAAGrQ,KAAKoc,QAAQ/L,IAAI5J,EAAE,OAAM,CAAE,CAAC,SAASzG,KAAKsd,eAAetd,KAAKud,cAAcC,SAAS,CAAC,WAAAnd,CAAYgQ,EAAE5J,EAAE,CAAC,EAAEqK,EAAE,CAAC,GAAG,IAAIK,EAAE,GAAGiF,MAAM3P,GAAGnH,OAAO4B,eAAelB,KAAK,iBAAiB,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAM,OAAO7B,OAAO4B,eAAelB,KAAK,iBAAiB,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAM,OAAO7B,OAAO4B,eAAelB,KAAK,cAAc,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAM,OAAO7B,OAAO4B,eAAelB,KAAK,aAAa,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAM,OAAO7B,OAAO4B,eAAelB,KAAK,MAAM,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAM,OAAO7B,OAAO4B,eAAelB,KAAK,YAAY,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,OAAM,IAAK7B,OAAO4B,eAAelB,KAAK,eAAe,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,OAAM,IAAK7B,OAAO4B,eAAelB,KAAK,cAAc,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,OAAM,IAAK7B,OAAO4B,eAAelB,KAAK,cAAc,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,OAAM,IAAK7B,OAAO4B,eAAelB,KAAK,SAAS,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAM,IAAI7B,OAAO4B,eAAelB,KAAK,iBAAiB,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAM,KAAK7B,OAAO4B,eAAelB,KAAK,MAAM,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAM,IAAI7B,OAAO4B,eAAelB,KAAK,MAAM,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAM,IAAI7B,OAAO4B,eAAelB,KAAK,OAAO,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,WAAW,IAAI7B,OAAO4B,eAAelB,KAAK,WAAW,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAM,IAAI7B,OAAO4B,eAAelB,KAAK,QAAQ,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAMuV,EAAEC,OAAOrX,OAAO4B,eAAelB,KAAK,aAAa,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,OAAM,IAAK7B,OAAO4B,eAAelB,KAAK,YAAY,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,WAAW,IAAI7B,OAAO4B,eAAelB,KAAK,UAAU,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,WAAW,IAAI7B,OAAO4B,eAAelB,KAAK,UAAU,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAM,OAAO7B,OAAO4B,eAAelB,KAAK,gBAAgB,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAM,CAACiX,MAAM,EAAEC,OAAO,EAAEoF,WAAW,EAAEC,YAAY,KAAKpe,OAAO4B,eAAelB,KAAK,cAAc,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAM,CAACwc,IAAI,EAAEC,MAAM,EAAEC,OAAO,EAAEC,KAAK,EAAEpB,UAAU,EAAEqB,WAAW,EAAEtC,SAAS,EAAEC,UAAU,EAAEtD,MAAM,EAAEC,OAAO,KAAK/Y,OAAO4B,eAAelB,KAAK,YAAY,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAM,CAACqZ,EAAE,EAAEtC,EAAE,EAAEyF,IAAI,EAAEG,KAAK,EAAEnL,KAAK,KAAKrT,OAAO4B,eAAelB,KAAK,aAAa,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAM,CAACqZ,EAAE,EAAEtC,EAAE,EAAEvF,KAAK,KAAKrT,OAAO4B,eAAelB,KAAK,UAAU,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAM7B,OAAO0V,OAAO,CAAC,EAAE8F,KAAKxb,OAAO4B,eAAelB,KAAK,SAAS,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAM7B,OAAO0V,OAAO,CAAC,EAAE8F,KAAKxb,OAAO4B,eAAelB,KAAK,WAAW,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAM,CAACqC,EAAE,EAAED,EAAE,EAAEmR,EAAE,EAAEI,EAAE,EAAErO,EAAE,EAAEyO,EAAE,KAAK5V,OAAO4B,eAAelB,KAAK,aAAa,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,OAAM,KAAMkP,EAAE,MAAM,IAAIuG,MAAM,+BAA+B5W,KAAKge,UAAU3N,EAAErQ,KAAKie,cAAcje,KAAKqW,cAAc/W,OAAO0V,OAAO1V,OAAO0V,OAAO,CAAC,EAAEsG,EAAE4C,SAASpN,IAAI9Q,KAAKmW,KAAK,iBAAiBnW,KAAKmW,KAAK,QAAQ,MAAM/W,EAAEY,KAAKmY,QAAQ,GAAG/Y,EAAEiU,iBAAiB,OAAOrT,KAAKme,QAAQ/e,EAAEiU,iBAAiB,QAAQrT,KAAKoe,SAASpe,KAAKid,iBAAiB,CAAC,GAAGjd,KAAKuV,OAAO,WAAW,CAAClF,EAAE0B,UAAU8I,IAAI7a,KAAK2V,GAAG,cAAc,MAAMlP,EAAE0I,EAAEqL,IAAInK,EAAEgO,SAASjf,IAAIA,EAAEkS,yBAAyBgN,mBAAmBte,KAAKwZ,QAAQnJ,EAAEuB,YAAYnL,GAAGzG,KAAKwZ,SAAS,QAAQrI,EAAE/R,EAAEkS,qBAAqB,IAAIH,OAAO,EAAEA,EAAEoN,aAAa9X,EAAErH,KAAK,IAAI,CAACY,KAAKmW,KAAK,aAAa,MAAMqI,eAAe,KAAMxe,KAAKye,QAAS,EAAE,CAAC,WAAAR,GAAc,MAAMD,UAAU3N,GAAGrQ,KAAKyG,EAAEzG,KAAK2V,GAAGuF,GAAG,IAAIpK,EAAE9Q,KAAKuV,OAAO2F,IAAI7K,EAAEqO,cAAc,IAAIjY,KAAK,GAAGqK,IAAIA,EAAET,EAAEqO,cAAc,gBAAgBrO,EAAEsO,kBAAkB7N,GAAG8J,EAAE9J,EAAErK,IAAIqK,aAAawN,qBAAqBxN,EAAEA,EAAE4N,cAAc,SAAS5N,EAAE,MAAM,IAAI8F,MAAM,oBAAoB5W,KAAKmY,QAAQrH,CAAC,CAAC,MAAAqN,GAAS,MAAM3E,QAAQnJ,EAAE2N,UAAUvX,EAAEmY,MAAM9N,GAAG9Q,KAAKqQ,IAAIA,EAAEsK,SAAS3a,KAAKwZ,QAAQ,MAAMxZ,KAAKuV,OAAO,YAAY9O,EAAEsL,UAAU4I,OAAO3a,KAAK2V,GAAG,cAAc3V,KAAKmW,KAAK,aAAarF,IAAI4F,EAAEC,KAAK3W,KAAKye,SAASze,KAAK6e,eAAe,CAAC,OAAAT,GAAUpe,KAAK4e,QAAQlI,EAAEM,UAAUhX,KAAKwZ,UAAUxZ,KAAKwZ,QAAQmB,SAAS3a,KAAKwZ,QAAQ,MAAMxZ,KAAKyU,OAAOzU,KAAK8e,eAAe9e,KAAK4e,MAAMlI,EAAEE,MAAM5W,KAAKmW,KAAK,SAAS,CAAC,YAAA4I,CAAa1O,GAAG,MAAMoM,UAAUhW,EAAE+V,YAAY1L,EAAE6L,WAAWxN,EAAE6J,SAAS7H,EAAE4H,SAAS3Z,GAAGY,KAAK,IAAIwD,EAAEpE,EAAE,OAAOiR,GAAG,IAAI,YAAY7M,EAAEsN,EAAE1R,EAAE,IAAI+R,EAAE/R,GAAG+R,EAAE/R,EAAE,MAAM,IAAI,cAAcoE,EAAEsN,EAAE1R,EAAE,IAAI+P,EAAE/P,GAAG+P,EAAE/P,EAAE,MAAM,IAAI,aAAaoE,EAAEsN,EAAE1R,EAAE,IAAIqH,EAAErH,GAAGqH,EAAErH,EAAE,MAAM,IAAI,cAAc,IAAIiR,EAAE,CAAC,EAAE5J,EAAE0K,GAAG6N,KAAK,CAAE3O,EAAE5J,IAAI4J,EAAE5J,GAAIpD,EAAEgN,EAAE6D,UAAW7D,GAAGA,EAAES,EAAE,MAAOtN,EAAE6M,EAAEhN,IAAI,EAAE,OAAOG,CAAC,CAAC,cAAAyb,GAAiB,IAAI5O,EAAE,MAAM5J,EAAE,KAAK,MAAMuX,UAAU3N,EAAEuM,cAAcnW,GAAGzG,KAAK,OAAOyI,KAAKsU,IAAItW,EAAE2R,MAAM/H,EAAE6O,wBAAwB9G,OAAO,IAAI3P,KAAKsU,IAAItW,EAAE4R,OAAOhI,EAAE6O,wBAAwB7G,QAAQ,IAAIrY,KAAKmf,qBAAqB,IAAIpO,OAAOqO,iBAAiBpf,KAAKmf,eAAe,IAAIC,eAAe,KAAMpf,KAAKqf,cAAc5Y,KAAKzG,KAAKsf,WAAWtf,KAAK8b,WAAW9b,KAAKqf,YAAYE,WAAW,KAAM9Y,KAAKzG,KAAKsf,WAAWtf,KAAKqf,YAAY,IAAK,EAAE,OAAOrf,KAAKqf,cAAcG,aAAaxf,KAAKqf,aAAarf,KAAKqf,YAAY,MAAO,IAAI,QAAQhP,EAAErQ,KAAKmf,sBAAsB,IAAI9O,GAAGA,EAAEoP,QAAQzf,KAAKge,UAAU,CAAC,cAAA0B,GAAiB,IAAIrP,EAAE,QAAQA,EAAErQ,KAAKmf,sBAAsB,IAAI9O,GAAGA,EAAEsP,YAAY,CAAC,YAAAC,GAAe,MAAM5B,UAAU3N,GAAGrQ,KAAKqQ,EAAEgD,iBAAiB,QAAQrT,KAAK6f,QAAQ,CAACjN,SAAQ,EAAGkN,SAAQ,IAAKzP,EAAEgD,iBAAiB,QAAQrT,KAAK+f,QAAQ,CAACnN,SAAQ,IAAK5S,KAAKggB,eAAe,IAAInN,EAAExC,EAAE,CAACT,MAAM5P,KAAKigB,cAAcnN,KAAK9S,KAAKkgB,cAAcnN,IAAI/S,KAAKmgB,cAAc/O,SAASiC,iBAAiB2H,EAAEhb,KAAKogB,YAAY,CAAC,YAAAtB,GAAe,IAAIzO,EAAE,MAAM2N,UAAUvX,GAAGzG,KAAKyG,EAAE2N,oBAAoB,QAAQpU,KAAK6f,QAAQ,CAACjN,SAAQ,EAAGkN,SAAQ,IAAKrZ,EAAE2N,oBAAoB,QAAQpU,KAAK+f,QAAQ,CAACnN,SAAQ,IAAK,QAAQvC,EAAErQ,KAAKggB,sBAAsB,IAAI3P,GAAGA,EAAEoE,OAAOzU,KAAKggB,eAAe,KAAK5O,SAASgD,oBAAoB4G,EAAEhb,KAAKogB,aAAahP,SAASgD,oBAAoB,UAAUpU,KAAKqgB,WAAU,GAAIrgB,KAAKsgB,aAAad,aAAaxf,KAAKsgB,YAAYtgB,KAAKsgB,WAAW,MAAMtgB,KAAKqf,cAAcG,aAAaxf,KAAKqf,aAAarf,KAAKqf,YAAY,KAAK,CAAC,OAAAkB,GAAUvgB,KAAKwgB,iBAAiB,MAAMnQ,EAAErQ,KAAKiZ,SAASxS,EAAEzG,KAAKuV,OAAO,eAAe,IAAI,MAAMzE,KAAK9N,EAAEqN,GAAGrQ,KAAKygB,SAAS3P,IAAI,EAAET,EAAE5J,IAAIzG,KAAK8c,YAAY9c,KAAKygB,SAAS3P,GAAGrI,KAAKC,IAAID,KAAKoU,IAAI7c,KAAKygB,SAAS3P,GAAGrK,IAAI,EAAEA,IAAIzG,KAAKoc,QAAQtL,IAAI9Q,KAAKygB,SAAS3P,IAAI9Q,KAAKoc,QAAQtL,GAAG9Q,KAAKoB,OAAO0P,GAAG9Q,KAAK0gB,eAAe1gB,KAAK2gB,gBAAgB3gB,KAAKgd,WAAWhd,KAAKma,WAAWna,KAAK4gB,IAAIC,sBAAsB,IAAK7gB,KAAKugB,WAAYvgB,KAAKyU,KAAK,UAAU,CAAC,cAAA+L,GAAiB,IAAI,MAAMnQ,KAAKrN,EAAE,MAAMqN,GAAGrQ,KAAKod,aAAa,MAAM/M,GAAGrQ,KAAKqd,cAAcrd,KAAKygB,SAASpQ,IAAI,GAAG,EAAErQ,KAAKiZ,UAAU,IAAIjZ,KAAKoB,OAAOiP,GAAGrQ,KAAKoc,QAAQ/L,IAAI,CAAC,WAAAkN,CAAYlN,EAAE,EAAE5J,EAAE,GAAG,MAAM2V,QAAQtL,GAAG9Q,KAAKmP,EAAE2B,EAAErK,EAAE4J,EAAEc,EAAEL,EAAEoE,EAAEzO,EAAErH,EAAEY,KAAK8gB,aAAatG,EAAEhX,EAAE0U,EAAE7U,GAAGjE,EAAEyT,EAAErP,EAAEqZ,IAAInI,EAAElR,EAAEkF,IAAImM,EAAExR,EAAEwZ,IAAI/H,EAAEzR,EAAEqF,IAAI,IAAIqM,EAAE,EAAE1V,EAAE,EAAE,OAAOwT,IAAI,KAAK1D,EAAE0D,EAAEkC,EAAElC,EAAE1D,EAAEuF,IAAI,KAAKvF,EAAEuF,IAAIK,EAAEL,EAAEvF,GAAG0F,IAAI,KAAK1D,EAAE0D,EAAExV,EAAEwV,EAAE1D,EAAE2D,IAAI,KAAK3D,EAAE2D,IAAIzV,EAAEyV,EAAE3D,GAAG1I,KAAKsU,IAAIhI,GAAG,OAAOA,EAAE,GAAGtM,KAAKsU,IAAI1d,GAAG,OAAOA,EAAE,GAAGC,OAAO0V,OAAO1V,OAAO0V,OAAO,CAAC,EAAE5V,GAAG,CAAC2hB,MAAMhM,EAAEiM,MAAM3hB,EAAEme,UAAUzI,IAAI1V,GAAG,CAAC,iBAAA4hB,GAAoB,MAAM7f,OAAOiP,GAAGrQ,MAAMwa,EAAE/T,EAAEyR,EAAEpH,GAAG9Q,KAAK8gB,YAAYra,EAAEoW,MAAM,MAAMxM,EAAE5J,EAAEgC,KAAKC,IAAI2H,EAAE5J,EAAEA,EAAEoW,MAAMpW,EAAEiC,MAAM,MAAM2H,EAAE5J,EAAEgC,KAAKoU,IAAIxM,EAAE5J,EAAEA,EAAEiC,MAAMoI,EAAE+L,MAAM,MAAMxM,EAAE6E,EAAEzM,KAAKC,IAAI2H,EAAE6E,EAAEpE,EAAE+L,MAAM/L,EAAEpI,MAAM,MAAM2H,EAAE6E,EAAEzM,KAAKoU,IAAIxM,EAAE6E,EAAEpE,EAAEpI,KAAK,CAAC,mBAAAwY,CAAoB7Q,EAAErQ,KAAKoc,SAAS,MAAMjE,QAAQ1R,EAAE+U,YAAY1K,GAAG9Q,MAAMyb,SAAStM,EAAEuM,UAAUvK,EAAEuL,UAAUtd,EAAE2e,WAAWva,GAAGsN,EAAE,IAAIzN,EAAEjE,EAAEyT,EAAErP,EAAE,GAAGxD,KAAKuV,OAAO,SAAS,IAAIvV,KAAKkc,MAAM,CAAC,MAAMpL,IAAIrK,aAAayW,kBAAoB,SAASnM,OAAOC,iBAAiBvK,GAAG0a,UAAU,SAASpQ,OAAOC,iBAAiBvK,GAAG2a,WAAW1M,EAAE5D,EAAE1R,EAAE+P,EAAE0F,EAAE/D,EAAEtN,EAAE2N,EAAE2D,EAAE9U,KAAKqhB,UAAUhR,GAAG0E,EAAE,IAAIuM,SAAS,EAAE,GAAGC,gBAAgBzM,GAAGzV,EAAE,IAAIiiB,SAAS,EAAE5M,EAAE,GAAG6M,gBAAgBzM,GAAGI,EAAE,IAAIoM,SAAS,EAAE5M,EAAE,EAAEG,GAAG0M,gBAAgBzM,GAAGxR,EAAE,IAAIge,SAAS,EAAE,EAAEzM,GAAG0M,gBAAgBzM,GAAG4B,EAAEjO,KAAKsU,IAAI7H,EAAEsF,EAAEzF,EAAEyF,GAAGxX,EAAEyF,KAAKsU,IAAI7H,EAAEgD,EAAEnD,EAAEmD,GAAG3U,EAAEkF,KAAKsU,IAAIzZ,EAAEkX,EAAEnb,EAAEmb,GAAGtC,EAAEzP,KAAKsU,IAAIzZ,EAAE4U,EAAE7Y,EAAE6Y,GAAG7U,EAAEoF,KAAKC,IAAIgO,EAAEnT,GAAGsP,EAAEpK,KAAKC,IAAI1F,EAAEkV,EAAE,CAAC,MAAM,CAACsJ,aAAane,EAAEoe,cAAc5O,EAAE,CAAC,YAAA8N,GAAe,GAAG3gB,KAAKsd,cAActd,KAAKma,YAAYna,KAAKsY,UAAU0C,GAAGhb,KAAKwc,YAAYxc,KAAKuc,MAAM,OAAOvc,KAAKod,aAAY,OAAQpd,KAAKqd,aAAY,GAAI,MAAMjc,OAAOiP,GAAGrQ,MAAMwa,EAAE/T,EAAEyR,EAAEpH,EAAEiQ,MAAM5R,EAAE6R,MAAM7P,GAAGnR,KAAKud,cAAoBne,EAAEY,KAAKuV,OAAO,eAAe,IAAI/R,EAAExD,KAAKygB,SAASha,EAAEpD,EAAErD,KAAKygB,SAASvL,EAAE,IAAI/F,GAAGnP,KAAKod,aAAY,EAAGjO,EAAE3L,GAAG,EAAEA,GAAG,IAAI2L,GAAG3L,EAAE,IAAI2L,EAAE1I,EAAEoW,MAAM,MAAM7c,KAAKoB,OAAOqF,EAAEgC,KAAKC,IAAI2H,EAAE5J,EAAEA,EAAEoW,MAAMpW,EAAEiC,MAAM,MAAM1I,KAAKoB,OAAOqF,EAAEgC,KAAKoU,IAAIxM,EAAE5J,EAAEA,EAAEiC,OAAOtJ,IAAIoE,EAAEiF,KAAKC,IAAID,KAAKoU,IAAIrZ,EAAEpE,IAAI,EAAEA,KAAKY,KAAKod,aAAY,EAAG,IAAIjM,GAAGnR,KAAKqd,aAAY,EAAGlM,EAAE9N,GAAG,EAAEA,GAAG,IAAI8N,GAAG9N,EAAE,IAAI8N,EAAEL,EAAE+L,MAAM,MAAM7c,KAAKoB,OAAO8T,EAAEzM,KAAKC,IAAI2H,EAAE6E,EAAEpE,EAAE+L,MAAM/L,EAAEpI,MAAM,MAAM1I,KAAKoB,OAAO8T,EAAEzM,KAAKoU,IAAIxM,EAAE6E,EAAEpE,EAAEpI,OAAOtJ,IAAIiE,EAAEoF,KAAKC,IAAID,KAAKoU,IAAIxZ,EAAEjE,IAAI,EAAEA,KAAKY,KAAKqd,aAAY,EAAGrd,KAAKod,cAAcpd,KAAKygB,SAASha,EAAEjD,GAAGxD,KAAKqd,cAAcrd,KAAKygB,SAASvL,EAAE7R,EAAE,CAAC,MAAAob,GAAS,MAAMtG,QAAQ9H,GAAGrQ,KAAKyG,EAAE,IAAIib,kBAAkB3Q,OAAOC,iBAAiBX,GAAG5K,WAAW,IAAI,MAAM4K,KAAKrN,EAAEhD,KAAKoc,QAAQ/L,GAAGrQ,KAAKoB,OAAOiP,GAAG5J,EAAE4J,GAAGrQ,KAAK6e,gBAAgB7e,KAAKif,iBAAiBjf,KAAK4f,eAAe5f,KAAK4e,MAAMlI,EAAEG,MAAM7W,KAAKmW,KAAK,QAAQ,CAAC,OAAA0J,CAAQxP,GAAG,IAAI5J,EAAE,UAAU4J,EAAEpQ,MAAM,IAAIoQ,EAAEsR,SAAS3hB,KAAK4hB,WAAWpH,EAAE,EAAExa,KAAK4hB,WAAW1J,EAAE,GAAGlY,KAAKma,aAAa,QAAQ1T,EAAEzG,KAAKggB,sBAAsB,IAAIvZ,GAAGA,EAAE8C,QAAQvJ,KAAK6hB,eAAe,GAAG7hB,KAAK8hB,kBAAkB,MAAMhR,EAAET,EAAEjP,OAAO,IAAI0P,GAAGT,EAAE0R,iBAAiB,OAAO,GAAGjR,EAAEkR,aAAa,YAAY,OAAO3R,EAAE4R,sBAAsB5R,EAAE6R,kBAAkB,GAAG,MAAM,MAAM7R,EAAEU,OAAOoR,eAAe,OAAO9R,GAAG,UAAUA,EAAEpQ,IAAK,EAA/D,KAAqE6Q,EAAEsR,QAAQ,UAAU,OAAO,MAAMjT,EAAE2B,EAAEsR,QAAQ,yBAAyBjR,EAAEL,EAAEsR,QAAQ,yBAAyBhjB,EAAE+P,GAAGgC,EAAE3N,EAAEpE,GAAGqb,EAAErb,GAAGA,EAAEijB,QAAQ,KAAK,GAAG7e,EAAE,CAAC,MAAMiD,EAAEjD,EAAE8e,cAAcxR,EAAEtN,EAAE+e,cAAc,IAAI9b,GAAGqK,IAAIT,EAAE4R,iBAAiBxb,EAAE,CAAC,IAAI4J,EAAE,CAAC,EAAE,IAAIA,EAAEmS,KAAKC,MAAMhc,EAAE,CAAC,MAAM4J,GAAGqS,SAASA,QAAQC,KAAK,oCAAoC,CAAC,YAAY3iB,KAAK4iB,YAAYvS,EAAE,CAAC,GAAGS,EAAE,YAAY9Q,KAAK8Q,IAAI9Q,KAAK8Q,KAAK,CAAC,GAAGrI,KAAKsU,IAAI/c,KAAK4hB,WAAWpH,GAAG,GAAG/R,KAAKsU,IAAI/c,KAAK4hB,WAAW1J,GAAG,EAAE,OAAO7H,EAAE4R,sBAAsB5R,EAAE6R,kBAAkB,GAAGpR,EAAEsR,QAAQ,mBAAmB,OAAO,MAAM/e,EAAErD,KAAKmY,QAAQ+G,wBAAwBrM,EAAE7S,KAAK6iB,UAAU,GAAGhQ,EAAEF,OAAO3S,KAAKia,eAAexR,KAAKsU,IAAI1Z,EAAEmX,EAAE3H,EAAE2H,GAAG,GAAG/R,KAAKsU,IAAI1Z,EAAE6U,EAAErF,EAAEqF,GAAG,GAAG,OAAOlY,KAAK6iB,UAAUlQ,KAAK,EAAE,MAAM+B,EAAEjO,IAAIzG,KAAKuV,OAAO,OAAOlF,IAAI5J,GAAG,iBAAiBA,GAAG,sEAAsEtC,KAAKsC,IAAI,mBAAmBzG,KAAKyG,KAAK4J,EAAE4R,iBAAiBjiB,KAAKyG,GAAG,CAACqc,MAAMzS,MAAMwE,EAAE7U,KAAKuV,OAAO,QAAQlF,GAAGyE,EAAE9U,KAAKuV,OAAO,WAAWlF,GAAGyE,GAAG9U,KAAK+iB,SAAS,GAAG/iB,KAAK+iB,SAAS/iB,KAAKsgB,WAAWf,WAAW,KAAM,IAAIvf,KAAK+iB,QAAQ/iB,KAAKmW,KAAK,QAAQ9F,IAAIA,EAAE0R,kBAAkBlN,GAAGH,EAAEG,KAAK7U,KAAKmW,KAAK,WAAW9F,GAAGA,EAAE0R,kBAAkBrN,EAAEI,IAAI9U,KAAK+iB,OAAO,EAAE/iB,KAAKsgB,WAAW,IAAK,EAAE,QAAQtgB,KAAKmW,KAAK,QAAQ9F,IAAIA,EAAE0R,kBAAkBlN,GAAGH,EAAEG,GAAG,CAAC,gBAAAmO,CAAiB3S,GAAG,MAAM5J,EAAEzG,KAAK6hB,eAAe/d,OAAQuM,GAAGA,EAAEsC,KAAK/J,KAAKC,MAAM,KAAMpC,EAAEiE,KAAK2F,GAAGrQ,KAAK6hB,eAAepb,CAAC,CAAC,aAAAwZ,CAAc5P,EAAE5J,EAAEqK,GAAG,IAAI3B,EAAE,IAAG,IAAKnP,KAAKuV,OAAO,QAAQlF,GAAG,OAAM,EAAGrQ,KAAKijB,IAAI,EAAEjjB,KAAK4hB,WAAW,CAACpH,EAAE,EAAEtC,EAAE,EAAEvF,KAAK,GAAG3S,KAAK6hB,eAAe,GAAG,MAAM1Q,EAAEnR,KAAKmY,QAAQ+G,wBAAwB,GAAGlf,KAAK6iB,UAAU,CAACrI,EAAErJ,EAAEqJ,EAAEtC,EAAE/G,EAAE+G,EAAEyF,IAAIxM,EAAEwM,IAAIG,KAAK3M,EAAE2M,KAAKnL,KAAK/J,KAAKC,OAAO7I,KAAKsgB,WAAW,OAAM,EAAG,GAAGtgB,KAAKsY,UAAU0C,GAAGhb,KAAKwc,YAAY,EAAE,OAAOnM,EAAE4R,iBAAiB5R,EAAE6R,mBAAkB,EAAG,MAAM9iB,EAAEiR,EAAE6S,eAAe,GAAG,IAAIpS,EAAE7P,OAAO,CAAC,GAAG,CAAC,WAAW,SAAS,QAAQ,SAAS,QAAQ,UAAUgV,SAAS7W,EAAE+jB,WAAW/jB,EAAEgjB,QAAQ,qHAAqH,OAAM,EAAG,QAAQjT,EAAE4B,OAAOoR,sBAAsB,IAAIhT,GAAGA,EAAEiU,iBAAiB,CAAC,GAAG,cAAc/S,EAAEpQ,KAAK,CAAC,IAAI,UAAUgW,SAAS7W,EAAE+jB,WAAW9S,EAAE4R,sBAAsB,GAAGxZ,KAAKsU,IAAI/c,KAAKygB,SAASjd,GAAG,GAAG,OAAM,EAAG,OAAOxD,KAAKoB,OAAOqF,EAAEzG,KAAKoc,QAAQ3V,EAAEzG,KAAKoB,OAAO8T,EAAElV,KAAKoc,QAAQlH,EAAElV,KAAKyU,OAAOzU,KAAKma,aAAana,KAAKma,YAAW,EAAGna,KAAKgjB,iBAAiBvc,GAAGzG,KAAKmW,KAAK,aAAa9F,KAAI,CAAE,CAAC,aAAA6P,CAAczZ,EAAE0I,EAAEgC,GAAG,IAAG,IAAKnR,KAAKuV,OAAO,QAAQ9O,GAAG,OAAO,IAAIzG,KAAKma,WAAW,OAAO,GAAGhL,EAAElO,OAAO,GAAGjB,KAAK8Y,eAAezI,EAAErQ,KAAKwc,cAAcnM,EAAErQ,KAAK+Y,UAAU,OAAO,GAAG/Y,KAAKmW,KAAK,YAAY1P,GAAGA,EAAEsb,iBAAiB,OAAO/hB,KAAKgjB,iBAAiB7T,EAAE,IAAI,MAAMgJ,QAAQ/Y,GAAGY,KAAKwD,EAAEqR,EAAE1D,EAAE,GAAGA,EAAE,IAAI9N,EAAEwR,EAAE1F,EAAE,GAAGA,EAAE,IAAI,IAAI0D,EAAE,EAAEiC,EAAE,EAAE,GAAG3F,EAAElO,OAAO,EAAE,CAAC,MAAMoP,EAAEjR,EAAE8f,wBAAwBrM,EAAErP,EAAE8O,QAAQjC,EAAEyN,KAAK,GAAGzN,EAAE+H,MAAMtD,EAAEtR,EAAE+O,QAAQlC,EAAEsN,IAAI,GAAGtN,EAAEgI,MAAM,CAAC,MAAMtD,EAAEL,EAAEvD,EAAE,GAAGA,EAAE,IAAI9R,EAAEqV,EAAEvF,EAAE,GAAGA,EAAE,IAAI,IAAI+F,EAAEH,EAAE1V,EAAE0V,EAAE,EAAEzR,EAAED,EAAEiP,QAAQ9O,EAAE8O,QAAQoE,EAAErT,EAAEkP,QAAQ/O,EAAE+O,QAAQvS,KAAK4hB,WAAWpH,GAAGlX,EAAEtD,KAAK4hB,WAAW1J,GAAGxB,EAAE1W,KAAK4hB,WAAWjP,KAAK/J,KAAKC,MAAM7I,KAAK6iB,UAAUlQ,KAAK,IAAI3P,EAAEqN,EAAErQ,KAAKwc,eAAenM,EAAErQ,KAAK+Y,WAAW/Y,KAAKuV,OAAO,YAAY,GAAGvS,IAAIhD,KAAKqjB,WAAW,GAAG,OAAOrgB,GAAG,MAAMA,GAAG,cAAcyD,EAAExG,KAAK,CAAC,GAAGwI,KAAKsU,IAAI/c,KAAK4hB,WAAWpH,GAAG,GAAG/R,KAAKsU,IAAI/c,KAAK4hB,WAAW1J,GAAG,EAAE,YAAYzR,EAAEwb,iBAAiB,MAAM5R,EAAE5H,KAAKsU,IAAI,IAAItU,KAAK0T,MAAMnc,KAAK4hB,WAAW1J,EAAElY,KAAK4hB,WAAWpH,GAAG/R,KAAK4T,IAAIrc,KAAKqjB,WAAWhT,EAAE,IAAIA,EAAE,IAAI,IAAI,IAAIrQ,KAAK4hB,WAAWpH,EAAE,EAAExa,KAAK4hB,WAAW1J,EAAE,EAAE5U,EAAE,EAAEoT,EAAE,CAAC,MAAM1W,KAAKqjB,WAAWrgB,EAAE,GAAG8N,EAAErK,EAAErF,OAAOpB,KAAKmY,WAAWnV,EAAE,IAAIhD,KAAK4hB,WAAW1J,EAAE,GAAGlV,GAAG,OAAOA,GAAGhD,KAAKqjB,aAAargB,GAAGqN,EAAErQ,KAAKwc,eAAenM,EAAErQ,KAAK+Y,UAAU,OAAOtS,EAAE+N,YAAY/N,EAAEwb,iBAAiBjiB,KAAKge,UAAUjM,UAAU8I,IAAI7a,KAAK2V,GAAG,eAAe,MAAMpS,EAAEvD,KAAKud,YAAYja,EAAEoT,GAAG1W,KAAKuV,OAAO,eAAe,MAAMvV,KAAKic,aAAa1Y,EAAEwd,MAAM,GAAGzd,EAAE,GAAGC,EAAEwd,MAAM,GAAGzd,EAAE,KAAKA,GAAGmF,KAAKC,IAAI,EAAE,GAAGD,KAAKsU,IAAI,IAAI/c,KAAKwb,YAAYC,SAASlY,EAAEwd,SAAS,MAAM/gB,KAAKic,aAAa1Y,EAAEyd,MAAM,GAAGtK,EAAE,GAAGnT,EAAEyd,MAAM,GAAGtK,EAAE,KAAKA,GAAGjO,KAAKC,IAAI,EAAE,GAAGD,KAAKsU,IAAI,IAAI/c,KAAKwb,YAAYE,UAAUnY,EAAEyd,WAAWzd,EAAEwd,QAAQzd,EAAE,GAAGC,EAAEyd,QAAQtK,EAAE,IAAI,MAAMwB,EAAElY,KAAKwc,YAAYjC,EAAEva,KAAK+Y,SAASyB,EAAExa,KAAKgZ,SAASd,EAAE,GAAGqC,IAAIrF,EAAEzM,KAAKC,IAAIwM,EAAEqF,IAAIrC,EAAE,IAAIsC,IAAItF,EAAEzM,KAAKoU,IAAI3H,EAAEsF,IAAI,MAAMxa,KAAKqjB,YAAYhT,EAAE6H,KAAK7H,EAAEkK,KAAKjX,EAAE,GAAG,MAAMtD,KAAKqjB,YAAYhT,EAAE6H,KAAK7H,EAAEkK,KAAK7D,EAAE,GAAG1W,KAAK4iB,YAAY,CAACU,QAAQzQ,EAAE0Q,QAAQzO,EAAE0O,KAAKlgB,EAAEmgB,KAAK/M,EAAE6F,MAAMrH,EAAE+D,SAASjZ,KAAKuV,OAAO,gBAAgB+H,cAAa,GAAI,CAAC,WAAA6C,CAAY9P,EAAE5J,EAAE0I,GAAG,GAAGA,EAAElO,OAAO,OAAOjB,KAAK4hB,WAAWpH,EAAE,EAAExa,KAAK4hB,WAAW1J,EAAE,OAAOlY,KAAK6hB,eAAe,IAAI7hB,KAAKge,UAAUjM,UAAU4I,OAAO3a,KAAK2V,GAAG,eAAe3V,KAAKma,aAAana,KAAKgjB,iBAAiBvc,GAAGzG,KAAK8Y,eAAe9Y,KAAKwb,YAAYpD,MAAMpY,KAAKwb,YAAYC,SAAS,GAAGzb,KAAKwb,YAAYnD,OAAOrY,KAAKwb,YAAYE,UAAU,IAAI1b,KAAK6hB,eAAe,IAAI/Q,EAAET,EAAEjP,OAAOpB,KAAKmY,UAAU,MAAMnY,KAAKqjB,aAAarjB,KAAK6hB,eAAe,IAAI7hB,KAAKmW,KAAK,WAAW9F,GAAGrQ,KAAKma,YAAW,EAAGna,KAAKqjB,YAAW,EAAGrjB,KAAK4e,QAAQlI,EAAEM,UAAU3G,EAAE0R,kBAAkB/hB,KAAK8hB,kBAAkB,CAAC,cAAAA,GAAiB,IAAIrb,EAAE,MAAMqK,EAAE9Q,KAAK8c,UAAU9c,KAAK4gB,MAAM8C,qBAAqB1jB,KAAK4gB,KAAK5gB,KAAK4gB,IAAI,MAAM5gB,KAAKod,aAAY,EAAGpd,KAAKqd,aAAY,EAAG,IAAI,MAAMhN,KAAKrN,EAAEhD,KAAKygB,SAASpQ,GAAG,EAAErQ,KAAKoB,OAAOqF,EAAEzG,KAAKoc,QAAQ3V,EAAEzG,KAAKoB,OAAO8T,EAAElV,KAAKoc,QAAQlH,EAAEwF,EAAE1a,KAAKge,UAAU,cAActD,EAAE1a,KAAKge,UAAU,gBAAgBhe,KAAK2jB,WAAU,EAAG,MAAM9B,eAAe1S,GAAGnP,KAAKmR,EAAEhC,EAAE,GAAG/P,EAAE+P,EAAEA,EAAElO,OAAO,GAAG,IAAIuC,EAAE,EAAEH,EAAE,EAAEwP,EAAE,EAAEzT,GAAG+R,IAAI3N,EAAEpE,EAAEkT,QAAQnB,EAAEmB,QAAQjP,EAAEjE,EAAEmT,QAAQpB,EAAEoB,QAAQM,EAAEzT,EAAEuT,KAAKxB,EAAEwB,MAAM,MAAM+B,GAAG,QAAQjO,EAAEsK,OAAO6S,sBAAsB,IAAInd,OAAO,EAAEA,EAAE8V,QAAQ,EAAE,IAAI7H,IAAIlR,GAAGkR,EAAErR,GAAGqR,GAAG,IAAIG,EAAE,EAAEC,EAAE,EAAEC,EAAE,EAAE1V,EAAE,EAAE6V,EAAElV,KAAKuV,OAAO,iBAAiB,MAAMjS,EAAEtD,KAAKwc,YAAY,GAAG3J,EAAE,EAAE,CAACkC,EAAEtM,KAAKsU,IAAIvZ,GAAG,EAAEA,GAAGqP,EAAE,IAAI,EAAExT,EAAEoJ,KAAKsU,IAAI1Z,GAAG,EAAEA,GAAGwP,EAAE,IAAI,EAAE,MAAMxC,EAAErQ,KAAKuV,OAAO,eAAelF,IAAI0E,EAAEtM,KAAKC,IAAID,KAAKoU,IAAI9H,EAAE1E,IAAI,EAAEA,GAAGhR,EAAEoJ,KAAKC,IAAID,KAAKoU,IAAIxd,EAAEgR,IAAI,EAAEA,GAAG,CAAC0E,IAAIF,EAAEE,GAAG,GAAG,EAAEG,GAAG,IAAI7V,IAAIyV,EAAEzV,GAAG,GAAG,EAAE6V,GAAG,KAAK,MAAMlV,KAAKuV,OAAO,aAAa,OAAOvV,KAAKuV,OAAO,aAAa,MAAMvV,KAAKqjB,YAAYhT,EAAE/M,KAAKtD,KAAK+Y,YAAYlE,EAAEE,EAAE,IAAI,MAAM/U,KAAKuV,OAAO,aAAa,OAAOvV,KAAKuV,OAAO,aAAa,MAAMvV,KAAKqjB,YAAYhT,EAAE/M,KAAKtD,KAAK+Y,YAAYjE,EAAEzV,EAAE,GAAG,MAAMqX,EAAE1W,KAAK4hB,WAAWpH,EAAEjX,EAAEvD,KAAK4hB,WAAW1J,EAAEA,EAAElY,KAAKuV,OAAO,qBAAqB,EAAE9M,KAAKsU,IAAIrG,GAAGwB,GAAGzP,KAAKsU,IAAIxZ,GAAG2U,IAAIrD,EAAEC,EAAE,EAAEC,EAAE1V,EAAE,IAAIW,KAAKuV,OAAO,UAAUjS,EAAEtD,KAAK+Y,SAAS,MAAMzV,EAAEtD,KAAKgZ,SAAS,OAAOlI,IAAI+D,IAAIC,KAAKI,EAAE,KAAKlV,KAAK4iB,YAAY,CAACY,KAAK3O,EAAE4O,KAAK3O,EAAEmE,SAAS/D,IAAIlV,KAAKmW,KAAK,QAAQpB,EAAE1V,EAAEqX,EAAEnT,EAAE,CAAC,OAAAwc,CAAQ1P,GAAG,IAAI5J,EAAE,EAAE4J,EAAEwT,QAAQ,GAAGxT,EAAEyT,QAAQ,GAAGzT,EAAEsR,QAAQ,GAAG1M,OAAO,SAAU5E,EAAE5J,GAAG,OAAOgC,KAAKsU,IAAItW,GAAGgC,KAAKsU,IAAI1M,GAAG5J,EAAE4J,CAAE,GAAG,MAAMS,EAAErI,KAAKC,KAAK,EAAED,KAAKoU,IAAI,EAAEpW,IAAI,GAAGzG,KAAKmW,KAAK,QAAQ9F,EAAES,GAAG9Q,KAAKsY,UAAU0C,EAAE,OAAO,GAAG3K,EAAE0R,iBAAiB,OAAO,MAAM5S,EAAEnP,KAAKuV,OAAO,SAAS,QAAQpG,GAAGkB,EAAE4R,iBAAiBjiB,KAAK8Y,gBAAgB9Y,KAAKia,cAAcja,KAAK4iB,YAAY,CAACY,KAAK,GAAGnT,EAAEwT,OAAOJ,KAAK,GAAGpT,EAAEyT,OAAOlK,QAAO,KAAM,SAASzK,IAAG,IAAKnP,KAAKuV,OAAO,SAASvV,KAAK+jB,cAAc1T,EAAE,CAAC,WAAA+P,CAAY/P,GAAGrQ,KAAKgkB,aAAa3T,EAAE,CAAC,SAAAgQ,CAAUhQ,GAAG,WAAWA,EAAEpG,KAAKjK,KAAKikB,UAAU,CAAC,QAAA3E,GAAWtf,KAAK6e,gBAAgB7e,KAAKud,cAAcC,UAAUxd,KAAKkkB,aAAa,CAAC,YAAAxD,GAAe1gB,KAAKmW,KAAK,mBAAmB,MAAMiG,QAAQ3V,EAAErF,OAAO0P,EAAEqH,QAAQhJ,EAAEqM,YAAYrK,GAAGnR,KAAKZ,EAAEE,OAAO0V,OAAO,CAAC,EAAE8F,GAAG,IAAI,MAAM3L,KAAKnM,EAAE,CAAC,MAAMmO,EAAE,KAAKhC,GAAG,MAAMA,EAAE4L,EAA77iB,IAAi8iB3b,EAAE+P,GAAGkB,EAAE5J,EAAE0I,GAAGgC,GAAG1I,KAAKsU,IAAIjM,EAAE3B,GAAG1I,EAAE0I,KAAK,KAAKA,GAAG,MAAMA,EAAE,IAAI,QAAQ1I,EAAE0I,GAAG2B,EAAE3B,GAAG,CAAC,IAAI3L,EAAEA,EAAED,EAAEF,EAAEqR,EAAE7B,EAAEiC,EAAEJ,EAAEjO,EAAEoO,EAAEK,EAAEJ,GAAG1V,EAAE2V,EAAE,UAAUvR,MAAMH,MAAMwP,MAAM6B,MAAMG,MAAMC,KAAKzV,EAAE8P,EAAEmC,yBAAyBgN,mBAAmBnP,EAAEmC,cAAcnC,EAAE,GAAGnP,KAAKuV,OAAO,qBAAqBlW,EAAEA,EAAEiS,eAAejS,GAAGA,EAAE8kB,MAAM1e,YAAYsP,EAAE,OAAO1V,EAAE8kB,MAAM1e,UAAUsP,EAAE,MAAMyM,aAAatM,EAAEuM,cAAcne,GAAGtD,KAAKkhB,sBAAsB/P,EAAEiH,MAAMlD,EAAE/D,EAAEkH,OAAO/U,EAAEtD,KAAKmW,KAAK,iBAAiB,CAAC,aAAA0I,CAAcpY,GAAE,GAAI,IAAIqK,EAAE,IAAI9Q,MAAMA,KAAK4e,QAAQlI,EAAEM,QAAQ,OAAO,GAAGhX,KAAKid,iBAAiB,OAAO,MAAM9N,EAAE1G,KAAKC,IAAI,GAAG,QAAQoI,EAAEC,OAAO6S,sBAAsB,IAAI9S,OAAO,EAAEA,EAAEyL,QAAQ,IAAIyB,UAAU7M,EAAEgH,QAAQ/Y,GAAGY,KAAKwD,EAAEpE,aAAa8d,iBAAiB7Z,EAAE8N,EAAE+N,wBAAwBrM,EAAE7B,iBAAiBhR,KAAKge,WAAW,IAAItJ,EAAErR,EAAE+U,MAAMjJ,EAAE0F,EAAExR,EAAEgV,OAAOlJ,EAAE,MAAM2F,EAAExE,WAAWuC,EAAEuR,YAAY9T,WAAWuC,EAAEwR,eAAetP,EAAEL,GAAGpE,WAAWuC,EAAEyR,aAAahU,WAAWuC,EAAE0R,eAAellB,EAAEwV,EAAEC,EAAE9U,KAAK4c,cAAc,CAACxE,MAAM1D,EAAE2D,OAAOxD,EAAE4I,WAAW1I,EAAE2I,YAAYre,GAAG,MAAM6V,EAAE5E,WAAWlR,EAAEijB,QAAQjK,OAAO,KAAK,CAAC/H,IAAI,IAAI5J,EAAE,EAAE,OAAOA,EAAE4J,aAAa6M,iBAAiB7M,EAAEmU,aAAanU,aAAaoU,WAAWpU,EAAE+H,MAAMsM,QAAQvjB,MAAMsH,KAAKC,IAAI2H,EAAEsU,YAAYtU,EAAEuU,aAAane,GAAG,CAAE,EAA5J,CAA8JrH,GAAGkE,EAAEgN,WAAWlR,EAAEijB,QAAQhK,QAAQ,KAAK,CAAChI,IAAI,IAAI5J,EAAE,EAAE,OAAOA,EAAE4J,aAAa6M,iBAAiB7M,EAAEwU,cAAcxU,aAAaoU,WAAWpU,EAAEgI,OAAOqM,QAAQvjB,MAAMsH,KAAKC,IAAI2H,EAAEyU,aAAazU,EAAEO,cAAcnK,GAAG,CAAE,EAAhK,CAAkKrH,GAAG,IAAI4D,EAAEhD,KAAKuV,OAAO,QAAQL,IAAIiG,EAAE5X,EAAEvD,KAAKuV,OAAO,SAASjS,IAAI6X,EAAE,MAAMjD,EAAElV,IAAImY,EAAEZ,EAAEhX,IAAI4X,EAAE,iBAAiBnY,IAAIA,EAAEkS,GAAG,iBAAiB3R,IAAIA,EAAED,GAAG4U,IAAIlV,EAAEkS,GAAG3R,EAAED,IAAIiX,IAAIhX,EAAED,GAAG4R,EAAElS,IAAI,IAAIwX,EAAEpb,EAAEkS,yBAAyBgN,mBAAmBlf,EAAEkS,cAAclS,EAAEY,KAAKuV,OAAO,qBAAqBiF,EAAEA,EAAElJ,eAAekJ,GAAG,MAAMC,EAAED,EAAEuK,aAAa,UAAU,GAAGvK,EAAE2J,MAAMa,YAAY,YAAY,OAAO,aAAaxhB,IAAIgX,EAAE2J,MAAM/L,MAAM,GAAGoC,EAAE2J,MAAM9L,OAAO,IAAImC,EAAEsK,aAAa,MAAMpK,EAAEtb,EAAE8f,wBAAwB,IAAItE,EAAEF,EAAEtC,MAAMjJ,EAAE2L,EAAEJ,EAAErC,OAAOlJ,EAAE8V,EAAErK,EAAEG,EAAED,EAAEF,EAAEnS,KAAKoU,IAAIjC,EAAE5X,GAAG8X,EAAErS,KAAKoU,IAAI/B,EAAEvX,GAAGC,IAAI4U,MAAMwC,EAAEvC,OAAOyC,GAAG,EAAEzK,EAAE5J,EAAEqK,EAAE3B,KAAK,MAAMgC,EAAEL,EAAET,EAAEjR,EAAE+P,EAAE1I,EAAEjD,EAAEiF,KAAKoU,IAAI1L,EAAE/R,GAAG,MAAM,CAACgZ,MAAM/H,GAAG7M,EAAE6U,OAAO5R,GAAGjD,EAAG,EAA9E,CAAgFR,EAAEO,EAAEqX,EAAEE,KAAKF,EAAEnS,KAAKoU,IAAIjC,EAAE5X,GAAG8X,EAAErS,KAAKoU,IAAI/B,EAAEvX,IAAI,IAAIyX,EAAE,IAAID,EAAED,GAAGG,EAAE,IAAIgK,EAAErK,GAAG5a,KAAKwb,YAAYlc,OAAO0V,OAAO1V,OAAO0V,OAAO,CAAC,EAAEhV,KAAKwb,aAAa,CAACmC,IAAIjD,EAAEiD,IAAIta,EAAEsa,IAAI3C,EAAE6C,OAAOxa,EAAEwa,OAAOnD,EAAEmD,OAAO7C,EAAE8C,KAAKpD,EAAEoD,KAAKza,EAAEya,KAAK7C,EAAE2C,MAAMva,EAAEua,MAAMlD,EAAEkD,MAAM3C,EAAEQ,SAASb,EAAEc,UAAUZ,EAAE1C,MAAMwC,EAAEvC,OAAOyC,EAAE4B,UAAU1Z,EAAE+a,WAAWxa,IAAIiX,EAAE2J,MAAMe,QAAQzK,EAAEjX,IAAIgX,EAAE2J,MAAM/L,MAAM,GAAGwC,MAAMJ,EAAE2J,MAAM9L,OAAO,GAAGyC,OAAO9a,KAAK0gB,gBAAe,IAAKja,GAAGzG,KAAKmW,KAAK,WAAWnW,KAAKsd,eAAejN,EAAErQ,KAAKwc,aAAanM,EAAErQ,KAAK+Y,UAAU/Y,KAAKmlB,OAAOnlB,KAAK+Y,SAAS,CAACE,SAAS,IAAIjZ,KAAKwc,YAAYxc,KAAKgZ,SAAShZ,KAAKmlB,OAAOnlB,KAAKgZ,SAAS,CAACC,SAAS,IAAIjZ,KAAK4e,QAAQlI,EAAEC,MAAM3W,KAAKud,cAAcC,UAAUxd,KAAKkkB,eAAelkB,KAAKolB,gBAAgB,CAAC,eAAAC,GAAkB,MAAM7D,aAAa/a,EAAEgb,cAAc3Q,GAAG9Q,KAAKkhB,oBAAoBlhB,KAAKoB,SAASob,YAAYrN,EAAEkU,WAAWlS,GAAGnR,MAAMyb,SAASrc,EAAEsc,UAAUlY,GAAGxD,KAAKwb,YAAY,IAAInY,EAAE,EAAEwP,EAAE,EAAE6B,EAAE,EAAEG,EAAE,EAAE,MAAMC,EAAE9U,KAAKuV,OAAO,YAAY,IAAG,IAAKT,GAAG3D,GAAG2D,IAAI3D,EAAE9N,GAAE,IAAKqR,EAAE,IAAI7B,GAAE,IAAKgC,EAAE,QAAQ,CAAC,IAAI+H,cAAczL,EAAEqK,YAAY1G,GAAG9U,KAAK+U,EAAE1E,EAAEjR,EAAE+P,EAAE4L,GAAG1b,EAAEgR,EAAE7M,EAAE2L,EAAE4L,IAAI0C,WAAWvI,EAAEwI,YAAYpa,GAAG6N,EAAE,GAAGA,EAAEiH,QAAQrD,IAAIG,EAAE/D,EAAEiH,OAAOjH,EAAEiH,QAAQ/Y,IAAIiE,EAAE6N,EAAEkH,QAAQ5R,EAAEyO,EAAE,CAACR,EAAE,IAAIjO,EAAEyO,GAAG7R,GAAG,EAAEqR,EAAE,IAAIrE,EAAE,IAAIyE,EAAE8I,MAAM9I,EAAEgJ,MAAMza,GAAGgN,EAAEqE,GAAGrE,CAAC,CAAC,GAAGjR,EAAE8V,GAAGzO,EAAEyO,IAAI7R,GAAG,IAAIjE,EAAE8V,GAAGR,GAAG,IAAItV,EAAE8V,IAAIpE,EAAExN,EAAE,CAACuR,EAAE,IAAI/D,EAAExN,GAAGuP,GAAG,EAAEgC,EAAE,IAAIxE,EAAE,IAAIyE,EAAE+I,OAAO/I,EAAE6I,KAAK9K,GAAGxC,EAAEwE,GAAGxE,CAAC,CAAC7M,EAAEF,GAAGwN,EAAExN,IAAID,GAAG,IAAIG,EAAEF,GAAGoR,GAAG,IAAIlR,EAAEF,GAAG,CAAC,MAAM,CAACkX,EAAE,CAACqC,IAAIxZ,EAAEqF,IAAIgM,GAAGwD,EAAE,CAAC2E,IAAIhK,EAAEnK,IAAImM,GAAG,CAAC,SAAAiM,GAAY,MAAMzQ,EAAErQ,KAAKuV,OAAO,UAAU,OAAOlF,IAAI8K,EAAE9K,EAAErQ,KAAKqlB,iBAAiB,CAAC,cAAAD,GAAiB,MAAM3e,EAAEzG,KAAK8Q,EAAErK,EAAEuX,WAAW1F,QAAQnJ,EAAEqM,YAAYrK,EAAEqL,YAAYhZ,EAAEuV,SAAS1V,GAAGoD,EAAE,IAAIoM,EAAExP,EAAEqR,EAAEjO,EAAE8O,OAAO,WAAU,EAAGb,IAAI7B,EAAEpM,EAAEsY,aAAarK,IAAI,IAAIG,EAAEpO,EAAEuT,YAAYlF,EAAErO,EAAEwT,aAAalF,EAAE5F,IAAI8L,KAAKjb,KAAKuV,OAAO,SAASlW,EAAEyV,GAAGC,EAAE,GAAGA,IAAI1E,EAAE7M,GAAG6M,EAAEhN,KAAKrD,KAAK8Y,gBAAgBzZ,GAAE,IAAKgR,EAAEc,EAAEiH,MAAM,GAAG/H,EAAEc,EAAEsK,SAAS,IAAIpL,EAAEc,EAAEkH,OAAO,GAAGhI,EAAEc,EAAEuK,UAAU,MAAMrc,GAAE,IAAKgR,EAAEc,EAAEiH,MAAM5U,EAAE,GAAG6M,EAAEc,EAAEsK,SAAS,KAAKpc,GAAE,GAAI8P,IAAI6L,IAAI3b,GAAE,GAAID,EAAE0R,EAAE9Q,KAAK2V,GAAG,eAAetW,IAAIW,KAAKuV,OAAO,QAAQ,OAAO,IAAIL,EAAEL,GAAGxE,EAAEwC,GAAGxC,EAAE7M,GAAGF,GAAG4R,IAAI7V,GAAGyV,GAAGzE,EAAEwC,GAAGxC,EAAE7M,GAAGpE,EAAE0R,EAAE9Q,KAAK2V,GAAG,aAAaT,GAAG9V,EAAE0R,EAAE9Q,KAAK2V,GAAG,cAAcrS,GAAG,IAAI,MAAM+M,KAAKS,EAAEwU,iBAAiB,yBAAyB,CAAC,IAAI7e,GAAE,EAAGqK,GAAE,EAAG,OAAOT,EAAEgS,QAAQE,eAAe,IAAI,SAAS1N,EAAEpO,GAAE,EAAGqK,GAAE,EAAG,MAAM,IAAI,UAAUgE,EAAErO,GAAE,EAAGqK,GAAE,EAAG,MAAM,IAAI,aAAa,IAAI,cAAc+D,GAAGC,EAAErO,GAAE,EAAGqK,GAAE,EAAG,MAAM3B,EAAEkB,EAAEqO,cAAc,KAAKvP,IAAIA,EAAEgV,MAAMoB,QAAQ1Q,EAAE,GAAG,QAAQpO,GAAG4J,EAAEmV,gBAAgB,YAAYnV,EAAEmV,gBAAgB,aAAa1U,IAAIT,EAAEoV,aAAa,WAAW,IAAIpV,EAAEoV,aAAa,WAAW,MAAM,CAAC,CAAC,KAAAC,EAAOlL,EAAEnK,EAAErQ,KAAKoB,OAAOqF,EAAEyR,EAAEzR,EAAEzG,KAAKoB,OAAO8T,EAAEqH,MAAMzL,EAAE9Q,KAAKwc,YAAYvD,SAAS9J,EAAEnP,KAAKuV,OAAO,YAAY2G,MAAM/K,EAAE,EAAEmS,QAAQlkB,EAAE,EAAEmkB,QAAQ/f,EAAE,EAAEmiB,MAAMtiB,GAAE,EAAGuiB,MAAM/S,GAAE,EAAGyK,aAAa5I,GAAE,IAAK1U,KAAK4e,QAAQlI,EAAEM,SAAShX,KAAK4iB,YAAY,CAACY,KAAKnT,EAAErQ,KAAKoB,OAAOqF,EAAEgd,KAAKhd,EAAEzG,KAAKoB,OAAO8T,EAAEqH,MAAMzL,EAAE9Q,KAAKwc,YAAYN,MAAM/K,EAAEmS,QAAQlkB,EAAEmkB,QAAQ/f,EAAEyV,SAAS9J,EAAEwW,MAAMtiB,EAAEuiB,MAAM/S,EAAEyK,aAAa5I,GAAG,CAAC,WAAAkO,EAAaY,KAAK/c,EAAE,EAAEgd,KAAK3S,EAAE,EAAEyL,MAAMpN,EAAE,EAAE+M,MAAM/K,EAAE,EAAEmS,QAAQlkB,GAAGY,KAAKoc,QAAQ3V,EAAE8c,QAAQ/f,GAAGxD,KAAKoc,QAAQlH,EAAE+D,SAAS5V,EAAErD,KAAKuV,OAAO,YAAYoQ,MAAM9S,GAAE,EAAG+S,MAAMlR,GAAE,EAAG4I,aAAazI,GAAE,EAAG+E,OAAO9E,EAAE9U,KAAKuV,OAAO,YAAY,MAAMR,EAAE/U,KAAK4e,MAAM,GAAG7J,IAAI2B,EAAEM,QAAQ,OAAOhX,KAAK4gB,MAAM8C,qBAAqB1jB,KAAK4gB,KAAK5gB,KAAK4gB,IAAI,MAAM5gB,KAAKiZ,SAAS5V,GAAG,EAAErD,KAAKsd,aAAazI,EAAE,MAAMuH,QAAQ/c,GAAGW,KAAKkV,EAAE7V,EAAEoH,EAAEnD,EAAEjE,EAAE6V,EAAE3R,EAAEvD,KAAKqhB,UAAUrhB,KAAKoB,QAAQ,IAAI8W,GAAE,IAAK2N,WAAWC,UAAU5Q,EAAE5R,GAAGwiB,UAAU1mB,EAAEoE,GAAGsiB,UAAUrf,EAAEqK,GAAG,GAAG9Q,KAAKuV,OAAO,QAAQ,CAAC,IAAIV,EAAE,CAAC,MAAMxE,EAAErQ,KAAKwc,YAAY/V,EAAEzG,KAAK+Y,SAASjI,EAAE9Q,KAAKgZ,SAAS3I,EAAElB,EAAE1I,IAAI0I,EAAE1I,EAAE4J,GAAGA,EAAElB,EAAE2B,IAAI3B,EAAE2B,EAAET,EAAE,CAAC6H,EAAEA,EAAEqE,MAAMpN,EAAE,CAAC+I,EAAEA,EAAE4N,WAAW1mB,GAAGoE,GAAGsiB,WAAW5Q,GAAG5R,GAAGyiB,SAASxiB,GAAG4N,IAAI+G,EAAEA,EAAE8N,OAAO7U,IAAI0B,IAAIqF,EAAEA,EAAEqE,OAAO,EAAE,IAAI7H,IAAIwD,EAAEA,EAAEqE,MAAM,GAAG,IAAI,IAAI,MAAM9V,KAAKzD,EAAE,MAAMyD,GAAG,MAAMA,IAAIyR,EAAEzR,GAAGzG,KAAK+Y,SAAS,MAAMb,EAAEzR,GAAGzG,KAAK+Y,SAAS,MAAM/Y,KAAKoB,OAAOqF,GAAGyR,EAAEzR,GAAGzG,KAAKoB,OAAOqF,GAAG4J,EAAE6H,EAAEzR,GAAGsU,IAAI/a,KAAKwc,YAAYxc,KAAKuc,OAAO9T,KAAKsU,IAAI5N,EAAE,GAAG,IAAInP,KAAKsY,UAAU0C,IAAG,IAAKlG,KAAKD,GAAG7U,KAAKihB,oBAAoBlM,IAAI2B,EAAEC,KAAK3W,KAAKugB,UAAUvgB,KAAKgd,YAAYhd,KAAK4e,MAAMlI,EAAEI,QAAQ9W,KAAKkkB,cAAc,CAAC,IAAAzP,CAAKpE,GAAE,GAAI,GAAGrQ,KAAK4e,QAAQlI,EAAEC,MAAM3W,KAAK4e,QAAQlI,EAAEM,QAAQ,OAAO,MAAMvQ,EAAEzG,KAAK2jB,UAAU3jB,KAAK4gB,MAAM8C,qBAAqB1jB,KAAK4gB,KAAK5gB,KAAK4gB,IAAI,MAAM5gB,KAAKod,aAAY,EAAGpd,KAAKqd,aAAY,EAAG,IAAI,MAAM5W,KAAKzD,EAAEhD,KAAKygB,SAASha,GAAG,EAAE,YAAY4J,EAAErQ,KAAKoc,QAAQ3V,GAAGzG,KAAKoB,OAAOqF,GAAG,WAAW4J,IAAIrQ,KAAKoB,OAAOqF,GAAGzG,KAAKoc,QAAQ3V,IAAIzG,KAAK0gB,eAAehG,EAAE1a,KAAKge,UAAU,cAActD,EAAE1a,KAAKge,UAAU,gBAAgBhe,KAAK2jB,WAAU,EAAG3jB,KAAK4e,MAAMlI,EAAEG,MAAMpQ,IAAIzG,KAAKmW,KAAK,gBAAgBnW,KAAKolB,iBAAiB,CAAC,WAAAlB,GAAclkB,KAAK2jB,YAAY3jB,KAAKmW,KAAK,kBAAkBnW,KAAKolB,iBAAiBxK,EAAE5a,KAAKge,UAAU,gBAAgBhe,KAAK8c,WAAWlC,EAAE5a,KAAKge,UAAU,eAAehe,KAAK2jB,WAAU,EAAG3jB,KAAK4gB,MAAM5gB,KAAK4gB,IAAIC,sBAAsB,IAAK7gB,KAAKugB,WAAY,CAAC,YAAAyD,CAAavd,EAAEqK,EAAE9Q,KAAKuV,OAAO,sBAAsB,GAAGvV,KAAKimB,KAAKxf,EAAEzG,KAAKsY,UAAU0C,IAAIvU,EAAE,OAAO,GAAG4J,EAAErQ,KAAKwc,cAAcnM,EAAErQ,KAAK+Y,UAAU,OAAO/Y,KAAKmW,KAAK,YAAY1P,GAAG,MAAMuX,UAAU7O,EAAEyN,cAAczL,EAAEqK,YAAYpc,GAAGY,KAAKwD,EAAE2N,EAAEiH,MAAM/U,EAAE8N,EAAEkH,OAAOxF,EAAE1D,EAAE+P,wBAAwBxK,GAAGjO,EAAE6L,SAAS,GAAGO,EAAEiL,KAAKjJ,GAAGpO,EAAE8L,SAAS,GAAGM,EAAE8K,IAAI,IAAI6D,aAAa1M,EAAE2M,cAAc1M,GAAG/U,KAAKkhB,oBAAoBlhB,KAAKoB,QAAQ,MAAM/B,EAAEW,KAAKuV,OAAO,mBAAmBlW,EAAE,IAAIyV,IAAItR,IAAIsR,GAAGzV,GAAG0V,IAAI1R,IAAI0R,GAAG1V,IAAI,IAAI6V,EAAE,IAAIJ,EAAEtR,GAAGkR,EAAElR,EAAE,IAAI,KAAKsR,EAAEtR,GAAG0R,GAAG,IAAI9V,EAAEwe,MAAMxe,EAAE0e,MAAM,IAAIxa,EAAE,IAAIyR,EAAE1R,GAAGwR,EAAExR,EAAE,IAAI,KAAK0R,EAAE1R,GAAGC,GAAG,IAAIlE,EAAEye,OAAOze,EAAEue,KAAK3d,KAAK4iB,YAAY,CAACY,KAAKtO,EAAElV,KAAKoB,OAAOqF,EAAEgd,KAAKngB,EAAEtD,KAAKoB,OAAO8T,EAAE+D,SAASnI,GAAG,CAAC,aAAAiT,CAActd,GAAG,GAAGzG,KAAK4e,QAAQlI,EAAEM,SAAShX,KAAK4e,QAAQlI,EAAEC,KAAK,OAAO,MAAM7F,EAAElI,KAAKC,MAAM,GAAGiI,EAAE9Q,KAAKijB,IAAI,GAAG,YAAYxc,EAAEwb,iBAAiBjiB,KAAKijB,IAAInS,EAAE,IAAI3B,EAAE,EAAE1I,EAAEod,QAAQ,GAAGpd,EAAEqd,QAAQ,GAAGrd,EAAEkb,QAAQ,GAAG1M,OAAO,SAAU5E,EAAE5J,GAAG,OAAOgC,KAAKsU,IAAItW,GAAGgC,KAAKsU,IAAI1M,GAAG5J,EAAE4J,CAAE,GAAG,MAAMc,EAAE1I,KAAKC,KAAK,EAAED,KAAKoU,IAAI,EAAE1N,KAAKqN,YAAYpd,EAAE4Z,SAASxV,EAAEuV,SAAS1V,GAAGrD,KAAK,IAAI6S,EAAEzT,GAAG,IAAI,GAAG+R,GAAG,IAAId,EAAEwC,GAAGxC,EAAEhN,IAAIgN,EAAEjR,IAAIiR,EAAEhN,IAAIrD,KAAKkmB,KAAKzd,KAAKsU,IAAI5L,GAAG0B,EAAExP,GAAGgN,EAAEwC,GAAGxC,EAAE7M,IAAI6M,EAAEjR,IAAIiR,EAAE7M,IAAIxD,KAAKkmB,KAAKzd,KAAKsU,IAAI5L,GAAG0B,EAAErP,IAAIxD,KAAKkmB,IAAI,EAAErT,EAAEpK,KAAKC,IAAID,KAAKoU,IAAIhK,EAAErP,GAAGH,IAAIrD,KAAKkmB,IAAIlmB,KAAKuV,OAAO,gBAAgB9O,EAAEwb,iBAAiB5R,EAAEwC,KAAKxC,EAAEjR,IAAIY,KAAKmlB,OAAOtS,EAAE,CAACiQ,MAAMrc,IAAI,CAAC,SAAAuT,GAAY,OAAOha,KAAKuV,OAAO,UAAUlF,EAAErQ,KAAKwb,YAAYpD,MAAM,GAAG/H,EAAErQ,KAAKwb,YAAYC,SAAS,IAAIpL,EAAErQ,KAAKwc,aAAanM,EAAErQ,KAAKgZ,UAAU,CAAC,UAAAiB,GAAa,OAAOja,KAAKuV,OAAO,SAASlF,EAAErQ,KAAKwc,aAAanM,EAAErQ,KAAK+Y,SAAS,CAAC,MAAAoN,CAAO9V,EAAE,KAAK5J,GAAGzG,KAAKmlB,OAAOnlB,KAAKwc,YAAYnM,EAAE5J,EAAE,CAAC,OAAA2f,CAAQ/V,EAAE,GAAG5J,GAAGzG,KAAKmlB,OAAOnlB,KAAKwc,YAAYnM,EAAE5J,EAAE,CAAC,SAAA4f,CAAUhW,GAAGrQ,KAAKmlB,OAAO,MAAM9U,EAAE,CAAC,WAAAiW,CAAYjW,GAAGrQ,KAAKmlB,OAAO,QAAQ9U,EAAE,CAAC,UAAAkW,CAAWlW,GAAGrQ,KAAKmlB,OAAO,OAAO9U,EAAE,CAAC,SAAAmW,CAAUnW,GAAGrQ,KAAKmlB,OAAO,MAAM9U,EAAE,CAAC,UAAAoW,CAAWpW,GAAGrQ,KAAKmlB,OAAOnlB,KAAK+e,aAAa,cAAc1O,EAAE,CAAC,SAAAqW,CAAUrW,GAAGrQ,KAAKmlB,OAAOnlB,KAAK+e,aAAa,aAAa1O,EAAE,CAAC,WAAAsW,CAAYtW,GAAGrQ,KAAKmlB,OAAOnlB,KAAK+e,aAAa,eAAe1O,EAAE,CAAC,WAAAuW,CAAYvW,GAAGrQ,KAAKmlB,OAAO,OAAO9U,EAAE,CAAC,MAAA8U,CAAO9U,EAAE,GAAG4I,SAASxS,EAAE0U,EAAEmI,QAAQxS,EAAEqK,EAAEoI,QAAQpU,EAAEgM,EAAE2H,MAAM3R,GAAG,CAAC,GAAG,GAAGnR,KAAKid,kBAAkBjd,KAAK4e,QAAQlI,EAAEM,QAAQ,OAAO,MAAMwF,YAAYpd,EAAEqd,UAAUjZ,EAAEwV,SAAS3V,EAAEsZ,WAAW9J,GAAG7S,KAAK,GAAGA,KAAKyU,OAAOzU,KAAKsY,UAAU0C,IAAI7J,EAAEnR,KAAKimB,MAAM9U,GAAGA,GAAGL,IAAIqK,GAAGhM,IAAIgM,EAAE,CAAC,MAAM9K,EAAErQ,KAAKmY,QAAQ+G,wBAAwBzY,EAAEzG,KAAKge,UAAUkB,wBAAwB9f,EAAE+R,EAAEA,EAAEmB,QAAQ7L,EAAEqX,KAAK,GAAGrX,EAAE2R,MAAM5U,EAAE2N,EAAEA,EAAEoB,QAAQ9L,EAAEkX,IAAI,GAAGlX,EAAE4R,OAAOvH,EAAE1R,EAAEiR,EAAEyN,KAAK,GAAGzN,EAAE+H,MAAMjJ,EAAE3L,EAAE6M,EAAEsN,IAAI,GAAGtN,EAAEgI,MAAM,CAAC,IAAI3D,EAAE,EAAE,iBAAiBrE,EAAEqE,EAAErE,EAAE,SAASA,EAAEqE,EAAElR,EAAE,UAAU6M,EAAEqE,EAAE7B,EAAE,QAAQxC,EAAEqE,EAAErR,EAAE,QAAQgN,EAAEqE,EAAE,EAAE,SAASrE,IAAIqE,EAAE1U,KAAK+e,aAAa,gBAAgBrK,EAAEA,EAAEtV,GAAG,EAAEqH,EAAEA,IAAI0U,EAAEzG,EAAE,EAAE,IAAI,IAAIjO,EAAEzG,KAAK4iB,YAAY,CAACrG,MAAM7H,EAAE4O,QAAQxS,EAAEyS,QAAQpU,EAAE8J,SAASxS,IAAI0K,GAAGnR,KAAKsY,UAAU0C,GAAGhb,KAAKgkB,aAAa7S,EAAE1K,EAAE,CAAC,SAAAogB,GAAY7mB,KAAK4iB,YAAY,CAAC1G,OAAO,IAAI,CAAC,QAAA4K,GAAW9mB,KAAK4iB,YAAY,CAAC1G,MAAM,IAAI,CAAC,KAAAyJ,GAAQ3lB,KAAK4iB,YAAY,CAAC+C,OAAM,GAAI,CAAC,KAAAC,GAAQ5lB,KAAK4iB,YAAY,CAACgD,OAAM,GAAI,CAAC,IAAAmB,GAAO/mB,KAAKyU,KAAK,UAAU,MAAMmI,cAAcvM,EAAEmL,YAAY/U,EAAErF,OAAO0P,GAAG9Q,KAAKA,KAAK4iB,YAAY,CAACY,KAAK,GAAGnT,EAAE+H,OAAO3R,EAAEqX,KAAK,GAAGrX,EAAEgV,UAAU3K,EAAErK,EAAEgd,KAAK,GAAGpT,EAAEgI,QAAQ5R,EAAEkX,IAAI,GAAGlX,EAAEiV,WAAW5K,EAAEoE,EAAEqH,MAAMlM,EAAE+H,MAAM3R,EAAEgV,SAASzb,KAAKwc,YAAY8G,QAAQ,EAAEC,QAAQ,EAAEjG,cAAa,GAAI,CAAC,IAAA0J,GAAOhnB,KAAKyU,KAAK,UAAU,MAAMmI,cAAcvM,EAAEmL,YAAY/U,EAAErF,OAAO0P,GAAG9Q,KAAKA,KAAK4iB,YAAY,CAACY,KAAK,GAAGnT,EAAE+H,OAAO3R,EAAEqX,KAAK,GAAGrX,EAAEgV,UAAU3K,EAAErK,EAAEgd,KAAK,GAAGpT,EAAEqN,aAAajX,EAAEkX,IAAI,GAAGlX,EAAEiV,WAAW5K,EAAEoE,EAAEqH,MAAMlM,EAAEgI,OAAO5R,EAAEiV,UAAU1b,KAAKwc,YAAY8G,QAAQ,EAAEC,QAAQ,EAAEjG,cAAa,GAAI,CAAC,QAAA2G,GAAW,MAAMjG,UAAU3N,GAAGrQ,KAAKyG,EAAEzG,KAAK2V,GAAG,gBAAgB7E,EAAE9Q,KAAK2V,GAAG,qBAAqBtF,EAAE0B,UAAUC,OAAOvL,GAAG,MAAM0I,EAAEkB,EAAE0B,UAAUsM,SAAS5X,GAAG0I,GAAGiC,SAAS6V,gBAAgBlV,UAAU8I,IAAI/J,GAAGM,SAASiC,iBAAiB,UAAUrT,KAAKqgB,WAAU,KAAMjP,SAAS6V,gBAAgBlV,UAAU4I,OAAO7J,GAAGM,SAASgD,oBAAoB,UAAUpU,KAAKqgB,WAAU,IAAKrgB,KAAK6e,gBAAgB7e,KAAKmW,KAAKhH,EAAE,UAAU,SAAS,CAAC,SAAAkS,CAAUhR,EAAErQ,KAAKoc,SAAS,MAAM5Y,EAAEiD,EAAElD,EAAEuN,EAAE4D,EAAEvF,EAAE2F,EAAE3D,EAAE1K,EAAErH,EAAE8V,EAAE1R,GAAG6M,EAAE,OAAO,IAAIwV,UAAU,CAACpf,EAAEqK,EAAE3B,EAAEgC,EAAE/R,EAAEoE,GAAG,CAAC,KAAA0jB,CAAM7W,GAAG,GAAGrQ,KAAK4e,QAAQlI,EAAEC,MAAM3W,KAAK4e,QAAQlI,EAAEM,QAAQ,CAAChX,KAAKyU,KAAK,WAAW,IAAI,MAAMpE,KAAKrN,EAAEhD,KAAKoB,OAAOiP,GAAGyK,EAAEzK,GAAGrQ,KAAKoB,OAAOoC,EAAExD,KAAK+Y,SAAS/Y,KAAKoB,OAAO0T,EAAE9U,KAAK+Y,SAAS/Y,KAAKihB,oBAAoBjhB,KAAKgd,YAAYhd,KAAKiZ,cAAc,IAAI5I,EAAErQ,KAAKuV,OAAO,YAAYlF,EAAErQ,KAAK4e,MAAMlI,EAAEI,QAAQ9W,KAAKkkB,cAAc,CAAC,CAAC,OAAAiD,GAAUnnB,KAAKyU,OAAOzU,KAAK4e,MAAMlI,EAAEM,QAAQhX,KAAK8e,eAAe9e,KAAK0f,iBAAiB,MAAM1B,UAAU3N,EAAE8H,QAAQ1R,GAAGzG,KAAK8Q,EAAE9Q,KAAKuV,OAAO,YAAY,CAAC,EAAE,IAAI,MAAM9O,KAAKnH,OAAO8nB,OAAOtW,GAAGT,EAAE0B,UAAU4I,OAAOlU,EAAE,IAAIA,IAAIA,EAAE2N,oBAAoB,OAAOpU,KAAKme,QAAQ1X,EAAE2N,oBAAoB,QAAQpU,KAAKoe,UAAUpe,KAAKyW,eAAe,EAAEnX,OAAO4B,eAAeoa,EAAE,WAAW,CAAC/Z,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAM+W,IAAI5Y,OAAO4B,eAAeoa,EAAE,UAAU,CAAC/Z,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAM,CAAC,IAAI,MAAMkmB,EAAE,SAAShX,EAAE5J,GAAG,IAAIqK,GAAE,EAAG,MAAM,IAAI3B,KAAK2B,IAAIA,GAAE,EAAGT,KAAKlB,GAAGoQ,WAAW,KAAMzO,GAAE,CAAG,EAAErK,IAAI,EAAE6gB,EAAE,CAACjX,EAAE5J,KAAK,IAAIqK,EAAE,GAAG,OAAOT,EAAEkX,WAAWzV,QAASzB,IAAIA,EAAErK,WAAWwhB,KAAKC,cAAchhB,IAAI4J,EAAEwL,QAAQpV,IAAIqK,EAAEpG,KAAK2F,EAAG,GAAGS,GAAujB,IAAI4W,GAAG,SAASrX,GAAGA,EAAEA,EAAEsG,KAAK,GAAG,OAAOtG,EAAEA,EAAEwG,MAAM,GAAG,QAAQxG,EAAEA,EAAE2G,QAAQ,GAAG,SAAS,CAA5E,CAA8E0Q,IAAIA,EAAE,CAAC,IAAI,MAAMC,EAAEtX,IAAI,GAAG,iBAAiBA,GAAGA,aAAauX,YAAYvX,EAAE,CAACwX,KAAKxX,OAAO,CAAC,MAAM5J,EAAE4J,EAAEyX,WAAW,IAAIrhB,IAAI,iBAAiBA,IAAI4J,EAAE0X,SAASthB,GAAGA,aAAayW,mBAAmB7M,EAAE2X,QAAQvhB,EAAE4J,EAAE4X,WAAWxhB,EAAEyhB,IAAI7X,EAAE0X,SAASthB,EAAEyhB,YAAY7X,EAAEyX,MAAM,CAAC,OAAOxoB,OAAO0V,OAAO,CAAC6S,KAAK,GAAGM,GAAG,KAAKC,OAAM,EAAGC,MAAM,GAAGC,YAAY,GAAGhf,OAAO,EAAEif,IAAI,EAAEC,IAAI,EAAEC,IAAI,EAAEC,YAAW,GAAIrY,IAAIsY,EAAE,CAACtY,EAAE,CAAC,IAAI/Q,OAAO0V,OAAO,CAAC1L,OAAO,EAAEsf,OAAO,GAAGL,IAAI,EAAEE,KAAK,GAAGpY,GAAG,MAAMjN,UAAU8R,EAAE,WAAA7U,CAAYgQ,EAAE5J,GAAG2P,MAAM3P,GAAGnH,OAAO4B,eAAelB,KAAK,WAAW,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAMkP,GAAG,CAAC,MAAAmG,GAAS,CAAC,MAAAD,GAAS,EAAuZ,MAAMsS,UAAUzlB,EAAE,WAAA/C,GAAc+V,SAASpV,WAAW1B,OAAO4B,eAAelB,KAAK,YAAY,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,OAAM,IAAK7B,OAAO4B,eAAelB,KAAK,OAAO,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAM,MAAM,CAAC,SAAA2nB,GAAY9oB,KAAK+oB,SAAS,CAAC,KAAAC,GAAQ,IAAI3Y,EAAErQ,KAAKipB,KAAK,IAAI5Y,EAAE,CAACA,EAAEe,SAASM,cAAc,MAAMkJ,EAAEvK,EAAErQ,KAAK2V,GAAG,SAAStF,EAAEoV,aAAa,OAAO,WAAW,MAAMhf,EAAEzG,KAAKkpB,SAASlL,UAAUvX,EAAEmL,YAAYvB,GAAGuK,EAAEnU,EAAEzG,KAAK2V,GAAG,YAAY3V,KAAKipB,KAAK5Y,CAAC,CAAC,OAAOA,CAAC,CAAC,OAAA0Y,GAAU,IAAI1Y,EAAE,MAAM5J,EAAEzG,KAAKkpB,SAASC,MAAMloB,OAAO6P,EAAErI,KAAKoU,IAAI,EAAE7c,KAAKuV,OAAO,aAAapG,EAAE1G,KAAKC,IAAI,IAAI1I,KAAKuV,OAAO,aAAapE,EAAEnR,KAAKuV,OAAO,eAAe,GAAG9O,EAAEqK,GAAGrK,EAAE0I,EAAE,YAAYnP,KAAKopB,UAAU,MAAM5lB,EAAE,iBAAiB2N,GAAG1K,EAAE,GAAGA,GAAG0K,EAAE9N,GAAGrD,KAAKipB,MAAMjpB,KAAKqpB,YAAY7lB,GAAGxD,KAAKipB,KAAKK,SAASroB,SAASwF,EAAEpD,GAAGrD,KAAKopB,UAAU,MAAMvW,EAAE7S,KAAKgpB,QAAQ,GAAG5pB,EAAEyT,EAAE7S,KAAK2V,GAAG,eAAenS,GAAGH,EAAE,IAAI,IAAIgN,EAAE,EAAEA,EAAE5J,EAAE4J,IAAIwC,EAAE0W,OAAOvpB,KAAKwpB,WAAWnZ,IAAI,IAAIqE,EAAEG,EAAE,EAAE,IAAI,MAAMpO,IAAI,IAAIoM,EAAEyW,UAAU,CAAC,MAAMxY,EAAE+D,IAAI7U,KAAKkpB,SAASO,KAAK3Y,IAAI4D,EAAEjO,GAAGrH,EAAEqH,EAAEzG,KAAK2V,GAAG,aAAa7E,GAAG,QAAQT,EAAE5J,EAAE6iB,SAAS,UAAU,IAAIjZ,GAAGA,EAAEoV,aAAa,gBAAgB3U,EAAE,OAAO,SAAS,IAAI,MAAMT,IAAI,CAAC,eAAe,SAAS,SAAS,eAAeqK,EAAEjU,EAAEzG,KAAK2V,GAAGtF,IAAIwE,GAAG,CAAC,GAAGH,EAAEA,GAAG7B,EAAElB,WAAWnO,GAAGkR,EAAE,CAAC,MAAMrE,EAAEqE,EAAEgV,uBAAuBjjB,EAAE4J,GAAGA,EAAEqZ,uBAAuB9O,EAAEvK,EAAErQ,KAAK2V,GAAG,WAAWiF,EAAEnU,EAAEzG,KAAK2V,GAAG,iBAAiB,MAAM7E,EAAE4D,EAAEiV,mBAAmBxa,EAAE2B,GAAGA,EAAE6Y,mBAAmB/O,EAAE9J,EAAE9Q,KAAK2V,GAAG,WAAWiF,EAAEzL,EAAEnP,KAAK2V,GAAG,eAAe,CAAC3V,KAAKqpB,UAAU7lB,CAAC,CAAC,UAAAgmB,CAAWnZ,EAAE,GAAG,IAAI5J,EAAE,MAAMqK,EAAEM,SAASM,cAAc,MAAMZ,EAAE2U,aAAa,OAAO,gBAAgB,MAAMtU,EAAEhC,EAAEnP,KAAKkpB,SAASrT,SAAS7V,KAAKuV,OAAO,UAAU,CAAC,CAAC,KAAKlF,EAAE,KAAKlN,QAAQ,OAAOkN,EAAE,KAAK,OAAOS,EAAEc,YAAYT,GAAG,QAAQ1K,EAAEqK,EAAEwY,SAAS,UAAU,IAAI7iB,GAAGA,EAAEgf,aAAa,OAAO,OAAO3U,CAAC,CAAC,OAAAsY,GAAUppB,KAAKipB,OAAOjpB,KAAKipB,KAAKtO,SAAS3a,KAAKipB,KAAK,MAAMjpB,KAAKqpB,WAAU,EAAG3O,EAAE1a,KAAKkpB,SAASlL,UAAUhe,KAAK2V,GAAG,WAAW,CAAC,MAAAa,GAASxW,KAAKkpB,SAAS1T,GAAG,CAAC,UAAU,UAAUxV,KAAK8oB,UAAU,CAAC,MAAAvS,GAASvW,KAAKkpB,SAAShT,IAAI,CAAC,UAAU,UAAUlW,KAAK8oB,WAAW9oB,KAAKopB,SAAS,EAAE9pB,OAAO4B,eAAe2nB,EAAE,WAAW,CAACtnB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAA15E,CAACyU,QAAQ,CAACqT,KAAK,mBAAmBI,UAAU,aAAaO,QAAQ,WAAWC,IAAI,kBAAkBC,aAAa,iBAAiBC,OAAO,UAAUC,UAAU,aAAaC,OAAO,UAAUC,YAAY,iBAAiBC,OAAO,wIAAwIC,YAAY,GAAGC,SAAS,IAAIC,SAAS,KAA0hE,MAAMC,EAAE,WAAWC,EAAE,OAAOC,EAAE,OAAO,MAAMC,UAAUtnB,EAAE,WAAA/C,GAAc+V,SAASpV,WAAW1B,OAAO4B,eAAelB,KAAK,YAAY,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAM,OAAO7B,OAAO4B,eAAelB,KAAK,OAAO,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAM,OAAO7B,OAAO4B,eAAelB,KAAK,OAAO,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAM,OAAO7B,OAAO4B,eAAelB,KAAK,QAAQ,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,OAAM,GAAI,CAAC,SAAA2nB,GAAY,MAAMzY,EAAErQ,KAAKkpB,SAASziB,EAAE4J,EAAE8Y,MAAMloB,OAAO6P,EAAET,EAAEoZ,KAAK,GAAGhjB,EAAE,EAAE,YAAYzG,KAAKopB,UAAUppB,KAAKgpB,QAAQ,IAAI7Z,EAAEnP,KAAK2qB,KAAKxZ,EAAEnR,KAAK4qB,KAAKzb,GAAGgC,IAAIhC,EAAEqW,gBAAgB+E,GAAGpZ,EAAEqU,gBAAgB+E,GAAGla,EAAE4L,aAAanL,GAAG,GAAG3B,EAAEsW,aAAa8E,EAAE,IAAIzZ,GAAGrK,EAAE,GAAG0K,EAAEsU,aAAa8E,EAAE,KAAK,CAAC,MAAAM,CAAOxa,GAAG,IAAI5J,EAAE,MAAMqK,EAAE9Q,KAAKkpB,SAAS/Z,EAAEiC,SAASM,cAAc,UAAUvC,EAAEsW,aAAa,WAAW,KAAKtW,EAAEsW,aAAa,QAAQ3U,EAAE+E,SAAS,KAAKxF,EAAEya,oBAAoBlQ,EAAEzL,EAAEnP,KAAK2V,GAAG,UAAU,IAAI3V,KAAK2V,GAAGtF,IAAIma,EAAE,SAAS,WAAW,MAAMrZ,EAAEL,EAAEia,MAAM1a,IAAIma,EAAEC,EAAED,EAAEna,EAAE,IAAIjR,EAAE,OAAO+P,EAAE6b,UAAUla,EAAE+E,SAAS7V,KAAKuV,OAAO,GAAGpE,SAAShC,EAAEkT,QAAQ,WAAWjjB,EAAEiR,EAAEjR,EAAEA,EAAEsE,MAAM,UAAUtE,EAAE6rB,OAAO,GAAGH,cAAc1rB,EAAE2W,UAAU,GAAG3W,EAAE,MAAM,OAAO,QAAQqH,EAAEzG,KAAKge,iBAAiB,IAAIvX,GAAGA,EAAEmL,YAAYzC,GAAGA,CAAC,CAAC,KAAA6Z,GAAQ,MAAM3Y,EAAErQ,KAAKkpB,SAASlL,UAAUvX,EAAEzG,KAAK2V,GAAG,aAAa,IAAIqI,UAAUlN,EAAE6Z,KAAKxb,EAAEyb,KAAKzZ,GAAGnR,KAAK8Q,IAAIA,EAAET,EAAEqO,cAAc,IAAIjY,GAAGzG,KAAKooB,QAAQtX,GAAGA,IAAIA,EAAEM,SAASM,cAAc,OAAOkJ,EAAE9J,EAAErK,GAAG4J,EAAEuB,YAAYd,IAAI9Q,KAAKge,UAAUlN,EAAEK,IAAIA,EAAEL,EAAE4N,cAAc,yBAAyBvN,IAAIA,EAAEnR,KAAK6qB,OAAOL,IAAIxqB,KAAK4qB,KAAKzZ,EAAEhC,IAAIA,EAAE2B,EAAE4N,cAAc,yBAAyBvP,IAAIA,EAAEnP,KAAK6qB,OAAOJ,IAAIzqB,KAAK2qB,KAAKxb,CAAC,CAAC,OAAAia,GAAUppB,KAAKooB,QAAQpoB,KAAK2qB,MAAM3qB,KAAK2qB,KAAKhQ,SAAS3a,KAAK4qB,MAAM5qB,KAAK4qB,KAAKjQ,SAAS3a,KAAKge,WAAWhe,KAAKge,UAAUrD,UAAU3a,KAAK2qB,KAAK,KAAK3qB,KAAK4qB,KAAK,KAAK5qB,KAAKge,UAAU,KAAKhe,KAAKooB,OAAM,CAAE,CAAC,MAAA5R,GAASxW,KAAKkpB,SAAS1T,GAAG,CAAC,UAAU,UAAUxV,KAAK8oB,UAAU,CAAC,MAAAvS,GAASvW,KAAKkpB,SAAShT,IAAI,CAAC,UAAU,UAAUlW,KAAK8oB,WAAW9oB,KAAKopB,SAAS,EAAE9pB,OAAO4B,eAAewpB,EAAE,WAAW,CAACnpB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAM,CAACyU,QAAQ,CAACoI,UAAU,kBAAkBrK,OAAO,WAAWsW,OAAO,UAAUF,OAAO,WAAWmB,QAAQ,2GAA2GC,QAAQ,gHAAgH,MAAMC,UAAUhoB,EAAE,WAAA/C,GAAc+V,SAASpV,WAAW1B,OAAO4B,eAAelB,KAAK,gBAAgB,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAM,OAAO7B,OAAO4B,eAAelB,KAAK,SAAS,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAM,OAAO7B,OAAO4B,eAAelB,KAAK,MAAM,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAM,MAAM,CAAC,cAAAkqB,CAAehb,GAAGrQ,KAAKoB,OAAOpB,KAAKkpB,SAASlpB,KAAKsrB,IAAIjb,EAAErQ,KAAK4f,cAAc,CAAC,WAAA2L,CAAYlb,GAAGrQ,KAAKsrB,IAAItrB,KAAKkpB,SAASlpB,KAAKoB,OAAOiP,EAAErQ,KAAK4f,cAAc,CAAC,YAAAA,GAAe,MAAM0L,IAAIjb,EAAEjP,OAAOqF,GAAGzG,KAAKqQ,GAAG5J,IAAI4J,EAAEgF,QAAQmW,aAAa/kB,EAAE4O,QAAQoW,YAAYpb,EAAEuO,QAAQ8I,EAAE7Q,MAAM7W,KAAK0rB,WAAWrb,GAAGA,EAAEmF,GAAG,QAAQxV,KAAK0rB,YAAYjlB,EAAEmY,QAAQ8I,EAAE7Q,MAAM7W,KAAK2rB,cAAcllB,GAAGA,EAAE+O,GAAG,QAAQxV,KAAK2rB,eAAe,CAAC,UAAAD,CAAWrb,GAAGA,EAAEmF,GAAG,cAAcxV,KAAK4rB,kBAAkBvb,EAAEmF,GAAG,gBAAgBxV,KAAK6rB,YAAYxb,EAAEmF,GAAG,mBAAmBxV,KAAK8rB,YAAY9rB,KAAK+rB,gBAAgB,CAAC,aAAAJ,CAActb,GAAGA,EAAEmF,GAAG,SAASxV,KAAK+rB,gBAAgB1b,EAAEmF,GAAG,kBAAkBxV,KAAK+rB,gBAAgB/rB,KAAK+rB,gBAAgB,CAAC,UAAAF,CAAWxb,EAAE5J,EAAEqK,GAAG9Q,KAAK8rB,WAAWzb,EAAEA,EAAE2b,QAAQlb,EAAE,CAAC,UAAAgb,CAAWzb,EAAE5J,EAAEqK,GAAG,IAAI3B,EAAEgC,EAAE,GAAG1I,KAAKsU,IAAItW,EAAEmb,WAAWpH,GAAG,GAAG/R,KAAKsU,IAAItW,EAAEmb,WAAW1J,GAAG,EAAE,OAAO,MAAM9Y,EAAE0R,EAAE1P,QAAQkqB,IAAI9nB,EAAEpC,OAAOiC,GAAGrD,KAAK,IAAIwD,IAAIH,IAAIjE,EAAE,OAAO,MAAMyT,EAAEzT,EAAEgjB,QAAQ,gBAAgB,GAAGtR,EAAEoR,kBAAkBpR,EAAEmR,kBAAkBpP,EAAE,OAAO,MAAM6B,EAAE/Q,SAASkP,EAAEwP,QAAQ/Y,OAAO,GAAG,KAAK,EAAEuL,EAAExR,EAAE4oB,gBAAgBvX,GAAGI,EAAEtR,EAAEyoB,gBAAgBvX,GAAGlR,EAAE0oB,QAAQpX,GAAGzR,EAAE6oB,QAAQrX,EAAE,CAACoE,UAAU,QAAQ9H,EAAE,QAAQhC,EAAEnP,KAAKsrB,WAAW,IAAInc,OAAO,EAAEA,EAAEmH,eAAe,IAAInF,OAAO,EAAEA,EAAEgb,KAAK5W,OAAO,cAAc,IAAIvV,KAAKosB,kBAAkB1X,EAAE,CAAC,gBAAAkX,CAAiBvb,EAAE5J,GAAGA,EAAE6C,QAAQtJ,KAAKqsB,eAAersB,KAAKosB,kBAAkB3lB,EAAE6C,MAAM,CAAC,cAAAyiB,GAAiB,IAAI1b,EAAE5J,EAAE,MAAMrF,OAAO0P,EAAEwa,IAAInc,GAAGnP,KAAK,IAAI8Q,IAAI3B,EAAE,OAAO,GAAGA,EAAEyP,QAAQ8I,EAAE7Q,OAAO/F,EAAE8N,QAAQ8I,EAAE7Q,MAAM,OAAO,MAAM1F,EAAE,QAAQ1K,EAAE,QAAQ4J,EAAES,EAAEqY,MAAMrY,EAAE2Y,aAAa,IAAIpZ,OAAO,EAAEA,EAAEuY,OAAO,UAAU,IAAIniB,OAAO,EAAEA,EAAE6C,MAAMlK,EAAE+P,EAAE8c,gBAAgB9a,GAAGnR,KAAKosB,kBAAkBjb,GAAGhC,EAAE+c,QAAQ9sB,EAAE,OAAO+P,EAAEmd,UAAU,OAAOxb,EAAEwb,SAAS,CAACrT,SAAS,QAAQ,EAAE,CAAC,iBAAAmT,CAAkB/b,GAAG,MAAM5J,EAAEzG,KAAKsrB,IAAI7kB,GAAGA,EAAEmY,QAAQ8I,EAAE7Q,QAAQ7W,KAAKqsB,cAAchc,EAAE,IAAI5J,EAAEmiB,QAAQ7lB,IAAK0D,IAAIA,EAAE0hB,IAAI1hB,EAAE0hB,GAAGpW,UAAUtL,EAAE6C,QAAQ+G,EAAE,MAAM,UAAU,kBAAmB,GAAG,CAAC,MAAAmG,GAAS,MAAMnG,EAAErQ,KAAK,IAAIyG,EAAE4J,EAAEgF,QAAQjU,OAAO0P,EAAET,EAAEgF,QAAQiW,IAAI7kB,EAAE4J,EAAEkb,YAAY9kB,GAAGqK,GAAGT,EAAEgb,eAAeva,EAAE,CAAC,MAAAyF,GAAS,MAAMlG,EAAErQ,KAAKyG,EAAE4J,EAAEib,IAAIxa,EAAET,EAAEjP,OAAOqF,IAAIA,EAAEyP,IAAI,QAAQ7F,EAAEqb,YAAYjlB,EAAEyP,IAAI,cAAc7F,EAAEub,kBAAkBnlB,EAAEyP,IAAI,gBAAgB7F,EAAEwb,YAAYplB,EAAEyP,IAAI,mBAAmB7F,EAAEyb,aAAazb,EAAEib,IAAI,KAAKxa,IAAIA,EAAEoF,IAAI,QAAQ7F,EAAEsb,eAAe7a,EAAEoF,IAAI,UAAU7F,EAAE0b,gBAAgBjb,EAAEoF,IAAI,SAAS7F,EAAE0b,iBAAiB1b,EAAEjP,OAAO,IAAI,EAAE9B,OAAO4B,eAAekqB,EAAE,WAAW,CAAC7pB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAM,CAAC8X,SAAS,OAAO,MAAMsT,EAAE,CAACC,WAAW9B,EAAE+B,KAAK5D,EAAEsD,KAAKf,GAAGsB,EAAE,eAAeC,EAAE,aAAaC,EAAE,QAAQ,MAAMC,UAAUvpB,EAAE,QAAIwpB,GAAO,OAAO9sB,KAAK+sB,aAAa,IAAI,GAAG,CAAC,aAAIC,GAAY,OAAOhtB,KAAK4e,QAAQ8I,EAAE7Q,KAAK,CAAC,cAAIoF,GAAa,IAAI5L,GAAE,EAAG,MAAM4c,WAAWxmB,EAAEymB,YAAYpc,EAAEqY,MAAMha,EAAEyZ,OAAOzX,GAAGnR,KAAKZ,EAAE+R,EAAE,GAAG,OAAOhC,EAAElO,QAAQ,GAAG7B,GAAGqH,EAAErH,EAAEmpB,KAAKzX,IAAIT,EAAErQ,KAAKuV,OAAO,aAAalF,CAAC,CAAC,SAAI0a,GAAQ,MAAM,QAAQ/qB,KAAKuV,OAAO,YAAY,CAAC,gBAAIwX,GAAe,MAAM,MAAM/sB,KAAKuV,OAAO,OAAO,CAAC,WAAAlV,CAAYgQ,EAAE5J,EAAE,CAAC,EAAEqK,EAAE,CAAC,GAAG,GAAGsF,QAAQ9W,OAAO4B,eAAelB,KAAK,KAAK,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAM,KAAK7B,OAAO4B,eAAelB,KAAK,KAAK,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAM,IAAI7B,OAAO4B,eAAelB,KAAK,cAAc,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAM,CAAC,IAAI7B,OAAO4B,eAAelB,KAAK,cAAc,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAM,CAAC,IAAI7B,OAAO4B,eAAelB,KAAK,QAAQ,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAMumB,EAAE/Q,OAAOrX,OAAO4B,eAAelB,KAAK,OAAO,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAM,IAAI7B,OAAO4B,eAAelB,KAAK,WAAW,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAM,OAAO7B,OAAO4B,eAAelB,KAAK,YAAY,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,WAAW,IAAI7B,OAAO4B,eAAelB,KAAK,WAAW,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAM,OAAO7B,OAAO4B,eAAelB,KAAK,QAAQ,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAM,OAAO7B,OAAO4B,eAAelB,KAAK,SAAS,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAM,KAAK7B,OAAO4B,eAAelB,KAAK,QAAQ,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAM,KAAK7B,OAAO4B,eAAelB,KAAK,UAAU,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAM,OAAO7B,OAAO4B,eAAelB,KAAK,eAAe,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAM,IAAIgsB,MAAM7tB,OAAO4B,eAAelB,KAAK,aAAa,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAM,IAAI7B,OAAO4B,eAAelB,KAAK,cAAc,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAM,IAAI,iBAAiBkP,IAAIA,EAAEe,SAASsN,cAAcrO,KAAKA,IAAIoK,EAAEpK,GAAG,MAAM,IAAIuG,MAAM,oBAAoB5W,KAAKge,UAAU3N,EAAErQ,KAAKotB,UAAU/F,EAAErnB,KAAKotB,UAAUha,KAAKpT,MAAM,KAAKA,KAAKqtB,UAAUhG,EAAErnB,KAAKqtB,UAAUja,KAAKpT,MAAM,KAAKA,KAAKstB,YAAY7mB,EAAEzG,KAAKutB,YAAYzc,EAAE0N,eAAe,KAAMxe,KAAKwtB,gBAAiB,EAAE,CAAC,cAAAA,GAAiB,IAAInd,EAAE5J,EAAE,MAAMqK,EAAEiE,EAAE,CAAC,EAAE8X,EAAEvX,SAAStV,KAAKstB,aAAa,IAAIne,EAAE,GAAG,MAAMgC,EAAEL,EAAE2c,YAAY,GAAGtc,GAAG2D,EAAE3D,GAAG,IAAI,MAAMd,EAAE5J,KAAKnH,OAAO+J,QAAQ8H,GAAGJ,OAAO6K,WAAWvL,GAAGwL,SAAS/G,EAAErO,KAAK0I,GAAGkB,EAAE0E,EAAEjE,EAAErK,IAAI0I,IAAInP,KAAK0tB,IAAI1tB,KAAK4e,QAAQ8I,EAAE/Q,OAAO3W,KAAK0tB,GAAGve,EAAEnP,KAAK4e,QAAQ8I,EAAE7Q,QAAQ/F,EAAE0a,cAAc,QAAQ/kB,EAAE,QAAQ4J,EAAErQ,KAAKmpB,MAAMnpB,KAAKypB,aAAa,IAAIpZ,OAAO,EAAEA,EAAEuY,OAAO,UAAU,IAAIniB,OAAO,EAAEA,EAAE6C,QAAQ,GAAGtJ,KAAK4e,QAAQ8I,EAAE/Q,MAAM3W,KAAKmnB,UAAU/Q,MAAMjB,WAAWrE,IAAG,IAAK9Q,KAAKuV,OAAO,WAAWvV,KAAK4f,eAAeL,WAAW,KAAMvf,KAAK2tB,MAAO,EAAE,GAAG,CAAC,IAAAA,GAAO3tB,KAAK4e,MAAM8I,EAAE/Q,KAAK3W,KAAKmW,KAAK,QAAQnW,KAAKqW,cAAc/W,OAAO0V,OAAO1V,OAAO0V,OAAO,CAAC,EAAE6X,EAAE3O,SAASle,KAAKutB,cAAcvtB,KAAKmW,KAAK,iBAAiBnW,KAAK4tB,aAAa5tB,KAAK6tB,aAAa7tB,KAAK6e,gBAAgB7e,KAAK8tB,qBAAqB9tB,KAAK+tB,cAAc/tB,KAAK4f,eAAe5f,KAAK4e,MAAM8I,EAAE7Q,MAAM7W,KAAKmW,KAAK,QAAQ,CAAC,UAAAyX,GAAa,MAAM5P,UAAU3N,GAAGrQ,KAAKyG,EAAEzG,KAAKuV,OAAO,WAAWqF,EAAEvK,EAAErQ,KAAK2V,GAAG,cAAcvW,EAAEiR,EAAE5J,EAAEunB,OAAOhuB,KAAK+qB,OAAO3rB,EAAEiR,EAAE5J,EAAEskB,MAAM/qB,KAAK+qB,OAAO3rB,EAAEiR,EAAE5J,EAAEwnB,YAAYjuB,KAAK+sB,cAAc3tB,EAAEiR,EAAE5J,EAAEsmB,aAAa/sB,KAAK+sB,cAAc,IAAIjc,EAAE9Q,KAAKuV,OAAO,aAAalF,EAAEqO,cAAc,IAAIjY,EAAEynB,YAAYpd,IAAIA,EAAEM,SAASM,cAAc,OAAOkJ,EAAE9J,EAAErK,EAAEynB,UAAUpd,EAAEyY,UAAUjC,EAAEjX,EAAE,IAAI5J,EAAE0nB,UAAU9d,EAAE+d,QAAQtd,IAAIA,EAAEuC,iBAAiB,SAASrT,KAAKquB,UAAU,IAAIlf,EAAEnP,KAAKuV,OAAO,UAAUlF,EAAEqO,cAAc,IAAIjY,EAAE6nB,SAASnf,IAAIA,EAAEiC,SAASM,cAAc,OAAOkJ,EAAEzL,EAAE1I,EAAE6nB,OAAOnf,EAAEoa,UAAU7kB,MAAMsP,KAAKlD,EAAEyW,cAAcpY,EAAEsW,aAAa,YAAY,UAAU3U,EAAEuN,SAASlP,IAAI2B,EAAEsd,QAAQjf,GAAGnP,KAAKkuB,SAASpd,EAAE9Q,KAAKsuB,MAAMnf,EAAEnP,KAAKmW,KAAK,aAAa,CAAC,UAAA0X,GAAa,MAAMS,MAAMje,GAAGrQ,KAAK,IAAIqQ,EAAE,OAAO,MAAM5J,EAAE,IAAIzG,KAAK4oB,QAAQ9X,EAAE,GAAG,IAAIwW,EAAEjX,EAAE,IAAIrQ,KAAK2V,GAAGiX,OAAO9a,QAASzB,IAAI,GAAGoK,EAAEpK,GAAG,CAAC,MAAM5J,EAAEkhB,EAAE,CAACQ,GAAG9X,EAAE+X,OAAM,EAAG9e,MAAMtJ,KAAK4oB,OAAO3nB,SAAS6P,EAAEpG,KAAKjE,EAAE,CAAE,GAAG,IAAI,IAAI4J,IAAI,IAAIrQ,KAAKuV,OAAO,SAAS,KAAK,MAAM9O,GAAGqK,EAAEpG,KAAKid,EAAEtX,IAAIrQ,KAAK4oB,OAAO9X,EAAE,IAAI,IAAIT,EAAE,EAAEA,EAAErQ,KAAK4oB,OAAO3nB,OAAOoP,IAAIrQ,KAAK4oB,OAAOvY,GAAG/G,MAAM+G,EAAE,IAAI,MAAMA,KAAKS,EAAE9Q,KAAKmW,KAAK,kBAAkB9F,EAAEA,EAAE/G,OAAOtJ,KAAKmW,KAAK,YAAY9F,EAAEA,EAAE/G,OAAOtJ,KAAKmW,KAAK,aAAa,CAAC,cAAAoY,GAAiB,MAAMle,EAAErQ,KAAKuV,OAAO,gBAAgBvV,KAAKypB,KAAK,iBAAiBpZ,EAAErQ,KAAKisB,gBAAgB5b,GAAG1M,SAAS3D,KAAKuV,OAAO,cAAc,GAAG,GAAG,KAAK,CAAC,CAAC,kBAAAuY,GAAqB,MAAMQ,MAAMje,EAAE8Y,MAAM1iB,EAAEsmB,aAAajc,GAAG9Q,KAAK,IAAIqQ,IAAI5J,EAAExF,OAAO,OAAO,IAAIkO,EAAEnP,KAAKypB,KAAKhjB,EAAE0I,KAAKnP,KAAKypB,KAAKta,EAAE,GAAG,MAAMgC,GAAG1K,EAAE0I,GAAGsZ,KAAK,IAAIzoB,KAAK+qB,OAAOja,EAAE,GAAG,GAAG1R,EAAE0R,EAAE,GAAGK,MAAM,IAAI3N,EAAEsN,EAAE,IAAI,GAAGK,MAAMd,EAAE8T,MAAM1e,UAAU,eAAerG,MAAMoE,iBAAiBxD,KAAKuV,OAAO,mBAAmBvV,KAAKwuB,mBAAmB,CAAC,WAAAT,GAAc/tB,KAAKgsB,UAAUhsB,KAAKgsB,QAAQ7E,UAAUnnB,KAAKgsB,QAAQ,MAAM,MAAM3b,EAAErQ,KAAKuV,OAAO,YAAY,CAAC,EAAEvV,KAAKgsB,QAAQ,IAAI1Q,EAAEtb,KAAKkuB,SAASnZ,EAAE,CAAC,EAAE,CAACoD,QAAQnY,KAAKsuB,MAAM1V,MAAK,EAAGE,eAAc,EAAGL,SAASzY,KAAK+sB,aAAa,IAAI,IAAIrT,SAAS1Z,KAAKic,WAAW7C,OAAM,EAAGC,UAAS,EAAGd,MAAMlI,KAAKrQ,KAAKmpB,MAAMloB,OAAO,IAAIoP,EAAEgF,QAAQqE,UAAUD,OAAO,IAAIzZ,KAAK8gB,YAAYjH,YAAYxJ,GAAG5H,KAAKsU,IAAI1M,EAAEjP,OAAOpB,KAAK8sB,MAAMzc,EAAE+L,QAAQpc,KAAK8sB,OAAO,EAAE9sB,KAAKktB,YAAY,IAAI,GAAG7c,IAAIrQ,KAAKgsB,QAAQxW,GAAG,IAAI,CAAEnF,EAAE5J,KAAKqK,KAAK9Q,KAAKmW,KAAK,WAAW1P,IAAI4J,KAAKS,EAAG,GAAG9Q,KAAKgsB,QAAQxW,GAAG,QAAQxV,KAAKyuB,SAASzuB,KAAKgsB,QAAQxW,GAAG,UAAUxV,KAAK8oB,WAAW9oB,KAAKgsB,QAAQxW,GAAG,kBAAkBxV,KAAK0uB,mBAAmB1uB,KAAKgsB,QAAQxW,GAAG,eAAexV,KAAK2uB,eAAe,CAAC,YAAA/O,GAAe,MAAMvP,EAAErQ,KAAKge,UAAU3N,IAAIA,EAAEgD,iBAAiB,QAAQrT,KAAK6f,QAAQ,CAACjN,SAAQ,EAAGkN,SAAQ,IAAKzP,EAAEgD,iBAAiB,UAAUrT,KAAK4uB,YAAY7d,OAAOsC,iBAAiB,SAASrT,KAAKsf,SAAS,CAAC,WAAAuP,GAAc,IAAIxe,EAAE,GAAG,MAAM4c,WAAWxmB,EAAEymB,YAAYpc,GAAG9Q,KAAK,IAAImP,EAAEnP,KAAKuV,OAAO,iBAAiBpG,GAAG,SAASA,GAAG1I,GAAGqK,KAAI,IAAK9Q,KAAKuV,OAAO,QAAQ,IAAIjF,WAAWnB,EAAE,IAAI,IAAIgC,EAAE,EAAE/R,EAAE,EAAEoE,EAAE,EAAE,IAAI,MAAMiD,KAAKzG,KAAK4oB,SAASvY,EAAEpP,QAAQ7B,EAAEqH,EAAE8hB,IAAIzX,EAAE,KAAKtN,GAAG2L,KAAKkB,EAAE3F,KAAKie,KAAKxX,EAAEd,EAAEpP,OAAO,EAAE7B,EAAE,EAAEoE,EAAE,GAAG6M,EAAEc,GAAGyX,OAAOle,KAAKjE,GAAGrH,GAAGqH,EAAE8hB,IAAI9hB,EAAE+hB,IAAIhlB,IAAI,OAAO6M,CAAC,CAAC,YAAAye,GAAe,MAAMroB,EAAEzG,KAAKmpB,OAAO8D,WAAWnc,EAAEoc,YAAY/d,EAAE8M,WAAW9K,GAAGnR,KAAKZ,EAAEY,KAAKuV,OAAO,UAAU/R,EAAExD,KAAKuV,OAAO,QAAQlS,EAAEG,GAAGpE,GAAG0R,EAAE3B,IAAIgC,EAAE,GAAG1K,EAAEqL,QAAQ,CAAEzB,EAAE5J,KAAK,IAAI0K,EAAEd,EAAE/G,MAAM7C,EAAE4J,EAAEoY,KAAK,QAAQtX,EAAEd,EAAEuY,OAAO,UAAU,IAAIzX,OAAO,EAAEA,EAAEsX,MAAM,EAAEpY,EAAEkY,IAAI,EAAE,IAAI,MAAM9hB,EAAEqK,KAAKT,EAAEuY,OAAOvf,UAAUgH,EAAEkY,KAAKzX,EAAEyX,IAAI9hB,EAAE4J,EAAEuY,OAAO3nB,OAAO,IAAIoP,EAAEkY,KAAKzX,EAAE0X,KAAKnlB,GAAGgN,EAAEoY,IAAI,GAAGpY,EAAEkY,IAAI,GAAGpZ,EAAEkB,EAAEoY,IAAI,EAAEplB,GAAGgN,EAAEoY,IAAI,GAAGpY,EAAEkY,KAAKzX,EAAE,GAAG3B,EAAEkB,EAAEoY,IAAI3X,EAAE3B,EAAE/P,IAAIiR,EAAEoY,MAAM,IAAItZ,EAAEkB,EAAEkY,KAAM,GAAG9hB,EAAEqL,QAASrL,IAAIjD,IAAI2N,GAAGL,EAAE3B,IAAI1I,EAAEgiB,IAAIhgB,KAAKC,IAAIjC,EAAEgiB,IAAI,GAAGhiB,EAAEgiB,IAAIhgB,KAAKoU,IAAIpW,EAAEgiB,IAAI3X,EAAE3B,IAAI1I,EAAEgiB,IAAIpY,EAAE5J,EAAEgiB,IAAI,KAAKhiB,EAAE8hB,IAAIlY,EAAE5J,EAAE8hB,IAAI,KAAK9f,KAAKsU,IAAItW,EAAEgiB,MAAM,KAAKhiB,EAAEgiB,IAAI,EAAG,GAAGtX,EAAE,OAAO1K,EAAE,MAAMoM,EAAE,GAAG,IAAI6B,EAAE,OAAOjO,EAAEqL,QAASzB,IAAI,MAAM5J,EAAEnH,OAAO0V,OAAO,CAAC,EAAE3E,GAAGqE,GAAGjO,EAAEgiB,MAAM/T,EAAE+T,KAAK/T,EAAE6T,KAAK9hB,EAAE8hB,IAAI7T,EAAEkU,OAAO,IAAIlU,EAAEkU,UAAUniB,EAAEmiB,UAAUniB,EAAE6C,MAAMuJ,EAAE5R,OAAOyT,EAAEjO,EAAEoM,EAAEnI,KAAKjE,GAAI,GAAGoM,CAAC,CAAC,gBAAAkc,CAAiB1e,EAAE,GAAG,MAAM5J,EAAEzG,KAAKmpB,MAAMloB,OAAO,IAAI6P,EAAE,OAAOT,EAAE1M,UAAU0M,GAAG,GAAGpN,aAAa,EAAE6N,EAAE9Q,KAAKic,YAAY5L,EAAE5J,EAAEA,GAAGA,EAAEgC,KAAKC,IAAID,KAAKoU,IAAIxM,EAAE5J,EAAE,GAAG,GAAGqK,CAAC,CAAC,eAAAke,CAAgBvoB,GAAG,IAAIqK,EAAE3B,EAAE,MAAMgC,EAAEnR,KAAK+sB,aAAa,QAAQ,SAAS,IAAI3tB,EAAE,EAAEoE,EAAE,EAAEH,EAAEoD,EAAE0hB,GAAG,MAAMtV,KAAKxP,GAAGA,EAAE4rB,YAAY,GAAG5rB,EAAEjE,EAAEkR,WAAWjN,EAAEgf,QAAQlR,IAAI,KAAK,GAAG9N,EAAE+N,SAASM,cAAc,OAAOrO,EAAE8gB,MAAM+K,WAAW,UAAUlvB,KAAKsuB,OAAOld,SAASC,MAAM+c,QAAQ/qB,IAAIuX,EAAEvX,EAAErD,KAAK2V,GAAGiX,GAAG,IAAInmB,EAAE4hB,MAAM,IAAI5hB,EAAE6hB,aAAalpB,EAAEiE,EAAE8gB,MAAMhT,GAAG,GAAG/R,MAAMiE,EAAE8gB,MAAM,UAAUhT,EAAE,SAAS,SAAS,OAAO,CAAC0B,IAAI7S,KAAKsuB,OAAOld,SAASC,MAAM+c,QAAQ/qB,GAAGjE,EAAEiE,EAAE6b,wBAAwB/N,GAAG1I,KAAKC,IAAI,GAAG,QAAQoI,EAAEC,OAAO6S,sBAAsB,IAAI9S,OAAO,EAAEA,EAAEyL,QAAQ,GAAG,IAAIlM,EAAEhN,EAAErD,KAAK+sB,aAAa,cAAc,gBAAgB1c,EAAE,EAAEjR,IAAIA,EAAEiR,EAAE,CAAC,MAAMqE,EAAE1D,iBAAiB3N,GAAG,MAAM,gBAAgBqR,EAAEya,YAAYnvB,KAAK+sB,cAAc3tB,GAAGkR,WAAWoE,EAAE4P,cAAc,EAAEllB,GAAGkR,WAAWoE,EAAE6P,eAAe,IAAInlB,GAAGkR,WAAWoE,EAAE0P,aAAa,EAAEhlB,GAAGkR,WAAWoE,EAAE2P,gBAAgB,IAAI7gB,EAAE8M,WAAWoE,EAAE1U,KAAK+sB,aAAa,cAAc,kBAAkB,EAAEla,EAAE,QAAQ1D,EAAE9L,EAAEiO,qBAAqB,IAAInC,GAAGA,EAAEigB,YAAY/rB,GAAGoD,EAAE0hB,IAAI9kB,EAAEsX,SAAS,CAAC4N,IAAIlY,EAAEjR,EAAE,KAAKopB,IAAInY,EAAE7M,EAAE,KAAK,CAAC,SAAAsd,GAAY,MAAM7E,WAAW5L,EAAE0a,MAAMtkB,EAAEsmB,aAAajc,EAAEqY,MAAMha,GAAGnP,KAAK,IAAImR,EAAE,CAAC0L,IAAI,EAAEnU,IAAI,GAAG,GAAG2H,EAAEc,EAAE,CAAC0L,KAAI,IAAKnU,IAAI,UAAU,GAAGyG,EAAElO,OAAO,CAAC,MAAMoP,EAAElB,EAAE,GAAGsZ,IAAIrpB,EAAE+P,EAAEA,EAAElO,OAAO,GAAGwnB,IAAItX,EAAE1K,GAAGqK,EAAE,CAAC+L,IAAIxM,EAAE3H,IAAItJ,GAAG,CAACyd,KAAK,EAAEzd,EAAEsJ,KAAK,EAAE2H,EAAE,CAAC,MAAM,CAACmK,EAAE1J,EAAEK,EAAE,CAAC0L,IAAI,EAAEnU,IAAI,GAAGwP,EAAEpH,EAAE,CAAC+L,IAAI,EAAEnU,IAAI,GAAGyI,EAAE,CAAC,gBAAAke,GAAmB,IAAI5oB,GAAGsmB,aAAajc,EAAEia,MAAM5b,EAAE8M,WAAW9K,EAAE+c,SAAS9uB,EAAE8tB,YAAY1pB,EAAEypB,WAAW5pB,EAAEomB,KAAK5W,EAAEsW,MAAMzU,EAAEkU,OAAO/T,EAAEmX,QAAQlX,GAAG9U,KAAK+U,EAAE,EAAE1V,EAAE,EAAE6V,EAAE,EAAE5R,EAAE,EAAEwR,EAAExR,GAAG,EAAEwR,EAAEsH,QAAQpc,KAAK8sB,MAAMpY,EAAE7B,KAAKvP,EAAEoR,EAAE7B,GAAG4V,KAAK,GAAGhiB,EAAEqK,EAAE3B,EAAE,QAAQ,OAAO,MAAMA,GAAG2B,IAAIxN,IAAI,GAAG,IAAI,MAAMwN,KAAK+D,EAAE,CAAC,MAAM1F,EAAE2B,EAAEqX,GAAGhZ,GAAG,QAAQ1I,GAAG0I,EAAEgV,MAAMvG,MAAM,GAAGzO,EAAEgV,MAAMrG,KAAK,IAAI3O,EAAEgV,MAAMxG,IAAI,GAAG7M,EAAExH,QAAQyL,EAAE5F,EAAEgV,MAAM1d,GAAG,IAAIpH,EAAE,GAAG,GAAGgR,EAAEhR,EAAE,SAAS8P,EAAEgV,MAAM1d,GAAG,GAAGyO,GAAGpE,EAAEyX,IAAIzX,EAAE0X,IAAIzT,KAAK1V,GAAGyR,EAAEyX,IAAIzX,EAAE0X,GAAG,CAAC,GAAGrX,GAAG+D,GAAG9V,EAAE,CAAC,IAAI+P,EAAE6B,iBAAiB5R,GAAG+R,EAAE,UAAU0B,EAAE/B,EAAE,QAAQ,SAAS4D,EAAEpE,WAAWnB,EAAEgC,GAAGL,EAAE,OAAO,SAASxN,GAAGoR,EAAElR,GAAGkR,EAAElR,GAAG8M,WAAWnB,EAAEgC,EAAE0B,IAAI,IAAI,MAAM/B,KAAK+D,EAAE/D,EAAEqX,KAAK9X,EAAES,EAAE2X,KAAKpY,EAAE7M,IAAI6M,EAAES,EAAE2X,IAAI3X,EAAEyX,IAAIzX,EAAE0X,KAAKnY,EAAE/M,IAAI+M,EAAE/M,GAAG+M,EAAEhN,EAAEG,KAAKsN,EAAEqX,GAAGhE,MAAM1d,GAAG,GAAG4J,EAAEhR,EAAE6V,EAAE,UAAU7E,EAAES,EAAE2X,IAAI3X,EAAE0X,MAAMnY,EAAEhN,EAAEG,IAAI6M,EAAES,EAAE2X,KAAKpY,EAAE/M,EAAEE,IAAI6M,EAAE/M,GAAG+M,EAAE7M,KAAKsN,EAAEqX,GAAGhE,MAAM1d,GAAG,IAAI4J,EAAE6E,EAAE,UAAU,CAAC,IAAIwB,EAAE1T,EAAEO,EAAE,IAAIvD,KAAKsvB,cAAc,GAAG/rB,EAAEtC,OAAO,IAAIyV,EAAEhC,EAAEnR,EAAE,IAAIP,EAAE0R,EAAEnR,EAAE,KAAKmT,GAAG1T,EAAE,CAAC,IAAI8N,EAAE,EAAE,IAAI,MAAM3B,KAAK0F,EAAE1F,EAAEgZ,GAAGnoB,KAAKsvB,aAAa9kB,IAAI2E,EAAE7F,QAAQoN,EAAEkS,OAAO1X,QAAQ/B,GAAG,IAAIA,EAAEgZ,GAAGhE,MAAM1d,GAAG,GAAG4J,EAAES,GAAG4F,EAAE+R,IAAIzlB,EAAEylB,KAAK,UAAU3X,GAAG3B,EAAEoZ,IAAIpZ,EAAEqZ,GAAG,CAAC,CAAC,aAAA+G,CAAclf,GAAG,MAAMie,MAAM7nB,EAAEmiB,OAAO9X,GAAG9Q,KAAK,IAAIyG,IAAI4J,EAAE,OAAO,GAAGA,EAAE8X,IAAI9X,EAAE8X,GAAG8G,WAAW,OAAO,MAAM9f,EAAEkB,EAAE8X,IAAI/W,SAASM,cAAc,OAAOkJ,EAAEzL,EAAEnP,KAAK2V,GAAGiX,IAAIhS,EAAEzL,EAAEkB,EAAEgY,OAAOzN,EAAEzL,EAAEkB,EAAEiY,aAAa,MAAMnX,EAAEd,EAAEwX,KAAK1W,IAAIA,aAAayW,YAAYzY,EAAEyC,YAAYT,GAAGhC,EAAE6b,UAAU3a,EAAEwX,KAAK,IAAI,MAAMzoB,EAAE,GAAG0R,EAAEgB,QAAQ,CAAEzB,EAAE5J,KAAK4J,EAAE8X,IAAI/oB,EAAEsL,KAAKjE,EAAG,GAAG,MAAMjD,EAAE6M,EAAE/G,MAAM,IAAIjG,EAAE,KAAQjE,EAAE6B,SAAQoC,EAAEyN,EAAE1R,EAAE6V,OAAO,CAAE5E,EAAE5J,IAAIgC,KAAKsU,IAAItW,EAAEjD,GAAGiF,KAAKsU,IAAI1M,EAAE7M,GAAGiD,EAAE4J,KAAK,MAAMwC,EAAExP,GAAGA,EAAE8kB,IAAI9kB,EAAE8kB,GAAG8G,WAAW5rB,EAAEiG,MAAM+G,EAAE/G,MAAMjG,EAAE8kB,GAAGqH,YAAYnsB,EAAE8kB,GAAG,KAAK1hB,EAAE8X,aAAapP,EAAE1I,EAAE4X,SAASxL,GAAGA,EAAE,MAAMxC,EAAE8X,GAAGhZ,EAAEnP,KAAKmW,KAAK,cAAc9F,EAAE,CAAC,aAAAof,CAAcpf,EAAE5J,GAAE,GAAI,MAAMqK,EAAE,MAAMT,OAAO,EAAEA,EAAE8X,GAAG,IAAIrX,IAAIA,EAAEme,WAAW,OAAO,MAAM9f,EAAEnP,KAAK2V,GAAGgX,GAAG,GAAG7b,EAAEiB,UAAUsM,SAASlP,KAAKuL,EAAE5J,EAAE3B,GAAGnP,KAAKmW,KAAK,gBAAgB9F,IAAIA,EAAE+X,QAAQ3hB,EAAE,OAAOqK,EAAE0U,gBAAgB,eAAe1U,EAAE0U,gBAAgB,mBAAmB1U,EAAEqT,MAAMrG,KAAK,IAAI9d,KAAKmW,KAAK,cAAc9F,GAAG,MAAMc,EAAE,IAAIue,YAAYhD,GAAG5b,EAAE6e,cAAcxe,GAAGd,EAAE8X,KAAK9X,EAAE8X,GAAGxN,SAAStK,EAAE8X,GAAG,KAAK,CAAC,YAAAyH,CAAavf,EAAE,EAAE5J,EAAEzG,KAAKuV,OAAO,eAAe,IAAIzE,EAAE3B,EAAEgC,EAAE/R,EAAE,IAAIqH,EAAE,OAAM,EAAG,MAAMjD,EAAExD,KAAKypB,MAAMN,MAAM9lB,EAAE2oB,QAAQnZ,GAAG7S,KAAKqQ,EAAE1M,UAAU0M,GAAG,GAAGpN,aAAa,EAAE,MAAMyR,EAAE1U,KAAK+uB,iBAAiB1e,GAAG,IAAIwC,IAAIxP,EAAEqR,IAAIrR,EAAEpC,OAAO,GAAGwH,KAAKsU,MAAM,QAAQ5N,EAAE,QAAQ2B,EAAEzN,EAAEG,UAAU,IAAIsN,OAAO,EAAEA,EAAE8X,OAAO,UAAU,IAAIzZ,OAAO,EAAEA,EAAEoZ,MAAM,GAAGvoB,KAAKktB,aAAa,EAAE,OAAM,EAAG,IAAIrY,EAAExE,EAAE7M,EAAE,GAAG,EAAExD,KAAKic,aAAa,IAAIzY,GAAG6M,IAAIhN,EAAEpC,OAAO,IAAI4T,GAAG,GAAGrR,IAAIH,EAAEpC,OAAO,GAAG,IAAIoP,IAAIwE,EAAE,IAAI,MAAMC,EAAEzR,EAAEqR,GAAG+T,KAAKzoB,KAAK+qB,MAAM,GAAG,GAAG,GAAGvnB,IAAIkR,GAAGjM,KAAKsU,IAAIjI,EAAEjC,EAAEzR,OAAOpB,KAAK8sB,OAAO,EAAE,OAAM,EAAG9sB,KAAK6vB,mBAAmB,MAAM9a,EAAElC,EAAEmK,UAAUpC,EAAE5a,KAAKge,UAAUhe,KAAK2V,GAAG,iBAAiB,MAAMtW,GAAG,QAAQ8R,EAAE9N,EAAEG,UAAU,IAAI2N,OAAO,EAAEA,EAAEyX,OAAO,KAAK,KAAK1T,GAAG,QAAQ9V,EAAEiE,EAAEqR,UAAU,IAAItV,OAAO,EAAEA,EAAEwpB,OAAO,KAAK,KAAK5oB,KAAKsvB,aAAazU,IAAI3F,EAAE5L,OAAOtJ,KAAKuvB,cAAcra,GAAG,IAAI5R,EAAEjE,EAAE8oB,GAAGzR,EAAExB,EAAEiT,GAAGpT,GAAGtO,IAAImmB,IAAInmB,EAAE,WAAWnD,EAAE,MAAM,MAAMN,EAAEhD,KAAK+qB,MAAM,OAAO,OAAOxnB,EAAEvD,KAAK+qB,MAAM,OAAO,OAAO,OAAOznB,IAAItD,KAAKsvB,aAAazU,IAAIxb,EAAEiK,OAAOjK,EAAEqpB,WAAWjiB,EAAEnD,EAAE+P,iBAAiBqZ,EAAE1sB,KAAK8vB,gBAAgBxsB,EAAEyO,UAAU8I,IAAI,KAAKpU,OAAO,MAAMoO,EAAE,EAAEtR,EAAEP,MAAM0T,IAAIxB,EAAEwT,WAAWjiB,EAAEiQ,EAAErD,iBAAiBqZ,EAAE1sB,KAAK8vB,gBAAgBpZ,EAAE3E,UAAU8I,IAAI,KAAKpU,MAAM,QAAQoO,EAAE,EAAE7R,EAAEO,MAAMsP,EAAEuJ,QAAQpc,KAAK8sB,MAAMhY,EAAEjC,EAAEzR,OAAOpB,KAAK8sB,MAAMhY,EAAEjC,EAAEqR,cAAclkB,KAAK+vB,SAASrb,IAAG,CAAE,CAAC,oBAAAsb,GAAuB,MAAM3f,EAAE,IAAI8c,IAAI1mB,EAAE,IAAI0mB,IAAIrc,EAAE9Q,KAAKiwB,iBAAiB3f,WAAWtQ,KAAKuV,OAAO,UAAU,GAAG,KAAK,GAAG,IAAI,MAAMpG,KAAKnP,KAAK4oB,OAAO9X,EAAEtG,IAAI2E,GAAGkB,EAAEwK,IAAI1L,GAAG1I,EAAEoU,IAAI1L,GAAG,IAAI,MAAM1I,KAAKzG,KAAKsvB,aAAajf,EAAEwK,IAAI7a,KAAK4oB,OAAOniB,IAAI,IAAI,MAAMA,KAAK4J,EAAErQ,KAAKuvB,cAAc9oB,GAAGzG,KAAKkwB,cAAczpB,GAAG,IAAI,MAAMqK,KAAKrK,EAAE4J,EAAE7F,IAAIsG,IAAI9Q,KAAKyvB,cAAc3e,GAAG9Q,KAAKmwB,qBAAqBnwB,KAAKqvB,kBAAkB,CAAC,kBAAAc,GAAqB,IAAInwB,KAAKmpB,MAAMnpB,KAAKypB,QAAQzpB,KAAKmpB,MAAMnpB,KAAKypB,MAAMb,OAAO,OAAO,MAAMvY,EAAE,cAAc,IAAI5J,EAAEzG,KAAK2V,GAAGgX,GAAG,GAAGlmB,EAAE,IAAI,MAAMqK,KAAK9Q,KAAK4oB,OAAO,CAAC,MAAMzZ,EAAE2B,EAAEqX,GAAGhZ,IAAIA,EAAEkT,QAAQ/Y,MAAM,GAAGwH,EAAExH,QAAQ6F,EAAE4C,UAAUsM,SAAS,mBAAmBre,KAAKiwB,iBAAiB,GAAGzlB,IAAIsG,GAAG3B,EAAEqW,gBAAgBnV,GAAGlB,EAAEsW,aAAapV,EAAE,QAAQrQ,KAAKmpB,MAAMnpB,KAAKypB,MAAMb,OAAO3S,SAASnF,IAAI3B,EAAE4C,UAAUsM,SAAS5X,KAAKmU,EAAEzL,EAAE1I,GAAGzG,KAAKmW,KAAK,cAAcrF,IAAI3B,EAAEqW,gBAAgBnV,KAAKlB,EAAE4C,UAAUsM,SAAS5X,KAAKiU,EAAEvL,EAAE1I,GAAGzG,KAAKmW,KAAK,gBAAgBrF,IAAI3B,EAAEsW,aAAapV,EAAE,SAAS,CAAC,CAAC,iBAAA+f,GAAoB,MAAMtD,KAAKzc,EAAE0c,aAAatmB,EAAEwV,WAAWnL,EAAEia,MAAM5b,EAAE+d,YAAY/b,EAAE8b,WAAW7tB,GAAGY,KAAKwD,EAAExD,KAAKgsB,QAAQ,IAAIxoB,IAAIsN,EAAE,OAAO,IAAIzN,EAAEG,EAAE4Y,QAAQ/L,GAAGwC,EAAErP,EAAEpC,OAAOiP,GAAGhN,EAAEqR,EAAE,EAAEG,EAAE,GAAG1D,EAAEhC,GAAG1I,GAAGpD,GAAGwR,IAAIH,GAAG,EAAErR,GAAGjE,GAAGiE,EAAEjE,EAAEyV,IAAIH,EAAE,EAAErR,GAAGjE,KAAKiE,EAAEwR,IAAIH,EAAE,EAAErR,GAAGjE,GAAGiE,GAAGjE,EAAEyV,IAAIH,GAAG,EAAErR,GAAGjE,IAAIsV,IAAIlR,EAAE4Y,QAAQ/L,GAAGhN,EAAEG,EAAEpC,OAAOiP,GAAGhN,EAAEwP,EAAE,CAAC,WAAAwd,CAAYhgB,EAAE5J,GAAG,MAAMqK,EAAE9Q,KAAKmR,EAAE,WAAW/R,EAAE,gBAAgB,IAAIoE,GAAE,EAAGH,EAAE,KAAK,MAAMwP,EAAE,KAAKrP,IAAIA,GAAE,EAAGH,IAAIA,EAAEsX,SAAStX,EAAE,MAAMqX,EAAEjU,EAAErH,GAAGqH,EAAE0W,WAAWvC,EAAEnU,EAAE0K,GAAGoO,WAAW,KAAM7E,EAAEjU,EAAE0K,EAAG,EAAE,MAAMnR,KAAKuV,OAAO,mBAAmBlF,EAAE8X,IAAInoB,KAAKmpB,MAAMnpB,KAAKypB,MAAMb,OAAO1X,QAAQb,IAAI,IAAIS,EAAE+N,gBAAgB/N,EAAE0d,qBAAqBxuB,KAAKmW,KAAK,OAAO9F,KAAKuK,EAAEnU,EAAErH,GAAGqH,EAAEyhB,IAAIzhB,EAAE4b,QAAQiO,YAAY7pB,EAAE4b,QAAQkO,SAAS,UAAU9pB,EAAE4b,QAAQkO,eAAe9pB,EAAE4b,QAAQiO,WAAW7pB,EAAE4M,iBAAiB,QAAQ,KAAMR,GAAI,GAAGpM,EAAE4M,iBAAiB,OAAO,KAAMR,GAAI,GAAG0M,WAAW,KAAM,MAAMzO,EAAErK,EAAEwoB,WAAWne,GAAGT,EAAE8X,KAAK1hB,EAAE0W,SAAStK,IAAIrP,IAAIH,EAAE8L,EAAEqL,GAAG1J,EAAEyN,aAAalb,EAAEoD,IAAK,EAAE,IAAI,CAAC,aAAAypB,CAAc7f,GAAG,MAAM5J,EAAE4J,GAAGA,EAAE8X,GAAG,IAAI1hB,EAAE,OAAO,MAAMqK,EAAE,IAAIqc,IAAI,IAAIhe,EAAEzK,MAAMsP,KAAKvN,EAAE6e,iBAAiB,uCAAuC7e,EAAE4b,QAAQkO,SAASphB,EAAEzE,KAAKjE,GAAG0I,EAAEpM,IAAKsN,IAAIA,aAAa6M,iBAAiBpM,EAAE+J,IAAIxK,GAAGA,aAAauX,aAAavX,EAAEgS,QAAQkO,UAAUlgB,EAAE8T,MAAMqM,gBAAgB,QAAQngB,EAAEgS,QAAQkO,mBAAmBlgB,EAAEgS,QAAQkO,QAAS,GAAG,IAAI,MAAM9pB,KAAKqK,EAAE9Q,KAAKqwB,YAAYhgB,EAAE5J,EAAE,CAAC,cAAAqpB,CAAezf,GAAG,IAAI5J,EAAE,MAAMqK,EAAET,EAAEjP,OAAO+N,EAAE2B,EAAEnN,SAASmN,EAAEuR,QAAQ/Y,OAAO,GAAG,KAAK,GAAG,EAAE6H,EAAEnR,KAAK4oB,OAAOzZ,GAAG/P,EAAEiR,EAAEogB,cAAc,IAAI3f,IAAIK,IAAI/R,EAAE,OAAO,MAAMoE,IAAIxD,KAAKsvB,aAAa9kB,IAAI2E,IAAIgC,EAAEuX,WAAWllB,GAAGpE,EAAE2W,UAAU,EAAEvS,EAAEvC,OAAO,KAAK,KAAKuC,KAAKxD,KAAKsvB,aAAaoB,OAAOvhB,GAAGnP,KAAKsvB,aAAavlB,MAAM/J,KAAK6vB,mBAAmB1gB,IAAInP,KAAKypB,OAAO,QAAQhjB,EAAEzG,KAAKgsB,eAAe,IAAIvlB,OAAO,EAAEA,EAAEuW,YAAYhd,KAAKmW,KAAK,SAAS,CAAC,OAAAsY,CAAQpe,EAAE5J,EAAE,EAAEqK,EAAE,EAAE3B,EAAE,EAAEgC,EAAE,GAAG,GAAGnR,KAAKuV,OAAO,YAAY,YAAYvV,KAAK2wB,sBAAsB,MAAM5F,MAAM3rB,EAAE2tB,aAAavpB,EAAEspB,KAAKzpB,EAAE8lB,MAAMtW,GAAG7S,KAAK0U,EAAE7B,EAAE5R,OAAO4T,EAAEpM,KAAKsU,IAAItU,KAAK0T,MAAMrL,EAAErK,IAAIgC,KAAK4T,GAAG,MAAM,IAAIvH,EAAE,EAAE,GAAGA,EAAED,EAAE,IAAIA,EAAE,IAAIrR,EAAE,EAAEsN,EAAEtN,EAAEiD,EAAE,GAAGiO,EAAE,OAAO,IAAIK,EAAE/U,KAAKypB,KAAKpqB,EAAED,GAAGoE,EAAE,GAAG,EAAE,MAAM0R,EAAE7E,EAAE+L,QAAQ/Y,GAAGhE,EAAE,IAAIuxB,UAAUttB,GAAGtD,KAAK6wB,oBAAoB3b,GAAGzM,KAAKsU,IAAIjI,GAAG,GAAGjC,EAAEkC,GAAGwT,IAAInX,SAAS6V,gBAAgB,UAAUjnB,KAAK+sB,aAAa,QAAQ,WAAW,IAAIhY,EAAEzR,GAAGyR,EAAE3V,GAAGoE,EAAEsR,EAAE,EAAEC,EAAE,EAAEA,EAAE,EAAED,EAAE,EAAEC,EAAE,EAAEA,EAAE,GAAGA,EAAE,IAAI5F,GAAG,IAAIgC,EAAE4D,EAAEzR,EAAEtD,KAAKksB,QAAQnX,EAAE,CAAC2T,YAAW,EAAGzP,SAAS5I,EAAEkF,OAAO,kBAAkB,CAAC,OAAAsK,CAAQxP,GAAG,MAAM5J,EAAE4J,EAAEjP,OAAO0P,EAAErK,GAAGgU,EAAEhU,GAAGA,EAAE4b,QAAQ,KAAK,IAAIlT,EAAEgC,EAAEL,SAAS,IAAIA,EAAEggB,cAAc3f,EAAE,UAAUhC,EAAE2B,EAAEggB,mBAAmB,IAAIhgB,EAAEigB,aAAa5f,EAAE,iBAAiB,IAAIL,EAAEkgB,eAAe7f,EAAE,cAAcA,GAAGd,EAAE4R,iBAAiB5R,EAAE6R,kBAAkBzb,IAAIA,EAAEub,aAAa,aAAahiB,KAAKmR,GAAGhC,IAAInP,KAAKmW,KAAK,QAAQ9F,EAAE,CAAC,SAAAue,CAAUve,GAAG,MAAM5J,EAAE4J,EAAEsR,QAAQ,EAAE3hB,KAAKksB,QAAQlsB,KAAKisB,gBAAgBxlB,GAAG,CAACwS,SAAS,GAAG,CAAC,QAAA8W,CAAS1f,EAAE5J,EAAE,GAAG,MAAMqK,EAAE9Q,KAAKypB,KAAKzpB,KAAKssB,SAASxb,EAAE9Q,KAAKypB,KAAKpZ,EAAErQ,KAAKuV,OAAO,mBAAmBvV,KAAKwuB,oBAAoBne,IAAIS,IAAI9Q,KAAKmwB,qBAAqBnwB,KAAKmW,KAAK,SAAS9F,EAAES,EAAErK,GAAG,CAAC,SAAAqiB,GAAY,IAAIzY,EAAErQ,KAAKitB,WAAWxmB,EAAEzG,KAAKktB,YAAYltB,KAAK6e,gBAAgB7e,KAAKitB,aAAa5c,GAAGrQ,KAAKktB,cAAczmB,GAAGzG,KAAKksB,QAAQlsB,KAAKypB,KAAK,CAACxQ,SAAS,EAAEyP,YAAW,GAAI,CAAC,QAAA2F,GAAW,IAAIhe,EAAE,QAAQA,EAAErQ,KAAKkuB,gBAAgB,IAAI7d,GAAGA,EAAE4gB,OAAO,EAAE,EAAE,CAAC,QAAA3R,GAAWtf,KAAKuV,OAAO,gBAAgBvV,KAAKwtB,gBAAgB,CAAC,iBAAAkB,CAAkBre,GAAGrQ,KAAKkxB,KAAK7gB,EAAE+L,QAAQpc,KAAK8sB,QAAQ9sB,KAAKowB,oBAAoBpwB,KAAKgwB,wBAAwBhwB,KAAKkxB,GAAG7gB,EAAE+L,QAAQ3V,CAAC,CAAC,cAAAkoB,GAAiB3uB,KAAKsvB,aAAavlB,MAAM/J,KAAKmW,KAAK,SAAS,CAAC,MAAAgb,CAAO9gB,EAAE,KAAK5J,EAAE,MAAMzG,KAAKmnB,UAAUnnB,KAAK4e,MAAM8I,EAAE/Q,KAAK3W,KAAKssB,SAAS,KAAKtsB,KAAKstB,YAAYjd,GAAGrQ,KAAKstB,YAAYttB,KAAKutB,YAAY9mB,GAAGzG,KAAKutB,YAAYvtB,KAAKwtB,gBAAgB,CAAC,OAAAtB,CAAQ7b,EAAE,GAAG4I,SAASxS,EAAEzG,KAAKuV,OAAO,YAAYmT,WAAW5X,EAAE9Q,KAAKuV,OAAO,eAAe,CAAC,GAAG,GAAGvV,KAAK4e,QAAQ8I,EAAE1Q,QAAQ,OAAO3G,EAAE1M,UAAU0M,GAAG,GAAGpN,aAAa,EAAE,MAAMkM,EAAEnP,KAAK+uB,iBAAiB1e,IAAIyc,KAAK3b,EAAE4b,aAAa3tB,EAAE2rB,MAAMvnB,EAAE2lB,MAAM9lB,EAAE2oB,QAAQnZ,GAAG7S,KAAK0U,EAAErR,EAAEpC,OAAO4T,EAAErR,GAAGpE,EAAE,GAAG,EAAE,IAAIyT,IAAI6B,EAAE,OAAO,GAAG1U,KAAKypB,OAAOta,EAAE,CAAC,MAAM1I,EAAE,IAAI6N,MAAM,eAAe,CAACC,SAAQ,EAAGC,YAAW,IAAK,GAAGxU,KAAKmW,KAAK,eAAe1P,EAAE4J,GAAG5J,EAAEsb,iBAAiB,MAAM,CAAC,GAAG/hB,KAAK4vB,aAAavf,EAAES,GAAG,OAAO,IAAIgE,EAAEzR,EAAE8L,GAAGsZ,IAAI,GAAGzoB,KAAKic,WAAW,CAAC,MAAMxV,EAAEzG,KAAKitB,WAAWnc,EAAE+B,EAAEzR,OAAO+P,GAAG0D,EAAK,IAAIH,EAAEI,GAAGrO,EAAEgC,KAAK2oB,MAAM9gB,WAAWD,EAAE,IAAI,GAAQyE,EAAE,CAACA,EAAEA,EAAErO,EAAEqO,EAAErO,GAAGwO,OAAO,SAAU5E,EAAE5J,GAAG,OAAOgC,KAAKsU,IAAItW,EAAEqK,GAAGrI,KAAKsU,IAAI1M,EAAES,GAAGrK,EAAE4J,CAAE,EAAG,CAACyE,GAAGD,EAAEpM,KAAKsU,IAAIlK,EAAEzR,OAAO+P,GAAG2D,GAAG,IAAIjC,EAAE6S,MAAM,CAAClL,EAAEpb,EAAE0V,EAAE,EAAEoD,EAAE9Y,EAAE,EAAE0V,EAAEmE,SAASxS,IAAIzG,KAAK+vB,SAAS5gB,GAAG,CAAC,cAAAkiB,CAAehhB,GAAG,GAAGrQ,KAAKgsB,QAAQ,CAAC,MAAM4E,UAAUnqB,GAAGzG,KAAK6wB,sBAAsB7wB,KAAKksB,QAAQzlB,EAAE4J,EAAE,CAAC,CAAC,SAAA+c,GAAYptB,KAAKksB,QAAQlsB,KAAKypB,KAAK,EAAE,CAAC,SAAA4D,GAAYrtB,KAAKksB,QAAQlsB,KAAKypB,KAAK,EAAE,CAAC,gBAAAoG,GAAmB7vB,KAAKsvB,aAAa/lB,QAAQmR,EAAE1a,KAAKge,UAAUhe,KAAK2V,GAAG,iBAAiB,MAAMtF,EAAE,CAAC,UAAU,UAAU,YAAY,aAAa,IAAI,MAAM5J,KAAKzG,KAAK4oB,OAAO,CAAC,MAAM9X,EAAErK,EAAE0hB,GAAG,GAAGrX,EAAE,CAACA,EAAEsD,oBAAoBsY,EAAE1sB,KAAK8vB,gBAAgBhf,EAAEiB,UAAU4I,UAAUtK,GAAG,MAAMlB,EAAE1I,EAAEiiB,WAAWvZ,GAAG2B,EAAEiB,UAAU4I,OAAO,KAAKxL,OAAO,KAAKA,MAAM,CAAC,CAACnP,KAAKgwB,sBAAsB,CAAC,QAAAsB,CAASjhB,EAAE5J,GAAG,IAAIqK,EAAE3B,EAAEgC,EAAE/R,EAAE,MAAMoE,EAAExD,KAAKgsB,QAAQ3oB,GAAG,QAAQyN,EAAE9Q,KAAKmpB,MAAMnpB,KAAKypB,aAAa,IAAI3Y,OAAO,EAAEA,EAAE2X,MAAM,EAAE5V,GAAG,QAAQ1D,EAAEnP,KAAKmpB,MAAMnpB,KAAKypB,aAAa,IAAIta,OAAO,EAAEA,EAAEoZ,MAAM,EAAE7T,EAAE1U,KAAKitB,WAAWjtB,KAAKktB,YAAY,IAAIrY,EAAEnQ,MAAM+H,QAAQhG,GAAGA,EAAE,CAACA,GAAG,MAAMqO,EAAE,GAAG,IAAI,MAAMzE,KAAKwE,EAAEC,EAAEpK,KAAKid,EAAEtX,IAAIrQ,KAAK4oB,OAAO1gB,OAAOmI,EAAE,KAAKyE,GAAG,IAAI,IAAIzE,EAAE,EAAEA,EAAErQ,KAAK4oB,OAAO3nB,OAAOoP,IAAIrQ,KAAK4oB,OAAOvY,GAAG/G,MAAM+G,EAAE,IAAI,MAAMA,KAAKyE,EAAE9U,KAAKmW,KAAK,kBAAkB9F,EAAEA,EAAE/G,OAAO,GAAGtJ,KAAKypB,MAAMpZ,IAAIrQ,KAAKypB,MAAM3U,EAAE7T,QAAQjB,KAAK6e,gBAAgBrb,EAAE,CAAC,MAAMiD,GAAG,QAAQ0K,EAAEnR,KAAKmpB,MAAMnpB,KAAKypB,aAAa,IAAItY,OAAO,EAAEA,EAAEsX,MAAM,EAAE3X,GAAG,QAAQ1R,EAAEY,KAAKmpB,MAAMnpB,KAAKypB,aAAa,IAAIrqB,OAAO,EAAEA,EAAEmpB,MAAM,EAAEpZ,EAAEnP,KAAKmpB,MAAMloB,QAAQ,EAAE4T,EAAE7U,KAAK+qB,MAAMlY,EAAE/B,EAAEA,EAAE+B,EAAEiC,EAAE9U,KAAK+qB,MAAM1nB,EAAEoD,EAAEA,EAAEpD,EAAEqR,GAAG,IAAIvF,GAAGkB,GAAGrQ,KAAKypB,OAAOjmB,EAAE4Y,QAAQpc,KAAK8sB,OAAOjY,EAAErR,EAAEpC,OAAOpB,KAAK8sB,OAAOjY,GAAGrR,EAAEkiB,MAAM,CAAC,CAAC1lB,KAAK+sB,aAAa,IAAI,MAAM,EAAEtmB,KAAKqO,GAAGzE,GAAGrQ,KAAKypB,OAAOjmB,EAAEpC,OAAOpB,KAAK8sB,OAAOhY,EAAEtR,EAAE4Y,QAAQpc,KAAK8sB,OAAOhY,EAAEtR,EAAE0gB,cAAc,CAAC,IAAI,MAAM7T,KAAKyE,EAAE9U,KAAKmW,KAAK,YAAY9F,EAAEA,EAAE/G,MAAM,CAAC,YAAAioB,CAAalhB,GAAGrQ,KAAKsxB,SAAS,EAAEjhB,EAAE,CAAC,WAAAmhB,CAAYnhB,GAAGrQ,KAAKsxB,SAAStxB,KAAK4oB,OAAO3nB,OAAOoP,EAAE,CAAC,WAAAohB,CAAYphB,GAAG,MAAM5J,EAAEzG,KAAK4oB,OAAO3nB,OAAOoP,GAAGA,EAAE5J,EAAEA,GAAGA,EAAE,MAAMqK,EAAE9Q,KAAK4oB,OAAOvY,GAAG,GAAGS,EAAE,CAAC9Q,KAAKyvB,cAAc3e,GAAE,GAAI9Q,KAAK4oB,OAAO1gB,OAAOmI,EAAE,GAAG,IAAI,IAAIA,EAAE,EAAEA,EAAErQ,KAAK4oB,OAAO3nB,OAAOoP,IAAIrQ,KAAK4oB,OAAOvY,GAAG/G,MAAM+G,EAAErQ,KAAK6e,gBAAgB7e,KAAKksB,QAAQlsB,KAAKypB,KAAK,CAACxQ,SAAS,EAAEyP,YAAW,IAAK1oB,KAAKmW,KAAK,eAAerF,EAAE,CAAC,CAAC,aAAA+N,GAAgB,MAAMmN,QAAQvlB,EAAEynB,SAASpd,EAAEwd,MAAMnf,EAAEyZ,OAAOzX,EAAE4b,aAAa3tB,EAAE6c,WAAWzY,GAAGxD,KAAK,IAAImP,EAAE,OAAO,MAAM9L,EAAEjE,EAAE,QAAQ,SAASyT,EAAEzT,EAAE,cAAc,eAAe,GAAG0R,EAAE,CAAC,IAAIrK,EAAEgC,KAAKC,IAAIoI,EAAE+B,GAAGxC,EAAES,EAAEoO,wBAAwB7b,GAAG,MAAM8L,EAAE6B,iBAAiBF,GAAGK,EAAE,UAAU3N,EAAEpE,EAAE,QAAQ,SAASqH,GAAG6J,WAAWnB,EAAEgC,GAAG/R,EAAE,OAAO,SAASkR,WAAWnB,EAAEgC,EAAE3N,IAAIxD,KAAKktB,YAAYzmB,CAAC,CAAC,IAAIiO,EAAEG,EAAE,EAAE,IAAI,MAAMpO,EAAEqK,KAAKK,EAAE9H,UAAU,CAAC,IAAI8F,EAAE,EAAE/P,EAAE,GAAG0R,EAAEqX,IAAIzT,GAAGvF,EAAEuF,EAAE6T,IAAInpB,EAAEsV,EAAE8T,QAAQD,IAAIpZ,EAAEqZ,IAAIppB,GAAGY,KAAKgvB,gBAAgBle,IAAI4D,EAAE5D,GAAG3B,EAAEkB,EAAElB,EAAE,KAAK/P,EAAEiR,EAAEjR,EAAE,KAAK0R,EAAEyX,IAAIpZ,EAAE2B,EAAE0X,IAAIppB,EAAE0R,EAAE2X,IAAI5T,EAAEA,GAAG1F,GAAG3L,GAAGiD,EAAE0K,EAAElQ,OAAO,KAAK4T,GAAGzV,EAAE,CAACyV,EAAExE,EAAEwE,EAAE,KAAK7U,KAAKitB,WAAWpY,EAAEpO,IAAIA,EAAE+U,YAAYnY,GAAGwR,EAAEpO,EAAE+U,YAAYpc,EAAE,YAAY,cAAcyV,GAAG7U,KAAKmpB,MAAMnpB,KAAK6uB,cAAc7uB,KAAKmpB,MAAMnpB,KAAK8uB,eAAe9uB,KAAK4e,QAAQ8I,EAAE/Q,MAAM3W,KAAKuuB,iBAAiBvuB,KAAKypB,KAAKhhB,KAAKC,IAAI,EAAED,KAAKoU,IAAI7c,KAAKypB,KAAKzpB,KAAKmpB,MAAMloB,OAAO,IAAIjB,KAAKgwB,uBAAuBhwB,KAAKmW,KAAK,UAAU,CAAC,WAAAub,CAAYjrB,EAAEqK,GAAE,EAAG3B,GAAE,QAAS,IAAI1I,IAAIA,EAAEzG,KAAKypB,MAAM,MAAMtY,EAAEnR,KAAKZ,EAAE+R,EAAE6a,QAAQxoB,EAAE2N,EAAE8b,WAAW5pB,EAAE8N,EAAEgY,MAAM1iB,IAAI,EAAE,IAAIpD,IAAIjE,EAAE,OAAOqH,EAAEzG,KAAKypB,MAAM,EAAE,EAAE,IAAI5W,GAAG,EAAEzT,EAAEgd,QAAQ3V,EAAEiO,EAAErE,GAAGwC,EAAExP,EAAEolB,MAAM,EAAEplB,EAAEklB,KAAK,KAAK1T,EAAEH,EAAEI,EAAEJ,EAAE1U,KAAKic,aAAY,IAAK9M,IAAI0F,EAAExE,GAAGwC,EAAExP,EAAEolB,IAAIjlB,IAAI,EAAEH,EAAEklB,KAAK,KAAKzT,EAAEzE,GAAGwC,EAAExP,EAAEolB,IAAIjlB,IAAI,EAAEH,EAAEklB,KAAK,MAAM,IAAIxT,EAAE,CAACL,EAAEG,EAAEC,GAAGG,OAAO,SAAU5E,EAAE5J,GAAG,OAAOgC,KAAKsU,IAAItW,GAAGgC,KAAKsU,IAAI1M,GAAG5J,EAAE4J,CAAE,GAAG,OAAOS,EAAEiE,EAAEA,EAAE,EAAE,EAAEA,GAAG,GAAG,EAAEA,CAAC,CAAC,iBAAAyZ,GAAoB,MAAM/E,KAAKpZ,EAAE8Y,MAAM1iB,EAAEynB,SAASpd,EAAEic,aAAa5d,GAAGnP,KAAK,IAAI8Q,IAAIrK,EAAE4J,GAAG,OAAO,IAAIc,EAAE,EAAEhC,GAAGnP,KAAKsuB,QAAQtuB,KAAKsuB,MAAMnK,MAAM9L,OAAO,OAAO5R,EAAE4J,GAAGuY,OAAO9W,QAASzB,IAAIA,EAAE8X,KAAKhX,EAAE1I,KAAKC,IAAIyI,EAAEd,EAAE8X,GAAGrD,cAAe,IAAIhU,EAAEqT,MAAM9L,OAAOlH,EAAE,GAAGA,MAAM,EAAE,CAAC,eAAA8a,CAAgB5b,GAAG,IAAI,MAAM5J,KAAKzG,KAAKmpB,MAAM,IAAI,MAAMrY,KAAKrK,EAAEmiB,OAAO,GAAG9X,EAAExH,QAAQ+G,EAAE,OAAO5J,EAAE6C,MAAM,OAAO,CAAC,CAAC,gBAAA2mB,CAAiB5f,EAAE,GAAG,IAAI5J,EAAE,MAAMqK,EAAE,IAAIqc,IAAI,IAAInB,QAAQ7c,EAAE8d,WAAW9b,EAAE+b,YAAY9tB,EAAE+pB,MAAM3lB,EAAEimB,KAAKpmB,GAAGrD,KAAK,GAAGZ,EAAE,CAAC+R,EAAEA,GAAG,QAAQ1K,EAAEzG,KAAK4oB,OAAO5oB,KAAK4oB,OAAO3nB,OAAO,UAAU,IAAIwF,OAAO,EAAEA,EAAE+hB,MAAM,EAAE,IAAI3V,EAAE,EAAEA,EAAE1D,GAAGA,EAAEyP,QAAQlI,EAAEC,MAAMxH,EAAEyP,QAAQlI,EAAEM,SAAS,EAAE7H,EAAEiN,QAAQpc,KAAK8sB,MAAMtpB,EAAEH,IAAIG,EAAEH,GAAGolB,KAAK,EAAEzoB,KAAKic,aAAapJ,GAAGpK,KAAK2oB,MAAMve,EAAE1B,GAAGA,GAAGnR,KAAK+qB,OAAO/qB,KAAK+sB,eAAela,IAAI,GAAG,MAAM6B,EAAE7B,EAAEzT,EAAEiR,EAAEwE,EAAEhC,EAAEzT,GAAGiR,EAAE,GAAGyE,EAAE9U,KAAKic,WAAW,EAAE,EAAE,EAAE,GAAG,CAAC,GAAG,IAAI,MAAM5L,KAAKrQ,KAAK4oB,OAAO,IAAI,MAAMniB,KAAKqO,EAAE,CAAC,MAAM3F,EAAEkB,EAAEoY,IAAIhiB,EAAE0K,EAAE/R,EAAE+P,EAAEkB,EAAEkY,IAAIlY,EAAEmY,IAAIrZ,EAAE0F,GAAGzV,EAAEsV,GAAG5D,EAAE+J,IAAIxK,EAAE,CAAC,CAAC,OAAOS,CAAC,CAAC,mBAAA+f,CAAoBxgB,GAAG,MAAM6c,YAAYzmB,EAAEwmB,WAAWnc,EAAE8X,OAAOzZ,EAAEga,MAAMhY,EAAE6a,QAAQ5sB,GAAGY,KAAKwD,EAAE2N,EAAElQ,OAAOoC,EAAE8L,EAAElO,OAAO4R,EAAE1D,EAAE,GAAGuF,EAAEvF,EAAE9L,EAAE,GAAGwR,EAAE7U,KAAKuV,OAAO,UAAU,IAAIT,EAAE,EAAEC,EAAE,EAAE1V,EAAE,EAAE6V,OAAO,IAAI7E,GAAG,IAAI,MAAMjR,OAAO,EAAEA,EAAEgC,OAAOpB,KAAK8sB,QAAQ,GAAGzc,EAAEwE,IAAIK,GAAG,GAAGzO,GAAGzG,KAAKic,YAAY/G,EAAErC,EAAE4V,IAAI,GAAG/T,EAAE8T,MAAMtT,GAAGpE,EAAEzR,GAAG,GAAG6V,EAAER,EAAE+T,IAAI/T,EAAE6T,IAAI,GAAG7T,EAAE8T,MAAMtT,GAAGpE,EAAEzR,EAAE,IAAI6V,EAAEzM,KAAKC,IAAImK,EAAE4V,KAAK,EAAEhgB,KAAKoU,IAAI3H,EAAER,EAAE+T,MAAM,IAAInlB,EAAEoR,EAAEgC,EAAEvH,EAAEtK,KAAMwL,IAAI,MAAM5J,EAAE4J,EAAEoY,IAAI,GAAGnlB,EAAEklB,IAAI1X,EAAET,EAAEoY,IAAIpY,EAAEkY,IAAI,GAAGlY,EAAEmY,IAAI,OAAOllB,EAAE+M,EAAE6E,GAAGzO,GAAGyO,EAAEpE,CAAE,GAAG,OAAO4F,IAAIA,EAAEhC,GAAGK,EAAE/U,KAAKisB,gBAAgBvV,EAAEpN,OAAOwL,EAAEC,EAAE1V,EAAEmE,EAAE,CAACimB,KAAK3U,EAAE8b,UAAU7b,EAAE,CAAC,mBAAA4b,GAAsB,MAAMC,UAAUvgB,GAAGrQ,KAAK6wB,sBAAsB7wB,KAAK+vB,SAAS1f,EAAE,CAAC,OAAA8W,GAAU,GAAG,CAACO,EAAE1Q,SAASf,SAASjW,KAAK4e,OAAO,OAAO5e,KAAK4e,MAAM8I,EAAE1Q,QAAQ,MAAMgH,UAAU3N,EAAE6d,SAASznB,EAAE6nB,MAAMxd,EAAE8X,OAAOzZ,EAAE6c,QAAQ7a,GAAGnR,KAAKZ,EAAEY,KAAKuV,OAAO,WAAWlF,EAAE+D,oBAAoB,QAAQpU,KAAK6f,QAAQ,CAACjN,SAAQ,EAAGkN,SAAQ,IAAKzP,EAAE+D,oBAAoB,UAAUpU,KAAK4uB,WAAW7d,OAAOqD,oBAAoB,SAASpU,KAAKsf,UAAUnO,IAAIA,EAAEgW,UAAUnnB,KAAKgsB,QAAQ,MAAM7c,GAAGA,EAAE2C,QAASzB,IAAIrQ,KAAKyvB,cAAcpf,EAAG,GAAGrQ,KAAKyW,gBAAgBhQ,IAAIA,EAAE2N,oBAAoB,SAASpU,KAAKquB,UAAU5nB,EAAEkK,cAAcG,GAAGA,EAAEH,cAAclK,EAAEkrB,eAAe7gB,EAAEyW,aAAa,IAAI,MAAM9gB,EAAEqK,KAAKxR,OAAO+J,QAAQjK,GAAG,cAAcqH,GAAGqK,GAAGT,EAAE0B,UAAU4I,OAAO7J,GAAG9Q,KAAKsuB,MAAM,KAAKtuB,KAAKkuB,SAAS,KAAKluB,KAAKypB,KAAK,EAAEzpB,KAAK4oB,OAAO,GAAG,MAAMplB,EAAExD,KAAKgW,OAAOxU,IAAI,SAASxB,KAAKgW,OAAO,IAAIlN,IAAItF,GAAGxD,KAAKgW,OAAOvM,IAAI,QAAQjG,EAAE,EAAElE,OAAO4B,eAAe2rB,EAAE,UAAU,CAACtrB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAMma,IAAIhc,OAAO4B,eAAe2rB,EAAE,WAAW,CAACtrB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAj47B,CAAC+sB,SAAS,KAAKI,MAAM,KAAKsD,SAAQ,EAAGhJ,OAAO,GAAGkE,KAAK,IAAIpE,WAAW,OAAOmJ,QAAQ,EAAEC,cAAc,OAAOrG,YAAY,EAAExS,SAAS,IAAI8Y,QAAQ,CAAC5Y,cAAc,KAAK6Y,QAAO,EAAGtY,UAAS,EAAGuY,MAAK,EAAGC,UAAS,EAAGC,gBAAe,EAAGC,UAAU,MAAMxc,QAAQ,CAACoI,UAAU,aAAakQ,SAAS,uBAAuBI,MAAM,oBAAoBH,MAAM,oBAAoBH,MAAM,SAASjD,MAAM,SAASgC,aAAa,gBAAgBkB,WAAW,cAAcqB,aAAa,gBAAgB+C,WAAW,eAAe/X,KAAK,CAACgY,KAAK,aAAaC,KAAK,iBAAiBC,KAAK,sBAA626BlzB,OAAO4B,eAAe2rB,EAAE,UAAU,CAACtrB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAMorB,IAAI,MAAMkG,GAAG,SAASpiB,GAAG,IAAIoK,EAAEpK,GAAG,OAAO,EAAE,MAAM5J,EAAEsK,OAAO2hB,QAAQ5hB,EAAEC,OAAO2M,YAAYvO,EAAE1I,EAAEqK,EAAEK,EAAEd,EAAE6O,wBAAwB9f,EAAE+R,EAAE+G,EAAEzR,EAAEjD,EAAE2N,EAAEkH,OAAOhV,EAAEjE,EAAEoE,EAAE,GAAGiD,EAAEpD,GAAG8L,EAAE/P,EAAE,OAAO,EAAE,GAAGqH,EAAErH,GAAG+P,EAAE9L,EAAE,OAAO,IAAI,GAAGjE,EAAEqH,GAAGpD,EAAE8L,EAAE,OAAO,IAAI,IAAI0D,EAAErP,EAAEpE,EAAEqH,IAAIoM,GAAGpM,EAAErH,GAAGiE,EAAE8L,IAAI0D,GAAGxP,EAAE8L,GAAG,MAAMuF,EAAE7B,EAAE/B,EAAE,IAAI,OAAOrI,KAAK8H,MAAMmE,EAAE,EAAEie,KAAK,oBAAoB5hB,SAASA,OAAOK,WAAWL,OAAOK,SAASM,eAAe,IAAI5S,GAAG,MAAM8zB,GAAG,CAAC,UAAU,aAAa,gEAAgE,4CAA4C,8CAA8C,uEAAuE,SAAS,SAAS,QAAQ,QAAQ,QAAQ,oBAAoB,sEAAsEnvB,KAAK,KAAKovB,GAAGxiB,IAAI,GAAGA,GAAGsiB,GAAG,MAAM,IAAI7zB,IAAIsS,SAASM,cAAc,OAAOohB,MAAM,CAAC,iBAAIC,GAAgB,OAAOj0B,IAAG,GAAG,CAAE,IAAI,IAAI,GAAGA,GAAGuR,EAAEyiB,MAAM,CAACC,eAAc,QAAS,CAAC,MAAMtsB,EAAEsK,OAAO2hB,SAASthB,SAASC,KAAK2hB,UAAUliB,EAAEC,OAAOkiB,SAAS7hB,SAASC,KAAK6hB,WAAW7iB,EAAEyiB,QAAQ1hB,SAASC,KAAK8hB,SAAS,CAACxV,IAAIlX,EAAEqX,KAAKhN,EAAEsiB,SAAS,QAAQ,CAAC,CAAC,MAAM/iB,GAAG,CAAC,GAAGgjB,GAAG,KAAK,MAAMhjB,EAAEe,SAAS,IAAI3K,EAAEqK,EAAE,GAAG3B,EAAE,GAAGgC,EAAE,GAAG,OAAOd,EAAEijB,mBAAmBxiB,EAAE,oBAAoB3B,EAAE,iBAAiBgC,EAAE,qBAAqBd,EAAEkjB,0BAA0BziB,EAAE,0BAA0B3B,EAAE,uBAAuBgC,EAAE,2BAA2BL,IAAIrK,EAAE,CAAC+sB,QAAQ,SAAS/sB,EAAE4J,EAAE4W,iBAAiB,MAAM,4BAA4BnW,EAAErK,EAAEqK,GAAGJ,QAAQ+iB,sBAAsBhtB,EAAEqK,IAAI,EAAE4iB,KAAK,WAAW,OAAOrjB,EAAEc,IAAId,EAAElB,IAAI,EAAEwkB,aAAa,WAAW,OAAOtjB,EAAEc,EAAE,IAAI1K,GAAGmtB,GAAG,CAACC,UAAS,EAAGC,WAAU,EAAGC,cAAc,QAAQC,SAAS,CAACpe,QAAQ,CAACoI,UAAU,qBAAqBkQ,SAAS,qBAAqBI,MAAM,kBAAkBH,MAAM,oBAAoB8F,YAAY,OAAOC,eAAc,EAAGC,eAAc,EAAGC,QAAQ,IAAIrjB,OAAO6K,WAAW,2CAA2CC,QAAQwY,aAAa,aAAaC,iBAAgB,EAAGC,YAAY,QAAQC,eAAe,OAAOC,aAAY,EAAGC,WAAW,CAACC,WAAU,GAAIC,UAAS,EAAGC,UAAU,gBAAgBC,UAAU,YAAYC,eAAc,EAAGC,KAAK,KAAKC,SAAS,CAACC,OAAO,QAAQC,OAAO,QAAQC,UAAU,QAAQC,OAAO,OAAOC,SAAS,OAAOC,QAAQ,OAAOC,UAAU,OAAOC,WAAW,OAAOC,UAAU,QAAQpb,KAAKhb,OAAO0V,OAAO1V,OAAO0V,OAAO,CAAC,EAAEzR,GAAG,CAACoyB,MAAM,QAAQrD,KAAK,OAAOC,KAAK,WAAWqD,MAAM,oDAAoDC,MAAM,+CAA+CC,YAAY,kBAAkBC,kBAAkB,yBAAyBC,eAAe,iCAAiCC,eAAe,iCAAiCC,aAAa,qBAAqBC,YAAY,oBAAoBC,cAAc,oBAAoBC,iBAAiB,mBAAmBC,kBAAkB,0BAA0BC,SAAS,aAAaC,SAAS,KAAKC,gBAAe,EAAGC,UAAU,aAAaC,WAAW,EAAEC,IAAI,CAAC3C,YAAY,wMAAwM4C,KAAK,sPAAsPC,WAAU,EAAGxd,MAAM,QAAQ,IAAIyd,GAAGC,IAAI,SAAS3mB,GAAGA,EAAEA,EAAEsG,KAAK,GAAG,OAAOtG,EAAEA,EAAEwG,MAAM,GAAG,QAAQxG,EAAEA,EAAE4mB,QAAQ,GAAG,UAAU5mB,EAAEA,EAAE6mB,cAAc,GAAG,gBAAgB7mB,EAAEA,EAAE2G,QAAQ,GAAG,SAAS,CAA1I,CAA4I+f,KAAKA,GAAG,CAAC,IAAI,SAAS1mB,GAAGA,EAAEA,EAAE8mB,QAAQ,GAAG,UAAU9mB,EAAEA,EAAE+mB,QAAQ,GAAG,UAAU/mB,EAAEA,EAAEwG,MAAM,GAAG,QAAQxG,EAAEA,EAAE4mB,QAAQ,GAAG,SAAS,CAA3G,CAA6GD,KAAKA,GAAG,CAAC,IAAI,IAAIK,GAAG,GAAGC,IAAG,EAAGC,IAAG,EAAGC,GAAG,KAAK,MAAMC,GAAG,KAAK,IAAIpnB,EAAE,GAAG5J,EAAE,GAAG,MAAMqK,EAAE4mB,GAAGC,cAAc,GAAG7mB,EAAE,CAAC,MAAM3B,EAAE2B,EAAE8mB,SAASzmB,EAAEL,EAAE+mB,WAAW,GAAG1oB,GAAGgC,EAAE,CAAC,IAAI/R,EAAE+R,EAAE2mB,WAAW,EAAEt0B,EAAE2N,EAAE4mB,gBAAgB,EAAEtxB,EAAErH,GAAI0R,EAAEyE,OAAO,SAAS,IAAK9O,GAAGjD,GAAGA,EAAE6e,UAAU5b,EAAEjD,EAAE6e,QAAQ2V,UAAU,IAAIvxB,GAAG,SAASA,IAAI4J,EAAE,IAAI5J,IAAIrH,GAAG+P,EAAEyZ,OAAO3nB,OAAO,EAAE,KAAKkQ,EAAE7H,MAAM,GAAG,IAAI,CAAC,CAAC,MAAM,CAAC2uB,KAAK5nB,EAAEynB,KAAKrxB,EAAE6C,MAAM,IAAI4uB,GAAG,KAAK,MAAM7nB,EAAE,IAAI8nB,IAAI/mB,SAAS+mB,KAAKF,KAAKxxB,EAAE4J,EAAEvD,MAAM,GAAG+E,MAAM,KAAKf,EAAErK,EAAEA,EAAExF,OAAO,GAAGkO,EAAE2B,GAAG,WAAW3M,KAAK2M,IAAInN,SAAS8C,EAAEgE,OAAO,IAAI,KAAK,EAAE,MAAM,CAACwtB,KAAK5nB,EAAEynB,KAAKrxB,EAAEhD,KAAK,KAAK6F,MAAM6F,IAAIipB,GAAG,KAAK,MAAMN,KAAKznB,EAAE/G,MAAM7C,GAAGyxB,KAAK,IAAI7nB,EAAE,OAAO,IAAIS,EAAEM,SAASsN,cAAc,eAAerO,OAAO,GAAGS,GAAGA,EAAE6e,cAAc,IAAID,YAAY,QAAQ,CAACnb,SAAQ,EAAGC,YAAW,KAAMkjB,GAAGC,cAAc,OAAO,MAAMxoB,EAAEiC,SAASkU,iBAAiB,mBAAmBjV,OAAOlB,EAAElO,SAAS6P,EAAE3B,EAAE1I,EAAE,GAAGqK,GAAGA,EAAE6e,cAAc,IAAID,YAAY,QAAQ,CAACnb,SAAQ,EAAGC,YAAW,OAAQ6jB,GAAG,KAAK,IAAG,IAAKX,GAAGpiB,SAASlM,KAAK,OAAO,MAAMiH,EAAEqnB,GAAGC,cAAc,IAAG,KAAM,MAAMtnB,OAAO,EAAEA,EAAEgF,QAAQjM,MAAM,OAAO,MAAM0uB,KAAKrxB,EAAE6C,MAAMwH,GAAGonB,MAAMJ,KAAK3oB,GAAGsoB,KAAKpnB,IAAI5J,IAAI0I,EAAEkB,EAAEioB,OAAOxnB,EAAE,IAAIwmB,IAAG,EAAGjnB,EAAEkoB,UAAUH,MAAMI,GAAG,KAAKhB,IAAIhY,aAAagY,IAAIhZ,eAAe,KAAM6Z,IAAK,IAAII,GAAG,KAAK1nB,OAAOsC,iBAAiB,aAAamlB,IAAG,GAAIjZ,WAAW,KAAM8Y,IAAK,EAAE,MAAM1F,KAAK,8BAA8BxuB,KAAKiN,SAASsnB,YAAYD,KAAKrnB,SAASiC,iBAAiB,mBAAmBolB,KAAK,MAAME,GAAG,gBAAgB,MAAMC,WAAWx1B,EAAE,aAAAy1B,CAAcxoB,EAAE5J,EAAEqK,GAAG,MAAM3B,EAAEnP,KAAKkpB,SAASzT,UAAU3E,EAAE,QAAQ,GAAGA,EAAEqX,IAAI,UAAUrX,EAAE7Q,MAAM,iBAAiBkP,GAAGnP,KAAK84B,SAAShoB,EAAE3B,EAAE,CAAC,aAAA4pB,CAAc1oB,EAAE5J,EAAEqK,GAAGA,EAAEkb,SAASlb,EAAEkb,QAAQ7E,UAAUrW,EAAEkb,aAAa,EAAElb,EAAEkoB,aAAa,CAAC,CAAC,QAAAjJ,CAAS1f,EAAE5J,EAAEqK,EAAE3B,GAAGuL,EAAE1a,KAAKkpB,SAASlL,UAAU2a,IAAI,IAAI,MAAMtoB,KAAK5J,EAAEmiB,OAAO,CAAC,MAAMniB,EAAE4J,EAAE2b,QAAQvlB,GAAG4J,EAAE/G,QAAQwH,GAAGrK,EAAEygB,MAAM,IAAI,CAAC,CAAC,OAAA+R,GAAU,IAAI5oB,EAAE,MAAM5J,EAAEzG,KAAKkpB,SAASpY,EAAErK,EAAEuX,UAAU7O,EAAE1I,EAAEoxB,WAAW,IAAI/mB,IAAIA,EAAEQ,gBAAgBnC,EAAE,OAAO,MAAMgZ,GAAGhX,EAAE+nB,UAAU95B,EAAE4sB,QAAQxoB,EAAEykB,WAAW5kB,GAAG8L,EAAE,IAAIgC,IAAI9N,IAAIjE,IAAIoE,GAAGA,EAAEyZ,kBAAkBzZ,EAAEob,QAAQlI,EAAEC,MAAMnT,EAAEob,QAAQlI,EAAEM,QAAQ,OAAOxT,EAAEqb,gBAAgB,IAAIhM,EAAE7S,KAAKm5B,YAAYhqB,GAAG,IAAI0D,EAAE,OAAO7S,KAAKkpB,SAAStK,MAAMmY,GAAGG,cAAcpmB,EAAEiB,UAAU4I,OAAOge,IAAI7nB,EAAEiB,UAAU8I,IAAI,kBAAkBzb,EAAE+kB,MAAMqM,gBAAgB,QAAQntB,MAAM,MAAMqR,EAAE5D,EAAEoO,wBAAwB,MAAM,QAAQ7O,EAAEU,OAAO6S,sBAAsB,IAAIvT,OAAO,EAAEA,EAAEkM,QAAQ,IAAIjd,OAAO0V,OAAOlE,EAAEqT,MAAM,CAACiV,SAAS,WAAWzb,IAAI,GAAG7M,EAAEuoB,UAAUtoB,OAAO2hB,YAAY5U,KAAK,GAAGhN,EAAEwoB,WAAWvoB,OAAOkiB,YAAYpV,OAAO,OAAOD,MAAM,OAAOxF,MAAM,GAAG1D,EAAE0D,UAAUC,OAAO,GAAG3D,EAAE2D,WAAWkhB,SAAS,WAAW,MAAM/e,EAAE3F,EAAEqD,EAAEpD,EAAEyH,MAAMxH,EAAEykB,QAAQn6B,GAAGwT,EAAE,GAAGxT,EAAE,CAAC,MAAMgR,EAAE,EAAEA,EAAE5J,KAAS,MAAM0K,EAAE1K,EAAE4J,EAAQ,OAAO5J,GAAgC,IAAzBA,EAAE4J,GAAGc,GAAvBhC,GAA4B,EAAG,EAA1D,CAA4D3L,EAAE+Y,MAAMxH,GAAOvR,EAAEgS,GAAG,iBAAiB,KAAMpW,EAAE+kB,MAAMqV,QAAQnpB,EAAE7M,EAAE+Y,OAAO,EAAG,EAAE,CAAC/Y,EAAEgS,GAAG,eAAe,KAAM/O,EAAE0gB,SAAU,GAAG3jB,EAAEpC,OAAOoC,EAAEuR,EAAEvR,EAAEpC,OAAOmC,EAAE,EAAEC,EAAEpC,OAAOsT,EAAE,EAAElR,EAAEpC,OAAO0T,EAAEC,EAAEvR,EAAEkiB,MAAM,CAAClL,EAAE3F,EAAEqD,EAAEpD,EAAEyH,MAAMxH,EAAEkE,SAAS5Z,EAAE,GAAG,IAAIie,cAAa,IAAK9Z,EAAEwZ,WAAWvW,EAAE0gB,SAAS,CAAC,QAAA2R,CAASzoB,EAAE5J,GAAG,MAAMqK,EAAE9Q,KAAKkpB,SAAS7Y,EAAE6X,IAAIzhB,EAAEzG,KAAKoG,QAAQiK,EAAE5J,GAAGgzB,KAAMhzB,IAAI,MAAMyyB,UAAU/pB,EAAE6pB,QAAQ7nB,EAAE8W,WAAW7oB,EAAE+oB,GAAG3kB,GAAG6M,EAAE,GAAGS,EAAE4oB,cAAcvqB,IAAIgC,EAAE,OAAOhC,EAAE2V,aAAa,MAAMzhB,IAAIyN,EAAE6oB,eAAetpB,IAAIrQ,KAAKm5B,YAAY9oB,GAAG,GAAGrQ,KAAKuV,OAAO,cAAc/R,EAAE,CAACA,EAAE6P,iBAAiB,cAAehD,IAAIA,EAAE4R,gBAAiB,GAAG,MAAM5R,EAAEe,SAASM,cAAc,OAAOkJ,EAAEvK,EAAE,sBAAsBlB,EAAEyC,YAAYvB,EAAE,CAAC,GAAGjR,GAAGiE,EAAE,CAAC,MAAM8N,EAAE1K,EAAE+U,YAAYhY,EAAEiF,KAAKC,IAAIyI,EAAEuL,UAAUvL,EAAE4M,YAAY,IAAIrJ,EAAE,MAAMrR,EAAEm2B,SAASh2B,EAAE,OAAOkR,EAAEtD,SAASM,cAAc,OAAOkJ,EAAElG,EAAE,kBAAkBA,EAAEwT,IAAI9oB,EAAE+P,EAAEyC,YAAY8C,IAAI,MAAMG,EAAE,KAAKH,IAAIkG,EAAElG,EAAE,iBAAiB6K,WAAW,KAAM7K,IAAIA,EAAEiG,SAASjG,EAAE,KAAM,EAAE,QAAQ7B,EAAEzT,EAAE,IAAIw6B,QAAQ,CAAEvpB,EAAE5J,KAAK,MAAMqK,EAAE,IAAI+oB,MAAM/oB,EAAEgpB,OAAOzpB,EAAES,EAAEipB,QAAQtzB,EAAEqK,EAAEoX,IAAIrV,CAAE,IAAI4mB,KAAK,KAAM3oB,EAAEkpB,YAAY3pB,GAAGA,EAAEuO,MAAMoY,GAAGI,QAAQp3B,KAAKkpB,SAAS/S,KAAK,SAAS9F,GAAGrQ,KAAKmmB,OAAO9V,GAAGopB,KAAK,KAAM5kB,IAAI7U,KAAKkpB,SAAS+Q,KAAK5pB,EAAG,EAAE,KAAO,GAAGqE,GAAG6K,WAAW,KAAM1K,GAAI,EAAErR,EAAE,KAAK,IAAI,IAAK,EAAE,KAAMsN,EAAEkpB,YAAY3pB,GAAGS,EAAEopB,cAAc7pB,EAAG,EAAE,KAAK,CAAC,MAAMlB,EAAEnP,KAAKyV,UAAUpF,EAAE,eAAec,EAAEnR,KAAKyV,UAAUpF,EAAE,QAAQjR,EAAE,CAAC0jB,MAAMhS,EAAEqpB,oBAAoBrpB,EAAEuE,QAAQyN,MAAM7J,SAAS9H,EAAE,IAAI,GAAG,IAAI3N,EAAEsN,EAAE2E,UAAUpF,EAAE,mBAAmB,EAAEhN,GAAE,EAAGyN,EAAE6oB,eAAetpB,KAAK,SAASlB,EAAE1I,EAAE8f,WAAWnnB,GAAG,UAAU+P,EAAE1I,EAAE6f,YAAYlnB,GAAG,QAAQ+P,EAAE1I,EAAE+f,UAAUpnB,GAAGiE,GAAE,EAAGoD,EAAEgO,KAAK,YAAYpR,GAAGG,IAAIA,EAAEiD,EAAE0T,WAAW,WAAW,IAAIrJ,EAAEkpB,YAAY3pB,GAAGS,EAAEopB,cAAc7pB,EAAE7M,EAAE,CAAC,IAAIqP,CAAE,EAAE,KAAM/B,EAAEspB,SAAS/pB,EAAE,kBAAmB,EAAE,CAAC,OAAAjK,CAAQiK,EAAE5J,GAAG,OAAO,IAAImzB,QAAQ,CAAE9oB,EAAEK,KAAK,IAAI/R,EAAE,MAAMoE,EAAExD,KAAKkpB,SAAS7lB,EAAEgN,EAAE8X,GAAG3kB,EAAE62B,aAAahqB,GAAG7M,EAAE82B,YAAYjqB,GAAG,IAAIwC,EAAE7S,KAAKyV,UAAUpF,EAAE,WAAW,GAAG,iBAAiBwC,IAAIA,EAAE1D,EAAE0D,KAAKA,IAAI4H,EAAE5H,GAAG,CAAC,GAAGA,EAAEzB,SAASM,cAAc,OAAOmB,aAAaqK,iBAAiB,CAAC,IAAIpM,EAAE,GAAG3B,EAAEkB,EAAEkqB,QAAQzpB,EAAE,iBAAiB3B,GAAGA,EAAEA,EAAEhM,QAAQ,YAAY,IAAI4S,UAAU,EAAE,KAAK,SAAS1F,EAAE/G,MAAM,SAAS,QAAQlK,EAAEoE,EAAEo0B,gBAAgB,IAAIx4B,OAAO,EAAEA,EAAE+pB,MAAMloB,SAAS,IAAI4R,EAAEqV,IAAIzhB,GAAG,GAAGoM,EAAE2nB,IAAI1pB,EAAE+B,EAAE4nB,WAAU,EAAGpqB,EAAEqqB,QAAQ7nB,EAAE4S,aAAa,SAASpV,EAAEqqB,QAAQ16B,KAAKkpB,SAASyQ,eAAetpB,KAAKwC,EAAE8nB,cAAc,OAAO,CAACtqB,EAAEuqB,OAAO/nB,EAAE4S,aAAa,QAAQpV,EAAEuqB,MAAM,CAAChgB,EAAE/H,EAAE,kBAAkBxC,EAAE2oB,QAAQnmB,EAAErP,EAAEq3B,WAAWxqB,EAAEwC,GAAE,GAAIxC,EAAE2b,QAAQ,IAAI1Q,EAAEjY,EAAE0R,EAAE,CAAC+E,iBAAgB,GAAI9Z,KAAKuV,OAAO,YAAY,CAAC,EAAE,CAAC4C,QAAQtF,EAAEuF,MAAM,CAAC3R,EAAEqK,IAAItN,EAAEiS,UAAUpF,EAAE,QAAQ,OAAOS,IAAI,OAAOuH,OAAO,CAAC5R,EAAEqK,IAAItN,EAAEiS,UAAUpF,EAAE,SAAS,OAAOS,IAAI,OAAOwI,MAAM,KAAK,MAAMjJ,EAAE7M,EAAE+R,OAAO,SAAS,OAAO,SAASlF,GAAG,OAAOA,IAAIA,GAAG+I,MAAM,CAAC3S,EAAEqK,KAAK,IAAI3B,EAAEgC,EAAE,GAAG3N,EAAEs3B,WAAWt3B,EAAEk2B,YAAY,OAAM,EAAG,GAAGrpB,EAAE/G,SAAS,QAAQ6F,EAAE3L,EAAEq0B,kBAAkB,IAAI1oB,OAAO,EAAEA,EAAE7F,OAAO,OAAM,EAAG,GAAGwH,EAAE,CAAC,MAAMT,EAAES,EAAEoS,eAAe,GAAG,GAAG,CAAC,IAAI,SAAS,WAAW,SAAS,QAAQ,SAAS,SAASjN,SAAS5F,EAAE8S,UAAU,OAAM,CAAE,CAAC,IAAI/jB,GAAG0R,GAAGA,EAAE1P,SAAS,QAAQ+P,EAAEd,EAAE6oB,iBAAiB,IAAI/nB,OAAO,EAAEA,EAAEkN,SAASvN,EAAE1P,SAAS,OAAOoC,EAAE+R,OAAOnW,EAAE,eAAe,mBAAkB,GAAIia,SAAS,IAAI7V,EAAEs3B,UAAU,aAAat3B,EAAE+R,OAAO,qBAAoB,EAAGiE,SAAQ,EAAGV,eAAc,EAAGS,WAAW,IAAI/D,GAAG,CAACulB,MAAM1qB,IAAIS,EAAET,IAAI2qB,MAAM,KAAK7pB,KAAKgW,QAAQ,KAAKhW,QAAS,EAAE,CAAC,MAAAgV,CAAO9V,GAAG,OAAO,IAAIupB,QAAQ,CAAEnzB,EAAEqK,KAAK,MAAM3B,EAAEnP,KAAKkpB,SAAS/X,EAAEhC,EAAE6O,WAAWgO,QAAQ5sB,EAAE85B,UAAU11B,EAAE2kB,GAAG9kB,GAAGgN,EAAEjR,GAAGA,EAAEyf,gBAAgB,MAAMhM,EAAE7S,KAAKm5B,YAAY9oB,GAAG,KAAKwC,GAAGxP,GAAGG,GAAGpE,GAAG+R,GAAG,YAAYL,IAAI,MAAM0J,EAAE9F,EAAEwD,EAAErD,EAAE0H,MAAMzH,EAAE0kB,QAAQzkB,GAAGlC,EAAExT,EAAE,KAAKgR,EAAEuO,QAAQoY,GAAGC,UAAUliB,IAAIvR,EAAE2gB,MAAMqV,QAAQ/wB,KAAKC,IAAID,KAAKoU,IAAI,EAAE,GAAG,EAAEzd,EAAEmd,QAAQ,EAAEzH,IAAI,GAAG,IAAI1V,EAAEmd,OAAO,GAAGnd,EAAEmd,MAAMnd,EAAEod,YAAY,IAAI/V,EAAErH,KAAK8V,EAAE7E,KAAKA,EAAEkM,MAAM,KAAKlM,EAAEkM,MAAM,QAAQlM,EAAE8J,aAAaO,EAAEvJ,EAAEwnB,IAAIn1B,EAAE2gB,MAAMqV,QAAQ,GAAGnpB,EAAE6F,IAAI,eAAehB,GAAG7E,EAAE6F,IAAI,aAAahB,GAAG7E,EAAE6F,IAAI,iBAAiB7W,GAAGoH,EAAE4J,KAAKjR,EAAEoW,GAAG,eAAeN,GAAG9V,EAAEoW,GAAG,aAAaN,GAAG9V,EAAEoW,GAAG,iBAAiBnW,GAAGD,EAAEoW,GAAG,CAAC,QAAQ,WAAW,KAAM1E,GAAI,GAAG1R,EAAEsmB,MAAM,CAAClL,EAAE9F,EAAEwD,EAAErD,EAAE0H,MAAMzH,EAAEmE,SAAS,EAAEqE,cAAa,IAAKle,EAAEqV,KAAK,WAAW,MAAMnR,EAAE,CAACwf,MAAM,cAAc1jB,EAAEkZ,QAAQnJ,EAAEgrB,oBAAoBhrB,EAAEkG,QAAQyN,WAAW,GAAGpM,EAAE1W,KAAKyV,UAAUpF,EAAE,eAAeuK,EAAEzJ,EAAEwnB,IAAIxpB,EAAE6qB,YAAY3pB,GAAG,SAASqG,EAAEtX,EAAEmnB,WAAWjjB,GAAG,UAAUoT,EAAEtX,EAAEknB,YAAYhjB,GAAG,QAAQoT,EAAEtX,EAAEonB,UAAUljB,GAAGlE,EAAE8nB,MAAM,KAAM,EAAE,CAAC,WAAAiS,CAAY9oB,GAAG,MAAM8X,GAAG1hB,EAAEuyB,QAAQloB,EAAEkX,QAAQ7Y,EAAE6c,QAAQ7a,GAAGd,EAAEjR,EAAEY,KAAKkpB,SAAS1lB,EAAEpE,EAAE4e,UAAU,IAAIvX,IAAIqK,IAAI3B,IAAIgC,GAAGshB,GAAGtjB,GAAG,IAAInP,KAAKyV,UAAUpF,EAAE,UAAU7M,GAAGpE,EAAEwf,QAAQmY,GAAG/f,QAAQ,OAAM,EAAG,GAAG,MAAMhG,iBAAiBxN,GAAGy3B,iBAAiB,mBAAmB,OAAM,EAAG,MAAM53B,EAAE0N,OAAO6S,gBAAgB,KAAK,GAAG,KAAKvgB,EAAEA,EAAEkZ,MAAM,GAAG,OAAM,EAAG,IAAIoB,IAAI9K,EAAEiL,KAAKpJ,EAAE0D,MAAMvD,EAAEwD,OAAOvD,GAAG3F,EAAE+P,yBAAyBvB,IAAI5I,EAAE+I,KAAKze,EAAEoc,SAASvG,EAAEwG,UAAUpY,GAAG6N,EAAEqK,YAAY,KAAK3G,GAAGC,GAAGI,GAAG5R,GAAG,OAAM,EAAG,MAAMoT,EAAEvF,EAAE6M,UAAUkB,wBAAwB7f,GAAGqX,EAAEoH,KAAK/I,GAAG2B,EAAEiH,IAAI,MAAM3a,GAAG,GAAG3D,EAAE,GAAG6V,GAAGR,EAAE,GAAGG,IAAItR,GAAG,GAAGwR,EAAE,GAAGzR,GAAGuP,EAAE,GAAGiC,IAAIoD,EAAErD,EAAEK,EAAE,IAAIqF,EAAEva,KAAKuV,OAAO,iBAAgB,EAAG,MAAM,SAASgF,IAAIA,EAAE9R,KAAKsU,IAAIlI,EAAEC,EAAEI,EAAE5R,GAAG,IAAI,CAACkX,EAAExX,EAAEkV,EAAE3U,EAAEgZ,MAAMrE,EAAEshB,QAAQjf,EAAE,CAAC,MAAA/D,GAAS,MAAMnG,EAAErQ,KAAKyG,EAAE4J,EAAE6Y,SAASziB,EAAE+O,GAAG,kBAAkBnF,EAAE0f,UAAUtpB,EAAE+O,GAAG,uBAAuBnF,EAAEwoB,eAAepyB,EAAE+O,GAAG,uBAAuBnF,EAAE0oB,eAAetyB,EAAE+O,GAAG,QAAQnF,EAAE4oB,QAAQ,CAAC,MAAA1iB,GAAS,MAAMlG,EAAErQ,KAAKyG,EAAE4J,EAAE6Y,SAASziB,EAAEyP,IAAI,kBAAkB7F,EAAE0f,UAAUtpB,EAAEyP,IAAI,uBAAuB7F,EAAEwoB,eAAepyB,EAAEyP,IAAI,uBAAuB7F,EAAE0oB,eAAetyB,EAAEyP,IAAI,QAAQ7F,EAAE4oB,QAAQ,EAAE35B,OAAO4B,eAAe03B,GAAG,WAAW,CAACr3B,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAM,CAAC+5B,YAAY,MAAMnJ,QAAQ,CAAC/Y,SAAS,GAAGmiB,WAAU,EAAGviB,MAAK,EAAGwiB,YAAY,UAAU,mBAAmBC,iBAAiBA,gBAAgB,MAAMC,GAAG,OAAOC,GAAG,QAAQC,GAAG,MAAMC,GAAG,UAAUC,GAAG,QAAQC,GAAG,aAAaC,GAAG,CAACvrB,EAAE5J,EAAE,CAAC,KAAK,MAAMqK,EAAE,IAAIqnB,IAAI9nB,GAAGlB,EAAE,IAAI0sB,gBAAgB/qB,EAAEgrB,QAAQ3qB,EAAE,IAAI0qB,gBAAgB,IAAI,MAAMxrB,EAAES,IAAI,IAAI3B,KAAK7P,OAAO+J,QAAQ5C,IAAI,CAAC,IAAIA,EAAEqK,EAAE,GAAG,GAAG,MAAMT,EAAE,CAAC,IAAIA,EAAE5J,EAAE/C,MAAM,oBAAoB2M,GAAGc,EAAE1H,IAAI,QAAQ,GAAG9F,SAAS0M,EAAE,IAAI,KAAK1M,SAAS0M,EAAE,IAAI,KAAK,GAAG,MAAMc,EAAE1H,IAAI4G,EAAE5J,EAAE,CAAC,IAAIrH,EAAE+R,EAAE,GAAG3N,EAAE6M,EAAE3M,MAAM,kBAAkB,OAAOF,IAAIpE,GAAG,MAAMoE,EAAE,MAAMpE,GAAoe28B,GAAG,CAAC,QAAQ,OAAO,OAAO,SAAS,QAAQ,SAAS,MAAM,MAAM,aAAa,UAAU,SAAS,MAAMC,WAAW54B,EAAE,iBAAA64B,CAAkB5rB,EAAE5J,EAAEqK,GAAG9Q,KAAKk8B,YAAYprB,EAAE,CAAC,aAAA+nB,CAAcxoB,EAAE5J,EAAEqK,GAAG9Q,KAAK66B,WAAW/pB,EAAE,CAAC,cAAAqrB,CAAe9rB,EAAE5J,GAAGA,EAAE21B,MAAM31B,EAAE21B,IAAIC,QAAQ51B,EAAE21B,IAAI,MAAM,MAAMtrB,EAAErK,EAAE61B,SAASxrB,IAAIA,EAAEgpB,OAAOhpB,EAAEipB,QAAQ,KAAKjpB,EAAEoX,IAAI,gBAAgBzhB,EAAE61B,SAAS,MAAM,MAAMntB,EAAE1I,EAAEyyB,UAAU/nB,EAAE1K,EAAE81B,cAAc,GAAG,WAAW91B,EAAExG,MAAMkP,GAAGgC,EAAEhC,EAAE4C,UAAU4I,OAAO,qBAAqB,SAAS3J,iBAAiB7B,GAAG8rB,iBAAiB,aAAa9rB,EAAEgV,MAAMoB,QAAQ,QAAQhG,WAAW,KAAMpO,IAAIhC,GAAGgC,EAAE8d,YAAY9d,EAAE8d,WAAW1Q,aAAapP,EAAEgC,GAAGA,EAAEwJ,SAAU,EAAE,GAAGlU,EAAEyyB,eAAe,EAAEzyB,EAAE81B,mBAAmB,OAAO,KAAK91B,EAAE0hB,IAAI1hB,EAAE0hB,GAAGxW,YAAYlL,EAAE0hB,GAAGiH,YAAY3oB,EAAE0hB,GAAGxW,WAAW,CAAC,aAAA6qB,CAAcnsB,EAAE5J,EAAEqK,GAAGA,EAAE8N,QAAQoY,GAAGngB,OAAO7W,KAAKy8B,WAAW,CAAC,eAAAC,CAAgBrsB,EAAE5J,EAAEqK,GAAG,IAAI3B,EAAEgC,EAAE,GAAGL,EAAE7Q,OAAO07B,GAAG,CAAC,IAAI,QAAQxqB,EAAE,QAAQhC,EAAE2B,EAAEqX,UAAU,IAAIhZ,OAAO,EAAEA,EAAEuP,cAAc,gBAAgB,IAAIvN,GAAGA,EAAEwrB,OAAO,CAAC,MAAMtsB,GAAG,CAAC,MAAM,CAAC,IAAIjR,EAAE0R,EAAE7Q,OAAOy7B,GAAGt8B,EAAE,CAACw9B,OAAO,QAAQz7B,MAAM,QAAQ2P,EAAE7Q,OAAOw7B,KAAKr8B,EAAE,CAAC0jB,MAAM,UAAUtd,KAAK,eAAepG,GAAG0R,EAAEwrB,UAAUxrB,EAAEwrB,SAASO,eAAe/rB,EAAEwrB,SAASO,cAAcC,YAAYta,KAAKua,UAAU39B,GAAG,KAAK0R,EAAEksB,QAAQxd,aAAa1O,EAAEksB,OAAO,CAAC,MAAAC,CAAO5sB,EAAE5J,GAAG4J,EAAE6sB,eAAez2B,KAAK4J,EAAEqpB,aAAa15B,KAAKy8B,WAAW,CAAC,SAAA3T,CAAUzY,EAAE5J,GAAGA,EAAEmiB,OAAO9W,QAASzB,IAAIA,EAAE8X,KAAKnoB,KAAKm9B,aAAa9sB,GAAGrQ,KAAKo9B,eAAe/sB,GAAI,EAAE,CAAC,SAAAgtB,CAAUhtB,GAAG,IAAI,IAAI5J,EAAE+b,KAAKC,MAAMpS,EAAExG,MAAM,GAAG,6BAA6BwG,EAAEitB,QAAQ,GAAG,UAAU72B,EAAEqc,MAAM,IAAI,IAAIrc,KAAK/B,MAAMsP,KAAK5C,SAASmsB,uBAAuB,qBAAqB92B,aAAa+2B,mBAAmB/2B,EAAEo2B,gBAAgBxsB,EAAE/N,SAASmE,EAAE4b,QAAQ0Y,MAAM,aAAa,GAAG1qB,EAAEitB,OAAO55B,MAAM,+CAA+C,YAAY+C,EAAEqc,MAAM,CAAC,MAAMzS,EAAEe,SAASqsB,eAAeh3B,EAAE+L,IAAInC,IAAIA,EAAEgS,QAAQ0Y,MAAM,OAAO,CAAC,CAAC,MAAM1qB,GAAG,CAAC,CAAC,eAAAqtB,CAAgBrtB,GAAG,MAAM5J,EAAEzG,KAAKkpB,SAASzT,UAAUpF,EAAE,QAAQ,GAAGrQ,KAAKkpB,SAASoR,YAAYjqB,GAAG,MAAMS,EAAE9Q,KAAKkpB,SAAS/Z,EAAE,IAAIwuB,eAAe7sB,EAAEwpB,YAAYjqB,GAAGlB,EAAEyuB,mBAAmB,WAAWzuB,EAAEupB,aAAaiF,eAAeE,MAAM/sB,EAAE8N,QAAQmY,GAAGlgB,QAAQ/F,EAAEkpB,YAAY3pB,GAAG,MAAMlB,EAAE2uB,OAAOhtB,EAAE+pB,WAAWxqB,EAAElB,EAAE4uB,cAAcjtB,EAAEspB,SAAS/pB,EAAE,MAAMlB,EAAE2uB,OAAO,qBAAqB,sBAAsB,EAAE,MAAM3sB,EAAEd,EAAE2tB,MAAM,KAAK7uB,EAAE8uB,KAAK9sB,EAAE,OAAO,MAAM1K,EAAE,IAAI0I,EAAE+uB,iBAAiB,eAAe,qCAAqC/uB,EAAE+uB,iBAAiB,mBAAmB,kBAAkB/uB,EAAEgvB,KAAKhtB,GAAGd,EAAE+rB,IAAIjtB,CAAC,CAAC,gBAAAivB,CAAiB/tB,GAAG,IAAI5J,EAAE,KAAK,GAAGgU,EAAEpK,EAAE6X,KAAKzhB,EAAE4J,EAAE6X,SAAS,GAAG,iBAAiB7X,EAAE6X,IAAI,CAAC,MAAMpX,EAAET,EAAE6X,IAAIrW,MAAM,IAAI,GAAGpH,MAAMhE,EAAEqK,EAAEM,SAASqsB,eAAe3sB,GAAG,IAAI,CAAC,GAAGrK,EAAE,CAAC,GAAG,UAAU4J,EAAEpQ,MAAMwG,EAAE2b,QAAQ,oBAAoB,CAAC3b,EAAEA,EAAE43B,WAAU,GAAI,MAAMvtB,EAAErK,EAAE4b,QAAQoO,cAAc3f,IAAIrK,EAAEsL,UAAU4I,OAAO7J,UAAUrK,EAAE4b,QAAQoO,eAAe,IAAIthB,EAAE1I,EAAEse,aAAa,MAAM5V,EAAEA,EAAE,GAAGA,WAAW,SAASnP,KAAKkpB,SAAS1W,MAAMnC,EAAE/G,QAAQ7C,EAAEgf,aAAa,KAAKtW,EAAE,MAAM,GAAG1I,EAAEwoB,WAAW,CAAC,MAAMne,EAAEM,SAASM,cAAc,OAAOZ,EAAEiB,UAAU8I,IAAI,wBAAwBpU,EAAEwoB,WAAW1Q,aAAazN,EAAErK,GAAG4J,EAAEksB,cAAczrB,CAAC,CAAC9Q,KAAKkpB,SAAS2R,WAAWxqB,EAAE5J,EAAE,MAAMzG,KAAKkpB,SAASkR,SAAS/pB,EAAE,wBAAwB,CAAC,gBAAAiuB,CAAiBjuB,GAAG,MAAM6X,IAAIzhB,EAAE0hB,GAAGrX,GAAGT,EAAE,IAAI5J,GAAG,iBAAiBA,IAAIqK,EAAE,OAAOA,EAAEiB,UAAU8I,IAAI,cAAc,MAAM1L,EAAEnP,KAAKkpB,SAAS/X,EAAEC,SAASM,cAAc,UAAUP,EAAEotB,UAAU,mBAAmBptB,EAAEsU,aAAa,KAAK,oBAAoBtW,EAAEqD,MAAMnC,EAAE/G,SAAS,IAAI,MAAM7C,EAAEqK,KAAKxR,OAAO+J,QAAQrJ,KAAKyV,UAAUpF,EAAE,eAAe,CAAC,GAAGc,EAAEsU,aAAahf,EAAEqK,GAAGK,EAAE4oB,QAAQ,KAAK5qB,EAAEirB,SAAS/pB,EAAE,qBAAqBA,EAAEisB,SAASnrB,EAAE,MAAM/R,EAAEY,KAAKyV,UAAUpF,EAAE,WAAW,GAAG,WAAWA,EAAEpQ,OAAM,IAAKb,EAAE,OAAO+R,EAAEsU,aAAa,MAAMpV,EAAE6X,IAAI,IAAI/Y,EAAE0rB,WAAWxqB,EAAEc,GAAE,GAAInR,KAAKm9B,aAAa9sB,QAAQlB,EAAE+qB,cAAc7pB,GAAGlB,EAAEmrB,YAAYjqB,GAAGc,EAAE2oB,OAAO,KAAK,IAAI3oB,EAAE+W,IAAIjnB,OAAO,OAAO,MAAMwF,EAAE,SAAS0K,EAAEkR,QAAQ0Y,MAAM5pB,EAAEkR,QAAQ0Y,MAAM,OAAO/6B,KAAKm9B,aAAa9sB,GAAG5J,EAAE0I,EAAE+qB,cAAc7pB,GAAGlB,EAAE6qB,YAAY3pB,IAAIc,EAAEsU,aAAa,MAAMhf,GAAG0I,EAAE0rB,WAAWxqB,EAAEc,GAAE,EAAG,CAAC,YAAAgsB,CAAa9sB,GAAG,MAAMpQ,KAAKwG,EAAE61B,SAASxrB,GAAGT,EAAE,GAAG5J,IAAIg1B,IAAIh1B,IAAIi1B,GAAG,OAAO,MAAMvsB,EAAE,MAAM2B,OAAO,EAAEA,EAAEQ,cAAc,IAAIR,IAAI3B,EAAE,OAAO,IAAIgC,EAAEd,EAAEmuB,cAAc,IAAIrtB,IAAIA,EAAEnR,KAAKyV,UAAUpF,EAAE,aAAa,IAAIjR,EAAEiR,EAAE+H,OAAO,EAAE5U,EAAE6M,EAAEgI,QAAQ,EAAEjZ,GAAGoE,IAAI2N,GAAE,GAAI,MAAM9N,EAAE8L,GAAGA,EAAEgV,MAAM,IAAG,IAAK9T,EAAEwhB,UAAS,IAAK1gB,GAAG9N,EAAE,IAAI,MAAMgN,EAAEU,OAAOC,iBAAiB7B,GAAG1I,EAAE6J,WAAWD,EAAEiU,aAAahU,WAAWD,EAAEkU,cAAcpT,EAAEb,WAAWD,EAAE+T,YAAY9T,WAAWD,EAAEgU,eAAexR,EAAE/B,EAAE+rB,cAAc,GAAGhqB,EAAE,CAAC,MAAMxC,EAAEwC,EAAEzB,SAASN,EAAET,EAAEouB,qBAAqBnD,IAAI,GAAGnsB,EAAEkB,EAAEgB,KAAKhO,EAAE+U,MAAM,GAAGjJ,EAAEgV,MAAMoV,SAAS,SAASn6B,EAAEA,GAAG0R,EAAE8T,YAAYne,EAAEpD,EAAE+U,MAAM,GAAGhZ,MAAM+P,EAAEgV,MAAMoV,SAAS,GAAGl2B,EAAEq7B,KAAK,WAAWr7B,EAAEgV,OAAO,GAAGlJ,EAAEyB,iBAAiBpN,EAAEsN,EAAEF,aAAaO,CAAC,CAAC,CAAC,MAAMd,GAAG,CAAC,GAAGjR,GAAGoE,EAAE,CAAC,MAAM6M,EAAE,CAACquB,KAAK,WAAWtmB,MAAM,GAAGC,OAAO,IAAIjZ,GAAG,SAASA,IAAIiR,EAAE+H,MAAM,GAAGhZ,OAAOoE,GAAG,SAASA,IAAI6M,EAAEgI,OAAO,GAAG7U,OAAOlE,OAAO0V,OAAO3R,EAAEgN,EAAE,CAAC,CAAC,SAAAosB,GAAY,MAAMpsB,EAAErQ,KAAKkpB,SAAS2O,WAAW,IAAIxnB,EAAE,OAAO,MAAM8X,GAAG1hB,GAAG4J,EAAE,IAAI5J,IAAIA,EAAEkK,aAAa,OAAO,IAAI3Q,KAAKyV,UAAUpF,EAAE,iBAAiB,OAAO,GAAGA,EAAEpQ,OAAO07B,GAAG,IAAI,MAAMtrB,EAAE5J,EAAEiY,cAAc,SAAS,GAAGrO,EAAE,CAAC,MAAM5J,EAAE4J,EAAEsuB,YAAY,IAAIl4B,GAAGA,EAAEgzB,KAAK,KAAO,GAAGmF,MAAOn4B,IAAI4J,EAAEwuB,OAAM,EAAGxuB,EAAEsuB,MAAO,EAAE,CAAC,CAAC,MAAMtuB,GAAG,CAAC,GAAGA,EAAEpQ,OAAOw7B,IAAIprB,EAAEpQ,OAAOy7B,GAAG,OAAO,MAAM5qB,EAAE,KAAK,GAAGT,EAAEisB,UAAUjsB,EAAEisB,SAASO,cAAc,CAAC,IAAIp2B,EAAE,GAAG,SAAS4J,EAAEisB,SAASja,QAAQ0Y,MAAM,OAAOt0B,EAAE4J,EAAEpQ,OAAOw7B,GAAG,CAAC3Y,MAAM,UAAUtd,KAAK,aAAa,CAACo3B,OAAO,OAAOz7B,MAAM,QAAQsF,GAAG4J,EAAEisB,SAASO,cAAcC,YAAYta,KAAKua,UAAUt2B,GAAG,UAAU4J,EAAE2sB,YAAY,GAAG3sB,EAAEpQ,OAAOw7B,KAAKh1B,EAAE,CAACqc,MAAM,YAAYtQ,GAAGnC,EAAEisB,SAASvX,aAAa,OAAO1U,EAAEisB,SAASO,cAAcC,YAAYta,KAAKua,UAAUt2B,GAAG,KAAK,CAAC4J,EAAE2sB,OAAOzd,WAAWzO,EAAE,MAAMA,GAAG,CAAC,WAAAorB,CAAY7rB,GAAG,GAAGA,EAAEwX,KAAK,OAAOxX,EAAEpQ,KAAKq7B,GAAGjrB,EAAE6X,IAAI7X,EAAEwX,UAAUxX,EAAEwX,KAAK,IAAI,MAAMphB,EAAEzG,KAAKkpB,SAASzT,UAAUpF,EAAE,MAAM,IAAI,IAAI5J,GAAG,iBAAiBA,EAAE,OAAO,IAAIqK,EAAET,EAAEpQ,KAAKkP,EAAE,KAAK,GAAGA,EAAE1I,EAAE/C,MAAM,8KAA8K,CAAC,MAAMyN,EAAEnR,KAAKyV,UAAUpF,EAAEorB,KAAKqD,SAAS1/B,GAAG+R,EAAE3N,EAAE,SAAS6M,EAAE5J,GAAG,IAAIqK,EAAE,CAAC,EAAE,IAAI,IAAI3B,KAAKkB,EAAE/Q,OAAOa,UAAU8G,eAAelH,KAAKsQ,EAAElB,IAAI1I,EAAEyK,QAAQ/B,GAAG,IAAI2B,EAAE3B,GAAGkB,EAAElB,IAAI,GAAG,MAAMkB,GAAG,mBAAmB/Q,OAAOy/B,sBAAsB,CAAC,IAAI5tB,EAAE,EAAE,IAAIhC,EAAE7P,OAAOy/B,sBAAsB1uB,GAAGc,EAAEhC,EAAElO,OAAOkQ,IAAI1K,EAAEyK,QAAQ/B,EAAEgC,IAAI,GAAG7R,OAAOa,UAAU8H,qBAAqBlI,KAAKsQ,EAAElB,EAAEgC,MAAML,EAAE3B,EAAEgC,IAAId,EAAElB,EAAEgC,IAAI,CAAC,OAAOL,CAAC,CAAxU,CAA0UK,EAAE,CAAC,aAAa9N,EAAE,cAAcjE,EAAE,YAAY,SAASyT,EAAE+oB,GAAGn1B,EAAEjD,GAAGkR,EAAEsqB,mBAAmB7vB,EAAE,IAAIkB,EAAE4uB,QAAQvqB,EAAErE,EAAE6X,IAAI,WAAW7kB,WAAWqR,KAAK7B,IAAIxC,EAAE0X,SAAS1X,EAAE0X,UAAU,0BAA0BrT,kBAAkB5D,EAAE2qB,EAAE,MAAM,GAAGtsB,EAAE1I,EAAE/C,MAAM,4DAA4D,CAAC,MAAMyN,EAAEyqB,GAAGn1B,EAAEzG,KAAKyV,UAAUpF,EAAEqrB,KAAKt8B,EAAE4/B,mBAAmB7vB,EAAE,IAAI3L,EAAE2L,EAAE,IAAI,GAAGkB,EAAE4uB,QAAQ7/B,EAAEiR,EAAE6X,IAAI,kCAAkC9oB,KAAKoE,EAAE,KAAKA,IAAI2N,EAAE,IAAI,KAAK,KAAKA,IAAIL,EAAE4qB,EAAE,CAAC,IAAI5qB,GAAGT,EAAE0nB,UAAU,CAAC,MAAMtxB,EAAE4J,EAAE0nB,UAAU1V,QAAQpiB,KAAK87B,GAAG9lB,SAASxP,KAAKqK,EAAErK,EAAE,CAACqK,GAAG,iBAAiBrK,IAAI,MAAMA,EAAEwkB,OAAO,GAAGna,EAAE,UAAU3B,EAAE1I,EAAE/C,MAAM,uCAAuCoN,EAAE6qB,GAAGtrB,EAAE6uB,YAAY7uB,EAAE6uB,aAAa,UAAU,QAAQ/vB,EAAE,GAAG,MAAMA,EAAE,KAAK1I,EAAE/C,MAAM,wFAAwFoN,EAAEyqB,GAAG90B,EAAE/C,MAAM,0BAA0BoN,EAAE,SAAS3B,EAAE1I,EAAE/C,MAAM,+HAA+H2M,EAAE6X,IAAI,uBAAuB/Y,EAAE,WAAWA,EAAE,GAAGA,EAAE,GAAG,MAAM1G,KAAK2oB,MAAM9gB,WAAWnB,EAAE,MAAMA,EAAE,GAAGA,EAAE,GAAGhM,QAAQ,MAAM,KAAK,IAAIgM,EAAE,GAAG,IAAIhM,QAAQ,KAAK,eAAegM,EAAE,IAAIA,EAAE,GAAG+B,QAAQ,WAAW,EAAE,UAAU,UAAUJ,EAAE0qB,KAAKrsB,EAAE1I,EAAE/C,MAAM,8EAA8E2M,EAAE6X,IAAI,uBAAuB/Y,EAAE,aAAaA,EAAE,GAAGhM,QAAQ,SAAS,MAAMA,QAAQ,QAAQ,mBAAmB2N,EAAE0qB,IAAI1qB,EAAEA,GAAG9Q,KAAKkpB,SAAS3T,OAAO,eAAelF,EAAEpQ,KAAK6Q,EAAEA,IAAIyqB,KAAKlrB,EAAE0X,SAAS1X,EAAE0X,UAAU1X,EAAE6X,IAAI,CAAC,UAAA2S,CAAWxqB,GAAG,MAAM5J,EAAEzG,KAAKkpB,SAASzT,UAAUpF,EAAE,QAAQ,GAAG,GAAGA,GAAGA,EAAEpQ,MAAMwG,EAAE,CAAC,OAAO4J,EAAEpQ,MAAM,KAAKq7B,GAAGt7B,KAAKkpB,SAAS2R,WAAWxqB,EAAE5J,GAAG,MAAM,KAAKk1B,GAAG,MAAM7qB,EAAE9Q,KAAKuV,OAAO,YAAYzE,GAAG9Q,KAAKkpB,SAAS2R,WAAWxqB,EAAES,EAAE3N,QAAQ,gBAAgBsD,EAAE,IAAItD,QAAQ,mBAAmBnD,KAAKyV,UAAUpF,EAAE,gBAAgB,IAAIlN,QAAQ,mBAAmBkN,EAAE8uB,QAAQ9uB,EAAE0X,UAAU,KAAK,MAAM,IAAI,SAAS,IAAI,QAAQ/nB,KAAKo+B,iBAAiB/tB,GAAG,MAAM,IAAI,OAAOrQ,KAAK09B,gBAAgBrtB,GAAG,MAAM,IAAI,MAAM,KAAKmrB,GAAG,KAAKC,GAAG,KAAKC,GAAGrrB,EAAEwhB,SAAQ,EAAG,IAAI,SAAS7xB,KAAKs+B,iBAAiBjuB,GAAGrQ,KAAKo9B,eAAe/sB,EAAE,CAAC,CAAC,cAAA+sB,CAAe/sB,GAAG,MAAM5J,EAAE4J,EAAE6oB,UAAU,KAAK7oB,EAAE8X,IAAI1hB,GAAG4J,EAAEpQ,MAAM,CAACw7B,GAAGC,GAAGC,IAAI1lB,SAAS5F,EAAEpQ,OAAO,OAAO,IAAI6Q,EAAE3B,EAAEkB,EAAE+H,OAAO,OAAOjH,EAAEd,EAAEgI,QAAQ,OAAO,GAAG,SAASlJ,GAAG,SAASgC,EAAE,CAACL,EAAE9Q,KAAKyV,UAAUpF,EAAE,cAAc,MAAM5J,GAAGqK,EAAE,IAAIpN,MAAM,sBAAsBoN,EAAErK,GAAGA,EAAExF,OAAO,EAAEqP,WAAW7J,EAAE,IAAI6J,WAAW7J,EAAE,IAAI6J,WAAWQ,EAAE,GAAG,MAAM3B,GAAGgC,IAAIL,EAAE3B,EAAEgC,GAAG,IAAIL,EAAE,OAAOrK,EAAE0d,MAAMib,YAAY,GAAG34B,EAAE0d,MAAM/L,MAAM,GAAG3R,EAAE0d,MAAM9L,OAAO,GAAG5R,EAAEqe,aAAa,MAAM1lB,EAAEqH,EAAEyY,wBAAwB1b,EAAEpE,EAAEgZ,OAAO,EAAE/U,EAAEjE,EAAEiZ,QAAQ,EAAE5R,EAAE0d,MAAMib,YAAYtuB,EAAE,GAAGA,EAAEtN,EAAEH,GAAG8N,EAAE,SAASA,EAAE9N,EAAEoF,KAAKoU,IAAIxZ,EAAE8N,GAAG1K,EAAE0d,MAAM/L,MAAM,OAAO3R,EAAE0d,MAAM9L,OAAO,GAAGlH,QAAQhC,EAAE,SAASA,EAAE3L,EAAEiF,KAAKoU,IAAIrZ,EAAE2L,GAAG1I,EAAE0d,MAAM/L,MAAM,GAAGjJ,MAAM1I,EAAE0d,MAAM9L,OAAO,OAAO,CAAC,MAAA7B,GAAS,MAAMnG,EAAErQ,KAAKyG,EAAE4J,EAAE6Y,SAASziB,EAAE+O,GAAG,2BAA2BnF,EAAE4rB,mBAAmBx1B,EAAE+O,GAAG,uBAAuBnF,EAAEwoB,eAAepyB,EAAE+O,GAAG,uBAAuBnF,EAAEmsB,eAAe/1B,EAAE+O,GAAG,yBAAyBnF,EAAEqsB,iBAAiBj2B,EAAE+O,GAAG,2BAA2BnF,EAAEyY,WAAWriB,EAAE+O,GAAG,OAAOnF,EAAE4sB,QAAQx2B,EAAE+O,GAAG,eAAenF,EAAE8rB,gBAAgBprB,OAAOsC,iBAAiB,UAAUhD,EAAEgtB,UAAU,CAAC,MAAA9mB,GAAS,MAAMlG,EAAErQ,KAAKyG,EAAE4J,EAAE6Y,SAASziB,EAAEyP,IAAI,2BAA2B7F,EAAE4rB,mBAAmBx1B,EAAEyP,IAAI,uBAAuB7F,EAAEwoB,eAAepyB,EAAEyP,IAAI,uBAAuB7F,EAAEmsB,eAAe/1B,EAAEyP,IAAI,yBAAyB7F,EAAEqsB,iBAAiBj2B,EAAEyP,IAAI,2BAA2B7F,EAAEyY,WAAWriB,EAAEyP,IAAI,OAAO7F,EAAE4sB,QAAQx2B,EAAEyP,IAAI,eAAe7F,EAAE8rB,gBAAgBprB,OAAOqD,oBAAoB,UAAU/D,EAAEgtB,UAAU,EAAE/9B,OAAO4B,eAAe86B,GAAG,WAAW,CAACz6B,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAj7T,CAAC68B,KAAK,KAAKQ,UAAS,EAAGa,WAAW,CAACC,MAAM,uBAAuBC,UAAU,QAAQ1N,SAAQ,EAAG2N,eAAc,EAAGC,WAAW,GAAG,EAAEC,SAAS,qNAAqNR,YAAY,GAAGS,MAAM,CAACC,OAAO,EAAE/8B,MAAM,SAASg9B,SAAS,EAAEC,IAAI,EAAEjB,MAAM,GAAGkB,QAAQ,CAACF,SAAS,EAAEG,YAAY,EAAElB,SAAS,EAAEmB,IAAI,EAAEC,GAAG,MAAk+S,MAAMC,GAAG,OAAOC,GAAG,QAAQC,GAAG,QAAQ,MAAMC,WAAWl9B,EAAE,WAAA/C,GAAc+V,SAASpV,WAAW1B,OAAO4B,eAAelB,KAAK,QAAQ,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAMk/B,KAAK/gC,OAAO4B,eAAelB,KAAK,UAAU,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,OAAM,IAAK7B,OAAO4B,eAAelB,KAAK,QAAQ,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAM,OAAO7B,OAAO4B,eAAelB,KAAK,cAAc,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAM,MAAM,CAAC,YAAIo/B,GAAW,OAAOvgC,KAAK4e,QAAQyhB,EAAE,CAAC,OAAAG,CAAQnwB,GAAGrQ,KAAKuV,OAAO,eAAelF,EAAE4L,YAAY5L,EAAEoZ,KAAKpZ,EAAE8Y,MAAMloB,OAAO,IAAIjB,KAAK4P,OAAO,CAAC,QAAAmgB,GAAW/vB,KAAKygC,oBAAoBzgC,KAAK28B,OAAO,CAAC,QAAA+D,GAAW1gC,KAAK2gC,QAAQ,CAAC,kBAAAC,GAAqB,YAAYxvB,SAASyvB,gBAAgB7gC,KAAK2gC,SAAS3gC,KAAK28B,OAAO,CAAC,YAAAmE,GAAe9gC,KAAK+gC,SAAQ,EAAG/gC,KAAK28B,OAAO,CAAC,YAAAqE,GAAe,IAAI3wB,EAAErQ,KAAK+gC,SAAQ,GAAI,QAAQ1wB,EAAErQ,KAAKkpB,SAAS8C,eAAe,IAAI3b,OAAO,EAAEA,EAAE2M,YAAYhd,KAAK2gC,QAAQ,CAAC,UAAAM,GAAa,MAAM5wB,EAAErQ,KAAKkpB,SAAS,SAASlpB,KAAK4e,QAAQvO,EAAE4L,YAAY5L,EAAEoZ,OAAOpZ,EAAE8Y,MAAMloB,OAAO,EAAEoP,EAAE+c,YAAY/c,EAAE6b,QAAQ,GAAG,CAAC,iBAAAuU,GAAoBzgC,KAAKkhC,cAAclhC,KAAKkhC,YAAYvmB,SAAS3a,KAAKkhC,YAAY,KAAK,CAAC,iBAAAC,GAAoB,IAAI9wB,EAAE,IAAIrQ,KAAKuV,OAAO,gBAAgB,OAAO,KAAKvV,KAAKygC,oBAAoB,MAAMh6B,EAAEzG,KAAKkpB,SAASpY,GAAG,QAAQT,EAAE5J,EAAE0iB,MAAM1iB,EAAEgjB,aAAa,IAAIpZ,OAAO,EAAEA,EAAEuY,SAAS,GAAG,IAAIzZ,EAAEnP,KAAKuV,OAAO,oBAAoB,GAAGpG,IAAIA,GAAG,IAAI2B,EAAE7P,OAAO6P,EAAE,GAAGqX,GAAG,OAAO1hB,EAAEynB,WAAW/e,EAAE,OAAO,KAAK,MAAMgC,EAAEC,SAASM,cAAc,OAAO,OAAOkJ,EAAEzJ,EAAE,cAAchC,EAAEif,QAAQjd,GAAGnR,KAAKkhC,YAAY/vB,EAAEA,EAAE2T,aAAa3T,CAAC,CAAC,GAAA1H,GAAM,MAAM4G,EAAErQ,KAAKyG,EAAE4J,EAAE6Y,SAAS,GAAGziB,EAAE0iB,MAAMloB,OAAO,EAAE,OAAO,GAAGoP,EAAE+wB,MAAM,OAAO,MAAMtwB,EAAET,EAAEkF,OAAO,WAAWlF,EAAEuO,MAAMuhB,GAAGvlB,EAAEnU,EAAEuX,UAAU,gBAAgB,IAAI7O,EAAEkB,EAAE8wB,oBAAoBhyB,IAAIA,EAAEgV,MAAMkd,mBAAmB,GAAGvwB,MAAM3B,EAAEgV,MAAM1e,UAAU,aAAa4K,EAAE+wB,MAAM7hB,WAAW,KAAMlP,EAAE+wB,MAAM,KAAK/wB,EAAE0wB,SAAS1wB,EAAE4wB,YAAa,EAAEnwB,GAAGT,EAAE8F,KAAK,MAAM,CAAC,KAAA5M,GAAQ,MAAM8G,EAAErQ,KAAKqQ,EAAE+wB,QAAQ5hB,aAAanP,EAAE+wB,OAAO/wB,EAAE+wB,MAAM,MAAM/wB,EAAEowB,mBAAmB,CAAC,KAAA7wB,GAAQ,MAAMS,EAAErQ,KAAK,GAAGqQ,EAAE5G,MAAM4G,EAAEuO,QAAQyhB,GAAG,CAAC,GAAGhwB,EAAEkF,OAAO,gBAAgB,CAAC,MAAM9O,EAAE4J,EAAE6Y,SAASlL,UAAUvX,EAAE4M,iBAAiB,aAAahD,EAAEywB,cAAa,GAAIr6B,EAAE4M,iBAAiB,aAAahD,EAAE2wB,cAAa,EAAG,CAAC5vB,SAASiC,iBAAiB,mBAAmBhD,EAAEuwB,oBAAmB,GAAIvwB,EAAE8F,KAAK,QAAQ,CAAC,CAAC,IAAA1B,GAAO,MAAMpE,EAAErQ,KAAKyG,EAAE4J,EAAEuO,MAAM9N,EAAET,EAAE6Y,SAASlL,UAAU3N,EAAE9G,QAAQ8G,EAAEuO,MAAMyhB,GAAGvvB,EAAEsD,oBAAoB,aAAa/D,EAAEywB,cAAa,GAAIhwB,EAAEsD,oBAAoB,aAAa/D,EAAE2wB,cAAa,GAAI5vB,SAASgD,oBAAoB,mBAAmB/D,EAAEuwB,oBAAmB,GAAIlmB,EAAE5J,EAAE,gBAAgBrK,IAAI45B,IAAIhwB,EAAE8F,KAAK,OAAO,CAAC,KAAAwmB,GAAQ,MAAMtsB,EAAErQ,KAAKqQ,EAAEuO,QAAQuhB,KAAK9vB,EAAEuO,MAAMwhB,GAAG/vB,EAAE9G,QAAQ8G,EAAE8F,KAAKiqB,IAAI,CAAC,MAAAO,GAAS,MAAMtwB,EAAErQ,KAAKyG,EAAE4J,EAAE6Y,SAAS,GAAGziB,EAAEwV,YAAYxV,EAAEgjB,OAAOhjB,EAAE0iB,MAAMloB,OAAO,EAAE,GAAGoP,EAAEuO,QAAQuhB,IAAI,GAAG9vB,EAAEuO,QAAQwhB,KAAK/vB,EAAE0wB,QAAQ,CAAC,MAAMt6B,EAAE,IAAI6N,MAAM,SAAS,CAACC,SAAQ,EAAGC,YAAW,IAAKnE,EAAE8F,KAAK,SAAS1P,GAAGA,EAAEsb,kBAAkB1R,EAAE5G,KAAK,OAAO4G,EAAE5G,WAAW4G,EAAEoE,MAAM,CAAC,MAAAzC,GAAShS,KAAK4e,QAAQuhB,IAAIngC,KAAK4e,QAAQwhB,GAAGpgC,KAAKyU,OAAOzU,KAAK4P,OAAO,CAAC,MAAA4G,GAAS,MAAMnG,EAAErQ,KAAKyG,EAAE4J,EAAE6Y,SAASziB,EAAE+O,GAAG,QAAQnF,EAAEmwB,SAAS/5B,EAAE+O,GAAG,yBAAyBnF,EAAE0f,UAAUtpB,EAAE+O,GAAG,uBAAuBnF,EAAEqwB,UAAUj6B,EAAE+O,GAAG,oBAAoBnF,EAAE0f,SAAS,CAAC,MAAAxZ,GAAS,MAAMlG,EAAErQ,KAAKyG,EAAE4J,EAAE6Y,SAASziB,EAAEyP,IAAI,QAAQ7F,EAAEmwB,SAAS/5B,EAAEyP,IAAI,yBAAyB7F,EAAE0f,UAAUtpB,EAAEyP,IAAI,uBAAuB7F,EAAEqwB,UAAUj6B,EAAEyP,IAAI,oBAAoB7F,EAAE0f,UAAU1f,EAAEoE,MAAM,EAAEnV,OAAO4B,eAAeo/B,GAAG,WAAW,CAAC/+B,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAM,CAACwzB,WAAU,EAAG2M,cAAa,EAAGC,iBAAiB,KAAKC,cAAa,EAAGC,QAAQ,OAAO,MAAMC,WAAWt+B,EAAE,WAAA/C,GAAc+V,SAASpV,WAAW1B,OAAO4B,eAAelB,KAAK,MAAM,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAM,MAAM,CAAC,SAAAwgC,CAAUtxB,GAAG,MAAM5J,EAAE4J,EAAEunB,SAAS,IAAInxB,EAAE,OAAO,MAAMqK,EAAET,EAAE2N,UAAUlN,IAAIrK,EAAE4O,QAAQusB,SAAS7sB,EAAE,CAAC4f,WAAU,GAAI30B,KAAKuV,OAAO,aAAa,CAAC,EAAE,CAAC+rB,cAAa,EAAGG,QAAQzhC,KAAKuV,OAAO,WAAWgsB,iBAAiB,IAAIvhC,KAAKuV,OAAO,qBAAqB,KAAKC,GAAG,CAAC5F,MAAM,KAAKS,EAAE8F,KAAK,mBAAmB1M,IAAIhD,IAAI,IAAI0I,EAAE2B,EAAEiB,UAAU8I,IAAI,kBAAkB,QAAQ1L,EAAEkB,EAAEwnB,kBAAkB,IAAI1oB,OAAO,EAAEA,EAAEyP,SAASoY,GAAGngB,OAAOpQ,EAAEk2B,SAASloB,KAAK,KAAK3D,EAAEiB,UAAU4I,OAAO,iBAAiBtK,EAAEyqB,WAAWzqB,EAAEwxB,UAAUxxB,EAAE8F,KAAK,iBAAiBwqB,OAAO,CAACl6B,EAAEqK,KAAK,IAAI3B,EAAEgC,EAAE/R,GAAG0R,IAAIA,EAAE0D,aAAa,QAAQrF,EAAEkB,EAAEwnB,kBAAkB,IAAI1oB,OAAO,EAAEA,EAAEyP,SAASoY,GAAGngB,QAAQ,QAAQzX,EAAE,QAAQ+R,EAAEd,EAAEunB,gBAAgB,IAAIzmB,OAAO,EAAEA,EAAE6a,eAAe,IAAI5sB,OAAO,EAAEA,EAAE4d,YAAYlM,EAAEmR,qBAAqBxb,EAAE4P,cAAc,CAACurB,SAAStB,KAAKtgC,KAAK8hC,IAAIr7B,EAAE6P,QAAQsrB,SAAS,CAAC,OAAApB,CAAQnwB,GAAG,MAAM5J,EAAE4J,EAAEunB,SAAS9mB,EAAE9Q,KAAK8hC,IAAIhxB,GAAGrK,GAAGzG,KAAKuV,OAAO,iBAAiB9O,EAAEwV,YAAYxV,EAAEgjB,KAAKhjB,EAAE0iB,MAAMloB,OAAO,IAAI6P,EAAElB,OAAO,CAAC,MAAAqtB,CAAO5sB,EAAE5J,GAAG,MAAMqK,EAAE9Q,KAAK8hC,IAAI3yB,EAAEkB,EAAEunB,SAAS,IAAI9mB,IAAI3B,EAAE,OAAO,MAAMgC,EAAE1K,EAAEulB,QAAQ7a,GAAGA,EAAEqE,GAAG,iBAAiB,KAAMnF,EAAE6sB,eAAez2B,IAAIqK,EAAE2D,MAAO,GAAGpE,EAAE6sB,eAAez2B,IAAIqK,EAAE6vB,QAAQ,CAAC,SAAAtgB,CAAUhQ,EAAE5J,GAAG,IAAIqK,EAAE,MAAM3B,EAAEnP,KAAK8hC,IAAI3yB,GAAG1I,IAAIzG,KAAKuV,OAAO,QAAQ,YAAY,QAAQzE,EAAEM,SAAS2wB,qBAAqB,IAAIjxB,OAAO,EAAEA,EAAEqS,WAAWhU,EAAE6C,QAAQ,CAAC,MAAAwE,GAAS,MAAMnG,EAAErQ,KAAKyG,EAAE4J,EAAE6Y,SAASziB,EAAE+O,GAAG,gBAAgBnF,EAAEsxB,WAAWl7B,EAAE+O,GAAG,iBAAiBnF,EAAEmwB,SAAS/5B,EAAE+O,GAAG,OAAOnF,EAAE4sB,QAAQx2B,EAAE+O,GAAG,UAAUnF,EAAEgQ,UAAU,CAAC,MAAA9J,GAAS,MAAMlG,EAAErQ,KAAKyG,EAAE4J,EAAE6Y,SAASziB,EAAEyP,IAAI,gBAAgB7F,EAAEsxB,WAAWl7B,EAAEyP,IAAI,iBAAiB7F,EAAEmwB,SAAS/5B,EAAEyP,IAAI,OAAO7F,EAAE4sB,QAAQx2B,EAAEyP,IAAI,UAAU7F,EAAEgQ,UAAU,EAAE/gB,OAAO4B,eAAewgC,GAAG,WAAW,CAACngC,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAM,CAAC8I,IAAI,IAAI+3B,aAAY,EAAGT,iBAAiBlxB,IAAI,IAAI5J,EAAE,OAAO,QAAQA,EAAE4J,EAAE6Y,SAASlL,iBAAiB,IAAIvX,OAAO,EAAEA,EAAEiY,cAAc,yDAAyDrO,EAAE6Y,SAASlL,WAAWyjB,QAAQ,OAAO,MAAMQ,GAAG,CAACrsB,QAAQ,CAACoI,UAAU,8BAA8BkQ,SAAS,qBAAqBI,MAAM,kBAAkBH,MAAM,kBAAkBnR,UAAU,aAAaqV,WAAW,cAActY,UAAU,aAAamoB,UAAU,cAAc5X,SAAS,EAAEkM,SAAS,KAAK2L,SAAS,gMAAgMliC,KAAK,UAAU,IAAImiC,IAAI,SAAS/xB,GAAGA,EAAEA,EAAEsG,KAAK,GAAG,OAAOtG,EAAEA,EAAEwG,MAAM,GAAG,QAAQxG,EAAEA,EAAEgyB,OAAO,GAAG,QAAQ,CAA1E,CAA4ED,KAAKA,GAAG,CAAC,IAAI,MAAME,GAAG,YAAYC,GAAG,aAAaC,GAAG,cAAcC,GAAG,iBAAiB,IAAIC,GAAG,cAAct/B,EAAE,WAAA/C,GAAc+V,SAASpV,WAAW1B,OAAO4B,eAAelB,KAAK,OAAO,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAM,WAAW7B,OAAO4B,eAAelB,KAAK,YAAY,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAM,OAAO7B,OAAO4B,eAAelB,KAAK,QAAQ,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAM,OAAO7B,OAAO4B,eAAelB,KAAK,WAAW,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAM,OAAO7B,OAAO4B,eAAelB,KAAK,aAAa,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAM,IAAI7B,OAAO4B,eAAelB,KAAK,iBAAiB,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAM,IAAI7B,OAAO4B,eAAelB,KAAK,cAAc,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAM,IAAI7B,OAAO4B,eAAelB,KAAK,WAAW,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAM,IAAI7B,OAAO4B,eAAelB,KAAK,gBAAgB,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAM,IAAI7B,OAAO4B,eAAelB,KAAK,QAAQ,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAMihC,GAAGzrB,MAAM,CAAC,YAAIgsB,GAAW,MAAM,WAAW3iC,KAAKC,IAAI,CAAC,WAAA2iC,CAAYvyB,EAAE5J,GAAG,MAAMqK,EAAErK,EAAE0hB,GAAG1hB,EAAE0hB,GAAG9F,aAAa,EAAEvR,IAAIrK,EAAEshB,SAASjX,EAAEiX,UAAUthB,EAAEshB,UAAU,GAAGthB,EAAEg8B,IAAInyB,WAAWQ,EAAE2xB,KAAK,KAAKh8B,EAAEg8B,KAAK,EAAEh8B,EAAE+7B,IAAIlyB,WAAWQ,EAAE+xB,aAAa,KAAKp8B,EAAE+7B,KAAK,GAAGxiC,KAAKsxB,SAAS7qB,EAAE,CAAC,YAAAq8B,GAAe9iC,KAAKgpB,OAAO,CAAC,QAAA+G,GAAW,IAAI1f,EAAE,IAAIrQ,KAAK2iC,SAAS,OAAO,MAAMl8B,EAAEzG,KAAKge,UAAUlN,EAAE9Q,KAAKkpB,SAAS/Z,EAAE2B,EAAEkb,QAAQ7a,EAAEnR,KAAK43B,SAASp0B,EAAE2N,EAAEA,EAAE6a,QAAQ,KAAK3oB,EAAEyN,EAAE2Y,KAAK,GAAGta,GAAGgC,GAAG3N,EAAE,CAAC,GAAG2L,EAAEgL,WAAW,CAACO,EAAEjU,EAAEzG,KAAK2V,GAAG2sB,KAAK,IAAInzB,GAAG,QAAQkB,EAAEc,EAAEgY,MAAM9lB,UAAU,IAAIgN,OAAO,EAAEA,EAAEoY,MAAM,EAAEtZ,GAAG2B,EAAE4gB,YAAYruB,IAAIrD,KAAKyiC,IAAIziC,KAAK+iC,UAAU,IAAI3jC,EAAEoE,EAAEsd,aAAa,EAAE3R,EAAE/P,EAAEob,EAAEqC,MAAM,EAAE1N,EAAE/P,EAAEob,EAAE9R,KAAKlF,EAAEkiB,MAAM,CAAClL,GAAG,EAAErL,EAAE8J,SAAS,KAAK,MAAM7Z,EAAEqH,EAAEzG,KAAK2V,GAAG2sB,IAAInzB,EAAE6N,WAAWhd,KAAKgjC,aAAa,CAAC,CAAC,SAAAla,GAAY9oB,KAAKijC,cAAc,IAAI,MAAM5yB,KAAKrQ,KAAKkpB,SAASN,QAAQ,GAAG5oB,KAAKkjC,kBAAkB7yB,GAAGrQ,KAAKgjC,aAAa,CAAC,UAAAG,GAAa,MAAM9yB,EAAErQ,KAAKuV,OAAO,aAAa,EAAE,GAAGlF,EAAE,CAAC,MAAM5J,EAAEzG,KAAKkpB,SAAS,IAAIpY,EAAE,EAAE,IAAI,MAAMT,KAAK5J,EAAEmiB,QAAQ,GAAGvY,EAAE0X,UAAUjX,IAAI,GAAGA,EAAET,EAAE,OAAM,CAAE,CAAC,MAAM5J,EAAEzG,KAAKuV,OAAO,QAAQ,MAAM,CAAC,SAAS,WAAWrE,QAAQzK,GAAG,CAAC,CAAC,QAAA28B,CAAS/yB,GAAG,MAAM5J,EAAEzG,KAAKuV,OAAO,aAAa,GAAG,MAAM,CAACsS,KAAK7nB,KAAKkpB,SAASrT,SAASpP,EAAE,CAAC,CAAC,KAAK4J,EAAE/G,OAAO,CAAC,KAAK+G,EAAE/G,MAAM,GAAG,CAAC,KAAK+G,EAAE0X,UAAU,oFAAoF,CAAC,QAAAuJ,CAASjhB,GAAG,MAAM5J,EAAEzG,KAAK43B,SAASnxB,GAAGA,EAAE6qB,SAASjhB,EAAE/G,MAAMtJ,KAAKojC,SAAS/yB,GAAG,CAAC,SAAAgzB,GAAY,MAAMhzB,EAAE,GAAG,IAAI,MAAM5J,KAAKzG,KAAKkpB,SAASN,QAAQ,GAAGvY,EAAE3F,KAAK1K,KAAKojC,SAAS38B,IAAI,OAAO4J,CAAC,CAAC,iBAAA6yB,CAAkB7yB,GAAGrQ,KAAK2iC,WAAWtyB,EAAEkyB,IAAIlyB,EAAEoyB,KAAKpyB,EAAEmyB,IAAI/5B,KAAK8H,MAAMvQ,KAAKwiC,KAAKnyB,EAAEoyB,IAAIpyB,EAAEmyB,MAAMxiC,KAAKuiC,IAAI,CAAC,WAAAU,GAAc,MAAM5yB,EAAErQ,KAAKge,UAAU,IAAI3N,EAAE,OAAO,MAAM5J,EAAEA,GAAG6J,WAAWU,iBAAiBX,GAAG4qB,iBAAiB,aAAax0B,KAAK,EAAEzG,KAAK+iC,SAASt8B,EAAE,OAAOzG,KAAKsjC,cAAc78B,EAAE,aAAazG,KAAKuiC,IAAI97B,EAAE,UAAU,GAAGzG,KAAKyiC,IAAIh8B,EAAE,eAAe,GAAGzG,KAAKwiC,IAAI/7B,EAAE,WAAW,EAAE,CAAC,KAAAuiB,GAAQ,MAAM3Y,EAAErQ,KAAK,GAAGqQ,EAAEuO,QAAQwjB,GAAGzrB,KAAK,OAAO,GAAGtG,EAAE8yB,aAAa,YAAY9yB,EAAE8F,KAAK,YAAY,MAAM1P,EAAE4J,EAAE6Y,SAASpY,EAAErK,EAAEuX,UAAU7O,EAAEkB,EAAEgzB,YAAYlyB,EAAEd,EAAEkF,OAAO,QAAQlF,EAAEpQ,KAAKkR,EAAE,MAAM/R,EAAEiR,EAAEkF,OAAO,YAAY/R,EAAE6M,EAAEsF,GAAG,aAAatS,EAAEgN,EAAEsF,GAAG,SAAS,IAAI9C,EAAE,MAAMzT,OAAO,EAAEA,EAAEsf,cAAc,IAAIlb,GAAGqP,IAAIA,EAAEzB,SAASM,cAAc,OAAOkJ,EAAE/H,EAAErP,GAAGpE,EAAEA,EAAEwS,YAAYiB,GAAG/B,EAAEyyB,MAAM1wB,IAAI+H,EAAE/H,EAAE,MAAM1B,KAAKyJ,EAAE9J,EAAET,EAAEsF,GAAG,cAActF,EAAE2N,UAAUnL,EAAExC,EAAE4yB,cAAc,IAAIvuB,EAAE7B,EAAE6L,cAAc,IAAIrb,GAAGqR,IAAIA,EAAEtD,SAASM,cAAc,OAAOkJ,EAAElG,EAAErE,EAAEsF,GAAG,UAAU9C,EAAEjB,YAAY8C,IAAIrE,EAAEie,MAAM5Z,EAAE,MAAMG,EAAEE,EAAE,CAAC,EAAE,CAACuZ,MAAM5Z,EAAEgF,UAAS,EAAGsY,QAAO,EAAGC,KAAK,YAAY9gB,EAAE+gB,UAAS,EAAGJ,cAAc,EAAEpJ,YAAW,EAAGmJ,QAAQ,IAAI5Y,SAAS,IAAI8Y,QAAQ,CAAClY,YAAY,GAAG4S,MAAK,EAAGD,YAAW,EAAG5W,QAAQ,CAACoI,UAAU,WAAWkQ,SAAS,qBAAqBI,MAAM,kBAAkBH,MAAM,oBAAoB9d,EAAEkF,OAAO,aAAa,CAAC,EAAE,CAAC4W,KAAK,CAAC/qB,OAAOqF,GAAGmiB,OAAOzZ,IAAI2F,EAAE,IAAIrO,EAAEpG,YAAYwS,EAAEgC,GAAGC,EAAEU,GAAG,cAAc,CAAE/O,EAAEqK,KAAKT,EAAEmzB,SAAS1yB,EAAExH,OAAO+G,EAAE8F,KAAK,cAAcrF,EAAEA,EAAEqX,GAAI,GAAGrT,EAAEU,GAAG,QAAQ,KAAMnF,EAAE2yB,cAAc3yB,EAAE8F,KAAK,QAAS,GAAGrB,EAAEU,GAAG,UAAU,KAAMnF,EAAE2yB,aAAc,GAAGluB,EAAEU,GAAG,gBAAgB,CAAE/O,EAAEqK,EAAE3B,KAAKkB,EAAEwP,QAAQ1Q,EAAG,GAAGkB,EAAEunB,SAAS9iB,EAAEzE,EAAEuO,MAAMwjB,GAAGvrB,KAAK,CAAC,OAAAgJ,CAAQxP,GAAGA,EAAE4R,iBAAiB5R,EAAE6R,kBAAkB,MAAMzb,EAAEzG,KAAKkpB,UAAUC,MAAMrY,EAAE2Y,KAAKta,GAAG1I,EAAE0K,EAAEd,IAAI,GAAGA,EAAE,CAAC,MAAM5J,EAAE4J,EAAE+R,QAAQ,yBAAyB,GAAG3b,EAAE,MAAM,CAAC9C,SAAS8C,EAAE4b,QAAQohB,eAAe,GAAG,KAAK,EAAEh9B,EAAE,CAAC,MAAM,EAAE,OAAO,IAAIrH,EAAE,CAACiR,EAAE5J,KAAK,MAAMqK,EAAEM,SAASsyB,iBAAiBrzB,EAAE5J,GAAG,OAAOqK,EAAEK,EAAEL,GAAG,EAAE,OAAO,IAAI,IAAItN,EAAEH,GAAG8N,EAAEd,EAAEjP,QAAQ,GAAGoC,GAAG,EAAE,OAAO,MAAMqP,EAAE7S,KAAKyiC,IAAI/tB,EAAErE,EAAEiC,QAAQuC,EAAExE,EAAEkC,QAAQ,IAAIuC,EAAEC,GAAG3V,EAAEsV,EAAE7B,EAAEgC,IAAIxV,EAAE6V,GAAG9V,EAAEsV,EAAE7B,EAAEgC,GAAGE,GAAGG,GAAG1R,EAAEiF,KAAKsU,IAAIrI,EAAEK,EAAEmK,wBAAwBtB,OAAOnV,KAAKsU,IAAIrI,EAAEQ,EAAEgK,wBAAwBpB,MAAMhJ,EAAEzV,EAAEmE,IAAI2L,IAAI3L,EAAEA,IAAIsR,EAAEzV,EAAEyV,IAAIC,EAAEvR,EAAEsR,EAAEI,IAAI1R,EAAEnE,GAAGmE,GAAG,GAAGsN,EAAEtN,IAAIiD,EAAEylB,QAAQ1oB,EAAE,CAAC,QAAAmgC,CAAStzB,GAAG,IAAI5J,EAAE,MAAMqK,EAAE9Q,MAAMkpB,SAAS/Z,GAAG2B,EAAEK,EAAEL,EAAE8mB,SAAS,IAAIzoB,IAAIgC,EAAE,OAAO,EAAE,MAAM/R,EAAE0R,EAAEyxB,IAAI/+B,EAAEsN,EAAE2xB,IAAIp/B,EAAEyN,EAAEiyB,SAASlwB,EAAE/B,EAAEwyB,cAAc,KAAK,QAAQ78B,EAAE0K,EAAEyX,OAAOvY,UAAU,IAAI5J,OAAO,EAAEA,EAAE0hB,IAAI,OAAO,EAAE,MAAMzT,EAAE,IAAItV,EAAEoE,GAAGqR,EAAE1F,EAAEga,MAAMloB,OAAO,EAAE,IAAI6T,EAAE3F,EAAEuiB,YAAY,GAAG3c,EAAE5F,EAAEuiB,YAAY7c,GAAGxV,EAAE8P,EAAEuiB,YAAYrhB,GAAE,GAAG,GAAI6E,EAAE,EAAE5R,EAAEoR,EAAE7B,EAAExP,EAAE,MAAMqT,EAAE5B,EAAE,GAAGA,GAAG,EAAE9R,EAAE+R,EAAE,GAAGA,EAAE,EAAE,OAAO,IAAI1E,GAAG6E,EAAE5R,EAAEmF,KAAKsU,IAAIjI,GAAG9R,GAAG,IAAI8R,IAAII,GAAG5R,EAAEmF,KAAKsU,IAAIhI,KAAK1E,IAAIwE,GAAGK,EAAE5R,EAAEmF,KAAKsU,IAAIhI,IAAI,EAAE2B,IAAI,IAAI3B,IAAIG,GAAG5R,EAAEmF,KAAKsU,IAAIjI,KAAK4B,GAAG1T,GAAGkS,GAAG,EAAE5R,EAAE4R,GAAG5R,EAAEmF,KAAKsU,IAAIjI,GAAGI,GAAG5R,GAAG,EAAEmF,KAAKsU,IAAIhI,KAAKG,EAAE5R,EAAEjE,EAAE6V,CAAC,CAAC,QAAAsuB,CAAS/8B,GAAG,IAAIqK,EAAE,MAAM3B,EAAEnP,KAAK,IAAImP,EAAEwzB,SAAS,OAAO,MAAMzZ,SAAS/X,GAAGhC,EAAE/P,EAAE+P,EAAEyoB,SAAS,GAAGzmB,GAAG/R,EAAE,CAAC,MAAMoE,EAAE,QAAQsN,EAAE1R,EAAEwpB,OAAOniB,UAAU,IAAIqK,OAAO,EAAEA,EAAEqX,GAAG,GAAG3kB,GAAGA,EAAE+jB,WAAWtmB,OAAO,CAAC,IAAI6P,EAAET,EAAE,EAAE5H,KAAKsU,IAAI5L,EAAEugB,YAAYjrB,KAAKrH,EAAEiR,EAAElB,EAAEw0B,SAASl9B,IAAIjD,EAAE2gB,MAAMa,YAAY,aAAalU,EAAEA,EAAE,GAAG,IAAItN,EAAE2gB,MAAMa,YAAY,UAAU5lB,EAAE,GAAG,CAAC,CAAC,CAAC,WAAA4jC,GAAc,MAAM3yB,EAAErQ,KAAK,IAAIqQ,EAAEsyB,SAAS,OAAO,MAAMzZ,SAASziB,EAAE6nB,MAAMxd,GAAGT,EAAElB,EAAE1I,EAAEulB,QAAQ7a,EAAEd,EAAEunB,SAAS,KAAKnxB,GAAGqK,GAAG3B,GAAGgC,GAAG,OAAO,GAAGhC,EAAEyP,QAAQlI,EAAEC,MAAMxH,EAAEyP,QAAQlI,EAAEM,QAAQ,OAAO,IAAI,MAAMlG,KAAKrK,EAAEmiB,OAAOvY,EAAEmzB,SAAS1yB,EAAExH,OAAO,IAAIlK,GAAGiR,EAAEoyB,IAAIpyB,EAAE0yB,WAAW5xB,EAAEyX,OAAO3nB,QAAQ,GAAG6P,EAAEqT,MAAMa,YAAY,UAAU5lB,EAAE,GAAG,CAAC,OAAAgqB,GAAU,MAAM/Y,EAAErQ,KAAKqQ,EAAEunB,UAAUvnB,EAAEunB,SAASzQ,UAAU9W,EAAEunB,SAAS,KAAKvnB,EAAE2N,WAAW3N,EAAE2N,UAAUrD,SAAStK,EAAE2N,UAAU,KAAK3N,EAAEie,OAAOje,EAAEie,MAAM3T,SAAStK,EAAEie,MAAM,KAAKje,EAAEuO,MAAMwjB,GAAGzrB,KAAK+D,EAAErK,EAAE6Y,SAASlL,UAAU3N,EAAEsF,GAAG,aAAa,CAAC,MAAAa,GAAS,MAAMnG,EAAErQ,KAAKyG,EAAE4J,EAAE6Y,SAASziB,EAAE+O,GAAG,YAAYnF,EAAEuyB,aAAan8B,EAAEmY,QAAQ8I,EAAE/Q,KAAKlQ,EAAE+O,GAAG,aAAanF,EAAEyyB,cAAczyB,EAAEyyB,eAAer8B,EAAE+O,GAAG,CAAC,SAAS,0BAA0BnF,EAAE0f,UAAUtpB,EAAE+O,GAAG,kBAAkBnF,EAAEyY,UAAU,CAAC,MAAAvS,GAAS,MAAMlG,EAAErQ,KAAKyG,EAAE4J,EAAE6Y,SAASziB,EAAEyP,IAAI,YAAY7F,EAAEuyB,aAAan8B,EAAEyP,IAAI,aAAa7F,EAAEyyB,cAAcr8B,EAAEyP,IAAI,CAAC,SAAS,0BAA0B7F,EAAE0f,UAAUtpB,EAAEyP,IAAI,kBAAkB7F,EAAEyY,WAAWzY,EAAE+Y,SAAS,GAAG9pB,OAAO4B,eAAewhC,GAAG,WAAW,CAACnhC,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAM8gC,KAAK,MAAM2B,GAAGtkC,OAAO0V,OAAO1V,OAAO0V,OAAO,CAAC,EAAEitB,IAAI,CAACh4B,IAAI,IAAI45B,aAAY,EAAGrN,SAAS,OAAOsN,GAAG,YAAYC,GAAG,cAAc,MAAMC,WAAW5gC,EAAE,WAAA/C,GAAc+V,SAASpV,WAAW1B,OAAO4B,eAAelB,KAAK,MAAM,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAM,OAAO7B,OAAO4B,eAAelB,KAAK,SAAS,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,OAAM,GAAI,CAAC,aAAI6rB,GAAY,MAAM3c,EAAErQ,KAAK8hC,IAAI,OAAOzxB,IAAIA,EAAE8yB,YAAY,CAAC,YAAIc,GAAW,OAAOjkC,KAAKkkC,MAAM,CAAC,OAAArkB,CAAQxP,EAAE5J,GAAGA,EAAEyb,iBAAiB,CAAC,aAAA2W,CAAcxoB,EAAE5J,GAAG,IAAIqK,EAAE3B,EAAEgC,EAAE,MAAM/R,GAAG,QAAQ+R,EAAE,QAAQhC,EAAE,QAAQ2B,EAAE9Q,KAAKkpB,gBAAgB,IAAIpY,OAAO,EAAEA,EAAE8mB,gBAAgB,IAAIzoB,OAAO,EAAEA,EAAEyZ,OAAOniB,EAAE6C,cAAc,IAAI6H,OAAO,EAAEA,EAAElR,OAAO,GAAGuD,EAAEiD,EAAE0hB,GAAG,GAAG3kB,GAAGpE,EAAE,CAAC,IAAIiR,EAAE,OAAOjR,IAAI,CAAC,QAAQ,UAAU,QAAQ,cAAc6W,SAAS7W,KAAKiR,GAAG,cAAcuK,EAAEpX,EAAE6M,EAAE,CAAC,CAAC,MAAA8zB,GAAS,IAAI9zB,EAAE,MAAM5J,EAAEzG,KAAK8Q,EAAErK,EAAEyiB,SAAS/Z,EAAE2B,EAAE8mB,SAAS,GAAGnxB,EAAEq7B,MAAM3yB,EAAE,OAAO,MAAMgC,EAAE1K,EAAE8O,OAAO,aAAazE,EAAEszB,QAAQtzB,EAAEkN,UAAU,IAAI7M,EAAE,OAAO,MAAM/R,EAAE2V,EAAE,CAAC,EAAEtO,EAAE4O,QAAQ,CAACmhB,SAASrlB,EAAEyE,QAAQ,CAACoI,UAAU,6BAA6BgW,SAAS,CAAC7H,KAAK,CAAClT,SAASnI,EAAEyE,OAAO,sBAAsB,IAAIC,GAAG,CAACulB,MAAM1qB,IAAI,MAAMS,EAAET,EAAE2N,UAAUlN,GAAG9Q,KAAKkkC,SAASz9B,EAAEsiB,UAAUjY,EAAEqT,MAAMuE,WAAW,OAAOjiB,EAAE49B,OAAOvzB,EAAEgU,aAAatG,eAAe,KAAM1N,EAAEqT,MAAMuE,WAAW,GAAGjiB,EAAE69B,MAAO,QAAQllC,EAAE40B,SAAS50B,EAAE40B,UAAU,CAAC,EAAE50B,EAAE40B,SAASxe,GAAGT,GAAG,QAAQ1E,EAAE5J,EAAE4O,QAAQ2e,gBAAgB,IAAI3jB,OAAO,EAAEA,EAAEmF,KAAK,CAAC,EAAE,CAAC4D,MAAMpZ,KAAK6f,QAAQ0kB,YAAYvkC,KAAK64B,gBAAgB1pB,EAAEkG,QAAQmvB,OAAOplC,EAAE+P,EAAEkH,cAAc,CAACmuB,OAAO9B,KAAKj8B,EAAEq7B,IAAI3yB,EAAEmH,QAAQkuB,OAAO/9B,EAAE8O,OAAO,iBAAiB9O,EAAEq7B,IAAIljB,MAAMwjB,GAAGC,OAAO57B,EAAEy9B,QAAO,EAAG,CAAC,QAAA5kB,GAAW,IAAIjP,EAAE,MAAM5J,EAAE,QAAQ4J,EAAErQ,KAAK8hC,WAAW,IAAIzxB,OAAO,EAAEA,EAAE2N,UAAUvX,IAAIA,EAAE0d,MAAM/C,UAAU,GAAG,CAAC,SAAAf,CAAUhQ,EAAE5J,GAAG,MAAMqK,EAAE9Q,KAAKuV,OAAO,OAAOzE,GAAGA,IAAIrK,GAAGzG,KAAKgS,QAAQ,CAAC,MAAAA,GAAS,MAAM3B,EAAErQ,KAAK8hC,IAAI,GAAGzxB,IAAIA,EAAE8yB,aAAa,OAAO9yB,EAAEuO,QAAQwjB,GAAGC,QAAQhyB,EAAEuO,MAAMwjB,GAAGzrB,UAAUtG,EAAE2Y,cAAchpB,KAAKkkC,OAAOlkC,KAAKskC,OAAOtkC,KAAKqkC,OAAO,CAAC,IAAAC,GAAO,MAAMj0B,EAAErQ,KAAK8hC,IAAI,IAAIzxB,GAAGA,EAAE8yB,aAAa,OAAO,MAAM18B,EAAE4J,EAAE2N,UAAUvX,IAAIzG,KAAK+oB,UAAUtiB,EAAEqe,aAAare,EAAE+e,gBAAgBue,IAAIt9B,EAAEsL,UAAU4I,OAAOmpB,IAAI9jC,KAAKkkC,QAAO,EAAG,CAAC,IAAAG,GAAO,MAAMh0B,EAAErQ,KAAK8hC,IAAIr7B,EAAE4J,GAAGA,EAAE2N,UAAUvX,IAAIzG,KAAK+oB,UAAUtiB,EAAEqe,aAAare,EAAEsL,UAAU8I,IAAIipB,IAAIr9B,EAAEgf,aAAase,GAAG,SAAS/jC,KAAKkkC,QAAO,CAAE,CAAC,OAAAnb,GAAU,MAAM1Y,EAAErQ,KAAK8hC,IAAI,IAAIzxB,IAAIA,EAAEuO,MAAM,OAAO,MAAMnY,EAAE4J,EAAE2N,UAAUlN,GAAG,MAAMrK,OAAO,EAAEA,EAAEkL,aAAa,KAAKlL,GAAGqK,GAAGA,EAAEyW,WAAWtmB,SAASwF,EAAE0d,MAAM/C,UAAU,GAAGtQ,EAAEoO,wBAAwB7G,WAAW,CAAC,MAAA7B,GAAS,MAAMnG,EAAErQ,KAAKyG,EAAE4J,EAAE6Y,SAASziB,EAAEmY,QAAQmY,GAAGpgB,KAAKlQ,EAAE+O,GAAG,gBAAgBnF,EAAE8zB,QAAQ9zB,EAAE8zB,SAAS19B,EAAE+O,GAAG,SAASnF,EAAEiP,UAAU7Y,EAAE+O,GAAG,UAAUnF,EAAEgQ,UAAU,CAAC,MAAA9J,GAAS,IAAIlG,EAAE,MAAM5J,EAAEzG,KAAK8Q,EAAErK,EAAEyiB,SAASpY,EAAEoF,IAAI,gBAAgBzP,EAAE09B,QAAQrzB,EAAEoF,IAAI,SAASzP,EAAE6Y,UAAUxO,EAAEoF,IAAI,UAAUzP,EAAE4Z,WAAW,QAAQhQ,EAAES,EAAE8mB,gBAAgB,IAAIvnB,GAAGA,EAAEoG,cAAc,CAAC,WAAWhQ,EAAEq7B,IAAI,IAAI,EAAExiC,OAAO4B,eAAe8iC,GAAG,WAAW,CAACziC,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAMyiC,KAAK,MAAMa,GAAG,CAACC,QAAQ,CAACC,KAAK,oDAAoDC,OAAO,CAACphB,MAAM,MAAMqhB,SAAS,CAACF,KAAK,qDAAqDC,OAAO,CAACphB,KAAK,MAAMshB,MAAM,CAACH,KAAK,sDAAsDC,OAAO,CAACnhB,MAAM,MAAMshB,QAAQ,CAACJ,KAAK,sDAAsDC,OAAO,CAACnhB,KAAK,MAAM0C,OAAO,CAACwe,KAAK,yFAAyFK,OAAO,UAAU5e,QAAQ,CAACue,KAAK,kFAAkFK,OAAO,WAAWC,WAAW,CAACN,KAAK,oUAAoUK,OAAO,cAAcve,WAAW,CAACke,KAAK,qIAAqIK,OAAO,cAAcpe,YAAY,CAAC+d,KAAK,qIAAqIK,OAAO,eAAene,UAAU,CAAC8d,KAAK,oIAAoIK,OAAO,aAAale,SAAS,CAAC6d,KAAK,gIAAgIK,OAAO,YAAYrf,MAAM,CAACgf,KAAK,wFAAwFK,OAAO,SAASpf,MAAM,CAAC+e,KAAK,yFAAyFK,OAAO,SAASje,KAAK,CAAC4d,KAAK,+GAA+GK,OAAO,QAAQhe,KAAK,CAAC2d,KAAK,4GAA4GK,OAAO,QAAQ9d,MAAM,CAACyd,KAAK,iGAAiGK,OAAO,SAAS/gB,SAAS,CAAC0gB,KAAK,uJAAuJK,OAAO,aAAa,IAAIE,IAAI,SAAS70B,GAAGA,EAAEA,EAAEsG,KAAK,GAAG,OAAOtG,EAAEA,EAAEwG,MAAM,GAAG,QAAQxG,EAAEA,EAAE80B,SAAS,GAAG,UAAU,CAA9E,CAAgFD,KAAKA,GAAG,CAAC,IAAI,MAA4yDE,GAAG,CAACC,SAAS,KAAKjtB,MAAM,KAAKC,OAAO,KAAKitB,QAAQ,YAAYC,MAAM,8BAA8BC,GAAG,cAAcC,GAAG,oBAAoB,MAAMC,WAAWtiC,EAAE,WAAA/C,GAAc+V,SAASpV,WAAW1B,OAAO4B,eAAelB,KAAK,QAAQ,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAM+jC,GAAGvuB,OAAOrX,OAAO4B,eAAelB,KAAK,YAAY,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAM,MAAM,CAAC,OAAAq/B,CAAQnwB,GAAG,IAAI5J,EAAE,IAAI4J,EAAEunB,SAAS,OAAO,IAAI9mB,EAAE9Q,KAAKuV,OAAO,WAAWpG,EAAEnP,KAAKuV,OAAO,YAAYpE,EAAEnR,KAAKuV,OAAO,WAAW,GAAG,SAASpE,EAAE,CAAC,MAAMd,EAAErQ,KAAKkpB,SAAS0O,SAAS,IAAInxB,EAAE,EAAE,GAAG4J,EAAE,IAAI,MAAMS,KAAKT,EAAEuY,QAAQ9X,EAAEkb,SAAS,UAAUlb,EAAE7Q,OAAOwG,IAAIA,IAAI0K,GAAE,EAAG,CAACA,IAAIL,OAAO,GAAG,IAAI1R,EAAE,EAAE,MAAMoE,EAAE,CAACsa,KAAK,GAAG6nB,OAAO,GAAG/nB,MAAM,IAAI,GAAG9M,EAAE,IAAI,MAAMT,IAAI,CAAC,OAAO,SAAS,SAAS,IAAI,MAAMlB,KAAK2B,EAAET,GAAG,CAAC,MAAMS,EAAE9Q,KAAK4lC,SAASz2B,GAAG2B,IAAI,QAAQrK,EAAEjD,EAAE6M,UAAU,IAAI5J,GAAGA,EAAEiE,KAAKoG,GAAG1R,IAAI,CAAC,IAAIiE,EAAE,KAAK,GAAGjE,IAAIiE,EAAErD,KAAK6lC,mBAAmBxiC,EAAE,CAAC,IAAI,MAAMgN,EAAE5J,KAAKnH,OAAO+J,QAAQ7F,GAAG,CAAC,MAAMsN,EAAEM,SAASM,cAAc,OAAOkJ,EAAE9J,EAAE20B,GAAG,eAAep1B,GAAG,IAAI,MAAMA,KAAK5J,EAAEqK,EAAEc,YAAYvB,GAAG,SAASlB,GAAG,WAAWkB,GAAG5J,EAAExF,SAASkO,GAAE,GAAI9L,EAAEuO,YAAYd,EAAE,EAAC,IAAK3B,GAAGyL,EAAEvX,EAAE,eAAerD,KAAK4e,MAAMsmB,GAAGruB,MAAM7W,KAAK8oB,WAAW,MAAM9oB,KAAK4e,MAAMsmB,GAAGC,QAAQ,CAAC,OAAAtlB,CAAQxP,GAAG,IAAI5J,EAAEqK,EAAE,MAAM3B,EAAEnP,KAAKkpB,SAAS/X,EAAEhC,EAAE0oB,WAAWz4B,EAAE,MAAM+R,OAAO,EAAEA,EAAE6a,QAAQxoB,EAAE6M,EAAEjP,OAAOiC,EAAEG,GAAGiX,EAAEjX,GAAGA,EAAE6e,QAAQ,KAAK,IAAIhf,EAAE,OAAO,QAAQ,IAAIA,EAAEyiC,qBAAqB,OAAOz1B,EAAE4R,iBAAiB5R,EAAE6R,uBAAuB,QAAQzb,EAAE0I,EAAEmH,QAAQkuB,cAAc,IAAI/9B,GAAGA,EAAEuL,UAAU,QAAQ,IAAI3O,EAAE0iC,yBAAyB,OAAO11B,EAAE4R,iBAAiB5R,EAAE6R,uBAAuBliB,KAAKkpB,SAAS8c,mBAAmB,QAAQ,IAAI3iC,EAAE4iC,wBAAwB,CAAC51B,EAAE4R,iBAAiB5R,EAAE6R,kBAAkB,MAAMzb,EAAE,QAAQqK,EAAE3B,EAAEyoB,gBAAgB,IAAI9mB,OAAO,EAAEA,EAAEwF,QAAQsrB,SAAS,IAAIzwB,EAAE1K,EAAE85B,SAAS,OAAOnhC,GAAG,cAAcA,EAAEkZ,UAAUnH,GAAG/R,EAAE8nB,aAAa/V,EAAE1K,EAAEgO,OAAOhO,EAAEmJ,QAAQ,CAAC,MAAMiD,EAAExP,EAAEkf,cAAc7N,EAAErR,EAAEif,cAAc,IAAI5N,GAAG7B,KAAKxC,EAAE4R,iBAAiB5R,EAAE6R,mBAAmBxN,EAAE,CAAC,IAAIrE,EAAE,CAAC,EAAE,IAAIA,EAAEmS,KAAKC,MAAM/N,EAAE,CAAC,MAAMrE,GAAG,CAACjR,GAAGA,EAAEwjB,YAAYvS,EAAE,MAAMwC,GAAGzT,GAAGA,EAAEyT,IAAIzT,EAAEyT,IAAI,CAAC,QAAAkd,GAAW/vB,KAAK8oB,WAAW,CAAC,SAAAA,GAAY,GAAG9oB,KAAKkpB,SAASwQ,YAAY,OAAO,MAAMrpB,EAAErQ,KAAKge,UAAU,IAAI3N,EAAE,OAAO,MAAM5J,EAAEzG,KAAKkpB,SAAS2O,WAAW,IAAIpxB,GAAGA,EAAEmY,QAAQoY,GAAGngB,MAAM,OAAO,MAAM/F,EAAErK,IAAIA,EAAEu0B,OAAOv0B,EAAEulB,QAAQ,IAAI,MAAMvlB,KAAK4J,EAAEiV,iBAAiB,yBAAyBxU,GAAGrK,EAAE+e,gBAAgB,YAAY/e,EAAE+e,gBAAgB,cAAc/e,EAAEgf,aAAa,WAAW,IAAIhf,EAAEgf,aAAa,WAAW,OAAO,IAAItW,EAAE2B,GAAGA,EAAEkJ,YAAY7I,EAAEL,GAAGA,EAAEmJ,aAAa,IAAI,MAAMxT,KAAK4J,EAAEiV,iBAAiB,kCAAkCnW,GAAG1I,EAAE+e,gBAAgB,YAAY/e,EAAE+e,gBAAgB,cAAc/e,EAAEgf,aAAa,WAAW,IAAIhf,EAAEgf,aAAa,WAAW,OAAO,IAAI,MAAMhf,KAAK4J,EAAEiV,iBAAiB,mCAAmCnU,GAAG1K,EAAE+e,gBAAgB,YAAY/e,EAAE+e,gBAAgB,cAAc/e,EAAEgf,aAAa,WAAW,IAAIhf,EAAEgf,aAAa,WAAW,OAAO,IAAI,MAAMhf,KAAK4J,EAAEiV,iBAAiB,0EAA0E,CAACnU,GAAGhC,GAAG1I,EAAE+e,gBAAgB,YAAY/e,EAAE+e,gBAAgB,cAAc/e,EAAEgf,aAAa,WAAW,IAAIhf,EAAEgf,aAAa,WAAW,OAAO,MAAMpV,EAAE5J,EAAEiY,cAAc,KAAKrO,IAAIA,EAAE8T,MAAMoB,QAAQpW,EAAE,GAAG,OAAO,CAAC,CAAC,MAAA8tB,CAAO5sB,EAAE5J,GAAG,IAAIqK,EAAE,QAAQA,EAAErK,EAAEulB,eAAe,IAAIlb,GAAGA,EAAE0E,GAAG,iBAAiB,KAAMxV,KAAKkpB,SAASgU,eAAez2B,IAAIzG,KAAK8oB,WAAY,GAAG9oB,KAAKkpB,SAASgU,eAAez2B,IAAIzG,KAAK8oB,WAAW,CAAC,eAAA+c,GAAkB,MAAMx1B,EAAErQ,KAAKkpB,SAASlL,UAAU,IAAI3N,EAAE,OAAO,KAAK,MAAM5J,EAAEzG,KAAKuV,OAAO,aAAalF,EAAE,IAAIS,EAAErK,EAAEiY,cAAc,IAAI+mB,IAAI,OAAO30B,IAAIA,EAAEM,SAASM,cAAc,OAAOkJ,EAAE9J,EAAE20B,IAAIh/B,EAAE2nB,QAAQtd,IAAIA,EAAEuC,iBAAiB,QAAQrT,KAAK6f,QAAQ,CAACjN,SAAQ,EAAGkN,SAAQ,IAAKzP,GAAGuK,EAAEvK,EAAEm1B,IAAIxlC,KAAKge,UAAUlN,EAAEA,CAAC,CAAC,QAAA80B,CAASv1B,GAAG,MAAM5J,EAAEzG,KAAKkpB,SAASpY,EAAErK,EAAEmxB,SAAS,IAAI9mB,EAAE,OAAO,KAAK,GAAG,aAAaT,EAAE,OAAO,KAAK,GAAG,eAAeA,IAAIgjB,KAAK,OAAO,KAAK,IAAIliB,EAAE,KAAK,MAAM/R,EAAE0R,EAAE8X,OAAO3nB,QAAQ,EAAE,IAAIuC,EAAE,EAAEH,EAAE,EAAE,IAAI,MAAMgN,KAAKS,EAAE8X,QAAQvY,EAAE2b,SAAS,UAAU3b,EAAEpQ,OAAOuD,KAAK,UAAU6M,EAAEpQ,MAAMoQ,EAAE61B,cAAc7iC,IAAI,GAAGjE,EAAE,GAAG,CAAC,UAAU,OAAO,QAAQ6W,SAAS5F,GAAG,OAAOc,EAAE,QAAQ,IAAIszB,GAAGp0B,KAAK7M,EAAE,OAAO,KAAK,GAAG,aAAa6M,IAAIhN,EAAE,OAAO,KAAK,GAAG,WAAWgN,EAAE,CAAC,MAAMA,EAAE5J,EAAE6P,QAAQkuB,OAAO,IAAIn0B,IAAIA,EAAE2c,UAAU,OAAO,IAAI,CAAC,GAAG,cAAc3c,KAAOS,EAAEwF,QAAQsrB,UAAUxiC,EAAE,GAAE,OAAO,KAAK,QAAQ,IAAIqlC,GAAGp0B,GAAG,CAAC,MAAM5J,EAAEg+B,GAAGp0B,GAAGc,EAAEC,SAASM,cAAc,UAAUP,EAAEsU,aAAa,QAAQzlB,KAAKkpB,SAASrT,SAAS,KAAKxF,EAAEya,oBAAoBlQ,EAAEzJ,EAAE,YAAY1K,EAAEu+B,SAAS7zB,EAAEkR,QAAQE,cAAc9b,EAAEu+B,QAAQv+B,EAAEm+B,SAASzzB,EAAEkR,QAAQC,cAAcE,KAAKua,UAAUt2B,EAAEm+B,SAASzzB,EAAES,YAAYzC,EAAEnP,KAAKkpB,SAASrT,SAASpP,EAAEk+B,OAAO,KAAK,CAAC,MAAMl+B,GAAGzG,KAAKuV,OAAO,UAAU,IAAIlF,GAAG5J,IAAI0K,EAAEhC,EAAEnP,KAAKkpB,SAASrT,SAASpP,EAAEmwB,MAAM,mBAAmBnwB,EAAE2S,OAAOjI,EAAEkC,iBAAiB,QAAShD,IAAIA,EAAE4R,iBAAiB5R,EAAE6R,kBAAkB,mBAAmBzb,EAAE2S,OAAO3S,EAAE2S,MAAMrZ,KAAKC,KAAKA,KAAKqQ,EAAG,GAAG,CAAC,MAAMwC,EAAE,MAAM1B,OAAO,EAAEA,EAAEuN,cAAc,OAAO,GAAG7L,EAAE,IAAI,MAAMxC,EAAE5J,KAAKnH,OAAO+J,QAAQ+7B,IAAIvyB,EAAEkS,aAAa1U,IAAIwC,EAAE4S,aAAapV,EAAEhB,OAAO5I,IAAI,OAAO0K,CAAC,CAAC,eAAAg1B,GAAkB,MAAM91B,EAAErQ,KAAKge,UAAU3N,GAAGA,EAAEsK,SAAS3a,KAAKge,UAAU,KAAKhe,KAAK4e,MAAMsmB,GAAGC,SAAS,MAAM1+B,EAAEzG,KAAKkpB,SAASlL,UAAUvX,GAAGiU,EAAEjU,EAAE++B,GAAG,CAAC,MAAAhvB,GAAS,MAAMnG,EAAErQ,KAAKyG,EAAE4J,EAAE6Y,SAASziB,EAAE+O,GAAG,sBAAsBnF,EAAEmwB,SAAS/5B,EAAE+O,GAAG,OAAOnF,EAAE4sB,QAAQx2B,EAAE+O,GAAG,CAAC,SAAS,mBAAmBnF,EAAE0f,UAAU1f,EAAEmwB,QAAQnwB,EAAE6Y,SAAS,CAAC,MAAA3S,GAAS,MAAMlG,EAAErQ,KAAKyG,EAAE4J,EAAE6Y,SAASziB,EAAEyP,IAAI,sBAAsB7F,EAAEmwB,SAAS/5B,EAAEyP,IAAI,OAAO7F,EAAE4sB,QAAQx2B,EAAEyP,IAAI,CAAC,SAAS,mBAAmB7F,EAAE0f,UAAU1f,EAAE81B,iBAAiB,EAAE7mC,OAAO4B,eAAewkC,GAAG,WAAW,CAACnkC,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAphO,CAACilC,SAAS,OAAO7gB,QAAQ,CAACzH,KAAK,CAAC,WAAW6nB,OAAO,GAAG/nB,MAAM,CAAC,cAAc,YAAY,aAAa,SAAS,UAAUgU,QAAQ,OAAOyU,MAAM,CAACC,QAAQ,CAAC1P,IAAI,kIAAkI2P,SAAS,CAAC3P,IAAI,gLAAgLjM,KAAK,CAACiM,IAAI,8GAA8GhM,KAAK,CAACgM,IAAI,6GAA6G4P,UAAU,CAAC5P,IAAI,sLAAsL6P,WAAW,CAAC7P,IAAI,+UAA+U8P,OAAO,CAAC9P,IAAI,gZAAgZ2B,MAAM,CAAC3B,IAAI,iIAAiIJ,SAAS,QAAkwK,MAAMmQ,GAAG,CAACv9B,KAAK,cAAchG,EAAE,OAAAo9B,GAAUlJ,IAAG,CAAE,CAAC,QAAAvH,CAAS1f,GAAGmnB,IAAIhY,aAAagY,IAAI,MAAMS,KAAKxxB,GAAGgxB,MAAMQ,KAAKnnB,GAAGonB,KAAK/oB,EAAEkB,EAAEspB,eAAetpB,EAAEwnB,YAAY1oB,IAAIkoB,GAAGvmB,IAAIrK,EAAE,GAAGqK,GAAGrK,GAAGA,IAAIqK,IAAI0mB,GAAGjY,WAAW,KAAM,IAAI,GAAGlP,EAAEuO,QAAQmY,GAAGlgB,MAAM,CAAC,IAAIxG,EAAE,eAAelB,IAAIooB,KAAKlnB,EAAE,YAAYknB,IAAG,GAAIxmB,OAAO61B,QAAQv2B,GAAG,CAAC,EAAEe,SAASy1B,MAAM91B,OAAO+1B,SAASC,SAASh2B,OAAO+1B,SAAShL,OAAOr1B,EAAE,CAAC,CAAC,MAAM4J,GAAG,CAAE,EAAE,KAAK,CAAC,OAAA4oB,CAAQ5oB,GAAG,GAAGmnB,IAAIhY,aAAagY,KAAKF,IAAIC,GAAG,OAAOA,IAAG,EAAGD,IAAG,OAAQvmB,OAAO61B,QAAQI,OAAO,IAAI1P,GAAG,IAAIvmB,OAAO61B,QAAQK,aAAa,CAAC,EAAE71B,SAASy1B,MAAM91B,OAAO+1B,SAASC,SAASh2B,OAAO+1B,SAAShL,QAAQzE,IAAI,IAAI,CAAC,MAAMhnB,GAAG,CAAC,CAAC,MAAAmG,GAAS,MAAMnG,EAAErQ,KAAKkpB,SAAS7Y,EAAEmF,GAAG,QAAQxV,KAAKwgC,SAASnwB,EAAEmF,GAAG,CAAC,iBAAiB,mBAAmBxV,KAAK+vB,UAAU1f,EAAEmF,GAAG,QAAQxV,KAAKi5B,QAAQ,CAAC,MAAA1iB,GAAS,MAAMlG,EAAErQ,KAAKkpB,SAAS7Y,EAAE6F,IAAI,QAAQlW,KAAKwgC,SAASnwB,EAAE6F,IAAI,CAAC,iBAAiB,mBAAmBlW,KAAK+vB,UAAU1f,EAAE6F,IAAI,QAAQlW,KAAKi5B,QAAQ,CAAC,eAAOiO,GAAW,OAAOhP,IAAI,CAAC,mBAAOiP,GAAe/O,IAAI,CAAC,cAAOjR,GAAUpW,OAAOqD,oBAAoB,aAAaokB,IAAG,EAAG,GAAG4O,KAAKpL,GAAGqL,OAAOzO,GAAG0O,UAAU5F,GAAG8C,OAAOR,GAAGuD,QAAQ7B,IAAI8B,GAAG,gBAAgBC,GAAG,iBAAiBC,GAAG,kCAAkCC,GAAG,yBAAyBC,GAAG,cAAcC,GAAG,eAAeC,GAAG,cAAcC,GAAG,aAAaC,GAAG,aAAaC,GAAG,aAAaC,GAAG,cAAcC,GAAG,WAAWC,GAAG,WAAWC,GAAG,WAAWC,GAAG,OAAOC,GAAG,MAAMC,GAAGn4B,GAAG,iBAAiBA,EAAEo4B,GAAG,WAAW,IAAIp4B,EAAEU,OAAOoR,eAAe,QAAQ9R,GAAG,UAAUA,EAAEpQ,IAAI,EAAE,IAAIyoC,GAAGC,GAAG,KAAKC,GAAG,KAAKC,GAAG,EAAEC,GAAG,EAAEC,GAAG,EAAEC,GAAG,EAAE,MAAMC,GAAG,IAAIngC,IAAI,IAAIogC,GAAG,EAAE,MAAMxR,WAAWp0B,EAAE,UAAI6lC,GAAS,OAAOnpC,KAAKg1B,IAAI,CAAC,aAAI8F,GAAY,OAAO96B,KAAKuV,OAAO,UAAU,CAAC,WAAAlV,CAAYgQ,EAAE,GAAG5J,EAAE,CAAC,EAAEqK,EAAE,CAAC,GAAGsF,MAAM3P,GAAGnH,OAAO4B,eAAelB,KAAK,aAAa,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAM,KAAK7B,OAAO4B,eAAelB,KAAK,cAAc,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAM,CAAC,IAAI7B,OAAO4B,eAAelB,KAAK,OAAO,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,OAAM,IAAK7B,OAAO4B,eAAelB,KAAK,YAAY,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAM,OAAO7B,OAAO4B,eAAelB,KAAK,aAAa,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAM,OAAO7B,OAAO4B,eAAelB,KAAK,MAAM,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAM,IAAI7B,OAAO4B,eAAelB,KAAK,oBAAoB,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,OAAM,IAAK7B,OAAO4B,eAAelB,KAAK,YAAY,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,OAAM,IAAK7B,OAAO4B,eAAelB,KAAK,QAAQ,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAM41B,GAAGpgB,OAAOrX,OAAO4B,eAAelB,KAAK,KAAK,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAM,IAAI7B,OAAO4B,eAAelB,KAAK,YAAY,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAM,OAAO7B,OAAO4B,eAAelB,KAAK,UAAU,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAM,OAAO7B,OAAO4B,eAAelB,KAAK,SAAS,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAM,OAAO7B,OAAO4B,eAAelB,KAAK,WAAW,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAM,OAAO7B,OAAO4B,eAAelB,KAAK,YAAY,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAM,OAAO7B,OAAO4B,eAAelB,KAAK,qBAAqB,CAACuB,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,WAAW,IAAIunC,KAAKA,GAAGrV,MAAMrzB,KAAKwS,GAAG/L,EAAE+L,MAAM02B,GAAGD,GAAGx/B,IAAIzJ,KAAKwS,GAAGxS,MAAMA,KAAKopC,WAAW/4B,EAAErQ,KAAKutB,YAAYzc,EAAE0N,eAAe,KAAMxe,KAAK2tB,MAAO,EAAE,CAAC,IAAAA,GAAO,GAAG3tB,KAAK4e,QAAQmY,GAAG/f,QAAQ,OAAOhX,KAAK4e,MAAMmY,GAAGpgB,KAAK3W,KAAKqW,cAAc/W,OAAO0V,OAAO1V,OAAO0V,OAAO,CAAC,EAAE0iB,GAAGxZ,SAASle,KAAKutB,cAAcvtB,KAAKmW,KAAK,QAAQnW,KAAKmW,KAAK,kBAAiB,IAAKnW,KAAKuV,OAAO,kBAAkB,MAAM,IAAIod,GAAG,OAAO,MAAMtiB,EAAEe,SAAS3K,EAAE4J,EAAEgB,KAAKP,EAAET,EAAE4W,gBAAgB,GAAGxgB,EAAEsL,UAAUsM,SAASopB,IAAI,OAAO,IAAIt4B,EAAE4B,OAAO0M,WAAW3M,EAAEoO,wBAAwB9G,MAAM,MAAMjH,EAAEb,WAAWS,OAAOC,iBAAiBvK,GAAG4iC,aAAal6B,EAAE,IAAIA,EAAE,GAAG2B,EAAEqT,MAAMa,YAAY0iB,GAAG,GAAGv4B,OAAOgC,GAAG1K,EAAE0d,MAAMa,YAAY2iB,GAAG,GAAGx2B,OAAO1K,EAAEsL,UAAU8I,IAAI4sB,GAAI,EAA5T,GAAgUznC,KAAK4tB,aAAa5tB,KAAKuc,QAAQ,MAAMlM,EAAE,KAAKrQ,KAAKspC,aAAatpC,KAAKopC,YAAYppC,KAAK4e,MAAMmY,GAAGlgB,MAAM7W,KAAK4f,eAAe5f,KAAKmW,KAAK,SAASoJ,WAAW,KAAMvf,KAAKge,WAAWhe,KAAKge,UAAUyH,aAAamiB,GAAG,QAAS,EAAE,KAAK5nC,KAAKuV,OAAO,yBAAyBmzB,KAAKA,GAAG/U,eAAe+U,GAAGlV,UAAUiG,KAAK,KAAMz5B,KAAKupC,WAAU,EAAGl5B,GAAI,GAAGuuB,MAAM,IAAKvuB,KAAMA,GAAG,CAAC,UAAAud,GAAa,IAAIvd,EAAE5J,EAAE,MAAMqK,EAAE9Q,KAAKuV,OAAO,aAAanE,SAASC,KAAKF,EAAEhC,EAAEnP,KAAK6V,SAAS7V,KAAKuV,OAAO,aAAa,KAAK,GAAGpE,EAAE,CAAC,GAAGA,EAAEsU,aAAa,KAAK,YAAYzlB,KAAKwS,MAAMrB,EAAEsU,aAAa,aAAazlB,KAAK6V,SAAS,cAAc1E,EAAEY,UAAUC,OAAO+1B,GAAG/nC,KAAK86B,WAAWlgB,EAAEzJ,EAAEnR,KAAKuV,OAAO,cAAc,IAAIqF,EAAEzJ,EAAE82B,IAAIjoC,KAAKge,UAAU7M,EAAEnR,KAAKokC,OAAOjzB,EAAEuN,cAAc,qBAAqB5N,EAAEc,YAAYT,GAAGyJ,EAAExJ,SAAS6V,gBAAgBugB,IAAImB,IAAIC,KAAKD,GAAGv3B,SAASM,cAAc,QAAQkJ,EAAE+tB,GAAG,wBAAwBA,GAAGljB,aAAa2iB,GAAG,KAAKO,GAAGljB,aAAamiB,GAAG,QAAQe,GAAGljB,aAAa,aAAa,eAAemjB,GAAGD,GAAGtK,YAAY,QAAQhuB,EAAEc,EAAEG,qBAAqB,IAAIjB,GAAGA,EAAEkO,aAAaoqB,GAAGx3B,GAAG,QAAQ1K,EAAE0K,EAAEG,qBAAqB,IAAI7K,GAAGA,EAAE8iB,OAAOqf,KAAKz3B,EAAEkC,iBAAiB,YAAahD,IAAIw4B,GAAGx4B,EAAE+B,MAAM02B,GAAGz4B,EAAEgC,MAAMqI,EAAEvJ,EAAE02B,GAAI,GAAG7nC,KAAKuV,OAAO,iBAAiB,IAAI,MAAMlF,KAAK44B,GAAG7hB,SAAS/W,EAAEmC,KAAKxS,KAAKwS,IAAInC,EAAEkoB,aAAav4B,KAAKuV,OAAO,cAAcqF,EAAEzJ,EAAE22B,IAAIvoB,WAAW,KAAMvf,KAAK05B,aAAahf,EAAEvJ,EAAE22B,GAAI,EAAE,MAAM9nC,KAAKmW,KAAK,aAAa,CAAC,CAAC,YAAAmzB,CAAaj5B,GAAG,MAAMS,EAAE9Q,KAAKge,UAAU,IAAIlN,EAAE,OAAO,MAAM3B,EAAE2B,EAAE4N,cAAc,uBAAuB,IAAIvP,EAAE,OAAO,MAAMgC,EAAEnR,KAAK43B,SAAS,IAAI/K,EAAE1d,EAAE4F,EAAE,CAAC,EAAE,CAAC6T,OAAOvY,EAAEqY,WAAW,OAAOqJ,QAAQ,CAACtZ,SAASzY,KAAKuV,OAAO,eAAe,KAAK,IAAImE,WAAW1Z,KAAKuV,OAAO,gBAAgB,KAAKkX,MAAK,EAAGD,WAAW,CAAC5W,QAAQ,CAACoI,UAAU,gBAAgBrK,OAAO,WAAWsW,OAAO,UAAUF,OAAO,YAAY0B,YAAYzrB,KAAKuV,OAAO,cAAc+E,KAAKta,KAAKuV,OAAO,SAASvV,KAAKuV,OAAO,aAAa,CAAC,IAAIpE,EAAEqE,GAAG,IAAI,CAAEnF,EAAE5J,KAAKqK,KAAK9Q,KAAKmW,KAAK,YAAY1P,IAAI4J,KAAKS,EAAG,GAAGK,EAAEqE,GAAG,CAAC,QAAQ,UAAU,KAAMxV,KAAKwpC,eAAgB,GAAGxpC,KAAKwV,GAAG,uBAAuB,CAAEnF,EAAE5J,EAAEqK,KAAK9Q,KAAKq6B,aAAavpB,GAAGA,EAAE8N,WAAW,CAAE,GAAGzN,EAAEqE,GAAG,qBAAqB,KAAM,IAAInF,EAAE5J,EAAEzG,KAAK86B,WAAW96B,KAAK6hC,WAAW,QAAQxxB,EAAEe,SAAS2wB,qBAAqB,IAAI1xB,OAAO,EAAEA,EAAE+R,QAAQ,gBAAgB,QAAQ3b,EAAEzG,KAAKge,iBAAiB,IAAIvX,GAAGA,EAAEqsB,QAAS,GAAG3hB,EAAEqE,GAAG,SAAS,KAAMxV,KAAKypC,WAAWzpC,KAAK86B,YAAY96B,KAAKuV,OAAO,SAASvV,KAAK0pC,UAAU1pC,KAAKuV,OAAO,eAAevV,KAAK05B,WAAW15B,KAAK2pC,YAAa,GAAG3pC,KAAKuV,OAAO,iBAAiBpE,EAAEqE,GAAG,yBAAyB,CAAEnF,EAAES,KAAK,MAAM3B,EAAEnP,KAAK63B,WAAW,GAAG1oB,GAAG1I,EAAE0I,EAAEgZ,IAAI,OAAO,MAAMhX,EAAEnR,KAAKge,UAAU,GAAG7M,EAAE,CAAC,MAAMd,EAAE5H,KAAKsU,IAAIjM,EAAEsL,QAAQlH,GAAGzO,EAAE4J,EAAE,EAAE,GAAG5H,KAAKC,IAAI,GAAGD,KAAKoU,IAAI,EAAE,EAAExM,EAAES,EAAE0K,YAAYE,UAAU,MAAMvK,EAAEgT,MAAMa,YAAY,gBAAgBve,EAAE,KAAK,IAAI0K,EAAEgT,MAAMa,YAAY,qBAAqBve,EAAE,GAAG,CAAE,GAAG0K,EAAEqE,GAAG,mBAAmB,CAAEnF,EAAES,EAAE3B,KAAK,IAAIgC,EAAE,MAAM/R,EAAEY,KAAK63B,WAAW,GAAGz4B,GAAGqH,EAAErH,EAAE+oB,IAAI,OAAO,GAAGrX,EAAEgL,UAAU1K,SAAS2wB,gBAAgB,IAAI,CAAC,WAAW,SAAS7wB,QAAQ,QAAQC,EAAEC,SAAS2wB,qBAAqB,IAAI5wB,OAAO,EAAEA,EAAEgS,UAAU,OAAO,MAAM3f,EAAEiF,KAAKsU,IAAIjM,EAAE8Q,WAAW1J,GAAG,MAAMpH,EAAEuS,aAAa7f,GAAG,KAAKA,GAAG,IAAIsN,EAAE8Q,WAAWjP,KAAK,OAAOxD,GAAGA,EAAEqF,YAAYrF,EAAE8S,iBAAiBjiB,KAAKu4B,MAAMppB,EAAE,cAAc2B,EAAEsL,QAAQlH,EAAE,EAAE,KAAK,SAAU,IAAI/D,EAAEqE,GAAG,SAAUnF,IAAI,IAAI5J,EAAE,IAAIqK,EAAE,QAAQrK,EAAEzG,KAAK63B,kBAAkB,IAAIpxB,OAAO,EAAEA,EAAEsxB,UAAU,GAAGjnB,EAAE,CAAC,MAAMrK,EAAE,IAAIipB,YAAY,UAAU,CAACnb,SAAQ,EAAGC,YAAW,EAAGmN,OAAOtR,EAAEoZ,OAAO3Y,EAAE6e,cAAclpB,EAAE,CAAE,GAAG0K,EAAEqE,GAAG,CAAC,UAAU,UAAWnF,IAAI,MAAM5J,EAAEzG,KAAKge,UAAU,IAAIvX,EAAE,OAAO,IAAI,MAAMqK,KAAKrK,EAAE6e,iBAAiB,iCAAiCxU,EAAEka,UAAU3a,EAAEoZ,KAAK,EAAE,IAAI,MAAM3Y,KAAKrK,EAAE6e,iBAAiB,yBAAyBxU,EAAEka,UAAU3a,EAAE8Y,MAAMloB,OAAO,IAAIoP,EAAE4L,WAAW,CAAC,IAAI,MAAMnL,KAAKrK,EAAE6e,iBAAiB,wBAAwBjV,EAAEoZ,KAAKpZ,EAAE8Y,MAAMloB,OAAO,GAAG6P,EAAE0U,gBAAgB2iB,IAAIr3B,EAAE0U,gBAAgB4iB,MAAMt3B,EAAE2U,aAAa0iB,GAAG,IAAIr3B,EAAE2U,aAAa2iB,GAAG,OAAO,IAAI,MAAMt3B,KAAKrK,EAAE6e,iBAAiB,wBAAwBjV,EAAEoZ,KAAK,GAAG3Y,EAAE0U,gBAAgB2iB,IAAIr3B,EAAE0U,gBAAgB4iB,MAAMt3B,EAAE2U,aAAa0iB,GAAG,IAAIr3B,EAAE2U,aAAa2iB,GAAG,MAAM,CAAC,MAAMt3B,EAAE9Q,KAAK63B,WAAW,IAAI/mB,EAAE,OAAO,IAAI3B,EAAE2B,EAAEo1B,aAAa,GAAG/2B,GAAG,UAAU2B,EAAE7Q,MAAM6Q,EAAEkqB,QAAQwN,GAAG13B,EAAEy3B,OAAOp5B,EAAE2B,EAAEy3B,KAAK,IAAI,MAAMl4B,KAAK5J,EAAE6e,iBAAiB,4BAA4B,CAAC,MAAM7e,EAAEqK,EAAE84B,iBAAiBz6B,GAAGkB,EAAEmV,gBAAgB2iB,IAAI93B,EAAEmV,gBAAgB4iB,IAAI/3B,EAAEoV,aAAa6iB,GAAGn5B,GAAGkB,EAAEoV,aAAa4iB,GAAG5hC,GAAG0I,GAAGkB,EAAEoV,aAAa,SAAS,YAAYpV,EAAEoV,aAAa0iB,GAAG,IAAI93B,EAAEoV,aAAa2iB,GAAG,MAAM/3B,EAAEmV,gBAAgB8iB,IAAIj4B,EAAEmV,gBAAgB6iB,IAAI,CAAE,GAAGroC,KAAKmW,KAAK,eAAe,CAAC,YAAAyJ,GAAe,MAAMvP,EAAErQ,KAAKyG,EAAE4J,EAAE2N,UAAU,IAAIvX,EAAE,OAAOA,EAAE4M,iBAAiB,QAAQhD,EAAEwP,QAAQ,CAACjN,SAAQ,EAAGkN,SAAQ,IAAKrZ,EAAE4M,iBAAiB,QAAQhD,EAAE0P,QAAQ,CAACnN,SAAQ,EAAGkN,SAAQ,IAAK1O,SAASiC,iBAAiB,UAAUhD,EAAEgQ,UAAU,CAACzN,SAAQ,EAAGkN,SAAQ,IAAK1O,SAASiC,iBAAiB,mBAAmBhD,EAAEuwB,oBAAmB,GAAIxvB,SAASiC,iBAAiB,YAAYhD,EAAEw5B,aAAax5B,EAAEkF,OAAO,cAAcnE,SAASiC,iBAAiB,QAAQhD,EAAEy5B,SAAQ,GAAI/4B,OAAOsC,iBAAiB,SAAShD,EAAEiP,UAAU,MAAMxO,EAAEC,OAAO6S,eAAe9S,IAAIA,EAAEuC,iBAAiB,SAAShD,EAAEiP,UAAUxO,EAAEuC,iBAAiB,SAAShD,EAAEiP,UAAU,CAAC,YAAAR,GAAe,MAAMzO,EAAErQ,KAAKyG,EAAE4J,EAAE2N,UAAU,IAAIvX,EAAE,OAAO2K,SAASgD,oBAAoB,UAAU/D,EAAEgQ,UAAU,CAACzN,SAAQ,EAAGkN,SAAQ,IAAKrZ,EAAE2N,oBAAoB,QAAQ/D,EAAE0P,QAAQ,CAACnN,SAAQ,EAAGkN,SAAQ,IAAKrZ,EAAE2N,oBAAoB,QAAQ/D,EAAEwP,QAAQ,CAACjN,SAAQ,EAAGkN,SAAQ,IAAK1O,SAASgD,oBAAoB,YAAY/D,EAAEw5B,aAAa94B,OAAOqD,oBAAoB,SAAS/D,EAAEiP,UAAU,MAAMxO,EAAEC,OAAO6S,eAAe9S,IAAIA,EAAEsD,oBAAoB,SAAS/D,EAAEiP,UAAUxO,EAAEsD,oBAAoB,SAAS/D,EAAEiP,WAAWlO,SAASgD,oBAAoB,mBAAmB/D,EAAEuwB,oBAAmB,GAAIxvB,SAASgD,oBAAoB,QAAQ/D,EAAEy5B,SAAQ,EAAG,CAAC,KAAAvtB,GAAQ,MAAMlM,EAAErQ,KAAKge,UAAU,IAAI3N,EAAE,OAAO,MAAM5J,EAAEsK,OAAO6S,eAAe9S,EAAErI,KAAKC,IAAI,GAAG,MAAMjC,OAAO,EAAEA,EAAE8V,QAAQ,GAAG,IAAIpN,EAAE,GAAGgC,EAAE,GAAG/R,EAAE,GAAG,GAAGqH,GAAGqK,EAAE,EAAE,CAAC,IAAIT,EAAE,GAAG5J,EAAE6yB,eAAe91B,EAAE,GAAGiD,EAAE4yB,cAAclqB,EAAE1I,EAAE2R,MAAMtH,EAAE,KAAKK,EAAE1K,EAAE4R,OAAOvH,EAAE,KAAK1R,EAAE,eAAeiR,MAAM7M,eAAe,EAAEsN,IAAI,CAACT,EAAE8T,MAAM1e,UAAUrG,EAAEiR,EAAE8T,MAAM/L,MAAMjJ,EAAEkB,EAAE8T,MAAM9L,OAAOlH,CAAC,CAAC,OAAA0O,CAAQxP,GAAG,IAAI5J,EAAE,MAAMuX,UAAUlN,EAAEgqB,UAAU3rB,GAAGnP,KAAK,IAAI8Q,GAAG9Q,KAAK05B,YAAY,QAAQvqB,GAAGnP,KAAKuV,OAAO,SAASvV,KAAK+pC,YAAY,MAAM54B,EAAEd,EAAE6S,eAAe,GAAG,GAAG/R,EAAEiR,QAAQ,sBAAsBjR,EAAEiR,QAAQ,yBAAyB,OAAO/R,EAAE4R,sBAAsBjiB,KAAKu4B,MAAMloB,GAAG,GAAGc,EAAEiR,QAAQ,wBAAwB,OAAO/R,EAAE4R,sBAAsBjiB,KAAK2qB,OAAO,GAAGxZ,EAAEiR,QAAQ,wBAAwB,OAAO/R,EAAE4R,sBAAsBjiB,KAAK4qB,OAAO,GAAG,UAAUva,EAAEpQ,MAAM,IAAIoQ,EAAEsR,OAAO,OAAO,GAAGlZ,KAAKsU,IAAI1M,EAAE+B,MAAMy2B,IAAI,IAAIpgC,KAAKsU,IAAI1M,EAAEgC,MAAMy2B,IAAI,GAAG,OAAO,MAAM1pC,EAAEgS,SAAS2wB,cAAc,GAAG0G,MAAMrpC,GAAG0R,EAAEuN,SAASjf,GAAG,OAAO,GAAG+P,GAAG,WAAW,QAAQ1I,EAAEzG,KAAK63B,kBAAkB,IAAIpxB,OAAO,EAAEA,EAAExG,MAAM,YAAYD,KAAKsgB,YAAYd,aAAaxf,KAAKsgB,YAAYtgB,KAAKsgB,WAAW,MAAMtgB,KAAKsgB,WAAWf,WAAW,KAAMvf,KAAKgqC,aAAahqC,KAAKsgB,WAAW,IAAK,EAAE,MAAM,GAAGtgB,KAAKmW,KAAK,QAAQ9F,GAAGA,EAAE0R,iBAAiB,OAAO,IAAIve,GAAE,EAAG,GAAG2N,EAAEiR,QAAQ,sBAAsB,CAAC,GAAGhjB,EAAE,CAAC,GAAGA,EAAEgjB,QAAQ,qBAAqB,OAAOjR,EAAE0K,QAAQ+W,KAAKxzB,EAAE6qC,MAAM,CAAC,GAAGxB,KAAK,OAAOjlC,EAAExD,KAAKuV,OAAO,eAAe,MAAMpE,EAAEiR,QAAQ,yBAAyBjR,EAAE0K,QAAQ+W,MAAMpvB,EAAExD,KAAKuV,OAAO,kBAAkB,UAAU/R,GAAG6M,EAAE4R,iBAAiBjiB,KAAKu4B,MAAMloB,IAAI,SAAS7M,GAAG6M,EAAE4R,iBAAiBjiB,KAAK4qB,QAAQ,SAASpnB,IAAI6M,EAAE4R,iBAAiBjiB,KAAK2qB,OAAO,CAAC,OAAA5K,CAAQ1P,GAAG,MAAM5J,EAAE4J,EAAEjP,OAAO,IAAI+N,EAAEnP,KAAKuV,OAAO,QAAQlF,GAAG5J,EAAE2b,QAAQ,uBAAuBjT,EAAE,SAAS,MAAMgC,EAAE,UAAUhC,EAAE/P,EAAE,EAAEiR,EAAEwT,QAAQ,GAAGxT,EAAEyT,QAAQ,GAAGzT,EAAEsR,QAAQ,GAAG1M,OAAO,SAAU5E,EAAE5J,GAAG,OAAOgC,KAAKsU,IAAItW,GAAGgC,KAAKsU,IAAI1M,GAAG5J,EAAE4J,CAAE,GAAG7M,EAAEiF,KAAKC,KAAK,EAAED,KAAKoU,IAAI,EAAEzd,IAAIiE,EAAEuF,KAAKC,MAAM7I,KAAKijB,KAAK5f,EAAErD,KAAKijB,IAAI,IAAI9R,GAAGd,EAAE4R,kBAAkBjiB,KAAKijB,IAAI5f,EAAErD,KAAKmW,KAAK,QAAQ9F,EAAE7M,GAAG6M,EAAE0R,mBAAmB,UAAU5S,GAAGkB,EAAE4R,iBAAiBjiB,KAAKu4B,MAAMloB,IAAI,UAAUlB,IAAI2B,EAAErK,KAAK4J,EAAE4R,iBAAiBjiB,KAAKwD,EAAE,EAAE,OAAO,aAAa,CAAC,QAAA6qB,GAAWtd,OAAOoiB,SAAS4V,GAAGC,GAAG,CAAC,SAAA3oB,CAAUhQ,GAAG,IAAIrQ,KAAKkqC,YAAY,OAAOlqC,KAAK86B,YAAY96B,KAAKuV,OAAO,SAASvV,KAAK05B,aAAa15B,KAAK+pC,YAAY,MAAMtjC,EAAE4J,EAAEpG,IAAI6G,EAAE9Q,KAAKuV,OAAO,YAAY,IAAIzE,EAAE,OAAO,MAAM3B,EAAEkB,EAAE6S,eAAe,GAAG/R,EAAEC,SAAS2wB,eAAe3wB,SAAS2wB,cAAchwB,UAAU3S,EAAE+R,GAAGA,EAAEkN,SAAS,aAAalP,EAAEkT,QAAQyO,cAAc3hB,EAAEkT,QAAQohB,cAAc,GAAG,WAAWh9B,IAAIrH,GAAGqb,EAAEtL,KAAOA,EAAEg7B,oBAAoB,IAAI,CAAC,WAAW,SAAS,QAAQ,SAAS,SAASj5B,QAAQ/B,EAAEgU,WAAU,OAAO,GAAG,QAAQ9S,EAAEpG,IAAI2Q,EAAE5a,KAAKge,UAAU6pB,IAAIntB,EAAE1a,KAAKge,UAAU6pB,IAAIx3B,EAAE+5B,SAAS/5B,EAAEg6B,QAAQh6B,EAAEi6B,SAAS,OAAOtqC,KAAKmW,KAAK,UAAU1P,EAAE4J,GAAG,MAAM7M,EAAEsN,EAAErK,GAAGjD,GAAG,mBAAmBxD,KAAKwD,KAAK6M,EAAE4R,iBAAiBjiB,KAAKwD,KAAK,CAAC,QAAA8b,GAAW,MAAMjP,EAAErQ,KAAKge,UAAU,IAAI3N,EAAE,OAAO,MAAM5J,EAAEzG,KAAK86B,UAAUzqB,EAAE0B,UAAUC,OAAO+1B,GAAGthC,GAAGzG,KAAKwpC,cAAcxpC,KAAK63B,YAAY73B,KAAK86B,UAAU96B,KAAKuqC,YAAYvqC,KAAK6hC,UAAU7hC,KAAKuc,QAAQvc,KAAKmW,KAAK,SAAS,CAAC,OAAA2zB,CAAQz5B,GAAGrQ,KAAKkqC,aAAalqC,KAAK2pC,WAAWt5B,EAAE,CAAC,WAAAw5B,CAAYx5B,GAAGrQ,KAAKm6B,mBAAmB9pB,GAAGrQ,KAAK86B,WAAW96B,KAAKuV,OAAO,SAASvV,KAAK+pC,WAAW,CAAC,kBAAAnJ,GAAqB,YAAYxvB,SAASyvB,gBAAgB7gC,KAAK2pC,aAAa3pC,KAAK6hC,SAAS,CAAC,cAAA2I,CAAen6B,GAAG,MAAM5J,EAAEzG,KAAKyV,UAAUpF,EAAE,iBAAgB,EAAG,GAAG,SAAS5J,EAAE,CAAC,MAAM4J,EAAErQ,KAAKsW,QAAQixB,QAAQ,GAAGl3B,GAAGA,EAAEuO,QAAQsmB,GAAGruB,MAAM,MAAM,CAAC,IAAIpQ,EAAE,OAAO,IAAI4J,EAAE6oB,WAAW7oB,EAAEo6B,WAAW,OAAO,MAAM35B,EAAE9Q,KAAKuV,OAAO,mBAAmB,GAAGzE,EAAE,CAAC,MAAMrK,EAAE0I,EAAEnP,KAAK6V,SAAS/E,IAAIT,EAAEo6B,WAAWp6B,EAAE6oB,UAAUtnB,YAAYnL,GAAG4J,EAAE8X,IAAIvN,EAAEvK,EAAE8X,GAAG,gBAAgB,CAAC,CAAC,aAAAqhB,CAAcn5B,OAAO,GAAG,IAAI5J,EAAEqK,EAAE,MAAM3B,EAAE,oBAAoBgC,EAAEnR,KAAKge,UAAU,IAAI7M,EAAE,OAAOuJ,EAAEvJ,EAAE+2B,IAAI,MAAM9oC,EAAEY,KAAK86B,WAAW96B,KAAKuV,OAAO,iBAAiB/R,GAAGpE,EAAE,GAAGY,KAAKu6B,SAASv6B,KAAKyU,KAAKzU,KAAKu6B,SAAS/2B,GAAGxD,KAAKu6B,UAAUv6B,KAAKu6B,QAAQ5f,SAAS3a,KAAKu6B,QAAQ,MAAMn7B,IAAIY,KAAKu6B,QAAQ,IAAI,MAAMlqB,KAAK,QAAQ5J,EAAEzG,KAAK43B,gBAAgB,IAAInxB,OAAO,EAAEA,EAAEmiB,SAAS,GAAGvY,EAAEq6B,YAAYr6B,EAAEq6B,UAAU/vB,SAAStK,EAAEq6B,eAAe,EAAEhwB,EAAErK,EAAE8X,GAAG+f,IAAI,QAAQp3B,EAAET,EAAE8X,UAAU,IAAIrX,GAAGA,EAAE0U,gBAAgB,oBAAoB,GAAGnV,IAAIA,EAAErQ,KAAK63B,aAAaxnB,GAAGjR,IAAIY,KAAKk9B,eAAe7sB,GAAG,OAAO,MAAMhN,EAAEgN,EAAE8X,GAAG,IAAItV,EAAE7S,KAAKyV,UAAUpF,EAAE,UAAU,IAAI,IAAIwC,EAAE,YAAYzT,GAAGY,KAAKu6B,SAASv6B,KAAKugB,QAAQvgB,KAAKu6B,QAAQ,YAAY,KAAMv6B,KAAKu6B,UAAUv6B,KAAKu6B,QAAQvP,UAAU,GAAI,IAAI,IAAItW,EAAE,KAAK,GAAGlR,GAAG,GAAGkR,EAAErE,EAAEq6B,WAAW,KAAKrnC,IAAIqR,EAAE,CAAC,MAAMjO,EAAE0I,EAAE,IAAInP,KAAKwS,MAAMnC,EAAE/G,QAAQoL,EAAEtD,SAASM,cAAc,OAAOkJ,EAAElG,EAAEvF,GAAGuF,EAAE+Q,aAAa,KAAKhf,GAAG4J,EAAEq6B,UAAUrnC,EAAEuO,YAAY8C,GAAGkG,EAAEvX,EAAE6kC,IAAI7kC,EAAEoiB,aAAa,kBAAkBhf,EAAE,OAAUiO,EAAE1U,KAAKu6B,QAAQ7lB,IAAIA,EAAEvD,EAAEuN,cAAc,IAAIvP,IAAKuF,IAAGA,EAAEtD,SAASM,cAAc,OAAOgD,EAAE2N,QAAQsoB,gBAAgB,GAAG/vB,EAAElG,EAAEvF,IAAInP,KAAKokC,QAAQjzB,GAAGid,QAAQ1Z,IAAGkG,EAAEzJ,EAAE+2B,IAAIloC,KAAKu6B,QAAQ7lB,EAAEA,IAAIA,EAAEsW,UAAU,GAAGwd,GAAG31B,IAAI,iBAAiBA,EAAE6B,EAAEsW,UAAUnY,EAAE,GAAGA,aAAa+U,aAAalT,EAAE9C,YAAYiB,GAAG,CAAC,UAAA82B,CAAWt5B,GAAGrQ,KAAK8yB,MAAMziB,EAAE,CAAC,KAAAyiB,CAAMziB,GAAG,IAAI5J,EAAE,GAAGzG,KAAK4qC,kBAAkB,OAAO,MAAM95B,EAAEM,SAAS2wB,eAAe,KAAK5yB,GAAG,MAAMkB,OAAO,EAAEA,EAAEjP,SAAS,KAAK+P,EAAEnR,KAAKge,UAAU5e,EAAE,QAAQqH,EAAEzG,KAAK43B,gBAAgB,IAAInxB,OAAO,EAAEA,EAAEynB,SAAS,IAAI/c,IAAI/R,EAAE,OAAO,IAAIiR,GAAGS,GAAGK,EAAEkN,SAASvN,GAAG,OAAO,MAAMtN,EAAExD,KAAK63B,WAAWx0B,EAAEG,GAAGA,EAAEob,QAAQoY,GAAGngB,MAAMrT,EAAE2kB,GAAG,KAAK,IAAI9kB,GAAGA,EAAEgb,SAASvN,IAAIK,IAAIL,EAAE,OAAOT,GAAGA,EAAEmE,YAAYnE,EAAE4R,iBAAiBjiB,KAAK4qC,mBAAkB,EAAG,MAAM/3B,EAAEnO,MAAMsP,KAAK7C,EAAEmU,iBAAiBsN,KAAK,IAAIle,EAAE,GAAGG,EAAE,KAAK,IAAI,IAAIxE,KAAKwC,EAAE,CAAC,MAAMpM,GAAG4J,EAAEM,gBAAgBN,EAAE+R,QAAQ,wBAAwBtR,EAAEzN,GAAGA,EAAEgb,SAAShO,GAAGlB,GAAG/P,EAAEif,SAAShO,GAAG,GAAGA,IAAIc,IAAIL,GAAG3B,KAAK1I,EAAE,CAACiO,EAAEhK,KAAK2F,GAAG,MAAM5J,EAAE4J,EAAEgS,QAAQwoB,kBAAkB,IAAIpkC,GAAGA,IAAI4J,EAAEy6B,SAASx6B,WAAW7J,IAAI4J,EAAEmV,gBAAgB,uBAAuBnV,EAAE2R,aAAa,cAAcnN,IAAIA,EAAExE,EAAE,KAAK,CAAC,MAAM5J,OAAO,IAAI4J,EAAEgS,QAAQwoB,aAAax6B,EAAE0U,aAAa,aAAa,GAAG1U,EAAEgS,QAAQwoB,aAAapkC,IAAI4J,EAAEgS,QAAQwoB,aAAapkC,GAAG4J,EAAEy6B,UAAU,CAAC,CAAC,CAAC,IAAIh2B,EAAE,KAAKzE,IAAIlB,GAAGuF,EAAExD,QAAQ/B,GAAG,KAAK2F,EAAED,GAAG1D,EAAEuD,EAAEzT,SAAS6P,IAAI83B,GAAG9zB,EAAEJ,EAAE,GAAG1U,KAAK+qC,YAAY55B,GAAGL,IAAI63B,KAAK7zB,EAAEJ,EAAEA,EAAEzT,OAAO,MAAM6T,EAAEtR,GAAG,UAAUA,EAAEvD,KAAKkR,EAAE0D,GAAG1D,EAAE2D,GAAG+d,GAAG/d,GAAG9U,KAAK+qC,UAAU35B,SAAS2wB,cAAc/hC,KAAK4qC,mBAAkB,CAAE,CAAC,IAAAhgB,GAAO,MAAMva,EAAErQ,KAAK43B,SAASvnB,GAAGA,EAAE8Y,MAAMloB,OAAO,GAAGoP,EAAE+c,WAAW,CAAC,IAAAzC,GAAO,MAAMta,EAAErQ,KAAK43B,SAASvnB,GAAGA,EAAE8Y,MAAMloB,OAAO,GAAGoP,EAAEgd,WAAW,CAAC,MAAAiL,IAAUjoB,GAAGrQ,KAAK43B,UAAU53B,KAAK43B,SAAS1L,WAAW7b,EAAE,CAAC,SAAA65B,GAAY,IAAI75B,EAAE,OAAO,QAAQA,EAAEqnB,GAAGC,qBAAqB,IAAItnB,OAAO,EAAEA,EAAEmC,KAAKxS,KAAKwS,EAAE,CAAC,OAAA+N,CAAQlQ,EAAE,KAAK5J,EAAE,GAAGqK,GAAG,IAAIT,IAAI5J,EAAE,YAAYqK,GAAGA,KAAK9Q,KAAKyU,KAAKpE,GAAG,MAAMlB,EAAEgC,IAAIA,EAAE/P,SAASiP,GAAGA,EAAEgS,QAAQoO,gBAAgBpgB,EAAE+D,oBAAoB,eAAejF,UAAUkB,EAAEgS,QAAQoO,cAAc3f,GAAGA,IAAI4J,EAAErK,EAAE5J,KAAK4J,EAAEgS,QAAQoO,cAAchqB,EAAE4J,EAAEgD,iBAAiB,eAAelE,GAAGyL,EAAEvK,EAAE5J,EAAE,CAAC,IAAAgO,CAAKpE,GAAGA,GAAGA,EAAEsf,cAAc,IAAID,YAAY,eAAe,CAACnb,SAAQ,EAAGC,YAAW,EAAGw2B,cAAc36B,IAAI,CAAC,UAAAwqB,CAAWxqB,EAAE5J,EAAE,GAAGqK,GAAE,GAAI,GAAG9Q,KAAK05B,YAAY,OAAO,MAAMvoB,EAAEd,EAAE8X,GAAG,IAAIhX,EAAE,OAAO,IAAI/R,EAAE,KAAK,GAAGqb,EAAEhU,GAAGrH,EAAEqH,GAAGrH,EAAE+P,EAAE1I,EAAE,IAAIgU,EAAErb,KAAKA,EAAEgS,SAASM,cAAc,OAAOtS,EAAE4rB,UAAUvkB,EAAE,KAAK,CAAC,MAAM,UAAU,SAAS,QAAQ,SAASwP,SAAS7W,EAAE+jB,SAASrN,eAAe,CAAC,MAAMzF,EAAEe,SAASM,cAAc,OAAOrB,EAAEuB,YAAYxS,GAAGA,EAAEiR,CAAC,CAACoK,EAAErb,IAAIiR,EAAEvM,SAASuM,EAAE2qB,QAAQ57B,EAAEA,EAAEsf,cAAcrO,EAAEvM,SAAS1E,GAAGqb,EAAErb,IAAIwb,EAAExb,EAAE,qBAAqBiR,EAAEmC,IAAIpT,EAAEqmB,aAAa,KAAKpV,EAAEmC,IAAIrB,EAAEY,UAAU8I,IAAI,OAAOxK,EAAE2qB,MAAM,QAAQ3qB,EAAEpQ,MAAM,aAAakR,EAAEid,QAAQhvB,GAAG,SAASA,EAAE+kB,MAAMoB,UAAUnmB,EAAE+kB,MAAMoB,QAAQ,IAAI,SAASvU,iBAAiB5R,GAAG67B,iBAAiB,aAAa77B,EAAE+kB,MAAMoB,QAAQlV,EAAEkV,SAASvlB,KAAKuV,OAAO,mBAAmB,QAAQlF,EAAE6oB,UAAU95B,EAAE0R,GAAG9Q,KAAKk6B,cAAc7pB,GAAGrQ,KAAKwqC,eAAen6B,GAAGrQ,KAAKwpC,cAAcn5B,IAAIrQ,KAAKo6B,SAAS/pB,EAAE,wBAAwB,CAAC,aAAA6pB,CAAc7pB,EAAE5J,GAAG,MAAMqK,EAAET,EAAE8X,GAAGhZ,EAAEkB,EAAE6oB,UAAUpoB,GAAG3B,IAAInP,KAAKmW,KAAK,SAAS9F,GAAGrQ,KAAKg6B,YAAY3pB,GAAGA,EAAEuO,MAAMoY,GAAGI,SAAS3wB,EAAEzG,KAAK25B,eAAetpB,QAAQ,IAAI5J,EAAEzG,KAAKyV,UAAUpF,EAAE,aAAa5J,EAAE,YAAYzG,KAAKugB,QAAQpR,EAAE1I,EAAE,KAAMzG,KAAKi6B,KAAK5pB,EAAG,GAAGrQ,KAAKi6B,KAAK5pB,GAAG,CAAC,IAAA4pB,CAAK5pB,GAAGrQ,KAAK05B,cAAcrpB,EAAEuO,MAAMoY,GAAGngB,MAAM7W,KAAKmW,KAAK,OAAO9F,GAAGuK,EAAEvK,EAAE8X,GAAG,WAAWnoB,KAAKk9B,eAAe7sB,IAAIrQ,KAAKuV,OAAO,cAAciJ,eAAe,KAAM,IAAI/X,EAAE,QAAQA,EAAE4J,EAAE2b,eAAe,IAAIvlB,GAAGA,EAAE2e,iBAAiBplB,KAAKuV,OAAO,cAAcvV,KAAK8yB,OAAQ,GAAG9yB,KAAK25B,eAAetpB,KAAKqK,EAAE1a,KAAKge,UAAUiqB,KAAKjoC,KAAK86B,WAAW96B,KAAKuV,OAAO,SAASvV,KAAK0pC,WAAW,CAAC,cAAAxM,CAAe7sB,GAAG,MAAM5J,EAAEzG,KAAK63B,WAAW,SAASxnB,IAAI5J,IAAIA,EAAE6C,QAAQ+G,EAAE/G,KAAK,CAAC,cAAAqwB,CAAetpB,GAAG,IAAI5J,EAAEqK,EAAE,OAAO,QAAQ,QAAQrK,EAAEzG,KAAK43B,gBAAgB,IAAInxB,OAAO,EAAEA,EAAE6lB,WAAWjc,GAAGA,EAAE/G,SAAS,QAAQwH,EAAE9Q,KAAK63B,kBAAkB,IAAI/mB,OAAO,EAAEA,EAAExH,MAAM,CAAC,WAAAgxB,CAAYjqB,GAAGA,EAAEuO,MAAMoY,GAAGG,QAAQ,MAAM1wB,EAAE4J,EAAE8X,GAAO1hB,IAASmU,EAAEnU,EAAEuhC,IAAIhoC,KAAKmW,KAAK,UAAU9F,GAAGA,EAAE46B,WAAW1rB,WAAW,KAAM,IAAIvf,KAAK05B,cAAcrpB,EAAE46B,WAAW56B,EAAEuO,QAAQoY,GAAGG,QAAQ,CAAC,IAAIrmB,EAAE3B,EAAEqL,GAAGI,EAAE9J,EAAE,oBAAoBT,EAAE46B,UAAUn6B,EAAErK,EAAE2nB,QAAQtd,GAAG9Q,KAAKugB,QAAQzP,EAAE,WAAW,CAAE,EAAE,KAAI,CAAC,WAAAkpB,CAAY3pB,GAAG,MAAM5J,EAAE4J,EAAE8X,GAAG,IAAI1hB,EAAE,OAAO,MAAMqK,EAAET,EAAE46B,UAAUjrC,KAAK05B,YAAY,MAAM5oB,GAAGA,EAAE6J,UAAUD,EAAEjU,EAAEuhC,IAAIl3B,GAAG9Q,KAAKugB,QAAQzP,EAAE,YAAY,KAAMA,EAAE6J,QAAS,GAAGtK,EAAEuO,QAAQoY,GAAGG,UAAUn3B,KAAKmW,KAAK,SAAS9F,GAAGA,EAAEuO,MAAMoY,GAAGngB,OAAO,CAAC,QAAAujB,CAAS/pB,EAAE5J,GAAG,GAAGzG,KAAK05B,YAAY,OAAO,MAAM5oB,EAAE,IAAIwD,MAAM,QAAQ,CAACC,SAAQ,EAAGC,YAAW,IAAK,GAAGxU,KAAKmW,KAAK,QAAQrF,EAAET,GAAGS,EAAEiR,iBAAiB,OAAO1R,EAAE2qB,MAAMv0B,EAAEzG,KAAKg6B,YAAY3pB,GAAGrQ,KAAKq6B,aAAahqB,GAAG,MAAMlB,EAAEiC,SAASM,cAAc,OAAOvC,EAAE4C,UAAU8I,IAAI,kBAAkB1L,EAAE6b,UAAUhrB,KAAK6V,SAASpP,GAAG,oBAAoBzG,KAAK66B,WAAWxqB,EAAElB,EAAE,CAAC,YAAAkrB,CAAahqB,GAAG,QAAQ,IAAIA,EAAEuO,MAAM,OAAO5e,KAAKmW,KAAK,eAAe9F,GAAGA,EAAE6oB,YAAY7oB,EAAE6oB,UAAUve,SAAStK,EAAE6oB,eAAe,GAAG,MAAMzyB,EAAE4J,EAAE8X,GAAG1hB,IAAIiU,EAAEjU,EAAE,aAAaiU,EAAEjU,EAAE,eAAeiU,EAAEjU,EAAE,OAAO4J,EAAEpQ,MAAM,cAAcoQ,EAAEo6B,YAAYp6B,EAAEo6B,WAAW9vB,SAAStK,EAAEo6B,gBAAgB,EAAEp6B,EAAEq6B,WAAWr6B,EAAEq6B,UAAU/vB,SAAStK,EAAEq6B,eAAe,EAAEr6B,EAAE46B,WAAW56B,EAAE46B,UAAUtwB,SAAStK,EAAE46B,eAAe,CAAC,CAAC,QAAApT,GAAW,IAAIxnB,EAAE,MAAM5J,EAAEzG,KAAK43B,SAAS,OAAO,QAAQvnB,EAAE,MAAM5J,OAAO,EAAEA,EAAE0iB,MAAM,MAAM1iB,OAAO,EAAEA,EAAEgjB,aAAa,IAAIpZ,OAAO,EAAEA,EAAEuY,OAAO,UAAU,CAAC,CAAC,KAAA2P,CAAMloB,EAAE5J,GAAG,GAAGzG,KAAK05B,YAAY,OAAO,MAAM5oB,EAAE,IAAIwD,MAAM,cAAc,CAACC,SAAQ,EAAGC,YAAW,IAAK,GAAGxU,KAAKmW,KAAK,cAAcrF,EAAET,GAAGS,EAAEiR,iBAAiB,OAAO1R,GAAGA,EAAEmE,aAAanE,EAAE4R,iBAAiB5R,EAAE6R,mBAAmB,MAAM/S,EAAE,KAAKnP,KAAKkrC,aAAa76B,EAAE5J,IAAIzG,KAAKupC,WAAWb,IAAIA,GAAG/U,eAAeiG,QAAQuR,QAAQzC,GAAGhV,QAAQ+F,KAAK,IAAKtqB,KAAMA,GAAG,CAAC,SAAAo7B,GAAYvqC,KAAKypC,WAAWjqB,aAAaxf,KAAKypC,WAAWzpC,KAAKypC,UAAU,IAAI,CAAC,OAAAC,CAAQr5B,GAAE,GAAI,MAAM5J,EAAE,KAAKzG,KAAKuqC,YAAYvqC,KAAKg1B,MAAK,EAAGpa,EAAE5a,KAAKge,UAAU,WAAWhe,KAAKmW,KAAK,YAAY,GAAGnW,KAAKuqC,aAAavqC,KAAK05B,YAAY,GAAGrpB,EAAE5J,QAAQ,CAAC,MAAM4J,EAAErQ,KAAKuV,OAAO,QAAQlF,IAAIrQ,KAAKypC,UAAUlqB,WAAW9Y,EAAE4J,GAAG,CAAC,CAAC,OAAAwxB,GAAU7hC,KAAKuqC,YAAYvqC,KAAKg1B,OAAOh1B,KAAK05B,cAAc15B,KAAKg1B,MAAK,EAAGta,EAAE1a,KAAKge,UAAU,WAAWhe,KAAKmW,KAAK,WAAW,CAAC,SAAA4zB,GAAY/pC,KAAK6hC,UAAU7hC,KAAK0pC,SAAS,CAAC,UAAAM,GAAahqC,KAAKg1B,KAAKh1B,KAAK6hC,UAAU7hC,KAAK0pC,SAAQ,EAAG,CAAC,gBAAA1D,GAAmB0C,KAAKA,GAAG/U,eAAe+U,GAAGhV,OAAOgV,GAAGlV,UAAUiG,KAAK,KAAMz5B,KAAKupC,WAAU,CAAG,GAAG,CAAC,SAAA7P,GAAY,MAAM,CAAC3C,GAAGE,QAAQF,GAAGG,cAAcH,GAAG/f,SAASf,SAASjW,KAAK4e,MAAM,CAAC,YAAAssB,CAAa76B,EAAE5J,GAAG,IAAIqK,EAAE3B,EAAEnP,KAAK4e,MAAMmY,GAAGE,QAAQj3B,KAAKuqC,YAAYvqC,KAAK8e,eAAe,MAAM3N,EAAEnR,KAAKge,UAAU5e,EAAEY,KAAK43B,SAASp0B,EAAExD,KAAK63B,WAAWx0B,EAAEG,GAAGxD,KAAKuV,OAAO,kBAAkB/R,EAAEu0B,WAAW/3B,KAAKuV,OAAO,aAAa,KAAK,GAAGlS,IAAIovB,GAAGpvB,GAAGwvB,GAAGxvB,GAAGA,EAAEyvB,SAAS3hB,IAAIuJ,EAAEvJ,EAAE82B,IAAIrtB,EAAEzJ,EAAE,cAAcA,EAAEsU,aAAamiB,GAAG,QAAQ5nC,KAAKuV,OAAO,aAAaqF,EAAEzJ,EAAE22B,IAAI32B,EAAEgT,MAAMinB,cAAc,QAAQhsC,EAAE,CAACA,EAAEywB,mBAAmB,QAAQ/e,EAAE1R,EAAE4sB,eAAe,IAAIlb,GAAGA,EAAEqW,UAAU,QAAQhY,EAAE/P,EAAEkX,QAAQkW,kBAAkB,IAAIrd,GAAGA,EAAEoH,SAAS,IAAI,MAAMlG,KAAKjR,EAAEwpB,OAAO,CAACvY,EAAEuO,MAAMoY,GAAGC,QAAQj3B,KAAKg6B,YAAY3pB,GAAG,MAAM5J,EAAE4J,EAAE6oB,UAAUzyB,GAAGzG,KAAKyU,KAAKhO,GAAG,MAAMqK,EAAE,MAAMT,OAAO,EAAEA,EAAE2b,QAAQlb,IAAIA,EAAE2D,OAAO3D,EAAEgO,eAAehO,EAAE4O,kBAAkB1f,KAAKk9B,eAAe7sB,IAAIjR,EAAE+W,KAAK,cAAc9F,EAAE,CAAC,CAAC04B,GAAGh4B,OAAOkiB,QAAQ+V,GAAGj4B,OAAO2hB,QAAQ3hB,OAAOsC,iBAAiB,SAASrT,KAAKquB,UAAUruB,KAAKmW,KAAK,QAAQ9F,GAAGrQ,KAAK4e,QAAQmY,GAAGG,oBAAoB,IAAIzwB,GAAGjD,IAAIiD,EAAEzG,KAAKyV,UAAUjS,EAAE,cAAciD,GAAGjD,GAAGxD,KAAKugB,QAAQ/c,EAAE01B,UAAUzyB,EAAE,KAAMrH,GAAGA,EAAE+W,KAAK,cAAc3S,EAAG,GAAG+b,WAAW,KAAMvf,KAAKmnB,SAAU,EAAE,MAAMnnB,KAAKmnB,WAAW5H,WAAW,KAAMvf,KAAKmnB,SAAU,EAAE,IAAI,CAAC,OAAAA,GAAU,IAAI9W,EAAE,GAAGrQ,KAAK4e,QAAQmY,GAAG/f,QAAQ,OAAOjG,OAAOqD,oBAAoB,SAASpU,KAAKquB,UAAUruB,KAAK4e,MAAMmY,GAAG/f,QAAQ,QAAQ3G,EAAErQ,KAAK43B,gBAAgB,IAAIvnB,GAAGA,EAAE8W,UAAU,MAAM1gB,EAAEzG,KAAKge,UAAUvX,GAAGA,EAAEkU,SAASsuB,GAAGvY,OAAO1wB,KAAKwS,IAAI,MAAM1B,EAAE4mB,GAAGC,cAAc7mB,EAAEA,EAAEgiB,SAAS6V,KAAKA,GAAGhuB,SAASguB,GAAG,MAAMC,KAAKA,GAAGjuB,SAASiuB,GAAG,MAAMluB,EAAEtJ,SAAS6V,gBAAgBugB,IAAI,MAAM,IAAI7U,GAAG,OAAO,MAAMtiB,EAAEe,SAAS3K,EAAE4J,EAAEgB,KAAK5K,EAAEsL,UAAU4I,OAAO8sB,IAAIhhC,EAAE0d,MAAMa,YAAY2iB,GAAG,IAAIt3B,EAAE4W,gBAAgB9C,MAAMa,YAAY0iB,GAAG,GAAI,EAA3I,GAA+I1nC,KAAKmW,KAAK,WAAW,CAAC,WAAO/C,CAAK/C,EAAE5J,EAAEqK,GAAG,IAAI6hB,GAAG,OAAO,IAAIxjB,EAAEgC,EAAE,GAAG/R,EAAE,CAAC,EAAE,QAAQ,IAAIiR,EAAElB,EAAEiC,SAASC,KAAKm3B,GAAGn4B,IAAIlB,EAAEiC,SAASC,KAAKF,EAAEd,EAAE,iBAAiB5J,IAAIrH,EAAEqH,GAAG,CAAC,KAAK0I,EAAEkB,EAAEm4B,GAAG/hC,KAAK0K,EAAE1K,GAAG,iBAAiBqK,IAAI1R,EAAE0R,GAAG,CAAC,KAAK3B,IAAIsL,EAAEtL,GAAG,OAAOgC,EAAEA,GAAG,kBAAkB,MAAM3N,EAAEk0B,GAAG2T,QAAQ7pC,IAAI2N,IAAI,IAAIrG,IAAItF,EAAEiG,IAAI0H,EAAE/R,GAAGs4B,GAAG2T,QAAQ5hC,IAAI0F,EAAE3L,GAAG,IAAIA,EAAEuG,MAAMoF,EAAEkE,iBAAiB,QAAQqkB,GAAG4T,UAAU,CAAC,aAAOC,CAAOl7B,EAAE5J,GAAG,IAAIqK,EAAE3B,EAAE,GAAG,GAAGq5B,GAAGn4B,IAAIS,EAAEM,SAASC,KAAKlC,EAAEkB,IAAIS,EAAET,EAAEm4B,GAAG/hC,KAAK0I,EAAE1I,KAAKqK,EAAE,OAAO,MAAMK,EAAEumB,GAAG2T,QAAQ7pC,IAAIsP,GAAGK,GAAGhC,GAAGgC,EAAEuf,OAAOvhB,GAAGA,GAAGgC,IAAIumB,GAAG2T,QAAQ3a,OAAO5f,GAAGA,EAAEsD,oBAAoB,QAAQsjB,GAAG4T,WAAW,CAAC,cAAOnkB,GAAU,IAAI9W,EAAE,KAAKA,EAAEqnB,GAAGC,eAAetnB,EAAE8W,UAAU,IAAI,MAAM9W,KAAKqnB,GAAG2T,QAAQjkC,OAAOiJ,EAAE+D,oBAAoB,QAAQsjB,GAAG4T,WAAW5T,GAAG2T,QAAQ,IAAIviC,GAAG,CAAC,gBAAOwiC,CAAUj7B,GAAG,GAAGA,EAAE0R,iBAAiB,OAAO,GAAG1R,EAAEsD,QAAQ,IAAItD,EAAEsD,OAAO,OAAO,GAAGtD,EAAE+5B,SAAS/5B,EAAEm7B,SAASn7B,EAAEi6B,SAAS,OAAO,IAAI7jC,EAAE4J,EAAE6S,eAAe,GAAG,MAAMpS,EAAErK,EAAE2b,QAAQ,2BAA2B,GAAGtR,EAAE,CAAC,MAAMT,EAAES,EAAEuR,QAAQopB,iBAAiB,GAAGt8B,EAAEiC,SAASkU,iBAAiB,mBAAmBjV,OAAOc,EAAExN,SAASmN,EAAEuR,QAAQqpB,eAAe,GAAG,KAAK,EAAEjlC,EAAE0I,EAAEgC,IAAI1K,CAAC,CAAC,KAAKA,GAAGA,aAAaiK,SAAS,OAAO,IAAIvB,EAAEgC,EAAE/R,EAAEoE,EAAE,GAAG,IAAIk0B,GAAG2T,SAASM,UAAU9mC,KAAK,EAAGwL,EAAES,QAAQT,EAAEgO,SAAS5X,KAAK,IAAIqK,GAAG66B,UAAU9mC,KAAK,EAAGiM,EAAEzN,MAAM,IAAIwP,EAAEpM,EAAE2b,QAAQtR,GAAG,QAAQ+B,IAAI1D,EAAEkB,EAAEc,EAAEL,EAAE1R,EAAEyT,EAAErP,EAAEH,GAAE,EAAI,MAAO8L,IAAIgC,IAAI/R,EAAE,OAAOoE,EAAEA,GAAG,CAAC,EAAE6M,EAAE4R,iBAAiBxb,EAAErH,EAAE,IAAIiE,EAAE,GAAGwP,EAAEkC,EAAE,CAAC,EAAE6e,GAAGpwB,GAAGqP,EAAEiQ,MAAMzS,EAAEwC,EAAEklB,UAAUtxB,EAAEoM,EAAE+4B,SAAS96B,EAAE,MAAM4D,EAAE7B,EAAE+hB,SAAS/f,EAAEhC,EAAEgiB,UAAU/f,EAAED,GAAGpO,EAAEA,EAAEse,aAAa,GAAGlQ,KAAK,GAAG,KAAKpO,GAAGqO,GAAGJ,KAAKrR,EAAE,GAAGyJ,MAAM/M,KAAKoP,EAAEmW,iBAAiBnU,KAAK1K,IAAIiO,IAAIrR,EAAEyR,EAAEzR,EAAES,OAAQuM,GAAGA,EAAE0U,aAAa,GAAGlQ,OAAOC,GAAI,CAACrO,KAAKpD,EAAEpC,OAAO,OAAO,MAAM5B,EAAEq4B,GAAGC,cAAc,OAAOt4B,GAAGA,EAAEgW,QAAQ0iB,WAAW10B,EAAE6N,QAAQ7R,EAAEgW,QAAQ0iB,YAAY,OAAO,GAAGtxB,IAAIoM,EAAE8jB,WAAWtzB,EAAE6N,QAAQzK,IAAIixB,GAAGmU,UAAUxoC,EAAEwP,GAAG,CAAC,mBAAOi5B,CAAaz7B,EAAE5J,EAAEqK,GAAG,IAAI3B,EAAE,KAAKgC,EAAE,GAAG/R,EAAE,CAAC,EAAE,GAAGopC,GAAGn4B,IAAIlB,EAAEiC,SAASC,KAAKF,EAAEd,EAAE,iBAAiB5J,IAAIrH,EAAEqH,GAAG,CAAC,IAAI4J,aAAauX,aAAa4gB,GAAG/hC,KAAK0I,EAAEkB,EAAEc,EAAE1K,EAAE,iBAAiBqK,IAAI1R,EAAE0R,GAAG,CAAC,KAAK3B,IAAIgC,EAAE,OAAM,EAAG,MAAM3N,EAAEk0B,GAAG2T,QAAQ7pC,IAAI2N,GAAG,QAAQ3L,IAAIpE,EAAE2V,EAAE,CAAC,EAAEvR,EAAEhC,IAAI2P,IAAI,CAAC,EAAE/R,KAAKA,GAAGs4B,GAAGmU,UAAUnnC,MAAMsP,KAAK7E,EAAEmW,iBAAiBnU,IAAI/R,GAAG,CAAC,gBAAOysC,CAAUx7B,EAAE5J,GAAGA,EAAEsO,EAAE,CAAC,EAAE6e,GAAGntB,GAAG,CAAC,GAAG,MAAMqK,EAAE,GAAG,IAAI,MAAM3B,KAAKkB,EAAE,CAAC,MAAMA,EAAElB,EAAEkT,SAAS,CAAC,EAAElR,EAAEd,EAAEk4B,KAAKp5B,EAAE4V,aAAaujB,KAAKn5B,EAAE4V,aAAa,eAAe5V,EAAE4V,aAAawjB,UAAU,EAAE,IAAInpC,EAAE,MAAMoE,EAAEiD,EAAEmlC,SAAS,IAAIvoC,EAAEG,GAAGsN,EAAE7P,SAASwF,EAAEkwB,aAAav3B,EAAEoE,aAAa0Z,iBAAiB1Z,EAAEA,EAAEkb,cAAc,2BAA2Btf,IAAIA,EAAE+P,aAAa+N,iBAAiB/N,EAAEA,EAAEuP,cAAc,2BAA2Btf,IAAIiE,EAAEjE,EAAE2sC,YAAY3sC,EAAEmpC,UAAU,GAAGllC,GAAGjE,EAAEijB,UAAUhf,EAAEjE,EAAEijB,QAAQkO,SAASnxB,EAAEijB,QAAQkmB,UAAU,IAAI,MAAM11B,EAAE,CAACqV,IAAI/W,EAAE4mB,UAAU5oB,EAAE6Y,QAAQ5oB,EAAE6oB,WAAW5kB,EAAE0kB,SAAS1kB,GAAG,IAAI,MAAMoD,KAAK4J,EAAE,CAAC,IAAIS,EAAET,EAAE5J,GAAG,GAAGqK,EAAE,UAAUA,IAAI,SAASA,GAAGA,GAAG+B,EAAEpM,GAAGqK,CAAC,CAACA,EAAEpG,KAAKmI,EAAE,CAAC,OAAO,IAAI6kB,GAAG5mB,EAAErK,EAAE,CAAC,kBAAOkxB,CAAYtnB,GAAG,OAAGA,EAAS44B,GAAGznC,IAAI6O,GAAU3L,MAAMsP,KAAKi1B,GAAG7hB,UAAUukB,UAAU9mC,KAAMwL,IAAIA,EAAEqpB,aAAarpB,IAAK,IAAI,CAAC,eAAOwnB,GAAW,IAAIxnB,EAAE,OAAO,QAAQA,EAAEqnB,GAAGC,qBAAqB,IAAItnB,OAAO,EAAEA,EAAEwnB,aAAa,IAAI,CAAC,WAAOyM,CAAKj0B,EAAE,GAAG5J,EAAE,CAAC,GAAG,OAAO,IAAIixB,GAAGrnB,EAAE5J,EAAE,CAAC,WAAOmkB,GAAO,MAAMva,EAAEqnB,GAAGC,cAActnB,GAAGA,EAAEua,MAAM,CAAC,WAAOD,GAAO,MAAMta,EAAEqnB,GAAGC,cAActnB,GAAGA,EAAEsa,MAAM,CAAC,YAAO4N,CAAMloB,GAAE,KAAM5J,GAAG,GAAG4J,EAAE,IAAI,MAAMA,KAAK44B,GAAG7hB,SAAS/W,EAAEkoB,SAAS9xB,OAAO,CAAC,MAAM4J,EAAEqnB,GAAGC,cAActnB,GAAGA,EAAEkoB,SAAS9xB,EAAE,CAAC,EAAEnH,OAAO4B,eAAew2B,GAAG,UAAU,CAACn2B,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAM,WAAW7B,OAAO4B,eAAew2B,GAAG,WAAW,CAACn2B,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAMyyB,KAAKt0B,OAAO4B,eAAew2B,GAAG,UAAU,CAACn2B,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAMwlC,KAAKrnC,OAAO4B,eAAew2B,GAAG,UAAU,CAACn2B,YAAW,EAAG0Q,cAAa,EAAGC,UAAS,EAAG/Q,MAAM,IAAI2H,K,0BCExu1IjK,EAAQE,YAAa,EACrBF,EAAiB,aAAS,EAE1B,IAQgCG,EAR5BgtC,GAQ4BhtC,EARG,EAAQ,QAQUA,EAAID,WAAaC,EAAM,CAAE,QAAWA,GANrFuH,EAIJ,SAAiCvH,GAAO,GAAIA,GAAOA,EAAID,WAAc,OAAOC,EAAO,GAAY,OAARA,GAA+B,iBAARA,GAAmC,mBAARA,EAAsB,MAAO,CAAE,QAAWA,GAAS,IAAIitC,EAAQC,IAA4B,GAAID,GAASA,EAAMzhC,IAAIxL,GAAQ,OAAOitC,EAAMzqC,IAAIxC,GAAQ,IAAImtC,EAAS,CAAC,EAAOC,EAAwB9sC,OAAO4B,gBAAkB5B,OAAO+sC,yBAA0B,IAAK,IAAIpiC,KAAOjL,EAAO,GAAIM,OAAOa,UAAU8G,eAAelH,KAAKf,EAAKiL,GAAM,CAAE,IAAIqiC,EAAOF,EAAwB9sC,OAAO+sC,yBAAyBrtC,EAAKiL,GAAO,KAAUqiC,IAASA,EAAK9qC,KAAO8qC,EAAK7iC,KAAQnK,OAAO4B,eAAeirC,EAAQliC,EAAKqiC,GAAgBH,EAAOliC,GAAOjL,EAAIiL,EAAQ,CAAoE,OAAhEkiC,EAAgB,QAAIntC,EAASitC,GAASA,EAAMxiC,IAAIzK,EAAKmtC,GAAkBA,CAAQ,CAJ/tBI,CAAwB,EAAQ,OAE5C,SAASL,IAA6B,GAAuB,mBAAZM,QAAwB,OAAO,KAAM,IAAIP,EAAQ,IAAIO,QAA6F,OAAlFN,EAA2B,WAAsC,OAAOD,CAAO,EAAUA,CAAO,CAUjN,SAASQ,EAAkBC,EAAKC,IAAkB,MAAPA,GAAeA,EAAMD,EAAIzrC,UAAQ0rC,EAAMD,EAAIzrC,QAAQ,IAAK,IAAI6P,EAAI,EAAG87B,EAAO,IAAIloC,MAAMioC,GAAM77B,EAAI67B,EAAK77B,IAAO87B,EAAK97B,GAAK47B,EAAI57B,GAAM,OAAO87B,CAAM,CAEtL,SAASC,EAAkBzrC,EAAQyK,GAAS,IAAK,IAAIiF,EAAI,EAAGA,EAAIjF,EAAM5K,OAAQ6P,IAAK,CAAE,IAAIg8B,EAAajhC,EAAMiF,GAAIg8B,EAAWvrC,WAAaurC,EAAWvrC,aAAc,EAAOurC,EAAW76B,cAAe,EAAU,UAAW66B,IAAYA,EAAW56B,UAAW,GAAM5S,OAAO4B,eAAeE,EAAQ0rC,EAAW7iC,IAAK6iC,EAAa,CAAE,CAM5T,SAAS3tC,EAAgBC,EAAGC,GAA+G,OAA1GF,EAAkBG,OAAOC,gBAAkB,SAAyBH,EAAGC,GAAsB,OAAjBD,EAAEI,UAAYH,EAAUD,CAAG,EAAUD,EAAgBC,EAAGC,EAAI,CAEzK,IAAI0tC,EAAyB,SAAUC,GAJvC,IAAwBrtC,EAAUC,EAOhC,SAASmtC,EAAUltC,GACjB,IAAIC,EAQJ,OANAA,EAAQktC,EAAMjtC,KAAKC,KAAMH,IAASG,MAEvBitC,QACTntC,EAAMmtC,MAAQ,IAGTntC,CACT,CAjBgCF,EAKNotC,GALJrtC,EAKPotC,GALwC5sC,UAAYb,OAAOc,OAAOR,EAAWO,WAAYR,EAASQ,UAAUE,YAAcV,EAAUR,EAAgBQ,EAAUC,GAmB7K,IArBoBstC,EAAaC,EAqB7BC,EAASL,EAAU5sC,UA0VvB,OAxVAitC,EAAO7jB,OAAS,SAAgB8jB,GAG9B,OAFAA,EAASC,OAASttC,KAClBA,KAAKitC,MAAMviC,KAAK2iC,GACTrtC,IACT,EAEAotC,EAAOhf,QAAU,SAAiBif,GAGhC,OAFAA,EAASC,OAASttC,KAClBA,KAAKitC,MAAMM,QAAQF,GACZrtC,IACT,EAEAotC,EAAOxZ,GAAK,SAAYtqB,GACtB,OAAOtJ,KAAKitC,MAAM3jC,EACpB,EAEA8jC,EAAO9jC,MAAQ,SAAekkC,GAC5B,MAAqB,iBAAVA,EACFA,EAGFxtC,KAAKitC,MAAM/7B,QAAQs8B,EAC5B,EAEAJ,EAAOhe,YAAc,SAAqBoe,GAIxC,IAAIlkC,EAEJ,IAAK,IAAIkJ,KALTg7B,EAAQxtC,KAAKsJ,MAAMkkC,GACnBxtC,KAAK4zB,GAAG4Z,GAAOF,YAAS1pC,EACxB5D,KAAKitC,MAAM/kC,OAAOslC,EAAO,GAGVxtC,KAAKytC,SAClBnkC,EAAQtJ,KAAKytC,QAAQj7B,KAERg7B,IACXxtC,KAAKytC,QAAQj7B,GAAMlJ,EAAQ,GAI/B,OAAOtJ,IACT,EAEAotC,EAAOM,UAAY,WACjB,IAAK,IAA6DC,EAAzDC,EAzEb,SAAyCxuC,EAAGyuC,GAAkB,IAAI/uC,EAAI,GAAsB,oBAAX4I,QAAgD,MAAtBtI,EAAEsI,OAAOomC,UAAmB,CAAE,GAAIppC,MAAM+H,QAAQrN,KAAON,EAElK,SAAqCM,EAAG2uC,GAAU,GAAK3uC,EAAL,CAAgB,GAAiB,iBAANA,EAAgB,OAAOqtC,EAAkBrtC,EAAG2uC,GAAS,IAAI5+B,EAAI7P,OAAOa,UAAU8C,SAASlD,KAAKX,GAAG0N,MAAM,GAAI,GAAiE,MAAnD,WAANqC,GAAkB/P,EAAEiB,cAAa8O,EAAI/P,EAAEiB,YAAYiB,MAAgB,QAAN6N,GAAqB,QAANA,EAAoBzK,MAAMsP,KAAK5U,GAAc,cAAN+P,GAAqB,2CAA2ChL,KAAKgL,GAAWs9B,EAAkBrtC,EAAG2uC,QAAzG,CAA7O,CAA+V,CAFxPC,CAA4B5uC,KAAOyuC,GAAkBzuC,GAAyB,iBAAbA,EAAE6B,OAAqB,CAAMnC,IAAIM,EAAIN,GAAI,IAAIgS,EAAI,EAAG,OAAO,WAAc,OAAIA,GAAK1R,EAAE6B,OAAe,CAAEg5B,MAAM,GAAe,CAAEA,MAAM,EAAO94B,MAAO/B,EAAE0R,KAAQ,CAAG,CAAE,MAAM,IAAIlQ,UAAU,wIAA0I,CAA6B,OAA3B9B,EAAKM,EAAEsI,OAAOomC,aAAuBljB,KAAKxX,KAAKtU,EAAK,CAyElkBmvC,CAAgCjuC,KAAKitC,SAAiBU,EAAQC,KAAa3T,MACnF0T,EAAMxsC,MACZmsC,YAAS1pC,EAIhB,OADA5D,KAAKitC,MAAQ,GACNjtC,IACT,EAEAotC,EAAOc,MAAQ,WACb,OAAOluC,KAAK0tC,WACd,EAEAN,EAAOe,YAAc,SAAqBC,EAASC,GACjDA,EAAQf,OAASttC,KACjB,IAGIsJ,EAHAglC,EAAWtuC,KAAKsJ,MAAM8kC,GAK1B,IAAK,IAAI57B,KAJTxS,KAAKitC,MAAM/kC,OAAOomC,EAAW,EAAG,EAAGD,GACnCA,EAAQf,OAASttC,KAGFA,KAAKytC,QAGda,IAFJhlC,EAAQtJ,KAAKytC,QAAQj7B,MAGnBxS,KAAKytC,QAAQj7B,GAAMlJ,EAAQ,GAI/B,OAAOtJ,IACT,EAEAotC,EAAO7uB,aAAe,SAAsB6vB,EAASC,GACnDA,EAAQf,OAASttC,KACjB,IAGIsJ,EAHAglC,EAAWtuC,KAAKsJ,MAAM8kC,GAK1B,IAAK,IAAI57B,KAJTxS,KAAKitC,MAAM/kC,OAAOomC,EAAU,EAAGD,GAC/BA,EAAQf,OAASttC,KAGFA,KAAKytC,SAClBnkC,EAAQtJ,KAAKytC,QAAQj7B,KAER87B,IACXtuC,KAAKytC,QAAQj7B,GAAMlJ,EAAQ,GAI/B,OAAOtJ,IACT,EAEAotC,EAAOmB,qBAAuB,SAA8BC,EAAMC,GAChE,IAAIC,OAAQ9qC,EAcZ,OAbA5D,KAAK2uC,KAAK,SAAUC,GAClB,GAAIA,EAAKC,WAAY,CACnB,IAAIC,EAAaF,EAAKC,WAAWL,EAAMC,GAEvC,GAAIK,EAEF,OADAJ,EAAQI,GACD,CAEX,MAAO,GAAIF,EAAKG,aAAaP,EAAMC,GAEjC,OADAC,EAAQE,GACD,CAEX,GACOF,CACT,EAgBAtB,EAAOyB,WAAa,SAAoBL,EAAMC,GAC5C,OAAIzuC,KAAK+uC,aAAaP,EAAMC,GACnBzuC,KAAKuuC,qBAAqBC,EAAMC,IAAQzuC,UAE/C,CAEJ,EAEAotC,EAAO4B,kBAAoB,WACrBhvC,KAAKivC,MAAQjvC,KAAKivC,KAAK3sC,QAAUtC,KAAKivC,KAAK3sC,OAAOyQ,MACpD/S,KAAKsC,OAAStC,KAAKsC,QAAU,CAAC,EAC9BtC,KAAKsC,OAAOyQ,IAAM/S,KAAKsC,OAAOyQ,KAAO,CAAC,EACtCzT,OAAO0V,OAAOhV,KAAKsC,OAAOyQ,IAAK/S,KAAKivC,KAAK3sC,OAAOyQ,KAEpD,EAEAq6B,EAAOuB,KAAO,SAAcO,GACrBlvC,KAAKmvC,WACRnvC,KAAKmvC,SAAW,GAGbnvC,KAAKytC,UACRztC,KAAKytC,QAAU,CAAC,GAGlBztC,KAAKmvC,WACL,IAAI38B,EAAKxS,KAAKmvC,SAGd,GAFAnvC,KAAKytC,QAAQj7B,GAAM,EAEdxS,KAAKiB,OAAV,CAMA,IAFA,IAAIqI,EAAOH,EAEJnJ,KAAKytC,QAAQj7B,GAAMxS,KAAKiB,SAC7BqI,EAAQtJ,KAAKytC,QAAQj7B,IAGN,KAFfrJ,EAAS+lC,EAASlvC,KAAK4zB,GAAGtqB,GAAQA,MAMlCtJ,KAAKytC,QAAQj7B,IAAO,EAKtB,cAFOxS,KAAKytC,QAAQj7B,IAEL,IAAXrJ,QAAJ,CAjBA,CAoBF,EAEAikC,EAAOgC,KAAO,SAAcF,GAC1B,OAAOlvC,KAAK2uC,KAAK,SAAUC,EAAM99B,GAC/B,IAAI3H,EAAS+lC,EAASN,EAAM99B,GAM5B,IAJe,IAAX3H,GAAoBylC,EAAK3tC,SAC3BkI,EAASylC,EAAKQ,KAAKF,KAGN,IAAX/lC,EACF,OAAO,CAEX,EACF,EAEAikC,EAAOiC,eAAiB,SAAwBH,GAC9C,IAAII,EAAStvC,KAEb,OAAOA,KAAKovC,KAAK,SAAU/B,GACzB,GAAIA,EAASptC,OAASsG,EAAMgpC,UAC1B,OAAOL,EAASnvC,KAAKuvC,EAAQjC,EAEjC,EACF,EAEAD,EAAOoC,YAAc,SAAqBN,GACxC,IAAIO,EAASzvC,KAEb,OAAOA,KAAKovC,KAAK,SAAU/B,GACzB,GAAIA,EAASptC,OAASsG,EAAMmpC,MAC1B,OAAOR,EAASnvC,KAAK0vC,EAAQpC,EAEjC,EACF,EAEAD,EAAOuC,gBAAkB,SAAyBT,GAChD,IAAIU,EAAS5vC,KAEb,OAAOA,KAAKovC,KAAK,SAAU/B,GACzB,GAAIA,EAASptC,OAASsG,EAAMspC,WAC1B,OAAOX,EAASnvC,KAAK6vC,EAAQvC,EAEjC,EACF,EAEAD,EAAO0C,aAAe,SAAsBZ,GAC1C,IAAIa,EAAS/vC,KAEb,OAAOA,KAAKovC,KAAK,SAAU/B,GACzB,GAAIA,EAASptC,OAASsG,EAAMypC,QAC1B,OAAOd,EAASnvC,KAAKgwC,EAAQ1C,EAEjC,EACF,EAEAD,EAAO6C,QAAU,SAAiBf,GAChC,IAAIgB,EAASlwC,KAEb,OAAOA,KAAKovC,KAAK,SAAU/B,GACzB,GAAIA,EAASptC,OAASsG,EAAM4pC,GAC1B,OAAOjB,EAASnvC,KAAKmwC,EAAQ7C,EAEjC,EACF,EAEAD,EAAOgD,YAAc,SAAqBlB,GACxC,IAAImB,EAASrwC,KAEb,OAAOA,KAAKovC,KAAK,SAAU/B,GACzB,GAAIA,EAASptC,OAASsG,EAAM+pC,QAC1B,OAAOpB,EAASnvC,KAAKswC,EAAQhD,EAEjC,EACF,EAEAD,EAAOmD,YAAc,SAAqBrB,GACxC,IAAIsB,EAASxwC,KAEb,OAAOA,KAAKovC,KAAK,SAAU/B,GACzB,GAAIA,EAASptC,OAASsG,EAAMkqC,OAC1B,OAAOvB,EAASnvC,KAAKywC,EAAQnD,EAEjC,EACF,EAEAD,EAAOsD,SAAW,SAAkBxB,GAClC,IAAIyB,EAAS3wC,KAEb,OAAOA,KAAKovC,KAAK,SAAU/B,GACzB,GAAIA,EAASptC,OAASsG,EAAMrG,IAC1B,OAAOgvC,EAASnvC,KAAK4wC,EAAQtD,EAEjC,EACF,EAEAD,EAAOwD,eAAiB,SAAwB1B,GAC9C,IAAI2B,EAAU7wC,KAEd,OAAOA,KAAKovC,KAAK,SAAU/B,GACzB,GAAIA,EAASptC,OAASsG,EAAMuqC,UAC1B,OAAO5B,EAASnvC,KAAK8wC,EAASxD,EAElC,EACF,EAEAD,EAAOv7B,MAAQ,SAAeq9B,GAC5B,IAAI6B,EAAU/wC,KAEVoc,EAAU,GACd,OAAOpc,KAAKiV,OAAO,SAAU+7B,EAAMpC,EAAMtlC,GACvC,IAAIuI,EAAQq9B,EAASnvC,KAAKgxC,EAASnC,GAUnC,OATAxyB,EAAQ1R,KAAKkkC,GAET/8B,GACFm/B,EAAKtmC,KAAK0R,GACVA,EAAU,IACD9S,IAAUynC,EAAQ9vC,OAAS,GACpC+vC,EAAKtmC,KAAK0R,GAGL40B,CACT,EAAG,GACL,EAEA5D,EAAOrqC,IAAM,SAAamsC,GACxB,OAAOlvC,KAAKitC,MAAMlqC,IAAImsC,EACxB,EAEA9B,EAAOn4B,OAAS,SAAgBi6B,EAAU8B,GACxC,OAAOhxC,KAAKitC,MAAMh4B,OAAOi6B,EAAU8B,EACrC,EAEA5D,EAAO6D,MAAQ,SAAe/B,GAC5B,OAAOlvC,KAAKitC,MAAMgE,MAAM/B,EAC1B,EAEA9B,EAAOnpC,KAAO,SAAcirC,GAC1B,OAAOlvC,KAAKitC,MAAMhpC,KAAKirC,EACzB,EAEA9B,EAAOtpC,OAAS,SAAgBorC,GAC9B,OAAOlvC,KAAKitC,MAAMnpC,OAAOorC,EAC3B,EAEA9B,EAAOpuB,KAAO,SAAckwB,GAC1B,OAAOlvC,KAAKitC,MAAMjuB,KAAKkwB,EACzB,EAEA9B,EAAOnqC,SAAW,WAChB,OAAOjD,KAAK+C,IAAIsM,QAAQ5L,KAAK,GAC/B,EA5VoBypC,EA8VPH,GA9VoBI,EA8VT,CAAC,CACvBljC,IAAK,QACLzI,IAAK,WACH,OAAOxB,KAAK4zB,GAAG,EACjB,GACC,CACD3pB,IAAK,OACLzI,IAAK,WACH,OAAOxB,KAAK4zB,GAAG5zB,KAAKiB,OAAS,EAC/B,GACC,CACDgJ,IAAK,SACLzI,IAAK,WACH,OAAOxB,KAAKitC,MAAMhsC,MACpB,MA5W0E4rC,EAAkBK,EAAY/sC,UAAWgtC,GA+W9GJ,CACT,CA1W6B,CA0W3Bf,EAAe,SAEjBntC,EAAiB,QAAIkuC,EACrBnuC,EAAOC,QAAUA,EAAQyB,O,0BCzYzB,IAAI4wC,EAAW,gBAGXC,EAFsB,EAAQ,KAEdC,CAAoB,WAIxCxyC,EAAOC,QAAWsyC,EAGd,GAAGr/B,QAH2B,SAAiBhN,GACjD,OAAOosC,EAASlxC,KAAM8E,EAAY9D,UAAUC,OAAS,EAAID,UAAU,QAAK4C,EAE1E,C,0BCVA,IAAIS,EAAI,EAAQ,MACZgtC,EAAa,EAAQ,MACrBC,EAAU,EAAQ,MAClBC,EAA2B,EAAQ,KACnCC,EAA6B,mBAC7BC,EAAiB,EAAQ,MAEzBC,EAA4BL,EAAW,WACvCM,EAAgBL,IAAYE,EAIhCntC,EAAE,CAAEjD,OAAQ,UAAWwwC,MAAM,EAAMhtC,OAAQ0sC,GAAWE,GAA8B,CAClFrG,QAAS,SAAiB3wB,GACxB,OAAOi3B,EAAeE,GAAiB3xC,OAAS0xC,EAA4BH,EAA2BvxC,KAAMwa,EAC/G,G,0BCfF,IAAIq3B,EAAc,EAAQ,MACtBC,EAAQ,EAAQ,MAChBnzC,EAAa,EAAQ,MACrBozC,EAAS,EAAQ,MACjBC,EAAc,EAAQ,MACtBC,EAA6B,oBAC7BC,EAAgB,EAAQ,MACxBC,EAAsB,EAAQ,MAE9BC,EAAuBD,EAAoBE,QAC3CC,EAAmBH,EAAoB3wC,IACvC+wC,EAAUljC,OAEVnO,EAAiB5B,OAAO4B,eACxBsxC,EAAcX,EAAY,GAAG/kC,OAC7B3J,EAAU0uC,EAAY,GAAG1uC,SACzBM,EAAOouC,EAAY,GAAGpuC,MAEtBgvC,EAAsBT,IAAgBF,EAAM,WAC9C,OAAsF,IAA/E5wC,EAAe,WAA0B,EAAG,SAAU,CAAEC,MAAO,IAAKF,MAC7E,GAEIyxC,EAAWrjC,OAAOA,QAAQwC,MAAM,UAEhC8gC,EAAc/zC,EAAOC,QAAU,SAAUsC,EAAOG,EAAM+T,GACf,YAArCm9B,EAAYD,EAAQjxC,GAAO,EAAG,KAChCA,EAAO,IAAM6B,EAAQovC,EAAQjxC,GAAO,wBAAyB,MAAQ,KAEnE+T,GAAWA,EAAQu9B,SAAQtxC,EAAO,OAASA,GAC3C+T,GAAWA,EAAQw9B,SAAQvxC,EAAO,OAASA,KAC1CywC,EAAO5wC,EAAO,SAAY8wC,GAA8B9wC,EAAMG,OAASA,KACtE0wC,EAAa9wC,EAAeC,EAAO,OAAQ,CAAEA,MAAOG,EAAM2Q,cAAc,IACvE9Q,EAAMG,KAAOA,GAEhBmxC,GAAuBp9B,GAAW08B,EAAO18B,EAAS,UAAYlU,EAAMF,SAAWoU,EAAQy9B,OACzF5xC,EAAeC,EAAO,SAAU,CAAEA,MAAOkU,EAAQy9B,QAEnD,IACMz9B,GAAW08B,EAAO18B,EAAS,gBAAkBA,EAAQhV,YACnD2xC,GAAa9wC,EAAeC,EAAO,YAAa,CAAE+Q,UAAU,IAEvD/Q,EAAMhB,YAAWgB,EAAMhB,eAAYyD,EAChD,CAAE,MAAOo3B,GAAqB,CAC9B,IAAIpc,EAAQwzB,EAAqBjxC,GAG/B,OAFG4wC,EAAOnzB,EAAO,YACjBA,EAAMtc,OAASmB,EAAKivC,EAAyB,iBAARpxC,EAAmBA,EAAO,KACxDH,CACX,EAIA2E,SAAS3F,UAAU8C,SAAW0vC,EAAY,WACxC,OAAOh0C,EAAWqB,OAASsyC,EAAiBtyC,MAAMsC,QAAU4vC,EAAclyC,KAC5E,EAAG,W,0BCpDHnB,EAAQE,YAAa,EACrBF,EAAiB,aAAS,EAE1B,IAAIk0C,EAAUC,EAAuB,EAAQ,OAEzCC,EAAQ,EAAQ,MAEhBjH,EAAQgH,EAAuB,EAAQ,OAEvC9zC,EAAS,EAAQ,MAErB,SAAS8zC,EAAuBh0C,GAAO,OAAOA,GAAOA,EAAID,WAAaC,EAAM,CAAE,QAAWA,EAAO,CAEhG,SAAS6tC,EAAkBzrC,EAAQyK,GAAS,IAAK,IAAIiF,EAAI,EAAGA,EAAIjF,EAAM5K,OAAQ6P,IAAK,CAAE,IAAIg8B,EAAajhC,EAAMiF,GAAIg8B,EAAWvrC,WAAaurC,EAAWvrC,aAAc,EAAOurC,EAAW76B,cAAe,EAAU,UAAW66B,IAAYA,EAAW56B,UAAW,GAAM5S,OAAO4B,eAAeE,EAAQ0rC,EAAW7iC,IAAK6iC,EAAa,CAAE,CAM5T,SAAS3tC,EAAgBC,EAAGC,GAA+G,OAA1GF,EAAkBG,OAAOC,gBAAkB,SAAyBH,EAAGC,GAAsB,OAAjBD,EAAEI,UAAYH,EAAUD,CAAG,EAAUD,EAAgBC,EAAGC,EAAI,CAEzK,IAAI6zC,EAAyB,SAAUlG,GAJvC,IAAwBrtC,EAAUC,EAFZstC,EAAaC,EASjC,SAAS+F,EAAUrzC,GACjB,IAAIC,EAKJ,OAHAA,EAAQktC,EAAMjtC,KAAKC,KAAMH,IAASG,MAC5BC,KAAOf,EAAOwwC,MACpB5vC,EAAMqzC,cAAe,EACdrzC,CACT,CA+BA,OA7CgCF,EAKNotC,GALJrtC,EAKPuzC,GALwC/yC,UAAYb,OAAOc,OAAOR,EAAWO,WAAYR,EAASQ,UAAUE,YAAcV,EAAUR,EAAgBQ,EAAUC,GAgBhKszC,EAAU/yC,UAEhBizC,cAAgB,WACrB,MAAO,IAAMpG,EAAM7sC,UAAUizC,cAAcrzC,KAAKC,KAClD,EAtBoBktC,EAwBPgG,GAxBoB/F,EAwBT,CAAC,CACvBljC,IAAK,QACLzI,IAAK,WACH,OAAOxB,KAAKqzC,MACd,EACA5pC,IAAK,SAAazG,GAChB,GAAIhD,KAAKmzC,aAAc,CACrB,IAAIG,GAAU,EAAIP,EAAiB,SAAG/vC,EAAG,CACvCuwC,cAAc,IAGZD,IAAYtwC,IACd,EAAIiwC,EAAMO,cAAcxzC,KAAM,QAC9BA,KAAKyzC,KAAKtyC,MAAQmyC,GACTtzC,KAAKyzC,aACPzzC,KAAKyzC,KAAKtyC,KAErB,CAEAnB,KAAKqzC,OAASrwC,CAChB,MA5C0E6pC,EAAkBK,EAAY/sC,UAAWgtC,GA+C9G+F,CACT,CA1C6B,CA0C3BlH,EAAe,SAEjBntC,EAAiB,QAAIq0C,EACrBt0C,EAAOC,QAAUA,EAAQyB,O,0BCnEjB,EAAQ,KAKhB+D,CAAE,CAAEjD,OAAQ,SAAUwwC,MAAM,GAAQ,CAClCryC,eALmB,EAAQ,O,0BCA7B,IAAIm0C,EAAU,EAAQ,MAClBC,EAAkB,EAAQ,MAC1BC,EAAuB,UACvBC,EAAa,EAAQ,MAErBC,EAA+B,iBAAV/iC,QAAsBA,QAAUzR,OAAO8V,oBAC5D9V,OAAO8V,oBAAoBrE,QAAU,GAWzCnS,EAAOC,QAAQqW,EAAI,SAA6BpW,GAC9C,OAAOg1C,GAA+B,WAAhBJ,EAAQ50C,GAVX,SAAUA,GAC7B,IACE,OAAO80C,EAAqB90C,EAC9B,CAAE,MAAOk8B,GACP,OAAO6Y,EAAWC,EACpB,CACF,CAKMC,CAAej1C,GACf80C,EAAqBD,EAAgB70C,GAC3C,C,0BCtBA,IAAIkzC,EAAc,EAAQ,MACtBD,EAAS,EAAQ,MAEjBiC,EAAoBluC,SAAS3F,UAE7B8zC,EAAgBjC,GAAe1yC,OAAO+sC,yBAEtC6H,EAASnC,EAAOiC,EAAmB,QAEnCG,EAASD,GAA0D,cAAhD,WAAqC,EAAE5yC,KAC1D8yC,EAAeF,KAAYlC,GAAgBA,GAAeiC,EAAcD,EAAmB,QAAQ/hC,cAEvGrT,EAAOC,QAAU,CACfq1C,OAAQA,EACRC,OAAQA,EACRC,aAAcA,E,0BCdhBv1C,EAAQE,YAAa,EACrBF,EAAiB,aAAS,EAE1B,IAEgCG,EAF5Bq1C,GAE4Br1C,EAFK,EAAQ,QAEQA,EAAID,WAAaC,EAAM,CAAE,QAAWA,GAErFs1C,EAAyB,WAC3B,SAASA,EAAU9uC,EAAM6P,GACvBrV,KAAKwF,KAAOA,GAAQ,WAAiB,EAErCxF,KAAKu0C,QAAU,KACfv0C,KAAKqV,QAAUA,CACjB,CAEA,IAAI+3B,EAASkH,EAAUn0C,UAwLvB,OAtLAitC,EAAOoH,sBAAwB,SAA+BC,EAAMp/B,GAOlE,YANqB,IAAjBA,IACFA,EAAU,CAAC,IAKiB,IAFjB/V,OAAO0V,OAAO,CAAC,EAAGhV,KAAKqV,QAASA,GAElCq/B,gBAGc,iBAATD,CAElB,EAEArH,EAAOuH,SAAW,SAAkBt/B,GAOlC,YANqB,IAAjBA,IACFA,EAAU,CAAC,IAKW,IAFX/V,OAAO0V,OAAO,CAAC,EAAGhV,KAAKqV,QAASA,GAElCu/B,QAKb,EAEAxH,EAAOyH,MAAQ,SAAeJ,EAAMp/B,GAMlC,YALqB,IAAjBA,IACFA,EAAU,CAAC,GAGA,IAAIg/B,EAAiB,QAAEI,EAAMz0C,KAAK80C,cAAcz/B,IAC/CxP,IAChB,EAEAunC,EAAO0H,cAAgB,SAAuBz/B,GAC5C,MAAO,CACL0/B,MAAO/0C,KAAK20C,SAASt/B,GAEzB,EAEA+3B,EAAO4H,KAAO,SAAcP,EAAMp/B,GAChC,IAAIvV,EAAQE,KAMZ,YAJqB,IAAjBqV,IACFA,EAAU,CAAC,GAGN,IAAIukB,QAAQ,SAAUuR,EAAS8J,GACpC,IACE,IAAIpvC,EAAO/F,EAAM+0C,MAAMJ,EAAMp/B,GAE7BukB,QAAQuR,QAAQrrC,EAAM0F,KAAKK,IAAO4zB,KAAK,SAAUh0B,GAC/C,IAAIqI,OAASlK,EAOb,OALI9D,EAAM00C,sBAAsBC,EAAMp/B,KACpCvH,EAASjI,EAAK5C,WACdwxC,EAAKpH,SAAWv/B,GAGX,CACLrI,UAAWA,EACXI,KAAMA,EACNiI,OAAQA,EAEZ,GAAG2rB,KAAK0R,EAAS8J,EACnB,CAAE,MAAOxuC,GAEP,YADAwuC,EAAOxuC,EAET,CACF,EACF,EAEA2mC,EAAO8H,SAAW,SAAkBT,EAAMp/B,QACnB,IAAjBA,IACFA,EAAU,CAAC,GAGb,IAAIxP,EAAO7F,KAAK60C,MAAMJ,EAAMp/B,GAExB5P,EAAYzF,KAAKwF,KAAKK,GAE1B,GAAIJ,GAAuC,mBAAnBA,EAAUg0B,KAChC,MAAM,IAAI7iB,MAAM,gEAGlB,IAAI9I,OAASlK,EAOb,OALIyR,EAAQq/B,gBAAkC,iBAATD,IACnC3mC,EAASjI,EAAK5C,WACdwxC,EAAKpH,SAAWv/B,GAGX,CACLrI,UAAWA,EACXI,KAAMA,EACNiI,OAAQA,EAEZ,EAUAs/B,EAAO+H,IAAM,SAAaV,EAAMp/B,GAC9B,OAAOrV,KAAKg1C,KAAKP,EAAMp/B,GAASokB,KAAK,SAAUtwB,GAC7C,OAAOA,EAAOtD,IAChB,EACF,EAUAunC,EAAOgI,QAAU,SAAiBX,EAAMp/B,GACtC,OAAOrV,KAAKk1C,SAAST,EAAMp/B,GAASxP,IACtC,EAUAunC,EAAO3nC,UAAY,SAAmBgvC,EAAMp/B,GAC1C,OAAOrV,KAAKg1C,KAAKP,EAAMp/B,GAASokB,KAAK,SAAUtwB,GAC7C,OAAOA,EAAO1D,SAChB,EACF,EAUA2nC,EAAOiI,cAAgB,SAAuBZ,EAAMp/B,GAClD,OAAOrV,KAAKk1C,SAAST,EAAMp/B,GAAS5P,SACtC,EAUA2nC,EAAOhnC,QAAU,SAAiBquC,EAAMp/B,GACtC,OAAOrV,KAAKg1C,KAAKP,EAAMp/B,GAASokB,KAAK,SAAUtwB,GAC7C,OAAOA,EAAO2E,QAAU3E,EAAOtD,KAAK5C,UACtC,EACF,EAUAmqC,EAAOkI,YAAc,SAAqBb,EAAMp/B,GAC9C,IAAIlM,EAASnJ,KAAKk1C,SAAST,EAAMp/B,GAEjC,OAAOlM,EAAO2E,QAAU3E,EAAOtD,KAAK5C,UACtC,EAEOqxC,CACT,CAjM6B,GAmM7Bz1C,EAAiB,QAAIy1C,EACrB11C,EAAOC,QAAUA,EAAQyB,O,wBCnMzB,SAASi1C,EAAaC,EAAQC,GAC1B,MAAO,CACHC,QAASF,EACTC,SAER,CAdAn2C,OAAO4B,eAAerC,EAAS,aAAc,CACzCsC,OAAO,IAEX7B,OAAO4B,eAAerC,EAAS,UAAW,CACtC0C,YAAY,EACZC,IAAK,WACD,OAAOm0C,CACX,IAQJJ,EAAaK,YAAc,SAASC,EAAgBC,EAAiB,KAAI,CAAG,IACxE,MAAMC,EAAkB,SAAS1gC,GAC7B,MAAO,CACH2gC,UAAW3gC,EACXqgC,QAASG,EAAexgC,GACxBogC,OAAQK,EAAezgC,GAE/B,EAMA,OALA0gC,EAAgBE,qBAAsB,EAGtCF,EAAgBG,iBAAmBL,EACnCE,EAAgBI,iBAAmBL,EAC5BC,CACX,EACA,MAAMJ,EAAWJ,C,0BC9BjB,IAAIlE,EAAa,EAAQ,MAEzBzyC,EAAOC,QAAUwyC,EAAW,WAAY,kB,sBCFxCzyC,EAAOC,QAAU,CAAC,C,0BCAlB,IAiDIu3C,EAAUC,EAAsBC,EAAgBC,EAjDhDlyC,EAAI,EAAQ,MACZitC,EAAU,EAAQ,MAClBkF,EAAU,EAAQ,MAClBC,EAAa,EAAQ,MACrBC,EAAO,EAAQ,MACf32C,EAAO,EAAQ,MACf42C,EAAgB,EAAQ,MACxBp3C,EAAiB,EAAQ,MACzBq3C,EAAiB,EAAQ,KACzBC,EAAa,EAAQ,MACrBt2C,EAAY,EAAQ,MACpB5B,EAAa,EAAQ,MACrBuK,EAAW,EAAQ,IACnB4tC,EAAa,EAAQ,KACrBC,EAAqB,EAAQ,MAC7BC,EAAO,YACPC,EAAY,EAAQ,MACpBC,EAAmB,EAAQ,MAC3BC,EAAU,EAAQ,MAClBC,EAAQ,EAAQ,MAChBjF,EAAsB,EAAQ,MAC9BZ,EAA2B,EAAQ,KACnC8F,EAA8B,EAAQ,KACtCC,EAA6B,EAAQ,MAErCC,EAAU,UACV/F,EAA6B6F,EAA4BG,YACzDC,EAAiCJ,EAA4BK,gBAC7DC,EAA6BN,EAA4BO,YACzDC,EAA0B1F,EAAoB2F,UAAUP,GACxDQ,EAAmB5F,EAAoB1oC,IACvCuuC,EAAyBzG,GAA4BA,EAAyBpxC,UAC9E83C,EAAqB1G,EACrB2G,EAAmBF,EACnBp3C,EAAY61C,EAAW71C,UACvBwQ,EAAWqlC,EAAWrlC,SACtBhL,EAAUqwC,EAAWrwC,QACrB+xC,EAAuBb,EAA2BpiC,EAClDkjC,EAA8BD,EAE9BE,KAAoBjnC,GAAYA,EAASknC,aAAe7B,EAAW9mB,eACnE4oB,EAAsB,qBAWtBC,EAAa,SAAU15C,GACzB,IAAI26B,EACJ,SAAOvwB,EAASpK,KAAOH,EAAW86B,EAAO36B,EAAG26B,QAAQA,CACtD,EAEIgf,EAAe,SAAUC,EAAU95B,GACrC,IAMIzV,EAAQswB,EAAMkf,EANdx3C,EAAQyd,EAAMzd,MACdy3C,EAfU,IAeLh6B,EAAMA,MACX82B,EAAUkD,EAAKF,EAASE,GAAKF,EAASG,KACtC1N,EAAUuN,EAASvN,QACnB8J,EAASyD,EAASzD,OAClB6D,EAASJ,EAASI,OAEtB,IACMpD,GACGkD,IApBK,IAqBJh6B,EAAMm6B,WAAyBC,EAAkBp6B,GACrDA,EAAMm6B,UAvBA,IAyBQ,IAAZrD,EAAkBvsC,EAAShI,GAEzB23C,GAAQA,EAAOG,QACnB9vC,EAASusC,EAAQv0C,GACb23C,IACFA,EAAOplB,OACPilB,GAAS,IAGTxvC,IAAWuvC,EAASQ,QACtBjE,EAAO,IAAIr0C,EAAU,yBACZ64B,EAAO+e,EAAWrvC,IAC3BpJ,EAAK05B,EAAMtwB,EAAQgiC,EAAS8J,GACvB9J,EAAQhiC,IACV8rC,EAAO9zC,EAChB,CAAE,MAAO65B,GACH8d,IAAWH,GAAQG,EAAOplB,OAC9BuhB,EAAOja,EACT,CACF,EAEIme,EAAS,SAAUv6B,EAAOw6B,GACxBx6B,EAAMy6B,WACVz6B,EAAMy6B,UAAW,EACjBpC,EAAU,WAGR,IAFA,IACIyB,EADAY,EAAY16B,EAAM06B,UAEfZ,EAAWY,EAAU93C,OAC1Bi3C,EAAaC,EAAU95B,GAEzBA,EAAMy6B,UAAW,EACbD,IAAax6B,EAAMm6B,WAAWQ,EAAY36B,EAChD,GACF,EAEI+Q,EAAgB,SAAUruB,EAAM43C,EAASM,GAC3C,IAAI12B,EAAO4yB,EACP2C,IACFv1B,EAAQ1R,EAASknC,YAAY,UACvBY,QAAUA,EAChBp2B,EAAM02B,OAASA,EACf12B,EAAM22B,UAAUn4C,GAAM,GAAO,GAC7Bm1C,EAAW9mB,cAAc7M,IACpBA,EAAQ,CAAEo2B,QAASA,EAASM,OAAQA,IACtC/B,IAAmC/B,EAAUe,EAAW,KAAOn1C,IAAQo0C,EAAQ5yB,GAC3ExhB,IAASi3C,GAAqBrB,EAAiB,8BAA+BsC,EACzF,EAEID,EAAc,SAAU36B,GAC1B7e,EAAKi3C,EAAMP,EAAY,WACrB,IAGIttC,EAHA+vC,EAAUt6B,EAAM86B,OAChBv4C,EAAQyd,EAAMzd,MAGlB,GAFmBw4C,EAAY/6B,KAG7BzV,EAASguC,EAAQ,WACXX,EACFpwC,EAAQ+P,KAAK,qBAAsBhV,EAAO+3C,GACrCvpB,EAAc4oB,EAAqBW,EAAS/3C,EACrD,GAEAyd,EAAMm6B,UAAYvC,GAAWmD,EAAY/6B,GArF/B,EADF,EAuFJzV,EAAO6xB,OAAO,MAAM7xB,EAAOhI,KAEnC,EACF,EAEIw4C,EAAc,SAAU/6B,GAC1B,OA7FY,IA6FLA,EAAMm6B,YAA0Bn6B,EAAM0uB,MAC/C,EAEI0L,EAAoB,SAAUp6B,GAChC7e,EAAKi3C,EAAMP,EAAY,WACrB,IAAIyC,EAAUt6B,EAAM86B,OAChBlD,EACFpwC,EAAQ+P,KAAK,mBAAoB+iC,GAC5BvpB,EAzGa,mBAyGoBupB,EAASt6B,EAAMzd,MACzD,EACF,EAEIiS,GAAO,SAAUwmC,EAAIh7B,EAAOi7B,GAC9B,OAAO,SAAU14C,GACfy4C,EAAGh7B,EAAOzd,EAAO04C,EACnB,CACF,EAEIC,GAAiB,SAAUl7B,EAAOzd,EAAO04C,GACvCj7B,EAAMqb,OACVrb,EAAMqb,MAAO,EACT4f,IAAQj7B,EAAQi7B,GACpBj7B,EAAMzd,MAAQA,EACdyd,EAAMA,MArHO,EAsHbu6B,EAAOv6B,GAAO,GAChB,EAEIm7B,GAAkB,SAAUn7B,EAAOzd,EAAO04C,GAC5C,IAAIj7B,EAAMqb,KAAV,CACArb,EAAMqb,MAAO,EACT4f,IAAQj7B,EAAQi7B,GACpB,IACE,GAAIj7B,EAAM86B,SAAWv4C,EAAO,MAAM,IAAIP,EAAU,oCAChD,IAAI64B,EAAO+e,EAAWr3C,GAClBs4B,EACFwd,EAAU,WACR,IAAI+C,EAAU,CAAE/f,MAAM,GACtB,IACEl6B,EAAK05B,EAAMt4B,EACTiS,GAAK2mC,GAAiBC,EAASp7B,GAC/BxL,GAAK0mC,GAAgBE,EAASp7B,GAElC,CAAE,MAAOoc,GACP8e,GAAeE,EAAShf,EAAOpc,EACjC,CACF,IAEAA,EAAMzd,MAAQA,EACdyd,EAAMA,MA/II,EAgJVu6B,EAAOv6B,GAAO,GAElB,CAAE,MAAOoc,GACP8e,GAAe,CAAE7f,MAAM,GAASe,EAAOpc,EACzC,CAzBsB,CA0BxB,EAGA,GAAI4yB,IAcF0G,GAZAD,EAAqB,SAAiBgC,GACpCnD,EAAW92C,KAAMk4C,GACjB33C,EAAU05C,GACVl6C,EAAKq2C,EAAUp2C,MACf,IAAI4e,EAAQi5B,EAAwB73C,MACpC,IACEi6C,EAAS7mC,GAAK2mC,GAAiBn7B,GAAQxL,GAAK0mC,GAAgBl7B,GAC9D,CAAE,MAAOoc,GACP8e,GAAel7B,EAAOoc,EACxB,CACF,GAEsC76B,WAGtCi2C,EAAW,SAAiB6D,GAC1BlC,EAAiB/3C,KAAM,CACrBC,KAAMs3C,EACNtd,MAAM,EACNof,UAAU,EACV/L,QAAQ,EACRgM,UAAW,IAAIlC,EACf2B,WAAW,EACXn6B,MAlLQ,EAmLRzd,MAAO,MAEX,GAIShB,UAAYw2C,EAAcuB,EAAkB,OAAQ,SAAcgC,EAAaC,GACtF,IAAIv7B,EAAQi5B,EAAwB73C,MAChC04C,EAAWP,EAAqBpB,EAAmB/2C,KAAMi4C,IAS7D,OARAr5B,EAAM0uB,QAAS,EACfoL,EAASE,IAAKj6C,EAAWu7C,IAAeA,EACxCxB,EAASG,KAAOl6C,EAAWw7C,IAAeA,EAC1CzB,EAASI,OAAStC,EAAUpwC,EAAQ0yC,YAASl1C,EA/LnC,IAgMNgb,EAAMA,MAAmBA,EAAM06B,UAAUz+B,IAAI69B,GAC5CzB,EAAU,WACbwB,EAAaC,EAAU95B,EACzB,GACO85B,EAASQ,OAClB,GAEA7C,EAAuB,WACrB,IAAI6C,EAAU,IAAI9C,EACdx3B,EAAQi5B,EAAwBqB,GACpCl5C,KAAKk5C,QAAUA,EACfl5C,KAAKmrC,QAAU/3B,GAAK2mC,GAAiBn7B,GACrC5e,KAAKi1C,OAAS7hC,GAAK0mC,GAAgBl7B,EACrC,EAEA04B,EAA2BpiC,EAAIijC,EAAuB,SAAUr9B,GAC9D,OAAOA,IAAMm9B,GAAsBn9B,IAAMw7B,EACrC,IAAID,EAAqBv7B,GACzBs9B,EAA4Bt9B,EAClC,GAEKw2B,GAAW3yC,EAAW4yC,IAA6ByG,IAA2B14C,OAAOa,WAAW,CACnGo2C,EAAayB,EAAuBve,KAE/Bke,GAEHhB,EAAcqB,EAAwB,OAAQ,SAAckC,EAAaC,GACvE,IAAIC,EAAOp6C,KACX,OAAO,IAAIi4C,EAAmB,SAAU9M,EAAS8J,GAC/Cl1C,EAAKw2C,EAAY6D,EAAMjP,EAAS8J,EAClC,GAAGxb,KAAKygB,EAAaC,EAEvB,EAAG,CAAEE,QAAQ,IAIf,WACSrC,EAAuB33C,WAChC,CAAE,MAAO26B,GAAqB,CAG1Bz7B,GACFA,EAAey4C,EAAwBE,EAE3C,CAKF7zC,EAAE,CAAEi2C,QAAQ,EAAMj6C,aAAa,EAAMk6C,MAAM,EAAM31C,OAAQ4sC,GAA8B,CACrF5X,QAASqe,IAGX3B,EAAiBI,EAAK9c,QAEtBgd,EAAeqB,EAAoBV,GAAS,GAAO,GACnDV,EAAWU,E,wBC1RX,SAASpqC,EAAchM,GACnB,GAA8C,oBAA1C7B,OAAOa,UAAU8C,SAASlD,KAAKoB,GAC/B,OAAO,EAEX,MAAMhB,EAAYb,OAAOwI,eAAe3G,GACxC,OAAqB,OAAdhB,GAA2D,OAArCb,OAAOwI,eAAe3H,EACvD,CAfAb,OAAO4B,eAAerC,EAAS,aAAc,CACzCsC,OAAO,IAEX7B,OAAO4B,eAAerC,EAAS,UAAW,CACtC0C,YAAY,EACZC,IAAK,WACD,OAAO2L,CACX,G,0BCPJ,IAAIpN,EAAO,EAAQ,MAEnBnB,EAAOC,QAAU,SAAU27C,EAAQZ,EAAIa,GAIrC,IAHA,IAEIC,EAAMvxC,EAFN2kC,EAAW2M,EAA6BD,EAASA,EAAO1M,SACxDljB,EAAO4vB,EAAO5vB,OAET8vB,EAAO36C,EAAK6qB,EAAMkjB,IAAW7T,MAEpC,QAAer2B,KADfuF,EAASywC,EAAGc,EAAKv5C,QACS,OAAOgI,CAErC,C,0BCVA7J,OAAO4B,eAAerC,EAAS,aAAc,CACzCsC,OAAO,IAEX,SAAiBC,EAAQC,GACrB,IAAI,IAAIC,KAAQD,EAAI/B,OAAO4B,eAAeE,EAAQE,EAAM,CACpDC,YAAY,EACZC,IAAKH,EAAIC,IAEjB,CACAG,CAAQ5C,EAAS,CACb87C,iBAAkB,WACd,OAAOA,CACX,EACAC,QAAS,WACL,OAAOA,CACX,EACAC,iBAAkB,WACd,OAAOA,CACX,EACAC,QAAS,WACL,OAAOA,CACX,EACAC,cAAe,WACX,OAAOA,CACX,EACAC,QAAS,WACL,OAAOA,CACX,EACAC,YAAa,WACT,OAAOA,CACX,EACAC,iBAAkB,WACd,OAAOA,CACX,IAEJ,MAAMC,EAA8Bt5C,EAAyB,EAAQ,OAC/Du5C,EAAqB,EAAQ,MAC7BC,EAAa,EAAQ,MACrBC,EAA6Bz5C,EAAyB,EAAQ,OAC9D05C,EAAwB,EAAQ,MAChCC,EAAgB,EAAQ,MAC9B,SAAS35C,EAAyB7C,GAC9B,OAAOA,GAAOA,EAAID,WAAaC,EAAM,CACjCsB,QAAStB,EAEjB,CACA,SAAS27C,EAAiBc,EAAWC,GACjCD,EAAUjM,YAAamM,IACnBA,EAAIx6C,MAAQu6C,EAAYC,EAAIx6C,OACxBw6C,EAAIlI,MAAQkI,EAAIlI,KAAKtyC,QACrBw6C,EAAIlI,KAAKtyC,OAAQ,EAAIg6C,EAAc76C,SAASq7C,EAAIlI,KAAKtyC,SAGjE,CACA,SAASy6C,EAAsBC,EAAUC,GACrC,IAAKC,EAAiBF,GAClB,OAEJ,IAAI16C,EAAQ06C,EAAS/uC,MAAM,GAAI,GAC/B,OAAKgvC,EAAS36C,IAGP,EAAIk6C,EAAWW,WAAW76C,QAHjC,CAIJ,CAcA,SAASy5C,EAAQiB,EAAUxmC,EAAU,CAAC,GAAG,SAAEymC,EAAU,KAAI,GAAU,CAAC,GAChE,IAAIG,EACJ,IAAI96C,EAA+C,QAAtC86C,EAAkB5mC,EAAQ+R,cAA6C,IAAzB60B,OAAkC,EAAIA,EAAgBJ,GACjH,YAAcj4C,IAAVzC,EACOA,EAEPkU,EAAQ6mC,wBAA0BL,EAAS73C,WAAW,KAnB9D,SAAyB63C,EAAUM,EAAS,CAAC,EAAGL,GAC5C,IAAIM,EAAgBD,EAAON,GAC3B,QAAsBj4C,IAAlBw4C,EACA,OAAO,EAAId,EAAah7C,SAAS87C,GAErC,GAAIL,EAAiBF,GAAW,CAC5B,IAAIQ,EAAWT,EAAsBC,EAAUC,GAC/C,QAAiBl4C,IAAby4C,EACA,OAEJ,OAAO,EAAIf,EAAah7C,SAAS+7C,EACrC,CACJ,CAQeC,CAAgBT,EAAS/uC,MAAM,GAAIuI,EAAQ+R,OAAQ00B,GAEvDF,EAAsBC,EAAUC,EAC3C,CACA,SAASC,EAAiBQ,GACtB,OAAOA,EAAMv4C,WAAW,MAAQu4C,EAAMC,SAAS,IACnD,CACA,SAASC,EAAqBZ,GAC1B,IAAIa,EAAWb,EAASc,YAAY,KAGhCC,EAAoBf,EAASc,YAAY,IAAKD,GAC9CG,EAAkBhB,EAAS3qC,QAAQ,IAAKwrC,GAU5C,MATmD,MAA3Bb,EAASa,EAAW,IAAyC,MAA3Bb,EAASa,EAAW,KAG/C,IAAvBE,IAAiD,IAArBC,GACxBD,EAAoBF,GAAYA,EAAWG,IAC3CH,EAAWb,EAASc,YAAY,IAAKC,KAI/B,IAAdF,GAAmBA,IAAab,EAAS56C,OAAS,GAMtC86C,EAAiBF,KAIfA,EAAS5lC,SAAS,OATzB,CACH4lC,OACAj4C,GAaD,CACHi4C,EAAS/uC,MAAM,EAAG4vC,GAClBb,EAAS/uC,MAAM4vC,EAAW,GAElC,CACA,SAAS7B,EAAiB15C,GACtB,GAAqB,iBAAVA,GAAsBA,EAAM8U,SAAS,iBAAkB,CAC9D,IAAI6mC,EAAW37C,EACf,MAAO,EAAG47C,eAAc,KAAOD,EAAS35C,QAAQ,iBAAkB45C,EACtE,CACA,OAAO57C,CACX,CACA,SAAS67C,EAAwBnB,GAC7B,OAAO,EAAIR,EAAWW,WAAWH,EAAS/uC,MAAM,GAAI,GACxD,CACA,SAASguC,EAAQe,EAAUxmC,EAAU,CAAC,GAAG,eAAE4nC,EAAgB,CAAC,GAAO,CAAC,GAChE,IAAIhB,EAEIiB,EADR,QAAyHt5C,KAA7E,QAAtCq4C,EAAkB5mC,EAAQ+R,cAA6C,IAAzB60B,OAAkC,EAAIA,EAAgBJ,IAEtG,OAAOhB,EAAyD,QAAvCqC,EAAmB7nC,EAAQ+R,cAA8C,IAA1B81B,OAAmC,EAAIA,EAAiBrB,IAIpI,IAAKh5C,EAAOC,GAAS25C,EAAqBZ,GAC1C,QAAcj4C,IAAVd,EAAqB,CACrB,IAAIq6C,EAAkBC,EAAuBC,EACzCC,EACJ,IAAIC,EAA+J,QAA5ID,EAAgE,QAAvCH,EAAmB9nC,EAAQ+R,cAA8C,IAA1B+1B,OAAmC,EAAIA,EAAiBt6C,UAAmD,IAA/By6C,EAAmCA,EAAwBvB,EAAiBl5C,GAASA,EAAMiK,MAAM,GAAI,QAAKlJ,EACrR,QAAwBA,IAApB25C,EACA,OAGJ,GADAA,EAAkB1C,EAAiB0C,GAC/BxB,EAAiBj5C,GACjB,OAAO,EAAIs4C,EAAmBoC,gBAAgBD,EAAiBP,EAAwBl6C,IAE3F,QAAsRc,KAA9N,QAAlDw5C,EAAwBH,EAAeQ,aAAkD,IAA/BL,GAAgH,QAAnEC,EAAgCD,EAAsB5jB,eAA4D,IAAvC6jB,OAAhF,EAAoIA,EAA8Bv6C,IACtQ,OAEJ,OAAO,EAAIs4C,EAAmBoC,gBAAgBD,EAAiBN,EAAeQ,MAAMjkB,QAAQ12B,GAChG,CACA,OAAO83C,EAAQiB,EAAUxmC,EAAS,CAC9BymC,SAAUT,EAAWx4C,OAE7B,CACA,SAASk4C,EAAcc,EAAUxmC,EAAU,CAAC,GACxC,IAAI4mC,EACJ,OAA8C,QAAtCA,EAAkB5mC,EAAQ+R,cAA6C,IAAzB60B,OAAkC,EAAIA,EAAgBJ,EAChH,CACA,SAAS6B,EAAM5B,GACX,MAAO,CAACD,EAAUxmC,IACPulC,EAAQiB,EAAUxmC,EAAS,CAC9BymC,YAGZ,CACA,IAAId,EAAU,CACV2C,IAAK/C,EACL/3C,MAAOi4C,EACP8C,IAAKF,EAAMrC,EAAWuC,KACtBC,MAAOH,EAAMrC,EAAWwC,OACxB58C,OAAQy8C,EAAMrC,EAAWp6C,QACzB68C,WAAYJ,EAAMrC,EAAWyC,YAC7B1kB,SAAUskB,EAAMrC,EAAWjiB,UAC3B+iB,OAAQpB,EACR,eAAgB2C,EAAMrC,EAAW0C,aACjC,cAAeL,EAAMrC,EAAW2C,YAChCC,OAAQP,EAAMrC,EAAW4C,QACzB,aAAcP,EAAMrC,EAAW6C,WAC/B,gBAAiBR,EAAMrC,EAAW8C,cAClC,gBAAiBT,EAAMrC,EAAW+C,cAClCC,OAAQX,EAAMrC,EAAWgD,QACzBt0C,KAAM2zC,EAAMnC,EAAsB+C,iBAElCC,EAAiBj/C,OAAO8H,KAAK4zC,GAYjC,SAASC,EAAY10C,EAAOs1C,EAAUxmC,EAAS4nC,GAC3C,GAAI5nC,EAAQ+R,QAAUy0B,KAAYxmC,EAAQ+R,OACtC,IAAK,IAAI,KAAEnnB,KAAWsG,QAAqCA,EAAQ,GAAG,CAClE,IAAI4C,EAAS6xC,EAAQ/6C,GAAM47C,EAAUxmC,EAAS,CAC1C4nC,mBAEJ,QAAer5C,IAAXuF,EAGJ,MAAO,CACHA,EACAlJ,EACA,KAER,CAEJ,GAAI87C,EAAiBF,GAAW,CAC5B,IAAI2C,EAAiB3C,EAAS/uC,MAAM,GAAI,IACnC2xC,EAAct9C,GA7B3B,SAAsBo7C,GAClB,IAAImC,EAAMnC,EAAMrrC,QA4B6C,KA3B7D,OAAa,IAATwtC,EAAmB,MACnB96C,EACA24C,GAEG,CACHA,EAAMzvC,MAAM,EAAG4xC,GACfnC,EAAMzvC,MAAM4xC,EAAM,GAE1B,CAmBoCC,CAAaH,GAIzC,GAAK,aAAar6C,KAAKs6C,IAEhB,QAAqB76C,IAAjB66C,IAA+BF,EAAetoC,SAASwoC,GAC9D,MAAO,QAFPt9C,EAAQq9C,EAIZ,GAAIr9C,EAAMF,OAAS,GAAKs9C,EAAetoC,SAASwoC,GAC5C,MAAO,CACH7D,EAAQ,IAAIz5C,KAAUkU,GACtBopC,EACA,KAGZ,CACA,IAAI5iC,EAAUq/B,EAAiB30C,EAAOs1C,EAAUxmC,EAAS4nC,GAEzD,IAAK,IAAIv5C,KAASmY,EACd,OAAOnY,EAEX,MAAO,EACX,CACA,SAAUw3C,EAAiB30C,EAAOq4C,EAAavpC,EAAS4nC,GACpD,IAAI4B,GAAmB,EAAIrD,EAAcsD,aAAa7B,EAAgB,yBACjEpB,EAAUkD,GAAmBtC,EAAqBmC,GAWvD,GAV4BC,GAAyC,MAArBxpC,EAAQ2pC,YAA4C,QAAtB3pC,EAAQ2pC,WAAoD,iBAAtB3pC,EAAQ2pC,YAA2BD,GAAmBhD,EAAiBgD,IAAoBA,KAAmB1pC,EAAQ2pC,cAEtOnD,EAAW+C,EACXG,OAAkBn7C,QAEEA,IAApBm7C,GAA8C,KAAblD,IACjCA,EAAW,gBAISj4C,IAApBm7C,GACiC,iBAAtB1pC,EAAQ2pC,UAAwB,CACvC,IAAIC,EACAC,EACJ,IAAIC,EAA2L,QAA5KD,EAAkF,QAA5CD,EAAqB5pC,EAAQ2pC,iBAAmD,IAA5BC,OAAqC,EAAIA,EAAmBF,UAA0E,IAA5CG,EAAgDA,EAAqC,KACxQ,OAAhBC,EACAJ,EAAkBI,EACXpD,EAAiBgD,KACxBA,EAAkB/B,EAAwB+B,GAElD,CAEJ,IAAK,IAAI,KAAE9+C,KAAWsG,QAAqCA,EAAQ,GAAG,CAClE,IAAI4C,EAAS6xC,EAAQ/6C,GAAM47C,EAAUxmC,EAAS,CAC1C4nC,wBAEWr5C,IAAXuF,SAGE,CACFA,EACAlJ,EACA8+C,QAAyDA,EAAkB,MAEnF,CACJ,C,0BC/RA,IAAIrI,EAAO,EAAQ,MACf3E,EAAS,EAAQ,MACjBqN,EAA+B,EAAQ,MACvCl+C,EAAiB,UAErBtC,EAAOC,QAAU,SAAUwgD,GACzB,IAAI33C,EAASgvC,EAAKhvC,SAAWgvC,EAAKhvC,OAAS,CAAC,GACvCqqC,EAAOrqC,EAAQ23C,IAAOn+C,EAAewG,EAAQ23C,EAAM,CACtDl+C,MAAOi+C,EAA6BlqC,EAAEmqC,IAE1C,C,0BCVA,IAAIxN,EAAc,EAAQ,MACtByN,EAAW,EAAQ,MACnBr8C,EAAW,EAAQ,KACnBs8C,EAAU,EAAQ,MAClBC,EAAyB,EAAQ,MAEjCC,EAAS5N,EAAY0N,GACrB/M,EAAcX,EAAY,GAAG/kC,OAC7B4yC,EAAOj3C,KAAKi3C,KAGZC,EAAe,SAAUC,GAC3B,OAAO,SAAUC,EAAOC,EAAWC,GACjC,IAIIC,EAASC,EAJTvlC,EAAIzX,EAASu8C,EAAuBK,IACpCK,EAAeZ,EAASQ,GACxBK,EAAezlC,EAAEzZ,OACjBm/C,OAAyBx8C,IAAfm8C,EAA2B,IAAM98C,EAAS88C,GAExD,OAAIG,GAAgBC,GAA4B,KAAZC,EAAuB1lC,IAE3DulC,EAAeR,EAAOW,EAASV,GAD/BM,EAAUE,EAAeC,GACqBC,EAAQn/C,UACrCA,OAAS++C,IAASC,EAAezN,EAAYyN,EAAc,EAAGD,IACxEJ,EAASllC,EAAIulC,EAAeA,EAAevlC,EACpD,CACF,EAEA9b,EAAOC,QAAU,CAGf+Q,MAAO+vC,GAAa,GAGpB5sC,IAAK4sC,GAAa,G,0BChCpB,IAAIpO,EAA2B,EAAQ,KACnC8O,EAA8B,EAAQ,MACtC7O,EAA6B,mBAEjC5yC,EAAOC,QAAU2yC,IAA+B6O,EAA4B,SAAUz0C,GACpF2lC,EAAyBlwC,IAAIuK,GAAU6tB,UAAK71B,EAAW,WAA0B,EACnF,E,0BCNA,IAAI6yC,EAAa,EAAQ,MAEzB73C,EAAOC,QAAU43C,EAAW7c,O,0BCF5B,IAAIiY,EAAc,EAAQ,MACtBtxC,EAAY,EAAQ,MACpB2I,EAAW,EAAQ,IACnB6oC,EAAS,EAAQ,MACjB8B,EAAa,EAAQ,MACrByM,EAAc,EAAQ,KAEtBC,EAAYz6C,SACZ06C,EAAS3O,EAAY,GAAG2O,QACxB/8C,EAAOouC,EAAY,GAAGpuC,MACtBg9C,EAAY,CAAC,EAcjB7hD,EAAOC,QAAUyhD,EAAcC,EAAUntC,KAAO,SAAcgnC,GAC5D,IAAI9yB,EAAI/mB,EAAUP,MACd0gD,EAAYp5B,EAAEnnB,UACdwgD,EAAW9M,EAAW7yC,UAAW,GACjC4/C,EAAgB,WAClB,IAAI/wC,EAAO2wC,EAAOG,EAAU9M,EAAW7yC,YACvC,OAAOhB,gBAAgB4gD,EAlBX,SAAU9lC,EAAG+lC,EAAYhxC,GACvC,IAAKkiC,EAAO0O,EAAWI,GAAa,CAGlC,IAFA,IAAI53B,EAAO,GACPnY,EAAI,EACDA,EAAI+vC,EAAY/vC,IAAKmY,EAAKnY,GAAK,KAAOA,EAAI,IACjD2vC,EAAUI,GAAcN,EAAU,MAAO,gBAAkB98C,EAAKwlB,EAAM,KAAO,IAC/E,CAAE,OAAOw3B,EAAUI,GAAY/lC,EAAGjL,EACpC,CAW2CixC,CAAUx5B,EAAGzX,EAAK5O,OAAQ4O,GAAQyX,EAAE5Y,MAAM0rC,EAAMvqC,EACzF,EAEA,OADI3G,EAASw3C,KAAYE,EAAczgD,UAAYugD,GAC5CE,CACT,C,0BCjCA/hD,EAAQE,YAAa,EACrBF,EAAiB,aAAS,EAE1B,IAIgCG,EAJ5BgtC,GAI4BhtC,EAJG,EAAQ,QAIUA,EAAID,WAAaC,EAAM,CAAE,QAAWA,GAFrFE,EAAS,EAAQ,MAMrB,SAASC,EAAgBC,EAAGC,GAA+G,OAA1GF,EAAkBG,OAAOC,gBAAkB,SAAyBH,EAAGC,GAAsB,OAAjBD,EAAEI,UAAYH,EAAUD,CAAG,EAAUD,EAAgBC,EAAGC,EAAI,CAEzK,IAAI0hD,EAAuB,SAAU/T,GAJrC,IAAwBrtC,EAAUC,EAOhC,SAASmhD,EAAQlhD,GACf,IAAIC,EAIJ,OAFAA,EAAQktC,EAAMjtC,KAAKC,KAAMH,IAASG,MAC5BC,KAAOf,EAAO8wC,QACblwC,CACT,CAEA,OAfgCF,EAKRotC,GALFrtC,EAKPohD,GALwC5gD,UAAYb,OAAOc,OAAOR,EAAWO,WAAYR,EAASQ,UAAUE,YAAcV,EAAUR,EAAgBQ,EAAUC,GAetKmhD,CACT,CAZ2B,CAYzB/U,EAAe,SAEjBntC,EAAiB,QAAIkiD,EACrBniD,EAAOC,QAAUA,EAAQyB,O,0BC7BzB,IAAIwxC,EAAQ,EAAQ,MAChBkP,EAAkB,EAAQ,MAC1BC,EAAa,EAAQ,MAErBC,EAAUF,EAAgB,WAE9BpiD,EAAOC,QAAU,SAAUsiD,GAIzB,OAAOF,GAAc,KAAOnP,EAAM,WAChC,IAAIvnC,EAAQ,GAKZ,OAJkBA,EAAMlK,YAAc,CAAC,GAC3B6gD,GAAW,WACrB,MAAO,CAAEE,IAAK,EAChB,EAC2C,IAApC72C,EAAM42C,GAAap9C,SAASq9C,GACrC,EACF,C,0BClBA,IAAItP,EAAQ,EAAQ,MAEpBlzC,EAAOC,SAAWizC,EAAM,WAEtB,IAAI3tC,EAAO,WAA4B,EAAEiP,OAEzC,MAAsB,mBAARjP,GAAsBA,EAAK8C,eAAe,YAC1D,E,0BCPA,IAAIysC,EAAU,EAAQ,MAElBnB,EAAUljC,OAEdzQ,EAAOC,QAAU,SAAUgC,GACzB,GAA0B,WAAtB6yC,EAAQ7yC,GAAwB,MAAM,IAAID,UAAU,6CACxD,OAAO2xC,EAAQ1xC,EACjB,C,0BCPA,IAAIwgD,EAAgB,EAAQ,MAExB1gD,EAAaC,UAEjBhC,EAAOC,QAAU,SAAUC,EAAI4hD,GAC7B,GAAIW,EAAcX,EAAW5hD,GAAK,OAAOA,EACzC,MAAM,IAAI6B,EAAW,uBACvB,C,0BCPArB,OAAO4B,eAAerC,EAAS,aAAc,CACzCsC,OAAO,IAEX7B,OAAO4B,eAAerC,EAAS,kBAAmB,CAC9C0C,YAAY,EACZC,IAAK,WACD,OAAO8/C,CACX,IAEJ,MAAM9F,EAAgB,EAAQ,MACxB+F,EAAqBC,EAA0B,EAAQ,OAC7D,SAAStV,EAAyBuV,GAC9B,GAAuB,mBAAZjV,QAAwB,OAAO,KAC1C,IAAIkV,EAAoB,IAAIlV,QACxBmV,EAAmB,IAAInV,QAC3B,OAAQN,EAA2B,SAASuV,GACxC,OAAOA,EAAcE,EAAmBD,CAC5C,GAAGD,EACP,CACA,SAASD,EAA0BxiD,EAAKyiD,GACpC,IAAKA,GAAeziD,GAAOA,EAAID,WAC3B,OAAOC,EAEX,GAAY,OAARA,GAA+B,iBAARA,GAAmC,mBAARA,EAClD,MAAO,CACHsB,QAAStB,GAGjB,IAAIitC,EAAQC,EAAyBuV,GACrC,GAAIxV,GAASA,EAAMzhC,IAAIxL,GACnB,OAAOitC,EAAMzqC,IAAIxC,GAErB,IAAImtC,EAAS,CAAC,EACVC,EAAwB9sC,OAAO4B,gBAAkB5B,OAAO+sC,yBAC5D,IAAI,IAAIpiC,KAAOjL,EACX,GAAY,YAARiL,GAAqB3K,OAAOa,UAAU8G,eAAelH,KAAKf,EAAKiL,GAAM,CACrE,IAAIqiC,EAAOF,EAAwB9sC,OAAO+sC,yBAAyBrtC,EAAKiL,GAAO,KAC3EqiC,IAASA,EAAK9qC,KAAO8qC,EAAK7iC,KAC1BnK,OAAO4B,eAAeirC,EAAQliC,EAAKqiC,GAEnCH,EAAOliC,GAAOjL,EAAIiL,EAE1B,CAMJ,OAJAkiC,EAAO7rC,QAAUtB,EACbitC,GACAA,EAAMxiC,IAAIzK,EAAKmtC,GAEZA,CACX,CACA,SAASmV,EAAgB7L,GA2IjB,IAAImM,EA5HM,MAEV,GAAInM,EAAOoM,MACP,OAAO,EAGX,IAAKpM,EAAOt9B,QACR,OAAO,EAGX,IAAKzT,MAAM+H,QAAQgpC,EAAOt9B,WAAwC,iBAAnBs9B,EAAOt9B,SAA2C,OAAnBs9B,EAAOt9B,SACjF,OAAO,EAGX,GAAIzT,MAAM+H,QAAQgpC,EAAOt9B,SACrB,OAAOs9B,EAAOt9B,QAAQ84B,MAAOyF,GAEL,iBAATA,GAG2D,iBAA1DA,aAAwC,EAAIA,EAAKoL,SAExDpL,aAAwC,EAAIA,EAAKqL,YAAsF,iBAAhErL,aAAwC,EAAIA,EAAKqL,aAOrI,GAA8B,iBAAnBtM,EAAOt9B,SAA2C,OAAnBs9B,EAAOt9B,QAAkB,CAE/D,GAAI7Y,OAAO8H,KAAKquC,EAAOt9B,SAASlU,KAAMgG,IAAO,CACrC,QACA,WACA,UACA,aACFgM,SAAShM,IACX,OAAO,EAGX,GAAIvF,MAAM+H,QAAQgpC,EAAOt9B,QAAQ6pC,OAAQ,CACrC,IAAKvM,EAAOt9B,QAAQ6pC,MAAM/Q,MAAOyF,GAET,iBAATA,GAG2D,iBAA1DA,aAAwC,EAAIA,EAAKoL,SAExDpL,aAAwC,EAAIA,EAAKqL,YAAsF,iBAAhErL,aAAwC,EAAIA,EAAKqL,aAK7H,OAAO,EAGX,GAAsC,iBAA3BtM,EAAOt9B,QAAQ8pC,SACtB,IAAK,IAAI9gD,KAAS7B,OAAO8nB,OAAOquB,EAAOt9B,QAAQ8pC,SAC3C,GAAqB,mBAAV9gD,EACP,OAAO,OAGZ,QAAiCyC,IAA3B6xC,EAAOt9B,QAAQ8pC,SAA2D,mBAA3BxM,EAAOt9B,QAAQ8pC,QACvE,OAAO,EAGX,GAAwC,iBAA7BxM,EAAOt9B,QAAQ1S,WACtB,IAAK,IAAItE,KAAS7B,OAAO8nB,OAAOquB,EAAOt9B,QAAQ1S,WAC3C,GAAqB,mBAAVtE,EACP,OAAO,OAGZ,QAAmCyC,IAA7B6xC,EAAOt9B,QAAQ1S,WAA+D,mBAA7BgwC,EAAOt9B,QAAQ1S,UACzE,OAAO,EAGX,GAAuC,kBAA5BgwC,EAAOt9B,QAAQ+pC,eAA6D,IAA5BzM,EAAOt9B,QAAQ+pC,SACtE,OAAO,CAEf,CACA,OAAO,CACX,CACA,OAAO,CACV,EAnFa,IAqFVX,EAAKjhD,QAAQqiB,KAAK,oBAAqB,CACnC,mEACA,4DACA,yEAIR8yB,EAAO0M,SAAW,MACd,IAAIC,EACJ,IAAI,QAAEjqC,EAAQ,MAAE0pC,EAAM,SAAEM,GAAc1M,EACtC,OAAI/wC,MAAM+H,QAAQ01C,GAAkBA,EAChCz9C,MAAM+H,QAAQ0L,aAA8C,EAAIA,EAAQgqC,UAAkBhqC,EAAQgqC,SAClGz9C,MAAM+H,QAAQo1C,aAA0C,EAAIA,EAAMM,UAAkBN,EAAMM,SAC1Fz9C,MAAM+H,QAAQo1C,SAAmF,QAApCO,EAAiBP,EAAMxsC,eAA6C,IAAxB+sC,OAAjD,EAAsFA,EAAeD,UAAkBN,EAAMxsC,QAAQ8sC,SAC1L,EACV,EARiB,GAUlB1M,EAAO4M,UAAY,MACf,IAAI,UAAEA,GAAe5M,EACrB,GAAI/wC,MAAM+H,QAAQ41C,GAAY,CAC1B,GAAIA,EAAUpR,MAAOqR,GAAuB,iBAATA,GAC/B,OAAOD,EAEXd,EAAKjhD,QAAQqiB,KAAK,oBAAqB,CACnC,sDACA,yEAER,CACA,MAAO,EACV,EAZkB,GAcU,mBAAlB8yB,EAAO8M,QACdhB,EAAKjhD,QAAQqiB,KAAK,kBAAmB,CACjC,0DACA,kFACA,2EAEJ8yB,EAAO8M,OAAS,IAGhB9M,EAAO8M,OAA8C,QAApCX,EAAiBnM,EAAO8M,cAA4C,IAAxBX,EAA4BA,EAAiB,GAG9GnM,EAAOt9B,QAAU,CACb+pC,SAAU,MACN,IAAI,QAAE/pC,GAAas9B,EACnB,OAAIt9B,aAA8C,EAAIA,EAAQ+pC,UACnD/pC,EAAQ+pC,UAEZ,EAAI1G,EAAcsD,aAAarJ,EAAQ,gCACjD,EANS,GAOVuM,MAAO,MACH,IAAI,QAAE7pC,EAAQ,MAAE0pC,GAAWpM,EAC3B,OAAI/wC,MAAM+H,QAAQo1C,GAAeA,EAC7Bn9C,MAAM+H,QAAQo1C,aAA0C,EAAIA,EAAM1pC,SAAiB0pC,EAAM1pC,QACzFzT,MAAM+H,QAAQ0L,GAAiBA,EAC/BzT,MAAM+H,QAAQ0L,aAA8C,EAAIA,EAAQA,SAAiBA,EAAQA,QACjGzT,MAAM+H,QAAQ0L,aAA8C,EAAIA,EAAQ6pC,OAAe7pC,EAAQ6pC,MAC5F,EACV,EARM,GASPC,QAAS,MACL,IAAIA,GAEuC,QAAlCO,EAAgB/M,EAAOoM,aAA0C,IAAvBW,OAAgC,EAAIA,EAAcP,SAAgBxM,EAAOoM,MAAMI,SACnF,QAAtCQ,EAAkBhN,EAAOt9B,eAA8C,IAAzBsqC,OAAkC,EAAIA,EAAgBR,SAAgBxM,EAAOt9B,QAAQ8pC,SAChG,QAAnCS,EAAiBjN,EAAOoM,aAA2C,IAAxBa,GAA0F,QAApDC,EAAwBD,EAAeT,eAAoD,IAA/BU,OAAjE,EAA6GA,EAAsBC,SAAgBnN,EAAOoM,MAAMI,QAAQW,SAC7M,QAAvCC,EAAmBpN,EAAOt9B,eAA+C,IAA1B0qC,GAAgG,QAAxDC,EAA0BD,EAAiBZ,eAAsD,IAAjCa,OAArE,EAAmHA,EAAwBF,SAAgBnN,EAAOt9B,QAAQ8pC,QAAQW,SACjO,QAAnCG,EAAiBtN,EAAOoM,aAA2C,IAAxBkB,GAA0F,QAApDC,EAAwBD,EAAe1tC,eAAoD,IAA/B2tC,OAAjE,EAA6GA,EAAsBC,YAAmBxN,EAAOoM,MAAMxsC,QAAQ4tC,YAChN,QAAvCC,EAAmBzN,EAAOt9B,eAA+C,IAA1B+qC,GAAgG,QAAxDC,EAA0BD,EAAiB7tC,eAAsD,IAAjC8tC,OAArE,EAAmHA,EAAwBF,YAAmBxN,EAAOt9B,QAAQ9C,QAAQ4tC,WACrQ,CAAC,EARE,IACNT,EAAeC,EAAiBC,EAAgBC,EAAuBE,EAAkBC,EAAyBC,EAAgBC,EAAuBE,EAAkBC,EASnL,IAAIF,EAAa,CAAC,EACdG,EAAmB,MACnB,IAAIZ,EAAeQ,EAAuBP,EAAiBU,EAC3D,OAAuC,QAAlCX,EAAgB/M,EAAOoM,aAA0C,IAAvBW,GAAwF,QAAnDQ,EAAwBR,EAAcntC,eAAoD,IAA/B2tC,OAAhE,EAA4GA,EAAsBI,kBACtM3N,EAAOoM,MAAMxsC,QAAQ+tC,kBAEW,QAAtCX,EAAkBhN,EAAOt9B,eAA8C,IAAzBsqC,GAA8F,QAAvDU,EAA0BV,EAAgBptC,eAAsD,IAAjC8tC,OAApE,EAAkHA,EAAwBC,kBACpN3N,EAAOt9B,QAAQ9C,QAAQ+tC,sBADlC,CAIH,EATsB,GAcvB,QAJyBx/C,IAArBw/C,IACAH,EAAWL,QAAUQ,GAGF,mBAAZnB,EACPgB,EAAWL,QAAUX,OAClB,GAAIv9C,MAAM+H,QAAQw1C,GACrB,IAAK,IAAI,WAAEoB,EAAW,UAAEC,KAAgBrB,QAAyCA,EAAU,GACvF,IAAK,IAAIF,KAAasB,EAClBJ,EAAWlB,GAAauB,MAGN,iBAAZrB,GAAoC,OAAZA,GACtC3iD,OAAO0V,OAAOiuC,EAAYhB,GAE9B,OAAOgB,CACV,EAtCQ,GAuCTx9C,UAAW,MACP,IAAIA,GAEuC,QAAlC+8C,EAAgB/M,EAAOoM,aAA0C,IAAvBW,OAAgC,EAAIA,EAAc/8C,WAAkBgwC,EAAOoM,MAAMp8C,WACrF,QAAtCg9C,EAAkBhN,EAAOt9B,eAA8C,IAAzBsqC,OAAkC,EAAIA,EAAgBh9C,WAAkBgwC,EAAOt9B,QAAQ1S,WAClG,QAAnCi9C,EAAiBjN,EAAOoM,aAA2C,IAAxBa,GAA8F,QAAxDa,EAA0Bb,EAAej9C,iBAAwD,IAAjC89C,OAArE,EAAmHA,EAAwBX,SAAgBnN,EAAOoM,MAAMp8C,UAAUm9C,SACvN,QAAvCC,EAAmBpN,EAAOt9B,eAA+C,IAA1B0qC,GAAoG,QAA5DW,EAA4BX,EAAiBp9C,iBAA0D,IAAnC+9C,OAAzE,EAAyHA,EAA0BZ,SAAgBnN,EAAOt9B,QAAQ1S,UAAUm9C,QAC5Q,CAAC,EANI,IACRJ,EAAeC,EAAiBC,EAAgBa,EAAyBV,EAAkBW,EAOnG,IAAIC,EAAe,CAAC,EAMpB,MALyB,mBAAdh+C,EACPg+C,EAAab,QAAUn9C,EACK,iBAAdA,GAAwC,OAAdA,GACxCnG,OAAO0V,OAAOyuC,EAAch+C,GAEzBg+C,CACV,EAhBU,IAoBf,IAAK,IAAIC,KAAQjO,EAAOt9B,QAAQ6pC,MAC5B,GAAoB,iBAAT0B,GAAqB,cAAcv/C,KAAKu/C,GAAO,CACtDnC,EAAKjhD,QAAQqiB,KAAK,sBAAuB,CACrC,qBAAoB,EAAI4+B,EAAKh5B,KAAKm7B,oDAClC,iBAAgB,EAAInC,EAAKh5B,KAAKm7B,EAAKvgD,QAAQ,cAAe,oCAE9D,KACJ,CAEJ,OAAOsyC,CACX,C,0BCvRA,IAAIv0C,EAAiB,UACjB6wC,EAAS,EAAQ,MAGjB4R,EAFkB,EAAQ,KAEV3C,CAAgB,eAEpCpiD,EAAOC,QAAU,SAAUuC,EAAQlB,EAAK0jD,GAClCxiD,IAAWwiD,IAAQxiD,EAASA,EAAOjB,WACnCiB,IAAW2wC,EAAO3wC,EAAQuiD,IAC5BziD,EAAeE,EAAQuiD,EAAe,CAAE1xC,cAAc,EAAM9Q,MAAOjB,GAEvE,C,0BCXA,IAAI2jD,EAAuB,cACvB/R,EAAQ,EAAQ,MAChBgS,EAAc,EAAQ,MAM1BllD,EAAOC,QAAU,SAAUsiD,GACzB,OAAOrP,EAAM,WACX,QAASgS,EAAY3C,MANf,cAOGA,MACH0C,GAAwBC,EAAY3C,GAAa7/C,OAAS6/C,CAClE,EACF,C,aCfA,MAAM3L,EAAS,EAAQ,MACjB7lC,EAAQ,EAAQ,KAChBo0C,EAAY,EAAQ,MACpBC,EAAS,EAAQ,OACjB,sBAAEC,GAA0B,EAAQ,MAEpCC,EAAW,CAGjB,EAEA,SAASC,EAAQ9W,GAAU,UAAE9O,EAAS,SAAEsd,EAAQ,OAAE0G,IAChD,IAAI6B,EAAc7B,EAAO,QAAQhkB,KAAazxB,MAAM,GAChDu3C,EAAiBhX,EAASrpC,WAAW,MACrB,YAAb63C,EAAyB,IAAItd,IAAc,IAAIA,KAAasd,KAA/D,IACA,IAGCyI,EAAgBC,GAAmBN,EAAsB5W,GAE9D,OAAIiX,EACK,UAAUD,IAAiBE,0BAAwCH,gBAA0BA,UAAoBE,IAGnH,UAAUD,IAAiBhX,0BAAiC+W,gBAA0BA,SAC/F,CAEA,SAASl7C,EAAS/H,GAChB,MAAwB,iBAAVA,GAAgC,OAAVA,CACtC,CAEA,SAASqjD,EAAY/O,EAAS,CAAC,GAAG,OAAEr0C,EAAM,UAAEm9B,EAAS,SAAEsd,EAAQ,OAAE0G,IAC/D,SAAS7N,EAAer5B,EAAGrY,GACzB,MAAe,WAAX5B,GAIAsD,MAAM+H,QAAQzJ,GAHT,CAACqY,EAAGrY,GAOTkG,EAASlG,GACE1D,OAAO8nB,OAAOpkB,GAAGiB,KAAKiF,GAE1B,CACLi7C,EAAQ9oC,EAAG,CAAEkjB,YAAWsd,WAAU0G,WAClCv/C,EACA1D,OAAOmlD,YAAYnlD,OAAO+J,QAAQrG,GAAGD,IAAI,EAAEsY,EAAGrY,KAAO0xC,EAAer5B,EAAGrY,MAIpE,CAACmhD,EAAQ9oC,EAAG,CAAEkjB,YAAWsd,WAAU0G,WAAWv/C,GAGhD,CAACqY,EAAGrY,EACb,CAEA,OAAO1D,OAAOmlD,YACZnlD,OAAO+J,QACLsG,EACE,CAAC,KACErQ,OAAO8H,KAAKquC,GACZ3xC,OAAQmG,GAAQi6C,EAASj6C,IACzBlH,IAAKkH,GAAQi6C,EAASj6C,GAAKwrC,EAAOxrC,QAClC85C,EAAUtO,EAAOiP,KAAO,CAAC,KAE9B3hD,IAAI,EAAEsY,EAAGrY,KAAO0xC,EAAer5B,EAAGrY,IAExC,CAEApE,EAAOC,QAAU22C,EAAOI,YACtB,EAAGrX,YAAY,QAASn9B,SAAS,UAAa,CAAC,IACtC,UAAU,WAAEujD,EAAU,cAAEC,EAAa,MAAEnH,EAAK,OAAE8E,IACnD,IAAIvD,EAAYvB,EAAM,cAElBpoC,EAAU,CAAEkpB,YAAWgkB,UAE3B,IAAK,IAAKjhD,KAASm6C,IAAc,CAC/B,CAAC,WAAY,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,MACjD,CAAC,MACD,CAAC,MACD,CAAC,MACD,CAAC,MACD,CAAC,MACD,CAAC,MACD,CAAC,KACD,CAAC,KACD,CAAC,cACD,CAAC,UACD,CAAC,cACD,CAAC,UACD,CAAC,MACD,CAAC,OACD,CAAC,QACD,CAAC,OACD,CAAC,MACD,CAAC,MACD,CAAC,MACD,CAAC,SACD,CAAC,SACD,CAAC,MACD,CAAC,MACD,CAAC,MACD,CAAC,OACD,CAAC,SACD,CAAC,MACD,CAAC,OAAQ,oBACR,CACDA,EAAiC,IAArBA,EAAUx6C,OAAe,CAACK,GAAQm6C,EAE9C,IAAIpO,EACS,WAAXjsC,EAAsBq6C,EAAU14C,IAAKsqC,GAAa,KAAKA,KAAcoO,EAAUh4C,KAAK,MAEtFkhD,EACE,GAAGpmB,KAAaj9B,IACL,WAAXF,EAAsBisC,EAAW,SAAS8W,EAAQ9W,EAAUh4B,MAEhE,CAEAuvC,EACEtlD,OAAO8H,KAAK43C,GAAWj8C,IAAK84C,IAAa,CACvC,CAAc,YAAbA,EAAyB,IAAItd,IAAc,IAAIA,KAAasd,KAAa2I,EACxExF,EAAUnD,GACV,CACEz6C,SACAm9B,YACAsd,WACA0G,cAKV,EAEF,KACS,CACL9E,MAAO,CAAEoH,WAAYb,K,0BCvI3B,IAAI3/C,EAAI,EAAQ,MACZytC,EAAQ,EAAQ,MAChBgT,EAAW,EAAQ,MACnBC,EAAc,EAAQ,MAS1B1gD,EAAE,CAAEjD,OAAQ,OAAQuD,OAAO,EAAMmuC,MAAO,EAAGluC,OAP9BktC,EAAM,WACjB,OAAkC,OAA3B,IAAIlpC,KAAKo8C,KAAKC,UAC2D,IAA3Er8C,KAAKzI,UAAU8kD,OAAOllD,KAAK,CAAEmlD,YAAa,WAAc,OAAO,CAAG,GACzE,IAI6D,CAE3DD,OAAQ,SAAgBh7C,GACtB,IAAI+Q,EAAI8pC,EAAS9kD,MACbmlD,EAAKJ,EAAY/pC,EAAG,UACxB,MAAoB,iBAANmqC,GAAmBC,SAASD,GAAanqC,EAAEkqC,cAAT,IAClD,G,sBClBF,IAAIxF,EAAOj3C,KAAKi3C,KACZtuB,EAAQ3oB,KAAK2oB,MAKjBxyB,EAAOC,QAAU4J,KAAK48C,OAAS,SAAe7qC,GAC5C,IAAIrL,GAAKqL,EACT,OAAQrL,EAAI,EAAIiiB,EAAQsuB,GAAMvwC,EAChC,C,0BCTA,IAAIkiC,EAAa,EAAQ,MACrB1yC,EAAa,EAAQ,MACrB0iD,EAAgB,EAAQ,MACxBiE,EAAoB,EAAQ,MAE5BC,EAAUjmD,OAEdV,EAAOC,QAAUymD,EAAoB,SAAUxmD,GAC7C,MAAoB,iBAANA,CAChB,EAAI,SAAUA,GACZ,IAAI0mD,EAAUnU,EAAW,UACzB,OAAO1yC,EAAW6mD,IAAYnE,EAAcmE,EAAQrlD,UAAWolD,EAAQzmD,GACzE,C,0BCZA,IAAIoK,EAAW,EAAQ,IACnBwqC,EAAU,EAAQ,MAGlB+R,EAFkB,EAAQ,KAElBzE,CAAgB,SAI5BpiD,EAAOC,QAAU,SAAUC,GACzB,IAAI4mD,EACJ,OAAOx8C,EAASpK,UAAmC8E,KAA1B8hD,EAAW5mD,EAAG2mD,MAA0BC,EAA2B,WAAhBhS,EAAQ50C,GACtF,C,0BCXA,IAAIuF,EAAI,EAAQ,MACZgtC,EAAa,EAAQ,MACrB3iC,EAAQ,EAAQ,MAChB0E,EAAO,EAAQ,KACfuyC,EAAe,EAAQ,MACvBnlD,EAAW,EAAQ,MACnB0I,EAAW,EAAQ,IACnB9I,EAAS,EAAQ,MACjB0xC,EAAQ,EAAQ,MAEhB8T,EAAkBvU,EAAW,UAAW,aACxCwU,EAAkBvmD,OAAOa,UACzBuK,EAAO,GAAGA,KAMVo7C,EAAiBhU,EAAM,WACzB,SAASxqB,IAAkB,CAC3B,QAASs+B,EAAgB,WAA0B,EAAG,GAAIt+B,aAAcA,EAC1E,GAEIy+B,GAAYjU,EAAM,WACpB8T,EAAgB,WAA0B,EAC5C,GAEII,EAASF,GAAkBC,EAE/B1hD,EAAE,CAAEjD,OAAQ,UAAWwwC,MAAM,EAAMhtC,OAAQohD,EAAQC,KAAMD,GAAU,CACjElF,UAAW,SAAmBoF,EAAQr2C,GACpC81C,EAAaO,GACb1lD,EAASqP,GACT,IAAIs2C,EAAYnlD,UAAUC,OAAS,EAAIilD,EAASP,EAAa3kD,UAAU,IACvE,GAAI+kD,IAAaD,EAAgB,OAAOF,EAAgBM,EAAQr2C,EAAMs2C,GACtE,GAAID,IAAWC,EAAW,CAExB,OAAQt2C,EAAK5O,QACX,KAAK,EAAG,OAAO,IAAIilD,EACnB,KAAK,EAAG,OAAO,IAAIA,EAAOr2C,EAAK,IAC/B,KAAK,EAAG,OAAO,IAAIq2C,EAAOr2C,EAAK,GAAIA,EAAK,IACxC,KAAK,EAAG,OAAO,IAAIq2C,EAAOr2C,EAAK,GAAIA,EAAK,GAAIA,EAAK,IACjD,KAAK,EAAG,OAAO,IAAIq2C,EAAOr2C,EAAK,GAAIA,EAAK,GAAIA,EAAK,GAAIA,EAAK,IAG5D,IAAIu2C,EAAQ,CAAC,MAEb,OADA13C,EAAMhE,EAAM07C,EAAOv2C,GACZ,IAAKnB,EAAM0E,EAAM8yC,EAAQE,GAClC,CAEA,IAAIzhD,EAAQwhD,EAAUhmD,UAClB+oB,EAAW9oB,EAAO8I,EAASvE,GAASA,EAAQkhD,GAC5C18C,EAASuF,EAAMw3C,EAAQh9B,EAAUrZ,GACrC,OAAO3G,EAASC,GAAUA,EAAS+f,CACrC,G,0BCtDF,IAAIwqB,EAAU,EAAQ,MAClB2S,EAAY,EAAQ,MACpBC,EAAoB,EAAQ,MAC5BC,EAAY,EAAQ,MAGpBC,EAFkB,EAAQ,KAEfxF,CAAgB,YAE/BpiD,EAAOC,QAAU,SAAUC,GACzB,IAAKwnD,EAAkBxnD,GAAK,OAAOunD,EAAUvnD,EAAI0nD,IAC5CH,EAAUvnD,EAAI,eACdynD,EAAU7S,EAAQ50C,GACzB,C,0BCZA,IAAIuF,EAAI,EAAQ,MACZytC,EAAQ,EAAQ,MAChBgT,EAAW,EAAQ,MACnB2B,EAAuB,EAAQ,MAC/BC,EAA2B,EAAQ,MAMvCriD,EAAE,CAAEjD,OAAQ,SAAUwwC,MAAM,EAAMhtC,OAJRktC,EAAM,WAAc2U,EAAqB,EAAI,GAIRR,MAAOS,GAA4B,CAChG5+C,eAAgB,SAAwBhJ,GACtC,OAAO2nD,EAAqB3B,EAAShmD,GACvC,G,0BCbF,IAAIuF,EAAI,EAAQ,MACZtE,EAAO,EAAQ,MACfmJ,EAAW,EAAQ,IACnB1I,EAAW,EAAQ,MACnBmmD,EAAmB,EAAQ,MAC3BC,EAAiC,EAAQ,MACzC9+C,EAAiB,EAAQ,MAe7BzD,EAAE,CAAEjD,OAAQ,UAAWwwC,MAAM,GAAQ,CACnCpwC,IAZF,SAASA,EAAIJ,EAAQylD,GACnB,IACI/Z,EAAY3sC,EADZ2mD,EAAW9lD,UAAUC,OAAS,EAAIG,EAASJ,UAAU,GAEzD,OAAIR,EAASY,KAAY0lD,EAAiB1lD,EAAOylD,IACjD/Z,EAAa8Z,EAA+B1xC,EAAE9T,EAAQylD,IAC/BF,EAAiB7Z,GACpCA,EAAW3rC,WACQyC,IAAnBkpC,EAAWtrC,SAAoBoC,EAAY7D,EAAK+sC,EAAWtrC,IAAKslD,GAChE59C,EAAS/I,EAAY2H,EAAe1G,IAAiBI,EAAIrB,EAAW0mD,EAAaC,QAArF,CACF,G,0BCnBA,IAAIrQ,EAAa,EAAQ,MACrBlF,EAA2B,EAAQ,KACnC5yC,EAAa,EAAQ,MACrBooD,EAAW,EAAQ,MACnB7U,EAAgB,EAAQ,MACxB8O,EAAkB,EAAQ,MAC1BgG,EAAc,EAAQ,MACtB1V,EAAU,EAAQ,MAClB2P,EAAa,EAAQ,MAErBjJ,EAAyBzG,GAA4BA,EAAyBpxC,UAC9E+gD,EAAUF,EAAgB,WAC1BpJ,GAAc,EACdH,EAAiC94C,EAAW83C,EAAWwQ,uBAEvDzV,EAA6BuV,EAAS,UAAW,WACnD,IAAIG,EAA6BhV,EAAcX,GAC3C4V,EAAyBD,IAA+B73C,OAAOkiC,GAInE,IAAK4V,GAAyC,KAAflG,EAAmB,OAAO,EAEzD,GAAI3P,KAAa0G,EAA8B,QAAKA,EAAgC,SAAI,OAAO,EAI/F,IAAKiJ,GAAcA,EAAa,KAAO,cAAc98C,KAAK+iD,GAA6B,CAErF,IAAIhO,EAAU,IAAI3H,EAAyB,SAAUpG,GAAWA,EAAQ,EAAI,GACxEic,EAAc,SAAUjgD,GAC1BA,EAAK,WAA0B,EAAG,WAA0B,EAC9D,EAIA,IAHkB+xC,EAAQ74C,YAAc,CAAC,GAC7B6gD,GAAWkG,IACvBxP,EAAcsB,EAAQzf,KAAK,WAA0B,aAAc2tB,GACjD,OAAO,CAE3B,CAAE,QAAQD,GAA2C,YAAhBH,GAA6C,SAAhBA,GAA4BvP,EAChG,GAEA74C,EAAOC,QAAU,CACf24C,YAAahG,EACbkG,gBAAiBD,EACjBG,YAAaA,E,0BC5Cf,IAAIr3C,EAAY,EAAQ,MACpBukD,EAAW,EAAQ,MACnBuC,EAAgB,EAAQ,MACxBC,EAAoB,EAAQ,MAE5B3mD,EAAaC,UAEb2mD,EAAe,8CAGf5H,EAAe,SAAU6H,GAC3B,OAAO,SAAUpN,EAAMt1C,EAAY2iD,EAAiBzW,GAClD,IAAIh2B,EAAI8pC,EAAS1K,GACbx0C,EAAOyhD,EAAcrsC,GACrB/Z,EAASqmD,EAAkBtsC,GAE/B,GADAza,EAAUuE,GACK,IAAX7D,GAAgBwmD,EAAkB,EAAG,MAAM,IAAI9mD,EAAW4mD,GAC9D,IAAIj+C,EAAQk+C,EAAWvmD,EAAS,EAAI,EAChC6P,EAAI02C,GAAY,EAAI,EACxB,GAAIC,EAAkB,EAAG,OAAa,CACpC,GAAIn+C,KAAS1D,EAAM,CACjBorC,EAAOprC,EAAK0D,GACZA,GAASwH,EACT,KACF,CAEA,GADAxH,GAASwH,EACL02C,EAAWl+C,EAAQ,EAAIrI,GAAUqI,EACnC,MAAM,IAAI3I,EAAW4mD,EAEzB,CACA,KAAMC,EAAWl+C,GAAS,EAAIrI,EAASqI,EAAOA,GAASwH,EAAOxH,KAAS1D,IACrEorC,EAAOlsC,EAAWksC,EAAMprC,EAAK0D,GAAQA,EAAO0R,IAE9C,OAAOg2B,CACT,CACF,EAEApyC,EAAOC,QAAU,CAGfif,KAAM6hC,GAAa,GAGnB/hC,MAAO+hC,GAAa,G,aC5CtB,SAOE,SAAU5uC,GAMR,EAAQ,CACN,SACC,EAAF,SAAY22C,GACX,OAgBK,SAAkB32C,EAAQ22C,GAErC,aAEA,IAAIC,EAAQ,CAKZA,OAAe,SAAUnkD,EAAGD,GAC1B,IAAM,IAAIqkD,KAAQrkD,EAChBC,EAAGokD,GAASrkD,EAAGqkD,GAEjB,OAAOpkD,CACT,EAIAmkD,OAAe,SAAUE,EAAKC,GAC5B,OAAWD,EAAMC,EAAQA,GAAQA,CACnC,GAIIjU,EAAanvC,MAAMvE,UAAU2M,MAGjC66C,EAAMI,UAAY,SAAU/oD,GAC1B,OAAK0F,MAAM+H,QAASzN,GAEXA,EAGJA,QACI,GAGuB,iBAAPA,GAAwC,iBAAdA,EAAIiC,OAG9C4yC,EAAW9zC,KAAMf,GAInB,CAAEA,EACX,EAIA2oD,EAAMK,WAAa,SAAUC,EAAKjpD,GAChC,IAAIsK,EAAQ2+C,EAAI/2C,QAASlS,IACV,GAAVsK,GACH2+C,EAAI//C,OAAQoB,EAAO,EAEvB,EAIAq+C,EAAMO,UAAY,SAAUC,EAAM9a,GAChC,KAAQ8a,EAAKl5B,YAAck5B,GAAQ/2C,SAASC,MAE1C,GADA82C,EAAOA,EAAKl5B,WACPy4B,EAAiBS,EAAM9a,GAC1B,OAAO8a,CAGb,EAKAR,EAAMS,gBAAkB,SAAUD,GAChC,MAAoB,iBAARA,EACH/2C,SAASsN,cAAeypC,GAE1BA,CACT,EAKAR,EAAMU,YAAc,SAAUvlC,GAC5B,IAAI8Z,EAAS,KAAO9Z,EAAM7iB,KACrBD,KAAM48B,IACT58B,KAAM48B,GAAU9Z,EAEpB,EAIA6kC,EAAMW,mBAAqB,SAAUC,EAAOlb,GAE1Ckb,EAAQZ,EAAMI,UAAWQ,GACzB,IAAIC,EAAU,GAyBd,OAvBAD,EAAMz2C,QAAS,SAAUq2C,GAEvB,GAAQA,aAAgBvgC,YAIxB,GAAMylB,EAAN,CAMKqa,EAAiBS,EAAM9a,IAC1Bmb,EAAQ99C,KAAMy9C,GAKhB,IAFA,IAAIM,EAAaN,EAAK7iC,iBAAkB+nB,GAE9Bv8B,EAAE,EAAGA,EAAI23C,EAAWxnD,OAAQ6P,IACpC03C,EAAQ99C,KAAM+9C,EAAW33C,GAV3B,MAFE03C,EAAQ99C,KAAMy9C,EAclB,GAEOK,CACT,EAIAb,EAAMe,eAAiB,SAAUC,EAAQC,EAAYC,GACnDA,EAAYA,GAAa,IAEzB,IAAIjsB,EAAS+rB,EAAOxoD,UAAWyoD,GAC3BE,EAAcF,EAAa,UAE/BD,EAAOxoD,UAAWyoD,GAAe,WAC/B,IAAInnB,EAAUzhC,KAAM8oD,GACpBtpC,aAAciiB,GAEd,IAAI5xB,EAAO7O,UACPlB,EAAQE,KACZA,KAAM8oD,GAAgBvpC,WAAY,WAChCqd,EAAOluB,MAAO5O,EAAO+P,UACd/P,EAAOgpD,EAChB,EAAGD,EACL,CACF,EAIAlB,EAAMoB,SAAW,SAAU7Z,GACzB,IAAIxW,EAAatnB,SAASsnB,WACP,YAAdA,GAA0C,eAAdA,EAE/BnZ,WAAY2vB,GAEZ99B,SAASiC,iBAAkB,mBAAoB67B,EAEnD,EAKAyY,EAAMqB,SAAW,SAAUC,GACzB,OAAOA,EAAI9lD,QAAS,cAAe,SAAUO,EAAOwlD,EAAIC,GACtD,OAAOD,EAAK,IAAMC,CACpB,GAAGrzC,aACL,EAEA,IAAI4M,EAAU3R,EAAO2R,QA4CrB,OAtCAilC,EAAMyB,SAAW,SAAUC,EAAaC,GACtC3B,EAAMoB,SAAU,WACd,IAAIQ,EAAkB5B,EAAMqB,SAAUM,GAClCE,EAAW,QAAUD,EACrBE,EAAgBr4C,SAASkU,iBAAkB,IAAMkkC,EAAW,KAC5DE,EAAct4C,SAASkU,iBAAkB,OAASikC,GAClDhB,EAAQZ,EAAMI,UAAW0B,GAC1BjJ,OAAQmH,EAAMI,UAAW2B,IACxBC,EAAkBH,EAAW,WAC7BI,EAAS74C,EAAO64C,OAEpBrB,EAAMz2C,QAAS,SAAUq2C,GACvB,IAEI9yC,EAFAw0C,EAAO1B,EAAKpjC,aAAcykC,IAC5BrB,EAAKpjC,aAAc4kC,GAErB,IACEt0C,EAAUw0C,GAAQrnC,KAAKC,MAAOonC,EAChC,CAAE,MAAQ7uB,GAMR,YAJKtY,GACHA,EAAQsY,MAAO,iBAAmBwuB,EAAW,OAASrB,EAAK5pB,UAC3D,KAAOvD,GAGX,CAEA,IAAI9R,EAAW,IAAImgC,EAAalB,EAAM9yC,GAEjCu0C,GACHA,EAAO//C,KAAMs+C,EAAMmB,EAAWpgC,EAElC,EAEF,EACF,EAIOy+B,CAEP,CAhOamC,CAAS/4C,EAAQ22C,EACzB,sCAeL,CAzBA,CAyBG32C,O,2BC9BHlS,EAAQE,YAAa,EACrBF,EAAiB,aAAS,EAE1B,IAIgCG,EAJ5B+qD,GAI4B/qD,EAJQ,EAAQ,OAIKA,EAAID,WAAaC,EAAM,CAAE,QAAWA,GAFrFE,EAAS,EAAQ,MAMrB,SAASC,EAAgBC,EAAGC,GAA+G,OAA1GF,EAAkBG,OAAOC,gBAAkB,SAAyBH,EAAGC,GAAsB,OAAjBD,EAAEI,UAAYH,EAAUD,CAAG,EAAUD,EAAgBC,EAAGC,EAAI,CAEzK,IAAI2qD,EAAsB,SAAUC,GAJpC,IAAwBtqD,EAAUC,EAOhC,SAASoqD,EAAOnqD,GACd,IAAIC,EAIJ,OAFAA,EAAQmqD,EAAWlqD,KAAKC,KAAMH,IAASG,MACjCC,KAAOf,EAAOuxC,OACb3wC,CACT,CASA,OAtBgCF,EAKTqqD,GALDtqD,EAKPqqD,GALwC7pD,UAAYb,OAAOc,OAAOR,EAAWO,WAAYR,EAASQ,UAAUE,YAAcV,EAAUR,EAAgBQ,EAAUC,GAehKoqD,EAAO7pD,UAEb8C,SAAW,WAChB,IAAIinD,EAASlqD,KAAKiB,OAAS,IAAMjB,KAAK+C,IAAIsM,QAAQ5L,KAAK,KAAO,IAAM,GACpE,MAAO,CAACzD,KAAKmqD,eAAgBnqD,KAAKoqD,kBAAkB,SAAUF,EAAQlqD,KAAKqqD,eAAe5mD,KAAK,GACjG,EAEOumD,CACT,CAnB0B,CAmBxBD,EAAoB,SAEtBlrD,EAAiB,QAAImrD,EACrBprD,EAAOC,QAAUA,EAAQyB,O,2BCpCzB,IAAIP,EAAO,EAAQ,MACfgyC,EAAS,EAAQ,MACjBsP,EAAgB,EAAQ,MACxBiJ,EAAuB,EAAQ,MAC/BC,EAAkC,EAAQ,MAE1CC,EAAkBnoD,OAAOlC,UAE7BvB,EAAOC,QAAUyrD,EAAqBG,QAAU,SAAU3rD,GACxD,OAAOA,EAAG4rD,KACZ,EAAI,SAAU5rD,GACZ,OAASwrD,EAAqBG,UAAWpJ,EAAcmJ,EAAiB1rD,IAAQizC,EAAOjzC,EAAI,SAEvFA,EAAG4rD,MADH3qD,EAAKwqD,EAAiCzrD,EAE5C,C,cCfA,MAAM6rD,EAAS,EAAQ,MAEjBp6C,EAASs3C,GACbA,EACG+C,QAAQ,GACRznD,QAAQ,iBAAkB,MAC1BA,QAAQ,OAAQ,IACf0nD,EAAOC,GAAO,GAAGv6C,EAAMu6C,EAAK,SAC5BC,EAAK,CAACD,EAAIE,IAAS,GAAGz6C,EAAMu6C,EAAKE,OACjCC,EAAY/nD,IAEhBA,EAAqB,KADrBA,EAAMA,EAAIC,QAAQ,IAAK,KACblC,OAAeiC,EAAIC,QAAQ,KAAM,QAAUD,EAI9C,GAHGS,SAAST,EAAI6S,UAAU,EAAG,GAAI,OAC9BpS,SAAST,EAAI6S,UAAU,EAAG,GAAI,OAC9BpS,SAAST,EAAI6S,UAAU,EAAG,GAAI,OAI1C,IAAIm1C,EAAmB,CACrBC,GAAI,CACFzG,IAAK,CACH,CACE0G,SAAUP,EAAI,IACdQ,WAAY96C,EAAM,GAAK,IACvBlR,EAAG,CACDisD,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,GAAI,KAEvB,kBAAmB,CACjBK,SAAUL,EAAG,GAAI,IACjBM,WAAY96C,EAAM,GAAK,IACvB+6C,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,GAAI,KAEvBS,WAAY,CACVF,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,GAAI,IACrBU,mBAAoBV,EAAG,GAAI,KAE7BW,GAAI,CACFN,SAAUL,EAAG,GAAI,IACjBO,UAAW,IACXC,aAAcR,EAAG,GAAI,IACrBM,WAAY96C,EAAM,MAEpBo7C,GAAI,CACFP,SAAUL,EAAG,GAAI,IACjBO,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,GAAI,IACrBM,WAAY96C,EAAM,MAEpBq7C,GAAI,CACFR,SAAUL,EAAG,GAAI,IACjBO,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,EAAG,IACpBM,WAAY96C,EAAM,GAAK,KAEzBs7C,GAAI,CACFP,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,EAAG,IACpBM,WAAY96C,EAAM,GAAK,KAEzBu7C,IAAK,CACHR,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,GAAI,KAEvBgB,QAAS,CACPT,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,GAAI,KAEvB,gBAAiB,CACfO,UAAW,IACXC,aAAc,KAEhBS,MAAO,CACLV,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,GAAI,KAEvBkB,IAAK,CACHb,SAAUL,EAAG,GAAI,IACjBmB,aAAcrB,EAAI,GAClBzmC,WAAY2mC,EAAG,EAAG,IAClBoB,iBAAkBpB,EAAG,EAAG,IACxB1mC,cAAe0mC,EAAG,EAAG,IACrBU,mBAAoBV,EAAG,EAAG,KAE5BqB,KAAM,CACJhB,SAAUL,EAAG,GAAI,KAEnB,UAAW,CACTK,SAAUL,EAAG,GAAI,KAEnB,UAAW,CACTK,SAAUL,EAAG,GAAI,KAEnBsB,IAAK,CACHjB,SAAUL,EAAG,GAAI,IACjBM,WAAY96C,EAAM,GAAK,IACvB+6C,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,GAAI,IACrBmB,aAAcrB,EAAI,GAClBzmC,WAAY2mC,EAAG,EAAG,IAClBoB,iBAAkBpB,EAAG,GAAI,IACzB1mC,cAAe0mC,EAAG,EAAG,IACrBU,mBAAoBV,EAAG,GAAI,KAE7BuB,GAAI,CACFhB,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,GAAI,IACrBU,mBAAoBV,EAAG,GAAI,KAE7BwB,GAAI,CACFjB,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,GAAI,IACrBU,mBAAoBV,EAAG,GAAI,KAE7ByB,GAAI,CACFlB,UAAWP,EAAG,EAAG,IACjBQ,aAAcR,EAAG,EAAG,KAEtB,UAAW,CACTU,mBAAoBV,EAAG,EAAG,KAE5B,UAAW,CACTU,mBAAoBV,EAAG,EAAG,KAE5B,cAAe,CACbO,UAAWP,EAAG,EAAG,IACjBQ,aAAcR,EAAG,EAAG,KAEtB,4BAA6B,CAC3BO,UAAWP,EAAG,GAAI,KAEpB,2BAA4B,CAC1BQ,aAAcR,EAAG,GAAI,KAEvB,4BAA6B,CAC3BO,UAAWP,EAAG,GAAI,KAEpB,2BAA4B,CAC1BQ,aAAcR,EAAG,GAAI,KAEvB,6BAA8B,CAC5BO,UAAWP,EAAG,EAAG,IACjBQ,aAAcR,EAAG,EAAG,KAEtB0B,GAAI,CACFnB,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,GAAI,KAEvBxzB,GAAI,CACF+zB,UAAWP,EAAG,GAAI,KAEpB2B,GAAI,CACFpB,UAAWP,EAAG,EAAG,IACjBU,mBAAoBV,EAAG,GAAI,KAE7B4B,GAAI,CACFrB,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,GAAI,KAEvB,SAAU,CACRO,UAAW,KAEb,SAAU,CACRA,UAAW,KAEb,SAAU,CACRA,UAAW,KAEb,SAAU,CACRA,UAAW,KAEbsB,MAAO,CACLxB,SAAUL,EAAG,GAAI,IACjBM,WAAY96C,EAAM,MAEpB,WAAY,CACV47C,iBAAkBpB,EAAG,GAAI,IACzB1mC,cAAe0mC,EAAG,EAAG,IACrBU,mBAAoBV,EAAG,GAAI,KAE7B,uBAAwB,CACtBU,mBAAoB,KAEtB,sBAAuB,CACrBU,iBAAkB,KAEpB,qBAAsB,CACpB/nC,WAAY2mC,EAAG,EAAG,IAClBoB,iBAAkBpB,EAAG,GAAI,IACzB1mC,cAAe0mC,EAAG,EAAG,IACrBU,mBAAoBV,EAAG,GAAI,KAE7B,6CAA8C,CAC5CU,mBAAoB,KAEtB,2CAA4C,CAC1CU,iBAAkB,KAEpBU,OAAQ,CACNvB,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,GAAI,KAEvB,aAAc,CACZO,UAAW,IACXC,aAAc,KAEhBuB,WAAY,CACV1B,SAAUL,EAAG,GAAI,IACjBM,WAAY96C,EAAM,GAAK,IACvB+6C,UAAWP,EAAG,EAAG,MAGrB,CACE,iBAAkB,CAChBO,UAAW,KAEb,gBAAiB,CACfC,aAAc,QAKtBP,KAAM,CACJtG,IAAK,CACH,CACE0G,SAAUP,EAAI,IACdQ,WAAY96C,EAAM,MAClBlR,EAAG,CACDisD,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,GAAI,KAEvB,kBAAmB,CACjBK,SAAUL,EAAG,GAAI,IACjBM,WAAY96C,EAAM,KAClB+6C,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,GAAI,KAEvBS,WAAY,CACVF,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,GAAI,IACrBU,mBAAoBV,EAAG,GAAI,KAE7BW,GAAI,CACFN,SAAUL,EAAG,GAAI,IACjBO,UAAW,IACXC,aAAcR,EAAG,GAAI,IACrBM,WAAY96C,EAAM,GAAK,KAEzBo7C,GAAI,CACFP,SAAUL,EAAG,GAAI,IACjBO,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,GAAI,IACrBM,WAAY96C,EAAM,GAAK,KAEzBq7C,GAAI,CACFR,SAAUL,EAAG,GAAI,IACjBO,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,GAAI,IACrBM,WAAY96C,EAAM,MAEpBs7C,GAAI,CACFP,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,EAAG,IACpBM,WAAY96C,EAAM,MAEpBu7C,IAAK,CACHR,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,GAAI,KAEvBgB,QAAS,CACPT,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,GAAI,KAEvB,gBAAiB,CACfO,UAAW,IACXC,aAAc,KAEhBS,MAAO,CACLV,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,GAAI,KAEvBkB,IAAK,CACHb,SAAUL,EAAG,GAAI,IACjBmB,aAAcrB,EAAI,GAClBzmC,WAAY2mC,EAAG,EAAG,IAClBoB,iBAAkBpB,EAAG,EAAG,IACxB1mC,cAAe0mC,EAAG,EAAG,IACrBU,mBAAoBV,EAAG,EAAG,KAE5BqB,KAAM,CACJhB,SAAUL,EAAG,GAAI,KAEnB,UAAW,CACTK,SAAUL,EAAG,GAAI,KAEnB,UAAW,CACTK,SAAUL,EAAG,GAAI,KAEnBsB,IAAK,CACHjB,SAAUL,EAAG,GAAI,IACjBM,WAAY96C,EAAM,GAAK,IACvB+6C,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,GAAI,IACrBmB,aAAcrB,EAAI,GAClBzmC,WAAY2mC,EAAG,GAAI,IACnBoB,iBAAkBpB,EAAG,GAAI,IACzB1mC,cAAe0mC,EAAG,GAAI,IACtBU,mBAAoBV,EAAG,GAAI,KAE7BuB,GAAI,CACFhB,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,GAAI,IACrBU,mBAAoBV,EAAG,GAAI,KAE7BwB,GAAI,CACFjB,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,GAAI,IACrBU,mBAAoBV,EAAG,GAAI,KAE7ByB,GAAI,CACFlB,UAAWP,EAAG,EAAG,IACjBQ,aAAcR,EAAG,EAAG,KAEtB,UAAW,CACTU,mBAAoBV,EAAG,EAAG,KAE5B,UAAW,CACTU,mBAAoBV,EAAG,EAAG,KAE5B,cAAe,CACbO,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,GAAI,KAEvB,4BAA6B,CAC3BO,UAAWP,EAAG,GAAI,KAEpB,2BAA4B,CAC1BQ,aAAcR,EAAG,GAAI,KAEvB,4BAA6B,CAC3BO,UAAWP,EAAG,GAAI,KAEpB,2BAA4B,CAC1BQ,aAAcR,EAAG,GAAI,KAEvB,6BAA8B,CAC5BO,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,GAAI,KAEvB0B,GAAI,CACFnB,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,GAAI,KAEvBxzB,GAAI,CACF+zB,UAAWP,EAAG,GAAI,KAEpB2B,GAAI,CACFpB,UAAWP,EAAG,EAAG,IACjBU,mBAAoBV,EAAG,GAAI,KAE7B4B,GAAI,CACFrB,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,GAAI,KAEvB,SAAU,CACRO,UAAW,KAEb,SAAU,CACRA,UAAW,KAEb,SAAU,CACRA,UAAW,KAEb,SAAU,CACRA,UAAW,KAEbsB,MAAO,CACLxB,SAAUL,EAAG,GAAI,IACjBM,WAAY96C,EAAM,GAAK,KAEzB,WAAY,CACV47C,iBAAkBpB,EAAG,EAAG,IACxB1mC,cAAe0mC,EAAG,EAAG,IACrBU,mBAAoBV,EAAG,EAAG,KAE5B,uBAAwB,CACtBU,mBAAoB,KAEtB,sBAAuB,CACrBU,iBAAkB,KAEpB,qBAAsB,CACpB/nC,WAAY2mC,EAAG,EAAG,IAClBoB,iBAAkBpB,EAAG,EAAG,IACxB1mC,cAAe0mC,EAAG,EAAG,IACrBU,mBAAoBV,EAAG,EAAG,KAE5B,6CAA8C,CAC5CU,mBAAoB,KAEtB,2CAA4C,CAC1CU,iBAAkB,KAEpBU,OAAQ,CACNvB,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,GAAI,KAEvB,aAAc,CACZO,UAAW,IACXC,aAAc,KAEhBuB,WAAY,CACV1B,SAAUL,EAAG,GAAI,IACjBM,WAAY96C,EAAM,GAAK,IACvB+6C,UAAWP,EAAG,GAAI,MAGtB,CACE,iBAAkB,CAChBO,UAAW,KAEb,gBAAiB,CACfC,aAAc,QAKtBwB,GAAI,CACFrI,IAAK,CACH,CACE0G,SAAUP,EAAI,IACdQ,WAAY96C,EAAM,GAAK,IACvBlR,EAAG,CACDisD,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,GAAI,KAEvB,kBAAmB,CACjBK,SAAUL,EAAG,GAAI,IACjBM,WAAY96C,EAAM,GAAK,IACvB+6C,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,GAAI,KAEvBS,WAAY,CACVF,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,GAAI,IACrBU,mBAAoBV,EAAG,GAAI,KAE7BW,GAAI,CACFN,SAAUL,EAAG,GAAI,IACjBO,UAAW,IACXC,aAAcR,EAAG,GAAI,IACrBM,WAAY96C,EAAM,IAEpBo7C,GAAI,CACFP,SAAUL,EAAG,GAAI,IACjBO,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,GAAI,IACrBM,WAAY96C,EAAM,GAAK,KAEzBq7C,GAAI,CACFR,SAAUL,EAAG,GAAI,IACjBO,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,GAAI,IACrBM,WAAY96C,EAAM,MAEpBs7C,GAAI,CACFP,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,EAAG,IACpBM,WAAY96C,EAAM,GAAK,KAEzBu7C,IAAK,CACHR,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,GAAI,KAEvBgB,QAAS,CACPT,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,GAAI,KAEvB,gBAAiB,CACfO,UAAW,IACXC,aAAc,KAEhBS,MAAO,CACLV,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,GAAI,KAEvBkB,IAAK,CACHb,SAAUL,EAAG,GAAI,IACjBmB,aAAcrB,EAAI,GAClBzmC,WAAY2mC,EAAG,EAAG,IAClBoB,iBAAkBpB,EAAG,EAAG,IACxB1mC,cAAe0mC,EAAG,EAAG,IACrBU,mBAAoBV,EAAG,EAAG,KAE5BqB,KAAM,CACJhB,SAAUL,EAAG,GAAI,KAEnB,UAAW,CACTK,SAAUL,EAAG,GAAI,KAEnB,UAAW,CACTK,SAAUL,EAAG,GAAI,KAEnBsB,IAAK,CACHjB,SAAUL,EAAG,GAAI,IACjBM,WAAY96C,EAAM,MAClB+6C,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,GAAI,IACrBmB,aAAcrB,EAAI,GAClBzmC,WAAY2mC,EAAG,GAAI,IACnBoB,iBAAkBpB,EAAG,GAAI,IACzB1mC,cAAe0mC,EAAG,GAAI,IACtBU,mBAAoBV,EAAG,GAAI,KAE7BuB,GAAI,CACFhB,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,GAAI,IACrBU,mBAAoBV,EAAG,GAAI,KAE7BwB,GAAI,CACFjB,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,GAAI,IACrBU,mBAAoBV,EAAG,GAAI,KAE7ByB,GAAI,CACFlB,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,GAAI,KAEvB,UAAW,CACTU,mBAAoBV,EAAG,EAAG,KAE5B,UAAW,CACTU,mBAAoBV,EAAG,EAAG,KAE5B,cAAe,CACbO,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,GAAI,KAEvB,4BAA6B,CAC3BO,UAAWP,EAAG,GAAI,KAEpB,2BAA4B,CAC1BQ,aAAcR,EAAG,GAAI,KAEvB,4BAA6B,CAC3BO,UAAWP,EAAG,GAAI,KAEpB,2BAA4B,CAC1BQ,aAAcR,EAAG,GAAI,KAEvB,6BAA8B,CAC5BO,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,GAAI,KAEvB0B,GAAI,CACFnB,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,GAAI,KAEvBxzB,GAAI,CACF+zB,UAAWP,EAAG,GAAI,KAEpB2B,GAAI,CACFpB,UAAWP,EAAG,GAAI,IAClBU,mBAAoBV,EAAG,GAAI,KAE7B4B,GAAI,CACFrB,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,GAAI,KAEvB,SAAU,CACRO,UAAW,KAEb,SAAU,CACRA,UAAW,KAEb,SAAU,CACRA,UAAW,KAEb,SAAU,CACRA,UAAW,KAEbsB,MAAO,CACLxB,SAAUL,EAAG,GAAI,IACjBM,WAAY96C,EAAM,MAEpB,WAAY,CACV47C,iBAAkBpB,EAAG,GAAI,IACzB1mC,cAAe0mC,EAAG,GAAI,IACtBU,mBAAoBV,EAAG,GAAI,KAE7B,uBAAwB,CACtBU,mBAAoB,KAEtB,sBAAuB,CACrBU,iBAAkB,KAEpB,qBAAsB,CACpB/nC,WAAY2mC,EAAG,GAAI,IACnBoB,iBAAkBpB,EAAG,GAAI,IACzB1mC,cAAe0mC,EAAG,GAAI,IACtBU,mBAAoBV,EAAG,GAAI,KAE7B,6CAA8C,CAC5CU,mBAAoB,KAEtB,2CAA4C,CAC1CU,iBAAkB,KAEpBU,OAAQ,CACNvB,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,GAAI,KAEvB,aAAc,CACZO,UAAW,IACXC,aAAc,KAEhBuB,WAAY,CACV1B,SAAUL,EAAG,GAAI,IACjBM,WAAY96C,EAAM,KAClB+6C,UAAWP,EAAG,GAAI,MAGtB,CACE,iBAAkB,CAChBO,UAAW,KAEb,gBAAiB,CACfC,aAAc,QAKtByB,GAAI,CACFtI,IAAK,CACH,CACE0G,SAAUP,EAAI,IACdQ,WAAY96C,EAAM,KAClBlR,EAAG,CACDisD,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,GAAI,KAEvB,kBAAmB,CACjBK,SAAUL,EAAG,GAAI,IACjBM,WAAY96C,EAAM,KAClB+6C,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,GAAI,KAEvBS,WAAY,CACVF,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,GAAI,IACrBU,mBAAoBV,EAAG,GAAI,KAE7BW,GAAI,CACFN,SAAUL,EAAG,GAAI,IACjBO,UAAW,IACXC,aAAcR,EAAG,GAAI,IACrBM,WAAY96C,EAAM,IAEpBo7C,GAAI,CACFP,SAAUL,EAAG,GAAI,IACjBO,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,GAAI,IACrBM,WAAY96C,EAAM,GAAK,KAEzBq7C,GAAI,CACFR,SAAUL,EAAG,GAAI,IACjBO,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,GAAI,IACrBM,WAAY96C,EAAM,GAAK,KAEzBs7C,GAAI,CACFP,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,GAAI,IACrBM,WAAY96C,EAAM,MAEpBu7C,IAAK,CACHR,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,GAAI,KAEvBgB,QAAS,CACPT,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,GAAI,KAEvB,gBAAiB,CACfO,UAAW,IACXC,aAAc,KAEhBS,MAAO,CACLV,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,GAAI,KAEvBkB,IAAK,CACHb,SAAUL,EAAG,GAAI,IACjBmB,aAAcrB,EAAI,GAClBzmC,WAAY2mC,EAAG,EAAG,IAClBoB,iBAAkBpB,EAAG,EAAG,IACxB1mC,cAAe0mC,EAAG,EAAG,IACrBU,mBAAoBV,EAAG,EAAG,KAE5BqB,KAAM,CACJhB,SAAUL,EAAG,GAAI,KAEnB,UAAW,CACTK,SAAUL,EAAG,GAAI,KAEnB,UAAW,CACTK,SAAUL,EAAG,GAAI,KAEnBsB,IAAK,CACHjB,SAAUL,EAAG,GAAI,IACjBM,WAAY96C,EAAM,GAAK,IACvB+6C,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,GAAI,IACrBmB,aAAcrB,EAAI,GAClBzmC,WAAY2mC,EAAG,GAAI,IACnBoB,iBAAkBpB,EAAG,GAAI,IACzB1mC,cAAe0mC,EAAG,GAAI,IACtBU,mBAAoBV,EAAG,GAAI,KAE7BuB,GAAI,CACFhB,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,GAAI,IACrBU,mBAAoBV,EAAG,GAAI,KAE7BwB,GAAI,CACFjB,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,GAAI,IACrBU,mBAAoBV,EAAG,GAAI,KAE7ByB,GAAI,CACFlB,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,GAAI,KAEvB,UAAW,CACTU,mBAAoBV,EAAG,EAAG,KAE5B,UAAW,CACTU,mBAAoBV,EAAG,EAAG,KAE5B,cAAe,CACbO,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,GAAI,KAEvB,4BAA6B,CAC3BO,UAAWP,EAAG,GAAI,KAEpB,2BAA4B,CAC1BQ,aAAcR,EAAG,GAAI,KAEvB,4BAA6B,CAC3BO,UAAWP,EAAG,GAAI,KAEpB,2BAA4B,CAC1BQ,aAAcR,EAAG,GAAI,KAEvB,6BAA8B,CAC5BO,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,GAAI,KAEvB0B,GAAI,CACFnB,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,GAAI,KAEvBxzB,GAAI,CACF+zB,UAAWP,EAAG,GAAI,KAEpB2B,GAAI,CACFpB,UAAWP,EAAG,GAAI,IAClBU,mBAAoBV,EAAG,GAAI,KAE7B4B,GAAI,CACFrB,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,GAAI,KAEvB,SAAU,CACRO,UAAW,KAEb,SAAU,CACRA,UAAW,KAEb,SAAU,CACRA,UAAW,KAEb,SAAU,CACRA,UAAW,KAEbsB,MAAO,CACLxB,SAAUL,EAAG,GAAI,IACjBM,WAAY96C,EAAM,GAAK,KAEzB,WAAY,CACV47C,iBAAkBpB,EAAG,GAAI,IACzB1mC,cAAe0mC,EAAG,GAAI,IACtBU,mBAAoBV,EAAG,GAAI,KAE7B,uBAAwB,CACtBU,mBAAoB,KAEtB,sBAAuB,CACrBU,iBAAkB,KAEpB,qBAAsB,CACpB/nC,WAAY2mC,EAAG,GAAI,IACnBoB,iBAAkBpB,EAAG,GAAI,IACzB1mC,cAAe0mC,EAAG,GAAI,IACtBU,mBAAoBV,EAAG,GAAI,KAE7B,6CAA8C,CAC5CU,mBAAoB,KAEtB,2CAA4C,CAC1CU,iBAAkB,KAEpBU,OAAQ,CACNvB,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,GAAI,KAEvB,aAAc,CACZO,UAAW,IACXC,aAAc,KAEhBuB,WAAY,CACV1B,SAAUL,EAAG,GAAI,IACjBM,WAAY96C,EAAM,GAAK,IACvB+6C,UAAWP,EAAG,GAAI,MAGtB,CACE,iBAAkB,CAChBO,UAAW,KAEb,gBAAiB,CACfC,aAAc,QAKtB,MAAO,CACL7G,IAAK,CACH,CACE0G,SAAUP,EAAI,IACdQ,WAAY96C,EAAM,GAAK,IACvBlR,EAAG,CACDisD,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,GAAI,KAEvB,kBAAmB,CACjBK,SAAUL,EAAG,GAAI,IACjBM,WAAY96C,EAAM,GAAK,IACvB+6C,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,GAAI,KAEvBS,WAAY,CACVF,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,GAAI,IACrBU,mBAAoBV,EAAG,GAAI,KAE7BW,GAAI,CACFN,SAAUL,EAAG,GAAI,IACjBO,UAAW,IACXC,aAAcR,EAAG,GAAI,IACrBM,WAAY96C,EAAM,IAEpBo7C,GAAI,CACFP,SAAUL,EAAG,GAAI,IACjBO,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,GAAI,IACrBM,WAAY96C,EAAM,GAAK,KAEzBq7C,GAAI,CACFR,SAAUL,EAAG,GAAI,IACjBO,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,GAAI,IACrBM,WAAY96C,EAAM,GAAK,KAEzBs7C,GAAI,CACFP,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,GAAI,IACrBM,WAAY96C,EAAM,MAEpBu7C,IAAK,CACHR,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,GAAI,KAEvBgB,QAAS,CACPT,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,GAAI,KAEvB,gBAAiB,CACfO,UAAW,IACXC,aAAc,KAEhBS,MAAO,CACLV,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,GAAI,KAEvBkB,IAAK,CACHb,SAAUL,EAAG,GAAI,IACjBmB,aAAcrB,EAAI,GAClBzmC,WAAY2mC,EAAG,EAAG,IAClBoB,iBAAkBpB,EAAG,EAAG,IACxB1mC,cAAe0mC,EAAG,EAAG,IACrBU,mBAAoBV,EAAG,EAAG,KAE5BqB,KAAM,CACJhB,SAAUL,EAAG,GAAI,KAEnB,UAAW,CACTK,SAAUL,EAAG,GAAI,KAEnB,UAAW,CACTK,SAAUL,EAAG,GAAI,KAEnBsB,IAAK,CACHjB,SAAUL,EAAG,GAAI,IACjBM,WAAY96C,EAAM,KAClB+6C,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,GAAI,IACrBmB,aAAcrB,EAAI,GAClBzmC,WAAY2mC,EAAG,GAAI,IACnBoB,iBAAkBpB,EAAG,GAAI,IACzB1mC,cAAe0mC,EAAG,GAAI,IACtBU,mBAAoBV,EAAG,GAAI,KAE7BuB,GAAI,CACFhB,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,GAAI,IACrBU,mBAAoBV,EAAG,GAAI,KAE7BwB,GAAI,CACFjB,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,GAAI,IACrBU,mBAAoBV,EAAG,GAAI,KAE7ByB,GAAI,CACFlB,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,GAAI,KAEvB,UAAW,CACTU,mBAAoBV,EAAG,GAAI,KAE7B,UAAW,CACTU,mBAAoBV,EAAG,GAAI,KAE7B,cAAe,CACbO,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,GAAI,KAEvB,4BAA6B,CAC3BO,UAAWP,EAAG,GAAI,KAEpB,2BAA4B,CAC1BQ,aAAcR,EAAG,GAAI,KAEvB,4BAA6B,CAC3BO,UAAWP,EAAG,GAAI,KAEpB,2BAA4B,CAC1BQ,aAAcR,EAAG,GAAI,KAEvB,6BAA8B,CAC5BO,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,GAAI,KAEvB0B,GAAI,CACFnB,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,GAAI,KAEvBxzB,GAAI,CACF+zB,UAAWP,EAAG,GAAI,KAEpB2B,GAAI,CACFpB,UAAWP,EAAG,GAAI,IAClBU,mBAAoBV,EAAG,GAAI,KAE7B4B,GAAI,CACFrB,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,GAAI,KAEvB,SAAU,CACRO,UAAW,KAEb,SAAU,CACRA,UAAW,KAEb,SAAU,CACRA,UAAW,KAEb,SAAU,CACRA,UAAW,KAEbsB,MAAO,CACLxB,SAAUL,EAAG,GAAI,IACjBM,WAAY96C,EAAM,MAEpB,WAAY,CACV47C,iBAAkBpB,EAAG,GAAI,IACzB1mC,cAAe0mC,EAAG,GAAI,IACtBU,mBAAoBV,EAAG,GAAI,KAE7B,uBAAwB,CACtBU,mBAAoB,KAEtB,sBAAuB,CACrBU,iBAAkB,KAEpB,qBAAsB,CACpB/nC,WAAY2mC,EAAG,GAAI,IACnBoB,iBAAkBpB,EAAG,GAAI,IACzB1mC,cAAe0mC,EAAG,GAAI,IACtBU,mBAAoBV,EAAG,GAAI,KAE7B,6CAA8C,CAC5CU,mBAAoB,KAEtB,2CAA4C,CAC1CU,iBAAkB,KAEpBU,OAAQ,CACNvB,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,GAAI,KAEvB,aAAc,CACZO,UAAW,IACXC,aAAc,KAEhBuB,WAAY,CACV1B,SAAUL,EAAG,GAAI,IACjBM,WAAY96C,EAAM,KAClB+6C,UAAWP,EAAG,GAAI,MAGtB,CACE,iBAAkB,CAChBO,UAAW,KAEb,gBAAiB,CACfC,aAAc,QAQtB0B,MAAO,CACLvI,IAAK,CACH,kBAAmBiG,EAAOsC,MAAM,KAChC,sBAAuBtC,EAAOsC,MAAM,KACpC,kBAAmBtC,EAAOsC,MAAM,KAChC,mBAAoBtC,EAAOsC,MAAM,KACjC,kBAAmBtC,EAAOsC,MAAM,KAChC,sBAAuBtC,EAAOsC,MAAM,KACpC,qBAAsBtC,EAAOsC,MAAM,KACnC,gBAAiBtC,EAAOsC,MAAM,KAC9B,oBAAqBtC,EAAOsC,MAAM,KAClC,2BAA4BtC,EAAOsC,MAAM,KACzC,sBAAuBtC,EAAOsC,MAAM,KACpC,iBAAkBtC,EAAOsC,MAAM,KAC/B,yBAA0BhC,EAASN,EAAOsC,MAAM,MAChD,kBAAmBtC,EAAOsC,MAAM,KAChC,sBAAuBtC,EAAOsC,MAAM,KACpC,oBAAqBtC,EAAOsC,MAAM,KAClC,wBAAyBtC,EAAOsC,MAAM,KACtC,wBAAyBtC,EAAOsC,MAAM,KACtC,yBAA0BtC,EAAOsC,MAAM,KACvC,6BAA8BtC,EAAOuC,MACrC,yBAA0BvC,EAAOsC,MAAM,KACvC,0BAA2BtC,EAAOuC,MAClC,yBAA0BvC,EAAOuC,MACjC,6BAA8BvC,EAAOsC,MAAM,KAC3C,4BAA6BtC,EAAOsC,MAAM,KAC1C,uBAAwBtC,EAAOsC,MAAM,KACrC,2BAA4BtC,EAAOsC,MAAM,KACzC,kCAAmCtC,EAAOsC,MAAM,KAChD,6BAA8BtC,EAAOsC,MAAM,KAC3C,wBAAyBtC,EAAOuC,MAChC,gCAAiCjC,EAASN,EAAOuC,OACjD,yBAA0BvC,EAAOuC,MACjC,6BAA8BvC,EAAOsC,MAAM,KAC3C,2BAA4B,mBAC5B,+BAAgCtC,EAAOsC,MAAM,KAC7C,+BAAgCtC,EAAOsC,MAAM,OAIjDE,KAAM,CACJzI,IAAK,CACH,kBAAmBiG,EAAOwC,KAAK,KAC/B,sBAAuBxC,EAAOwC,KAAK,KACnC,kBAAmBxC,EAAOwC,KAAK,KAC/B,mBAAoBxC,EAAOwC,KAAK,KAChC,kBAAmBxC,EAAOwC,KAAK,KAC/B,sBAAuBxC,EAAOwC,KAAK,KACnC,qBAAsBxC,EAAOwC,KAAK,KAClC,gBAAiBxC,EAAOwC,KAAK,KAC7B,oBAAqBxC,EAAOwC,KAAK,KACjC,2BAA4BxC,EAAOwC,KAAK,KACxC,sBAAuBxC,EAAOwC,KAAK,KACnC,iBAAkBxC,EAAOwC,KAAK,KAC9B,yBAA0BlC,EAASN,EAAOwC,KAAK,MAC/C,kBAAmBxC,EAAOwC,KAAK,KAC/B,sBAAuBxC,EAAOwC,KAAK,KACnC,oBAAqBxC,EAAOwC,KAAK,KACjC,wBAAyBxC,EAAOwC,KAAK,KACrC,wBAAyBxC,EAAOwC,KAAK,KACrC,yBAA0BxC,EAAOwC,KAAK,KACtC,6BAA8BxC,EAAOuC,MACrC,yBAA0BvC,EAAOwC,KAAK,KACtC,0BAA2BxC,EAAOuC,MAClC,yBAA0BvC,EAAOuC,MACjC,6BAA8BvC,EAAOwC,KAAK,KAC1C,4BAA6BxC,EAAOwC,KAAK,KACzC,uBAAwBxC,EAAOwC,KAAK,KACpC,2BAA4BxC,EAAOwC,KAAK,KACxC,kCAAmCxC,EAAOwC,KAAK,KAC/C,6BAA8BxC,EAAOwC,KAAK,KAC1C,wBAAyBxC,EAAOuC,MAChC,gCAAiCjC,EAASN,EAAOuC,OACjD,yBAA0BvC,EAAOuC,MACjC,6BAA8BvC,EAAOwC,KAAK,KAC1C,2BAA4B,mBAC5B,+BAAgCxC,EAAOwC,KAAK,KAC5C,+BAAgCxC,EAAOwC,KAAK,OAIhDC,KAAM,CACJ1I,IAAK,CACH,kBAAmBiG,EAAOyC,KAAK,KAC/B,sBAAuBzC,EAAOyC,KAAK,KACnC,kBAAmBzC,EAAOyC,KAAK,KAC/B,mBAAoBzC,EAAOyC,KAAK,KAChC,kBAAmBzC,EAAOyC,KAAK,KAC/B,sBAAuBzC,EAAOyC,KAAK,KACnC,qBAAsBzC,EAAOyC,KAAK,KAClC,gBAAiBzC,EAAOyC,KAAK,KAC7B,oBAAqBzC,EAAOyC,KAAK,KACjC,2BAA4BzC,EAAOyC,KAAK,KACxC,sBAAuBzC,EAAOyC,KAAK,KACnC,iBAAkBzC,EAAOyC,KAAK,KAC9B,yBAA0BnC,EAASN,EAAOyC,KAAK,MAC/C,kBAAmBzC,EAAOyC,KAAK,KAC/B,sBAAuBzC,EAAOyC,KAAK,KACnC,oBAAqBzC,EAAOyC,KAAK,KACjC,wBAAyBzC,EAAOyC,KAAK,KACrC,wBAAyBzC,EAAOyC,KAAK,KACrC,yBAA0BzC,EAAOyC,KAAK,KACtC,6BAA8BzC,EAAOuC,MACrC,yBAA0BvC,EAAOyC,KAAK,KACtC,0BAA2BzC,EAAOuC,MAClC,yBAA0BvC,EAAOuC,MACjC,6BAA8BvC,EAAOyC,KAAK,KAC1C,4BAA6BzC,EAAOyC,KAAK,KACzC,uBAAwBzC,EAAOyC,KAAK,KACpC,2BAA4BzC,EAAOyC,KAAK,KACxC,kCAAmCzC,EAAOyC,KAAK,KAC/C,6BAA8BzC,EAAOyC,KAAK,KAC1C,wBAAyBzC,EAAOuC,MAChC,gCAAiCjC,EAASN,EAAOuC,OACjD,yBAA0BvC,EAAOuC,MACjC,6BAA8BvC,EAAOyC,KAAK,KAC1C,2BAA4B,mBAC5B,+BAAgCzC,EAAOyC,KAAK,KAC5C,+BAAgCzC,EAAOyC,KAAK,OAIhDC,QAAS,CACP3I,IAAK,CACH,kBAAmBiG,EAAO0C,QAAQ,KAClC,sBAAuB1C,EAAO0C,QAAQ,KACtC,kBAAmB1C,EAAO0C,QAAQ,KAClC,mBAAoB1C,EAAO0C,QAAQ,KACnC,kBAAmB1C,EAAO0C,QAAQ,KAClC,sBAAuB1C,EAAO0C,QAAQ,KACtC,qBAAsB1C,EAAO0C,QAAQ,KACrC,gBAAiB1C,EAAO0C,QAAQ,KAChC,oBAAqB1C,EAAO0C,QAAQ,KACpC,2BAA4B1C,EAAO0C,QAAQ,KAC3C,sBAAuB1C,EAAO0C,QAAQ,KACtC,iBAAkB1C,EAAO0C,QAAQ,KACjC,yBAA0BpC,EAASN,EAAO0C,QAAQ,MAClD,kBAAmB1C,EAAO0C,QAAQ,KAClC,sBAAuB1C,EAAO0C,QAAQ,KACtC,oBAAqB1C,EAAO0C,QAAQ,KACpC,wBAAyB1C,EAAO0C,QAAQ,KACxC,wBAAyB1C,EAAO0C,QAAQ,KACxC,yBAA0B1C,EAAO0C,QAAQ,KACzC,6BAA8B1C,EAAOuC,MACrC,yBAA0BvC,EAAO0C,QAAQ,KACzC,0BAA2B1C,EAAOuC,MAClC,yBAA0BvC,EAAOuC,MACjC,6BAA8BvC,EAAO0C,QAAQ,KAC7C,4BAA6B1C,EAAO0C,QAAQ,KAC5C,uBAAwB1C,EAAO0C,QAAQ,KACvC,2BAA4B1C,EAAO0C,QAAQ,KAC3C,kCAAmC1C,EAAO0C,QAAQ,KAClD,6BAA8B1C,EAAO0C,QAAQ,KAC7C,wBAAyB1C,EAAOuC,MAChC,gCAAiCjC,EAASN,EAAOuC,OACjD,yBAA0BvC,EAAOuC,MACjC,6BAA8BvC,EAAO0C,QAAQ,KAC7C,2BAA4B,mBAC5B,+BAAgC1C,EAAO0C,QAAQ,KAC/C,+BAAgC1C,EAAO0C,QAAQ,OAInDC,MAAO,CACL5I,IAAK,CACH,kBAAmBiG,EAAO2C,MAAM,KAChC,sBAAuB3C,EAAO2C,MAAM,KACpC,kBAAmB3C,EAAO2C,MAAM,KAChC,mBAAoB3C,EAAO2C,MAAM,KACjC,kBAAmB3C,EAAO2C,MAAM,KAChC,sBAAuB3C,EAAO2C,MAAM,KACpC,qBAAsB3C,EAAO2C,MAAM,KACnC,gBAAiB3C,EAAO2C,MAAM,KAC9B,oBAAqB3C,EAAO2C,MAAM,KAClC,2BAA4B3C,EAAO2C,MAAM,KACzC,sBAAuB3C,EAAO2C,MAAM,KACpC,iBAAkB3C,EAAO2C,MAAM,KAC/B,yBAA0BrC,EAASN,EAAO2C,MAAM,MAChD,kBAAmB3C,EAAO2C,MAAM,KAChC,sBAAuB3C,EAAO2C,MAAM,KACpC,oBAAqB3C,EAAO2C,MAAM,KAClC,wBAAyB3C,EAAO2C,MAAM,KACtC,wBAAyB3C,EAAO2C,MAAM,KACtC,yBAA0B3C,EAAO2C,MAAM,KACvC,6BAA8B3C,EAAOuC,MACrC,yBAA0BvC,EAAO2C,MAAM,KACvC,0BAA2B3C,EAAOuC,MAClC,yBAA0BvC,EAAOuC,MACjC,6BAA8BvC,EAAO2C,MAAM,KAC3C,4BAA6B3C,EAAO2C,MAAM,KAC1C,uBAAwB3C,EAAO2C,MAAM,KACrC,2BAA4B3C,EAAO2C,MAAM,KACzC,kCAAmC3C,EAAO2C,MAAM,KAChD,6BAA8B3C,EAAO2C,MAAM,KAC3C,wBAAyB3C,EAAOuC,MAChC,gCAAiCjC,EAASN,EAAOuC,OACjD,yBAA0BvC,EAAOuC,MACjC,6BAA8BvC,EAAO2C,MAAM,KAC3C,2BAA4B,mBAC5B,+BAAgC3C,EAAO2C,MAAM,KAC7C,+BAAgC3C,EAAO2C,MAAM,OAMjDC,IAAK,CACH7I,IAAK,CACH,mBAAoBiG,EAAO4C,IAAI,KAC/B,0BAA2B5C,EAAO4C,IAAI,OAI1CC,OAAQ,CACN9I,IAAK,CACH,mBAAoBiG,EAAO6C,OAAO,KAClC,0BAA2B7C,EAAO6C,OAAO,OAI7CC,MAAO,CACL/I,IAAK,CACH,mBAAoBiG,EAAO8C,MAAM,KACjC,0BAA2B9C,EAAO8C,MAAM,OAI5CC,OAAQ,CACNhJ,IAAK,CACH,mBAAoBiG,EAAO+C,OAAO,KAClC,0BAA2B/C,EAAO+C,OAAO,OAI7CC,KAAM,CACJjJ,IAAK,CACH,mBAAoBiG,EAAOgD,KAAK,KAChC,0BAA2BhD,EAAOgD,KAAK,OAI3CC,MAAO,CACLlJ,IAAK,CACH,mBAAoBiG,EAAOiD,MAAM,KACjC,0BAA2BjD,EAAOiD,MAAM,OAI5CC,QAAS,CACPnJ,IAAK,CACH,mBAAoBiG,EAAOkD,QAAQ,KACnC,0BAA2BlD,EAAOkD,QAAQ,OAI9CC,KAAM,CACJpJ,IAAK,CACH,mBAAoBiG,EAAOmD,KAAK,KAChC,0BAA2BnD,EAAOmD,KAAK,OAI3CC,KAAM,CACJrJ,IAAK,CACH,mBAAoBiG,EAAOoD,KAAK,KAChC,0BAA2BpD,EAAOoD,KAAK,OAI3CC,IAAK,CACHtJ,IAAK,CACH,mBAAoBiG,EAAOqD,IAAI,KAC/B,0BAA2BrD,EAAOqD,IAAI,OAI1CC,KAAM,CACJvJ,IAAK,CACH,mBAAoBiG,EAAOsD,KAAK,KAChC,0BAA2BtD,EAAOsD,KAAK,OAI3CC,OAAQ,CACNxJ,IAAK,CACH,mBAAoBiG,EAAOuD,OAAO,KAClC,0BAA2BvD,EAAOuD,OAAO,OAI7CC,OAAQ,CACNzJ,IAAK,CACH,mBAAoBiG,EAAOwD,OAAO,KAClC,0BAA2BxD,EAAOwD,OAAO,OAI7CC,OAAQ,CACN1J,IAAK,CACH,mBAAoBiG,EAAOyD,OAAO,KAClC,0BAA2BzD,EAAOyD,OAAO,OAI7CC,QAAS,CACP3J,IAAK,CACH,mBAAoBiG,EAAO0D,QAAQ,KACnC,0BAA2B1D,EAAO0D,QAAQ,OAI9CC,KAAM,CACJ5J,IAAK,CACH,mBAAoBiG,EAAO2D,KAAK,KAChC,0BAA2B3D,EAAO2D,KAAK,OAI3CC,KAAM,CACJ7J,IAAK,CACH,mBAAoBiG,EAAO4D,KAAK,KAChC,0BAA2B5D,EAAO4D,KAAK,OAK3CC,OAAQ,CACN9J,IAAK,CACH,kBAAmB,8BACnB,sBAAuB,kCACvB,kBAAmB,8BACnB,mBAAoB,+BACpB,kBAAmB,8BACnB,sBAAuB,kCACvB,qBAAsB,iCACtB,gBAAiB,4BACjB,oBAAqB,gCACrB,2BAA4B,uCAC5B,sBAAuB,kCACvB,iBAAkB,6BAClB,yBAA0B,qCAC1B,kBAAmB,8BACnB,sBAAuB,kCACvB,oBAAqB,gCACrB,wBAAyB,oCACzB,wBAAyB,uCAK/B9lD,EAAOC,QAAU,CACf+jD,QAAS,CACP8B,IAAK,CACH,CACE7hD,MAAO,uBACPse,SAAU,OACV9hB,EAAG,CAAC,EACJ,kBAAmB,CACjBwD,MAAO,wBAETW,EAAG,CACDX,MAAO,wBACP4rD,eAAgB,YAChBC,WAAY,OAEdC,OAAQ,CACN9rD,MAAO,uBACP6rD,WAAY,OAEd,WAAY,CACV7rD,MAAO,WAET,oBAAqB,CACnBA,MAAO,WAET,kBAAmB,CACjBA,MAAO,WAETypD,GAAI,CACFsC,cAAe,WAEjB,eAAgB,CACdA,cAAe,eAEjB,eAAgB,CACdA,cAAe,eAEjB,iBAAkB,CAChBA,cAAe,eAEjB,iBAAkB,CAChBA,cAAe,eAEjB,eAAgB,CACdA,cAAe,eAEjB,eAAgB,CACdA,cAAe,eAEjB,iBAAkB,CAChBA,cAAe,eAEjB,iBAAkB,CAChBA,cAAe,eAEjB,eAAgB,CACdA,cAAe,WAEjBrC,GAAI,CACFqC,cAAe,QAEjB,kBAAmB,CACjBF,WAAY,MACZ7rD,MAAO,4BAET,kBAAmB,CACjBA,MAAO,2BAET00B,GAAI,CACF10B,MAAO,2BACP6rD,WAAY,OAEd/B,GAAI,CACFkC,YAAa,qBACbC,eAAgB,GAElBtD,WAAY,CACVkD,WAAY,MACZK,UAAW,SACXlsD,MAAO,yBACPmsD,uBAAwB,UACxBC,uBAAwB,gCACxBC,OAAQ,oCAEV,qCAAsC,CACpC/2C,QAAS,cAEX,mCAAoC,CAClCA,QAAS,eAEXuzC,GAAI,CACF7oD,MAAO,2BACP6rD,WAAY,OAEd,YAAa,CACXA,WAAY,MACZ7rD,MAAO,WAET8oD,GAAI,CACF9oD,MAAO,2BACP6rD,WAAY,OAEd,YAAa,CACXA,WAAY,MACZ7rD,MAAO,WAET+oD,GAAI,CACF/oD,MAAO,2BACP6rD,WAAY,OAEd,YAAa,CACXA,WAAY,MACZ7rD,MAAO,WAETgpD,GAAI,CACFhpD,MAAO,2BACP6rD,WAAY,OAEd,YAAa,CACXA,WAAY,MACZ7rD,MAAO,WAETipD,IAAK,CAAC,EACNC,QAAS,CACPxmC,QAAS,SAEXymC,MAAO,CAAC,EACRC,IAAK,CACHyC,WAAY,MACZS,WAAY,UACZtsD,MAAO,sBACPusD,UACE,oGAEJhD,KAAM,CACJvpD,MAAO,uBACP6rD,WAAY,OAEd,eAAgB,CACdv2C,QAAS,OAEX,cAAe,CACbA,QAAS,OAEX,SAAU,CACRtV,MAAO,WAET,UAAW,CACTA,MAAO,WAET,UAAW,CACTA,MAAO,WAET,UAAW,CACTA,MAAO,WAET,UAAW,CACTA,MAAO,WAET,kBAAmB,CACjBA,MAAO,WAET,gBAAiB,CACfA,MAAO,WAETwpD,IAAK,CACHxpD,MAAO,2BACPwsD,gBAAiB,yBACjBC,UAAW,OACXZ,WAAY,OAEd,WAAY,CACVW,gBAAiB,cACjBE,YAAa,IACbrD,aAAc,IACdsD,QAAS,IACTd,WAAY,UACZ7rD,MAAO,UACPuoD,SAAU,UACV+D,WAAY,UACZ9D,WAAY,WAEd,mBAAoB,CAClBlzC,QAAS,QAEX,kBAAmB,CACjBA,QAAS,QAEXy0C,MAAO,CACLx0C,MAAO,OACPq3C,YAAa,OACbnE,UAAWP,EAAG,GAAI,IAClBQ,aAAcR,EAAG,GAAI,KAEvB2E,MAAO,CACLC,kBAAmB,MACnBC,kBAAmB,8BAErB,WAAY,CACV/sD,MAAO,2BACP6rD,WAAY,MACZmB,cAAe,UAEjB,WAAY,CACVF,kBAAmB,MACnBC,kBAAmB,8BAErB,sBAAuB,CACrBD,kBAAmB,KAErB,WAAY,CACVE,cAAe,YAEjBC,MAAO,CACLhB,eAAgB,MAChBiB,eAAgB,8BAElB,WAAY,CACVF,cAAe,OAEjB,SAAU,CACRG,UAAW,SAEb,aAAc,CAAC,EACflD,WAAY,CACVjqD,MAAO,6BAGXqoD,EAAiBiC,KAAKzI,OACnBwG,EAAiBF,KAAKtG,SAG1BwG,E,2BC7lDL,IAAIhqD,EAAiB,UAErBtC,EAAOC,QAAU,SAAUqnD,EAAQ+J,EAAQhmD,GACzCA,KAAOi8C,GAAUhlD,EAAeglD,EAAQj8C,EAAK,CAC3CgI,cAAc,EACdzQ,IAAK,WAAc,OAAOyuD,EAAOhmD,EAAM,EACvCR,IAAK,SAAU3K,GAAMmxD,EAAOhmD,GAAOnL,CAAI,GAE3C,C,2BCRA,IAAIoxD,EAAqB,EAAQ,MAC7BC,EAAc,EAAQ,MAK1BvxD,EAAOC,QAAUS,OAAO8H,MAAQ,SAAc4T,GAC5C,OAAOk1C,EAAmBl1C,EAAGm1C,EAC/B,C,2BCRA,IAAI9rD,EAAI,EAAQ,MACZtE,EAAO,EAAQ,MACfuxC,EAAU,EAAQ,MAClB8e,EAAe,EAAQ,KACvBzxD,EAAa,EAAQ,MACrB0xD,EAA4B,EAAQ,MACpCvoD,EAAiB,EAAQ,MACzBvI,EAAiB,EAAQ,MACzBq3C,EAAiB,EAAQ,KACzB0Z,EAA8B,EAAQ,MACtC3Z,EAAgB,EAAQ,MACxBqK,EAAkB,EAAQ,MAC1BuF,EAAY,EAAQ,MACpBgK,EAAgB,EAAQ,MAExB1M,EAAuBuM,EAAajc,OACpClC,EAA6Bme,EAAahc,aAC1Coc,EAAoBD,EAAcC,kBAClCC,EAAyBF,EAAcE,uBACvCjK,EAAWxF,EAAgB,YAC3B0P,EAAO,OACPC,EAAS,SACTC,EAAU,UAEVC,EAAa,WAAc,OAAO7wD,IAAM,EAE5CpB,EAAOC,QAAU,SAAUiyD,EAAUzR,EAAM0R,EAAqBnmC,EAAMg4B,EAASoO,EAAQhL,GACrFqK,EAA0BU,EAAqB1R,EAAMz0B,GAErD,IAqBIqmC,EAA0BC,EAASC,EArBnCC,EAAqB,SAAUC,GACjC,GAAIA,IAASzO,GAAW0O,EAAiB,OAAOA,EAChD,IAAKb,GAA0BY,GAAQA,KAAQE,EAAmB,OAAOA,EAAkBF,GAE3F,OAAQA,GACN,KAAKX,EACL,KAAKC,EACL,KAAKC,EAAS,OAAO,WAAqB,OAAO,IAAIG,EAAoB/wD,KAAMqxD,EAAO,EAGxF,OAAO,WAAc,OAAO,IAAIN,EAAoB/wD,KAAO,CAC7D,EAEI2jD,EAAgBtE,EAAO,YACvBmS,GAAwB,EACxBD,EAAoBT,EAAS3wD,UAC7BsxD,EAAiBF,EAAkB/K,IAClC+K,EAAkB,eAClB3O,GAAW2O,EAAkB3O,GAC9B0O,GAAmBb,GAA0BgB,GAAkBL,EAAmBxO,GAClF8O,EAA6B,UAATrS,GAAmBkS,EAAkBloD,SAA4BooD,EA+BzF,GA3BIC,IACFT,EAA2BnpD,EAAe4pD,EAAkB3xD,KAAK,IAAI+wD,OACpCxxD,OAAOa,WAAa8wD,EAAyBrmC,OACvE0mB,GAAWxpC,EAAempD,KAA8BT,IACvDjxD,EACFA,EAAe0xD,EAA0BT,GAC/B7xD,EAAWsyD,EAAyBzK,KAC9C7P,EAAcsa,EAA0BzK,EAAUqK,IAItDja,EAAeqa,EAA0BtN,GAAe,GAAM,GAC1DrS,IAASiV,EAAU5C,GAAiBkN,IAKxChN,GAAwBjB,IAAY+N,GAAUc,GAAkBA,EAAenwD,OAASqvD,KACrFrf,GAAWW,EACdqe,EAA4BiB,EAAmB,OAAQZ,IAEvDa,GAAwB,EACxBF,EAAkB,WAAoB,OAAOvxD,EAAK0xD,EAAgBzxD,KAAO,IAKzE4iD,EAMF,GALAsO,EAAU,CACR9pC,OAAQgqC,EAAmBT,GAC3BvpD,KAAM4pD,EAASM,EAAkBF,EAAmBV,GACpDrnD,QAAS+nD,EAAmBR,IAE1B5K,EAAQ,IAAKmL,KAAOD,GAClBT,GAA0Be,KAA2BL,KAAOI,KAC9D5a,EAAc4a,EAAmBJ,EAAKD,EAAQC,SAE3C9sD,EAAE,CAAEjD,OAAQi+C,EAAM16C,OAAO,EAAMC,OAAQ6rD,GAA0Be,GAAyBN,GASnG,OALM5f,IAAW0U,GAAWuL,EAAkB/K,KAAc8K,GAC1D3a,EAAc4a,EAAmB/K,EAAU8K,EAAiB,CAAEhwD,KAAMshD,IAEtE2D,EAAUlH,GAAQiS,EAEXJ,CACT,C,uBCpGAtyD,EAAOC,QAAU,SAAUsI,GACzB,IACE,MAAO,CAAE6zB,OAAO,EAAO75B,MAAOgG,IAChC,CAAE,MAAO6zB,GACP,MAAO,CAAEA,OAAO,EAAM75B,MAAO65B,EAC/B,CACF,C,yBCiBA,SAAS22B,EAAoBpV,EAAOqV,GAChC,IAAInmD,EAAQ,GACRomD,EAAQ,GACRC,EAAU,EACVC,GAAY,EAChB,IAAI,IAAIrT,EAAM,EAAGA,EAAMnC,EAAMt7C,OAAQy9C,IAAM,CACvC,IAAIsT,EAAOzV,EAAMmC,GACI,IAAjBjzC,EAAMxK,QAAgB+wD,IAASJ,EAAU,IAAOG,GACvB,IAArBH,EAAU3wD,QAAgBs7C,EAAMzvC,MAAM4xC,EAAKA,EAAMkT,EAAU3wD,UAAY2wD,IACvEC,EAAMnnD,KAAK6xC,EAAMzvC,MAAMglD,EAASpT,IAChCoT,EAAUpT,EAAMkT,EAAU3wD,QAGlC8wD,GAAYA,GAA6B,OAATC,EACnB,MAATA,GAAyB,MAATA,GAAyB,MAATA,EAChCvmD,EAAMf,KAAKsnD,IACK,MAATA,GAA4C,MAA5BvmD,EAAMA,EAAMxK,OAAS,IAAuB,MAAT+wD,GAA4C,MAA5BvmD,EAAMA,EAAMxK,OAAS,IAAuB,MAAT+wD,GAA4C,MAA5BvmD,EAAMA,EAAMxK,OAAS,KAClJwK,EAAMhB,KAEd,CAEA,OADAonD,EAAMnnD,KAAK6xC,EAAMzvC,MAAMglD,IAChBD,CACX,CA/BAvyD,OAAO4B,eAAerC,EAAS,aAAc,CACzCsC,OAAO,IAEX7B,OAAO4B,eAAerC,EAAS,sBAAuB,CAClD0C,YAAY,EACZC,IAAK,WACD,OAAOmwD,CACX,G,2BCrBJ,IAYIloD,EAAKjI,EAAKgJ,EAZVynD,EAAkB,EAAQ,MAC1Bxb,EAAa,EAAQ,MACrBvtC,EAAW,EAAQ,IACnBonD,EAA8B,EAAQ,MACtCve,EAAS,EAAQ,MACjBmgB,EAAS,EAAQ,MACjBC,EAAY,EAAQ,MACpBC,EAAa,EAAQ,KAErBC,EAA6B,6BAC7BzxD,EAAY61C,EAAW71C,UACvB4rC,EAAUiK,EAAWjK,QAgBzB,GAAIylB,GAAmBC,EAAOtzC,MAAO,CACnC,IAAI0zC,EAAQJ,EAAOtzC,QAAUszC,EAAOtzC,MAAQ,IAAI4tB,GAEhD8lB,EAAM9wD,IAAM8wD,EAAM9wD,IAClB8wD,EAAM9nD,IAAM8nD,EAAM9nD,IAClB8nD,EAAM7oD,IAAM6oD,EAAM7oD,IAElBA,EAAM,SAAU3K,EAAIyzD,GAClB,GAAID,EAAM9nD,IAAI1L,GAAK,MAAM,IAAI8B,EAAUyxD,GAGvC,OAFAE,EAAS7Y,OAAS56C,EAClBwzD,EAAM7oD,IAAI3K,EAAIyzD,GACPA,CACT,EACA/wD,EAAM,SAAU1C,GACd,OAAOwzD,EAAM9wD,IAAI1C,IAAO,CAAC,CAC3B,EACA0L,EAAM,SAAU1L,GACd,OAAOwzD,EAAM9nD,IAAI1L,EACnB,CACF,KAAO,CACL,IAAI0zD,EAAQL,EAAU,SACtBC,EAAWI,IAAS,EACpB/oD,EAAM,SAAU3K,EAAIyzD,GAClB,GAAIxgB,EAAOjzC,EAAI0zD,GAAQ,MAAM,IAAI5xD,EAAUyxD,GAG3C,OAFAE,EAAS7Y,OAAS56C,EAClBwxD,EAA4BxxD,EAAI0zD,EAAOD,GAChCA,CACT,EACA/wD,EAAM,SAAU1C,GACd,OAAOizC,EAAOjzC,EAAI0zD,GAAS1zD,EAAG0zD,GAAS,CAAC,CAC1C,EACAhoD,EAAM,SAAU1L,GACd,OAAOizC,EAAOjzC,EAAI0zD,EACpB,CACF,CAEA5zD,EAAOC,QAAU,CACf4K,IAAKA,EACLjI,IAAKA,EACLgJ,IAAKA,EACL6nC,QArDY,SAAUvzC,GACtB,OAAO0L,EAAI1L,GAAM0C,EAAI1C,GAAM2K,EAAI3K,EAAI,CAAC,EACtC,EAoDEg5C,UAlDc,SAAU2a,GACxB,OAAO,SAAU3zD,GACf,IAAI8f,EACJ,IAAK1V,EAASpK,KAAQ8f,EAAQpd,EAAI1C,IAAKmB,OAASwyD,EAC9C,MAAM,IAAI7xD,EAAU,0BAA4B6xD,EAAO,aACvD,OAAO7zC,CACX,CACF,E,2BCzBA,IAAIizB,EAAc,EAAQ,MAI1BjzC,EAAOC,QAAUgzC,EAAY,IAAI6gB,Q,2BCJjC,IAAIruD,EAAI,EAAQ,MACZ2tC,EAAc,EAAQ,MACtB2gB,EAAU,EAAQ,MAClBhf,EAAkB,EAAQ,MAC1BiT,EAAiC,EAAQ,MACzCgM,EAAiB,EAAQ,MAI7BvuD,EAAE,CAAEjD,OAAQ,SAAUwwC,MAAM,EAAMqU,MAAOjU,GAAe,CACtD6gB,0BAA2B,SAAmC5pD,GAO5D,IANA,IAKIgB,EAAK6iC,EALL9xB,EAAI24B,EAAgB1qC,GACpBojC,EAA2Bua,EAA+B1xC,EAC1D9N,EAAOurD,EAAQ33C,GACf7R,EAAS,CAAC,EACVG,EAAQ,EAELlC,EAAKnG,OAASqI,QAEA1F,KADnBkpC,EAAaT,EAAyBrxB,EAAG/Q,EAAM7C,EAAKkC,QACtBspD,EAAezpD,EAAQc,EAAK6iC,GAE5D,OAAO3jC,CACT,G,2BCtBF,IAAIk8C,EAAQ,EAAQ,KAIpBzmD,EAAOC,QAAU,SAAUgC,GACzB,IAAIo9C,GAAUp9C,EAEd,OAAOo9C,GAAWA,GAAqB,IAAXA,EAAe,EAAIoH,EAAMpH,EACvD,C,2BCRA,IAAI6U,EAAgB,EAAQ,MAG5Bl0D,EAAOC,QAAUi0D,KAAmBprD,OAAY,OAAOA,OAAOqrD,M,2BCF9Dl0D,EAAQE,YAAa,EACrBF,EAAQm0D,UAAYn0D,EAAQmM,IAAMnM,EAAQiP,OAASjP,EAAQwuC,SAAWxuC,EAAQgH,KAAOhH,EAAQo0D,OAASp0D,EAAQq0D,QAAUr0D,EAAQ2T,GAAK3T,EAAQs0D,QAAUt0D,EAAQu0D,WAAav0D,EAAQ0/B,UAAY1/B,EAAQw0D,eAAiB,EAEzN,IAAIC,EAAatgB,EAAuB,EAAQ,OAE5CugB,EAAavgB,EAAuB,EAAQ,MAE5CwgB,EAAcxgB,EAAuB,EAAQ,OAE7CygB,EAAWzgB,EAAuB,EAAQ,MAE1C0gB,EAAM1gB,EAAuB,EAAQ,OAErC2gB,EAAW3gB,EAAuB,EAAQ,OAE1C4gB,EAAU5gB,EAAuB,EAAQ,OAEzC6B,EAAQ7B,EAAuB,EAAQ,OAEvC6gB,EAAY7gB,EAAuB,EAAQ,OAE3C8gB,EAAU9gB,EAAuB,EAAQ,OAEzC+gB,EAAO/gB,EAAuB,EAAQ,KAEtCghB,EAAahhB,EAAuB,EAAQ,OAEhD,SAASA,EAAuBh0C,GAAO,OAAOA,GAAOA,EAAID,WAAaC,EAAM,CAAE,QAAWA,EAAO,CAMhGH,EAAQw0D,UAJQ,SAAmBxzD,GACjC,OAAO,IAAIyzD,EAAoB,QAAEzzD,EACnC,EAQAhB,EAAQ0/B,UAJQ,SAAmB1+B,GACjC,OAAO,IAAI0zD,EAAoB,QAAE1zD,EACnC,EAQAhB,EAAQu0D,WAJS,SAAoBvzD,GACnC,OAAO,IAAI2zD,EAAqB,QAAE3zD,EACpC,EAQAhB,EAAQs0D,QAJM,SAAiBtzD,GAC7B,OAAO,IAAI4zD,EAAkB,QAAE5zD,EACjC,EAQAhB,EAAQ2T,GAJC,SAAY3S,GACnB,OAAO,IAAI6zD,EAAa,QAAE7zD,EAC5B,EAQAhB,EAAQq0D,QAJM,SAAiBrzD,GAC7B,OAAO,IAAI8zD,EAAkB,QAAE9zD,EACjC,EAQAhB,EAAQo0D,OAJK,SAAgBpzD,GAC3B,OAAO,IAAI+zD,EAAiB,QAAE/zD,EAChC,EAQAhB,EAAQgH,KAJG,SAAchG,GACvB,OAAO,IAAIg1C,EAAe,QAAEh1C,EAC9B,EAQAhB,EAAQwuC,SAJO,SAAkBxtC,GAC/B,OAAO,IAAIg0D,EAAmB,QAAEh0D,EAClC,EAQAhB,EAAQiP,OAJK,SAAgBjO,GAC3B,OAAO,IAAIi0D,EAAiB,QAAEj0D,EAChC,EAQAhB,EAAQmM,IAJE,SAAanL,GACrB,OAAO,IAAIk0D,EAAc,QAAEl0D,EAC7B,EAQAhB,EAAQm0D,UAJQ,SAAmBnzD,GACjC,OAAO,IAAIm0D,EAAoB,QAAEn0D,EACnC,C,2BClGA,IAgBMitC,EAhBFzoC,EAAI,EAAQ,MACZwtC,EAAc,EAAQ,MACtBxF,EAA2B,UAC3BiT,EAAW,EAAQ,MACnBr8C,EAAW,EAAQ,KACnBgxD,EAAa,EAAQ,MACrBzU,EAAyB,EAAQ,MACjC0U,EAAuB,EAAQ,MAC/B5iB,EAAU,EAAQ,MAElBkB,EAAcX,EAAY,GAAG/kC,OAC7B+P,EAAMpU,KAAKoU,IAEXs3C,EAA0BD,EAAqB,cASnD7vD,EAAE,CAAEjD,OAAQ,SAAUuD,OAAO,EAAMC,UAPX0sC,IAAY6iB,IAC9BrnB,EAAaT,EAAyBh9B,OAAOlP,UAAW,cACrD2sC,IAAeA,EAAW56B,WAK8BiiD,IAA2B,CAC1FnwD,WAAY,SAAoBowD,GAC9B,IAAIha,EAAOn3C,EAASu8C,EAAuBx/C,OAC3Ci0D,EAAWG,GACX,IAAI9qD,EAAQg2C,EAASziC,EAAI7b,UAAUC,OAAS,EAAID,UAAU,QAAK4C,EAAWw2C,EAAKn5C,SAC3E66B,EAAS74B,EAASmxD,GACtB,OAAO5hB,EAAY4H,EAAM9wC,EAAOA,EAAQwyB,EAAO76B,UAAY66B,CAC7D,G,2BC5BF,EAAQ,K,yBCARj9B,EAAQE,YAAa,EACrBF,EAAiB,QAEjB,SAAiBG,GACf,IAAK,IAAIq1D,EAAOrzD,UAAUC,OAAQ4K,EAAQ,IAAInH,MAAM2vD,EAAO,EAAIA,EAAO,EAAI,GAAIC,EAAO,EAAGA,EAAOD,EAAMC,IACnGzoD,EAAMyoD,EAAO,GAAKtzD,UAAUszD,GAG9B,KAAOzoD,EAAM5K,OAAS,GAAG,CACvB,IAAI2mD,EAAO/7C,EAAM0oD,QAEjB,IAAKv1D,EAAI4oD,GACP,OAGF5oD,EAAMA,EAAI4oD,EACZ,CAEA,OAAO5oD,CACT,EAEAJ,EAAOC,QAAUA,EAAQyB,O,2BCtBzB,IAEImlD,EAFkB,EAAQ,KAElBzE,CAAgB,SAE5BpiD,EAAOC,QAAU,SAAUsiD,GACzB,IAAIqT,EAAS,IACb,IACE,MAAMrT,GAAaqT,EACrB,CAAE,MAAOC,GACP,IAEE,OADAD,EAAO/O,IAAS,EACT,MAAMtE,GAAaqT,EAC5B,CAAE,MAAOE,GAAsB,CACjC,CAAE,OAAO,CACX,C,2BCdA,IAAIC,EAA0B,EAAQ,MAItC/1D,EAAOC,QAAU,SAAU+1D,EAAe3zD,GACxC,OAAO,IAAK0zD,EAAwBC,GAA7B,CAAwD,IAAX3zD,EAAe,EAAIA,EACzE,C,2BCNA,IAAIoD,EAAI,EAAQ,MACZizC,EAA6B,EAAQ,MAKzCjzC,EAAE,CAAEjD,OAAQ,UAAWwwC,MAAM,EAAMhtC,OAJF,oBAIwC,CACvEqwC,OAAQ,SAAgB5xC,GACtB,IAAIwxD,EAAavd,EAA2BpiC,EAAElV,MAG9C,OADA80D,EADuBD,EAAW5f,QACjB5xC,GACVwxD,EAAW3b,OACpB,G,cCbF,QAsBInoC,YATe,0BAAf,EASQ,WACZ,aAKA,SAASgkD,EAAc5zD,GACrB,IAAI0mD,EAAMv3C,WAAYnP,GAGtB,OADqC,GAAvBA,EAAM+P,QAAQ,OAAewE,MAAOmyC,IAChCA,CACpB,CAIA,IAAImN,EAA6B,oBAAXtyC,QAFtB,WAAiB,EAGf,SAAUuyC,GACRvyC,QAAQsY,MAAOi6B,EACjB,EAIEC,EAAe,CACjB,cACA,eACA,aACA,gBACA,aACA,cACA,YACA,eACA,kBACA,mBACA,iBACA,qBAGEC,EAAqBD,EAAaj0D,OAwBtC,SAASm0D,EAAUjN,GACjB,IAAIhkC,EAAQnT,iBAAkBm3C,GAM9B,OALMhkC,GACJ6wC,EAAU,kBAAoB7wC,EAApB,6FAILA,CACT,CAIA,IAEIkxC,EAFAC,GAAU,EAyCd,SAASC,EAASpN,GAShB,GAzCF,WAEE,IAAKmN,EAAL,CAGAA,GAAU,EAQV,IAAIxN,EAAM12C,SAASM,cAAc,OACjCo2C,EAAI3jC,MAAM/L,MAAQ,QAClB0vC,EAAI3jC,MAAMqrC,QAAU,kBACpB1H,EAAI3jC,MAAMqxC,YAAc,QACxB1N,EAAI3jC,MAAMorC,YAAc,kBACxBzH,EAAI3jC,MAAMgL,UAAY,aAEtB,IAAI9d,EAAOD,SAASC,MAAQD,SAAS6V,gBACrC5V,EAAKO,YAAak2C,GAClB,IAAI3jC,EAAQixC,EAAUtN,GAEtBuN,EAA8D,KAA7C5sD,KAAK8H,MAAOwkD,EAAc5wC,EAAM/L,QACjDm9C,EAAQF,eAAiBA,EAEzBhkD,EAAK+d,YAAa04B,EAvBlB,CAwBF,CAKE2N,GAGoB,iBAARtN,IACVA,EAAO/2C,SAASsN,cAAeypC,IAI3BA,GAAuB,iBAARA,GAAqBA,EAAKniD,SAA/C,CAIA,IAAIme,EAAQixC,EAAUjN,GAGtB,GAAsB,QAAjBhkC,EAAMoB,QACT,OA5FJ,WASE,IARA,IAAIxb,EAAO,CACTqO,MAAO,EACPC,OAAQ,EACRoF,WAAY,EACZC,YAAa,EACbg4C,WAAY,EACZC,YAAa,GAEL7kD,EAAE,EAAGA,EAAIqkD,EAAoBrkD,IAErC/G,EADkBmrD,EAAapkD,IACT,EAExB,OAAO/G,CACT,CA8EW6rD,GAGT,IAAI7rD,EAAO,CAAC,EACZA,EAAKqO,MAAQ+vC,EAAKxjC,YAClB5a,EAAKsO,OAAS8vC,EAAKrjC,aAKnB,IAHA,IAAI+wC,EAAc9rD,EAAK8rD,YAAiC,cAAnB1xC,EAAMgL,UAGjCre,EAAE,EAAGA,EAAIqkD,EAAoBrkD,IAAM,CAC3C,IAAIglD,EAAcZ,EAAapkD,GAC3B3P,EAAQgjB,EAAO2xC,GACfjO,EAAMv3C,WAAYnP,GAEtB4I,EAAM+rD,GAAiBpgD,MAAOmyC,GAAc,EAANA,CACxC,CAEA,IAAIkO,EAAehsD,EAAKua,YAAcva,EAAKwa,aACvCyxC,EAAgBjsD,EAAKqa,WAAara,EAAKsa,cACvC4xC,EAAclsD,EAAKmsD,WAAansD,EAAKs/B,YACrC8sB,EAAepsD,EAAKuhD,UAAYvhD,EAAKwhD,aACrCgE,EAAcxlD,EAAKqsD,gBAAkBrsD,EAAKssD,iBAC1CC,EAAevsD,EAAK+kD,eAAiB/kD,EAAK4lD,kBAE1C4G,EAAuBV,GAAeR,EAGtCmB,EAAazB,EAAc5wC,EAAM/L,QACjB,IAAfo+C,IACHzsD,EAAKqO,MAAQo+C,GAETD,EAAuB,EAAIR,EAAexG,IAGhD,IAAIkH,EAAc1B,EAAc5wC,EAAM9L,QAatC,OAZqB,IAAhBo+C,IACH1sD,EAAKsO,OAASo+C,GAEVF,EAAuB,EAAIP,EAAgBM,IAGjDvsD,EAAK0T,WAAa1T,EAAKqO,OAAU29C,EAAexG,GAChDxlD,EAAK2T,YAAc3T,EAAKsO,QAAW29C,EAAgBM,GAEnDvsD,EAAK2rD,WAAa3rD,EAAKqO,MAAQ69C,EAC/BlsD,EAAK4rD,YAAc5rD,EAAKsO,OAAS89C,EAE1BpsD,CAtDP,CAuDF,CAEA,OAAOwrD,CAEP,GAjMmB,iC,UCbnB32D,EAAOC,QAAU,CACfsZ,QAAS,GACTu+C,QAAS,GACTC,SAAU,QACVlZ,MAAO,CACLmZ,YAAa,EAAGnZ,YAAY,IACvBA,EAAM,UACToZ,KAAM,SAERC,UAAW,CACTC,KAAM,OACNC,KAAM,0BACNC,KAAM,8CACNC,MAAO,iDACPt9C,OAAQ,sBAEVu9C,KAAM,CACJC,KAAM,cACNC,QAAS,iBACTC,SAAU,kBACVC,SAAU,kBACVrzB,OAAQ,gBACRszB,QAAS,iBACTC,SAAU,kBACVC,SAAU,kBACVC,SAAU,mBAEZv4B,YAAa,CACXy3B,KAAM,OACNe,OAAQ,QACR5L,MAAO,UAET6L,aAAc,EAAGpa,WAAYA,EAAM,QACnCqa,mBAAoB,EAAGra,WAAYA,EAAM,cACzCsa,iBAAkB,EAAGta,WAAYA,EAAM,YACvCua,kBAAmB,EAAGva,WAAYA,EAAM,aACxCwa,kBAAmB,EAAGxa,WAAYA,EAAM,aACxCya,eAAgB,EAAGza,WAAYA,EAAM,UACrC0a,gBAAiB,EAAG1a,WAAYA,EAAM,WACtC2a,iBAAkB,EAAG3a,WAAYA,EAAM,YACvC4a,cAAe,EAAG5a,WAAYA,EAAM,SACpC4R,gBAAiB,EAAG5R,WAAYA,EAAM,UACtCjtB,gBAAiB,CACfumC,KAAM,OACN,gBAAiB,oDACjB,iBAAkB,0DAClB,gBAAiB,sDACjB,iBAAkB,6DAClB,gBAAiB,uDACjB,iBAAkB,4DAClB,gBAAiB,qDACjB,iBAAkB,0DAEpBuB,kBAAmB,EAAG7a,WAAYA,EAAM,WACxC8a,mBAAoB,CAClB16C,OAAQ,SACRmU,OAAQ,SACRlU,KAAM,OACN,cAAe,cACf,WAAY,WACZF,MAAO,QACP,eAAgB,eAChB,YAAa,YACbD,IAAK,OAEP2gC,eAAgB,CACduY,KAAM,OACN2B,MAAO,QACPC,QAAS,WAEXxuB,KAAM,CACJ,EAAG,IACH8sB,KAAM,GACN5L,GAAI,MACJvI,QAAS,MACT8V,GAAI,OACJ3L,GAAI,OACJC,GAAI,OACJ,MAAO,OACP,MAAO,QAET6B,YAAa,EAAGpR,YAAY,IACvBA,EAAM,UACTmF,QAASnF,EAAM,kBAAmB,kBAEpCkb,cAAe,EAAGlb,WAAYA,EAAM,WACpCyO,aAAc,CACZ6K,KAAM,MACN5L,GAAI,WACJvI,QAAS,UACT8V,GAAI,WACJ3L,GAAI,SACJC,GAAI,UACJ,MAAO,OACP,MAAO,SACP4L,KAAM,UAERC,cAAe,EAAGpb,YAAY,IACzBA,EAAM,aAEX8R,YAAa,CACX3M,QAAS,MACT,EAAG,MACH,EAAG,MACH,EAAG,MACH,EAAG,OAELwM,UAAW,CACTjE,GAAI,gCACJvI,QAAS,gEACT8V,GAAI,mEACJ3L,GAAI,qEACJC,GAAI,sEACJ,MAAO,sCACP8L,MAAO,sCACP/B,KAAM,QAERgC,eAAgB,EAAGtb,WAAYA,EAAM,UACrCub,WAAY,CACV,EAAG,IACH,GAAI,KACJ,GAAI,MACJ,GAAI,KACJ,GAAI,MACJ,IAAK,IACL,IAAK,OACL,IAAK,MACL,IAAK,OACL,IAAK,MACL,IAAK,KAEPC,WAAY,EAAGxb,WAAYA,EAAM,UACjCkN,OAAQ,EAAGA,aAAa,CACtBuO,QAASvO,EAAOuO,QAChB98C,QAASuuC,EAAOvuC,QAChB+8C,YAAaxO,EAAOwO,YACpBC,MAAOzO,EAAOyO,MACdlM,MAAOvC,EAAOuC,MACdD,MAAOtC,EAAOsC,MACdE,KAAMxC,EAAOwC,KACbC,KAAMzC,EAAOyC,KACbC,QAAS1C,EAAO0C,QAChBC,MAAO3C,EAAO2C,MACdC,IAAK5C,EAAO4C,IACZC,OAAQ7C,EAAO6C,OACfC,MAAO9C,EAAO8C,MACdC,OAAQ/C,EAAO+C,OACfC,KAAMhD,EAAOgD,KACbC,MAAOjD,EAAOiD,MACdC,QAASlD,EAAOkD,QAChBC,KAAMnD,EAAOmD,KACbC,KAAMpD,EAAOoD,KACbC,IAAKrD,EAAOqD,IACZC,KAAMtD,EAAOsD,KACbC,OAAQvD,EAAOuD,OACfC,OAAQxD,EAAOwD,OACfC,OAAQzD,EAAOyD,OACfC,QAAS1D,EAAO0D,QAChBC,KAAM3D,EAAO2D,KACbC,KAAM5D,EAAO4D,OAEf8K,QAAS,CACPxC,KAAM,OACN,EAAG,IACH,EAAG,IACH,EAAG,IACH,EAAG,IACH,EAAG,IACH,EAAG,IACH,EAAG,IACH,EAAG,IACH,EAAG,IACH,GAAI,KACJ,GAAI,KACJ,GAAI,KACJ,MAAO,QACP,MAAO,QACPyC,GAAI,QACJnO,GAAI,QACJuN,GAAI,QACJ3L,GAAI,QACJC,GAAI,QACJ,MAAO,QACP,MAAO,QACP,MAAO,QACP,MAAO,QACP,MAAO,QACP,MAAO,SAEThvC,UAAW,CAAC,EACZ7F,QAAS,CACP4+C,KAAM,QAERwC,SAAU,CACR,EAAG,IACH,GAAI,KACJ,GAAI,MACJ,IAAK,IACL,IAAK,OACL,IAAK,MACL,IAAK,KAEPC,OAAQ,CACN3C,KAAM,OACNv2D,QAAS,UACTm5D,QAAS,UACTC,KAAM,OACNC,KAAM,OACN7mD,KAAM,OACN8mD,KAAM,OACN,cAAe,cACf7C,KAAM,OACN,eAAgB,eAChB8C,SAAU,WACVC,KAAM,OACNC,UAAW,YACX,gBAAiB,gBACjBC,MAAO,QACPC,KAAM,OACN,UAAW,UACXC,KAAM,OACNC,SAAU,WACV,aAAc,aACd,aAAc,aACd,aAAc,aACd,WAAY,WACZ,WAAY,WACZ,WAAY,WACZ,WAAY,WACZ,YAAa,YACb,YAAa,YACb,YAAa,YACb,YAAa,YACb,YAAa,YACb,YAAa,YACb,cAAe,cACf,cAAe,cACf,UAAW,UACX,WAAY,YAEdC,YAAa,EAAG3c,WAAYA,EAAM,eAClC4c,cAAe,EAAG5c,WAAYA,EAAM,iBACpC6c,YAAa,EAAG7c,WAAYA,EAAM,eAClC8c,WAAY,CACVpP,GAAI,8BACJvI,QAAS,CAAC,6BAA8B,+BACxC8V,GAAI,CAAC,8BAA+B,+BACpC3L,GAAI,CAAC,+BAAgC,8BACrCC,GAAI,CAAC,gCAAiC,+BACtC,MAAO,gCACP+J,KAAM,aAER9kC,KAAM,EAAGwrB,YAAY,CACnBsZ,KAAM,UACHtZ,EAAM,YAEX/e,KAAM,CACJ,EAAG,SACHm4B,KAAM,WACN2D,QAAS,WACTzD,KAAM,QAER0D,UAAW,EAAGhd,YAAY,CACxBoZ,KAAM,UACHpZ,EAAM,WACT,MAAO,MACP,MAAO,aACP,MAAO,aACP,MAAO,MACP,MAAO,MACP,MAAO,MACP,MAAO,MACP,MAAO,MACP,MAAO,MACP,MAAO,MACP,MAAO,aACP,MAAO,aACP,MAAO,MACP,MAAO,aACP,MAAO,aACP,OAAQ,YACR,OAAQ,aACR,OAAQ,MACR,OAAQ,aACR,OAAQ,aACR,OAAQ,MACR,OAAQ,aACR,OAAQ,aACR,OAAQ,MACR,QAAS,aACT,QAAS,aACTmb,KAAM,SAER8B,SAAU,CACR,EAAG,IACH9X,QAAS,KAEX+X,WAAY,CACV,EAAG,IACH/X,QAAS,KAEXuM,WAAY,CACVyL,KAAM,CACJ,gBACA,YACA,aACA,sBACA,mBACA,oBACA,sBAEFC,MAAO,CAAC,WAAY,UAAW,UAAW,oBAAqB,QAAS,SACxEC,KAAM,CACJ,eACA,iBACA,QACA,SACA,WACA,oBACA,gBACA,cAGJ1P,SAAU,CACRkO,GAAI,CAAC,UAAW,CAAEjO,WAAY,SAC9BF,GAAI,CAAC,WAAY,CAAEE,WAAY,YAC/BL,KAAM,CAAC,OAAQ,CAAEK,WAAY,WAC7B0B,GAAI,CAAC,WAAY,CAAE1B,WAAY,YAC/B2B,GAAI,CAAC,UAAW,CAAE3B,WAAY,YAC9B,MAAO,CAAC,SAAU,CAAEA,WAAY,SAChC,MAAO,CAAC,WAAY,CAAEA,WAAY,YAClC,MAAO,CAAC,UAAW,CAAEA,WAAY,WACjC,MAAO,CAAC,OAAQ,CAAEA,WAAY,MAC9B,MAAO,CAAC,UAAW,CAAEA,WAAY,MACjC,MAAO,CAAC,SAAU,CAAEA,WAAY,MAChC,MAAO,CAAC,OAAQ,CAAEA,WAAY,MAC9B,MAAO,CAAC,OAAQ,CAAEA,WAAY,OAEhCqD,WAAY,CACVqM,KAAM,MACNC,WAAY,MACZC,MAAO,MACPC,OAAQ,MACRC,OAAQ,MACRC,SAAU,MACVC,KAAM,MACNC,UAAW,MACXlC,MAAO,OAET5wC,IAAK,EAAGi1B,WAAYA,EAAM,WAC1B8d,mBAAoB,EAAG9d,WAAYA,EAAM,UACzC+d,2BAA4B,CAC1B,KAAM,KACN,KAAM,KACN,MAAO,MACP,MAAO,MACP,MAAO,MACP,MAAO,MACP,MAAO,MACP,MAAO,MACP,MAAO,MACP,MAAO,MACP,MAAO,MACP,MAAO,MACP,MAAO,MACP,MAAO,MACP,MAAO,MACP,MAAO,MACP,MAAO,MACP,MAAO,MACP,MAAO,MACP,MAAO,MACP,OAAQ,QAEVC,UAAW,CACT,EAAG,IACH7Y,QAAS,QAEX8Y,gBAAiB,CACf7E,KAAM,OACNh6C,IAAK,cACLnU,IAAK,cACLizD,GAAI,kBAENC,aAAc,CACZ/E,KAAM,OACNh6C,IAAK,cACLnU,IAAK,cACLizD,GAAI,kBAENE,WAAY,CACVhF,KAAM,OACN,SAAU,kBACV,SAAU,kBACV,SAAU,kBACV,SAAU,kBACV,SAAU,kBACV,SAAU,kBACV,SAAU,kBACV,SAAU,kBACV,SAAU,kBACV,UAAW,oBACX,UAAW,oBACX,UAAW,oBACX,YAAa,UAEfiF,cAAe,CACbjF,KAAM,OACN,EAAG,IACH,EAAG,IACH,EAAG,IACH,EAAG,IACH,EAAG,IACH,EAAG,IACH,EAAG,IACH,EAAG,IACH,EAAG,IACH,GAAI,KACJ,GAAI,KACJ,GAAI,KACJ,GAAI,MAENkF,gBAAiB,CACflF,KAAM,OACN,EAAG,IACH,EAAG,IACH,EAAG,IACH,EAAG,IACH,EAAG,IACH,EAAG,IACH,EAAG,IACH,EAAG,IACH,EAAG,IACH,GAAI,KACJ,GAAI,KACJ,GAAI,KACJ,GAAI,MAENmF,QAAS,CACPnF,KAAM,OACN,SAAU,kBACV,SAAU,kBACV,SAAU,kBACV,SAAU,kBACV,SAAU,kBACV,SAAU,kBACV,SAAU,kBACV,SAAU,kBACV,SAAU,kBACV,UAAW,oBACX,UAAW,oBACX,UAAW,oBACX,YAAa,UAEfoF,WAAY,CACVpF,KAAM,OACN,EAAG,IACH,EAAG,IACH,EAAG,IACH,EAAG,IACH,EAAG,IACH,EAAG,IACH,EAAG,IACH,EAAG,IACH,EAAG,IACH,GAAI,KACJ,GAAI,KACJ,GAAI,KACJ,GAAI,MAENqF,aAAc,CACZrF,KAAM,OACN,EAAG,IACH,EAAG,IACH,EAAG,IACH,EAAG,IACH,EAAG,IACH,EAAG,IACH,EAAG,IACH,EAAG,IACH,EAAG,IACH,GAAI,KACJ,GAAI,KACJ,GAAI,KACJ,GAAI,MAENsF,oBAAqB,CACnBpF,KAAM,OACNqF,QAAS,UACT,EAAG,4BACH,EAAG,4BACH,EAAG,4BACH,EAAG,4BACH,EAAG,4BACH,EAAG,4BACH,EAAG,4BACH,EAAG,4BACH,EAAG,4BACH,GAAI,6BACJ,GAAI,6BACJ,GAAI,8BAENC,iBAAkB,CAChBtF,KAAM,OACNqF,QAAS,UACT,EAAG,4BACH,EAAG,4BACH,EAAG,4BACH,EAAG,4BACH,EAAG,4BACH,EAAG,4BACH,EAAG,4BACH,EAAG,4BACH,EAAG,4BACH,GAAI,6BACJ,GAAI,6BACJ,GAAI,8BAEN/jD,OAAQ,EAAGolC,YAAY,CACrBoZ,KAAM,UACHpZ,EAAM,WACT,MAAO,MACP,MAAO,aACP,MAAO,aACP,MAAO,MACP,MAAO,MACP,MAAO,MACP,MAAO,MACP,MAAO,MACP,MAAO,MACP,MAAO,MACP,MAAO,aACP,MAAO,aACP,MAAO,MACP,MAAO,aACP,MAAO,aACPmb,KAAM,OACN0D,OAAQ,QACRC,IAAK,SACLC,IAAK,SACLC,IAAK,SACL5/C,IAAK,cACLnU,IAAK,cACLg0D,IAAK,gBAEPC,UAAW,CACT,EAAG,OACH,GAAI,QACJ,GAAI,QACJ,GAAI,QACJ,GAAI,QACJ,IAAK,UAEPC,MAAO,EAAGnf,YAAY,CACpBoZ,KAAM,UACHpZ,EAAM,WACT,MAAO,MACP,MAAO,aACP,MAAO,aACP,MAAO,MACP,MAAO,MACP,MAAO,MACPmb,KAAM,SAERpK,OAAQ,CACN,EAAG,IACH5L,QAAS,QAEXia,UAAW,CACT7F,KAAM,CACJ8F,GAAI,CACFr3D,UAAW,mBAGfwxD,KAAM,CACJ,YAAa,CACXxxD,UAAW,WACX+zB,QAAS,MAGb09B,MAAO,CACL,MAAO,CACL19B,QAAS,OAGb5f,OAAQ,CACN,WAAY,CACVnU,UAAW,mBACXs3D,wBAAyB,2BAE3B,MAAO,CACLt3D,UAAW,OACXs3D,wBAAyB,6BAI/BC,cAAe,CACbC,QAAS,UACTC,MAAO,WACPhC,OAAQ,MACRiC,KAAM,UACNC,MAAO,SACPC,OAAQ,SAEVhS,WAAY,CACV0L,KAAM,IACNmG,MAAO,OACPI,KAAM,QACNpC,OAAQ,MACRqC,QAAS,QACT/6D,MAAO,IACP,EAAG,SACH,EAAG,OACH,EAAG,UACH,EAAG,SACH,EAAG,UACH,EAAG,OACH,EAAG,UACH,GAAI,UAENosD,cAAe,CACbmI,KAAM,OACNyG,KAAM,OACNC,QAAS,WAEXC,eAAgB,CACd3G,KAAM,QAER4G,OAAQ,EAAGlgB,YAAY,CACrBoZ,KAAM,UACHpZ,EAAM,aAEXmgB,UAAW,CACT,EAAG,IACH,EAAG,IACH,EAAG,IACH,EAAG,IACH,EAAG,IACH,EAAG,KAELx8C,UAAW,EAAGq8B,YAAY,IACrBA,EAAM,WACTsZ,KAAM,OACN6B,KAAM,OACN0D,OAAQ,QACRC,IAAK,SACLC,IAAK,SACLC,IAAK,SACL5/C,IAAK,cACLnU,IAAK,cACLg0D,IAAK,gBAEPv7C,SAAU,EAAGs8B,QAAOhwB,kBAAkB,IACjCgwB,EAAM,WACTsZ,KAAM,OACNuC,GAAI,QACJnO,GAAI,QACJuN,GAAI,QACJ3L,GAAI,QACJC,GAAI,QACJ,MAAO,QACP,MAAO,QACP,MAAO,QACP,MAAO,QACP,MAAO,QACP,MAAO,QACP4L,KAAM,OACN/7C,IAAK,cACLnU,IAAK,cACLg0D,IAAK,cACLmB,MAAO,UACJpwC,EAAYgwB,EAAM,cAEvBqgB,UAAW,EAAGrgB,YAAY,IACrBA,EAAM,WACTmb,KAAM,OACN0D,OAAQ,QACRC,IAAK,SACLC,IAAK,SACLC,IAAK,SACL5/C,IAAK,cACLnU,IAAK,cACLg0D,IAAK,gBAEPqB,SAAU,EAAGtgB,YAAY,IACpBA,EAAM,WACTmb,KAAM,OACN/7C,IAAK,cACLnU,IAAK,cACLg0D,IAAK,gBAEPsB,eAAgB,CACdngD,OAAQ,SACRmU,OAAQ,SACRlU,KAAM,OACN,cAAe,cACf,WAAY,WACZF,MAAO,QACP,eAAgB,eAChB,YAAa,YACbD,IAAK,OAEP6b,QAAS,CACP,EAAG,IACH,EAAG,OACH,GAAI,MACJ,GAAI,OACJ,GAAI,MACJ,GAAI,OACJ,GAAI,MACJ,GAAI,OACJ,GAAI,MACJ,GAAI,OACJ,GAAI,MACJ,GAAI,OACJ,GAAI,MACJ,GAAI,OACJ,GAAI,MACJ,GAAI,OACJ,GAAI,MACJ,GAAI,OACJ,GAAI,MACJ,GAAI,OACJ,IAAK,KAEPykC,MAAO,CACLC,MAAO,QACPjvB,KAAM,OACN8nB,KAAM,IACN,EAAG,IACH,EAAG,IACH,EAAG,IACH,EAAG,IACH,EAAG,IACH,EAAG,IACH,EAAG,IACH,EAAG,IACH,EAAG,IACH,GAAI,KACJ,GAAI,KACJ,GAAI,MAENoH,aAAc,EAAG1gB,WAAYA,EAAM,UACnC2gB,cAAe,CACb,EAAG,MACH,EAAG,MACH,EAAG,MACH,EAAG,MACH,EAAG,OAELC,aAAc,CACZ,EAAG,MACH,EAAG,MACH,EAAG,MACH,EAAG,MACH,EAAG,OAEL7O,QAAS,EAAG/R,WAAYA,EAAM,WAC9B6gB,iBAAkB,EAAG7gB,WAAYA,EAAM,UACvC8gB,mBAAoB,EAAG9gB,WAAYA,EAAM,WACzC+gB,UAAW,EAAG/gB,YAAY,CACxBmF,QAASnF,EAAM,kBAAmB,cAC/BA,EAAM,YAEXghB,gBAAiB,EAAGhhB,WAAYA,EAAM,UACtCihB,gBAAiB,CACf,EAAG,MACH,EAAG,MACH,EAAG,MACH,EAAG,MACH,EAAG,OAELC,YAAa,EAAGlhB,YAAY,CAC1BmF,QAAS,SACNnF,EAAM,aAEXmhB,UAAW,CACThc,QAAS,MACT,EAAG,MACH,EAAG,MACH,EAAG,MACH,EAAG,MACH,EAAG,OAEL58B,OAAQ,CACN,EAAG,OACH,EAAG,OACH,EAAG,OACH,EAAG,OACH,EAAG,OACH,GAAI,QACJ,GAAI,QACJ,GAAI,QACJ,IAAK,UAEP64C,SAAU,CACR,EAAG,IACH,GAAI,KACJ,IAAK,IACL,IAAK,MACL,IAAK,KAEPtiD,MAAO,CACL,EAAG,IACH,GAAI,KACJ,GAAI,MACJ,GAAI,KACJ,GAAI,MACJ,IAAK,IACL,IAAK,OACL,IAAK,MACL,IAAK,OACL,IAAK,OAEPuiD,QAAS,CACP3T,GAAI,QACJuN,GAAI,QACJ3L,GAAI,SACJC,GAAI,SACJ,MAAO,UAET+R,aAAc,EAAGthB,YAAY,IACxBA,EAAM,aAEXuhB,cAAe,EAAGvhB,WAAYA,EAAM,WACpCwhB,MAAO,CACL,EAAG,IACHrc,QAAS,QAEXsc,KAAM,CACJ,EAAG,OACH,EAAG,OACH,EAAG,OACH,EAAG,OACH,EAAG,OACH,GAAI,SAENC,MAAO,EAAG1hB,YAAY,IACjBA,EAAM,aAEX2hB,QAAS,CACPtU,GAAI,MACJ,EAAG,MACH,GAAK,WACL,EAAG,UACH,IAAK,WACL,EAAG,SACH,IAAK,WACL,EAAG,UACH,IAAK,WACL,EAAG,OACH,EAAG,UACH,EAAG,SACH,EAAG,UACH,EAAG,OACH,EAAG,UACH,GAAI,SACJ,GAAI,UACJ,GAAI,OACJ,GAAI,SACJ,GAAI,OACJ,GAAI,OACJ,GAAI,OACJ,GAAI,OACJ,GAAI,OACJ,GAAI,OACJ,GAAI,QACJ,GAAI,QACJ,GAAI,QACJ,GAAI,QACJ,GAAI,QACJ,GAAI,QACJ,GAAI,QACJ,GAAI,QACJ,GAAI,QACJ,GAAI,SAENuU,OAAQ,EAAG5hB,YAAY,CACrBsZ,KAAM,UACHtZ,EAAM,YAEX6hB,YAAa,CACX,EAAG,IACH,EAAG,IACH,EAAG,KAELC,SAAU,CAAC,EACX11D,KAAM,CAAC,EACP21D,UAAW,EAAG/hB,WAAYA,EAAM,UAChCgiB,oBAAqB,EAAGhiB,WAAYA,EAAM,UAC1CiiB,wBAAyB,CACvB7I,KAAM,OACN,YAAa,YACb,EAAG,MACH,EAAG,MACH,EAAG,MACH,EAAG,MACH,EAAG,OAEL8I,WAAY,EAAGliB,YAAY,IACtBA,EAAM,aAEXmiB,YAAa,EAAGniB,WAAYA,EAAM,WAClCoiB,oBAAqB,CACnBhJ,KAAM,OACN,EAAG,MACH,EAAG,MACH,EAAG,MACH,EAAG,MACH,EAAG,OAELiJ,gBAAiB,CACf9tC,OAAQ,SACRrU,IAAK,MACL,YAAa,YACbC,MAAO,QACP,eAAgB,eAChBC,OAAQ,SACR,cAAe,cACfC,KAAM,OACN,WAAY,YAEdiiD,gBAAiB,CACf,EAAG,KACH,GAAI,OACJ,IAAK,QACL,IAAK,QACL,IAAK,QACL,IAAK,QACL,IAAK,QACL,IAAK,QACL,IAAM,UAER1+B,mBAAoB,CAClBuhB,QAAS,QACT,EAAG,KACH,GAAI,OACJ,IAAK,QACL,IAAK,QACL,IAAK,QACL,IAAK,QACL,IAAK,QACL,IAAK,QACL,IAAM,UAERod,mBAAoB,CAClBjJ,KAAM,OACN11D,IAAK,MACLuhD,QACE,sIACF+H,OAAQ,6EACRnxB,QAAS,UACT6kB,OAAQ,aACR54C,UAAW,aAEbw6D,yBAA0B,CACxBrd,QAAS,+BACTsd,OAAQ,SACRC,GAAI,6BACJC,IAAK,6BACL,SAAU,gCAEZt6C,UAAW,EAAG23B,YAAY,IACrBA,EAAM,WACT,MAAO,MACP,MAAO,aACP,MAAO,aACP,MAAO,MACP,MAAO,MACP,MAAO,MACPmb,KAAM,SAER7uD,KAAM,EAAG0zC,YAAY,CACnBoZ,KAAM,UACHpZ,EAAM,WACT,MAAO,MACP,MAAO,aACP,MAAO,aACP,MAAO,MACP,MAAO,MACP,MAAO,MACP,MAAO,MACP,MAAO,MACP,MAAO,MACP,MAAO,MACP,MAAO,aACP,MAAO,aACP,MAAO,MACP,MAAO,aACP,MAAO,aACP,OAAQ,YACR,OAAQ,aACR,OAAQ,MACR,OAAQ,aACR,OAAQ,aACR,OAAQ,MACR,OAAQ,aACR,OAAQ,aACR,OAAQ,MACR,QAAS,aACT,QAAS,aACTmb,KAAM,OACN/7C,IAAK,cACLnU,IAAK,cACLg0D,IAAK,gBAEPtkD,MAAO,EAAGqlC,YAAY,CACpBoZ,KAAM,UACHpZ,EAAM,WACT,MAAO,MACP,MAAO,aACP,MAAO,aACP,MAAO,MACP,MAAO,MACP,MAAO,MACP,MAAO,MACP,MAAO,MACP,MAAO,MACP,MAAO,MACP,MAAO,aACP,MAAO,aACP,MAAO,MACP,MAAO,aACP,MAAO,aACP,OAAQ,YACR,OAAQ,aACR,OAAQ,MACR,OAAQ,aACR,OAAQ,aACR,OAAQ,MACR,OAAQ,aACR,OAAQ,aACR,OAAQ,MACR,QAAS,aACT,QAAS,aACTmb,KAAM,OACN0D,OAAQ,QACR+D,IAAK,SACLC,IAAK,SACLC,IAAK,SACL1jD,IAAK,cACLnU,IAAK,cACLg0D,IAAK,gBAEP8D,WAAY,CACV3J,KAAM,OACN5lC,OAAQ,kBACRwvC,SAAU,WACVh7D,UAAW,aAEbi7D,OAAQ,CACN7J,KAAM,OACN,EAAG,IACH,GAAI,KACJ,GAAI,KACJ,GAAI,KACJ,GAAI,KACJ,GAAI,OAGRvgD,QAAS,G,2BCniCX,EAAQ,MACR,EAAQ,MACR,EAAQ,MACR,IAAIogC,EAAO,EAAQ,MAEnB93C,EAAOC,QAAU63C,EAAKlK,O,2BCLtB,IAAInoC,EAAI,EAAQ,MACZgtC,EAAa,EAAQ,MACrBU,EAAS,EAAQ,MACjB9uC,EAAW,EAAQ,KACnBivD,EAAS,EAAQ,MACjByO,EAAyB,EAAQ,MAEjCC,EAAyB1O,EAAO,6BAChC2O,EAAyB3O,EAAO,6BAIpC7tD,EAAE,CAAEjD,OAAQ,SAAUwwC,MAAM,EAAMhtC,QAAS+7D,GAA0B,CACnE,IAAO,SAAU12D,GACf,IAAI6D,EAAS7K,EAASgH,GACtB,GAAI8nC,EAAO6uB,EAAwB9yD,GAAS,OAAO8yD,EAAuB9yD,GAC1E,IAAIgzD,EAASzvB,EAAW,SAAXA,CAAqBvjC,GAGlC,OAFA8yD,EAAuB9yD,GAAUgzD,EACjCD,EAAuBC,GAAUhzD,EAC1BgzD,CACT,G,2BCpBF,IAAIjvB,EAAc,EAAQ,MAE1BjzC,EAAOC,QAAUgzC,EAAY,CAAC,EAAEwP,c,2BCFhC,IAAIh9C,EAAI,EAAQ,MACZyN,EAAU,EAAQ,KAKtBzN,EAAE,CAAEjD,OAAQ,QAASuD,OAAO,EAAMC,OAAQ,GAAGkN,UAAYA,GAAW,CAClEA,QAASA,G,2BCPX,IAAIzN,EAAI,EAAQ,MACZ08D,EAAQ,EAAQ,MAChBC,EAAgC,EAAQ,MAO5C38D,EAAE,CAAEjD,OAAQ,MAAOuD,OAAO,EAAMs8D,MAAM,EAAMr8D,QANf,EAAQ,KAEvBs8D,CAAuB,WAAaF,EAA8B,UAIlB,CAC5DD,MAAOA,G,2BCVT,IAAI18D,EAAI,EAAQ,MACZwtC,EAAc,EAAQ,MACtBoiB,EAAa,EAAQ,MACrBzU,EAAyB,EAAQ,MACjCv8C,EAAW,EAAQ,KACnBixD,EAAuB,EAAQ,MAE/BiN,EAAgBtvB,EAAY,GAAG3gC,SAInC7M,EAAE,CAAEjD,OAAQ,SAAUuD,OAAO,EAAMC,QAASsvD,EAAqB,aAAe,CAC9Ej+C,SAAU,SAAkBm+C,GAC1B,SAAU+M,EACRl+D,EAASu8C,EAAuBx/C,OAChCiD,EAASgxD,EAAWG,IACpBpzD,UAAUC,OAAS,EAAID,UAAU,QAAK4C,EAE1C,G,aCfM,SAAW/E,GAAW,aAU7B,IAAIuiE,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAAgB,WAClB,MAAyB,oBAAX7wD,MAChB,EACI8wD,EAAW,WACb,OAAOT,GAAQQ,MAAoBR,EAAOrwD,OAAOqwD,OAASA,EAAKU,gBAAkBV,CACnF,EACIW,EAAY,SAAmB5gE,GACjC,MAAwB,iBAAVA,CAChB,EACI6gE,EAAc,SAAqB7gE,GACrC,MAAwB,mBAAVA,CAChB,EACI8gE,EAAO,SAAcjvD,EAAS8Z,GAChC,IAAIvE,EAAe,MAATuE,EAAe,QAAU,SAC/BmE,EAAS,SAAW1I,EACpB25C,EAAS,SAAW35C,EACxB,OAAOvV,IAAYsuD,GAAWtuD,IAAYuuD,GAAUvuD,IAAYwuD,EAAQ/4D,KAAKC,IAAI64D,EAAOtwC,GAASuwC,EAAMvwC,KAAYqwC,EAAQ,QAAU/4C,IAAQg5C,EAAOW,IAAWV,EAAMU,IAAWlvD,EAAQie,GAAUje,EAAQ,SAAWuV,EACvN,EACI45C,EAAe,SAAsB17D,EAAGqmB,GAC1C,IAAIztB,EAAI,UAAqB,MAATytB,EAAe,OAAS,OAU5C,OARIrmB,IAAM66D,IACa,MAAjB76D,EAAE27D,YACJ/iE,EAAI,OAASytB,EAAKhC,cAAgB,SAElCrkB,EAAiB,MAAb86D,EAAOliE,GAAakiE,EAASC,GAI9B,WACL,OAAO/6D,EAAEpH,EACX,CACF,EA2BIgjE,EAAa,SAAoBrvD,EAASgL,GAG5C,KAFAhL,EAAUyuD,EAASzuD,GAAS,MAEXA,EAAQkM,sBACvB,OAAOwD,QAAQC,KAAK,2CAA6C,CAC/DnI,EAAG,EACHtC,EAAG,GAIP,IAAIoqD,EAAOtvD,EAAQkM,wBACfqjD,GAAUvkD,GAAaA,IAAcsjD,GAAWtjD,IAAcwjD,EAC9DgB,EAAQD,EAAS,CACnB5kD,IAAK4jD,EAAOkB,WAAanB,EAAQoB,aAAenB,EAAOvuC,WAAawuC,EAAMxuC,WAAa,GACvFlV,KAAMyjD,EAAOoB,YAAcrB,EAAQc,aAAeb,EAAOruC,YAAcsuC,EAAMtuC,YAAc,IACzFlV,EAAUkB,wBACV0jD,EAAU,CACZpoD,EAAG8nD,EAAKxkD,KAAO0kD,EAAM1kD,KACrB5F,EAAGoqD,EAAK3kD,IAAM6kD,EAAM7kD,KAQtB,OALK4kD,GAAUvkD,IACb4kD,EAAQpoD,GAAK2nD,EAAankD,EAAW,IAAxBmkD,GACbS,EAAQ1qD,GAAKiqD,EAAankD,EAAW,IAAxBmkD,IAGRS,CACT,EACIC,EAAY,SAAmB1hE,EAAOC,EAAQ0rB,EAAMg2C,EAAYC,GAClE,OAAQrtD,MAAMvU,IAA2B,iBAAVA,EAAkD4gE,EAAU5gE,IAA8B,MAApBA,EAAM8pB,OAAO,GAAa3a,WAAWnP,EAAM6hE,OAAO,KAA2B,MAApB7hE,EAAM8pB,OAAO,IAAc,EAAI,GAAK63C,EAAaC,EAAmB,QAAV5hE,EAAkB8gE,EAAK7gE,EAAQ0rB,GAAQi2C,EAASt6D,KAAKoU,IAAIolD,EAAK7gE,EAAQ0rB,GAAOu1C,EAAWlhE,EAAOC,GAAQ0rB,GAAQi2C,GAAnRzyD,WAAWnP,GAAS4hE,CAC1E,EACIE,EAAY,WACd7B,EAAOS,IAEHD,KAAmBR,GAA4B,oBAAbhwD,UAA4BA,SAASC,OACzEiwD,EAAUvwD,OACVywD,EAAQpwD,SAASC,KACjBkwD,EAASnwD,SAAS6V,gBAClBw6C,EAAWL,EAAKzZ,MAAMub,QACtB9B,EAAK3rB,OAAO,CACV0tB,kBAAmB,IAErBzB,EAAUN,EAAK3rB,SACf4rB,EAAe,EAEnB,EAEI+B,EAAiB,CACnBC,QAAS,SACT/hE,KAAM,WACNgiE,QAAS,EACTC,SAAU,SAAkBC,GAC1BpC,EAAOoC,EAEPP,GACF,EACAt1C,KAAM,SAAcvsB,EAAQD,EAAOsiE,EAAOn6D,EAAOo6D,GAC/CrC,GAAgB4B,IAChB,IAAIp5D,EAAO7J,KACP2jE,EAAWvC,EAAKwC,YAAYxiE,EAAQ,kBACxCyI,EAAKg6D,MAAQziE,IAAWkgE,EACxBz3D,EAAKzI,OAASA,EACdyI,EAAK45D,MAAQA,EACbtiE,EAzFS,SAAgBA,EAAOmI,EAAOlI,EAAQsiE,GAGjD,GAFA1B,EAAY7gE,KAAWA,EAAQA,EAAMmI,EAAOlI,EAAQsiE,IAE/B,iBAAVviE,EACT,OAAO4gE,EAAU5gE,IAAoB,QAAVA,GAAuC,MAApBA,EAAM8pB,OAAO,GAAa,CACtEzQ,EAAGrZ,EACH+W,EAAG/W,GACD,CACF+W,EAAG/W,GAEA,GAAIA,EAAM6E,SACf,MAAO,CACLkS,EAAG/W,EACHqZ,EAAGrZ,GAGL,IACI9B,EADA8J,EAAS,CAAC,EAGd,IAAK9J,KAAK8B,EACRgI,EAAO9J,GAAW,eAANA,GAAsB2iE,EAAY7gE,EAAM9B,IAAM8B,EAAM9B,GAAGiK,EAAOlI,EAAQsiE,GAAWviE,EAAM9B,GAGrG,OAAO8J,CAEX,CAgEY26D,CAAO3iE,EAAOmI,EAAOlI,EAAQsiE,GACrC75D,EAAKk6D,KAAO5iE,EACZ0I,EAAKm6D,YAAc,aAAc7iE,EAAQA,EAAQugE,GAASsC,SAC1Dn6D,EAAKo6D,KAAO9B,EAAa/gE,EAAQ,KACjCyI,EAAKq6D,KAAO/B,EAAa/gE,EAAQ,KACjCyI,EAAK2Q,EAAI3Q,EAAKs6D,MAAQt6D,EAAKo6D,OAC3Bp6D,EAAKqO,EAAIrO,EAAKu6D,MAAQv6D,EAAKq6D,OAC3BvC,IAAkBA,EAAgBP,EAAKoC,KAAKa,UAAU1C,eACP,WAA/CP,EAAKwC,YAAYxiE,EAAQ,mBAAkCggE,EAAK33D,IAAIrI,EAAQ,CAC1EkjE,eAAgB,SAGdX,GAAyB,SAAbA,IACd95D,EAAK06D,KAAO,EACZ16D,EAAK26D,WAAapjE,EAAO+iB,MAAMsgD,eAC/BrjE,EAAO+iB,MAAMsgD,eAAiB,QAGjB,MAAXtjE,EAAMqZ,GACR3Q,EAAKgR,IAAIhR,EAAM,IAAKA,EAAK2Q,EAAGqoD,EAAU1hE,EAAMqZ,EAAGpZ,EAAQ,IAAKyI,EAAK2Q,EAAGrZ,EAAMujE,SAAW,GAAIp7D,EAAOo6D,GAEhG75D,EAAK86D,OAAOj6D,KAAK,eAEjBb,EAAK+6D,MAAQ,EAGA,MAAXzjE,EAAM+W,GACRrO,EAAKgR,IAAIhR,EAAM,IAAKA,EAAKqO,EAAG2qD,EAAU1hE,EAAM+W,EAAG9W,EAAQ,IAAKyI,EAAKqO,EAAG/W,EAAM0jE,SAAW,GAAIv7D,EAAOo6D,GAEhG75D,EAAK86D,OAAOj6D,KAAK,eAEjBb,EAAKi7D,MAAQ,CAEjB,EACAC,OAAQ,SAAgBC,EAAOn7D,GAgB7B,IAfA,IASI2Q,EACAtC,EACA+sD,EACAC,EACArc,EAbApxB,EAAK5tB,EAAKs7D,IACV/jE,EAASyI,EAAKzI,OACdqiE,EAAQ55D,EAAK45D,MACbO,EAAWn6D,EAAKm6D,SAChBG,EAAQt6D,EAAKs6D,MACbC,EAAQv6D,EAAKu6D,MACbP,EAAQh6D,EAAKg6D,MACbU,EAAO16D,EAAK06D,KACZC,EAAa36D,EAAK26D,WAOf/sC,GACLA,EAAGp0B,EAAE2hE,EAAOvtC,EAAG3iB,GACf2iB,EAAKA,EAAG2tC,MAGV5qD,EAAIqpD,IAAUh6D,EAAK+6D,MAAQ/6D,EAAKo6D,OAASE,EAEzCc,GADA/sD,EAAI2rD,IAAUh6D,EAAKi7D,MAAQj7D,EAAKq6D,OAASE,GAC9BA,EACXc,EAAO1qD,EAAI2pD,EACXtb,EAAY6Y,EAAQyB,kBAEhBt5D,EAAK2Q,EAAI,IACX3Q,EAAK2Q,EAAI,GAGP3Q,EAAKqO,EAAI,IACXrO,EAAKqO,EAAI,GAGP8rD,KACGn6D,EAAK+6D,QAAUM,EAAOrc,GAAaqc,GAAQrc,IAAcruC,EAAIynD,EAAK7gE,EAAQ,OAC7EyI,EAAK+6D,MAAQ,IAGV/6D,EAAKi7D,QAAUG,EAAOpc,GAAaoc,GAAQpc,IAAc3wC,EAAI+pD,EAAK7gE,EAAQ,OAC7EyI,EAAKi7D,MAAQ,GAGXj7D,EAAK+6D,OAAS/6D,EAAKi7D,QACrBrB,EAAM4B,OACNx7D,EAAKk6D,KAAKuB,YAAcz7D,EAAKk6D,KAAKuB,WAAW52D,MAAM+0D,EAAO55D,EAAKk6D,KAAKwB,kBAAoB,MAIxF1B,EACFvC,EAAQnuC,SAAUtpB,EAAK+6D,MAAiBpqD,EAAT3Q,EAAK2Q,EAAQ3Q,EAAKi7D,MAAiB5sD,EAATrO,EAAKqO,IAE9DrO,EAAKi7D,QAAU1jE,EAAO4xB,UAAYnpB,EAAKqO,GACvCrO,EAAK+6D,QAAUxjE,EAAO8xB,WAAarpB,EAAK2Q,KAGtC+pD,GAAmB,IAAVS,GAAyB,IAAVA,IAC1B9sD,EAAI9W,EAAO4xB,UACXxY,EAAIpZ,EAAO8xB,WACXsxC,EAAapjE,EAAO+iB,MAAMsgD,eAAiBD,EAAapjE,EAAO+iB,MAAMqhD,eAAe,oBACpFpkE,EAAO4xB,UAAY9a,EAAI,EACvB9W,EAAO8xB,WAAa1Y,EAAI,EACxBpZ,EAAO4xB,UAAY9a,EACnB9W,EAAO8xB,WAAa1Y,GAGtB3Q,EAAKs6D,MAAQt6D,EAAK2Q,EAClB3Q,EAAKu6D,MAAQv6D,EAAKqO,EAClBypD,GAAiBA,EAAc8D,QACjC,EACAJ,KAAM,SAAcK,GAClB,IAAIC,EAAoB,aAAbD,EACP50D,EAAI9Q,KAAK2kE,OAAOzzD,QAAQw0D,GAW5B,OATIC,GAAqB,eAAbD,KACV1lE,KAAK4kE,MAAQ,IAGXe,GAAqB,eAAbD,KACV1lE,KAAK8kE,MAAQ,GAGfh0D,GAAK,GAAK9Q,KAAK2kE,OAAOz8D,OAAO4I,EAAG,IACxB9Q,KAAK2kE,OAAO1jE,MACtB,GAEFmiE,EAAe16D,IAAMu5D,EACrBmB,EAAewC,UAAYvD,EAC3Be,EAAeyC,YAAc1D,EAE7BiB,EAAe3tB,OAAS,SAAUsuB,GAGhC,IAAK,IAAI1kE,KAFTqiE,GAAWuB,MAAgBvB,EAAUN,EAAK3rB,UAE5BsuB,EACZrC,EAAQriE,GAAK0kE,EAAK1kE,EAEtB,EAEAwiE,KAAcT,EAAKU,eAAesB,GAElCvkE,EAAQukE,eAAiBA,EACzBvkE,EAAQyB,QAAU8iE,EAElB9jE,OAAO4B,eAAerC,EAAS,aAAc,CAAEsC,OAAO,GAEtD,CA3R+D2oD,CAAQjrD,E,2BCAxE,IAAIkB,EAAO,EAAQ,MACf8xC,EAAc,EAAQ,MACtBi0B,EAAgC,EAAQ,MACxCtlE,EAAW,EAAQ,MACnB0I,EAAW,EAAQ,IACnBo2C,EAAW,EAAQ,MACnBr8C,EAAW,EAAQ,KACnBu8C,EAAyB,EAAQ,MACjC6G,EAAY,EAAQ,MACpB0f,EAAqB,EAAQ,MAC7BC,EAAiB,EAAQ,MACzBC,EAAa,EAAQ,MAErB9E,EAAgBtvB,EAAY,GAAG3gC,SAGnC40D,EAA8B,QAAS,SAAUrgB,EAAOygB,EAAaC,GACnE,MAAO,CAGL,SAAe3R,GACb,IAAIx5C,EAAIwkC,EAAuBx/C,MAC3BomE,EAAUl9D,EAASsrD,GAAUnO,EAAUmO,EAAQ/O,QAAS7hD,EAC5D,OAAOwiE,EAAUrmE,EAAKqmE,EAAS5R,EAAQx5C,GAAK,IAAI3Y,OAAOmyD,GAAQ/O,GAAOxiD,EAAS+X,GACjF,EAGA,SAAUlN,GACR,IAAIu4D,EAAK7lE,EAASR,MACd0a,EAAIzX,EAAS6K,GACbw4D,EAAMH,EAAgBD,EAAaG,EAAI3rD,GAE3C,GAAI4rD,EAAIrsC,KAAM,OAAOqsC,EAAInlE,MAEzB,IAAIupD,EAAQznD,EAAS+iE,EAAeK,IAEpC,IAAmC,IAA/BlF,EAAczW,EAAO,KAAa,OAAOub,EAAWI,EAAI3rD,GAE5D,IAAI6rD,GAA6C,IAA/BpF,EAAczW,EAAO,KACvC2b,EAAGG,UAAY,EAIf,IAHA,IAEIr9D,EAFA8R,EAAI,GACJ9L,EAAI,EAEgC,QAAhChG,EAAS88D,EAAWI,EAAI3rD,KAAc,CAC5C,IAAI+rD,EAAWxjE,EAASkG,EAAO,IAC/B8R,EAAE9L,GAAKs3D,EACU,KAAbA,IAAiBJ,EAAGG,UAAYT,EAAmBrrD,EAAG4kC,EAAS+mB,EAAGG,WAAYD,IAClFp3D,GACF,CACA,OAAa,IAANA,EAAU,KAAO8L,CAC1B,EAEJ,E,uBClDArc,EAAOC,QAAU,SAAUG,GACzB,MAAO,CACL8uC,SAAU9uC,EACV4rB,KAAM5rB,EAAI4rB,KACVqP,MAAM,EAEV,C,2BCRA,IAAI4X,EAAc,EAAQ,MACtBE,EAAS,EAAQ,MACjB4B,EAAkB,EAAQ,MAC1BziC,EAAU,gBACVkhD,EAAa,EAAQ,KAErB1nD,EAAOmnC,EAAY,GAAGnnC,MAE1B9L,EAAOC,QAAU,SAAUoK,EAAQy9D,GACjC,IAGIz8D,EAHA+Q,EAAI24B,EAAgB1qC,GACpB6H,EAAI,EACJ3H,EAAS,GAEb,IAAKc,KAAO+Q,GAAI+2B,EAAOqgB,EAAYnoD,IAAQ8nC,EAAO/2B,EAAG/Q,IAAQS,EAAKvB,EAAQc,GAE1E,KAAOy8D,EAAMzlE,OAAS6P,GAAOihC,EAAO/2B,EAAG/Q,EAAMy8D,EAAM51D,SAChDI,EAAQ/H,EAAQc,IAAQS,EAAKvB,EAAQc,IAExC,OAAOd,CACT,C,yBClBAtK,EAAQE,YAAa,EACrBF,EAAQiyC,UAAYjyC,EAAQ0wC,UAAY1wC,EAAQ6wC,MAAQ7wC,EAAQgxC,WAAahxC,EAAQmxC,QAAUnxC,EAAQsxC,GAAKtxC,EAAQyxC,QAAUzxC,EAAQ4xC,OAAS5xC,EAAQ8nE,KAAO9nE,EAAQ+nE,SAAW/nE,EAAQgoE,OAAShoE,EAAQqB,SAAW,EAErNrB,EAAQqB,IADE,MAGVrB,EAAQgoE,OADK,SAGbhoE,EAAQ+nE,SADO,WAGf/nE,EAAQ8nE,KADG,OAGX9nE,EAAQ4xC,OADK,SAGb5xC,EAAQyxC,QADM,UAGdzxC,EAAQsxC,GADC,KAGTtxC,EAAQmxC,QADM,UAGdnxC,EAAQgxC,WADS,aAGjBhxC,EAAQ6wC,MADI,QAGZ7wC,EAAQ0wC,UADQ,YAGhB1wC,EAAQiyC,UADQ,W,2BCzBhB,IAAIkQ,EAAkB,EAAQ,MAE9BniD,EAAQqW,EAAI8rC,C,2BCFZ,IAeI7H,EAAQnnC,EAAQ48B,EAAMsK,EAASzf,EAf/Bgd,EAAa,EAAQ,MACrBqwB,EAAiB,EAAQ,MACzB1zD,EAAO,EAAQ,MACf2zD,EAAY,YACZ3vB,EAAQ,EAAQ,MAChB4vB,EAAS,EAAQ,MACjBC,EAAgB,EAAQ,MACxBC,EAAkB,EAAQ,MAC1B1wB,EAAU,EAAQ,MAElB2wB,EAAmB1wB,EAAW0wB,kBAAoB1wB,EAAW2wB,uBAC7Dh2D,EAAWqlC,EAAWrlC,SACtBhL,EAAUqwC,EAAWrwC,QACrBwzB,EAAU6c,EAAW7c,QACrBqd,EAAY6vB,EAAe,kBAI/B,IAAK7vB,EAAW,CACd,IAAIowB,EAAQ,IAAIjwB,EAEZkwB,EAAQ,WACV,IAAIh6B,EAAQsM,EAEZ,IADIpD,IAAYlJ,EAASlnC,EAAQ0yC,SAASxL,EAAO5Z,OAC1CkmB,EAAKytB,EAAM7lE,WAChBo4C,GACF,CAAE,MAAO5e,GAEP,MADIqsC,EAAME,MAAMpuB,IACVne,CACR,CACIsS,GAAQA,EAAO2L,OACrB,EAIK+tB,GAAWxwB,GAAY0wB,IAAmBC,IAAoB/1D,GAQvD61D,GAAiBrtC,GAAWA,EAAQuR,UAE9C+N,EAAUtf,EAAQuR,aAAQvnC,IAElBvD,YAAcu5B,EACtBH,EAAOrmB,EAAK8lC,EAAQzf,KAAMyf,GAC1BC,EAAS,WACP1f,EAAK6tC,EACP,GAES9wB,EACT2C,EAAS,WACP/yC,EAAQohE,SAASF,EACnB,GASAP,EAAY3zD,EAAK2zD,EAAWtwB,GAC5B0C,EAAS,WACP4tB,EAAUO,EACZ,IAhCAt1D,GAAS,EACT48B,EAAOx9B,EAASq2D,eAAe,IAC/B,IAAIN,EAAiBG,GAAO7nD,QAAQmvB,EAAM,CAAE84B,eAAe,IAC3DvuB,EAAS,WACPvK,EAAK/kC,KAAOmI,GAAUA,CACxB,GA8BFilC,EAAY,SAAU2C,GACfytB,EAAME,MAAMpuB,IACjBkuB,EAAMxsD,IAAI++B,EACZ,CACF,CAEAh7C,EAAOC,QAAUo4C,C,2BC5EjBp4C,EAAQE,YAAa,EACrBF,EAAQ8oE,cAAgBA,EACxB9oE,EAAiB,aAAS,EAE1B,IAQI+oE,EARA70B,EAAUC,EAAuB,EAAQ,OAEzC60B,EAAS70B,EAAuB,EAAQ,OAExC/zC,EAAa+zC,EAAuB,EAAQ,OAE5C9zC,EAAS,EAAQ,MAIrB,SAAS8zC,EAAuBh0C,GAAO,OAAOA,GAAOA,EAAID,WAAaC,EAAM,CAAE,QAAWA,EAAO,CAEhG,SAAS6tC,EAAkBzrC,EAAQyK,GAAS,IAAK,IAAIiF,EAAI,EAAGA,EAAIjF,EAAM5K,OAAQ6P,IAAK,CAAE,IAAIg8B,EAAajhC,EAAMiF,GAAIg8B,EAAWvrC,WAAaurC,EAAWvrC,aAAc,EAAOurC,EAAW76B,cAAe,EAAU,UAAW66B,IAAYA,EAAW56B,UAAW,GAAM5S,OAAO4B,eAAeE,EAAQ0rC,EAAW7iC,IAAK6iC,EAAa,CAAE,CAM5T,SAAS3tC,EAAgBC,EAAGC,GAA+G,OAA1GF,EAAkBG,OAAOC,gBAAkB,SAAyBH,EAAGC,GAAsB,OAAjBD,EAAEI,UAAYH,EAAUD,CAAG,EAAUD,EAAgBC,EAAGC,EAAI,CAEzK,IAAIyoE,EAAY,EAAQ,MAEpBC,EAAoB,kBACpBC,EAAkCF,EAAU,WAAa,EAAG,wIAC5DG,EAAmCH,EAAU,WAAa,EAAG,4FAC7DI,EAA8BJ,EAAU,WAAa,EAAG,wIAE5D,SAASH,EAAcxmE,GACrB,IAAIgnE,GAAkB,EAClBC,EAAY,KACZC,EAAYlnE,EACZuV,EAAI2xD,EAAU3kE,MAAMqkE,GAaxB,OAXIrxD,IACF0xD,EAAY1xD,EAAE,GACd2xD,EAAY3xD,EAAE,KAGhB2xD,GAAY,EAAIR,EAAgB,SAAGQ,MAEjBlnE,IAChBgnE,GAAkB,GAGb,CACLA,gBAAiBA,EACjBE,UAAWA,EACXD,UAAWA,EAEf,CA8BA,IAAIE,EAAyB,SAAU5oE,GA/DvC,IAAwBC,EAAUC,EAkEhC,SAAS0oE,EAAUzoE,GACjB,IAAIC,EAkBJ,YAhBkB,IAAdD,IACFA,EAAO,CAAC,GAGVC,EAAQJ,EAAWK,KAAKC,KAtC5B,SAAwCH,GACtC,QAAuB+D,IAAnB/D,EAAKuoE,UACP,OAAOvoE,EAGT,QAAmB+D,IAAf/D,EAAKsB,MACP,OAAOtB,EAGTqoE,IAEA,IAAIK,EAAiBZ,EAAc9nE,EAAKsB,OACpCinE,EAAYG,EAAeH,UAC3BC,EAAYE,EAAeF,UAY/B,OAVKxoE,EAAK4zC,OACR5zC,EAAK4zC,KAAO,CAAC,QAGS7vC,IAApB/D,EAAK4zC,KAAKtyC,QACZtB,EAAK4zC,KAAKtyC,MAAQtB,EAAKsB,OAGzBtB,EAAKsB,MAAQknE,EACbxoE,EAAKuoE,UAAYA,EACVvoE,CACT,CAYkC2oE,CAA+B3oE,KAAUG,KACvEF,EAAMG,KAAOf,EAAOqwC,UACpBzvC,EAAM2zC,KAAO3zC,EAAM2zC,MAAQ,CAAC,EAC5Bn0C,OAAO4B,eAAepB,EAAM2zC,KAAM,WAAY,CAC5CjyC,IAAKsmE,EAAU,WACb,OAAOhoE,EAAMqB,KACf,EAAG,8DACHsI,IAAKq+D,EAAU,WACb,OAAOhoE,EAAMqB,KACf,EAAG,yGAELrB,EAAMqzC,cAAe,EACdrzC,CACT,CAtFgCF,EAgENF,GAhEJC,EAgEP2oE,GAhEwCnoE,UAAYb,OAAOc,OAAOR,EAAWO,WAAYR,EAASQ,UAAUE,YAAcV,EAAUR,EAAgBQ,EAAUC,GA8G7K,IAhHoBstC,EAAaC,EAgH7BC,EAASk7B,EAAUnoE,UAwWvB,OAtWAitC,EAAOq7B,eAAiB,SAAwBpzD,QACzB,IAAjBA,IACFA,EAAU,CAAC,GAGb,IAAI+yD,EAAYpoE,KAAK0oE,oBAAoBrzD,GAErCszD,EAAaC,EAAqBR,GAEtC,OADc,EAAIr1B,EAAiB,SAAG/yC,KAAKqzC,OAAQs1B,EAErD,EAEAv7B,EAAOs7B,oBAAsB,SAA6BrzD,GACxD,OAAOA,EAAQwzD,MAAQ7oE,KAAK8oE,eAAezzD,GAAWrV,KAAK+oE,mBAAmB1zD,EAChF,EAQA+3B,EAAO47B,SAAW,SAAkB7nE,EAAOkU,QACpB,IAAjBA,IACFA,EAAU,CAAC,GAGbrV,KAAKqzC,OAASlyC,EACdnB,KAAKipE,WAAajpE,KAAK0oE,oBAAoBrzD,GAE3CrV,KAAKkpE,eACP,EAeA97B,EAAO07B,eAAiB,SAAwBzzD,GAC9C,IAAIrS,EAAIhD,KAAKmB,MACTgoE,EAAkBnmE,EAAEG,QAAQ,QAAS,IAAIlC,OACzCmoE,EAAkBpmE,EAAEG,QAAQ,QAAS,IAAIlC,OAE7C,GAAIkoE,EAAkBC,IAAoB,EAAG,CAC3C,IAAI91B,GAAU,EAAIP,EAAiB,SAAG/vC,EAAG,CACvCuwC,cAAc,IAGhB,GAAID,IAAYtwC,EACd,OAAOslE,EAAUe,SAEjB,IAAIC,EAAOtpE,KAAK+oE,mBAAmB1zD,GAEnC,GAAIi0D,IAAShB,EAAUe,SAAU,CAE/B,IAAIE,EAAQvpE,KAAKooE,WAAa/yD,EAAQ+yD,WAAaE,EAAUkB,aACzD3pE,EAAO+oE,EAAqBW,GAGhC,IAFiB,EAAIx2B,EAAiB,SAAG/vC,EAAGnD,GAE7BoB,OAASqyC,EAAQryC,OAC9B,OAAOsoE,CAEX,CAEA,OAAOD,CAEX,CAAO,OAAIF,IAAoBD,EACtBnpE,KAAK+oE,mBAAmB1zD,GACtB+zD,EAAkBD,EACpBb,EAAUkB,aAEVlB,EAAUmB,YAErB,EAQAr8B,EAAO27B,mBAAqB,SAA4B1zD,GACtD,IAAI+yD,EAAY/yD,EAAQq0D,uBAAyB1pE,KAAKooE,UAAY/yD,EAAQ+yD,UAU1E,YARkBxkE,IAAdwkE,IACFA,EAAY/yD,EAAQq0D,uBAAyBr0D,EAAQ+yD,UAAYpoE,KAAKooE,gBAGtDxkE,IAAdwkE,IACFA,EAAYE,EAAUkB,cAGjBpB,CACT,EAEAh7B,EAAO87B,cAAgB,WACrB,IAAIS,GAAW,EAAI52B,EAAiB,SAAG/yC,KAAKqzC,OAAQu1B,EAAqB5oE,KAAKooE,YAE1EuB,IAAa3pE,KAAKqzC,OAChBrzC,KAAKyzC,aACAzzC,KAAKyzC,KAAKtyC,MAGnBnB,KAAKyzC,KAAKtyC,MAAQwoE,CAEtB,EAEAv8B,EAAOw8B,eAAiB,SAAwBhiB,EAAMzmD,GACpD,GAAInB,KAAKmzC,aAAc,CACrB,IAAIG,GAAU,EAAIP,EAAiB,SAAG5xC,EAAO,CAC3CoyC,cAAc,IAGZD,IAAYnyC,EACdnB,KAAKyzC,KAAKmU,GAAQtU,SAEXtzC,KAAKyzC,KAAKmU,EAErB,CACF,EAEAxa,EAAOy8B,WAAa,SAAoBvoE,GACtC,IAIIwoE,EAAS9pE,KAAK8pE,OAAOxoE,IAAS,CAAC,EAC/ByoE,EAAY/pE,KAAKyzC,KAAKq2B,QAAU9pE,KAAKyzC,KAAKq2B,OAAOxoE,IAAS,CAAC,EAC/D,OAAOhC,OAAO0V,OANG,CACfg1D,OAAQ,GACRzmC,MAAO,IAIwBumC,EAAQC,EAC3C,EAEA38B,EAAO68B,WAAa,SAAoB3oE,EAAM4oE,EAAW1pB,QAChC,IAAnB0pB,IACFA,EAAY5oE,QAGM,IAAhBk/C,IACFA,EAAS2pB,GAGX,IAAIC,EAAapqE,KAAK6pE,WAAWK,GAEjC,OAAO1pB,EAAOxgD,KAAKoqD,kBAAkB9oD,GAAO8oE,EAC9C,EAiBAh9B,EAAOi9B,SAAW,SAAkB/oE,GAClC,IAAIgN,EAAQ,EAERg8D,EAAkBtqE,KAAK6pE,WAAW,aAItC,GAFAv7D,GAASg8D,EAAgBN,OAAO/oE,OAEnB,cAATK,GAAiC,OAATA,EAC1B,OAAOtB,KAAKspD,UAAYh7C,GAAS,EAGnC,GAAa,gBAAThN,EACF,OAAOgN,EAST,GANAA,GAAStO,KAAKuqE,gBAAgBtpE,OAE1BjB,KAAKspD,YACPh7C,GAAS,GAGE,cAAThN,EACF,OAAOgN,EAGTA,GAAStO,KAAKoqD,kBAAkB,aAAanpD,OAC7CqN,GAASg8D,EAAgB/mC,MAAMtiC,OAE/B,IAAIupE,EAAiBxqE,KAAK6pE,WAAW,YAErCv7D,GAASk8D,EAAeR,OAAO/oE,OAC/B,IAAIwpE,EAAWzqE,KAAKoqD,kBAAkB,YAEtC,GAAa,aAAT9oD,EACF,OAAOmpE,EAAWn8D,GAAS,EAG7BA,GAASm8D,EAASxpE,OAClBqN,GAASk8D,EAAejnC,MAAMtiC,OAE9B,IAAIypE,EAAc1qE,KAAK6pE,WAAW,SAElCv7D,GAASo8D,EAAYV,OAAO/oE,OAC5B,IAAIE,EAAQnB,KAAKoqD,kBAAkB,SAEnC,MAAa,UAAT9oD,EACKH,EAAQmN,GAAS,GAG1BA,GAASnN,EAAMF,OACfqN,GAASo8D,EAAYnnC,MAAMtiC,OAI3BqN,GAFwBtO,KAAK6pE,WAAW,eAEbG,OAAO/oE,OAErB,gBAATK,GACKtB,KAAK2qE,YAAcr8D,GAGpB,EACV,EAEA8+B,EAAOnqC,SAAW,WAChB,IAAIqsC,EAAStvC,KAETqtC,EAAW,CAACrtC,KAAKmqD,eAAgB,KAiBrC,OAhBA9c,EAAS3iC,KAAK1K,KAAKiqE,WAAW,qBAAsB,cAEhDjqE,KAAKyqE,WAAazqE,KAAKmB,OAAwB,KAAfnB,KAAKmB,SACvCksC,EAAS3iC,KAAK1K,KAAKiqE,WAAW,aAC9B58B,EAAS3iC,KAAK1K,KAAKiqE,WAAW,UAC9B58B,EAAS3iC,KAAK1K,KAAKiqE,WAAW,kBAAmB,cAAe,SAAUW,EAAWR,GAKnF,QAJIQ,EAAU3pE,OAAS,IAAMquC,EAAOu7B,QAAuC,IAA7BT,EAAWJ,OAAO/oE,QAAkBquC,EAAOw6B,OAAO3oE,OAASmuC,EAAOw6B,OAAO3oE,MAAMoiC,QAC3H6mC,EAAWJ,OAAS,KAGfG,EAAkBS,EAAWR,EACtC,KAGF/8B,EAAS3iC,KAAK,KACd2iC,EAAS3iC,KAAK1K,KAAKqqD,eACZhd,EAAS5pC,KAAK,GACvB,EA9WoBypC,EAgXPo7B,GAhXoBn7B,EAgXT,CAAC,CACvBljC,IAAK,SACLzI,IAAK,WACH,IAAIspE,EAAK9qE,KAAKooE,UACd,MAAc,MAAP0C,GAAqB,MAAPA,CACvB,EACArhE,IAAK,SAAatI,GAChB8mE,GACF,GAQC,CACDh+D,IAAK,YACLzI,IAAK,WACH,OAAOxB,KAAKipE,UACd,EASAx/D,IAAK,SAAa2+D,GACXpoE,KAAKmzC,aAKNnzC,KAAKipE,aAAeb,IACtBpoE,KAAKipE,WAAab,EAElBpoE,KAAKkpE,iBAPLlpE,KAAKipE,WAAab,CAStB,GACC,CACDn+D,IAAK,qBACLzI,IAAK,WACH,OAAOxB,KAAK+qE,cAAc/qE,KAAKyzC,KAAK4f,WAAarzD,KAAKqzD,UACxD,GACC,CACDppD,IAAK,kBACLzI,IAAK,WACH,OAAOxB,KAAK2qE,YAAc,IAAM,EAClC,GACC,CACD1gE,IAAK,QACLzI,IAAK,WACH,OAAOxB,KAAKqzC,MACd,EAcA5pC,IAAK,SAAazG,GAChB,GAAIhD,KAAKmzC,aAAc,CACrB,IAAI63B,EAAkBrD,EAAc3kE,GAChCmlE,EAAkB6C,EAAgB7C,gBAClCE,EAAY2C,EAAgB3C,UAC5BD,EAAY4C,EAAgB5C,UAMhC,GAJID,GACFH,IAGEK,IAAcroE,KAAKqzC,QAAU+0B,IAAcpoE,KAAKipE,WAClD,OAGFjpE,KAAKqzC,OAASg1B,EACdroE,KAAKipE,WAAab,EAElBpoE,KAAKkpE,eACP,MACElpE,KAAKqzC,OAASrwC,CAElB,GACC,CACDiH,IAAK,YACLzI,IAAK,WACH,OAAOxB,KAAKszD,UACd,EACA7pD,IAAK,SAAanI,GAChBtB,KAAK4pE,eAAe,YAAatoE,GAEjCtB,KAAKszD,WAAahyD,CACpB,MArd0EurC,EAAkBK,EAAY/sC,UAAWgtC,GAwd9Gm7B,CACT,CAxZ6B,CAwZ3BrpE,EAAoB,SAEtBJ,EAAiB,QAAIypE,EACrBA,EAAUe,SAAW,KACrBf,EAAUmB,aAAe,IACzBnB,EAAUkB,aAAe,IACzB,IAAIZ,IAAwBhB,EAAwB,CAClD,IAAK,CACH1Y,OAAQ,SACR3U,MAAM,GAER,IAAK,CACH2U,OAAQ,SACR3U,MAAM,KAEmB,KAAI,CAC/BhH,cAAc,GACbq0B,GAEH,SAASuC,EAAkBS,EAAWR,GACpC,MAAO,GAAKA,EAAWJ,OAASY,EAAYR,EAAW7mC,KACzD,C,2BCjgBA,IAAIl/B,EAAI,EAAQ,MACZitC,EAAU,EAAQ,MAClBE,EAA6B,mBAC7BD,EAA2B,EAAQ,KACnCF,EAAa,EAAQ,MACrB1yC,EAAa,EAAQ,MACrBg4C,EAAgB,EAAQ,MAExBqB,EAAyBzG,GAA4BA,EAAyBpxC,UAWlF,GAPAkE,EAAE,CAAEjD,OAAQ,UAAWuD,OAAO,EAAMC,OAAQ4sC,EAA4ByvB,MAAM,GAAQ,CACpF,MAAS,SAAU9mB,GACjB,OAAOn6C,KAAKy5B,UAAK71B,EAAWu2C,EAC9B,KAIG7I,GAAW3yC,EAAW4yC,GAA2B,CACpD,IAAI3U,EAASyU,EAAW,WAAWlxC,UAAiB,MAChD63C,EAA8B,QAAMpb,GACtC+Z,EAAcqB,EAAwB,QAASpb,EAAQ,CAAEyd,QAAQ,GAErE,C,2BCxBA,IAAIh2C,EAAI,EAAQ,MACZ4mE,EAAU,eAQd5mE,EAAE,CAAEjD,OAAQ,QAASuD,OAAO,EAAMC,QAPC,EAAQ,IAEjBsmE,CAA6B,WAKW,CAChEpnE,OAAQ,SAAgBgB,GACtB,OAAOmmE,EAAQjrE,KAAM8E,EAAY9D,UAAUC,OAAS,EAAID,UAAU,QAAK4C,EACzE,G,2BCZF,IAAIouC,EAAc,EAAQ,MACtBm5B,EAAuB,cACvBt5B,EAAc,EAAQ,MACtBu5B,EAAwB,EAAQ,MAEhCp3B,EAAoBluC,SAAS3F,UAC7BkrE,EAAmBx5B,EAAYmC,EAAkB/wC,UACjDqoE,EAAS,mEACTrF,EAAap0B,EAAYy5B,EAAOnkE,MAKhC6qC,IAAgBm5B,GAClBC,EAAsBp3B,EALb,OAKsC,CAC7C/hC,cAAc,EACdzQ,IAAK,WACH,IACE,OAAOykE,EAAWqF,EAAQD,EAAiBrrE,OAAO,EACpD,CAAE,MAAOg7B,GACP,MAAO,EACT,CACF,G,2BCtBJ17B,OAAO4B,eAAerC,EAAS,aAAc,CACzCsC,OAAO,IAEX,SAAiBC,EAAQC,GACrB,IAAI,IAAIC,KAAQD,EAAI/B,OAAO4B,eAAeE,EAAQE,EAAM,CACpDC,YAAY,EACZC,IAAKH,EAAIC,IAEjB,CACAG,CAAQ5C,EAAS,CACbigD,YAAa,WACT,OAAOA,CACX,EACAysB,iBAAkB,WACd,OAAOA,CACX,EACAjrE,QAAS,WACL,OAAOq1C,CACX,IAEJ,MAAM61B,EAA4B3pE,EAAyB,EAAQ,OAC7D0/C,EAAqB1/C,EAAyB,EAAQ,OAC5D,SAASA,EAAyB7C,GAC9B,OAAOA,GAAOA,EAAID,WAAaC,EAAM,CACjCsB,QAAStB,EAEjB,CACA,IAAIsW,EAAW,CACXm2D,2BAA2B,EAC3BC,sBAAsB,EACtBC,uCAAuC,EACvCC,+BAA+B,GAE/BC,EAAe,CACfC,OAAQ,CACJ,yBACA,iCACA,wCACA,iCAEJC,aAAc,CACV,4BACA,yBAGR,SAASjtB,EAAYrJ,EAAQu2B,GAErB,IAAIC,EACAC,EAAqBC,EAIrBC,EACAC,EAA2BC,EAPnC,OAAIT,EAAaC,OAAO71D,SAAS+1D,GAGJ,QAAlBv2B,EAAOq2B,QAAmS,QAA7QK,EAA0L,QAAlLD,EAAsBz2B,SAAqF,QAApCw2B,EAAiBx2B,EAAOq2B,cAA4C,IAAxBG,OAAjD,EAAsFA,EAAeD,UAAgD,IAA7BE,EAAiCA,EAAsB52D,EAAS02D,UAAiC,IAAdG,GAAkBA,IAE3UN,EAAaE,aAAa91D,SAAS+1D,KAGJ,QAAxBv2B,EAAOs2B,cAAoV,QAAxTO,EAAyN,QAAhND,EAA4B52B,SAAiG,QAAhD22B,EAAuB32B,EAAOs2B,oBAAwD,IAA9BK,OAA7D,EAAwGA,EAAqBJ,UAAsD,IAAnCK,EAAuCA,EAA4B/2D,EAAS02D,UAAkC,IAAfM,GAAmBA,EAGrY,CACA,SAASC,EAAyB92B,GAC9B,MAA4B,QAAxBA,EAAOs2B,aACAF,EAAaE,aAGjBzsE,OAAO8H,KAAsG,QAAhGglE,EAAuB32B,aAA4C,EAAIA,EAAOs2B,oBAAwD,IAA9BK,EAAkCA,EAAuB,CAAC,GAAGtoE,OAAQkoE,GAAOH,EAAaE,aAAa91D,SAAS+1D,IAASv2B,EAAOs2B,aAAaC,IADxQ,IAAII,CAER,CACA,SAASb,EAAiB91B,GACtB,QAAmC7xC,IAA/BwC,QAAQomE,IAAIC,gBAGZF,EAAyB92B,GAAQx0C,OAAS,EAAG,CAC7C,IAAIyrE,EAAUH,EAAyB92B,GAAQ1yC,IAAKoO,GAAIq6D,EAAYlrE,QAAQotD,OAAOv8C,IAAI1N,KAAK,MAC5F89C,EAAKjhD,QAAQqiB,KAAK,6BAA8B,CAC5C,2CAA2C+pD,IAC3C,gIAER,CACJ,CACA,MAAM/2B,EAAWk2B,C,2BC7EjB,IAAIxnE,EAAI,EAAQ,MACZsoE,EAAO,YAQXtoE,EAAE,CAAEjD,OAAQ,QAASuD,OAAO,EAAMC,QAPC,EAAQ,IAEjBsmE,CAA6B,QAKW,CAChEnoE,IAAK,SAAa+B,GAChB,OAAO6nE,EAAK3sE,KAAM8E,EAAY9D,UAAUC,OAAS,EAAID,UAAU,QAAK4C,EACtE,G,2BCZF,IAAI+uC,EAAc,EAAQ,KACtBzxC,EAAiB,EAAQ,MAE7BtC,EAAOC,QAAU,SAAUuC,EAAQE,EAAMwrC,GAGvC,OAFIA,EAAWtrC,KAAKmxC,EAAY7F,EAAWtrC,IAAKF,EAAM,CAAEsxC,QAAQ,IAC5D9F,EAAWrjC,KAAKkpC,EAAY7F,EAAWrjC,IAAKnI,EAAM,CAAEuxC,QAAQ,IACzD3xC,EAAegU,EAAE9T,EAAQE,EAAMwrC,EACxC,C,cCRA,QAsBoB,oBAAV/7B,QAAwBA,YATf,0BAAf,EAS6C,WAEjD,aAEA,SAAS67D,IAAa,CAEtB,IAAIjoE,EAAQioE,EAAUzsE,UAiFtB,OA/EAwE,EAAM6Q,GAAK,SAAUq3D,EAAWC,GAC9B,GAAMD,GAAcC,EAApB,CAIA,IAAI92D,EAAShW,KAAK+sE,QAAU/sE,KAAK+sE,SAAW,CAAC,EAEzCC,EAAYh3D,EAAQ62D,GAAc72D,EAAQ62D,IAAe,GAM7D,OAJuC,GAAlCG,EAAU97D,QAAS47D,IACtBE,EAAUtiE,KAAMoiE,GAGX9sE,IAVP,CAWF,EAEA2E,EAAMsoE,KAAO,SAAUJ,EAAWC,GAChC,GAAMD,GAAcC,EAApB,CAIA9sE,KAAKwV,GAAIq3D,EAAWC,GAGpB,IAAII,EAAaltE,KAAKmtE,YAAcntE,KAAKmtE,aAAe,CAAC,EAMzD,OAJoBD,EAAYL,GAAcK,EAAYL,IAAe,CAAC,GAE3DC,IAAa,EAErB9sE,IAXP,CAYF,EAEA2E,EAAMuR,IAAM,SAAU22D,EAAWC,GAC/B,IAAIE,EAAYhtE,KAAK+sE,SAAW/sE,KAAK+sE,QAASF,GAC9C,GAAMG,GAAcA,EAAU/rE,OAA9B,CAGA,IAAIqI,EAAQ0jE,EAAU97D,QAAS47D,GAK/B,OAJe,GAAVxjE,GACH0jE,EAAU9kE,OAAQoB,EAAO,GAGpBtJ,IANP,CAOF,EAEA2E,EAAMyoE,UAAY,SAAUP,EAAWh9D,GACrC,IAAIm9D,EAAYhtE,KAAK+sE,SAAW/sE,KAAK+sE,QAASF,GAC9C,GAAMG,GAAcA,EAAU/rE,OAA9B,CAIA+rE,EAAYA,EAAUlgE,MAAM,GAC5B+C,EAAOA,GAAQ,GAIf,IAFA,IAAIw9D,EAAgBrtE,KAAKmtE,aAAentE,KAAKmtE,YAAaN,GAEhD/7D,EAAE,EAAGA,EAAIk8D,EAAU/rE,OAAQ6P,IAAM,CACzC,IAAIg8D,EAAWE,EAAUl8D,GACZu8D,GAAiBA,EAAeP,KAI3C9sE,KAAKkW,IAAK22D,EAAWC,UAEdO,EAAeP,IAGxBA,EAASp+D,MAAO1O,KAAM6P,EACxB,CAEA,OAAO7P,IArBP,CAsBF,EAEA2E,EAAM2oE,OAAS,kBACNttE,KAAK+sE,eACL/sE,KAAKmtE,WACd,EAEOP,CAEP,GAlGmB,iC,2BCZnB,IAGIzoE,EAAO,CAAC,EAEZA,EALsB,EAAQ,KAEV68C,CAAgB,gBAGd,IAEtBpiD,EAAOC,QAA2B,eAAjBwQ,OAAOlL,E,2BCPxB,IAAI0tC,EAAc,EAAQ,MAEtB5uC,EAAW4uC,EAAY,CAAC,EAAE5uC,UAC1BuvC,EAAcX,EAAY,GAAG/kC,OAEjClO,EAAOC,QAAU,SAAUC,GACzB,OAAO0zC,EAAYvvC,EAASnE,GAAK,GAAI,EACvC,C,2BCPA,IAAIgzC,EAAQ,EAAQ,MAEpBlzC,EAAOC,SAAWizC,EAAM,WACtB,SAASxqB,IAAkB,CAG3B,OAFAA,EAAEnnB,UAAUE,YAAc,KAEnBf,OAAOwI,eAAe,IAAIwf,KAASA,EAAEnnB,SAC9C,E,UCFE,IAAUm6C,EAAQwP,EAARxP,EAUQ,oBAAVvpC,OAAwBA,OAAS/Q,KAVvB8pD,EAU6B,WAEjD,SAAS8iB,IAAa,CAEtB,IAAIjoE,EAAQioE,EAAUzsE,UA6EtB,OA3EAwE,EAAM6Q,GAAK,SAAUq3D,EAAWC,GAC9B,IAAMD,IAAcC,EAAW,OAAO9sE,KAGtC,IAAIgW,EAAShW,KAAK+sE,QAAU/sE,KAAK+sE,SAAW,CAAC,EAEzCC,EAAYh3D,EAAQ62D,GAAc72D,EAAQ62D,IAAe,GAM7D,OAJMG,EAAU/2D,SAAU62D,IACxBE,EAAUtiE,KAAMoiE,GAGX9sE,IACT,EAEA2E,EAAMsoE,KAAO,SAAUJ,EAAWC,GAChC,IAAMD,IAAcC,EAAW,OAAO9sE,KAGtCA,KAAKwV,GAAIq3D,EAAWC,GAGpB,IAAII,EAAaltE,KAAKmtE,YAAcntE,KAAKmtE,aAAe,CAAC,EAMzD,OAJoBD,EAAYL,GAAcK,EAAYL,IAAe,CAAC,GAE3DC,IAAa,EAErB9sE,IACT,EAEA2E,EAAMuR,IAAM,SAAU22D,EAAWC,GAC/B,IAAIE,EAAYhtE,KAAK+sE,SAAW/sE,KAAK+sE,QAASF,GAC9C,IAAMG,IAAcA,EAAU/rE,OAAS,OAAOjB,KAE9C,IAAIsJ,EAAQ0jE,EAAU97D,QAAS47D,GAK/B,OAJe,GAAVxjE,GACH0jE,EAAU9kE,OAAQoB,EAAO,GAGpBtJ,IACT,EAEA2E,EAAMyoE,UAAY,SAAUP,EAAWh9D,GACrC,IAAIm9D,EAAYhtE,KAAK+sE,SAAW/sE,KAAK+sE,QAASF,GAC9C,IAAMG,IAAcA,EAAU/rE,OAAS,OAAOjB,KAG9CgtE,EAAYA,EAAUlgE,MAAO,GAC7B+C,EAAOA,GAAQ,GAEf,IAAIw9D,EAAgBrtE,KAAKmtE,aAAentE,KAAKmtE,YAAaN,GAE1D,IAAM,IAAIC,KAAYE,EACPK,GAAiBA,EAAeP,KAI3C9sE,KAAKkW,IAAK22D,EAAWC,UAEdO,EAAeP,IAGxBA,EAASp+D,MAAO1O,KAAM6P,GAGxB,OAAO7P,IACT,EAEA2E,EAAM2oE,OAAS,WAGb,cAFOttE,KAAK+sE,eACL/sE,KAAKmtE,YACLntE,IACT,EAEO4sE,CAEP,EA3FoChuE,EAAOC,QAEvCD,EAAOC,QAAUirD,IAGjBxP,EAAOsyB,UAAY9iB,G,2BCZvB,IAAIjY,EAAc,EAAQ,MAGtB07B,EAAezkE,IAAI3I,UAEvBvB,EAAOC,QAAU,CAEfiK,IACAW,IAAKooC,EAAY07B,EAAa9jE,KAC9BjI,IAAKqwC,EAAY07B,EAAa/rE,KAC9BgJ,IAAKqnC,EAAY07B,EAAa/iE,KAC9BmQ,OAAQk3B,EAAY07B,EAAqB,QACzC5oE,MAAO4oE,E,2BCZmB,EAAQ,IAIpCC,CAAsB,W,2BCJtB,IAAIhtE,EAAW,EAAQ,MACnBmlD,EAAe,EAAQ,MACvBW,EAAoB,EAAQ,MAG5BpF,EAFkB,EAAQ,KAEhBF,CAAgB,WAI9BpiD,EAAOC,QAAU,SAAUmc,EAAGyyD,GAC5B,IACI/yD,EADAI,EAAIta,EAASwa,GAAG3a,YAEpB,YAAauD,IAANkX,GAAmBwrC,EAAkB5rC,EAAIla,EAASsa,GAAGomC,IAAYusB,EAAqB9nB,EAAajrC,EAC5G,C,2BCbA,IAAIgzD,EAAsB,EAAQ,MAC9BzqE,EAAW,EAAQ,KACnBu8C,EAAyB,EAAQ,MAEjCmuB,EAAcC,WAIlBhvE,EAAOC,QAAU,SAAgByP,GAC/B,IAAI26C,EAAMhmD,EAASu8C,EAAuBx/C,OACtCmJ,EAAS,GACTgG,EAAIu+D,EAAoBp/D,GAC5B,GAAIa,EAAI,GAAKA,IAAM0+D,IAAU,MAAM,IAAIF,EAAY,+BACnD,KAAMx+D,EAAI,GAAIA,KAAO,KAAO85C,GAAOA,GAAc,EAAJ95C,IAAOhG,GAAU8/C,GAC9D,OAAO9/C,CACT,C,2BCfA,IAAI6oC,EAAc,EAAQ,MACtBF,EAAQ,EAAQ,MAChBD,EAAc,EAAQ,MACtBi8B,EAAuB,EAAQ,MAC/BC,EAAa,EAAQ,MACrBp6B,EAAkB,EAAQ,MAG1B1rC,EAAuB4pC,EAFC,WAGxBnnC,EAAOmnC,EAAY,GAAGnnC,MAItBsjE,EAASh8B,GAAeF,EAAM,WAEhC,IAAI92B,EAAI1b,OAAOc,OAAO,MAEtB,OADA4a,EAAE,GAAK,GACC/S,EAAqB+S,EAAG,EAClC,GAGI2kC,EAAe,SAAUsuB,GAC3B,OAAO,SAAUnvE,GAQf,IAPA,IAMImL,EANA+Q,EAAI24B,EAAgB70C,GACpBsI,EAAO2mE,EAAW/yD,GAClBkzD,EAAgBF,GAAsC,OAA5BF,EAAqB9yD,GAC/C/Z,EAASmG,EAAKnG,OACd6P,EAAI,EACJ3H,EAAS,GAENlI,EAAS6P,GACd7G,EAAM7C,EAAK0J,KACNkhC,KAAgBk8B,EAAgBjkE,KAAO+Q,EAAI/S,EAAqB+S,EAAG/Q,KACtES,EAAKvB,EAAQ8kE,EAAa,CAAChkE,EAAK+Q,EAAE/Q,IAAQ+Q,EAAE/Q,IAGhD,OAAOd,CACT,CACF,EAEAvK,EAAOC,QAAU,CAGfwK,QAASs2C,GAAa,GAGtBv4B,OAAQu4B,GAAa,G,2BC7CvB,IAoDIwuB,EApDA3tE,EAAW,EAAQ,MACnB4tE,EAAyB,EAAQ,MACjCje,EAAc,EAAQ,MACtBiC,EAAa,EAAQ,KACrBvqC,EAAO,EAAQ,KACfwmD,EAAwB,EAAQ,MAChClc,EAAY,EAAQ,MAIpBmc,EAAY,YACZC,EAAS,SACTlnE,EAAW8qD,EAAU,YAErBqc,EAAmB,WAA0B,EAE7CC,EAAY,SAAUt2D,GACxB,MARO,IAQKo2D,EATL,IASmBp2D,EAAnBu2D,KAAwCH,EATxC,GAUT,EAGII,EAA4B,SAAUR,GACxCA,EAAgBS,MAAMH,EAAU,KAChCN,EAAgB51C,QAChB,IAAIs2C,EAAOV,EAAgBW,aAAaxvE,OAGxC,OADA6uE,EAAkB,KACXU,CACT,EAyBIE,EAAkB,WACpB,IACEZ,EAAkB,IAAIa,cAAc,WACtC,CAAE,MAAOh0C,GAAsB,CAzBF,IAIzBi0C,EAFAC,EACAC,EAuBJJ,EAAqC,oBAAZ39D,SACrBA,SAAS0nC,QAAUq1B,EACjBQ,EAA0BR,IA1B5Be,EAASb,EAAsB,UAC/Bc,EAAK,OAASZ,EAAS,IAE3BW,EAAO/qD,MAAMoB,QAAU,OACvBsC,EAAKjW,YAAYs9D,GAEjBA,EAAOhnD,IAAM7Y,OAAO8/D,IACpBF,EAAiBC,EAAOryC,cAAczrB,UACvB6sB,OACfgxC,EAAeL,MAAMH,EAAU,sBAC/BQ,EAAe12C,QACR02C,EAAe3nD,GAiBlBqnD,EAA0BR,GAE9B,IADA,IAAIltE,EAASkvD,EAAYlvD,OAClBA,YAAiB8tE,EAAgBT,GAAWne,EAAYlvD,IAC/D,OAAO8tE,GACT,EAEA3c,EAAW/qD,IAAY,EAKvBzI,EAAOC,QAAUS,OAAOc,QAAU,SAAgB4a,EAAGo0D,GACnD,IAAIjmE,EAQJ,OAPU,OAAN6R,GACFwzD,EAAiBF,GAAa9tE,EAASwa,GACvC7R,EAAS,IAAIqlE,EACbA,EAAiBF,GAAa,KAE9BnlE,EAAO9B,GAAY2T,GACd7R,EAAS4lE,SACMnrE,IAAfwrE,EAA2BjmE,EAASilE,EAAuBl5D,EAAE/L,EAAQimE,EAC9E,C,2BCnFiB,EAAQ,KAKzBC,CAAW,MAAO,SAAU1hD,GAC1B,OAAO,WAAiB,OAAOA,EAAK3tB,KAAMgB,UAAUC,OAASD,UAAU,QAAK4C,EAAY,CAC1F,EANuB,EAAQ,M,2BCA/B/E,EAAQE,YAAa,EAErB,IAAIG,EAAS,EAAQ,MAErBI,OAAO8H,KAAKlI,GAAQ4S,QAAQ,SAAU7H,GACxB,YAARA,GAA6B,eAARA,IACrBA,KAAOpL,GAAWA,EAAQoL,KAAS/K,EAAO+K,KAC9CpL,EAAQoL,GAAO/K,EAAO+K,IACxB,GAEA,IAAIqlE,EAAgB,EAAQ,MAE5BhwE,OAAO8H,KAAKkoE,GAAex9D,QAAQ,SAAU7H,GAC/B,YAARA,GAA6B,eAARA,IACrBA,KAAOpL,GAAWA,EAAQoL,KAASqlE,EAAcrlE,KACrDpL,EAAQoL,GAAOqlE,EAAcrlE,IAC/B,GAEA,IAAIslE,EAAU,EAAQ,MAEtBjwE,OAAO8H,KAAKmoE,GAASz9D,QAAQ,SAAU7H,GACzB,YAARA,GAA6B,eAARA,IACrBA,KAAOpL,GAAWA,EAAQoL,KAASslE,EAAQtlE,KAC/CpL,EAAQoL,GAAOslE,EAAQtlE,IACzB,E,2BCzBA,IAAI5F,EAAI,EAAQ,MACZmrE,EAAe,EAAQ,MAS3BnrE,EAAE,CAAEjD,OAAQ,MAAOuD,OAAO,EAAMs8D,MAAM,EAAMr8D,QARf,EAAQ,KAEpBs8D,CAAuB,eAAgB,SAAU/3D,GAChE,OAAQA,CACV,IAIiE,CAC/DqmE,aAAcA,G,2BCXhB,IAAI39B,EAAc,EAAQ,MACtBiT,EAAW,EAAQ,MAEnB1zB,EAAQ3oB,KAAK2oB,MACbnG,EAAS4mB,EAAY,GAAG5mB,QACxB9nB,EAAU0uC,EAAY,GAAG1uC,SACzBqvC,EAAcX,EAAY,GAAG/kC,OAE7B2iE,EAAuB,8BACvBC,EAAgC,sBAIpC9wE,EAAOC,QAAU,SAAU8wE,EAAS1mB,EAAK7vB,EAAUw2C,EAAUC,EAAeC,GAC1E,IAAIC,EAAU32C,EAAWu2C,EAAQ1uE,OAC7ByV,EAAIk5D,EAAS3uE,OACb+uE,EAAUN,EAKd,YAJsB9rE,IAAlBisE,IACFA,EAAgB/qB,EAAS+qB,GACzBG,EAAUP,GAELtsE,EAAQ2sE,EAAaE,EAAS,SAAUtsE,EAAOusE,GACpD,IAAInwD,EACJ,OAAQmL,EAAOglD,EAAI,IACjB,IAAK,IAAK,MAAO,IACjB,IAAK,IAAK,OAAON,EACjB,IAAK,IAAK,OAAOn9B,EAAYyW,EAAK,EAAG7vB,GACrC,IAAK,IAAK,OAAOoZ,EAAYyW,EAAK8mB,GAClC,IAAK,IACHjwD,EAAU+vD,EAAcr9B,EAAYy9B,EAAI,GAAI,IAC5C,MACF,QACE,IAAI9gE,GAAK8gE,EACT,GAAU,IAAN9gE,EAAS,OAAOzL,EACpB,GAAIyL,EAAIuH,EAAG,CACT,IAAIxB,EAAIkc,EAAMjiB,EAAI,IAClB,OAAU,IAAN+F,EAAgBxR,EAChBwR,GAAKwB,OAA8B9S,IAApBgsE,EAAS16D,EAAI,GAAmB+V,EAAOglD,EAAI,GAAKL,EAAS16D,EAAI,GAAK+V,EAAOglD,EAAI,GACzFvsE,CACT,CACAoc,EAAU8vD,EAASzgE,EAAI,GAE3B,YAAmBvL,IAAZkc,EAAwB,GAAKA,CACtC,EACF,C,yBC3CAjhB,EAAQE,YAAa,EACrBF,EAAiB,QAEjB,SAAsBG,GACpB,IAAK,IAAIq1D,EAAOrzD,UAAUC,OAAQ4K,EAAQ,IAAInH,MAAM2vD,EAAO,EAAIA,EAAO,EAAI,GAAIC,EAAO,EAAGA,EAAOD,EAAMC,IACnGzoD,EAAMyoD,EAAO,GAAKtzD,UAAUszD,GAG9B,KAAOzoD,EAAM5K,OAAS,GAAG,CACvB,IAAI2mD,EAAO/7C,EAAM0oD,QAEZv1D,EAAI4oD,KACP5oD,EAAI4oD,GAAQ,CAAC,GAGf5oD,EAAMA,EAAI4oD,EACZ,CACF,EAEAhpD,EAAOC,QAAUA,EAAQyB,O,uBClBzB1B,EAAOC,QAAU,SAAUsC,EAAO84B,GAChC,MAAO,CAAE94B,MAAOA,EAAO84B,KAAMA,EAC/B,C,cCLA,UAyBGlpB,OAhBC,EAAQ,CACJ,cAEK,0BADN,EAcI,SAAkBm/D,GAC7B,aAEA,IAAIC,EAAUD,EAAW9vE,OAAO,WAE5BuE,EAAQwrE,EAAQhwE,UAmCpB,OAjCAwE,EAAMyrE,aAAe,WACnBpwE,KAAKwa,EAAI,EACTxa,KAAKkY,EAAI,EACTlY,KAAKqwE,KAAO,EACZrwE,KAAKswE,gBAAiB,SAAU,aAClC,EAEA3rE,EAAM4rE,uBAAyB,SAAUjuB,GACvCA,EAAKiT,UAEL,IAAIib,EAAYluB,EAAKv4C,KAAK2rD,WAAa11D,KAAKywE,OAExCC,EAAiB1wE,KAAK2wE,QAAQ5mE,KAAK0T,WAAazd,KAAKywE,OACzC,IAAXzwE,KAAKwa,GAAWg2D,EAAYxwE,KAAKwa,EAAIk2D,IACxC1wE,KAAKwa,EAAI,EACTxa,KAAKkY,EAAIlY,KAAKqwE,MAGhB,IAAIj3C,EAAW,CACb5e,EAAGxa,KAAKwa,EACRtC,EAAGlY,KAAKkY,GAMV,OAHAlY,KAAKqwE,KAAO5nE,KAAKC,IAAK1I,KAAKqwE,KAAMrwE,KAAKkY,EAAIoqC,EAAKv4C,KAAK4rD,aACpD31D,KAAKwa,GAAKg2D,EAEHp3C,CACT,EAEAz0B,EAAMisE,kBAAoB,WACxB,MAAO,CAAEv4D,OAAQrY,KAAKqwE,KACxB,EAEOF,CAEP,GAvDa,8B,cCZb,yBACKp/D,IAMJ+4C,EAAUA,EAAQ12C,KAAK,KAAMrC,EAAQA,EAAOK,UAEZxS,EAAOC,QACtCirD,EAAQ,EAAQ,QAEhB,EAAO,CAAC,cAAqB,0BAAP,EAAF,GAAS,gCAM/B,CAlBA,CAkBmB,oBAAV/4C,OACRA,OAAS,EAAG,SAASA,EAAQK,EAAUy/D,GACvC,aAEA,GAAI9/D,EAAOsC,iBAAX,CAEA,IAAIy9D,EAAiB,6BACjBC,EAAY,mDACZC,EAAe,2DACfC,EAAa,aACbC,EAAML,EAAUK,IAMhBC,EAAY,CAEfjpB,UAAW,SAASl1C,EAASo+D,GAC5B,IAAI9jC,EAASt6B,EACTic,EAAajc,EAAQic,WAoBzB,OAlBKmiD,GAA0B,QAAbA,IAAwBniD,IAAcgiD,EAAW9sE,KAAK8qB,EAAW9L,UAAY,MAC9F8L,EAAaA,EAAWA,YAGT,QAAbmiD,IAED9jC,EADe,QAAb8jC,EACOp+D,EAAQ0W,uBACR0nD,IAAcniD,EAAW7M,SAAWrR,EAAO64C,UAC1C36B,EAAW7M,QACnB6M,EAAW7M,QAAQgvD,GACnBxnB,OAAO36B,GAAY7M,QAAQgvD,GAAW,KAI/BniD,GAIJqe,CACR,EAEA+jC,OAAQ,SAASr+D,GAChB,IAAIs+D,EAAUC,EACV7sB,EAhCG1zC,iBAgCUgC,EAhCa,OAAS,CAAC,EAiCpCmF,EAAUusC,EAAIvsC,SAAWusC,EAAIyK,WAC7BnwD,EAAM,CACT09D,IAAK1pD,EAAQw+D,qBAAuBx+D,EAAQ+R,aAAa,oBAqB1D,OAlBI/lB,EAAI09D,KAAOvkD,IAAYm5D,EAAWn5D,EAAQzU,MAAMqtE,MACnD/xE,EAAI09D,IAAM4U,EAAS,IAGjBtyE,EAAI09D,OACN6U,EAAYv+D,EAAQy+D,2BAA6Bz+D,EAAQ+R,aAAa,2BAErD5M,IAAYm5D,EAAWn5D,EAAQzU,MAAMstE,MACrDO,EAAYD,EAAS,IAGtBtyE,EAAIsuC,OAAS6jC,EAAUjpB,UAAUl1C,EAASu+D,IAI1CvyE,EAAI09D,IAAMhY,EAAIgtB,UAGR1yE,CACR,EAEA2yE,cAAe,SAAS3+D,GACvB,IAAIlC,EAAG4pB,EAAQk3C,EAAO5M,EAAOthE,EAAO0U,EAAOC,EACvCi1B,EAASt6B,EAAQic,WACjB4iD,EAAWvkC,GAAU2jC,EAAW9sE,KAAKmpC,EAAOnqB,UAAY,IAC1DmqB,EAAOhoB,iBAAiB,eACxB,CAACtS,GAGH,IAAIlC,EAAI,EAAGA,EAAI+gE,EAAS5wE,OAAQ6P,IAM/B,GAJA4pB,GADA1nB,EAAU6+D,EAAS/gE,IACFiU,aAAamsD,EAAIY,aAAe9+D,EAAQ+R,aAAa,WAAa/R,EAAQ+R,aAAa,kBAAoB/R,EAAQ+R,aAAa,kBAAoB,GACrK6sD,EAAQ5+D,EAAQ++D,UAAY/+D,EAAQ+R,aAAa,SACjD6sD,EAAQV,EAAIc,YAAYh/D,EAAQ+R,aAAa,eAAiB6sD,IAAUA,EAErEl3C,KAAYk3C,IAAU7gE,EAAO6K,YAAcA,WAAWg2D,IAAU,CAAC,GAAG/1D,SAAU,EAChFmpD,EAAQ10D,WAAW0C,EAAQ+R,aAAa,yBAGvCrhB,EAAQg3B,EAAOh3B,MAAMotE,IAGL,KAAZptE,EAAM,IACR0U,EAAQ1U,EAAM,GACd2U,EAAS3U,EAAM,KAEf0U,EAAQ1U,EAAM,GACd2U,EAAS3U,EAAM,KAGhB0U,EAAQpF,EAAQ+R,aAAa,SAC7B1M,EAASrF,EAAQ+R,aAAa,WAG/BigD,EAAQ5sD,EAAQC,GAGjB,KACD,CAGD,OAAO2sD,CACR,EAEAiN,cAAe,SAASj/D,EAASoF,GAChC,IAAI85D,EAAsBC,EAAYC,EAClCC,EAASryE,KAAKqxE,OAAOr+D,GACrB0pD,EAAM2V,EAAO3V,IACb4V,EAAUD,EAAO/kC,OAErB,MAAU,SAAPovB,IAA2B,WAAPA,GAA2B,SAAPA,KAAqByV,EAAanyE,KAAK2xE,cAAc3+D,KAI7Fs/D,EACFl6D,EAAQk6D,EAAQC,YAEhBD,EAAUt/D,EAGXo/D,EAAWh6D,EAED,SAAPskD,EACF0V,EAAWh6D,GAIP85D,EAAgB95D,EAFXk6D,EAAQzhE,gBAE+B,SAAP6rD,GAAkBwV,EAAeC,GAAuB,WAAPzV,GAAoBwV,EAAeC,KAC5HC,EAAWh6D,GAAS+5D,EAAaD,IAI5BE,GArBCh6D,CAsBT,GAGDy4D,EAAUM,UAAYA,EAEtB//D,EAASiC,iBAAiB,kBAAmB,SAAS5M,GACrD,IAAGA,EAAEsb,kBAAoBtb,EAAEkb,OAAOuH,UAAY2nD,EAA9C,CAEA,IAAI79D,EAAUvM,EAAErF,OAChBqF,EAAEkb,OAAOvJ,MAAQ+4D,EAAUc,cAAcj/D,EAASvM,EAAEkb,OAAOvJ,MAHK,CAIjE,EAtJoC,CAuJrC,E,2BC3KAvZ,EAAQE,YAAa,EACrBF,EAAiB,aAAS,EAE1B,IAAIo0C,EAAQ,EAAQ,MAEpB,SAASpG,EAAkBzrC,EAAQyK,GAAS,IAAK,IAAIiF,EAAI,EAAGA,EAAIjF,EAAM5K,OAAQ6P,IAAK,CAAE,IAAIg8B,EAAajhC,EAAMiF,GAAIg8B,EAAWvrC,WAAaurC,EAAWvrC,aAAc,EAAOurC,EAAW76B,cAAe,EAAU,UAAW66B,IAAYA,EAAW56B,UAAW,GAAM5S,OAAO4B,eAAeE,EAAQ0rC,EAAW7iC,IAAK6iC,EAAa,CAAE,CAI5T,IAAIzO,EAAY,SAASA,EAAUr/B,EAAKsuC,GACtC,GAAmB,iBAARtuC,GAA4B,OAARA,EAC7B,OAAOA,EAGT,IAAIwzE,EAAS,IAAIxzE,EAAIqB,YAErB,IAAK,IAAIyQ,KAAK9R,EACZ,GAAKA,EAAIiI,eAAe6J,GAAxB,CAIA,IAAI3P,EAAQnC,EAAI8R,GAGN,WAANA,GAA2B,iBAFb3P,EAGZmsC,IACFklC,EAAO1hE,GAAKw8B,GAGdklC,EAAO1hE,GADE3P,aAAiBuD,MACdvD,EAAM4B,IAAI,SAAU0vE,GAC9B,OAAOp0C,EAAUo0C,EAAGD,EACtB,GAEYn0C,EAAUl9B,EAAOqxE,EAd/B,CAkBF,OAAOA,CACT,EAEIhrD,EAAoB,WACtB,SAASA,EAAK3nB,QACM,IAAdA,IACFA,EAAO,CAAC,GAGVP,OAAO0V,OAAOhV,KAAMH,GACpBG,KAAK8pE,OAAS9pE,KAAK8pE,QAAU,CAAC,EAC9B9pE,KAAK8pE,OAAOE,OAAShqE,KAAK8pE,OAAOE,QAAU,GAC3ChqE,KAAK8pE,OAAOvmC,MAAQvjC,KAAK8pE,OAAOvmC,OAAS,EAC3C,CAEA,IA7CoB2J,EAAaC,EA6C7BC,EAAS5lB,EAAKrnB,UAoLlB,OAlLAitC,EAAOzyB,OAAS,WAMd,OALI3a,KAAKstC,QACPttC,KAAKstC,OAAOle,YAAYpvB,MAG1BA,KAAKstC,YAAS1pC,EACP5D,IACT,EAEAotC,EAAOzb,YAAc,WACnB,GAAI3xB,KAAKstC,OAAQ,CACf,IAAK,IAAIhkC,KAAStI,UAChBhB,KAAKstC,OAAO/uB,aAAave,KAAMgB,UAAUsI,IAG3CtJ,KAAK2a,QACP,CAEA,OAAO3a,IACT,EAEAotC,EAAOxiB,KAAO,WACZ,OAAO5qB,KAAKstC,OAAO1Z,GAAG5zB,KAAKstC,OAAOhkC,MAAMtJ,MAAQ,EAClD,EAEAotC,EAAOziB,KAAO,WACZ,OAAO3qB,KAAKstC,OAAO1Z,GAAG5zB,KAAKstC,OAAOhkC,MAAMtJ,MAAQ,EAClD,EAEAotC,EAAOslC,MAAQ,SAAeC,QACL,IAAnBA,IACFA,EAAY,CAAC,GAGf,IAAIH,EAASn0C,EAAUr+B,MAEvB,IAAK,IAAIsB,KAAQqxE,EACfH,EAAOlxE,GAAQqxE,EAAUrxE,GAG3B,OAAOkxE,CACT,EAYAplC,EAAOwlC,0BAA4B,SAAmCtxE,EAAMH,EAAO0xE,GAC5E7yE,KAAKyzC,OACRzzC,KAAKyzC,KAAO,CAAC,GAGf,IAAIq/B,EAAgB9yE,KAAKsB,GACrByxE,EAAkB/yE,KAAKyzC,KAAKnyC,GAChCtB,KAAKsB,GAAQwxE,EAAgB3xE,EAEzB4xE,GAAmBF,IAAiB1xE,EACtCnB,KAAKyzC,KAAKnyC,IAASyxE,GAAmBD,GAAiBD,SAEhD7yE,KAAKyzC,KAAKnyC,EAErB,EAWA8rC,EAAO4lC,qBAAuB,SAA8B1xE,EAAMH,EAAO0xE,GAClE7yE,KAAKyzC,OACRzzC,KAAKyzC,KAAO,CAAC,GAGfzzC,KAAKsB,GAAQH,EAEbnB,KAAKyzC,KAAKnyC,GAAQuxE,CACpB,EAUAzlC,EAAO6lC,yBAA2B,SAAkC3xE,EAAMH,GACxEnB,KAAKsB,GAAQH,EAETnB,KAAKyzC,aACAzzC,KAAKyzC,KAAKnyC,EAErB,EAQA8rC,EAAO2B,aAAe,SAAsBP,EAAM0kC,GAChD,GAAIlzE,KAAKsC,QAAUtC,KAAKsC,OAAOsN,OAAS5P,KAAKsC,OAAOyQ,IAClD,QAAI/S,KAAKsC,OAAOsN,MAAM4+B,KAAOA,GAIzBxuC,KAAKsC,OAAOyQ,IAAIy7B,KAAOA,GAIvBxuC,KAAKsC,OAAOsN,MAAM4+B,OAASA,GAAQxuC,KAAKsC,OAAOsN,MAAMsjE,OAASA,GAI9DlzE,KAAKsC,OAAOyQ,IAAIy7B,OAASA,GAAQxuC,KAAKsC,OAAOyQ,IAAImgE,OAASA,EAQlE,EAEA9lC,EAAOgd,kBAAoB,SAA2B9oD,GACpD,OAAOtB,KAAKyzC,MAAQzzC,KAAKyzC,KAAKnyC,IAAStB,KAAKsB,EAC9C,EAEA8rC,EAAOgG,cAAgB,WACrB,OAAO/jC,OAAOrP,KAAKoqD,kBAAkB,SACvC,EAEAhd,EAAOnqC,SAAW,WAChB,MAAO,CAACjD,KAAKmqD,eAAgBnqD,KAAKozC,gBAAiBpzC,KAAKqqD,eAAe5mD,KAAK,GAC9E,EA/LoBypC,EAiMP1lB,GAjMoB2lB,EAiMd,CAAC,CAClBljC,IAAK,iBACLzI,IAAK,WACH,IAAI2xE,EAAWnzE,KAAKyzC,MAAQzzC,KAAKyzC,KAAKq2B,QAAU9pE,KAAKyzC,KAAKq2B,OAAOE,OAMjE,YAJiBpmE,IAAbuvE,IACFA,EAAWnzE,KAAK8pE,QAAU9pE,KAAK8pE,OAAOE,QAGjCmJ,GAAY,EACrB,EACA1pE,IAAK,SAAaq4C,IAChB,EAAI7O,EAAMO,cAAcxzC,KAAM,OAAQ,UACtCA,KAAKyzC,KAAKq2B,OAAOE,OAASloB,CAC5B,GACC,CACD73C,IAAK,gBACLzI,IAAK,WACH,IAAI2xE,EAAWnzE,KAAKyzC,MAAQzzC,KAAKyzC,KAAKq2B,QAAU9pE,KAAKyzC,KAAKq2B,OAAOvmC,MAMjE,YAJiB3/B,IAAbuvE,IACFA,EAAWnzE,KAAK8pE,OAAOvmC,OAGlB4vC,GAAY,EACrB,EACA1pE,IAAK,SAAaq4C,IAChB,EAAI7O,EAAMO,cAAcxzC,KAAM,OAAQ,UACtCA,KAAKyzC,KAAKq2B,OAAOvmC,MAAQue,CAC3B,MA9N0EjV,EAAkBK,EAAY/sC,UAAWgtC,GAiO9G3lB,CACT,CAjMwB,GAmMxB3oB,EAAiB,QAAI2oB,EACrB5oB,EAAOC,QAAUA,EAAQyB,O,2BC7OzB,IAAI8S,EAAO,EAAQ,MACfrT,EAAO,EAAQ,MACfS,EAAW,EAAQ,MACnBC,EAAc,EAAQ,MACtB2yE,EAAwB,EAAQ,MAChC9rB,EAAoB,EAAQ,MAC5BjG,EAAgB,EAAQ,MACxBgyB,EAAc,EAAQ,IACtB3yE,EAAoB,EAAQ,KAC5B4yE,EAAgB,EAAQ,MAExB3yE,EAAaC,UAEb2yE,EAAS,SAAUC,EAASrqE,GAC9BnJ,KAAKwzE,QAAUA,EACfxzE,KAAKmJ,OAASA,CAChB,EAEIsqE,EAAkBF,EAAOpzE,UAE7BvB,EAAOC,QAAU,SAAU+M,EAAU8nE,EAAiBr+D,GACpD,IAMIy4B,EAAU6lC,EAAQrqE,EAAOrI,EAAQkI,EAAQyhB,EAAM8vB,EAN/CN,EAAO/kC,GAAWA,EAAQ+kC,KAC1Bw5B,KAAgBv+D,IAAWA,EAAQu+D,YACnCC,KAAex+D,IAAWA,EAAQw+D,WAClCC,KAAiBz+D,IAAWA,EAAQy+D,aACpCC,KAAiB1+D,IAAWA,EAAQ0+D,aACpCn6B,EAAKxmC,EAAKsgE,EAAiBt5B,GAG3B3lC,EAAO,SAAUu/D,GAEnB,OADIlmC,GAAUwlC,EAAcxlC,EAAU,UAC/B,IAAIylC,GAAO,EAAMS,EAC1B,EAEIC,EAAS,SAAU9yE,GACrB,OAAIyyE,GACFpzE,EAASW,GACF4yE,EAAcn6B,EAAGz4C,EAAM,GAAIA,EAAM,GAAIsT,GAAQmlC,EAAGz4C,EAAM,GAAIA,EAAM,KAChE4yE,EAAcn6B,EAAGz4C,EAAOsT,GAAQmlC,EAAGz4C,EAC9C,EAEA,GAAI0yE,EACF/lC,EAAWliC,EAASkiC,cACf,GAAIgmC,EACThmC,EAAWliC,MACN,CAEL,KADA+nE,EAASjzE,EAAkBkL,IACd,MAAM,IAAIjL,EAAWF,EAAYmL,GAAY,oBAE1D,GAAIwnE,EAAsBO,GAAS,CACjC,IAAKrqE,EAAQ,EAAGrI,EAASqmD,EAAkB17C,GAAW3K,EAASqI,EAAOA,IAEpE,IADAH,EAAS8qE,EAAOroE,EAAStC,MACX+3C,EAAcoyB,EAAiBtqE,GAAS,OAAOA,EAC7D,OAAO,IAAIoqE,GAAO,EACtB,CACAzlC,EAAWulC,EAAYznE,EAAU+nE,EACnC,CAGA,IADA/oD,EAAOipD,EAAYjoE,EAASgf,KAAOkjB,EAASljB,OACnC8vB,EAAO36C,EAAK6qB,EAAMkjB,IAAW7T,MAAM,CAC1C,IACE9wB,EAAS8qE,EAAOv5B,EAAKv5C,MACvB,CAAE,MAAO65B,GACPs4C,EAAcxlC,EAAU,QAAS9S,EACnC,CACA,GAAqB,iBAAV7xB,GAAsBA,GAAUk4C,EAAcoyB,EAAiBtqE,GAAS,OAAOA,CAC5F,CAAE,OAAO,IAAIoqE,GAAO,EACtB,C,2BCzDA,SAAS1xE,EAAyB7C,GAC9B,OAAOA,GAAOA,EAAID,WAAaC,EAAM,CACjCsB,QAAStB,EAEjB,CAdAM,OAAO4B,eAAerC,EAAS,aAAc,CACzCsC,OAAO,IAEX7B,OAAO4B,eAAerC,EAAS,UAAW,CACtC0C,YAAY,EACZC,IAAK,WACD,OAAOm0C,CACX,IAQJ,MAAMA,EAN8B9zC,EAAyB,EAAQ,MAMtCvB,O,2BCd/B,EAAQ,MACR,EAAQ,MACR,EAAQ,MACR,EAAQ,MACR,EAAQ,K,2BCLR,IAAIm2C,EAAa,EAAQ,MACrB3E,EAAQ,EAAQ,MAChBD,EAAc,EAAQ,MACtB5uC,EAAW,EAAQ,KACnBN,EAAO,aACPmhD,EAAc,EAAQ,MAEtBowB,EAAYz9B,EAAW9yC,SACvB+D,EAAS+uC,EAAW/uC,OACpB8+C,EAAW9+C,GAAUA,EAAOomC,SAC5B5qC,EAAM,YACNiE,EAAO0qC,EAAY3uC,EAAIiE,MACvB6+C,EAA2C,IAAlCkuB,EAAUpwB,EAAc,OAAmD,KAApCowB,EAAUpwB,EAAc,SAEtE0C,IAAa1U,EAAM,WAAcoiC,EAAU50E,OAAOknD,GAAY,GAIpE5nD,EAAOC,QAAUmnD,EAAS,SAAkBl4C,EAAQqmE,GAClD,IAAIz5D,EAAI/X,EAAKM,EAAS6K,IACtB,OAAOomE,EAAUx5D,EAAIy5D,IAAU,IAAOhtE,EAAKjE,EAAKwX,GAAK,GAAK,IAC5D,EAAIw5D,C,2BCrBJ50E,OAAO4B,eAAerC,EAAS,aAAc,CACzCsC,OAAO,IAEX,SAAiBC,EAAQC,GACrB,IAAI,IAAIC,KAAQD,EAAI/B,OAAO4B,eAAeE,EAAQE,EAAM,CACpDC,YAAY,EACZC,IAAKH,EAAIC,IAEjB,CACAG,CAAQ5C,EAAS,CACb0pB,IAAK,WACD,OAAOA,CACX,EACAjoB,QAAS,WACL,OAAOq1C,CACX,IAEJ,MAAM61B,EAA4B3pE,EAAyB,EAAQ,OACnE,SAASA,EAAyB7C,GAC9B,OAAOA,GAAOA,EAAID,WAAaC,EAAM,CACjCsB,QAAStB,EAEjB,CACA,IAAIo1E,EAAe,IAAIjnD,IACvB,SAASknD,EAAIp0E,EAAMq0E,EAAUrqE,GACF,oBAAZ7D,SAA2BA,QAAQomE,IAAIC,gBAC9CxiE,GAAOmqE,EAAa5pE,IAAIP,KACxBA,GAAKmqE,EAAav5D,IAAI5Q,GAC1ByY,QAAQC,KAAK,IACb2xD,EAASxiE,QAASmjD,GAAUvyC,QAAQC,KAAK1iB,EAAM,IAAKg1D,IACxD,CACA,SAAS1sC,EAAIg0B,GACT,OAAOivB,EAAYlrE,QAAQioB,IAAIg0B,EACnC,CACA,MAAM5G,EAAW,CACb,IAAA4+B,CAAMtqE,EAAKqqE,GACPD,EAAI7I,EAAYlrE,QAAQ+6D,KAAKmQ,EAAYlrE,QAAQytD,KAAK,YAAarpD,MAAM+H,QAAQxC,GAAO,CACpFA,GACA,CACAqqE,EACArqE,GAER,EACA,IAAA0Y,CAAM1Y,EAAKqqE,GACPD,EAAI7I,EAAYlrE,QAAQ+6D,KAAKmQ,EAAYlrE,QAAQotD,OAAO,YAAahpD,MAAM+H,QAAQxC,GAAO,CACtFA,GACA,CACAqqE,EACArqE,GAER,EACA,IAAAuqE,CAAMvqE,EAAKqqE,GACPD,EAAI7I,EAAYlrE,QAAQ+6D,KAAKmQ,EAAYlrE,QAAQm0E,QAAQ,YAAa/vE,MAAM+H,QAAQxC,GAAO,CACvFA,GACA,CACAqqE,EACArqE,GAER,E,2BC1DJ,IAAI5F,EAAI,EAAQ,MACZqwE,EAAU,YACVtjC,EAAsB,EAAQ,MAC9BujC,EAAiB,EAAQ,MAU7BtwE,EAAE,CAAEjD,OAAQ,QAASuD,OAAO,EAAMC,QATpB,EAAQ,OAIO+vE,EAAiB,IAAMA,EAAiB,KACzCvjC,EAAoB,WAII,CAClDn8B,OAAQ,SAAgBnQ,GACtB,IAAI7D,EAASD,UAAUC,OACvB,OAAOyzE,EAAQ10E,KAAM8E,EAAY7D,EAAQA,EAAS,EAAID,UAAU,QAAK4C,EACvE,G,2BCjBF,IAAIkuC,EAAQ,EAAQ,MAEpBlzC,EAAOC,SAAWizC,EAAM,WAEtB,OAAOxyC,OAAOs1E,aAAat1E,OAAOu1E,kBAAkB,CAAC,GACvD,E,2BCLA,IAAIxwE,EAAI,EAAQ,MACZywE,EAAQ,aAKZzwE,EAAE,CAAEjD,OAAQ,SAAUuD,OAAO,EAAMC,OAJN,EAAQ,IAIMmwE,CAAuB,SAAW,CAC3EpyE,KAAM,WACJ,OAAOmyE,EAAM90E,KACf,G,2BCTF,IAAID,EAAO,EAAQ,MACfmJ,EAAW,EAAQ,IACnB8rE,EAAW,EAAQ,KACnB3uB,EAAY,EAAQ,MACpB4uB,EAAsB,EAAQ,MAC9Bj0B,EAAkB,EAAQ,MAE1BrgD,EAAaC,UACbs0E,EAAel0B,EAAgB,eAInCpiD,EAAOC,QAAU,SAAU09C,EAAO+sB,GAChC,IAAKpgE,EAASqzC,IAAUy4B,EAASz4B,GAAQ,OAAOA,EAChD,IACIpzC,EADAgsE,EAAe9uB,EAAU9J,EAAO24B,GAEpC,GAAIC,EAAc,CAGhB,QAFavxE,IAAT0lE,IAAoBA,EAAO,WAC/BngE,EAASpJ,EAAKo1E,EAAc54B,EAAO+sB,IAC9BpgE,EAASC,IAAW6rE,EAAS7rE,GAAS,OAAOA,EAClD,MAAM,IAAIxI,EAAW,0CACvB,CAEA,YADaiD,IAAT0lE,IAAoBA,EAAO,UACxB2L,EAAoB14B,EAAO+sB,EACpC,C,2BCxBA,IAAIv3B,EAAS,EAAQ,MACjBpzC,EAAa,EAAQ,MACrBmmD,EAAW,EAAQ,MACnBqN,EAAY,EAAQ,MACpBzL,EAA2B,EAAQ,MAEnCr/C,EAAW8qD,EAAU,YACrB5M,EAAUjmD,OACVumD,EAAkBN,EAAQplD,UAK9BvB,EAAOC,QAAU6nD,EAA2BnB,EAAQz9C,eAAiB,SAAUkT,GAC7E,IAAI/R,EAAS67C,EAAS9pC,GACtB,GAAI+2B,EAAO9oC,EAAQ5B,GAAW,OAAO4B,EAAO5B,GAC5C,IAAIhH,EAAc4I,EAAO5I,YACzB,OAAI1B,EAAW0B,IAAgB4I,aAAkB5I,EACxCA,EAAYF,UACZ8I,aAAkBs8C,EAAUM,EAAkB,IACzD,C,2BCpBA,IAAI/T,EAAQ,EAAQ,MAChBnzC,EAAa,EAAQ,MAErBmxE,EAAc,kBAEd/oB,EAAW,SAAUquB,EAASC,GAChC,IAAIl0E,EAAQ0I,EAAKmyC,EAAUo5B,IAC3B,OAAOj0E,IAAUm0E,GACbn0E,IAAUo0E,IACV52E,EAAW02E,GAAavjC,EAAMujC,KAC5BA,EACR,EAEIr5B,EAAY+K,EAAS/K,UAAY,SAAUluC,GAC7C,OAAOuB,OAAOvB,GAAQ3K,QAAQ2sE,EAAa,KAAKh6D,aAClD,EAEIjM,EAAOk9C,EAASl9C,KAAO,CAAC,EACxB0rE,EAASxuB,EAASwuB,OAAS,IAC3BD,EAAWvuB,EAASuuB,SAAW,IAEnC12E,EAAOC,QAAUkoD,C,uBCrBjB,IAAIpmD,EAAaC,UAEjBhC,EAAOC,QAAU,SAAU22E,EAAQ9d,GACjC,GAAI8d,EAAS9d,EAAU,MAAM,IAAI/2D,EAAW,wBAC5C,OAAO60E,CACT,C,2BCJA32E,EAAQE,YAAa,EACrBF,EAAiB,aAAS,EAE1B,IAkCI42E,EAAoBC,EAlCpB7gC,EAAQ7B,EAAuB,EAAQ,OAEvC6gB,EAAY7gB,EAAuB,EAAQ,OAE3CugB,EAAavgB,EAAuB,EAAQ,MAE5CygB,EAAWzgB,EAAuB,EAAQ,MAE1C0gB,EAAM1gB,EAAuB,EAAQ,OAErC+gB,EAAO/gB,EAAuB,EAAQ,KAEtC8gB,EAAU9gB,EAAuB,EAAQ,OAEzC4gB,EAAU5gB,EAAuB,EAAQ,OAEzCsgB,EAAa/mB,EAAwB,EAAQ,OAE7CynB,EAAahhB,EAAuB,EAAQ,OAE5CwgB,EAAcxgB,EAAuB,EAAQ,OAE7C2gB,EAAW3gB,EAAuB,EAAQ,OAE1C2iC,EAAiB3iC,EAAuB,EAAQ,OAEhD4iC,EAAYrpC,EAAwB,EAAQ,OAE5CspC,EAAStpC,EAAwB,EAAQ,OAEzChmC,EAAQgmC,EAAwB,EAAQ,OAExC0G,EAAQ,EAAQ,MAIpB,SAAS/G,IAA6B,GAAuB,mBAAZM,QAAwB,OAAO,KAAM,IAAIP,EAAQ,IAAIO,QAA6F,OAAlFN,EAA2B,WAAsC,OAAOD,CAAO,EAAUA,CAAO,CAEjN,SAASM,EAAwBvtC,GAAO,GAAIA,GAAOA,EAAID,WAAc,OAAOC,EAAO,GAAY,OAARA,GAA+B,iBAARA,GAAmC,mBAARA,EAAsB,MAAO,CAAE,QAAWA,GAAS,IAAIitC,EAAQC,IAA4B,GAAID,GAASA,EAAMzhC,IAAIxL,GAAQ,OAAOitC,EAAMzqC,IAAIxC,GAAQ,IAAImtC,EAAS,CAAC,EAAOC,EAAwB9sC,OAAO4B,gBAAkB5B,OAAO+sC,yBAA0B,IAAK,IAAIpiC,KAAOjL,EAAO,GAAIM,OAAOa,UAAU8G,eAAelH,KAAKf,EAAKiL,GAAM,CAAE,IAAIqiC,EAAOF,EAAwB9sC,OAAO+sC,yBAAyBrtC,EAAKiL,GAAO,KAAUqiC,IAASA,EAAK9qC,KAAO8qC,EAAK7iC,KAAQnK,OAAO4B,eAAeirC,EAAQliC,EAAKqiC,GAAgBH,EAAOliC,GAAOjL,EAAIiL,EAAQ,CAAoE,OAAhEkiC,EAAgB,QAAIntC,EAASitC,GAASA,EAAMxiC,IAAIzK,EAAKmtC,GAAkBA,CAAQ,CAE3uB,SAAS6G,EAAuBh0C,GAAO,OAAOA,GAAOA,EAAID,WAAaC,EAAM,CAAE,QAAWA,EAAO,CAEhG,SAAS6tC,EAAkBzrC,EAAQyK,GAAS,IAAK,IAAIiF,EAAI,EAAGA,EAAIjF,EAAM5K,OAAQ6P,IAAK,CAAE,IAAIg8B,EAAajhC,EAAMiF,GAAIg8B,EAAWvrC,WAAaurC,EAAWvrC,aAAc,EAAOurC,EAAW76B,cAAe,EAAU,UAAW66B,IAAYA,EAAW56B,UAAW,GAAM5S,OAAO4B,eAAeE,EAAQ0rC,EAAW7iC,IAAK6iC,EAAa,CAAE,CAI5T,IAAIgpC,IAAqBL,EAAqB,CAAC,GAAsBI,EAAO1W,QAAS,EAAMsW,EAAmBI,EAAOE,KAAM,EAAMN,EAAmBI,EAAOG,OAAQ,EAAMP,EAAmBI,EAAOI,UAAW,EAAMR,EAAmBI,EAAOK,MAAO,EAAMT,GACvPU,EAA0B72E,OAAO0V,OAAO,CAAC,EAAG8gE,IAAoBJ,EAAiB,CAAC,GAAkBG,EAAO1iB,UAAW,EAAMuiB,IAEhI,SAASU,EAAWC,GAClB,MAAO,CACL7nC,KAAM6nC,EAAMT,EAAUU,OAAOC,YAC7BrD,OAAQmD,EAAMT,EAAUU,OAAOE,WAEnC,CAEA,SAASC,EAASJ,GAChB,MAAO,CACL7nC,KAAM6nC,EAAMT,EAAUU,OAAOI,UAC7BxD,OAAQmD,EAAMT,EAAUU,OAAOK,SAEnC,CAEA,SAASC,EAAUC,EAAWC,EAAaC,EAASC,GAClD,MAAO,CACLpnE,MAAO,CACL4+B,KAAMqoC,EACN3D,OAAQ4D,GAEV/jE,IAAK,CACHy7B,KAAMuoC,EACN7D,OAAQ8D,GAGd,CAEA,SAASC,EAAeZ,GACtB,OAAOO,EAAUP,EAAMT,EAAUU,OAAOC,YAAaF,EAAMT,EAAUU,OAAOE,WAAYH,EAAMT,EAAUU,OAAOI,UAAWL,EAAMT,EAAUU,OAAOK,SACnJ,CAEA,SAASO,EAAmBC,EAAYC,GACtC,GAAKD,EAIL,OAAOP,EAAUO,EAAWvB,EAAUU,OAAOC,YAAaY,EAAWvB,EAAUU,OAAOE,WAAYY,EAASxB,EAAUU,OAAOI,UAAWU,EAASxB,EAAUU,OAAOK,SACnK,CAEA,SAASU,EAAazoC,EAAMgZ,GAC1B,IAAIzmD,EAAQytC,EAAKgZ,GAEjB,GAAqB,iBAAVzmD,EAaX,OAT6B,IAAzBA,EAAM+P,QAAQ,SAChB,EAAI+hC,EAAMO,cAAc5E,EAAM,QAC9BA,EAAKgZ,IAAQ,EAAI3U,EAAMqkC,OAAOn2E,QAENyC,IAApBgrC,EAAK6E,KAAKmU,KACZhZ,EAAK6E,KAAKmU,GAAQzmD,IAIfytC,CACT,CAEA,SAAS2oC,EAAUhtE,EAAO+3C,GAIxB,IAHA,IAAIxxC,GAAK,EACL28B,EAAU,IAE+B,KAArC38B,EAAIvG,EAAM2G,QAAQoxC,EAAMxxC,EAAI,KAClC28B,EAAQ/iC,KAAKoG,GAGf,OAAO28B,CACT,CASA,IAAI+pC,EAAsB,WACxB,SAASA,EAAO/iC,EAAMp/B,QACC,IAAjBA,IACFA,EAAU,CAAC,GAGbrV,KAAKy0C,KAAOA,EACZz0C,KAAKqV,QAAU/V,OAAO0V,OAAO,CAC3B+/B,OAAO,EACP0iC,MAAM,GACLpiE,GACHrV,KAAKo5B,SAAW,EAChBp5B,KAAK0kD,IAA2B,iBAAd1kD,KAAKy0C,KAAoBz0C,KAAKy0C,KAAOz0C,KAAKy0C,KAAKpH,SACjErtC,KAAK61E,QAAS,EAAID,EAAmB,SAAG,CACtClxB,IAAK1kD,KAAK0kD,IACV1pB,MAAOh7B,KAAK03E,kBACZD,KAAMz3E,KAAKqV,QAAQoiE,OAErB,IAAIE,EAAaT,EAAmBl3E,KAAK61E,OAAO,GAAI71E,KAAK61E,OAAO71E,KAAK61E,OAAO50E,OAAS,IACrFjB,KAAK6F,KAAO,IAAIgvC,EAAe,QAAE,CAC/BvyC,OAAQq1E,IAEV33E,KAAK6F,KAAK+xE,eAAiB53E,KAAK03E,kBAChC,IAAIrqC,EAAW,IAAIwmB,EAAmB,QAAE,CACtCvxD,OAAQ,CACNsN,MAAO,CACL4+B,KAAM,EACN0kC,OAAQ,MAIdlzE,KAAK6F,KAAK0jB,OAAO8jB,GACjBrtC,KAAKoc,QAAUixB,EACfrtC,KAAK63E,MACP,CAEA,IArHoB3qC,EAAaC,EAqH7BC,EAASoqC,EAAOr3E,UAgjCpB,OA9iCAitC,EAAOsqC,gBAAkB,WACvB,IAAI53E,EAAQE,KAEZ,OAAO,SAAUi1D,EAAS6iB,GACxB,MAA0B,iBAAfh4E,EAAM20C,KACR,IAAI79B,MAAMq+C,GAGZn1D,EAAM20C,KAAKzZ,MAAMi6B,EAAS6iB,EACnC,CACF,EAEA1qC,EAAOimB,UAAY,WACjB,IAAIxJ,EAAO,GACPkuB,EAAgB/3E,KAAKg4E,UAGzB,IAFAh4E,KAAKo5B,WAEEp5B,KAAKo5B,SAAWp5B,KAAK61E,OAAO50E,QAAUjB,KAAKg4E,UAAUpC,EAAUU,OAAO7jB,QAAUojB,EAAOoC,aAC5FpuB,EAAKn/C,KAAK1K,KAAKg4E,WACfh4E,KAAKo5B,WAGP,GAAIp5B,KAAKg4E,UAAUpC,EAAUU,OAAO7jB,QAAUojB,EAAOoC,YACnD,OAAOj4E,KAAKk4E,SAAS,yBAA0Bl4E,KAAKg4E,UAAUpC,EAAUU,OAAO6B,YAGjF,IAAIxrC,EAAMkd,EAAK5oD,OACX2tC,EAAO,CACTtsC,OAAQs0E,EAAUmB,EAAc,GAAIA,EAAc,GAAI/3E,KAAKg4E,UAAU,GAAIh4E,KAAKg4E,UAAU,IACxFI,YAAaL,EAAcnC,EAAUU,OAAO6B,YAG9C,GAAY,IAARxrC,KAAe,CAACkpC,EAAOwC,MAAMnnE,QAAQ24C,EAAK,GAAG+rB,EAAUU,OAAO7jB,OAChE,OAAOzyD,KAAKk4E,SAAS,YAAaruB,EAAK,GAAG+rB,EAAUU,OAAO6B,YAS7D,IANA,IAAI1vD,EAAM,EACN6vD,EAAc,GACdC,EAAgB,GAChBC,EAAY,KACZC,GAA4B,EAEzBhwD,EAAMkkB,GAAK,CAChB,IAAI0pC,EAAQxsB,EAAKphC,GACbtQ,EAAUnY,KAAKmY,QAAQk+D,GACvBzrD,EAAOi/B,EAAKphC,EAAM,GAEtB,OAAQ4tD,EAAMT,EAAUU,OAAO7jB,OAC7B,KAAKojB,EAAO1W,MASV,GAFAsZ,GAA4B,EAExBz4E,KAAKqV,QAAQ0/B,MACf,MAGF,GAAIyjC,EAAW,EACb,EAAIvlC,EAAMO,cAAc5E,EAAM,SAAU4pC,GACxC,IAAIE,EAAc9pC,EAAKk7B,OAAO0O,GAAWj1C,OAAS,GAClDqL,EAAKk7B,OAAO0O,GAAWj1C,MAAQm1C,EAAcvgE,EAC7C,IAAIwgE,GAAkB,EAAI1lC,EAAM2lC,SAAShqC,EAAM,OAAQ,SAAU4pC,EAAW,UAAY,KAEpFG,IACF/pC,EAAK6E,KAAKq2B,OAAO0O,GAAWj1C,MAAQo1C,EAAkBxgE,EAE1D,MACEmgE,GAA4BngE,EAC5BogE,GAAgCpgE,EAGlC,MAEF,KAAK09D,EAAOgD,SACNjuD,EAAKgrD,EAAUU,OAAO7jB,QAAUojB,EAAOiD,QACzClqC,EAAK67B,SAAWtyD,EAChBqgE,EAAY,YACD5pC,EAAK0a,YAA2B,cAAdkvB,GAA8BC,KAA8B7tD,IACrF0tD,KACF,EAAIrlC,EAAMO,cAAc5E,EAAM,SAAU,aACxCA,EAAKk7B,OAAOzW,UAAU2W,OAASsO,EAC/BA,EAAc,IAGZC,KACF,EAAItlC,EAAMO,cAAc5E,EAAM,OAAQ,SAAU,aAChDA,EAAK6E,KAAKq2B,OAAOzW,UAAU2W,OAASsO,EACpCC,EAAgB,IAGlB3pC,EAAK0a,WAAa1a,EAAK0a,WAAa,IAAMnxC,GAC3B,EAAI86B,EAAM2lC,SAAShqC,EAAM,OAAQ,eAG9CA,EAAK6E,KAAK6V,WAAanxC,GAGzBqgE,EAAY,aAGdC,GAA4B,EAC5B,MAEF,KAAK5C,EAAOkD,OACV,GAAkB,UAAdP,EAAuB,CACzB,IAAIQ,GAAc,EAAI/lC,EAAM2lC,SAAShqC,EAAM,OAAQ,SACnDA,EAAKztC,OAAS,IAEV63E,IACFpqC,EAAK6E,KAAKtyC,MAAQ63E,EAAc,KAGlC,KACF,CAIF,KAAKnD,EAAOoD,MACNruD,EAAKgrD,EAAUU,OAAO7jB,QAAUojB,EAAOiD,SACzClqC,EAAK67B,SAAWtyD,EAChBqgE,EAAY,YAGdC,GAA4B,EAC5B,MAEF,KAAK5C,EAAOziB,WAMV,GALgB,MAAZj7C,GAAmByS,EAAKgrD,EAAUU,OAAO7jB,QAAUojB,EAAOiD,SAC5DlqC,EAAK67B,SAAWtyD,EAChBqgE,EAAY,YAGE,MAAZrgE,EAAiB,CACnBsgE,GAA4B,EAC5B,KACF,CAEI7tD,EAAKgrD,EAAUU,OAAO7jB,QAAUojB,EAAOiD,QACzClqC,EAAK67B,SAAWtyD,EAChBqgE,EAAY,YACF5pC,EAAK0a,WAAc1a,EAAKykB,YAClCzkB,EAAK0a,WAAY,GAGnBmvB,GAA4B,EAC5B,MAEF,KAAK5C,EAAOwC,KACV,GAAIztD,GAA+B,MAAvB5qB,KAAKmY,QAAQyS,IAAiBi/B,EAAKphC,EAAM,IAAMohC,EAAKphC,EAAM,GAAGmtD,EAAUU,OAAO7jB,QAAUojB,EAAOiD,SAC1GlqC,EAAK67B,WAAa77B,EAAK0a,UACtB1a,EAAK0a,UAAYnxC,EACjBqgE,EAAY,iBACP,IAAK5pC,EAAKykB,WAA2B,cAAdmlB,IAA8BC,EACtDH,KACF,EAAIrlC,EAAMO,cAAc5E,EAAM,SAAU,aACxCA,EAAKk7B,OAAOzW,UAAU2W,OAASsO,EAC/BA,EAAc,IAGZC,KACF,EAAItlC,EAAMO,cAAc5E,EAAM,OAAQ,SAAU,aAChDA,EAAK6E,KAAKq2B,OAAOzW,UAAU2W,OAASuO,EACpCA,EAAgB,IAGlB3pC,EAAKykB,WAAazkB,EAAKykB,WAAa,IAAMl7C,GAE1B,EAAI86B,EAAM2lC,SAAShqC,EAAM,OAAQ,eAG/CA,EAAK6E,KAAK4f,WAAal7C,GAGzBqgE,EAAY,iBACP,IAAK5pC,EAAKztC,OAAwB,KAAfytC,EAAKztC,OAA8B,UAAdq3E,IAA0BC,EAA2B,CAClG,IAAIS,GAAa,EAAIjmC,EAAMqkC,OAAOn/D,GAE9BghE,GAAe,EAAIlmC,EAAM2lC,SAAShqC,EAAM,OAAQ,UAAY,GAE5DkO,EAAWlO,EAAKztC,OAAS,GAC7BytC,EAAKztC,MAAQ27C,EAAWo8B,EACxBtqC,EAAKw5B,UAAY,MAEb8Q,IAAe/gE,GAAWghE,MAC5B,EAAIlmC,EAAMO,cAAc5E,EAAM,QAC9BA,EAAK6E,KAAKtyC,OAASg4E,GAAgBr8B,GAAY3kC,GAGjDqgE,EAAY,OACd,KAAO,CACL,IAAI7N,EAA0B,MAAZxyD,GAA+B,MAAZA,GAEhCy2B,EAAKztC,OAAwB,KAAfytC,EAAKztC,QAAkBytC,EAAKw5B,YAAaqQ,GAqBjD7pC,EAAKztC,OAAwB,KAAfytC,EAAKztC,SAC5Bq3E,EAAY,QACZ5pC,EAAKztC,OAASgX,EAEVy2B,EAAK6E,KAAKtyC,QACZytC,EAAK6E,KAAKtyC,OAASgX,KAzBrBy2B,EAAK+7B,YAAcA,EAEdA,GAA2B,MAAZxyD,KAClB,EAAI86B,EAAMO,cAAc5E,EAAM,QAC9BA,EAAK6E,KAAK2lC,gBAAkBjhE,GAG9BqgE,EAAY,cAERF,KACF,EAAIrlC,EAAMO,cAAc5E,EAAM,SAAU,eACxCA,EAAKk7B,OAAOa,YAAYX,OAASsO,EACjCA,EAAc,IAGZC,KACF,EAAItlC,EAAMO,cAAc5E,EAAM,OAAQ,SAAU,eAChDA,EAAK6E,KAAKq2B,OAAOa,YAAYX,OAASuO,EACtCA,EAAgB,IAUtB,CAEAE,GAA4B,EAC5B,MAEF,KAAK5C,EAAO5sB,IACV,IAAKra,EAAKykB,YAAczkB,EAAK67B,SAC3B,OAAOzqE,KAAKg7B,MAAM,sEAAuE,CACvF1xB,MAAO+sE,EAAMT,EAAUU,OAAO6B,aAIlC,IAAI5P,GAAiB,EAAIjV,EAAWqU,eAAexvD,GAC/CkwD,EAAYE,EAAeF,UAC3BD,EAAYG,EAAeH,UAE/Bx5B,EAAKztC,MAAQknE,EACbz5B,EAAKw5B,UAAYA,EACjBoQ,EAAY,SACZ,EAAIvlC,EAAMO,cAAc5E,EAAM,QAC9BA,EAAK6E,KAAKtyC,MAAQgX,EAClBsgE,GAA4B,EAC5B,MAEF,KAAK5C,EAAOiD,OACV,IAAKlqC,EAAKykB,UACR,OAAOrzD,KAAKk4E,SAAS,YAAa7B,EAAMT,EAAUU,OAAO6B,WAAYhgE,GAGvE,GAAIy2B,EAAKztC,MACP,OAAOnB,KAAKg7B,MAAM,yDAA0D,CAC1E1xB,MAAO+sE,EAAMT,EAAUU,OAAO6B,aAIlCvpC,EAAK67B,SAAW77B,EAAK67B,SAAW77B,EAAK67B,SAAWtyD,EAAUA,EAC1DqgE,EAAY,WACZC,GAA4B,EAC5B,MAEF,KAAK5C,EAAO1iB,QACV,GAAIqlB,EACF,GAAIC,GAA6B7tD,GAAQA,EAAKgrD,EAAUU,OAAO7jB,QAAUojB,EAAO1W,OAAuB,gBAAdqZ,EAA6B,CACpH,IAAIa,GAAc,EAAIpmC,EAAM2lC,SAAShqC,EAAM,SAAU4pC,EAAW,UAAY,GACxEc,GAAiB,EAAIrmC,EAAM2lC,SAAShqC,EAAM,OAAQ,SAAU4pC,EAAW,UAAYa,GACvF,EAAIpmC,EAAMO,cAAc5E,EAAM,OAAQ,SAAU4pC,GAChD5pC,EAAK6E,KAAKq2B,OAAO0O,GAAWj1C,MAAQ+1C,EAAiBnhE,CACvD,KAAO,CACL,IAAIohE,EAAY3qC,EAAK4pC,IAAc,GAC/BgB,GAAe,EAAIvmC,EAAM2lC,SAAShqC,EAAM,OAAQ4pC,IAAce,GAClE,EAAItmC,EAAMO,cAAc5E,EAAM,QAC9BA,EAAK6E,KAAK+kC,GAAagB,EAAerhE,CACxC,MAEAogE,GAAgCpgE,EAGlC,MAEF,QACE,OAAOnY,KAAKg7B,MAAM,eAAkB7iB,EAAU,WAAa,CACzD7O,MAAO+sE,EAAMT,EAAUU,OAAO6B,aAIpC1vD,GACF,CAEA4uD,EAAazoC,EAAM,aACnByoC,EAAazoC,EAAM,aACnB5uC,KAAKquC,QAAQ,IAAIilB,EAAoB,QAAE1kB,IACvC5uC,KAAKo5B,UACP,EAeAgU,EAAOqsC,gCAAkC,SAAyCC,GAC5EA,EAAe,IACjBA,EAAe15E,KAAK61E,OAAO50E,QAG7B,IAAI04E,EAAgB35E,KAAKo5B,SACrB6T,EAAQ,GACRkyB,EAAQ,GACRka,OAAcz1E,EAElB,GACE,GAAIkyE,EAAkB91E,KAAKg4E,UAAUpC,EAAUU,OAAO7jB,OAC/CzyD,KAAKqV,QAAQ0/B,QAChBoqB,GAASn/D,KAAKmY,gBAEX,GAAInY,KAAKg4E,UAAUpC,EAAUU,OAAO7jB,QAAUojB,EAAO1iB,QAAS,CACnE,IAAI2W,EAAS,CAAC,EAEV3K,IACF2K,EAAOE,OAAS7K,EAChBA,EAAQ,IAGVka,EAAc,IAAI5lB,EAAkB,QAAE,CACpCtyD,MAAOnB,KAAKmY,UACZ7V,OAAQ20E,EAAej3E,KAAKg4E,WAC5BI,YAAap4E,KAAKg4E,UAAUpC,EAAUU,OAAO6B,WAC7CrO,OAAQA,IAEV78B,EAAMviC,KAAK2uE,EACb,UACSr5E,KAAKo5B,SAAWsgD,GAE3B,GAAIva,EACF,GAAIka,EACFA,EAAYvP,OAAOvmC,MAAQ47B,OACtB,IAAKn/D,KAAKqV,QAAQ0/B,MAAO,CAC9B,IAAI6kC,EAAa55E,KAAK61E,OAAO8D,GACzBE,EAAY75E,KAAK61E,OAAO71E,KAAKo5B,SAAW,GAC5C6T,EAAMviC,KAAK,IAAIopD,EAAiB,QAAE,CAChC3yD,MAAO,GACPmB,OAAQs0E,EAAUgD,EAAWhE,EAAUU,OAAOC,YAAaqD,EAAWhE,EAAUU,OAAOE,WAAYqD,EAAUjE,EAAUU,OAAOI,UAAWmD,EAAUjE,EAAUU,OAAOK,UACpKyB,YAAawB,EAAWhE,EAAUU,OAAO6B,WACzCrO,OAAQ,CACNE,OAAQ7K,EACR57B,MAAO,MAGb,CAGF,OAAO0J,CACT,EAOAG,EAAO0sC,8BAAgC,SAAuC7sC,EAAO8sC,GACnF,IAAIzqC,EAAStvC,UAEc,IAAvB+5E,IACFA,GAAgB,GAGlB,IAAI5a,EAAQ,GACRgU,EAAW,GAkBf,OAjBAlmC,EAAMn7B,QAAQ,SAAU3C,GACtB,IAAImpE,EAAchpC,EAAO0qC,WAAW7qE,EAAE26D,OAAOE,OAAQ+P,GAEjD5vB,EAAiB7a,EAAO0qC,WAAW7qE,EAAEg7C,eAAgB4vB,GAEzD5a,GAASmZ,EAAchpC,EAAO0qC,WAAW7qE,EAAE26D,OAAOvmC,MAAOw2C,GAAwC,IAAvBzB,EAAYr3E,QACtFkyE,GAAYmF,EAAcnpE,EAAEhO,MAAQmuC,EAAO0qC,WAAW7qE,EAAEk7C,cAAe0vB,GAA2C,IAA1B5vB,EAAelpD,OACzG,GAEIkyE,IAAahU,IACfgU,OAAWvvE,GAGA,CACXu7D,MAAOA,EACPgU,SAAUA,EAGd,EAEA/lC,EAAO6sC,kBAAoB,SAA2B7gD,GAKpD,YAJsB,IAAlBA,IACFA,EAAWp5B,KAAKo5B,UAGXp5B,KAAK61E,OAAOz8C,EAAW,IAAMp5B,KAAK61E,OAAOz8C,EAAW,GAAGw8C,EAAUU,OAAO7jB,QAAUojB,EAAOqE,OAASl6E,KAAK61E,OAAOz8C,EAAW,IAAMp5B,KAAK61E,OAAOz8C,EAAW,GAAGw8C,EAAUU,OAAO7jB,QAAUojB,EAAOwC,MAAQr4E,KAAK61E,OAAOz8C,EAAW,IAAMp5B,KAAK61E,OAAOz8C,EAAW,GAAGw8C,EAAUU,OAAO7jB,QAAUojB,EAAOqE,KACrS,EAEA9sC,EAAO+sC,gBAAkB,WACvB,GAAIn6E,KAAKi6E,oBAAqB,CAC5B,IAAIG,EAAUp6E,KAAKmY,QAAQnY,KAAK61E,OAAO71E,KAAKo5B,SAAW,IACnD93B,GAAO,EAAI2xC,EAAMqkC,OAAO8C,GAAStkE,cACjC29B,EAAO,CAAC,EAERnyC,IAAS84E,IACX3mC,EAAKtyC,MAAQ,IAAMi5E,EAAU,KAG/B,IAAIxrC,EAAO,IAAI4kB,EAAqB,QAAE,CACpCryD,MAAO,IAAMG,EAAO,IACpBgB,OAAQs0E,EAAU52E,KAAKg4E,UAAUpC,EAAUU,OAAOC,YAAav2E,KAAKg4E,UAAUpC,EAAUU,OAAOE,WAAYx2E,KAAK61E,OAAO71E,KAAKo5B,SAAW,GAAGw8C,EAAUU,OAAOI,UAAW12E,KAAK61E,OAAO71E,KAAKo5B,SAAW,GAAGw8C,EAAUU,OAAOK,UACtNyB,YAAap4E,KAAKg4E,UAAUpC,EAAUU,OAAO6B,WAC7C1kC,KAAMA,IAGR,OADAzzC,KAAKo5B,SAAWp5B,KAAKo5B,SAAW,EACzBwV,CACT,CACE5uC,KAAKq6E,YAET,EAEAjtC,EAAOgmB,WAAa,WAClB,IAAI3jB,EAASzvC,KAEb,GAAuB,MAAnBA,KAAKmY,UACP,OAAOnY,KAAKspD,YAId,IAAIgxB,EAAkBt6E,KAAKu6E,0BAA0Bv6E,KAAKo5B,UAE1D,KAAIkhD,EAAkB,GAAKt6E,KAAK61E,OAAOyE,GAAiB1E,EAAUU,OAAO7jB,QAAUojB,EAAO2E,OAA1F,CA0BA,IAOI5rC,EAPAgrC,EAAa55E,KAAKg4E,UAClByC,OAAiC72E,EAsBrC,GApBI02E,EAAkBt6E,KAAKo5B,WACzBqhD,EAAiCz6E,KAAKy5E,gCAAgCa,IAKpEt6E,KAAKi6E,oBACPrrC,EAAO5uC,KAAKm6E,kBACHn6E,KAAKg4E,UAAUpC,EAAUU,OAAO7jB,QAAUojB,EAAOziB,YAC1DxkB,EAAO,IAAI4kB,EAAqB,QAAE,CAChCryD,MAAOnB,KAAKmY,UACZ7V,OAAQ20E,EAAej3E,KAAKg4E,WAC5BI,YAAap4E,KAAKg4E,UAAUpC,EAAUU,OAAO6B,aAE/Cn4E,KAAKo5B,YACI08C,EAAkB91E,KAAKg4E,UAAUpC,EAAUU,OAAO7jB,QACjDgoB,GACVz6E,KAAKq6E,aAGHzrC,GACF,GAAI6rC,EAAgC,CAClC,IAAIC,EAAyB16E,KAAK85E,8BAA8BW,GAC5DE,EAASD,EAAuBvb,MAChCyb,EAAYF,EAAuBvH,SAEvCvkC,EAAKk7B,OAAOE,OAAS2Q,EACrB/rC,EAAKub,eAAiBywB,CACxB,MACK,CAEL,IAAIC,EAAyB76E,KAAK85E,8BAA8BW,GAAgC,GAC5FK,EAAUD,EAAuB1b,MACjC4b,EAAaF,EAAuB1H,SAEnC4H,IACHA,EAAaD,GAGf,IAAIhR,EAAS,CAAC,EACVr2B,EAAO,CACTq2B,OAAQ,CAAC,GAGPgR,EAAQt+B,SAAS,MAAQu+B,EAAWv+B,SAAS,MAC/CstB,EAAOE,OAAS8Q,EAAQhuE,MAAM,EAAGguE,EAAQ75E,OAAS,GAClDwyC,EAAKq2B,OAAOE,OAAS+Q,EAAWjuE,MAAM,EAAGiuE,EAAW95E,OAAS,IACpD65E,EAAQ92E,WAAW,MAAQ+2E,EAAW/2E,WAAW,MAC1D8lE,EAAOvmC,MAAQu3C,EAAQhuE,MAAM,GAC7B2mC,EAAKq2B,OAAOvmC,MAAQw3C,EAAWjuE,MAAM,IAErC2mC,EAAKtyC,MAAQ45E,EAGfnsC,EAAO,IAAI4kB,EAAqB,QAAE,CAChCryD,MAAO,IACPmB,OAAQ40E,EAAmB0C,EAAY55E,KAAK61E,OAAO71E,KAAKo5B,SAAW,IACnEg/C,YAAawB,EAAWhE,EAAUU,OAAO6B,WACzCrO,OAAQA,EACRr2B,KAAMA,GAEV,CAOA,OALIzzC,KAAKg4E,WAAah4E,KAAKg4E,UAAUpC,EAAUU,OAAO7jB,QAAUojB,EAAO1W,QACrEvwB,EAAKk7B,OAAOvmC,MAAQvjC,KAAKg7E,cAAch7E,KAAKmY,WAC5CnY,KAAKo5B,YAGAp5B,KAAKquC,QAAQO,EAzEpB,CAvBE,IAAI3B,EAAQjtC,KAAKy5E,gCAAgCa,GAEjD,GAAIrtC,EAAMhsC,OAAS,EAAG,CACpB,IAAIguC,EAAOjvC,KAAKoc,QAAQ6yB,KAExB,GAAIA,EAAM,CACR,IAAIgsC,EAAwBj7E,KAAK85E,8BAA8B7sC,GAC3DkyB,EAAQ8b,EAAsB9b,MAC9BgU,EAAW8H,EAAsB9H,cAEpBvvE,IAAbuvE,IACFlkC,EAAKob,eAAiB8oB,GAGxBlkC,EAAK66B,OAAOvmC,OAAS47B,CACvB,MACElyB,EAAMn7B,QAAQ,SAAU3C,GACtB,OAAOsgC,EAAOpB,QAAQl/B,EACxB,EAEJ,CA6EJ,EAEAi+B,EAAOotC,MAAQ,WACb,GAAIx6E,KAAKo5B,WAAap5B,KAAK61E,OAAO50E,OAAS,EAGzC,OAFAjB,KAAK6F,KAAKq1E,eAAgB,OAC1Bl7E,KAAKo5B,WAIPp5B,KAAKoc,QAAQ4yB,oBAEb,IAAI3B,EAAW,IAAIwmB,EAAmB,QAAE,CACtCvxD,OAAQ,CACNsN,MAAOwmE,EAAWp2E,KAAK61E,OAAO71E,KAAKo5B,SAAW,OAGlDp5B,KAAKoc,QAAQkxB,OAAO/jB,OAAO8jB,GAC3BrtC,KAAKoc,QAAUixB,EACfrtC,KAAKo5B,UACP,EAEAgU,EAAO+lB,QAAU,WACf,IAAI/2C,EAAUpc,KAAKg4E,UACnBh4E,KAAKquC,QAAQ,IAAIolB,EAAkB,QAAE,CACnCtyD,MAAOnB,KAAKmY,UACZ7V,OAAQ20E,EAAe76D,GACvBg8D,YAAah8D,EAAQw5D,EAAUU,OAAO6B,cAExCn4E,KAAKo5B,UACP,EAEAgU,EAAOpS,MAAQ,SAAei6B,EAASp1D,GACrC,MAAMG,KAAK6F,KAAKm1B,MAAMi6B,EAASp1D,EACjC,EAEAutC,EAAO+tC,iBAAmB,WACxB,OAAOn7E,KAAKg7B,MAAM,gDAAiD,CACjE1xB,MAAOtJ,KAAKg4E,UAAUpC,EAAUU,OAAO6B,YAE3C,EAEA/qC,EAAOguC,mBAAqB,WAC1B,OAAOp7E,KAAKk4E,SAAS,sBAAuBl4E,KAAKg4E,UAAUpC,EAAUU,OAAO6B,WAC9E,EAEA/qC,EAAOiuC,qBAAuB,WAC5B,OAAOr7E,KAAKk4E,SAAS,yBAA0Bl4E,KAAKg4E,UAAUpC,EAAUU,OAAO6B,WACjF,EAEA/qC,EAAOitC,WAAa,WAClB,OAAOr6E,KAAKg7B,MAAM,eAAiBh7B,KAAKmY,UAAY,mDAAoDnY,KAAKg4E,UAAUpC,EAAUU,OAAO6B,WAC1I,EAEA/qC,EAAOkc,UAAY,WACjB,IAAI0gB,EAAShqE,KAAKs7E,WAAat7E,KAAKmY,QAAQnY,KAAKs7E,aAAc,EAE/D,OAAIt7E,KAAKu7E,UAAU3F,EAAUU,OAAO7jB,QAAUojB,EAAOwC,MACnDr4E,KAAKo5B,WACEp5B,KAAKq4E,KAAKrO,IACRhqE,KAAKu7E,UAAU3F,EAAUU,OAAO7jB,QAAUojB,EAAOgD,UAC1D74E,KAAKo5B,WACEp5B,KAAKgzD,UAAUgX,SAFjB,CAIT,EAEA58B,EAAO8lB,QAAU,WACf,GAAIlzD,KAAKu7E,WAGa,MAFFv7E,KAAKmY,QAAQnY,KAAKu7E,WAGlCv7E,KAAKo5B,eAJT,CASA,IAAIhd,EAAUpc,KAAKg4E,UACnBh4E,KAAKquC,QAAQ,IAAIslB,EAAkB,QAAE,CACnCxyD,MAAOnB,KAAKmY,UACZ7V,OAAQ20E,EAAe76D,GACvBg8D,YAAah8D,EAAQw5D,EAAUU,OAAO6B,cAExCn4E,KAAKo5B,UARL,CASF,EAEAgU,EAAOouC,YAAc,WACnB,IAAIvsC,EAAOjvC,KAAKoc,QAAQ6yB,KACpBwsC,EAAa,EAGjB,GAFAz7E,KAAKo5B,WAED6V,GAAQA,EAAKhvC,OAASsG,EAAMkqC,OAAQ,CACtC,IAAIpD,EAAW,IAAIwmB,EAAmB,QAAE,CACtCvxD,OAAQ,CACNsN,MAAOwmE,EAAWp2E,KAAK61E,OAAO71E,KAAKo5B,SAAW,OAG9C6S,EAAQjsC,KAAKoc,QAIjB,IAHA6yB,EAAK1lB,OAAO8jB,GACZrtC,KAAKoc,QAAUixB,EAERrtC,KAAKo5B,SAAWp5B,KAAK61E,OAAO50E,QAAUw6E,GACvCz7E,KAAKg4E,UAAUpC,EAAUU,OAAO7jB,QAAUojB,EAAO6F,iBACnDD,IAGEz7E,KAAKg4E,UAAUpC,EAAUU,OAAO7jB,QAAUojB,EAAO8F,kBACnDF,IAGEA,EACFz7E,KAAKyiB,SAELziB,KAAKoc,QAAQ9Z,OAAOyQ,IAAM0jE,EAASz2E,KAAKg4E,WACxCh4E,KAAKoc,QAAQkxB,OAAOhrC,OAAOyQ,IAAM0jE,EAASz2E,KAAKg4E,WAC/Ch4E,KAAKo5B,YAITp5B,KAAKoc,QAAU6vB,CACjB,KAAO,CAOL,IAJA,IAEI2vC,EAFAC,EAAa77E,KAAKg4E,UAClB8D,EAAa,IAGV97E,KAAKo5B,SAAWp5B,KAAK61E,OAAO50E,QAAUw6E,GACvCz7E,KAAKg4E,UAAUpC,EAAUU,OAAO7jB,QAAUojB,EAAO6F,iBACnDD,IAGEz7E,KAAKg4E,UAAUpC,EAAUU,OAAO7jB,QAAUojB,EAAO8F,kBACnDF,IAGFG,EAAW57E,KAAKg4E,UAChB8D,GAAc97E,KAAK+7E,sBAAsB/7E,KAAKg4E,WAC9Ch4E,KAAKo5B,WAGH6V,EACFA,EAAK2jC,0BAA0B,QAASkJ,EAAYA,GAEpD97E,KAAKquC,QAAQ,IAAIylB,EAAiB,QAAE,CAClC3yD,MAAO26E,EACPx5E,OAAQs0E,EAAUiF,EAAWjG,EAAUU,OAAOC,YAAasF,EAAWjG,EAAUU,OAAOE,WAAYoF,EAAShG,EAAUU,OAAOI,UAAWkF,EAAShG,EAAUU,OAAOK,UAClKyB,YAAayD,EAAWjG,EAAUU,OAAO6B,aAG/C,CAEA,GAAIsD,EACF,OAAOz7E,KAAKk4E,SAAS,sBAAuBl4E,KAAKg4E,UAAUpC,EAAUU,OAAO6B,WAEhF,EAEA/qC,EAAO6lB,OAAS,WAMd,IALA,IAAIrjB,EAAS5vC,KAETg8E,EAAY,GACZjE,EAAgB/3E,KAAKg4E,UAElBh4E,KAAKg4E,WAAah4E,KAAKg4E,UAAUpC,EAAUU,OAAO7jB,QAAUojB,EAAOoG,OACxED,GAAah8E,KAAKmY,UAClBnY,KAAKo5B,WAGP,OAAKp5B,KAAKg4E,UAINh4E,KAAKg4E,UAAUpC,EAAUU,OAAO7jB,QAAUojB,EAAOwC,KAiB5Cr4E,KAAKk4E,SAAS,CAAC,eAAgB,kBAAmBl4E,KAAKg4E,UAAUpC,EAAUU,OAAO6B,iBAhBzFn4E,KAAKk8E,WAAU,EAAO,SAAUhe,EAAOj9D,GACrC+6E,GAAa9d,EAEbtuB,EAAOvB,QAAQ,IAAIulB,EAAiB,QAAE,CACpCzyD,MAAO66E,EACP15E,OAAQ40E,EAAmBa,EAAenoC,EAAOooC,WACjDI,YAAaL,EAAcnC,EAAUU,OAAO6B,cAG1Cl3E,EAAS,GAAK2uC,EAAO2rC,WAAa3rC,EAAO2rC,UAAU3F,EAAUU,OAAO7jB,QAAUojB,EAAO6F,iBACvF9rC,EAAO5U,MAAM,yBAA0B,CACrC1xB,MAAOsmC,EAAO2rC,UAAU3F,EAAUU,OAAO6B,YAG/C,GAlBOn4E,KAAKk4E,SAAS,CAAC,eAAgB,kBAAmBl4E,KAAKo5B,SAAW,EAsB7E,EAEAgU,EAAO+xB,MAAQ,WACb,IAAIhnD,EAAUnY,KAAKmY,UAEG,IAAlBnY,KAAKo5B,UAAkBp5B,KAAKs7E,UAAU1F,EAAUU,OAAO7jB,QAAUojB,EAAO2E,OAASx6E,KAAKs7E,UAAU1F,EAAUU,OAAO7jB,QAAUojB,EAAO6F,iBAAmB17E,KAAKoc,QAAQ6wB,MAAMgE,MAAM,SAAUrC,GAC1L,MAAqB,YAAdA,EAAK3uC,IACd,IACED,KAAK8pE,OAAS9pE,KAAKg7E,cAAc7iE,GACjCnY,KAAKo5B,YACIp5B,KAAKo5B,WAAap5B,KAAK61E,OAAO50E,OAAS,GAAKjB,KAAKu7E,UAAU3F,EAAUU,OAAO7jB,QAAUojB,EAAO2E,OAASx6E,KAAKu7E,UAAU3F,EAAUU,OAAO7jB,QAAUojB,EAAO8F,kBAChK37E,KAAKoc,QAAQ6yB,KAAK66B,OAAOvmC,MAAQvjC,KAAKg7E,cAAc7iE,GACpDnY,KAAKo5B,YAELp5B,KAAKozD,YAET,EAEAhmB,EAAOt/B,OAAS,WACd,IAAIsO,EAAUpc,KAAKg4E,UACnBh4E,KAAKquC,QAAQ,IAAIylB,EAAiB,QAAE,CAClC3yD,MAAOnB,KAAKmY,UACZ7V,OAAQ20E,EAAe76D,GACvBg8D,YAAah8D,EAAQw5D,EAAUU,OAAO6B,cAExCn4E,KAAKo5B,UACP,EAEAgU,EAAO4lB,UAAY,SAAmB1J,GACpC,IAAIiyB,EAAYv7E,KAAKu7E,UAErB,GAAIA,GAAyC,MAA5Bv7E,KAAKmY,QAAQojE,GAE5B,OADAv7E,KAAKo5B,WACEp5B,KAAKspD,YAGd,IAAIltC,EAAUpc,KAAKg4E,UACnBh4E,KAAKquC,QAAQ,IAAI2lB,EAAoB,QAAE,CACrC7yD,MAAOnB,KAAKmY,UACZ7V,OAAQ20E,EAAe76D,GACvBg8D,YAAah8D,EAAQw5D,EAAUU,OAAO6B,aACpC7uB,GACJtpD,KAAKo5B,UACP,EAEAgU,EAAO8uC,UAAY,SAAmB5yB,EAAW6yB,GAM/C,IALA,IAAIpsC,EAAS/vC,KAETu7E,EAAYv7E,KAAKu7E,UACjBlD,EAAOr4E,KAAKmY,UAETojE,IAAc,CAAC1F,EAAOkD,OAAQlD,EAAOoD,MAAOpD,EAAOiD,OAAQjD,EAAOwC,MAAMnnE,QAAQqqE,EAAU3F,EAAUU,OAAO7jB,QAAQ,CACxHzyD,KAAKo5B,WACL,IAAIhd,EAAUpc,KAAKmY,UAGnB,GAFAkgE,GAAQj8D,EAEJA,EAAQugC,YAAY,QAAUvgC,EAAQnb,OAAS,EAAG,CACpD,IAAI2pB,EAAO5qB,KAAKu7E,UAEZ3wD,GAAQA,EAAKgrD,EAAUU,OAAO7jB,QAAUojB,EAAO1W,QACjDkZ,GAAQr4E,KAAK+5E,cAAc/5E,KAAKmY,QAAQyS,IACxC5qB,KAAKo5B,WAET,CAEAmiD,EAAYv7E,KAAKu7E,SACnB,CAEA,IAAIa,EAAW7E,EAAUc,EAAM,KAAKv0E,OAAO,SAAUgN,GAEnD,IAAIurE,EAA6B,OAAhBhE,EAAKvnE,EAAI,GAEtBwrE,EAAqB,cAAcn4E,KAAKk0E,GAC5C,OAAQgE,IAAeC,CACzB,GACIC,EAAQhF,EAAUc,EAAM,KAAKv0E,OAAO,SAAUgN,GAChD,MAAuB,OAAhBunE,EAAKvnE,EAAI,EAClB,GAEI0rE,EAAiBjF,EAAUc,EAAM,MAEjCmE,EAAev7E,SACjBs7E,EAAQA,EAAMz4E,OAAO,SAAU24E,GAC7B,QAASD,EAAetrE,QAAQurE,EAClC,IAGF,IAAIC,GAAU,EAAI/G,EAAwB,SA51B9C,WACE,IAAI1sD,EAAOvkB,MAAMvE,UAAUqgD,OAAO9xC,MAAM,GAAI1N,WAC5C,OAAOioB,EAAKnlB,OAAO,SAAUw+C,EAAMxxC,GACjC,OAAOA,IAAMmY,EAAK/X,QAAQoxC,EAC5B,EACF,CAu1BiDq6B,CAAM,CAAC,GAAGn8B,OAAO47B,EAAUG,KACxEG,EAAQ5qE,QAAQ,SAAU8qE,EAAK9rE,GAC7B,IAOI89B,EAPAtlC,EAAQozE,EAAQ5rE,EAAI,IAAMunE,EAAKp3E,OAC/BE,EAAQk3E,EAAKvrE,MAAM8vE,EAAKtzE,GAE5B,GAAU,IAANwH,GAAWqrE,EACb,OAAOA,EAAcp8E,KAAKgwC,EAAQ5uC,EAAOu7E,EAAQz7E,QAInD,IAAImb,EAAU2zB,EAAOioC,UACjBI,EAAch8D,EAAQw5D,EAAUU,OAAO6B,WAAauE,EAAQ5rE,GAC5DxO,EAASs0E,EAAUx6D,EAAQ,GAAIA,EAAQ,GAAKwgE,EAAKxgE,EAAQ,GAAIA,EAAQ,IAAM9S,EAAQ,IAEvF,IAAK8yE,EAASlrE,QAAQ0rE,GAAM,CAC1B,IAAIC,EAAgB,CAClB17E,MAAOA,EAAM2L,MAAM,GACnBxK,OAAQA,EACR81E,YAAaA,GAEfxpC,EAAO,IAAI2kB,EAAoB,QAAE8jB,EAAawF,EAAe,SAC/D,MAAO,IAAKN,EAAMrrE,QAAQ0rE,GAAM,CAC9B,IAAIE,EAAS,CACX37E,MAAOA,EAAM2L,MAAM,GACnBxK,OAAQA,EACR81E,YAAaA,GAEfxpC,EAAO,IAAI8kB,EAAa,QAAE2jB,EAAayF,EAAQ,SACjD,KAAO,CACL,IAAIC,EAAU,CACZ57E,MAAOA,EACPmB,OAAQA,EACR81E,YAAaA,GAEff,EAAa0F,EAAS,SACtBnuC,EAAO,IAAImlB,EAAc,QAAEgpB,EAC7B,CAEAhtC,EAAO1B,QAAQO,EAAM0a,GAGrBA,EAAY,IACd,GACAtpD,KAAKo5B,UACP,EAEAgU,EAAOirC,KAAO,SAAc/uB,GAC1B,IAAIiyB,EAAYv7E,KAAKu7E,UAErB,OAAIA,GAAyC,MAA5Bv7E,KAAKmY,QAAQojE,IAC5Bv7E,KAAKo5B,WACEp5B,KAAKspD,aAGPtpD,KAAKk8E,UAAU5yB,EACxB,EAEAlc,EAAOyqC,KAAO,WACZ,KAAO73E,KAAKo5B,SAAWp5B,KAAK61E,OAAO50E,QACjCjB,KAAKyiB,OAAM,GAKb,OAFAziB,KAAKoc,QAAQ4yB,oBAENhvC,KAAK6F,IACd,EAEAunC,EAAO3qB,MAAQ,SAAeu6D,GAC5B,OAAQh9E,KAAKg4E,UAAUpC,EAAUU,OAAO7jB,OACtC,KAAKojB,EAAO1W,MACVn/D,KAAKm/D,QACL,MAEF,KAAK0W,EAAO1iB,QACVnzD,KAAKmzD,UACL,MAEF,KAAK0iB,EAAO6F,gBACV17E,KAAKw7E,cACL,MAEF,KAAK3F,EAAO8F,iBACNqB,GACFh9E,KAAKo7E,qBAGP,MAEF,KAAKvF,EAAOoH,WACVj9E,KAAKqzD,YACL,MAEF,KAAKwiB,EAAOkD,OACZ,KAAKlD,EAAOoD,MACZ,KAAKpD,EAAOiD,OACZ,KAAKjD,EAAOwC,KACVr4E,KAAKq4E,OACL,MAEF,KAAKxC,EAAOoG,MACVj8E,KAAKizD,SACL,MAEF,KAAK4iB,EAAO2E,MACVx6E,KAAKw6E,QACL,MAEF,KAAK3E,EAAOgD,SACV74E,KAAKgzD,YACL,MAEF,KAAK6iB,EAAOqH,UACVl9E,KAAKkzD,UACL,MAEF,KAAK2iB,EAAOqE,MACZ,KAAKrE,EAAOziB,WACVpzD,KAAKozD,aACL,MAEF,KAAKyiB,EAAO5sB,IACVjpD,KAAK8N,SACL,MAGF,KAAK+nE,EAAOoC,YACVj4E,KAAKq7E,uBAEP,KAAKxF,EAAOsH,UACVn9E,KAAKm7E,mBAEP,QACEn7E,KAAKq6E,aAEX,EAMAjtC,EAAO8qC,SAAW,SAAkBkF,EAAa9zE,EAAOolC,GACtD,GAAIhqC,MAAM+H,QAAQ2wE,GAAc,CAC9B,IAAInuC,EAAOmuC,EAAY3yE,MACvB2yE,EAAcA,EAAY35E,KAAK,MAAQ,OAASwrC,CAClD,CAEA,IAAIouC,EAAK,WAAWl5E,KAAKi5E,EAAY,IAAM,KAAO,IAElD,OAAK1uC,EAME1uC,KAAKg7B,MAAM,YAAcqiD,EAAK,IAAMD,EAAc,YAAe1uC,EAAQ,aAAe,CAC7FplC,MAAOA,IANAtJ,KAAKg7B,MAAM,YAAcqiD,EAAK,IAAMD,EAAc,IAAK,CAC5D9zE,MAAOA,GAOb,EAEA8jC,EAAO2sC,cAAgB,SAAuB5a,GAC5C,OAAOn/D,KAAKqV,QAAQ0/B,MAAQ,IAAMoqB,CACpC,EAEA/xB,EAAO4tC,cAAgB,SAAuB7b,GAC5C,OAAOn/D,KAAKqV,QAAQ0/B,MAAQ,GAAKoqB,CACnC,EAEA/xB,EAAO4sC,WAAa,SAAoB7a,EAAOzH,GAC7C,OAAI13D,KAAKqV,QAAQ0/B,MACR2iB,EAAW,IAAM,GAEjByH,CAEX,EAEA/xB,EAAO2uC,sBAAwB,SAA+B1F,GAC5D,IAAIl+D,EAAUnY,KAAKmY,QAAQk+D,GAE3B,OAAIA,EAAMT,EAAUU,OAAO7jB,QAAUojB,EAAO1W,MACnCn/D,KAAK+5E,cAAc5hE,GAEnBA,CAEX,EAEAi1B,EAAOiB,QAAU,SAAiBO,EAAM0a,GAmBtC,OAlBIA,IACE,OAAOnlD,KAAKmlD,KACTtpD,KAAKqV,QAAQ0/B,QAChB/0C,KAAK8pE,QAAU9pE,KAAK8pE,QAAU,IAAMxgB,GAGtCA,GAAY,GAGd1a,EAAK0a,UAAYA,EACjB+tB,EAAazoC,EAAM,cAGjB5uC,KAAK8pE,SACPl7B,EAAKk7B,OAAOE,OAAShqE,KAAK8pE,OAC1B9pE,KAAK8pE,OAAS,IAGT9pE,KAAKoc,QAAQmN,OAAOqlB,EAC7B,EAEAxB,EAAOj1B,QAAU,SAAiBk+D,GAKhC,YAJmB,IAAfA,IACFA,EAAQr2E,KAAKg4E,WAGRh4E,KAAK0kD,IAAI53C,MAAMupE,EAAMT,EAAUU,OAAO6B,WAAY9B,EAAMT,EAAUU,OAAOgH,SAClF,EAMAlwC,EAAOmtC,0BAA4B,SAAmCZ,QACzC,IAAvBA,IACFA,EAAgB35E,KAAKo5B,SAAW,GAKlC,IAFA,IAAImkD,EAAiB5D,EAEd4D,EAAiBv9E,KAAK61E,OAAO50E,QAAQ,CAC1C,IAAIk1E,EAAwBn2E,KAAK61E,OAAO0H,GAAgB3H,EAAUU,OAAO7jB,OAIvE,OAAO8qB,EAHPA,GAKJ,CAEA,OAAQ,CACV,EAlpCoBrwC,EAopCPsqC,GAppCoBrqC,EAopCZ,CAAC,CACpBljC,IAAK,YACLzI,IAAK,WACH,OAAOxB,KAAK61E,OAAO71E,KAAKo5B,SAC1B,GACC,CACDnvB,IAAK,YACLzI,IAAK,WACH,OAAOxB,KAAK61E,OAAO71E,KAAKo5B,SAAW,EACrC,GACC,CACDnvB,IAAK,YACLzI,IAAK,WACH,OAAOxB,KAAK61E,OAAO71E,KAAKo5B,SAAW,EACrC,MAlqC0EyT,EAAkBK,EAAY/sC,UAAWgtC,GAqqC9GqqC,CACT,CArlC0B,GAulC1B34E,EAAiB,QAAI24E,EACrB54E,EAAOC,QAAUA,EAAQyB,O,cC1tCzB,SAME,SAAUyQ,GACV,aAKE,EAAQ,CACJ,QACA,QACA,OACA,SACD,WACS67D,EAAWrX,EAAS5N,EAAO61B,GACnC,OAuBG,SAAkBzsE,EAAQ67D,EAAWrX,EAAS5N,EAAO61B,GAKhE,IAAI96D,EAAU3R,EAAO2R,QACjBknC,EAAS74C,EAAO64C,OAChB6zB,EAAO,WAAY,EAKnBC,EAAO,EAEPC,EAAY,CAAC,EAQjB,SAASC,EAAU5qE,EAASqC,GAC1B,IAAIwoE,EAAel2B,EAAMS,gBAAiBp1C,GAC1C,GAAM6qE,EAAN,CAOA79E,KAAKgT,QAAU6qE,EAEVj0B,IACH5pD,KAAK89E,SAAWl0B,EAAQ5pD,KAAKgT,UAI/BhT,KAAKqV,QAAUsyC,EAAMo2B,OAAQ,CAAC,EAAG/9E,KAAKK,YAAYiV,UAClDtV,KAAKuV,OAAQF,GAGb,IAAI7C,IAAOkrE,EACX19E,KAAKgT,QAAQgrE,aAAexrE,EAC5BmrE,EAAWnrE,GAAOxS,KAGlBA,KAAKi+E,UAEcj+E,KAAKk+E,WAAW,eAEjCl+E,KAAKm+E,QArBP,MALOz7D,GACHA,EAAQsY,MAAO,mBAAqBh7B,KAAKK,YAAYipD,UACnD,MAASu0B,GAAgB7qE,GA0BjC,CAGA4qE,EAASt0B,UAAY,WACrBs0B,EAASJ,KAAOA,EAGhBI,EAAStoE,SAAW,CAClB8oE,eAAgB,CACdhlD,SAAU,YAEZxL,YAAY,EACZywD,YAAY,EACZC,WAAW,EACXC,QAAQ,EACRC,iBAAiB,EAEjBn9C,mBAAoB,OACpBo9C,YAAa,CACXjlD,QAAS,EACT/zB,UAAW,gBAEbi5E,aAAc,CACZllD,QAAS,EACT/zB,UAAW,aAIf,IAAId,EAAQi5E,EAASz9E,UAowBrB,SAASw+E,EAAUC,GACjB,SAASC,IACPD,EAAOlwE,MAAO1O,KAAMgB,UACtB,CAKA,OAHA69E,EAAS1+E,UAAYb,OAAOc,OAAQw+E,EAAOz+E,WAC3C0+E,EAAS1+E,UAAUE,YAAcw+E,EAE1BA,CACT,CA3wBAl3B,EAAMo2B,OAAQp5E,EAAOioE,EAAUzsE,WAM/BwE,EAAM4Q,OAAS,SAAU1V,GACvB8nD,EAAMo2B,OAAQ/9E,KAAKqV,QAASxV,EAC9B,EAKA8E,EAAMu5E,WAAa,SAAU3oE,GAC3B,IAAIupE,EAAY9+E,KAAKK,YAAY0+E,cAAexpE,GAChD,OAAOupE,QAA2Cl7E,IAA9B5D,KAAKqV,QAASypE,GAChC9+E,KAAKqV,QAASypE,GAAc9+E,KAAKqV,QAASE,EAC9C,EAEAqoE,EAASmB,cAAgB,CAEvBnxD,WAAY,eACZoxD,WAAY,eACZC,cAAe,kBACfZ,WAAY,eACZC,UAAW,cACXC,OAAQ,gBACRC,gBAAiB,uBAGnB75E,EAAMs5E,QAAU,WAEdj+E,KAAKk/E,cAELl/E,KAAKm/E,OAAS,GACdn/E,KAAKwO,MAAOxO,KAAKqV,QAAQ7G,OAEzBm5C,EAAMo2B,OAAQ/9E,KAAKgT,QAAQmR,MAAOnkB,KAAKqV,QAAQ+oE,gBAG3Bp+E,KAAKk+E,WAAW,WAElCl+E,KAAKo/E,YAET,EAGAz6E,EAAMu6E,YAAc,WAElBl/E,KAAKqmC,MAAQrmC,KAAKq/E,SAAUr/E,KAAKgT,QAAQsW,SAC3C,EAQA3kB,EAAM06E,SAAW,SAAU92B,GAOzB,IALA,IAAI+2B,EAAYt/E,KAAKu/E,wBAAyBh3B,GAC1Ci1B,EAAOx9E,KAAKK,YAAYm9E,KAGxBn3C,EAAQ,GACFv1B,EAAE,EAAGA,EAAIwuE,EAAUr+E,OAAQ6P,IAAM,CACzC,IACIwxC,EAAO,IAAIk7B,EADJ8B,EAAUxuE,GACM9Q,MAC3BqmC,EAAM37B,KAAM43C,EACd,CAEA,OAAOjc,CACT,EAOA1hC,EAAM46E,wBAA0B,SAAUh3B,GACxC,OAAOZ,EAAMW,mBAAoBC,EAAOvoD,KAAKqV,QAAQmqE,aACvD,EAMA76E,EAAM86E,gBAAkB,WACtB,OAAOz/E,KAAKqmC,MAAMtjC,IAAK,SAAUu/C,GAC/B,OAAOA,EAAKtvC,OACd,EACF,EAOArO,EAAMw5E,OAAS,WACbn+E,KAAKowE,eACLpwE,KAAK0/E,gBAGL,IAAIT,EAAgBj/E,KAAKk+E,WAAW,iBAChCyB,OAA8B/7E,IAAlBq7E,EACdA,GAAiBj/E,KAAK4/E,gBACxB5/E,KAAK6/E,YAAa7/E,KAAKqmC,MAAOs5C,GAG9B3/E,KAAK4/E,iBAAkB,CACzB,EAGAj7E,EAAMm7E,MAAQn7E,EAAMw5E,OAKpBx5E,EAAMyrE,aAAe,WACnBpwE,KAAKu1D,SACP,EAGA5wD,EAAM4wD,QAAU,WACdv1D,KAAK+J,KAAOwrD,EAASv1D,KAAKgT,QAC5B,EAYArO,EAAM2rE,gBAAkB,SAAUxa,EAAa/rD,GAC7C,IACIo+C,EADA5yC,EAASvV,KAAKqV,QAASygD,GAErBvgD,GAKkB,iBAAVA,EACV4yC,EAAOnoD,KAAKgT,QAAQ0L,cAAenJ,GACzBA,aAAkBqS,cAC5BugC,EAAO5yC,GAGTvV,KAAM81D,GAAgB3N,EAAOoN,EAASpN,GAAQp+C,GAASwL,GATvDvV,KAAM81D,GAAgB,CAW1B,EAMAnxD,EAAMk7E,YAAc,SAAUx5C,EAAOs5C,GACnCt5C,EAAQrmC,KAAK+/E,mBAAoB15C,GAEjCrmC,KAAKggF,aAAc35C,EAAOs5C,GAE1B3/E,KAAKigF,aACP,EAQAt7E,EAAMo7E,mBAAqB,SAAU15C,GACnC,OAAOA,EAAMviC,OAAQ,SAAUw+C,GAC7B,OAAQA,EAAK49B,SACf,EACF,EAOAv7E,EAAMq7E,aAAe,SAAU35C,EAAOs5C,GAGpC,GAFA3/E,KAAKmgF,qBAAsB,SAAU95C,GAE/BA,GAAUA,EAAMplC,OAAtB,CAKA,IAAIomE,EAAQ,GAEZhhC,EAAMv0B,QAAS,SAAUwwC,GAEvB,IAAIlpB,EAAWp5B,KAAKuwE,uBAAwBjuB,GAE5ClpB,EAASkpB,KAAOA,EAChBlpB,EAASumD,UAAYA,GAAar9B,EAAK89B,gBACvC/Y,EAAM38D,KAAM0uB,EACd,EAAGp5B,MAEHA,KAAKqgF,oBAAqBhZ,EAb1B,CAcF,EAOA1iE,EAAM4rE,uBAAyB,WAC7B,MAAO,CACL/1D,EAAG,EACHtC,EAAG,EAEP,EAQAvT,EAAM07E,oBAAsB,SAAUhZ,GACpCrnE,KAAKsgF,gBACLjZ,EAAMv1D,QAAS,SAAU9S,EAAK8R,GAC5B9Q,KAAKugF,cAAevhF,EAAIsjD,KAAMtjD,EAAIwb,EAAGxb,EAAIkZ,EAAGlZ,EAAI2gF,UAAW7uE,EAC7D,EAAG9Q,KACL,EAGA2E,EAAM27E,cAAgB,WACpB,IAAIE,EAAUxgF,KAAKqV,QAAQmrE,QAC3B,GAAKA,QAKL,OADAxgF,KAAKwgF,QAyiBP,SAA0B7tE,GACxB,GAAoB,iBAARA,EACV,OAAOA,EAET,IAAIkJ,EAAUlJ,EAAKjP,MAAO,qBACtBmkD,EAAMhsC,GAAWA,EAAQ,GACzB4kE,EAAO5kE,GAAWA,EAAQ,GAC9B,OAAMgsC,EAAI5mD,QAGV4mD,EAAMv3C,WAAYu3C,KACP64B,EAASD,IAAU,GAHrB,CAKX,CAtjBiBE,CAAiBH,GACzBxgF,KAAKwgF,QAJVxgF,KAAKwgF,QAAU,CAKnB,EASA77E,EAAM47E,cAAgB,SAAUj+B,EAAM9nC,EAAGtC,EAAGynE,EAAW7uE,GAChD6uE,EAEHr9B,EAAKs+B,KAAMpmE,EAAGtC,IAEdoqC,EAAKk+B,QAAS1vE,EAAI9Q,KAAKwgF,SACvBl+B,EAAKu+B,OAAQrmE,EAAGtC,GAEpB,EAMAvT,EAAMs7E,YAAc,WAClBjgF,KAAKw+E,iBACP,EAEA75E,EAAM65E,gBAAkB,WAEtB,GAD0Bx+E,KAAKk+E,WAAW,mBAC1C,CAGA,IAAIn0E,EAAO/J,KAAK4wE,oBACX7mE,IACH/J,KAAK8gF,qBAAsB/2E,EAAKqO,OAAO,GACvCpY,KAAK8gF,qBAAsB/2E,EAAKsO,QAAQ,GAJ1C,CAMF,EAQA1T,EAAMisE,kBAAoB6M,EAM1B94E,EAAMm8E,qBAAuB,SAAUC,EAASC,GAC9C,QAAiBp9E,IAAZm9E,EAAL,CAIA,IAAIE,EAAWjhF,KAAK+J,KAEfk3E,EAASprB,cACZkrB,GAAWC,EAAUC,EAAS38D,YAAc28D,EAAS18D,aACnD08D,EAAS7qB,gBAAkB6qB,EAAS5qB,iBACpC4qB,EAAS58D,cAAgB48D,EAAS78D,WAClC68D,EAASnyB,eAAiBmyB,EAAStxB,mBAGvCoxB,EAAUt4E,KAAKC,IAAKq4E,EAAS,GAC7B/gF,KAAKgT,QAAQmR,MAAO68D,EAAU,QAAU,UAAaD,EAAU,IAZ/D,CAaF,EAOAp8E,EAAMw7E,qBAAuB,SAAUtT,EAAWxmC,GAChD,IAAIvmC,EAAQE,KACZ,SAASkhF,IACPphF,EAAM6vB,cAAek9C,EAAY,WAAY,KAAM,CAAExmC,GACvD,CAEA,IAAI/3B,EAAQ+3B,EAAMplC,OAClB,GAAMolC,GAAU/3B,EAAhB,CAKA,IAAI6yE,EAAY,EAShB96C,EAAMv0B,QAAS,SAAUwwC,GACvBA,EAAK2qB,KAAMJ,EAAWuU,EACxB,EAbA,MAFEF,IAKF,SAASE,MACPD,GACkB7yE,GAChB4yE,GAEJ,CAMF,EAQAv8E,EAAMgrB,cAAgB,SAAU1vB,EAAM6iB,EAAOjT,GAE3C,IAAIwxE,EAAWv+D,EAAQ,CAAEA,GAAQ09B,OAAQ3wC,GAASA,EAGlD,GAFA7P,KAAKotE,UAAWntE,EAAMohF,GAEjBz3B,EAGH,GADA5pD,KAAK89E,SAAW99E,KAAK89E,UAAYl0B,EAAQ5pD,KAAKgT,SACzC8P,EAAQ,CAEX,IAAIw+D,EAAS13B,EAAOt1C,MAAOwO,GAC3Bw+D,EAAOrhF,KAAOA,EACdD,KAAK89E,SAASyD,QAASD,EAAQzxE,EACjC,MAEE7P,KAAK89E,SAASyD,QAASthF,EAAM4P,EAGnC,EAUAlL,EAAM68E,OAAS,SAAUr5B,GACvB,IAAI7F,EAAOtiD,KAAKyhF,QAASt5B,GACpB7F,IACHA,EAAK49B,WAAY,EAErB,EAMAv7E,EAAM+8E,SAAW,SAAUv5B,GACzB,IAAI7F,EAAOtiD,KAAKyhF,QAASt5B,GACpB7F,UACIA,EAAK49B,SAEhB,EAMAv7E,EAAM6J,MAAQ,SAAU+5C,IACtBA,EAAQvoD,KAAK2hF,MAAOp5B,MAKpBvoD,KAAKm/E,OAASn/E,KAAKm/E,OAAO3+B,OAAQ+H,GAElCA,EAAMz2C,QAAS9R,KAAKwhF,OAAQxhF,MAC9B,EAMA2E,EAAMi9E,QAAU,SAAUr5B,IACxBA,EAAQvoD,KAAK2hF,MAAOp5B,KAKpBA,EAAMz2C,QAAS,SAAUq2C,GAEvBR,EAAMK,WAAYhoD,KAAKm/E,OAAQh3B,GAC/BnoD,KAAK0hF,SAAUv5B,EACjB,EAAGnoD,KACL,EAOA2E,EAAMg9E,MAAQ,SAAUp5B,GACtB,GAAMA,EAQN,MAJqB,iBAATA,IACVA,EAAQvoD,KAAKgT,QAAQsS,iBAAkBijC,IAEjCZ,EAAMI,UAAWQ,EAE3B,EAEA5jD,EAAM+6E,cAAgB,WACd1/E,KAAKm/E,QAAWn/E,KAAKm/E,OAAOl+E,SAIlCjB,KAAK6hF,mBAEL7hF,KAAKm/E,OAAOrtE,QAAS9R,KAAK8hF,aAAc9hF,MAC1C,EAGA2E,EAAMk9E,iBAAmB,WAEvB,IAAIE,EAAe/hF,KAAKgT,QAAQkM,wBAC5BnV,EAAO/J,KAAK+J,KAChB/J,KAAKgiF,cAAgB,CACnBlkE,KAAMikE,EAAajkE,KAAO/T,EAAKua,YAAcva,EAAKqsD,gBAClDz4C,IAAKokE,EAAapkE,IAAM5T,EAAKqa,WAAara,EAAK+kD,eAC/ClxC,MAAOmkE,EAAankE,OAAU7T,EAAKwa,aAAexa,EAAKssD,kBACvDx4C,OAAQkkE,EAAalkE,QAAW9T,EAAKsa,cAAgBta,EAAK4lD,mBAE9D,EAKAhrD,EAAMm9E,aAAerE,EAOrB94E,EAAMs9E,kBAAoB,SAAU95B,GAClC,IAAI45B,EAAe55B,EAAKjpC,wBACpBgjE,EAAWliF,KAAKgiF,cAChBj4E,EAAOwrD,EAASpN,GAOpB,MANa,CACXrqC,KAAMikE,EAAajkE,KAAOokE,EAASpkE,KAAO/T,EAAKmsD,WAC/Cv4C,IAAKokE,EAAapkE,IAAMukE,EAASvkE,IAAM5T,EAAKuhD,UAC5C1tC,MAAOskE,EAAStkE,MAAQmkE,EAAankE,MAAQ7T,EAAKs/B,YAClDxrB,OAAQqkE,EAASrkE,OAASkkE,EAAalkE,OAAS9T,EAAKwhD,aAGzD,EAMA5mD,EAAM0jD,YAAcV,EAAMU,YAK1B1jD,EAAMy6E,WAAa,WACjBruE,EAAOsC,iBAAkB,SAAUrT,MACnCA,KAAKmiF,eAAgB,CACvB,EAKAx9E,EAAMy9E,aAAe,WACnBrxE,EAAOqD,oBAAqB,SAAUpU,MACtCA,KAAKmiF,eAAgB,CACvB,EAEAx9E,EAAM09E,SAAW,WACfriF,KAAKu+E,QACP,EAEA52B,EAAMe,eAAgBk1B,EAAU,WAAY,KAE5Cj5E,EAAM45E,OAAS,WAGPv+E,KAAKmiF,eAAkBniF,KAAKsiF,qBAIlCtiF,KAAKm+E,QACP,EAMAx5E,EAAM29E,kBAAoB,WACxB,IAAIv4E,EAAOwrD,EAASv1D,KAAKgT,SAIzB,OADehT,KAAK+J,MAAQA,GACTA,EAAK0T,aAAezd,KAAK+J,KAAK0T,UACnD,EASA9Y,EAAM49E,SAAW,SAAUh6B,GACzB,IAAIliB,EAAQrmC,KAAKq/E,SAAU92B,GAK3B,OAHKliB,EAAMplC,SACTjB,KAAKqmC,MAAQrmC,KAAKqmC,MAAMma,OAAQna,IAE3BA,CACT,EAMA1hC,EAAM69E,SAAW,SAAUj6B,GACzB,IAAIliB,EAAQrmC,KAAKuiF,SAAUh6B,GACrBliB,EAAMplC,SAIZjB,KAAK6/E,YAAax5C,GAAO,GACzBrmC,KAAKyiF,OAAQp8C,GACf,EAMA1hC,EAAM+9E,UAAY,SAAUn6B,GAC1B,IAAIliB,EAAQrmC,KAAKq/E,SAAU92B,GAC3B,GAAMliB,EAAMplC,OAAZ,CAIA,IAAI0hF,EAAgB3iF,KAAKqmC,MAAMv5B,MAAM,GACrC9M,KAAKqmC,MAAQA,EAAMma,OAAQmiC,GAE3B3iF,KAAKowE,eACLpwE,KAAK0/E,gBAEL1/E,KAAK6/E,YAAax5C,GAAO,GACzBrmC,KAAKyiF,OAAQp8C,GAEbrmC,KAAK6/E,YAAa8C,EAXlB,CAYF,EAMAh+E,EAAM89E,OAAS,SAAUp8C,GAEvB,GADArmC,KAAKmgF,qBAAsB,SAAU95C,GAC/BA,GAAUA,EAAMplC,OAAtB,CAGA,IAAIu/E,EAAUxgF,KAAKsgF,gBACnBj6C,EAAMv0B,QAAS,SAAUwwC,EAAMxxC,GAC7BwxC,EAAKk+B,QAAS1vE,EAAI0vE,GAClBl+B,EAAKmgC,QACP,EALA,CAMF,EAMA99E,EAAM0/B,KAAO,SAAUgC,GAErB,GADArmC,KAAKmgF,qBAAsB,OAAQ95C,GAC7BA,GAAUA,EAAMplC,OAAtB,CAGA,IAAIu/E,EAAUxgF,KAAKsgF,gBACnBj6C,EAAMv0B,QAAS,SAAUwwC,EAAMxxC,GAC7BwxC,EAAKk+B,QAAS1vE,EAAI0vE,GAClBl+B,EAAKje,MACP,EALA,CAMF,EAMA1/B,EAAMi+E,mBAAqB,SAAUr6B,GACnC,IAAIliB,EAAQrmC,KAAK6iF,SAAUt6B,GAC3BvoD,KAAKyiF,OAAQp8C,EACf,EAMA1hC,EAAMm+E,iBAAmB,SAAUv6B,GACjC,IAAIliB,EAAQrmC,KAAK6iF,SAAUt6B,GAC3BvoD,KAAKqkC,KAAMgC,EACb,EAQA1hC,EAAM88E,QAAU,SAAUt5B,GAExB,IAAM,IAAIr3C,EAAE,EAAGA,EAAI9Q,KAAKqmC,MAAMplC,OAAQ6P,IAAM,CAC1C,IAAIwxC,EAAOtiD,KAAKqmC,MAAMv1B,GACtB,GAAKwxC,EAAKtvC,SAAWm1C,EAEnB,OAAO7F,CAEX,CACF,EAOA39C,EAAMk+E,SAAW,SAAUt6B,GACzBA,EAAQZ,EAAMI,UAAWQ,GACzB,IAAIliB,EAAQ,GAQZ,OAPAkiB,EAAMz2C,QAAS,SAAUq2C,GACvB,IAAI7F,EAAOtiD,KAAKyhF,QAASt5B,GACpB7F,GACHjc,EAAM37B,KAAM43C,EAEhB,EAAGtiD,MAEIqmC,CACT,EAMA1hC,EAAMgW,OAAS,SAAU4tC,GACvB,IAAIw6B,EAAc/iF,KAAK6iF,SAAUt6B,GAEjCvoD,KAAKmgF,qBAAsB,SAAU4C,GAG/BA,GAAgBA,EAAY9hF,QAIlC8hF,EAAYjxE,QAAS,SAAUwwC,GAC7BA,EAAK3nC,SAELgtC,EAAMK,WAAYhoD,KAAKqmC,MAAOic,EAChC,EAAGtiD,KACL,EAKA2E,EAAMwiB,QAAU,WAEd,IAAIhD,EAAQnkB,KAAKgT,QAAQmR,MACzBA,EAAM9L,OAAS,GACf8L,EAAMiV,SAAW,GACjBjV,EAAM/L,MAAQ,GAEdpY,KAAKqmC,MAAMv0B,QAAS,SAAUwwC,GAC5BA,EAAKn7B,SACP,GAEAnnB,KAAKoiF,eAEL,IAAI5vE,EAAKxS,KAAKgT,QAAQgrE,oBACfL,EAAWnrE,UACXxS,KAAKgT,QAAQgrE,aAEfp0B,GACHA,EAAOo5B,WAAYhjF,KAAKgT,QAAShT,KAAKK,YAAYipD,UAGtD,EASAs0B,EAAS/zE,KAAO,SAAUs+C,GAExB,IAAI31C,GADJ21C,EAAOR,EAAMS,gBAAiBD,KACbA,EAAK61B,aACtB,OAAOxrE,GAAMmrE,EAAWnrE,EAC1B,EASAorE,EAASx9E,OAAS,SAAUkpD,EAAWj0C,GAErC,IAAI4tE,EAAStE,EAAUf,GAwBvB,OAtBAqF,EAAO3tE,SAAWqyC,EAAMo2B,OAAQ,CAAC,EAAGH,EAAStoE,UAC7CqyC,EAAMo2B,OAAQkF,EAAO3tE,SAAUD,GAC/B4tE,EAAOlE,cAAgBp3B,EAAMo2B,OAAQ,CAAC,EAAGH,EAASmB,eAElDkE,EAAO35B,UAAYA,EAEnB25B,EAAOp5E,KAAO+zE,EAAS/zE,KAGvBo5E,EAAOzF,KAAOmB,EAAUnB,GAIxB71B,EAAMyB,SAAU65B,EAAQ35B,GAKnBM,GAAUA,EAAOs5B,SACpBt5B,EAAOs5B,QAAS55B,EAAW25B,GAGtBA,CACT,EAgBA,IAAIvC,EAAU,CACZyC,GAAI,EACJhyE,EAAG,KAyBL,OAFAysE,EAASJ,KAAOA,EAETI,CAEP,CAv5Be9zB,CAAS/4C,EAAQ67D,EAAWrX,EAAS5N,EAAO61B,EACpD,sCAsBP,CApCA,CAoCGzsE,O,2BCzCH,IAEIgL,EAFa,EAAQ,MAEEA,UACvBC,EAAYD,GAAaA,EAAUC,UAEvCpd,EAAOC,QAAUmd,EAAY3M,OAAO2M,GAAa,E,2BCLjD,IAAI3X,EAAI,EAAQ,MACZitC,EAAU,EAAQ,MAClBU,EAAc,EAAQ,MACtByE,EAAa,EAAQ,MACrBC,EAAO,EAAQ,MACf7E,EAAc,EAAQ,MACtBkV,EAAW,EAAQ,MACnBhV,EAAS,EAAQ,MACjBqxC,EAAoB,EAAQ,MAC5B/hC,EAAgB,EAAQ,MACxB2zB,EAAW,EAAQ,KACnBjwB,EAAc,EAAQ,MACtBjT,EAAQ,EAAQ,MAChB18B,EAAsB,UACtBi3B,EAA2B,UAC3BnrC,EAAiB,UACjBmiF,EAAkB,EAAQ,MAC1B1gF,EAAO,aAEP2gF,EAAS,SACTC,EAAe9sC,EAAW6sC,GAC1BE,EAAsB9sC,EAAK4sC,GAC3BG,EAAkBF,EAAapjF,UAC/BS,EAAY61C,EAAW71C,UACvB4xC,EAAcX,EAAY,GAAG/kC,OAC7B42E,EAAa7xC,EAAY,GAAG6xC,YAkD5B19B,EAASe,EAASu8B,GAASC,EAAa,UAAYA,EAAa,QAAUA,EAAa,SASxFI,EAAgB,SAAgBxiF,GAClC,IAR4ByiF,EAQxBz0E,EAAInO,UAAUC,OAAS,EAAI,EAAIsiF,EAxDrB,SAAUpiF,GACxB,IAAI0iF,EAAY9+B,EAAY5jD,EAAO,UACnC,MAA2B,iBAAb0iF,EAAwBA,EAKzB,SAAUhjF,GACvB,IACIq9D,EAAO4lB,EAAO3P,EAAO4P,EAASC,EAAQ/iF,EAAQqI,EAAO8iD,EADrDttD,EAAKimD,EAAYlkD,EAAU,UAE/B,GAAIm0E,EAASl2E,GAAK,MAAM,IAAI8B,EAAU,6CACtC,GAAiB,iBAAN9B,GAAkBA,EAAGmC,OAAS,EAGvC,GAFAnC,EAAK6D,EAAK7D,GAEI,MADdo/D,EAAQwlB,EAAW5kF,EAAI,KACO,KAAVo/D,GAElB,GAAc,MADd4lB,EAAQJ,EAAW5kF,EAAI,KACO,MAAVglF,EAAe,OAAO9+B,SACrC,GAAc,KAAVkZ,EAAc,CACvB,OAAQwlB,EAAW5kF,EAAI,IAErB,KAAK,GACL,KAAK,GACHq1E,EAAQ,EACR4P,EAAU,GACV,MAEF,KAAK,GACL,KAAK,IACH5P,EAAQ,EACR4P,EAAU,GACV,MACF,QACE,OAAQjlF,EAIZ,IADAmC,GADA+iF,EAASxxC,EAAY1zC,EAAI,IACTmC,OACXqI,EAAQ,EAAGA,EAAQrI,EAAQqI,IAI9B,IAHA8iD,EAAOs3B,EAAWM,EAAQ16E,IAGf,IAAM8iD,EAAO23B,EAAS,OAAO/+B,IACxC,OAAOrhD,SAASqgF,EAAQ7P,EAC5B,CACA,OAAQr1E,CACZ,CA1CoDmlF,CAASJ,EAC7D,CAqDkDK,CAAU/iF,IAC1D,OAPOkgD,EAAcoiC,EAFOG,EASP5jF,OAP2B8xC,EAAM,WAAcuxC,EAAgBO,EAAQ,GAO/DR,EAAkB9jF,OAAO6P,GAAInP,KAAM2jF,GAAiBx0E,CACnF,EAEAw0E,EAAcxjF,UAAYsjF,EACtBz9B,IAAW1U,IAASmyC,EAAgBpjF,YAAcsjF,GAEtDt/E,EAAE,CAAEi2C,QAAQ,EAAMj6C,aAAa,EAAMk6C,MAAM,EAAM31C,OAAQohD,GAAU,CACjEx1C,OAAQmzE,IAIV,IAAIQ,EAA4B,SAAU/iF,EAAQkB,GAChD,IAAK,IAOgB2H,EAPZ7C,EAAO4qC,EAAc58B,EAAoB9S,GAAU,oLAO1DuP,MAAM,KAAM4gE,EAAI,EAAQrrE,EAAKnG,OAASwxE,EAAGA,IACrC1gC,EAAOzvC,EAAQ2H,EAAM7C,EAAKqrE,MAAQ1gC,EAAO3wC,EAAQ6I,IACnD/I,EAAeE,EAAQ6I,EAAKoiC,EAAyB/pC,EAAQ2H,GAGnE,EAEIqnC,GAAWkyC,GAAqBW,EAA0BztC,EAAK4sC,GAASE,IACxEx9B,GAAU1U,IAAS6yC,EAA0BztC,EAAK4sC,GAASC,E,4CClH/D,IAAIa,EA8BJ,SAASrG,IACP,IAAIluE,EAAO,GAAG/C,MAAM/M,KAAKiB,WACrBqjF,GAAO,EACW,kBAAXx0E,EAAK,KACdw0E,EAAOx0E,EAAK0kD,SAEd,IAAIprD,EAAS0G,EAAK,GAClB,GAAIy0E,EAAen7E,GACjB,MAAM,IAAIyN,MAAM,8BAIlB,IAFA,IAAI2tE,EAAY10E,EAAK/C,MAAM,GACvB6/B,EAAM43C,EAAUtjF,OACX6P,EAAI,EAAGA,EAAI67B,EAAK77B,IAAK,CAC5B,IAAI0zE,EAAWD,EAAUzzE,GACzB,IAAK,IAAI7G,KAAOu6E,EACd,GAAIllF,OAAOa,UAAU8G,eAAelH,KAAKykF,EAAUv6E,GAAM,CACvD,IAAI9I,EAAQqjF,EAASv6E,GACrB,GAAIo6E,GAAQI,EAAYtjF,GAAQ,CAC9B,IAAI6pD,EAAOtmD,MAAM+H,QAAQtL,GAAS,GAAK,CAAC,EACxCgI,EAAOc,GAAO8zE,GACZ,EACAz+E,OAAOa,UAAU8G,eAAelH,KAAKoJ,EAAQc,KAASq6E,EAAen7E,EAAOc,IACxEd,EAAOc,GACP+gD,EACJ7pD,EAEJ,MACEgI,EAAOc,GAAO9I,CAElB,CAEJ,CACA,OAAOgI,CACT,EAEA,SAASs7E,EAAYzlF,GACnB,OAAO0F,MAAM+H,QAAQzN,IAAiC,mBAAzB,CAAC,EAAEiE,SAASlD,KAAKf,EAChD,CAEA,SAASslF,EAAeI,GACtB,OAAQA,GAAsB,iBAAPA,GAAiC,mBAAPA,CACnD,CCrEA,SAASC,EAAuBnhF,GAC9B,OAAOA,GAAKA,EAAEzE,WAAayE,EAAElD,QAAUkD,CACzC,CAEA,MAAMohF,EAEF,EAAApvE,CAAGsN,EAAO82B,GAMN,OALA55C,KAAK6kF,WAAa7kF,KAAK6kF,YAAc,CACrC,EAEK7kF,KAAK6kF,WAAW/hE,KAAQ9iB,KAAK6kF,WAAW/hE,GAAS,IACtD9iB,KAAK6kF,WAAW/hE,GAAOpY,KAAKkvC,GACrB55C,IACX,CACA,IAAAmW,CAAK2M,KAAUjT,GACX7P,KAAK6kF,WAAa7kF,KAAK6kF,YAAc,CACrC,EACA,IAAIC,EAAY9kF,KAAK6kF,WAAW/hE,GAChC,GAAIgiE,EAAW,IAAK,IAAI51C,KAAY41C,EAAU51C,EAASxgC,MAAM1O,KAAM6P,GAKnE,OAHI7P,KAAKgT,SAAShT,KAAKgT,QAAQ2c,cAAc3vB,KAAK+kF,UAAU,YAAcjiE,EAAO,CAC7EjT,KAAMA,KAEH7P,IACX,CACA,SAAA+kF,CAAUlY,EAAWlrD,GACjB,IAAIuoC,EAAS,CACT31C,SAAS,EACTC,YAAY,EACZmN,OAAQA,GAEZ,GAAkC,mBAAvB5Q,OAAO2e,YAA4B,OAAO,IAAIA,YAAYm9C,EAAW3iB,GAI5E,IAAI86B,EAAM5zE,SAASknC,YAAY,eAE/B,OADA0sC,EAAIC,gBAAgBpY,EAAW3iB,EAAO31C,QAAS21C,EAAO11C,WAAY01C,EAAOvoC,QAClEqjE,CAEf,CAIA,GAAA9uE,CAAI4M,EAAO82B,GACP,IAAK55C,KAAK6kF,YAAmC,IAArB7jF,UAAUC,OAG9B,OAFAjB,KAAK6kF,WAAa,CAClB,EACO7kF,KAGX,IAAI8kF,EAAY9kF,KAAK6kF,WAAW/hE,GAChC,IAAKgiE,EAAW,OAAO9kF,KAEvB,GAAyB,IAArBgB,UAAUC,OAEV,cADOjB,KAAK6kF,WAAW/hE,GAChB9iB,KAGX,IAAI,IAAI8Q,EAAI,EAAGA,EAAIg0E,EAAU7jF,OAAQ6P,IAEjC,GADeg0E,EAAUh0E,KACR8oC,EAAI,CACjBkrC,EAAU58E,OAAO4I,EAAG,GACpB,KACJ,CAEJ,OAAO9Q,IACX,EAmjBJ,IAAIklF,EA1iBuC,CAOrCtnC,IAAK,KAILhhB,OAAQ,OAGRuoD,iBAAiB,EAIjB1jD,QAAS,KAIT2jD,gBAAiB,EAOjBC,gBAAgB,EAMhBC,UAAU,EAKVC,eAAe,EAGfC,UAAW,QAGXC,sBAAsB,EAGtBC,aAAa,EAGbC,iBAAkB,EAGlBC,YAAa,IAKbC,UAAW,OAGXC,uBAAuB,EAGvBC,qBAAsB,GAGtBC,eAAgB,IAGhBC,gBAAiB,IAIjBC,gBAAiB,OAQjBC,YAAa,KAGbC,aAAc,KAKdC,eAAgB,KAGhBC,cAAe,GAIfC,aAAc,UAOdC,aAAc,IAMdC,SAAU,KAIVC,QAAS,KAMTC,gBAAgB,EAQhBC,WAAW,EAGXC,mBAAmB,EAWnBC,cAAe,KAIfC,kBAAmB,KAUnBC,kBAAkB,EAIlBC,WAAW,EAKXC,gBAAgB,EAMhBC,kBAAmB,KAGnBC,iBAAiB,EAOjBC,qBAAsB,OAQtBvnE,QAAS,KAGTwnE,eAAgB,KAKhBC,WAAY,KAMZC,eAAe,EAGfC,mBAAoB,4BAGpBC,oBAAqB,0DAKrBC,iBAAkB,kFAIlBC,eAAgB,uEAGhBC,oBAAqB,uCAIrBC,kBAAmB,6CAGnBC,iBAAkB,gBAGlBC,mBAAoB,mBAGpBC,6BAA8B,+CAG9BC,eAAgB,cAGhBC,2BAA4B,KAI5BC,qBAAsB,qCAItBC,kBAAmB,CACjBC,GAAI,KACJC,GAAI,KACJC,GAAI,KACJC,GAAI,KACJllF,EAAG,KAKL,IAAAoqB,GACF,EAUE,MAAAu8B,CAAQlI,EAAO5lB,EAAKssD,GAClB,GAAIA,EAAO,MAAO,CACdC,OAAQD,EAAMhlC,KAAKklC,OAAOC,KAC1BC,aAAcJ,EAAMp/E,MACpBy/E,gBAAiBL,EAAMhlC,KAAK35C,KAC5Bi/E,YAAahpF,KAAKqV,QAAQmwE,UAC1ByD,kBAAmBP,EAAMhlC,KAAKklC,OAAOM,gBACrCC,kBAAmBT,EAAMp/E,MAAQtJ,KAAKqV,QAAQmwE,UAEtD,EASE4D,OAAO,CAAC1lC,EAAMzpB,IACLA,IAOTovD,eAAgB,SAAS3lC,EAAMzpB,GAC7BA,GACJ,EAMEqvD,YAAY,EAKZ,QAAAC,GAEE,IAAIC,EACJxpF,KAAKgT,QAAQurB,UAAY,GAAGv+B,KAAKgT,QAAQurB,qCACzC,IAAK,IAAIiP,KAASxtC,KAAKgT,QAAQyrB,qBAAqB,OAAO,GAAI,uBAAuBt6B,KAAKqpC,EAAMjP,WAAY,CACzGirD,EAAiBh8C,EACjBA,EAAMjP,UAAY,aAClB,KACJ,CACKirD,IACDA,EAAiBC,EAAyC/3E,cAAc,+CACxE1R,KAAKgT,QAAQpB,YAAY43E,IAE7B,IAAIE,EAAOF,EAAe/qD,qBAAqB,QAAQ,GAKvD,OAJIirD,IACwB,MAApBA,EAAKC,YAAqBD,EAAKC,YAAc3pF,KAAKqV,QAAQqyE,oBACnC,MAAlBgC,EAAKE,YAAmBF,EAAKE,UAAY5pF,KAAKqV,QAAQqyE,sBAE5D1nF,KAAKgT,QAAQpB,YAAY5R,KAAK6pF,kBACzC,EAYE,MAAAtL,CAAQ76B,EAAMtrC,EAAOC,EAAQkuE,GAC3B,IAAIhS,EAAO,CACPuV,KAAM,EACNC,KAAM,EACNC,SAAUtmC,EAAKtrC,MACf6xE,UAAWvmC,EAAKrrC,QAEhB6xE,EAAWxmC,EAAKtrC,MAAQsrC,EAAKrrC,OAEpB,MAATD,GAA2B,MAAVC,GACjBD,EAAQm8D,EAAKyV,SACb3xE,EAASk8D,EAAK0V,WACE,MAAT7xE,EAAeA,EAAQC,EAAS6xE,EACxB,MAAV7xE,IAAgBA,EAASD,EAAQ8xE,GAI1C,IAAIC,GAFJ/xE,EAAQ3P,KAAKoU,IAAIzE,EAAOm8D,EAAKyV,YAC7B3xE,EAAS5P,KAAKoU,IAAIxE,EAAQk8D,EAAK0V,YAE/B,GAAI1V,EAAKyV,SAAW5xE,GAASm8D,EAAK0V,UAAY5xE,EAE1C,GAAqB,SAAjBkuE,EACI2D,EAAWC,GACX5V,EAAK0V,UAAYvmC,EAAKrrC,OACtBk8D,EAAKyV,SAAWzV,EAAK0V,UAAYE,IAEjC5V,EAAKyV,SAAWtmC,EAAKtrC,MACrBm8D,EAAK0V,UAAY1V,EAAKyV,SAAWG,OAElC,IAAqB,YAAjB5D,EAIJ,MAAM,IAAI3vE,MAAM,yBAAyB2vE,MAFxC2D,EAAWC,EAAU9xE,EAASD,EAAQ8xE,EACrC9xE,EAAQC,EAAS6xE,CACsC,CAMpE,OAJA3V,EAAKuV,MAAQpmC,EAAKtrC,MAAQm8D,EAAKyV,UAAY,EAC3CzV,EAAKwV,MAAQrmC,EAAKrrC,OAASk8D,EAAK0V,WAAa,EAC7C1V,EAAK6V,SAAWhyE,EAChBm8D,EAAK8V,UAAYhyE,EACVk8D,CACX,EASE,aAAA+V,CAAe5mC,EAAMzpB,GACnB,OAAKj6B,KAAKqV,QAAQ8wE,aAAenmF,KAAKqV,QAAQ+wE,eAAiB1iC,EAAKzjD,KAAKyD,MAAM,WAAmB1D,KAAKuqF,YAAY7mC,EAAM1jD,KAAKqV,QAAQ8wE,YAAanmF,KAAKqV,QAAQ+wE,aAAcpmF,KAAKqV,QAAQkxE,aAActsD,GAC7LA,EAAKypB,EACrB,EAcE8mC,gBAA+B7F,EAzZT,u9DAkaxB,IAAA8F,CAAMhkF,GACF,OAAOzG,KAAKgT,QAAQjB,UAAU4I,OAAO,gBACzC,EACA,SAAA+vE,CAAWjkF,GACX,EACA,OAAAkkF,CAASlkF,GACL,OAAOzG,KAAKgT,QAAQjB,UAAU4I,OAAO,gBACzC,EACA,SAAAiwE,CAAWnkF,GACP,OAAOzG,KAAKgT,QAAQjB,UAAU8I,IAAI,gBACtC,EACA,QAAAgwE,CAAUpkF,GACN,OAAOzG,KAAKgT,QAAQjB,UAAU8I,IAAI,gBACtC,EACA,SAAAiwE,CAAWrkF,GACP,OAAOzG,KAAKgT,QAAQjB,UAAU4I,OAAO,gBACzC,EACA,KAAAowE,CAAOtkF,GACP,EAGA,KAAAygB,GACI,OAAOlnB,KAAKgT,QAAQjB,UAAU4I,OAAO,aACzC,EAGA,SAAAqwE,CAAWtnC,GAEP,GADI1jD,KAAKgT,UAAYhT,KAAKmnF,mBAAmBnnF,KAAKgT,QAAQjB,UAAU8I,IAAI,cACpE7a,KAAKmnF,oBAAsBnnF,KAAKqV,QAAQ+xE,gBAAiB,CAIzD,IAAK,IAAIx4C,KAHT8U,EAAKunC,eAAiBxB,EAAyC/3E,cAAc1R,KAAKqV,QAAQm1E,gBAAgB7nF,QAC1G+gD,EAAK8mC,gBAAkB9mC,EAAKunC,eAC5BjrF,KAAKmnF,kBAAkBv1E,YAAY8xC,EAAKunC,gBACvBvnC,EAAKunC,eAAe3lE,iBAAiB,mBAAkBspB,EAAK+6C,YAAcjmC,EAAKpiD,KAChG,IAAKstC,KAAQ8U,EAAKunC,eAAe3lE,iBAAiB,kBAAkBspB,EAAK5jB,UAAYhrB,KAAKkrF,SAASxnC,EAAK35C,MACpG/J,KAAKqV,QAAQ6xE,iBACbxjC,EAAKynC,YAAc1B,EAAyC/3E,cAAc,oEAAoE1R,KAAKqV,QAAQ6yE,sBAC3JxkC,EAAKunC,eAAer5E,YAAY8xC,EAAKynC,cAEzC,IAAIC,EAAmB3kF,IACnBA,EAAEwb,iBACFxb,EAAEyb,kBACEwhC,EAAK5lB,SAAW2rD,EAAyC4B,UAAkB5B,EAAyC6B,QAAQtrF,KAAKqV,QAAQ4yE,6BAA8B,IAAIjoF,KAAKurF,WAAW7nC,IAGvL1jD,KAAKqV,QAAQ8yE,2BAAmCsB,EAAyC6B,QAAQtrF,KAAKqV,QAAQ8yE,2BAA4B,IAAInoF,KAAKurF,WAAW7nC,IAEtJ1jD,KAAKurF,WAAW7nC,IAGpC,IAAK,IAAI8nC,KAAc9nC,EAAKunC,eAAe3lE,iBAAiB,oBAAoBkmE,EAAWn4E,iBAAiB,QAAS+3E,EACzH,CACJ,EAEA,WAAAK,CAAa/nC,GAET,OAD2B,MAAvBA,EAAKunC,gBAA4D,MAAlCvnC,EAAKunC,eAAeh8D,YAAoBy0B,EAAKunC,eAAeh8D,WAAWG,YAAYs0B,EAAKunC,gBACpHjrF,KAAK0rF,6BAChB,EAGA,SAAAC,CAAWjoC,EAAMkoC,GACb,GAAIloC,EAAKunC,eAAgB,CACrBvnC,EAAKunC,eAAel5E,UAAU4I,OAAO,mBACrC,IAAK,IAAIkxE,KAAoBnoC,EAAKunC,eAAe3lE,iBAAiB,uBAC9DumE,EAAiBrxD,IAAMkpB,EAAKpiD,KAC5BuqF,EAAiB3jE,IAAM0jE,EAE3B,OAAOrsE,WAAW,IAAImkC,EAAKunC,eAAel5E,UAAU8I,IAAI,oBACtD,EACN,CACJ,EAGA,KAAAmgB,CAAO0oB,EAAMuR,GACT,GAAIvR,EAAKunC,eAAgB,CACrBvnC,EAAKunC,eAAel5E,UAAU8I,IAAI,YACX,iBAAZo6C,GAAwBA,EAAQj6B,QAAOi6B,EAAUA,EAAQj6B,OACpE,IAAK,IAAI4T,KAAQ8U,EAAKunC,eAAe3lE,iBAAiB,0BAA0BspB,EAAK+6C,YAAc10B,CACvG,CACJ,EACA,aAAA62B,GACA,EAIA,UAAAC,CAAYroC,GACR,GAAIA,EAAKunC,iBACLvnC,EAAKunC,eAAel5E,UAAU8I,IAAI,iBAC9B6oC,EAAKynC,aAAa,OAAOznC,EAAKynC,YAAYngE,UAAYhrB,KAAKqV,QAAQ0yE,gBAE/E,EACA,kBAAAiE,GACA,EAIA,cAAAC,CAAgBvoC,EAAMmW,EAAUqyB,GAC5B,GAAIxoC,EAAKunC,eAAgB,IAAK,IAAIr8C,KAAQ8U,EAAKunC,eAAe3lE,iBAAiB,4BAA8C,aAAlBspB,EAAKzrB,SAA0ByrB,EAAKztC,MAAQ04D,EAAWjrB,EAAKzqB,MAAM/L,MAAQ,GAAGyhD,IAC5L,EAGA,mBAAAsyB,GACA,EAIA,OAAAC,GACA,EACA,eAAAC,GACA,EAGA,OAAAC,CAAS5oC,GACL,GAAIA,EAAKunC,eAAgB,OAAOvnC,EAAKunC,eAAel5E,UAAU8I,IAAI,aACtE,EACA,eAAA0xE,GACA,EAEA,QAAAC,CAAU9oC,GACN,OAAO1jD,KAAKmW,KAAK,QAASutC,EAAM1jD,KAAKqV,QAAQ2yE,mBACjD,EACA,gBAAAyE,GACA,EAGA,QAAAtvE,CAAUumC,GAEN,GADIA,EAAKynC,cAAaznC,EAAKynC,YAAYngE,UAAYhrB,KAAKqV,QAAQ6yE,gBAC5DxkC,EAAKunC,eAAgB,OAAOvnC,EAAKunC,eAAel5E,UAAU8I,IAAI,cACtE,EACA,gBAAA6xE,GACA,EACA,gBAAAC,GACA,EACA,eAAAC,GACA,EACA,aAAAC,GACA,EACA,UAAAC,GACA,GAKJ,MAAMrD,UAAiD7E,EACnD,gBAAOmI,GAEH/sF,KAAKG,UAAU6sF,QAAUpI,EAQzB5kF,KAAKG,UAAU6V,OAAS,CACpB,OACA,YACA,UACA,YACA,WACA,YACA,YACA,aACA,cACA,YACA,QACA,gBACA,aACA,qBACA,iBACA,sBACA,UACA,kBACA,UACA,kBACA,WACA,mBACA,WACA,mBACA,QACA,mBACA,kBACA,iBAEJhW,KAAKG,UAAU8sF,gBAAkB,GACjCjtF,KAAKG,UAAU+sF,sBAAuB,CAC1C,CAEA,gBAAAC,GACI,OAAOntF,KAAKgiD,MAAMl+C,OAAQ4/C,GAAOA,EAAK0pC,UACpCrqF,IAAK2gD,GAAOA,EAElB,CAGA,gBAAA2pC,GACI,OAAOrtF,KAAKgiD,MAAMl+C,OAAQ4/C,IAAQA,EAAK0pC,UACrCrqF,IAAK2gD,GAAOA,EAElB,CACA,kBAAA4pC,CAAmBxvD,GACf,OAAO99B,KAAKgiD,MAAMl+C,OAAQ4/C,GAAOA,EAAK5lB,SAAWA,GAC/C/6B,IAAK2gD,GAAOA,EAElB,CAEA,cAAA6pC,GACI,OAAOvtF,KAAKstF,mBAAmB7D,EAAyC+D,OAC5E,CACA,iBAAAC,GACI,OAAOztF,KAAKstF,mBAAmB7D,EAAyC4B,UAC5E,CACA,aAAAqC,GACI,OAAO1tF,KAAKstF,mBAAmB7D,EAAyCkE,MAC5E,CAEA,cAAAC,GACI,OAAO5tF,KAAKgiD,MAAMl+C,OAAQ4/C,GAAOA,EAAK5lB,SAAW2rD,EAAyC4B,WAAa3nC,EAAK5lB,SAAW2rD,EAAyC+D,QAC9JzqF,IAAK2gD,GAAOA,EAElB,CAGA,IAAA/1B,GAII,GAF6B,SAAzB3tB,KAAKgT,QAAQ66E,SAAoB7tF,KAAKgT,QAAQyS,aAAa,UAAW,uBACtEzlB,KAAKgT,QAAQjB,UAAUsM,SAAS,cAAgBre,KAAKgT,QAAQ0L,cAAc,gBAAgB1e,KAAKgT,QAAQpB,YAAY63E,EAAyC/3E,cAAc,8EAA8E1R,KAAKqV,QAAQoyE,sCACtQznF,KAAK8tF,kBAAkB7sF,OAAQ,CAC/B,IAAI8sF,EAAuB,KACnB/tF,KAAKguF,iBAAiBhuF,KAAKguF,gBAAgB/+D,WAAWG,YAAYpvB,KAAKguF,iBAC3EhuF,KAAKguF,gBAAkB58E,SAASM,cAAc,SAC9C1R,KAAKguF,gBAAgBvoE,aAAa,OAAQ,SACZ,OAA1BzlB,KAAKqV,QAAQoxE,UAAqBzmF,KAAKqV,QAAQoxE,SAAW,IAAGzmF,KAAKguF,gBAAgBvoE,aAAa,WAAY,YAC/GzlB,KAAKguF,gBAAgBzvD,UAAY,kBACE,OAA/Bv+B,KAAKqV,QAAQyxE,eAAwB9mF,KAAKguF,gBAAgBvoE,aAAa,SAAUzlB,KAAKqV,QAAQyxE,eACrE,OAAzB9mF,KAAKqV,QAAQyK,SAAkB9f,KAAKguF,gBAAgBvoE,aAAa,UAAWzlB,KAAKqV,QAAQyK,SAE7F9f,KAAKguF,gBAAgBvoE,aAAa,WAAY,MAG9CzlB,KAAKguF,gBAAgB7pE,MAAM+K,WAAa,SACxClvB,KAAKguF,gBAAgB7pE,MAAMiV,SAAW,WACtCp5B,KAAKguF,gBAAgB7pE,MAAMxG,IAAM,IACjC3d,KAAKguF,gBAAgB7pE,MAAMrG,KAAO,IAClC9d,KAAKguF,gBAAgB7pE,MAAM9L,OAAS,IACpCrY,KAAKguF,gBAAgB7pE,MAAM/L,MAAQ,IACnCqxE,EAAyCwE,WAAWjuF,KAAKqV,QAAQgyE,qBAAsB,wBAAwBz1E,YAAY5R,KAAKguF,iBAChIhuF,KAAKguF,gBAAgB36E,iBAAiB,SAAU,KAC5C,IAAM2uC,MAAOA,GAAWhiD,KAAKguF,gBAC7B,GAAIhsC,EAAM/gD,OAAQ,IAAK,IAAIyiD,KAAQ1B,EAAMhiD,KAAKkuF,QAAQxqC,GACtD1jD,KAAKmW,KAAK,aAAc6rC,GACxB+rC,OAGRA,GACJ,CACA/tF,KAAKm4B,IAAqB,OAAfpnB,OAAOonB,IAAepnB,OAAOonB,IAAMpnB,OAAOo9E,UAIrD,IAAK,IAAIthB,KAAa7sE,KAAKgW,OAAOhW,KAAKwV,GAAGq3D,EAAW7sE,KAAKqV,QAAQw3D,IAClE7sE,KAAKwV,GAAG,iBAAkB,IAAIxV,KAAKouF,6BAEnCpuF,KAAKwV,GAAG,cAAe,IAAIxV,KAAKouF,6BAEhCpuF,KAAKwV,GAAG,WAAakuC,GAAO1jD,KAAKmW,KAAK,WAAYutC,IAGlD1jD,KAAKwV,GAAG,WAAakuC,IACjB,GAAoC,IAAhC1jD,KAAK0tF,gBAAgBzsF,QAAoD,IAApCjB,KAAKytF,oBAAoBxsF,QAAiD,IAAjCjB,KAAKutF,iBAAiBtsF,OACxG,OAAOse,WAAW,IAAIvf,KAAKmW,KAAK,iBAC9B,KAWN,IAAIk4E,EAAgB,SAAS5nF,GAIzB,GAbkB,SAASA,GAC3B,GAAIA,EAAE6nF,aAAa/nF,MAGnB,IAAI,IAAIuK,EAAI,EAAGA,EAAIrK,EAAE6nF,aAAa/nF,MAAMtF,OAAQ6P,IAC5C,GAAgC,UAA5BrK,EAAE6nF,aAAa/nF,MAAMuK,GAAgB,OAAO,EAEpD,OAAO,CACX,CAKSy9E,CAAc9nF,GAEnB,OADAA,EAAEyb,kBACEzb,EAAEwb,eAAuBxb,EAAEwb,iBACnBxb,EAAE+nF,aAAc,CAChC,EAoDA,OAlDAxuF,KAAKgtE,UAAY,CACb,CACIh6D,QAAShT,KAAKgT,QACdgD,OAAQ,CACJ00E,UAAYjkF,GACDzG,KAAKmW,KAAK,YAAa1P,GAElCmkF,UAAYnkF,IACR4nF,EAAc5nF,GACPzG,KAAKmW,KAAK,YAAa1P,IAElCokF,SAAWpkF,IAIP,IAAIgoF,EACJ,IACIA,EAAOhoF,EAAE6nF,aAAaI,aAC1B,CAAE,MAAO1zD,GACT,CAGA,OAFAv0B,EAAE6nF,aAAaK,WAAa,SAAWF,GAAQ,aAAeA,EAAO,OAAS,OAC9EJ,EAAc5nF,GACPzG,KAAKmW,KAAK,WAAY1P,IAEjCqkF,UAAYrkF,GACDzG,KAAKmW,KAAK,YAAa1P,GAElCgkF,KAAOhkF,IACH4nF,EAAc5nF,GACPzG,KAAKyqF,KAAKhkF,IAErBkkF,QAAUlkF,GACCzG,KAAKmW,KAAK,UAAW1P,MAK5CzG,KAAK8tF,kBAAkBh8E,QAAS88E,GACrB5uF,KAAKgtE,UAAUtiE,KAAK,CACvBsI,QAAS47E,EACT54E,OAAQ,CACJoD,MAAQ4rE,KAEA4J,IAAqB5uF,KAAKgT,SAAWgyE,EAAI5jF,SAAWpB,KAAKgT,SAAWy2E,EAAyCoF,cAAc7J,EAAI5jF,OAAQpB,KAAKgT,QAAQ0L,cAAc,kBAAiB1e,KAAKguF,gBAAgB50E,SACrM,OAKvBpZ,KAAKye,SACEze,KAAKqV,QAAQsY,KAAK5tB,KAAKC,KAClC,CAEA,OAAAmnB,GAQI,OAPAnnB,KAAK8uF,UACL9uF,KAAK+uF,gBAAe,IACQ,MAAxB/uF,KAAKguF,gBAA0BhuF,KAAKguF,gBAAgB/+D,gBAAarrB,KACjE5D,KAAKguF,gBAAgB/+D,WAAWG,YAAYpvB,KAAKguF,iBACjDhuF,KAAKguF,gBAAkB,aAEpBhuF,KAAKgT,QAAQg8E,SACbvF,EAAyC9L,UAAUz1E,OAAOuhF,EAAyC9L,UAAUzsE,QAAQlR,MAAO,EACvI,CACA,yBAAAouF,GACI,IAAIa,EACAC,EAAiB,EACjBC,EAAa,EAEjB,GADkBnvF,KAAK4tF,iBACP3sF,OAAQ,CACpB,IAAK,IAAIyiD,KAAQ1jD,KAAK4tF,iBAClBsB,GAAkBxrC,EAAKklC,OAAOsD,UAC9BiD,GAAczrC,EAAKklC,OAAOwG,MAE9BH,EAAsB,IAAMC,EAAiBC,CACjD,MAAOF,EAAsB,IAC7B,OAAOjvF,KAAKmW,KAAK,sBAAuB84E,EAAqBE,EAAYD,EAC7E,CAGA,aAAAG,CAAclgF,GACV,MAAsC,mBAA3BnP,KAAKqV,QAAQwwE,UAAiC7lF,KAAKqV,QAAQwwE,UAAU12E,GACpE,GAAGnP,KAAKqV,QAAQwwE,YAAY7lF,KAAKqV,QAAQgwE,eAAiB,IAAIl2E,KAAO,IACrF,CAGA,WAAAmgF,CAAY5rC,GACR,MAAuC,mBAA5B1jD,KAAKqV,QAAQkyE,WAAkC7jC,EAAKpiD,KACxDtB,KAAKqV,QAAQkyE,WAAW7jC,EACnC,CAKA,eAAAmmC,GACI,IAAI0F,EAAkBC,EACtB,GAAID,EAAmBvvF,KAAKyvF,sBAAuB,OAAOF,EAC1D,IAAIG,EAAe,4BACf1vF,KAAKqV,QAAQsyE,mBAAkB+H,GAAgB,MAAM1vF,KAAKqV,QAAQsyE,wBACtE+H,GAAgB,4BAA4B1vF,KAAKqvF,cAAc,OAAOrvF,KAAKqV,QAAQgwE,eAAiB,2BAAwBzhF,kDAC5H,IAAI+rF,EAASlG,EAAyC/3E,cAAcg+E,GASpE,MAR6B,SAAzB1vF,KAAKgT,QAAQ66E,SACb2B,EAAO/F,EAAyC/3E,cAAc,iBAAiB1R,KAAKqV,QAAQuoC,8CAA8C59C,KAAKqV,QAAQunB,mBACvJ4yD,EAAK59E,YAAY+9E,KAGjB3vF,KAAKgT,QAAQyS,aAAa,UAAW,uBACrCzlB,KAAKgT,QAAQyS,aAAa,SAAUzlB,KAAKqV,QAAQunB,SAEtC,MAAR4yD,EAAeA,EAAOG,CACjC,CAIA,mBAAAF,GACI,IAAIG,EAAc,SAAS/d,GACvB,IAAK,IAAI1pD,KAAM0pD,EACX,GAAI,qBAAqB1tE,KAAKgkB,EAAGoW,WAAY,OAAOpW,CAE5D,EACA,IAAK,IAAI0lE,IAAW,CAChB,MACA,QACF,CACE,IAAItE,EACJ,GAAIA,EAAWqG,EAAY5vF,KAAKgT,QAAQyrB,qBAAqBovD,IAAW,OAAOtE,CACnF,CACJ,CAEA,mBAAAsG,GACI,OAAO7vF,KAAKgtE,UAAUjqE,IAAK+sF,GAAmB,MACtC,IAAI3mF,EAAS,GACb,IAAI,IAAI2Z,KAASgtE,EAAiB95E,OAAO,CACrC,IAAI82D,EAAWgjB,EAAiB95E,OAAO8M,GACvC3Z,EAAOuB,KAAKolF,EAAiB98E,QAAQK,iBAAiByP,EAAOgqD,GAAU,GAC3E,CACA,OAAO3jE,CACV,EAPyC,GASlD,CAEA,oBAAA4mF,GACI,OAAO/vF,KAAKgtE,UAAUjqE,IAAK+sF,GAAmB,MACtC,IAAI3mF,EAAS,GACb,IAAI,IAAI2Z,KAASgtE,EAAiB95E,OAAO,CACrC,IAAI82D,EAAWgjB,EAAiB95E,OAAO8M,GACvC3Z,EAAOuB,KAAKolF,EAAiB98E,QAAQoB,oBAAoB0O,EAAOgqD,GAAU,GAC9E,CACA,OAAO3jE,CACV,EAPyC,GASlD,CAEA,OAAA2lF,GAKI,OAJA9uF,KAAK8tF,kBAAkBh8E,QAASkB,GAAUA,EAAQjB,UAAU4I,OAAO,iBAEnE3a,KAAK+vF,uBACL/vF,KAAKs3D,UAAW,EACTt3D,KAAKgiD,MAAMj/C,IAAK2gD,GAAO1jD,KAAKgwF,aAAatsC,GAEpD,CACA,MAAAjlC,GAII,cAHOze,KAAKs3D,SACZt3D,KAAK8tF,kBAAkBh8E,QAASkB,GAAUA,EAAQjB,UAAU8I,IAAI,iBAEzD7a,KAAK6vF,qBAChB,CAEA,QAAA3E,CAASnhF,GACL,IAAIkmF,EAAe,EACfC,EAAe,IACnB,GAAInmF,EAAO,EAAG,CACV,IAAIomF,EAAQ,CACR,KACA,KACA,KACA,KACA,KAEJ,IAAI,IAAIr/E,EAAI,EAAGA,EAAIq/E,EAAMlvF,OAAQ6P,IAAI,CACjC,IAAI2vE,EAAO0P,EAAMr/E,GAEjB,GAAI/G,GADStB,KAAKmM,IAAI5U,KAAKqV,QAAQmxE,aAAc,EAAI11E,GAAK,GACtC,CAChBm/E,EAAelmF,EAAOtB,KAAKmM,IAAI5U,KAAKqV,QAAQmxE,aAAc,EAAI11E,GAC9Do/E,EAAezP,EACf,KACJ,CACJ,CACAwP,EAAexnF,KAAK8H,MAAM,GAAK0/E,GAAgB,EACnD,CACA,MAAO,WAAWA,cAAyBjwF,KAAKqV,QAAQgzE,kBAAkB6H,IAC9E,CAEA,2BAAAxE,GACI,OAA6B,MAAzB1rF,KAAKqV,QAAQoxE,UAAoBzmF,KAAKmtF,mBAAmBlsF,QAAUjB,KAAKqV,QAAQoxE,UAC5EzmF,KAAKmtF,mBAAmBlsF,SAAWjB,KAAKqV,QAAQoxE,UAAUzmF,KAAKmW,KAAK,kBAAmBnW,KAAKgiD,OACzFhiD,KAAKgT,QAAQjB,UAAU8I,IAAI,yBACxB7a,KAAKgT,QAAQjB,UAAU4I,OAAO,uBAChD,CACA,IAAA8vE,CAAKhkF,GACD,IAAKA,EAAE6nF,aAAc,OACrBtuF,KAAKmW,KAAK,OAAQ1P,GAGlB,IAAIu7C,EAAQ,GACZ,IAAI,IAAIlxC,EAAI,EAAGA,EAAIrK,EAAE6nF,aAAatsC,MAAM/gD,OAAQ6P,IAAIkxC,EAAMlxC,GAAKrK,EAAE6nF,aAAatsC,MAAMlxC,GAEpF,GAAIkxC,EAAM/gD,OAAQ,CACd,IAAMolC,MAAOA,GAAW5/B,EAAE6nF,aACtBjoD,GAASA,EAAMplC,QAAuC,MAA7BolC,EAAM,GAAG+pD,iBACtCpwF,KAAKqwF,mBAAmBhqD,GACnBrmC,KAAKswF,YAAYtuC,EAC1B,CACAhiD,KAAKmW,KAAK,aAAc6rC,EAC5B,CACA,KAAA+oC,CAAMtkF,GACF,GACK,OA8kCF,OAD8BtF,EA9kCQ,MAALsF,EAAYA,EAAE8pF,mBAAgB3sF,GAAW,CAAC4W,GAAIA,EAAE6rB,MA+kChC5gC,CAAUtE,QAASyC,GA9kC5D,OA6kCnB,IAAyCzC,EA5kCjCnB,KAAKmW,KAAK,QAAS1P,GACnB,IAAM4/B,MAAOA,GAAW5/B,EAAE8pF,cAC1B,OAAIlqD,EAAMplC,OAAejB,KAAKqwF,mBAAmBhqD,QAAjD,CACJ,CACA,WAAAiqD,CAAYtuC,GACR,IAAK,IAAI0B,KAAQ1B,EAAMhiD,KAAKkuF,QAAQxqC,EACxC,CAGA,kBAAA2sC,CAAmBhqD,GACf,MAAO,MACH,IAAIl9B,EAAS,GACb,IAAK,IAAIm5C,KAAQjc,EAAM,CACnB,IAAI78B,EACyB,MAAzB84C,EAAK8tC,mBAA6B5mF,EAAQ84C,EAAK8tC,oBAC3C5mF,EAAMgnF,OAAQrnF,EAAOuB,KAAK1K,KAAKkuF,QAAQ5rC,EAAKmuC,cACvCjnF,EAAMknF,YACfvnF,EAAOuB,KAAK1K,KAAK2wF,uBAAuBnnF,EAAOA,EAAMlI,OAChD6H,EAAOuB,UAAK9G,GACQ,MAAlB0+C,EAAKmuC,WACK,MAAbnuC,EAAKsuC,MAA8B,SAAdtuC,EAAKsuC,KAE3BznF,EAAOuB,UAAK9G,GAFgCuF,EAAOuB,KAAK1K,KAAKkuF,QAAQ5rC,EAAKmuC,aAGrF,CACA,OAAOtnF,CACV,EAfM,EAgBX,CAEA,sBAAAwnF,CAAuBE,EAAWn6C,GAC9B,IAAIo6C,EAAYD,EAAUE,eACtBC,EAAgBh2D,IAAQi2D,OAijC4BxrF,EAjjC2BrG,GAAIA,EAAEi1E,IAAIr5C,GAkjC7F,OADuCh8B,EAjjC2B0jB,UAkjCO,mBAApB1jB,EAAc,IAAyByG,EAAUzG,QACrG,EAFT,IAA+CA,EAAiByG,GA9iCxD,IAAIyrF,EAAc,IACPJ,EAAUI,YAAa7nF,IAC1B,GAAIA,EAAQpI,OAAS,EAAG,CACpB,IAAK,IAAIuI,KAASH,EACVG,EAAMgnF,OAAQhnF,EAAMk6C,KAAMA,IAC1B,IAAI1jD,KAAKqV,QAAQwxE,mBAAmD,MAA9BnjC,EAAKpiD,KAAKyU,UAAU,EAAG,GAE7D,OADA2tC,EAAKytC,SAAW,GAAGz6C,KAAQgN,EAAKpiD,OACzBtB,KAAKkuF,QAAQxqC,KAEfl6C,EAAMknF,aAAa1wF,KAAK2wF,uBAAuBnnF,EAAO,GAAGktC,KAAQltC,EAAMlI,QAKpF4vF,GACJ,CACA,OAAO,MACRF,GAEP,OAAOE,GACX,CAOA,MAAA9H,CAAO1lC,EAAMzpB,GACLj6B,KAAKqV,QAAQuwE,aAAeliC,EAAK35C,KAAkC,QAA3B/J,KAAKqV,QAAQuwE,YAAuB3rD,EAAKj6B,KAAKqV,QAAQuyE,eAAezkF,QAAQ,eAAgBsF,KAAK8H,MAAMmzC,EAAK35C,KAAO,KAAO,OAAS,KAAK5G,QAAQ,kBAAmBnD,KAAKqV,QAAQuwE,cACnN6D,EAAyC2H,YAAY1tC,EAAM1jD,KAAKqV,QAAQyxE,eAChD,MAAzB9mF,KAAKqV,QAAQoxE,UAAoBzmF,KAAKmtF,mBAAmBlsF,QAAUjB,KAAKqV,QAAQoxE,UACrFxsD,EAAKj6B,KAAKqV,QAAQ+yE,qBAAqBjlF,QAAQ,eAAgBnD,KAAKqV,QAAQoxE,WAC5EzmF,KAAKmW,KAAK,mBAAoButC,IAC3B1jD,KAAKqV,QAAQ+zE,OAAOrpF,KAAKC,KAAM0jD,EAAMzpB,GAJsDA,EAAKj6B,KAAKqV,QAAQwyE,oBAKxH,CACA,OAAAqG,CAAQxqC,GACJA,EAAKklC,OAAS,CACVC,KAAMY,EAAyC4H,SAC/Cx3B,SAAU,EAGVu1B,MAAO1rC,EAAK35C,KACZmiF,UAAW,EACXoF,SAAUtxF,KAAKsvF,YAAY5rC,IAE/B1jD,KAAKgiD,MAAMt3C,KAAKg5C,GAChBA,EAAK5lB,OAAS2rD,EAAyCkE,MACvD3tF,KAAKmW,KAAK,YAAautC,GACvB1jD,KAAKuxF,kBAAkB7tC,GACvB1jD,KAAKopF,OAAO1lC,EAAO1oB,IACXA,GACA0oB,EAAK0pC,UAAW,EAChBptF,KAAKwxF,iBAAiB,CAClB9tC,GACD1oB,KAEH0oB,EAAK0pC,UAAW,EACZptF,KAAKqV,QAAQ4xE,WAAWjnF,KAAKyxF,YAAY/tC,IAGjD1jD,KAAK0rF,+BAEb,CAEA,YAAAgG,CAAa1vC,GACT,IAAK,IAAI0B,KAAQ1B,EAAMhiD,KAAKyxF,YAAY/tC,GACxC,OAAO,IACX,CACA,WAAA+tC,CAAY/tC,GACR,GAAIA,EAAK5lB,SAAW2rD,EAAyCkE,QAA2B,IAAlBjqC,EAAK0pC,SAIpE,MAAM,IAAIx2E,MAAM,oFAFnB,GADA8sC,EAAK5lB,OAAS2rD,EAAyC+D,OACnDxtF,KAAKqV,QAAQ2xE,iBAAkB,OAAOznE,WAAW,IAAIvf,KAAK2xF,eAC5D,EAEV,CACA,iBAAAJ,CAAkB7tC,GACd,GAAI1jD,KAAKqV,QAAQywE,uBAAyBpiC,EAAKzjD,KAAKyD,MAAM,YAAcggD,EAAK35C,MAA4C,QAApC/J,KAAKqV,QAAQ0wE,qBAE9F,OADA/lF,KAAKitF,gBAAgBviF,KAAKg5C,GACnBnkC,WAAW,IAAIvf,KAAK4xF,yBACzB,EAEV,CACA,sBAAAA,GACI,GAAI5xF,KAAKktF,sBAAwD,IAAhCltF,KAAKitF,gBAAgBhsF,OAAc,OACpEjB,KAAKktF,sBAAuB,EAC5B,IAAIxpC,EAAO1jD,KAAKitF,gBAAgB14B,QAChC,OAAOv0D,KAAK6xF,gBAAgBnuC,EAAM1jD,KAAKqV,QAAQ2wE,eAAgBhmF,KAAKqV,QAAQ4wE,gBAAiBjmF,KAAKqV,QAAQ6wE,iBAAiB,EAAO0F,IAC9H5rF,KAAKmW,KAAK,YAAautC,EAAMkoC,GAC7B5rF,KAAKktF,sBAAuB,EACrBltF,KAAK4xF,0BAEpB,CAEA,UAAArG,CAAW7nC,GAIP,GAHIA,EAAK5lB,SAAW2rD,EAAyC4B,WAAWrrF,KAAKgwF,aAAatsC,GAC1F1jD,KAAKgiD,MAAQ8vC,EAA8B9xF,KAAKgiD,MAAO0B,GACvD1jD,KAAKmW,KAAK,cAAeutC,GACC,IAAtB1jD,KAAKgiD,MAAM/gD,OAAc,OAAOjB,KAAKmW,KAAK,QAClD,CAEA,cAAA44E,CAAegD,GAEc,MAArBA,IAA2BA,GAAoB,GACnD,IAAK,IAAIruC,KAAQ1jD,KAAKgiD,MAAMl1C,SAAY42C,EAAK5lB,SAAW2rD,EAAyC4B,WAAa0G,IAAmB/xF,KAAKurF,WAAW7nC,GACjJ,OAAO,IACX,CAIA,WAAA6mC,CAAY7mC,EAAMtrC,EAAOC,EAAQkuE,EAAcr3C,GAC3C,OAAOlvC,KAAK6xF,gBAAgBnuC,EAAMtrC,EAAOC,EAAQkuE,GAAc,EAAM,CAACqF,EAASoG,KAC3E,GAAc,MAAVA,EACJ,OAAO9iD,EAASwU,GACX,CACD,IAAM2iC,eAAgBA,GAAoBrmF,KAAKqV,QACzB,MAAlBgxE,IAAwBA,EAAiB3iC,EAAKzjD,MAClD,IAAIgyF,EAAiBD,EAAOE,UAAU7L,EAAgBrmF,KAAKqV,QAAQixE,eAGnE,MAFuB,eAAnBD,GAAsD,cAAnBA,IACvC4L,EAAiBE,EAAkCC,QAAQ1uC,EAAK2uC,QAASJ,IAClE/iD,EAASu6C,EAAyC6I,cAAcL,GAC3E,GAER,CACA,eAAAJ,CAAgBnuC,EAAMtrC,EAAOC,EAAQkuE,EAAcgM,EAAgBrjD,GAC/D,IAAIsjD,EAAa,IAAIC,WACrBD,EAAW14D,OAAS,KAChB4pB,EAAK2uC,QAAUG,EAAWrpF,OAER,kBAAdu6C,EAAKzjD,KAITD,KAAK0yF,uBAAuBhvC,EAAMtrC,EAAOC,EAAQkuE,EAAcgM,EAAgBrjD,GAH3D,MAAZA,GAAkBA,EAASsjD,EAAWrpF,SAKlDqpF,EAAWG,cAAcjvC,EAC7B,CAOA,mBAAAkvC,CAAoBC,EAAUC,EAAU5jD,EAAU6jD,EAAaC,GAAkB,GAG7E,GAFAhzF,KAAKmW,KAAK,YAAa08E,GACvB7yF,KAAKmW,KAAK,WAAY08E,GACjBG,EAGE,CACH,IAAI/1D,EAAU0uD,IACV3rF,KAAKmW,KAAK,YAAa08E,EAAUlH,GAC7Bz8C,GAAUA,KAElB2jD,EAASR,QAAUS,EACnB9yF,KAAK0yF,uBAAuBG,EAAU7yF,KAAKqV,QAAQ2wE,eAAgBhmF,KAAKqV,QAAQ4wE,gBAAiBjmF,KAAKqV,QAAQ6wE,gBAAiBlmF,KAAKqV,QAAQk9E,eAAgBt1D,EAAQ81D,EACxK,MATI/yF,KAAKmW,KAAK,YAAa08E,EAAUC,GAC7B5jD,GAAUA,GAStB,CACA,sBAAAwjD,CAAuBhvC,EAAMtrC,EAAOC,EAAQkuE,EAAcgM,EAAgBrjD,EAAU6jD,GAGhF,IAAIjnC,EAAM16C,SAASM,cAAc,OAoEjC,OAnEIqhF,IAAajnC,EAAIinC,YAAcA,GAEnCR,EAAwE,cAAvDvhF,iBAAiBI,SAASC,MAAwB,kBAA4BkhF,EAC/FzmC,EAAIhyB,OAAS,KACT,IAAIm5D,EAAY/jD,GAAWA,EAAS,GAMpC,MAJoB,oBAATgkD,MAAiC,OAATA,MAAiBX,IAAgBU,EAAY/jD,GAAWgkD,KAAKC,QAAQrnC,EAAK,WACrG,OAAO5c,EAASgkD,KAAKE,OAAOpzF,KAAM,eACtC,IAEGizF,EAAUI,IACb3vC,EAAKtrC,MAAQ0zC,EAAI1zC,MACjBsrC,EAAKrrC,OAASyzC,EAAIzzC,OAClB,IAAIi7E,EAAatzF,KAAKqV,QAAQkpE,OAAOx+E,KAAKC,KAAM0jD,EAAMtrC,EAAOC,EAAQkuE,GACjEyL,EAAS5gF,SAASM,cAAc,UAChC6hF,EAAMvB,EAAOwB,WAAW,MAO5B,OANAxB,EAAO55E,MAAQk7E,EAAWlJ,SAC1B4H,EAAO35E,OAASi7E,EAAWjJ,UACvBgJ,EAAc,IACdrB,EAAO55E,MAAQk7E,EAAWjJ,UAC1B2H,EAAO35E,OAASi7E,EAAWlJ,UAExBiJ,GACH,KAAK,EAEDE,EAAIztE,UAAUksE,EAAO55E,MAAO,GAC5Bm7E,EAAIh3E,OAAO,EAAG,GACd,MACJ,KAAK,EAEDg3E,EAAIztE,UAAUksE,EAAO55E,MAAO45E,EAAO35E,QACnCk7E,EAAIvtE,OAAOvd,KAAK4T,IAChB,MACJ,KAAK,EAEDk3E,EAAIztE,UAAU,EAAGksE,EAAO35E,QACxBk7E,EAAIh3E,MAAM,GAAI,GACd,MACJ,KAAK,EAEDg3E,EAAIvtE,OAAO,GAAMvd,KAAK4T,IACtBk3E,EAAIh3E,MAAM,GAAI,GACd,MACJ,KAAK,EAEDg3E,EAAIvtE,OAAO,GAAMvd,KAAK4T,IACtBk3E,EAAIztE,UAAU,GAAIksE,EAAO55E,OACzB,MACJ,KAAK,EAEDm7E,EAAIvtE,OAAO,GAAMvd,KAAK4T,IACtBk3E,EAAIztE,UAAUksE,EAAO35E,QAAS25E,EAAO55E,OACrCm7E,EAAIh3E,OAAO,EAAG,GACd,MACJ,KAAK,EAEDg3E,EAAIvtE,QAAQ,GAAMvd,KAAK4T,IACvBk3E,EAAIztE,WAAWksE,EAAO35E,OAAQ,GAItCo7E,EAAsCF,EAAKznC,EAAwB,MAAnBwnC,EAAWxJ,KAAewJ,EAAWxJ,KAAO,EAAsB,MAAnBwJ,EAAWvJ,KAAeuJ,EAAWvJ,KAAO,EAAGuJ,EAAWtJ,SAAUsJ,EAAWrJ,UAA8B,MAAnBqJ,EAAWI,KAAeJ,EAAWI,KAAO,EAAsB,MAAnBJ,EAAWK,KAAeL,EAAWK,KAAO,EAAGL,EAAWlJ,SAAUkJ,EAAWjJ,WACvT,IAAIsB,EAAYqG,EAAOE,UAAU,aACjC,GAAgB,MAAZhjD,EAAkB,OAAOA,EAASy8C,EAAWqG,MAGzC,MAAZ9iD,IAAkB4c,EAAI/xB,QAAUmV,GAC7B4c,EAAI5jC,IAAMw7B,EAAK2uC,OAC1B,CAEA,YAAAV,GACI,IAAMvM,gBAAiBA,GAAqBplF,KAAKqV,QAC7Cu+E,EAAmB5zF,KAAKytF,oBAAoBxsF,OAC5C6P,EAAI8iF,EAER,GAAIA,GAAoBxO,EAAiB,OACzC,IAAIyO,EAAc7zF,KAAKutF,iBACvB,GAAMsG,EAAY5yF,OAAS,EAA3B,CACA,GAAIjB,KAAKqV,QAAQgwE,eACjB,OAAOrlF,KAAK8zF,aAAaD,EAAY/mF,MAAM,EAAGs4E,EAAkBwO,IAC3D,KAAM9iF,EAAIs0E,GAAgB,CAC3B,IAAKyO,EAAY5yF,OAAQ,OAEzBjB,KAAK+zF,YAAYF,EAAYt/B,SAC7BzjD,GACJ,CARqC,CASzC,CAEA,WAAAijF,CAAYrwC,GACR,OAAO1jD,KAAK8zF,aAAa,CACrBpwC,GAER,CAEA,YAAAowC,CAAa9xC,GACT,IAAK,IAAI0B,KAAQ1B,EACb0B,EAAKqoC,YAAa,EAClBroC,EAAK5lB,OAAS2rD,EAAyC4B,UACvDrrF,KAAKmW,KAAK,aAAcutC,GAG5B,OADI1jD,KAAKqV,QAAQgwE,gBAAgBrlF,KAAKmW,KAAK,qBAAsB6rC,GAC1DhiD,KAAKg0F,YAAYhyC,EAC5B,CACA,gBAAAiyC,CAAiB73D,GAEb,OAAep8B,KAAKgiD,MAAMl+C,OAAQ4/C,GAAOA,EAAKtnB,MAAQA,GACpDr5B,IAAK2gD,GAAOA,EAElB,CAKA,YAAAssC,CAAatsC,GACT,GAAIA,EAAK5lB,SAAW2rD,EAAyC4B,UAAW,CACpE,IAAI6I,EAAel0F,KAAKi0F,iBAAiBvwC,EAAKtnB,KAC9C,IAAK,IAAI+3D,KAAeD,EAAaC,EAAYr2D,OAAS2rD,EAAyC2K,cAC3E,IAAb1wC,EAAKtnB,KAAqBsnB,EAAKtnB,IAAIC,QAC9C,IAAK,IAAIg4D,KAAgBH,EAAal0F,KAAKmW,KAAK,WAAYk+E,GACxDr0F,KAAKqV,QAAQgwE,gBAAgBrlF,KAAKmW,KAAK,mBAAoB+9E,EACnE,MAAWxwC,EAAK5lB,SAAW2rD,EAAyCkE,OAASjqC,EAAK5lB,SAAW2rD,EAAyC+D,SAClI9pC,EAAK5lB,OAAS2rD,EAAyC2K,SACvDp0F,KAAKmW,KAAK,WAAYutC,GAClB1jD,KAAKqV,QAAQgwE,gBAAgBrlF,KAAKmW,KAAK,mBAAoB,CAC3DutC,KAGR,GAAI1jD,KAAKqV,QAAQ2xE,iBAAkB,OAAOhnF,KAAK2xF,cACnD,CACA,aAAA2C,CAAc/+E,KAAW1F,GACrB,MAAsB,mBAAX0F,EAA8BA,EAAO7G,MAAM1O,KAAM6P,GACrD0F,CACX,CACA,UAAAg/E,CAAW7wC,GACP,OAAO1jD,KAAKg0F,YAAY,CACpBtwC,GAER,CACA,WAAAswC,CAAYhyC,GACRhiD,KAAKw0F,gBAAgBxyC,EAAQyyC,IACzB,GAAIz0F,KAAKqV,QAAQiwE,SAAU,CAGvB,IAAIoP,EAAkBD,EAAiB,GACvCzyC,EAAM,GAAG4mC,OAAO+L,QAAU30F,KAAKqV,QAAQiwE,WAAatlF,KAAKqV,QAAQkwE,eAAiBmP,EAAgB3qF,KAAO/J,KAAKqV,QAAQmwE,WACtHxjC,EAAM,GAAG4mC,OAAOM,gBAAkBzgF,KAAKi3C,KAAKg1C,EAAgB3qF,KAAO/J,KAAKqV,QAAQmwE,UACpF,CACA,GAAIxjC,EAAM,GAAG4mC,OAAO+L,QAAS,CAIzB,IAAIjxC,EAAO1B,EAAM,GACb0yC,EAAkBD,EAAiB,GACnCG,EAAoB,EACxBlxC,EAAKklC,OAAOiM,OAAS,GACrB,IAAIC,EAAkB,KAClB,IAAIC,EAAa,EAEjB,UAAyCnxF,IAAnC8/C,EAAKklC,OAAOiM,OAAOE,IAA0BA,IAEnD,GAAIA,GAAcrxC,EAAKklC,OAAOM,gBAAiB,OAC/C0L,IACA,IAAIhlF,EAAQmlF,EAAa/0F,KAAKqV,QAAQmwE,UAClCzyE,EAAMtK,KAAKoU,IAAIjN,EAAQ5P,KAAKqV,QAAQmwE,UAAWkP,EAAgB3qF,MAC/DirF,EAAY,CACZ1zF,KAAMtB,KAAKqvF,cAAc,GACzBxlF,KAAM6qF,EAAgBO,YAAcP,EAAgBO,YAAYrlF,EAAOmD,GAAO2hF,EAAgB5nF,MAAM8C,EAAOmD,GAC3Gu+E,SAAU5tC,EAAKklC,OAAO0I,SACtByD,WAAYA,GAEhBrxC,EAAKklC,OAAOiM,OAAOE,GAAc,CAC7BrxC,KAAMA,EACNp6C,MAAOyrF,EACPC,UAAWA,EACXl3D,OAAQ2rD,EAAyC4B,UACjDxxB,SAAU,EACVq7B,QAAS,GAEbl1F,KAAKm1F,YAAYnzC,EAAO,CACpBgzC,KAoBR,GAjBAtxC,EAAKklC,OAAOwM,oBAAsB,CAAC1M,EAAO2M,KACtC,IAAIC,GAAc,EAClB5M,EAAM5qD,OAAS2rD,EAAyC8L,QAExD7M,EAAMsM,UAAY,KAClBtM,EAAM2M,SAAW3M,EAAMtsD,IAAI2B,aAC3B2qD,EAAM8M,gBAAkB9M,EAAMtsD,IAAIq5D,wBAElC/M,EAAMtsD,IAAM,KACZ,IAAI,IAAItrB,EAAI,EAAGA,EAAI4yC,EAAKklC,OAAOM,gBAAiBp4E,IAAI,CAChD,QAA8BlN,IAA1B8/C,EAAKklC,OAAOiM,OAAO/jF,GAAkB,OAAOgkF,IAC5CpxC,EAAKklC,OAAOiM,OAAO/jF,GAAGgtB,SAAW2rD,EAAyC8L,UAASD,GAAc,EACzG,CACIA,GAAat1F,KAAKqV,QAAQg0E,eAAe3lC,EAAM,KAC/C1jD,KAAK01F,UAAU1zC,EAAOqzC,EAAU,SAGpCr1F,KAAKqV,QAAQowE,qBAAsB,IAAI,IAAI30E,EAAI,EAAGA,EAAI4yC,EAAKklC,OAAOM,gBAAiBp4E,IAAIgkF,SACtFA,GACT,KAAO,CACH,IAAIa,EAAa,GACjB,IAAI,IAAI7kF,EAAI,EAAGA,EAAIkxC,EAAM/gD,OAAQ6P,IAAI6kF,EAAW7kF,GAAK,CACjDxP,KAAMtB,KAAKqvF,cAAcv+E,GACzBjH,KAAM4qF,EAAiB3jF,GACvBwgF,SAAUtvC,EAAMlxC,GAAG83E,OAAO0I,UAE9BtxF,KAAKm1F,YAAYnzC,EAAO2zC,EAC5B,GAER,CAEA,SAAAC,CAAUlyC,EAAMtnB,GACZ,IAAI,IAAItrB,EAAI,EAAGA,EAAI4yC,EAAKklC,OAAOM,gBAAiBp4E,IAC5C,QAA8BlN,IAA1B8/C,EAAKklC,OAAOiM,OAAO/jF,IAAoB4yC,EAAKklC,OAAOiM,OAAO/jF,GAAGsrB,MAAQA,EAAK,OAAOsnB,EAAKklC,OAAOiM,OAAO/jF,EAEhH,CAMA,WAAAqkF,CAAYnzC,EAAO2zC,GACf,IAAIv5D,EAAM,IAAIuB,eAEd,IAAK,IAAI+lB,KAAQ1B,EAAM0B,EAAKtnB,IAAMA,EAC9B4lB,EAAM,GAAG4mC,OAAO+L,UAEpB3yC,EAAM,GAAG4mC,OAAOiM,OAAOc,EAAW,GAAGZ,YAAY34D,IAAMA,GACvD,IAAIQ,EAAS58B,KAAKs0F,cAAct0F,KAAKqV,QAAQunB,OAAQolB,EAAO2zC,GACxD/3C,EAAM59C,KAAKs0F,cAAct0F,KAAKqV,QAAQuoC,IAAKoE,EAAO2zC,GACtDv5D,EAAI6B,KAAKrB,EAAQghB,GAAK,GAER59C,KAAKs0F,cAAct0F,KAAKqV,QAAQosB,QAASugB,KAC1C5lB,EAAIqF,QAAUzhC,KAAKs0F,cAAct0F,KAAKqV,QAAQosB,QAASugB,IAEpE5lB,EAAI+oD,kBAAoBnlF,KAAKqV,QAAQ8vE,gBACrC/oD,EAAItC,OAAUrzB,IACVzG,KAAK61F,mBAAmB7zC,EAAO5lB,EAAK31B,IAExC21B,EAAI05D,UAAY,KACZ91F,KAAK+1F,mBAAmB/zC,EAAO5lB,EAAK,0BAA0Bp8B,KAAKqV,QAAQosB,QAAU,gBAEzFrF,EAAIrC,QAAU,KACV/5B,KAAK+1F,mBAAmB/zC,EAAO5lB,KAGH,MAAdA,EAAIwsD,OAAiBxsD,EAAIwsD,OAASxsD,GACxC45D,WAAcvvF,GAAIzG,KAAKi2F,2BAA2Bj0C,EAAO5lB,EAAK31B,GAE1E,IAAIigF,EAAU1mF,KAAKqV,QAAQsxE,eAAiB,CACxCuP,OAAQ,mBACR,gBAAiB,WACjB,mBAAoB,kBACpB,CACJ,EACIl2F,KAAKqV,QAAQi0E,aAAY5C,EAAQ,gBAAkB1kC,EAAM,GAAG/hD,MAC5DD,KAAKqV,QAAQqxE,SAAS,EAAkBA,EAAS1mF,KAAKqV,QAAQqxE,SAClE,IAAI,IAAIyP,KAAczP,EAAQ,CAC1B,IAAI0P,EAAc1P,EAAQyP,GACtBC,GAAah6D,EAAI8B,iBAAiBi4D,EAAYC,EACtD,CACA,GAAIp2F,KAAKqV,QAAQi0E,WAAY,CAGzB,IAAK,IAAI5lC,KAAQ1B,EAAMhiD,KAAKmW,KAAK,UAAWutC,EAAMtnB,GAC9Cp8B,KAAKqV,QAAQgwE,gBAAgBrlF,KAAKmW,KAAK,kBAAmB6rC,EAAO5lB,GACrEp8B,KAAKq2F,cAAcj6D,EAAK,KAAM4lB,EAClC,KAAO,CACH,IAAIs0C,EAAW,IAAIC,SAEnB,GAAIv2F,KAAKqV,QAAQ60C,OAAQ,CACrB,IAAIssC,EAAmBx2F,KAAKqV,QAAQ60C,OACJ,mBAArBssC,IAAiCA,EAAmBA,EAAiBz2F,KAAKC,KAAMgiD,EAAO5lB,EAAK4lB,EAAM,GAAG4mC,OAAO+L,QAAU30F,KAAK41F,UAAU5zC,EAAM,GAAI5lB,GAAO,OACjK,IAAI,IAAInyB,KAAOusF,EAAiB,CAC5B,IAAIr1F,EAAQq1F,EAAiBvsF,GAC7B,GAAIvF,MAAM+H,QAAQtL,GAGlB,IAAI,IAAI2P,EAAI,EAAGA,EAAI3P,EAAMF,OAAQ6P,IAAIwlF,EAAS/sE,OAAOtf,EAAK9I,EAAM2P,SAC3DwlF,EAAS/sE,OAAOtf,EAAK9I,EAC9B,CACJ,CAEA,IAAK,IAAIuiD,KAAQ1B,EAAMhiD,KAAKmW,KAAK,UAAWutC,EAAMtnB,EAAKk6D,GACnDt2F,KAAKqV,QAAQgwE,gBAAgBrlF,KAAKmW,KAAK,kBAAmB6rC,EAAO5lB,EAAKk6D,GAC1Et2F,KAAKy2F,oBAAoBH,GAGzB,IAAI,IAAIxlF,EAAI,EAAGA,EAAI6kF,EAAW10F,OAAQ6P,IAAI,CACtC,IAAIkkF,EAAYW,EAAW7kF,GAC3BwlF,EAAS/sE,OAAOyrE,EAAU1zF,KAAM0zF,EAAUnrF,KAAMmrF,EAAU1D,SAC9D,CACAtxF,KAAKq2F,cAAcj6D,EAAKk6D,EAAUt0C,EACtC,CACJ,CAEA,eAAAwyC,CAAgBxyC,EAAO/nB,GACnB,IAAIw6D,EAAmB,GAEnBiC,EAAc,EAClB,IAAI,IAAI5lF,EAAI,EAAGA,EAAIkxC,EAAM/gD,OAAQ6P,IAAI9Q,KAAKqV,QAAQi1E,cAAcvqF,KAAKC,KAAMgiD,EAAMlxC,GAAK4jF,IAClFD,EAAiB3jF,GAAK4jF,IAChBgC,IAAgB10C,EAAM/gD,QAAQg5B,EAAKw6D,IAEjD,CAEA,mBAAAgC,CAAoBH,GAEhB,GAA6B,SAAzBt2F,KAAKgT,QAAQ66E,QAAoB,IAAK,IAAItxC,KAASv8C,KAAKgT,QAAQsS,iBAAiB,mCAAmC,CACpH,IAAIqxE,EAAYp6C,EAAMx3B,aAAa,QAC/B6xE,EAAYr6C,EAAMx3B,aAAa,QAGnC,GAFI6xE,IAAWA,EAAYA,EAAU9gF,eAEjC,MAAO6gF,EACX,GAAsB,WAAlBp6C,EAAMsxC,SAAwBtxC,EAAMv6B,aAAa,YAEjD,IAAK,IAAIzM,KAAUgnC,EAAMlnC,QAAYE,EAAOoiD,UAAU2+B,EAAS/sE,OAAOotE,EAAWphF,EAAOpU,aAChFy1F,GAA2B,aAAdA,GAA0C,UAAdA,GAAyBr6C,EAAM8a,UAASi/B,EAAS/sE,OAAOotE,EAAWp6C,EAAMp7C,MAClI,CACJ,CAGA,0BAAA80F,CAA2Bj0C,EAAO5lB,EAAK31B,GACnC,GAAKu7C,EAAM,GAAG4mC,OAAO+L,QAchB,CAID,IAAIjxC,EAAO1B,EAAM,GAGb0mC,EAAQ1oF,KAAK41F,UAAUlyC,EAAMtnB,GAC7B31B,GACAiiF,EAAM7uB,SAAW,IAAMpzD,EAAEowF,OAASpwF,EAAE2oF,MACpC1G,EAAM0G,MAAQ3oF,EAAE2oF,MAChB1G,EAAMwD,UAAYzlF,EAAEowF,SAGpBnO,EAAM7uB,SAAW,IACjB6uB,EAAMwD,UAAYxD,EAAM0G,OAG5B1rC,EAAKklC,OAAO/uB,SAAW,EACvBnW,EAAKklC,OAAOwG,MAAQ,EACpB1rC,EAAKklC,OAAOsD,UAAY,EACxB,IAAI,IAAIp7E,EAAI,EAAGA,EAAI4yC,EAAKklC,OAAOM,gBAAiBp4E,IAAQ4yC,EAAKklC,OAAOiM,OAAO/jF,SAAgD,IAAnC4yC,EAAKklC,OAAOiM,OAAO/jF,GAAG+oD,WAC1GnW,EAAKklC,OAAO/uB,UAAYnW,EAAKklC,OAAOiM,OAAO/jF,GAAG+oD,SAC9CnW,EAAKklC,OAAOwG,OAAS1rC,EAAKklC,OAAOiM,OAAO/jF,GAAGs+E,MAC3C1rC,EAAKklC,OAAOsD,WAAaxoC,EAAKklC,OAAOiM,OAAO/jF,GAAGo7E,WAInDxoC,EAAKklC,OAAO/uB,SAAWnW,EAAKklC,OAAO/uB,SAAWnW,EAAKklC,OAAOM,gBAC1DlpF,KAAKmW,KAAK,iBAAkButC,EAAMA,EAAKklC,OAAO/uB,SAAUnW,EAAKklC,OAAOsD,UACxE,MA3CA,IAAK,IAAIxoC,KAAQ1B,EACT0B,EAAKklC,OAAOwG,OAAS1rC,EAAKklC,OAAOsD,WAAaxoC,EAAKklC,OAAOsD,WAAaxoC,EAAKklC,OAAOwG,QACnF3oF,GACAi9C,EAAKklC,OAAO/uB,SAAW,IAAMpzD,EAAEowF,OAASpwF,EAAE2oF,MAC1C1rC,EAAKklC,OAAOwG,MAAQ3oF,EAAE2oF,MACtB1rC,EAAKklC,OAAOsD,UAAYzlF,EAAEowF,SAG1BnzC,EAAKklC,OAAO/uB,SAAW,IACvBnW,EAAKklC,OAAOsD,UAAYxoC,EAAKklC,OAAOwG,OAExCpvF,KAAKmW,KAAK,iBAAkButC,EAAMA,EAAKklC,OAAO/uB,SAAUnW,EAAKklC,OAAOsD,WAiC5E,CACA,kBAAA2J,CAAmB7zC,EAAO5lB,EAAK31B,GAC3B,IAAI4uF,EACJ,GAAIrzC,EAAM,GAAGlkB,SAAW2rD,EAAyC2K,UAC1C,IAAnBh4D,EAAI1D,WAAR,CACA,GAAyB,gBAArB0D,EAAI06D,cAAuD,SAArB16D,EAAI06D,eAC1CzB,EAAWj5D,EAAI2B,aACX3B,EAAI26D,kBAAkB,kBAAoB36D,EAAI26D,kBAAkB,gBAAgB7lF,QAAQ,qBAAqB,IAC7GmkF,EAAW7yE,KAAKC,MAAM4yE,EAC1B,CAAE,MAAOr6D,GACLv0B,EAAIu0B,EACJq6D,EAAW,oCACf,CAEJr1F,KAAKi2F,2BAA2Bj0C,EAAO5lB,GACjC,KAAOA,EAAI0B,QAAU1B,EAAI0B,OAAS,IAC/BkkB,EAAM,GAAG4mC,OAAO+L,QAAS3yC,EAAM,GAAG4mC,OAAOwM,oBAAoBp1F,KAAK41F,UAAU5zC,EAAM,GAAI5lB,GAAMi5D,GAChGr1F,KAAK01F,UAAU1zC,EAAOqzC,EAAU5uF,GAFSzG,KAAK+1F,mBAAmB/zC,EAAO5lB,EAAKi5D,EAXlD,CAcpC,CACA,kBAAAU,CAAmB/zC,EAAO5lB,EAAKi5D,GAC3B,GAAIrzC,EAAM,GAAGlkB,SAAW2rD,EAAyC2K,SAAjE,CACA,GAAIpyC,EAAM,GAAG4mC,OAAO+L,SAAW30F,KAAKqV,QAAQqwE,YAAa,CACrD,IAAIgD,EAAQ1oF,KAAK41F,UAAU5zC,EAAM,GAAI5lB,GACrC,GAAKssD,EAAMwM,UAAal1F,KAAKqV,QAAQswE,iBAIjC,YAHA3lF,KAAKm1F,YAAYnzC,EAAO,CACpB0mC,EAAMsM,YAGPtyE,QAAQC,KAAK,2CACxB,CACA3iB,KAAKwxF,iBAAiBxvC,EAAOqzC,GAAYr1F,KAAKqV,QAAQyyE,kBAAkB3kF,QAAQ,iBAAkBi5B,EAAI0B,QAAS1B,EAV9B,CAWrF,CACA,aAAAi6D,CAAcj6D,EAAKk6D,EAAUt0C,GACzB,GAAsB,GAAlB5lB,EAAI1D,WAIR,GAAI14B,KAAKqV,QAAQi0E,WACb,GAAItnC,EAAM,GAAG4mC,OAAO+L,QAAS,CACzB,MAAMjM,EAAQ1oF,KAAK41F,UAAU5zC,EAAM,GAAI5lB,GACvCA,EAAI+B,KAAKuqD,EAAMsM,UAAUnrF,KAC7B,MAAOuyB,EAAI+B,KAAK6jB,EAAM,SACnB5lB,EAAI+B,KAAKm4D,QARZ5zE,QAAQC,KAAK,gFASrB,CAGA,SAAA+yE,CAAU1zC,EAAOjkB,EAAct3B,GAC3B,IAAK,IAAIi9C,KAAQ1B,EACb0B,EAAK5lB,OAAS2rD,EAAyC8L,QACvDv1F,KAAKmW,KAAK,UAAWutC,EAAM3lB,EAAct3B,GACzCzG,KAAKmW,KAAK,WAAYutC,GAM1B,GAJI1jD,KAAKqV,QAAQgwE,iBACbrlF,KAAKmW,KAAK,kBAAmB6rC,EAAOjkB,EAAct3B,GAClDzG,KAAKmW,KAAK,mBAAoB6rC,IAE9BhiD,KAAKqV,QAAQ2xE,iBAAkB,OAAOhnF,KAAK2xF,cACnD,CAGA,gBAAAH,CAAiBxvC,EAAOiT,EAAS74B,GAC7B,IAAK,IAAIsnB,KAAQ1B,EACb0B,EAAK5lB,OAAS2rD,EAAyC5zD,MACvD71B,KAAKmW,KAAK,QAASutC,EAAMuR,EAAS74B,GAClCp8B,KAAKmW,KAAK,WAAYutC,GAM1B,GAJI1jD,KAAKqV,QAAQgwE,iBACbrlF,KAAKmW,KAAK,gBAAiB6rC,EAAOiT,EAAS74B,GAC3Cp8B,KAAKmW,KAAK,mBAAoB6rC,IAE9BhiD,KAAKqV,QAAQ2xE,iBAAkB,OAAOhnF,KAAK2xF,cACnD,CACA,aAAON,GACH,MAAO,uCAAuCluF,QAAQ,QAAS,SAASuR,GACpE,IAAIrR,EAAoB,GAAhBoF,KAAKuuF,SAAgB,EAC7B,OAD0C,MAANtiF,EAAYrR,EAAQ,EAAJA,EAAQ,GACnDJ,SAAS,GACtB,EACJ,CACA,WAAA5C,CAAY8nB,EAAI9S,GAEZ,IAAIk0E,EAAUzrE,EAOd,GARA1H,QAEApW,KAAKgT,QAAUmV,EACfnoB,KAAK8tF,kBAAoB,GACzB9tF,KAAKgtE,UAAY,GACjBhtE,KAAKgiD,MAAQ,GACe,iBAAjBhiD,KAAKgT,UAAsBhT,KAAKgT,QAAU5B,SAASsN,cAAc1e,KAAKgT,WAE5EhT,KAAKgT,SAAoC,MAAzBhT,KAAKgT,QAAQhN,SAAkB,MAAM,IAAI4Q,MAAM,6BACpE,GAAI5W,KAAKgT,QAAQg8E,SAAU,MAAM,IAAIp4E,MAAM,8BAE3C6yE,EAAyC9L,UAAUjzE,KAAK1K,MAExDA,KAAKgT,QAAQg8E,SAAWhvF,KACxB,IAAIi3F,EAAsG,OAApFn5E,EAAO2rE,EAAyCyN,kBAAkBl3F,KAAKgT,UAAoB8K,EAAO,CACxH,EAMA,GALA9d,KAAKqV,QAAU,GAAkB,EAAM,CACvC,EAAG6vE,EAA0C+R,EAA2B,MAAX5hF,EAAkBA,EAAU,CACzF,GACArV,KAAKqV,QAAQm1E,gBAAkBxqF,KAAKqV,QAAQm1E,gBAAgBrnF,QAAQ,OAAQ,IAExEnD,KAAKqV,QAAQmyE,gBAAkBiC,EAAyC0N,qBAAsB,OAAOn3F,KAAKqV,QAAQk0E,SAASxpF,KAAKC,MAGpI,GADwB,MAApBA,KAAKqV,QAAQuoC,MAAa59C,KAAKqV,QAAQuoC,IAAM59C,KAAKgT,QAAQ+R,aAAa,YACtE/kB,KAAKqV,QAAQuoC,IAAK,MAAM,IAAIhnC,MAAM,oBACvC,GAAI5W,KAAKqV,QAAQyxE,eAAiB9mF,KAAKqV,QAAQ0xE,kBAAmB,MAAM,IAAInwE,MAAM,sGAClF,GAAI5W,KAAKqV,QAAQgwE,gBAAkBrlF,KAAKqV,QAAQiwE,SAAU,MAAM,IAAI1uE,MAAM,qDAC1E,GAAI5W,KAAKqV,QAAQi0E,YAActpF,KAAKqV,QAAQgwE,eAAgB,MAAM,IAAIzuE,MAAM,uDAExE5W,KAAKqV,QAAQ0xE,oBACb/mF,KAAKqV,QAAQyxE,cAAgB9mF,KAAKqV,QAAQ0xE,yBACnC/mF,KAAKqV,QAAQ0xE,mBAGW,MAA/B/mF,KAAKqV,QAAQiyE,iBAAwBtnF,KAAKqV,QAAQkyE,WAAc7jC,GAAO1jD,KAAKqV,QAAQiyE,eAAevnF,KAAKC,KAAM0jD,EAAKpiD,KAAMoiD,IAE1F,iBAAxB1jD,KAAKqV,QAAQunB,SAAqB58B,KAAKqV,QAAQunB,OAAS58B,KAAKqV,QAAQunB,OAAO9R,gBAClFy+D,EAAWvpF,KAAKyvF,wBAA0BlG,EAASt6D,YACxDs6D,EAASt6D,WAAWG,YAAYm6D,IAEO,IAAnCvpF,KAAKqV,QAAQ8xE,oBACTnnF,KAAKqV,QAAQ8xE,kBAAmBnnF,KAAKmnF,kBAAoBsC,EAAyCwE,WAAWjuF,KAAKqV,QAAQ8xE,kBAAmB,qBAC5InnF,KAAKmnF,kBAAoBnnF,KAAKgT,SAEnChT,KAAKqV,QAAQuxE,aACkB,IAA3B5mF,KAAKqV,QAAQuxE,UAAoB5mF,KAAK8tF,kBAAoB,CAC1D9tF,KAAKgT,SAEJhT,KAAK8tF,kBAAoBrE,EAAyC2N,YAAYp3F,KAAKqV,QAAQuxE,UAAW,cAE/G5mF,KAAK2tB,MACT,EAEJ87D,EAAyCsD,YAWzCtD,EAAyCp0E,QAAU,CACnD,EAEAo0E,EAAyCyN,kBAAoB,SAASlkF,GAElE,OAAIA,EAAQ+R,aAAa,MAAc0kE,EAAyCp0E,QAAQgiF,EAA+BrkF,EAAQ+R,aAAa,aACvI,CACT,EAEA0kE,EAAyC9L,UAAY,GAErD8L,EAAyC6N,WAAa,SAAStkF,GAE3D,GADuB,iBAAZA,IAAsBA,EAAU5B,SAASsN,cAAc1L,IACV,OAAxC,MAAXA,EAAkBA,EAAQg8E,cAAWprF,GAAoB,MAAM,IAAIgT,MAAM,kNAC9E,OAAO5D,EAAQg8E,QACnB,EAEAvF,EAAyC8N,SAAW,WAChD,IAAIC,EACJ,GAAIpmF,SAASkU,iBAAkBkyE,EAAYpmF,SAASkU,iBAAiB,iBAChE,CACDkyE,EAAY,GAEZ,IAAIC,EAAiB5lB,GAAW,MACxB,IAAI1oE,EAAS,GACb,IAAK,IAAIgf,KAAM0pD,EAAa,qBAAqB1tE,KAAKgkB,EAAGoW,WAAYp1B,EAAOuB,KAAK8sF,EAAU9sF,KAAKyd,IAC3Fhf,EAAOuB,UAAK9G,GACjB,OAAOuF,CACV,EAL2B,GAOhCsuF,EAAcrmF,SAASqtB,qBAAqB,QAC5Cg5D,EAAcrmF,SAASqtB,qBAAqB,QAChD,CACA,MAAO,MACH,IAAIt1B,EAAS,GACb,IAAK,IAAI6lF,KAAYwI,GACwD,IAAzE/N,EAAyCyN,kBAAkBlI,GAAqB7lF,EAAOuB,KAAK,IAAI++E,EAAyCuF,IACxI7lF,EAAOuB,UAAK9G,GACjB,OAAOuF,CACV,EANM,EAOX,EAWAsgF,EAAyCiO,gBAAkB,CAEvD,kDAGJjO,EAAyC0N,mBAAqB,WAC1D,IAAIQ,GAAiB,EACrB,GAAI5mF,OAAO6mF,MAAQ7mF,OAAO0hF,YAAc1hF,OAAO8mF,UAAY9mF,OAAO+mF,MAAQ/mF,OAAOwlF,UAAYnlF,SAASsN,cAClG,GAAM,cAAetN,SAASM,cAAc,KACvC,MACoE9N,IAAjE6lF,EAAyCsO,sBAE7CtO,EAAyCiO,gBAAkBjO,EAAyCsO,qBAEpG,IAAK,IAAIC,KAASvO,EAAyCiO,gBAAgB,GAAIM,EAAM7zF,KAAK4X,UAAUC,WAAY,CAC5G27E,GAAiB,EACjB,QACJ,CACJ,MAVmDA,GAAiB,OAWjEA,GAAiB,EACxB,OAAOA,CACX,EACAlO,EAAyC6I,cAAgB,SAAS2F,GAG9D,IAAIC,EAAaC,KAAKF,EAAQpmF,MAAM,KAAK,IAErCumF,EAAaH,EAAQpmF,MAAM,KAAK,GAAGA,MAAM,KAAK,GAAGA,MAAM,KAAK,GAE5DwmF,EAAK,IAAIC,YAAYJ,EAAWj3F,QAChCs3F,EAAK,IAAI5wF,WAAW0wF,GACxB,IAAI,IAAIvnF,EAAI,EAAGiC,EAAMmlF,EAAWj3F,OAAQu3F,EAAM,GAAKzlF,EAAKylF,EAAM1nF,GAAKiC,EAAMjC,GAAKiC,EAAKylF,EAAM1nF,IAAMA,IAAIynF,EAAGznF,GAAKonF,EAAWxU,WAAW5yE,GAEjI,OAAO,IAAIgnF,KAAK,CACZO,GACD,CACCp4F,KAAMm4F,GAEd,EAEA,MAAMtG,EAAgC,CAAC7oE,EAAMwvE,IAAexvE,EAAKnlB,OAAQw+C,GAAOA,IAASm2C,GACnF11F,IAAKu/C,GAAOA,GAIZ+0C,EAAkCpuC,GAAMA,EAAI9lD,QAAQ,aAAeO,GAAQA,EAAMunB,OAAO,GAAGH,eAIjG2+D,EAAyC/3E,cAAgB,SAAS5D,GAC9D,IAAIg6C,EAAM12C,SAASM,cAAc,OAEjC,OADAo2C,EAAI98B,UAAYld,EACTg6C,EAAIvgC,WAAW,EAC1B,EAEAkiE,EAAyCoF,cAAgB,SAAS77E,EAASgL,GACvE,GAAIhL,IAAYgL,EAAW,OAAO,EAElC,KAAMhL,EAAUA,EAAQic,YACpB,GAAIjc,IAAYgL,EAAW,OAAO,EAEtC,OAAO,CACX,EACAyrE,EAAyCwE,WAAa,SAAS9lE,EAAI7mB,GAC/D,IAAI0R,EAGJ,GAFkB,iBAAPmV,EAAiBnV,EAAU5B,SAASsN,cAAcyJ,GACrC,MAAfA,EAAGniB,WAAkBgN,EAAUmV,GACzB,MAAXnV,EAAiB,MAAM,IAAI4D,MAAM,aAAatV,+EAClD,OAAO0R,CACX,EACAy2E,EAAyC2N,YAAc,SAASsB,EAAKp3F,GACjE,IAAI6mB,EAAI0pD,EACR,GAAI6mB,aAAeh0F,MAAO,CACtBmtE,EAAW,GACX,IACI,IAAK1pD,KAAMuwE,EAAI7mB,EAASnnE,KAAK1K,KAAKiuF,WAAW9lE,EAAI7mB,GACrD,CAAE,MAAOmF,GACLorE,EAAW,IACf,CACJ,MAAO,GAAmB,iBAAR6mB,EAEd,IAAKvwE,KADL0pD,EAAW,GACAzgE,SAASkU,iBAAiBozE,IAAK7mB,EAASnnE,KAAKyd,QACjC,MAAhBuwE,EAAI1yF,WAAkB6rE,EAAW,CACxC6mB,IAEJ,GAAgB,MAAZ7mB,IAAqBA,EAAS5wE,OAAQ,MAAM,IAAI2V,MAAM,aAAatV,gGACvE,OAAOuwE,CACX,EAKA4X,EAAyC6B,QAAU,SAASqN,EAAUvL,EAAUwL,GAC5E,OAAI7nF,OAAOu6E,QAAQqN,GAAkBvL,IAChB,MAAZwL,EAAyBA,SAA7B,CACT,EAIAnP,EAAyC2H,YAAc,SAAS1tC,EAAMojC,GAClE,IAAKA,EAAe,OAAO,EAE3BA,EAAgBA,EAAcj1E,MAAM,KACpC,IAAIgnF,EAAWn1C,EAAKzjD,KAChB64F,EAAeD,EAAS11F,QAAQ,QAAS,IAC7C,IAAK,IAAI41F,KAAajS,EAElB,GADAiS,EAAYA,EAAUp2F,OACM,MAAxBo2F,EAAU9tE,OAAO,IACjB,IAAuG,IAAnGy4B,EAAKpiD,KAAKwU,cAAc5E,QAAQ6nF,EAAUjjF,cAAe4tC,EAAKpiD,KAAKL,OAAS83F,EAAU93F,QAAgB,OAAO,OAC9G,GAAI,QAAQkD,KAAK40F,IAEpB,GAAID,IAAiBC,EAAU51F,QAAQ,QAAS,IAAK,OAAO,OAE5D,GAAI01F,IAAaE,EAAW,OAAO,EAG3C,OAAO,CACX,EAEsB,oBAAXnvC,QAAqC,OAAXA,SAAiBA,OAAOhQ,GAAGo1C,SAAW,SAAS35E,GAChF,OAAOrV,KAAK2uC,KAAK,WACb,OAAO,IAAI86C,EAAyCzpF,KAAMqV,EAC9D,EACJ,GAEAo0E,EAAyCkE,MAAQ,QACjDlE,EAAyC+D,OAAS,SAGlD/D,EAAyCuP,SAAWvP,EAAyC+D,OAC7F/D,EAAyC4B,UAAY,YACrD5B,EAAyCwP,WAAaxP,EAAyC4B,UAC/F5B,EAAyC2K,SAAW,WACpD3K,EAAyC5zD,MAAQ,QACjD4zD,EAAyC8L,QAAU,UAmCnD,IAAI9B,EAAwC,SAASF,EAAKznC,EAAKotC,EAAIC,EAAIC,EAAIC,EAAIC,EAAIC,EAAIC,EAAIC,GACvF,IAAIC,EA1ByC,SAAS5tC,GAC7CA,EAAItnC,aAAb,IACIm1E,EAAK7tC,EAAIjnC,cACTmtE,EAAS5gF,SAASM,cAAc,UACpCsgF,EAAO55E,MAAQ,EACf45E,EAAO35E,OAASshF,EAChB,IAAIpG,EAAMvB,EAAOwB,WAAW,MAC5BD,EAAIqG,UAAU9tC,EAAK,EAAG,GACtB,IAAMjiD,KAAMA,GAAU0pF,EAAIsG,aAAa,EAAG,EAAG,EAAGF,GAE5CR,EAAK,EACLW,EAAKH,EACLI,EAAKJ,EACT,KAAMI,EAAKZ,GAEO,IADFtvF,EAAgB,GAAVkwF,EAAK,GAAS,GACfD,EAAKC,EACjBZ,EAAKY,EACVA,EAAKD,EAAKX,GAAM,EAEpB,IAAIn0B,EAAQ+0B,EAAKJ,EACjB,OAAc,IAAV30B,EAAoB,EACZA,CAChB,CAI0Bg1B,CAA2CluC,GACjE,OAAOynC,EAAIqG,UAAU9tC,EAAKotC,EAAIC,EAAIC,EAAIC,EAAIC,EAAIC,EAAIC,EAAIC,EAAKC,EAC/D,EAIA,MAAMvH,EACF,gBAAOpF,GACH/sF,KAAKi6F,QAAU,mEACnB,CACA,eAAOC,CAAS39C,GACZ,IACI49C,EACAC,EAEAC,EACAC,EACAC,EANAC,EAAS,GAGTC,EAAO,GAIPC,EAAO,GACP5pF,EAAI,EACR,KACIqpF,EAAO59C,EAAMzrC,KACbspF,EAAO79C,EAAMzrC,KACb2pF,EAAOl+C,EAAMzrC,KACbupF,EAAOF,GAAQ,EACfG,GAAe,EAAPH,IAAa,EAAIC,GAAQ,EACjCG,GAAe,GAAPH,IAAc,EAAIK,GAAQ,EAClCC,EAAc,GAAPD,EACH/kF,MAAM0kF,GAAOG,EAAOG,EAAO,GACtBhlF,MAAM+kF,KAAOC,EAAO,IAC7BF,EAASA,EAASx6F,KAAKi6F,QAAQhvE,OAAOovE,GAAQr6F,KAAKi6F,QAAQhvE,OAAOqvE,GAAQt6F,KAAKi6F,QAAQhvE,OAAOsvE,GAAQv6F,KAAKi6F,QAAQhvE,OAAOyvE,GAC1HP,EAAOC,EAAOK,EAAO,GACrBJ,EAAOC,EAAOC,EAAOG,EAAO,GACtB5pF,EAAIyrC,EAAMt7C,SAEpB,OAAOu5F,CACX,CACA,cAAOpI,CAAQuI,EAAgBC,GAC3B,IAAKD,EAAej3F,MAAM,2BAA4B,OAAOk3F,EAC7D,IAAIC,EAAW76F,KAAK86F,SAASH,EAAex3F,QAAQ,0BAA2B,KAC3E43F,EAAW/6F,KAAKg7F,eAAeH,GAC/Bh9C,EAAQ79C,KAAKi7F,iBAAiBL,EAAmBG,GACrD,MAAO,0BAA0B/6F,KAAKk6F,SAASr8C,IACnD,CACA,uBAAOo9C,CAAiBL,EAAmBG,GACvC,IAAIG,EAAYl7F,KAAKm7F,aAAaJ,GAC9BK,EAAgBp7F,KAAKq7F,WAAWT,EAAmBM,GAEvD,OADc,IAAIvzF,WAAWyzF,EAEjC,CACA,mBAAOD,CAAaJ,GAChB,IAAIO,EACA9gF,EAAI,EACR,KAAMA,EAAIugF,EAAS95F,QAAO,CAEtB,GADAq6F,EAAMP,EAASvgF,GACA,MAAX8gF,EAAI,GAAwB,MAAXA,EAAI,GAAY,OAAOA,EAC5C9gF,GACJ,CACA,MAAO,EACX,CACA,iBAAO6gF,CAAWT,EAAmBM,GACjC,IAAIK,EAAYX,EAAkBz3F,QAAQ,0BAA2B,IACjEq4F,EAAMx7F,KAAK86F,SAASS,GACpBE,EAAgBD,EAAItqF,QAAQ,IAAK,GACjCwqF,EAAMF,EAAI1uF,MAAM,EAAG2uF,GACnBE,EAAMH,EAAI1uF,MAAM2uF,GAChBlxF,EAAQmxF,EAGZ,OAFAnxF,EAAQA,EAAMi2C,OAAO06C,GACrB3wF,EAAQA,EAAMi2C,OAAOm7C,GACdpxF,CACX,CACA,qBAAOywF,CAAeY,GAClB,IAAIr0B,EAAO,EACPwzB,EAAW,GACf,OAEgC,MAAxBa,EAAcr0B,GAA4C,MAA5Bq0B,EAAcr0B,EAAO,KAFhD,CAGP,GAA4B,MAAxBq0B,EAAcr0B,GAA4C,MAA5Bq0B,EAAcr0B,EAAO,GAAYA,GAAQ,MACtE,CAED,IAAIs0B,EAAWt0B,GADoB,IAA1Bq0B,EAAcr0B,EAAO,GAAWq0B,EAAcr0B,EAAO,IAC/B,EAC3B+zB,EAAMM,EAAc9uF,MAAMy6D,EAAMs0B,GACpCd,EAASrwF,KAAK4wF,GACd/zB,EAAOs0B,CACX,CACA,GAAIt0B,EAAOq0B,EAAc36F,OAAQ,KACrC,CACA,OAAO85F,CACX,CACA,eAAOD,CAASv+C,GACZ,IACI49C,EACAC,EAEAC,EACAC,EACAC,EAHAE,EAAO,GAIPC,EAAO,GACP5pF,EAAI,EACJ0qF,EAAM,GAKV,IAHiB,sBACFr0F,KAAKo1C,IAAQ75B,QAAQC,KAAK,oJACzC45B,EAAQA,EAAMp5C,QAAQ,sBAAuB,IAEzCk3F,EAAOr6F,KAAKi6F,QAAQ/oF,QAAQqrC,EAAMtxB,OAAOna,MACzCwpF,EAAOt6F,KAAKi6F,QAAQ/oF,QAAQqrC,EAAMtxB,OAAOna,MACzCypF,EAAOv6F,KAAKi6F,QAAQ/oF,QAAQqrC,EAAMtxB,OAAOna,MACzC4pF,EAAO16F,KAAKi6F,QAAQ/oF,QAAQqrC,EAAMtxB,OAAOna,MACzCqpF,EAAOE,GAAQ,EAAIC,GAAQ,EAC3BF,GAAe,GAAPE,IAAc,EAAIC,GAAQ,EAClCE,GAAe,EAAPF,IAAa,EAAIG,EACzBc,EAAI9wF,KAAKyvF,GACI,KAATI,GAAaiB,EAAI9wF,KAAK0vF,GACb,KAATM,GAAac,EAAI9wF,KAAK+vF,GAC1BN,EAAOC,EAAOK,EAAO,GACrBJ,EAAOC,EAAOC,EAAOG,EAAO,GACtB5pF,EAAIyrC,EAAMt7C,SAEpB,OAAOu6F,CACX,EAEJrJ,EAAkCpF,W,2BCjgElC,IAAIt2C,EAAa,EAAQ,MACrBqlD,EAAe,EAAQ,MACvBC,EAAwB,EAAQ,MAChCC,EAAuB,EAAQ,MAC/B1rC,EAA8B,EAAQ,MACtC1Z,EAAiB,EAAQ,KAGzB4P,EAFkB,EAAQ,KAEfxF,CAAgB,YAC3Bi7C,EAAcD,EAAqB50E,OAEnC80E,EAAkB,SAAUC,EAAqBC,GACnD,GAAID,EAAqB,CAEvB,GAAIA,EAAoB31C,KAAcy1C,EAAa,IACjD3rC,EAA4B6rC,EAAqB31C,EAAUy1C,EAC7D,CAAE,MAAOjhE,GACPmhE,EAAoB31C,GAAYy1C,CAClC,CAEA,GADArlD,EAAeulD,EAAqBC,GAAiB,GACjDN,EAAaM,GAAkB,IAAK,IAAIj7C,KAAe66C,EAEzD,GAAIG,EAAoBh7C,KAAiB66C,EAAqB76C,GAAc,IAC1EmP,EAA4B6rC,EAAqBh7C,EAAa66C,EAAqB76C,GACrF,CAAE,MAAOnmB,GACPmhE,EAAoBh7C,GAAe66C,EAAqB76C,EAC1D,CAEJ,CACF,EAEA,IAAK,IAAIi7C,KAAmBN,EAC1BI,EAAgBzlD,EAAW2lD,IAAoB3lD,EAAW2lD,GAAiBj8F,UAAWi8F,GAGxFF,EAAgBH,EAAuB,e,2BClCvC,IAAIM,EAAsB,EAAQ,MAC9BnzF,EAAW,EAAQ,IACnBs2C,EAAyB,EAAQ,MACjC88C,EAAqB,EAAQ,MAMjC19F,EAAOC,QAAUS,OAAOC,iBAAmB,aAAe,CAAC,EAAI,WAC7D,IAEIszC,EAFA0pD,GAAiB,EACjBp4F,EAAO,CAAC,EAEZ,KACE0uC,EAASwpD,EAAoB/8F,OAAOa,UAAW,YAAa,QACrDgE,EAAM,IACbo4F,EAAiBp4F,aAAgBO,KACnC,CAAE,MAAOs2B,GAAqB,CAC9B,OAAO,SAAwBhgB,EAAGrW,GAGhC,OAFA66C,EAAuBxkC,GACvBshF,EAAmB33F,GACduE,EAAS8R,IACVuhF,EAAgB1pD,EAAO73B,EAAGrW,GACzBqW,EAAExb,UAAYmF,EACZqW,GAHkBA,CAI3B,CACF,CAjB+D,QAiBzDpX,E,2BC1BN/E,EAAQE,YAAa,EACrBF,EAAiB,aAAS,EAE1B,IAIgCG,EAJ5BgtC,GAI4BhtC,EAJG,EAAQ,QAIUA,EAAID,WAAaC,EAAM,CAAE,QAAWA,GAFrFE,EAAS,EAAQ,MAMrB,SAASC,EAAgBC,EAAGC,GAA+G,OAA1GF,EAAkBG,OAAOC,gBAAkB,SAAyBH,EAAGC,GAAsB,OAAjBD,EAAEI,UAAYH,EAAUD,CAAG,EAAUD,EAAgBC,EAAGC,EAAI,CAEzK,IAAIm9F,EAA0B,SAAUxvD,GAJxC,IAAwBrtC,EAAUC,EAOhC,SAAS48F,EAAW38F,GAClB,IAAIC,EAIJ,OAFAA,EAAQktC,EAAMjtC,KAAKC,KAAMH,IAASG,MAC5BC,KAAOf,EAAO2wC,WACb/vC,CACT,CAEA,OAfgCF,EAKLotC,GALLrtC,EAKP68F,GALwCr8F,UAAYb,OAAOc,OAAOR,EAAWO,WAAYR,EAASQ,UAAUE,YAAcV,EAAUR,EAAgBQ,EAAUC,GAetK48F,CACT,CAZ8B,CAY5BxwD,EAAe,SAEjBntC,EAAiB,QAAI29F,EACrB59F,EAAOC,QAAUA,EAAQyB,O,2BC5BzB,IAAI0b,EAAY,EAAQ,MAExBpd,EAAOC,QAAU,mEAAmEsF,KAAK6X,E,2BCHzF,IAAI3X,EAAI,EAAQ,MACZgtC,EAAa,EAAQ,MACrB3iC,EAAQ,EAAQ,MAChB3O,EAAO,EAAQ,MACf8xC,EAAc,EAAQ,MACtBC,EAAQ,EAAQ,MAChBrlC,EAAU,EAAQ,MAClB9N,EAAa,EAAQ,MACrB89F,EAAY,EAAQ,MACpBznB,EAAW,EAAQ,KACnBthC,EAAU,EAAQ,MAClBzwC,EAAW,EAAQ,KACnB4wC,EAAa,EAAQ,MACrB6oD,EAAkB,EAAQ,MAC1Bn3F,EAAM,EAAQ,MACdutD,EAAgB,EAAQ,MACxB6pC,EAAkB,EAAQ,MAE1BpqD,EAAUljC,OACVutF,EAAavrD,EAAW,OAAQ,aAChClqC,EAAO0qC,EAAY,IAAI1qC,MACvB8jB,EAAS4mB,EAAY,GAAG5mB,QACxBy4D,EAAa7xC,EAAY,GAAG6xC,YAC5BvgF,EAAU0uC,EAAY,GAAG1uC,SACzB2J,EAAQ+kC,EAAY,GAAG/kC,OACvBpC,EAAOmnC,EAAY,GAAGnnC,MACtBmyF,EAAiBhrD,EAAY,IAAI5uC,UAEjC65F,EAAa,mBACbC,EAAgB,oBAChBC,EAAe,oBAEfC,EAAO13F,IACP23F,EAAcD,EAAKh8F,OAEnBk8F,GAA4BrqC,GAAiBhhB,EAAM,WACrD,IAAIgvB,EAASzvB,EAAW,SAAXA,CAAqB,uBAElC,MAAgC,WAAzBurD,EAAW,CAAC97B,KAEgB,OAA9B87B,EAAW,CAAEp5F,EAAGs9D,KAEe,OAA/B87B,EAAWt9F,OAAOwhE,GACzB,GAGIs8B,EAAqBtrD,EAAM,WAC7B,MAAsC,qBAA/B8qD,EAAW,iBACY,cAAzBA,EAAW,SAClB,GAEIS,EAAuCF,EAA2B,SAAUr+F,EAAIw+F,GAClF,IAAIztF,EAAOgkC,EAAW7yC,WAClBu8F,EAAYC,EAAoBF,GACpC,GAAK3+F,EAAW4+F,SAAsB35F,IAAP9E,IAAoBk2E,EAASl2E,GAM5D,OALA+Q,EAAK,GAAK,SAAU5F,EAAK9I,GAGvB,GADIxC,EAAW4+F,KAAYp8F,EAAQpB,EAAKw9F,EAAWv9F,KAAMuyC,EAAQtoC,GAAM9I,KAClE6zE,EAAS7zE,GAAQ,OAAOA,CAC/B,EACOuN,EAAMkuF,EAAY,KAAM/sF,EACjC,EAAI+sF,EAEAa,EAAmB,SAAU/5F,EAAOq/D,EAAQj1D,GAC9C,IAAI6c,EAAOM,EAAOnd,EAAQi1D,EAAS,GAC/Bn4C,EAAOK,EAAOnd,EAAQi1D,EAAS,GACnC,OAAK57D,EAAK41F,EAAer5F,KAAWyD,EAAK61F,EAAcpyE,IAAWzjB,EAAK61F,EAAct5F,KAAWyD,EAAK41F,EAAepyE,GAC3G,MAAQkyE,EAAenZ,EAAWhgF,EAAO,GAAI,IAC7CA,CACX,EAEI85F,EAAsB,SAAUF,GAClC,GAAI3+F,EAAW2+F,GAAW,OAAOA,EACjC,GAAK7wF,EAAQ6wF,GAAb,CAGA,IAFA,IAAII,EAAYJ,EAASr8F,OACrBmG,EAAO,GACF0J,EAAI,EAAGA,EAAI4sF,EAAW5sF,IAAK,CAClC,IAAIkC,EAAUsqF,EAASxsF,GACD,iBAAXkC,EAAqBtI,EAAKtD,EAAM4L,GAChB,iBAAXA,GAA4C,WAArB0gC,EAAQ1gC,IAA8C,WAArB0gC,EAAQ1gC,IAAuBtI,EAAKtD,EAAMnE,EAAS+P,GAC7H,CACA,IAAI2qF,EAAav2F,EAAKnG,OAClB4E,GAAO,EACX,OAAO,SAAUoE,EAAK9I,GACpB,GAAI0E,EAEF,OADAA,GAAO,EACA1E,EAET,GAAIsL,EAAQzM,MAAO,OAAOmB,EAC1B,IAAK,IAAIsxE,EAAI,EAAGA,EAAIkrB,EAAYlrB,IAAK,GAAIrrE,EAAKqrE,KAAOxoE,EAAK,OAAO9I,CACnE,CAjB8B,CAkBhC,EAKIy7F,GAAYv4F,EAAE,CAAEjD,OAAQ,OAAQwwC,MAAM,EAAMkB,MAAO,EAAGluC,OAAQu4F,GAA4BC,IAAuBT,GAAmB,CACtI5/D,UAAW,SAAmB48B,EAAM2jC,EAAUn+B,GAC5C,IAAIy+B,EAAmBJ,EAAoBF,GACvCO,EAAa,GAEbC,EAAOT,EAAqC1jC,EAAM,SAAU1vD,EAAK9I,GAEnE,IAAI6B,EAAIrE,EAAWi/F,GAAoB79F,EAAK69F,EAAkB59F,KAAMuyC,EAAQtoC,GAAM9I,GAASA,EAC3F,OAAQw7F,GAAmBF,EAAUz5F,GAAKi6F,GAAQvyF,EAAKmzF,EAAY76F,EAAE+6F,SAAW,GAAK/6F,CACvF,EAAGm8D,GAEH,GAAmB,iBAAR2+B,EAAkB,OAAOA,EAIpC,GAFIV,IAAoBU,EAAO36F,EAAQ26F,EAAMhB,EAAYW,IAErDd,EAAiB,OAAOmB,EAK5B,IAHA,IAAI30F,EAAS,GACTlI,EAAS68F,EAAK78F,OAET6P,EAAI,EAAGA,EAAI7P,EAAQ6P,IAAK,CAC/B,IAAIktF,EAAM/yE,EAAO6yE,EAAMhtF,GACvB,GAAY,MAARktF,EAAa,CACf,IAAIjrF,EAAM2pF,EAAgBoB,IAAQhtF,GAAGiC,IAAM,EACvCjF,EAAShB,EAAMgxF,EAAMhtF,EAAGiC,GAC5B5J,GAAU2D,EAAMgB,EAAQ,EAAGovF,KAAiBD,EACxCY,EAAW/wF,EAAMgB,EAAQovF,IACzB,IAAMpvF,EAAS,IACnBgD,EAAIiC,CACN,MAAO5J,GAAU60F,CACnB,CAEA,OAAO70F,CACT,G,4CClIF,MACM80F,EAAiB91C,GAAS1/C,KAAKC,IAAIy/C,EAAKrjC,aAAcqjC,EAAKv3C,cAiClD,MAAMstF,EAoBjB,WAAA79F,CAAYgV,EAAU,CAAC,GACnB,MAAMC,EAAW,CACb6C,QAAS9C,EAAQ6Y,SAAS5E,SAAS,GACnC8I,UAAW,MACX+rE,YAAa,MACbC,gBAAYx6F,EACZgW,QAAQ,EACRykF,YAAa,GACbplF,SAAU,IACVqlF,eAAe,EACfC,aAAa,EACbC,eAAe,EACfC,+BAA+B,EAC/BC,2BAA2B,EAC3BC,2BAA2B,EAC3BC,2BAA2B,EAC3BC,uBAAwB,GACxB,aAAA5+E,GAAiB,EACjB,WAAAE,GAAe,EACf,aAAAD,GAAiB,EACjB,OAAAL,GAAW,EACX,QAAAi/E,GAAY,EACZ,OAAA/+E,GAAW,EACXg/E,aAAY,KACD,GAMf,GAFA/+F,KAAK6L,MAAQ,IAAKyJ,KAAaD,KAE1BrV,KAAK6L,MAAMqiB,UAAcluB,KAAK6L,MAAMqiB,oBAAoBxd,SAEzD,YADAgS,QAAQsY,MAAM,4FAIlB,IAAKh7B,KAAK6L,MAAMsM,QAEZ,YADAuK,QAAQsY,MAAM,gEAIlBh7B,KAAKma,YAAa,EAClBna,KAAKg/F,gBAAiB,EACtBh/F,KAAKi/F,aAAc,EACnBj/F,KAAKk/F,WAAY,EAEjB,MAAMC,EAAoB,CAAE3kF,EAAG,EAAGtC,EAAG,GAErClY,KAAKo5B,SAAW,IAAK+lE,GACrBn/F,KAAKygB,SAAW,IAAK0+E,GACrBn/F,KAAKo/F,kBAAoB,IAAKD,GAC9Bn/F,KAAK4hB,WAAa,IAAKu9E,GACvBn/F,KAAKq/F,aAAe,IAAKF,GACzBn/F,KAAKs/F,aAAe,IAAKH,GACzBn/F,KAAKu/F,eAAiB,IAAKJ,GAC3Bn/F,KAAKw/F,aAAe,IAAKL,GAEzBn/F,KAAKy/F,MAAQ,KACbz/F,KAAKgW,OAAS,CAAC,EAEfhW,KAAK6e,gBACL7e,KAAK0/F,cACT,CAKA,aAAAC,CAActqF,EAAU,CAAC,GACrBrV,KAAK6L,MAAQ,IAAK7L,KAAK6L,SAAUwJ,GACjCrV,KAAK6L,MAAMizF,SAAS9+F,KAAK4/F,YACzB5/F,KAAK6/F,oBACT,CAKA,aAAAhhF,GAjIiB,IAACspC,EAkIdnoD,KAAKkuB,SAAW,CACZ9V,MAAOpY,KAAK6L,MAAMqiB,SAASqkD,YAC3Bl6D,OAAQrY,KAAK6L,MAAMqiB,SAASrd,cAEhC7Q,KAAKmY,QAAU,CACXC,OAvIU+vC,EAuIUnoD,KAAK6L,MAAMsM,QAvIZ1P,KAAKC,IAAIy/C,EAAKxjC,YAAawjC,EAAKvjC,cAwInDvM,OAAQ4lF,EAAcj+F,KAAK6L,MAAMsM,UAErCnY,KAAK8/F,MAAQ,CACT9rF,KAAMvL,KAAKoU,KAAK7c,KAAKmY,QAAQC,MAAQpY,KAAKkuB,SAAS9V,MAAO,GAC1D0kD,GAAI,GAER98D,KAAK+/F,MAAQ,CACT/rF,KAAMvL,KAAKoU,KAAK7c,KAAKmY,QAAQE,OAASrY,KAAKkuB,SAAS7V,OAAQ,GAC5DykD,GAAI,GAGR98D,KAAK6L,MAAMizF,SAAS9+F,KAAK4/F,YACzB5/F,KAAK6/F,oBACT,CAKA,kBAAAA,GACI7/F,KAAKk/F,WAAY,EACjBx7E,qBAAqB1jB,KAAKy/F,OAC1Bz/F,KAAKy/F,MAAQ5+E,sBAAsB,IAAM7gB,KAAKugB,UAClD,CAKA,OAAAA,GACI,IAAKvgB,KAAKk/F,UACN,OAEJl/F,KAAKggG,uBAEAhgG,KAAKigG,aACNjgG,KAAKk/F,WAAY,EACjBl/F,KAAKg/F,gBAAiB,GAE1B,MAAMpgF,EAAQ5e,KAAK4/F,WACnB5/F,KAAKkgG,mBAAmBthF,GACxB5e,KAAK6L,MAAMizF,SAASlgF,GACpB5e,KAAKy/F,MAAQ5+E,sBAAsB,IAAM7gB,KAAKugB,UAClD,CAKA,oBAAAy/E,GACIhgG,KAAKmgG,iBACLngG,KAAKogG,iBACLpgG,KAAKqgG,mBACLrgG,KAAKsgG,mBAEL,MAAMC,EAAkB,EAAIvgG,KAAK6L,MAAMoN,SACvCjZ,KAAKygB,SAASjG,GAAK+lF,EACnBvgG,KAAKygB,SAASvI,GAAKqoF,EAEU,aAAzBvgG,KAAK6L,MAAMumB,YACXpyB,KAAKo5B,SAAS5e,GAAKxa,KAAKygB,SAASjG,GAER,eAAzBxa,KAAK6L,MAAMumB,YACXpyB,KAAKo5B,SAASlhB,GAAKlY,KAAKygB,SAASvI,GAI/BlY,KAAK6L,MAAM+N,SAAU5Z,KAAKi/F,aAAiBj/F,KAAKg/F,iBAClDh/F,KAAKo5B,SAAS5e,EAAI/R,KAAKC,IAAID,KAAKoU,IAAI7c,KAAKo5B,SAAS5e,EAAGxa,KAAK8/F,MAAMhjC,IAAK98D,KAAK8/F,MAAM9rF,MAChFhU,KAAKo5B,SAASlhB,EAAIzP,KAAKC,IAAID,KAAKoU,IAAI7c,KAAKo5B,SAASlhB,EAAGlY,KAAK+/F,MAAMjjC,IAAK98D,KAAK+/F,MAAM/rF,MAExF,CAKA,UAAAwsF,CAAWC,GACPzgG,KAAKygB,SAASjG,GAAKimF,EAAMjmF,EACzBxa,KAAKygB,SAASvI,GAAKuoF,EAAMvoF,CAC7B,CAKA,cAAAioF,GACI,IAAKngG,KAAK6L,MAAM+N,QAAU5Z,KAAKma,WAC3B,OAIJ,MAAMumF,EAAc1gG,KAAKo5B,SAAS5e,EAAIxa,KAAK8/F,MAAM9rF,KAC3C2sF,EAAY3gG,KAAKo5B,SAAS5e,EAAIxa,KAAK8/F,MAAMhjC,GACzC8jC,EAAc5gG,KAAKo5B,SAASlhB,EAAIlY,KAAK+/F,MAAM/rF,KAC3C6sF,EAAY7gG,KAAKo5B,SAASlhB,EAAIlY,KAAK+/F,MAAMjjC,GACzCgkC,EAAUJ,GAAeC,EACzBI,EAAUH,GAAeC,EAE/B,IAAKC,IAAYC,EACb,OAGJ,MAAMC,EACCN,EAAc1gG,KAAK8/F,MAAM9rF,KAAOhU,KAAK8/F,MAAMhjC,GAD5CkkC,EAECJ,EAAc5gG,KAAK+/F,MAAM/rF,KAAOhU,KAAK+/F,MAAMjjC,GAG5CmkC,EACCD,EAAShhG,KAAKo5B,SAAS5e,EADxBymF,EAECD,EAAShhG,KAAKo5B,SAASlhB,EAGxBuoF,EAAQ,CACVjmF,EAAGymF,EAAmBjhG,KAAK6L,MAAMwyF,YACjCnmF,EAAG+oF,EAAmBjhG,KAAK6L,MAAMwyF,aAG/B6C,EACClhG,KAAKo5B,SAAS5e,GAAKxa,KAAKygB,SAASjG,EAAIimF,EAAMjmF,GAAKxa,KAAK6L,MAAMoN,SAD5DioF,EAEClhG,KAAKo5B,SAASlhB,GAAKlY,KAAKygB,SAASvI,EAAIuoF,EAAMvoF,GAAKlY,KAAK6L,MAAMoN,UAG7DynF,GAAeQ,GAAkBlhG,KAAK8/F,MAAM9rF,MAAU2sF,GAAaO,GAAkBlhG,KAAK8/F,MAAMhjC,MACjG2jC,EAAMjmF,EAAIymF,EAAmBjhG,KAAK6L,MAAMwyF,YAAcr+F,KAAKygB,SAASjG,IAGnEomF,GAAeM,GAAkBlhG,KAAK+/F,MAAM/rF,MAAU6sF,GAAaK,GAAkBlhG,KAAK+/F,MAAMjjC,MACjG2jC,EAAMvoF,EAAI+oF,EAAmBjhG,KAAK6L,MAAMwyF,YAAcr+F,KAAKygB,SAASvI,GAGxElY,KAAKwgG,WAAW,CACZhmF,EAAGsmF,EAAUL,EAAMjmF,EAAI,EACvBtC,EAAG6oF,EAAUN,EAAMvoF,EAAI,GAE/B,CAKA,cAAAkoF,GACI,IAAKpgG,KAAKma,WACN,OAGJ,MAAMgnF,EACCnhG,KAAKs/F,aAAa9kF,EAAIxa,KAAKo5B,SAAS5e,EADrC2mF,EAECnhG,KAAKs/F,aAAapnF,EAAIlY,KAAKo5B,SAASlhB,EAG3ClY,KAAKwgG,WAAW,CACZhmF,EAAG2mF,EAAiBnhG,KAAKygB,SAASjG,EAClCtC,EAAGipF,EAAiBnhG,KAAKygB,SAASvI,GAE1C,CAKA,gBAAAmoF,GACSrgG,KAAKi/F,cAIVj/F,KAAKwgG,WAAW,CACZhmF,EAAGxa,KAAKw/F,aAAahlF,EAAIxa,KAAKygB,SAASjG,EACvCtC,EAAGlY,KAAKw/F,aAAatnF,EAAIlY,KAAKygB,SAASvI,IAG3ClY,KAAKw/F,aAAahlF,EAAI,EACtBxa,KAAKw/F,aAAatnF,EAAI,EAC1B,CAKA,gBAAAooF,GACStgG,KAAKg/F,gBAIVh/F,KAAKwgG,WAAW,CACZhmF,EAA+C,KAA3Cxa,KAAKu/F,eAAe/kF,EAAIxa,KAAKo5B,SAAS5e,GAAYxa,KAAKygB,SAASjG,EACpEtC,EAA+C,KAA3ClY,KAAKu/F,eAAernF,EAAIlY,KAAKo5B,SAASlhB,GAAYlY,KAAKygB,SAASvI,GAE5E,CAKA,QAAA+nF,GACI,OACIjgG,KAAKma,YACLna,KAAKi/F,aACLx2F,KAAKsU,IAAI/c,KAAKygB,SAASjG,IAAM,KAC7B/R,KAAKsU,IAAI/c,KAAKygB,SAASvI,IAAM,GAErC,CAKA,QAAAib,CAASiG,EAAW,CAAC,GACjBp5B,KAAKg/F,gBAAiB,EACtBh/F,KAAKu/F,eAAe/kF,GAAK4e,EAAS5e,GAAK,EACvCxa,KAAKu/F,eAAernF,GAAKkhB,EAASlhB,GAAK,EACvClY,KAAK6/F,oBACT,CAKA,WAAAuB,CAAYhoE,EAAW,CAAC,GACpBp5B,KAAKygB,SAASjG,EAAI,EAClBxa,KAAKygB,SAASvI,EAAI,EAClBlY,KAAKo5B,SAAS5e,GAAK4e,EAAS5e,GAAK,EACjCxa,KAAKo5B,SAASlhB,GAAKkhB,EAASlhB,GAAK,EACjClY,KAAK6/F,oBACT,CAKA,QAAAD,GACI,MAAO,CACHK,SAAUjgG,KAAKigG,WACf9lF,cAAena,KAAK4hB,WAAWpH,IAAKxa,KAAK4hB,WAAW1J,GACpDkhB,SAAU,CAAE5e,GAAIxa,KAAKo5B,SAAS5e,EAAGtC,GAAIlY,KAAKo5B,SAASlhB,GACnD0J,WAAY5hB,KAAK4hB,WACjBy/E,UAAWrhG,KAAKshG,aAAathG,KAAKq/F,aAAa7kF,EAAGxa,KAAKq/F,aAAannF,GACpEqpF,gBAAiB,CACbzjF,KAAM9d,KAAKo5B,SAAS5e,GAAKxa,KAAK8/F,MAAMhjC,GACpCl/C,MAAO5d,KAAKo5B,SAAS5e,GAAKxa,KAAK8/F,MAAM9rF,KACrC2J,IAAK3d,KAAKo5B,SAASlhB,GAAKlY,KAAK+/F,MAAMjjC,GACnCj/C,OAAQ7d,KAAKo5B,SAASlhB,GAAKlY,KAAK+/F,MAAM/rF,MAGlD,CAKA,YAAAstF,CAAa9mF,EAAGtC,GACZ,OAAOzP,KAAK8H,MAAM9H,KAAK0T,MAAM3B,EAAGtC,IAAM,IAAMzP,KAAK4T,IACrD,CAKA,gBAAAmlF,CAAiBtlF,EAAOulF,GAGpB,OAFiBh5F,KAAKsU,IAAI,GAAKtU,KAAKsU,IAAIb,KAExB,GAAKulF,EACV,aAEA,UAEf,CAKA,kBAAAvB,CAAmBthF,GACe,cAA1B5e,KAAK6L,MAAMuyF,aACXp+F,KAAK6L,MAAMsM,QAAQgM,MAAM1e,UAAY,cAAcmZ,EAAMwa,SAAS5e,SAASoE,EAAMwa,SAASlhB,QAEhE,WAA1BlY,KAAK6L,MAAMuyF,aACXp+F,KAAK6L,MAAMqiB,SAAS8E,UAAYpU,EAAMwa,SAASlhB,EAC/ClY,KAAK6L,MAAMqiB,SAASgF,WAAatU,EAAMwa,SAAS5e,EAExD,CAKA,YAAAklF,GACI,MAAMgC,EAAa,CAAElnF,EAAG,EAAGtC,EAAG,GACxBypF,EAAe,CAAEnnF,EAAG,EAAGtC,EAAG,GAChC,IAAI0pF,EAAgB,KAChBC,EAAa,KACbC,GAAU,EAEd,MAAMC,EAAmBj/E,IACrB,IAAK9iB,KAAKma,WACN,OAGJ,MAAM6nF,EAAYF,EAAUh/E,EAAMm/E,QAAQ,GAAKn/E,GACzC,MAAE1Q,EAAK,MAAEC,EAAK,QAAEC,EAAO,QAAEC,GAAYyvF,EAE3ChiG,KAAK4hB,WAAWpH,EAAIpI,EAAQsvF,EAAWlnF,EACvCxa,KAAK4hB,WAAW1J,EAAI7F,EAAQqvF,EAAWxpF,EAEvClY,KAAKq/F,aAAa7kF,EAAIlI,EAAUqvF,EAAannF,EAC7Cxa,KAAKq/F,aAAannF,EAAI3F,EAAUovF,EAAazpF,GAIxCzP,KAAKsU,IAAI/c,KAAKq/F,aAAa7kF,GAAK,IAAMonF,GACtCn5F,KAAKsU,IAAI/c,KAAKq/F,aAAannF,GAAK,IAAM0pF,KAEvCA,EAAgB5hG,KAAKwhG,iBACjBxhG,KAAKshG,aAAathG,KAAKq/F,aAAa7kF,EAAGxa,KAAKq/F,aAAannF,GACzDlY,KAAK6L,MAAMgzF,yBAKf7+F,KAAK6L,MAAM8yF,2BAAsE,QAAzC3+F,KAAK6L,MAAM8yF,0BAC/CiD,IAAkB5hG,KAAK6L,MAAM8yF,2BAA6BmD,GAC1D9hG,KAAKs/F,aAAa9kF,EAAIxa,KAAKo/F,kBAAkB5kF,EAAIxa,KAAK4hB,WAAWpH,EACjExa,KAAKs/F,aAAapnF,EAAIlY,KAAKo/F,kBAAkBlnF,EAAIlY,KAAK4hB,WAAW1J,GACzD4pF,GAIR9hG,KAAKs/F,aAAa9kF,EAAIxa,KAAKo/F,kBAAkB5kF,EAC7Cxa,KAAKs/F,aAAapnF,EAAIlY,KAAKo/F,kBAAkBlnF,IAJ7ClY,KAAKs/F,aAAa9kF,EAAIxa,KAAKo/F,kBAAkB5kF,EAAIxa,KAAK4hB,WAAWpH,EACjExa,KAAKs/F,aAAapnF,EAAIlY,KAAKo/F,kBAAkBlnF,EAAIlY,KAAK4hB,WAAW1J,IAMrElY,KAAKs/F,aAAa9kF,EAAIxa,KAAKo/F,kBAAkB5kF,EAAIxa,KAAK4hB,WAAWpH,EACjExa,KAAKs/F,aAAapnF,EAAIlY,KAAKo/F,kBAAkBlnF,EAAIlY,KAAK4hB,WAAW1J,IAIzElY,KAAKgW,OAAOksF,YAAep/E,IACvBg/E,KAAah/E,EAAMm/E,UAAWn/E,EAAMm/E,QAAQ,IAE5CjiG,KAAK6L,MAAMoU,cAAcjgB,KAAK4/F,WAAY98E,EAAOg/E,GAEjD,MAAME,EAAYF,EAAUh/E,EAAMm/E,QAAQ,GAAKn/E,GACzC,MAAE1Q,EAAK,MAAEC,EAAK,QAAEC,EAAO,QAAEC,GAAYyvF,GAErC,SAAE9zE,GAAaluB,KAAK6L,MACpBy2D,EAAOp0C,EAAShP,wBAGtB,KAAI5M,EAAUgwD,EAAKxkD,MAAQoQ,EAASy0C,WAAaz0C,EAASqkD,gBAKtDhgE,EAAU+vD,EAAK3kD,KAAOuQ,EAASu0C,UAAYv0C,EAASrd,eAKnD7Q,KAAK6L,MAAMkzF,aAAa/+F,KAAK4/F,WAAY98E,IAKzB,IAAjBA,EAAMnP,SAKqB,UAA3B3T,KAAK6L,MAAMsyF,cAA2B2D,KAKX,UAA3B9hG,KAAK6L,MAAMsyF,aAA4B2D,MAMvC9hG,KAAK6L,MAAM0yF,aADG,CAAC,QAAS,WAAY,SAAU,SAAU,SACpBrtF,QAAQ4R,EAAM1hB,OAAO+hB,SAASrN,gBAAkB,GAAxF,CAKA,GAAI9V,KAAK6L,MAAMyyF,cAAe,CAC1B,MAAM6D,EAtfI,EAACnvF,EAASwH,EAAGtC,KACnC,MAAM+0B,EAAQj6B,EAAQuU,WAChB66E,EAAQhxF,SAASixF,cACvB,IAAK,IAAIvxF,EAAI,EAAGA,EAAIm8B,EAAMhsC,OAAQ6P,IAAK,CACnC,MAAM89B,EAAO3B,EAAMn8B,GACnB,GAAsB,IAAlB89B,EAAK5oC,SACL,SAEJo8F,EAAME,mBAAmB1zD,GACzB,MAAM0zB,EAAO8/B,EAAMljF,wBACnB,GAAI1E,GAAK8nD,EAAKxkD,MAAQ5F,GAAKoqD,EAAK3kD,KAAOnD,GAAK8nD,EAAK1kD,OAAS1F,GAAKoqD,EAAKzkD,OAChE,OAAO+wB,CAEf,CACA,OAAO,GAwesB2zD,CAAkBz/E,EAAM1hB,OAAQkR,EAASC,GAC1D,GAAI4vF,EACA,OAveO,MACvB,MAAMK,EAAYzxF,OAAOoR,aAAepR,OAAOoR,eAAiB/Q,SAASoxF,UACpEA,IAGDA,EAAUp/E,gBACVo/E,EAAUp/E,kBACHo/E,EAAUt0D,OACjBs0D,EAAUt0D,UAieFu0D,EACJ,CAEAziG,KAAKma,YAAa,EAElBunF,EAAWlnF,EAAIpI,EACfsvF,EAAWxpF,EAAI7F,EAEfsvF,EAAannF,EAAIlI,EACjBqvF,EAAazpF,EAAI3F,EAEjBvS,KAAKo/F,kBAAkB5kF,EAAIxa,KAAKo5B,SAAS5e,EACzCxa,KAAKo/F,kBAAkBlnF,EAAIlY,KAAKo5B,SAASlhB,EAEzC6pF,EAAgBj/E,GAChB9iB,KAAK6/F,sBAEAiC,GAAW9hG,KAAK6L,MAAM+yF,2BACvB97E,EAAMb,gBA1BV,GA8BJjiB,KAAKgW,OAAO0sF,YAAe5/E,KAEnBA,EAAMtO,YAAwD,QAAzCxU,KAAK6L,MAAM8yF,2BAChC3+F,KAAK6L,MAAM8yF,4BAA8BiD,GACzC9+E,EAAMb,iBAEV8/E,EAAgBj/E,GAChB9iB,KAAK6L,MAAMqU,cAAclgB,KAAK4/F,WAAY98E,EAAOg/E,IAGrD9hG,KAAKgW,OAAO2sF,UAAa7/E,IACrB9iB,KAAKma,YAAa,EAClBynF,EAAgB,KAChB5hG,KAAK6L,MAAMsU,YAAYngB,KAAK4/F,WAAY98E,EAAOg/E,IAGnD9hG,KAAKgW,OAAOsD,MAASwJ,IACjB,MAAMlE,EAAQ5e,KAAK4/F,WACd5/F,KAAK6L,MAAM2yF,gBAGhBx+F,KAAKygB,SAASjG,EAAI,EAClBxa,KAAKygB,SAASvI,EAAI,EAClBlY,KAAKi/F,aAAc,EAEnBj/F,KAAKw/F,aAAahlF,GAAKsI,EAAMe,OAC7B7jB,KAAKw/F,aAAatnF,GAAK4K,EAAMgB,OAE7B9jB,KAAK6L,MAAMkU,QAAQnB,EAAOkE,GAE1B9iB,KAAK6/F,qBAELrgF,aAAaqiF,GACbA,EAAatiF,WAAW,IAAOvf,KAAKi/F,aAAc,EAAQ,IAItDj/F,KAAK6L,MAAM4yF,+BACXz+F,KAAKwhG,iBACDxhG,KAAKshG,cAAcx+E,EAAMe,QAASf,EAAMgB,QACxC9jB,KAAK6L,MAAMgzF,0BACT7+F,KAAK6L,MAAM4yF,+BAEjB37E,EAAMb,mBAIdjiB,KAAKgW,OAAOib,OAAS,KACjB,MAAM,WAAEiC,EAAU,UAAEF,GAAchzB,KAAK6L,MAAMqiB,SACzCzlB,KAAKsU,IAAI/c,KAAKo5B,SAAS5e,EAAI0Y,GAAc,IACzClzB,KAAKo5B,SAAS5e,GAAK0Y,EACnBlzB,KAAKygB,SAASjG,EAAI,GAElB/R,KAAKsU,IAAI/c,KAAKo5B,SAASlhB,EAAI8a,GAAa,IACxChzB,KAAKo5B,SAASlhB,GAAK8a,EACnBhzB,KAAKygB,SAASvI,EAAI,IAI1BlY,KAAKgW,OAAOoD,MAAS0J,IACjB,MAAMlE,EAAQ5e,KAAK4/F,WACbgD,EAAuC,aAAzB5iG,KAAK6L,MAAMumB,UAA2BxT,EAAMgD,WAAWpH,EAAI,EACzEqoF,EAAuC,eAAzB7iG,KAAK6L,MAAMumB,UAA6BxT,EAAMgD,WAAW1J,EAAI,EAC7EzP,KAAKC,IAAID,KAAKsU,IAAI6lF,GAAcn6F,KAAKsU,IAAI8lF,IAljBxB,IAmjBjB//E,EAAMb,iBACNa,EAAMZ,mBAEVliB,KAAK6L,MAAMgU,QAAQjB,EAAOkE,EAAOg/E,IAGrC9hG,KAAKgW,OAAO8sF,YAAc,IAAM9iG,KAAK6e,gBACrC7e,KAAKgW,OAAOuoE,OAAS,IAAMv+E,KAAK6e,gBAEhC7e,KAAK6L,MAAMqiB,SAAS7a,iBAAiB,YAAarT,KAAKgW,OAAOksF,aAC9DliG,KAAK6L,MAAMqiB,SAAS7a,iBAAiB,aAAcrT,KAAKgW,OAAOksF,YAAa,CAAEtvF,SAAS,IACvF5S,KAAK6L,MAAMqiB,SAAS7a,iBAAiB,QAASrT,KAAKgW,OAAOoD,OAC1DpZ,KAAK6L,MAAMqiB,SAAS7a,iBAAiB,QAASrT,KAAKgW,OAAOsD,MAAO,CAAE1G,SAAS,IAC5E5S,KAAK6L,MAAMqiB,SAAS7a,iBAAiB,SAAUrT,KAAKgW,OAAOib,QAC3DjxB,KAAK6L,MAAMsM,QAAQ9E,iBAAiB,OAAQrT,KAAKgW,OAAO8sF,aAAa,GACrE/xF,OAAOsC,iBAAiB,YAAarT,KAAKgW,OAAO0sF,aACjD3xF,OAAOsC,iBAAiB,YAAarT,KAAKgW,OAAO0sF,YAAa,CAAE9vF,SAAS,IACzE7B,OAAOsC,iBAAiB,UAAWrT,KAAKgW,OAAO2sF,WAC/C5xF,OAAOsC,iBAAiB,WAAYrT,KAAKgW,OAAO2sF,WAChD5xF,OAAOsC,iBAAiB,SAAUrT,KAAKgW,OAAOuoE,OAClD,CAKA,OAAAp3D,GACInnB,KAAK6L,MAAMqiB,SAAS9Z,oBAAoB,YAAapU,KAAKgW,OAAOksF,aACjEliG,KAAK6L,MAAMqiB,SAAS9Z,oBAAoB,aAAcpU,KAAKgW,OAAOksF,aAClEliG,KAAK6L,MAAMqiB,SAAS9Z,oBAAoB,QAASpU,KAAKgW,OAAOoD,OAC7DpZ,KAAK6L,MAAMqiB,SAAS9Z,oBAAoB,QAASpU,KAAKgW,OAAOsD,OAC7DtZ,KAAK6L,MAAMqiB,SAAS9Z,oBAAoB,SAAUpU,KAAKgW,OAAOib,QAC9DjxB,KAAK6L,MAAMsM,QAAQ/D,oBAAoB,OAAQpU,KAAKgW,OAAO8sF,aAC3D/xF,OAAOqD,oBAAoB,YAAapU,KAAKgW,OAAO0sF,aACpD3xF,OAAOqD,oBAAoB,YAAapU,KAAKgW,OAAO0sF,aACpD3xF,OAAOqD,oBAAoB,UAAWpU,KAAKgW,OAAO2sF,WAClD5xF,OAAOqD,oBAAoB,WAAYpU,KAAKgW,OAAO2sF,WACnD5xF,OAAOqD,oBAAoB,SAAUpU,KAAKgW,OAAOuoE,OACrD,E,uBCvnBJ3/E,EAAOC,QAAU,SAAU2E,EAAGD,GAC5B,IAEuB,IAArBvC,UAAUC,OAAeyhB,QAAQsY,MAAMx3B,GAAKkf,QAAQsY,MAAMx3B,EAAGD,EAC/D,CAAE,MAAOy3B,GAAqB,CAChC,C,2BCLA,IAAIr8B,EAAa,EAAQ,MACrBuK,EAAW,EAAQ,IACnB3J,EAAiB,EAAQ,MAG7BX,EAAOC,QAAU,SAAUghD,EAAO+jC,EAAOmf,GACvC,IAAIC,EAAWC,EAUf,OAPE1jG,GAEAZ,EAAWqkG,EAAYpf,EAAMvjF,cAC7B2iG,IAAcD,GACd75F,EAAS+5F,EAAqBD,EAAU7iG,YACxC8iG,IAAuBF,EAAQ5iG,WAC/BZ,EAAesgD,EAAOojD,GACjBpjD,CACT,C,cClBA,UA8BG9uC,OArBC,EAAQ,CACJ,QACA,cAEK,0BADN,EAkBI,SAAkB67D,EAAWrX,GACxC,aAeA,IAAI2tC,EAAe9xF,SAAS6V,gBAAgB9C,MAExC67C,EAAuD,iBAA3BkjC,EAAax6E,WAC3C,aAAe,mBACby6E,EAAqD,iBAA1BD,EAAaz9F,UAC1C,YAAc,kBAEZ29F,EAAqB,CACvBC,iBAAkB,sBAClB36E,WAAY,iBACXs3C,GAGCsjC,EAAmB,CACrB79F,UAAW09F,EACXz6E,WAAYs3C,EACZ3+B,mBAAoB2+B,EAAqB,WACzCA,mBAAoBA,EAAqB,WACzCD,gBAAiBC,EAAqB,SAKxC,SAASwd,EAAMxqE,EAASmrE,GAChBnrE,IAINhT,KAAKgT,QAAUA,EAEfhT,KAAKm+E,OAASA,EACdn+E,KAAKo5B,SAAW,CACd5e,EAAG,EACHtC,EAAG,GAGLlY,KAAKi+E,UACP,CAGA,IAAIt5E,EAAQ64E,EAAKr9E,UAAYb,OAAOc,OAAQwsE,EAAUzsE,WACtDwE,EAAMtE,YAAcm9E,EAEpB74E,EAAMs5E,QAAU,WAEdj+E,KAAKujG,QAAU,CACbC,cAAe,CAAC,EAChBC,MAAO,CAAC,EACRC,MAAO,CAAC,GAGV1jG,KAAK0kD,IAAI,CACPtrB,SAAU,YAEd,EAGAz0B,EAAM0jD,YAAc,SAAUvlC,GAC5B,IAAI8Z,EAAS,KAAO9Z,EAAM7iB,KACrBD,KAAM48B,IACT58B,KAAM48B,GAAU9Z,EAEpB,EAEAne,EAAM4wD,QAAU,WACdv1D,KAAK+J,KAAOwrD,EAASv1D,KAAKgT,QAC5B,EAMArO,EAAM+/C,IAAM,SAAUvgC,GACpB,IAAIw/E,EAAY3jG,KAAKgT,QAAQmR,MAE7B,IAAM,IAAIyjC,KAAQzjC,EAGhBw/E,EADoBL,EAAkB17C,IAAUA,GACnBzjC,EAAOyjC,EAExC,EAGAjjD,EAAMi/F,YAAc,WAClB,IAAIz/E,EAAQnT,iBAAkBhR,KAAKgT,SAC/B6wF,EAAe7jG,KAAKm+E,OAAOD,WAAW,cACtC4lB,EAAc9jG,KAAKm+E,OAAOD,WAAW,aACrC6lB,EAAS5/E,EAAO0/E,EAAe,OAAS,SACxCG,EAAS7/E,EAAO2/E,EAAc,MAAQ,UACtCtpF,EAAIlK,WAAYyzF,GAChB7rF,EAAI5H,WAAY0zF,GAEhBC,EAAajkG,KAAKm+E,OAAOp0E,MACA,GAAxBg6F,EAAO7yF,QAAQ,OAClBsJ,EAAMA,EAAI,IAAQypF,EAAW7rF,QAEF,GAAxB4rF,EAAO9yF,QAAQ,OAClBgH,EAAMA,EAAI,IAAQ+rF,EAAW5rF,QAG/BmC,EAAI9E,MAAO8E,GAAM,EAAIA,EACrBtC,EAAIxC,MAAOwC,GAAM,EAAIA,EAErBsC,GAAKqpF,EAAeI,EAAW3/E,YAAc2/E,EAAW1/E,aACxDrM,GAAK4rF,EAAcG,EAAW7/E,WAAa6/E,EAAW5/E,cAEtDrkB,KAAKo5B,SAAS5e,EAAIA,EAClBxa,KAAKo5B,SAASlhB,EAAIA,CACpB,EAGAvT,EAAMu/F,eAAiB,WACrB,IAAID,EAAajkG,KAAKm+E,OAAOp0E,KACzBoa,EAAQ,CAAC,EACT0/E,EAAe7jG,KAAKm+E,OAAOD,WAAW,cACtC4lB,EAAc9jG,KAAKm+E,OAAOD,WAAW,aAGrCimB,EAAWN,EAAe,cAAgB,eAC1CO,EAAYP,EAAe,OAAS,QACpCQ,EAAiBR,EAAe,QAAU,OAE1CrpF,EAAIxa,KAAKo5B,SAAS5e,EAAIypF,EAAYE,GAEtChgF,EAAOigF,GAAcpkG,KAAKskG,UAAW9pF,GAErC2J,EAAOkgF,GAAmB,GAG1B,IAAIE,EAAWT,EAAc,aAAe,gBACxCU,EAAYV,EAAc,MAAQ,SAClCW,EAAiBX,EAAc,SAAW,MAE1C5rF,EAAIlY,KAAKo5B,SAASlhB,EAAI+rF,EAAYM,GAEtCpgF,EAAOqgF,GAAcxkG,KAAK0kG,UAAWxsF,GAErCiM,EAAOsgF,GAAmB,GAE1BzkG,KAAK0kD,IAAKvgC,GACVnkB,KAAKotE,UAAW,SAAU,CAAEptE,MAC9B,EAEA2E,EAAM2/F,UAAY,SAAU9pF,GAC1B,IAAIuS,EAAe/sB,KAAKm+E,OAAOD,WAAW,cAC1C,OAAOl+E,KAAKm+E,OAAO9oE,QAAQsvF,kBAAoB53E,EACzCvS,EAAIxa,KAAKm+E,OAAOp0E,KAAKqO,MAAU,IAAQ,IAAMoC,EAAI,IACzD,EAEA7V,EAAM+/F,UAAY,SAAUxsF,GAC1B,IAAI6U,EAAe/sB,KAAKm+E,OAAOD,WAAW,cAC1C,OAAOl+E,KAAKm+E,OAAO9oE,QAAQsvF,iBAAmB53E,EACxC7U,EAAIlY,KAAKm+E,OAAOp0E,KAAKsO,OAAW,IAAQ,IAAMH,EAAI,IAC1D,EAEAvT,EAAMigG,cAAgB,SAAUpqF,EAAGtC,GACjClY,KAAK4jG,cAEL,IAAIiB,EAAO7kG,KAAKo5B,SAAS5e,EACrBsqF,EAAO9kG,KAAKo5B,SAASlhB,EAErB6sF,EAAavqF,GAAKxa,KAAKo5B,SAAS5e,GAAKtC,GAAKlY,KAAKo5B,SAASlhB,EAM5D,GAHAlY,KAAKohG,YAAa5mF,EAAGtC,IAGhB6sF,GAAe/kG,KAAKglG,gBAAzB,CAKA,IAAIC,EAASzqF,EAAIqqF,EACbK,EAAShtF,EAAI4sF,EACbK,EAAkB,CAAC,EACvBA,EAAgB1/F,UAAYzF,KAAKolG,aAAcH,EAAQC,GAEvDllG,KAAK0oB,WAAW,CACdo0C,GAAIqoC,EACJE,gBAAiB,CACf5/F,UAAWzF,KAAKkkG,gBAElBoB,YAAY,GAZd,MAFEtlG,KAAKkkG,gBAgBT,EAEAv/F,EAAMygG,aAAe,SAAU5qF,EAAGtC,GAMhC,MAAO,gBAFPsC,EAFmBxa,KAAKm+E,OAAOD,WAAW,cAEvB1jE,GAAKA,GAEI,QAD5BtC,EAFkBlY,KAAKm+E,OAAOD,WAAW,aAEvBhmE,GAAKA,GACkB,QAC3C,EAGAvT,EAAMi8E,KAAO,SAAUpmE,EAAGtC,GACxBlY,KAAKohG,YAAa5mF,EAAGtC,GACrBlY,KAAKkkG,gBACP,EAEAv/F,EAAMk8E,OAASl8E,EAAMigG,cAErBjgG,EAAMy8F,YAAc,SAAU5mF,EAAGtC,GAC/BlY,KAAKo5B,SAAS5e,EAAIlK,WAAYkK,GAC9Bxa,KAAKo5B,SAASlhB,EAAI5H,WAAY4H,EAChC,EAUAvT,EAAM4gG,eAAiB,SAAU11F,GAK/B,IAAM,IAAI+3C,KAJV5nD,KAAK0kD,IAAK70C,EAAKitD,IACVjtD,EAAKy1F,YACRtlG,KAAKwlG,cAAe31F,EAAKitD,IAETjtD,EAAKw1F,gBACrBx1F,EAAKw1F,gBAAiBz9C,GAAO7nD,KAAMC,KAEvC,EAUA2E,EAAM+jB,WAAa,SAAU7Y,GAE3B,GAAMS,WAAYtQ,KAAKm+E,OAAO9oE,QAAQgsB,oBAAtC,CAKA,IAAIokE,EAAczlG,KAAKujG,QAEvB,IAAM,IAAI37C,KAAQ/3C,EAAKw1F,gBACrBI,EAAY/B,MAAO97C,GAAS/3C,EAAKw1F,gBAAiBz9C,GAGpD,IAAMA,KAAQ/3C,EAAKitD,GACjB2oC,EAAYjC,cAAe57C,IAAS,EAE/B/3C,EAAKy1F,aACRG,EAAYhC,MAAO77C,IAAS,GAK3B/3C,EAAKmE,OACRhU,KAAK0kD,IAAK70C,EAAKmE,MAEPhU,KAAKgT,QAAQ8R,cAKvB9kB,KAAK0lG,iBAAkB71F,EAAKitD,IAE5B98D,KAAK0kD,IAAK70C,EAAKitD,IAEf98D,KAAKglG,iBAAkB,CA7BvB,MAFEhlG,KAAKulG,eAAgB11F,EAiCzB,EAUA,IAAI81F,EAAkB,WAA0BxC,EALnChgG,QAAS,WAAY,SAAU+lD,GACxC,MAAO,IAAMA,EAAGpzC,aAClB,GAKFnR,EAAM+gG,iBAAmB,WAGvB,IAAK1lG,KAAKglG,gBAAV,CAcA,IAAIY,EAAW5lG,KAAKm+E,OAAO9oE,QAAQgsB,mBACnCukE,EAA8B,iBAAZA,EAAuBA,EAAW,KAAOA,EAE3D5lG,KAAK0kD,IAAI,CACPsb,mBAAoB2lC,EACpBtkE,mBAAoBukE,EACpB7lC,gBAAiB//D,KAAK6lG,cAAgB,IAGxC7lG,KAAKgT,QAAQK,iBAAkB+vF,EAAoBpjG,MAAM,EArBzD,CAsBF,EAIA2E,EAAMmhG,sBAAwB,SAAUhjF,GACtC9iB,KAAK+lG,gBAAiBjjF,EACxB,EAEAne,EAAMqhG,iBAAmB,SAAUljF,GACjC9iB,KAAK+lG,gBAAiBjjF,EACxB,EAGA,IAAImjF,EAAyB,CAC3B,oBAAqB,aAGvBthG,EAAMohG,gBAAkB,SAAUjjF,GAEhC,GAAKA,EAAM1hB,SAAWpB,KAAKgT,QAA3B,CAGA,IAAIyyF,EAAczlG,KAAKujG,QAEnB2C,EAAeD,EAAwBnjF,EAAMojF,eAAkBpjF,EAAMojF,oBAGlET,EAAYjC,cAAe0C,GA3VpC,SAAqBlnG,GACnB,IAAM,IAAI4oD,KAAQ5oD,EAChB,OAAO,EAGT,OAAO,CACT,CAuVOmnG,CAAYV,EAAYjC,gBAE3BxjG,KAAKomG,oBAGFF,KAAgBT,EAAYhC,QAE/BzjG,KAAKgT,QAAQmR,MAAOrB,EAAMojF,cAAiB,UACpCT,EAAYhC,MAAOyC,IAGvBA,KAAgBT,EAAY/B,QACT+B,EAAY/B,MAAOwC,GACzBnmG,KAAMC,aACfylG,EAAY/B,MAAOwC,IAG5BlmG,KAAKotE,UAAW,gBAAiB,CAAEptE,MAzBnC,CA0BF,EAEA2E,EAAMyhG,kBAAoB,WACxBpmG,KAAKqmG,yBACLrmG,KAAKgT,QAAQoB,oBAAqBgvF,EAAoBpjG,MAAM,GAC5DA,KAAKglG,iBAAkB,CACzB,EAMArgG,EAAM6gG,cAAgB,SAAUrhF,GAE9B,IAAImiF,EAAa,CAAC,EAClB,IAAM,IAAI1+C,KAAQzjC,EAChBmiF,EAAY1+C,GAAS,GAEvB5nD,KAAK0kD,IAAK4hD,EACZ,EAEA,IAAIC,EAAuB,CACzBvmC,mBAAoB,GACpB3+B,mBAAoB,GACpB0+B,gBAAiB,IA6HnB,OA1HAp7D,EAAM0hG,uBAAyB,WAE7BrmG,KAAK0kD,IAAK6hD,EACZ,EAIA5hG,EAAM67E,QAAU,SAAUgmB,GACxBA,EAAQ9wF,MAAO8wF,GAAU,EAAIA,EAC7BxmG,KAAK6lG,aAAeW,EAAQ,IAC9B,EAKA7hG,EAAM8hG,WAAa,WACjBzmG,KAAKgT,QAAQic,WAAWG,YAAapvB,KAAKgT,SAE1ChT,KAAK0kD,IAAI,CAAEn/B,QAAS,KACpBvlB,KAAKotE,UAAW,SAAU,CAAEptE,MAC9B,EAEA2E,EAAMgW,OAAS,WAEPqlD,GAAuB1vD,WAAYtQ,KAAKm+E,OAAO9oE,QAAQgsB,qBAM7DrhC,KAAKitE,KAAM,gBAAiB,WAC1BjtE,KAAKymG,YACP,GACAzmG,KAAKqkC,QARHrkC,KAAKymG,YAST,EAEA9hG,EAAM89E,OAAS,kBACNziF,KAAKikC,SAEZjkC,KAAK0kD,IAAI,CAAEn/B,QAAS,KAEpB,IAAIlQ,EAAUrV,KAAKm+E,OAAO9oE,QAEtBgwF,EAAkB,CAAC,EAEvBA,EAD4BrlG,KAAK0mG,mCAAmC,iBACzB1mG,KAAK2mG,sBAEhD3mG,KAAK0oB,WAAW,CACd1U,KAAMqB,EAAQopE,YACd3hB,GAAIznD,EAAQqpE,aACZ4mB,YAAY,EACZD,gBAAiBA,GAErB,EAEA1gG,EAAMgiG,sBAAwB,WAGtB3mG,KAAKikC,UACTjkC,KAAKotE,UAAU,SAEnB,EAOAzoE,EAAM+hG,mCAAqC,SAAUE,GACnD,IAAIC,EAAc7mG,KAAKm+E,OAAO9oE,QAASuxF,GAEvC,GAAKC,EAAYrtE,QACf,MAAO,UAGT,IAAM,IAAIouB,KAAQi/C,EAChB,OAAOj/C,CAEX,EAEAjjD,EAAM0/B,KAAO,WAEXrkC,KAAKikC,UAAW,EAEhBjkC,KAAK0kD,IAAI,CAAEn/B,QAAS,KAEpB,IAAIlQ,EAAUrV,KAAKm+E,OAAO9oE,QAEtBgwF,EAAkB,CAAC,EAEvBA,EAD4BrlG,KAAK0mG,mCAAmC,gBACzB1mG,KAAK8mG,oBAEhD9mG,KAAK0oB,WAAW,CACd1U,KAAMqB,EAAQqpE,aACd5hB,GAAIznD,EAAQopE,YAEZ6mB,YAAY,EACZD,gBAAiBA,GAErB,EAEA1gG,EAAMmiG,oBAAsB,WAGrB9mG,KAAKikC,WACRjkC,KAAK0kD,IAAI,CAAEn/B,QAAS,SACpBvlB,KAAKotE,UAAU,QAEnB,EAEAzoE,EAAMwiB,QAAU,WACdnnB,KAAK0kD,IAAI,CACPtrB,SAAU,GACVtb,KAAM,GACNF,MAAO,GACPD,IAAK,GACLE,OAAQ,GACR6K,WAAY,GACZjjB,UAAW,IAEf,EAEO+3E,CAEP,GA5hBa,8B,2BCZb,IAAIupB,EAAwB,EAAQ,MAChCrzD,EAAU,EAAQ,MAItB90C,EAAOC,QAAUkoG,EAAwB,CAAC,EAAE9jG,SAAW,WACrD,MAAO,WAAaywC,EAAQ1zC,MAAQ,GACtC,C,2BCNAnB,EAAQE,YAAa,EACrBF,EAAiB,aAAS,EAE1B,IAIgCG,EAJ5BgtC,GAI4BhtC,EAJG,EAAQ,QAIUA,EAAID,WAAaC,EAAM,CAAE,QAAWA,GAFrFE,EAAS,EAAQ,MAMrB,SAASC,EAAgBC,EAAGC,GAA+G,OAA1GF,EAAkBG,OAAOC,gBAAkB,SAAyBH,EAAGC,GAAsB,OAAjBD,EAAEI,UAAYH,EAAUD,CAAG,EAAUD,EAAgBC,EAAGC,EAAI,CAEzK,IAAIgQ,EAAsB,SAAU29B,GAJpC,IAAwBrtC,EAAUC,EAOhC,SAASyP,EAAOxP,GACd,IAAIC,EAIJ,OAFAA,EAAQktC,EAAMjtC,KAAKC,KAAMH,IAASG,MAC5BC,KAAOf,EAAO2nE,OACb/mE,CACT,CAEA,OAfgCF,EAKTotC,GALDrtC,EAKP0P,GALwClP,UAAYb,OAAOc,OAAOR,EAAWO,WAAYR,EAASQ,UAAUE,YAAcV,EAAUR,EAAgBQ,EAAUC,GAetKyP,CACT,CAZ0B,CAYxB28B,EAAe,SAEjBntC,EAAiB,QAAIwQ,EACrBzQ,EAAOC,QAAUA,EAAQyB,O,2BC5BzB,IAAIuxC,EAAc,EAAQ,MACtB8E,EAAgB,EAAQ,MAExBqwD,EAAgBp+F,KAAKzI,UACrB8mG,EAAe,eACfC,EAAY,WACZC,EAAqBt1D,EAAYm1D,EAAcE,IAC/CE,EAAgBv1D,EAAYm1D,EAAcK,SAI1Ch4F,OAAO,IAAIzG,KAAKo8C,QAAUiiD,GAC5BtwD,EAAcqwD,EAAeE,EAAW,WACtC,IAAI/lG,EAAQimG,EAAcpnG,MAE1B,OAAOmB,GAAUA,EAAQgmG,EAAmBnnG,MAAQinG,CACtD,E,cClBF,UA8BGl2F,OAnBC,EAAQ,CACJ,QACA,SACD,EAgBI,SAAkBm/D,EAAYo3B,GACzC,aAKE,IAAIC,EAAcr3B,EAAW9vE,OAAO,WAEhCuE,EAAQ4iG,EAAYpnG,UAEpBqnG,EAAkB,CACpBvlB,mBAAmB,EACnB9D,QAAQ,EACR7N,iBAAiB,GAInB,IAAM,IAAI1zC,KAAU0qE,EAAQnnG,UAEpBqnG,EAAiB5qE,KACrBj4B,EAAOi4B,GAAW0qE,EAAQnnG,UAAWy8B,IAIzC,IAAI6qE,EAAiB9iG,EAAM8iG,eAC3B9iG,EAAM8iG,eAAiB,WAErBznG,KAAKqmC,MAAQrmC,KAAK2wE,QAAQ+2B,cAC1BD,EAAe1nG,KAAMC,KACvB,EAGA,IAAIk+E,EAAav5E,EAAMu5E,WASvB,OARAv5E,EAAMu5E,WAAa,SAAU3oE,GAC3B,MAAe,YAAVA,OACgC3R,IAA5B5D,KAAKqV,QAAQsyF,WAClB3nG,KAAKqV,QAAQsyF,WAAa3nG,KAAKqV,QAAQoG,SAEpCyiE,EAAWxvE,MAAO1O,KAAK2wE,QAAS3vE,UACzC,EAEOumG,CAET,OA1Da,mC,2BCbb,EAAQ,KACR,EAAQ,MACR,EAAQ,MACR,EAAQ,MACR,EAAQ,MACR,EAAQ,I,2BCNR,IAAIxnG,EAAO,EAAQ,MACf+lE,EAAgC,EAAQ,MACxCtlE,EAAW,EAAQ,MACnB0I,EAAW,EAAQ,IACnBs2C,EAAyB,EAAQ,MACjCooD,EAAY,EAAQ,MACpB3kG,EAAW,EAAQ,KACnBojD,EAAY,EAAQ,MACpB4f,EAAa,EAAQ,MAGzBH,EAA8B,SAAU,SAAU+hC,EAAQC,EAAc3hC,GACtE,MAAO,CAGL,SAAgB3R,GACd,IAAIx5C,EAAIwkC,EAAuBx/C,MAC3B+nG,EAAW7+F,EAASsrD,GAAUnO,EAAUmO,EAAQqzC,QAAUjkG,EAC9D,OAAOmkG,EAAWhoG,EAAKgoG,EAAUvzC,EAAQx5C,GAAK,IAAI3Y,OAAOmyD,GAAQqzC,GAAQ5kG,EAAS+X,GACpF,EAGA,SAAUlN,GACR,IAAIu4D,EAAK7lE,EAASR,MACd0a,EAAIzX,EAAS6K,GACbw4D,EAAMH,EAAgB2hC,EAAczhC,EAAI3rD,GAE5C,GAAI4rD,EAAIrsC,KAAM,OAAOqsC,EAAInlE,MAEzB,IAAI6mG,EAAoB3hC,EAAGG,UACtBohC,EAAUI,EAAmB,KAAI3hC,EAAGG,UAAY,GACrD,IAAIr9D,EAAS88D,EAAWI,EAAI3rD,GAE5B,OADKktF,EAAUvhC,EAAGG,UAAWwhC,KAAoB3hC,EAAGG,UAAYwhC,GAC9C,OAAX7+F,GAAmB,EAAIA,EAAOG,KACvC,EAEJ,E,2BCpCA,IAAImtC,EAAa,EAAQ,MACrBzE,EAAc,EAAQ,MAGtB3F,EAA2B/sC,OAAO+sC,yBAGtCztC,EAAOC,QAAU,SAAUyC,GACzB,IAAK0wC,EAAa,OAAOyE,EAAWn1C,GACpC,IAAIwrC,EAAaT,EAAyBoK,EAAYn1C,GACtD,OAAOwrC,GAAcA,EAAW3rC,KAClC,C,2BCXA,IAAI0wC,EAAc,EAAQ,MAEtBr/B,EAAK,EACLy1F,EAAUx/F,KAAKuuF,SACf/zF,EAAW4uC,EAAY,IAAI5uC,UAE/BrE,EAAOC,QAAU,SAAUoL,GACzB,MAAO,gBAAqBrG,IAARqG,EAAoB,GAAKA,GAAO,KAAOhH,IAAWuP,EAAKy1F,EAAS,GACtF,C,2BCRA,IAAI5jG,EAAI,EAAQ,MACZ2P,EAAO,EAAQ,MAUnB3P,EAAE,CAAEjD,OAAQ,QAASwwC,MAAM,EAAMhtC,QATC,EAAQ,KAEfy7C,CAA4B,SAAUz0C,GAE/DlH,MAAMsP,KAAKpI,EACb,IAIgE,CAC9DoI,KAAMA,G,2BCZR,IAAIxT,EAAW,EAAQ,MACnB0I,EAAW,EAAQ,IACnBivC,EAAuB,EAAQ,MAEnCv5C,EAAOC,QAAU,SAAUic,EAAGN,GAE5B,GADAha,EAASsa,GACL5R,EAASsR,IAAMA,EAAEna,cAAgBya,EAAG,OAAON,EAC/C,IAAI0tF,EAAoB/vD,EAAqBjjC,EAAE4F,GAG/C,OADAqwB,EADc+8D,EAAkB/8D,SACxB3wB,GACD0tF,EAAkBhvD,OAC3B,C,2BCXA,IAAIivD,EAAO,EAAQ,MACfC,EAAa,EAAQ,MACrB11B,EAAQ,EAAQ,MAChB3oE,EAAO,EAAQ,MACfs+F,EAAe,EAAQ,MACvBC,EAAa,EAAQ,MACrBC,EAAgB,EAAQ,KAExB/9F,EAAM49F,EAAW59F,IACjBmQ,EAASytF,EAAWztF,OAIxB/b,EAAOC,QAAU,SAAoB+P,GACnC,IAAIoM,EAAImtF,EAAKnoG,MACTwoG,EAAWH,EAAaz5F,GACxBzF,EAASupE,EAAM13D,GAOnB,OANIjR,EAAKiR,IAAMwtF,EAASz+F,KAAMu+F,EAAWttF,EAAG,SAAUvU,GAChD+hG,EAASvyF,SAASxP,IAAIkU,EAAOxR,EAAQ1C,EAC3C,GACK8hG,EAAcC,EAASn1B,cAAe,SAAU5sE,GAC/C+D,EAAIrB,EAAQ1C,IAAIkU,EAAOxR,EAAQ1C,EACrC,GACO0C,CACT,C,2BCvBAtK,EAAQE,YAAa,EACrBF,EAAiB,aAAS,EAE1B,IAIgCG,EAJ5BgtC,GAI4BhtC,EAJG,EAAQ,QAIUA,EAAID,WAAaC,EAAM,CAAE,QAAWA,GAFrFE,EAAS,EAAQ,MAMrB,SAASC,EAAgBC,EAAGC,GAA+G,OAA1GF,EAAkBG,OAAOC,gBAAkB,SAAyBH,EAAGC,GAAsB,OAAjBD,EAAEI,UAAYH,EAAUD,CAAG,EAAUD,EAAgBC,EAAGC,EAAI,CAEzK,IAAI8wC,EAAkB,SAAUnD,GAJhC,IAAwBrtC,EAAUC,EAOhC,SAASuwC,EAAGtwC,GACV,IAAIC,EAIJ,OAFAA,EAAQktC,EAAMjtC,KAAKC,KAAMH,IAASG,MAC5BC,KAAOf,EAAOixC,GACbrwC,CACT,CAQA,OArBgCF,EAKbotC,GALGrtC,EAKPwwC,GALwChwC,UAAYb,OAAOc,OAAOR,EAAWO,WAAYR,EAASQ,UAAUE,YAAcV,EAAUR,EAAgBQ,EAAUC,GAehKuwC,EAAGhwC,UAETizC,cAAgB,WACrB,MAAO,IAAMpG,EAAM7sC,UAAUizC,cAAcrzC,KAAKC,KAClD,EAEOmwC,CACT,CAlBsB,CAkBpBnE,EAAe,SAEjBntC,EAAiB,QAAIsxC,EACrBvxC,EAAOC,QAAUA,EAAQyB,O,2BCnCzB,IAAI+D,EAAI,EAAQ,MACZwtC,EAAc,EAAQ,MACtBugB,EAAa,EAAQ,KACrBlpD,EAAW,EAAQ,IACnB6oC,EAAS,EAAQ,MACjB7wC,EAAiB,UACjBunG,EAA4B,EAAQ,MACpCC,EAAoC,EAAQ,KAC5C9zB,EAAe,EAAQ,MACvBrvE,EAAM,EAAQ,MACdojG,EAAW,EAAQ,MAEnBC,GAAW,EACXC,EAAWtjG,EAAI,QACfiN,EAAK,EAELs2F,EAAc,SAAUhqG,GAC1BoC,EAAepC,EAAI+pG,EAAU,CAAE1nG,MAAO,CACpC4nG,SAAU,IAAMv2F,IAChBw2F,SAAU,CAAC,IAEf,EA6DIC,EAAOrqG,EAAOC,QAAU,CAC1B4f,OA5BW,WACXwqF,EAAKxqF,OAAS,WAA0B,EACxCmqF,GAAW,EACX,IAAIxzF,EAAsBqzF,EAA0BvzF,EAChDhN,EAAS2pC,EAAY,GAAG3pC,QACxB/D,EAAO,CAAC,EAEZA,EAAK0kG,GAAY,EAGbzzF,EAAoBjR,GAAMlD,SAC5BwnG,EAA0BvzF,EAAI,SAAUpW,GAEtC,IADA,IAAIqK,EAASiM,EAAoBtW,GACxBgS,EAAI,EAAG7P,EAASkI,EAAOlI,OAAQ6P,EAAI7P,EAAQ6P,IAClD,GAAI3H,EAAO2H,KAAO+3F,EAAU,CAC1B3gG,EAAOiB,EAAQ2H,EAAG,GAClB,KACF,CACA,OAAO3H,CACX,EAEA9E,EAAE,CAAEjD,OAAQ,SAAUwwC,MAAM,EAAMhtC,QAAQ,GAAQ,CAChDwQ,oBAAqBszF,EAAkCxzF,IAG7D,EAIEg0F,QA7DY,SAAUpqG,EAAIsB,GAE1B,IAAK8I,EAASpK,GAAK,MAAoB,iBAANA,EAAiBA,GAAmB,iBAANA,EAAiB,IAAM,KAAOA,EAC7F,IAAKizC,EAAOjzC,EAAI+pG,GAAW,CAEzB,IAAKj0B,EAAa91E,GAAK,MAAO,IAE9B,IAAKsB,EAAQ,MAAO,IAEpB0oG,EAAYhqG,EAEd,CAAE,OAAOA,EAAG+pG,GAAUE,QACxB,EAkDEI,YAhDgB,SAAUrqG,EAAIsB,GAC9B,IAAK2xC,EAAOjzC,EAAI+pG,GAAW,CAEzB,IAAKj0B,EAAa91E,GAAK,OAAO,EAE9B,IAAKsB,EAAQ,OAAO,EAEpB0oG,EAAYhqG,EAEd,CAAE,OAAOA,EAAG+pG,GAAUG,QACxB,EAuCEI,SApCa,SAAUtqG,GAEvB,OADI6pG,GAAYC,GAAYh0B,EAAa91E,KAAQizC,EAAOjzC,EAAI+pG,IAAWC,EAAYhqG,GAC5EA,CACT,GAoCAszD,EAAWy2C,IAAY,C,uBCtFvBjqG,EAAOC,QAAUS,OAAO+pG,IAAM,SAAY7uF,EAAGtC,GAE3C,OAAOsC,IAAMtC,EAAU,IAANsC,GAAW,EAAIA,GAAM,EAAItC,EAAIsC,GAAMA,GAAKtC,GAAMA,CACjE,C,2BCNA,IAAIu+B,EAAa,EAAQ,MACrBqlD,EAAe,EAAQ,MACvBC,EAAwB,EAAQ,MAChCjqF,EAAU,EAAQ,KAClBw+C,EAA8B,EAAQ,MAEtC4rC,EAAkB,SAAUC,GAE9B,GAAIA,GAAuBA,EAAoBrqF,UAAYA,EAAS,IAClEw+C,EAA4B6rC,EAAqB,UAAWrqF,EAC9D,CAAE,MAAOkpB,GACPmhE,EAAoBrqF,QAAUA,CAChC,CACF,EAEA,IAAK,IAAIsqF,KAAmBN,EACtBA,EAAaM,IACfF,EAAgBzlD,EAAW2lD,IAAoB3lD,EAAW2lD,GAAiBj8F,WAI/E+7F,EAAgBH,E,2BCrBhB,IAAIuN,EAAsB,EAAQ,MAE9B/2D,EAAUljC,OACV1O,EAAaC,UAEjBhC,EAAOC,QAAU,SAAUgC,GACzB,GAAIyoG,EAAoBzoG,GAAW,OAAOA,EAC1C,MAAM,IAAIF,EAAW,aAAe4xC,EAAQ1xC,GAAY,kBAC1D,C,2BCRA,IAAIgxC,EAAc,EAAQ,MACtBC,EAAQ,EAAQ,MAChBnzC,EAAa,EAAQ,MACrB+0C,EAAU,EAAQ,MAClBrC,EAAa,EAAQ,MACrBa,EAAgB,EAAQ,MAExBurC,EAAO,WAA0B,EACjC38B,EAAYzP,EAAW,UAAW,aAClCk4D,EAAoB,2BACpBpiG,EAAO0qC,EAAY03D,EAAkBpiG,MACrCqiG,GAAuBD,EAAkBplG,KAAKs5E,GAE9CgsB,EAAsB,SAAuB5oG,GAC/C,IAAKlC,EAAWkC,GAAW,OAAO,EAClC,IAEE,OADAigD,EAAU28B,EAAM,GAAI58E,IACb,CACT,CAAE,MAAOm6B,GACP,OAAO,CACT,CACF,EAEI0uE,EAAsB,SAAuB7oG,GAC/C,IAAKlC,EAAWkC,GAAW,OAAO,EAClC,OAAQ6yC,EAAQ7yC,IACd,IAAK,gBACL,IAAK,oBACL,IAAK,yBAA0B,OAAO,EAExC,IAIE,OAAO2oG,KAAyBriG,EAAKoiG,EAAmBr3D,EAAcrxC,GACxE,CAAE,MAAOm6B,GACP,OAAO,CACT,CACF,EAEA0uE,EAAoBzjD,MAAO,EAI3BrnD,EAAOC,SAAWiiD,GAAahP,EAAM,WACnC,IAAI63D,EACJ,OAAOF,EAAoBA,EAAoB1pG,QACzC0pG,EAAoBnqG,UACpBmqG,EAAoB,WAAcE,GAAS,CAAM,IAClDA,CACP,GAAKD,EAAsBD,C,2BClD3B,IAAI33D,EAAQ,EAAQ,MAIhB83D,EAHa,EAAQ,MAGAvnG,OAEzBzD,EAAOC,QAAUizC,EAAM,WACrB,IAAIhK,EAAK8hE,EAAQ,IAAK,KACtB,QAAS9hE,EAAG+hE,QAAU/hE,EAAG3jC,KAAK,OAAsB,MAAb2jC,EAAG4iB,MAC5C,E,2BCTA,IAAIlqD,EAAW,EAAQ,MACnBy0E,EAAsB,EAAQ,MAE9Bt0E,EAAaC,UAIjBhC,EAAOC,QAAU,SAAUirG,GAEzB,GADAtpG,EAASR,MACI,WAAT8pG,GAA8B,YAATA,EAAoBA,EAAO,cAC/C,GAAa,WAATA,EAAmB,MAAM,IAAInpG,EAAW,kBACjD,OAAOs0E,EAAoBj1E,KAAM8pG,EACnC,C,2BCZA,IAAI3B,EAAO,EAAQ,MACfC,EAAa,EAAQ,MACrB11B,EAAQ,EAAQ,MAChB21B,EAAe,EAAQ,MACvBE,EAAgB,EAAQ,KAExB1tF,EAAMutF,EAAWvtF,IACjBrQ,EAAM49F,EAAW59F,IACjBmQ,EAASytF,EAAWztF,OAIxB/b,EAAOC,QAAU,SAA6B+P,GAC5C,IAAIoM,EAAImtF,EAAKnoG,MACT+pG,EAAW1B,EAAaz5F,GAAOykE,cAC/BlqE,EAASupE,EAAM13D,GAKnB,OAJAutF,EAAcwB,EAAU,SAAUtjG,GAC5B+D,EAAIwQ,EAAGvU,GAAIkU,EAAOxR,EAAQ1C,GACzBoU,EAAI1R,EAAQ1C,EACnB,GACO0C,CACT,C,2BCpBAtK,EAAQE,YAAa,EACrBF,EAAiB,aAAS,EAE1B,IAIgCG,EAJ5BgtC,GAI4BhtC,EAJG,EAAQ,QAIUA,EAAID,WAAaC,EAAM,CAAE,QAAWA,GAFrFE,EAAS,EAAQ,MAMrB,SAASC,EAAgBC,EAAGC,GAA+G,OAA1GF,EAAkBG,OAAOC,gBAAkB,SAAyBH,EAAGC,GAAsB,OAAjBD,EAAEI,UAAYH,EAAUD,CAAG,EAAUD,EAAgBC,EAAGC,EAAI,CAEzK,IAAI2qG,EAAuB,SAAUh9D,GAJrC,IAAwBrtC,EAAUC,EAOhC,SAASoqG,EAAQnqG,GACf,IAAIC,EAKJ,OAHAA,EAAQktC,EAAMjtC,KAAKC,KAAMH,IAASG,MAC5BC,KAAOf,EAAOoxC,QACpBxwC,EAAMqB,MAAQ,IACPrB,CACT,CAEA,OAhBgCF,EAKRotC,GALFrtC,EAKPqqG,GALwC7pG,UAAYb,OAAOc,OAAOR,EAAWO,WAAYR,EAASQ,UAAUE,YAAcV,EAAUR,EAAgBQ,EAAUC,GAgBtKoqG,CACT,CAb2B,CAazBh+D,EAAe,SAEjBntC,EAAiB,QAAImrG,EACrBprG,EAAOC,QAAUA,EAAQyB,O,2BC9BzB,IAAIuxC,EAAc,EAAQ,MACtBlzC,EAAa,EAAQ,MACrB2zD,EAAQ,EAAQ,MAEhB+Y,EAAmBx5B,EAAY/rC,SAAS7C,UAGvCtE,EAAW2zD,EAAMpgB,iBACpBogB,EAAMpgB,cAAgB,SAAUpzC,GAC9B,OAAOusE,EAAiBvsE,EAC1B,GAGFF,EAAOC,QAAUyzD,EAAMpgB,a,yBCZvBrzC,EAAQqW,EAAI5V,OAAOy/B,qB,2BCDnB,IAAI+S,EAAQ,EAAQ,MAGpBlzC,EAAOC,SAAWizC,EAAM,WAEtB,OAA+E,IAAxExyC,OAAO4B,eAAe,CAAC,EAAG,EAAG,CAAEM,IAAK,WAAc,OAAO,CAAG,IAAK,EAC1E,E,cCPA,UA6BGuP,OApBC,EAAQ,CACJ,QACA,SACD,EAiBI,SAAkBwkD,EAASqoB,GACpC,aAGA,SAAS1N,EAAYS,GACnB3wE,KAAK2wE,QAAUA,EAEVA,IACH3wE,KAAKqV,QAAUs7D,EAAQt7D,QAASrV,KAAKspD,WACrCtpD,KAAKgT,QAAU29D,EAAQ39D,QACvBhT,KAAKqmC,MAAQsqC,EAAQ+2B,cACrB1nG,KAAK+J,KAAO4mE,EAAQ5mE,KAExB,CAEA,IAAIpF,EAAQurE,EAAW/vE,UA8GvB,MAxGoB,CAClB,eACA,yBACA,eACA,oBACA,oBACA,oBACA,cAGY2R,QAAS,SAAU82C,GAC/BjkD,EAAOikD,GAAe,WACpB,OAAOg1B,EAASz9E,UAAWyoD,GAAal6C,MAAO1O,KAAK2wE,QAAS3vE,UAC/D,CACF,GAKA2D,EAAMslG,0BAA4B,WAEhC,IAAIlgG,EAAOwrD,EAASv1D,KAAK2wE,QAAQ39D,SAIjC,OADehT,KAAK2wE,QAAQ5mE,MAAQA,GACjBA,EAAK2T,aAAe1d,KAAK2wE,QAAQ5mE,KAAK2T,WAC3D,EAIA/Y,EAAM2rE,gBAAkB,WACtBtwE,KAAK2wE,QAAQL,gBAAgB5hE,MAAO1O,KAAMgB,UAC5C,EAEA2D,EAAMulG,eAAiB,WACrBlqG,KAAKmqG,eAAgB,SAAU,QACjC,EAEAxlG,EAAMylG,aAAe,WACnBpqG,KAAKmqG,eAAgB,MAAO,SAC9B,EAOAxlG,EAAMwlG,eAAiB,SAAUE,EAAStgG,GACxC,IAAIugG,EAAcD,EAAUtgG,EACxBwgG,EAAY,QAAUxgG,EAI1B,GAFA/J,KAAKswE,gBAAiBg6B,EAAaC,IAE9BvqG,KAAMsqG,GAAX,CAIA,IAAIE,EAAgBxqG,KAAKyqG,mBACzBzqG,KAAMsqG,GAAgBE,GAAiBA,EAAeD,IAEpDvqG,KAAK2wE,QAAQ5mE,KAAM,QAAUA,EAL/B,CAMF,EAEApF,EAAM8lG,iBAAmB,WACvB,IAAIC,EAAY1qG,KAAK2wE,QAAQ+2B,cAAc,GAC3C,OAAOgD,GAAaA,EAAU13F,SAAWuiD,EAASm1C,EAAU13F,QAC9D,EAIArO,EAAMw5E,OAAS,WACbn+E,KAAK2wE,QAAQwN,OAAOzvE,MAAO1O,KAAK2wE,QAAS3vE,UAC3C,EAEA2D,EAAM4wD,QAAU,WACdv1D,KAAK2wE,QAAQpb,UACbv1D,KAAK+J,KAAO/J,KAAK2wE,QAAQ5mE,IAC3B,EAIAmmE,EAAWy6B,MAAQ,CAAC,EAEpBz6B,EAAW9vE,OAAS,SAAUkpD,EAAWj0C,GAEvC,SAASu1F,IACP16B,EAAWxhE,MAAO1O,KAAMgB,UAC1B,CAcA,OAZA4pG,EAAKzqG,UAAYb,OAAOc,OAAQuE,GAChCimG,EAAKzqG,UAAUE,YAAcuqG,EAGxBv1F,IACHu1F,EAAKv1F,QAAUA,GAGjBu1F,EAAKzqG,UAAUmpD,UAAYA,EAE3B4mB,EAAWy6B,MAAOrhD,GAAcshD,EAEzBA,CACT,EAEO16B,CAET,OA/Ia,mC,2BCXb,EAAQ,K,2BCDR,IAAI3vE,EAAY,EAAQ,MACpBC,EAAW,EAAQ,MACnBT,EAAO,EAAQ,MACf2tE,EAAsB,EAAQ,MAC9Bm9B,EAAoB,EAAQ,MAE5BC,EAAe,eACfn9B,EAAcC,WACdjtE,EAAaC,UACb8H,EAAMD,KAAKC,IAEXqiG,EAAY,SAAUthG,EAAKuhG,GAC7BhrG,KAAKyJ,IAAMA,EACXzJ,KAAK+J,KAAOrB,EAAIsiG,EAAS,GACzBhrG,KAAKwK,IAAMjK,EAAUkJ,EAAIe,KACzBxK,KAAKoH,KAAO7G,EAAUkJ,EAAIrC,KAC5B,EAEA2jG,EAAU5qG,UAAY,CACpBkzE,YAAa,WACX,OAAOw3B,EAAkBrqG,EAAST,EAAKC,KAAKoH,KAAMpH,KAAKyJ,MACzD,EACAwM,SAAU,SAAUnX,GAClB,OAAOiB,EAAKC,KAAKwK,IAAKxK,KAAKyJ,IAAK3K,EAClC,GAKFF,EAAOC,QAAU,SAAUG,GACzBwB,EAASxB,GACT,IAAIisG,GAAWjsG,EAAI+K,KAGnB,GAAIkhG,GAAYA,EAAS,MAAM,IAAItqG,EAAWmqG,GAC9C,IAAIE,EAAUt9B,EAAoBu9B,GAClC,GAAID,EAAU,EAAG,MAAM,IAAIr9B,EAAYm9B,GACvC,OAAO,IAAIC,EAAU/rG,EAAKgsG,EAC5B,C,2BCtCA,IAAIr3D,EAAkB,EAAQ,MAC1BpvC,EAAmB,EAAQ,MAC3BgiD,EAAY,EAAQ,MACpBpU,EAAsB,EAAQ,MAC9BjxC,EAAiB,UACjBgqG,EAAiB,EAAQ,MACzBC,EAAyB,EAAQ,MACjC75D,EAAU,EAAQ,MAClBU,EAAc,EAAQ,MAEtBo5D,EAAiB,iBACjBrzD,EAAmB5F,EAAoB1oC,IACvC6oC,EAAmBH,EAAoB2F,UAAUszD,GAYrDxsG,EAAOC,QAAUqsG,EAAexmG,MAAO,QAAS,SAAU2mG,EAAUza,GAClE74C,EAAiB/3C,KAAM,CACrBC,KAAMmrG,EACNhqG,OAAQuyC,EAAgB03D,GACxB/hG,MAAO,EACPsnF,KAAMA,GAIV,EAAG,WACD,IAAIhyE,EAAQ0zB,EAAiBtyC,MACzBoB,EAASwd,EAAMxd,OACfkI,EAAQsV,EAAMtV,QAClB,IAAKlI,GAAUkI,GAASlI,EAAOH,OAE7B,OADA2d,EAAMxd,OAAS,KACR+pG,OAAuBvnG,GAAW,GAE3C,OAAQgb,EAAMgyE,MACZ,IAAK,OAAQ,OAAOua,EAAuB7hG,GAAO,GAClD,IAAK,SAAU,OAAO6hG,EAAuB/pG,EAAOkI,IAAQ,GAC5D,OAAO6hG,EAAuB,CAAC7hG,EAAOlI,EAAOkI,KAAS,EAC1D,EAAG,UAKH,IAAI8d,EAASm/B,EAAU+kD,UAAY/kD,EAAU7hD,MAQ7C,GALAH,EAAiB,QACjBA,EAAiB,UACjBA,EAAiB,YAGZ+sC,GAAWU,GAA+B,WAAhB5qB,EAAO9lB,KAAmB,IACvDJ,EAAekmB,EAAQ,OAAQ,CAAEjmB,MAAO,UAC1C,CAAE,MAAO65B,GAAqB,C,2BC5D9B,IAAI6W,EAAc,EAAQ,MACtB2N,EAAyB,EAAQ,MACjCv8C,EAAW,EAAQ,KACnB6gD,EAAc,EAAQ,MAEtB3gD,EAAU0uC,EAAY,GAAG1uC,SACzBooG,EAAQlpG,OAAO,KAAOyhD,EAAc,MACpC0nD,EAAQnpG,OAAO,QAAUyhD,EAAc,MAAQA,EAAc,OAG7DnE,EAAe,SAAU8S,GAC3B,OAAO,SAAU5S,GACf,IAAI/xC,EAAS7K,EAASu8C,EAAuBK,IAG7C,OAFW,EAAP4S,IAAU3kD,EAAS3K,EAAQ2K,EAAQy9F,EAAO,KACnC,EAAP94C,IAAU3kD,EAAS3K,EAAQ2K,EAAQ09F,EAAO,OACvC19F,CACT,CACF,EAEAlP,EAAOC,QAAU,CAGf+Q,MAAO+vC,EAAa,GAGpB5sC,IAAK4sC,EAAa,GAGlBh9C,KAAMg9C,EAAa,G,2BC5BrB,IAAIwoD,EAAO,EAAQ,MACfp+F,EAAO,EAAQ,MACf0hG,EAAU,EAAQ,MAClBpD,EAAe,EAAQ,MAI3BzpG,EAAOC,QAAU,SAAoB+P,GACnC,IAAIoM,EAAImtF,EAAKnoG,MACTwoG,EAAWH,EAAaz5F,GAC5B,QAAI7E,EAAKiR,GAAKwtF,EAASz+F,QAGV,IAFN0hG,EAAQzwF,EAAG,SAAUvU,GAC1B,IAAK+hG,EAASvyF,SAASxP,GAAI,OAAO,CACpC,GAAG,EACL,C,2BCdA,IAAIpC,EAAI,EAAQ,MACZytC,EAAQ,EAAQ,MAChB6B,EAAkB,EAAQ,MAC1B+3D,EAAiC,UACjC15D,EAAc,EAAQ,MAM1B3tC,EAAE,CAAEjD,OAAQ,SAAUwwC,MAAM,EAAMhtC,QAJpBotC,GAAeF,EAAM,WAAc45D,EAA+B,EAAI,GAIlCzlD,MAAOjU,GAAe,CACtE3F,yBAA0B,SAAkCvtC,EAAImL,GAC9D,OAAOyhG,EAA+B/3D,EAAgB70C,GAAKmL,EAC7D,G,2BCbF,IAAI5F,EAAI,EAAQ,MACZsnG,EAAiB,EAAQ,MAS7BtnG,EAAE,CAAEjD,OAAQ,MAAOuD,OAAO,EAAMs8D,MAAM,EAAMr8D,QARf,EAAQ,KAEpBs8D,CAAuB,iBAAkB,SAAU/3D,GAClE,OAAQA,CACV,IAIiE,CAC/DwiG,eAAgBA,G,2BCXlB,IAAIl1D,EAAa,EAAQ,MACrB3E,EAAQ,EAAQ,MAChBD,EAAc,EAAQ,MACtB5uC,EAAW,EAAQ,KACnBN,EAAO,aACPmhD,EAAc,EAAQ,MAEtB74B,EAAS4mB,EAAY,GAAG5mB,QACxB2gF,EAAcn1D,EAAWnmC,WACzB5I,EAAS+uC,EAAW/uC,OACpB8+C,EAAW9+C,GAAUA,EAAOomC,SAC5BkY,EAAS,EAAI4lD,EAAY9nD,EAAc,QAAU,KAE/C0C,IAAa1U,EAAM,WAAc85D,EAAYtsG,OAAOknD,GAAY,GAItE5nD,EAAOC,QAAUmnD,EAAS,SAAoBl4C,GAC5C,IAAI+9F,EAAgBlpG,EAAKM,EAAS6K,IAC9B3E,EAASyiG,EAAYC,GACzB,OAAkB,IAAX1iG,GAA6C,MAA7B8hB,EAAO4gF,EAAe,IAAc,EAAI1iG,CACjE,EAAIyiG,C,2BCrBJ,IAAIvnG,EAAI,EAAQ,MACZonG,EAAU,EAAQ,MAClB74C,EAAiB,EAAQ,MAI7BvuD,EAAE,CAAEjD,OAAQ,SAAUwwC,MAAM,GAAQ,CAClC6S,YAAa,SAAqB74C,GAChC,IAAI5M,EAAM,CAAC,EAIX,OAHAysG,EAAQ7/F,EAAU,SAAUyP,EAAGrY,GAC7B4vD,EAAe5zD,EAAKqc,EAAGrY,EACzB,EAAG,CAAE4wE,YAAY,IACV50E,CACT,G,2BCbF,IAAIkK,EAAW,EAAQ,IAEvBtK,EAAOC,QAAU,SAAUgC,GACzB,OAAOqI,EAASrI,IAA0B,OAAbA,CAC/B,C,2BCJA,IAAI2vD,EAAoB,0BACpBpwD,EAAS,EAAQ,MACjB0rG,EAA2B,EAAQ,MACnCl1D,EAAiB,EAAQ,KACzB2P,EAAY,EAAQ,MAEpBsK,EAAa,WAAc,OAAO7wD,IAAM,EAE5CpB,EAAOC,QAAU,SAAUkyD,EAAqB1R,EAAMz0B,EAAMmhF,GAC1D,IAAIpoD,EAAgBtE,EAAO,YAI3B,OAHA0R,EAAoB5wD,UAAYC,EAAOowD,EAAmB,CAAE5lC,KAAMkhF,IAA2BC,EAAiBnhF,KAC9GgsB,EAAema,EAAqBpN,GAAe,GAAO,GAC1D4C,EAAU5C,GAAiBkN,EACpBE,CACT,C,2BCdA,IAAIlf,EAAc,EAAQ,MACtBm6D,EAAiB,EAAQ,MACzB7C,EAAc,oBACdryD,EAAa,EAAQ,KACrBt2C,EAAW,EAAQ,MACnB8lD,EAAoB,EAAQ,MAC5Bp9C,EAAW,EAAQ,IACnBuiG,EAAU,EAAQ,MAClBQ,EAAuB,EAAQ,MAC/Bl6D,EAAS,EAAQ,MACjBI,EAAsB,EAAQ,MAE9B4F,EAAmB5F,EAAoB1oC,IACvCyiG,EAAyB/5D,EAAoB2F,UAC7CjzC,EAAOonG,EAAqBpnG,KAC5BqP,EAAY+3F,EAAqB/3F,UACjChM,EAAS2pC,EAAY,GAAG3pC,QACxBsK,EAAK,EAGL25F,EAAsB,SAAUvtF,GAClC,OAAOA,EAAMwtF,SAAWxtF,EAAMwtF,OAAS,IAAIC,EAC7C,EAEIA,EAAsB,WACxBrsG,KAAKqJ,QAAU,EACjB,EAEIijG,EAAqB,SAAUh6C,EAAOroD,GACxC,OAAOpF,EAAKytD,EAAMjpD,QAAS,SAAUvK,GACnC,OAAOA,EAAG,KAAOmL,CACnB,EACF,EAEAoiG,EAAoBlsG,UAAY,CAC9BqB,IAAK,SAAUyI,GACb,IAAIT,EAAQ8iG,EAAmBtsG,KAAMiK,GACrC,GAAIT,EAAO,OAAOA,EAAM,EAC1B,EACAgB,IAAK,SAAUP,GACb,QAASqiG,EAAmBtsG,KAAMiK,EACpC,EACAR,IAAK,SAAUQ,EAAK9I,GAClB,IAAIqI,EAAQ8iG,EAAmBtsG,KAAMiK,GACjCT,EAAOA,EAAM,GAAKrI,EACjBnB,KAAKqJ,QAAQqB,KAAK,CAACT,EAAK9I,GAC/B,EACA,OAAU,SAAU8I,GAClB,IAAIX,EAAQ4K,EAAUlU,KAAKqJ,QAAS,SAAUvK,GAC5C,OAAOA,EAAG,KAAOmL,CACnB,GAEA,OADKX,GAAOpB,EAAOlI,KAAKqJ,QAASC,EAAO,MAC9BA,CACZ,GAGF1K,EAAOC,QAAU,CACf0tG,eAAgB,SAAUvyD,EAASwyD,EAAkBC,EAAQC,GAC3D,IAAIx/D,EAAc8M,EAAQ,SAAUI,EAAMxuC,GACxCkrC,EAAWsD,EAAMsG,GACjB3I,EAAiBqC,EAAM,CACrBn6C,KAAMusG,EACNh6F,GAAIA,IACJ45F,OAAQ,OAEL9lD,EAAkB16C,IAAW6/F,EAAQ7/F,EAAUwuC,EAAKsyD,GAAQ,CAAEtyD,KAAMA,EAAMw5B,WAAY64B,GAC7F,GAEI/rD,EAAYxT,EAAY/sC,UAExBmyC,EAAmB45D,EAAuBM,GAE1CG,EAAS,SAAUvyD,EAAMnwC,EAAK9I,GAChC,IAAIyd,EAAQ0zB,EAAiB8H,GACzBvwC,EAAOs/F,EAAY3oG,EAASyJ,IAAM,GAGtC,OAFa,IAATJ,EAAesiG,EAAoBvtF,GAAOnV,IAAIQ,EAAK9I,GAClD0I,EAAK+U,EAAMpM,IAAMrR,EACfi5C,CACT,EAiDA,OA/CA4xD,EAAetrD,EAAW,CAIxB,OAAU,SAAUz2C,GAClB,IAAI2U,EAAQ0zB,EAAiBtyC,MAC7B,IAAKkJ,EAASe,GAAM,OAAO,EAC3B,IAAIJ,EAAOs/F,EAAYl/F,GACvB,OAAa,IAATJ,EAAsBsiG,EAAoBvtF,GAAe,OAAE3U,GACxDJ,GAAQkoC,EAAOloC,EAAM+U,EAAMpM,YAAc3I,EAAK+U,EAAMpM,GAC7D,EAIAhI,IAAK,SAAaP,GAChB,IAAI2U,EAAQ0zB,EAAiBtyC,MAC7B,IAAKkJ,EAASe,GAAM,OAAO,EAC3B,IAAIJ,EAAOs/F,EAAYl/F,GACvB,OAAa,IAATJ,EAAsBsiG,EAAoBvtF,GAAOpU,IAAIP,GAClDJ,GAAQkoC,EAAOloC,EAAM+U,EAAMpM,GACpC,IAGFw5F,EAAetrD,EAAW+rD,EAAS,CAGjCjrG,IAAK,SAAayI,GAChB,IAAI2U,EAAQ0zB,EAAiBtyC,MAC7B,GAAIkJ,EAASe,GAAM,CACjB,IAAIJ,EAAOs/F,EAAYl/F,GACvB,IAAa,IAATJ,EAAe,OAAOsiG,EAAoBvtF,GAAOpd,IAAIyI,GACzD,GAAIJ,EAAM,OAAOA,EAAK+U,EAAMpM,GAC9B,CACF,EAGA/I,IAAK,SAAaQ,EAAK9I,GACrB,OAAOwrG,EAAO3sG,KAAMiK,EAAK9I,EAC3B,GACE,CAGF0Z,IAAK,SAAa1Z,GAChB,OAAOwrG,EAAO3sG,KAAMmB,GAAO,EAC7B,IAGK+rC,CACT,E,2BChIF,IAAIuJ,EAAa,EAAQ,MACrBvtC,EAAW,EAAQ,IAEnBkI,EAAWqlC,EAAWrlC,SAEtB8iC,EAAShrC,EAASkI,IAAalI,EAASkI,EAASM,eAErD9S,EAAOC,QAAU,SAAUC,GACzB,OAAOo1C,EAAS9iC,EAASM,cAAc5S,GAAM,CAAC,CAChD,C,0DC+xBA,SAAS8tG,EAAqBC,EAAUC,GAEvC,GAAKA,IAAa,MAGjB,OADApqF,QAAQC,KAAM,2FACPkqF,EAIR,GAAKC,IAAa,OAAuBA,IAAa,MAAwB,CAE7E,IAAIxjG,EAAQujG,EAASE,WAIrB,GAAe,OAAVzjG,EAAiB,CAErB,MAAMozE,EAAU,GAEVtjD,EAAWyzE,EAAS9nF,aAAc,YAExC,QAAkBnhB,IAAbw1B,EAcJ,OADA1W,QAAQsY,MAAO,2GACR6xE,EAZP,IAAM,IAAI/7F,EAAI,EAAGA,EAAIsoB,EAAS9qB,MAAOwC,IAEpC4rE,EAAQhyE,KAAMoG,GAIf+7F,EAASG,SAAUtwB,GACnBpzE,EAAQujG,EAASE,UASnB,CAIA,MAAME,EAAoB3jG,EAAMgF,MAAQ,EAClC4+F,EAAa,GAEnB,GAAKJ,IAAa,MAIjB,IAAM,IAAIh8F,EAAI,EAAGA,GAAKm8F,EAAmBn8F,IAExCo8F,EAAWxiG,KAAMpB,EAAM26D,KAAM,IAC7BipC,EAAWxiG,KAAMpB,EAAM26D,KAAMnzD,IAC7Bo8F,EAAWxiG,KAAMpB,EAAM26D,KAAMnzD,EAAI,SAQlC,IAAM,IAAIA,EAAI,EAAGA,EAAIm8F,EAAmBn8F,IAElCA,EAAI,GAAM,GAEdo8F,EAAWxiG,KAAMpB,EAAM26D,KAAMnzD,IAC7Bo8F,EAAWxiG,KAAMpB,EAAM26D,KAAMnzD,EAAI,IACjCo8F,EAAWxiG,KAAMpB,EAAM26D,KAAMnzD,EAAI,MAIjCo8F,EAAWxiG,KAAMpB,EAAM26D,KAAMnzD,EAAI,IACjCo8F,EAAWxiG,KAAMpB,EAAM26D,KAAMnzD,EAAI,IACjCo8F,EAAWxiG,KAAMpB,EAAM26D,KAAMnzD,KAQzBo8F,EAAWjsG,OAAS,IAAQgsG,GAElCvqF,QAAQsY,MAAO,oGAMhB,MAAMmyE,EAAcN,EAASn6B,QAI7B,OAHAy6B,EAAYH,SAAUE,GACtBC,EAAYC,cAELD,CAER,CAGC,OADAzqF,QAAQsY,MAAO,sEAAuE8xE,GAC/ED,CAIT,CCvxBA,MAAMQ,UAAmB,MAOxB,WAAAhtG,CAAaitG,GAEZl3F,MAAOk3F,GAEPttG,KAAKutG,YAAc,KACnBvtG,KAAKwtG,WAAa,KAClBxtG,KAAKytG,eAAiB,KAEtBztG,KAAK0tG,gBAAkB,GAEvB1tG,KAAKujE,SAAU,SAAWoqC,GAEzB,OAAO,IAAIC,EAAiCD,EAE7C,GAEA3tG,KAAKujE,SAAU,SAAWoqC,GAEzB,OAAO,IAAIE,EAAkCF,EAE9C,GAEA3tG,KAAKujE,SAAU,SAAWoqC,GAEzB,OAAO,IAAIG,EAA4BH,EAExC,GAEA3tG,KAAKujE,SAAU,SAAWoqC,GAEzB,OAAO,IAAII,EAA0BJ,EAEtC,GAEA3tG,KAAKujE,SAAU,SAAWoqC,GAEzB,OAAO,IAAIK,EAA0BL,EAEtC,GAEA3tG,KAAKujE,SAAU,SAAWoqC,GAEzB,OAAO,IAAIM,EAA6BN,EAEzC,GAEA3tG,KAAKujE,SAAU,SAAWoqC,GAEzB,OAAO,IAAIO,EAAoCP,EAEhD,GAEA3tG,KAAKujE,SAAU,SAAWoqC,GAEzB,OAAO,IAAIQ,EAA8BR,EAE1C,GAEA3tG,KAAKujE,SAAU,SAAWoqC,GAEzB,OAAO,IAAIS,EAA2BT,EAEvC,GAEA3tG,KAAKujE,SAAU,SAAWoqC,GAEzB,OAAO,IAAIU,EAAwCV,EAEpD,GAEA3tG,KAAKujE,SAAU,SAAWoqC,GAEzB,OAAO,IAAIW,EAAgCX,EAE5C,GAEA3tG,KAAKujE,SAAU,SAAWoqC,GAEzB,OAAO,IAAIY,EAAmCZ,EAE/C,GAEA3tG,KAAKujE,SAAU,SAAWoqC,GAEzB,OAAO,IAAIa,EAAkCb,EAE9C,GAEA3tG,KAAKujE,SAAU,SAAWoqC,GAEzB,OAAO,IAAIc,EAA4Bd,EAExC,GAEA3tG,KAAKujE,SAAU,SAAWoqC,GAEzB,OAAO,IAAIe,EAAqBf,EAEjC,GAEA3tG,KAAKujE,SAAU,SAAWoqC,GAEzB,OAAO,IAAIgB,EAAwBhB,EAEpC,GAEA3tG,KAAKujE,SAAU,SAAWoqC,GAEzB,OAAO,IAAIiB,EAAuBjB,EAEnC,EAED,CAWA,IAAAkB,CAAMjxD,EAAKz/B,EAAQ2wF,EAAY1wF,GAE9B,MAAM2wF,EAAQ/uG,KAEd,IAAIgvG,EAEJ,GAA2B,KAAtBhvG,KAAKgvG,aAETA,EAAehvG,KAAKgvG,kBAEd,GAAmB,KAAdhvG,KAAK02C,KAAc,CAO9B,MAAMu4D,EAAc,MAAYC,eAAgBtxD,GAChDoxD,EAAe,MAAYG,WAAYF,EAAajvG,KAAK02C,KAE1D,MAECs4D,EAAe,MAAYE,eAAgBtxD,GAO5C59C,KAAKstG,QAAQ8B,UAAWxxD,GAExB,MAAMyxD,EAAW,SAAW5oG,GAEtB2X,EAEJA,EAAS3X,GAITic,QAAQsY,MAAOv0B,GAIhBsoG,EAAMzB,QAAQgC,UAAW1xD,GACzBmxD,EAAMzB,QAAQiC,QAAS3xD,EAExB,EAEM4xD,EAAS,IAAI,MAAYxvG,KAAKstG,SAEpCkC,EAAOC,QAASzvG,KAAK02C,MACrB84D,EAAOE,gBAAiB,eACxBF,EAAOtxE,iBAAkBl+B,KAAK2vG,eAC9BH,EAAOI,mBAAoB5vG,KAAKmlF,iBAEhCqqB,EAAOX,KAAMjxD,EAAK,SAAW/zC,GAE5B,IAECklG,EAAMtsF,MAAO5Y,EAAMmlG,EAAc,SAAWa,GAE3C1xF,EAAQ0xF,GAERd,EAAMzB,QAAQiC,QAAS3xD,EAExB,EAAGyxD,EAEJ,CAAE,MAAQ5oG,GAET4oG,EAAU5oG,EAEX,CAED,EAAGqoG,EAAYO,EAEhB,CASA,cAAAS,CAAgBvC,GAGf,OADAvtG,KAAKutG,YAAcA,EACZvtG,IAER,CASA,aAAA+vG,CAAevC,GAGd,OADAxtG,KAAKwtG,WAAaA,EACXxtG,IAER,CASA,iBAAAgwG,CAAmBvC,GAGlB,OADAztG,KAAKytG,eAAiBA,EACfztG,IAER,CAUA,QAAAujE,CAAUr0B,GAQT,OANoD,IAA/ClvC,KAAK0tG,gBAAgBx8F,QAASg+B,IAElClvC,KAAK0tG,gBAAgBhjG,KAAMwkC,GAIrBlvC,IAER,CAQA,UAAAiwG,CAAY/gE,GAQX,OANoD,IAA/ClvC,KAAK0tG,gBAAgBx8F,QAASg+B,IAElClvC,KAAK0tG,gBAAgBxlG,OAAQlI,KAAK0tG,gBAAgBx8F,QAASg+B,GAAY,GAIjElvC,IAER,CAUA,KAAAyiB,CAAO5Y,EAAM6sC,EAAMv4B,EAAQC,GAE1B,IAAI0/E,EACJ,MAAMz6C,EAAa,CAAC,EACd/sC,EAAU,CAAC,EACX45F,EAAc,IAAIC,YAExB,GAAqB,iBAATtmG,EAEXi0F,EAAOt7E,KAAKC,MAAO5Y,QAEb,GAAKA,aAAgByuF,YAI3B,GAFc4X,EAAYE,OAAQ,IAAIzoG,WAAYkC,EAAM,EAAG,MAE5CwmG,EAAgC,CAE9C,IAEChtD,EAAYitD,EAAWC,iBAAoB,IAAIC,EAAqB3mG,EAErE,CAAE,MAAQmxB,GAGT,YADK5c,GAAUA,EAAS4c,GAGzB,CAEA8iE,EAAOt7E,KAAKC,MAAO4gC,EAAYitD,EAAWC,iBAAkBp4F,QAE7D,MAEC2lF,EAAOt7E,KAAKC,MAAOytF,EAAYE,OAAQvmG,SAMxCi0F,EAAOj0F,EAIR,QAAoBjG,IAAfk6F,EAAK2S,OAAuB3S,EAAK2S,MAAMptC,QAAS,GAAM,EAG1D,YADKjlD,GAAUA,EAAS,IAAIxH,MAAO,6EAKpC,MAAM+2F,EAAS,IAAI+C,EAAY5S,EAAM,CAEpCpnD,KAAMA,GAAQ12C,KAAKgvG,cAAgB,GACnCjc,YAAa/yF,KAAK+yF,YAClB4c,cAAe3vG,KAAK2vG,cACpBrC,QAASttG,KAAKstG,QACdE,WAAYxtG,KAAKwtG,WACjBC,eAAgBztG,KAAKytG,iBAItBE,EAAOgD,WAAWzyE,iBAAkBl+B,KAAK2vG,eAEzC,IAAM,IAAI7+F,EAAI,EAAGA,EAAI9Q,KAAK0tG,gBAAgBzsG,OAAQ6P,IAAO,CAExD,MAAM0kC,EAASx1C,KAAK0tG,gBAAiB58F,GAAK68F,GAEnCn4D,EAAOl0C,MAAOohB,QAAQsY,MAAO,wDAEpC1kB,EAASk/B,EAAOl0C,MAASk0C,EAMzB6N,EAAY7N,EAAOl0C,OAAS,CAE7B,CAEA,GAAKw8F,EAAK8S,eAET,IAAM,IAAI9/F,EAAI,EAAGA,EAAIgtF,EAAK8S,eAAe3vG,SAAW6P,EAAI,CAEvD,MAAM+/F,EAAgB/S,EAAK8S,eAAgB9/F,GACrCggG,EAAqBhT,EAAKgT,oBAAsB,GAEtD,OAASD,GAER,KAAKP,EAAWS,oBACf1tD,EAAYwtD,GAAkB,IAAIG,EAClC,MAED,KAAKV,EAAWW,2BACf5tD,EAAYwtD,GAAkB,IAAIK,EAAmCpT,EAAM99F,KAAKutG,aAChF,MAED,KAAK+C,EAAWa,sBACf9tD,EAAYwtD,GAAkB,IAAIO,EAClC,MAED,KAAKd,EAAWe,sBACfhuD,EAAYwtD,GAAkB,IAAIS,EAClC,MAED,QAEMR,EAAmB5/F,QAAS2/F,IAAmB,QAAkCjtG,IAA7B0S,EAASu6F,IAEjEnuF,QAAQC,KAAM,wCAA0CkuF,EAAgB,MAM5E,CAIDlD,EAAO4D,cAAeluD,GACtBsqD,EAAO6D,WAAYl7F,GACnBq3F,EAAOlrF,MAAOtE,EAAQC,EAEvB,CAUA,UAAAqzF,CAAY5nG,EAAM6sC,GAEjB,MAAMq4D,EAAQ/uG,KAEd,OAAO,IAAI45B,QAAS,SAAWuR,EAAS8J,GAEvC85D,EAAMtsF,MAAO5Y,EAAM6sC,EAAMvL,EAAS8J,EAEnC,EAED,EAMD,SAASy8D,IAER,IAAIC,EAAU,CAAC,EAEf,MAAO,CAENnwG,IAAK,SAAWyI,GAEf,OAAO0nG,EAAS1nG,EAEjB,EAEA4Q,IAAK,SAAW5Q,EAAKhB,GAEpB0oG,EAAS1nG,GAAQhB,CAElB,EAEA0R,OAAQ,SAAW1Q,UAEX0nG,EAAS1nG,EAEjB,EAEAyjC,UAAW,WAEVikE,EAAU,CAAC,CAEZ,EAIF,CAMA,MAAMrB,EAAa,CAClBC,gBAAiB,kBACjBU,2BAA4B,6BAC5BW,oBAAqB,sBACrBC,wBAAyB,0BACzBC,yBAA0B,2BAC1BC,kBAAmB,oBACnBC,oBAAqB,sBACrBC,uBAAwB,yBACxBC,2BAA4B,6BAC5BC,0BAA2B,4BAC3BC,yBAA0B,2BAC1BrB,oBAAqB,sBACrBsB,qBAAsB,uBACtBC,mBAAoB,qBACpBnB,sBAAuB,wBACvBE,sBAAuB,wBACvBkB,gCAAiC,kCACjCC,mBAAoB,qBACpBC,iBAAkB,mBAClBC,iBAAkB,mBAClBC,wBAAyB,0BACzBC,wBAAyB,2BAU1B,MAAMlE,EAEL,WAAAruG,CAAastG,GAEZ3tG,KAAK2tG,OAASA,EACd3tG,KAAKsB,KAAOgvG,EAAWsB,oBAGvB5xG,KAAKisC,MAAQ,CAAE4mE,KAAM,CAAC,EAAGC,KAAM,CAAC,EAEjC,CAEA,SAAAC,GAEC,MAAMpF,EAAS3tG,KAAK2tG,OACdqF,EAAWhzG,KAAK2tG,OAAO7P,KAAK7wD,OAAS,GAE3C,IAAM,IAAIgmE,EAAY,EAAGC,EAAaF,EAAS/xG,OAAQgyG,EAAYC,EAAYD,IAAe,CAE7F,MAAME,EAAUH,EAAUC,GAErBE,EAAQ9vD,YACR8vD,EAAQ9vD,WAAYrjD,KAAKsB,YACiBsC,IAA1CuvG,EAAQ9vD,WAAYrjD,KAAKsB,MAAO25D,OAEpC0yC,EAAOyF,YAAapzG,KAAKisC,MAAOknE,EAAQ9vD,WAAYrjD,KAAKsB,MAAO25D,MAIlE,CAED,CAEA,UAAAo4C,CAAYC,GAEX,MAAM3F,EAAS3tG,KAAK2tG,OACd4F,EAAW,SAAWD,EAC5B,IAAIE,EAAa7F,EAAO1hE,MAAMzqC,IAAK+xG,GAEnC,GAAKC,EAAa,OAAOA,EAEzB,MAAM1V,EAAO6P,EAAO7P,KAGd2V,IAFe3V,EAAKz6C,YAAcy6C,EAAKz6C,WAAYrjD,KAAKsB,OAAY,CAAC,GAC9CoyG,QAAU,IACXJ,GAC5B,IAAIK,EAEJ,MAAM9wG,EAAQ,IAAI,MAAO,eAEDe,IAAnB6vG,EAAS5wG,OAAsBA,EAAM+wG,OAAQH,EAAS5wG,MAAO,GAAK4wG,EAAS5wG,MAAO,GAAK4wG,EAAS5wG,MAAO,GAAK,OAEjH,MAAMu/F,OAA2Bx+F,IAAnB6vG,EAASrR,MAAsBqR,EAASrR,MAAQ,EAE9D,OAASqR,EAASxzG,MAEjB,IAAK,cACJ0zG,EAAY,IAAI,MAAkB9wG,GAClC8wG,EAAUvyG,OAAOg4B,SAAS3vB,IAAK,EAAG,GAAK,GACvCkqG,EAAU94F,IAAK84F,EAAUvyG,QACzB,MAED,IAAK,QACJuyG,EAAY,IAAI,MAAY9wG,GAC5B8wG,EAAUE,SAAWzR,EACrB,MAED,IAAK,OACJuR,EAAY,IAAI,MAAW9wG,GAC3B8wG,EAAUE,SAAWzR,EAErBqR,EAASK,KAAOL,EAASK,MAAQ,CAAC,EAClCL,EAASK,KAAKC,oBAAkDnwG,IAAjC6vG,EAASK,KAAKC,eAA+BN,EAASK,KAAKC,eAAiB,EAC3GN,EAASK,KAAKE,oBAAkDpwG,IAAjC6vG,EAASK,KAAKE,eAA+BP,EAASK,KAAKE,eAAiBvrG,KAAK4T,GAAK,EACrHs3F,EAAUz3F,MAAQu3F,EAASK,KAAKE,eAChCL,EAAUM,SAAW,EAAMR,EAASK,KAAKC,eAAiBN,EAASK,KAAKE,eACxEL,EAAUvyG,OAAOg4B,SAAS3vB,IAAK,EAAG,GAAK,GACvCkqG,EAAU94F,IAAK84F,EAAUvyG,QACzB,MAED,QACC,MAAM,IAAIwV,MAAO,4CAA8C68F,EAASxzG,MAkB1E,OAZA0zG,EAAUv6E,SAAS3vB,IAAK,EAAG,EAAG,GAE9ByqG,EAAwBP,EAAWF,QAEP7vG,IAAvB6vG,EAASU,YAA0BR,EAAUQ,UAAYV,EAASU,WAEvER,EAAUryG,KAAOqsG,EAAOyG,iBAAkBX,EAASnyG,MAAU,SAAWgyG,GAExEE,EAAa55E,QAAQuR,QAASwoE,GAE9BhG,EAAO1hE,MAAMpxB,IAAK04F,EAAUC,GAErBA,CAER,CAEA,aAAAa,CAAep0G,EAAMqJ,GAEpB,GAAc,UAATrJ,EAEL,OAAOD,KAAKqzG,WAAY/pG,EAEzB,CAEA,oBAAAgrG,CAAsBrB,GAErB,MAAMrtG,EAAO5F,KACP2tG,EAAS3tG,KAAK2tG,OAEdwF,EADOxF,EAAO7P,KACC7wD,MAAOgmE,GAEtBK,GADaH,EAAQ9vD,YAAc8vD,EAAQ9vD,WAAYrjD,KAAKsB,OAAY,CAAC,GACnD25D,MAE5B,YAAoBr3D,IAAf0vG,EAAkC,KAEhCtzG,KAAKqzG,WAAYC,GAAa75E,KAAM,SAAWwhC,GAErD,OAAO0yC,EAAO4G,YAAa3uG,EAAKqmC,MAAOqnE,EAAYr4C,EAEpD,EAED,EAWD,MAAM+1C,EAEL,WAAA3wG,GAECL,KAAKsB,KAAOgvG,EAAWS,mBAExB,CAEA,eAAAyD,GAEC,OAAO,KAER,CAEA,YAAAC,CAAcC,EAAgBC,EAAahH,GAE1C,MAAMiH,EAAU,GAEhBF,EAAe7xG,MAAQ,IAAI,MAAO,EAAK,EAAK,GAC5C6xG,EAAel7E,QAAU,EAEzB,MAAMq7E,EAAoBF,EAAYG,qBAEtC,GAAKD,EAAoB,CAExB,GAAKnwG,MAAM+H,QAASooG,EAAkBE,iBAAoB,CAEzD,MAAMxqG,EAAQsqG,EAAkBE,gBAEhCL,EAAe7xG,MAAM+wG,OAAQrpG,EAAO,GAAKA,EAAO,GAAKA,EAAO,GAAK,OACjEmqG,EAAel7E,QAAUjvB,EAAO,EAEjC,MAE4C3G,IAAvCixG,EAAkBG,kBAEtBJ,EAAQlqG,KAAMijG,EAAOsH,cAAeP,EAAgB,MAAOG,EAAkBG,iBAAkB,OAIjG,CAEA,OAAOp7E,QAAQv4B,IAAKuzG,EAErB,EAWD,MAAMvG,EAEL,WAAAhuG,CAAastG,GAEZ3tG,KAAK2tG,OAASA,EACd3tG,KAAKsB,KAAOgvG,EAAWiC,+BAExB,CAEA,oBAAA2C,CAAsBC,EAAeT,GAEpC,MACMC,EADS30G,KAAK2tG,OACO7P,KAAKsX,UAAWD,GAE3C,IAAOR,EAAYtxD,aAAgBsxD,EAAYtxD,WAAYrjD,KAAKsB,MAE/D,OAAOs4B,QAAQuR,UAIhB,MAAMkqE,EAAmBV,EAAYtxD,WAAYrjD,KAAKsB,MAAO+zG,iBAQ7D,YAN0BzxG,IAArByxG,IAEJX,EAAeY,kBAAoBD,GAI7Bz7E,QAAQuR,SAEhB,EAWD,MAAMyiE,EAEL,WAAAvtG,CAAastG,GAEZ3tG,KAAK2tG,OAASA,EACd3tG,KAAKsB,KAAOgvG,EAAWuB,uBAExB,CAEA,eAAA2C,CAAiBW,GAEhB,MACMR,EADS30G,KAAK2tG,OACO7P,KAAKsX,UAAWD,GAE3C,OAAOR,EAAYtxD,YAAgBsxD,EAAYtxD,WAAYrjD,KAAKsB,MAEzD,MAFyE,IAIjF,CAEA,oBAAA4zG,CAAsBC,EAAeT,GAEpC,MAAM/G,EAAS3tG,KAAK2tG,OACdgH,EAAchH,EAAO7P,KAAKsX,UAAWD,GAE3C,IAAOR,EAAYtxD,aAAgBsxD,EAAYtxD,WAAYrjD,KAAKsB,MAE/D,OAAOs4B,QAAQuR,UAIhB,MAAMypE,EAAU,GAEV7yD,EAAY4yD,EAAYtxD,WAAYrjD,KAAKsB,MA0B/C,QAxBmCsC,IAA9Bm+C,EAAUwzD,kBAEdb,EAAec,UAAYzzD,EAAUwzD,sBAIF3xG,IAA/Bm+C,EAAU0zD,kBAEdb,EAAQlqG,KAAMijG,EAAOsH,cAAeP,EAAgB,eAAgB3yD,EAAU0zD,wBAInC7xG,IAAvCm+C,EAAU2zD,2BAEdhB,EAAeiB,mBAAqB5zD,EAAU2zD,+BAIF9xG,IAAxCm+C,EAAU6zD,2BAEdhB,EAAQlqG,KAAMijG,EAAOsH,cAAeP,EAAgB,wBAAyB3yD,EAAU6zD,iCAI9ChyG,IAArCm+C,EAAU8zD,yBAEdjB,EAAQlqG,KAAMijG,EAAOsH,cAAeP,EAAgB,qBAAsB3yD,EAAU8zD,8BAEpCjyG,IAA3Cm+C,EAAU8zD,uBAAuBt5F,OAAsB,CAE3D,MAAMA,EAAQwlC,EAAU8zD,uBAAuBt5F,MAE/Cm4F,EAAeoB,qBAAuB,IAAI,MAASv5F,EAAOA,EAE3D,CAID,OAAOqd,QAAQv4B,IAAKuzG,EAErB,EAWD,MAAM/G,EAEL,WAAAxtG,CAAastG,GAEZ3tG,KAAK2tG,OAASA,EACd3tG,KAAKsB,KAAOgvG,EAAWwB,wBAExB,CAEA,eAAA0C,CAAiBW,GAEhB,MACMR,EADS30G,KAAK2tG,OACO7P,KAAKsX,UAAWD,GAE3C,OAAOR,EAAYtxD,YAAgBsxD,EAAYtxD,WAAYrjD,KAAKsB,MAEzD,MAFyE,IAIjF,CAEA,oBAAA4zG,CAAsBC,EAAeT,GAEpC,MACMC,EADS30G,KAAK2tG,OACO7P,KAAKsX,UAAWD,GAE3C,IAAOR,EAAYtxD,aAAgBsxD,EAAYtxD,WAAYrjD,KAAKsB,MAE/D,OAAOs4B,QAAQuR,UAIhB,MAAM4W,EAAY4yD,EAAYtxD,WAAYrjD,KAAKsB,MAI/C,OAFAozG,EAAeqB,gBAAsCnyG,IAAzBm+C,EAAUg0D,WAA2Bh0D,EAAUg0D,WAAa,EAEjFn8E,QAAQuR,SAEhB,EAWD,MAAMojE,EAEL,WAAAluG,CAAastG,GAEZ3tG,KAAK2tG,OAASA,EACd3tG,KAAKsB,KAAOgvG,EAAW6B,yBAExB,CAEA,eAAAqC,CAAiBW,GAEhB,MACMR,EADS30G,KAAK2tG,OACO7P,KAAKsX,UAAWD,GAE3C,OAAOR,EAAYtxD,YAAgBsxD,EAAYtxD,WAAYrjD,KAAKsB,MAEzD,MAFyE,IAIjF,CAEA,oBAAA4zG,CAAsBC,EAAeT,GAEpC,MAAM/G,EAAS3tG,KAAK2tG,OACdgH,EAAchH,EAAO7P,KAAKsX,UAAWD,GAE3C,IAAOR,EAAYtxD,aAAgBsxD,EAAYtxD,WAAYrjD,KAAKsB,MAE/D,OAAOs4B,QAAQuR,UAIhB,MAAMypE,EAAU,GAEV7yD,EAAY4yD,EAAYtxD,WAAYrjD,KAAKsB,MA4C/C,YA1CqCsC,IAAhCm+C,EAAUi0D,oBAEdtB,EAAeuB,YAAcl0D,EAAUi0D,wBAIFpyG,IAAjCm+C,EAAUm0D,oBAEdtB,EAAQlqG,KAAMijG,EAAOsH,cAAeP,EAAgB,iBAAkB3yD,EAAUm0D,0BAI/CtyG,IAA7Bm+C,EAAUo0D,iBAEdzB,EAAe0B,eAAiBr0D,EAAUo0D,qBAIOvyG,IAA7C8wG,EAAe2B,4BAEnB3B,EAAe2B,0BAA4B,CAAE,IAAK,WAIJzyG,IAA1Cm+C,EAAUu0D,8BAEd5B,EAAe2B,0BAA2B,GAAMt0D,EAAUu0D,kCAIZ1yG,IAA1Cm+C,EAAUw0D,8BAEd7B,EAAe2B,0BAA2B,GAAMt0D,EAAUw0D,kCAIZ3yG,IAA1Cm+C,EAAUy0D,6BAEd5B,EAAQlqG,KAAMijG,EAAOsH,cAAeP,EAAgB,0BAA2B3yD,EAAUy0D,8BAInF58E,QAAQv4B,IAAKuzG,EAErB,EAWD,MAAM3G,EAEL,WAAA5tG,CAAastG,GAEZ3tG,KAAK2tG,OAASA,EACd3tG,KAAKsB,KAAOgvG,EAAW0B,mBAExB,CAEA,eAAAwC,CAAiBW,GAEhB,MACMR,EADS30G,KAAK2tG,OACO7P,KAAKsX,UAAWD,GAE3C,OAAOR,EAAYtxD,YAAgBsxD,EAAYtxD,WAAYrjD,KAAKsB,MAEzD,MAFyE,IAIjF,CAEA,oBAAA4zG,CAAsBC,EAAeT,GAEpC,MAAM/G,EAAS3tG,KAAK2tG,OACdgH,EAAchH,EAAO7P,KAAKsX,UAAWD,GAE3C,IAAOR,EAAYtxD,aAAgBsxD,EAAYtxD,WAAYrjD,KAAKsB,MAE/D,OAAOs4B,QAAQuR,UAIhB,MAAMypE,EAAU,GAEhBF,EAAe+B,WAAa,IAAI,MAAO,EAAG,EAAG,GAC7C/B,EAAegC,eAAiB,EAChChC,EAAeiC,MAAQ,EAEvB,MAAM50D,EAAY4yD,EAAYtxD,WAAYrjD,KAAKsB,MAE/C,QAAoCsC,IAA/Bm+C,EAAU60D,iBAAiC,CAE/C,MAAMC,EAAc90D,EAAU60D,iBAC9BlC,EAAe+B,WAAW7C,OAAQiD,EAAa,GAAKA,EAAa,GAAKA,EAAa,GAAK,MAEzF,CAoBA,YAlBwCjzG,IAAnCm+C,EAAU+0D,uBAEdpC,EAAegC,eAAiB30D,EAAU+0D,2BAINlzG,IAAhCm+C,EAAUg1D,mBAEdnC,EAAQlqG,KAAMijG,EAAOsH,cAAeP,EAAgB,gBAAiB3yD,EAAUg1D,kBAAmB,aAI1DnzG,IAApCm+C,EAAUi1D,uBAEdpC,EAAQlqG,KAAMijG,EAAOsH,cAAeP,EAAgB,oBAAqB3yD,EAAUi1D,wBAI7Ep9E,QAAQv4B,IAAKuzG,EAErB,EAYD,MAAM1G,EAEL,WAAA7tG,CAAastG,GAEZ3tG,KAAK2tG,OAASA,EACd3tG,KAAKsB,KAAOgvG,EAAW4B,0BAExB,CAEA,eAAAsC,CAAiBW,GAEhB,MACMR,EADS30G,KAAK2tG,OACO7P,KAAKsX,UAAWD,GAE3C,OAAOR,EAAYtxD,YAAgBsxD,EAAYtxD,WAAYrjD,KAAKsB,MAEzD,MAFyE,IAIjF,CAEA,oBAAA4zG,CAAsBC,EAAeT,GAEpC,MAAM/G,EAAS3tG,KAAK2tG,OACdgH,EAAchH,EAAO7P,KAAKsX,UAAWD,GAE3C,IAAOR,EAAYtxD,aAAgBsxD,EAAYtxD,WAAYrjD,KAAKsB,MAE/D,OAAOs4B,QAAQuR,UAIhB,MAAMypE,EAAU,GAEV7yD,EAAY4yD,EAAYtxD,WAAYrjD,KAAKsB,MAc/C,YAZsCsC,IAAjCm+C,EAAUk1D,qBAEdvC,EAAewC,aAAen1D,EAAUk1D,yBAIFrzG,IAAlCm+C,EAAUo1D,qBAEdvC,EAAQlqG,KAAMijG,EAAOsH,cAAeP,EAAgB,kBAAmB3yD,EAAUo1D,sBAI3Ev9E,QAAQv4B,IAAKuzG,EAErB,EAWD,MAAMzG,EAEL,WAAA9tG,CAAastG,GAEZ3tG,KAAK2tG,OAASA,EACd3tG,KAAKsB,KAAOgvG,EAAW+B,oBAExB,CAEA,eAAAmC,CAAiBW,GAEhB,MACMR,EADS30G,KAAK2tG,OACO7P,KAAKsX,UAAWD,GAE3C,OAAOR,EAAYtxD,YAAgBsxD,EAAYtxD,WAAYrjD,KAAKsB,MAEzD,MAFyE,IAIjF,CAEA,oBAAA4zG,CAAsBC,EAAeT,GAEpC,MAAM/G,EAAS3tG,KAAK2tG,OACdgH,EAAchH,EAAO7P,KAAKsX,UAAWD,GAE3C,IAAOR,EAAYtxD,aAAgBsxD,EAAYtxD,WAAYrjD,KAAKsB,MAE/D,OAAOs4B,QAAQuR,UAIhB,MAAMypE,EAAU,GAEV7yD,EAAY4yD,EAAYtxD,WAAYrjD,KAAKsB,MAE/CozG,EAAe0C,eAA0CxzG,IAA9Bm+C,EAAUs1D,gBAAgCt1D,EAAUs1D,gBAAkB,OAE7DzzG,IAA/Bm+C,EAAUu1D,kBAEd1C,EAAQlqG,KAAMijG,EAAOsH,cAAeP,EAAgB,eAAgB3yD,EAAUu1D,mBAI/E5C,EAAe6C,oBAAsBx1D,EAAUw1D,qBAAuB1pC,IAEtE,MAAM2pC,EAAaz1D,EAAU01D,kBAAoB,CAAE,EAAG,EAAG,GAGzD,OAFA/C,EAAe+C,kBAAmB,IAAI,OAAQ7D,OAAQ4D,EAAY,GAAKA,EAAY,GAAKA,EAAY,GAAK,OAElG59E,QAAQv4B,IAAKuzG,EAErB,EAWD,MAAMxG,EAEL,WAAA/tG,CAAastG,GAEZ3tG,KAAK2tG,OAASA,EACd3tG,KAAKsB,KAAOgvG,EAAWyB,iBAExB,CAEA,eAAAyC,CAAiBW,GAEhB,MACMR,EADS30G,KAAK2tG,OACO7P,KAAKsX,UAAWD,GAE3C,OAAOR,EAAYtxD,YAAgBsxD,EAAYtxD,WAAYrjD,KAAKsB,MAEzD,MAFyE,IAIjF,CAEA,oBAAA4zG,CAAsBC,EAAeT,GAEpC,MACMC,EADS30G,KAAK2tG,OACO7P,KAAKsX,UAAWD,GAE3C,IAAOR,EAAYtxD,aAAgBsxD,EAAYtxD,WAAYrjD,KAAKsB,MAE/D,OAAOs4B,QAAQuR,UAIhB,MAAM4W,EAAY4yD,EAAYtxD,WAAYrjD,KAAKsB,MAI/C,OAFAozG,EAAegD,SAAwB9zG,IAAlBm+C,EAAU21D,IAAoB31D,EAAU21D,IAAM,IAE5D99E,QAAQuR,SAEhB,EAWD,MAAMmjE,EAEL,WAAAjuG,CAAastG,GAEZ3tG,KAAK2tG,OAASA,EACd3tG,KAAKsB,KAAOgvG,EAAW2B,sBAExB,CAEA,eAAAuC,CAAiBW,GAEhB,MACMR,EADS30G,KAAK2tG,OACO7P,KAAKsX,UAAWD,GAE3C,OAAOR,EAAYtxD,YAAgBsxD,EAAYtxD,WAAYrjD,KAAKsB,MAEzD,MAFyE,IAIjF,CAEA,oBAAA4zG,CAAsBC,EAAeT,GAEpC,MAAM/G,EAAS3tG,KAAK2tG,OACdgH,EAAchH,EAAO7P,KAAKsX,UAAWD,GAE3C,IAAOR,EAAYtxD,aAAgBsxD,EAAYtxD,WAAYrjD,KAAKsB,MAE/D,OAAOs4B,QAAQuR,UAIhB,MAAMypE,EAAU,GAEV7yD,EAAY4yD,EAAYtxD,WAAYrjD,KAAKsB,MAE/CozG,EAAeiD,uBAAiD/zG,IAA7Bm+C,EAAU61D,eAA+B71D,EAAU61D,eAAiB,OAEpEh0G,IAA9Bm+C,EAAU81D,iBAEdjD,EAAQlqG,KAAMijG,EAAOsH,cAAeP,EAAgB,uBAAwB3yD,EAAU81D,kBAIvF,MAAML,EAAaz1D,EAAU+1D,qBAAuB,CAAE,EAAG,EAAG,GAS5D,OARApD,EAAeqD,eAAgB,IAAI,OAAQnE,OAAQ4D,EAAY,GAAKA,EAAY,GAAKA,EAAY,GAAK,YAE9D5zG,IAAnCm+C,EAAUi2D,sBAEdpD,EAAQlqG,KAAMijG,EAAOsH,cAAeP,EAAgB,mBAAoB3yD,EAAUi2D,qBAAsB,QAIlGp+E,QAAQv4B,IAAKuzG,EAErB,EAYD,MAAMnG,EAEL,WAAApuG,CAAastG,GAEZ3tG,KAAK2tG,OAASA,EACd3tG,KAAKsB,KAAOgvG,EAAWkC,kBAExB,CAEA,eAAAgC,CAAiBW,GAEhB,MACMR,EADS30G,KAAK2tG,OACO7P,KAAKsX,UAAWD,GAE3C,OAAOR,EAAYtxD,YAAgBsxD,EAAYtxD,WAAYrjD,KAAKsB,MAEzD,MAFyE,IAIjF,CAEA,oBAAA4zG,CAAsBC,EAAeT,GAEpC,MAAM/G,EAAS3tG,KAAK2tG,OACdgH,EAAchH,EAAO7P,KAAKsX,UAAWD,GAE3C,IAAOR,EAAYtxD,aAAgBsxD,EAAYtxD,WAAYrjD,KAAKsB,MAE/D,OAAOs4B,QAAQuR,UAIhB,MAAMypE,EAAU,GAEV7yD,EAAY4yD,EAAYtxD,WAAYrjD,KAAKsB,MAU/C,OARAozG,EAAeuD,eAAqCr0G,IAAzBm+C,EAAUm2D,WAA2Bn2D,EAAUm2D,WAAa,OAExDt0G,IAA1Bm+C,EAAUo2D,aAEdvD,EAAQlqG,KAAMijG,EAAOsH,cAAeP,EAAgB,UAAW3yD,EAAUo2D,cAInEv+E,QAAQv4B,IAAKuzG,EAErB,EAWD,MAAMpG,EAEL,WAAAnuG,CAAastG,GAEZ3tG,KAAK2tG,OAASA,EACd3tG,KAAKsB,KAAOgvG,EAAW8B,wBAExB,CAEA,eAAAoC,CAAiBW,GAEhB,MACMR,EADS30G,KAAK2tG,OACO7P,KAAKsX,UAAWD,GAE3C,OAAOR,EAAYtxD,YAAgBsxD,EAAYtxD,WAAYrjD,KAAKsB,MAEzD,MAFyE,IAIjF,CAEA,oBAAA4zG,CAAsBC,EAAeT,GAEpC,MAAM/G,EAAS3tG,KAAK2tG,OACdgH,EAAchH,EAAO7P,KAAKsX,UAAWD,GAE3C,IAAOR,EAAYtxD,aAAgBsxD,EAAYtxD,WAAYrjD,KAAKsB,MAE/D,OAAOs4B,QAAQuR,UAIhB,MAAMypE,EAAU,GAEV7yD,EAAY4yD,EAAYtxD,WAAYrjD,KAAKsB,MAoB/C,YAlBsCsC,IAAjCm+C,EAAUq2D,qBAEd1D,EAAe2D,WAAat2D,EAAUq2D,yBAIDx0G,IAAjCm+C,EAAUu2D,qBAEd5D,EAAe4D,mBAAqBv2D,EAAUu2D,yBAIV10G,IAAhCm+C,EAAUw2D,mBAEd3D,EAAQlqG,KAAMijG,EAAOsH,cAAeP,EAAgB,gBAAiB3yD,EAAUw2D,oBAIzE3+E,QAAQv4B,IAAKuzG,EAErB,EAWD,MAAM9G,EAEL,WAAAztG,CAAastG,GAEZ3tG,KAAK2tG,OAASA,EACd3tG,KAAKsB,KAAOgvG,EAAWgC,kBAExB,CAEA,WAAAkG,CAAaC,GAEZ,MAAM9K,EAAS3tG,KAAK2tG,OACd7P,EAAO6P,EAAO7P,KAEd4a,EAAa5a,EAAK6a,SAAUF,GAElC,IAAOC,EAAWr1D,aAAgBq1D,EAAWr1D,WAAYrjD,KAAKsB,MAE7D,OAAO,KAIR,MAAMygD,EAAY22D,EAAWr1D,WAAYrjD,KAAKsB,MACxCkuG,EAAS7B,EAAOt4F,QAAQm4F,WAE9B,IAAOgC,EAAS,CAEf,GAAK1R,EAAKgT,oBAAsBhT,EAAKgT,mBAAmB5/F,QAASlR,KAAKsB,OAAU,EAE/E,MAAM,IAAIsV,MAAO,+EAKjB,OAAO,IAIT,CAEA,OAAO+2F,EAAOiL,iBAAkBH,EAAc12D,EAAUz/C,OAAQktG,EAEjE,EAWD,MAAMzB,EAEL,WAAA1tG,CAAastG,GAEZ3tG,KAAK2tG,OAASA,EACd3tG,KAAKsB,KAAOgvG,EAAWmC,gBAExB,CAEA,WAAA+F,CAAaC,GAEZ,MAAMn3G,EAAOtB,KAAKsB,KACZqsG,EAAS3tG,KAAK2tG,OACd7P,EAAO6P,EAAO7P,KAEd4a,EAAa5a,EAAK6a,SAAUF,GAElC,IAAOC,EAAWr1D,aAAgBq1D,EAAWr1D,WAAY/hD,GAExD,OAAO,KAIR,MAAMygD,EAAY22D,EAAWr1D,WAAY/hD,GACnCgB,EAASw7F,EAAK+a,OAAQ92D,EAAUz/C,QAEtC,IAAIktG,EAAS7B,EAAOmL,cACpB,GAAKx2G,EAAOy2G,IAAM,CAEjB,MAAMrjE,EAAUi4D,EAAOt4F,QAAQi4F,QAAQ0L,WAAY12G,EAAOy2G,KACzC,OAAZrjE,IAAmB85D,EAAS95D,EAElC,CAEA,OAAOi4D,EAAOiL,iBAAkBH,EAAc12D,EAAUz/C,OAAQktG,EAEjE,EAWD,MAAMxB,EAEL,WAAA3tG,CAAastG,GAEZ3tG,KAAK2tG,OAASA,EACd3tG,KAAKsB,KAAOgvG,EAAWoC,gBAExB,CAEA,WAAA8F,CAAaC,GAEZ,MAAMn3G,EAAOtB,KAAKsB,KACZqsG,EAAS3tG,KAAK2tG,OACd7P,EAAO6P,EAAO7P,KAEd4a,EAAa5a,EAAK6a,SAAUF,GAElC,IAAOC,EAAWr1D,aAAgBq1D,EAAWr1D,WAAY/hD,GAExD,OAAO,KAIR,MAAMygD,EAAY22D,EAAWr1D,WAAY/hD,GACnCgB,EAASw7F,EAAK+a,OAAQ92D,EAAUz/C,QAEtC,IAAIktG,EAAS7B,EAAOmL,cACpB,GAAKx2G,EAAOy2G,IAAM,CAEjB,MAAMrjE,EAAUi4D,EAAOt4F,QAAQi4F,QAAQ0L,WAAY12G,EAAOy2G,KACzC,OAAZrjE,IAAmB85D,EAAS95D,EAElC,CAEA,OAAOi4D,EAAOiL,iBAAkBH,EAAc12D,EAAUz/C,OAAQktG,EAEjE,EAWD,MAAMb,EAEL,WAAAtuG,CAAastG,GAEZ3tG,KAAKsB,KAAOgvG,EAAWqC,wBACvB3yG,KAAK2tG,OAASA,CAEf,CAEA,cAAAsL,CAAgB3vG,GAEf,MAAMw0F,EAAO99F,KAAK2tG,OAAO7P,KACnBob,EAAapb,EAAKqb,YAAa7vG,GAErC,GAAK4vG,EAAW71D,YAAc61D,EAAW71D,WAAYrjD,KAAKsB,MAAS,CAElE,MAAM83G,EAAeF,EAAW71D,WAAYrjD,KAAKsB,MAE3C8K,EAASpM,KAAK2tG,OAAO0G,cAAe,SAAU+E,EAAahtG,QAC3DitG,EAAUr5G,KAAK2tG,OAAOt4F,QAAQo4F,eAEpC,IAAO4L,IAAaA,EAAQC,UAAY,CAEvC,GAAKxb,EAAKgT,oBAAsBhT,EAAKgT,mBAAmB5/F,QAASlR,KAAKsB,OAAU,EAE/E,MAAM,IAAIsV,MAAO,sFAKjB,OAAO,IAIT,CAEA,OAAOxK,EAAOqtB,KAAM,SAAW6sC,GAE9B,MAAMr5D,EAAamsG,EAAansG,YAAc,EACxCD,EAAaosG,EAAapsG,YAAc,EAExCsB,EAAQ8qG,EAAa9qG,MACrBirG,EAASH,EAAaI,WAEtBl3G,EAAS,IAAIqF,WAAY2+D,EAAKr5D,EAAYD,GAEhD,OAAKqsG,EAAQI,sBAELJ,EAAQI,sBAAuBnrG,EAAOirG,EAAQj3G,EAAQ82G,EAAax2G,KAAMw2G,EAAat1G,QAAS21B,KAAM,SAAW6sC,GAEtH,OAAOA,EAAIl6D,MAEZ,GAKOitG,EAAQt+E,MAAMtB,KAAM,WAE1B,MAAMtwB,EAAS,IAAImvF,YAAahqF,EAAQirG,GAExC,OADAF,EAAQK,iBAAkB,IAAI/xG,WAAYwB,GAAUmF,EAAOirG,EAAQj3G,EAAQ82G,EAAax2G,KAAMw2G,EAAat1G,QACpGqF,CAER,EAIF,EAED,CAEC,OAAO,IAIT,EAWD,MAAMylG,EAEL,WAAAvuG,CAAastG,GAEZ3tG,KAAKsB,KAAOgvG,EAAWsC,wBACvB5yG,KAAK2tG,OAASA,CAEf,CAEA,cAAAgM,CAAgB1G,GAEf,MAAMnV,EAAO99F,KAAK2tG,OAAO7P,KACnBqV,EAAUrV,EAAK7wD,MAAOgmE,GAE5B,IAAOE,EAAQ9vD,aAAgB8vD,EAAQ9vD,WAAYrjD,KAAKsB,YACtCsC,IAAjBuvG,EAAQyG,KAER,OAAO,KAIR,MAAMC,EAAU/b,EAAKgc,OAAQ3G,EAAQyG,MAIrC,IAAM,MAAMG,KAAaF,EAAQG,WAEhC,GAAKD,EAAUn3G,OAASq3G,EAAgBC,WACtCH,EAAUn3G,OAASq3G,EAAgBE,gBACnCJ,EAAUn3G,OAASq3G,EAAgBG,mBAChBx2G,IAAnBm2G,EAAUn3G,KAEX,OAAO,KAMT,MACMy3G,EADelH,EAAQ9vD,WAAYrjD,KAAKsB,MACXg5G,WAI7B1F,EAAU,GACV0F,EAAa,CAAC,EAEpB,IAAM,MAAMrwG,KAAOowG,EAElBzF,EAAQlqG,KAAM1K,KAAK2tG,OAAO0G,cAAe,WAAYgG,EAAepwG,IAAQwvB,KAAM8gF,IAEjFD,EAAYrwG,GAAQswG,EACbD,EAAYrwG,MAMrB,OAAK2qG,EAAQ3zG,OAAS,EAEd,MAIR2zG,EAAQlqG,KAAM1K,KAAK2tG,OAAOgM,eAAgB1G,IAEnCr5E,QAAQv4B,IAAKuzG,GAAUn7E,KAAM+gF,IAEnC,MAAMC,EAAaD,EAAQ/vG,MACrBqvG,EAASW,EAAWC,QAAUD,EAAWnxF,SAAW,CAAEmxF,GACtDnsG,EAAQksG,EAAS,GAAIlsG,MACrBqsG,EAAkB,GAExB,IAAM,MAAMf,KAAQE,EAAS,CAG5B,MAAMpjG,EAAI,IAAI,MACRrX,EAAI,IAAI,MACRmrB,EAAI,IAAI,MACRrZ,EAAI,IAAI,MAAS,EAAG,EAAG,GAEvBypG,EAAgB,IAAI,MAAehB,EAAK/M,SAAU+M,EAAKiB,SAAUvsG,GAEvE,IAAM,IAAIwC,EAAI,EAAGA,EAAIxC,EAAOwC,IAEtBwpG,EAAWQ,aAEfz7G,EAAE07G,oBAAqBT,EAAWQ,YAAahqG,GAI3CwpG,EAAWU,UAEfxwF,EAAEuwF,oBAAqBT,EAAWU,SAAUlqG,GAIxCwpG,EAAWW,OAEf9pG,EAAE4pG,oBAAqBT,EAAWW,MAAOnqG,GAI1C8pG,EAAcM,YAAapqG,EAAG4F,EAAEykG,QAAS97G,EAAGmrB,EAAGrZ,IAKhD,IAAM,MAAMiqG,KAAiBd,EAE5B,GAAuB,aAAlBc,EAA+B,CAEnC,MAAMvxD,EAAOywD,EAAYc,GACzBR,EAAcS,cAAgB,IAAI,MAA0BxxD,EAAKt/C,MAAOs/C,EAAKyxD,SAAUzxD,EAAK0xD,WAE7F,KAA8B,gBAAlBH,GACQ,aAAlBA,GACkB,UAAlBA,GAEDxB,EAAK/M,SAASpnF,aAAc21F,EAAed,EAAYc,IAOzD,MAASj7G,UAAU85D,KAAKl6D,KAAM66G,EAAehB,GAE7C55G,KAAK2tG,OAAO6N,oBAAqBZ,GAEjCD,EAAgBjwG,KAAMkwG,EAEvB,CAEA,OAAKH,EAAWC,SAEfD,EAAWlxG,QAEXkxG,EAAW5/F,OAAS8/F,GAEbF,GAIDE,EAAiB,KAI1B,EAKD,MAAMtK,EAAgC,OAItC,MAAMG,EAEL,WAAAnwG,CAAawJ,GAEZ7J,KAAKsB,KAAOgvG,EAAWC,gBACvBvwG,KAAKmY,QAAU,KACfnY,KAAKqR,KAAO,KAEZ,MAAMoqG,EAAa,IAAIC,SAAU7xG,EAAM,EAXF,IAY/BqmG,EAAc,IAAIC,YAQxB,GANAnwG,KAAK27G,OAAS,CACbC,MAAO1L,EAAYE,OAAQ,IAAIzoG,WAAYkC,EAAKiD,MAAO,EAAG,KAC1Du2D,QAASo4C,EAAWI,UAAW,GAAG,GAClC56G,OAAQw6G,EAAWI,UAAW,GAAG,IAG7B77G,KAAK27G,OAAOC,QAAUvL,EAE1B,MAAM,IAAIz5F,MAAO,qDAEX,GAAK5W,KAAK27G,OAAOt4C,QAAU,EAEjC,MAAM,IAAIzsD,MAAO,kDAIlB,MAAMklG,EAAsB97G,KAAK27G,OAAO16G,OA9BH,GA+B/B86G,EAAY,IAAIL,SAAU7xG,EA/BK,IAgCrC,IAAIkrF,EAAa,EAEjB,KAAQA,EAAa+mB,GAAsB,CAE1C,MAAME,EAAcD,EAAUF,UAAW9mB,GAAY,GACrDA,GAAc,EAEd,MAAMknB,EAAYF,EAAUF,UAAW9mB,GAAY,GAGnD,GAFAA,GAAc,EAvC4B,aAyCrCknB,EAAkD,CAEtD,MAAMC,EAAe,IAAIv0G,WAAYkC,EA5CF,GA4CyCkrF,EAAYinB,GACxFh8G,KAAKmY,QAAU+3F,EAAYE,OAAQ8L,EAEpC,MAAO,GA9CoD,UA8C/CD,EAAiD,CAE5D,MAAMhvG,EAjD6B,GAiDiB8nF,EACpD/0F,KAAKqR,KAAOxH,EAAKiD,MAAOG,EAAYA,EAAa+uG,EAElD,CAIAjnB,GAAcinB,CAEf,CAEA,GAAsB,OAAjBh8G,KAAKmY,QAET,MAAM,IAAIvB,MAAO,4CAInB,EAWD,MAAMs6F,EAEL,WAAA7wG,CAAay9F,EAAMyP,GAElB,IAAOA,EAEN,MAAM,IAAI32F,MAAO,uDAIlB5W,KAAKsB,KAAOgvG,EAAWW,2BACvBjxG,KAAK89F,KAAOA,EACZ99F,KAAKutG,YAAcA,EACnBvtG,KAAKutG,YAAY17E,SAElB,CAEA,eAAAsqF,CAAiBpC,EAAWpM,GAE3B,MAAM7P,EAAO99F,KAAK89F,KACZyP,EAAcvtG,KAAKutG,YACnB6O,EAAkBrC,EAAU12D,WAAYrjD,KAAKsB,MAAO43G,WACpDmD,EAAmBtC,EAAU12D,WAAYrjD,KAAKsB,MAAOg5G,WACrDgC,EAAoB,CAAC,EACrBC,EAAyB,CAAC,EAC1BC,EAAmB,CAAC,EAE1B,IAAM,MAAMpB,KAAiBiB,EAAmB,CAE/C,MAAMI,EAAqBC,EAAYtB,IAAmBA,EAActlG,cAExEwmG,EAAmBG,GAAuBJ,EAAkBjB,EAE7D,CAEA,IAAM,MAAMA,KAAiBrB,EAAUO,WAAa,CAEnD,MAAMmC,EAAqBC,EAAYtB,IAAmBA,EAActlG,cAExE,QAA2ClS,IAAtCy4G,EAAkBjB,GAAgC,CAEtD,MAAMuB,EAAc7e,EAAK8e,UAAW7C,EAAUO,WAAYc,IACpDyB,EAAgBC,EAAuBH,EAAYE,eAEzDL,EAAkBC,GAAuBI,EAAcv7G,KACvDi7G,EAAwBE,IAAkD,IAA3BE,EAAYpB,UAE5D,CAED,CAEA,OAAO5N,EAAO0G,cAAe,aAAc+H,GAAkB3iF,KAAM,SAAWy/E,GAE7E,OAAO,IAAIt/E,QAAS,SAAWuR,EAAS8J,GAEvCs4D,EAAYwP,gBAAiB7D,EAAY,SAAWrM,GAEnD,IAAM,MAAMuO,KAAiBvO,EAASyN,WAAa,CAElD,MAAMjnD,EAAYw5C,EAASyN,WAAYc,GACjCG,EAAagB,EAAwBnB,QAEvBx3G,IAAf23G,IAA2BloD,EAAUkoD,WAAaA,EAExD,CAEApwE,EAAS0hE,EAEV,EAAGyP,EAAmBE,EAAkB,MAAsBvnE,EAE/D,EAED,EAED,EAWD,MAAMm8D,EAEL,WAAA/wG,GAECL,KAAKsB,KAAOgvG,EAAWa,qBAExB,CAEA,aAAA6L,CAAeC,EAASx3G,GAEvB,YAA8B7B,IAAvB6B,EAAUy3G,UAA0Bz3G,EAAUy3G,WAAaD,EAAQE,cACjDv5G,IAArB6B,EAAUs9D,aACan/D,IAAvB6B,EAAU23G,eACUx5G,IAApB6B,EAAU8W,OAOd0gG,EAAUA,EAAQvqC,aAEU9uE,IAAvB6B,EAAUy3G,WAEdD,EAAQE,QAAU13G,EAAUy3G,eAIHt5G,IAArB6B,EAAUs9D,QAEdk6C,EAAQl6C,OAAOs6C,UAAW53G,EAAUs9D,aAITn/D,IAAvB6B,EAAU23G,WAEdH,EAAQG,SAAW33G,EAAU23G,eAILx5G,IAApB6B,EAAU8W,OAEd0gG,EAAQx9D,OAAO49D,UAAW53G,EAAU8W,OAIrC0gG,EAAQK,aAAc,EAEfL,GAhCCA,CAkCT,EAWD,MAAM3L,EAEL,WAAAjxG,GAECL,KAAKsB,KAAOgvG,EAAWe,qBAExB,EAUD,MAAMkM,UAAmC,MAExC,WAAAl9G,CAAam9G,EAAoBC,EAAcC,EAAYC,GAE1DvnG,MAAOonG,EAAoBC,EAAcC,EAAYC,EAEtD,CAEA,gBAAAC,CAAkBt0G,GAKjB,MAAMH,EAASnJ,KAAK29G,aACnBv2F,EAASpnB,KAAKy9G,aACdI,EAAY79G,KAAK69G,UACjB96C,EAASz5D,EAAQu0G,EAAY,EAAIA,EAElC,IAAM,IAAI/sG,EAAI,EAAGA,IAAM+sG,EAAW/sG,IAEjC3H,EAAQ2H,GAAMsW,EAAQ27C,EAASjyD,GAIhC,OAAO3H,CAER,CAEA,YAAA20G,CAAcC,EAAIC,EAAI3tG,EAAG4tG,GAExB,MAAM90G,EAASnJ,KAAK29G,aACdv2F,EAASpnB,KAAKy9G,aACdlE,EAASv5G,KAAK69G,UAEdK,EAAmB,EAAT3E,EACV4E,EAAmB,EAAT5E,EAEV6E,EAAKH,EAAKD,EAEV3+G,GAAMgR,EAAI2tG,GAAOI,EACjBC,EAAKh/G,EAAIA,EACTi/G,EAAMD,EAAKh/G,EAEXk/G,EAAUR,EAAKI,EACfK,EAAUD,EAAUJ,EAEpBM,GAAO,EAAIH,EAAM,EAAID,EACrBK,EAAKJ,EAAMD,EACXM,EAAK,EAAIF,EACTG,EAAKF,EAAKL,EAAKh/G,EAIrB,IAAM,IAAIyR,EAAI,EAAGA,IAAMyoG,EAAQzoG,IAAO,CAErC,MAAM+tG,EAAKz3F,EAAQo3F,EAAU1tG,EAAIyoG,GAC3BuF,EAAK13F,EAAQo3F,EAAU1tG,EAAIotG,GAAYE,EACvCW,EAAK33F,EAAQm3F,EAAUztG,EAAIyoG,GAC3ByF,EAAK53F,EAAQm3F,EAAUztG,GAAMstG,EAEnCj1G,EAAQ2H,GAAM6tG,EAAKE,EAAKD,EAAKE,EAAKL,EAAKM,EAAKL,EAAKM,CAElD,CAEA,OAAO71G,CAER,EAID,MAAM81G,EAAc,IAAI,MAExB,MAAMC,UAA6C3B,EAElD,YAAAO,CAAcC,EAAIC,EAAI3tG,EAAG4tG,GAExB,MAAM90G,EAASiN,MAAM0nG,aAAcC,EAAIC,EAAI3tG,EAAG4tG,GAI9C,OAFAgB,EAAY5B,UAAWl0G,GAAS6yC,YAAYknB,QAAS/5D,GAE9CA,CAER,EAWD,MAAM8wG,EAAkB,CACvBkF,MAAO,KAEPC,WAAY,MACZC,WAAY,MACZC,WAAY,MACZC,WAAY,MACZC,WAAY,MACZC,OAAQ,KACRC,OAAQ,MACRC,WAAY,MACZC,OAAQ,EACRC,MAAO,EACPC,UAAW,EACXC,WAAY,EACZ7F,UAAW,EACXC,eAAgB,EAChBC,aAAc,EACd4F,cAAe,KACfC,eAAgB,MAGXnD,EAAwB,CAC7B,KAAMoD,UACN,KAAMv4G,WACN,KAAMw4G,WACN,KAAMC,YACN,KAAMC,YACN,KAAMC,cAGDC,EAAgB,CACrB,KAAM,MACN,KAAM,MACN,KAAM,MACN,KAAM,MACN,KAAM,MACN,KAAM,OAGDC,EAAkB,CACvB,MAAO,MACP,MAAO,MACP,MAAO,OAGFC,EAAmB,CACxB,OAAU,EACV,KAAQ,EACR,KAAQ,EACR,KAAQ,EACR,KAAQ,EACR,KAAQ,EACR,KAAQ,IAGH/D,EAAa,CAClBgE,SAAU,WACVC,OAAQ,SACRC,QAAS,UACTC,WAAY,KACZC,WAAY,MACZC,WAAY,MACZC,WAAY,MACZC,QAAS,QACTC,UAAW,aACXC,SAAU,aAGLC,EAAkB,CACvB7kG,MAAO,QACP8kG,YAAa,WACbjE,SAAU,aACVkE,QAAS,yBAGJC,EAAgB,CACrBC,iBAAa59G,EAEb67G,OAAQ,MACRgC,KAAM,OAgBP,SAASC,EAAuBz1E,GAgB/B,YAdoCroC,IAA/BqoC,EAAyB,kBAE7BA,EAAyB,gBAAI,IAAI,MAAsB,CACtDppC,MAAO,SACP8+G,SAAU,EACVC,UAAW,EACXC,UAAW,EACX1oD,aAAa,EACb2oD,WAAW,EACXC,KAAM,SAKD91E,EAAyB,eAEjC,CAEA,SAAS+1E,EAAgCC,EAAiBh5G,EAAQi5G,GAIjE,IAAM,MAAM5gH,KAAQ4gH,EAAU7+D,gBAEIz/C,IAA5Bq+G,EAAiB3gH,KAErB2H,EAAOk5G,SAASC,eAAiBn5G,EAAOk5G,SAASC,gBAAkB,CAAC,EACpEn5G,EAAOk5G,SAASC,eAAgB9gH,GAAS4gH,EAAU7+D,WAAY/hD,GAMlE,CAQA,SAAS4yG,EAAwBjrG,EAAQo5G,QAEhBz+G,IAAnBy+G,EAAQC,SAEmB,iBAAnBD,EAAQC,OAEnBhjH,OAAO0V,OAAQ/L,EAAOk5G,SAAUE,EAAQC,QAIxC5/F,QAAQC,KAAM,sDAAwD0/F,EAAQC,QAMjF,CAkGA,SAASC,EAAoB3I,EAAMC,GAIlC,GAFAD,EAAK2I,0BAEoB3+G,IAApBi2G,EAAQyH,QAEZ,IAAM,IAAIxwG,EAAI,EAAG0xG,EAAK3I,EAAQyH,QAAQrgH,OAAQ6P,EAAI0xG,EAAI1xG,IAErD8oG,EAAK6I,sBAAuB3xG,GAAM+oG,EAAQyH,QAASxwG,GAOrD,GAAK+oG,EAAQyI,QAAU59G,MAAM+H,QAASotG,EAAQyI,OAAOI,aAAgB,CAEpE,MAAMA,EAAc7I,EAAQyI,OAAOI,YAEnC,GAAK9I,EAAK6I,sBAAsBxhH,SAAWyhH,EAAYzhH,OAAS,CAE/D24G,EAAK+I,sBAAwB,CAAC,EAE9B,IAAM,IAAI7xG,EAAI,EAAG0xG,EAAKE,EAAYzhH,OAAQ6P,EAAI0xG,EAAI1xG,IAEjD8oG,EAAK+I,sBAAuBD,EAAa5xG,IAAQA,CAInD,MAEC4R,QAAQC,KAAM,uEAIhB,CAED,CAEA,SAASigG,EAAoBC,GAE5B,IAAIC,EAEJ,MAAMC,EAAiBF,EAAax/D,YAAcw/D,EAAax/D,WAAYitD,EAAWW,4BActF,GAVC6R,EAFIC,EAEU,SAAWA,EAAe7J,WACpC,IAAM6J,EAAermC,QACrB,IAAMsmC,EAAqBD,EAAezI,YAIhCuI,EAAanmC,QAAU,IAAMsmC,EAAqBH,EAAavI,YAAe,IAAMuI,EAAajgH,UAIlFgB,IAAzBi/G,EAAan/C,QAEjB,IAAM,IAAI5yD,EAAI,EAAG0xG,EAAKK,EAAan/C,QAAQziE,OAAQ6P,EAAI0xG,EAAI1xG,IAE1DgyG,GAAe,IAAME,EAAqBH,EAAan/C,QAAS5yD,IAMlE,OAAOgyG,CAER,CAEA,SAASE,EAAqB1I,GAE7B,IAAI2I,EAAgB,GAEpB,MAAM77G,EAAO9H,OAAO8H,KAAMkzG,GAAat7F,OAEvC,IAAM,IAAIlO,EAAI,EAAG0xG,EAAKp7G,EAAKnG,OAAQ6P,EAAI0xG,EAAI1xG,IAE1CmyG,GAAiB77G,EAAM0J,GAAM,IAAMwpG,EAAYlzG,EAAM0J,IAAQ,IAI9D,OAAOmyG,CAER,CAEA,SAASC,EAA6B7iH,GAKrC,OAASA,GAER,KAAK6/G,UACJ,OAAO,EAAI,IAEZ,KAAKv4G,WACJ,OAAO,EAAI,IAEZ,KAAKw4G,WACJ,OAAO,EAAI,MAEZ,KAAKC,YACJ,OAAO,EAAI,MAEZ,QACC,MAAM,IAAIxpG,MAAO,qEAIpB,CAYA,MAAMusG,EAAkB,IAAI,MAI5B,MAAMzS,EAEL,WAAArwG,CAAay9F,EAAO,CAAC,EAAGzoF,EAAU,CAAC,GAElCrV,KAAK89F,KAAOA,EACZ99F,KAAKqjD,WAAa,CAAC,EACnBrjD,KAAKsW,QAAU,CAAC,EAChBtW,KAAKqV,QAAUA,EAGfrV,KAAKisC,MAAQ,IAAIylE,EAGjB1xG,KAAKojH,aAAe,IAAIt6G,IAGxB9I,KAAKqjH,eAAiB,CAAC,EAGvBrjH,KAAKsjH,UAAY,CAAC,EAGlBtjH,KAAKujH,UAAY,CAAE1Q,KAAM,CAAC,EAAGC,KAAM,CAAC,GACpC9yG,KAAKwjH,YAAc,CAAE3Q,KAAM,CAAC,EAAGC,KAAM,CAAC,GACtC9yG,KAAKyjH,WAAa,CAAE5Q,KAAM,CAAC,EAAGC,KAAM,CAAC,GAErC9yG,KAAK0jH,YAAc,CAAC,EACpB1jH,KAAK2jH,aAAe,CAAC,EAGrB3jH,KAAK4jH,cAAgB,CAAC,EAKtB,IAAIC,GAAW,EACXC,GAAkB,EAClBC,GAAY,EACZC,GAAmB,EAEvB,GAA0B,oBAAdjoG,UAA4B,CAEvC,MAAMC,EAAYD,UAAUC,UAE5B6nG,GAAkE,IAAvD,iCAAiC1/G,KAAM6X,GAClD,MAAMioG,EAAcjoG,EAAUtY,MAAO,kBACrCogH,EAAgBD,GAAYI,EAActgH,SAAUsgH,EAAa,GAAK,KAAS,EAE/EF,EAAY/nG,EAAU9K,QAAS,YAAgB,EAC/C8yG,EAAiBD,EAAY/nG,EAAUtY,MAAO,uBAAyB,IAAQ,CAEhF,CAEkC,oBAAtBwgH,mBAAuCL,GAAYC,EAAgB,IAAUC,GAAaC,EAAiB,GAEtHhkH,KAAK84G,cAAgB,IAAI,MAAe94G,KAAKqV,QAAQi4F,SAIrDttG,KAAK84G,cAAgB,IAAI,MAAmB94G,KAAKqV,QAAQi4F,SAI1DttG,KAAK84G,cAAcqL,eAAgBnkH,KAAKqV,QAAQ09E,aAChD/yF,KAAK84G,cAAc56E,iBAAkBl+B,KAAKqV,QAAQs6F,eAElD3vG,KAAK2wG,WAAa,IAAI,MAAY3wG,KAAKqV,QAAQi4F,SAC/CttG,KAAK2wG,WAAWjB,gBAAiB,eAEC,oBAA7B1vG,KAAKqV,QAAQ09E,aAEjB/yF,KAAK2wG,WAAWf,oBAAoB,EAItC,CAEA,aAAA2B,CAAeluD,GAEdrjD,KAAKqjD,WAAaA,CAEnB,CAEA,UAAAmuD,CAAYl7F,GAEXtW,KAAKsW,QAAUA,CAEhB,CAEA,KAAAmM,CAAOtE,EAAQC,GAEd,MAAMuvF,EAAS3tG,KACT89F,EAAO99F,KAAK89F,KACZz6C,EAAarjD,KAAKqjD,WAGxBrjD,KAAKisC,MAAMyB,YACX1tC,KAAKsjH,UAAY,CAAC,EAGlBtjH,KAAKokH,WAAY,SAAWC,GAE3B,OAAOA,EAAItR,WAAasR,EAAItR,WAE7B,GAEAn5E,QAAQv4B,IAAKrB,KAAKokH,WAAY,SAAWC,GAExC,OAAOA,EAAIC,YAAcD,EAAIC,YAE9B,IAAM7qF,KAAM,WAEX,OAAOG,QAAQv4B,IAAK,CAEnBssG,EAAO4W,gBAAiB,SACxB5W,EAAO4W,gBAAiB,aACxB5W,EAAO4W,gBAAiB,WAI1B,GAAI9qF,KAAM,SAAW+qF,GAEpB,MAAMr7G,EAAS,CACds7G,MAAOD,EAAc,GAAK1mB,EAAK2mB,OAAS,GACxCC,OAAQF,EAAc,GACtBG,WAAYH,EAAc,GAC1BI,QAASJ,EAAc,GACvB/T,MAAO3S,EAAK2S,MACZ9C,OAAQA,EACRwU,SAAU,CAAC,GAOZ,OAJAH,EAAgC3+D,EAAYl6C,EAAQ20F,GAEpDoW,EAAwB/qG,EAAQ20F,GAEzBlkE,QAAQv4B,IAAKssG,EAAOyW,WAAY,SAAWC,GAEjD,OAAOA,EAAIQ,WAAaR,EAAIQ,UAAW17G,EAExC,IAAMswB,KAAM,WAEX,IAAM,MAAMgrF,KAASt7G,EAAOu7G,OAE3BD,EAAMK,oBAIP3mG,EAAQhV,EAET,EAED,GAAIy1B,MAAOxgB,EAEZ,CAOA,SAAA20F,GAEC,MAAMC,EAAWhzG,KAAK89F,KAAK7wD,OAAS,GAC9B83E,EAAW/kH,KAAK89F,KAAKknB,OAAS,GAC9BC,EAAWjlH,KAAK89F,KAAKgc,QAAU,GAIrC,IAAM,IAAIoL,EAAY,EAAGC,EAAaJ,EAAS9jH,OAAQikH,EAAYC,EAAYD,IAAe,CAE7F,MAAME,EAASL,EAAUG,GAAYE,OAErC,IAAM,IAAIt0G,EAAI,EAAG0xG,EAAK4C,EAAOnkH,OAAQ6P,EAAI0xG,EAAI1xG,IAE5CkiG,EAAUoS,EAAQt0G,IAAMu0G,QAAS,CAInC,CAIA,IAAM,IAAIpS,EAAY,EAAGC,EAAaF,EAAS/xG,OAAQgyG,EAAYC,EAAYD,IAAe,CAE7F,MAAME,EAAUH,EAAUC,QAEJrvG,IAAjBuvG,EAAQyG,OAEZ55G,KAAKozG,YAAapzG,KAAKujH,UAAWpQ,EAAQyG,WAKpBh2G,IAAjBuvG,EAAQmS,OAEZL,EAAU9R,EAAQyG,MAAO2L,eAAgB,SAMnB3hH,IAAnBuvG,EAAQqS,QAEZxlH,KAAKozG,YAAapzG,KAAKwjH,YAAarQ,EAAQqS,OAI9C,CAED,CAeA,WAAApS,CAAannE,EAAO3iC,QAEJ1F,IAAV0F,SAEwB1F,IAAxBqoC,EAAM4mE,KAAMvpG,KAEhB2iC,EAAM4mE,KAAMvpG,GAAU2iC,EAAM6mE,KAAMxpG,GAAU,GAI7C2iC,EAAM4mE,KAAMvpG,KAEb,CAWA,WAAAirG,CAAatoE,EAAO3iC,EAAOL,GAE1B,GAAKgjC,EAAM4mE,KAAMvpG,IAAW,EAAI,OAAOL,EAEvC,MAAM64B,EAAM74B,EAAOypE,QAIb+yC,EAAiB,CAAEC,EAAUhzC,KAElC,MAAMizC,EAAW3lH,KAAKojH,aAAa5hH,IAAKkkH,GACvB,MAAZC,GAEJ3lH,KAAKojH,aAAa35G,IAAKipE,EAAOizC,GAI/B,IAAM,MAAQ70G,EAAG08B,KAAWk4E,EAASp8F,SAASjgB,UAE7Co8G,EAAgBj4E,EAAOklC,EAAMppD,SAAUxY,KAUzC,OAJA20G,EAAgBx8G,EAAQ64B,GAExBA,EAAIxgC,MAAQ,aAAiB2qC,EAAM6mE,KAAMxpG,KAElCw4B,CAER,CAEA,UAAA8jF,CAAYpgH,GAEX,MAAM69C,EAAa/jD,OAAO8nB,OAAQpnB,KAAKsW,SACvC+sC,EAAW34C,KAAM1K,MAEjB,IAAM,IAAI8Q,EAAI,EAAGA,EAAIuyC,EAAWpiD,OAAQ6P,IAAO,CAE9C,MAAM3H,EAAS3D,EAAM69C,EAAYvyC,IAEjC,GAAK3H,EAAS,OAAOA,CAEtB,CAEA,OAAO,IAER,CAEA,UAAAi7G,CAAY5+G,GAEX,MAAM69C,EAAa/jD,OAAO8nB,OAAQpnB,KAAKsW,SACvC+sC,EAAW9V,QAASvtC,MAEpB,MAAM40G,EAAU,GAEhB,IAAM,IAAI9jG,EAAI,EAAGA,EAAIuyC,EAAWpiD,OAAQ6P,IAAO,CAE9C,MAAM3H,EAAS3D,EAAM69C,EAAYvyC,IAE5B3H,GAASyrG,EAAQlqG,KAAMvB,EAE7B,CAEA,OAAOyrG,CAER,CAUA,aAAAP,CAAep0G,EAAMqJ,GAEpB,MAAMiqG,EAAWtzG,EAAO,IAAMqJ,EAC9B,IAAIkqG,EAAaxzG,KAAKisC,MAAMzqC,IAAK+xG,GAEjC,IAAOC,EAAa,CAEnB,OAASvzG,GAER,IAAK,QACJuzG,EAAaxzG,KAAK6lH,UAAWv8G,GAC7B,MAED,IAAK,OACJkqG,EAAaxzG,KAAK4lH,WAAY,SAAWvB,GAExC,OAAOA,EAAIyB,UAAYzB,EAAIyB,SAAUx8G,EAEtC,GACA,MAED,IAAK,OACJkqG,EAAaxzG,KAAK4lH,WAAY,SAAWvB,GAExC,OAAOA,EAAI0B,UAAY1B,EAAI0B,SAAUz8G,EAEtC,GACA,MAED,IAAK,WACJkqG,EAAaxzG,KAAKgmH,aAAc18G,GAChC,MAED,IAAK,aACJkqG,EAAaxzG,KAAK4lH,WAAY,SAAWvB,GAExC,OAAOA,EAAIpL,gBAAkBoL,EAAIpL,eAAgB3vG,EAElD,GACA,MAED,IAAK,SACJkqG,EAAaxzG,KAAKimH,WAAY38G,GAC9B,MAED,IAAK,WACJkqG,EAAaxzG,KAAK4lH,WAAY,SAAWvB,GAExC,OAAOA,EAAI6B,cAAgB7B,EAAI6B,aAAc58G,EAE9C,GACA,MAED,IAAK,UACJkqG,EAAaxzG,KAAK4lH,WAAY,SAAWvB,GAExC,OAAOA,EAAI7L,aAAe6L,EAAI7L,YAAalvG,EAE5C,GACA,MAED,IAAK,OACJkqG,EAAaxzG,KAAKmmH,SAAU78G,GAC5B,MAED,IAAK,YACJkqG,EAAaxzG,KAAK4lH,WAAY,SAAWvB,GAExC,OAAOA,EAAI+B,eAAiB/B,EAAI+B,cAAe98G,EAEhD,GACA,MAED,IAAK,SACJkqG,EAAaxzG,KAAKqmH,WAAY/8G,GAC9B,MAED,QAOC,GANAkqG,EAAaxzG,KAAK4lH,WAAY,SAAWvB,GAExC,OAAOA,GAAOrkH,MAAQqkH,EAAIhQ,eAAiBgQ,EAAIhQ,cAAep0G,EAAMqJ,EAErE,IAEOkqG,EAEN,MAAM,IAAI58F,MAAO,iBAAmB3W,GAQvCD,KAAKisC,MAAMpxB,IAAK04F,EAAUC,EAE3B,CAEA,OAAOA,CAER,CASA,eAAA+Q,CAAiBtkH,GAEhB,IAAIukH,EAAexkH,KAAKisC,MAAMzqC,IAAKvB,GAEnC,IAAOukH,EAAe,CAErB,MAAM7W,EAAS3tG,KACTsmH,EAAOtmH,KAAK89F,KAAM79F,GAAkB,SAATA,EAAkB,KAAO,OAAW,GAErEukH,EAAe5qF,QAAQv4B,IAAKilH,EAAKvjH,IAAK,SAAWwjH,EAAKj9G,GAErD,OAAOqkG,EAAO0G,cAAep0G,EAAMqJ,EAEpC,IAEAtJ,KAAKisC,MAAMpxB,IAAK5a,EAAMukH,EAEvB,CAEA,OAAOA,CAER,CASA,UAAAyB,CAAYO,GAEX,MAAMC,EAAYzmH,KAAK89F,KAAK4oB,QAASF,GAC/BhX,EAASxvG,KAAK2wG,WAEpB,GAAK8V,EAAUxmH,MAA2B,gBAAnBwmH,EAAUxmH,KAEhC,MAAM,IAAI2W,MAAO,qBAAuB6vG,EAAUxmH,KAAO,kCAK1D,QAAuB2D,IAAlB6iH,EAAU1N,KAAqC,IAAhByN,EAEnC,OAAO5sF,QAAQuR,QAASnrC,KAAKqjD,WAAYitD,EAAWC,iBAAkBl/F,MAIvE,MAAMgE,EAAUrV,KAAKqV,QAErB,OAAO,IAAIukB,QAAS,SAAWuR,EAAS8J,GAEvCu6D,EAAOX,KAAM,MAAYM,WAAYsX,EAAU1N,IAAK1jG,EAAQqhC,MAAQvL,OAASvnC,EAAW,WAEvFqxC,EAAQ,IAAIr+B,MAAO,4CAA8C6vG,EAAU1N,IAAM,MAElF,EAED,EAED,CASA,cAAAE,CAAgBmD,GAEf,MAAMuK,EAAgB3mH,KAAK89F,KAAKqb,YAAaiD,GAE7C,OAAOp8G,KAAKq0G,cAAe,SAAUsS,EAAcv6G,QAASqtB,KAAM,SAAWrtB,GAE5E,MAAMY,EAAa25G,EAAc35G,YAAc,EACzCC,EAAa05G,EAAc15G,YAAc,EAC/C,OAAOb,EAAOU,MAAOG,EAAYA,EAAaD,EAE/C,EAED,CASA,YAAAg5G,CAAcY,GAEb,MAAMjZ,EAAS3tG,KACT89F,EAAO99F,KAAK89F,KAEZ6e,EAAc38G,KAAK89F,KAAK8e,UAAWgK,GAEzC,QAAgChjH,IAA3B+4G,EAAYzD,iBAAmDt1G,IAAvB+4G,EAAYkK,OAAuB,CAE/E,MAAMvL,EAAWmF,EAAkB9D,EAAY18G,MACzC6mH,EAAahK,EAAuBH,EAAYE,eAChDtB,GAAwC,IAA3BoB,EAAYpB,WAEzBhxG,EAAQ,IAAIu8G,EAAYnK,EAAYruG,MAAQgtG,GAClD,OAAO1hF,QAAQuR,QAAS,IAAI,MAAiB5gC,EAAO+wG,EAAUC,GAE/D,CAEA,MAAMwL,EAAqB,GAmB3B,YAjBgCnjH,IAA3B+4G,EAAYzD,WAEhB6N,EAAmBr8G,KAAM1K,KAAKq0G,cAAe,aAAcsI,EAAYzD,aAIvE6N,EAAmBr8G,KAAM,WAIE9G,IAAvB+4G,EAAYkK,SAEhBE,EAAmBr8G,KAAM1K,KAAKq0G,cAAe,aAAcsI,EAAYkK,OAAOnqC,QAAQw8B,aACtF6N,EAAmBr8G,KAAM1K,KAAKq0G,cAAe,aAAcsI,EAAYkK,OAAOz/F,OAAO8xF,cAI/Et/E,QAAQv4B,IAAK0lH,GAAqBttF,KAAM,SAAW0/E,GAEzD,MAAMD,EAAaC,EAAa,GAE1BmC,EAAWmF,EAAkB9D,EAAY18G,MACzC6mH,EAAahK,EAAuBH,EAAYE,eAGhDmK,EAAeF,EAAWG,kBAC1BC,EAAYF,EAAe1L,EAC3BruG,EAAa0vG,EAAY1vG,YAAc,EACvCusG,OAAwC51G,IAA3B+4G,EAAYzD,WAA2Bpb,EAAKqb,YAAawD,EAAYzD,YAAaM,gBAAa51G,EAC5G23G,GAAwC,IAA3BoB,EAAYpB,WAC/B,IAAIhxG,EAAO48G,EAGX,GAAK3N,GAAcA,IAAe0N,EAAY,CAI7C,MAAME,EAAU3+G,KAAK2oB,MAAOnkB,EAAausG,GACnC6N,EAAa,qBAAuB1K,EAAYzD,WAAa,IAAMyD,EAAYE,cAAgB,IAAMuK,EAAU,IAAMzK,EAAYruG,MACvI,IAAIg5G,EAAK3Z,EAAO1hE,MAAMzqC,IAAK6lH,GAEpBC,IAEN/8G,EAAQ,IAAIu8G,EAAY5N,EAAYkO,EAAU5N,EAAYmD,EAAYruG,MAAQkrG,EAAawN,GAG3FM,EAAK,IAAI,MAAmB/8G,EAAOivG,EAAawN,GAEhDrZ,EAAO1hE,MAAMpxB,IAAKwsG,EAAYC,IAI/BH,EAAkB,IAAI,MAA4BG,EAAIhM,EAAYruG,EAAausG,EAAewN,EAAczL,EAE7G,MAIEhxG,EAFmB,OAAf2uG,EAEI,IAAI4N,EAAYnK,EAAYruG,MAAQgtG,GAIpC,IAAIwL,EAAY5N,EAAYjsG,EAAY0vG,EAAYruG,MAAQgtG,GAIrE6L,EAAkB,IAAI,MAAiB58G,EAAO+wG,EAAUC,GAKzD,QAA4B33G,IAAvB+4G,EAAYkK,OAAuB,CAEvC,MAAMU,EAAkB9G,EAAiB+G,OACnCC,EAAoB3K,EAAuBH,EAAYkK,OAAOnqC,QAAQmgC,eAEtE6K,EAAoB/K,EAAYkK,OAAOnqC,QAAQzvE,YAAc,EAC7D06G,EAAmBhL,EAAYkK,OAAOz/F,OAAOna,YAAc,EAE3D26G,EAAgB,IAAIH,EAAmBtO,EAAa,GAAKuO,EAAmB/K,EAAYkK,OAAOv4G,MAAQi5G,GACvGM,EAAe,IAAIf,EAAY3N,EAAa,GAAKwO,EAAkBhL,EAAYkK,OAAOv4G,MAAQgtG,GAEhF,OAAfpC,IAGJiO,EAAkB,IAAI,MAAiBA,EAAgB58G,MAAMuC,QAASq6G,EAAgB7L,SAAU6L,EAAgB5L,aAKjH4L,EAAgB5L,YAAa,EAE7B,IAAM,IAAIzqG,EAAI,EAAG0xG,EAAKoF,EAAc3mH,OAAQ6P,EAAI0xG,EAAI1xG,IAAO,CAE1D,MAAMxH,EAAQs+G,EAAe92G,GAM7B,GAJAq2G,EAAgBW,KAAMx+G,EAAOu+G,EAAc/2G,EAAIwqG,IAC1CA,GAAY,GAAI6L,EAAgBY,KAAMz+G,EAAOu+G,EAAc/2G,EAAIwqG,EAAW,IAC1EA,GAAY,GAAI6L,EAAgBa,KAAM1+G,EAAOu+G,EAAc/2G,EAAIwqG,EAAW,IAC1EA,GAAY,GAAI6L,EAAgBc,KAAM3+G,EAAOu+G,EAAc/2G,EAAIwqG,EAAW,IAC1EA,GAAY,EAAI,MAAM,IAAI1kG,MAAO,oEAEvC,CAEAuwG,EAAgB5L,WAAaA,CAE9B,CAEA,OAAO4L,CAER,EAED,CASA,WAAA3O,CAAaC,GAEZ,MAAM3a,EAAO99F,KAAK89F,KACZzoF,EAAUrV,KAAKqV,QAEf+iE,EADa0lB,EAAK6a,SAAUF,GACHn2G,OACzB4lH,EAAYpqB,EAAK+a,OAAQzgC,GAE/B,IAAIo3B,EAASxvG,KAAK84G,cAElB,GAAKoP,EAAUnP,IAAM,CAEpB,MAAMrjE,EAAUrgC,EAAQi4F,QAAQ0L,WAAYkP,EAAUnP,KACrC,OAAZrjE,IAAmB85D,EAAS95D,EAElC,CAEA,OAAO11C,KAAK44G,iBAAkBH,EAAcrgC,EAAao3B,EAE1D,CAEA,gBAAAoJ,CAAkBH,EAAcrgC,EAAao3B,GAE5C,MAAM7B,EAAS3tG,KACT89F,EAAO99F,KAAK89F,KAEZ4a,EAAa5a,EAAK6a,SAAUF,GAC5ByP,EAAYpqB,EAAK+a,OAAQzgC,GAEzBm7B,GAAa2U,EAAUnP,KAAOmP,EAAUhP,YAAe,IAAMR,EAAWyP,QAE9E,GAAKnoH,KAAK2jH,aAAcpQ,GAGvB,OAAOvzG,KAAK2jH,aAAcpQ,GAI3B,MAAMr6D,EAAUl5C,KAAKooH,gBAAiBhwC,EAAao3B,GAAS/1E,KAAM,SAAWwjF,GAE5EA,EAAQr3F,OAAQ,EAEhBq3F,EAAQ37G,KAAOo3G,EAAWp3G,MAAQ4mH,EAAU5mH,MAAQ,GAE9B,KAAjB27G,EAAQ37G,MAAwC,iBAAlB4mH,EAAUnP,MAAkE,IAA9CmP,EAAUnP,IAAI/0G,WAAY,iBAE1Fi5G,EAAQ37G,KAAO4mH,EAAUnP,KAI1B,MACMoP,GADWrqB,EAAKuqB,UAAY,CAAC,GACT3P,EAAWyP,UAAa,CAAC,EAUnD,OARAlL,EAAQqL,UAAY/H,EAAe4H,EAAQG,YAAe,MAC1DrL,EAAQsL,UAAYhI,EAAe4H,EAAQI,YAAe,MAC1DtL,EAAQuL,MAAQhI,EAAiB2H,EAAQK,QAAW,MACpDvL,EAAQwL,MAAQjI,EAAiB2H,EAAQM,QAAW,MACpDxL,EAAQyL,iBAAoBzL,EAAQ0L,qBAAuB1L,EAAQsL,YAAc,OAAiBtL,EAAQsL,YAAc,MAExH5a,EAAOyV,aAAa35G,IAAKwzG,EAAS,CAAEtE,SAAUF,IAEvCwE,CAER,GAAIr+E,MAAO,WAEV,OAAO,IAER,GAIA,OAFA5+B,KAAK2jH,aAAcpQ,GAAar6D,EAEzBA,CAER,CAEA,eAAAkvE,CAAiBhwC,EAAao3B,GAE7B,MACM1R,EAAO99F,KAAK89F,KACZzoF,EAAUrV,KAAKqV,QAErB,QAAyCzR,IAApC5D,KAAK0jH,YAAatrC,GAEtB,OAAOp4E,KAAK0jH,YAAatrC,GAAc3+C,KAAQwjF,GAAaA,EAAQvqC,SAIrE,MAAMw1C,EAAYpqB,EAAK+a,OAAQzgC,GAEzBjgD,EAAMvyB,KAAKuyB,KAAOvyB,KAAKuoF,UAE7B,IAAIy6B,EAAYV,EAAUnP,KAAO,GAC7B8P,GAAc,EAElB,QAA8BjlH,IAAzBskH,EAAUhP,WAId0P,EArBc5oH,KAqBKq0G,cAAe,aAAc6T,EAAUhP,YAAaz/E,KAAM,SAAWy/E,GAEvF2P,GAAc,EACd,MAAMC,EAAO,IAAIhxB,KAAM,CAAEohB,GAAc,CAAEj5G,KAAMioH,EAAUrvB,WAEzD,OADA+vB,EAAYzwF,EAAI4wF,gBAAiBD,GAC1BF,CAER,QAEM,QAAuBhlH,IAAlBskH,EAAUnP,IAErB,MAAM,IAAIniG,MAAO,2BAA6BwhE,EAAc,kCAI7D,MAAMl/B,EAAUtf,QAAQuR,QAASy9E,GAAYnvF,KAAM,SAAWmvF,GAE7D,OAAO,IAAIhvF,QAAS,SAAWuR,EAAS8J,GAEvC,IAAI92B,EAASgtB,GAEuB,IAA/BqkE,EAAOwZ,sBAEX7qG,EAAS,SAAW8qG,GAEnB,MAAMhM,EAAU,IAAI,MAASgM,GAC7BhM,EAAQK,aAAc,EAEtBnyE,EAAS8xE,EAEV,GAIDzN,EAAOX,KAAM,MAAYM,WAAYyZ,EAAWvzG,EAAQqhC,MAAQv4B,OAAQva,EAAWqxC,EAEpF,EAED,GAAIxb,KAAM,SAAWwjF,GA/yBvB,IAA8BlE,EA6zB3B,OAVqB,IAAhB8P,GAEJ1wF,EAAI+wF,gBAAiBN,GAItB1U,EAAwB+I,EAASiL,GAEjCjL,EAAQkF,SAAStpB,SAAWqvB,EAAUrvB,YA3zBXkgB,EA2zB4CmP,EAAUnP,KAzzB1Ej9E,OAAQ,kBAAqB,GAA4C,IAAvCi9E,EAAIj9E,OAAQ,sBAAsC,aACxFi9E,EAAIj9E,OAAQ,iBAAoB,GAA4C,IAAvCi9E,EAAIj9E,OAAQ,sBAAsC,aACvFi9E,EAAIj9E,OAAQ,iBAAoB,GAA4C,IAAvCi9E,EAAIj9E,OAAQ,sBAAsC,aAErF,aAuzBEmhF,CAER,GAAIr+E,MAAO,SAAW5D,GAGrB,MADAtY,QAAQsY,MAAO,0CAA4C4tF,GACrD5tF,CAEP,GAGA,OADAh7B,KAAK0jH,YAAatrC,GAAgBl/B,EAC3BA,CAER,CAYA,aAAA+7D,CAAeP,EAAgByU,EAASC,EAAQC,GAE/C,MAAM1b,EAAS3tG,KAEf,OAAOA,KAAKq0G,cAAe,UAAW+U,EAAO9/G,OAAQmwB,KAAM,SAAWwjF,GAErE,IAAOA,EAAU,OAAO,KASxB,QAPyBr5G,IAApBwlH,EAAOlM,UAA0BkM,EAAOlM,SAAW,KAEvDD,EAAUA,EAAQvqC,SACVyqC,QAAUiM,EAAOlM,UAIrBvP,EAAOtqD,WAAYitD,EAAWa,uBAA0B,CAE5D,MAAM1rG,OAAkC7B,IAAtBwlH,EAAO/lE,WAA2B+lE,EAAO/lE,WAAYitD,EAAWa,4BAA0BvtG,EAE5G,GAAK6B,EAAY,CAEhB,MAAM6jH,EAAgB3b,EAAOyV,aAAa5hH,IAAKy7G,GAC/CA,EAAUtP,EAAOtqD,WAAYitD,EAAWa,uBAAwB6L,cAAeC,EAASx3G,GACxFkoG,EAAOyV,aAAa35G,IAAKwzG,EAASqM,EAEnC,CAED,CAUA,YARoB1lH,IAAfylH,IAEJpM,EAAQoM,WAAaA,GAItB3U,EAAgByU,GAAYlM,EAErBA,CAER,EAED,CAYA,mBAAAzB,CAAqB5B,GAEpB,MAAM/M,EAAW+M,EAAK/M,SACtB,IAAIgO,EAAWjB,EAAKiB,SAEpB,MAAM0O,OAAwD3lH,IAAhCipG,EAASyN,WAAWkP,QAC5CC,OAAgD7lH,IAA9BipG,EAASyN,WAAWz3G,MACtC6mH,OAAgD9lH,IAA/BipG,EAASyN,WAAWp/C,OAE3C,GAAK0+C,EAAK+P,SAAW,CAEpB,MAAMpW,EAAW,kBAAoBsH,EAAShyB,KAE9C,IAAI+gC,EAAiB5pH,KAAKisC,MAAMzqC,IAAK+xG,GAE9BqW,IAENA,EAAiB,IAAI,MACrB,MAASzpH,UAAU85D,KAAKl6D,KAAM6pH,EAAgB/O,GAC9C+O,EAAe/mH,MAAMo3D,KAAM4gD,EAASh4G,OACpC+mH,EAAe7mH,IAAM83G,EAAS93G,IAC9B6mH,EAAeC,iBAAkB,EAEjC7pH,KAAKisC,MAAMpxB,IAAK04F,EAAUqW,IAI3B/O,EAAW+O,CAEZ,MAAO,GAAKhQ,EAAKkQ,OAAS,CAEzB,MAAMvW,EAAW,qBAAuBsH,EAAShyB,KAEjD,IAAIkhC,EAAe/pH,KAAKisC,MAAMzqC,IAAK+xG,GAE5BwW,IAENA,EAAe,IAAI,MACnB,MAAS5pH,UAAU85D,KAAKl6D,KAAMgqH,EAAclP,GAC5CkP,EAAalnH,MAAMo3D,KAAM4gD,EAASh4G,OAClCknH,EAAahnH,IAAM83G,EAAS93G,IAE5B/C,KAAKisC,MAAMpxB,IAAK04F,EAAUwW,IAI3BlP,EAAWkP,CAEZ,CAGA,GAAKR,GAAyBE,GAAmBC,EAAiB,CAEjE,IAAInW,EAAW,kBAAoBsH,EAAShyB,KAAO,IAE9C0gC,IAAwBhW,GAAY,wBACpCkW,IAAkBlW,GAAY,kBAC9BmW,IAAiBnW,GAAY,iBAElC,IAAIyW,EAAiBhqH,KAAKisC,MAAMzqC,IAAK+xG,GAE9ByW,IAENA,EAAiBnP,EAASnoC,QAErB+2C,IAAkBO,EAAeC,cAAe,GAChDP,IAAiBM,EAAeE,aAAc,GAE9CX,IAGCS,EAAeG,cAAcH,EAAeG,YAAYjyG,IAAO,GAC/D8xG,EAAelU,uBAAuBkU,EAAelU,qBAAqB59F,IAAO,IAIvFlY,KAAKisC,MAAMpxB,IAAK04F,EAAUyW,GAE1BhqH,KAAKojH,aAAa35G,IAAKugH,EAAgBhqH,KAAKojH,aAAa5hH,IAAKq5G,KAI/DA,EAAWmP,CAEZ,CAEApQ,EAAKiB,SAAWA,CAEjB,CAEA,eAAArG,GAEC,OAAO,KAER,CASA,YAAA0R,CAAc/Q,GAEb,MAAMxH,EAAS3tG,KACT89F,EAAO99F,KAAK89F,KACZz6C,EAAarjD,KAAKqjD,WAClBsxD,EAAc7W,EAAKsX,UAAWD,GAEpC,IAAIiV,EACJ,MAAM1V,EAAiB,CAAC,EAGlBE,EAAU,GAEhB,IAJ2BD,EAAYtxD,YAAc,CAAC,GAI7BitD,EAAWS,qBAAwB,CAE3D,MAAMsZ,EAAehnE,EAAYitD,EAAWS,qBAC5CqZ,EAAeC,EAAa7V,kBAC5BI,EAAQlqG,KAAM2/G,EAAa5V,aAAcC,EAAgBC,EAAahH,GAEvE,KAAO,CAKN,MAAMkH,EAAoBF,EAAYG,sBAAwB,CAAC,EAK/D,GAHAJ,EAAe7xG,MAAQ,IAAI,MAAO,EAAK,EAAK,GAC5C6xG,EAAel7E,QAAU,EAEpB90B,MAAM+H,QAASooG,EAAkBE,iBAAoB,CAEzD,MAAMxqG,EAAQsqG,EAAkBE,gBAEhCL,EAAe7xG,MAAM+wG,OAAQrpG,EAAO,GAAKA,EAAO,GAAKA,EAAO,GAAK,OACjEmqG,EAAel7E,QAAUjvB,EAAO,EAEjC,MAE4C3G,IAAvCixG,EAAkBG,kBAEtBJ,EAAQlqG,KAAMijG,EAAOsH,cAAeP,EAAgB,MAAOG,EAAkBG,iBAAkB,QAIhGN,EAAekN,eAAiDh+G,IAArCixG,EAAkByV,eAA+BzV,EAAkByV,eAAiB,EAC/G5V,EAAemN,eAAkDj+G,IAAtCixG,EAAkB0V,gBAAgC1V,EAAkB0V,gBAAkB,OAE7D3mH,IAA/CixG,EAAkB2V,2BAEtB5V,EAAQlqG,KAAMijG,EAAOsH,cAAeP,EAAgB,eAAgBG,EAAkB2V,2BACtF5V,EAAQlqG,KAAMijG,EAAOsH,cAAeP,EAAgB,eAAgBG,EAAkB2V,4BAIvFJ,EAAepqH,KAAK4lH,WAAY,SAAWvB,GAE1C,OAAOA,EAAI7P,iBAAmB6P,EAAI7P,gBAAiBW,EAEpD,GAEAP,EAAQlqG,KAAMkvB,QAAQv4B,IAAKrB,KAAKokH,WAAY,SAAWC,GAEtD,OAAOA,EAAInP,sBAAwBmP,EAAInP,qBAAsBC,EAAeT,EAE7E,IAED,EAEiC,IAA5BC,EAAY8V,cAEhB/V,EAAeqN,KAAO,OAIvB,MAAM2I,EAAY/V,EAAY+V,WAr1CvB,SA02CP,GAx2CM,UAq1CDA,GAEJhW,EAAev7C,aAAc,EAG7Bu7C,EAAeiW,YAAa,IAI5BjW,EAAev7C,aAAc,EA/1CzB,SAi2CCuxD,IAEJhW,EAAekW,eAAwChnH,IAA5B+wG,EAAYkW,YAA4BlW,EAAYkW,YAAc,UAM5DjnH,IAA9B+wG,EAAYmW,eAA+BV,IAAiB,QAEhExV,EAAQlqG,KAAMijG,EAAOsH,cAAeP,EAAgB,YAAaC,EAAYmW,gBAE7EpW,EAAeyV,YAAc,IAAI,MAAS,EAAG,QAEJvmH,IAApC+wG,EAAYmW,cAAcvuG,OAAsB,CAEpD,MAAMA,EAAQo4F,EAAYmW,cAAcvuG,MAExCm4F,EAAeyV,YAAY1gH,IAAK8S,EAAOA,EAExC,CAgBD,QAZsC3Y,IAAjC+wG,EAAYoW,kBAAkCX,IAAiB,QAEnExV,EAAQlqG,KAAMijG,EAAOsH,cAAeP,EAAgB,QAASC,EAAYoW,wBAE1BnnH,IAA1C+wG,EAAYoW,iBAAiBC,WAEjCtW,EAAeuW,eAAiBtW,EAAYoW,iBAAiBC,gBAM3BpnH,IAA/B+wG,EAAYuW,gBAAgCd,IAAiB,MAAoB,CAErF,MAAMc,EAAiBvW,EAAYuW,eACnCxW,EAAeiN,UAAW,IAAI,OAAQ/N,OAAQsX,EAAgB,GAAKA,EAAgB,GAAKA,EAAgB,GAAK,MAE9G,CAQA,YANqCtnH,IAAhC+wG,EAAYwW,iBAAiCf,IAAiB,OAElExV,EAAQlqG,KAAMijG,EAAOsH,cAAeP,EAAgB,cAAeC,EAAYwW,gBAAiB,QAI1FvxF,QAAQv4B,IAAKuzG,GAAUn7E,KAAM,WAEnC,MAAMohF,EAAW,IAAIuP,EAAc1V,GAUnC,OARKC,EAAYrzG,OAAOu5G,EAASv5G,KAAOqzG,EAAYrzG,MAEpD4yG,EAAwB2G,EAAUlG,GAElChH,EAAOyV,aAAa35G,IAAKoxG,EAAU,CAAEzF,UAAWD,IAE3CR,EAAYtxD,YAAa2+D,EAAgC3+D,EAAYw3D,EAAUlG,GAE7EkG,CAER,EAED,CASA,gBAAAzG,CAAkBgX,GAEjB,MAAMC,EAAgB,MAAgBC,iBAAkBF,GAAgB,IAExE,OAAKC,KAAiBrrH,KAAK4jH,cAEnByH,EAAgB,OAAWrrH,KAAK4jH,cAAeyH,IAItDrrH,KAAK4jH,cAAeyH,GAAkB,EAE/BA,EAIT,CAWA,cAAAE,CAAgBvR,GAEf,MAAMrM,EAAS3tG,KACTqjD,EAAarjD,KAAKqjD,WAClBpX,EAAQjsC,KAAKqjH,eAEnB,SAASmI,EAAsBzR,GAE9B,OAAO12D,EAAYitD,EAAWW,4BAC5BkL,gBAAiBpC,EAAWpM,GAC5Bl0E,KAAM,SAAWozE,GAEjB,OAAO4e,EAAwB5e,EAAUkN,EAAWpM,EAErD,EAEF,CAEA,MAAMiH,EAAU,GAEhB,IAAM,IAAI9jG,EAAI,EAAG0xG,EAAKxI,EAAW/4G,OAAQ6P,EAAI0xG,EAAI1xG,IAAO,CAEvD,MAAMipG,EAAYC,EAAYlpG,GACxByiG,EAAWqP,EAAoB7I,GAG/B2R,EAASz/E,EAAOsnE,GAEtB,GAAKmY,EAGJ9W,EAAQlqG,KAAMghH,EAAOxyE,aAEf,CAEN,IAAIyyE,EAKHA,EAHI5R,EAAU12D,YAAc02D,EAAU12D,WAAYitD,EAAWW,4BAG3Cua,EAAsBzR,GAKtB0R,EAAwB,IAAI,MAAkB1R,EAAWpM,GAK5E1hE,EAAOsnE,GAAa,CAAEwG,UAAWA,EAAW7gE,QAASyyE,GAErD/W,EAAQlqG,KAAMihH,EAEf,CAED,CAEA,OAAO/xF,QAAQv4B,IAAKuzG,EAErB,CASA,QAAAmR,CAAU6F,GAET,MAAMje,EAAS3tG,KACT89F,EAAO99F,KAAK89F,KACZz6C,EAAarjD,KAAKqjD,WAElBw2D,EAAU/b,EAAKgc,OAAQ8R,GACvB5R,EAAaH,EAAQG,WAErBpF,EAAU,GAEhB,IAAM,IAAI9jG,EAAI,EAAG0xG,EAAKxI,EAAW/4G,OAAQ6P,EAAI0xG,EAAI1xG,IAAO,CAEvD,MAAM+pG,OAAwCj3G,IAA7Bo2G,EAAYlpG,GAAI+pG,SAC9B6G,EAAuB1hH,KAAKisC,OAC5BjsC,KAAKq0G,cAAe,WAAY2F,EAAYlpG,GAAI+pG,UAEnDjG,EAAQlqG,KAAMmwG,EAEf,CAIA,OAFAjG,EAAQlqG,KAAMijG,EAAO4d,eAAgBvR,IAE9BpgF,QAAQv4B,IAAKuzG,GAAUn7E,KAAM,SAAW+gF,GAE9C,MAAMpF,EAAYoF,EAAQ1tG,MAAO,EAAG0tG,EAAQv5G,OAAS,GAC/C4qH,EAAarR,EAASA,EAAQv5G,OAAS,GAEvC64G,EAAS,GAEf,IAAM,IAAIhpG,EAAI,EAAG0xG,EAAKqJ,EAAW5qH,OAAQ6P,EAAI0xG,EAAI1xG,IAAO,CAEvD,MAAM+7F,EAAWgf,EAAY/6G,GACvBipG,EAAYC,EAAYlpG,GAI9B,IAAI8oG,EAEJ,MAAMiB,EAAWzF,EAAWtkG,GAE5B,GAAKipG,EAAUn3G,OAASq3G,EAAgBC,WACtCH,EAAUn3G,OAASq3G,EAAgBE,gBACnCJ,EAAUn3G,OAASq3G,EAAgBG,mBAChBx2G,IAAnBm2G,EAAUn3G,KAGXg3G,GAAiC,IAA1BC,EAAQ0L,cACZ,IAAI,MAAa1Y,EAAUgO,GAC3B,IAAI,MAAMhO,EAAUgO,IAEK,IAAvBjB,EAAK2L,eAGT3L,EAAKkS,uBAID/R,EAAUn3G,OAASq3G,EAAgBE,eAEvCP,EAAK/M,SAAWD,EAAqBgN,EAAK/M,SAAU,OAEzCkN,EAAUn3G,OAASq3G,EAAgBG,eAE9CR,EAAK/M,SAAWD,EAAqBgN,EAAK/M,SAAU,aAI/C,GAAKkN,EAAUn3G,OAASq3G,EAAgB4F,MAE9CjG,EAAO,IAAI,MAAc/M,EAAUgO,QAE7B,GAAKd,EAAUn3G,OAASq3G,EAAgB8F,WAE9CnG,EAAO,IAAI,MAAM/M,EAAUgO,QAErB,GAAKd,EAAUn3G,OAASq3G,EAAgB6F,UAE9ClG,EAAO,IAAI,MAAU/M,EAAUgO,OAEzB,IAAKd,EAAUn3G,OAASq3G,EAAgB2F,OAM9C,MAAM,IAAIhpG,MAAO,iDAAmDmjG,EAAUn3G,MAJ9Eg3G,EAAO,IAAI,MAAQ/M,EAAUgO,EAM9B,CAEKv7G,OAAO8H,KAAMwyG,EAAK/M,SAASkf,iBAAkB9qH,OAAS,GAE1DshH,EAAoB3I,EAAMC,GAI3BD,EAAKt4G,KAAOqsG,EAAOyG,iBAAkByF,EAAQv4G,MAAU,QAAUsqH,GAEjE1X,EAAwB0F,EAAMC,GAEzBE,EAAU12D,YAAa2+D,EAAgC3+D,EAAYu2D,EAAMG,GAE9EpM,EAAO6N,oBAAqB5B,GAE5BE,EAAOpvG,KAAMkvG,EAEd,CAEA,IAAM,IAAI9oG,EAAI,EAAG0xG,EAAK1I,EAAO74G,OAAQ6P,EAAI0xG,EAAI1xG,IAE5C68F,EAAOyV,aAAa35G,IAAKqwG,EAAQhpG,GAAK,CACrCgpG,OAAQ8R,EACR5R,WAAYlpG,IAKd,GAAuB,IAAlBgpG,EAAO74G,OAIX,OAFK44G,EAAQx2D,YAAa2+D,EAAgC3+D,EAAYy2D,EAAQ,GAAKD,GAE5EC,EAAQ,GAIhB,MAAMkS,EAAQ,IAAI,MAEbnS,EAAQx2D,YAAa2+D,EAAgC3+D,EAAY2oE,EAAOnS,GAE7ElM,EAAOyV,aAAa35G,IAAKuiH,EAAO,CAAElS,OAAQ8R,IAE1C,IAAM,IAAI96G,EAAI,EAAG0xG,EAAK1I,EAAO74G,OAAQ6P,EAAI0xG,EAAI1xG,IAE5Ck7G,EAAMnxG,IAAKi/F,EAAQhpG,IAIpB,OAAOk7G,CAER,EAED,CASA,UAAA3F,CAAY4F,GAEX,IAAIzG,EACJ,MAAM0G,EAAYlsH,KAAK89F,KAAK8mB,QAASqH,GAC/B/hE,EAASgiE,EAAWA,EAAUjsH,MAEpC,GAAOiqD,EAqBP,MAdwB,gBAAnBgiE,EAAUjsH,KAEdulH,EAAS,IAAI,MAAmB,MAAU2G,SAAUjiE,EAAOkiE,MAAQliE,EAAO9qB,aAAe,EAAG8qB,EAAOmiE,OAAS,EAAGniE,EAAOoiE,MAAQ,KAEhG,iBAAnBJ,EAAUjsH,OAErBulH,EAAS,IAAI,OAAsBt7D,EAAOqiE,KAAMriE,EAAOqiE,KAAMriE,EAAOsiE,MAAQtiE,EAAOsiE,KAAMtiE,EAAOmiE,MAAOniE,EAAOoiE,OAI1GJ,EAAU5qH,OAAOkkH,EAAOlkH,KAAOtB,KAAKo0G,iBAAkB8X,EAAU5qH,OAErE4yG,EAAwBsR,EAAQ0G,GAEzBtyF,QAAQuR,QAASq6E,GAnBvB9iG,QAAQC,KAAM,+CAqBhB,CASA,QAAAwjG,CAAUjB,GAET,MAAMuH,EAAUzsH,KAAK89F,KAAKknB,MAAOE,GAE3BtQ,EAAU,GAEhB,IAAM,IAAI9jG,EAAI,EAAG0xG,EAAKiK,EAAQrH,OAAOnkH,OAAQ6P,EAAI0xG,EAAI1xG,IAEpD8jG,EAAQlqG,KAAM1K,KAAK0sH,iBAAkBD,EAAQrH,OAAQt0G,KActD,YAVqClN,IAAhC6oH,EAAQE,oBAEZ/X,EAAQlqG,KAAM1K,KAAKq0G,cAAe,WAAYoY,EAAQE,sBAItD/X,EAAQlqG,KAAM,MAIRkvB,QAAQv4B,IAAKuzG,GAAUn7E,KAAM,SAAW+gF,GAE9C,MAAMmS,EAAsBnS,EAAQ/vG,MAC9BmiH,EAAapS,EAKbqS,EAAQ,GACRC,EAAe,GAErB,IAAM,IAAIh8G,EAAI,EAAG0xG,EAAKoK,EAAW3rH,OAAQ6P,EAAI0xG,EAAI1xG,IAAO,CAEvD,MAAMi8G,EAAYH,EAAY97G,GAE9B,GAAKi8G,EAAY,CAEhBF,EAAMniH,KAAMqiH,GAEZ,MAAMC,EAAM,IAAI,MAEa,OAAxBL,GAEJK,EAAI3P,UAAWsP,EAAoBpiH,MAAW,GAAJuG,GAI3Cg8G,EAAapiH,KAAMsiH,EAEpB,MAECtqG,QAAQC,KAAM,mDAAoD8pG,EAAQrH,OAAQt0G,GAIpF,CAEA,OAAO,IAAI,MAAU+7G,EAAOC,EAE7B,EAED,CASA,aAAA1G,CAAe6G,GAEd,MAAMnvB,EAAO99F,KAAK89F,KACZ6P,EAAS3tG,KAETktH,EAAepvB,EAAK6mB,WAAYsI,GAChCx8F,EAAgBy8F,EAAa5rH,KAAO4rH,EAAa5rH,KAAO,aAAe2rH,EAEvEE,EAAe,GACfC,EAAwB,GACxBC,EAAyB,GACzBC,EAAkB,GAClBC,EAAiB,GAEvB,IAAM,IAAIz8G,EAAI,EAAG0xG,EAAK0K,EAAaM,SAASvsH,OAAQ6P,EAAI0xG,EAAI1xG,IAAO,CAElE,MAAMqsG,EAAU+P,EAAaM,SAAU18G,GACjCq3G,EAAU+E,EAAa7E,SAAUlL,EAAQgL,SACzC/mH,EAAS+7G,EAAQ/7G,OACjBE,EAAOF,EAAOwtC,KACd2N,OAAoC34C,IAA5BspH,EAAaO,WAA2BP,EAAaO,WAAYtF,EAAQ5rE,OAAU4rE,EAAQ5rE,MACnGi+C,OAAqC52F,IAA5BspH,EAAaO,WAA2BP,EAAaO,WAAYtF,EAAQ3tB,QAAW2tB,EAAQ3tB,YAEtF52F,IAAhBxC,EAAOwtC,OAEZu+E,EAAaziH,KAAM1K,KAAKq0G,cAAe,OAAQ/yG,IAC/C8rH,EAAsB1iH,KAAM1K,KAAKq0G,cAAe,WAAY93D,IAC5D8wE,EAAuB3iH,KAAM1K,KAAKq0G,cAAe,WAAY7Z,IAC7D8yB,EAAgB5iH,KAAMy9G,GACtBoF,EAAe7iH,KAAMtJ,GAEtB,CAEA,OAAOw4B,QAAQv4B,IAAK,CAEnBu4B,QAAQv4B,IAAK8rH,GACbvzF,QAAQv4B,IAAK+rH,GACbxzF,QAAQv4B,IAAKgsH,GACbzzF,QAAQv4B,IAAKisH,GACb1zF,QAAQv4B,IAAKksH,KAEV9zF,KAAM,SAAW+qF,GAEpB,MAAMv3E,EAAQu3E,EAAc,GACtBkJ,EAAiBlJ,EAAc,GAC/BmJ,EAAkBnJ,EAAc,GAChC6D,EAAW7D,EAAc,GACzB9gD,EAAU8gD,EAAc,GAExBoJ,EAAS,GAEf,IAAM,IAAI98G,EAAI,EAAG0xG,EAAKv1E,EAAMhsC,OAAQ6P,EAAI0xG,EAAI1xG,IAAO,CAElD,MAAM89B,EAAO3B,EAAOn8B,GACd+8G,EAAgBH,EAAgB58G,GAChCg9G,EAAiBH,EAAiB78G,GAClCq3G,EAAUE,EAAUv3G,GACpB1P,EAASsiE,EAAS5yD,GAExB,QAAclN,IAATgrC,EAAqB,SAErBA,EAAKm/E,cAETn/E,EAAKm/E,eAIN,MAAMC,EAAgBrgB,EAAOsgB,uBAAwBr/E,EAAMi/E,EAAeC,EAAgB3F,EAAS/mH,GAEnG,GAAK4sH,EAEJ,IAAM,IAAI3yG,EAAI,EAAGA,EAAI2yG,EAAc/sH,OAAQoa,IAE1CuyG,EAAOljH,KAAMsjH,EAAe3yG,GAM/B,CAEA,MAAMy7C,EAAY,IAAI,MAAermC,OAAe7sB,EAAWgqH,GAI/D,OAFA1Z,EAAwBp9C,EAAWo2D,GAE5Bp2D,CAER,EAED,CAEA,cAAA6iD,CAAgB1G,GAEf,MAAMnV,EAAO99F,KAAK89F,KACZ6P,EAAS3tG,KACTmzG,EAAUrV,EAAK7wD,MAAOgmE,GAE5B,YAAsBrvG,IAAjBuvG,EAAQyG,KAA4B,KAElCjM,EAAO0G,cAAe,OAAQlB,EAAQyG,MAAOngF,KAAM,SAAWmgF,GAEpE,MAAMhrE,EAAO++D,EAAO4G,YAAa5G,EAAO4V,UAAWpQ,EAAQyG,KAAMA,GAmBjE,YAhByBh2G,IAApBuvG,EAAQmO,SAEZ1yE,EAAKs/E,SAAU,SAAW9uH,GAEzB,GAAOA,EAAE+uH,OAET,IAAM,IAAIr9G,EAAI,EAAG0xG,EAAKrP,EAAQmO,QAAQrgH,OAAQ6P,EAAI0xG,EAAI1xG,IAErD1R,EAAEqjH,sBAAuB3xG,GAAMqiG,EAAQmO,QAASxwG,EAIlD,GAIM89B,CAER,EAED,CASA,QAAAk3E,CAAU7S,GAET,MACMtF,EAAS3tG,KAETmzG,EAHOnzG,KAAK89F,KAGG7wD,MAAOgmE,GAEtBmb,EAAczgB,EAAO+e,iBAAkBzZ,GAEvCob,EAAe,GACfC,EAAcnb,EAAQ7pF,UAAY,GAExC,IAAM,IAAIxY,EAAI,EAAG0xG,EAAK8L,EAAYrtH,OAAQ6P,EAAI0xG,EAAI1xG,IAEjDu9G,EAAa3jH,KAAMijG,EAAO0G,cAAe,OAAQia,EAAax9G,KAI/D,MAAMy9G,OAAmC3qH,IAAjBuvG,EAAQmS,KAC7B1rF,QAAQuR,QAAS,MACjBwiE,EAAO0G,cAAe,OAAQlB,EAAQmS,MAEzC,OAAO1rF,QAAQv4B,IAAK,CACnB+sH,EACAx0F,QAAQv4B,IAAKgtH,GACbE,IACG90F,KAAM,SAAW+gF,GAEpB,MAAM5rE,EAAO4rE,EAAS,GAChBlxF,EAAWkxF,EAAS,GACpBgU,EAAWhU,EAAS,GAER,OAAbgU,GAIJ5/E,EAAKs/E,SAAU,SAAWtU,GAElBA,EAAK2L,eAEZ3L,EAAKxmG,KAAMo7G,EAAUrL,EAEtB,GAID,IAAM,IAAIryG,EAAI,EAAG0xG,EAAKl5F,EAASroB,OAAQ6P,EAAI0xG,EAAI1xG,IAE9C89B,EAAK/zB,IAAKyO,EAAUxY,IAIrB,OAAO89B,CAER,EAED,CAIA,gBAAA89E,CAAkBzZ,GAEjB,MAAMnV,EAAO99F,KAAK89F,KACZz6C,EAAarjD,KAAKqjD,WAClBsqD,EAAS3tG,KAKf,QAAqC4D,IAAhC5D,KAAKsjH,UAAWrQ,GAEpB,OAAOjzG,KAAKsjH,UAAWrQ,GAIxB,MAAME,EAAUrV,EAAK7wD,MAAOgmE,GAGtB9vF,EAAWgwF,EAAQ7xG,KAAOqsG,EAAOyG,iBAAkBjB,EAAQ7xG,MAAS,GAEpEszG,EAAU,GAEV6Z,EAAc9gB,EAAOiY,WAAY,SAAWvB,GAEjD,OAAOA,EAAI1K,gBAAkB0K,EAAI1K,eAAgB1G,EAElD,GAqHA,OAnHKwb,GAEJ7Z,EAAQlqG,KAAM+jH,QAIS7qH,IAAnBuvG,EAAQqS,QAEZ5Q,EAAQlqG,KAAMijG,EAAO0G,cAAe,SAAUlB,EAAQqS,QAAS/rF,KAAM,SAAW+rF,GAE/E,OAAO7X,EAAO4G,YAAa5G,EAAO6V,YAAarQ,EAAQqS,OAAQA,EAEhE,IAID7X,EAAOyW,WAAY,SAAWC,GAE7B,OAAOA,EAAI/P,sBAAwB+P,EAAI/P,qBAAsBrB,EAE9D,GAAInhG,QAAS,SAAWonC,GAEvB07D,EAAQlqG,KAAMwuC,EAEf,GAEAl5C,KAAKsjH,UAAWrQ,GAAcr5E,QAAQv4B,IAAKuzG,GAAUn7E,KAAM,SAAWk4E,GAErE,IAAI/iE,EAqBJ,GAhBCA,GAFuB,IAAnBukE,EAAQkS,OAEL,IAAI,MAEA1T,EAAQ1wG,OAAS,EAErB,IAAI,MAEmB,IAAnB0wG,EAAQ1wG,OAEZ0wG,EAAS,GAIT,IAAI,MAIP/iE,IAAS+iE,EAAS,GAEtB,IAAM,IAAI7gG,EAAI,EAAG0xG,EAAK7Q,EAAQ1wG,OAAQ6P,EAAI0xG,EAAI1xG,IAE7C89B,EAAK/zB,IAAK82F,EAAS7gG,IAiBrB,GAXKqiG,EAAQ7xG,OAEZstC,EAAKuzE,SAAS7gH,KAAO6xG,EAAQ7xG,KAC7BstC,EAAKttC,KAAO6hB,GAIb+wF,EAAwBtlE,EAAMukE,GAEzBA,EAAQ9vD,YAAa2+D,EAAgC3+D,EAAYzU,EAAMukE,QAEpDvvG,IAAnBuvG,EAAQub,OAAuB,CAEnC,MAAMA,EAAS,IAAI,MACnBA,EAAOrR,UAAWlK,EAAQub,QAC1B9/E,EAAK+/E,aAAcD,EAEpB,WAE8B9qH,IAAxBuvG,EAAQkO,aAEZzyE,EAAKxV,SAASikF,UAAWlK,EAAQkO,kBAIRz9G,IAArBuvG,EAAQiK,UAEZxuE,EAAKggF,WAAWvR,UAAWlK,EAAQiK,eAIbx5G,IAAlBuvG,EAAQ52F,OAEZqyB,EAAKryB,MAAM8gG,UAAWlK,EAAQ52F,OAMhC,GAAOoxF,EAAOyV,aAAa54G,IAAKokC,IAIzB,QAAsBhrC,IAAjBuvG,EAAQyG,MAAsBjM,EAAO4V,UAAU1Q,KAAMM,EAAQyG,MAAS,EAAI,CAErF,MAAMiV,EAAUlhB,EAAOyV,aAAa5hH,IAAKotC,GACzC++D,EAAOyV,aAAa35G,IAAKmlC,EAAM,IAAKigF,GAErC,OAPClhB,EAAOyV,aAAa35G,IAAKmlC,EAAM,CAAC,GAWjC,OAFA++D,EAAOyV,aAAa5hH,IAAKotC,GAAO3B,MAAQgmE,EAEjCrkE,CAER,GAEO5uC,KAAKsjH,UAAWrQ,EAExB,CASA,SAAA4S,CAAWiJ,GAEV,MAAMzrE,EAAarjD,KAAKqjD,WAClB0rE,EAAW/uH,KAAK89F,KAAK4mB,OAAQoK,GAC7BnhB,EAAS3tG,KAITykH,EAAQ,IAAI,MACbsK,EAASztH,OAAOmjH,EAAMnjH,KAAOqsG,EAAOyG,iBAAkB2a,EAASztH,OAEpE4yG,EAAwBuQ,EAAOsK,GAE1BA,EAAS1rE,YAAa2+D,EAAgC3+D,EAAYohE,EAAOsK,GAE9E,MAAMC,EAAUD,EAAS9hF,OAAS,GAE5B2nE,EAAU,GAEhB,IAAM,IAAI9jG,EAAI,EAAG0xG,EAAKwM,EAAQ/tH,OAAQ6P,EAAI0xG,EAAI1xG,IAE7C8jG,EAAQlqG,KAAMijG,EAAO0G,cAAe,OAAQ2a,EAASl+G,KAItD,OAAO8oB,QAAQv4B,IAAKuzG,GAAUn7E,KAAM,SAAWwT,GAE9C,IAAM,IAAIn8B,EAAI,EAAG0xG,EAAKv1E,EAAMhsC,OAAQ6P,EAAI0xG,EAAI1xG,IAE3C2zG,EAAM5pG,IAAKoyB,EAAOn8B,IAsCnB,OAFA68F,EAAOyV,aA9BoB,CAAEx0E,IAE5B,MAAMqgF,EAAsB,IAAInmH,IAEhC,IAAM,MAAQmB,EAAK9I,KAAWwsG,EAAOyV,cAE/Bn5G,aAAe,OAAYA,aAAe,QAE9CglH,EAAoBxlH,IAAKQ,EAAK9I,GAkBhC,OAZAytC,EAAKs/E,SAAYt/E,IAEhB,MAAM+2E,EAAWhY,EAAOyV,aAAa5hH,IAAKotC,GAEzB,MAAZ+2E,GAEJsJ,EAAoBxlH,IAAKmlC,EAAM+2E,KAM1BsJ,GAIcC,CAAoBzK,GAEnCA,CAER,EAED,CAEA,sBAAAwJ,CAAwBr/E,EAAMi/E,EAAeC,EAAgB3F,EAAS/mH,GAErE,MAAMwsH,EAAS,GAETuB,EAAavgF,EAAKttC,KAAOstC,EAAKttC,KAAOstC,EAAKi6C,KAC1C65B,EAAc,GAoBpB,IAAI0M,EAEJ,OApBKhO,EAAiBhgH,EAAOs1C,QAAW0qE,EAAgBE,QAEvD1yE,EAAKs/E,SAAU,SAAWjlH,GAEpBA,EAAOw5G,uBAEXC,EAAYh4G,KAAMzB,EAAO3H,KAAO2H,EAAO3H,KAAO2H,EAAO4/E,KAIvD,GAIA65B,EAAYh4G,KAAMykH,GAMV/N,EAAiBhgH,EAAOs1C,OAEhC,KAAK0qE,EAAgBE,QAEpB8N,EAAqB,MACrB,MAED,KAAKhO,EAAgBhE,SAEpBgS,EAAqB,MACrB,MAED,KAAKhO,EAAgBC,YACrB,KAAKD,EAAgB7kG,MAEpB6yG,EAAqB,MACrB,MAED,QAKGA,EADI,IAFGtB,EAAexS,SAGD,MAKA,MASzB,MAAM+T,OAA0CzrH,IAA1BukH,EAAQkH,cAA8B9N,EAAe4G,EAAQkH,eAAkB,MAG/FC,EAActvH,KAAKuvH,sBAAuBzB,GAEhD,IAAM,IAAIr7C,EAAI,EAAG+8C,EAAK9M,EAAYzhH,OAAQwxE,EAAI+8C,EAAI/8C,IAAO,CAExD,MAAMnkD,EAAQ,IAAI8gG,EACjB1M,EAAajwC,GAAM,IAAM2uC,EAAiBhgH,EAAOs1C,MACjDm3E,EAActjH,MACd+kH,EACAD,GAI8B,gBAA1BlH,EAAQkH,eAEZrvH,KAAKyvH,mCAAoCnhG,GAI1Cs/F,EAAOljH,KAAM4jB,EAEd,CAEA,OAAOs/F,CAER,CAEA,qBAAA2B,CAAuBhV,GAEtB,IAAI+U,EAAc/U,EAAShwG,MAE3B,GAAKgwG,EAASgB,WAAa,CAE1B,MAAMh/F,EAAQ2mG,EAA6BoM,EAAYjvH,aACjDqvH,EAAS,IAAIpP,aAAcgP,EAAYruH,QAE7C,IAAM,IAAIwxE,EAAI,EAAG+8C,EAAKF,EAAYruH,OAAQwxE,EAAI+8C,EAAI/8C,IAEjDi9C,EAAQj9C,GAAM68C,EAAa78C,GAAMl2D,EAIlC+yG,EAAcI,CAEf,CAEA,OAAOJ,CAER,CAEA,kCAAAG,CAAoCnhG,GAEnCA,EAAMqhG,kBAAoB,SAAkDxmH,GAQ3E,OAAO,IAFmBnJ,gBAAgB,MAA4Bk/G,EAAuC3B,GAEjFv9G,KAAK4vH,MAAO5vH,KAAKonB,OAAQpnB,KAAK6vH,eAAiB,EAAG1mH,EAE/E,EAGAmlB,EAAMqhG,kBAAkBG,2CAA4C,CAErE,EAiID,SAASrE,EAAwB5e,EAAUgW,EAAclV,GAExD,MAAM2M,EAAauI,EAAavI,WAE1B1F,EAAU,GAEhB,SAASmb,EAAyBnJ,EAAexL,GAEhD,OAAOzN,EAAO0G,cAAe,WAAYuS,GACvCntF,KAAM,SAAW8gF,GAEjB1N,EAASpnF,aAAc21F,EAAeb,EAEvC,EAEF,CAEA,IAAM,MAAMyV,KAAqB1V,EAAa,CAE7C,MAAMmC,EAAqBC,EAAYsT,IAAuBA,EAAkBl6G,cAG3E2mG,KAAsB5P,EAASyN,YAEpC1F,EAAQlqG,KAAMqlH,EAAyBzV,EAAY0V,GAAqBvT,GAEzE,CAEA,QAA8B74G,IAAzBi/G,EAAanmC,UAA2BmwB,EAASvjG,MAAQ,CAE7D,MAAMixG,EAAW5M,EAAO0G,cAAe,WAAYwO,EAAanmC,SAAUjjD,KAAM,SAAW8gF,GAE1F1N,EAASG,SAAUuN,EAEpB,GAEA3F,EAAQlqG,KAAM6vG,EAEf,CAYA,OAVK,MAAgB0V,oBAAsB,OAAwB,YAAa3V,GAE/E53F,QAAQC,KAAM,qEAAqE,MAAgBstG,qCAIpG/b,EAAwBrH,EAAUgW,GApKnC,SAAwBhW,EAAUgW,EAAclV,GAE/C,MAAM2M,EAAauI,EAAavI,WAE1B4V,EAAM,IAAI,MAEhB,QAA6BtsH,IAAxB02G,EAAWoG,SAkCf,OAlCwC,CAExC,MAAMnG,EAAW5M,EAAO7P,KAAK8e,UAAWtC,EAAWoG,UAE7C7jG,EAAM09F,EAAS19F,IACfnU,EAAM6xG,EAAS7xG,IAIrB,QAAa9E,IAARiZ,QAA6BjZ,IAAR8E,EAmBzB,YAFAga,QAAQC,KAAM,uEAVd,GALAutG,EAAIzmH,IACH,IAAI,MAASoT,EAAK,GAAKA,EAAK,GAAKA,EAAK,IACtC,IAAI,MAASnU,EAAK,GAAKA,EAAK,GAAKA,EAAK,KAGlC6xG,EAASgB,WAAa,CAE1B,MAAM4U,EAAWjN,EAA6BpG,EAAuBvC,EAASsC,gBAC9EqT,EAAIrzG,IAAIuzG,eAAgBD,GACxBD,EAAIxnH,IAAI0nH,eAAgBD,EAEzB,CAUF,CAMA,MAAMzsD,EAAUm/C,EAAan/C,QAE7B,QAAiB9/D,IAAZ8/D,EAAwB,CAE5B,MAAM2sD,EAAkB,IAAI,MACtBC,EAAS,IAAI,MAEnB,IAAM,IAAIx/G,EAAI,EAAG0xG,EAAK9+C,EAAQziE,OAAQ6P,EAAI0xG,EAAI1xG,IAAO,CAEpD,MAAM1P,EAASsiE,EAAS5yD,GAExB,QAAyBlN,IAApBxC,EAAOs/G,SAAyB,CAEpC,MAAMnG,EAAW5M,EAAO7P,KAAK8e,UAAWx7G,EAAOs/G,UACzC7jG,EAAM09F,EAAS19F,IACfnU,EAAM6xG,EAAS7xG,IAIrB,QAAa9E,IAARiZ,QAA6BjZ,IAAR8E,EAAoB,CAQ7C,GALA4nH,EAAOxI,KAAMr/G,KAAKC,IAAKD,KAAKsU,IAAKF,EAAK,IAAOpU,KAAKsU,IAAKrU,EAAK,MAC5D4nH,EAAOvI,KAAMt/G,KAAKC,IAAKD,KAAKsU,IAAKF,EAAK,IAAOpU,KAAKsU,IAAKrU,EAAK,MAC5D4nH,EAAOtI,KAAMv/G,KAAKC,IAAKD,KAAKsU,IAAKF,EAAK,IAAOpU,KAAKsU,IAAKrU,EAAK,MAGvD6xG,EAASgB,WAAa,CAE1B,MAAM4U,EAAWjN,EAA6BpG,EAAuBvC,EAASsC,gBAC9EyT,EAAOF,eAAgBD,EAExB,CAMAE,EAAgB3nH,IAAK4nH,EAEtB,MAEC5tG,QAAQC,KAAM,sEAIhB,CAED,CAGAutG,EAAIK,eAAgBF,EAErB,CAEAxjB,EAAS2jB,YAAcN,EAEvB,MAAMO,EAAS,IAAI,MAEnBP,EAAIQ,UAAWD,EAAOz+F,QACtBy+F,EAAOE,OAAST,EAAIrzG,IAAI+zG,WAAYV,EAAIxnH,KAAQ,EAEhDmkG,EAASgkB,eAAiBJ,CAE3B,CA0DCK,CAAejkB,EAAUgW,EAAclV,GAEhC/zE,QAAQv4B,IAAKuzG,GAAUn7E,KAAM,WAEnC,YAAgC71B,IAAzBi/G,EAAan/C,QA55EtB,SAA0BmpC,EAAUnpC,EAASiqC,GAE5C,IAAIojB,GAAmB,EACnBC,GAAiB,EACjBC,GAAgB,EAEpB,IAAM,IAAIngH,EAAI,EAAG0xG,EAAK9+C,EAAQziE,OAAQ6P,EAAI0xG,EAAI1xG,IAAO,CAEpD,MAAM1P,EAASsiE,EAAS5yD,GAMxB,QAJyBlN,IAApBxC,EAAOs/G,WAAyBqQ,GAAmB,QACjCntH,IAAlBxC,EAAOu/G,SAAuBqQ,GAAiB,QAC5BptH,IAAnBxC,EAAO6/G,UAAwBgQ,GAAgB,GAE/CF,GAAoBC,GAAkBC,EAAgB,KAE5D,CAEA,IAAOF,IAAsBC,IAAoBC,EAAgB,OAAOr3F,QAAQuR,QAAS0hE,GAEzF,MAAMqkB,EAA2B,GAC3BC,EAAyB,GACzBC,EAAwB,GAE9B,IAAM,IAAItgH,EAAI,EAAG0xG,EAAK9+C,EAAQziE,OAAQ6P,EAAI0xG,EAAI1xG,IAAO,CAEpD,MAAM1P,EAASsiE,EAAS5yD,GAExB,GAAKigH,EAAmB,CAEvB,MAAMM,OAAsCztH,IAApBxC,EAAOs/G,SAC5B/S,EAAO0G,cAAe,WAAYjzG,EAAOs/G,UACzC7T,EAASyN,WAAWlhF,SAEvB83F,EAAyBxmH,KAAM2mH,EAEhC,CAEA,GAAKL,EAAiB,CAErB,MAAMK,OAAoCztH,IAAlBxC,EAAOu/G,OAC5BhT,EAAO0G,cAAe,WAAYjzG,EAAOu/G,QACzC9T,EAASyN,WAAWp/C,OAEvBi2D,EAAuBzmH,KAAM2mH,EAE9B,CAEA,GAAKJ,EAAgB,CAEpB,MAAMI,OAAqCztH,IAAnBxC,EAAO6/G,QAC5BtT,EAAO0G,cAAe,WAAYjzG,EAAO6/G,SACzCpU,EAASyN,WAAWz3G,MAEvBuuH,EAAsB1mH,KAAM2mH,EAE7B,CAED,CAEA,OAAOz3F,QAAQv4B,IAAK,CACnBu4B,QAAQv4B,IAAK6vH,GACbt3F,QAAQv4B,IAAK8vH,GACbv3F,QAAQv4B,IAAK+vH,KACV33F,KAAM,SAAWmjF,GAEpB,MAAM0U,EAAiB1U,EAAW,GAC5B2U,EAAe3U,EAAW,GAC1B4U,EAAc5U,EAAW,GAO/B,OALKmU,IAAmBlkB,EAASkf,gBAAgB3yF,SAAWk4F,GACvDN,IAAiBnkB,EAASkf,gBAAgB7wD,OAASq2D,GACnDN,IAAgBpkB,EAASkf,gBAAgBlpH,MAAQ2uH,GACtD3kB,EAAS4kB,sBAAuB,EAEzB5kB,CAER,EAED,CA80EK6kB,CAAiB7kB,EAAUgW,EAAan/C,QAASiqC,GACjDd,CAEJ,EAED,C,uBCzwJAjuG,EAAOC,QAAU,SAAUC,GACzB,OAAOA,OACT,C,2BCJA,IAAIgzC,EAAQ,EAAQ,MAChB5oC,EAAW,EAAQ,IACnBwqC,EAAU,EAAQ,MAClBi+E,EAA8B,EAAQ,MAGtCC,EAAgBtyH,OAAOs1E,aACvBi9C,EAAsB//E,EAAM,WAAc8/E,EAAc,EAAI,GAIhEhzH,EAAOC,QAAWgzH,GAAuBF,EAA+B,SAAsB7yH,GAC5F,QAAKoK,EAASpK,MACV6yH,GAA+C,gBAAhBj+E,EAAQ50C,OACpC8yH,GAAgBA,EAAc9yH,GACvC,EAAI8yH,C,2BCdJ,IAAIvtH,EAAI,EAAQ,MACZ+O,EAAO,EAAQ,KAKnB/O,EAAE,CAAEjD,OAAQ,WAAYuD,OAAO,EAAMC,OAAQkB,SAASsN,OAASA,GAAQ,CACrEA,KAAMA,G,2BCRR,IAAI/O,EAAI,EAAQ,MACZ2tC,EAAc,EAAQ,MACtB9wC,EAAiB,UAKrBmD,EAAE,CAAEjD,OAAQ,SAAUwwC,MAAM,EAAMhtC,OAAQtF,OAAO4B,iBAAmBA,EAAgB+kD,MAAOjU,GAAe,CACxG9wC,eAAgBA,G,2BCRlB,IAAIinG,EAAO,EAAQ,MACfttF,EAAM,YACN63D,EAAQ,EAAQ,MAChB21B,EAAe,EAAQ,MACvBE,EAAgB,EAAQ,KAI5B3pG,EAAOC,QAAU,SAAe+P,GAC9B,IAAIoM,EAAImtF,EAAKnoG,MACT+pG,EAAW1B,EAAaz5F,GAAOykE,cAC/BlqE,EAASupE,EAAM13D,GAInB,OAHAutF,EAAcwB,EAAU,SAAUjrG,GAChC+b,EAAI1R,EAAQrK,EACd,GACOqK,CACT,C,2BChBA,IAAI63C,EAAkB,EAAQ,MAC1BuF,EAAY,EAAQ,MAEpBC,EAAWxF,EAAgB,YAC3B8wE,EAAiBptH,MAAMvE,UAG3BvB,EAAOC,QAAU,SAAUC,GACzB,YAAc8E,IAAP9E,IAAqBynD,EAAU7hD,QAAU5F,GAAMgzH,EAAetrE,KAAc1nD,EACrF,C,2BCTA,IAAIkzC,EAAc,EAAQ,MACtBH,EAAc,EAAQ,MACtB9xC,EAAO,EAAQ,MACf+xC,EAAQ,EAAQ,MAChBi8B,EAAa,EAAQ,MACrBgkD,EAA8B,EAAQ,MACtCC,EAA6B,EAAQ,MACrCltE,EAAW,EAAQ,MACnBuC,EAAgB,EAAQ,MAGxB4qE,EAAU3yH,OAAO0V,OAEjB9T,EAAiB5B,OAAO4B,eACxBs/C,EAAS3O,EAAY,GAAG2O,QAI5B5hD,EAAOC,SAAWozH,GAAWngF,EAAM,WAEjC,GAAIE,GAQiB,IARFigF,EAAQ,CAAE1uH,EAAG,GAAK0uH,EAAQ/wH,EAAe,CAAC,EAAG,IAAK,CACnEK,YAAY,EACZC,IAAK,WACHN,EAAelB,KAAM,IAAK,CACxBmB,MAAO,EACPI,YAAY,GAEhB,IACE,CAAEgC,EAAG,KAAMA,EAAS,OAAO,EAE/B,IAAI0X,EAAI,CAAC,EACLyM,EAAI,CAAC,EAELo5C,EAASp5D,OAAO,oBAChBwqH,EAAW,uBAIf,OAHAj3G,EAAE6lD,GAAU,EAEZoxD,EAASrgH,MAAM,IAAIC,QAAQ,SAAUksF,GAAOt2E,EAAEs2E,GAAOA,CAAK,GACxB,IAA3Bi0B,EAAQ,CAAC,EAAGh3G,GAAG6lD,IAAiBiN,EAAWkkD,EAAQ,CAAC,EAAGvqG,IAAIjkB,KAAK,MAAQyuH,CACjF,GAAK,SAAgB9wH,EAAQkB,GAM3B,IALA,IAAI2iB,EAAI6/B,EAAS1jD,GACbqmD,EAAkBzmD,UAAUC,OAC5BqI,EAAQ,EACRy1B,EAAwBgzF,EAA4B78G,EACpDjN,EAAuB+pH,EAA2B98G,EAC/CuyC,EAAkBn+C,GAMvB,IALA,IAIIW,EAJAyQ,EAAI2sC,EAAcrmD,UAAUsI,MAC5BlC,EAAO23B,EAAwByhB,EAAOutB,EAAWrzD,GAAIqkB,EAAsBrkB,IAAMqzD,EAAWrzD,GAC5FzZ,EAASmG,EAAKnG,OACdwxE,EAAI,EAEDxxE,EAASwxE,GACdxoE,EAAM7C,EAAKqrE,KACNzgC,IAAejyC,EAAKkI,EAAsByS,EAAGzQ,KAAMgb,EAAEhb,GAAOyQ,EAAEzQ,IAErE,OAAOgb,CACX,EAAIgtG,C,2BCvDJ,IAAIx7E,EAAa,EAAQ,MACrBz6B,EAAY,EAAQ,MACpB03B,EAAU,EAAQ,MAElBy+E,EAAsB,SAAUrkH,GAClC,OAAOkO,EAAUlP,MAAM,EAAGgB,EAAO7M,UAAY6M,CAC/C,EAEAlP,EAAOC,QACDszH,EAAoB,QAAgB,MACpCA,EAAoB,sBAA8B,aAClDA,EAAoB,SAAiB,OACrCA,EAAoB,YAAoB,OACxC17E,EAAW27E,KAA6B,iBAAfA,IAAI/uD,QAA4B,MACzD5sB,EAAW47E,MAA+B,iBAAhBA,KAAKhvD,QAA4B,OAC3B,YAAhC3vB,EAAQ+C,EAAWrwC,SAA+B,OAClDqwC,EAAW1lC,QAAU0lC,EAAWrlC,SAAiB,UAC9C,M,2BClBT,IAAI4K,EAAY,EAAQ,MAExBpd,EAAOC,QAAU,oBAAoBsF,KAAK6X,IAA+B,oBAAVs2G,M,2BCF/D,IAAIvyH,EAAO,EAAQ,MACfpB,EAAa,EAAQ,MACrBuK,EAAW,EAAQ,IAEnBvI,EAAaC,UAIjBhC,EAAOC,QAAU,SAAU09C,EAAO+sB,GAChC,IAAI1vB,EAAI8qC,EACR,GAAa,WAATpb,GAAqB3qE,EAAWi7C,EAAK2C,EAAMt5C,YAAciG,EAASw7E,EAAM3kF,EAAK65C,EAAI2C,IAAS,OAAOmoC,EACrG,GAAI/lF,EAAWi7C,EAAK2C,EAAMmW,WAAaxpD,EAASw7E,EAAM3kF,EAAK65C,EAAI2C,IAAS,OAAOmoC,EAC/E,GAAa,WAATpb,GAAqB3qE,EAAWi7C,EAAK2C,EAAMt5C,YAAciG,EAASw7E,EAAM3kF,EAAK65C,EAAI2C,IAAS,OAAOmoC,EACrG,MAAM,IAAI/jF,EAAW,0CACvB,C,2BCdQ,EAAQ,KAKhB0D,CAAE,CAAEjD,OAAQ,QAASwwC,MAAM,GAAQ,CACjCnlC,QALY,EAAQ,O,2BCAtB5N,EAAQE,YAAa,EACrBF,EAAQ0zH,cAAgB1zH,EAAQ20C,aAAe30C,EAAQ+5E,QAAU/5E,EAAQy4E,WAAa,EAEtF,IAAIzP,EAAS70B,EAAuB,EAAQ,OAE5Cn0C,EAAQy4E,MAAQzP,EAAgB,QAEhC,IAAI2qD,EAAWx/E,EAAuB,EAAQ,OAE9Cn0C,EAAQ+5E,QAAU45C,EAAkB,QAEpC,IAAIC,EAAgBz/E,EAAuB,EAAQ,OAEnDn0C,EAAQ20C,aAAei/E,EAAuB,QAE9C,IAAIC,EAAiB1/E,EAAuB,EAAQ,OAIpD,SAASA,EAAuBh0C,GAAO,OAAOA,GAAOA,EAAID,WAAaC,EAAM,CAAE,QAAWA,EAAO,CAFhGH,EAAQ0zH,cAAgBG,EAAwB,O,2BClBhD,IAAIh/E,EAAU,EAAQ,MAKtB90C,EAAOC,QAAU6F,MAAM+H,SAAW,SAAiB5L,GACjD,MAA6B,UAAtB6yC,EAAQ7yC,EACjB,C,cCRA,yBAMCipD,EAAUA,EAAQ12C,KAAK,KAAMrC,EAAQA,EAAOK,UAEZxS,EAAOC,QACtCirD,EAAQ,EAAQ,QAEhB,EAAO,CAAC,cAAqB,0BAAP,EAAF,GAAS,+BAM/B,CAjBA,CAiBE/4C,OAAQ,SAASA,EAAQK,EAAUy/D,GACpC,aACA,GAAI9/D,EAAOsC,iBAAX,CAEA,IAAIs/G,EAAe9hD,EAAUK,IACzB0hD,EAAW,OACXC,EAAc,qBACdC,EAAY,uDACZC,EAAU,uCACVC,EAAiB,UACjBC,EAAwB,CAACx6D,QAAS,EAAGD,MAAO,GAoB5C06D,EAAiB,SAAS5wH,EAAQoB,GACrC,GAAGA,EAAM,CACR,IAAIyvH,EAAYzvH,EAAMA,MAAMqvH,GACzBI,GAAaA,EAAU,GACzB7wH,EAAOmjB,aAAa,OAAQ0tG,EAAU,IAEtC7wH,EAAOmjB,aAAa,QAASktG,EAAa3gD,YAAYtuE,IAAUA,EAElE,CACD,EAkEI0vH,EAAY,SAAS3sH,GACxB,GAAIA,EAAErF,OAAOiyH,WAAb,CAEA,IAAIx1E,EAAQp3C,EAAErF,OACV+mD,EAAOtK,EAAMw1E,WACbC,EAAKz1E,EAAM9R,YAAc8R,EAAM31B,IAGnC,GAAGorG,EAAG,CACL,IAAIC,EAASP,EAAe7uH,KAAKmvH,GAAM9wG,KAAKua,UAAUu2F,GAAMA,EACxDxwG,EAAQ+tD,EAAU2iD,KAAKrrE,EAAM,aAAc,CAC9CjgC,IAAKorG,EACLC,OAAQA,EACRE,QAAS,OAGN3wG,EAAMf,mBACTomC,EAAKhkC,MAAMqM,gBAAkB1N,EAAMnB,OAAO8xG,SAAW,OAAS3wG,EAAMnB,OAAO4xG,OAAS,IAEtF,CAEG11E,EAAM61E,oBACR7iD,EAAU2iD,KAAKrrE,EAAM,cAAe,CAAC,GAAG,GAAO,UACxCtK,EAAM61E,kBAtBkB,CAwBjC,EAEArgH,iBAAiB,mBAAoB,SAAS5M,GAC7C,IAAIgD,EAAKo0C,EAAOsK,GAEb1hD,EAAEsb,mBAAsBtY,EAAMhD,EAAErF,OAAO2jB,aAAa,iBAEvDojC,EAAO1hD,EAAErF,QACTy8C,EAAQzsC,EAASM,cAAc,QAEzB8oB,IAAM,GAEZqjB,EAAM61E,mBAAoB,EAC1BjtH,EAAEkb,OAAOgyG,WAAY,EAvGF,SAASC,EAAMzrE,EAAM2D,GACxC,IAAIC,EAAU36C,EAASM,cAAc,WACjCkpB,EAAQutB,EAAKpjC,aAAa4tG,EAAakB,WACvC7uD,EAAQ7c,EAAKpjC,aAAa,cAC1B+uG,EAAW3rE,EAAKpjC,aAAa,iBAE9BojC,EAAKkrE,YAAclrE,EAAKkrE,WAAWpkG,YAAck5B,GACnDA,EAAK/4B,YAAY+4B,EAAKkrE,YAGvB/zH,OAAO4B,eAAe4qD,EAAK,aAAc,CACxC3qD,MAAOgnD,EACPj2C,UAAU,IAEX5S,OAAO4B,eAAeinD,EAAM,aAAc,CACzChnD,MAAO4qD,EACP75C,UAAU,IAGX0hH,EAAOA,EAAKzwH,QAAQyvH,EAAU,KAAK/gH,MAAMghH,GAEzC9mE,EAAQ5nC,MAAMoB,QAAU,OACxBumC,EAAIvtB,UAAYo0F,EAAaoB,UAEX,GAAfH,EAAK3yH,QAAgB25B,IACvBA,EAAQ,QAGTg5F,EAAK9hH,QAAQ,SAASrI,GACrB,IAAI/F,EACApB,EAAS8O,EAASM,cAAc,UAEjCkpB,GAAkB,QAATA,GACXt4B,EAAOmjB,aAAa,QAASmV,IAG1Bl3B,EAAQ+F,EAAI/F,MAAMovH,KACrBxwH,EAAOmjB,aAAaktG,EAAa7gD,WAAYpuE,EAAM,IAEnDwvH,EAAe5wH,EAAQoB,EAAM,IAC7BwvH,EAAe5wH,EAAQoB,EAAM,KAE7BpB,EAAOmjB,aAAaktG,EAAa7gD,WAAYroE,GAG9CsiD,EAAQn6C,YAAYtP,EACrB,GAEGs4B,IACFkxB,EAAIrmC,aAAaktG,EAAakB,UAAWj5F,GACzCutB,EAAK3iC,gBAAgBmtG,EAAakB,WAClC1rE,EAAK3iC,gBAAgB,UAEnBsuG,GACFhoE,EAAIrmC,aAAa,gBAAiBquG,GAEhC9uD,GACFlZ,EAAIrmC,aAAa,aAAcu/C,GAGhCjZ,EAAQn6C,YAAYk6C,GAEpB3D,EAAKv2C,YAAYm6C,EAClB,CA0CCioE,CAAcvqH,EAAK0+C,EAAMtK,GAEzBt+B,WAAW,WACVsxD,EAAU2+B,OAAOykB,OAAOp2E,GAExBgzB,EAAUjwD,IAAI,WACbiwD,EAAU2iD,KAAK31E,EAAO,cAAe,CAAC,GAAG,GAAM,GAC5CA,EAAM1gC,UACRi2G,EAAU,CAAChyH,OAAQy8C,GAErB,EACD,GAED,GAEAzsC,EAASiC,iBAAiB,OAAQ+/G,GAAW,GAE7CriH,EAAOsC,iBAAiB,kBAAmB,SAAS5M,GACnD,GAAGA,EAAEkb,OAAOuH,UAAY2nD,GACrBpqE,EAAErF,OAAOiyH,YAAc5sH,EAAEkb,OAAO6nC,SAAS,CAC3C,IACI0qE,EAnJU,SAAS/rE,GACxB,IAAI+rE,EAQJ,OANAA,GAAUljH,iBAAiBm3C,IAAS,CAACltB,iBAAkB,WAAW,IAAIA,iBAAiB,oBAEnFg4F,EAAsBiB,IAAWjB,EAAsB9qE,EAAKhkC,MAAMm6B,kBACrE41E,EAAS/rE,EAAKhkC,MAAMm6B,gBAGd41E,CACR,CAyIeC,CADF1tH,EAAErF,OAAOiyH,YAGjBJ,EAAsBiB,KACxBztH,EAAErF,OAAOowE,oBAAsB0iD,EAE/BrjD,EAAUjwD,IAAI,WACbna,EAAErF,OAAOqkB,aAAa,kBAAmByuG,GACtCztH,EAAErF,OAAOowE,4BACJ/qE,EAAErF,OAAOowE,mBAElB,GAEF,CACD,GAAG,GAEHpgE,EAAS6V,gBAAgB5T,iBAAiB,kBAAmB,SAAS5M,GA1KrD,IAAS0hD,EACrB/vC,GA0KD3R,EAAEsb,kBAAqBtb,EAAErF,OAAOiyH,YAAc5sH,EAAEkb,OAAOuH,UAAY2nD,IACtEpqE,EAAEkb,OAAOvJ,OA5KgB+vC,EA4KG1hD,EAAErF,OAAOiyH,WA3KjCj7G,EAAQy4D,EAAUujD,GAAGjsE,EAAMA,EAAKl5B,cAEhCk5B,EAAKksE,iBAAmBj8G,EAAQ+vC,EAAKksE,mBACxClsE,EAAKksE,gBAAkBj8G,GAEjB+vC,EAAKksE,iBAuKb,EAtLoC,CAuLrC,E,2BCzMA,IAAIxiF,EAAc,EAAQ,MAGtByiF,EAAennG,IAAIhtB,UAEvBvB,EAAOC,QAAU,CAEfsuB,IACAtS,IAAKg3B,EAAYyiF,EAAaz5G,KAC9BrQ,IAAKqnC,EAAYyiF,EAAa9pH,KAC9BmQ,OAAQk3B,EAAYyiF,EAAqB,QACzC3vH,MAAO2vH,E,2BCXT,IAAIjwH,EAAI,EAAQ,MACZkwH,EAAY,iBACZziF,EAAQ,EAAQ,MAChBvtC,EAAmB,EAAQ,MAU/BF,EAAE,CAAEjD,OAAQ,QAASuD,OAAO,EAAMC,OAPXktC,EAAM,WAE3B,OAAQptC,MAAM,GAAGuR,UACnB,IAI8D,CAC5DA,SAAU,SAAkBkS,GAC1B,OAAOosG,EAAUv0H,KAAMmoB,EAAInnB,UAAUC,OAAS,EAAID,UAAU,QAAK4C,EACnE,IAIFW,EAAiB,W,2BCpBjB,IAEIiiD,EAFkB,EAAQ,KAEfxF,CAAgB,YAC3BwzE,GAAe,EAEnB,IACE,IAAI7qB,EAAS,EACT8qB,EAAqB,CACvB7pG,KAAM,WACJ,MAAO,CAAEqP,OAAQ0vE,IACnB,EACA,OAAU,WACR6qB,GAAe,CACjB,GAGFC,EAAmBjuE,GAAY,WAC7B,OAAOxmD,IACT,EAEA0E,MAAMsP,KAAKygH,EAAoB,WAAc,MAAM,CAAG,EACxD,CAAE,MAAOz5F,GAAqB,CAE9Bp8B,EAAOC,QAAU,SAAUsI,EAAMutH,GAC/B,IACE,IAAKA,IAAiBF,EAAc,OAAO,CAC7C,CAAE,MAAOx5F,GAAS,OAAO,CAAO,CAChC,IAAI25F,GAAoB,EACxB,IACE,IAAI1rH,EAAS,CAAC,EAEdA,EAAOu9C,GAAY,WACjB,MAAO,CACL57B,KAAM,WACJ,MAAO,CAAEqP,KAAM06F,GAAoB,EACrC,EAEJ,EACAxtH,EAAK8B,EACP,CAAE,MAAO+xB,GAAqB,CAC9B,OAAO25F,CACT,C,2BCzCA,IAAIxsB,EAAO,EAAQ,MACf39F,EAAM,YACNT,EAAO,EAAQ,MACfs+F,EAAe,EAAQ,MACvBC,EAAa,EAAQ,MACrBC,EAAgB,EAAQ,KACxBj1B,EAAgB,EAAQ,MAI5B10E,EAAOC,QAAU,SAAwB+P,GACvC,IAAIoM,EAAImtF,EAAKnoG,MACTwoG,EAAWH,EAAaz5F,GAC5B,GAAI7E,EAAKiR,IAAMwtF,EAASz+F,KAAM,OAEjB,IAFwBu+F,EAAWttF,EAAG,SAAUvU,GAC3D,GAAI+hG,EAASvyF,SAASxP,GAAI,OAAO,CACnC,GAAG,GACH,IAAIqnC,EAAW06D,EAASn1B,cACxB,OAEO,IAFAk1B,EAAcz6D,EAAU,SAAUrnC,GACvC,GAAI+D,EAAIwQ,EAAGvU,GAAI,OAAO6sE,EAAcxlC,EAAU,UAAU,EAC1D,EACF,C,2BCpBA,IAAI+F,EAAa,EAAQ,MAErBziB,EAAQ3oB,KAAK2oB,MAEbpS,EAAO,SAAUzU,EAAOqqH,GAC1B,IAAI3zH,EAASsJ,EAAMtJ,OAEnB,GAAIA,EAAS,EAKX,IAHA,IACI+R,EAASy/D,EADT3hE,EAAI,EAGDA,EAAI7P,GAAQ,CAGjB,IAFAwxE,EAAI3hE,EACJkC,EAAUzI,EAAMuG,GACT2hE,GAAKmiD,EAAUrqH,EAAMkoE,EAAI,GAAIz/D,GAAW,GAC7CzI,EAAMkoE,GAAKloE,IAAQkoE,GAEjBA,IAAM3hE,MAAKvG,EAAMkoE,GAAKz/D,EAC5B,MAWA,IARA,IAAI2yB,EAASvU,EAAMnwB,EAAS,GACxB6c,EAAOkB,EAAK60B,EAAWtpC,EAAO,EAAGo7B,GAASivF,GAC1Ch3G,EAAQoB,EAAK60B,EAAWtpC,EAAOo7B,GAASivF,GACxCC,EAAU/2G,EAAK7c,OACf6zH,EAAUl3G,EAAM3c,OAChB8zH,EAAS,EACTC,EAAS,EAEND,EAASF,GAAWG,EAASF,GAClCvqH,EAAMwqH,EAASC,GAAWD,EAASF,GAAWG,EAASF,EACnDF,EAAU92G,EAAKi3G,GAASn3G,EAAMo3G,KAAY,EAAIl3G,EAAKi3G,KAAYn3G,EAAMo3G,KACrED,EAASF,EAAU/2G,EAAKi3G,KAAYn3G,EAAMo3G,KAIlD,OAAOzqH,CACT,EAEA3L,EAAOC,QAAUmgB,C,2BCxCjB,IAAI3a,EAAI,EAAQ,MACZwtC,EAAc,EAAQ,MACtBplC,EAAU,EAAQ,MAElBwoH,EAAgBpjF,EAAY,GAAGlG,SAC/BxnC,EAAO,CAAC,EAAG,GAMfE,EAAE,CAAEjD,OAAQ,QAASuD,OAAO,EAAMC,OAAQyK,OAAOlL,KAAUkL,OAAOlL,EAAKwnC,YAAc,CACnFA,QAAS,WAGP,OADIl/B,EAAQzM,QAAOA,KAAKiB,OAASjB,KAAKiB,QAC/Bg0H,EAAcj1H,KACvB,G,2BCfF,IAAIihD,EAAa,EAAQ,MACrBnP,EAAQ,EAAQ,MAGhBS,EAFa,EAAQ,MAEAljC,OAGzBzQ,EAAOC,UAAYS,OAAOy/B,wBAA0B+S,EAAM,WACxD,IAAIgvB,EAASp5D,OAAO,oBAKpB,OAAQ6qC,EAAQuuB,MAAaxhE,OAAOwhE,aAAmBp5D,UAEpDA,OAAOu+C,MAAQhF,GAAcA,EAAa,EAC/C,E,cClBA,IAAI0J,EAAS,EAAQ,MACrB/rD,EAAOC,SAAW8rD,EAAO5rD,WAAa4rD,EAAS,CAAErqD,QAASqqD,IAAUrqD,O,yBCCpEzB,EAAQE,YAAa,EACrBF,EAAiB,QAEjB,SAAuBoqB,GACrB,OAAOA,EAAKjK,KAAK,SAAUxb,EAAGD,GAC5B,OAAOC,EAAID,CACb,EACF,EAGA3E,EAAOC,QAAUA,EAAQyB,O,2BCXzB,IAAI40H,EAAQ,SAAUp2H,GACpB,OAAOA,GAAMA,EAAG2J,OAASA,MAAQ3J,CACnC,EAGAF,EAAOC,QAELq2H,EAA2B,iBAAdz+E,YAA0BA,aACvCy+E,EAAuB,iBAAVnkH,QAAsBA,SAEnCmkH,EAAqB,iBAARtvH,MAAoBA,OACjCsvH,EAAuB,iBAAV,EAAA5xH,GAAsB,EAAAA,IACnC4xH,EAAqB,iBAARl1H,MAAoBA,OAEjC,WAAe,OAAOA,IAAO,CAA7B,IAAoC8F,SAAS,cAATA,E,2BCdtC,IAAIgsC,EAAQ,EAAQ,MAEpBlzC,EAAOC,QAAU,SAAUsiD,EAAatgD,GACtC,IAAI+7B,EAAS,GAAGukB,GAChB,QAASvkB,GAAUkV,EAAM,WAEvBlV,EAAO78B,KAAK,KAAMc,GAAY,WAAc,OAAO,CAAG,EAAG,EAC3D,EACF,C,2BCRA,IAAIwD,EAAI,EAAQ,MACZoyC,EAAa,EAAQ,MAGrBl3B,EAFgB,EAAQ,KAEX41G,CAAc1+E,EAAWl3B,YAAY,GAItDlb,EAAE,CAAEi2C,QAAQ,EAAMlnC,MAAM,EAAMxO,OAAQ6xC,EAAWl3B,aAAeA,GAAc,CAC5EA,WAAYA,G,cC8Cd,SAASk2B,EAAQn0C,GAEf,IACE,IAAK,EAAAgC,EAAO8xH,aAAc,OAAO,CACnC,CAAE,MAAOhyH,GACP,OAAO,CACT,CACA,IAAIshF,EAAM,EAAAphF,EAAO8xH,aAAa9zH,GAC9B,OAAI,MAAQojF,GACyB,SAA9Br1E,OAAOq1E,GAAK5uE,aACrB,CA7DAlX,EAAOC,QAoBP,SAAoB+6C,EAAIy7E,GACtB,GAAI5/E,EAAO,iBACT,OAAOmE,EAGT,IAAI07E,GAAS,EAeb,OAdA,WACE,IAAKA,EAAQ,CACX,GAAI7/E,EAAO,oBACT,MAAM,IAAI7+B,MAAMy+G,GACP5/E,EAAO,oBAChB/yB,QAAQ6yG,MAAMF,GAEd3yG,QAAQC,KAAK0yG,GAEfC,GAAS,CACX,CACA,OAAO17E,EAAGlrC,MAAM1O,KAAMgB,UACxB,CAGF,C,2BC7CA,IAAIgxC,EAAc,EAAQ,MACtBwjF,EAAuB,EAAQ,MAC/B1pB,EAA2B,EAAQ,MAEvCltG,EAAOC,QAAU,SAAUoK,EAAQgB,EAAK9I,GAClC6wC,EAAawjF,EAAqBtgH,EAAEjM,EAAQgB,EAAK6hG,EAAyB,EAAG3qG,IAC5E8H,EAAOgB,GAAO9I,CACrB,C,YCRA,OAUA,SAAYm5C,EAAQwP,GAEnB,aAE6D,iBAAnBlrD,EAAOC,QAShDD,EAAOC,QAAUy7C,EAAOlpC,SACvB04C,EAASxP,GAAQ,GACjB,SAAU//B,GACT,IAAMA,EAAEnJ,SACP,MAAM,IAAIwF,MAAO,4CAElB,OAAOkzC,EAASvvC,EACjB,EAEDuvC,EAASxP,EAIT,CA1BF,CA0BuB,oBAAXvpC,OAAyBA,OAAS/Q,KAAM,SAAU+Q,EAAQ0kH,GAMtE,aAEA,IAAI/oF,EAAM,GAENgpF,EAAWp2H,OAAOwI,eAElBgF,EAAQ4/B,EAAI5/B,MAEZ6oH,EAAOjpF,EAAIipF,KAAO,SAAUprH,GAC/B,OAAOmiC,EAAIipF,KAAK51H,KAAMwK,EACvB,EAAI,SAAUA,GACb,OAAOmiC,EAAI8T,OAAO9xC,MAAO,GAAInE,EAC9B,EAGIG,EAAOgiC,EAAIhiC,KAEXwG,EAAUw7B,EAAIx7B,QAEd0kH,EAAa,CAAC,EAEd3yH,EAAW2yH,EAAW3yH,SAEtB8uC,EAAS6jF,EAAW3uH,eAEpB4uH,EAAa9jF,EAAO9uC,SAEpB6yH,EAAuBD,EAAW91H,KAAMT,QAExCy2H,EAAU,CAAC,EAEXtoH,EAAa,SAAqBzO,GASpC,MAAsB,mBAARA,GAA8C,iBAAjBA,EAAIgH,UAC1B,mBAAbhH,EAAIsjD,IACb,EAGG0zE,EAAW,SAAmBh3H,GAChC,OAAc,MAAPA,GAAeA,IAAQA,EAAI+R,MACnC,EAGGK,EAAWL,EAAOK,SAIjB6kH,EAA4B,CAC/Bh2H,MAAM,EACNioB,KAAK,EACLguG,OAAO,EACPC,UAAU,GAGX,SAASC,EAAShqE,EAAMxd,EAAMynF,GAG7B,IAAIvlH,EAAG4zE,EACN4xC,GAHDD,EAAMA,GAAOjlH,GAGCM,cAAe,UAG7B,GADA4kH,EAAO38D,KAAOvN,EACTxd,EACJ,IAAM99B,KAAKmlH,GAYVvxC,EAAM91C,EAAM99B,IAAO89B,EAAK7pB,cAAgB6pB,EAAK7pB,aAAcjU,KAE1DwlH,EAAO7wG,aAAc3U,EAAG4zE,GAI3B2xC,EAAI9uD,KAAK31D,YAAa0kH,GAASrnG,WAAWG,YAAaknG,EACxD,CAGD,SAASC,EAAQv3H,GAChB,OAAY,MAAPA,EACGA,EAAM,GAIQ,iBAARA,GAAmC,mBAARA,EACxC42H,EAAY3yH,EAASlD,KAAMf,KAAW,gBAC/BA,CACT,CAOA,IAAIqkE,EAAU,QAEbmzD,EAAc,SAGd5sE,EAAS,SAAUvc,EAAUopF,GAI5B,OAAO,IAAI7sE,EAAOhQ,GAAGjsB,KAAM0f,EAAUopF,EACtC,EAkYD,SAAS7pH,EAAa5N,GAMrB,IAAIiC,IAAWjC,GAAO,WAAYA,GAAOA,EAAIiC,OAC5ChB,EAAOs2H,EAAQv3H,GAEhB,OAAKyO,EAAYzO,KAASg3H,EAAUh3H,KAIpB,UAATiB,GAA+B,IAAXgB,GACR,iBAAXA,GAAuBA,EAAS,GAAOA,EAAS,KAAOjC,EAChE,CAGA,SAASmkB,EAAUglC,EAAM7mD,GAExB,OAAO6mD,EAAKhlC,UAAYglC,EAAKhlC,SAASrN,gBAAkBxU,EAAKwU,aAE9D,CAtZA8zC,EAAOhQ,GAAKgQ,EAAOzpD,UAAY,CAG9Bu2H,OAAQrzD,EAERhjE,YAAaupD,EAGb3oD,OAAQ,EAERiiE,QAAS,WACR,OAAOp2D,EAAM/M,KAAMC,KACpB,EAIAwB,IAAK,SAAUqmD,GAGd,OAAY,MAAPA,EACG/6C,EAAM/M,KAAMC,MAIb6nD,EAAM,EAAI7nD,KAAM6nD,EAAM7nD,KAAKiB,QAAWjB,KAAM6nD,EACpD,EAIA8uE,UAAW,SAAUpuE,GAGpB,IAAIquE,EAAMhtE,EAAOj6C,MAAO3P,KAAKK,cAAekoD,GAM5C,OAHAquE,EAAIC,WAAa72H,KAGV42H,CACR,EAGAjoF,KAAM,SAAUO,GACf,OAAO0a,EAAOjb,KAAM3uC,KAAMkvC,EAC3B,EAEAnsC,IAAK,SAAUmsC,GACd,OAAOlvC,KAAK22H,UAAW/sE,EAAO7mD,IAAK/C,KAAM,SAAUmoD,EAAMr3C,GACxD,OAAOo+B,EAASnvC,KAAMooD,EAAMr3C,EAAGq3C,EAChC,GACD,EAEAr7C,MAAO,WACN,OAAO9M,KAAK22H,UAAW7pH,EAAM4B,MAAO1O,KAAMgB,WAC3C,EAEAk9D,MAAO,WACN,OAAOl+D,KAAKkK,GAAI,EACjB,EAEA+kC,KAAM,WACL,OAAOjvC,KAAKkK,IAAK,EAClB,EAEA4sH,KAAM,WACL,OAAO92H,KAAK22H,UAAW/sE,EAAOmtE,KAAM/2H,KAAM,SAAUg3H,EAAOlmH,GAC1D,OAASA,EAAI,GAAM,CACpB,GACD,EAEAmmH,IAAK,WACJ,OAAOj3H,KAAK22H,UAAW/sE,EAAOmtE,KAAM/2H,KAAM,SAAUg3H,EAAOlmH,GAC1D,OAAOA,EAAI,CACZ,GACD,EAEA5G,GAAI,SAAU4G,GACb,IAAI67B,EAAM3sC,KAAKiB,OACdwxE,GAAK3hE,GAAMA,EAAI,EAAI67B,EAAM,GAC1B,OAAO3sC,KAAK22H,UAAWlkD,GAAK,GAAKA,EAAI9lC,EAAM,CAAE3sC,KAAMyyE,IAAQ,GAC5D,EAEA1/D,IAAK,WACJ,OAAO/S,KAAK62H,YAAc72H,KAAKK,aAChC,EAIAqK,KAAMA,EACNsU,KAAM0tB,EAAI1tB,KACV9W,OAAQwkC,EAAIxkC,QAGb0hD,EAAOm0B,OAASn0B,EAAOhQ,GAAGmkC,OAAS,WAClC,IAAI1oE,EAAS/T,EAAM4mB,EAAK+xC,EAAMi9D,EAAaxkD,EAC1CtxE,EAASJ,UAAW,IAAO,CAAC,EAC5B8P,EAAI,EACJ7P,EAASD,UAAUC,OACnBojF,GAAO,EAsBR,IAnBuB,kBAAXjjF,IACXijF,EAAOjjF,EAGPA,EAASJ,UAAW8P,IAAO,CAAC,EAC5BA,KAIsB,iBAAX1P,GAAwBqM,EAAYrM,KAC/CA,EAAS,CAAC,GAIN0P,IAAM7P,IACVG,EAASpB,KACT8Q,KAGOA,EAAI7P,EAAQ6P,IAGnB,GAAqC,OAA9BuE,EAAUrU,UAAW8P,IAG3B,IAAMxP,KAAQ+T,EACb4kD,EAAO5kD,EAAS/T,GAIF,cAATA,GAAwBF,IAAW64D,IAKnCoqB,GAAQpqB,IAAUrQ,EAAOz8C,cAAe8sD,KAC1Ci9D,EAAcxyH,MAAM+H,QAASwtD,MAC/B/xC,EAAM9mB,EAAQE,GAIboxE,EADIwkD,IAAgBxyH,MAAM+H,QAASyb,GAC3B,GACIgvG,GAAgBttE,EAAOz8C,cAAe+a,GAG1CA,EAFA,CAAC,EAIVgvG,GAAc,EAGd91H,EAAQE,GAASsoD,EAAOm0B,OAAQsG,EAAM3R,EAAOzY,SAGzBr2D,IAATq2D,IACX74D,EAAQE,GAAS24D,IAOrB,OAAO74D,CACR,EAEAwoD,EAAOm0B,OAAQ,CAGdo5C,QAAS,UAAa9zD,EAAU56D,KAAKuuF,UAAW7zF,QAAS,MAAO,IAGhEi0H,SAAS,EAETp8F,MAAO,SAAUq6F,GAChB,MAAM,IAAIz+G,MAAOy+G,EAClB,EAEA53C,KAAM,WAAY,EAElBtwE,cAAe,SAAUnO,GACxB,IAAI2F,EAAOuI,EAIX,SAAMlO,GAAgC,oBAAzBiE,EAASlD,KAAMf,KAI5B2F,EAAQ+wH,EAAU12H,MASK,mBADvBkO,EAAO6kC,EAAOhyC,KAAM4E,EAAO,gBAAmBA,EAAMtE,cACfw1H,EAAW91H,KAAMmN,KAAW4oH,GAClE,EAEAuB,cAAe,SAAUr4H,GACxB,IAAIsC,EAEJ,IAAMA,KAAQtC,EACb,OAAO,EAER,OAAO,CACR,EAIAs4H,WAAY,SAAUlrE,EAAM/2C,EAASghH,GACpCD,EAAShqE,EAAM,CAAE8pE,MAAO7gH,GAAWA,EAAQ6gH,OAASG,EACrD,EAEA1nF,KAAM,SAAU3vC,EAAKkwC,GACpB,IAAIjuC,EAAQ6P,EAAI,EAEhB,GAAKlE,EAAa5N,GAEjB,IADAiC,EAASjC,EAAIiC,OACL6P,EAAI7P,IACqC,IAA3CiuC,EAASnvC,KAAMf,EAAK8R,GAAKA,EAAG9R,EAAK8R,IADnBA,UAMpB,IAAMA,KAAK9R,EACV,IAAgD,IAA3CkwC,EAASnvC,KAAMf,EAAK8R,GAAKA,EAAG9R,EAAK8R,IACrC,MAKH,OAAO9R,CACR,EAIA26D,KAAM,SAAUxR,GACf,IAAIvZ,EACHgoF,EAAM,GACN9lH,EAAI,EACJ9K,EAAWmiD,EAAKniD,SAEjB,IAAMA,EAGL,KAAU4oC,EAAOuZ,EAAMr3C,MAGtB8lH,GAAOhtE,EAAO+P,KAAM/qB,GAGtB,OAAkB,IAAb5oC,GAA+B,KAAbA,EACfmiD,EAAKwhC,YAEK,IAAb3jF,EACGmiD,EAAKlhC,gBAAgB0iE,YAEX,IAAb3jF,GAA+B,IAAbA,EACfmiD,EAAKovE,UAKNX,CACR,EAGA7uE,UAAW,SAAUrb,EAAK8tE,GACzB,IAAIoc,EAAMpc,GAAW,GAarB,OAXY,MAAP9tE,IACC9/B,EAAatN,OAAQotC,IACzBkd,EAAOj6C,MAAOinH,EACE,iBAARlqF,EACN,CAAEA,GAAQA,GAGZhiC,EAAK3K,KAAM62H,EAAKlqF,IAIXkqF,CACR,EAEAY,QAAS,SAAUrvE,EAAMzb,EAAK57B,GAC7B,OAAc,MAAP47B,GAAe,EAAIx7B,EAAQnR,KAAM2sC,EAAKyb,EAAMr3C,EACpD,EAEA2mH,SAAU,SAAUtvE,GACnB,IAAImB,EAAYnB,GAAQA,EAAKuvE,aAC5BC,EAAUxvE,IAAUA,EAAKyvE,eAAiBzvE,GAAOlhC,gBAIlD,OAAQuvG,EAAYryH,KAAMmlD,GAAaquE,GAAWA,EAAQx0G,UAAY,OACvE,EAIAxT,MAAO,SAAUuuD,EAAO25D,GAKvB,IAJA,IAAIlrF,GAAOkrF,EAAO52H,OACjBwxE,EAAI,EACJ3hE,EAAIotD,EAAMj9D,OAEHwxE,EAAI9lC,EAAK8lC,IAChBvU,EAAOptD,KAAQ+mH,EAAQplD,GAKxB,OAFAvU,EAAMj9D,OAAS6P,EAERotD,CACR,EAEA64D,KAAM,SAAUxuE,EAAOrZ,EAAUsf,GAShC,IARA,IACC3yC,EAAU,GACV/K,EAAI,EACJ7P,EAASsnD,EAAMtnD,OACf62H,GAAkBtpE,EAIX19C,EAAI7P,EAAQ6P,KACAo+B,EAAUqZ,EAAOz3C,GAAKA,KAChBgnH,GACxBj8G,EAAQnR,KAAM69C,EAAOz3C,IAIvB,OAAO+K,CACR,EAGA9Y,IAAK,SAAUwlD,EAAOrZ,EAAUnnC,GAC/B,IAAI9G,EAAQE,EACX2P,EAAI,EACJ8lH,EAAM,GAGP,GAAKhqH,EAAa27C,GAEjB,IADAtnD,EAASsnD,EAAMtnD,OACP6P,EAAI7P,EAAQ6P,IAGL,OAFd3P,EAAQ+tC,EAAUqZ,EAAOz3C,GAAKA,EAAG/I,KAGhC6uH,EAAIlsH,KAAMvJ,QAMZ,IAAM2P,KAAKy3C,EAGI,OAFdpnD,EAAQ+tC,EAAUqZ,EAAOz3C,GAAKA,EAAG/I,KAGhC6uH,EAAIlsH,KAAMvJ,GAMb,OAAOw0H,EAAMiB,EACd,EAGAmB,KAAM,EAINhC,QAASA,IAGa,mBAAXruH,SACXkiD,EAAOhQ,GAAIlyC,OAAOomC,UAAapB,EAAKhlC,OAAOomC,WAI5C8b,EAAOjb,KAAM,uEAAuE98B,MAAO,KAC1F,SAAUmmH,EAAI12H,GACbs0H,EAAY,WAAat0H,EAAO,KAAQA,EAAKwU,aAC9C,GAyBD,IAAIrL,EAAMiiC,EAAIjiC,IAGVuU,EAAO0tB,EAAI1tB,KAGX9W,EAASwkC,EAAIxkC,OAGb+vH,EAAa,sBAGbC,EAAW,IAAI71H,OAClB,IAAM41H,EAAa,8BAAgCA,EAAa,KAChE,KAODruE,EAAOvrC,SAAW,SAAU7a,EAAGD,GAC9B,IAAI40H,EAAM50H,GAAKA,EAAE0rB,WAEjB,OAAOzrB,IAAM20H,MAAWA,GAAwB,IAAjBA,EAAInyH,YAIlCxC,EAAE6a,SACD7a,EAAE6a,SAAU85G,GACZ30H,EAAE40H,yBAA8D,GAAnC50H,EAAE40H,wBAAyBD,IAE3D,EAOA,IAAIE,EAAa,+CAEjB,SAASC,EAAYroD,EAAIsoD,GACxB,OAAKA,EAGQ,OAAPtoD,EACG,IAIDA,EAAGnjE,MAAO,GAAI,GAAM,KAAOmjE,EAAGyT,WAAYzT,EAAGhvE,OAAS,GAAIgC,SAAU,IAAO,IAI5E,KAAOgtE,CACf,CAEArmB,EAAO4uE,eAAiB,SAAU78E,GACjC,OAASA,EAAM,IAAKx4C,QAASk1H,EAAYC,EAC1C,EAKA,IAAIG,EAAernH,EAClBsnH,EAAahuH,GAEd,WAEA,IAAIoG,EACH6nH,EACAC,EACAC,EACAC,EAIA1nH,EACA6V,EACA8xG,EACAC,EACAn9G,EAPAnR,EAAOguH,EAUPvB,EAAUvtE,EAAOutE,QACjB8B,EAAU,EACVh/F,EAAO,EACPi/F,EAAaC,KACbC,EAAaD,KACbE,EAAgBF,KAChBG,EAAyBH,KACzBI,EAAY,SAAU/1H,EAAGD,GAIxB,OAHKC,IAAMD,IACVu1H,GAAe,GAET,CACR,EAEAU,EAAW,6HAMX9mH,EAAa,0BAA4BulH,EACxC,0CAGD3d,EAAa,MAAQ2d,EAAa,KAAOvlH,EAAa,OAASulH,EAG9D,gBAAkBA,EAGlB,2DAA6DvlH,EAAa,OAC1EulH,EAAa,OAEdwB,EAAU,KAAO/mH,EAAP,wFAOoB4nG,EAPpB,eAcVof,EAAc,IAAIr3H,OAAQ41H,EAAa,IAAK,KAE5C0B,EAAS,IAAIt3H,OAAQ,IAAM41H,EAAa,KAAOA,EAAa,KAC5D2B,EAAqB,IAAIv3H,OAAQ,IAAM41H,EAAa,WAAaA,EAAa,IAC7EA,EAAa,KACd4B,EAAW,IAAIx3H,OAAQ41H,EAAa,MAEpC6B,EAAU,IAAIz3H,OAAQo3H,GACtBM,EAAc,IAAI13H,OAAQ,IAAMqQ,EAAa,KAE7CsnH,EAAY,CACX7pF,GAAI,IAAI9tC,OAAQ,MAAQqQ,EAAa,KACrCg9B,MAAO,IAAIrtC,OAAQ,QAAUqQ,EAAa,KAC1CxS,IAAK,IAAImC,OAAQ,KAAOqQ,EAAa,SACrCunH,KAAM,IAAI53H,OAAQ,IAAMi4G,GACxB7pE,OAAQ,IAAIpuC,OAAQ,IAAMo3H,GAC1BS,MAAO,IAAI73H,OACV,yDACC41H,EAAa,+BAAiCA,EAAa,cAC3DA,EAAa,aAAeA,EAAa,SAAU,KACrDkC,KAAM,IAAI93H,OAAQ,OAASm3H,EAAW,KAAM,KAI5CY,aAAc,IAAI/3H,OAAQ,IAAM41H,EAC/B,mDAAqDA,EACrD,mBAAqBA,EAAa,mBAAoB,MAGxDoC,EAAU,sCACVC,EAAU,SAGVC,EAAa,mCAEbC,EAAW,OAIXC,EAAY,IAAIp4H,OAAQ,uBAAyB41H,EAChD,uBAAwB,KACzByC,EAAY,SAAUC,EAAQC,GAC7B,IAAIC,EAAO,KAAOF,EAAO7tH,MAAO,GAAM,MAEtC,OAAK8tH,IAUEC,EAAO,EACbxrH,OAAOyrH,aAAcD,EAAO,OAC5BxrH,OAAOyrH,aAAcD,GAAQ,GAAK,MAAe,KAAPA,EAAe,OAC3D,EAMAE,EAAgB,WACfC,IACD,EAEAC,EAAqBC,GACpB,SAAU/yE,GACT,OAAyB,IAAlBA,EAAKmP,UAAqBn0C,EAAUglC,EAAM,WAClD,EACA,CAAEgzE,IAAK,aAAcvwG,KAAM,WAa7B,IACClgB,EAAKgE,MACFg+B,EAAM5/B,EAAM/M,KAAM04H,EAAalxG,YACjCkxG,EAAalxG,YAMdmlB,EAAK+rF,EAAalxG,WAAWtmB,QAAS+E,QACvC,CAAE,MAAQS,GACTiE,EAAO,CACNgE,MAAO,SAAUtN,EAAQs3F,GACxBggC,EAAWhqH,MAAOtN,EAAQ0L,EAAM/M,KAAM24F,GACvC,EACA34F,KAAM,SAAUqB,GACfs3H,EAAWhqH,MAAOtN,EAAQ0L,EAAM/M,KAAMiB,UAAW,GAClD,EAEF,CAEA,SAAS6D,EAAMwoC,EAAUopF,EAASjc,EAAS4gB,GAC1C,IAAI1kH,EAAG5F,EAAGq3C,EAAMkzE,EAAK33H,EAAO43H,EAAQC,EACnCC,EAAa/E,GAAWA,EAAQmB,cAGhC5xH,EAAWywH,EAAUA,EAAQzwH,SAAW,EAKzC,GAHAw0G,EAAUA,GAAW,GAGI,iBAAbntE,IAA0BA,GACxB,IAAbrnC,GAA+B,IAAbA,GAA+B,KAAbA,EAEpC,OAAOw0G,EAIR,IAAM4gB,IACLJ,GAAavE,GACbA,EAAUA,GAAWrlH,EAEhB2nH,GAAiB,CAIrB,GAAkB,KAAb/yH,IAAqBtC,EAAQ62H,EAAWpzH,KAAMkmC,IAGlD,GAAO32B,EAAIhT,EAAO,IAGjB,GAAkB,IAAbsC,EAAiB,CACrB,KAAOmiD,EAAOsuE,EAAQh5F,eAAgB/mB,IASrC,OAAO8jG,EALP,GAAKryD,EAAK31C,KAAOkE,EAEhB,OADAhM,EAAK3K,KAAMy6G,EAASryD,GACbqyD,CAOV,MAIC,GAAKghB,IAAgBrzE,EAAOqzE,EAAW/9F,eAAgB/mB,KACtD7R,EAAKwZ,SAAUo4G,EAAStuE,IACxBA,EAAK31C,KAAOkE,EAGZ,OADAhM,EAAK3K,KAAMy6G,EAASryD,GACbqyD,MAKH,IAAK92G,EAAO,GAElB,OADAgH,EAAKgE,MAAO8rG,EAASic,EAAQh4F,qBAAsB4O,IAC5CmtE,EAGD,IAAO9jG,EAAIhT,EAAO,KAAS+yH,EAAQl5F,uBAEzC,OADA7yB,EAAKgE,MAAO8rG,EAASic,EAAQl5F,uBAAwB7mB,IAC9C8jG,CACR,CAID,KAAM8e,EAAwBjsF,EAAW,MACrC2rF,GAAcA,EAAU70H,KAAMkpC,IAAe,CAYhD,GAVAkuF,EAAcluF,EACdmuF,EAAa/E,EASK,IAAbzwH,IACF6zH,EAAS11H,KAAMkpC,IAAcusF,EAAmBz1H,KAAMkpC,IAAe,CAyBvE,KAtBAmuF,EAAahB,EAASr2H,KAAMkpC,IAAcouF,GAAahF,EAAQxnG,aAC9DwnG,IAQkBA,GAAYV,EAAQhnB,SAG/BssB,EAAM5E,EAAQ1xG,aAAc,OAClCs2G,EAAMzxE,EAAO4uE,eAAgB6C,GAE7B5E,EAAQhxG,aAAc,KAAQ41G,EAAMlE,IAMtCrmH,GADAwqH,EAASI,GAAUruF,IACRpsC,OACH6P,KACPwqH,EAAQxqH,IAAQuqH,EAAM,IAAMA,EAAM,UAAa,IAC9CM,GAAYL,EAAQxqH,IAEtByqH,EAAcD,EAAO73H,KAAM,IAC5B,CAEA,IAIC,OAHAiH,EAAKgE,MAAO8rG,EACXghB,EAAWl2G,iBAAkBi2G,IAEvB/gB,CACR,CAAE,MAAQohB,GACTtC,EAAwBjsF,GAAU,EACnC,CAAE,QACIguF,IAAQlE,GACZV,EAAQjxG,gBAAiB,KAE3B,CACD,CACD,CAID,OAAOq2G,GAAQxuF,EAASlqC,QAAS+0H,EAAU,MAAQzB,EAASjc,EAAS4gB,EACtE,CAQA,SAASjC,KACR,IAAI/xH,EAAO,GAaX,OAXA,SAAS6kC,EAAOhiC,EAAK9I,GASpB,OALKiG,EAAKsD,KAAMT,EAAM,KAAQ0uH,EAAKmD,oBAG3B7vF,EAAO7kC,EAAKmtD,SAEXtoB,EAAOhiC,EAAM,KAAQ9I,CAC/B,CAED,CAMA,SAAS46H,GAAcniF,GAEtB,OADAA,EAAIu9E,IAAY,EACTv9E,CACR,CAMA,SAASoiF,GAAQpiF,GAChB,IAAIzxB,EAAK/W,EAASM,cAAe,YAEjC,IACC,QAASkoC,EAAIzxB,EACd,CAAE,MAAQ1hB,GACT,OAAO,CACR,CAAE,QAGI0hB,EAAG8G,YACP9G,EAAG8G,WAAWG,YAAajH,GAI5BA,EAAK,IACN,CACD,CAMA,SAAS8zG,GAAmBh8H,GAC3B,OAAO,SAAUkoD,GAChB,OAAOhlC,EAAUglC,EAAM,UAAaA,EAAKloD,OAASA,CACnD,CACD,CAMA,SAASi8H,GAAoBj8H,GAC5B,OAAO,SAAUkoD,GAChB,OAAShlC,EAAUglC,EAAM,UAAahlC,EAAUglC,EAAM,YACrDA,EAAKloD,OAASA,CAChB,CACD,CAMA,SAASk8H,GAAsB7kE,GAG9B,OAAO,SAAUnP,GAKhB,MAAK,SAAUA,EASTA,EAAKl5B,aAAgC,IAAlBk5B,EAAKmP,SAGvB,UAAWnP,EACV,UAAWA,EAAKl5B,WACbk5B,EAAKl5B,WAAWqoC,WAAaA,EAE7BnP,EAAKmP,WAAaA,EAMpBnP,EAAKhlB,aAAem0B,GAG1BnP,EAAKhlB,cAAgBm0B,GACpB2jE,EAAoB9yE,KAAWmP,EAG3BnP,EAAKmP,WAAaA,EAKd,UAAWnP,GACfA,EAAKmP,WAAaA,CAK3B,CACD,CAMA,SAAS8kE,GAAwBxiF,GAChC,OAAOmiF,GAAc,SAAUl7H,GAE9B,OADAA,GAAYA,EACLk7H,GAAc,SAAUX,EAAMv/G,GAMpC,IALA,IAAI42D,EACH4pD,EAAeziF,EAAI,GAAIwhF,EAAKn6H,OAAQJ,GACpCiQ,EAAIurH,EAAap7H,OAGV6P,KACFsqH,EAAQ3oD,EAAI4pD,EAAcvrH,MAC9BsqH,EAAM3oD,KAAS52D,EAAS42D,GAAM2oD,EAAM3oD,IAGvC,EACD,EACD,CAOA,SAASgpD,GAAahF,GACrB,OAAOA,QAAmD,IAAjCA,EAAQh4F,sBAAwCg4F,CAC1E,CAOA,SAASuE,GAAapsF,GACrB,IAAI0tF,EACHjG,EAAMznF,EAAOA,EAAKgpF,eAAiBhpF,EAAO6pF,EAO3C,OAAKpC,GAAOjlH,GAA6B,IAAjBilH,EAAIrwH,UAAmBqwH,EAAIpvG,iBAMnDA,GADA7V,EAAWilH,GACgBpvG,gBAC3B8xG,GAAkBnvE,EAAO6tE,SAAUrmH,GAInCyK,EAAUoL,EAAgBpL,SACzBoL,EAAgBs1G,uBAChBt1G,EAAgBu1G,kBAOZv1G,EAAgBu1G,mBAMpB/D,GAAgBrnH,IACdkrH,EAAYlrH,EAASqrH,cAAiBH,EAAU3+G,MAAQ2+G,GAG1DA,EAAUjpH,iBAAkB,SAAU0nH,GAOvChF,EAAQ2G,QAAUV,GAAQ,SAAU7zG,GAEnC,OADAlB,EAAgBrV,YAAauW,GAAK3V,GAAKo3C,EAAOutE,SACtC/lH,EAASurH,oBACfvrH,EAASurH,kBAAmB/yE,EAAOutE,SAAUl2H,MAChD,GAKA80H,EAAQ6G,kBAAoBZ,GAAQ,SAAU7zG,GAC7C,OAAOtM,EAAQ9b,KAAMooB,EAAI,IAC1B,GAIA4tG,EAAQhnB,MAAQitB,GAAQ,WACvB,OAAO5qH,EAASkU,iBAAkB,SACnC,GAWAywG,EAAQ8G,OAASb,GAAQ,WACxB,IAEC,OADA5qH,EAASsN,cAAe,oBACjB,CACR,CAAE,MAAQjY,GACT,OAAO,CACR,CACD,GAGKsvH,EAAQ2G,SACZ/D,EAAK70H,OAAOqsC,GAAK,SAAU39B,GAC1B,IAAIsqH,EAAStqH,EAAGrP,QAASs3H,EAAWC,GACpC,OAAO,SAAUvyE,GAChB,OAAOA,EAAKpjC,aAAc,QAAW+3G,CACtC,CACD,EACAnE,EAAK9zH,KAAKsrC,GAAK,SAAU39B,EAAIikH,GAC5B,QAAuC,IAA3BA,EAAQh5F,gBAAkCs7F,EAAiB,CACtE,IAAI5wE,EAAOsuE,EAAQh5F,eAAgBjrB,GACnC,OAAO21C,EAAO,CAAEA,GAAS,EAC1B,CACD,IAEAwwE,EAAK70H,OAAOqsC,GAAM,SAAU39B,GAC3B,IAAIsqH,EAAStqH,EAAGrP,QAASs3H,EAAWC,GACpC,OAAO,SAAUvyE,GAChB,IAAIvZ,OAAwC,IAA1BuZ,EAAK40E,kBACtB50E,EAAK40E,iBAAkB,MACxB,OAAOnuF,GAAQA,EAAKztC,QAAU27H,CAC/B,CACD,EAIAnE,EAAK9zH,KAAKsrC,GAAK,SAAU39B,EAAIikH,GAC5B,QAAuC,IAA3BA,EAAQh5F,gBAAkCs7F,EAAiB,CACtE,IAAInqF,EAAM99B,EAAGy3C,EACZJ,EAAOsuE,EAAQh5F,eAAgBjrB,GAEhC,GAAK21C,EAAO,CAIX,IADAvZ,EAAOuZ,EAAK40E,iBAAkB,QACjBnuF,EAAKztC,QAAUqR,EAC3B,MAAO,CAAE21C,GAMV,IAFAI,EAAQkuE,EAAQkG,kBAAmBnqH,GACnC1B,EAAI,EACMq3C,EAAOI,EAAOz3C,MAEvB,IADA89B,EAAOuZ,EAAK40E,iBAAkB,QACjBnuF,EAAKztC,QAAUqR,EAC3B,MAAO,CAAE21C,EAGZ,CAEA,MAAO,EACR,CACD,GAIDwwE,EAAK9zH,KAAK3E,IAAM,SAAU8K,EAAKyrH,GAC9B,YAA6C,IAAjCA,EAAQh4F,qBACZg4F,EAAQh4F,qBAAsBzzB,GAI9ByrH,EAAQnxG,iBAAkBta,EAEnC,EAGA2tH,EAAK9zH,KAAK6qC,MAAQ,SAAUnR,EAAWk4F,GACtC,QAA+C,IAAnCA,EAAQl5F,wBAA0Cw7F,EAC7D,OAAOtC,EAAQl5F,uBAAwBgB,EAEzC,EAOAy6F,EAAY,GAIZgD,GAAQ,SAAU7zG,GAEjB,IAAIo0B,EAEJt1B,EAAgBrV,YAAauW,GAAK6C,UACjC,UAAYmsG,EAAZ,iDACiBA,EADjB,oEAMKhvG,EAAG7C,iBAAkB,cAAerkB,QACzC+3H,EAAUtuH,KAAM,MAAQutH,EAAa,aAAeuB,EAAW,KAI1DrxG,EAAG7C,iBAAkB,QAAU6xG,EAAU,MAAOl2H,QACrD+3H,EAAUtuH,KAAM,MAMXyd,EAAG7C,iBAAkB,KAAO6xG,EAAU,MAAOl2H,QAClD+3H,EAAUtuH,KAAM,YAOXyd,EAAG7C,iBAAkB,YAAarkB,QACvC+3H,EAAUtuH,KAAM,aAKjB6xC,EAAQnrC,EAASM,cAAe,UAC1B+T,aAAc,OAAQ,UAC5B0C,EAAGvW,YAAa2qC,GAAQ92B,aAAc,OAAQ,KAQ9CwB,EAAgBrV,YAAauW,GAAKmvC,UAAW,EACM,IAA9CnvC,EAAG7C,iBAAkB,aAAcrkB,QACvC+3H,EAAUtuH,KAAM,WAAY,cAQ7B6xC,EAAQnrC,EAASM,cAAe,UAC1B+T,aAAc,OAAQ,IAC5B0C,EAAGvW,YAAa2qC,GACVp0B,EAAG7C,iBAAkB,aAAcrkB,QACxC+3H,EAAUtuH,KAAM,MAAQutH,EAAa,QAAUA,EAAa,KAC3DA,EAAa,eAEhB,GAEMlC,EAAQ8G,QAQb7D,EAAUtuH,KAAM,QAGjBsuH,EAAYA,EAAU/3H,QAAU,IAAIoB,OAAQ22H,EAAUv1H,KAAM,MAM5D81H,EAAY,SAAU/1H,EAAGD,GAGxB,GAAKC,IAAMD,EAEV,OADAu1H,GAAe,EACR,EAIR,IAAIkE,GAAWx5H,EAAE40H,yBAA2B70H,EAAE60H,wBAC9C,OAAK4E,IAgBU,GAPfA,GAAYx5H,EAAEo0H,eAAiBp0H,KAASD,EAAEq0H,eAAiBr0H,GAC1DC,EAAE40H,wBAAyB70H,GAG3B,KAIGwyH,EAAQkH,cAAgB15H,EAAE60H,wBAAyB50H,KAAQw5H,EAOzDx5H,IAAM4N,GAAY5N,EAAEo0H,eAAiBa,GACzC5zH,EAAKwZ,SAAUo6G,EAAcj1H,IACrB,EAOJD,IAAM6N,GAAY7N,EAAEq0H,eAAiBa,GACzC5zH,EAAKwZ,SAAUo6G,EAAcl1H,GACtB,EAIDs1H,EACJ3nH,EAAQnR,KAAM84H,EAAWr1H,GAAM0N,EAAQnR,KAAM84H,EAAWt1H,GAC1D,EAGe,EAAVy5H,GAAe,EAAI,EAC3B,EAEO5rH,GAvSCA,CAwST,CAopBA,IAAMN,KAlpBNjM,EAAKgX,QAAU,SAAUqhH,EAAMrrD,GAC9B,OAAOhtE,EAAMq4H,EAAM,KAAM,KAAMrrD,EAChC,EAEAhtE,EAAK6iD,gBAAkB,SAAUS,EAAM+0E,GAGtC,GAFAlC,GAAa7yE,GAER4wE,IACHO,EAAwB4D,EAAO,QAC7BlE,IAAcA,EAAU70H,KAAM+4H,IAEjC,IACC,IAAItG,EAAM/6G,EAAQ9b,KAAMooD,EAAM+0E,GAG9B,GAAKtG,GAAOb,EAAQ6G,mBAIlBz0E,EAAK/2C,UAAuC,KAA3B+2C,EAAK/2C,SAASpL,SAChC,OAAO4wH,CAET,CAAE,MAAQnwH,GACT6yH,EAAwB4D,GAAM,EAC/B,CAGD,OAAOr4H,EAAMq4H,EAAM9rH,EAAU,KAAM,CAAE+2C,IAASlnD,OAAS,CACxD,EAEA4D,EAAKwZ,SAAW,SAAUo4G,EAAStuE,GAUlC,OAHOsuE,EAAQmB,eAAiBnB,IAAarlH,GAC5C4pH,GAAavE,GAEP7sE,EAAOvrC,SAAUo4G,EAAStuE,EAClC,EAGAtjD,EAAKglD,KAAO,SAAU1B,EAAM7mD,IAOpB6mD,EAAKyvE,eAAiBzvE,IAAU/2C,GACtC4pH,GAAa7yE,GAGd,IAAIvO,EAAK++E,EAAKwE,WAAY77H,EAAKwU,eAG9B4uE,EAAM9qC,GAAM7H,EAAOhyC,KAAM44H,EAAKwE,WAAY77H,EAAKwU,eAC9C8jC,EAAIuO,EAAM7mD,GAAOy3H,QACjBn1H,EAEF,YAAaA,IAAR8gF,EACGA,EAGDv8B,EAAKpjC,aAAczjB,EAC3B,EAEAuD,EAAKm2B,MAAQ,SAAUq6F,GACtB,MAAM,IAAIz+G,MAAO,0CAA4Cy+G,EAC9D,EAMAzrE,EAAOwzE,WAAa,SAAU5iB,GAC7B,IAAIryD,EACHk1E,EAAa,GACb5qD,EAAI,EACJ3hE,EAAI,EAWL,GAJAgoH,GAAgB/C,EAAQuH,WACxBzE,GAAa9C,EAAQuH,YAAcxwH,EAAM/M,KAAMy6G,EAAS,GACxDx7F,EAAKjf,KAAMy6G,EAAS+e,GAEfT,EAAe,CACnB,KAAU3wE,EAAOqyD,EAAS1pG,MACpBq3C,IAASqyD,EAAS1pG,KACtB2hE,EAAI4qD,EAAW3yH,KAAMoG,IAGvB,KAAQ2hE,KACPvqE,EAAOnI,KAAMy6G,EAAS6iB,EAAY5qD,GAAK,EAEzC,CAMA,OAFAomD,EAAY,KAELre,CACR,EAEA5wD,EAAOhQ,GAAGwjF,WAAa,WACtB,OAAOp9H,KAAK22H,UAAW/sE,EAAOwzE,WAAYtwH,EAAM4B,MAAO1O,OACxD,EAEA24H,EAAO/uE,EAAOszE,KAAO,CAGpBpB,YAAa,GAEbyB,aAAcxB,GAEdr4H,MAAOs2H,EAEPmD,WAAY,CAAC,EAEbt4H,KAAM,CAAC,EAEPq9C,SAAU,CACT,IAAK,CAAEi5E,IAAK,aAAcj9D,OAAO,GACjC,IAAK,CAAEi9D,IAAK,cACZ,IAAK,CAAEA,IAAK,kBAAmBj9D,OAAO,GACtC,IAAK,CAAEi9D,IAAK,oBAGbqC,UAAW,CACVvD,KAAM,SAAUv2H,GAWf,OAVAA,EAAO,GAAMA,EAAO,GAAIP,QAASs3H,EAAWC,GAG5Ch3H,EAAO,IAAQA,EAAO,IAAOA,EAAO,IAAOA,EAAO,IAAO,IACvDP,QAASs3H,EAAWC,GAEF,OAAfh3H,EAAO,KACXA,EAAO,GAAM,IAAMA,EAAO,GAAM,KAG1BA,EAAMoJ,MAAO,EAAG,EACxB,EAEAotH,MAAO,SAAUx2H,GAkChB,OAtBAA,EAAO,GAAMA,EAAO,GAAIoS,cAEU,QAA7BpS,EAAO,GAAIoJ,MAAO,EAAG,IAGnBpJ,EAAO,IACZmB,EAAKm2B,MAAOt3B,EAAO,IAKpBA,EAAO,KAASA,EAAO,GACtBA,EAAO,IAAQA,EAAO,IAAO,GAC7B,GAAqB,SAAfA,EAAO,IAAiC,QAAfA,EAAO,KAEvCA,EAAO,KAAWA,EAAO,GAAMA,EAAO,IAAwB,QAAfA,EAAO,KAG3CA,EAAO,IAClBmB,EAAKm2B,MAAOt3B,EAAO,IAGbA,CACR,EAEA+sC,OAAQ,SAAU/sC,GACjB,IAAI+5H,EACHC,GAAYh6H,EAAO,IAAOA,EAAO,GAElC,OAAKs2H,EAAUE,MAAM/1H,KAAMT,EAAO,IAC1B,MAIHA,EAAO,GACXA,EAAO,GAAMA,EAAO,IAAOA,EAAO,IAAO,GAG9Bg6H,GAAY5D,EAAQ31H,KAAMu5H,KAGnCD,EAAS/B,GAAUgC,GAAU,MAG7BD,EAASC,EAASxsH,QAAS,IAAKwsH,EAASz8H,OAASw8H,GAAWC,EAASz8H,UAGxEyC,EAAO,GAAMA,EAAO,GAAIoJ,MAAO,EAAG2wH,GAClC/5H,EAAO,GAAMg6H,EAAS5wH,MAAO,EAAG2wH,IAI1B/5H,EAAMoJ,MAAO,EAAG,GACxB,GAGDhJ,OAAQ,CAEP5D,IAAK,SAAUy9H,GACd,IAAIC,EAAmBD,EAAiBx6H,QAASs3H,EAAWC,GAAY5kH,cACxE,MAA4B,MAArB6nH,EACN,WACC,OAAO,CACR,EACA,SAAUx1E,GACT,OAAOhlC,EAAUglC,EAAMy1E,EACxB,CACF,EAEAluF,MAAO,SAAUnR,GAChB,IAAIs/F,EAAU3E,EAAY36F,EAAY,KAEtC,OAAOs/F,IACJA,EAAU,IAAIx7H,OAAQ,MAAQ41H,EAAa,IAAM15F,EAClD,IAAM05F,EAAa,SACpBiB,EAAY36F,EAAW,SAAU4pB,GAChC,OAAO01E,EAAQ15H,KACY,iBAAnBgkD,EAAK5pB,WAA0B4pB,EAAK5pB,gBACb,IAAtB4pB,EAAKpjC,cACXojC,EAAKpjC,aAAc,UACpB,GAEH,EACF,EAEAk1G,KAAM,SAAU34H,EAAMmpE,EAAUyqD,GAC/B,OAAO,SAAU/sE,GAChB,IAAIh/C,EAAStE,EAAKglD,KAAM1B,EAAM7mD,GAE9B,OAAe,MAAV6H,EACgB,OAAbshE,GAEFA,IAINthE,GAAU,GAEQ,MAAbshE,EACGthE,IAAW+rH,EAED,OAAbzqD,EACGthE,IAAW+rH,EAED,OAAbzqD,EACGyqD,GAAqC,IAA5B/rH,EAAO+H,QAASgkH,GAEf,OAAbzqD,EACGyqD,GAAS/rH,EAAO+H,QAASgkH,IAAW,EAE1B,OAAbzqD,EACGyqD,GAAS/rH,EAAO2D,OAAQooH,EAAMj0H,UAAai0H,EAEjC,OAAbzqD,GACK,IAAMthE,EAAOhG,QAASu2H,EAAa,KAAQ,KAClDxoH,QAASgkH,IAAW,EAEL,OAAbzqD,IACGthE,IAAW+rH,GAAS/rH,EAAO2D,MAAO,EAAGooH,EAAMj0H,OAAS,KAAQi0H,EAAQ,KAI7E,CACD,EAEAgF,MAAO,SAAUj6H,EAAM69H,EAAMC,EAAW7/D,EAAOjvB,GAC9C,IAAI+uF,EAAgC,QAAvB/9H,EAAK6M,MAAO,EAAG,GAC3BmxH,EAA+B,SAArBh+H,EAAK6M,OAAQ,GACvBoxH,EAAkB,YAATJ,EAEV,OAAiB,IAAV5/D,GAAwB,IAATjvB,EAGrB,SAAUkZ,GACT,QAASA,EAAKl5B,UACf,EAEA,SAAUk5B,EAAMg2E,EAAUC,GACzB,IAAInyF,EAAOoyF,EAAYzvF,EAAMqkE,EAAWrjG,EACvCurH,EAAM6C,IAAWC,EAAU,cAAgB,kBAC3C3wF,EAAS6a,EAAKl5B,WACd3tB,EAAO48H,GAAU/1E,EAAKhlC,SAASrN,cAC/BwoH,GAAYF,IAAQF,EACpBK,GAAO,EAER,GAAKjxF,EAAS,CAGb,GAAK0wF,EAAS,CACb,KAAQ7C,GAAM,CAEb,IADAvsF,EAAOuZ,EACGvZ,EAAOA,EAAMusF,IACtB,GAAK+C,EACJ/6G,EAAUyrB,EAAMttC,GACE,IAAlBstC,EAAK5oC,SAEL,OAAO,EAKT4J,EAAQurH,EAAe,SAATl7H,IAAoB2P,GAAS,aAC5C,CACA,OAAO,CACR,CAKA,GAHAA,EAAQ,CAAEquH,EAAU3wF,EAAO37B,WAAa27B,EAAOkxF,WAG1CP,GAAWK,GASf,IAHAC,GADAtrB,GADAhnE,GADAoyF,EAAa/wF,EAAQ6pF,KAAe7pF,EAAQ6pF,GAAY,CAAC,IACrCl3H,IAAU,IACX,KAAQg5H,GAAWhtF,EAAO,KACzBA,EAAO,GAC3B2C,EAAOqkE,GAAa3lE,EAAO/lB,WAAY0rF,GAE7BrkE,IAASqkE,GAAarkE,GAAQA,EAAMusF,KAG3CoD,EAAOtrB,EAAY,IAAOrjG,EAAMnF,OAGlC,GAAuB,IAAlBmkC,EAAK5oC,YAAoBu4H,GAAQ3vF,IAASuZ,EAAO,CACrDk2E,EAAYp+H,GAAS,CAAEg5H,EAAShmB,EAAWsrB,GAC3C,KACD,OAeD,GATKD,IAIJC,EADAtrB,GADAhnE,GADAoyF,EAAal2E,EAAMgvE,KAAehvE,EAAMgvE,GAAY,CAAC,IACjCl3H,IAAU,IACX,KAAQg5H,GAAWhtF,EAAO,KAMhC,IAATsyF,EAGJ,MAAU3vF,IAASqkE,GAAarkE,GAAQA,EAAMusF,KAC3CoD,EAAOtrB,EAAY,IAAOrjG,EAAMnF,WAE3ByzH,EACN/6G,EAAUyrB,EAAMttC,GACE,IAAlBstC,EAAK5oC,cACHu4H,IAGGD,KACJD,EAAazvF,EAAMuoF,KAChBvoF,EAAMuoF,GAAY,CAAC,IACVl3H,GAAS,CAAEg5H,EAASsF,IAG5B3vF,IAASuZ,MAUlB,OADAo2E,GAAQtvF,KACQivB,GAAWqgE,EAAOrgE,IAAU,GAAKqgE,EAAOrgE,GAAS,CAClE,CACD,CACF,EAEAztB,OAAQ,SAAUwiB,EAAQpyD,GAMzB,IAAIgP,EACH+pC,EAAK++E,EAAKc,QAASxmE,IAAY0lE,EAAK8F,WAAYxrE,EAAOn9C,gBACtDjR,EAAKm2B,MAAO,uBAAyBi4B,GAKvC,OAAKrZ,EAAIu9E,GACDv9E,EAAI/4C,GAIP+4C,EAAG34C,OAAS,GAChB4O,EAAO,CAAEojD,EAAQA,EAAQ,GAAIpyD,GACtB83H,EAAK8F,WAAWx3H,eAAgBgsD,EAAOn9C,eAC7CimH,GAAc,SAAUX,EAAMv/G,GAI7B,IAHA,IAAI6iC,EACHixB,EAAU/1B,EAAIwhF,EAAMv6H,GACpBiQ,EAAI6+D,EAAQ1uE,OACL6P,KAEPsqH,EADA18E,EAAMxtC,EAAQnR,KAAMq7H,EAAMzrD,EAAS7+D,OAClB+K,EAAS6iC,GAAQixB,EAAS7+D,GAE7C,GACA,SAAUq3C,GACT,OAAOvO,EAAIuO,EAAM,EAAGt4C,EACrB,GAGK+pC,CACR,GAGD6/E,QAAS,CAGRiF,IAAK3C,GAAc,SAAU1uF,GAK5B,IAAIkP,EAAQ,GACXi+D,EAAU,GACVp0C,EAAUu4D,GAAStxF,EAASlqC,QAAS+0H,EAAU,OAEhD,OAAO9xD,EAAS+wD,GACf4E,GAAc,SAAUX,EAAMv/G,EAASsiH,EAAUC,GAMhD,IALA,IAAIj2E,EACHy2E,EAAYx4D,EAASg1D,EAAM,KAAMgD,EAAK,IACtCttH,EAAIsqH,EAAKn6H,OAGF6P,MACAq3C,EAAOy2E,EAAW9tH,MACxBsqH,EAAMtqH,KAAS+K,EAAS/K,GAAMq3C,GAGjC,GACA,SAAUA,EAAMg2E,EAAUC,GAOzB,OANA7hF,EAAO,GAAM4L,EACbie,EAAS7pB,EAAO,KAAM6hF,EAAK5jB,GAI3Bj+D,EAAO,GAAM,MACLi+D,EAAQ/vG,KACjB,CACF,GAEAD,IAAKuxH,GAAc,SAAU1uF,GAC5B,OAAO,SAAU8a,GAChB,OAAOtjD,EAAMwoC,EAAU8a,GAAOlnD,OAAS,CACxC,CACD,GAEAod,SAAU09G,GAAc,SAAUpiE,GAEjC,OADAA,EAAOA,EAAKx2D,QAASs3H,EAAWC,GACzB,SAAUvyE,GAChB,OAASA,EAAKwhC,aAAe//B,EAAO+P,KAAMxR,IAASj3C,QAASyoD,IAAU,CACvE,CACD,GASAklE,KAAM9C,GAAc,SAAU8C,GAO7B,OAJM9E,EAAY51H,KAAM06H,GAAQ,KAC/Bh6H,EAAKm2B,MAAO,qBAAuB6jG,GAEpCA,EAAOA,EAAK17H,QAASs3H,EAAWC,GAAY5kH,cACrC,SAAUqyC,GAChB,IAAI22E,EACJ,GACC,GAAOA,EAAW/F,EACjB5wE,EAAK02E,KACL12E,EAAKpjC,aAAc,aAAgBojC,EAAKpjC,aAAc,QAGtD,OADA+5G,EAAWA,EAAShpH,iBACA+oH,GAA2C,IAAnCC,EAAS5tH,QAAS2tH,EAAO,YAE3C12E,EAAOA,EAAKl5B,aAAkC,IAAlBk5B,EAAKniD,UAC7C,OAAO,CACR,CACD,GAGA5E,OAAQ,SAAU+mD,GACjB,IAAIlwB,EAAOlnB,EAAO+1B,UAAY/1B,EAAO+1B,SAAS7O,KAC9C,OAAOA,GAAQA,EAAKnrB,MAAO,KAAQq7C,EAAK31C,EACzC,EAEA3M,KAAM,SAAUsiD,GACf,OAAOA,IAASlhC,CACjB,EAEA6L,MAAO,SAAUq1B,GAChB,OAAOA,IA5oCV,WACC,IACC,OAAO/2C,EAAS2wB,aACjB,CAAE,MAAQg9F,GAAQ,CACnB,CAwoCmBC,IACf5tH,EAAS6tH,eACL92E,EAAKloD,MAAQkoD,EAAK+2E,OAAS/2E,EAAKrd,SACtC,EAGAlZ,QAASuqG,IAAsB,GAC/B7kE,SAAU6kE,IAAsB,GAEhC9kE,QAAS,SAAUlP,GAIlB,OAAShlC,EAAUglC,EAAM,YAAeA,EAAKkP,SAC1Cl0C,EAAUglC,EAAM,aAAgBA,EAAKwP,QACzC,EAEAA,SAAU,SAAUxP,GAWnB,OALKA,EAAKl5B,YAETk5B,EAAKl5B,WAAW5C,eAGQ,IAAlB87B,EAAKwP,QACb,EAGAzpB,MAAO,SAAUia,GAMhB,IAAMA,EAAOA,EAAKx2C,WAAYw2C,EAAMA,EAAOA,EAAK34B,YAC/C,GAAK24B,EAAKniD,SAAW,EACpB,OAAO,EAGT,OAAO,CACR,EAEAsnC,OAAQ,SAAU6a,GACjB,OAAQwwE,EAAKc,QAAQvrF,MAAOia,EAC7B,EAGAwzD,OAAQ,SAAUxzD,GACjB,OAAOmyE,EAAQn2H,KAAMgkD,EAAKhlC,SAC3B,EAEAo5B,MAAO,SAAU4L,GAChB,OAAOkyE,EAAQl2H,KAAMgkD,EAAKhlC,SAC3B,EAEAxP,OAAQ,SAAUw0C,GACjB,OAAOhlC,EAAUglC,EAAM,UAA2B,WAAdA,EAAKloD,MACxCkjB,EAAUglC,EAAM,SAClB,EAEAwR,KAAM,SAAUxR,GACf,IAAI0B,EACJ,OAAO1mC,EAAUglC,EAAM,UAA2B,SAAdA,EAAKloD,OAKI,OAAxC4pD,EAAO1B,EAAKpjC,aAAc,UACN,SAAvB8kC,EAAK/zC,cACR,EAGAooD,MAAOk+D,GAAwB,WAC9B,MAAO,CAAE,EACV,GAEAntF,KAAMmtF,GAAwB,SAAU+C,EAAel+H,GACtD,MAAO,CAAEA,EAAS,EACnB,GAEAiJ,GAAIkyH,GAAwB,SAAU+C,EAAel+H,EAAQJ,GAC5D,MAAO,CAAEA,EAAW,EAAIA,EAAWI,EAASJ,EAC7C,GAEAi2H,KAAMsF,GAAwB,SAAUC,EAAcp7H,GAErD,IADA,IAAI6P,EAAI,EACAA,EAAI7P,EAAQ6P,GAAK,EACxBurH,EAAa3xH,KAAMoG,GAEpB,OAAOurH,CACR,GAEApF,IAAKmF,GAAwB,SAAUC,EAAcp7H,GAEpD,IADA,IAAI6P,EAAI,EACAA,EAAI7P,EAAQ6P,GAAK,EACxBurH,EAAa3xH,KAAMoG,GAEpB,OAAOurH,CACR,GAEArlG,GAAIolG,GAAwB,SAAUC,EAAcp7H,EAAQJ,GAC3D,IAAIiQ,EAUJ,IAPCA,EADIjQ,EAAW,EACXA,EAAWI,EACJJ,EAAWI,EAClBA,EAEAJ,IAGKiQ,GAAK,GACdurH,EAAa3xH,KAAMoG,GAEpB,OAAOurH,CACR,GAEAjkG,GAAIgkG,GAAwB,SAAUC,EAAcp7H,EAAQJ,GAE3D,IADA,IAAIiQ,EAAIjQ,EAAW,EAAIA,EAAWI,EAASJ,IACjCiQ,EAAI7P,GACbo7H,EAAa3xH,KAAMoG,GAEpB,OAAOurH,CACR,KAIF1D,EAAKc,QAAQ2F,IAAMzG,EAAKc,QAAQvvH,GAGrB,CAAEm1H,OAAO,EAAMC,UAAU,EAAM57E,MAAM,EAAM67E,UAAU,EAAM1hF,OAAO,GAC5E86E,EAAKc,QAAS3oH,GAAMmrH,GAAmBnrH,GAExC,IAAMA,IAAK,CAAE0uH,QAAQ,EAAMt4G,OAAO,GACjCyxG,EAAKc,QAAS3oH,GAAMorH,GAAoBprH,GAIzC,SAAS2tH,KAAc,CAIvB,SAAS/C,GAAUruF,EAAUoyF,GAC5B,IAAI9vD,EAASjsE,EAAOmyE,EAAQ51E,EAC3By/H,EAAOpE,EAAQqE,EACfjU,EAAS0N,EAAY/rF,EAAW,KAEjC,GAAKq+E,EACJ,OAAO+T,EAAY,EAAI/T,EAAO5+G,MAAO,GAOtC,IAJA4yH,EAAQryF,EACRiuF,EAAS,GACTqE,EAAahH,EAAK6E,UAEVkC,GAAQ,CA2Bf,IAAMz/H,KAxBA0vE,KAAajsE,EAAQi2H,EAAOxyH,KAAMu4H,MAClCh8H,IAGJg8H,EAAQA,EAAM5yH,MAAOpJ,EAAO,GAAIzC,SAAYy+H,GAE7CpE,EAAO5wH,KAAQmrE,EAAS,KAGzBlG,GAAU,GAGHjsE,EAAQk2H,EAAmBzyH,KAAMu4H,MACvC/vD,EAAUjsE,EAAM6wD,QAChBshB,EAAOnrE,KAAM,CACZvJ,MAAOwuE,EAGP1vE,KAAMyD,EAAO,GAAIP,QAAS+0H,EAAU,OAErCwH,EAAQA,EAAM5yH,MAAO6iE,EAAQ1uE,SAIhB03H,EAAK70H,SACXJ,EAAQs2H,EAAW/5H,GAAOkH,KAAMu4H,KAAgBC,EAAY1/H,MAChEyD,EAAQi8H,EAAY1/H,GAAQyD,MAC9BisE,EAAUjsE,EAAM6wD,QAChBshB,EAAOnrE,KAAM,CACZvJ,MAAOwuE,EACP1vE,KAAMA,EACN4b,QAASnY,IAEVg8H,EAAQA,EAAM5yH,MAAO6iE,EAAQ1uE,SAI/B,IAAM0uE,EACL,KAEF,CAKA,OAAK8vD,EACGC,EAAMz+H,OAGPy+H,EACN76H,EAAKm2B,MAAOqS,GAGZ+rF,EAAY/rF,EAAUiuF,GAASxuH,MAAO,EACxC,CAEA,SAAS6uH,GAAY9lD,GAIpB,IAHA,IAAI/kE,EAAI,EACP67B,EAAMkpC,EAAO50E,OACbosC,EAAW,GACJv8B,EAAI67B,EAAK77B,IAChBu8B,GAAYwoC,EAAQ/kE,GAAI3P,MAEzB,OAAOksC,CACR,CAEA,SAAS6tF,GAAe90D,EAAShT,EAAYpI,GAC5C,IAAImwE,EAAM/nE,EAAW+nE,IACpByE,EAAOxsE,EAAWxoC,KAClB3gB,EAAM21H,GAAQzE,EACd0E,EAAmB70E,GAAgB,eAAR/gD,EAC3B61H,EAAW7lG,IAEZ,OAAOm5B,EAAW8K,MAGjB,SAAU/V,EAAMsuE,EAAS2H,GACxB,KAAUj2E,EAAOA,EAAMgzE,IACtB,GAAuB,IAAlBhzE,EAAKniD,UAAkB65H,EAC3B,OAAOz5D,EAASje,EAAMsuE,EAAS2H,GAGjC,OAAO,CACR,EAGA,SAAUj2E,EAAMsuE,EAAS2H,GACxB,IAAI2B,EAAU1B,EACb2B,EAAW,CAAE/G,EAAS6G,GAGvB,GAAK1B,GACJ,KAAUj2E,EAAOA,EAAMgzE,IACtB,IAAuB,IAAlBhzE,EAAKniD,UAAkB65H,IACtBz5D,EAASje,EAAMsuE,EAAS2H,GAC5B,OAAO,OAKV,KAAUj2E,EAAOA,EAAMgzE,IACtB,GAAuB,IAAlBhzE,EAAKniD,UAAkB65H,EAG3B,GAFAxB,EAAal2E,EAAMgvE,KAAehvE,EAAMgvE,GAAY,CAAC,GAEhDyI,GAAQz8G,EAAUglC,EAAMy3E,GAC5Bz3E,EAAOA,EAAMgzE,IAAShzE,MAChB,KAAO43E,EAAW1B,EAAYp0H,KACpC81H,EAAU,KAAQ9G,GAAW8G,EAAU,KAAQD,EAG/C,OAASE,EAAU,GAAMD,EAAU,GAOnC,GAHA1B,EAAYp0H,GAAQ+1H,EAGbA,EAAU,GAAM55D,EAASje,EAAMsuE,EAAS2H,GAC9C,OAAO,CAET,CAIH,OAAO,CACR,CACF,CAEA,SAAS6B,GAAgBC,GACxB,OAAOA,EAASj/H,OAAS,EACxB,SAAUknD,EAAMsuE,EAAS2H,GAExB,IADA,IAAIttH,EAAIovH,EAASj/H,OACT6P,KACP,IAAMovH,EAAUpvH,GAAKq3C,EAAMsuE,EAAS2H,GACnC,OAAO,EAGT,OAAO,CACR,EACA8B,EAAU,EACZ,CAWA,SAASC,GAAUvB,EAAW77H,EAAKe,EAAQ2yH,EAAS2H,GAOnD,IANA,IAAIj2E,EACHi4E,EAAe,GACftvH,EAAI,EACJ67B,EAAMiyF,EAAU39H,OAChBo/H,EAAgB,MAAPt9H,EAEF+N,EAAI67B,EAAK77B,KACTq3C,EAAOy2E,EAAW9tH,MAClBhN,IAAUA,EAAQqkD,EAAMsuE,EAAS2H,KACtCgC,EAAa11H,KAAMy9C,GACdk4E,GACJt9H,EAAI2H,KAAMoG,KAMd,OAAOsvH,CACR,CAEA,SAASE,GAAY9C,EAAWnwF,EAAU+4B,EAASm6D,EAAYC,EAAYC,GAO1E,OANKF,IAAeA,EAAYpJ,KAC/BoJ,EAAaD,GAAYC,IAErBC,IAAeA,EAAYrJ,KAC/BqJ,EAAaF,GAAYE,EAAYC,IAE/B1E,GAAc,SAAUX,EAAM5gB,EAASic,EAAS2H,GACtD,IAAIvvD,EAAM/9D,EAAGq3C,EAAMu4E,EAClBC,EAAS,GACTC,EAAU,GACVC,EAAcrmB,EAAQv5G,OAGtBsnD,EAAQ6yE,GA5CX,SAA2B/tF,EAAUyzF,EAAUtmB,GAG9C,IAFA,IAAI1pG,EAAI,EACP67B,EAAMm0F,EAAS7/H,OACR6P,EAAI67B,EAAK77B,IAChBjM,EAAMwoC,EAAUyzF,EAAUhwH,GAAK0pG,GAEhC,OAAOA,CACR,CAsCIumB,CAAkB1zF,GAAY,IAC7BopF,EAAQzwH,SAAW,CAAEywH,GAAYA,EAAS,IAG5CuK,GAAYxD,IAAepC,GAAS/tF,EAEnCkb,EADA43E,GAAU53E,EAAOo4E,EAAQnD,EAAW/G,EAAS2H,GAsB/C,GAnBKh4D,EAaJA,EAAS46D,EATTN,EAAaF,IAAgBpF,EAAOoC,EAAYqD,GAAeN,GAG9D,GAGA/lB,EAG+Bic,EAAS2H,GAEzCsC,EAAaM,EAITT,EAMJ,IALA1xD,EAAOsxD,GAAUO,EAAYE,GAC7BL,EAAY1xD,EAAM,GAAI4nD,EAAS2H,GAG/BttH,EAAI+9D,EAAK5tE,OACD6P,MACAq3C,EAAO0mB,EAAM/9D,MACnB4vH,EAAYE,EAAS9vH,MAAWkwH,EAAWJ,EAAS9vH,IAAQq3C,IAK/D,GAAKizE,GACJ,GAAKoF,GAAchD,EAAY,CAC9B,GAAKgD,EAAa,CAKjB,IAFA3xD,EAAO,GACP/9D,EAAI4vH,EAAWz/H,OACP6P,MACAq3C,EAAOu4E,EAAY5vH,KAGzB+9D,EAAKnkE,KAAQs2H,EAAWlwH,GAAMq3C,GAGhCq4E,EAAY,KAAQE,EAAa,GAAM7xD,EAAMuvD,EAC9C,CAIA,IADAttH,EAAI4vH,EAAWz/H,OACP6P,MACAq3C,EAAOu4E,EAAY5vH,MACvB+9D,EAAO2xD,EAAatvH,EAAQnR,KAAMq7H,EAAMjzE,GAASw4E,EAAQ7vH,KAAS,IAEpEsqH,EAAMvsD,KAAY2rC,EAAS3rC,GAAS1mB,GAGvC,OAIAu4E,EAAaP,GACZO,IAAelmB,EACdkmB,EAAWx4H,OAAQ24H,EAAaH,EAAWz/H,QAC3Cy/H,GAEGF,EACJA,EAAY,KAAMhmB,EAASkmB,EAAYtC,GAEvC1zH,EAAKgE,MAAO8rG,EAASkmB,EAGxB,EACD,CAEA,SAASO,GAAmBprD,GA+B3B,IA9BA,IAAIqrD,EAAc96D,EAASqM,EAC1B9lC,EAAMkpC,EAAO50E,OACbkgI,EAAkBxI,EAAKz2E,SAAU2zB,EAAQ,GAAI51E,MAC7CmhI,EAAmBD,GAAmBxI,EAAKz2E,SAAU,KACrDpxC,EAAIqwH,EAAkB,EAAI,EAG1BE,EAAenG,GAAe,SAAU/yE,GACvC,OAAOA,IAAS+4E,CACjB,EAAGE,GAAkB,GACrBE,EAAkBpG,GAAe,SAAU/yE,GAC1C,OAAOj3C,EAAQnR,KAAMmhI,EAAc/4E,IAAU,CAC9C,EAAGi5E,GAAkB,GACrBlB,EAAW,CAAE,SAAU/3E,EAAMsuE,EAAS2H,GAMrC,IAAIxH,GAASuK,IAAqB/C,GAAO3H,GAAWmC,MACjDsI,EAAezK,GAAUzwH,SAC1Bq7H,EAAcl5E,EAAMsuE,EAAS2H,GAC7BkD,EAAiBn5E,EAAMsuE,EAAS2H,IAKlC,OADA8C,EAAe,KACRtK,CACR,GAEO9lH,EAAI67B,EAAK77B,IAChB,GAAOs1D,EAAUuyD,EAAKz2E,SAAU2zB,EAAQ/kE,GAAI7Q,MAC3CigI,EAAW,CAAEhF,GAAe+E,GAAgBC,GAAY95D,QAClD,CAIN,IAHAA,EAAUuyD,EAAK70H,OAAQ+xE,EAAQ/kE,GAAI7Q,MAAOyO,MAAO,KAAMmnE,EAAQ/kE,GAAI+K,UAGrDs7G,GAAY,CAIzB,IADA1kD,IAAM3hE,EACE2hE,EAAI9lC,IACNgsF,EAAKz2E,SAAU2zB,EAAQpD,GAAIxyE,MADhBwyE,KAKjB,OAAO6tD,GACNxvH,EAAI,GAAKmvH,GAAgBC,GACzBpvH,EAAI,GAAK6qH,GAGR9lD,EAAO/oE,MAAO,EAAGgE,EAAI,GACnB0vC,OAAQ,CAAEr/C,MAAgC,MAAzB00E,EAAQ/kE,EAAI,GAAI7Q,KAAe,IAAM,MACvDkD,QAAS+0H,EAAU,MACrB9xD,EACAt1D,EAAI2hE,GAAKwuD,GAAmBprD,EAAO/oE,MAAOgE,EAAG2hE,IAC7CA,EAAI9lC,GAAOs0F,GAAqBprD,EAASA,EAAO/oE,MAAO2lE,IACvDA,EAAI9lC,GAAOgvF,GAAY9lD,GAEzB,CACAqqD,EAASx1H,KAAM07D,EAChB,CAGD,OAAO65D,GAAgBC,EACxB,CAgIA,SAASvB,GAAStxF,EAAU3pC,GAC3B,IAAIoN,EACHywH,EAAc,GACdC,EAAkB,GAClB9V,EAAS2N,EAAehsF,EAAW,KAEpC,IAAMq+E,EAAS,CAOd,IAJMhoH,IACLA,EAAQg4H,GAAUruF,IAEnBv8B,EAAIpN,EAAMzC,OACF6P,MACP46G,EAASuV,GAAmBv9H,EAAOoN,KACtBqmH,GACZoK,EAAY72H,KAAMghH,GAElB8V,EAAgB92H,KAAMghH,GAKxBA,EAAS2N,EAAehsF,EArJ1B,SAAmCm0F,EAAiBD,GACnD,IAAIE,EAAQF,EAAYtgI,OAAS,EAChCygI,EAAYF,EAAgBvgI,OAAS,EACrC0gI,EAAe,SAAUvG,EAAM3E,EAAS2H,EAAK5jB,EAASonB,GACrD,IAAIz5E,EAAMsqB,EAAGrM,EACZy7D,EAAe,EACf/wH,EAAI,IACJ8tH,EAAYxD,GAAQ,GACpB0G,EAAa,GACbC,EAAgBnJ,EAGhBrwE,EAAQ6yE,GAAQsG,GAAa/I,EAAK9zH,KAAK3E,IAAK,IAAK0hI,GAGjDI,EAAkB/I,GAA4B,MAAjB8I,EAAwB,EAAIt5H,KAAKuuF,UAAY,GAC1ErqD,EAAM4b,EAAMtnD,OAeb,IAbK2gI,IAMJhJ,EAAmBnC,GAAWrlH,GAAYqlH,GAAWmL,GAO9C9wH,IAAM67B,GAAgC,OAAvBwb,EAAOI,EAAOz3C,IAAeA,IAAM,CACzD,GAAK4wH,GAAav5E,EAAO,CAWxB,IAVAsqB,EAAI,EAMEgkD,GAAWtuE,EAAKyvE,eAAiBxmH,IACtC4pH,GAAa7yE,GACbi2E,GAAOrF,GAEE3yD,EAAUo7D,EAAiB/uD,MACpC,GAAKrM,EAASje,EAAMsuE,GAAWrlH,EAAUgtH,GAAQ,CAChD1zH,EAAK3K,KAAMy6G,EAASryD,GACpB,KACD,CAEIy5E,IACJ3I,EAAU+I,EAEZ,CAGKP,KAGGt5E,GAAQie,GAAWje,IACzB05E,IAIIzG,GACJwD,EAAUl0H,KAAMy9C,GAGnB,CAaA,GATA05E,GAAgB/wH,EASX2wH,GAAS3wH,IAAM+wH,EAAe,CAElC,IADApvD,EAAI,EACMrM,EAAUm7D,EAAa9uD,MAChCrM,EAASw4D,EAAWkD,EAAYrL,EAAS2H,GAG1C,GAAKhD,EAAO,CAGX,GAAKyG,EAAe,EACnB,KAAQ/wH,KACC8tH,EAAW9tH,IAAOgxH,EAAYhxH,KACrCgxH,EAAYhxH,GAAMrG,EAAI1K,KAAMy6G,IAM/BsnB,EAAa3B,GAAU2B,EACxB,CAGAp3H,EAAKgE,MAAO8rG,EAASsnB,GAGhBF,IAAcxG,GAAQ0G,EAAW7gI,OAAS,GAC5C4gI,EAAeN,EAAYtgI,OAAW,GAExC2oD,EAAOwzE,WAAY5iB,EAErB,CAQA,OALKonB,IACJ3I,EAAU+I,EACVpJ,EAAmBmJ,GAGbnD,CACR,EAED,OAAO6C,EACN1F,GAAc4F,GACdA,CACF,CA0BGM,CAA0BT,EAAiBD,IAG5C7V,EAAOr+E,SAAWA,CACnB,CACA,OAAOq+E,CACR,CAWA,SAASmQ,GAAQxuF,EAAUopF,EAASjc,EAAS4gB,GAC5C,IAAItqH,EAAG+kE,EAAQQ,EAAOp2E,EAAM4E,EAC3Bq9H,EAA+B,mBAAb70F,GAA2BA,EAC7C3pC,GAAS03H,GAAQM,GAAYruF,EAAW60F,EAAS70F,UAAYA,GAM9D,GAJAmtE,EAAUA,GAAW,GAIC,IAAjB92G,EAAMzC,OAAe,CAIzB,IADA40E,EAASnyE,EAAO,GAAMA,EAAO,GAAIoJ,MAAO,IAC5B7L,OAAS,GAAsC,QAA/Bo1E,EAAQR,EAAQ,IAAM51E,MAC3B,IAArBw2H,EAAQzwH,UAAkB+yH,GAAkBJ,EAAKz2E,SAAU2zB,EAAQ,GAAI51E,MAAS,CAMjF,KAJAw2H,GAAYkC,EAAK9zH,KAAKsrC,GACrBkmC,EAAMx6D,QAAS,GAAI1Y,QAASs3H,EAAWC,GACvCjE,IACI,IAAM,IAEV,OAAOjc,EAGI0nB,IACXzL,EAAUA,EAAQxnG,YAGnBoe,EAAWA,EAASvgC,MAAO+oE,EAAOthB,QAAQpzD,MAAMF,OACjD,CAIA,IADA6P,EAAIkpH,EAAUI,aAAaj2H,KAAMkpC,GAAa,EAAIwoC,EAAO50E,OACjD6P,MACPulE,EAAQR,EAAQ/kE,IAGX6nH,EAAKz2E,SAAYjiD,EAAOo2E,EAAMp2E,QAGnC,IAAO4E,EAAO8zH,EAAK9zH,KAAM5E,MAGjBm7H,EAAOv2H,EACbwxE,EAAMx6D,QAAS,GAAI1Y,QAASs3H,EAAWC,GACvCF,EAASr2H,KAAM0xE,EAAQ,GAAI51E,OAC1Bw7H,GAAahF,EAAQxnG,aAAgBwnG,IACjC,CAKL,GAFA5gD,EAAO3tE,OAAQ4I,EAAG,KAClBu8B,EAAW+tF,EAAKn6H,QAAU06H,GAAY9lD,IAGrC,OADAnrE,EAAKgE,MAAO8rG,EAAS4gB,GACd5gB,EAGR,KACD,CAGH,CAWA,OAPE0nB,GAAYvD,GAAStxF,EAAU3pC,IAChC03H,EACA3E,GACCsC,EACDve,GACCic,GAAW+D,EAASr2H,KAAMkpC,IAAcouF,GAAahF,EAAQxnG,aAAgBwnG,GAExEjc,CACR,CAtlBAikB,GAAWt+H,UAAYw4H,EAAKwJ,QAAUxJ,EAAKc,QAC3Cd,EAAK8F,WAAa,IAAIA,GA2lBtB1I,EAAQuH,WAAanG,EAAQtlH,MAAO,IAAKmN,KAAMu6G,GAAY91H,KAAM,MAAS0zH,EAG1E6D,KAIAjF,EAAQkH,aAAejB,GAAQ,SAAU7zG,GAGxC,OAA4E,EAArEA,EAAGiwG,wBAAyBhnH,EAASM,cAAe,YAC5D,GAEAk4C,EAAO/kD,KAAOA,EAGd+kD,EAAOszE,KAAM,KAAQtzE,EAAOszE,KAAKzD,QACjC7vE,EAAOw4E,OAASx4E,EAAOwzE,WAIvBv4H,EAAK85H,QAAUA,GACf95H,EAAKg3H,OAASA,GACdh3H,EAAKm2H,YAAcA,GACnBn2H,EAAK62H,SAAWA,GAEhB72H,EAAK81H,OAAS/wE,EAAO4uE,eACrB3zH,EAAKw9H,QAAUz4E,EAAO+P,KACtB90D,EAAKy9H,MAAQ14E,EAAO6tE,SACpB5yH,EAAK42C,UAAYmO,EAAOszE,KACxBr4H,EAAKkxH,QAAUnsE,EAAOmsE,QACtBlxH,EAAKu4H,WAAaxzE,EAAOwzE,UAIvB,CAviEF,GA0iEA,IAAIjC,EAAM,SAAUhzE,EAAMgzE,EAAKoH,GAI9B,IAHA,IAAI5yD,EAAU,GACb6yD,OAAqB5+H,IAAV2+H,GAEFp6E,EAAOA,EAAMgzE,KAA6B,IAAlBhzE,EAAKniD,UACtC,GAAuB,IAAlBmiD,EAAKniD,SAAiB,CAC1B,GAAKw8H,GAAY54E,EAAQzB,GAAOkhD,GAAIk5B,GACnC,MAED5yD,EAAQjlE,KAAMy9C,EACf,CAED,OAAOwnB,CACR,EAGI8yD,EAAW,SAAUtzH,EAAGg5C,GAG3B,IAFA,IAAIwnB,EAAU,GAENxgE,EAAGA,EAAIA,EAAEqgB,YACI,IAAfrgB,EAAEnJ,UAAkBmJ,IAAMg5C,GAC9BwnB,EAAQjlE,KAAMyE,GAIhB,OAAOwgE,CACR,EAGI+yD,EAAgB94E,EAAOszE,KAAKx5H,MAAM02H,aAElCuI,EAAa,kEAKjB,SAASC,EAAQ/wD,EAAUgxD,EAAWnE,GACrC,OAAKjxH,EAAYo1H,GACTj5E,EAAOmtE,KAAMllD,EAAU,SAAU1pB,EAAMr3C,GAC7C,QAAS+xH,EAAU9iI,KAAMooD,EAAMr3C,EAAGq3C,KAAWu2E,CAC9C,GAIImE,EAAU78H,SACP4jD,EAAOmtE,KAAMllD,EAAU,SAAU1pB,GACvC,OAASA,IAAS06E,IAAgBnE,CACnC,GAIyB,iBAAdmE,EACJj5E,EAAOmtE,KAAMllD,EAAU,SAAU1pB,GACvC,OAASj3C,EAAQnR,KAAM8iI,EAAW16E,IAAU,IAAQu2E,CACrD,GAIM90E,EAAO9lD,OAAQ++H,EAAWhxD,EAAU6sD,EAC5C,CAEA90E,EAAO9lD,OAAS,SAAUo5H,EAAM30E,EAAOm2E,GACtC,IAAIv2E,EAAOI,EAAO,GAMlB,OAJKm2E,IACJxB,EAAO,QAAUA,EAAO,KAGH,IAAjB30E,EAAMtnD,QAAkC,IAAlBknD,EAAKniD,SACxB4jD,EAAO/kD,KAAK6iD,gBAAiBS,EAAM+0E,GAAS,CAAE/0E,GAAS,GAGxDyB,EAAO/kD,KAAKgX,QAASqhH,EAAMtzE,EAAOmtE,KAAMxuE,EAAO,SAAUJ,GAC/D,OAAyB,IAAlBA,EAAKniD,QACb,GACD,EAEA4jD,EAAOhQ,GAAGmkC,OAAQ,CACjBl5E,KAAM,SAAUwoC,GACf,IAAIv8B,EAAG8lH,EACNjqF,EAAM3sC,KAAKiB,OACX2E,EAAO5F,KAER,GAAyB,iBAAbqtC,EACX,OAAOrtC,KAAK22H,UAAW/sE,EAAQvc,GAAWvpC,OAAQ,WACjD,IAAMgN,EAAI,EAAGA,EAAI67B,EAAK77B,IACrB,GAAK84C,EAAOvrC,SAAUzY,EAAMkL,GAAK9Q,MAChC,OAAO,CAGV,IAKD,IAFA42H,EAAM52H,KAAK22H,UAAW,IAEhB7lH,EAAI,EAAGA,EAAI67B,EAAK77B,IACrB84C,EAAO/kD,KAAMwoC,EAAUznC,EAAMkL,GAAK8lH,GAGnC,OAAOjqF,EAAM,EAAIid,EAAOwzE,WAAYxG,GAAQA,CAC7C,EACA9yH,OAAQ,SAAUupC,GACjB,OAAOrtC,KAAK22H,UAAWiM,EAAQ5iI,KAAMqtC,GAAY,IAAI,GACtD,EACAqxF,IAAK,SAAUrxF,GACd,OAAOrtC,KAAK22H,UAAWiM,EAAQ5iI,KAAMqtC,GAAY,IAAI,GACtD,EACAg8D,GAAI,SAAUh8D,GACb,QAASu1F,EACR5iI,KAIoB,iBAAbqtC,GAAyBq1F,EAAcv+H,KAAMkpC,GACnDuc,EAAQvc,GACRA,GAAY,IACb,GACCpsC,MACH,IAQD,IAAI6hI,EAMHvI,EAAa,uCAEN3wE,EAAOhQ,GAAGjsB,KAAO,SAAU0f,EAAUopF,EAAS5wH,GACpD,IAAInC,EAAOykD,EAGX,IAAM9a,EACL,OAAOrtC,KAQR,GAHA6F,EAAOA,GAAQi9H,EAGU,iBAAbz1F,EAAwB,CAanC,KAPC3pC,EALsB,MAAlB2pC,EAAU,IACsB,MAApCA,EAAUA,EAASpsC,OAAS,IAC5BosC,EAASpsC,QAAU,EAGX,CAAE,KAAMosC,EAAU,MAGlBktF,EAAWpzH,KAAMkmC,MAIV3pC,EAAO,IAAQ+yH,EA6CxB,OAAMA,GAAWA,EAAQC,QACtBD,GAAW5wH,GAAOhB,KAAMwoC,GAK1BrtC,KAAKK,YAAao2H,GAAU5xH,KAAMwoC,GAhDzC,GAAK3pC,EAAO,GAAM,CAYjB,GAXA+yH,EAAUA,aAAmB7sE,EAAS6sE,EAAS,GAAMA,EAIrD7sE,EAAOj6C,MAAO3P,KAAM4pD,EAAOm5E,UAC1Br/H,EAAO,GACP+yH,GAAWA,EAAQzwH,SAAWywH,EAAQmB,eAAiBnB,EAAUrlH,GACjE,IAIIuxH,EAAWx+H,KAAMT,EAAO,KAASkmD,EAAOz8C,cAAespH,GAC3D,IAAM/yH,KAAS+yH,EAGThpH,EAAYzN,KAAM0D,IACtB1D,KAAM0D,GAAS+yH,EAAS/yH,IAIxB1D,KAAK6pD,KAAMnmD,EAAO+yH,EAAS/yH,IAK9B,OAAO1D,IAGR,CASC,OARAmoD,EAAO/2C,EAASqsB,eAAgB/5B,EAAO,OAKtC1D,KAAM,GAAMmoD,EACZnoD,KAAKiB,OAAS,GAERjB,IAcV,CAAO,OAAKqtC,EAASrnC,UACpBhG,KAAM,GAAMqtC,EACZrtC,KAAKiB,OAAS,EACPjB,MAIIyN,EAAY4/B,QACDzpC,IAAfiC,EAAKk1B,MACXl1B,EAAKk1B,MAAOsS,GAGZA,EAAUuc,GAGLA,EAAO7B,UAAW1a,EAAUrtC,KACpC,GAGIG,UAAYypD,EAAOhQ,GAGxBkpF,EAAal5E,EAAQx4C,GAGrB,IAAI4xH,EAAe,iCAGlBC,EAAmB,CAClB35G,UAAU,EACVm3C,UAAU,EACV71C,MAAM,EACND,MAAM,GAoFR,SAASu4G,EAASC,EAAKhI,GACtB,MAAUgI,EAAMA,EAAKhI,KAA4B,IAAjBgI,EAAIn9H,WACpC,OAAOm9H,CACR,CApFAv5E,EAAOhQ,GAAGmkC,OAAQ,CACjBvzE,IAAK,SAAUpJ,GACd,IAAIsiE,EAAU9Z,EAAQxoD,EAAQpB,MAC7B6S,EAAI6wD,EAAQziE,OAEb,OAAOjB,KAAK8D,OAAQ,WAEnB,IADA,IAAIgN,EAAI,EACAA,EAAI+B,EAAG/B,IACd,GAAK84C,EAAOvrC,SAAUre,KAAM0jE,EAAS5yD,IACpC,OAAO,CAGV,EACD,EAEAsR,QAAS,SAAUq5B,EAAWg7E,GAC7B,IAAI0M,EACHryH,EAAI,EACJ+B,EAAI7S,KAAKiB,OACT0uE,EAAU,GACVjM,EAA+B,iBAAdjoB,GAA0BmO,EAAQnO,GAGpD,IAAMinF,EAAcv+H,KAAMs3C,GACzB,KAAQ3qC,EAAI+B,EAAG/B,IACd,IAAMqyH,EAAMnjI,KAAM8Q,GAAKqyH,GAAOA,IAAQ1M,EAAS0M,EAAMA,EAAIl0G,WAGxD,GAAKk0G,EAAIn9H,SAAW,KAAQ09D,EAC3BA,EAAQp6D,MAAO65H,IAAS,EAGP,IAAjBA,EAAIn9H,UACH4jD,EAAO/kD,KAAK6iD,gBAAiBy7E,EAAK1nF,IAAgB,CAEnDk0B,EAAQjlE,KAAMy4H,GACd,KACD,CAKH,OAAOnjI,KAAK22H,UAAWhnD,EAAQ1uE,OAAS,EAAI2oD,EAAOwzE,WAAYztD,GAAYA,EAC5E,EAGArmE,MAAO,SAAU6+C,GAGhB,OAAMA,EAKe,iBAATA,EACJj3C,EAAQnR,KAAM6pD,EAAQzB,GAAQnoD,KAAM,IAIrCkR,EAAQnR,KAAMC,KAGpBmoD,EAAKuuE,OAASvuE,EAAM,GAAMA,GAZjBnoD,KAAM,IAAOA,KAAM,GAAIivB,WAAejvB,KAAKk+D,QAAQklE,UAAUniI,QAAU,CAclF,EAEA4Z,IAAK,SAAUwyB,EAAUopF,GACxB,OAAOz2H,KAAK22H,UACX/sE,EAAOwzE,WACNxzE,EAAOj6C,MAAO3P,KAAKwB,MAAOooD,EAAQvc,EAAUopF,KAG/C,EAEA4M,QAAS,SAAUh2F,GAClB,OAAOrtC,KAAK6a,IAAiB,MAAZwyB,EAChBrtC,KAAK62H,WAAa72H,KAAK62H,WAAW/yH,OAAQupC,GAE5C,IAQDuc,EAAOjb,KAAM,CACZrB,OAAQ,SAAU6a,GACjB,IAAI7a,EAAS6a,EAAKl5B,WAClB,OAAOqe,GAA8B,KAApBA,EAAOtnC,SAAkBsnC,EAAS,IACpD,EACAg2F,QAAS,SAAUn7E,GAClB,OAAOgzE,EAAKhzE,EAAM,aACnB,EACAo7E,aAAc,SAAUp7E,EAAM6vE,EAAIuK,GACjC,OAAOpH,EAAKhzE,EAAM,aAAco6E,EACjC,EACA33G,KAAM,SAAUu9B,GACf,OAAO+6E,EAAS/6E,EAAM,cACvB,EACAx9B,KAAM,SAAUw9B,GACf,OAAO+6E,EAAS/6E,EAAM,kBACvB,EACAq7E,QAAS,SAAUr7E,GAClB,OAAOgzE,EAAKhzE,EAAM,cACnB,EACAi7E,QAAS,SAAUj7E,GAClB,OAAOgzE,EAAKhzE,EAAM,kBACnB,EACAs7E,UAAW,SAAUt7E,EAAM6vE,EAAIuK,GAC9B,OAAOpH,EAAKhzE,EAAM,cAAeo6E,EAClC,EACAmB,UAAW,SAAUv7E,EAAM6vE,EAAIuK,GAC9B,OAAOpH,EAAKhzE,EAAM,kBAAmBo6E,EACtC,EACAE,SAAU,SAAUt6E,GACnB,OAAOs6E,GAAYt6E,EAAKl5B,YAAc,CAAC,GAAItd,WAAYw2C,EACxD,EACA7+B,SAAU,SAAU6+B,GACnB,OAAOs6E,EAAUt6E,EAAKx2C,WACvB,EACA8uD,SAAU,SAAUtY,GACnB,OAA6B,MAAxBA,EAAKw7E,iBAKTjO,EAAUvtE,EAAKw7E,iBAERx7E,EAAKw7E,iBAMRxgH,EAAUglC,EAAM,cACpBA,EAAOA,EAAKhwC,SAAWgwC,GAGjByB,EAAOj6C,MAAO,GAAIw4C,EAAK5gC,YAC/B,GACE,SAAUjmB,EAAMs4C,GAClBgQ,EAAOhQ,GAAIt4C,GAAS,SAAUihI,EAAOl1F,GACpC,IAAIsiC,EAAU/lB,EAAO7mD,IAAK/C,KAAM45C,EAAI2oF,GAuBpC,MArB0B,UAArBjhI,EAAKwL,OAAQ,KACjBugC,EAAWk1F,GAGPl1F,GAAgC,iBAAbA,IACvBsiC,EAAU/lB,EAAO9lD,OAAQupC,EAAUsiC,IAG/B3vE,KAAKiB,OAAS,IAGZgiI,EAAkB3hI,IACvBsoD,EAAOwzE,WAAYztD,GAIfqzD,EAAa7+H,KAAM7C,IACvBquE,EAAQhkC,WAIH3rC,KAAK22H,UAAWhnD,EACxB,CACD,GACA,IAAIi0D,EAAgB,oBAsOpB,SAASC,EAAU7gI,GAClB,OAAOA,CACR,CACA,SAAS8gI,EAASC,GACjB,MAAMA,CACP,CAEA,SAASC,EAAY7iI,EAAOgqC,EAAS8J,EAAQgvF,GAC5C,IAAIrnG,EAEJ,IAGMz7B,GAASsM,EAAcmvB,EAASz7B,EAAM+3C,SAC1Ctc,EAAO78B,KAAMoB,GAAQ84B,KAAMkR,GAAU0N,KAAM5D,GAGhC9zC,GAASsM,EAAcmvB,EAASz7B,EAAMs4B,MACjDmD,EAAO78B,KAAMoB,EAAOgqC,EAAS8J,GAQ7B9J,EAAQz8B,WAAO9K,EAAW,CAAEzC,GAAQ2L,MAAOm3H,GAM7C,CAAE,MAAQ9iI,GAIT8zC,EAAOvmC,WAAO9K,EAAW,CAAEzC,GAC5B,CACD,CAzOAyoD,EAAOs6E,UAAY,SAAU7uH,GAI5BA,EAA6B,iBAAZA,EAlClB,SAAwBA,GACvB,IAAIpM,EAAS,CAAC,EAId,OAHA2gD,EAAOjb,KAAMt5B,EAAQ3R,MAAOkgI,IAAmB,GAAI,SAAUxgI,EAAG4oE,GAC/D/iE,EAAQ+iE,IAAS,CAClB,GACO/iE,CACR,CA6BEk7H,CAAe9uH,GACfu0C,EAAOm0B,OAAQ,CAAC,EAAG1oE,GAEpB,IACC+uH,EAGAC,EAGAC,EAGAC,EAGAt7G,EAAO,GAGPo+C,EAAQ,GAGRm9D,GAAe,EAGfhR,EAAO,WAQN,IALA+Q,EAASA,GAAUlvH,EAAQ43D,KAI3Bq3D,EAAQF,GAAS,EACT/8D,EAAMpmE,OAAQujI,GAAe,EAEpC,IADAH,EAASh9D,EAAM9S,UACLiwE,EAAcv7G,EAAKhoB,SAGmC,IAA1DgoB,EAAMu7G,GAAc91H,MAAO21H,EAAQ,GAAKA,EAAQ,KACpDhvH,EAAQovH,cAGRD,EAAcv7G,EAAKhoB,OACnBojI,GAAS,GAMNhvH,EAAQgvH,SACbA,GAAS,GAGVD,GAAS,EAGJG,IAIHt7G,EADIo7G,EACG,GAIA,GAGV,EAGAz+H,EAAO,CAGNiV,IAAK,WA2BJ,OA1BKoO,IAGCo7G,IAAWD,IACfI,EAAcv7G,EAAKhoB,OAAS,EAC5BomE,EAAM38D,KAAM25H,IAGb,SAAWxpH,EAAKhL,GACf+5C,EAAOjb,KAAM9+B,EAAM,SAAUzM,EAAG2E,GAC1B0F,EAAY1F,GACVsN,EAAQ+sH,QAAWx8H,EAAK4E,IAAKzC,IAClCkhB,EAAKve,KAAM3C,GAEDA,GAAOA,EAAI9G,QAA4B,WAAlBs1H,EAAQxuH,IAGxC8S,EAAK9S,EAEP,EACC,CAZF,CAYK/G,WAEAqjI,IAAWD,GACf5Q,KAGKxzH,IACR,EAGA2a,OAAQ,WAYP,OAXAivC,EAAOjb,KAAM3tC,UAAW,SAAUoC,EAAG2E,GAEpC,IADA,IAAIuB,GACMA,EAAQsgD,EAAO4tE,QAASzvH,EAAKkhB,EAAM3f,KAAa,GACzD2f,EAAK/gB,OAAQoB,EAAO,GAGfA,GAASk7H,GACbA,GAGH,GACOxkI,IACR,EAIAwK,IAAK,SAAUovC,GACd,OAAOA,EACNgQ,EAAO4tE,QAAS59E,EAAI3wB,IAAU,EAC9BA,EAAKhoB,OAAS,CAChB,EAGAitC,MAAO,WAIN,OAHKjlB,IACJA,EAAO,IAEDjpB,IACR,EAKA8uF,QAAS,WAGR,OAFAy1C,EAASl9D,EAAQ,GACjBp+C,EAAOo7G,EAAS,GACTrkI,IACR,EACAs3D,SAAU,WACT,OAAQruC,CACT,EAKAy7G,KAAM,WAKL,OAJAH,EAASl9D,EAAQ,GACXg9D,GAAWD,IAChBn7G,EAAOo7G,EAAS,IAEVrkI,IACR,EACAukI,OAAQ,WACP,QAASA,CACV,EAGAI,SAAU,SAAUlO,EAAS5mH,GAS5B,OARM00H,IAEL10H,EAAO,CAAE4mH,GADT5mH,EAAOA,GAAQ,IACQ/C,MAAQ+C,EAAK/C,QAAU+C,GAC9Cw3D,EAAM38D,KAAMmF,GACNu0H,GACL5Q,KAGKxzH,IACR,EAGAwzH,KAAM,WAEL,OADA5tH,EAAK++H,SAAU3kI,KAAMgB,WACdhB,IACR,EAGAskI,MAAO,WACN,QAASA,CACV,GAGF,OAAO1+H,CACR,EA2CAgkD,EAAOm0B,OAAQ,CAEd6mD,SAAU,SAAUp/H,GACnB,IAAIq/H,EAAS,CAIX,CAAE,SAAU,WAAYj7E,EAAOs6E,UAAW,UACzCt6E,EAAOs6E,UAAW,UAAY,GAC/B,CAAE,UAAW,OAAQt6E,EAAOs6E,UAAW,eACtCt6E,EAAOs6E,UAAW,eAAiB,EAAG,YACvC,CAAE,SAAU,OAAQt6E,EAAOs6E,UAAW,eACrCt6E,EAAOs6E,UAAW,eAAiB,EAAG,aAExCtlH,EAAQ,UACRs6B,EAAU,CACTt6B,MAAO,WACN,OAAOA,CACR,EACAkmH,OAAQ,WAEP,OADAC,EAAS9qG,KAAMj5B,WAAY63C,KAAM73C,WAC1BhB,IACR,EACA,MAAS,SAAU45C,GAClB,OAAOV,EAAQzf,KAAM,KAAMmgB,EAC5B,EAGAorF,KAAM,WACL,IAAIC,EAAMjkI,UAEV,OAAO4oD,EAAOg7E,SAAU,SAAUM,GACjCt7E,EAAOjb,KAAMk2F,EAAQ,SAAU7M,EAAImN,GAGlC,IAAIvrF,EAAKnsC,EAAYw3H,EAAKE,EAAO,MAAWF,EAAKE,EAAO,IAKxDJ,EAAUI,EAAO,IAAO,WACvB,IAAIC,EAAWxrF,GAAMA,EAAGlrC,MAAO1O,KAAMgB,WAChCokI,GAAY33H,EAAY23H,EAASlsF,SACrCksF,EAASlsF,UACP2gB,SAAUqrE,EAAS/rF,QACnBlf,KAAMirG,EAAS/5F,SACf0N,KAAMqsF,EAASjwF,QAEjBiwF,EAAUC,EAAO,GAAM,QACtBnlI,KACA45C,EAAK,CAAEwrF,GAAapkI,UAGvB,EACD,GACAikI,EAAM,IACP,GAAI/rF,SACL,EACAzf,KAAM,SAAUygB,EAAaC,EAAY20D,GACxC,IAAIu2B,EAAW,EACf,SAASl6F,EAASm6F,EAAOP,EAAUrvF,EAAS6vF,GAC3C,OAAO,WACN,IAAInrF,EAAOp6C,KACV6P,EAAO7O,UACPwkI,EAAa,WACZ,IAAIJ,EAAU3rG,EAKd,KAAK6rG,EAAQD,GAAb,CAQA,IAJAD,EAAW1vF,EAAQhnC,MAAO0rC,EAAMvqC,MAIdk1H,EAAS7rF,UAC1B,MAAM,IAAIt4C,UAAW,4BAOtB64B,EAAO2rG,IAKgB,iBAAbA,GACY,mBAAbA,IACRA,EAAS3rG,KAGLhsB,EAAYgsB,GAGX8rG,EACJ9rG,EAAK15B,KACJqlI,EACAj6F,EAASk6F,EAAUN,EAAUlB,EAAU0B,GACvCp6F,EAASk6F,EAAUN,EAAUjB,EAASyB,KAOvCF,IAEA5rG,EAAK15B,KACJqlI,EACAj6F,EAASk6F,EAAUN,EAAUlB,EAAU0B,GACvCp6F,EAASk6F,EAAUN,EAAUjB,EAASyB,GACtCp6F,EAASk6F,EAAUN,EAAUlB,EAC5BkB,EAASU,eASP/vF,IAAYmuF,IAChBzpF,OAAOx2C,EACPiM,EAAO,CAAEu1H,KAKRG,GAAWR,EAASW,aAAetrF,EAAMvqC,GA7D5C,CA+DD,EAGAzJ,EAAUm/H,EACTC,EACA,WACC,IACCA,GACD,CAAE,MAAQ/+H,GAEJmjD,EAAOg7E,SAASe,eACpB/7E,EAAOg7E,SAASe,cAAel/H,EAC9BL,EAAQ40B,OAMLsqG,EAAQ,GAAKD,IAIZ3vF,IAAYouF,IAChB1pF,OAAOx2C,EACPiM,EAAO,CAAEpJ,IAGVs+H,EAASa,WAAYxrF,EAAMvqC,GAE7B,CACD,EAMGy1H,EACJl/H,KAKKwjD,EAAOg7E,SAASiB,aACpBz/H,EAAQ40B,MAAQ4uB,EAAOg7E,SAASiB,eAMrBj8E,EAAOg7E,SAASkB,eAC3B1/H,EAAQ40B,MAAQ4uB,EAAOg7E,SAASkB,gBAEjC/0H,EAAOwO,WAAYnZ,GAErB,CACD,CAEA,OAAOwjD,EAAOg7E,SAAU,SAAUM,GAGjCL,EAAQ,GAAK,GAAIhqH,IAChBswB,EACC,EACA+5F,EACAz3H,EAAYqhG,GACXA,EACA+0B,EACDqB,EAASO,aAKXZ,EAAQ,GAAK,GAAIhqH,IAChBswB,EACC,EACA+5F,EACAz3H,EAAYysC,GACXA,EACA2pF,IAKHgB,EAAQ,GAAK,GAAIhqH,IAChBswB,EACC,EACA+5F,EACAz3H,EAAY0sC,GACXA,EACA2pF,GAGJ,GAAI5qF,SACL,EAIAA,QAAS,SAAUl6C,GAClB,OAAc,MAAPA,EAAc4qD,EAAOm0B,OAAQ/+E,EAAKk6C,GAAYA,CACtD,GAED6rF,EAAW,CAAC,EAkEb,OA/DAn7E,EAAOjb,KAAMk2F,EAAQ,SAAU/zH,EAAGq0H,GACjC,IAAIl8G,EAAOk8G,EAAO,GACjBY,EAAcZ,EAAO,GAKtBjsF,EAASisF,EAAO,IAAQl8G,EAAKpO,IAGxBkrH,GACJ98G,EAAKpO,IACJ,WAIC+D,EAAQmnH,CACT,EAIAlB,EAAQ,EAAI/zH,GAAK,GAAIg+E,QAIrB+1C,EAAQ,EAAI/zH,GAAK,GAAIg+E,QAGrB+1C,EAAQ,GAAK,GAAIH,KAGjBG,EAAQ,GAAK,GAAIH,MAOnBz7G,EAAKpO,IAAKsqH,EAAO,GAAI3R,MAKrBuR,EAAUI,EAAO,IAAQ,WAExB,OADAJ,EAAUI,EAAO,GAAM,QAAUnlI,OAAS+kI,OAAWnhI,EAAY5D,KAAMgB,WAChEhB,IACR,EAKA+kI,EAAUI,EAAO,GAAM,QAAWl8G,EAAK07G,QACxC,GAGAzrF,EAAQA,QAAS6rF,GAGZv/H,GACJA,EAAKzF,KAAMglI,EAAUA,GAIfA,CACR,EAGAiB,KAAM,SAAUC,GACf,IAGCx3H,EAAYzN,UAAUC,OAGtB6P,EAAIrC,EAGJy3H,EAAkBxhI,MAAOoM,GACzBq1H,EAAgBr5H,EAAM/M,KAAMiB,WAG5BolI,EAAUx8E,EAAOg7E,WAGjByB,EAAa,SAAUv1H,GACtB,OAAO,SAAU3P,GAChB+kI,EAAiBp1H,GAAM9Q,KACvBmmI,EAAer1H,GAAM9P,UAAUC,OAAS,EAAI6L,EAAM/M,KAAMiB,WAAcG,IAC5DsN,GACT23H,EAAQV,YAAaQ,EAAiBC,EAExC,CACD,EAGD,GAAK13H,GAAa,IACjBu1H,EAAYiC,EAAaG,EAAQnsG,KAAMosG,EAAYv1H,IAAMq6B,QAASi7F,EAAQnxF,QACxExmC,GAGuB,YAApB23H,EAAQxnH,SACZnR,EAAY04H,EAAer1H,IAAOq1H,EAAer1H,GAAI2oB,OAErD,OAAO2sG,EAAQ3sG,OAKjB,KAAQ3oB,KACPkzH,EAAYmC,EAAer1H,GAAKu1H,EAAYv1H,GAAKs1H,EAAQnxF,QAG1D,OAAOmxF,EAAQltF,SAChB,IAMD,IAAIotF,EAAc,yDAKlB18E,EAAOg7E,SAASe,cAAgB,SAAU3qG,EAAOurG,GAI3Cx1H,EAAO2R,SAAW3R,EAAO2R,QAAQC,MAAQqY,GAASsrG,EAAYniI,KAAM62B,EAAM15B,OAC9EyP,EAAO2R,QAAQC,KAAM,8BAAgCqY,EAAMi6B,QAC1Dj6B,EAAMvvB,MAAO86H,EAEhB,EAKA38E,EAAO48E,eAAiB,SAAUxrG,GACjCjqB,EAAOwO,WAAY,WAClB,MAAMyb,CACP,EACD,EAMA,IAAIyrG,EAAY78E,EAAOg7E,WAkDvB,SAAS8B,IACRt1H,EAASgD,oBAAqB,mBAAoBsyH,GAClD31H,EAAOqD,oBAAqB,OAAQsyH,GACpC98E,EAAO7uB,OACR,CApDA6uB,EAAOhQ,GAAG7e,MAAQ,SAAU6e,GAY3B,OAVA6sF,EACEhtG,KAAMmgB,GAKNhb,MAAO,SAAU5D,GACjB4uB,EAAO48E,eAAgBxrG,EACxB,GAEMh7B,IACR,EAEA4pD,EAAOm0B,OAAQ,CAGdq5C,SAAS,EAITuP,UAAW,EAGX5rG,MAAO,SAAU2+B,KAGF,IAATA,IAAkB9P,EAAO+8E,UAAY/8E,EAAOwtE,WAKjDxtE,EAAOwtE,SAAU,GAGH,IAAT19D,KAAmB9P,EAAO+8E,UAAY,GAK3CF,EAAUf,YAAat0H,EAAU,CAAEw4C,IACpC,IAGDA,EAAO7uB,MAAMtB,KAAOgtG,EAAUhtG,KAaD,aAAxBroB,EAASsnB,YACa,YAAxBtnB,EAASsnB,aAA6BtnB,EAAS6V,gBAAgB2/G,SAGjE71H,EAAOwO,WAAYqqC,EAAO7uB,QAK1B3pB,EAASiC,iBAAkB,mBAAoBqzH,GAG/C31H,EAAOsC,iBAAkB,OAAQqzH,IAQlC,IAAIG,GAAS,SAAUt+E,EAAO3O,EAAI3vC,EAAK9I,EAAO2lI,EAAWC,EAAUjlF,GAClE,IAAIhxC,EAAI,EACP67B,EAAM4b,EAAMtnD,OACZ+lI,EAAc,MAAP/8H,EAGR,GAAuB,WAAlBssH,EAAQtsH,GAEZ,IAAM6G,KADNg2H,GAAY,EACD78H,EACV48H,GAAQt+E,EAAO3O,EAAI9oC,EAAG7G,EAAK6G,IAAK,EAAMi2H,EAAUjlF,QAI3C,QAAel+C,IAAVzC,IACX2lI,GAAY,EAENr5H,EAAYtM,KACjB2gD,GAAM,GAGFklF,IAGCllF,GACJlI,EAAG75C,KAAMwoD,EAAOpnD,GAChBy4C,EAAK,OAILotF,EAAOptF,EACPA,EAAK,SAAUuO,EAAMmM,EAAMnzD,GAC1B,OAAO6lI,EAAKjnI,KAAM6pD,EAAQzB,GAAQhnD,EACnC,IAIGy4C,GACJ,KAAQ9oC,EAAI67B,EAAK77B,IAChB8oC,EACC2O,EAAOz3C,GAAK7G,EAAK63C,EAChB3gD,EACAA,EAAMpB,KAAMwoD,EAAOz3C,GAAKA,EAAG8oC,EAAI2O,EAAOz3C,GAAK7G,KAMhD,OAAK68H,EACGv+E,EAIHy+E,EACGptF,EAAG75C,KAAMwoD,GAGV5b,EAAMiN,EAAI2O,EAAO,GAAKt+C,GAAQ88H,CACtC,EAIIE,GAAY,QACfC,GAAa,YAGd,SAASC,GAAYC,EAAMC,GAC1B,OAAOA,EAAOv8G,aACf,CAKA,SAASw8G,GAAWx5H,GACnB,OAAOA,EAAO3K,QAAS8jI,GAAW,OAAQ9jI,QAAS+jI,GAAYC,GAChE,CACA,IAAII,GAAa,SAAUC,GAQ1B,OAA0B,IAAnBA,EAAMxhI,UAAqC,IAAnBwhI,EAAMxhI,YAAsBwhI,EAAMxhI,QAClE,EAKA,SAASyhI,KACRznI,KAAKm3H,QAAUvtE,EAAOutE,QAAUsQ,GAAKliI,KACtC,CAEAkiI,GAAKliI,IAAM,EAEXkiI,GAAKtnI,UAAY,CAEhB8rC,MAAO,SAAUu7F,GAGhB,IAAIrmI,EAAQqmI,EAAOxnI,KAAKm3H,SA4BxB,OAzBMh2H,IACLA,EAAQ,CAAC,EAKJomI,GAAYC,KAIXA,EAAMxhI,SACVwhI,EAAOxnI,KAAKm3H,SAAYh2H,EAMxB7B,OAAO4B,eAAgBsmI,EAAOxnI,KAAKm3H,QAAS,CAC3Ch2H,MAAOA,EACP8Q,cAAc,MAMX9Q,CACR,EACAsI,IAAK,SAAU+9H,EAAO39H,EAAM1I,GAC3B,IAAIymD,EACH3b,EAAQjsC,KAAKisC,MAAOu7F,GAIrB,GAAqB,iBAAT39H,EACXoiC,EAAOq7F,GAAWz9H,IAAW1I,OAM7B,IAAMymD,KAAQ/9C,EACboiC,EAAOq7F,GAAW1/E,IAAW/9C,EAAM+9C,GAGrC,OAAO3b,CACR,EACAzqC,IAAK,SAAUgmI,EAAOv9H,GACrB,YAAerG,IAARqG,EACNjK,KAAKisC,MAAOu7F,GAGZA,EAAOxnI,KAAKm3H,UAAaqQ,EAAOxnI,KAAKm3H,SAAWmQ,GAAWr9H,GAC7D,EACA48H,OAAQ,SAAUW,EAAOv9H,EAAK9I,GAa7B,YAAayC,IAARqG,GACCA,GAAsB,iBAARA,QAAgCrG,IAAVzC,EAElCnB,KAAKwB,IAAKgmI,EAAOv9H,IASzBjK,KAAKyJ,IAAK+9H,EAAOv9H,EAAK9I,QAILyC,IAAVzC,EAAsBA,EAAQ8I,EACtC,EACA0Q,OAAQ,SAAU6sH,EAAOv9H,GACxB,IAAI6G,EACHm7B,EAAQu7F,EAAOxnI,KAAKm3H,SAErB,QAAevzH,IAAVqoC,EAAL,CAIA,QAAaroC,IAARqG,EAAoB,CAkBxB6G,GAXC7G,EAJIvF,MAAM+H,QAASxC,GAIbA,EAAIlH,IAAKukI,KAEfr9H,EAAMq9H,GAAWr9H,MAIJgiC,EACZ,CAAEhiC,GACAA,EAAIvG,MAAOkgI,IAAmB,IAG1B3iI,OAER,KAAQ6P,YACAm7B,EAAOhiC,EAAK6G,GAErB,OAGalN,IAARqG,GAAqB2/C,EAAOytE,cAAeprF,MAM1Cu7F,EAAMxhI,SACVwhI,EAAOxnI,KAAKm3H,cAAYvzH,SAEjB4jI,EAAOxnI,KAAKm3H,SArCrB,CAwCD,EACAuQ,QAAS,SAAUF,GAClB,IAAIv7F,EAAQu7F,EAAOxnI,KAAKm3H,SACxB,YAAiBvzH,IAAVqoC,IAAwB2d,EAAOytE,cAAeprF,EACtD,GAED,IAAI07F,GAAW,IAAIF,GAEfG,GAAW,IAAIH,GAcfI,GAAS,gCACZC,GAAa,SA2Bd,SAASt+E,GAAUrB,EAAMl+C,EAAKJ,GAC7B,IAAIvI,EAIJ,QAAcsC,IAATiG,GAAwC,IAAlBs+C,EAAKniD,SAI/B,GAHA1E,EAAO,QAAU2I,EAAI9G,QAAS2kI,GAAY,OAAQhyH,cAG7B,iBAFrBjM,EAAOs+C,EAAKpjC,aAAczjB,IAEM,CAC/B,IACCuI,EApCJ,SAAkBA,GACjB,MAAc,SAATA,GAIS,UAATA,IAIS,SAATA,EACG,KAIHA,KAAUA,EAAO,IACbA,EAGJg+H,GAAO1jI,KAAM0F,GACV2Y,KAAKC,MAAO5Y,GAGbA,EACR,CAaWspF,CAAStpF,EACjB,CAAE,MAAQpD,GAAK,CAGfmhI,GAASn+H,IAAK0+C,EAAMl+C,EAAKJ,EAC1B,MACCA,OAAOjG,EAGT,OAAOiG,CACR,CAEA+/C,EAAOm0B,OAAQ,CACd2pD,QAAS,SAAUv/E,GAClB,OAAOy/E,GAASF,QAASv/E,IAAUw/E,GAASD,QAASv/E,EACtD,EAEAt+C,KAAM,SAAUs+C,EAAM7mD,EAAMuI,GAC3B,OAAO+9H,GAASf,OAAQ1+E,EAAM7mD,EAAMuI,EACrC,EAEAm5E,WAAY,SAAU76B,EAAM7mD,GAC3BsmI,GAASjtH,OAAQwtC,EAAM7mD,EACxB,EAIAymI,MAAO,SAAU5/E,EAAM7mD,EAAMuI,GAC5B,OAAO89H,GAASd,OAAQ1+E,EAAM7mD,EAAMuI,EACrC,EAEAm+H,YAAa,SAAU7/E,EAAM7mD,GAC5BqmI,GAAShtH,OAAQwtC,EAAM7mD,EACxB,IAGDsoD,EAAOhQ,GAAGmkC,OAAQ,CACjBl0E,KAAM,SAAUI,EAAK9I,GACpB,IAAI2P,EAAGxP,EAAMuI,EACZs+C,EAAOnoD,KAAM,GACbioI,EAAQ9/E,GAAQA,EAAKmyD,WAGtB,QAAa12G,IAARqG,EAAoB,CACxB,GAAKjK,KAAKiB,SACT4I,EAAO+9H,GAASpmI,IAAK2mD,GAEE,IAAlBA,EAAKniD,WAAmB2hI,GAASnmI,IAAK2mD,EAAM,iBAAmB,CAEnE,IADAr3C,EAAIm3H,EAAMhnI,OACF6P,KAIFm3H,EAAOn3H,IAEsB,KADjCxP,EAAO2mI,EAAOn3H,GAAIxP,MACR4P,QAAS,WAClB5P,EAAOgmI,GAAWhmI,EAAKwL,MAAO,IAC9B08C,GAAUrB,EAAM7mD,EAAMuI,EAAMvI,KAI/BqmI,GAASl+H,IAAK0+C,EAAM,gBAAgB,EACrC,CAGD,OAAOt+C,CACR,CAGA,MAAoB,iBAARI,EACJjK,KAAK2uC,KAAM,WACjBi5F,GAASn+H,IAAKzJ,KAAMiK,EACrB,GAGM48H,GAAQ7mI,KAAM,SAAUmB,GAC9B,IAAI0I,EAOJ,GAAKs+C,QAAkBvkD,IAAVzC,EAKZ,YAAcyC,KADdiG,EAAO+9H,GAASpmI,IAAK2mD,EAAMl+C,UAQbrG,KADdiG,EAAO2/C,GAAUrB,EAAMl+C,IALfJ,OAWR,EAID7J,KAAK2uC,KAAM,WAGVi5F,GAASn+H,IAAKzJ,KAAMiK,EAAK9I,EAC1B,EACD,EAAG,KAAMA,EAAOH,UAAUC,OAAS,EAAG,MAAM,EAC7C,EAEA+hF,WAAY,SAAU/4E,GACrB,OAAOjK,KAAK2uC,KAAM,WACjBi5F,GAASjtH,OAAQ3a,KAAMiK,EACxB,EACD,IAID2/C,EAAOm0B,OAAQ,CACd1W,MAAO,SAAUlf,EAAMloD,EAAM4J,GAC5B,IAAIw9D,EAEJ,GAAKlf,EAYJ,OAXAloD,GAASA,GAAQ,MAAS,QAC1BonE,EAAQsgE,GAASnmI,IAAK2mD,EAAMloD,GAGvB4J,KACEw9D,GAAS3iE,MAAM+H,QAAS5C,GAC7Bw9D,EAAQsgE,GAASd,OAAQ1+E,EAAMloD,EAAM2pD,EAAO7B,UAAWl+C,IAEvDw9D,EAAM38D,KAAMb,IAGPw9D,GAAS,EAElB,EAEA6gE,QAAS,SAAU//E,EAAMloD,GACxBA,EAAOA,GAAQ,KAEf,IAAIonE,EAAQzd,EAAOyd,MAAOlf,EAAMloD,GAC/BkoI,EAAc9gE,EAAMpmE,OACpB24C,EAAKytB,EAAM9S,QACX6zE,EAAQx+E,EAAOy+E,YAAalgF,EAAMloD,GAMvB,eAAP25C,IACJA,EAAKytB,EAAM9S,QACX4zE,KAGIvuF,IAIU,OAAT35C,GACJonE,EAAM95B,QAAS,qBAIT66F,EAAM3zH,KACbmlC,EAAG75C,KAAMooD,EApBF,WACNyB,EAAOs+E,QAAS//E,EAAMloD,EACvB,EAkBqBmoI,KAGhBD,GAAeC,GACpBA,EAAMl6F,MAAMslF,MAEd,EAGA6U,YAAa,SAAUlgF,EAAMloD,GAC5B,IAAIgK,EAAMhK,EAAO,aACjB,OAAO0nI,GAASnmI,IAAK2mD,EAAMl+C,IAAS09H,GAASd,OAAQ1+E,EAAMl+C,EAAK,CAC/DikC,MAAO0b,EAAOs6E,UAAW,eAAgBrpH,IAAK,WAC7C8sH,GAAShtH,OAAQwtC,EAAM,CAAEloD,EAAO,QAASgK,GAC1C,IAEF,IAGD2/C,EAAOhQ,GAAGmkC,OAAQ,CACjB1W,MAAO,SAAUpnE,EAAM4J,GACtB,IAAIgpC,EAAS,EAQb,MANqB,iBAAT5yC,IACX4J,EAAO5J,EACPA,EAAO,KACP4yC,KAGI7xC,UAAUC,OAAS4xC,EAChB+W,EAAOyd,MAAOrnE,KAAM,GAAKC,QAGjB2D,IAATiG,EACN7J,KACAA,KAAK2uC,KAAM,WACV,IAAI04B,EAAQzd,EAAOyd,MAAOrnE,KAAMC,EAAM4J,GAGtC+/C,EAAOy+E,YAAaroI,KAAMC,GAEZ,OAATA,GAAgC,eAAfonE,EAAO,IAC5Bzd,EAAOs+E,QAASloI,KAAMC,EAExB,EACF,EACAioI,QAAS,SAAUjoI,GAClB,OAAOD,KAAK2uC,KAAM,WACjBib,EAAOs+E,QAASloI,KAAMC,EACvB,EACD,EACAqoI,WAAY,SAAUroI,GACrB,OAAOD,KAAKqnE,MAAOpnE,GAAQ,KAAM,GAClC,EAIAi5C,QAAS,SAAUj5C,EAAMjB,GACxB,IAAIupI,EACHj6H,EAAQ,EACRk6H,EAAQ5+E,EAAOg7E,WACf/yD,EAAW7xE,KACX8Q,EAAI9Q,KAAKiB,OACTkqC,EAAU,aACC78B,GACTk6H,EAAM9C,YAAa7zD,EAAU,CAAEA,GAEjC,EAQD,IANqB,iBAAT5xE,IACXjB,EAAMiB,EACNA,OAAO2D,GAER3D,EAAOA,GAAQ,KAEP6Q,MACPy3H,EAAMZ,GAASnmI,IAAKqwE,EAAU/gE,GAAK7Q,EAAO,gBAC9BsoI,EAAIr6F,QACf5/B,IACAi6H,EAAIr6F,MAAMrzB,IAAKswB,IAIjB,OADAA,IACOq9F,EAAMtvF,QAASl6C,EACvB,IAED,IAAIypI,GAAO,sCAA0CnmI,OAEjDomI,GAAU,IAAIrmI,OAAQ,iBAAmBomI,GAAO,cAAe,KAG/DE,GAAY,CAAE,MAAO,QAAS,SAAU,QAExC1hH,GAAkB7V,EAAS6V,gBAI1B2hH,GAAa,SAAUzgF,GACzB,OAAOyB,EAAOvrC,SAAU8pC,EAAKyvE,cAAezvE,EAC7C,EACA0gF,GAAW,CAAEA,UAAU,GAOnB5hH,GAAgB6hH,cACpBF,GAAa,SAAUzgF,GACtB,OAAOyB,EAAOvrC,SAAU8pC,EAAKyvE,cAAezvE,IAC3CA,EAAK2gF,YAAaD,MAAe1gF,EAAKyvE,aACxC,GAEF,IAAImR,GAAqB,SAAU5gF,EAAMhgC,GAOvC,MAA8B,UAH9BggC,EAAOhgC,GAAMggC,GAGDhkC,MAAMoB,SACM,KAAvB4iC,EAAKhkC,MAAMoB,SAMXqjH,GAAYzgF,IAEsB,SAAlCyB,EAAOlF,IAAKyD,EAAM,UACpB,EAID,SAAS6gF,GAAW7gF,EAAMP,EAAMqhF,EAAYxlE,GAC3C,IAAIylE,EAAU3sH,EACb4sH,EAAgB,GAChBC,EAAe3lE,EACd,WACC,OAAOA,EAAM0/D,KACd,EACA,WACC,OAAOv5E,EAAOlF,IAAKyD,EAAMP,EAAM,GAChC,EACD4S,EAAU4uE,IACV3oD,EAAOwoD,GAAcA,EAAY,KAASr/E,EAAOy/E,UAAWzhF,GAAS,GAAK,MAG1E0hF,EAAgBnhF,EAAKniD,WAClB4jD,EAAOy/E,UAAWzhF,IAAmB,OAAT64B,IAAkBjmB,IAChDkuE,GAAQvhI,KAAMyiD,EAAOlF,IAAKyD,EAAMP,IAElC,GAAK0hF,GAAiBA,EAAe,KAAQ7oD,EAAO,CAYnD,IARAjmB,GAAoB,EAGpBimB,EAAOA,GAAQ6oD,EAAe,GAG9BA,GAAiB9uE,GAAW,EAEpB2uE,KAIPv/E,EAAOzlC,MAAOgkC,EAAMP,EAAM0hF,EAAgB7oD,IACnC,EAAIlkE,IAAY,GAAMA,EAAQ6sH,IAAiB5uE,GAAW,MAAW,IAC3E2uE,EAAgB,GAEjBG,GAAgC/sH,EAIjC+sH,GAAgC,EAChC1/E,EAAOzlC,MAAOgkC,EAAMP,EAAM0hF,EAAgB7oD,GAG1CwoD,EAAaA,GAAc,EAC5B,CAeA,OAbKA,IACJK,GAAiBA,IAAkB9uE,GAAW,EAG9C0uE,EAAWD,EAAY,GACtBK,GAAkBL,EAAY,GAAM,GAAMA,EAAY,IACrDA,EAAY,GACTxlE,IACJA,EAAMgd,KAAOA,EACbhd,EAAM7zD,MAAQ05H,EACd7lE,EAAM1wD,IAAMm2H,IAGPA,CACR,CAGA,IAAIK,GAAoB,CAAC,EAEzB,SAASC,GAAmBrhF,GAC3B,IAAI0mB,EACHwnD,EAAMluE,EAAKyvE,cACXz0G,EAAWglC,EAAKhlC,SAChBoC,EAAUgkH,GAAmBpmH,GAE9B,OAAKoC,IAILspD,EAAOwnD,EAAIhlH,KAAKO,YAAaykH,EAAI3kH,cAAeyR,IAChDoC,EAAUqkC,EAAOlF,IAAKmqB,EAAM,WAE5BA,EAAK5/C,WAAWG,YAAay/C,GAEZ,SAAZtpD,IACJA,EAAU,SAEXgkH,GAAmBpmH,GAAaoC,EAEzBA,EACR,CAEA,SAASkkH,GAAU53D,EAAUvtC,GAO5B,IANA,IAAI/e,EAAS4iC,EACZ/gC,EAAS,GACT9d,EAAQ,EACRrI,EAAS4wE,EAAS5wE,OAGXqI,EAAQrI,EAAQqI,KACvB6+C,EAAO0pB,EAAUvoE,IACN6a,QAIXoB,EAAU4iC,EAAKhkC,MAAMoB,QAChB+e,GAKa,SAAZ/e,IACJ6B,EAAQ9d,GAAUq+H,GAASnmI,IAAK2mD,EAAM,YAAe,KAC/C/gC,EAAQ9d,KACb6+C,EAAKhkC,MAAMoB,QAAU,KAGK,KAAvB4iC,EAAKhkC,MAAMoB,SAAkBwjH,GAAoB5gF,KACrD/gC,EAAQ9d,GAAUkgI,GAAmBrhF,KAGrB,SAAZ5iC,IACJ6B,EAAQ9d,GAAU,OAGlBq+H,GAASl+H,IAAK0+C,EAAM,UAAW5iC,KAMlC,IAAMjc,EAAQ,EAAGA,EAAQrI,EAAQqI,IACR,MAAnB8d,EAAQ9d,KACZuoE,EAAUvoE,GAAQ6a,MAAMoB,QAAU6B,EAAQ9d,IAI5C,OAAOuoE,CACR,CAEAjoB,EAAOhQ,GAAGmkC,OAAQ,CACjBz5C,KAAM,WACL,OAAOmlG,GAAUzpI,MAAM,EACxB,EACAqkC,KAAM,WACL,OAAOolG,GAAUzpI,KAClB,EACAgS,OAAQ,SAAU4M,GACjB,MAAsB,kBAAVA,EACJA,EAAQ5e,KAAKskC,OAAStkC,KAAKqkC,OAG5BrkC,KAAK2uC,KAAM,WACZo6F,GAAoB/oI,MACxB4pD,EAAQ5pD,MAAOskC,OAEfslB,EAAQ5pD,MAAOqkC,MAEjB,EACD,IAED,IAUEyjB,GACAvL,GAXEmtF,GAAiB,wBAEjBC,GAAW,iCAEXC,GAAc,qCAMhB9hF,GADc12C,EAASy4H,yBACRj4H,YAAaR,EAASM,cAAe,SACpD6qC,GAAQnrC,EAASM,cAAe,UAM3B+T,aAAc,OAAQ,SAC5B82B,GAAM92B,aAAc,UAAW,WAC/B82B,GAAM92B,aAAc,OAAQ,KAE5BqiC,GAAIl2C,YAAa2qC,IAIjBw5E,EAAQ+T,WAAahiF,GAAIzpB,WAAW,GAAOA,WAAW,GAAOmgG,UAAUnnE,QAIvEvP,GAAI98B,UAAY,yBAChB+qG,EAAQgU,iBAAmBjiF,GAAIzpB,WAAW,GAAOmgG,UAAUwL,aAK3DliF,GAAI98B,UAAY,oBAChB+qG,EAAQxgH,SAAWuyC,GAAI02E,UAKxB,IAAIyL,GAAU,CAKbv6E,MAAO,CAAE,EAAG,UAAW,YACvBjhB,IAAK,CAAE,EAAG,oBAAqB,uBAC/By7F,GAAI,CAAE,EAAG,iBAAkB,oBAC3B9rB,GAAI,CAAE,EAAG,qBAAsB,yBAE/BzoE,SAAU,CAAE,EAAG,GAAI,KAYpB,SAASw0F,GAAQ1T,EAASzrH,GAIzB,IAAI4rH,EAYJ,OATCA,OAD4C,IAAjCH,EAAQh4F,qBACbg4F,EAAQh4F,qBAAsBzzB,GAAO,UAEI,IAA7ByrH,EAAQnxG,iBACpBmxG,EAAQnxG,iBAAkBta,GAAO,KAGjC,QAGMpH,IAARoH,GAAqBA,GAAOmY,EAAUszG,EAASzrH,GAC5C4+C,EAAOj6C,MAAO,CAAE8mH,GAAWG,GAG5BA,CACR,CAIA,SAASwT,GAAe7hF,EAAO8hF,GAI9B,IAHA,IAAIv5H,EAAI,EACP+B,EAAI01C,EAAMtnD,OAEH6P,EAAI+B,EAAG/B,IACd62H,GAASl+H,IACR8+C,EAAOz3C,GACP,cACCu5H,GAAe1C,GAASnmI,IAAK6oI,EAAav5H,GAAK,cAGnD,CA7CAm5H,GAAQK,MAAQL,GAAQn6E,MAAQm6E,GAAQM,SAAWN,GAAQ1vG,QAAU0vG,GAAQv6E,MAC7Eu6E,GAAQO,GAAKP,GAAQ7rB,GAGf2X,EAAQxgH,SACb00H,GAAQQ,SAAWR,GAAQ10H,OAAS,CAAE,EAAG,+BAAgC,cA2C1E,IAAIm1H,GAAQ,YAEZ,SAASC,GAAepiF,EAAOkuE,EAASmU,EAASpoC,EAAWqoC,GAO3D,IANA,IAAI1iF,EAAMogF,EAAKv9H,EAAKuvC,EAAMuwF,EAAUr4D,EACnCs4D,EAAWtU,EAAQoT,yBACnB58F,EAAQ,GACRn8B,EAAI,EACJ+B,EAAI01C,EAAMtnD,OAEH6P,EAAI+B,EAAG/B,IAGd,IAFAq3C,EAAOI,EAAOz3C,KAEQ,IAATq3C,EAGZ,GAAwB,WAAnBouE,EAAQpuE,GAIZyB,EAAOj6C,MAAOs9B,EAAOkb,EAAKniD,SAAW,CAAEmiD,GAASA,QAG1C,GAAMuiF,GAAMvmI,KAAMgkD,GAIlB,CAUN,IATAogF,EAAMA,GAAOwC,EAASn5H,YAAa6kH,EAAQ/kH,cAAe,QAG1D1G,GAAQ2+H,GAASxiI,KAAMghD,IAAU,CAAE,GAAI,KAAQ,GAAIryC,cACnDykC,EAAO0vF,GAASj/H,IAASi/H,GAAQt0F,SACjC4yF,EAAIv9G,UAAYuvB,EAAM,GAAMqP,EAAOohF,cAAe7iF,GAAS5N,EAAM,GAGjEk4B,EAAIl4B,EAAM,GACFk4B,KACP81D,EAAMA,EAAI/J,UAKX50E,EAAOj6C,MAAOs9B,EAAOs7F,EAAIhhH,aAGzBghH,EAAMwC,EAASp5H,YAGXg4E,YAAc,EACnB,MA1BC18C,EAAMviC,KAAM+rH,EAAQhvD,eAAgBtf,IAkCvC,IAHA4iF,EAASphD,YAAc,GAEvB74E,EAAI,EACMq3C,EAAOlb,EAAOn8B,MAGvB,GAAK0xF,GAAa54C,EAAO4tE,QAASrvE,EAAMq6C,IAAe,EACjDqoC,GACJA,EAAQngI,KAAMy9C,QAgBhB,GAXA2iF,EAAWlC,GAAYzgF,GAGvBogF,EAAM4B,GAAQY,EAASn5H,YAAau2C,GAAQ,UAGvC2iF,GACJV,GAAe7B,GAIXqC,EAEJ,IADAn4D,EAAI,EACMtqB,EAAOogF,EAAK91D,MAChBm3D,GAAYzlI,KAAMgkD,EAAKloD,MAAQ,KACnC2qI,EAAQlgI,KAAMy9C,GAMlB,OAAO4iF,CACR,CAGA,IAAIE,GAAiB,sBAErB,SAASC,KACR,OAAO,CACR,CAEA,SAASC,KACR,OAAO,CACR,CAEA,SAAS31H,GAAI2yC,EAAM5hD,EAAO8mC,EAAUxjC,EAAM+vC,EAAIwxF,GAC7C,IAAIC,EAAQprI,EAGZ,GAAsB,iBAAVsG,EAAqB,CAShC,IAAMtG,IANmB,iBAAbotC,IAGXxjC,EAAOA,GAAQwjC,EACfA,OAAWzpC,GAEE2C,EACbiP,GAAI2yC,EAAMloD,EAAMotC,EAAUxjC,EAAMtD,EAAOtG,GAAQmrI,GAEhD,OAAOjjF,CACR,CAqBA,GAnBa,MAARt+C,GAAsB,MAAN+vC,GAGpBA,EAAKvM,EACLxjC,EAAOwjC,OAAWzpC,GACD,MAANg2C,IACc,iBAAbvM,GAGXuM,EAAK/vC,EACLA,OAAOjG,IAIPg2C,EAAK/vC,EACLA,EAAOwjC,EACPA,OAAWzpC,KAGD,IAAPg2C,EACJA,EAAKuxF,QACC,IAAMvxF,EACZ,OAAOuO,EAeR,OAZa,IAARijF,IACJC,EAASzxF,EACTA,EAAK,SAAU92B,GAId,OADA8mC,IAAS1zC,IAAK4M,GACPuoH,EAAO38H,MAAO1O,KAAMgB,UAC5B,EAGA44C,EAAGm+E,KAAOsT,EAAOtT,OAAUsT,EAAOtT,KAAOnuE,EAAOmuE,SAE1C5vE,EAAKxZ,KAAM,WACjBib,EAAO9mC,MAAMjI,IAAK7a,KAAMuG,EAAOqzC,EAAI/vC,EAAMwjC,EAC1C,EACD,CA6aA,SAASi+F,GAAgBnjH,EAAIloB,EAAMq1D,GAG5BA,GAQNqyE,GAASl+H,IAAK0e,EAAIloB,GAAM,GACxB2pD,EAAO9mC,MAAMjI,IAAKsN,EAAIloB,EAAM,CAC3BqpD,WAAW,EACX5T,QAAS,SAAU5yB,GAClB,IAAI3Z,EACHoiI,EAAQ5D,GAASnmI,IAAKxB,KAAMC,GAE7B,GAAyB,EAAlB6iB,EAAM0oH,WAAmBxrI,KAAMC,IAGrC,GAAMsrI,GA4BQ3hF,EAAO9mC,MAAMyiH,QAAStlI,IAAU,CAAC,GAAIwrI,cAClD3oH,EAAMZ,uBAhBN,GARAqpH,EAAQz+H,EAAM/M,KAAMiB,WACpB2mI,GAASl+H,IAAKzJ,KAAMC,EAAMsrI,GAG1BvrI,KAAMC,KACNkJ,EAASw+H,GAASnmI,IAAKxB,KAAMC,GAC7B0nI,GAASl+H,IAAKzJ,KAAMC,GAAM,GAErBsrI,IAAUpiI,EAMd,OAHA2Z,EAAM4oH,2BACN5oH,EAAMb,iBAEC9Y,OAeEoiI,IAGX5D,GAASl+H,IAAKzJ,KAAMC,EAAM2pD,EAAO9mC,MAAMy+D,QACtCgqD,EAAO,GACPA,EAAMz+H,MAAO,GACb9M,OAWD8iB,EAAMZ,kBACNY,EAAM6oH,8BAAgCT,GAExC,UAvEkCtnI,IAA7B+jI,GAASnmI,IAAK2mB,EAAIloB,IACtB2pD,EAAO9mC,MAAMjI,IAAKsN,EAAIloB,EAAMirI,GAwE/B,CApfAthF,EAAO9mC,MAAQ,CAEdw3B,OAAQ,CAAC,EAETz/B,IAAK,SAAUstC,EAAM5hD,EAAOmvC,EAAS7rC,EAAMwjC,GAE1C,IAAIu+F,EAAaC,EAAatD,EAC7BvyH,EAAQ3F,EAAGy7H,EACXvG,EAASwG,EAAU9rI,EAAM+rI,EAAYC,EACrCC,EAAWvE,GAASnmI,IAAK2mD,GAG1B,GAAMo/E,GAAYp/E,GAuClB,IAlCKzS,EAAQA,UAEZA,GADAk2F,EAAcl2F,GACQA,QACtBrI,EAAWu+F,EAAYv+F,UAKnBA,GACJuc,EAAO/kD,KAAK6iD,gBAAiBzgC,GAAiBomB,GAIzCqI,EAAQqiF,OACbriF,EAAQqiF,KAAOnuE,EAAOmuE,SAIf/hH,EAASk2H,EAASl2H,UACzBA,EAASk2H,EAASl2H,OAAS1W,OAAOc,OAAQ,QAEnCyrI,EAAcK,EAASC,UAC9BN,EAAcK,EAASC,OAAS,SAAU1lI,GAIzC,YAAyB,IAAXmjD,GAA0BA,EAAO9mC,MAAMspH,YAAc3lI,EAAExG,KACpE2pD,EAAO9mC,MAAMupH,SAAS39H,MAAOy5C,EAAMnnD,gBAAc4C,CACnD,GAKDyM,GADA9J,GAAUA,GAAS,IAAK7C,MAAOkgI,IAAmB,CAAE,KAC1C3iI,OACFoP,KAEPpQ,EAAOgsI,GADP1D,EAAM0C,GAAe9jI,KAAMZ,EAAO8J,KAAS,IACpB,GACvB27H,GAAezD,EAAK,IAAO,IAAK12H,MAAO,KAAMmN,OAGvC/e,IAKNslI,EAAU37E,EAAO9mC,MAAMyiH,QAAStlI,IAAU,CAAC,EAG3CA,GAASotC,EAAWk4F,EAAQkG,aAAelG,EAAQ+G,WAAcrsI,EAGjEslI,EAAU37E,EAAO9mC,MAAMyiH,QAAStlI,IAAU,CAAC,EAG3C6rI,EAAYliF,EAAOm0B,OAAQ,CAC1B99E,KAAMA,EACNgsI,SAAUA,EACVpiI,KAAMA,EACN6rC,QAASA,EACTqiF,KAAMriF,EAAQqiF,KACd1qF,SAAUA,EACV+sF,aAAc/sF,GAAYuc,EAAOszE,KAAKx5H,MAAM02H,aAAaj2H,KAAMkpC,GAC/Dic,UAAW0iF,EAAWvoI,KAAM,MAC1BmoI,IAGKG,EAAW/1H,EAAQ/V,OAC1B8rI,EAAW/1H,EAAQ/V,GAAS,IACnBssI,cAAgB,EAGnBhH,EAAQ9vE,QACiD,IAA9D8vE,EAAQ9vE,MAAM11D,KAAMooD,EAAMt+C,EAAMmiI,EAAYH,IAEvC1jF,EAAK90C,kBACT80C,EAAK90C,iBAAkBpT,EAAM4rI,IAK3BtG,EAAQ1qH,MACZ0qH,EAAQ1qH,IAAI9a,KAAMooD,EAAM2jF,GAElBA,EAAUp2F,QAAQqiF,OACvB+T,EAAUp2F,QAAQqiF,KAAOriF,EAAQqiF,OAK9B1qF,EACJ0+F,EAAS7jI,OAAQ6jI,EAASQ,gBAAiB,EAAGT,GAE9CC,EAASrhI,KAAMohI,GAIhBliF,EAAO9mC,MAAMw3B,OAAQr6C,IAAS,EAGhC,EAGA0a,OAAQ,SAAUwtC,EAAM5hD,EAAOmvC,EAASrI,EAAUm/F,GAEjD,IAAI/5D,EAAGg6D,EAAWlE,EACjBvyH,EAAQ3F,EAAGy7H,EACXvG,EAASwG,EAAU9rI,EAAM+rI,EAAYC,EACrCC,EAAWvE,GAASD,QAASv/E,IAAUw/E,GAASnmI,IAAK2mD,GAEtD,GAAM+jF,IAAel2H,EAASk2H,EAASl2H,QAAvC,CAOA,IADA3F,GADA9J,GAAUA,GAAS,IAAK7C,MAAOkgI,IAAmB,CAAE,KAC1C3iI,OACFoP,KAMP,GAJApQ,EAAOgsI,GADP1D,EAAM0C,GAAe9jI,KAAMZ,EAAO8J,KAAS,IACpB,GACvB27H,GAAezD,EAAK,IAAO,IAAK12H,MAAO,KAAMmN,OAGvC/e,EAAN,CAeA,IARAslI,EAAU37E,EAAO9mC,MAAMyiH,QAAStlI,IAAU,CAAC,EAE3C8rI,EAAW/1H,EADX/V,GAASotC,EAAWk4F,EAAQkG,aAAelG,EAAQ+G,WAAcrsI,IACpC,GAC7BsoI,EAAMA,EAAK,IACV,IAAIlmI,OAAQ,UAAY2pI,EAAWvoI,KAAM,iBAAoB,WAG9DgpI,EAAYh6D,EAAIs5D,EAAS9qI,OACjBwxE,KACPq5D,EAAYC,EAAUt5D,IAEf+5D,GAAeP,IAAaH,EAAUG,UACzCv2F,GAAWA,EAAQqiF,OAAS+T,EAAU/T,MACtCwQ,IAAOA,EAAIpkI,KAAM2nI,EAAUxiF,YAC3Bjc,GAAYA,IAAay+F,EAAUz+F,WACxB,OAAbA,IAAqBy+F,EAAUz+F,YAChC0+F,EAAS7jI,OAAQuqE,EAAG,GAEfq5D,EAAUz+F,UACd0+F,EAASQ,gBAELhH,EAAQ5qH,QACZ4qH,EAAQ5qH,OAAO5a,KAAMooD,EAAM2jF,IAOzBW,IAAcV,EAAS9qI,SACrBskI,EAAQmH,WACkD,IAA/DnH,EAAQmH,SAAS3sI,KAAMooD,EAAM6jF,EAAYE,EAASC,SAElDviF,EAAO+iF,YAAaxkF,EAAMloD,EAAMisI,EAASC,eAGnCn2H,EAAQ/V,GAtChB,MAJC,IAAMA,KAAQ+V,EACb4zC,EAAO9mC,MAAMnI,OAAQwtC,EAAMloD,EAAOsG,EAAO8J,GAAKqlC,EAASrI,GAAU,GA8C/Duc,EAAOytE,cAAerhH,IAC1B2xH,GAAShtH,OAAQwtC,EAAM,gBA5DxB,CA8DD,EAEAkkF,SAAU,SAAUO,GAEnB,IAAI97H,EAAG2hE,EAAGmkD,EAAKjnD,EAASm8D,EAAWe,EAClCh9H,EAAO,IAAInL,MAAO1D,UAAUC,QAG5B6hB,EAAQ8mC,EAAO9mC,MAAMgqH,IAAKF,GAE1Bb,GACCpE,GAASnmI,IAAKxB,KAAM,WAAcV,OAAOc,OAAQ,OAC/C0iB,EAAM7iB,OAAU,GACnBslI,EAAU37E,EAAO9mC,MAAMyiH,QAASziH,EAAM7iB,OAAU,CAAC,EAKlD,IAFA4P,EAAM,GAAMiT,EAENhS,EAAI,EAAGA,EAAI9P,UAAUC,OAAQ6P,IAClCjB,EAAMiB,GAAM9P,UAAW8P,GAMxB,GAHAgS,EAAMiqH,eAAiB/sI,MAGlBulI,EAAQyH,cAA2D,IAA5CzH,EAAQyH,YAAYjtI,KAAMC,KAAM8iB,GAA5D,CASA,IAJA+pH,EAAejjF,EAAO9mC,MAAMipH,SAAShsI,KAAMC,KAAM8iB,EAAOipH,GAGxDj7H,EAAI,GACM6+D,EAAUk9D,EAAc/7H,QAAYgS,EAAMmqH,wBAInD,IAHAnqH,EAAMkoB,cAAgB2kC,EAAQxnB,KAE9BsqB,EAAI,GACMq5D,EAAYn8D,EAAQo8D,SAAUt5D,QACtC3vD,EAAM6oH,iCAID7oH,EAAMoqH,aAAsC,IAAxBpB,EAAUxiF,YACnCxmC,EAAMoqH,WAAW/oI,KAAM2nI,EAAUxiF,aAEjCxmC,EAAMgpH,UAAYA,EAClBhpH,EAAMjZ,KAAOiiI,EAAUjiI,UAKVjG,KAHbgzH,IAAUhtE,EAAO9mC,MAAMyiH,QAASuG,EAAUG,WAAc,CAAC,GAAIE,QAC5DL,EAAUp2F,SAAUhnC,MAAOihE,EAAQxnB,KAAMt4C,MAGT,KAAzBiT,EAAM3Z,OAASytH,KACrB9zG,EAAMb,iBACNa,EAAMZ,oBAYX,OAJKqjH,EAAQ4H,cACZ5H,EAAQ4H,aAAaptI,KAAMC,KAAM8iB,GAG3BA,EAAM3Z,MAxCb,CAyCD,EAEA4iI,SAAU,SAAUjpH,EAAOipH,GAC1B,IAAIj7H,EAAGg7H,EAAWnwF,EAAKyxF,EAAiBC,EACvCR,EAAe,GACfN,EAAgBR,EAASQ,cACzBpJ,EAAMrgH,EAAM1hB,OAGb,GAAKmrI,GAIJpJ,EAAIn9H,YAOc,UAAf8c,EAAM7iB,MAAoB6iB,EAAMnP,QAAU,GAE7C,KAAQwvH,IAAQnjI,KAAMmjI,EAAMA,EAAIl0G,YAAcjvB,KAI7C,GAAsB,IAAjBmjI,EAAIn9H,WAAoC,UAAf8c,EAAM7iB,OAAqC,IAAjBkjI,EAAI7rE,UAAsB,CAGjF,IAFA81E,EAAkB,GAClBC,EAAmB,CAAC,EACdv8H,EAAI,EAAGA,EAAIy7H,EAAez7H,SAMElN,IAA5BypI,EAFL1xF,GAHAmwF,EAAYC,EAAUj7H,IAGNu8B,SAAW,OAG1BggG,EAAkB1xF,GAAQmwF,EAAU1R,aACnCxwE,EAAQjO,EAAK37C,MAAOsJ,MAAO65H,IAAS,EACpCv5E,EAAO/kD,KAAM82C,EAAK37C,KAAM,KAAM,CAAEmjI,IAAQliI,QAErCosI,EAAkB1xF,IACtByxF,EAAgB1iI,KAAMohI,GAGnBsB,EAAgBnsI,QACpB4rI,EAAaniI,KAAM,CAAEy9C,KAAMg7E,EAAK4I,SAAUqB,GAE5C,CAUF,OALAjK,EAAMnjI,KACDusI,EAAgBR,EAAS9qI,QAC7B4rI,EAAaniI,KAAM,CAAEy9C,KAAMg7E,EAAK4I,SAAUA,EAASj/H,MAAOy/H,KAGpDM,CACR,EAEAS,QAAS,SAAUhsI,EAAMisI,GACxBjuI,OAAO4B,eAAgB0oD,EAAOt1C,MAAMnU,UAAWmB,EAAM,CACpDC,YAAY,EACZ0Q,cAAc,EAEdzQ,IAAKiM,EAAY8/H,GAChB,WACC,GAAKvtI,KAAKwtI,cACT,OAAOD,EAAMvtI,KAAKwtI,cAEpB,EACA,WACC,GAAKxtI,KAAKwtI,cACT,OAAOxtI,KAAKwtI,cAAelsI,EAE7B,EAEDmI,IAAK,SAAUtI,GACd7B,OAAO4B,eAAgBlB,KAAMsB,EAAM,CAClCC,YAAY,EACZ0Q,cAAc,EACdC,UAAU,EACV/Q,MAAOA,GAET,GAEF,EAEA2rI,IAAK,SAAUU,GACd,OAAOA,EAAe5jF,EAAOutE,SAC5BqW,EACA,IAAI5jF,EAAOt1C,MAAOk5H,EACpB,EAEAjI,QAAS,CACR12B,KAAM,CAGL4+B,UAAU,GAEXr0H,MAAO,CAGNq8C,MAAO,SAAU5rD,GAIhB,IAAIse,EAAKnoB,MAAQ6J,EAWjB,OARK6/H,GAAevlI,KAAMgkB,EAAGloB,OAC5BkoB,EAAG/O,OAAS+J,EAAUgF,EAAI,UAG1BmjH,GAAgBnjH,EAAI,SAAS,IAIvB,CACR,EACAo5D,QAAS,SAAU13E,GAIlB,IAAIse,EAAKnoB,MAAQ6J,EAUjB,OAPK6/H,GAAevlI,KAAMgkB,EAAGloB,OAC5BkoB,EAAG/O,OAAS+J,EAAUgF,EAAI,UAE1BmjH,GAAgBnjH,EAAI,UAId,CACR,EAIAwtB,SAAU,SAAU7yB,GACnB,IAAI1hB,EAAS0hB,EAAM1hB,OACnB,OAAOsoI,GAAevlI,KAAM/C,EAAOnB,OAClCmB,EAAOgY,OAAS+J,EAAU/hB,EAAQ,UAClCumI,GAASnmI,IAAKJ,EAAQ,UACtB+hB,EAAU/hB,EAAQ,IACpB,GAGDssI,aAAc,CACbP,aAAc,SAAUrqH,QAIDlf,IAAjBkf,EAAM3Z,QAAwB2Z,EAAM0qH,gBACxC1qH,EAAM0qH,cAAch/C,YAAc1rE,EAAM3Z,OAE1C,KAwFHygD,EAAO+iF,YAAc,SAAUxkF,EAAMloD,EAAMksI,GAGrChkF,EAAK/zC,qBACT+zC,EAAK/zC,oBAAqBnU,EAAMksI,EAElC,EAEAviF,EAAOt1C,MAAQ,SAAU4T,EAAKrc,GAG7B,KAAQ7L,gBAAgB4pD,EAAOt1C,OAC9B,OAAO,IAAIs1C,EAAOt1C,MAAO4T,EAAKrc,GAI1Bqc,GAAOA,EAAIjoB,MACfD,KAAKwtI,cAAgBtlH,EACrBloB,KAAKC,KAAOioB,EAAIjoB,KAIhBD,KAAK2tI,mBAAqBzlH,EAAInG,uBACHne,IAAzBskB,EAAInG,mBAGgB,IAApBmG,EAAIsmE,YACL08C,GACAC,GAKDnrI,KAAKoB,OAAW8mB,EAAI9mB,QAAkC,IAAxB8mB,EAAI9mB,OAAO4E,SACxCkiB,EAAI9mB,OAAO6tB,WACX/G,EAAI9mB,OAELpB,KAAKgrC,cAAgB9iB,EAAI8iB,cACzBhrC,KAAK4tI,cAAgB1lH,EAAI0lH,eAIzB5tI,KAAKC,KAAOioB,EAIRrc,GACJ+9C,EAAOm0B,OAAQ/9E,KAAM6L,GAItB7L,KAAK6tI,UAAY3lH,GAAOA,EAAI2lH,WAAajlI,KAAKC,MAG9C7I,KAAM4pD,EAAOutE,UAAY,CAC1B,EAIAvtE,EAAOt1C,MAAMnU,UAAY,CACxBE,YAAaupD,EAAOt1C,MACpBq5H,mBAAoBxC,GACpB8B,qBAAsB9B,GACtBQ,8BAA+BR,GAC/B2C,aAAa,EAEb7rH,eAAgB,WACf,IAAIxb,EAAIzG,KAAKwtI,cAEbxtI,KAAK2tI,mBAAqBzC,GAErBzkI,IAAMzG,KAAK8tI,aACfrnI,EAAEwb,gBAEJ,EACAC,gBAAiB,WAChB,IAAIzb,EAAIzG,KAAKwtI,cAEbxtI,KAAKitI,qBAAuB/B,GAEvBzkI,IAAMzG,KAAK8tI,aACfrnI,EAAEyb,iBAEJ,EACAwpH,yBAA0B,WACzB,IAAIjlI,EAAIzG,KAAKwtI,cAEbxtI,KAAK2rI,8BAAgCT,GAEhCzkI,IAAMzG,KAAK8tI,aACfrnI,EAAEilI,2BAGH1rI,KAAKkiB,iBACN,GAID0nC,EAAOjb,KAAM,CACZtE,QAAQ,EACR91B,SAAS,EACTC,YAAY,EACZP,gBAAgB,EAChBm2B,SAAS,EACTzoB,QAAQ,EACRosH,YAAY,EACZviG,SAAS,EACTp5B,OAAO,EACPC,OAAO,EACPi4B,UAAU,EACV0jG,MAAM,EACN,MAAQ,EACR5hF,MAAM,EACN6hF,UAAU,EACVhkI,KAAK,EACLikI,SAAS,EACTv6H,QAAQ,EACRD,SAAS,EACTpB,SAAS,EACTC,SAAS,EACTmyD,SAAS,EACTG,SAAS,EACTspE,WAAW,EACXC,aAAa,EACbC,SAAS,EACTC,SAAS,EACTC,eAAe,EACfC,WAAW,EACXvsC,SAAS,EACTwsC,OAAO,GACL7kF,EAAO9mC,MAAMwqH,SAEhB1jF,EAAOjb,KAAM,CAAE7b,MAAO,UAAWmX,KAAM,YAAc,SAAUhqC,EAAMwrI,GAEpE,SAASiD,EAAoB9B,GAC5B,GAAKx7H,EAASu9H,aAAe,CAS5B,IAAIxC,EAASxE,GAASnmI,IAAKxB,KAAM,UAChC8iB,EAAQ8mC,EAAO9mC,MAAMgqH,IAAKF,GAC3B9pH,EAAM7iB,KAA4B,YAArB2sI,EAAY3sI,KAAqB,QAAU,OACxD6iB,EAAMgrH,aAAc,EAGpB3B,EAAQS,GAMH9pH,EAAM1hB,SAAW0hB,EAAMkoB,eAK3BmhG,EAAQrpH,EAEV,MAIC8mC,EAAO9mC,MAAM8rH,SAAUnD,EAAcmB,EAAYxrI,OAChDwoD,EAAO9mC,MAAMgqH,IAAKF,GAErB,CAEAhjF,EAAO9mC,MAAMyiH,QAAStlI,GAAS,CAG9Bw1D,MAAO,WAEN,IAAIo5E,EAOJ,GAFAvD,GAAgBtrI,KAAMC,GAAM,IAEvBmR,EAASu9H,aAcb,OAAO,GARPE,EAAWlH,GAASnmI,IAAKxB,KAAMyrI,KAE9BzrI,KAAKqT,iBAAkBo4H,EAAciD,GAEtC/G,GAASl+H,IAAKzJ,KAAMyrI,GAAgBoD,GAAY,GAAM,EAMxD,EACAttD,QAAS,WAMR,OAHA+pD,GAAgBtrI,KAAMC,IAGf,CACR,EAEAysI,SAAU,WACT,IAAImC,EAEJ,IAAKz9H,EAASu9H,aAWb,OAAO,GAVPE,EAAWlH,GAASnmI,IAAKxB,KAAMyrI,GAAiB,GAK/C9D,GAASl+H,IAAKzJ,KAAMyrI,EAAcoD,IAHlC7uI,KAAKoU,oBAAqBq3H,EAAciD,GACxC/G,GAAShtH,OAAQ3a,KAAMyrI,GAS1B,EAIA91F,SAAU,SAAU7yB,GACnB,OAAO6kH,GAASnmI,IAAKshB,EAAM1hB,OAAQnB,EACpC,EAEAwrI,aAAcA,GAef7hF,EAAO9mC,MAAMyiH,QAASkG,GAAiB,CACtCh2E,MAAO,WAIN,IAAI4gE,EAAMr2H,KAAK43H,eAAiB53H,KAAKoR,UAAYpR,KAChD8uI,EAAa19H,EAASu9H,aAAe3uI,KAAOq2H,EAC5CwY,EAAWlH,GAASnmI,IAAKstI,EAAYrD,GAMhCoD,IACAz9H,EAASu9H,aACb3uI,KAAKqT,iBAAkBo4H,EAAciD,GAErCrY,EAAIhjH,iBAAkBpT,EAAMyuI,GAAoB,IAGlD/G,GAASl+H,IAAKqlI,EAAYrD,GAAgBoD,GAAY,GAAM,EAC7D,EACAnC,SAAU,WACT,IAAIrW,EAAMr2H,KAAK43H,eAAiB53H,KAAKoR,UAAYpR,KAChD8uI,EAAa19H,EAASu9H,aAAe3uI,KAAOq2H,EAC5CwY,EAAWlH,GAASnmI,IAAKstI,EAAYrD,GAAiB,EAEjDoD,EAQLlH,GAASl+H,IAAKqlI,EAAYrD,EAAcoD,IAPnCz9H,EAASu9H,aACb3uI,KAAKoU,oBAAqBq3H,EAAciD,GAExCrY,EAAIjiH,oBAAqBnU,EAAMyuI,GAAoB,GAEpD/G,GAAShtH,OAAQm0H,EAAYrD,GAI/B,EAEF,GAUA7hF,EAAOjb,KAAM,CACZogG,WAAY,YACZC,WAAY,WACZC,aAAc,cACdC,aAAc,cACZ,SAAUC,EAAMrC,GAClBljF,EAAO9mC,MAAMyiH,QAAS4J,GAAS,CAC9B1D,aAAcqB,EACdR,SAAUQ,EAEVX,OAAQ,SAAUrpH,GACjB,IAAI8zG,EAEHwY,EAAUtsH,EAAM8qH,cAChB9B,EAAYhpH,EAAMgpH,UASnB,OALMsD,IAAaA,IANTpvI,MAMgC4pD,EAAOvrC,SANvCre,KAMyDovI,MAClEtsH,EAAM7iB,KAAO6rI,EAAUG,SACvBrV,EAAMkV,EAAUp2F,QAAQhnC,MAAO1O,KAAMgB,WACrC8hB,EAAM7iB,KAAO6sI,GAEPlW,CACR,EAEF,GAEAhtE,EAAOhQ,GAAGmkC,OAAQ,CAEjBvoE,GAAI,SAAUjP,EAAO8mC,EAAUxjC,EAAM+vC,GACpC,OAAOpkC,GAAIxV,KAAMuG,EAAO8mC,EAAUxjC,EAAM+vC,EACzC,EACAwxF,IAAK,SAAU7kI,EAAO8mC,EAAUxjC,EAAM+vC,GACrC,OAAOpkC,GAAIxV,KAAMuG,EAAO8mC,EAAUxjC,EAAM+vC,EAAI,EAC7C,EACA1jC,IAAK,SAAU3P,EAAO8mC,EAAUuM,GAC/B,IAAIkyF,EAAW7rI,EACf,GAAKsG,GAASA,EAAM0b,gBAAkB1b,EAAMulI,UAW3C,OARAA,EAAYvlI,EAAMulI,UAClBliF,EAAQrjD,EAAMwmI,gBAAiB72H,IAC9B41H,EAAUxiF,UACTwiF,EAAUG,SAAW,IAAMH,EAAUxiF,UACrCwiF,EAAUG,SACXH,EAAUz+F,SACVy+F,EAAUp2F,SAEJ11C,KAER,GAAsB,iBAAVuG,EAAqB,CAGhC,IAAMtG,KAAQsG,EACbvG,KAAKkW,IAAKjW,EAAMotC,EAAU9mC,EAAOtG,IAElC,OAAOD,IACR,CAUA,OATkB,IAAbqtC,GAA0C,mBAAbA,IAGjCuM,EAAKvM,EACLA,OAAWzpC,IAEA,IAAPg2C,IACJA,EAAKuxF,IAECnrI,KAAK2uC,KAAM,WACjBib,EAAO9mC,MAAMnI,OAAQ3a,KAAMuG,EAAOqzC,EAAIvM,EACvC,EACD,IAID,IAKCgiG,GAAe,wBAGfC,GAAW,oCAEXC,GAAe,6BAGhB,SAASC,GAAoBrnF,EAAMhwC,GAClC,OAAKgL,EAAUglC,EAAM,UACpBhlC,EAA+B,KAArBhL,EAAQnS,SAAkBmS,EAAUA,EAAQxG,WAAY,OAE3Di4C,EAAQzB,GAAO7+B,SAAU,SAAW,IAGrC6+B,CACR,CAGA,SAASsnF,GAAetnF,GAEvB,OADAA,EAAKloD,MAAyC,OAAhCkoD,EAAKpjC,aAAc,SAAsB,IAAMojC,EAAKloD,KAC3DkoD,CACR,CACA,SAASunF,GAAevnF,GAOvB,MAN2C,WAApCA,EAAKloD,MAAQ,IAAK6M,MAAO,EAAG,GAClCq7C,EAAKloD,KAAOkoD,EAAKloD,KAAK6M,MAAO,GAE7Bq7C,EAAK3iC,gBAAiB,QAGhB2iC,CACR,CAEA,SAASwnF,GAAgBznH,EAAK0nH,GAC7B,IAAI9+H,EAAG+B,EAAG5S,EAAgB4vI,EAAUC,EAAU95H,EAE9C,GAAuB,IAAlB45H,EAAK5pI,SAAV,CAKA,GAAK2hI,GAASD,QAASx/G,KAEtBlS,EADW2xH,GAASnmI,IAAK0mB,GACPlS,QAKjB,IAAM/V,KAFN0nI,GAAShtH,OAAQi1H,EAAM,iBAET55H,EACb,IAAMlF,EAAI,EAAG+B,EAAImD,EAAQ/V,GAAOgB,OAAQ6P,EAAI+B,EAAG/B,IAC9C84C,EAAO9mC,MAAMjI,IAAK+0H,EAAM3vI,EAAM+V,EAAQ/V,GAAQ6Q,IAO7C82H,GAASF,QAASx/G,KACtB2nH,EAAWjI,GAASf,OAAQ3+G,GAC5B4nH,EAAWlmF,EAAOm0B,OAAQ,CAAC,EAAG8xD,GAE9BjI,GAASn+H,IAAKmmI,EAAME,GAvBrB,CAyBD,CAGA,SAASC,GAAU7nH,EAAK0nH,GACvB,IAAIzsH,EAAWysH,EAAKzsH,SAASrN,cAGX,UAAbqN,GAAwBumH,GAAevlI,KAAM+jB,EAAIjoB,MACrD2vI,EAAKv4E,QAAUnvC,EAAImvC,QAGK,UAAbl0C,GAAqC,aAAbA,IACnCysH,EAAK5F,aAAe9hH,EAAI8hH,aAE1B,CAEA,SAASgG,GAAU3gE,EAAYx/D,EAAMq/B,EAAU27F,GAG9Ch7H,EAAO8lH,EAAM9lH,GAEb,IAAIk7H,EAAU7sE,EAAO0sE,EAASqF,EAAYrhG,EAAMynF,EAC/CvlH,EAAI,EACJ+B,EAAIw8D,EAAWpuE,OACfivI,EAAWr9H,EAAI,EACf1R,EAAQ0O,EAAM,GACdsgI,EAAkB1iI,EAAYtM,GAG/B,GAAKgvI,GACDt9H,EAAI,GAAsB,iBAAV1R,IAChB40H,EAAQ+T,YAAcwF,GAASnrI,KAAMhD,GACxC,OAAOkuE,EAAW1gC,KAAM,SAAUrlC,GACjC,IAAI1D,EAAOypE,EAAWnlE,GAAIZ,GACrB6mI,IACJtgI,EAAM,GAAM1O,EAAMpB,KAAMC,KAAMsJ,EAAO1D,EAAKiiB,SAE3CmoH,GAAUpqI,EAAMiK,EAAMq/B,EAAU27F,EACjC,GAGD,GAAKh4H,IAEJqrD,GADA6sE,EAAWJ,GAAe96H,EAAMw/D,EAAY,GAAIuoD,eAAe,EAAOvoD,EAAYw7D,IACjEl5H,WAEmB,IAA/Bo5H,EAASxjH,WAAWtmB,SACxB8pI,EAAW7sE,GAIPA,GAAS2sE,GAAU,CAOvB,IALAoF,GADArF,EAAUhhF,EAAO7mD,IAAKonI,GAAQY,EAAU,UAAY0E,KAC/BxuI,OAKb6P,EAAI+B,EAAG/B,IACd89B,EAAOm8F,EAEFj6H,IAAMo/H,IACVthG,EAAOgb,EAAO8oB,MAAO9jC,GAAM,GAAM,GAG5BqhG,GAIJrmF,EAAOj6C,MAAOi7H,EAAST,GAAQv7F,EAAM,YAIvCM,EAASnvC,KAAMsvE,EAAYv+D,GAAK89B,EAAM99B,GAGvC,GAAKm/H,EAOJ,IANA5Z,EAAMuU,EAASA,EAAQ3pI,OAAS,GAAI22H,cAGpChuE,EAAO7mD,IAAK6nI,EAAS8E,IAGf5+H,EAAI,EAAGA,EAAIm/H,EAAYn/H,IAC5B89B,EAAOg8F,EAAS95H,GACX84H,GAAYzlI,KAAMyqC,EAAK3uC,MAAQ,MAClC0nI,GAASd,OAAQj4F,EAAM,eACxBgb,EAAOvrC,SAAUg4G,EAAKznF,KAEjBA,EAAK1mB,KAA8C,YAArC0mB,EAAK3uC,MAAQ,IAAK6V,cAG/B8zC,EAAOwmF,WAAaxhG,EAAKunF,UAC7BvsE,EAAOwmF,SAAUxhG,EAAK1mB,IAAK,CAC1BguG,MAAOtnF,EAAKsnF,OAAStnF,EAAK7pB,aAAc,UACtCsxG,GASJD,EAASxnF,EAAK+6C,YAAYxmF,QAASosI,GAAc,IAAM3gG,EAAMynF,GAKlE,CAGD,OAAOhnD,CACR,CAEA,SAAS10D,GAAQwtC,EAAM9a,EAAUgjG,GAKhC,IAJA,IAAIzhG,EACH3B,EAAQI,EAAWuc,EAAO9lD,OAAQupC,EAAU8a,GAASA,EACrDr3C,EAAI,EAE4B,OAAvB89B,EAAO3B,EAAOn8B,IAAeA,IAChCu/H,GAA8B,IAAlBzhG,EAAK5oC,UACtB4jD,EAAO0mF,UAAWnG,GAAQv7F,IAGtBA,EAAK3f,aACJohH,GAAYzH,GAAYh6F,IAC5Bw7F,GAAeD,GAAQv7F,EAAM,WAE9BA,EAAK3f,WAAWG,YAAawf,IAI/B,OAAOuZ,CACR,CAEAyB,EAAOm0B,OAAQ,CACditD,cAAe,SAAUnjH,GACxB,OAAOA,CACR,EAEA6qD,MAAO,SAAUvqB,EAAMooF,EAAeC,GACrC,IAAI1/H,EAAG+B,EAAG49H,EAAaC,EACtBh+D,EAAQvqB,EAAK9pB,WAAW,GACxBsyG,EAAS/H,GAAYzgF,GAGtB,KAAM4tE,EAAQgU,gBAAsC,IAAlB5hF,EAAKniD,UAAoC,KAAlBmiD,EAAKniD,UAC3D4jD,EAAO6tE,SAAUtvE,IAOnB,IAHAuoF,EAAevG,GAAQz3D,GAGjB5hE,EAAI,EAAG+B,GAFb49H,EAActG,GAAQhiF,IAEOlnD,OAAQ6P,EAAI+B,EAAG/B,IAC3Ci/H,GAAUU,EAAa3/H,GAAK4/H,EAAc5/H,IAK5C,GAAKy/H,EACJ,GAAKC,EAIJ,IAHAC,EAAcA,GAAetG,GAAQhiF,GACrCuoF,EAAeA,GAAgBvG,GAAQz3D,GAEjC5hE,EAAI,EAAG+B,EAAI49H,EAAYxvI,OAAQ6P,EAAI+B,EAAG/B,IAC3C6+H,GAAgBc,EAAa3/H,GAAK4/H,EAAc5/H,SAGjD6+H,GAAgBxnF,EAAMuqB,GAWxB,OANAg+D,EAAevG,GAAQz3D,EAAO,WACZzxE,OAAS,GAC1BmpI,GAAesG,GAAeC,GAAUxG,GAAQhiF,EAAM,WAIhDuqB,CACR,EAEA49D,UAAW,SAAU/nF,GAKpB,IAJA,IAAI1+C,EAAMs+C,EAAMloD,EACfslI,EAAU37E,EAAO9mC,MAAMyiH,QACvBz0H,EAAI,OAE6BlN,KAAxBukD,EAAOI,EAAOz3C,IAAqBA,IAC5C,GAAKy2H,GAAYp/E,GAAS,CACzB,GAAOt+C,EAAOs+C,EAAMw/E,GAASxQ,SAAc,CAC1C,GAAKttH,EAAKmM,OACT,IAAM/V,KAAQ4J,EAAKmM,OACbuvH,EAAStlI,GACb2pD,EAAO9mC,MAAMnI,OAAQwtC,EAAMloD,GAI3B2pD,EAAO+iF,YAAaxkF,EAAMloD,EAAM4J,EAAKsiI,QAOxChkF,EAAMw/E,GAASxQ,cAAYvzH,CAC5B,CACKukD,EAAMy/E,GAASzQ,WAInBhvE,EAAMy/E,GAASzQ,cAAYvzH,EAE7B,CAEF,IAGDgmD,EAAOhQ,GAAGmkC,OAAQ,CACjBxnE,OAAQ,SAAU82B,GACjB,OAAO1yB,GAAQ3a,KAAMqtC,GAAU,EAChC,EAEA1yB,OAAQ,SAAU0yB,GACjB,OAAO1yB,GAAQ3a,KAAMqtC,EACtB,EAEAssB,KAAM,SAAUx4D,GACf,OAAO0lI,GAAQ7mI,KAAM,SAAUmB,GAC9B,YAAiByC,IAAVzC,EACNyoD,EAAO+P,KAAM35D,MACbA,KAAKkuC,QAAQS,KAAM,WACK,IAAlB3uC,KAAKgG,UAAoC,KAAlBhG,KAAKgG,UAAqC,IAAlBhG,KAAKgG,WACxDhG,KAAK2pF,YAAcxoF,EAErB,EACF,EAAG,KAAMA,EAAOH,UAAUC,OAC3B,EAEAsoB,OAAQ,WACP,OAAOymH,GAAUhwI,KAAMgB,UAAW,SAAUmnD,GACpB,IAAlBnoD,KAAKgG,UAAoC,KAAlBhG,KAAKgG,UAAqC,IAAlBhG,KAAKgG,UAC3CwpI,GAAoBxvI,KAAMmoD,GAChCv2C,YAAau2C,EAEtB,EACD,EAEA/5B,QAAS,WACR,OAAO4hH,GAAUhwI,KAAMgB,UAAW,SAAUmnD,GAC3C,GAAuB,IAAlBnoD,KAAKgG,UAAoC,KAAlBhG,KAAKgG,UAAqC,IAAlBhG,KAAKgG,SAAiB,CACzE,IAAI5E,EAASouI,GAAoBxvI,KAAMmoD,GACvC/mD,EAAOmd,aAAc4pC,EAAM/mD,EAAOuQ,WACnC,CACD,EACD,EAEAq4D,OAAQ,WACP,OAAOgmE,GAAUhwI,KAAMgB,UAAW,SAAUmnD,GACtCnoD,KAAKivB,YACTjvB,KAAKivB,WAAW1Q,aAAc4pC,EAAMnoD,KAEtC,EACD,EAEAujC,MAAO,WACN,OAAOysG,GAAUhwI,KAAMgB,UAAW,SAAUmnD,GACtCnoD,KAAKivB,YACTjvB,KAAKivB,WAAW1Q,aAAc4pC,EAAMnoD,KAAKwvB,YAE3C,EACD,EAEA0e,MAAO,WAIN,IAHA,IAAIia,EACHr3C,EAAI,EAE2B,OAAtBq3C,EAAOnoD,KAAM8Q,IAAeA,IACd,IAAlBq3C,EAAKniD,WAGT4jD,EAAO0mF,UAAWnG,GAAQhiF,GAAM,IAGhCA,EAAKwhC,YAAc,IAIrB,OAAO3pF,IACR,EAEA0yE,MAAO,SAAU69D,EAAeC,GAI/B,OAHAD,EAAiC,MAAjBA,GAAgCA,EAChDC,EAAyC,MAArBA,EAA4BD,EAAgBC,EAEzDxwI,KAAK+C,IAAK,WAChB,OAAO6mD,EAAO8oB,MAAO1yE,KAAMuwI,EAAeC,EAC3C,EACD,EAEA3oH,KAAM,SAAU1mB,GACf,OAAO0lI,GAAQ7mI,KAAM,SAAUmB,GAC9B,IAAIgnD,EAAOnoD,KAAM,IAAO,CAAC,EACxB8Q,EAAI,EACJ+B,EAAI7S,KAAKiB,OAEV,QAAe2C,IAAVzC,GAAyC,IAAlBgnD,EAAKniD,SAChC,OAAOmiD,EAAKn9B,UAIb,GAAsB,iBAAV7pB,IAAuBkuI,GAAalrI,KAAMhD,KACpD8oI,IAAWN,GAASxiI,KAAMhG,IAAW,CAAE,GAAI,KAAQ,GAAI2U,eAAkB,CAE1E3U,EAAQyoD,EAAOohF,cAAe7pI,GAE9B,IACC,KAAQ2P,EAAI+B,EAAG/B,IAIS,KAHvBq3C,EAAOnoD,KAAM8Q,IAAO,CAAC,GAGX9K,WACT4jD,EAAO0mF,UAAWnG,GAAQhiF,GAAM,IAChCA,EAAKn9B,UAAY7pB,GAInBgnD,EAAO,CAGR,CAAE,MAAQ1hD,GAAK,CAChB,CAEK0hD,GACJnoD,KAAKkuC,QAAQ3kB,OAAQpoB,EAEvB,EAAG,KAAMA,EAAOH,UAAUC,OAC3B,EAEA0wB,YAAa,WACZ,IAAIk5G,EAAU,GAGd,OAAOmF,GAAUhwI,KAAMgB,UAAW,SAAUmnD,GAC3C,IAAI7a,EAASttC,KAAKivB,WAEb26B,EAAO4tE,QAASx3H,KAAM6qI,GAAY,IACtCjhF,EAAO0mF,UAAWnG,GAAQnqI,OACrBstC,GACJA,EAAOsjG,aAAczoF,EAAMnoD,MAK9B,EAAG6qI,EACJ,IAGDjhF,EAAOjb,KAAM,CACZkiG,SAAU,SACVC,UAAW,UACXvyH,aAAc,SACd4vB,YAAa,QACb4iG,WAAY,eACV,SAAUzvI,EAAMokH,GAClB97D,EAAOhQ,GAAIt4C,GAAS,SAAU+rC,GAO7B,IANA,IAAIkb,EACHquE,EAAM,GACNoa,EAASpnF,EAAQvc,GACjB4B,EAAO+hG,EAAO/vI,OAAS,EACvB6P,EAAI,EAEGA,GAAKm+B,EAAMn+B,IAClBy3C,EAAQz3C,IAAMm+B,EAAOjvC,KAAOA,KAAK0yE,OAAO,GACxC9oB,EAAQonF,EAAQlgI,IAAO40G,GAAYn9D,GAInC79C,EAAKgE,MAAOkoH,EAAKruE,EAAM/mD,OAGxB,OAAOxB,KAAK22H,UAAWC,EACxB,CACD,GACA,IAAIqa,GAAY,IAAI5uI,OAAQ,KAAOomI,GAAO,kBAAmB,KAEzDyI,GAAc,MAGdC,GAAY,SAAUhpF,GAKxB,IAAI6lF,EAAO7lF,EAAKyvE,cAAc6E,YAM9B,OAJMuR,GAASA,EAAKoD,SACnBpD,EAAOj9H,GAGDi9H,EAAKh9H,iBAAkBm3C,EAC/B,EAEGkpF,GAAO,SAAUlpF,EAAM9yC,EAAS65B,GACnC,IAAI0nF,EAAKt1H,EACRgwI,EAAM,CAAC,EAGR,IAAMhwI,KAAQ+T,EACbi8H,EAAKhwI,GAAS6mD,EAAKhkC,MAAO7iB,GAC1B6mD,EAAKhkC,MAAO7iB,GAAS+T,EAAS/T,GAM/B,IAAMA,KAHNs1H,EAAM1nF,EAASnvC,KAAMooD,GAGP9yC,EACb8yC,EAAKhkC,MAAO7iB,GAASgwI,EAAKhwI,GAG3B,OAAOs1H,CACR,EAGI2a,GAAY,IAAIlvI,OAAQsmI,GAAUllI,KAAM,KAAO,KAiJnD,SAAS+tI,GAAQrpF,EAAM7mD,EAAM4iD,GAC5B,IAAI9rC,EAAO2lD,EAAU58C,EAAUy1G,EAC9B6a,EAAeP,GAAY/sI,KAAM7C,GAMjC6iB,EAAQgkC,EAAKhkC,MAoEd,OAlEA+/B,EAAWA,GAAYitF,GAAWhpF,MAgBjCyuE,EAAM1yE,EAASjpB,iBAAkB35B,IAAU4iD,EAAU5iD,GAEhDmwI,GAAgB7a,IAkBpBA,EAAMA,EAAIzzH,QAAS+0H,EAAU,YAAUt0H,GAG3B,KAARgzH,GAAegS,GAAYzgF,KAC/ByuE,EAAMhtE,EAAOzlC,MAAOgkC,EAAM7mD,KAQrBy0H,EAAQ2b,kBAAoBT,GAAU9sI,KAAMyyH,IAAS2a,GAAUptI,KAAM7C,KAG1E8W,EAAQ+L,EAAM/L,MACd2lD,EAAW55C,EAAM45C,SACjB58C,EAAWgD,EAAMhD,SAGjBgD,EAAM45C,SAAW55C,EAAMhD,SAAWgD,EAAM/L,MAAQw+G,EAChDA,EAAM1yE,EAAS9rC,MAGf+L,EAAM/L,MAAQA,EACd+L,EAAM45C,SAAWA,EACjB55C,EAAMhD,SAAWA,SAIJvd,IAARgzH,EAINA,EAAM,GACNA,CACF,CAGA,SAAS+a,GAAcC,EAAaC,GAGnC,MAAO,CACNrwI,IAAK,WACJ,IAAKowI,IASL,OAAS5xI,KAAKwB,IAAMqwI,GAASnjI,MAAO1O,KAAMgB,kBALlChB,KAAKwB,GAMd,EAEF,EAnPA,WAIC,SAASswI,IAGR,GAAMhqF,EAAN,CAIA9pC,EAAUmG,MAAMe,QAAU,+EAE1B4iC,EAAI3jC,MAAMe,QACT,4HAGD+B,GAAgBrV,YAAaoM,GAAYpM,YAAak2C,GAEtD,IAAIiqF,EAAWhhI,EAAOC,iBAAkB82C,GACxCkqF,EAAoC,OAAjBD,EAASp0H,IAG5Bs0H,EAAsE,KAA9CC,EAAoBH,EAAS77E,YAIrDpO,EAAI3jC,MAAMvG,MAAQ,MAClBu0H,EAA6D,KAAzCD,EAAoBH,EAASn0H,OAIjDw0H,EAAgE,KAAzCF,EAAoBH,EAAS35H,OAMpD0vC,EAAI3jC,MAAMiV,SAAW,WACrBi5G,EAAiE,KAA9CH,EAAoBpqF,EAAInjC,YAAc,GAEzDsC,GAAgBmI,YAAapR,GAI7B8pC,EAAM,IApCN,CAqCD,CAEA,SAASoqF,EAAoBnxD,GAC5B,OAAOt4E,KAAK8H,MAAOD,WAAYywE,GAChC,CAEA,IAAIixD,EAAkBI,EAAsBC,EAAkBF,EAC7DG,EAAyBL,EACzBj0H,EAAY5M,EAASM,cAAe,OACpCo2C,EAAM12C,EAASM,cAAe,OAGzBo2C,EAAI3jC,QAMV2jC,EAAI3jC,MAAMouH,eAAiB,cAC3BzqF,EAAIzpB,WAAW,GAAOla,MAAMouH,eAAiB,GAC7Cxc,EAAQyc,gBAA+C,gBAA7B1qF,EAAI3jC,MAAMouH,eAEpC3oF,EAAOm0B,OAAQg4C,EAAS,CACvB0c,kBAAmB,WAElB,OADAX,IACOM,CACR,EACAV,eAAgB,WAEf,OADAI,IACOK,CACR,EACAO,cAAe,WAEd,OADAZ,IACOE,CACR,EACAW,mBAAoB,WAEnB,OADAb,IACOG,CACR,EACAW,cAAe,WAEd,OADAd,IACOO,CACR,EAWAQ,qBAAsB,WACrB,IAAIjmF,EAAOs9E,EAAI4I,EAASC,EAmCxB,OAlCgC,MAA3BT,IACJ1lF,EAAQx7C,EAASM,cAAe,SAChCw4H,EAAK94H,EAASM,cAAe,MAC7BohI,EAAU1hI,EAASM,cAAe,OAElCk7C,EAAMzoC,MAAMe,QAAU,2DACtBglH,EAAG/lH,MAAMe,QAAU,0CAKnBglH,EAAG/lH,MAAM9L,OAAS,MAClBy6H,EAAQ3uH,MAAM9L,OAAS,MAQvBy6H,EAAQ3uH,MAAMoB,QAAU,QAExB0B,GACErV,YAAag7C,GACbh7C,YAAas4H,GACbt4H,YAAakhI,GAEfC,EAAUhiI,EAAOC,iBAAkBk5H,GACnCoI,EAA4B3uI,SAAUovI,EAAQ16H,OAAQ,IACrD1U,SAAUovI,EAAQjkF,eAAgB,IAClCnrD,SAAUovI,EAAQpjF,kBAAmB,MAAWu6E,EAAGplH,aAEpDmC,GAAgBmI,YAAaw9B,IAEvB0lF,CACR,IAEA,CA1IF,GAsPA,IAAIU,GAAc,CAAE,SAAU,MAAO,MACpCC,GAAa7hI,EAASM,cAAe,OAAQyS,MAC7C+uH,GAAc,CAAC,EAkBhB,SAASC,GAAe7xI,GAGvB,OAFYsoD,EAAOwpF,SAAU9xI,IAAU4xI,GAAa5xI,KAK/CA,KAAQ2xI,GACL3xI,EAED4xI,GAAa5xI,GAxBrB,SAAyBA,GAMxB,IAHA,IAAI+xI,EAAU/xI,EAAM,GAAIwpB,cAAgBxpB,EAAKwL,MAAO,GACnDgE,EAAIkiI,GAAY/xI,OAET6P,KAEP,IADAxP,EAAO0xI,GAAaliI,GAAMuiI,KACbJ,GACZ,OAAO3xI,CAGV,CAY8BgyI,CAAgBhyI,IAAUA,EACxD,CAGA,IAKCiyI,GAAe,4BACfC,GAAU,CAAEp6G,SAAU,WAAYlK,WAAY,SAAU3J,QAAS,SACjEkuH,GAAqB,CACpBz2E,cAAe,IACftO,WAAY,OAGd,SAASglF,GAAmB1c,EAAO71H,EAAOwyI,GAIzC,IAAI93H,EAAU6sH,GAAQvhI,KAAMhG,GAC5B,OAAO0a,EAGNpT,KAAKC,IAAK,EAAGmT,EAAS,IAAQ83H,GAAY,KAAU93H,EAAS,IAAO,MACpE1a,CACF,CAEA,SAASyyI,GAAoBzrF,EAAM0rF,EAAW3jB,EAAKr6D,EAAa7R,EAAQ8vF,GACvE,IAAIhjI,EAAkB,UAAd+iI,EAAwB,EAAI,EACnCE,EAAQ,EACRC,EAAQ,EACRC,EAAc,EAGf,GAAK/jB,KAAUr6D,EAAc,SAAW,WACvC,OAAO,EAGR,KAAQ/kD,EAAI,EAAGA,GAAK,EAKN,WAARo/G,IACJ+jB,GAAerqF,EAAOlF,IAAKyD,EAAM+nE,EAAMyY,GAAW73H,IAAK,EAAMkzC,IAIxD6R,GAmBQ,YAARq6D,IACJ8jB,GAASpqF,EAAOlF,IAAKyD,EAAM,UAAYwgF,GAAW73H,IAAK,EAAMkzC,IAIjD,WAARksE,IACJ8jB,GAASpqF,EAAOlF,IAAKyD,EAAM,SAAWwgF,GAAW73H,GAAM,SAAS,EAAMkzC,MAtBvEgwF,GAASpqF,EAAOlF,IAAKyD,EAAM,UAAYwgF,GAAW73H,IAAK,EAAMkzC,GAGhD,YAARksE,EACJ8jB,GAASpqF,EAAOlF,IAAKyD,EAAM,SAAWwgF,GAAW73H,GAAM,SAAS,EAAMkzC,GAItE+vF,GAASnqF,EAAOlF,IAAKyD,EAAM,SAAWwgF,GAAW73H,GAAM,SAAS,EAAMkzC,IAoCzE,OAhBM6R,GAAei+E,GAAe,IAInCE,GAASvrI,KAAKC,IAAK,EAAGD,KAAKi3C,KAC1ByI,EAAM,SAAW0rF,EAAW,GAAI/oH,cAAgB+oH,EAAU/mI,MAAO,IACjEgnI,EACAE,EACAD,EACA,MAIM,GAGDC,EAAQC,CAChB,CAEA,SAASC,GAAkB/rF,EAAM0rF,EAAWE,GAG3C,IAAI/vF,EAASmtF,GAAWhpF,GAKvB0N,IADmBkgE,EAAQ0c,qBAAuBsB,IAEE,eAAnDnqF,EAAOlF,IAAKyD,EAAM,aAAa,EAAOnE,GACvCmwF,EAAmBt+E,EAEnB6uB,EAAM8sD,GAAQrpF,EAAM0rF,EAAW7vF,GAC/BowF,EAAa,SAAWP,EAAW,GAAI/oH,cAAgB+oH,EAAU/mI,MAAO,GAIzE,GAAKmkI,GAAU9sI,KAAMugF,GAAQ,CAC5B,IAAMqvD,EACL,OAAOrvD,EAERA,EAAM,MACP,CAwCA,QAlCQqxC,EAAQ0c,qBAAuB58E,IAMrCkgE,EAAQ8c,wBAA0B1vH,EAAUglC,EAAM,OAI3C,SAARu8B,IAICp0E,WAAYo0E,IAA0D,WAAjD96B,EAAOlF,IAAKyD,EAAM,WAAW,EAAOnE,KAG1DmE,EAAKksF,iBAAiBpzI,SAEtB40D,EAAiE,eAAnDjM,EAAOlF,IAAKyD,EAAM,aAAa,EAAOnE,IAKpDmwF,EAAmBC,KAAcjsF,KAEhCu8B,EAAMv8B,EAAMisF,MAKd1vD,EAAMp0E,WAAYo0E,IAAS,GAI1BkvD,GACCzrF,EACA0rF,EACAE,IAAWl+E,EAAc,SAAW,WACpCs+E,EACAnwF,EAGA0gC,GAEE,IACL,CAuTA,SAAS4vD,GAAOnsF,EAAM9yC,EAASuyC,EAAM70C,EAAKwhI,GACzC,OAAO,IAAID,GAAMn0I,UAAUwtB,KAAMw6B,EAAM9yC,EAASuyC,EAAM70C,EAAKwhI,EAC5D,CAvTA3qF,EAAOm0B,OAAQ,CAIdy2D,SAAU,CACTh7G,QAAS,CACRh4B,IAAK,SAAU2mD,EAAMjE,GACpB,GAAKA,EAAW,CAGf,IAAI0yE,EAAM4a,GAAQrpF,EAAM,WACxB,MAAe,KAARyuE,EAAa,IAAMA,CAC3B,CACD,IAKFyS,UAAW,CACVoL,yBAAyB,EACzBr1G,aAAa,EACbs1G,kBAAkB,EAClBC,aAAa,EACbj6E,UAAU,EACVC,YAAY,EACZjM,YAAY,EACZkmF,UAAU,EACV/4E,YAAY,EACZC,eAAe,EACfC,iBAAiB,EACjBC,SAAS,EACTC,YAAY,EACZC,cAAc,EACd7Q,YAAY,EACZ7xB,SAAS,EACTykC,OAAO,EACP42E,SAAS,EACTt4H,OAAO,EACPu4H,QAAQ,EACRp0E,QAAQ,EACR9nD,MAAM,EAGNm8H,aAAa,EACbC,cAAc,EACdC,aAAa,EACbC,kBAAkB,EAClBC,eAAe,GAKhB/B,SAAU,CAAC,EAGXjvH,MAAO,SAAUgkC,EAAM7mD,EAAMH,EAAO4yI,GAGnC,GAAM5rF,GAA0B,IAAlBA,EAAKniD,UAAoC,IAAlBmiD,EAAKniD,UAAmBmiD,EAAKhkC,MAAlE,CAKA,IAAIyyG,EAAK32H,EAAMmoI,EACdgN,EAAW9N,GAAWhmI,GACtBmwI,EAAeP,GAAY/sI,KAAM7C,GACjC6iB,EAAQgkC,EAAKhkC,MAad,GARMstH,IACLnwI,EAAO6xI,GAAeiC,IAIvBhN,EAAQx+E,EAAO4qF,SAAUlzI,IAAUsoD,EAAO4qF,SAAUY,QAGrCxxI,IAAVzC,EA0CJ,OAAKinI,GAAS,QAASA,QACwBxkI,KAA5CgzH,EAAMwR,EAAM5mI,IAAK2mD,GAAM,EAAO4rF,IAEzBnd,EAIDzyG,EAAO7iB,GA7CA,WAHdrB,SAAckB,KAGcy1H,EAAM8R,GAAQvhI,KAAMhG,KAAay1H,EAAK,KACjEz1H,EAAQ6nI,GAAW7gF,EAAM7mD,EAAMs1H,GAG/B32H,EAAO,UAIM,MAATkB,GAAiBA,GAAUA,IAOlB,WAATlB,GAAsBwxI,IAC1BtwI,GAASy1H,GAAOA,EAAK,KAAShtE,EAAOy/E,UAAW+L,GAAa,GAAK,OAI7Drf,EAAQyc,iBAA6B,KAAVrxI,GAAiD,IAAjCG,EAAK4P,QAAS,gBAC9DiT,EAAO7iB,GAAS,WAIX8mI,GAAY,QAASA,QACsBxkI,KAA9CzC,EAAQinI,EAAM3+H,IAAK0+C,EAAMhnD,EAAO4yI,MAE7BtC,EACJttH,EAAMa,YAAa1jB,EAAMH,GAEzBgjB,EAAO7iB,GAASH,GAtDnB,CAsED,EAEAujD,IAAK,SAAUyD,EAAM7mD,EAAMyyI,EAAO/vF,GACjC,IAAI0gC,EAAK78B,EAAKugF,EACbgN,EAAW9N,GAAWhmI,GA6BvB,OA5BgB4vI,GAAY/sI,KAAM7C,KAMjCA,EAAO6xI,GAAeiC,KAIvBhN,EAAQx+E,EAAO4qF,SAAUlzI,IAAUsoD,EAAO4qF,SAAUY,KAGtC,QAAShN,IACtB1jD,EAAM0jD,EAAM5mI,IAAK2mD,GAAM,EAAM4rF,SAIjBnwI,IAAR8gF,IACJA,EAAM8sD,GAAQrpF,EAAM7mD,EAAM0iD,IAId,WAAR0gC,GAAoBpjF,KAAQmyI,KAChC/uD,EAAM+uD,GAAoBnyI,IAIZ,KAAVyyI,GAAgBA,GACpBlsF,EAAMv3C,WAAYo0E,IACD,IAAVqvD,GAAkB3uF,SAAUyC,GAAQA,GAAO,EAAI68B,GAGhDA,CACR,IAGD96B,EAAOjb,KAAM,CAAE,SAAU,SAAW,SAAUqpF,EAAI6b,GACjDjqF,EAAO4qF,SAAUX,GAAc,CAC9BryI,IAAK,SAAU2mD,EAAMjE,EAAU6vF,GAC9B,GAAK7vF,EAIJ,OAAOqvF,GAAapvI,KAAMylD,EAAOlF,IAAKyD,EAAM,aAQxCA,EAAKksF,iBAAiBpzI,QAAWknD,EAAKjpC,wBAAwB9G,MAIjE87H,GAAkB/rF,EAAM0rF,EAAWE,GAHnC1C,GAAMlpF,EAAMqrF,GAAS,WACpB,OAAOU,GAAkB/rF,EAAM0rF,EAAWE,EAC3C,EAGH,EAEAtqI,IAAK,SAAU0+C,EAAMhnD,EAAO4yI,GAC3B,IAAIl4H,EACHmoC,EAASmtF,GAAWhpF,GAIpBktF,GAAsBtf,EAAQ6c,iBACT,aAApB5uF,EAAO5qB,SAIRy8B,GADkBw/E,GAAsBtB,IAEY,eAAnDnqF,EAAOlF,IAAKyD,EAAM,aAAa,EAAOnE,GACvC2vF,EAAWI,EACVH,GACCzrF,EACA0rF,EACAE,EACAl+E,EACA7R,GAED,EAqBF,OAjBK6R,GAAew/E,IACnB1B,GAAYlrI,KAAKi3C,KAChByI,EAAM,SAAW0rF,EAAW,GAAI/oH,cAAgB+oH,EAAU/mI,MAAO,IACjEwD,WAAY0zC,EAAQ6vF,IACpBD,GAAoBzrF,EAAM0rF,EAAW,UAAU,EAAO7vF,GACtD,KAKG2vF,IAAc93H,EAAU6sH,GAAQvhI,KAAMhG,KACb,QAA3B0a,EAAS,IAAO,QAElBssC,EAAKhkC,MAAO0vH,GAAc1yI,EAC1BA,EAAQyoD,EAAOlF,IAAKyD,EAAM0rF,IAGpBH,GAAmBvrF,EAAMhnD,EAAOwyI,EACxC,EAEF,GAEA/pF,EAAO4qF,SAASt+E,WAAay7E,GAAc5b,EAAQ4c,mBAClD,SAAUxqF,EAAMjE,GACf,GAAKA,EACJ,OAAS5zC,WAAYkhI,GAAQrpF,EAAM,gBAClCA,EAAKjpC,wBAAwBpB,KAC5BuzH,GAAMlpF,EAAM,CAAE+N,WAAY,GAAK,WAC9B,OAAO/N,EAAKjpC,wBAAwBpB,IACrC,IACE,IAEN,GAID8rC,EAAOjb,KAAM,CACZgvB,OAAQ,GACRnO,QAAS,GACT8lF,OAAQ,SACN,SAAU/yF,EAAQgzF,GACpB3rF,EAAO4qF,SAAUjyF,EAASgzF,GAAW,CACpCC,OAAQ,SAAUr0I,GAOjB,IANA,IAAI2P,EAAI,EACPymD,EAAW,CAAC,EAGZ1F,EAAyB,iBAAV1wD,EAAqBA,EAAM0Q,MAAO,KAAQ,CAAE1Q,GAEpD2P,EAAI,EAAGA,IACdymD,EAAUhV,EAASomF,GAAW73H,GAAMykI,GACnC1jF,EAAO/gD,IAAO+gD,EAAO/gD,EAAI,IAAO+gD,EAAO,GAGzC,OAAO0F,CACR,GAGe,WAAXhV,IACJqH,EAAO4qF,SAAUjyF,EAASgzF,GAAS9rI,IAAMiqI,GAE3C,GAEA9pF,EAAOhQ,GAAGmkC,OAAQ,CACjBr5B,IAAK,SAAUpjD,EAAMH,GACpB,OAAO0lI,GAAQ7mI,KAAM,SAAUmoD,EAAM7mD,EAAMH,GAC1C,IAAI6iD,EAAQrX,EACX5pC,EAAM,CAAC,EACP+N,EAAI,EAEL,GAAKpM,MAAM+H,QAASnL,GAAS,CAI5B,IAHA0iD,EAASmtF,GAAWhpF,GACpBxb,EAAMrrC,EAAKL,OAEH6P,EAAI67B,EAAK77B,IAChB/N,EAAKzB,EAAMwP,IAAQ84C,EAAOlF,IAAKyD,EAAM7mD,EAAMwP,IAAK,EAAOkzC,GAGxD,OAAOjhD,CACR,CAEA,YAAiBa,IAAVzC,EACNyoD,EAAOzlC,MAAOgkC,EAAM7mD,EAAMH,GAC1ByoD,EAAOlF,IAAKyD,EAAM7mD,EACpB,EAAGA,EAAMH,EAAOH,UAAUC,OAAS,EACpC,IAOD2oD,EAAO0qF,MAAQA,GAEfA,GAAMn0I,UAAY,CACjBE,YAAai0I,GACb3mH,KAAM,SAAUw6B,EAAM9yC,EAASuyC,EAAM70C,EAAKwhI,EAAQ9zD,GACjDzgF,KAAKmoD,KAAOA,EACZnoD,KAAK4nD,KAAOA,EACZ5nD,KAAKu0I,OAASA,GAAU3qF,EAAO2qF,OAAO5+F,SACtC31C,KAAKqV,QAAUA,EACfrV,KAAK4P,MAAQ5P,KAAK6I,IAAM7I,KAAKmjI,MAC7BnjI,KAAK+S,IAAMA,EACX/S,KAAKygF,KAAOA,IAAU72B,EAAOy/E,UAAWzhF,GAAS,GAAK,KACvD,EACAu7E,IAAK,WACJ,IAAIiF,EAAQkM,GAAMmB,UAAWz1I,KAAK4nD,MAElC,OAAOwgF,GAASA,EAAM5mI,IACrB4mI,EAAM5mI,IAAKxB,MACXs0I,GAAMmB,UAAU9/F,SAASn0C,IAAKxB,KAChC,EACA01I,IAAK,SAAUC,GACd,IAAIC,EACHxN,EAAQkM,GAAMmB,UAAWz1I,KAAK4nD,MAoB/B,OAlBK5nD,KAAKqV,QAAQuwF,SACjB5lG,KAAKyoB,IAAMmtH,EAAQhsF,EAAO2qF,OAAQv0I,KAAKu0I,QACtCoB,EAAS31I,KAAKqV,QAAQuwF,SAAW+vC,EAAS,EAAG,EAAG31I,KAAKqV,QAAQuwF,UAG9D5lG,KAAKyoB,IAAMmtH,EAAQD,EAEpB31I,KAAK6I,KAAQ7I,KAAK+S,IAAM/S,KAAK4P,OAAUgmI,EAAQ51I,KAAK4P,MAE/C5P,KAAKqV,QAAQqlC,MACjB16C,KAAKqV,QAAQqlC,KAAK36C,KAAMC,KAAKmoD,KAAMnoD,KAAK6I,IAAK7I,MAGzCooI,GAASA,EAAM3+H,IACnB2+H,EAAM3+H,IAAKzJ,MAEXs0I,GAAMmB,UAAU9/F,SAASlsC,IAAKzJ,MAExBA,IACR,GAGDs0I,GAAMn0I,UAAUwtB,KAAKxtB,UAAYm0I,GAAMn0I,UAEvCm0I,GAAMmB,UAAY,CACjB9/F,SAAU,CACTn0C,IAAK,SAAUiiE,GACd,IAAIt6D,EAIJ,OAA6B,IAAxBs6D,EAAMtb,KAAKniD,UACa,MAA5By9D,EAAMtb,KAAMsb,EAAM7b,OAAoD,MAAlC6b,EAAMtb,KAAKhkC,MAAOs/C,EAAM7b,MACrD6b,EAAMtb,KAAMsb,EAAM7b,OAO1Bz+C,EAASygD,EAAOlF,IAAK+e,EAAMtb,KAAMsb,EAAM7b,KAAM,MAGhB,SAAXz+C,EAAwBA,EAAJ,CACvC,EACAM,IAAK,SAAUg6D,GAKT7Z,EAAOisF,GAAGn7F,KAAM+oB,EAAM7b,MAC1BgC,EAAOisF,GAAGn7F,KAAM+oB,EAAM7b,MAAQ6b,GACK,IAAxBA,EAAMtb,KAAKniD,WACtB4jD,EAAO4qF,SAAU/wE,EAAM7b,OAC6B,MAAnD6b,EAAMtb,KAAKhkC,MAAOgvH,GAAe1vE,EAAM7b,OAGxC6b,EAAMtb,KAAMsb,EAAM7b,MAAS6b,EAAM56D,IAFjC+gD,EAAOzlC,MAAOs/C,EAAMtb,KAAMsb,EAAM7b,KAAM6b,EAAM56D,IAAM46D,EAAMgd,KAI1D,IAMF6zD,GAAMmB,UAAUziH,UAAYshH,GAAMmB,UAAUviH,WAAa,CACxDzpB,IAAK,SAAUg6D,GACTA,EAAMtb,KAAKniD,UAAYy9D,EAAMtb,KAAKl5B,aACtCw0C,EAAMtb,KAAMsb,EAAM7b,MAAS6b,EAAM56D,IAEnC,GAGD+gD,EAAO2qF,OAAS,CACfr0E,OAAQ,SAAU7gE,GACjB,OAAOA,CACR,EACAy2I,MAAO,SAAUz2I,GAChB,MAAO,GAAMoJ,KAAKstI,IAAK12I,EAAIoJ,KAAK4T,IAAO,CACxC,EACAs5B,SAAU,SAGXiU,EAAOisF,GAAKvB,GAAMn0I,UAAUwtB,KAG5Bi8B,EAAOisF,GAAGn7F,KAAO,CAAC,EAKlB,IACCs7F,GAAOC,GACPC,GAAW,yBACXC,GAAO,cAER,SAASC,KACHH,MACqB,IAApB7kI,EAAS8yB,QAAoBnzB,EAAO8P,sBACxC9P,EAAO8P,sBAAuBu1H,IAE9BrlI,EAAOwO,WAAY62H,GAAUxsF,EAAOisF,GAAGQ,UAGxCzsF,EAAOisF,GAAGz0D,OAEZ,CAGA,SAASk1D,KAIR,OAHAvlI,EAAOwO,WAAY,WAClBy2H,QAAQpyI,CACT,GACSoyI,GAAQptI,KAAKC,KACvB,CAGA,SAAS0tI,GAAOt2I,EAAMu2I,GACrB,IAAI/H,EACH39H,EAAI,EACJm3H,EAAQ,CAAE5vH,OAAQpY,GAKnB,IADAu2I,EAAeA,EAAe,EAAI,EAC1B1lI,EAAI,EAAGA,GAAK,EAAI0lI,EAEvBvO,EAAO,UADPwG,EAAQ9F,GAAW73H,KACSm3H,EAAO,UAAYwG,GAAUxuI,EAO1D,OAJKu2I,IACJvO,EAAMzuG,QAAUyuG,EAAM7vH,MAAQnY,GAGxBgoI,CACR,CAEA,SAASwO,GAAat1I,EAAOymD,EAAMkP,GAKlC,IAJA,IAAI2M,EACH4L,GAAeqnE,GAAUC,SAAU/uF,IAAU,IAAKpH,OAAQk2F,GAAUC,SAAU,MAC9ErtI,EAAQ,EACRrI,EAASouE,EAAWpuE,OACbqI,EAAQrI,EAAQqI,IACvB,GAAOm6D,EAAQ4L,EAAY/lE,GAAQvJ,KAAM+2D,EAAWlP,EAAMzmD,GAGzD,OAAOsiE,CAGV,CAmNA,SAASizE,GAAWvuF,EAAMyuF,EAAYvhI,GACrC,IAAIlM,EACHqqE,EACAlqE,EAAQ,EACRrI,EAASy1I,GAAUG,WAAW51I,OAC9B8jI,EAAWn7E,EAAOg7E,WAAWE,OAAQ,kBAG7B1jD,EAAKj5B,IACb,GACAi5B,EAAO,WACN,GAAK5N,EACJ,OAAO,EAYR,IAVA,IAAIsjE,EAAcd,IAASM,KAC1B7nI,EAAYhG,KAAKC,IAAK,EAAGouD,EAAUigF,UAAYjgF,EAAU8uC,SAAWkxC,GAKpEnB,EAAU,GADHlnI,EAAYqoD,EAAU8uC,UAAY,GAEzCt8F,EAAQ,EACRrI,EAAS61D,EAAUkgF,OAAO/1I,OAEnBqI,EAAQrI,EAAQqI,IACvBwtD,EAAUkgF,OAAQ1tI,GAAQosI,IAAKC,GAMhC,OAHA5Q,EAASU,WAAYt9E,EAAM,CAAE2O,EAAW6+E,EAASlnI,IAG5CknI,EAAU,GAAK10I,EACZwN,GAIFxN,GACL8jI,EAASU,WAAYt9E,EAAM,CAAE2O,EAAW,EAAG,IAI5CiuE,EAASW,YAAav9E,EAAM,CAAE2O,KACvB,EACR,EACAA,EAAYiuE,EAAS7rF,QAAS,CAC7BiP,KAAMA,EACNt8C,MAAO+9C,EAAOm0B,OAAQ,CAAC,EAAG64D,GAC1B/2I,KAAM+pD,EAAOm0B,QAAQ,EAAM,CAC1Bk5D,cAAe,CAAC,EAChB1C,OAAQ3qF,EAAO2qF,OAAO5+F,UACpBtgC,GACH6hI,mBAAoBN,EACpBO,gBAAiB9hI,EACjB0hI,UAAWf,IAASM,KACpB1wC,SAAUvwF,EAAQuwF,SAClBoxC,OAAQ,GACRP,YAAa,SAAU7uF,EAAM70C,GAC5B,IAAI0wD,EAAQ7Z,EAAO0qF,MAAOnsF,EAAM2O,EAAUj3D,KAAM+nD,EAAM70C,EACrD+jD,EAAUj3D,KAAKo3I,cAAervF,IAAUkP,EAAUj3D,KAAK00I,QAExD,OADAz9E,EAAUkgF,OAAOtsI,KAAM+4D,GAChBA,CACR,EACAhvD,KAAM,SAAU2iI,GACf,IAAI9tI,EAAQ,EAIXrI,EAASm2I,EAAUtgF,EAAUkgF,OAAO/1I,OAAS,EAC9C,GAAKuyE,EACJ,OAAOxzE,KAGR,IADAwzE,GAAU,EACFlqE,EAAQrI,EAAQqI,IACvBwtD,EAAUkgF,OAAQ1tI,GAAQosI,IAAK,GAUhC,OANK0B,GACJrS,EAASU,WAAYt9E,EAAM,CAAE2O,EAAW,EAAG,IAC3CiuE,EAASW,YAAav9E,EAAM,CAAE2O,EAAWsgF,KAEzCrS,EAASa,WAAYz9E,EAAM,CAAE2O,EAAWsgF,IAElCp3I,IACR,IAED6L,EAAQirD,EAAUjrD,MAInB,IA/HD,SAAqBA,EAAOorI,GAC3B,IAAI3tI,EAAOhI,EAAMizI,EAAQpzI,EAAOinI,EAGhC,IAAM9+H,KAASuC,EAed,GAbA0oI,EAAS0C,EADT31I,EAAOgmI,GAAWh+H,IAElBnI,EAAQ0K,EAAOvC,GACV5E,MAAM+H,QAAStL,KACnBozI,EAASpzI,EAAO,GAChBA,EAAQ0K,EAAOvC,GAAUnI,EAAO,IAG5BmI,IAAUhI,IACduK,EAAOvK,GAASH,SACT0K,EAAOvC,KAGf8+H,EAAQx+E,EAAO4qF,SAAUlzI,KACX,WAAY8mI,EAMzB,IAAM9+H,KALNnI,EAAQinI,EAAMoN,OAAQr0I,UACf0K,EAAOvK,GAICH,EACNmI,KAASuC,IAChBA,EAAOvC,GAAUnI,EAAOmI,GACxB2tI,EAAe3tI,GAAUirI,QAI3B0C,EAAe31I,GAASizI,CAG3B,CA0FC8C,CAAYxrI,EAAOirD,EAAUj3D,KAAKo3I,eAE1B3tI,EAAQrI,EAAQqI,IAEvB,GADAH,EAASutI,GAAUG,WAAYvtI,GAAQvJ,KAAM+2D,EAAW3O,EAAMt8C,EAAOirD,EAAUj3D,MAM9E,OAJK4N,EAAYtE,EAAOsL,QACvBm1C,EAAOy+E,YAAavxE,EAAU3O,KAAM2O,EAAUj3D,KAAKwnE,OAAQ5yD,KAC1DtL,EAAOsL,KAAKrB,KAAMjK,IAEbA,EAyBT,OArBAygD,EAAO7mD,IAAK8I,EAAO4qI,GAAa3/E,GAE3BrpD,EAAYqpD,EAAUj3D,KAAK+P,QAC/BknD,EAAUj3D,KAAK+P,MAAM7P,KAAMooD,EAAM2O,GAIlCA,EACE+C,SAAU/C,EAAUj3D,KAAKg6D,UACzB5/B,KAAM68B,EAAUj3D,KAAKo6B,KAAM68B,EAAUj3D,KAAKsd,UAC1C07B,KAAMie,EAAUj3D,KAAKg5C,MACrBisF,OAAQhuE,EAAUj3D,KAAKilI,QAEzBl7E,EAAOisF,GAAGz0G,MACTwoB,EAAOm0B,OAAQqD,EAAM,CACpBj5B,KAAMA,EACNmvF,KAAMxgF,EACNuQ,MAAOvQ,EAAUj3D,KAAKwnE,SAIjBvQ,CACR,CAEAlN,EAAO8sF,UAAY9sF,EAAOm0B,OAAQ24D,GAAW,CAE5CC,SAAU,CACT,IAAK,CAAE,SAAU/uF,EAAMzmD,GACtB,IAAIsiE,EAAQzjE,KAAKy2I,YAAa7uF,EAAMzmD,GAEpC,OADA6nI,GAAWvlE,EAAMtb,KAAMP,EAAM8gF,GAAQvhI,KAAMhG,GAASsiE,GAC7CA,CACR,IAGD8zE,QAAS,SAAU1rI,EAAOqjC,GACpBzhC,EAAY5B,IAChBqjC,EAAWrjC,EACXA,EAAQ,CAAE,MAEVA,EAAQA,EAAMnI,MAAOkgI,GAOtB,IAJA,IAAIh8E,EACHt+C,EAAQ,EACRrI,EAAS4K,EAAM5K,OAERqI,EAAQrI,EAAQqI,IACvBs+C,EAAO/7C,EAAOvC,GACdotI,GAAUC,SAAU/uF,GAAS8uF,GAAUC,SAAU/uF,IAAU,GAC3D8uF,GAAUC,SAAU/uF,GAAOra,QAAS2B,EAEtC,EAEA2nG,WAAY,CA3Wb,SAA2B1uF,EAAMt8C,EAAOhM,GACvC,IAAI+nD,EAAMzmD,EAAO6Q,EAAQo2H,EAAOoP,EAASC,EAAWC,EAAgBnyH,EACnEoyH,EAAQ,UAAW9rI,GAAS,WAAYA,EACxCyrI,EAAOt3I,KACPmvI,EAAO,CAAC,EACRhrH,EAAQgkC,EAAKhkC,MACb+f,EAASikB,EAAKniD,UAAY+iI,GAAoB5gF,GAC9CyvF,EAAWjQ,GAASnmI,IAAK2mD,EAAM,UA6BhC,IAAMP,KA1BA/nD,EAAKwnE,QAEa,OADvB+gE,EAAQx+E,EAAOy+E,YAAalgF,EAAM,OACvB0vF,WACVzP,EAAMyP,SAAW,EACjBL,EAAUpP,EAAMl6F,MAAMslF,KACtB4U,EAAMl6F,MAAMslF,KAAO,WACZ4U,EAAMyP,UACXL,GAEF,GAEDpP,EAAMyP,WAENP,EAAKxS,OAAQ,WAGZwS,EAAKxS,OAAQ,WACZsD,EAAMyP,WACAjuF,EAAOyd,MAAOlf,EAAM,MAAOlnD,QAChCmnI,EAAMl6F,MAAMslF,MAEd,EACD,IAIa3nH,EAEb,GADA1K,EAAQ0K,EAAO+7C,GACVsuF,GAAS/xI,KAAMhD,GAAU,CAG7B,UAFO0K,EAAO+7C,GACd51C,EAASA,GAAoB,WAAV7Q,EACdA,KAAY+iC,EAAS,OAAS,QAAW,CAI7C,GAAe,SAAV/iC,IAAoBy2I,QAAiCh0I,IAArBg0I,EAAUhwF,GAK9C,SAJA1jB,GAAS,CAMX,CACAirG,EAAMvnF,GAASgwF,GAAYA,EAAUhwF,IAAUgC,EAAOzlC,MAAOgkC,EAAMP,EACpE,CAKD,IADA6vF,GAAa7tF,EAAOytE,cAAexrH,MAChB+9C,EAAOytE,cAAe8X,GA8DzC,IAAMvnF,KAzDD+vF,GAA2B,IAAlBxvF,EAAKniD,WAMlBnG,EAAK05B,SAAW,CAAEpV,EAAMoV,SAAUpV,EAAMmrC,UAAWnrC,EAAMlT,WAIlC,OADvBymI,EAAiBE,GAAYA,EAASryH,WAErCmyH,EAAiB/P,GAASnmI,IAAK2mD,EAAM,YAGrB,UADjB5iC,EAAUqkC,EAAOlF,IAAKyD,EAAM,cAEtBuvF,EACJnyH,EAAUmyH,GAIVjO,GAAU,CAAEthF,IAAQ,GACpBuvF,EAAiBvvF,EAAKhkC,MAAMoB,SAAWmyH,EACvCnyH,EAAUqkC,EAAOlF,IAAKyD,EAAM,WAC5BshF,GAAU,CAAEthF,OAKG,WAAZ5iC,GAAoC,iBAAZA,GAAgD,MAAlBmyH,IACrB,SAAhC9tF,EAAOlF,IAAKyD,EAAM,WAGhBsvF,IACLH,EAAKr9G,KAAM,WACV9V,EAAMoB,QAAUmyH,CACjB,GACuB,MAAlBA,IACJnyH,EAAUpB,EAAMoB,QAChBmyH,EAA6B,SAAZnyH,EAAqB,GAAKA,IAG7CpB,EAAMoB,QAAU,iBAKd1lB,EAAK05B,WACTpV,EAAMoV,SAAW,SACjB+9G,EAAKxS,OAAQ,WACZ3gH,EAAMoV,SAAW15B,EAAK05B,SAAU,GAChCpV,EAAMmrC,UAAYzvD,EAAK05B,SAAU,GACjCpV,EAAMlT,UAAYpR,EAAK05B,SAAU,EAClC,IAIDk+G,GAAY,EACEtI,EAGPsI,IACAG,EACC,WAAYA,IAChB1zG,EAAS0zG,EAAS1zG,QAGnB0zG,EAAWjQ,GAASd,OAAQ1+E,EAAM,SAAU,CAAE5iC,QAASmyH,IAInD1lI,IACJ4lI,EAAS1zG,QAAUA,GAIfA,GACJulG,GAAU,CAAEthF,IAAQ,GAKrBmvF,EAAKr9G,KAAM,WASV,IAAM2tB,KAJA1jB,GACLulG,GAAU,CAAEthF,IAEbw/E,GAAShtH,OAAQwtC,EAAM,UACTgnF,EACbvlF,EAAOzlC,MAAOgkC,EAAMP,EAAMunF,EAAMvnF,GAElC,IAID6vF,EAAYhB,GAAavyG,EAAS0zG,EAAUhwF,GAAS,EAAGA,EAAM0vF,GACtD1vF,KAAQgwF,IACfA,EAAUhwF,GAAS6vF,EAAU7nI,MACxBs0B,IACJuzG,EAAU1kI,IAAM0kI,EAAU7nI,MAC1B6nI,EAAU7nI,MAAQ,GAItB,GAmMCkoI,UAAW,SAAU5oG,EAAU9gB,GACzBA,EACJsoH,GAAUG,WAAWtpG,QAAS2B,GAE9BwnG,GAAUG,WAAWnsI,KAAMwkC,EAE7B,IAGD0a,EAAOmuF,MAAQ,SAAUA,EAAOxD,EAAQ36F,GACvC,IAAIo+F,EAAMD,GAA0B,iBAAVA,EAAqBnuF,EAAOm0B,OAAQ,CAAC,EAAGg6D,GAAU,CAC3E56H,SAAUy8B,IAAOA,GAAM26F,GACtB9mI,EAAYsqI,IAAWA,EACxBnyC,SAAUmyC,EACVxD,OAAQ36F,GAAM26F,GAAUA,IAAW9mI,EAAY8mI,IAAYA,GAoC5D,OAhCK3qF,EAAOisF,GAAG3/H,IACd8hI,EAAIpyC,SAAW,EAGc,iBAAjBoyC,EAAIpyC,WACVoyC,EAAIpyC,YAAYh8C,EAAOisF,GAAGoC,OAC9BD,EAAIpyC,SAAWh8C,EAAOisF,GAAGoC,OAAQD,EAAIpyC,UAGrCoyC,EAAIpyC,SAAWh8C,EAAOisF,GAAGoC,OAAOtiG,UAMjB,MAAbqiG,EAAI3wE,QAA+B,IAAd2wE,EAAI3wE,QAC7B2wE,EAAI3wE,MAAQ,MAIb2wE,EAAI1G,IAAM0G,EAAI76H,SAEd66H,EAAI76H,SAAW,WACT1P,EAAYuqI,EAAI1G,MACpB0G,EAAI1G,IAAIvxI,KAAMC,MAGVg4I,EAAI3wE,OACRzd,EAAOs+E,QAASloI,KAAMg4I,EAAI3wE,MAE5B,EAEO2wE,CACR,EAEApuF,EAAOhQ,GAAGmkC,OAAQ,CACjBm6D,OAAQ,SAAUH,EAAOj7E,EAAIy3E,EAAQrlG,GAGpC,OAAOlvC,KAAK8D,OAAQilI,IAAqBrkF,IAAK,UAAW,GAAIpgB,OAG3DvxB,MAAMwN,QAAS,CAAEiZ,QAASsjC,GAAMi7E,EAAOxD,EAAQrlG,EAClD,EACA3uB,QAAS,SAAUqnC,EAAMmwF,EAAOxD,EAAQrlG,GACvC,IAAIhB,EAAQ0b,EAAOytE,cAAezvE,GACjCuwF,EAASvuF,EAAOmuF,MAAOA,EAAOxD,EAAQrlG,GACtCkpG,EAAc,WAGb,IAAId,EAAOZ,GAAW12I,KAAM4pD,EAAOm0B,OAAQ,CAAC,EAAGn2B,GAAQuwF,IAGlDjqG,GAASy5F,GAASnmI,IAAKxB,KAAM,YACjCs3I,EAAK7iI,MAAM,EAEb,EAID,OAFA2jI,EAAYC,OAASD,EAEdlqG,IAA0B,IAAjBiqG,EAAO9wE,MACtBrnE,KAAK2uC,KAAMypG,GACXp4I,KAAKqnE,MAAO8wE,EAAO9wE,MAAO+wE,EAC5B,EACA3jI,KAAM,SAAUxU,EAAMqoI,EAAY8O,GACjC,IAAIkB,EAAY,SAAUlQ,GACzB,IAAI3zH,EAAO2zH,EAAM3zH,YACV2zH,EAAM3zH,KACbA,EAAM2iI,EACP,EAWA,MATqB,iBAATn3I,IACXm3I,EAAU9O,EACVA,EAAaroI,EACbA,OAAO2D,GAEH0kI,GACJtoI,KAAKqnE,MAAOpnE,GAAQ,KAAM,IAGpBD,KAAK2uC,KAAM,WACjB,IAAIu5F,GAAU,EACb5+H,EAAgB,MAARrJ,GAAgBA,EAAO,aAC/Bs4I,EAAS3uF,EAAO2uF,OAChB1uI,EAAO89H,GAASnmI,IAAKxB,MAEtB,GAAKsJ,EACCO,EAAMP,IAAWO,EAAMP,GAAQmL,MACnC6jI,EAAWzuI,EAAMP,SAGlB,IAAMA,KAASO,EACTA,EAAMP,IAAWO,EAAMP,GAAQmL,MAAQ0hI,GAAKhyI,KAAMmF,IACtDgvI,EAAWzuI,EAAMP,IAKpB,IAAMA,EAAQivI,EAAOt3I,OAAQqI,KACvBivI,EAAQjvI,GAAQ6+C,OAASnoD,MACnB,MAARC,GAAgBs4I,EAAQjvI,GAAQ+9D,QAAUpnE,IAE5Cs4I,EAAQjvI,GAAQguI,KAAK7iI,KAAM2iI,GAC3BlP,GAAU,EACVqQ,EAAOrwI,OAAQoB,EAAO,KAOnB4+H,GAAYkP,GAChBxtF,EAAOs+E,QAASloI,KAAMC,EAExB,EACD,EACAo4I,OAAQ,SAAUp4I,GAIjB,OAHc,IAATA,IACJA,EAAOA,GAAQ,MAETD,KAAK2uC,KAAM,WACjB,IAAIrlC,EACHO,EAAO89H,GAASnmI,IAAKxB,MACrBqnE,EAAQx9D,EAAM5J,EAAO,SACrBmoI,EAAQv+H,EAAM5J,EAAO,cACrBs4I,EAAS3uF,EAAO2uF,OAChBt3I,EAASomE,EAAQA,EAAMpmE,OAAS,EAajC,IAVA4I,EAAKwuI,QAAS,EAGdzuF,EAAOyd,MAAOrnE,KAAMC,EAAM,IAErBmoI,GAASA,EAAM3zH,MACnB2zH,EAAM3zH,KAAK1U,KAAMC,MAAM,GAIlBsJ,EAAQivI,EAAOt3I,OAAQqI,KACvBivI,EAAQjvI,GAAQ6+C,OAASnoD,MAAQu4I,EAAQjvI,GAAQ+9D,QAAUpnE,IAC/Ds4I,EAAQjvI,GAAQguI,KAAK7iI,MAAM,GAC3B8jI,EAAOrwI,OAAQoB,EAAO,IAKxB,IAAMA,EAAQ,EAAGA,EAAQrI,EAAQqI,IAC3B+9D,EAAO/9D,IAAW+9D,EAAO/9D,GAAQ+uI,QACrChxE,EAAO/9D,GAAQ+uI,OAAOt4I,KAAMC,aAKvB6J,EAAKwuI,MACb,EACD,IAGDzuF,EAAOjb,KAAM,CAAE,SAAU,OAAQ,QAAU,SAAUqpF,EAAI12H,GACxD,IAAIk3I,EAAQ5uF,EAAOhQ,GAAIt4C,GACvBsoD,EAAOhQ,GAAIt4C,GAAS,SAAUy2I,EAAOxD,EAAQrlG,GAC5C,OAAgB,MAAT6oG,GAAkC,kBAAVA,EAC9BS,EAAM9pI,MAAO1O,KAAMgB,WACnBhB,KAAKugB,QAASg2H,GAAOj1I,GAAM,GAAQy2I,EAAOxD,EAAQrlG,EACpD,CACD,GAGA0a,EAAOjb,KAAM,CACZ8pG,UAAWlC,GAAO,QAClBmC,QAASnC,GAAO,QAChBoC,YAAapC,GAAO,UACpBqC,OAAQ,CAAEp/G,QAAS,QACnBq/G,QAAS,CAAEr/G,QAAS,QACpBs/G,WAAY,CAAEt/G,QAAS,WACrB,SAAUl4B,EAAMuK,GAClB+9C,EAAOhQ,GAAIt4C,GAAS,SAAUy2I,EAAOxD,EAAQrlG,GAC5C,OAAOlvC,KAAKugB,QAAS1U,EAAOksI,EAAOxD,EAAQrlG,EAC5C,CACD,GAEA0a,EAAO2uF,OAAS,GAChB3uF,EAAOisF,GAAGz0D,KAAO,WAChB,IAAIhgD,EACHtwB,EAAI,EACJynI,EAAS3uF,EAAO2uF,OAIjB,IAFAvC,GAAQptI,KAAKC,MAELiI,EAAIynI,EAAOt3I,OAAQ6P,KAC1BswB,EAAQm3G,EAAQznI,OAGCynI,EAAQznI,KAAQswB,GAChCm3G,EAAOrwI,OAAQ4I,IAAK,GAIhBynI,EAAOt3I,QACZ2oD,EAAOisF,GAAGphI,OAEXuhI,QAAQpyI,CACT,EAEAgmD,EAAOisF,GAAGz0G,MAAQ,SAAUA,GAC3BwoB,EAAO2uF,OAAO7tI,KAAM02B,GACpBwoB,EAAOisF,GAAGjmI,OACX,EAEAg6C,EAAOisF,GAAGQ,SAAW,GACrBzsF,EAAOisF,GAAGjmI,MAAQ,WACZqmI,KAILA,IAAa,EACbG,KACD,EAEAxsF,EAAOisF,GAAGphI,KAAO,WAChBwhI,GAAa,IACd,EAEArsF,EAAOisF,GAAGoC,OAAS,CAClBc,KAAM,IACNC,KAAM,IAGNrjG,SAAU,KAKXiU,EAAOhQ,GAAG4sD,MAAQ,SAAU7zF,EAAM1S,GAIjC,OAHA0S,EAAOi3C,EAAOisF,IAAKjsF,EAAOisF,GAAGoC,OAAQtlI,IAAiBA,EACtD1S,EAAOA,GAAQ,KAERD,KAAKqnE,MAAOpnE,EAAM,SAAU2qB,EAAMw9G,GACxC,IAAI3mG,EAAU1wB,EAAOwO,WAAYqL,EAAMjY,GACvCy1H,EAAM3zH,KAAO,WACZ1D,EAAOyO,aAAciiB,EACtB,CACD,EACD,EAGA,WACC,IAAI8a,EAAQnrC,EAASM,cAAe,SAEnCsmI,EADS5mI,EAASM,cAAe,UACpBE,YAAaR,EAASM,cAAe,WAEnD6qC,EAAMt8C,KAAO,WAIb81H,EAAQkjB,QAA0B,KAAhB18F,EAAMp7C,MAIxB40H,EAAQmjB,YAAclB,EAAIrgF,UAI1Bpb,EAAQnrC,EAASM,cAAe,UAC1BvQ,MAAQ,IACdo7C,EAAMt8C,KAAO,QACb81H,EAAQojB,WAA6B,MAAhB58F,EAAMp7C,KAC1B,CArBF,GAwBA,IAAIi4I,GACHjc,GAAavzE,EAAOszE,KAAKC,WAE1BvzE,EAAOhQ,GAAGmkC,OAAQ,CACjBl0B,KAAM,SAAUvoD,EAAMH,GACrB,OAAO0lI,GAAQ7mI,KAAM4pD,EAAOC,KAAMvoD,EAAMH,EAAOH,UAAUC,OAAS,EACnE,EAEAo4I,WAAY,SAAU/3I,GACrB,OAAOtB,KAAK2uC,KAAM,WACjBib,EAAOyvF,WAAYr5I,KAAMsB,EAC1B,EACD,IAGDsoD,EAAOm0B,OAAQ,CACdl0B,KAAM,SAAU1B,EAAM7mD,EAAMH,GAC3B,IAAIy1H,EAAKwR,EACRkR,EAAQnxF,EAAKniD,SAGd,GAAe,IAAVszI,GAAyB,IAAVA,GAAyB,IAAVA,EAKnC,YAAkC,IAAtBnxF,EAAKpjC,aACT6kC,EAAOhC,KAAMO,EAAM7mD,EAAMH,IAKlB,IAAVm4I,GAAgB1vF,EAAO6tE,SAAUtvE,KACrCigF,EAAQx+E,EAAO2vF,UAAWj4I,EAAKwU,iBAC5B8zC,EAAOszE,KAAKx5H,MAAMy2H,KAAKh2H,KAAM7C,GAAS83I,QAAWx1I,SAGtCA,IAAVzC,EACW,OAAVA,OACJyoD,EAAOyvF,WAAYlxF,EAAM7mD,GAIrB8mI,GAAS,QAASA,QACuBxkI,KAA3CgzH,EAAMwR,EAAM3+H,IAAK0+C,EAAMhnD,EAAOG,IACzBs1H,GAGRzuE,EAAK1iC,aAAcnkB,EAAMH,EAAQ,IAC1BA,GAGHinI,GAAS,QAASA,GAA+C,QAApCxR,EAAMwR,EAAM5mI,IAAK2mD,EAAM7mD,IACjDs1H,EAMM,OAHdA,EAAMhtE,EAAO/kD,KAAKglD,KAAM1B,EAAM7mD,SAGTsC,EAAYgzH,EAClC,EAEA2iB,UAAW,CACVt5I,KAAM,CACLwJ,IAAK,SAAU0+C,EAAMhnD,GACpB,IAAM40H,EAAQojB,YAAwB,UAAVh4I,GAC3BgiB,EAAUglC,EAAM,SAAY,CAC5B,IAAIu8B,EAAMv8B,EAAKhnD,MAKf,OAJAgnD,EAAK1iC,aAAc,OAAQtkB,GACtBujF,IACJv8B,EAAKhnD,MAAQujF,GAEPvjF,CACR,CACD,IAIFk4I,WAAY,SAAUlxF,EAAMhnD,GAC3B,IAAIG,EACHwP,EAAI,EAIJ0oI,EAAYr4I,GAASA,EAAMuC,MAAOkgI,GAEnC,GAAK4V,GAA+B,IAAlBrxF,EAAKniD,SACtB,KAAU1E,EAAOk4I,EAAW1oI,MAC3Bq3C,EAAK3iC,gBAAiBlkB,EAGzB,IAID83I,GAAW,CACV3vI,IAAK,SAAU0+C,EAAMhnD,EAAOG,GAQ3B,OAPe,IAAVH,EAGJyoD,EAAOyvF,WAAYlxF,EAAM7mD,GAEzB6mD,EAAK1iC,aAAcnkB,EAAMA,GAEnBA,CACR,GAGDsoD,EAAOjb,KAAMib,EAAOszE,KAAKx5H,MAAMy2H,KAAK73H,OAAOoB,MAAO,QAAU,SAAUs0H,EAAI12H,GACzE,IAAIsxC,EAASuqF,GAAY77H,IAAUsoD,EAAO/kD,KAAKglD,KAE/CszE,GAAY77H,GAAS,SAAU6mD,EAAM7mD,EAAMghI,GAC1C,IAAI1L,EAAKuV,EACRsN,EAAgBn4I,EAAKwU,cAYtB,OAVMwsH,IAGL6J,EAAShP,GAAYsc,GACrBtc,GAAYsc,GAAkB7iB,EAC9BA,EAAqC,MAA/BhkF,EAAQuV,EAAM7mD,EAAMghI,GACzBmX,EACA,KACDtc,GAAYsc,GAAkBtN,GAExBvV,CACR,CACD,GAKA,IAAI8iB,GAAa,sCAChBC,GAAa,gBAwIb,SAASC,GAAkBz4I,GAE1B,OADaA,EAAMuC,MAAOkgI,IAAmB,IAC/BngI,KAAM,IACrB,CAGD,SAASo2I,GAAU1xF,GAClB,OAAOA,EAAKpjC,cAAgBojC,EAAKpjC,aAAc,UAAa,EAC7D,CAEA,SAAS+0H,GAAgB34I,GACxB,OAAKuD,MAAM+H,QAAStL,GACZA,EAEc,iBAAVA,GACJA,EAAMuC,MAAOkgI,IAEd,EACR,CAxJAh6E,EAAOhQ,GAAGmkC,OAAQ,CACjBn2B,KAAM,SAAUtmD,EAAMH,GACrB,OAAO0lI,GAAQ7mI,KAAM4pD,EAAOhC,KAAMtmD,EAAMH,EAAOH,UAAUC,OAAS,EACnE,EAEA84I,WAAY,SAAUz4I,GACrB,OAAOtB,KAAK2uC,KAAM,kBACV3uC,KAAM4pD,EAAOowF,QAAS14I,IAAUA,EACxC,EACD,IAGDsoD,EAAOm0B,OAAQ,CACdn2B,KAAM,SAAUO,EAAM7mD,EAAMH,GAC3B,IAAIy1H,EAAKwR,EACRkR,EAAQnxF,EAAKniD,SAGd,GAAe,IAAVszI,GAAyB,IAAVA,GAAyB,IAAVA,EAWnC,OAPe,IAAVA,GAAgB1vF,EAAO6tE,SAAUtvE,KAGrC7mD,EAAOsoD,EAAOowF,QAAS14I,IAAUA,EACjC8mI,EAAQx+E,EAAO6rF,UAAWn0I,SAGZsC,IAAVzC,EACCinI,GAAS,QAASA,QACuBxkI,KAA3CgzH,EAAMwR,EAAM3+H,IAAK0+C,EAAMhnD,EAAOG,IACzBs1H,EAGCzuE,EAAM7mD,GAASH,EAGpBinI,GAAS,QAASA,GAA+C,QAApCxR,EAAMwR,EAAM5mI,IAAK2mD,EAAM7mD,IACjDs1H,EAGDzuE,EAAM7mD,EACd,EAEAm0I,UAAW,CACV3qG,SAAU,CACTtpC,IAAK,SAAU2mD,GAMd,IAAI9iB,EAAWukB,EAAO/kD,KAAKglD,KAAM1B,EAAM,YAEvC,OAAK9iB,EACG1hC,SAAU0hC,EAAU,IAI3Bq0G,GAAWv1I,KAAMgkD,EAAKhlC,WACtBw2H,GAAWx1I,KAAMgkD,EAAKhlC,WACtBglC,EAAK+2E,KAEE,GAGA,CACT,IAIF8a,QAAS,CACR,IAAO,UACP,MAAS,eAYLjkB,EAAQmjB,cACbtvF,EAAO6rF,UAAU99E,SAAW,CAC3Bn2D,IAAK,SAAU2mD,GAId,IAAI7a,EAAS6a,EAAKl5B,WAIlB,OAHKqe,GAAUA,EAAOre,YACrBqe,EAAOre,WAAW5C,cAEZ,IACR,EACA5iB,IAAK,SAAU0+C,GAId,IAAI7a,EAAS6a,EAAKl5B,WACbqe,IACJA,EAAOjhB,cAEFihB,EAAOre,YACXqe,EAAOre,WAAW5C,cAGrB,IAIFu9B,EAAOjb,KAAM,CACZ,WACA,WACA,YACA,cACA,cACA,UACA,UACA,SACA,cACA,mBACE,WACFib,EAAOowF,QAASh6I,KAAK8V,eAAkB9V,IACxC,GA2BA4pD,EAAOhQ,GAAGmkC,OAAQ,CACjBk8D,SAAU,SAAU94I,GACnB,IAAI+4I,EAAY/W,EAAKgX,EAAU57G,EAAWztB,EAAGspI,EAE7C,OAAK3sI,EAAYtM,GACTnB,KAAK2uC,KAAM,SAAU8jC,GAC3B7oB,EAAQ5pD,MAAOi6I,SAAU94I,EAAMpB,KAAMC,KAAMyyE,EAAGonE,GAAU75I,OACzD,IAGDk6I,EAAaJ,GAAgB34I,IAEbF,OACRjB,KAAK2uC,KAAM,WAIjB,GAHAwrG,EAAWN,GAAU75I,MACrBmjI,EAAwB,IAAlBnjI,KAAKgG,UAAoB,IAAM4zI,GAAkBO,GAAa,IAEzD,CACV,IAAMrpI,EAAI,EAAGA,EAAIopI,EAAWj5I,OAAQ6P,IACnCytB,EAAY27G,EAAYppI,GACnBqyH,EAAIjyH,QAAS,IAAMqtB,EAAY,KAAQ,IAC3C4kG,GAAO5kG,EAAY,KAKrB67G,EAAaR,GAAkBzW,GAC1BgX,IAAaC,GACjBp6I,KAAKylB,aAAc,QAAS20H,EAE9B,CACD,GAGMp6I,IACR,EAEAq6I,YAAa,SAAUl5I,GACtB,IAAI+4I,EAAY/W,EAAKgX,EAAU57G,EAAWztB,EAAGspI,EAE7C,OAAK3sI,EAAYtM,GACTnB,KAAK2uC,KAAM,SAAU8jC,GAC3B7oB,EAAQ5pD,MAAOq6I,YAAal5I,EAAMpB,KAAMC,KAAMyyE,EAAGonE,GAAU75I,OAC5D,GAGKgB,UAAUC,QAIhBi5I,EAAaJ,GAAgB34I,IAEbF,OACRjB,KAAK2uC,KAAM,WAMjB,GALAwrG,EAAWN,GAAU75I,MAGrBmjI,EAAwB,IAAlBnjI,KAAKgG,UAAoB,IAAM4zI,GAAkBO,GAAa,IAEzD,CACV,IAAMrpI,EAAI,EAAGA,EAAIopI,EAAWj5I,OAAQ6P,IAInC,IAHAytB,EAAY27G,EAAYppI,GAGhBqyH,EAAIjyH,QAAS,IAAMqtB,EAAY,MAAS,GAC/C4kG,EAAMA,EAAIhgI,QAAS,IAAMo7B,EAAY,IAAK,KAK5C67G,EAAaR,GAAkBzW,GAC1BgX,IAAaC,GACjBp6I,KAAKylB,aAAc,QAAS20H,EAE9B,CACD,GAGMp6I,KA/BCA,KAAK6pD,KAAM,QAAS,GAgC7B,EAEAywF,YAAa,SAAUn5I,EAAOo5I,GAC7B,IAAIL,EAAY37G,EAAWztB,EAAGlL,EAC7B3F,SAAckB,EACdq5I,EAAwB,WAATv6I,GAAqByE,MAAM+H,QAAStL,GAEpD,OAAKsM,EAAYtM,GACTnB,KAAK2uC,KAAM,SAAU79B,GAC3B84C,EAAQ5pD,MAAOs6I,YACdn5I,EAAMpB,KAAMC,KAAM8Q,EAAG+oI,GAAU75I,MAAQu6I,GACvCA,EAEF,GAGwB,kBAAbA,GAA0BC,EAC9BD,EAAWv6I,KAAKi6I,SAAU94I,GAAUnB,KAAKq6I,YAAal5I,IAG9D+4I,EAAaJ,GAAgB34I,GAEtBnB,KAAK2uC,KAAM,WACjB,GAAK6rG,EAKJ,IAFA50I,EAAOgkD,EAAQ5pD,MAET8Q,EAAI,EAAGA,EAAIopI,EAAWj5I,OAAQ6P,IACnCytB,EAAY27G,EAAYppI,GAGnBlL,EAAKw2E,SAAU79C,GACnB34B,EAAKy0I,YAAa97G,GAElB34B,EAAKq0I,SAAU17G,aAKI36B,IAAVzC,GAAgC,YAATlB,KAClCs+B,EAAYs7G,GAAU75I,QAIrB2nI,GAASl+H,IAAKzJ,KAAM,gBAAiBu+B,GAOjCv+B,KAAKylB,cACTzlB,KAAKylB,aAAc,QAClB8Y,IAAuB,IAAVp9B,EACZ,GACAwmI,GAASnmI,IAAKxB,KAAM,kBAAqB,IAI9C,GACD,EAEAo8E,SAAU,SAAU/uC,GACnB,IAAI9O,EAAW4pB,EACdr3C,EAAI,EAGL,IADAytB,EAAY,IAAM8O,EAAW,IACnB8a,EAAOnoD,KAAM8Q,MACtB,GAAuB,IAAlBq3C,EAAKniD,WACP,IAAM4zI,GAAkBC,GAAU1xF,IAAW,KAAMj3C,QAASqtB,IAAe,EAC7E,OAAO,EAIT,OAAO,CACR,IAMD,IAAIk8G,GAAU,MAEd7wF,EAAOhQ,GAAGmkC,OAAQ,CACjB2G,IAAK,SAAUvjF,GACd,IAAIinI,EAAOxR,EAAKuZ,EACfhoF,EAAOnoD,KAAM,GAEd,OAAMgB,UAAUC,QA0BhBkvI,EAAkB1iI,EAAYtM,GAEvBnB,KAAK2uC,KAAM,SAAU79B,GAC3B,IAAI4zE,EAEmB,IAAlB1kF,KAAKgG,WAWE,OANX0+E,EADIyrD,EACEhvI,EAAMpB,KAAMC,KAAM8Q,EAAG84C,EAAQ5pD,MAAO0kF,OAEpCvjF,GAKNujF,EAAM,GAEoB,iBAARA,EAClBA,GAAO,GAEIhgF,MAAM+H,QAASi4E,KAC1BA,EAAM96B,EAAO7mD,IAAK2hF,EAAK,SAAUvjF,GAChC,OAAgB,MAATA,EAAgB,GAAKA,EAAQ,EACrC,KAGDinI,EAAQx+E,EAAO8wF,SAAU16I,KAAKC,OAAU2pD,EAAO8wF,SAAU16I,KAAKmjB,SAASrN,iBAGrD,QAASsyH,QAA+CxkI,IAApCwkI,EAAM3+H,IAAKzJ,KAAM0kF,EAAK,WAC3D1kF,KAAKmB,MAAQujF,GAEf,IA3DMv8B,GACJigF,EAAQx+E,EAAO8wF,SAAUvyF,EAAKloD,OAC7B2pD,EAAO8wF,SAAUvyF,EAAKhlC,SAASrN,iBAG/B,QAASsyH,QACgCxkI,KAAvCgzH,EAAMwR,EAAM5mI,IAAK2mD,EAAM,UAElByuE,EAMY,iBAHpBA,EAAMzuE,EAAKhnD,OAIHy1H,EAAIzzH,QAASs3I,GAAS,IAIhB,MAAP7jB,EAAc,GAAKA,OAG3B,CAsCF,IAGDhtE,EAAOm0B,OAAQ,CACd28D,SAAU,CACTnlI,OAAQ,CACP/T,IAAK,SAAU2mD,GAEd,IAAIu8B,EAAM96B,EAAO/kD,KAAKglD,KAAM1B,EAAM,SAClC,OAAc,MAAPu8B,EACNA,EAMAk1D,GAAkBhwF,EAAO+P,KAAMxR,GACjC,GAED0zE,OAAQ,CACPr6H,IAAK,SAAU2mD,GACd,IAAIhnD,EAAOoU,EAAQzE,EAClBuE,EAAU8yC,EAAK9yC,QACf/L,EAAQ6+C,EAAK97B,cACb++G,EAAoB,eAAdjjF,EAAKloD,KACXmnB,EAASgkH,EAAM,KAAO,GACtB1iI,EAAM0iI,EAAM9hI,EAAQ,EAAI+L,EAAQpU,OAUjC,IAPC6P,EADIxH,EAAQ,EACRZ,EAGA0iI,EAAM9hI,EAAQ,EAIXwH,EAAIpI,EAAKoI,IAKhB,KAJAyE,EAASF,EAASvE,IAIJ6mD,UAAY7mD,IAAMxH,KAG7BiM,EAAO+hD,YACL/hD,EAAO0Z,WAAWqoC,WACnBn0C,EAAU5N,EAAO0Z,WAAY,aAAiB,CAMjD,GAHA9tB,EAAQyoD,EAAQr0C,GAASmvE,MAGpB0mD,EACJ,OAAOjqI,EAIRimB,EAAO1c,KAAMvJ,EACd,CAGD,OAAOimB,CACR,EAEA3d,IAAK,SAAU0+C,EAAMhnD,GAMpB,IALA,IAAIw5I,EAAWplI,EACdF,EAAU8yC,EAAK9yC,QACf+R,EAASwiC,EAAO7B,UAAW5mD,GAC3B2P,EAAIuE,EAAQpU,OAEL6P,OACPyE,EAASF,EAASvE,IAIN6mD,SACX/N,EAAO4tE,QAAS5tE,EAAO8wF,SAASnlI,OAAO/T,IAAK+T,GAAU6R,IAAY,KAElEuzH,GAAY,GAUd,OAHMA,IACLxyF,EAAK97B,eAAiB,GAEhBjF,CACR,MAMHwiC,EAAOjb,KAAM,CAAE,QAAS,YAAc,WACrCib,EAAO8wF,SAAU16I,MAAS,CACzByJ,IAAK,SAAU0+C,EAAMhnD,GACpB,GAAKuD,MAAM+H,QAAStL,GACnB,OAASgnD,EAAKkP,QAAUzN,EAAO4tE,QAAS5tE,EAAQzB,GAAOu8B,MAAOvjF,IAAW,CAE3E,GAEK40H,EAAQkjB,UACbrvF,EAAO8wF,SAAU16I,MAAOwB,IAAM,SAAU2mD,GACvC,OAAwC,OAAjCA,EAAKpjC,aAAc,SAAqB,KAAOojC,EAAKhnD,KAC5D,EAEF,GAMA,IAAI2lC,GAAW/1B,EAAO+1B,SAElBovF,GAAQ,CAAE6B,KAAMnvH,KAAKC,OAErB+xI,GAAS,KAKbhxF,EAAOixF,SAAW,SAAUhxI,GAC3B,IAAIu0H,EAAK0c,EACT,IAAMjxI,GAAwB,iBAATA,EACpB,OAAO,KAKR,IACCu0H,GAAM,IAAMrtH,EAAOQ,WAAcC,gBAAiB3H,EAAM,WACzD,CAAE,MAAQpD,GAAK,CAYf,OAVAq0I,EAAkB1c,GAAOA,EAAI3/F,qBAAsB,eAAiB,GAC9D2/F,IAAO0c,GACZlxF,EAAO5uB,MAAO,iBACb8/G,EACClxF,EAAO7mD,IAAK+3I,EAAgBvzH,WAAY,SAAUY,GACjD,OAAOA,EAAGwhE,WACX,GAAIlmF,KAAM,MACVoG,IAGIu0H,CACR,EAGA,IAAI2c,GAAc,kCACjBC,GAA0B,SAAUv0I,GACnCA,EAAEyb,iBACH,EAED0nC,EAAOm0B,OAAQn0B,EAAO9mC,MAAO,CAE5By+D,QAAS,SAAUz+D,EAAOjZ,EAAMs+C,EAAM8yF,GAErC,IAAInqI,EAAGqyH,EAAKoF,EAAK2S,EAAYC,EAAQhP,EAAQ5G,EAAS6V,EACrDC,EAAY,CAAElzF,GAAQ/2C,GACtBnR,EAAO8xC,EAAOhyC,KAAM+iB,EAAO,QAAWA,EAAM7iB,KAAO6iB,EACnDkpH,EAAaj6F,EAAOhyC,KAAM+iB,EAAO,aAAgBA,EAAMwmC,UAAUz3C,MAAO,KAAQ,GAKjF,GAHAsxH,EAAMiY,EAAc7S,EAAMpgF,EAAOA,GAAQ/2C,EAGlB,IAAlB+2C,EAAKniD,UAAoC,IAAlBmiD,EAAKniD,WAK5B+0I,GAAY52I,KAAMlE,EAAO2pD,EAAO9mC,MAAMspH,aAItCnsI,EAAKiR,QAAS,MAAS,IAG3B86H,EAAa/rI,EAAK4R,MAAO,KACzB5R,EAAO+rI,EAAWz3E,QAClBy3E,EAAWhtH,QAEZm8H,EAASl7I,EAAKiR,QAAS,KAAQ,GAAK,KAAOjR,GAG3C6iB,EAAQA,EAAO8mC,EAAOutE,SACrBr0G,EACA,IAAI8mC,EAAOt1C,MAAOrU,EAAuB,iBAAV6iB,GAAsBA,IAGhD0oH,UAAYyP,EAAe,EAAI,EACrCn4H,EAAMwmC,UAAY0iF,EAAWvoI,KAAM,KACnCqf,EAAMoqH,WAAapqH,EAAMwmC,UACxB,IAAIjnD,OAAQ,UAAY2pI,EAAWvoI,KAAM,iBAAoB,WAC7D,KAGDqf,EAAM3Z,YAASvF,EACTkf,EAAM1hB,SACX0hB,EAAM1hB,OAAS+mD,GAIhBt+C,EAAe,MAARA,EACN,CAAEiZ,GACF8mC,EAAO7B,UAAWl+C,EAAM,CAAEiZ,IAG3ByiH,EAAU37E,EAAO9mC,MAAMyiH,QAAStlI,IAAU,CAAC,EACrCg7I,IAAgB1V,EAAQhkD,UAAmD,IAAxCgkD,EAAQhkD,QAAQ7yE,MAAOy5C,EAAMt+C,IAAtE,CAMA,IAAMoxI,IAAiB1V,EAAQkI,WAAazX,EAAU7tE,GAAS,CAM9D,IAJA+yF,EAAa3V,EAAQkG,cAAgBxrI,EAC/B86I,GAAY52I,KAAM+2I,EAAaj7I,KACpCkjI,EAAMA,EAAIl0G,YAEHk0G,EAAKA,EAAMA,EAAIl0G,WACtBosH,EAAU3wI,KAAMy4H,GAChBoF,EAAMpF,EAIFoF,KAAUpgF,EAAKyvE,eAAiBxmH,IACpCiqI,EAAU3wI,KAAM69H,EAAI9L,aAAe8L,EAAIz5D,cAAgB/9D,EAEzD,CAIA,IADAD,EAAI,GACMqyH,EAAMkY,EAAWvqI,QAAYgS,EAAMmqH,wBAC5CmO,EAAcjY,EACdrgH,EAAM7iB,KAAO6Q,EAAI,EAChBoqI,EACA3V,EAAQ+G,UAAYrsI,GAGrBksI,GAAWxE,GAASnmI,IAAK2hI,EAAK,WAAc7jI,OAAOc,OAAQ,OAAU0iB,EAAM7iB,OAC1E0nI,GAASnmI,IAAK2hI,EAAK,YAEnBgJ,EAAOz9H,MAAOy0H,EAAKt5H,IAIpBsiI,EAASgP,GAAUhY,EAAKgY,KACThP,EAAOz9H,OAAS64H,GAAYpE,KAC1CrgH,EAAM3Z,OAASgjI,EAAOz9H,MAAOy0H,EAAKt5H,IACZ,IAAjBiZ,EAAM3Z,QACV2Z,EAAMb,kBA8CT,OA1CAa,EAAM7iB,KAAOA,EAGPg7I,GAAiBn4H,EAAM6qH,sBAEpBpI,EAAQ5vF,WACqC,IAApD4vF,EAAQ5vF,SAASjnC,MAAO2sI,EAAU5wI,MAAOZ,KACzC09H,GAAYp/E,IAIPgzF,GAAU1tI,EAAY06C,EAAMloD,MAAa+1H,EAAU7tE,MAGvDogF,EAAMpgF,EAAMgzF,MAGXhzF,EAAMgzF,GAAW,MAIlBvxF,EAAO9mC,MAAMspH,UAAYnsI,EAEpB6iB,EAAMmqH,wBACVmO,EAAY/nI,iBAAkBpT,EAAM+6I,IAGrC7yF,EAAMloD,KAED6iB,EAAMmqH,wBACVmO,EAAYhnI,oBAAqBnU,EAAM+6I,IAGxCpxF,EAAO9mC,MAAMspH,eAAYxoI,EAEpB2kI,IACJpgF,EAAMgzF,GAAW5S,IAMdzlH,EAAM3Z,MAvFb,CAwFD,EAIAylI,SAAU,SAAU3uI,EAAMkoD,EAAMrlC,GAC/B,IAAIrc,EAAImjD,EAAOm0B,OACd,IAAIn0B,EAAOt1C,MACXwO,EACA,CACC7iB,KAAMA,EACN6tI,aAAa,IAIflkF,EAAO9mC,MAAMy+D,QAAS96E,EAAG,KAAM0hD,EAChC,IAIDyB,EAAOhQ,GAAGmkC,OAAQ,CAEjBwD,QAAS,SAAUthF,EAAM4J,GACxB,OAAO7J,KAAK2uC,KAAM,WACjBib,EAAO9mC,MAAMy+D,QAASthF,EAAM4J,EAAM7J,KACnC,EACD,EACAs7I,eAAgB,SAAUr7I,EAAM4J,GAC/B,IAAIs+C,EAAOnoD,KAAM,GACjB,GAAKmoD,EACJ,OAAOyB,EAAO9mC,MAAMy+D,QAASthF,EAAM4J,EAAMs+C,GAAM,EAEjD,IAID,IACCozF,GAAW,QACXC,GAAQ,SACRC,GAAkB,wCAClBC,GAAe,qCAEhB,SAASC,GAAap5F,EAAQvjD,EAAK48I,EAAa/gI,GAC/C,IAAIvZ,EAEJ,GAAKoD,MAAM+H,QAASzN,GAGnB4qD,EAAOjb,KAAM3vC,EAAK,SAAU8R,EAAG9N,GACzB44I,GAAeL,GAASp3I,KAAMo+C,GAGlC1nC,EAAK0nC,EAAQv/C,GAKb24I,GACCp5F,EAAS,KAAqB,iBAANv/C,GAAuB,MAALA,EAAY8N,EAAI,IAAO,IACjE9N,EACA44I,EACA/gI,EAGH,QAEM,GAAM+gI,GAAiC,WAAlBrlB,EAAQv3H,GAUnC6b,EAAK0nC,EAAQvjD,QAPb,IAAMsC,KAAQtC,EACb28I,GAAap5F,EAAS,IAAMjhD,EAAO,IAAKtC,EAAKsC,GAAQs6I,EAAa/gI,EAQrE,CAIA+uC,EAAOiyF,MAAQ,SAAUr4I,EAAGo4I,GAC3B,IAAIr5F,EACHpxC,EAAI,GACJ0J,EAAM,SAAU5Q,EAAK6xI,GAGpB,IAAI36I,EAAQsM,EAAYquI,GACvBA,IACAA,EAED3qI,EAAGA,EAAElQ,QAAW+9B,mBAAoB/0B,GAAQ,IAC3C+0B,mBAA6B,MAAT79B,EAAgB,GAAKA,EAC3C,EAED,GAAU,MAALqC,EACJ,MAAO,GAIR,GAAKkB,MAAM+H,QAASjJ,IAASA,EAAEkzH,SAAW9sE,EAAOz8C,cAAe3J,GAG/DomD,EAAOjb,KAAMnrC,EAAG,WACfqX,EAAK7a,KAAKsB,KAAMtB,KAAKmB,MACtB,QAMA,IAAMohD,KAAU/+C,EACfm4I,GAAap5F,EAAQ/+C,EAAG++C,GAAUq5F,EAAa/gI,GAKjD,OAAO1J,EAAE1N,KAAM,IAChB,EAEAmmD,EAAOhQ,GAAGmkC,OAAQ,CACjBg+D,UAAW,WACV,OAAOnyF,EAAOiyF,MAAO77I,KAAKg8I,iBAC3B,EACAA,eAAgB,WACf,OAAOh8I,KAAK+C,IAAK,WAGhB,IAAI8uE,EAAWjoB,EAAOhC,KAAM5nD,KAAM,YAClC,OAAO6xE,EAAWjoB,EAAO7B,UAAW8pB,GAAa7xE,IAClD,GAAI8D,OAAQ,WACX,IAAI7D,EAAOD,KAAKC,KAGhB,OAAOD,KAAKsB,OAASsoD,EAAQ5pD,MAAOqpG,GAAI,cACvCqyC,GAAav3I,KAAMnE,KAAKmjB,YAAes4H,GAAgBt3I,KAAMlE,KAC3DD,KAAKq3D,UAAYqyE,GAAevlI,KAAMlE,GAC1C,GAAI8C,IAAK,SAAUi1H,EAAI7vE,GACtB,IAAIu8B,EAAM96B,EAAQ5pD,MAAO0kF,MAEzB,OAAY,MAAPA,EACG,KAGHhgF,MAAM+H,QAASi4E,GACZ96B,EAAO7mD,IAAK2hF,EAAK,SAAUA,GACjC,MAAO,CAAEpjF,KAAM6mD,EAAK7mD,KAAMH,MAAOujF,EAAIvhF,QAASq4I,GAAO,QACtD,GAGM,CAAEl6I,KAAM6mD,EAAK7mD,KAAMH,MAAOujF,EAAIvhF,QAASq4I,GAAO,QACtD,GAAIh6I,KACL,IAID,IACCy6I,GAAM,OACNC,GAAQ,OACRC,GAAa,gBACbC,GAAW,6BAIXC,GAAa,iBACbC,GAAY,QAWZzF,GAAa,CAAC,EAOd0F,GAAa,CAAC,EAGdC,GAAW,KAAKh8F,OAAQ,KAGxBi8F,GAAerrI,EAASM,cAAe,KAKxC,SAASgrI,GAA6BC,GAGrC,OAAO,SAAUC,EAAoBp3I,GAED,iBAAvBo3I,IACXp3I,EAAOo3I,EACPA,EAAqB,KAGtB,IAAIC,EACH/rI,EAAI,EACJgsI,EAAYF,EAAmB9mI,cAAcpS,MAAOkgI,IAAmB,GAExE,GAAKn2H,EAAYjI,GAGhB,KAAUq3I,EAAWC,EAAWhsI,MAGR,MAAlB+rI,EAAU,IACdA,EAAWA,EAAS/vI,MAAO,IAAO,KAChC6vI,EAAWE,GAAaF,EAAWE,IAAc,IAAKtvG,QAAS/nC,KAI/Dm3I,EAAWE,GAAaF,EAAWE,IAAc,IAAKnyI,KAAMlF,EAIlE,CACD,CAGA,SAASu3I,GAA+BJ,EAAWtnI,EAAS8hI,EAAiB6F,GAE5E,IAAIC,EAAY,CAAC,EAChBC,EAAqBP,IAAcJ,GAEpC,SAASY,EAASN,GACjB,IAAIllF,EAcJ,OAbAslF,EAAWJ,IAAa,EACxBjzF,EAAOjb,KAAMguG,EAAWE,IAAc,GAAI,SAAUz5I,EAAGg6I,GACtD,IAAIC,EAAsBD,EAAoB/nI,EAAS8hI,EAAiB6F,GACxE,MAAoC,iBAAxBK,GACVH,GAAqBD,EAAWI,GAKtBH,IACDvlF,EAAW0lF,QADf,GAHNhoI,EAAQynI,UAAUvvG,QAAS8vG,GAC3BF,EAASE,IACF,EAIT,GACO1lF,CACR,CAEA,OAAOwlF,EAAS9nI,EAAQynI,UAAW,MAAUG,EAAW,MAASE,EAAS,IAC3E,CAKA,SAASG,GAAYl8I,EAAQ8mB,GAC5B,IAAIje,EAAKo6E,EACRk5D,EAAc3zF,EAAO4zF,aAAaD,aAAe,CAAC,EAEnD,IAAMtzI,KAAOie,OACQtkB,IAAfskB,EAAKje,MACPszI,EAAatzI,GAAQ7I,EAAWijF,IAAUA,EAAO,CAAC,IAASp6E,GAAQie,EAAKje,IAO5E,OAJKo6E,GACJz6B,EAAOm0B,QAAQ,EAAM38E,EAAQijF,GAGvBjjF,CACR,CAhFAq7I,GAAavd,KAAOp4F,GAASo4F,KAgP7Bt1E,EAAOm0B,OAAQ,CAGd0/D,OAAQ,EAGRC,aAAc,CAAC,EACfC,KAAM,CAAC,EAEPH,aAAc,CACb5/F,IAAK9W,GAASo4F,KACdj/H,KAAM,MACN29I,QAxRgB,4DAwRQz5I,KAAM2iC,GAAS+2G,UACvCvjG,QAAQ,EACRwjG,aAAa,EACbC,OAAO,EACPC,YAAa,mDAcbC,QAAS,CACR,IAAKzB,GACL7iF,KAAM,aACN9xC,KAAM,YACNu2G,IAAK,4BACLtgC,KAAM,qCAGPr9B,SAAU,CACT29D,IAAK,UACLv2G,KAAM,SACNi2E,KAAM,YAGPogD,eAAgB,CACf9f,IAAK,cACLzkE,KAAM,eACNmkC,KAAM,gBAKPqgD,WAAY,CAGX,SAAU9uI,OAGV,aAAa,EAGb,YAAamT,KAAKC,MAGlB,WAAYmnC,EAAOixF,UAOpB0C,YAAa,CACZ3/F,KAAK,EACL64E,SAAS,IAOX2nB,UAAW,SAAUh9I,EAAQi9I,GAC5B,OAAOA,EAGNf,GAAYA,GAAYl8I,EAAQwoD,EAAO4zF,cAAgBa,GAGvDf,GAAY1zF,EAAO4zF,aAAcp8I,EACnC,EAEAk9I,cAAe5B,GAA6B7F,IAC5C0H,cAAe7B,GAA6BH,IAG5Cv+G,KAAM,SAAU4f,EAAKvoC,GAGA,iBAARuoC,IACXvoC,EAAUuoC,EACVA,OAAMh6C,GAIPyR,EAAUA,GAAW,CAAC,EAEtB,IAAImpI,EAGHC,EAGAC,EACAlpD,EAGAmpD,EAGAC,EAGAlY,EAGAmY,EAGA/tI,EAGAguI,EAGA3tI,EAAIy4C,EAAOw0F,UAAW,CAAC,EAAG/oI,GAG1B0pI,EAAkB5tI,EAAEslH,SAAWtlH,EAG/B6tI,EAAqB7tI,EAAEslH,UACpBsoB,EAAgB/4I,UAAY+4I,EAAgBroB,QAC9C9sE,EAAQm1F,GACRn1F,EAAO9mC,MAGRiiH,EAAWn7E,EAAOg7E,WAClBqa,EAAmBr1F,EAAOs6E,UAAW,eAGrCgb,EAAa/tI,EAAE+tI,YAAc,CAAC,EAG9BC,EAAiB,CAAC,EAClBC,EAAsB,CAAC,EAGvBC,EAAW,WAGXrC,EAAQ,CACPtkH,WAAY,EAGZq+D,kBAAmB,SAAU9sF,GAC5B,IAAIvG,EACJ,GAAKgjI,EAAY,CAChB,IAAMlxC,EAEL,IADAA,EAAkB,CAAC,EACT9xF,EAAQ04I,GAASj1I,KAAMu3I,IAChClpD,EAAiB9xF,EAAO,GAAIoS,cAAgB,MACzC0/E,EAAiB9xF,EAAO,GAAIoS,cAAgB,MAAS,IACrD0qC,OAAQ98C,EAAO,IAGpBA,EAAQ8xF,EAAiBvrF,EAAI6L,cAAgB,IAC9C,CACA,OAAgB,MAATpS,EAAgB,KAAOA,EAAMD,KAAM,KAC3C,EAGAgyF,sBAAuB,WACtB,OAAOixC,EAAYgY,EAAwB,IAC5C,EAGAxgH,iBAAkB,SAAU58B,EAAMH,GAMjC,OALkB,MAAbulI,IACJplI,EAAO89I,EAAqB99I,EAAKwU,eAChCspI,EAAqB99I,EAAKwU,gBAAmBxU,EAC9C69I,EAAgB79I,GAASH,GAEnBnB,IACR,EAGAs/I,iBAAkB,SAAUr/I,GAI3B,OAHkB,MAAbymI,IACJv1H,EAAE0nF,SAAW54F,GAEPD,IACR,EAGAk/I,WAAY,SAAUn8I,GACrB,IAAIqpD,EACJ,GAAKrpD,EACJ,GAAK2jI,EAGJsW,EAAMlY,OAAQ/hI,EAAKi6I,EAAMl/G,cAIzB,IAAMsuB,KAAQrpD,EACbm8I,EAAY9yF,GAAS,CAAE8yF,EAAY9yF,GAAQrpD,EAAKqpD,IAInD,OAAOpsD,IACR,EAGAq8B,MAAO,SAAUkjH,GAChB,IAAIC,EAAYD,GAAcF,EAK9B,OAJKb,GACJA,EAAUniH,MAAOmjH,GAElBvlH,EAAM,EAAGulH,GACFx/I,IACR,GAmBF,GAfA+kI,EAAS7rF,QAAS8jG,GAKlB7rI,EAAEysC,MAAUA,GAAOzsC,EAAEysC,KAAO9W,GAASo4F,MAAS,IAC5C/7H,QAASm5I,GAAWx1G,GAAS+2G,SAAW,MAG1C1sI,EAAElR,KAAOoV,EAAQunB,QAAUvnB,EAAQpV,MAAQkR,EAAEyrB,QAAUzrB,EAAElR,KAGzDkR,EAAE2rI,WAAc3rI,EAAE0rI,UAAY,KAAM/mI,cAAcpS,MAAOkgI,IAAmB,CAAE,IAGxD,MAAjBzyH,EAAEsuI,YAAsB,CAC5Bb,EAAYxtI,EAASM,cAAe,KAKpC,IACCktI,EAAU1f,KAAO/tH,EAAEysC,IAInBghG,EAAU1f,KAAO0f,EAAU1f,KAC3B/tH,EAAEsuI,YAAchD,GAAaoB,SAAW,KAAOpB,GAAaiD,MAC3Dd,EAAUf,SAAW,KAAOe,EAAUc,IACxC,CAAE,MAAQj5I,GAIT0K,EAAEsuI,aAAc,CACjB,CACD,CAWA,GARKtuI,EAAEtH,MAAQsH,EAAE2sI,aAAiC,iBAAX3sI,EAAEtH,OACxCsH,EAAEtH,KAAO+/C,EAAOiyF,MAAO1qI,EAAEtH,KAAMsH,EAAEyqI,cAIlCmB,GAA+BlG,GAAY1lI,EAAGkE,EAAS2nI,GAGlDtW,EACJ,OAAOsW,EA8ER,IAAMlsI,KAzEN+tI,EAAcj1F,EAAO9mC,OAAS3R,EAAEmpC,SAGQ,IAApBsP,EAAO6zF,UAC1B7zF,EAAO9mC,MAAMy+D,QAAS,aAIvBpwE,EAAElR,KAAOkR,EAAElR,KAAK6qB,cAGhB3Z,EAAEwuI,YAActD,GAAWl4I,KAAMgN,EAAElR,MAKnCw+I,EAAWttI,EAAEysC,IAAIz6C,QAAS+4I,GAAO,IAG3B/qI,EAAEwuI,WAwBIxuI,EAAEtH,MAAQsH,EAAE2sI,aACoD,KAAzE3sI,EAAE6sI,aAAe,IAAK9sI,QAAS,uCACjCC,EAAEtH,KAAOsH,EAAEtH,KAAK1G,QAAS84I,GAAK,OAvB9B6C,EAAW3tI,EAAEysC,IAAI9wC,MAAO2xI,EAASx9I,QAG5BkQ,EAAEtH,OAAUsH,EAAE2sI,aAAiC,iBAAX3sI,EAAEtH,QAC1C40I,IAAc7D,GAAOz2I,KAAMs6I,GAAa,IAAM,KAAQttI,EAAEtH,YAGjDsH,EAAEtH,OAIO,IAAZsH,EAAE86B,QACNwyG,EAAWA,EAASt7I,QAASg5I,GAAY,MACzC2C,GAAalE,GAAOz2I,KAAMs6I,GAAa,IAAM,KAAQ,KAASvoB,GAAM6B,OACnE+mB,GAIF3tI,EAAEysC,IAAM6gG,EAAWK,GASf3tI,EAAEyuI,aACDh2F,EAAO8zF,aAAce,IACzBzB,EAAM9+G,iBAAkB,oBAAqB0rB,EAAO8zF,aAAce,IAE9D70F,EAAO+zF,KAAMc,IACjBzB,EAAM9+G,iBAAkB,gBAAiB0rB,EAAO+zF,KAAMc,MAKnDttI,EAAEtH,MAAQsH,EAAEwuI,aAAgC,IAAlBxuI,EAAE6sI,aAAyB3oI,EAAQ2oI,cACjEhB,EAAM9+G,iBAAkB,eAAgB/sB,EAAE6sI,aAI3ChB,EAAM9+G,iBACL,SACA/sB,EAAE2rI,UAAW,IAAO3rI,EAAE8sI,QAAS9sI,EAAE2rI,UAAW,IAC3C3rI,EAAE8sI,QAAS9sI,EAAE2rI,UAAW,KACA,MAArB3rI,EAAE2rI,UAAW,GAAc,KAAON,GAAW,WAAa,IAC7DrrI,EAAE8sI,QAAS,MAIF9sI,EAAEu1E,QACZs2D,EAAM9+G,iBAAkBptB,EAAGK,EAAEu1E,QAAS51E,IAIvC,GAAKK,EAAE0uI,cAC+C,IAAnD1uI,EAAE0uI,WAAW9/I,KAAMg/I,EAAiB/B,EAAO7rI,IAAiBu1H,GAG9D,OAAOsW,EAAM3gH,QAed,GAXAgjH,EAAW,QAGXJ,EAAiBpkI,IAAK1J,EAAEgM,UACxB6/H,EAAM/iH,KAAM9oB,EAAEm7E,SACd0wD,EAAMnkG,KAAM1nC,EAAE6pB,OAGdwjH,EAAYzB,GAA+BR,GAAYprI,EAAGkE,EAAS2nI,GAK5D,CASN,GARAA,EAAMtkH,WAAa,EAGdmmH,GACJG,EAAmBz9D,QAAS,WAAY,CAAEy7D,EAAO7rI,IAI7Cu1H,EACJ,OAAOsW,EAIH7rI,EAAE4sI,OAAS5sI,EAAEswB,QAAU,IAC3Bk9G,EAAe5tI,EAAOwO,WAAY,WACjCy9H,EAAM3gH,MAAO,UACd,EAAGlrB,EAAEswB,UAGN,IACCilG,GAAY,EACZ8X,EAAUrgH,KAAMghH,EAAgBllH,EACjC,CAAE,MAAQxzB,GAGT,GAAKigI,EACJ,MAAMjgI,EAIPwzB,GAAO,EAAGxzB,EACX,CACD,MAlCCwzB,GAAO,EAAG,gBAqCX,SAASA,EAAM6D,EAAQgiH,EAAkBC,EAAWr5D,GACnD,IAAIs5D,EAAW1zD,EAAStxD,EAAOq6D,EAAU4qD,EACxCV,EAAaO,EAGTpZ,IAILA,GAAY,EAGPiY,GACJ5tI,EAAOyO,aAAcm/H,GAKtBH,OAAY56I,EAGZ86I,EAAwBh4D,GAAW,GAGnCs2D,EAAMtkH,WAAaoF,EAAS,EAAI,EAAI,EAGpCkiH,EAAYliH,GAAU,KAAOA,EAAS,KAAkB,MAAXA,EAGxCiiH,IACJ1qD,EA7lBJ,SAA8BlkF,EAAG6rI,EAAO+C,GAOvC,IALA,IAAI1oH,EAAIp3B,EAAMigJ,EAAeC,EAC5B1/E,EAAWtvD,EAAEsvD,SACbq8E,EAAY3rI,EAAE2rI,UAGY,MAAnBA,EAAW,IAClBA,EAAUvoF,aACE3wD,IAAPyzB,IACJA,EAAKlmB,EAAE0nF,UAAYmkD,EAAMjmD,kBAAmB,iBAK9C,GAAK1/D,EACJ,IAAMp3B,KAAQwgE,EACb,GAAKA,EAAUxgE,IAAUwgE,EAAUxgE,GAAOkE,KAAMkzB,GAAO,CACtDylH,EAAUvvG,QAASttC,GACnB,KACD,CAKF,GAAK68I,EAAW,KAAOiD,EACtBG,EAAgBpD,EAAW,OACrB,CAGN,IAAM78I,KAAQ8/I,EAAY,CACzB,IAAMjD,EAAW,IAAO3rI,EAAEgtI,WAAYl+I,EAAO,IAAM68I,EAAW,IAAQ,CACrEoD,EAAgBjgJ,EAChB,KACD,CACMkgJ,IACLA,EAAgBlgJ,EAElB,CAGAigJ,EAAgBA,GAAiBC,CAClC,CAKA,GAAKD,EAIJ,OAHKA,IAAkBpD,EAAW,IACjCA,EAAUvvG,QAAS2yG,GAEbH,EAAWG,EAEpB,CAwiBeE,CAAqBjvI,EAAG6rI,EAAO+C,KAIrCC,GACLp2F,EAAO4tE,QAAS,SAAUrmH,EAAE2rI,YAAe,GAC3ClzF,EAAO4tE,QAAS,OAAQrmH,EAAE2rI,WAAc,IACxC3rI,EAAEgtI,WAAY,eAAkB,WAAY,GAI7C9oD,EA9iBH,SAAsBlkF,EAAGkkF,EAAU2nD,EAAOgD,GACzC,IAAIK,EAAOjkI,EAASkkI,EAAM/X,EAAK59G,EAC9BwzH,EAAa,CAAC,EAGdrB,EAAY3rI,EAAE2rI,UAAUhwI,QAGzB,GAAKgwI,EAAW,GACf,IAAMwD,KAAQnvI,EAAEgtI,WACfA,EAAYmC,EAAKxqI,eAAkB3E,EAAEgtI,WAAYmC,GAOnD,IAHAlkI,EAAU0gI,EAAUvoF,QAGZn4C,GAcP,GAZKjL,EAAE+sI,eAAgB9hI,KACtB4gI,EAAO7rI,EAAE+sI,eAAgB9hI,IAAci5E,IAIlC1qE,GAAQq1H,GAAa7uI,EAAEovI,aAC5BlrD,EAAWlkF,EAAEovI,WAAYlrD,EAAUlkF,EAAE0rI,WAGtClyH,EAAOvO,EACPA,EAAU0gI,EAAUvoF,QAKnB,GAAiB,MAAZn4C,EAEJA,EAAUuO,OAGJ,GAAc,MAATA,GAAgBA,IAASvO,EAAU,CAM9C,KAHAkkI,EAAOnC,EAAYxzH,EAAO,IAAMvO,IAAa+hI,EAAY,KAAO/hI,IAI/D,IAAMikI,KAASlC,EAId,IADA5V,EAAM8X,EAAMxuI,MAAO,MACT,KAAQuK,IAGjBkkI,EAAOnC,EAAYxzH,EAAO,IAAM49G,EAAK,KACpC4V,EAAY,KAAO5V,EAAK,KACb,EAGG,IAAT+X,EACJA,EAAOnC,EAAYkC,IAGgB,IAAxBlC,EAAYkC,KACvBjkI,EAAUmsH,EAAK,GACfuU,EAAUvvG,QAASg7F,EAAK,KAEzB,KACD,CAMH,IAAc,IAAT+X,EAGJ,GAAKA,GAAQnvI,EAAEqvI,OACdnrD,EAAWirD,EAAMjrD,QAEjB,IACCA,EAAWirD,EAAMjrD,EAClB,CAAE,MAAQ5uF,GACT,MAAO,CACNmY,MAAO,cACPoc,MAAOslH,EAAO75I,EAAI,sBAAwBkkB,EAAO,OAASvO,EAE5D,CAGH,CAIF,MAAO,CAAEwC,MAAO,UAAW/U,KAAMwrF,EAClC,CAgdcorD,CAAatvI,EAAGkkF,EAAU2nD,EAAOgD,GAGvCA,GAGC7uI,EAAEyuI,cACNK,EAAWjD,EAAMjmD,kBAAmB,oBAEnCntC,EAAO8zF,aAAce,GAAawB,IAEnCA,EAAWjD,EAAMjmD,kBAAmB,WAEnCntC,EAAO+zF,KAAMc,GAAawB,IAKZ,MAAXniH,GAA6B,SAAX3sB,EAAElR,KACxBs/I,EAAa,YAGS,MAAXzhH,EACXyhH,EAAa,eAIbA,EAAalqD,EAASz2E,MACtB0tE,EAAU+I,EAASxrF,KAEnBm2I,IADAhlH,EAAQq6D,EAASr6D,UAMlBA,EAAQukH,GACHzhH,GAAWyhH,IACfA,EAAa,QACRzhH,EAAS,IACbA,EAAS,KAMZk/G,EAAMl/G,OAASA,EACfk/G,EAAMuC,YAAeO,GAAoBP,GAAe,GAGnDS,EACJjb,EAASW,YAAaqZ,EAAiB,CAAEzyD,EAASizD,EAAYvC,IAE9DjY,EAASa,WAAYmZ,EAAiB,CAAE/B,EAAOuC,EAAYvkH,IAI5DgiH,EAAMkC,WAAYA,GAClBA,OAAat7I,EAERi7I,GACJG,EAAmBz9D,QAASy+D,EAAY,cAAgB,YACvD,CAAEhD,EAAO7rI,EAAG6uI,EAAY1zD,EAAUtxD,IAIpCikH,EAAiBta,SAAUoa,EAAiB,CAAE/B,EAAOuC,IAEhDV,IACJG,EAAmBz9D,QAAS,eAAgB,CAAEy7D,EAAO7rI,MAG3Cy4C,EAAO6zF,QAChB7zF,EAAO9mC,MAAMy+D,QAAS,aAGzB,CAEA,OAAOy7D,CACR,EAEA0D,QAAS,SAAU9iG,EAAK/zC,EAAMqlC,GAC7B,OAAO0a,EAAOpoD,IAAKo8C,EAAK/zC,EAAMqlC,EAAU,OACzC,EAEAyxG,UAAW,SAAU/iG,EAAK1O,GACzB,OAAO0a,EAAOpoD,IAAKo8C,OAAKh6C,EAAWsrC,EAAU,SAC9C,IAGD0a,EAAOjb,KAAM,CAAE,MAAO,QAAU,SAAUqpF,EAAIp7F,GAC7CgtB,EAAQhtB,GAAW,SAAUghB,EAAK/zC,EAAMqlC,EAAUjvC,GAUjD,OAPKwN,EAAY5D,KAChB5J,EAAOA,GAAQivC,EACfA,EAAWrlC,EACXA,OAAOjG,GAIDgmD,EAAO5rB,KAAM4rB,EAAOm0B,OAAQ,CAClCngC,IAAKA,EACL39C,KAAM28B,EACNigH,SAAU58I,EACV4J,KAAMA,EACNyiF,QAASp9C,GACP0a,EAAOz8C,cAAeywC,IAASA,GACnC,CACD,GAEAgM,EAAO00F,cAAe,SAAUntI,GAC/B,IAAIL,EACJ,IAAMA,KAAKK,EAAEu1E,QACa,iBAApB51E,EAAEgF,gBACN3E,EAAE6sI,YAAc7sI,EAAEu1E,QAAS51E,IAAO,GAGrC,GAGA84C,EAAOwmF,SAAW,SAAUxyF,EAAKvoC,EAASghH,GACzC,OAAOzsE,EAAO5rB,KAAM,CACnB4f,IAAKA,EAGL39C,KAAM,MACN48I,SAAU,SACV5wG,OAAO,EACP8xG,OAAO,EACPzjG,QAAQ,EAKR6jG,WAAY,CACX,cAAe,WAAY,GAE5BoC,WAAY,SAAUlrD,GACrBzrC,EAAO0tE,WAAYjiC,EAAUhgF,EAASghH,EACvC,GAEF,EAGAzsE,EAAOhQ,GAAGmkC,OAAQ,CACjB6iE,QAAS,SAAU/4H,GAClB,IAAI0yB,EAyBJ,OAvBKv6C,KAAM,KACLyN,EAAYoa,KAChBA,EAAOA,EAAK9nB,KAAMC,KAAM,KAIzBu6C,EAAOqP,EAAQ/hC,EAAM7nB,KAAM,GAAI43H,eAAgB1tH,GAAI,GAAIwoE,OAAO,GAEzD1yE,KAAM,GAAIivB,YACdsrB,EAAKh8B,aAAcve,KAAM,IAG1Bu6C,EAAKx3C,IAAK,WAGT,IAFA,IAAIolD,EAAOnoD,KAEHmoD,EAAKxpC,mBACZwpC,EAAOA,EAAKxpC,kBAGb,OAAOwpC,CACR,GAAI5+B,OAAQvpB,OAGNA,IACR,EAEA6gJ,UAAW,SAAUh5H,GACpB,OAAKpa,EAAYoa,GACT7nB,KAAK2uC,KAAM,SAAU79B,GAC3B84C,EAAQ5pD,MAAO6gJ,UAAWh5H,EAAK9nB,KAAMC,KAAM8Q,GAC5C,GAGM9Q,KAAK2uC,KAAM,WACjB,IAAI/oC,EAAOgkD,EAAQ5pD,MAClBygE,EAAW76D,EAAK66D,WAEZA,EAASx/D,OACbw/D,EAASmgF,QAAS/4H,GAGlBjiB,EAAK2jB,OAAQ1B,EAEf,EACD,EAEA0yB,KAAM,SAAU1yB,GACf,IAAIi5H,EAAiBrzI,EAAYoa,GAEjC,OAAO7nB,KAAK2uC,KAAM,SAAU79B,GAC3B84C,EAAQ5pD,MAAO4gJ,QAASE,EAAiBj5H,EAAK9nB,KAAMC,KAAM8Q,GAAM+W,EACjE,EACD,EAEAgyB,OAAQ,SAAUxM,GAIjB,OAHArtC,KAAKstC,OAAQD,GAAWqxF,IAAK,QAAS/vF,KAAM,WAC3Cib,EAAQ5pD,MAAO2xB,YAAa3xB,KAAKunB,WAClC,GACOvnB,IACR,IAID4pD,EAAOszE,KAAKzD,QAAQv1F,OAAS,SAAUikB,GACtC,OAAQyB,EAAOszE,KAAKzD,QAAQsnB,QAAS54F,EACtC,EACAyB,EAAOszE,KAAKzD,QAAQsnB,QAAU,SAAU54F,GACvC,SAAWA,EAAKxjC,aAAewjC,EAAKrjC,cAAgBqjC,EAAKksF,iBAAiBpzI,OAC3E,EAKA2oD,EAAO4zF,aAAaphH,IAAM,WACzB,IACC,OAAO,IAAIrrB,EAAO4sB,cACnB,CAAE,MAAQl3B,GAAK,CAChB,EAEA,IAAIu6I,GAAmB,CAGrB,EAAG,IAIH,KAAM,KAEPC,GAAer3F,EAAO4zF,aAAaphH,MAEpC25F,EAAQmrB,OAASD,IAAkB,oBAAqBA,GACxDlrB,EAAQ/3F,KAAOijH,KAAiBA,GAEhCr3F,EAAO20F,cAAe,SAAUlpI,GAC/B,IAAI65B,EAAUiyG,EAGd,GAAKprB,EAAQmrB,MAAQD,KAAiB5rI,EAAQoqI,YAC7C,MAAO,CACNthH,KAAM,SAAUuoD,EAASvpE,GACxB,IAAIrM,EACHsrB,EAAM/mB,EAAQ+mB,MAWf,GATAA,EAAI6B,KACH5oB,EAAQpV,KACRoV,EAAQuoC,IACRvoC,EAAQ0oI,MACR1oI,EAAQ+rI,SACR/rI,EAAQkqH,UAIJlqH,EAAQgsI,UACZ,IAAMvwI,KAAKuE,EAAQgsI,UAClBjlH,EAAKtrB,GAAMuE,EAAQgsI,UAAWvwI,GAmBhC,IAAMA,KAdDuE,EAAQwjF,UAAYz8D,EAAIkjH,kBAC5BljH,EAAIkjH,iBAAkBjqI,EAAQwjF,UAQzBxjF,EAAQoqI,aAAgB/4D,EAAS,sBACtCA,EAAS,oBAAuB,kBAItBA,EACVtqD,EAAI8B,iBAAkBptB,EAAG41E,EAAS51E,IAInCo+B,EAAW,SAAUjvC,GACpB,OAAO,WACDivC,IACJA,EAAWiyG,EAAgB/kH,EAAItC,OAC9BsC,EAAIrC,QAAUqC,EAAIklH,QAAUllH,EAAI05D,UAC/B15D,EAAIwB,mBAAqB,KAEb,UAAT39B,EACJm8B,EAAIC,QACgB,UAATp8B,EAKgB,iBAAfm8B,EAAI0B,OACf3gB,EAAU,EAAG,SAEbA,EAGCif,EAAI0B,OACJ1B,EAAImjH,YAINpiI,EACC6jI,GAAkB5kH,EAAI0B,SAAY1B,EAAI0B,OACtC1B,EAAImjH,WAK+B,UAAjCnjH,EAAI06D,cAAgB,SACM,iBAArB16D,EAAI2B,aACV,CAAEwjH,OAAQnlH,EAAIi5D,UACd,CAAE17B,KAAMv9B,EAAI2B,cACb3B,EAAIq5D,yBAIR,CACD,EAGAr5D,EAAItC,OAASoV,IACbiyG,EAAgB/kH,EAAIrC,QAAUqC,EAAI05D,UAAY5mD,EAAU,cAKnCtrC,IAAhBw4B,EAAIklH,QACRllH,EAAIklH,QAAUH,EAEd/kH,EAAIwB,mBAAqB,WAGA,IAAnBxB,EAAI1D,YAMR3nB,EAAOwO,WAAY,WACb2vB,GACJiyG,GAEF,EAEF,EAIDjyG,EAAWA,EAAU,SAErB,IAGC9S,EAAI+B,KAAM9oB,EAAQsqI,YAActqI,EAAQxL,MAAQ,KACjD,CAAE,MAAQpD,GAGT,GAAKyoC,EACJ,MAAMzoC,CAER,CACD,EAEA41B,MAAO,WACD6S,GACJA,GAEF,EAGH,GAMA0a,EAAO00F,cAAe,SAAUntI,GAC1BA,EAAEsuI,cACNtuI,EAAEsvD,SAAS61D,QAAS,EAEtB,GAGA1sE,EAAOw0F,UAAW,CACjBH,QAAS,CACR3nB,OAAQ,6FAGT71D,SAAU,CACT61D,OAAQ,2BAET6nB,WAAY,CACX,cAAe,SAAUxkF,GAExB,OADA/P,EAAO0tE,WAAY39D,GACZA,CACR,KAKF/P,EAAO00F,cAAe,SAAU,SAAUntI,QACxBvN,IAAZuN,EAAE86B,QACN96B,EAAE86B,OAAQ,GAEN96B,EAAEsuI,cACNtuI,EAAElR,KAAO,MAEX,GAGA2pD,EAAO20F,cAAe,SAAU,SAAUptI,GAIxC,IAAImlH,EAAQpnF,EADb,GAAK/9B,EAAEsuI,aAAetuI,EAAEqwI,YAEvB,MAAO,CACNrjH,KAAM,SAAU/6B,EAAG+Z,GAClBm5G,EAAS1sE,EAAQ,YACfC,KAAM14C,EAAEqwI,aAAe,CAAC,GACxB55F,KAAM,CAAE65F,QAAStwI,EAAEuwI,cAAex5H,IAAK/W,EAAEysC,MACzCpoC,GAAI,aAAc05B,EAAW,SAAU81C,GACvCsxC,EAAO37G,SACPu0B,EAAW,KACN81C,GACJ7nE,EAAuB,UAAb6nE,EAAI/kF,KAAmB,IAAM,IAAK+kF,EAAI/kF,KAElD,GAGDmR,EAASm2D,KAAK31D,YAAa0kH,EAAQ,GACpC,EACAj6F,MAAO,WACD6S,GACJA,GAEF,EAGH,GAKA,IAqGK79B,GArGDswI,GAAe,GAClBC,GAAS,oBAGVh4F,EAAOw0F,UAAW,CACjByD,MAAO,WACPC,cAAe,WACd,IAAI5yG,EAAWyyG,GAAal3I,OAAWm/C,EAAOutE,QAAU,IAAQjB,GAAM6B,OAEtE,OADA/3H,KAAMkvC,IAAa,EACZA,CACR,IAID0a,EAAO00F,cAAe,aAAc,SAAUntI,EAAG4wI,EAAkB/E,GAElE,IAAIgF,EAAcC,EAAaC,EAC9BC,GAAuB,IAAZhxI,EAAE0wI,QAAqBD,GAAOz9I,KAAMgN,EAAEysC,KAChD,MACkB,iBAAXzsC,EAAEtH,MAE6C,KADnDsH,EAAE6sI,aAAe,IACjB9sI,QAAS,sCACX0wI,GAAOz9I,KAAMgN,EAAEtH,OAAU,QAI5B,GAAKs4I,GAAiC,UAArBhxI,EAAE2rI,UAAW,GA8D7B,OA3DAkF,EAAe7wI,EAAE2wI,cAAgBr0I,EAAY0D,EAAE2wI,eAC9C3wI,EAAE2wI,gBACF3wI,EAAE2wI,cAGEK,EACJhxI,EAAGgxI,GAAahxI,EAAGgxI,GAAWh/I,QAASy+I,GAAQ,KAAOI,IAC/B,IAAZ7wI,EAAE0wI,QACb1wI,EAAEysC,MAASg9F,GAAOz2I,KAAMgN,EAAEysC,KAAQ,IAAM,KAAQzsC,EAAE0wI,MAAQ,IAAMG,GAIjE7wI,EAAEgtI,WAAY,eAAkB,WAI/B,OAHM+D,GACLt4F,EAAO5uB,MAAOgnH,EAAe,mBAEvBE,EAAmB,EAC3B,EAGA/wI,EAAE2rI,UAAW,GAAM,OAGnBmF,EAAclxI,EAAQixI,GACtBjxI,EAAQixI,GAAiB,WACxBE,EAAoBlhJ,SACrB,EAGAg8I,EAAMlY,OAAQ,gBAGQlhI,IAAhBq+I,EACJr4F,EAAQ74C,GAASgpI,WAAYiI,GAI7BjxI,EAAQixI,GAAiBC,EAIrB9wI,EAAG6wI,KAGP7wI,EAAE2wI,cAAgBC,EAAiBD,cAGnCH,GAAaj3I,KAAMs3I,IAIfE,GAAqBz0I,EAAYw0I,IACrCA,EAAaC,EAAmB,IAGjCA,EAAoBD,OAAcr+I,CACnC,GAGO,QAET,GAUAmyH,EAAQqsB,qBACH/wI,GAAOD,EAASixI,eAAeD,mBAAoB,IAAK/wI,MACvD2Z,UAAY,6BACiB,IAA3B3Z,GAAKkW,WAAWtmB,QAQxB2oD,EAAOm5E,UAAY,SAAUl5H,EAAM4sH,EAAS6rB,GAC3C,MAAqB,iBAATz4I,EACJ,IAEgB,kBAAZ4sH,IACX6rB,EAAc7rB,EACdA,GAAU,GAKLA,IAIAV,EAAQqsB,qBAMZp3F,GALAyrE,EAAUrlH,EAASixI,eAAeD,mBAAoB,KAKvC1wI,cAAe,SACzBwtH,KAAO9tH,EAAS01B,SAASo4F,KAC9BzI,EAAQlvD,KAAK31D,YAAao5C,IAE1ByrE,EAAUrlH,GAKZw5H,GAAW0X,GAAe,IAD1BC,EAAS5f,EAAWx7H,KAAM0C,IAKlB,CAAE4sH,EAAQ/kH,cAAe6wI,EAAQ,MAGzCA,EAAS5X,GAAe,CAAE9gI,GAAQ4sH,EAASmU,GAEtCA,GAAWA,EAAQ3pI,QACvB2oD,EAAQghF,GAAUjwH,SAGZivC,EAAOj6C,MAAO,GAAI4yI,EAAOh7H,cAlChC,IAAIyjC,EAAMu3F,EAAQ3X,CAmCnB,EAMAhhF,EAAOhQ,GAAGi1D,KAAO,SAAUjxD,EAAKsM,EAAQhb,GACvC,IAAI7B,EAAUptC,EAAMo1F,EACnBzvF,EAAO5F,KACPkW,EAAM0nC,EAAI1sC,QAAS,KAsDpB,OApDKgF,GAAO,IACXm3B,EAAWusG,GAAkBh8F,EAAI9wC,MAAOoJ,IACxC0nC,EAAMA,EAAI9wC,MAAO,EAAGoJ,IAIhBzI,EAAYy8C,IAGhBhb,EAAWgb,EACXA,OAAStmD,GAGEsmD,GAA4B,iBAAXA,IAC5BjqD,EAAO,QAIH2F,EAAK3E,OAAS,GAClB2oD,EAAO5rB,KAAM,CACZ4f,IAAKA,EAKL39C,KAAMA,GAAQ,MACd48I,SAAU,OACVhzI,KAAMqgD,IACHjwB,KAAM,SAAU8D,GAGnBs3D,EAAWr0F,UAEX4E,EAAKiiB,KAAMwlB,EAIVuc,EAAQ,SAAUrgC,OAAQqgC,EAAOm5E,UAAWhlG,IAAiBl5B,KAAMwoC,GAGnEtP,EAKF,GAAI+mG,OAAQ51F,GAAY,SAAU8tG,EAAOl/G,GACxCl4B,EAAK+oC,KAAM,WACVO,EAASxgC,MAAO1O,KAAMq1F,GAAY,CAAE2nD,EAAMj/G,aAAcD,EAAQk/G,GACjE,EACD,GAGMh9I,IACR,EAKA4pD,EAAOszE,KAAKzD,QAAQ5lG,SAAW,SAAUs0B,GACxC,OAAOyB,EAAOmtE,KAAMntE,EAAO2uF,OAAQ,SAAU3+F,GAC5C,OAAOuO,IAASvO,EAAGuO,IACpB,GAAIlnD,MACL,EAKA2oD,EAAOmZ,OAAS,CACfy/E,UAAW,SAAUr6F,EAAM9yC,EAASvE,GACnC,IAAI2xI,EAAaC,EAASC,EAAWC,EAAQC,EAAWC,EACvD1pH,EAAWwwB,EAAOlF,IAAKyD,EAAM,YAC7B46F,EAAUn5F,EAAQzB,GAClBt8C,EAAQ,CAAC,EAGQ,WAAbutB,IACJ+uB,EAAKhkC,MAAMiV,SAAW,YAGvBypH,EAAYE,EAAQhgF,SACpB4/E,EAAY/4F,EAAOlF,IAAKyD,EAAM,OAC9B26F,EAAal5F,EAAOlF,IAAKyD,EAAM,SACI,aAAb/uB,GAAwC,UAAbA,KAC9CupH,EAAYG,GAAa5xI,QAAS,SAAY,GAMhD0xI,GADAH,EAAcM,EAAQ3pH,YACDzb,IACrB+kI,EAAUD,EAAY3kI,OAGtB8kI,EAAStyI,WAAYqyI,IAAe,EACpCD,EAAUpyI,WAAYwyI,IAAgB,GAGlCr1I,EAAY4H,KAGhBA,EAAUA,EAAQtV,KAAMooD,EAAMr3C,EAAG84C,EAAOm0B,OAAQ,CAAC,EAAG8kE,KAGjC,MAAfxtI,EAAQsI,MACZ9R,EAAM8R,IAAQtI,EAAQsI,IAAMklI,EAAUllI,IAAQilI,GAE1B,MAAhBvtI,EAAQyI,OACZjS,EAAMiS,KAASzI,EAAQyI,KAAO+kI,EAAU/kI,KAAS4kI,GAG7C,UAAWrtI,EACfA,EAAQ2tI,MAAMjjJ,KAAMooD,EAAMt8C,GAG1Bk3I,EAAQr+F,IAAK74C,EAEf,GAGD+9C,EAAOhQ,GAAGmkC,OAAQ,CAGjBhb,OAAQ,SAAU1tD,GAGjB,GAAKrU,UAAUC,OACd,YAAmB2C,IAAZyR,EACNrV,KACAA,KAAK2uC,KAAM,SAAU79B,GACpB84C,EAAOmZ,OAAOy/E,UAAWxiJ,KAAMqV,EAASvE,EACzC,GAGF,IAAIwxD,EAAM2gF,EACT96F,EAAOnoD,KAAM,GAEd,OAAMmoD,EAQAA,EAAKksF,iBAAiBpzI,QAK5BqhE,EAAOna,EAAKjpC,wBACZ+jI,EAAM96F,EAAKyvE,cAAc6E,YAClB,CACN9+G,IAAK2kD,EAAK3kD,IAAMslI,EAAIvgF,YACpB5kD,KAAMwkD,EAAKxkD,KAAOmlI,EAAI7gF,cARf,CAAEzkD,IAAK,EAAGG,KAAM,QATxB,CAmBD,EAIAsb,SAAU,WACT,GAAMp5B,KAAM,GAAZ,CAIA,IAAI2Q,EAAcoyD,EAAQszD,EACzBluE,EAAOnoD,KAAM,GACbkjJ,EAAe,CAAEvlI,IAAK,EAAGG,KAAM,GAGhC,GAAwC,UAAnC8rC,EAAOlF,IAAKyD,EAAM,YAGtB4a,EAAS5a,EAAKjpC,4BAER,CAON,IANA6jD,EAAS/iE,KAAK+iE,SAIdszD,EAAMluE,EAAKyvE,cACXjnH,EAAew3C,EAAKx3C,cAAgB0lH,EAAIpvG,gBAChCtW,IACLA,IAAiB0lH,EAAIhlH,MAAQV,IAAiB0lH,EAAIpvG,kBACT,WAA3C2iC,EAAOlF,IAAK/zC,EAAc,aAE1BA,EAAeA,EAAase,WAExBte,GAAgBA,IAAiBw3C,GAAkC,IAA1Bx3C,EAAa3K,YAG1Dk9I,EAAet5F,EAAQj5C,GAAeoyD,UACzBplD,KAAOisC,EAAOlF,IAAK/zC,EAAc,kBAAkB,GAChEuyI,EAAaplI,MAAQ8rC,EAAOlF,IAAK/zC,EAAc,mBAAmB,GAEpE,CAGA,MAAO,CACNgN,IAAKolD,EAAOplD,IAAMulI,EAAavlI,IAAMisC,EAAOlF,IAAKyD,EAAM,aAAa,GACpErqC,KAAMilD,EAAOjlD,KAAOolI,EAAaplI,KAAO8rC,EAAOlF,IAAKyD,EAAM,cAAc,GArCzE,CAuCD,EAYAx3C,aAAc,WACb,OAAO3Q,KAAK+C,IAAK,WAGhB,IAFA,IAAI4N,EAAe3Q,KAAK2Q,aAEhBA,GAA2D,WAA3Ci5C,EAAOlF,IAAK/zC,EAAc,aACjDA,EAAeA,EAAaA,aAG7B,OAAOA,GAAgBsW,EACxB,EACD,IAID2iC,EAAOjb,KAAM,CAAEzb,WAAY,cAAeF,UAAW,eAAiB,SAAU4J,EAAQgrB,GACvF,IAAIjqC,EAAM,gBAAkBiqC,EAE5BgC,EAAOhQ,GAAIhd,GAAW,SAAU8nD,GAC/B,OAAOmiD,GAAQ7mI,KAAM,SAAUmoD,EAAMvrB,EAAQ8nD,GAG5C,IAAIu+D,EAOJ,GANKjtB,EAAU7tE,GACd86F,EAAM96F,EACuB,IAAlBA,EAAKniD,WAChBi9I,EAAM96F,EAAKs0E,kBAGC74H,IAAR8gF,EACJ,OAAOu+D,EAAMA,EAAKr7F,GAASO,EAAMvrB,GAG7BqmH,EACJA,EAAI9vH,SACFxV,EAAYslI,EAAI7gF,YAAVsiB,EACP/mE,EAAM+mE,EAAMu+D,EAAIvgF,aAIjBva,EAAMvrB,GAAW8nD,CAEnB,EAAG9nD,EAAQ8nD,EAAK1jF,UAAUC,OAC3B,CACD,GAQA2oD,EAAOjb,KAAM,CAAE,MAAO,QAAU,SAAUqpF,EAAIpwE,GAC7CgC,EAAO4qF,SAAU5sF,GAAS+pF,GAAc5b,EAAQ2c,cAC/C,SAAUvqF,EAAMjE,GACf,GAAKA,EAIJ,OAHAA,EAAWstF,GAAQrpF,EAAMP,GAGlBqpF,GAAU9sI,KAAM+/C,GACtB0F,EAAQzB,GAAO/uB,WAAYwuB,GAAS,KACpC1D,CAEH,EAEF,GAIA0F,EAAOjb,KAAM,CAAEw0G,OAAQ,SAAUC,MAAO,SAAW,SAAU9hJ,EAAMrB,GAClE2pD,EAAOjb,KAAM,CACZ6gB,QAAS,QAAUluD,EACnB6W,QAASlY,EACT,GAAI,QAAUqB,GACZ,SAAU+hJ,EAAcC,GAG1B15F,EAAOhQ,GAAI0pG,GAAa,SAAU3lF,EAAQx8D,GACzC,IAAI2lI,EAAY9lI,UAAUC,SAAYoiJ,GAAkC,kBAAX1lF,GAC5Do2E,EAAQsP,KAA6B,IAAX1lF,IAA6B,IAAVx8D,EAAiB,SAAW,UAE1E,OAAO0lI,GAAQ7mI,KAAM,SAAUmoD,EAAMloD,EAAMkB,GAC1C,IAAIk1H,EAEJ,OAAKL,EAAU7tE,GAGyB,IAAhCm7F,EAASpyI,QAAS,SACxBi3C,EAAM,QAAU7mD,GAChB6mD,EAAK/2C,SAAS6V,gBAAiB,SAAW3lB,GAIrB,IAAlB6mD,EAAKniD,UACTqwH,EAAMluE,EAAKlhC,gBAIJxe,KAAKC,IACXy/C,EAAK92C,KAAM,SAAW/P,GAAQ+0H,EAAK,SAAW/0H,GAC9C6mD,EAAK92C,KAAM,SAAW/P,GAAQ+0H,EAAK,SAAW/0H,GAC9C+0H,EAAK,SAAW/0H,UAIDsC,IAAVzC,EAGNyoD,EAAOlF,IAAKyD,EAAMloD,EAAM8zI,GAGxBnqF,EAAOzlC,MAAOgkC,EAAMloD,EAAMkB,EAAO4yI,EACnC,EAAG9zI,EAAM6mI,EAAYnpE,OAAS/5D,EAAWkjI,EAC1C,CACD,EACD,GAGAl9E,EAAOjb,KAAM,CACZ,YACA,WACA,eACA,YACA,cACA,YACE,SAAUqpF,EAAI/3H,GAChB2pD,EAAOhQ,GAAI35C,GAAS,SAAU25C,GAC7B,OAAO55C,KAAKwV,GAAIvV,EAAM25C,EACvB,CACD,GAKAgQ,EAAOhQ,GAAGmkC,OAAQ,CAEjB3qE,KAAM,SAAU7M,EAAOsD,EAAM+vC,GAC5B,OAAO55C,KAAKwV,GAAIjP,EAAO,KAAMsD,EAAM+vC,EACpC,EACArO,OAAQ,SAAUhlC,EAAOqzC,GACxB,OAAO55C,KAAKkW,IAAK3P,EAAO,KAAMqzC,EAC/B,EAEAhO,SAAU,SAAUyB,EAAU9mC,EAAOsD,EAAM+vC,GAC1C,OAAO55C,KAAKwV,GAAIjP,EAAO8mC,EAAUxjC,EAAM+vC,EACxC,EACA2pG,WAAY,SAAUl2G,EAAU9mC,EAAOqzC,GAGtC,OAA4B,IAArB54C,UAAUC,OAChBjB,KAAKkW,IAAKm3B,EAAU,MACpBrtC,KAAKkW,IAAK3P,EAAO8mC,GAAY,KAAMuM,EACrC,EAEA4pG,MAAO,SAAUC,EAAQC,GACxB,OAAO1jJ,KACLwV,GAAI,aAAciuI,GAClBjuI,GAAI,aAAckuI,GAASD,EAC9B,IAGD75F,EAAOjb,KACN,wLAE4D98B,MAAO,KACnE,SAAUmmH,EAAI12H,GAGbsoD,EAAOhQ,GAAIt4C,GAAS,SAAUuI,EAAM+vC,GACnC,OAAO54C,UAAUC,OAAS,EACzBjB,KAAKwV,GAAIlU,EAAM,KAAMuI,EAAM+vC,GAC3B55C,KAAKuhF,QAASjgF,EAChB,CACD,GAUD,IAAIkqG,GAAQ,sDAMZ5hD,EAAO+5F,MAAQ,SAAU/pG,EAAI68E,GAC5B,IAAI8R,EAAK14H,EAAM8zI,EAUf,GARwB,iBAAZltB,IACX8R,EAAM3uF,EAAI68E,GACVA,EAAU78E,EACVA,EAAK2uF,GAKA96H,EAAYmsC,GAalB,OARA/pC,EAAO/C,EAAM/M,KAAMiB,UAAW,GAC9B2iJ,EAAQ,WACP,OAAO/pG,EAAGlrC,MAAO+nH,GAAWz2H,KAAM6P,EAAK2wC,OAAQ1zC,EAAM/M,KAAMiB,YAC5D,EAGA2iJ,EAAM5rB,KAAOn+E,EAAGm+E,KAAOn+E,EAAGm+E,MAAQnuE,EAAOmuE,OAElC4rB,CACR,EAEA/5F,EAAOg6F,UAAY,SAAUC,GACvBA,EACJj6F,EAAO+8E,YAEP/8E,EAAO7uB,OAAO,EAEhB,EACA6uB,EAAOn9C,QAAU/H,MAAM+H,QACvBm9C,EAAOk6F,UAAYthI,KAAKC,MACxBmnC,EAAOzmC,SAAWA,EAClBymC,EAAOn8C,WAAaA,EACpBm8C,EAAOosE,SAAWA,EAClBpsE,EAAO09E,UAAYA,GACnB19E,EAAO3pD,KAAOs2H,EAEd3sE,EAAO/gD,IAAMD,KAAKC,IAElB+gD,EAAOm6F,UAAY,SAAU/kJ,GAK5B,IAAIiB,EAAO2pD,EAAO3pD,KAAMjB,GACxB,OAAkB,WAATiB,GAA8B,WAATA,KAK5ByV,MAAO1W,EAAMsR,WAAYtR,GAC5B,EAEA4qD,EAAOjnD,KAAO,SAAUg3D,GACvB,OAAe,MAARA,EACN,IACEA,EAAO,IAAKx2D,QAASqoG,GAAO,KAChC,OAoBE,KAFqB,EAAF,WACnB,OAAO5hD,CACP,UAFiB,OAEjB,aAMF,IAGCo6F,GAAUjzI,EAAO64C,OAGjBq6F,GAAKlzI,EAAO1M,EAwBb,OAtBAulD,EAAOs6F,WAAa,SAAU7/D,GAS7B,OARKtzE,EAAO1M,IAAMulD,IACjB74C,EAAO1M,EAAI4/I,IAGP5/D,GAAQtzE,EAAO64C,SAAWA,IAC9B74C,EAAO64C,OAASo6F,IAGVp6F,CACR,OAKyB,IAAb6rE,IACX1kH,EAAO64C,OAAS74C,EAAO1M,EAAIulD,GAMrBA,CACP,E,2BC19UA,IAAIvlD,EAAI,EAAQ,MACZoI,EAAU,EAAQ,MAClB03I,EAAgB,EAAQ,MACxBj7I,EAAW,EAAQ,IACnBk7I,EAAkB,EAAQ,MAC1B98F,EAAoB,EAAQ,MAC5B3T,EAAkB,EAAQ,MAC1Bif,EAAiB,EAAQ,MACzB5R,EAAkB,EAAQ,MAC1BkqB,EAA+B,EAAQ,KACvCm5E,EAAc,EAAQ,MAEtBC,EAAsBp5E,EAA6B,SAEnDhqB,EAAUF,EAAgB,WAC1BujG,EAAS7/I,MACTgE,EAAMD,KAAKC,IAKfrE,EAAE,CAAEjD,OAAQ,QAASuD,OAAO,EAAMC,QAAS0/I,GAAuB,CAChEx3I,MAAO,SAAe8C,EAAOmD,GAC3B,IAKIm6B,EAAa/jC,EAAQgG,EALrB6L,EAAI24B,EAAgB3zC,MACpBiB,EAASqmD,EAAkBtsC,GAC3BK,EAAI+oI,EAAgBx0I,EAAO3O,GAC3BujJ,EAAMJ,OAAwBxgJ,IAARmP,EAAoB9R,EAAS8R,EAAK9R,GAG5D,GAAIwL,EAAQuO,KACVkyB,EAAclyB,EAAE3a,aAEZ8jJ,EAAcj3G,KAAiBA,IAAgBq3G,GAAU93I,EAAQygC,EAAY/sC,aAEtE+I,EAASgkC,IAEE,QADpBA,EAAcA,EAAYgU,OAF1BhU,OAActpC,GAKZspC,IAAgBq3G,QAA0B3gJ,IAAhBspC,GAC5B,OAAOm3G,EAAYrpI,EAAGK,EAAGmpI,GAI7B,IADAr7I,EAAS,SAAqBvF,IAAhBspC,EAA4Bq3G,EAASr3G,GAAaxkC,EAAI87I,EAAMnpI,EAAG,IACxElM,EAAI,EAAGkM,EAAImpI,EAAKnpI,IAAKlM,IAASkM,KAAKL,GAAG43C,EAAezpD,EAAQgG,EAAG6L,EAAEK,IAEvE,OADAlS,EAAOlI,OAASkO,EACThG,CACT,G,2BC9CF7J,OAAO4B,eAAerC,EAAS,aAAc,CACzCsC,OAAO,IAEX7B,OAAO4B,eAAerC,EAAS,UAAW,CACtC0C,YAAY,EACZC,IAAK,WACD,OAAOijJ,CACX,IAEJ,MAAMC,EAA4B7iJ,EAAyB,EAAQ,OAC7D25C,EAAgB,EAAQ,MAC9B,SAAS35C,EAAyB7C,GAC9B,OAAOA,GAAOA,EAAID,WAAaC,EAAM,CACjCsB,QAAStB,EAEjB,CACA,SAASylJ,EAAchvG,GACnB,IAAIkvG,EACJ,MAAMC,GAAkG,QAAtFD,EAAkBlvG,aAA4C,EAAIA,EAAOihB,eAA8C,IAAzBiuF,EAA6BA,EAAkB,CAC3JD,EAAYpkJ,UACbwM,QAAQ6+B,UAAUk5G,QAASC,GAASL,EAAcK,aAAkBh/I,SAAWg/I,IAAWA,IACvFC,EAAW,CAEbC,+BAAgC,CAC5BvnG,MAAO,CACH+gB,UAAW,EAAG/gB,YAAW,CACjBmF,QAAS,eACNnF,EAAM,cAIzBkuB,sCAAuC,CACnCs5E,YAAa,CACT3sF,mBAAmB,EACnBK,eAAe,EACf0B,eAAe,EACfkE,oBAAoB,EACpBI,aAAa,EACbiB,aAAa,KAInBslF,EAAgB5lJ,OAAO8H,KAAK29I,GAAUjhJ,OAAQsxE,IAAU,EAAI55B,EAAcsD,aAAarJ,EAAQ2/B,IAAUryE,IAAKqyE,GAAU2vE,EAAS3vE,IACvI,MAAO,CACH3/B,KACGyvG,KACAN,EAEX,C,2BChDA,IAAI5yG,EAAc,EAAQ,MACtByE,EAAa,EAAQ,MACrB5E,EAAc,EAAQ,MACtBkV,EAAW,EAAQ,MACnBq8B,EAAoB,EAAQ,MAC5B9yB,EAA8B,EAAQ,MACtClwD,EAAS,EAAQ,MACjBgV,EAAsB,UACtBisC,EAAgB,EAAQ,MACxBqE,EAAW,EAAQ,KACnBziD,EAAW,EAAQ,KACnB+iE,EAAiB,EAAQ,MACzBm/E,EAAgB,EAAQ,MACxBC,EAAgB,EAAQ,MACxBzuG,EAAgB,EAAQ,MACxB7E,EAAQ,EAAQ,MAChBC,EAAS,EAAQ,MACjBK,EAAuB,gBACvByE,EAAa,EAAQ,MACrBmK,EAAkB,EAAQ,MAC1BqkG,EAAsB,EAAQ,MAC9BC,EAAkB,EAAQ,MAE1B7/F,EAAQzE,EAAgB,SACxBukG,EAAe9uG,EAAWp0C,OAC1BmoD,EAAkB+6F,EAAaplJ,UAC/BqlJ,EAAc/uG,EAAW+uG,YACzBr+I,EAAO0qC,EAAY2Y,EAAgBrjD,MACnC8jB,EAAS4mB,EAAY,GAAG5mB,QACxB9nB,EAAU0uC,EAAY,GAAG1uC,SACzBg+D,EAAgBtvB,EAAY,GAAG3gC,SAC/BshC,EAAcX,EAAY,GAAG/kC,OAE7B24I,EAAS,2CACTC,EAAM,KACNC,EAAM,KAGNC,EAAc,IAAIL,EAAaG,KAASA,EAExCG,EAAgBV,EAAcU,cAC9BC,EAAgBX,EAAcW,cAoFlC,GAAI/+F,EAAS,SAlFK/U,KACd4zG,GAAeC,GAAiBR,GAAuBC,GAAmBxzG,EAAM,WAIhF,OAHA6zG,EAAIlgG,IAAS,EAGN8/F,EAAaG,KAASA,GAAOH,EAAaI,KAASA,GAA0C,SAAnCt2I,OAAOk2I,EAAaG,EAAK,KAC5F,KA4EmC,CA4DnC,IA3DA,IAAIK,EAAgB,SAAgBloB,EAASnzE,GAC3C,IAKIs7F,EAAUn8C,EAAQo8C,EAAQC,EAAS/8I,EAAQyV,EAL3CunI,EAAe9kG,EAAcmJ,EAAiBxqD,MAC9ComJ,EAAkB1gG,EAASm4E,GAC3BwoB,OAA8BziJ,IAAV8mD,EACpB4wE,EAAS,GACTgrB,EAAazoB,EAGjB,IAAKsoB,GAAgBC,GAAmBC,GAAqBxoB,EAAQx9H,cAAgB0lJ,EACnF,OAAOloB,EA0CT,IAvCIuoB,GAAmB/kG,EAAcmJ,EAAiBqzE,MACpDA,EAAUA,EAAQv7H,OACd+jJ,IAAmB37F,EAAQsb,EAAesgF,KAGhDzoB,OAAsBj6H,IAAZi6H,EAAwB,GAAK56H,EAAS46H,GAChDnzE,OAAkB9mD,IAAV8mD,EAAsB,GAAKznD,EAASynD,GAC5C47F,EAAazoB,EAETwnB,GAAuB,WAAYK,IACrC77C,IAAWn/C,GAASyW,EAAczW,EAAO,MAAQ,KACrCA,EAAQvnD,EAAQunD,EAAO,KAAM,KAG3Cs7F,EAAWt7F,EAEPm7F,GAAiB,WAAYH,IAC/BO,IAAWv7F,GAASyW,EAAczW,EAAO,MAAQ,IACnCo7F,IAAep7F,EAAQvnD,EAAQunD,EAAO,KAAM,KAGxD46F,IACFY,EArFU,SAAUp4I,GAWxB,IAVA,IASIkwF,EATA/8F,EAAS6M,EAAO7M,OAChBqI,EAAQ,EACRH,EAAS,GACTo9I,EAAQ,GACR7/E,EAAQtmE,EAAO,MACfomJ,GAAW,EACXC,GAAM,EACNC,EAAU,EACVC,EAAY,GAETr9I,GAASrI,EAAQqI,IAAS,CAE/B,GAAY,QADZ00F,EAAM/yE,EAAOnd,EAAQxE,IAEnB00F,GAAO/yE,EAAOnd,IAAUxE,QACnB,GAAY,MAAR00F,EACTwoD,GAAW,OACN,IAAKA,EAAU,QAAQ,GAC5B,IAAa,MAARxoD,EACHwoD,GAAW,EACX,MACF,IAAa,MAARxoD,EAGH,GAFA70F,GAAU60F,EAEwC,OAA9CxrD,EAAY1kC,EAAQxE,EAAQ,EAAGA,EAAQ,GACzC,SAEEnC,EAAKs+I,EAAQjzG,EAAY1kC,EAAQxE,EAAQ,MAC3CA,GAAS,EACTm9I,GAAM,GAERC,IACA,SACF,IAAa,MAAR1oD,GAAeyoD,EAClB,GAAkB,KAAdE,GAAoB50G,EAAO20B,EAAOigF,GACpC,MAAM,IAAInB,EAAY,8BAExB9+E,EAAMigF,IAAa,EACnBJ,EAAMA,EAAMtlJ,QAAU,CAAC0lJ,EAAWD,GAClCD,GAAM,EACNE,EAAY,GACZ,SAEAF,EAAKE,GAAa3oD,EACjB70F,GAAU60F,CACjB,CAAE,MAAO,CAAC70F,EAAQo9I,EACpB,CAuCgBK,CAAU/oB,GACpBA,EAAUqoB,EAAQ,GAClB5qB,EAAS4qB,EAAQ,IAGnB/8I,EAASi6E,EAAkBmiE,EAAa1nB,EAASnzE,GAAQy7F,EAAenmJ,KAAOwqD,EAAiBu7F,IAE5Fl8C,GAAUo8C,GAAU3qB,EAAOr6H,UAC7B2d,EAAQwzB,EAAqBjpC,GACzB0gG,IACFjrF,EAAMirF,QAAS,EACfjrF,EAAMkjC,IAAMikG,EAxHD,SAAUj4I,GAM3B,IALA,IAIIkwF,EAJA/8F,EAAS6M,EAAO7M,OAChBqI,EAAQ,EACRH,EAAS,GACTq9I,GAAW,EAERl9I,GAASrI,EAAQqI,IAEV,QADZ00F,EAAM/yE,EAAOnd,EAAQxE,IAKhBk9I,GAAoB,MAARxoD,GAGH,MAARA,EACFwoD,GAAW,EACM,MAARxoD,IACTwoD,GAAW,GACXr9I,GAAU60F,GANZ70F,GAAU,WAJVA,GAAU60F,EAAM/yE,EAAOnd,IAAUxE,GAYnC,OAAOH,CACX,CAkGkC09I,CAAahpB,GAAUmoB,IAE/CC,IAAQrnI,EAAMqnI,QAAS,GACvB3qB,EAAOr6H,SAAQ2d,EAAM08G,OAASA,IAGhCuC,IAAYyoB,EAAY,IAE1Bh2F,EAA4BnnD,EAAQ,SAAyB,KAAfm9I,EAAoB,OAASA,EAC7E,CAAE,MAAOtrH,GAAqB,CAE9B,OAAO7xB,CACT,EAES/B,EAAOgO,EAAoBmwI,GAAej8I,EAAQ,EAAGlC,EAAKnG,OAASqI,GAC1E87I,EAAcW,EAAeR,EAAcn+I,EAAKkC,MAGlDkhD,EAAgBnqD,YAAc0lJ,EAC9BA,EAAc5lJ,UAAYqqD,EAC1B7T,EAAcF,EAAY,SAAUsvG,EAAe,CAAE1lJ,aAAa,GACpE,CAGAw2C,EAAW,S,2BClMXh4C,EAAQE,YAAa,EACrBF,EAAQioJ,OAASA,EACjBjoJ,EAAQkoJ,gBAAkBA,EAC1BloJ,EAAQmoJ,cAgDR,SAAuBp4G,GACrB,OAAOq4G,EAASr4G,KAAUm4G,EAAgBn4G,EAC5C,EAjDA/vC,EAAQqoJ,YAmDR,SAAqBt4G,GACnB,SAAUk4G,EAAOl4G,KAASA,EAAKQ,KACjC,EApDAvwC,EAAQsoJ,YAsDR,SAAqBv4G,GACnB,OAAOw4G,EAAYx4G,IAASy4G,EAAMz4G,EACpC,EAvDA/vC,EAAQyoJ,YAAczoJ,EAAQwoJ,MAAQxoJ,EAAQ0oJ,SAAW1oJ,EAAQ2oJ,WAAa3oJ,EAAQ0jE,OAAS1jE,EAAQooJ,SAAWpoJ,EAAQ4oJ,UAAY5oJ,EAAQ00C,aAAe10C,EAAQ6oJ,UAAY7oJ,EAAQ8oJ,aAAe9oJ,EAAQ+oJ,YAAc/oJ,EAAQuoJ,iBAAmB,EAEzP,IAEIS,EAFA3oJ,EAAS,EAAQ,MAIjB4oJ,IAAWD,EAAW,CAAC,GAAY3oJ,EAAOqwC,YAAa,EAAMs4G,EAAS3oJ,EAAOwwC,QAAS,EAAMm4G,EAAS3oJ,EAAO2wC,aAAc,EAAMg4G,EAAS3oJ,EAAO8wC,UAAW,EAAM63G,EAAS3oJ,EAAOixC,KAAM,EAAM03G,EAAS3oJ,EAAOoxC,UAAW,EAAMu3G,EAAS3oJ,EAAOuxC,SAAU,EAAMo3G,EAAS3oJ,EAAOynE,OAAQ,EAAMkhF,EAAS3oJ,EAAO0nE,WAAY,EAAMihF,EAAS3oJ,EAAO2nE,SAAU,EAAMghF,EAAS3oJ,EAAOgB,MAAO,EAAM2nJ,EAAS3oJ,EAAO4xC,YAAa,EAAM+2G,GAEla,SAASf,EAAOl4G,GACd,MAAuB,iBAATA,GAAqBk5G,EAAQl5G,EAAK3uC,KAClD,CAEA,SAAS8nJ,EAAW9nJ,EAAM2uC,GACxB,OAAOk4G,EAAOl4G,IAASA,EAAK3uC,OAASA,CACvC,CAEA,IAAImnJ,EAAcW,EAAW30I,KAAK,KAAMlU,EAAOqwC,WAC/C1wC,EAAQuoJ,YAAcA,EACtB,IAAIQ,EAAcG,EAAW30I,KAAK,KAAMlU,EAAOwwC,OAC/C7wC,EAAQ+oJ,YAAcA,EACtB,IAAID,EAAeI,EAAW30I,KAAK,KAAMlU,EAAO2wC,YAChDhxC,EAAQ8oJ,aAAeA,EACvB,IAAID,EAAYK,EAAW30I,KAAK,KAAMlU,EAAO8wC,SAC7CnxC,EAAQ6oJ,UAAYA,EACpB,IAAIn0G,EAAew0G,EAAW30I,KAAK,KAAMlU,EAAOixC,IAChDtxC,EAAQ00C,aAAeA,EACvB,IAAIk0G,EAAYM,EAAW30I,KAAK,KAAMlU,EAAOoxC,SAC7CzxC,EAAQ4oJ,UAAYA,EACpB,IAAIR,EAAWc,EAAW30I,KAAK,KAAMlU,EAAOuxC,QAC5C5xC,EAAQooJ,SAAWA,EACnB,IAAI1kF,EAASwlF,EAAW30I,KAAK,KAAMlU,EAAOynE,MAC1C9nE,EAAQ0jE,OAASA,EACjB,IAAIilF,EAAaO,EAAW30I,KAAK,KAAMlU,EAAO0nE,UAC9C/nE,EAAQ2oJ,WAAaA,EACrB,IAAID,EAAWQ,EAAW30I,KAAK,KAAMlU,EAAO2nE,QAC5ChoE,EAAQ0oJ,SAAWA,EACnB,IAAIF,EAAQU,EAAW30I,KAAK,KAAMlU,EAAOgB,KACzCrB,EAAQwoJ,MAAQA,EAChB,IAAIC,EAAcS,EAAW30I,KAAK,KAAMlU,EAAO4xC,WAG/C,SAASi2G,EAAgBn4G,GACvB,OAAOq4G,EAASr4G,IAASA,EAAKztC,QAAUytC,EAAKztC,MAAM6C,WAAW,OAAsC,YAA7B4qC,EAAKztC,MAAM2U,eAA4D,WAA7B84B,EAAKztC,MAAM2U,eAA2D,kBAA7B84B,EAAKztC,MAAM2U,eAAkE,gBAA7B84B,EAAKztC,MAAM2U,cACvN,CAJAjX,EAAQyoJ,YAAcA,C,uBC7CtB,IAAIU,EAAiC,iBAAZ52I,UAAwBA,SAAS/P,IAK1DzC,EAAOC,aAAgC,IAAfmpJ,QAA8CpkJ,IAAhBokJ,EAA4B,SAAUnnJ,GAC1F,MAA0B,mBAAZA,GAA0BA,IAAamnJ,CACvD,EAAI,SAAUnnJ,GACZ,MAA0B,mBAAZA,CAChB,C,yBCTAhC,EAAQE,YAAa,EACrBF,EAAQu0D,WAAav0D,EAAQw5E,KAAOx5E,EAAQs0D,QAAUt0D,EAAQoqD,IAAMpqD,EAAQq3E,IAAMr3E,EAAQo3E,QAAUp3E,EAAQm3E,KAAOn3E,EAAQk3E,GAAKl3E,EAAQopJ,UAAYppJ,EAAQqpJ,KAAOrpJ,EAAQq7E,MAAQr7E,EAAQspJ,YAActpJ,EAAQupJ,YAAcvpJ,EAAQsgE,MAAQtgE,EAAQwpJ,YAAcxpJ,EAAQmmI,KAAOnmI,EAAQi6E,OAASj6E,EAAQypJ,KAAOzpJ,EAAQo6E,MAAQp6E,EAAQ0pJ,MAAQ1pJ,EAAQk6E,OAASl6E,EAAQo5E,YAAcp5E,EAAQo+E,WAAap+E,EAAQ88E,iBAAmB98E,EAAQ68E,gBAAkB78E,EAAQs+E,UAAYt+E,EAAQo9E,MAAQp9E,EAAQ27E,MAAQ37E,EAAQ+0B,GAAK/0B,EAAQg6E,SAAWh6E,EAAQq+E,eAAiB,EAGljBr+E,EAAQq+E,UAFQ,GAKhBr+E,EAAQg6E,SAFO,GAKfh6E,EAAQ+0B,GAFC,GAKT/0B,EAAQ27E,MAFI,GAKZ37E,EAAQo9E,MAFI,GAKZp9E,EAAQs+E,UAFQ,GAKhBt+E,EAAQ68E,gBAFc,GAKtB78E,EAAQ88E,iBAFe,GAKvB98E,EAAQo+E,WAFS,GAKjBp+E,EAAQo5E,YAFU,GAKlBp5E,EAAQk6E,OAFK,GAKbl6E,EAAQ0pJ,MAFI,IAKZ1pJ,EAAQo6E,MAFI,GAKZp6E,EAAQypJ,KAFG,GAKXzpJ,EAAQi6E,OAFK,GAKbj6E,EAAQmmI,KAFG,IAKXnmI,EAAQwpJ,YAFU,GAKlBxpJ,EAAQsgE,MAFI,GAKZtgE,EAAQupJ,YAFU,GAKlBvpJ,EAAQspJ,YAFU,GAKlBtpJ,EAAQq7E,MAFI,GAKZr7E,EAAQqpJ,KAFG,GAKXrpJ,EAAQopJ,UAFQ,GAKhBppJ,EAAQk3E,GAFC,GAKTl3E,EAAQm3E,KAFG,GAKXn3E,EAAQo3E,QAFM,GAMdp3E,EAAQq3E,IAHE,EAMVr3E,EAAQoqD,IA9BU,GAgClBpqD,EAAQs0D,SADO,EAGft0D,EAAQw5E,MADI,EAGZx5E,EAAQu0D,YADU,C,2BC5FlB9zD,OAAO4B,eAAerC,EAAS,aAAc,CACzCsC,OAAO,IAEX7B,OAAO4B,eAAerC,EAAS,UAAW,CACtC0C,YAAY,EACZC,IAAK,WACD,OAAOm0C,CACX,IAEJ,MAAM4L,EAAqB1/C,EAAyB,EAAQ,OAC5D,SAASA,EAAyB7C,GAC9B,OAAOA,GAAOA,EAAID,WAAaC,EAAM,CACjCsB,QAAStB,EAEjB,CACA,SAAS2jB,GAAK,QAAE0gD,EAAQ,KAAErvD,EAAK,GAAE8oD,IAC7Bvb,EAAKjhD,QAAQqiB,KAAK,GAAG3O,kBAAsB,CACvC,sBAAsBqvD,QAAcrvD,6BAAgC8oD,OACpE,2DAER,CACA,MAAMnnB,EAAW,CACbujB,QAAS,UACT98C,QAAS,eACT+8C,YAAa,cACbC,MAAO,OACPlM,MAAO,OACPD,MAAO,CACH,GAAI,UACJ,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,WAETE,KAAM,CACF,GAAI,UACJ,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,WAETC,KAAM,CACF,GAAI,UACJ,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,WAETC,QAAS,CACL,GAAI,UACJ,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,WAETC,MAAO,CACH,GAAI,UACJ,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,WAETC,IAAK,CACD,GAAI,UACJ,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,WAETC,OAAQ,CACJ,GAAI,UACJ,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,WAETC,MAAO,CACH,GAAI,UACJ,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,WAETC,OAAQ,CACJ,GAAI,UACJ,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,WAETC,KAAM,CACF,GAAI,UACJ,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,WAETC,MAAO,CACH,GAAI,UACJ,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,WAETC,QAAS,CACL,GAAI,UACJ,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,WAETC,KAAM,CACF,GAAI,UACJ,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,WAETC,KAAM,CACF,GAAI,UACJ,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,WAETC,IAAK,CACD,GAAI,UACJ,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,WAETC,KAAM,CACF,GAAI,UACJ,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,WAETC,OAAQ,CACJ,GAAI,UACJ,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,WAETC,OAAQ,CACJ,GAAI,UACJ,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,WAETC,OAAQ,CACJ,GAAI,UACJ,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,WAETC,QAAS,CACL,GAAI,UACJ,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,WAETC,KAAM,CACF,GAAI,UACJ,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,WAETC,KAAM,CACF,GAAI,UACJ,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,WAET,aAAIi6F,GAMA,OALA7lI,EAAK,CACD0gD,QAAS,OACTrvD,KAAM,YACN8oD,GAAI,QAED98D,KAAKguD,GAChB,EACA,YAAIy6F,GAMA,OALA9lI,EAAK,CACD0gD,QAAS,OACTrvD,KAAM,WACN8oD,GAAI,UAED98D,KAAKstD,KAChB,EACA,YAAIo7F,GAMA,OALA/lI,EAAK,CACD0gD,QAAS,OACTrvD,KAAM,WACN8oD,GAAI,YAED98D,KAAKqtD,OAChB,EACA,YAAIs7F,GAMA,OALAhmI,EAAK,CACD0gD,QAAS,OACTrvD,KAAM,WACN8oD,GAAI,SAED98D,KAAKmtD,IAChB,EACA,YAAIy7F,GAMA,OALAjmI,EAAK,CACD0gD,QAAS,OACTrvD,KAAM,WACN8oD,GAAI,UAED98D,KAAKitD,KAChB,E,2BChWJ,IAAIjb,EAAc,EAAQ,MACtB62G,EAAiB,EAAQ,MACzBC,EAA0B,EAAQ,MAClCtoJ,EAAW,EAAQ,MACnBuoJ,EAAgB,EAAQ,MAExBpoJ,EAAaC,UAEbooJ,EAAkB1pJ,OAAO4B,eAEzB+nJ,EAA4B3pJ,OAAO+sC,yBACnC68G,EAAa,aACb90G,EAAe,eACf+0G,EAAW,WAIftqJ,EAAQqW,EAAI88B,EAAc82G,EAA0B,SAAwB9tI,EAAGJ,EAAGwuI,GAIhF,GAHA5oJ,EAASwa,GACTJ,EAAImuI,EAAcnuI,GAClBpa,EAAS4oJ,GACQ,mBAANpuI,GAA0B,cAANJ,GAAqB,UAAWwuI,GAAcD,KAAYC,IAAeA,EAAWD,GAAW,CAC5H,IAAI/sI,EAAU6sI,EAA0BjuI,EAAGJ,GACvCwB,GAAWA,EAAQ+sI,KACrBnuI,EAAEJ,GAAKwuI,EAAWjoJ,MAClBioJ,EAAa,CACXn3I,aAAcmiC,KAAgBg1G,EAAaA,EAAWh1G,GAAgBh4B,EAAQg4B,GAC9E7yC,WAAY2nJ,KAAcE,EAAaA,EAAWF,GAAc9sI,EAAQ8sI,GACxEh3I,UAAU,GAGhB,CAAE,OAAO82I,EAAgBhuI,EAAGJ,EAAGwuI,EACjC,EAAIJ,EAAkB,SAAwBhuI,EAAGJ,EAAGwuI,GAIlD,GAHA5oJ,EAASwa,GACTJ,EAAImuI,EAAcnuI,GAClBpa,EAAS4oJ,GACLP,EAAgB,IAClB,OAAOG,EAAgBhuI,EAAGJ,EAAGwuI,EAC/B,CAAE,MAAOpuH,GAAqB,CAC9B,GAAI,QAASouH,GAAc,QAASA,EAAY,MAAM,IAAIzoJ,EAAW,2BAErE,MADI,UAAWyoJ,IAAYpuI,EAAEJ,GAAKwuI,EAAWjoJ,OACtC6Z,CACT,C,2BC1CA,IAAIq2B,EAAa,EAAQ,MAErBg4G,EAAgB,SAAUt/I,GAC5B,MAAO,CACLA,KAAMA,EACNS,IAAK,WACH,OAAO,CACT,EACApD,KAAM,WACJ,MAAO,CACLwjB,KAAM,WACJ,MAAO,CAAEqP,MAAM,EACjB,EAEJ,EAEJ,EAEIqvH,EAAgC,SAAUv/I,GAC5C,MAAO,CACLA,KAAMA,EACNS,IAAK,WACH,OAAO,CACT,EACApD,KAAM,WACJ,MAAM,IAAIwP,MAAM,IAClB,EAEJ,EAEAhY,EAAOC,QAAU,SAAUyC,EAAM4tC,GAC/B,IAAI/hB,EAAMkkB,EAAW,OACrB,KACE,IAAIlkB,GAAM7rB,GAAM+nJ,EAAc,IAC9B,IAME,OADA,IAAIl8H,GAAM7rB,GAAM+nJ,GAAe,KACxB,CACT,CAAE,MAAO30F,GACP,IAAKxlB,EAAU,OAAO,EAGtB,IAEE,OADA,IAAI/hB,GAAM7rB,GAAMgoJ,GAA8B,OACvC,CACT,CAAE,MAAOtuH,GAEP,OAAOkU,EADG,IAAI/hB,EAAI,CAAC,EAAG,IACF7rB,GAAMgoJ,EAA8Bz7E,MAC1D,CACF,CACF,CAAE,MAAO7yC,GACP,OAAO,CACT,CACF,C,8jFCpDA,MAAMuuH,EAAW,MAQXC,EAAQ,CAAEC,KAAM,EAAGC,OAAQ,EAAGC,MAAO,EAAGC,OAAQ,EAAGC,MAAO,EAAGC,IAAK,GAQlEC,EAAQ,CAAEH,OAAQ,EAAGE,IAAK,EAAGE,UAAW,EAAGC,aAAc,GAQzDC,EAAe,EAQfC,EAAe,EAQfC,EAAgB,EAwBhBC,EAAe,EASfC,EAAmB,EASnBC,EAAe,EAQfC,EAAY,EAQZC,EAAW,EAQXC,EAAa,EASbC,EAAa,EAQbC,EAAiB,EAQjBC,EAAmB,EAQnBC,EAAsB,EAQtBC,EAAmB,EAQnBC,EAAiB,EAQjBC,EAAc,IAQdC,EAAmB,IAQnBC,EAA0B,IAQ1BC,EAAc,IAQdC,EAAc,IAQdC,EAAa,IAQbC,EAAY,IAQZC,EAAiB,IAQjBC,EAAyB,IAQzBC,EAAiB,IAQjBC,EAAyB,IAQzBC,EAAiB,IAQjBC,EAAyB,IAQzBC,EAAiB,IAQjBC,EAAyB,IAUzBC,EAAyB,IAQzBC,EAAsB,IAQtBC,EAA8B,IAQ9BC,EAAsB,IAQtBC,EAA8B,IAQ9BC,EAAa,EAQbC,EAAc,EAQdC,EAAY,EAQZC,EAAiB,EAQjBC,EAAa,EAQbC,EAAoB,EAQpBC,EAAe,EAQfC,EAAgB,EAQhBC,EAAoB,EAQpBC,EAAe,EAQfC,EAAe,EAQfC,EAAgB,EAQhBC,EAAoB,EAQpBC,GAAsB,EAQtBC,GAAoB,EAQpBC,GAAwB,EAUxBC,GAAoB,EAQpBC,GAAiB,EAUjBC,GAAqB,EAQrBC,GAAmB,WAyBnBC,GAAwB,IAQxBC,GAAwB,IAQxBC,GAAmC,IAQnCC,GAAmC,IAQnCC,GAA0B,IAQ1BC,GAAiB,IAQjBC,GAAsB,KAQtBC,GAAyB,KASzBC,GAAgB,KAUhBC,GAA6B,KAW7BC,GAA4B,KAW5BC,GAAe,KAUfC,GAA4B,KAW5BC,GAA2B,KAS3BC,GAAmB,KAQnBC,GAAW,KAQXC,GAAY,KAQZC,GAAoB,KAQpBC,GAAU,KAQVC,GAAkB,KAQlBC,GAAY,KAQZC,GAAgB,KAQhBC,GAAwB,KAQxBC,GAAwB,KAQxBC,GAAqB,KAQrBC,GAAsB,MAQtBC,GAAwB,MAQxBC,GAAc,KAQdC,GAAY,KAQZC,GAAa,KAQbC,GAAc,KASdC,GAAqB,KAQrBC,GAAY,KAQZC,GAAmB,KAQnBC,GAAW,KAQXC,GAAkB,KAgBlBC,GAAoB,KAQpBC,GAAuB,MAQvBC,GAAwB,MAQxBC,GAAwB,MASxBC,GAAwB,MAQxBC,GAA0B,MAQ1BC,GAA0B,MAQ1BC,GAA2B,MAQ3BC,GAA2B,MAQ3BC,GAAkB,MAQlBC,GAAkB,MAQlBC,GAAuB,MAQvBC,GAAuB,MAQvBC,GAAuB,MAQvBC,GAAuB,MAQvBC,GAAuB,MAQvBC,GAAuB,MAQvBC,GAAuB,MAQvBC,GAAuB,MAQvBC,GAAuB,MAQvBC,GAAwB,MAQxBC,GAAwB,MAQxBC,GAAwB,MAQxBC,GAAyB,MAQzBC,GAAyB,MAQzBC,GAAyB,MAQzBC,GAAmB,MAQnBC,GAAyB,MAQzBC,GAA2B,MAQ3BC,GAAmB,MAQnBC,GAA0B,MAQ1BC,GAAyB,MAQzBC,GAAgC,MAkChCC,GAAsB,KAQtBC,GAAoB,KAQpBC,GAAoB,KAiDpBC,GAAoB,EAQpBC,GAAwB,EAQxBC,GAAsB,EAgBtBC,GAAmB,KAwBnBC,GAAwB,EAQxBC,GAAuB,EAUvBC,GAAe,GAQfC,GAAiB,OAQjBC,GAAuB,cAQvBC,GAAiB,SAQjBC,GAAe,OAgBfC,GAAgB,KA0HhBC,GAAe,IAQfC,GAAc,IAQdC,GAAe,IAQfC,GAAmB,IAQnBC,GAAiB,IAQjBC,GAAkB,IAQlBC,GAAsB,IAQtBC,GAAgB,IAShBC,GAAkB,MAwFlBC,GAAQ,SAQRC,GAAwB,IAQxBC,GAAyB,KAyF/B,SAASC,GAAkBlpJ,GAI1B,IAAM,IAAIuG,EAAIvG,EAAMtJ,OAAS,EAAG6P,GAAK,IAAMA,EAE1C,GAAKvG,EAAOuG,IAAO,MAAQ,OAAO,EAInC,OAAO,CAER,CAoBA,SAAS4iJ,GAAiBpyJ,GAEzB,OAAO8P,SAASsiJ,gBAAiB,+BAAgCpyJ,EAElE,CAEA,SAASqyJ,KAER,MAAM3hE,EAAS0hE,GAAiB,UAEhC,OADA1hE,EAAO7tE,MAAMoB,QAAU,QAChBysE,CAER,CA7BYkuB,UACCv4G,WACOisJ,kBACPzzC,WACCC,YACDyzC,WACCxzC,YACCC,aACAwzC,aAuBf,MAAMC,GAAS,CAAC,EAgBhB,SAAS1/E,MAAQnqB,GAEhB,MAAM+K,EAAU,SAAW/K,EAAOqK,QAQjC7xC,QAAQ2xD,IAAKpf,KAAY/K,EAI3B,CAEA,SAASvnC,MAASunC,GAEjB,MAAM+K,EAAU,SAAW/K,EAAOqK,QAQjC7xC,QAAQC,KAAMsyC,KAAY/K,EAI5B,CAEA,SAASlvB,MAAUkvB,GAElB,MAAM+K,EAAU,SAAW/K,EAAOqK,QAQjC7xC,QAAQsY,MAAOi6B,KAAY/K,EAI7B,CAEA,SAAS8pG,MAAa9pG,GAErB,MAAM+K,EAAU/K,EAAOzmD,KAAM,KAExBwxD,KAAW8+F,KAEhBA,GAAQ9+F,IAAY,EAEpBtyC,MAASunC,GAEV,CAEA,SAAS+pG,GAAYC,EAAIC,EAAM9d,GAE9B,OAAO,IAAIz8G,QAAS,SAAWuR,EAAS8J,GAqBvC11B,WAnBA,SAAS60I,IAER,OAASF,EAAGG,eAAgBF,EAAMD,EAAGI,wBAAyB,IAE7D,KAAKJ,EAAGK,YACPt/G,IACA,MAED,KAAKi/G,EAAGM,gBACPj1I,WAAY60I,EAAO/d,GACnB,MAED,QACClrG,IAIH,EAEmBkrG,EAEpB,EAED,CAwBA,MAAMoe,GAQL,gBAAAphJ,CAAkBpT,EAAM6sE,QAEElpE,IAApB5D,KAAK00J,aAA2B10J,KAAK00J,WAAa,CAAC,GAExD,MAAM1nF,EAAYhtE,KAAK00J,gBAEI9wJ,IAAtBopE,EAAW/sE,KAEf+sE,EAAW/sE,GAAS,KAI2B,IAA3C+sE,EAAW/sE,GAAOiR,QAAS47D,IAE/BE,EAAW/sE,GAAOyK,KAAMoiE,EAI1B,CASA,gBAAA6nF,CAAkB10J,EAAM6sE,GAEvB,MAAME,EAAYhtE,KAAK00J,WAEvB,YAAmB9wJ,IAAdopE,QAEwBppE,IAAtBopE,EAAW/sE,KAAmE,IAA3C+sE,EAAW/sE,GAAOiR,QAAS47D,EAEtE,CAQA,mBAAA14D,CAAqBnU,EAAM6sE,GAE1B,MAAME,EAAYhtE,KAAK00J,WAEvB,QAAmB9wJ,IAAdopE,EAA0B,OAE/B,MAAM4nF,EAAgB5nF,EAAW/sE,GAEjC,QAAuB2D,IAAlBgxJ,EAA8B,CAElC,MAAMtrJ,EAAQsrJ,EAAc1jJ,QAAS47D,IAErB,IAAXxjE,GAEJsrJ,EAAc1sJ,OAAQoB,EAAO,EAI/B,CAED,CAOA,aAAAqmB,CAAe7M,GAEd,MAAMkqD,EAAYhtE,KAAK00J,WAEvB,QAAmB9wJ,IAAdopE,EAA0B,OAE/B,MAAM4nF,EAAgB5nF,EAAWlqD,EAAM7iB,MAEvC,QAAuB2D,IAAlBgxJ,EAA8B,CAElC9xI,EAAM1hB,OAASpB,KAGf,MAAMuK,EAAQqqJ,EAAc9nJ,MAAO,GAEnC,IAAM,IAAIgE,EAAI,EAAG+B,EAAItI,EAAMtJ,OAAQ6P,EAAI+B,EAAG/B,IAEzCvG,EAAOuG,GAAI/Q,KAAMC,KAAM8iB,GAIxBA,EAAM1hB,OAAS,IAEhB,CAED,EAID,MAAMyzJ,GAAO,CAAE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM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AAiB,CACfC,QAAS,kCACTE,QAAS,kCACTD,MAAO,iCAEThG,qBAAsB,CACpBuB,KAAM,SACNG,QAAS,SAEXgD,mBAAoB,CAClBjoH,OAAQ,OACRl9H,MAAO,OACPC,OAAQ,OACRiqP,MAAO,QAETC,uBAAwB,CACtB,MAAOlkB,EAAOmkB,6CAId,MAAOnkB,EAAOokB,oDAEhB/H,cAAe,CACb,kBACA,kBACA,0BACA,2BACA,kBACA,qBACA,qBACA,yBACA,8BACA,0BACA,qBACA,aACA,aACA,QACA,YACA,OACA,cACA,YACA,mBACA,eACA,aACA,eACA,0BACA,oBACA,0BACA,yBACA,uBACA,cACA,iBACA,cACA,SACA,aACA,eACA,gBACA,cACA,UACA,UACA,UACA,cACA,gBACA,iBACA,eACA,aACA,cACA,cAEFU,cAAe,CACbtM,eAAgB,CACdxtP,KAAM,kBACNwsM,MAAO,mBAET7vJ,OAAQ,CACN38C,KAAM,qBACNwsM,MAAO,sBAETsjD,IAAK,CACH9vP,KAAM,MACNwsM,MAAO,OAETqjD,eAAgB,CACd7vP,KAAM,aACNwsM,MAAO,mBAETihD,gBAAiB,CACfztP,KAAM,mBACNwsM,MAAO,oBAETkhD,eAAgB,CACd1tP,KAAM,kBACNwsM,MAAO,mBAETu0D,WAAY,CACV/gQ,KAAM,cACNwsM,MAAO,gBAGXwqD,kBAAmB,CACjB,eAAgB,UAChB,gBAAiB,UACjBhhM,SAAU,UACVmpM,YAAa,UAEfiC,4BAA6B,CAC3B,UACA,qBACA,oBACA,oBACA,cACA,kBACA,WACA,SACA,YACA,WACA,aACA,iBAEFC,6BAA8B,CAC5B,UACA,qBACA,oBACA,oBACA,cACA,kBACA,WACA,SACA,YACA,WACA,aACA,iBAEFC,qBAAsB,CACpB,kBAAmB,UACnB,qBAAsB,YACtBC,WAAY,SACZ,mBAAoB,eACpB,kBAAmB,cACnBzR,IAAK,SACL,cAAe,wBAInBzgB,EAAU36N,OAAS2rP,EACjB,CACE,YACA,0BACA,gBACA,4BACA,cACA,gBACA,cACA,cACA,mBACA,mBACA,eACA,0BACA,gBACA,cACA,o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AgB,CACZ,IACA,IACA,KAEJC,SAAU,CACN,IACA,IACA,KAEJC,QAAS,CACL,IACA,GACA,IAEJ1rP,KAAM,CACF,EACA,IACA,KAEJ2rP,SAAU,CACN,EACA,EACA,KAEJC,SAAU,CACN,EACA,IACA,KAEJC,cAAe,CACX,IACA,IACA,IAEJC,SAAU,CACN,IACA,IACA,KAEJC,UAAW,CACP,EACA,IACA,GAEJC,SAAU,CACN,IACA,IACA,KAEJC,UAAW,CACP,IACA,IACA,KAEJC,YAAa,CACT,IACA,EACA,KAEJC,eAAgB,CACZ,GACA,IACA,IAEJC,WAAY,CACR,IACA,IACA,GAEJC,WAAY,CACR,IACA,GACA,KAEJC,QAAS,CACL,IACA,EACA,GAEJC,WAAY,CACR,IACA,IACA,KAEJC,aAAc,CACV,IACA,IACA,KAEJC,cAAe,CACX,GACA,GACA,KAEJC,cAAe,CACX,GACA,GACA,IAEJC,cAAe,CACX,GACA,GACA,IAEJC,cAAe,CACX,EACA,IACA,KAEJC,WAAY,CACR,IACA,EACA,KAEJC,SAAU,CACN,IACA,GACA,KAEJC,YAAa,CACT,EACA,IACA,KAEJC,QAAS,CACL,IACA,IACA,KAEJC,QAAS,CACL,IACA,IACA,KAEJC,WAAY,CACR,GACA,IACA,KAEJC,UAAW,CACP,IACA,GACA,IAEJC,YAAa,CACT,IACA,IACA,KAEJC,YAAa,CACT,GACA,IACA,IAEJ/sP,QAAS,CACL,IACA,EACA,KAEJgtP,UAAW,CACP,IACA,IACA,KAEJC,WAAY,CACR,IACA,IACA,KAEJC,KAAM,CACF,IACA,IACA,GAEJC,UAAW,CACP,IACA,IACA,IAEJruP,KAAM,CACF,IACA,IACA,KAEJS,MAAO,CACH,EACA,IACA,GAEJ6tP,YAAa,CACT,IACA,IACA,IAEJC,KAAM,CACF,IACA,IACA,KAEJC,SAAU,CACN,IACA,IACA,KAEJC,QAAS,CACL,IACA,IACA,KAEJC,UAAW,CACP,IACA,GACA,IAEJ3tP,OAAQ,CACJ,GACA,EACA,KAEJ4tP,MAAO,CACH,IACA,IACA,KAEJC,MAAO,CACH,IACA,IACA,KAEJC,SAAU,CACN,IACA,IACA,KAEJC,cAAe,CACX,IACA,IACA,KAEJC,UAAW,CACP,IACA,IACA,GAEJC,aAAc,CACV,IACA,IACA,KAEJC,UAAW,CACP,IACA,IACA,KAEJC,WAAY,CACR,IACA,IACA,KAEJC,UAAW,CACP,IACA,IACA,KAEJC,qBAAsB,CAClB,IACA,IACA,KAEJC,UAAW,CACP,IACA,IACA,KAEJC,WAAY,CACR,IACA,IACA,KAEJC,UAAW,CACP,IACA,IACA,KAEJC,UAAW,CACP,IACA,IACA,KAEJC,YAAa,CACT,IACA,IACA,KAEJC,cAAe,CACX,GACA,IACA,KAEJC,aAAc,CACV,IACA,IACA,KAEJC,eAAgB,CACZ,IACA,IACA,KAEJC,eAAgB,CACZ,IACA,IACA,KAEJC,eAAgB,CACZ,IACA,IACA,KAEJC,YAAa,CACT,IACA,IACA,KAEJvvP,KAAM,CACF,EACA,IACA,GAEJwvP,UAAW,CACP,GACA,IACA,IAEJC,MAAO,CACH,IACA,IACA,KAEJ3oO,QAAS,CACL,IACA,EACA,KAEJi4I,OAAQ,CACJ,IACA,EACA,GAEJ2wF,iBAAkB,CACd,IACA,IACA,KAEJC,WAAY,CACR,EACA,EACA,KAEJC,aAAc,CACV,IACA,GACA,KAEJC,aAAc,CACV,IACA,IACA,KAEJC,eAAgB,CACZ,GACA,IACA,KAEJC,gBAAiB,CACb,IACA,IACA,KAEJC,kBAAmB,CACf,EACA,IACA,KAEJC,gBAAiB,CACb,GACA,IACA,KAEJC,gBAAiB,CACb,IACA,GACA,KAEJC,aAAc,CACV,GACA,GACA,KAEJC,UAAW,CACP,IACA,IACA,KAEJC,UAAW,CACP,IACA,IACA,KAEJC,SAAU,CACN,IACA,IACA,KAEJC,YAAa,CACT,IACA,IACA,KAEJvxF,KAAM,CACF,EACA,EACA,KAEJwxF,QAAS,CACL,IACA,IACA,KAEJvxF,MAAO,CACH,IACA,IACA,GAEJwxF,UAAW,CACP,IACA,IACA,IAEJ5wP,OAAQ,CACJ,IACA,IACA,GAEJ6wP,UAAW,CACP,IACA,GACA,GAEJC,OAAQ,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M,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAA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Q,MAAQ,MACxf,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MACxf,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MACxf,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,IAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,GAAQ,MAAQ,GAAQ,MAAQ,GAAQ,MAAQ,GAAQ,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,EAAQ,MAAQ,EAAQ,MAAQ,EAAQ,MAAQ,GAAQ,MAAQ,GAAQ,MAAQ,GAAQ,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAA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,cACA,cACA,iBACA,gBACA,kBACA,YACA,SACA,OACA,QACA,YACA,YACA,SACA,cACA,aACA,SACA,iBACA,kBACA,iBACA,eACA,gBACA,oBACA,gBACA,iBACA,aACA,UACA,cACA,cACA,aACA,kBACA,eACA,eACA,sBACA,mBACA,gBACA,WACA,eACA,aACA,eACA,aACA,iBACA,eACA,MACA,QACA,cACA,cACA,cACA,gBACA,YACA,YACA,cACA,WACA,qBACA,iBACA,eACA,UACA,aACA,WACA,YACA,eACA,cACA,cACA,cACA,gBACA,kBACA,oBACA,kBACA,qBACA,qBACA,iBACA,uBACA,iBACA,qBACA,mBACA,mBACA,OACA,SACA,cACA,YACA,iBACA,UACA,YACA,aACA,gBACA,aACA,WACA,aACA,gBACA,YACA,qBACA,aACA,gBACA,YACA,cACA,iBACA,sBACA,sBACA,0BACA,sBACA,gBACA,mBACA,qBACA,aACA,cACA,UACA,sBACA,eACA,YACA,iBACA,eACA,eACA,gBACA,eACA,YACA,YACA,cACA,kBACA,kBACA,OACA,aACA,WACA,aACA,YACA,YACA,SACA,WACA,QACA,SACA,eACA,qBACA,mBACA,oBACA,oBACA,iBACA,kBACA,mBACA,gBACA,iBACA,qBACA,kBACA,qBACA,2BACA,aACA,UACA,UACA,oB,2BC5LJr2C,OAAO4B,eAAerC,EAAS,aAAc,CACzCsC,OAAO,IAEX7B,OAAO4B,eAAerC,EAAS,UAAW,CACtC0C,YAAY,EACZC,IAAK,WACD,OAAO6yS,CACX,IAEJ,MAAM/4P,EAA6Bz5C,EAAyB,EAAQ,OAC9Dgpa,EAAgChpa,EAAyB,EAAQ,OACjEipa,EAAkCjpa,EAAyB,EAAQ,OACnEkpa,EAAwBlpa,EAAyB,EAAQ,OACzD28M,EAAY,EAAQ,MACpBwsN,EAAU,EAAQ,MAClBC,EAAmB,EAAQ,KAC3BC,EAA+Brpa,EAAyB,EAAQ,MAChEspa,EAAa,EAAQ,MACrBC,EAAe,EAAQ,KACvBhwX,EAAqB,EAAQ,MAC7BiwX,EAA8Bxpa,EAAyB,EAAQ,OACrE,S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AAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MACxf,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,IAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,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","sources":["webpack://jds/./node_modules/core-js/internals/is-object.js","webpack://jds/./node_modules/@tailwindcss/typography/node_modules/postcss-selector-parser/dist/selectors/tag.js","webpack://jds/./node_modules/core-js/internals/get-iterator.js","webpack://jds/./node_modules/tailwindcss/lib/util/color.js","webpack://jds/./node_modules/core-js/modules/es.array.find.js","webpack://jds/./node_modules/lodash.merge/index.js","webpack://jds/./node_modules/@fancyapps/ui/dist/index.esm.js","webpack://jds/./node_modules/@tailwindcss/typography/node_modules/postcss-selector-parser/dist/selectors/container.js","webpack://jds/./node_modules/core-js/internals/array-for-each.js","webpack://jds/./node_modules/core-js/modules/es.promise.resolve.js","webpack://jds/./node_modules/core-js/internals/make-built-in.js","webpack://jds/./node_modules/@tailwindcss/typography/node_modules/postcss-selector-parser/dist/selectors/className.js","webpack://jds/./node_modules/core-js/modules/es.object.set-prototype-of.js","webpack://jds/./node_modules/core-js/internals/object-get-own-property-names-external.js","webpack://jds/./node_modules/core-js/internals/function-name.js","webpack://jds/./node_modules/@tailwindcss/typography/node_modules/postcss-selector-parser/dist/processor.js","webpack://jds/./node_modules/tailwindcss/lib/util/createPlugin.js","webpack://jds/./node_modules/core-js/internals/html.js","webpack://jds/./node_modules/core-js/internals/hidden-keys.js","webpack://jds/./node_modules/core-js/modules/es.promise.constructor.js","webpack://jds/./node_modules/tailwindcss/lib/util/isPlainObject.js","webpack://jds/./node_modules/core-js/internals/iterate-simple.js","webpack://jds/./node_modules/tailwindcss/lib/util/pluginUtils.js","webpack://jds/./node_modules/core-js/internals/well-known-symbol-define.js","webpack://jds/./node_modules/core-js/internals/string-pad.js","webpack://jds/./node_modules/core-js/internals/promise-statics-incorrect-iteration.js","webpack://jds/./node_modules/core-js/internals/promise-native-constructor.js","webpack://jds/./node_modules/core-js/internals/function-bind.js","webpack://jds/./node_modules/@tailwindcss/typography/node_modules/postcss-selector-parser/dist/selectors/comment.js","webpack://jds/./node_modules/core-js/internals/array-method-has-species-support.js","webpack://jds/./node_modules/core-js/internals/function-bind-native.js","webpack://jds/./node_modules/core-js/internals/to-string.js","webpack://jds/./node_modules/core-js/internals/an-instance.js","webpack://jds/./node_modules/tailwindcss/lib/util/normalizeConfig.js","webpack://jds/./node_modules/core-js/internals/set-to-string-tag.js","webpack://jds/./node_modules/core-js/internals/string-trim-forced.js","webpack://jds/./node_modules/@tailwindcss/typography/src/index.js","webpack://jds/./node_modules/core-js/modules/es.date.to-json.js","webpack://jds/./node_modules/core-js/internals/math-trunc.js","webpack://jds/./node_modules/core-js/internals/is-symbol.js","webpack://jds/./node_modules/core-js/internals/is-regexp.js","webpack://jds/./node_modules/core-js/modules/es.reflect.construct.js","webpack://jds/./node_modules/core-js/internals/get-iterator-method.js","webpack://jds/./node_modules/core-js/modules/es.object.get-prototype-of.js","webpack://jds/./node_modules/core-js/modules/es.reflect.get.js","webpack://jds/./node_modules/core-js/internals/promise-constructor-detection.js","webpack://jds/./node_modules/core-js/internals/array-reduce.js","webpack://jds/./node_modules/fizzy-ui-utils/utils.js","webpack://jds/./node_modules/@tailwindcss/typography/node_modules/postcss-selector-parser/dist/selectors/pseudo.js","webpack://jds/./node_modules/core-js/internals/regexp-get-flags.js","webpack://jds/./node_modules/@tailwindcss/typography/src/styles.js","webpack://jds/./node_modules/core-js/internals/proxy-accessor.js","webpack://jds/./node_modules/core-js/internals/object-keys.js","webpack://jds/./node_modules/core-js/internals/iterator-define.js","webpack://jds/./node_modules/core-js/internals/perform.js","webpack://jds/./node_modules/tailwindcss/lib/util/splitAtTopLevelOnly.js","webpack://jds/./node_modules/core-js/internals/internal-state.js","webpack://jds/./node_modules/core-js/internals/this-number-value.js","webpack://jds/./node_modules/core-js/modules/es.object.get-own-property-descriptors.js","webpack://jds/./node_modules/core-js/internals/to-integer-or-infinity.js","webpack://jds/./node_modules/core-js/internals/symbol-registry-detection.js","webpack://jds/./node_modules/@tailwindcss/typography/node_modules/postcss-selector-parser/dist/selectors/constructors.js","webpack://jds/./node_modules/core-js/modules/es.string.starts-with.js","webpack://jds/./node_modules/core-js/modules/es.set.js","webpack://jds/./node_modules/@tailwindcss/typography/node_modules/postcss-selector-parser/dist/util/getProp.js","webpack://jds/./node_modules/core-js/internals/correct-is-regexp-logic.js","webpack://jds/./node_modules/core-js/internals/array-species-create.js","webpack://jds/./node_modules/core-js/modules/es.promise.reject.js","webpack://jds/./node_modules/get-size/get-size.js","webpack://jds/./node_modules/tailwindcss/stubs/config.full.js","webpack://jds/./node_modules/core-js/es/weak-map/index.js","webpack://jds/./node_modules/core-js/modules/es.symbol.for.js","webpack://jds/./node_modules/core-js/internals/object-is-prototype-of.js","webpack://jds/./node_modules/core-js/modules/es.array.for-each.js","webpack://jds/./node_modules/core-js/modules/es.set.union.v2.js","webpack://jds/./node_modules/core-js/modules/es.string.includes.js","webpack://jds/./node_modules/gsap/dist/ScrollToPlugin.js","webpack://jds/./node_modules/core-js/modules/es.string.match.js","webpack://jds/./node_modules/core-js/internals/get-iterator-direct.js","webpack://jds/./node_modules/core-js/internals/object-keys-internal.js","webpack://jds/./node_modules/@tailwindcss/typography/node_modules/postcss-selector-parser/dist/selectors/types.js","webpack://jds/./node_modules/core-js/internals/well-known-symbol-wrapped.js","webpack://jds/./node_modules/core-js/internals/microtask.js","webpack://jds/./node_modules/@tailwindcss/typography/node_modules/postcss-selector-parser/dist/selectors/attribute.js","webpack://jds/./node_modules/core-js/modules/es.promise.catch.js","webpack://jds/./node_modules/core-js/modules/es.array.filter.js","webpack://jds/./node_modules/core-js/modules/es.function.name.js","webpack://jds/./node_modules/tailwindcss/lib/featureFlags.js","webpack://jds/./node_modules/core-js/modules/es.array.map.js","webpack://jds/./node_modules/core-js/internals/define-built-in-accessor.js","webpack://jds/./node_modules/ev-emitter/ev-emitter.js","webpack://jds/./node_modules/core-js/internals/to-string-tag-support.js","webpack://jds/./node_modules/core-js/internals/classof-raw.js","webpack://jds/./node_modules/core-js/internals/correct-prototype-getter.js","webpack://jds/./node_modules/imagesloaded/node_modules/ev-emitter/ev-emitter.js","webpack://jds/./node_modules/core-js/internals/map-helpers.js","webpack://jds/./node_modules/core-js/modules/es.symbol.iterator.js","webpack://jds/./node_modules/core-js/internals/species-constructor.js","webpack://jds/./node_modules/core-js/internals/string-repeat.js","webpack://jds/./node_modules/core-js/internals/object-to-array.js","webpack://jds/./node_modules/core-js/internals/object-create.js","webpack://jds/./node_modules/core-js/modules/es.set.constructor.js","webpack://jds/./node_modules/@tailwindcss/typography/node_modules/postcss-selector-parser/dist/selectors/index.js","webpack://jds/./node_modules/core-js/modules/es.set.is-superset-of.v2.js","webpack://jds/./node_modules/core-js/internals/get-substitution.js","webpack://jds/./node_modules/@tailwindcss/typography/node_modules/postcss-selector-parser/dist/util/ensureObject.js","webpack://jds/./node_modules/core-js/internals/create-iter-result-object.js","webpack://jds/./node_modules/isotope-layout/js/layout-modes/fit-rows.js","webpack://jds/./node_modules/lazysizes/plugins/parent-fit/ls.parent-fit.js","webpack://jds/./node_modules/@tailwindcss/typography/node_modules/postcss-selector-parser/dist/selectors/node.js","webpack://jds/./node_modules/core-js/internals/iterate.js","webpack://jds/./node_modules/tailwindcss/lib/public/create-plugin.js","webpack://jds/./node_modules/core-js/modules/es.symbol.js","webpack://jds/./node_modules/core-js/internals/number-parse-int.js","webpack://jds/./node_modules/tailwindcss/lib/util/log.js","webpack://jds/./node_modules/core-js/modules/es.array.reduce.js","webpack://jds/./node_modules/core-js/internals/freezing.js","webpack://jds/./node_modules/core-js/modules/es.string.trim.js","webpack://jds/./node_modules/core-js/internals/to-primitive.js","webpack://jds/./node_modules/core-js/internals/object-get-prototype-of.js","webpack://jds/./node_modules/core-js/internals/is-forced.js","webpack://jds/./node_modules/core-js/internals/validate-arguments-length.js","webpack://jds/./node_modules/@tailwindcss/typography/node_modules/postcss-selector-parser/dist/parser.js","webpack://jds/./node_modules/outlayer/outlayer.js","webpack://jds/./node_modules/core-js/internals/environment-user-agent.js","webpack://jds/./node_modules/core-js/modules/es.number.constructor.js","webpack://jds/./node_modules/just-extend/index.esm.js","webpack://jds/./node_modules/dropzone/dist/dropzone.mjs","webpack://jds/./node_modules/core-js/modules/web.dom-collections.iterator.js","webpack://jds/./node_modules/core-js/internals/object-set-prototype-of.js","webpack://jds/./node_modules/@tailwindcss/typography/node_modules/postcss-selector-parser/dist/selectors/combinator.js","webpack://jds/./node_modules/core-js/internals/string-pad-webkit-bug.js","webpack://jds/./node_modules/core-js/modules/es.json.stringify.js","webpack://jds/./node_modules/scrollbooster/src/index.js","webpack://jds/./node_modules/core-js/internals/host-report-errors.js","webpack://jds/./node_modules/core-js/internals/inherit-if-required.js","webpack://jds/./node_modules/outlayer/item.js","webpack://jds/./node_modules/core-js/internals/object-to-string.js","webpack://jds/./node_modules/@tailwindcss/typography/node_modules/postcss-selector-parser/dist/selectors/string.js","webpack://jds/./node_modules/core-js/modules/es.date.to-string.js","webpack://jds/./node_modules/isotope-layout/js/layout-modes/masonry.js","webpack://jds/./node_modules/core-js/modules/es.promise.js","webpack://jds/./node_modules/core-js/modules/es.string.search.js","webpack://jds/./node_modules/core-js/internals/safe-get-built-in.js","webpack://jds/./node_modules/core-js/internals/uid.js","webpack://jds/./node_modules/core-js/modules/es.array.from.js","webpack://jds/./node_modules/core-js/internals/promise-resolve.js","webpack://jds/./node_modules/core-js/internals/set-difference.js","webpack://jds/./node_modules/@tailwindcss/typography/node_modules/postcss-selector-parser/dist/selectors/id.js","webpack://jds/./node_modules/core-js/internals/internal-metadata.js","webpack://jds/./node_modules/core-js/internals/same-value.js","webpack://jds/./node_modules/core-js/modules/web.dom-collections.for-each.js","webpack://jds/./node_modules/core-js/internals/a-possible-prototype.js","webpack://jds/./node_modules/core-js/internals/is-constructor.js","webpack://jds/./node_modules/core-js/internals/regexp-unsupported-dot-all.js","webpack://jds/./node_modules/core-js/internals/date-to-primitive.js","webpack://jds/./node_modules/core-js/internals/set-symmetric-difference.js","webpack://jds/./node_modules/@tailwindcss/typography/node_modules/postcss-selector-parser/dist/selectors/nesting.js","webpack://jds/./node_modules/core-js/internals/inspect-source.js","webpack://jds/./node_modules/core-js/internals/object-get-own-property-symbols.js","webpack://jds/./node_modules/core-js/internals/descriptors.js","webpack://jds/./node_modules/isotope-layout/js/layout-mode.js","webpack://jds/./node_modules/core-js/modules/es.weak-map.js","webpack://jds/./node_modules/core-js/internals/get-set-record.js","webpack://jds/./node_modules/core-js/modules/es.array.iterator.js","webpack://jds/./node_modules/core-js/internals/string-trim.js","webpack://jds/./node_modules/core-js/internals/set-is-subset-of.js","webpack://jds/./node_modules/core-js/modules/es.object.get-own-property-descriptor.js","webpack://jds/./node_modules/core-js/modules/es.set.is-disjoint-from.v2.js","webpack://jds/./node_modules/core-js/internals/number-parse-float.js","webpack://jds/./node_modules/core-js/modules/es.object.from-entries.js","webpack://jds/./node_modules/core-js/internals/is-possible-prototype.js","webpack://jds/./node_modules/core-js/internals/iterator-create-constructor.js","webpack://jds/./node_modules/core-js/internals/collection-weak.js","webpack://jds/./node_modules/core-js/internals/document-create-element.js","webpack://jds/./node_modules/three/examples/jsm/utils/BufferGeometryUtils.js","webpack://jds/./node_modules/three/examples/jsm/loaders/GLTFLoader.js","webpack://jds/./node_modules/core-js/internals/is-null-or-undefined.js","webpack://jds/./node_modules/core-js/internals/object-is-extensible.js","webpack://jds/./node_modules/core-js/modules/es.function.bind.js","webpack://jds/./node_modules/core-js/modules/es.object.define-property.js","webpack://jds/./node_modules/core-js/internals/set-union.js","webpack://jds/./node_modules/core-js/internals/is-array-iterator-method.js","webpack://jds/./node_modules/core-js/internals/object-assign.js","webpack://jds/./node_modules/core-js/internals/environment.js","webpack://jds/./node_modules/core-js/internals/environment-is-ios-pebble.js","webpack://jds/./node_modules/core-js/internals/ordinary-to-primitive.js","webpack://jds/./node_modules/core-js/modules/es.array.is-array.js","webpack://jds/./node_modules/@tailwindcss/typography/node_modules/postcss-selector-parser/dist/util/index.js","webpack://jds/./node_modules/core-js/internals/is-array.js","webpack://jds/./node_modules/lazysizes/plugins/bgset/ls.bgset.js","webpack://jds/./node_modules/core-js/internals/set-helpers.js","webpack://jds/./node_modules/core-js/modules/es.array.includes.js","webpack://jds/./node_modules/core-js/internals/check-correctness-of-iteration.js","webpack://jds/./node_modules/core-js/internals/set-is-disjoint-from.js","webpack://jds/./node_modules/core-js/internals/array-sort.js","webpack://jds/./node_modules/core-js/modules/es.array.reverse.js","webpack://jds/./node_modules/core-js/internals/symbol-constructor-detection.js","webpack://jds/./node_modules/tailwindcss/colors.js","webpack://jds/./node_modules/@tailwindcss/typography/node_modules/postcss-selector-parser/dist/sortAscending.js","webpack://jds/./node_modules/core-js/internals/global-this.js","webpack://jds/./node_modules/core-js/internals/array-method-is-strict.js","webpack://jds/./node_modules/core-js/modules/web.set-timeout.js","webpack://jds/./node_modules/util-deprecate/browser.js","webpack://jds/./node_modules/core-js/internals/create-property.js","webpack://jds/./node_modules/jquery/dist/jquery.js","webpack://jds/./node_modules/core-js/modules/es.array.slice.js","webpack://jds/./node_modules/tailwindcss/lib/util/getAllConfigs.js","webpack://jds/./node_modules/core-js/modules/es.regexp.constructor.js","webpack://jds/./node_modules/@tailwindcss/typography/node_modules/postcss-selector-parser/dist/selectors/guards.js","webpack://jds/./node_modules/core-js/internals/is-callable.js","webpack://jds/./node_modules/@tailwindcss/typography/node_modules/postcss-selector-parser/dist/tokenTypes.js","webpack://jds/./node_modules/tailwindcss/lib/public/colors.js","webpack://jds/./node_modules/core-js/internals/object-define-property.js","webpack://jds/./node_modules/core-js/internals/set-method-accept-set-like.js","webpack://jds/./node_modules/three/build/three.core.js","webpack://jds/./node_modules/@tailwindcss/typography/node_modules/postcss-selector-parser/dist/util/stripComments.js","webpack://jds/./node_modules/@tailwindcss/typography/node_modules/postcss-selector-parser/dist/selectors/namespace.js","webpack://jds/./node_modules/core-js/modules/es.set.symmetric-difference.v2.js","webpack://jds/./node_modules/core-js/internals/own-keys.js","webpack://jds/./node_modules/lazysizes/plugins/unveilhooks/ls.unveilhooks.js","webpack://jds/./node_modules/core-js/internals/set-size.js","webpack://jds/./node_modules/core-js/internals/regexp-flags-detection.js","webpack://jds/./node_modules/tailwindcss/lib/util/cloneDeep.js","webpack://jds/./node_modules/core-js/es/map/index.js","webpack://jds/./node_modules/core-js/modules/es.array.index-of.js","webpack://jds/./node_modules/@tailwindcss/typography/src/utils.js","webpack://jds/./node_modules/core-js/internals/to-indexed-object.js","webpack://jds/./node_modules/core-js/modules/es.string.replace.js","webpack://jds/./node_modules/core-js/modules/es.object.entries.js","webpack://jds/./node_modules/isotope-layout/js/item.js","webpack://jds/./node_modules/lazysizes/plugins/object-fit/ls.object-fit.js","webpack://jds/./node_modules/core-js/internals/a-constructor.js","webpack://jds/./node_modules/core-js/modules/web.set-interval.js","webpack://jds/./node_modules/core-js/internals/to-absolute-index.js","webpack://jds/./node_modules/core-js/internals/array-buffer-non-extensible.js","webpack://jds/./node_modules/core-js/modules/es.symbol.to-primitive.js","webpack://jds/./node_modules/core-js/internals/shared.js","webpack://jds/./node_modules/core-js/modules/es.weak-map.constructor.js","webpack://jds/./node_modules/core-js/internals/not-a-regexp.js","webpack://jds/./node_modules/core-js/internals/is-raw-json.js","webpack://jds/./node_modules/tailwindcss/lib/util/negateValue.js","webpack://jds/./node_modules/core-js/modules/es.set.is-subset-of.v2.js","webpack://jds/./node_modules/gsap/gsap-core.js","webpack://jds/./node_modules/gsap/CSSPlugin.js","webpack://jds/./node_modules/gsap/index.js","webpack://jds/./node_modules/tailwindcss/lib/util/toPath.js","webpack://jds/./node_modules/core-js/internals/ie8-dom-define.js","webpack://jds/./node_modules/lodash.castarray/index.js","webpack://jds/./node_modules/core-js/internals/get-method.js","webpack://jds/./node_modules/core-js/modules/web.timers.js","webpack://jds/./node_modules/core-js/modules/es.map.js","webpack://jds/./node_modules/core-js/modules/es.object.values.js","webpack://jds/./node_modules/core-js/internals/new-promise-capability.js","webpack://jds/./node_modules/braintree-web/dist/browser/index.js","webpack://jds/./node_modules/core-js/internals/function-bind-context.js","webpack://jds/./node_modules/core-js/modules/es.object.to-string.js","webpack://jds/./node_modules/tailwindcss/lib/util/parseBoxShadowValue.js","webpack://jds/./node_modules/core-js/internals/shared-key.js","webpack://jds/./node_modules/tailwindcss/resolveConfig.js","webpack://jds/./node_modules/core-js/internals/environment-is-node.js","webpack://jds/./node_modules/core-js/internals/length-of-array-like.js","webpack://jds/./node_modules/core-js/internals/iterators.js","webpack://jds/./node_modules/core-js/internals/define-built-ins.js","webpack://jds/./node_modules/core-js/internals/call-with-safe-iteration-closing.js","webpack://jds/./node_modules/isotope-layout/js/isotope.js","webpack://jds/./node_modules/core-js/internals/is-pure.js","webpack://jds/./node_modules/core-js/internals/collection.js","webpack://jds/./node_modules/core-js/internals/add-to-unscopables.js","webpack://jds/./node_modules/core-js/modules/es.promise.all.js","webpack://jds/./node_modules/core-js/internals/export.js","webpack://jds/./node_modules/tailwindcss/lib/util/colorNames.js","webpack://jds/./node_modules/core-js/internals/is-data-descriptor.js","webpack://jds/./node_modules/@tailwindcss/typography/node_modules/postcss-selector-parser/dist/tokenize.js","webpack://jds/./node_modules/core-js/internals/regexp-exec-abstract.js","webpack://jds/./node_modules/core-js/internals/create-non-enumerable-property.js","webpack://jds/./node_modules/core-js/internals/function-uncurry-this-accessor.js","webpack://jds/./node_modules/@barba/core/dist/barba.umd.js","webpack://jds/./node_modules/core-js/modules/es.symbol.constructor.js","webpack://jds/./node_modules/core-js/internals/object-define-properties.js","webpack://jds/./node_modules/core-js/internals/try-to-string.js","webpack://jds/./node_modules/core-js/internals/does-not-exceed-safe-integer.js","webpack://jds/./node_modules/core-js/internals/define-built-in.js","webpack://jds/./node_modules/lazysizes/lazysizes.js","webpack://jds/./node_modules/minimasonry/build/minimasonry.esm.js","webpack://jds/./node_modules/core-js/internals/collection-strong.js","webpack://jds/./node_modules/core-js/internals/classof.js","webpack://jds/./node_modules/core-js/internals/to-property-key.js","webpack://jds/./node_modules/core-js/internals/create-property-descriptor.js","webpack://jds/./node_modules/isotope-layout/js/layout-modes/vertical.js","webpack://jds/./node_modules/masonry-layout/masonry.js","webpack://jds/./node_modules/three/examples/jsm/controls/OrbitControls.js","webpack://jds/./node_modules/core-js/internals/use-symbol-as-uid.js","webpack://jds/./node_modules/core-js/internals/indexed-object.js","webpack://jds/./node_modules/core-js/modules/es.map.group-by.js","webpack://jds/./node_modules/core-js/internals/a-set.js","webpack://jds/./node_modules/tailwindcss/lib/util/withAlphaVariable.js","webpack://jds/./node_modules/hammerjs/hammer.js","webpack://jds/./node_modules/three/build/three.cjs","webpack://jds/./node_modules/tailwindcss/lib/util/defaults.js","webpack://jds/./node_modules/core-js/internals/regexp-exec.js","webpack://jds/./node_modules/core-js/modules/es.string.from-code-point.js","webpack://jds/./node_modules/core-js/internals/object-get-own-property-descriptor.js","webpack://jds/./node_modules/core-js/internals/dom-iterables.js","webpack://jds/./node_modules/core-js/internals/url-constructor-detection.js","webpack://jds/./node_modules/core-js/internals/array-species-constructor.js","webpack://jds/./node_modules/core-js/es/array/from.js","webpack://jds/./node_modules/core-js/internals/whitespaces.js","webpack://jds/./node_modules/core-js/internals/function-uncurry-this-clause.js","webpack://jds/./node_modules/core-js/modules/es.regexp.exec.js","webpack://jds/./node_modules/tailwindcss/lib/util/escapeCommas.js","webpack://jds/./node_modules/core-js/internals/shared-store.js","webpack://jds/./node_modules/core-js/internals/set-species.js","webpack://jds/./node_modules/core-js/modules/es.set.difference.v2.js","webpack://jds/./node_modules/core-js/es/set/index.js","webpack://jds/./node_modules/core-js/internals/iterators-core.js","webpack://jds/./node_modules/core-js/internals/array-slice.js","webpack://jds/./node_modules/core-js/internals/copy-constructor-properties.js","webpack://jds/./node_modules/core-js/modules/es.promise.race.js","webpack://jds/./node_modules/core-js/internals/require-object-coercible.js","webpack://jds/./node_modules/core-js/internals/get-built-in.js","webpack://jds/./node_modules/core-js/modules/es.string.iterator.js","webpack://jds/./node_modules/tailwindcss/lib/util/configurePlugins.js","webpack://jds/./node_modules/core-js/modules/es.symbol.key-for.js","webpack://jds/./node_modules/core-js/internals/native-raw-json.js","webpack://jds/./node_modules/core-js/internals/advance-string-index.js","webpack://jds/./node_modules/@tailwindcss/typography/node_modules/postcss-selector-parser/dist/selectors/root.js","webpack://jds/./node_modules/core-js/internals/environment-is-webos-webkit.js","webpack://jds/./node_modules/core-js/internals/array-from.js","webpack://jds/./node_modules/imagesloaded/imagesloaded.js","webpack://jds/./node_modules/core-js/modules/es.object.define-properties.js","webpack://jds/./node_modules/core-js/internals/regexp-flags.js","webpack://jds/./node_modules/core-js/modules/es.set.intersection.v2.js","webpack://jds/./node_modules/core-js/internals/to-length.js","webpack://jds/./node_modules/tailwindcss/plugin.js","webpack://jds/./node_modules/core-js/modules/es.string.pad-start.js","webpack://jds/./node_modules/@tailwindcss/typography/node_modules/postcss-selector-parser/dist/index.js","webpack://jds/./node_modules/core-js/internals/string-multibyte.js","webpack://jds/./node_modules/tailwindcss/lib/corePluginList.js","webpack://jds/./node_modules/tailwindcss/lib/util/resolveConfig.js","webpack://jds/./node_modules/core-js/internals/well-known-symbol.js","webpack://jds/./node_modules/core-js/internals/parse-json-string.js","webpack://jds/./node_modules/core-js/internals/symbol-define-to-primitive.js","webpack://jds/./node_modules/core-js/internals/queue.js","webpack://jds/./node_modules/@tailwindcss/typography/node_modules/postcss-selector-parser/dist/selectors/universal.js","webpack://jds/./node_modules/core-js/modules/web.url-search-params.constructor.js","webpack://jds/./node_modules/core-js/modules/web.url-search-params.js","webpack://jds/./node_modules/core-js/internals/regexp-sticky-helpers.js","webpack://jds/./node_modules/core-js/modules/es.array.every.js","webpack://jds/./node_modules/core-js/modules/es.parse-float.js","webpack://jds/./node_modules/core-js/internals/set-iterate.js","webpack://jds/./node_modules/core-js/es/object/assign.js","webpack://jds/./node_modules/core-js/internals/object-get-own-property-names.js","webpack://jds/./node_modules/core-js/modules/es.map.constructor.js","webpack://jds/./node_modules/core-js/internals/set-is-superset-of.js","webpack://jds/./node_modules/core-js/internals/an-object.js","webpack://jds/./node_modules/tailwindcss/lib/util/toColorValue.js","webpack://jds/./node_modules/core-js/modules/es.array.join.js","webpack://jds/./node_modules/tailwindcss/lib/util/validateFormalSyntax.js","webpack://jds/./node_modules/core-js/internals/weak-map-basic-detection.js","webpack://jds/./node_modules/picocolors/picocolors.browser.js","webpack://jds/./node_modules/core-js/internals/v8-prototype-define-bug.js","webpack://jds/./node_modules/core-js/modules/es.array.concat.js","webpack://jds/./node_modules/tailwindcss/lib/util/dataTypes.js","webpack://jds/./node_modules/core-js/internals/enum-bug-keys.js","webpack://jds/./node_modules/core-js/internals/function-apply.js","webpack://jds/./node_modules/core-js/internals/set-intersection.js","webpack://jds/./node_modules/core-js/internals/object-property-is-enumerable.js","webpack://jds/./node_modules/core-js/modules/es.regexp.to-string.js","webpack://jds/./node_modules/core-js/internals/regexp-unsupported-ncg.js","webpack://jds/./node_modules/cssesc/cssesc.js","webpack://jds/./node_modules/core-js/modules/es.parse-int.js","webpack://jds/./node_modules/gsap/Observer.js","webpack://jds/./node_modules/gsap/ScrollTrigger.js","webpack://jds/./node_modules/core-js/modules/es.array.find-index.js","webpack://jds/./node_modules/core-js/internals/to-object.js","webpack://jds/./node_modules/@tailwindcss/typography/node_modules/postcss-selector-parser/dist/util/unesc.js","webpack://jds/./node_modules/lodash.isplainobject/index.js","webpack://jds/./node_modules/core-js/internals/fails.js","webpack://jds/./node_modules/core-js/modules/es.object.assign.js","webpack://jds/./node_modules/core-js/internals/path.js","webpack://jds/./node_modules/core-js/internals/array-iteration.js","webpack://jds/./node_modules/core-js/internals/task.js","webpack://jds/./node_modules/core-js/internals/fix-regexp-well-known-symbol-logic.js","webpack://jds/./node_modules/@tailwindcss/typography/node_modules/postcss-selector-parser/dist/selectors/selector.js","webpack://jds/./node_modules/@popperjs/core/lib/dom-utils/getWindow.js","webpack://jds/./node_modules/@popperjs/core/lib/dom-utils/instanceOf.js","webpack://jds/./node_modules/@popperjs/core/lib/utils/math.js","webpack://jds/./node_modules/@popperjs/core/lib/utils/userAgent.js","webpack://jds/./node_modules/@popperjs/core/lib/dom-utils/isLayoutViewport.js","webpack://jds/./node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js","webpack://jds/./node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js","webpack://jds/./node_modules/@popperjs/core/lib/dom-utils/getNodeName.js","webpack://jds/./node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js","webpack://jds/./node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js","webpack://jds/./node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js","webpack://jds/./node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js","webpack://jds/./node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js","webpack://jds/./node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js","webpack://jds/./node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js","webpack://jds/./node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js","webpack://jds/./node_modules/@popperjs/core/lib/dom-utils/getParentNode.js","webpack://jds/./node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js","webpack://jds/./node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js","webpack://jds/./node_modules/@popperjs/core/lib/dom-utils/isTableElement.js","webpack://jds/./node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js","webpack://jds/./node_modules/@popperjs/core/lib/enums.js","webpack://jds/./node_modules/@popperjs/core/lib/utils/orderModifiers.js","webpack://jds/./node_modules/@popperjs/core/lib/createPopper.js","webpack://jds/./node_modules/@popperjs/core/lib/utils/debounce.js","webpack://jds/./node_modules/@popperjs/core/lib/utils/mergeByName.js","webpack://jds/./node_modules/@popperjs/core/lib/modifiers/eventListeners.js","webpack://jds/./node_modules/@popperjs/core/lib/utils/getBasePlacement.js","webpack://jds/./node_modules/@popperjs/core/lib/utils/getVariation.js","webpack://jds/./node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js","webpack://jds/./node_modules/@popperjs/core/lib/utils/computeOffsets.js","webpack://jds/./node_modules/@popperjs/core/lib/modifiers/computeStyles.js","webpack://jds/./node_modules/@popperjs/core/lib/modifiers/applyStyles.js","webpack://jds/./node_modules/@popperjs/core/lib/utils/getOppositePlacement.js","webpack://jds/./node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js","webpack://jds/./node_modules/@popperjs/core/lib/dom-utils/contains.js","webpack://jds/./node_modules/@popperjs/core/lib/utils/rectToClientRect.js","webpack://jds/./node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js","webpack://jds/./node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js","webpack://jds/./node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js","webpack://jds/./node_modules/@popperjs/core/lib/utils/mergePaddingObject.js","webpack://jds/./node_modules/@popperjs/core/lib/utils/getFreshSideObject.js","webpack://jds/./node_modules/@popperjs/core/lib/utils/expandToHashMap.js","webpack://jds/./node_modules/@popperjs/core/lib/utils/detectOverflow.js","webpack://jds/./node_modules/@popperjs/core/lib/utils/within.js","webpack://jds/./node_modules/@popperjs/core/lib/modifiers/hide.js","webpack://jds/./node_modules/@popperjs/core/lib/popper.js","webpack://jds/./node_modules/@popperjs/core/lib/modifiers/popperOffsets.js","webpack://jds/./node_modules/@popperjs/core/lib/modifiers/offset.js","webpack://jds/./node_modules/@popperjs/core/lib/modifiers/flip.js","webpack://jds/./node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js","webpack://jds/./node_modules/@popperjs/core/lib/modifiers/preventOverflow.js","webpack://jds/./node_modules/@popperjs/core/lib/utils/getAltAxis.js","webpack://jds/./node_modules/@popperjs/core/lib/modifiers/arrow.js","webpack://jds/./node_modules/tippy.js/dist/tippy.esm.js","webpack://jds/./node_modules/core-js/internals/set-clone.js","webpack://jds/./node_modules/core-js/internals/dom-token-list-prototype.js","webpack://jds/./node_modules/core-js/internals/has-own-property.js","webpack://jds/./node_modules/core-js/internals/a-callable.js","webpack://jds/./node_modules/core-js/modules/es.promise.finally.js","webpack://jds/./node_modules/core-js/modules/es.object.keys.js","webpack://jds/./node_modules/core-js/internals/define-global-property.js","webpack://jds/./node_modules/three/build/three.module.js","webpack://jds/./node_modules/jquery-bridget/jquery-bridget.js","webpack://jds/./node_modules/core-js/modules/es.symbol.description.js","webpack://jds/./node_modules/core-js/internals/schedulers-fix.js","webpack://jds/./node_modules/core-js/internals/function-uncurry-this.js","webpack://jds/./node_modules/core-js/internals/environment-v8-version.js","webpack://jds/./node_modules/core-js/internals/iterator-close.js","webpack://jds/./node_modules/core-js/internals/environment-is-ios.js","webpack://jds/./node_modules/core-js/internals/function-call.js","webpack://jds/./node_modules/core-js/modules/es.date.to-primitive.js","webpack://jds/./node_modules/core-js/internals/array-includes.js","webpack://jds/./node_modules/tailwindcss/lib/public/resolve-config.js","webpack://jds/./node_modules/core-js/modules/es.object.get-own-property-symbols.js","webpack://jds/./node_modules/desandro-matches-selector/matches-selector.js","webpack://jds/./node_modules/core-js/internals/set-method-get-keys-before-cloning-detection.js","webpack://jds/./node_modules/core-js/modules/es.number.to-fixed.js","webpack://jds/./node_modules/scrollxp/helpers/type.helper.js","webpack://jds/./node_modules/scrollxp/utils.js","webpack://jds/./node_modules/scrollxp/scrollmagic/utils/type.js","webpack://jds/./node_modules/scrollxp/scrollmagic/utils/dom.js","webpack://jds/./node_modules/tslib/tslib.es6.mjs","webpack://jds/./node_modules/scrollxp/scrollmagic/utils/logger.js","webpack://jds/./node_modules/scrollxp/scrollmagic/indicator/index.js","webpack://jds/./node_modules/scrollxp/scrollmagic/indicator/template.js","webpack://jds/./node_modules/scrollxp/scrollmagic/utils/animation.js","webpack://jds/./node_modules/scrollxp/scrollmagic/scene-event.js","webpack://jds/./node_modules/scrollxp/scrollmagic/controller.js","webpack://jds/./node_modules/scrollxp/scrollmagic/scene.js","webpack://jds/./node_modules/scrollxp/scroll-scene.js","webpack://jds/./node_modules/smooth-scrollbar/node_modules/tslib/tslib.es6.js","webpack://jds/./node_modules/smooth-scrollbar/utils/event-hub.js","webpack://jds/./node_modules/smooth-scrollbar/utils/get-position.js","webpack://jds/./node_modules/smooth-scrollbar/utils/get-pointer-data.js","webpack://jds/./node_modules/smooth-scrollbar/utils/is-one-of.js","webpack://jds/./node_modules/smooth-scrollbar/utils/set-style.js","webpack://jds/./node_modules/smooth-scrollbar/utils/touch-record.js","webpack://jds/./node_modules/smooth-scrollbar/utils/clamp.js","webpack://jds/./node_modules/smooth-scrollbar/utils/debounce.js","webpack://jds/./node_modules/smooth-scrollbar/decorators/range.js","webpack://jds/./node_modules/smooth-scrollbar/decorators/boolean.js","webpack://jds/./node_modules/smooth-scrollbar/decorators/debounce.js","webpack://jds/./node_modules/smooth-scrollbar/options.js","webpack://jds/./node_modules/smooth-scrollbar/track/direction.js","webpack://jds/./node_modules/smooth-scrollbar/track/thumb.js","webpack://jds/./node_modules/smooth-scrollbar/track/track.js","webpack://jds/./node_modules/smooth-scrollbar/track/index.js","webpack://jds/./node_modules/smooth-scrollbar/scrolling/scroll-to.js","webpack://jds/./node_modules/smooth-scrollbar/plugin.js","webpack://jds/./node_modules/smooth-scrollbar/events/keyboard.js","webpack://jds/./node_modules/smooth-scrollbar/events/mouse.js","webpack://jds/./node_modules/smooth-scrollbar/events/touch.js","webpack://jds/./node_modules/smooth-scrollbar/events/resize.js","webpack://jds/./node_modules/smooth-scrollbar/events/select.js","webpack://jds/./node_modules/smooth-scrollbar/events/wheel.js","webpack://jds/./node_modules/smooth-scrollbar/scrollbar.js","webpack://jds/./node_modules/smooth-scrollbar/geometry/get-size.js","webpack://jds/./node_modules/smooth-scrollbar/geometry/update.js","webpack://jds/./node_modules/smooth-scrollbar/geometry/is-visible.js","webpack://jds/./node_modules/smooth-scrollbar/scrolling/set-position.js","webpack://jds/./node_modules/smooth-scrollbar/scrolling/scroll-into-view.js","webpack://jds/./node_modules/smooth-scrollbar/style.js","webpack://jds/./node_modules/smooth-scrollbar/index.js","webpack://jds/./node_modules/scrollxp/scroll-controller.js","webpack://jds/./node_modules/scrollxp/creator/animation.creator.js","webpack://jds/./node_modules/scrollxp/parser.js","webpack://jds/./node_modules/scrollxp/helpers/param.helper.js","webpack://jds/./node_modules/scrollxp/parsers/base.parser.js","webpack://jds/./node_modules/scrollxp/builders/animation.builder.js","webpack://jds/./node_modules/scrollxp/parsers/animation.parser.js","webpack://jds/./node_modules/scrollxp/builders/scene.builder.js","webpack://jds/./node_modules/scrollxp/parsers/scene.parser.js","webpack://jds/./node_modules/scrollxp/builders/parallax.builder.js","webpack://jds/./node_modules/scrollxp/parsers/parallax.parser.js","webpack://jds/./node_modules/scrollxp/index.js","webpack://jds/./node_modules/core-js/modules/es.object.create.js"],"sourcesContent":["'use strict';\nvar isCallable = require('../internals/is-callable');\n\nmodule.exports = function (it) {\n  return typeof it == 'object' ? it !== null : isCallable(it);\n};\n","\"use strict\";\n\nexports.__esModule = true;\nexports[\"default\"] = void 0;\n\nvar _namespace = _interopRequireDefault(require(\"./namespace\"));\n\nvar _types = require(\"./types\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nfunction _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nvar Tag = /*#__PURE__*/function (_Namespace) {\n  _inheritsLoose(Tag, _Namespace);\n\n  function Tag(opts) {\n    var _this;\n\n    _this = _Namespace.call(this, opts) || this;\n    _this.type = _types.TAG;\n    return _this;\n  }\n\n  return Tag;\n}(_namespace[\"default\"]);\n\nexports[\"default\"] = Tag;\nmodule.exports = exports.default;","'use strict';\nvar call = require('../internals/function-call');\nvar aCallable = require('../internals/a-callable');\nvar anObject = require('../internals/an-object');\nvar tryToString = require('../internals/try-to-string');\nvar getIteratorMethod = require('../internals/get-iterator-method');\n\nvar $TypeError = TypeError;\n\nmodule.exports = function (argument, usingIterator) {\n  var iteratorMethod = arguments.length < 2 ? getIteratorMethod(argument) : usingIterator;\n  if (aCallable(iteratorMethod)) return anObject(call(iteratorMethod, argument));\n  throw new $TypeError(tryToString(argument) + ' is not iterable');\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nfunction _export(target, all) {\n    for(var name in all)Object.defineProperty(target, name, {\n        enumerable: true,\n        get: all[name]\n    });\n}\n_export(exports, {\n    parseColor: function() {\n        return parseColor;\n    },\n    formatColor: function() {\n        return formatColor;\n    }\n});\nconst _colorNames = /*#__PURE__*/ _interop_require_default(require(\"./colorNames\"));\nfunction _interop_require_default(obj) {\n    return obj && obj.__esModule ? obj : {\n        default: obj\n    };\n}\nlet HEX = /^#([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})?$/i;\nlet SHORT_HEX = /^#([a-f\\d])([a-f\\d])([a-f\\d])([a-f\\d])?$/i;\nlet VALUE = /(?:\\d+|\\d*\\.\\d+)%?/;\nlet SEP = /(?:\\s*,\\s*|\\s+)/;\nlet ALPHA_SEP = /\\s*[,/]\\s*/;\nlet CUSTOM_PROPERTY = /var\\(--(?:[^ )]*?)(?:,(?:[^ )]*?|var\\(--[^ )]*?\\)))?\\)/;\nlet RGB = new RegExp(`^(rgba?)\\\\(\\\\s*(${VALUE.source}|${CUSTOM_PROPERTY.source})(?:${SEP.source}(${VALUE.source}|${CUSTOM_PROPERTY.source}))?(?:${SEP.source}(${VALUE.source}|${CUSTOM_PROPERTY.source}))?(?:${ALPHA_SEP.source}(${VALUE.source}|${CUSTOM_PROPERTY.source}))?\\\\s*\\\\)$`);\nlet HSL = new RegExp(`^(hsla?)\\\\(\\\\s*((?:${VALUE.source})(?:deg|rad|grad|turn)?|${CUSTOM_PROPERTY.source})(?:${SEP.source}(${VALUE.source}|${CUSTOM_PROPERTY.source}))?(?:${SEP.source}(${VALUE.source}|${CUSTOM_PROPERTY.source}))?(?:${ALPHA_SEP.source}(${VALUE.source}|${CUSTOM_PROPERTY.source}))?\\\\s*\\\\)$`);\nfunction parseColor(value, { loose =false  } = {}) {\n    var _match_, _match__toString;\n    if (typeof value !== \"string\") {\n        return null;\n    }\n    value = value.trim();\n    if (value === \"transparent\") {\n        return {\n            mode: \"rgb\",\n            color: [\n                \"0\",\n                \"0\",\n                \"0\"\n            ],\n            alpha: \"0\"\n        };\n    }\n    if (value in _colorNames.default) {\n        return {\n            mode: \"rgb\",\n            color: _colorNames.default[value].map((v)=>v.toString())\n        };\n    }\n    let hex = value.replace(SHORT_HEX, (_, r, g, b, a)=>[\n            \"#\",\n            r,\n            r,\n            g,\n            g,\n            b,\n            b,\n            a ? a + a : \"\"\n        ].join(\"\")).match(HEX);\n    if (hex !== null) {\n        return {\n            mode: \"rgb\",\n            color: [\n                parseInt(hex[1], 16),\n                parseInt(hex[2], 16),\n                parseInt(hex[3], 16)\n            ].map((v)=>v.toString()),\n            alpha: hex[4] ? (parseInt(hex[4], 16) / 255).toString() : undefined\n        };\n    }\n    var _value_match;\n    let match = (_value_match = value.match(RGB)) !== null && _value_match !== void 0 ? _value_match : value.match(HSL);\n    if (match === null) {\n        return null;\n    }\n    let color = [\n        match[2],\n        match[3],\n        match[4]\n    ].filter(Boolean).map((v)=>v.toString());\n    // rgba(var(--my-color), 0.1)\n    // hsla(var(--my-color), 0.1)\n    if (color.length === 2 && color[0].startsWith(\"var(\")) {\n        return {\n            mode: match[1],\n            color: [\n                color[0]\n            ],\n            alpha: color[1]\n        };\n    }\n    if (!loose && color.length !== 3) {\n        return null;\n    }\n    if (color.length < 3 && !color.some((part)=>/^var\\(.*?\\)$/.test(part))) {\n        return null;\n    }\n    return {\n        mode: match[1],\n        color,\n        alpha: (_match_ = match[5]) === null || _match_ === void 0 ? void 0 : (_match__toString = _match_.toString) === null || _match__toString === void 0 ? void 0 : _match__toString.call(_match_)\n    };\n}\nfunction formatColor({ mode , color , alpha  }) {\n    let hasAlpha = alpha !== undefined;\n    if (mode === \"rgba\" || mode === \"hsla\") {\n        return `${mode}(${color.join(\", \")}${hasAlpha ? `, ${alpha}` : \"\"})`;\n    }\n    return `${mode}(${color.join(\" \")}${hasAlpha ? ` / ${alpha}` : \"\"})`;\n}\n","'use strict';\nvar $ = require('../internals/export');\nvar $find = require('../internals/array-iteration').find;\nvar addToUnscopables = require('../internals/add-to-unscopables');\n\nvar FIND = 'find';\nvar SKIPS_HOLES = true;\n\n// Shouldn't skip holes\n// eslint-disable-next-line es/no-array-prototype-find -- testing\nif (FIND in []) Array(1)[FIND](function () { SKIPS_HOLES = false; });\n\n// `Array.prototype.find` method\n// https://tc39.es/ecma262/#sec-array.prototype.find\n$({ target: 'Array', proto: true, forced: SKIPS_HOLES }, {\n  find: function find(callbackfn /* , that = undefined */) {\n    return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n  }\n});\n\n// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables(FIND);\n","/**\n * Lodash (Custom Build) <https://lodash.com/>\n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright OpenJS Foundation and other contributors <https://openjsf.org/>\n * Released under MIT license <https://lodash.com/license>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used to detect hot functions by number of calls within a span of milliseconds. */\nvar HOT_COUNT = 800,\n    HOT_SPAN = 16;\n\n/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n    arrayTag = '[object Array]',\n    asyncTag = '[object AsyncFunction]',\n    boolTag = '[object Boolean]',\n    dateTag = '[object Date]',\n    errorTag = '[object Error]',\n    funcTag = '[object Function]',\n    genTag = '[object GeneratorFunction]',\n    mapTag = '[object Map]',\n    numberTag = '[object Number]',\n    nullTag = '[object Null]',\n    objectTag = '[object Object]',\n    proxyTag = '[object Proxy]',\n    regexpTag = '[object RegExp]',\n    setTag = '[object Set]',\n    stringTag = '[object String]',\n    undefinedTag = '[object Undefined]',\n    weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n    dataViewTag = '[object DataView]',\n    float32Tag = '[object Float32Array]',\n    float64Tag = '[object Float64Array]',\n    int8Tag = '[object Int8Array]',\n    int16Tag = '[object Int16Array]',\n    int32Tag = '[object Int32Array]',\n    uint8Tag = '[object Uint8Array]',\n    uint8ClampedTag = '[object Uint8ClampedArray]',\n    uint16Tag = '[object Uint16Array]',\n    uint32Tag = '[object Uint32Array]';\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/** Used to identify `toStringTag` values of typed arrays. */\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\ntypedArrayTags[errorTag] = typedArrayTags[funcTag] =\ntypedArrayTags[mapTag] = typedArrayTags[numberTag] =\ntypedArrayTags[objectTag] = typedArrayTags[regexpTag] =\ntypedArrayTags[setTag] = typedArrayTags[stringTag] =\ntypedArrayTags[weakMapTag] = false;\n\n/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Detect free variable `process` from Node.js. */\nvar freeProcess = moduleExports && freeGlobal.process;\n\n/** Used to access faster Node.js helpers. */\nvar nodeUtil = (function() {\n  try {\n    // Use `util.types` for Node.js 10+.\n    var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n    if (types) {\n      return types;\n    }\n\n    // Legacy `process.binding('util')` for Node.js < 10.\n    return freeProcess && freeProcess.binding && freeProcess.binding('util');\n  } catch (e) {}\n}());\n\n/* Node.js helper references. */\nvar nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n/**\n * A faster alternative to `Function#apply`, this function invokes `func`\n * with the `this` binding of `thisArg` and the arguments of `args`.\n *\n * @private\n * @param {Function} func The function to invoke.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} args The arguments to invoke `func` with.\n * @returns {*} Returns the result of `func`.\n */\nfunction apply(func, thisArg, args) {\n  switch (args.length) {\n    case 0: return func.call(thisArg);\n    case 1: return func.call(thisArg, args[0]);\n    case 2: return func.call(thisArg, args[0], args[1]);\n    case 3: return func.call(thisArg, args[0], args[1], args[2]);\n  }\n  return func.apply(thisArg, args);\n}\n\n/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n  var index = -1,\n      result = Array(n);\n\n  while (++index < n) {\n    result[index] = iteratee(index);\n  }\n  return result;\n}\n\n/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n  return function(value) {\n    return func(value);\n  };\n}\n\n/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n  return object == null ? undefined : object[key];\n}\n\n/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n  return function(arg) {\n    return func(transform(arg));\n  };\n}\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype,\n    funcProto = Function.prototype,\n    objectProto = Object.prototype;\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n  var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n  return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Used to infer the `Object` constructor. */\nvar objectCtorString = funcToString.call(Object);\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n  funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n  .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined,\n    Symbol = root.Symbol,\n    Uint8Array = root.Uint8Array,\n    allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined,\n    getPrototype = overArg(Object.getPrototypeOf, Object),\n    objectCreate = Object.create,\n    propertyIsEnumerable = objectProto.propertyIsEnumerable,\n    splice = arrayProto.splice,\n    symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\nvar defineProperty = (function() {\n  try {\n    var func = getNative(Object, 'defineProperty');\n    func({}, '', {});\n    return func;\n  } catch (e) {}\n}());\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined,\n    nativeMax = Math.max,\n    nativeNow = Date.now;\n\n/* Built-in method references that are verified to be native. */\nvar Map = getNative(root, 'Map'),\n    nativeCreate = getNative(Object, 'create');\n\n/**\n * The base implementation of `_.create` without support for assigning\n * properties to the created object.\n *\n * @private\n * @param {Object} proto The object to inherit from.\n * @returns {Object} Returns the new object.\n */\nvar baseCreate = (function() {\n  function object() {}\n  return function(proto) {\n    if (!isObject(proto)) {\n      return {};\n    }\n    if (objectCreate) {\n      return objectCreate(proto);\n    }\n    object.prototype = proto;\n    var result = new object;\n    object.prototype = undefined;\n    return result;\n  };\n}());\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n  var index = -1,\n      length = entries == null ? 0 : entries.length;\n\n  this.clear();\n  while (++index < length) {\n    var entry = entries[index];\n    this.set(entry[0], entry[1]);\n  }\n}\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n  this.__data__ = nativeCreate ? nativeCreate(null) : {};\n  this.size = 0;\n}\n\n/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n  var result = this.has(key) && delete this.__data__[key];\n  this.size -= result ? 1 : 0;\n  return result;\n}\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n  var data = this.__data__;\n  if (nativeCreate) {\n    var result = data[key];\n    return result === HASH_UNDEFINED ? undefined : result;\n  }\n  return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n  var data = this.__data__;\n  return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n}\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n  var data = this.__data__;\n  this.size += this.has(key) ? 0 : 1;\n  data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n  return this;\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n  var index = -1,\n      length = entries == null ? 0 : entries.length;\n\n  this.clear();\n  while (++index < length) {\n    var entry = entries[index];\n    this.set(entry[0], entry[1]);\n  }\n}\n\n/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n  this.__data__ = [];\n  this.size = 0;\n}\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n  var data = this.__data__,\n      index = assocIndexOf(data, key);\n\n  if (index < 0) {\n    return false;\n  }\n  var lastIndex = data.length - 1;\n  if (index == lastIndex) {\n    data.pop();\n  } else {\n    splice.call(data, index, 1);\n  }\n  --this.size;\n  return true;\n}\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n  var data = this.__data__,\n      index = assocIndexOf(data, key);\n\n  return index < 0 ? undefined : data[index][1];\n}\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n  return assocIndexOf(this.__data__, key) > -1;\n}\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n  var data = this.__data__,\n      index = assocIndexOf(data, key);\n\n  if (index < 0) {\n    ++this.size;\n    data.push([key, value]);\n  } else {\n    data[index][1] = value;\n  }\n  return this;\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n  var index = -1,\n      length = entries == null ? 0 : entries.length;\n\n  this.clear();\n  while (++index < length) {\n    var entry = entries[index];\n    this.set(entry[0], entry[1]);\n  }\n}\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n  this.size = 0;\n  this.__data__ = {\n    'hash': new Hash,\n    'map': new (Map || ListCache),\n    'string': new Hash\n  };\n}\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n  var result = getMapData(this, key)['delete'](key);\n  this.size -= result ? 1 : 0;\n  return result;\n}\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n  return getMapData(this, key).get(key);\n}\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n  return getMapData(this, key).has(key);\n}\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n  var data = getMapData(this, key),\n      size = data.size;\n\n  data.set(key, value);\n  this.size += data.size == size ? 0 : 1;\n  return this;\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\n/**\n * Creates a stack cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Stack(entries) {\n  var data = this.__data__ = new ListCache(entries);\n  this.size = data.size;\n}\n\n/**\n * Removes all key-value entries from the stack.\n *\n * @private\n * @name clear\n * @memberOf Stack\n */\nfunction stackClear() {\n  this.__data__ = new ListCache;\n  this.size = 0;\n}\n\n/**\n * Removes `key` and its value from the stack.\n *\n * @private\n * @name delete\n * @memberOf Stack\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction stackDelete(key) {\n  var data = this.__data__,\n      result = data['delete'](key);\n\n  this.size = data.size;\n  return result;\n}\n\n/**\n * Gets the stack value for `key`.\n *\n * @private\n * @name get\n * @memberOf Stack\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction stackGet(key) {\n  return this.__data__.get(key);\n}\n\n/**\n * Checks if a stack value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Stack\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction stackHas(key) {\n  return this.__data__.has(key);\n}\n\n/**\n * Sets the stack `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Stack\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the stack cache instance.\n */\nfunction stackSet(key, value) {\n  var data = this.__data__;\n  if (data instanceof ListCache) {\n    var pairs = data.__data__;\n    if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n      pairs.push([key, value]);\n      this.size = ++data.size;\n      return this;\n    }\n    data = this.__data__ = new MapCache(pairs);\n  }\n  data.set(key, value);\n  this.size = data.size;\n  return this;\n}\n\n// Add methods to `Stack`.\nStack.prototype.clear = stackClear;\nStack.prototype['delete'] = stackDelete;\nStack.prototype.get = stackGet;\nStack.prototype.has = stackHas;\nStack.prototype.set = stackSet;\n\n/**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\nfunction arrayLikeKeys(value, inherited) {\n  var isArr = isArray(value),\n      isArg = !isArr && isArguments(value),\n      isBuff = !isArr && !isArg && isBuffer(value),\n      isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n      skipIndexes = isArr || isArg || isBuff || isType,\n      result = skipIndexes ? baseTimes(value.length, String) : [],\n      length = result.length;\n\n  for (var key in value) {\n    if ((inherited || hasOwnProperty.call(value, key)) &&\n        !(skipIndexes && (\n           // Safari 9 has enumerable `arguments.length` in strict mode.\n           key == 'length' ||\n           // Node.js 0.10 has enumerable non-index properties on buffers.\n           (isBuff && (key == 'offset' || key == 'parent')) ||\n           // PhantomJS 2 has enumerable non-index properties on typed arrays.\n           (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n           // Skip index properties.\n           isIndex(key, length)\n        ))) {\n      result.push(key);\n    }\n  }\n  return result;\n}\n\n/**\n * This function is like `assignValue` except that it doesn't assign\n * `undefined` values.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignMergeValue(object, key, value) {\n  if ((value !== undefined && !eq(object[key], value)) ||\n      (value === undefined && !(key in object))) {\n    baseAssignValue(object, key, value);\n  }\n}\n\n/**\n * Assigns `value` to `key` of `object` if the existing value is not equivalent\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignValue(object, key, value) {\n  var objValue = object[key];\n  if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n      (value === undefined && !(key in object))) {\n    baseAssignValue(object, key, value);\n  }\n}\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n  var length = array.length;\n  while (length--) {\n    if (eq(array[length][0], key)) {\n      return length;\n    }\n  }\n  return -1;\n}\n\n/**\n * The base implementation of `assignValue` and `assignMergeValue` without\n * value checks.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction baseAssignValue(object, key, value) {\n  if (key == '__proto__' && defineProperty) {\n    defineProperty(object, key, {\n      'configurable': true,\n      'enumerable': true,\n      'value': value,\n      'writable': true\n    });\n  } else {\n    object[key] = value;\n  }\n}\n\n/**\n * The base implementation of `baseForOwn` which iterates over `object`\n * properties returned by `keysFunc` and invokes `iteratee` for each property.\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @returns {Object} Returns `object`.\n */\nvar baseFor = createBaseFor();\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n  if (value == null) {\n    return value === undefined ? undefinedTag : nullTag;\n  }\n  return (symToStringTag && symToStringTag in Object(value))\n    ? getRawTag(value)\n    : objectToString(value);\n}\n\n/**\n * The base implementation of `_.isArguments`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n */\nfunction baseIsArguments(value) {\n  return isObjectLike(value) && baseGetTag(value) == argsTag;\n}\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n *  else `false`.\n */\nfunction baseIsNative(value) {\n  if (!isObject(value) || isMasked(value)) {\n    return false;\n  }\n  var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n  return pattern.test(toSource(value));\n}\n\n/**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */\nfunction baseIsTypedArray(value) {\n  return isObjectLike(value) &&\n    isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n}\n\n/**\n * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeysIn(object) {\n  if (!isObject(object)) {\n    return nativeKeysIn(object);\n  }\n  var isProto = isPrototype(object),\n      result = [];\n\n  for (var key in object) {\n    if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n      result.push(key);\n    }\n  }\n  return result;\n}\n\n/**\n * The base implementation of `_.merge` without support for multiple sources.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @param {number} srcIndex The index of `source`.\n * @param {Function} [customizer] The function to customize merged values.\n * @param {Object} [stack] Tracks traversed source values and their merged\n *  counterparts.\n */\nfunction baseMerge(object, source, srcIndex, customizer, stack) {\n  if (object === source) {\n    return;\n  }\n  baseFor(source, function(srcValue, key) {\n    stack || (stack = new Stack);\n    if (isObject(srcValue)) {\n      baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);\n    }\n    else {\n      var newValue = customizer\n        ? customizer(safeGet(object, key), srcValue, (key + ''), object, source, stack)\n        : undefined;\n\n      if (newValue === undefined) {\n        newValue = srcValue;\n      }\n      assignMergeValue(object, key, newValue);\n    }\n  }, keysIn);\n}\n\n/**\n * A specialized version of `baseMerge` for arrays and objects which performs\n * deep merges and tracks traversed objects enabling objects with circular\n * references to be merged.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @param {string} key The key of the value to merge.\n * @param {number} srcIndex The index of `source`.\n * @param {Function} mergeFunc The function to merge values.\n * @param {Function} [customizer] The function to customize assigned values.\n * @param {Object} [stack] Tracks traversed source values and their merged\n *  counterparts.\n */\nfunction baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {\n  var objValue = safeGet(object, key),\n      srcValue = safeGet(source, key),\n      stacked = stack.get(srcValue);\n\n  if (stacked) {\n    assignMergeValue(object, key, stacked);\n    return;\n  }\n  var newValue = customizer\n    ? customizer(objValue, srcValue, (key + ''), object, source, stack)\n    : undefined;\n\n  var isCommon = newValue === undefined;\n\n  if (isCommon) {\n    var isArr = isArray(srcValue),\n        isBuff = !isArr && isBuffer(srcValue),\n        isTyped = !isArr && !isBuff && isTypedArray(srcValue);\n\n    newValue = srcValue;\n    if (isArr || isBuff || isTyped) {\n      if (isArray(objValue)) {\n        newValue = objValue;\n      }\n      else if (isArrayLikeObject(objValue)) {\n        newValue = copyArray(objValue);\n      }\n      else if (isBuff) {\n        isCommon = false;\n        newValue = cloneBuffer(srcValue, true);\n      }\n      else if (isTyped) {\n        isCommon = false;\n        newValue = cloneTypedArray(srcValue, true);\n      }\n      else {\n        newValue = [];\n      }\n    }\n    else if (isPlainObject(srcValue) || isArguments(srcValue)) {\n      newValue = objValue;\n      if (isArguments(objValue)) {\n        newValue = toPlainObject(objValue);\n      }\n      else if (!isObject(objValue) || isFunction(objValue)) {\n        newValue = initCloneObject(srcValue);\n      }\n    }\n    else {\n      isCommon = false;\n    }\n  }\n  if (isCommon) {\n    // Recursively merge objects and arrays (susceptible to call stack limits).\n    stack.set(srcValue, newValue);\n    mergeFunc(newValue, srcValue, srcIndex, customizer, stack);\n    stack['delete'](srcValue);\n  }\n  assignMergeValue(object, key, newValue);\n}\n\n/**\n * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n */\nfunction baseRest(func, start) {\n  return setToString(overRest(func, start, identity), func + '');\n}\n\n/**\n * The base implementation of `setToString` without support for hot loop shorting.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar baseSetToString = !defineProperty ? identity : function(func, string) {\n  return defineProperty(func, 'toString', {\n    'configurable': true,\n    'enumerable': false,\n    'value': constant(string),\n    'writable': true\n  });\n};\n\n/**\n * Creates a clone of  `buffer`.\n *\n * @private\n * @param {Buffer} buffer The buffer to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Buffer} Returns the cloned buffer.\n */\nfunction cloneBuffer(buffer, isDeep) {\n  if (isDeep) {\n    return buffer.slice();\n  }\n  var length = buffer.length,\n      result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);\n\n  buffer.copy(result);\n  return result;\n}\n\n/**\n * Creates a clone of `arrayBuffer`.\n *\n * @private\n * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\n * @returns {ArrayBuffer} Returns the cloned array buffer.\n */\nfunction cloneArrayBuffer(arrayBuffer) {\n  var result = new arrayBuffer.constructor(arrayBuffer.byteLength);\n  new Uint8Array(result).set(new Uint8Array(arrayBuffer));\n  return result;\n}\n\n/**\n * Creates a clone of `typedArray`.\n *\n * @private\n * @param {Object} typedArray The typed array to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned typed array.\n */\nfunction cloneTypedArray(typedArray, isDeep) {\n  var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;\n  return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);\n}\n\n/**\n * Copies the values of `source` to `array`.\n *\n * @private\n * @param {Array} source The array to copy values from.\n * @param {Array} [array=[]] The array to copy values to.\n * @returns {Array} Returns `array`.\n */\nfunction copyArray(source, array) {\n  var index = -1,\n      length = source.length;\n\n  array || (array = Array(length));\n  while (++index < length) {\n    array[index] = source[index];\n  }\n  return array;\n}\n\n/**\n * Copies properties of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy properties from.\n * @param {Array} props The property identifiers to copy.\n * @param {Object} [object={}] The object to copy properties to.\n * @param {Function} [customizer] The function to customize copied values.\n * @returns {Object} Returns `object`.\n */\nfunction copyObject(source, props, object, customizer) {\n  var isNew = !object;\n  object || (object = {});\n\n  var index = -1,\n      length = props.length;\n\n  while (++index < length) {\n    var key = props[index];\n\n    var newValue = customizer\n      ? customizer(object[key], source[key], key, object, source)\n      : undefined;\n\n    if (newValue === undefined) {\n      newValue = source[key];\n    }\n    if (isNew) {\n      baseAssignValue(object, key, newValue);\n    } else {\n      assignValue(object, key, newValue);\n    }\n  }\n  return object;\n}\n\n/**\n * Creates a function like `_.assign`.\n *\n * @private\n * @param {Function} assigner The function to assign values.\n * @returns {Function} Returns the new assigner function.\n */\nfunction createAssigner(assigner) {\n  return baseRest(function(object, sources) {\n    var index = -1,\n        length = sources.length,\n        customizer = length > 1 ? sources[length - 1] : undefined,\n        guard = length > 2 ? sources[2] : undefined;\n\n    customizer = (assigner.length > 3 && typeof customizer == 'function')\n      ? (length--, customizer)\n      : undefined;\n\n    if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n      customizer = length < 3 ? undefined : customizer;\n      length = 1;\n    }\n    object = Object(object);\n    while (++index < length) {\n      var source = sources[index];\n      if (source) {\n        assigner(object, source, index, customizer);\n      }\n    }\n    return object;\n  });\n}\n\n/**\n * Creates a base function for methods like `_.forIn` and `_.forOwn`.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseFor(fromRight) {\n  return function(object, iteratee, keysFunc) {\n    var index = -1,\n        iterable = Object(object),\n        props = keysFunc(object),\n        length = props.length;\n\n    while (length--) {\n      var key = props[fromRight ? length : ++index];\n      if (iteratee(iterable[key], key, iterable) === false) {\n        break;\n      }\n    }\n    return object;\n  };\n}\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n  var data = map.__data__;\n  return isKeyable(key)\n    ? data[typeof key == 'string' ? 'string' : 'hash']\n    : data.map;\n}\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n  var value = getValue(object, key);\n  return baseIsNative(value) ? value : undefined;\n}\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n  var isOwn = hasOwnProperty.call(value, symToStringTag),\n      tag = value[symToStringTag];\n\n  try {\n    value[symToStringTag] = undefined;\n    var unmasked = true;\n  } catch (e) {}\n\n  var result = nativeObjectToString.call(value);\n  if (unmasked) {\n    if (isOwn) {\n      value[symToStringTag] = tag;\n    } else {\n      delete value[symToStringTag];\n    }\n  }\n  return result;\n}\n\n/**\n * Initializes an object clone.\n *\n * @private\n * @param {Object} object The object to clone.\n * @returns {Object} Returns the initialized clone.\n */\nfunction initCloneObject(object) {\n  return (typeof object.constructor == 'function' && !isPrototype(object))\n    ? baseCreate(getPrototype(object))\n    : {};\n}\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n  var type = typeof value;\n  length = length == null ? MAX_SAFE_INTEGER : length;\n\n  return !!length &&\n    (type == 'number' ||\n      (type != 'symbol' && reIsUint.test(value))) &&\n        (value > -1 && value % 1 == 0 && value < length);\n}\n\n/**\n * Checks if the given arguments are from an iteratee call.\n *\n * @private\n * @param {*} value The potential iteratee value argument.\n * @param {*} index The potential iteratee index or key argument.\n * @param {*} object The potential iteratee object argument.\n * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\n *  else `false`.\n */\nfunction isIterateeCall(value, index, object) {\n  if (!isObject(object)) {\n    return false;\n  }\n  var type = typeof index;\n  if (type == 'number'\n        ? (isArrayLike(object) && isIndex(index, object.length))\n        : (type == 'string' && index in object)\n      ) {\n    return eq(object[index], value);\n  }\n  return false;\n}\n\n/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n  var type = typeof value;\n  return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n    ? (value !== '__proto__')\n    : (value === null);\n}\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n  return !!maskSrcKey && (maskSrcKey in func);\n}\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n  var Ctor = value && value.constructor,\n      proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n  return value === proto;\n}\n\n/**\n * This function is like\n * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * except that it includes inherited enumerable properties.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction nativeKeysIn(object) {\n  var result = [];\n  if (object != null) {\n    for (var key in Object(object)) {\n      result.push(key);\n    }\n  }\n  return result;\n}\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n  return nativeObjectToString.call(value);\n}\n\n/**\n * A specialized version of `baseRest` which transforms the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @param {Function} transform The rest array transform.\n * @returns {Function} Returns the new function.\n */\nfunction overRest(func, start, transform) {\n  start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n  return function() {\n    var args = arguments,\n        index = -1,\n        length = nativeMax(args.length - start, 0),\n        array = Array(length);\n\n    while (++index < length) {\n      array[index] = args[start + index];\n    }\n    index = -1;\n    var otherArgs = Array(start + 1);\n    while (++index < start) {\n      otherArgs[index] = args[index];\n    }\n    otherArgs[start] = transform(array);\n    return apply(func, this, otherArgs);\n  };\n}\n\n/**\n * Gets the value at `key`, unless `key` is \"__proto__\" or \"constructor\".\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction safeGet(object, key) {\n  if (key === 'constructor' && typeof object[key] === 'function') {\n    return;\n  }\n\n  if (key == '__proto__') {\n    return;\n  }\n\n  return object[key];\n}\n\n/**\n * Sets the `toString` method of `func` to return `string`.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar setToString = shortOut(baseSetToString);\n\n/**\n * Creates a function that'll short out and invoke `identity` instead\n * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\n * milliseconds.\n *\n * @private\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new shortable function.\n */\nfunction shortOut(func) {\n  var count = 0,\n      lastCalled = 0;\n\n  return function() {\n    var stamp = nativeNow(),\n        remaining = HOT_SPAN - (stamp - lastCalled);\n\n    lastCalled = stamp;\n    if (remaining > 0) {\n      if (++count >= HOT_COUNT) {\n        return arguments[0];\n      }\n    } else {\n      count = 0;\n    }\n    return func.apply(undefined, arguments);\n  };\n}\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n  if (func != null) {\n    try {\n      return funcToString.call(func);\n    } catch (e) {}\n    try {\n      return (func + '');\n    } catch (e) {}\n  }\n  return '';\n}\n\n/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n  return value === other || (value !== value && other !== other);\n}\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n *  else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nvar isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n  return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n    !propertyIsEnumerable.call(value, 'callee');\n};\n\n/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n  return value != null && isLength(value.length) && !isFunction(value);\n}\n\n/**\n * This method is like `_.isArrayLike` except that it also checks if `value`\n * is an object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array-like object,\n *  else `false`.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject('abc');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */\nfunction isArrayLikeObject(value) {\n  return isObjectLike(value) && isArrayLike(value);\n}\n\n/**\n * Checks if `value` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */\nvar isBuffer = nativeIsBuffer || stubFalse;\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n  if (!isObject(value)) {\n    return false;\n  }\n  // The use of `Object#toString` avoids issues with the `typeof` operator\n  // in Safari 9 which returns 'object' for typed arrays and other constructors.\n  var tag = baseGetTag(value);\n  return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n  return typeof value == 'number' &&\n    value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n  var type = typeof value;\n  return value != null && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n  return value != null && typeof value == 'object';\n}\n\n/**\n * Checks if `value` is a plain object, that is, an object created by the\n * `Object` constructor or one with a `[[Prototype]]` of `null`.\n *\n * @static\n * @memberOf _\n * @since 0.8.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n * @example\n *\n * function Foo() {\n *   this.a = 1;\n * }\n *\n * _.isPlainObject(new Foo);\n * // => false\n *\n * _.isPlainObject([1, 2, 3]);\n * // => false\n *\n * _.isPlainObject({ 'x': 0, 'y': 0 });\n * // => true\n *\n * _.isPlainObject(Object.create(null));\n * // => true\n */\nfunction isPlainObject(value) {\n  if (!isObjectLike(value) || baseGetTag(value) != objectTag) {\n    return false;\n  }\n  var proto = getPrototype(value);\n  if (proto === null) {\n    return true;\n  }\n  var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;\n  return typeof Ctor == 'function' && Ctor instanceof Ctor &&\n    funcToString.call(Ctor) == objectCtorString;\n}\n\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\nvar isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\n/**\n * Converts `value` to a plain object flattening inherited enumerable string\n * keyed properties of `value` to own properties of the plain object.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {Object} Returns the converted plain object.\n * @example\n *\n * function Foo() {\n *   this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.assign({ 'a': 1 }, new Foo);\n * // => { 'a': 1, 'b': 2 }\n *\n * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));\n * // => { 'a': 1, 'b': 2, 'c': 3 }\n */\nfunction toPlainObject(value) {\n  return copyObject(value, keysIn(value));\n}\n\n/**\n * Creates an array of the own and inherited enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n *   this.a = 1;\n *   this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keysIn(new Foo);\n * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n */\nfunction keysIn(object) {\n  return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\n}\n\n/**\n * This method is like `_.assign` except that it recursively merges own and\n * inherited enumerable string keyed properties of source objects into the\n * destination object. Source properties that resolve to `undefined` are\n * skipped if a destination value exists. Array and plain object properties\n * are merged recursively. Other objects and value types are overridden by\n * assignment. Source objects are applied from left to right. Subsequent\n * sources overwrite property assignments of previous sources.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 0.5.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = {\n *   'a': [{ 'b': 2 }, { 'd': 4 }]\n * };\n *\n * var other = {\n *   'a': [{ 'c': 3 }, { 'e': 5 }]\n * };\n *\n * _.merge(object, other);\n * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }\n */\nvar merge = createAssigner(function(object, source, srcIndex) {\n  baseMerge(object, source, srcIndex);\n});\n\n/**\n * Creates a function that returns `value`.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {*} value The value to return from the new function.\n * @returns {Function} Returns the new constant function.\n * @example\n *\n * var objects = _.times(2, _.constant({ 'a': 1 }));\n *\n * console.log(objects);\n * // => [{ 'a': 1 }, { 'a': 1 }]\n *\n * console.log(objects[0] === objects[1]);\n * // => true\n */\nfunction constant(value) {\n  return function() {\n    return value;\n  };\n}\n\n/**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */\nfunction identity(value) {\n  return value;\n}\n\n/**\n * This method returns `false`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `false`.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\nfunction stubFalse() {\n  return false;\n}\n\nmodule.exports = merge;\n","const t=(t,e=1e4)=>(t=parseFloat(t+\"\")||0,Math.round((t+Number.EPSILON)*e)/e),e=function(t){if(!(t&&t instanceof Element&&t.offsetParent))return!1;const e=t.scrollHeight>t.clientHeight,i=window.getComputedStyle(t).overflowY,n=-1!==i.indexOf(\"hidden\"),s=-1!==i.indexOf(\"visible\");return e&&!n&&!s},i=function(t,n=void 0){return!(!t||t===document.body||n&&t===n)&&(e(t)?t:i(t.parentElement,n))},n=function(t){var e=(new DOMParser).parseFromString(t,\"text/html\").body;if(e.childElementCount>1){for(var i=document.createElement(\"div\");e.firstChild;)i.appendChild(e.firstChild);return i}return e.firstChild},s=t=>`${t||\"\"}`.split(\" \").filter((t=>!!t)),o=(t,e,i)=>{t&&s(e).forEach((e=>{t.classList.toggle(e,i||!1)}))};class a{constructor(t){Object.defineProperty(this,\"pageX\",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,\"pageY\",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,\"clientX\",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,\"clientY\",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,\"id\",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,\"time\",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,\"nativePointer\",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.nativePointer=t,this.pageX=t.pageX,this.pageY=t.pageY,this.clientX=t.clientX,this.clientY=t.clientY,this.id=self.Touch&&t instanceof Touch?t.identifier:-1,this.time=Date.now()}}const r={passive:!1};class l{constructor(t,{start:e=(()=>!0),move:i=(()=>{}),end:n=(()=>{})}){Object.defineProperty(this,\"element\",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,\"startCallback\",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,\"moveCallback\",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,\"endCallback\",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,\"currentPointers\",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,\"startPointers\",{enumerable:!0,configurable:!0,writable:!0,value:[]}),this.element=t,this.startCallback=e,this.moveCallback=i,this.endCallback=n;for(const t of[\"onPointerStart\",\"onTouchStart\",\"onMove\",\"onTouchEnd\",\"onPointerEnd\",\"onWindowBlur\"])this[t]=this[t].bind(this);this.element.addEventListener(\"mousedown\",this.onPointerStart,r),this.element.addEventListener(\"touchstart\",this.onTouchStart,r),this.element.addEventListener(\"touchmove\",this.onMove,r),this.element.addEventListener(\"touchend\",this.onTouchEnd),this.element.addEventListener(\"touchcancel\",this.onTouchEnd)}onPointerStart(t){if(!t.buttons||0!==t.button)return;const e=new a(t);this.currentPointers.some((t=>t.id===e.id))||this.triggerPointerStart(e,t)&&(window.addEventListener(\"mousemove\",this.onMove),window.addEventListener(\"mouseup\",this.onPointerEnd),window.addEventListener(\"blur\",this.onWindowBlur))}onTouchStart(t){for(const e of Array.from(t.changedTouches||[]))this.triggerPointerStart(new a(e),t);window.addEventListener(\"blur\",this.onWindowBlur)}onMove(t){const e=this.currentPointers.slice(),i=\"changedTouches\"in t?Array.from(t.changedTouches||[]).map((t=>new a(t))):[new a(t)],n=[];for(const t of i){const e=this.currentPointers.findIndex((e=>e.id===t.id));e<0||(n.push(t),this.currentPointers[e]=t)}n.length&&this.moveCallback(t,this.currentPointers.slice(),e)}onPointerEnd(t){t.buttons>0&&0!==t.button||(this.triggerPointerEnd(t,new a(t)),window.removeEventListener(\"mousemove\",this.onMove),window.removeEventListener(\"mouseup\",this.onPointerEnd),window.removeEventListener(\"blur\",this.onWindowBlur))}onTouchEnd(t){for(const e of Array.from(t.changedTouches||[]))this.triggerPointerEnd(t,new a(e))}triggerPointerStart(t,e){return!!this.startCallback(e,t,this.currentPointers.slice())&&(this.currentPointers.push(t),this.startPointers.push(t),!0)}triggerPointerEnd(t,e){const i=this.currentPointers.findIndex((t=>t.id===e.id));i<0||(this.currentPointers.splice(i,1),this.startPointers.splice(i,1),this.endCallback(t,e,this.currentPointers.slice()))}onWindowBlur(){this.clear()}clear(){for(;this.currentPointers.length;){const t=this.currentPointers[this.currentPointers.length-1];this.currentPointers.splice(this.currentPointers.length-1,1),this.startPointers.splice(this.currentPointers.length-1,1),this.endCallback(new Event(\"touchend\",{bubbles:!0,cancelable:!0,clientX:t.clientX,clientY:t.clientY}),t,this.currentPointers.slice())}}stop(){this.element.removeEventListener(\"mousedown\",this.onPointerStart,r),this.element.removeEventListener(\"touchstart\",this.onTouchStart,r),this.element.removeEventListener(\"touchmove\",this.onMove,r),this.element.removeEventListener(\"touchend\",this.onTouchEnd),this.element.removeEventListener(\"touchcancel\",this.onTouchEnd),window.removeEventListener(\"mousemove\",this.onMove),window.removeEventListener(\"mouseup\",this.onPointerEnd),window.removeEventListener(\"blur\",this.onWindowBlur)}}function c(t,e){return e?Math.sqrt(Math.pow(e.clientX-t.clientX,2)+Math.pow(e.clientY-t.clientY,2)):0}function h(t,e){return e?{clientX:(t.clientX+e.clientX)/2,clientY:(t.clientY+e.clientY)/2}:t}const d=t=>\"object\"==typeof t&&null!==t&&t.constructor===Object&&\"[object Object]\"===Object.prototype.toString.call(t),u=(t,...e)=>{const i=e.length;for(let n=0;n<i;n++){const i=e[n]||{};Object.entries(i).forEach((([e,i])=>{const n=Array.isArray(i)?[]:{};t[e]||Object.assign(t,{[e]:n}),d(i)?Object.assign(t[e],u(n,i)):Array.isArray(i)?Object.assign(t,{[e]:[...i]}):Object.assign(t,{[e]:i})}))}return t},p=function(t,e){return t.split(\".\").reduce(((t,e)=>\"object\"==typeof t?t[e]:void 0),e)};class f{constructor(t={}){Object.defineProperty(this,\"options\",{enumerable:!0,configurable:!0,writable:!0,value:t}),Object.defineProperty(this,\"events\",{enumerable:!0,configurable:!0,writable:!0,value:new Map}),this.setOptions(t);for(const t of Object.getOwnPropertyNames(Object.getPrototypeOf(this)))t.startsWith(\"on\")&&\"function\"==typeof this[t]&&(this[t]=this[t].bind(this))}setOptions(t){this.options=t?u({},this.constructor.defaults,t):{};for(const[t,e]of Object.entries(this.option(\"on\")||{}))this.on(t,e)}option(t,...e){let i=p(t,this.options);return i&&\"function\"==typeof i&&(i=i.call(this,this,...e)),i}optionFor(t,e,i,...n){let s=p(e,t);var o;\"string\"!=typeof(o=s)||isNaN(o)||isNaN(parseFloat(o))||(s=parseFloat(s)),\"true\"===s&&(s=!0),\"false\"===s&&(s=!1),s&&\"function\"==typeof s&&(s=s.call(this,this,t,...n));let a=p(e,this.options);return a&&\"function\"==typeof a?s=a.call(this,this,t,...n,s):void 0===s&&(s=a),void 0===s?i:s}cn(t){const e=this.options.classes;return e&&e[t]||\"\"}localize(t,e=[]){t=String(t).replace(/\\{\\{(\\w+).?(\\w+)?\\}\\}/g,((t,e,i)=>{let n=\"\";return i?n=this.option(`${e[0]+e.toLowerCase().substring(1)}.l10n.${i}`):e&&(n=this.option(`l10n.${e}`)),n||(n=t),n}));for(let i=0;i<e.length;i++)t=t.split(e[i][0]).join(e[i][1]);return t=t.replace(/\\{\\{(.*?)\\}\\}/g,((t,e)=>e))}on(t,e){let i=[];\"string\"==typeof t?i=t.split(\" \"):Array.isArray(t)&&(i=t),this.events||(this.events=new Map),i.forEach((t=>{let i=this.events.get(t);i||(this.events.set(t,[]),i=[]),i.includes(e)||i.push(e),this.events.set(t,i)}))}off(t,e){let i=[];\"string\"==typeof t?i=t.split(\" \"):Array.isArray(t)&&(i=t),i.forEach((t=>{const i=this.events.get(t);if(Array.isArray(i)){const t=i.indexOf(e);t>-1&&i.splice(t,1)}}))}emit(t,...e){[...this.events.get(t)||[]].forEach((t=>t(this,...e))),\"*\"!==t&&this.emit(\"*\",t,...e)}}Object.defineProperty(f,\"version\",{enumerable:!0,configurable:!0,writable:!0,value:\"5.0.36\"}),Object.defineProperty(f,\"defaults\",{enumerable:!0,configurable:!0,writable:!0,value:{}});class g extends f{constructor(t={}){super(t),Object.defineProperty(this,\"plugins\",{enumerable:!0,configurable:!0,writable:!0,value:{}})}attachPlugins(t={}){const e=new Map;for(const[i,n]of Object.entries(t)){const t=this.option(i),s=this.plugins[i];s||!1===t?s&&!1===t&&(s.detach(),delete this.plugins[i]):e.set(i,new n(this,t||{}))}for(const[t,i]of e)this.plugins[t]=i,i.attach()}detachPlugins(t){t=t||Object.keys(this.plugins);for(const e of t){const t=this.plugins[e];t&&t.detach(),delete this.plugins[e]}return this.emit(\"detachPlugins\"),this}}var m;!function(t){t[t.Init=0]=\"Init\",t[t.Error=1]=\"Error\",t[t.Ready=2]=\"Ready\",t[t.Panning=3]=\"Panning\",t[t.Mousemove=4]=\"Mousemove\",t[t.Destroy=5]=\"Destroy\"}(m||(m={}));const v=[\"a\",\"b\",\"c\",\"d\",\"e\",\"f\"],b={PANUP:\"Move up\",PANDOWN:\"Move down\",PANLEFT:\"Move left\",PANRIGHT:\"Move right\",ZOOMIN:\"Zoom in\",ZOOMOUT:\"Zoom out\",TOGGLEZOOM:\"Toggle zoom level\",TOGGLE1TO1:\"Toggle zoom level\",ITERATEZOOM:\"Toggle zoom level\",ROTATECCW:\"Rotate counterclockwise\",ROTATECW:\"Rotate clockwise\",FLIPX:\"Flip horizontally\",FLIPY:\"Flip vertically\",FITX:\"Fit horizontally\",FITY:\"Fit vertically\",RESET:\"Reset\",TOGGLEFS:\"Toggle fullscreen\"},y={content:null,width:\"auto\",height:\"auto\",panMode:\"drag\",touch:!0,dragMinThreshold:3,lockAxis:!1,mouseMoveFactor:1,mouseMoveFriction:.12,zoom:!0,pinchToZoom:!0,panOnlyZoomed:\"auto\",minScale:1,maxScale:2,friction:.25,dragFriction:.35,decelFriction:.05,click:\"toggleZoom\",dblClick:!1,wheel:\"zoom\",wheelLimit:7,spinner:!0,bounds:\"auto\",infinite:!1,rubberband:!0,bounce:!0,maxVelocity:75,transformParent:!1,classes:{content:\"f-panzoom__content\",isLoading:\"is-loading\",canZoomIn:\"can-zoom_in\",canZoomOut:\"can-zoom_out\",isDraggable:\"is-draggable\",isDragging:\"is-dragging\",inFullscreen:\"in-fullscreen\",htmlHasFullscreen:\"with-panzoom-in-fullscreen\"},l10n:b},w='<circle cx=\"25\" cy=\"25\" r=\"20\"></circle>',x='<div class=\"f-spinner\"><svg viewBox=\"0 0 50 50\">'+w+w+\"</svg></div>\",E=t=>t&&null!==t&&t instanceof Element&&\"nodeType\"in t,S=(t,e)=>{t&&s(e).forEach((e=>{t.classList.remove(e)}))},P=(t,e)=>{t&&s(e).forEach((e=>{t.classList.add(e)}))},C={a:1,b:0,c:0,d:1,e:0,f:0},T=1e5,M=1e4,O=\"mousemove\",A=\"drag\",L=\"content\",z=\"auto\";let R=null,k=null;class I extends g{get fits(){return this.contentRect.width-this.contentRect.fitWidth<1&&this.contentRect.height-this.contentRect.fitHeight<1}get isTouchDevice(){return null===k&&(k=window.matchMedia(\"(hover: none)\").matches),k}get isMobile(){return null===R&&(R=/iPhone|iPad|iPod|Android/i.test(navigator.userAgent)),R}get panMode(){return this.options.panMode!==O||this.isTouchDevice?A:O}get panOnlyZoomed(){const t=this.options.panOnlyZoomed;return t===z?this.isTouchDevice:t}get isInfinite(){return this.option(\"infinite\")}get angle(){return 180*Math.atan2(this.current.b,this.current.a)/Math.PI||0}get targetAngle(){return 180*Math.atan2(this.target.b,this.target.a)/Math.PI||0}get scale(){const{a:t,b:e}=this.current;return Math.sqrt(t*t+e*e)||1}get targetScale(){const{a:t,b:e}=this.target;return Math.sqrt(t*t+e*e)||1}get minScale(){return this.option(\"minScale\")||1}get fullScale(){const{contentRect:t}=this;return t.fullWidth/t.fitWidth||1}get maxScale(){return this.fullScale*(this.option(\"maxScale\")||1)||1}get coverScale(){const{containerRect:t,contentRect:e}=this,i=Math.max(t.height/e.fitHeight,t.width/e.fitWidth)||1;return Math.min(this.fullScale,i)}get isScaling(){return Math.abs(this.targetScale-this.scale)>1e-5&&!this.isResting}get isContentLoading(){const t=this.content;return!!(t&&t instanceof HTMLImageElement)&&!t.complete}get isResting(){if(this.isBouncingX||this.isBouncingY)return!1;for(const t of v){const e=\"e\"==t||\"f\"===t?1e-4:1e-5;if(Math.abs(this.target[t]-this.current[t])>e)return!1}return!(!this.ignoreBounds&&!this.checkBounds().inBounds)}constructor(t,e={},i={}){var s;if(super(e),Object.defineProperty(this,\"pointerTracker\",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,\"resizeObserver\",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,\"updateTimer\",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,\"clickTimer\",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,\"rAF\",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,\"isTicking\",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,\"ignoreBounds\",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,\"isBouncingX\",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,\"isBouncingY\",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,\"clicks\",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,\"trackingPoints\",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,\"pwt\",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,\"cwd\",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,\"pmme\",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,\"friction\",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,\"state\",{enumerable:!0,configurable:!0,writable:!0,value:m.Init}),Object.defineProperty(this,\"isDragging\",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,\"container\",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,\"content\",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,\"spinner\",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,\"containerRect\",{enumerable:!0,configurable:!0,writable:!0,value:{width:0,height:0,innerWidth:0,innerHeight:0}}),Object.defineProperty(this,\"contentRect\",{enumerable:!0,configurable:!0,writable:!0,value:{top:0,right:0,bottom:0,left:0,fullWidth:0,fullHeight:0,fitWidth:0,fitHeight:0,width:0,height:0}}),Object.defineProperty(this,\"dragStart\",{enumerable:!0,configurable:!0,writable:!0,value:{x:0,y:0,top:0,left:0,time:0}}),Object.defineProperty(this,\"dragOffset\",{enumerable:!0,configurable:!0,writable:!0,value:{x:0,y:0,time:0}}),Object.defineProperty(this,\"current\",{enumerable:!0,configurable:!0,writable:!0,value:Object.assign({},C)}),Object.defineProperty(this,\"target\",{enumerable:!0,configurable:!0,writable:!0,value:Object.assign({},C)}),Object.defineProperty(this,\"velocity\",{enumerable:!0,configurable:!0,writable:!0,value:{a:0,b:0,c:0,d:0,e:0,f:0}}),Object.defineProperty(this,\"lockedAxis\",{enumerable:!0,configurable:!0,writable:!0,value:!1}),!t)throw new Error(\"Container Element Not Found\");this.container=t,this.initContent(),this.attachPlugins(Object.assign(Object.assign({},I.Plugins),i)),this.emit(\"attachPlugins\"),this.emit(\"init\");const o=this.content;if(o.addEventListener(\"load\",this.onLoad),o.addEventListener(\"error\",this.onError),this.isContentLoading){if(this.option(\"spinner\")){t.classList.add(this.cn(\"isLoading\"));const e=n(x);!t.contains(o)||o.parentElement instanceof HTMLPictureElement?this.spinner=t.appendChild(e):this.spinner=(null===(s=o.parentElement)||void 0===s?void 0:s.insertBefore(e,o))||null}this.emit(\"beforeLoad\")}else queueMicrotask((()=>{this.enable()}))}initContent(){const{container:t}=this,e=this.cn(L);let i=this.option(L)||t.querySelector(`.${e}`);if(i||(i=t.querySelector(\"img,picture\")||t.firstElementChild,i&&P(i,e)),i instanceof HTMLPictureElement&&(i=i.querySelector(\"img\")),!i)throw new Error(\"No content found\");this.content=i}onLoad(){const{spinner:t,container:e,state:i}=this;t&&(t.remove(),this.spinner=null),this.option(\"spinner\")&&e.classList.remove(this.cn(\"isLoading\")),this.emit(\"afterLoad\"),i===m.Init?this.enable():this.updateMetrics()}onError(){this.state!==m.Destroy&&(this.spinner&&(this.spinner.remove(),this.spinner=null),this.stop(),this.detachEvents(),this.state=m.Error,this.emit(\"error\"))}getNextScale(t){const{fullScale:e,targetScale:i,coverScale:n,maxScale:s,minScale:o}=this;let a=o;switch(t){case\"toggleMax\":a=i-o<.5*(s-o)?s:o;break;case\"toggleCover\":a=i-o<.5*(n-o)?n:o;break;case\"toggleZoom\":a=i-o<.5*(e-o)?e:o;break;case\"iterateZoom\":let t=[1,e,s].sort(((t,e)=>t-e)),r=t.findIndex((t=>t>i+1e-5));a=t[r]||1}return a}attachObserver(){var t;const e=()=>{const{container:t,containerRect:e}=this;return Math.abs(e.width-t.getBoundingClientRect().width)>.1||Math.abs(e.height-t.getBoundingClientRect().height)>.1};this.resizeObserver||void 0===window.ResizeObserver||(this.resizeObserver=new ResizeObserver((()=>{this.updateTimer||(e()?(this.onResize(),this.isMobile&&(this.updateTimer=setTimeout((()=>{e()&&this.onResize(),this.updateTimer=null}),500))):this.updateTimer&&(clearTimeout(this.updateTimer),this.updateTimer=null))}))),null===(t=this.resizeObserver)||void 0===t||t.observe(this.container)}detachObserver(){var t;null===(t=this.resizeObserver)||void 0===t||t.disconnect()}attachEvents(){const{container:t}=this;t.addEventListener(\"click\",this.onClick,{passive:!1,capture:!1}),t.addEventListener(\"wheel\",this.onWheel,{passive:!1}),this.pointerTracker=new l(t,{start:this.onPointerDown,move:this.onPointerMove,end:this.onPointerUp}),document.addEventListener(O,this.onMouseMove)}detachEvents(){var t;const{container:e}=this;e.removeEventListener(\"click\",this.onClick,{passive:!1,capture:!1}),e.removeEventListener(\"wheel\",this.onWheel,{passive:!1}),null===(t=this.pointerTracker)||void 0===t||t.stop(),this.pointerTracker=null,document.removeEventListener(O,this.onMouseMove),document.removeEventListener(\"keydown\",this.onKeydown,!0),this.clickTimer&&(clearTimeout(this.clickTimer),this.clickTimer=null),this.updateTimer&&(clearTimeout(this.updateTimer),this.updateTimer=null)}animate(){this.setTargetForce();const t=this.friction,e=this.option(\"maxVelocity\");for(const i of v)t?(this.velocity[i]*=1-t,e&&!this.isScaling&&(this.velocity[i]=Math.max(Math.min(this.velocity[i],e),-1*e)),this.current[i]+=this.velocity[i]):this.current[i]=this.target[i];this.setTransform(),this.setEdgeForce(),!this.isResting||this.isDragging?this.rAF=requestAnimationFrame((()=>this.animate())):this.stop(\"current\")}setTargetForce(){for(const t of v)\"e\"===t&&this.isBouncingX||\"f\"===t&&this.isBouncingY||(this.velocity[t]=(1/(1-this.friction)-1)*(this.target[t]-this.current[t]))}checkBounds(t=0,e=0){const{current:i}=this,n=i.e+t,s=i.f+e,o=this.getBounds(),{x:a,y:r}=o,l=a.min,c=a.max,h=r.min,d=r.max;let u=0,p=0;return l!==1/0&&n<l?u=l-n:c!==1/0&&n>c&&(u=c-n),h!==1/0&&s<h?p=h-s:d!==1/0&&s>d&&(p=d-s),Math.abs(u)<1e-4&&(u=0),Math.abs(p)<1e-4&&(p=0),Object.assign(Object.assign({},o),{xDiff:u,yDiff:p,inBounds:!u&&!p})}clampTargetBounds(){const{target:t}=this,{x:e,y:i}=this.getBounds();e.min!==1/0&&(t.e=Math.max(t.e,e.min)),e.max!==1/0&&(t.e=Math.min(t.e,e.max)),i.min!==1/0&&(t.f=Math.max(t.f,i.min)),i.max!==1/0&&(t.f=Math.min(t.f,i.max))}calculateContentDim(t=this.current){const{content:e,contentRect:i}=this,{fitWidth:n,fitHeight:s,fullWidth:o,fullHeight:a}=i;let r=o,l=a;if(this.option(\"zoom\")||0!==this.angle){const i=!(e instanceof HTMLImageElement)&&(\"none\"===window.getComputedStyle(e).maxWidth||\"none\"===window.getComputedStyle(e).maxHeight),c=i?o:n,h=i?a:s,d=this.getMatrix(t),u=new DOMPoint(0,0).matrixTransform(d),p=new DOMPoint(0+c,0).matrixTransform(d),f=new DOMPoint(0+c,0+h).matrixTransform(d),g=new DOMPoint(0,0+h).matrixTransform(d),m=Math.abs(f.x-u.x),v=Math.abs(f.y-u.y),b=Math.abs(g.x-p.x),y=Math.abs(g.y-p.y);r=Math.max(m,b),l=Math.max(v,y)}return{contentWidth:r,contentHeight:l}}setEdgeForce(){if(this.ignoreBounds||this.isDragging||this.panMode===O||this.targetScale<this.scale)return this.isBouncingX=!1,void(this.isBouncingY=!1);const{target:t}=this,{x:e,y:i,xDiff:n,yDiff:s}=this.checkBounds();const o=this.option(\"maxVelocity\");let a=this.velocity.e,r=this.velocity.f;0!==n?(this.isBouncingX=!0,n*a<=0?a+=.14*n:(a=.14*n,e.min!==1/0&&(this.target.e=Math.max(t.e,e.min)),e.max!==1/0&&(this.target.e=Math.min(t.e,e.max))),o&&(a=Math.max(Math.min(a,o),-1*o))):this.isBouncingX=!1,0!==s?(this.isBouncingY=!0,s*r<=0?r+=.14*s:(r=.14*s,i.min!==1/0&&(this.target.f=Math.max(t.f,i.min)),i.max!==1/0&&(this.target.f=Math.min(t.f,i.max))),o&&(r=Math.max(Math.min(r,o),-1*o))):this.isBouncingY=!1,this.isBouncingX&&(this.velocity.e=a),this.isBouncingY&&(this.velocity.f=r)}enable(){const{content:t}=this,e=new DOMMatrixReadOnly(window.getComputedStyle(t).transform);for(const t of v)this.current[t]=this.target[t]=e[t];this.updateMetrics(),this.attachObserver(),this.attachEvents(),this.state=m.Ready,this.emit(\"ready\")}onClick(t){var e;\"click\"===t.type&&0===t.detail&&(this.dragOffset.x=0,this.dragOffset.y=0),this.isDragging&&(null===(e=this.pointerTracker)||void 0===e||e.clear(),this.trackingPoints=[],this.startDecelAnim());const i=t.target;if(!i||t.defaultPrevented)return;if(i.hasAttribute(\"disabled\"))return t.preventDefault(),void t.stopPropagation();if((()=>{const t=window.getSelection();return t&&\"Range\"===t.type})()&&!i.closest(\"button\"))return;const n=i.closest(\"[data-panzoom-action]\"),s=i.closest(\"[data-panzoom-change]\"),o=n||s,a=o&&E(o)?o.dataset:null;if(a){const e=a.panzoomChange,i=a.panzoomAction;if((e||i)&&t.preventDefault(),e){let t={};try{t=JSON.parse(e)}catch(t){console&&console.warn(\"The given data was not valid JSON\")}return void this.applyChange(t)}if(i)return void(this[i]&&this[i]())}if(Math.abs(this.dragOffset.x)>3||Math.abs(this.dragOffset.y)>3)return t.preventDefault(),void t.stopPropagation();if(i.closest(\"[data-fancybox]\"))return;const r=this.content.getBoundingClientRect(),l=this.dragStart;if(l.time&&!this.canZoomOut()&&(Math.abs(r.x-l.x)>2||Math.abs(r.y-l.y)>2))return;this.dragStart.time=0;const c=e=>{this.option(\"zoom\",t)&&e&&\"string\"==typeof e&&/(iterateZoom)|(toggle(Zoom|Full|Cover|Max)|(zoomTo(Fit|Cover|Max)))/.test(e)&&\"function\"==typeof this[e]&&(t.preventDefault(),this[e]({event:t}))},h=this.option(\"click\",t),d=this.option(\"dblClick\",t);d?(this.clicks++,1==this.clicks&&(this.clickTimer=setTimeout((()=>{1===this.clicks?(this.emit(\"click\",t),!t.defaultPrevented&&h&&c(h)):(this.emit(\"dblClick\",t),t.defaultPrevented||c(d)),this.clicks=0,this.clickTimer=null}),350))):(this.emit(\"click\",t),!t.defaultPrevented&&h&&c(h))}addTrackingPoint(t){const e=this.trackingPoints.filter((t=>t.time>Date.now()-100));e.push(t),this.trackingPoints=e}onPointerDown(t,e,i){var n;if(!1===this.option(\"touch\",t))return!1;this.pwt=0,this.dragOffset={x:0,y:0,time:0},this.trackingPoints=[];const s=this.content.getBoundingClientRect();if(this.dragStart={x:s.x,y:s.y,top:s.top,left:s.left,time:Date.now()},this.clickTimer)return!1;if(this.panMode===O&&this.targetScale>1)return t.preventDefault(),t.stopPropagation(),!1;const o=t.composedPath()[0];if(!i.length){if([\"TEXTAREA\",\"OPTION\",\"INPUT\",\"SELECT\",\"VIDEO\",\"IFRAME\"].includes(o.nodeName)||o.closest(\"[contenteditable],[data-selectable],[data-draggable],[data-clickable],[data-panzoom-change],[data-panzoom-action]\"))return!1;null===(n=window.getSelection())||void 0===n||n.removeAllRanges()}if(\"mousedown\"===t.type)[\"A\",\"BUTTON\"].includes(o.nodeName)||t.preventDefault();else if(Math.abs(this.velocity.a)>.3)return!1;return this.target.e=this.current.e,this.target.f=this.current.f,this.stop(),this.isDragging||(this.isDragging=!0,this.addTrackingPoint(e),this.emit(\"touchStart\",t)),!0}onPointerMove(e,n,s){if(!1===this.option(\"touch\",e))return;if(!this.isDragging)return;if(n.length<2&&this.panOnlyZoomed&&t(this.targetScale)<=t(this.minScale))return;if(this.emit(\"touchMove\",e),e.defaultPrevented)return;this.addTrackingPoint(n[0]);const{content:o}=this,a=h(s[0],s[1]),r=h(n[0],n[1]);let l=0,d=0;if(n.length>1){const t=o.getBoundingClientRect();l=a.clientX-t.left-.5*t.width,d=a.clientY-t.top-.5*t.height}const u=c(s[0],s[1]),p=c(n[0],n[1]);let f=u?p/u:1,g=r.clientX-a.clientX,m=r.clientY-a.clientY;this.dragOffset.x+=g,this.dragOffset.y+=m,this.dragOffset.time=Date.now()-this.dragStart.time;let v=t(this.targetScale)===t(this.minScale)&&this.option(\"lockAxis\");if(v&&!this.lockedAxis)if(\"xy\"===v||\"y\"===v||\"touchmove\"===e.type){if(Math.abs(this.dragOffset.x)<6&&Math.abs(this.dragOffset.y)<6)return void e.preventDefault();const t=Math.abs(180*Math.atan2(this.dragOffset.y,this.dragOffset.x)/Math.PI);this.lockedAxis=t>45&&t<135?\"y\":\"x\",this.dragOffset.x=0,this.dragOffset.y=0,g=0,m=0}else this.lockedAxis=v;if(i(e.target,this.content)&&(v=\"x\",this.dragOffset.y=0),v&&\"xy\"!==v&&this.lockedAxis!==v&&t(this.targetScale)===t(this.minScale))return;e.cancelable&&e.preventDefault(),this.container.classList.add(this.cn(\"isDragging\"));const b=this.checkBounds(g,m);this.option(\"rubberband\")?(\"x\"!==this.isInfinite&&(b.xDiff>0&&g<0||b.xDiff<0&&g>0)&&(g*=Math.max(0,.5-Math.abs(.75/this.contentRect.fitWidth*b.xDiff))),\"y\"!==this.isInfinite&&(b.yDiff>0&&m<0||b.yDiff<0&&m>0)&&(m*=Math.max(0,.5-Math.abs(.75/this.contentRect.fitHeight*b.yDiff)))):(b.xDiff&&(g=0),b.yDiff&&(m=0));const y=this.targetScale,w=this.minScale,x=this.maxScale;y<.5*w&&(f=Math.max(f,w)),y>1.5*x&&(f=Math.min(f,x)),\"y\"===this.lockedAxis&&t(y)===t(w)&&(g=0),\"x\"===this.lockedAxis&&t(y)===t(w)&&(m=0),this.applyChange({originX:l,originY:d,panX:g,panY:m,scale:f,friction:this.option(\"dragFriction\"),ignoreBounds:!0})}onPointerUp(t,e,n){if(n.length)return this.dragOffset.x=0,this.dragOffset.y=0,void(this.trackingPoints=[]);this.container.classList.remove(this.cn(\"isDragging\")),this.isDragging&&(this.addTrackingPoint(e),this.panOnlyZoomed&&this.contentRect.width-this.contentRect.fitWidth<1&&this.contentRect.height-this.contentRect.fitHeight<1&&(this.trackingPoints=[]),i(t.target,this.content)&&\"y\"===this.lockedAxis&&(this.trackingPoints=[]),this.emit(\"touchEnd\",t),this.isDragging=!1,this.lockedAxis=!1,this.state!==m.Destroy&&(t.defaultPrevented||this.startDecelAnim()))}startDecelAnim(){var e;const i=this.isScaling;this.rAF&&(cancelAnimationFrame(this.rAF),this.rAF=null),this.isBouncingX=!1,this.isBouncingY=!1;for(const t of v)this.velocity[t]=0;this.target.e=this.current.e,this.target.f=this.current.f,S(this.container,\"is-scaling\"),S(this.container,\"is-animating\"),this.isTicking=!1;const{trackingPoints:n}=this,s=n[0],o=n[n.length-1];let a=0,r=0,l=0;o&&s&&(a=o.clientX-s.clientX,r=o.clientY-s.clientY,l=o.time-s.time);const c=(null===(e=window.visualViewport)||void 0===e?void 0:e.scale)||1;1!==c&&(a*=c,r*=c);let h=0,d=0,u=0,p=0,f=this.option(\"decelFriction\");const g=this.targetScale;if(l>0){u=Math.abs(a)>3?a/(l/30):0,p=Math.abs(r)>3?r/(l/30):0;const t=this.option(\"maxVelocity\");t&&(u=Math.max(Math.min(u,t),-1*t),p=Math.max(Math.min(p,t),-1*t))}u&&(h=u/(1/(1-f)-1)),p&&(d=p/(1/(1-f)-1)),(\"y\"===this.option(\"lockAxis\")||\"xy\"===this.option(\"lockAxis\")&&\"y\"===this.lockedAxis&&t(g)===this.minScale)&&(h=u=0),(\"x\"===this.option(\"lockAxis\")||\"xy\"===this.option(\"lockAxis\")&&\"x\"===this.lockedAxis&&t(g)===this.minScale)&&(d=p=0);const m=this.dragOffset.x,b=this.dragOffset.y,y=this.option(\"dragMinThreshold\")||0;Math.abs(m)<y&&Math.abs(b)<y&&(h=d=0,u=p=0),(this.option(\"zoom\")&&(g<this.minScale-1e-5||g>this.maxScale+1e-5)||i&&!h&&!d)&&(f=.35),this.applyChange({panX:h,panY:d,friction:f}),this.emit(\"decel\",u,p,m,b)}onWheel(t){var e=[-t.deltaX||0,-t.deltaY||0,-t.detail||0].reduce((function(t,e){return Math.abs(e)>Math.abs(t)?e:t}));const i=Math.max(-1,Math.min(1,e));if(this.emit(\"wheel\",t,i),this.panMode===O)return;if(t.defaultPrevented)return;const n=this.option(\"wheel\");\"pan\"===n?(t.preventDefault(),this.panOnlyZoomed&&!this.canZoomOut()||this.applyChange({panX:2*-t.deltaX,panY:2*-t.deltaY,bounce:!1})):\"zoom\"===n&&!1!==this.option(\"zoom\")&&this.zoomWithWheel(t)}onMouseMove(t){this.panWithMouse(t)}onKeydown(t){\"Escape\"===t.key&&this.toggleFS()}onResize(){this.updateMetrics(),this.checkBounds().inBounds||this.requestTick()}setTransform(){this.emit(\"beforeTransform\");const{current:e,target:i,content:n,contentRect:s}=this,o=Object.assign({},C);for(const n of v){const s=\"e\"==n||\"f\"===n?M:T;o[n]=t(e[n],s),Math.abs(i[n]-e[n])<(\"e\"==n||\"f\"===n?.51:.001)&&(e[n]=i[n])}let{a:a,b:r,c:l,d:c,e:h,f:d}=o,u=`matrix(${a}, ${r}, ${l}, ${c}, ${h}, ${d})`,p=n.parentElement instanceof HTMLPictureElement?n.parentElement:n;if(this.option(\"transformParent\")&&(p=p.parentElement||p),p.style.transform===u)return;p.style.transform=u;const{contentWidth:f,contentHeight:g}=this.calculateContentDim();s.width=f,s.height=g,this.emit(\"afterTransform\")}updateMetrics(e=!1){var i;if(!this||this.state===m.Destroy)return;if(this.isContentLoading)return;const n=Math.max(1,(null===(i=window.visualViewport)||void 0===i?void 0:i.scale)||1),{container:s,content:o}=this,a=o instanceof HTMLImageElement,r=s.getBoundingClientRect(),l=getComputedStyle(this.container);let c=r.width*n,h=r.height*n;const d=parseFloat(l.paddingTop)+parseFloat(l.paddingBottom),u=c-(parseFloat(l.paddingLeft)+parseFloat(l.paddingRight)),p=h-d;this.containerRect={width:c,height:h,innerWidth:u,innerHeight:p};const f=parseFloat(o.dataset.width||\"\")||(t=>{let e=0;return e=t instanceof HTMLImageElement?t.naturalWidth:t instanceof SVGElement?t.width.baseVal.value:Math.max(t.offsetWidth,t.scrollWidth),e||0})(o),g=parseFloat(o.dataset.height||\"\")||(t=>{let e=0;return e=t instanceof HTMLImageElement?t.naturalHeight:t instanceof SVGElement?t.height.baseVal.value:Math.max(t.offsetHeight,t.scrollHeight),e||0})(o);let v=this.option(\"width\",f)||z,b=this.option(\"height\",g)||z;const y=v===z,w=b===z;\"number\"!=typeof v&&(v=f),\"number\"!=typeof b&&(b=g),y&&(v=f*(b/g)),w&&(b=g/(f/v));let x=o.parentElement instanceof HTMLPictureElement?o.parentElement:o;this.option(\"transformParent\")&&(x=x.parentElement||x);const E=x.getAttribute(\"style\")||\"\";x.style.setProperty(\"transform\",\"none\",\"important\"),a&&(x.style.width=\"\",x.style.height=\"\"),x.offsetHeight;const S=o.getBoundingClientRect();let P=S.width*n,C=S.height*n,T=P,M=C;P=Math.min(P,v),C=Math.min(C,b),a?({width:P,height:C}=((t,e,i,n)=>{const s=i/t,o=n/e,a=Math.min(s,o);return{width:t*=a,height:e*=a}})(v,b,P,C)):(P=Math.min(P,v),C=Math.min(C,b));let O=.5*(M-C),A=.5*(T-P);this.contentRect=Object.assign(Object.assign({},this.contentRect),{top:S.top-r.top+O,bottom:r.bottom-S.bottom+O,left:S.left-r.left+A,right:r.right-S.right+A,fitWidth:P,fitHeight:C,width:P,height:C,fullWidth:v,fullHeight:b}),x.style.cssText=E,a&&(x.style.width=`${P}px`,x.style.height=`${C}px`),this.setTransform(),!0!==e&&this.emit(\"refresh\"),this.ignoreBounds||(t(this.targetScale)<t(this.minScale)?this.zoomTo(this.minScale,{friction:0}):this.targetScale>this.maxScale?this.zoomTo(this.maxScale,{friction:0}):this.state===m.Init||this.checkBounds().inBounds||this.requestTick()),this.updateControls()}calculateBounds(){const{contentWidth:e,contentHeight:i}=this.calculateContentDim(this.target),{targetScale:n,lockedAxis:s}=this,{fitWidth:o,fitHeight:a}=this.contentRect;let r=0,l=0,c=0,h=0;const d=this.option(\"infinite\");if(!0===d||s&&d===s)r=-1/0,c=1/0,l=-1/0,h=1/0;else{let{containerRect:s,contentRect:d}=this,u=t(o*n,M),p=t(a*n,M),{innerWidth:f,innerHeight:g}=s;if(s.width===u&&(f=s.width),s.width===p&&(g=s.height),e>f){c=.5*(e-f),r=-1*c;let t=.5*(d.right-d.left);r+=t,c+=t}if(o>f&&e<f&&(r-=.5*(o-f),c-=.5*(o-f)),i>g){h=.5*(i-g),l=-1*h;let t=.5*(d.bottom-d.top);l+=t,h+=t}a>g&&i<g&&(r-=.5*(a-g),c-=.5*(a-g))}return{x:{min:r,max:c},y:{min:l,max:h}}}getBounds(){const t=this.option(\"bounds\");return t!==z?t:this.calculateBounds()}updateControls(){const e=this,i=e.container,{panMode:n,contentRect:s,targetScale:a,minScale:r}=e;let l=r,c=e.option(\"click\")||!1;c&&(l=e.getNextScale(c));let h=e.canZoomIn(),d=e.canZoomOut(),u=n===A&&!!this.option(\"touch\"),p=d&&u;if(u&&(t(a)<t(r)&&!this.panOnlyZoomed&&(p=!0),(t(s.width,1)>t(s.fitWidth,1)||t(s.height,1)>t(s.fitHeight,1))&&(p=!0)),t(s.width*a,1)<t(s.fitWidth,1)&&(p=!1),n===O&&(p=!1),o(i,this.cn(\"isDraggable\"),p),!this.option(\"zoom\"))return;let f=h&&t(l)>t(a),g=!f&&!p&&d&&t(l)<t(a);o(i,this.cn(\"canZoomIn\"),f),o(i,this.cn(\"canZoomOut\"),g);for(const t of i.querySelectorAll(\"[data-panzoom-action]\")){let e=!1,i=!1;switch(t.dataset.panzoomAction){case\"zoomIn\":h?e=!0:i=!0;break;case\"zoomOut\":d?e=!0:i=!0;break;case\"toggleZoom\":case\"iterateZoom\":h||d?e=!0:i=!0;const n=t.querySelector(\"g\");n&&(n.style.display=h?\"\":\"none\")}e?(t.removeAttribute(\"disabled\"),t.removeAttribute(\"tabindex\")):i&&(t.setAttribute(\"disabled\",\"\"),t.setAttribute(\"tabindex\",\"-1\"))}}panTo({x:t=this.target.e,y:e=this.target.f,scale:i=this.targetScale,friction:n=this.option(\"friction\"),angle:s=0,originX:o=0,originY:a=0,flipX:r=!1,flipY:l=!1,ignoreBounds:c=!1}){this.state!==m.Destroy&&this.applyChange({panX:t-this.target.e,panY:e-this.target.f,scale:i/this.targetScale,angle:s,originX:o,originY:a,friction:n,flipX:r,flipY:l,ignoreBounds:c})}applyChange({panX:e=0,panY:i=0,scale:n=1,angle:s=0,originX:o=-this.current.e,originY:a=-this.current.f,friction:r=this.option(\"friction\"),flipX:l=!1,flipY:c=!1,ignoreBounds:h=!1,bounce:d=this.option(\"bounce\")}){const u=this.state;if(u===m.Destroy)return;this.rAF&&(cancelAnimationFrame(this.rAF),this.rAF=null),this.friction=r||0,this.ignoreBounds=h;const{current:p}=this,f=p.e,g=p.f,b=this.getMatrix(this.target);let y=(new DOMMatrix).translate(f,g).translate(o,a).translate(e,i);if(this.option(\"zoom\")){if(!h){const t=this.targetScale,e=this.minScale,i=this.maxScale;t*n<e&&(n=e/t),t*n>i&&(n=i/t)}y=y.scale(n)}y=y.translate(-o,-a).translate(-f,-g).multiply(b),s&&(y=y.rotate(s)),l&&(y=y.scale(-1,1)),c&&(y=y.scale(1,-1));for(const e of v)\"e\"!==e&&\"f\"!==e&&(y[e]>this.minScale+1e-5||y[e]<this.minScale-1e-5)?this.target[e]=y[e]:this.target[e]=t(y[e],M);(this.targetScale<this.scale||Math.abs(n-1)>.1||this.panMode===O||!1===d)&&!h&&this.clampTargetBounds(),u===m.Init?this.animate():this.isResting||(this.state=m.Panning,this.requestTick())}stop(t=!1){if(this.state===m.Init||this.state===m.Destroy)return;const e=this.isTicking;this.rAF&&(cancelAnimationFrame(this.rAF),this.rAF=null),this.isBouncingX=!1,this.isBouncingY=!1;for(const e of v)this.velocity[e]=0,\"current\"===t?this.current[e]=this.target[e]:\"target\"===t&&(this.target[e]=this.current[e]);this.setTransform(),S(this.container,\"is-scaling\"),S(this.container,\"is-animating\"),this.isTicking=!1,this.state=m.Ready,e&&(this.emit(\"endAnimation\"),this.updateControls())}requestTick(){this.isTicking||(this.emit(\"startAnimation\"),this.updateControls(),P(this.container,\"is-animating\"),this.isScaling&&P(this.container,\"is-scaling\")),this.isTicking=!0,this.rAF||(this.rAF=requestAnimationFrame((()=>this.animate())))}panWithMouse(e,i=this.option(\"mouseMoveFriction\")){if(this.pmme=e,this.panMode!==O||!e)return;if(t(this.targetScale)<=t(this.minScale))return;this.emit(\"mouseMove\",e);const{container:n,containerRect:s,contentRect:o}=this,a=s.width,r=s.height,l=n.getBoundingClientRect(),c=(e.clientX||0)-l.left,h=(e.clientY||0)-l.top;let{contentWidth:d,contentHeight:u}=this.calculateContentDim(this.target);const p=this.option(\"mouseMoveFactor\");p>1&&(d!==a&&(d*=p),u!==r&&(u*=p));let f=.5*(d-a)-c/a*100/100*(d-a);f+=.5*(o.right-o.left);let g=.5*(u-r)-h/r*100/100*(u-r);g+=.5*(o.bottom-o.top),this.applyChange({panX:f-this.target.e,panY:g-this.target.f,friction:i})}zoomWithWheel(e){if(this.state===m.Destroy||this.state===m.Init)return;const i=Date.now();if(i-this.pwt<45)return void e.preventDefault();this.pwt=i;var n=[-e.deltaX||0,-e.deltaY||0,-e.detail||0].reduce((function(t,e){return Math.abs(e)>Math.abs(t)?e:t}));const s=Math.max(-1,Math.min(1,n)),{targetScale:o,maxScale:a,minScale:r}=this;let l=o*(100+45*s)/100;t(l)<t(r)&&t(o)<=t(r)?(this.cwd+=Math.abs(s),l=r):t(l)>t(a)&&t(o)>=t(a)?(this.cwd+=Math.abs(s),l=a):(this.cwd=0,l=Math.max(Math.min(l,a),r)),this.cwd>this.option(\"wheelLimit\")||(e.preventDefault(),t(l)!==t(o)&&this.zoomTo(l,{event:e}))}canZoomIn(){return this.option(\"zoom\")&&(t(this.contentRect.width,1)<t(this.contentRect.fitWidth,1)||t(this.targetScale)<t(this.maxScale))}canZoomOut(){return this.option(\"zoom\")&&t(this.targetScale)>t(this.minScale)}zoomIn(t=1.25,e){this.zoomTo(this.targetScale*t,e)}zoomOut(t=.8,e){this.zoomTo(this.targetScale*t,e)}zoomToFit(t){this.zoomTo(\"fit\",t)}zoomToCover(t){this.zoomTo(\"cover\",t)}zoomToFull(t){this.zoomTo(\"full\",t)}zoomToMax(t){this.zoomTo(\"max\",t)}toggleZoom(t){this.zoomTo(this.getNextScale(\"toggleZoom\"),t)}toggleMax(t){this.zoomTo(this.getNextScale(\"toggleMax\"),t)}toggleCover(t){this.zoomTo(this.getNextScale(\"toggleCover\"),t)}iterateZoom(t){this.zoomTo(\"next\",t)}zoomTo(t=1,{friction:e=z,originX:i=z,originY:n=z,event:s}={}){if(this.isContentLoading||this.state===m.Destroy)return;const{targetScale:o,fullScale:a,maxScale:r,coverScale:l}=this;if(this.stop(),this.panMode===O&&(s=this.pmme||s),s||i===z||n===z){const t=this.content.getBoundingClientRect(),e=this.container.getBoundingClientRect(),o=s?s.clientX:e.left+.5*e.width,a=s?s.clientY:e.top+.5*e.height;i=o-t.left-.5*t.width,n=a-t.top-.5*t.height}let c=1;\"number\"==typeof t?c=t:\"full\"===t?c=a:\"cover\"===t?c=l:\"max\"===t?c=r:\"fit\"===t?c=1:\"next\"===t&&(c=this.getNextScale(\"iterateZoom\")),c=c/o||1,e=e===z?c>1?.15:.25:e,this.applyChange({scale:c,originX:i,originY:n,friction:e}),s&&this.panMode===O&&this.panWithMouse(s,e)}rotateCCW(){this.applyChange({angle:-90})}rotateCW(){this.applyChange({angle:90})}flipX(){this.applyChange({flipX:!0})}flipY(){this.applyChange({flipY:!0})}fitX(){this.stop(\"target\");const{containerRect:t,contentRect:e,target:i}=this;this.applyChange({panX:.5*t.width-(e.left+.5*e.fitWidth)-i.e,panY:.5*t.height-(e.top+.5*e.fitHeight)-i.f,scale:t.width/e.fitWidth/this.targetScale,originX:0,originY:0,ignoreBounds:!0})}fitY(){this.stop(\"target\");const{containerRect:t,contentRect:e,target:i}=this;this.applyChange({panX:.5*t.width-(e.left+.5*e.fitWidth)-i.e,panY:.5*t.innerHeight-(e.top+.5*e.fitHeight)-i.f,scale:t.height/e.fitHeight/this.targetScale,originX:0,originY:0,ignoreBounds:!0})}toggleFS(){const{container:t}=this,e=this.cn(\"inFullscreen\"),i=this.cn(\"htmlHasFullscreen\");t.classList.toggle(e);const n=t.classList.contains(e);n?(document.documentElement.classList.add(i),document.addEventListener(\"keydown\",this.onKeydown,!0)):(document.documentElement.classList.remove(i),document.removeEventListener(\"keydown\",this.onKeydown,!0)),this.updateMetrics(),this.emit(n?\"enterFS\":\"exitFS\")}getMatrix(t=this.current){const{a:e,b:i,c:n,d:s,e:o,f:a}=t;return new DOMMatrix([e,i,n,s,o,a])}reset(t){if(this.state!==m.Init&&this.state!==m.Destroy){this.stop(\"current\");for(const t of v)this.target[t]=C[t];this.target.a=this.minScale,this.target.d=this.minScale,this.clampTargetBounds(),this.isResting||(this.friction=void 0===t?this.option(\"friction\"):t,this.state=m.Panning,this.requestTick())}}destroy(){this.stop(),this.state=m.Destroy,this.detachEvents(),this.detachObserver();const{container:t,content:e}=this,i=this.option(\"classes\")||{};for(const e of Object.values(i))t.classList.remove(e+\"\");e&&(e.removeEventListener(\"load\",this.onLoad),e.removeEventListener(\"error\",this.onError)),this.detachPlugins()}}Object.defineProperty(I,\"defaults\",{enumerable:!0,configurable:!0,writable:!0,value:y}),Object.defineProperty(I,\"Plugins\",{enumerable:!0,configurable:!0,writable:!0,value:{}});const D=function(t,e){let i=!0;return(...n)=>{i&&(i=!1,t(...n),setTimeout((()=>{i=!0}),e))}},F=(t,e)=>{let i=[];return t.childNodes.forEach((t=>{t.nodeType!==Node.ELEMENT_NODE||e&&!t.matches(e)||i.push(t)})),i},j={viewport:null,track:null,enabled:!0,slides:[],axis:\"x\",transition:\"fade\",preload:1,slidesPerPage:\"auto\",initialPage:0,friction:.12,Panzoom:{decelFriction:.12},center:!0,infinite:!0,fill:!0,dragFree:!1,adaptiveHeight:!1,direction:\"ltr\",classes:{container:\"f-carousel\",viewport:\"f-carousel__viewport\",track:\"f-carousel__track\",slide:\"f-carousel__slide\",isLTR:\"is-ltr\",isRTL:\"is-rtl\",isHorizontal:\"is-horizontal\",isVertical:\"is-vertical\",inTransition:\"in-transition\",isSelected:\"is-selected\"},l10n:{NEXT:\"Next slide\",PREV:\"Previous slide\",GOTO:\"Go to slide #%d\"}};var B;!function(t){t[t.Init=0]=\"Init\",t[t.Ready=1]=\"Ready\",t[t.Destroy=2]=\"Destroy\"}(B||(B={}));const H=t=>{if(\"string\"==typeof t||t instanceof HTMLElement)t={html:t};else{const e=t.thumb;void 0!==e&&(\"string\"==typeof e&&(t.thumbSrc=e),e instanceof HTMLImageElement&&(t.thumbEl=e,t.thumbElSrc=e.src,t.thumbSrc=e.src),delete t.thumb)}return Object.assign({html:\"\",el:null,isDom:!1,class:\"\",customClass:\"\",index:-1,dim:0,gap:0,pos:0,transition:!1},t)},N=(t={})=>Object.assign({index:-1,slides:[],dim:0,pos:-1},t);class _ extends f{constructor(t,e){super(e),Object.defineProperty(this,\"instance\",{enumerable:!0,configurable:!0,writable:!0,value:t})}attach(){}detach(){}}const $={classes:{list:\"f-carousel__dots\",isDynamic:\"is-dynamic\",hasDots:\"has-dots\",dot:\"f-carousel__dot\",isBeforePrev:\"is-before-prev\",isPrev:\"is-prev\",isCurrent:\"is-current\",isNext:\"is-next\",isAfterNext:\"is-after-next\"},dotTpl:'<button type=\"button\" data-carousel-page=\"%i\" aria-label=\"{{GOTO}}\"><span class=\"f-carousel__dot\" aria-hidden=\"true\"></span></button>',dynamicFrom:11,maxCount:1/0,minCount:2};class W extends _{constructor(){super(...arguments),Object.defineProperty(this,\"isDynamic\",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,\"list\",{enumerable:!0,configurable:!0,writable:!0,value:null})}onRefresh(){this.refresh()}build(){let t=this.list;if(!t){t=document.createElement(\"ul\"),P(t,this.cn(\"list\")),t.setAttribute(\"role\",\"tablist\");const e=this.instance.container;e.appendChild(t),P(e,this.cn(\"hasDots\")),this.list=t}return t}refresh(){var t;const e=this.instance.pages.length,i=Math.min(2,this.option(\"minCount\")),n=Math.max(2e3,this.option(\"maxCount\")),s=this.option(\"dynamicFrom\");if(e<i||e>n)return void this.cleanup();const a=\"number\"==typeof s&&e>5&&e>=s,r=!this.list||this.isDynamic!==a||this.list.children.length!==e;r&&this.cleanup();const l=this.build();if(o(l,this.cn(\"isDynamic\"),!!a),r)for(let t=0;t<e;t++)l.append(this.createItem(t));let c,h=0;for(const e of[...l.children]){const i=h===this.instance.page;i&&(c=e),o(e,this.cn(\"isCurrent\"),i),null===(t=e.children[0])||void 0===t||t.setAttribute(\"aria-selected\",i?\"true\":\"false\");for(const t of[\"isBeforePrev\",\"isPrev\",\"isNext\",\"isAfterNext\"])S(e,this.cn(t));h++}if(c=c||l.firstChild,a&&c){const t=c.previousElementSibling,e=t&&t.previousElementSibling;P(t,this.cn(\"isPrev\")),P(e,this.cn(\"isBeforePrev\"));const i=c.nextElementSibling,n=i&&i.nextElementSibling;P(i,this.cn(\"isNext\")),P(n,this.cn(\"isAfterNext\"))}this.isDynamic=a}createItem(t=0){var e;const i=document.createElement(\"li\");i.setAttribute(\"role\",\"presentation\");const s=n(this.instance.localize(this.option(\"dotTpl\"),[[\"%d\",t+1]]).replace(/\\%i/g,t+\"\"));return i.appendChild(s),null===(e=i.children[0])||void 0===e||e.setAttribute(\"role\",\"tab\"),i}cleanup(){this.list&&(this.list.remove(),this.list=null),this.isDynamic=!1,S(this.instance.container,this.cn(\"hasDots\"))}attach(){this.instance.on([\"refresh\",\"change\"],this.onRefresh)}detach(){this.instance.off([\"refresh\",\"change\"],this.onRefresh),this.cleanup()}}Object.defineProperty(W,\"defaults\",{enumerable:!0,configurable:!0,writable:!0,value:$});const X=\"disabled\",q=\"next\",Y=\"prev\";class V extends _{constructor(){super(...arguments),Object.defineProperty(this,\"container\",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,\"prev\",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,\"next\",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,\"isDom\",{enumerable:!0,configurable:!0,writable:!0,value:!1})}onRefresh(){const t=this.instance,e=t.pages.length,i=t.page;if(e<2)return void this.cleanup();this.build();let n=this.prev,s=this.next;n&&s&&(n.removeAttribute(X),s.removeAttribute(X),t.isInfinite||(i<=0&&n.setAttribute(X,\"\"),i>=e-1&&s.setAttribute(X,\"\")))}addBtn(t){var e;const i=this.instance,n=document.createElement(\"button\");n.setAttribute(\"tabindex\",\"0\"),n.setAttribute(\"title\",i.localize(`{{${t.toUpperCase()}}}`)),P(n,this.cn(\"button\")+\" \"+this.cn(t===q?\"isNext\":\"isPrev\"));const s=i.isRTL?t===q?Y:q:t;var o;return n.innerHTML=i.localize(this.option(`${s}Tpl`)),n.dataset[`carousel${o=t,o?o.match(\"^[a-z]\")?o.charAt(0).toUpperCase()+o.substring(1):o:\"\"}`]=\"true\",null===(e=this.container)||void 0===e||e.appendChild(n),n}build(){const t=this.instance.container,e=this.cn(\"container\");let{container:i,prev:n,next:s}=this;i||(i=t.querySelector(\".\"+e),this.isDom=!!i),i||(i=document.createElement(\"div\"),P(i,e),t.appendChild(i)),this.container=i,s||(s=i.querySelector(\"[data-carousel-next]\")),s||(s=this.addBtn(q)),this.next=s,n||(n=i.querySelector(\"[data-carousel-prev]\")),n||(n=this.addBtn(Y)),this.prev=n}cleanup(){this.isDom||(this.prev&&this.prev.remove(),this.next&&this.next.remove(),this.container&&this.container.remove()),this.prev=null,this.next=null,this.container=null,this.isDom=!1}attach(){this.instance.on([\"refresh\",\"change\"],this.onRefresh)}detach(){this.instance.off([\"refresh\",\"change\"],this.onRefresh),this.cleanup()}}Object.defineProperty(V,\"defaults\",{enumerable:!0,configurable:!0,writable:!0,value:{classes:{container:\"f-carousel__nav\",button:\"f-button\",isNext:\"is-next\",isPrev:\"is-prev\"},nextTpl:'<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" tabindex=\"-1\"><path d=\"M9 3l9 9-9 9\"/></svg>',prevTpl:'<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" tabindex=\"-1\"><path d=\"M15 3l-9 9 9 9\"/></svg>'}});class Z extends _{constructor(){super(...arguments),Object.defineProperty(this,\"selectedIndex\",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,\"target\",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,\"nav\",{enumerable:!0,configurable:!0,writable:!0,value:null})}addAsTargetFor(t){this.target=this.instance,this.nav=t,this.attachEvents()}addAsNavFor(t){this.nav=this.instance,this.target=t,this.attachEvents()}attachEvents(){const{nav:t,target:e}=this;t&&e&&(t.options.initialSlide=e.options.initialPage,t.state===B.Ready?this.onNavReady(t):t.on(\"ready\",this.onNavReady),e.state===B.Ready?this.onTargetReady(e):e.on(\"ready\",this.onTargetReady))}onNavReady(t){t.on(\"createSlide\",this.onNavCreateSlide),t.on(\"Panzoom.click\",this.onNavClick),t.on(\"Panzoom.touchEnd\",this.onNavTouch),this.onTargetChange()}onTargetReady(t){t.on(\"change\",this.onTargetChange),t.on(\"Panzoom.refresh\",this.onTargetChange),this.onTargetChange()}onNavClick(t,e,i){this.onNavTouch(t,t.panzoom,i)}onNavTouch(t,e,i){var n,s;if(Math.abs(e.dragOffset.x)>3||Math.abs(e.dragOffset.y)>3)return;const o=i.target,{nav:a,target:r}=this;if(!a||!r||!o)return;const l=o.closest(\"[data-index]\");if(i.stopPropagation(),i.preventDefault(),!l)return;const c=parseInt(l.dataset.index||\"\",10)||0,h=r.getPageForSlide(c),d=a.getPageForSlide(c);a.slideTo(d),r.slideTo(h,{friction:(null===(s=null===(n=this.nav)||void 0===n?void 0:n.plugins)||void 0===s?void 0:s.Sync.option(\"friction\"))||0}),this.markSelectedSlide(c)}onNavCreateSlide(t,e){e.index===this.selectedIndex&&this.markSelectedSlide(e.index)}onTargetChange(){var t,e;const{target:i,nav:n}=this;if(!i||!n)return;if(n.state!==B.Ready||i.state!==B.Ready)return;const s=null===(e=null===(t=i.pages[i.page])||void 0===t?void 0:t.slides[0])||void 0===e?void 0:e.index,o=n.getPageForSlide(s);this.markSelectedSlide(s),n.slideTo(o,null===n.prevPage&&null===i.prevPage?{friction:0}:void 0)}markSelectedSlide(t){const e=this.nav;e&&e.state===B.Ready&&(this.selectedIndex=t,[...e.slides].map((e=>{e.el&&e.el.classList[e.index===t?\"add\":\"remove\"](\"is-nav-selected\")})))}attach(){const t=this;let e=t.options.target,i=t.options.nav;e?t.addAsNavFor(e):i&&t.addAsTargetFor(i)}detach(){const t=this,e=t.nav,i=t.target;e&&(e.off(\"ready\",t.onNavReady),e.off(\"createSlide\",t.onNavCreateSlide),e.off(\"Panzoom.click\",t.onNavClick),e.off(\"Panzoom.touchEnd\",t.onNavTouch)),t.nav=null,i&&(i.off(\"ready\",t.onTargetReady),i.off(\"refresh\",t.onTargetChange),i.off(\"change\",t.onTargetChange)),t.target=null}}Object.defineProperty(Z,\"defaults\",{enumerable:!0,configurable:!0,writable:!0,value:{friction:.35}});const U={Navigation:V,Dots:W,Sync:Z},G=\"animationend\",K=\"isSelected\",J=\"slide\";class Q extends g{get axis(){return this.isHorizontal?\"e\":\"f\"}get isEnabled(){return this.state===B.Ready}get isInfinite(){let t=!1;const{contentDim:e,viewportDim:i,pages:n,slides:s}=this,o=s[0];return n.length>=2&&o&&e+o.dim>=i&&(t=this.option(\"infinite\")),t}get isRTL(){return\"rtl\"===this.option(\"direction\")}get isHorizontal(){return\"x\"===this.option(\"axis\")}constructor(t,e={},i={}){if(super(),Object.defineProperty(this,\"bp\",{enumerable:!0,configurable:!0,writable:!0,value:\"\"}),Object.defineProperty(this,\"lp\",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,\"userOptions\",{enumerable:!0,configurable:!0,writable:!0,value:{}}),Object.defineProperty(this,\"userPlugins\",{enumerable:!0,configurable:!0,writable:!0,value:{}}),Object.defineProperty(this,\"state\",{enumerable:!0,configurable:!0,writable:!0,value:B.Init}),Object.defineProperty(this,\"page\",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,\"prevPage\",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,\"container\",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,\"viewport\",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,\"track\",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,\"slides\",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,\"pages\",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,\"panzoom\",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,\"inTransition\",{enumerable:!0,configurable:!0,writable:!0,value:new Set}),Object.defineProperty(this,\"contentDim\",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,\"viewportDim\",{enumerable:!0,configurable:!0,writable:!0,value:0}),\"string\"==typeof t&&(t=document.querySelector(t)),!t||!E(t))throw new Error(\"No Element found\");this.container=t,this.slideNext=D(this.slideNext.bind(this),150),this.slidePrev=D(this.slidePrev.bind(this),150),this.userOptions=e,this.userPlugins=i,queueMicrotask((()=>{this.processOptions()}))}processOptions(){var t,e;const i=u({},Q.defaults,this.userOptions);let n=\"\";const s=i.breakpoints;if(s&&d(s))for(const[t,e]of Object.entries(s))window.matchMedia(t).matches&&d(e)&&(n+=t,u(i,e));n===this.bp&&this.state!==B.Init||(this.bp=n,this.state===B.Ready&&(i.initialSlide=(null===(e=null===(t=this.pages[this.page])||void 0===t?void 0:t.slides[0])||void 0===e?void 0:e.index)||0),this.state!==B.Init&&this.destroy(),super.setOptions(i),!1===this.option(\"enabled\")?this.attachEvents():setTimeout((()=>{this.init()}),0))}init(){this.state=B.Init,this.emit(\"init\"),this.attachPlugins(Object.assign(Object.assign({},Q.Plugins),this.userPlugins)),this.emit(\"attachPlugins\"),this.initLayout(),this.initSlides(),this.updateMetrics(),this.setInitialPosition(),this.initPanzoom(),this.attachEvents(),this.state=B.Ready,this.emit(\"ready\")}initLayout(){const{container:t}=this,e=this.option(\"classes\");P(t,this.cn(\"container\")),o(t,e.isLTR,!this.isRTL),o(t,e.isRTL,this.isRTL),o(t,e.isVertical,!this.isHorizontal),o(t,e.isHorizontal,this.isHorizontal);let i=this.option(\"viewport\")||t.querySelector(`.${e.viewport}`);i||(i=document.createElement(\"div\"),P(i,e.viewport),i.append(...F(t,`.${e.slide}`)),t.prepend(i)),i.addEventListener(\"scroll\",this.onScroll);let n=this.option(\"track\")||t.querySelector(`.${e.track}`);n||(n=document.createElement(\"div\"),P(n,e.track),n.append(...Array.from(i.childNodes))),n.setAttribute(\"aria-live\",\"polite\"),i.contains(n)||i.prepend(n),this.viewport=i,this.track=n,this.emit(\"initLayout\")}initSlides(){const{track:t}=this;if(!t)return;const e=[...this.slides],i=[];[...F(t,`.${this.cn(J)}`)].forEach((t=>{if(E(t)){const e=H({el:t,isDom:!0,index:this.slides.length});i.push(e)}}));for(let t of[...this.option(\"slides\",[])||[],...e])i.push(H(t));this.slides=i;for(let t=0;t<this.slides.length;t++)this.slides[t].index=t;for(const t of i)this.emit(\"beforeInitSlide\",t,t.index),this.emit(\"initSlide\",t,t.index);this.emit(\"initSlides\")}setInitialPage(){const t=this.option(\"initialSlide\");this.page=\"number\"==typeof t?this.getPageForSlide(t):parseInt(this.option(\"initialPage\",0)+\"\",10)||0}setInitialPosition(){const{track:t,pages:e,isHorizontal:i}=this;if(!t||!e.length)return;let n=this.page;e[n]||(this.page=n=0);const s=(e[n].pos||0)*(this.isRTL&&i?1:-1),o=i?`${s}px`:\"0\",a=i?\"0\":`${s}px`;t.style.transform=`translate3d(${o}, ${a}, 0) scale(1)`,this.option(\"adaptiveHeight\")&&this.setViewportHeight()}initPanzoom(){this.panzoom&&(this.panzoom.destroy(),this.panzoom=null);const t=this.option(\"Panzoom\")||{};this.panzoom=new I(this.viewport,u({},{content:this.track,zoom:!1,panOnlyZoomed:!1,lockAxis:this.isHorizontal?\"x\":\"y\",infinite:this.isInfinite,click:!1,dblClick:!1,touch:t=>!(this.pages.length<2&&!t.options.infinite),bounds:()=>this.getBounds(),maxVelocity:t=>Math.abs(t.target[this.axis]-t.current[this.axis])<2*this.viewportDim?100:0},t)),this.panzoom.on(\"*\",((t,e,...i)=>{this.emit(`Panzoom.${e}`,t,...i)})),this.panzoom.on(\"decel\",this.onDecel),this.panzoom.on(\"refresh\",this.onRefresh),this.panzoom.on(\"beforeTransform\",this.onBeforeTransform),this.panzoom.on(\"endAnimation\",this.onEndAnimation)}attachEvents(){const t=this.container;t&&(t.addEventListener(\"click\",this.onClick,{passive:!1,capture:!1}),t.addEventListener(\"slideTo\",this.onSlideTo)),window.addEventListener(\"resize\",this.onResize)}createPages(){let t=[];const{contentDim:e,viewportDim:i}=this;let n=this.option(\"slidesPerPage\");n=(\"auto\"===n||e<=i)&&!1!==this.option(\"fill\")?1/0:parseFloat(n+\"\");let s=0,o=0,a=0;for(const e of this.slides)(!t.length||o+e.dim-i>.05||a>=n)&&(t.push(N()),s=t.length-1,o=0,a=0),t[s].slides.push(e),o+=e.dim+e.gap,a++;return t}processPages(){const e=this.pages,{contentDim:i,viewportDim:n,isInfinite:s}=this,o=this.option(\"center\"),a=this.option(\"fill\"),r=a&&o&&i>n&&!s;if(e.forEach(((t,e)=>{var s;t.index=e,t.pos=(null===(s=t.slides[0])||void 0===s?void 0:s.pos)||0,t.dim=0;for(const[e,i]of t.slides.entries())t.dim+=i.dim,e<t.slides.length-1&&(t.dim+=i.gap);r&&t.pos+.5*t.dim<.5*n?t.pos=0:r&&t.pos+.5*t.dim>=i-.5*n?t.pos=i-n:o&&(t.pos+=-.5*(n-t.dim))})),e.forEach((e=>{a&&!s&&i>n&&(e.pos=Math.max(e.pos,0),e.pos=Math.min(e.pos,i-n)),e.pos=t(e.pos,1e3),e.dim=t(e.dim,1e3),Math.abs(e.pos)<=.1&&(e.pos=0)})),s)return e;const l=[];let c;return e.forEach((t=>{const e=Object.assign({},t);c&&e.pos===c.pos?(c.dim+=e.dim,c.slides=[...c.slides,...e.slides]):(e.index=l.length,c=e,l.push(e))})),l}getPageFromIndex(t=0){const e=this.pages.length;let i;return t=parseInt((t||0).toString())||0,i=this.isInfinite?(t%e+e)%e:Math.max(Math.min(t,e-1),0),i}getSlideMetrics(e){var i,n;const s=this.isHorizontal?\"width\":\"height\";let o=0,a=0,r=e.el;const l=!(!r||r.parentNode);if(r?o=parseFloat(r.dataset[s]||\"\")||0:(r=document.createElement(\"div\"),r.style.visibility=\"hidden\",(this.track||document.body).prepend(r)),P(r,this.cn(J)+\" \"+e.class+\" \"+e.customClass),o)r.style[s]=`${o}px`,r.style[\"width\"===s?\"height\":\"width\"]=\"\";else{l&&(this.track||document.body).prepend(r),o=r.getBoundingClientRect()[s]*Math.max(1,(null===(i=window.visualViewport)||void 0===i?void 0:i.scale)||1);let t=r[this.isHorizontal?\"offsetWidth\":\"offsetHeight\"];t-1>o&&(o=t)}const c=getComputedStyle(r);return\"content-box\"===c.boxSizing&&(this.isHorizontal?(o+=parseFloat(c.paddingLeft)||0,o+=parseFloat(c.paddingRight)||0):(o+=parseFloat(c.paddingTop)||0,o+=parseFloat(c.paddingBottom)||0)),a=parseFloat(c[this.isHorizontal?\"marginRight\":\"marginBottom\"])||0,l?null===(n=r.parentElement)||void 0===n||n.removeChild(r):e.el||r.remove(),{dim:t(o,1e3),gap:t(a,1e3)}}getBounds(){const{isInfinite:t,isRTL:e,isHorizontal:i,pages:n}=this;let s={min:0,max:0};if(t)s={min:-1/0,max:1/0};else if(n.length){const t=n[0].pos,o=n[n.length-1].pos;s=e&&i?{min:t,max:o}:{min:-1*o,max:-1*t}}return{x:i?s:{min:0,max:0},y:i?{min:0,max:0}:s}}repositionSlides(){let e,{isHorizontal:i,isRTL:n,isInfinite:s,viewport:o,viewportDim:a,contentDim:r,page:l,pages:c,slides:h,panzoom:d}=this,u=0,p=0,f=0,g=0;d?g=-1*d.current[this.axis]:c[l]&&(g=c[l].pos||0),e=i?n?\"right\":\"left\":\"top\",n&&i&&(g*=-1);for(const i of h){const n=i.el;n?(\"top\"===e?(n.style.right=\"\",n.style.left=\"\"):n.style.top=\"\",i.index!==u?n.style[e]=0===p?\"\":`${t(p,1e3)}px`:n.style[e]=\"\",f+=i.dim+i.gap,u++):p+=i.dim+i.gap}if(s&&f&&o){let n=getComputedStyle(o),s=\"padding\",l=i?\"Right\":\"Bottom\",c=parseFloat(n[s+(i?\"Left\":\"Top\")]);g-=c,a+=c,a+=parseFloat(n[s+l]);for(const i of h)i.el&&(t(i.pos)<t(a)&&t(i.pos+i.dim+i.gap)<t(g)&&t(g)>t(r-a)&&(i.el.style[e]=`${t(p+f,1e3)}px`),t(i.pos+i.gap)>=t(r-a)&&t(i.pos)>t(g+a)&&t(g)<t(a)&&(i.el.style[e]=`-${t(f,1e3)}px`))}let m,v,b=[...this.inTransition];if(b.length>1&&(m=c[b[0]],v=c[b[1]]),m&&v){let i=0;for(const n of h)n.el?this.inTransition.has(n.index)&&m.slides.indexOf(n)<0&&(n.el.style[e]=`${t(i+(m.pos-v.pos),1e3)}px`):i+=n.dim+n.gap}}createSlideEl(t){const{track:e,slides:i}=this;if(!e||!t)return;if(t.el&&t.el.parentNode)return;const n=t.el||document.createElement(\"div\");P(n,this.cn(J)),P(n,t.class),P(n,t.customClass);const s=t.html;s&&(s instanceof HTMLElement?n.appendChild(s):n.innerHTML=t.html+\"\");const o=[];i.forEach(((t,e)=>{t.el&&o.push(e)}));const a=t.index;let r=null;if(o.length){r=i[o.reduce(((t,e)=>Math.abs(e-a)<Math.abs(t-a)?e:t))]}const l=r&&r.el&&r.el.parentNode?r.index<t.index?r.el.nextSibling:r.el:null;e.insertBefore(n,e.contains(l)?l:null),t.el=n,this.emit(\"createSlide\",t)}removeSlideEl(t,e=!1){const i=null==t?void 0:t.el;if(!i||!i.parentNode)return;const n=this.cn(K);if(i.classList.contains(n)&&(S(i,n),this.emit(\"unselectSlide\",t)),t.isDom&&!e)return i.removeAttribute(\"aria-hidden\"),i.removeAttribute(\"data-index\"),void(i.style.left=\"\");this.emit(\"removeSlide\",t);const s=new CustomEvent(G);i.dispatchEvent(s),t.el&&(t.el.remove(),t.el=null)}transitionTo(t=0,e=this.option(\"transition\")){var i,n,s,o;if(!e)return!1;const a=this.page,{pages:r,panzoom:l}=this;t=parseInt((t||0).toString())||0;const c=this.getPageFromIndex(t);if(!l||!r[c]||r.length<2||Math.abs(((null===(n=null===(i=r[a])||void 0===i?void 0:i.slides[0])||void 0===n?void 0:n.dim)||0)-this.viewportDim)>1)return!1;let h=t>a?1:-1;this.isInfinite&&(0===a&&t===r.length-1&&(h=-1),a===r.length-1&&0===t&&(h=1));const d=r[c].pos*(this.isRTL?1:-1);if(a===c&&Math.abs(d-l.target[this.axis])<1)return!1;this.clearTransitions();const u=l.isResting;P(this.container,this.cn(\"inTransition\"));const p=(null===(s=r[a])||void 0===s?void 0:s.slides[0])||null,f=(null===(o=r[c])||void 0===o?void 0:o.slides[0])||null;this.inTransition.add(f.index),this.createSlideEl(f);let g=p.el,m=f.el;u||e===J||(e=\"fadeFast\",g=null);const v=this.isRTL?\"next\":\"prev\",b=this.isRTL?\"prev\":\"next\";return g&&(this.inTransition.add(p.index),p.transition=e,g.addEventListener(G,this.onAnimationEnd),g.classList.add(`f-${e}Out`,`to-${h>0?b:v}`)),m&&(f.transition=e,m.addEventListener(G,this.onAnimationEnd),m.classList.add(`f-${e}In`,`from-${h>0?v:b}`)),l.current[this.axis]=d,l.target[this.axis]=d,l.requestTick(),this.onChange(c),!0}manageSlideVisiblity(){const t=new Set,e=new Set,i=this.getVisibleSlides(parseFloat(this.option(\"preload\",0)+\"\")||0);for(const n of this.slides)i.has(n)?t.add(n):e.add(n);for(const e of this.inTransition)t.add(this.slides[e]);for(const e of t)this.createSlideEl(e),this.lazyLoadSlide(e);for(const i of e)t.has(i)||this.removeSlideEl(i);this.markSelectedSlides(),this.repositionSlides()}markSelectedSlides(){if(!this.pages[this.page]||!this.pages[this.page].slides)return;const t=\"aria-hidden\";let e=this.cn(K);if(e)for(const i of this.slides){const n=i.el;n&&(n.dataset.index=`${i.index}`,n.classList.contains(\"f-thumbs__slide\")?this.getVisibleSlides(0).has(i)?n.removeAttribute(t):n.setAttribute(t,\"true\"):this.pages[this.page].slides.includes(i)?(n.classList.contains(e)||(P(n,e),this.emit(\"selectSlide\",i)),n.removeAttribute(t)):(n.classList.contains(e)&&(S(n,e),this.emit(\"unselectSlide\",i)),n.setAttribute(t,\"true\")))}}flipInfiniteTrack(){const{axis:t,isHorizontal:e,isInfinite:i,isRTL:n,viewportDim:s,contentDim:o}=this,a=this.panzoom;if(!a||!i)return;let r=a.current[t],l=a.target[t]-r,c=0,h=.5*s;n&&e?(r<-h&&(c=-1,r+=o),r>o-h&&(c=1,r-=o)):(r>h&&(c=1,r-=o),r<-o+h&&(c=-1,r+=o)),c&&(a.current[t]=r,a.target[t]=r+l)}lazyLoadImg(t,e){const i=this,s=\"f-fadeIn\",o=\"is-preloading\";let a=!1,r=null;const l=()=>{a||(a=!0,r&&(r.remove(),r=null),S(e,o),e.complete&&(P(e,s),setTimeout((()=>{S(e,s)}),350)),this.option(\"adaptiveHeight\")&&t.el&&this.pages[this.page].slides.indexOf(t)>-1&&(i.updateMetrics(),i.setViewportHeight()),this.emit(\"load\",t))};P(e,o),e.src=e.dataset.lazySrcset||e.dataset.lazySrc||\"\",delete e.dataset.lazySrc,delete e.dataset.lazySrcset,e.addEventListener(\"error\",(()=>{l()})),e.addEventListener(\"load\",(()=>{l()})),setTimeout((()=>{const i=e.parentNode;i&&t.el&&(e.complete?l():a||(r=n(x),i.insertBefore(r,e)))}),300)}lazyLoadSlide(t){const e=t&&t.el;if(!e)return;const i=new Set;let n=Array.from(e.querySelectorAll(\"[data-lazy-src],[data-lazy-srcset]\"));e.dataset.lazySrc&&n.push(e),n.map((t=>{t instanceof HTMLImageElement?i.add(t):t instanceof HTMLElement&&t.dataset.lazySrc&&(t.style.backgroundImage=`url('${t.dataset.lazySrc}')`,delete t.dataset.lazySrc)}));for(const e of i)this.lazyLoadImg(t,e)}onAnimationEnd(t){var e;const i=t.target,n=i?parseInt(i.dataset.index||\"\",10)||0:-1,s=this.slides[n],o=t.animationName;if(!i||!s||!o)return;const a=!!this.inTransition.has(n)&&s.transition;a&&o.substring(0,a.length+2)===`f-${a}`&&this.inTransition.delete(n),this.inTransition.size||this.clearTransitions(),n===this.page&&(null===(e=this.panzoom)||void 0===e?void 0:e.isResting)&&this.emit(\"settle\")}onDecel(t,e=0,i=0,n=0,s=0){if(this.option(\"dragFree\"))return void this.setPageFromPosition();const{isRTL:o,isHorizontal:a,axis:r,pages:l}=this,c=l.length,h=Math.abs(Math.atan2(i,e)/(Math.PI/180));let d=0;if(d=h>45&&h<135?a?0:i:a?e:0,!c)return;let u=this.page,p=o&&a?1:-1;const f=t.current[r]*p;let{pageIndex:g}=this.getPageFromPosition(f);Math.abs(d)>5?(l[u].dim<document.documentElement[\"client\"+(this.isHorizontal?\"Width\":\"Height\")]-1&&(u=g),u=o&&a?d<0?u-1:u+1:d<0?u+1:u-1):u=0===n&&0===s?u:g,this.slideTo(u,{transition:!1,friction:t.option(\"decelFriction\")})}onClick(t){const e=t.target,i=e&&E(e)?e.dataset:null;let n,s;i&&(void 0!==i.carouselPage?(s=\"slideTo\",n=i.carouselPage):void 0!==i.carouselNext?s=\"slideNext\":void 0!==i.carouselPrev&&(s=\"slidePrev\")),s?(t.preventDefault(),t.stopPropagation(),e&&!e.hasAttribute(\"disabled\")&&this[s](n)):this.emit(\"click\",t)}onSlideTo(t){const e=t.detail||0;this.slideTo(this.getPageForSlide(e),{friction:0})}onChange(t,e=0){const i=this.page;this.prevPage=i,this.page=t,this.option(\"adaptiveHeight\")&&this.setViewportHeight(),t!==i&&(this.markSelectedSlides(),this.emit(\"change\",t,i,e))}onRefresh(){let t=this.contentDim,e=this.viewportDim;this.updateMetrics(),this.contentDim===t&&this.viewportDim===e||this.slideTo(this.page,{friction:0,transition:!1})}onScroll(){var t;null===(t=this.viewport)||void 0===t||t.scroll(0,0)}onResize(){this.option(\"breakpoints\")&&this.processOptions()}onBeforeTransform(t){this.lp!==t.current[this.axis]&&(this.flipInfiniteTrack(),this.manageSlideVisiblity()),this.lp=t.current.e}onEndAnimation(){this.inTransition.size||this.emit(\"settle\")}reInit(t=null,e=null){this.destroy(),this.state=B.Init,this.prevPage=null,this.userOptions=t||this.userOptions,this.userPlugins=e||this.userPlugins,this.processOptions()}slideTo(t=0,{friction:e=this.option(\"friction\"),transition:i=this.option(\"transition\")}={}){if(this.state===B.Destroy)return;t=parseInt((t||0).toString())||0;const n=this.getPageFromIndex(t),{axis:s,isHorizontal:o,isRTL:a,pages:r,panzoom:l}=this,c=r.length,h=a&&o?1:-1;if(!l||!c)return;if(this.page!==n){const e=new Event(\"beforeChange\",{bubbles:!0,cancelable:!0});if(this.emit(\"beforeChange\",e,t),e.defaultPrevented)return}if(this.transitionTo(t,i))return;let d=r[n].pos;if(this.isInfinite){const e=this.contentDim,i=l.target[s]*h;if(2===c)d+=e*Math.floor(parseFloat(t+\"\")/2);else{d=[d,d-e,d+e].reduce((function(t,e){return Math.abs(e-i)<Math.abs(t-i)?e:t}))}}d*=h,Math.abs(l.target[s]-d)<1||(l.panTo({x:o?d:0,y:o?0:d,friction:e}),this.onChange(n))}slideToClosest(t){if(this.panzoom){const{pageIndex:e}=this.getPageFromPosition();this.slideTo(e,t)}}slideNext(){this.slideTo(this.page+1)}slidePrev(){this.slideTo(this.page-1)}clearTransitions(){this.inTransition.clear(),S(this.container,this.cn(\"inTransition\"));const t=[\"to-prev\",\"to-next\",\"from-prev\",\"from-next\"];for(const e of this.slides){const i=e.el;if(i){i.removeEventListener(G,this.onAnimationEnd),i.classList.remove(...t);const n=e.transition;n&&i.classList.remove(`f-${n}Out`,`f-${n}In`)}}this.manageSlideVisiblity()}addSlide(t,e){var i,n,s,o;const a=this.panzoom,r=(null===(i=this.pages[this.page])||void 0===i?void 0:i.pos)||0,l=(null===(n=this.pages[this.page])||void 0===n?void 0:n.dim)||0,c=this.contentDim<this.viewportDim;let h=Array.isArray(e)?e:[e];const d=[];for(const t of h)d.push(H(t));this.slides.splice(t,0,...d);for(let t=0;t<this.slides.length;t++)this.slides[t].index=t;for(const t of d)this.emit(\"beforeInitSlide\",t,t.index);if(this.page>=t&&(this.page+=d.length),this.updateMetrics(),a){const e=(null===(s=this.pages[this.page])||void 0===s?void 0:s.pos)||0,i=(null===(o=this.pages[this.page])||void 0===o?void 0:o.dim)||0,n=this.pages.length||1,h=this.isRTL?l-i:i-l,d=this.isRTL?r-e:e-r;c&&1===n?(t<=this.page&&(a.current[this.axis]-=h,a.target[this.axis]-=h),a.panTo({[this.isHorizontal?\"x\":\"y\"]:-1*e})):d&&t<=this.page&&(a.target[this.axis]-=d,a.current[this.axis]-=d,a.requestTick())}for(const t of d)this.emit(\"initSlide\",t,t.index)}prependSlide(t){this.addSlide(0,t)}appendSlide(t){this.addSlide(this.slides.length,t)}removeSlide(t){const e=this.slides.length;t=(t%e+e)%e;const i=this.slides[t];if(i){this.removeSlideEl(i,!0),this.slides.splice(t,1);for(let t=0;t<this.slides.length;t++)this.slides[t].index=t;this.updateMetrics(),this.slideTo(this.page,{friction:0,transition:!1}),this.emit(\"destroySlide\",i)}}updateMetrics(){const{panzoom:e,viewport:i,track:n,slides:s,isHorizontal:o,isInfinite:a}=this;if(!n)return;const r=o?\"width\":\"height\",l=o?\"offsetWidth\":\"offsetHeight\";if(i){let e=Math.max(i[l],t(i.getBoundingClientRect()[r],1e3)),n=getComputedStyle(i),s=\"padding\",a=o?\"Right\":\"Bottom\";e-=parseFloat(n[s+(o?\"Left\":\"Top\")])+parseFloat(n[s+a]),this.viewportDim=e}let c,h=0;for(const[e,i]of s.entries()){let n=0,o=0;!i.el&&c?(n=c.dim,o=c.gap):(({dim:n,gap:o}=this.getSlideMetrics(i)),c=i),n=t(n,1e3),o=t(o,1e3),i.dim=n,i.gap=o,i.pos=h,h+=n,(a||e<s.length-1)&&(h+=o)}h=t(h,1e3),this.contentDim=h,e&&(e.contentRect[r]=h,e.contentRect[o?\"fullWidth\":\"fullHeight\"]=h),this.pages=this.createPages(),this.pages=this.processPages(),this.state===B.Init&&this.setInitialPage(),this.page=Math.max(0,Math.min(this.page,this.pages.length-1)),this.manageSlideVisiblity(),this.emit(\"refresh\")}getProgress(e,i=!1,n=!1){void 0===e&&(e=this.page);const s=this,o=s.panzoom,a=s.contentDim,r=s.pages[e]||0;if(!r||!o)return e>this.page?-1:1;let l=-1*o.current.e,c=t((l-r.pos)/(1*r.dim),1e3),h=c,d=c;this.isInfinite&&!0!==n&&(h=t((l-r.pos+a)/(1*r.dim),1e3),d=t((l-r.pos-a)/(1*r.dim),1e3));let u=[c,h,d].reduce((function(t,e){return Math.abs(e)<Math.abs(t)?e:t}));return i?u:u>1?1:u<-1?-1:u}setViewportHeight(){const{page:t,pages:e,viewport:i,isHorizontal:n}=this;if(!i||!e[t])return;let s=0;n&&this.track&&(this.track.style.height=\"auto\",e[t].slides.forEach((t=>{t.el&&(s=Math.max(s,t.el.offsetHeight))}))),i.style.height=s?`${s}px`:\"\"}getPageForSlide(t){for(const e of this.pages)for(const i of e.slides)if(i.index===t)return e.index;return-1}getVisibleSlides(t=0){var e;const i=new Set;let{panzoom:n,contentDim:s,viewportDim:o,pages:a,page:r}=this;if(o){s=s+(null===(e=this.slides[this.slides.length-1])||void 0===e?void 0:e.gap)||0;let l=0;l=n&&n.state!==m.Init&&n.state!==m.Destroy?-1*n.current[this.axis]:a[r]&&a[r].pos||0,this.isInfinite&&(l-=Math.floor(l/s)*s),this.isRTL&&this.isHorizontal&&(l*=-1);const c=l-o*t,h=l+o*(t+1),d=this.isInfinite?[-1,0,1]:[0];for(const t of this.slides)for(const e of d){const n=t.pos+e*s,o=n+t.dim+t.gap;n<h&&o>c&&i.add(t)}}return i}getPageFromPosition(t){const{viewportDim:e,contentDim:i,slides:n,pages:s,panzoom:o}=this,a=s.length,r=n.length,l=n[0],c=n[r-1],h=this.option(\"center\");let d=0,u=0,p=0,f=void 0===t?-1*((null==o?void 0:o.target[this.axis])||0):t;h&&(f+=.5*e),this.isInfinite?(f<l.pos-.5*c.gap&&(f-=i,p=-1),f>c.pos+c.dim+.5*c.gap&&(f-=i,p=1)):f=Math.max(l.pos||0,Math.min(f,c.pos));let g=c,m=n.find((t=>{const e=t.pos-.5*g.gap,i=t.pos+t.dim+.5*t.gap;return g=t,f>=e&&f<i}));return m||(m=c),u=this.getPageForSlide(m.index),d=u+p*a,{page:d,pageIndex:u}}setPageFromPosition(){const{pageIndex:t}=this.getPageFromPosition();this.onChange(t)}destroy(){if([B.Destroy].includes(this.state))return;this.state=B.Destroy;const{container:t,viewport:e,track:i,slides:n,panzoom:s}=this,o=this.option(\"classes\");t.removeEventListener(\"click\",this.onClick,{passive:!1,capture:!1}),t.removeEventListener(\"slideTo\",this.onSlideTo),window.removeEventListener(\"resize\",this.onResize),s&&(s.destroy(),this.panzoom=null),n&&n.forEach((t=>{this.removeSlideEl(t)})),this.detachPlugins(),e&&(e.removeEventListener(\"scroll\",this.onScroll),e.offsetParent&&i&&i.offsetParent&&e.replaceWith(...i.childNodes));for(const[e,i]of Object.entries(o))\"container\"!==e&&i&&t.classList.remove(i);this.track=null,this.viewport=null,this.page=0,this.slides=[];const a=this.events.get(\"ready\");this.events=new Map,a&&this.events.set(\"ready\",a)}}Object.defineProperty(Q,\"Panzoom\",{enumerable:!0,configurable:!0,writable:!0,value:I}),Object.defineProperty(Q,\"defaults\",{enumerable:!0,configurable:!0,writable:!0,value:j}),Object.defineProperty(Q,\"Plugins\",{enumerable:!0,configurable:!0,writable:!0,value:U});const tt=function(t){if(!E(t))return 0;const e=window.scrollY,i=window.innerHeight,n=e+i,s=t.getBoundingClientRect(),o=s.y+e,a=s.height,r=o+a;if(e>r||n<o)return 0;if(e<o&&n>r)return 100;if(o<e&&r>n)return 100;let l=a;o<e&&(l-=e-o),r>n&&(l-=r-n);const c=l/i*100;return Math.round(c)},et=!(\"undefined\"==typeof window||!window.document||!window.document.createElement);let it;const nt=[\"a[href]\",\"area[href]\",'input:not([disabled]):not([type=\"hidden\"]):not([aria-hidden])',\"select:not([disabled]):not([aria-hidden])\",\"textarea:not([disabled]):not([aria-hidden])\",\"button:not([disabled]):not([aria-hidden]):not(.fancybox-focus-guard)\",\"iframe\",\"object\",\"embed\",\"video\",\"audio\",\"[contenteditable]\",'[tabindex]:not([tabindex^=\"-\"]):not([disabled]):not([aria-hidden])'].join(\",\"),st=t=>{if(t&&et){void 0===it&&document.createElement(\"div\").focus({get preventScroll(){return it=!0,!1}});try{if(it)t.focus({preventScroll:!0});else{const e=window.scrollY||document.body.scrollTop,i=window.scrollX||document.body.scrollLeft;t.focus(),document.body.scrollTo({top:e,left:i,behavior:\"auto\"})}}catch(t){}}},ot=()=>{const t=document;let e,i=\"\",n=\"\",s=\"\";return t.fullscreenEnabled?(i=\"requestFullscreen\",n=\"exitFullscreen\",s=\"fullscreenElement\"):t.webkitFullscreenEnabled&&(i=\"webkitRequestFullscreen\",n=\"webkitExitFullscreen\",s=\"webkitFullscreenElement\"),i&&(e={request:function(e=t.documentElement){return\"webkitRequestFullscreen\"===i?e[i](Element.ALLOW_KEYBOARD_INPUT):e[i]()},exit:function(){return t[s]&&t[n]()},isFullscreen:function(){return t[s]}}),e},at={animated:!0,autoFocus:!0,backdropClick:\"close\",Carousel:{classes:{container:\"fancybox__carousel\",viewport:\"fancybox__viewport\",track:\"fancybox__track\",slide:\"fancybox__slide\"}},closeButton:\"auto\",closeExisting:!1,commonCaption:!1,compact:()=>window.matchMedia(\"(max-width: 578px), (max-height: 578px)\").matches,contentClick:\"toggleZoom\",contentDblClick:!1,defaultType:\"image\",defaultDisplay:\"flex\",dragToClose:!0,Fullscreen:{autoStart:!1},groupAll:!1,groupAttr:\"data-fancybox\",hideClass:\"f-fadeOut\",hideScrollbar:!0,idle:3500,keyboard:{Escape:\"close\",Delete:\"close\",Backspace:\"close\",PageUp:\"next\",PageDown:\"prev\",ArrowUp:\"prev\",ArrowDown:\"next\",ArrowRight:\"next\",ArrowLeft:\"prev\"},l10n:Object.assign(Object.assign({},b),{CLOSE:\"Close\",NEXT:\"Next\",PREV:\"Previous\",MODAL:\"You can close this modal content with the ESC key\",ERROR:\"Something Went Wrong, Please Try Again Later\",IMAGE_ERROR:\"Image Not Found\",ELEMENT_NOT_FOUND:\"HTML Element Not Found\",AJAX_NOT_FOUND:\"Error Loading AJAX : Not Found\",AJAX_FORBIDDEN:\"Error Loading AJAX : Forbidden\",IFRAME_ERROR:\"Error Loading Page\",TOGGLE_ZOOM:\"Toggle zoom level\",TOGGLE_THUMBS:\"Toggle thumbnails\",TOGGLE_SLIDESHOW:\"Toggle slideshow\",TOGGLE_FULLSCREEN:\"Toggle full-screen mode\",DOWNLOAD:\"Download\"}),parentEl:null,placeFocusBack:!0,showClass:\"f-zoomInUp\",startIndex:0,tpl:{closeButton:'<button data-fancybox-close class=\"f-button is-close-btn\" title=\"{{CLOSE}}\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" tabindex=\"-1\"><path d=\"M20 20L4 4m16 0L4 20\"/></svg></button>',main:'<div class=\"fancybox__container\" role=\"dialog\" aria-modal=\"true\" aria-label=\"{{MODAL}}\" tabindex=\"-1\">\\n    <div class=\"fancybox__backdrop\"></div>\\n    <div class=\"fancybox__carousel\"></div>\\n    <div class=\"fancybox__footer\"></div>\\n  </div>'},trapFocus:!0,wheel:\"zoom\"};var rt,lt;!function(t){t[t.Init=0]=\"Init\",t[t.Ready=1]=\"Ready\",t[t.Closing=2]=\"Closing\",t[t.CustomClosing=3]=\"CustomClosing\",t[t.Destroy=4]=\"Destroy\"}(rt||(rt={})),function(t){t[t.Loading=0]=\"Loading\",t[t.Opening=1]=\"Opening\",t[t.Ready=2]=\"Ready\",t[t.Closing=3]=\"Closing\"}(lt||(lt={}));let ct=\"\",ht=!1,dt=!1,ut=null;const pt=()=>{let t=\"\",e=\"\";const i=Oe.getInstance();if(i){const n=i.carousel,s=i.getSlide();if(n&&s){let o=s.slug||void 0,a=s.triggerEl||void 0;e=o||(i.option(\"slug\")||\"\"),!e&&a&&a.dataset&&(e=a.dataset.fancybox||\"\"),e&&\"true\"!==e&&(t=\"#\"+e+(!o&&n.slides.length>1?\"-\"+(s.index+1):\"\"))}}return{hash:t,slug:e,index:1}},ft=()=>{const t=new URL(document.URL).hash,e=t.slice(1).split(\"-\"),i=e[e.length-1],n=i&&/^\\+?\\d+$/.test(i)&&parseInt(e.pop()||\"1\",10)||1;return{hash:t,slug:e.join(\"-\"),index:n}},gt=()=>{const{slug:t,index:e}=ft();if(!t)return;let i=document.querySelector(`[data-slug=\"${t}\"]`);if(i&&i.dispatchEvent(new CustomEvent(\"click\",{bubbles:!0,cancelable:!0})),Oe.getInstance())return;const n=document.querySelectorAll(`[data-fancybox=\"${t}\"]`);n.length&&(i=n[e-1],i&&i.dispatchEvent(new CustomEvent(\"click\",{bubbles:!0,cancelable:!0})))},mt=()=>{if(!1===Oe.defaults.Hash)return;const t=Oe.getInstance();if(!1===(null==t?void 0:t.options.Hash))return;const{slug:e,index:i}=ft(),{slug:n}=pt();t&&(e===n?t.jumpTo(i-1):(ht=!0,t.close())),gt()},vt=()=>{ut&&clearTimeout(ut),queueMicrotask((()=>{mt()}))},bt=()=>{window.addEventListener(\"hashchange\",vt,!1),setTimeout((()=>{mt()}),500)};et&&(/complete|interactive|loaded/.test(document.readyState)?bt():document.addEventListener(\"DOMContentLoaded\",bt));const yt=\"is-zooming-in\";class wt extends _{onCreateSlide(t,e,i){const n=this.instance.optionFor(i,\"src\")||\"\";i.el&&\"image\"===i.type&&\"string\"==typeof n&&this.setImage(i,n)}onRemoveSlide(t,e,i){i.panzoom&&i.panzoom.destroy(),i.panzoom=void 0,i.imageEl=void 0}onChange(t,e,i,n){S(this.instance.container,yt);for(const t of e.slides){const e=t.panzoom;e&&t.index!==i&&e.reset(.35)}}onClose(){var t;const e=this.instance,i=e.container,n=e.getSlide();if(!i||!i.parentElement||!n)return;const{el:s,contentEl:o,panzoom:a,thumbElSrc:r}=n;if(!s||!r||!o||!a||a.isContentLoading||a.state===m.Init||a.state===m.Destroy)return;a.updateMetrics();let l=this.getZoomInfo(n);if(!l)return;this.instance.state=rt.CustomClosing,i.classList.remove(yt),i.classList.add(\"is-zooming-out\"),o.style.backgroundImage=`url('${r}')`;const c=i.getBoundingClientRect();1===((null===(t=window.visualViewport)||void 0===t?void 0:t.scale)||1)&&Object.assign(i.style,{position:\"absolute\",top:`${i.offsetTop+window.scrollY}px`,left:`${i.offsetLeft+window.scrollX}px`,bottom:\"auto\",right:\"auto\",width:`${c.width}px`,height:`${c.height}px`,overflow:\"hidden\"});const{x:h,y:d,scale:u,opacity:p}=l;if(p){const t=((t,e,i,n)=>{const s=e-t,o=n-i;return e=>i+((e-t)/s*o||0)})(a.scale,u,1,0);a.on(\"afterTransform\",(()=>{o.style.opacity=t(a.scale)+\"\"}))}a.on(\"endAnimation\",(()=>{e.destroy()})),a.target.a=u,a.target.b=0,a.target.c=0,a.target.d=u,a.panTo({x:h,y:d,scale:u,friction:p?.2:.33,ignoreBounds:!0}),a.isResting&&e.destroy()}setImage(t,e){const i=this.instance;t.src=e,this.process(t,e).then((e=>{const{contentEl:n,imageEl:s,thumbElSrc:o,el:a}=t;if(i.isClosing()||!n||!s)return;n.offsetHeight;const r=!!i.isOpeningSlide(t)&&this.getZoomInfo(t);if(this.option(\"protected\")&&a){a.addEventListener(\"contextmenu\",(t=>{t.preventDefault()}));const t=document.createElement(\"div\");P(t,\"fancybox-protected\"),n.appendChild(t)}if(o&&r){const s=e.contentRect,a=Math.max(s.fullWidth,s.fullHeight);let c=null;!r.opacity&&a>1200&&(c=document.createElement(\"img\"),P(c,\"fancybox-ghost\"),c.src=o,n.appendChild(c));const h=()=>{c&&(P(c,\"f-fadeFastOut\"),setTimeout((()=>{c&&(c.remove(),c=null)}),200))};(l=o,new Promise(((t,e)=>{const i=new Image;i.onload=t,i.onerror=e,i.src=l}))).then((()=>{i.hideLoading(t),t.state=lt.Opening,this.instance.emit(\"reveal\",t),this.zoomIn(t).then((()=>{h(),this.instance.done(t)}),(()=>{})),c&&setTimeout((()=>{h()}),a>2500?800:200)}),(()=>{i.hideLoading(t),i.revealContent(t)}))}else{const n=this.optionFor(t,\"initialSize\"),s=this.optionFor(t,\"zoom\"),o={event:i.prevMouseMoveEvent||i.options.event,friction:s?.12:0};let a=i.optionFor(t,\"showClass\")||void 0,r=!0;i.isOpeningSlide(t)&&(\"full\"===n?e.zoomToFull(o):\"cover\"===n?e.zoomToCover(o):\"max\"===n?e.zoomToMax(o):r=!1,e.stop(\"current\")),r&&a&&(a=e.isDragging?\"f-fadeIn\":\"\"),i.hideLoading(t),i.revealContent(t,a)}var l}),(()=>{i.setError(t,\"{{IMAGE_ERROR}}\")}))}process(t,e){return new Promise(((i,s)=>{var o;const a=this.instance,r=t.el;a.clearContent(t),a.showLoading(t);let l=this.optionFor(t,\"content\");if(\"string\"==typeof l&&(l=n(l)),!l||!E(l)){if(l=document.createElement(\"img\"),l instanceof HTMLImageElement){let i=\"\",n=t.caption;i=\"string\"==typeof n&&n?n.replace(/<[^>]+>/gi,\"\").substring(0,1e3):`Image ${t.index+1} of ${(null===(o=a.carousel)||void 0===o?void 0:o.pages.length)||1}`,l.src=e||\"\",l.alt=i,l.draggable=!1,t.srcset&&l.setAttribute(\"srcset\",t.srcset),this.instance.isOpeningSlide(t)&&(l.fetchPriority=\"high\")}t.sizes&&l.setAttribute(\"sizes\",t.sizes)}P(l,\"fancybox-image\"),t.imageEl=l,a.setContent(t,l,!1);t.panzoom=new I(r,u({transformParent:!0},this.option(\"Panzoom\")||{},{content:l,width:(e,i)=>a.optionFor(t,\"width\",\"auto\",i)||\"auto\",height:(e,i)=>a.optionFor(t,\"height\",\"auto\",i)||\"auto\",wheel:()=>{const t=a.option(\"wheel\");return(\"zoom\"===t||\"pan\"==t)&&t},click:(e,i)=>{var n,s;if(a.isCompact||a.isClosing())return!1;if(t.index!==(null===(n=a.getSlide())||void 0===n?void 0:n.index))return!1;if(i){const t=i.composedPath()[0];if([\"A\",\"BUTTON\",\"TEXTAREA\",\"OPTION\",\"INPUT\",\"SELECT\",\"VIDEO\"].includes(t.nodeName))return!1}let o=!i||i.target&&(null===(s=t.contentEl)||void 0===s?void 0:s.contains(i.target));return a.option(o?\"contentClick\":\"backdropClick\")||!1},dblClick:()=>a.isCompact?\"toggleZoom\":a.option(\"contentDblClick\")||!1,spinner:!1,panOnlyZoomed:!0,wheelLimit:1/0,on:{ready:t=>{i(t)},error:()=>{s()},destroy:()=>{s()}}}))}))}zoomIn(t){return new Promise(((e,i)=>{const n=this.instance,s=n.container,{panzoom:o,contentEl:a,el:r}=t;o&&o.updateMetrics();const l=this.getZoomInfo(t);if(!(l&&r&&a&&o&&s))return void i();const{x:c,y:h,scale:d,opacity:u}=l,p=()=>{t.state!==lt.Closing&&(u&&(a.style.opacity=Math.max(Math.min(1,1-(1-o.scale)/(1-d)),0)+\"\"),o.scale>=1&&o.scale>o.targetScale-.1&&e(o))},f=t=>{(t.scale<.99||t.scale>1.01)&&!t.isDragging||(S(s,yt),a.style.opacity=\"\",t.off(\"endAnimation\",f),t.off(\"touchStart\",f),t.off(\"afterTransform\",p),e(t))};o.on(\"endAnimation\",f),o.on(\"touchStart\",f),o.on(\"afterTransform\",p),o.on([\"error\",\"destroy\"],(()=>{i()})),o.panTo({x:c,y:h,scale:d,friction:0,ignoreBounds:!0}),o.stop(\"current\");const g={event:\"mousemove\"===o.panMode?n.prevMouseMoveEvent||n.options.event:void 0},m=this.optionFor(t,\"initialSize\");P(s,yt),n.hideLoading(t),\"full\"===m?o.zoomToFull(g):\"cover\"===m?o.zoomToCover(g):\"max\"===m?o.zoomToMax(g):o.reset(.172)}))}getZoomInfo(t){const{el:e,imageEl:i,thumbEl:n,panzoom:s}=t,o=this.instance,a=o.container;if(!e||!i||!n||!s||tt(n)<3||!this.optionFor(t,\"zoom\")||!a||o.state===rt.Destroy)return!1;if(\"0\"===getComputedStyle(a).getPropertyValue(\"--f-images-zoom\"))return!1;const r=window.visualViewport||null;if(1!==(r?r.scale:1))return!1;let{top:l,left:c,width:h,height:d}=n.getBoundingClientRect(),{top:u,left:p,fitWidth:f,fitHeight:g}=s.contentRect;if(!(h&&d&&f&&g))return!1;const m=s.container.getBoundingClientRect();p+=m.left,u+=m.top;const v=-1*(p+.5*f-(c+.5*h)),b=-1*(u+.5*g-(l+.5*d)),y=h/f;let w=this.option(\"zoomOpacity\")||!1;return\"auto\"===w&&(w=Math.abs(h/d-f/g)>.1),{x:v,y:b,scale:y,opacity:w}}attach(){const t=this,e=t.instance;e.on(\"Carousel.change\",t.onChange),e.on(\"Carousel.createSlide\",t.onCreateSlide),e.on(\"Carousel.removeSlide\",t.onRemoveSlide),e.on(\"close\",t.onClose)}detach(){const t=this,e=t.instance;e.off(\"Carousel.change\",t.onChange),e.off(\"Carousel.createSlide\",t.onCreateSlide),e.off(\"Carousel.removeSlide\",t.onRemoveSlide),e.off(\"close\",t.onClose)}}Object.defineProperty(wt,\"defaults\",{enumerable:!0,configurable:!0,writable:!0,value:{initialSize:\"fit\",Panzoom:{maxScale:1},protected:!1,zoom:!0,zoomOpacity:\"auto\"}}),\"function\"==typeof SuppressedError&&SuppressedError;const xt=\"html\",Et=\"image\",St=\"map\",Pt=\"youtube\",Ct=\"vimeo\",Tt=\"html5video\",Mt=(t,e={})=>{const i=new URL(t),n=new URLSearchParams(i.search),s=new URLSearchParams;for(const[t,i]of[...n,...Object.entries(e)]){let e=i+\"\";if(\"t\"===t){let t=e.match(/((\\d*)m)?(\\d*)s?/);t&&s.set(\"start\",60*parseInt(t[2]||\"0\")+parseInt(t[3]||\"0\")+\"\")}else s.set(t,e)}let o=s+\"\",a=t.match(/#t=((.*)?\\d+s)/);return a&&(o+=`#t=${a[1]}`),o},Ot={ajax:null,autoSize:!0,iframeAttr:{allow:\"autoplay; fullscreen\",scrolling:\"auto\"},preload:!0,videoAutoplay:!0,videoRatio:16/9,videoTpl:'<video class=\"fancybox__html5video\" playsinline controls controlsList=\"nodownload\" poster=\"{{poster}}\">\\n  <source src=\"{{src}}\" type=\"{{format}}\" />Sorry, your browser doesn\\'t support embedded videos.</video>',videoFormat:\"\",vimeo:{byline:1,color:\"00adef\",controls:1,dnt:1,muted:0},youtube:{controls:1,enablejsapi:1,nocookie:1,rel:0,fs:1}},At=[\"image\",\"html\",\"ajax\",\"inline\",\"clone\",\"iframe\",\"map\",\"pdf\",\"html5video\",\"youtube\",\"vimeo\"];class Lt extends _{onBeforeInitSlide(t,e,i){this.processType(i)}onCreateSlide(t,e,i){this.setContent(i)}onClearContent(t,e){e.xhr&&(e.xhr.abort(),e.xhr=null);const i=e.iframeEl;i&&(i.onload=i.onerror=null,i.src=\"//about:blank\",e.iframeEl=null);const n=e.contentEl,s=e.placeholderEl;if(\"inline\"===e.type&&n&&s)n.classList.remove(\"fancybox__content\"),\"none\"!==getComputedStyle(n).getPropertyValue(\"display\")&&(n.style.display=\"none\"),setTimeout((()=>{s&&(n&&s.parentNode&&s.parentNode.insertBefore(n,s),s.remove())}),0),e.contentEl=void 0,e.placeholderEl=void 0;else for(;e.el&&e.el.firstChild;)e.el.removeChild(e.el.firstChild)}onSelectSlide(t,e,i){i.state===lt.Ready&&this.playVideo()}onUnselectSlide(t,e,i){var n,s;if(i.type===Tt){try{null===(s=null===(n=i.el)||void 0===n?void 0:n.querySelector(\"video\"))||void 0===s||s.pause()}catch(t){}return}let o;i.type===Ct?o={method:\"pause\",value:\"true\"}:i.type===Pt&&(o={event:\"command\",func:\"pauseVideo\"}),o&&i.iframeEl&&i.iframeEl.contentWindow&&i.iframeEl.contentWindow.postMessage(JSON.stringify(o),\"*\"),i.poller&&clearTimeout(i.poller)}onDone(t,e){t.isCurrentSlide(e)&&!t.isClosing()&&this.playVideo()}onRefresh(t,e){e.slides.forEach((t=>{t.el&&(this.resizeIframe(t),this.setAspectRatio(t))}))}onMessage(t){try{let e=JSON.parse(t.data);if(\"https://player.vimeo.com\"===t.origin){if(\"ready\"===e.event)for(let e of Array.from(document.getElementsByClassName(\"fancybox__iframe\")))e instanceof HTMLIFrameElement&&e.contentWindow===t.source&&(e.dataset.ready=\"true\")}else if(t.origin.match(/^https:\\/\\/(www.)?youtube(-nocookie)?.com$/)&&\"onReady\"===e.event){const t=document.getElementById(e.id);t&&(t.dataset.ready=\"true\")}}catch(t){}}loadAjaxContent(t){const e=this.instance.optionFor(t,\"src\")||\"\";this.instance.showLoading(t);const i=this.instance,n=new XMLHttpRequest;i.showLoading(t),n.onreadystatechange=function(){n.readyState===XMLHttpRequest.DONE&&i.state===rt.Ready&&(i.hideLoading(t),200===n.status?i.setContent(t,n.responseText):i.setError(t,404===n.status?\"{{AJAX_NOT_FOUND}}\":\"{{AJAX_FORBIDDEN}}\"))};const s=t.ajax||null;n.open(s?\"POST\":\"GET\",e+\"\"),n.setRequestHeader(\"Content-Type\",\"application/x-www-form-urlencoded\"),n.setRequestHeader(\"X-Requested-With\",\"XMLHttpRequest\"),n.send(s),t.xhr=n}setInlineContent(t){let e=null;if(E(t.src))e=t.src;else if(\"string\"==typeof t.src){const i=t.src.split(\"#\",2).pop();e=i?document.getElementById(i):null}if(e){if(\"clone\"===t.type||e.closest(\".fancybox__slide\")){e=e.cloneNode(!0);const i=e.dataset.animationName;i&&(e.classList.remove(i),delete e.dataset.animationName);let n=e.getAttribute(\"id\");n=n?`${n}--clone`:`clone-${this.instance.id}-${t.index}`,e.setAttribute(\"id\",n)}else if(e.parentNode){const i=document.createElement(\"div\");i.classList.add(\"fancybox-placeholder\"),e.parentNode.insertBefore(i,e),t.placeholderEl=i}this.instance.setContent(t,e)}else this.instance.setError(t,\"{{ELEMENT_NOT_FOUND}}\")}setIframeContent(t){const{src:e,el:i}=t;if(!e||\"string\"!=typeof e||!i)return;i.classList.add(\"is-loading\");const n=this.instance,s=document.createElement(\"iframe\");s.className=\"fancybox__iframe\",s.setAttribute(\"id\",`fancybox__iframe_${n.id}_${t.index}`);for(const[e,i]of Object.entries(this.optionFor(t,\"iframeAttr\")||{}))s.setAttribute(e,i);s.onerror=()=>{n.setError(t,\"{{IFRAME_ERROR}}\")},t.iframeEl=s;const o=this.optionFor(t,\"preload\");if(\"iframe\"!==t.type||!1===o)return s.setAttribute(\"src\",t.src+\"\"),n.setContent(t,s,!1),this.resizeIframe(t),void n.revealContent(t);n.showLoading(t),s.onload=()=>{if(!s.src.length)return;const e=\"true\"!==s.dataset.ready;s.dataset.ready=\"true\",this.resizeIframe(t),e?n.revealContent(t):n.hideLoading(t)},s.setAttribute(\"src\",e),n.setContent(t,s,!1)}resizeIframe(t){const{type:e,iframeEl:i}=t;if(e===Pt||e===Ct)return;const n=null==i?void 0:i.parentElement;if(!i||!n)return;let s=t.autoSize;void 0===s&&(s=this.optionFor(t,\"autoSize\"));let o=t.width||0,a=t.height||0;o&&a&&(s=!1);const r=n&&n.style;if(!1!==t.preload&&!1!==s&&r)try{const t=window.getComputedStyle(n),e=parseFloat(t.paddingLeft)+parseFloat(t.paddingRight),s=parseFloat(t.paddingTop)+parseFloat(t.paddingBottom),l=i.contentWindow;if(l){const t=l.document,i=t.getElementsByTagName(xt)[0],n=t.body;r.width=\"\",n.style.overflow=\"hidden\",o=o||i.scrollWidth+e,r.width=`${o}px`,n.style.overflow=\"\",r.flex=\"0 0 auto\",r.height=`${n.scrollHeight}px`,a=i.scrollHeight+s}}catch(t){}if(o||a){const t={flex:\"0 1 auto\",width:\"\",height:\"\"};o&&\"auto\"!==o&&(t.width=`${o}px`),a&&\"auto\"!==a&&(t.height=`${a}px`),Object.assign(r,t)}}playVideo(){const t=this.instance.getSlide();if(!t)return;const{el:e}=t;if(!e||!e.offsetParent)return;if(!this.optionFor(t,\"videoAutoplay\"))return;if(t.type===Tt)try{const t=e.querySelector(\"video\");if(t){const e=t.play();void 0!==e&&e.then((()=>{})).catch((e=>{t.muted=!0,t.play()}))}}catch(t){}if(t.type!==Pt&&t.type!==Ct)return;const i=()=>{if(t.iframeEl&&t.iframeEl.contentWindow){let e;if(\"true\"===t.iframeEl.dataset.ready)return e=t.type===Pt?{event:\"command\",func:\"playVideo\"}:{method:\"play\",value:\"true\"},e&&t.iframeEl.contentWindow.postMessage(JSON.stringify(e),\"*\"),void(t.poller=void 0);t.type===Pt&&(e={event:\"listening\",id:t.iframeEl.getAttribute(\"id\")},t.iframeEl.contentWindow.postMessage(JSON.stringify(e),\"*\"))}t.poller=setTimeout(i,250)};i()}processType(t){if(t.html)return t.type=xt,t.src=t.html,void(t.html=\"\");const e=this.instance.optionFor(t,\"src\",\"\");if(!e||\"string\"!=typeof e)return;let i=t.type,n=null;if(n=e.match(/(youtube\\.com|youtu\\.be|youtube\\-nocookie\\.com)\\/(?:watch\\?(?:.*&)?v=|v\\/|u\\/|shorts\\/|embed\\/?)?(videoseries\\?list=(?:.*)|[\\w-]{11}|\\?listType=(?:.*)&list=(?:.*))(?:.*)/i)){const s=this.optionFor(t,Pt),{nocookie:o}=s,a=function(t,e){var i={};for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&e.indexOf(n)<0&&(i[n]=t[n]);if(null!=t&&\"function\"==typeof Object.getOwnPropertySymbols){var s=0;for(n=Object.getOwnPropertySymbols(t);s<n.length;s++)e.indexOf(n[s])<0&&Object.prototype.propertyIsEnumerable.call(t,n[s])&&(i[n[s]]=t[n[s]])}return i}(s,[\"nocookie\"]),r=`www.youtube${o?\"-nocookie\":\"\"}.com`,l=Mt(e,a),c=encodeURIComponent(n[2]);t.videoId=c,t.src=`https://${r}/embed/${c}?${l}`,t.thumbSrc=t.thumbSrc||`https://i.ytimg.com/vi/${c}/mqdefault.jpg`,i=Pt}else if(n=e.match(/^.+vimeo.com\\/(?:\\/)?([\\d]+)((\\/|\\?h=)([a-z0-9]+))?(.*)?/)){const s=Mt(e,this.optionFor(t,Ct)),o=encodeURIComponent(n[1]),a=n[4]||\"\";t.videoId=o,t.src=`https://player.vimeo.com/video/${o}?${a?`h=${a}${s?\"&\":\"\"}`:\"\"}${s}`,i=Ct}if(!i&&t.triggerEl){const e=t.triggerEl.dataset.type;At.includes(e)&&(i=e)}i||\"string\"==typeof e&&(\"#\"===e.charAt(0)?i=\"inline\":(n=e.match(/\\.(mp4|mov|ogv|webm)((\\?|#).*)?$/i))?(i=Tt,t.videoFormat=t.videoFormat||\"video/\"+(\"ogv\"===n[1]?\"ogg\":n[1])):e.match(/(^data:image\\/[a-z0-9+\\/=]*,)|(\\.(jp(e|g|eg)|gif|png|bmp|webp|svg|ico)((\\?|#).*)?$)/i)?i=Et:e.match(/\\.(pdf)((\\?|#).*)?$/i)&&(i=\"pdf\")),(n=e.match(/(?:maps\\.)?google\\.([a-z]{2,3}(?:\\.[a-z]{2})?)\\/(?:(?:(?:maps\\/(?:place\\/(?:.*)\\/)?\\@(.*),(\\d+.?\\d+?)z))|(?:\\?ll=))(.*)?/i))?(t.src=`https://maps.google.${n[1]}/?ll=${(n[2]?n[2]+\"&z=\"+Math.floor(parseFloat(n[3]))+(n[4]?n[4].replace(/^\\//,\"&\"):\"\"):n[4]+\"\").replace(/\\?/,\"&\")}&output=${n[4]&&n[4].indexOf(\"layer=c\")>0?\"svembed\":\"embed\"}`,i=St):(n=e.match(/(?:maps\\.)?google\\.([a-z]{2,3}(?:\\.[a-z]{2})?)\\/(?:maps\\/search\\/)(.*)/i))&&(t.src=`https://maps.google.${n[1]}/maps?q=${n[2].replace(\"query=\",\"q=\").replace(\"api=1\",\"\")}&output=embed`,i=St),i=i||this.instance.option(\"defaultType\"),t.type=i,i===Et&&(t.thumbSrc=t.thumbSrc||t.src)}setContent(t){const e=this.instance.optionFor(t,\"src\")||\"\";if(t&&t.type&&e){switch(t.type){case xt:this.instance.setContent(t,e);break;case Tt:const i=this.option(\"videoTpl\");i&&this.instance.setContent(t,i.replace(/\\{\\{src\\}\\}/gi,e+\"\").replace(/\\{\\{format\\}\\}/gi,this.optionFor(t,\"videoFormat\")||\"\").replace(/\\{\\{poster\\}\\}/gi,t.poster||t.thumbSrc||\"\"));break;case\"inline\":case\"clone\":this.setInlineContent(t);break;case\"ajax\":this.loadAjaxContent(t);break;case\"pdf\":case St:case Pt:case Ct:t.preload=!1;case\"iframe\":this.setIframeContent(t)}this.setAspectRatio(t)}}setAspectRatio(t){const e=t.contentEl;if(!(t.el&&e&&t.type&&[Pt,Ct,Tt].includes(t.type)))return;let i,n=t.width||\"auto\",s=t.height||\"auto\";if(\"auto\"===n||\"auto\"===s){i=this.optionFor(t,\"videoRatio\");const e=(i+\"\").match(/(\\d+)\\s*\\/\\s?(\\d+)/);i=e&&e.length>2?parseFloat(e[1])/parseFloat(e[2]):parseFloat(i+\"\")}else n&&s&&(i=n/s);if(!i)return;e.style.aspectRatio=\"\",e.style.width=\"\",e.style.height=\"\",e.offsetHeight;const o=e.getBoundingClientRect(),a=o.width||1,r=o.height||1;e.style.aspectRatio=i+\"\",i<a/r?(s=\"auto\"===s?r:Math.min(r,s),e.style.width=\"auto\",e.style.height=`${s}px`):(n=\"auto\"===n?a:Math.min(a,n),e.style.width=`${n}px`,e.style.height=\"auto\")}attach(){const t=this,e=t.instance;e.on(\"Carousel.beforeInitSlide\",t.onBeforeInitSlide),e.on(\"Carousel.createSlide\",t.onCreateSlide),e.on(\"Carousel.selectSlide\",t.onSelectSlide),e.on(\"Carousel.unselectSlide\",t.onUnselectSlide),e.on(\"Carousel.Panzoom.refresh\",t.onRefresh),e.on(\"done\",t.onDone),e.on(\"clearContent\",t.onClearContent),window.addEventListener(\"message\",t.onMessage)}detach(){const t=this,e=t.instance;e.off(\"Carousel.beforeInitSlide\",t.onBeforeInitSlide),e.off(\"Carousel.createSlide\",t.onCreateSlide),e.off(\"Carousel.selectSlide\",t.onSelectSlide),e.off(\"Carousel.unselectSlide\",t.onUnselectSlide),e.off(\"Carousel.Panzoom.refresh\",t.onRefresh),e.off(\"done\",t.onDone),e.off(\"clearContent\",t.onClearContent),window.removeEventListener(\"message\",t.onMessage)}}Object.defineProperty(Lt,\"defaults\",{enumerable:!0,configurable:!0,writable:!0,value:Ot});const zt=\"play\",Rt=\"pause\",kt=\"ready\";class It extends _{constructor(){super(...arguments),Object.defineProperty(this,\"state\",{enumerable:!0,configurable:!0,writable:!0,value:kt}),Object.defineProperty(this,\"inHover\",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,\"timer\",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,\"progressBar\",{enumerable:!0,configurable:!0,writable:!0,value:null})}get isActive(){return this.state!==kt}onReady(t){this.option(\"autoStart\")&&(t.isInfinite||t.page<t.pages.length-1)&&this.start()}onChange(){this.removeProgressBar(),this.pause()}onSettle(){this.resume()}onVisibilityChange(){\"visible\"===document.visibilityState?this.resume():this.pause()}onMouseEnter(){this.inHover=!0,this.pause()}onMouseLeave(){var t;this.inHover=!1,(null===(t=this.instance.panzoom)||void 0===t?void 0:t.isResting)&&this.resume()}onTimerEnd(){const t=this.instance;\"play\"===this.state&&(t.isInfinite||t.page!==t.pages.length-1?t.slideNext():t.slideTo(0))}removeProgressBar(){this.progressBar&&(this.progressBar.remove(),this.progressBar=null)}createProgressBar(){var t;if(!this.option(\"showProgress\"))return null;this.removeProgressBar();const e=this.instance,i=(null===(t=e.pages[e.page])||void 0===t?void 0:t.slides)||[];let n=this.option(\"progressParentEl\");if(n||(n=(1===i.length?i[0].el:null)||e.viewport),!n)return null;const s=document.createElement(\"div\");return P(s,\"f-progress\"),n.prepend(s),this.progressBar=s,s.offsetHeight,s}set(){const t=this,e=t.instance;if(e.pages.length<2)return;if(t.timer)return;const i=t.option(\"timeout\");t.state=zt,P(e.container,\"has-autoplay\");let n=t.createProgressBar();n&&(n.style.transitionDuration=`${i}ms`,n.style.transform=\"scaleX(1)\"),t.timer=setTimeout((()=>{t.timer=null,t.inHover||t.onTimerEnd()}),i),t.emit(\"set\")}clear(){const t=this;t.timer&&(clearTimeout(t.timer),t.timer=null),t.removeProgressBar()}start(){const t=this;if(t.set(),t.state!==kt){if(t.option(\"pauseOnHover\")){const e=t.instance.container;e.addEventListener(\"mouseenter\",t.onMouseEnter,!1),e.addEventListener(\"mouseleave\",t.onMouseLeave,!1)}document.addEventListener(\"visibilitychange\",t.onVisibilityChange,!1),t.emit(\"start\")}}stop(){const t=this,e=t.state,i=t.instance.container;t.clear(),t.state=kt,i.removeEventListener(\"mouseenter\",t.onMouseEnter,!1),i.removeEventListener(\"mouseleave\",t.onMouseLeave,!1),document.removeEventListener(\"visibilitychange\",t.onVisibilityChange,!1),S(i,\"has-autoplay\"),e!==kt&&t.emit(\"stop\")}pause(){const t=this;t.state===zt&&(t.state=Rt,t.clear(),t.emit(Rt))}resume(){const t=this,e=t.instance;if(e.isInfinite||e.page!==e.pages.length-1)if(t.state!==zt){if(t.state===Rt&&!t.inHover){const e=new Event(\"resume\",{bubbles:!0,cancelable:!0});t.emit(\"resume\",e),e.defaultPrevented||t.set()}}else t.set();else t.stop()}toggle(){this.state===zt||this.state===Rt?this.stop():this.start()}attach(){const t=this,e=t.instance;e.on(\"ready\",t.onReady),e.on(\"Panzoom.startAnimation\",t.onChange),e.on(\"Panzoom.endAnimation\",t.onSettle),e.on(\"Panzoom.touchMove\",t.onChange)}detach(){const t=this,e=t.instance;e.off(\"ready\",t.onReady),e.off(\"Panzoom.startAnimation\",t.onChange),e.off(\"Panzoom.endAnimation\",t.onSettle),e.off(\"Panzoom.touchMove\",t.onChange),t.stop()}}Object.defineProperty(It,\"defaults\",{enumerable:!0,configurable:!0,writable:!0,value:{autoStart:!0,pauseOnHover:!0,progressParentEl:null,showProgress:!0,timeout:3e3}});class Dt extends _{constructor(){super(...arguments),Object.defineProperty(this,\"ref\",{enumerable:!0,configurable:!0,writable:!0,value:null})}onPrepare(t){const e=t.carousel;if(!e)return;const i=t.container;i&&(e.options.Autoplay=u({autoStart:!1},this.option(\"Autoplay\")||{},{pauseOnHover:!1,timeout:this.option(\"timeout\"),progressParentEl:()=>this.option(\"progressParentEl\")||null,on:{start:()=>{t.emit(\"startSlideshow\")},set:e=>{var n;i.classList.add(\"has-slideshow\"),(null===(n=t.getSlide())||void 0===n?void 0:n.state)!==lt.Ready&&e.pause()},stop:()=>{i.classList.remove(\"has-slideshow\"),t.isCompact||t.endIdle(),t.emit(\"endSlideshow\")},resume:(e,i)=>{var n,s,o;!i||!i.cancelable||(null===(n=t.getSlide())||void 0===n?void 0:n.state)===lt.Ready&&(null===(o=null===(s=t.carousel)||void 0===s?void 0:s.panzoom)||void 0===o?void 0:o.isResting)||i.preventDefault()}}}),e.attachPlugins({Autoplay:It}),this.ref=e.plugins.Autoplay)}onReady(t){const e=t.carousel,i=this.ref;i&&e&&this.option(\"playOnStart\")&&(e.isInfinite||e.page<e.pages.length-1)&&i.start()}onDone(t,e){const i=this.ref,n=t.carousel;if(!i||!n)return;const s=e.panzoom;s&&s.on(\"startAnimation\",(()=>{t.isCurrentSlide(e)&&i.stop()})),t.isCurrentSlide(e)&&i.resume()}onKeydown(t,e){var i;const n=this.ref;n&&e===this.option(\"key\")&&\"BUTTON\"!==(null===(i=document.activeElement)||void 0===i?void 0:i.nodeName)&&n.toggle()}attach(){const t=this,e=t.instance;e.on(\"Carousel.init\",t.onPrepare),e.on(\"Carousel.ready\",t.onReady),e.on(\"done\",t.onDone),e.on(\"keydown\",t.onKeydown)}detach(){const t=this,e=t.instance;e.off(\"Carousel.init\",t.onPrepare),e.off(\"Carousel.ready\",t.onReady),e.off(\"done\",t.onDone),e.off(\"keydown\",t.onKeydown)}}Object.defineProperty(Dt,\"defaults\",{enumerable:!0,configurable:!0,writable:!0,value:{key:\" \",playOnStart:!1,progressParentEl:t=>{var e;return(null===(e=t.instance.container)||void 0===e?void 0:e.querySelector(\".fancybox__toolbar [data-fancybox-toggle-slideshow]\"))||t.instance.container},timeout:3e3}});const Ft={classes:{container:\"f-thumbs f-carousel__thumbs\",viewport:\"f-thumbs__viewport\",track:\"f-thumbs__track\",slide:\"f-thumbs__slide\",isResting:\"is-resting\",isSelected:\"is-selected\",isLoading:\"is-loading\",hasThumbs:\"has-thumbs\"},minCount:2,parentEl:null,thumbTpl:'<button class=\"f-thumbs__slide__button\" tabindex=\"0\" type=\"button\" aria-label=\"{{GOTO}}\" data-carousel-index=\"%i\"><img class=\"f-thumbs__slide__img\" data-lazy-src=\"{{%s}}\" alt=\"\" /></button>',type:\"modern\"};var jt;!function(t){t[t.Init=0]=\"Init\",t[t.Ready=1]=\"Ready\",t[t.Hidden=2]=\"Hidden\"}(jt||(jt={}));const Bt=\"isResting\",Ht=\"thumbWidth\",Nt=\"thumbHeight\",_t=\"thumbClipWidth\";let $t=class extends _{constructor(){super(...arguments),Object.defineProperty(this,\"type\",{enumerable:!0,configurable:!0,writable:!0,value:\"modern\"}),Object.defineProperty(this,\"container\",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,\"track\",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,\"carousel\",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,\"thumbWidth\",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,\"thumbClipWidth\",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,\"thumbHeight\",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,\"thumbGap\",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,\"thumbExtraGap\",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,\"state\",{enumerable:!0,configurable:!0,writable:!0,value:jt.Init})}get isModern(){return\"modern\"===this.type}onInitSlide(t,e){const i=e.el?e.el.dataset:void 0;i&&(e.thumbSrc=i.thumbSrc||e.thumbSrc||\"\",e[_t]=parseFloat(i[_t]||\"\")||e[_t]||0,e[Nt]=parseFloat(i.thumbHeight||\"\")||e[Nt]||0),this.addSlide(e)}onInitSlides(){this.build()}onChange(){var t;if(!this.isModern)return;const e=this.container,i=this.instance,n=i.panzoom,s=this.carousel,a=s?s.panzoom:null,r=i.page;if(n&&s&&a){if(n.isDragging){S(e,this.cn(Bt));let n=(null===(t=s.pages[r])||void 0===t?void 0:t.pos)||0;n+=i.getProgress(r)*(this[_t]+this.thumbGap);let o=a.getBounds();-1*n>o.x.min&&-1*n<o.x.max&&a.panTo({x:-1*n,friction:.12})}else o(e,this.cn(Bt),n.isResting);this.shiftModern()}}onRefresh(){this.updateProps();for(const t of this.instance.slides||[])this.resizeModernSlide(t);this.shiftModern()}isDisabled(){const t=this.option(\"minCount\")||0;if(t){const e=this.instance;let i=0;for(const t of e.slides||[])t.thumbSrc&&i++;if(i<t)return!0}const e=this.option(\"type\");return[\"modern\",\"classic\"].indexOf(e)<0}getThumb(t){const e=this.option(\"thumbTpl\")||\"\";return{html:this.instance.localize(e,[[\"%i\",t.index],[\"%d\",t.index+1],[\"%s\",t.thumbSrc||\"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\"]])}}addSlide(t){const e=this.carousel;e&&e.addSlide(t.index,this.getThumb(t))}getSlides(){const t=[];for(const e of this.instance.slides||[])t.push(this.getThumb(e));return t}resizeModernSlide(t){this.isModern&&(t[Ht]=t[_t]&&t[Nt]?Math.round(this[Nt]*(t[_t]/t[Nt])):this[Ht])}updateProps(){const t=this.container;if(!t)return;const e=e=>parseFloat(getComputedStyle(t).getPropertyValue(\"--f-thumb-\"+e))||0;this.thumbGap=e(\"gap\"),this.thumbExtraGap=e(\"extra-gap\"),this[Ht]=e(\"width\")||40,this[_t]=e(\"clip-width\")||40,this[Nt]=e(\"height\")||40}build(){const t=this;if(t.state!==jt.Init)return;if(t.isDisabled())return void t.emit(\"disabled\");const e=t.instance,i=e.container,n=t.getSlides(),s=t.option(\"type\");t.type=s;const o=t.option(\"parentEl\"),a=t.cn(\"container\"),r=t.cn(\"track\");let l=null==o?void 0:o.querySelector(\".\"+a);l||(l=document.createElement(\"div\"),P(l,a),o?o.appendChild(l):i.after(l)),P(l,`is-${s}`),P(i,t.cn(\"hasThumbs\")),t.container=l,t.updateProps();let c=l.querySelector(\".\"+r);c||(c=document.createElement(\"div\"),P(c,t.cn(\"track\")),l.appendChild(c)),t.track=c;const h=u({},{track:c,infinite:!1,center:!0,fill:\"classic\"===s,dragFree:!0,slidesPerPage:1,transition:!1,preload:.25,friction:.12,Panzoom:{maxVelocity:0},Dots:!1,Navigation:!1,classes:{container:\"f-thumbs\",viewport:\"f-thumbs__viewport\",track:\"f-thumbs__track\",slide:\"f-thumbs__slide\"}},t.option(\"Carousel\")||{},{Sync:{target:e},slides:n}),d=new e.constructor(l,h);d.on(\"createSlide\",((e,i)=>{t.setProps(i.index),t.emit(\"createSlide\",i,i.el)})),d.on(\"ready\",(()=>{t.shiftModern(),t.emit(\"ready\")})),d.on(\"refresh\",(()=>{t.shiftModern()})),d.on(\"Panzoom.click\",((e,i,n)=>{t.onClick(n)})),t.carousel=d,t.state=jt.Ready}onClick(t){t.preventDefault(),t.stopPropagation();const e=this.instance,{pages:i,page:n}=e,s=t=>{if(t){const e=t.closest(\"[data-carousel-index]\");if(e)return[parseInt(e.dataset.carouselIndex||\"\",10)||0,e]}return[-1,void 0]},o=(t,e)=>{const i=document.elementFromPoint(t,e);return i?s(i):[-1,void 0]};let[a,r]=s(t.target);if(a>-1)return;const l=this[_t],c=t.clientX,h=t.clientY;let[d,u]=o(c-l,h),[p,f]=o(c+l,h);u&&f?(a=Math.abs(c-u.getBoundingClientRect().right)<Math.abs(c-f.getBoundingClientRect().left)?d:p,a===n&&(a=a===d?p:d)):u?a=d:f&&(a=p),a>-1&&i[a]&&e.slideTo(a)}getShift(t){var e;const i=this,{instance:n}=i,s=i.carousel;if(!n||!s)return 0;const o=i[Ht],a=i[_t],r=i.thumbGap,l=i.thumbExtraGap;if(!(null===(e=s.slides[t])||void 0===e?void 0:e.el))return 0;const c=.5*(o-a),h=n.pages.length-1;let d=n.getProgress(0),u=n.getProgress(h),p=n.getProgress(t,!1,!0),f=0,g=c+l+r;const m=d<0&&d>-1,v=u>0&&u<1;return 0===t?(f=g*Math.abs(d),v&&1===d&&(f-=g*Math.abs(u))):t===h?(f=g*Math.abs(u)*-1,m&&-1===u&&(f+=g*Math.abs(d))):m||v?(f=-1*g,f+=g*Math.abs(d),f+=g*(1-Math.abs(u))):f=g*p,f}setProps(e){var i;const n=this;if(!n.isModern)return;const{instance:s}=n,o=n.carousel;if(s&&o){const a=null===(i=o.slides[e])||void 0===i?void 0:i.el;if(a&&a.childNodes.length){let i=t(1-Math.abs(s.getProgress(e))),o=t(n.getShift(e));a.style.setProperty(\"--progress\",i?i+\"\":\"\"),a.style.setProperty(\"--shift\",o+\"\")}}}shiftModern(){const t=this;if(!t.isModern)return;const{instance:e,track:i}=t,n=e.panzoom,s=t.carousel;if(!(e&&i&&n&&s))return;if(n.state===m.Init||n.state===m.Destroy)return;for(const i of e.slides)t.setProps(i.index);let o=(t[_t]+t.thumbGap)*(s.slides.length||0);i.style.setProperty(\"--width\",o+\"\")}cleanup(){const t=this;t.carousel&&t.carousel.destroy(),t.carousel=null,t.container&&t.container.remove(),t.container=null,t.track&&t.track.remove(),t.track=null,t.state=jt.Init,S(t.instance.container,t.cn(\"hasThumbs\"))}attach(){const t=this,e=t.instance;e.on(\"initSlide\",t.onInitSlide),e.state===B.Init?e.on(\"initSlides\",t.onInitSlides):t.onInitSlides(),e.on([\"change\",\"Panzoom.afterTransform\"],t.onChange),e.on(\"Panzoom.refresh\",t.onRefresh)}detach(){const t=this,e=t.instance;e.off(\"initSlide\",t.onInitSlide),e.off(\"initSlides\",t.onInitSlides),e.off([\"change\",\"Panzoom.afterTransform\"],t.onChange),e.off(\"Panzoom.refresh\",t.onRefresh),t.cleanup()}};Object.defineProperty($t,\"defaults\",{enumerable:!0,configurable:!0,writable:!0,value:Ft});const Wt=Object.assign(Object.assign({},Ft),{key:\"t\",showOnStart:!0,parentEl:null}),Xt=\"is-masked\",qt=\"aria-hidden\";class Yt extends _{constructor(){super(...arguments),Object.defineProperty(this,\"ref\",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,\"hidden\",{enumerable:!0,configurable:!0,writable:!0,value:!1})}get isEnabled(){const t=this.ref;return t&&!t.isDisabled()}get isHidden(){return this.hidden}onClick(t,e){e.stopPropagation()}onCreateSlide(t,e){var i,n,s;const o=(null===(s=null===(n=null===(i=this.instance)||void 0===i?void 0:i.carousel)||void 0===n?void 0:n.slides[e.index])||void 0===s?void 0:s.type)||\"\",a=e.el;if(a&&o){let t=`for-${o}`;[\"video\",\"youtube\",\"vimeo\",\"html5video\"].includes(o)&&(t+=\" for-video\"),P(a,t)}}onInit(){var t;const e=this,i=e.instance,n=i.carousel;if(e.ref||!n)return;const s=e.option(\"parentEl\")||i.footer||i.container;if(!s)return;const o=u({},e.options,{parentEl:s,classes:{container:\"f-thumbs fancybox__thumbs\"},Carousel:{Sync:{friction:i.option(\"Carousel.friction\")||0}},on:{ready:t=>{const i=t.container;i&&this.hidden&&(e.refresh(),i.style.transition=\"none\",e.hide(),i.offsetHeight,queueMicrotask((()=>{i.style.transition=\"\",e.show()})))}}});o.Carousel=o.Carousel||{},o.Carousel.on=u((null===(t=e.options.Carousel)||void 0===t?void 0:t.on)||{},{click:this.onClick,createSlide:this.onCreateSlide}),n.options.Thumbs=o,n.attachPlugins({Thumbs:$t}),e.ref=n.plugins.Thumbs,e.option(\"showOnStart\")||(e.ref.state=jt.Hidden,e.hidden=!0)}onResize(){var t;const e=null===(t=this.ref)||void 0===t?void 0:t.container;e&&(e.style.maxHeight=\"\")}onKeydown(t,e){const i=this.option(\"key\");i&&i===e&&this.toggle()}toggle(){const t=this.ref;if(t&&!t.isDisabled())return t.state===jt.Hidden?(t.state=jt.Init,void t.build()):void(this.hidden?this.show():this.hide())}show(){const t=this.ref;if(!t||t.isDisabled())return;const e=t.container;e&&(this.refresh(),e.offsetHeight,e.removeAttribute(qt),e.classList.remove(Xt),this.hidden=!1)}hide(){const t=this.ref,e=t&&t.container;e&&(this.refresh(),e.offsetHeight,e.classList.add(Xt),e.setAttribute(qt,\"true\")),this.hidden=!0}refresh(){const t=this.ref;if(!t||!t.state)return;const e=t.container,i=(null==e?void 0:e.firstChild)||null;e&&i&&i.childNodes.length&&(e.style.maxHeight=`${i.getBoundingClientRect().height}px`)}attach(){const t=this,e=t.instance;e.state===rt.Init?e.on(\"Carousel.init\",t.onInit):t.onInit(),e.on(\"resize\",t.onResize),e.on(\"keydown\",t.onKeydown)}detach(){var t;const e=this,i=e.instance;i.off(\"Carousel.init\",e.onInit),i.off(\"resize\",e.onResize),i.off(\"keydown\",e.onKeydown),null===(t=i.carousel)||void 0===t||t.detachPlugins([\"Thumbs\"]),e.ref=null}}Object.defineProperty(Yt,\"defaults\",{enumerable:!0,configurable:!0,writable:!0,value:Wt});const Vt={panLeft:{icon:'<svg><path d=\"M5 12h14M5 12l6 6M5 12l6-6\"/></svg>',change:{panX:-100}},panRight:{icon:'<svg><path d=\"M5 12h14M13 18l6-6M13 6l6 6\"/></svg>',change:{panX:100}},panUp:{icon:'<svg><path d=\"M12 5v14M18 11l-6-6M6 11l6-6\"/></svg>',change:{panY:-100}},panDown:{icon:'<svg><path d=\"M12 5v14M18 13l-6 6M6 13l6 6\"/></svg>',change:{panY:100}},zoomIn:{icon:'<svg><circle cx=\"11\" cy=\"11\" r=\"7.5\"/><path d=\"m21 21-4.35-4.35M11 8v6M8 11h6\"/></svg>',action:\"zoomIn\"},zoomOut:{icon:'<svg><circle cx=\"11\" cy=\"11\" r=\"7.5\"/><path d=\"m21 21-4.35-4.35M8 11h6\"/></svg>',action:\"zoomOut\"},toggle1to1:{icon:'<svg><path d=\"M3.51 3.07c5.74.02 11.48-.02 17.22.02 1.37.1 2.34 1.64 2.18 3.13 0 4.08.02 8.16 0 12.23-.1 1.54-1.47 2.64-2.79 2.46-5.61-.01-11.24.02-16.86-.01-1.36-.12-2.33-1.65-2.17-3.14 0-4.07-.02-8.16 0-12.23.1-1.36 1.22-2.48 2.42-2.46Z\"/><path d=\"M5.65 8.54h1.49v6.92m8.94-6.92h1.49v6.92M11.5 9.4v.02m0 5.18v0\"/></svg>',action:\"toggleZoom\"},toggleZoom:{icon:'<svg><g><line x1=\"11\" y1=\"8\" x2=\"11\" y2=\"14\"></line></g><circle cx=\"11\" cy=\"11\" r=\"7.5\"/><path d=\"m21 21-4.35-4.35M8 11h6\"/></svg>',action:\"toggleZoom\"},iterateZoom:{icon:'<svg><g><line x1=\"11\" y1=\"8\" x2=\"11\" y2=\"14\"></line></g><circle cx=\"11\" cy=\"11\" r=\"7.5\"/><path d=\"m21 21-4.35-4.35M8 11h6\"/></svg>',action:\"iterateZoom\"},rotateCCW:{icon:'<svg><path d=\"M15 4.55a8 8 0 0 0-6 14.9M9 15v5H4M18.37 7.16v.01M13 19.94v.01M16.84 18.37v.01M19.37 15.1v.01M19.94 11v.01\"/></svg>',action:\"rotateCCW\"},rotateCW:{icon:'<svg><path d=\"M9 4.55a8 8 0 0 1 6 14.9M15 15v5h5M5.63 7.16v.01M4.06 11v.01M4.63 15.1v.01M7.16 18.37v.01M11 19.94v.01\"/></svg>',action:\"rotateCW\"},flipX:{icon:'<svg style=\"stroke-width: 1.3\"><path d=\"M12 3v18M16 7v10h5L16 7M8 7v10H3L8 7\"/></svg>',action:\"flipX\"},flipY:{icon:'<svg style=\"stroke-width: 1.3\"><path d=\"M3 12h18M7 16h10L7 21v-5M7 8h10L7 3v5\"/></svg>',action:\"flipY\"},fitX:{icon:'<svg><path d=\"M4 12V6a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2v6M10 18H3M21 18h-7M6 15l-3 3 3 3M18 15l3 3-3 3\"/></svg>',action:\"fitX\"},fitY:{icon:'<svg><path d=\"M12 20H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h6M18 14v7M18 3v7M15 18l3 3 3-3M15 6l3-3 3 3\"/></svg>',action:\"fitY\"},reset:{icon:'<svg><path d=\"M20 11A8.1 8.1 0 0 0 4.5 9M4 5v4h4M4 13a8.1 8.1 0 0 0 15.5 2m.5 4v-4h-4\"/></svg>',action:\"reset\"},toggleFS:{icon:'<svg><g><path d=\"M14.5 9.5 21 3m0 0h-6m6 0v6M3 21l6.5-6.5M3 21v-6m0 6h6\"/></g><g><path d=\"m14 10 7-7m-7 7h6m-6 0V4M3 21l7-7m0 0v6m0-6H4\"/></g></svg>',action:\"toggleFS\"}};var Zt;!function(t){t[t.Init=0]=\"Init\",t[t.Ready=1]=\"Ready\",t[t.Disabled=2]=\"Disabled\"}(Zt||(Zt={}));const Ut={absolute:\"auto\",display:{left:[\"infobar\"],middle:[],right:[\"iterateZoom\",\"slideshow\",\"fullscreen\",\"thumbs\",\"close\"]},enabled:\"auto\",items:{infobar:{tpl:'<div class=\"fancybox__infobar\" tabindex=\"-1\"><span data-fancybox-current-index></span>/<span data-fancybox-count></span></div>'},download:{tpl:'<a class=\"f-button\" title=\"{{DOWNLOAD}}\" data-fancybox-download href=\"javasript:;\"><svg><path d=\"M4 17v2a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-2M7 11l5 5 5-5M12 4v12\"/></svg></a>'},prev:{tpl:'<button class=\"f-button\" title=\"{{PREV}}\" data-fancybox-prev><svg><path d=\"m15 6-6 6 6 6\"/></svg></button>'},next:{tpl:'<button class=\"f-button\" title=\"{{NEXT}}\" data-fancybox-next><svg><path d=\"m9 6 6 6-6 6\"/></svg></button>'},slideshow:{tpl:'<button class=\"f-button\" title=\"{{TOGGLE_SLIDESHOW}}\" data-fancybox-toggle-slideshow><svg><g><path d=\"M8 4v16l13 -8z\"></path></g><g><path d=\"M8 4v15M17 4v15\"/></g></svg></button>'},fullscreen:{tpl:'<button class=\"f-button\" title=\"{{TOGGLE_FULLSCREEN}}\" data-fancybox-toggle-fullscreen><svg><g><path d=\"M4 8V6a2 2 0 0 1 2-2h2M4 16v2a2 2 0 0 0 2 2h2M16 4h2a2 2 0 0 1 2 2v2M16 20h2a2 2 0 0 0 2-2v-2\"/></g><g><path d=\"M15 19v-2a2 2 0 0 1 2-2h2M15 5v2a2 2 0 0 0 2 2h2M5 15h2a2 2 0 0 1 2 2v2M5 9h2a2 2 0 0 0 2-2V5\"/></g></svg></button>'},thumbs:{tpl:'<button class=\"f-button\" title=\"{{TOGGLE_THUMBS}}\" data-fancybox-toggle-thumbs><svg><circle cx=\"5.5\" cy=\"5.5\" r=\"1\"/><circle cx=\"12\" cy=\"5.5\" r=\"1\"/><circle cx=\"18.5\" cy=\"5.5\" r=\"1\"/><circle cx=\"5.5\" cy=\"12\" r=\"1\"/><circle cx=\"12\" cy=\"12\" r=\"1\"/><circle cx=\"18.5\" cy=\"12\" r=\"1\"/><circle cx=\"5.5\" cy=\"18.5\" r=\"1\"/><circle cx=\"12\" cy=\"18.5\" r=\"1\"/><circle cx=\"18.5\" cy=\"18.5\" r=\"1\"/></svg></button>'},close:{tpl:'<button class=\"f-button\" title=\"{{CLOSE}}\" data-fancybox-close><svg><path d=\"m19.5 4.5-15 15M4.5 4.5l15 15\"/></svg></button>'}},parentEl:null},Gt={tabindex:\"-1\",width:\"24\",height:\"24\",viewBox:\"0 0 24 24\",xmlns:\"http://www.w3.org/2000/svg\"},Kt=\"has-toolbar\",Jt=\"fancybox__toolbar\";class Qt extends _{constructor(){super(...arguments),Object.defineProperty(this,\"state\",{enumerable:!0,configurable:!0,writable:!0,value:Zt.Init}),Object.defineProperty(this,\"container\",{enumerable:!0,configurable:!0,writable:!0,value:null})}onReady(t){var e;if(!t.carousel)return;let i=this.option(\"display\"),n=this.option(\"absolute\"),s=this.option(\"enabled\");if(\"auto\"===s){const t=this.instance.carousel;let e=0;if(t)for(const i of t.slides)(i.panzoom||\"image\"===i.type)&&e++;e||(s=!1)}s||(i=void 0);let o=0;const a={left:[],middle:[],right:[]};if(i)for(const t of[\"left\",\"middle\",\"right\"])for(const n of i[t]){const i=this.createEl(n);i&&(null===(e=a[t])||void 0===e||e.push(i),o++)}let r=null;if(o&&(r=this.createContainer()),r){for(const[t,e]of Object.entries(a)){const i=document.createElement(\"div\");P(i,Jt+\"__column is-\"+t);for(const t of e)i.appendChild(t);\"auto\"!==n||\"middle\"!==t||e.length||(n=!0),r.appendChild(i)}!0===n&&P(r,\"is-absolute\"),this.state=Zt.Ready,this.onRefresh()}else this.state=Zt.Disabled}onClick(t){var e,i;const n=this.instance,s=n.getSlide(),o=null==s?void 0:s.panzoom,a=t.target,r=a&&E(a)?a.dataset:null;if(!r)return;if(void 0!==r.fancyboxToggleThumbs)return t.preventDefault(),t.stopPropagation(),void(null===(e=n.plugins.Thumbs)||void 0===e||e.toggle());if(void 0!==r.fancyboxToggleFullscreen)return t.preventDefault(),t.stopPropagation(),void this.instance.toggleFullscreen();if(void 0!==r.fancyboxToggleSlideshow){t.preventDefault(),t.stopPropagation();const e=null===(i=n.carousel)||void 0===i?void 0:i.plugins.Autoplay;let s=e.isActive;return o&&\"mousemove\"===o.panMode&&!s&&o.reset(),void(s?e.stop():e.start())}const l=r.panzoomAction,c=r.panzoomChange;if((c||l)&&(t.preventDefault(),t.stopPropagation()),c){let t={};try{t=JSON.parse(c)}catch(t){}o&&o.applyChange(t)}else l&&o&&o[l]&&o[l]()}onChange(){this.onRefresh()}onRefresh(){if(this.instance.isClosing())return;const t=this.container;if(!t)return;const e=this.instance.getSlide();if(!e||e.state!==lt.Ready)return;const i=e&&!e.error&&e.panzoom;for(const e of t.querySelectorAll(\"[data-panzoom-action]\"))i?(e.removeAttribute(\"disabled\"),e.removeAttribute(\"tabindex\")):(e.setAttribute(\"disabled\",\"\"),e.setAttribute(\"tabindex\",\"-1\"));let n=i&&i.canZoomIn(),s=i&&i.canZoomOut();for(const e of t.querySelectorAll('[data-panzoom-action=\"zoomIn\"]'))n?(e.removeAttribute(\"disabled\"),e.removeAttribute(\"tabindex\")):(e.setAttribute(\"disabled\",\"\"),e.setAttribute(\"tabindex\",\"-1\"));for(const e of t.querySelectorAll('[data-panzoom-action=\"zoomOut\"]'))s?(e.removeAttribute(\"disabled\"),e.removeAttribute(\"tabindex\")):(e.setAttribute(\"disabled\",\"\"),e.setAttribute(\"tabindex\",\"-1\"));for(const e of t.querySelectorAll('[data-panzoom-action=\"toggleZoom\"],[data-panzoom-action=\"iterateZoom\"]')){s||n?(e.removeAttribute(\"disabled\"),e.removeAttribute(\"tabindex\")):(e.setAttribute(\"disabled\",\"\"),e.setAttribute(\"tabindex\",\"-1\"));const t=e.querySelector(\"g\");t&&(t.style.display=n?\"\":\"none\")}}onDone(t,e){var i;null===(i=e.panzoom)||void 0===i||i.on(\"afterTransform\",(()=>{this.instance.isCurrentSlide(e)&&this.onRefresh()})),this.instance.isCurrentSlide(e)&&this.onRefresh()}createContainer(){const t=this.instance.container;if(!t)return null;const e=this.option(\"parentEl\")||t;let i=e.querySelector(\".\"+Jt);return i||(i=document.createElement(\"div\"),P(i,Jt),e.prepend(i)),i.addEventListener(\"click\",this.onClick,{passive:!1,capture:!0}),t&&P(t,Kt),this.container=i,i}createEl(t){const e=this.instance,i=e.carousel;if(!i)return null;if(\"toggleFS\"===t)return null;if(\"fullscreen\"===t&&!ot())return null;let s=null;const o=i.slides.length||0;let a=0,r=0;for(const t of i.slides)(t.panzoom||\"image\"===t.type)&&a++,(\"image\"===t.type||t.downloadSrc)&&r++;if(o<2&&[\"infobar\",\"prev\",\"next\"].includes(t))return s;if(void 0!==Vt[t]&&!a)return null;if(\"download\"===t&&!r)return null;if(\"thumbs\"===t){const t=e.plugins.Thumbs;if(!t||!t.isEnabled)return null}if(\"slideshow\"===t){if(!i.plugins.Autoplay||o<2)return null}if(void 0!==Vt[t]){const e=Vt[t];s=document.createElement(\"button\"),s.setAttribute(\"title\",this.instance.localize(`{{${t.toUpperCase()}}}`)),P(s,\"f-button\"),e.action&&(s.dataset.panzoomAction=e.action),e.change&&(s.dataset.panzoomChange=JSON.stringify(e.change)),s.appendChild(n(this.instance.localize(e.icon)))}else{const e=(this.option(\"items\")||[])[t];e&&(s=n(this.instance.localize(e.tpl)),\"function\"==typeof e.click&&s.addEventListener(\"click\",(t=>{t.preventDefault(),t.stopPropagation(),\"function\"==typeof e.click&&e.click.call(this,this,t)})))}const l=null==s?void 0:s.querySelector(\"svg\");if(l)for(const[t,e]of Object.entries(Gt))l.getAttribute(t)||l.setAttribute(t,String(e));return s}removeContainer(){const t=this.container;t&&t.remove(),this.container=null,this.state=Zt.Disabled;const e=this.instance.container;e&&S(e,Kt)}attach(){const t=this,e=t.instance;e.on(\"Carousel.initSlides\",t.onReady),e.on(\"done\",t.onDone),e.on([\"reveal\",\"Carousel.change\"],t.onChange),t.onReady(t.instance)}detach(){const t=this,e=t.instance;e.off(\"Carousel.initSlides\",t.onReady),e.off(\"done\",t.onDone),e.off([\"reveal\",\"Carousel.change\"],t.onChange),t.removeContainer()}}Object.defineProperty(Qt,\"defaults\",{enumerable:!0,configurable:!0,writable:!0,value:Ut});const te={Hash:class extends _{onReady(){ht=!1}onChange(t){ut&&clearTimeout(ut);const{hash:e}=pt(),{hash:i}=ft(),n=t.isOpeningSlide(t.getSlide());n&&(ct=i===e?\"\":i),e&&e!==i&&(ut=setTimeout((()=>{try{if(t.state===rt.Ready){let t=\"replaceState\";n&&!dt&&(t=\"pushState\",dt=!0),window.history[t]({},document.title,window.location.pathname+window.location.search+e)}}catch(t){}}),300))}onClose(t){if(ut&&clearTimeout(ut),!ht&&dt)return dt=!1,ht=!1,void window.history.back();if(!ht)try{window.history.replaceState({},document.title,window.location.pathname+window.location.search+(ct||\"\"))}catch(t){}}attach(){const t=this.instance;t.on(\"ready\",this.onReady),t.on([\"Carousel.ready\",\"Carousel.change\"],this.onChange),t.on(\"close\",this.onClose)}detach(){const t=this.instance;t.off(\"ready\",this.onReady),t.off([\"Carousel.ready\",\"Carousel.change\"],this.onChange),t.off(\"close\",this.onClose)}static parseURL(){return ft()}static startFromUrl(){gt()}static destroy(){window.removeEventListener(\"hashchange\",vt,!1)}},Html:Lt,Images:wt,Slideshow:Dt,Thumbs:Yt,Toolbar:Qt},ee=\"with-fancybox\",ie=\"hide-scrollbar\",ne=\"--fancybox-scrollbar-compensate\",se=\"--fancybox-body-margin\",oe=\"aria-hidden\",ae=\"is-using-tab\",re=\"is-animated\",le=\"is-compact\",ce=\"is-loading\",he=\"is-opening\",de=\"has-caption\",ue=\"disabled\",pe=\"tabindex\",fe=\"download\",ge=\"href\",me=\"src\",ve=t=>\"string\"==typeof t,be=function(){var t=window.getSelection();return!!t&&\"Range\"===t.type};let ye,we=null,xe=null,Ee=0,Se=0,Pe=0,Ce=0;const Te=new Map;let Me=0;class Oe extends g{get isIdle(){return this.idle}get isCompact(){return this.option(\"compact\")}constructor(t=[],e={},i={}){super(e),Object.defineProperty(this,\"userSlides\",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,\"userPlugins\",{enumerable:!0,configurable:!0,writable:!0,value:{}}),Object.defineProperty(this,\"idle\",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,\"idleTimer\",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,\"clickTimer\",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,\"pwt\",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,\"ignoreFocusChange\",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,\"startedFs\",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,\"state\",{enumerable:!0,configurable:!0,writable:!0,value:rt.Init}),Object.defineProperty(this,\"id\",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,\"container\",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,\"caption\",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,\"footer\",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,\"carousel\",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,\"lastFocus\",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,\"prevMouseMoveEvent\",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),ye||(ye=ot()),this.id=e.id||++Me,Te.set(this.id,this),this.userSlides=t,this.userPlugins=i,queueMicrotask((()=>{this.init()}))}init(){if(this.state===rt.Destroy)return;this.state=rt.Init,this.attachPlugins(Object.assign(Object.assign({},Oe.Plugins),this.userPlugins)),this.emit(\"init\"),this.emit(\"attachPlugins\"),!0===this.option(\"hideScrollbar\")&&(()=>{if(!et)return;const t=document,e=t.body,i=t.documentElement;if(e.classList.contains(ie))return;let n=window.innerWidth-i.getBoundingClientRect().width;const s=parseFloat(window.getComputedStyle(e).marginRight);n<0&&(n=0),i.style.setProperty(ne,`${n}px`),s&&e.style.setProperty(se,`${s}px`),e.classList.add(ie)})(),this.initLayout(),this.scale();const t=()=>{this.initCarousel(this.userSlides),this.state=rt.Ready,this.attachEvents(),this.emit(\"ready\"),setTimeout((()=>{this.container&&this.container.setAttribute(oe,\"false\")}),16)};this.option(\"Fullscreen.autoStart\")&&ye&&!ye.isFullscreen()?ye.request().then((()=>{this.startedFs=!0,t()})).catch((()=>t())):t()}initLayout(){var t,e;const i=this.option(\"parentEl\")||document.body,s=n(this.localize(this.option(\"tpl.main\")||\"\"));if(s){if(s.setAttribute(\"id\",`fancybox-${this.id}`),s.setAttribute(\"aria-label\",this.localize(\"{{MODAL}}\")),s.classList.toggle(le,this.isCompact),P(s,this.option(\"mainClass\")||\"\"),P(s,he),this.container=s,this.footer=s.querySelector(\".fancybox__footer\"),i.appendChild(s),P(document.documentElement,ee),we&&xe||(we=document.createElement(\"span\"),P(we,\"fancybox-focus-guard\"),we.setAttribute(pe,\"0\"),we.setAttribute(oe,\"true\"),we.setAttribute(\"aria-label\",\"Focus guard\"),xe=we.cloneNode(),null===(t=s.parentElement)||void 0===t||t.insertBefore(we,s),null===(e=s.parentElement)||void 0===e||e.append(xe)),s.addEventListener(\"mousedown\",(t=>{Ee=t.pageX,Se=t.pageY,S(s,ae)})),this.option(\"closeExisting\"))for(const t of Te.values())t.id!==this.id&&t.close();else this.option(\"animated\")&&(P(s,re),setTimeout((()=>{this.isClosing()||S(s,re)}),350));this.emit(\"initLayout\")}}initCarousel(t){const i=this.container;if(!i)return;const n=i.querySelector(\".fancybox__carousel\");if(!n)return;const s=this.carousel=new Q(n,u({},{slides:t,transition:\"fade\",Panzoom:{lockAxis:this.option(\"dragToClose\")?\"xy\":\"x\",infinite:!!this.option(\"dragToClose\")&&\"y\"},Dots:!1,Navigation:{classes:{container:\"fancybox__nav\",button:\"f-button\",isNext:\"is-next\",isPrev:\"is-prev\"}},initialPage:this.option(\"startIndex\"),l10n:this.option(\"l10n\")},this.option(\"Carousel\")||{}));s.on(\"*\",((t,e,...i)=>{this.emit(`Carousel.${e}`,t,...i)})),s.on([\"ready\",\"change\"],(()=>{this.manageCaption()})),this.on(\"Carousel.removeSlide\",((t,e,i)=>{this.clearContent(i),i.state=void 0})),s.on(\"Panzoom.touchStart\",(()=>{var t,e;this.isCompact||this.endIdle(),(null===(t=document.activeElement)||void 0===t?void 0:t.closest(\".f-thumbs\"))&&(null===(e=this.container)||void 0===e||e.focus())})),s.on(\"settle\",(()=>{this.idleTimer||this.isCompact||!this.option(\"idle\")||this.setIdle(),this.option(\"autoFocus\")&&!this.isClosing&&this.checkFocus()})),this.option(\"dragToClose\")&&(s.on(\"Panzoom.afterTransform\",((t,i)=>{const n=this.getSlide();if(n&&e(n.el))return;const s=this.container;if(s){const t=Math.abs(i.current.f),e=t<1?\"\":Math.max(.5,Math.min(1,1-t/i.contentRect.fitHeight*1.5));s.style.setProperty(\"--fancybox-ts\",e?\"0s\":\"\"),s.style.setProperty(\"--fancybox-opacity\",e+\"\")}})),s.on(\"Panzoom.touchEnd\",((t,i,n)=>{var s;const o=this.getSlide();if(o&&e(o.el))return;if(i.isMobile&&document.activeElement&&-1!==[\"TEXTAREA\",\"INPUT\"].indexOf(null===(s=document.activeElement)||void 0===s?void 0:s.nodeName))return;const a=Math.abs(i.dragOffset.y);\"y\"===i.lockedAxis&&(a>=200||a>=50&&i.dragOffset.time<300)&&(n&&n.cancelable&&n.preventDefault(),this.close(n,\"f-throwOut\"+(i.current.f<0?\"Up\":\"Down\")))}))),s.on(\"change\",(t=>{var e;let i=null===(e=this.getSlide())||void 0===e?void 0:e.triggerEl;if(i){const e=new CustomEvent(\"slideTo\",{bubbles:!0,cancelable:!0,detail:t.page});i.dispatchEvent(e)}})),s.on([\"refresh\",\"change\"],(t=>{const e=this.container;if(!e)return;for(const i of e.querySelectorAll(\"[data-fancybox-current-index]\"))i.innerHTML=t.page+1;for(const i of e.querySelectorAll(\"[data-fancybox-count]\"))i.innerHTML=t.pages.length;if(!t.isInfinite){for(const i of e.querySelectorAll(\"[data-fancybox-next]\"))t.page<t.pages.length-1?(i.removeAttribute(ue),i.removeAttribute(pe)):(i.setAttribute(ue,\"\"),i.setAttribute(pe,\"-1\"));for(const i of e.querySelectorAll(\"[data-fancybox-prev]\"))t.page>0?(i.removeAttribute(ue),i.removeAttribute(pe)):(i.setAttribute(ue,\"\"),i.setAttribute(pe,\"-1\"))}const i=this.getSlide();if(!i)return;let n=i.downloadSrc||\"\";n||\"image\"!==i.type||i.error||!ve(i[me])||(n=i[me]);for(const t of e.querySelectorAll(\"[data-fancybox-download]\")){const e=i.downloadFilename;n?(t.removeAttribute(ue),t.removeAttribute(pe),t.setAttribute(ge,n),t.setAttribute(fe,e||n),t.setAttribute(\"target\",\"_blank\")):(t.setAttribute(ue,\"\"),t.setAttribute(pe,\"-1\"),t.removeAttribute(ge),t.removeAttribute(fe))}})),this.emit(\"initCarousel\")}attachEvents(){const t=this,e=t.container;if(!e)return;e.addEventListener(\"click\",t.onClick,{passive:!1,capture:!1}),e.addEventListener(\"wheel\",t.onWheel,{passive:!1,capture:!1}),document.addEventListener(\"keydown\",t.onKeydown,{passive:!1,capture:!0}),document.addEventListener(\"visibilitychange\",t.onVisibilityChange,!1),document.addEventListener(\"mousemove\",t.onMousemove),t.option(\"trapFocus\")&&document.addEventListener(\"focus\",t.onFocus,!0),window.addEventListener(\"resize\",t.onResize);const i=window.visualViewport;i&&(i.addEventListener(\"scroll\",t.onResize),i.addEventListener(\"resize\",t.onResize))}detachEvents(){const t=this,e=t.container;if(!e)return;document.removeEventListener(\"keydown\",t.onKeydown,{passive:!1,capture:!0}),e.removeEventListener(\"wheel\",t.onWheel,{passive:!1,capture:!1}),e.removeEventListener(\"click\",t.onClick,{passive:!1,capture:!1}),document.removeEventListener(\"mousemove\",t.onMousemove),window.removeEventListener(\"resize\",t.onResize);const i=window.visualViewport;i&&(i.removeEventListener(\"resize\",t.onResize),i.removeEventListener(\"scroll\",t.onResize)),document.removeEventListener(\"visibilitychange\",t.onVisibilityChange,!1),document.removeEventListener(\"focus\",t.onFocus,!0)}scale(){const t=this.container;if(!t)return;const e=window.visualViewport,i=Math.max(1,(null==e?void 0:e.scale)||1);let n=\"\",s=\"\",o=\"\";if(e&&i>1){let t=`${e.offsetLeft}px`,a=`${e.offsetTop}px`;n=e.width*i+\"px\",s=e.height*i+\"px\",o=`translate3d(${t}, ${a}, 0) scale(${1/i})`}t.style.transform=o,t.style.width=n,t.style.height=s}onClick(t){var e;const{container:i,isCompact:n}=this;if(!i||this.isClosing())return;!n&&this.option(\"idle\")&&this.resetIdle();const s=t.composedPath()[0];if(s.closest(\".fancybox-spinner\")||s.closest(\"[data-fancybox-close]\"))return t.preventDefault(),void this.close(t);if(s.closest(\"[data-fancybox-prev]\"))return t.preventDefault(),void this.prev();if(s.closest(\"[data-fancybox-next]\"))return t.preventDefault(),void this.next();if(\"click\"===t.type&&0===t.detail)return;if(Math.abs(t.pageX-Ee)>30||Math.abs(t.pageY-Se)>30)return;const o=document.activeElement;if(be()&&o&&i.contains(o))return;if(n&&\"image\"===(null===(e=this.getSlide())||void 0===e?void 0:e.type))return void(this.clickTimer?(clearTimeout(this.clickTimer),this.clickTimer=null):this.clickTimer=setTimeout((()=>{this.toggleIdle(),this.clickTimer=null}),350));if(this.emit(\"click\",t),t.defaultPrevented)return;let a=!1;if(s.closest(\".fancybox__content\")){if(o){if(o.closest(\"[contenteditable]\"))return;s.matches(nt)||o.blur()}if(be())return;a=this.option(\"contentClick\")}else s.closest(\".fancybox__carousel\")&&!s.matches(nt)&&(a=this.option(\"backdropClick\"));\"close\"===a?(t.preventDefault(),this.close(t)):\"next\"===a?(t.preventDefault(),this.next()):\"prev\"===a&&(t.preventDefault(),this.prev())}onWheel(t){const e=t.target;let n=this.option(\"wheel\",t);e.closest(\".fancybox__thumbs\")&&(n=\"slide\");const s=\"slide\"===n,o=[-t.deltaX||0,-t.deltaY||0,-t.detail||0].reduce((function(t,e){return Math.abs(e)>Math.abs(t)?e:t})),a=Math.max(-1,Math.min(1,o)),r=Date.now();this.pwt&&r-this.pwt<300?s&&t.preventDefault():(this.pwt=r,this.emit(\"wheel\",t,a),t.defaultPrevented||(\"close\"===n?(t.preventDefault(),this.close(t)):\"slide\"===n&&(i(e)||(t.preventDefault(),this[a>0?\"prev\":\"next\"]()))))}onScroll(){window.scrollTo(Pe,Ce)}onKeydown(t){if(!this.isTopmost())return;this.isCompact||!this.option(\"idle\")||this.isClosing()||this.resetIdle();const e=t.key,i=this.option(\"keyboard\");if(!i)return;const n=t.composedPath()[0],s=document.activeElement&&document.activeElement.classList,o=s&&s.contains(\"f-button\")||n.dataset.carouselPage||n.dataset.carouselIndex;if(\"Escape\"!==e&&!o&&E(n)){if(n.isContentEditable||-1!==[\"TEXTAREA\",\"OPTION\",\"INPUT\",\"SELECT\",\"VIDEO\"].indexOf(n.nodeName))return}if(\"Tab\"===t.key?P(this.container,ae):S(this.container,ae),t.ctrlKey||t.altKey||t.shiftKey)return;this.emit(\"keydown\",e,t);const a=i[e];a&&\"function\"==typeof this[a]&&(t.preventDefault(),this[a]())}onResize(){const t=this.container;if(!t)return;const e=this.isCompact;t.classList.toggle(le,e),this.manageCaption(this.getSlide()),this.isCompact?this.clearIdle():this.endIdle(),this.scale(),this.emit(\"resize\")}onFocus(t){this.isTopmost()&&this.checkFocus(t)}onMousemove(t){this.prevMouseMoveEvent=t,!this.isCompact&&this.option(\"idle\")&&this.resetIdle()}onVisibilityChange(){\"visible\"===document.visibilityState?this.checkFocus():this.endIdle()}manageCloseBtn(t){const e=this.optionFor(t,\"closeButton\")||!1;if(\"auto\"===e){const t=this.plugins.Toolbar;if(t&&t.state===Zt.Ready)return}if(!e)return;if(!t.contentEl||t.closeBtnEl)return;const i=this.option(\"tpl.closeButton\");if(i){const e=n(this.localize(i));t.closeBtnEl=t.contentEl.appendChild(e),t.el&&P(t.el,\"has-close-btn\")}}manageCaption(t=void 0){var e,i;const n=\"fancybox__caption\",s=this.container;if(!s)return;S(s,de);const o=this.isCompact||this.option(\"commonCaption\"),a=!o;if(this.caption&&this.stop(this.caption),a&&this.caption&&(this.caption.remove(),this.caption=null),o&&!this.caption)for(const t of(null===(e=this.carousel)||void 0===e?void 0:e.slides)||[])t.captionEl&&(t.captionEl.remove(),t.captionEl=void 0,S(t.el,de),null===(i=t.el)||void 0===i||i.removeAttribute(\"aria-labelledby\"));if(t||(t=this.getSlide()),!t||o&&!this.isCurrentSlide(t))return;const r=t.el;let l=this.optionFor(t,\"caption\",\"\");if(!l)return void(o&&this.caption&&this.animate(this.caption,\"f-fadeOut\",(()=>{this.caption&&(this.caption.innerHTML=\"\")})));let c=null;if(a){if(c=t.captionEl||null,r&&!c){const e=n+`_${this.id}_${t.index}`;c=document.createElement(\"div\"),P(c,n),c.setAttribute(\"id\",e),t.captionEl=r.appendChild(c),P(r,de),r.setAttribute(\"aria-labelledby\",e)}}else{if(c=this.caption,c||(c=s.querySelector(\".\"+n)),!c){c=document.createElement(\"div\"),c.dataset.fancyboxCaption=\"\",P(c,n);(this.footer||s).prepend(c)}P(s,de),this.caption=c}c&&(c.innerHTML=\"\",ve(l)||\"number\"==typeof l?c.innerHTML=l+\"\":l instanceof HTMLElement&&c.appendChild(l))}checkFocus(t){this.focus(t)}focus(t){var e;if(this.ignoreFocusChange)return;const i=document.activeElement||null,n=(null==t?void 0:t.target)||null,s=this.container,o=null===(e=this.carousel)||void 0===e?void 0:e.viewport;if(!s||!o)return;if(!t&&i&&s.contains(i))return;const a=this.getSlide(),r=a&&a.state===lt.Ready?a.el:null;if(!r||r.contains(i)||s===i)return;t&&t.cancelable&&t.preventDefault(),this.ignoreFocusChange=!0;const l=Array.from(s.querySelectorAll(nt));let c=[],h=null;for(let t of l){const e=!t.offsetParent||!!t.closest('[aria-hidden=\"true\"]'),i=r&&r.contains(t),n=!o.contains(t);if(t===s||(i||n)&&!e){c.push(t);const e=t.dataset.origTabindex;void 0!==e&&e&&(t.tabIndex=parseFloat(e)),t.removeAttribute(\"data-orig-tabindex\"),!t.hasAttribute(\"autoFocus\")&&h||(h=t)}else{const e=void 0===t.dataset.origTabindex?t.getAttribute(\"tabindex\")||\"\":t.dataset.origTabindex;e&&(t.dataset.origTabindex=e),t.tabIndex=-1}}let d=null;t?(!n||c.indexOf(n)<0)&&(d=h||s,c.length&&(i===xe?d=c[0]:this.lastFocus!==s&&i!==we||(d=c[c.length-1]))):d=a&&\"image\"===a.type?s:h||s,d&&st(d),this.lastFocus=document.activeElement,this.ignoreFocusChange=!1}next(){const t=this.carousel;t&&t.pages.length>1&&t.slideNext()}prev(){const t=this.carousel;t&&t.pages.length>1&&t.slidePrev()}jumpTo(...t){this.carousel&&this.carousel.slideTo(...t)}isTopmost(){var t;return(null===(t=Oe.getInstance())||void 0===t?void 0:t.id)==this.id}animate(t=null,e=\"\",i){if(!t||!e)return void(i&&i());this.stop(t);const n=s=>{s.target===t&&t.dataset.animationName&&(t.removeEventListener(\"animationend\",n),delete t.dataset.animationName,i&&i(),S(t,e))};t.dataset.animationName=e,t.addEventListener(\"animationend\",n),P(t,e)}stop(t){t&&t.dispatchEvent(new CustomEvent(\"animationend\",{bubbles:!1,cancelable:!0,currentTarget:t}))}setContent(t,e=\"\",i=!0){if(this.isClosing())return;const s=t.el;if(!s)return;let o=null;if(E(e)?o=e:(o=n(e+\"\"),E(o)||(o=document.createElement(\"div\"),o.innerHTML=e+\"\")),[\"img\",\"picture\",\"iframe\",\"video\",\"audio\"].includes(o.nodeName.toLowerCase())){const t=document.createElement(\"div\");t.appendChild(o),o=t}E(o)&&t.filter&&!t.error&&(o=o.querySelector(t.filter)),o&&E(o)?(P(o,\"fancybox__content\"),t.id&&o.setAttribute(\"id\",t.id),s.classList.add(`has-${t.error?\"error\":t.type||\"unknown\"}`),s.prepend(o),\"none\"===o.style.display&&(o.style.display=\"\"),\"none\"===getComputedStyle(o).getPropertyValue(\"display\")&&(o.style.display=t.display||this.option(\"defaultDisplay\")||\"flex\"),t.contentEl=o,i&&this.revealContent(t),this.manageCloseBtn(t),this.manageCaption(t)):this.setError(t,\"{{ELEMENT_NOT_FOUND}}\")}revealContent(t,e){const i=t.el,n=t.contentEl;i&&n&&(this.emit(\"reveal\",t),this.hideLoading(t),t.state=lt.Opening,(e=this.isOpeningSlide(t)?void 0===e?this.optionFor(t,\"showClass\"):e:\"f-fadeIn\")?this.animate(n,e,(()=>{this.done(t)})):this.done(t))}done(t){this.isClosing()||(t.state=lt.Ready,this.emit(\"done\",t),P(t.el,\"is-done\"),this.isCurrentSlide(t)&&this.option(\"autoFocus\")&&queueMicrotask((()=>{var e;null===(e=t.panzoom)||void 0===e||e.updateControls(),this.option(\"autoFocus\")&&this.focus()})),this.isOpeningSlide(t)&&(S(this.container,he),!this.isCompact&&this.option(\"idle\")&&this.setIdle()))}isCurrentSlide(t){const e=this.getSlide();return!(!t||!e)&&e.index===t.index}isOpeningSlide(t){var e,i;return null===(null===(e=this.carousel)||void 0===e?void 0:e.prevPage)&&t&&t.index===(null===(i=this.getSlide())||void 0===i?void 0:i.index)}showLoading(t){t.state=lt.Loading;const e=t.el;if(!e)return;P(e,ce),this.emit(\"loading\",t),t.spinnerEl||setTimeout((()=>{if(!this.isClosing()&&!t.spinnerEl&&t.state===lt.Loading){let i=n(x);P(i,\"fancybox-spinner\"),t.spinnerEl=i,e.prepend(i),this.animate(i,\"f-fadeIn\")}}),250)}hideLoading(t){const e=t.el;if(!e)return;const i=t.spinnerEl;this.isClosing()?null==i||i.remove():(S(e,ce),i&&this.animate(i,\"f-fadeOut\",(()=>{i.remove()})),t.state===lt.Loading&&(this.emit(\"loaded\",t),t.state=lt.Ready))}setError(t,e){if(this.isClosing())return;const i=new Event(\"error\",{bubbles:!0,cancelable:!0});if(this.emit(\"error\",i,t),i.defaultPrevented)return;t.error=e,this.hideLoading(t),this.clearContent(t);const n=document.createElement(\"div\");n.classList.add(\"fancybox-error\"),n.innerHTML=this.localize(e||\"<p>{{ERROR}}</p>\"),this.setContent(t,n)}clearContent(t){if(void 0===t.state)return;this.emit(\"clearContent\",t),t.contentEl&&(t.contentEl.remove(),t.contentEl=void 0);const e=t.el;e&&(S(e,\"has-error\"),S(e,\"has-unknown\"),S(e,`has-${t.type||\"unknown\"}`)),t.closeBtnEl&&t.closeBtnEl.remove(),t.closeBtnEl=void 0,t.captionEl&&t.captionEl.remove(),t.captionEl=void 0,t.spinnerEl&&t.spinnerEl.remove(),t.spinnerEl=void 0}getSlide(){var t;const e=this.carousel;return(null===(t=null==e?void 0:e.pages[null==e?void 0:e.page])||void 0===t?void 0:t.slides[0])||void 0}close(t,e){if(this.isClosing())return;const i=new Event(\"shouldClose\",{bubbles:!0,cancelable:!0});if(this.emit(\"shouldClose\",i,t),i.defaultPrevented)return;t&&t.cancelable&&(t.preventDefault(),t.stopPropagation());const n=()=>{this.proceedClose(t,e)};this.startedFs&&ye&&ye.isFullscreen()?Promise.resolve(ye.exit()).then((()=>n())):n()}clearIdle(){this.idleTimer&&clearTimeout(this.idleTimer),this.idleTimer=null}setIdle(t=!1){const e=()=>{this.clearIdle(),this.idle=!0,P(this.container,\"is-idle\"),this.emit(\"setIdle\")};if(this.clearIdle(),!this.isClosing())if(t)e();else{const t=this.option(\"idle\");t&&(this.idleTimer=setTimeout(e,t))}}endIdle(){this.clearIdle(),this.idle&&!this.isClosing()&&(this.idle=!1,S(this.container,\"is-idle\"),this.emit(\"endIdle\"))}resetIdle(){this.endIdle(),this.setIdle()}toggleIdle(){this.idle?this.endIdle():this.setIdle(!0)}toggleFullscreen(){ye&&(ye.isFullscreen()?ye.exit():ye.request().then((()=>{this.startedFs=!0})))}isClosing(){return[rt.Closing,rt.CustomClosing,rt.Destroy].includes(this.state)}proceedClose(t,e){var i,n;this.state=rt.Closing,this.clearIdle(),this.detachEvents();const s=this.container,o=this.carousel,a=this.getSlide(),r=a&&this.option(\"placeFocusBack\")?a.triggerEl||this.option(\"triggerEl\"):null;if(r&&(tt(r)?st(r):r.focus()),s&&(S(s,he),P(s,\"is-closing\"),s.setAttribute(oe,\"true\"),this.option(\"animated\")&&P(s,re),s.style.pointerEvents=\"none\"),o){o.clearTransitions(),null===(i=o.panzoom)||void 0===i||i.destroy(),null===(n=o.plugins.Navigation)||void 0===n||n.detach();for(const t of o.slides){t.state=lt.Closing,this.hideLoading(t);const e=t.contentEl;e&&this.stop(e);const i=null==t?void 0:t.panzoom;i&&(i.stop(),i.detachEvents(),i.detachObserver()),this.isCurrentSlide(t)||o.emit(\"removeSlide\",t)}}Pe=window.scrollX,Ce=window.scrollY,window.addEventListener(\"scroll\",this.onScroll),this.emit(\"close\",t),this.state!==rt.CustomClosing?(void 0===e&&a&&(e=this.optionFor(a,\"hideClass\")),e&&a?(this.animate(a.contentEl,e,(()=>{o&&o.emit(\"removeSlide\",a)})),setTimeout((()=>{this.destroy()}),500)):this.destroy()):setTimeout((()=>{this.destroy()}),500)}destroy(){var t;if(this.state===rt.Destroy)return;window.removeEventListener(\"scroll\",this.onScroll),this.state=rt.Destroy,null===(t=this.carousel)||void 0===t||t.destroy();const e=this.container;e&&e.remove(),Te.delete(this.id);const i=Oe.getInstance();i?i.focus():(we&&(we.remove(),we=null),xe&&(xe.remove(),xe=null),S(document.documentElement,ee),(()=>{if(!et)return;const t=document,e=t.body;e.classList.remove(ie),e.style.setProperty(se,\"\"),t.documentElement.style.setProperty(ne,\"\")})(),this.emit(\"destroy\"))}static bind(t,e,i){if(!et)return;let n,s=\"\",o={};if(void 0===t?n=document.body:ve(t)?(n=document.body,s=t,\"object\"==typeof e&&(o=e||{})):(n=t,ve(e)&&(s=e),\"object\"==typeof i&&(o=i||{})),!n||!E(n))return;s=s||\"[data-fancybox]\";const a=Oe.openers.get(n)||new Map;a.set(s,o),Oe.openers.set(n,a),1===a.size&&n.addEventListener(\"click\",Oe.fromEvent)}static unbind(t,e){let i,n=\"\";if(ve(t)?(i=document.body,n=t):(i=t,ve(e)&&(n=e)),!i)return;const s=Oe.openers.get(i);s&&n&&s.delete(n),n&&s||(Oe.openers.delete(i),i.removeEventListener(\"click\",Oe.fromEvent))}static destroy(){let t;for(;t=Oe.getInstance();)t.destroy();for(const t of Oe.openers.keys())t.removeEventListener(\"click\",Oe.fromEvent);Oe.openers=new Map}static fromEvent(t){if(t.defaultPrevented)return;if(t.button&&0!==t.button)return;if(t.ctrlKey||t.metaKey||t.shiftKey)return;let e=t.composedPath()[0];const i=e.closest(\"[data-fancybox-trigger]\");if(i){const t=i.dataset.fancyboxTrigger||\"\",n=document.querySelectorAll(`[data-fancybox=\"${t}\"]`),s=parseInt(i.dataset.fancyboxIndex||\"\",10)||0;e=n[s]||e}if(!(e&&e instanceof Element))return;let n,s,o,a;if([...Oe.openers].reverse().find((([t,i])=>!(!t.contains(e)||![...i].reverse().find((([i,r])=>{let l=e.closest(i);return!!l&&(n=t,s=i,o=l,a=r,!0)}))))),!n||!s||!o)return;a=a||{},t.preventDefault(),e=o;let r=[],l=u({},at,a);l.event=t,l.triggerEl=e,l.delegate=i;const c=l.groupAll,h=l.groupAttr,d=h&&e?e.getAttribute(`${h}`):\"\";if((!e||d||c)&&(r=[].slice.call(n.querySelectorAll(s))),e&&!c&&(r=d?r.filter((t=>t.getAttribute(`${h}`)===d)):[e]),!r.length)return;const p=Oe.getInstance();return p&&p.options.triggerEl&&r.indexOf(p.options.triggerEl)>-1?void 0:(e&&(l.startIndex=r.indexOf(e)),Oe.fromNodes(r,l))}static fromSelector(t,e,i){let n=null,s=\"\",o={};if(ve(t)?(n=document.body,s=t,\"object\"==typeof e&&(o=e||{})):t instanceof HTMLElement&&ve(e)&&(n=t,s=e,\"object\"==typeof i&&(o=i||{})),!n||!s)return!1;const a=Oe.openers.get(n);return!!a&&(o=u({},a.get(s)||{},o),!!o&&Oe.fromNodes(Array.from(n.querySelectorAll(s)),o))}static fromNodes(t,e){e=u({},at,e||{});const i=[];for(const n of t){const t=n.dataset||{},s=t[me]||n.getAttribute(ge)||n.getAttribute(\"currentSrc\")||n.getAttribute(me)||void 0;let o;const a=e.delegate;let r;a&&i.length===e.startIndex&&(o=a instanceof HTMLImageElement?a:a.querySelector(\"img:not([aria-hidden])\")),o||(o=n instanceof HTMLImageElement?n:n.querySelector(\"img:not([aria-hidden])\")),o&&(r=o.currentSrc||o[me]||void 0,!r&&o.dataset&&(r=o.dataset.lazySrc||o.dataset[me]||void 0));const l={src:s,triggerEl:n,thumbEl:o,thumbElSrc:r,thumbSrc:r};for(const e in t){let i=t[e]+\"\";i=\"false\"!==i&&(\"true\"===i||i),l[e]=i}i.push(l)}return new Oe(i,e)}static getInstance(t){if(t)return Te.get(t);return Array.from(Te.values()).reverse().find((t=>!t.isClosing()&&t))||null}static getSlide(){var t;return(null===(t=Oe.getInstance())||void 0===t?void 0:t.getSlide())||null}static show(t=[],e={}){return new Oe(t,e)}static next(){const t=Oe.getInstance();t&&t.next()}static prev(){const t=Oe.getInstance();t&&t.prev()}static close(t=!0,...e){if(t)for(const t of Te.values())t.close(...e);else{const t=Oe.getInstance();t&&t.close(...e)}}}Object.defineProperty(Oe,\"version\",{enumerable:!0,configurable:!0,writable:!0,value:\"5.0.36\"}),Object.defineProperty(Oe,\"defaults\",{enumerable:!0,configurable:!0,writable:!0,value:at}),Object.defineProperty(Oe,\"Plugins\",{enumerable:!0,configurable:!0,writable:!0,value:te}),Object.defineProperty(Oe,\"openers\",{enumerable:!0,configurable:!0,writable:!0,value:new Map});export{Q as Carousel,Oe as Fancybox,I as Panzoom};\n","\"use strict\";\n\nexports.__esModule = true;\nexports[\"default\"] = void 0;\n\nvar _node = _interopRequireDefault(require(\"./node\"));\n\nvar types = _interopRequireWildcard(require(\"./types\"));\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { \"default\": obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj[\"default\"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nfunction _createForOfIteratorHelperLoose(o, allowArrayLike) { var it; if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } it = o[Symbol.iterator](); return it.next.bind(it); }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nvar Container = /*#__PURE__*/function (_Node) {\n  _inheritsLoose(Container, _Node);\n\n  function Container(opts) {\n    var _this;\n\n    _this = _Node.call(this, opts) || this;\n\n    if (!_this.nodes) {\n      _this.nodes = [];\n    }\n\n    return _this;\n  }\n\n  var _proto = Container.prototype;\n\n  _proto.append = function append(selector) {\n    selector.parent = this;\n    this.nodes.push(selector);\n    return this;\n  };\n\n  _proto.prepend = function prepend(selector) {\n    selector.parent = this;\n    this.nodes.unshift(selector);\n    return this;\n  };\n\n  _proto.at = function at(index) {\n    return this.nodes[index];\n  };\n\n  _proto.index = function index(child) {\n    if (typeof child === 'number') {\n      return child;\n    }\n\n    return this.nodes.indexOf(child);\n  };\n\n  _proto.removeChild = function removeChild(child) {\n    child = this.index(child);\n    this.at(child).parent = undefined;\n    this.nodes.splice(child, 1);\n    var index;\n\n    for (var id in this.indexes) {\n      index = this.indexes[id];\n\n      if (index >= child) {\n        this.indexes[id] = index - 1;\n      }\n    }\n\n    return this;\n  };\n\n  _proto.removeAll = function removeAll() {\n    for (var _iterator = _createForOfIteratorHelperLoose(this.nodes), _step; !(_step = _iterator()).done;) {\n      var node = _step.value;\n      node.parent = undefined;\n    }\n\n    this.nodes = [];\n    return this;\n  };\n\n  _proto.empty = function empty() {\n    return this.removeAll();\n  };\n\n  _proto.insertAfter = function insertAfter(oldNode, newNode) {\n    newNode.parent = this;\n    var oldIndex = this.index(oldNode);\n    this.nodes.splice(oldIndex + 1, 0, newNode);\n    newNode.parent = this;\n    var index;\n\n    for (var id in this.indexes) {\n      index = this.indexes[id];\n\n      if (oldIndex <= index) {\n        this.indexes[id] = index + 1;\n      }\n    }\n\n    return this;\n  };\n\n  _proto.insertBefore = function insertBefore(oldNode, newNode) {\n    newNode.parent = this;\n    var oldIndex = this.index(oldNode);\n    this.nodes.splice(oldIndex, 0, newNode);\n    newNode.parent = this;\n    var index;\n\n    for (var id in this.indexes) {\n      index = this.indexes[id];\n\n      if (index <= oldIndex) {\n        this.indexes[id] = index + 1;\n      }\n    }\n\n    return this;\n  };\n\n  _proto._findChildAtPosition = function _findChildAtPosition(line, col) {\n    var found = undefined;\n    this.each(function (node) {\n      if (node.atPosition) {\n        var foundChild = node.atPosition(line, col);\n\n        if (foundChild) {\n          found = foundChild;\n          return false;\n        }\n      } else if (node.isAtPosition(line, col)) {\n        found = node;\n        return false;\n      }\n    });\n    return found;\n  }\n  /**\n   * Return the most specific node at the line and column number given.\n   * The source location is based on the original parsed location, locations aren't\n   * updated as selector nodes are mutated.\n   * \n   * Note that this location is relative to the location of the first character\n   * of the selector, and not the location of the selector in the overall document\n   * when used in conjunction with postcss.\n   *\n   * If not found, returns undefined.\n   * @param {number} line The line number of the node to find. (1-based index)\n   * @param {number} col  The column number of the node to find. (1-based index)\n   */\n  ;\n\n  _proto.atPosition = function atPosition(line, col) {\n    if (this.isAtPosition(line, col)) {\n      return this._findChildAtPosition(line, col) || this;\n    } else {\n      return undefined;\n    }\n  };\n\n  _proto._inferEndPosition = function _inferEndPosition() {\n    if (this.last && this.last.source && this.last.source.end) {\n      this.source = this.source || {};\n      this.source.end = this.source.end || {};\n      Object.assign(this.source.end, this.last.source.end);\n    }\n  };\n\n  _proto.each = function each(callback) {\n    if (!this.lastEach) {\n      this.lastEach = 0;\n    }\n\n    if (!this.indexes) {\n      this.indexes = {};\n    }\n\n    this.lastEach++;\n    var id = this.lastEach;\n    this.indexes[id] = 0;\n\n    if (!this.length) {\n      return undefined;\n    }\n\n    var index, result;\n\n    while (this.indexes[id] < this.length) {\n      index = this.indexes[id];\n      result = callback(this.at(index), index);\n\n      if (result === false) {\n        break;\n      }\n\n      this.indexes[id] += 1;\n    }\n\n    delete this.indexes[id];\n\n    if (result === false) {\n      return false;\n    }\n  };\n\n  _proto.walk = function walk(callback) {\n    return this.each(function (node, i) {\n      var result = callback(node, i);\n\n      if (result !== false && node.length) {\n        result = node.walk(callback);\n      }\n\n      if (result === false) {\n        return false;\n      }\n    });\n  };\n\n  _proto.walkAttributes = function walkAttributes(callback) {\n    var _this2 = this;\n\n    return this.walk(function (selector) {\n      if (selector.type === types.ATTRIBUTE) {\n        return callback.call(_this2, selector);\n      }\n    });\n  };\n\n  _proto.walkClasses = function walkClasses(callback) {\n    var _this3 = this;\n\n    return this.walk(function (selector) {\n      if (selector.type === types.CLASS) {\n        return callback.call(_this3, selector);\n      }\n    });\n  };\n\n  _proto.walkCombinators = function walkCombinators(callback) {\n    var _this4 = this;\n\n    return this.walk(function (selector) {\n      if (selector.type === types.COMBINATOR) {\n        return callback.call(_this4, selector);\n      }\n    });\n  };\n\n  _proto.walkComments = function walkComments(callback) {\n    var _this5 = this;\n\n    return this.walk(function (selector) {\n      if (selector.type === types.COMMENT) {\n        return callback.call(_this5, selector);\n      }\n    });\n  };\n\n  _proto.walkIds = function walkIds(callback) {\n    var _this6 = this;\n\n    return this.walk(function (selector) {\n      if (selector.type === types.ID) {\n        return callback.call(_this6, selector);\n      }\n    });\n  };\n\n  _proto.walkNesting = function walkNesting(callback) {\n    var _this7 = this;\n\n    return this.walk(function (selector) {\n      if (selector.type === types.NESTING) {\n        return callback.call(_this7, selector);\n      }\n    });\n  };\n\n  _proto.walkPseudos = function walkPseudos(callback) {\n    var _this8 = this;\n\n    return this.walk(function (selector) {\n      if (selector.type === types.PSEUDO) {\n        return callback.call(_this8, selector);\n      }\n    });\n  };\n\n  _proto.walkTags = function walkTags(callback) {\n    var _this9 = this;\n\n    return this.walk(function (selector) {\n      if (selector.type === types.TAG) {\n        return callback.call(_this9, selector);\n      }\n    });\n  };\n\n  _proto.walkUniversals = function walkUniversals(callback) {\n    var _this10 = this;\n\n    return this.walk(function (selector) {\n      if (selector.type === types.UNIVERSAL) {\n        return callback.call(_this10, selector);\n      }\n    });\n  };\n\n  _proto.split = function split(callback) {\n    var _this11 = this;\n\n    var current = [];\n    return this.reduce(function (memo, node, index) {\n      var split = callback.call(_this11, node);\n      current.push(node);\n\n      if (split) {\n        memo.push(current);\n        current = [];\n      } else if (index === _this11.length - 1) {\n        memo.push(current);\n      }\n\n      return memo;\n    }, []);\n  };\n\n  _proto.map = function map(callback) {\n    return this.nodes.map(callback);\n  };\n\n  _proto.reduce = function reduce(callback, memo) {\n    return this.nodes.reduce(callback, memo);\n  };\n\n  _proto.every = function every(callback) {\n    return this.nodes.every(callback);\n  };\n\n  _proto.some = function some(callback) {\n    return this.nodes.some(callback);\n  };\n\n  _proto.filter = function filter(callback) {\n    return this.nodes.filter(callback);\n  };\n\n  _proto.sort = function sort(callback) {\n    return this.nodes.sort(callback);\n  };\n\n  _proto.toString = function toString() {\n    return this.map(String).join('');\n  };\n\n  _createClass(Container, [{\n    key: \"first\",\n    get: function get() {\n      return this.at(0);\n    }\n  }, {\n    key: \"last\",\n    get: function get() {\n      return this.at(this.length - 1);\n    }\n  }, {\n    key: \"length\",\n    get: function get() {\n      return this.nodes.length;\n    }\n  }]);\n\n  return Container;\n}(_node[\"default\"]);\n\nexports[\"default\"] = Container;\nmodule.exports = exports.default;","'use strict';\nvar $forEach = require('../internals/array-iteration').forEach;\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\n\nvar STRICT_METHOD = arrayMethodIsStrict('forEach');\n\n// `Array.prototype.forEach` method implementation\n// https://tc39.es/ecma262/#sec-array.prototype.foreach\nmodule.exports = !STRICT_METHOD ? function forEach(callbackfn /* , thisArg */) {\n  return $forEach(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n// eslint-disable-next-line es/no-array-prototype-foreach -- safe\n} : [].forEach;\n","'use strict';\nvar $ = require('../internals/export');\nvar getBuiltIn = require('../internals/get-built-in');\nvar IS_PURE = require('../internals/is-pure');\nvar NativePromiseConstructor = require('../internals/promise-native-constructor');\nvar FORCED_PROMISE_CONSTRUCTOR = require('../internals/promise-constructor-detection').CONSTRUCTOR;\nvar promiseResolve = require('../internals/promise-resolve');\n\nvar PromiseConstructorWrapper = getBuiltIn('Promise');\nvar CHECK_WRAPPER = IS_PURE && !FORCED_PROMISE_CONSTRUCTOR;\n\n// `Promise.resolve` method\n// https://tc39.es/ecma262/#sec-promise.resolve\n$({ target: 'Promise', stat: true, forced: IS_PURE || FORCED_PROMISE_CONSTRUCTOR }, {\n  resolve: function resolve(x) {\n    return promiseResolve(CHECK_WRAPPER && this === PromiseConstructorWrapper ? NativePromiseConstructor : this, x);\n  }\n});\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar fails = require('../internals/fails');\nvar isCallable = require('../internals/is-callable');\nvar hasOwn = require('../internals/has-own-property');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar CONFIGURABLE_FUNCTION_NAME = require('../internals/function-name').CONFIGURABLE;\nvar inspectSource = require('../internals/inspect-source');\nvar InternalStateModule = require('../internals/internal-state');\n\nvar enforceInternalState = InternalStateModule.enforce;\nvar getInternalState = InternalStateModule.get;\nvar $String = String;\n// eslint-disable-next-line es/no-object-defineproperty -- safe\nvar defineProperty = Object.defineProperty;\nvar stringSlice = uncurryThis(''.slice);\nvar replace = uncurryThis(''.replace);\nvar join = uncurryThis([].join);\n\nvar CONFIGURABLE_LENGTH = DESCRIPTORS && !fails(function () {\n  return defineProperty(function () { /* empty */ }, 'length', { value: 8 }).length !== 8;\n});\n\nvar TEMPLATE = String(String).split('String');\n\nvar makeBuiltIn = module.exports = function (value, name, options) {\n  if (stringSlice($String(name), 0, 7) === 'Symbol(') {\n    name = '[' + replace($String(name), /^Symbol\\(([^)]*)\\).*$/, '$1') + ']';\n  }\n  if (options && options.getter) name = 'get ' + name;\n  if (options && options.setter) name = 'set ' + name;\n  if (!hasOwn(value, 'name') || (CONFIGURABLE_FUNCTION_NAME && value.name !== name)) {\n    if (DESCRIPTORS) defineProperty(value, 'name', { value: name, configurable: true });\n    else value.name = name;\n  }\n  if (CONFIGURABLE_LENGTH && options && hasOwn(options, 'arity') && value.length !== options.arity) {\n    defineProperty(value, 'length', { value: options.arity });\n  }\n  try {\n    if (options && hasOwn(options, 'constructor') && options.constructor) {\n      if (DESCRIPTORS) defineProperty(value, 'prototype', { writable: false });\n    // in V8 ~ Chrome 53, prototypes of some methods, like `Array.prototype.values`, are non-writable\n    } else if (value.prototype) value.prototype = undefined;\n  } catch (error) { /* empty */ }\n  var state = enforceInternalState(value);\n  if (!hasOwn(state, 'source')) {\n    state.source = join(TEMPLATE, typeof name == 'string' ? name : '');\n  } return value;\n};\n\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n// eslint-disable-next-line no-extend-native -- required\nFunction.prototype.toString = makeBuiltIn(function toString() {\n  return isCallable(this) && getInternalState(this).source || inspectSource(this);\n}, 'toString');\n","\"use strict\";\n\nexports.__esModule = true;\nexports[\"default\"] = void 0;\n\nvar _cssesc = _interopRequireDefault(require(\"cssesc\"));\n\nvar _util = require(\"../util\");\n\nvar _node = _interopRequireDefault(require(\"./node\"));\n\nvar _types = require(\"./types\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nvar ClassName = /*#__PURE__*/function (_Node) {\n  _inheritsLoose(ClassName, _Node);\n\n  function ClassName(opts) {\n    var _this;\n\n    _this = _Node.call(this, opts) || this;\n    _this.type = _types.CLASS;\n    _this._constructed = true;\n    return _this;\n  }\n\n  var _proto = ClassName.prototype;\n\n  _proto.valueToString = function valueToString() {\n    return '.' + _Node.prototype.valueToString.call(this);\n  };\n\n  _createClass(ClassName, [{\n    key: \"value\",\n    get: function get() {\n      return this._value;\n    },\n    set: function set(v) {\n      if (this._constructed) {\n        var escaped = (0, _cssesc[\"default\"])(v, {\n          isIdentifier: true\n        });\n\n        if (escaped !== v) {\n          (0, _util.ensureObject)(this, \"raws\");\n          this.raws.value = escaped;\n        } else if (this.raws) {\n          delete this.raws.value;\n        }\n      }\n\n      this._value = v;\n    }\n  }]);\n\n  return ClassName;\n}(_node[\"default\"]);\n\nexports[\"default\"] = ClassName;\nmodule.exports = exports.default;","'use strict';\nvar $ = require('../internals/export');\nvar setPrototypeOf = require('../internals/object-set-prototype-of');\n\n// `Object.setPrototypeOf` method\n// https://tc39.es/ecma262/#sec-object.setprototypeof\n$({ target: 'Object', stat: true }, {\n  setPrototypeOf: setPrototypeOf\n});\n","'use strict';\n/* eslint-disable es/no-object-getownpropertynames -- safe */\nvar classof = require('../internals/classof-raw');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar $getOwnPropertyNames = require('../internals/object-get-own-property-names').f;\nvar arraySlice = require('../internals/array-slice');\n\nvar windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames\n  ? Object.getOwnPropertyNames(window) : [];\n\nvar getWindowNames = function (it) {\n  try {\n    return $getOwnPropertyNames(it);\n  } catch (error) {\n    return arraySlice(windowNames);\n  }\n};\n\n// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window\nmodule.exports.f = function getOwnPropertyNames(it) {\n  return windowNames && classof(it) === 'Window'\n    ? getWindowNames(it)\n    : $getOwnPropertyNames(toIndexedObject(it));\n};\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar hasOwn = require('../internals/has-own-property');\n\nvar FunctionPrototype = Function.prototype;\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar getDescriptor = DESCRIPTORS && Object.getOwnPropertyDescriptor;\n\nvar EXISTS = hasOwn(FunctionPrototype, 'name');\n// additional protection from minified / mangled / dropped function names\nvar PROPER = EXISTS && (function something() { /* empty */ }).name === 'something';\nvar CONFIGURABLE = EXISTS && (!DESCRIPTORS || (DESCRIPTORS && getDescriptor(FunctionPrototype, 'name').configurable));\n\nmodule.exports = {\n  EXISTS: EXISTS,\n  PROPER: PROPER,\n  CONFIGURABLE: CONFIGURABLE\n};\n","\"use strict\";\n\nexports.__esModule = true;\nexports[\"default\"] = void 0;\n\nvar _parser = _interopRequireDefault(require(\"./parser\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nvar Processor = /*#__PURE__*/function () {\n  function Processor(func, options) {\n    this.func = func || function noop() {};\n\n    this.funcRes = null;\n    this.options = options;\n  }\n\n  var _proto = Processor.prototype;\n\n  _proto._shouldUpdateSelector = function _shouldUpdateSelector(rule, options) {\n    if (options === void 0) {\n      options = {};\n    }\n\n    var merged = Object.assign({}, this.options, options);\n\n    if (merged.updateSelector === false) {\n      return false;\n    } else {\n      return typeof rule !== \"string\";\n    }\n  };\n\n  _proto._isLossy = function _isLossy(options) {\n    if (options === void 0) {\n      options = {};\n    }\n\n    var merged = Object.assign({}, this.options, options);\n\n    if (merged.lossless === false) {\n      return true;\n    } else {\n      return false;\n    }\n  };\n\n  _proto._root = function _root(rule, options) {\n    if (options === void 0) {\n      options = {};\n    }\n\n    var parser = new _parser[\"default\"](rule, this._parseOptions(options));\n    return parser.root;\n  };\n\n  _proto._parseOptions = function _parseOptions(options) {\n    return {\n      lossy: this._isLossy(options)\n    };\n  };\n\n  _proto._run = function _run(rule, options) {\n    var _this = this;\n\n    if (options === void 0) {\n      options = {};\n    }\n\n    return new Promise(function (resolve, reject) {\n      try {\n        var root = _this._root(rule, options);\n\n        Promise.resolve(_this.func(root)).then(function (transform) {\n          var string = undefined;\n\n          if (_this._shouldUpdateSelector(rule, options)) {\n            string = root.toString();\n            rule.selector = string;\n          }\n\n          return {\n            transform: transform,\n            root: root,\n            string: string\n          };\n        }).then(resolve, reject);\n      } catch (e) {\n        reject(e);\n        return;\n      }\n    });\n  };\n\n  _proto._runSync = function _runSync(rule, options) {\n    if (options === void 0) {\n      options = {};\n    }\n\n    var root = this._root(rule, options);\n\n    var transform = this.func(root);\n\n    if (transform && typeof transform.then === \"function\") {\n      throw new Error(\"Selector processor returned a promise to a synchronous call.\");\n    }\n\n    var string = undefined;\n\n    if (options.updateSelector && typeof rule !== \"string\") {\n      string = root.toString();\n      rule.selector = string;\n    }\n\n    return {\n      transform: transform,\n      root: root,\n      string: string\n    };\n  }\n  /**\n   * Process rule into a selector AST.\n   *\n   * @param rule {postcss.Rule | string} The css selector to be processed\n   * @param options The options for processing\n   * @returns {Promise<parser.Root>} The AST of the selector after processing it.\n   */\n  ;\n\n  _proto.ast = function ast(rule, options) {\n    return this._run(rule, options).then(function (result) {\n      return result.root;\n    });\n  }\n  /**\n   * Process rule into a selector AST synchronously.\n   *\n   * @param rule {postcss.Rule | string} The css selector to be processed\n   * @param options The options for processing\n   * @returns {parser.Root} The AST of the selector after processing it.\n   */\n  ;\n\n  _proto.astSync = function astSync(rule, options) {\n    return this._runSync(rule, options).root;\n  }\n  /**\n   * Process a selector into a transformed value asynchronously\n   *\n   * @param rule {postcss.Rule | string} The css selector to be processed\n   * @param options The options for processing\n   * @returns {Promise<any>} The value returned by the processor.\n   */\n  ;\n\n  _proto.transform = function transform(rule, options) {\n    return this._run(rule, options).then(function (result) {\n      return result.transform;\n    });\n  }\n  /**\n   * Process a selector into a transformed value synchronously.\n   *\n   * @param rule {postcss.Rule | string} The css selector to be processed\n   * @param options The options for processing\n   * @returns {any} The value returned by the processor.\n   */\n  ;\n\n  _proto.transformSync = function transformSync(rule, options) {\n    return this._runSync(rule, options).transform;\n  }\n  /**\n   * Process a selector into a new selector string asynchronously.\n   *\n   * @param rule {postcss.Rule | string} The css selector to be processed\n   * @param options The options for processing\n   * @returns {string} the selector after processing.\n   */\n  ;\n\n  _proto.process = function process(rule, options) {\n    return this._run(rule, options).then(function (result) {\n      return result.string || result.root.toString();\n    });\n  }\n  /**\n   * Process a selector into a new selector string synchronously.\n   *\n   * @param rule {postcss.Rule | string} The css selector to be processed\n   * @param options The options for processing\n   * @returns {string} the selector after processing.\n   */\n  ;\n\n  _proto.processSync = function processSync(rule, options) {\n    var result = this._runSync(rule, options);\n\n    return result.string || result.root.toString();\n  };\n\n  return Processor;\n}();\n\nexports[\"default\"] = Processor;\nmodule.exports = exports.default;","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nObject.defineProperty(exports, \"default\", {\n    enumerable: true,\n    get: function() {\n        return _default;\n    }\n});\nfunction createPlugin(plugin, config) {\n    return {\n        handler: plugin,\n        config\n    };\n}\ncreatePlugin.withOptions = function(pluginFunction, configFunction = ()=>({})) {\n    const optionsFunction = function(options) {\n        return {\n            __options: options,\n            handler: pluginFunction(options),\n            config: configFunction(options)\n        };\n    };\n    optionsFunction.__isOptionsFunction = true;\n    // Expose plugin dependencies so that `object-hash` returns a different\n    // value if anything here changes, to ensure a rebuild is triggered.\n    optionsFunction.__pluginFunction = pluginFunction;\n    optionsFunction.__configFunction = configFunction;\n    return optionsFunction;\n};\nconst _default = createPlugin;\n","'use strict';\nvar getBuiltIn = require('../internals/get-built-in');\n\nmodule.exports = getBuiltIn('document', 'documentElement');\n","'use strict';\nmodule.exports = {};\n","'use strict';\nvar $ = require('../internals/export');\nvar IS_PURE = require('../internals/is-pure');\nvar IS_NODE = require('../internals/environment-is-node');\nvar globalThis = require('../internals/global-this');\nvar path = require('../internals/path');\nvar call = require('../internals/function-call');\nvar defineBuiltIn = require('../internals/define-built-in');\nvar setPrototypeOf = require('../internals/object-set-prototype-of');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar setSpecies = require('../internals/set-species');\nvar aCallable = require('../internals/a-callable');\nvar isCallable = require('../internals/is-callable');\nvar isObject = require('../internals/is-object');\nvar anInstance = require('../internals/an-instance');\nvar speciesConstructor = require('../internals/species-constructor');\nvar task = require('../internals/task').set;\nvar microtask = require('../internals/microtask');\nvar hostReportErrors = require('../internals/host-report-errors');\nvar perform = require('../internals/perform');\nvar Queue = require('../internals/queue');\nvar InternalStateModule = require('../internals/internal-state');\nvar NativePromiseConstructor = require('../internals/promise-native-constructor');\nvar PromiseConstructorDetection = require('../internals/promise-constructor-detection');\nvar newPromiseCapabilityModule = require('../internals/new-promise-capability');\n\nvar PROMISE = 'Promise';\nvar FORCED_PROMISE_CONSTRUCTOR = PromiseConstructorDetection.CONSTRUCTOR;\nvar NATIVE_PROMISE_REJECTION_EVENT = PromiseConstructorDetection.REJECTION_EVENT;\nvar NATIVE_PROMISE_SUBCLASSING = PromiseConstructorDetection.SUBCLASSING;\nvar getInternalPromiseState = InternalStateModule.getterFor(PROMISE);\nvar setInternalState = InternalStateModule.set;\nvar NativePromisePrototype = NativePromiseConstructor && NativePromiseConstructor.prototype;\nvar PromiseConstructor = NativePromiseConstructor;\nvar PromisePrototype = NativePromisePrototype;\nvar TypeError = globalThis.TypeError;\nvar document = globalThis.document;\nvar process = globalThis.process;\nvar newPromiseCapability = newPromiseCapabilityModule.f;\nvar newGenericPromiseCapability = newPromiseCapability;\n\nvar DISPATCH_EVENT = !!(document && document.createEvent && globalThis.dispatchEvent);\nvar UNHANDLED_REJECTION = 'unhandledrejection';\nvar REJECTION_HANDLED = 'rejectionhandled';\nvar PENDING = 0;\nvar FULFILLED = 1;\nvar REJECTED = 2;\nvar HANDLED = 1;\nvar UNHANDLED = 2;\n\nvar Internal, OwnPromiseCapability, PromiseWrapper, nativeThen;\n\n// helpers\nvar isThenable = function (it) {\n  var then;\n  return isObject(it) && isCallable(then = it.then) ? then : false;\n};\n\nvar callReaction = function (reaction, state) {\n  var value = state.value;\n  var ok = state.state === FULFILLED;\n  var handler = ok ? reaction.ok : reaction.fail;\n  var resolve = reaction.resolve;\n  var reject = reaction.reject;\n  var domain = reaction.domain;\n  var result, then, exited;\n  try {\n    if (handler) {\n      if (!ok) {\n        if (state.rejection === UNHANDLED) onHandleUnhandled(state);\n        state.rejection = HANDLED;\n      }\n      if (handler === true) result = value;\n      else {\n        if (domain) domain.enter();\n        result = handler(value); // can throw\n        if (domain) {\n          domain.exit();\n          exited = true;\n        }\n      }\n      if (result === reaction.promise) {\n        reject(new TypeError('Promise-chain cycle'));\n      } else if (then = isThenable(result)) {\n        call(then, result, resolve, reject);\n      } else resolve(result);\n    } else reject(value);\n  } catch (error) {\n    if (domain && !exited) domain.exit();\n    reject(error);\n  }\n};\n\nvar notify = function (state, isReject) {\n  if (state.notified) return;\n  state.notified = true;\n  microtask(function () {\n    var reactions = state.reactions;\n    var reaction;\n    while (reaction = reactions.get()) {\n      callReaction(reaction, state);\n    }\n    state.notified = false;\n    if (isReject && !state.rejection) onUnhandled(state);\n  });\n};\n\nvar dispatchEvent = function (name, promise, reason) {\n  var event, handler;\n  if (DISPATCH_EVENT) {\n    event = document.createEvent('Event');\n    event.promise = promise;\n    event.reason = reason;\n    event.initEvent(name, false, true);\n    globalThis.dispatchEvent(event);\n  } else event = { promise: promise, reason: reason };\n  if (!NATIVE_PROMISE_REJECTION_EVENT && (handler = globalThis['on' + name])) handler(event);\n  else if (name === UNHANDLED_REJECTION) hostReportErrors('Unhandled promise rejection', reason);\n};\n\nvar onUnhandled = function (state) {\n  call(task, globalThis, function () {\n    var promise = state.facade;\n    var value = state.value;\n    var IS_UNHANDLED = isUnhandled(state);\n    var result;\n    if (IS_UNHANDLED) {\n      result = perform(function () {\n        if (IS_NODE) {\n          process.emit('unhandledRejection', value, promise);\n        } else dispatchEvent(UNHANDLED_REJECTION, promise, value);\n      });\n      // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should\n      state.rejection = IS_NODE || isUnhandled(state) ? UNHANDLED : HANDLED;\n      if (result.error) throw result.value;\n    }\n  });\n};\n\nvar isUnhandled = function (state) {\n  return state.rejection !== HANDLED && !state.parent;\n};\n\nvar onHandleUnhandled = function (state) {\n  call(task, globalThis, function () {\n    var promise = state.facade;\n    if (IS_NODE) {\n      process.emit('rejectionHandled', promise);\n    } else dispatchEvent(REJECTION_HANDLED, promise, state.value);\n  });\n};\n\nvar bind = function (fn, state, unwrap) {\n  return function (value) {\n    fn(state, value, unwrap);\n  };\n};\n\nvar internalReject = function (state, value, unwrap) {\n  if (state.done) return;\n  state.done = true;\n  if (unwrap) state = unwrap;\n  state.value = value;\n  state.state = REJECTED;\n  notify(state, true);\n};\n\nvar internalResolve = function (state, value, unwrap) {\n  if (state.done) return;\n  state.done = true;\n  if (unwrap) state = unwrap;\n  try {\n    if (state.facade === value) throw new TypeError(\"Promise can't be resolved itself\");\n    var then = isThenable(value);\n    if (then) {\n      microtask(function () {\n        var wrapper = { done: false };\n        try {\n          call(then, value,\n            bind(internalResolve, wrapper, state),\n            bind(internalReject, wrapper, state)\n          );\n        } catch (error) {\n          internalReject(wrapper, error, state);\n        }\n      });\n    } else {\n      state.value = value;\n      state.state = FULFILLED;\n      notify(state, false);\n    }\n  } catch (error) {\n    internalReject({ done: false }, error, state);\n  }\n};\n\n// constructor polyfill\nif (FORCED_PROMISE_CONSTRUCTOR) {\n  // 25.4.3.1 Promise(executor)\n  PromiseConstructor = function Promise(executor) {\n    anInstance(this, PromisePrototype);\n    aCallable(executor);\n    call(Internal, this);\n    var state = getInternalPromiseState(this);\n    try {\n      executor(bind(internalResolve, state), bind(internalReject, state));\n    } catch (error) {\n      internalReject(state, error);\n    }\n  };\n\n  PromisePrototype = PromiseConstructor.prototype;\n\n  // eslint-disable-next-line no-unused-vars -- required for `.length`\n  Internal = function Promise(executor) {\n    setInternalState(this, {\n      type: PROMISE,\n      done: false,\n      notified: false,\n      parent: false,\n      reactions: new Queue(),\n      rejection: false,\n      state: PENDING,\n      value: null\n    });\n  };\n\n  // `Promise.prototype.then` method\n  // https://tc39.es/ecma262/#sec-promise.prototype.then\n  Internal.prototype = defineBuiltIn(PromisePrototype, 'then', function then(onFulfilled, onRejected) {\n    var state = getInternalPromiseState(this);\n    var reaction = newPromiseCapability(speciesConstructor(this, PromiseConstructor));\n    state.parent = true;\n    reaction.ok = isCallable(onFulfilled) ? onFulfilled : true;\n    reaction.fail = isCallable(onRejected) && onRejected;\n    reaction.domain = IS_NODE ? process.domain : undefined;\n    if (state.state === PENDING) state.reactions.add(reaction);\n    else microtask(function () {\n      callReaction(reaction, state);\n    });\n    return reaction.promise;\n  });\n\n  OwnPromiseCapability = function () {\n    var promise = new Internal();\n    var state = getInternalPromiseState(promise);\n    this.promise = promise;\n    this.resolve = bind(internalResolve, state);\n    this.reject = bind(internalReject, state);\n  };\n\n  newPromiseCapabilityModule.f = newPromiseCapability = function (C) {\n    return C === PromiseConstructor || C === PromiseWrapper\n      ? new OwnPromiseCapability(C)\n      : newGenericPromiseCapability(C);\n  };\n\n  if (!IS_PURE && isCallable(NativePromiseConstructor) && NativePromisePrototype !== Object.prototype) {\n    nativeThen = NativePromisePrototype.then;\n\n    if (!NATIVE_PROMISE_SUBCLASSING) {\n      // make `Promise#then` return a polyfilled `Promise` for native promise-based APIs\n      defineBuiltIn(NativePromisePrototype, 'then', function then(onFulfilled, onRejected) {\n        var that = this;\n        return new PromiseConstructor(function (resolve, reject) {\n          call(nativeThen, that, resolve, reject);\n        }).then(onFulfilled, onRejected);\n      // https://github.com/zloirock/core-js/issues/640\n      }, { unsafe: true });\n    }\n\n    // make `.constructor === Promise` work for native promise-based APIs\n    try {\n      delete NativePromisePrototype.constructor;\n    } catch (error) { /* empty */ }\n\n    // make `instanceof Promise` work for native promise-based APIs\n    if (setPrototypeOf) {\n      setPrototypeOf(NativePromisePrototype, PromisePrototype);\n    }\n  }\n}\n\n// `Promise` constructor\n// https://tc39.es/ecma262/#sec-promise-executor\n$({ global: true, constructor: true, wrap: true, forced: FORCED_PROMISE_CONSTRUCTOR }, {\n  Promise: PromiseConstructor\n});\n\nPromiseWrapper = path.Promise;\n\nsetToStringTag(PromiseConstructor, PROMISE, false, true);\nsetSpecies(PROMISE);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nObject.defineProperty(exports, \"default\", {\n    enumerable: true,\n    get: function() {\n        return isPlainObject;\n    }\n});\nfunction isPlainObject(value) {\n    if (Object.prototype.toString.call(value) !== \"[object Object]\") {\n        return false;\n    }\n    const prototype = Object.getPrototypeOf(value);\n    return prototype === null || Object.getPrototypeOf(prototype) === null;\n}\n","'use strict';\nvar call = require('../internals/function-call');\n\nmodule.exports = function (record, fn, ITERATOR_INSTEAD_OF_RECORD) {\n  var iterator = ITERATOR_INSTEAD_OF_RECORD ? record : record.iterator;\n  var next = record.next;\n  var step, result;\n  while (!(step = call(next, iterator)).done) {\n    result = fn(step.value);\n    if (result !== undefined) return result;\n  }\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nfunction _export(target, all) {\n    for(var name in all)Object.defineProperty(target, name, {\n        enumerable: true,\n        get: all[name]\n    });\n}\n_export(exports, {\n    updateAllClasses: function() {\n        return updateAllClasses;\n    },\n    asValue: function() {\n        return asValue;\n    },\n    parseColorFormat: function() {\n        return parseColorFormat;\n    },\n    asColor: function() {\n        return asColor;\n    },\n    asLookupValue: function() {\n        return asLookupValue;\n    },\n    typeMap: function() {\n        return typeMap;\n    },\n    coerceValue: function() {\n        return coerceValue;\n    },\n    getMatchingTypes: function() {\n        return getMatchingTypes;\n    }\n});\nconst _escapeCommas = /*#__PURE__*/ _interop_require_default(require(\"./escapeCommas\"));\nconst _withAlphaVariable = require(\"./withAlphaVariable\");\nconst _dataTypes = require(\"./dataTypes\");\nconst _negateValue = /*#__PURE__*/ _interop_require_default(require(\"./negateValue\"));\nconst _validateFormalSyntax = require(\"./validateFormalSyntax\");\nconst _featureFlags = require(\"../featureFlags.js\");\nfunction _interop_require_default(obj) {\n    return obj && obj.__esModule ? obj : {\n        default: obj\n    };\n}\nfunction updateAllClasses(selectors, updateClass) {\n    selectors.walkClasses((sel)=>{\n        sel.value = updateClass(sel.value);\n        if (sel.raws && sel.raws.value) {\n            sel.raws.value = (0, _escapeCommas.default)(sel.raws.value);\n        }\n    });\n}\nfunction resolveArbitraryValue(modifier, validate) {\n    if (!isArbitraryValue(modifier)) {\n        return undefined;\n    }\n    let value = modifier.slice(1, -1);\n    if (!validate(value)) {\n        return undefined;\n    }\n    return (0, _dataTypes.normalize)(value);\n}\nfunction asNegativeValue(modifier, lookup = {}, validate) {\n    let positiveValue = lookup[modifier];\n    if (positiveValue !== undefined) {\n        return (0, _negateValue.default)(positiveValue);\n    }\n    if (isArbitraryValue(modifier)) {\n        let resolved = resolveArbitraryValue(modifier, validate);\n        if (resolved === undefined) {\n            return undefined;\n        }\n        return (0, _negateValue.default)(resolved);\n    }\n}\nfunction asValue(modifier, options = {}, { validate =()=>true  } = {}) {\n    var _options_values;\n    let value = (_options_values = options.values) === null || _options_values === void 0 ? void 0 : _options_values[modifier];\n    if (value !== undefined) {\n        return value;\n    }\n    if (options.supportsNegativeValues && modifier.startsWith(\"-\")) {\n        return asNegativeValue(modifier.slice(1), options.values, validate);\n    }\n    return resolveArbitraryValue(modifier, validate);\n}\nfunction isArbitraryValue(input) {\n    return input.startsWith(\"[\") && input.endsWith(\"]\");\n}\nfunction splitUtilityModifier(modifier) {\n    let slashIdx = modifier.lastIndexOf(\"/\");\n    // If the `/` is inside an arbitrary, we want to find the previous one if any\n    // This logic probably isn't perfect but it should work for most cases\n    let arbitraryStartIdx = modifier.lastIndexOf(\"[\", slashIdx);\n    let arbitraryEndIdx = modifier.indexOf(\"]\", slashIdx);\n    let isNextToArbitrary = modifier[slashIdx - 1] === \"]\" || modifier[slashIdx + 1] === \"[\";\n    // Backtrack to the previous `/` if the one we found was inside an arbitrary\n    if (!isNextToArbitrary) {\n        if (arbitraryStartIdx !== -1 && arbitraryEndIdx !== -1) {\n            if (arbitraryStartIdx < slashIdx && slashIdx < arbitraryEndIdx) {\n                slashIdx = modifier.lastIndexOf(\"/\", arbitraryStartIdx);\n            }\n        }\n    }\n    if (slashIdx === -1 || slashIdx === modifier.length - 1) {\n        return [\n            modifier,\n            undefined\n        ];\n    }\n    let arbitrary = isArbitraryValue(modifier);\n    // The modifier could be of the form `[foo]/[bar]`\n    // We want to handle this case properly\n    // without affecting `[foo/bar]`\n    if (arbitrary && !modifier.includes(\"]/[\")) {\n        return [\n            modifier,\n            undefined\n        ];\n    }\n    return [\n        modifier.slice(0, slashIdx),\n        modifier.slice(slashIdx + 1)\n    ];\n}\nfunction parseColorFormat(value) {\n    if (typeof value === \"string\" && value.includes(\"<alpha-value>\")) {\n        let oldValue = value;\n        return ({ opacityValue =1  })=>oldValue.replace(/<alpha-value>/g, opacityValue);\n    }\n    return value;\n}\nfunction unwrapArbitraryModifier(modifier) {\n    return (0, _dataTypes.normalize)(modifier.slice(1, -1));\n}\nfunction asColor(modifier, options = {}, { tailwindConfig ={}  } = {}) {\n    var _options_values;\n    if (((_options_values = options.values) === null || _options_values === void 0 ? void 0 : _options_values[modifier]) !== undefined) {\n        var _options_values1;\n        return parseColorFormat((_options_values1 = options.values) === null || _options_values1 === void 0 ? void 0 : _options_values1[modifier]);\n    }\n    // TODO: Hoist this up to getMatchingTypes or something\n    // We do this here because we need the alpha value (if any)\n    let [color, alpha] = splitUtilityModifier(modifier);\n    if (alpha !== undefined) {\n        var _options_values2, _tailwindConfig_theme, _tailwindConfig_theme_opacity;\n        var _options_values_color;\n        let normalizedColor = (_options_values_color = (_options_values2 = options.values) === null || _options_values2 === void 0 ? void 0 : _options_values2[color]) !== null && _options_values_color !== void 0 ? _options_values_color : isArbitraryValue(color) ? color.slice(1, -1) : undefined;\n        if (normalizedColor === undefined) {\n            return undefined;\n        }\n        normalizedColor = parseColorFormat(normalizedColor);\n        if (isArbitraryValue(alpha)) {\n            return (0, _withAlphaVariable.withAlphaValue)(normalizedColor, unwrapArbitraryModifier(alpha));\n        }\n        if (((_tailwindConfig_theme = tailwindConfig.theme) === null || _tailwindConfig_theme === void 0 ? void 0 : (_tailwindConfig_theme_opacity = _tailwindConfig_theme.opacity) === null || _tailwindConfig_theme_opacity === void 0 ? void 0 : _tailwindConfig_theme_opacity[alpha]) === undefined) {\n            return undefined;\n        }\n        return (0, _withAlphaVariable.withAlphaValue)(normalizedColor, tailwindConfig.theme.opacity[alpha]);\n    }\n    return asValue(modifier, options, {\n        validate: _dataTypes.color\n    });\n}\nfunction asLookupValue(modifier, options = {}) {\n    var _options_values;\n    return (_options_values = options.values) === null || _options_values === void 0 ? void 0 : _options_values[modifier];\n}\nfunction guess(validate) {\n    return (modifier, options)=>{\n        return asValue(modifier, options, {\n            validate\n        });\n    };\n}\nlet typeMap = {\n    any: asValue,\n    color: asColor,\n    url: guess(_dataTypes.url),\n    image: guess(_dataTypes.image),\n    length: guess(_dataTypes.length),\n    percentage: guess(_dataTypes.percentage),\n    position: guess(_dataTypes.position),\n    lookup: asLookupValue,\n    \"generic-name\": guess(_dataTypes.genericName),\n    \"family-name\": guess(_dataTypes.familyName),\n    number: guess(_dataTypes.number),\n    \"line-width\": guess(_dataTypes.lineWidth),\n    \"absolute-size\": guess(_dataTypes.absoluteSize),\n    \"relative-size\": guess(_dataTypes.relativeSize),\n    shadow: guess(_dataTypes.shadow),\n    size: guess(_validateFormalSyntax.backgroundSize)\n};\nlet supportedTypes = Object.keys(typeMap);\nfunction splitAtFirst(input, delim) {\n    let idx = input.indexOf(delim);\n    if (idx === -1) return [\n        undefined,\n        input\n    ];\n    return [\n        input.slice(0, idx),\n        input.slice(idx + 1)\n    ];\n}\nfunction coerceValue(types, modifier, options, tailwindConfig) {\n    if (options.values && modifier in options.values) {\n        for (let { type  } of types !== null && types !== void 0 ? types : []){\n            let result = typeMap[type](modifier, options, {\n                tailwindConfig\n            });\n            if (result === undefined) {\n                continue;\n            }\n            return [\n                result,\n                type,\n                null\n            ];\n        }\n    }\n    if (isArbitraryValue(modifier)) {\n        let arbitraryValue = modifier.slice(1, -1);\n        let [explicitType, value] = splitAtFirst(arbitraryValue, \":\");\n        // It could be that this resolves to `url(https` which is not a valid\n        // identifier. We currently only support \"simple\" words with dashes or\n        // underscores. E.g.: family-name\n        if (!/^[\\w-_]+$/g.test(explicitType)) {\n            value = arbitraryValue;\n        } else if (explicitType !== undefined && !supportedTypes.includes(explicitType)) {\n            return [];\n        }\n        if (value.length > 0 && supportedTypes.includes(explicitType)) {\n            return [\n                asValue(`[${value}]`, options),\n                explicitType,\n                null\n            ];\n        }\n    }\n    let matches = getMatchingTypes(types, modifier, options, tailwindConfig);\n    // Find first matching type\n    for (let match of matches){\n        return match;\n    }\n    return [];\n}\nfunction* getMatchingTypes(types, rawModifier, options, tailwindConfig) {\n    let modifiersEnabled = (0, _featureFlags.flagEnabled)(tailwindConfig, \"generalizedModifiers\");\n    let [modifier, utilityModifier] = splitUtilityModifier(rawModifier);\n    let canUseUtilityModifier = modifiersEnabled && options.modifiers != null && (options.modifiers === \"any\" || typeof options.modifiers === \"object\" && (utilityModifier && isArbitraryValue(utilityModifier) || utilityModifier in options.modifiers));\n    if (!canUseUtilityModifier) {\n        modifier = rawModifier;\n        utilityModifier = undefined;\n    }\n    if (utilityModifier !== undefined && modifier === \"\") {\n        modifier = \"DEFAULT\";\n    }\n    // Check the full value first\n    // TODO: Move to asValue… somehow\n    if (utilityModifier !== undefined) {\n        if (typeof options.modifiers === \"object\") {\n            var _options_modifiers;\n            var _options_modifiers_utilityModifier;\n            let configValue = (_options_modifiers_utilityModifier = (_options_modifiers = options.modifiers) === null || _options_modifiers === void 0 ? void 0 : _options_modifiers[utilityModifier]) !== null && _options_modifiers_utilityModifier !== void 0 ? _options_modifiers_utilityModifier : null;\n            if (configValue !== null) {\n                utilityModifier = configValue;\n            } else if (isArbitraryValue(utilityModifier)) {\n                utilityModifier = unwrapArbitraryModifier(utilityModifier);\n            }\n        }\n    }\n    for (let { type  } of types !== null && types !== void 0 ? types : []){\n        let result = typeMap[type](modifier, options, {\n            tailwindConfig\n        });\n        if (result === undefined) {\n            continue;\n        }\n        yield [\n            result,\n            type,\n            utilityModifier !== null && utilityModifier !== void 0 ? utilityModifier : null\n        ];\n    }\n}\n","'use strict';\nvar path = require('../internals/path');\nvar hasOwn = require('../internals/has-own-property');\nvar wrappedWellKnownSymbolModule = require('../internals/well-known-symbol-wrapped');\nvar defineProperty = require('../internals/object-define-property').f;\n\nmodule.exports = function (NAME) {\n  var Symbol = path.Symbol || (path.Symbol = {});\n  if (!hasOwn(Symbol, NAME)) defineProperty(Symbol, NAME, {\n    value: wrappedWellKnownSymbolModule.f(NAME)\n  });\n};\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar toLength = require('../internals/to-length');\nvar toString = require('../internals/to-string');\nvar $repeat = require('../internals/string-repeat');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n\nvar repeat = uncurryThis($repeat);\nvar stringSlice = uncurryThis(''.slice);\nvar ceil = Math.ceil;\n\n// `String.prototype.{ padStart, padEnd }` methods implementation\nvar createMethod = function (IS_END) {\n  return function ($this, maxLength, fillString) {\n    var S = toString(requireObjectCoercible($this));\n    var intMaxLength = toLength(maxLength);\n    var stringLength = S.length;\n    var fillStr = fillString === undefined ? ' ' : toString(fillString);\n    var fillLen, stringFiller;\n    if (intMaxLength <= stringLength || fillStr === '') return S;\n    fillLen = intMaxLength - stringLength;\n    stringFiller = repeat(fillStr, ceil(fillLen / fillStr.length));\n    if (stringFiller.length > fillLen) stringFiller = stringSlice(stringFiller, 0, fillLen);\n    return IS_END ? S + stringFiller : stringFiller + S;\n  };\n};\n\nmodule.exports = {\n  // `String.prototype.padStart` method\n  // https://tc39.es/ecma262/#sec-string.prototype.padstart\n  start: createMethod(false),\n  // `String.prototype.padEnd` method\n  // https://tc39.es/ecma262/#sec-string.prototype.padend\n  end: createMethod(true)\n};\n","'use strict';\nvar NativePromiseConstructor = require('../internals/promise-native-constructor');\nvar checkCorrectnessOfIteration = require('../internals/check-correctness-of-iteration');\nvar FORCED_PROMISE_CONSTRUCTOR = require('../internals/promise-constructor-detection').CONSTRUCTOR;\n\nmodule.exports = FORCED_PROMISE_CONSTRUCTOR || !checkCorrectnessOfIteration(function (iterable) {\n  NativePromiseConstructor.all(iterable).then(undefined, function () { /* empty */ });\n});\n","'use strict';\nvar globalThis = require('../internals/global-this');\n\nmodule.exports = globalThis.Promise;\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar aCallable = require('../internals/a-callable');\nvar isObject = require('../internals/is-object');\nvar hasOwn = require('../internals/has-own-property');\nvar arraySlice = require('../internals/array-slice');\nvar NATIVE_BIND = require('../internals/function-bind-native');\n\nvar $Function = Function;\nvar concat = uncurryThis([].concat);\nvar join = uncurryThis([].join);\nvar factories = {};\n\nvar construct = function (C, argsLength, args) {\n  if (!hasOwn(factories, argsLength)) {\n    var list = [];\n    var i = 0;\n    for (; i < argsLength; i++) list[i] = 'a[' + i + ']';\n    factories[argsLength] = $Function('C,a', 'return new C(' + join(list, ',') + ')');\n  } return factories[argsLength](C, args);\n};\n\n// `Function.prototype.bind` method implementation\n// https://tc39.es/ecma262/#sec-function.prototype.bind\n// eslint-disable-next-line es/no-function-prototype-bind -- detection\nmodule.exports = NATIVE_BIND ? $Function.bind : function bind(that /* , ...args */) {\n  var F = aCallable(this);\n  var Prototype = F.prototype;\n  var partArgs = arraySlice(arguments, 1);\n  var boundFunction = function bound(/* args... */) {\n    var args = concat(partArgs, arraySlice(arguments));\n    return this instanceof boundFunction ? construct(F, args.length, args) : F.apply(that, args);\n  };\n  if (isObject(Prototype)) boundFunction.prototype = Prototype;\n  return boundFunction;\n};\n","\"use strict\";\n\nexports.__esModule = true;\nexports[\"default\"] = void 0;\n\nvar _node = _interopRequireDefault(require(\"./node\"));\n\nvar _types = require(\"./types\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nfunction _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nvar Comment = /*#__PURE__*/function (_Node) {\n  _inheritsLoose(Comment, _Node);\n\n  function Comment(opts) {\n    var _this;\n\n    _this = _Node.call(this, opts) || this;\n    _this.type = _types.COMMENT;\n    return _this;\n  }\n\n  return Comment;\n}(_node[\"default\"]);\n\nexports[\"default\"] = Comment;\nmodule.exports = exports.default;","'use strict';\nvar fails = require('../internals/fails');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar V8_VERSION = require('../internals/environment-v8-version');\n\nvar SPECIES = wellKnownSymbol('species');\n\nmodule.exports = function (METHOD_NAME) {\n  // We can't use this feature detection in V8 since it causes\n  // deoptimization and serious performance degradation\n  // https://github.com/zloirock/core-js/issues/677\n  return V8_VERSION >= 51 || !fails(function () {\n    var array = [];\n    var constructor = array.constructor = {};\n    constructor[SPECIES] = function () {\n      return { foo: 1 };\n    };\n    return array[METHOD_NAME](Boolean).foo !== 1;\n  });\n};\n","'use strict';\nvar fails = require('../internals/fails');\n\nmodule.exports = !fails(function () {\n  // eslint-disable-next-line es/no-function-prototype-bind -- safe\n  var test = (function () { /* empty */ }).bind();\n  // eslint-disable-next-line no-prototype-builtins -- safe\n  return typeof test != 'function' || test.hasOwnProperty('prototype');\n});\n","'use strict';\nvar classof = require('../internals/classof');\n\nvar $String = String;\n\nmodule.exports = function (argument) {\n  if (classof(argument) === 'Symbol') throw new TypeError('Cannot convert a Symbol value to a string');\n  return $String(argument);\n};\n","'use strict';\nvar isPrototypeOf = require('../internals/object-is-prototype-of');\n\nvar $TypeError = TypeError;\n\nmodule.exports = function (it, Prototype) {\n  if (isPrototypeOf(Prototype, it)) return it;\n  throw new $TypeError('Incorrect invocation');\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nObject.defineProperty(exports, \"normalizeConfig\", {\n    enumerable: true,\n    get: function() {\n        return normalizeConfig;\n    }\n});\nconst _featureFlags = require(\"../featureFlags\");\nconst _log = /*#__PURE__*/ _interop_require_wildcard(require(\"./log\"));\nfunction _getRequireWildcardCache(nodeInterop) {\n    if (typeof WeakMap !== \"function\") return null;\n    var cacheBabelInterop = new WeakMap();\n    var cacheNodeInterop = new WeakMap();\n    return (_getRequireWildcardCache = function(nodeInterop) {\n        return nodeInterop ? cacheNodeInterop : cacheBabelInterop;\n    })(nodeInterop);\n}\nfunction _interop_require_wildcard(obj, nodeInterop) {\n    if (!nodeInterop && obj && obj.__esModule) {\n        return obj;\n    }\n    if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") {\n        return {\n            default: obj\n        };\n    }\n    var cache = _getRequireWildcardCache(nodeInterop);\n    if (cache && cache.has(obj)) {\n        return cache.get(obj);\n    }\n    var newObj = {};\n    var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;\n    for(var key in obj){\n        if (key !== \"default\" && Object.prototype.hasOwnProperty.call(obj, key)) {\n            var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;\n            if (desc && (desc.get || desc.set)) {\n                Object.defineProperty(newObj, key, desc);\n            } else {\n                newObj[key] = obj[key];\n            }\n        }\n    }\n    newObj.default = obj;\n    if (cache) {\n        cache.set(obj, newObj);\n    }\n    return newObj;\n}\nfunction normalizeConfig(config) {\n    // Quick structure validation\n    /**\n   * type FilePath = string\n   * type RawFile = { raw: string, extension?: string }\n   * type ExtractorFn = (content: string) => Array<string>\n   * type TransformerFn = (content: string) => string\n   *\n   * type Content =\n   *   | Array<FilePath | RawFile>\n   *   | {\n   *       files: Array<FilePath | RawFile>,\n   *       extract?: ExtractorFn | { [extension: string]: ExtractorFn }\n   *       transform?: TransformerFn | { [extension: string]: TransformerFn }\n   *   }\n   */ let valid = (()=>{\n        // `config.purge` should not exist anymore\n        if (config.purge) {\n            return false;\n        }\n        // `config.content` should exist\n        if (!config.content) {\n            return false;\n        }\n        // `config.content` should be an object or an array\n        if (!Array.isArray(config.content) && !(typeof config.content === \"object\" && config.content !== null)) {\n            return false;\n        }\n        // When `config.content` is an array, it should consist of FilePaths or RawFiles\n        if (Array.isArray(config.content)) {\n            return config.content.every((path)=>{\n                // `path` can be a string\n                if (typeof path === \"string\") return true;\n                // `path` can be an object { raw: string, extension?: string }\n                // `raw` must be a string\n                if (typeof (path === null || path === void 0 ? void 0 : path.raw) !== \"string\") return false;\n                // `extension` (if provided) should also be a string\n                if ((path === null || path === void 0 ? void 0 : path.extension) && typeof (path === null || path === void 0 ? void 0 : path.extension) !== \"string\") {\n                    return false;\n                }\n                return true;\n            });\n        }\n        // When `config.content` is an object\n        if (typeof config.content === \"object\" && config.content !== null) {\n            // Only `files`, `relative`, `extract`, and `transform` can exist in `config.content`\n            if (Object.keys(config.content).some((key)=>![\n                    \"files\",\n                    \"relative\",\n                    \"extract\",\n                    \"transform\"\n                ].includes(key))) {\n                return false;\n            }\n            // `config.content.files` should exist of FilePaths or RawFiles\n            if (Array.isArray(config.content.files)) {\n                if (!config.content.files.every((path)=>{\n                    // `path` can be a string\n                    if (typeof path === \"string\") return true;\n                    // `path` can be an object { raw: string, extension?: string }\n                    // `raw` must be a string\n                    if (typeof (path === null || path === void 0 ? void 0 : path.raw) !== \"string\") return false;\n                    // `extension` (if provided) should also be a string\n                    if ((path === null || path === void 0 ? void 0 : path.extension) && typeof (path === null || path === void 0 ? void 0 : path.extension) !== \"string\") {\n                        return false;\n                    }\n                    return true;\n                })) {\n                    return false;\n                }\n                // `config.content.extract` is optional, and can be a Function or a Record<String, Function>\n                if (typeof config.content.extract === \"object\") {\n                    for (let value of Object.values(config.content.extract)){\n                        if (typeof value !== \"function\") {\n                            return false;\n                        }\n                    }\n                } else if (!(config.content.extract === undefined || typeof config.content.extract === \"function\")) {\n                    return false;\n                }\n                // `config.content.transform` is optional, and can be a Function or a Record<String, Function>\n                if (typeof config.content.transform === \"object\") {\n                    for (let value of Object.values(config.content.transform)){\n                        if (typeof value !== \"function\") {\n                            return false;\n                        }\n                    }\n                } else if (!(config.content.transform === undefined || typeof config.content.transform === \"function\")) {\n                    return false;\n                }\n                // `config.content.relative` is optional and can be a boolean\n                if (typeof config.content.relative !== \"boolean\" && typeof config.content.relative !== \"undefined\") {\n                    return false;\n                }\n            }\n            return true;\n        }\n        return false;\n    })();\n    if (!valid) {\n        _log.default.warn(\"purge-deprecation\", [\n            \"The `purge`/`content` options have changed in Tailwind CSS v3.0.\",\n            \"Update your configuration file to eliminate this warning.\",\n            \"https://tailwindcss.com/docs/upgrade-guide#configure-content-sources\"\n        ]);\n    }\n    // Normalize the `safelist`\n    config.safelist = (()=>{\n        var _purge_options;\n        let { content , purge , safelist  } = config;\n        if (Array.isArray(safelist)) return safelist;\n        if (Array.isArray(content === null || content === void 0 ? void 0 : content.safelist)) return content.safelist;\n        if (Array.isArray(purge === null || purge === void 0 ? void 0 : purge.safelist)) return purge.safelist;\n        if (Array.isArray(purge === null || purge === void 0 ? void 0 : (_purge_options = purge.options) === null || _purge_options === void 0 ? void 0 : _purge_options.safelist)) return purge.options.safelist;\n        return [];\n    })();\n    // Normalize the `blocklist`\n    config.blocklist = (()=>{\n        let { blocklist  } = config;\n        if (Array.isArray(blocklist)) {\n            if (blocklist.every((item)=>typeof item === \"string\")) {\n                return blocklist;\n            }\n            _log.default.warn(\"blocklist-invalid\", [\n                \"The `blocklist` option must be an array of strings.\",\n                \"https://tailwindcss.com/docs/content-configuration#discarding-classes\"\n            ]);\n        }\n        return [];\n    })();\n    // Normalize prefix option\n    if (typeof config.prefix === \"function\") {\n        _log.default.warn(\"prefix-function\", [\n            \"As of Tailwind CSS v3.0, `prefix` cannot be a function.\",\n            \"Update `prefix` in your configuration to be a string to eliminate this warning.\",\n            \"https://tailwindcss.com/docs/upgrade-guide#prefix-cannot-be-a-function\"\n        ]);\n        config.prefix = \"\";\n    } else {\n        var _config_prefix;\n        config.prefix = (_config_prefix = config.prefix) !== null && _config_prefix !== void 0 ? _config_prefix : \"\";\n    }\n    // Normalize the `content`\n    config.content = {\n        relative: (()=>{\n            let { content  } = config;\n            if (content === null || content === void 0 ? void 0 : content.relative) {\n                return content.relative;\n            }\n            return (0, _featureFlags.flagEnabled)(config, \"relativeContentPathsByDefault\");\n        })(),\n        files: (()=>{\n            let { content , purge  } = config;\n            if (Array.isArray(purge)) return purge;\n            if (Array.isArray(purge === null || purge === void 0 ? void 0 : purge.content)) return purge.content;\n            if (Array.isArray(content)) return content;\n            if (Array.isArray(content === null || content === void 0 ? void 0 : content.content)) return content.content;\n            if (Array.isArray(content === null || content === void 0 ? void 0 : content.files)) return content.files;\n            return [];\n        })(),\n        extract: (()=>{\n            let extract = (()=>{\n                var _config_purge, _config_content, _config_purge1, _config_purge_extract, _config_content1, _config_content_extract, _config_purge2, _config_purge_options, _config_content2, _config_content_options;\n                if ((_config_purge = config.purge) === null || _config_purge === void 0 ? void 0 : _config_purge.extract) return config.purge.extract;\n                if ((_config_content = config.content) === null || _config_content === void 0 ? void 0 : _config_content.extract) return config.content.extract;\n                if ((_config_purge1 = config.purge) === null || _config_purge1 === void 0 ? void 0 : (_config_purge_extract = _config_purge1.extract) === null || _config_purge_extract === void 0 ? void 0 : _config_purge_extract.DEFAULT) return config.purge.extract.DEFAULT;\n                if ((_config_content1 = config.content) === null || _config_content1 === void 0 ? void 0 : (_config_content_extract = _config_content1.extract) === null || _config_content_extract === void 0 ? void 0 : _config_content_extract.DEFAULT) return config.content.extract.DEFAULT;\n                if ((_config_purge2 = config.purge) === null || _config_purge2 === void 0 ? void 0 : (_config_purge_options = _config_purge2.options) === null || _config_purge_options === void 0 ? void 0 : _config_purge_options.extractors) return config.purge.options.extractors;\n                if ((_config_content2 = config.content) === null || _config_content2 === void 0 ? void 0 : (_config_content_options = _config_content2.options) === null || _config_content_options === void 0 ? void 0 : _config_content_options.extractors) return config.content.options.extractors;\n                return {};\n            })();\n            let extractors = {};\n            let defaultExtractor = (()=>{\n                var _config_purge, _config_purge_options, _config_content, _config_content_options;\n                if ((_config_purge = config.purge) === null || _config_purge === void 0 ? void 0 : (_config_purge_options = _config_purge.options) === null || _config_purge_options === void 0 ? void 0 : _config_purge_options.defaultExtractor) {\n                    return config.purge.options.defaultExtractor;\n                }\n                if ((_config_content = config.content) === null || _config_content === void 0 ? void 0 : (_config_content_options = _config_content.options) === null || _config_content_options === void 0 ? void 0 : _config_content_options.defaultExtractor) {\n                    return config.content.options.defaultExtractor;\n                }\n                return undefined;\n            })();\n            if (defaultExtractor !== undefined) {\n                extractors.DEFAULT = defaultExtractor;\n            }\n            // Functions\n            if (typeof extract === \"function\") {\n                extractors.DEFAULT = extract;\n            } else if (Array.isArray(extract)) {\n                for (let { extensions , extractor  } of extract !== null && extract !== void 0 ? extract : []){\n                    for (let extension of extensions){\n                        extractors[extension] = extractor;\n                    }\n                }\n            } else if (typeof extract === \"object\" && extract !== null) {\n                Object.assign(extractors, extract);\n            }\n            return extractors;\n        })(),\n        transform: (()=>{\n            let transform = (()=>{\n                var _config_purge, _config_content, _config_purge1, _config_purge_transform, _config_content1, _config_content_transform;\n                if ((_config_purge = config.purge) === null || _config_purge === void 0 ? void 0 : _config_purge.transform) return config.purge.transform;\n                if ((_config_content = config.content) === null || _config_content === void 0 ? void 0 : _config_content.transform) return config.content.transform;\n                if ((_config_purge1 = config.purge) === null || _config_purge1 === void 0 ? void 0 : (_config_purge_transform = _config_purge1.transform) === null || _config_purge_transform === void 0 ? void 0 : _config_purge_transform.DEFAULT) return config.purge.transform.DEFAULT;\n                if ((_config_content1 = config.content) === null || _config_content1 === void 0 ? void 0 : (_config_content_transform = _config_content1.transform) === null || _config_content_transform === void 0 ? void 0 : _config_content_transform.DEFAULT) return config.content.transform.DEFAULT;\n                return {};\n            })();\n            let transformers = {};\n            if (typeof transform === \"function\") {\n                transformers.DEFAULT = transform;\n            } else if (typeof transform === \"object\" && transform !== null) {\n                Object.assign(transformers, transform);\n            }\n            return transformers;\n        })()\n    };\n    // Validate globs to prevent bogus globs.\n    // E.g.: `./src/*.{html}` is invalid, the `{html}` should just be `html`\n    for (let file of config.content.files){\n        if (typeof file === \"string\" && /{([^,]*?)}/g.test(file)) {\n            _log.default.warn(\"invalid-glob-braces\", [\n                `The glob pattern ${(0, _log.dim)(file)} in your Tailwind CSS configuration is invalid.`,\n                `Update it to ${(0, _log.dim)(file.replace(/{([^,]*?)}/g, \"$1\"))} to silence this warning.`\n            ]);\n            break;\n        }\n    }\n    return config;\n}\n","'use strict';\nvar defineProperty = require('../internals/object-define-property').f;\nvar hasOwn = require('../internals/has-own-property');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\n\nmodule.exports = function (target, TAG, STATIC) {\n  if (target && !STATIC) target = target.prototype;\n  if (target && !hasOwn(target, TO_STRING_TAG)) {\n    defineProperty(target, TO_STRING_TAG, { configurable: true, value: TAG });\n  }\n};\n","'use strict';\nvar PROPER_FUNCTION_NAME = require('../internals/function-name').PROPER;\nvar fails = require('../internals/fails');\nvar whitespaces = require('../internals/whitespaces');\n\nvar non = '\\u200B\\u0085\\u180E';\n\n// check that a method works with the correct list\n// of whitespaces and has a correct name\nmodule.exports = function (METHOD_NAME) {\n  return fails(function () {\n    return !!whitespaces[METHOD_NAME]()\n      || non[METHOD_NAME]() !== non\n      || (PROPER_FUNCTION_NAME && whitespaces[METHOD_NAME].name !== METHOD_NAME);\n  });\n};\n","const plugin = require('tailwindcss/plugin')\nconst merge = require('lodash.merge')\nconst castArray = require('lodash.castarray')\nconst styles = require('./styles')\nconst { commonTrailingPseudos } = require('./utils')\n\nconst computed = {\n  // Reserved for future \"magic properties\", for example:\n  // bulletColor: (color) => ({ 'ul > li::before': { backgroundColor: color } }),\n}\n\nfunction inWhere(selector, { className, modifier, prefix }) {\n  let prefixedNot = prefix(`.not-${className}`).slice(1)\n  let selectorPrefix = selector.startsWith('>')\n    ? `${modifier === 'DEFAULT' ? `.${className}` : `.${className}-${modifier}`} `\n    : ''\n\n  // Parse the selector, if every component ends in the same pseudo element(s) then move it to the end\n  let [trailingPseudo, rebuiltSelector] = commonTrailingPseudos(selector)\n\n  if (trailingPseudo) {\n    return `:where(${selectorPrefix}${rebuiltSelector}):not(:where([class~=\"${prefixedNot}\"],[class~=\"${prefixedNot}\"] *))${trailingPseudo}`\n  }\n\n  return `:where(${selectorPrefix}${selector}):not(:where([class~=\"${prefixedNot}\"],[class~=\"${prefixedNot}\"] *))`\n}\n\nfunction isObject(value) {\n  return typeof value === 'object' && value !== null\n}\n\nfunction configToCss(config = {}, { target, className, modifier, prefix }) {\n  function updateSelector(k, v) {\n    if (target === 'legacy') {\n      return [k, v]\n    }\n\n    if (Array.isArray(v)) {\n      return [k, v]\n    }\n\n    if (isObject(v)) {\n      let nested = Object.values(v).some(isObject)\n      if (nested) {\n        return [\n          inWhere(k, { className, modifier, prefix }),\n          v,\n          Object.fromEntries(Object.entries(v).map(([k, v]) => updateSelector(k, v))),\n        ]\n      }\n\n      return [inWhere(k, { className, modifier, prefix }), v]\n    }\n\n    return [k, v]\n  }\n\n  return Object.fromEntries(\n    Object.entries(\n      merge(\n        {},\n        ...Object.keys(config)\n          .filter((key) => computed[key])\n          .map((key) => computed[key](config[key])),\n        ...castArray(config.css || {})\n      )\n    ).map(([k, v]) => updateSelector(k, v))\n  )\n}\n\nmodule.exports = plugin.withOptions(\n  ({ className = 'prose', target = 'modern' } = {}) => {\n    return function ({ addVariant, addComponents, theme, prefix }) {\n      let modifiers = theme('typography')\n\n      let options = { className, prefix }\n\n      for (let [name, ...selectors] of [\n        ['headings', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'th'],\n        ['h1'],\n        ['h2'],\n        ['h3'],\n        ['h4'],\n        ['h5'],\n        ['h6'],\n        ['p'],\n        ['a'],\n        ['blockquote'],\n        ['figure'],\n        ['figcaption'],\n        ['strong'],\n        ['em'],\n        ['kbd'],\n        ['code'],\n        ['pre'],\n        ['ol'],\n        ['ul'],\n        ['li'],\n        ['table'],\n        ['thead'],\n        ['tr'],\n        ['th'],\n        ['td'],\n        ['img'],\n        ['video'],\n        ['hr'],\n        ['lead', '[class~=\"lead\"]'],\n      ]) {\n        selectors = selectors.length === 0 ? [name] : selectors\n\n        let selector =\n          target === 'legacy' ? selectors.map((selector) => `& ${selector}`) : selectors.join(', ')\n\n        addVariant(\n          `${className}-${name}`,\n          target === 'legacy' ? selector : `& :is(${inWhere(selector, options)})`\n        )\n      }\n\n      addComponents(\n        Object.keys(modifiers).map((modifier) => ({\n          [modifier === 'DEFAULT' ? `.${className}` : `.${className}-${modifier}`]: configToCss(\n            modifiers[modifier],\n            {\n              target,\n              className,\n              modifier,\n              prefix,\n            }\n          ),\n        }))\n      )\n    }\n  },\n  () => {\n    return {\n      theme: { typography: styles },\n    }\n  }\n)\n","'use strict';\nvar $ = require('../internals/export');\nvar fails = require('../internals/fails');\nvar toObject = require('../internals/to-object');\nvar toPrimitive = require('../internals/to-primitive');\n\nvar FORCED = fails(function () {\n  return new Date(NaN).toJSON() !== null\n    || Date.prototype.toJSON.call({ toISOString: function () { return 1; } }) !== 1;\n});\n\n// `Date.prototype.toJSON` method\n// https://tc39.es/ecma262/#sec-date.prototype.tojson\n$({ target: 'Date', proto: true, arity: 1, forced: FORCED }, {\n  // eslint-disable-next-line no-unused-vars -- required for `.length`\n  toJSON: function toJSON(key) {\n    var O = toObject(this);\n    var pv = toPrimitive(O, 'number');\n    return typeof pv == 'number' && !isFinite(pv) ? null : O.toISOString();\n  }\n});\n","'use strict';\nvar ceil = Math.ceil;\nvar floor = Math.floor;\n\n// `Math.trunc` method\n// https://tc39.es/ecma262/#sec-math.trunc\n// eslint-disable-next-line es/no-math-trunc -- safe\nmodule.exports = Math.trunc || function trunc(x) {\n  var n = +x;\n  return (n > 0 ? floor : ceil)(n);\n};\n","'use strict';\nvar getBuiltIn = require('../internals/get-built-in');\nvar isCallable = require('../internals/is-callable');\nvar isPrototypeOf = require('../internals/object-is-prototype-of');\nvar USE_SYMBOL_AS_UID = require('../internals/use-symbol-as-uid');\n\nvar $Object = Object;\n\nmodule.exports = USE_SYMBOL_AS_UID ? function (it) {\n  return typeof it == 'symbol';\n} : function (it) {\n  var $Symbol = getBuiltIn('Symbol');\n  return isCallable($Symbol) && isPrototypeOf($Symbol.prototype, $Object(it));\n};\n","'use strict';\nvar isObject = require('../internals/is-object');\nvar classof = require('../internals/classof-raw');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar MATCH = wellKnownSymbol('match');\n\n// `IsRegExp` abstract operation\n// https://tc39.es/ecma262/#sec-isregexp\nmodule.exports = function (it) {\n  var isRegExp;\n  return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : classof(it) === 'RegExp');\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar getBuiltIn = require('../internals/get-built-in');\nvar apply = require('../internals/function-apply');\nvar bind = require('../internals/function-bind');\nvar aConstructor = require('../internals/a-constructor');\nvar anObject = require('../internals/an-object');\nvar isObject = require('../internals/is-object');\nvar create = require('../internals/object-create');\nvar fails = require('../internals/fails');\n\nvar nativeConstruct = getBuiltIn('Reflect', 'construct');\nvar ObjectPrototype = Object.prototype;\nvar push = [].push;\n\n// `Reflect.construct` method\n// https://tc39.es/ecma262/#sec-reflect.construct\n// MS Edge supports only 2 arguments and argumentsList argument is optional\n// FF Nightly sets third argument as `new.target`, but does not create `this` from it\nvar NEW_TARGET_BUG = fails(function () {\n  function F() { /* empty */ }\n  return !(nativeConstruct(function () { /* empty */ }, [], F) instanceof F);\n});\n\nvar ARGS_BUG = !fails(function () {\n  nativeConstruct(function () { /* empty */ });\n});\n\nvar FORCED = NEW_TARGET_BUG || ARGS_BUG;\n\n$({ target: 'Reflect', stat: true, forced: FORCED, sham: FORCED }, {\n  construct: function construct(Target, args /* , newTarget */) {\n    aConstructor(Target);\n    anObject(args);\n    var newTarget = arguments.length < 3 ? Target : aConstructor(arguments[2]);\n    if (ARGS_BUG && !NEW_TARGET_BUG) return nativeConstruct(Target, args, newTarget);\n    if (Target === newTarget) {\n      // w/o altered newTarget, optimization for 0-4 arguments\n      switch (args.length) {\n        case 0: return new Target();\n        case 1: return new Target(args[0]);\n        case 2: return new Target(args[0], args[1]);\n        case 3: return new Target(args[0], args[1], args[2]);\n        case 4: return new Target(args[0], args[1], args[2], args[3]);\n      }\n      // w/o altered newTarget, lot of arguments case\n      var $args = [null];\n      apply(push, $args, args);\n      return new (apply(bind, Target, $args))();\n    }\n    // with altered newTarget, not support built-in constructors\n    var proto = newTarget.prototype;\n    var instance = create(isObject(proto) ? proto : ObjectPrototype);\n    var result = apply(Target, instance, args);\n    return isObject(result) ? result : instance;\n  }\n});\n","'use strict';\nvar classof = require('../internals/classof');\nvar getMethod = require('../internals/get-method');\nvar isNullOrUndefined = require('../internals/is-null-or-undefined');\nvar Iterators = require('../internals/iterators');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar ITERATOR = wellKnownSymbol('iterator');\n\nmodule.exports = function (it) {\n  if (!isNullOrUndefined(it)) return getMethod(it, ITERATOR)\n    || getMethod(it, '@@iterator')\n    || Iterators[classof(it)];\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar fails = require('../internals/fails');\nvar toObject = require('../internals/to-object');\nvar nativeGetPrototypeOf = require('../internals/object-get-prototype-of');\nvar CORRECT_PROTOTYPE_GETTER = require('../internals/correct-prototype-getter');\n\nvar FAILS_ON_PRIMITIVES = fails(function () { nativeGetPrototypeOf(1); });\n\n// `Object.getPrototypeOf` method\n// https://tc39.es/ecma262/#sec-object.getprototypeof\n$({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES, sham: !CORRECT_PROTOTYPE_GETTER }, {\n  getPrototypeOf: function getPrototypeOf(it) {\n    return nativeGetPrototypeOf(toObject(it));\n  }\n});\n\n","'use strict';\nvar $ = require('../internals/export');\nvar call = require('../internals/function-call');\nvar isObject = require('../internals/is-object');\nvar anObject = require('../internals/an-object');\nvar isDataDescriptor = require('../internals/is-data-descriptor');\nvar getOwnPropertyDescriptorModule = require('../internals/object-get-own-property-descriptor');\nvar getPrototypeOf = require('../internals/object-get-prototype-of');\n\n// `Reflect.get` method\n// https://tc39.es/ecma262/#sec-reflect.get\nfunction get(target, propertyKey /* , receiver */) {\n  var receiver = arguments.length < 3 ? target : arguments[2];\n  var descriptor, prototype;\n  if (anObject(target) === receiver) return target[propertyKey];\n  descriptor = getOwnPropertyDescriptorModule.f(target, propertyKey);\n  if (descriptor) return isDataDescriptor(descriptor)\n    ? descriptor.value\n    : descriptor.get === undefined ? undefined : call(descriptor.get, receiver);\n  if (isObject(prototype = getPrototypeOf(target))) return get(prototype, propertyKey, receiver);\n}\n\n$({ target: 'Reflect', stat: true }, {\n  get: get\n});\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar NativePromiseConstructor = require('../internals/promise-native-constructor');\nvar isCallable = require('../internals/is-callable');\nvar isForced = require('../internals/is-forced');\nvar inspectSource = require('../internals/inspect-source');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar ENVIRONMENT = require('../internals/environment');\nvar IS_PURE = require('../internals/is-pure');\nvar V8_VERSION = require('../internals/environment-v8-version');\n\nvar NativePromisePrototype = NativePromiseConstructor && NativePromiseConstructor.prototype;\nvar SPECIES = wellKnownSymbol('species');\nvar SUBCLASSING = false;\nvar NATIVE_PROMISE_REJECTION_EVENT = isCallable(globalThis.PromiseRejectionEvent);\n\nvar FORCED_PROMISE_CONSTRUCTOR = isForced('Promise', function () {\n  var PROMISE_CONSTRUCTOR_SOURCE = inspectSource(NativePromiseConstructor);\n  var GLOBAL_CORE_JS_PROMISE = PROMISE_CONSTRUCTOR_SOURCE !== String(NativePromiseConstructor);\n  // V8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables\n  // https://bugs.chromium.org/p/chromium/issues/detail?id=830565\n  // We can't detect it synchronously, so just check versions\n  if (!GLOBAL_CORE_JS_PROMISE && V8_VERSION === 66) return true;\n  // We need Promise#{ catch, finally } in the pure version for preventing prototype pollution\n  if (IS_PURE && !(NativePromisePrototype['catch'] && NativePromisePrototype['finally'])) return true;\n  // We can't use @@species feature detection in V8 since it causes\n  // deoptimization and performance degradation\n  // https://github.com/zloirock/core-js/issues/679\n  if (!V8_VERSION || V8_VERSION < 51 || !/native code/.test(PROMISE_CONSTRUCTOR_SOURCE)) {\n    // Detect correctness of subclassing with @@species support\n    var promise = new NativePromiseConstructor(function (resolve) { resolve(1); });\n    var FakePromise = function (exec) {\n      exec(function () { /* empty */ }, function () { /* empty */ });\n    };\n    var constructor = promise.constructor = {};\n    constructor[SPECIES] = FakePromise;\n    SUBCLASSING = promise.then(function () { /* empty */ }) instanceof FakePromise;\n    if (!SUBCLASSING) return true;\n  // Unhandled rejections tracking support, NodeJS Promise without it fails @@species test\n  } return !GLOBAL_CORE_JS_PROMISE && (ENVIRONMENT === 'BROWSER' || ENVIRONMENT === 'DENO') && !NATIVE_PROMISE_REJECTION_EVENT;\n});\n\nmodule.exports = {\n  CONSTRUCTOR: FORCED_PROMISE_CONSTRUCTOR,\n  REJECTION_EVENT: NATIVE_PROMISE_REJECTION_EVENT,\n  SUBCLASSING: SUBCLASSING\n};\n","'use strict';\nvar aCallable = require('../internals/a-callable');\nvar toObject = require('../internals/to-object');\nvar IndexedObject = require('../internals/indexed-object');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\n\nvar $TypeError = TypeError;\n\nvar REDUCE_EMPTY = 'Reduce of empty array with no initial value';\n\n// `Array.prototype.{ reduce, reduceRight }` methods implementation\nvar createMethod = function (IS_RIGHT) {\n  return function (that, callbackfn, argumentsLength, memo) {\n    var O = toObject(that);\n    var self = IndexedObject(O);\n    var length = lengthOfArrayLike(O);\n    aCallable(callbackfn);\n    if (length === 0 && argumentsLength < 2) throw new $TypeError(REDUCE_EMPTY);\n    var index = IS_RIGHT ? length - 1 : 0;\n    var i = IS_RIGHT ? -1 : 1;\n    if (argumentsLength < 2) while (true) {\n      if (index in self) {\n        memo = self[index];\n        index += i;\n        break;\n      }\n      index += i;\n      if (IS_RIGHT ? index < 0 : length <= index) {\n        throw new $TypeError(REDUCE_EMPTY);\n      }\n    }\n    for (;IS_RIGHT ? index >= 0 : length > index; index += i) if (index in self) {\n      memo = callbackfn(memo, self[index], index, O);\n    }\n    return memo;\n  };\n};\n\nmodule.exports = {\n  // `Array.prototype.reduce` method\n  // https://tc39.es/ecma262/#sec-array.prototype.reduce\n  left: createMethod(false),\n  // `Array.prototype.reduceRight` method\n  // https://tc39.es/ecma262/#sec-array.prototype.reduceright\n  right: createMethod(true)\n};\n","/**\n * Fizzy UI utils v2.0.7\n * MIT license\n */\n\n/*jshint browser: true, undef: true, unused: true, strict: true */\n\n( function( window, factory ) {\n  // universal module definition\n  /*jshint strict: false */ /*globals define, module, require */\n\n  if ( typeof define == 'function' && define.amd ) {\n    // AMD\n    define( [\n      'desandro-matches-selector/matches-selector'\n    ], function( matchesSelector ) {\n      return factory( window, matchesSelector );\n    });\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n      window,\n      require('desandro-matches-selector')\n    );\n  } else {\n    // browser global\n    window.fizzyUIUtils = factory(\n      window,\n      window.matchesSelector\n    );\n  }\n\n}( window, function factory( window, matchesSelector ) {\n\n'use strict';\n\nvar utils = {};\n\n// ----- extend ----- //\n\n// extends objects\nutils.extend = function( a, b ) {\n  for ( var prop in b ) {\n    a[ prop ] = b[ prop ];\n  }\n  return a;\n};\n\n// ----- modulo ----- //\n\nutils.modulo = function( num, div ) {\n  return ( ( num % div ) + div ) % div;\n};\n\n// ----- makeArray ----- //\n\nvar arraySlice = Array.prototype.slice;\n\n// turn element or nodeList into an array\nutils.makeArray = function( obj ) {\n  if ( Array.isArray( obj ) ) {\n    // use object if already an array\n    return obj;\n  }\n  // return empty array if undefined or null. #6\n  if ( obj === null || obj === undefined ) {\n    return [];\n  }\n\n  var isArrayLike = typeof obj == 'object' && typeof obj.length == 'number';\n  if ( isArrayLike ) {\n    // convert nodeList to array\n    return arraySlice.call( obj );\n  }\n\n  // array of single index\n  return [ obj ];\n};\n\n// ----- removeFrom ----- //\n\nutils.removeFrom = function( ary, obj ) {\n  var index = ary.indexOf( obj );\n  if ( index != -1 ) {\n    ary.splice( index, 1 );\n  }\n};\n\n// ----- getParent ----- //\n\nutils.getParent = function( elem, selector ) {\n  while ( elem.parentNode && elem != document.body ) {\n    elem = elem.parentNode;\n    if ( matchesSelector( elem, selector ) ) {\n      return elem;\n    }\n  }\n};\n\n// ----- getQueryElement ----- //\n\n// use element as selector string\nutils.getQueryElement = function( elem ) {\n  if ( typeof elem == 'string' ) {\n    return document.querySelector( elem );\n  }\n  return elem;\n};\n\n// ----- handleEvent ----- //\n\n// enable .ontype to trigger from .addEventListener( elem, 'type' )\nutils.handleEvent = function( event ) {\n  var method = 'on' + event.type;\n  if ( this[ method ] ) {\n    this[ method ]( event );\n  }\n};\n\n// ----- filterFindElements ----- //\n\nutils.filterFindElements = function( elems, selector ) {\n  // make array of elems\n  elems = utils.makeArray( elems );\n  var ffElems = [];\n\n  elems.forEach( function( elem ) {\n    // check that elem is an actual element\n    if ( !( elem instanceof HTMLElement ) ) {\n      return;\n    }\n    // add elem if no selector\n    if ( !selector ) {\n      ffElems.push( elem );\n      return;\n    }\n    // filter & find items if we have a selector\n    // filter\n    if ( matchesSelector( elem, selector ) ) {\n      ffElems.push( elem );\n    }\n    // find children\n    var childElems = elem.querySelectorAll( selector );\n    // concat childElems to filterFound array\n    for ( var i=0; i < childElems.length; i++ ) {\n      ffElems.push( childElems[i] );\n    }\n  });\n\n  return ffElems;\n};\n\n// ----- debounceMethod ----- //\n\nutils.debounceMethod = function( _class, methodName, threshold ) {\n  threshold = threshold || 100;\n  // original method\n  var method = _class.prototype[ methodName ];\n  var timeoutName = methodName + 'Timeout';\n\n  _class.prototype[ methodName ] = function() {\n    var timeout = this[ timeoutName ];\n    clearTimeout( timeout );\n\n    var args = arguments;\n    var _this = this;\n    this[ timeoutName ] = setTimeout( function() {\n      method.apply( _this, args );\n      delete _this[ timeoutName ];\n    }, threshold );\n  };\n};\n\n// ----- docReady ----- //\n\nutils.docReady = function( callback ) {\n  var readyState = document.readyState;\n  if ( readyState == 'complete' || readyState == 'interactive' ) {\n    // do async to allow for other scripts to run. metafizzy/flickity#441\n    setTimeout( callback );\n  } else {\n    document.addEventListener( 'DOMContentLoaded', callback );\n  }\n};\n\n// ----- htmlInit ----- //\n\n// http://jamesroberts.name/blog/2010/02/22/string-functions-for-javascript-trim-to-camel-case-to-dashed-and-to-underscore/\nutils.toDashed = function( str ) {\n  return str.replace( /(.)([A-Z])/g, function( match, $1, $2 ) {\n    return $1 + '-' + $2;\n  }).toLowerCase();\n};\n\nvar console = window.console;\n/**\n * allow user to initialize classes via [data-namespace] or .js-namespace class\n * htmlInit( Widget, 'widgetName' )\n * options are parsed from data-namespace-options\n */\nutils.htmlInit = function( WidgetClass, namespace ) {\n  utils.docReady( function() {\n    var dashedNamespace = utils.toDashed( namespace );\n    var dataAttr = 'data-' + dashedNamespace;\n    var dataAttrElems = document.querySelectorAll( '[' + dataAttr + ']' );\n    var jsDashElems = document.querySelectorAll( '.js-' + dashedNamespace );\n    var elems = utils.makeArray( dataAttrElems )\n      .concat( utils.makeArray( jsDashElems ) );\n    var dataOptionsAttr = dataAttr + '-options';\n    var jQuery = window.jQuery;\n\n    elems.forEach( function( elem ) {\n      var attr = elem.getAttribute( dataAttr ) ||\n        elem.getAttribute( dataOptionsAttr );\n      var options;\n      try {\n        options = attr && JSON.parse( attr );\n      } catch ( error ) {\n        // log error, do not initialize\n        if ( console ) {\n          console.error( 'Error parsing ' + dataAttr + ' on ' + elem.className +\n          ': ' + error );\n        }\n        return;\n      }\n      // initialize\n      var instance = new WidgetClass( elem, options );\n      // make available via $().data('namespace')\n      if ( jQuery ) {\n        jQuery.data( elem, namespace, instance );\n      }\n    });\n\n  });\n};\n\n// -----  ----- //\n\nreturn utils;\n\n}));\n","\"use strict\";\n\nexports.__esModule = true;\nexports[\"default\"] = void 0;\n\nvar _container = _interopRequireDefault(require(\"./container\"));\n\nvar _types = require(\"./types\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nfunction _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nvar Pseudo = /*#__PURE__*/function (_Container) {\n  _inheritsLoose(Pseudo, _Container);\n\n  function Pseudo(opts) {\n    var _this;\n\n    _this = _Container.call(this, opts) || this;\n    _this.type = _types.PSEUDO;\n    return _this;\n  }\n\n  var _proto = Pseudo.prototype;\n\n  _proto.toString = function toString() {\n    var params = this.length ? '(' + this.map(String).join(',') + ')' : '';\n    return [this.rawSpaceBefore, this.stringifyProperty(\"value\"), params, this.rawSpaceAfter].join('');\n  };\n\n  return Pseudo;\n}(_container[\"default\"]);\n\nexports[\"default\"] = Pseudo;\nmodule.exports = exports.default;","'use strict';\nvar call = require('../internals/function-call');\nvar hasOwn = require('../internals/has-own-property');\nvar isPrototypeOf = require('../internals/object-is-prototype-of');\nvar regExpFlagsDetection = require('../internals/regexp-flags-detection');\nvar regExpFlagsGetterImplementation = require('../internals/regexp-flags');\n\nvar RegExpPrototype = RegExp.prototype;\n\nmodule.exports = regExpFlagsDetection.correct ? function (it) {\n  return it.flags;\n} : function (it) {\n  return (!regExpFlagsDetection.correct && isPrototypeOf(RegExpPrototype, it) && !hasOwn(it, 'flags'))\n    ? call(regExpFlagsGetterImplementation, it)\n    : it.flags;\n};\n","const colors = require('tailwindcss/colors')\n\nconst round = (num) =>\n  num\n    .toFixed(7)\n    .replace(/(\\.[0-9]+?)0+$/, '$1')\n    .replace(/\\.0$/, '')\nconst rem = (px) => `${round(px / 16)}rem`\nconst em = (px, base) => `${round(px / base)}em`\nconst hexToRgb = (hex) => {\n  hex = hex.replace('#', '')\n  hex = hex.length === 3 ? hex.replace(/./g, '$&$&') : hex\n  const r = parseInt(hex.substring(0, 2), 16)\n  const g = parseInt(hex.substring(2, 4), 16)\n  const b = parseInt(hex.substring(4, 6), 16)\n  return `${r} ${g} ${b}`\n}\n\nlet defaultModifiers = {\n  sm: {\n    css: [\n      {\n        fontSize: rem(14),\n        lineHeight: round(24 / 14),\n        p: {\n          marginTop: em(16, 14),\n          marginBottom: em(16, 14),\n        },\n        '[class~=\"lead\"]': {\n          fontSize: em(18, 14),\n          lineHeight: round(28 / 18),\n          marginTop: em(16, 18),\n          marginBottom: em(16, 18),\n        },\n        blockquote: {\n          marginTop: em(24, 18),\n          marginBottom: em(24, 18),\n          paddingInlineStart: em(20, 18),\n        },\n        h1: {\n          fontSize: em(30, 14),\n          marginTop: '0',\n          marginBottom: em(24, 30),\n          lineHeight: round(36 / 30),\n        },\n        h2: {\n          fontSize: em(20, 14),\n          marginTop: em(32, 20),\n          marginBottom: em(16, 20),\n          lineHeight: round(28 / 20),\n        },\n        h3: {\n          fontSize: em(18, 14),\n          marginTop: em(28, 18),\n          marginBottom: em(8, 18),\n          lineHeight: round(28 / 18),\n        },\n        h4: {\n          marginTop: em(20, 14),\n          marginBottom: em(8, 14),\n          lineHeight: round(20 / 14),\n        },\n        img: {\n          marginTop: em(24, 14),\n          marginBottom: em(24, 14),\n        },\n        picture: {\n          marginTop: em(24, 14),\n          marginBottom: em(24, 14),\n        },\n        'picture > img': {\n          marginTop: '0',\n          marginBottom: '0',\n        },\n        video: {\n          marginTop: em(24, 14),\n          marginBottom: em(24, 14),\n        },\n        kbd: {\n          fontSize: em(12, 14),\n          borderRadius: rem(5),\n          paddingTop: em(2, 14),\n          paddingInlineEnd: em(5, 14),\n          paddingBottom: em(2, 14),\n          paddingInlineStart: em(5, 14),\n        },\n        code: {\n          fontSize: em(12, 14),\n        },\n        'h2 code': {\n          fontSize: em(18, 20),\n        },\n        'h3 code': {\n          fontSize: em(16, 18),\n        },\n        pre: {\n          fontSize: em(12, 14),\n          lineHeight: round(20 / 12),\n          marginTop: em(20, 12),\n          marginBottom: em(20, 12),\n          borderRadius: rem(4),\n          paddingTop: em(8, 12),\n          paddingInlineEnd: em(12, 12),\n          paddingBottom: em(8, 12),\n          paddingInlineStart: em(12, 12),\n        },\n        ol: {\n          marginTop: em(16, 14),\n          marginBottom: em(16, 14),\n          paddingInlineStart: em(22, 14),\n        },\n        ul: {\n          marginTop: em(16, 14),\n          marginBottom: em(16, 14),\n          paddingInlineStart: em(22, 14),\n        },\n        li: {\n          marginTop: em(4, 14),\n          marginBottom: em(4, 14),\n        },\n        'ol > li': {\n          paddingInlineStart: em(6, 14),\n        },\n        'ul > li': {\n          paddingInlineStart: em(6, 14),\n        },\n        '> ul > li p': {\n          marginTop: em(8, 14),\n          marginBottom: em(8, 14),\n        },\n        '> ul > li > p:first-child': {\n          marginTop: em(16, 14),\n        },\n        '> ul > li > p:last-child': {\n          marginBottom: em(16, 14),\n        },\n        '> ol > li > p:first-child': {\n          marginTop: em(16, 14),\n        },\n        '> ol > li > p:last-child': {\n          marginBottom: em(16, 14),\n        },\n        'ul ul, ul ol, ol ul, ol ol': {\n          marginTop: em(8, 14),\n          marginBottom: em(8, 14),\n        },\n        dl: {\n          marginTop: em(16, 14),\n          marginBottom: em(16, 14),\n        },\n        dt: {\n          marginTop: em(16, 14),\n        },\n        dd: {\n          marginTop: em(4, 14),\n          paddingInlineStart: em(22, 14),\n        },\n        hr: {\n          marginTop: em(40, 14),\n          marginBottom: em(40, 14),\n        },\n        'hr + *': {\n          marginTop: '0',\n        },\n        'h2 + *': {\n          marginTop: '0',\n        },\n        'h3 + *': {\n          marginTop: '0',\n        },\n        'h4 + *': {\n          marginTop: '0',\n        },\n        table: {\n          fontSize: em(12, 14),\n          lineHeight: round(18 / 12),\n        },\n        'thead th': {\n          paddingInlineEnd: em(12, 12),\n          paddingBottom: em(8, 12),\n          paddingInlineStart: em(12, 12),\n        },\n        'thead th:first-child': {\n          paddingInlineStart: '0',\n        },\n        'thead th:last-child': {\n          paddingInlineEnd: '0',\n        },\n        'tbody td, tfoot td': {\n          paddingTop: em(8, 12),\n          paddingInlineEnd: em(12, 12),\n          paddingBottom: em(8, 12),\n          paddingInlineStart: em(12, 12),\n        },\n        'tbody td:first-child, tfoot td:first-child': {\n          paddingInlineStart: '0',\n        },\n        'tbody td:last-child, tfoot td:last-child': {\n          paddingInlineEnd: '0',\n        },\n        figure: {\n          marginTop: em(24, 14),\n          marginBottom: em(24, 14),\n        },\n        'figure > *': {\n          marginTop: '0',\n          marginBottom: '0',\n        },\n        figcaption: {\n          fontSize: em(12, 14),\n          lineHeight: round(16 / 12),\n          marginTop: em(8, 12),\n        },\n      },\n      {\n        '> :first-child': {\n          marginTop: '0',\n        },\n        '> :last-child': {\n          marginBottom: '0',\n        },\n      },\n    ],\n  },\n  base: {\n    css: [\n      {\n        fontSize: rem(16),\n        lineHeight: round(28 / 16),\n        p: {\n          marginTop: em(20, 16),\n          marginBottom: em(20, 16),\n        },\n        '[class~=\"lead\"]': {\n          fontSize: em(20, 16),\n          lineHeight: round(32 / 20),\n          marginTop: em(24, 20),\n          marginBottom: em(24, 20),\n        },\n        blockquote: {\n          marginTop: em(32, 20),\n          marginBottom: em(32, 20),\n          paddingInlineStart: em(20, 20),\n        },\n        h1: {\n          fontSize: em(36, 16),\n          marginTop: '0',\n          marginBottom: em(32, 36),\n          lineHeight: round(40 / 36),\n        },\n        h2: {\n          fontSize: em(24, 16),\n          marginTop: em(48, 24),\n          marginBottom: em(24, 24),\n          lineHeight: round(32 / 24),\n        },\n        h3: {\n          fontSize: em(20, 16),\n          marginTop: em(32, 20),\n          marginBottom: em(12, 20),\n          lineHeight: round(32 / 20),\n        },\n        h4: {\n          marginTop: em(24, 16),\n          marginBottom: em(8, 16),\n          lineHeight: round(24 / 16),\n        },\n        img: {\n          marginTop: em(32, 16),\n          marginBottom: em(32, 16),\n        },\n        picture: {\n          marginTop: em(32, 16),\n          marginBottom: em(32, 16),\n        },\n        'picture > img': {\n          marginTop: '0',\n          marginBottom: '0',\n        },\n        video: {\n          marginTop: em(32, 16),\n          marginBottom: em(32, 16),\n        },\n        kbd: {\n          fontSize: em(14, 16),\n          borderRadius: rem(5),\n          paddingTop: em(3, 16),\n          paddingInlineEnd: em(6, 16),\n          paddingBottom: em(3, 16),\n          paddingInlineStart: em(6, 16),\n        },\n        code: {\n          fontSize: em(14, 16),\n        },\n        'h2 code': {\n          fontSize: em(21, 24),\n        },\n        'h3 code': {\n          fontSize: em(18, 20),\n        },\n        pre: {\n          fontSize: em(14, 16),\n          lineHeight: round(24 / 14),\n          marginTop: em(24, 14),\n          marginBottom: em(24, 14),\n          borderRadius: rem(6),\n          paddingTop: em(12, 14),\n          paddingInlineEnd: em(16, 14),\n          paddingBottom: em(12, 14),\n          paddingInlineStart: em(16, 14),\n        },\n        ol: {\n          marginTop: em(20, 16),\n          marginBottom: em(20, 16),\n          paddingInlineStart: em(26, 16),\n        },\n        ul: {\n          marginTop: em(20, 16),\n          marginBottom: em(20, 16),\n          paddingInlineStart: em(26, 16),\n        },\n        li: {\n          marginTop: em(8, 16),\n          marginBottom: em(8, 16),\n        },\n        'ol > li': {\n          paddingInlineStart: em(6, 16),\n        },\n        'ul > li': {\n          paddingInlineStart: em(6, 16),\n        },\n        '> ul > li p': {\n          marginTop: em(12, 16),\n          marginBottom: em(12, 16),\n        },\n        '> ul > li > p:first-child': {\n          marginTop: em(20, 16),\n        },\n        '> ul > li > p:last-child': {\n          marginBottom: em(20, 16),\n        },\n        '> ol > li > p:first-child': {\n          marginTop: em(20, 16),\n        },\n        '> ol > li > p:last-child': {\n          marginBottom: em(20, 16),\n        },\n        'ul ul, ul ol, ol ul, ol ol': {\n          marginTop: em(12, 16),\n          marginBottom: em(12, 16),\n        },\n        dl: {\n          marginTop: em(20, 16),\n          marginBottom: em(20, 16),\n        },\n        dt: {\n          marginTop: em(20, 16),\n        },\n        dd: {\n          marginTop: em(8, 16),\n          paddingInlineStart: em(26, 16),\n        },\n        hr: {\n          marginTop: em(48, 16),\n          marginBottom: em(48, 16),\n        },\n        'hr + *': {\n          marginTop: '0',\n        },\n        'h2 + *': {\n          marginTop: '0',\n        },\n        'h3 + *': {\n          marginTop: '0',\n        },\n        'h4 + *': {\n          marginTop: '0',\n        },\n        table: {\n          fontSize: em(14, 16),\n          lineHeight: round(24 / 14),\n        },\n        'thead th': {\n          paddingInlineEnd: em(8, 14),\n          paddingBottom: em(8, 14),\n          paddingInlineStart: em(8, 14),\n        },\n        'thead th:first-child': {\n          paddingInlineStart: '0',\n        },\n        'thead th:last-child': {\n          paddingInlineEnd: '0',\n        },\n        'tbody td, tfoot td': {\n          paddingTop: em(8, 14),\n          paddingInlineEnd: em(8, 14),\n          paddingBottom: em(8, 14),\n          paddingInlineStart: em(8, 14),\n        },\n        'tbody td:first-child, tfoot td:first-child': {\n          paddingInlineStart: '0',\n        },\n        'tbody td:last-child, tfoot td:last-child': {\n          paddingInlineEnd: '0',\n        },\n        figure: {\n          marginTop: em(32, 16),\n          marginBottom: em(32, 16),\n        },\n        'figure > *': {\n          marginTop: '0',\n          marginBottom: '0',\n        },\n        figcaption: {\n          fontSize: em(14, 16),\n          lineHeight: round(20 / 14),\n          marginTop: em(12, 14),\n        },\n      },\n      {\n        '> :first-child': {\n          marginTop: '0',\n        },\n        '> :last-child': {\n          marginBottom: '0',\n        },\n      },\n    ],\n  },\n  lg: {\n    css: [\n      {\n        fontSize: rem(18),\n        lineHeight: round(32 / 18),\n        p: {\n          marginTop: em(24, 18),\n          marginBottom: em(24, 18),\n        },\n        '[class~=\"lead\"]': {\n          fontSize: em(22, 18),\n          lineHeight: round(32 / 22),\n          marginTop: em(24, 22),\n          marginBottom: em(24, 22),\n        },\n        blockquote: {\n          marginTop: em(40, 24),\n          marginBottom: em(40, 24),\n          paddingInlineStart: em(24, 24),\n        },\n        h1: {\n          fontSize: em(48, 18),\n          marginTop: '0',\n          marginBottom: em(40, 48),\n          lineHeight: round(48 / 48),\n        },\n        h2: {\n          fontSize: em(30, 18),\n          marginTop: em(56, 30),\n          marginBottom: em(32, 30),\n          lineHeight: round(40 / 30),\n        },\n        h3: {\n          fontSize: em(24, 18),\n          marginTop: em(40, 24),\n          marginBottom: em(16, 24),\n          lineHeight: round(36 / 24),\n        },\n        h4: {\n          marginTop: em(32, 18),\n          marginBottom: em(8, 18),\n          lineHeight: round(28 / 18),\n        },\n        img: {\n          marginTop: em(32, 18),\n          marginBottom: em(32, 18),\n        },\n        picture: {\n          marginTop: em(32, 18),\n          marginBottom: em(32, 18),\n        },\n        'picture > img': {\n          marginTop: '0',\n          marginBottom: '0',\n        },\n        video: {\n          marginTop: em(32, 18),\n          marginBottom: em(32, 18),\n        },\n        kbd: {\n          fontSize: em(16, 18),\n          borderRadius: rem(5),\n          paddingTop: em(4, 18),\n          paddingInlineEnd: em(8, 18),\n          paddingBottom: em(4, 18),\n          paddingInlineStart: em(8, 18),\n        },\n        code: {\n          fontSize: em(16, 18),\n        },\n        'h2 code': {\n          fontSize: em(26, 30),\n        },\n        'h3 code': {\n          fontSize: em(21, 24),\n        },\n        pre: {\n          fontSize: em(16, 18),\n          lineHeight: round(28 / 16),\n          marginTop: em(32, 16),\n          marginBottom: em(32, 16),\n          borderRadius: rem(6),\n          paddingTop: em(16, 16),\n          paddingInlineEnd: em(24, 16),\n          paddingBottom: em(16, 16),\n          paddingInlineStart: em(24, 16),\n        },\n        ol: {\n          marginTop: em(24, 18),\n          marginBottom: em(24, 18),\n          paddingInlineStart: em(28, 18),\n        },\n        ul: {\n          marginTop: em(24, 18),\n          marginBottom: em(24, 18),\n          paddingInlineStart: em(28, 18),\n        },\n        li: {\n          marginTop: em(12, 18),\n          marginBottom: em(12, 18),\n        },\n        'ol > li': {\n          paddingInlineStart: em(8, 18),\n        },\n        'ul > li': {\n          paddingInlineStart: em(8, 18),\n        },\n        '> ul > li p': {\n          marginTop: em(16, 18),\n          marginBottom: em(16, 18),\n        },\n        '> ul > li > p:first-child': {\n          marginTop: em(24, 18),\n        },\n        '> ul > li > p:last-child': {\n          marginBottom: em(24, 18),\n        },\n        '> ol > li > p:first-child': {\n          marginTop: em(24, 18),\n        },\n        '> ol > li > p:last-child': {\n          marginBottom: em(24, 18),\n        },\n        'ul ul, ul ol, ol ul, ol ol': {\n          marginTop: em(16, 18),\n          marginBottom: em(16, 18),\n        },\n        dl: {\n          marginTop: em(24, 18),\n          marginBottom: em(24, 18),\n        },\n        dt: {\n          marginTop: em(24, 18),\n        },\n        dd: {\n          marginTop: em(12, 18),\n          paddingInlineStart: em(28, 18),\n        },\n        hr: {\n          marginTop: em(56, 18),\n          marginBottom: em(56, 18),\n        },\n        'hr + *': {\n          marginTop: '0',\n        },\n        'h2 + *': {\n          marginTop: '0',\n        },\n        'h3 + *': {\n          marginTop: '0',\n        },\n        'h4 + *': {\n          marginTop: '0',\n        },\n        table: {\n          fontSize: em(16, 18),\n          lineHeight: round(24 / 16),\n        },\n        'thead th': {\n          paddingInlineEnd: em(12, 16),\n          paddingBottom: em(12, 16),\n          paddingInlineStart: em(12, 16),\n        },\n        'thead th:first-child': {\n          paddingInlineStart: '0',\n        },\n        'thead th:last-child': {\n          paddingInlineEnd: '0',\n        },\n        'tbody td, tfoot td': {\n          paddingTop: em(12, 16),\n          paddingInlineEnd: em(12, 16),\n          paddingBottom: em(12, 16),\n          paddingInlineStart: em(12, 16),\n        },\n        'tbody td:first-child, tfoot td:first-child': {\n          paddingInlineStart: '0',\n        },\n        'tbody td:last-child, tfoot td:last-child': {\n          paddingInlineEnd: '0',\n        },\n        figure: {\n          marginTop: em(32, 18),\n          marginBottom: em(32, 18),\n        },\n        'figure > *': {\n          marginTop: '0',\n          marginBottom: '0',\n        },\n        figcaption: {\n          fontSize: em(16, 18),\n          lineHeight: round(24 / 16),\n          marginTop: em(16, 16),\n        },\n      },\n      {\n        '> :first-child': {\n          marginTop: '0',\n        },\n        '> :last-child': {\n          marginBottom: '0',\n        },\n      },\n    ],\n  },\n  xl: {\n    css: [\n      {\n        fontSize: rem(20),\n        lineHeight: round(36 / 20),\n        p: {\n          marginTop: em(24, 20),\n          marginBottom: em(24, 20),\n        },\n        '[class~=\"lead\"]': {\n          fontSize: em(24, 20),\n          lineHeight: round(36 / 24),\n          marginTop: em(24, 24),\n          marginBottom: em(24, 24),\n        },\n        blockquote: {\n          marginTop: em(48, 30),\n          marginBottom: em(48, 30),\n          paddingInlineStart: em(32, 30),\n        },\n        h1: {\n          fontSize: em(56, 20),\n          marginTop: '0',\n          marginBottom: em(48, 56),\n          lineHeight: round(56 / 56),\n        },\n        h2: {\n          fontSize: em(36, 20),\n          marginTop: em(56, 36),\n          marginBottom: em(32, 36),\n          lineHeight: round(40 / 36),\n        },\n        h3: {\n          fontSize: em(30, 20),\n          marginTop: em(48, 30),\n          marginBottom: em(20, 30),\n          lineHeight: round(40 / 30),\n        },\n        h4: {\n          marginTop: em(36, 20),\n          marginBottom: em(12, 20),\n          lineHeight: round(32 / 20),\n        },\n        img: {\n          marginTop: em(40, 20),\n          marginBottom: em(40, 20),\n        },\n        picture: {\n          marginTop: em(40, 20),\n          marginBottom: em(40, 20),\n        },\n        'picture > img': {\n          marginTop: '0',\n          marginBottom: '0',\n        },\n        video: {\n          marginTop: em(40, 20),\n          marginBottom: em(40, 20),\n        },\n        kbd: {\n          fontSize: em(18, 20),\n          borderRadius: rem(5),\n          paddingTop: em(5, 20),\n          paddingInlineEnd: em(8, 20),\n          paddingBottom: em(5, 20),\n          paddingInlineStart: em(8, 20),\n        },\n        code: {\n          fontSize: em(18, 20),\n        },\n        'h2 code': {\n          fontSize: em(31, 36),\n        },\n        'h3 code': {\n          fontSize: em(27, 30),\n        },\n        pre: {\n          fontSize: em(18, 20),\n          lineHeight: round(32 / 18),\n          marginTop: em(36, 18),\n          marginBottom: em(36, 18),\n          borderRadius: rem(8),\n          paddingTop: em(20, 18),\n          paddingInlineEnd: em(24, 18),\n          paddingBottom: em(20, 18),\n          paddingInlineStart: em(24, 18),\n        },\n        ol: {\n          marginTop: em(24, 20),\n          marginBottom: em(24, 20),\n          paddingInlineStart: em(32, 20),\n        },\n        ul: {\n          marginTop: em(24, 20),\n          marginBottom: em(24, 20),\n          paddingInlineStart: em(32, 20),\n        },\n        li: {\n          marginTop: em(12, 20),\n          marginBottom: em(12, 20),\n        },\n        'ol > li': {\n          paddingInlineStart: em(8, 20),\n        },\n        'ul > li': {\n          paddingInlineStart: em(8, 20),\n        },\n        '> ul > li p': {\n          marginTop: em(16, 20),\n          marginBottom: em(16, 20),\n        },\n        '> ul > li > p:first-child': {\n          marginTop: em(24, 20),\n        },\n        '> ul > li > p:last-child': {\n          marginBottom: em(24, 20),\n        },\n        '> ol > li > p:first-child': {\n          marginTop: em(24, 20),\n        },\n        '> ol > li > p:last-child': {\n          marginBottom: em(24, 20),\n        },\n        'ul ul, ul ol, ol ul, ol ol': {\n          marginTop: em(16, 20),\n          marginBottom: em(16, 20),\n        },\n        dl: {\n          marginTop: em(24, 20),\n          marginBottom: em(24, 20),\n        },\n        dt: {\n          marginTop: em(24, 20),\n        },\n        dd: {\n          marginTop: em(12, 20),\n          paddingInlineStart: em(32, 20),\n        },\n        hr: {\n          marginTop: em(56, 20),\n          marginBottom: em(56, 20),\n        },\n        'hr + *': {\n          marginTop: '0',\n        },\n        'h2 + *': {\n          marginTop: '0',\n        },\n        'h3 + *': {\n          marginTop: '0',\n        },\n        'h4 + *': {\n          marginTop: '0',\n        },\n        table: {\n          fontSize: em(18, 20),\n          lineHeight: round(28 / 18),\n        },\n        'thead th': {\n          paddingInlineEnd: em(12, 18),\n          paddingBottom: em(16, 18),\n          paddingInlineStart: em(12, 18),\n        },\n        'thead th:first-child': {\n          paddingInlineStart: '0',\n        },\n        'thead th:last-child': {\n          paddingInlineEnd: '0',\n        },\n        'tbody td, tfoot td': {\n          paddingTop: em(16, 18),\n          paddingInlineEnd: em(12, 18),\n          paddingBottom: em(16, 18),\n          paddingInlineStart: em(12, 18),\n        },\n        'tbody td:first-child, tfoot td:first-child': {\n          paddingInlineStart: '0',\n        },\n        'tbody td:last-child, tfoot td:last-child': {\n          paddingInlineEnd: '0',\n        },\n        figure: {\n          marginTop: em(40, 20),\n          marginBottom: em(40, 20),\n        },\n        'figure > *': {\n          marginTop: '0',\n          marginBottom: '0',\n        },\n        figcaption: {\n          fontSize: em(18, 20),\n          lineHeight: round(28 / 18),\n          marginTop: em(18, 18),\n        },\n      },\n      {\n        '> :first-child': {\n          marginTop: '0',\n        },\n        '> :last-child': {\n          marginBottom: '0',\n        },\n      },\n    ],\n  },\n  '2xl': {\n    css: [\n      {\n        fontSize: rem(24),\n        lineHeight: round(40 / 24),\n        p: {\n          marginTop: em(32, 24),\n          marginBottom: em(32, 24),\n        },\n        '[class~=\"lead\"]': {\n          fontSize: em(30, 24),\n          lineHeight: round(44 / 30),\n          marginTop: em(32, 30),\n          marginBottom: em(32, 30),\n        },\n        blockquote: {\n          marginTop: em(64, 36),\n          marginBottom: em(64, 36),\n          paddingInlineStart: em(40, 36),\n        },\n        h1: {\n          fontSize: em(64, 24),\n          marginTop: '0',\n          marginBottom: em(56, 64),\n          lineHeight: round(64 / 64),\n        },\n        h2: {\n          fontSize: em(48, 24),\n          marginTop: em(72, 48),\n          marginBottom: em(40, 48),\n          lineHeight: round(52 / 48),\n        },\n        h3: {\n          fontSize: em(36, 24),\n          marginTop: em(56, 36),\n          marginBottom: em(24, 36),\n          lineHeight: round(44 / 36),\n        },\n        h4: {\n          marginTop: em(40, 24),\n          marginBottom: em(16, 24),\n          lineHeight: round(36 / 24),\n        },\n        img: {\n          marginTop: em(48, 24),\n          marginBottom: em(48, 24),\n        },\n        picture: {\n          marginTop: em(48, 24),\n          marginBottom: em(48, 24),\n        },\n        'picture > img': {\n          marginTop: '0',\n          marginBottom: '0',\n        },\n        video: {\n          marginTop: em(48, 24),\n          marginBottom: em(48, 24),\n        },\n        kbd: {\n          fontSize: em(20, 24),\n          borderRadius: rem(6),\n          paddingTop: em(6, 24),\n          paddingInlineEnd: em(8, 24),\n          paddingBottom: em(6, 24),\n          paddingInlineStart: em(8, 24),\n        },\n        code: {\n          fontSize: em(20, 24),\n        },\n        'h2 code': {\n          fontSize: em(42, 48),\n        },\n        'h3 code': {\n          fontSize: em(32, 36),\n        },\n        pre: {\n          fontSize: em(20, 24),\n          lineHeight: round(36 / 20),\n          marginTop: em(40, 20),\n          marginBottom: em(40, 20),\n          borderRadius: rem(8),\n          paddingTop: em(24, 20),\n          paddingInlineEnd: em(32, 20),\n          paddingBottom: em(24, 20),\n          paddingInlineStart: em(32, 20),\n        },\n        ol: {\n          marginTop: em(32, 24),\n          marginBottom: em(32, 24),\n          paddingInlineStart: em(38, 24),\n        },\n        ul: {\n          marginTop: em(32, 24),\n          marginBottom: em(32, 24),\n          paddingInlineStart: em(38, 24),\n        },\n        li: {\n          marginTop: em(12, 24),\n          marginBottom: em(12, 24),\n        },\n        'ol > li': {\n          paddingInlineStart: em(10, 24),\n        },\n        'ul > li': {\n          paddingInlineStart: em(10, 24),\n        },\n        '> ul > li p': {\n          marginTop: em(20, 24),\n          marginBottom: em(20, 24),\n        },\n        '> ul > li > p:first-child': {\n          marginTop: em(32, 24),\n        },\n        '> ul > li > p:last-child': {\n          marginBottom: em(32, 24),\n        },\n        '> ol > li > p:first-child': {\n          marginTop: em(32, 24),\n        },\n        '> ol > li > p:last-child': {\n          marginBottom: em(32, 24),\n        },\n        'ul ul, ul ol, ol ul, ol ol': {\n          marginTop: em(16, 24),\n          marginBottom: em(16, 24),\n        },\n        dl: {\n          marginTop: em(32, 24),\n          marginBottom: em(32, 24),\n        },\n        dt: {\n          marginTop: em(32, 24),\n        },\n        dd: {\n          marginTop: em(12, 24),\n          paddingInlineStart: em(38, 24),\n        },\n        hr: {\n          marginTop: em(72, 24),\n          marginBottom: em(72, 24),\n        },\n        'hr + *': {\n          marginTop: '0',\n        },\n        'h2 + *': {\n          marginTop: '0',\n        },\n        'h3 + *': {\n          marginTop: '0',\n        },\n        'h4 + *': {\n          marginTop: '0',\n        },\n        table: {\n          fontSize: em(20, 24),\n          lineHeight: round(28 / 20),\n        },\n        'thead th': {\n          paddingInlineEnd: em(12, 20),\n          paddingBottom: em(16, 20),\n          paddingInlineStart: em(12, 20),\n        },\n        'thead th:first-child': {\n          paddingInlineStart: '0',\n        },\n        'thead th:last-child': {\n          paddingInlineEnd: '0',\n        },\n        'tbody td, tfoot td': {\n          paddingTop: em(16, 20),\n          paddingInlineEnd: em(12, 20),\n          paddingBottom: em(16, 20),\n          paddingInlineStart: em(12, 20),\n        },\n        'tbody td:first-child, tfoot td:first-child': {\n          paddingInlineStart: '0',\n        },\n        'tbody td:last-child, tfoot td:last-child': {\n          paddingInlineEnd: '0',\n        },\n        figure: {\n          marginTop: em(48, 24),\n          marginBottom: em(48, 24),\n        },\n        'figure > *': {\n          marginTop: '0',\n          marginBottom: '0',\n        },\n        figcaption: {\n          fontSize: em(20, 24),\n          lineHeight: round(32 / 20),\n          marginTop: em(20, 20),\n        },\n      },\n      {\n        '> :first-child': {\n          marginTop: '0',\n        },\n        '> :last-child': {\n          marginBottom: '0',\n        },\n      },\n    ],\n  },\n\n  // Gray color themes\n\n  slate: {\n    css: {\n      '--tw-prose-body': colors.slate[700],\n      '--tw-prose-headings': colors.slate[900],\n      '--tw-prose-lead': colors.slate[600],\n      '--tw-prose-links': colors.slate[900],\n      '--tw-prose-bold': colors.slate[900],\n      '--tw-prose-counters': colors.slate[500],\n      '--tw-prose-bullets': colors.slate[300],\n      '--tw-prose-hr': colors.slate[200],\n      '--tw-prose-quotes': colors.slate[900],\n      '--tw-prose-quote-borders': colors.slate[200],\n      '--tw-prose-captions': colors.slate[500],\n      '--tw-prose-kbd': colors.slate[900],\n      '--tw-prose-kbd-shadows': hexToRgb(colors.slate[900]),\n      '--tw-prose-code': colors.slate[900],\n      '--tw-prose-pre-code': colors.slate[200],\n      '--tw-prose-pre-bg': colors.slate[800],\n      '--tw-prose-th-borders': colors.slate[300],\n      '--tw-prose-td-borders': colors.slate[200],\n      '--tw-prose-invert-body': colors.slate[300],\n      '--tw-prose-invert-headings': colors.white,\n      '--tw-prose-invert-lead': colors.slate[400],\n      '--tw-prose-invert-links': colors.white,\n      '--tw-prose-invert-bold': colors.white,\n      '--tw-prose-invert-counters': colors.slate[400],\n      '--tw-prose-invert-bullets': colors.slate[600],\n      '--tw-prose-invert-hr': colors.slate[700],\n      '--tw-prose-invert-quotes': colors.slate[100],\n      '--tw-prose-invert-quote-borders': colors.slate[700],\n      '--tw-prose-invert-captions': colors.slate[400],\n      '--tw-prose-invert-kbd': colors.white,\n      '--tw-prose-invert-kbd-shadows': hexToRgb(colors.white),\n      '--tw-prose-invert-code': colors.white,\n      '--tw-prose-invert-pre-code': colors.slate[300],\n      '--tw-prose-invert-pre-bg': 'rgb(0 0 0 / 50%)',\n      '--tw-prose-invert-th-borders': colors.slate[600],\n      '--tw-prose-invert-td-borders': colors.slate[700],\n    },\n  },\n\n  gray: {\n    css: {\n      '--tw-prose-body': colors.gray[700],\n      '--tw-prose-headings': colors.gray[900],\n      '--tw-prose-lead': colors.gray[600],\n      '--tw-prose-links': colors.gray[900],\n      '--tw-prose-bold': colors.gray[900],\n      '--tw-prose-counters': colors.gray[500],\n      '--tw-prose-bullets': colors.gray[300],\n      '--tw-prose-hr': colors.gray[200],\n      '--tw-prose-quotes': colors.gray[900],\n      '--tw-prose-quote-borders': colors.gray[200],\n      '--tw-prose-captions': colors.gray[500],\n      '--tw-prose-kbd': colors.gray[900],\n      '--tw-prose-kbd-shadows': hexToRgb(colors.gray[900]),\n      '--tw-prose-code': colors.gray[900],\n      '--tw-prose-pre-code': colors.gray[200],\n      '--tw-prose-pre-bg': colors.gray[800],\n      '--tw-prose-th-borders': colors.gray[300],\n      '--tw-prose-td-borders': colors.gray[200],\n      '--tw-prose-invert-body': colors.gray[300],\n      '--tw-prose-invert-headings': colors.white,\n      '--tw-prose-invert-lead': colors.gray[400],\n      '--tw-prose-invert-links': colors.white,\n      '--tw-prose-invert-bold': colors.white,\n      '--tw-prose-invert-counters': colors.gray[400],\n      '--tw-prose-invert-bullets': colors.gray[600],\n      '--tw-prose-invert-hr': colors.gray[700],\n      '--tw-prose-invert-quotes': colors.gray[100],\n      '--tw-prose-invert-quote-borders': colors.gray[700],\n      '--tw-prose-invert-captions': colors.gray[400],\n      '--tw-prose-invert-kbd': colors.white,\n      '--tw-prose-invert-kbd-shadows': hexToRgb(colors.white),\n      '--tw-prose-invert-code': colors.white,\n      '--tw-prose-invert-pre-code': colors.gray[300],\n      '--tw-prose-invert-pre-bg': 'rgb(0 0 0 / 50%)',\n      '--tw-prose-invert-th-borders': colors.gray[600],\n      '--tw-prose-invert-td-borders': colors.gray[700],\n    },\n  },\n\n  zinc: {\n    css: {\n      '--tw-prose-body': colors.zinc[700],\n      '--tw-prose-headings': colors.zinc[900],\n      '--tw-prose-lead': colors.zinc[600],\n      '--tw-prose-links': colors.zinc[900],\n      '--tw-prose-bold': colors.zinc[900],\n      '--tw-prose-counters': colors.zinc[500],\n      '--tw-prose-bullets': colors.zinc[300],\n      '--tw-prose-hr': colors.zinc[200],\n      '--tw-prose-quotes': colors.zinc[900],\n      '--tw-prose-quote-borders': colors.zinc[200],\n      '--tw-prose-captions': colors.zinc[500],\n      '--tw-prose-kbd': colors.zinc[900],\n      '--tw-prose-kbd-shadows': hexToRgb(colors.zinc[900]),\n      '--tw-prose-code': colors.zinc[900],\n      '--tw-prose-pre-code': colors.zinc[200],\n      '--tw-prose-pre-bg': colors.zinc[800],\n      '--tw-prose-th-borders': colors.zinc[300],\n      '--tw-prose-td-borders': colors.zinc[200],\n      '--tw-prose-invert-body': colors.zinc[300],\n      '--tw-prose-invert-headings': colors.white,\n      '--tw-prose-invert-lead': colors.zinc[400],\n      '--tw-prose-invert-links': colors.white,\n      '--tw-prose-invert-bold': colors.white,\n      '--tw-prose-invert-counters': colors.zinc[400],\n      '--tw-prose-invert-bullets': colors.zinc[600],\n      '--tw-prose-invert-hr': colors.zinc[700],\n      '--tw-prose-invert-quotes': colors.zinc[100],\n      '--tw-prose-invert-quote-borders': colors.zinc[700],\n      '--tw-prose-invert-captions': colors.zinc[400],\n      '--tw-prose-invert-kbd': colors.white,\n      '--tw-prose-invert-kbd-shadows': hexToRgb(colors.white),\n      '--tw-prose-invert-code': colors.white,\n      '--tw-prose-invert-pre-code': colors.zinc[300],\n      '--tw-prose-invert-pre-bg': 'rgb(0 0 0 / 50%)',\n      '--tw-prose-invert-th-borders': colors.zinc[600],\n      '--tw-prose-invert-td-borders': colors.zinc[700],\n    },\n  },\n\n  neutral: {\n    css: {\n      '--tw-prose-body': colors.neutral[700],\n      '--tw-prose-headings': colors.neutral[900],\n      '--tw-prose-lead': colors.neutral[600],\n      '--tw-prose-links': colors.neutral[900],\n      '--tw-prose-bold': colors.neutral[900],\n      '--tw-prose-counters': colors.neutral[500],\n      '--tw-prose-bullets': colors.neutral[300],\n      '--tw-prose-hr': colors.neutral[200],\n      '--tw-prose-quotes': colors.neutral[900],\n      '--tw-prose-quote-borders': colors.neutral[200],\n      '--tw-prose-captions': colors.neutral[500],\n      '--tw-prose-kbd': colors.neutral[900],\n      '--tw-prose-kbd-shadows': hexToRgb(colors.neutral[900]),\n      '--tw-prose-code': colors.neutral[900],\n      '--tw-prose-pre-code': colors.neutral[200],\n      '--tw-prose-pre-bg': colors.neutral[800],\n      '--tw-prose-th-borders': colors.neutral[300],\n      '--tw-prose-td-borders': colors.neutral[200],\n      '--tw-prose-invert-body': colors.neutral[300],\n      '--tw-prose-invert-headings': colors.white,\n      '--tw-prose-invert-lead': colors.neutral[400],\n      '--tw-prose-invert-links': colors.white,\n      '--tw-prose-invert-bold': colors.white,\n      '--tw-prose-invert-counters': colors.neutral[400],\n      '--tw-prose-invert-bullets': colors.neutral[600],\n      '--tw-prose-invert-hr': colors.neutral[700],\n      '--tw-prose-invert-quotes': colors.neutral[100],\n      '--tw-prose-invert-quote-borders': colors.neutral[700],\n      '--tw-prose-invert-captions': colors.neutral[400],\n      '--tw-prose-invert-kbd': colors.white,\n      '--tw-prose-invert-kbd-shadows': hexToRgb(colors.white),\n      '--tw-prose-invert-code': colors.white,\n      '--tw-prose-invert-pre-code': colors.neutral[300],\n      '--tw-prose-invert-pre-bg': 'rgb(0 0 0 / 50%)',\n      '--tw-prose-invert-th-borders': colors.neutral[600],\n      '--tw-prose-invert-td-borders': colors.neutral[700],\n    },\n  },\n\n  stone: {\n    css: {\n      '--tw-prose-body': colors.stone[700],\n      '--tw-prose-headings': colors.stone[900],\n      '--tw-prose-lead': colors.stone[600],\n      '--tw-prose-links': colors.stone[900],\n      '--tw-prose-bold': colors.stone[900],\n      '--tw-prose-counters': colors.stone[500],\n      '--tw-prose-bullets': colors.stone[300],\n      '--tw-prose-hr': colors.stone[200],\n      '--tw-prose-quotes': colors.stone[900],\n      '--tw-prose-quote-borders': colors.stone[200],\n      '--tw-prose-captions': colors.stone[500],\n      '--tw-prose-kbd': colors.stone[900],\n      '--tw-prose-kbd-shadows': hexToRgb(colors.stone[900]),\n      '--tw-prose-code': colors.stone[900],\n      '--tw-prose-pre-code': colors.stone[200],\n      '--tw-prose-pre-bg': colors.stone[800],\n      '--tw-prose-th-borders': colors.stone[300],\n      '--tw-prose-td-borders': colors.stone[200],\n      '--tw-prose-invert-body': colors.stone[300],\n      '--tw-prose-invert-headings': colors.white,\n      '--tw-prose-invert-lead': colors.stone[400],\n      '--tw-prose-invert-links': colors.white,\n      '--tw-prose-invert-bold': colors.white,\n      '--tw-prose-invert-counters': colors.stone[400],\n      '--tw-prose-invert-bullets': colors.stone[600],\n      '--tw-prose-invert-hr': colors.stone[700],\n      '--tw-prose-invert-quotes': colors.stone[100],\n      '--tw-prose-invert-quote-borders': colors.stone[700],\n      '--tw-prose-invert-captions': colors.stone[400],\n      '--tw-prose-invert-kbd': colors.white,\n      '--tw-prose-invert-kbd-shadows': hexToRgb(colors.white),\n      '--tw-prose-invert-code': colors.white,\n      '--tw-prose-invert-pre-code': colors.stone[300],\n      '--tw-prose-invert-pre-bg': 'rgb(0 0 0 / 50%)',\n      '--tw-prose-invert-th-borders': colors.stone[600],\n      '--tw-prose-invert-td-borders': colors.stone[700],\n    },\n  },\n\n  // Link-only themes (for backward compatibility)\n\n  red: {\n    css: {\n      '--tw-prose-links': colors.red[600],\n      '--tw-prose-invert-links': colors.red[500],\n    },\n  },\n\n  orange: {\n    css: {\n      '--tw-prose-links': colors.orange[600],\n      '--tw-prose-invert-links': colors.orange[500],\n    },\n  },\n\n  amber: {\n    css: {\n      '--tw-prose-links': colors.amber[600],\n      '--tw-prose-invert-links': colors.amber[500],\n    },\n  },\n\n  yellow: {\n    css: {\n      '--tw-prose-links': colors.yellow[600],\n      '--tw-prose-invert-links': colors.yellow[500],\n    },\n  },\n\n  lime: {\n    css: {\n      '--tw-prose-links': colors.lime[600],\n      '--tw-prose-invert-links': colors.lime[500],\n    },\n  },\n\n  green: {\n    css: {\n      '--tw-prose-links': colors.green[600],\n      '--tw-prose-invert-links': colors.green[500],\n    },\n  },\n\n  emerald: {\n    css: {\n      '--tw-prose-links': colors.emerald[600],\n      '--tw-prose-invert-links': colors.emerald[500],\n    },\n  },\n\n  teal: {\n    css: {\n      '--tw-prose-links': colors.teal[600],\n      '--tw-prose-invert-links': colors.teal[500],\n    },\n  },\n\n  cyan: {\n    css: {\n      '--tw-prose-links': colors.cyan[600],\n      '--tw-prose-invert-links': colors.cyan[500],\n    },\n  },\n\n  sky: {\n    css: {\n      '--tw-prose-links': colors.sky[600],\n      '--tw-prose-invert-links': colors.sky[500],\n    },\n  },\n\n  blue: {\n    css: {\n      '--tw-prose-links': colors.blue[600],\n      '--tw-prose-invert-links': colors.blue[500],\n    },\n  },\n\n  indigo: {\n    css: {\n      '--tw-prose-links': colors.indigo[600],\n      '--tw-prose-invert-links': colors.indigo[500],\n    },\n  },\n\n  violet: {\n    css: {\n      '--tw-prose-links': colors.violet[600],\n      '--tw-prose-invert-links': colors.violet[500],\n    },\n  },\n\n  purple: {\n    css: {\n      '--tw-prose-links': colors.purple[600],\n      '--tw-prose-invert-links': colors.purple[500],\n    },\n  },\n\n  fuchsia: {\n    css: {\n      '--tw-prose-links': colors.fuchsia[600],\n      '--tw-prose-invert-links': colors.fuchsia[500],\n    },\n  },\n\n  pink: {\n    css: {\n      '--tw-prose-links': colors.pink[600],\n      '--tw-prose-invert-links': colors.pink[500],\n    },\n  },\n\n  rose: {\n    css: {\n      '--tw-prose-links': colors.rose[600],\n      '--tw-prose-invert-links': colors.rose[500],\n    },\n  },\n\n  // Invert (for dark mode)\n  invert: {\n    css: {\n      '--tw-prose-body': 'var(--tw-prose-invert-body)',\n      '--tw-prose-headings': 'var(--tw-prose-invert-headings)',\n      '--tw-prose-lead': 'var(--tw-prose-invert-lead)',\n      '--tw-prose-links': 'var(--tw-prose-invert-links)',\n      '--tw-prose-bold': 'var(--tw-prose-invert-bold)',\n      '--tw-prose-counters': 'var(--tw-prose-invert-counters)',\n      '--tw-prose-bullets': 'var(--tw-prose-invert-bullets)',\n      '--tw-prose-hr': 'var(--tw-prose-invert-hr)',\n      '--tw-prose-quotes': 'var(--tw-prose-invert-quotes)',\n      '--tw-prose-quote-borders': 'var(--tw-prose-invert-quote-borders)',\n      '--tw-prose-captions': 'var(--tw-prose-invert-captions)',\n      '--tw-prose-kbd': 'var(--tw-prose-invert-kbd)',\n      '--tw-prose-kbd-shadows': 'var(--tw-prose-invert-kbd-shadows)',\n      '--tw-prose-code': 'var(--tw-prose-invert-code)',\n      '--tw-prose-pre-code': 'var(--tw-prose-invert-pre-code)',\n      '--tw-prose-pre-bg': 'var(--tw-prose-invert-pre-bg)',\n      '--tw-prose-th-borders': 'var(--tw-prose-invert-th-borders)',\n      '--tw-prose-td-borders': 'var(--tw-prose-invert-td-borders)',\n    },\n  },\n}\n\nmodule.exports = {\n  DEFAULT: {\n    css: [\n      {\n        color: 'var(--tw-prose-body)',\n        maxWidth: '65ch',\n        p: {}, // Required to maintain correct order when merging\n        '[class~=\"lead\"]': {\n          color: 'var(--tw-prose-lead)',\n        },\n        a: {\n          color: 'var(--tw-prose-links)',\n          textDecoration: 'underline',\n          fontWeight: '500',\n        },\n        strong: {\n          color: 'var(--tw-prose-bold)',\n          fontWeight: '600',\n        },\n        'a strong': {\n          color: 'inherit',\n        },\n        'blockquote strong': {\n          color: 'inherit',\n        },\n        'thead th strong': {\n          color: 'inherit',\n        },\n        ol: {\n          listStyleType: 'decimal',\n        },\n        'ol[type=\"A\"]': {\n          listStyleType: 'upper-alpha',\n        },\n        'ol[type=\"a\"]': {\n          listStyleType: 'lower-alpha',\n        },\n        'ol[type=\"A\" s]': {\n          listStyleType: 'upper-alpha',\n        },\n        'ol[type=\"a\" s]': {\n          listStyleType: 'lower-alpha',\n        },\n        'ol[type=\"I\"]': {\n          listStyleType: 'upper-roman',\n        },\n        'ol[type=\"i\"]': {\n          listStyleType: 'lower-roman',\n        },\n        'ol[type=\"I\" s]': {\n          listStyleType: 'upper-roman',\n        },\n        'ol[type=\"i\" s]': {\n          listStyleType: 'lower-roman',\n        },\n        'ol[type=\"1\"]': {\n          listStyleType: 'decimal',\n        },\n        ul: {\n          listStyleType: 'disc',\n        },\n        'ol > li::marker': {\n          fontWeight: '400',\n          color: 'var(--tw-prose-counters)',\n        },\n        'ul > li::marker': {\n          color: 'var(--tw-prose-bullets)',\n        },\n        dt: {\n          color: 'var(--tw-prose-headings)',\n          fontWeight: '600',\n        },\n        hr: {\n          borderColor: 'var(--tw-prose-hr)',\n          borderTopWidth: 1,\n        },\n        blockquote: {\n          fontWeight: '500',\n          fontStyle: 'italic',\n          color: 'var(--tw-prose-quotes)',\n          borderInlineStartWidth: '0.25rem',\n          borderInlineStartColor: 'var(--tw-prose-quote-borders)',\n          quotes: '\"\\\\201C\"\"\\\\201D\"\"\\\\2018\"\"\\\\2019\"',\n        },\n        'blockquote p:first-of-type::before': {\n          content: 'open-quote',\n        },\n        'blockquote p:last-of-type::after': {\n          content: 'close-quote',\n        },\n        h1: {\n          color: 'var(--tw-prose-headings)',\n          fontWeight: '800',\n        },\n        'h1 strong': {\n          fontWeight: '900',\n          color: 'inherit',\n        },\n        h2: {\n          color: 'var(--tw-prose-headings)',\n          fontWeight: '700',\n        },\n        'h2 strong': {\n          fontWeight: '800',\n          color: 'inherit',\n        },\n        h3: {\n          color: 'var(--tw-prose-headings)',\n          fontWeight: '600',\n        },\n        'h3 strong': {\n          fontWeight: '700',\n          color: 'inherit',\n        },\n        h4: {\n          color: 'var(--tw-prose-headings)',\n          fontWeight: '600',\n        },\n        'h4 strong': {\n          fontWeight: '700',\n          color: 'inherit',\n        },\n        img: {}, // Required to maintain correct order when merging\n        picture: {\n          display: 'block',\n        },\n        video: {}, // Required to maintain correct order when merging\n        kbd: {\n          fontWeight: '500',\n          fontFamily: 'inherit',\n          color: 'var(--tw-prose-kbd)',\n          boxShadow:\n            '0 0 0 1px rgb(var(--tw-prose-kbd-shadows) / 10%), 0 3px 0 rgb(var(--tw-prose-kbd-shadows) / 10%)',\n        },\n        code: {\n          color: 'var(--tw-prose-code)',\n          fontWeight: '600',\n        },\n        'code::before': {\n          content: '\"`\"',\n        },\n        'code::after': {\n          content: '\"`\"',\n        },\n        'a code': {\n          color: 'inherit',\n        },\n        'h1 code': {\n          color: 'inherit',\n        },\n        'h2 code': {\n          color: 'inherit',\n        },\n        'h3 code': {\n          color: 'inherit',\n        },\n        'h4 code': {\n          color: 'inherit',\n        },\n        'blockquote code': {\n          color: 'inherit',\n        },\n        'thead th code': {\n          color: 'inherit',\n        },\n        pre: {\n          color: 'var(--tw-prose-pre-code)',\n          backgroundColor: 'var(--tw-prose-pre-bg)',\n          overflowX: 'auto',\n          fontWeight: '400',\n        },\n        'pre code': {\n          backgroundColor: 'transparent',\n          borderWidth: '0',\n          borderRadius: '0',\n          padding: '0',\n          fontWeight: 'inherit',\n          color: 'inherit',\n          fontSize: 'inherit',\n          fontFamily: 'inherit',\n          lineHeight: 'inherit',\n        },\n        'pre code::before': {\n          content: 'none',\n        },\n        'pre code::after': {\n          content: 'none',\n        },\n        table: {\n          width: '100%',\n          tableLayout: 'auto',\n          marginTop: em(32, 16),\n          marginBottom: em(32, 16),\n        },\n        thead: {\n          borderBottomWidth: '1px',\n          borderBottomColor: 'var(--tw-prose-th-borders)',\n        },\n        'thead th': {\n          color: 'var(--tw-prose-headings)',\n          fontWeight: '600',\n          verticalAlign: 'bottom',\n        },\n        'tbody tr': {\n          borderBottomWidth: '1px',\n          borderBottomColor: 'var(--tw-prose-td-borders)',\n        },\n        'tbody tr:last-child': {\n          borderBottomWidth: '0',\n        },\n        'tbody td': {\n          verticalAlign: 'baseline',\n        },\n        tfoot: {\n          borderTopWidth: '1px',\n          borderTopColor: 'var(--tw-prose-th-borders)',\n        },\n        'tfoot td': {\n          verticalAlign: 'top',\n        },\n        'th, td': {\n          textAlign: 'start',\n        },\n        'figure > *': {}, // Required to maintain correct order when merging\n        figcaption: {\n          color: 'var(--tw-prose-captions)',\n        },\n      },\n      defaultModifiers.gray.css,\n      ...defaultModifiers.base.css,\n    ],\n  },\n  ...defaultModifiers,\n}\n","'use strict';\nvar defineProperty = require('../internals/object-define-property').f;\n\nmodule.exports = function (Target, Source, key) {\n  key in Target || defineProperty(Target, key, {\n    configurable: true,\n    get: function () { return Source[key]; },\n    set: function (it) { Source[key] = it; }\n  });\n};\n","'use strict';\nvar internalObjectKeys = require('../internals/object-keys-internal');\nvar enumBugKeys = require('../internals/enum-bug-keys');\n\n// `Object.keys` method\n// https://tc39.es/ecma262/#sec-object.keys\n// eslint-disable-next-line es/no-object-keys -- safe\nmodule.exports = Object.keys || function keys(O) {\n  return internalObjectKeys(O, enumBugKeys);\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar call = require('../internals/function-call');\nvar IS_PURE = require('../internals/is-pure');\nvar FunctionName = require('../internals/function-name');\nvar isCallable = require('../internals/is-callable');\nvar createIteratorConstructor = require('../internals/iterator-create-constructor');\nvar getPrototypeOf = require('../internals/object-get-prototype-of');\nvar setPrototypeOf = require('../internals/object-set-prototype-of');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar defineBuiltIn = require('../internals/define-built-in');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar Iterators = require('../internals/iterators');\nvar IteratorsCore = require('../internals/iterators-core');\n\nvar PROPER_FUNCTION_NAME = FunctionName.PROPER;\nvar CONFIGURABLE_FUNCTION_NAME = FunctionName.CONFIGURABLE;\nvar IteratorPrototype = IteratorsCore.IteratorPrototype;\nvar BUGGY_SAFARI_ITERATORS = IteratorsCore.BUGGY_SAFARI_ITERATORS;\nvar ITERATOR = wellKnownSymbol('iterator');\nvar KEYS = 'keys';\nvar VALUES = 'values';\nvar ENTRIES = 'entries';\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (Iterable, NAME, IteratorConstructor, next, DEFAULT, IS_SET, FORCED) {\n  createIteratorConstructor(IteratorConstructor, NAME, next);\n\n  var getIterationMethod = function (KIND) {\n    if (KIND === DEFAULT && defaultIterator) return defaultIterator;\n    if (!BUGGY_SAFARI_ITERATORS && KIND && KIND in IterablePrototype) return IterablePrototype[KIND];\n\n    switch (KIND) {\n      case KEYS: return function keys() { return new IteratorConstructor(this, KIND); };\n      case VALUES: return function values() { return new IteratorConstructor(this, KIND); };\n      case ENTRIES: return function entries() { return new IteratorConstructor(this, KIND); };\n    }\n\n    return function () { return new IteratorConstructor(this); };\n  };\n\n  var TO_STRING_TAG = NAME + ' Iterator';\n  var INCORRECT_VALUES_NAME = false;\n  var IterablePrototype = Iterable.prototype;\n  var nativeIterator = IterablePrototype[ITERATOR]\n    || IterablePrototype['@@iterator']\n    || DEFAULT && IterablePrototype[DEFAULT];\n  var defaultIterator = !BUGGY_SAFARI_ITERATORS && nativeIterator || getIterationMethod(DEFAULT);\n  var anyNativeIterator = NAME === 'Array' ? IterablePrototype.entries || nativeIterator : nativeIterator;\n  var CurrentIteratorPrototype, methods, KEY;\n\n  // fix native\n  if (anyNativeIterator) {\n    CurrentIteratorPrototype = getPrototypeOf(anyNativeIterator.call(new Iterable()));\n    if (CurrentIteratorPrototype !== Object.prototype && CurrentIteratorPrototype.next) {\n      if (!IS_PURE && getPrototypeOf(CurrentIteratorPrototype) !== IteratorPrototype) {\n        if (setPrototypeOf) {\n          setPrototypeOf(CurrentIteratorPrototype, IteratorPrototype);\n        } else if (!isCallable(CurrentIteratorPrototype[ITERATOR])) {\n          defineBuiltIn(CurrentIteratorPrototype, ITERATOR, returnThis);\n        }\n      }\n      // Set @@toStringTag to native iterators\n      setToStringTag(CurrentIteratorPrototype, TO_STRING_TAG, true, true);\n      if (IS_PURE) Iterators[TO_STRING_TAG] = returnThis;\n    }\n  }\n\n  // fix Array.prototype.{ values, @@iterator }.name in V8 / FF\n  if (PROPER_FUNCTION_NAME && DEFAULT === VALUES && nativeIterator && nativeIterator.name !== VALUES) {\n    if (!IS_PURE && CONFIGURABLE_FUNCTION_NAME) {\n      createNonEnumerableProperty(IterablePrototype, 'name', VALUES);\n    } else {\n      INCORRECT_VALUES_NAME = true;\n      defaultIterator = function values() { return call(nativeIterator, this); };\n    }\n  }\n\n  // export additional methods\n  if (DEFAULT) {\n    methods = {\n      values: getIterationMethod(VALUES),\n      keys: IS_SET ? defaultIterator : getIterationMethod(KEYS),\n      entries: getIterationMethod(ENTRIES)\n    };\n    if (FORCED) for (KEY in methods) {\n      if (BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME || !(KEY in IterablePrototype)) {\n        defineBuiltIn(IterablePrototype, KEY, methods[KEY]);\n      }\n    } else $({ target: NAME, proto: true, forced: BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME }, methods);\n  }\n\n  // define iterator\n  if ((!IS_PURE || FORCED) && IterablePrototype[ITERATOR] !== defaultIterator) {\n    defineBuiltIn(IterablePrototype, ITERATOR, defaultIterator, { name: DEFAULT });\n  }\n  Iterators[NAME] = defaultIterator;\n\n  return methods;\n};\n","'use strict';\nmodule.exports = function (exec) {\n  try {\n    return { error: false, value: exec() };\n  } catch (error) {\n    return { error: true, value: error };\n  }\n};\n","/**\n * This splits a string on a top-level character.\n *\n * Regex doesn't support recursion (at least not the JS-flavored version).\n * So we have to use a tiny state machine to keep track of paren placement.\n *\n * Expected behavior using commas:\n * var(--a, 0 0 1px rgb(0, 0, 0)), 0 0 1px rgb(0, 0, 0)\n *       ─┬─             ┬  ┬    ┬\n *        x              x  x    ╰──────── Split because top-level\n *        ╰──────────────┴──┴───────────── Ignored b/c inside >= 1 levels of parens\n *\n * @param {string} input\n * @param {string} separator\n */ \"use strict\";\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nObject.defineProperty(exports, \"splitAtTopLevelOnly\", {\n    enumerable: true,\n    get: function() {\n        return splitAtTopLevelOnly;\n    }\n});\nfunction splitAtTopLevelOnly(input, separator) {\n    let stack = [];\n    let parts = [];\n    let lastPos = 0;\n    let isEscaped = false;\n    for(let idx = 0; idx < input.length; idx++){\n        let char = input[idx];\n        if (stack.length === 0 && char === separator[0] && !isEscaped) {\n            if (separator.length === 1 || input.slice(idx, idx + separator.length) === separator) {\n                parts.push(input.slice(lastPos, idx));\n                lastPos = idx + separator.length;\n            }\n        }\n        isEscaped = isEscaped ? false : char === \"\\\\\";\n        if (char === \"(\" || char === \"[\" || char === \"{\") {\n            stack.push(char);\n        } else if (char === \")\" && stack[stack.length - 1] === \"(\" || char === \"]\" && stack[stack.length - 1] === \"[\" || char === \"}\" && stack[stack.length - 1] === \"{\") {\n            stack.pop();\n        }\n    }\n    parts.push(input.slice(lastPos));\n    return parts;\n}\n","'use strict';\nvar NATIVE_WEAK_MAP = require('../internals/weak-map-basic-detection');\nvar globalThis = require('../internals/global-this');\nvar isObject = require('../internals/is-object');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar hasOwn = require('../internals/has-own-property');\nvar shared = require('../internals/shared-store');\nvar sharedKey = require('../internals/shared-key');\nvar hiddenKeys = require('../internals/hidden-keys');\n\nvar OBJECT_ALREADY_INITIALIZED = 'Object already initialized';\nvar TypeError = globalThis.TypeError;\nvar WeakMap = globalThis.WeakMap;\nvar set, get, has;\n\nvar enforce = function (it) {\n  return has(it) ? get(it) : set(it, {});\n};\n\nvar getterFor = function (TYPE) {\n  return function (it) {\n    var state;\n    if (!isObject(it) || (state = get(it)).type !== TYPE) {\n      throw new TypeError('Incompatible receiver, ' + TYPE + ' required');\n    } return state;\n  };\n};\n\nif (NATIVE_WEAK_MAP || shared.state) {\n  var store = shared.state || (shared.state = new WeakMap());\n  /* eslint-disable no-self-assign -- prototype methods protection */\n  store.get = store.get;\n  store.has = store.has;\n  store.set = store.set;\n  /* eslint-enable no-self-assign -- prototype methods protection */\n  set = function (it, metadata) {\n    if (store.has(it)) throw new TypeError(OBJECT_ALREADY_INITIALIZED);\n    metadata.facade = it;\n    store.set(it, metadata);\n    return metadata;\n  };\n  get = function (it) {\n    return store.get(it) || {};\n  };\n  has = function (it) {\n    return store.has(it);\n  };\n} else {\n  var STATE = sharedKey('state');\n  hiddenKeys[STATE] = true;\n  set = function (it, metadata) {\n    if (hasOwn(it, STATE)) throw new TypeError(OBJECT_ALREADY_INITIALIZED);\n    metadata.facade = it;\n    createNonEnumerableProperty(it, STATE, metadata);\n    return metadata;\n  };\n  get = function (it) {\n    return hasOwn(it, STATE) ? it[STATE] : {};\n  };\n  has = function (it) {\n    return hasOwn(it, STATE);\n  };\n}\n\nmodule.exports = {\n  set: set,\n  get: get,\n  has: has,\n  enforce: enforce,\n  getterFor: getterFor\n};\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\n\n// `thisNumberValue` abstract operation\n// https://tc39.es/ecma262/#sec-thisnumbervalue\nmodule.exports = uncurryThis(1.1.valueOf);\n","'use strict';\nvar $ = require('../internals/export');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar ownKeys = require('../internals/own-keys');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar getOwnPropertyDescriptorModule = require('../internals/object-get-own-property-descriptor');\nvar createProperty = require('../internals/create-property');\n\n// `Object.getOwnPropertyDescriptors` method\n// https://tc39.es/ecma262/#sec-object.getownpropertydescriptors\n$({ target: 'Object', stat: true, sham: !DESCRIPTORS }, {\n  getOwnPropertyDescriptors: function getOwnPropertyDescriptors(object) {\n    var O = toIndexedObject(object);\n    var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;\n    var keys = ownKeys(O);\n    var result = {};\n    var index = 0;\n    var key, descriptor;\n    while (keys.length > index) {\n      descriptor = getOwnPropertyDescriptor(O, key = keys[index++]);\n      if (descriptor !== undefined) createProperty(result, key, descriptor);\n    }\n    return result;\n  }\n});\n","'use strict';\nvar trunc = require('../internals/math-trunc');\n\n// `ToIntegerOrInfinity` abstract operation\n// https://tc39.es/ecma262/#sec-tointegerorinfinity\nmodule.exports = function (argument) {\n  var number = +argument;\n  // eslint-disable-next-line no-self-compare -- NaN check\n  return number !== number || number === 0 ? 0 : trunc(number);\n};\n","'use strict';\nvar NATIVE_SYMBOL = require('../internals/symbol-constructor-detection');\n\n/* eslint-disable es/no-symbol -- safe */\nmodule.exports = NATIVE_SYMBOL && !!Symbol['for'] && !!Symbol.keyFor;\n","\"use strict\";\n\nexports.__esModule = true;\nexports.universal = exports.tag = exports.string = exports.selector = exports.root = exports.pseudo = exports.nesting = exports.id = exports.comment = exports.combinator = exports.className = exports.attribute = void 0;\n\nvar _attribute = _interopRequireDefault(require(\"./attribute\"));\n\nvar _className = _interopRequireDefault(require(\"./className\"));\n\nvar _combinator = _interopRequireDefault(require(\"./combinator\"));\n\nvar _comment = _interopRequireDefault(require(\"./comment\"));\n\nvar _id = _interopRequireDefault(require(\"./id\"));\n\nvar _nesting = _interopRequireDefault(require(\"./nesting\"));\n\nvar _pseudo = _interopRequireDefault(require(\"./pseudo\"));\n\nvar _root = _interopRequireDefault(require(\"./root\"));\n\nvar _selector = _interopRequireDefault(require(\"./selector\"));\n\nvar _string = _interopRequireDefault(require(\"./string\"));\n\nvar _tag = _interopRequireDefault(require(\"./tag\"));\n\nvar _universal = _interopRequireDefault(require(\"./universal\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nvar attribute = function attribute(opts) {\n  return new _attribute[\"default\"](opts);\n};\n\nexports.attribute = attribute;\n\nvar className = function className(opts) {\n  return new _className[\"default\"](opts);\n};\n\nexports.className = className;\n\nvar combinator = function combinator(opts) {\n  return new _combinator[\"default\"](opts);\n};\n\nexports.combinator = combinator;\n\nvar comment = function comment(opts) {\n  return new _comment[\"default\"](opts);\n};\n\nexports.comment = comment;\n\nvar id = function id(opts) {\n  return new _id[\"default\"](opts);\n};\n\nexports.id = id;\n\nvar nesting = function nesting(opts) {\n  return new _nesting[\"default\"](opts);\n};\n\nexports.nesting = nesting;\n\nvar pseudo = function pseudo(opts) {\n  return new _pseudo[\"default\"](opts);\n};\n\nexports.pseudo = pseudo;\n\nvar root = function root(opts) {\n  return new _root[\"default\"](opts);\n};\n\nexports.root = root;\n\nvar selector = function selector(opts) {\n  return new _selector[\"default\"](opts);\n};\n\nexports.selector = selector;\n\nvar string = function string(opts) {\n  return new _string[\"default\"](opts);\n};\n\nexports.string = string;\n\nvar tag = function tag(opts) {\n  return new _tag[\"default\"](opts);\n};\n\nexports.tag = tag;\n\nvar universal = function universal(opts) {\n  return new _universal[\"default\"](opts);\n};\n\nexports.universal = universal;","'use strict';\nvar $ = require('../internals/export');\nvar uncurryThis = require('../internals/function-uncurry-this-clause');\nvar getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;\nvar toLength = require('../internals/to-length');\nvar toString = require('../internals/to-string');\nvar notARegExp = require('../internals/not-a-regexp');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar correctIsRegExpLogic = require('../internals/correct-is-regexp-logic');\nvar IS_PURE = require('../internals/is-pure');\n\nvar stringSlice = uncurryThis(''.slice);\nvar min = Math.min;\n\nvar CORRECT_IS_REGEXP_LOGIC = correctIsRegExpLogic('startsWith');\n// https://github.com/zloirock/core-js/pull/702\nvar MDN_POLYFILL_BUG = !IS_PURE && !CORRECT_IS_REGEXP_LOGIC && !!function () {\n  var descriptor = getOwnPropertyDescriptor(String.prototype, 'startsWith');\n  return descriptor && !descriptor.writable;\n}();\n\n// `String.prototype.startsWith` method\n// https://tc39.es/ecma262/#sec-string.prototype.startswith\n$({ target: 'String', proto: true, forced: !MDN_POLYFILL_BUG && !CORRECT_IS_REGEXP_LOGIC }, {\n  startsWith: function startsWith(searchString /* , position = 0 */) {\n    var that = toString(requireObjectCoercible(this));\n    notARegExp(searchString);\n    var index = toLength(min(arguments.length > 1 ? arguments[1] : undefined, that.length));\n    var search = toString(searchString);\n    return stringSlice(that, index, index + search.length) === search;\n  }\n});\n","'use strict';\n// TODO: Remove this module from `core-js@4` since it's replaced to module below\nrequire('../modules/es.set.constructor');\n","\"use strict\";\n\nexports.__esModule = true;\nexports[\"default\"] = getProp;\n\nfunction getProp(obj) {\n  for (var _len = arguments.length, props = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n    props[_key - 1] = arguments[_key];\n  }\n\n  while (props.length > 0) {\n    var prop = props.shift();\n\n    if (!obj[prop]) {\n      return undefined;\n    }\n\n    obj = obj[prop];\n  }\n\n  return obj;\n}\n\nmodule.exports = exports.default;","'use strict';\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar MATCH = wellKnownSymbol('match');\n\nmodule.exports = function (METHOD_NAME) {\n  var regexp = /./;\n  try {\n    '/./'[METHOD_NAME](regexp);\n  } catch (error1) {\n    try {\n      regexp[MATCH] = false;\n      return '/./'[METHOD_NAME](regexp);\n    } catch (error2) { /* empty */ }\n  } return false;\n};\n","'use strict';\nvar arraySpeciesConstructor = require('../internals/array-species-constructor');\n\n// `ArraySpeciesCreate` abstract operation\n// https://tc39.es/ecma262/#sec-arrayspeciescreate\nmodule.exports = function (originalArray, length) {\n  return new (arraySpeciesConstructor(originalArray))(length === 0 ? 0 : length);\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar newPromiseCapabilityModule = require('../internals/new-promise-capability');\nvar FORCED_PROMISE_CONSTRUCTOR = require('../internals/promise-constructor-detection').CONSTRUCTOR;\n\n// `Promise.reject` method\n// https://tc39.es/ecma262/#sec-promise.reject\n$({ target: 'Promise', stat: true, forced: FORCED_PROMISE_CONSTRUCTOR }, {\n  reject: function reject(r) {\n    var capability = newPromiseCapabilityModule.f(this);\n    var capabilityReject = capability.reject;\n    capabilityReject(r);\n    return capability.promise;\n  }\n});\n","/*!\n * getSize v2.0.3\n * measure size of elements\n * MIT license\n */\n\n/* jshint browser: true, strict: true, undef: true, unused: true */\n/* globals console: false */\n\n( function( window, factory ) {\n  /* jshint strict: false */ /* globals define, module */\n  if ( typeof define == 'function' && define.amd ) {\n    // AMD\n    define( factory );\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory();\n  } else {\n    // browser global\n    window.getSize = factory();\n  }\n\n})( window, function factory() {\n'use strict';\n\n// -------------------------- helpers -------------------------- //\n\n// get a number from a string, not a percentage\nfunction getStyleSize( value ) {\n  var num = parseFloat( value );\n  // not a percent like '100%', and a number\n  var isValid = value.indexOf('%') == -1 && !isNaN( num );\n  return isValid && num;\n}\n\nfunction noop() {}\n\nvar logError = typeof console == 'undefined' ? noop :\n  function( message ) {\n    console.error( message );\n  };\n\n// -------------------------- measurements -------------------------- //\n\nvar measurements = [\n  'paddingLeft',\n  'paddingRight',\n  'paddingTop',\n  'paddingBottom',\n  'marginLeft',\n  'marginRight',\n  'marginTop',\n  'marginBottom',\n  'borderLeftWidth',\n  'borderRightWidth',\n  'borderTopWidth',\n  'borderBottomWidth'\n];\n\nvar measurementsLength = measurements.length;\n\nfunction getZeroSize() {\n  var size = {\n    width: 0,\n    height: 0,\n    innerWidth: 0,\n    innerHeight: 0,\n    outerWidth: 0,\n    outerHeight: 0\n  };\n  for ( var i=0; i < measurementsLength; i++ ) {\n    var measurement = measurements[i];\n    size[ measurement ] = 0;\n  }\n  return size;\n}\n\n// -------------------------- getStyle -------------------------- //\n\n/**\n * getStyle, get style of element, check for Firefox bug\n * https://bugzilla.mozilla.org/show_bug.cgi?id=548397\n */\nfunction getStyle( elem ) {\n  var style = getComputedStyle( elem );\n  if ( !style ) {\n    logError( 'Style returned ' + style +\n      '. Are you running this code in a hidden iframe on Firefox? ' +\n      'See https://bit.ly/getsizebug1' );\n  }\n  return style;\n}\n\n// -------------------------- setup -------------------------- //\n\nvar isSetup = false;\n\nvar isBoxSizeOuter;\n\n/**\n * setup\n * check isBoxSizerOuter\n * do on first getSize() rather than on page load for Firefox bug\n */\nfunction setup() {\n  // setup once\n  if ( isSetup ) {\n    return;\n  }\n  isSetup = true;\n\n  // -------------------------- box sizing -------------------------- //\n\n  /**\n   * Chrome & Safari measure the outer-width on style.width on border-box elems\n   * IE11 & Firefox<29 measures the inner-width\n   */\n  var div = document.createElement('div');\n  div.style.width = '200px';\n  div.style.padding = '1px 2px 3px 4px';\n  div.style.borderStyle = 'solid';\n  div.style.borderWidth = '1px 2px 3px 4px';\n  div.style.boxSizing = 'border-box';\n\n  var body = document.body || document.documentElement;\n  body.appendChild( div );\n  var style = getStyle( div );\n  // round value for browser zoom. desandro/masonry#928\n  isBoxSizeOuter = Math.round( getStyleSize( style.width ) ) == 200;\n  getSize.isBoxSizeOuter = isBoxSizeOuter;\n\n  body.removeChild( div );\n}\n\n// -------------------------- getSize -------------------------- //\n\nfunction getSize( elem ) {\n  setup();\n\n  // use querySeletor if elem is string\n  if ( typeof elem == 'string' ) {\n    elem = document.querySelector( elem );\n  }\n\n  // do not proceed on non-objects\n  if ( !elem || typeof elem != 'object' || !elem.nodeType ) {\n    return;\n  }\n\n  var style = getStyle( elem );\n\n  // if hidden, everything is 0\n  if ( style.display == 'none' ) {\n    return getZeroSize();\n  }\n\n  var size = {};\n  size.width = elem.offsetWidth;\n  size.height = elem.offsetHeight;\n\n  var isBorderBox = size.isBorderBox = style.boxSizing == 'border-box';\n\n  // get all measurements\n  for ( var i=0; i < measurementsLength; i++ ) {\n    var measurement = measurements[i];\n    var value = style[ measurement ];\n    var num = parseFloat( value );\n    // any 'auto', 'medium' value will be 0\n    size[ measurement ] = !isNaN( num ) ? num : 0;\n  }\n\n  var paddingWidth = size.paddingLeft + size.paddingRight;\n  var paddingHeight = size.paddingTop + size.paddingBottom;\n  var marginWidth = size.marginLeft + size.marginRight;\n  var marginHeight = size.marginTop + size.marginBottom;\n  var borderWidth = size.borderLeftWidth + size.borderRightWidth;\n  var borderHeight = size.borderTopWidth + size.borderBottomWidth;\n\n  var isBorderBoxSizeOuter = isBorderBox && isBoxSizeOuter;\n\n  // overwrite width and height if we can get it from style\n  var styleWidth = getStyleSize( style.width );\n  if ( styleWidth !== false ) {\n    size.width = styleWidth +\n      // add padding and border unless it's already including it\n      ( isBorderBoxSizeOuter ? 0 : paddingWidth + borderWidth );\n  }\n\n  var styleHeight = getStyleSize( style.height );\n  if ( styleHeight !== false ) {\n    size.height = styleHeight +\n      // add padding and border unless it's already including it\n      ( isBorderBoxSizeOuter ? 0 : paddingHeight + borderHeight );\n  }\n\n  size.innerWidth = size.width - ( paddingWidth + borderWidth );\n  size.innerHeight = size.height - ( paddingHeight + borderHeight );\n\n  size.outerWidth = size.width + marginWidth;\n  size.outerHeight = size.height + marginHeight;\n\n  return size;\n}\n\nreturn getSize;\n\n});\n","module.exports = {\n  content: [],\n  presets: [],\n  darkMode: 'media', // or 'class'\n  theme: {\n    accentColor: ({ theme }) => ({\n      ...theme('colors'),\n      auto: 'auto',\n    }),\n    animation: {\n      none: 'none',\n      spin: 'spin 1s linear infinite',\n      ping: 'ping 1s cubic-bezier(0, 0, 0.2, 1) infinite',\n      pulse: 'pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite',\n      bounce: 'bounce 1s infinite',\n    },\n    aria: {\n      busy: 'busy=\"true\"',\n      checked: 'checked=\"true\"',\n      disabled: 'disabled=\"true\"',\n      expanded: 'expanded=\"true\"',\n      hidden: 'hidden=\"true\"',\n      pressed: 'pressed=\"true\"',\n      readonly: 'readonly=\"true\"',\n      required: 'required=\"true\"',\n      selected: 'selected=\"true\"',\n    },\n    aspectRatio: {\n      auto: 'auto',\n      square: '1 / 1',\n      video: '16 / 9',\n    },\n    backdropBlur: ({ theme }) => theme('blur'),\n    backdropBrightness: ({ theme }) => theme('brightness'),\n    backdropContrast: ({ theme }) => theme('contrast'),\n    backdropGrayscale: ({ theme }) => theme('grayscale'),\n    backdropHueRotate: ({ theme }) => theme('hueRotate'),\n    backdropInvert: ({ theme }) => theme('invert'),\n    backdropOpacity: ({ theme }) => theme('opacity'),\n    backdropSaturate: ({ theme }) => theme('saturate'),\n    backdropSepia: ({ theme }) => theme('sepia'),\n    backgroundColor: ({ theme }) => theme('colors'),\n    backgroundImage: {\n      none: 'none',\n      'gradient-to-t': 'linear-gradient(to top, var(--tw-gradient-stops))',\n      'gradient-to-tr': 'linear-gradient(to top right, var(--tw-gradient-stops))',\n      'gradient-to-r': 'linear-gradient(to right, var(--tw-gradient-stops))',\n      'gradient-to-br': 'linear-gradient(to bottom right, var(--tw-gradient-stops))',\n      'gradient-to-b': 'linear-gradient(to bottom, var(--tw-gradient-stops))',\n      'gradient-to-bl': 'linear-gradient(to bottom left, var(--tw-gradient-stops))',\n      'gradient-to-l': 'linear-gradient(to left, var(--tw-gradient-stops))',\n      'gradient-to-tl': 'linear-gradient(to top left, var(--tw-gradient-stops))',\n    },\n    backgroundOpacity: ({ theme }) => theme('opacity'),\n    backgroundPosition: {\n      bottom: 'bottom',\n      center: 'center',\n      left: 'left',\n      'left-bottom': 'left bottom',\n      'left-top': 'left top',\n      right: 'right',\n      'right-bottom': 'right bottom',\n      'right-top': 'right top',\n      top: 'top',\n    },\n    backgroundSize: {\n      auto: 'auto',\n      cover: 'cover',\n      contain: 'contain',\n    },\n    blur: {\n      0: '0',\n      none: '',\n      sm: '4px',\n      DEFAULT: '8px',\n      md: '12px',\n      lg: '16px',\n      xl: '24px',\n      '2xl': '40px',\n      '3xl': '64px',\n    },\n    borderColor: ({ theme }) => ({\n      ...theme('colors'),\n      DEFAULT: theme('colors.gray.200', 'currentColor'),\n    }),\n    borderOpacity: ({ theme }) => theme('opacity'),\n    borderRadius: {\n      none: '0px',\n      sm: '0.125rem',\n      DEFAULT: '0.25rem',\n      md: '0.375rem',\n      lg: '0.5rem',\n      xl: '0.75rem',\n      '2xl': '1rem',\n      '3xl': '1.5rem',\n      full: '9999px',\n    },\n    borderSpacing: ({ theme }) => ({\n      ...theme('spacing'),\n    }),\n    borderWidth: {\n      DEFAULT: '1px',\n      0: '0px',\n      2: '2px',\n      4: '4px',\n      8: '8px',\n    },\n    boxShadow: {\n      sm: '0 1px 2px 0 rgb(0 0 0 / 0.05)',\n      DEFAULT: '0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1)',\n      md: '0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1)',\n      lg: '0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1)',\n      xl: '0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1)',\n      '2xl': '0 25px 50px -12px rgb(0 0 0 / 0.25)',\n      inner: 'inset 0 2px 4px 0 rgb(0 0 0 / 0.05)',\n      none: 'none',\n    },\n    boxShadowColor: ({ theme }) => theme('colors'),\n    brightness: {\n      0: '0',\n      50: '.5',\n      75: '.75',\n      90: '.9',\n      95: '.95',\n      100: '1',\n      105: '1.05',\n      110: '1.1',\n      125: '1.25',\n      150: '1.5',\n      200: '2',\n    },\n    caretColor: ({ theme }) => theme('colors'),\n    colors: ({ colors }) => ({\n      inherit: colors.inherit,\n      current: colors.current,\n      transparent: colors.transparent,\n      black: colors.black,\n      white: colors.white,\n      slate: colors.slate,\n      gray: colors.gray,\n      zinc: colors.zinc,\n      neutral: colors.neutral,\n      stone: colors.stone,\n      red: colors.red,\n      orange: colors.orange,\n      amber: colors.amber,\n      yellow: colors.yellow,\n      lime: colors.lime,\n      green: colors.green,\n      emerald: colors.emerald,\n      teal: colors.teal,\n      cyan: colors.cyan,\n      sky: colors.sky,\n      blue: colors.blue,\n      indigo: colors.indigo,\n      violet: colors.violet,\n      purple: colors.purple,\n      fuchsia: colors.fuchsia,\n      pink: colors.pink,\n      rose: colors.rose,\n    }),\n    columns: {\n      auto: 'auto',\n      1: '1',\n      2: '2',\n      3: '3',\n      4: '4',\n      5: '5',\n      6: '6',\n      7: '7',\n      8: '8',\n      9: '9',\n      10: '10',\n      11: '11',\n      12: '12',\n      '3xs': '16rem',\n      '2xs': '18rem',\n      xs: '20rem',\n      sm: '24rem',\n      md: '28rem',\n      lg: '32rem',\n      xl: '36rem',\n      '2xl': '42rem',\n      '3xl': '48rem',\n      '4xl': '56rem',\n      '5xl': '64rem',\n      '6xl': '72rem',\n      '7xl': '80rem',\n    },\n    container: {},\n    content: {\n      none: 'none',\n    },\n    contrast: {\n      0: '0',\n      50: '.5',\n      75: '.75',\n      100: '1',\n      125: '1.25',\n      150: '1.5',\n      200: '2',\n    },\n    cursor: {\n      auto: 'auto',\n      default: 'default',\n      pointer: 'pointer',\n      wait: 'wait',\n      text: 'text',\n      move: 'move',\n      help: 'help',\n      'not-allowed': 'not-allowed',\n      none: 'none',\n      'context-menu': 'context-menu',\n      progress: 'progress',\n      cell: 'cell',\n      crosshair: 'crosshair',\n      'vertical-text': 'vertical-text',\n      alias: 'alias',\n      copy: 'copy',\n      'no-drop': 'no-drop',\n      grab: 'grab',\n      grabbing: 'grabbing',\n      'all-scroll': 'all-scroll',\n      'col-resize': 'col-resize',\n      'row-resize': 'row-resize',\n      'n-resize': 'n-resize',\n      'e-resize': 'e-resize',\n      's-resize': 's-resize',\n      'w-resize': 'w-resize',\n      'ne-resize': 'ne-resize',\n      'nw-resize': 'nw-resize',\n      'se-resize': 'se-resize',\n      'sw-resize': 'sw-resize',\n      'ew-resize': 'ew-resize',\n      'ns-resize': 'ns-resize',\n      'nesw-resize': 'nesw-resize',\n      'nwse-resize': 'nwse-resize',\n      'zoom-in': 'zoom-in',\n      'zoom-out': 'zoom-out',\n    },\n    divideColor: ({ theme }) => theme('borderColor'),\n    divideOpacity: ({ theme }) => theme('borderOpacity'),\n    divideWidth: ({ theme }) => theme('borderWidth'),\n    dropShadow: {\n      sm: '0 1px 1px rgb(0 0 0 / 0.05)',\n      DEFAULT: ['0 1px 2px rgb(0 0 0 / 0.1)', '0 1px 1px rgb(0 0 0 / 0.06)'],\n      md: ['0 4px 3px rgb(0 0 0 / 0.07)', '0 2px 2px rgb(0 0 0 / 0.06)'],\n      lg: ['0 10px 8px rgb(0 0 0 / 0.04)', '0 4px 3px rgb(0 0 0 / 0.1)'],\n      xl: ['0 20px 13px rgb(0 0 0 / 0.03)', '0 8px 5px rgb(0 0 0 / 0.08)'],\n      '2xl': '0 25px 25px rgb(0 0 0 / 0.15)',\n      none: '0 0 #0000',\n    },\n    fill: ({ theme }) => ({\n      none: 'none',\n      ...theme('colors'),\n    }),\n    flex: {\n      1: '1 1 0%',\n      auto: '1 1 auto',\n      initial: '0 1 auto',\n      none: 'none',\n    },\n    flexBasis: ({ theme }) => ({\n      auto: 'auto',\n      ...theme('spacing'),\n      '1/2': '50%',\n      '1/3': '33.333333%',\n      '2/3': '66.666667%',\n      '1/4': '25%',\n      '2/4': '50%',\n      '3/4': '75%',\n      '1/5': '20%',\n      '2/5': '40%',\n      '3/5': '60%',\n      '4/5': '80%',\n      '1/6': '16.666667%',\n      '2/6': '33.333333%',\n      '3/6': '50%',\n      '4/6': '66.666667%',\n      '5/6': '83.333333%',\n      '1/12': '8.333333%',\n      '2/12': '16.666667%',\n      '3/12': '25%',\n      '4/12': '33.333333%',\n      '5/12': '41.666667%',\n      '6/12': '50%',\n      '7/12': '58.333333%',\n      '8/12': '66.666667%',\n      '9/12': '75%',\n      '10/12': '83.333333%',\n      '11/12': '91.666667%',\n      full: '100%',\n    }),\n    flexGrow: {\n      0: '0',\n      DEFAULT: '1',\n    },\n    flexShrink: {\n      0: '0',\n      DEFAULT: '1',\n    },\n    fontFamily: {\n      sans: [\n        'ui-sans-serif',\n        'system-ui',\n        'sans-serif',\n        '\"Apple Color Emoji\"',\n        '\"Segoe UI Emoji\"',\n        '\"Segoe UI Symbol\"',\n        '\"Noto Color Emoji\"',\n      ],\n      serif: ['ui-serif', 'Georgia', 'Cambria', '\"Times New Roman\"', 'Times', 'serif'],\n      mono: [\n        'ui-monospace',\n        'SFMono-Regular',\n        'Menlo',\n        'Monaco',\n        'Consolas',\n        '\"Liberation Mono\"',\n        '\"Courier New\"',\n        'monospace',\n      ],\n    },\n    fontSize: {\n      xs: ['0.75rem', { lineHeight: '1rem' }],\n      sm: ['0.875rem', { lineHeight: '1.25rem' }],\n      base: ['1rem', { lineHeight: '1.5rem' }],\n      lg: ['1.125rem', { lineHeight: '1.75rem' }],\n      xl: ['1.25rem', { lineHeight: '1.75rem' }],\n      '2xl': ['1.5rem', { lineHeight: '2rem' }],\n      '3xl': ['1.875rem', { lineHeight: '2.25rem' }],\n      '4xl': ['2.25rem', { lineHeight: '2.5rem' }],\n      '5xl': ['3rem', { lineHeight: '1' }],\n      '6xl': ['3.75rem', { lineHeight: '1' }],\n      '7xl': ['4.5rem', { lineHeight: '1' }],\n      '8xl': ['6rem', { lineHeight: '1' }],\n      '9xl': ['8rem', { lineHeight: '1' }],\n    },\n    fontWeight: {\n      thin: '100',\n      extralight: '200',\n      light: '300',\n      normal: '400',\n      medium: '500',\n      semibold: '600',\n      bold: '700',\n      extrabold: '800',\n      black: '900',\n    },\n    gap: ({ theme }) => theme('spacing'),\n    gradientColorStops: ({ theme }) => theme('colors'),\n    gradientColorStopPositions: {\n      '0%': '0%',\n      '5%': '5%',\n      '10%': '10%',\n      '15%': '15%',\n      '20%': '20%',\n      '25%': '25%',\n      '30%': '30%',\n      '35%': '35%',\n      '40%': '40%',\n      '45%': '45%',\n      '50%': '50%',\n      '55%': '55%',\n      '60%': '60%',\n      '65%': '65%',\n      '70%': '70%',\n      '75%': '75%',\n      '80%': '80%',\n      '85%': '85%',\n      '90%': '90%',\n      '95%': '95%',\n      '100%': '100%',\n    },\n    grayscale: {\n      0: '0',\n      DEFAULT: '100%',\n    },\n    gridAutoColumns: {\n      auto: 'auto',\n      min: 'min-content',\n      max: 'max-content',\n      fr: 'minmax(0, 1fr)',\n    },\n    gridAutoRows: {\n      auto: 'auto',\n      min: 'min-content',\n      max: 'max-content',\n      fr: 'minmax(0, 1fr)',\n    },\n    gridColumn: {\n      auto: 'auto',\n      'span-1': 'span 1 / span 1',\n      'span-2': 'span 2 / span 2',\n      'span-3': 'span 3 / span 3',\n      'span-4': 'span 4 / span 4',\n      'span-5': 'span 5 / span 5',\n      'span-6': 'span 6 / span 6',\n      'span-7': 'span 7 / span 7',\n      'span-8': 'span 8 / span 8',\n      'span-9': 'span 9 / span 9',\n      'span-10': 'span 10 / span 10',\n      'span-11': 'span 11 / span 11',\n      'span-12': 'span 12 / span 12',\n      'span-full': '1 / -1',\n    },\n    gridColumnEnd: {\n      auto: 'auto',\n      1: '1',\n      2: '2',\n      3: '3',\n      4: '4',\n      5: '5',\n      6: '6',\n      7: '7',\n      8: '8',\n      9: '9',\n      10: '10',\n      11: '11',\n      12: '12',\n      13: '13',\n    },\n    gridColumnStart: {\n      auto: 'auto',\n      1: '1',\n      2: '2',\n      3: '3',\n      4: '4',\n      5: '5',\n      6: '6',\n      7: '7',\n      8: '8',\n      9: '9',\n      10: '10',\n      11: '11',\n      12: '12',\n      13: '13',\n    },\n    gridRow: {\n      auto: 'auto',\n      'span-1': 'span 1 / span 1',\n      'span-2': 'span 2 / span 2',\n      'span-3': 'span 3 / span 3',\n      'span-4': 'span 4 / span 4',\n      'span-5': 'span 5 / span 5',\n      'span-6': 'span 6 / span 6',\n      'span-7': 'span 7 / span 7',\n      'span-8': 'span 8 / span 8',\n      'span-9': 'span 9 / span 9',\n      'span-10': 'span 10 / span 10',\n      'span-11': 'span 11 / span 11',\n      'span-12': 'span 12 / span 12',\n      'span-full': '1 / -1',\n    },\n    gridRowEnd: {\n      auto: 'auto',\n      1: '1',\n      2: '2',\n      3: '3',\n      4: '4',\n      5: '5',\n      6: '6',\n      7: '7',\n      8: '8',\n      9: '9',\n      10: '10',\n      11: '11',\n      12: '12',\n      13: '13',\n    },\n    gridRowStart: {\n      auto: 'auto',\n      1: '1',\n      2: '2',\n      3: '3',\n      4: '4',\n      5: '5',\n      6: '6',\n      7: '7',\n      8: '8',\n      9: '9',\n      10: '10',\n      11: '11',\n      12: '12',\n      13: '13',\n    },\n    gridTemplateColumns: {\n      none: 'none',\n      subgrid: 'subgrid',\n      1: 'repeat(1, minmax(0, 1fr))',\n      2: 'repeat(2, minmax(0, 1fr))',\n      3: 'repeat(3, minmax(0, 1fr))',\n      4: 'repeat(4, minmax(0, 1fr))',\n      5: 'repeat(5, minmax(0, 1fr))',\n      6: 'repeat(6, minmax(0, 1fr))',\n      7: 'repeat(7, minmax(0, 1fr))',\n      8: 'repeat(8, minmax(0, 1fr))',\n      9: 'repeat(9, minmax(0, 1fr))',\n      10: 'repeat(10, minmax(0, 1fr))',\n      11: 'repeat(11, minmax(0, 1fr))',\n      12: 'repeat(12, minmax(0, 1fr))',\n    },\n    gridTemplateRows: {\n      none: 'none',\n      subgrid: 'subgrid',\n      1: 'repeat(1, minmax(0, 1fr))',\n      2: 'repeat(2, minmax(0, 1fr))',\n      3: 'repeat(3, minmax(0, 1fr))',\n      4: 'repeat(4, minmax(0, 1fr))',\n      5: 'repeat(5, minmax(0, 1fr))',\n      6: 'repeat(6, minmax(0, 1fr))',\n      7: 'repeat(7, minmax(0, 1fr))',\n      8: 'repeat(8, minmax(0, 1fr))',\n      9: 'repeat(9, minmax(0, 1fr))',\n      10: 'repeat(10, minmax(0, 1fr))',\n      11: 'repeat(11, minmax(0, 1fr))',\n      12: 'repeat(12, minmax(0, 1fr))',\n    },\n    height: ({ theme }) => ({\n      auto: 'auto',\n      ...theme('spacing'),\n      '1/2': '50%',\n      '1/3': '33.333333%',\n      '2/3': '66.666667%',\n      '1/4': '25%',\n      '2/4': '50%',\n      '3/4': '75%',\n      '1/5': '20%',\n      '2/5': '40%',\n      '3/5': '60%',\n      '4/5': '80%',\n      '1/6': '16.666667%',\n      '2/6': '33.333333%',\n      '3/6': '50%',\n      '4/6': '66.666667%',\n      '5/6': '83.333333%',\n      full: '100%',\n      screen: '100vh',\n      svh: '100svh',\n      lvh: '100lvh',\n      dvh: '100dvh',\n      min: 'min-content',\n      max: 'max-content',\n      fit: 'fit-content',\n    }),\n    hueRotate: {\n      0: '0deg',\n      15: '15deg',\n      30: '30deg',\n      60: '60deg',\n      90: '90deg',\n      180: '180deg',\n    },\n    inset: ({ theme }) => ({\n      auto: 'auto',\n      ...theme('spacing'),\n      '1/2': '50%',\n      '1/3': '33.333333%',\n      '2/3': '66.666667%',\n      '1/4': '25%',\n      '2/4': '50%',\n      '3/4': '75%',\n      full: '100%',\n    }),\n    invert: {\n      0: '0',\n      DEFAULT: '100%',\n    },\n    keyframes: {\n      spin: {\n        to: {\n          transform: 'rotate(360deg)',\n        },\n      },\n      ping: {\n        '75%, 100%': {\n          transform: 'scale(2)',\n          opacity: '0',\n        },\n      },\n      pulse: {\n        '50%': {\n          opacity: '.5',\n        },\n      },\n      bounce: {\n        '0%, 100%': {\n          transform: 'translateY(-25%)',\n          animationTimingFunction: 'cubic-bezier(0.8,0,1,1)',\n        },\n        '50%': {\n          transform: 'none',\n          animationTimingFunction: 'cubic-bezier(0,0,0.2,1)',\n        },\n      },\n    },\n    letterSpacing: {\n      tighter: '-0.05em',\n      tight: '-0.025em',\n      normal: '0em',\n      wide: '0.025em',\n      wider: '0.05em',\n      widest: '0.1em',\n    },\n    lineHeight: {\n      none: '1',\n      tight: '1.25',\n      snug: '1.375',\n      normal: '1.5',\n      relaxed: '1.625',\n      loose: '2',\n      3: '.75rem',\n      4: '1rem',\n      5: '1.25rem',\n      6: '1.5rem',\n      7: '1.75rem',\n      8: '2rem',\n      9: '2.25rem',\n      10: '2.5rem',\n    },\n    listStyleType: {\n      none: 'none',\n      disc: 'disc',\n      decimal: 'decimal',\n    },\n    listStyleImage: {\n      none: 'none',\n    },\n    margin: ({ theme }) => ({\n      auto: 'auto',\n      ...theme('spacing'),\n    }),\n    lineClamp: {\n      1: '1',\n      2: '2',\n      3: '3',\n      4: '4',\n      5: '5',\n      6: '6',\n    },\n    maxHeight: ({ theme }) => ({\n      ...theme('spacing'),\n      none: 'none',\n      full: '100%',\n      screen: '100vh',\n      svh: '100svh',\n      lvh: '100lvh',\n      dvh: '100dvh',\n      min: 'min-content',\n      max: 'max-content',\n      fit: 'fit-content',\n    }),\n    maxWidth: ({ theme, breakpoints }) => ({\n      ...theme('spacing'),\n      none: 'none',\n      xs: '20rem',\n      sm: '24rem',\n      md: '28rem',\n      lg: '32rem',\n      xl: '36rem',\n      '2xl': '42rem',\n      '3xl': '48rem',\n      '4xl': '56rem',\n      '5xl': '64rem',\n      '6xl': '72rem',\n      '7xl': '80rem',\n      full: '100%',\n      min: 'min-content',\n      max: 'max-content',\n      fit: 'fit-content',\n      prose: '65ch',\n      ...breakpoints(theme('screens')),\n    }),\n    minHeight: ({ theme }) => ({\n      ...theme('spacing'),\n      full: '100%',\n      screen: '100vh',\n      svh: '100svh',\n      lvh: '100lvh',\n      dvh: '100dvh',\n      min: 'min-content',\n      max: 'max-content',\n      fit: 'fit-content',\n    }),\n    minWidth: ({ theme }) => ({\n      ...theme('spacing'),\n      full: '100%',\n      min: 'min-content',\n      max: 'max-content',\n      fit: 'fit-content',\n    }),\n    objectPosition: {\n      bottom: 'bottom',\n      center: 'center',\n      left: 'left',\n      'left-bottom': 'left bottom',\n      'left-top': 'left top',\n      right: 'right',\n      'right-bottom': 'right bottom',\n      'right-top': 'right top',\n      top: 'top',\n    },\n    opacity: {\n      0: '0',\n      5: '0.05',\n      10: '0.1',\n      15: '0.15',\n      20: '0.2',\n      25: '0.25',\n      30: '0.3',\n      35: '0.35',\n      40: '0.4',\n      45: '0.45',\n      50: '0.5',\n      55: '0.55',\n      60: '0.6',\n      65: '0.65',\n      70: '0.7',\n      75: '0.75',\n      80: '0.8',\n      85: '0.85',\n      90: '0.9',\n      95: '0.95',\n      100: '1',\n    },\n    order: {\n      first: '-9999',\n      last: '9999',\n      none: '0',\n      1: '1',\n      2: '2',\n      3: '3',\n      4: '4',\n      5: '5',\n      6: '6',\n      7: '7',\n      8: '8',\n      9: '9',\n      10: '10',\n      11: '11',\n      12: '12',\n    },\n    outlineColor: ({ theme }) => theme('colors'),\n    outlineOffset: {\n      0: '0px',\n      1: '1px',\n      2: '2px',\n      4: '4px',\n      8: '8px',\n    },\n    outlineWidth: {\n      0: '0px',\n      1: '1px',\n      2: '2px',\n      4: '4px',\n      8: '8px',\n    },\n    padding: ({ theme }) => theme('spacing'),\n    placeholderColor: ({ theme }) => theme('colors'),\n    placeholderOpacity: ({ theme }) => theme('opacity'),\n    ringColor: ({ theme }) => ({\n      DEFAULT: theme('colors.blue.500', '#3b82f6'),\n      ...theme('colors'),\n    }),\n    ringOffsetColor: ({ theme }) => theme('colors'),\n    ringOffsetWidth: {\n      0: '0px',\n      1: '1px',\n      2: '2px',\n      4: '4px',\n      8: '8px',\n    },\n    ringOpacity: ({ theme }) => ({\n      DEFAULT: '0.5',\n      ...theme('opacity'),\n    }),\n    ringWidth: {\n      DEFAULT: '3px',\n      0: '0px',\n      1: '1px',\n      2: '2px',\n      4: '4px',\n      8: '8px',\n    },\n    rotate: {\n      0: '0deg',\n      1: '1deg',\n      2: '2deg',\n      3: '3deg',\n      6: '6deg',\n      12: '12deg',\n      45: '45deg',\n      90: '90deg',\n      180: '180deg',\n    },\n    saturate: {\n      0: '0',\n      50: '.5',\n      100: '1',\n      150: '1.5',\n      200: '2',\n    },\n    scale: {\n      0: '0',\n      50: '.5',\n      75: '.75',\n      90: '.9',\n      95: '.95',\n      100: '1',\n      105: '1.05',\n      110: '1.1',\n      125: '1.25',\n      150: '1.5',\n    },\n    screens: {\n      sm: '640px',\n      md: '768px',\n      lg: '1024px',\n      xl: '1280px',\n      '2xl': '1536px',\n    },\n    scrollMargin: ({ theme }) => ({\n      ...theme('spacing'),\n    }),\n    scrollPadding: ({ theme }) => theme('spacing'),\n    sepia: {\n      0: '0',\n      DEFAULT: '100%',\n    },\n    skew: {\n      0: '0deg',\n      1: '1deg',\n      2: '2deg',\n      3: '3deg',\n      6: '6deg',\n      12: '12deg',\n    },\n    space: ({ theme }) => ({\n      ...theme('spacing'),\n    }),\n    spacing: {\n      px: '1px',\n      0: '0px',\n      0.5: '0.125rem',\n      1: '0.25rem',\n      1.5: '0.375rem',\n      2: '0.5rem',\n      2.5: '0.625rem',\n      3: '0.75rem',\n      3.5: '0.875rem',\n      4: '1rem',\n      5: '1.25rem',\n      6: '1.5rem',\n      7: '1.75rem',\n      8: '2rem',\n      9: '2.25rem',\n      10: '2.5rem',\n      11: '2.75rem',\n      12: '3rem',\n      14: '3.5rem',\n      16: '4rem',\n      20: '5rem',\n      24: '6rem',\n      28: '7rem',\n      32: '8rem',\n      36: '9rem',\n      40: '10rem',\n      44: '11rem',\n      48: '12rem',\n      52: '13rem',\n      56: '14rem',\n      60: '15rem',\n      64: '16rem',\n      72: '18rem',\n      80: '20rem',\n      96: '24rem',\n    },\n    stroke: ({ theme }) => ({\n      none: 'none',\n      ...theme('colors'),\n    }),\n    strokeWidth: {\n      0: '0',\n      1: '1',\n      2: '2',\n    },\n    supports: {},\n    data: {},\n    textColor: ({ theme }) => theme('colors'),\n    textDecorationColor: ({ theme }) => theme('colors'),\n    textDecorationThickness: {\n      auto: 'auto',\n      'from-font': 'from-font',\n      0: '0px',\n      1: '1px',\n      2: '2px',\n      4: '4px',\n      8: '8px',\n    },\n    textIndent: ({ theme }) => ({\n      ...theme('spacing'),\n    }),\n    textOpacity: ({ theme }) => theme('opacity'),\n    textUnderlineOffset: {\n      auto: 'auto',\n      0: '0px',\n      1: '1px',\n      2: '2px',\n      4: '4px',\n      8: '8px',\n    },\n    transformOrigin: {\n      center: 'center',\n      top: 'top',\n      'top-right': 'top right',\n      right: 'right',\n      'bottom-right': 'bottom right',\n      bottom: 'bottom',\n      'bottom-left': 'bottom left',\n      left: 'left',\n      'top-left': 'top left',\n    },\n    transitionDelay: {\n      0: '0s',\n      75: '75ms',\n      100: '100ms',\n      150: '150ms',\n      200: '200ms',\n      300: '300ms',\n      500: '500ms',\n      700: '700ms',\n      1000: '1000ms',\n    },\n    transitionDuration: {\n      DEFAULT: '150ms',\n      0: '0s',\n      75: '75ms',\n      100: '100ms',\n      150: '150ms',\n      200: '200ms',\n      300: '300ms',\n      500: '500ms',\n      700: '700ms',\n      1000: '1000ms',\n    },\n    transitionProperty: {\n      none: 'none',\n      all: 'all',\n      DEFAULT:\n        'color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter',\n      colors: 'color, background-color, border-color, text-decoration-color, fill, stroke',\n      opacity: 'opacity',\n      shadow: 'box-shadow',\n      transform: 'transform',\n    },\n    transitionTimingFunction: {\n      DEFAULT: 'cubic-bezier(0.4, 0, 0.2, 1)',\n      linear: 'linear',\n      in: 'cubic-bezier(0.4, 0, 1, 1)',\n      out: 'cubic-bezier(0, 0, 0.2, 1)',\n      'in-out': 'cubic-bezier(0.4, 0, 0.2, 1)',\n    },\n    translate: ({ theme }) => ({\n      ...theme('spacing'),\n      '1/2': '50%',\n      '1/3': '33.333333%',\n      '2/3': '66.666667%',\n      '1/4': '25%',\n      '2/4': '50%',\n      '3/4': '75%',\n      full: '100%',\n    }),\n    size: ({ theme }) => ({\n      auto: 'auto',\n      ...theme('spacing'),\n      '1/2': '50%',\n      '1/3': '33.333333%',\n      '2/3': '66.666667%',\n      '1/4': '25%',\n      '2/4': '50%',\n      '3/4': '75%',\n      '1/5': '20%',\n      '2/5': '40%',\n      '3/5': '60%',\n      '4/5': '80%',\n      '1/6': '16.666667%',\n      '2/6': '33.333333%',\n      '3/6': '50%',\n      '4/6': '66.666667%',\n      '5/6': '83.333333%',\n      '1/12': '8.333333%',\n      '2/12': '16.666667%',\n      '3/12': '25%',\n      '4/12': '33.333333%',\n      '5/12': '41.666667%',\n      '6/12': '50%',\n      '7/12': '58.333333%',\n      '8/12': '66.666667%',\n      '9/12': '75%',\n      '10/12': '83.333333%',\n      '11/12': '91.666667%',\n      full: '100%',\n      min: 'min-content',\n      max: 'max-content',\n      fit: 'fit-content',\n    }),\n    width: ({ theme }) => ({\n      auto: 'auto',\n      ...theme('spacing'),\n      '1/2': '50%',\n      '1/3': '33.333333%',\n      '2/3': '66.666667%',\n      '1/4': '25%',\n      '2/4': '50%',\n      '3/4': '75%',\n      '1/5': '20%',\n      '2/5': '40%',\n      '3/5': '60%',\n      '4/5': '80%',\n      '1/6': '16.666667%',\n      '2/6': '33.333333%',\n      '3/6': '50%',\n      '4/6': '66.666667%',\n      '5/6': '83.333333%',\n      '1/12': '8.333333%',\n      '2/12': '16.666667%',\n      '3/12': '25%',\n      '4/12': '33.333333%',\n      '5/12': '41.666667%',\n      '6/12': '50%',\n      '7/12': '58.333333%',\n      '8/12': '66.666667%',\n      '9/12': '75%',\n      '10/12': '83.333333%',\n      '11/12': '91.666667%',\n      full: '100%',\n      screen: '100vw',\n      svw: '100svw',\n      lvw: '100lvw',\n      dvw: '100dvw',\n      min: 'min-content',\n      max: 'max-content',\n      fit: 'fit-content',\n    }),\n    willChange: {\n      auto: 'auto',\n      scroll: 'scroll-position',\n      contents: 'contents',\n      transform: 'transform',\n    },\n    zIndex: {\n      auto: 'auto',\n      0: '0',\n      10: '10',\n      20: '20',\n      30: '30',\n      40: '40',\n      50: '50',\n    },\n  },\n  plugins: [],\n}\n","'use strict';\nrequire('../../modules/es.array.iterator');\nrequire('../../modules/es.object.to-string');\nrequire('../../modules/es.weak-map');\nvar path = require('../../internals/path');\n\nmodule.exports = path.WeakMap;\n","'use strict';\nvar $ = require('../internals/export');\nvar getBuiltIn = require('../internals/get-built-in');\nvar hasOwn = require('../internals/has-own-property');\nvar toString = require('../internals/to-string');\nvar shared = require('../internals/shared');\nvar NATIVE_SYMBOL_REGISTRY = require('../internals/symbol-registry-detection');\n\nvar StringToSymbolRegistry = shared('string-to-symbol-registry');\nvar SymbolToStringRegistry = shared('symbol-to-string-registry');\n\n// `Symbol.for` method\n// https://tc39.es/ecma262/#sec-symbol.for\n$({ target: 'Symbol', stat: true, forced: !NATIVE_SYMBOL_REGISTRY }, {\n  'for': function (key) {\n    var string = toString(key);\n    if (hasOwn(StringToSymbolRegistry, string)) return StringToSymbolRegistry[string];\n    var symbol = getBuiltIn('Symbol')(string);\n    StringToSymbolRegistry[string] = symbol;\n    SymbolToStringRegistry[symbol] = string;\n    return symbol;\n  }\n});\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\n\nmodule.exports = uncurryThis({}.isPrototypeOf);\n","'use strict';\nvar $ = require('../internals/export');\nvar forEach = require('../internals/array-for-each');\n\n// `Array.prototype.forEach` method\n// https://tc39.es/ecma262/#sec-array.prototype.foreach\n// eslint-disable-next-line es/no-array-prototype-foreach -- safe\n$({ target: 'Array', proto: true, forced: [].forEach !== forEach }, {\n  forEach: forEach\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar union = require('../internals/set-union');\nvar setMethodGetKeysBeforeCloning = require('../internals/set-method-get-keys-before-cloning-detection');\nvar setMethodAcceptSetLike = require('../internals/set-method-accept-set-like');\n\nvar FORCED = !setMethodAcceptSetLike('union') || !setMethodGetKeysBeforeCloning('union');\n\n// `Set.prototype.union` method\n// https://tc39.es/ecma262/#sec-set.prototype.union\n$({ target: 'Set', proto: true, real: true, forced: FORCED }, {\n  union: union\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar notARegExp = require('../internals/not-a-regexp');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar toString = require('../internals/to-string');\nvar correctIsRegExpLogic = require('../internals/correct-is-regexp-logic');\n\nvar stringIndexOf = uncurryThis(''.indexOf);\n\n// `String.prototype.includes` method\n// https://tc39.es/ecma262/#sec-string.prototype.includes\n$({ target: 'String', proto: true, forced: !correctIsRegExpLogic('includes') }, {\n  includes: function includes(searchString /* , position = 0 */) {\n    return !!~stringIndexOf(\n      toString(requireObjectCoercible(this)),\n      toString(notARegExp(searchString)),\n      arguments.length > 1 ? arguments[1] : undefined\n    );\n  }\n});\n","(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n\ttypeof define === 'function' && define.amd ? define(['exports'], factory) :\n\t(global = global || self, factory(global.window = global.window || {}));\n}(this, (function (exports) { 'use strict';\n\n\t/*!\n\t * ScrollToPlugin 3.14.2\n\t * https://gsap.com\n\t *\n\t * @license Copyright 2008-2025, GreenSock. All rights reserved.\n\t * Subject to the terms at https://gsap.com/standard-license\n\t * @author: Jack Doyle, jack@greensock.com\n\t*/\n\tvar gsap,\n\t    _coreInitted,\n\t    _window,\n\t    _docEl,\n\t    _body,\n\t    _toArray,\n\t    _config,\n\t    ScrollTrigger,\n\t    _windowExists = function _windowExists() {\n\t  return typeof window !== \"undefined\";\n\t},\n\t    _getGSAP = function _getGSAP() {\n\t  return gsap || _windowExists() && (gsap = window.gsap) && gsap.registerPlugin && gsap;\n\t},\n\t    _isString = function _isString(value) {\n\t  return typeof value === \"string\";\n\t},\n\t    _isFunction = function _isFunction(value) {\n\t  return typeof value === \"function\";\n\t},\n\t    _max = function _max(element, axis) {\n\t  var dim = axis === \"x\" ? \"Width\" : \"Height\",\n\t      scroll = \"scroll\" + dim,\n\t      client = \"client\" + dim;\n\t  return element === _window || element === _docEl || element === _body ? Math.max(_docEl[scroll], _body[scroll]) - (_window[\"inner\" + dim] || _docEl[client] || _body[client]) : element[scroll] - element[\"offset\" + dim];\n\t},\n\t    _buildGetter = function _buildGetter(e, axis) {\n\t  var p = \"scroll\" + (axis === \"x\" ? \"Left\" : \"Top\");\n\n\t  if (e === _window) {\n\t    if (e.pageXOffset != null) {\n\t      p = \"page\" + axis.toUpperCase() + \"Offset\";\n\t    } else {\n\t      e = _docEl[p] != null ? _docEl : _body;\n\t    }\n\t  }\n\n\t  return function () {\n\t    return e[p];\n\t  };\n\t},\n\t    _clean = function _clean(value, index, target, targets) {\n\t  _isFunction(value) && (value = value(index, target, targets));\n\n\t  if (typeof value !== \"object\") {\n\t    return _isString(value) && value !== \"max\" && value.charAt(1) !== \"=\" ? {\n\t      x: value,\n\t      y: value\n\t    } : {\n\t      y: value\n\t    };\n\t  } else if (value.nodeType) {\n\t    return {\n\t      y: value,\n\t      x: value\n\t    };\n\t  } else {\n\t    var result = {},\n\t        p;\n\n\t    for (p in value) {\n\t      result[p] = p !== \"onAutoKill\" && _isFunction(value[p]) ? value[p](index, target, targets) : value[p];\n\t    }\n\n\t    return result;\n\t  }\n\t},\n\t    _getOffset = function _getOffset(element, container) {\n\t  element = _toArray(element)[0];\n\n\t  if (!element || !element.getBoundingClientRect) {\n\t    return console.warn(\"scrollTo target doesn't exist. Using 0\") || {\n\t      x: 0,\n\t      y: 0\n\t    };\n\t  }\n\n\t  var rect = element.getBoundingClientRect(),\n\t      isRoot = !container || container === _window || container === _body,\n\t      cRect = isRoot ? {\n\t    top: _docEl.clientTop - (_window.pageYOffset || _docEl.scrollTop || _body.scrollTop || 0),\n\t    left: _docEl.clientLeft - (_window.pageXOffset || _docEl.scrollLeft || _body.scrollLeft || 0)\n\t  } : container.getBoundingClientRect(),\n\t      offsets = {\n\t    x: rect.left - cRect.left,\n\t    y: rect.top - cRect.top\n\t  };\n\n\t  if (!isRoot && container) {\n\t    offsets.x += _buildGetter(container, \"x\")();\n\t    offsets.y += _buildGetter(container, \"y\")();\n\t  }\n\n\t  return offsets;\n\t},\n\t    _parseVal = function _parseVal(value, target, axis, currentVal, offset) {\n\t  return !isNaN(value) && typeof value !== \"object\" ? parseFloat(value) - offset : _isString(value) && value.charAt(1) === \"=\" ? parseFloat(value.substr(2)) * (value.charAt(0) === \"-\" ? -1 : 1) + currentVal - offset : value === \"max\" ? _max(target, axis) - offset : Math.min(_max(target, axis), _getOffset(value, target)[axis] - offset);\n\t},\n\t    _initCore = function _initCore() {\n\t  gsap = _getGSAP();\n\n\t  if (_windowExists() && gsap && typeof document !== \"undefined\" && document.body) {\n\t    _window = window;\n\t    _body = document.body;\n\t    _docEl = document.documentElement;\n\t    _toArray = gsap.utils.toArray;\n\t    gsap.config({\n\t      autoKillThreshold: 7\n\t    });\n\t    _config = gsap.config();\n\t    _coreInitted = 1;\n\t  }\n\t};\n\n\tvar ScrollToPlugin = {\n\t  version: \"3.14.2\",\n\t  name: \"scrollTo\",\n\t  rawVars: 1,\n\t  register: function register(core) {\n\t    gsap = core;\n\n\t    _initCore();\n\t  },\n\t  init: function init(target, value, tween, index, targets) {\n\t    _coreInitted || _initCore();\n\t    var data = this,\n\t        snapType = gsap.getProperty(target, \"scrollSnapType\");\n\t    data.isWin = target === _window;\n\t    data.target = target;\n\t    data.tween = tween;\n\t    value = _clean(value, index, target, targets);\n\t    data.vars = value;\n\t    data.autoKill = !!(\"autoKill\" in value ? value : _config).autoKill;\n\t    data.getX = _buildGetter(target, \"x\");\n\t    data.getY = _buildGetter(target, \"y\");\n\t    data.x = data.xPrev = data.getX();\n\t    data.y = data.yPrev = data.getY();\n\t    ScrollTrigger || (ScrollTrigger = gsap.core.globals().ScrollTrigger);\n\t    gsap.getProperty(target, \"scrollBehavior\") === \"smooth\" && gsap.set(target, {\n\t      scrollBehavior: \"auto\"\n\t    });\n\n\t    if (snapType && snapType !== \"none\") {\n\t      data.snap = 1;\n\t      data.snapInline = target.style.scrollSnapType;\n\t      target.style.scrollSnapType = \"none\";\n\t    }\n\n\t    if (value.x != null) {\n\t      data.add(data, \"x\", data.x, _parseVal(value.x, target, \"x\", data.x, value.offsetX || 0), index, targets);\n\n\t      data._props.push(\"scrollTo_x\");\n\t    } else {\n\t      data.skipX = 1;\n\t    }\n\n\t    if (value.y != null) {\n\t      data.add(data, \"y\", data.y, _parseVal(value.y, target, \"y\", data.y, value.offsetY || 0), index, targets);\n\n\t      data._props.push(\"scrollTo_y\");\n\t    } else {\n\t      data.skipY = 1;\n\t    }\n\t  },\n\t  render: function render(ratio, data) {\n\t    var pt = data._pt,\n\t        target = data.target,\n\t        tween = data.tween,\n\t        autoKill = data.autoKill,\n\t        xPrev = data.xPrev,\n\t        yPrev = data.yPrev,\n\t        isWin = data.isWin,\n\t        snap = data.snap,\n\t        snapInline = data.snapInline,\n\t        x,\n\t        y,\n\t        yDif,\n\t        xDif,\n\t        threshold;\n\n\t    while (pt) {\n\t      pt.r(ratio, pt.d);\n\t      pt = pt._next;\n\t    }\n\n\t    x = isWin || !data.skipX ? data.getX() : xPrev;\n\t    y = isWin || !data.skipY ? data.getY() : yPrev;\n\t    yDif = y - yPrev;\n\t    xDif = x - xPrev;\n\t    threshold = _config.autoKillThreshold;\n\n\t    if (data.x < 0) {\n\t      data.x = 0;\n\t    }\n\n\t    if (data.y < 0) {\n\t      data.y = 0;\n\t    }\n\n\t    if (autoKill) {\n\t      if (!data.skipX && (xDif > threshold || xDif < -threshold) && x < _max(target, \"x\")) {\n\t        data.skipX = 1;\n\t      }\n\n\t      if (!data.skipY && (yDif > threshold || yDif < -threshold) && y < _max(target, \"y\")) {\n\t        data.skipY = 1;\n\t      }\n\n\t      if (data.skipX && data.skipY) {\n\t        tween.kill();\n\t        data.vars.onAutoKill && data.vars.onAutoKill.apply(tween, data.vars.onAutoKillParams || []);\n\t      }\n\t    }\n\n\t    if (isWin) {\n\t      _window.scrollTo(!data.skipX ? data.x : x, !data.skipY ? data.y : y);\n\t    } else {\n\t      data.skipY || (target.scrollTop = data.y);\n\t      data.skipX || (target.scrollLeft = data.x);\n\t    }\n\n\t    if (snap && (ratio === 1 || ratio === 0)) {\n\t      y = target.scrollTop;\n\t      x = target.scrollLeft;\n\t      snapInline ? target.style.scrollSnapType = snapInline : target.style.removeProperty(\"scroll-snap-type\");\n\t      target.scrollTop = y + 1;\n\t      target.scrollLeft = x + 1;\n\t      target.scrollTop = y;\n\t      target.scrollLeft = x;\n\t    }\n\n\t    data.xPrev = data.x;\n\t    data.yPrev = data.y;\n\t    ScrollTrigger && ScrollTrigger.update();\n\t  },\n\t  kill: function kill(property) {\n\t    var both = property === \"scrollTo\",\n\t        i = this._props.indexOf(property);\n\n\t    if (both || property === \"scrollTo_x\") {\n\t      this.skipX = 1;\n\t    }\n\n\t    if (both || property === \"scrollTo_y\") {\n\t      this.skipY = 1;\n\t    }\n\n\t    i > -1 && this._props.splice(i, 1);\n\t    return !this._props.length;\n\t  }\n\t};\n\tScrollToPlugin.max = _max;\n\tScrollToPlugin.getOffset = _getOffset;\n\tScrollToPlugin.buildGetter = _buildGetter;\n\n\tScrollToPlugin.config = function (vars) {\n\t  _config || _initCore() || (_config = gsap.config());\n\n\t  for (var p in vars) {\n\t    _config[p] = vars[p];\n\t  }\n\t};\n\n\t_getGSAP() && gsap.registerPlugin(ScrollToPlugin);\n\n\texports.ScrollToPlugin = ScrollToPlugin;\n\texports.default = ScrollToPlugin;\n\n\tObject.defineProperty(exports, '__esModule', { value: true });\n\n})));\n","'use strict';\nvar call = require('../internals/function-call');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar fixRegExpWellKnownSymbolLogic = require('../internals/fix-regexp-well-known-symbol-logic');\nvar anObject = require('../internals/an-object');\nvar isObject = require('../internals/is-object');\nvar toLength = require('../internals/to-length');\nvar toString = require('../internals/to-string');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar getMethod = require('../internals/get-method');\nvar advanceStringIndex = require('../internals/advance-string-index');\nvar getRegExpFlags = require('../internals/regexp-get-flags');\nvar regExpExec = require('../internals/regexp-exec-abstract');\n\nvar stringIndexOf = uncurryThis(''.indexOf);\n\n// @@match logic\nfixRegExpWellKnownSymbolLogic('match', function (MATCH, nativeMatch, maybeCallNative) {\n  return [\n    // `String.prototype.match` method\n    // https://tc39.es/ecma262/#sec-string.prototype.match\n    function match(regexp) {\n      var O = requireObjectCoercible(this);\n      var matcher = isObject(regexp) ? getMethod(regexp, MATCH) : undefined;\n      return matcher ? call(matcher, regexp, O) : new RegExp(regexp)[MATCH](toString(O));\n    },\n    // `RegExp.prototype[@@match]` method\n    // https://tc39.es/ecma262/#sec-regexp.prototype-@@match\n    function (string) {\n      var rx = anObject(this);\n      var S = toString(string);\n      var res = maybeCallNative(nativeMatch, rx, S);\n\n      if (res.done) return res.value;\n\n      var flags = toString(getRegExpFlags(rx));\n\n      if (stringIndexOf(flags, 'g') === -1) return regExpExec(rx, S);\n\n      var fullUnicode = stringIndexOf(flags, 'u') !== -1;\n      rx.lastIndex = 0;\n      var A = [];\n      var n = 0;\n      var result;\n      while ((result = regExpExec(rx, S)) !== null) {\n        var matchStr = toString(result[0]);\n        A[n] = matchStr;\n        if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n        n++;\n      }\n      return n === 0 ? null : A;\n    }\n  ];\n});\n","'use strict';\n// `GetIteratorDirect(obj)` abstract operation\n// https://tc39.es/ecma262/#sec-getiteratordirect\nmodule.exports = function (obj) {\n  return {\n    iterator: obj,\n    next: obj.next,\n    done: false\n  };\n};\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar hasOwn = require('../internals/has-own-property');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar indexOf = require('../internals/array-includes').indexOf;\nvar hiddenKeys = require('../internals/hidden-keys');\n\nvar push = uncurryThis([].push);\n\nmodule.exports = function (object, names) {\n  var O = toIndexedObject(object);\n  var i = 0;\n  var result = [];\n  var key;\n  for (key in O) !hasOwn(hiddenKeys, key) && hasOwn(O, key) && push(result, key);\n  // Don't enum bug & hidden keys\n  while (names.length > i) if (hasOwn(O, key = names[i++])) {\n    ~indexOf(result, key) || push(result, key);\n  }\n  return result;\n};\n","\"use strict\";\n\nexports.__esModule = true;\nexports.UNIVERSAL = exports.ATTRIBUTE = exports.CLASS = exports.COMBINATOR = exports.COMMENT = exports.ID = exports.NESTING = exports.PSEUDO = exports.ROOT = exports.SELECTOR = exports.STRING = exports.TAG = void 0;\nvar TAG = 'tag';\nexports.TAG = TAG;\nvar STRING = 'string';\nexports.STRING = STRING;\nvar SELECTOR = 'selector';\nexports.SELECTOR = SELECTOR;\nvar ROOT = 'root';\nexports.ROOT = ROOT;\nvar PSEUDO = 'pseudo';\nexports.PSEUDO = PSEUDO;\nvar NESTING = 'nesting';\nexports.NESTING = NESTING;\nvar ID = 'id';\nexports.ID = ID;\nvar COMMENT = 'comment';\nexports.COMMENT = COMMENT;\nvar COMBINATOR = 'combinator';\nexports.COMBINATOR = COMBINATOR;\nvar CLASS = 'class';\nexports.CLASS = CLASS;\nvar ATTRIBUTE = 'attribute';\nexports.ATTRIBUTE = ATTRIBUTE;\nvar UNIVERSAL = 'universal';\nexports.UNIVERSAL = UNIVERSAL;","'use strict';\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nexports.f = wellKnownSymbol;\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar safeGetBuiltIn = require('../internals/safe-get-built-in');\nvar bind = require('../internals/function-bind-context');\nvar macrotask = require('../internals/task').set;\nvar Queue = require('../internals/queue');\nvar IS_IOS = require('../internals/environment-is-ios');\nvar IS_IOS_PEBBLE = require('../internals/environment-is-ios-pebble');\nvar IS_WEBOS_WEBKIT = require('../internals/environment-is-webos-webkit');\nvar IS_NODE = require('../internals/environment-is-node');\n\nvar MutationObserver = globalThis.MutationObserver || globalThis.WebKitMutationObserver;\nvar document = globalThis.document;\nvar process = globalThis.process;\nvar Promise = globalThis.Promise;\nvar microtask = safeGetBuiltIn('queueMicrotask');\nvar notify, toggle, node, promise, then;\n\n// modern engines have queueMicrotask method\nif (!microtask) {\n  var queue = new Queue();\n\n  var flush = function () {\n    var parent, fn;\n    if (IS_NODE && (parent = process.domain)) parent.exit();\n    while (fn = queue.get()) try {\n      fn();\n    } catch (error) {\n      if (queue.head) notify();\n      throw error;\n    }\n    if (parent) parent.enter();\n  };\n\n  // browsers with MutationObserver, except iOS - https://github.com/zloirock/core-js/issues/339\n  // also except WebOS Webkit https://github.com/zloirock/core-js/issues/898\n  if (!IS_IOS && !IS_NODE && !IS_WEBOS_WEBKIT && MutationObserver && document) {\n    toggle = true;\n    node = document.createTextNode('');\n    new MutationObserver(flush).observe(node, { characterData: true });\n    notify = function () {\n      node.data = toggle = !toggle;\n    };\n  // environments with maybe non-completely correct, but existent Promise\n  } else if (!IS_IOS_PEBBLE && Promise && Promise.resolve) {\n    // Promise.resolve without an argument throws an error in LG WebOS 2\n    promise = Promise.resolve(undefined);\n    // workaround of WebKit ~ iOS Safari 10.1 bug\n    promise.constructor = Promise;\n    then = bind(promise.then, promise);\n    notify = function () {\n      then(flush);\n    };\n  // Node.js without promises\n  } else if (IS_NODE) {\n    notify = function () {\n      process.nextTick(flush);\n    };\n  // for other environments - macrotask based on:\n  // - setImmediate\n  // - MessageChannel\n  // - window.postMessage\n  // - onreadystatechange\n  // - setTimeout\n  } else {\n    // `webpack` dev server bug on IE global methods - use bind(fn, global)\n    macrotask = bind(macrotask, globalThis);\n    notify = function () {\n      macrotask(flush);\n    };\n  }\n\n  microtask = function (fn) {\n    if (!queue.head) notify();\n    queue.add(fn);\n  };\n}\n\nmodule.exports = microtask;\n","\"use strict\";\n\nexports.__esModule = true;\nexports.unescapeValue = unescapeValue;\nexports[\"default\"] = void 0;\n\nvar _cssesc = _interopRequireDefault(require(\"cssesc\"));\n\nvar _unesc = _interopRequireDefault(require(\"../util/unesc\"));\n\nvar _namespace = _interopRequireDefault(require(\"./namespace\"));\n\nvar _types = require(\"./types\");\n\nvar _CSSESC_QUOTE_OPTIONS;\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nvar deprecate = require(\"util-deprecate\");\n\nvar WRAPPED_IN_QUOTES = /^('|\")([^]*)\\1$/;\nvar warnOfDeprecatedValueAssignment = deprecate(function () {}, \"Assigning an attribute a value containing characters that might need to be escaped is deprecated. \" + \"Call attribute.setValue() instead.\");\nvar warnOfDeprecatedQuotedAssignment = deprecate(function () {}, \"Assigning attr.quoted is deprecated and has no effect. Assign to attr.quoteMark instead.\");\nvar warnOfDeprecatedConstructor = deprecate(function () {}, \"Constructing an Attribute selector with a value without specifying quoteMark is deprecated. Note: The value should be unescaped now.\");\n\nfunction unescapeValue(value) {\n  var deprecatedUsage = false;\n  var quoteMark = null;\n  var unescaped = value;\n  var m = unescaped.match(WRAPPED_IN_QUOTES);\n\n  if (m) {\n    quoteMark = m[1];\n    unescaped = m[2];\n  }\n\n  unescaped = (0, _unesc[\"default\"])(unescaped);\n\n  if (unescaped !== value) {\n    deprecatedUsage = true;\n  }\n\n  return {\n    deprecatedUsage: deprecatedUsage,\n    unescaped: unescaped,\n    quoteMark: quoteMark\n  };\n}\n\nfunction handleDeprecatedContructorOpts(opts) {\n  if (opts.quoteMark !== undefined) {\n    return opts;\n  }\n\n  if (opts.value === undefined) {\n    return opts;\n  }\n\n  warnOfDeprecatedConstructor();\n\n  var _unescapeValue = unescapeValue(opts.value),\n      quoteMark = _unescapeValue.quoteMark,\n      unescaped = _unescapeValue.unescaped;\n\n  if (!opts.raws) {\n    opts.raws = {};\n  }\n\n  if (opts.raws.value === undefined) {\n    opts.raws.value = opts.value;\n  }\n\n  opts.value = unescaped;\n  opts.quoteMark = quoteMark;\n  return opts;\n}\n\nvar Attribute = /*#__PURE__*/function (_Namespace) {\n  _inheritsLoose(Attribute, _Namespace);\n\n  function Attribute(opts) {\n    var _this;\n\n    if (opts === void 0) {\n      opts = {};\n    }\n\n    _this = _Namespace.call(this, handleDeprecatedContructorOpts(opts)) || this;\n    _this.type = _types.ATTRIBUTE;\n    _this.raws = _this.raws || {};\n    Object.defineProperty(_this.raws, 'unquoted', {\n      get: deprecate(function () {\n        return _this.value;\n      }, \"attr.raws.unquoted is deprecated. Call attr.value instead.\"),\n      set: deprecate(function () {\n        return _this.value;\n      }, \"Setting attr.raws.unquoted is deprecated and has no effect. attr.value is unescaped by default now.\")\n    });\n    _this._constructed = true;\n    return _this;\n  }\n  /**\n   * Returns the Attribute's value quoted such that it would be legal to use\n   * in the value of a css file. The original value's quotation setting\n   * used for stringification is left unchanged. See `setValue(value, options)`\n   * if you want to control the quote settings of a new value for the attribute.\n   *\n   * You can also change the quotation used for the current value by setting quoteMark.\n   *\n   * Options:\n   *   * quoteMark {'\"' | \"'\" | null} - Use this value to quote the value. If this\n   *     option is not set, the original value for quoteMark will be used. If\n   *     indeterminate, a double quote is used. The legal values are:\n   *     * `null` - the value will be unquoted and characters will be escaped as necessary.\n   *     * `'` - the value will be quoted with a single quote and single quotes are escaped.\n   *     * `\"` - the value will be quoted with a double quote and double quotes are escaped.\n   *   * preferCurrentQuoteMark {boolean} - if true, prefer the source quote mark\n   *     over the quoteMark option value.\n   *   * smart {boolean} - if true, will select a quote mark based on the value\n   *     and the other options specified here. See the `smartQuoteMark()`\n   *     method.\n   **/\n\n\n  var _proto = Attribute.prototype;\n\n  _proto.getQuotedValue = function getQuotedValue(options) {\n    if (options === void 0) {\n      options = {};\n    }\n\n    var quoteMark = this._determineQuoteMark(options);\n\n    var cssescopts = CSSESC_QUOTE_OPTIONS[quoteMark];\n    var escaped = (0, _cssesc[\"default\"])(this._value, cssescopts);\n    return escaped;\n  };\n\n  _proto._determineQuoteMark = function _determineQuoteMark(options) {\n    return options.smart ? this.smartQuoteMark(options) : this.preferredQuoteMark(options);\n  }\n  /**\n   * Set the unescaped value with the specified quotation options. The value\n   * provided must not include any wrapping quote marks -- those quotes will\n   * be interpreted as part of the value and escaped accordingly.\n   */\n  ;\n\n  _proto.setValue = function setValue(value, options) {\n    if (options === void 0) {\n      options = {};\n    }\n\n    this._value = value;\n    this._quoteMark = this._determineQuoteMark(options);\n\n    this._syncRawValue();\n  }\n  /**\n   * Intelligently select a quoteMark value based on the value's contents. If\n   * the value is a legal CSS ident, it will not be quoted. Otherwise a quote\n   * mark will be picked that minimizes the number of escapes.\n   *\n   * If there's no clear winner, the quote mark from these options is used,\n   * then the source quote mark (this is inverted if `preferCurrentQuoteMark` is\n   * true). If the quoteMark is unspecified, a double quote is used.\n   *\n   * @param options This takes the quoteMark and preferCurrentQuoteMark options\n   * from the quoteValue method.\n   */\n  ;\n\n  _proto.smartQuoteMark = function smartQuoteMark(options) {\n    var v = this.value;\n    var numSingleQuotes = v.replace(/[^']/g, '').length;\n    var numDoubleQuotes = v.replace(/[^\"]/g, '').length;\n\n    if (numSingleQuotes + numDoubleQuotes === 0) {\n      var escaped = (0, _cssesc[\"default\"])(v, {\n        isIdentifier: true\n      });\n\n      if (escaped === v) {\n        return Attribute.NO_QUOTE;\n      } else {\n        var pref = this.preferredQuoteMark(options);\n\n        if (pref === Attribute.NO_QUOTE) {\n          // pick a quote mark that isn't none and see if it's smaller\n          var quote = this.quoteMark || options.quoteMark || Attribute.DOUBLE_QUOTE;\n          var opts = CSSESC_QUOTE_OPTIONS[quote];\n          var quoteValue = (0, _cssesc[\"default\"])(v, opts);\n\n          if (quoteValue.length < escaped.length) {\n            return quote;\n          }\n        }\n\n        return pref;\n      }\n    } else if (numDoubleQuotes === numSingleQuotes) {\n      return this.preferredQuoteMark(options);\n    } else if (numDoubleQuotes < numSingleQuotes) {\n      return Attribute.DOUBLE_QUOTE;\n    } else {\n      return Attribute.SINGLE_QUOTE;\n    }\n  }\n  /**\n   * Selects the preferred quote mark based on the options and the current quote mark value.\n   * If you want the quote mark to depend on the attribute value, call `smartQuoteMark(opts)`\n   * instead.\n   */\n  ;\n\n  _proto.preferredQuoteMark = function preferredQuoteMark(options) {\n    var quoteMark = options.preferCurrentQuoteMark ? this.quoteMark : options.quoteMark;\n\n    if (quoteMark === undefined) {\n      quoteMark = options.preferCurrentQuoteMark ? options.quoteMark : this.quoteMark;\n    }\n\n    if (quoteMark === undefined) {\n      quoteMark = Attribute.DOUBLE_QUOTE;\n    }\n\n    return quoteMark;\n  };\n\n  _proto._syncRawValue = function _syncRawValue() {\n    var rawValue = (0, _cssesc[\"default\"])(this._value, CSSESC_QUOTE_OPTIONS[this.quoteMark]);\n\n    if (rawValue === this._value) {\n      if (this.raws) {\n        delete this.raws.value;\n      }\n    } else {\n      this.raws.value = rawValue;\n    }\n  };\n\n  _proto._handleEscapes = function _handleEscapes(prop, value) {\n    if (this._constructed) {\n      var escaped = (0, _cssesc[\"default\"])(value, {\n        isIdentifier: true\n      });\n\n      if (escaped !== value) {\n        this.raws[prop] = escaped;\n      } else {\n        delete this.raws[prop];\n      }\n    }\n  };\n\n  _proto._spacesFor = function _spacesFor(name) {\n    var attrSpaces = {\n      before: '',\n      after: ''\n    };\n    var spaces = this.spaces[name] || {};\n    var rawSpaces = this.raws.spaces && this.raws.spaces[name] || {};\n    return Object.assign(attrSpaces, spaces, rawSpaces);\n  };\n\n  _proto._stringFor = function _stringFor(name, spaceName, concat) {\n    if (spaceName === void 0) {\n      spaceName = name;\n    }\n\n    if (concat === void 0) {\n      concat = defaultAttrConcat;\n    }\n\n    var attrSpaces = this._spacesFor(spaceName);\n\n    return concat(this.stringifyProperty(name), attrSpaces);\n  }\n  /**\n   * returns the offset of the attribute part specified relative to the\n   * start of the node of the output string.\n   *\n   * * \"ns\" - alias for \"namespace\"\n   * * \"namespace\" - the namespace if it exists.\n   * * \"attribute\" - the attribute name\n   * * \"attributeNS\" - the start of the attribute or its namespace\n   * * \"operator\" - the match operator of the attribute\n   * * \"value\" - The value (string or identifier)\n   * * \"insensitive\" - the case insensitivity flag;\n   * @param part One of the possible values inside an attribute.\n   * @returns -1 if the name is invalid or the value doesn't exist in this attribute.\n   */\n  ;\n\n  _proto.offsetOf = function offsetOf(name) {\n    var count = 1;\n\n    var attributeSpaces = this._spacesFor(\"attribute\");\n\n    count += attributeSpaces.before.length;\n\n    if (name === \"namespace\" || name === \"ns\") {\n      return this.namespace ? count : -1;\n    }\n\n    if (name === \"attributeNS\") {\n      return count;\n    }\n\n    count += this.namespaceString.length;\n\n    if (this.namespace) {\n      count += 1;\n    }\n\n    if (name === \"attribute\") {\n      return count;\n    }\n\n    count += this.stringifyProperty(\"attribute\").length;\n    count += attributeSpaces.after.length;\n\n    var operatorSpaces = this._spacesFor(\"operator\");\n\n    count += operatorSpaces.before.length;\n    var operator = this.stringifyProperty(\"operator\");\n\n    if (name === \"operator\") {\n      return operator ? count : -1;\n    }\n\n    count += operator.length;\n    count += operatorSpaces.after.length;\n\n    var valueSpaces = this._spacesFor(\"value\");\n\n    count += valueSpaces.before.length;\n    var value = this.stringifyProperty(\"value\");\n\n    if (name === \"value\") {\n      return value ? count : -1;\n    }\n\n    count += value.length;\n    count += valueSpaces.after.length;\n\n    var insensitiveSpaces = this._spacesFor(\"insensitive\");\n\n    count += insensitiveSpaces.before.length;\n\n    if (name === \"insensitive\") {\n      return this.insensitive ? count : -1;\n    }\n\n    return -1;\n  };\n\n  _proto.toString = function toString() {\n    var _this2 = this;\n\n    var selector = [this.rawSpaceBefore, '['];\n    selector.push(this._stringFor('qualifiedAttribute', 'attribute'));\n\n    if (this.operator && (this.value || this.value === '')) {\n      selector.push(this._stringFor('operator'));\n      selector.push(this._stringFor('value'));\n      selector.push(this._stringFor('insensitiveFlag', 'insensitive', function (attrValue, attrSpaces) {\n        if (attrValue.length > 0 && !_this2.quoted && attrSpaces.before.length === 0 && !(_this2.spaces.value && _this2.spaces.value.after)) {\n          attrSpaces.before = \" \";\n        }\n\n        return defaultAttrConcat(attrValue, attrSpaces);\n      }));\n    }\n\n    selector.push(']');\n    selector.push(this.rawSpaceAfter);\n    return selector.join('');\n  };\n\n  _createClass(Attribute, [{\n    key: \"quoted\",\n    get: function get() {\n      var qm = this.quoteMark;\n      return qm === \"'\" || qm === '\"';\n    },\n    set: function set(value) {\n      warnOfDeprecatedQuotedAssignment();\n    }\n    /**\n     * returns a single (`'`) or double (`\"`) quote character if the value is quoted.\n     * returns `null` if the value is not quoted.\n     * returns `undefined` if the quotation state is unknown (this can happen when\n     * the attribute is constructed without specifying a quote mark.)\n     */\n\n  }, {\n    key: \"quoteMark\",\n    get: function get() {\n      return this._quoteMark;\n    }\n    /**\n     * Set the quote mark to be used by this attribute's value.\n     * If the quote mark changes, the raw (escaped) value at `attr.raws.value` of the attribute\n     * value is updated accordingly.\n     *\n     * @param {\"'\" | '\"' | null} quoteMark The quote mark or `null` if the value should be unquoted.\n     */\n    ,\n    set: function set(quoteMark) {\n      if (!this._constructed) {\n        this._quoteMark = quoteMark;\n        return;\n      }\n\n      if (this._quoteMark !== quoteMark) {\n        this._quoteMark = quoteMark;\n\n        this._syncRawValue();\n      }\n    }\n  }, {\n    key: \"qualifiedAttribute\",\n    get: function get() {\n      return this.qualifiedName(this.raws.attribute || this.attribute);\n    }\n  }, {\n    key: \"insensitiveFlag\",\n    get: function get() {\n      return this.insensitive ? 'i' : '';\n    }\n  }, {\n    key: \"value\",\n    get: function get() {\n      return this._value;\n    }\n    /**\n     * Before 3.0, the value had to be set to an escaped value including any wrapped\n     * quote marks. In 3.0, the semantics of `Attribute.value` changed so that the value\n     * is unescaped during parsing and any quote marks are removed.\n     *\n     * Because the ambiguity of this semantic change, if you set `attr.value = newValue`,\n     * a deprecation warning is raised when the new value contains any characters that would\n     * require escaping (including if it contains wrapped quotes).\n     *\n     * Instead, you should call `attr.setValue(newValue, opts)` and pass options that describe\n     * how the new value is quoted.\n     */\n    ,\n    set: function set(v) {\n      if (this._constructed) {\n        var _unescapeValue2 = unescapeValue(v),\n            deprecatedUsage = _unescapeValue2.deprecatedUsage,\n            unescaped = _unescapeValue2.unescaped,\n            quoteMark = _unescapeValue2.quoteMark;\n\n        if (deprecatedUsage) {\n          warnOfDeprecatedValueAssignment();\n        }\n\n        if (unescaped === this._value && quoteMark === this._quoteMark) {\n          return;\n        }\n\n        this._value = unescaped;\n        this._quoteMark = quoteMark;\n\n        this._syncRawValue();\n      } else {\n        this._value = v;\n      }\n    }\n  }, {\n    key: \"attribute\",\n    get: function get() {\n      return this._attribute;\n    },\n    set: function set(name) {\n      this._handleEscapes(\"attribute\", name);\n\n      this._attribute = name;\n    }\n  }]);\n\n  return Attribute;\n}(_namespace[\"default\"]);\n\nexports[\"default\"] = Attribute;\nAttribute.NO_QUOTE = null;\nAttribute.SINGLE_QUOTE = \"'\";\nAttribute.DOUBLE_QUOTE = '\"';\nvar CSSESC_QUOTE_OPTIONS = (_CSSESC_QUOTE_OPTIONS = {\n  \"'\": {\n    quotes: 'single',\n    wrap: true\n  },\n  '\"': {\n    quotes: 'double',\n    wrap: true\n  }\n}, _CSSESC_QUOTE_OPTIONS[null] = {\n  isIdentifier: true\n}, _CSSESC_QUOTE_OPTIONS);\n\nfunction defaultAttrConcat(attrValue, attrSpaces) {\n  return \"\" + attrSpaces.before + attrValue + attrSpaces.after;\n}","'use strict';\nvar $ = require('../internals/export');\nvar IS_PURE = require('../internals/is-pure');\nvar FORCED_PROMISE_CONSTRUCTOR = require('../internals/promise-constructor-detection').CONSTRUCTOR;\nvar NativePromiseConstructor = require('../internals/promise-native-constructor');\nvar getBuiltIn = require('../internals/get-built-in');\nvar isCallable = require('../internals/is-callable');\nvar defineBuiltIn = require('../internals/define-built-in');\n\nvar NativePromisePrototype = NativePromiseConstructor && NativePromiseConstructor.prototype;\n\n// `Promise.prototype.catch` method\n// https://tc39.es/ecma262/#sec-promise.prototype.catch\n$({ target: 'Promise', proto: true, forced: FORCED_PROMISE_CONSTRUCTOR, real: true }, {\n  'catch': function (onRejected) {\n    return this.then(undefined, onRejected);\n  }\n});\n\n// makes sure that native promise-based APIs `Promise#catch` properly works with patched `Promise#then`\nif (!IS_PURE && isCallable(NativePromiseConstructor)) {\n  var method = getBuiltIn('Promise').prototype['catch'];\n  if (NativePromisePrototype['catch'] !== method) {\n    defineBuiltIn(NativePromisePrototype, 'catch', method, { unsafe: true });\n  }\n}\n","'use strict';\nvar $ = require('../internals/export');\nvar $filter = require('../internals/array-iteration').filter;\nvar arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support');\n\nvar HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('filter');\n\n// `Array.prototype.filter` method\n// https://tc39.es/ecma262/#sec-array.prototype.filter\n// with adding support of @@species\n$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT }, {\n  filter: function filter(callbackfn /* , thisArg */) {\n    return $filter(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n  }\n});\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar FUNCTION_NAME_EXISTS = require('../internals/function-name').EXISTS;\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar defineBuiltInAccessor = require('../internals/define-built-in-accessor');\n\nvar FunctionPrototype = Function.prototype;\nvar functionToString = uncurryThis(FunctionPrototype.toString);\nvar nameRE = /function\\b(?:\\s|\\/\\*[\\S\\s]*?\\*\\/|\\/\\/[^\\n\\r]*[\\n\\r]+)*([^\\s(/]*)/;\nvar regExpExec = uncurryThis(nameRE.exec);\nvar NAME = 'name';\n\n// Function instances `.name` property\n// https://tc39.es/ecma262/#sec-function-instances-name\nif (DESCRIPTORS && !FUNCTION_NAME_EXISTS) {\n  defineBuiltInAccessor(FunctionPrototype, NAME, {\n    configurable: true,\n    get: function () {\n      try {\n        return regExpExec(nameRE, functionToString(this))[1];\n      } catch (error) {\n        return '';\n      }\n    }\n  });\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nfunction _export(target, all) {\n    for(var name in all)Object.defineProperty(target, name, {\n        enumerable: true,\n        get: all[name]\n    });\n}\n_export(exports, {\n    flagEnabled: function() {\n        return flagEnabled;\n    },\n    issueFlagNotices: function() {\n        return issueFlagNotices;\n    },\n    default: function() {\n        return _default;\n    }\n});\nconst _picocolors = /*#__PURE__*/ _interop_require_default(require(\"picocolors\"));\nconst _log = /*#__PURE__*/ _interop_require_default(require(\"./util/log\"));\nfunction _interop_require_default(obj) {\n    return obj && obj.__esModule ? obj : {\n        default: obj\n    };\n}\nlet defaults = {\n    optimizeUniversalDefaults: false,\n    generalizedModifiers: true,\n    disableColorOpacityUtilitiesByDefault: false,\n    relativeContentPathsByDefault: false\n};\nlet featureFlags = {\n    future: [\n        \"hoverOnlyWhenSupported\",\n        \"respectDefaultRingColorOpacity\",\n        \"disableColorOpacityUtilitiesByDefault\",\n        \"relativeContentPathsByDefault\"\n    ],\n    experimental: [\n        \"optimizeUniversalDefaults\",\n        \"generalizedModifiers\"\n    ]\n};\nfunction flagEnabled(config, flag) {\n    if (featureFlags.future.includes(flag)) {\n        var _config_future;\n        var _config_future_flag, _ref;\n        return config.future === \"all\" || ((_ref = (_config_future_flag = config === null || config === void 0 ? void 0 : (_config_future = config.future) === null || _config_future === void 0 ? void 0 : _config_future[flag]) !== null && _config_future_flag !== void 0 ? _config_future_flag : defaults[flag]) !== null && _ref !== void 0 ? _ref : false);\n    }\n    if (featureFlags.experimental.includes(flag)) {\n        var _config_experimental;\n        var _config_experimental_flag, _ref1;\n        return config.experimental === \"all\" || ((_ref1 = (_config_experimental_flag = config === null || config === void 0 ? void 0 : (_config_experimental = config.experimental) === null || _config_experimental === void 0 ? void 0 : _config_experimental[flag]) !== null && _config_experimental_flag !== void 0 ? _config_experimental_flag : defaults[flag]) !== null && _ref1 !== void 0 ? _ref1 : false);\n    }\n    return false;\n}\nfunction experimentalFlagsEnabled(config) {\n    if (config.experimental === \"all\") {\n        return featureFlags.experimental;\n    }\n    var _config_experimental;\n    return Object.keys((_config_experimental = config === null || config === void 0 ? void 0 : config.experimental) !== null && _config_experimental !== void 0 ? _config_experimental : {}).filter((flag)=>featureFlags.experimental.includes(flag) && config.experimental[flag]);\n}\nfunction issueFlagNotices(config) {\n    if (process.env.JEST_WORKER_ID !== undefined) {\n        return;\n    }\n    if (experimentalFlagsEnabled(config).length > 0) {\n        let changes = experimentalFlagsEnabled(config).map((s)=>_picocolors.default.yellow(s)).join(\", \");\n        _log.default.warn(\"experimental-flags-enabled\", [\n            `You have enabled experimental features: ${changes}`,\n            \"Experimental features in Tailwind CSS are not covered by semver, may introduce breaking changes, and can change at any time.\"\n        ]);\n    }\n}\nconst _default = featureFlags;\n","'use strict';\nvar $ = require('../internals/export');\nvar $map = require('../internals/array-iteration').map;\nvar arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support');\n\nvar HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('map');\n\n// `Array.prototype.map` method\n// https://tc39.es/ecma262/#sec-array.prototype.map\n// with adding support of @@species\n$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT }, {\n  map: function map(callbackfn /* , thisArg */) {\n    return $map(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n  }\n});\n","'use strict';\nvar makeBuiltIn = require('../internals/make-built-in');\nvar defineProperty = require('../internals/object-define-property');\n\nmodule.exports = function (target, name, descriptor) {\n  if (descriptor.get) makeBuiltIn(descriptor.get, name, { getter: true });\n  if (descriptor.set) makeBuiltIn(descriptor.set, name, { setter: true });\n  return defineProperty.f(target, name, descriptor);\n};\n","/**\n * EvEmitter v1.1.0\n * Lil' event emitter\n * MIT License\n */\n\n/* jshint unused: true, undef: true, strict: true */\n\n( function( global, factory ) {\n  // universal module definition\n  /* jshint strict: false */ /* globals define, module, window */\n  if ( typeof define == 'function' && define.amd ) {\n    // AMD - RequireJS\n    define( factory );\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS - Browserify, Webpack\n    module.exports = factory();\n  } else {\n    // Browser globals\n    global.EvEmitter = factory();\n  }\n\n}( typeof window != 'undefined' ? window : this, function() {\n\n\"use strict\";\n\nfunction EvEmitter() {}\n\nvar proto = EvEmitter.prototype;\n\nproto.on = function( eventName, listener ) {\n  if ( !eventName || !listener ) {\n    return;\n  }\n  // set events hash\n  var events = this._events = this._events || {};\n  // set listeners array\n  var listeners = events[ eventName ] = events[ eventName ] || [];\n  // only add once\n  if ( listeners.indexOf( listener ) == -1 ) {\n    listeners.push( listener );\n  }\n\n  return this;\n};\n\nproto.once = function( eventName, listener ) {\n  if ( !eventName || !listener ) {\n    return;\n  }\n  // add event\n  this.on( eventName, listener );\n  // set once flag\n  // set onceEvents hash\n  var onceEvents = this._onceEvents = this._onceEvents || {};\n  // set onceListeners object\n  var onceListeners = onceEvents[ eventName ] = onceEvents[ eventName ] || {};\n  // set flag\n  onceListeners[ listener ] = true;\n\n  return this;\n};\n\nproto.off = function( eventName, listener ) {\n  var listeners = this._events && this._events[ eventName ];\n  if ( !listeners || !listeners.length ) {\n    return;\n  }\n  var index = listeners.indexOf( listener );\n  if ( index != -1 ) {\n    listeners.splice( index, 1 );\n  }\n\n  return this;\n};\n\nproto.emitEvent = function( eventName, args ) {\n  var listeners = this._events && this._events[ eventName ];\n  if ( !listeners || !listeners.length ) {\n    return;\n  }\n  // copy over to avoid interference if .off() in listener\n  listeners = listeners.slice(0);\n  args = args || [];\n  // once stuff\n  var onceListeners = this._onceEvents && this._onceEvents[ eventName ];\n\n  for ( var i=0; i < listeners.length; i++ ) {\n    var listener = listeners[i]\n    var isOnce = onceListeners && onceListeners[ listener ];\n    if ( isOnce ) {\n      // remove listener\n      // remove before trigger to prevent recursion\n      this.off( eventName, listener );\n      // unset once flag\n      delete onceListeners[ listener ];\n    }\n    // trigger listener\n    listener.apply( this, args );\n  }\n\n  return this;\n};\n\nproto.allOff = function() {\n  delete this._events;\n  delete this._onceEvents;\n};\n\nreturn EvEmitter;\n\n}));\n","'use strict';\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar test = {};\n// eslint-disable-next-line unicorn/no-immediate-mutation -- ES3 syntax limitation\ntest[TO_STRING_TAG] = 'z';\n\nmodule.exports = String(test) === '[object z]';\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\n\nvar toString = uncurryThis({}.toString);\nvar stringSlice = uncurryThis(''.slice);\n\nmodule.exports = function (it) {\n  return stringSlice(toString(it), 8, -1);\n};\n","'use strict';\nvar fails = require('../internals/fails');\n\nmodule.exports = !fails(function () {\n  function F() { /* empty */ }\n  F.prototype.constructor = null;\n  // eslint-disable-next-line es/no-object-getprototypeof -- required for testing\n  return Object.getPrototypeOf(new F()) !== F.prototype;\n});\n","/**\n * EvEmitter v2.1.1\n * Lil' event emitter\n * MIT License\n */\n\n( function( global, factory ) {\n  // universal module definition\n  if ( typeof module == 'object' && module.exports ) {\n    // CommonJS - Browserify, Webpack\n    module.exports = factory();\n  } else {\n    // Browser globals\n    global.EvEmitter = factory();\n  }\n\n}( typeof window != 'undefined' ? window : this, function() {\n\nfunction EvEmitter() {}\n\nlet proto = EvEmitter.prototype;\n\nproto.on = function( eventName, listener ) {\n  if ( !eventName || !listener ) return this;\n\n  // set events hash\n  let events = this._events = this._events || {};\n  // set listeners array\n  let listeners = events[ eventName ] = events[ eventName ] || [];\n  // only add once\n  if ( !listeners.includes( listener ) ) {\n    listeners.push( listener );\n  }\n\n  return this;\n};\n\nproto.once = function( eventName, listener ) {\n  if ( !eventName || !listener ) return this;\n\n  // add event\n  this.on( eventName, listener );\n  // set once flag\n  // set onceEvents hash\n  let onceEvents = this._onceEvents = this._onceEvents || {};\n  // set onceListeners object\n  let onceListeners = onceEvents[ eventName ] = onceEvents[ eventName ] || {};\n  // set flag\n  onceListeners[ listener ] = true;\n\n  return this;\n};\n\nproto.off = function( eventName, listener ) {\n  let listeners = this._events && this._events[ eventName ];\n  if ( !listeners || !listeners.length ) return this;\n\n  let index = listeners.indexOf( listener );\n  if ( index != -1 ) {\n    listeners.splice( index, 1 );\n  }\n\n  return this;\n};\n\nproto.emitEvent = function( eventName, args ) {\n  let listeners = this._events && this._events[ eventName ];\n  if ( !listeners || !listeners.length ) return this;\n\n  // copy over to avoid interference if .off() in listener\n  listeners = listeners.slice( 0 );\n  args = args || [];\n  // once stuff\n  let onceListeners = this._onceEvents && this._onceEvents[ eventName ];\n\n  for ( let listener of listeners ) {\n    let isOnce = onceListeners && onceListeners[ listener ];\n    if ( isOnce ) {\n      // remove listener\n      // remove before trigger to prevent recursion\n      this.off( eventName, listener );\n      // unset once flag\n      delete onceListeners[ listener ];\n    }\n    // trigger listener\n    listener.apply( this, args );\n  }\n\n  return this;\n};\n\nproto.allOff = function() {\n  delete this._events;\n  delete this._onceEvents;\n  return this;\n};\n\nreturn EvEmitter;\n\n} ) );\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\n\n// eslint-disable-next-line es/no-map -- safe\nvar MapPrototype = Map.prototype;\n\nmodule.exports = {\n  // eslint-disable-next-line es/no-map -- safe\n  Map: Map,\n  set: uncurryThis(MapPrototype.set),\n  get: uncurryThis(MapPrototype.get),\n  has: uncurryThis(MapPrototype.has),\n  remove: uncurryThis(MapPrototype['delete']),\n  proto: MapPrototype\n};\n","'use strict';\nvar defineWellKnownSymbol = require('../internals/well-known-symbol-define');\n\n// `Symbol.iterator` well-known symbol\n// https://tc39.es/ecma262/#sec-symbol.iterator\ndefineWellKnownSymbol('iterator');\n","'use strict';\nvar anObject = require('../internals/an-object');\nvar aConstructor = require('../internals/a-constructor');\nvar isNullOrUndefined = require('../internals/is-null-or-undefined');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar SPECIES = wellKnownSymbol('species');\n\n// `SpeciesConstructor` abstract operation\n// https://tc39.es/ecma262/#sec-speciesconstructor\nmodule.exports = function (O, defaultConstructor) {\n  var C = anObject(O).constructor;\n  var S;\n  return C === undefined || isNullOrUndefined(S = anObject(C)[SPECIES]) ? defaultConstructor : aConstructor(S);\n};\n","'use strict';\nvar toIntegerOrInfinity = require('../internals/to-integer-or-infinity');\nvar toString = require('../internals/to-string');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n\nvar $RangeError = RangeError;\n\n// `String.prototype.repeat` method implementation\n// https://tc39.es/ecma262/#sec-string.prototype.repeat\nmodule.exports = function repeat(count) {\n  var str = toString(requireObjectCoercible(this));\n  var result = '';\n  var n = toIntegerOrInfinity(count);\n  if (n < 0 || n === Infinity) throw new $RangeError('Wrong number of repetitions');\n  for (;n > 0; (n >>>= 1) && (str += str)) if (n & 1) result += str;\n  return result;\n};\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar fails = require('../internals/fails');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar objectGetPrototypeOf = require('../internals/object-get-prototype-of');\nvar objectKeys = require('../internals/object-keys');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar $propertyIsEnumerable = require('../internals/object-property-is-enumerable').f;\n\nvar propertyIsEnumerable = uncurryThis($propertyIsEnumerable);\nvar push = uncurryThis([].push);\n\n// in some IE versions, `propertyIsEnumerable` returns incorrect result on integer keys\n// of `null` prototype objects\nvar IE_BUG = DESCRIPTORS && fails(function () {\n  // eslint-disable-next-line es/no-object-create -- safe\n  var O = Object.create(null);\n  O[2] = 2;\n  return !propertyIsEnumerable(O, 2);\n});\n\n// `Object.{ entries, values }` methods implementation\nvar createMethod = function (TO_ENTRIES) {\n  return function (it) {\n    var O = toIndexedObject(it);\n    var keys = objectKeys(O);\n    var IE_WORKAROUND = IE_BUG && objectGetPrototypeOf(O) === null;\n    var length = keys.length;\n    var i = 0;\n    var result = [];\n    var key;\n    while (length > i) {\n      key = keys[i++];\n      if (!DESCRIPTORS || (IE_WORKAROUND ? key in O : propertyIsEnumerable(O, key))) {\n        push(result, TO_ENTRIES ? [key, O[key]] : O[key]);\n      }\n    }\n    return result;\n  };\n};\n\nmodule.exports = {\n  // `Object.entries` method\n  // https://tc39.es/ecma262/#sec-object.entries\n  entries: createMethod(true),\n  // `Object.values` method\n  // https://tc39.es/ecma262/#sec-object.values\n  values: createMethod(false)\n};\n","'use strict';\n/* global ActiveXObject -- old IE, WSH */\nvar anObject = require('../internals/an-object');\nvar definePropertiesModule = require('../internals/object-define-properties');\nvar enumBugKeys = require('../internals/enum-bug-keys');\nvar hiddenKeys = require('../internals/hidden-keys');\nvar html = require('../internals/html');\nvar documentCreateElement = require('../internals/document-create-element');\nvar sharedKey = require('../internals/shared-key');\n\nvar GT = '>';\nvar LT = '<';\nvar PROTOTYPE = 'prototype';\nvar SCRIPT = 'script';\nvar IE_PROTO = sharedKey('IE_PROTO');\n\nvar EmptyConstructor = function () { /* empty */ };\n\nvar scriptTag = function (content) {\n  return LT + SCRIPT + GT + content + LT + '/' + SCRIPT + GT;\n};\n\n// Create object with fake `null` prototype: use ActiveX Object with cleared prototype\nvar NullProtoObjectViaActiveX = function (activeXDocument) {\n  activeXDocument.write(scriptTag(''));\n  activeXDocument.close();\n  var temp = activeXDocument.parentWindow.Object;\n  // eslint-disable-next-line no-useless-assignment -- avoid memory leak\n  activeXDocument = null;\n  return temp;\n};\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar NullProtoObjectViaIFrame = function () {\n  // Thrash, waste and sodomy: IE GC bug\n  var iframe = documentCreateElement('iframe');\n  var JS = 'java' + SCRIPT + ':';\n  var iframeDocument;\n  iframe.style.display = 'none';\n  html.appendChild(iframe);\n  // https://github.com/zloirock/core-js/issues/475\n  iframe.src = String(JS);\n  iframeDocument = iframe.contentWindow.document;\n  iframeDocument.open();\n  iframeDocument.write(scriptTag('document.F=Object'));\n  iframeDocument.close();\n  return iframeDocument.F;\n};\n\n// Check for document.domain and active x support\n// No need to use active x approach when document.domain is not set\n// see https://github.com/es-shims/es5-shim/issues/150\n// variation of https://github.com/kitcambridge/es5-shim/commit/4f738ac066346\n// avoid IE GC bug\nvar activeXDocument;\nvar NullProtoObject = function () {\n  try {\n    activeXDocument = new ActiveXObject('htmlfile');\n  } catch (error) { /* ignore */ }\n  NullProtoObject = typeof document != 'undefined'\n    ? document.domain && activeXDocument\n      ? NullProtoObjectViaActiveX(activeXDocument) // old IE\n      : NullProtoObjectViaIFrame()\n    : NullProtoObjectViaActiveX(activeXDocument); // WSH\n  var length = enumBugKeys.length;\n  while (length--) delete NullProtoObject[PROTOTYPE][enumBugKeys[length]];\n  return NullProtoObject();\n};\n\nhiddenKeys[IE_PROTO] = true;\n\n// `Object.create` method\n// https://tc39.es/ecma262/#sec-object.create\n// eslint-disable-next-line es/no-object-create -- safe\nmodule.exports = Object.create || function create(O, Properties) {\n  var result;\n  if (O !== null) {\n    EmptyConstructor[PROTOTYPE] = anObject(O);\n    result = new EmptyConstructor();\n    EmptyConstructor[PROTOTYPE] = null;\n    // add \"__proto__\" for Object.getPrototypeOf polyfill\n    result[IE_PROTO] = O;\n  } else result = NullProtoObject();\n  return Properties === undefined ? result : definePropertiesModule.f(result, Properties);\n};\n","'use strict';\nvar collection = require('../internals/collection');\nvar collectionStrong = require('../internals/collection-strong');\n\n// `Set` constructor\n// https://tc39.es/ecma262/#sec-set-objects\ncollection('Set', function (init) {\n  return function Set() { return init(this, arguments.length ? arguments[0] : undefined); };\n}, collectionStrong);\n","\"use strict\";\n\nexports.__esModule = true;\n\nvar _types = require(\"./types\");\n\nObject.keys(_types).forEach(function (key) {\n  if (key === \"default\" || key === \"__esModule\") return;\n  if (key in exports && exports[key] === _types[key]) return;\n  exports[key] = _types[key];\n});\n\nvar _constructors = require(\"./constructors\");\n\nObject.keys(_constructors).forEach(function (key) {\n  if (key === \"default\" || key === \"__esModule\") return;\n  if (key in exports && exports[key] === _constructors[key]) return;\n  exports[key] = _constructors[key];\n});\n\nvar _guards = require(\"./guards\");\n\nObject.keys(_guards).forEach(function (key) {\n  if (key === \"default\" || key === \"__esModule\") return;\n  if (key in exports && exports[key] === _guards[key]) return;\n  exports[key] = _guards[key];\n});","'use strict';\nvar $ = require('../internals/export');\nvar isSupersetOf = require('../internals/set-is-superset-of');\nvar setMethodAcceptSetLike = require('../internals/set-method-accept-set-like');\n\nvar INCORRECT = !setMethodAcceptSetLike('isSupersetOf', function (result) {\n  return !result;\n});\n\n// `Set.prototype.isSupersetOf` method\n// https://tc39.es/ecma262/#sec-set.prototype.issupersetof\n$({ target: 'Set', proto: true, real: true, forced: INCORRECT }, {\n  isSupersetOf: isSupersetOf\n});\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar toObject = require('../internals/to-object');\n\nvar floor = Math.floor;\nvar charAt = uncurryThis(''.charAt);\nvar replace = uncurryThis(''.replace);\nvar stringSlice = uncurryThis(''.slice);\n// eslint-disable-next-line redos/no-vulnerable -- safe\nvar SUBSTITUTION_SYMBOLS = /\\$([$&'`]|\\d{1,2}|<[^>]*>)/g;\nvar SUBSTITUTION_SYMBOLS_NO_NAMED = /\\$([$&'`]|\\d{1,2})/g;\n\n// `GetSubstitution` abstract operation\n// https://tc39.es/ecma262/#sec-getsubstitution\nmodule.exports = function (matched, str, position, captures, namedCaptures, replacement) {\n  var tailPos = position + matched.length;\n  var m = captures.length;\n  var symbols = SUBSTITUTION_SYMBOLS_NO_NAMED;\n  if (namedCaptures !== undefined) {\n    namedCaptures = toObject(namedCaptures);\n    symbols = SUBSTITUTION_SYMBOLS;\n  }\n  return replace(replacement, symbols, function (match, ch) {\n    var capture;\n    switch (charAt(ch, 0)) {\n      case '$': return '$';\n      case '&': return matched;\n      case '`': return stringSlice(str, 0, position);\n      case \"'\": return stringSlice(str, tailPos);\n      case '<':\n        capture = namedCaptures[stringSlice(ch, 1, -1)];\n        break;\n      default: // \\d\\d?\n        var n = +ch;\n        if (n === 0) return match;\n        if (n > m) {\n          var f = floor(n / 10);\n          if (f === 0) return match;\n          if (f <= m) return captures[f - 1] === undefined ? charAt(ch, 1) : captures[f - 1] + charAt(ch, 1);\n          return match;\n        }\n        capture = captures[n - 1];\n    }\n    return capture === undefined ? '' : capture;\n  });\n};\n","\"use strict\";\n\nexports.__esModule = true;\nexports[\"default\"] = ensureObject;\n\nfunction ensureObject(obj) {\n  for (var _len = arguments.length, props = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n    props[_key - 1] = arguments[_key];\n  }\n\n  while (props.length > 0) {\n    var prop = props.shift();\n\n    if (!obj[prop]) {\n      obj[prop] = {};\n    }\n\n    obj = obj[prop];\n  }\n}\n\nmodule.exports = exports.default;","'use strict';\n// `CreateIterResultObject` abstract operation\n// https://tc39.es/ecma262/#sec-createiterresultobject\nmodule.exports = function (value, done) {\n  return { value: value, done: done };\n};\n","/**\n * fitRows layout mode\n */\n\n( function( window, factory ) {\n  // universal module definition\n  /* jshint strict: false */ /*globals define, module, require */\n  if ( typeof define == 'function' && define.amd ) {\n    // AMD\n    define( [\n        '../layout-mode'\n      ],\n      factory );\n  } else if ( typeof exports == 'object' ) {\n    // CommonJS\n    module.exports = factory(\n      require('../layout-mode')\n    );\n  } else {\n    // browser global\n    factory(\n      window.Isotope.LayoutMode\n    );\n  }\n\n}( window, function factory( LayoutMode ) {\n'use strict';\n\nvar FitRows = LayoutMode.create('fitRows');\n\nvar proto = FitRows.prototype;\n\nproto._resetLayout = function() {\n  this.x = 0;\n  this.y = 0;\n  this.maxY = 0;\n  this._getMeasurement( 'gutter', 'outerWidth' );\n};\n\nproto._getItemLayoutPosition = function( item ) {\n  item.getSize();\n\n  var itemWidth = item.size.outerWidth + this.gutter;\n  // if this element cannot fit in the current row\n  var containerWidth = this.isotope.size.innerWidth + this.gutter;\n  if ( this.x !== 0 && itemWidth + this.x > containerWidth ) {\n    this.x = 0;\n    this.y = this.maxY;\n  }\n\n  var position = {\n    x: this.x,\n    y: this.y\n  };\n\n  this.maxY = Math.max( this.maxY, this.y + item.size.outerHeight );\n  this.x += itemWidth;\n\n  return position;\n};\n\nproto._getContainerSize = function() {\n  return { height: this.maxY };\n};\n\nreturn FitRows;\n\n}));\n","(function(window, factory) {\n\tif(!window) {return;}\n\tvar globalInstall = function(){\n\t\tfactory(window.lazySizes);\n\t\twindow.removeEventListener('lazyunveilread', globalInstall, true);\n\t};\n\n\tfactory = factory.bind(null, window, window.document);\n\n\tif(typeof module == 'object' && module.exports){\n\t\tfactory(require('lazysizes'));\n\t} else if (typeof define == 'function' && define.amd) {\n\t\tdefine(['lazysizes'], factory);\n\t} else if(window.lazySizes) {\n\t\tglobalInstall();\n\t} else {\n\t\twindow.addEventListener('lazyunveilread', globalInstall, true);\n\t}\n}(typeof window != 'undefined' ?\n\twindow : 0, function(window, document, lazySizes) {\n\t'use strict';\n\n\tif(!window.addEventListener){return;}\n\n\tvar regDescriptors = /\\s+(\\d+)(w|h)\\s+(\\d+)(w|h)/;\n\tvar regCssFit = /parent-fit[\"']*\\s*:\\s*[\"']*(contain|cover|width)/;\n\tvar regCssObject = /parent-container[\"']*\\s*:\\s*[\"']*(.+?)(?=(\\s|$|,|'|\"|;))/;\n\tvar regPicture = /^picture$/i;\n\tvar cfg = lazySizes.cfg;\n\n\tvar getCSS = function (elem){\n\t\treturn (getComputedStyle(elem, null) || {});\n\t};\n\n\tvar parentFit = {\n\n\t\tgetParent: function(element, parentSel){\n\t\t\tvar parent = element;\n\t\t\tvar parentNode = element.parentNode;\n\n\t\t\tif((!parentSel || parentSel == 'prev') && parentNode && regPicture.test(parentNode.nodeName || '')){\n\t\t\t\tparentNode = parentNode.parentNode;\n\t\t\t}\n\n\t\t\tif(parentSel != 'self'){\n\t\t\t\tif(parentSel == 'prev'){\n\t\t\t\t\tparent = element.previousElementSibling;\n\t\t\t\t} else if(parentSel && (parentNode.closest || window.jQuery)){\n\t\t\t\t\tparent = (parentNode.closest ?\n\t\t\t\t\t\t\tparentNode.closest(parentSel) :\n\t\t\t\t\t\t\tjQuery(parentNode).closest(parentSel)[0]) ||\n\t\t\t\t\t\tparentNode\n\t\t\t\t\t;\n\t\t\t\t} else {\n\t\t\t\t\tparent = parentNode;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn parent;\n\t\t},\n\n\t\tgetFit: function(element){\n\t\t\tvar tmpMatch, parentObj;\n\t\t\tvar css = getCSS(element);\n\t\t\tvar content = css.content || css.fontFamily;\n\t\t\tvar obj = {\n\t\t\t\tfit: element._lazysizesParentFit || element.getAttribute('data-parent-fit')\n\t\t\t};\n\n\t\t\tif(!obj.fit && content && (tmpMatch = content.match(regCssFit))){\n\t\t\t\tobj.fit = tmpMatch[1];\n\t\t\t}\n\n\t\t\tif(obj.fit){\n\t\t\t\tparentObj = element._lazysizesParentContainer || element.getAttribute('data-parent-container');\n\n\t\t\t\tif(!parentObj && content && (tmpMatch = content.match(regCssObject))){\n\t\t\t\t\tparentObj = tmpMatch[1];\n\t\t\t\t}\n\n\t\t\t\tobj.parent = parentFit.getParent(element, parentObj);\n\n\n\t\t\t} else {\n\t\t\t\tobj.fit = css.objectFit;\n\t\t\t}\n\n\t\t\treturn obj;\n\t\t},\n\n\t\tgetImageRatio: function(element){\n\t\t\tvar i, srcset, media, ratio, match, width, height;\n\t\t\tvar parent = element.parentNode;\n\t\t\tvar elements = parent && regPicture.test(parent.nodeName || '') ?\n\t\t\t\t\tparent.querySelectorAll('source, img') :\n\t\t\t\t\t[element]\n\t\t\t\t;\n\n\t\t\tfor(i = 0; i < elements.length; i++){\n\t\t\t\telement = elements[i];\n\t\t\t\tsrcset = element.getAttribute(cfg.srcsetAttr) || element.getAttribute('srcset') || element.getAttribute('data-pfsrcset') || element.getAttribute('data-risrcset') || '';\n\t\t\t\tmedia = element._lsMedia || element.getAttribute('media');\n\t\t\t\tmedia = cfg.customMedia[element.getAttribute('data-media') || media] || media;\n\n\t\t\t\tif(srcset && (!media || (window.matchMedia && matchMedia(media) || {}).matches )){\n\t\t\t\t\tratio = parseFloat(element.getAttribute('data-aspectratio'));\n\n\t\t\t\t\tif (!ratio) {\n\t\t\t\t\t\tmatch = srcset.match(regDescriptors);\n\n\t\t\t\t\t\tif (match) {\n\t\t\t\t\t\t\tif(match[2] == 'w'){\n\t\t\t\t\t\t\t\twidth = match[1];\n\t\t\t\t\t\t\t\theight = match[3];\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\twidth = match[3];\n\t\t\t\t\t\t\t\theight = match[1];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\twidth = element.getAttribute('width');\n\t\t\t\t\t\t\theight = element.getAttribute('height');\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tratio = width / height;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn ratio;\n\t\t},\n\n\t\tcalculateSize: function(element, width){\n\t\t\tvar displayRatio, height, imageRatio, retWidth;\n\t\t\tvar fitObj = this.getFit(element);\n\t\t\tvar fit = fitObj.fit;\n\t\t\tvar fitElem = fitObj.parent;\n\n\t\t\tif(fit != 'width' && ((fit != 'contain' && fit != 'cover') || !(imageRatio = this.getImageRatio(element)))){\n\t\t\t\treturn width;\n\t\t\t}\n\n\t\t\tif(fitElem){\n\t\t\t\twidth = fitElem.clientWidth;\n\t\t\t} else {\n\t\t\t\tfitElem = element;\n\t\t\t}\n\n\t\t\tretWidth = width;\n\n\t\t\tif(fit == 'width'){\n\t\t\t\tretWidth = width;\n\t\t\t} else {\n\t\t\t\theight = fitElem.clientHeight;\n\n\t\t\t\tif((displayRatio =  width / height) && ((fit == 'cover' && displayRatio < imageRatio) || (fit == 'contain' && displayRatio > imageRatio))){\n\t\t\t\t\tretWidth = width * (imageRatio / displayRatio);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn retWidth;\n\t\t}\n\t};\n\n\tlazySizes.parentFit = parentFit;\n\n\tdocument.addEventListener('lazybeforesizes', function(e){\n\t\tif(e.defaultPrevented || e.detail.instance != lazySizes){return;}\n\n\t\tvar element = e.target;\n\t\te.detail.width = parentFit.calculateSize(element, e.detail.width);\n\t});\n}));\n","\"use strict\";\n\nexports.__esModule = true;\nexports[\"default\"] = void 0;\n\nvar _util = require(\"../util\");\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nvar cloneNode = function cloneNode(obj, parent) {\n  if (typeof obj !== 'object' || obj === null) {\n    return obj;\n  }\n\n  var cloned = new obj.constructor();\n\n  for (var i in obj) {\n    if (!obj.hasOwnProperty(i)) {\n      continue;\n    }\n\n    var value = obj[i];\n    var type = typeof value;\n\n    if (i === 'parent' && type === 'object') {\n      if (parent) {\n        cloned[i] = parent;\n      }\n    } else if (value instanceof Array) {\n      cloned[i] = value.map(function (j) {\n        return cloneNode(j, cloned);\n      });\n    } else {\n      cloned[i] = cloneNode(value, cloned);\n    }\n  }\n\n  return cloned;\n};\n\nvar Node = /*#__PURE__*/function () {\n  function Node(opts) {\n    if (opts === void 0) {\n      opts = {};\n    }\n\n    Object.assign(this, opts);\n    this.spaces = this.spaces || {};\n    this.spaces.before = this.spaces.before || '';\n    this.spaces.after = this.spaces.after || '';\n  }\n\n  var _proto = Node.prototype;\n\n  _proto.remove = function remove() {\n    if (this.parent) {\n      this.parent.removeChild(this);\n    }\n\n    this.parent = undefined;\n    return this;\n  };\n\n  _proto.replaceWith = function replaceWith() {\n    if (this.parent) {\n      for (var index in arguments) {\n        this.parent.insertBefore(this, arguments[index]);\n      }\n\n      this.remove();\n    }\n\n    return this;\n  };\n\n  _proto.next = function next() {\n    return this.parent.at(this.parent.index(this) + 1);\n  };\n\n  _proto.prev = function prev() {\n    return this.parent.at(this.parent.index(this) - 1);\n  };\n\n  _proto.clone = function clone(overrides) {\n    if (overrides === void 0) {\n      overrides = {};\n    }\n\n    var cloned = cloneNode(this);\n\n    for (var name in overrides) {\n      cloned[name] = overrides[name];\n    }\n\n    return cloned;\n  }\n  /**\n   * Some non-standard syntax doesn't follow normal escaping rules for css.\n   * This allows non standard syntax to be appended to an existing property\n   * by specifying the escaped value. By specifying the escaped value,\n   * illegal characters are allowed to be directly inserted into css output.\n   * @param {string} name the property to set\n   * @param {any} value the unescaped value of the property\n   * @param {string} valueEscaped optional. the escaped value of the property.\n   */\n  ;\n\n  _proto.appendToPropertyAndEscape = function appendToPropertyAndEscape(name, value, valueEscaped) {\n    if (!this.raws) {\n      this.raws = {};\n    }\n\n    var originalValue = this[name];\n    var originalEscaped = this.raws[name];\n    this[name] = originalValue + value; // this may trigger a setter that updates raws, so it has to be set first.\n\n    if (originalEscaped || valueEscaped !== value) {\n      this.raws[name] = (originalEscaped || originalValue) + valueEscaped;\n    } else {\n      delete this.raws[name]; // delete any escaped value that was created by the setter.\n    }\n  }\n  /**\n   * Some non-standard syntax doesn't follow normal escaping rules for css.\n   * This allows the escaped value to be specified directly, allowing illegal\n   * characters to be directly inserted into css output.\n   * @param {string} name the property to set\n   * @param {any} value the unescaped value of the property\n   * @param {string} valueEscaped the escaped value of the property.\n   */\n  ;\n\n  _proto.setPropertyAndEscape = function setPropertyAndEscape(name, value, valueEscaped) {\n    if (!this.raws) {\n      this.raws = {};\n    }\n\n    this[name] = value; // this may trigger a setter that updates raws, so it has to be set first.\n\n    this.raws[name] = valueEscaped;\n  }\n  /**\n   * When you want a value to passed through to CSS directly. This method\n   * deletes the corresponding raw value causing the stringifier to fallback\n   * to the unescaped value.\n   * @param {string} name the property to set.\n   * @param {any} value The value that is both escaped and unescaped.\n   */\n  ;\n\n  _proto.setPropertyWithoutEscape = function setPropertyWithoutEscape(name, value) {\n    this[name] = value; // this may trigger a setter that updates raws, so it has to be set first.\n\n    if (this.raws) {\n      delete this.raws[name];\n    }\n  }\n  /**\n   *\n   * @param {number} line The number (starting with 1)\n   * @param {number} column The column number (starting with 1)\n   */\n  ;\n\n  _proto.isAtPosition = function isAtPosition(line, column) {\n    if (this.source && this.source.start && this.source.end) {\n      if (this.source.start.line > line) {\n        return false;\n      }\n\n      if (this.source.end.line < line) {\n        return false;\n      }\n\n      if (this.source.start.line === line && this.source.start.column > column) {\n        return false;\n      }\n\n      if (this.source.end.line === line && this.source.end.column < column) {\n        return false;\n      }\n\n      return true;\n    }\n\n    return undefined;\n  };\n\n  _proto.stringifyProperty = function stringifyProperty(name) {\n    return this.raws && this.raws[name] || this[name];\n  };\n\n  _proto.valueToString = function valueToString() {\n    return String(this.stringifyProperty(\"value\"));\n  };\n\n  _proto.toString = function toString() {\n    return [this.rawSpaceBefore, this.valueToString(), this.rawSpaceAfter].join('');\n  };\n\n  _createClass(Node, [{\n    key: \"rawSpaceBefore\",\n    get: function get() {\n      var rawSpace = this.raws && this.raws.spaces && this.raws.spaces.before;\n\n      if (rawSpace === undefined) {\n        rawSpace = this.spaces && this.spaces.before;\n      }\n\n      return rawSpace || \"\";\n    },\n    set: function set(raw) {\n      (0, _util.ensureObject)(this, \"raws\", \"spaces\");\n      this.raws.spaces.before = raw;\n    }\n  }, {\n    key: \"rawSpaceAfter\",\n    get: function get() {\n      var rawSpace = this.raws && this.raws.spaces && this.raws.spaces.after;\n\n      if (rawSpace === undefined) {\n        rawSpace = this.spaces.after;\n      }\n\n      return rawSpace || \"\";\n    },\n    set: function set(raw) {\n      (0, _util.ensureObject)(this, \"raws\", \"spaces\");\n      this.raws.spaces.after = raw;\n    }\n  }]);\n\n  return Node;\n}();\n\nexports[\"default\"] = Node;\nmodule.exports = exports.default;","'use strict';\nvar bind = require('../internals/function-bind-context');\nvar call = require('../internals/function-call');\nvar anObject = require('../internals/an-object');\nvar tryToString = require('../internals/try-to-string');\nvar isArrayIteratorMethod = require('../internals/is-array-iterator-method');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\nvar isPrototypeOf = require('../internals/object-is-prototype-of');\nvar getIterator = require('../internals/get-iterator');\nvar getIteratorMethod = require('../internals/get-iterator-method');\nvar iteratorClose = require('../internals/iterator-close');\n\nvar $TypeError = TypeError;\n\nvar Result = function (stopped, result) {\n  this.stopped = stopped;\n  this.result = result;\n};\n\nvar ResultPrototype = Result.prototype;\n\nmodule.exports = function (iterable, unboundFunction, options) {\n  var that = options && options.that;\n  var AS_ENTRIES = !!(options && options.AS_ENTRIES);\n  var IS_RECORD = !!(options && options.IS_RECORD);\n  var IS_ITERATOR = !!(options && options.IS_ITERATOR);\n  var INTERRUPTED = !!(options && options.INTERRUPTED);\n  var fn = bind(unboundFunction, that);\n  var iterator, iterFn, index, length, result, next, step;\n\n  var stop = function (condition) {\n    if (iterator) iteratorClose(iterator, 'normal');\n    return new Result(true, condition);\n  };\n\n  var callFn = function (value) {\n    if (AS_ENTRIES) {\n      anObject(value);\n      return INTERRUPTED ? fn(value[0], value[1], stop) : fn(value[0], value[1]);\n    } return INTERRUPTED ? fn(value, stop) : fn(value);\n  };\n\n  if (IS_RECORD) {\n    iterator = iterable.iterator;\n  } else if (IS_ITERATOR) {\n    iterator = iterable;\n  } else {\n    iterFn = getIteratorMethod(iterable);\n    if (!iterFn) throw new $TypeError(tryToString(iterable) + ' is not iterable');\n    // optimisation for array iterators\n    if (isArrayIteratorMethod(iterFn)) {\n      for (index = 0, length = lengthOfArrayLike(iterable); length > index; index++) {\n        result = callFn(iterable[index]);\n        if (result && isPrototypeOf(ResultPrototype, result)) return result;\n      } return new Result(false);\n    }\n    iterator = getIterator(iterable, iterFn);\n  }\n\n  next = IS_RECORD ? iterable.next : iterator.next;\n  while (!(step = call(next, iterator)).done) {\n    try {\n      result = callFn(step.value);\n    } catch (error) {\n      iteratorClose(iterator, 'throw', error);\n    }\n    if (typeof result == 'object' && result && isPrototypeOf(ResultPrototype, result)) return result;\n  } return new Result(false);\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nObject.defineProperty(exports, \"default\", {\n    enumerable: true,\n    get: function() {\n        return _default;\n    }\n});\nconst _createPlugin = /*#__PURE__*/ _interop_require_default(require(\"../util/createPlugin\"));\nfunction _interop_require_default(obj) {\n    return obj && obj.__esModule ? obj : {\n        default: obj\n    };\n}\nconst _default = _createPlugin.default;\n","'use strict';\n// TODO: Remove this module from `core-js@4` since it's split to modules listed below\nrequire('../modules/es.symbol.constructor');\nrequire('../modules/es.symbol.for');\nrequire('../modules/es.symbol.key-for');\nrequire('../modules/es.json.stringify');\nrequire('../modules/es.object.get-own-property-symbols');\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar fails = require('../internals/fails');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar toString = require('../internals/to-string');\nvar trim = require('../internals/string-trim').trim;\nvar whitespaces = require('../internals/whitespaces');\n\nvar $parseInt = globalThis.parseInt;\nvar Symbol = globalThis.Symbol;\nvar ITERATOR = Symbol && Symbol.iterator;\nvar hex = /^[+-]?0x/i;\nvar exec = uncurryThis(hex.exec);\nvar FORCED = $parseInt(whitespaces + '08') !== 8 || $parseInt(whitespaces + '0x16') !== 22\n  // MS Edge 18- broken with boxed symbols\n  || (ITERATOR && !fails(function () { $parseInt(Object(ITERATOR)); }));\n\n// `parseInt` method\n// https://tc39.es/ecma262/#sec-parseint-string-radix\nmodule.exports = FORCED ? function parseInt(string, radix) {\n  var S = trim(toString(string));\n  return $parseInt(S, (radix >>> 0) || (exec(hex, S) ? 16 : 10));\n} : $parseInt;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nfunction _export(target, all) {\n    for(var name in all)Object.defineProperty(target, name, {\n        enumerable: true,\n        get: all[name]\n    });\n}\n_export(exports, {\n    dim: function() {\n        return dim;\n    },\n    default: function() {\n        return _default;\n    }\n});\nconst _picocolors = /*#__PURE__*/ _interop_require_default(require(\"picocolors\"));\nfunction _interop_require_default(obj) {\n    return obj && obj.__esModule ? obj : {\n        default: obj\n    };\n}\nlet alreadyShown = new Set();\nfunction log(type, messages, key) {\n    if (typeof process !== \"undefined\" && process.env.JEST_WORKER_ID) return;\n    if (key && alreadyShown.has(key)) return;\n    if (key) alreadyShown.add(key);\n    console.warn(\"\");\n    messages.forEach((message)=>console.warn(type, \"-\", message));\n}\nfunction dim(input) {\n    return _picocolors.default.dim(input);\n}\nconst _default = {\n    info (key, messages) {\n        log(_picocolors.default.bold(_picocolors.default.cyan(\"info\")), ...Array.isArray(key) ? [\n            key\n        ] : [\n            messages,\n            key\n        ]);\n    },\n    warn (key, messages) {\n        log(_picocolors.default.bold(_picocolors.default.yellow(\"warn\")), ...Array.isArray(key) ? [\n            key\n        ] : [\n            messages,\n            key\n        ]);\n    },\n    risk (key, messages) {\n        log(_picocolors.default.bold(_picocolors.default.magenta(\"risk\")), ...Array.isArray(key) ? [\n            key\n        ] : [\n            messages,\n            key\n        ]);\n    }\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar $reduce = require('../internals/array-reduce').left;\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\nvar CHROME_VERSION = require('../internals/environment-v8-version');\nvar IS_NODE = require('../internals/environment-is-node');\n\n// Chrome 80-82 has a critical bug\n// https://bugs.chromium.org/p/chromium/issues/detail?id=1049982\nvar CHROME_BUG = !IS_NODE && CHROME_VERSION > 79 && CHROME_VERSION < 83;\nvar FORCED = CHROME_BUG || !arrayMethodIsStrict('reduce');\n\n// `Array.prototype.reduce` method\n// https://tc39.es/ecma262/#sec-array.prototype.reduce\n$({ target: 'Array', proto: true, forced: FORCED }, {\n  reduce: function reduce(callbackfn /* , initialValue */) {\n    var length = arguments.length;\n    return $reduce(this, callbackfn, length, length > 1 ? arguments[1] : undefined);\n  }\n});\n","'use strict';\nvar fails = require('../internals/fails');\n\nmodule.exports = !fails(function () {\n  // eslint-disable-next-line es/no-object-isextensible, es/no-object-preventextensions -- required for testing\n  return Object.isExtensible(Object.preventExtensions({}));\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar $trim = require('../internals/string-trim').trim;\nvar forcedStringTrimMethod = require('../internals/string-trim-forced');\n\n// `String.prototype.trim` method\n// https://tc39.es/ecma262/#sec-string.prototype.trim\n$({ target: 'String', proto: true, forced: forcedStringTrimMethod('trim') }, {\n  trim: function trim() {\n    return $trim(this);\n  }\n});\n","'use strict';\nvar call = require('../internals/function-call');\nvar isObject = require('../internals/is-object');\nvar isSymbol = require('../internals/is-symbol');\nvar getMethod = require('../internals/get-method');\nvar ordinaryToPrimitive = require('../internals/ordinary-to-primitive');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar $TypeError = TypeError;\nvar TO_PRIMITIVE = wellKnownSymbol('toPrimitive');\n\n// `ToPrimitive` abstract operation\n// https://tc39.es/ecma262/#sec-toprimitive\nmodule.exports = function (input, pref) {\n  if (!isObject(input) || isSymbol(input)) return input;\n  var exoticToPrim = getMethod(input, TO_PRIMITIVE);\n  var result;\n  if (exoticToPrim) {\n    if (pref === undefined) pref = 'default';\n    result = call(exoticToPrim, input, pref);\n    if (!isObject(result) || isSymbol(result)) return result;\n    throw new $TypeError(\"Can't convert object to primitive value\");\n  }\n  if (pref === undefined) pref = 'number';\n  return ordinaryToPrimitive(input, pref);\n};\n","'use strict';\nvar hasOwn = require('../internals/has-own-property');\nvar isCallable = require('../internals/is-callable');\nvar toObject = require('../internals/to-object');\nvar sharedKey = require('../internals/shared-key');\nvar CORRECT_PROTOTYPE_GETTER = require('../internals/correct-prototype-getter');\n\nvar IE_PROTO = sharedKey('IE_PROTO');\nvar $Object = Object;\nvar ObjectPrototype = $Object.prototype;\n\n// `Object.getPrototypeOf` method\n// https://tc39.es/ecma262/#sec-object.getprototypeof\n// eslint-disable-next-line es/no-object-getprototypeof -- safe\nmodule.exports = CORRECT_PROTOTYPE_GETTER ? $Object.getPrototypeOf : function (O) {\n  var object = toObject(O);\n  if (hasOwn(object, IE_PROTO)) return object[IE_PROTO];\n  var constructor = object.constructor;\n  if (isCallable(constructor) && object instanceof constructor) {\n    return constructor.prototype;\n  } return object instanceof $Object ? ObjectPrototype : null;\n};\n","'use strict';\nvar fails = require('../internals/fails');\nvar isCallable = require('../internals/is-callable');\n\nvar replacement = /#|\\.prototype\\./;\n\nvar isForced = function (feature, detection) {\n  var value = data[normalize(feature)];\n  return value === POLYFILL ? true\n    : value === NATIVE ? false\n    : isCallable(detection) ? fails(detection)\n    : !!detection;\n};\n\nvar normalize = isForced.normalize = function (string) {\n  return String(string).replace(replacement, '.').toLowerCase();\n};\n\nvar data = isForced.data = {};\nvar NATIVE = isForced.NATIVE = 'N';\nvar POLYFILL = isForced.POLYFILL = 'P';\n\nmodule.exports = isForced;\n","'use strict';\nvar $TypeError = TypeError;\n\nmodule.exports = function (passed, required) {\n  if (passed < required) throw new $TypeError('Not enough arguments');\n  return passed;\n};\n","\"use strict\";\n\nexports.__esModule = true;\nexports[\"default\"] = void 0;\n\nvar _root = _interopRequireDefault(require(\"./selectors/root\"));\n\nvar _selector = _interopRequireDefault(require(\"./selectors/selector\"));\n\nvar _className = _interopRequireDefault(require(\"./selectors/className\"));\n\nvar _comment = _interopRequireDefault(require(\"./selectors/comment\"));\n\nvar _id = _interopRequireDefault(require(\"./selectors/id\"));\n\nvar _tag = _interopRequireDefault(require(\"./selectors/tag\"));\n\nvar _string = _interopRequireDefault(require(\"./selectors/string\"));\n\nvar _pseudo = _interopRequireDefault(require(\"./selectors/pseudo\"));\n\nvar _attribute = _interopRequireWildcard(require(\"./selectors/attribute\"));\n\nvar _universal = _interopRequireDefault(require(\"./selectors/universal\"));\n\nvar _combinator = _interopRequireDefault(require(\"./selectors/combinator\"));\n\nvar _nesting = _interopRequireDefault(require(\"./selectors/nesting\"));\n\nvar _sortAscending = _interopRequireDefault(require(\"./sortAscending\"));\n\nvar _tokenize = _interopRequireWildcard(require(\"./tokenize\"));\n\nvar tokens = _interopRequireWildcard(require(\"./tokenTypes\"));\n\nvar types = _interopRequireWildcard(require(\"./selectors/types\"));\n\nvar _util = require(\"./util\");\n\nvar _WHITESPACE_TOKENS, _Object$assign;\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { \"default\": obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj[\"default\"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nvar WHITESPACE_TOKENS = (_WHITESPACE_TOKENS = {}, _WHITESPACE_TOKENS[tokens.space] = true, _WHITESPACE_TOKENS[tokens.cr] = true, _WHITESPACE_TOKENS[tokens.feed] = true, _WHITESPACE_TOKENS[tokens.newline] = true, _WHITESPACE_TOKENS[tokens.tab] = true, _WHITESPACE_TOKENS);\nvar WHITESPACE_EQUIV_TOKENS = Object.assign({}, WHITESPACE_TOKENS, (_Object$assign = {}, _Object$assign[tokens.comment] = true, _Object$assign));\n\nfunction tokenStart(token) {\n  return {\n    line: token[_tokenize.FIELDS.START_LINE],\n    column: token[_tokenize.FIELDS.START_COL]\n  };\n}\n\nfunction tokenEnd(token) {\n  return {\n    line: token[_tokenize.FIELDS.END_LINE],\n    column: token[_tokenize.FIELDS.END_COL]\n  };\n}\n\nfunction getSource(startLine, startColumn, endLine, endColumn) {\n  return {\n    start: {\n      line: startLine,\n      column: startColumn\n    },\n    end: {\n      line: endLine,\n      column: endColumn\n    }\n  };\n}\n\nfunction getTokenSource(token) {\n  return getSource(token[_tokenize.FIELDS.START_LINE], token[_tokenize.FIELDS.START_COL], token[_tokenize.FIELDS.END_LINE], token[_tokenize.FIELDS.END_COL]);\n}\n\nfunction getTokenSourceSpan(startToken, endToken) {\n  if (!startToken) {\n    return undefined;\n  }\n\n  return getSource(startToken[_tokenize.FIELDS.START_LINE], startToken[_tokenize.FIELDS.START_COL], endToken[_tokenize.FIELDS.END_LINE], endToken[_tokenize.FIELDS.END_COL]);\n}\n\nfunction unescapeProp(node, prop) {\n  var value = node[prop];\n\n  if (typeof value !== \"string\") {\n    return;\n  }\n\n  if (value.indexOf(\"\\\\\") !== -1) {\n    (0, _util.ensureObject)(node, 'raws');\n    node[prop] = (0, _util.unesc)(value);\n\n    if (node.raws[prop] === undefined) {\n      node.raws[prop] = value;\n    }\n  }\n\n  return node;\n}\n\nfunction indexesOf(array, item) {\n  var i = -1;\n  var indexes = [];\n\n  while ((i = array.indexOf(item, i + 1)) !== -1) {\n    indexes.push(i);\n  }\n\n  return indexes;\n}\n\nfunction uniqs() {\n  var list = Array.prototype.concat.apply([], arguments);\n  return list.filter(function (item, i) {\n    return i === list.indexOf(item);\n  });\n}\n\nvar Parser = /*#__PURE__*/function () {\n  function Parser(rule, options) {\n    if (options === void 0) {\n      options = {};\n    }\n\n    this.rule = rule;\n    this.options = Object.assign({\n      lossy: false,\n      safe: false\n    }, options);\n    this.position = 0;\n    this.css = typeof this.rule === 'string' ? this.rule : this.rule.selector;\n    this.tokens = (0, _tokenize[\"default\"])({\n      css: this.css,\n      error: this._errorGenerator(),\n      safe: this.options.safe\n    });\n    var rootSource = getTokenSourceSpan(this.tokens[0], this.tokens[this.tokens.length - 1]);\n    this.root = new _root[\"default\"]({\n      source: rootSource\n    });\n    this.root.errorGenerator = this._errorGenerator();\n    var selector = new _selector[\"default\"]({\n      source: {\n        start: {\n          line: 1,\n          column: 1\n        }\n      }\n    });\n    this.root.append(selector);\n    this.current = selector;\n    this.loop();\n  }\n\n  var _proto = Parser.prototype;\n\n  _proto._errorGenerator = function _errorGenerator() {\n    var _this = this;\n\n    return function (message, errorOptions) {\n      if (typeof _this.rule === 'string') {\n        return new Error(message);\n      }\n\n      return _this.rule.error(message, errorOptions);\n    };\n  };\n\n  _proto.attribute = function attribute() {\n    var attr = [];\n    var startingToken = this.currToken;\n    this.position++;\n\n    while (this.position < this.tokens.length && this.currToken[_tokenize.FIELDS.TYPE] !== tokens.closeSquare) {\n      attr.push(this.currToken);\n      this.position++;\n    }\n\n    if (this.currToken[_tokenize.FIELDS.TYPE] !== tokens.closeSquare) {\n      return this.expected('closing square bracket', this.currToken[_tokenize.FIELDS.START_POS]);\n    }\n\n    var len = attr.length;\n    var node = {\n      source: getSource(startingToken[1], startingToken[2], this.currToken[3], this.currToken[4]),\n      sourceIndex: startingToken[_tokenize.FIELDS.START_POS]\n    };\n\n    if (len === 1 && !~[tokens.word].indexOf(attr[0][_tokenize.FIELDS.TYPE])) {\n      return this.expected('attribute', attr[0][_tokenize.FIELDS.START_POS]);\n    }\n\n    var pos = 0;\n    var spaceBefore = '';\n    var commentBefore = '';\n    var lastAdded = null;\n    var spaceAfterMeaningfulToken = false;\n\n    while (pos < len) {\n      var token = attr[pos];\n      var content = this.content(token);\n      var next = attr[pos + 1];\n\n      switch (token[_tokenize.FIELDS.TYPE]) {\n        case tokens.space:\n          // if (\n          //     len === 1 ||\n          //     pos === 0 && this.content(next) === '|'\n          // ) {\n          //     return this.expected('attribute', token[TOKEN.START_POS], content);\n          // }\n          spaceAfterMeaningfulToken = true;\n\n          if (this.options.lossy) {\n            break;\n          }\n\n          if (lastAdded) {\n            (0, _util.ensureObject)(node, 'spaces', lastAdded);\n            var prevContent = node.spaces[lastAdded].after || '';\n            node.spaces[lastAdded].after = prevContent + content;\n            var existingComment = (0, _util.getProp)(node, 'raws', 'spaces', lastAdded, 'after') || null;\n\n            if (existingComment) {\n              node.raws.spaces[lastAdded].after = existingComment + content;\n            }\n          } else {\n            spaceBefore = spaceBefore + content;\n            commentBefore = commentBefore + content;\n          }\n\n          break;\n\n        case tokens.asterisk:\n          if (next[_tokenize.FIELDS.TYPE] === tokens.equals) {\n            node.operator = content;\n            lastAdded = 'operator';\n          } else if ((!node.namespace || lastAdded === \"namespace\" && !spaceAfterMeaningfulToken) && next) {\n            if (spaceBefore) {\n              (0, _util.ensureObject)(node, 'spaces', 'attribute');\n              node.spaces.attribute.before = spaceBefore;\n              spaceBefore = '';\n            }\n\n            if (commentBefore) {\n              (0, _util.ensureObject)(node, 'raws', 'spaces', 'attribute');\n              node.raws.spaces.attribute.before = spaceBefore;\n              commentBefore = '';\n            }\n\n            node.namespace = (node.namespace || \"\") + content;\n            var rawValue = (0, _util.getProp)(node, 'raws', 'namespace') || null;\n\n            if (rawValue) {\n              node.raws.namespace += content;\n            }\n\n            lastAdded = 'namespace';\n          }\n\n          spaceAfterMeaningfulToken = false;\n          break;\n\n        case tokens.dollar:\n          if (lastAdded === \"value\") {\n            var oldRawValue = (0, _util.getProp)(node, 'raws', 'value');\n            node.value += \"$\";\n\n            if (oldRawValue) {\n              node.raws.value = oldRawValue + \"$\";\n            }\n\n            break;\n          }\n\n        // Falls through\n\n        case tokens.caret:\n          if (next[_tokenize.FIELDS.TYPE] === tokens.equals) {\n            node.operator = content;\n            lastAdded = 'operator';\n          }\n\n          spaceAfterMeaningfulToken = false;\n          break;\n\n        case tokens.combinator:\n          if (content === '~' && next[_tokenize.FIELDS.TYPE] === tokens.equals) {\n            node.operator = content;\n            lastAdded = 'operator';\n          }\n\n          if (content !== '|') {\n            spaceAfterMeaningfulToken = false;\n            break;\n          }\n\n          if (next[_tokenize.FIELDS.TYPE] === tokens.equals) {\n            node.operator = content;\n            lastAdded = 'operator';\n          } else if (!node.namespace && !node.attribute) {\n            node.namespace = true;\n          }\n\n          spaceAfterMeaningfulToken = false;\n          break;\n\n        case tokens.word:\n          if (next && this.content(next) === '|' && attr[pos + 2] && attr[pos + 2][_tokenize.FIELDS.TYPE] !== tokens.equals && // this look-ahead probably fails with comment nodes involved.\n          !node.operator && !node.namespace) {\n            node.namespace = content;\n            lastAdded = 'namespace';\n          } else if (!node.attribute || lastAdded === \"attribute\" && !spaceAfterMeaningfulToken) {\n            if (spaceBefore) {\n              (0, _util.ensureObject)(node, 'spaces', 'attribute');\n              node.spaces.attribute.before = spaceBefore;\n              spaceBefore = '';\n            }\n\n            if (commentBefore) {\n              (0, _util.ensureObject)(node, 'raws', 'spaces', 'attribute');\n              node.raws.spaces.attribute.before = commentBefore;\n              commentBefore = '';\n            }\n\n            node.attribute = (node.attribute || \"\") + content;\n\n            var _rawValue = (0, _util.getProp)(node, 'raws', 'attribute') || null;\n\n            if (_rawValue) {\n              node.raws.attribute += content;\n            }\n\n            lastAdded = 'attribute';\n          } else if (!node.value && node.value !== \"\" || lastAdded === \"value\" && !spaceAfterMeaningfulToken) {\n            var _unescaped = (0, _util.unesc)(content);\n\n            var _oldRawValue = (0, _util.getProp)(node, 'raws', 'value') || '';\n\n            var oldValue = node.value || '';\n            node.value = oldValue + _unescaped;\n            node.quoteMark = null;\n\n            if (_unescaped !== content || _oldRawValue) {\n              (0, _util.ensureObject)(node, 'raws');\n              node.raws.value = (_oldRawValue || oldValue) + content;\n            }\n\n            lastAdded = 'value';\n          } else {\n            var insensitive = content === 'i' || content === \"I\";\n\n            if ((node.value || node.value === '') && (node.quoteMark || spaceAfterMeaningfulToken)) {\n              node.insensitive = insensitive;\n\n              if (!insensitive || content === \"I\") {\n                (0, _util.ensureObject)(node, 'raws');\n                node.raws.insensitiveFlag = content;\n              }\n\n              lastAdded = 'insensitive';\n\n              if (spaceBefore) {\n                (0, _util.ensureObject)(node, 'spaces', 'insensitive');\n                node.spaces.insensitive.before = spaceBefore;\n                spaceBefore = '';\n              }\n\n              if (commentBefore) {\n                (0, _util.ensureObject)(node, 'raws', 'spaces', 'insensitive');\n                node.raws.spaces.insensitive.before = commentBefore;\n                commentBefore = '';\n              }\n            } else if (node.value || node.value === '') {\n              lastAdded = 'value';\n              node.value += content;\n\n              if (node.raws.value) {\n                node.raws.value += content;\n              }\n            }\n          }\n\n          spaceAfterMeaningfulToken = false;\n          break;\n\n        case tokens.str:\n          if (!node.attribute || !node.operator) {\n            return this.error(\"Expected an attribute followed by an operator preceding the string.\", {\n              index: token[_tokenize.FIELDS.START_POS]\n            });\n          }\n\n          var _unescapeValue = (0, _attribute.unescapeValue)(content),\n              unescaped = _unescapeValue.unescaped,\n              quoteMark = _unescapeValue.quoteMark;\n\n          node.value = unescaped;\n          node.quoteMark = quoteMark;\n          lastAdded = 'value';\n          (0, _util.ensureObject)(node, 'raws');\n          node.raws.value = content;\n          spaceAfterMeaningfulToken = false;\n          break;\n\n        case tokens.equals:\n          if (!node.attribute) {\n            return this.expected('attribute', token[_tokenize.FIELDS.START_POS], content);\n          }\n\n          if (node.value) {\n            return this.error('Unexpected \"=\" found; an operator was already defined.', {\n              index: token[_tokenize.FIELDS.START_POS]\n            });\n          }\n\n          node.operator = node.operator ? node.operator + content : content;\n          lastAdded = 'operator';\n          spaceAfterMeaningfulToken = false;\n          break;\n\n        case tokens.comment:\n          if (lastAdded) {\n            if (spaceAfterMeaningfulToken || next && next[_tokenize.FIELDS.TYPE] === tokens.space || lastAdded === 'insensitive') {\n              var lastComment = (0, _util.getProp)(node, 'spaces', lastAdded, 'after') || '';\n              var rawLastComment = (0, _util.getProp)(node, 'raws', 'spaces', lastAdded, 'after') || lastComment;\n              (0, _util.ensureObject)(node, 'raws', 'spaces', lastAdded);\n              node.raws.spaces[lastAdded].after = rawLastComment + content;\n            } else {\n              var lastValue = node[lastAdded] || '';\n              var rawLastValue = (0, _util.getProp)(node, 'raws', lastAdded) || lastValue;\n              (0, _util.ensureObject)(node, 'raws');\n              node.raws[lastAdded] = rawLastValue + content;\n            }\n          } else {\n            commentBefore = commentBefore + content;\n          }\n\n          break;\n\n        default:\n          return this.error(\"Unexpected \\\"\" + content + \"\\\" found.\", {\n            index: token[_tokenize.FIELDS.START_POS]\n          });\n      }\n\n      pos++;\n    }\n\n    unescapeProp(node, \"attribute\");\n    unescapeProp(node, \"namespace\");\n    this.newNode(new _attribute[\"default\"](node));\n    this.position++;\n  }\n  /**\n   * return a node containing meaningless garbage up to (but not including) the specified token position.\n   * if the token position is negative, all remaining tokens are consumed.\n   *\n   * This returns an array containing a single string node if all whitespace,\n   * otherwise an array of comment nodes with space before and after.\n   *\n   * These tokens are not added to the current selector, the caller can add them or use them to amend\n   * a previous node's space metadata.\n   *\n   * In lossy mode, this returns only comments.\n   */\n  ;\n\n  _proto.parseWhitespaceEquivalentTokens = function parseWhitespaceEquivalentTokens(stopPosition) {\n    if (stopPosition < 0) {\n      stopPosition = this.tokens.length;\n    }\n\n    var startPosition = this.position;\n    var nodes = [];\n    var space = \"\";\n    var lastComment = undefined;\n\n    do {\n      if (WHITESPACE_TOKENS[this.currToken[_tokenize.FIELDS.TYPE]]) {\n        if (!this.options.lossy) {\n          space += this.content();\n        }\n      } else if (this.currToken[_tokenize.FIELDS.TYPE] === tokens.comment) {\n        var spaces = {};\n\n        if (space) {\n          spaces.before = space;\n          space = \"\";\n        }\n\n        lastComment = new _comment[\"default\"]({\n          value: this.content(),\n          source: getTokenSource(this.currToken),\n          sourceIndex: this.currToken[_tokenize.FIELDS.START_POS],\n          spaces: spaces\n        });\n        nodes.push(lastComment);\n      }\n    } while (++this.position < stopPosition);\n\n    if (space) {\n      if (lastComment) {\n        lastComment.spaces.after = space;\n      } else if (!this.options.lossy) {\n        var firstToken = this.tokens[startPosition];\n        var lastToken = this.tokens[this.position - 1];\n        nodes.push(new _string[\"default\"]({\n          value: '',\n          source: getSource(firstToken[_tokenize.FIELDS.START_LINE], firstToken[_tokenize.FIELDS.START_COL], lastToken[_tokenize.FIELDS.END_LINE], lastToken[_tokenize.FIELDS.END_COL]),\n          sourceIndex: firstToken[_tokenize.FIELDS.START_POS],\n          spaces: {\n            before: space,\n            after: ''\n          }\n        }));\n      }\n    }\n\n    return nodes;\n  }\n  /**\n   * \n   * @param {*} nodes \n   */\n  ;\n\n  _proto.convertWhitespaceNodesToSpace = function convertWhitespaceNodesToSpace(nodes, requiredSpace) {\n    var _this2 = this;\n\n    if (requiredSpace === void 0) {\n      requiredSpace = false;\n    }\n\n    var space = \"\";\n    var rawSpace = \"\";\n    nodes.forEach(function (n) {\n      var spaceBefore = _this2.lossySpace(n.spaces.before, requiredSpace);\n\n      var rawSpaceBefore = _this2.lossySpace(n.rawSpaceBefore, requiredSpace);\n\n      space += spaceBefore + _this2.lossySpace(n.spaces.after, requiredSpace && spaceBefore.length === 0);\n      rawSpace += spaceBefore + n.value + _this2.lossySpace(n.rawSpaceAfter, requiredSpace && rawSpaceBefore.length === 0);\n    });\n\n    if (rawSpace === space) {\n      rawSpace = undefined;\n    }\n\n    var result = {\n      space: space,\n      rawSpace: rawSpace\n    };\n    return result;\n  };\n\n  _proto.isNamedCombinator = function isNamedCombinator(position) {\n    if (position === void 0) {\n      position = this.position;\n    }\n\n    return this.tokens[position + 0] && this.tokens[position + 0][_tokenize.FIELDS.TYPE] === tokens.slash && this.tokens[position + 1] && this.tokens[position + 1][_tokenize.FIELDS.TYPE] === tokens.word && this.tokens[position + 2] && this.tokens[position + 2][_tokenize.FIELDS.TYPE] === tokens.slash;\n  };\n\n  _proto.namedCombinator = function namedCombinator() {\n    if (this.isNamedCombinator()) {\n      var nameRaw = this.content(this.tokens[this.position + 1]);\n      var name = (0, _util.unesc)(nameRaw).toLowerCase();\n      var raws = {};\n\n      if (name !== nameRaw) {\n        raws.value = \"/\" + nameRaw + \"/\";\n      }\n\n      var node = new _combinator[\"default\"]({\n        value: \"/\" + name + \"/\",\n        source: getSource(this.currToken[_tokenize.FIELDS.START_LINE], this.currToken[_tokenize.FIELDS.START_COL], this.tokens[this.position + 2][_tokenize.FIELDS.END_LINE], this.tokens[this.position + 2][_tokenize.FIELDS.END_COL]),\n        sourceIndex: this.currToken[_tokenize.FIELDS.START_POS],\n        raws: raws\n      });\n      this.position = this.position + 3;\n      return node;\n    } else {\n      this.unexpected();\n    }\n  };\n\n  _proto.combinator = function combinator() {\n    var _this3 = this;\n\n    if (this.content() === '|') {\n      return this.namespace();\n    } // We need to decide between a space that's a descendant combinator and meaningless whitespace at the end of a selector.\n\n\n    var nextSigTokenPos = this.locateNextMeaningfulToken(this.position);\n\n    if (nextSigTokenPos < 0 || this.tokens[nextSigTokenPos][_tokenize.FIELDS.TYPE] === tokens.comma) {\n      var nodes = this.parseWhitespaceEquivalentTokens(nextSigTokenPos);\n\n      if (nodes.length > 0) {\n        var last = this.current.last;\n\n        if (last) {\n          var _this$convertWhitespa = this.convertWhitespaceNodesToSpace(nodes),\n              space = _this$convertWhitespa.space,\n              rawSpace = _this$convertWhitespa.rawSpace;\n\n          if (rawSpace !== undefined) {\n            last.rawSpaceAfter += rawSpace;\n          }\n\n          last.spaces.after += space;\n        } else {\n          nodes.forEach(function (n) {\n            return _this3.newNode(n);\n          });\n        }\n      }\n\n      return;\n    }\n\n    var firstToken = this.currToken;\n    var spaceOrDescendantSelectorNodes = undefined;\n\n    if (nextSigTokenPos > this.position) {\n      spaceOrDescendantSelectorNodes = this.parseWhitespaceEquivalentTokens(nextSigTokenPos);\n    }\n\n    var node;\n\n    if (this.isNamedCombinator()) {\n      node = this.namedCombinator();\n    } else if (this.currToken[_tokenize.FIELDS.TYPE] === tokens.combinator) {\n      node = new _combinator[\"default\"]({\n        value: this.content(),\n        source: getTokenSource(this.currToken),\n        sourceIndex: this.currToken[_tokenize.FIELDS.START_POS]\n      });\n      this.position++;\n    } else if (WHITESPACE_TOKENS[this.currToken[_tokenize.FIELDS.TYPE]]) {// pass\n    } else if (!spaceOrDescendantSelectorNodes) {\n      this.unexpected();\n    }\n\n    if (node) {\n      if (spaceOrDescendantSelectorNodes) {\n        var _this$convertWhitespa2 = this.convertWhitespaceNodesToSpace(spaceOrDescendantSelectorNodes),\n            _space = _this$convertWhitespa2.space,\n            _rawSpace = _this$convertWhitespa2.rawSpace;\n\n        node.spaces.before = _space;\n        node.rawSpaceBefore = _rawSpace;\n      }\n    } else {\n      // descendant combinator\n      var _this$convertWhitespa3 = this.convertWhitespaceNodesToSpace(spaceOrDescendantSelectorNodes, true),\n          _space2 = _this$convertWhitespa3.space,\n          _rawSpace2 = _this$convertWhitespa3.rawSpace;\n\n      if (!_rawSpace2) {\n        _rawSpace2 = _space2;\n      }\n\n      var spaces = {};\n      var raws = {\n        spaces: {}\n      };\n\n      if (_space2.endsWith(' ') && _rawSpace2.endsWith(' ')) {\n        spaces.before = _space2.slice(0, _space2.length - 1);\n        raws.spaces.before = _rawSpace2.slice(0, _rawSpace2.length - 1);\n      } else if (_space2.startsWith(' ') && _rawSpace2.startsWith(' ')) {\n        spaces.after = _space2.slice(1);\n        raws.spaces.after = _rawSpace2.slice(1);\n      } else {\n        raws.value = _rawSpace2;\n      }\n\n      node = new _combinator[\"default\"]({\n        value: ' ',\n        source: getTokenSourceSpan(firstToken, this.tokens[this.position - 1]),\n        sourceIndex: firstToken[_tokenize.FIELDS.START_POS],\n        spaces: spaces,\n        raws: raws\n      });\n    }\n\n    if (this.currToken && this.currToken[_tokenize.FIELDS.TYPE] === tokens.space) {\n      node.spaces.after = this.optionalSpace(this.content());\n      this.position++;\n    }\n\n    return this.newNode(node);\n  };\n\n  _proto.comma = function comma() {\n    if (this.position === this.tokens.length - 1) {\n      this.root.trailingComma = true;\n      this.position++;\n      return;\n    }\n\n    this.current._inferEndPosition();\n\n    var selector = new _selector[\"default\"]({\n      source: {\n        start: tokenStart(this.tokens[this.position + 1])\n      }\n    });\n    this.current.parent.append(selector);\n    this.current = selector;\n    this.position++;\n  };\n\n  _proto.comment = function comment() {\n    var current = this.currToken;\n    this.newNode(new _comment[\"default\"]({\n      value: this.content(),\n      source: getTokenSource(current),\n      sourceIndex: current[_tokenize.FIELDS.START_POS]\n    }));\n    this.position++;\n  };\n\n  _proto.error = function error(message, opts) {\n    throw this.root.error(message, opts);\n  };\n\n  _proto.missingBackslash = function missingBackslash() {\n    return this.error('Expected a backslash preceding the semicolon.', {\n      index: this.currToken[_tokenize.FIELDS.START_POS]\n    });\n  };\n\n  _proto.missingParenthesis = function missingParenthesis() {\n    return this.expected('opening parenthesis', this.currToken[_tokenize.FIELDS.START_POS]);\n  };\n\n  _proto.missingSquareBracket = function missingSquareBracket() {\n    return this.expected('opening square bracket', this.currToken[_tokenize.FIELDS.START_POS]);\n  };\n\n  _proto.unexpected = function unexpected() {\n    return this.error(\"Unexpected '\" + this.content() + \"'. Escaping special characters with \\\\ may help.\", this.currToken[_tokenize.FIELDS.START_POS]);\n  };\n\n  _proto.namespace = function namespace() {\n    var before = this.prevToken && this.content(this.prevToken) || true;\n\n    if (this.nextToken[_tokenize.FIELDS.TYPE] === tokens.word) {\n      this.position++;\n      return this.word(before);\n    } else if (this.nextToken[_tokenize.FIELDS.TYPE] === tokens.asterisk) {\n      this.position++;\n      return this.universal(before);\n    }\n  };\n\n  _proto.nesting = function nesting() {\n    if (this.nextToken) {\n      var nextContent = this.content(this.nextToken);\n\n      if (nextContent === \"|\") {\n        this.position++;\n        return;\n      }\n    }\n\n    var current = this.currToken;\n    this.newNode(new _nesting[\"default\"]({\n      value: this.content(),\n      source: getTokenSource(current),\n      sourceIndex: current[_tokenize.FIELDS.START_POS]\n    }));\n    this.position++;\n  };\n\n  _proto.parentheses = function parentheses() {\n    var last = this.current.last;\n    var unbalanced = 1;\n    this.position++;\n\n    if (last && last.type === types.PSEUDO) {\n      var selector = new _selector[\"default\"]({\n        source: {\n          start: tokenStart(this.tokens[this.position - 1])\n        }\n      });\n      var cache = this.current;\n      last.append(selector);\n      this.current = selector;\n\n      while (this.position < this.tokens.length && unbalanced) {\n        if (this.currToken[_tokenize.FIELDS.TYPE] === tokens.openParenthesis) {\n          unbalanced++;\n        }\n\n        if (this.currToken[_tokenize.FIELDS.TYPE] === tokens.closeParenthesis) {\n          unbalanced--;\n        }\n\n        if (unbalanced) {\n          this.parse();\n        } else {\n          this.current.source.end = tokenEnd(this.currToken);\n          this.current.parent.source.end = tokenEnd(this.currToken);\n          this.position++;\n        }\n      }\n\n      this.current = cache;\n    } else {\n      // I think this case should be an error. It's used to implement a basic parse of media queries\n      // but I don't think it's a good idea.\n      var parenStart = this.currToken;\n      var parenValue = \"(\";\n      var parenEnd;\n\n      while (this.position < this.tokens.length && unbalanced) {\n        if (this.currToken[_tokenize.FIELDS.TYPE] === tokens.openParenthesis) {\n          unbalanced++;\n        }\n\n        if (this.currToken[_tokenize.FIELDS.TYPE] === tokens.closeParenthesis) {\n          unbalanced--;\n        }\n\n        parenEnd = this.currToken;\n        parenValue += this.parseParenthesisToken(this.currToken);\n        this.position++;\n      }\n\n      if (last) {\n        last.appendToPropertyAndEscape(\"value\", parenValue, parenValue);\n      } else {\n        this.newNode(new _string[\"default\"]({\n          value: parenValue,\n          source: getSource(parenStart[_tokenize.FIELDS.START_LINE], parenStart[_tokenize.FIELDS.START_COL], parenEnd[_tokenize.FIELDS.END_LINE], parenEnd[_tokenize.FIELDS.END_COL]),\n          sourceIndex: parenStart[_tokenize.FIELDS.START_POS]\n        }));\n      }\n    }\n\n    if (unbalanced) {\n      return this.expected('closing parenthesis', this.currToken[_tokenize.FIELDS.START_POS]);\n    }\n  };\n\n  _proto.pseudo = function pseudo() {\n    var _this4 = this;\n\n    var pseudoStr = '';\n    var startingToken = this.currToken;\n\n    while (this.currToken && this.currToken[_tokenize.FIELDS.TYPE] === tokens.colon) {\n      pseudoStr += this.content();\n      this.position++;\n    }\n\n    if (!this.currToken) {\n      return this.expected(['pseudo-class', 'pseudo-element'], this.position - 1);\n    }\n\n    if (this.currToken[_tokenize.FIELDS.TYPE] === tokens.word) {\n      this.splitWord(false, function (first, length) {\n        pseudoStr += first;\n\n        _this4.newNode(new _pseudo[\"default\"]({\n          value: pseudoStr,\n          source: getTokenSourceSpan(startingToken, _this4.currToken),\n          sourceIndex: startingToken[_tokenize.FIELDS.START_POS]\n        }));\n\n        if (length > 1 && _this4.nextToken && _this4.nextToken[_tokenize.FIELDS.TYPE] === tokens.openParenthesis) {\n          _this4.error('Misplaced parenthesis.', {\n            index: _this4.nextToken[_tokenize.FIELDS.START_POS]\n          });\n        }\n      });\n    } else {\n      return this.expected(['pseudo-class', 'pseudo-element'], this.currToken[_tokenize.FIELDS.START_POS]);\n    }\n  };\n\n  _proto.space = function space() {\n    var content = this.content(); // Handle space before and after the selector\n\n    if (this.position === 0 || this.prevToken[_tokenize.FIELDS.TYPE] === tokens.comma || this.prevToken[_tokenize.FIELDS.TYPE] === tokens.openParenthesis || this.current.nodes.every(function (node) {\n      return node.type === 'comment';\n    })) {\n      this.spaces = this.optionalSpace(content);\n      this.position++;\n    } else if (this.position === this.tokens.length - 1 || this.nextToken[_tokenize.FIELDS.TYPE] === tokens.comma || this.nextToken[_tokenize.FIELDS.TYPE] === tokens.closeParenthesis) {\n      this.current.last.spaces.after = this.optionalSpace(content);\n      this.position++;\n    } else {\n      this.combinator();\n    }\n  };\n\n  _proto.string = function string() {\n    var current = this.currToken;\n    this.newNode(new _string[\"default\"]({\n      value: this.content(),\n      source: getTokenSource(current),\n      sourceIndex: current[_tokenize.FIELDS.START_POS]\n    }));\n    this.position++;\n  };\n\n  _proto.universal = function universal(namespace) {\n    var nextToken = this.nextToken;\n\n    if (nextToken && this.content(nextToken) === '|') {\n      this.position++;\n      return this.namespace();\n    }\n\n    var current = this.currToken;\n    this.newNode(new _universal[\"default\"]({\n      value: this.content(),\n      source: getTokenSource(current),\n      sourceIndex: current[_tokenize.FIELDS.START_POS]\n    }), namespace);\n    this.position++;\n  };\n\n  _proto.splitWord = function splitWord(namespace, firstCallback) {\n    var _this5 = this;\n\n    var nextToken = this.nextToken;\n    var word = this.content();\n\n    while (nextToken && ~[tokens.dollar, tokens.caret, tokens.equals, tokens.word].indexOf(nextToken[_tokenize.FIELDS.TYPE])) {\n      this.position++;\n      var current = this.content();\n      word += current;\n\n      if (current.lastIndexOf('\\\\') === current.length - 1) {\n        var next = this.nextToken;\n\n        if (next && next[_tokenize.FIELDS.TYPE] === tokens.space) {\n          word += this.requiredSpace(this.content(next));\n          this.position++;\n        }\n      }\n\n      nextToken = this.nextToken;\n    }\n\n    var hasClass = indexesOf(word, '.').filter(function (i) {\n      // Allow escaped dot within class name\n      var escapedDot = word[i - 1] === '\\\\'; // Allow decimal numbers percent in @keyframes\n\n      var isKeyframesPercent = /^\\d+\\.\\d+%$/.test(word);\n      return !escapedDot && !isKeyframesPercent;\n    });\n    var hasId = indexesOf(word, '#').filter(function (i) {\n      return word[i - 1] !== '\\\\';\n    }); // Eliminate Sass interpolations from the list of id indexes\n\n    var interpolations = indexesOf(word, '#{');\n\n    if (interpolations.length) {\n      hasId = hasId.filter(function (hashIndex) {\n        return !~interpolations.indexOf(hashIndex);\n      });\n    }\n\n    var indices = (0, _sortAscending[\"default\"])(uniqs([0].concat(hasClass, hasId)));\n    indices.forEach(function (ind, i) {\n      var index = indices[i + 1] || word.length;\n      var value = word.slice(ind, index);\n\n      if (i === 0 && firstCallback) {\n        return firstCallback.call(_this5, value, indices.length);\n      }\n\n      var node;\n      var current = _this5.currToken;\n      var sourceIndex = current[_tokenize.FIELDS.START_POS] + indices[i];\n      var source = getSource(current[1], current[2] + ind, current[3], current[2] + (index - 1));\n\n      if (~hasClass.indexOf(ind)) {\n        var classNameOpts = {\n          value: value.slice(1),\n          source: source,\n          sourceIndex: sourceIndex\n        };\n        node = new _className[\"default\"](unescapeProp(classNameOpts, \"value\"));\n      } else if (~hasId.indexOf(ind)) {\n        var idOpts = {\n          value: value.slice(1),\n          source: source,\n          sourceIndex: sourceIndex\n        };\n        node = new _id[\"default\"](unescapeProp(idOpts, \"value\"));\n      } else {\n        var tagOpts = {\n          value: value,\n          source: source,\n          sourceIndex: sourceIndex\n        };\n        unescapeProp(tagOpts, \"value\");\n        node = new _tag[\"default\"](tagOpts);\n      }\n\n      _this5.newNode(node, namespace); // Ensure that the namespace is used only once\n\n\n      namespace = null;\n    });\n    this.position++;\n  };\n\n  _proto.word = function word(namespace) {\n    var nextToken = this.nextToken;\n\n    if (nextToken && this.content(nextToken) === '|') {\n      this.position++;\n      return this.namespace();\n    }\n\n    return this.splitWord(namespace);\n  };\n\n  _proto.loop = function loop() {\n    while (this.position < this.tokens.length) {\n      this.parse(true);\n    }\n\n    this.current._inferEndPosition();\n\n    return this.root;\n  };\n\n  _proto.parse = function parse(throwOnParenthesis) {\n    switch (this.currToken[_tokenize.FIELDS.TYPE]) {\n      case tokens.space:\n        this.space();\n        break;\n\n      case tokens.comment:\n        this.comment();\n        break;\n\n      case tokens.openParenthesis:\n        this.parentheses();\n        break;\n\n      case tokens.closeParenthesis:\n        if (throwOnParenthesis) {\n          this.missingParenthesis();\n        }\n\n        break;\n\n      case tokens.openSquare:\n        this.attribute();\n        break;\n\n      case tokens.dollar:\n      case tokens.caret:\n      case tokens.equals:\n      case tokens.word:\n        this.word();\n        break;\n\n      case tokens.colon:\n        this.pseudo();\n        break;\n\n      case tokens.comma:\n        this.comma();\n        break;\n\n      case tokens.asterisk:\n        this.universal();\n        break;\n\n      case tokens.ampersand:\n        this.nesting();\n        break;\n\n      case tokens.slash:\n      case tokens.combinator:\n        this.combinator();\n        break;\n\n      case tokens.str:\n        this.string();\n        break;\n      // These cases throw; no break needed.\n\n      case tokens.closeSquare:\n        this.missingSquareBracket();\n\n      case tokens.semicolon:\n        this.missingBackslash();\n\n      default:\n        this.unexpected();\n    }\n  }\n  /**\n   * Helpers\n   */\n  ;\n\n  _proto.expected = function expected(description, index, found) {\n    if (Array.isArray(description)) {\n      var last = description.pop();\n      description = description.join(', ') + \" or \" + last;\n    }\n\n    var an = /^[aeiou]/.test(description[0]) ? 'an' : 'a';\n\n    if (!found) {\n      return this.error(\"Expected \" + an + \" \" + description + \".\", {\n        index: index\n      });\n    }\n\n    return this.error(\"Expected \" + an + \" \" + description + \", found \\\"\" + found + \"\\\" instead.\", {\n      index: index\n    });\n  };\n\n  _proto.requiredSpace = function requiredSpace(space) {\n    return this.options.lossy ? ' ' : space;\n  };\n\n  _proto.optionalSpace = function optionalSpace(space) {\n    return this.options.lossy ? '' : space;\n  };\n\n  _proto.lossySpace = function lossySpace(space, required) {\n    if (this.options.lossy) {\n      return required ? ' ' : '';\n    } else {\n      return space;\n    }\n  };\n\n  _proto.parseParenthesisToken = function parseParenthesisToken(token) {\n    var content = this.content(token);\n\n    if (token[_tokenize.FIELDS.TYPE] === tokens.space) {\n      return this.requiredSpace(content);\n    } else {\n      return content;\n    }\n  };\n\n  _proto.newNode = function newNode(node, namespace) {\n    if (namespace) {\n      if (/^ +$/.test(namespace)) {\n        if (!this.options.lossy) {\n          this.spaces = (this.spaces || '') + namespace;\n        }\n\n        namespace = true;\n      }\n\n      node.namespace = namespace;\n      unescapeProp(node, \"namespace\");\n    }\n\n    if (this.spaces) {\n      node.spaces.before = this.spaces;\n      this.spaces = '';\n    }\n\n    return this.current.append(node);\n  };\n\n  _proto.content = function content(token) {\n    if (token === void 0) {\n      token = this.currToken;\n    }\n\n    return this.css.slice(token[_tokenize.FIELDS.START_POS], token[_tokenize.FIELDS.END_POS]);\n  };\n\n  /**\n   * returns the index of the next non-whitespace, non-comment token.\n   * returns -1 if no meaningful token is found.\n   */\n  _proto.locateNextMeaningfulToken = function locateNextMeaningfulToken(startPosition) {\n    if (startPosition === void 0) {\n      startPosition = this.position + 1;\n    }\n\n    var searchPosition = startPosition;\n\n    while (searchPosition < this.tokens.length) {\n      if (WHITESPACE_EQUIV_TOKENS[this.tokens[searchPosition][_tokenize.FIELDS.TYPE]]) {\n        searchPosition++;\n        continue;\n      } else {\n        return searchPosition;\n      }\n    }\n\n    return -1;\n  };\n\n  _createClass(Parser, [{\n    key: \"currToken\",\n    get: function get() {\n      return this.tokens[this.position];\n    }\n  }, {\n    key: \"nextToken\",\n    get: function get() {\n      return this.tokens[this.position + 1];\n    }\n  }, {\n    key: \"prevToken\",\n    get: function get() {\n      return this.tokens[this.position - 1];\n    }\n  }]);\n\n  return Parser;\n}();\n\nexports[\"default\"] = Parser;\nmodule.exports = exports.default;","/*!\n * Outlayer v2.1.1\n * the brains and guts of a layout library\n * MIT license\n */\n\n( function( window, factory ) {\n  'use strict';\n  // universal module definition\n  /* jshint strict: false */ /* globals define, module, require */\n  if ( typeof define == 'function' && define.amd ) {\n    // AMD - RequireJS\n    define( [\n        'ev-emitter/ev-emitter',\n        'get-size/get-size',\n        'fizzy-ui-utils/utils',\n        './item'\n      ],\n      function( EvEmitter, getSize, utils, Item ) {\n        return factory( window, EvEmitter, getSize, utils, Item);\n      }\n    );\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS - Browserify, Webpack\n    module.exports = factory(\n      window,\n      require('ev-emitter'),\n      require('get-size'),\n      require('fizzy-ui-utils'),\n      require('./item')\n    );\n  } else {\n    // browser global\n    window.Outlayer = factory(\n      window,\n      window.EvEmitter,\n      window.getSize,\n      window.fizzyUIUtils,\n      window.Outlayer.Item\n    );\n  }\n\n}( window, function factory( window, EvEmitter, getSize, utils, Item ) {\n'use strict';\n\n// ----- vars ----- //\n\nvar console = window.console;\nvar jQuery = window.jQuery;\nvar noop = function() {};\n\n// -------------------------- Outlayer -------------------------- //\n\n// globally unique identifiers\nvar GUID = 0;\n// internal store of all Outlayer intances\nvar instances = {};\n\n\n/**\n * @param {Element, String} element\n * @param {Object} options\n * @constructor\n */\nfunction Outlayer( element, options ) {\n  var queryElement = utils.getQueryElement( element );\n  if ( !queryElement ) {\n    if ( console ) {\n      console.error( 'Bad element for ' + this.constructor.namespace +\n        ': ' + ( queryElement || element ) );\n    }\n    return;\n  }\n  this.element = queryElement;\n  // add jQuery\n  if ( jQuery ) {\n    this.$element = jQuery( this.element );\n  }\n\n  // options\n  this.options = utils.extend( {}, this.constructor.defaults );\n  this.option( options );\n\n  // add id for Outlayer.getFromElement\n  var id = ++GUID;\n  this.element.outlayerGUID = id; // expando\n  instances[ id ] = this; // associate via id\n\n  // kick it off\n  this._create();\n\n  var isInitLayout = this._getOption('initLayout');\n  if ( isInitLayout ) {\n    this.layout();\n  }\n}\n\n// settings are for internal use only\nOutlayer.namespace = 'outlayer';\nOutlayer.Item = Item;\n\n// default options\nOutlayer.defaults = {\n  containerStyle: {\n    position: 'relative'\n  },\n  initLayout: true,\n  originLeft: true,\n  originTop: true,\n  resize: true,\n  resizeContainer: true,\n  // item options\n  transitionDuration: '0.4s',\n  hiddenStyle: {\n    opacity: 0,\n    transform: 'scale(0.001)'\n  },\n  visibleStyle: {\n    opacity: 1,\n    transform: 'scale(1)'\n  }\n};\n\nvar proto = Outlayer.prototype;\n// inherit EvEmitter\nutils.extend( proto, EvEmitter.prototype );\n\n/**\n * set options\n * @param {Object} opts\n */\nproto.option = function( opts ) {\n  utils.extend( this.options, opts );\n};\n\n/**\n * get backwards compatible option value, check old name\n */\nproto._getOption = function( option ) {\n  var oldOption = this.constructor.compatOptions[ option ];\n  return oldOption && this.options[ oldOption ] !== undefined ?\n    this.options[ oldOption ] : this.options[ option ];\n};\n\nOutlayer.compatOptions = {\n  // currentName: oldName\n  initLayout: 'isInitLayout',\n  horizontal: 'isHorizontal',\n  layoutInstant: 'isLayoutInstant',\n  originLeft: 'isOriginLeft',\n  originTop: 'isOriginTop',\n  resize: 'isResizeBound',\n  resizeContainer: 'isResizingContainer'\n};\n\nproto._create = function() {\n  // get items from children\n  this.reloadItems();\n  // elements that affect layout, but are not laid out\n  this.stamps = [];\n  this.stamp( this.options.stamp );\n  // set container style\n  utils.extend( this.element.style, this.options.containerStyle );\n\n  // bind resize method\n  var canBindResize = this._getOption('resize');\n  if ( canBindResize ) {\n    this.bindResize();\n  }\n};\n\n// goes through all children again and gets bricks in proper order\nproto.reloadItems = function() {\n  // collection of item elements\n  this.items = this._itemize( this.element.children );\n};\n\n\n/**\n * turn elements into Outlayer.Items to be used in layout\n * @param {Array or NodeList or HTMLElement} elems\n * @returns {Array} items - collection of new Outlayer Items\n */\nproto._itemize = function( elems ) {\n\n  var itemElems = this._filterFindItemElements( elems );\n  var Item = this.constructor.Item;\n\n  // create new Outlayer Items for collection\n  var items = [];\n  for ( var i=0; i < itemElems.length; i++ ) {\n    var elem = itemElems[i];\n    var item = new Item( elem, this );\n    items.push( item );\n  }\n\n  return items;\n};\n\n/**\n * get item elements to be used in layout\n * @param {Array or NodeList or HTMLElement} elems\n * @returns {Array} items - item elements\n */\nproto._filterFindItemElements = function( elems ) {\n  return utils.filterFindElements( elems, this.options.itemSelector );\n};\n\n/**\n * getter method for getting item elements\n * @returns {Array} elems - collection of item elements\n */\nproto.getItemElements = function() {\n  return this.items.map( function( item ) {\n    return item.element;\n  });\n};\n\n// ----- init & layout ----- //\n\n/**\n * lays out all items\n */\nproto.layout = function() {\n  this._resetLayout();\n  this._manageStamps();\n\n  // don't animate first layout\n  var layoutInstant = this._getOption('layoutInstant');\n  var isInstant = layoutInstant !== undefined ?\n    layoutInstant : !this._isLayoutInited;\n  this.layoutItems( this.items, isInstant );\n\n  // flag for initalized\n  this._isLayoutInited = true;\n};\n\n// _init is alias for layout\nproto._init = proto.layout;\n\n/**\n * logic before any new layout\n */\nproto._resetLayout = function() {\n  this.getSize();\n};\n\n\nproto.getSize = function() {\n  this.size = getSize( this.element );\n};\n\n/**\n * get measurement from option, for columnWidth, rowHeight, gutter\n * if option is String -> get element from selector string, & get size of element\n * if option is Element -> get size of element\n * else use option as a number\n *\n * @param {String} measurement\n * @param {String} size - width or height\n * @private\n */\nproto._getMeasurement = function( measurement, size ) {\n  var option = this.options[ measurement ];\n  var elem;\n  if ( !option ) {\n    // default to 0\n    this[ measurement ] = 0;\n  } else {\n    // use option as an element\n    if ( typeof option == 'string' ) {\n      elem = this.element.querySelector( option );\n    } else if ( option instanceof HTMLElement ) {\n      elem = option;\n    }\n    // use size of element, if element\n    this[ measurement ] = elem ? getSize( elem )[ size ] : option;\n  }\n};\n\n/**\n * layout a collection of item elements\n * @api public\n */\nproto.layoutItems = function( items, isInstant ) {\n  items = this._getItemsForLayout( items );\n\n  this._layoutItems( items, isInstant );\n\n  this._postLayout();\n};\n\n/**\n * get the items to be laid out\n * you may want to skip over some items\n * @param {Array} items\n * @returns {Array} items\n */\nproto._getItemsForLayout = function( items ) {\n  return items.filter( function( item ) {\n    return !item.isIgnored;\n  });\n};\n\n/**\n * layout items\n * @param {Array} items\n * @param {Boolean} isInstant\n */\nproto._layoutItems = function( items, isInstant ) {\n  this._emitCompleteOnItems( 'layout', items );\n\n  if ( !items || !items.length ) {\n    // no items, emit event with empty array\n    return;\n  }\n\n  var queue = [];\n\n  items.forEach( function( item ) {\n    // get x/y object from method\n    var position = this._getItemLayoutPosition( item );\n    // enqueue\n    position.item = item;\n    position.isInstant = isInstant || item.isLayoutInstant;\n    queue.push( position );\n  }, this );\n\n  this._processLayoutQueue( queue );\n};\n\n/**\n * get item layout position\n * @param {Outlayer.Item} item\n * @returns {Object} x and y position\n */\nproto._getItemLayoutPosition = function( /* item */ ) {\n  return {\n    x: 0,\n    y: 0\n  };\n};\n\n/**\n * iterate over array and position each item\n * Reason being - separating this logic prevents 'layout invalidation'\n * thx @paul_irish\n * @param {Array} queue\n */\nproto._processLayoutQueue = function( queue ) {\n  this.updateStagger();\n  queue.forEach( function( obj, i ) {\n    this._positionItem( obj.item, obj.x, obj.y, obj.isInstant, i );\n  }, this );\n};\n\n// set stagger from option in milliseconds number\nproto.updateStagger = function() {\n  var stagger = this.options.stagger;\n  if ( stagger === null || stagger === undefined ) {\n    this.stagger = 0;\n    return;\n  }\n  this.stagger = getMilliseconds( stagger );\n  return this.stagger;\n};\n\n/**\n * Sets position of item in DOM\n * @param {Outlayer.Item} item\n * @param {Number} x - horizontal position\n * @param {Number} y - vertical position\n * @param {Boolean} isInstant - disables transitions\n */\nproto._positionItem = function( item, x, y, isInstant, i ) {\n  if ( isInstant ) {\n    // if not transition, just set CSS\n    item.goTo( x, y );\n  } else {\n    item.stagger( i * this.stagger );\n    item.moveTo( x, y );\n  }\n};\n\n/**\n * Any logic you want to do after each layout,\n * i.e. size the container\n */\nproto._postLayout = function() {\n  this.resizeContainer();\n};\n\nproto.resizeContainer = function() {\n  var isResizingContainer = this._getOption('resizeContainer');\n  if ( !isResizingContainer ) {\n    return;\n  }\n  var size = this._getContainerSize();\n  if ( size ) {\n    this._setContainerMeasure( size.width, true );\n    this._setContainerMeasure( size.height, false );\n  }\n};\n\n/**\n * Sets width or height of container if returned\n * @returns {Object} size\n *   @param {Number} width\n *   @param {Number} height\n */\nproto._getContainerSize = noop;\n\n/**\n * @param {Number} measure - size of width or height\n * @param {Boolean} isWidth\n */\nproto._setContainerMeasure = function( measure, isWidth ) {\n  if ( measure === undefined ) {\n    return;\n  }\n\n  var elemSize = this.size;\n  // add padding and border width if border box\n  if ( elemSize.isBorderBox ) {\n    measure += isWidth ? elemSize.paddingLeft + elemSize.paddingRight +\n      elemSize.borderLeftWidth + elemSize.borderRightWidth :\n      elemSize.paddingBottom + elemSize.paddingTop +\n      elemSize.borderTopWidth + elemSize.borderBottomWidth;\n  }\n\n  measure = Math.max( measure, 0 );\n  this.element.style[ isWidth ? 'width' : 'height' ] = measure + 'px';\n};\n\n/**\n * emit eventComplete on a collection of items events\n * @param {String} eventName\n * @param {Array} items - Outlayer.Items\n */\nproto._emitCompleteOnItems = function( eventName, items ) {\n  var _this = this;\n  function onComplete() {\n    _this.dispatchEvent( eventName + 'Complete', null, [ items ] );\n  }\n\n  var count = items.length;\n  if ( !items || !count ) {\n    onComplete();\n    return;\n  }\n\n  var doneCount = 0;\n  function tick() {\n    doneCount++;\n    if ( doneCount == count ) {\n      onComplete();\n    }\n  }\n\n  // bind callback\n  items.forEach( function( item ) {\n    item.once( eventName, tick );\n  });\n};\n\n/**\n * emits events via EvEmitter and jQuery events\n * @param {String} type - name of event\n * @param {Event} event - original event\n * @param {Array} args - extra arguments\n */\nproto.dispatchEvent = function( type, event, args ) {\n  // add original event to arguments\n  var emitArgs = event ? [ event ].concat( args ) : args;\n  this.emitEvent( type, emitArgs );\n\n  if ( jQuery ) {\n    // set this.$element\n    this.$element = this.$element || jQuery( this.element );\n    if ( event ) {\n      // create jQuery event\n      var $event = jQuery.Event( event );\n      $event.type = type;\n      this.$element.trigger( $event, args );\n    } else {\n      // just trigger with type if no event available\n      this.$element.trigger( type, args );\n    }\n  }\n};\n\n// -------------------------- ignore & stamps -------------------------- //\n\n\n/**\n * keep item in collection, but do not lay it out\n * ignored items do not get skipped in layout\n * @param {Element} elem\n */\nproto.ignore = function( elem ) {\n  var item = this.getItem( elem );\n  if ( item ) {\n    item.isIgnored = true;\n  }\n};\n\n/**\n * return item to layout collection\n * @param {Element} elem\n */\nproto.unignore = function( elem ) {\n  var item = this.getItem( elem );\n  if ( item ) {\n    delete item.isIgnored;\n  }\n};\n\n/**\n * adds elements to stamps\n * @param {NodeList, Array, Element, or String} elems\n */\nproto.stamp = function( elems ) {\n  elems = this._find( elems );\n  if ( !elems ) {\n    return;\n  }\n\n  this.stamps = this.stamps.concat( elems );\n  // ignore\n  elems.forEach( this.ignore, this );\n};\n\n/**\n * removes elements to stamps\n * @param {NodeList, Array, or Element} elems\n */\nproto.unstamp = function( elems ) {\n  elems = this._find( elems );\n  if ( !elems ){\n    return;\n  }\n\n  elems.forEach( function( elem ) {\n    // filter out removed stamp elements\n    utils.removeFrom( this.stamps, elem );\n    this.unignore( elem );\n  }, this );\n};\n\n/**\n * finds child elements\n * @param {NodeList, Array, Element, or String} elems\n * @returns {Array} elems\n */\nproto._find = function( elems ) {\n  if ( !elems ) {\n    return;\n  }\n  // if string, use argument as selector string\n  if ( typeof elems == 'string' ) {\n    elems = this.element.querySelectorAll( elems );\n  }\n  elems = utils.makeArray( elems );\n  return elems;\n};\n\nproto._manageStamps = function() {\n  if ( !this.stamps || !this.stamps.length ) {\n    return;\n  }\n\n  this._getBoundingRect();\n\n  this.stamps.forEach( this._manageStamp, this );\n};\n\n// update boundingLeft / Top\nproto._getBoundingRect = function() {\n  // get bounding rect for container element\n  var boundingRect = this.element.getBoundingClientRect();\n  var size = this.size;\n  this._boundingRect = {\n    left: boundingRect.left + size.paddingLeft + size.borderLeftWidth,\n    top: boundingRect.top + size.paddingTop + size.borderTopWidth,\n    right: boundingRect.right - ( size.paddingRight + size.borderRightWidth ),\n    bottom: boundingRect.bottom - ( size.paddingBottom + size.borderBottomWidth )\n  };\n};\n\n/**\n * @param {Element} stamp\n**/\nproto._manageStamp = noop;\n\n/**\n * get x/y position of element relative to container element\n * @param {Element} elem\n * @returns {Object} offset - has left, top, right, bottom\n */\nproto._getElementOffset = function( elem ) {\n  var boundingRect = elem.getBoundingClientRect();\n  var thisRect = this._boundingRect;\n  var size = getSize( elem );\n  var offset = {\n    left: boundingRect.left - thisRect.left - size.marginLeft,\n    top: boundingRect.top - thisRect.top - size.marginTop,\n    right: thisRect.right - boundingRect.right - size.marginRight,\n    bottom: thisRect.bottom - boundingRect.bottom - size.marginBottom\n  };\n  return offset;\n};\n\n// -------------------------- resize -------------------------- //\n\n// enable event handlers for listeners\n// i.e. resize -> onresize\nproto.handleEvent = utils.handleEvent;\n\n/**\n * Bind layout to window resizing\n */\nproto.bindResize = function() {\n  window.addEventListener( 'resize', this );\n  this.isResizeBound = true;\n};\n\n/**\n * Unbind layout to window resizing\n */\nproto.unbindResize = function() {\n  window.removeEventListener( 'resize', this );\n  this.isResizeBound = false;\n};\n\nproto.onresize = function() {\n  this.resize();\n};\n\nutils.debounceMethod( Outlayer, 'onresize', 100 );\n\nproto.resize = function() {\n  // don't trigger if size did not change\n  // or if resize was unbound. See #9\n  if ( !this.isResizeBound || !this.needsResizeLayout() ) {\n    return;\n  }\n\n  this.layout();\n};\n\n/**\n * check if layout is needed post layout\n * @returns Boolean\n */\nproto.needsResizeLayout = function() {\n  var size = getSize( this.element );\n  // check that this.size and size are there\n  // IE8 triggers resize on body size change, so they might not be\n  var hasSizes = this.size && size;\n  return hasSizes && size.innerWidth !== this.size.innerWidth;\n};\n\n// -------------------------- methods -------------------------- //\n\n/**\n * add items to Outlayer instance\n * @param {Array or NodeList or Element} elems\n * @returns {Array} items - Outlayer.Items\n**/\nproto.addItems = function( elems ) {\n  var items = this._itemize( elems );\n  // add items to collection\n  if ( items.length ) {\n    this.items = this.items.concat( items );\n  }\n  return items;\n};\n\n/**\n * Layout newly-appended item elements\n * @param {Array or NodeList or Element} elems\n */\nproto.appended = function( elems ) {\n  var items = this.addItems( elems );\n  if ( !items.length ) {\n    return;\n  }\n  // layout and reveal just the new items\n  this.layoutItems( items, true );\n  this.reveal( items );\n};\n\n/**\n * Layout prepended elements\n * @param {Array or NodeList or Element} elems\n */\nproto.prepended = function( elems ) {\n  var items = this._itemize( elems );\n  if ( !items.length ) {\n    return;\n  }\n  // add items to beginning of collection\n  var previousItems = this.items.slice(0);\n  this.items = items.concat( previousItems );\n  // start new layout\n  this._resetLayout();\n  this._manageStamps();\n  // layout new stuff without transition\n  this.layoutItems( items, true );\n  this.reveal( items );\n  // layout previous items\n  this.layoutItems( previousItems );\n};\n\n/**\n * reveal a collection of items\n * @param {Array of Outlayer.Items} items\n */\nproto.reveal = function( items ) {\n  this._emitCompleteOnItems( 'reveal', items );\n  if ( !items || !items.length ) {\n    return;\n  }\n  var stagger = this.updateStagger();\n  items.forEach( function( item, i ) {\n    item.stagger( i * stagger );\n    item.reveal();\n  });\n};\n\n/**\n * hide a collection of items\n * @param {Array of Outlayer.Items} items\n */\nproto.hide = function( items ) {\n  this._emitCompleteOnItems( 'hide', items );\n  if ( !items || !items.length ) {\n    return;\n  }\n  var stagger = this.updateStagger();\n  items.forEach( function( item, i ) {\n    item.stagger( i * stagger );\n    item.hide();\n  });\n};\n\n/**\n * reveal item elements\n * @param {Array}, {Element}, {NodeList} items\n */\nproto.revealItemElements = function( elems ) {\n  var items = this.getItems( elems );\n  this.reveal( items );\n};\n\n/**\n * hide item elements\n * @param {Array}, {Element}, {NodeList} items\n */\nproto.hideItemElements = function( elems ) {\n  var items = this.getItems( elems );\n  this.hide( items );\n};\n\n/**\n * get Outlayer.Item, given an Element\n * @param {Element} elem\n * @param {Function} callback\n * @returns {Outlayer.Item} item\n */\nproto.getItem = function( elem ) {\n  // loop through items to get the one that matches\n  for ( var i=0; i < this.items.length; i++ ) {\n    var item = this.items[i];\n    if ( item.element == elem ) {\n      // return item\n      return item;\n    }\n  }\n};\n\n/**\n * get collection of Outlayer.Items, given Elements\n * @param {Array} elems\n * @returns {Array} items - Outlayer.Items\n */\nproto.getItems = function( elems ) {\n  elems = utils.makeArray( elems );\n  var items = [];\n  elems.forEach( function( elem ) {\n    var item = this.getItem( elem );\n    if ( item ) {\n      items.push( item );\n    }\n  }, this );\n\n  return items;\n};\n\n/**\n * remove element(s) from instance and DOM\n * @param {Array or NodeList or Element} elems\n */\nproto.remove = function( elems ) {\n  var removeItems = this.getItems( elems );\n\n  this._emitCompleteOnItems( 'remove', removeItems );\n\n  // bail if no items to remove\n  if ( !removeItems || !removeItems.length ) {\n    return;\n  }\n\n  removeItems.forEach( function( item ) {\n    item.remove();\n    // remove item from collection\n    utils.removeFrom( this.items, item );\n  }, this );\n};\n\n// ----- destroy ----- //\n\n// remove and disable Outlayer instance\nproto.destroy = function() {\n  // clean up dynamic styles\n  var style = this.element.style;\n  style.height = '';\n  style.position = '';\n  style.width = '';\n  // destroy items\n  this.items.forEach( function( item ) {\n    item.destroy();\n  });\n\n  this.unbindResize();\n\n  var id = this.element.outlayerGUID;\n  delete instances[ id ]; // remove reference to instance by id\n  delete this.element.outlayerGUID;\n  // remove data for jQuery\n  if ( jQuery ) {\n    jQuery.removeData( this.element, this.constructor.namespace );\n  }\n\n};\n\n// -------------------------- data -------------------------- //\n\n/**\n * get Outlayer instance from element\n * @param {Element} elem\n * @returns {Outlayer}\n */\nOutlayer.data = function( elem ) {\n  elem = utils.getQueryElement( elem );\n  var id = elem && elem.outlayerGUID;\n  return id && instances[ id ];\n};\n\n\n// -------------------------- create Outlayer class -------------------------- //\n\n/**\n * create a layout class\n * @param {String} namespace\n */\nOutlayer.create = function( namespace, options ) {\n  // sub-class Outlayer\n  var Layout = subclass( Outlayer );\n  // apply new options and compatOptions\n  Layout.defaults = utils.extend( {}, Outlayer.defaults );\n  utils.extend( Layout.defaults, options );\n  Layout.compatOptions = utils.extend( {}, Outlayer.compatOptions  );\n\n  Layout.namespace = namespace;\n\n  Layout.data = Outlayer.data;\n\n  // sub-class Item\n  Layout.Item = subclass( Item );\n\n  // -------------------------- declarative -------------------------- //\n\n  utils.htmlInit( Layout, namespace );\n\n  // -------------------------- jQuery bridge -------------------------- //\n\n  // make into jQuery plugin\n  if ( jQuery && jQuery.bridget ) {\n    jQuery.bridget( namespace, Layout );\n  }\n\n  return Layout;\n};\n\nfunction subclass( Parent ) {\n  function SubClass() {\n    Parent.apply( this, arguments );\n  }\n\n  SubClass.prototype = Object.create( Parent.prototype );\n  SubClass.prototype.constructor = SubClass;\n\n  return SubClass;\n}\n\n// ----- helpers ----- //\n\n// how many milliseconds are in each unit\nvar msUnits = {\n  ms: 1,\n  s: 1000\n};\n\n// munge time-like parameter into millisecond number\n// '0.4s' -> 40\nfunction getMilliseconds( time ) {\n  if ( typeof time == 'number' ) {\n    return time;\n  }\n  var matches = time.match( /(^\\d*\\.?\\d*)(\\w*)/ );\n  var num = matches && matches[1];\n  var unit = matches && matches[2];\n  if ( !num.length ) {\n    return 0;\n  }\n  num = parseFloat( num );\n  var mult = msUnits[ unit ] || 1;\n  return num * mult;\n}\n\n// ----- fin ----- //\n\n// back in global\nOutlayer.Item = Item;\n\nreturn Outlayer;\n\n}));\n","'use strict';\nvar globalThis = require('../internals/global-this');\n\nvar navigator = globalThis.navigator;\nvar userAgent = navigator && navigator.userAgent;\n\nmodule.exports = userAgent ? String(userAgent) : '';\n","'use strict';\nvar $ = require('../internals/export');\nvar IS_PURE = require('../internals/is-pure');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar globalThis = require('../internals/global-this');\nvar path = require('../internals/path');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar isForced = require('../internals/is-forced');\nvar hasOwn = require('../internals/has-own-property');\nvar inheritIfRequired = require('../internals/inherit-if-required');\nvar isPrototypeOf = require('../internals/object-is-prototype-of');\nvar isSymbol = require('../internals/is-symbol');\nvar toPrimitive = require('../internals/to-primitive');\nvar fails = require('../internals/fails');\nvar getOwnPropertyNames = require('../internals/object-get-own-property-names').f;\nvar getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;\nvar defineProperty = require('../internals/object-define-property').f;\nvar thisNumberValue = require('../internals/this-number-value');\nvar trim = require('../internals/string-trim').trim;\n\nvar NUMBER = 'Number';\nvar NativeNumber = globalThis[NUMBER];\nvar PureNumberNamespace = path[NUMBER];\nvar NumberPrototype = NativeNumber.prototype;\nvar TypeError = globalThis.TypeError;\nvar stringSlice = uncurryThis(''.slice);\nvar charCodeAt = uncurryThis(''.charCodeAt);\n\n// `ToNumeric` abstract operation\n// https://tc39.es/ecma262/#sec-tonumeric\nvar toNumeric = function (value) {\n  var primValue = toPrimitive(value, 'number');\n  return typeof primValue == 'bigint' ? primValue : toNumber(primValue);\n};\n\n// `ToNumber` abstract operation\n// https://tc39.es/ecma262/#sec-tonumber\nvar toNumber = function (argument) {\n  var it = toPrimitive(argument, 'number');\n  var first, third, radix, maxCode, digits, length, index, code;\n  if (isSymbol(it)) throw new TypeError('Cannot convert a Symbol value to a number');\n  if (typeof it == 'string' && it.length > 2) {\n    it = trim(it);\n    first = charCodeAt(it, 0);\n    if (first === 43 || first === 45) {\n      third = charCodeAt(it, 2);\n      if (third === 88 || third === 120) return NaN; // Number('+0x1') should be NaN, old V8 fix\n    } else if (first === 48) {\n      switch (charCodeAt(it, 1)) {\n        // fast equal of /^0b[01]+$/i\n        case 66:\n        case 98:\n          radix = 2;\n          maxCode = 49;\n          break;\n        // fast equal of /^0o[0-7]+$/i\n        case 79:\n        case 111:\n          radix = 8;\n          maxCode = 55;\n          break;\n        default:\n          return +it;\n      }\n      digits = stringSlice(it, 2);\n      length = digits.length;\n      for (index = 0; index < length; index++) {\n        code = charCodeAt(digits, index);\n        // parseInt parses a string to a first unavailable symbol\n        // but ToNumber should return NaN if a string contains unavailable symbols\n        if (code < 48 || code > maxCode) return NaN;\n      } return parseInt(digits, radix);\n    }\n  } return +it;\n};\n\nvar FORCED = isForced(NUMBER, !NativeNumber(' 0o1') || !NativeNumber('0b1') || NativeNumber('+0x1'));\n\nvar calledWithNew = function (dummy) {\n  // includes check on 1..constructor(foo) case\n  return isPrototypeOf(NumberPrototype, dummy) && fails(function () { thisNumberValue(dummy); });\n};\n\n// `Number` constructor\n// https://tc39.es/ecma262/#sec-number-constructor\nvar NumberWrapper = function Number(value) {\n  var n = arguments.length < 1 ? 0 : NativeNumber(toNumeric(value));\n  return calledWithNew(this) ? inheritIfRequired(Object(n), this, NumberWrapper) : n;\n};\n\nNumberWrapper.prototype = NumberPrototype;\nif (FORCED && !IS_PURE) NumberPrototype.constructor = NumberWrapper;\n\n$({ global: true, constructor: true, wrap: true, forced: FORCED }, {\n  Number: NumberWrapper\n});\n\n// Use `internal/copy-constructor-properties` helper in `core-js@4`\nvar copyConstructorProperties = function (target, source) {\n  for (var keys = DESCRIPTORS ? getOwnPropertyNames(source) : (\n    // ES3:\n    'MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,' +\n    // ES2015 (in case, if modules with ES2015 Number statics required before):\n    'EPSILON,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,isFinite,isInteger,isNaN,isSafeInteger,parseFloat,parseInt,' +\n    // ESNext\n    'fromString,range'\n  ).split(','), j = 0, key; keys.length > j; j++) {\n    if (hasOwn(source, key = keys[j]) && !hasOwn(target, key)) {\n      defineProperty(target, key, getOwnPropertyDescriptor(source, key));\n    }\n  }\n};\n\nif (IS_PURE && PureNumberNamespace) copyConstructorProperties(path[NUMBER], PureNumberNamespace);\nif (FORCED || IS_PURE) copyConstructorProperties(path[NUMBER], NativeNumber);\n","var objectExtend = extend;\n\n/*\n  var obj = {a: 3, b: 5};\n  extend(obj, {a: 4, c: 8}); // {a: 4, b: 5, c: 8}\n  obj; // {a: 4, b: 5, c: 8}\n\n  var obj = {a: 3, b: 5};\n  extend({}, obj, {a: 4, c: 8}); // {a: 4, b: 5, c: 8}\n  obj; // {a: 3, b: 5}\n\n  var arr = [1, 2, 3];\n  var obj = {a: 3, b: 5};\n  extend(obj, {c: arr}); // {a: 3, b: 5, c: [1, 2, 3]}\n  arr.push(4);\n  obj; // {a: 3, b: 5, c: [1, 2, 3, 4]}\n\n  var arr = [1, 2, 3];\n  var obj = {a: 3, b: 5};\n  extend(true, obj, {c: arr}); // {a: 3, b: 5, c: [1, 2, 3]}\n  arr.push(4);\n  obj; // {a: 3, b: 5, c: [1, 2, 3]}\n\n  extend({a: 4, b: 5}); // {a: 4, b: 5}\n  extend({a: 4, b: 5}, 3); {a: 4, b: 5}\n  extend({a: 4, b: 5}, true); {a: 4, b: 5}\n  extend('hello', {a: 4, b: 5}); // throws\n  extend(3, {a: 4, b: 5}); // throws\n*/\n\nfunction extend(/* [deep], obj1, obj2, [objn] */) {\n  var args = [].slice.call(arguments);\n  var deep = false;\n  if (typeof args[0] == 'boolean') {\n    deep = args.shift();\n  }\n  var result = args[0];\n  if (isUnextendable(result)) {\n    throw new Error('extendee must be an object');\n  }\n  var extenders = args.slice(1);\n  var len = extenders.length;\n  for (var i = 0; i < len; i++) {\n    var extender = extenders[i];\n    for (var key in extender) {\n      if (Object.prototype.hasOwnProperty.call(extender, key)) {\n        var value = extender[key];\n        if (deep && isCloneable(value)) {\n          var base = Array.isArray(value) ? [] : {};\n          result[key] = extend(\n            true,\n            Object.prototype.hasOwnProperty.call(result, key) && !isUnextendable(result[key])\n              ? result[key]\n              : base,\n            value\n          );\n        } else {\n          result[key] = value;\n        }\n      }\n    }\n  }\n  return result;\n}\n\nfunction isCloneable(obj) {\n  return Array.isArray(obj) || {}.toString.call(obj) == '[object Object]';\n}\n\nfunction isUnextendable(val) {\n  return !val || (typeof val != 'object' && typeof val != 'function');\n}\n\nexport {objectExtend as default};\n","import $ewBKy$justextend from \"just-extend\";\n\nfunction $parcel$interopDefault(a) {\n  return a && a.__esModule ? a.default : a;\n}\n\nclass $4040acfd8584338d$export$2e2bcd8739ae039 {\n    // Add an event listener for given event\n    on(event, fn) {\n        this._callbacks = this._callbacks || {\n        };\n        // Create namespace for this event\n        if (!this._callbacks[event]) this._callbacks[event] = [];\n        this._callbacks[event].push(fn);\n        return this;\n    }\n    emit(event, ...args) {\n        this._callbacks = this._callbacks || {\n        };\n        let callbacks = this._callbacks[event];\n        if (callbacks) for (let callback of callbacks)callback.apply(this, args);\n        // trigger a corresponding DOM event\n        if (this.element) this.element.dispatchEvent(this.makeEvent(\"dropzone:\" + event, {\n            args: args\n        }));\n        return this;\n    }\n    makeEvent(eventName, detail) {\n        let params = {\n            bubbles: true,\n            cancelable: true,\n            detail: detail\n        };\n        if (typeof window.CustomEvent === \"function\") return new CustomEvent(eventName, params);\n        else {\n            // IE 11 support\n            // https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/CustomEvent\n            var evt = document.createEvent(\"CustomEvent\");\n            evt.initCustomEvent(eventName, params.bubbles, params.cancelable, params.detail);\n            return evt;\n        }\n    }\n    // Remove event listener for given event. If fn is not provided, all event\n    // listeners for that event will be removed. If neither is provided, all\n    // event listeners will be removed.\n    off(event, fn) {\n        if (!this._callbacks || arguments.length === 0) {\n            this._callbacks = {\n            };\n            return this;\n        }\n        // specific event\n        let callbacks = this._callbacks[event];\n        if (!callbacks) return this;\n        // remove all handlers\n        if (arguments.length === 1) {\n            delete this._callbacks[event];\n            return this;\n        }\n        // remove specific handler\n        for(let i = 0; i < callbacks.length; i++){\n            let callback = callbacks[i];\n            if (callback === fn) {\n                callbacks.splice(i, 1);\n                break;\n            }\n        }\n        return this;\n    }\n}\n\n\n\nvar $fd6031f88dce2e32$exports = {};\n$fd6031f88dce2e32$exports = \"<div class=\\\"dz-preview dz-file-preview\\\">\\n  <div class=\\\"dz-image\\\"><img data-dz-thumbnail=\\\"\\\"></div>\\n  <div class=\\\"dz-details\\\">\\n    <div class=\\\"dz-size\\\"><span data-dz-size=\\\"\\\"></span></div>\\n    <div class=\\\"dz-filename\\\"><span data-dz-name=\\\"\\\"></span></div>\\n  </div>\\n  <div class=\\\"dz-progress\\\">\\n    <span class=\\\"dz-upload\\\" data-dz-uploadprogress=\\\"\\\"></span>\\n  </div>\\n  <div class=\\\"dz-error-message\\\"><span data-dz-errormessage=\\\"\\\"></span></div>\\n  <div class=\\\"dz-success-mark\\\">\\n    <svg width=\\\"54\\\" height=\\\"54\\\" viewBox=\\\"0 0 54 54\\\" fill=\\\"white\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n      <path d=\\\"M10.2071 29.7929L14.2929 25.7071C14.6834 25.3166 15.3166 25.3166 15.7071 25.7071L21.2929 31.2929C21.6834 31.6834 22.3166 31.6834 22.7071 31.2929L38.2929 15.7071C38.6834 15.3166 39.3166 15.3166 39.7071 15.7071L43.7929 19.7929C44.1834 20.1834 44.1834 20.8166 43.7929 21.2071L22.7071 42.2929C22.3166 42.6834 21.6834 42.6834 21.2929 42.2929L10.2071 31.2071C9.81658 30.8166 9.81658 30.1834 10.2071 29.7929Z\\\"></path>\\n    </svg>\\n  </div>\\n  <div class=\\\"dz-error-mark\\\">\\n    <svg width=\\\"54\\\" height=\\\"54\\\" viewBox=\\\"0 0 54 54\\\" fill=\\\"white\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n      <path d=\\\"M26.2929 20.2929L19.2071 13.2071C18.8166 12.8166 18.1834 12.8166 17.7929 13.2071L13.2071 17.7929C12.8166 18.1834 12.8166 18.8166 13.2071 19.2071L20.2929 26.2929C20.6834 26.6834 20.6834 27.3166 20.2929 27.7071L13.2071 34.7929C12.8166 35.1834 12.8166 35.8166 13.2071 36.2071L17.7929 40.7929C18.1834 41.1834 18.8166 41.1834 19.2071 40.7929L26.2929 33.7071C26.6834 33.3166 27.3166 33.3166 27.7071 33.7071L34.7929 40.7929C35.1834 41.1834 35.8166 41.1834 36.2071 40.7929L40.7929 36.2071C41.1834 35.8166 41.1834 35.1834 40.7929 34.7929L33.7071 27.7071C33.3166 27.3166 33.3166 26.6834 33.7071 26.2929L40.7929 19.2071C41.1834 18.8166 41.1834 18.1834 40.7929 17.7929L36.2071 13.2071C35.8166 12.8166 35.1834 12.8166 34.7929 13.2071L27.7071 20.2929C27.3166 20.6834 26.6834 20.6834 26.2929 20.2929Z\\\"></path>\\n    </svg>\\n  </div>\\n</div>\\n\";\n\n\nlet $4ca367182776f80b$var$defaultOptions = {\n    /**\n   * Has to be specified on elements other than form (or when the form doesn't\n   * have an `action` attribute).\n   *\n   * You can also provide a function that will be called with `files` and\n   * `dataBlocks`  and must return the url as string.\n   */ url: null,\n    /**\n   * Can be changed to `\"put\"` if necessary. You can also provide a function\n   * that will be called with `files` and must return the method (since `v3.12.0`).\n   */ method: \"post\",\n    /**\n   * Will be set on the XHRequest.\n   */ withCredentials: false,\n    /**\n   * The timeout for the XHR requests in milliseconds (since `v4.4.0`).\n   * If set to null or 0, no timeout is going to be set.\n   */ timeout: null,\n    /**\n   * How many file uploads to process in parallel (See the\n   * Enqueuing file uploads documentation section for more info)\n   */ parallelUploads: 2,\n    /**\n   * Whether to send multiple files in one request. If\n   * this it set to true, then the fallback file input element will\n   * have the `multiple` attribute as well. This option will\n   * also trigger additional events (like `processingmultiple`). See the events\n   * documentation section for more information.\n   */ uploadMultiple: false,\n    /**\n   * Whether you want files to be uploaded in chunks to your server. This can't be\n   * used in combination with `uploadMultiple`.\n   *\n   * See [chunksUploaded](#config-chunksUploaded) for the callback to finalise an upload.\n   */ chunking: false,\n    /**\n   * If `chunking` is enabled, this defines whether **every** file should be chunked,\n   * even if the file size is below chunkSize. This means, that the additional chunk\n   * form data will be submitted and the `chunksUploaded` callback will be invoked.\n   */ forceChunking: false,\n    /**\n   * If `chunking` is `true`, then this defines the chunk size in bytes.\n   */ chunkSize: 2097152,\n    /**\n   * If `true`, the individual chunks of a file are being uploaded simultaneously.\n   */ parallelChunkUploads: false,\n    /**\n   * Whether a chunk should be retried if it fails.\n   */ retryChunks: false,\n    /**\n   * If `retryChunks` is true, how many times should it be retried.\n   */ retryChunksLimit: 3,\n    /**\n   * The maximum filesize (in MiB) that is allowed to be uploaded.\n   */ maxFilesize: 256,\n    /**\n   * The name of the file param that gets transferred.\n   * **NOTE**: If you have the option  `uploadMultiple` set to `true`, then\n   * Dropzone will append `[]` to the name.\n   */ paramName: \"file\",\n    /**\n   * Whether thumbnails for images should be generated\n   */ createImageThumbnails: true,\n    /**\n   * In MB. When the filename exceeds this limit, the thumbnail will not be generated.\n   */ maxThumbnailFilesize: 10,\n    /**\n   * If `null`, the ratio of the image will be used to calculate it.\n   */ thumbnailWidth: 120,\n    /**\n   * The same as `thumbnailWidth`. If both are null, images will not be resized.\n   */ thumbnailHeight: 120,\n    /**\n   * How the images should be scaled down in case both, `thumbnailWidth` and `thumbnailHeight` are provided.\n   * Can be either `contain` or `crop`.\n   */ thumbnailMethod: \"crop\",\n    /**\n   * If set, images will be resized to these dimensions before being **uploaded**.\n   * If only one, `resizeWidth` **or** `resizeHeight` is provided, the original aspect\n   * ratio of the file will be preserved.\n   *\n   * The `options.transformFile` function uses these options, so if the `transformFile` function\n   * is overridden, these options don't do anything.\n   */ resizeWidth: null,\n    /**\n   * See `resizeWidth`.\n   */ resizeHeight: null,\n    /**\n   * The mime type of the resized image (before it gets uploaded to the server).\n   * If `null` the original mime type will be used. To force jpeg, for example, use `image/jpeg`.\n   * See `resizeWidth` for more information.\n   */ resizeMimeType: null,\n    /**\n   * The quality of the resized images. See `resizeWidth`.\n   */ resizeQuality: 0.8,\n    /**\n   * How the images should be scaled down in case both, `resizeWidth` and `resizeHeight` are provided.\n   * Can be either `contain` or `crop`.\n   */ resizeMethod: \"contain\",\n    /**\n   * The base that is used to calculate the **displayed** filesize. You can\n   * change this to 1024 if you would rather display kibibytes, mebibytes,\n   * etc... 1024 is technically incorrect, because `1024 bytes` are `1 kibibyte`\n   * not `1 kilobyte`. You can change this to `1024` if you don't care about\n   * validity.\n   */ filesizeBase: 1000,\n    /**\n   * If not `null` defines how many files this Dropzone handles. If it exceeds,\n   * the event `maxfilesexceeded` will be called. The dropzone element gets the\n   * class `dz-max-files-reached` accordingly so you can provide visual\n   * feedback.\n   */ maxFiles: null,\n    /**\n   * An optional object to send additional headers to the server. Eg:\n   * `{ \"My-Awesome-Header\": \"header value\" }`\n   */ headers: null,\n    /**\n   * Should the default headers be set or not?\n   * Accept: application/json <- for requesting json response\n   * Cache-Control: no-cache <- Request shouldnt be cached\n   * X-Requested-With: XMLHttpRequest <- We sent the request via XMLHttpRequest\n   */ defaultHeaders: true,\n    /**\n   * If `true`, the dropzone element itself will be clickable, if `false`\n   * nothing will be clickable.\n   *\n   * You can also pass an HTML element, a CSS selector (for multiple elements)\n   * or an array of those. In that case, all of those elements will trigger an\n   * upload when clicked.\n   */ clickable: true,\n    /**\n   * Whether hidden files in directories should be ignored.\n   */ ignoreHiddenFiles: true,\n    /**\n   * The default implementation of `accept` checks the file's mime type or\n   * extension against this list. This is a comma separated list of mime\n   * types or file extensions.\n   *\n   * Eg.: `image/*,application/pdf,.psd`\n   *\n   * If the Dropzone is `clickable` this option will also be used as\n   * [`accept`](https://developer.mozilla.org/en-US/docs/HTML/Element/input#attr-accept)\n   * parameter on the hidden file input as well.\n   */ acceptedFiles: null,\n    /**\n   * **Deprecated!**\n   * Use acceptedFiles instead.\n   */ acceptedMimeTypes: null,\n    /**\n   * If false, files will be added to the queue but the queue will not be\n   * processed automatically.\n   * This can be useful if you need some additional user input before sending\n   * files (or if you want want all files sent at once).\n   * If you're ready to send the file simply call `myDropzone.processQueue()`.\n   *\n   * See the [enqueuing file uploads](#enqueuing-file-uploads) documentation\n   * section for more information.\n   */ autoProcessQueue: true,\n    /**\n   * If false, files added to the dropzone will not be queued by default.\n   * You'll have to call `enqueueFile(file)` manually.\n   */ autoQueue: true,\n    /**\n   * If `true`, this will add a link to every file preview to remove or cancel (if\n   * already uploading) the file. The `dictCancelUpload`, `dictCancelUploadConfirmation`\n   * and `dictRemoveFile` options are used for the wording.\n   */ addRemoveLinks: false,\n    /**\n   * Defines where to display the file previews – if `null` the\n   * Dropzone element itself is used. Can be a plain `HTMLElement` or a CSS\n   * selector. The element should have the `dropzone-previews` class so\n   * the previews are displayed properly.\n   */ previewsContainer: null,\n    /**\n   * Set this to `true` if you don't want previews to be shown.\n   */ disablePreviews: false,\n    /**\n   * This is the element the hidden input field (which is used when clicking on the\n   * dropzone to trigger file selection) will be appended to. This might\n   * be important in case you use frameworks to switch the content of your page.\n   *\n   * Can be a selector string, or an element directly.\n   */ hiddenInputContainer: \"body\",\n    /**\n   * If null, no capture type will be specified\n   * If camera, mobile devices will skip the file selection and choose camera\n   * If microphone, mobile devices will skip the file selection and choose the microphone\n   * If camcorder, mobile devices will skip the file selection and choose the camera in video mode\n   * On apple devices multiple must be set to false.  AcceptedFiles may need to\n   * be set to an appropriate mime type (e.g. \"image/*\", \"audio/*\", or \"video/*\").\n   */ capture: null,\n    /**\n   * **Deprecated**. Use `renameFile` instead.\n   */ renameFilename: null,\n    /**\n   * A function that is invoked before the file is uploaded to the server and renames the file.\n   * This function gets the `File` as argument and can use the `file.name`. The actual name of the\n   * file that gets used during the upload can be accessed through `file.upload.filename`.\n   */ renameFile: null,\n    /**\n   * If `true` the fallback will be forced. This is very useful to test your server\n   * implementations first and make sure that everything works as\n   * expected without dropzone if you experience problems, and to test\n   * how your fallbacks will look.\n   */ forceFallback: false,\n    /**\n   * The text used before any files are dropped.\n   */ dictDefaultMessage: \"Drop files here to upload\",\n    /**\n   * The text that replaces the default message text it the browser is not supported.\n   */ dictFallbackMessage: \"Your browser does not support drag'n'drop file uploads.\",\n    /**\n   * The text that will be added before the fallback form.\n   * If you provide a  fallback element yourself, or if this option is `null` this will\n   * be ignored.\n   */ dictFallbackText: \"Please use the fallback form below to upload your files like in the olden days.\",\n    /**\n   * If the filesize is too big.\n   * `{{filesize}}` and `{{maxFilesize}}` will be replaced with the respective configuration values.\n   */ dictFileTooBig: \"File is too big ({{filesize}}MiB). Max filesize: {{maxFilesize}}MiB.\",\n    /**\n   * If the file doesn't match the file type.\n   */ dictInvalidFileType: \"You can't upload files of this type.\",\n    /**\n   * If the server response was invalid.\n   * `{{statusCode}}` will be replaced with the servers status code.\n   */ dictResponseError: \"Server responded with {{statusCode}} code.\",\n    /**\n   * If `addRemoveLinks` is true, the text to be used for the cancel upload link.\n   */ dictCancelUpload: \"Cancel upload\",\n    /**\n   * The text that is displayed if an upload was manually canceled\n   */ dictUploadCanceled: \"Upload canceled.\",\n    /**\n   * If `addRemoveLinks` is true, the text to be used for confirmation when cancelling upload.\n   */ dictCancelUploadConfirmation: \"Are you sure you want to cancel this upload?\",\n    /**\n   * If `addRemoveLinks` is true, the text to be used to remove a file.\n   */ dictRemoveFile: \"Remove file\",\n    /**\n   * If this is not null, then the user will be prompted before removing a file.\n   */ dictRemoveFileConfirmation: null,\n    /**\n   * Displayed if `maxFiles` is st and exceeded.\n   * The string `{{maxFiles}}` will be replaced by the configuration value.\n   */ dictMaxFilesExceeded: \"You can not upload any more files.\",\n    /**\n   * Allows you to translate the different units. Starting with `tb` for terabytes and going down to\n   * `b` for bytes.\n   */ dictFileSizeUnits: {\n        tb: \"TB\",\n        gb: \"GB\",\n        mb: \"MB\",\n        kb: \"KB\",\n        b: \"b\"\n    },\n    /**\n   * Called when dropzone initialized\n   * You can add event listeners here\n   */ init () {\n    },\n    /**\n   * Can be an **object** of additional parameters to transfer to the server, **or** a `Function`\n   * that gets invoked with the `files`, `xhr` and, if it's a chunked upload, `chunk` arguments. In case\n   * of a function, this needs to return a map.\n   *\n   * The default implementation does nothing for normal uploads, but adds relevant information for\n   * chunked uploads.\n   *\n   * This is the same as adding hidden input fields in the form element.\n   */ params (files, xhr, chunk) {\n        if (chunk) return {\n            dzuuid: chunk.file.upload.uuid,\n            dzchunkindex: chunk.index,\n            dztotalfilesize: chunk.file.size,\n            dzchunksize: this.options.chunkSize,\n            dztotalchunkcount: chunk.file.upload.totalChunkCount,\n            dzchunkbyteoffset: chunk.index * this.options.chunkSize\n        };\n    },\n    /**\n   * A function that gets a [file](https://developer.mozilla.org/en-US/docs/DOM/File)\n   * and a `done` function as parameters.\n   *\n   * If the done function is invoked without arguments, the file is \"accepted\" and will\n   * be processed. If you pass an error message, the file is rejected, and the error\n   * message will be displayed.\n   * This function will not be called if the file is too big or doesn't match the mime types.\n   */ accept (file, done) {\n        return done();\n    },\n    /**\n   * The callback that will be invoked when all chunks have been uploaded for a file.\n   * It gets the file for which the chunks have been uploaded as the first parameter,\n   * and the `done` function as second. `done()` needs to be invoked when everything\n   * needed to finish the upload process is done.\n   */ chunksUploaded: function(file, done) {\n        done();\n    },\n    /**\n   * Sends the file as binary blob in body instead of form data.\n   * If this is set, the `params` option will be ignored.\n   * It's an error to set this to `true` along with `uploadMultiple` since\n   * multiple files cannot be in a single binary body.\n   */ binaryBody: false,\n    /**\n   * Gets called when the browser is not supported.\n   * The default implementation shows the fallback input field and adds\n   * a text.\n   */ fallback () {\n        // This code should pass in IE7... :(\n        let messageElement;\n        this.element.className = `${this.element.className} dz-browser-not-supported`;\n        for (let child of this.element.getElementsByTagName(\"div\"))if (/(^| )dz-message($| )/.test(child.className)) {\n            messageElement = child;\n            child.className = \"dz-message\"; // Removes the 'dz-default' class\n            break;\n        }\n        if (!messageElement) {\n            messageElement = $3ed269f2f0fb224b$export$2e2bcd8739ae039.createElement('<div class=\"dz-message\"><span></span></div>');\n            this.element.appendChild(messageElement);\n        }\n        let span = messageElement.getElementsByTagName(\"span\")[0];\n        if (span) {\n            if (span.textContent != null) span.textContent = this.options.dictFallbackMessage;\n            else if (span.innerText != null) span.innerText = this.options.dictFallbackMessage;\n        }\n        return this.element.appendChild(this.getFallbackForm());\n    },\n    /**\n   * Gets called to calculate the thumbnail dimensions.\n   *\n   * It gets `file`, `width` and `height` (both may be `null`) as parameters and must return an object containing:\n   *\n   *  - `srcWidth` & `srcHeight` (required)\n   *  - `trgWidth` & `trgHeight` (required)\n   *  - `srcX` & `srcY` (optional, default `0`)\n   *  - `trgX` & `trgY` (optional, default `0`)\n   *\n   * Those values are going to be used by `ctx.drawImage()`.\n   */ resize (file, width, height, resizeMethod) {\n        let info = {\n            srcX: 0,\n            srcY: 0,\n            srcWidth: file.width,\n            srcHeight: file.height\n        };\n        let srcRatio = file.width / file.height;\n        // Automatically calculate dimensions if not specified\n        if (width == null && height == null) {\n            width = info.srcWidth;\n            height = info.srcHeight;\n        } else if (width == null) width = height * srcRatio;\n        else if (height == null) height = width / srcRatio;\n        // Make sure images aren't upscaled\n        width = Math.min(width, info.srcWidth);\n        height = Math.min(height, info.srcHeight);\n        let trgRatio = width / height;\n        if (info.srcWidth > width || info.srcHeight > height) {\n            // Image is bigger and needs rescaling\n            if (resizeMethod === \"crop\") {\n                if (srcRatio > trgRatio) {\n                    info.srcHeight = file.height;\n                    info.srcWidth = info.srcHeight * trgRatio;\n                } else {\n                    info.srcWidth = file.width;\n                    info.srcHeight = info.srcWidth / trgRatio;\n                }\n            } else if (resizeMethod === \"contain\") {\n                // Method 'contain'\n                if (srcRatio > trgRatio) height = width / srcRatio;\n                else width = height * srcRatio;\n            } else throw new Error(`Unknown resizeMethod '${resizeMethod}'`);\n        }\n        info.srcX = (file.width - info.srcWidth) / 2;\n        info.srcY = (file.height - info.srcHeight) / 2;\n        info.trgWidth = width;\n        info.trgHeight = height;\n        return info;\n    },\n    /**\n   * Can be used to transform the file (for example, resize an image if necessary).\n   *\n   * The default implementation uses `resizeWidth` and `resizeHeight` (if provided) and resizes\n   * images according to those dimensions.\n   *\n   * Gets the `file` as the first parameter, and a `done()` function as the second, that needs\n   * to be invoked with the file when the transformation is done.\n   */ transformFile (file, done) {\n        if ((this.options.resizeWidth || this.options.resizeHeight) && file.type.match(/image.*/)) return this.resizeImage(file, this.options.resizeWidth, this.options.resizeHeight, this.options.resizeMethod, done);\n        else return done(file);\n    },\n    /**\n   * A string that contains the template used for each dropped\n   * file. Change it to fulfill your needs but make sure to properly\n   * provide all elements.\n   *\n   * If you want to use an actual HTML element instead of providing a String\n   * as a config option, you could create a div with the id `tpl`,\n   * put the template inside it and provide the element like this:\n   *\n   *     document\n   *       .querySelector('#tpl')\n   *       .innerHTML\n   *\n   */ previewTemplate: (/*@__PURE__*/$parcel$interopDefault($fd6031f88dce2e32$exports)),\n    /*\n   Those functions register themselves to the events on init and handle all\n   the user interface specific stuff. Overwriting them won't break the upload\n   but can break the way it's displayed.\n   You can overwrite them if you don't like the default behavior. If you just\n   want to add an additional event handler, register it on the dropzone object\n   and don't overwrite those options.\n   */ // Those are self explanatory and simply concern the DragnDrop.\n    drop (e) {\n        return this.element.classList.remove(\"dz-drag-hover\");\n    },\n    dragstart (e) {\n    },\n    dragend (e) {\n        return this.element.classList.remove(\"dz-drag-hover\");\n    },\n    dragenter (e) {\n        return this.element.classList.add(\"dz-drag-hover\");\n    },\n    dragover (e) {\n        return this.element.classList.add(\"dz-drag-hover\");\n    },\n    dragleave (e) {\n        return this.element.classList.remove(\"dz-drag-hover\");\n    },\n    paste (e) {\n    },\n    // Called whenever there are no files left in the dropzone anymore, and the\n    // dropzone should be displayed as if in the initial state.\n    reset () {\n        return this.element.classList.remove(\"dz-started\");\n    },\n    // Called when a file is added to the queue\n    // Receives `file`\n    addedfile (file) {\n        if (this.element === this.previewsContainer) this.element.classList.add(\"dz-started\");\n        if (this.previewsContainer && !this.options.disablePreviews) {\n            file.previewElement = $3ed269f2f0fb224b$export$2e2bcd8739ae039.createElement(this.options.previewTemplate.trim());\n            file.previewTemplate = file.previewElement; // Backwards compatibility\n            this.previewsContainer.appendChild(file.previewElement);\n            for (var node of file.previewElement.querySelectorAll(\"[data-dz-name]\"))node.textContent = file.name;\n            for (node of file.previewElement.querySelectorAll(\"[data-dz-size]\"))node.innerHTML = this.filesize(file.size);\n            if (this.options.addRemoveLinks) {\n                file._removeLink = $3ed269f2f0fb224b$export$2e2bcd8739ae039.createElement(`<a class=\"dz-remove\" href=\"javascript:undefined;\" data-dz-remove>${this.options.dictRemoveFile}</a>`);\n                file.previewElement.appendChild(file._removeLink);\n            }\n            let removeFileEvent = (e)=>{\n                e.preventDefault();\n                e.stopPropagation();\n                if (file.status === $3ed269f2f0fb224b$export$2e2bcd8739ae039.UPLOADING) return $3ed269f2f0fb224b$export$2e2bcd8739ae039.confirm(this.options.dictCancelUploadConfirmation, ()=>this.removeFile(file)\n                );\n                else {\n                    if (this.options.dictRemoveFileConfirmation) return $3ed269f2f0fb224b$export$2e2bcd8739ae039.confirm(this.options.dictRemoveFileConfirmation, ()=>this.removeFile(file)\n                    );\n                    else return this.removeFile(file);\n                }\n            };\n            for (let removeLink of file.previewElement.querySelectorAll(\"[data-dz-remove]\"))removeLink.addEventListener(\"click\", removeFileEvent);\n        }\n    },\n    // Called whenever a file is removed.\n    removedfile (file) {\n        if (file.previewElement != null && file.previewElement.parentNode != null) file.previewElement.parentNode.removeChild(file.previewElement);\n        return this._updateMaxFilesReachedClass();\n    },\n    // Called when a thumbnail has been generated\n    // Receives `file` and `dataUrl`\n    thumbnail (file, dataUrl) {\n        if (file.previewElement) {\n            file.previewElement.classList.remove(\"dz-file-preview\");\n            for (let thumbnailElement of file.previewElement.querySelectorAll(\"[data-dz-thumbnail]\")){\n                thumbnailElement.alt = file.name;\n                thumbnailElement.src = dataUrl;\n            }\n            return setTimeout(()=>file.previewElement.classList.add(\"dz-image-preview\")\n            , 1);\n        }\n    },\n    // Called whenever an error occurs\n    // Receives `file` and `message`\n    error (file, message) {\n        if (file.previewElement) {\n            file.previewElement.classList.add(\"dz-error\");\n            if (typeof message !== \"string\" && message.error) message = message.error;\n            for (let node of file.previewElement.querySelectorAll(\"[data-dz-errormessage]\"))node.textContent = message;\n        }\n    },\n    errormultiple () {\n    },\n    // Called when a file gets processed. Since there is a cue, not all added\n    // files are processed immediately.\n    // Receives `file`\n    processing (file) {\n        if (file.previewElement) {\n            file.previewElement.classList.add(\"dz-processing\");\n            if (file._removeLink) return file._removeLink.innerHTML = this.options.dictCancelUpload;\n        }\n    },\n    processingmultiple () {\n    },\n    // Called whenever the upload progress gets updated.\n    // Receives `file`, `progress` (percentage 0-100) and `bytesSent`.\n    // To get the total number of bytes of the file, use `file.size`\n    uploadprogress (file, progress, bytesSent) {\n        if (file.previewElement) for (let node of file.previewElement.querySelectorAll(\"[data-dz-uploadprogress]\"))node.nodeName === \"PROGRESS\" ? node.value = progress : node.style.width = `${progress}%`;\n    },\n    // Called whenever the total upload progress gets updated.\n    // Called with totalUploadProgress (0-100), totalBytes and totalBytesSent\n    totaluploadprogress () {\n    },\n    // Called just before the file is sent. Gets the `xhr` object as second\n    // parameter, so you can modify it (for example to add a CSRF token) and a\n    // `formData` object to add additional information.\n    sending () {\n    },\n    sendingmultiple () {\n    },\n    // When the complete upload is finished and successful\n    // Receives `file`\n    success (file) {\n        if (file.previewElement) return file.previewElement.classList.add(\"dz-success\");\n    },\n    successmultiple () {\n    },\n    // When the upload is canceled.\n    canceled (file) {\n        return this.emit(\"error\", file, this.options.dictUploadCanceled);\n    },\n    canceledmultiple () {\n    },\n    // When the upload is finished, either with success or an error.\n    // Receives `file`\n    complete (file) {\n        if (file._removeLink) file._removeLink.innerHTML = this.options.dictRemoveFile;\n        if (file.previewElement) return file.previewElement.classList.add(\"dz-complete\");\n    },\n    completemultiple () {\n    },\n    maxfilesexceeded () {\n    },\n    maxfilesreached () {\n    },\n    queuecomplete () {\n    },\n    addedfiles () {\n    }\n};\nvar $4ca367182776f80b$export$2e2bcd8739ae039 = $4ca367182776f80b$var$defaultOptions;\n\n\nclass $3ed269f2f0fb224b$export$2e2bcd8739ae039 extends $4040acfd8584338d$export$2e2bcd8739ae039 {\n    static initClass() {\n        // Exposing the emitter class, mainly for tests\n        this.prototype.Emitter = $4040acfd8584338d$export$2e2bcd8739ae039;\n        /*\n     This is a list of all available events you can register on a dropzone object.\n\n     You can register an event handler like this:\n\n     dropzone.on(\"dragEnter\", function() { });\n\n     */ this.prototype.events = [\n            \"drop\",\n            \"dragstart\",\n            \"dragend\",\n            \"dragenter\",\n            \"dragover\",\n            \"dragleave\",\n            \"addedfile\",\n            \"addedfiles\",\n            \"removedfile\",\n            \"thumbnail\",\n            \"error\",\n            \"errormultiple\",\n            \"processing\",\n            \"processingmultiple\",\n            \"uploadprogress\",\n            \"totaluploadprogress\",\n            \"sending\",\n            \"sendingmultiple\",\n            \"success\",\n            \"successmultiple\",\n            \"canceled\",\n            \"canceledmultiple\",\n            \"complete\",\n            \"completemultiple\",\n            \"reset\",\n            \"maxfilesexceeded\",\n            \"maxfilesreached\",\n            \"queuecomplete\", \n        ];\n        this.prototype._thumbnailQueue = [];\n        this.prototype._processingThumbnail = false;\n    }\n    // Returns all files that have been accepted\n    getAcceptedFiles() {\n        return this.files.filter((file)=>file.accepted\n        ).map((file)=>file\n        );\n    }\n    // Returns all files that have been rejected\n    // Not sure when that's going to be useful, but added for completeness.\n    getRejectedFiles() {\n        return this.files.filter((file)=>!file.accepted\n        ).map((file)=>file\n        );\n    }\n    getFilesWithStatus(status) {\n        return this.files.filter((file)=>file.status === status\n        ).map((file)=>file\n        );\n    }\n    // Returns all files that are in the queue\n    getQueuedFiles() {\n        return this.getFilesWithStatus($3ed269f2f0fb224b$export$2e2bcd8739ae039.QUEUED);\n    }\n    getUploadingFiles() {\n        return this.getFilesWithStatus($3ed269f2f0fb224b$export$2e2bcd8739ae039.UPLOADING);\n    }\n    getAddedFiles() {\n        return this.getFilesWithStatus($3ed269f2f0fb224b$export$2e2bcd8739ae039.ADDED);\n    }\n    // Files that are either queued or uploading\n    getActiveFiles() {\n        return this.files.filter((file)=>file.status === $3ed269f2f0fb224b$export$2e2bcd8739ae039.UPLOADING || file.status === $3ed269f2f0fb224b$export$2e2bcd8739ae039.QUEUED\n        ).map((file)=>file\n        );\n    }\n    // The function that gets called when Dropzone is initialized. You\n    // can (and should) setup event listeners inside this function.\n    init() {\n        // In case it isn't set already\n        if (this.element.tagName === \"form\") this.element.setAttribute(\"enctype\", \"multipart/form-data\");\n        if (this.element.classList.contains(\"dropzone\") && !this.element.querySelector(\".dz-message\")) this.element.appendChild($3ed269f2f0fb224b$export$2e2bcd8739ae039.createElement(`<div class=\"dz-default dz-message\"><button class=\"dz-button\" type=\"button\">${this.options.dictDefaultMessage}</button></div>`));\n        if (this.clickableElements.length) {\n            let setupHiddenFileInput = ()=>{\n                if (this.hiddenFileInput) this.hiddenFileInput.parentNode.removeChild(this.hiddenFileInput);\n                this.hiddenFileInput = document.createElement(\"input\");\n                this.hiddenFileInput.setAttribute(\"type\", \"file\");\n                if (this.options.maxFiles === null || this.options.maxFiles > 1) this.hiddenFileInput.setAttribute(\"multiple\", \"multiple\");\n                this.hiddenFileInput.className = \"dz-hidden-input\";\n                if (this.options.acceptedFiles !== null) this.hiddenFileInput.setAttribute(\"accept\", this.options.acceptedFiles);\n                if (this.options.capture !== null) this.hiddenFileInput.setAttribute(\"capture\", this.options.capture);\n                // Making sure that no one can \"tab\" into this field.\n                this.hiddenFileInput.setAttribute(\"tabindex\", \"-1\");\n                // Not setting `display=\"none\"` because some browsers don't accept clicks\n                // on elements that aren't displayed.\n                this.hiddenFileInput.style.visibility = \"hidden\";\n                this.hiddenFileInput.style.position = \"absolute\";\n                this.hiddenFileInput.style.top = \"0\";\n                this.hiddenFileInput.style.left = \"0\";\n                this.hiddenFileInput.style.height = \"0\";\n                this.hiddenFileInput.style.width = \"0\";\n                $3ed269f2f0fb224b$export$2e2bcd8739ae039.getElement(this.options.hiddenInputContainer, \"hiddenInputContainer\").appendChild(this.hiddenFileInput);\n                this.hiddenFileInput.addEventListener(\"change\", ()=>{\n                    let { files: files  } = this.hiddenFileInput;\n                    if (files.length) for (let file of files)this.addFile(file);\n                    this.emit(\"addedfiles\", files);\n                    setupHiddenFileInput();\n                });\n            };\n            setupHiddenFileInput();\n        }\n        this.URL = window.URL !== null ? window.URL : window.webkitURL;\n        // Setup all event listeners on the Dropzone object itself.\n        // They're not in @setupEventListeners() because they shouldn't be removed\n        // again when the dropzone gets disabled.\n        for (let eventName of this.events)this.on(eventName, this.options[eventName]);\n        this.on(\"uploadprogress\", ()=>this.updateTotalUploadProgress()\n        );\n        this.on(\"removedfile\", ()=>this.updateTotalUploadProgress()\n        );\n        this.on(\"canceled\", (file)=>this.emit(\"complete\", file)\n        );\n        // Emit a `queuecomplete` event if all files finished uploading.\n        this.on(\"complete\", (file)=>{\n            if (this.getAddedFiles().length === 0 && this.getUploadingFiles().length === 0 && this.getQueuedFiles().length === 0) // This needs to be deferred so that `queuecomplete` really triggers after `complete`\n            return setTimeout(()=>this.emit(\"queuecomplete\")\n            , 0);\n        });\n        const containsFiles = function(e) {\n            if (e.dataTransfer.types) // Because e.dataTransfer.types is an Object in\n            // IE, we need to iterate like this instead of\n            // using e.dataTransfer.types.some()\n            for(var i = 0; i < e.dataTransfer.types.length; i++){\n                if (e.dataTransfer.types[i] === \"Files\") return true;\n            }\n            return false;\n        };\n        let noPropagation = function(e) {\n            // If there are no files, we don't want to stop\n            // propagation so we don't interfere with other\n            // drag and drop behaviour.\n            if (!containsFiles(e)) return;\n            e.stopPropagation();\n            if (e.preventDefault) return e.preventDefault();\n            else return e.returnValue = false;\n        };\n        // Create the listeners\n        this.listeners = [\n            {\n                element: this.element,\n                events: {\n                    dragstart: (e)=>{\n                        return this.emit(\"dragstart\", e);\n                    },\n                    dragenter: (e)=>{\n                        noPropagation(e);\n                        return this.emit(\"dragenter\", e);\n                    },\n                    dragover: (e)=>{\n                        // Makes it possible to drag files from chrome's download bar\n                        // http://stackoverflow.com/questions/19526430/drag-and-drop-file-uploads-from-chrome-downloads-bar\n                        // Try is required to prevent bug in Internet Explorer 11 (SCRIPT65535 exception)\n                        let efct;\n                        try {\n                            efct = e.dataTransfer.effectAllowed;\n                        } catch (error) {\n                        }\n                        e.dataTransfer.dropEffect = \"move\" === efct || \"linkMove\" === efct ? \"move\" : \"copy\";\n                        noPropagation(e);\n                        return this.emit(\"dragover\", e);\n                    },\n                    dragleave: (e)=>{\n                        return this.emit(\"dragleave\", e);\n                    },\n                    drop: (e)=>{\n                        noPropagation(e);\n                        return this.drop(e);\n                    },\n                    dragend: (e)=>{\n                        return this.emit(\"dragend\", e);\n                    }\n                }\n            }, \n        ];\n        this.clickableElements.forEach((clickableElement)=>{\n            return this.listeners.push({\n                element: clickableElement,\n                events: {\n                    click: (evt)=>{\n                        // Only the actual dropzone or the message element should trigger file selection\n                        if (clickableElement !== this.element || evt.target === this.element || $3ed269f2f0fb224b$export$2e2bcd8739ae039.elementInside(evt.target, this.element.querySelector(\".dz-message\"))) this.hiddenFileInput.click(); // Forward the click\n                        return true;\n                    }\n                }\n            });\n        });\n        this.enable();\n        return this.options.init.call(this);\n    }\n    // Not fully tested yet\n    destroy() {\n        this.disable();\n        this.removeAllFiles(true);\n        if (this.hiddenFileInput != null ? this.hiddenFileInput.parentNode : undefined) {\n            this.hiddenFileInput.parentNode.removeChild(this.hiddenFileInput);\n            this.hiddenFileInput = null;\n        }\n        delete this.element.dropzone;\n        return $3ed269f2f0fb224b$export$2e2bcd8739ae039.instances.splice($3ed269f2f0fb224b$export$2e2bcd8739ae039.instances.indexOf(this), 1);\n    }\n    updateTotalUploadProgress() {\n        let totalUploadProgress;\n        let totalBytesSent = 0;\n        let totalBytes = 0;\n        let activeFiles = this.getActiveFiles();\n        if (activeFiles.length) {\n            for (let file of this.getActiveFiles()){\n                totalBytesSent += file.upload.bytesSent;\n                totalBytes += file.upload.total;\n            }\n            totalUploadProgress = 100 * totalBytesSent / totalBytes;\n        } else totalUploadProgress = 100;\n        return this.emit(\"totaluploadprogress\", totalUploadProgress, totalBytes, totalBytesSent);\n    }\n    // @options.paramName can be a function taking one parameter rather than a string.\n    // A parameter name for a file is obtained simply by calling this with an index number.\n    _getParamName(n) {\n        if (typeof this.options.paramName === \"function\") return this.options.paramName(n);\n        else return `${this.options.paramName}${this.options.uploadMultiple ? `[${n}]` : \"\"}`;\n    }\n    // If @options.renameFile is a function,\n    // the function will be used to rename the file.name before appending it to the formData\n    _renameFile(file) {\n        if (typeof this.options.renameFile !== \"function\") return file.name;\n        return this.options.renameFile(file);\n    }\n    // Returns a form that can be used as fallback if the browser does not support DragnDrop\n    //\n    // If the dropzone is already a form, only the input field and button are returned. Otherwise a complete form element is provided.\n    // This code has to pass in IE7 :(\n    getFallbackForm() {\n        let existingFallback, form;\n        if (existingFallback = this.getExistingFallback()) return existingFallback;\n        let fieldsString = '<div class=\"dz-fallback\">';\n        if (this.options.dictFallbackText) fieldsString += `<p>${this.options.dictFallbackText}</p>`;\n        fieldsString += `<input type=\"file\" name=\"${this._getParamName(0)}\" ${this.options.uploadMultiple ? 'multiple=\"multiple\"' : undefined} /><input type=\"submit\" value=\"Upload!\"></div>`;\n        let fields = $3ed269f2f0fb224b$export$2e2bcd8739ae039.createElement(fieldsString);\n        if (this.element.tagName !== \"FORM\") {\n            form = $3ed269f2f0fb224b$export$2e2bcd8739ae039.createElement(`<form action=\"${this.options.url}\" enctype=\"multipart/form-data\" method=\"${this.options.method}\"></form>`);\n            form.appendChild(fields);\n        } else {\n            // Make sure that the enctype and method attributes are set properly\n            this.element.setAttribute(\"enctype\", \"multipart/form-data\");\n            this.element.setAttribute(\"method\", this.options.method);\n        }\n        return form != null ? form : fields;\n    }\n    // Returns the fallback elements if they exist already\n    //\n    // This code has to pass in IE7 :(\n    getExistingFallback() {\n        let getFallback = function(elements) {\n            for (let el of elements){\n                if (/(^| )fallback($| )/.test(el.className)) return el;\n            }\n        };\n        for (let tagName of [\n            \"div\",\n            \"form\"\n        ]){\n            var fallback;\n            if (fallback = getFallback(this.element.getElementsByTagName(tagName))) return fallback;\n        }\n    }\n    // Activates all listeners stored in @listeners\n    setupEventListeners() {\n        return this.listeners.map((elementListeners)=>(()=>{\n                let result = [];\n                for(let event in elementListeners.events){\n                    let listener = elementListeners.events[event];\n                    result.push(elementListeners.element.addEventListener(event, listener, false));\n                }\n                return result;\n            })()\n        );\n    }\n    // Deactivates all listeners stored in @listeners\n    removeEventListeners() {\n        return this.listeners.map((elementListeners)=>(()=>{\n                let result = [];\n                for(let event in elementListeners.events){\n                    let listener = elementListeners.events[event];\n                    result.push(elementListeners.element.removeEventListener(event, listener, false));\n                }\n                return result;\n            })()\n        );\n    }\n    // Removes all event listeners and cancels all files in the queue or being processed.\n    disable() {\n        this.clickableElements.forEach((element)=>element.classList.remove(\"dz-clickable\")\n        );\n        this.removeEventListeners();\n        this.disabled = true;\n        return this.files.map((file)=>this.cancelUpload(file)\n        );\n    }\n    enable() {\n        delete this.disabled;\n        this.clickableElements.forEach((element)=>element.classList.add(\"dz-clickable\")\n        );\n        return this.setupEventListeners();\n    }\n    // Returns a nicely formatted filesize\n    filesize(size) {\n        let selectedSize = 0;\n        let selectedUnit = \"b\";\n        if (size > 0) {\n            let units = [\n                \"tb\",\n                \"gb\",\n                \"mb\",\n                \"kb\",\n                \"b\"\n            ];\n            for(let i = 0; i < units.length; i++){\n                let unit = units[i];\n                let cutoff = Math.pow(this.options.filesizeBase, 4 - i) / 10;\n                if (size >= cutoff) {\n                    selectedSize = size / Math.pow(this.options.filesizeBase, 4 - i);\n                    selectedUnit = unit;\n                    break;\n                }\n            }\n            selectedSize = Math.round(10 * selectedSize) / 10; // Cutting of digits\n        }\n        return `<strong>${selectedSize}</strong> ${this.options.dictFileSizeUnits[selectedUnit]}`;\n    }\n    // Adds or removes the `dz-max-files-reached` class from the form.\n    _updateMaxFilesReachedClass() {\n        if (this.options.maxFiles != null && this.getAcceptedFiles().length >= this.options.maxFiles) {\n            if (this.getAcceptedFiles().length === this.options.maxFiles) this.emit(\"maxfilesreached\", this.files);\n            return this.element.classList.add(\"dz-max-files-reached\");\n        } else return this.element.classList.remove(\"dz-max-files-reached\");\n    }\n    drop(e) {\n        if (!e.dataTransfer) return;\n        this.emit(\"drop\", e);\n        // Convert the FileList to an Array\n        // This is necessary for IE11\n        let files = [];\n        for(let i = 0; i < e.dataTransfer.files.length; i++)files[i] = e.dataTransfer.files[i];\n        // Even if it's a folder, files.length will contain the folders.\n        if (files.length) {\n            let { items: items  } = e.dataTransfer;\n            if (items && items.length && items[0].webkitGetAsEntry != null) // The browser supports dropping of folders, so handle items instead of files\n            this._addFilesFromItems(items);\n            else this.handleFiles(files);\n        }\n        this.emit(\"addedfiles\", files);\n    }\n    paste(e) {\n        if ($3ed269f2f0fb224b$var$__guard__(e != null ? e.clipboardData : undefined, (x)=>x.items\n        ) == null) return;\n        this.emit(\"paste\", e);\n        let { items: items  } = e.clipboardData;\n        if (items.length) return this._addFilesFromItems(items);\n    }\n    handleFiles(files) {\n        for (let file of files)this.addFile(file);\n    }\n    // When a folder is dropped (or files are pasted), items must be handled\n    // instead of files.\n    _addFilesFromItems(items) {\n        return (()=>{\n            let result = [];\n            for (let item of items){\n                var entry;\n                if (item.webkitGetAsEntry != null && (entry = item.webkitGetAsEntry())) {\n                    if (entry.isFile) result.push(this.addFile(item.getAsFile()));\n                    else if (entry.isDirectory) // Append all files from that directory to files\n                    result.push(this._addFilesFromDirectory(entry, entry.name));\n                    else result.push(undefined);\n                } else if (item.getAsFile != null) {\n                    if (item.kind == null || item.kind === \"file\") result.push(this.addFile(item.getAsFile()));\n                    else result.push(undefined);\n                } else result.push(undefined);\n            }\n            return result;\n        })();\n    }\n    // Goes through the directory, and adds each file it finds recursively\n    _addFilesFromDirectory(directory, path) {\n        let dirReader = directory.createReader();\n        let errorHandler = (error)=>$3ed269f2f0fb224b$var$__guardMethod__(console, \"log\", (o)=>o.log(error)\n            )\n        ;\n        var readEntries = ()=>{\n            return dirReader.readEntries((entries)=>{\n                if (entries.length > 0) {\n                    for (let entry of entries){\n                        if (entry.isFile) entry.file((file)=>{\n                            if (this.options.ignoreHiddenFiles && file.name.substring(0, 1) === \".\") return;\n                            file.fullPath = `${path}/${file.name}`;\n                            return this.addFile(file);\n                        });\n                        else if (entry.isDirectory) this._addFilesFromDirectory(entry, `${path}/${entry.name}`);\n                    }\n                    // Recursively call readEntries() again, since browser only handle\n                    // the first 100 entries.\n                    // See: https://developer.mozilla.org/en-US/docs/Web/API/DirectoryReader#readEntries\n                    readEntries();\n                }\n                return null;\n            }, errorHandler);\n        };\n        return readEntries();\n    }\n    // If `done()` is called without argument the file is accepted\n    // If you call it with an error message, the file is rejected\n    // (This allows for asynchronous validation)\n    //\n    // This function checks the filesize, and if the file.type passes the\n    // `acceptedFiles` check.\n    accept(file, done) {\n        if (this.options.maxFilesize && file.size > this.options.maxFilesize * 1048576) done(this.options.dictFileTooBig.replace(\"{{filesize}}\", Math.round(file.size / 1024 / 10.24) / 100).replace(\"{{maxFilesize}}\", this.options.maxFilesize));\n        else if (!$3ed269f2f0fb224b$export$2e2bcd8739ae039.isValidFile(file, this.options.acceptedFiles)) done(this.options.dictInvalidFileType);\n        else if (this.options.maxFiles != null && this.getAcceptedFiles().length >= this.options.maxFiles) {\n            done(this.options.dictMaxFilesExceeded.replace(\"{{maxFiles}}\", this.options.maxFiles));\n            this.emit(\"maxfilesexceeded\", file);\n        } else this.options.accept.call(this, file, done);\n    }\n    addFile(file) {\n        file.upload = {\n            uuid: $3ed269f2f0fb224b$export$2e2bcd8739ae039.uuidv4(),\n            progress: 0,\n            // Setting the total upload size to file.size for the beginning\n            // It's actual different than the size to be transmitted.\n            total: file.size,\n            bytesSent: 0,\n            filename: this._renameFile(file)\n        };\n        this.files.push(file);\n        file.status = $3ed269f2f0fb224b$export$2e2bcd8739ae039.ADDED;\n        this.emit(\"addedfile\", file);\n        this._enqueueThumbnail(file);\n        this.accept(file, (error)=>{\n            if (error) {\n                file.accepted = false;\n                this._errorProcessing([\n                    file\n                ], error); // Will set the file.status\n            } else {\n                file.accepted = true;\n                if (this.options.autoQueue) this.enqueueFile(file);\n                 // Will set .accepted = true\n            }\n            this._updateMaxFilesReachedClass();\n        });\n    }\n    // Wrapper for enqueueFile\n    enqueueFiles(files) {\n        for (let file of files)this.enqueueFile(file);\n        return null;\n    }\n    enqueueFile(file) {\n        if (file.status === $3ed269f2f0fb224b$export$2e2bcd8739ae039.ADDED && file.accepted === true) {\n            file.status = $3ed269f2f0fb224b$export$2e2bcd8739ae039.QUEUED;\n            if (this.options.autoProcessQueue) return setTimeout(()=>this.processQueue()\n            , 0); // Deferring the call\n        } else throw new Error(\"This file can't be queued because it has already been processed or was rejected.\");\n    }\n    _enqueueThumbnail(file) {\n        if (this.options.createImageThumbnails && file.type.match(/image.*/) && file.size <= this.options.maxThumbnailFilesize * 1048576) {\n            this._thumbnailQueue.push(file);\n            return setTimeout(()=>this._processThumbnailQueue()\n            , 0); // Deferring the call\n        }\n    }\n    _processThumbnailQueue() {\n        if (this._processingThumbnail || this._thumbnailQueue.length === 0) return;\n        this._processingThumbnail = true;\n        let file = this._thumbnailQueue.shift();\n        return this.createThumbnail(file, this.options.thumbnailWidth, this.options.thumbnailHeight, this.options.thumbnailMethod, true, (dataUrl)=>{\n            this.emit(\"thumbnail\", file, dataUrl);\n            this._processingThumbnail = false;\n            return this._processThumbnailQueue();\n        });\n    }\n    // Can be called by the user to remove a file\n    removeFile(file) {\n        if (file.status === $3ed269f2f0fb224b$export$2e2bcd8739ae039.UPLOADING) this.cancelUpload(file);\n        this.files = $3ed269f2f0fb224b$var$without(this.files, file);\n        this.emit(\"removedfile\", file);\n        if (this.files.length === 0) return this.emit(\"reset\");\n    }\n    // Removes all files that aren't currently processed from the list\n    removeAllFiles(cancelIfNecessary) {\n        // Create a copy of files since removeFile() changes the @files array.\n        if (cancelIfNecessary == null) cancelIfNecessary = false;\n        for (let file of this.files.slice())if (file.status !== $3ed269f2f0fb224b$export$2e2bcd8739ae039.UPLOADING || cancelIfNecessary) this.removeFile(file);\n        return null;\n    }\n    // Resizes an image before it gets sent to the server. This function is the default behavior of\n    // `options.transformFile` if `resizeWidth` or `resizeHeight` are set. The callback is invoked with\n    // the resized blob.\n    resizeImage(file, width, height, resizeMethod, callback) {\n        return this.createThumbnail(file, width, height, resizeMethod, true, (dataUrl, canvas)=>{\n            if (canvas == null) // The image has not been resized\n            return callback(file);\n            else {\n                let { resizeMimeType: resizeMimeType  } = this.options;\n                if (resizeMimeType == null) resizeMimeType = file.type;\n                let resizedDataURL = canvas.toDataURL(resizeMimeType, this.options.resizeQuality);\n                if (resizeMimeType === \"image/jpeg\" || resizeMimeType === \"image/jpg\") // Now add the original EXIF information\n                resizedDataURL = $3ed269f2f0fb224b$var$ExifRestore.restore(file.dataURL, resizedDataURL);\n                return callback($3ed269f2f0fb224b$export$2e2bcd8739ae039.dataURItoBlob(resizedDataURL));\n            }\n        });\n    }\n    createThumbnail(file, width, height, resizeMethod, fixOrientation, callback) {\n        let fileReader = new FileReader();\n        fileReader.onload = ()=>{\n            file.dataURL = fileReader.result;\n            // Don't bother creating a thumbnail for SVG images since they're vector\n            if (file.type === \"image/svg+xml\") {\n                if (callback != null) callback(fileReader.result);\n                return;\n            }\n            this.createThumbnailFromUrl(file, width, height, resizeMethod, fixOrientation, callback);\n        };\n        fileReader.readAsDataURL(file);\n    }\n    // `mockFile` needs to have these attributes:\n    //\n    //     { name: 'name', size: 12345, imageUrl: '' }\n    //\n    // `callback` will be invoked when the image has been downloaded and displayed.\n    // `crossOrigin` will be added to the `img` tag when accessing the file.\n    displayExistingFile(mockFile, imageUrl, callback, crossOrigin, resizeThumbnail = true) {\n        this.emit(\"addedfile\", mockFile);\n        this.emit(\"complete\", mockFile);\n        if (!resizeThumbnail) {\n            this.emit(\"thumbnail\", mockFile, imageUrl);\n            if (callback) callback();\n        } else {\n            let onDone = (thumbnail)=>{\n                this.emit(\"thumbnail\", mockFile, thumbnail);\n                if (callback) callback();\n            };\n            mockFile.dataURL = imageUrl;\n            this.createThumbnailFromUrl(mockFile, this.options.thumbnailWidth, this.options.thumbnailHeight, this.options.thumbnailMethod, this.options.fixOrientation, onDone, crossOrigin);\n        }\n    }\n    createThumbnailFromUrl(file, width, height, resizeMethod, fixOrientation, callback, crossOrigin) {\n        // Not using `new Image` here because of a bug in latest Chrome versions.\n        // See https://github.com/enyo/dropzone/pull/226\n        let img = document.createElement(\"img\");\n        if (crossOrigin) img.crossOrigin = crossOrigin;\n        // fixOrientation is not needed anymore with browsers handling imageOrientation\n        fixOrientation = getComputedStyle(document.body)[\"imageOrientation\"] == \"from-image\" ? false : fixOrientation;\n        img.onload = ()=>{\n            let loadExif = (callback)=>callback(1)\n            ;\n            if (typeof EXIF !== \"undefined\" && EXIF !== null && fixOrientation) loadExif = (callback)=>EXIF.getData(img, function() {\n                    return callback(EXIF.getTag(this, \"Orientation\"));\n                })\n            ;\n            return loadExif((orientation)=>{\n                file.width = img.width;\n                file.height = img.height;\n                let resizeInfo = this.options.resize.call(this, file, width, height, resizeMethod);\n                let canvas = document.createElement(\"canvas\");\n                let ctx = canvas.getContext(\"2d\");\n                canvas.width = resizeInfo.trgWidth;\n                canvas.height = resizeInfo.trgHeight;\n                if (orientation > 4) {\n                    canvas.width = resizeInfo.trgHeight;\n                    canvas.height = resizeInfo.trgWidth;\n                }\n                switch(orientation){\n                    case 2:\n                        // horizontal flip\n                        ctx.translate(canvas.width, 0);\n                        ctx.scale(-1, 1);\n                        break;\n                    case 3:\n                        // 180° rotate left\n                        ctx.translate(canvas.width, canvas.height);\n                        ctx.rotate(Math.PI);\n                        break;\n                    case 4:\n                        // vertical flip\n                        ctx.translate(0, canvas.height);\n                        ctx.scale(1, -1);\n                        break;\n                    case 5:\n                        // vertical flip + 90 rotate right\n                        ctx.rotate(0.5 * Math.PI);\n                        ctx.scale(1, -1);\n                        break;\n                    case 6:\n                        // 90° rotate right\n                        ctx.rotate(0.5 * Math.PI);\n                        ctx.translate(0, -canvas.width);\n                        break;\n                    case 7:\n                        // horizontal flip + 90 rotate right\n                        ctx.rotate(0.5 * Math.PI);\n                        ctx.translate(canvas.height, -canvas.width);\n                        ctx.scale(-1, 1);\n                        break;\n                    case 8:\n                        // 90° rotate left\n                        ctx.rotate(-0.5 * Math.PI);\n                        ctx.translate(-canvas.height, 0);\n                        break;\n                }\n                // This is a bugfix for iOS' scaling bug.\n                $3ed269f2f0fb224b$var$drawImageIOSFix(ctx, img, resizeInfo.srcX != null ? resizeInfo.srcX : 0, resizeInfo.srcY != null ? resizeInfo.srcY : 0, resizeInfo.srcWidth, resizeInfo.srcHeight, resizeInfo.trgX != null ? resizeInfo.trgX : 0, resizeInfo.trgY != null ? resizeInfo.trgY : 0, resizeInfo.trgWidth, resizeInfo.trgHeight);\n                let thumbnail = canvas.toDataURL(\"image/png\");\n                if (callback != null) return callback(thumbnail, canvas);\n            });\n        };\n        if (callback != null) img.onerror = callback;\n        return img.src = file.dataURL;\n    }\n    // Goes through the queue and processes files if there aren't too many already.\n    processQueue() {\n        let { parallelUploads: parallelUploads  } = this.options;\n        let processingLength = this.getUploadingFiles().length;\n        let i = processingLength;\n        // There are already at least as many files uploading than should be\n        if (processingLength >= parallelUploads) return;\n        let queuedFiles = this.getQueuedFiles();\n        if (!(queuedFiles.length > 0)) return;\n        if (this.options.uploadMultiple) // The files should be uploaded in one request\n        return this.processFiles(queuedFiles.slice(0, parallelUploads - processingLength));\n        else while(i < parallelUploads){\n            if (!queuedFiles.length) return;\n             // Nothing left to process\n            this.processFile(queuedFiles.shift());\n            i++;\n        }\n    }\n    // Wrapper for `processFiles`\n    processFile(file) {\n        return this.processFiles([\n            file\n        ]);\n    }\n    // Loads the file, then calls finishedLoading()\n    processFiles(files) {\n        for (let file of files){\n            file.processing = true; // Backwards compatibility\n            file.status = $3ed269f2f0fb224b$export$2e2bcd8739ae039.UPLOADING;\n            this.emit(\"processing\", file);\n        }\n        if (this.options.uploadMultiple) this.emit(\"processingmultiple\", files);\n        return this.uploadFiles(files);\n    }\n    _getFilesWithXhr(xhr) {\n        let files;\n        return files = this.files.filter((file)=>file.xhr === xhr\n        ).map((file)=>file\n        );\n    }\n    // Cancels the file upload and sets the status to CANCELED\n    // **if** the file is actually being uploaded.\n    // If it's still in the queue, the file is being removed from it and the status\n    // set to CANCELED.\n    cancelUpload(file) {\n        if (file.status === $3ed269f2f0fb224b$export$2e2bcd8739ae039.UPLOADING) {\n            let groupedFiles = this._getFilesWithXhr(file.xhr);\n            for (let groupedFile of groupedFiles)groupedFile.status = $3ed269f2f0fb224b$export$2e2bcd8739ae039.CANCELED;\n            if (typeof file.xhr !== \"undefined\") file.xhr.abort();\n            for (let groupedFile1 of groupedFiles)this.emit(\"canceled\", groupedFile1);\n            if (this.options.uploadMultiple) this.emit(\"canceledmultiple\", groupedFiles);\n        } else if (file.status === $3ed269f2f0fb224b$export$2e2bcd8739ae039.ADDED || file.status === $3ed269f2f0fb224b$export$2e2bcd8739ae039.QUEUED) {\n            file.status = $3ed269f2f0fb224b$export$2e2bcd8739ae039.CANCELED;\n            this.emit(\"canceled\", file);\n            if (this.options.uploadMultiple) this.emit(\"canceledmultiple\", [\n                file\n            ]);\n        }\n        if (this.options.autoProcessQueue) return this.processQueue();\n    }\n    resolveOption(option, ...args) {\n        if (typeof option === \"function\") return option.apply(this, args);\n        return option;\n    }\n    uploadFile(file) {\n        return this.uploadFiles([\n            file\n        ]);\n    }\n    uploadFiles(files) {\n        this._transformFiles(files, (transformedFiles)=>{\n            if (this.options.chunking) {\n                // Chunking is not allowed to be used with `uploadMultiple` so we know\n                // that there is only __one__file.\n                let transformedFile = transformedFiles[0];\n                files[0].upload.chunked = this.options.chunking && (this.options.forceChunking || transformedFile.size > this.options.chunkSize);\n                files[0].upload.totalChunkCount = Math.ceil(transformedFile.size / this.options.chunkSize);\n            }\n            if (files[0].upload.chunked) {\n                // This file should be sent in chunks!\n                // If the chunking option is set, we **know** that there can only be **one** file, since\n                // uploadMultiple is not allowed with this option.\n                let file = files[0];\n                let transformedFile = transformedFiles[0];\n                let startedChunkCount = 0;\n                file.upload.chunks = [];\n                let handleNextChunk = ()=>{\n                    let chunkIndex = 0;\n                    // Find the next item in file.upload.chunks that is not defined yet.\n                    while(file.upload.chunks[chunkIndex] !== undefined)chunkIndex++;\n                    // This means, that all chunks have already been started.\n                    if (chunkIndex >= file.upload.totalChunkCount) return;\n                    startedChunkCount++;\n                    let start = chunkIndex * this.options.chunkSize;\n                    let end = Math.min(start + this.options.chunkSize, transformedFile.size);\n                    let dataBlock = {\n                        name: this._getParamName(0),\n                        data: transformedFile.webkitSlice ? transformedFile.webkitSlice(start, end) : transformedFile.slice(start, end),\n                        filename: file.upload.filename,\n                        chunkIndex: chunkIndex\n                    };\n                    file.upload.chunks[chunkIndex] = {\n                        file: file,\n                        index: chunkIndex,\n                        dataBlock: dataBlock,\n                        status: $3ed269f2f0fb224b$export$2e2bcd8739ae039.UPLOADING,\n                        progress: 0,\n                        retries: 0\n                    };\n                    this._uploadData(files, [\n                        dataBlock\n                    ]);\n                };\n                file.upload.finishedChunkUpload = (chunk, response)=>{\n                    let allFinished = true;\n                    chunk.status = $3ed269f2f0fb224b$export$2e2bcd8739ae039.SUCCESS;\n                    // Clear the data from the chunk\n                    chunk.dataBlock = null;\n                    chunk.response = chunk.xhr.responseText;\n                    chunk.responseHeaders = chunk.xhr.getAllResponseHeaders();\n                    // Leaving this reference to xhr will cause memory leaks.\n                    chunk.xhr = null;\n                    for(let i = 0; i < file.upload.totalChunkCount; i++){\n                        if (file.upload.chunks[i] === undefined) return handleNextChunk();\n                        if (file.upload.chunks[i].status !== $3ed269f2f0fb224b$export$2e2bcd8739ae039.SUCCESS) allFinished = false;\n                    }\n                    if (allFinished) this.options.chunksUploaded(file, ()=>{\n                        this._finished(files, response, null);\n                    });\n                };\n                if (this.options.parallelChunkUploads) for(let i = 0; i < file.upload.totalChunkCount; i++)handleNextChunk();\n                else handleNextChunk();\n            } else {\n                let dataBlocks = [];\n                for(let i = 0; i < files.length; i++)dataBlocks[i] = {\n                    name: this._getParamName(i),\n                    data: transformedFiles[i],\n                    filename: files[i].upload.filename\n                };\n                this._uploadData(files, dataBlocks);\n            }\n        });\n    }\n    /// Returns the right chunk for given file and xhr\n    _getChunk(file, xhr) {\n        for(let i = 0; i < file.upload.totalChunkCount; i++){\n            if (file.upload.chunks[i] !== undefined && file.upload.chunks[i].xhr === xhr) return file.upload.chunks[i];\n        }\n    }\n    // This function actually uploads the file(s) to the server.\n    //\n    //  If dataBlocks contains the actual data to upload (meaning, that this could\n    // either be transformed files, or individual chunks for chunked upload) then\n    // they will be used for the actual data to upload.\n    _uploadData(files, dataBlocks) {\n        let xhr = new XMLHttpRequest();\n        // Put the xhr object in the file objects to be able to reference it later.\n        for (let file of files)file.xhr = xhr;\n        if (files[0].upload.chunked) // Put the xhr object in the right chunk object, so it can be associated\n        // later, and found with _getChunk.\n        files[0].upload.chunks[dataBlocks[0].chunkIndex].xhr = xhr;\n        let method = this.resolveOption(this.options.method, files, dataBlocks);\n        let url = this.resolveOption(this.options.url, files, dataBlocks);\n        xhr.open(method, url, true);\n        // Setting the timeout after open because of IE11 issue: https://gitlab.com/meno/dropzone/issues/8\n        let timeout = this.resolveOption(this.options.timeout, files);\n        if (timeout) xhr.timeout = this.resolveOption(this.options.timeout, files);\n        // Has to be after `.open()`. See https://github.com/enyo/dropzone/issues/179\n        xhr.withCredentials = !!this.options.withCredentials;\n        xhr.onload = (e)=>{\n            this._finishedUploading(files, xhr, e);\n        };\n        xhr.ontimeout = ()=>{\n            this._handleUploadError(files, xhr, `Request timedout after ${this.options.timeout / 1000} seconds`);\n        };\n        xhr.onerror = ()=>{\n            this._handleUploadError(files, xhr);\n        };\n        // Some browsers do not have the .upload property\n        let progressObj = xhr.upload != null ? xhr.upload : xhr;\n        progressObj.onprogress = (e)=>this._updateFilesUploadProgress(files, xhr, e)\n        ;\n        let headers = this.options.defaultHeaders ? {\n            Accept: \"application/json\",\n            \"Cache-Control\": \"no-cache\",\n            \"X-Requested-With\": \"XMLHttpRequest\"\n        } : {\n        };\n        if (this.options.binaryBody) headers[\"Content-Type\"] = files[0].type;\n        if (this.options.headers) $ewBKy$justextend(headers, this.options.headers);\n        for(let headerName in headers){\n            let headerValue = headers[headerName];\n            if (headerValue) xhr.setRequestHeader(headerName, headerValue);\n        }\n        if (this.options.binaryBody) {\n            // Since the file is going to be sent as binary body, it doesn't make\n            // any sense to generate `FormData` for it.\n            for (let file of files)this.emit(\"sending\", file, xhr);\n            if (this.options.uploadMultiple) this.emit(\"sendingmultiple\", files, xhr);\n            this.submitRequest(xhr, null, files);\n        } else {\n            let formData = new FormData();\n            // Adding all @options parameters\n            if (this.options.params) {\n                let additionalParams = this.options.params;\n                if (typeof additionalParams === \"function\") additionalParams = additionalParams.call(this, files, xhr, files[0].upload.chunked ? this._getChunk(files[0], xhr) : null);\n                for(let key in additionalParams){\n                    let value = additionalParams[key];\n                    if (Array.isArray(value)) // The additional parameter contains an array,\n                    // so lets iterate over it to attach each value\n                    // individually.\n                    for(let i = 0; i < value.length; i++)formData.append(key, value[i]);\n                    else formData.append(key, value);\n                }\n            }\n            // Let the user add additional data if necessary\n            for (let file of files)this.emit(\"sending\", file, xhr, formData);\n            if (this.options.uploadMultiple) this.emit(\"sendingmultiple\", files, xhr, formData);\n            this._addFormElementData(formData);\n            // Finally add the files\n            // Has to be last because some servers (eg: S3) expect the file to be the last parameter\n            for(let i = 0; i < dataBlocks.length; i++){\n                let dataBlock = dataBlocks[i];\n                formData.append(dataBlock.name, dataBlock.data, dataBlock.filename);\n            }\n            this.submitRequest(xhr, formData, files);\n        }\n    }\n    // Transforms all files with this.options.transformFile and invokes done with the transformed files when done.\n    _transformFiles(files, done) {\n        let transformedFiles = [];\n        // Clumsy way of handling asynchronous calls, until I get to add a proper Future library.\n        let doneCounter = 0;\n        for(let i = 0; i < files.length; i++)this.options.transformFile.call(this, files[i], (transformedFile)=>{\n            transformedFiles[i] = transformedFile;\n            if (++doneCounter === files.length) done(transformedFiles);\n        });\n    }\n    // Takes care of adding other input elements of the form to the AJAX request\n    _addFormElementData(formData) {\n        // Take care of other input elements\n        if (this.element.tagName === \"FORM\") for (let input of this.element.querySelectorAll(\"input, textarea, select, button\")){\n            let inputName = input.getAttribute(\"name\");\n            let inputType = input.getAttribute(\"type\");\n            if (inputType) inputType = inputType.toLowerCase();\n            // If the input doesn't have a name, we can't use it.\n            if (typeof inputName === \"undefined\" || inputName === null) continue;\n            if (input.tagName === \"SELECT\" && input.hasAttribute(\"multiple\")) {\n                // Possibly multiple values\n                for (let option of input.options)if (option.selected) formData.append(inputName, option.value);\n            } else if (!inputType || inputType !== \"checkbox\" && inputType !== \"radio\" || input.checked) formData.append(inputName, input.value);\n        }\n    }\n    // Invoked when there is new progress information about given files.\n    // If e is not provided, it is assumed that the upload is finished.\n    _updateFilesUploadProgress(files, xhr, e) {\n        if (!files[0].upload.chunked) // Handle file uploads without chunking\n        for (let file of files){\n            if (file.upload.total && file.upload.bytesSent && file.upload.bytesSent == file.upload.total) continue;\n            if (e) {\n                file.upload.progress = 100 * e.loaded / e.total;\n                file.upload.total = e.total;\n                file.upload.bytesSent = e.loaded;\n            } else {\n                // No event, so we're at 100%\n                file.upload.progress = 100;\n                file.upload.bytesSent = file.upload.total;\n            }\n            this.emit(\"uploadprogress\", file, file.upload.progress, file.upload.bytesSent);\n        }\n        else {\n            // Handle chunked file uploads\n            // Chunked upload is not compatible with uploading multiple files in one\n            // request, so we know there's only one file.\n            let file = files[0];\n            // Since this is a chunked upload, we need to update the appropriate chunk\n            // progress.\n            let chunk = this._getChunk(file, xhr);\n            if (e) {\n                chunk.progress = 100 * e.loaded / e.total;\n                chunk.total = e.total;\n                chunk.bytesSent = e.loaded;\n            } else {\n                // No event, so we're at 100%\n                chunk.progress = 100;\n                chunk.bytesSent = chunk.total;\n            }\n            // Now tally the *file* upload progress from its individual chunks\n            file.upload.progress = 0;\n            file.upload.total = 0;\n            file.upload.bytesSent = 0;\n            for(let i = 0; i < file.upload.totalChunkCount; i++)if (file.upload.chunks[i] && typeof file.upload.chunks[i].progress !== \"undefined\") {\n                file.upload.progress += file.upload.chunks[i].progress;\n                file.upload.total += file.upload.chunks[i].total;\n                file.upload.bytesSent += file.upload.chunks[i].bytesSent;\n            }\n            // Since the process is a percentage, we need to divide by the amount of\n            // chunks we've used.\n            file.upload.progress = file.upload.progress / file.upload.totalChunkCount;\n            this.emit(\"uploadprogress\", file, file.upload.progress, file.upload.bytesSent);\n        }\n    }\n    _finishedUploading(files, xhr, e) {\n        let response;\n        if (files[0].status === $3ed269f2f0fb224b$export$2e2bcd8739ae039.CANCELED) return;\n        if (xhr.readyState !== 4) return;\n        if (xhr.responseType !== \"arraybuffer\" && xhr.responseType !== \"blob\") {\n            response = xhr.responseText;\n            if (xhr.getResponseHeader(\"content-type\") && ~xhr.getResponseHeader(\"content-type\").indexOf(\"application/json\")) try {\n                response = JSON.parse(response);\n            } catch (error) {\n                e = error;\n                response = \"Invalid JSON response from server.\";\n            }\n        }\n        this._updateFilesUploadProgress(files, xhr);\n        if (!(200 <= xhr.status && xhr.status < 300)) this._handleUploadError(files, xhr, response);\n        else if (files[0].upload.chunked) files[0].upload.finishedChunkUpload(this._getChunk(files[0], xhr), response);\n        else this._finished(files, response, e);\n    }\n    _handleUploadError(files, xhr, response) {\n        if (files[0].status === $3ed269f2f0fb224b$export$2e2bcd8739ae039.CANCELED) return;\n        if (files[0].upload.chunked && this.options.retryChunks) {\n            let chunk = this._getChunk(files[0], xhr);\n            if ((chunk.retries++) < this.options.retryChunksLimit) {\n                this._uploadData(files, [\n                    chunk.dataBlock\n                ]);\n                return;\n            } else console.warn(\"Retried this chunk too often. Giving up.\");\n        }\n        this._errorProcessing(files, response || this.options.dictResponseError.replace(\"{{statusCode}}\", xhr.status), xhr);\n    }\n    submitRequest(xhr, formData, files) {\n        if (xhr.readyState != 1) {\n            console.warn(\"Cannot send this request because the XMLHttpRequest.readyState is not OPENED.\");\n            return;\n        }\n        if (this.options.binaryBody) {\n            if (files[0].upload.chunked) {\n                const chunk = this._getChunk(files[0], xhr);\n                xhr.send(chunk.dataBlock.data);\n            } else xhr.send(files[0]);\n        } else xhr.send(formData);\n    }\n    // Called internally when processing is finished.\n    // Individual callbacks have to be called in the appropriate sections.\n    _finished(files, responseText, e) {\n        for (let file of files){\n            file.status = $3ed269f2f0fb224b$export$2e2bcd8739ae039.SUCCESS;\n            this.emit(\"success\", file, responseText, e);\n            this.emit(\"complete\", file);\n        }\n        if (this.options.uploadMultiple) {\n            this.emit(\"successmultiple\", files, responseText, e);\n            this.emit(\"completemultiple\", files);\n        }\n        if (this.options.autoProcessQueue) return this.processQueue();\n    }\n    // Called internally when processing is finished.\n    // Individual callbacks have to be called in the appropriate sections.\n    _errorProcessing(files, message, xhr) {\n        for (let file of files){\n            file.status = $3ed269f2f0fb224b$export$2e2bcd8739ae039.ERROR;\n            this.emit(\"error\", file, message, xhr);\n            this.emit(\"complete\", file);\n        }\n        if (this.options.uploadMultiple) {\n            this.emit(\"errormultiple\", files, message, xhr);\n            this.emit(\"completemultiple\", files);\n        }\n        if (this.options.autoProcessQueue) return this.processQueue();\n    }\n    static uuidv4() {\n        return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, function(c) {\n            let r = Math.random() * 16 | 0, v = c === \"x\" ? r : r & 3 | 8;\n            return v.toString(16);\n        });\n    }\n    constructor(el, options){\n        super();\n        let fallback, left;\n        this.element = el;\n        this.clickableElements = [];\n        this.listeners = [];\n        this.files = []; // All files\n        if (typeof this.element === \"string\") this.element = document.querySelector(this.element);\n        // Not checking if instance of HTMLElement or Element since IE9 is extremely weird.\n        if (!this.element || this.element.nodeType == null) throw new Error(\"Invalid dropzone element.\");\n        if (this.element.dropzone) throw new Error(\"Dropzone already attached.\");\n        // Now add this dropzone to the instances.\n        $3ed269f2f0fb224b$export$2e2bcd8739ae039.instances.push(this);\n        // Put the dropzone inside the element itself.\n        this.element.dropzone = this;\n        let elementOptions = (left = $3ed269f2f0fb224b$export$2e2bcd8739ae039.optionsForElement(this.element)) != null ? left : {\n        };\n        this.options = $ewBKy$justextend(true, {\n        }, $4ca367182776f80b$export$2e2bcd8739ae039, elementOptions, options != null ? options : {\n        });\n        this.options.previewTemplate = this.options.previewTemplate.replace(/\\n*/g, \"\");\n        // If the browser failed, just call the fallback and leave\n        if (this.options.forceFallback || !$3ed269f2f0fb224b$export$2e2bcd8739ae039.isBrowserSupported()) return this.options.fallback.call(this);\n        // @options.url = @element.getAttribute \"action\" unless @options.url?\n        if (this.options.url == null) this.options.url = this.element.getAttribute(\"action\");\n        if (!this.options.url) throw new Error(\"No URL provided.\");\n        if (this.options.acceptedFiles && this.options.acceptedMimeTypes) throw new Error(\"You can't provide both 'acceptedFiles' and 'acceptedMimeTypes'. 'acceptedMimeTypes' is deprecated.\");\n        if (this.options.uploadMultiple && this.options.chunking) throw new Error(\"You cannot set both: uploadMultiple and chunking.\");\n        if (this.options.binaryBody && this.options.uploadMultiple) throw new Error(\"You cannot set both: binaryBody and uploadMultiple.\");\n        // Backwards compatibility\n        if (this.options.acceptedMimeTypes) {\n            this.options.acceptedFiles = this.options.acceptedMimeTypes;\n            delete this.options.acceptedMimeTypes;\n        }\n        // Backwards compatibility\n        if (this.options.renameFilename != null) this.options.renameFile = (file)=>this.options.renameFilename.call(this, file.name, file)\n        ;\n        if (typeof this.options.method === \"string\") this.options.method = this.options.method.toUpperCase();\n        if ((fallback = this.getExistingFallback()) && fallback.parentNode) // Remove the fallback\n        fallback.parentNode.removeChild(fallback);\n        // Display previews in the previewsContainer element or the Dropzone element unless explicitly set to false\n        if (this.options.previewsContainer !== false) {\n            if (this.options.previewsContainer) this.previewsContainer = $3ed269f2f0fb224b$export$2e2bcd8739ae039.getElement(this.options.previewsContainer, \"previewsContainer\");\n            else this.previewsContainer = this.element;\n        }\n        if (this.options.clickable) {\n            if (this.options.clickable === true) this.clickableElements = [\n                this.element\n            ];\n            else this.clickableElements = $3ed269f2f0fb224b$export$2e2bcd8739ae039.getElements(this.options.clickable, \"clickable\");\n        }\n        this.init();\n    }\n}\n$3ed269f2f0fb224b$export$2e2bcd8739ae039.initClass();\n// This is a map of options for your different dropzones. Add configurations\n// to this object for your different dropzone elemens.\n//\n// Example:\n//\n//     Dropzone.options.myDropzoneElementId = { maxFilesize: 1 };\n//\n// And in html:\n//\n//     <form action=\"/upload\" id=\"my-dropzone-element-id\" class=\"dropzone\"></form>\n$3ed269f2f0fb224b$export$2e2bcd8739ae039.options = {\n};\n// Returns the options for an element or undefined if none available.\n$3ed269f2f0fb224b$export$2e2bcd8739ae039.optionsForElement = function(element) {\n    // Get the `Dropzone.options.elementId` for this element if it exists\n    if (element.getAttribute(\"id\")) return $3ed269f2f0fb224b$export$2e2bcd8739ae039.options[$3ed269f2f0fb224b$var$camelize(element.getAttribute(\"id\"))];\n    else return undefined;\n};\n// Holds a list of all dropzone instances\n$3ed269f2f0fb224b$export$2e2bcd8739ae039.instances = [];\n// Returns the dropzone for given element if any\n$3ed269f2f0fb224b$export$2e2bcd8739ae039.forElement = function(element) {\n    if (typeof element === \"string\") element = document.querySelector(element);\n    if ((element != null ? element.dropzone : undefined) == null) throw new Error(\"No Dropzone found for given element. This is probably because you're trying to access it before Dropzone had the time to initialize. Use the `init` option to setup any additional observers on your Dropzone.\");\n    return element.dropzone;\n};\n// Looks for all .dropzone elements and creates a dropzone for them\n$3ed269f2f0fb224b$export$2e2bcd8739ae039.discover = function() {\n    let dropzones;\n    if (document.querySelectorAll) dropzones = document.querySelectorAll(\".dropzone\");\n    else {\n        dropzones = [];\n        // IE :(\n        let checkElements = (elements)=>(()=>{\n                let result = [];\n                for (let el of elements)if (/(^| )dropzone($| )/.test(el.className)) result.push(dropzones.push(el));\n                else result.push(undefined);\n                return result;\n            })()\n        ;\n        checkElements(document.getElementsByTagName(\"div\"));\n        checkElements(document.getElementsByTagName(\"form\"));\n    }\n    return (()=>{\n        let result = [];\n        for (let dropzone of dropzones)// Create a dropzone unless auto discover has been disabled for specific element\n        if ($3ed269f2f0fb224b$export$2e2bcd8739ae039.optionsForElement(dropzone) !== false) result.push(new $3ed269f2f0fb224b$export$2e2bcd8739ae039(dropzone));\n        else result.push(undefined);\n        return result;\n    })();\n};\n// Some browsers support drag and drog functionality, but not correctly.\n//\n// So I created a blocklist of userAgents. Yes, yes. Browser sniffing, I know.\n// But what to do when browsers *theoretically* support an API, but crash\n// when using it.\n//\n// This is a list of regular expressions tested against navigator.userAgent\n//\n// ** It should only be used on browser that *do* support the API, but\n// incorrectly **\n$3ed269f2f0fb224b$export$2e2bcd8739ae039.blockedBrowsers = [\n    // The mac os and windows phone version of opera 12 seems to have a problem with the File drag'n'drop API.\n    /opera.*(Macintosh|Windows Phone).*version\\/12/i, \n];\n// Checks if the browser is supported\n$3ed269f2f0fb224b$export$2e2bcd8739ae039.isBrowserSupported = function() {\n    let capableBrowser = true;\n    if (window.File && window.FileReader && window.FileList && window.Blob && window.FormData && document.querySelector) {\n        if (!(\"classList\" in document.createElement(\"a\"))) capableBrowser = false;\n        else {\n            if ($3ed269f2f0fb224b$export$2e2bcd8739ae039.blacklistedBrowsers !== undefined) // Since this has been renamed, this makes sure we don't break older\n            // configuration.\n            $3ed269f2f0fb224b$export$2e2bcd8739ae039.blockedBrowsers = $3ed269f2f0fb224b$export$2e2bcd8739ae039.blacklistedBrowsers;\n            // The browser supports the API, but may be blocked.\n            for (let regex of $3ed269f2f0fb224b$export$2e2bcd8739ae039.blockedBrowsers)if (regex.test(navigator.userAgent)) {\n                capableBrowser = false;\n                continue;\n            }\n        }\n    } else capableBrowser = false;\n    return capableBrowser;\n};\n$3ed269f2f0fb224b$export$2e2bcd8739ae039.dataURItoBlob = function(dataURI) {\n    // convert base64 to raw binary data held in a string\n    // doesn't handle URLEncoded DataURIs - see SO answer #6850276 for code that does this\n    let byteString = atob(dataURI.split(\",\")[1]);\n    // separate out the mime component\n    let mimeString = dataURI.split(\",\")[0].split(\":\")[1].split(\";\")[0];\n    // write the bytes of the string to an ArrayBuffer\n    let ab = new ArrayBuffer(byteString.length);\n    let ia = new Uint8Array(ab);\n    for(let i = 0, end = byteString.length, asc = 0 <= end; asc ? i <= end : i >= end; asc ? i++ : i--)ia[i] = byteString.charCodeAt(i);\n    // write the ArrayBuffer to a blob\n    return new Blob([\n        ab\n    ], {\n        type: mimeString\n    });\n};\n// Returns an array without the rejected item\nconst $3ed269f2f0fb224b$var$without = (list, rejectedItem)=>list.filter((item)=>item !== rejectedItem\n    ).map((item)=>item\n    )\n;\n// abc-def_ghi -> abcDefGhi\nconst $3ed269f2f0fb224b$var$camelize = (str)=>str.replace(/[\\-_](\\w)/g, (match)=>match.charAt(1).toUpperCase()\n    )\n;\n// Creates an element from string\n$3ed269f2f0fb224b$export$2e2bcd8739ae039.createElement = function(string) {\n    let div = document.createElement(\"div\");\n    div.innerHTML = string;\n    return div.childNodes[0];\n};\n// Tests if given element is inside (or simply is) the container\n$3ed269f2f0fb224b$export$2e2bcd8739ae039.elementInside = function(element, container) {\n    if (element === container) return true;\n     // Coffeescript doesn't support do/while loops\n    while(element = element.parentNode){\n        if (element === container) return true;\n    }\n    return false;\n};\n$3ed269f2f0fb224b$export$2e2bcd8739ae039.getElement = function(el, name) {\n    let element;\n    if (typeof el === \"string\") element = document.querySelector(el);\n    else if (el.nodeType != null) element = el;\n    if (element == null) throw new Error(`Invalid \\`${name}\\` option provided. Please provide a CSS selector or a plain HTML element.`);\n    return element;\n};\n$3ed269f2f0fb224b$export$2e2bcd8739ae039.getElements = function(els, name) {\n    let el, elements;\n    if (els instanceof Array) {\n        elements = [];\n        try {\n            for (el of els)elements.push(this.getElement(el, name));\n        } catch (e) {\n            elements = null;\n        }\n    } else if (typeof els === \"string\") {\n        elements = [];\n        for (el of document.querySelectorAll(els))elements.push(el);\n    } else if (els.nodeType != null) elements = [\n        els\n    ];\n    if (elements == null || !elements.length) throw new Error(`Invalid \\`${name}\\` option provided. Please provide a CSS selector, a plain HTML element or a list of those.`);\n    return elements;\n};\n// Asks the user the question and calls accepted or rejected accordingly\n//\n// The default implementation just uses `window.confirm` and then calls the\n// appropriate callback.\n$3ed269f2f0fb224b$export$2e2bcd8739ae039.confirm = function(question, accepted, rejected) {\n    if (window.confirm(question)) return accepted();\n    else if (rejected != null) return rejected();\n};\n// Validates the mime type like this:\n//\n// https://developer.mozilla.org/en-US/docs/HTML/Element/input#attr-accept\n$3ed269f2f0fb224b$export$2e2bcd8739ae039.isValidFile = function(file, acceptedFiles) {\n    if (!acceptedFiles) return true;\n     // If there are no accepted mime types, it's OK\n    acceptedFiles = acceptedFiles.split(\",\");\n    let mimeType = file.type;\n    let baseMimeType = mimeType.replace(/\\/.*$/, \"\");\n    for (let validType of acceptedFiles){\n        validType = validType.trim();\n        if (validType.charAt(0) === \".\") {\n            if (file.name.toLowerCase().indexOf(validType.toLowerCase(), file.name.length - validType.length) !== -1) return true;\n        } else if (/\\/\\*$/.test(validType)) {\n            // This is something like a image/* mime type\n            if (baseMimeType === validType.replace(/\\/.*$/, \"\")) return true;\n        } else {\n            if (mimeType === validType) return true;\n        }\n    }\n    return false;\n};\n// Augment jQuery\nif (typeof jQuery !== \"undefined\" && jQuery !== null) jQuery.fn.dropzone = function(options) {\n    return this.each(function() {\n        return new $3ed269f2f0fb224b$export$2e2bcd8739ae039(this, options);\n    });\n};\n// Dropzone file status codes\n$3ed269f2f0fb224b$export$2e2bcd8739ae039.ADDED = \"added\";\n$3ed269f2f0fb224b$export$2e2bcd8739ae039.QUEUED = \"queued\";\n// For backwards compatibility. Now, if a file is accepted, it's either queued\n// or uploading.\n$3ed269f2f0fb224b$export$2e2bcd8739ae039.ACCEPTED = $3ed269f2f0fb224b$export$2e2bcd8739ae039.QUEUED;\n$3ed269f2f0fb224b$export$2e2bcd8739ae039.UPLOADING = \"uploading\";\n$3ed269f2f0fb224b$export$2e2bcd8739ae039.PROCESSING = $3ed269f2f0fb224b$export$2e2bcd8739ae039.UPLOADING; // alias\n$3ed269f2f0fb224b$export$2e2bcd8739ae039.CANCELED = \"canceled\";\n$3ed269f2f0fb224b$export$2e2bcd8739ae039.ERROR = \"error\";\n$3ed269f2f0fb224b$export$2e2bcd8739ae039.SUCCESS = \"success\";\n/*\n\n Bugfix for iOS 6 and 7\n Source: http://stackoverflow.com/questions/11929099/html5-canvas-drawimage-ratio-bug-ios\n based on the work of https://github.com/stomita/ios-imagefile-megapixel\n\n */ // Detecting vertical squash in loaded image.\n// Fixes a bug which squash image vertically while drawing into canvas for some images.\n// This is a bug in iOS6 devices. This function from https://github.com/stomita/ios-imagefile-megapixel\nlet $3ed269f2f0fb224b$var$detectVerticalSquash = function(img) {\n    let iw = img.naturalWidth;\n    let ih = img.naturalHeight;\n    let canvas = document.createElement(\"canvas\");\n    canvas.width = 1;\n    canvas.height = ih;\n    let ctx = canvas.getContext(\"2d\");\n    ctx.drawImage(img, 0, 0);\n    let { data: data  } = ctx.getImageData(1, 0, 1, ih);\n    // search image edge pixel position in case it is squashed vertically.\n    let sy = 0;\n    let ey = ih;\n    let py = ih;\n    while(py > sy){\n        let alpha = data[(py - 1) * 4 + 3];\n        if (alpha === 0) ey = py;\n        else sy = py;\n        py = ey + sy >> 1;\n    }\n    let ratio = py / ih;\n    if (ratio === 0) return 1;\n    else return ratio;\n};\n// A replacement for context.drawImage\n// (args are for source and destination).\nvar $3ed269f2f0fb224b$var$drawImageIOSFix = function(ctx, img, sx, sy, sw, sh, dx, dy, dw, dh) {\n    let vertSquashRatio = $3ed269f2f0fb224b$var$detectVerticalSquash(img);\n    return ctx.drawImage(img, sx, sy, sw, sh, dx, dy, dw, dh / vertSquashRatio);\n};\n// Based on MinifyJpeg\n// Source: http://www.perry.cz/files/ExifRestorer.js\n// http://elicon.blog57.fc2.com/blog-entry-206.html\nclass $3ed269f2f0fb224b$var$ExifRestore {\n    static initClass() {\n        this.KEY_STR = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";\n    }\n    static encode64(input) {\n        let output = \"\";\n        let chr1 = undefined;\n        let chr2 = undefined;\n        let chr3 = \"\";\n        let enc1 = undefined;\n        let enc2 = undefined;\n        let enc3 = undefined;\n        let enc4 = \"\";\n        let i = 0;\n        while(true){\n            chr1 = input[i++];\n            chr2 = input[i++];\n            chr3 = input[i++];\n            enc1 = chr1 >> 2;\n            enc2 = (chr1 & 3) << 4 | chr2 >> 4;\n            enc3 = (chr2 & 15) << 2 | chr3 >> 6;\n            enc4 = chr3 & 63;\n            if (isNaN(chr2)) enc3 = enc4 = 64;\n            else if (isNaN(chr3)) enc4 = 64;\n            output = output + this.KEY_STR.charAt(enc1) + this.KEY_STR.charAt(enc2) + this.KEY_STR.charAt(enc3) + this.KEY_STR.charAt(enc4);\n            chr1 = chr2 = chr3 = \"\";\n            enc1 = enc2 = enc3 = enc4 = \"\";\n            if (!(i < input.length)) break;\n        }\n        return output;\n    }\n    static restore(origFileBase64, resizedFileBase64) {\n        if (!origFileBase64.match(\"data:image/jpeg;base64,\")) return resizedFileBase64;\n        let rawImage = this.decode64(origFileBase64.replace(\"data:image/jpeg;base64,\", \"\"));\n        let segments = this.slice2Segments(rawImage);\n        let image = this.exifManipulation(resizedFileBase64, segments);\n        return `data:image/jpeg;base64,${this.encode64(image)}`;\n    }\n    static exifManipulation(resizedFileBase64, segments) {\n        let exifArray = this.getExifArray(segments);\n        let newImageArray = this.insertExif(resizedFileBase64, exifArray);\n        let aBuffer = new Uint8Array(newImageArray);\n        return aBuffer;\n    }\n    static getExifArray(segments) {\n        let seg = undefined;\n        let x = 0;\n        while(x < segments.length){\n            seg = segments[x];\n            if (seg[0] === 255 & seg[1] === 225) return seg;\n            x++;\n        }\n        return [];\n    }\n    static insertExif(resizedFileBase64, exifArray) {\n        let imageData = resizedFileBase64.replace(\"data:image/jpeg;base64,\", \"\");\n        let buf = this.decode64(imageData);\n        let separatePoint = buf.indexOf(255, 3);\n        let mae = buf.slice(0, separatePoint);\n        let ato = buf.slice(separatePoint);\n        let array = mae;\n        array = array.concat(exifArray);\n        array = array.concat(ato);\n        return array;\n    }\n    static slice2Segments(rawImageArray) {\n        let head = 0;\n        let segments = [];\n        while(true){\n            var length;\n            if (rawImageArray[head] === 255 & rawImageArray[head + 1] === 218) break;\n            if (rawImageArray[head] === 255 & rawImageArray[head + 1] === 216) head += 2;\n            else {\n                length = rawImageArray[head + 2] * 256 + rawImageArray[head + 3];\n                let endPoint = head + length + 2;\n                let seg = rawImageArray.slice(head, endPoint);\n                segments.push(seg);\n                head = endPoint;\n            }\n            if (head > rawImageArray.length) break;\n        }\n        return segments;\n    }\n    static decode64(input) {\n        let output = \"\";\n        let chr1 = undefined;\n        let chr2 = undefined;\n        let chr3 = \"\";\n        let enc1 = undefined;\n        let enc2 = undefined;\n        let enc3 = undefined;\n        let enc4 = \"\";\n        let i = 0;\n        let buf = [];\n        // remove all characters that are not A-Z, a-z, 0-9, +, /, or =\n        let base64test = /[^A-Za-z0-9\\+\\/\\=]/g;\n        if (base64test.exec(input)) console.warn(\"There were invalid base64 characters in the input text.\\nValid base64 characters are A-Z, a-z, 0-9, '+', '/',and '='\\nExpect errors in decoding.\");\n        input = input.replace(/[^A-Za-z0-9\\+\\/\\=]/g, \"\");\n        while(true){\n            enc1 = this.KEY_STR.indexOf(input.charAt(i++));\n            enc2 = this.KEY_STR.indexOf(input.charAt(i++));\n            enc3 = this.KEY_STR.indexOf(input.charAt(i++));\n            enc4 = this.KEY_STR.indexOf(input.charAt(i++));\n            chr1 = enc1 << 2 | enc2 >> 4;\n            chr2 = (enc2 & 15) << 4 | enc3 >> 2;\n            chr3 = (enc3 & 3) << 6 | enc4;\n            buf.push(chr1);\n            if (enc3 !== 64) buf.push(chr2);\n            if (enc4 !== 64) buf.push(chr3);\n            chr1 = chr2 = chr3 = \"\";\n            enc1 = enc2 = enc3 = enc4 = \"\";\n            if (!(i < input.length)) break;\n        }\n        return buf;\n    }\n}\n$3ed269f2f0fb224b$var$ExifRestore.initClass();\n/*\n * contentloaded.js\n *\n * Author: Diego Perini (diego.perini at gmail.com)\n * Summary: cross-browser wrapper for DOMContentLoaded\n * Updated: 20101020\n * License: MIT\n * Version: 1.2\n *\n * URL:\n * http://javascript.nwbox.com/ContentLoaded/\n * http://javascript.nwbox.com/ContentLoaded/MIT-LICENSE\n */ // @win window reference\n// @fn function reference\nlet $3ed269f2f0fb224b$var$contentLoaded = function(win, fn) {\n    let done = false;\n    let top = true;\n    let doc = win.document;\n    let root = doc.documentElement;\n    let add = doc.addEventListener ? \"addEventListener\" : \"attachEvent\";\n    let rem = doc.addEventListener ? \"removeEventListener\" : \"detachEvent\";\n    let pre = doc.addEventListener ? \"\" : \"on\";\n    var init = function(e) {\n        if (e.type === \"readystatechange\" && doc.readyState !== \"complete\") return;\n        (e.type === \"load\" ? win : doc)[rem](pre + e.type, init, false);\n        if (!done && (done = true)) return fn.call(win, e.type || e);\n    };\n    var poll = function() {\n        try {\n            root.doScroll(\"left\");\n        } catch (e) {\n            setTimeout(poll, 50);\n            return;\n        }\n        return init(\"poll\");\n    };\n    if (doc.readyState !== \"complete\") {\n        if (doc.createEventObject && root.doScroll) {\n            try {\n                top = !win.frameElement;\n            } catch (error) {\n            }\n            if (top) poll();\n        }\n        doc[add](pre + \"DOMContentLoaded\", init, false);\n        doc[add](pre + \"readystatechange\", init, false);\n        return win[add](pre + \"load\", init, false);\n    }\n};\nfunction $3ed269f2f0fb224b$var$__guard__(value, transform) {\n    return typeof value !== \"undefined\" && value !== null ? transform(value) : undefined;\n}\nfunction $3ed269f2f0fb224b$var$__guardMethod__(obj, methodName, transform) {\n    if (typeof obj !== \"undefined\" && obj !== null && typeof obj[methodName] === \"function\") return transform(obj, methodName);\n    else return undefined;\n}\n\n\nexport {$3ed269f2f0fb224b$export$2e2bcd8739ae039 as default, $3ed269f2f0fb224b$export$2e2bcd8739ae039 as Dropzone};\n//# sourceMappingURL=dropzone.mjs.map\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar DOMIterables = require('../internals/dom-iterables');\nvar DOMTokenListPrototype = require('../internals/dom-token-list-prototype');\nvar ArrayIteratorMethods = require('../modules/es.array.iterator');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar ArrayValues = ArrayIteratorMethods.values;\n\nvar handlePrototype = function (CollectionPrototype, COLLECTION_NAME) {\n  if (CollectionPrototype) {\n    // some Chrome versions have non-configurable methods on DOMTokenList\n    if (CollectionPrototype[ITERATOR] !== ArrayValues) try {\n      createNonEnumerableProperty(CollectionPrototype, ITERATOR, ArrayValues);\n    } catch (error) {\n      CollectionPrototype[ITERATOR] = ArrayValues;\n    }\n    setToStringTag(CollectionPrototype, COLLECTION_NAME, true);\n    if (DOMIterables[COLLECTION_NAME]) for (var METHOD_NAME in ArrayIteratorMethods) {\n      // some Chrome versions have non-configurable methods on DOMTokenList\n      if (CollectionPrototype[METHOD_NAME] !== ArrayIteratorMethods[METHOD_NAME]) try {\n        createNonEnumerableProperty(CollectionPrototype, METHOD_NAME, ArrayIteratorMethods[METHOD_NAME]);\n      } catch (error) {\n        CollectionPrototype[METHOD_NAME] = ArrayIteratorMethods[METHOD_NAME];\n      }\n    }\n  }\n};\n\nfor (var COLLECTION_NAME in DOMIterables) {\n  handlePrototype(globalThis[COLLECTION_NAME] && globalThis[COLLECTION_NAME].prototype, COLLECTION_NAME);\n}\n\nhandlePrototype(DOMTokenListPrototype, 'DOMTokenList');\n","'use strict';\n/* eslint-disable no-proto -- safe */\nvar uncurryThisAccessor = require('../internals/function-uncurry-this-accessor');\nvar isObject = require('../internals/is-object');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar aPossiblePrototype = require('../internals/a-possible-prototype');\n\n// `Object.setPrototypeOf` method\n// https://tc39.es/ecma262/#sec-object.setprototypeof\n// Works with __proto__ only. Old v8 can't work with null proto objects.\n// eslint-disable-next-line es/no-object-setprototypeof -- safe\nmodule.exports = Object.setPrototypeOf || ('__proto__' in {} ? function () {\n  var CORRECT_SETTER = false;\n  var test = {};\n  var setter;\n  try {\n    setter = uncurryThisAccessor(Object.prototype, '__proto__', 'set');\n    setter(test, []);\n    CORRECT_SETTER = test instanceof Array;\n  } catch (error) { /* empty */ }\n  return function setPrototypeOf(O, proto) {\n    requireObjectCoercible(O);\n    aPossiblePrototype(proto);\n    if (!isObject(O)) return O;\n    if (CORRECT_SETTER) setter(O, proto);\n    else O.__proto__ = proto;\n    return O;\n  };\n}() : undefined);\n","\"use strict\";\n\nexports.__esModule = true;\nexports[\"default\"] = void 0;\n\nvar _node = _interopRequireDefault(require(\"./node\"));\n\nvar _types = require(\"./types\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nfunction _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nvar Combinator = /*#__PURE__*/function (_Node) {\n  _inheritsLoose(Combinator, _Node);\n\n  function Combinator(opts) {\n    var _this;\n\n    _this = _Node.call(this, opts) || this;\n    _this.type = _types.COMBINATOR;\n    return _this;\n  }\n\n  return Combinator;\n}(_node[\"default\"]);\n\nexports[\"default\"] = Combinator;\nmodule.exports = exports.default;","'use strict';\n// https://github.com/zloirock/core-js/issues/280\nvar userAgent = require('../internals/environment-user-agent');\n\nmodule.exports = /Version\\/10(?:\\.\\d+){1,2}(?: [\\w./]+)?(?: Mobile\\/\\w+)? Safari\\//.test(userAgent);\n","'use strict';\nvar $ = require('../internals/export');\nvar getBuiltIn = require('../internals/get-built-in');\nvar apply = require('../internals/function-apply');\nvar call = require('../internals/function-call');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar fails = require('../internals/fails');\nvar isArray = require('../internals/is-array');\nvar isCallable = require('../internals/is-callable');\nvar isRawJSON = require('../internals/is-raw-json');\nvar isSymbol = require('../internals/is-symbol');\nvar classof = require('../internals/classof-raw');\nvar toString = require('../internals/to-string');\nvar arraySlice = require('../internals/array-slice');\nvar parseJSONString = require('../internals/parse-json-string');\nvar uid = require('../internals/uid');\nvar NATIVE_SYMBOL = require('../internals/symbol-constructor-detection');\nvar NATIVE_RAW_JSON = require('../internals/native-raw-json');\n\nvar $String = String;\nvar $stringify = getBuiltIn('JSON', 'stringify');\nvar exec = uncurryThis(/./.exec);\nvar charAt = uncurryThis(''.charAt);\nvar charCodeAt = uncurryThis(''.charCodeAt);\nvar replace = uncurryThis(''.replace);\nvar slice = uncurryThis(''.slice);\nvar push = uncurryThis([].push);\nvar numberToString = uncurryThis(1.1.toString);\n\nvar surrogates = /[\\uD800-\\uDFFF]/g;\nvar lowSurrogates = /^[\\uD800-\\uDBFF]$/;\nvar hiSurrogates = /^[\\uDC00-\\uDFFF]$/;\n\nvar MARK = uid();\nvar MARK_LENGTH = MARK.length;\n\nvar WRONG_SYMBOLS_CONVERSION = !NATIVE_SYMBOL || fails(function () {\n  var symbol = getBuiltIn('Symbol')('stringify detection');\n  // MS Edge converts symbol values to JSON as {}\n  return $stringify([symbol]) !== '[null]'\n    // WebKit converts symbol values to JSON as null\n    || $stringify({ a: symbol }) !== '{}'\n    // V8 throws on boxed symbols\n    || $stringify(Object(symbol)) !== '{}';\n});\n\n// https://github.com/tc39/proposal-well-formed-stringify\nvar ILL_FORMED_UNICODE = fails(function () {\n  return $stringify('\\uDF06\\uD834') !== '\"\\\\udf06\\\\ud834\"'\n    || $stringify('\\uDEAD') !== '\"\\\\udead\"';\n});\n\nvar stringifyWithProperSymbolsConversion = WRONG_SYMBOLS_CONVERSION ? function (it, replacer) {\n  var args = arraySlice(arguments);\n  var $replacer = getReplacerFunction(replacer);\n  if (!isCallable($replacer) && (it === undefined || isSymbol(it))) return; // IE8 returns string on undefined\n  args[1] = function (key, value) {\n    // some old implementations (like WebKit) could pass numbers as keys\n    if (isCallable($replacer)) value = call($replacer, this, $String(key), value);\n    if (!isSymbol(value)) return value;\n  };\n  return apply($stringify, null, args);\n} : $stringify;\n\nvar fixIllFormedJSON = function (match, offset, string) {\n  var prev = charAt(string, offset - 1);\n  var next = charAt(string, offset + 1);\n  if ((exec(lowSurrogates, match) && !exec(hiSurrogates, next)) || (exec(hiSurrogates, match) && !exec(lowSurrogates, prev))) {\n    return '\\\\u' + numberToString(charCodeAt(match, 0), 16);\n  } return match;\n};\n\nvar getReplacerFunction = function (replacer) {\n  if (isCallable(replacer)) return replacer;\n  if (!isArray(replacer)) return;\n  var rawLength = replacer.length;\n  var keys = [];\n  for (var i = 0; i < rawLength; i++) {\n    var element = replacer[i];\n    if (typeof element == 'string') push(keys, element);\n    else if (typeof element == 'number' || classof(element) === 'Number' || classof(element) === 'String') push(keys, toString(element));\n  }\n  var keysLength = keys.length;\n  var root = true;\n  return function (key, value) {\n    if (root) {\n      root = false;\n      return value;\n    }\n    if (isArray(this)) return value;\n    for (var j = 0; j < keysLength; j++) if (keys[j] === key) return value;\n  };\n};\n\n// `JSON.stringify` method\n// https://tc39.es/ecma262/#sec-json.stringify\n// https://github.com/tc39/proposal-json-parse-with-source\nif ($stringify) $({ target: 'JSON', stat: true, arity: 3, forced: WRONG_SYMBOLS_CONVERSION || ILL_FORMED_UNICODE || !NATIVE_RAW_JSON }, {\n  stringify: function stringify(text, replacer, space) {\n    var replacerFunction = getReplacerFunction(replacer);\n    var rawStrings = [];\n\n    var json = stringifyWithProperSymbolsConversion(text, function (key, value) {\n      // some old implementations (like WebKit) could pass numbers as keys\n      var v = isCallable(replacerFunction) ? call(replacerFunction, this, $String(key), value) : value;\n      return !NATIVE_RAW_JSON && isRawJSON(v) ? MARK + (push(rawStrings, v.rawJSON) - 1) : v;\n    }, space);\n\n    if (typeof json != 'string') return json;\n\n    if (ILL_FORMED_UNICODE) json = replace(json, surrogates, fixIllFormedJSON);\n\n    if (NATIVE_RAW_JSON) return json;\n\n    var result = '';\n    var length = json.length;\n\n    for (var i = 0; i < length; i++) {\n      var chr = charAt(json, i);\n      if (chr === '\"') {\n        var end = parseJSONString(json, ++i).end - 1;\n        var string = slice(json, i, end);\n        result += slice(string, 0, MARK_LENGTH) === MARK\n          ? rawStrings[slice(string, MARK_LENGTH)]\n          : '\"' + string + '\"';\n        i = end;\n      } else result += chr;\n    }\n\n    return result;\n  }\n});\n","const getFullWidth = (elem) => Math.max(elem.offsetWidth, elem.scrollWidth);\nconst getFullHeight = (elem) => Math.max(elem.offsetHeight, elem.scrollHeight);\n\nconst textNodeFromPoint = (element, x, y) => {\n    const nodes = element.childNodes;\n    const range = document.createRange();\n    for (let i = 0; i < nodes.length; i++) {\n        const node = nodes[i];\n        if (node.nodeType !== 3) {\n            continue;\n        }\n        range.selectNodeContents(node);\n        const rect = range.getBoundingClientRect();\n        if (x >= rect.left && y >= rect.top && x <= rect.right && y <= rect.bottom) {\n            return node;\n        }\n    }\n    return false;\n};\n\nconst clearTextSelection = () => {\n    const selection = window.getSelection ? window.getSelection() : document.selection;\n    if (!selection) {\n        return;\n    }\n    if (selection.removeAllRanges) {\n        selection.removeAllRanges();\n    } else if (selection.empty) {\n        selection.empty();\n    }\n};\n\nconst CLICK_EVENT_THRESHOLD_PX = 5;\n\nexport default class ScrollBooster {\n    /**\n     * Create ScrollBooster instance\n     * @param {Object} options - options object\n     * @param {Element} options.viewport - container element\n     * @param {Element} options.content - scrollable content element\n     * @param {String} options.direction - scroll direction\n     * @param {String} options.pointerMode - mouse or touch support\n     * @param {String} options.scrollMode - predefined scrolling technique\n     * @param {Boolean} options.bounce - bounce effect\n     * @param {Number} options.bounceForce - bounce effect factor\n     * @param {Number} options.friction - scroll friction factor\n     * @param {Boolean} options.textSelection - enables text selection\n     * @param {Boolean} options.inputsFocus - enables focus on input elements\n     * @param {Boolean} options.emulateScroll - enables mousewheel emulation\n     * @param {Function} options.onClick - click handler\n     * @param {Function} options.onUpdate - state update handler\n     * @param {Function} options.onWheel - wheel handler\n     * @param {Function} options.shouldScroll - predicate to allow or disable scroll\n     */\n    constructor(options = {}) {\n        const defaults = {\n            content: options.viewport.children[0],\n            direction: 'all', // 'vertical', 'horizontal'\n            pointerMode: 'all', // 'touch', 'mouse'\n            scrollMode: undefined, // 'transform', 'native'\n            bounce: true,\n            bounceForce: 0.1,\n            friction: 0.05,\n            textSelection: false,\n            inputsFocus: true,\n            emulateScroll: false,\n            preventDefaultOnEmulateScroll: false, // 'vertical', 'horizontal'\n            preventPointerMoveDefault: true,\n            lockScrollOnDragDirection: false, // 'vertical', 'horizontal', 'all'\n            pointerDownPreventDefault: true,\n            dragDirectionTolerance: 40,\n            onPointerDown() {},\n            onPointerUp() {},\n            onPointerMove() {},\n            onClick() {},\n            onUpdate() {},\n            onWheel() {},\n            shouldScroll() {\n                return true;\n            },\n        };\n\n        this.props = { ...defaults, ...options };\n\n        if (!this.props.viewport || !(this.props.viewport instanceof Element)) {\n            console.error(`ScrollBooster init error: \"viewport\" config property must be present and must be Element`);\n            return;\n        }\n\n        if (!this.props.content) {\n            console.error(`ScrollBooster init error: Viewport does not have any content`);\n            return;\n        }\n\n        this.isDragging = false;\n        this.isTargetScroll = false;\n        this.isScrolling = false;\n        this.isRunning = false;\n\n        const START_COORDINATES = { x: 0, y: 0 };\n\n        this.position = { ...START_COORDINATES };\n        this.velocity = { ...START_COORDINATES };\n        this.dragStartPosition = { ...START_COORDINATES };\n        this.dragOffset = { ...START_COORDINATES };\n        this.clientOffset = { ...START_COORDINATES };\n        this.dragPosition = { ...START_COORDINATES };\n        this.targetPosition = { ...START_COORDINATES };\n        this.scrollOffset = { ...START_COORDINATES };\n\n        this.rafID = null;\n        this.events = {};\n\n        this.updateMetrics();\n        this.handleEvents();\n    }\n\n    /**\n     * Update options object with new given values\n     */\n    updateOptions(options = {}) {\n        this.props = { ...this.props, ...options };\n        this.props.onUpdate(this.getState());\n        this.startAnimationLoop();\n    }\n\n    /**\n     * Update DOM container elements metrics (width and height)\n     */\n    updateMetrics() {\n        this.viewport = {\n            width: this.props.viewport.clientWidth,\n            height: this.props.viewport.clientHeight,\n        };\n        this.content = {\n            width: getFullWidth(this.props.content),\n            height: getFullHeight(this.props.content),\n        };\n        this.edgeX = {\n            from: Math.min(-this.content.width + this.viewport.width, 0),\n            to: 0,\n        };\n        this.edgeY = {\n            from: Math.min(-this.content.height + this.viewport.height, 0),\n            to: 0,\n        };\n\n        this.props.onUpdate(this.getState());\n        this.startAnimationLoop();\n    }\n\n    /**\n     * Run animation loop\n     */\n    startAnimationLoop() {\n        this.isRunning = true;\n        cancelAnimationFrame(this.rafID);\n        this.rafID = requestAnimationFrame(() => this.animate());\n    }\n\n    /**\n     * Main animation loop\n     */\n    animate() {\n        if (!this.isRunning) {\n            return;\n        }\n        this.updateScrollPosition();\n        // stop animation loop if nothing moves\n        if (!this.isMoving()) {\n            this.isRunning = false;\n            this.isTargetScroll = false;\n        }\n        const state = this.getState();\n        this.setContentPosition(state);\n        this.props.onUpdate(state);\n        this.rafID = requestAnimationFrame(() => this.animate());\n    }\n\n    /**\n     * Calculate and set new scroll position\n     */\n    updateScrollPosition() {\n        this.applyEdgeForce();\n        this.applyDragForce();\n        this.applyScrollForce();\n        this.applyTargetForce();\n\n        const inverseFriction = 1 - this.props.friction;\n        this.velocity.x *= inverseFriction;\n        this.velocity.y *= inverseFriction;\n\n        if (this.props.direction !== 'vertical') {\n            this.position.x += this.velocity.x;\n        }\n        if (this.props.direction !== 'horizontal') {\n            this.position.y += this.velocity.y;\n        }\n\n        // disable bounce effect\n        if ((!this.props.bounce || this.isScrolling) && !this.isTargetScroll) {\n            this.position.x = Math.max(Math.min(this.position.x, this.edgeX.to), this.edgeX.from);\n            this.position.y = Math.max(Math.min(this.position.y, this.edgeY.to), this.edgeY.from);\n        }\n    }\n\n    /**\n     * Increase general scroll velocity by given force amount\n     */\n    applyForce(force) {\n        this.velocity.x += force.x;\n        this.velocity.y += force.y;\n    }\n\n    /**\n     * Apply force for bounce effect\n     */\n    applyEdgeForce() {\n        if (!this.props.bounce || this.isDragging) {\n            return;\n        }\n\n        // scrolled past viewport edges\n        const beyondXFrom = this.position.x < this.edgeX.from;\n        const beyondXTo = this.position.x > this.edgeX.to;\n        const beyondYFrom = this.position.y < this.edgeY.from;\n        const beyondYTo = this.position.y > this.edgeY.to;\n        const beyondX = beyondXFrom || beyondXTo;\n        const beyondY = beyondYFrom || beyondYTo;\n\n        if (!beyondX && !beyondY) {\n            return;\n        }\n\n        const edge = {\n            x: beyondXFrom ? this.edgeX.from : this.edgeX.to,\n            y: beyondYFrom ? this.edgeY.from : this.edgeY.to,\n        };\n\n        const distanceToEdge = {\n            x: edge.x - this.position.x,\n            y: edge.y - this.position.y,\n        };\n\n        const force = {\n            x: distanceToEdge.x * this.props.bounceForce,\n            y: distanceToEdge.y * this.props.bounceForce,\n        };\n\n        const restPosition = {\n            x: this.position.x + (this.velocity.x + force.x) / this.props.friction,\n            y: this.position.y + (this.velocity.y + force.y) / this.props.friction,\n        };\n\n        if ((beyondXFrom && restPosition.x >= this.edgeX.from) || (beyondXTo && restPosition.x <= this.edgeX.to)) {\n            force.x = distanceToEdge.x * this.props.bounceForce - this.velocity.x;\n        }\n\n        if ((beyondYFrom && restPosition.y >= this.edgeY.from) || (beyondYTo && restPosition.y <= this.edgeY.to)) {\n            force.y = distanceToEdge.y * this.props.bounceForce - this.velocity.y;\n        }\n\n        this.applyForce({\n            x: beyondX ? force.x : 0,\n            y: beyondY ? force.y : 0,\n        });\n    }\n\n    /**\n     * Apply force to move content while dragging with mouse/touch\n     */\n    applyDragForce() {\n        if (!this.isDragging) {\n            return;\n        }\n\n        const dragVelocity = {\n            x: this.dragPosition.x - this.position.x,\n            y: this.dragPosition.y - this.position.y,\n        };\n\n        this.applyForce({\n            x: dragVelocity.x - this.velocity.x,\n            y: dragVelocity.y - this.velocity.y,\n        });\n    }\n\n    /**\n     * Apply force to emulate mouse wheel or trackpad\n     */\n    applyScrollForce() {\n        if (!this.isScrolling) {\n            return;\n        }\n\n        this.applyForce({\n            x: this.scrollOffset.x - this.velocity.x,\n            y: this.scrollOffset.y - this.velocity.y,\n        });\n\n        this.scrollOffset.x = 0;\n        this.scrollOffset.y = 0;\n    }\n\n    /**\n     * Apply force to scroll to given target coordinate\n     */\n    applyTargetForce() {\n        if (!this.isTargetScroll) {\n            return;\n        }\n\n        this.applyForce({\n            x: (this.targetPosition.x - this.position.x) * 0.08 - this.velocity.x,\n            y: (this.targetPosition.y - this.position.y) * 0.08 - this.velocity.y,\n        });\n    }\n\n    /**\n     * Check if scrolling happening\n     */\n    isMoving() {\n        return (\n            this.isDragging ||\n            this.isScrolling ||\n            Math.abs(this.velocity.x) >= 0.01 ||\n            Math.abs(this.velocity.y) >= 0.01\n        );\n    }\n\n    /**\n     * Set scroll target coordinate for smooth scroll\n     */\n    scrollTo(position = {}) {\n        this.isTargetScroll = true;\n        this.targetPosition.x = -position.x || 0;\n        this.targetPosition.y = -position.y || 0;\n        this.startAnimationLoop();\n    }\n\n    /**\n     * Manual position setting\n     */\n    setPosition(position = {}) {\n        this.velocity.x = 0;\n        this.velocity.y = 0;\n        this.position.x = -position.x || 0;\n        this.position.y = -position.y || 0;\n        this.startAnimationLoop();\n    }\n\n    /**\n     * Get latest metrics and coordinates\n     */\n    getState() {\n        return {\n            isMoving: this.isMoving(),\n            isDragging: !!(this.dragOffset.x || this.dragOffset.y),\n            position: { x: -this.position.x, y: -this.position.y },\n            dragOffset: this.dragOffset,\n            dragAngle: this.getDragAngle(this.clientOffset.x, this.clientOffset.y),\n            borderCollision: {\n                left: this.position.x >= this.edgeX.to,\n                right: this.position.x <= this.edgeX.from,\n                top: this.position.y >= this.edgeY.to,\n                bottom: this.position.y <= this.edgeY.from,\n            },\n        };\n    }\n\n    /**\n     * Get drag angle (up: 180, left: -90, right: 90, down: 0)\n     */\n    getDragAngle(x, y) {\n        return Math.round(Math.atan2(x, y) * (180 / Math.PI));\n    }\n\n    /**\n     * Get drag direction (horizontal or vertical)\n     */\n    getDragDirection(angle, tolerance) {\n        const absAngle = Math.abs(90 - Math.abs(angle));\n\n        if (absAngle <= 90 - tolerance) {\n            return 'horizontal';\n        } else {\n            return 'vertical';\n        }\n    }\n\n    /**\n     * Update DOM container elements metrics (width and height)\n     */\n    setContentPosition(state) {\n        if (this.props.scrollMode === 'transform') {\n            this.props.content.style.transform = `translate(${-state.position.x}px, ${-state.position.y}px)`;\n        }\n        if (this.props.scrollMode === 'native') {\n            this.props.viewport.scrollTop = state.position.y;\n            this.props.viewport.scrollLeft = state.position.x;\n        }\n    }\n\n    /**\n     * Register all DOM events\n     */\n    handleEvents() {\n        const dragOrigin = { x: 0, y: 0 };\n        const clientOrigin = { x: 0, y: 0 };\n        let dragDirection = null;\n        let wheelTimer = null;\n        let isTouch = false;\n\n        const setDragPosition = (event) => {\n            if (!this.isDragging) {\n                return;\n            }\n\n            const eventData = isTouch ? event.touches[0] : event;\n            const { pageX, pageY, clientX, clientY } = eventData;\n\n            this.dragOffset.x = pageX - dragOrigin.x;\n            this.dragOffset.y = pageY - dragOrigin.y;\n\n            this.clientOffset.x = clientX - clientOrigin.x;\n            this.clientOffset.y = clientY - clientOrigin.y;\n\n            // get dragDirection if offset threshold is reached\n            if (\n                (Math.abs(this.clientOffset.x) > 5 && !dragDirection) ||\n                (Math.abs(this.clientOffset.y) > 5 && !dragDirection)\n            ) {\n                dragDirection = this.getDragDirection(\n                    this.getDragAngle(this.clientOffset.x, this.clientOffset.y),\n                    this.props.dragDirectionTolerance\n                );\n            }\n\n            // prevent scroll if not expected scroll direction\n            if (this.props.lockScrollOnDragDirection && this.props.lockScrollOnDragDirection !== 'all') {\n                if (dragDirection === this.props.lockScrollOnDragDirection && isTouch) {\n                    this.dragPosition.x = this.dragStartPosition.x + this.dragOffset.x;\n                    this.dragPosition.y = this.dragStartPosition.y + this.dragOffset.y;\n                } else if (!isTouch) {\n                    this.dragPosition.x = this.dragStartPosition.x + this.dragOffset.x;\n                    this.dragPosition.y = this.dragStartPosition.y + this.dragOffset.y;\n                } else {\n                    this.dragPosition.x = this.dragStartPosition.x;\n                    this.dragPosition.y = this.dragStartPosition.y;\n                }\n            } else {\n                this.dragPosition.x = this.dragStartPosition.x + this.dragOffset.x;\n                this.dragPosition.y = this.dragStartPosition.y + this.dragOffset.y;\n            }\n        };\n\n        this.events.pointerdown = (event) => {\n            isTouch = !!(event.touches && event.touches[0]);\n\n            this.props.onPointerDown(this.getState(), event, isTouch);\n\n            const eventData = isTouch ? event.touches[0] : event;\n            const { pageX, pageY, clientX, clientY } = eventData;\n\n            const { viewport } = this.props;\n            const rect = viewport.getBoundingClientRect();\n\n            // click on vertical scrollbar\n            if (clientX - rect.left >= viewport.clientLeft + viewport.clientWidth) {\n                return;\n            }\n\n            // click on horizontal scrollbar\n            if (clientY - rect.top >= viewport.clientTop + viewport.clientHeight) {\n                return;\n            }\n\n            // interaction disabled by user\n            if (!this.props.shouldScroll(this.getState(), event)) {\n                return;\n            }\n\n            // disable right mouse button scroll\n            if (event.button === 2) {\n                return;\n            }\n\n            // disable on mobile\n            if (this.props.pointerMode === 'mouse' && isTouch) {\n                return;\n            }\n\n            // disable on desktop\n            if (this.props.pointerMode === 'touch' && !isTouch) {\n                return;\n            }\n\n            // focus on form input elements\n            const formNodes = ['input', 'textarea', 'button', 'select', 'label'];\n            if (this.props.inputsFocus && formNodes.indexOf(event.target.nodeName.toLowerCase()) > -1) {\n                return;\n            }\n\n            // handle text selection\n            if (this.props.textSelection) {\n                const textNode = textNodeFromPoint(event.target, clientX, clientY);\n                if (textNode) {\n                    return;\n                }\n                clearTextSelection();\n            }\n\n            this.isDragging = true;\n\n            dragOrigin.x = pageX;\n            dragOrigin.y = pageY;\n\n            clientOrigin.x = clientX;\n            clientOrigin.y = clientY;\n\n            this.dragStartPosition.x = this.position.x;\n            this.dragStartPosition.y = this.position.y;\n\n            setDragPosition(event);\n            this.startAnimationLoop();\n\n            if (!isTouch && this.props.pointerDownPreventDefault) {\n                event.preventDefault();\n            }\n        };\n\n        this.events.pointermove = (event) => {\n            // prevent default scroll if scroll direction is locked\n            if (event.cancelable && (this.props.lockScrollOnDragDirection === 'all' ||\n                this.props.lockScrollOnDragDirection === dragDirection)) {\n                event.preventDefault();\n            }\n            setDragPosition(event);\n            this.props.onPointerMove(this.getState(), event, isTouch);\n        };\n\n        this.events.pointerup = (event) => {\n            this.isDragging = false;\n            dragDirection = null;\n            this.props.onPointerUp(this.getState(), event, isTouch);\n        };\n\n        this.events.wheel = (event) => {\n            const state = this.getState();\n            if (!this.props.emulateScroll) {\n                return;\n            }\n            this.velocity.x = 0;\n            this.velocity.y = 0;\n            this.isScrolling = true;\n\n            this.scrollOffset.x = -event.deltaX;\n            this.scrollOffset.y = -event.deltaY;\n\n            this.props.onWheel(state, event);\n\n            this.startAnimationLoop();\n\n            clearTimeout(wheelTimer);\n            wheelTimer = setTimeout(() => (this.isScrolling = false), 80);\n\n            // get (trackpad) scrollDirection and prevent default events\n            if (\n                this.props.preventDefaultOnEmulateScroll &&\n                this.getDragDirection(\n                    this.getDragAngle(-event.deltaX, -event.deltaY),\n                    this.props.dragDirectionTolerance\n                ) === this.props.preventDefaultOnEmulateScroll\n            ) {\n                event.preventDefault();\n            }\n        };\n\n        this.events.scroll = () => {\n            const { scrollLeft, scrollTop } = this.props.viewport;\n            if (Math.abs(this.position.x + scrollLeft) > 3) {\n                this.position.x = -scrollLeft;\n                this.velocity.x = 0;\n            }\n            if (Math.abs(this.position.y + scrollTop) > 3) {\n                this.position.y = -scrollTop;\n                this.velocity.y = 0;\n            }\n        };\n\n        this.events.click = (event) => {\n            const state = this.getState();\n            const dragOffsetX = this.props.direction !== 'vertical' ? state.dragOffset.x : 0;\n            const dragOffsetY = this.props.direction !== 'horizontal' ? state.dragOffset.y : 0;\n            if (Math.max(Math.abs(dragOffsetX), Math.abs(dragOffsetY)) > CLICK_EVENT_THRESHOLD_PX) {\n                event.preventDefault();\n                event.stopPropagation();\n            }\n            this.props.onClick(state, event, isTouch);\n        };\n\n        this.events.contentLoad = () => this.updateMetrics();\n        this.events.resize = () => this.updateMetrics();\n\n        this.props.viewport.addEventListener('mousedown', this.events.pointerdown);\n        this.props.viewport.addEventListener('touchstart', this.events.pointerdown, { passive: false });\n        this.props.viewport.addEventListener('click', this.events.click);\n        this.props.viewport.addEventListener('wheel', this.events.wheel, { passive: false });\n        this.props.viewport.addEventListener('scroll', this.events.scroll);\n        this.props.content.addEventListener('load', this.events.contentLoad, true);\n        window.addEventListener('mousemove', this.events.pointermove);\n        window.addEventListener('touchmove', this.events.pointermove, { passive: false });\n        window.addEventListener('mouseup', this.events.pointerup);\n        window.addEventListener('touchend', this.events.pointerup);\n        window.addEventListener('resize', this.events.resize);\n    }\n\n    /**\n     * Unregister all DOM events\n     */\n    destroy() {\n        this.props.viewport.removeEventListener('mousedown', this.events.pointerdown);\n        this.props.viewport.removeEventListener('touchstart', this.events.pointerdown);\n        this.props.viewport.removeEventListener('click', this.events.click);\n        this.props.viewport.removeEventListener('wheel', this.events.wheel);\n        this.props.viewport.removeEventListener('scroll', this.events.scroll);\n        this.props.content.removeEventListener('load', this.events.contentLoad);\n        window.removeEventListener('mousemove', this.events.pointermove);\n        window.removeEventListener('touchmove', this.events.pointermove);\n        window.removeEventListener('mouseup', this.events.pointerup);\n        window.removeEventListener('touchend', this.events.pointerup);\n        window.removeEventListener('resize', this.events.resize);\n    }\n}\n","'use strict';\nmodule.exports = function (a, b) {\n  try {\n    // eslint-disable-next-line no-console -- safe\n    arguments.length === 1 ? console.error(a) : console.error(a, b);\n  } catch (error) { /* empty */ }\n};\n","'use strict';\nvar isCallable = require('../internals/is-callable');\nvar isObject = require('../internals/is-object');\nvar setPrototypeOf = require('../internals/object-set-prototype-of');\n\n// makes subclassing work correct for wrapped built-ins\nmodule.exports = function ($this, dummy, Wrapper) {\n  var NewTarget, NewTargetPrototype;\n  if (\n    // it can work only with native `setPrototypeOf`\n    setPrototypeOf &&\n    // we haven't completely correct pre-ES6 way for getting `new.target`, so use this\n    isCallable(NewTarget = dummy.constructor) &&\n    NewTarget !== Wrapper &&\n    isObject(NewTargetPrototype = NewTarget.prototype) &&\n    NewTargetPrototype !== Wrapper.prototype\n  ) setPrototypeOf($this, NewTargetPrototype);\n  return $this;\n};\n","/**\n * Outlayer Item\n */\n\n( function( window, factory ) {\n  // universal module definition\n  /* jshint strict: false */ /* globals define, module, require */\n  if ( typeof define == 'function' && define.amd ) {\n    // AMD - RequireJS\n    define( [\n        'ev-emitter/ev-emitter',\n        'get-size/get-size'\n      ],\n      factory\n    );\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS - Browserify, Webpack\n    module.exports = factory(\n      require('ev-emitter'),\n      require('get-size')\n    );\n  } else {\n    // browser global\n    window.Outlayer = {};\n    window.Outlayer.Item = factory(\n      window.EvEmitter,\n      window.getSize\n    );\n  }\n\n}( window, function factory( EvEmitter, getSize ) {\n'use strict';\n\n// ----- helpers ----- //\n\nfunction isEmptyObj( obj ) {\n  for ( var prop in obj ) {\n    return false;\n  }\n  prop = null;\n  return true;\n}\n\n// -------------------------- CSS3 support -------------------------- //\n\n\nvar docElemStyle = document.documentElement.style;\n\nvar transitionProperty = typeof docElemStyle.transition == 'string' ?\n  'transition' : 'WebkitTransition';\nvar transformProperty = typeof docElemStyle.transform == 'string' ?\n  'transform' : 'WebkitTransform';\n\nvar transitionEndEvent = {\n  WebkitTransition: 'webkitTransitionEnd',\n  transition: 'transitionend'\n}[ transitionProperty ];\n\n// cache all vendor properties that could have vendor prefix\nvar vendorProperties = {\n  transform: transformProperty,\n  transition: transitionProperty,\n  transitionDuration: transitionProperty + 'Duration',\n  transitionProperty: transitionProperty + 'Property',\n  transitionDelay: transitionProperty + 'Delay'\n};\n\n// -------------------------- Item -------------------------- //\n\nfunction Item( element, layout ) {\n  if ( !element ) {\n    return;\n  }\n\n  this.element = element;\n  // parent layout class, i.e. Masonry, Isotope, or Packery\n  this.layout = layout;\n  this.position = {\n    x: 0,\n    y: 0\n  };\n\n  this._create();\n}\n\n// inherit EvEmitter\nvar proto = Item.prototype = Object.create( EvEmitter.prototype );\nproto.constructor = Item;\n\nproto._create = function() {\n  // transition objects\n  this._transn = {\n    ingProperties: {},\n    clean: {},\n    onEnd: {}\n  };\n\n  this.css({\n    position: 'absolute'\n  });\n};\n\n// trigger specified handler for event type\nproto.handleEvent = function( event ) {\n  var method = 'on' + event.type;\n  if ( this[ method ] ) {\n    this[ method ]( event );\n  }\n};\n\nproto.getSize = function() {\n  this.size = getSize( this.element );\n};\n\n/**\n * apply CSS styles to element\n * @param {Object} style\n */\nproto.css = function( style ) {\n  var elemStyle = this.element.style;\n\n  for ( var prop in style ) {\n    // use vendor property if available\n    var supportedProp = vendorProperties[ prop ] || prop;\n    elemStyle[ supportedProp ] = style[ prop ];\n  }\n};\n\n // measure position, and sets it\nproto.getPosition = function() {\n  var style = getComputedStyle( this.element );\n  var isOriginLeft = this.layout._getOption('originLeft');\n  var isOriginTop = this.layout._getOption('originTop');\n  var xValue = style[ isOriginLeft ? 'left' : 'right' ];\n  var yValue = style[ isOriginTop ? 'top' : 'bottom' ];\n  var x = parseFloat( xValue );\n  var y = parseFloat( yValue );\n  // convert percent to pixels\n  var layoutSize = this.layout.size;\n  if ( xValue.indexOf('%') != -1 ) {\n    x = ( x / 100 ) * layoutSize.width;\n  }\n  if ( yValue.indexOf('%') != -1 ) {\n    y = ( y / 100 ) * layoutSize.height;\n  }\n  // clean up 'auto' or other non-integer values\n  x = isNaN( x ) ? 0 : x;\n  y = isNaN( y ) ? 0 : y;\n  // remove padding from measurement\n  x -= isOriginLeft ? layoutSize.paddingLeft : layoutSize.paddingRight;\n  y -= isOriginTop ? layoutSize.paddingTop : layoutSize.paddingBottom;\n\n  this.position.x = x;\n  this.position.y = y;\n};\n\n// set settled position, apply padding\nproto.layoutPosition = function() {\n  var layoutSize = this.layout.size;\n  var style = {};\n  var isOriginLeft = this.layout._getOption('originLeft');\n  var isOriginTop = this.layout._getOption('originTop');\n\n  // x\n  var xPadding = isOriginLeft ? 'paddingLeft' : 'paddingRight';\n  var xProperty = isOriginLeft ? 'left' : 'right';\n  var xResetProperty = isOriginLeft ? 'right' : 'left';\n\n  var x = this.position.x + layoutSize[ xPadding ];\n  // set in percentage or pixels\n  style[ xProperty ] = this.getXValue( x );\n  // reset other property\n  style[ xResetProperty ] = '';\n\n  // y\n  var yPadding = isOriginTop ? 'paddingTop' : 'paddingBottom';\n  var yProperty = isOriginTop ? 'top' : 'bottom';\n  var yResetProperty = isOriginTop ? 'bottom' : 'top';\n\n  var y = this.position.y + layoutSize[ yPadding ];\n  // set in percentage or pixels\n  style[ yProperty ] = this.getYValue( y );\n  // reset other property\n  style[ yResetProperty ] = '';\n\n  this.css( style );\n  this.emitEvent( 'layout', [ this ] );\n};\n\nproto.getXValue = function( x ) {\n  var isHorizontal = this.layout._getOption('horizontal');\n  return this.layout.options.percentPosition && !isHorizontal ?\n    ( ( x / this.layout.size.width ) * 100 ) + '%' : x + 'px';\n};\n\nproto.getYValue = function( y ) {\n  var isHorizontal = this.layout._getOption('horizontal');\n  return this.layout.options.percentPosition && isHorizontal ?\n    ( ( y / this.layout.size.height ) * 100 ) + '%' : y + 'px';\n};\n\nproto._transitionTo = function( x, y ) {\n  this.getPosition();\n  // get current x & y from top/left\n  var curX = this.position.x;\n  var curY = this.position.y;\n\n  var didNotMove = x == this.position.x && y == this.position.y;\n\n  // save end position\n  this.setPosition( x, y );\n\n  // if did not move and not transitioning, just go to layout\n  if ( didNotMove && !this.isTransitioning ) {\n    this.layoutPosition();\n    return;\n  }\n\n  var transX = x - curX;\n  var transY = y - curY;\n  var transitionStyle = {};\n  transitionStyle.transform = this.getTranslate( transX, transY );\n\n  this.transition({\n    to: transitionStyle,\n    onTransitionEnd: {\n      transform: this.layoutPosition\n    },\n    isCleaning: true\n  });\n};\n\nproto.getTranslate = function( x, y ) {\n  // flip cooridinates if origin on right or bottom\n  var isOriginLeft = this.layout._getOption('originLeft');\n  var isOriginTop = this.layout._getOption('originTop');\n  x = isOriginLeft ? x : -x;\n  y = isOriginTop ? y : -y;\n  return 'translate3d(' + x + 'px, ' + y + 'px, 0)';\n};\n\n// non transition + transform support\nproto.goTo = function( x, y ) {\n  this.setPosition( x, y );\n  this.layoutPosition();\n};\n\nproto.moveTo = proto._transitionTo;\n\nproto.setPosition = function( x, y ) {\n  this.position.x = parseFloat( x );\n  this.position.y = parseFloat( y );\n};\n\n// ----- transition ----- //\n\n/**\n * @param {Object} style - CSS\n * @param {Function} onTransitionEnd\n */\n\n// non transition, just trigger callback\nproto._nonTransition = function( args ) {\n  this.css( args.to );\n  if ( args.isCleaning ) {\n    this._removeStyles( args.to );\n  }\n  for ( var prop in args.onTransitionEnd ) {\n    args.onTransitionEnd[ prop ].call( this );\n  }\n};\n\n/**\n * proper transition\n * @param {Object} args - arguments\n *   @param {Object} to - style to transition to\n *   @param {Object} from - style to start transition from\n *   @param {Boolean} isCleaning - removes transition styles after transition\n *   @param {Function} onTransitionEnd - callback\n */\nproto.transition = function( args ) {\n  // redirect to nonTransition if no transition duration\n  if ( !parseFloat( this.layout.options.transitionDuration ) ) {\n    this._nonTransition( args );\n    return;\n  }\n\n  var _transition = this._transn;\n  // keep track of onTransitionEnd callback by css property\n  for ( var prop in args.onTransitionEnd ) {\n    _transition.onEnd[ prop ] = args.onTransitionEnd[ prop ];\n  }\n  // keep track of properties that are transitioning\n  for ( prop in args.to ) {\n    _transition.ingProperties[ prop ] = true;\n    // keep track of properties to clean up when transition is done\n    if ( args.isCleaning ) {\n      _transition.clean[ prop ] = true;\n    }\n  }\n\n  // set from styles\n  if ( args.from ) {\n    this.css( args.from );\n    // force redraw. http://blog.alexmaccaw.com/css-transitions\n    var h = this.element.offsetHeight;\n    // hack for JSHint to hush about unused var\n    h = null;\n  }\n  // enable transition\n  this.enableTransition( args.to );\n  // set styles that are transitioning\n  this.css( args.to );\n\n  this.isTransitioning = true;\n\n};\n\n// dash before all cap letters, including first for\n// WebkitTransform => -webkit-transform\nfunction toDashedAll( str ) {\n  return str.replace( /([A-Z])/g, function( $1 ) {\n    return '-' + $1.toLowerCase();\n  });\n}\n\nvar transitionProps = 'opacity,' + toDashedAll( transformProperty );\n\nproto.enableTransition = function(/* style */) {\n  // HACK changing transitionProperty during a transition\n  // will cause transition to jump\n  if ( this.isTransitioning ) {\n    return;\n  }\n\n  // make `transition: foo, bar, baz` from style object\n  // HACK un-comment this when enableTransition can work\n  // while a transition is happening\n  // var transitionValues = [];\n  // for ( var prop in style ) {\n  //   // dash-ify camelCased properties like WebkitTransition\n  //   prop = vendorProperties[ prop ] || prop;\n  //   transitionValues.push( toDashedAll( prop ) );\n  // }\n  // munge number to millisecond, to match stagger\n  var duration = this.layout.options.transitionDuration;\n  duration = typeof duration == 'number' ? duration + 'ms' : duration;\n  // enable transition styles\n  this.css({\n    transitionProperty: transitionProps,\n    transitionDuration: duration,\n    transitionDelay: this.staggerDelay || 0\n  });\n  // listen for transition end event\n  this.element.addEventListener( transitionEndEvent, this, false );\n};\n\n// ----- events ----- //\n\nproto.onwebkitTransitionEnd = function( event ) {\n  this.ontransitionend( event );\n};\n\nproto.onotransitionend = function( event ) {\n  this.ontransitionend( event );\n};\n\n// properties that I munge to make my life easier\nvar dashedVendorProperties = {\n  '-webkit-transform': 'transform'\n};\n\nproto.ontransitionend = function( event ) {\n  // disregard bubbled events from children\n  if ( event.target !== this.element ) {\n    return;\n  }\n  var _transition = this._transn;\n  // get property name of transitioned property, convert to prefix-free\n  var propertyName = dashedVendorProperties[ event.propertyName ] || event.propertyName;\n\n  // remove property that has completed transitioning\n  delete _transition.ingProperties[ propertyName ];\n  // check if any properties are still transitioning\n  if ( isEmptyObj( _transition.ingProperties ) ) {\n    // all properties have completed transitioning\n    this.disableTransition();\n  }\n  // clean style\n  if ( propertyName in _transition.clean ) {\n    // clean up style\n    this.element.style[ event.propertyName ] = '';\n    delete _transition.clean[ propertyName ];\n  }\n  // trigger onTransitionEnd callback\n  if ( propertyName in _transition.onEnd ) {\n    var onTransitionEnd = _transition.onEnd[ propertyName ];\n    onTransitionEnd.call( this );\n    delete _transition.onEnd[ propertyName ];\n  }\n\n  this.emitEvent( 'transitionEnd', [ this ] );\n};\n\nproto.disableTransition = function() {\n  this.removeTransitionStyles();\n  this.element.removeEventListener( transitionEndEvent, this, false );\n  this.isTransitioning = false;\n};\n\n/**\n * removes style property from element\n * @param {Object} style\n**/\nproto._removeStyles = function( style ) {\n  // clean up transition styles\n  var cleanStyle = {};\n  for ( var prop in style ) {\n    cleanStyle[ prop ] = '';\n  }\n  this.css( cleanStyle );\n};\n\nvar cleanTransitionStyle = {\n  transitionProperty: '',\n  transitionDuration: '',\n  transitionDelay: ''\n};\n\nproto.removeTransitionStyles = function() {\n  // remove transition\n  this.css( cleanTransitionStyle );\n};\n\n// ----- stagger ----- //\n\nproto.stagger = function( delay ) {\n  delay = isNaN( delay ) ? 0 : delay;\n  this.staggerDelay = delay + 'ms';\n};\n\n// ----- show/hide/remove ----- //\n\n// remove element from DOM\nproto.removeElem = function() {\n  this.element.parentNode.removeChild( this.element );\n  // remove display: none\n  this.css({ display: '' });\n  this.emitEvent( 'remove', [ this ] );\n};\n\nproto.remove = function() {\n  // just remove element if no transition support or no transition\n  if ( !transitionProperty || !parseFloat( this.layout.options.transitionDuration ) ) {\n    this.removeElem();\n    return;\n  }\n\n  // start transition\n  this.once( 'transitionEnd', function() {\n    this.removeElem();\n  });\n  this.hide();\n};\n\nproto.reveal = function() {\n  delete this.isHidden;\n  // remove display: none\n  this.css({ display: '' });\n\n  var options = this.layout.options;\n\n  var onTransitionEnd = {};\n  var transitionEndProperty = this.getHideRevealTransitionEndProperty('visibleStyle');\n  onTransitionEnd[ transitionEndProperty ] = this.onRevealTransitionEnd;\n\n  this.transition({\n    from: options.hiddenStyle,\n    to: options.visibleStyle,\n    isCleaning: true,\n    onTransitionEnd: onTransitionEnd\n  });\n};\n\nproto.onRevealTransitionEnd = function() {\n  // check if still visible\n  // during transition, item may have been hidden\n  if ( !this.isHidden ) {\n    this.emitEvent('reveal');\n  }\n};\n\n/**\n * get style property use for hide/reveal transition end\n * @param {String} styleProperty - hiddenStyle/visibleStyle\n * @returns {String}\n */\nproto.getHideRevealTransitionEndProperty = function( styleProperty ) {\n  var optionStyle = this.layout.options[ styleProperty ];\n  // use opacity\n  if ( optionStyle.opacity ) {\n    return 'opacity';\n  }\n  // get first property\n  for ( var prop in optionStyle ) {\n    return prop;\n  }\n};\n\nproto.hide = function() {\n  // set flag\n  this.isHidden = true;\n  // remove display: none\n  this.css({ display: '' });\n\n  var options = this.layout.options;\n\n  var onTransitionEnd = {};\n  var transitionEndProperty = this.getHideRevealTransitionEndProperty('hiddenStyle');\n  onTransitionEnd[ transitionEndProperty ] = this.onHideTransitionEnd;\n\n  this.transition({\n    from: options.visibleStyle,\n    to: options.hiddenStyle,\n    // keep hidden stuff hidden\n    isCleaning: true,\n    onTransitionEnd: onTransitionEnd\n  });\n};\n\nproto.onHideTransitionEnd = function() {\n  // check if still hidden\n  // during transition, item may have been un-hidden\n  if ( this.isHidden ) {\n    this.css({ display: 'none' });\n    this.emitEvent('hide');\n  }\n};\n\nproto.destroy = function() {\n  this.css({\n    position: '',\n    left: '',\n    right: '',\n    top: '',\n    bottom: '',\n    transition: '',\n    transform: ''\n  });\n};\n\nreturn Item;\n\n}));\n","'use strict';\nvar TO_STRING_TAG_SUPPORT = require('../internals/to-string-tag-support');\nvar classof = require('../internals/classof');\n\n// `Object.prototype.toString` method implementation\n// https://tc39.es/ecma262/#sec-object.prototype.tostring\nmodule.exports = TO_STRING_TAG_SUPPORT ? {}.toString : function toString() {\n  return '[object ' + classof(this) + ']';\n};\n","\"use strict\";\n\nexports.__esModule = true;\nexports[\"default\"] = void 0;\n\nvar _node = _interopRequireDefault(require(\"./node\"));\n\nvar _types = require(\"./types\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nfunction _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nvar String = /*#__PURE__*/function (_Node) {\n  _inheritsLoose(String, _Node);\n\n  function String(opts) {\n    var _this;\n\n    _this = _Node.call(this, opts) || this;\n    _this.type = _types.STRING;\n    return _this;\n  }\n\n  return String;\n}(_node[\"default\"]);\n\nexports[\"default\"] = String;\nmodule.exports = exports.default;","'use strict';\n// TODO: Remove from `core-js@4`\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar defineBuiltIn = require('../internals/define-built-in');\n\nvar DatePrototype = Date.prototype;\nvar INVALID_DATE = 'Invalid Date';\nvar TO_STRING = 'toString';\nvar nativeDateToString = uncurryThis(DatePrototype[TO_STRING]);\nvar thisTimeValue = uncurryThis(DatePrototype.getTime);\n\n// `Date.prototype.toString` method\n// https://tc39.es/ecma262/#sec-date.prototype.tostring\nif (String(new Date(NaN)) !== INVALID_DATE) {\n  defineBuiltIn(DatePrototype, TO_STRING, function toString() {\n    var value = thisTimeValue(this);\n    // eslint-disable-next-line no-self-compare -- NaN check\n    return value === value ? nativeDateToString(this) : INVALID_DATE;\n  });\n}\n","/*!\n * Masonry layout mode\n * sub-classes Masonry\n * https://masonry.desandro.com\n */\n\n( function( window, factory ) {\n  // universal module definition\n  /* jshint strict: false */ /*globals define, module, require */\n  if ( typeof define == 'function' && define.amd ) {\n    // AMD\n    define( [\n        '../layout-mode',\n        'masonry-layout/masonry'\n      ],\n      factory );\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n      require('../layout-mode'),\n      require('masonry-layout')\n    );\n  } else {\n    // browser global\n    factory(\n      window.Isotope.LayoutMode,\n      window.Masonry\n    );\n  }\n\n}( window, function factory( LayoutMode, Masonry ) {\n'use strict';\n\n// -------------------------- masonryDefinition -------------------------- //\n\n  // create an Outlayer layout class\n  var MasonryMode = LayoutMode.create('masonry');\n\n  var proto = MasonryMode.prototype;\n\n  var keepModeMethods = {\n    _getElementOffset: true,\n    layout: true,\n    _getMeasurement: true\n  };\n\n  // inherit Masonry prototype\n  for ( var method in Masonry.prototype ) {\n    // do not inherit mode methods\n    if ( !keepModeMethods[ method ] ) {\n      proto[ method ] = Masonry.prototype[ method ];\n    }\n  }\n\n  var measureColumns = proto.measureColumns;\n  proto.measureColumns = function() {\n    // set items, used if measuring first item\n    this.items = this.isotope.filteredItems;\n    measureColumns.call( this );\n  };\n\n  // point to mode options for fitWidth\n  var _getOption = proto._getOption;\n  proto._getOption = function( option ) {\n    if ( option == 'fitWidth' ) {\n      return this.options.isFitWidth !== undefined ?\n        this.options.isFitWidth : this.options.fitWidth;\n    }\n    return _getOption.apply( this.isotope, arguments );\n  };\n\n  return MasonryMode;\n\n}));\n","'use strict';\n// TODO: Remove this module from `core-js@4` since it's split to modules listed below\nrequire('../modules/es.promise.constructor');\nrequire('../modules/es.promise.all');\nrequire('../modules/es.promise.catch');\nrequire('../modules/es.promise.race');\nrequire('../modules/es.promise.reject');\nrequire('../modules/es.promise.resolve');\n","'use strict';\nvar call = require('../internals/function-call');\nvar fixRegExpWellKnownSymbolLogic = require('../internals/fix-regexp-well-known-symbol-logic');\nvar anObject = require('../internals/an-object');\nvar isObject = require('../internals/is-object');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar sameValue = require('../internals/same-value');\nvar toString = require('../internals/to-string');\nvar getMethod = require('../internals/get-method');\nvar regExpExec = require('../internals/regexp-exec-abstract');\n\n// @@search logic\nfixRegExpWellKnownSymbolLogic('search', function (SEARCH, nativeSearch, maybeCallNative) {\n  return [\n    // `String.prototype.search` method\n    // https://tc39.es/ecma262/#sec-string.prototype.search\n    function search(regexp) {\n      var O = requireObjectCoercible(this);\n      var searcher = isObject(regexp) ? getMethod(regexp, SEARCH) : undefined;\n      return searcher ? call(searcher, regexp, O) : new RegExp(regexp)[SEARCH](toString(O));\n    },\n    // `RegExp.prototype[@@search]` method\n    // https://tc39.es/ecma262/#sec-regexp.prototype-@@search\n    function (string) {\n      var rx = anObject(this);\n      var S = toString(string);\n      var res = maybeCallNative(nativeSearch, rx, S);\n\n      if (res.done) return res.value;\n\n      var previousLastIndex = rx.lastIndex;\n      if (!sameValue(previousLastIndex, 0)) rx.lastIndex = 0;\n      var result = regExpExec(rx, S);\n      if (!sameValue(rx.lastIndex, previousLastIndex)) rx.lastIndex = previousLastIndex;\n      return result === null ? -1 : result.index;\n    }\n  ];\n});\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar DESCRIPTORS = require('../internals/descriptors');\n\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// Avoid NodeJS experimental warning\nmodule.exports = function (name) {\n  if (!DESCRIPTORS) return globalThis[name];\n  var descriptor = getOwnPropertyDescriptor(globalThis, name);\n  return descriptor && descriptor.value;\n};\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\n\nvar id = 0;\nvar postfix = Math.random();\nvar toString = uncurryThis(1.1.toString);\n\nmodule.exports = function (key) {\n  return 'Symbol(' + (key === undefined ? '' : key) + ')_' + toString(++id + postfix, 36);\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar from = require('../internals/array-from');\nvar checkCorrectnessOfIteration = require('../internals/check-correctness-of-iteration');\n\nvar INCORRECT_ITERATION = !checkCorrectnessOfIteration(function (iterable) {\n  // eslint-disable-next-line es/no-array-from -- required for testing\n  Array.from(iterable);\n});\n\n// `Array.from` method\n// https://tc39.es/ecma262/#sec-array.from\n$({ target: 'Array', stat: true, forced: INCORRECT_ITERATION }, {\n  from: from\n});\n","'use strict';\nvar anObject = require('../internals/an-object');\nvar isObject = require('../internals/is-object');\nvar newPromiseCapability = require('../internals/new-promise-capability');\n\nmodule.exports = function (C, x) {\n  anObject(C);\n  if (isObject(x) && x.constructor === C) return x;\n  var promiseCapability = newPromiseCapability.f(C);\n  var resolve = promiseCapability.resolve;\n  resolve(x);\n  return promiseCapability.promise;\n};\n","'use strict';\nvar aSet = require('../internals/a-set');\nvar SetHelpers = require('../internals/set-helpers');\nvar clone = require('../internals/set-clone');\nvar size = require('../internals/set-size');\nvar getSetRecord = require('../internals/get-set-record');\nvar iterateSet = require('../internals/set-iterate');\nvar iterateSimple = require('../internals/iterate-simple');\n\nvar has = SetHelpers.has;\nvar remove = SetHelpers.remove;\n\n// `Set.prototype.difference` method\n// https://tc39.es/ecma262/#sec-set.prototype.difference\nmodule.exports = function difference(other) {\n  var O = aSet(this);\n  var otherRec = getSetRecord(other);\n  var result = clone(O);\n  if (size(O) <= otherRec.size) iterateSet(O, function (e) {\n    if (otherRec.includes(e)) remove(result, e);\n  });\n  else iterateSimple(otherRec.getIterator(), function (e) {\n    if (has(result, e)) remove(result, e);\n  });\n  return result;\n};\n","\"use strict\";\n\nexports.__esModule = true;\nexports[\"default\"] = void 0;\n\nvar _node = _interopRequireDefault(require(\"./node\"));\n\nvar _types = require(\"./types\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nfunction _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nvar ID = /*#__PURE__*/function (_Node) {\n  _inheritsLoose(ID, _Node);\n\n  function ID(opts) {\n    var _this;\n\n    _this = _Node.call(this, opts) || this;\n    _this.type = _types.ID;\n    return _this;\n  }\n\n  var _proto = ID.prototype;\n\n  _proto.valueToString = function valueToString() {\n    return '#' + _Node.prototype.valueToString.call(this);\n  };\n\n  return ID;\n}(_node[\"default\"]);\n\nexports[\"default\"] = ID;\nmodule.exports = exports.default;","'use strict';\nvar $ = require('../internals/export');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar hiddenKeys = require('../internals/hidden-keys');\nvar isObject = require('../internals/is-object');\nvar hasOwn = require('../internals/has-own-property');\nvar defineProperty = require('../internals/object-define-property').f;\nvar getOwnPropertyNamesModule = require('../internals/object-get-own-property-names');\nvar getOwnPropertyNamesExternalModule = require('../internals/object-get-own-property-names-external');\nvar isExtensible = require('../internals/object-is-extensible');\nvar uid = require('../internals/uid');\nvar FREEZING = require('../internals/freezing');\n\nvar REQUIRED = false;\nvar METADATA = uid('meta');\nvar id = 0;\n\nvar setMetadata = function (it) {\n  defineProperty(it, METADATA, { value: {\n    objectID: 'O' + id++, // object ID\n    weakData: {}          // weak collections IDs\n  } });\n};\n\nvar fastKey = function (it, create) {\n  // return a primitive with prefix\n  if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;\n  if (!hasOwn(it, METADATA)) {\n    // can't set metadata to uncaught frozen object\n    if (!isExtensible(it)) return 'F';\n    // not necessary to add metadata\n    if (!create) return 'E';\n    // add missing metadata\n    setMetadata(it);\n  // return object ID\n  } return it[METADATA].objectID;\n};\n\nvar getWeakData = function (it, create) {\n  if (!hasOwn(it, METADATA)) {\n    // can't set metadata to uncaught frozen object\n    if (!isExtensible(it)) return true;\n    // not necessary to add metadata\n    if (!create) return false;\n    // add missing metadata\n    setMetadata(it);\n  // return the store of weak collections IDs\n  } return it[METADATA].weakData;\n};\n\n// add metadata on freeze-family methods calling\nvar onFreeze = function (it) {\n  if (FREEZING && REQUIRED && isExtensible(it) && !hasOwn(it, METADATA)) setMetadata(it);\n  return it;\n};\n\nvar enable = function () {\n  meta.enable = function () { /* empty */ };\n  REQUIRED = true;\n  var getOwnPropertyNames = getOwnPropertyNamesModule.f;\n  var splice = uncurryThis([].splice);\n  var test = {};\n  // eslint-disable-next-line unicorn/no-immediate-mutation -- ES3 syntax limitation\n  test[METADATA] = 1;\n\n  // prevent exposing of metadata key\n  if (getOwnPropertyNames(test).length) {\n    getOwnPropertyNamesModule.f = function (it) {\n      var result = getOwnPropertyNames(it);\n      for (var i = 0, length = result.length; i < length; i++) {\n        if (result[i] === METADATA) {\n          splice(result, i, 1);\n          break;\n        }\n      } return result;\n    };\n\n    $({ target: 'Object', stat: true, forced: true }, {\n      getOwnPropertyNames: getOwnPropertyNamesExternalModule.f\n    });\n  }\n};\n\nvar meta = module.exports = {\n  enable: enable,\n  fastKey: fastKey,\n  getWeakData: getWeakData,\n  onFreeze: onFreeze\n};\n\nhiddenKeys[METADATA] = true;\n","'use strict';\n// `SameValue` abstract operation\n// https://tc39.es/ecma262/#sec-samevalue\n// eslint-disable-next-line es/no-object-is -- safe\nmodule.exports = Object.is || function is(x, y) {\n  // eslint-disable-next-line no-self-compare -- NaN check\n  return x === y ? x !== 0 || 1 / x === 1 / y : x !== x && y !== y;\n};\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar DOMIterables = require('../internals/dom-iterables');\nvar DOMTokenListPrototype = require('../internals/dom-token-list-prototype');\nvar forEach = require('../internals/array-for-each');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\n\nvar handlePrototype = function (CollectionPrototype) {\n  // some Chrome versions have non-configurable methods on DOMTokenList\n  if (CollectionPrototype && CollectionPrototype.forEach !== forEach) try {\n    createNonEnumerableProperty(CollectionPrototype, 'forEach', forEach);\n  } catch (error) {\n    CollectionPrototype.forEach = forEach;\n  }\n};\n\nfor (var COLLECTION_NAME in DOMIterables) {\n  if (DOMIterables[COLLECTION_NAME]) {\n    handlePrototype(globalThis[COLLECTION_NAME] && globalThis[COLLECTION_NAME].prototype);\n  }\n}\n\nhandlePrototype(DOMTokenListPrototype);\n","'use strict';\nvar isPossiblePrototype = require('../internals/is-possible-prototype');\n\nvar $String = String;\nvar $TypeError = TypeError;\n\nmodule.exports = function (argument) {\n  if (isPossiblePrototype(argument)) return argument;\n  throw new $TypeError(\"Can't set \" + $String(argument) + ' as a prototype');\n};\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar fails = require('../internals/fails');\nvar isCallable = require('../internals/is-callable');\nvar classof = require('../internals/classof');\nvar getBuiltIn = require('../internals/get-built-in');\nvar inspectSource = require('../internals/inspect-source');\n\nvar noop = function () { /* empty */ };\nvar construct = getBuiltIn('Reflect', 'construct');\nvar constructorRegExp = /^\\s*(?:class|function)\\b/;\nvar exec = uncurryThis(constructorRegExp.exec);\nvar INCORRECT_TO_STRING = !constructorRegExp.test(noop);\n\nvar isConstructorModern = function isConstructor(argument) {\n  if (!isCallable(argument)) return false;\n  try {\n    construct(noop, [], argument);\n    return true;\n  } catch (error) {\n    return false;\n  }\n};\n\nvar isConstructorLegacy = function isConstructor(argument) {\n  if (!isCallable(argument)) return false;\n  switch (classof(argument)) {\n    case 'AsyncFunction':\n    case 'GeneratorFunction':\n    case 'AsyncGeneratorFunction': return false;\n  }\n  try {\n    // we can't check .prototype since constructors produced by .bind haven't it\n    // `Function#toString` throws on some built-it function in some legacy engines\n    // (for example, `DOMQuad` and similar in FF41-)\n    return INCORRECT_TO_STRING || !!exec(constructorRegExp, inspectSource(argument));\n  } catch (error) {\n    return true;\n  }\n};\n\nisConstructorLegacy.sham = true;\n\n// `IsConstructor` abstract operation\n// https://tc39.es/ecma262/#sec-isconstructor\nmodule.exports = !construct || fails(function () {\n  var called;\n  return isConstructorModern(isConstructorModern.call)\n    || !isConstructorModern(Object)\n    || !isConstructorModern(function () { called = true; })\n    || called;\n}) ? isConstructorLegacy : isConstructorModern;\n","'use strict';\nvar fails = require('../internals/fails');\nvar globalThis = require('../internals/global-this');\n\n// babel-minify and Closure Compiler transpiles RegExp('.', 's') -> /./s and it causes SyntaxError\nvar $RegExp = globalThis.RegExp;\n\nmodule.exports = fails(function () {\n  var re = $RegExp('.', 's');\n  return !(re.dotAll && re.test('\\n') && re.flags === 's');\n});\n","'use strict';\nvar anObject = require('../internals/an-object');\nvar ordinaryToPrimitive = require('../internals/ordinary-to-primitive');\n\nvar $TypeError = TypeError;\n\n// `Date.prototype[@@toPrimitive](hint)` method implementation\n// https://tc39.es/ecma262/#sec-date.prototype-@@toprimitive\nmodule.exports = function (hint) {\n  anObject(this);\n  if (hint === 'string' || hint === 'default') hint = 'string';\n  else if (hint !== 'number') throw new $TypeError('Incorrect hint');\n  return ordinaryToPrimitive(this, hint);\n};\n","'use strict';\nvar aSet = require('../internals/a-set');\nvar SetHelpers = require('../internals/set-helpers');\nvar clone = require('../internals/set-clone');\nvar getSetRecord = require('../internals/get-set-record');\nvar iterateSimple = require('../internals/iterate-simple');\n\nvar add = SetHelpers.add;\nvar has = SetHelpers.has;\nvar remove = SetHelpers.remove;\n\n// `Set.prototype.symmetricDifference` method\n// https://tc39.es/ecma262/#sec-set.prototype.symmetricdifference\nmodule.exports = function symmetricDifference(other) {\n  var O = aSet(this);\n  var keysIter = getSetRecord(other).getIterator();\n  var result = clone(O);\n  iterateSimple(keysIter, function (e) {\n    if (has(O, e)) remove(result, e);\n    else add(result, e);\n  });\n  return result;\n};\n","\"use strict\";\n\nexports.__esModule = true;\nexports[\"default\"] = void 0;\n\nvar _node = _interopRequireDefault(require(\"./node\"));\n\nvar _types = require(\"./types\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nfunction _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nvar Nesting = /*#__PURE__*/function (_Node) {\n  _inheritsLoose(Nesting, _Node);\n\n  function Nesting(opts) {\n    var _this;\n\n    _this = _Node.call(this, opts) || this;\n    _this.type = _types.NESTING;\n    _this.value = '&';\n    return _this;\n  }\n\n  return Nesting;\n}(_node[\"default\"]);\n\nexports[\"default\"] = Nesting;\nmodule.exports = exports.default;","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar isCallable = require('../internals/is-callable');\nvar store = require('../internals/shared-store');\n\nvar functionToString = uncurryThis(Function.toString);\n\n// this helper broken in `core-js@3.4.1-3.4.4`, so we can't use `shared` helper\nif (!isCallable(store.inspectSource)) {\n  store.inspectSource = function (it) {\n    return functionToString(it);\n  };\n}\n\nmodule.exports = store.inspectSource;\n","'use strict';\n// eslint-disable-next-line es/no-object-getownpropertysymbols -- safe\nexports.f = Object.getOwnPropertySymbols;\n","'use strict';\nvar fails = require('../internals/fails');\n\n// Detect IE8's incomplete defineProperty implementation\nmodule.exports = !fails(function () {\n  // eslint-disable-next-line es/no-object-defineproperty -- required for testing\n  return Object.defineProperty({}, 1, { get: function () { return 7; } })[1] !== 7;\n});\n","/**\n * Isotope LayoutMode\n */\n\n( function( window, factory ) {\n  // universal module definition\n  /* jshint strict: false */ /*globals define, module, require */\n  if ( typeof define == 'function' && define.amd ) {\n    // AMD\n    define( [\n        'get-size/get-size',\n        'outlayer/outlayer'\n      ],\n      factory );\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n      require('get-size'),\n      require('outlayer')\n    );\n  } else {\n    // browser global\n    window.Isotope = window.Isotope || {};\n    window.Isotope.LayoutMode = factory(\n      window.getSize,\n      window.Outlayer\n    );\n  }\n\n}( window, function factory( getSize, Outlayer ) {\n  'use strict';\n\n  // layout mode class\n  function LayoutMode( isotope ) {\n    this.isotope = isotope;\n    // link properties\n    if ( isotope ) {\n      this.options = isotope.options[ this.namespace ];\n      this.element = isotope.element;\n      this.items = isotope.filteredItems;\n      this.size = isotope.size;\n    }\n  }\n\n  var proto = LayoutMode.prototype;\n\n  /**\n   * some methods should just defer to default Outlayer method\n   * and reference the Isotope instance as `this`\n  **/\n  var facadeMethods = [\n    '_resetLayout',\n    '_getItemLayoutPosition',\n    '_manageStamp',\n    '_getContainerSize',\n    '_getElementOffset',\n    'needsResizeLayout',\n    '_getOption'\n  ];\n\n  facadeMethods.forEach( function( methodName ) {\n    proto[ methodName ] = function() {\n      return Outlayer.prototype[ methodName ].apply( this.isotope, arguments );\n    };\n  });\n\n  // -----  ----- //\n\n  // for horizontal layout modes, check vertical size\n  proto.needsVerticalResizeLayout = function() {\n    // don't trigger if size did not change\n    var size = getSize( this.isotope.element );\n    // check that this.size and size are there\n    // IE8 triggers resize on body size change, so they might not be\n    var hasSizes = this.isotope.size && size;\n    return hasSizes && size.innerHeight != this.isotope.size.innerHeight;\n  };\n\n  // ----- measurements ----- //\n\n  proto._getMeasurement = function() {\n    this.isotope._getMeasurement.apply( this, arguments );\n  };\n\n  proto.getColumnWidth = function() {\n    this.getSegmentSize( 'column', 'Width' );\n  };\n\n  proto.getRowHeight = function() {\n    this.getSegmentSize( 'row', 'Height' );\n  };\n\n  /**\n   * get columnWidth or rowHeight\n   * segment: 'column' or 'row'\n   * size 'Width' or 'Height'\n  **/\n  proto.getSegmentSize = function( segment, size ) {\n    var segmentName = segment + size;\n    var outerSize = 'outer' + size;\n    // columnWidth / outerWidth // rowHeight / outerHeight\n    this._getMeasurement( segmentName, outerSize );\n    // got rowHeight or columnWidth, we can chill\n    if ( this[ segmentName ] ) {\n      return;\n    }\n    // fall back to item of first element\n    var firstItemSize = this.getFirstItemSize();\n    this[ segmentName ] = firstItemSize && firstItemSize[ outerSize ] ||\n      // or size of container\n      this.isotope.size[ 'inner' + size ];\n  };\n\n  proto.getFirstItemSize = function() {\n    var firstItem = this.isotope.filteredItems[0];\n    return firstItem && firstItem.element && getSize( firstItem.element );\n  };\n\n  // ----- methods that should reference isotope ----- //\n\n  proto.layout = function() {\n    this.isotope.layout.apply( this.isotope, arguments );\n  };\n\n  proto.getSize = function() {\n    this.isotope.getSize();\n    this.size = this.isotope.size;\n  };\n\n  // -------------------------- create -------------------------- //\n\n  LayoutMode.modes = {};\n\n  LayoutMode.create = function( namespace, options ) {\n\n    function Mode() {\n      LayoutMode.apply( this, arguments );\n    }\n\n    Mode.prototype = Object.create( proto );\n    Mode.prototype.constructor = Mode;\n\n    // default options\n    if ( options ) {\n      Mode.options = options;\n    }\n\n    Mode.prototype.namespace = namespace;\n    // register in Isotope\n    LayoutMode.modes[ namespace ] = Mode;\n\n    return Mode;\n  };\n\n  return LayoutMode;\n\n}));\n","'use strict';\n// TODO: Remove this module from `core-js@4` since it's replaced to module below\nrequire('../modules/es.weak-map.constructor');\n","'use strict';\nvar aCallable = require('../internals/a-callable');\nvar anObject = require('../internals/an-object');\nvar call = require('../internals/function-call');\nvar toIntegerOrInfinity = require('../internals/to-integer-or-infinity');\nvar getIteratorDirect = require('../internals/get-iterator-direct');\n\nvar INVALID_SIZE = 'Invalid size';\nvar $RangeError = RangeError;\nvar $TypeError = TypeError;\nvar max = Math.max;\n\nvar SetRecord = function (set, intSize) {\n  this.set = set;\n  this.size = max(intSize, 0);\n  this.has = aCallable(set.has);\n  this.keys = aCallable(set.keys);\n};\n\nSetRecord.prototype = {\n  getIterator: function () {\n    return getIteratorDirect(anObject(call(this.keys, this.set)));\n  },\n  includes: function (it) {\n    return call(this.has, this.set, it);\n  }\n};\n\n// `GetSetRecord` abstract operation\n// https://tc39.es/proposal-set-methods/#sec-getsetrecord\nmodule.exports = function (obj) {\n  anObject(obj);\n  var numSize = +obj.size;\n  // NOTE: If size is undefined, then numSize will be NaN\n  // eslint-disable-next-line no-self-compare -- NaN check\n  if (numSize !== numSize) throw new $TypeError(INVALID_SIZE);\n  var intSize = toIntegerOrInfinity(numSize);\n  if (intSize < 0) throw new $RangeError(INVALID_SIZE);\n  return new SetRecord(obj, intSize);\n};\n","'use strict';\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar addToUnscopables = require('../internals/add-to-unscopables');\nvar Iterators = require('../internals/iterators');\nvar InternalStateModule = require('../internals/internal-state');\nvar defineProperty = require('../internals/object-define-property').f;\nvar defineIterator = require('../internals/iterator-define');\nvar createIterResultObject = require('../internals/create-iter-result-object');\nvar IS_PURE = require('../internals/is-pure');\nvar DESCRIPTORS = require('../internals/descriptors');\n\nvar ARRAY_ITERATOR = 'Array Iterator';\nvar setInternalState = InternalStateModule.set;\nvar getInternalState = InternalStateModule.getterFor(ARRAY_ITERATOR);\n\n// `Array.prototype.entries` method\n// https://tc39.es/ecma262/#sec-array.prototype.entries\n// `Array.prototype.keys` method\n// https://tc39.es/ecma262/#sec-array.prototype.keys\n// `Array.prototype.values` method\n// https://tc39.es/ecma262/#sec-array.prototype.values\n// `Array.prototype[@@iterator]` method\n// https://tc39.es/ecma262/#sec-array.prototype-@@iterator\n// `CreateArrayIterator` internal method\n// https://tc39.es/ecma262/#sec-createarrayiterator\nmodule.exports = defineIterator(Array, 'Array', function (iterated, kind) {\n  setInternalState(this, {\n    type: ARRAY_ITERATOR,\n    target: toIndexedObject(iterated), // target\n    index: 0,                          // next index\n    kind: kind                         // kind\n  });\n// `%ArrayIteratorPrototype%.next` method\n// https://tc39.es/ecma262/#sec-%arrayiteratorprototype%.next\n}, function () {\n  var state = getInternalState(this);\n  var target = state.target;\n  var index = state.index++;\n  if (!target || index >= target.length) {\n    state.target = null;\n    return createIterResultObject(undefined, true);\n  }\n  switch (state.kind) {\n    case 'keys': return createIterResultObject(index, false);\n    case 'values': return createIterResultObject(target[index], false);\n  } return createIterResultObject([index, target[index]], false);\n}, 'values');\n\n// argumentsList[@@iterator] is %ArrayProto_values%\n// https://tc39.es/ecma262/#sec-createunmappedargumentsobject\n// https://tc39.es/ecma262/#sec-createmappedargumentsobject\nvar values = Iterators.Arguments = Iterators.Array;\n\n// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables('keys');\naddToUnscopables('values');\naddToUnscopables('entries');\n\n// V8 ~ Chrome 45- bug\nif (!IS_PURE && DESCRIPTORS && values.name !== 'values') try {\n  defineProperty(values, 'name', { value: 'values' });\n} catch (error) { /* empty */ }\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar toString = require('../internals/to-string');\nvar whitespaces = require('../internals/whitespaces');\n\nvar replace = uncurryThis(''.replace);\nvar ltrim = RegExp('^[' + whitespaces + ']+');\nvar rtrim = RegExp('(^|[^' + whitespaces + '])[' + whitespaces + ']+$');\n\n// `String.prototype.{ trim, trimStart, trimEnd, trimLeft, trimRight }` methods implementation\nvar createMethod = function (TYPE) {\n  return function ($this) {\n    var string = toString(requireObjectCoercible($this));\n    if (TYPE & 1) string = replace(string, ltrim, '');\n    if (TYPE & 2) string = replace(string, rtrim, '$1');\n    return string;\n  };\n};\n\nmodule.exports = {\n  // `String.prototype.{ trimLeft, trimStart }` methods\n  // https://tc39.es/ecma262/#sec-string.prototype.trimstart\n  start: createMethod(1),\n  // `String.prototype.{ trimRight, trimEnd }` methods\n  // https://tc39.es/ecma262/#sec-string.prototype.trimend\n  end: createMethod(2),\n  // `String.prototype.trim` method\n  // https://tc39.es/ecma262/#sec-string.prototype.trim\n  trim: createMethod(3)\n};\n","'use strict';\nvar aSet = require('../internals/a-set');\nvar size = require('../internals/set-size');\nvar iterate = require('../internals/set-iterate');\nvar getSetRecord = require('../internals/get-set-record');\n\n// `Set.prototype.isSubsetOf` method\n// https://tc39.es/ecma262/#sec-set.prototype.issubsetof\nmodule.exports = function isSubsetOf(other) {\n  var O = aSet(this);\n  var otherRec = getSetRecord(other);\n  if (size(O) > otherRec.size) return false;\n  return iterate(O, function (e) {\n    if (!otherRec.includes(e)) return false;\n  }, true) !== false;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar fails = require('../internals/fails');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar nativeGetOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;\nvar DESCRIPTORS = require('../internals/descriptors');\n\nvar FORCED = !DESCRIPTORS || fails(function () { nativeGetOwnPropertyDescriptor(1); });\n\n// `Object.getOwnPropertyDescriptor` method\n// https://tc39.es/ecma262/#sec-object.getownpropertydescriptor\n$({ target: 'Object', stat: true, forced: FORCED, sham: !DESCRIPTORS }, {\n  getOwnPropertyDescriptor: function getOwnPropertyDescriptor(it, key) {\n    return nativeGetOwnPropertyDescriptor(toIndexedObject(it), key);\n  }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar isDisjointFrom = require('../internals/set-is-disjoint-from');\nvar setMethodAcceptSetLike = require('../internals/set-method-accept-set-like');\n\nvar INCORRECT = !setMethodAcceptSetLike('isDisjointFrom', function (result) {\n  return !result;\n});\n\n// `Set.prototype.isDisjointFrom` method\n// https://tc39.es/ecma262/#sec-set.prototype.isdisjointfrom\n$({ target: 'Set', proto: true, real: true, forced: INCORRECT }, {\n  isDisjointFrom: isDisjointFrom\n});\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar fails = require('../internals/fails');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar toString = require('../internals/to-string');\nvar trim = require('../internals/string-trim').trim;\nvar whitespaces = require('../internals/whitespaces');\n\nvar charAt = uncurryThis(''.charAt);\nvar $parseFloat = globalThis.parseFloat;\nvar Symbol = globalThis.Symbol;\nvar ITERATOR = Symbol && Symbol.iterator;\nvar FORCED = 1 / $parseFloat(whitespaces + '-0') !== -Infinity\n  // MS Edge 18- broken with boxed symbols\n  || (ITERATOR && !fails(function () { $parseFloat(Object(ITERATOR)); }));\n\n// `parseFloat` method\n// https://tc39.es/ecma262/#sec-parsefloat-string\nmodule.exports = FORCED ? function parseFloat(string) {\n  var trimmedString = trim(toString(string));\n  var result = $parseFloat(trimmedString);\n  return result === 0 && charAt(trimmedString, 0) === '-' ? -0 : result;\n} : $parseFloat;\n","'use strict';\nvar $ = require('../internals/export');\nvar iterate = require('../internals/iterate');\nvar createProperty = require('../internals/create-property');\n\n// `Object.fromEntries` method\n// https://tc39.es/ecma262/#sec-object.fromentries\n$({ target: 'Object', stat: true }, {\n  fromEntries: function fromEntries(iterable) {\n    var obj = {};\n    iterate(iterable, function (k, v) {\n      createProperty(obj, k, v);\n    }, { AS_ENTRIES: true });\n    return obj;\n  }\n});\n","'use strict';\nvar isObject = require('../internals/is-object');\n\nmodule.exports = function (argument) {\n  return isObject(argument) || argument === null;\n};\n","'use strict';\nvar IteratorPrototype = require('../internals/iterators-core').IteratorPrototype;\nvar create = require('../internals/object-create');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar Iterators = require('../internals/iterators');\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (IteratorConstructor, NAME, next, ENUMERABLE_NEXT) {\n  var TO_STRING_TAG = NAME + ' Iterator';\n  IteratorConstructor.prototype = create(IteratorPrototype, { next: createPropertyDescriptor(+!ENUMERABLE_NEXT, next) });\n  setToStringTag(IteratorConstructor, TO_STRING_TAG, false, true);\n  Iterators[TO_STRING_TAG] = returnThis;\n  return IteratorConstructor;\n};\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar defineBuiltIns = require('../internals/define-built-ins');\nvar getWeakData = require('../internals/internal-metadata').getWeakData;\nvar anInstance = require('../internals/an-instance');\nvar anObject = require('../internals/an-object');\nvar isNullOrUndefined = require('../internals/is-null-or-undefined');\nvar isObject = require('../internals/is-object');\nvar iterate = require('../internals/iterate');\nvar ArrayIterationModule = require('../internals/array-iteration');\nvar hasOwn = require('../internals/has-own-property');\nvar InternalStateModule = require('../internals/internal-state');\n\nvar setInternalState = InternalStateModule.set;\nvar internalStateGetterFor = InternalStateModule.getterFor;\nvar find = ArrayIterationModule.find;\nvar findIndex = ArrayIterationModule.findIndex;\nvar splice = uncurryThis([].splice);\nvar id = 0;\n\n// fallback for uncaught frozen keys\nvar uncaughtFrozenStore = function (state) {\n  return state.frozen || (state.frozen = new UncaughtFrozenStore());\n};\n\nvar UncaughtFrozenStore = function () {\n  this.entries = [];\n};\n\nvar findUncaughtFrozen = function (store, key) {\n  return find(store.entries, function (it) {\n    return it[0] === key;\n  });\n};\n\nUncaughtFrozenStore.prototype = {\n  get: function (key) {\n    var entry = findUncaughtFrozen(this, key);\n    if (entry) return entry[1];\n  },\n  has: function (key) {\n    return !!findUncaughtFrozen(this, key);\n  },\n  set: function (key, value) {\n    var entry = findUncaughtFrozen(this, key);\n    if (entry) entry[1] = value;\n    else this.entries.push([key, value]);\n  },\n  'delete': function (key) {\n    var index = findIndex(this.entries, function (it) {\n      return it[0] === key;\n    });\n    if (~index) splice(this.entries, index, 1);\n    return !!~index;\n  }\n};\n\nmodule.exports = {\n  getConstructor: function (wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER) {\n    var Constructor = wrapper(function (that, iterable) {\n      anInstance(that, Prototype);\n      setInternalState(that, {\n        type: CONSTRUCTOR_NAME,\n        id: id++,\n        frozen: null\n      });\n      if (!isNullOrUndefined(iterable)) iterate(iterable, that[ADDER], { that: that, AS_ENTRIES: IS_MAP });\n    });\n\n    var Prototype = Constructor.prototype;\n\n    var getInternalState = internalStateGetterFor(CONSTRUCTOR_NAME);\n\n    var define = function (that, key, value) {\n      var state = getInternalState(that);\n      var data = getWeakData(anObject(key), true);\n      if (data === true) uncaughtFrozenStore(state).set(key, value);\n      else data[state.id] = value;\n      return that;\n    };\n\n    defineBuiltIns(Prototype, {\n      // `{ WeakMap, WeakSet }.prototype.delete(key)` methods\n      // https://tc39.es/ecma262/#sec-weakmap.prototype.delete\n      // https://tc39.es/ecma262/#sec-weakset.prototype.delete\n      'delete': function (key) {\n        var state = getInternalState(this);\n        if (!isObject(key)) return false;\n        var data = getWeakData(key);\n        if (data === true) return uncaughtFrozenStore(state)['delete'](key);\n        return data && hasOwn(data, state.id) && delete data[state.id];\n      },\n      // `{ WeakMap, WeakSet }.prototype.has(key)` methods\n      // https://tc39.es/ecma262/#sec-weakmap.prototype.has\n      // https://tc39.es/ecma262/#sec-weakset.prototype.has\n      has: function has(key) {\n        var state = getInternalState(this);\n        if (!isObject(key)) return false;\n        var data = getWeakData(key);\n        if (data === true) return uncaughtFrozenStore(state).has(key);\n        return data && hasOwn(data, state.id);\n      }\n    });\n\n    defineBuiltIns(Prototype, IS_MAP ? {\n      // `WeakMap.prototype.get(key)` method\n      // https://tc39.es/ecma262/#sec-weakmap.prototype.get\n      get: function get(key) {\n        var state = getInternalState(this);\n        if (isObject(key)) {\n          var data = getWeakData(key);\n          if (data === true) return uncaughtFrozenStore(state).get(key);\n          if (data) return data[state.id];\n        }\n      },\n      // `WeakMap.prototype.set(key, value)` method\n      // https://tc39.es/ecma262/#sec-weakmap.prototype.set\n      set: function set(key, value) {\n        return define(this, key, value);\n      }\n    } : {\n      // `WeakSet.prototype.add(value)` method\n      // https://tc39.es/ecma262/#sec-weakset.prototype.add\n      add: function add(value) {\n        return define(this, value, true);\n      }\n    });\n\n    return Constructor;\n  }\n};\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar isObject = require('../internals/is-object');\n\nvar document = globalThis.document;\n// typeof document.createElement is 'object' in old IE\nvar EXISTS = isObject(document) && isObject(document.createElement);\n\nmodule.exports = function (it) {\n  return EXISTS ? document.createElement(it) : {};\n};\n","import {\n\tBufferAttribute,\n\tBufferGeometry,\n\tFloat32BufferAttribute,\n\tInstancedBufferAttribute,\n\tInterleavedBuffer,\n\tInterleavedBufferAttribute,\n\tTriangleFanDrawMode,\n\tTriangleStripDrawMode,\n\tTrianglesDrawMode,\n\tVector3,\n} from 'three';\n\n/**\n * @module BufferGeometryUtils\n * @three_import import * as BufferGeometryUtils from 'three/addons/utils/BufferGeometryUtils.js';\n */\n\n/**\n * Computes vertex tangents using the MikkTSpace algorithm. MikkTSpace generates the same tangents consistently,\n * and is used in most modelling tools and normal map bakers. Use MikkTSpace for materials with normal maps,\n * because inconsistent tangents may lead to subtle visual issues in the normal map, particularly around mirrored\n * UV seams.\n *\n * In comparison to this method, {@link BufferGeometry#computeTangents} (a custom algorithm) generates tangents that\n * probably will not match the tangents in other software. The custom algorithm is sufficient for general use with a\n * custom material, and may be faster than MikkTSpace.\n *\n * Returns the original BufferGeometry. Indexed geometries will be de-indexed. Requires position, normal, and uv attributes.\n *\n * @param {BufferGeometry} geometry - The geometry to compute tangents for.\n * @param {Object} MikkTSpace - Instance of `examples/jsm/libs/mikktspace.module.js`, or `mikktspace` npm package.\n * Await `MikkTSpace.ready` before use.\n * @param {boolean} [negateSign=true] - Whether to negate the sign component (.w) of each tangent.\n * Required for normal map conventions in some formats, including glTF.\n * @return {BufferGeometry} The updated geometry.\n */\nfunction computeMikkTSpaceTangents( geometry, MikkTSpace, negateSign = true ) {\n\n\tif ( ! MikkTSpace || ! MikkTSpace.isReady ) {\n\n\t\tthrow new Error( 'BufferGeometryUtils: Initialized MikkTSpace library required.' );\n\n\t}\n\n\tif ( ! geometry.hasAttribute( 'position' ) || ! geometry.hasAttribute( 'normal' ) || ! geometry.hasAttribute( 'uv' ) ) {\n\n\t\tthrow new Error( 'BufferGeometryUtils: Tangents require \"position\", \"normal\", and \"uv\" attributes.' );\n\n\t}\n\n\tfunction getAttributeArray( attribute ) {\n\n\t\tif ( attribute.normalized || attribute.isInterleavedBufferAttribute ) {\n\n\t\t\tconst dstArray = new Float32Array( attribute.count * attribute.itemSize );\n\n\t\t\tfor ( let i = 0, j = 0; i < attribute.count; i ++ ) {\n\n\t\t\t\tdstArray[ j ++ ] = attribute.getX( i );\n\t\t\t\tdstArray[ j ++ ] = attribute.getY( i );\n\n\t\t\t\tif ( attribute.itemSize > 2 ) {\n\n\t\t\t\t\tdstArray[ j ++ ] = attribute.getZ( i );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn dstArray;\n\n\t\t}\n\n\t\tif ( attribute.array instanceof Float32Array ) {\n\n\t\t\treturn attribute.array;\n\n\t\t}\n\n\t\treturn new Float32Array( attribute.array );\n\n\t}\n\n\t// MikkTSpace algorithm requires non-indexed input.\n\n\tconst _geometry = geometry.index ? geometry.toNonIndexed() : geometry;\n\n\t// Compute vertex tangents.\n\n\tconst tangents = MikkTSpace.generateTangents(\n\n\t\tgetAttributeArray( _geometry.attributes.position ),\n\t\tgetAttributeArray( _geometry.attributes.normal ),\n\t\tgetAttributeArray( _geometry.attributes.uv )\n\n\t);\n\n\t// Texture coordinate convention of glTF differs from the apparent\n\t// default of the MikkTSpace library; .w component must be flipped.\n\n\tif ( negateSign ) {\n\n\t\tfor ( let i = 3; i < tangents.length; i += 4 ) {\n\n\t\t\ttangents[ i ] *= - 1;\n\n\t\t}\n\n\t}\n\n\t//\n\n\t_geometry.setAttribute( 'tangent', new BufferAttribute( tangents, 4 ) );\n\n\tif ( geometry !== _geometry ) {\n\n\t\tgeometry.copy( _geometry );\n\n\t}\n\n\treturn geometry;\n\n}\n\n/**\n * Merges a set of geometries into a single instance. All geometries must have compatible attributes.\n *\n * @param {Array<BufferGeometry>} geometries - The geometries to merge.\n * @param {boolean} [useGroups=false] - Whether to use groups or not.\n * @return {?BufferGeometry} The merged geometry. Returns `null` if the merge does not succeed.\n */\nfunction mergeGeometries( geometries, useGroups = false ) {\n\n\tconst isIndexed = geometries[ 0 ].index !== null;\n\n\tconst attributesUsed = new Set( Object.keys( geometries[ 0 ].attributes ) );\n\tconst morphAttributesUsed = new Set( Object.keys( geometries[ 0 ].morphAttributes ) );\n\n\tconst attributes = {};\n\tconst morphAttributes = {};\n\n\tconst morphTargetsRelative = geometries[ 0 ].morphTargetsRelative;\n\n\tconst mergedGeometry = new BufferGeometry();\n\n\tlet offset = 0;\n\n\tfor ( let i = 0; i < geometries.length; ++ i ) {\n\n\t\tconst geometry = geometries[ i ];\n\t\tlet attributesCount = 0;\n\n\t\t// ensure that all geometries are indexed, or none\n\n\t\tif ( isIndexed !== ( geometry.index !== null ) ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. All geometries must have compatible attributes; make sure index attribute exists among all geometries, or in none of them.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// gather attributes, exit early if they're different\n\n\t\tfor ( const name in geometry.attributes ) {\n\n\t\t\tif ( ! attributesUsed.has( name ) ) {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. All geometries must have compatible attributes; make sure \"' + name + '\" attribute exists among all geometries, or in none of them.' );\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tif ( attributes[ name ] === undefined ) attributes[ name ] = [];\n\n\t\t\tattributes[ name ].push( geometry.attributes[ name ] );\n\n\t\t\tattributesCount ++;\n\n\t\t}\n\n\t\t// ensure geometries have the same number of attributes\n\n\t\tif ( attributesCount !== attributesUsed.size ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. Make sure all geometries have the same number of attributes.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// gather morph attributes, exit early if they're different\n\n\t\tif ( morphTargetsRelative !== geometry.morphTargetsRelative ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. .morphTargetsRelative must be consistent throughout all geometries.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tfor ( const name in geometry.morphAttributes ) {\n\n\t\t\tif ( ! morphAttributesUsed.has( name ) ) {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '.  .morphAttributes must be consistent throughout all geometries.' );\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tif ( morphAttributes[ name ] === undefined ) morphAttributes[ name ] = [];\n\n\t\t\tmorphAttributes[ name ].push( geometry.morphAttributes[ name ] );\n\n\t\t}\n\n\t\tif ( useGroups ) {\n\n\t\t\tlet count;\n\n\t\t\tif ( isIndexed ) {\n\n\t\t\t\tcount = geometry.index.count;\n\n\t\t\t} else if ( geometry.attributes.position !== undefined ) {\n\n\t\t\t\tcount = geometry.attributes.position.count;\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. The geometry must have either an index or a position attribute' );\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tmergedGeometry.addGroup( offset, count, i );\n\n\t\t\toffset += count;\n\n\t\t}\n\n\t}\n\n\t// merge indices\n\n\tif ( isIndexed ) {\n\n\t\tlet indexOffset = 0;\n\t\tconst mergedIndex = [];\n\n\t\tfor ( let i = 0; i < geometries.length; ++ i ) {\n\n\t\t\tconst index = geometries[ i ].index;\n\n\t\t\tfor ( let j = 0; j < index.count; ++ j ) {\n\n\t\t\t\tmergedIndex.push( index.getX( j ) + indexOffset );\n\n\t\t\t}\n\n\t\t\tindexOffset += geometries[ i ].attributes.position.count;\n\n\t\t}\n\n\t\tmergedGeometry.setIndex( mergedIndex );\n\n\t}\n\n\t// merge attributes\n\n\tfor ( const name in attributes ) {\n\n\t\tconst mergedAttribute = mergeAttributes( attributes[ name ] );\n\n\t\tif ( ! mergedAttribute ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed while trying to merge the ' + name + ' attribute.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tmergedGeometry.setAttribute( name, mergedAttribute );\n\n\t}\n\n\t// merge morph attributes\n\n\tfor ( const name in morphAttributes ) {\n\n\t\tconst numMorphTargets = morphAttributes[ name ][ 0 ].length;\n\n\t\tif ( numMorphTargets === 0 ) break;\n\n\t\tmergedGeometry.morphAttributes = mergedGeometry.morphAttributes || {};\n\t\tmergedGeometry.morphAttributes[ name ] = [];\n\n\t\tfor ( let i = 0; i < numMorphTargets; ++ i ) {\n\n\t\t\tconst morphAttributesToMerge = [];\n\n\t\t\tfor ( let j = 0; j < morphAttributes[ name ].length; ++ j ) {\n\n\t\t\t\tmorphAttributesToMerge.push( morphAttributes[ name ][ j ][ i ] );\n\n\t\t\t}\n\n\t\t\tconst mergedMorphAttribute = mergeAttributes( morphAttributesToMerge );\n\n\t\t\tif ( ! mergedMorphAttribute ) {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed while trying to merge the ' + name + ' morphAttribute.' );\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tmergedGeometry.morphAttributes[ name ].push( mergedMorphAttribute );\n\n\t\t}\n\n\t}\n\n\treturn mergedGeometry;\n\n}\n\n/**\n * Merges a set of attributes into a single instance. All attributes must have compatible properties and types.\n * Instances of {@link InterleavedBufferAttribute} are not supported.\n *\n * @param {Array<BufferAttribute>} attributes - The attributes to merge.\n * @return {?BufferAttribute} The merged attribute. Returns `null` if the merge does not succeed.\n */\nfunction mergeAttributes( attributes ) {\n\n\tlet TypedArray;\n\tlet itemSize;\n\tlet normalized;\n\tlet gpuType = - 1;\n\tlet arrayLength = 0;\n\n\tfor ( let i = 0; i < attributes.length; ++ i ) {\n\n\t\tconst attribute = attributes[ i ];\n\n\t\tif ( TypedArray === undefined ) TypedArray = attribute.array.constructor;\n\t\tif ( TypedArray !== attribute.array.constructor ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.array must be of consistent array types across matching attributes.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tif ( itemSize === undefined ) itemSize = attribute.itemSize;\n\t\tif ( itemSize !== attribute.itemSize ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.itemSize must be consistent across matching attributes.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tif ( normalized === undefined ) normalized = attribute.normalized;\n\t\tif ( normalized !== attribute.normalized ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.normalized must be consistent across matching attributes.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tif ( gpuType === - 1 ) gpuType = attribute.gpuType;\n\t\tif ( gpuType !== attribute.gpuType ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.gpuType must be consistent across matching attributes.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tarrayLength += attribute.count * itemSize;\n\n\t}\n\n\tconst array = new TypedArray( arrayLength );\n\tconst result = new BufferAttribute( array, itemSize, normalized );\n\tlet offset = 0;\n\n\tfor ( let i = 0; i < attributes.length; ++ i ) {\n\n\t\tconst attribute = attributes[ i ];\n\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\tconst tupleOffset = offset / itemSize;\n\t\t\tfor ( let j = 0, l = attribute.count; j < l; j ++ ) {\n\n\t\t\t\tfor ( let c = 0; c < itemSize; c ++ ) {\n\n\t\t\t\t\tconst value = attribute.getComponent( j, c );\n\t\t\t\t\tresult.setComponent( j + tupleOffset, c, value );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tarray.set( attribute.array, offset );\n\n\t\t}\n\n\t\toffset += attribute.count * itemSize;\n\n\t}\n\n\tif ( gpuType !== undefined ) {\n\n\t\tresult.gpuType = gpuType;\n\n\t}\n\n\treturn result;\n\n}\n\n/**\n * Performs a deep clone of the given buffer attribute.\n *\n * @param {BufferAttribute} attribute - The attribute to clone.\n * @return {BufferAttribute} The cloned attribute.\n */\nfunction deepCloneAttribute( attribute ) {\n\n\tif ( attribute.isInstancedInterleavedBufferAttribute || attribute.isInterleavedBufferAttribute ) {\n\n\t\treturn deinterleaveAttribute( attribute );\n\n\t}\n\n\tif ( attribute.isInstancedBufferAttribute ) {\n\n\t\treturn new InstancedBufferAttribute().copy( attribute );\n\n\t}\n\n\treturn new BufferAttribute().copy( attribute );\n\n}\n\n/**\n * Interleaves a set of attributes and returns a new array of corresponding attributes that share a\n * single {@link InterleavedBuffer} instance. All attributes must have compatible types.\n *\n * @param {Array<BufferAttribute>} attributes - The attributes to interleave.\n * @return {?Array<InterleavedBufferAttribute>} An array of interleaved attributes. If interleave does not succeed, the method returns `null`.\n */\nfunction interleaveAttributes( attributes ) {\n\n\t// Interleaves the provided attributes into an InterleavedBuffer and returns\n\t// a set of InterleavedBufferAttributes for each attribute\n\tlet TypedArray;\n\tlet arrayLength = 0;\n\tlet stride = 0;\n\n\t// calculate the length and type of the interleavedBuffer\n\tfor ( let i = 0, l = attributes.length; i < l; ++ i ) {\n\n\t\tconst attribute = attributes[ i ];\n\n\t\tif ( TypedArray === undefined ) TypedArray = attribute.array.constructor;\n\t\tif ( TypedArray !== attribute.array.constructor ) {\n\n\t\t\tconsole.error( 'AttributeBuffers of different types cannot be interleaved' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tarrayLength += attribute.array.length;\n\t\tstride += attribute.itemSize;\n\n\t}\n\n\t// Create the set of buffer attributes\n\tconst interleavedBuffer = new InterleavedBuffer( new TypedArray( arrayLength ), stride );\n\tlet offset = 0;\n\tconst res = [];\n\tconst getters = [ 'getX', 'getY', 'getZ', 'getW' ];\n\tconst setters = [ 'setX', 'setY', 'setZ', 'setW' ];\n\n\tfor ( let j = 0, l = attributes.length; j < l; j ++ ) {\n\n\t\tconst attribute = attributes[ j ];\n\t\tconst itemSize = attribute.itemSize;\n\t\tconst count = attribute.count;\n\t\tconst iba = new InterleavedBufferAttribute( interleavedBuffer, itemSize, offset, attribute.normalized );\n\t\tres.push( iba );\n\n\t\toffset += itemSize;\n\n\t\t// Move the data for each attribute into the new interleavedBuffer\n\t\t// at the appropriate offset\n\t\tfor ( let c = 0; c < count; c ++ ) {\n\n\t\t\tfor ( let k = 0; k < itemSize; k ++ ) {\n\n\t\t\t\tiba[ setters[ k ] ]( c, attribute[ getters[ k ] ]( c ) );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn res;\n\n}\n\n/**\n * Returns a new, non-interleaved version of the given attribute.\n *\n * @param {InterleavedBufferAttribute} attribute - The interleaved attribute.\n * @return {BufferAttribute} The non-interleaved attribute.\n */\nfunction deinterleaveAttribute( attribute ) {\n\n\tconst cons = attribute.data.array.constructor;\n\tconst count = attribute.count;\n\tconst itemSize = attribute.itemSize;\n\tconst normalized = attribute.normalized;\n\n\tconst array = new cons( count * itemSize );\n\tlet newAttribute;\n\tif ( attribute.isInstancedInterleavedBufferAttribute ) {\n\n\t\tnewAttribute = new InstancedBufferAttribute( array, itemSize, normalized, attribute.meshPerAttribute );\n\n\t} else {\n\n\t\tnewAttribute = new BufferAttribute( array, itemSize, normalized );\n\n\t}\n\n\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\tnewAttribute.setX( i, attribute.getX( i ) );\n\n\t\tif ( itemSize >= 2 ) {\n\n\t\t\tnewAttribute.setY( i, attribute.getY( i ) );\n\n\t\t}\n\n\t\tif ( itemSize >= 3 ) {\n\n\t\t\tnewAttribute.setZ( i, attribute.getZ( i ) );\n\n\t\t}\n\n\t\tif ( itemSize >= 4 ) {\n\n\t\t\tnewAttribute.setW( i, attribute.getW( i ) );\n\n\t\t}\n\n\t}\n\n\treturn newAttribute;\n\n}\n\n/**\n * Deinterleaves all attributes on the given geometry.\n *\n * @param {BufferGeometry} geometry - The geometry to deinterleave.\n */\nfunction deinterleaveGeometry( geometry ) {\n\n\tconst attributes = geometry.attributes;\n\tconst morphTargets = geometry.morphTargets;\n\tconst attrMap = new Map();\n\n\tfor ( const key in attributes ) {\n\n\t\tconst attr = attributes[ key ];\n\t\tif ( attr.isInterleavedBufferAttribute ) {\n\n\t\t\tif ( ! attrMap.has( attr ) ) {\n\n\t\t\t\tattrMap.set( attr, deinterleaveAttribute( attr ) );\n\n\t\t\t}\n\n\t\t\tattributes[ key ] = attrMap.get( attr );\n\n\t\t}\n\n\t}\n\n\tfor ( const key in morphTargets ) {\n\n\t\tconst attr = morphTargets[ key ];\n\t\tif ( attr.isInterleavedBufferAttribute ) {\n\n\t\t\tif ( ! attrMap.has( attr ) ) {\n\n\t\t\t\tattrMap.set( attr, deinterleaveAttribute( attr ) );\n\n\t\t\t}\n\n\t\t\tmorphTargets[ key ] = attrMap.get( attr );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * Returns the amount of bytes used by all attributes to represent the geometry.\n *\n * @param {BufferGeometry} geometry - The geometry.\n * @return {number} The estimate bytes used.\n */\nfunction estimateBytesUsed( geometry ) {\n\n\t// Return the estimated memory used by this geometry in bytes\n\t// Calculate using itemSize, count, and BYTES_PER_ELEMENT to account\n\t// for InterleavedBufferAttributes.\n\tlet mem = 0;\n\tfor ( const name in geometry.attributes ) {\n\n\t\tconst attr = geometry.getAttribute( name );\n\t\tmem += attr.count * attr.itemSize * attr.array.BYTES_PER_ELEMENT;\n\n\t}\n\n\tconst indices = geometry.getIndex();\n\tmem += indices ? indices.count * indices.itemSize * indices.array.BYTES_PER_ELEMENT : 0;\n\treturn mem;\n\n}\n\n/**\n * Returns a new geometry with vertices for which all similar vertex attributes (within tolerance) are merged.\n *\n * @param {BufferGeometry} geometry - The geometry to merge vertices for.\n * @param {number} [tolerance=1e-4] - The tolerance value.\n * @return {BufferGeometry} - The new geometry with merged vertices.\n */\nfunction mergeVertices( geometry, tolerance = 1e-4 ) {\n\n\ttolerance = Math.max( tolerance, Number.EPSILON );\n\n\t// Generate an index buffer if the geometry doesn't have one, or optimize it\n\t// if it's already available.\n\tconst hashToIndex = {};\n\tconst indices = geometry.getIndex();\n\tconst positions = geometry.getAttribute( 'position' );\n\tconst vertexCount = indices ? indices.count : positions.count;\n\n\t// next value for triangle indices\n\tlet nextIndex = 0;\n\n\t// attributes and new attribute arrays\n\tconst attributeNames = Object.keys( geometry.attributes );\n\tconst tmpAttributes = {};\n\tconst tmpMorphAttributes = {};\n\tconst newIndices = [];\n\tconst getters = [ 'getX', 'getY', 'getZ', 'getW' ];\n\tconst setters = [ 'setX', 'setY', 'setZ', 'setW' ];\n\n\t// Initialize the arrays, allocating space conservatively. Extra\n\t// space will be trimmed in the last step.\n\tfor ( let i = 0, l = attributeNames.length; i < l; i ++ ) {\n\n\t\tconst name = attributeNames[ i ];\n\t\tconst attr = geometry.attributes[ name ];\n\n\t\ttmpAttributes[ name ] = new attr.constructor(\n\t\t\tnew attr.array.constructor( attr.count * attr.itemSize ),\n\t\t\tattr.itemSize,\n\t\t\tattr.normalized\n\t\t);\n\n\t\tconst morphAttributes = geometry.morphAttributes[ name ];\n\t\tif ( morphAttributes ) {\n\n\t\t\tif ( ! tmpMorphAttributes[ name ] ) tmpMorphAttributes[ name ] = [];\n\t\t\tmorphAttributes.forEach( ( morphAttr, i ) => {\n\n\t\t\t\tconst array = new morphAttr.array.constructor( morphAttr.count * morphAttr.itemSize );\n\t\t\t\ttmpMorphAttributes[ name ][ i ] = new morphAttr.constructor( array, morphAttr.itemSize, morphAttr.normalized );\n\n\t\t\t} );\n\n\t\t}\n\n\t}\n\n\t// convert the error tolerance to an amount of decimal places to truncate to\n\tconst halfTolerance = tolerance * 0.5;\n\tconst exponent = Math.log10( 1 / tolerance );\n\tconst hashMultiplier = Math.pow( 10, exponent );\n\tconst hashAdditive = halfTolerance * hashMultiplier;\n\tfor ( let i = 0; i < vertexCount; i ++ ) {\n\n\t\tconst index = indices ? indices.getX( i ) : i;\n\n\t\t// Generate a hash for the vertex attributes at the current index 'i'\n\t\tlet hash = '';\n\t\tfor ( let j = 0, l = attributeNames.length; j < l; j ++ ) {\n\n\t\t\tconst name = attributeNames[ j ];\n\t\t\tconst attribute = geometry.getAttribute( name );\n\t\t\tconst itemSize = attribute.itemSize;\n\n\t\t\tfor ( let k = 0; k < itemSize; k ++ ) {\n\n\t\t\t\t// double tilde truncates the decimal value\n\t\t\t\thash += `${ ~ ~ ( attribute[ getters[ k ] ]( index ) * hashMultiplier + hashAdditive ) },`;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Add another reference to the vertex if it's already\n\t\t// used by another index\n\t\tif ( hash in hashToIndex ) {\n\n\t\t\tnewIndices.push( hashToIndex[ hash ] );\n\n\t\t} else {\n\n\t\t\t// copy data to the new index in the temporary attributes\n\t\t\tfor ( let j = 0, l = attributeNames.length; j < l; j ++ ) {\n\n\t\t\t\tconst name = attributeNames[ j ];\n\t\t\t\tconst attribute = geometry.getAttribute( name );\n\t\t\t\tconst morphAttributes = geometry.morphAttributes[ name ];\n\t\t\t\tconst itemSize = attribute.itemSize;\n\t\t\t\tconst newArray = tmpAttributes[ name ];\n\t\t\t\tconst newMorphArrays = tmpMorphAttributes[ name ];\n\n\t\t\t\tfor ( let k = 0; k < itemSize; k ++ ) {\n\n\t\t\t\t\tconst getterFunc = getters[ k ];\n\t\t\t\t\tconst setterFunc = setters[ k ];\n\t\t\t\t\tnewArray[ setterFunc ]( nextIndex, attribute[ getterFunc ]( index ) );\n\n\t\t\t\t\tif ( morphAttributes ) {\n\n\t\t\t\t\t\tfor ( let m = 0, ml = morphAttributes.length; m < ml; m ++ ) {\n\n\t\t\t\t\t\t\tnewMorphArrays[ m ][ setterFunc ]( nextIndex, morphAttributes[ m ][ getterFunc ]( index ) );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\thashToIndex[ hash ] = nextIndex;\n\t\t\tnewIndices.push( nextIndex );\n\t\t\tnextIndex ++;\n\n\t\t}\n\n\t}\n\n\t// generate result BufferGeometry\n\tconst result = geometry.clone();\n\tfor ( const name in geometry.attributes ) {\n\n\t\tconst tmpAttribute = tmpAttributes[ name ];\n\n\t\tresult.setAttribute( name, new tmpAttribute.constructor(\n\t\t\ttmpAttribute.array.slice( 0, nextIndex * tmpAttribute.itemSize ),\n\t\t\ttmpAttribute.itemSize,\n\t\t\ttmpAttribute.normalized,\n\t\t) );\n\n\t\tif ( ! ( name in tmpMorphAttributes ) ) continue;\n\n\t\tfor ( let j = 0; j < tmpMorphAttributes[ name ].length; j ++ ) {\n\n\t\t\tconst tmpMorphAttribute = tmpMorphAttributes[ name ][ j ];\n\n\t\t\tresult.morphAttributes[ name ][ j ] = new tmpMorphAttribute.constructor(\n\t\t\t\ttmpMorphAttribute.array.slice( 0, nextIndex * tmpMorphAttribute.itemSize ),\n\t\t\t\ttmpMorphAttribute.itemSize,\n\t\t\t\ttmpMorphAttribute.normalized,\n\t\t\t);\n\n\t\t}\n\n\t}\n\n\t// indices\n\n\tresult.setIndex( newIndices );\n\n\treturn result;\n\n}\n\n/**\n * Returns a new indexed geometry based on `TrianglesDrawMode` draw mode.\n * This mode corresponds to the `gl.TRIANGLES` primitive in WebGL.\n *\n * @param {BufferGeometry} geometry - The geometry to convert.\n * @param {number} drawMode - The current draw mode.\n * @return {BufferGeometry} The new geometry using `TrianglesDrawMode`.\n */\nfunction toTrianglesDrawMode( geometry, drawMode ) {\n\n\tif ( drawMode === TrianglesDrawMode ) {\n\n\t\tconsole.warn( 'THREE.BufferGeometryUtils.toTrianglesDrawMode(): Geometry already defined as triangles.' );\n\t\treturn geometry;\n\n\t}\n\n\tif ( drawMode === TriangleFanDrawMode || drawMode === TriangleStripDrawMode ) {\n\n\t\tlet index = geometry.getIndex();\n\n\t\t// generate index if not present\n\n\t\tif ( index === null ) {\n\n\t\t\tconst indices = [];\n\n\t\t\tconst position = geometry.getAttribute( 'position' );\n\n\t\t\tif ( position !== undefined ) {\n\n\t\t\t\tfor ( let i = 0; i < position.count; i ++ ) {\n\n\t\t\t\t\tindices.push( i );\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.setIndex( indices );\n\t\t\t\tindex = geometry.getIndex();\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometryUtils.toTrianglesDrawMode(): Undefined position attribute. Processing not possible.' );\n\t\t\t\treturn geometry;\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tconst numberOfTriangles = index.count - 2;\n\t\tconst newIndices = [];\n\n\t\tif ( drawMode === TriangleFanDrawMode ) {\n\n\t\t\t// gl.TRIANGLE_FAN\n\n\t\t\tfor ( let i = 1; i <= numberOfTriangles; i ++ ) {\n\n\t\t\t\tnewIndices.push( index.getX( 0 ) );\n\t\t\t\tnewIndices.push( index.getX( i ) );\n\t\t\t\tnewIndices.push( index.getX( i + 1 ) );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// gl.TRIANGLE_STRIP\n\n\t\t\tfor ( let i = 0; i < numberOfTriangles; i ++ ) {\n\n\t\t\t\tif ( i % 2 === 0 ) {\n\n\t\t\t\t\tnewIndices.push( index.getX( i ) );\n\t\t\t\t\tnewIndices.push( index.getX( i + 1 ) );\n\t\t\t\t\tnewIndices.push( index.getX( i + 2 ) );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tnewIndices.push( index.getX( i + 2 ) );\n\t\t\t\t\tnewIndices.push( index.getX( i + 1 ) );\n\t\t\t\t\tnewIndices.push( index.getX( i ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( ( newIndices.length / 3 ) !== numberOfTriangles ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unable to generate correct amount of triangles.' );\n\n\t\t}\n\n\t\t// build final geometry\n\n\t\tconst newGeometry = geometry.clone();\n\t\tnewGeometry.setIndex( newIndices );\n\t\tnewGeometry.clearGroups();\n\n\t\treturn newGeometry;\n\n\t} else {\n\n\t\tconsole.error( 'THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unknown draw mode:', drawMode );\n\t\treturn geometry;\n\n\t}\n\n}\n\n/**\n * Calculates the morphed attributes of a morphed/skinned BufferGeometry.\n *\n * Helpful for Raytracing or Decals (i.e. a `DecalGeometry` applied to a morphed Object with a `BufferGeometry`\n * will use the original `BufferGeometry`, not the morphed/skinned one, generating an incorrect result.\n * Using this function to create a shadow `Object3`D the `DecalGeometry` can be correctly generated).\n *\n * @param {Mesh|Line|Points} object - The 3D object to compute morph attributes for.\n * @return {Object} An object with original position/normal attributes and morphed ones.\n */\nfunction computeMorphedAttributes( object ) {\n\n\tconst _vA = new Vector3();\n\tconst _vB = new Vector3();\n\tconst _vC = new Vector3();\n\n\tconst _tempA = new Vector3();\n\tconst _tempB = new Vector3();\n\tconst _tempC = new Vector3();\n\n\tconst _morphA = new Vector3();\n\tconst _morphB = new Vector3();\n\tconst _morphC = new Vector3();\n\n\tfunction _calculateMorphedAttributeData(\n\t\tobject,\n\t\tattribute,\n\t\tmorphAttribute,\n\t\tmorphTargetsRelative,\n\t\ta,\n\t\tb,\n\t\tc,\n\t\tmodifiedAttributeArray\n\t) {\n\n\t\t_vA.fromBufferAttribute( attribute, a );\n\t\t_vB.fromBufferAttribute( attribute, b );\n\t\t_vC.fromBufferAttribute( attribute, c );\n\n\t\tconst morphInfluences = object.morphTargetInfluences;\n\n\t\tif ( morphAttribute && morphInfluences ) {\n\n\t\t\t_morphA.set( 0, 0, 0 );\n\t\t\t_morphB.set( 0, 0, 0 );\n\t\t\t_morphC.set( 0, 0, 0 );\n\n\t\t\tfor ( let i = 0, il = morphAttribute.length; i < il; i ++ ) {\n\n\t\t\t\tconst influence = morphInfluences[ i ];\n\t\t\t\tconst morph = morphAttribute[ i ];\n\n\t\t\t\tif ( influence === 0 ) continue;\n\n\t\t\t\t_tempA.fromBufferAttribute( morph, a );\n\t\t\t\t_tempB.fromBufferAttribute( morph, b );\n\t\t\t\t_tempC.fromBufferAttribute( morph, c );\n\n\t\t\t\tif ( morphTargetsRelative ) {\n\n\t\t\t\t\t_morphA.addScaledVector( _tempA, influence );\n\t\t\t\t\t_morphB.addScaledVector( _tempB, influence );\n\t\t\t\t\t_morphC.addScaledVector( _tempC, influence );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_morphA.addScaledVector( _tempA.sub( _vA ), influence );\n\t\t\t\t\t_morphB.addScaledVector( _tempB.sub( _vB ), influence );\n\t\t\t\t\t_morphC.addScaledVector( _tempC.sub( _vC ), influence );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_vA.add( _morphA );\n\t\t\t_vB.add( _morphB );\n\t\t\t_vC.add( _morphC );\n\n\t\t}\n\n\t\tif ( object.isSkinnedMesh ) {\n\n\t\t\tobject.applyBoneTransform( a, _vA );\n\t\t\tobject.applyBoneTransform( b, _vB );\n\t\t\tobject.applyBoneTransform( c, _vC );\n\n\t\t}\n\n\t\tmodifiedAttributeArray[ a * 3 + 0 ] = _vA.x;\n\t\tmodifiedAttributeArray[ a * 3 + 1 ] = _vA.y;\n\t\tmodifiedAttributeArray[ a * 3 + 2 ] = _vA.z;\n\t\tmodifiedAttributeArray[ b * 3 + 0 ] = _vB.x;\n\t\tmodifiedAttributeArray[ b * 3 + 1 ] = _vB.y;\n\t\tmodifiedAttributeArray[ b * 3 + 2 ] = _vB.z;\n\t\tmodifiedAttributeArray[ c * 3 + 0 ] = _vC.x;\n\t\tmodifiedAttributeArray[ c * 3 + 1 ] = _vC.y;\n\t\tmodifiedAttributeArray[ c * 3 + 2 ] = _vC.z;\n\n\t}\n\n\tconst geometry = object.geometry;\n\tconst material = object.material;\n\n\tlet a, b, c;\n\tconst index = geometry.index;\n\tconst positionAttribute = geometry.attributes.position;\n\tconst morphPosition = geometry.morphAttributes.position;\n\tconst morphTargetsRelative = geometry.morphTargetsRelative;\n\tconst normalAttribute = geometry.attributes.normal;\n\tconst morphNormal = geometry.morphAttributes.position;\n\n\tconst groups = geometry.groups;\n\tconst drawRange = geometry.drawRange;\n\tlet i, j, il, jl;\n\tlet group;\n\tlet start, end;\n\n\tconst modifiedPosition = new Float32Array( positionAttribute.count * positionAttribute.itemSize );\n\tconst modifiedNormal = new Float32Array( normalAttribute.count * normalAttribute.itemSize );\n\n\tif ( index !== null ) {\n\n\t\t// indexed buffer geometry\n\n\t\tif ( Array.isArray( material ) ) {\n\n\t\t\tfor ( i = 0, il = groups.length; i < il; i ++ ) {\n\n\t\t\t\tgroup = groups[ i ];\n\n\t\t\t\tstart = Math.max( group.start, drawRange.start );\n\t\t\t\tend = Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) );\n\n\t\t\t\tfor ( j = start, jl = end; j < jl; j += 3 ) {\n\n\t\t\t\t\ta = index.getX( j );\n\t\t\t\t\tb = index.getX( j + 1 );\n\t\t\t\t\tc = index.getX( j + 2 );\n\n\t\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\t\tobject,\n\t\t\t\t\t\tpositionAttribute,\n\t\t\t\t\t\tmorphPosition,\n\t\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\t\ta, b, c,\n\t\t\t\t\t\tmodifiedPosition\n\t\t\t\t\t);\n\n\t\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\t\tobject,\n\t\t\t\t\t\tnormalAttribute,\n\t\t\t\t\t\tmorphNormal,\n\t\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\t\ta, b, c,\n\t\t\t\t\t\tmodifiedNormal\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tstart = Math.max( 0, drawRange.start );\n\t\t\tend = Math.min( index.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( i = start, il = end; i < il; i += 3 ) {\n\n\t\t\t\ta = index.getX( i );\n\t\t\t\tb = index.getX( i + 1 );\n\t\t\t\tc = index.getX( i + 2 );\n\n\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\tobject,\n\t\t\t\t\tpositionAttribute,\n\t\t\t\t\tmorphPosition,\n\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\ta, b, c,\n\t\t\t\t\tmodifiedPosition\n\t\t\t\t);\n\n\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\tobject,\n\t\t\t\t\tnormalAttribute,\n\t\t\t\t\tmorphNormal,\n\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\ta, b, c,\n\t\t\t\t\tmodifiedNormal\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t}\n\n\t} else {\n\n\t\t// non-indexed buffer geometry\n\n\t\tif ( Array.isArray( material ) ) {\n\n\t\t\tfor ( i = 0, il = groups.length; i < il; i ++ ) {\n\n\t\t\t\tgroup = groups[ i ];\n\n\t\t\t\tstart = Math.max( group.start, drawRange.start );\n\t\t\t\tend = Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) );\n\n\t\t\t\tfor ( j = start, jl = end; j < jl; j += 3 ) {\n\n\t\t\t\t\ta = j;\n\t\t\t\t\tb = j + 1;\n\t\t\t\t\tc = j + 2;\n\n\t\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\t\tobject,\n\t\t\t\t\t\tpositionAttribute,\n\t\t\t\t\t\tmorphPosition,\n\t\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\t\ta, b, c,\n\t\t\t\t\t\tmodifiedPosition\n\t\t\t\t\t);\n\n\t\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\t\tobject,\n\t\t\t\t\t\tnormalAttribute,\n\t\t\t\t\t\tmorphNormal,\n\t\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\t\ta, b, c,\n\t\t\t\t\t\tmodifiedNormal\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tstart = Math.max( 0, drawRange.start );\n\t\t\tend = Math.min( positionAttribute.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( i = start, il = end; i < il; i += 3 ) {\n\n\t\t\t\ta = i;\n\t\t\t\tb = i + 1;\n\t\t\t\tc = i + 2;\n\n\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\tobject,\n\t\t\t\t\tpositionAttribute,\n\t\t\t\t\tmorphPosition,\n\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\ta, b, c,\n\t\t\t\t\tmodifiedPosition\n\t\t\t\t);\n\n\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\tobject,\n\t\t\t\t\tnormalAttribute,\n\t\t\t\t\tmorphNormal,\n\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\ta, b, c,\n\t\t\t\t\tmodifiedNormal\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tconst morphedPositionAttribute = new Float32BufferAttribute( modifiedPosition, 3 );\n\tconst morphedNormalAttribute = new Float32BufferAttribute( modifiedNormal, 3 );\n\n\treturn {\n\n\t\tpositionAttribute: positionAttribute,\n\t\tnormalAttribute: normalAttribute,\n\t\tmorphedPositionAttribute: morphedPositionAttribute,\n\t\tmorphedNormalAttribute: morphedNormalAttribute\n\n\t};\n\n}\n\n/**\n * Merges the {@link BufferGeometry#groups} for the given geometry.\n *\n * @param {BufferGeometry} geometry - The geometry to modify.\n * @return {BufferGeometry} - The updated geometry\n */\nfunction mergeGroups( geometry ) {\n\n\tif ( geometry.groups.length === 0 ) {\n\n\t\tconsole.warn( 'THREE.BufferGeometryUtils.mergeGroups(): No groups are defined. Nothing to merge.' );\n\t\treturn geometry;\n\n\t}\n\n\tlet groups = geometry.groups;\n\n\t// sort groups by material index\n\n\tgroups = groups.sort( ( a, b ) => {\n\n\t\tif ( a.materialIndex !== b.materialIndex ) return a.materialIndex - b.materialIndex;\n\n\t\treturn a.start - b.start;\n\n\t} );\n\n\t// create index for non-indexed geometries\n\n\tif ( geometry.getIndex() === null ) {\n\n\t\tconst positionAttribute = geometry.getAttribute( 'position' );\n\t\tconst indices = [];\n\n\t\tfor ( let i = 0; i < positionAttribute.count; i += 3 ) {\n\n\t\t\tindices.push( i, i + 1, i + 2 );\n\n\t\t}\n\n\t\tgeometry.setIndex( indices );\n\n\t}\n\n\t// sort index\n\n\tconst index = geometry.getIndex();\n\n\tconst newIndices = [];\n\n\tfor ( let i = 0; i < groups.length; i ++ ) {\n\n\t\tconst group = groups[ i ];\n\n\t\tconst groupStart = group.start;\n\t\tconst groupLength = groupStart + group.count;\n\n\t\tfor ( let j = groupStart; j < groupLength; j ++ ) {\n\n\t\t\tnewIndices.push( index.getX( j ) );\n\n\t\t}\n\n\t}\n\n\tgeometry.dispose(); // Required to force buffer recreation\n\tgeometry.setIndex( newIndices );\n\n\t// update groups indices\n\n\tlet start = 0;\n\n\tfor ( let i = 0; i < groups.length; i ++ ) {\n\n\t\tconst group = groups[ i ];\n\n\t\tgroup.start = start;\n\t\tstart += group.count;\n\n\t}\n\n\t// merge groups\n\n\tlet currentGroup = groups[ 0 ];\n\n\tgeometry.groups = [ currentGroup ];\n\n\tfor ( let i = 1; i < groups.length; i ++ ) {\n\n\t\tconst group = groups[ i ];\n\n\t\tif ( currentGroup.materialIndex === group.materialIndex ) {\n\n\t\t\tcurrentGroup.count += group.count;\n\n\t\t} else {\n\n\t\t\tcurrentGroup = group;\n\t\t\tgeometry.groups.push( currentGroup );\n\n\t\t}\n\n\t}\n\n\treturn geometry;\n\n}\n\n/**\n * Modifies the supplied geometry if it is non-indexed, otherwise creates a new,\n * non-indexed geometry. Returns the geometry with smooth normals everywhere except\n * faces that meet at an angle greater than the crease angle.\n *\n * @param {BufferGeometry} geometry - The geometry to modify.\n * @param {number} [creaseAngle=Math.PI/3] - The crease angle in radians.\n * @return {BufferGeometry} - The updated geometry\n */\nfunction toCreasedNormals( geometry, creaseAngle = Math.PI / 3 /* 60 degrees */ ) {\n\n\tconst creaseDot = Math.cos( creaseAngle );\n\tconst hashMultiplier = ( 1 + 1e-10 ) * 1e2;\n\n\t// reusable vectors\n\tconst verts = [ new Vector3(), new Vector3(), new Vector3() ];\n\tconst tempVec1 = new Vector3();\n\tconst tempVec2 = new Vector3();\n\tconst tempNorm = new Vector3();\n\tconst tempNorm2 = new Vector3();\n\n\t// hashes a vector\n\tfunction hashVertex( v ) {\n\n\t\tconst x = ~ ~ ( v.x * hashMultiplier );\n\t\tconst y = ~ ~ ( v.y * hashMultiplier );\n\t\tconst z = ~ ~ ( v.z * hashMultiplier );\n\t\treturn `${x},${y},${z}`;\n\n\t}\n\n\t// BufferGeometry.toNonIndexed() warns if the geometry is non-indexed\n\t// and returns the original geometry\n\tconst resultGeometry = geometry.index ? geometry.toNonIndexed() : geometry;\n\tconst posAttr = resultGeometry.attributes.position;\n\tconst vertexMap = {};\n\n\t// find all the normals shared by commonly located vertices\n\tfor ( let i = 0, l = posAttr.count / 3; i < l; i ++ ) {\n\n\t\tconst i3 = 3 * i;\n\t\tconst a = verts[ 0 ].fromBufferAttribute( posAttr, i3 + 0 );\n\t\tconst b = verts[ 1 ].fromBufferAttribute( posAttr, i3 + 1 );\n\t\tconst c = verts[ 2 ].fromBufferAttribute( posAttr, i3 + 2 );\n\n\t\ttempVec1.subVectors( c, b );\n\t\ttempVec2.subVectors( a, b );\n\n\t\t// add the normal to the map for all vertices\n\t\tconst normal = new Vector3().crossVectors( tempVec1, tempVec2 ).normalize();\n\t\tfor ( let n = 0; n < 3; n ++ ) {\n\n\t\t\tconst vert = verts[ n ];\n\t\t\tconst hash = hashVertex( vert );\n\t\t\tif ( ! ( hash in vertexMap ) ) {\n\n\t\t\t\tvertexMap[ hash ] = [];\n\n\t\t\t}\n\n\t\t\tvertexMap[ hash ].push( normal );\n\n\t\t}\n\n\t}\n\n\t// average normals from all vertices that share a common location if they are within the\n\t// provided crease threshold\n\tconst normalArray = new Float32Array( posAttr.count * 3 );\n\tconst normAttr = new BufferAttribute( normalArray, 3, false );\n\tfor ( let i = 0, l = posAttr.count / 3; i < l; i ++ ) {\n\n\t\t// get the face normal for this vertex\n\t\tconst i3 = 3 * i;\n\t\tconst a = verts[ 0 ].fromBufferAttribute( posAttr, i3 + 0 );\n\t\tconst b = verts[ 1 ].fromBufferAttribute( posAttr, i3 + 1 );\n\t\tconst c = verts[ 2 ].fromBufferAttribute( posAttr, i3 + 2 );\n\n\t\ttempVec1.subVectors( c, b );\n\t\ttempVec2.subVectors( a, b );\n\n\t\ttempNorm.crossVectors( tempVec1, tempVec2 ).normalize();\n\n\t\t// average all normals that meet the threshold and set the normal value\n\t\tfor ( let n = 0; n < 3; n ++ ) {\n\n\t\t\tconst vert = verts[ n ];\n\t\t\tconst hash = hashVertex( vert );\n\t\t\tconst otherNormals = vertexMap[ hash ];\n\t\t\ttempNorm2.set( 0, 0, 0 );\n\n\t\t\tfor ( let k = 0, lk = otherNormals.length; k < lk; k ++ ) {\n\n\t\t\t\tconst otherNorm = otherNormals[ k ];\n\t\t\t\tif ( tempNorm.dot( otherNorm ) > creaseDot ) {\n\n\t\t\t\t\ttempNorm2.add( otherNorm );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\ttempNorm2.normalize();\n\t\t\tnormAttr.setXYZ( i3 + n, tempNorm2.x, tempNorm2.y, tempNorm2.z );\n\n\t\t}\n\n\t}\n\n\tresultGeometry.setAttribute( 'normal', normAttr );\n\treturn resultGeometry;\n\n}\n\nexport {\n\tcomputeMikkTSpaceTangents,\n\tmergeGeometries,\n\tmergeAttributes,\n\tdeepCloneAttribute,\n\tdeinterleaveAttribute,\n\tdeinterleaveGeometry,\n\tinterleaveAttributes,\n\testimateBytesUsed,\n\tmergeVertices,\n\ttoTrianglesDrawMode,\n\tcomputeMorphedAttributes,\n\tmergeGroups,\n\ttoCreasedNormals\n};\n","import {\n\tAnimationClip,\n\tBone,\n\tBox3,\n\tBufferAttribute,\n\tBufferGeometry,\n\tClampToEdgeWrapping,\n\tColor,\n\tColorManagement,\n\tDirectionalLight,\n\tDoubleSide,\n\tFileLoader,\n\tFrontSide,\n\tGroup,\n\tImageBitmapLoader,\n\tInstancedMesh,\n\tInterleavedBuffer,\n\tInterleavedBufferAttribute,\n\tInterpolant,\n\tInterpolateDiscrete,\n\tInterpolateLinear,\n\tLine,\n\tLineBasicMaterial,\n\tLineLoop,\n\tLineSegments,\n\tLinearFilter,\n\tLinearMipmapLinearFilter,\n\tLinearMipmapNearestFilter,\n\tLinearSRGBColorSpace,\n\tLoader,\n\tLoaderUtils,\n\tMaterial,\n\tMathUtils,\n\tMatrix4,\n\tMesh,\n\tMeshBasicMaterial,\n\tMeshPhysicalMaterial,\n\tMeshStandardMaterial,\n\tMirroredRepeatWrapping,\n\tNearestFilter,\n\tNearestMipmapLinearFilter,\n\tNearestMipmapNearestFilter,\n\tNumberKeyframeTrack,\n\tObject3D,\n\tOrthographicCamera,\n\tPerspectiveCamera,\n\tPointLight,\n\tPoints,\n\tPointsMaterial,\n\tPropertyBinding,\n\tQuaternion,\n\tQuaternionKeyframeTrack,\n\tRepeatWrapping,\n\tSkeleton,\n\tSkinnedMesh,\n\tSphere,\n\tSpotLight,\n\tTexture,\n\tTextureLoader,\n\tTriangleFanDrawMode,\n\tTriangleStripDrawMode,\n\tVector2,\n\tVector3,\n\tVectorKeyframeTrack,\n\tSRGBColorSpace,\n\tInstancedBufferAttribute\n} from 'three';\nimport { toTrianglesDrawMode } from '../utils/BufferGeometryUtils.js';\n\n/**\n * A loader for the glTF 2.0 format.\n *\n * [glTF](https://www.khronos.org/gltf/} (GL Transmission Format) is an [open format specification]{@link https://github.com/KhronosGroup/glTF/tree/main/specification/2.0)\n * for efficient delivery and loading of 3D content. Assets may be provided either in JSON (.gltf) or binary (.glb)\n * format. External files store textures (.jpg, .png) and additional binary data (.bin). A glTF asset may deliver\n * one or more scenes, including meshes, materials, textures, skins, skeletons, morph targets, animations, lights,\n * and/or cameras.\n *\n * `GLTFLoader` uses {@link ImageBitmapLoader} whenever possible. Be advised that image bitmaps are not\n * automatically GC-collected when they are no longer referenced, and they require special handling during\n * the disposal process.\n *\n * `GLTFLoader` supports the following glTF 2.0 extensions:\n * - KHR_draco_mesh_compression\n * - KHR_materials_clearcoat\n * - KHR_materials_dispersion\n * - KHR_materials_ior\n * - KHR_materials_specular\n * - KHR_materials_transmission\n * - KHR_materials_iridescence\n * - KHR_materials_unlit\n * - KHR_materials_volume\n * - KHR_mesh_quantization\n * - KHR_lights_punctual\n * - KHR_texture_basisu\n * - KHR_texture_transform\n * - EXT_texture_webp\n * - EXT_meshopt_compression\n * - EXT_mesh_gpu_instancing\n *\n * The following glTF 2.0 extension is supported by an external user plugin:\n * - [KHR_materials_variants](https://github.com/takahirox/three-gltf-extensions)\n * - [MSFT_texture_dds](https://github.com/takahirox/three-gltf-extensions)\n * - [KHR_animation_pointer](https://github.com/needle-tools/three-animation-pointer)\n * - [NEEDLE_progressive](https://github.com/needle-tools/gltf-progressive)\n *\n * ```js\n * const loader = new GLTFLoader();\n *\n * // Optional: Provide a DRACOLoader instance to decode compressed mesh data\n * const dracoLoader = new DRACOLoader();\n * dracoLoader.setDecoderPath( '/examples/jsm/libs/draco/' );\n * loader.setDRACOLoader( dracoLoader );\n *\n * const gltf = await loader.loadAsync( 'models/gltf/duck/duck.gltf' );\n * scene.add( gltf.scene );\n * ```\n *\n * @augments Loader\n * @three_import import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js';\n */\nclass GLTFLoader extends Loader {\n\n\t/**\n\t * Constructs a new glTF loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\tthis.dracoLoader = null;\n\t\tthis.ktx2Loader = null;\n\t\tthis.meshoptDecoder = null;\n\n\t\tthis.pluginCallbacks = [];\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsClearcoatExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsDispersionExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFTextureBasisUExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFTextureWebPExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFTextureAVIFExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsSheenExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsTransmissionExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsVolumeExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsIorExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsEmissiveStrengthExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsSpecularExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsIridescenceExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsAnisotropyExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsBumpExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFLightsExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMeshoptCompression( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMeshGpuInstancing( parser );\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and passes the loaded glTF asset\n\t * to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(GLTFLoader~LoadObject)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tlet resourcePath;\n\n\t\tif ( this.resourcePath !== '' ) {\n\n\t\t\tresourcePath = this.resourcePath;\n\n\t\t} else if ( this.path !== '' ) {\n\n\t\t\t// If a base path is set, resources will be relative paths from that plus the relative path of the gltf file\n\t\t\t// Example  path = 'https://my-cnd-server.com/', url = 'assets/models/model.gltf'\n\t\t\t// resourcePath = 'https://my-cnd-server.com/assets/models/'\n\t\t\t// referenced resource 'model.bin' will be loaded from 'https://my-cnd-server.com/assets/models/model.bin'\n\t\t\t// referenced resource '../textures/texture.png' will be loaded from 'https://my-cnd-server.com/assets/textures/texture.png'\n\t\t\tconst relativeUrl = LoaderUtils.extractUrlBase( url );\n\t\t\tresourcePath = LoaderUtils.resolveURL( relativeUrl, this.path );\n\n\t\t} else {\n\n\t\t\tresourcePath = LoaderUtils.extractUrlBase( url );\n\n\t\t}\n\n\t\t// Tells the LoadingManager to track an extra item, which resolves after\n\t\t// the model is fully loaded. This means the count of items loaded will\n\t\t// be incorrect, but ensures manager.onLoad() does not fire early.\n\t\tthis.manager.itemStart( url );\n\n\t\tconst _onError = function ( e ) {\n\n\t\t\tif ( onError ) {\n\n\t\t\t\tonError( e );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( e );\n\n\t\t\t}\n\n\t\t\tscope.manager.itemError( url );\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t};\n\n\t\tconst loader = new FileLoader( this.manager );\n\n\t\tloader.setPath( this.path );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\n\t\tloader.load( url, function ( data ) {\n\n\t\t\ttry {\n\n\t\t\t\tscope.parse( data, resourcePath, function ( gltf ) {\n\n\t\t\t\t\tonLoad( gltf );\n\n\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t}, _onError );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\t_onError( e );\n\n\t\t\t}\n\n\t\t}, onProgress, _onError );\n\n\t}\n\n\t/**\n\t * Sets the given Draco loader to this loader. Required for decoding assets\n\t * compressed with the `KHR_draco_mesh_compression` extension.\n\t *\n\t * @param {DRACOLoader} dracoLoader - The Draco loader to set.\n\t * @return {GLTFLoader} A reference to this loader.\n\t */\n\tsetDRACOLoader( dracoLoader ) {\n\n\t\tthis.dracoLoader = dracoLoader;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given KTX2 loader to this loader. Required for loading KTX2\n\t * compressed textures.\n\t *\n\t * @param {KTX2Loader} ktx2Loader - The KTX2 loader to set.\n\t * @return {GLTFLoader} A reference to this loader.\n\t */\n\tsetKTX2Loader( ktx2Loader ) {\n\n\t\tthis.ktx2Loader = ktx2Loader;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given meshopt decoder. Required for decoding assets\n\t * compressed with the `EXT_meshopt_compression` extension.\n\t *\n\t * @param {Object} meshoptDecoder - The meshopt decoder to set.\n\t * @return {GLTFLoader} A reference to this loader.\n\t */\n\tsetMeshoptDecoder( meshoptDecoder ) {\n\n\t\tthis.meshoptDecoder = meshoptDecoder;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Registers a plugin callback. This API is internally used to implement the various\n\t * glTF extensions but can also used by third-party code to add additional logic\n\t * to the loader.\n\t *\n\t * @param {function(parser:GLTFParser)} callback - The callback function to register.\n\t * @return {GLTFLoader} A reference to this loader.\n\t */\n\tregister( callback ) {\n\n\t\tif ( this.pluginCallbacks.indexOf( callback ) === - 1 ) {\n\n\t\t\tthis.pluginCallbacks.push( callback );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Unregisters a plugin callback.\n\t *\n\t * @param {Function} callback - The callback function to unregister.\n\t * @return {GLTFLoader} A reference to this loader.\n\t */\n\tunregister( callback ) {\n\n\t\tif ( this.pluginCallbacks.indexOf( callback ) !== - 1 ) {\n\n\t\t\tthis.pluginCallbacks.splice( this.pluginCallbacks.indexOf( callback ), 1 );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Parses the given FBX data and returns the resulting group.\n\t *\n\t * @param {string|ArrayBuffer} data - The raw glTF data.\n\t * @param {string} path - The URL base path.\n\t * @param {function(GLTFLoader~LoadObject)} onLoad - Executed when the loading process has been finished.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tparse( data, path, onLoad, onError ) {\n\n\t\tlet json;\n\t\tconst extensions = {};\n\t\tconst plugins = {};\n\t\tconst textDecoder = new TextDecoder();\n\n\t\tif ( typeof data === 'string' ) {\n\n\t\t\tjson = JSON.parse( data );\n\n\t\t} else if ( data instanceof ArrayBuffer ) {\n\n\t\t\tconst magic = textDecoder.decode( new Uint8Array( data, 0, 4 ) );\n\n\t\t\tif ( magic === BINARY_EXTENSION_HEADER_MAGIC ) {\n\n\t\t\t\ttry {\n\n\t\t\t\t\textensions[ EXTENSIONS.KHR_BINARY_GLTF ] = new GLTFBinaryExtension( data );\n\n\t\t\t\t} catch ( error ) {\n\n\t\t\t\t\tif ( onError ) onError( error );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tjson = JSON.parse( extensions[ EXTENSIONS.KHR_BINARY_GLTF ].content );\n\n\t\t\t} else {\n\n\t\t\t\tjson = JSON.parse( textDecoder.decode( data ) );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tjson = data;\n\n\t\t}\n\n\t\tif ( json.asset === undefined || json.asset.version[ 0 ] < 2 ) {\n\n\t\t\tif ( onError ) onError( new Error( 'THREE.GLTFLoader: Unsupported asset. glTF versions >=2.0 are supported.' ) );\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst parser = new GLTFParser( json, {\n\n\t\t\tpath: path || this.resourcePath || '',\n\t\t\tcrossOrigin: this.crossOrigin,\n\t\t\trequestHeader: this.requestHeader,\n\t\t\tmanager: this.manager,\n\t\t\tktx2Loader: this.ktx2Loader,\n\t\t\tmeshoptDecoder: this.meshoptDecoder\n\n\t\t} );\n\n\t\tparser.fileLoader.setRequestHeader( this.requestHeader );\n\n\t\tfor ( let i = 0; i < this.pluginCallbacks.length; i ++ ) {\n\n\t\t\tconst plugin = this.pluginCallbacks[ i ]( parser );\n\n\t\t\tif ( ! plugin.name ) console.error( 'THREE.GLTFLoader: Invalid plugin found: missing name' );\n\n\t\t\tplugins[ plugin.name ] = plugin;\n\n\t\t\t// Workaround to avoid determining as unknown extension\n\t\t\t// in addUnknownExtensionsToUserData().\n\t\t\t// Remove this workaround if we move all the existing\n\t\t\t// extension handlers to plugin system\n\t\t\textensions[ plugin.name ] = true;\n\n\t\t}\n\n\t\tif ( json.extensionsUsed ) {\n\n\t\t\tfor ( let i = 0; i < json.extensionsUsed.length; ++ i ) {\n\n\t\t\t\tconst extensionName = json.extensionsUsed[ i ];\n\t\t\t\tconst extensionsRequired = json.extensionsRequired || [];\n\n\t\t\t\tswitch ( extensionName ) {\n\n\t\t\t\t\tcase EXTENSIONS.KHR_MATERIALS_UNLIT:\n\t\t\t\t\t\textensions[ extensionName ] = new GLTFMaterialsUnlitExtension();\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase EXTENSIONS.KHR_DRACO_MESH_COMPRESSION:\n\t\t\t\t\t\textensions[ extensionName ] = new GLTFDracoMeshCompressionExtension( json, this.dracoLoader );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase EXTENSIONS.KHR_TEXTURE_TRANSFORM:\n\t\t\t\t\t\textensions[ extensionName ] = new GLTFTextureTransformExtension();\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase EXTENSIONS.KHR_MESH_QUANTIZATION:\n\t\t\t\t\t\textensions[ extensionName ] = new GLTFMeshQuantizationExtension();\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tif ( extensionsRequired.indexOf( extensionName ) >= 0 && plugins[ extensionName ] === undefined ) {\n\n\t\t\t\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Unknown extension \"' + extensionName + '\".' );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tparser.setExtensions( extensions );\n\t\tparser.setPlugins( plugins );\n\t\tparser.parse( onLoad, onError );\n\n\t}\n\n\t/**\n\t * Async version of {@link GLTFLoader#parse}.\n\t *\n\t * @async\n\t * @param {string|ArrayBuffer} data - The raw glTF data.\n\t * @param {string} path - The URL base path.\n\t * @return {Promise<GLTFLoader~LoadObject>} A Promise that resolves with the loaded glTF when the parsing has been finished.\n\t */\n\tparseAsync( data, path ) {\n\n\t\tconst scope = this;\n\n\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\tscope.parse( data, path, resolve, reject );\n\n\t\t} );\n\n\t}\n\n}\n\n/* GLTFREGISTRY */\n\nfunction GLTFRegistry() {\n\n\tlet objects = {};\n\n\treturn\t{\n\n\t\tget: function ( key ) {\n\n\t\t\treturn objects[ key ];\n\n\t\t},\n\n\t\tadd: function ( key, object ) {\n\n\t\t\tobjects[ key ] = object;\n\n\t\t},\n\n\t\tremove: function ( key ) {\n\n\t\t\tdelete objects[ key ];\n\n\t\t},\n\n\t\tremoveAll: function () {\n\n\t\t\tobjects = {};\n\n\t\t}\n\n\t};\n\n}\n\n/*********************************/\n/********** EXTENSIONS ***********/\n/*********************************/\n\nconst EXTENSIONS = {\n\tKHR_BINARY_GLTF: 'KHR_binary_glTF',\n\tKHR_DRACO_MESH_COMPRESSION: 'KHR_draco_mesh_compression',\n\tKHR_LIGHTS_PUNCTUAL: 'KHR_lights_punctual',\n\tKHR_MATERIALS_CLEARCOAT: 'KHR_materials_clearcoat',\n\tKHR_MATERIALS_DISPERSION: 'KHR_materials_dispersion',\n\tKHR_MATERIALS_IOR: 'KHR_materials_ior',\n\tKHR_MATERIALS_SHEEN: 'KHR_materials_sheen',\n\tKHR_MATERIALS_SPECULAR: 'KHR_materials_specular',\n\tKHR_MATERIALS_TRANSMISSION: 'KHR_materials_transmission',\n\tKHR_MATERIALS_IRIDESCENCE: 'KHR_materials_iridescence',\n\tKHR_MATERIALS_ANISOTROPY: 'KHR_materials_anisotropy',\n\tKHR_MATERIALS_UNLIT: 'KHR_materials_unlit',\n\tKHR_MATERIALS_VOLUME: 'KHR_materials_volume',\n\tKHR_TEXTURE_BASISU: 'KHR_texture_basisu',\n\tKHR_TEXTURE_TRANSFORM: 'KHR_texture_transform',\n\tKHR_MESH_QUANTIZATION: 'KHR_mesh_quantization',\n\tKHR_MATERIALS_EMISSIVE_STRENGTH: 'KHR_materials_emissive_strength',\n\tEXT_MATERIALS_BUMP: 'EXT_materials_bump',\n\tEXT_TEXTURE_WEBP: 'EXT_texture_webp',\n\tEXT_TEXTURE_AVIF: 'EXT_texture_avif',\n\tEXT_MESHOPT_COMPRESSION: 'EXT_meshopt_compression',\n\tEXT_MESH_GPU_INSTANCING: 'EXT_mesh_gpu_instancing'\n};\n\n/**\n * Punctual Lights Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_lights_punctual\n *\n * @private\n */\nclass GLTFLightsExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_LIGHTS_PUNCTUAL;\n\n\t\t// Object3D instance caches\n\t\tthis.cache = { refs: {}, uses: {} };\n\n\t}\n\n\t_markDefs() {\n\n\t\tconst parser = this.parser;\n\t\tconst nodeDefs = this.parser.json.nodes || [];\n\n\t\tfor ( let nodeIndex = 0, nodeLength = nodeDefs.length; nodeIndex < nodeLength; nodeIndex ++ ) {\n\n\t\t\tconst nodeDef = nodeDefs[ nodeIndex ];\n\n\t\t\tif ( nodeDef.extensions\n\t\t\t\t\t&& nodeDef.extensions[ this.name ]\n\t\t\t\t\t&& nodeDef.extensions[ this.name ].light !== undefined ) {\n\n\t\t\t\tparser._addNodeRef( this.cache, nodeDef.extensions[ this.name ].light );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_loadLight( lightIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst cacheKey = 'light:' + lightIndex;\n\t\tlet dependency = parser.cache.get( cacheKey );\n\n\t\tif ( dependency ) return dependency;\n\n\t\tconst json = parser.json;\n\t\tconst extensions = ( json.extensions && json.extensions[ this.name ] ) || {};\n\t\tconst lightDefs = extensions.lights || [];\n\t\tconst lightDef = lightDefs[ lightIndex ];\n\t\tlet lightNode;\n\n\t\tconst color = new Color( 0xffffff );\n\n\t\tif ( lightDef.color !== undefined ) color.setRGB( lightDef.color[ 0 ], lightDef.color[ 1 ], lightDef.color[ 2 ], LinearSRGBColorSpace );\n\n\t\tconst range = lightDef.range !== undefined ? lightDef.range : 0;\n\n\t\tswitch ( lightDef.type ) {\n\n\t\t\tcase 'directional':\n\t\t\t\tlightNode = new DirectionalLight( color );\n\t\t\t\tlightNode.target.position.set( 0, 0, - 1 );\n\t\t\t\tlightNode.add( lightNode.target );\n\t\t\t\tbreak;\n\n\t\t\tcase 'point':\n\t\t\t\tlightNode = new PointLight( color );\n\t\t\t\tlightNode.distance = range;\n\t\t\t\tbreak;\n\n\t\t\tcase 'spot':\n\t\t\t\tlightNode = new SpotLight( color );\n\t\t\t\tlightNode.distance = range;\n\t\t\t\t// Handle spotlight properties.\n\t\t\t\tlightDef.spot = lightDef.spot || {};\n\t\t\t\tlightDef.spot.innerConeAngle = lightDef.spot.innerConeAngle !== undefined ? lightDef.spot.innerConeAngle : 0;\n\t\t\t\tlightDef.spot.outerConeAngle = lightDef.spot.outerConeAngle !== undefined ? lightDef.spot.outerConeAngle : Math.PI / 4.0;\n\t\t\t\tlightNode.angle = lightDef.spot.outerConeAngle;\n\t\t\t\tlightNode.penumbra = 1.0 - lightDef.spot.innerConeAngle / lightDef.spot.outerConeAngle;\n\t\t\t\tlightNode.target.position.set( 0, 0, - 1 );\n\t\t\t\tlightNode.add( lightNode.target );\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tthrow new Error( 'THREE.GLTFLoader: Unexpected light type: ' + lightDef.type );\n\n\t\t}\n\n\t\t// Some lights (e.g. spot) default to a position other than the origin. Reset the position\n\t\t// here, because node-level parsing will only override position if explicitly specified.\n\t\tlightNode.position.set( 0, 0, 0 );\n\n\t\tassignExtrasToUserData( lightNode, lightDef );\n\n\t\tif ( lightDef.intensity !== undefined ) lightNode.intensity = lightDef.intensity;\n\n\t\tlightNode.name = parser.createUniqueName( lightDef.name || ( 'light_' + lightIndex ) );\n\n\t\tdependency = Promise.resolve( lightNode );\n\n\t\tparser.cache.add( cacheKey, dependency );\n\n\t\treturn dependency;\n\n\t}\n\n\tgetDependency( type, index ) {\n\n\t\tif ( type !== 'light' ) return;\n\n\t\treturn this._loadLight( index );\n\n\t}\n\n\tcreateNodeAttachment( nodeIndex ) {\n\n\t\tconst self = this;\n\t\tconst parser = this.parser;\n\t\tconst json = parser.json;\n\t\tconst nodeDef = json.nodes[ nodeIndex ];\n\t\tconst lightDef = ( nodeDef.extensions && nodeDef.extensions[ this.name ] ) || {};\n\t\tconst lightIndex = lightDef.light;\n\n\t\tif ( lightIndex === undefined ) return null;\n\n\t\treturn this._loadLight( lightIndex ).then( function ( light ) {\n\n\t\t\treturn parser._getNodeRef( self.cache, lightIndex, light );\n\n\t\t} );\n\n\t}\n\n}\n\n/**\n * Unlit Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_unlit\n *\n * @private\n */\nclass GLTFMaterialsUnlitExtension {\n\n\tconstructor() {\n\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_UNLIT;\n\n\t}\n\n\tgetMaterialType() {\n\n\t\treturn MeshBasicMaterial;\n\n\t}\n\n\textendParams( materialParams, materialDef, parser ) {\n\n\t\tconst pending = [];\n\n\t\tmaterialParams.color = new Color( 1.0, 1.0, 1.0 );\n\t\tmaterialParams.opacity = 1.0;\n\n\t\tconst metallicRoughness = materialDef.pbrMetallicRoughness;\n\n\t\tif ( metallicRoughness ) {\n\n\t\t\tif ( Array.isArray( metallicRoughness.baseColorFactor ) ) {\n\n\t\t\t\tconst array = metallicRoughness.baseColorFactor;\n\n\t\t\t\tmaterialParams.color.setRGB( array[ 0 ], array[ 1 ], array[ 2 ], LinearSRGBColorSpace );\n\t\t\t\tmaterialParams.opacity = array[ 3 ];\n\n\t\t\t}\n\n\t\t\tif ( metallicRoughness.baseColorTexture !== undefined ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'map', metallicRoughness.baseColorTexture, SRGBColorSpace ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Materials Emissive Strength Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/blob/5768b3ce0ef32bc39cdf1bef10b948586635ead3/extensions/2.0/Khronos/KHR_materials_emissive_strength/README.md\n *\n * @private\n */\nclass GLTFMaterialsEmissiveStrengthExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_EMISSIVE_STRENGTH;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst emissiveStrength = materialDef.extensions[ this.name ].emissiveStrength;\n\n\t\tif ( emissiveStrength !== undefined ) {\n\n\t\t\tmaterialParams.emissiveIntensity = emissiveStrength;\n\n\t\t}\n\n\t\treturn Promise.resolve();\n\n\t}\n\n}\n\n/**\n * Clearcoat Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_clearcoat\n *\n * @private\n */\nclass GLTFMaterialsClearcoatExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_CLEARCOAT;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tif ( extension.clearcoatFactor !== undefined ) {\n\n\t\t\tmaterialParams.clearcoat = extension.clearcoatFactor;\n\n\t\t}\n\n\t\tif ( extension.clearcoatTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'clearcoatMap', extension.clearcoatTexture ) );\n\n\t\t}\n\n\t\tif ( extension.clearcoatRoughnessFactor !== undefined ) {\n\n\t\t\tmaterialParams.clearcoatRoughness = extension.clearcoatRoughnessFactor;\n\n\t\t}\n\n\t\tif ( extension.clearcoatRoughnessTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'clearcoatRoughnessMap', extension.clearcoatRoughnessTexture ) );\n\n\t\t}\n\n\t\tif ( extension.clearcoatNormalTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'clearcoatNormalMap', extension.clearcoatNormalTexture ) );\n\n\t\t\tif ( extension.clearcoatNormalTexture.scale !== undefined ) {\n\n\t\t\t\tconst scale = extension.clearcoatNormalTexture.scale;\n\n\t\t\t\tmaterialParams.clearcoatNormalScale = new Vector2( scale, scale );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Materials dispersion Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_dispersion\n *\n * @private\n */\nclass GLTFMaterialsDispersionExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_DISPERSION;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tmaterialParams.dispersion = extension.dispersion !== undefined ? extension.dispersion : 0;\n\n\t\treturn Promise.resolve();\n\n\t}\n\n}\n\n/**\n * Iridescence Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_iridescence\n *\n * @private\n */\nclass GLTFMaterialsIridescenceExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_IRIDESCENCE;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tif ( extension.iridescenceFactor !== undefined ) {\n\n\t\t\tmaterialParams.iridescence = extension.iridescenceFactor;\n\n\t\t}\n\n\t\tif ( extension.iridescenceTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'iridescenceMap', extension.iridescenceTexture ) );\n\n\t\t}\n\n\t\tif ( extension.iridescenceIor !== undefined ) {\n\n\t\t\tmaterialParams.iridescenceIOR = extension.iridescenceIor;\n\n\t\t}\n\n\t\tif ( materialParams.iridescenceThicknessRange === undefined ) {\n\n\t\t\tmaterialParams.iridescenceThicknessRange = [ 100, 400 ];\n\n\t\t}\n\n\t\tif ( extension.iridescenceThicknessMinimum !== undefined ) {\n\n\t\t\tmaterialParams.iridescenceThicknessRange[ 0 ] = extension.iridescenceThicknessMinimum;\n\n\t\t}\n\n\t\tif ( extension.iridescenceThicknessMaximum !== undefined ) {\n\n\t\t\tmaterialParams.iridescenceThicknessRange[ 1 ] = extension.iridescenceThicknessMaximum;\n\n\t\t}\n\n\t\tif ( extension.iridescenceThicknessTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'iridescenceThicknessMap', extension.iridescenceThicknessTexture ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Sheen Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_sheen\n *\n * @private\n */\nclass GLTFMaterialsSheenExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_SHEEN;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tmaterialParams.sheenColor = new Color( 0, 0, 0 );\n\t\tmaterialParams.sheenRoughness = 0;\n\t\tmaterialParams.sheen = 1;\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tif ( extension.sheenColorFactor !== undefined ) {\n\n\t\t\tconst colorFactor = extension.sheenColorFactor;\n\t\t\tmaterialParams.sheenColor.setRGB( colorFactor[ 0 ], colorFactor[ 1 ], colorFactor[ 2 ], LinearSRGBColorSpace );\n\n\t\t}\n\n\t\tif ( extension.sheenRoughnessFactor !== undefined ) {\n\n\t\t\tmaterialParams.sheenRoughness = extension.sheenRoughnessFactor;\n\n\t\t}\n\n\t\tif ( extension.sheenColorTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'sheenColorMap', extension.sheenColorTexture, SRGBColorSpace ) );\n\n\t\t}\n\n\t\tif ( extension.sheenRoughnessTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'sheenRoughnessMap', extension.sheenRoughnessTexture ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Transmission Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_transmission\n * Draft: https://github.com/KhronosGroup/glTF/pull/1698\n *\n * @private\n */\nclass GLTFMaterialsTransmissionExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_TRANSMISSION;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tif ( extension.transmissionFactor !== undefined ) {\n\n\t\t\tmaterialParams.transmission = extension.transmissionFactor;\n\n\t\t}\n\n\t\tif ( extension.transmissionTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'transmissionMap', extension.transmissionTexture ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Materials Volume Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_volume\n *\n * @private\n */\nclass GLTFMaterialsVolumeExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_VOLUME;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tmaterialParams.thickness = extension.thicknessFactor !== undefined ? extension.thicknessFactor : 0;\n\n\t\tif ( extension.thicknessTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'thicknessMap', extension.thicknessTexture ) );\n\n\t\t}\n\n\t\tmaterialParams.attenuationDistance = extension.attenuationDistance || Infinity;\n\n\t\tconst colorArray = extension.attenuationColor || [ 1, 1, 1 ];\n\t\tmaterialParams.attenuationColor = new Color().setRGB( colorArray[ 0 ], colorArray[ 1 ], colorArray[ 2 ], LinearSRGBColorSpace );\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Materials ior Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_ior\n *\n * @private\n */\nclass GLTFMaterialsIorExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_IOR;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tmaterialParams.ior = extension.ior !== undefined ? extension.ior : 1.5;\n\n\t\treturn Promise.resolve();\n\n\t}\n\n}\n\n/**\n * Materials specular Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_specular\n *\n * @private\n */\nclass GLTFMaterialsSpecularExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_SPECULAR;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tmaterialParams.specularIntensity = extension.specularFactor !== undefined ? extension.specularFactor : 1.0;\n\n\t\tif ( extension.specularTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'specularIntensityMap', extension.specularTexture ) );\n\n\t\t}\n\n\t\tconst colorArray = extension.specularColorFactor || [ 1, 1, 1 ];\n\t\tmaterialParams.specularColor = new Color().setRGB( colorArray[ 0 ], colorArray[ 1 ], colorArray[ 2 ], LinearSRGBColorSpace );\n\n\t\tif ( extension.specularColorTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'specularColorMap', extension.specularColorTexture, SRGBColorSpace ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n\n/**\n * Materials bump Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/EXT_materials_bump\n *\n * @private\n */\nclass GLTFMaterialsBumpExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.EXT_MATERIALS_BUMP;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tmaterialParams.bumpScale = extension.bumpFactor !== undefined ? extension.bumpFactor : 1.0;\n\n\t\tif ( extension.bumpTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'bumpMap', extension.bumpTexture ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Materials anisotropy Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_anisotropy\n *\n * @private\n */\nclass GLTFMaterialsAnisotropyExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_ANISOTROPY;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tif ( extension.anisotropyStrength !== undefined ) {\n\n\t\t\tmaterialParams.anisotropy = extension.anisotropyStrength;\n\n\t\t}\n\n\t\tif ( extension.anisotropyRotation !== undefined ) {\n\n\t\t\tmaterialParams.anisotropyRotation = extension.anisotropyRotation;\n\n\t\t}\n\n\t\tif ( extension.anisotropyTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'anisotropyMap', extension.anisotropyTexture ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * BasisU Texture Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_texture_basisu\n *\n * @private\n */\nclass GLTFTextureBasisUExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_TEXTURE_BASISU;\n\n\t}\n\n\tloadTexture( textureIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst json = parser.json;\n\n\t\tconst textureDef = json.textures[ textureIndex ];\n\n\t\tif ( ! textureDef.extensions || ! textureDef.extensions[ this.name ] ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst extension = textureDef.extensions[ this.name ];\n\t\tconst loader = parser.options.ktx2Loader;\n\n\t\tif ( ! loader ) {\n\n\t\t\tif ( json.extensionsRequired && json.extensionsRequired.indexOf( this.name ) >= 0 ) {\n\n\t\t\t\tthrow new Error( 'THREE.GLTFLoader: setKTX2Loader must be called before loading KTX2 textures' );\n\n\t\t\t} else {\n\n\t\t\t\t// Assumes that the extension is optional and that a fallback texture is present\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn parser.loadTextureImage( textureIndex, extension.source, loader );\n\n\t}\n\n}\n\n/**\n * WebP Texture Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_texture_webp\n *\n * @private\n */\nclass GLTFTextureWebPExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.EXT_TEXTURE_WEBP;\n\n\t}\n\n\tloadTexture( textureIndex ) {\n\n\t\tconst name = this.name;\n\t\tconst parser = this.parser;\n\t\tconst json = parser.json;\n\n\t\tconst textureDef = json.textures[ textureIndex ];\n\n\t\tif ( ! textureDef.extensions || ! textureDef.extensions[ name ] ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst extension = textureDef.extensions[ name ];\n\t\tconst source = json.images[ extension.source ];\n\n\t\tlet loader = parser.textureLoader;\n\t\tif ( source.uri ) {\n\n\t\t\tconst handler = parser.options.manager.getHandler( source.uri );\n\t\t\tif ( handler !== null ) loader = handler;\n\n\t\t}\n\n\t\treturn parser.loadTextureImage( textureIndex, extension.source, loader );\n\n\t}\n\n}\n\n/**\n * AVIF Texture Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_texture_avif\n *\n * @private\n */\nclass GLTFTextureAVIFExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.EXT_TEXTURE_AVIF;\n\n\t}\n\n\tloadTexture( textureIndex ) {\n\n\t\tconst name = this.name;\n\t\tconst parser = this.parser;\n\t\tconst json = parser.json;\n\n\t\tconst textureDef = json.textures[ textureIndex ];\n\n\t\tif ( ! textureDef.extensions || ! textureDef.extensions[ name ] ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst extension = textureDef.extensions[ name ];\n\t\tconst source = json.images[ extension.source ];\n\n\t\tlet loader = parser.textureLoader;\n\t\tif ( source.uri ) {\n\n\t\t\tconst handler = parser.options.manager.getHandler( source.uri );\n\t\t\tif ( handler !== null ) loader = handler;\n\n\t\t}\n\n\t\treturn parser.loadTextureImage( textureIndex, extension.source, loader );\n\n\t}\n\n}\n\n/**\n * meshopt BufferView Compression Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_meshopt_compression\n *\n * @private\n */\nclass GLTFMeshoptCompression {\n\n\tconstructor( parser ) {\n\n\t\tthis.name = EXTENSIONS.EXT_MESHOPT_COMPRESSION;\n\t\tthis.parser = parser;\n\n\t}\n\n\tloadBufferView( index ) {\n\n\t\tconst json = this.parser.json;\n\t\tconst bufferView = json.bufferViews[ index ];\n\n\t\tif ( bufferView.extensions && bufferView.extensions[ this.name ] ) {\n\n\t\t\tconst extensionDef = bufferView.extensions[ this.name ];\n\n\t\t\tconst buffer = this.parser.getDependency( 'buffer', extensionDef.buffer );\n\t\t\tconst decoder = this.parser.options.meshoptDecoder;\n\n\t\t\tif ( ! decoder || ! decoder.supported ) {\n\n\t\t\t\tif ( json.extensionsRequired && json.extensionsRequired.indexOf( this.name ) >= 0 ) {\n\n\t\t\t\t\tthrow new Error( 'THREE.GLTFLoader: setMeshoptDecoder must be called before loading compressed files' );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Assumes that the extension is optional and that fallback buffer data is present\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn buffer.then( function ( res ) {\n\n\t\t\t\tconst byteOffset = extensionDef.byteOffset || 0;\n\t\t\t\tconst byteLength = extensionDef.byteLength || 0;\n\n\t\t\t\tconst count = extensionDef.count;\n\t\t\t\tconst stride = extensionDef.byteStride;\n\n\t\t\t\tconst source = new Uint8Array( res, byteOffset, byteLength );\n\n\t\t\t\tif ( decoder.decodeGltfBufferAsync ) {\n\n\t\t\t\t\treturn decoder.decodeGltfBufferAsync( count, stride, source, extensionDef.mode, extensionDef.filter ).then( function ( res ) {\n\n\t\t\t\t\t\treturn res.buffer;\n\n\t\t\t\t\t} );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Support for MeshoptDecoder 0.18 or earlier, without decodeGltfBufferAsync\n\t\t\t\t\treturn decoder.ready.then( function () {\n\n\t\t\t\t\t\tconst result = new ArrayBuffer( count * stride );\n\t\t\t\t\t\tdecoder.decodeGltfBuffer( new Uint8Array( result ), count, stride, source, extensionDef.mode, extensionDef.filter );\n\t\t\t\t\t\treturn result;\n\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t} else {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * GPU Instancing Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_mesh_gpu_instancing\n *\n * @private\n */\nclass GLTFMeshGpuInstancing {\n\n\tconstructor( parser ) {\n\n\t\tthis.name = EXTENSIONS.EXT_MESH_GPU_INSTANCING;\n\t\tthis.parser = parser;\n\n\t}\n\n\tcreateNodeMesh( nodeIndex ) {\n\n\t\tconst json = this.parser.json;\n\t\tconst nodeDef = json.nodes[ nodeIndex ];\n\n\t\tif ( ! nodeDef.extensions || ! nodeDef.extensions[ this.name ] ||\n\t\t\tnodeDef.mesh === undefined ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst meshDef = json.meshes[ nodeDef.mesh ];\n\n\t\t// No Points or Lines + Instancing support yet\n\n\t\tfor ( const primitive of meshDef.primitives ) {\n\n\t\t\tif ( primitive.mode !== WEBGL_CONSTANTS.TRIANGLES &&\n\t\t\t\t primitive.mode !== WEBGL_CONSTANTS.TRIANGLE_STRIP &&\n\t\t\t\t primitive.mode !== WEBGL_CONSTANTS.TRIANGLE_FAN &&\n\t\t\t\t primitive.mode !== undefined ) {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst extensionDef = nodeDef.extensions[ this.name ];\n\t\tconst attributesDef = extensionDef.attributes;\n\n\t\t// @TODO: Can we support InstancedMesh + SkinnedMesh?\n\n\t\tconst pending = [];\n\t\tconst attributes = {};\n\n\t\tfor ( const key in attributesDef ) {\n\n\t\t\tpending.push( this.parser.getDependency( 'accessor', attributesDef[ key ] ).then( accessor => {\n\n\t\t\t\tattributes[ key ] = accessor;\n\t\t\t\treturn attributes[ key ];\n\n\t\t\t} ) );\n\n\t\t}\n\n\t\tif ( pending.length < 1 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tpending.push( this.parser.createNodeMesh( nodeIndex ) );\n\n\t\treturn Promise.all( pending ).then( results => {\n\n\t\t\tconst nodeObject = results.pop();\n\t\t\tconst meshes = nodeObject.isGroup ? nodeObject.children : [ nodeObject ];\n\t\t\tconst count = results[ 0 ].count; // All attribute counts should be same\n\t\t\tconst instancedMeshes = [];\n\n\t\t\tfor ( const mesh of meshes ) {\n\n\t\t\t\t// Temporal variables\n\t\t\t\tconst m = new Matrix4();\n\t\t\t\tconst p = new Vector3();\n\t\t\t\tconst q = new Quaternion();\n\t\t\t\tconst s = new Vector3( 1, 1, 1 );\n\n\t\t\t\tconst instancedMesh = new InstancedMesh( mesh.geometry, mesh.material, count );\n\n\t\t\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\t\t\tif ( attributes.TRANSLATION ) {\n\n\t\t\t\t\t\tp.fromBufferAttribute( attributes.TRANSLATION, i );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( attributes.ROTATION ) {\n\n\t\t\t\t\t\tq.fromBufferAttribute( attributes.ROTATION, i );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( attributes.SCALE ) {\n\n\t\t\t\t\t\ts.fromBufferAttribute( attributes.SCALE, i );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tinstancedMesh.setMatrixAt( i, m.compose( p, q, s ) );\n\n\t\t\t\t}\n\n\t\t\t\t// Add instance attributes to the geometry, excluding TRS.\n\t\t\t\tfor ( const attributeName in attributes ) {\n\n\t\t\t\t\tif ( attributeName === '_COLOR_0' ) {\n\n\t\t\t\t\t\tconst attr = attributes[ attributeName ];\n\t\t\t\t\t\tinstancedMesh.instanceColor = new InstancedBufferAttribute( attr.array, attr.itemSize, attr.normalized );\n\n\t\t\t\t\t} else if ( attributeName !== 'TRANSLATION' &&\n\t\t\t\t\t\t attributeName !== 'ROTATION' &&\n\t\t\t\t\t\t attributeName !== 'SCALE' ) {\n\n\t\t\t\t\t\tmesh.geometry.setAttribute( attributeName, attributes[ attributeName ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// Just in case\n\t\t\t\tObject3D.prototype.copy.call( instancedMesh, mesh );\n\n\t\t\t\tthis.parser.assignFinalMaterial( instancedMesh );\n\n\t\t\t\tinstancedMeshes.push( instancedMesh );\n\n\t\t\t}\n\n\t\t\tif ( nodeObject.isGroup ) {\n\n\t\t\t\tnodeObject.clear();\n\n\t\t\t\tnodeObject.add( ... instancedMeshes );\n\n\t\t\t\treturn nodeObject;\n\n\t\t\t}\n\n\t\t\treturn instancedMeshes[ 0 ];\n\n\t\t} );\n\n\t}\n\n}\n\n/* BINARY EXTENSION */\nconst BINARY_EXTENSION_HEADER_MAGIC = 'glTF';\nconst BINARY_EXTENSION_HEADER_LENGTH = 12;\nconst BINARY_EXTENSION_CHUNK_TYPES = { JSON: 0x4E4F534A, BIN: 0x004E4942 };\n\nclass GLTFBinaryExtension {\n\n\tconstructor( data ) {\n\n\t\tthis.name = EXTENSIONS.KHR_BINARY_GLTF;\n\t\tthis.content = null;\n\t\tthis.body = null;\n\n\t\tconst headerView = new DataView( data, 0, BINARY_EXTENSION_HEADER_LENGTH );\n\t\tconst textDecoder = new TextDecoder();\n\n\t\tthis.header = {\n\t\t\tmagic: textDecoder.decode( new Uint8Array( data.slice( 0, 4 ) ) ),\n\t\t\tversion: headerView.getUint32( 4, true ),\n\t\t\tlength: headerView.getUint32( 8, true )\n\t\t};\n\n\t\tif ( this.header.magic !== BINARY_EXTENSION_HEADER_MAGIC ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: Unsupported glTF-Binary header.' );\n\n\t\t} else if ( this.header.version < 2.0 ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: Legacy binary file detected.' );\n\n\t\t}\n\n\t\tconst chunkContentsLength = this.header.length - BINARY_EXTENSION_HEADER_LENGTH;\n\t\tconst chunkView = new DataView( data, BINARY_EXTENSION_HEADER_LENGTH );\n\t\tlet chunkIndex = 0;\n\n\t\twhile ( chunkIndex < chunkContentsLength ) {\n\n\t\t\tconst chunkLength = chunkView.getUint32( chunkIndex, true );\n\t\t\tchunkIndex += 4;\n\n\t\t\tconst chunkType = chunkView.getUint32( chunkIndex, true );\n\t\t\tchunkIndex += 4;\n\n\t\t\tif ( chunkType === BINARY_EXTENSION_CHUNK_TYPES.JSON ) {\n\n\t\t\t\tconst contentArray = new Uint8Array( data, BINARY_EXTENSION_HEADER_LENGTH + chunkIndex, chunkLength );\n\t\t\t\tthis.content = textDecoder.decode( contentArray );\n\n\t\t\t} else if ( chunkType === BINARY_EXTENSION_CHUNK_TYPES.BIN ) {\n\n\t\t\t\tconst byteOffset = BINARY_EXTENSION_HEADER_LENGTH + chunkIndex;\n\t\t\t\tthis.body = data.slice( byteOffset, byteOffset + chunkLength );\n\n\t\t\t}\n\n\t\t\t// Clients must ignore chunks with unknown types.\n\n\t\t\tchunkIndex += chunkLength;\n\n\t\t}\n\n\t\tif ( this.content === null ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: JSON content not found.' );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * DRACO Mesh Compression Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_draco_mesh_compression\n *\n * @private\n */\nclass GLTFDracoMeshCompressionExtension {\n\n\tconstructor( json, dracoLoader ) {\n\n\t\tif ( ! dracoLoader ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: No DRACOLoader instance provided.' );\n\n\t\t}\n\n\t\tthis.name = EXTENSIONS.KHR_DRACO_MESH_COMPRESSION;\n\t\tthis.json = json;\n\t\tthis.dracoLoader = dracoLoader;\n\t\tthis.dracoLoader.preload();\n\n\t}\n\n\tdecodePrimitive( primitive, parser ) {\n\n\t\tconst json = this.json;\n\t\tconst dracoLoader = this.dracoLoader;\n\t\tconst bufferViewIndex = primitive.extensions[ this.name ].bufferView;\n\t\tconst gltfAttributeMap = primitive.extensions[ this.name ].attributes;\n\t\tconst threeAttributeMap = {};\n\t\tconst attributeNormalizedMap = {};\n\t\tconst attributeTypeMap = {};\n\n\t\tfor ( const attributeName in gltfAttributeMap ) {\n\n\t\t\tconst threeAttributeName = ATTRIBUTES[ attributeName ] || attributeName.toLowerCase();\n\n\t\t\tthreeAttributeMap[ threeAttributeName ] = gltfAttributeMap[ attributeName ];\n\n\t\t}\n\n\t\tfor ( const attributeName in primitive.attributes ) {\n\n\t\t\tconst threeAttributeName = ATTRIBUTES[ attributeName ] || attributeName.toLowerCase();\n\n\t\t\tif ( gltfAttributeMap[ attributeName ] !== undefined ) {\n\n\t\t\t\tconst accessorDef = json.accessors[ primitive.attributes[ attributeName ] ];\n\t\t\t\tconst componentType = WEBGL_COMPONENT_TYPES[ accessorDef.componentType ];\n\n\t\t\t\tattributeTypeMap[ threeAttributeName ] = componentType.name;\n\t\t\t\tattributeNormalizedMap[ threeAttributeName ] = accessorDef.normalized === true;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn parser.getDependency( 'bufferView', bufferViewIndex ).then( function ( bufferView ) {\n\n\t\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\t\tdracoLoader.decodeDracoFile( bufferView, function ( geometry ) {\n\n\t\t\t\t\tfor ( const attributeName in geometry.attributes ) {\n\n\t\t\t\t\t\tconst attribute = geometry.attributes[ attributeName ];\n\t\t\t\t\t\tconst normalized = attributeNormalizedMap[ attributeName ];\n\n\t\t\t\t\t\tif ( normalized !== undefined ) attribute.normalized = normalized;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tresolve( geometry );\n\n\t\t\t\t}, threeAttributeMap, attributeTypeMap, LinearSRGBColorSpace, reject );\n\n\t\t\t} );\n\n\t\t} );\n\n\t}\n\n}\n\n/**\n * Texture Transform Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_texture_transform\n *\n * @private\n */\nclass GLTFTextureTransformExtension {\n\n\tconstructor() {\n\n\t\tthis.name = EXTENSIONS.KHR_TEXTURE_TRANSFORM;\n\n\t}\n\n\textendTexture( texture, transform ) {\n\n\t\tif ( ( transform.texCoord === undefined || transform.texCoord === texture.channel )\n\t\t\t&& transform.offset === undefined\n\t\t\t&& transform.rotation === undefined\n\t\t\t&& transform.scale === undefined ) {\n\n\t\t\t// See https://github.com/mrdoob/three.js/issues/21819.\n\t\t\treturn texture;\n\n\t\t}\n\n\t\ttexture = texture.clone();\n\n\t\tif ( transform.texCoord !== undefined ) {\n\n\t\t\ttexture.channel = transform.texCoord;\n\n\t\t}\n\n\t\tif ( transform.offset !== undefined ) {\n\n\t\t\ttexture.offset.fromArray( transform.offset );\n\n\t\t}\n\n\t\tif ( transform.rotation !== undefined ) {\n\n\t\t\ttexture.rotation = transform.rotation;\n\n\t\t}\n\n\t\tif ( transform.scale !== undefined ) {\n\n\t\t\ttexture.repeat.fromArray( transform.scale );\n\n\t\t}\n\n\t\ttexture.needsUpdate = true;\n\n\t\treturn texture;\n\n\t}\n\n}\n\n/**\n * Mesh Quantization Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_mesh_quantization\n *\n * @private\n */\nclass GLTFMeshQuantizationExtension {\n\n\tconstructor() {\n\n\t\tthis.name = EXTENSIONS.KHR_MESH_QUANTIZATION;\n\n\t}\n\n}\n\n/*********************************/\n/********** INTERPOLATION ********/\n/*********************************/\n\n// Spline Interpolation\n// Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#appendix-c-spline-interpolation\nclass GLTFCubicSplineInterpolant extends Interpolant {\n\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tsuper( parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tcopySampleValue_( index ) {\n\n\t\t// Copies a sample value to the result buffer. See description of glTF\n\t\t// CUBICSPLINE values layout in interpolate_() function below.\n\n\t\tconst result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tvalueSize = this.valueSize,\n\t\t\toffset = index * valueSize * 3 + valueSize;\n\n\t\tfor ( let i = 0; i !== valueSize; i ++ ) {\n\n\t\t\tresult[ i ] = values[ offset + i ];\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\tinterpolate_( i1, t0, t, t1 ) {\n\n\t\tconst result = this.resultBuffer;\n\t\tconst values = this.sampleValues;\n\t\tconst stride = this.valueSize;\n\n\t\tconst stride2 = stride * 2;\n\t\tconst stride3 = stride * 3;\n\n\t\tconst td = t1 - t0;\n\n\t\tconst p = ( t - t0 ) / td;\n\t\tconst pp = p * p;\n\t\tconst ppp = pp * p;\n\n\t\tconst offset1 = i1 * stride3;\n\t\tconst offset0 = offset1 - stride3;\n\n\t\tconst s2 = - 2 * ppp + 3 * pp;\n\t\tconst s3 = ppp - pp;\n\t\tconst s0 = 1 - s2;\n\t\tconst s1 = s3 - pp + p;\n\n\t\t// Layout of keyframe output values for CUBICSPLINE animations:\n\t\t//   [ inTangent_1, splineVertex_1, outTangent_1, inTangent_2, splineVertex_2, ... ]\n\t\tfor ( let i = 0; i !== stride; i ++ ) {\n\n\t\t\tconst p0 = values[ offset0 + i + stride ]; // splineVertex_k\n\t\t\tconst m0 = values[ offset0 + i + stride2 ] * td; // outTangent_k * (t_k+1 - t_k)\n\t\t\tconst p1 = values[ offset1 + i + stride ]; // splineVertex_k+1\n\t\t\tconst m1 = values[ offset1 + i ] * td; // inTangent_k+1 * (t_k+1 - t_k)\n\n\t\t\tresult[ i ] = s0 * p0 + s1 * m0 + s2 * p1 + s3 * m1;\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n}\n\nconst _quaternion = new Quaternion();\n\nclass GLTFCubicSplineQuaternionInterpolant extends GLTFCubicSplineInterpolant {\n\n\tinterpolate_( i1, t0, t, t1 ) {\n\n\t\tconst result = super.interpolate_( i1, t0, t, t1 );\n\n\t\t_quaternion.fromArray( result ).normalize().toArray( result );\n\n\t\treturn result;\n\n\t}\n\n}\n\n\n/*********************************/\n/********** INTERNALS ************/\n/*********************************/\n\n/* CONSTANTS */\n\nconst WEBGL_CONSTANTS = {\n\tFLOAT: 5126,\n\t//FLOAT_MAT2: 35674,\n\tFLOAT_MAT3: 35675,\n\tFLOAT_MAT4: 35676,\n\tFLOAT_VEC2: 35664,\n\tFLOAT_VEC3: 35665,\n\tFLOAT_VEC4: 35666,\n\tLINEAR: 9729,\n\tREPEAT: 10497,\n\tSAMPLER_2D: 35678,\n\tPOINTS: 0,\n\tLINES: 1,\n\tLINE_LOOP: 2,\n\tLINE_STRIP: 3,\n\tTRIANGLES: 4,\n\tTRIANGLE_STRIP: 5,\n\tTRIANGLE_FAN: 6,\n\tUNSIGNED_BYTE: 5121,\n\tUNSIGNED_SHORT: 5123\n};\n\nconst WEBGL_COMPONENT_TYPES = {\n\t5120: Int8Array,\n\t5121: Uint8Array,\n\t5122: Int16Array,\n\t5123: Uint16Array,\n\t5125: Uint32Array,\n\t5126: Float32Array\n};\n\nconst WEBGL_FILTERS = {\n\t9728: NearestFilter,\n\t9729: LinearFilter,\n\t9984: NearestMipmapNearestFilter,\n\t9985: LinearMipmapNearestFilter,\n\t9986: NearestMipmapLinearFilter,\n\t9987: LinearMipmapLinearFilter\n};\n\nconst WEBGL_WRAPPINGS = {\n\t33071: ClampToEdgeWrapping,\n\t33648: MirroredRepeatWrapping,\n\t10497: RepeatWrapping\n};\n\nconst WEBGL_TYPE_SIZES = {\n\t'SCALAR': 1,\n\t'VEC2': 2,\n\t'VEC3': 3,\n\t'VEC4': 4,\n\t'MAT2': 4,\n\t'MAT3': 9,\n\t'MAT4': 16\n};\n\nconst ATTRIBUTES = {\n\tPOSITION: 'position',\n\tNORMAL: 'normal',\n\tTANGENT: 'tangent',\n\tTEXCOORD_0: 'uv',\n\tTEXCOORD_1: 'uv1',\n\tTEXCOORD_2: 'uv2',\n\tTEXCOORD_3: 'uv3',\n\tCOLOR_0: 'color',\n\tWEIGHTS_0: 'skinWeight',\n\tJOINTS_0: 'skinIndex',\n};\n\nconst PATH_PROPERTIES = {\n\tscale: 'scale',\n\ttranslation: 'position',\n\trotation: 'quaternion',\n\tweights: 'morphTargetInfluences'\n};\n\nconst INTERPOLATION = {\n\tCUBICSPLINE: undefined, // We use a custom interpolant (GLTFCubicSplineInterpolation) for CUBICSPLINE tracks. Each\n\t\t                        // keyframe track will be initialized with a default interpolation type, then modified.\n\tLINEAR: InterpolateLinear,\n\tSTEP: InterpolateDiscrete\n};\n\nconst ALPHA_MODES = {\n\tOPAQUE: 'OPAQUE',\n\tMASK: 'MASK',\n\tBLEND: 'BLEND'\n};\n\n/**\n * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#default-material\n *\n * @private\n * @param {Object<string, Material>} cache\n * @return {Material}\n */\nfunction createDefaultMaterial( cache ) {\n\n\tif ( cache[ 'DefaultMaterial' ] === undefined ) {\n\n\t\tcache[ 'DefaultMaterial' ] = new MeshStandardMaterial( {\n\t\t\tcolor: 0xFFFFFF,\n\t\t\temissive: 0x000000,\n\t\t\tmetalness: 1,\n\t\t\troughness: 1,\n\t\t\ttransparent: false,\n\t\t\tdepthTest: true,\n\t\t\tside: FrontSide\n\t\t} );\n\n\t}\n\n\treturn cache[ 'DefaultMaterial' ];\n\n}\n\nfunction addUnknownExtensionsToUserData( knownExtensions, object, objectDef ) {\n\n\t// Add unknown glTF extensions to an object's userData.\n\n\tfor ( const name in objectDef.extensions ) {\n\n\t\tif ( knownExtensions[ name ] === undefined ) {\n\n\t\t\tobject.userData.gltfExtensions = object.userData.gltfExtensions || {};\n\t\t\tobject.userData.gltfExtensions[ name ] = objectDef.extensions[ name ];\n\n\t\t}\n\n\t}\n\n}\n\n/**\n *\n * @private\n * @param {Object3D|Material|BufferGeometry|Object|AnimationClip} object\n * @param {GLTF.definition} gltfDef\n */\nfunction assignExtrasToUserData( object, gltfDef ) {\n\n\tif ( gltfDef.extras !== undefined ) {\n\n\t\tif ( typeof gltfDef.extras === 'object' ) {\n\n\t\t\tObject.assign( object.userData, gltfDef.extras );\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.GLTFLoader: Ignoring primitive type .extras, ' + gltfDef.extras );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#morph-targets\n *\n * @private\n * @param {BufferGeometry} geometry\n * @param {Array<GLTF.Target>} targets\n * @param {GLTFParser} parser\n * @return {Promise<BufferGeometry>}\n */\nfunction addMorphTargets( geometry, targets, parser ) {\n\n\tlet hasMorphPosition = false;\n\tlet hasMorphNormal = false;\n\tlet hasMorphColor = false;\n\n\tfor ( let i = 0, il = targets.length; i < il; i ++ ) {\n\n\t\tconst target = targets[ i ];\n\n\t\tif ( target.POSITION !== undefined ) hasMorphPosition = true;\n\t\tif ( target.NORMAL !== undefined ) hasMorphNormal = true;\n\t\tif ( target.COLOR_0 !== undefined ) hasMorphColor = true;\n\n\t\tif ( hasMorphPosition && hasMorphNormal && hasMorphColor ) break;\n\n\t}\n\n\tif ( ! hasMorphPosition && ! hasMorphNormal && ! hasMorphColor ) return Promise.resolve( geometry );\n\n\tconst pendingPositionAccessors = [];\n\tconst pendingNormalAccessors = [];\n\tconst pendingColorAccessors = [];\n\n\tfor ( let i = 0, il = targets.length; i < il; i ++ ) {\n\n\t\tconst target = targets[ i ];\n\n\t\tif ( hasMorphPosition ) {\n\n\t\t\tconst pendingAccessor = target.POSITION !== undefined\n\t\t\t\t? parser.getDependency( 'accessor', target.POSITION )\n\t\t\t\t: geometry.attributes.position;\n\n\t\t\tpendingPositionAccessors.push( pendingAccessor );\n\n\t\t}\n\n\t\tif ( hasMorphNormal ) {\n\n\t\t\tconst pendingAccessor = target.NORMAL !== undefined\n\t\t\t\t? parser.getDependency( 'accessor', target.NORMAL )\n\t\t\t\t: geometry.attributes.normal;\n\n\t\t\tpendingNormalAccessors.push( pendingAccessor );\n\n\t\t}\n\n\t\tif ( hasMorphColor ) {\n\n\t\t\tconst pendingAccessor = target.COLOR_0 !== undefined\n\t\t\t\t? parser.getDependency( 'accessor', target.COLOR_0 )\n\t\t\t\t: geometry.attributes.color;\n\n\t\t\tpendingColorAccessors.push( pendingAccessor );\n\n\t\t}\n\n\t}\n\n\treturn Promise.all( [\n\t\tPromise.all( pendingPositionAccessors ),\n\t\tPromise.all( pendingNormalAccessors ),\n\t\tPromise.all( pendingColorAccessors )\n\t] ).then( function ( accessors ) {\n\n\t\tconst morphPositions = accessors[ 0 ];\n\t\tconst morphNormals = accessors[ 1 ];\n\t\tconst morphColors = accessors[ 2 ];\n\n\t\tif ( hasMorphPosition ) geometry.morphAttributes.position = morphPositions;\n\t\tif ( hasMorphNormal ) geometry.morphAttributes.normal = morphNormals;\n\t\tif ( hasMorphColor ) geometry.morphAttributes.color = morphColors;\n\t\tgeometry.morphTargetsRelative = true;\n\n\t\treturn geometry;\n\n\t} );\n\n}\n\n/**\n *\n * @private\n * @param {Mesh} mesh\n * @param {GLTF.Mesh} meshDef\n */\nfunction updateMorphTargets( mesh, meshDef ) {\n\n\tmesh.updateMorphTargets();\n\n\tif ( meshDef.weights !== undefined ) {\n\n\t\tfor ( let i = 0, il = meshDef.weights.length; i < il; i ++ ) {\n\n\t\t\tmesh.morphTargetInfluences[ i ] = meshDef.weights[ i ];\n\n\t\t}\n\n\t}\n\n\t// .extras has user-defined data, so check that .extras.targetNames is an array.\n\tif ( meshDef.extras && Array.isArray( meshDef.extras.targetNames ) ) {\n\n\t\tconst targetNames = meshDef.extras.targetNames;\n\n\t\tif ( mesh.morphTargetInfluences.length === targetNames.length ) {\n\n\t\t\tmesh.morphTargetDictionary = {};\n\n\t\t\tfor ( let i = 0, il = targetNames.length; i < il; i ++ ) {\n\n\t\t\t\tmesh.morphTargetDictionary[ targetNames[ i ] ] = i;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.GLTFLoader: Invalid extras.targetNames length. Ignoring names.' );\n\n\t\t}\n\n\t}\n\n}\n\nfunction createPrimitiveKey( primitiveDef ) {\n\n\tlet geometryKey;\n\n\tconst dracoExtension = primitiveDef.extensions && primitiveDef.extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ];\n\n\tif ( dracoExtension ) {\n\n\t\tgeometryKey = 'draco:' + dracoExtension.bufferView\n\t\t\t\t+ ':' + dracoExtension.indices\n\t\t\t\t+ ':' + createAttributesKey( dracoExtension.attributes );\n\n\t} else {\n\n\t\tgeometryKey = primitiveDef.indices + ':' + createAttributesKey( primitiveDef.attributes ) + ':' + primitiveDef.mode;\n\n\t}\n\n\tif ( primitiveDef.targets !== undefined ) {\n\n\t\tfor ( let i = 0, il = primitiveDef.targets.length; i < il; i ++ ) {\n\n\t\t\tgeometryKey += ':' + createAttributesKey( primitiveDef.targets[ i ] );\n\n\t\t}\n\n\t}\n\n\treturn geometryKey;\n\n}\n\nfunction createAttributesKey( attributes ) {\n\n\tlet attributesKey = '';\n\n\tconst keys = Object.keys( attributes ).sort();\n\n\tfor ( let i = 0, il = keys.length; i < il; i ++ ) {\n\n\t\tattributesKey += keys[ i ] + ':' + attributes[ keys[ i ] ] + ';';\n\n\t}\n\n\treturn attributesKey;\n\n}\n\nfunction getNormalizedComponentScale( constructor ) {\n\n\t// Reference:\n\t// https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_mesh_quantization#encoding-quantized-data\n\n\tswitch ( constructor ) {\n\n\t\tcase Int8Array:\n\t\t\treturn 1 / 127;\n\n\t\tcase Uint8Array:\n\t\t\treturn 1 / 255;\n\n\t\tcase Int16Array:\n\t\t\treturn 1 / 32767;\n\n\t\tcase Uint16Array:\n\t\t\treturn 1 / 65535;\n\n\t\tdefault:\n\t\t\tthrow new Error( 'THREE.GLTFLoader: Unsupported normalized accessor component type.' );\n\n\t}\n\n}\n\nfunction getImageURIMimeType( uri ) {\n\n\tif ( uri.search( /\\.jpe?g($|\\?)/i ) > 0 || uri.search( /^data\\:image\\/jpeg/ ) === 0 ) return 'image/jpeg';\n\tif ( uri.search( /\\.webp($|\\?)/i ) > 0 || uri.search( /^data\\:image\\/webp/ ) === 0 ) return 'image/webp';\n\tif ( uri.search( /\\.ktx2($|\\?)/i ) > 0 || uri.search( /^data\\:image\\/ktx2/ ) === 0 ) return 'image/ktx2';\n\n\treturn 'image/png';\n\n}\n\nconst _identityMatrix = new Matrix4();\n\n/* GLTF PARSER */\n\nclass GLTFParser {\n\n\tconstructor( json = {}, options = {} ) {\n\n\t\tthis.json = json;\n\t\tthis.extensions = {};\n\t\tthis.plugins = {};\n\t\tthis.options = options;\n\n\t\t// loader object cache\n\t\tthis.cache = new GLTFRegistry();\n\n\t\t// associations between Three.js objects and glTF elements\n\t\tthis.associations = new Map();\n\n\t\t// BufferGeometry caching\n\t\tthis.primitiveCache = {};\n\n\t\t// Node cache\n\t\tthis.nodeCache = {};\n\n\t\t// Object3D instance caches\n\t\tthis.meshCache = { refs: {}, uses: {} };\n\t\tthis.cameraCache = { refs: {}, uses: {} };\n\t\tthis.lightCache = { refs: {}, uses: {} };\n\n\t\tthis.sourceCache = {};\n\t\tthis.textureCache = {};\n\n\t\t// Track node names, to ensure no duplicates\n\t\tthis.nodeNamesUsed = {};\n\n\t\t// Use an ImageBitmapLoader if imageBitmaps are supported. Moves much of the\n\t\t// expensive work of uploading a texture to the GPU off the main thread.\n\n\t\tlet isSafari = false;\n\t\tlet safariVersion = - 1;\n\t\tlet isFirefox = false;\n\t\tlet firefoxVersion = - 1;\n\n\t\tif ( typeof navigator !== 'undefined' ) {\n\n\t\t\tconst userAgent = navigator.userAgent;\n\n\t\t\tisSafari = /^((?!chrome|android).)*safari/i.test( userAgent ) === true;\n\t\t\tconst safariMatch = userAgent.match( /Version\\/(\\d+)/ );\n\t\t\tsafariVersion = isSafari && safariMatch ? parseInt( safariMatch[ 1 ], 10 ) : - 1;\n\n\t\t\tisFirefox = userAgent.indexOf( 'Firefox' ) > - 1;\n\t\t\tfirefoxVersion = isFirefox ? userAgent.match( /Firefox\\/([0-9]+)\\./ )[ 1 ] : - 1;\n\n\t\t}\n\n\t\tif ( typeof createImageBitmap === 'undefined' || ( isSafari && safariVersion < 17 ) || ( isFirefox && firefoxVersion < 98 ) ) {\n\n\t\t\tthis.textureLoader = new TextureLoader( this.options.manager );\n\n\t\t} else {\n\n\t\t\tthis.textureLoader = new ImageBitmapLoader( this.options.manager );\n\n\t\t}\n\n\t\tthis.textureLoader.setCrossOrigin( this.options.crossOrigin );\n\t\tthis.textureLoader.setRequestHeader( this.options.requestHeader );\n\n\t\tthis.fileLoader = new FileLoader( this.options.manager );\n\t\tthis.fileLoader.setResponseType( 'arraybuffer' );\n\n\t\tif ( this.options.crossOrigin === 'use-credentials' ) {\n\n\t\t\tthis.fileLoader.setWithCredentials( true );\n\n\t\t}\n\n\t}\n\n\tsetExtensions( extensions ) {\n\n\t\tthis.extensions = extensions;\n\n\t}\n\n\tsetPlugins( plugins ) {\n\n\t\tthis.plugins = plugins;\n\n\t}\n\n\tparse( onLoad, onError ) {\n\n\t\tconst parser = this;\n\t\tconst json = this.json;\n\t\tconst extensions = this.extensions;\n\n\t\t// Clear the loader cache\n\t\tthis.cache.removeAll();\n\t\tthis.nodeCache = {};\n\n\t\t// Mark the special nodes/meshes in json for efficient parse\n\t\tthis._invokeAll( function ( ext ) {\n\n\t\t\treturn ext._markDefs && ext._markDefs();\n\n\t\t} );\n\n\t\tPromise.all( this._invokeAll( function ( ext ) {\n\n\t\t\treturn ext.beforeRoot && ext.beforeRoot();\n\n\t\t} ) ).then( function () {\n\n\t\t\treturn Promise.all( [\n\n\t\t\t\tparser.getDependencies( 'scene' ),\n\t\t\t\tparser.getDependencies( 'animation' ),\n\t\t\t\tparser.getDependencies( 'camera' ),\n\n\t\t\t] );\n\n\t\t} ).then( function ( dependencies ) {\n\n\t\t\tconst result = {\n\t\t\t\tscene: dependencies[ 0 ][ json.scene || 0 ],\n\t\t\t\tscenes: dependencies[ 0 ],\n\t\t\t\tanimations: dependencies[ 1 ],\n\t\t\t\tcameras: dependencies[ 2 ],\n\t\t\t\tasset: json.asset,\n\t\t\t\tparser: parser,\n\t\t\t\tuserData: {}\n\t\t\t};\n\n\t\t\taddUnknownExtensionsToUserData( extensions, result, json );\n\n\t\t\tassignExtrasToUserData( result, json );\n\n\t\t\treturn Promise.all( parser._invokeAll( function ( ext ) {\n\n\t\t\t\treturn ext.afterRoot && ext.afterRoot( result );\n\n\t\t\t} ) ).then( function () {\n\n\t\t\t\tfor ( const scene of result.scenes ) {\n\n\t\t\t\t\tscene.updateMatrixWorld();\n\n\t\t\t\t}\n\n\t\t\t\tonLoad( result );\n\n\t\t\t} );\n\n\t\t} ).catch( onError );\n\n\t}\n\n\t/**\n\t * Marks the special nodes/meshes in json for efficient parse.\n\t *\n\t * @private\n\t */\n\t_markDefs() {\n\n\t\tconst nodeDefs = this.json.nodes || [];\n\t\tconst skinDefs = this.json.skins || [];\n\t\tconst meshDefs = this.json.meshes || [];\n\n\t\t// Nothing in the node definition indicates whether it is a Bone or an\n\t\t// Object3D. Use the skins' joint references to mark bones.\n\t\tfor ( let skinIndex = 0, skinLength = skinDefs.length; skinIndex < skinLength; skinIndex ++ ) {\n\n\t\t\tconst joints = skinDefs[ skinIndex ].joints;\n\n\t\t\tfor ( let i = 0, il = joints.length; i < il; i ++ ) {\n\n\t\t\t\tnodeDefs[ joints[ i ] ].isBone = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Iterate over all nodes, marking references to shared resources,\n\t\t// as well as skeleton joints.\n\t\tfor ( let nodeIndex = 0, nodeLength = nodeDefs.length; nodeIndex < nodeLength; nodeIndex ++ ) {\n\n\t\t\tconst nodeDef = nodeDefs[ nodeIndex ];\n\n\t\t\tif ( nodeDef.mesh !== undefined ) {\n\n\t\t\t\tthis._addNodeRef( this.meshCache, nodeDef.mesh );\n\n\t\t\t\t// Nothing in the mesh definition indicates whether it is\n\t\t\t\t// a SkinnedMesh or Mesh. Use the node's mesh reference\n\t\t\t\t// to mark SkinnedMesh if node has skin.\n\t\t\t\tif ( nodeDef.skin !== undefined ) {\n\n\t\t\t\t\tmeshDefs[ nodeDef.mesh ].isSkinnedMesh = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( nodeDef.camera !== undefined ) {\n\n\t\t\t\tthis._addNodeRef( this.cameraCache, nodeDef.camera );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Counts references to shared node / Object3D resources. These resources\n\t * can be reused, or \"instantiated\", at multiple nodes in the scene\n\t * hierarchy. Mesh, Camera, and Light instances are instantiated and must\n\t * be marked. Non-scenegraph resources (like Materials, Geometries, and\n\t * Textures) can be reused directly and are not marked here.\n\t *\n\t * Example: CesiumMilkTruck sample model reuses \"Wheel\" meshes.\n\t *\n\t * @private\n\t * @param {Object} cache\n\t * @param {Object3D} index\n\t */\n\t_addNodeRef( cache, index ) {\n\n\t\tif ( index === undefined ) return;\n\n\t\tif ( cache.refs[ index ] === undefined ) {\n\n\t\t\tcache.refs[ index ] = cache.uses[ index ] = 0;\n\n\t\t}\n\n\t\tcache.refs[ index ] ++;\n\n\t}\n\n\t/**\n\t * Returns a reference to a shared resource, cloning it if necessary.\n\t *\n\t * @private\n\t * @param {Object} cache\n\t * @param {number} index\n\t * @param {Object} object\n\t * @return {Object}\n\t */\n\t_getNodeRef( cache, index, object ) {\n\n\t\tif ( cache.refs[ index ] <= 1 ) return object;\n\n\t\tconst ref = object.clone();\n\n\t\t// Propagates mappings to the cloned object, prevents mappings on the\n\t\t// original object from being lost.\n\t\tconst updateMappings = ( original, clone ) => {\n\n\t\t\tconst mappings = this.associations.get( original );\n\t\t\tif ( mappings != null ) {\n\n\t\t\t\tthis.associations.set( clone, mappings );\n\n\t\t\t}\n\n\t\t\tfor ( const [ i, child ] of original.children.entries() ) {\n\n\t\t\t\tupdateMappings( child, clone.children[ i ] );\n\n\t\t\t}\n\n\t\t};\n\n\t\tupdateMappings( object, ref );\n\n\t\tref.name += '_instance_' + ( cache.uses[ index ] ++ );\n\n\t\treturn ref;\n\n\t}\n\n\t_invokeOne( func ) {\n\n\t\tconst extensions = Object.values( this.plugins );\n\t\textensions.push( this );\n\n\t\tfor ( let i = 0; i < extensions.length; i ++ ) {\n\n\t\t\tconst result = func( extensions[ i ] );\n\n\t\t\tif ( result ) return result;\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\t_invokeAll( func ) {\n\n\t\tconst extensions = Object.values( this.plugins );\n\t\textensions.unshift( this );\n\n\t\tconst pending = [];\n\n\t\tfor ( let i = 0; i < extensions.length; i ++ ) {\n\n\t\t\tconst result = func( extensions[ i ] );\n\n\t\t\tif ( result ) pending.push( result );\n\n\t\t}\n\n\t\treturn pending;\n\n\t}\n\n\t/**\n\t * Requests the specified dependency asynchronously, with caching.\n\t *\n\t * @private\n\t * @param {string} type\n\t * @param {number} index\n\t * @return {Promise<Object3D|Material|Texture|AnimationClip|ArrayBuffer|Object>}\n\t */\n\tgetDependency( type, index ) {\n\n\t\tconst cacheKey = type + ':' + index;\n\t\tlet dependency = this.cache.get( cacheKey );\n\n\t\tif ( ! dependency ) {\n\n\t\t\tswitch ( type ) {\n\n\t\t\t\tcase 'scene':\n\t\t\t\t\tdependency = this.loadScene( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'node':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadNode && ext.loadNode( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'mesh':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadMesh && ext.loadMesh( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'accessor':\n\t\t\t\t\tdependency = this.loadAccessor( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'bufferView':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadBufferView && ext.loadBufferView( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'buffer':\n\t\t\t\t\tdependency = this.loadBuffer( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'material':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadMaterial && ext.loadMaterial( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'texture':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadTexture && ext.loadTexture( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'skin':\n\t\t\t\t\tdependency = this.loadSkin( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'animation':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadAnimation && ext.loadAnimation( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'camera':\n\t\t\t\t\tdependency = this.loadCamera( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext != this && ext.getDependency && ext.getDependency( type, index );\n\n\t\t\t\t\t} );\n\n\t\t\t\t\tif ( ! dependency ) {\n\n\t\t\t\t\t\tthrow new Error( 'Unknown type: ' + type );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tthis.cache.add( cacheKey, dependency );\n\n\t\t}\n\n\t\treturn dependency;\n\n\t}\n\n\t/**\n\t * Requests all dependencies of the specified type asynchronously, with caching.\n\t *\n\t * @private\n\t * @param {string} type\n\t * @return {Promise<Array<Object>>}\n\t */\n\tgetDependencies( type ) {\n\n\t\tlet dependencies = this.cache.get( type );\n\n\t\tif ( ! dependencies ) {\n\n\t\t\tconst parser = this;\n\t\t\tconst defs = this.json[ type + ( type === 'mesh' ? 'es' : 's' ) ] || [];\n\n\t\t\tdependencies = Promise.all( defs.map( function ( def, index ) {\n\n\t\t\t\treturn parser.getDependency( type, index );\n\n\t\t\t} ) );\n\n\t\t\tthis.cache.add( type, dependencies );\n\n\t\t}\n\n\t\treturn dependencies;\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#buffers-and-buffer-views\n\t *\n\t * @private\n\t * @param {number} bufferIndex\n\t * @return {Promise<ArrayBuffer>}\n\t */\n\tloadBuffer( bufferIndex ) {\n\n\t\tconst bufferDef = this.json.buffers[ bufferIndex ];\n\t\tconst loader = this.fileLoader;\n\n\t\tif ( bufferDef.type && bufferDef.type !== 'arraybuffer' ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: ' + bufferDef.type + ' buffer type is not supported.' );\n\n\t\t}\n\n\t\t// If present, GLB container is required to be the first buffer.\n\t\tif ( bufferDef.uri === undefined && bufferIndex === 0 ) {\n\n\t\t\treturn Promise.resolve( this.extensions[ EXTENSIONS.KHR_BINARY_GLTF ].body );\n\n\t\t}\n\n\t\tconst options = this.options;\n\n\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\tloader.load( LoaderUtils.resolveURL( bufferDef.uri, options.path ), resolve, undefined, function () {\n\n\t\t\t\treject( new Error( 'THREE.GLTFLoader: Failed to load buffer \"' + bufferDef.uri + '\".' ) );\n\n\t\t\t} );\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#buffers-and-buffer-views\n\t *\n\t * @private\n\t * @param {number} bufferViewIndex\n\t * @return {Promise<ArrayBuffer>}\n\t */\n\tloadBufferView( bufferViewIndex ) {\n\n\t\tconst bufferViewDef = this.json.bufferViews[ bufferViewIndex ];\n\n\t\treturn this.getDependency( 'buffer', bufferViewDef.buffer ).then( function ( buffer ) {\n\n\t\t\tconst byteLength = bufferViewDef.byteLength || 0;\n\t\t\tconst byteOffset = bufferViewDef.byteOffset || 0;\n\t\t\treturn buffer.slice( byteOffset, byteOffset + byteLength );\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#accessors\n\t *\n\t * @private\n\t * @param {number} accessorIndex\n\t * @return {Promise<BufferAttribute|InterleavedBufferAttribute>}\n\t */\n\tloadAccessor( accessorIndex ) {\n\n\t\tconst parser = this;\n\t\tconst json = this.json;\n\n\t\tconst accessorDef = this.json.accessors[ accessorIndex ];\n\n\t\tif ( accessorDef.bufferView === undefined && accessorDef.sparse === undefined ) {\n\n\t\t\tconst itemSize = WEBGL_TYPE_SIZES[ accessorDef.type ];\n\t\t\tconst TypedArray = WEBGL_COMPONENT_TYPES[ accessorDef.componentType ];\n\t\t\tconst normalized = accessorDef.normalized === true;\n\n\t\t\tconst array = new TypedArray( accessorDef.count * itemSize );\n\t\t\treturn Promise.resolve( new BufferAttribute( array, itemSize, normalized ) );\n\n\t\t}\n\n\t\tconst pendingBufferViews = [];\n\n\t\tif ( accessorDef.bufferView !== undefined ) {\n\n\t\t\tpendingBufferViews.push( this.getDependency( 'bufferView', accessorDef.bufferView ) );\n\n\t\t} else {\n\n\t\t\tpendingBufferViews.push( null );\n\n\t\t}\n\n\t\tif ( accessorDef.sparse !== undefined ) {\n\n\t\t\tpendingBufferViews.push( this.getDependency( 'bufferView', accessorDef.sparse.indices.bufferView ) );\n\t\t\tpendingBufferViews.push( this.getDependency( 'bufferView', accessorDef.sparse.values.bufferView ) );\n\n\t\t}\n\n\t\treturn Promise.all( pendingBufferViews ).then( function ( bufferViews ) {\n\n\t\t\tconst bufferView = bufferViews[ 0 ];\n\n\t\t\tconst itemSize = WEBGL_TYPE_SIZES[ accessorDef.type ];\n\t\t\tconst TypedArray = WEBGL_COMPONENT_TYPES[ accessorDef.componentType ];\n\n\t\t\t// For VEC3: itemSize is 3, elementBytes is 4, itemBytes is 12.\n\t\t\tconst elementBytes = TypedArray.BYTES_PER_ELEMENT;\n\t\t\tconst itemBytes = elementBytes * itemSize;\n\t\t\tconst byteOffset = accessorDef.byteOffset || 0;\n\t\t\tconst byteStride = accessorDef.bufferView !== undefined ? json.bufferViews[ accessorDef.bufferView ].byteStride : undefined;\n\t\t\tconst normalized = accessorDef.normalized === true;\n\t\t\tlet array, bufferAttribute;\n\n\t\t\t// The buffer is not interleaved if the stride is the item size in bytes.\n\t\t\tif ( byteStride && byteStride !== itemBytes ) {\n\n\t\t\t\t// Each \"slice\" of the buffer, as defined by 'count' elements of 'byteStride' bytes, gets its own InterleavedBuffer\n\t\t\t\t// This makes sure that IBA.count reflects accessor.count properly\n\t\t\t\tconst ibSlice = Math.floor( byteOffset / byteStride );\n\t\t\t\tconst ibCacheKey = 'InterleavedBuffer:' + accessorDef.bufferView + ':' + accessorDef.componentType + ':' + ibSlice + ':' + accessorDef.count;\n\t\t\t\tlet ib = parser.cache.get( ibCacheKey );\n\n\t\t\t\tif ( ! ib ) {\n\n\t\t\t\t\tarray = new TypedArray( bufferView, ibSlice * byteStride, accessorDef.count * byteStride / elementBytes );\n\n\t\t\t\t\t// Integer parameters to IB/IBA are in array elements, not bytes.\n\t\t\t\t\tib = new InterleavedBuffer( array, byteStride / elementBytes );\n\n\t\t\t\t\tparser.cache.add( ibCacheKey, ib );\n\n\t\t\t\t}\n\n\t\t\t\tbufferAttribute = new InterleavedBufferAttribute( ib, itemSize, ( byteOffset % byteStride ) / elementBytes, normalized );\n\n\t\t\t} else {\n\n\t\t\t\tif ( bufferView === null ) {\n\n\t\t\t\t\tarray = new TypedArray( accessorDef.count * itemSize );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tarray = new TypedArray( bufferView, byteOffset, accessorDef.count * itemSize );\n\n\t\t\t\t}\n\n\t\t\t\tbufferAttribute = new BufferAttribute( array, itemSize, normalized );\n\n\t\t\t}\n\n\t\t\t// https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#sparse-accessors\n\t\t\tif ( accessorDef.sparse !== undefined ) {\n\n\t\t\t\tconst itemSizeIndices = WEBGL_TYPE_SIZES.SCALAR;\n\t\t\t\tconst TypedArrayIndices = WEBGL_COMPONENT_TYPES[ accessorDef.sparse.indices.componentType ];\n\n\t\t\t\tconst byteOffsetIndices = accessorDef.sparse.indices.byteOffset || 0;\n\t\t\t\tconst byteOffsetValues = accessorDef.sparse.values.byteOffset || 0;\n\n\t\t\t\tconst sparseIndices = new TypedArrayIndices( bufferViews[ 1 ], byteOffsetIndices, accessorDef.sparse.count * itemSizeIndices );\n\t\t\t\tconst sparseValues = new TypedArray( bufferViews[ 2 ], byteOffsetValues, accessorDef.sparse.count * itemSize );\n\n\t\t\t\tif ( bufferView !== null ) {\n\n\t\t\t\t\t// Avoid modifying the original ArrayBuffer, if the bufferView wasn't initialized with zeroes.\n\t\t\t\t\tbufferAttribute = new BufferAttribute( bufferAttribute.array.slice(), bufferAttribute.itemSize, bufferAttribute.normalized );\n\n\t\t\t\t}\n\n\t\t\t\t// Ignore normalized since we copy from sparse\n\t\t\t\tbufferAttribute.normalized = false;\n\n\t\t\t\tfor ( let i = 0, il = sparseIndices.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst index = sparseIndices[ i ];\n\n\t\t\t\t\tbufferAttribute.setX( index, sparseValues[ i * itemSize ] );\n\t\t\t\t\tif ( itemSize >= 2 ) bufferAttribute.setY( index, sparseValues[ i * itemSize + 1 ] );\n\t\t\t\t\tif ( itemSize >= 3 ) bufferAttribute.setZ( index, sparseValues[ i * itemSize + 2 ] );\n\t\t\t\t\tif ( itemSize >= 4 ) bufferAttribute.setW( index, sparseValues[ i * itemSize + 3 ] );\n\t\t\t\t\tif ( itemSize >= 5 ) throw new Error( 'THREE.GLTFLoader: Unsupported itemSize in sparse BufferAttribute.' );\n\n\t\t\t\t}\n\n\t\t\t\tbufferAttribute.normalized = normalized;\n\n\t\t\t}\n\n\t\t\treturn bufferAttribute;\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#textures\n\t *\n\t * @private\n\t * @param {number} textureIndex\n\t * @return {Promise<?Texture>}\n\t */\n\tloadTexture( textureIndex ) {\n\n\t\tconst json = this.json;\n\t\tconst options = this.options;\n\t\tconst textureDef = json.textures[ textureIndex ];\n\t\tconst sourceIndex = textureDef.source;\n\t\tconst sourceDef = json.images[ sourceIndex ];\n\n\t\tlet loader = this.textureLoader;\n\n\t\tif ( sourceDef.uri ) {\n\n\t\t\tconst handler = options.manager.getHandler( sourceDef.uri );\n\t\t\tif ( handler !== null ) loader = handler;\n\n\t\t}\n\n\t\treturn this.loadTextureImage( textureIndex, sourceIndex, loader );\n\n\t}\n\n\tloadTextureImage( textureIndex, sourceIndex, loader ) {\n\n\t\tconst parser = this;\n\t\tconst json = this.json;\n\n\t\tconst textureDef = json.textures[ textureIndex ];\n\t\tconst sourceDef = json.images[ sourceIndex ];\n\n\t\tconst cacheKey = ( sourceDef.uri || sourceDef.bufferView ) + ':' + textureDef.sampler;\n\n\t\tif ( this.textureCache[ cacheKey ] ) {\n\n\t\t\t// See https://github.com/mrdoob/three.js/issues/21559.\n\t\t\treturn this.textureCache[ cacheKey ];\n\n\t\t}\n\n\t\tconst promise = this.loadImageSource( sourceIndex, loader ).then( function ( texture ) {\n\n\t\t\ttexture.flipY = false;\n\n\t\t\ttexture.name = textureDef.name || sourceDef.name || '';\n\n\t\t\tif ( texture.name === '' && typeof sourceDef.uri === 'string' && sourceDef.uri.startsWith( 'data:image/' ) === false ) {\n\n\t\t\t\ttexture.name = sourceDef.uri;\n\n\t\t\t}\n\n\t\t\tconst samplers = json.samplers || {};\n\t\t\tconst sampler = samplers[ textureDef.sampler ] || {};\n\n\t\t\ttexture.magFilter = WEBGL_FILTERS[ sampler.magFilter ] || LinearFilter;\n\t\t\ttexture.minFilter = WEBGL_FILTERS[ sampler.minFilter ] || LinearMipmapLinearFilter;\n\t\t\ttexture.wrapS = WEBGL_WRAPPINGS[ sampler.wrapS ] || RepeatWrapping;\n\t\t\ttexture.wrapT = WEBGL_WRAPPINGS[ sampler.wrapT ] || RepeatWrapping;\n\t\t\ttexture.generateMipmaps = ! texture.isCompressedTexture && texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter;\n\n\t\t\tparser.associations.set( texture, { textures: textureIndex } );\n\n\t\t\treturn texture;\n\n\t\t} ).catch( function () {\n\n\t\t\treturn null;\n\n\t\t} );\n\n\t\tthis.textureCache[ cacheKey ] = promise;\n\n\t\treturn promise;\n\n\t}\n\n\tloadImageSource( sourceIndex, loader ) {\n\n\t\tconst parser = this;\n\t\tconst json = this.json;\n\t\tconst options = this.options;\n\n\t\tif ( this.sourceCache[ sourceIndex ] !== undefined ) {\n\n\t\t\treturn this.sourceCache[ sourceIndex ].then( ( texture ) => texture.clone() );\n\n\t\t}\n\n\t\tconst sourceDef = json.images[ sourceIndex ];\n\n\t\tconst URL = self.URL || self.webkitURL;\n\n\t\tlet sourceURI = sourceDef.uri || '';\n\t\tlet isObjectURL = false;\n\n\t\tif ( sourceDef.bufferView !== undefined ) {\n\n\t\t\t// Load binary image data from bufferView, if provided.\n\n\t\t\tsourceURI = parser.getDependency( 'bufferView', sourceDef.bufferView ).then( function ( bufferView ) {\n\n\t\t\t\tisObjectURL = true;\n\t\t\t\tconst blob = new Blob( [ bufferView ], { type: sourceDef.mimeType } );\n\t\t\t\tsourceURI = URL.createObjectURL( blob );\n\t\t\t\treturn sourceURI;\n\n\t\t\t} );\n\n\t\t} else if ( sourceDef.uri === undefined ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: Image ' + sourceIndex + ' is missing URI and bufferView' );\n\n\t\t}\n\n\t\tconst promise = Promise.resolve( sourceURI ).then( function ( sourceURI ) {\n\n\t\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\t\tlet onLoad = resolve;\n\n\t\t\t\tif ( loader.isImageBitmapLoader === true ) {\n\n\t\t\t\t\tonLoad = function ( imageBitmap ) {\n\n\t\t\t\t\t\tconst texture = new Texture( imageBitmap );\n\t\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\t\tresolve( texture );\n\n\t\t\t\t\t};\n\n\t\t\t\t}\n\n\t\t\t\tloader.load( LoaderUtils.resolveURL( sourceURI, options.path ), onLoad, undefined, reject );\n\n\t\t\t} );\n\n\t\t} ).then( function ( texture ) {\n\n\t\t\t// Clean up resources and configure Texture.\n\n\t\t\tif ( isObjectURL === true ) {\n\n\t\t\t\tURL.revokeObjectURL( sourceURI );\n\n\t\t\t}\n\n\t\t\tassignExtrasToUserData( texture, sourceDef );\n\n\t\t\ttexture.userData.mimeType = sourceDef.mimeType || getImageURIMimeType( sourceDef.uri );\n\n\t\t\treturn texture;\n\n\t\t} ).catch( function ( error ) {\n\n\t\t\tconsole.error( 'THREE.GLTFLoader: Couldn\\'t load texture', sourceURI );\n\t\t\tthrow error;\n\n\t\t} );\n\n\t\tthis.sourceCache[ sourceIndex ] = promise;\n\t\treturn promise;\n\n\t}\n\n\t/**\n\t * Asynchronously assigns a texture to the given material parameters.\n\t *\n\t * @private\n\t * @param {Object} materialParams\n\t * @param {string} mapName\n\t * @param {Object} mapDef\n\t * @param {string} [colorSpace]\n\t * @return {Promise<Texture>}\n\t */\n\tassignTexture( materialParams, mapName, mapDef, colorSpace ) {\n\n\t\tconst parser = this;\n\n\t\treturn this.getDependency( 'texture', mapDef.index ).then( function ( texture ) {\n\n\t\t\tif ( ! texture ) return null;\n\n\t\t\tif ( mapDef.texCoord !== undefined && mapDef.texCoord > 0 ) {\n\n\t\t\t\ttexture = texture.clone();\n\t\t\t\ttexture.channel = mapDef.texCoord;\n\n\t\t\t}\n\n\t\t\tif ( parser.extensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ] ) {\n\n\t\t\t\tconst transform = mapDef.extensions !== undefined ? mapDef.extensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ] : undefined;\n\n\t\t\t\tif ( transform ) {\n\n\t\t\t\t\tconst gltfReference = parser.associations.get( texture );\n\t\t\t\t\ttexture = parser.extensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ].extendTexture( texture, transform );\n\t\t\t\t\tparser.associations.set( texture, gltfReference );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( colorSpace !== undefined ) {\n\n\t\t\t\ttexture.colorSpace = colorSpace;\n\n\t\t\t}\n\n\t\t\tmaterialParams[ mapName ] = texture;\n\n\t\t\treturn texture;\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Assigns final material to a Mesh, Line, or Points instance. The instance\n\t * already has a material (generated from the glTF material options alone)\n\t * but reuse of the same glTF material may require multiple threejs materials\n\t * to accommodate different primitive types, defines, etc. New materials will\n\t * be created if necessary, and reused from a cache.\n\t *\n\t * @private\n\t * @param {Object3D} mesh Mesh, Line, or Points instance.\n\t */\n\tassignFinalMaterial( mesh ) {\n\n\t\tconst geometry = mesh.geometry;\n\t\tlet material = mesh.material;\n\n\t\tconst useDerivativeTangents = geometry.attributes.tangent === undefined;\n\t\tconst useVertexColors = geometry.attributes.color !== undefined;\n\t\tconst useFlatShading = geometry.attributes.normal === undefined;\n\n\t\tif ( mesh.isPoints ) {\n\n\t\t\tconst cacheKey = 'PointsMaterial:' + material.uuid;\n\n\t\t\tlet pointsMaterial = this.cache.get( cacheKey );\n\n\t\t\tif ( ! pointsMaterial ) {\n\n\t\t\t\tpointsMaterial = new PointsMaterial();\n\t\t\t\tMaterial.prototype.copy.call( pointsMaterial, material );\n\t\t\t\tpointsMaterial.color.copy( material.color );\n\t\t\t\tpointsMaterial.map = material.map;\n\t\t\t\tpointsMaterial.sizeAttenuation = false; // glTF spec says points should be 1px\n\n\t\t\t\tthis.cache.add( cacheKey, pointsMaterial );\n\n\t\t\t}\n\n\t\t\tmaterial = pointsMaterial;\n\n\t\t} else if ( mesh.isLine ) {\n\n\t\t\tconst cacheKey = 'LineBasicMaterial:' + material.uuid;\n\n\t\t\tlet lineMaterial = this.cache.get( cacheKey );\n\n\t\t\tif ( ! lineMaterial ) {\n\n\t\t\t\tlineMaterial = new LineBasicMaterial();\n\t\t\t\tMaterial.prototype.copy.call( lineMaterial, material );\n\t\t\t\tlineMaterial.color.copy( material.color );\n\t\t\t\tlineMaterial.map = material.map;\n\n\t\t\t\tthis.cache.add( cacheKey, lineMaterial );\n\n\t\t\t}\n\n\t\t\tmaterial = lineMaterial;\n\n\t\t}\n\n\t\t// Clone the material if it will be modified\n\t\tif ( useDerivativeTangents || useVertexColors || useFlatShading ) {\n\n\t\t\tlet cacheKey = 'ClonedMaterial:' + material.uuid + ':';\n\n\t\t\tif ( useDerivativeTangents ) cacheKey += 'derivative-tangents:';\n\t\t\tif ( useVertexColors ) cacheKey += 'vertex-colors:';\n\t\t\tif ( useFlatShading ) cacheKey += 'flat-shading:';\n\n\t\t\tlet cachedMaterial = this.cache.get( cacheKey );\n\n\t\t\tif ( ! cachedMaterial ) {\n\n\t\t\t\tcachedMaterial = material.clone();\n\n\t\t\t\tif ( useVertexColors ) cachedMaterial.vertexColors = true;\n\t\t\t\tif ( useFlatShading ) cachedMaterial.flatShading = true;\n\n\t\t\t\tif ( useDerivativeTangents ) {\n\n\t\t\t\t\t// https://github.com/mrdoob/three.js/issues/11438#issuecomment-507003995\n\t\t\t\t\tif ( cachedMaterial.normalScale ) cachedMaterial.normalScale.y *= - 1;\n\t\t\t\t\tif ( cachedMaterial.clearcoatNormalScale ) cachedMaterial.clearcoatNormalScale.y *= - 1;\n\n\t\t\t\t}\n\n\t\t\t\tthis.cache.add( cacheKey, cachedMaterial );\n\n\t\t\t\tthis.associations.set( cachedMaterial, this.associations.get( material ) );\n\n\t\t\t}\n\n\t\t\tmaterial = cachedMaterial;\n\n\t\t}\n\n\t\tmesh.material = material;\n\n\t}\n\n\tgetMaterialType( /* materialIndex */ ) {\n\n\t\treturn MeshStandardMaterial;\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#materials\n\t *\n\t * @private\n\t * @param {number} materialIndex\n\t * @return {Promise<Material>}\n\t */\n\tloadMaterial( materialIndex ) {\n\n\t\tconst parser = this;\n\t\tconst json = this.json;\n\t\tconst extensions = this.extensions;\n\t\tconst materialDef = json.materials[ materialIndex ];\n\n\t\tlet materialType;\n\t\tconst materialParams = {};\n\t\tconst materialExtensions = materialDef.extensions || {};\n\n\t\tconst pending = [];\n\n\t\tif ( materialExtensions[ EXTENSIONS.KHR_MATERIALS_UNLIT ] ) {\n\n\t\t\tconst kmuExtension = extensions[ EXTENSIONS.KHR_MATERIALS_UNLIT ];\n\t\t\tmaterialType = kmuExtension.getMaterialType();\n\t\t\tpending.push( kmuExtension.extendParams( materialParams, materialDef, parser ) );\n\n\t\t} else {\n\n\t\t\t// Specification:\n\t\t\t// https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#metallic-roughness-material\n\n\t\t\tconst metallicRoughness = materialDef.pbrMetallicRoughness || {};\n\n\t\t\tmaterialParams.color = new Color( 1.0, 1.0, 1.0 );\n\t\t\tmaterialParams.opacity = 1.0;\n\n\t\t\tif ( Array.isArray( metallicRoughness.baseColorFactor ) ) {\n\n\t\t\t\tconst array = metallicRoughness.baseColorFactor;\n\n\t\t\t\tmaterialParams.color.setRGB( array[ 0 ], array[ 1 ], array[ 2 ], LinearSRGBColorSpace );\n\t\t\t\tmaterialParams.opacity = array[ 3 ];\n\n\t\t\t}\n\n\t\t\tif ( metallicRoughness.baseColorTexture !== undefined ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'map', metallicRoughness.baseColorTexture, SRGBColorSpace ) );\n\n\t\t\t}\n\n\t\t\tmaterialParams.metalness = metallicRoughness.metallicFactor !== undefined ? metallicRoughness.metallicFactor : 1.0;\n\t\t\tmaterialParams.roughness = metallicRoughness.roughnessFactor !== undefined ? metallicRoughness.roughnessFactor : 1.0;\n\n\t\t\tif ( metallicRoughness.metallicRoughnessTexture !== undefined ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'metalnessMap', metallicRoughness.metallicRoughnessTexture ) );\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'roughnessMap', metallicRoughness.metallicRoughnessTexture ) );\n\n\t\t\t}\n\n\t\t\tmaterialType = this._invokeOne( function ( ext ) {\n\n\t\t\t\treturn ext.getMaterialType && ext.getMaterialType( materialIndex );\n\n\t\t\t} );\n\n\t\t\tpending.push( Promise.all( this._invokeAll( function ( ext ) {\n\n\t\t\t\treturn ext.extendMaterialParams && ext.extendMaterialParams( materialIndex, materialParams );\n\n\t\t\t} ) ) );\n\n\t\t}\n\n\t\tif ( materialDef.doubleSided === true ) {\n\n\t\t\tmaterialParams.side = DoubleSide;\n\n\t\t}\n\n\t\tconst alphaMode = materialDef.alphaMode || ALPHA_MODES.OPAQUE;\n\n\t\tif ( alphaMode === ALPHA_MODES.BLEND ) {\n\n\t\t\tmaterialParams.transparent = true;\n\n\t\t\t// See: https://github.com/mrdoob/three.js/issues/17706\n\t\t\tmaterialParams.depthWrite = false;\n\n\t\t} else {\n\n\t\t\tmaterialParams.transparent = false;\n\n\t\t\tif ( alphaMode === ALPHA_MODES.MASK ) {\n\n\t\t\t\tmaterialParams.alphaTest = materialDef.alphaCutoff !== undefined ? materialDef.alphaCutoff : 0.5;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( materialDef.normalTexture !== undefined && materialType !== MeshBasicMaterial ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'normalMap', materialDef.normalTexture ) );\n\n\t\t\tmaterialParams.normalScale = new Vector2( 1, 1 );\n\n\t\t\tif ( materialDef.normalTexture.scale !== undefined ) {\n\n\t\t\t\tconst scale = materialDef.normalTexture.scale;\n\n\t\t\t\tmaterialParams.normalScale.set( scale, scale );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( materialDef.occlusionTexture !== undefined && materialType !== MeshBasicMaterial ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'aoMap', materialDef.occlusionTexture ) );\n\n\t\t\tif ( materialDef.occlusionTexture.strength !== undefined ) {\n\n\t\t\t\tmaterialParams.aoMapIntensity = materialDef.occlusionTexture.strength;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( materialDef.emissiveFactor !== undefined && materialType !== MeshBasicMaterial ) {\n\n\t\t\tconst emissiveFactor = materialDef.emissiveFactor;\n\t\t\tmaterialParams.emissive = new Color().setRGB( emissiveFactor[ 0 ], emissiveFactor[ 1 ], emissiveFactor[ 2 ], LinearSRGBColorSpace );\n\n\t\t}\n\n\t\tif ( materialDef.emissiveTexture !== undefined && materialType !== MeshBasicMaterial ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'emissiveMap', materialDef.emissiveTexture, SRGBColorSpace ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending ).then( function () {\n\n\t\t\tconst material = new materialType( materialParams );\n\n\t\t\tif ( materialDef.name ) material.name = materialDef.name;\n\n\t\t\tassignExtrasToUserData( material, materialDef );\n\n\t\t\tparser.associations.set( material, { materials: materialIndex } );\n\n\t\t\tif ( materialDef.extensions ) addUnknownExtensionsToUserData( extensions, material, materialDef );\n\n\t\t\treturn material;\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * When Object3D instances are targeted by animation, they need unique names.\n\t *\n\t * @private\n\t * @param {string} originalName\n\t * @return {string}\n\t */\n\tcreateUniqueName( originalName ) {\n\n\t\tconst sanitizedName = PropertyBinding.sanitizeNodeName( originalName || '' );\n\n\t\tif ( sanitizedName in this.nodeNamesUsed ) {\n\n\t\t\treturn sanitizedName + '_' + ( ++ this.nodeNamesUsed[ sanitizedName ] );\n\n\t\t} else {\n\n\t\t\tthis.nodeNamesUsed[ sanitizedName ] = 0;\n\n\t\t\treturn sanitizedName;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#geometry\n\t *\n\t * Creates BufferGeometries from primitives.\n\t *\n\t * @private\n\t * @param {Array<GLTF.Primitive>} primitives\n\t * @return {Promise<Array<BufferGeometry>>}\n\t */\n\tloadGeometries( primitives ) {\n\n\t\tconst parser = this;\n\t\tconst extensions = this.extensions;\n\t\tconst cache = this.primitiveCache;\n\n\t\tfunction createDracoPrimitive( primitive ) {\n\n\t\t\treturn extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ]\n\t\t\t\t.decodePrimitive( primitive, parser )\n\t\t\t\t.then( function ( geometry ) {\n\n\t\t\t\t\treturn addPrimitiveAttributes( geometry, primitive, parser );\n\n\t\t\t\t} );\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tfor ( let i = 0, il = primitives.length; i < il; i ++ ) {\n\n\t\t\tconst primitive = primitives[ i ];\n\t\t\tconst cacheKey = createPrimitiveKey( primitive );\n\n\t\t\t// See if we've already created this geometry\n\t\t\tconst cached = cache[ cacheKey ];\n\n\t\t\tif ( cached ) {\n\n\t\t\t\t// Use the cached geometry if it exists\n\t\t\t\tpending.push( cached.promise );\n\n\t\t\t} else {\n\n\t\t\t\tlet geometryPromise;\n\n\t\t\t\tif ( primitive.extensions && primitive.extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ] ) {\n\n\t\t\t\t\t// Use DRACO geometry if available\n\t\t\t\t\tgeometryPromise = createDracoPrimitive( primitive );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Otherwise create a new geometry\n\t\t\t\t\tgeometryPromise = addPrimitiveAttributes( new BufferGeometry(), primitive, parser );\n\n\t\t\t\t}\n\n\t\t\t\t// Cache this geometry\n\t\t\t\tcache[ cacheKey ] = { primitive: primitive, promise: geometryPromise };\n\n\t\t\t\tpending.push( geometryPromise );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#meshes\n\t *\n\t * @private\n\t * @param {number} meshIndex\n\t * @return {Promise<Group|Mesh|SkinnedMesh|Line|Points>}\n\t */\n\tloadMesh( meshIndex ) {\n\n\t\tconst parser = this;\n\t\tconst json = this.json;\n\t\tconst extensions = this.extensions;\n\n\t\tconst meshDef = json.meshes[ meshIndex ];\n\t\tconst primitives = meshDef.primitives;\n\n\t\tconst pending = [];\n\n\t\tfor ( let i = 0, il = primitives.length; i < il; i ++ ) {\n\n\t\t\tconst material = primitives[ i ].material === undefined\n\t\t\t\t? createDefaultMaterial( this.cache )\n\t\t\t\t: this.getDependency( 'material', primitives[ i ].material );\n\n\t\t\tpending.push( material );\n\n\t\t}\n\n\t\tpending.push( parser.loadGeometries( primitives ) );\n\n\t\treturn Promise.all( pending ).then( function ( results ) {\n\n\t\t\tconst materials = results.slice( 0, results.length - 1 );\n\t\t\tconst geometries = results[ results.length - 1 ];\n\n\t\t\tconst meshes = [];\n\n\t\t\tfor ( let i = 0, il = geometries.length; i < il; i ++ ) {\n\n\t\t\t\tconst geometry = geometries[ i ];\n\t\t\t\tconst primitive = primitives[ i ];\n\n\t\t\t\t// 1. create Mesh\n\n\t\t\t\tlet mesh;\n\n\t\t\t\tconst material = materials[ i ];\n\n\t\t\t\tif ( primitive.mode === WEBGL_CONSTANTS.TRIANGLES ||\n\t\t\t\t\t\tprimitive.mode === WEBGL_CONSTANTS.TRIANGLE_STRIP ||\n\t\t\t\t\t\tprimitive.mode === WEBGL_CONSTANTS.TRIANGLE_FAN ||\n\t\t\t\t\t\tprimitive.mode === undefined ) {\n\n\t\t\t\t\t// .isSkinnedMesh isn't in glTF spec. See ._markDefs()\n\t\t\t\t\tmesh = meshDef.isSkinnedMesh === true\n\t\t\t\t\t\t? new SkinnedMesh( geometry, material )\n\t\t\t\t\t\t: new Mesh( geometry, material );\n\n\t\t\t\t\tif ( mesh.isSkinnedMesh === true ) {\n\n\t\t\t\t\t\t// normalize skin weights to fix malformed assets (see #15319)\n\t\t\t\t\t\tmesh.normalizeSkinWeights();\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( primitive.mode === WEBGL_CONSTANTS.TRIANGLE_STRIP ) {\n\n\t\t\t\t\t\tmesh.geometry = toTrianglesDrawMode( mesh.geometry, TriangleStripDrawMode );\n\n\t\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.TRIANGLE_FAN ) {\n\n\t\t\t\t\t\tmesh.geometry = toTrianglesDrawMode( mesh.geometry, TriangleFanDrawMode );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.LINES ) {\n\n\t\t\t\t\tmesh = new LineSegments( geometry, material );\n\n\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.LINE_STRIP ) {\n\n\t\t\t\t\tmesh = new Line( geometry, material );\n\n\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.LINE_LOOP ) {\n\n\t\t\t\t\tmesh = new LineLoop( geometry, material );\n\n\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.POINTS ) {\n\n\t\t\t\t\tmesh = new Points( geometry, material );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new Error( 'THREE.GLTFLoader: Primitive mode unsupported: ' + primitive.mode );\n\n\t\t\t\t}\n\n\t\t\t\tif ( Object.keys( mesh.geometry.morphAttributes ).length > 0 ) {\n\n\t\t\t\t\tupdateMorphTargets( mesh, meshDef );\n\n\t\t\t\t}\n\n\t\t\t\tmesh.name = parser.createUniqueName( meshDef.name || ( 'mesh_' + meshIndex ) );\n\n\t\t\t\tassignExtrasToUserData( mesh, meshDef );\n\n\t\t\t\tif ( primitive.extensions ) addUnknownExtensionsToUserData( extensions, mesh, primitive );\n\n\t\t\t\tparser.assignFinalMaterial( mesh );\n\n\t\t\t\tmeshes.push( mesh );\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0, il = meshes.length; i < il; i ++ ) {\n\n\t\t\t\tparser.associations.set( meshes[ i ], {\n\t\t\t\t\tmeshes: meshIndex,\n\t\t\t\t\tprimitives: i\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tif ( meshes.length === 1 ) {\n\n\t\t\t\tif ( meshDef.extensions ) addUnknownExtensionsToUserData( extensions, meshes[ 0 ], meshDef );\n\n\t\t\t\treturn meshes[ 0 ];\n\n\t\t\t}\n\n\t\t\tconst group = new Group();\n\n\t\t\tif ( meshDef.extensions ) addUnknownExtensionsToUserData( extensions, group, meshDef );\n\n\t\t\tparser.associations.set( group, { meshes: meshIndex } );\n\n\t\t\tfor ( let i = 0, il = meshes.length; i < il; i ++ ) {\n\n\t\t\t\tgroup.add( meshes[ i ] );\n\n\t\t\t}\n\n\t\t\treturn group;\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#cameras\n\t *\n\t * @private\n\t * @param {number} cameraIndex\n\t * @return {Promise<Camera>|undefined}\n\t */\n\tloadCamera( cameraIndex ) {\n\n\t\tlet camera;\n\t\tconst cameraDef = this.json.cameras[ cameraIndex ];\n\t\tconst params = cameraDef[ cameraDef.type ];\n\n\t\tif ( ! params ) {\n\n\t\t\tconsole.warn( 'THREE.GLTFLoader: Missing camera parameters.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( cameraDef.type === 'perspective' ) {\n\n\t\t\tcamera = new PerspectiveCamera( MathUtils.radToDeg( params.yfov ), params.aspectRatio || 1, params.znear || 1, params.zfar || 2e6 );\n\n\t\t} else if ( cameraDef.type === 'orthographic' ) {\n\n\t\t\tcamera = new OrthographicCamera( - params.xmag, params.xmag, params.ymag, - params.ymag, params.znear, params.zfar );\n\n\t\t}\n\n\t\tif ( cameraDef.name ) camera.name = this.createUniqueName( cameraDef.name );\n\n\t\tassignExtrasToUserData( camera, cameraDef );\n\n\t\treturn Promise.resolve( camera );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#skins\n\t *\n\t * @private\n\t * @param {number} skinIndex\n\t * @return {Promise<Skeleton>}\n\t */\n\tloadSkin( skinIndex ) {\n\n\t\tconst skinDef = this.json.skins[ skinIndex ];\n\n\t\tconst pending = [];\n\n\t\tfor ( let i = 0, il = skinDef.joints.length; i < il; i ++ ) {\n\n\t\t\tpending.push( this._loadNodeShallow( skinDef.joints[ i ] ) );\n\n\t\t}\n\n\t\tif ( skinDef.inverseBindMatrices !== undefined ) {\n\n\t\t\tpending.push( this.getDependency( 'accessor', skinDef.inverseBindMatrices ) );\n\n\t\t} else {\n\n\t\t\tpending.push( null );\n\n\t\t}\n\n\t\treturn Promise.all( pending ).then( function ( results ) {\n\n\t\t\tconst inverseBindMatrices = results.pop();\n\t\t\tconst jointNodes = results;\n\n\t\t\t// Note that bones (joint nodes) may or may not be in the\n\t\t\t// scene graph at this time.\n\n\t\t\tconst bones = [];\n\t\t\tconst boneInverses = [];\n\n\t\t\tfor ( let i = 0, il = jointNodes.length; i < il; i ++ ) {\n\n\t\t\t\tconst jointNode = jointNodes[ i ];\n\n\t\t\t\tif ( jointNode ) {\n\n\t\t\t\t\tbones.push( jointNode );\n\n\t\t\t\t\tconst mat = new Matrix4();\n\n\t\t\t\t\tif ( inverseBindMatrices !== null ) {\n\n\t\t\t\t\t\tmat.fromArray( inverseBindMatrices.array, i * 16 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tboneInverses.push( mat );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Joint \"%s\" could not be found.', skinDef.joints[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new Skeleton( bones, boneInverses );\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#animations\n\t *\n\t * @private\n\t * @param {number} animationIndex\n\t * @return {Promise<AnimationClip>}\n\t */\n\tloadAnimation( animationIndex ) {\n\n\t\tconst json = this.json;\n\t\tconst parser = this;\n\n\t\tconst animationDef = json.animations[ animationIndex ];\n\t\tconst animationName = animationDef.name ? animationDef.name : 'animation_' + animationIndex;\n\n\t\tconst pendingNodes = [];\n\t\tconst pendingInputAccessors = [];\n\t\tconst pendingOutputAccessors = [];\n\t\tconst pendingSamplers = [];\n\t\tconst pendingTargets = [];\n\n\t\tfor ( let i = 0, il = animationDef.channels.length; i < il; i ++ ) {\n\n\t\t\tconst channel = animationDef.channels[ i ];\n\t\t\tconst sampler = animationDef.samplers[ channel.sampler ];\n\t\t\tconst target = channel.target;\n\t\t\tconst name = target.node;\n\t\t\tconst input = animationDef.parameters !== undefined ? animationDef.parameters[ sampler.input ] : sampler.input;\n\t\t\tconst output = animationDef.parameters !== undefined ? animationDef.parameters[ sampler.output ] : sampler.output;\n\n\t\t\tif ( target.node === undefined ) continue;\n\n\t\t\tpendingNodes.push( this.getDependency( 'node', name ) );\n\t\t\tpendingInputAccessors.push( this.getDependency( 'accessor', input ) );\n\t\t\tpendingOutputAccessors.push( this.getDependency( 'accessor', output ) );\n\t\t\tpendingSamplers.push( sampler );\n\t\t\tpendingTargets.push( target );\n\n\t\t}\n\n\t\treturn Promise.all( [\n\n\t\t\tPromise.all( pendingNodes ),\n\t\t\tPromise.all( pendingInputAccessors ),\n\t\t\tPromise.all( pendingOutputAccessors ),\n\t\t\tPromise.all( pendingSamplers ),\n\t\t\tPromise.all( pendingTargets )\n\n\t\t] ).then( function ( dependencies ) {\n\n\t\t\tconst nodes = dependencies[ 0 ];\n\t\t\tconst inputAccessors = dependencies[ 1 ];\n\t\t\tconst outputAccessors = dependencies[ 2 ];\n\t\t\tconst samplers = dependencies[ 3 ];\n\t\t\tconst targets = dependencies[ 4 ];\n\n\t\t\tconst tracks = [];\n\n\t\t\tfor ( let i = 0, il = nodes.length; i < il; i ++ ) {\n\n\t\t\t\tconst node = nodes[ i ];\n\t\t\t\tconst inputAccessor = inputAccessors[ i ];\n\t\t\t\tconst outputAccessor = outputAccessors[ i ];\n\t\t\t\tconst sampler = samplers[ i ];\n\t\t\t\tconst target = targets[ i ];\n\n\t\t\t\tif ( node === undefined ) continue;\n\n\t\t\t\tif ( node.updateMatrix ) {\n\n\t\t\t\t\tnode.updateMatrix();\n\n\t\t\t\t}\n\n\t\t\t\tconst createdTracks = parser._createAnimationTracks( node, inputAccessor, outputAccessor, sampler, target );\n\n\t\t\t\tif ( createdTracks ) {\n\n\t\t\t\t\tfor ( let k = 0; k < createdTracks.length; k ++ ) {\n\n\t\t\t\t\t\ttracks.push( createdTracks[ k ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst animation = new AnimationClip( animationName, undefined, tracks );\n\n\t\t\tassignExtrasToUserData( animation, animationDef );\n\n\t\t\treturn animation;\n\n\t\t} );\n\n\t}\n\n\tcreateNodeMesh( nodeIndex ) {\n\n\t\tconst json = this.json;\n\t\tconst parser = this;\n\t\tconst nodeDef = json.nodes[ nodeIndex ];\n\n\t\tif ( nodeDef.mesh === undefined ) return null;\n\n\t\treturn parser.getDependency( 'mesh', nodeDef.mesh ).then( function ( mesh ) {\n\n\t\t\tconst node = parser._getNodeRef( parser.meshCache, nodeDef.mesh, mesh );\n\n\t\t\t// if weights are provided on the node, override weights on the mesh.\n\t\t\tif ( nodeDef.weights !== undefined ) {\n\n\t\t\t\tnode.traverse( function ( o ) {\n\n\t\t\t\t\tif ( ! o.isMesh ) return;\n\n\t\t\t\t\tfor ( let i = 0, il = nodeDef.weights.length; i < il; i ++ ) {\n\n\t\t\t\t\t\to.morphTargetInfluences[ i ] = nodeDef.weights[ i ];\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\treturn node;\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#nodes-and-hierarchy\n\t *\n\t * @private\n\t * @param {number} nodeIndex\n\t * @return {Promise<Object3D>}\n\t */\n\tloadNode( nodeIndex ) {\n\n\t\tconst json = this.json;\n\t\tconst parser = this;\n\n\t\tconst nodeDef = json.nodes[ nodeIndex ];\n\n\t\tconst nodePending = parser._loadNodeShallow( nodeIndex );\n\n\t\tconst childPending = [];\n\t\tconst childrenDef = nodeDef.children || [];\n\n\t\tfor ( let i = 0, il = childrenDef.length; i < il; i ++ ) {\n\n\t\t\tchildPending.push( parser.getDependency( 'node', childrenDef[ i ] ) );\n\n\t\t}\n\n\t\tconst skeletonPending = nodeDef.skin === undefined\n\t\t\t? Promise.resolve( null )\n\t\t\t: parser.getDependency( 'skin', nodeDef.skin );\n\n\t\treturn Promise.all( [\n\t\t\tnodePending,\n\t\t\tPromise.all( childPending ),\n\t\t\tskeletonPending\n\t\t] ).then( function ( results ) {\n\n\t\t\tconst node = results[ 0 ];\n\t\t\tconst children = results[ 1 ];\n\t\t\tconst skeleton = results[ 2 ];\n\n\t\t\tif ( skeleton !== null ) {\n\n\t\t\t\t// This full traverse should be fine because\n\t\t\t\t// child glTF nodes have not been added to this node yet.\n\t\t\t\tnode.traverse( function ( mesh ) {\n\n\t\t\t\t\tif ( ! mesh.isSkinnedMesh ) return;\n\n\t\t\t\t\tmesh.bind( skeleton, _identityMatrix );\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0, il = children.length; i < il; i ++ ) {\n\n\t\t\t\tnode.add( children[ i ] );\n\n\t\t\t}\n\n\t\t\treturn node;\n\n\t\t} );\n\n\t}\n\n\t// ._loadNodeShallow() parses a single node.\n\t// skin and child nodes are created and added in .loadNode() (no '_' prefix).\n\t_loadNodeShallow( nodeIndex ) {\n\n\t\tconst json = this.json;\n\t\tconst extensions = this.extensions;\n\t\tconst parser = this;\n\n\t\t// This method is called from .loadNode() and .loadSkin().\n\t\t// Cache a node to avoid duplication.\n\n\t\tif ( this.nodeCache[ nodeIndex ] !== undefined ) {\n\n\t\t\treturn this.nodeCache[ nodeIndex ];\n\n\t\t}\n\n\t\tconst nodeDef = json.nodes[ nodeIndex ];\n\n\t\t// reserve node's name before its dependencies, so the root has the intended name.\n\t\tconst nodeName = nodeDef.name ? parser.createUniqueName( nodeDef.name ) : '';\n\n\t\tconst pending = [];\n\n\t\tconst meshPromise = parser._invokeOne( function ( ext ) {\n\n\t\t\treturn ext.createNodeMesh && ext.createNodeMesh( nodeIndex );\n\n\t\t} );\n\n\t\tif ( meshPromise ) {\n\n\t\t\tpending.push( meshPromise );\n\n\t\t}\n\n\t\tif ( nodeDef.camera !== undefined ) {\n\n\t\t\tpending.push( parser.getDependency( 'camera', nodeDef.camera ).then( function ( camera ) {\n\n\t\t\t\treturn parser._getNodeRef( parser.cameraCache, nodeDef.camera, camera );\n\n\t\t\t} ) );\n\n\t\t}\n\n\t\tparser._invokeAll( function ( ext ) {\n\n\t\t\treturn ext.createNodeAttachment && ext.createNodeAttachment( nodeIndex );\n\n\t\t} ).forEach( function ( promise ) {\n\n\t\t\tpending.push( promise );\n\n\t\t} );\n\n\t\tthis.nodeCache[ nodeIndex ] = Promise.all( pending ).then( function ( objects ) {\n\n\t\t\tlet node;\n\n\t\t\t// .isBone isn't in glTF spec. See ._markDefs\n\t\t\tif ( nodeDef.isBone === true ) {\n\n\t\t\t\tnode = new Bone();\n\n\t\t\t} else if ( objects.length > 1 ) {\n\n\t\t\t\tnode = new Group();\n\n\t\t\t} else if ( objects.length === 1 ) {\n\n\t\t\t\tnode = objects[ 0 ];\n\n\t\t\t} else {\n\n\t\t\t\tnode = new Object3D();\n\n\t\t\t}\n\n\t\t\tif ( node !== objects[ 0 ] ) {\n\n\t\t\t\tfor ( let i = 0, il = objects.length; i < il; i ++ ) {\n\n\t\t\t\t\tnode.add( objects[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( nodeDef.name ) {\n\n\t\t\t\tnode.userData.name = nodeDef.name;\n\t\t\t\tnode.name = nodeName;\n\n\t\t\t}\n\n\t\t\tassignExtrasToUserData( node, nodeDef );\n\n\t\t\tif ( nodeDef.extensions ) addUnknownExtensionsToUserData( extensions, node, nodeDef );\n\n\t\t\tif ( nodeDef.matrix !== undefined ) {\n\n\t\t\t\tconst matrix = new Matrix4();\n\t\t\t\tmatrix.fromArray( nodeDef.matrix );\n\t\t\t\tnode.applyMatrix4( matrix );\n\n\t\t\t} else {\n\n\t\t\t\tif ( nodeDef.translation !== undefined ) {\n\n\t\t\t\t\tnode.position.fromArray( nodeDef.translation );\n\n\t\t\t\t}\n\n\t\t\t\tif ( nodeDef.rotation !== undefined ) {\n\n\t\t\t\t\tnode.quaternion.fromArray( nodeDef.rotation );\n\n\t\t\t\t}\n\n\t\t\t\tif ( nodeDef.scale !== undefined ) {\n\n\t\t\t\t\tnode.scale.fromArray( nodeDef.scale );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( ! parser.associations.has( node ) ) {\n\n\t\t\t\tparser.associations.set( node, {} );\n\n\t\t\t} else if ( nodeDef.mesh !== undefined && parser.meshCache.refs[ nodeDef.mesh ] > 1 ) {\n\n\t\t\t\tconst mapping = parser.associations.get( node );\n\t\t\t\tparser.associations.set( node, { ...mapping } );\n\n\t\t\t}\n\n\t\t\tparser.associations.get( node ).nodes = nodeIndex;\n\n\t\t\treturn node;\n\n\t\t} );\n\n\t\treturn this.nodeCache[ nodeIndex ];\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#scenes\n\t *\n\t * @private\n\t * @param {number} sceneIndex\n\t * @return {Promise<Group>}\n\t */\n\tloadScene( sceneIndex ) {\n\n\t\tconst extensions = this.extensions;\n\t\tconst sceneDef = this.json.scenes[ sceneIndex ];\n\t\tconst parser = this;\n\n\t\t// Loader returns Group, not Scene.\n\t\t// See: https://github.com/mrdoob/three.js/issues/18342#issuecomment-578981172\n\t\tconst scene = new Group();\n\t\tif ( sceneDef.name ) scene.name = parser.createUniqueName( sceneDef.name );\n\n\t\tassignExtrasToUserData( scene, sceneDef );\n\n\t\tif ( sceneDef.extensions ) addUnknownExtensionsToUserData( extensions, scene, sceneDef );\n\n\t\tconst nodeIds = sceneDef.nodes || [];\n\n\t\tconst pending = [];\n\n\t\tfor ( let i = 0, il = nodeIds.length; i < il; i ++ ) {\n\n\t\t\tpending.push( parser.getDependency( 'node', nodeIds[ i ] ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending ).then( function ( nodes ) {\n\n\t\t\tfor ( let i = 0, il = nodes.length; i < il; i ++ ) {\n\n\t\t\t\tscene.add( nodes[ i ] );\n\n\t\t\t}\n\n\t\t\t// Removes dangling associations, associations that reference a node that\n\t\t\t// didn't make it into the scene.\n\t\t\tconst reduceAssociations = ( node ) => {\n\n\t\t\t\tconst reducedAssociations = new Map();\n\n\t\t\t\tfor ( const [ key, value ] of parser.associations ) {\n\n\t\t\t\t\tif ( key instanceof Material || key instanceof Texture ) {\n\n\t\t\t\t\t\treducedAssociations.set( key, value );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tnode.traverse( ( node ) => {\n\n\t\t\t\t\tconst mappings = parser.associations.get( node );\n\n\t\t\t\t\tif ( mappings != null ) {\n\n\t\t\t\t\t\treducedAssociations.set( node, mappings );\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\treturn reducedAssociations;\n\n\t\t\t};\n\n\t\t\tparser.associations = reduceAssociations( scene );\n\n\t\t\treturn scene;\n\n\t\t} );\n\n\t}\n\n\t_createAnimationTracks( node, inputAccessor, outputAccessor, sampler, target ) {\n\n\t\tconst tracks = [];\n\n\t\tconst targetName = node.name ? node.name : node.uuid;\n\t\tconst targetNames = [];\n\n\t\tif ( PATH_PROPERTIES[ target.path ] === PATH_PROPERTIES.weights ) {\n\n\t\t\tnode.traverse( function ( object ) {\n\n\t\t\t\tif ( object.morphTargetInfluences ) {\n\n\t\t\t\t\ttargetNames.push( object.name ? object.name : object.uuid );\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t} else {\n\n\t\t\ttargetNames.push( targetName );\n\n\t\t}\n\n\t\tlet TypedKeyframeTrack;\n\n\t\tswitch ( PATH_PROPERTIES[ target.path ] ) {\n\n\t\t\tcase PATH_PROPERTIES.weights:\n\n\t\t\t\tTypedKeyframeTrack = NumberKeyframeTrack;\n\t\t\t\tbreak;\n\n\t\t\tcase PATH_PROPERTIES.rotation:\n\n\t\t\t\tTypedKeyframeTrack = QuaternionKeyframeTrack;\n\t\t\t\tbreak;\n\n\t\t\tcase PATH_PROPERTIES.translation:\n\t\t\tcase PATH_PROPERTIES.scale:\n\n\t\t\t\tTypedKeyframeTrack = VectorKeyframeTrack;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tswitch ( outputAccessor.itemSize ) {\n\n\t\t\t\t\tcase 1:\n\t\t\t\t\t\tTypedKeyframeTrack = NumberKeyframeTrack;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 2:\n\t\t\t\t\tcase 3:\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tTypedKeyframeTrack = VectorKeyframeTrack;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\tconst interpolation = sampler.interpolation !== undefined ? INTERPOLATION[ sampler.interpolation ] : InterpolateLinear;\n\n\n\t\tconst outputArray = this._getArrayFromAccessor( outputAccessor );\n\n\t\tfor ( let j = 0, jl = targetNames.length; j < jl; j ++ ) {\n\n\t\t\tconst track = new TypedKeyframeTrack(\n\t\t\t\ttargetNames[ j ] + '.' + PATH_PROPERTIES[ target.path ],\n\t\t\t\tinputAccessor.array,\n\t\t\t\toutputArray,\n\t\t\t\tinterpolation\n\t\t\t);\n\n\t\t\t// Override interpolation with custom factory method.\n\t\t\tif ( sampler.interpolation === 'CUBICSPLINE' ) {\n\n\t\t\t\tthis._createCubicSplineTrackInterpolant( track );\n\n\t\t\t}\n\n\t\t\ttracks.push( track );\n\n\t\t}\n\n\t\treturn tracks;\n\n\t}\n\n\t_getArrayFromAccessor( accessor ) {\n\n\t\tlet outputArray = accessor.array;\n\n\t\tif ( accessor.normalized ) {\n\n\t\t\tconst scale = getNormalizedComponentScale( outputArray.constructor );\n\t\t\tconst scaled = new Float32Array( outputArray.length );\n\n\t\t\tfor ( let j = 0, jl = outputArray.length; j < jl; j ++ ) {\n\n\t\t\t\tscaled[ j ] = outputArray[ j ] * scale;\n\n\t\t\t}\n\n\t\t\toutputArray = scaled;\n\n\t\t}\n\n\t\treturn outputArray;\n\n\t}\n\n\t_createCubicSplineTrackInterpolant( track ) {\n\n\t\ttrack.createInterpolant = function InterpolantFactoryMethodGLTFCubicSpline( result ) {\n\n\t\t\t// A CUBICSPLINE keyframe in glTF has three output values for each input value,\n\t\t\t// representing inTangent, splineVertex, and outTangent. As a result, track.getValueSize()\n\t\t\t// must be divided by three to get the interpolant's sampleSize argument.\n\n\t\t\tconst interpolantType = ( this instanceof QuaternionKeyframeTrack ) ? GLTFCubicSplineQuaternionInterpolant : GLTFCubicSplineInterpolant;\n\n\t\t\treturn new interpolantType( this.times, this.values, this.getValueSize() / 3, result );\n\n\t\t};\n\n\t\t// Mark as CUBICSPLINE. `track.getInterpolation()` doesn't support custom interpolants.\n\t\ttrack.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline = true;\n\n\t}\n\n}\n\n/**\n *\n * @private\n * @param {BufferGeometry} geometry\n * @param {GLTF.Primitive} primitiveDef\n * @param {GLTFParser} parser\n */\nfunction computeBounds( geometry, primitiveDef, parser ) {\n\n\tconst attributes = primitiveDef.attributes;\n\n\tconst box = new Box3();\n\n\tif ( attributes.POSITION !== undefined ) {\n\n\t\tconst accessor = parser.json.accessors[ attributes.POSITION ];\n\n\t\tconst min = accessor.min;\n\t\tconst max = accessor.max;\n\n\t\t// glTF requires 'min' and 'max', but VRM (which extends glTF) currently ignores that requirement.\n\n\t\tif ( min !== undefined && max !== undefined ) {\n\n\t\t\tbox.set(\n\t\t\t\tnew Vector3( min[ 0 ], min[ 1 ], min[ 2 ] ),\n\t\t\t\tnew Vector3( max[ 0 ], max[ 1 ], max[ 2 ] )\n\t\t\t);\n\n\t\t\tif ( accessor.normalized ) {\n\n\t\t\t\tconst boxScale = getNormalizedComponentScale( WEBGL_COMPONENT_TYPES[ accessor.componentType ] );\n\t\t\t\tbox.min.multiplyScalar( boxScale );\n\t\t\t\tbox.max.multiplyScalar( boxScale );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.GLTFLoader: Missing min/max properties for accessor POSITION.' );\n\n\t\t\treturn;\n\n\t\t}\n\n\t} else {\n\n\t\treturn;\n\n\t}\n\n\tconst targets = primitiveDef.targets;\n\n\tif ( targets !== undefined ) {\n\n\t\tconst maxDisplacement = new Vector3();\n\t\tconst vector = new Vector3();\n\n\t\tfor ( let i = 0, il = targets.length; i < il; i ++ ) {\n\n\t\t\tconst target = targets[ i ];\n\n\t\t\tif ( target.POSITION !== undefined ) {\n\n\t\t\t\tconst accessor = parser.json.accessors[ target.POSITION ];\n\t\t\t\tconst min = accessor.min;\n\t\t\t\tconst max = accessor.max;\n\n\t\t\t\t// glTF requires 'min' and 'max', but VRM (which extends glTF) currently ignores that requirement.\n\n\t\t\t\tif ( min !== undefined && max !== undefined ) {\n\n\t\t\t\t\t// we need to get max of absolute components because target weight is [-1,1]\n\t\t\t\t\tvector.setX( Math.max( Math.abs( min[ 0 ] ), Math.abs( max[ 0 ] ) ) );\n\t\t\t\t\tvector.setY( Math.max( Math.abs( min[ 1 ] ), Math.abs( max[ 1 ] ) ) );\n\t\t\t\t\tvector.setZ( Math.max( Math.abs( min[ 2 ] ), Math.abs( max[ 2 ] ) ) );\n\n\n\t\t\t\t\tif ( accessor.normalized ) {\n\n\t\t\t\t\t\tconst boxScale = getNormalizedComponentScale( WEBGL_COMPONENT_TYPES[ accessor.componentType ] );\n\t\t\t\t\t\tvector.multiplyScalar( boxScale );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Note: this assumes that the sum of all weights is at most 1. This isn't quite correct - it's more conservative\n\t\t\t\t\t// to assume that each target can have a max weight of 1. However, for some use cases - notably, when morph targets\n\t\t\t\t\t// are used to implement key-frame animations and as such only two are active at a time - this results in very large\n\t\t\t\t\t// boxes. So for now we make a box that's sometimes a touch too small but is hopefully mostly of reasonable size.\n\t\t\t\t\tmaxDisplacement.max( vector );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Missing min/max properties for accessor POSITION.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// As per comment above this box isn't conservative, but has a reasonable size for a very large number of morph targets.\n\t\tbox.expandByVector( maxDisplacement );\n\n\t}\n\n\tgeometry.boundingBox = box;\n\n\tconst sphere = new Sphere();\n\n\tbox.getCenter( sphere.center );\n\tsphere.radius = box.min.distanceTo( box.max ) / 2;\n\n\tgeometry.boundingSphere = sphere;\n\n}\n\n/**\n *\n * @private\n * @param {BufferGeometry} geometry\n * @param {GLTF.Primitive} primitiveDef\n * @param {GLTFParser} parser\n * @return {Promise<BufferGeometry>}\n */\nfunction addPrimitiveAttributes( geometry, primitiveDef, parser ) {\n\n\tconst attributes = primitiveDef.attributes;\n\n\tconst pending = [];\n\n\tfunction assignAttributeAccessor( accessorIndex, attributeName ) {\n\n\t\treturn parser.getDependency( 'accessor', accessorIndex )\n\t\t\t.then( function ( accessor ) {\n\n\t\t\t\tgeometry.setAttribute( attributeName, accessor );\n\n\t\t\t} );\n\n\t}\n\n\tfor ( const gltfAttributeName in attributes ) {\n\n\t\tconst threeAttributeName = ATTRIBUTES[ gltfAttributeName ] || gltfAttributeName.toLowerCase();\n\n\t\t// Skip attributes already provided by e.g. Draco extension.\n\t\tif ( threeAttributeName in geometry.attributes ) continue;\n\n\t\tpending.push( assignAttributeAccessor( attributes[ gltfAttributeName ], threeAttributeName ) );\n\n\t}\n\n\tif ( primitiveDef.indices !== undefined && ! geometry.index ) {\n\n\t\tconst accessor = parser.getDependency( 'accessor', primitiveDef.indices ).then( function ( accessor ) {\n\n\t\t\tgeometry.setIndex( accessor );\n\n\t\t} );\n\n\t\tpending.push( accessor );\n\n\t}\n\n\tif ( ColorManagement.workingColorSpace !== LinearSRGBColorSpace && 'COLOR_0' in attributes ) {\n\n\t\tconsole.warn( `THREE.GLTFLoader: Converting vertex colors from \"srgb-linear\" to \"${ColorManagement.workingColorSpace}\" not supported.` );\n\n\t}\n\n\tassignExtrasToUserData( geometry, primitiveDef );\n\n\tcomputeBounds( geometry, primitiveDef, parser );\n\n\treturn Promise.all( pending ).then( function () {\n\n\t\treturn primitiveDef.targets !== undefined\n\t\t\t? addMorphTargets( geometry, primitiveDef.targets, parser )\n\t\t\t: geometry;\n\n\t} );\n\n}\n\n/**\n * Loader result of `GLTFLoader`.\n *\n * @typedef {Object} GLTFLoader~LoadObject\n * @property {Array<AnimationClip>} animations - An array of animation clips.\n * @property {Object} asset - Meta data about the loaded asset.\n * @property {Array<Camera>} cameras - An array of cameras.\n * @property {GLTFParser} parser - A reference to the internal parser.\n * @property {Group} scene - The default scene.\n * @property {Array<Group>} scenes - glTF assets might define multiple scenes.\n * @property {Object} userData - Additional data.\n **/\n\nexport { GLTFLoader };\n","'use strict';\n// we can't use just `it == null` since of `document.all` special case\n// https://tc39.es/ecma262/#sec-IsHTMLDDA-internal-slot-aec\nmodule.exports = function (it) {\n  return it === null || it === undefined;\n};\n","'use strict';\nvar fails = require('../internals/fails');\nvar isObject = require('../internals/is-object');\nvar classof = require('../internals/classof-raw');\nvar ARRAY_BUFFER_NON_EXTENSIBLE = require('../internals/array-buffer-non-extensible');\n\n// eslint-disable-next-line es/no-object-isextensible -- safe\nvar $isExtensible = Object.isExtensible;\nvar FAILS_ON_PRIMITIVES = fails(function () { $isExtensible(1); });\n\n// `Object.isExtensible` method\n// https://tc39.es/ecma262/#sec-object.isextensible\nmodule.exports = (FAILS_ON_PRIMITIVES || ARRAY_BUFFER_NON_EXTENSIBLE) ? function isExtensible(it) {\n  if (!isObject(it)) return false;\n  if (ARRAY_BUFFER_NON_EXTENSIBLE && classof(it) === 'ArrayBuffer') return false;\n  return $isExtensible ? $isExtensible(it) : true;\n} : $isExtensible;\n","'use strict';\n// TODO: Remove from `core-js@4`\nvar $ = require('../internals/export');\nvar bind = require('../internals/function-bind');\n\n// `Function.prototype.bind` method\n// https://tc39.es/ecma262/#sec-function.prototype.bind\n// eslint-disable-next-line es/no-function-prototype-bind -- detection\n$({ target: 'Function', proto: true, forced: Function.bind !== bind }, {\n  bind: bind\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar defineProperty = require('../internals/object-define-property').f;\n\n// `Object.defineProperty` method\n// https://tc39.es/ecma262/#sec-object.defineproperty\n// eslint-disable-next-line es/no-object-defineproperty -- safe\n$({ target: 'Object', stat: true, forced: Object.defineProperty !== defineProperty, sham: !DESCRIPTORS }, {\n  defineProperty: defineProperty\n});\n","'use strict';\nvar aSet = require('../internals/a-set');\nvar add = require('../internals/set-helpers').add;\nvar clone = require('../internals/set-clone');\nvar getSetRecord = require('../internals/get-set-record');\nvar iterateSimple = require('../internals/iterate-simple');\n\n// `Set.prototype.union` method\n// https://tc39.es/ecma262/#sec-set.prototype.union\nmodule.exports = function union(other) {\n  var O = aSet(this);\n  var keysIter = getSetRecord(other).getIterator();\n  var result = clone(O);\n  iterateSimple(keysIter, function (it) {\n    add(result, it);\n  });\n  return result;\n};\n","'use strict';\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar Iterators = require('../internals/iterators');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar ArrayPrototype = Array.prototype;\n\n// check on default Array iterator\nmodule.exports = function (it) {\n  return it !== undefined && (Iterators.Array === it || ArrayPrototype[ITERATOR] === it);\n};\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar call = require('../internals/function-call');\nvar fails = require('../internals/fails');\nvar objectKeys = require('../internals/object-keys');\nvar getOwnPropertySymbolsModule = require('../internals/object-get-own-property-symbols');\nvar propertyIsEnumerableModule = require('../internals/object-property-is-enumerable');\nvar toObject = require('../internals/to-object');\nvar IndexedObject = require('../internals/indexed-object');\n\n// eslint-disable-next-line es/no-object-assign -- safe\nvar $assign = Object.assign;\n// eslint-disable-next-line es/no-object-defineproperty -- required for testing\nvar defineProperty = Object.defineProperty;\nvar concat = uncurryThis([].concat);\n\n// `Object.assign` method\n// https://tc39.es/ecma262/#sec-object.assign\nmodule.exports = !$assign || fails(function () {\n  // should have correct order of operations (Edge bug)\n  if (DESCRIPTORS && $assign({ b: 1 }, $assign(defineProperty({}, 'a', {\n    enumerable: true,\n    get: function () {\n      defineProperty(this, 'b', {\n        value: 3,\n        enumerable: false\n      });\n    }\n  }), { b: 2 })).b !== 1) return true;\n  // should work with symbols and should have deterministic property order (V8 bug)\n  var A = {};\n  var B = {};\n  // eslint-disable-next-line es/no-symbol -- safe\n  var symbol = Symbol('assign detection');\n  var alphabet = 'abcdefghijklmnopqrst';\n  A[symbol] = 7;\n  // eslint-disable-next-line es/no-array-prototype-foreach -- safe\n  alphabet.split('').forEach(function (chr) { B[chr] = chr; });\n  return $assign({}, A)[symbol] !== 7 || objectKeys($assign({}, B)).join('') !== alphabet;\n}) ? function assign(target, source) { // eslint-disable-line no-unused-vars -- required for `.length`\n  var T = toObject(target);\n  var argumentsLength = arguments.length;\n  var index = 1;\n  var getOwnPropertySymbols = getOwnPropertySymbolsModule.f;\n  var propertyIsEnumerable = propertyIsEnumerableModule.f;\n  while (argumentsLength > index) {\n    var S = IndexedObject(arguments[index++]);\n    var keys = getOwnPropertySymbols ? concat(objectKeys(S), getOwnPropertySymbols(S)) : objectKeys(S);\n    var length = keys.length;\n    var j = 0;\n    var key;\n    while (length > j) {\n      key = keys[j++];\n      if (!DESCRIPTORS || call(propertyIsEnumerable, S, key)) T[key] = S[key];\n    }\n  } return T;\n} : $assign;\n","'use strict';\n/* global Bun, Deno -- detection */\nvar globalThis = require('../internals/global-this');\nvar userAgent = require('../internals/environment-user-agent');\nvar classof = require('../internals/classof-raw');\n\nvar userAgentStartsWith = function (string) {\n  return userAgent.slice(0, string.length) === string;\n};\n\nmodule.exports = (function () {\n  if (userAgentStartsWith('Bun/')) return 'BUN';\n  if (userAgentStartsWith('Cloudflare-Workers')) return 'CLOUDFLARE';\n  if (userAgentStartsWith('Deno/')) return 'DENO';\n  if (userAgentStartsWith('Node.js/')) return 'NODE';\n  if (globalThis.Bun && typeof Bun.version == 'string') return 'BUN';\n  if (globalThis.Deno && typeof Deno.version == 'object') return 'DENO';\n  if (classof(globalThis.process) === 'process') return 'NODE';\n  if (globalThis.window && globalThis.document) return 'BROWSER';\n  return 'REST';\n})();\n","'use strict';\nvar userAgent = require('../internals/environment-user-agent');\n\nmodule.exports = /ipad|iphone|ipod/i.test(userAgent) && typeof Pebble != 'undefined';\n","'use strict';\nvar call = require('../internals/function-call');\nvar isCallable = require('../internals/is-callable');\nvar isObject = require('../internals/is-object');\n\nvar $TypeError = TypeError;\n\n// `OrdinaryToPrimitive` abstract operation\n// https://tc39.es/ecma262/#sec-ordinarytoprimitive\nmodule.exports = function (input, pref) {\n  var fn, val;\n  if (pref === 'string' && isCallable(fn = input.toString) && !isObject(val = call(fn, input))) return val;\n  if (isCallable(fn = input.valueOf) && !isObject(val = call(fn, input))) return val;\n  if (pref !== 'string' && isCallable(fn = input.toString) && !isObject(val = call(fn, input))) return val;\n  throw new $TypeError(\"Can't convert object to primitive value\");\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar isArray = require('../internals/is-array');\n\n// `Array.isArray` method\n// https://tc39.es/ecma262/#sec-array.isarray\n$({ target: 'Array', stat: true }, {\n  isArray: isArray\n});\n","\"use strict\";\n\nexports.__esModule = true;\nexports.stripComments = exports.ensureObject = exports.getProp = exports.unesc = void 0;\n\nvar _unesc = _interopRequireDefault(require(\"./unesc\"));\n\nexports.unesc = _unesc[\"default\"];\n\nvar _getProp = _interopRequireDefault(require(\"./getProp\"));\n\nexports.getProp = _getProp[\"default\"];\n\nvar _ensureObject = _interopRequireDefault(require(\"./ensureObject\"));\n\nexports.ensureObject = _ensureObject[\"default\"];\n\nvar _stripComments = _interopRequireDefault(require(\"./stripComments\"));\n\nexports.stripComments = _stripComments[\"default\"];\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }","'use strict';\nvar classof = require('../internals/classof-raw');\n\n// `IsArray` abstract operation\n// https://tc39.es/ecma262/#sec-isarray\n// eslint-disable-next-line es/no-array-isarray -- safe\nmodule.exports = Array.isArray || function isArray(argument) {\n  return classof(argument) === 'Array';\n};\n","(function(window, factory) {\n\tvar globalInstall = function(){\n\t\tfactory(window.lazySizes);\n\t\twindow.removeEventListener('lazyunveilread', globalInstall, true);\n\t};\n\n\tfactory = factory.bind(null, window, window.document);\n\n\tif(typeof module == 'object' && module.exports){\n\t\tfactory(require('lazysizes'));\n\t} else if (typeof define == 'function' && define.amd) {\n\t\tdefine(['lazysizes'], factory);\n\t} else if(window.lazySizes) {\n\t\tglobalInstall();\n\t} else {\n\t\twindow.addEventListener('lazyunveilread', globalInstall, true);\n\t}\n}(window, function(window, document, lazySizes) {\n\t'use strict';\n\tif(!window.addEventListener){return;}\n\n\tvar lazySizesCfg = lazySizes.cfg;\n\tvar regWhite = /\\s+/g;\n\tvar regSplitSet = /\\s*\\|\\s+|\\s+\\|\\s*/g;\n\tvar regSource = /^(.+?)(?:\\s+\\[\\s*(.+?)\\s*\\])(?:\\s+\\[\\s*(.+?)\\s*\\])?$/;\n\tvar regType = /^\\s*\\(*\\s*type\\s*:\\s*(.+?)\\s*\\)*\\s*$/;\n\tvar regBgUrlEscape = /\\(|\\)|'/;\n\tvar allowedBackgroundSize = {contain: 1, cover: 1};\n\tvar proxyWidth = function(elem){\n\t\tvar width = lazySizes.gW(elem, elem.parentNode);\n\n\t\tif(!elem._lazysizesWidth || width > elem._lazysizesWidth){\n\t\t\telem._lazysizesWidth = width;\n\t\t}\n\t\treturn elem._lazysizesWidth;\n\t};\n\tvar getBgSize = function(elem){\n\t\tvar bgSize;\n\n\t\tbgSize = (getComputedStyle(elem) || {getPropertyValue: function(){}}).getPropertyValue('background-size');\n\n\t\tif(!allowedBackgroundSize[bgSize] && allowedBackgroundSize[elem.style.backgroundSize]){\n\t\t\tbgSize = elem.style.backgroundSize;\n\t\t}\n\n\t\treturn bgSize;\n\t};\n\tvar setTypeOrMedia = function(source, match){\n\t\tif(match){\n\t\t\tvar typeMatch = match.match(regType);\n\t\t\tif(typeMatch && typeMatch[1]){\n\t\t\t\tsource.setAttribute('type', typeMatch[1]);\n\t\t\t} else {\n\t\t\t\tsource.setAttribute('media', lazySizesCfg.customMedia[match] || match);\n\t\t\t}\n\t\t}\n\t};\n\tvar createPicture = function(sets, elem, img){\n\t\tvar picture = document.createElement('picture');\n\t\tvar sizes = elem.getAttribute(lazySizesCfg.sizesAttr);\n\t\tvar ratio = elem.getAttribute('data-ratio');\n\t\tvar optimumx = elem.getAttribute('data-optimumx');\n\n\t\tif(elem._lazybgset && elem._lazybgset.parentNode == elem){\n\t\t\telem.removeChild(elem._lazybgset);\n\t\t}\n\n\t\tObject.defineProperty(img, '_lazybgset', {\n\t\t\tvalue: elem,\n\t\t\twritable: true\n\t\t});\n\t\tObject.defineProperty(elem, '_lazybgset', {\n\t\t\tvalue: picture,\n\t\t\twritable: true\n\t\t});\n\n\t\tsets = sets.replace(regWhite, ' ').split(regSplitSet);\n\n\t\tpicture.style.display = 'none';\n\t\timg.className = lazySizesCfg.lazyClass;\n\n\t\tif(sets.length == 1 && !sizes){\n\t\t\tsizes = 'auto';\n\t\t}\n\n\t\tsets.forEach(function(set){\n\t\t\tvar match;\n\t\t\tvar source = document.createElement('source');\n\n\t\t\tif(sizes && sizes != 'auto'){\n\t\t\t\tsource.setAttribute('sizes', sizes);\n\t\t\t}\n\n\t\t\tif((match = set.match(regSource))){\n\t\t\t\tsource.setAttribute(lazySizesCfg.srcsetAttr, match[1]);\n\n\t\t\t\tsetTypeOrMedia(source, match[2]);\n\t\t\t\tsetTypeOrMedia(source, match[3]);\n\t\t\t} else {\n\t\t\t\tsource.setAttribute(lazySizesCfg.srcsetAttr, set);\n\t\t\t}\n\n\t\t\tpicture.appendChild(source);\n\t\t});\n\n\t\tif(sizes){\n\t\t\timg.setAttribute(lazySizesCfg.sizesAttr, sizes);\n\t\t\telem.removeAttribute(lazySizesCfg.sizesAttr);\n\t\t\telem.removeAttribute('sizes');\n\t\t}\n\t\tif(optimumx){\n\t\t\timg.setAttribute('data-optimumx', optimumx);\n\t\t}\n\t\tif(ratio) {\n\t\t\timg.setAttribute('data-ratio', ratio);\n\t\t}\n\n\t\tpicture.appendChild(img);\n\n\t\telem.appendChild(picture);\n\t};\n\n\tvar proxyLoad = function(e){\n\t\tif(!e.target._lazybgset){return;}\n\n\t\tvar image = e.target;\n\t\tvar elem = image._lazybgset;\n\t\tvar bg = image.currentSrc || image.src;\n\n\n\t\tif(bg){\n\t\t\tvar useSrc = regBgUrlEscape.test(bg) ? JSON.stringify(bg) : bg;\n\t\t\tvar event = lazySizes.fire(elem, 'bgsetproxy', {\n\t\t\t\tsrc: bg,\n\t\t\t\tuseSrc: useSrc,\n\t\t\t\tfullSrc: null,\n\t\t\t});\n\n\t\t\tif(!event.defaultPrevented){\n\t\t\t\telem.style.backgroundImage = event.detail.fullSrc || 'url(' + event.detail.useSrc + ')';\n\t\t\t}\n\t\t}\n\n\t\tif(image._lazybgsetLoading){\n\t\t\tlazySizes.fire(elem, '_lazyloaded', {}, false, true);\n\t\t\tdelete image._lazybgsetLoading;\n\t\t}\n\t};\n\n\taddEventListener('lazybeforeunveil', function(e){\n\t\tvar set, image, elem;\n\n\t\tif(e.defaultPrevented || !(set = e.target.getAttribute('data-bgset'))){return;}\n\n\t\telem = e.target;\n\t\timage = document.createElement('img');\n\n\t\timage.alt = '';\n\n\t\timage._lazybgsetLoading = true;\n\t\te.detail.firesLoad = true;\n\n\t\tcreatePicture(set, elem, image);\n\n\t\tsetTimeout(function(){\n\t\t\tlazySizes.loader.unveil(image);\n\n\t\t\tlazySizes.rAF(function(){\n\t\t\t\tlazySizes.fire(image, '_lazyloaded', {}, true, true);\n\t\t\t\tif(image.complete) {\n\t\t\t\t\tproxyLoad({target: image});\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t});\n\n\tdocument.addEventListener('load', proxyLoad, true);\n\n\twindow.addEventListener('lazybeforesizes', function(e){\n\t\tif(e.detail.instance != lazySizes){return;}\n\t\tif(e.target._lazybgset && e.detail.dataAttr){\n\t\t\tvar elem = e.target._lazybgset;\n\t\t\tvar bgSize = getBgSize(elem);\n\n\t\t\tif(allowedBackgroundSize[bgSize]){\n\t\t\t\te.target._lazysizesParentFit = bgSize;\n\n\t\t\t\tlazySizes.rAF(function(){\n\t\t\t\t\te.target.setAttribute('data-parent-fit', bgSize);\n\t\t\t\t\tif(e.target._lazysizesParentFit){\n\t\t\t\t\t\tdelete e.target._lazysizesParentFit;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}, true);\n\n\tdocument.documentElement.addEventListener('lazybeforesizes', function(e){\n\t\tif(e.defaultPrevented || !e.target._lazybgset || e.detail.instance != lazySizes){return;}\n\t\te.detail.width = proxyWidth(e.target._lazybgset);\n\t});\n}));\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\n\n// eslint-disable-next-line es/no-set -- safe\nvar SetPrototype = Set.prototype;\n\nmodule.exports = {\n  // eslint-disable-next-line es/no-set -- safe\n  Set: Set,\n  add: uncurryThis(SetPrototype.add),\n  has: uncurryThis(SetPrototype.has),\n  remove: uncurryThis(SetPrototype['delete']),\n  proto: SetPrototype\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar $includes = require('../internals/array-includes').includes;\nvar fails = require('../internals/fails');\nvar addToUnscopables = require('../internals/add-to-unscopables');\n\n// FF99+ bug\nvar BROKEN_ON_SPARSE = fails(function () {\n  // eslint-disable-next-line es/no-array-prototype-includes -- detection\n  return !Array(1).includes();\n});\n\n// `Array.prototype.includes` method\n// https://tc39.es/ecma262/#sec-array.prototype.includes\n$({ target: 'Array', proto: true, forced: BROKEN_ON_SPARSE }, {\n  includes: function includes(el /* , fromIndex = 0 */) {\n    return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);\n  }\n});\n\n// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables('includes');\n","'use strict';\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar SAFE_CLOSING = false;\n\ntry {\n  var called = 0;\n  var iteratorWithReturn = {\n    next: function () {\n      return { done: !!called++ };\n    },\n    'return': function () {\n      SAFE_CLOSING = true;\n    }\n  };\n  // eslint-disable-next-line unicorn/no-immediate-mutation -- ES3 syntax limitation\n  iteratorWithReturn[ITERATOR] = function () {\n    return this;\n  };\n  // eslint-disable-next-line es/no-array-from, no-throw-literal -- required for testing\n  Array.from(iteratorWithReturn, function () { throw 2; });\n} catch (error) { /* empty */ }\n\nmodule.exports = function (exec, SKIP_CLOSING) {\n  try {\n    if (!SKIP_CLOSING && !SAFE_CLOSING) return false;\n  } catch (error) { return false; } // workaround of old WebKit + `eval` bug\n  var ITERATION_SUPPORT = false;\n  try {\n    var object = {};\n    // eslint-disable-next-line unicorn/no-immediate-mutation -- ES3 syntax limitation\n    object[ITERATOR] = function () {\n      return {\n        next: function () {\n          return { done: ITERATION_SUPPORT = true };\n        }\n      };\n    };\n    exec(object);\n  } catch (error) { /* empty */ }\n  return ITERATION_SUPPORT;\n};\n","'use strict';\nvar aSet = require('../internals/a-set');\nvar has = require('../internals/set-helpers').has;\nvar size = require('../internals/set-size');\nvar getSetRecord = require('../internals/get-set-record');\nvar iterateSet = require('../internals/set-iterate');\nvar iterateSimple = require('../internals/iterate-simple');\nvar iteratorClose = require('../internals/iterator-close');\n\n// `Set.prototype.isDisjointFrom` method\n// https://tc39.es/ecma262/#sec-set.prototype.isdisjointfrom\nmodule.exports = function isDisjointFrom(other) {\n  var O = aSet(this);\n  var otherRec = getSetRecord(other);\n  if (size(O) <= otherRec.size) return iterateSet(O, function (e) {\n    if (otherRec.includes(e)) return false;\n  }, true) !== false;\n  var iterator = otherRec.getIterator();\n  return iterateSimple(iterator, function (e) {\n    if (has(O, e)) return iteratorClose(iterator, 'normal', false);\n  }) !== false;\n};\n","'use strict';\nvar arraySlice = require('../internals/array-slice');\n\nvar floor = Math.floor;\n\nvar sort = function (array, comparefn) {\n  var length = array.length;\n\n  if (length < 8) {\n    // insertion sort\n    var i = 1;\n    var element, j;\n\n    while (i < length) {\n      j = i;\n      element = array[i];\n      while (j && comparefn(array[j - 1], element) > 0) {\n        array[j] = array[--j];\n      }\n      if (j !== i++) array[j] = element;\n    }\n  } else {\n    // merge sort\n    var middle = floor(length / 2);\n    var left = sort(arraySlice(array, 0, middle), comparefn);\n    var right = sort(arraySlice(array, middle), comparefn);\n    var llength = left.length;\n    var rlength = right.length;\n    var lindex = 0;\n    var rindex = 0;\n\n    while (lindex < llength || rindex < rlength) {\n      array[lindex + rindex] = (lindex < llength && rindex < rlength)\n        ? comparefn(left[lindex], right[rindex]) <= 0 ? left[lindex++] : right[rindex++]\n        : lindex < llength ? left[lindex++] : right[rindex++];\n    }\n  }\n\n  return array;\n};\n\nmodule.exports = sort;\n","'use strict';\nvar $ = require('../internals/export');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar isArray = require('../internals/is-array');\n\nvar nativeReverse = uncurryThis([].reverse);\nvar test = [1, 2];\n\n// `Array.prototype.reverse` method\n// https://tc39.es/ecma262/#sec-array.prototype.reverse\n// fix for Safari 12.0 bug\n// https://bugs.webkit.org/show_bug.cgi?id=188794\n$({ target: 'Array', proto: true, forced: String(test) === String(test.reverse()) }, {\n  reverse: function reverse() {\n    // eslint-disable-next-line no-self-assign -- dirty hack\n    if (isArray(this)) this.length = this.length;\n    return nativeReverse(this);\n  }\n});\n","'use strict';\n/* eslint-disable es/no-symbol -- required for testing */\nvar V8_VERSION = require('../internals/environment-v8-version');\nvar fails = require('../internals/fails');\nvar globalThis = require('../internals/global-this');\n\nvar $String = globalThis.String;\n\n// eslint-disable-next-line es/no-object-getownpropertysymbols -- required for testing\nmodule.exports = !!Object.getOwnPropertySymbols && !fails(function () {\n  var symbol = Symbol('symbol detection');\n  // Chrome 38 Symbol has incorrect toString conversion\n  // `get-own-property-symbols` polyfill symbols converted to object are not Symbol instances\n  // nb: Do not call `String` directly to avoid this being optimized out to `symbol+''` which will,\n  // of course, fail.\n  return !$String(symbol) || !(Object(symbol) instanceof Symbol) ||\n    // Chrome 38-40 symbols are not inherited from DOM collections prototypes to instances\n    !Symbol.sham && V8_VERSION && V8_VERSION < 41;\n});\n","let colors = require('./lib/public/colors')\nmodule.exports = (colors.__esModule ? colors : { default: colors }).default\n","\"use strict\";\n\nexports.__esModule = true;\nexports[\"default\"] = sortAscending;\n\nfunction sortAscending(list) {\n  return list.sort(function (a, b) {\n    return a - b;\n  });\n}\n\n;\nmodule.exports = exports.default;","'use strict';\nvar check = function (it) {\n  return it && it.Math === Math && it;\n};\n\n// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nmodule.exports =\n  // eslint-disable-next-line es/no-global-this -- safe\n  check(typeof globalThis == 'object' && globalThis) ||\n  check(typeof window == 'object' && window) ||\n  // eslint-disable-next-line no-restricted-globals -- safe\n  check(typeof self == 'object' && self) ||\n  check(typeof global == 'object' && global) ||\n  check(typeof this == 'object' && this) ||\n  // eslint-disable-next-line no-new-func -- fallback\n  (function () { return this; })() || Function('return this')();\n","'use strict';\nvar fails = require('../internals/fails');\n\nmodule.exports = function (METHOD_NAME, argument) {\n  var method = [][METHOD_NAME];\n  return !!method && fails(function () {\n    // eslint-disable-next-line no-useless-call -- required for testing\n    method.call(null, argument || function () { return 1; }, 1);\n  });\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar globalThis = require('../internals/global-this');\nvar schedulersFix = require('../internals/schedulers-fix');\n\nvar setTimeout = schedulersFix(globalThis.setTimeout, true);\n\n// Bun / IE9- setTimeout additional parameters fix\n// https://html.spec.whatwg.org/multipage/timers-and-user-prompts.html#dom-settimeout\n$({ global: true, bind: true, forced: globalThis.setTimeout !== setTimeout }, {\n  setTimeout: setTimeout\n});\n","\n/**\n * Module exports.\n */\n\nmodule.exports = deprecate;\n\n/**\n * Mark that a method should not be used.\n * Returns a modified function which warns once by default.\n *\n * If `localStorage.noDeprecation = true` is set, then it is a no-op.\n *\n * If `localStorage.throwDeprecation = true` is set, then deprecated functions\n * will throw an Error when invoked.\n *\n * If `localStorage.traceDeprecation = true` is set, then deprecated functions\n * will invoke `console.trace()` instead of `console.error()`.\n *\n * @param {Function} fn - the function to deprecate\n * @param {String} msg - the string to print to the console when `fn` is invoked\n * @returns {Function} a new \"deprecated\" version of `fn`\n * @api public\n */\n\nfunction deprecate (fn, msg) {\n  if (config('noDeprecation')) {\n    return fn;\n  }\n\n  var warned = false;\n  function deprecated() {\n    if (!warned) {\n      if (config('throwDeprecation')) {\n        throw new Error(msg);\n      } else if (config('traceDeprecation')) {\n        console.trace(msg);\n      } else {\n        console.warn(msg);\n      }\n      warned = true;\n    }\n    return fn.apply(this, arguments);\n  }\n\n  return deprecated;\n}\n\n/**\n * Checks `localStorage` for boolean values for the given `name`.\n *\n * @param {String} name\n * @returns {Boolean}\n * @api private\n */\n\nfunction config (name) {\n  // accessing global.localStorage can trigger a DOMException in sandboxed iframes\n  try {\n    if (!global.localStorage) return false;\n  } catch (_) {\n    return false;\n  }\n  var val = global.localStorage[name];\n  if (null == val) return false;\n  return String(val).toLowerCase() === 'true';\n}\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar definePropertyModule = require('../internals/object-define-property');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\n\nmodule.exports = function (object, key, value) {\n  if (DESCRIPTORS) definePropertyModule.f(object, key, createPropertyDescriptor(0, value));\n  else object[key] = value;\n};\n","/*!\n * jQuery JavaScript Library v3.7.1\n * https://jquery.com/\n *\n * Copyright OpenJS Foundation and other contributors\n * Released under the MIT license\n * https://jquery.org/license\n *\n * Date: 2023-08-28T13:37Z\n */\n( function( global, factory ) {\n\n\t\"use strict\";\n\n\tif ( typeof module === \"object\" && typeof module.exports === \"object\" ) {\n\n\t\t// For CommonJS and CommonJS-like environments where a proper `window`\n\t\t// is present, execute the factory and get jQuery.\n\t\t// For environments that do not have a `window` with a `document`\n\t\t// (such as Node.js), expose a factory as module.exports.\n\t\t// This accentuates the need for the creation of a real `window`.\n\t\t// e.g. var jQuery = require(\"jquery\")(window);\n\t\t// See ticket trac-14549 for more info.\n\t\tmodule.exports = global.document ?\n\t\t\tfactory( global, true ) :\n\t\t\tfunction( w ) {\n\t\t\t\tif ( !w.document ) {\n\t\t\t\t\tthrow new Error( \"jQuery requires a window with a document\" );\n\t\t\t\t}\n\t\t\t\treturn factory( w );\n\t\t\t};\n\t} else {\n\t\tfactory( global );\n\t}\n\n// Pass this if window is not defined yet\n} )( typeof window !== \"undefined\" ? window : this, function( window, noGlobal ) {\n\n// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1\n// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode\n// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common\n// enough that all such attempts are guarded in a try block.\n\"use strict\";\n\nvar arr = [];\n\nvar getProto = Object.getPrototypeOf;\n\nvar slice = arr.slice;\n\nvar flat = arr.flat ? function( array ) {\n\treturn arr.flat.call( array );\n} : function( array ) {\n\treturn arr.concat.apply( [], array );\n};\n\n\nvar push = arr.push;\n\nvar indexOf = arr.indexOf;\n\nvar class2type = {};\n\nvar toString = class2type.toString;\n\nvar hasOwn = class2type.hasOwnProperty;\n\nvar fnToString = hasOwn.toString;\n\nvar ObjectFunctionString = fnToString.call( Object );\n\nvar support = {};\n\nvar isFunction = function isFunction( obj ) {\n\n\t\t// Support: Chrome <=57, Firefox <=52\n\t\t// In some browsers, typeof returns \"function\" for HTML <object> elements\n\t\t// (i.e., `typeof document.createElement( \"object\" ) === \"function\"`).\n\t\t// We don't want to classify *any* DOM node as a function.\n\t\t// Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5\n\t\t// Plus for old WebKit, typeof returns \"function\" for HTML collections\n\t\t// (e.g., `typeof document.getElementsByTagName(\"div\") === \"function\"`). (gh-4756)\n\t\treturn typeof obj === \"function\" && typeof obj.nodeType !== \"number\" &&\n\t\t\ttypeof obj.item !== \"function\";\n\t};\n\n\nvar isWindow = function isWindow( obj ) {\n\t\treturn obj != null && obj === obj.window;\n\t};\n\n\nvar document = window.document;\n\n\n\n\tvar preservedScriptAttributes = {\n\t\ttype: true,\n\t\tsrc: true,\n\t\tnonce: true,\n\t\tnoModule: true\n\t};\n\n\tfunction DOMEval( code, node, doc ) {\n\t\tdoc = doc || document;\n\n\t\tvar i, val,\n\t\t\tscript = doc.createElement( \"script\" );\n\n\t\tscript.text = code;\n\t\tif ( node ) {\n\t\t\tfor ( i in preservedScriptAttributes ) {\n\n\t\t\t\t// Support: Firefox 64+, Edge 18+\n\t\t\t\t// Some browsers don't support the \"nonce\" property on scripts.\n\t\t\t\t// On the other hand, just using `getAttribute` is not enough as\n\t\t\t\t// the `nonce` attribute is reset to an empty string whenever it\n\t\t\t\t// becomes browsing-context connected.\n\t\t\t\t// See https://github.com/whatwg/html/issues/2369\n\t\t\t\t// See https://html.spec.whatwg.org/#nonce-attributes\n\t\t\t\t// The `node.getAttribute` check was added for the sake of\n\t\t\t\t// `jQuery.globalEval` so that it can fake a nonce-containing node\n\t\t\t\t// via an object.\n\t\t\t\tval = node[ i ] || node.getAttribute && node.getAttribute( i );\n\t\t\t\tif ( val ) {\n\t\t\t\t\tscript.setAttribute( i, val );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tdoc.head.appendChild( script ).parentNode.removeChild( script );\n\t}\n\n\nfunction toType( obj ) {\n\tif ( obj == null ) {\n\t\treturn obj + \"\";\n\t}\n\n\t// Support: Android <=2.3 only (functionish RegExp)\n\treturn typeof obj === \"object\" || typeof obj === \"function\" ?\n\t\tclass2type[ toString.call( obj ) ] || \"object\" :\n\t\ttypeof obj;\n}\n/* global Symbol */\n// Defining this global in .eslintrc.json would create a danger of using the global\n// unguarded in another place, it seems safer to define global only for this module\n\n\n\nvar version = \"3.7.1\",\n\n\trhtmlSuffix = /HTML$/i,\n\n\t// Define a local copy of jQuery\n\tjQuery = function( selector, context ) {\n\n\t\t// The jQuery object is actually just the init constructor 'enhanced'\n\t\t// Need init if jQuery is called (just allow error to be thrown if not included)\n\t\treturn new jQuery.fn.init( selector, context );\n\t};\n\njQuery.fn = jQuery.prototype = {\n\n\t// The current version of jQuery being used\n\tjquery: version,\n\n\tconstructor: jQuery,\n\n\t// The default length of a jQuery object is 0\n\tlength: 0,\n\n\ttoArray: function() {\n\t\treturn slice.call( this );\n\t},\n\n\t// Get the Nth element in the matched element set OR\n\t// Get the whole matched element set as a clean array\n\tget: function( num ) {\n\n\t\t// Return all the elements in a clean array\n\t\tif ( num == null ) {\n\t\t\treturn slice.call( this );\n\t\t}\n\n\t\t// Return just the one element from the set\n\t\treturn num < 0 ? this[ num + this.length ] : this[ num ];\n\t},\n\n\t// Take an array of elements and push it onto the stack\n\t// (returning the new matched element set)\n\tpushStack: function( elems ) {\n\n\t\t// Build a new jQuery matched element set\n\t\tvar ret = jQuery.merge( this.constructor(), elems );\n\n\t\t// Add the old object onto the stack (as a reference)\n\t\tret.prevObject = this;\n\n\t\t// Return the newly-formed element set\n\t\treturn ret;\n\t},\n\n\t// Execute a callback for every element in the matched set.\n\teach: function( callback ) {\n\t\treturn jQuery.each( this, callback );\n\t},\n\n\tmap: function( callback ) {\n\t\treturn this.pushStack( jQuery.map( this, function( elem, i ) {\n\t\t\treturn callback.call( elem, i, elem );\n\t\t} ) );\n\t},\n\n\tslice: function() {\n\t\treturn this.pushStack( slice.apply( this, arguments ) );\n\t},\n\n\tfirst: function() {\n\t\treturn this.eq( 0 );\n\t},\n\n\tlast: function() {\n\t\treturn this.eq( -1 );\n\t},\n\n\teven: function() {\n\t\treturn this.pushStack( jQuery.grep( this, function( _elem, i ) {\n\t\t\treturn ( i + 1 ) % 2;\n\t\t} ) );\n\t},\n\n\todd: function() {\n\t\treturn this.pushStack( jQuery.grep( this, function( _elem, i ) {\n\t\t\treturn i % 2;\n\t\t} ) );\n\t},\n\n\teq: function( i ) {\n\t\tvar len = this.length,\n\t\t\tj = +i + ( i < 0 ? len : 0 );\n\t\treturn this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );\n\t},\n\n\tend: function() {\n\t\treturn this.prevObject || this.constructor();\n\t},\n\n\t// For internal use only.\n\t// Behaves like an Array's method, not like a jQuery method.\n\tpush: push,\n\tsort: arr.sort,\n\tsplice: arr.splice\n};\n\njQuery.extend = jQuery.fn.extend = function() {\n\tvar options, name, src, copy, copyIsArray, clone,\n\t\ttarget = arguments[ 0 ] || {},\n\t\ti = 1,\n\t\tlength = arguments.length,\n\t\tdeep = false;\n\n\t// Handle a deep copy situation\n\tif ( typeof target === \"boolean\" ) {\n\t\tdeep = target;\n\n\t\t// Skip the boolean and the target\n\t\ttarget = arguments[ i ] || {};\n\t\ti++;\n\t}\n\n\t// Handle case when target is a string or something (possible in deep copy)\n\tif ( typeof target !== \"object\" && !isFunction( target ) ) {\n\t\ttarget = {};\n\t}\n\n\t// Extend jQuery itself if only one argument is passed\n\tif ( i === length ) {\n\t\ttarget = this;\n\t\ti--;\n\t}\n\n\tfor ( ; i < length; i++ ) {\n\n\t\t// Only deal with non-null/undefined values\n\t\tif ( ( options = arguments[ i ] ) != null ) {\n\n\t\t\t// Extend the base object\n\t\t\tfor ( name in options ) {\n\t\t\t\tcopy = options[ name ];\n\n\t\t\t\t// Prevent Object.prototype pollution\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif ( name === \"__proto__\" || target === copy ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Recurse if we're merging plain objects or arrays\n\t\t\t\tif ( deep && copy && ( jQuery.isPlainObject( copy ) ||\n\t\t\t\t\t( copyIsArray = Array.isArray( copy ) ) ) ) {\n\t\t\t\t\tsrc = target[ name ];\n\n\t\t\t\t\t// Ensure proper type for the source value\n\t\t\t\t\tif ( copyIsArray && !Array.isArray( src ) ) {\n\t\t\t\t\t\tclone = [];\n\t\t\t\t\t} else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) {\n\t\t\t\t\t\tclone = {};\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclone = src;\n\t\t\t\t\t}\n\t\t\t\t\tcopyIsArray = false;\n\n\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\ttarget[ name ] = jQuery.extend( deep, clone, copy );\n\n\t\t\t\t// Don't bring in undefined values\n\t\t\t\t} else if ( copy !== undefined ) {\n\t\t\t\t\ttarget[ name ] = copy;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the modified object\n\treturn target;\n};\n\njQuery.extend( {\n\n\t// Unique for each copy of jQuery on the page\n\texpando: \"jQuery\" + ( version + Math.random() ).replace( /\\D/g, \"\" ),\n\n\t// Assume jQuery is ready without the ready module\n\tisReady: true,\n\n\terror: function( msg ) {\n\t\tthrow new Error( msg );\n\t},\n\n\tnoop: function() {},\n\n\tisPlainObject: function( obj ) {\n\t\tvar proto, Ctor;\n\n\t\t// Detect obvious negatives\n\t\t// Use toString instead of jQuery.type to catch host objects\n\t\tif ( !obj || toString.call( obj ) !== \"[object Object]\" ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tproto = getProto( obj );\n\n\t\t// Objects with no prototype (e.g., `Object.create( null )`) are plain\n\t\tif ( !proto ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Objects with prototype are plain iff they were constructed by a global Object function\n\t\tCtor = hasOwn.call( proto, \"constructor\" ) && proto.constructor;\n\t\treturn typeof Ctor === \"function\" && fnToString.call( Ctor ) === ObjectFunctionString;\n\t},\n\n\tisEmptyObject: function( obj ) {\n\t\tvar name;\n\n\t\tfor ( name in obj ) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t},\n\n\t// Evaluates a script in a provided context; falls back to the global one\n\t// if not specified.\n\tglobalEval: function( code, options, doc ) {\n\t\tDOMEval( code, { nonce: options && options.nonce }, doc );\n\t},\n\n\teach: function( obj, callback ) {\n\t\tvar length, i = 0;\n\n\t\tif ( isArrayLike( obj ) ) {\n\t\t\tlength = obj.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tfor ( i in obj ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn obj;\n\t},\n\n\n\t// Retrieve the text value of an array of DOM nodes\n\ttext: function( elem ) {\n\t\tvar node,\n\t\t\tret = \"\",\n\t\t\ti = 0,\n\t\t\tnodeType = elem.nodeType;\n\n\t\tif ( !nodeType ) {\n\n\t\t\t// If no nodeType, this is expected to be an array\n\t\t\twhile ( ( node = elem[ i++ ] ) ) {\n\n\t\t\t\t// Do not traverse comment nodes\n\t\t\t\tret += jQuery.text( node );\n\t\t\t}\n\t\t}\n\t\tif ( nodeType === 1 || nodeType === 11 ) {\n\t\t\treturn elem.textContent;\n\t\t}\n\t\tif ( nodeType === 9 ) {\n\t\t\treturn elem.documentElement.textContent;\n\t\t}\n\t\tif ( nodeType === 3 || nodeType === 4 ) {\n\t\t\treturn elem.nodeValue;\n\t\t}\n\n\t\t// Do not include comment or processing instruction nodes\n\n\t\treturn ret;\n\t},\n\n\t// results is for internal usage only\n\tmakeArray: function( arr, results ) {\n\t\tvar ret = results || [];\n\n\t\tif ( arr != null ) {\n\t\t\tif ( isArrayLike( Object( arr ) ) ) {\n\t\t\t\tjQuery.merge( ret,\n\t\t\t\t\ttypeof arr === \"string\" ?\n\t\t\t\t\t\t[ arr ] : arr\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tpush.call( ret, arr );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tinArray: function( elem, arr, i ) {\n\t\treturn arr == null ? -1 : indexOf.call( arr, elem, i );\n\t},\n\n\tisXMLDoc: function( elem ) {\n\t\tvar namespace = elem && elem.namespaceURI,\n\t\t\tdocElem = elem && ( elem.ownerDocument || elem ).documentElement;\n\n\t\t// Assume HTML when documentElement doesn't yet exist, such as inside\n\t\t// document fragments.\n\t\treturn !rhtmlSuffix.test( namespace || docElem && docElem.nodeName || \"HTML\" );\n\t},\n\n\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t// push.apply(_, arraylike) throws on ancient WebKit\n\tmerge: function( first, second ) {\n\t\tvar len = +second.length,\n\t\t\tj = 0,\n\t\t\ti = first.length;\n\n\t\tfor ( ; j < len; j++ ) {\n\t\t\tfirst[ i++ ] = second[ j ];\n\t\t}\n\n\t\tfirst.length = i;\n\n\t\treturn first;\n\t},\n\n\tgrep: function( elems, callback, invert ) {\n\t\tvar callbackInverse,\n\t\t\tmatches = [],\n\t\t\ti = 0,\n\t\t\tlength = elems.length,\n\t\t\tcallbackExpect = !invert;\n\n\t\t// Go through the array, only saving the items\n\t\t// that pass the validator function\n\t\tfor ( ; i < length; i++ ) {\n\t\t\tcallbackInverse = !callback( elems[ i ], i );\n\t\t\tif ( callbackInverse !== callbackExpect ) {\n\t\t\t\tmatches.push( elems[ i ] );\n\t\t\t}\n\t\t}\n\n\t\treturn matches;\n\t},\n\n\t// arg is for internal usage only\n\tmap: function( elems, callback, arg ) {\n\t\tvar length, value,\n\t\t\ti = 0,\n\t\t\tret = [];\n\n\t\t// Go through the array, translating each of the items to their new values\n\t\tif ( isArrayLike( elems ) ) {\n\t\t\tlength = elems.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Go through every key on the object,\n\t\t} else {\n\t\t\tfor ( i in elems ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Flatten any nested arrays\n\t\treturn flat( ret );\n\t},\n\n\t// A global GUID counter for objects\n\tguid: 1,\n\n\t// jQuery.support is not used in Core but other projects attach their\n\t// properties to it so it needs to exist.\n\tsupport: support\n} );\n\nif ( typeof Symbol === \"function\" ) {\n\tjQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];\n}\n\n// Populate the class2type map\njQuery.each( \"Boolean Number String Function Array Date RegExp Object Error Symbol\".split( \" \" ),\n\tfunction( _i, name ) {\n\t\tclass2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\n\t} );\n\nfunction isArrayLike( obj ) {\n\n\t// Support: real iOS 8.2 only (not reproducible in simulator)\n\t// `in` check used to prevent JIT error (gh-2145)\n\t// hasOwn isn't used here due to false negatives\n\t// regarding Nodelist length in IE\n\tvar length = !!obj && \"length\" in obj && obj.length,\n\t\ttype = toType( obj );\n\n\tif ( isFunction( obj ) || isWindow( obj ) ) {\n\t\treturn false;\n\t}\n\n\treturn type === \"array\" || length === 0 ||\n\t\ttypeof length === \"number\" && length > 0 && ( length - 1 ) in obj;\n}\n\n\nfunction nodeName( elem, name ) {\n\n\treturn elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();\n\n}\nvar pop = arr.pop;\n\n\nvar sort = arr.sort;\n\n\nvar splice = arr.splice;\n\n\nvar whitespace = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\";\n\n\nvar rtrimCSS = new RegExp(\n\t\"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" + whitespace + \"+$\",\n\t\"g\"\n);\n\n\n\n\n// Note: an element does not contain itself\njQuery.contains = function( a, b ) {\n\tvar bup = b && b.parentNode;\n\n\treturn a === bup || !!( bup && bup.nodeType === 1 && (\n\n\t\t// Support: IE 9 - 11+\n\t\t// IE doesn't have `contains` on SVG.\n\t\ta.contains ?\n\t\t\ta.contains( bup ) :\n\t\t\ta.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16\n\t) );\n};\n\n\n\n\n// CSS string/identifier serialization\n// https://drafts.csswg.org/cssom/#common-serializing-idioms\nvar rcssescape = /([\\0-\\x1f\\x7f]|^-?\\d)|^-$|[^\\x80-\\uFFFF\\w-]/g;\n\nfunction fcssescape( ch, asCodePoint ) {\n\tif ( asCodePoint ) {\n\n\t\t// U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER\n\t\tif ( ch === \"\\0\" ) {\n\t\t\treturn \"\\uFFFD\";\n\t\t}\n\n\t\t// Control characters and (dependent upon position) numbers get escaped as code points\n\t\treturn ch.slice( 0, -1 ) + \"\\\\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + \" \";\n\t}\n\n\t// Other potentially-special ASCII characters get backslash-escaped\n\treturn \"\\\\\" + ch;\n}\n\njQuery.escapeSelector = function( sel ) {\n\treturn ( sel + \"\" ).replace( rcssescape, fcssescape );\n};\n\n\n\n\nvar preferredDoc = document,\n\tpushNative = push;\n\n( function() {\n\nvar i,\n\tExpr,\n\toutermostContext,\n\tsortInput,\n\thasDuplicate,\n\tpush = pushNative,\n\n\t// Local document vars\n\tdocument,\n\tdocumentElement,\n\tdocumentIsHTML,\n\trbuggyQSA,\n\tmatches,\n\n\t// Instance-specific data\n\texpando = jQuery.expando,\n\tdirruns = 0,\n\tdone = 0,\n\tclassCache = createCache(),\n\ttokenCache = createCache(),\n\tcompilerCache = createCache(),\n\tnonnativeSelectorCache = createCache(),\n\tsortOrder = function( a, b ) {\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t}\n\t\treturn 0;\n\t},\n\n\tbooleans = \"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|\" +\n\t\t\"loop|multiple|open|readonly|required|scoped\",\n\n\t// Regular expressions\n\n\t// https://www.w3.org/TR/css-syntax-3/#ident-token-diagram\n\tidentifier = \"(?:\\\\\\\\[\\\\da-fA-F]{1,6}\" + whitespace +\n\t\t\"?|\\\\\\\\[^\\\\r\\\\n\\\\f]|[\\\\w-]|[^\\0-\\\\x7f])+\",\n\n\t// Attribute selectors: https://www.w3.org/TR/selectors/#attribute-selectors\n\tattributes = \"\\\\[\" + whitespace + \"*(\" + identifier + \")(?:\" + whitespace +\n\n\t\t// Operator (capture 2)\n\t\t\"*([*^$|!~]?=)\" + whitespace +\n\n\t\t// \"Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]\"\n\t\t\"*(?:'((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\"|(\" + identifier + \"))|)\" +\n\t\twhitespace + \"*\\\\]\",\n\n\tpseudos = \":(\" + identifier + \")(?:\\\\((\" +\n\n\t\t// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:\n\t\t// 1. quoted (capture 3; capture 4 or capture 5)\n\t\t\"('((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\")|\" +\n\n\t\t// 2. simple (capture 6)\n\t\t\"((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\" + attributes + \")*)|\" +\n\n\t\t// 3. anything else (capture 2)\n\t\t\".*\" +\n\t\t\")\\\\)|)\",\n\n\t// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\n\trwhitespace = new RegExp( whitespace + \"+\", \"g\" ),\n\n\trcomma = new RegExp( \"^\" + whitespace + \"*,\" + whitespace + \"*\" ),\n\trleadingCombinator = new RegExp( \"^\" + whitespace + \"*([>+~]|\" + whitespace + \")\" +\n\t\twhitespace + \"*\" ),\n\trdescend = new RegExp( whitespace + \"|>\" ),\n\n\trpseudo = new RegExp( pseudos ),\n\tridentifier = new RegExp( \"^\" + identifier + \"$\" ),\n\n\tmatchExpr = {\n\t\tID: new RegExp( \"^#(\" + identifier + \")\" ),\n\t\tCLASS: new RegExp( \"^\\\\.(\" + identifier + \")\" ),\n\t\tTAG: new RegExp( \"^(\" + identifier + \"|[*])\" ),\n\t\tATTR: new RegExp( \"^\" + attributes ),\n\t\tPSEUDO: new RegExp( \"^\" + pseudos ),\n\t\tCHILD: new RegExp(\n\t\t\t\"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\" +\n\t\t\t\twhitespace + \"*(even|odd|(([+-]|)(\\\\d*)n|)\" + whitespace + \"*(?:([+-]|)\" +\n\t\t\t\twhitespace + \"*(\\\\d+)|))\" + whitespace + \"*\\\\)|)\", \"i\" ),\n\t\tbool: new RegExp( \"^(?:\" + booleans + \")$\", \"i\" ),\n\n\t\t// For use in libraries implementing .is()\n\t\t// We use this for POS matching in `select`\n\t\tneedsContext: new RegExp( \"^\" + whitespace +\n\t\t\t\"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\" + whitespace +\n\t\t\t\"*((?:-\\\\d)?\\\\d*)\" + whitespace + \"*\\\\)|)(?=[^-]|$)\", \"i\" )\n\t},\n\n\trinputs = /^(?:input|select|textarea|button)$/i,\n\trheader = /^h\\d$/i,\n\n\t// Easily-parseable/retrievable ID or TAG or CLASS selectors\n\trquickExpr = /^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,\n\n\trsibling = /[+~]/,\n\n\t// CSS escapes\n\t// https://www.w3.org/TR/CSS21/syndata.html#escaped-characters\n\trunescape = new RegExp( \"\\\\\\\\[\\\\da-fA-F]{1,6}\" + whitespace +\n\t\t\"?|\\\\\\\\([^\\\\r\\\\n\\\\f])\", \"g\" ),\n\tfunescape = function( escape, nonHex ) {\n\t\tvar high = \"0x\" + escape.slice( 1 ) - 0x10000;\n\n\t\tif ( nonHex ) {\n\n\t\t\t// Strip the backslash prefix from a non-hex escape sequence\n\t\t\treturn nonHex;\n\t\t}\n\n\t\t// Replace a hexadecimal escape sequence with the encoded Unicode code point\n\t\t// Support: IE <=11+\n\t\t// For values outside the Basic Multilingual Plane (BMP), manually construct a\n\t\t// surrogate pair\n\t\treturn high < 0 ?\n\t\t\tString.fromCharCode( high + 0x10000 ) :\n\t\t\tString.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );\n\t},\n\n\t// Used for iframes; see `setDocument`.\n\t// Support: IE 9 - 11+, Edge 12 - 18+\n\t// Removing the function wrapper causes a \"Permission Denied\"\n\t// error in IE/Edge.\n\tunloadHandler = function() {\n\t\tsetDocument();\n\t},\n\n\tinDisabledFieldset = addCombinator(\n\t\tfunction( elem ) {\n\t\t\treturn elem.disabled === true && nodeName( elem, \"fieldset\" );\n\t\t},\n\t\t{ dir: \"parentNode\", next: \"legend\" }\n\t);\n\n// Support: IE <=9 only\n// Accessing document.activeElement can throw unexpectedly\n// https://bugs.jquery.com/ticket/13393\nfunction safeActiveElement() {\n\ttry {\n\t\treturn document.activeElement;\n\t} catch ( err ) { }\n}\n\n// Optimize for push.apply( _, NodeList )\ntry {\n\tpush.apply(\n\t\t( arr = slice.call( preferredDoc.childNodes ) ),\n\t\tpreferredDoc.childNodes\n\t);\n\n\t// Support: Android <=4.0\n\t// Detect silently failing push.apply\n\t// eslint-disable-next-line no-unused-expressions\n\tarr[ preferredDoc.childNodes.length ].nodeType;\n} catch ( e ) {\n\tpush = {\n\t\tapply: function( target, els ) {\n\t\t\tpushNative.apply( target, slice.call( els ) );\n\t\t},\n\t\tcall: function( target ) {\n\t\t\tpushNative.apply( target, slice.call( arguments, 1 ) );\n\t\t}\n\t};\n}\n\nfunction find( selector, context, results, seed ) {\n\tvar m, i, elem, nid, match, groups, newSelector,\n\t\tnewContext = context && context.ownerDocument,\n\n\t\t// nodeType defaults to 9, since context defaults to document\n\t\tnodeType = context ? context.nodeType : 9;\n\n\tresults = results || [];\n\n\t// Return early from calls with invalid selector or context\n\tif ( typeof selector !== \"string\" || !selector ||\n\t\tnodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {\n\n\t\treturn results;\n\t}\n\n\t// Try to shortcut find operations (as opposed to filters) in HTML documents\n\tif ( !seed ) {\n\t\tsetDocument( context );\n\t\tcontext = context || document;\n\n\t\tif ( documentIsHTML ) {\n\n\t\t\t// If the selector is sufficiently simple, try using a \"get*By*\" DOM method\n\t\t\t// (excepting DocumentFragment context, where the methods don't exist)\n\t\t\tif ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) {\n\n\t\t\t\t// ID selector\n\t\t\t\tif ( ( m = match[ 1 ] ) ) {\n\n\t\t\t\t\t// Document context\n\t\t\t\t\tif ( nodeType === 9 ) {\n\t\t\t\t\t\tif ( ( elem = context.getElementById( m ) ) ) {\n\n\t\t\t\t\t\t\t// Support: IE 9 only\n\t\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\t\tif ( elem.id === m ) {\n\t\t\t\t\t\t\t\tpush.call( results, elem );\n\t\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t// Element context\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// Support: IE 9 only\n\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\tif ( newContext && ( elem = newContext.getElementById( m ) ) &&\n\t\t\t\t\t\t\tfind.contains( context, elem ) &&\n\t\t\t\t\t\t\telem.id === m ) {\n\n\t\t\t\t\t\t\tpush.call( results, elem );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t// Type selector\n\t\t\t\t} else if ( match[ 2 ] ) {\n\t\t\t\t\tpush.apply( results, context.getElementsByTagName( selector ) );\n\t\t\t\t\treturn results;\n\n\t\t\t\t// Class selector\n\t\t\t\t} else if ( ( m = match[ 3 ] ) && context.getElementsByClassName ) {\n\t\t\t\t\tpush.apply( results, context.getElementsByClassName( m ) );\n\t\t\t\t\treturn results;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Take advantage of querySelectorAll\n\t\t\tif ( !nonnativeSelectorCache[ selector + \" \" ] &&\n\t\t\t\t( !rbuggyQSA || !rbuggyQSA.test( selector ) ) ) {\n\n\t\t\t\tnewSelector = selector;\n\t\t\t\tnewContext = context;\n\n\t\t\t\t// qSA considers elements outside a scoping root when evaluating child or\n\t\t\t\t// descendant combinators, which is not what we want.\n\t\t\t\t// In such cases, we work around the behavior by prefixing every selector in the\n\t\t\t\t// list with an ID selector referencing the scope context.\n\t\t\t\t// The technique has to be used as well when a leading combinator is used\n\t\t\t\t// as such selectors are not recognized by querySelectorAll.\n\t\t\t\t// Thanks to Andrew Dupont for this technique.\n\t\t\t\tif ( nodeType === 1 &&\n\t\t\t\t\t( rdescend.test( selector ) || rleadingCombinator.test( selector ) ) ) {\n\n\t\t\t\t\t// Expand context for sibling selectors\n\t\t\t\t\tnewContext = rsibling.test( selector ) && testContext( context.parentNode ) ||\n\t\t\t\t\t\tcontext;\n\n\t\t\t\t\t// We can use :scope instead of the ID hack if the browser\n\t\t\t\t\t// supports it & if we're not changing the context.\n\t\t\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when\n\t\t\t\t\t// strict-comparing two documents; shallow comparisons work.\n\t\t\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\t\t\tif ( newContext != context || !support.scope ) {\n\n\t\t\t\t\t\t// Capture the context ID, setting it first if necessary\n\t\t\t\t\t\tif ( ( nid = context.getAttribute( \"id\" ) ) ) {\n\t\t\t\t\t\t\tnid = jQuery.escapeSelector( nid );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcontext.setAttribute( \"id\", ( nid = expando ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prefix every selector in the list\n\t\t\t\t\tgroups = tokenize( selector );\n\t\t\t\t\ti = groups.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tgroups[ i ] = ( nid ? \"#\" + nid : \":scope\" ) + \" \" +\n\t\t\t\t\t\t\ttoSelector( groups[ i ] );\n\t\t\t\t\t}\n\t\t\t\t\tnewSelector = groups.join( \",\" );\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tpush.apply( results,\n\t\t\t\t\t\tnewContext.querySelectorAll( newSelector )\n\t\t\t\t\t);\n\t\t\t\t\treturn results;\n\t\t\t\t} catch ( qsaError ) {\n\t\t\t\t\tnonnativeSelectorCache( selector, true );\n\t\t\t\t} finally {\n\t\t\t\t\tif ( nid === expando ) {\n\t\t\t\t\t\tcontext.removeAttribute( \"id\" );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// All others\n\treturn select( selector.replace( rtrimCSS, \"$1\" ), context, results, seed );\n}\n\n/**\n * Create key-value caches of limited size\n * @returns {function(string, object)} Returns the Object data after storing it on itself with\n *\tproperty name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)\n *\tdeleting the oldest entry\n */\nfunction createCache() {\n\tvar keys = [];\n\n\tfunction cache( key, value ) {\n\n\t\t// Use (key + \" \") to avoid collision with native prototype properties\n\t\t// (see https://github.com/jquery/sizzle/issues/157)\n\t\tif ( keys.push( key + \" \" ) > Expr.cacheLength ) {\n\n\t\t\t// Only keep the most recent entries\n\t\t\tdelete cache[ keys.shift() ];\n\t\t}\n\t\treturn ( cache[ key + \" \" ] = value );\n\t}\n\treturn cache;\n}\n\n/**\n * Mark a function for special use by jQuery selector module\n * @param {Function} fn The function to mark\n */\nfunction markFunction( fn ) {\n\tfn[ expando ] = true;\n\treturn fn;\n}\n\n/**\n * Support testing using an element\n * @param {Function} fn Passed the created element and returns a boolean result\n */\nfunction assert( fn ) {\n\tvar el = document.createElement( \"fieldset\" );\n\n\ttry {\n\t\treturn !!fn( el );\n\t} catch ( e ) {\n\t\treturn false;\n\t} finally {\n\n\t\t// Remove from its parent by default\n\t\tif ( el.parentNode ) {\n\t\t\tel.parentNode.removeChild( el );\n\t\t}\n\n\t\t// release memory in IE\n\t\tel = null;\n\t}\n}\n\n/**\n * Returns a function to use in pseudos for input types\n * @param {String} type\n */\nfunction createInputPseudo( type ) {\n\treturn function( elem ) {\n\t\treturn nodeName( elem, \"input\" ) && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for buttons\n * @param {String} type\n */\nfunction createButtonPseudo( type ) {\n\treturn function( elem ) {\n\t\treturn ( nodeName( elem, \"input\" ) || nodeName( elem, \"button\" ) ) &&\n\t\t\telem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for :enabled/:disabled\n * @param {Boolean} disabled true for :disabled; false for :enabled\n */\nfunction createDisabledPseudo( disabled ) {\n\n\t// Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable\n\treturn function( elem ) {\n\n\t\t// Only certain elements can match :enabled or :disabled\n\t\t// https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled\n\t\t// https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled\n\t\tif ( \"form\" in elem ) {\n\n\t\t\t// Check for inherited disabledness on relevant non-disabled elements:\n\t\t\t// * listed form-associated elements in a disabled fieldset\n\t\t\t//   https://html.spec.whatwg.org/multipage/forms.html#category-listed\n\t\t\t//   https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled\n\t\t\t// * option elements in a disabled optgroup\n\t\t\t//   https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled\n\t\t\t// All such elements have a \"form\" property.\n\t\t\tif ( elem.parentNode && elem.disabled === false ) {\n\n\t\t\t\t// Option elements defer to a parent optgroup if present\n\t\t\t\tif ( \"label\" in elem ) {\n\t\t\t\t\tif ( \"label\" in elem.parentNode ) {\n\t\t\t\t\t\treturn elem.parentNode.disabled === disabled;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn elem.disabled === disabled;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Support: IE 6 - 11+\n\t\t\t\t// Use the isDisabled shortcut property to check for disabled fieldset ancestors\n\t\t\t\treturn elem.isDisabled === disabled ||\n\n\t\t\t\t\t// Where there is no isDisabled, check manually\n\t\t\t\t\telem.isDisabled !== !disabled &&\n\t\t\t\t\t\tinDisabledFieldset( elem ) === disabled;\n\t\t\t}\n\n\t\t\treturn elem.disabled === disabled;\n\n\t\t// Try to winnow out elements that can't be disabled before trusting the disabled property.\n\t\t// Some victims get caught in our net (label, legend, menu, track), but it shouldn't\n\t\t// even exist on them, let alone have a boolean value.\n\t\t} else if ( \"label\" in elem ) {\n\t\t\treturn elem.disabled === disabled;\n\t\t}\n\n\t\t// Remaining elements are neither :enabled nor :disabled\n\t\treturn false;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for positionals\n * @param {Function} fn\n */\nfunction createPositionalPseudo( fn ) {\n\treturn markFunction( function( argument ) {\n\t\targument = +argument;\n\t\treturn markFunction( function( seed, matches ) {\n\t\t\tvar j,\n\t\t\t\tmatchIndexes = fn( [], seed.length, argument ),\n\t\t\t\ti = matchIndexes.length;\n\n\t\t\t// Match elements found at the specified indexes\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( seed[ ( j = matchIndexes[ i ] ) ] ) {\n\t\t\t\t\tseed[ j ] = !( matches[ j ] = seed[ j ] );\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t} );\n}\n\n/**\n * Checks a node for validity as a jQuery selector context\n * @param {Element|Object=} context\n * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value\n */\nfunction testContext( context ) {\n\treturn context && typeof context.getElementsByTagName !== \"undefined\" && context;\n}\n\n/**\n * Sets document-related variables once based on the current document\n * @param {Element|Object} [node] An element or document object to use to set the document\n * @returns {Object} Returns the current document\n */\nfunction setDocument( node ) {\n\tvar subWindow,\n\t\tdoc = node ? node.ownerDocument || node : preferredDoc;\n\n\t// Return early if doc is invalid or already selected\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) {\n\t\treturn document;\n\t}\n\n\t// Update global variables\n\tdocument = doc;\n\tdocumentElement = document.documentElement;\n\tdocumentIsHTML = !jQuery.isXMLDoc( document );\n\n\t// Support: iOS 7 only, IE 9 - 11+\n\t// Older browsers didn't support unprefixed `matches`.\n\tmatches = documentElement.matches ||\n\t\tdocumentElement.webkitMatchesSelector ||\n\t\tdocumentElement.msMatchesSelector;\n\n\t// Support: IE 9 - 11+, Edge 12 - 18+\n\t// Accessing iframe documents after unload throws \"permission denied\" errors\n\t// (see trac-13936).\n\t// Limit the fix to IE & Edge Legacy; despite Edge 15+ implementing `matches`,\n\t// all IE 9+ and Edge Legacy versions implement `msMatchesSelector` as well.\n\tif ( documentElement.msMatchesSelector &&\n\n\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t// two documents; shallow comparisons work.\n\t\t// eslint-disable-next-line eqeqeq\n\t\tpreferredDoc != document &&\n\t\t( subWindow = document.defaultView ) && subWindow.top !== subWindow ) {\n\n\t\t// Support: IE 9 - 11+, Edge 12 - 18+\n\t\tsubWindow.addEventListener( \"unload\", unloadHandler );\n\t}\n\n\t// Support: IE <10\n\t// Check if getElementById returns elements by name\n\t// The broken getElementById methods don't pick up programmatically-set names,\n\t// so use a roundabout getElementsByName test\n\tsupport.getById = assert( function( el ) {\n\t\tdocumentElement.appendChild( el ).id = jQuery.expando;\n\t\treturn !document.getElementsByName ||\n\t\t\t!document.getElementsByName( jQuery.expando ).length;\n\t} );\n\n\t// Support: IE 9 only\n\t// Check to see if it's possible to do matchesSelector\n\t// on a disconnected node.\n\tsupport.disconnectedMatch = assert( function( el ) {\n\t\treturn matches.call( el, \"*\" );\n\t} );\n\n\t// Support: IE 9 - 11+, Edge 12 - 18+\n\t// IE/Edge don't support the :scope pseudo-class.\n\tsupport.scope = assert( function() {\n\t\treturn document.querySelectorAll( \":scope\" );\n\t} );\n\n\t// Support: Chrome 105 - 111 only, Safari 15.4 - 16.3 only\n\t// Make sure the `:has()` argument is parsed unforgivingly.\n\t// We include `*` in the test to detect buggy implementations that are\n\t// _selectively_ forgiving (specifically when the list includes at least\n\t// one valid selector).\n\t// Note that we treat complete lack of support for `:has()` as if it were\n\t// spec-compliant support, which is fine because use of `:has()` in such\n\t// environments will fail in the qSA path and fall back to jQuery traversal\n\t// anyway.\n\tsupport.cssHas = assert( function() {\n\t\ttry {\n\t\t\tdocument.querySelector( \":has(*,:jqfake)\" );\n\t\t\treturn false;\n\t\t} catch ( e ) {\n\t\t\treturn true;\n\t\t}\n\t} );\n\n\t// ID filter and find\n\tif ( support.getById ) {\n\t\tExpr.filter.ID = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn elem.getAttribute( \"id\" ) === attrId;\n\t\t\t};\n\t\t};\n\t\tExpr.find.ID = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar elem = context.getElementById( id );\n\t\t\t\treturn elem ? [ elem ] : [];\n\t\t\t}\n\t\t};\n\t} else {\n\t\tExpr.filter.ID =  function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\tvar node = typeof elem.getAttributeNode !== \"undefined\" &&\n\t\t\t\t\telem.getAttributeNode( \"id\" );\n\t\t\t\treturn node && node.value === attrId;\n\t\t\t};\n\t\t};\n\n\t\t// Support: IE 6 - 7 only\n\t\t// getElementById is not reliable as a find shortcut\n\t\tExpr.find.ID = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar node, i, elems,\n\t\t\t\t\telem = context.getElementById( id );\n\n\t\t\t\tif ( elem ) {\n\n\t\t\t\t\t// Verify the id attribute\n\t\t\t\t\tnode = elem.getAttributeNode( \"id\" );\n\t\t\t\t\tif ( node && node.value === id ) {\n\t\t\t\t\t\treturn [ elem ];\n\t\t\t\t\t}\n\n\t\t\t\t\t// Fall back on getElementsByName\n\t\t\t\t\telems = context.getElementsByName( id );\n\t\t\t\t\ti = 0;\n\t\t\t\t\twhile ( ( elem = elems[ i++ ] ) ) {\n\t\t\t\t\t\tnode = elem.getAttributeNode( \"id\" );\n\t\t\t\t\t\tif ( node && node.value === id ) {\n\t\t\t\t\t\t\treturn [ elem ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn [];\n\t\t\t}\n\t\t};\n\t}\n\n\t// Tag\n\tExpr.find.TAG = function( tag, context ) {\n\t\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\t\treturn context.getElementsByTagName( tag );\n\n\t\t// DocumentFragment nodes don't have gEBTN\n\t\t} else {\n\t\t\treturn context.querySelectorAll( tag );\n\t\t}\n\t};\n\n\t// Class\n\tExpr.find.CLASS = function( className, context ) {\n\t\tif ( typeof context.getElementsByClassName !== \"undefined\" && documentIsHTML ) {\n\t\t\treturn context.getElementsByClassName( className );\n\t\t}\n\t};\n\n\t/* QSA/matchesSelector\n\t---------------------------------------------------------------------- */\n\n\t// QSA and matchesSelector support\n\n\trbuggyQSA = [];\n\n\t// Build QSA regex\n\t// Regex strategy adopted from Diego Perini\n\tassert( function( el ) {\n\n\t\tvar input;\n\n\t\tdocumentElement.appendChild( el ).innerHTML =\n\t\t\t\"<a id='\" + expando + \"' href='' disabled='disabled'></a>\" +\n\t\t\t\"<select id='\" + expando + \"-\\r\\\\' disabled='disabled'>\" +\n\t\t\t\"<option selected=''></option></select>\";\n\n\t\t// Support: iOS <=7 - 8 only\n\t\t// Boolean attributes and \"value\" are not treated correctly in some XML documents\n\t\tif ( !el.querySelectorAll( \"[selected]\" ).length ) {\n\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*(?:value|\" + booleans + \")\" );\n\t\t}\n\n\t\t// Support: iOS <=7 - 8 only\n\t\tif ( !el.querySelectorAll( \"[id~=\" + expando + \"-]\" ).length ) {\n\t\t\trbuggyQSA.push( \"~=\" );\n\t\t}\n\n\t\t// Support: iOS 8 only\n\t\t// https://bugs.webkit.org/show_bug.cgi?id=136851\n\t\t// In-page `selector#id sibling-combinator selector` fails\n\t\tif ( !el.querySelectorAll( \"a#\" + expando + \"+*\" ).length ) {\n\t\t\trbuggyQSA.push( \".#.+[+~]\" );\n\t\t}\n\n\t\t// Support: Chrome <=105+, Firefox <=104+, Safari <=15.4+\n\t\t// In some of the document kinds, these selectors wouldn't work natively.\n\t\t// This is probably OK but for backwards compatibility we want to maintain\n\t\t// handling them through jQuery traversal in jQuery 3.x.\n\t\tif ( !el.querySelectorAll( \":checked\" ).length ) {\n\t\t\trbuggyQSA.push( \":checked\" );\n\t\t}\n\n\t\t// Support: Windows 8 Native Apps\n\t\t// The type and name attributes are restricted during .innerHTML assignment\n\t\tinput = document.createElement( \"input\" );\n\t\tinput.setAttribute( \"type\", \"hidden\" );\n\t\tel.appendChild( input ).setAttribute( \"name\", \"D\" );\n\n\t\t// Support: IE 9 - 11+\n\t\t// IE's :disabled selector does not pick up the children of disabled fieldsets\n\t\t// Support: Chrome <=105+, Firefox <=104+, Safari <=15.4+\n\t\t// In some of the document kinds, these selectors wouldn't work natively.\n\t\t// This is probably OK but for backwards compatibility we want to maintain\n\t\t// handling them through jQuery traversal in jQuery 3.x.\n\t\tdocumentElement.appendChild( el ).disabled = true;\n\t\tif ( el.querySelectorAll( \":disabled\" ).length !== 2 ) {\n\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t}\n\n\t\t// Support: IE 11+, Edge 15 - 18+\n\t\t// IE 11/Edge don't find elements on a `[name='']` query in some cases.\n\t\t// Adding a temporary attribute to the document before the selection works\n\t\t// around the issue.\n\t\t// Interestingly, IE 10 & older don't seem to have the issue.\n\t\tinput = document.createElement( \"input\" );\n\t\tinput.setAttribute( \"name\", \"\" );\n\t\tel.appendChild( input );\n\t\tif ( !el.querySelectorAll( \"[name='']\" ).length ) {\n\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*name\" + whitespace + \"*=\" +\n\t\t\t\twhitespace + \"*(?:''|\\\"\\\")\" );\n\t\t}\n\t} );\n\n\tif ( !support.cssHas ) {\n\n\t\t// Support: Chrome 105 - 110+, Safari 15.4 - 16.3+\n\t\t// Our regular `try-catch` mechanism fails to detect natively-unsupported\n\t\t// pseudo-classes inside `:has()` (such as `:has(:contains(\"Foo\"))`)\n\t\t// in browsers that parse the `:has()` argument as a forgiving selector list.\n\t\t// https://drafts.csswg.org/selectors/#relational now requires the argument\n\t\t// to be parsed unforgivingly, but browsers have not yet fully adjusted.\n\t\trbuggyQSA.push( \":has\" );\n\t}\n\n\trbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( \"|\" ) );\n\n\t/* Sorting\n\t---------------------------------------------------------------------- */\n\n\t// Document order sorting\n\tsortOrder = function( a, b ) {\n\n\t\t// Flag for duplicate removal\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\t// Sort on method existence if only one input has compareDocumentPosition\n\t\tvar compare = !a.compareDocumentPosition - !b.compareDocumentPosition;\n\t\tif ( compare ) {\n\t\t\treturn compare;\n\t\t}\n\n\t\t// Calculate position if both inputs belong to the same document\n\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t// two documents; shallow comparisons work.\n\t\t// eslint-disable-next-line eqeqeq\n\t\tcompare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ?\n\t\t\ta.compareDocumentPosition( b ) :\n\n\t\t\t// Otherwise we know they are disconnected\n\t\t\t1;\n\n\t\t// Disconnected nodes\n\t\tif ( compare & 1 ||\n\t\t\t( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) {\n\n\t\t\t// Choose the first element that is related to our preferred document\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\tif ( a === document || a.ownerDocument == preferredDoc &&\n\t\t\t\tfind.contains( preferredDoc, a ) ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\tif ( b === document || b.ownerDocument == preferredDoc &&\n\t\t\t\tfind.contains( preferredDoc, b ) ) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\t// Maintain original order\n\t\t\treturn sortInput ?\n\t\t\t\t( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :\n\t\t\t\t0;\n\t\t}\n\n\t\treturn compare & 4 ? -1 : 1;\n\t};\n\n\treturn document;\n}\n\nfind.matches = function( expr, elements ) {\n\treturn find( expr, null, null, elements );\n};\n\nfind.matchesSelector = function( elem, expr ) {\n\tsetDocument( elem );\n\n\tif ( documentIsHTML &&\n\t\t!nonnativeSelectorCache[ expr + \" \" ] &&\n\t\t( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {\n\n\t\ttry {\n\t\t\tvar ret = matches.call( elem, expr );\n\n\t\t\t// IE 9's matchesSelector returns false on disconnected nodes\n\t\t\tif ( ret || support.disconnectedMatch ||\n\n\t\t\t\t\t// As well, disconnected nodes are said to be in a document\n\t\t\t\t\t// fragment in IE 9\n\t\t\t\t\telem.document && elem.document.nodeType !== 11 ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t} catch ( e ) {\n\t\t\tnonnativeSelectorCache( expr, true );\n\t\t}\n\t}\n\n\treturn find( expr, document, null, [ elem ] ).length > 0;\n};\n\nfind.contains = function( context, elem ) {\n\n\t// Set document vars if needed\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( ( context.ownerDocument || context ) != document ) {\n\t\tsetDocument( context );\n\t}\n\treturn jQuery.contains( context, elem );\n};\n\n\nfind.attr = function( elem, name ) {\n\n\t// Set document vars if needed\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( ( elem.ownerDocument || elem ) != document ) {\n\t\tsetDocument( elem );\n\t}\n\n\tvar fn = Expr.attrHandle[ name.toLowerCase() ],\n\n\t\t// Don't get fooled by Object.prototype properties (see trac-13807)\n\t\tval = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?\n\t\t\tfn( elem, name, !documentIsHTML ) :\n\t\t\tundefined;\n\n\tif ( val !== undefined ) {\n\t\treturn val;\n\t}\n\n\treturn elem.getAttribute( name );\n};\n\nfind.error = function( msg ) {\n\tthrow new Error( \"Syntax error, unrecognized expression: \" + msg );\n};\n\n/**\n * Document sorting and removing duplicates\n * @param {ArrayLike} results\n */\njQuery.uniqueSort = function( results ) {\n\tvar elem,\n\t\tduplicates = [],\n\t\tj = 0,\n\t\ti = 0;\n\n\t// Unless we *know* we can detect duplicates, assume their presence\n\t//\n\t// Support: Android <=4.0+\n\t// Testing for detecting duplicates is unpredictable so instead assume we can't\n\t// depend on duplicate detection in all browsers without a stable sort.\n\thasDuplicate = !support.sortStable;\n\tsortInput = !support.sortStable && slice.call( results, 0 );\n\tsort.call( results, sortOrder );\n\n\tif ( hasDuplicate ) {\n\t\twhile ( ( elem = results[ i++ ] ) ) {\n\t\t\tif ( elem === results[ i ] ) {\n\t\t\t\tj = duplicates.push( i );\n\t\t\t}\n\t\t}\n\t\twhile ( j-- ) {\n\t\t\tsplice.call( results, duplicates[ j ], 1 );\n\t\t}\n\t}\n\n\t// Clear input after sorting to release objects\n\t// See https://github.com/jquery/sizzle/pull/225\n\tsortInput = null;\n\n\treturn results;\n};\n\njQuery.fn.uniqueSort = function() {\n\treturn this.pushStack( jQuery.uniqueSort( slice.apply( this ) ) );\n};\n\nExpr = jQuery.expr = {\n\n\t// Can be adjusted by the user\n\tcacheLength: 50,\n\n\tcreatePseudo: markFunction,\n\n\tmatch: matchExpr,\n\n\tattrHandle: {},\n\n\tfind: {},\n\n\trelative: {\n\t\t\">\": { dir: \"parentNode\", first: true },\n\t\t\" \": { dir: \"parentNode\" },\n\t\t\"+\": { dir: \"previousSibling\", first: true },\n\t\t\"~\": { dir: \"previousSibling\" }\n\t},\n\n\tpreFilter: {\n\t\tATTR: function( match ) {\n\t\t\tmatch[ 1 ] = match[ 1 ].replace( runescape, funescape );\n\n\t\t\t// Move the given value to match[3] whether quoted or unquoted\n\t\t\tmatch[ 3 ] = ( match[ 3 ] || match[ 4 ] || match[ 5 ] || \"\" )\n\t\t\t\t.replace( runescape, funescape );\n\n\t\t\tif ( match[ 2 ] === \"~=\" ) {\n\t\t\t\tmatch[ 3 ] = \" \" + match[ 3 ] + \" \";\n\t\t\t}\n\n\t\t\treturn match.slice( 0, 4 );\n\t\t},\n\n\t\tCHILD: function( match ) {\n\n\t\t\t/* matches from matchExpr[\"CHILD\"]\n\t\t\t\t1 type (only|nth|...)\n\t\t\t\t2 what (child|of-type)\n\t\t\t\t3 argument (even|odd|\\d*|\\d*n([+-]\\d+)?|...)\n\t\t\t\t4 xn-component of xn+y argument ([+-]?\\d*n|)\n\t\t\t\t5 sign of xn-component\n\t\t\t\t6 x of xn-component\n\t\t\t\t7 sign of y-component\n\t\t\t\t8 y of y-component\n\t\t\t*/\n\t\t\tmatch[ 1 ] = match[ 1 ].toLowerCase();\n\n\t\t\tif ( match[ 1 ].slice( 0, 3 ) === \"nth\" ) {\n\n\t\t\t\t// nth-* requires argument\n\t\t\t\tif ( !match[ 3 ] ) {\n\t\t\t\t\tfind.error( match[ 0 ] );\n\t\t\t\t}\n\n\t\t\t\t// numeric x and y parameters for Expr.filter.CHILD\n\t\t\t\t// remember that false/true cast respectively to 0/1\n\t\t\t\tmatch[ 4 ] = +( match[ 4 ] ?\n\t\t\t\t\tmatch[ 5 ] + ( match[ 6 ] || 1 ) :\n\t\t\t\t\t2 * ( match[ 3 ] === \"even\" || match[ 3 ] === \"odd\" )\n\t\t\t\t);\n\t\t\t\tmatch[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === \"odd\" );\n\n\t\t\t// other types prohibit arguments\n\t\t\t} else if ( match[ 3 ] ) {\n\t\t\t\tfind.error( match[ 0 ] );\n\t\t\t}\n\n\t\t\treturn match;\n\t\t},\n\n\t\tPSEUDO: function( match ) {\n\t\t\tvar excess,\n\t\t\t\tunquoted = !match[ 6 ] && match[ 2 ];\n\n\t\t\tif ( matchExpr.CHILD.test( match[ 0 ] ) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Accept quoted arguments as-is\n\t\t\tif ( match[ 3 ] ) {\n\t\t\t\tmatch[ 2 ] = match[ 4 ] || match[ 5 ] || \"\";\n\n\t\t\t// Strip excess characters from unquoted arguments\n\t\t\t} else if ( unquoted && rpseudo.test( unquoted ) &&\n\n\t\t\t\t// Get excess from tokenize (recursively)\n\t\t\t\t( excess = tokenize( unquoted, true ) ) &&\n\n\t\t\t\t// advance to the next closing parenthesis\n\t\t\t\t( excess = unquoted.indexOf( \")\", unquoted.length - excess ) - unquoted.length ) ) {\n\n\t\t\t\t// excess is a negative index\n\t\t\t\tmatch[ 0 ] = match[ 0 ].slice( 0, excess );\n\t\t\t\tmatch[ 2 ] = unquoted.slice( 0, excess );\n\t\t\t}\n\n\t\t\t// Return only captures needed by the pseudo filter method (type and argument)\n\t\t\treturn match.slice( 0, 3 );\n\t\t}\n\t},\n\n\tfilter: {\n\n\t\tTAG: function( nodeNameSelector ) {\n\t\t\tvar expectedNodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn nodeNameSelector === \"*\" ?\n\t\t\t\tfunction() {\n\t\t\t\t\treturn true;\n\t\t\t\t} :\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn nodeName( elem, expectedNodeName );\n\t\t\t\t};\n\t\t},\n\n\t\tCLASS: function( className ) {\n\t\t\tvar pattern = classCache[ className + \" \" ];\n\n\t\t\treturn pattern ||\n\t\t\t\t( pattern = new RegExp( \"(^|\" + whitespace + \")\" + className +\n\t\t\t\t\t\"(\" + whitespace + \"|$)\" ) ) &&\n\t\t\t\tclassCache( className, function( elem ) {\n\t\t\t\t\treturn pattern.test(\n\t\t\t\t\t\ttypeof elem.className === \"string\" && elem.className ||\n\t\t\t\t\t\t\ttypeof elem.getAttribute !== \"undefined\" &&\n\t\t\t\t\t\t\t\telem.getAttribute( \"class\" ) ||\n\t\t\t\t\t\t\t\"\"\n\t\t\t\t\t);\n\t\t\t\t} );\n\t\t},\n\n\t\tATTR: function( name, operator, check ) {\n\t\t\treturn function( elem ) {\n\t\t\t\tvar result = find.attr( elem, name );\n\n\t\t\t\tif ( result == null ) {\n\t\t\t\t\treturn operator === \"!=\";\n\t\t\t\t}\n\t\t\t\tif ( !operator ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tresult += \"\";\n\n\t\t\t\tif ( operator === \"=\" ) {\n\t\t\t\t\treturn result === check;\n\t\t\t\t}\n\t\t\t\tif ( operator === \"!=\" ) {\n\t\t\t\t\treturn result !== check;\n\t\t\t\t}\n\t\t\t\tif ( operator === \"^=\" ) {\n\t\t\t\t\treturn check && result.indexOf( check ) === 0;\n\t\t\t\t}\n\t\t\t\tif ( operator === \"*=\" ) {\n\t\t\t\t\treturn check && result.indexOf( check ) > -1;\n\t\t\t\t}\n\t\t\t\tif ( operator === \"$=\" ) {\n\t\t\t\t\treturn check && result.slice( -check.length ) === check;\n\t\t\t\t}\n\t\t\t\tif ( operator === \"~=\" ) {\n\t\t\t\t\treturn ( \" \" + result.replace( rwhitespace, \" \" ) + \" \" )\n\t\t\t\t\t\t.indexOf( check ) > -1;\n\t\t\t\t}\n\t\t\t\tif ( operator === \"|=\" ) {\n\t\t\t\t\treturn result === check || result.slice( 0, check.length + 1 ) === check + \"-\";\n\t\t\t\t}\n\n\t\t\t\treturn false;\n\t\t\t};\n\t\t},\n\n\t\tCHILD: function( type, what, _argument, first, last ) {\n\t\t\tvar simple = type.slice( 0, 3 ) !== \"nth\",\n\t\t\t\tforward = type.slice( -4 ) !== \"last\",\n\t\t\t\tofType = what === \"of-type\";\n\n\t\t\treturn first === 1 && last === 0 ?\n\n\t\t\t\t// Shortcut for :nth-*(n)\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn !!elem.parentNode;\n\t\t\t\t} :\n\n\t\t\t\tfunction( elem, _context, xml ) {\n\t\t\t\t\tvar cache, outerCache, node, nodeIndex, start,\n\t\t\t\t\t\tdir = simple !== forward ? \"nextSibling\" : \"previousSibling\",\n\t\t\t\t\t\tparent = elem.parentNode,\n\t\t\t\t\t\tname = ofType && elem.nodeName.toLowerCase(),\n\t\t\t\t\t\tuseCache = !xml && !ofType,\n\t\t\t\t\t\tdiff = false;\n\n\t\t\t\t\tif ( parent ) {\n\n\t\t\t\t\t\t// :(first|last|only)-(child|of-type)\n\t\t\t\t\t\tif ( simple ) {\n\t\t\t\t\t\t\twhile ( dir ) {\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\twhile ( ( node = node[ dir ] ) ) {\n\t\t\t\t\t\t\t\t\tif ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnodeName( node, name ) :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) {\n\n\t\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// Reverse direction for :only-* (if we haven't yet done so)\n\t\t\t\t\t\t\t\tstart = dir = type === \"only\" && !start && \"nextSibling\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstart = [ forward ? parent.firstChild : parent.lastChild ];\n\n\t\t\t\t\t\t// non-xml :nth-child(...) stores cache data on `parent`\n\t\t\t\t\t\tif ( forward && useCache ) {\n\n\t\t\t\t\t\t\t// Seek `elem` from a previously-cached index\n\t\t\t\t\t\t\touterCache = parent[ expando ] || ( parent[ expando ] = {} );\n\t\t\t\t\t\t\tcache = outerCache[ type ] || [];\n\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\tdiff = nodeIndex && cache[ 2 ];\n\t\t\t\t\t\t\tnode = nodeIndex && parent.childNodes[ nodeIndex ];\n\n\t\t\t\t\t\t\twhile ( ( node = ++nodeIndex && node && node[ dir ] ||\n\n\t\t\t\t\t\t\t\t// Fallback to seeking `elem` from the start\n\t\t\t\t\t\t\t\t( diff = nodeIndex = 0 ) || start.pop() ) ) {\n\n\t\t\t\t\t\t\t\t// When found, cache indexes on `parent` and break\n\t\t\t\t\t\t\t\tif ( node.nodeType === 1 && ++diff && node === elem ) {\n\t\t\t\t\t\t\t\t\touterCache[ type ] = [ dirruns, nodeIndex, diff ];\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Use previously-cached element index if available\n\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\touterCache = elem[ expando ] || ( elem[ expando ] = {} );\n\t\t\t\t\t\t\t\tcache = outerCache[ type ] || [];\n\t\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\t\tdiff = nodeIndex;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// xml :nth-child(...)\n\t\t\t\t\t\t\t// or :nth-last-child(...) or :nth(-last)?-of-type(...)\n\t\t\t\t\t\t\tif ( diff === false ) {\n\n\t\t\t\t\t\t\t\t// Use the same loop as above to seek `elem` from the start\n\t\t\t\t\t\t\t\twhile ( ( node = ++nodeIndex && node && node[ dir ] ||\n\t\t\t\t\t\t\t\t\t( diff = nodeIndex = 0 ) || start.pop() ) ) {\n\n\t\t\t\t\t\t\t\t\tif ( ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnodeName( node, name ) :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) &&\n\t\t\t\t\t\t\t\t\t\t++diff ) {\n\n\t\t\t\t\t\t\t\t\t\t// Cache the index of each encountered element\n\t\t\t\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t\t\t\touterCache = node[ expando ] ||\n\t\t\t\t\t\t\t\t\t\t\t\t( node[ expando ] = {} );\n\t\t\t\t\t\t\t\t\t\t\touterCache[ type ] = [ dirruns, diff ];\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tif ( node === elem ) {\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Incorporate the offset, then check against cycle size\n\t\t\t\t\t\tdiff -= last;\n\t\t\t\t\t\treturn diff === first || ( diff % first === 0 && diff / first >= 0 );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t},\n\n\t\tPSEUDO: function( pseudo, argument ) {\n\n\t\t\t// pseudo-class names are case-insensitive\n\t\t\t// https://www.w3.org/TR/selectors/#pseudo-classes\n\t\t\t// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\n\t\t\t// Remember that setFilters inherits from pseudos\n\t\t\tvar args,\n\t\t\t\tfn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||\n\t\t\t\t\tfind.error( \"unsupported pseudo: \" + pseudo );\n\n\t\t\t// The user may use createPseudo to indicate that\n\t\t\t// arguments are needed to create the filter function\n\t\t\t// just as jQuery does\n\t\t\tif ( fn[ expando ] ) {\n\t\t\t\treturn fn( argument );\n\t\t\t}\n\n\t\t\t// But maintain support for old signatures\n\t\t\tif ( fn.length > 1 ) {\n\t\t\t\targs = [ pseudo, pseudo, \"\", argument ];\n\t\t\t\treturn Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?\n\t\t\t\t\tmarkFunction( function( seed, matches ) {\n\t\t\t\t\t\tvar idx,\n\t\t\t\t\t\t\tmatched = fn( seed, argument ),\n\t\t\t\t\t\t\ti = matched.length;\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tidx = indexOf.call( seed, matched[ i ] );\n\t\t\t\t\t\t\tseed[ idx ] = !( matches[ idx ] = matched[ i ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t} ) :\n\t\t\t\t\tfunction( elem ) {\n\t\t\t\t\t\treturn fn( elem, 0, args );\n\t\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn fn;\n\t\t}\n\t},\n\n\tpseudos: {\n\n\t\t// Potentially complex pseudos\n\t\tnot: markFunction( function( selector ) {\n\n\t\t\t// Trim the selector passed to compile\n\t\t\t// to avoid treating leading and trailing\n\t\t\t// spaces as combinators\n\t\t\tvar input = [],\n\t\t\t\tresults = [],\n\t\t\t\tmatcher = compile( selector.replace( rtrimCSS, \"$1\" ) );\n\n\t\t\treturn matcher[ expando ] ?\n\t\t\t\tmarkFunction( function( seed, matches, _context, xml ) {\n\t\t\t\t\tvar elem,\n\t\t\t\t\t\tunmatched = matcher( seed, null, xml, [] ),\n\t\t\t\t\t\ti = seed.length;\n\n\t\t\t\t\t// Match elements unmatched by `matcher`\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( ( elem = unmatched[ i ] ) ) {\n\t\t\t\t\t\t\tseed[ i ] = !( matches[ i ] = elem );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} ) :\n\t\t\t\tfunction( elem, _context, xml ) {\n\t\t\t\t\tinput[ 0 ] = elem;\n\t\t\t\t\tmatcher( input, null, xml, results );\n\n\t\t\t\t\t// Don't keep the element\n\t\t\t\t\t// (see https://github.com/jquery/sizzle/issues/299)\n\t\t\t\t\tinput[ 0 ] = null;\n\t\t\t\t\treturn !results.pop();\n\t\t\t\t};\n\t\t} ),\n\n\t\thas: markFunction( function( selector ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn find( selector, elem ).length > 0;\n\t\t\t};\n\t\t} ),\n\n\t\tcontains: markFunction( function( text ) {\n\t\t\ttext = text.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn ( elem.textContent || jQuery.text( elem ) ).indexOf( text ) > -1;\n\t\t\t};\n\t\t} ),\n\n\t\t// \"Whether an element is represented by a :lang() selector\n\t\t// is based solely on the element's language value\n\t\t// being equal to the identifier C,\n\t\t// or beginning with the identifier C immediately followed by \"-\".\n\t\t// The matching of C against the element's language value is performed case-insensitively.\n\t\t// The identifier C does not have to be a valid language name.\"\n\t\t// https://www.w3.org/TR/selectors/#lang-pseudo\n\t\tlang: markFunction( function( lang ) {\n\n\t\t\t// lang value must be a valid identifier\n\t\t\tif ( !ridentifier.test( lang || \"\" ) ) {\n\t\t\t\tfind.error( \"unsupported lang: \" + lang );\n\t\t\t}\n\t\t\tlang = lang.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn function( elem ) {\n\t\t\t\tvar elemLang;\n\t\t\t\tdo {\n\t\t\t\t\tif ( ( elemLang = documentIsHTML ?\n\t\t\t\t\t\telem.lang :\n\t\t\t\t\t\telem.getAttribute( \"xml:lang\" ) || elem.getAttribute( \"lang\" ) ) ) {\n\n\t\t\t\t\t\telemLang = elemLang.toLowerCase();\n\t\t\t\t\t\treturn elemLang === lang || elemLang.indexOf( lang + \"-\" ) === 0;\n\t\t\t\t\t}\n\t\t\t\t} while ( ( elem = elem.parentNode ) && elem.nodeType === 1 );\n\t\t\t\treturn false;\n\t\t\t};\n\t\t} ),\n\n\t\t// Miscellaneous\n\t\ttarget: function( elem ) {\n\t\t\tvar hash = window.location && window.location.hash;\n\t\t\treturn hash && hash.slice( 1 ) === elem.id;\n\t\t},\n\n\t\troot: function( elem ) {\n\t\t\treturn elem === documentElement;\n\t\t},\n\n\t\tfocus: function( elem ) {\n\t\t\treturn elem === safeActiveElement() &&\n\t\t\t\tdocument.hasFocus() &&\n\t\t\t\t!!( elem.type || elem.href || ~elem.tabIndex );\n\t\t},\n\n\t\t// Boolean properties\n\t\tenabled: createDisabledPseudo( false ),\n\t\tdisabled: createDisabledPseudo( true ),\n\n\t\tchecked: function( elem ) {\n\n\t\t\t// In CSS3, :checked should return both checked and selected elements\n\t\t\t// https://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\treturn ( nodeName( elem, \"input\" ) && !!elem.checked ) ||\n\t\t\t\t( nodeName( elem, \"option\" ) && !!elem.selected );\n\t\t},\n\n\t\tselected: function( elem ) {\n\n\t\t\t// Support: IE <=11+\n\t\t\t// Accessing the selectedIndex property\n\t\t\t// forces the browser to treat the default option as\n\t\t\t// selected when in an optgroup.\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\t// eslint-disable-next-line no-unused-expressions\n\t\t\t\telem.parentNode.selectedIndex;\n\t\t\t}\n\n\t\t\treturn elem.selected === true;\n\t\t},\n\n\t\t// Contents\n\t\tempty: function( elem ) {\n\n\t\t\t// https://www.w3.org/TR/selectors/#empty-pseudo\n\t\t\t// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),\n\t\t\t//   but not by others (comment: 8; processing instruction: 7; etc.)\n\t\t\t// nodeType < 6 works because attributes (2) do not appear as children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tif ( elem.nodeType < 6 ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\tparent: function( elem ) {\n\t\t\treturn !Expr.pseudos.empty( elem );\n\t\t},\n\n\t\t// Element/input types\n\t\theader: function( elem ) {\n\t\t\treturn rheader.test( elem.nodeName );\n\t\t},\n\n\t\tinput: function( elem ) {\n\t\t\treturn rinputs.test( elem.nodeName );\n\t\t},\n\n\t\tbutton: function( elem ) {\n\t\t\treturn nodeName( elem, \"input\" ) && elem.type === \"button\" ||\n\t\t\t\tnodeName( elem, \"button\" );\n\t\t},\n\n\t\ttext: function( elem ) {\n\t\t\tvar attr;\n\t\t\treturn nodeName( elem, \"input\" ) && elem.type === \"text\" &&\n\n\t\t\t\t// Support: IE <10 only\n\t\t\t\t// New HTML5 attribute values (e.g., \"search\") appear\n\t\t\t\t// with elem.type === \"text\"\n\t\t\t\t( ( attr = elem.getAttribute( \"type\" ) ) == null ||\n\t\t\t\t\tattr.toLowerCase() === \"text\" );\n\t\t},\n\n\t\t// Position-in-collection\n\t\tfirst: createPositionalPseudo( function() {\n\t\t\treturn [ 0 ];\n\t\t} ),\n\n\t\tlast: createPositionalPseudo( function( _matchIndexes, length ) {\n\t\t\treturn [ length - 1 ];\n\t\t} ),\n\n\t\teq: createPositionalPseudo( function( _matchIndexes, length, argument ) {\n\t\t\treturn [ argument < 0 ? argument + length : argument ];\n\t\t} ),\n\n\t\teven: createPositionalPseudo( function( matchIndexes, length ) {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} ),\n\n\t\todd: createPositionalPseudo( function( matchIndexes, length ) {\n\t\t\tvar i = 1;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} ),\n\n\t\tlt: createPositionalPseudo( function( matchIndexes, length, argument ) {\n\t\t\tvar i;\n\n\t\t\tif ( argument < 0 ) {\n\t\t\t\ti = argument + length;\n\t\t\t} else if ( argument > length ) {\n\t\t\t\ti = length;\n\t\t\t} else {\n\t\t\t\ti = argument;\n\t\t\t}\n\n\t\t\tfor ( ; --i >= 0; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} ),\n\n\t\tgt: createPositionalPseudo( function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; ++i < length; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} )\n\t}\n};\n\nExpr.pseudos.nth = Expr.pseudos.eq;\n\n// Add button/input type pseudos\nfor ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {\n\tExpr.pseudos[ i ] = createInputPseudo( i );\n}\nfor ( i in { submit: true, reset: true } ) {\n\tExpr.pseudos[ i ] = createButtonPseudo( i );\n}\n\n// Easy API for creating new setFilters\nfunction setFilters() {}\nsetFilters.prototype = Expr.filters = Expr.pseudos;\nExpr.setFilters = new setFilters();\n\nfunction tokenize( selector, parseOnly ) {\n\tvar matched, match, tokens, type,\n\t\tsoFar, groups, preFilters,\n\t\tcached = tokenCache[ selector + \" \" ];\n\n\tif ( cached ) {\n\t\treturn parseOnly ? 0 : cached.slice( 0 );\n\t}\n\n\tsoFar = selector;\n\tgroups = [];\n\tpreFilters = Expr.preFilter;\n\n\twhile ( soFar ) {\n\n\t\t// Comma and first run\n\t\tif ( !matched || ( match = rcomma.exec( soFar ) ) ) {\n\t\t\tif ( match ) {\n\n\t\t\t\t// Don't consume trailing commas as valid\n\t\t\t\tsoFar = soFar.slice( match[ 0 ].length ) || soFar;\n\t\t\t}\n\t\t\tgroups.push( ( tokens = [] ) );\n\t\t}\n\n\t\tmatched = false;\n\n\t\t// Combinators\n\t\tif ( ( match = rleadingCombinator.exec( soFar ) ) ) {\n\t\t\tmatched = match.shift();\n\t\t\ttokens.push( {\n\t\t\t\tvalue: matched,\n\n\t\t\t\t// Cast descendant combinators to space\n\t\t\t\ttype: match[ 0 ].replace( rtrimCSS, \" \" )\n\t\t\t} );\n\t\t\tsoFar = soFar.slice( matched.length );\n\t\t}\n\n\t\t// Filters\n\t\tfor ( type in Expr.filter ) {\n\t\t\tif ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] ||\n\t\t\t\t( match = preFilters[ type ]( match ) ) ) ) {\n\t\t\t\tmatched = match.shift();\n\t\t\t\ttokens.push( {\n\t\t\t\t\tvalue: matched,\n\t\t\t\t\ttype: type,\n\t\t\t\t\tmatches: match\n\t\t\t\t} );\n\t\t\t\tsoFar = soFar.slice( matched.length );\n\t\t\t}\n\t\t}\n\n\t\tif ( !matched ) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Return the length of the invalid excess\n\t// if we're just parsing\n\t// Otherwise, throw an error or return tokens\n\tif ( parseOnly ) {\n\t\treturn soFar.length;\n\t}\n\n\treturn soFar ?\n\t\tfind.error( selector ) :\n\n\t\t// Cache the tokens\n\t\ttokenCache( selector, groups ).slice( 0 );\n}\n\nfunction toSelector( tokens ) {\n\tvar i = 0,\n\t\tlen = tokens.length,\n\t\tselector = \"\";\n\tfor ( ; i < len; i++ ) {\n\t\tselector += tokens[ i ].value;\n\t}\n\treturn selector;\n}\n\nfunction addCombinator( matcher, combinator, base ) {\n\tvar dir = combinator.dir,\n\t\tskip = combinator.next,\n\t\tkey = skip || dir,\n\t\tcheckNonElements = base && key === \"parentNode\",\n\t\tdoneName = done++;\n\n\treturn combinator.first ?\n\n\t\t// Check against closest ancestor/preceding element\n\t\tfunction( elem, context, xml ) {\n\t\t\twhile ( ( elem = elem[ dir ] ) ) {\n\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\treturn matcher( elem, context, xml );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t} :\n\n\t\t// Check against all ancestor/preceding elements\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar oldCache, outerCache,\n\t\t\t\tnewCache = [ dirruns, doneName ];\n\n\t\t\t// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching\n\t\t\tif ( xml ) {\n\t\t\t\twhile ( ( elem = elem[ dir ] ) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twhile ( ( elem = elem[ dir ] ) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\touterCache = elem[ expando ] || ( elem[ expando ] = {} );\n\n\t\t\t\t\t\tif ( skip && nodeName( elem, skip ) ) {\n\t\t\t\t\t\t\telem = elem[ dir ] || elem;\n\t\t\t\t\t\t} else if ( ( oldCache = outerCache[ key ] ) &&\n\t\t\t\t\t\t\toldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {\n\n\t\t\t\t\t\t\t// Assign to newCache so results back-propagate to previous elements\n\t\t\t\t\t\t\treturn ( newCache[ 2 ] = oldCache[ 2 ] );\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Reuse newcache so results back-propagate to previous elements\n\t\t\t\t\t\t\touterCache[ key ] = newCache;\n\n\t\t\t\t\t\t\t// A match means we're done; a fail means we have to keep checking\n\t\t\t\t\t\t\tif ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) {\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n}\n\nfunction elementMatcher( matchers ) {\n\treturn matchers.length > 1 ?\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar i = matchers.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( !matchers[ i ]( elem, context, xml ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} :\n\t\tmatchers[ 0 ];\n}\n\nfunction multipleContexts( selector, contexts, results ) {\n\tvar i = 0,\n\t\tlen = contexts.length;\n\tfor ( ; i < len; i++ ) {\n\t\tfind( selector, contexts[ i ], results );\n\t}\n\treturn results;\n}\n\nfunction condense( unmatched, map, filter, context, xml ) {\n\tvar elem,\n\t\tnewUnmatched = [],\n\t\ti = 0,\n\t\tlen = unmatched.length,\n\t\tmapped = map != null;\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( ( elem = unmatched[ i ] ) ) {\n\t\t\tif ( !filter || filter( elem, context, xml ) ) {\n\t\t\t\tnewUnmatched.push( elem );\n\t\t\t\tif ( mapped ) {\n\t\t\t\t\tmap.push( i );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn newUnmatched;\n}\n\nfunction setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {\n\tif ( postFilter && !postFilter[ expando ] ) {\n\t\tpostFilter = setMatcher( postFilter );\n\t}\n\tif ( postFinder && !postFinder[ expando ] ) {\n\t\tpostFinder = setMatcher( postFinder, postSelector );\n\t}\n\treturn markFunction( function( seed, results, context, xml ) {\n\t\tvar temp, i, elem, matcherOut,\n\t\t\tpreMap = [],\n\t\t\tpostMap = [],\n\t\t\tpreexisting = results.length,\n\n\t\t\t// Get initial elements from seed or context\n\t\t\telems = seed ||\n\t\t\t\tmultipleContexts( selector || \"*\",\n\t\t\t\t\tcontext.nodeType ? [ context ] : context, [] ),\n\n\t\t\t// Prefilter to get matcher input, preserving a map for seed-results synchronization\n\t\t\tmatcherIn = preFilter && ( seed || !selector ) ?\n\t\t\t\tcondense( elems, preMap, preFilter, context, xml ) :\n\t\t\t\telems;\n\n\t\tif ( matcher ) {\n\n\t\t\t// If we have a postFinder, or filtered seed, or non-seed postFilter\n\t\t\t// or preexisting results,\n\t\t\tmatcherOut = postFinder || ( seed ? preFilter : preexisting || postFilter ) ?\n\n\t\t\t\t// ...intermediate processing is necessary\n\t\t\t\t[] :\n\n\t\t\t\t// ...otherwise use results directly\n\t\t\t\tresults;\n\n\t\t\t// Find primary matches\n\t\t\tmatcher( matcherIn, matcherOut, context, xml );\n\t\t} else {\n\t\t\tmatcherOut = matcherIn;\n\t\t}\n\n\t\t// Apply postFilter\n\t\tif ( postFilter ) {\n\t\t\ttemp = condense( matcherOut, postMap );\n\t\t\tpostFilter( temp, [], context, xml );\n\n\t\t\t// Un-match failing elements by moving them back to matcherIn\n\t\t\ti = temp.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( ( elem = temp[ i ] ) ) {\n\t\t\t\t\tmatcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( seed ) {\n\t\t\tif ( postFinder || preFilter ) {\n\t\t\t\tif ( postFinder ) {\n\n\t\t\t\t\t// Get the final matcherOut by condensing this intermediate into postFinder contexts\n\t\t\t\t\ttemp = [];\n\t\t\t\t\ti = matcherOut.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( ( elem = matcherOut[ i ] ) ) {\n\n\t\t\t\t\t\t\t// Restore matcherIn since elem is not yet a final match\n\t\t\t\t\t\t\ttemp.push( ( matcherIn[ i ] = elem ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tpostFinder( null, ( matcherOut = [] ), temp, xml );\n\t\t\t\t}\n\n\t\t\t\t// Move matched elements from seed to results to keep them synchronized\n\t\t\t\ti = matcherOut.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tif ( ( elem = matcherOut[ i ] ) &&\n\t\t\t\t\t\t( temp = postFinder ? indexOf.call( seed, elem ) : preMap[ i ] ) > -1 ) {\n\n\t\t\t\t\t\tseed[ temp ] = !( results[ temp ] = elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Add elements to results, through postFinder if defined\n\t\t} else {\n\t\t\tmatcherOut = condense(\n\t\t\t\tmatcherOut === results ?\n\t\t\t\t\tmatcherOut.splice( preexisting, matcherOut.length ) :\n\t\t\t\t\tmatcherOut\n\t\t\t);\n\t\t\tif ( postFinder ) {\n\t\t\t\tpostFinder( null, results, matcherOut, xml );\n\t\t\t} else {\n\t\t\t\tpush.apply( results, matcherOut );\n\t\t\t}\n\t\t}\n\t} );\n}\n\nfunction matcherFromTokens( tokens ) {\n\tvar checkContext, matcher, j,\n\t\tlen = tokens.length,\n\t\tleadingRelative = Expr.relative[ tokens[ 0 ].type ],\n\t\timplicitRelative = leadingRelative || Expr.relative[ \" \" ],\n\t\ti = leadingRelative ? 1 : 0,\n\n\t\t// The foundational matcher ensures that elements are reachable from top-level context(s)\n\t\tmatchContext = addCombinator( function( elem ) {\n\t\t\treturn elem === checkContext;\n\t\t}, implicitRelative, true ),\n\t\tmatchAnyContext = addCombinator( function( elem ) {\n\t\t\treturn indexOf.call( checkContext, elem ) > -1;\n\t\t}, implicitRelative, true ),\n\t\tmatchers = [ function( elem, context, xml ) {\n\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\tvar ret = ( !leadingRelative && ( xml || context != outermostContext ) ) || (\n\t\t\t\t( checkContext = context ).nodeType ?\n\t\t\t\t\tmatchContext( elem, context, xml ) :\n\t\t\t\t\tmatchAnyContext( elem, context, xml ) );\n\n\t\t\t// Avoid hanging onto element\n\t\t\t// (see https://github.com/jquery/sizzle/issues/299)\n\t\t\tcheckContext = null;\n\t\t\treturn ret;\n\t\t} ];\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) {\n\t\t\tmatchers = [ addCombinator( elementMatcher( matchers ), matcher ) ];\n\t\t} else {\n\t\t\tmatcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches );\n\n\t\t\t// Return special upon seeing a positional matcher\n\t\t\tif ( matcher[ expando ] ) {\n\n\t\t\t\t// Find the next relative operator (if any) for proper handling\n\t\t\t\tj = ++i;\n\t\t\t\tfor ( ; j < len; j++ ) {\n\t\t\t\t\tif ( Expr.relative[ tokens[ j ].type ] ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn setMatcher(\n\t\t\t\t\ti > 1 && elementMatcher( matchers ),\n\t\t\t\t\ti > 1 && toSelector(\n\n\t\t\t\t\t\t// If the preceding token was a descendant combinator, insert an implicit any-element `*`\n\t\t\t\t\t\ttokens.slice( 0, i - 1 )\n\t\t\t\t\t\t\t.concat( { value: tokens[ i - 2 ].type === \" \" ? \"*\" : \"\" } )\n\t\t\t\t\t).replace( rtrimCSS, \"$1\" ),\n\t\t\t\t\tmatcher,\n\t\t\t\t\ti < j && matcherFromTokens( tokens.slice( i, j ) ),\n\t\t\t\t\tj < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ),\n\t\t\t\t\tj < len && toSelector( tokens )\n\t\t\t\t);\n\t\t\t}\n\t\t\tmatchers.push( matcher );\n\t\t}\n\t}\n\n\treturn elementMatcher( matchers );\n}\n\nfunction matcherFromGroupMatchers( elementMatchers, setMatchers ) {\n\tvar bySet = setMatchers.length > 0,\n\t\tbyElement = elementMatchers.length > 0,\n\t\tsuperMatcher = function( seed, context, xml, results, outermost ) {\n\t\t\tvar elem, j, matcher,\n\t\t\t\tmatchedCount = 0,\n\t\t\t\ti = \"0\",\n\t\t\t\tunmatched = seed && [],\n\t\t\t\tsetMatched = [],\n\t\t\t\tcontextBackup = outermostContext,\n\n\t\t\t\t// We must always have either seed elements or outermost context\n\t\t\t\telems = seed || byElement && Expr.find.TAG( \"*\", outermost ),\n\n\t\t\t\t// Use integer dirruns iff this is the outermost matcher\n\t\t\t\tdirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ),\n\t\t\t\tlen = elems.length;\n\n\t\t\tif ( outermost ) {\n\n\t\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t\t// two documents; shallow comparisons work.\n\t\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\t\toutermostContext = context == document || context || outermost;\n\t\t\t}\n\n\t\t\t// Add elements passing elementMatchers directly to results\n\t\t\t// Support: iOS <=7 - 9 only\n\t\t\t// Tolerate NodeList properties (IE: \"length\"; Safari: <number>) matching\n\t\t\t// elements by id. (see trac-14142)\n\t\t\tfor ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) {\n\t\t\t\tif ( byElement && elem ) {\n\t\t\t\t\tj = 0;\n\n\t\t\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t\t\t// two documents; shallow comparisons work.\n\t\t\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\t\t\tif ( !context && elem.ownerDocument != document ) {\n\t\t\t\t\t\tsetDocument( elem );\n\t\t\t\t\t\txml = !documentIsHTML;\n\t\t\t\t\t}\n\t\t\t\t\twhile ( ( matcher = elementMatchers[ j++ ] ) ) {\n\t\t\t\t\t\tif ( matcher( elem, context || document, xml ) ) {\n\t\t\t\t\t\t\tpush.call( results, elem );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( outermost ) {\n\t\t\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Track unmatched elements for set filters\n\t\t\t\tif ( bySet ) {\n\n\t\t\t\t\t// They will have gone through all possible matchers\n\t\t\t\t\tif ( ( elem = !matcher && elem ) ) {\n\t\t\t\t\t\tmatchedCount--;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Lengthen the array for every element, matched or not\n\t\t\t\t\tif ( seed ) {\n\t\t\t\t\t\tunmatched.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// `i` is now the count of elements visited above, and adding it to `matchedCount`\n\t\t\t// makes the latter nonnegative.\n\t\t\tmatchedCount += i;\n\n\t\t\t// Apply set filters to unmatched elements\n\t\t\t// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`\n\t\t\t// equals `i`), unless we didn't visit _any_ elements in the above loop because we have\n\t\t\t// no element matchers and no seed.\n\t\t\t// Incrementing an initially-string \"0\" `i` allows `i` to remain a string only in that\n\t\t\t// case, which will result in a \"00\" `matchedCount` that differs from `i` but is also\n\t\t\t// numerically zero.\n\t\t\tif ( bySet && i !== matchedCount ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( ( matcher = setMatchers[ j++ ] ) ) {\n\t\t\t\t\tmatcher( unmatched, setMatched, context, xml );\n\t\t\t\t}\n\n\t\t\t\tif ( seed ) {\n\n\t\t\t\t\t// Reintegrate element matches to eliminate the need for sorting\n\t\t\t\t\tif ( matchedCount > 0 ) {\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tif ( !( unmatched[ i ] || setMatched[ i ] ) ) {\n\t\t\t\t\t\t\t\tsetMatched[ i ] = pop.call( results );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Discard index placeholder values to get only actual matches\n\t\t\t\t\tsetMatched = condense( setMatched );\n\t\t\t\t}\n\n\t\t\t\t// Add matches to results\n\t\t\t\tpush.apply( results, setMatched );\n\n\t\t\t\t// Seedless set matches succeeding multiple successful matchers stipulate sorting\n\t\t\t\tif ( outermost && !seed && setMatched.length > 0 &&\n\t\t\t\t\t( matchedCount + setMatchers.length ) > 1 ) {\n\n\t\t\t\t\tjQuery.uniqueSort( results );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Override manipulation of globals by nested matchers\n\t\t\tif ( outermost ) {\n\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\toutermostContext = contextBackup;\n\t\t\t}\n\n\t\t\treturn unmatched;\n\t\t};\n\n\treturn bySet ?\n\t\tmarkFunction( superMatcher ) :\n\t\tsuperMatcher;\n}\n\nfunction compile( selector, match /* Internal Use Only */ ) {\n\tvar i,\n\t\tsetMatchers = [],\n\t\telementMatchers = [],\n\t\tcached = compilerCache[ selector + \" \" ];\n\n\tif ( !cached ) {\n\n\t\t// Generate a function of recursive functions that can be used to check each element\n\t\tif ( !match ) {\n\t\t\tmatch = tokenize( selector );\n\t\t}\n\t\ti = match.length;\n\t\twhile ( i-- ) {\n\t\t\tcached = matcherFromTokens( match[ i ] );\n\t\t\tif ( cached[ expando ] ) {\n\t\t\t\tsetMatchers.push( cached );\n\t\t\t} else {\n\t\t\t\telementMatchers.push( cached );\n\t\t\t}\n\t\t}\n\n\t\t// Cache the compiled function\n\t\tcached = compilerCache( selector,\n\t\t\tmatcherFromGroupMatchers( elementMatchers, setMatchers ) );\n\n\t\t// Save selector and tokenization\n\t\tcached.selector = selector;\n\t}\n\treturn cached;\n}\n\n/**\n * A low-level selection function that works with jQuery's compiled\n *  selector functions\n * @param {String|Function} selector A selector or a pre-compiled\n *  selector function built with jQuery selector compile\n * @param {Element} context\n * @param {Array} [results]\n * @param {Array} [seed] A set of elements to match against\n */\nfunction select( selector, context, results, seed ) {\n\tvar i, tokens, token, type, find,\n\t\tcompiled = typeof selector === \"function\" && selector,\n\t\tmatch = !seed && tokenize( ( selector = compiled.selector || selector ) );\n\n\tresults = results || [];\n\n\t// Try to minimize operations if there is only one selector in the list and no seed\n\t// (the latter of which guarantees us context)\n\tif ( match.length === 1 ) {\n\n\t\t// Reduce context if the leading compound selector is an ID\n\t\ttokens = match[ 0 ] = match[ 0 ].slice( 0 );\n\t\tif ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === \"ID\" &&\n\t\t\t\tcontext.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) {\n\n\t\t\tcontext = ( Expr.find.ID(\n\t\t\t\ttoken.matches[ 0 ].replace( runescape, funescape ),\n\t\t\t\tcontext\n\t\t\t) || [] )[ 0 ];\n\t\t\tif ( !context ) {\n\t\t\t\treturn results;\n\n\t\t\t// Precompiled matchers will still verify ancestry, so step up a level\n\t\t\t} else if ( compiled ) {\n\t\t\t\tcontext = context.parentNode;\n\t\t\t}\n\n\t\t\tselector = selector.slice( tokens.shift().value.length );\n\t\t}\n\n\t\t// Fetch a seed set for right-to-left matching\n\t\ti = matchExpr.needsContext.test( selector ) ? 0 : tokens.length;\n\t\twhile ( i-- ) {\n\t\t\ttoken = tokens[ i ];\n\n\t\t\t// Abort if we hit a combinator\n\t\t\tif ( Expr.relative[ ( type = token.type ) ] ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( ( find = Expr.find[ type ] ) ) {\n\n\t\t\t\t// Search, expanding context for leading sibling combinators\n\t\t\t\tif ( ( seed = find(\n\t\t\t\t\ttoken.matches[ 0 ].replace( runescape, funescape ),\n\t\t\t\t\trsibling.test( tokens[ 0 ].type ) &&\n\t\t\t\t\t\ttestContext( context.parentNode ) || context\n\t\t\t\t) ) ) {\n\n\t\t\t\t\t// If seed is empty or no tokens remain, we can return early\n\t\t\t\t\ttokens.splice( i, 1 );\n\t\t\t\t\tselector = seed.length && toSelector( tokens );\n\t\t\t\t\tif ( !selector ) {\n\t\t\t\t\t\tpush.apply( results, seed );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Compile and execute a filtering function if one is not provided\n\t// Provide `match` to avoid retokenization if we modified the selector above\n\t( compiled || compile( selector, match ) )(\n\t\tseed,\n\t\tcontext,\n\t\t!documentIsHTML,\n\t\tresults,\n\t\t!context || rsibling.test( selector ) && testContext( context.parentNode ) || context\n\t);\n\treturn results;\n}\n\n// One-time assignments\n\n// Support: Android <=4.0 - 4.1+\n// Sort stability\nsupport.sortStable = expando.split( \"\" ).sort( sortOrder ).join( \"\" ) === expando;\n\n// Initialize against the default document\nsetDocument();\n\n// Support: Android <=4.0 - 4.1+\n// Detached nodes confoundingly follow *each other*\nsupport.sortDetached = assert( function( el ) {\n\n\t// Should return 1, but returns 4 (following)\n\treturn el.compareDocumentPosition( document.createElement( \"fieldset\" ) ) & 1;\n} );\n\njQuery.find = find;\n\n// Deprecated\njQuery.expr[ \":\" ] = jQuery.expr.pseudos;\njQuery.unique = jQuery.uniqueSort;\n\n// These have always been private, but they used to be documented as part of\n// Sizzle so let's maintain them for now for backwards compatibility purposes.\nfind.compile = compile;\nfind.select = select;\nfind.setDocument = setDocument;\nfind.tokenize = tokenize;\n\nfind.escape = jQuery.escapeSelector;\nfind.getText = jQuery.text;\nfind.isXML = jQuery.isXMLDoc;\nfind.selectors = jQuery.expr;\nfind.support = jQuery.support;\nfind.uniqueSort = jQuery.uniqueSort;\n\n\t/* eslint-enable */\n\n} )();\n\n\nvar dir = function( elem, dir, until ) {\n\tvar matched = [],\n\t\ttruncate = until !== undefined;\n\n\twhile ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {\n\t\tif ( elem.nodeType === 1 ) {\n\t\t\tif ( truncate && jQuery( elem ).is( until ) ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tmatched.push( elem );\n\t\t}\n\t}\n\treturn matched;\n};\n\n\nvar siblings = function( n, elem ) {\n\tvar matched = [];\n\n\tfor ( ; n; n = n.nextSibling ) {\n\t\tif ( n.nodeType === 1 && n !== elem ) {\n\t\t\tmatched.push( n );\n\t\t}\n\t}\n\n\treturn matched;\n};\n\n\nvar rneedsContext = jQuery.expr.match.needsContext;\n\nvar rsingleTag = ( /^<([a-z][^\\/\\0>:\\x20\\t\\r\\n\\f]*)[\\x20\\t\\r\\n\\f]*\\/?>(?:<\\/\\1>|)$/i );\n\n\n\n// Implement the identical functionality for filter and not\nfunction winnow( elements, qualifier, not ) {\n\tif ( isFunction( qualifier ) ) {\n\t\treturn jQuery.grep( elements, function( elem, i ) {\n\t\t\treturn !!qualifier.call( elem, i, elem ) !== not;\n\t\t} );\n\t}\n\n\t// Single element\n\tif ( qualifier.nodeType ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( elem === qualifier ) !== not;\n\t\t} );\n\t}\n\n\t// Arraylike of elements (jQuery, arguments, Array)\n\tif ( typeof qualifier !== \"string\" ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( indexOf.call( qualifier, elem ) > -1 ) !== not;\n\t\t} );\n\t}\n\n\t// Filtered directly for both simple and complex selectors\n\treturn jQuery.filter( qualifier, elements, not );\n}\n\njQuery.filter = function( expr, elems, not ) {\n\tvar elem = elems[ 0 ];\n\n\tif ( not ) {\n\t\texpr = \":not(\" + expr + \")\";\n\t}\n\n\tif ( elems.length === 1 && elem.nodeType === 1 ) {\n\t\treturn jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];\n\t}\n\n\treturn jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {\n\t\treturn elem.nodeType === 1;\n\t} ) );\n};\n\njQuery.fn.extend( {\n\tfind: function( selector ) {\n\t\tvar i, ret,\n\t\t\tlen = this.length,\n\t\t\tself = this;\n\n\t\tif ( typeof selector !== \"string\" ) {\n\t\t\treturn this.pushStack( jQuery( selector ).filter( function() {\n\t\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\t\tif ( jQuery.contains( self[ i ], this ) ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} ) );\n\t\t}\n\n\t\tret = this.pushStack( [] );\n\n\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\tjQuery.find( selector, self[ i ], ret );\n\t\t}\n\n\t\treturn len > 1 ? jQuery.uniqueSort( ret ) : ret;\n\t},\n\tfilter: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], false ) );\n\t},\n\tnot: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], true ) );\n\t},\n\tis: function( selector ) {\n\t\treturn !!winnow(\n\t\t\tthis,\n\n\t\t\t// If this is a positional/relative selector, check membership in the returned set\n\t\t\t// so $(\"p:first\").is(\"p:last\") won't return true for a doc with two \"p\".\n\t\t\ttypeof selector === \"string\" && rneedsContext.test( selector ) ?\n\t\t\t\tjQuery( selector ) :\n\t\t\t\tselector || [],\n\t\t\tfalse\n\t\t).length;\n\t}\n} );\n\n\n// Initialize a jQuery object\n\n\n// A central reference to the root jQuery(document)\nvar rootjQuery,\n\n\t// A simple way to check for HTML strings\n\t// Prioritize #id over <tag> to avoid XSS via location.hash (trac-9521)\n\t// Strict HTML recognition (trac-11290: must start with <)\n\t// Shortcut simple #id case for speed\n\trquickExpr = /^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]+))$/,\n\n\tinit = jQuery.fn.init = function( selector, context, root ) {\n\t\tvar match, elem;\n\n\t\t// HANDLE: $(\"\"), $(null), $(undefined), $(false)\n\t\tif ( !selector ) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// Method init() accepts an alternate rootjQuery\n\t\t// so migrate can support jQuery.sub (gh-2101)\n\t\troot = root || rootjQuery;\n\n\t\t// Handle HTML strings\n\t\tif ( typeof selector === \"string\" ) {\n\t\t\tif ( selector[ 0 ] === \"<\" &&\n\t\t\t\tselector[ selector.length - 1 ] === \">\" &&\n\t\t\t\tselector.length >= 3 ) {\n\n\t\t\t\t// Assume that strings that start and end with <> are HTML and skip the regex check\n\t\t\t\tmatch = [ null, selector, null ];\n\n\t\t\t} else {\n\t\t\t\tmatch = rquickExpr.exec( selector );\n\t\t\t}\n\n\t\t\t// Match html or make sure no context is specified for #id\n\t\t\tif ( match && ( match[ 1 ] || !context ) ) {\n\n\t\t\t\t// HANDLE: $(html) -> $(array)\n\t\t\t\tif ( match[ 1 ] ) {\n\t\t\t\t\tcontext = context instanceof jQuery ? context[ 0 ] : context;\n\n\t\t\t\t\t// Option to run scripts is true for back-compat\n\t\t\t\t\t// Intentionally let the error be thrown if parseHTML is not present\n\t\t\t\t\tjQuery.merge( this, jQuery.parseHTML(\n\t\t\t\t\t\tmatch[ 1 ],\n\t\t\t\t\t\tcontext && context.nodeType ? context.ownerDocument || context : document,\n\t\t\t\t\t\ttrue\n\t\t\t\t\t) );\n\n\t\t\t\t\t// HANDLE: $(html, props)\n\t\t\t\t\tif ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {\n\t\t\t\t\t\tfor ( match in context ) {\n\n\t\t\t\t\t\t\t// Properties of context are called as methods if possible\n\t\t\t\t\t\t\tif ( isFunction( this[ match ] ) ) {\n\t\t\t\t\t\t\t\tthis[ match ]( context[ match ] );\n\n\t\t\t\t\t\t\t// ...and otherwise set as attributes\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.attr( match, context[ match ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t// HANDLE: $(#id)\n\t\t\t\t} else {\n\t\t\t\t\telem = document.getElementById( match[ 2 ] );\n\n\t\t\t\t\tif ( elem ) {\n\n\t\t\t\t\t\t// Inject the element directly into the jQuery object\n\t\t\t\t\t\tthis[ 0 ] = elem;\n\t\t\t\t\t\tthis.length = 1;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\n\t\t\t// HANDLE: $(expr, $(...))\n\t\t\t} else if ( !context || context.jquery ) {\n\t\t\t\treturn ( context || root ).find( selector );\n\n\t\t\t// HANDLE: $(expr, context)\n\t\t\t// (which is just equivalent to: $(context).find(expr)\n\t\t\t} else {\n\t\t\t\treturn this.constructor( context ).find( selector );\n\t\t\t}\n\n\t\t// HANDLE: $(DOMElement)\n\t\t} else if ( selector.nodeType ) {\n\t\t\tthis[ 0 ] = selector;\n\t\t\tthis.length = 1;\n\t\t\treturn this;\n\n\t\t// HANDLE: $(function)\n\t\t// Shortcut for document ready\n\t\t} else if ( isFunction( selector ) ) {\n\t\t\treturn root.ready !== undefined ?\n\t\t\t\troot.ready( selector ) :\n\n\t\t\t\t// Execute immediately if ready is not present\n\t\t\t\tselector( jQuery );\n\t\t}\n\n\t\treturn jQuery.makeArray( selector, this );\n\t};\n\n// Give the init function the jQuery prototype for later instantiation\ninit.prototype = jQuery.fn;\n\n// Initialize central reference\nrootjQuery = jQuery( document );\n\n\nvar rparentsprev = /^(?:parents|prev(?:Until|All))/,\n\n\t// Methods guaranteed to produce a unique set when starting from a unique set\n\tguaranteedUnique = {\n\t\tchildren: true,\n\t\tcontents: true,\n\t\tnext: true,\n\t\tprev: true\n\t};\n\njQuery.fn.extend( {\n\thas: function( target ) {\n\t\tvar targets = jQuery( target, this ),\n\t\t\tl = targets.length;\n\n\t\treturn this.filter( function() {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tif ( jQuery.contains( this, targets[ i ] ) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\tclosest: function( selectors, context ) {\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\tl = this.length,\n\t\t\tmatched = [],\n\t\t\ttargets = typeof selectors !== \"string\" && jQuery( selectors );\n\n\t\t// Positional selectors never match, since there's no _selection_ context\n\t\tif ( !rneedsContext.test( selectors ) ) {\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tfor ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {\n\n\t\t\t\t\t// Always skip document fragments\n\t\t\t\t\tif ( cur.nodeType < 11 && ( targets ?\n\t\t\t\t\t\ttargets.index( cur ) > -1 :\n\n\t\t\t\t\t\t// Don't pass non-elements to jQuery#find\n\t\t\t\t\t\tcur.nodeType === 1 &&\n\t\t\t\t\t\t\tjQuery.find.matchesSelector( cur, selectors ) ) ) {\n\n\t\t\t\t\t\tmatched.push( cur );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );\n\t},\n\n\t// Determine the position of an element within the set\n\tindex: function( elem ) {\n\n\t\t// No argument, return index in parent\n\t\tif ( !elem ) {\n\t\t\treturn ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;\n\t\t}\n\n\t\t// Index in selector\n\t\tif ( typeof elem === \"string\" ) {\n\t\t\treturn indexOf.call( jQuery( elem ), this[ 0 ] );\n\t\t}\n\n\t\t// Locate the position of the desired element\n\t\treturn indexOf.call( this,\n\n\t\t\t// If it receives a jQuery object, the first element is used\n\t\t\telem.jquery ? elem[ 0 ] : elem\n\t\t);\n\t},\n\n\tadd: function( selector, context ) {\n\t\treturn this.pushStack(\n\t\t\tjQuery.uniqueSort(\n\t\t\t\tjQuery.merge( this.get(), jQuery( selector, context ) )\n\t\t\t)\n\t\t);\n\t},\n\n\taddBack: function( selector ) {\n\t\treturn this.add( selector == null ?\n\t\t\tthis.prevObject : this.prevObject.filter( selector )\n\t\t);\n\t}\n} );\n\nfunction sibling( cur, dir ) {\n\twhile ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}\n\treturn cur;\n}\n\njQuery.each( {\n\tparent: function( elem ) {\n\t\tvar parent = elem.parentNode;\n\t\treturn parent && parent.nodeType !== 11 ? parent : null;\n\t},\n\tparents: function( elem ) {\n\t\treturn dir( elem, \"parentNode\" );\n\t},\n\tparentsUntil: function( elem, _i, until ) {\n\t\treturn dir( elem, \"parentNode\", until );\n\t},\n\tnext: function( elem ) {\n\t\treturn sibling( elem, \"nextSibling\" );\n\t},\n\tprev: function( elem ) {\n\t\treturn sibling( elem, \"previousSibling\" );\n\t},\n\tnextAll: function( elem ) {\n\t\treturn dir( elem, \"nextSibling\" );\n\t},\n\tprevAll: function( elem ) {\n\t\treturn dir( elem, \"previousSibling\" );\n\t},\n\tnextUntil: function( elem, _i, until ) {\n\t\treturn dir( elem, \"nextSibling\", until );\n\t},\n\tprevUntil: function( elem, _i, until ) {\n\t\treturn dir( elem, \"previousSibling\", until );\n\t},\n\tsiblings: function( elem ) {\n\t\treturn siblings( ( elem.parentNode || {} ).firstChild, elem );\n\t},\n\tchildren: function( elem ) {\n\t\treturn siblings( elem.firstChild );\n\t},\n\tcontents: function( elem ) {\n\t\tif ( elem.contentDocument != null &&\n\n\t\t\t// Support: IE 11+\n\t\t\t// <object> elements with no `data` attribute has an object\n\t\t\t// `contentDocument` with a `null` prototype.\n\t\t\tgetProto( elem.contentDocument ) ) {\n\n\t\t\treturn elem.contentDocument;\n\t\t}\n\n\t\t// Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only\n\t\t// Treat the template element as a regular one in browsers that\n\t\t// don't support it.\n\t\tif ( nodeName( elem, \"template\" ) ) {\n\t\t\telem = elem.content || elem;\n\t\t}\n\n\t\treturn jQuery.merge( [], elem.childNodes );\n\t}\n}, function( name, fn ) {\n\tjQuery.fn[ name ] = function( until, selector ) {\n\t\tvar matched = jQuery.map( this, fn, until );\n\n\t\tif ( name.slice( -5 ) !== \"Until\" ) {\n\t\t\tselector = until;\n\t\t}\n\n\t\tif ( selector && typeof selector === \"string\" ) {\n\t\t\tmatched = jQuery.filter( selector, matched );\n\t\t}\n\n\t\tif ( this.length > 1 ) {\n\n\t\t\t// Remove duplicates\n\t\t\tif ( !guaranteedUnique[ name ] ) {\n\t\t\t\tjQuery.uniqueSort( matched );\n\t\t\t}\n\n\t\t\t// Reverse order for parents* and prev-derivatives\n\t\t\tif ( rparentsprev.test( name ) ) {\n\t\t\t\tmatched.reverse();\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched );\n\t};\n} );\nvar rnothtmlwhite = ( /[^\\x20\\t\\r\\n\\f]+/g );\n\n\n\n// Convert String-formatted options into Object-formatted ones\nfunction createOptions( options ) {\n\tvar object = {};\n\tjQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {\n\t\tobject[ flag ] = true;\n\t} );\n\treturn object;\n}\n\n/*\n * Create a callback list using the following parameters:\n *\n *\toptions: an optional list of space-separated options that will change how\n *\t\t\tthe callback list behaves or a more traditional option object\n *\n * By default a callback list will act like an event callback list and can be\n * \"fired\" multiple times.\n *\n * Possible options:\n *\n *\tonce:\t\t\twill ensure the callback list can only be fired once (like a Deferred)\n *\n *\tmemory:\t\t\twill keep track of previous values and will call any callback added\n *\t\t\t\t\tafter the list has been fired right away with the latest \"memorized\"\n *\t\t\t\t\tvalues (like a Deferred)\n *\n *\tunique:\t\t\twill ensure a callback can only be added once (no duplicate in the list)\n *\n *\tstopOnFalse:\tinterrupt callings when a callback returns false\n *\n */\njQuery.Callbacks = function( options ) {\n\n\t// Convert options from String-formatted to Object-formatted if needed\n\t// (we check in cache first)\n\toptions = typeof options === \"string\" ?\n\t\tcreateOptions( options ) :\n\t\tjQuery.extend( {}, options );\n\n\tvar // Flag to know if list is currently firing\n\t\tfiring,\n\n\t\t// Last fire value for non-forgettable lists\n\t\tmemory,\n\n\t\t// Flag to know if list was already fired\n\t\tfired,\n\n\t\t// Flag to prevent firing\n\t\tlocked,\n\n\t\t// Actual callback list\n\t\tlist = [],\n\n\t\t// Queue of execution data for repeatable lists\n\t\tqueue = [],\n\n\t\t// Index of currently firing callback (modified by add/remove as needed)\n\t\tfiringIndex = -1,\n\n\t\t// Fire callbacks\n\t\tfire = function() {\n\n\t\t\t// Enforce single-firing\n\t\t\tlocked = locked || options.once;\n\n\t\t\t// Execute callbacks for all pending executions,\n\t\t\t// respecting firingIndex overrides and runtime changes\n\t\t\tfired = firing = true;\n\t\t\tfor ( ; queue.length; firingIndex = -1 ) {\n\t\t\t\tmemory = queue.shift();\n\t\t\t\twhile ( ++firingIndex < list.length ) {\n\n\t\t\t\t\t// Run callback and check for early termination\n\t\t\t\t\tif ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&\n\t\t\t\t\t\toptions.stopOnFalse ) {\n\n\t\t\t\t\t\t// Jump to end and forget the data so .add doesn't re-fire\n\t\t\t\t\t\tfiringIndex = list.length;\n\t\t\t\t\t\tmemory = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Forget the data if we're done with it\n\t\t\tif ( !options.memory ) {\n\t\t\t\tmemory = false;\n\t\t\t}\n\n\t\t\tfiring = false;\n\n\t\t\t// Clean up if we're done firing for good\n\t\t\tif ( locked ) {\n\n\t\t\t\t// Keep an empty list if we have data for future add calls\n\t\t\t\tif ( memory ) {\n\t\t\t\t\tlist = [];\n\n\t\t\t\t// Otherwise, this object is spent\n\t\t\t\t} else {\n\t\t\t\t\tlist = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t// Actual Callbacks object\n\t\tself = {\n\n\t\t\t// Add a callback or a collection of callbacks to the list\n\t\t\tadd: function() {\n\t\t\t\tif ( list ) {\n\n\t\t\t\t\t// If we have memory from a past run, we should fire after adding\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfiringIndex = list.length - 1;\n\t\t\t\t\t\tqueue.push( memory );\n\t\t\t\t\t}\n\n\t\t\t\t\t( function add( args ) {\n\t\t\t\t\t\tjQuery.each( args, function( _, arg ) {\n\t\t\t\t\t\t\tif ( isFunction( arg ) ) {\n\t\t\t\t\t\t\t\tif ( !options.unique || !self.has( arg ) ) {\n\t\t\t\t\t\t\t\t\tlist.push( arg );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if ( arg && arg.length && toType( arg ) !== \"string\" ) {\n\n\t\t\t\t\t\t\t\t// Inspect recursively\n\t\t\t\t\t\t\t\tadd( arg );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\t\t\t\t\t} )( arguments );\n\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Remove a callback from the list\n\t\t\tremove: function() {\n\t\t\t\tjQuery.each( arguments, function( _, arg ) {\n\t\t\t\t\tvar index;\n\t\t\t\t\twhile ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {\n\t\t\t\t\t\tlist.splice( index, 1 );\n\n\t\t\t\t\t\t// Handle firing indexes\n\t\t\t\t\t\tif ( index <= firingIndex ) {\n\t\t\t\t\t\t\tfiringIndex--;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Check if a given callback is in the list.\n\t\t\t// If no argument is given, return whether or not list has callbacks attached.\n\t\t\thas: function( fn ) {\n\t\t\t\treturn fn ?\n\t\t\t\t\tjQuery.inArray( fn, list ) > -1 :\n\t\t\t\t\tlist.length > 0;\n\t\t\t},\n\n\t\t\t// Remove all callbacks from the list\n\t\t\tempty: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\tlist = [];\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Disable .fire and .add\n\t\t\t// Abort any current/pending executions\n\t\t\t// Clear all callbacks and values\n\t\t\tdisable: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tlist = memory = \"\";\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tdisabled: function() {\n\t\t\t\treturn !list;\n\t\t\t},\n\n\t\t\t// Disable .fire\n\t\t\t// Also disable .add unless we have memory (since it would have no effect)\n\t\t\t// Abort any pending executions\n\t\t\tlock: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tif ( !memory && !firing ) {\n\t\t\t\t\tlist = memory = \"\";\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tlocked: function() {\n\t\t\t\treturn !!locked;\n\t\t\t},\n\n\t\t\t// Call all callbacks with the given context and arguments\n\t\t\tfireWith: function( context, args ) {\n\t\t\t\tif ( !locked ) {\n\t\t\t\t\targs = args || [];\n\t\t\t\t\targs = [ context, args.slice ? args.slice() : args ];\n\t\t\t\t\tqueue.push( args );\n\t\t\t\t\tif ( !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Call all the callbacks with the given arguments\n\t\t\tfire: function() {\n\t\t\t\tself.fireWith( this, arguments );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// To know if the callbacks have already been called at least once\n\t\t\tfired: function() {\n\t\t\t\treturn !!fired;\n\t\t\t}\n\t\t};\n\n\treturn self;\n};\n\n\nfunction Identity( v ) {\n\treturn v;\n}\nfunction Thrower( ex ) {\n\tthrow ex;\n}\n\nfunction adoptValue( value, resolve, reject, noValue ) {\n\tvar method;\n\n\ttry {\n\n\t\t// Check for promise aspect first to privilege synchronous behavior\n\t\tif ( value && isFunction( ( method = value.promise ) ) ) {\n\t\t\tmethod.call( value ).done( resolve ).fail( reject );\n\n\t\t// Other thenables\n\t\t} else if ( value && isFunction( ( method = value.then ) ) ) {\n\t\t\tmethod.call( value, resolve, reject );\n\n\t\t// Other non-thenables\n\t\t} else {\n\n\t\t\t// Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:\n\t\t\t// * false: [ value ].slice( 0 ) => resolve( value )\n\t\t\t// * true: [ value ].slice( 1 ) => resolve()\n\t\t\tresolve.apply( undefined, [ value ].slice( noValue ) );\n\t\t}\n\n\t// For Promises/A+, convert exceptions into rejections\n\t// Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in\n\t// Deferred#then to conditionally suppress rejection.\n\t} catch ( value ) {\n\n\t\t// Support: Android 4.0 only\n\t\t// Strict mode functions invoked without .call/.apply get global-object context\n\t\treject.apply( undefined, [ value ] );\n\t}\n}\n\njQuery.extend( {\n\n\tDeferred: function( func ) {\n\t\tvar tuples = [\n\n\t\t\t\t// action, add listener, callbacks,\n\t\t\t\t// ... .then handlers, argument index, [final state]\n\t\t\t\t[ \"notify\", \"progress\", jQuery.Callbacks( \"memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"memory\" ), 2 ],\n\t\t\t\t[ \"resolve\", \"done\", jQuery.Callbacks( \"once memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"once memory\" ), 0, \"resolved\" ],\n\t\t\t\t[ \"reject\", \"fail\", jQuery.Callbacks( \"once memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"once memory\" ), 1, \"rejected\" ]\n\t\t\t],\n\t\t\tstate = \"pending\",\n\t\t\tpromise = {\n\t\t\t\tstate: function() {\n\t\t\t\t\treturn state;\n\t\t\t\t},\n\t\t\t\talways: function() {\n\t\t\t\t\tdeferred.done( arguments ).fail( arguments );\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\t\t\t\t\"catch\": function( fn ) {\n\t\t\t\t\treturn promise.then( null, fn );\n\t\t\t\t},\n\n\t\t\t\t// Keep pipe for back-compat\n\t\t\t\tpipe: function( /* fnDone, fnFail, fnProgress */ ) {\n\t\t\t\t\tvar fns = arguments;\n\n\t\t\t\t\treturn jQuery.Deferred( function( newDefer ) {\n\t\t\t\t\t\tjQuery.each( tuples, function( _i, tuple ) {\n\n\t\t\t\t\t\t\t// Map tuples (progress, done, fail) to arguments (done, fail, progress)\n\t\t\t\t\t\t\tvar fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];\n\n\t\t\t\t\t\t\t// deferred.progress(function() { bind to newDefer or newDefer.notify })\n\t\t\t\t\t\t\t// deferred.done(function() { bind to newDefer or newDefer.resolve })\n\t\t\t\t\t\t\t// deferred.fail(function() { bind to newDefer or newDefer.reject })\n\t\t\t\t\t\t\tdeferred[ tuple[ 1 ] ]( function() {\n\t\t\t\t\t\t\t\tvar returned = fn && fn.apply( this, arguments );\n\t\t\t\t\t\t\t\tif ( returned && isFunction( returned.promise ) ) {\n\t\t\t\t\t\t\t\t\treturned.promise()\n\t\t\t\t\t\t\t\t\t\t.progress( newDefer.notify )\n\t\t\t\t\t\t\t\t\t\t.done( newDefer.resolve )\n\t\t\t\t\t\t\t\t\t\t.fail( newDefer.reject );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tnewDefer[ tuple[ 0 ] + \"With\" ](\n\t\t\t\t\t\t\t\t\t\tthis,\n\t\t\t\t\t\t\t\t\t\tfn ? [ returned ] : arguments\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t} );\n\t\t\t\t\t\tfns = null;\n\t\t\t\t\t} ).promise();\n\t\t\t\t},\n\t\t\t\tthen: function( onFulfilled, onRejected, onProgress ) {\n\t\t\t\t\tvar maxDepth = 0;\n\t\t\t\t\tfunction resolve( depth, deferred, handler, special ) {\n\t\t\t\t\t\treturn function() {\n\t\t\t\t\t\t\tvar that = this,\n\t\t\t\t\t\t\t\targs = arguments,\n\t\t\t\t\t\t\t\tmightThrow = function() {\n\t\t\t\t\t\t\t\t\tvar returned, then;\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.3\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-59\n\t\t\t\t\t\t\t\t\t// Ignore double-resolution attempts\n\t\t\t\t\t\t\t\t\tif ( depth < maxDepth ) {\n\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\treturned = handler.apply( that, args );\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.1\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-48\n\t\t\t\t\t\t\t\t\tif ( returned === deferred.promise() ) {\n\t\t\t\t\t\t\t\t\t\tthrow new TypeError( \"Thenable self-resolution\" );\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ sections 2.3.3.1, 3.5\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-54\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-75\n\t\t\t\t\t\t\t\t\t// Retrieve `then` only once\n\t\t\t\t\t\t\t\t\tthen = returned &&\n\n\t\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.4\n\t\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-64\n\t\t\t\t\t\t\t\t\t\t// Only check objects and functions for thenability\n\t\t\t\t\t\t\t\t\t\t( typeof returned === \"object\" ||\n\t\t\t\t\t\t\t\t\t\t\ttypeof returned === \"function\" ) &&\n\t\t\t\t\t\t\t\t\t\treturned.then;\n\n\t\t\t\t\t\t\t\t\t// Handle a returned thenable\n\t\t\t\t\t\t\t\t\tif ( isFunction( then ) ) {\n\n\t\t\t\t\t\t\t\t\t\t// Special processors (notify) just wait for resolution\n\t\t\t\t\t\t\t\t\t\tif ( special ) {\n\t\t\t\t\t\t\t\t\t\t\tthen.call(\n\t\t\t\t\t\t\t\t\t\t\t\treturned,\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Thrower, special )\n\t\t\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t\t\t// Normal processors (resolve) also hook into progress\n\t\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t\t// ...and disregard older resolution values\n\t\t\t\t\t\t\t\t\t\t\tmaxDepth++;\n\n\t\t\t\t\t\t\t\t\t\t\tthen.call(\n\t\t\t\t\t\t\t\t\t\t\t\treturned,\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Thrower, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity,\n\t\t\t\t\t\t\t\t\t\t\t\t\tdeferred.notifyWith )\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Handle all other returned values\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t// Only substitute handlers pass on context\n\t\t\t\t\t\t\t\t\t\t// and multiple values (non-spec behavior)\n\t\t\t\t\t\t\t\t\t\tif ( handler !== Identity ) {\n\t\t\t\t\t\t\t\t\t\t\tthat = undefined;\n\t\t\t\t\t\t\t\t\t\t\targs = [ returned ];\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t// Process the value(s)\n\t\t\t\t\t\t\t\t\t\t// Default process is resolve\n\t\t\t\t\t\t\t\t\t\t( special || deferred.resolveWith )( that, args );\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\n\t\t\t\t\t\t\t\t// Only normal processors (resolve) catch and reject exceptions\n\t\t\t\t\t\t\t\tprocess = special ?\n\t\t\t\t\t\t\t\t\tmightThrow :\n\t\t\t\t\t\t\t\t\tfunction() {\n\t\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\t\tmightThrow();\n\t\t\t\t\t\t\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t\t\t\t\t\t\tif ( jQuery.Deferred.exceptionHook ) {\n\t\t\t\t\t\t\t\t\t\t\t\tjQuery.Deferred.exceptionHook( e,\n\t\t\t\t\t\t\t\t\t\t\t\t\tprocess.error );\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.4.1\n\t\t\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-61\n\t\t\t\t\t\t\t\t\t\t\t// Ignore post-resolution exceptions\n\t\t\t\t\t\t\t\t\t\t\tif ( depth + 1 >= maxDepth ) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t// Only substitute handlers pass on context\n\t\t\t\t\t\t\t\t\t\t\t\t// and multiple values (non-spec behavior)\n\t\t\t\t\t\t\t\t\t\t\t\tif ( handler !== Thrower ) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tthat = undefined;\n\t\t\t\t\t\t\t\t\t\t\t\t\targs = [ e ];\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\tdeferred.rejectWith( that, args );\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.1\n\t\t\t\t\t\t\t// https://promisesaplus.com/#point-57\n\t\t\t\t\t\t\t// Re-resolve promises immediately to dodge false rejection from\n\t\t\t\t\t\t\t// subsequent errors\n\t\t\t\t\t\t\tif ( depth ) {\n\t\t\t\t\t\t\t\tprocess();\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// Call an optional hook to record the error, in case of exception\n\t\t\t\t\t\t\t\t// since it's otherwise lost when execution goes async\n\t\t\t\t\t\t\t\tif ( jQuery.Deferred.getErrorHook ) {\n\t\t\t\t\t\t\t\t\tprocess.error = jQuery.Deferred.getErrorHook();\n\n\t\t\t\t\t\t\t\t// The deprecated alias of the above. While the name suggests\n\t\t\t\t\t\t\t\t// returning the stack, not an error instance, jQuery just passes\n\t\t\t\t\t\t\t\t// it directly to `console.warn` so both will work; an instance\n\t\t\t\t\t\t\t\t// just better cooperates with source maps.\n\t\t\t\t\t\t\t\t} else if ( jQuery.Deferred.getStackHook ) {\n\t\t\t\t\t\t\t\t\tprocess.error = jQuery.Deferred.getStackHook();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\twindow.setTimeout( process );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\treturn jQuery.Deferred( function( newDefer ) {\n\n\t\t\t\t\t\t// progress_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 0 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onProgress ) ?\n\t\t\t\t\t\t\t\t\tonProgress :\n\t\t\t\t\t\t\t\t\tIdentity,\n\t\t\t\t\t\t\t\tnewDefer.notifyWith\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// fulfilled_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 1 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onFulfilled ) ?\n\t\t\t\t\t\t\t\t\tonFulfilled :\n\t\t\t\t\t\t\t\t\tIdentity\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// rejected_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 2 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onRejected ) ?\n\t\t\t\t\t\t\t\t\tonRejected :\n\t\t\t\t\t\t\t\t\tThrower\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\t\t\t\t\t} ).promise();\n\t\t\t\t},\n\n\t\t\t\t// Get a promise for this deferred\n\t\t\t\t// If obj is provided, the promise aspect is added to the object\n\t\t\t\tpromise: function( obj ) {\n\t\t\t\t\treturn obj != null ? jQuery.extend( obj, promise ) : promise;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdeferred = {};\n\n\t\t// Add list-specific methods\n\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\tvar list = tuple[ 2 ],\n\t\t\t\tstateString = tuple[ 5 ];\n\n\t\t\t// promise.progress = list.add\n\t\t\t// promise.done = list.add\n\t\t\t// promise.fail = list.add\n\t\t\tpromise[ tuple[ 1 ] ] = list.add;\n\n\t\t\t// Handle state\n\t\t\tif ( stateString ) {\n\t\t\t\tlist.add(\n\t\t\t\t\tfunction() {\n\n\t\t\t\t\t\t// state = \"resolved\" (i.e., fulfilled)\n\t\t\t\t\t\t// state = \"rejected\"\n\t\t\t\t\t\tstate = stateString;\n\t\t\t\t\t},\n\n\t\t\t\t\t// rejected_callbacks.disable\n\t\t\t\t\t// fulfilled_callbacks.disable\n\t\t\t\t\ttuples[ 3 - i ][ 2 ].disable,\n\n\t\t\t\t\t// rejected_handlers.disable\n\t\t\t\t\t// fulfilled_handlers.disable\n\t\t\t\t\ttuples[ 3 - i ][ 3 ].disable,\n\n\t\t\t\t\t// progress_callbacks.lock\n\t\t\t\t\ttuples[ 0 ][ 2 ].lock,\n\n\t\t\t\t\t// progress_handlers.lock\n\t\t\t\t\ttuples[ 0 ][ 3 ].lock\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// progress_handlers.fire\n\t\t\t// fulfilled_handlers.fire\n\t\t\t// rejected_handlers.fire\n\t\t\tlist.add( tuple[ 3 ].fire );\n\n\t\t\t// deferred.notify = function() { deferred.notifyWith(...) }\n\t\t\t// deferred.resolve = function() { deferred.resolveWith(...) }\n\t\t\t// deferred.reject = function() { deferred.rejectWith(...) }\n\t\t\tdeferred[ tuple[ 0 ] ] = function() {\n\t\t\t\tdeferred[ tuple[ 0 ] + \"With\" ]( this === deferred ? undefined : this, arguments );\n\t\t\t\treturn this;\n\t\t\t};\n\n\t\t\t// deferred.notifyWith = list.fireWith\n\t\t\t// deferred.resolveWith = list.fireWith\n\t\t\t// deferred.rejectWith = list.fireWith\n\t\t\tdeferred[ tuple[ 0 ] + \"With\" ] = list.fireWith;\n\t\t} );\n\n\t\t// Make the deferred a promise\n\t\tpromise.promise( deferred );\n\n\t\t// Call given func if any\n\t\tif ( func ) {\n\t\t\tfunc.call( deferred, deferred );\n\t\t}\n\n\t\t// All done!\n\t\treturn deferred;\n\t},\n\n\t// Deferred helper\n\twhen: function( singleValue ) {\n\t\tvar\n\n\t\t\t// count of uncompleted subordinates\n\t\t\tremaining = arguments.length,\n\n\t\t\t// count of unprocessed arguments\n\t\t\ti = remaining,\n\n\t\t\t// subordinate fulfillment data\n\t\t\tresolveContexts = Array( i ),\n\t\t\tresolveValues = slice.call( arguments ),\n\n\t\t\t// the primary Deferred\n\t\t\tprimary = jQuery.Deferred(),\n\n\t\t\t// subordinate callback factory\n\t\t\tupdateFunc = function( i ) {\n\t\t\t\treturn function( value ) {\n\t\t\t\t\tresolveContexts[ i ] = this;\n\t\t\t\t\tresolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;\n\t\t\t\t\tif ( !( --remaining ) ) {\n\t\t\t\t\t\tprimary.resolveWith( resolveContexts, resolveValues );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t};\n\n\t\t// Single- and empty arguments are adopted like Promise.resolve\n\t\tif ( remaining <= 1 ) {\n\t\t\tadoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject,\n\t\t\t\t!remaining );\n\n\t\t\t// Use .then() to unwrap secondary thenables (cf. gh-3000)\n\t\t\tif ( primary.state() === \"pending\" ||\n\t\t\t\tisFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {\n\n\t\t\t\treturn primary.then();\n\t\t\t}\n\t\t}\n\n\t\t// Multiple arguments are aggregated like Promise.all array elements\n\t\twhile ( i-- ) {\n\t\t\tadoptValue( resolveValues[ i ], updateFunc( i ), primary.reject );\n\t\t}\n\n\t\treturn primary.promise();\n\t}\n} );\n\n\n// These usually indicate a programmer mistake during development,\n// warn about them ASAP rather than swallowing them by default.\nvar rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;\n\n// If `jQuery.Deferred.getErrorHook` is defined, `asyncError` is an error\n// captured before the async barrier to get the original error cause\n// which may otherwise be hidden.\njQuery.Deferred.exceptionHook = function( error, asyncError ) {\n\n\t// Support: IE 8 - 9 only\n\t// Console exists when dev tools are open, which can happen at any time\n\tif ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {\n\t\twindow.console.warn( \"jQuery.Deferred exception: \" + error.message,\n\t\t\terror.stack, asyncError );\n\t}\n};\n\n\n\n\njQuery.readyException = function( error ) {\n\twindow.setTimeout( function() {\n\t\tthrow error;\n\t} );\n};\n\n\n\n\n// The deferred used on DOM ready\nvar readyList = jQuery.Deferred();\n\njQuery.fn.ready = function( fn ) {\n\n\treadyList\n\t\t.then( fn )\n\n\t\t// Wrap jQuery.readyException in a function so that the lookup\n\t\t// happens at the time of error handling instead of callback\n\t\t// registration.\n\t\t.catch( function( error ) {\n\t\t\tjQuery.readyException( error );\n\t\t} );\n\n\treturn this;\n};\n\njQuery.extend( {\n\n\t// Is the DOM ready to be used? Set to true once it occurs.\n\tisReady: false,\n\n\t// A counter to track how many items to wait for before\n\t// the ready event fires. See trac-6781\n\treadyWait: 1,\n\n\t// Handle when the DOM is ready\n\tready: function( wait ) {\n\n\t\t// Abort if there are pending holds or we're already ready\n\t\tif ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Remember that the DOM is ready\n\t\tjQuery.isReady = true;\n\n\t\t// If a normal DOM Ready event fired, decrement, and wait if need be\n\t\tif ( wait !== true && --jQuery.readyWait > 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If there are functions bound, to execute\n\t\treadyList.resolveWith( document, [ jQuery ] );\n\t}\n} );\n\njQuery.ready.then = readyList.then;\n\n// The ready event handler and self cleanup method\nfunction completed() {\n\tdocument.removeEventListener( \"DOMContentLoaded\", completed );\n\twindow.removeEventListener( \"load\", completed );\n\tjQuery.ready();\n}\n\n// Catch cases where $(document).ready() is called\n// after the browser event has already occurred.\n// Support: IE <=9 - 10 only\n// Older IE sometimes signals \"interactive\" too soon\nif ( document.readyState === \"complete\" ||\n\t( document.readyState !== \"loading\" && !document.documentElement.doScroll ) ) {\n\n\t// Handle it asynchronously to allow scripts the opportunity to delay ready\n\twindow.setTimeout( jQuery.ready );\n\n} else {\n\n\t// Use the handy event callback\n\tdocument.addEventListener( \"DOMContentLoaded\", completed );\n\n\t// A fallback to window.onload, that will always work\n\twindow.addEventListener( \"load\", completed );\n}\n\n\n\n\n// Multifunctional method to get and set values of a collection\n// The value/s can optionally be executed if it's a function\nvar access = function( elems, fn, key, value, chainable, emptyGet, raw ) {\n\tvar i = 0,\n\t\tlen = elems.length,\n\t\tbulk = key == null;\n\n\t// Sets many values\n\tif ( toType( key ) === \"object\" ) {\n\t\tchainable = true;\n\t\tfor ( i in key ) {\n\t\t\taccess( elems, fn, i, key[ i ], true, emptyGet, raw );\n\t\t}\n\n\t// Sets one value\n\t} else if ( value !== undefined ) {\n\t\tchainable = true;\n\n\t\tif ( !isFunction( value ) ) {\n\t\t\traw = true;\n\t\t}\n\n\t\tif ( bulk ) {\n\n\t\t\t// Bulk operations run against the entire set\n\t\t\tif ( raw ) {\n\t\t\t\tfn.call( elems, value );\n\t\t\t\tfn = null;\n\n\t\t\t// ...except when executing function values\n\t\t\t} else {\n\t\t\t\tbulk = fn;\n\t\t\t\tfn = function( elem, _key, value ) {\n\t\t\t\t\treturn bulk.call( jQuery( elem ), value );\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif ( fn ) {\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\tfn(\n\t\t\t\t\telems[ i ], key, raw ?\n\t\t\t\t\t\tvalue :\n\t\t\t\t\t\tvalue.call( elems[ i ], i, fn( elems[ i ], key ) )\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( chainable ) {\n\t\treturn elems;\n\t}\n\n\t// Gets\n\tif ( bulk ) {\n\t\treturn fn.call( elems );\n\t}\n\n\treturn len ? fn( elems[ 0 ], key ) : emptyGet;\n};\n\n\n// Matches dashed string for camelizing\nvar rmsPrefix = /^-ms-/,\n\trdashAlpha = /-([a-z])/g;\n\n// Used by camelCase as callback to replace()\nfunction fcamelCase( _all, letter ) {\n\treturn letter.toUpperCase();\n}\n\n// Convert dashed to camelCase; used by the css and data modules\n// Support: IE <=9 - 11, Edge 12 - 15\n// Microsoft forgot to hump their vendor prefix (trac-9572)\nfunction camelCase( string ) {\n\treturn string.replace( rmsPrefix, \"ms-\" ).replace( rdashAlpha, fcamelCase );\n}\nvar acceptData = function( owner ) {\n\n\t// Accepts only:\n\t//  - Node\n\t//    - Node.ELEMENT_NODE\n\t//    - Node.DOCUMENT_NODE\n\t//  - Object\n\t//    - Any\n\treturn owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );\n};\n\n\n\n\nfunction Data() {\n\tthis.expando = jQuery.expando + Data.uid++;\n}\n\nData.uid = 1;\n\nData.prototype = {\n\n\tcache: function( owner ) {\n\n\t\t// Check if the owner object already has a cache\n\t\tvar value = owner[ this.expando ];\n\n\t\t// If not, create one\n\t\tif ( !value ) {\n\t\t\tvalue = {};\n\n\t\t\t// We can accept data for non-element nodes in modern browsers,\n\t\t\t// but we should not, see trac-8335.\n\t\t\t// Always return an empty object.\n\t\t\tif ( acceptData( owner ) ) {\n\n\t\t\t\t// If it is a node unlikely to be stringify-ed or looped over\n\t\t\t\t// use plain assignment\n\t\t\t\tif ( owner.nodeType ) {\n\t\t\t\t\towner[ this.expando ] = value;\n\n\t\t\t\t// Otherwise secure it in a non-enumerable property\n\t\t\t\t// configurable must be true to allow the property to be\n\t\t\t\t// deleted when data is removed\n\t\t\t\t} else {\n\t\t\t\t\tObject.defineProperty( owner, this.expando, {\n\t\t\t\t\t\tvalue: value,\n\t\t\t\t\t\tconfigurable: true\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn value;\n\t},\n\tset: function( owner, data, value ) {\n\t\tvar prop,\n\t\t\tcache = this.cache( owner );\n\n\t\t// Handle: [ owner, key, value ] args\n\t\t// Always use camelCase key (gh-2257)\n\t\tif ( typeof data === \"string\" ) {\n\t\t\tcache[ camelCase( data ) ] = value;\n\n\t\t// Handle: [ owner, { properties } ] args\n\t\t} else {\n\n\t\t\t// Copy the properties one-by-one to the cache object\n\t\t\tfor ( prop in data ) {\n\t\t\t\tcache[ camelCase( prop ) ] = data[ prop ];\n\t\t\t}\n\t\t}\n\t\treturn cache;\n\t},\n\tget: function( owner, key ) {\n\t\treturn key === undefined ?\n\t\t\tthis.cache( owner ) :\n\n\t\t\t// Always use camelCase key (gh-2257)\n\t\t\towner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ];\n\t},\n\taccess: function( owner, key, value ) {\n\n\t\t// In cases where either:\n\t\t//\n\t\t//   1. No key was specified\n\t\t//   2. A string key was specified, but no value provided\n\t\t//\n\t\t// Take the \"read\" path and allow the get method to determine\n\t\t// which value to return, respectively either:\n\t\t//\n\t\t//   1. The entire cache object\n\t\t//   2. The data stored at the key\n\t\t//\n\t\tif ( key === undefined ||\n\t\t\t\t( ( key && typeof key === \"string\" ) && value === undefined ) ) {\n\n\t\t\treturn this.get( owner, key );\n\t\t}\n\n\t\t// When the key is not a string, or both a key and value\n\t\t// are specified, set or extend (existing objects) with either:\n\t\t//\n\t\t//   1. An object of properties\n\t\t//   2. A key and value\n\t\t//\n\t\tthis.set( owner, key, value );\n\n\t\t// Since the \"set\" path can have two possible entry points\n\t\t// return the expected data based on which path was taken[*]\n\t\treturn value !== undefined ? value : key;\n\t},\n\tremove: function( owner, key ) {\n\t\tvar i,\n\t\t\tcache = owner[ this.expando ];\n\n\t\tif ( cache === undefined ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( key !== undefined ) {\n\n\t\t\t// Support array or space separated string of keys\n\t\t\tif ( Array.isArray( key ) ) {\n\n\t\t\t\t// If key is an array of keys...\n\t\t\t\t// We always set camelCase keys, so remove that.\n\t\t\t\tkey = key.map( camelCase );\n\t\t\t} else {\n\t\t\t\tkey = camelCase( key );\n\n\t\t\t\t// If a key with the spaces exists, use it.\n\t\t\t\t// Otherwise, create an array by matching non-whitespace\n\t\t\t\tkey = key in cache ?\n\t\t\t\t\t[ key ] :\n\t\t\t\t\t( key.match( rnothtmlwhite ) || [] );\n\t\t\t}\n\n\t\t\ti = key.length;\n\n\t\t\twhile ( i-- ) {\n\t\t\t\tdelete cache[ key[ i ] ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove the expando if there's no more data\n\t\tif ( key === undefined || jQuery.isEmptyObject( cache ) ) {\n\n\t\t\t// Support: Chrome <=35 - 45\n\t\t\t// Webkit & Blink performance suffers when deleting properties\n\t\t\t// from DOM nodes, so set to undefined instead\n\t\t\t// https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)\n\t\t\tif ( owner.nodeType ) {\n\t\t\t\towner[ this.expando ] = undefined;\n\t\t\t} else {\n\t\t\t\tdelete owner[ this.expando ];\n\t\t\t}\n\t\t}\n\t},\n\thasData: function( owner ) {\n\t\tvar cache = owner[ this.expando ];\n\t\treturn cache !== undefined && !jQuery.isEmptyObject( cache );\n\t}\n};\nvar dataPriv = new Data();\n\nvar dataUser = new Data();\n\n\n\n//\tImplementation Summary\n//\n//\t1. Enforce API surface and semantic compatibility with 1.9.x branch\n//\t2. Improve the module's maintainability by reducing the storage\n//\t\tpaths to a single mechanism.\n//\t3. Use the same single mechanism to support \"private\" and \"user\" data.\n//\t4. _Never_ expose \"private\" data to user code (TODO: Drop _data, _removeData)\n//\t5. Avoid exposing implementation details on user objects (eg. expando properties)\n//\t6. Provide a clear path for implementation upgrade to WeakMap in 2014\n\nvar rbrace = /^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/,\n\trmultiDash = /[A-Z]/g;\n\nfunction getData( data ) {\n\tif ( data === \"true\" ) {\n\t\treturn true;\n\t}\n\n\tif ( data === \"false\" ) {\n\t\treturn false;\n\t}\n\n\tif ( data === \"null\" ) {\n\t\treturn null;\n\t}\n\n\t// Only convert to a number if it doesn't change the string\n\tif ( data === +data + \"\" ) {\n\t\treturn +data;\n\t}\n\n\tif ( rbrace.test( data ) ) {\n\t\treturn JSON.parse( data );\n\t}\n\n\treturn data;\n}\n\nfunction dataAttr( elem, key, data ) {\n\tvar name;\n\n\t// If nothing was found internally, try to fetch any\n\t// data from the HTML5 data-* attribute\n\tif ( data === undefined && elem.nodeType === 1 ) {\n\t\tname = \"data-\" + key.replace( rmultiDash, \"-$&\" ).toLowerCase();\n\t\tdata = elem.getAttribute( name );\n\n\t\tif ( typeof data === \"string\" ) {\n\t\t\ttry {\n\t\t\t\tdata = getData( data );\n\t\t\t} catch ( e ) {}\n\n\t\t\t// Make sure we set the data so it isn't changed later\n\t\t\tdataUser.set( elem, key, data );\n\t\t} else {\n\t\t\tdata = undefined;\n\t\t}\n\t}\n\treturn data;\n}\n\njQuery.extend( {\n\thasData: function( elem ) {\n\t\treturn dataUser.hasData( elem ) || dataPriv.hasData( elem );\n\t},\n\n\tdata: function( elem, name, data ) {\n\t\treturn dataUser.access( elem, name, data );\n\t},\n\n\tremoveData: function( elem, name ) {\n\t\tdataUser.remove( elem, name );\n\t},\n\n\t// TODO: Now that all calls to _data and _removeData have been replaced\n\t// with direct calls to dataPriv methods, these can be deprecated.\n\t_data: function( elem, name, data ) {\n\t\treturn dataPriv.access( elem, name, data );\n\t},\n\n\t_removeData: function( elem, name ) {\n\t\tdataPriv.remove( elem, name );\n\t}\n} );\n\njQuery.fn.extend( {\n\tdata: function( key, value ) {\n\t\tvar i, name, data,\n\t\t\telem = this[ 0 ],\n\t\t\tattrs = elem && elem.attributes;\n\n\t\t// Gets all values\n\t\tif ( key === undefined ) {\n\t\t\tif ( this.length ) {\n\t\t\t\tdata = dataUser.get( elem );\n\n\t\t\t\tif ( elem.nodeType === 1 && !dataPriv.get( elem, \"hasDataAttrs\" ) ) {\n\t\t\t\t\ti = attrs.length;\n\t\t\t\t\twhile ( i-- ) {\n\n\t\t\t\t\t\t// Support: IE 11 only\n\t\t\t\t\t\t// The attrs elements can be null (trac-14894)\n\t\t\t\t\t\tif ( attrs[ i ] ) {\n\t\t\t\t\t\t\tname = attrs[ i ].name;\n\t\t\t\t\t\t\tif ( name.indexOf( \"data-\" ) === 0 ) {\n\t\t\t\t\t\t\t\tname = camelCase( name.slice( 5 ) );\n\t\t\t\t\t\t\t\tdataAttr( elem, name, data[ name ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tdataPriv.set( elem, \"hasDataAttrs\", true );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn data;\n\t\t}\n\n\t\t// Sets multiple values\n\t\tif ( typeof key === \"object\" ) {\n\t\t\treturn this.each( function() {\n\t\t\t\tdataUser.set( this, key );\n\t\t\t} );\n\t\t}\n\n\t\treturn access( this, function( value ) {\n\t\t\tvar data;\n\n\t\t\t// The calling jQuery object (element matches) is not empty\n\t\t\t// (and therefore has an element appears at this[ 0 ]) and the\n\t\t\t// `value` parameter was not undefined. An empty jQuery object\n\t\t\t// will result in `undefined` for elem = this[ 0 ] which will\n\t\t\t// throw an exception if an attempt to read a data cache is made.\n\t\t\tif ( elem && value === undefined ) {\n\n\t\t\t\t// Attempt to get data from the cache\n\t\t\t\t// The key will always be camelCased in Data\n\t\t\t\tdata = dataUser.get( elem, key );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// Attempt to \"discover\" the data in\n\t\t\t\t// HTML5 custom data-* attrs\n\t\t\t\tdata = dataAttr( elem, key );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// We tried really hard, but the data doesn't exist.\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Set the data...\n\t\t\tthis.each( function() {\n\n\t\t\t\t// We always store the camelCased key\n\t\t\t\tdataUser.set( this, key, value );\n\t\t\t} );\n\t\t}, null, value, arguments.length > 1, null, true );\n\t},\n\n\tremoveData: function( key ) {\n\t\treturn this.each( function() {\n\t\t\tdataUser.remove( this, key );\n\t\t} );\n\t}\n} );\n\n\njQuery.extend( {\n\tqueue: function( elem, type, data ) {\n\t\tvar queue;\n\n\t\tif ( elem ) {\n\t\t\ttype = ( type || \"fx\" ) + \"queue\";\n\t\t\tqueue = dataPriv.get( elem, type );\n\n\t\t\t// Speed up dequeue by getting out quickly if this is just a lookup\n\t\t\tif ( data ) {\n\t\t\t\tif ( !queue || Array.isArray( data ) ) {\n\t\t\t\t\tqueue = dataPriv.access( elem, type, jQuery.makeArray( data ) );\n\t\t\t\t} else {\n\t\t\t\t\tqueue.push( data );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn queue || [];\n\t\t}\n\t},\n\n\tdequeue: function( elem, type ) {\n\t\ttype = type || \"fx\";\n\n\t\tvar queue = jQuery.queue( elem, type ),\n\t\t\tstartLength = queue.length,\n\t\t\tfn = queue.shift(),\n\t\t\thooks = jQuery._queueHooks( elem, type ),\n\t\t\tnext = function() {\n\t\t\t\tjQuery.dequeue( elem, type );\n\t\t\t};\n\n\t\t// If the fx queue is dequeued, always remove the progress sentinel\n\t\tif ( fn === \"inprogress\" ) {\n\t\t\tfn = queue.shift();\n\t\t\tstartLength--;\n\t\t}\n\n\t\tif ( fn ) {\n\n\t\t\t// Add a progress sentinel to prevent the fx queue from being\n\t\t\t// automatically dequeued\n\t\t\tif ( type === \"fx\" ) {\n\t\t\t\tqueue.unshift( \"inprogress\" );\n\t\t\t}\n\n\t\t\t// Clear up the last queue stop function\n\t\t\tdelete hooks.stop;\n\t\t\tfn.call( elem, next, hooks );\n\t\t}\n\n\t\tif ( !startLength && hooks ) {\n\t\t\thooks.empty.fire();\n\t\t}\n\t},\n\n\t// Not public - generate a queueHooks object, or return the current one\n\t_queueHooks: function( elem, type ) {\n\t\tvar key = type + \"queueHooks\";\n\t\treturn dataPriv.get( elem, key ) || dataPriv.access( elem, key, {\n\t\t\tempty: jQuery.Callbacks( \"once memory\" ).add( function() {\n\t\t\t\tdataPriv.remove( elem, [ type + \"queue\", key ] );\n\t\t\t} )\n\t\t} );\n\t}\n} );\n\njQuery.fn.extend( {\n\tqueue: function( type, data ) {\n\t\tvar setter = 2;\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tdata = type;\n\t\t\ttype = \"fx\";\n\t\t\tsetter--;\n\t\t}\n\n\t\tif ( arguments.length < setter ) {\n\t\t\treturn jQuery.queue( this[ 0 ], type );\n\t\t}\n\n\t\treturn data === undefined ?\n\t\t\tthis :\n\t\t\tthis.each( function() {\n\t\t\t\tvar queue = jQuery.queue( this, type, data );\n\n\t\t\t\t// Ensure a hooks for this queue\n\t\t\t\tjQuery._queueHooks( this, type );\n\n\t\t\t\tif ( type === \"fx\" && queue[ 0 ] !== \"inprogress\" ) {\n\t\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t\t}\n\t\t\t} );\n\t},\n\tdequeue: function( type ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.dequeue( this, type );\n\t\t} );\n\t},\n\tclearQueue: function( type ) {\n\t\treturn this.queue( type || \"fx\", [] );\n\t},\n\n\t// Get a promise resolved when queues of a certain type\n\t// are emptied (fx is the type by default)\n\tpromise: function( type, obj ) {\n\t\tvar tmp,\n\t\t\tcount = 1,\n\t\t\tdefer = jQuery.Deferred(),\n\t\t\telements = this,\n\t\t\ti = this.length,\n\t\t\tresolve = function() {\n\t\t\t\tif ( !( --count ) ) {\n\t\t\t\t\tdefer.resolveWith( elements, [ elements ] );\n\t\t\t\t}\n\t\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tobj = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\ttype = type || \"fx\";\n\n\t\twhile ( i-- ) {\n\t\t\ttmp = dataPriv.get( elements[ i ], type + \"queueHooks\" );\n\t\t\tif ( tmp && tmp.empty ) {\n\t\t\t\tcount++;\n\t\t\t\ttmp.empty.add( resolve );\n\t\t\t}\n\t\t}\n\t\tresolve();\n\t\treturn defer.promise( obj );\n\t}\n} );\nvar pnum = ( /[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/ ).source;\n\nvar rcssNum = new RegExp( \"^(?:([+-])=|)(\" + pnum + \")([a-z%]*)$\", \"i\" );\n\n\nvar cssExpand = [ \"Top\", \"Right\", \"Bottom\", \"Left\" ];\n\nvar documentElement = document.documentElement;\n\n\n\n\tvar isAttached = function( elem ) {\n\t\t\treturn jQuery.contains( elem.ownerDocument, elem );\n\t\t},\n\t\tcomposed = { composed: true };\n\n\t// Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only\n\t// Check attachment across shadow DOM boundaries when possible (gh-3504)\n\t// Support: iOS 10.0-10.2 only\n\t// Early iOS 10 versions support `attachShadow` but not `getRootNode`,\n\t// leading to errors. We need to check for `getRootNode`.\n\tif ( documentElement.getRootNode ) {\n\t\tisAttached = function( elem ) {\n\t\t\treturn jQuery.contains( elem.ownerDocument, elem ) ||\n\t\t\t\telem.getRootNode( composed ) === elem.ownerDocument;\n\t\t};\n\t}\nvar isHiddenWithinTree = function( elem, el ) {\n\n\t\t// isHiddenWithinTree might be called from jQuery#filter function;\n\t\t// in that case, element will be second argument\n\t\telem = el || elem;\n\n\t\t// Inline style trumps all\n\t\treturn elem.style.display === \"none\" ||\n\t\t\telem.style.display === \"\" &&\n\n\t\t\t// Otherwise, check computed style\n\t\t\t// Support: Firefox <=43 - 45\n\t\t\t// Disconnected elements can have computed display: none, so first confirm that elem is\n\t\t\t// in the document.\n\t\t\tisAttached( elem ) &&\n\n\t\t\tjQuery.css( elem, \"display\" ) === \"none\";\n\t};\n\n\n\nfunction adjustCSS( elem, prop, valueParts, tween ) {\n\tvar adjusted, scale,\n\t\tmaxIterations = 20,\n\t\tcurrentValue = tween ?\n\t\t\tfunction() {\n\t\t\t\treturn tween.cur();\n\t\t\t} :\n\t\t\tfunction() {\n\t\t\t\treturn jQuery.css( elem, prop, \"\" );\n\t\t\t},\n\t\tinitial = currentValue(),\n\t\tunit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" ),\n\n\t\t// Starting value computation is required for potential unit mismatches\n\t\tinitialInUnit = elem.nodeType &&\n\t\t\t( jQuery.cssNumber[ prop ] || unit !== \"px\" && +initial ) &&\n\t\t\trcssNum.exec( jQuery.css( elem, prop ) );\n\n\tif ( initialInUnit && initialInUnit[ 3 ] !== unit ) {\n\n\t\t// Support: Firefox <=54\n\t\t// Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144)\n\t\tinitial = initial / 2;\n\n\t\t// Trust units reported by jQuery.css\n\t\tunit = unit || initialInUnit[ 3 ];\n\n\t\t// Iteratively approximate from a nonzero starting point\n\t\tinitialInUnit = +initial || 1;\n\n\t\twhile ( maxIterations-- ) {\n\n\t\t\t// Evaluate and update our best guess (doubling guesses that zero out).\n\t\t\t// Finish if the scale equals or crosses 1 (making the old*new product non-positive).\n\t\t\tjQuery.style( elem, prop, initialInUnit + unit );\n\t\t\tif ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) {\n\t\t\t\tmaxIterations = 0;\n\t\t\t}\n\t\t\tinitialInUnit = initialInUnit / scale;\n\n\t\t}\n\n\t\tinitialInUnit = initialInUnit * 2;\n\t\tjQuery.style( elem, prop, initialInUnit + unit );\n\n\t\t// Make sure we update the tween properties later on\n\t\tvalueParts = valueParts || [];\n\t}\n\n\tif ( valueParts ) {\n\t\tinitialInUnit = +initialInUnit || +initial || 0;\n\n\t\t// Apply relative offset (+=/-=) if specified\n\t\tadjusted = valueParts[ 1 ] ?\n\t\t\tinitialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :\n\t\t\t+valueParts[ 2 ];\n\t\tif ( tween ) {\n\t\t\ttween.unit = unit;\n\t\t\ttween.start = initialInUnit;\n\t\t\ttween.end = adjusted;\n\t\t}\n\t}\n\treturn adjusted;\n}\n\n\nvar defaultDisplayMap = {};\n\nfunction getDefaultDisplay( elem ) {\n\tvar temp,\n\t\tdoc = elem.ownerDocument,\n\t\tnodeName = elem.nodeName,\n\t\tdisplay = defaultDisplayMap[ nodeName ];\n\n\tif ( display ) {\n\t\treturn display;\n\t}\n\n\ttemp = doc.body.appendChild( doc.createElement( nodeName ) );\n\tdisplay = jQuery.css( temp, \"display\" );\n\n\ttemp.parentNode.removeChild( temp );\n\n\tif ( display === \"none\" ) {\n\t\tdisplay = \"block\";\n\t}\n\tdefaultDisplayMap[ nodeName ] = display;\n\n\treturn display;\n}\n\nfunction showHide( elements, show ) {\n\tvar display, elem,\n\t\tvalues = [],\n\t\tindex = 0,\n\t\tlength = elements.length;\n\n\t// Determine new display value for elements that need to change\n\tfor ( ; index < length; index++ ) {\n\t\telem = elements[ index ];\n\t\tif ( !elem.style ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tdisplay = elem.style.display;\n\t\tif ( show ) {\n\n\t\t\t// Since we force visibility upon cascade-hidden elements, an immediate (and slow)\n\t\t\t// check is required in this first loop unless we have a nonempty display value (either\n\t\t\t// inline or about-to-be-restored)\n\t\t\tif ( display === \"none\" ) {\n\t\t\t\tvalues[ index ] = dataPriv.get( elem, \"display\" ) || null;\n\t\t\t\tif ( !values[ index ] ) {\n\t\t\t\t\telem.style.display = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( elem.style.display === \"\" && isHiddenWithinTree( elem ) ) {\n\t\t\t\tvalues[ index ] = getDefaultDisplay( elem );\n\t\t\t}\n\t\t} else {\n\t\t\tif ( display !== \"none\" ) {\n\t\t\t\tvalues[ index ] = \"none\";\n\n\t\t\t\t// Remember what we're overwriting\n\t\t\t\tdataPriv.set( elem, \"display\", display );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Set the display of the elements in a second loop to avoid constant reflow\n\tfor ( index = 0; index < length; index++ ) {\n\t\tif ( values[ index ] != null ) {\n\t\t\telements[ index ].style.display = values[ index ];\n\t\t}\n\t}\n\n\treturn elements;\n}\n\njQuery.fn.extend( {\n\tshow: function() {\n\t\treturn showHide( this, true );\n\t},\n\thide: function() {\n\t\treturn showHide( this );\n\t},\n\ttoggle: function( state ) {\n\t\tif ( typeof state === \"boolean\" ) {\n\t\t\treturn state ? this.show() : this.hide();\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tif ( isHiddenWithinTree( this ) ) {\n\t\t\t\tjQuery( this ).show();\n\t\t\t} else {\n\t\t\t\tjQuery( this ).hide();\n\t\t\t}\n\t\t} );\n\t}\n} );\nvar rcheckableType = ( /^(?:checkbox|radio)$/i );\n\nvar rtagName = ( /<([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]*)/i );\n\nvar rscriptType = ( /^$|^module$|\\/(?:java|ecma)script/i );\n\n\n\n( function() {\n\tvar fragment = document.createDocumentFragment(),\n\t\tdiv = fragment.appendChild( document.createElement( \"div\" ) ),\n\t\tinput = document.createElement( \"input\" );\n\n\t// Support: Android 4.0 - 4.3 only\n\t// Check state lost if the name is set (trac-11217)\n\t// Support: Windows Web Apps (WWA)\n\t// `name` and `type` must use .setAttribute for WWA (trac-14901)\n\tinput.setAttribute( \"type\", \"radio\" );\n\tinput.setAttribute( \"checked\", \"checked\" );\n\tinput.setAttribute( \"name\", \"t\" );\n\n\tdiv.appendChild( input );\n\n\t// Support: Android <=4.1 only\n\t// Older WebKit doesn't clone checked state correctly in fragments\n\tsupport.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;\n\n\t// Support: IE <=11 only\n\t// Make sure textarea (and checkbox) defaultValue is properly cloned\n\tdiv.innerHTML = \"<textarea>x</textarea>\";\n\tsupport.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;\n\n\t// Support: IE <=9 only\n\t// IE <=9 replaces <option> tags with their contents when inserted outside of\n\t// the select element.\n\tdiv.innerHTML = \"<option></option>\";\n\tsupport.option = !!div.lastChild;\n} )();\n\n\n// We have to close these tags to support XHTML (trac-13200)\nvar wrapMap = {\n\n\t// XHTML parsers do not magically insert elements in the\n\t// same way that tag soup parsers do. So we cannot shorten\n\t// this by omitting <tbody> or other required elements.\n\tthead: [ 1, \"<table>\", \"</table>\" ],\n\tcol: [ 2, \"<table><colgroup>\", \"</colgroup></table>\" ],\n\ttr: [ 2, \"<table><tbody>\", \"</tbody></table>\" ],\n\ttd: [ 3, \"<table><tbody><tr>\", \"</tr></tbody></table>\" ],\n\n\t_default: [ 0, \"\", \"\" ]\n};\n\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\nwrapMap.th = wrapMap.td;\n\n// Support: IE <=9 only\nif ( !support.option ) {\n\twrapMap.optgroup = wrapMap.option = [ 1, \"<select multiple='multiple'>\", \"</select>\" ];\n}\n\n\nfunction getAll( context, tag ) {\n\n\t// Support: IE <=9 - 11 only\n\t// Use typeof to avoid zero-argument method invocation on host objects (trac-15151)\n\tvar ret;\n\n\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\tret = context.getElementsByTagName( tag || \"*\" );\n\n\t} else if ( typeof context.querySelectorAll !== \"undefined\" ) {\n\t\tret = context.querySelectorAll( tag || \"*\" );\n\n\t} else {\n\t\tret = [];\n\t}\n\n\tif ( tag === undefined || tag && nodeName( context, tag ) ) {\n\t\treturn jQuery.merge( [ context ], ret );\n\t}\n\n\treturn ret;\n}\n\n\n// Mark scripts as having already been evaluated\nfunction setGlobalEval( elems, refElements ) {\n\tvar i = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\tdataPriv.set(\n\t\t\telems[ i ],\n\t\t\t\"globalEval\",\n\t\t\t!refElements || dataPriv.get( refElements[ i ], \"globalEval\" )\n\t\t);\n\t}\n}\n\n\nvar rhtml = /<|&#?\\w+;/;\n\nfunction buildFragment( elems, context, scripts, selection, ignored ) {\n\tvar elem, tmp, tag, wrap, attached, j,\n\t\tfragment = context.createDocumentFragment(),\n\t\tnodes = [],\n\t\ti = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\telem = elems[ i ];\n\n\t\tif ( elem || elem === 0 ) {\n\n\t\t\t// Add nodes directly\n\t\t\tif ( toType( elem ) === \"object\" ) {\n\n\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );\n\n\t\t\t// Convert non-html into a text node\n\t\t\t} else if ( !rhtml.test( elem ) ) {\n\t\t\t\tnodes.push( context.createTextNode( elem ) );\n\n\t\t\t// Convert html into DOM nodes\n\t\t\t} else {\n\t\t\t\ttmp = tmp || fragment.appendChild( context.createElement( \"div\" ) );\n\n\t\t\t\t// Deserialize a standard representation\n\t\t\t\ttag = ( rtagName.exec( elem ) || [ \"\", \"\" ] )[ 1 ].toLowerCase();\n\t\t\t\twrap = wrapMap[ tag ] || wrapMap._default;\n\t\t\t\ttmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];\n\n\t\t\t\t// Descend through wrappers to the right content\n\t\t\t\tj = wrap[ 0 ];\n\t\t\t\twhile ( j-- ) {\n\t\t\t\t\ttmp = tmp.lastChild;\n\t\t\t\t}\n\n\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, tmp.childNodes );\n\n\t\t\t\t// Remember the top-level container\n\t\t\t\ttmp = fragment.firstChild;\n\n\t\t\t\t// Ensure the created nodes are orphaned (trac-12392)\n\t\t\t\ttmp.textContent = \"\";\n\t\t\t}\n\t\t}\n\t}\n\n\t// Remove wrapper from fragment\n\tfragment.textContent = \"\";\n\n\ti = 0;\n\twhile ( ( elem = nodes[ i++ ] ) ) {\n\n\t\t// Skip elements already in the context collection (trac-4087)\n\t\tif ( selection && jQuery.inArray( elem, selection ) > -1 ) {\n\t\t\tif ( ignored ) {\n\t\t\t\tignored.push( elem );\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tattached = isAttached( elem );\n\n\t\t// Append to fragment\n\t\ttmp = getAll( fragment.appendChild( elem ), \"script\" );\n\n\t\t// Preserve script evaluation history\n\t\tif ( attached ) {\n\t\t\tsetGlobalEval( tmp );\n\t\t}\n\n\t\t// Capture executables\n\t\tif ( scripts ) {\n\t\t\tj = 0;\n\t\t\twhile ( ( elem = tmp[ j++ ] ) ) {\n\t\t\t\tif ( rscriptType.test( elem.type || \"\" ) ) {\n\t\t\t\t\tscripts.push( elem );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn fragment;\n}\n\n\nvar rtypenamespace = /^([^.]*)(?:\\.(.+)|)/;\n\nfunction returnTrue() {\n\treturn true;\n}\n\nfunction returnFalse() {\n\treturn false;\n}\n\nfunction on( elem, types, selector, data, fn, one ) {\n\tvar origFn, type;\n\n\t// Types can be a map of types/handlers\n\tif ( typeof types === \"object\" ) {\n\n\t\t// ( types-Object, selector, data )\n\t\tif ( typeof selector !== \"string\" ) {\n\n\t\t\t// ( types-Object, data )\n\t\t\tdata = data || selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tfor ( type in types ) {\n\t\t\ton( elem, type, selector, data, types[ type ], one );\n\t\t}\n\t\treturn elem;\n\t}\n\n\tif ( data == null && fn == null ) {\n\n\t\t// ( types, fn )\n\t\tfn = selector;\n\t\tdata = selector = undefined;\n\t} else if ( fn == null ) {\n\t\tif ( typeof selector === \"string\" ) {\n\n\t\t\t// ( types, selector, fn )\n\t\t\tfn = data;\n\t\t\tdata = undefined;\n\t\t} else {\n\n\t\t\t// ( types, data, fn )\n\t\t\tfn = data;\n\t\t\tdata = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t}\n\tif ( fn === false ) {\n\t\tfn = returnFalse;\n\t} else if ( !fn ) {\n\t\treturn elem;\n\t}\n\n\tif ( one === 1 ) {\n\t\torigFn = fn;\n\t\tfn = function( event ) {\n\n\t\t\t// Can use an empty set, since event contains the info\n\t\t\tjQuery().off( event );\n\t\t\treturn origFn.apply( this, arguments );\n\t\t};\n\n\t\t// Use same guid so caller can remove using origFn\n\t\tfn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\n\t}\n\treturn elem.each( function() {\n\t\tjQuery.event.add( this, types, fn, data, selector );\n\t} );\n}\n\n/*\n * Helper functions for managing events -- not part of the public interface.\n * Props to Dean Edwards' addEvent library for many of the ideas.\n */\njQuery.event = {\n\n\tglobal: {},\n\n\tadd: function( elem, types, handler, data, selector ) {\n\n\t\tvar handleObjIn, eventHandle, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.get( elem );\n\n\t\t// Only attach events to objects that accept data\n\t\tif ( !acceptData( elem ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Caller can pass in an object of custom data in lieu of the handler\n\t\tif ( handler.handler ) {\n\t\t\thandleObjIn = handler;\n\t\t\thandler = handleObjIn.handler;\n\t\t\tselector = handleObjIn.selector;\n\t\t}\n\n\t\t// Ensure that invalid selectors throw exceptions at attach time\n\t\t// Evaluate against documentElement in case elem is a non-element node (e.g., document)\n\t\tif ( selector ) {\n\t\t\tjQuery.find.matchesSelector( documentElement, selector );\n\t\t}\n\n\t\t// Make sure that the handler has a unique ID, used to find/remove it later\n\t\tif ( !handler.guid ) {\n\t\t\thandler.guid = jQuery.guid++;\n\t\t}\n\n\t\t// Init the element's event structure and main handler, if this is the first\n\t\tif ( !( events = elemData.events ) ) {\n\t\t\tevents = elemData.events = Object.create( null );\n\t\t}\n\t\tif ( !( eventHandle = elemData.handle ) ) {\n\t\t\teventHandle = elemData.handle = function( e ) {\n\n\t\t\t\t// Discard the second event of a jQuery.event.trigger() and\n\t\t\t\t// when an event is called after a page has unloaded\n\t\t\t\treturn typeof jQuery !== \"undefined\" && jQuery.event.triggered !== e.type ?\n\t\t\t\t\tjQuery.event.dispatch.apply( elem, arguments ) : undefined;\n\t\t\t};\n\t\t}\n\n\t\t// Handle multiple events separated by a space\n\t\ttypes = ( types || \"\" ).match( rnothtmlwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// There *must* be a type, no attaching namespace-only handlers\n\t\t\tif ( !type ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If event changes its type, use the special event handlers for the changed type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// If selector defined, determine special event api type, otherwise given type\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\n\t\t\t// Update special based on newly reset type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// handleObj is passed to all event handlers\n\t\t\thandleObj = jQuery.extend( {\n\t\t\t\ttype: type,\n\t\t\t\torigType: origType,\n\t\t\t\tdata: data,\n\t\t\t\thandler: handler,\n\t\t\t\tguid: handler.guid,\n\t\t\t\tselector: selector,\n\t\t\t\tneedsContext: selector && jQuery.expr.match.needsContext.test( selector ),\n\t\t\t\tnamespace: namespaces.join( \".\" )\n\t\t\t}, handleObjIn );\n\n\t\t\t// Init the event handler queue if we're the first\n\t\t\tif ( !( handlers = events[ type ] ) ) {\n\t\t\t\thandlers = events[ type ] = [];\n\t\t\t\thandlers.delegateCount = 0;\n\n\t\t\t\t// Only use addEventListener if the special events handler returns false\n\t\t\t\tif ( !special.setup ||\n\t\t\t\t\tspecial.setup.call( elem, data, namespaces, eventHandle ) === false ) {\n\n\t\t\t\t\tif ( elem.addEventListener ) {\n\t\t\t\t\t\telem.addEventListener( type, eventHandle );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( special.add ) {\n\t\t\t\tspecial.add.call( elem, handleObj );\n\n\t\t\t\tif ( !handleObj.handler.guid ) {\n\t\t\t\t\thandleObj.handler.guid = handler.guid;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add to the element's handler list, delegates in front\n\t\t\tif ( selector ) {\n\t\t\t\thandlers.splice( handlers.delegateCount++, 0, handleObj );\n\t\t\t} else {\n\t\t\t\thandlers.push( handleObj );\n\t\t\t}\n\n\t\t\t// Keep track of which events have ever been used, for event optimization\n\t\t\tjQuery.event.global[ type ] = true;\n\t\t}\n\n\t},\n\n\t// Detach an event or set of events from an element\n\tremove: function( elem, types, handler, selector, mappedTypes ) {\n\n\t\tvar j, origCount, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.hasData( elem ) && dataPriv.get( elem );\n\n\t\tif ( !elemData || !( events = elemData.events ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Once for each type.namespace in types; type may be omitted\n\t\ttypes = ( types || \"\" ).match( rnothtmlwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// Unbind all events (on this namespace, if provided) for the element\n\t\t\tif ( !type ) {\n\t\t\t\tfor ( type in events ) {\n\t\t\t\t\tjQuery.event.remove( elem, type + types[ t ], handler, selector, true );\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\t\t\thandlers = events[ type ] || [];\n\t\t\ttmp = tmp[ 2 ] &&\n\t\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" );\n\n\t\t\t// Remove matching events\n\t\t\torigCount = j = handlers.length;\n\t\t\twhile ( j-- ) {\n\t\t\t\thandleObj = handlers[ j ];\n\n\t\t\t\tif ( ( mappedTypes || origType === handleObj.origType ) &&\n\t\t\t\t\t( !handler || handler.guid === handleObj.guid ) &&\n\t\t\t\t\t( !tmp || tmp.test( handleObj.namespace ) ) &&\n\t\t\t\t\t( !selector || selector === handleObj.selector ||\n\t\t\t\t\t\tselector === \"**\" && handleObj.selector ) ) {\n\t\t\t\t\thandlers.splice( j, 1 );\n\n\t\t\t\t\tif ( handleObj.selector ) {\n\t\t\t\t\t\thandlers.delegateCount--;\n\t\t\t\t\t}\n\t\t\t\t\tif ( special.remove ) {\n\t\t\t\t\t\tspecial.remove.call( elem, handleObj );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove generic event handler if we removed something and no more handlers exist\n\t\t\t// (avoids potential for endless recursion during removal of special event handlers)\n\t\t\tif ( origCount && !handlers.length ) {\n\t\t\t\tif ( !special.teardown ||\n\t\t\t\t\tspecial.teardown.call( elem, namespaces, elemData.handle ) === false ) {\n\n\t\t\t\t\tjQuery.removeEvent( elem, type, elemData.handle );\n\t\t\t\t}\n\n\t\t\t\tdelete events[ type ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove data and the expando if it's no longer used\n\t\tif ( jQuery.isEmptyObject( events ) ) {\n\t\t\tdataPriv.remove( elem, \"handle events\" );\n\t\t}\n\t},\n\n\tdispatch: function( nativeEvent ) {\n\n\t\tvar i, j, ret, matched, handleObj, handlerQueue,\n\t\t\targs = new Array( arguments.length ),\n\n\t\t\t// Make a writable jQuery.Event from the native event object\n\t\t\tevent = jQuery.event.fix( nativeEvent ),\n\n\t\t\thandlers = (\n\t\t\t\tdataPriv.get( this, \"events\" ) || Object.create( null )\n\t\t\t)[ event.type ] || [],\n\t\t\tspecial = jQuery.event.special[ event.type ] || {};\n\n\t\t// Use the fix-ed jQuery.Event rather than the (read-only) native event\n\t\targs[ 0 ] = event;\n\n\t\tfor ( i = 1; i < arguments.length; i++ ) {\n\t\t\targs[ i ] = arguments[ i ];\n\t\t}\n\n\t\tevent.delegateTarget = this;\n\n\t\t// Call the preDispatch hook for the mapped type, and let it bail if desired\n\t\tif ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine handlers\n\t\thandlerQueue = jQuery.event.handlers.call( this, event, handlers );\n\n\t\t// Run delegates first; they may want to stop propagation beneath us\n\t\ti = 0;\n\t\twhile ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {\n\t\t\tevent.currentTarget = matched.elem;\n\n\t\t\tj = 0;\n\t\t\twhile ( ( handleObj = matched.handlers[ j++ ] ) &&\n\t\t\t\t!event.isImmediatePropagationStopped() ) {\n\n\t\t\t\t// If the event is namespaced, then each handler is only invoked if it is\n\t\t\t\t// specially universal or its namespaces are a superset of the event's.\n\t\t\t\tif ( !event.rnamespace || handleObj.namespace === false ||\n\t\t\t\t\tevent.rnamespace.test( handleObj.namespace ) ) {\n\n\t\t\t\t\tevent.handleObj = handleObj;\n\t\t\t\t\tevent.data = handleObj.data;\n\n\t\t\t\t\tret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||\n\t\t\t\t\t\thandleObj.handler ).apply( matched.elem, args );\n\n\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\tif ( ( event.result = ret ) === false ) {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Call the postDispatch hook for the mapped type\n\t\tif ( special.postDispatch ) {\n\t\t\tspecial.postDispatch.call( this, event );\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\thandlers: function( event, handlers ) {\n\t\tvar i, handleObj, sel, matchedHandlers, matchedSelectors,\n\t\t\thandlerQueue = [],\n\t\t\tdelegateCount = handlers.delegateCount,\n\t\t\tcur = event.target;\n\n\t\t// Find delegate handlers\n\t\tif ( delegateCount &&\n\n\t\t\t// Support: IE <=9\n\t\t\t// Black-hole SVG <use> instance trees (trac-13180)\n\t\t\tcur.nodeType &&\n\n\t\t\t// Support: Firefox <=42\n\t\t\t// Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)\n\t\t\t// https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click\n\t\t\t// Support: IE 11 only\n\t\t\t// ...but not arrow key \"clicks\" of radio inputs, which can have `button` -1 (gh-2343)\n\t\t\t!( event.type === \"click\" && event.button >= 1 ) ) {\n\n\t\t\tfor ( ; cur !== this; cur = cur.parentNode || this ) {\n\n\t\t\t\t// Don't check non-elements (trac-13208)\n\t\t\t\t// Don't process clicks on disabled elements (trac-6911, trac-8165, trac-11382, trac-11764)\n\t\t\t\tif ( cur.nodeType === 1 && !( event.type === \"click\" && cur.disabled === true ) ) {\n\t\t\t\t\tmatchedHandlers = [];\n\t\t\t\t\tmatchedSelectors = {};\n\t\t\t\t\tfor ( i = 0; i < delegateCount; i++ ) {\n\t\t\t\t\t\thandleObj = handlers[ i ];\n\n\t\t\t\t\t\t// Don't conflict with Object.prototype properties (trac-13203)\n\t\t\t\t\t\tsel = handleObj.selector + \" \";\n\n\t\t\t\t\t\tif ( matchedSelectors[ sel ] === undefined ) {\n\t\t\t\t\t\t\tmatchedSelectors[ sel ] = handleObj.needsContext ?\n\t\t\t\t\t\t\t\tjQuery( sel, this ).index( cur ) > -1 :\n\t\t\t\t\t\t\t\tjQuery.find( sel, this, null, [ cur ] ).length;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( matchedSelectors[ sel ] ) {\n\t\t\t\t\t\t\tmatchedHandlers.push( handleObj );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( matchedHandlers.length ) {\n\t\t\t\t\t\thandlerQueue.push( { elem: cur, handlers: matchedHandlers } );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Add the remaining (directly-bound) handlers\n\t\tcur = this;\n\t\tif ( delegateCount < handlers.length ) {\n\t\t\thandlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );\n\t\t}\n\n\t\treturn handlerQueue;\n\t},\n\n\taddProp: function( name, hook ) {\n\t\tObject.defineProperty( jQuery.Event.prototype, name, {\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true,\n\n\t\t\tget: isFunction( hook ) ?\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( this.originalEvent ) {\n\t\t\t\t\t\treturn hook( this.originalEvent );\n\t\t\t\t\t}\n\t\t\t\t} :\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( this.originalEvent ) {\n\t\t\t\t\t\treturn this.originalEvent[ name ];\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\tset: function( value ) {\n\t\t\t\tObject.defineProperty( this, name, {\n\t\t\t\t\tenumerable: true,\n\t\t\t\t\tconfigurable: true,\n\t\t\t\t\twritable: true,\n\t\t\t\t\tvalue: value\n\t\t\t\t} );\n\t\t\t}\n\t\t} );\n\t},\n\n\tfix: function( originalEvent ) {\n\t\treturn originalEvent[ jQuery.expando ] ?\n\t\t\toriginalEvent :\n\t\t\tnew jQuery.Event( originalEvent );\n\t},\n\n\tspecial: {\n\t\tload: {\n\n\t\t\t// Prevent triggered image.load events from bubbling to window.load\n\t\t\tnoBubble: true\n\t\t},\n\t\tclick: {\n\n\t\t\t// Utilize native event to ensure correct state for checkable inputs\n\t\t\tsetup: function( data ) {\n\n\t\t\t\t// For mutual compressibility with _default, replace `this` access with a local var.\n\t\t\t\t// `|| data` is dead code meant only to preserve the variable through minification.\n\t\t\t\tvar el = this || data;\n\n\t\t\t\t// Claim the first handler\n\t\t\t\tif ( rcheckableType.test( el.type ) &&\n\t\t\t\t\tel.click && nodeName( el, \"input\" ) ) {\n\n\t\t\t\t\t// dataPriv.set( el, \"click\", ... )\n\t\t\t\t\tleverageNative( el, \"click\", true );\n\t\t\t\t}\n\n\t\t\t\t// Return false to allow normal processing in the caller\n\t\t\t\treturn false;\n\t\t\t},\n\t\t\ttrigger: function( data ) {\n\n\t\t\t\t// For mutual compressibility with _default, replace `this` access with a local var.\n\t\t\t\t// `|| data` is dead code meant only to preserve the variable through minification.\n\t\t\t\tvar el = this || data;\n\n\t\t\t\t// Force setup before triggering a click\n\t\t\t\tif ( rcheckableType.test( el.type ) &&\n\t\t\t\t\tel.click && nodeName( el, \"input\" ) ) {\n\n\t\t\t\t\tleverageNative( el, \"click\" );\n\t\t\t\t}\n\n\t\t\t\t// Return non-false to allow normal event-path propagation\n\t\t\t\treturn true;\n\t\t\t},\n\n\t\t\t// For cross-browser consistency, suppress native .click() on links\n\t\t\t// Also prevent it if we're currently inside a leveraged native-event stack\n\t\t\t_default: function( event ) {\n\t\t\t\tvar target = event.target;\n\t\t\t\treturn rcheckableType.test( target.type ) &&\n\t\t\t\t\ttarget.click && nodeName( target, \"input\" ) &&\n\t\t\t\t\tdataPriv.get( target, \"click\" ) ||\n\t\t\t\t\tnodeName( target, \"a\" );\n\t\t\t}\n\t\t},\n\n\t\tbeforeunload: {\n\t\t\tpostDispatch: function( event ) {\n\n\t\t\t\t// Support: Firefox 20+\n\t\t\t\t// Firefox doesn't alert if the returnValue field is not set.\n\t\t\t\tif ( event.result !== undefined && event.originalEvent ) {\n\t\t\t\t\tevent.originalEvent.returnValue = event.result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Ensure the presence of an event listener that handles manually-triggered\n// synthetic events by interrupting progress until reinvoked in response to\n// *native* events that it fires directly, ensuring that state changes have\n// already occurred before other listeners are invoked.\nfunction leverageNative( el, type, isSetup ) {\n\n\t// Missing `isSetup` indicates a trigger call, which must force setup through jQuery.event.add\n\tif ( !isSetup ) {\n\t\tif ( dataPriv.get( el, type ) === undefined ) {\n\t\t\tjQuery.event.add( el, type, returnTrue );\n\t\t}\n\t\treturn;\n\t}\n\n\t// Register the controller as a special universal handler for all event namespaces\n\tdataPriv.set( el, type, false );\n\tjQuery.event.add( el, type, {\n\t\tnamespace: false,\n\t\thandler: function( event ) {\n\t\t\tvar result,\n\t\t\t\tsaved = dataPriv.get( this, type );\n\n\t\t\tif ( ( event.isTrigger & 1 ) && this[ type ] ) {\n\n\t\t\t\t// Interrupt processing of the outer synthetic .trigger()ed event\n\t\t\t\tif ( !saved ) {\n\n\t\t\t\t\t// Store arguments for use when handling the inner native event\n\t\t\t\t\t// There will always be at least one argument (an event object), so this array\n\t\t\t\t\t// will not be confused with a leftover capture object.\n\t\t\t\t\tsaved = slice.call( arguments );\n\t\t\t\t\tdataPriv.set( this, type, saved );\n\n\t\t\t\t\t// Trigger the native event and capture its result\n\t\t\t\t\tthis[ type ]();\n\t\t\t\t\tresult = dataPriv.get( this, type );\n\t\t\t\t\tdataPriv.set( this, type, false );\n\n\t\t\t\t\tif ( saved !== result ) {\n\n\t\t\t\t\t\t// Cancel the outer synthetic event\n\t\t\t\t\t\tevent.stopImmediatePropagation();\n\t\t\t\t\t\tevent.preventDefault();\n\n\t\t\t\t\t\treturn result;\n\t\t\t\t\t}\n\n\t\t\t\t// If this is an inner synthetic event for an event with a bubbling surrogate\n\t\t\t\t// (focus or blur), assume that the surrogate already propagated from triggering\n\t\t\t\t// the native event and prevent that from happening again here.\n\t\t\t\t// This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the\n\t\t\t\t// bubbling surrogate propagates *after* the non-bubbling base), but that seems\n\t\t\t\t// less bad than duplication.\n\t\t\t\t} else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) {\n\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t}\n\n\t\t\t// If this is a native event triggered above, everything is now in order\n\t\t\t// Fire an inner synthetic event with the original arguments\n\t\t\t} else if ( saved ) {\n\n\t\t\t\t// ...and capture the result\n\t\t\t\tdataPriv.set( this, type, jQuery.event.trigger(\n\t\t\t\t\tsaved[ 0 ],\n\t\t\t\t\tsaved.slice( 1 ),\n\t\t\t\t\tthis\n\t\t\t\t) );\n\n\t\t\t\t// Abort handling of the native event by all jQuery handlers while allowing\n\t\t\t\t// native handlers on the same element to run. On target, this is achieved\n\t\t\t\t// by stopping immediate propagation just on the jQuery event. However,\n\t\t\t\t// the native event is re-wrapped by a jQuery one on each level of the\n\t\t\t\t// propagation so the only way to stop it for jQuery is to stop it for\n\t\t\t\t// everyone via native `stopPropagation()`. This is not a problem for\n\t\t\t\t// focus/blur which don't bubble, but it does also stop click on checkboxes\n\t\t\t\t// and radios. We accept this limitation.\n\t\t\t\tevent.stopPropagation();\n\t\t\t\tevent.isImmediatePropagationStopped = returnTrue;\n\t\t\t}\n\t\t}\n\t} );\n}\n\njQuery.removeEvent = function( elem, type, handle ) {\n\n\t// This \"if\" is needed for plain objects\n\tif ( elem.removeEventListener ) {\n\t\telem.removeEventListener( type, handle );\n\t}\n};\n\njQuery.Event = function( src, props ) {\n\n\t// Allow instantiation without the 'new' keyword\n\tif ( !( this instanceof jQuery.Event ) ) {\n\t\treturn new jQuery.Event( src, props );\n\t}\n\n\t// Event object\n\tif ( src && src.type ) {\n\t\tthis.originalEvent = src;\n\t\tthis.type = src.type;\n\n\t\t// Events bubbling up the document may have been marked as prevented\n\t\t// by a handler lower down the tree; reflect the correct value.\n\t\tthis.isDefaultPrevented = src.defaultPrevented ||\n\t\t\t\tsrc.defaultPrevented === undefined &&\n\n\t\t\t\t// Support: Android <=2.3 only\n\t\t\t\tsrc.returnValue === false ?\n\t\t\treturnTrue :\n\t\t\treturnFalse;\n\n\t\t// Create target properties\n\t\t// Support: Safari <=6 - 7 only\n\t\t// Target should not be a text node (trac-504, trac-13143)\n\t\tthis.target = ( src.target && src.target.nodeType === 3 ) ?\n\t\t\tsrc.target.parentNode :\n\t\t\tsrc.target;\n\n\t\tthis.currentTarget = src.currentTarget;\n\t\tthis.relatedTarget = src.relatedTarget;\n\n\t// Event type\n\t} else {\n\t\tthis.type = src;\n\t}\n\n\t// Put explicitly provided properties onto the event object\n\tif ( props ) {\n\t\tjQuery.extend( this, props );\n\t}\n\n\t// Create a timestamp if incoming event doesn't have one\n\tthis.timeStamp = src && src.timeStamp || Date.now();\n\n\t// Mark it as fixed\n\tthis[ jQuery.expando ] = true;\n};\n\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\n// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\njQuery.Event.prototype = {\n\tconstructor: jQuery.Event,\n\tisDefaultPrevented: returnFalse,\n\tisPropagationStopped: returnFalse,\n\tisImmediatePropagationStopped: returnFalse,\n\tisSimulated: false,\n\n\tpreventDefault: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isDefaultPrevented = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.preventDefault();\n\t\t}\n\t},\n\tstopPropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isPropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopPropagation();\n\t\t}\n\t},\n\tstopImmediatePropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isImmediatePropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopImmediatePropagation();\n\t\t}\n\n\t\tthis.stopPropagation();\n\t}\n};\n\n// Includes all common event props including KeyEvent and MouseEvent specific props\njQuery.each( {\n\taltKey: true,\n\tbubbles: true,\n\tcancelable: true,\n\tchangedTouches: true,\n\tctrlKey: true,\n\tdetail: true,\n\teventPhase: true,\n\tmetaKey: true,\n\tpageX: true,\n\tpageY: true,\n\tshiftKey: true,\n\tview: true,\n\t\"char\": true,\n\tcode: true,\n\tcharCode: true,\n\tkey: true,\n\tkeyCode: true,\n\tbutton: true,\n\tbuttons: true,\n\tclientX: true,\n\tclientY: true,\n\toffsetX: true,\n\toffsetY: true,\n\tpointerId: true,\n\tpointerType: true,\n\tscreenX: true,\n\tscreenY: true,\n\ttargetTouches: true,\n\ttoElement: true,\n\ttouches: true,\n\twhich: true\n}, jQuery.event.addProp );\n\njQuery.each( { focus: \"focusin\", blur: \"focusout\" }, function( type, delegateType ) {\n\n\tfunction focusMappedHandler( nativeEvent ) {\n\t\tif ( document.documentMode ) {\n\n\t\t\t// Support: IE 11+\n\t\t\t// Attach a single focusin/focusout handler on the document while someone wants\n\t\t\t// focus/blur. This is because the former are synchronous in IE while the latter\n\t\t\t// are async. In other browsers, all those handlers are invoked synchronously.\n\n\t\t\t// `handle` from private data would already wrap the event, but we need\n\t\t\t// to change the `type` here.\n\t\t\tvar handle = dataPriv.get( this, \"handle\" ),\n\t\t\t\tevent = jQuery.event.fix( nativeEvent );\n\t\t\tevent.type = nativeEvent.type === \"focusin\" ? \"focus\" : \"blur\";\n\t\t\tevent.isSimulated = true;\n\n\t\t\t// First, handle focusin/focusout\n\t\t\thandle( nativeEvent );\n\n\t\t\t// ...then, handle focus/blur\n\t\t\t//\n\t\t\t// focus/blur don't bubble while focusin/focusout do; simulate the former by only\n\t\t\t// invoking the handler at the lower level.\n\t\t\tif ( event.target === event.currentTarget ) {\n\n\t\t\t\t// The setup part calls `leverageNative`, which, in turn, calls\n\t\t\t\t// `jQuery.event.add`, so event handle will already have been set\n\t\t\t\t// by this point.\n\t\t\t\thandle( event );\n\t\t\t}\n\t\t} else {\n\n\t\t\t// For non-IE browsers, attach a single capturing handler on the document\n\t\t\t// while someone wants focusin/focusout.\n\t\t\tjQuery.event.simulate( delegateType, nativeEvent.target,\n\t\t\t\tjQuery.event.fix( nativeEvent ) );\n\t\t}\n\t}\n\n\tjQuery.event.special[ type ] = {\n\n\t\t// Utilize native event if possible so blur/focus sequence is correct\n\t\tsetup: function() {\n\n\t\t\tvar attaches;\n\n\t\t\t// Claim the first handler\n\t\t\t// dataPriv.set( this, \"focus\", ... )\n\t\t\t// dataPriv.set( this, \"blur\", ... )\n\t\t\tleverageNative( this, type, true );\n\n\t\t\tif ( document.documentMode ) {\n\n\t\t\t\t// Support: IE 9 - 11+\n\t\t\t\t// We use the same native handler for focusin & focus (and focusout & blur)\n\t\t\t\t// so we need to coordinate setup & teardown parts between those events.\n\t\t\t\t// Use `delegateType` as the key as `type` is already used by `leverageNative`.\n\t\t\t\tattaches = dataPriv.get( this, delegateType );\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tthis.addEventListener( delegateType, focusMappedHandler );\n\t\t\t\t}\n\t\t\t\tdataPriv.set( this, delegateType, ( attaches || 0 ) + 1 );\n\t\t\t} else {\n\n\t\t\t\t// Return false to allow normal processing in the caller\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\t\ttrigger: function() {\n\n\t\t\t// Force setup before trigger\n\t\t\tleverageNative( this, type );\n\n\t\t\t// Return non-false to allow normal event-path propagation\n\t\t\treturn true;\n\t\t},\n\n\t\tteardown: function() {\n\t\t\tvar attaches;\n\n\t\t\tif ( document.documentMode ) {\n\t\t\t\tattaches = dataPriv.get( this, delegateType ) - 1;\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tthis.removeEventListener( delegateType, focusMappedHandler );\n\t\t\t\t\tdataPriv.remove( this, delegateType );\n\t\t\t\t} else {\n\t\t\t\t\tdataPriv.set( this, delegateType, attaches );\n\t\t\t\t}\n\t\t\t} else {\n\n\t\t\t\t// Return false to indicate standard teardown should be applied\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\n\t\t// Suppress native focus or blur if we're currently inside\n\t\t// a leveraged native-event stack\n\t\t_default: function( event ) {\n\t\t\treturn dataPriv.get( event.target, type );\n\t\t},\n\n\t\tdelegateType: delegateType\n\t};\n\n\t// Support: Firefox <=44\n\t// Firefox doesn't have focus(in | out) events\n\t// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787\n\t//\n\t// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1\n\t// focus(in | out) events fire after focus & blur events,\n\t// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order\n\t// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857\n\t//\n\t// Support: IE 9 - 11+\n\t// To preserve relative focusin/focus & focusout/blur event order guaranteed on the 3.x branch,\n\t// attach a single handler for both events in IE.\n\tjQuery.event.special[ delegateType ] = {\n\t\tsetup: function() {\n\n\t\t\t// Handle: regular nodes (via `this.ownerDocument`), window\n\t\t\t// (via `this.document`) & document (via `this`).\n\t\t\tvar doc = this.ownerDocument || this.document || this,\n\t\t\t\tdataHolder = document.documentMode ? this : doc,\n\t\t\t\tattaches = dataPriv.get( dataHolder, delegateType );\n\n\t\t\t// Support: IE 9 - 11+\n\t\t\t// We use the same native handler for focusin & focus (and focusout & blur)\n\t\t\t// so we need to coordinate setup & teardown parts between those events.\n\t\t\t// Use `delegateType` as the key as `type` is already used by `leverageNative`.\n\t\t\tif ( !attaches ) {\n\t\t\t\tif ( document.documentMode ) {\n\t\t\t\t\tthis.addEventListener( delegateType, focusMappedHandler );\n\t\t\t\t} else {\n\t\t\t\t\tdoc.addEventListener( type, focusMappedHandler, true );\n\t\t\t\t}\n\t\t\t}\n\t\t\tdataPriv.set( dataHolder, delegateType, ( attaches || 0 ) + 1 );\n\t\t},\n\t\tteardown: function() {\n\t\t\tvar doc = this.ownerDocument || this.document || this,\n\t\t\t\tdataHolder = document.documentMode ? this : doc,\n\t\t\t\tattaches = dataPriv.get( dataHolder, delegateType ) - 1;\n\n\t\t\tif ( !attaches ) {\n\t\t\t\tif ( document.documentMode ) {\n\t\t\t\t\tthis.removeEventListener( delegateType, focusMappedHandler );\n\t\t\t\t} else {\n\t\t\t\t\tdoc.removeEventListener( type, focusMappedHandler, true );\n\t\t\t\t}\n\t\t\t\tdataPriv.remove( dataHolder, delegateType );\n\t\t\t} else {\n\t\t\t\tdataPriv.set( dataHolder, delegateType, attaches );\n\t\t\t}\n\t\t}\n\t};\n} );\n\n// Create mouseenter/leave events using mouseover/out and event-time checks\n// so that event delegation works in jQuery.\n// Do the same for pointerenter/pointerleave and pointerover/pointerout\n//\n// Support: Safari 7 only\n// Safari sends mouseenter too often; see:\n// https://bugs.chromium.org/p/chromium/issues/detail?id=470258\n// for the description of the bug (it existed in older Chrome versions as well).\njQuery.each( {\n\tmouseenter: \"mouseover\",\n\tmouseleave: \"mouseout\",\n\tpointerenter: \"pointerover\",\n\tpointerleave: \"pointerout\"\n}, function( orig, fix ) {\n\tjQuery.event.special[ orig ] = {\n\t\tdelegateType: fix,\n\t\tbindType: fix,\n\n\t\thandle: function( event ) {\n\t\t\tvar ret,\n\t\t\t\ttarget = this,\n\t\t\t\trelated = event.relatedTarget,\n\t\t\t\thandleObj = event.handleObj;\n\n\t\t\t// For mouseenter/leave call the handler if related is outside the target.\n\t\t\t// NB: No relatedTarget if the mouse left/entered the browser window\n\t\t\tif ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {\n\t\t\t\tevent.type = handleObj.origType;\n\t\t\t\tret = handleObj.handler.apply( this, arguments );\n\t\t\t\tevent.type = fix;\n\t\t\t}\n\t\t\treturn ret;\n\t\t}\n\t};\n} );\n\njQuery.fn.extend( {\n\n\ton: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn );\n\t},\n\tone: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn, 1 );\n\t},\n\toff: function( types, selector, fn ) {\n\t\tvar handleObj, type;\n\t\tif ( types && types.preventDefault && types.handleObj ) {\n\n\t\t\t// ( event )  dispatched jQuery.Event\n\t\t\thandleObj = types.handleObj;\n\t\t\tjQuery( types.delegateTarget ).off(\n\t\t\t\thandleObj.namespace ?\n\t\t\t\t\thandleObj.origType + \".\" + handleObj.namespace :\n\t\t\t\t\thandleObj.origType,\n\t\t\t\thandleObj.selector,\n\t\t\t\thandleObj.handler\n\t\t\t);\n\t\t\treturn this;\n\t\t}\n\t\tif ( typeof types === \"object\" ) {\n\n\t\t\t// ( types-object [, selector] )\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.off( type, selector, types[ type ] );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\tif ( selector === false || typeof selector === \"function\" ) {\n\n\t\t\t// ( types [, fn] )\n\t\t\tfn = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.remove( this, types, fn, selector );\n\t\t} );\n\t}\n} );\n\n\nvar\n\n\t// Support: IE <=10 - 11, Edge 12 - 13 only\n\t// In IE/Edge using regex groups here causes severe slowdowns.\n\t// See https://connect.microsoft.com/IE/feedback/details/1736512/\n\trnoInnerhtml = /<script|<style|<link/i,\n\n\t// checked=\"checked\" or checked\n\trchecked = /checked\\s*(?:[^=]|=\\s*.checked.)/i,\n\n\trcleanScript = /^\\s*<!\\[CDATA\\[|\\]\\]>\\s*$/g;\n\n// Prefer a tbody over its parent table for containing new rows\nfunction manipulationTarget( elem, content ) {\n\tif ( nodeName( elem, \"table\" ) &&\n\t\tnodeName( content.nodeType !== 11 ? content : content.firstChild, \"tr\" ) ) {\n\n\t\treturn jQuery( elem ).children( \"tbody\" )[ 0 ] || elem;\n\t}\n\n\treturn elem;\n}\n\n// Replace/restore the type attribute of script elements for safe DOM manipulation\nfunction disableScript( elem ) {\n\telem.type = ( elem.getAttribute( \"type\" ) !== null ) + \"/\" + elem.type;\n\treturn elem;\n}\nfunction restoreScript( elem ) {\n\tif ( ( elem.type || \"\" ).slice( 0, 5 ) === \"true/\" ) {\n\t\telem.type = elem.type.slice( 5 );\n\t} else {\n\t\telem.removeAttribute( \"type\" );\n\t}\n\n\treturn elem;\n}\n\nfunction cloneCopyEvent( src, dest ) {\n\tvar i, l, type, pdataOld, udataOld, udataCur, events;\n\n\tif ( dest.nodeType !== 1 ) {\n\t\treturn;\n\t}\n\n\t// 1. Copy private data: events, handlers, etc.\n\tif ( dataPriv.hasData( src ) ) {\n\t\tpdataOld = dataPriv.get( src );\n\t\tevents = pdataOld.events;\n\n\t\tif ( events ) {\n\t\t\tdataPriv.remove( dest, \"handle events\" );\n\n\t\t\tfor ( type in events ) {\n\t\t\t\tfor ( i = 0, l = events[ type ].length; i < l; i++ ) {\n\t\t\t\t\tjQuery.event.add( dest, type, events[ type ][ i ] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// 2. Copy user data\n\tif ( dataUser.hasData( src ) ) {\n\t\tudataOld = dataUser.access( src );\n\t\tudataCur = jQuery.extend( {}, udataOld );\n\n\t\tdataUser.set( dest, udataCur );\n\t}\n}\n\n// Fix IE bugs, see support tests\nfunction fixInput( src, dest ) {\n\tvar nodeName = dest.nodeName.toLowerCase();\n\n\t// Fails to persist the checked state of a cloned checkbox or radio button.\n\tif ( nodeName === \"input\" && rcheckableType.test( src.type ) ) {\n\t\tdest.checked = src.checked;\n\n\t// Fails to return the selected option to the default selected state when cloning options\n\t} else if ( nodeName === \"input\" || nodeName === \"textarea\" ) {\n\t\tdest.defaultValue = src.defaultValue;\n\t}\n}\n\nfunction domManip( collection, args, callback, ignored ) {\n\n\t// Flatten any nested arrays\n\targs = flat( args );\n\n\tvar fragment, first, scripts, hasScripts, node, doc,\n\t\ti = 0,\n\t\tl = collection.length,\n\t\tiNoClone = l - 1,\n\t\tvalue = args[ 0 ],\n\t\tvalueIsFunction = isFunction( value );\n\n\t// We can't cloneNode fragments that contain checked, in WebKit\n\tif ( valueIsFunction ||\n\t\t\t( l > 1 && typeof value === \"string\" &&\n\t\t\t\t!support.checkClone && rchecked.test( value ) ) ) {\n\t\treturn collection.each( function( index ) {\n\t\t\tvar self = collection.eq( index );\n\t\t\tif ( valueIsFunction ) {\n\t\t\t\targs[ 0 ] = value.call( this, index, self.html() );\n\t\t\t}\n\t\t\tdomManip( self, args, callback, ignored );\n\t\t} );\n\t}\n\n\tif ( l ) {\n\t\tfragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );\n\t\tfirst = fragment.firstChild;\n\n\t\tif ( fragment.childNodes.length === 1 ) {\n\t\t\tfragment = first;\n\t\t}\n\n\t\t// Require either new content or an interest in ignored elements to invoke the callback\n\t\tif ( first || ignored ) {\n\t\t\tscripts = jQuery.map( getAll( fragment, \"script\" ), disableScript );\n\t\t\thasScripts = scripts.length;\n\n\t\t\t// Use the original fragment for the last item\n\t\t\t// instead of the first because it can end up\n\t\t\t// being emptied incorrectly in certain situations (trac-8070).\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tnode = fragment;\n\n\t\t\t\tif ( i !== iNoClone ) {\n\t\t\t\t\tnode = jQuery.clone( node, true, true );\n\n\t\t\t\t\t// Keep references to cloned scripts for later restoration\n\t\t\t\t\tif ( hasScripts ) {\n\n\t\t\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\t\t\tjQuery.merge( scripts, getAll( node, \"script\" ) );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcallback.call( collection[ i ], node, i );\n\t\t\t}\n\n\t\t\tif ( hasScripts ) {\n\t\t\t\tdoc = scripts[ scripts.length - 1 ].ownerDocument;\n\n\t\t\t\t// Re-enable scripts\n\t\t\t\tjQuery.map( scripts, restoreScript );\n\n\t\t\t\t// Evaluate executable scripts on first document insertion\n\t\t\t\tfor ( i = 0; i < hasScripts; i++ ) {\n\t\t\t\t\tnode = scripts[ i ];\n\t\t\t\t\tif ( rscriptType.test( node.type || \"\" ) &&\n\t\t\t\t\t\t!dataPriv.access( node, \"globalEval\" ) &&\n\t\t\t\t\t\tjQuery.contains( doc, node ) ) {\n\n\t\t\t\t\t\tif ( node.src && ( node.type || \"\" ).toLowerCase()  !== \"module\" ) {\n\n\t\t\t\t\t\t\t// Optional AJAX dependency, but won't run scripts if not present\n\t\t\t\t\t\t\tif ( jQuery._evalUrl && !node.noModule ) {\n\t\t\t\t\t\t\t\tjQuery._evalUrl( node.src, {\n\t\t\t\t\t\t\t\t\tnonce: node.nonce || node.getAttribute( \"nonce\" )\n\t\t\t\t\t\t\t\t}, doc );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Unwrap a CDATA section containing script contents. This shouldn't be\n\t\t\t\t\t\t\t// needed as in XML documents they're already not visible when\n\t\t\t\t\t\t\t// inspecting element contents and in HTML documents they have no\n\t\t\t\t\t\t\t// meaning but we're preserving that logic for backwards compatibility.\n\t\t\t\t\t\t\t// This will be removed completely in 4.0. See gh-4904.\n\t\t\t\t\t\t\tDOMEval( node.textContent.replace( rcleanScript, \"\" ), node, doc );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn collection;\n}\n\nfunction remove( elem, selector, keepData ) {\n\tvar node,\n\t\tnodes = selector ? jQuery.filter( selector, elem ) : elem,\n\t\ti = 0;\n\n\tfor ( ; ( node = nodes[ i ] ) != null; i++ ) {\n\t\tif ( !keepData && node.nodeType === 1 ) {\n\t\t\tjQuery.cleanData( getAll( node ) );\n\t\t}\n\n\t\tif ( node.parentNode ) {\n\t\t\tif ( keepData && isAttached( node ) ) {\n\t\t\t\tsetGlobalEval( getAll( node, \"script\" ) );\n\t\t\t}\n\t\t\tnode.parentNode.removeChild( node );\n\t\t}\n\t}\n\n\treturn elem;\n}\n\njQuery.extend( {\n\thtmlPrefilter: function( html ) {\n\t\treturn html;\n\t},\n\n\tclone: function( elem, dataAndEvents, deepDataAndEvents ) {\n\t\tvar i, l, srcElements, destElements,\n\t\t\tclone = elem.cloneNode( true ),\n\t\t\tinPage = isAttached( elem );\n\n\t\t// Fix IE cloning issues\n\t\tif ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&\n\t\t\t\t!jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// We eschew jQuery#find here for performance reasons:\n\t\t\t// https://jsperf.com/getall-vs-sizzle/2\n\t\t\tdestElements = getAll( clone );\n\t\t\tsrcElements = getAll( elem );\n\n\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\tfixInput( srcElements[ i ], destElements[ i ] );\n\t\t\t}\n\t\t}\n\n\t\t// Copy the events from the original to the clone\n\t\tif ( dataAndEvents ) {\n\t\t\tif ( deepDataAndEvents ) {\n\t\t\t\tsrcElements = srcElements || getAll( elem );\n\t\t\t\tdestElements = destElements || getAll( clone );\n\n\t\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\t\tcloneCopyEvent( srcElements[ i ], destElements[ i ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcloneCopyEvent( elem, clone );\n\t\t\t}\n\t\t}\n\n\t\t// Preserve script evaluation history\n\t\tdestElements = getAll( clone, \"script\" );\n\t\tif ( destElements.length > 0 ) {\n\t\t\tsetGlobalEval( destElements, !inPage && getAll( elem, \"script\" ) );\n\t\t}\n\n\t\t// Return the cloned set\n\t\treturn clone;\n\t},\n\n\tcleanData: function( elems ) {\n\t\tvar data, elem, type,\n\t\t\tspecial = jQuery.event.special,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {\n\t\t\tif ( acceptData( elem ) ) {\n\t\t\t\tif ( ( data = elem[ dataPriv.expando ] ) ) {\n\t\t\t\t\tif ( data.events ) {\n\t\t\t\t\t\tfor ( type in data.events ) {\n\t\t\t\t\t\t\tif ( special[ type ] ) {\n\t\t\t\t\t\t\t\tjQuery.event.remove( elem, type );\n\n\t\t\t\t\t\t\t// This is a shortcut to avoid jQuery.event.remove's overhead\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tjQuery.removeEvent( elem, type, data.handle );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Support: Chrome <=35 - 45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataPriv.expando ] = undefined;\n\t\t\t\t}\n\t\t\t\tif ( elem[ dataUser.expando ] ) {\n\n\t\t\t\t\t// Support: Chrome <=35 - 45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataUser.expando ] = undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n} );\n\njQuery.fn.extend( {\n\tdetach: function( selector ) {\n\t\treturn remove( this, selector, true );\n\t},\n\n\tremove: function( selector ) {\n\t\treturn remove( this, selector );\n\t},\n\n\ttext: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\treturn value === undefined ?\n\t\t\t\tjQuery.text( this ) :\n\t\t\t\tthis.empty().each( function() {\n\t\t\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\t\t\tthis.textContent = value;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t}, null, value, arguments.length );\n\t},\n\n\tappend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.appendChild( elem );\n\t\t\t}\n\t\t} );\n\t},\n\n\tprepend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.insertBefore( elem, target.firstChild );\n\t\t\t}\n\t\t} );\n\t},\n\n\tbefore: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this );\n\t\t\t}\n\t\t} );\n\t},\n\n\tafter: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this.nextSibling );\n\t\t\t}\n\t\t} );\n\t},\n\n\tempty: function() {\n\t\tvar elem,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = this[ i ] ) != null; i++ ) {\n\t\t\tif ( elem.nodeType === 1 ) {\n\n\t\t\t\t// Prevent memory leaks\n\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\n\t\t\t\t// Remove any remaining nodes\n\t\t\t\telem.textContent = \"\";\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tclone: function( dataAndEvents, deepDataAndEvents ) {\n\t\tdataAndEvents = dataAndEvents == null ? false : dataAndEvents;\n\t\tdeepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\n\n\t\treturn this.map( function() {\n\t\t\treturn jQuery.clone( this, dataAndEvents, deepDataAndEvents );\n\t\t} );\n\t},\n\n\thtml: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\tvar elem = this[ 0 ] || {},\n\t\t\t\ti = 0,\n\t\t\t\tl = this.length;\n\n\t\t\tif ( value === undefined && elem.nodeType === 1 ) {\n\t\t\t\treturn elem.innerHTML;\n\t\t\t}\n\n\t\t\t// See if we can take a shortcut and just use innerHTML\n\t\t\tif ( typeof value === \"string\" && !rnoInnerhtml.test( value ) &&\n\t\t\t\t!wrapMap[ ( rtagName.exec( value ) || [ \"\", \"\" ] )[ 1 ].toLowerCase() ] ) {\n\n\t\t\t\tvalue = jQuery.htmlPrefilter( value );\n\n\t\t\t\ttry {\n\t\t\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\t\t\telem = this[ i ] || {};\n\n\t\t\t\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\t\t\t\t\t\t\telem.innerHTML = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\telem = 0;\n\n\t\t\t\t// If using innerHTML throws an exception, use the fallback method\n\t\t\t\t} catch ( e ) {}\n\t\t\t}\n\n\t\t\tif ( elem ) {\n\t\t\t\tthis.empty().append( value );\n\t\t\t}\n\t\t}, null, value, arguments.length );\n\t},\n\n\treplaceWith: function() {\n\t\tvar ignored = [];\n\n\t\t// Make the changes, replacing each non-ignored context element with the new content\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tvar parent = this.parentNode;\n\n\t\t\tif ( jQuery.inArray( this, ignored ) < 0 ) {\n\t\t\t\tjQuery.cleanData( getAll( this ) );\n\t\t\t\tif ( parent ) {\n\t\t\t\t\tparent.replaceChild( elem, this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Force callback invocation\n\t\t}, ignored );\n\t}\n} );\n\njQuery.each( {\n\tappendTo: \"append\",\n\tprependTo: \"prepend\",\n\tinsertBefore: \"before\",\n\tinsertAfter: \"after\",\n\treplaceAll: \"replaceWith\"\n}, function( name, original ) {\n\tjQuery.fn[ name ] = function( selector ) {\n\t\tvar elems,\n\t\t\tret = [],\n\t\t\tinsert = jQuery( selector ),\n\t\t\tlast = insert.length - 1,\n\t\t\ti = 0;\n\n\t\tfor ( ; i <= last; i++ ) {\n\t\t\telems = i === last ? this : this.clone( true );\n\t\t\tjQuery( insert[ i ] )[ original ]( elems );\n\n\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t// .get() because push.apply(_, arraylike) throws on ancient WebKit\n\t\t\tpush.apply( ret, elems.get() );\n\t\t}\n\n\t\treturn this.pushStack( ret );\n\t};\n} );\nvar rnumnonpx = new RegExp( \"^(\" + pnum + \")(?!px)[a-z%]+$\", \"i\" );\n\nvar rcustomProp = /^--/;\n\n\nvar getStyles = function( elem ) {\n\n\t\t// Support: IE <=11 only, Firefox <=30 (trac-15098, trac-14150)\n\t\t// IE throws on elements created in popups\n\t\t// FF meanwhile throws on frame elements through \"defaultView.getComputedStyle\"\n\t\tvar view = elem.ownerDocument.defaultView;\n\n\t\tif ( !view || !view.opener ) {\n\t\t\tview = window;\n\t\t}\n\n\t\treturn view.getComputedStyle( elem );\n\t};\n\nvar swap = function( elem, options, callback ) {\n\tvar ret, name,\n\t\told = {};\n\n\t// Remember the old values, and insert the new ones\n\tfor ( name in options ) {\n\t\told[ name ] = elem.style[ name ];\n\t\telem.style[ name ] = options[ name ];\n\t}\n\n\tret = callback.call( elem );\n\n\t// Revert the old values\n\tfor ( name in options ) {\n\t\telem.style[ name ] = old[ name ];\n\t}\n\n\treturn ret;\n};\n\n\nvar rboxStyle = new RegExp( cssExpand.join( \"|\" ), \"i\" );\n\n\n\n( function() {\n\n\t// Executing both pixelPosition & boxSizingReliable tests require only one layout\n\t// so they're executed at the same time to save the second computation.\n\tfunction computeStyleTests() {\n\n\t\t// This is a singleton, we need to execute it only once\n\t\tif ( !div ) {\n\t\t\treturn;\n\t\t}\n\n\t\tcontainer.style.cssText = \"position:absolute;left:-11111px;width:60px;\" +\n\t\t\t\"margin-top:1px;padding:0;border:0\";\n\t\tdiv.style.cssText =\n\t\t\t\"position:relative;display:block;box-sizing:border-box;overflow:scroll;\" +\n\t\t\t\"margin:auto;border:1px;padding:1px;\" +\n\t\t\t\"width:60%;top:1%\";\n\t\tdocumentElement.appendChild( container ).appendChild( div );\n\n\t\tvar divStyle = window.getComputedStyle( div );\n\t\tpixelPositionVal = divStyle.top !== \"1%\";\n\n\t\t// Support: Android 4.0 - 4.3 only, Firefox <=3 - 44\n\t\treliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12;\n\n\t\t// Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3\n\t\t// Some styles come back with percentage values, even though they shouldn't\n\t\tdiv.style.right = \"60%\";\n\t\tpixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36;\n\n\t\t// Support: IE 9 - 11 only\n\t\t// Detect misreporting of content dimensions for box-sizing:border-box elements\n\t\tboxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36;\n\n\t\t// Support: IE 9 only\n\t\t// Detect overflow:scroll screwiness (gh-3699)\n\t\t// Support: Chrome <=64\n\t\t// Don't get tricked when zoom affects offsetWidth (gh-4029)\n\t\tdiv.style.position = \"absolute\";\n\t\tscrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12;\n\n\t\tdocumentElement.removeChild( container );\n\n\t\t// Nullify the div so it wouldn't be stored in the memory and\n\t\t// it will also be a sign that checks already performed\n\t\tdiv = null;\n\t}\n\n\tfunction roundPixelMeasures( measure ) {\n\t\treturn Math.round( parseFloat( measure ) );\n\t}\n\n\tvar pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal,\n\t\treliableTrDimensionsVal, reliableMarginLeftVal,\n\t\tcontainer = document.createElement( \"div\" ),\n\t\tdiv = document.createElement( \"div\" );\n\n\t// Finish early in limited (non-browser) environments\n\tif ( !div.style ) {\n\t\treturn;\n\t}\n\n\t// Support: IE <=9 - 11 only\n\t// Style of cloned element affects source element cloned (trac-8908)\n\tdiv.style.backgroundClip = \"content-box\";\n\tdiv.cloneNode( true ).style.backgroundClip = \"\";\n\tsupport.clearCloneStyle = div.style.backgroundClip === \"content-box\";\n\n\tjQuery.extend( support, {\n\t\tboxSizingReliable: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn boxSizingReliableVal;\n\t\t},\n\t\tpixelBoxStyles: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn pixelBoxStylesVal;\n\t\t},\n\t\tpixelPosition: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn pixelPositionVal;\n\t\t},\n\t\treliableMarginLeft: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn reliableMarginLeftVal;\n\t\t},\n\t\tscrollboxSize: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn scrollboxSizeVal;\n\t\t},\n\n\t\t// Support: IE 9 - 11+, Edge 15 - 18+\n\t\t// IE/Edge misreport `getComputedStyle` of table rows with width/height\n\t\t// set in CSS while `offset*` properties report correct values.\n\t\t// Behavior in IE 9 is more subtle than in newer versions & it passes\n\t\t// some versions of this test; make sure not to make it pass there!\n\t\t//\n\t\t// Support: Firefox 70+\n\t\t// Only Firefox includes border widths\n\t\t// in computed dimensions. (gh-4529)\n\t\treliableTrDimensions: function() {\n\t\t\tvar table, tr, trChild, trStyle;\n\t\t\tif ( reliableTrDimensionsVal == null ) {\n\t\t\t\ttable = document.createElement( \"table\" );\n\t\t\t\ttr = document.createElement( \"tr\" );\n\t\t\t\ttrChild = document.createElement( \"div\" );\n\n\t\t\t\ttable.style.cssText = \"position:absolute;left:-11111px;border-collapse:separate\";\n\t\t\t\ttr.style.cssText = \"box-sizing:content-box;border:1px solid\";\n\n\t\t\t\t// Support: Chrome 86+\n\t\t\t\t// Height set through cssText does not get applied.\n\t\t\t\t// Computed height then comes back as 0.\n\t\t\t\ttr.style.height = \"1px\";\n\t\t\t\ttrChild.style.height = \"9px\";\n\n\t\t\t\t// Support: Android 8 Chrome 86+\n\t\t\t\t// In our bodyBackground.html iframe,\n\t\t\t\t// display for all div elements is set to \"inline\",\n\t\t\t\t// which causes a problem only in Android 8 Chrome 86.\n\t\t\t\t// Ensuring the div is `display: block`\n\t\t\t\t// gets around this issue.\n\t\t\t\ttrChild.style.display = \"block\";\n\n\t\t\t\tdocumentElement\n\t\t\t\t\t.appendChild( table )\n\t\t\t\t\t.appendChild( tr )\n\t\t\t\t\t.appendChild( trChild );\n\n\t\t\t\ttrStyle = window.getComputedStyle( tr );\n\t\t\t\treliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) +\n\t\t\t\t\tparseInt( trStyle.borderTopWidth, 10 ) +\n\t\t\t\t\tparseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight;\n\n\t\t\t\tdocumentElement.removeChild( table );\n\t\t\t}\n\t\t\treturn reliableTrDimensionsVal;\n\t\t}\n\t} );\n} )();\n\n\nfunction curCSS( elem, name, computed ) {\n\tvar width, minWidth, maxWidth, ret,\n\t\tisCustomProp = rcustomProp.test( name ),\n\n\t\t// Support: Firefox 51+\n\t\t// Retrieving style before computed somehow\n\t\t// fixes an issue with getting wrong values\n\t\t// on detached elements\n\t\tstyle = elem.style;\n\n\tcomputed = computed || getStyles( elem );\n\n\t// getPropertyValue is needed for:\n\t//   .css('filter') (IE 9 only, trac-12537)\n\t//   .css('--customProperty) (gh-3144)\n\tif ( computed ) {\n\n\t\t// Support: IE <=9 - 11+\n\t\t// IE only supports `\"float\"` in `getPropertyValue`; in computed styles\n\t\t// it's only available as `\"cssFloat\"`. We no longer modify properties\n\t\t// sent to `.css()` apart from camelCasing, so we need to check both.\n\t\t// Normally, this would create difference in behavior: if\n\t\t// `getPropertyValue` returns an empty string, the value returned\n\t\t// by `.css()` would be `undefined`. This is usually the case for\n\t\t// disconnected elements. However, in IE even disconnected elements\n\t\t// with no styles return `\"none\"` for `getPropertyValue( \"float\" )`\n\t\tret = computed.getPropertyValue( name ) || computed[ name ];\n\n\t\tif ( isCustomProp && ret ) {\n\n\t\t\t// Support: Firefox 105+, Chrome <=105+\n\t\t\t// Spec requires trimming whitespace for custom properties (gh-4926).\n\t\t\t// Firefox only trims leading whitespace. Chrome just collapses\n\t\t\t// both leading & trailing whitespace to a single space.\n\t\t\t//\n\t\t\t// Fall back to `undefined` if empty string returned.\n\t\t\t// This collapses a missing definition with property defined\n\t\t\t// and set to an empty string but there's no standard API\n\t\t\t// allowing us to differentiate them without a performance penalty\n\t\t\t// and returning `undefined` aligns with older jQuery.\n\t\t\t//\n\t\t\t// rtrimCSS treats U+000D CARRIAGE RETURN and U+000C FORM FEED\n\t\t\t// as whitespace while CSS does not, but this is not a problem\n\t\t\t// because CSS preprocessing replaces them with U+000A LINE FEED\n\t\t\t// (which *is* CSS whitespace)\n\t\t\t// https://www.w3.org/TR/css-syntax-3/#input-preprocessing\n\t\t\tret = ret.replace( rtrimCSS, \"$1\" ) || undefined;\n\t\t}\n\n\t\tif ( ret === \"\" && !isAttached( elem ) ) {\n\t\t\tret = jQuery.style( elem, name );\n\t\t}\n\n\t\t// A tribute to the \"awesome hack by Dean Edwards\"\n\t\t// Android Browser returns percentage for some values,\n\t\t// but width seems to be reliably pixels.\n\t\t// This is against the CSSOM draft spec:\n\t\t// https://drafts.csswg.org/cssom/#resolved-values\n\t\tif ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) {\n\n\t\t\t// Remember the original values\n\t\t\twidth = style.width;\n\t\t\tminWidth = style.minWidth;\n\t\t\tmaxWidth = style.maxWidth;\n\n\t\t\t// Put in the new values to get a computed value out\n\t\t\tstyle.minWidth = style.maxWidth = style.width = ret;\n\t\t\tret = computed.width;\n\n\t\t\t// Revert the changed values\n\t\t\tstyle.width = width;\n\t\t\tstyle.minWidth = minWidth;\n\t\t\tstyle.maxWidth = maxWidth;\n\t\t}\n\t}\n\n\treturn ret !== undefined ?\n\n\t\t// Support: IE <=9 - 11 only\n\t\t// IE returns zIndex value as an integer.\n\t\tret + \"\" :\n\t\tret;\n}\n\n\nfunction addGetHookIf( conditionFn, hookFn ) {\n\n\t// Define the hook, we'll check on the first run if it's really needed.\n\treturn {\n\t\tget: function() {\n\t\t\tif ( conditionFn() ) {\n\n\t\t\t\t// Hook not needed (or it's not possible to use it due\n\t\t\t\t// to missing dependency), remove it.\n\t\t\t\tdelete this.get;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Hook needed; redefine it so that the support test is not executed again.\n\t\t\treturn ( this.get = hookFn ).apply( this, arguments );\n\t\t}\n\t};\n}\n\n\nvar cssPrefixes = [ \"Webkit\", \"Moz\", \"ms\" ],\n\temptyStyle = document.createElement( \"div\" ).style,\n\tvendorProps = {};\n\n// Return a vendor-prefixed property or undefined\nfunction vendorPropName( name ) {\n\n\t// Check for vendor prefixed names\n\tvar capName = name[ 0 ].toUpperCase() + name.slice( 1 ),\n\t\ti = cssPrefixes.length;\n\n\twhile ( i-- ) {\n\t\tname = cssPrefixes[ i ] + capName;\n\t\tif ( name in emptyStyle ) {\n\t\t\treturn name;\n\t\t}\n\t}\n}\n\n// Return a potentially-mapped jQuery.cssProps or vendor prefixed property\nfunction finalPropName( name ) {\n\tvar final = jQuery.cssProps[ name ] || vendorProps[ name ];\n\n\tif ( final ) {\n\t\treturn final;\n\t}\n\tif ( name in emptyStyle ) {\n\t\treturn name;\n\t}\n\treturn vendorProps[ name ] = vendorPropName( name ) || name;\n}\n\n\nvar\n\n\t// Swappable if display is none or starts with table\n\t// except \"table\", \"table-cell\", or \"table-caption\"\n\t// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display\n\trdisplayswap = /^(none|table(?!-c[ea]).+)/,\n\tcssShow = { position: \"absolute\", visibility: \"hidden\", display: \"block\" },\n\tcssNormalTransform = {\n\t\tletterSpacing: \"0\",\n\t\tfontWeight: \"400\"\n\t};\n\nfunction setPositiveNumber( _elem, value, subtract ) {\n\n\t// Any relative (+/-) values have already been\n\t// normalized at this point\n\tvar matches = rcssNum.exec( value );\n\treturn matches ?\n\n\t\t// Guard against undefined \"subtract\", e.g., when used as in cssHooks\n\t\tMath.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || \"px\" ) :\n\t\tvalue;\n}\n\nfunction boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) {\n\tvar i = dimension === \"width\" ? 1 : 0,\n\t\textra = 0,\n\t\tdelta = 0,\n\t\tmarginDelta = 0;\n\n\t// Adjustment may not be necessary\n\tif ( box === ( isBorderBox ? \"border\" : \"content\" ) ) {\n\t\treturn 0;\n\t}\n\n\tfor ( ; i < 4; i += 2 ) {\n\n\t\t// Both box models exclude margin\n\t\t// Count margin delta separately to only add it after scroll gutter adjustment.\n\t\t// This is needed to make negative margins work with `outerHeight( true )` (gh-3982).\n\t\tif ( box === \"margin\" ) {\n\t\t\tmarginDelta += jQuery.css( elem, box + cssExpand[ i ], true, styles );\n\t\t}\n\n\t\t// If we get here with a content-box, we're seeking \"padding\" or \"border\" or \"margin\"\n\t\tif ( !isBorderBox ) {\n\n\t\t\t// Add padding\n\t\t\tdelta += jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\n\t\t\t// For \"border\" or \"margin\", add border\n\t\t\tif ( box !== \"padding\" ) {\n\t\t\t\tdelta += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\n\t\t\t// But still keep track of it otherwise\n\t\t\t} else {\n\t\t\t\textra += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\n\t\t// If we get here with a border-box (content + padding + border), we're seeking \"content\" or\n\t\t// \"padding\" or \"margin\"\n\t\t} else {\n\n\t\t\t// For \"content\", subtract padding\n\t\t\tif ( box === \"content\" ) {\n\t\t\t\tdelta -= jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\t\t\t}\n\n\t\t\t// For \"content\" or \"padding\", subtract border\n\t\t\tif ( box !== \"margin\" ) {\n\t\t\t\tdelta -= jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Account for positive content-box scroll gutter when requested by providing computedVal\n\tif ( !isBorderBox && computedVal >= 0 ) {\n\n\t\t// offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border\n\t\t// Assuming integer scroll gutter, subtract the rest and round down\n\t\tdelta += Math.max( 0, Math.ceil(\n\t\t\telem[ \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -\n\t\t\tcomputedVal -\n\t\t\tdelta -\n\t\t\textra -\n\t\t\t0.5\n\n\t\t// If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter\n\t\t// Use an explicit zero to avoid NaN (gh-3964)\n\t\t) ) || 0;\n\t}\n\n\treturn delta + marginDelta;\n}\n\nfunction getWidthOrHeight( elem, dimension, extra ) {\n\n\t// Start with computed style\n\tvar styles = getStyles( elem ),\n\n\t\t// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322).\n\t\t// Fake content-box until we know it's needed to know the true value.\n\t\tboxSizingNeeded = !support.boxSizingReliable() || extra,\n\t\tisBorderBox = boxSizingNeeded &&\n\t\t\tjQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\tvalueIsBorderBox = isBorderBox,\n\n\t\tval = curCSS( elem, dimension, styles ),\n\t\toffsetProp = \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 );\n\n\t// Support: Firefox <=54\n\t// Return a confounding non-pixel value or feign ignorance, as appropriate.\n\tif ( rnumnonpx.test( val ) ) {\n\t\tif ( !extra ) {\n\t\t\treturn val;\n\t\t}\n\t\tval = \"auto\";\n\t}\n\n\n\t// Support: IE 9 - 11 only\n\t// Use offsetWidth/offsetHeight for when box sizing is unreliable.\n\t// In those cases, the computed value can be trusted to be border-box.\n\tif ( ( !support.boxSizingReliable() && isBorderBox ||\n\n\t\t// Support: IE 10 - 11+, Edge 15 - 18+\n\t\t// IE/Edge misreport `getComputedStyle` of table rows with width/height\n\t\t// set in CSS while `offset*` properties report correct values.\n\t\t// Interestingly, in some cases IE 9 doesn't suffer from this issue.\n\t\t!support.reliableTrDimensions() && nodeName( elem, \"tr\" ) ||\n\n\t\t// Fall back to offsetWidth/offsetHeight when value is \"auto\"\n\t\t// This happens for inline elements with no explicit setting (gh-3571)\n\t\tval === \"auto\" ||\n\n\t\t// Support: Android <=4.1 - 4.3 only\n\t\t// Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)\n\t\t!parseFloat( val ) && jQuery.css( elem, \"display\", false, styles ) === \"inline\" ) &&\n\n\t\t// Make sure the element is visible & connected\n\t\telem.getClientRects().length ) {\n\n\t\tisBorderBox = jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\";\n\n\t\t// Where available, offsetWidth/offsetHeight approximate border box dimensions.\n\t\t// Where not available (e.g., SVG), assume unreliable box-sizing and interpret the\n\t\t// retrieved value as a content box dimension.\n\t\tvalueIsBorderBox = offsetProp in elem;\n\t\tif ( valueIsBorderBox ) {\n\t\t\tval = elem[ offsetProp ];\n\t\t}\n\t}\n\n\t// Normalize \"\" and auto\n\tval = parseFloat( val ) || 0;\n\n\t// Adjust for the element's box model\n\treturn ( val +\n\t\tboxModelAdjustment(\n\t\t\telem,\n\t\t\tdimension,\n\t\t\textra || ( isBorderBox ? \"border\" : \"content\" ),\n\t\t\tvalueIsBorderBox,\n\t\t\tstyles,\n\n\t\t\t// Provide the current computed size to request scroll gutter calculation (gh-3589)\n\t\t\tval\n\t\t)\n\t) + \"px\";\n}\n\njQuery.extend( {\n\n\t// Add in style property hooks for overriding the default\n\t// behavior of getting and setting a style property\n\tcssHooks: {\n\t\topacity: {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\tif ( computed ) {\n\n\t\t\t\t\t// We should always get a number back from opacity\n\t\t\t\t\tvar ret = curCSS( elem, \"opacity\" );\n\t\t\t\t\treturn ret === \"\" ? \"1\" : ret;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t// Don't automatically add \"px\" to these possibly-unitless properties\n\tcssNumber: {\n\t\tanimationIterationCount: true,\n\t\taspectRatio: true,\n\t\tborderImageSlice: true,\n\t\tcolumnCount: true,\n\t\tflexGrow: true,\n\t\tflexShrink: true,\n\t\tfontWeight: true,\n\t\tgridArea: true,\n\t\tgridColumn: true,\n\t\tgridColumnEnd: true,\n\t\tgridColumnStart: true,\n\t\tgridRow: true,\n\t\tgridRowEnd: true,\n\t\tgridRowStart: true,\n\t\tlineHeight: true,\n\t\topacity: true,\n\t\torder: true,\n\t\torphans: true,\n\t\tscale: true,\n\t\twidows: true,\n\t\tzIndex: true,\n\t\tzoom: true,\n\n\t\t// SVG-related\n\t\tfillOpacity: true,\n\t\tfloodOpacity: true,\n\t\tstopOpacity: true,\n\t\tstrokeMiterlimit: true,\n\t\tstrokeOpacity: true\n\t},\n\n\t// Add in properties whose names you wish to fix before\n\t// setting or getting the value\n\tcssProps: {},\n\n\t// Get and set the style property on a DOM Node\n\tstyle: function( elem, name, value, extra ) {\n\n\t\t// Don't set styles on text and comment nodes\n\t\tif ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure that we're working with the right name\n\t\tvar ret, type, hooks,\n\t\t\torigName = camelCase( name ),\n\t\t\tisCustomProp = rcustomProp.test( name ),\n\t\t\tstyle = elem.style;\n\n\t\t// Make sure that we're working with the right name. We don't\n\t\t// want to query the value if it is a CSS custom property\n\t\t// since they are user-defined.\n\t\tif ( !isCustomProp ) {\n\t\t\tname = finalPropName( origName );\n\t\t}\n\n\t\t// Gets hook for the prefixed version, then unprefixed version\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// Check if we're setting a value\n\t\tif ( value !== undefined ) {\n\t\t\ttype = typeof value;\n\n\t\t\t// Convert \"+=\" or \"-=\" to relative numbers (trac-7345)\n\t\t\tif ( type === \"string\" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {\n\t\t\t\tvalue = adjustCSS( elem, name, ret );\n\n\t\t\t\t// Fixes bug trac-9237\n\t\t\t\ttype = \"number\";\n\t\t\t}\n\n\t\t\t// Make sure that null and NaN values aren't set (trac-7116)\n\t\t\tif ( value == null || value !== value ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If a number was passed in, add the unit (except for certain CSS properties)\n\t\t\t// The isCustomProp check can be removed in jQuery 4.0 when we only auto-append\n\t\t\t// \"px\" to a few hardcoded values.\n\t\t\tif ( type === \"number\" && !isCustomProp ) {\n\t\t\t\tvalue += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? \"\" : \"px\" );\n\t\t\t}\n\n\t\t\t// background-* props affect original clone's values\n\t\t\tif ( !support.clearCloneStyle && value === \"\" && name.indexOf( \"background\" ) === 0 ) {\n\t\t\t\tstyle[ name ] = \"inherit\";\n\t\t\t}\n\n\t\t\t// If a hook was provided, use that value, otherwise just set the specified value\n\t\t\tif ( !hooks || !( \"set\" in hooks ) ||\n\t\t\t\t( value = hooks.set( elem, value, extra ) ) !== undefined ) {\n\n\t\t\t\tif ( isCustomProp ) {\n\t\t\t\t\tstyle.setProperty( name, value );\n\t\t\t\t} else {\n\t\t\t\t\tstyle[ name ] = value;\n\t\t\t\t}\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// If a hook was provided get the non-computed value from there\n\t\t\tif ( hooks && \"get\" in hooks &&\n\t\t\t\t( ret = hooks.get( elem, false, extra ) ) !== undefined ) {\n\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\t// Otherwise just get the value from the style object\n\t\t\treturn style[ name ];\n\t\t}\n\t},\n\n\tcss: function( elem, name, extra, styles ) {\n\t\tvar val, num, hooks,\n\t\t\torigName = camelCase( name ),\n\t\t\tisCustomProp = rcustomProp.test( name );\n\n\t\t// Make sure that we're working with the right name. We don't\n\t\t// want to modify the value if it is a CSS custom property\n\t\t// since they are user-defined.\n\t\tif ( !isCustomProp ) {\n\t\t\tname = finalPropName( origName );\n\t\t}\n\n\t\t// Try prefixed name followed by the unprefixed name\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// If a hook was provided get the computed value from there\n\t\tif ( hooks && \"get\" in hooks ) {\n\t\t\tval = hooks.get( elem, true, extra );\n\t\t}\n\n\t\t// Otherwise, if a way to get the computed value exists, use that\n\t\tif ( val === undefined ) {\n\t\t\tval = curCSS( elem, name, styles );\n\t\t}\n\n\t\t// Convert \"normal\" to computed value\n\t\tif ( val === \"normal\" && name in cssNormalTransform ) {\n\t\t\tval = cssNormalTransform[ name ];\n\t\t}\n\n\t\t// Make numeric if forced or a qualifier was provided and val looks numeric\n\t\tif ( extra === \"\" || extra ) {\n\t\t\tnum = parseFloat( val );\n\t\t\treturn extra === true || isFinite( num ) ? num || 0 : val;\n\t\t}\n\n\t\treturn val;\n\t}\n} );\n\njQuery.each( [ \"height\", \"width\" ], function( _i, dimension ) {\n\tjQuery.cssHooks[ dimension ] = {\n\t\tget: function( elem, computed, extra ) {\n\t\t\tif ( computed ) {\n\n\t\t\t\t// Certain elements can have dimension info if we invisibly show them\n\t\t\t\t// but it must have a current display style that would benefit\n\t\t\t\treturn rdisplayswap.test( jQuery.css( elem, \"display\" ) ) &&\n\n\t\t\t\t\t// Support: Safari 8+\n\t\t\t\t\t// Table columns in Safari have non-zero offsetWidth & zero\n\t\t\t\t\t// getBoundingClientRect().width unless display is changed.\n\t\t\t\t\t// Support: IE <=11 only\n\t\t\t\t\t// Running getBoundingClientRect on a disconnected node\n\t\t\t\t\t// in IE throws an error.\n\t\t\t\t\t( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?\n\t\t\t\t\tswap( elem, cssShow, function() {\n\t\t\t\t\t\treturn getWidthOrHeight( elem, dimension, extra );\n\t\t\t\t\t} ) :\n\t\t\t\t\tgetWidthOrHeight( elem, dimension, extra );\n\t\t\t}\n\t\t},\n\n\t\tset: function( elem, value, extra ) {\n\t\t\tvar matches,\n\t\t\t\tstyles = getStyles( elem ),\n\n\t\t\t\t// Only read styles.position if the test has a chance to fail\n\t\t\t\t// to avoid forcing a reflow.\n\t\t\t\tscrollboxSizeBuggy = !support.scrollboxSize() &&\n\t\t\t\t\tstyles.position === \"absolute\",\n\n\t\t\t\t// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991)\n\t\t\t\tboxSizingNeeded = scrollboxSizeBuggy || extra,\n\t\t\t\tisBorderBox = boxSizingNeeded &&\n\t\t\t\t\tjQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\t\t\tsubtract = extra ?\n\t\t\t\t\tboxModelAdjustment(\n\t\t\t\t\t\telem,\n\t\t\t\t\t\tdimension,\n\t\t\t\t\t\textra,\n\t\t\t\t\t\tisBorderBox,\n\t\t\t\t\t\tstyles\n\t\t\t\t\t) :\n\t\t\t\t\t0;\n\n\t\t\t// Account for unreliable border-box dimensions by comparing offset* to computed and\n\t\t\t// faking a content-box to get border and padding (gh-3699)\n\t\t\tif ( isBorderBox && scrollboxSizeBuggy ) {\n\t\t\t\tsubtract -= Math.ceil(\n\t\t\t\t\telem[ \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -\n\t\t\t\t\tparseFloat( styles[ dimension ] ) -\n\t\t\t\t\tboxModelAdjustment( elem, dimension, \"border\", false, styles ) -\n\t\t\t\t\t0.5\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Convert to pixels if value adjustment is needed\n\t\t\tif ( subtract && ( matches = rcssNum.exec( value ) ) &&\n\t\t\t\t( matches[ 3 ] || \"px\" ) !== \"px\" ) {\n\n\t\t\t\telem.style[ dimension ] = value;\n\t\t\t\tvalue = jQuery.css( elem, dimension );\n\t\t\t}\n\n\t\t\treturn setPositiveNumber( elem, value, subtract );\n\t\t}\n\t};\n} );\n\njQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,\n\tfunction( elem, computed ) {\n\t\tif ( computed ) {\n\t\t\treturn ( parseFloat( curCSS( elem, \"marginLeft\" ) ) ||\n\t\t\t\telem.getBoundingClientRect().left -\n\t\t\t\t\tswap( elem, { marginLeft: 0 }, function() {\n\t\t\t\t\t\treturn elem.getBoundingClientRect().left;\n\t\t\t\t\t} )\n\t\t\t) + \"px\";\n\t\t}\n\t}\n);\n\n// These hooks are used by animate to expand properties\njQuery.each( {\n\tmargin: \"\",\n\tpadding: \"\",\n\tborder: \"Width\"\n}, function( prefix, suffix ) {\n\tjQuery.cssHooks[ prefix + suffix ] = {\n\t\texpand: function( value ) {\n\t\t\tvar i = 0,\n\t\t\t\texpanded = {},\n\n\t\t\t\t// Assumes a single number if not a string\n\t\t\t\tparts = typeof value === \"string\" ? value.split( \" \" ) : [ value ];\n\n\t\t\tfor ( ; i < 4; i++ ) {\n\t\t\t\texpanded[ prefix + cssExpand[ i ] + suffix ] =\n\t\t\t\t\tparts[ i ] || parts[ i - 2 ] || parts[ 0 ];\n\t\t\t}\n\n\t\t\treturn expanded;\n\t\t}\n\t};\n\n\tif ( prefix !== \"margin\" ) {\n\t\tjQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;\n\t}\n} );\n\njQuery.fn.extend( {\n\tcss: function( name, value ) {\n\t\treturn access( this, function( elem, name, value ) {\n\t\t\tvar styles, len,\n\t\t\t\tmap = {},\n\t\t\t\ti = 0;\n\n\t\t\tif ( Array.isArray( name ) ) {\n\t\t\t\tstyles = getStyles( elem );\n\t\t\t\tlen = name.length;\n\n\t\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\t\tmap[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );\n\t\t\t\t}\n\n\t\t\t\treturn map;\n\t\t\t}\n\n\t\t\treturn value !== undefined ?\n\t\t\t\tjQuery.style( elem, name, value ) :\n\t\t\t\tjQuery.css( elem, name );\n\t\t}, name, value, arguments.length > 1 );\n\t}\n} );\n\n\nfunction Tween( elem, options, prop, end, easing ) {\n\treturn new Tween.prototype.init( elem, options, prop, end, easing );\n}\njQuery.Tween = Tween;\n\nTween.prototype = {\n\tconstructor: Tween,\n\tinit: function( elem, options, prop, end, easing, unit ) {\n\t\tthis.elem = elem;\n\t\tthis.prop = prop;\n\t\tthis.easing = easing || jQuery.easing._default;\n\t\tthis.options = options;\n\t\tthis.start = this.now = this.cur();\n\t\tthis.end = end;\n\t\tthis.unit = unit || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" );\n\t},\n\tcur: function() {\n\t\tvar hooks = Tween.propHooks[ this.prop ];\n\n\t\treturn hooks && hooks.get ?\n\t\t\thooks.get( this ) :\n\t\t\tTween.propHooks._default.get( this );\n\t},\n\trun: function( percent ) {\n\t\tvar eased,\n\t\t\thooks = Tween.propHooks[ this.prop ];\n\n\t\tif ( this.options.duration ) {\n\t\t\tthis.pos = eased = jQuery.easing[ this.easing ](\n\t\t\t\tpercent, this.options.duration * percent, 0, 1, this.options.duration\n\t\t\t);\n\t\t} else {\n\t\t\tthis.pos = eased = percent;\n\t\t}\n\t\tthis.now = ( this.end - this.start ) * eased + this.start;\n\n\t\tif ( this.options.step ) {\n\t\t\tthis.options.step.call( this.elem, this.now, this );\n\t\t}\n\n\t\tif ( hooks && hooks.set ) {\n\t\t\thooks.set( this );\n\t\t} else {\n\t\t\tTween.propHooks._default.set( this );\n\t\t}\n\t\treturn this;\n\t}\n};\n\nTween.prototype.init.prototype = Tween.prototype;\n\nTween.propHooks = {\n\t_default: {\n\t\tget: function( tween ) {\n\t\t\tvar result;\n\n\t\t\t// Use a property on the element directly when it is not a DOM element,\n\t\t\t// or when there is no matching style property that exists.\n\t\t\tif ( tween.elem.nodeType !== 1 ||\n\t\t\t\ttween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {\n\t\t\t\treturn tween.elem[ tween.prop ];\n\t\t\t}\n\n\t\t\t// Passing an empty string as a 3rd parameter to .css will automatically\n\t\t\t// attempt a parseFloat and fallback to a string if the parse fails.\n\t\t\t// Simple values such as \"10px\" are parsed to Float;\n\t\t\t// complex values such as \"rotate(1rad)\" are returned as-is.\n\t\t\tresult = jQuery.css( tween.elem, tween.prop, \"\" );\n\n\t\t\t// Empty strings, null, undefined and \"auto\" are converted to 0.\n\t\t\treturn !result || result === \"auto\" ? 0 : result;\n\t\t},\n\t\tset: function( tween ) {\n\n\t\t\t// Use step hook for back compat.\n\t\t\t// Use cssHook if its there.\n\t\t\t// Use .style if available and use plain properties where available.\n\t\t\tif ( jQuery.fx.step[ tween.prop ] ) {\n\t\t\t\tjQuery.fx.step[ tween.prop ]( tween );\n\t\t\t} else if ( tween.elem.nodeType === 1 && (\n\t\t\t\tjQuery.cssHooks[ tween.prop ] ||\n\t\t\t\t\ttween.elem.style[ finalPropName( tween.prop ) ] != null ) ) {\n\t\t\t\tjQuery.style( tween.elem, tween.prop, tween.now + tween.unit );\n\t\t\t} else {\n\t\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Support: IE <=9 only\n// Panic based approach to setting things on disconnected nodes\nTween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {\n\tset: function( tween ) {\n\t\tif ( tween.elem.nodeType && tween.elem.parentNode ) {\n\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t}\n\t}\n};\n\njQuery.easing = {\n\tlinear: function( p ) {\n\t\treturn p;\n\t},\n\tswing: function( p ) {\n\t\treturn 0.5 - Math.cos( p * Math.PI ) / 2;\n\t},\n\t_default: \"swing\"\n};\n\njQuery.fx = Tween.prototype.init;\n\n// Back compat <1.8 extension point\njQuery.fx.step = {};\n\n\n\n\nvar\n\tfxNow, inProgress,\n\trfxtypes = /^(?:toggle|show|hide)$/,\n\trrun = /queueHooks$/;\n\nfunction schedule() {\n\tif ( inProgress ) {\n\t\tif ( document.hidden === false && window.requestAnimationFrame ) {\n\t\t\twindow.requestAnimationFrame( schedule );\n\t\t} else {\n\t\t\twindow.setTimeout( schedule, jQuery.fx.interval );\n\t\t}\n\n\t\tjQuery.fx.tick();\n\t}\n}\n\n// Animations created synchronously will run synchronously\nfunction createFxNow() {\n\twindow.setTimeout( function() {\n\t\tfxNow = undefined;\n\t} );\n\treturn ( fxNow = Date.now() );\n}\n\n// Generate parameters to create a standard animation\nfunction genFx( type, includeWidth ) {\n\tvar which,\n\t\ti = 0,\n\t\tattrs = { height: type };\n\n\t// If we include width, step value is 1 to do all cssExpand values,\n\t// otherwise step value is 2 to skip over Left and Right\n\tincludeWidth = includeWidth ? 1 : 0;\n\tfor ( ; i < 4; i += 2 - includeWidth ) {\n\t\twhich = cssExpand[ i ];\n\t\tattrs[ \"margin\" + which ] = attrs[ \"padding\" + which ] = type;\n\t}\n\n\tif ( includeWidth ) {\n\t\tattrs.opacity = attrs.width = type;\n\t}\n\n\treturn attrs;\n}\n\nfunction createTween( value, prop, animation ) {\n\tvar tween,\n\t\tcollection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ \"*\" ] ),\n\t\tindex = 0,\n\t\tlength = collection.length;\n\tfor ( ; index < length; index++ ) {\n\t\tif ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {\n\n\t\t\t// We're done with this property\n\t\t\treturn tween;\n\t\t}\n\t}\n}\n\nfunction defaultPrefilter( elem, props, opts ) {\n\tvar prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,\n\t\tisBox = \"width\" in props || \"height\" in props,\n\t\tanim = this,\n\t\torig = {},\n\t\tstyle = elem.style,\n\t\thidden = elem.nodeType && isHiddenWithinTree( elem ),\n\t\tdataShow = dataPriv.get( elem, \"fxshow\" );\n\n\t// Queue-skipping animations hijack the fx hooks\n\tif ( !opts.queue ) {\n\t\thooks = jQuery._queueHooks( elem, \"fx\" );\n\t\tif ( hooks.unqueued == null ) {\n\t\t\thooks.unqueued = 0;\n\t\t\toldfire = hooks.empty.fire;\n\t\t\thooks.empty.fire = function() {\n\t\t\t\tif ( !hooks.unqueued ) {\n\t\t\t\t\toldfire();\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\thooks.unqueued++;\n\n\t\tanim.always( function() {\n\n\t\t\t// Ensure the complete handler is called before this completes\n\t\t\tanim.always( function() {\n\t\t\t\thooks.unqueued--;\n\t\t\t\tif ( !jQuery.queue( elem, \"fx\" ).length ) {\n\t\t\t\t\thooks.empty.fire();\n\t\t\t\t}\n\t\t\t} );\n\t\t} );\n\t}\n\n\t// Detect show/hide animations\n\tfor ( prop in props ) {\n\t\tvalue = props[ prop ];\n\t\tif ( rfxtypes.test( value ) ) {\n\t\t\tdelete props[ prop ];\n\t\t\ttoggle = toggle || value === \"toggle\";\n\t\t\tif ( value === ( hidden ? \"hide\" : \"show\" ) ) {\n\n\t\t\t\t// Pretend to be hidden if this is a \"show\" and\n\t\t\t\t// there is still data from a stopped show/hide\n\t\t\t\tif ( value === \"show\" && dataShow && dataShow[ prop ] !== undefined ) {\n\t\t\t\t\thidden = true;\n\n\t\t\t\t// Ignore all other no-op show/hide data\n\t\t\t\t} else {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\torig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );\n\t\t}\n\t}\n\n\t// Bail out if this is a no-op like .hide().hide()\n\tpropTween = !jQuery.isEmptyObject( props );\n\tif ( !propTween && jQuery.isEmptyObject( orig ) ) {\n\t\treturn;\n\t}\n\n\t// Restrict \"overflow\" and \"display\" styles during box animations\n\tif ( isBox && elem.nodeType === 1 ) {\n\n\t\t// Support: IE <=9 - 11, Edge 12 - 15\n\t\t// Record all 3 overflow attributes because IE does not infer the shorthand\n\t\t// from identically-valued overflowX and overflowY and Edge just mirrors\n\t\t// the overflowX value there.\n\t\topts.overflow = [ style.overflow, style.overflowX, style.overflowY ];\n\n\t\t// Identify a display type, preferring old show/hide data over the CSS cascade\n\t\trestoreDisplay = dataShow && dataShow.display;\n\t\tif ( restoreDisplay == null ) {\n\t\t\trestoreDisplay = dataPriv.get( elem, \"display\" );\n\t\t}\n\t\tdisplay = jQuery.css( elem, \"display\" );\n\t\tif ( display === \"none\" ) {\n\t\t\tif ( restoreDisplay ) {\n\t\t\t\tdisplay = restoreDisplay;\n\t\t\t} else {\n\n\t\t\t\t// Get nonempty value(s) by temporarily forcing visibility\n\t\t\t\tshowHide( [ elem ], true );\n\t\t\t\trestoreDisplay = elem.style.display || restoreDisplay;\n\t\t\t\tdisplay = jQuery.css( elem, \"display\" );\n\t\t\t\tshowHide( [ elem ] );\n\t\t\t}\n\t\t}\n\n\t\t// Animate inline elements as inline-block\n\t\tif ( display === \"inline\" || display === \"inline-block\" && restoreDisplay != null ) {\n\t\t\tif ( jQuery.css( elem, \"float\" ) === \"none\" ) {\n\n\t\t\t\t// Restore the original display value at the end of pure show/hide animations\n\t\t\t\tif ( !propTween ) {\n\t\t\t\t\tanim.done( function() {\n\t\t\t\t\t\tstyle.display = restoreDisplay;\n\t\t\t\t\t} );\n\t\t\t\t\tif ( restoreDisplay == null ) {\n\t\t\t\t\t\tdisplay = style.display;\n\t\t\t\t\t\trestoreDisplay = display === \"none\" ? \"\" : display;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tstyle.display = \"inline-block\";\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( opts.overflow ) {\n\t\tstyle.overflow = \"hidden\";\n\t\tanim.always( function() {\n\t\t\tstyle.overflow = opts.overflow[ 0 ];\n\t\t\tstyle.overflowX = opts.overflow[ 1 ];\n\t\t\tstyle.overflowY = opts.overflow[ 2 ];\n\t\t} );\n\t}\n\n\t// Implement show/hide animations\n\tpropTween = false;\n\tfor ( prop in orig ) {\n\n\t\t// General show/hide setup for this element animation\n\t\tif ( !propTween ) {\n\t\t\tif ( dataShow ) {\n\t\t\t\tif ( \"hidden\" in dataShow ) {\n\t\t\t\t\thidden = dataShow.hidden;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tdataShow = dataPriv.access( elem, \"fxshow\", { display: restoreDisplay } );\n\t\t\t}\n\n\t\t\t// Store hidden/visible for toggle so `.stop().toggle()` \"reverses\"\n\t\t\tif ( toggle ) {\n\t\t\t\tdataShow.hidden = !hidden;\n\t\t\t}\n\n\t\t\t// Show elements before animating them\n\t\t\tif ( hidden ) {\n\t\t\t\tshowHide( [ elem ], true );\n\t\t\t}\n\n\t\t\t/* eslint-disable no-loop-func */\n\n\t\t\tanim.done( function() {\n\n\t\t\t\t/* eslint-enable no-loop-func */\n\n\t\t\t\t// The final step of a \"hide\" animation is actually hiding the element\n\t\t\t\tif ( !hidden ) {\n\t\t\t\t\tshowHide( [ elem ] );\n\t\t\t\t}\n\t\t\t\tdataPriv.remove( elem, \"fxshow\" );\n\t\t\t\tfor ( prop in orig ) {\n\t\t\t\t\tjQuery.style( elem, prop, orig[ prop ] );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\t// Per-property setup\n\t\tpropTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );\n\t\tif ( !( prop in dataShow ) ) {\n\t\t\tdataShow[ prop ] = propTween.start;\n\t\t\tif ( hidden ) {\n\t\t\t\tpropTween.end = propTween.start;\n\t\t\t\tpropTween.start = 0;\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction propFilter( props, specialEasing ) {\n\tvar index, name, easing, value, hooks;\n\n\t// camelCase, specialEasing and expand cssHook pass\n\tfor ( index in props ) {\n\t\tname = camelCase( index );\n\t\teasing = specialEasing[ name ];\n\t\tvalue = props[ index ];\n\t\tif ( Array.isArray( value ) ) {\n\t\t\teasing = value[ 1 ];\n\t\t\tvalue = props[ index ] = value[ 0 ];\n\t\t}\n\n\t\tif ( index !== name ) {\n\t\t\tprops[ name ] = value;\n\t\t\tdelete props[ index ];\n\t\t}\n\n\t\thooks = jQuery.cssHooks[ name ];\n\t\tif ( hooks && \"expand\" in hooks ) {\n\t\t\tvalue = hooks.expand( value );\n\t\t\tdelete props[ name ];\n\n\t\t\t// Not quite $.extend, this won't overwrite existing keys.\n\t\t\t// Reusing 'index' because we have the correct \"name\"\n\t\t\tfor ( index in value ) {\n\t\t\t\tif ( !( index in props ) ) {\n\t\t\t\t\tprops[ index ] = value[ index ];\n\t\t\t\t\tspecialEasing[ index ] = easing;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tspecialEasing[ name ] = easing;\n\t\t}\n\t}\n}\n\nfunction Animation( elem, properties, options ) {\n\tvar result,\n\t\tstopped,\n\t\tindex = 0,\n\t\tlength = Animation.prefilters.length,\n\t\tdeferred = jQuery.Deferred().always( function() {\n\n\t\t\t// Don't match elem in the :animated selector\n\t\t\tdelete tick.elem;\n\t\t} ),\n\t\ttick = function() {\n\t\t\tif ( stopped ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tvar currentTime = fxNow || createFxNow(),\n\t\t\t\tremaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),\n\n\t\t\t\t// Support: Android 2.3 only\n\t\t\t\t// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (trac-12497)\n\t\t\t\ttemp = remaining / animation.duration || 0,\n\t\t\t\tpercent = 1 - temp,\n\t\t\t\tindex = 0,\n\t\t\t\tlength = animation.tweens.length;\n\n\t\t\tfor ( ; index < length; index++ ) {\n\t\t\t\tanimation.tweens[ index ].run( percent );\n\t\t\t}\n\n\t\t\tdeferred.notifyWith( elem, [ animation, percent, remaining ] );\n\n\t\t\t// If there's more to do, yield\n\t\t\tif ( percent < 1 && length ) {\n\t\t\t\treturn remaining;\n\t\t\t}\n\n\t\t\t// If this was an empty animation, synthesize a final progress notification\n\t\t\tif ( !length ) {\n\t\t\t\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\n\t\t\t}\n\n\t\t\t// Resolve the animation and report its conclusion\n\t\t\tdeferred.resolveWith( elem, [ animation ] );\n\t\t\treturn false;\n\t\t},\n\t\tanimation = deferred.promise( {\n\t\t\telem: elem,\n\t\t\tprops: jQuery.extend( {}, properties ),\n\t\t\topts: jQuery.extend( true, {\n\t\t\t\tspecialEasing: {},\n\t\t\t\teasing: jQuery.easing._default\n\t\t\t}, options ),\n\t\t\toriginalProperties: properties,\n\t\t\toriginalOptions: options,\n\t\t\tstartTime: fxNow || createFxNow(),\n\t\t\tduration: options.duration,\n\t\t\ttweens: [],\n\t\t\tcreateTween: function( prop, end ) {\n\t\t\t\tvar tween = jQuery.Tween( elem, animation.opts, prop, end,\n\t\t\t\t\tanimation.opts.specialEasing[ prop ] || animation.opts.easing );\n\t\t\t\tanimation.tweens.push( tween );\n\t\t\t\treturn tween;\n\t\t\t},\n\t\t\tstop: function( gotoEnd ) {\n\t\t\t\tvar index = 0,\n\n\t\t\t\t\t// If we are going to the end, we want to run all the tweens\n\t\t\t\t\t// otherwise we skip this part\n\t\t\t\t\tlength = gotoEnd ? animation.tweens.length : 0;\n\t\t\t\tif ( stopped ) {\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t\tstopped = true;\n\t\t\t\tfor ( ; index < length; index++ ) {\n\t\t\t\t\tanimation.tweens[ index ].run( 1 );\n\t\t\t\t}\n\n\t\t\t\t// Resolve when we played the last frame; otherwise, reject\n\t\t\t\tif ( gotoEnd ) {\n\t\t\t\t\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\n\t\t\t\t\tdeferred.resolveWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t} else {\n\t\t\t\t\tdeferred.rejectWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t}\n\t\t} ),\n\t\tprops = animation.props;\n\n\tpropFilter( props, animation.opts.specialEasing );\n\n\tfor ( ; index < length; index++ ) {\n\t\tresult = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );\n\t\tif ( result ) {\n\t\t\tif ( isFunction( result.stop ) ) {\n\t\t\t\tjQuery._queueHooks( animation.elem, animation.opts.queue ).stop =\n\t\t\t\t\tresult.stop.bind( result );\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t}\n\n\tjQuery.map( props, createTween, animation );\n\n\tif ( isFunction( animation.opts.start ) ) {\n\t\tanimation.opts.start.call( elem, animation );\n\t}\n\n\t// Attach callbacks from options\n\tanimation\n\t\t.progress( animation.opts.progress )\n\t\t.done( animation.opts.done, animation.opts.complete )\n\t\t.fail( animation.opts.fail )\n\t\t.always( animation.opts.always );\n\n\tjQuery.fx.timer(\n\t\tjQuery.extend( tick, {\n\t\t\telem: elem,\n\t\t\tanim: animation,\n\t\t\tqueue: animation.opts.queue\n\t\t} )\n\t);\n\n\treturn animation;\n}\n\njQuery.Animation = jQuery.extend( Animation, {\n\n\ttweeners: {\n\t\t\"*\": [ function( prop, value ) {\n\t\t\tvar tween = this.createTween( prop, value );\n\t\t\tadjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );\n\t\t\treturn tween;\n\t\t} ]\n\t},\n\n\ttweener: function( props, callback ) {\n\t\tif ( isFunction( props ) ) {\n\t\t\tcallback = props;\n\t\t\tprops = [ \"*\" ];\n\t\t} else {\n\t\t\tprops = props.match( rnothtmlwhite );\n\t\t}\n\n\t\tvar prop,\n\t\t\tindex = 0,\n\t\t\tlength = props.length;\n\n\t\tfor ( ; index < length; index++ ) {\n\t\t\tprop = props[ index ];\n\t\t\tAnimation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];\n\t\t\tAnimation.tweeners[ prop ].unshift( callback );\n\t\t}\n\t},\n\n\tprefilters: [ defaultPrefilter ],\n\n\tprefilter: function( callback, prepend ) {\n\t\tif ( prepend ) {\n\t\t\tAnimation.prefilters.unshift( callback );\n\t\t} else {\n\t\t\tAnimation.prefilters.push( callback );\n\t\t}\n\t}\n} );\n\njQuery.speed = function( speed, easing, fn ) {\n\tvar opt = speed && typeof speed === \"object\" ? jQuery.extend( {}, speed ) : {\n\t\tcomplete: fn || !fn && easing ||\n\t\t\tisFunction( speed ) && speed,\n\t\tduration: speed,\n\t\teasing: fn && easing || easing && !isFunction( easing ) && easing\n\t};\n\n\t// Go to the end state if fx are off\n\tif ( jQuery.fx.off ) {\n\t\topt.duration = 0;\n\n\t} else {\n\t\tif ( typeof opt.duration !== \"number\" ) {\n\t\t\tif ( opt.duration in jQuery.fx.speeds ) {\n\t\t\t\topt.duration = jQuery.fx.speeds[ opt.duration ];\n\n\t\t\t} else {\n\t\t\t\topt.duration = jQuery.fx.speeds._default;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Normalize opt.queue - true/undefined/null -> \"fx\"\n\tif ( opt.queue == null || opt.queue === true ) {\n\t\topt.queue = \"fx\";\n\t}\n\n\t// Queueing\n\topt.old = opt.complete;\n\n\topt.complete = function() {\n\t\tif ( isFunction( opt.old ) ) {\n\t\t\topt.old.call( this );\n\t\t}\n\n\t\tif ( opt.queue ) {\n\t\t\tjQuery.dequeue( this, opt.queue );\n\t\t}\n\t};\n\n\treturn opt;\n};\n\njQuery.fn.extend( {\n\tfadeTo: function( speed, to, easing, callback ) {\n\n\t\t// Show any hidden elements after setting opacity to 0\n\t\treturn this.filter( isHiddenWithinTree ).css( \"opacity\", 0 ).show()\n\n\t\t\t// Animate to the value specified\n\t\t\t.end().animate( { opacity: to }, speed, easing, callback );\n\t},\n\tanimate: function( prop, speed, easing, callback ) {\n\t\tvar empty = jQuery.isEmptyObject( prop ),\n\t\t\toptall = jQuery.speed( speed, easing, callback ),\n\t\t\tdoAnimation = function() {\n\n\t\t\t\t// Operate on a copy of prop so per-property easing won't be lost\n\t\t\t\tvar anim = Animation( this, jQuery.extend( {}, prop ), optall );\n\n\t\t\t\t// Empty animations, or finishing resolves immediately\n\t\t\t\tif ( empty || dataPriv.get( this, \"finish\" ) ) {\n\t\t\t\t\tanim.stop( true );\n\t\t\t\t}\n\t\t\t};\n\n\t\tdoAnimation.finish = doAnimation;\n\n\t\treturn empty || optall.queue === false ?\n\t\t\tthis.each( doAnimation ) :\n\t\t\tthis.queue( optall.queue, doAnimation );\n\t},\n\tstop: function( type, clearQueue, gotoEnd ) {\n\t\tvar stopQueue = function( hooks ) {\n\t\t\tvar stop = hooks.stop;\n\t\t\tdelete hooks.stop;\n\t\t\tstop( gotoEnd );\n\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tgotoEnd = clearQueue;\n\t\t\tclearQueue = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\tif ( clearQueue ) {\n\t\t\tthis.queue( type || \"fx\", [] );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar dequeue = true,\n\t\t\t\tindex = type != null && type + \"queueHooks\",\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tdata = dataPriv.get( this );\n\n\t\t\tif ( index ) {\n\t\t\t\tif ( data[ index ] && data[ index ].stop ) {\n\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( index in data ) {\n\t\t\t\t\tif ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {\n\t\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this &&\n\t\t\t\t\t( type == null || timers[ index ].queue === type ) ) {\n\n\t\t\t\t\ttimers[ index ].anim.stop( gotoEnd );\n\t\t\t\t\tdequeue = false;\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Start the next in the queue if the last step wasn't forced.\n\t\t\t// Timers currently will call their complete callbacks, which\n\t\t\t// will dequeue but only if they were gotoEnd.\n\t\t\tif ( dequeue || !gotoEnd ) {\n\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t}\n\t\t} );\n\t},\n\tfinish: function( type ) {\n\t\tif ( type !== false ) {\n\t\t\ttype = type || \"fx\";\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tvar index,\n\t\t\t\tdata = dataPriv.get( this ),\n\t\t\t\tqueue = data[ type + \"queue\" ],\n\t\t\t\thooks = data[ type + \"queueHooks\" ],\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tlength = queue ? queue.length : 0;\n\n\t\t\t// Enable finishing flag on private data\n\t\t\tdata.finish = true;\n\n\t\t\t// Empty the queue first\n\t\t\tjQuery.queue( this, type, [] );\n\n\t\t\tif ( hooks && hooks.stop ) {\n\t\t\t\thooks.stop.call( this, true );\n\t\t\t}\n\n\t\t\t// Look for any active animations, and finish them\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this && timers[ index ].queue === type ) {\n\t\t\t\t\ttimers[ index ].anim.stop( true );\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Look for any animations in the old queue and finish them\n\t\t\tfor ( index = 0; index < length; index++ ) {\n\t\t\t\tif ( queue[ index ] && queue[ index ].finish ) {\n\t\t\t\t\tqueue[ index ].finish.call( this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Turn off finishing flag\n\t\t\tdelete data.finish;\n\t\t} );\n\t}\n} );\n\njQuery.each( [ \"toggle\", \"show\", \"hide\" ], function( _i, name ) {\n\tvar cssFn = jQuery.fn[ name ];\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn speed == null || typeof speed === \"boolean\" ?\n\t\t\tcssFn.apply( this, arguments ) :\n\t\t\tthis.animate( genFx( name, true ), speed, easing, callback );\n\t};\n} );\n\n// Generate shortcuts for custom animations\njQuery.each( {\n\tslideDown: genFx( \"show\" ),\n\tslideUp: genFx( \"hide\" ),\n\tslideToggle: genFx( \"toggle\" ),\n\tfadeIn: { opacity: \"show\" },\n\tfadeOut: { opacity: \"hide\" },\n\tfadeToggle: { opacity: \"toggle\" }\n}, function( name, props ) {\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn this.animate( props, speed, easing, callback );\n\t};\n} );\n\njQuery.timers = [];\njQuery.fx.tick = function() {\n\tvar timer,\n\t\ti = 0,\n\t\ttimers = jQuery.timers;\n\n\tfxNow = Date.now();\n\n\tfor ( ; i < timers.length; i++ ) {\n\t\ttimer = timers[ i ];\n\n\t\t// Run the timer and safely remove it when done (allowing for external removal)\n\t\tif ( !timer() && timers[ i ] === timer ) {\n\t\t\ttimers.splice( i--, 1 );\n\t\t}\n\t}\n\n\tif ( !timers.length ) {\n\t\tjQuery.fx.stop();\n\t}\n\tfxNow = undefined;\n};\n\njQuery.fx.timer = function( timer ) {\n\tjQuery.timers.push( timer );\n\tjQuery.fx.start();\n};\n\njQuery.fx.interval = 13;\njQuery.fx.start = function() {\n\tif ( inProgress ) {\n\t\treturn;\n\t}\n\n\tinProgress = true;\n\tschedule();\n};\n\njQuery.fx.stop = function() {\n\tinProgress = null;\n};\n\njQuery.fx.speeds = {\n\tslow: 600,\n\tfast: 200,\n\n\t// Default speed\n\t_default: 400\n};\n\n\n// Based off of the plugin by Clint Helfers, with permission.\njQuery.fn.delay = function( time, type ) {\n\ttime = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;\n\ttype = type || \"fx\";\n\n\treturn this.queue( type, function( next, hooks ) {\n\t\tvar timeout = window.setTimeout( next, time );\n\t\thooks.stop = function() {\n\t\t\twindow.clearTimeout( timeout );\n\t\t};\n\t} );\n};\n\n\n( function() {\n\tvar input = document.createElement( \"input\" ),\n\t\tselect = document.createElement( \"select\" ),\n\t\topt = select.appendChild( document.createElement( \"option\" ) );\n\n\tinput.type = \"checkbox\";\n\n\t// Support: Android <=4.3 only\n\t// Default value for a checkbox should be \"on\"\n\tsupport.checkOn = input.value !== \"\";\n\n\t// Support: IE <=11 only\n\t// Must access selectedIndex to make default options select\n\tsupport.optSelected = opt.selected;\n\n\t// Support: IE <=11 only\n\t// An input loses its value after becoming a radio\n\tinput = document.createElement( \"input\" );\n\tinput.value = \"t\";\n\tinput.type = \"radio\";\n\tsupport.radioValue = input.value === \"t\";\n} )();\n\n\nvar boolHook,\n\tattrHandle = jQuery.expr.attrHandle;\n\njQuery.fn.extend( {\n\tattr: function( name, value ) {\n\t\treturn access( this, jQuery.attr, name, value, arguments.length > 1 );\n\t},\n\n\tremoveAttr: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.removeAttr( this, name );\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tattr: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set attributes on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Fallback to prop when attributes are not supported\n\t\tif ( typeof elem.getAttribute === \"undefined\" ) {\n\t\t\treturn jQuery.prop( elem, name, value );\n\t\t}\n\n\t\t// Attribute hooks are determined by the lowercase version\n\t\t// Grab necessary hook if one is defined\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\t\t\thooks = jQuery.attrHooks[ name.toLowerCase() ] ||\n\t\t\t\t( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( value === null ) {\n\t\t\t\tjQuery.removeAttr( elem, name );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\telem.setAttribute( name, value + \"\" );\n\t\t\treturn value;\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\tret = jQuery.find.attr( elem, name );\n\n\t\t// Non-existent attributes return null, we normalize to undefined\n\t\treturn ret == null ? undefined : ret;\n\t},\n\n\tattrHooks: {\n\t\ttype: {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tif ( !support.radioValue && value === \"radio\" &&\n\t\t\t\t\tnodeName( elem, \"input\" ) ) {\n\t\t\t\t\tvar val = elem.value;\n\t\t\t\t\telem.setAttribute( \"type\", value );\n\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\telem.value = val;\n\t\t\t\t\t}\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tremoveAttr: function( elem, value ) {\n\t\tvar name,\n\t\t\ti = 0,\n\n\t\t\t// Attribute names can contain non-HTML whitespace characters\n\t\t\t// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2\n\t\t\tattrNames = value && value.match( rnothtmlwhite );\n\n\t\tif ( attrNames && elem.nodeType === 1 ) {\n\t\t\twhile ( ( name = attrNames[ i++ ] ) ) {\n\t\t\t\telem.removeAttribute( name );\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Hooks for boolean attributes\nboolHook = {\n\tset: function( elem, value, name ) {\n\t\tif ( value === false ) {\n\n\t\t\t// Remove boolean attributes when set to false\n\t\t\tjQuery.removeAttr( elem, name );\n\t\t} else {\n\t\t\telem.setAttribute( name, name );\n\t\t}\n\t\treturn name;\n\t}\n};\n\njQuery.each( jQuery.expr.match.bool.source.match( /\\w+/g ), function( _i, name ) {\n\tvar getter = attrHandle[ name ] || jQuery.find.attr;\n\n\tattrHandle[ name ] = function( elem, name, isXML ) {\n\t\tvar ret, handle,\n\t\t\tlowercaseName = name.toLowerCase();\n\n\t\tif ( !isXML ) {\n\n\t\t\t// Avoid an infinite loop by temporarily removing this function from the getter\n\t\t\thandle = attrHandle[ lowercaseName ];\n\t\t\tattrHandle[ lowercaseName ] = ret;\n\t\t\tret = getter( elem, name, isXML ) != null ?\n\t\t\t\tlowercaseName :\n\t\t\t\tnull;\n\t\t\tattrHandle[ lowercaseName ] = handle;\n\t\t}\n\t\treturn ret;\n\t};\n} );\n\n\n\n\nvar rfocusable = /^(?:input|select|textarea|button)$/i,\n\trclickable = /^(?:a|area)$/i;\n\njQuery.fn.extend( {\n\tprop: function( name, value ) {\n\t\treturn access( this, jQuery.prop, name, value, arguments.length > 1 );\n\t},\n\n\tremoveProp: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tdelete this[ jQuery.propFix[ name ] || name ];\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tprop: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set properties on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// Fix name and attach hooks\n\t\t\tname = jQuery.propFix[ name ] || name;\n\t\t\thooks = jQuery.propHooks[ name ];\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\treturn ( elem[ name ] = value );\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\treturn elem[ name ];\n\t},\n\n\tpropHooks: {\n\t\ttabIndex: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\t// Support: IE <=9 - 11 only\n\t\t\t\t// elem.tabIndex doesn't always return the\n\t\t\t\t// correct value when it hasn't been explicitly set\n\t\t\t\t// Use proper attribute retrieval (trac-12072)\n\t\t\t\tvar tabindex = jQuery.find.attr( elem, \"tabindex\" );\n\n\t\t\t\tif ( tabindex ) {\n\t\t\t\t\treturn parseInt( tabindex, 10 );\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\trfocusable.test( elem.nodeName ) ||\n\t\t\t\t\trclickable.test( elem.nodeName ) &&\n\t\t\t\t\telem.href\n\t\t\t\t) {\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t},\n\n\tpropFix: {\n\t\t\"for\": \"htmlFor\",\n\t\t\"class\": \"className\"\n\t}\n} );\n\n// Support: IE <=11 only\n// Accessing the selectedIndex property\n// forces the browser to respect setting selected\n// on the option\n// The getter ensures a default option is selected\n// when in an optgroup\n// eslint rule \"no-unused-expressions\" is disabled for this code\n// since it considers such accessions noop\nif ( !support.optSelected ) {\n\tjQuery.propHooks.selected = {\n\t\tget: function( elem ) {\n\n\t\t\t/* eslint no-unused-expressions: \"off\" */\n\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent && parent.parentNode ) {\n\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tset: function( elem ) {\n\n\t\t\t/* eslint no-unused-expressions: \"off\" */\n\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent ) {\n\t\t\t\tparent.selectedIndex;\n\n\t\t\t\tif ( parent.parentNode ) {\n\t\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\njQuery.each( [\n\t\"tabIndex\",\n\t\"readOnly\",\n\t\"maxLength\",\n\t\"cellSpacing\",\n\t\"cellPadding\",\n\t\"rowSpan\",\n\t\"colSpan\",\n\t\"useMap\",\n\t\"frameBorder\",\n\t\"contentEditable\"\n], function() {\n\tjQuery.propFix[ this.toLowerCase() ] = this;\n} );\n\n\n\n\n\t// Strip and collapse whitespace according to HTML spec\n\t// https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace\n\tfunction stripAndCollapse( value ) {\n\t\tvar tokens = value.match( rnothtmlwhite ) || [];\n\t\treturn tokens.join( \" \" );\n\t}\n\n\nfunction getClass( elem ) {\n\treturn elem.getAttribute && elem.getAttribute( \"class\" ) || \"\";\n}\n\nfunction classesToArray( value ) {\n\tif ( Array.isArray( value ) ) {\n\t\treturn value;\n\t}\n\tif ( typeof value === \"string\" ) {\n\t\treturn value.match( rnothtmlwhite ) || [];\n\t}\n\treturn [];\n}\n\njQuery.fn.extend( {\n\taddClass: function( value ) {\n\t\tvar classNames, cur, curValue, className, i, finalValue;\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).addClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tclassNames = classesToArray( value );\n\n\t\tif ( classNames.length ) {\n\t\t\treturn this.each( function() {\n\t\t\t\tcurValue = getClass( this );\n\t\t\t\tcur = this.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tfor ( i = 0; i < classNames.length; i++ ) {\n\t\t\t\t\t\tclassName = classNames[ i ];\n\t\t\t\t\t\tif ( cur.indexOf( \" \" + className + \" \" ) < 0 ) {\n\t\t\t\t\t\t\tcur += className + \" \";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = stripAndCollapse( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\tthis.setAttribute( \"class\", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tremoveClass: function( value ) {\n\t\tvar classNames, cur, curValue, className, i, finalValue;\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tif ( !arguments.length ) {\n\t\t\treturn this.attr( \"class\", \"\" );\n\t\t}\n\n\t\tclassNames = classesToArray( value );\n\n\t\tif ( classNames.length ) {\n\t\t\treturn this.each( function() {\n\t\t\t\tcurValue = getClass( this );\n\n\t\t\t\t// This expression is here for better compressibility (see addClass)\n\t\t\t\tcur = this.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tfor ( i = 0; i < classNames.length; i++ ) {\n\t\t\t\t\t\tclassName = classNames[ i ];\n\n\t\t\t\t\t\t// Remove *all* instances\n\t\t\t\t\t\twhile ( cur.indexOf( \" \" + className + \" \" ) > -1 ) {\n\t\t\t\t\t\t\tcur = cur.replace( \" \" + className + \" \", \" \" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = stripAndCollapse( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\tthis.setAttribute( \"class\", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\ttoggleClass: function( value, stateVal ) {\n\t\tvar classNames, className, i, self,\n\t\t\ttype = typeof value,\n\t\t\tisValidValue = type === \"string\" || Array.isArray( value );\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).toggleClass(\n\t\t\t\t\tvalue.call( this, i, getClass( this ), stateVal ),\n\t\t\t\t\tstateVal\n\t\t\t\t);\n\t\t\t} );\n\t\t}\n\n\t\tif ( typeof stateVal === \"boolean\" && isValidValue ) {\n\t\t\treturn stateVal ? this.addClass( value ) : this.removeClass( value );\n\t\t}\n\n\t\tclassNames = classesToArray( value );\n\n\t\treturn this.each( function() {\n\t\t\tif ( isValidValue ) {\n\n\t\t\t\t// Toggle individual class names\n\t\t\t\tself = jQuery( this );\n\n\t\t\t\tfor ( i = 0; i < classNames.length; i++ ) {\n\t\t\t\t\tclassName = classNames[ i ];\n\n\t\t\t\t\t// Check each className given, space separated list\n\t\t\t\t\tif ( self.hasClass( className ) ) {\n\t\t\t\t\t\tself.removeClass( className );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.addClass( className );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Toggle whole class name\n\t\t\t} else if ( value === undefined || type === \"boolean\" ) {\n\t\t\t\tclassName = getClass( this );\n\t\t\t\tif ( className ) {\n\n\t\t\t\t\t// Store className if set\n\t\t\t\t\tdataPriv.set( this, \"__className__\", className );\n\t\t\t\t}\n\n\t\t\t\t// If the element has a class name or if we're passed `false`,\n\t\t\t\t// then remove the whole classname (if there was one, the above saved it).\n\t\t\t\t// Otherwise bring back whatever was previously saved (if anything),\n\t\t\t\t// falling back to the empty string if nothing was stored.\n\t\t\t\tif ( this.setAttribute ) {\n\t\t\t\t\tthis.setAttribute( \"class\",\n\t\t\t\t\t\tclassName || value === false ?\n\t\t\t\t\t\t\t\"\" :\n\t\t\t\t\t\t\tdataPriv.get( this, \"__className__\" ) || \"\"\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\thasClass: function( selector ) {\n\t\tvar className, elem,\n\t\t\ti = 0;\n\n\t\tclassName = \" \" + selector + \" \";\n\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\tif ( elem.nodeType === 1 &&\n\t\t\t\t( \" \" + stripAndCollapse( getClass( elem ) ) + \" \" ).indexOf( className ) > -1 ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n} );\n\n\n\n\nvar rreturn = /\\r/g;\n\njQuery.fn.extend( {\n\tval: function( value ) {\n\t\tvar hooks, ret, valueIsFunction,\n\t\t\telem = this[ 0 ];\n\n\t\tif ( !arguments.length ) {\n\t\t\tif ( elem ) {\n\t\t\t\thooks = jQuery.valHooks[ elem.type ] ||\n\t\t\t\t\tjQuery.valHooks[ elem.nodeName.toLowerCase() ];\n\n\t\t\t\tif ( hooks &&\n\t\t\t\t\t\"get\" in hooks &&\n\t\t\t\t\t( ret = hooks.get( elem, \"value\" ) ) !== undefined\n\t\t\t\t) {\n\t\t\t\t\treturn ret;\n\t\t\t\t}\n\n\t\t\t\tret = elem.value;\n\n\t\t\t\t// Handle most common string cases\n\t\t\t\tif ( typeof ret === \"string\" ) {\n\t\t\t\t\treturn ret.replace( rreturn, \"\" );\n\t\t\t\t}\n\n\t\t\t\t// Handle cases where value is null/undef or number\n\t\t\t\treturn ret == null ? \"\" : ret;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tvalueIsFunction = isFunction( value );\n\n\t\treturn this.each( function( i ) {\n\t\t\tvar val;\n\n\t\t\tif ( this.nodeType !== 1 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( valueIsFunction ) {\n\t\t\t\tval = value.call( this, i, jQuery( this ).val() );\n\t\t\t} else {\n\t\t\t\tval = value;\n\t\t\t}\n\n\t\t\t// Treat null/undefined as \"\"; convert numbers to string\n\t\t\tif ( val == null ) {\n\t\t\t\tval = \"\";\n\n\t\t\t} else if ( typeof val === \"number\" ) {\n\t\t\t\tval += \"\";\n\n\t\t\t} else if ( Array.isArray( val ) ) {\n\t\t\t\tval = jQuery.map( val, function( value ) {\n\t\t\t\t\treturn value == null ? \"\" : value + \"\";\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\thooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];\n\n\t\t\t// If set returns undefined, fall back to normal setting\n\t\t\tif ( !hooks || !( \"set\" in hooks ) || hooks.set( this, val, \"value\" ) === undefined ) {\n\t\t\t\tthis.value = val;\n\t\t\t}\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tvalHooks: {\n\t\toption: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\tvar val = jQuery.find.attr( elem, \"value\" );\n\t\t\t\treturn val != null ?\n\t\t\t\t\tval :\n\n\t\t\t\t\t// Support: IE <=10 - 11 only\n\t\t\t\t\t// option.text throws exceptions (trac-14686, trac-14858)\n\t\t\t\t\t// Strip and collapse whitespace\n\t\t\t\t\t// https://html.spec.whatwg.org/#strip-and-collapse-whitespace\n\t\t\t\t\tstripAndCollapse( jQuery.text( elem ) );\n\t\t\t}\n\t\t},\n\t\tselect: {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar value, option, i,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tindex = elem.selectedIndex,\n\t\t\t\t\tone = elem.type === \"select-one\",\n\t\t\t\t\tvalues = one ? null : [],\n\t\t\t\t\tmax = one ? index + 1 : options.length;\n\n\t\t\t\tif ( index < 0 ) {\n\t\t\t\t\ti = max;\n\n\t\t\t\t} else {\n\t\t\t\t\ti = one ? index : 0;\n\t\t\t\t}\n\n\t\t\t\t// Loop through all the selected options\n\t\t\t\tfor ( ; i < max; i++ ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t// IE8-9 doesn't update selected after form reset (trac-2551)\n\t\t\t\t\tif ( ( option.selected || i === index ) &&\n\n\t\t\t\t\t\t\t// Don't return options that are disabled or in a disabled optgroup\n\t\t\t\t\t\t\t!option.disabled &&\n\t\t\t\t\t\t\t( !option.parentNode.disabled ||\n\t\t\t\t\t\t\t\t!nodeName( option.parentNode, \"optgroup\" ) ) ) {\n\n\t\t\t\t\t\t// Get the specific value for the option\n\t\t\t\t\t\tvalue = jQuery( option ).val();\n\n\t\t\t\t\t\t// We don't need an array for one selects\n\t\t\t\t\t\tif ( one ) {\n\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Multi-Selects return an array\n\t\t\t\t\t\tvalues.push( value );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn values;\n\t\t\t},\n\n\t\t\tset: function( elem, value ) {\n\t\t\t\tvar optionSet, option,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tvalues = jQuery.makeArray( value ),\n\t\t\t\t\ti = options.length;\n\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t/* eslint-disable no-cond-assign */\n\n\t\t\t\t\tif ( option.selected =\n\t\t\t\t\t\tjQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1\n\t\t\t\t\t) {\n\t\t\t\t\t\toptionSet = true;\n\t\t\t\t\t}\n\n\t\t\t\t\t/* eslint-enable no-cond-assign */\n\t\t\t\t}\n\n\t\t\t\t// Force browsers to behave consistently when non-matching value is set\n\t\t\t\tif ( !optionSet ) {\n\t\t\t\t\telem.selectedIndex = -1;\n\t\t\t\t}\n\t\t\t\treturn values;\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Radios and checkboxes getter/setter\njQuery.each( [ \"radio\", \"checkbox\" ], function() {\n\tjQuery.valHooks[ this ] = {\n\t\tset: function( elem, value ) {\n\t\t\tif ( Array.isArray( value ) ) {\n\t\t\t\treturn ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );\n\t\t\t}\n\t\t}\n\t};\n\tif ( !support.checkOn ) {\n\t\tjQuery.valHooks[ this ].get = function( elem ) {\n\t\t\treturn elem.getAttribute( \"value\" ) === null ? \"on\" : elem.value;\n\t\t};\n\t}\n} );\n\n\n\n\n// Return jQuery for attributes-only inclusion\nvar location = window.location;\n\nvar nonce = { guid: Date.now() };\n\nvar rquery = ( /\\?/ );\n\n\n\n// Cross-browser xml parsing\njQuery.parseXML = function( data ) {\n\tvar xml, parserErrorElem;\n\tif ( !data || typeof data !== \"string\" ) {\n\t\treturn null;\n\t}\n\n\t// Support: IE 9 - 11 only\n\t// IE throws on parseFromString with invalid input.\n\ttry {\n\t\txml = ( new window.DOMParser() ).parseFromString( data, \"text/xml\" );\n\t} catch ( e ) {}\n\n\tparserErrorElem = xml && xml.getElementsByTagName( \"parsererror\" )[ 0 ];\n\tif ( !xml || parserErrorElem ) {\n\t\tjQuery.error( \"Invalid XML: \" + (\n\t\t\tparserErrorElem ?\n\t\t\t\tjQuery.map( parserErrorElem.childNodes, function( el ) {\n\t\t\t\t\treturn el.textContent;\n\t\t\t\t} ).join( \"\\n\" ) :\n\t\t\t\tdata\n\t\t) );\n\t}\n\treturn xml;\n};\n\n\nvar rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,\n\tstopPropagationCallback = function( e ) {\n\t\te.stopPropagation();\n\t};\n\njQuery.extend( jQuery.event, {\n\n\ttrigger: function( event, data, elem, onlyHandlers ) {\n\n\t\tvar i, cur, tmp, bubbleType, ontype, handle, special, lastElement,\n\t\t\teventPath = [ elem || document ],\n\t\t\ttype = hasOwn.call( event, \"type\" ) ? event.type : event,\n\t\t\tnamespaces = hasOwn.call( event, \"namespace\" ) ? event.namespace.split( \".\" ) : [];\n\n\t\tcur = lastElement = tmp = elem = elem || document;\n\n\t\t// Don't do events on text and comment nodes\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 8 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// focus/blur morphs to focusin/out; ensure we're not firing them right now\n\t\tif ( rfocusMorph.test( type + jQuery.event.triggered ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( type.indexOf( \".\" ) > -1 ) {\n\n\t\t\t// Namespaced trigger; create a regexp to match event type in handle()\n\t\t\tnamespaces = type.split( \".\" );\n\t\t\ttype = namespaces.shift();\n\t\t\tnamespaces.sort();\n\t\t}\n\t\tontype = type.indexOf( \":\" ) < 0 && \"on\" + type;\n\n\t\t// Caller can pass in a jQuery.Event object, Object, or just an event type string\n\t\tevent = event[ jQuery.expando ] ?\n\t\t\tevent :\n\t\t\tnew jQuery.Event( type, typeof event === \"object\" && event );\n\n\t\t// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)\n\t\tevent.isTrigger = onlyHandlers ? 2 : 3;\n\t\tevent.namespace = namespaces.join( \".\" );\n\t\tevent.rnamespace = event.namespace ?\n\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" ) :\n\t\t\tnull;\n\n\t\t// Clean up the event in case it is being reused\n\t\tevent.result = undefined;\n\t\tif ( !event.target ) {\n\t\t\tevent.target = elem;\n\t\t}\n\n\t\t// Clone any incoming data and prepend the event, creating the handler arg list\n\t\tdata = data == null ?\n\t\t\t[ event ] :\n\t\t\tjQuery.makeArray( data, [ event ] );\n\n\t\t// Allow special events to draw outside the lines\n\t\tspecial = jQuery.event.special[ type ] || {};\n\t\tif ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine event propagation path in advance, per W3C events spec (trac-9951)\n\t\t// Bubble up to document, then to window; watch for a global ownerDocument var (trac-9724)\n\t\tif ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) {\n\n\t\t\tbubbleType = special.delegateType || type;\n\t\t\tif ( !rfocusMorph.test( bubbleType + type ) ) {\n\t\t\t\tcur = cur.parentNode;\n\t\t\t}\n\t\t\tfor ( ; cur; cur = cur.parentNode ) {\n\t\t\t\teventPath.push( cur );\n\t\t\t\ttmp = cur;\n\t\t\t}\n\n\t\t\t// Only add window if we got to document (e.g., not plain obj or detached DOM)\n\t\t\tif ( tmp === ( elem.ownerDocument || document ) ) {\n\t\t\t\teventPath.push( tmp.defaultView || tmp.parentWindow || window );\n\t\t\t}\n\t\t}\n\n\t\t// Fire handlers on the event path\n\t\ti = 0;\n\t\twhile ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {\n\t\t\tlastElement = cur;\n\t\t\tevent.type = i > 1 ?\n\t\t\t\tbubbleType :\n\t\t\t\tspecial.bindType || type;\n\n\t\t\t// jQuery handler\n\t\t\thandle = ( dataPriv.get( cur, \"events\" ) || Object.create( null ) )[ event.type ] &&\n\t\t\t\tdataPriv.get( cur, \"handle\" );\n\t\t\tif ( handle ) {\n\t\t\t\thandle.apply( cur, data );\n\t\t\t}\n\n\t\t\t// Native handler\n\t\t\thandle = ontype && cur[ ontype ];\n\t\t\tif ( handle && handle.apply && acceptData( cur ) ) {\n\t\t\t\tevent.result = handle.apply( cur, data );\n\t\t\t\tif ( event.result === false ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tevent.type = type;\n\n\t\t// If nobody prevented the default action, do it now\n\t\tif ( !onlyHandlers && !event.isDefaultPrevented() ) {\n\n\t\t\tif ( ( !special._default ||\n\t\t\t\tspecial._default.apply( eventPath.pop(), data ) === false ) &&\n\t\t\t\tacceptData( elem ) ) {\n\n\t\t\t\t// Call a native DOM method on the target with the same name as the event.\n\t\t\t\t// Don't do default actions on window, that's where global variables be (trac-6170)\n\t\t\t\tif ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) {\n\n\t\t\t\t\t// Don't re-trigger an onFOO event when we call its FOO() method\n\t\t\t\t\ttmp = elem[ ontype ];\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = null;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prevent re-triggering of the same event, since we already bubbled it above\n\t\t\t\t\tjQuery.event.triggered = type;\n\n\t\t\t\t\tif ( event.isPropagationStopped() ) {\n\t\t\t\t\t\tlastElement.addEventListener( type, stopPropagationCallback );\n\t\t\t\t\t}\n\n\t\t\t\t\telem[ type ]();\n\n\t\t\t\t\tif ( event.isPropagationStopped() ) {\n\t\t\t\t\t\tlastElement.removeEventListener( type, stopPropagationCallback );\n\t\t\t\t\t}\n\n\t\t\t\t\tjQuery.event.triggered = undefined;\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = tmp;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\t// Piggyback on a donor event to simulate a different one\n\t// Used only for `focus(in | out)` events\n\tsimulate: function( type, elem, event ) {\n\t\tvar e = jQuery.extend(\n\t\t\tnew jQuery.Event(),\n\t\t\tevent,\n\t\t\t{\n\t\t\t\ttype: type,\n\t\t\t\tisSimulated: true\n\t\t\t}\n\t\t);\n\n\t\tjQuery.event.trigger( e, null, elem );\n\t}\n\n} );\n\njQuery.fn.extend( {\n\n\ttrigger: function( type, data ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.trigger( type, data, this );\n\t\t} );\n\t},\n\ttriggerHandler: function( type, data ) {\n\t\tvar elem = this[ 0 ];\n\t\tif ( elem ) {\n\t\t\treturn jQuery.event.trigger( type, data, elem, true );\n\t\t}\n\t}\n} );\n\n\nvar\n\trbracket = /\\[\\]$/,\n\trCRLF = /\\r?\\n/g,\n\trsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,\n\trsubmittable = /^(?:input|select|textarea|keygen)/i;\n\nfunction buildParams( prefix, obj, traditional, add ) {\n\tvar name;\n\n\tif ( Array.isArray( obj ) ) {\n\n\t\t// Serialize array item.\n\t\tjQuery.each( obj, function( i, v ) {\n\t\t\tif ( traditional || rbracket.test( prefix ) ) {\n\n\t\t\t\t// Treat each array item as a scalar.\n\t\t\t\tadd( prefix, v );\n\n\t\t\t} else {\n\n\t\t\t\t// Item is non-scalar (array or object), encode its numeric index.\n\t\t\t\tbuildParams(\n\t\t\t\t\tprefix + \"[\" + ( typeof v === \"object\" && v != null ? i : \"\" ) + \"]\",\n\t\t\t\t\tv,\n\t\t\t\t\ttraditional,\n\t\t\t\t\tadd\n\t\t\t\t);\n\t\t\t}\n\t\t} );\n\n\t} else if ( !traditional && toType( obj ) === \"object\" ) {\n\n\t\t// Serialize object item.\n\t\tfor ( name in obj ) {\n\t\t\tbuildParams( prefix + \"[\" + name + \"]\", obj[ name ], traditional, add );\n\t\t}\n\n\t} else {\n\n\t\t// Serialize scalar item.\n\t\tadd( prefix, obj );\n\t}\n}\n\n// Serialize an array of form elements or a set of\n// key/values into a query string\njQuery.param = function( a, traditional ) {\n\tvar prefix,\n\t\ts = [],\n\t\tadd = function( key, valueOrFunction ) {\n\n\t\t\t// If value is a function, invoke it and use its return value\n\t\t\tvar value = isFunction( valueOrFunction ) ?\n\t\t\t\tvalueOrFunction() :\n\t\t\t\tvalueOrFunction;\n\n\t\t\ts[ s.length ] = encodeURIComponent( key ) + \"=\" +\n\t\t\t\tencodeURIComponent( value == null ? \"\" : value );\n\t\t};\n\n\tif ( a == null ) {\n\t\treturn \"\";\n\t}\n\n\t// If an array was passed in, assume that it is an array of form elements.\n\tif ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {\n\n\t\t// Serialize the form elements\n\t\tjQuery.each( a, function() {\n\t\t\tadd( this.name, this.value );\n\t\t} );\n\n\t} else {\n\n\t\t// If traditional, encode the \"old\" way (the way 1.3.2 or older\n\t\t// did it), otherwise encode params recursively.\n\t\tfor ( prefix in a ) {\n\t\t\tbuildParams( prefix, a[ prefix ], traditional, add );\n\t\t}\n\t}\n\n\t// Return the resulting serialization\n\treturn s.join( \"&\" );\n};\n\njQuery.fn.extend( {\n\tserialize: function() {\n\t\treturn jQuery.param( this.serializeArray() );\n\t},\n\tserializeArray: function() {\n\t\treturn this.map( function() {\n\n\t\t\t// Can add propHook for \"elements\" to filter or add form elements\n\t\t\tvar elements = jQuery.prop( this, \"elements\" );\n\t\t\treturn elements ? jQuery.makeArray( elements ) : this;\n\t\t} ).filter( function() {\n\t\t\tvar type = this.type;\n\n\t\t\t// Use .is( \":disabled\" ) so that fieldset[disabled] works\n\t\t\treturn this.name && !jQuery( this ).is( \":disabled\" ) &&\n\t\t\t\trsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&\n\t\t\t\t( this.checked || !rcheckableType.test( type ) );\n\t\t} ).map( function( _i, elem ) {\n\t\t\tvar val = jQuery( this ).val();\n\n\t\t\tif ( val == null ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif ( Array.isArray( val ) ) {\n\t\t\t\treturn jQuery.map( val, function( val ) {\n\t\t\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t} ).get();\n\t}\n} );\n\n\nvar\n\tr20 = /%20/g,\n\trhash = /#.*$/,\n\trantiCache = /([?&])_=[^&]*/,\n\trheaders = /^(.*?):[ \\t]*([^\\r\\n]*)$/mg,\n\n\t// trac-7653, trac-8125, trac-8152: local protocol detection\n\trlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,\n\trnoContent = /^(?:GET|HEAD)$/,\n\trprotocol = /^\\/\\//,\n\n\t/* Prefilters\n\t * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)\n\t * 2) These are called:\n\t *    - BEFORE asking for a transport\n\t *    - AFTER param serialization (s.data is a string if s.processData is true)\n\t * 3) key is the dataType\n\t * 4) the catchall symbol \"*\" can be used\n\t * 5) execution will start with transport dataType and THEN continue down to \"*\" if needed\n\t */\n\tprefilters = {},\n\n\t/* Transports bindings\n\t * 1) key is the dataType\n\t * 2) the catchall symbol \"*\" can be used\n\t * 3) selection will start with transport dataType and THEN go to \"*\" if needed\n\t */\n\ttransports = {},\n\n\t// Avoid comment-prolog char sequence (trac-10098); must appease lint and evade compression\n\tallTypes = \"*/\".concat( \"*\" ),\n\n\t// Anchor tag for parsing the document origin\n\toriginAnchor = document.createElement( \"a\" );\n\noriginAnchor.href = location.href;\n\n// Base \"constructor\" for jQuery.ajaxPrefilter and jQuery.ajaxTransport\nfunction addToPrefiltersOrTransports( structure ) {\n\n\t// dataTypeExpression is optional and defaults to \"*\"\n\treturn function( dataTypeExpression, func ) {\n\n\t\tif ( typeof dataTypeExpression !== \"string\" ) {\n\t\t\tfunc = dataTypeExpression;\n\t\t\tdataTypeExpression = \"*\";\n\t\t}\n\n\t\tvar dataType,\n\t\t\ti = 0,\n\t\t\tdataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];\n\n\t\tif ( isFunction( func ) ) {\n\n\t\t\t// For each dataType in the dataTypeExpression\n\t\t\twhile ( ( dataType = dataTypes[ i++ ] ) ) {\n\n\t\t\t\t// Prepend if requested\n\t\t\t\tif ( dataType[ 0 ] === \"+\" ) {\n\t\t\t\t\tdataType = dataType.slice( 1 ) || \"*\";\n\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );\n\n\t\t\t\t// Otherwise append\n\t\t\t\t} else {\n\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).push( func );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\n// Base inspection function for prefilters and transports\nfunction inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {\n\n\tvar inspected = {},\n\t\tseekingTransport = ( structure === transports );\n\n\tfunction inspect( dataType ) {\n\t\tvar selected;\n\t\tinspected[ dataType ] = true;\n\t\tjQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {\n\t\t\tvar dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );\n\t\t\tif ( typeof dataTypeOrTransport === \"string\" &&\n\t\t\t\t!seekingTransport && !inspected[ dataTypeOrTransport ] ) {\n\n\t\t\t\toptions.dataTypes.unshift( dataTypeOrTransport );\n\t\t\t\tinspect( dataTypeOrTransport );\n\t\t\t\treturn false;\n\t\t\t} else if ( seekingTransport ) {\n\t\t\t\treturn !( selected = dataTypeOrTransport );\n\t\t\t}\n\t\t} );\n\t\treturn selected;\n\t}\n\n\treturn inspect( options.dataTypes[ 0 ] ) || !inspected[ \"*\" ] && inspect( \"*\" );\n}\n\n// A special extend for ajax options\n// that takes \"flat\" options (not to be deep extended)\n// Fixes trac-9887\nfunction ajaxExtend( target, src ) {\n\tvar key, deep,\n\t\tflatOptions = jQuery.ajaxSettings.flatOptions || {};\n\n\tfor ( key in src ) {\n\t\tif ( src[ key ] !== undefined ) {\n\t\t\t( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];\n\t\t}\n\t}\n\tif ( deep ) {\n\t\tjQuery.extend( true, target, deep );\n\t}\n\n\treturn target;\n}\n\n/* Handles responses to an ajax request:\n * - finds the right dataType (mediates between content-type and expected dataType)\n * - returns the corresponding response\n */\nfunction ajaxHandleResponses( s, jqXHR, responses ) {\n\n\tvar ct, type, finalDataType, firstDataType,\n\t\tcontents = s.contents,\n\t\tdataTypes = s.dataTypes;\n\n\t// Remove auto dataType and get content-type in the process\n\twhile ( dataTypes[ 0 ] === \"*\" ) {\n\t\tdataTypes.shift();\n\t\tif ( ct === undefined ) {\n\t\t\tct = s.mimeType || jqXHR.getResponseHeader( \"Content-Type\" );\n\t\t}\n\t}\n\n\t// Check if we're dealing with a known content-type\n\tif ( ct ) {\n\t\tfor ( type in contents ) {\n\t\t\tif ( contents[ type ] && contents[ type ].test( ct ) ) {\n\t\t\t\tdataTypes.unshift( type );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check to see if we have a response for the expected dataType\n\tif ( dataTypes[ 0 ] in responses ) {\n\t\tfinalDataType = dataTypes[ 0 ];\n\t} else {\n\n\t\t// Try convertible dataTypes\n\t\tfor ( type in responses ) {\n\t\t\tif ( !dataTypes[ 0 ] || s.converters[ type + \" \" + dataTypes[ 0 ] ] ) {\n\t\t\t\tfinalDataType = type;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( !firstDataType ) {\n\t\t\t\tfirstDataType = type;\n\t\t\t}\n\t\t}\n\n\t\t// Or just use first one\n\t\tfinalDataType = finalDataType || firstDataType;\n\t}\n\n\t// If we found a dataType\n\t// We add the dataType to the list if needed\n\t// and return the corresponding response\n\tif ( finalDataType ) {\n\t\tif ( finalDataType !== dataTypes[ 0 ] ) {\n\t\t\tdataTypes.unshift( finalDataType );\n\t\t}\n\t\treturn responses[ finalDataType ];\n\t}\n}\n\n/* Chain conversions given the request and the original response\n * Also sets the responseXXX fields on the jqXHR instance\n */\nfunction ajaxConvert( s, response, jqXHR, isSuccess ) {\n\tvar conv2, current, conv, tmp, prev,\n\t\tconverters = {},\n\n\t\t// Work with a copy of dataTypes in case we need to modify it for conversion\n\t\tdataTypes = s.dataTypes.slice();\n\n\t// Create converters map with lowercased keys\n\tif ( dataTypes[ 1 ] ) {\n\t\tfor ( conv in s.converters ) {\n\t\t\tconverters[ conv.toLowerCase() ] = s.converters[ conv ];\n\t\t}\n\t}\n\n\tcurrent = dataTypes.shift();\n\n\t// Convert to each sequential dataType\n\twhile ( current ) {\n\n\t\tif ( s.responseFields[ current ] ) {\n\t\t\tjqXHR[ s.responseFields[ current ] ] = response;\n\t\t}\n\n\t\t// Apply the dataFilter if provided\n\t\tif ( !prev && isSuccess && s.dataFilter ) {\n\t\t\tresponse = s.dataFilter( response, s.dataType );\n\t\t}\n\n\t\tprev = current;\n\t\tcurrent = dataTypes.shift();\n\n\t\tif ( current ) {\n\n\t\t\t// There's only work to do if current dataType is non-auto\n\t\t\tif ( current === \"*\" ) {\n\n\t\t\t\tcurrent = prev;\n\n\t\t\t// Convert response if prev dataType is non-auto and differs from current\n\t\t\t} else if ( prev !== \"*\" && prev !== current ) {\n\n\t\t\t\t// Seek a direct converter\n\t\t\t\tconv = converters[ prev + \" \" + current ] || converters[ \"* \" + current ];\n\n\t\t\t\t// If none found, seek a pair\n\t\t\t\tif ( !conv ) {\n\t\t\t\t\tfor ( conv2 in converters ) {\n\n\t\t\t\t\t\t// If conv2 outputs current\n\t\t\t\t\t\ttmp = conv2.split( \" \" );\n\t\t\t\t\t\tif ( tmp[ 1 ] === current ) {\n\n\t\t\t\t\t\t\t// If prev can be converted to accepted input\n\t\t\t\t\t\t\tconv = converters[ prev + \" \" + tmp[ 0 ] ] ||\n\t\t\t\t\t\t\t\tconverters[ \"* \" + tmp[ 0 ] ];\n\t\t\t\t\t\t\tif ( conv ) {\n\n\t\t\t\t\t\t\t\t// Condense equivalence converters\n\t\t\t\t\t\t\t\tif ( conv === true ) {\n\t\t\t\t\t\t\t\t\tconv = converters[ conv2 ];\n\n\t\t\t\t\t\t\t\t// Otherwise, insert the intermediate dataType\n\t\t\t\t\t\t\t\t} else if ( converters[ conv2 ] !== true ) {\n\t\t\t\t\t\t\t\t\tcurrent = tmp[ 0 ];\n\t\t\t\t\t\t\t\t\tdataTypes.unshift( tmp[ 1 ] );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Apply converter (if not an equivalence)\n\t\t\t\tif ( conv !== true ) {\n\n\t\t\t\t\t// Unless errors are allowed to bubble, catch and return them\n\t\t\t\t\tif ( conv && s.throws ) {\n\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tstate: \"parsererror\",\n\t\t\t\t\t\t\t\terror: conv ? e : \"No conversion from \" + prev + \" to \" + current\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { state: \"success\", data: response };\n}\n\njQuery.extend( {\n\n\t// Counter for holding the number of active queries\n\tactive: 0,\n\n\t// Last-Modified header cache for next request\n\tlastModified: {},\n\tetag: {},\n\n\tajaxSettings: {\n\t\turl: location.href,\n\t\ttype: \"GET\",\n\t\tisLocal: rlocalProtocol.test( location.protocol ),\n\t\tglobal: true,\n\t\tprocessData: true,\n\t\tasync: true,\n\t\tcontentType: \"application/x-www-form-urlencoded; charset=UTF-8\",\n\n\t\t/*\n\t\ttimeout: 0,\n\t\tdata: null,\n\t\tdataType: null,\n\t\tusername: null,\n\t\tpassword: null,\n\t\tcache: null,\n\t\tthrows: false,\n\t\ttraditional: false,\n\t\theaders: {},\n\t\t*/\n\n\t\taccepts: {\n\t\t\t\"*\": allTypes,\n\t\t\ttext: \"text/plain\",\n\t\t\thtml: \"text/html\",\n\t\t\txml: \"application/xml, text/xml\",\n\t\t\tjson: \"application/json, text/javascript\"\n\t\t},\n\n\t\tcontents: {\n\t\t\txml: /\\bxml\\b/,\n\t\t\thtml: /\\bhtml/,\n\t\t\tjson: /\\bjson\\b/\n\t\t},\n\n\t\tresponseFields: {\n\t\t\txml: \"responseXML\",\n\t\t\ttext: \"responseText\",\n\t\t\tjson: \"responseJSON\"\n\t\t},\n\n\t\t// Data converters\n\t\t// Keys separate source (or catchall \"*\") and destination types with a single space\n\t\tconverters: {\n\n\t\t\t// Convert anything to text\n\t\t\t\"* text\": String,\n\n\t\t\t// Text to html (true = no transformation)\n\t\t\t\"text html\": true,\n\n\t\t\t// Evaluate text as a json expression\n\t\t\t\"text json\": JSON.parse,\n\n\t\t\t// Parse text as xml\n\t\t\t\"text xml\": jQuery.parseXML\n\t\t},\n\n\t\t// For options that shouldn't be deep extended:\n\t\t// you can add your own custom options here if\n\t\t// and when you create one that shouldn't be\n\t\t// deep extended (see ajaxExtend)\n\t\tflatOptions: {\n\t\t\turl: true,\n\t\t\tcontext: true\n\t\t}\n\t},\n\n\t// Creates a full fledged settings object into target\n\t// with both ajaxSettings and settings fields.\n\t// If target is omitted, writes into ajaxSettings.\n\tajaxSetup: function( target, settings ) {\n\t\treturn settings ?\n\n\t\t\t// Building a settings object\n\t\t\tajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :\n\n\t\t\t// Extending ajaxSettings\n\t\t\tajaxExtend( jQuery.ajaxSettings, target );\n\t},\n\n\tajaxPrefilter: addToPrefiltersOrTransports( prefilters ),\n\tajaxTransport: addToPrefiltersOrTransports( transports ),\n\n\t// Main method\n\tajax: function( url, options ) {\n\n\t\t// If url is an object, simulate pre-1.5 signature\n\t\tif ( typeof url === \"object\" ) {\n\t\t\toptions = url;\n\t\t\turl = undefined;\n\t\t}\n\n\t\t// Force options to be an object\n\t\toptions = options || {};\n\n\t\tvar transport,\n\n\t\t\t// URL without anti-cache param\n\t\t\tcacheURL,\n\n\t\t\t// Response headers\n\t\t\tresponseHeadersString,\n\t\t\tresponseHeaders,\n\n\t\t\t// timeout handle\n\t\t\ttimeoutTimer,\n\n\t\t\t// Url cleanup var\n\t\t\turlAnchor,\n\n\t\t\t// Request state (becomes false upon send and true upon completion)\n\t\t\tcompleted,\n\n\t\t\t// To know if global events are to be dispatched\n\t\t\tfireGlobals,\n\n\t\t\t// Loop variable\n\t\t\ti,\n\n\t\t\t// uncached part of the url\n\t\t\tuncached,\n\n\t\t\t// Create the final options object\n\t\t\ts = jQuery.ajaxSetup( {}, options ),\n\n\t\t\t// Callbacks context\n\t\t\tcallbackContext = s.context || s,\n\n\t\t\t// Context for global events is callbackContext if it is a DOM node or jQuery collection\n\t\t\tglobalEventContext = s.context &&\n\t\t\t\t( callbackContext.nodeType || callbackContext.jquery ) ?\n\t\t\t\tjQuery( callbackContext ) :\n\t\t\t\tjQuery.event,\n\n\t\t\t// Deferreds\n\t\t\tdeferred = jQuery.Deferred(),\n\t\t\tcompleteDeferred = jQuery.Callbacks( \"once memory\" ),\n\n\t\t\t// Status-dependent callbacks\n\t\t\tstatusCode = s.statusCode || {},\n\n\t\t\t// Headers (they are sent all at once)\n\t\t\trequestHeaders = {},\n\t\t\trequestHeadersNames = {},\n\n\t\t\t// Default abort message\n\t\t\tstrAbort = \"canceled\",\n\n\t\t\t// Fake xhr\n\t\t\tjqXHR = {\n\t\t\t\treadyState: 0,\n\n\t\t\t\t// Builds headers hashtable if needed\n\t\t\t\tgetResponseHeader: function( key ) {\n\t\t\t\t\tvar match;\n\t\t\t\t\tif ( completed ) {\n\t\t\t\t\t\tif ( !responseHeaders ) {\n\t\t\t\t\t\t\tresponseHeaders = {};\n\t\t\t\t\t\t\twhile ( ( match = rheaders.exec( responseHeadersString ) ) ) {\n\t\t\t\t\t\t\t\tresponseHeaders[ match[ 1 ].toLowerCase() + \" \" ] =\n\t\t\t\t\t\t\t\t\t( responseHeaders[ match[ 1 ].toLowerCase() + \" \" ] || [] )\n\t\t\t\t\t\t\t\t\t\t.concat( match[ 2 ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmatch = responseHeaders[ key.toLowerCase() + \" \" ];\n\t\t\t\t\t}\n\t\t\t\t\treturn match == null ? null : match.join( \", \" );\n\t\t\t\t},\n\n\t\t\t\t// Raw string\n\t\t\t\tgetAllResponseHeaders: function() {\n\t\t\t\t\treturn completed ? responseHeadersString : null;\n\t\t\t\t},\n\n\t\t\t\t// Caches the header\n\t\t\t\tsetRequestHeader: function( name, value ) {\n\t\t\t\t\tif ( completed == null ) {\n\t\t\t\t\t\tname = requestHeadersNames[ name.toLowerCase() ] =\n\t\t\t\t\t\t\trequestHeadersNames[ name.toLowerCase() ] || name;\n\t\t\t\t\t\trequestHeaders[ name ] = value;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Overrides response content-type header\n\t\t\t\toverrideMimeType: function( type ) {\n\t\t\t\t\tif ( completed == null ) {\n\t\t\t\t\t\ts.mimeType = type;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Status-dependent callbacks\n\t\t\t\tstatusCode: function( map ) {\n\t\t\t\t\tvar code;\n\t\t\t\t\tif ( map ) {\n\t\t\t\t\t\tif ( completed ) {\n\n\t\t\t\t\t\t\t// Execute the appropriate callbacks\n\t\t\t\t\t\t\tjqXHR.always( map[ jqXHR.status ] );\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Lazy-add the new callbacks in a way that preserves old ones\n\t\t\t\t\t\t\tfor ( code in map ) {\n\t\t\t\t\t\t\t\tstatusCode[ code ] = [ statusCode[ code ], map[ code ] ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Cancel the request\n\t\t\t\tabort: function( statusText ) {\n\t\t\t\t\tvar finalText = statusText || strAbort;\n\t\t\t\t\tif ( transport ) {\n\t\t\t\t\t\ttransport.abort( finalText );\n\t\t\t\t\t}\n\t\t\t\t\tdone( 0, finalText );\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t};\n\n\t\t// Attach deferreds\n\t\tdeferred.promise( jqXHR );\n\n\t\t// Add protocol if not provided (prefilters might expect it)\n\t\t// Handle falsy url in the settings object (trac-10093: consistency with old signature)\n\t\t// We also use the url parameter if available\n\t\ts.url = ( ( url || s.url || location.href ) + \"\" )\n\t\t\t.replace( rprotocol, location.protocol + \"//\" );\n\n\t\t// Alias method option to type as per ticket trac-12004\n\t\ts.type = options.method || options.type || s.method || s.type;\n\n\t\t// Extract dataTypes list\n\t\ts.dataTypes = ( s.dataType || \"*\" ).toLowerCase().match( rnothtmlwhite ) || [ \"\" ];\n\n\t\t// A cross-domain request is in order when the origin doesn't match the current origin.\n\t\tif ( s.crossDomain == null ) {\n\t\t\turlAnchor = document.createElement( \"a\" );\n\n\t\t\t// Support: IE <=8 - 11, Edge 12 - 15\n\t\t\t// IE throws exception on accessing the href property if url is malformed,\n\t\t\t// e.g. http://example.com:80x/\n\t\t\ttry {\n\t\t\t\turlAnchor.href = s.url;\n\n\t\t\t\t// Support: IE <=8 - 11 only\n\t\t\t\t// Anchor's host property isn't correctly set when s.url is relative\n\t\t\t\turlAnchor.href = urlAnchor.href;\n\t\t\t\ts.crossDomain = originAnchor.protocol + \"//\" + originAnchor.host !==\n\t\t\t\t\turlAnchor.protocol + \"//\" + urlAnchor.host;\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// If there is an error parsing the URL, assume it is crossDomain,\n\t\t\t\t// it can be rejected by the transport if it is invalid\n\t\t\t\ts.crossDomain = true;\n\t\t\t}\n\t\t}\n\n\t\t// Convert data if not already a string\n\t\tif ( s.data && s.processData && typeof s.data !== \"string\" ) {\n\t\t\ts.data = jQuery.param( s.data, s.traditional );\n\t\t}\n\n\t\t// Apply prefilters\n\t\tinspectPrefiltersOrTransports( prefilters, s, options, jqXHR );\n\n\t\t// If request was aborted inside a prefilter, stop there\n\t\tif ( completed ) {\n\t\t\treturn jqXHR;\n\t\t}\n\n\t\t// We can fire global events as of now if asked to\n\t\t// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (trac-15118)\n\t\tfireGlobals = jQuery.event && s.global;\n\n\t\t// Watch for a new set of requests\n\t\tif ( fireGlobals && jQuery.active++ === 0 ) {\n\t\t\tjQuery.event.trigger( \"ajaxStart\" );\n\t\t}\n\n\t\t// Uppercase the type\n\t\ts.type = s.type.toUpperCase();\n\n\t\t// Determine if request has content\n\t\ts.hasContent = !rnoContent.test( s.type );\n\n\t\t// Save the URL in case we're toying with the If-Modified-Since\n\t\t// and/or If-None-Match header later on\n\t\t// Remove hash to simplify url manipulation\n\t\tcacheURL = s.url.replace( rhash, \"\" );\n\n\t\t// More options handling for requests with no content\n\t\tif ( !s.hasContent ) {\n\n\t\t\t// Remember the hash so we can put it back\n\t\t\tuncached = s.url.slice( cacheURL.length );\n\n\t\t\t// If data is available and should be processed, append data to url\n\t\t\tif ( s.data && ( s.processData || typeof s.data === \"string\" ) ) {\n\t\t\t\tcacheURL += ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + s.data;\n\n\t\t\t\t// trac-9682: remove data so that it's not used in an eventual retry\n\t\t\t\tdelete s.data;\n\t\t\t}\n\n\t\t\t// Add or update anti-cache param if needed\n\t\t\tif ( s.cache === false ) {\n\t\t\t\tcacheURL = cacheURL.replace( rantiCache, \"$1\" );\n\t\t\t\tuncached = ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + \"_=\" + ( nonce.guid++ ) +\n\t\t\t\t\tuncached;\n\t\t\t}\n\n\t\t\t// Put hash and anti-cache on the URL that will be requested (gh-1732)\n\t\t\ts.url = cacheURL + uncached;\n\n\t\t// Change '%20' to '+' if this is encoded form body content (gh-2658)\n\t\t} else if ( s.data && s.processData &&\n\t\t\t( s.contentType || \"\" ).indexOf( \"application/x-www-form-urlencoded\" ) === 0 ) {\n\t\t\ts.data = s.data.replace( r20, \"+\" );\n\t\t}\n\n\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\tif ( s.ifModified ) {\n\t\t\tif ( jQuery.lastModified[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-Modified-Since\", jQuery.lastModified[ cacheURL ] );\n\t\t\t}\n\t\t\tif ( jQuery.etag[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-None-Match\", jQuery.etag[ cacheURL ] );\n\t\t\t}\n\t\t}\n\n\t\t// Set the correct header, if data is being sent\n\t\tif ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {\n\t\t\tjqXHR.setRequestHeader( \"Content-Type\", s.contentType );\n\t\t}\n\n\t\t// Set the Accepts header for the server, depending on the dataType\n\t\tjqXHR.setRequestHeader(\n\t\t\t\"Accept\",\n\t\t\ts.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?\n\t\t\t\ts.accepts[ s.dataTypes[ 0 ] ] +\n\t\t\t\t\t( s.dataTypes[ 0 ] !== \"*\" ? \", \" + allTypes + \"; q=0.01\" : \"\" ) :\n\t\t\t\ts.accepts[ \"*\" ]\n\t\t);\n\n\t\t// Check for headers option\n\t\tfor ( i in s.headers ) {\n\t\t\tjqXHR.setRequestHeader( i, s.headers[ i ] );\n\t\t}\n\n\t\t// Allow custom headers/mimetypes and early abort\n\t\tif ( s.beforeSend &&\n\t\t\t( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {\n\n\t\t\t// Abort if not done already and return\n\t\t\treturn jqXHR.abort();\n\t\t}\n\n\t\t// Aborting is no longer a cancellation\n\t\tstrAbort = \"abort\";\n\n\t\t// Install callbacks on deferreds\n\t\tcompleteDeferred.add( s.complete );\n\t\tjqXHR.done( s.success );\n\t\tjqXHR.fail( s.error );\n\n\t\t// Get transport\n\t\ttransport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );\n\n\t\t// If no transport, we auto-abort\n\t\tif ( !transport ) {\n\t\t\tdone( -1, \"No Transport\" );\n\t\t} else {\n\t\t\tjqXHR.readyState = 1;\n\n\t\t\t// Send global event\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxSend\", [ jqXHR, s ] );\n\t\t\t}\n\n\t\t\t// If request was aborted inside ajaxSend, stop there\n\t\t\tif ( completed ) {\n\t\t\t\treturn jqXHR;\n\t\t\t}\n\n\t\t\t// Timeout\n\t\t\tif ( s.async && s.timeout > 0 ) {\n\t\t\t\ttimeoutTimer = window.setTimeout( function() {\n\t\t\t\t\tjqXHR.abort( \"timeout\" );\n\t\t\t\t}, s.timeout );\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tcompleted = false;\n\t\t\t\ttransport.send( requestHeaders, done );\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// Rethrow post-completion exceptions\n\t\t\t\tif ( completed ) {\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\n\t\t\t\t// Propagate others as results\n\t\t\t\tdone( -1, e );\n\t\t\t}\n\t\t}\n\n\t\t// Callback for when everything is done\n\t\tfunction done( status, nativeStatusText, responses, headers ) {\n\t\t\tvar isSuccess, success, error, response, modified,\n\t\t\t\tstatusText = nativeStatusText;\n\n\t\t\t// Ignore repeat invocations\n\t\t\tif ( completed ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcompleted = true;\n\n\t\t\t// Clear timeout if it exists\n\t\t\tif ( timeoutTimer ) {\n\t\t\t\twindow.clearTimeout( timeoutTimer );\n\t\t\t}\n\n\t\t\t// Dereference transport for early garbage collection\n\t\t\t// (no matter how long the jqXHR object will be used)\n\t\t\ttransport = undefined;\n\n\t\t\t// Cache response headers\n\t\t\tresponseHeadersString = headers || \"\";\n\n\t\t\t// Set readyState\n\t\t\tjqXHR.readyState = status > 0 ? 4 : 0;\n\n\t\t\t// Determine if successful\n\t\t\tisSuccess = status >= 200 && status < 300 || status === 304;\n\n\t\t\t// Get response data\n\t\t\tif ( responses ) {\n\t\t\t\tresponse = ajaxHandleResponses( s, jqXHR, responses );\n\t\t\t}\n\n\t\t\t// Use a noop converter for missing script but not if jsonp\n\t\t\tif ( !isSuccess &&\n\t\t\t\tjQuery.inArray( \"script\", s.dataTypes ) > -1 &&\n\t\t\t\tjQuery.inArray( \"json\", s.dataTypes ) < 0 ) {\n\t\t\t\ts.converters[ \"text script\" ] = function() {};\n\t\t\t}\n\n\t\t\t// Convert no matter what (that way responseXXX fields are always set)\n\t\t\tresponse = ajaxConvert( s, response, jqXHR, isSuccess );\n\n\t\t\t// If successful, handle type chaining\n\t\t\tif ( isSuccess ) {\n\n\t\t\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\t\t\tif ( s.ifModified ) {\n\t\t\t\t\tmodified = jqXHR.getResponseHeader( \"Last-Modified\" );\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.lastModified[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t\tmodified = jqXHR.getResponseHeader( \"etag\" );\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.etag[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// if no content\n\t\t\t\tif ( status === 204 || s.type === \"HEAD\" ) {\n\t\t\t\t\tstatusText = \"nocontent\";\n\n\t\t\t\t// if not modified\n\t\t\t\t} else if ( status === 304 ) {\n\t\t\t\t\tstatusText = \"notmodified\";\n\n\t\t\t\t// If we have data, let's convert it\n\t\t\t\t} else {\n\t\t\t\t\tstatusText = response.state;\n\t\t\t\t\tsuccess = response.data;\n\t\t\t\t\terror = response.error;\n\t\t\t\t\tisSuccess = !error;\n\t\t\t\t}\n\t\t\t} else {\n\n\t\t\t\t// Extract error from statusText and normalize for non-aborts\n\t\t\t\terror = statusText;\n\t\t\t\tif ( status || !statusText ) {\n\t\t\t\t\tstatusText = \"error\";\n\t\t\t\t\tif ( status < 0 ) {\n\t\t\t\t\t\tstatus = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set data for the fake xhr object\n\t\t\tjqXHR.status = status;\n\t\t\tjqXHR.statusText = ( nativeStatusText || statusText ) + \"\";\n\n\t\t\t// Success/Error\n\t\t\tif ( isSuccess ) {\n\t\t\t\tdeferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );\n\t\t\t} else {\n\t\t\t\tdeferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );\n\t\t\t}\n\n\t\t\t// Status-dependent callbacks\n\t\t\tjqXHR.statusCode( statusCode );\n\t\t\tstatusCode = undefined;\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( isSuccess ? \"ajaxSuccess\" : \"ajaxError\",\n\t\t\t\t\t[ jqXHR, s, isSuccess ? success : error ] );\n\t\t\t}\n\n\t\t\t// Complete\n\t\t\tcompleteDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxComplete\", [ jqXHR, s ] );\n\n\t\t\t\t// Handle the global AJAX counter\n\t\t\t\tif ( !( --jQuery.active ) ) {\n\t\t\t\t\tjQuery.event.trigger( \"ajaxStop\" );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn jqXHR;\n\t},\n\n\tgetJSON: function( url, data, callback ) {\n\t\treturn jQuery.get( url, data, callback, \"json\" );\n\t},\n\n\tgetScript: function( url, callback ) {\n\t\treturn jQuery.get( url, undefined, callback, \"script\" );\n\t}\n} );\n\njQuery.each( [ \"get\", \"post\" ], function( _i, method ) {\n\tjQuery[ method ] = function( url, data, callback, type ) {\n\n\t\t// Shift arguments if data argument was omitted\n\t\tif ( isFunction( data ) ) {\n\t\t\ttype = type || callback;\n\t\t\tcallback = data;\n\t\t\tdata = undefined;\n\t\t}\n\n\t\t// The url can be an options object (which then must have .url)\n\t\treturn jQuery.ajax( jQuery.extend( {\n\t\t\turl: url,\n\t\t\ttype: method,\n\t\t\tdataType: type,\n\t\t\tdata: data,\n\t\t\tsuccess: callback\n\t\t}, jQuery.isPlainObject( url ) && url ) );\n\t};\n} );\n\njQuery.ajaxPrefilter( function( s ) {\n\tvar i;\n\tfor ( i in s.headers ) {\n\t\tif ( i.toLowerCase() === \"content-type\" ) {\n\t\t\ts.contentType = s.headers[ i ] || \"\";\n\t\t}\n\t}\n} );\n\n\njQuery._evalUrl = function( url, options, doc ) {\n\treturn jQuery.ajax( {\n\t\turl: url,\n\n\t\t// Make this explicit, since user can override this through ajaxSetup (trac-11264)\n\t\ttype: \"GET\",\n\t\tdataType: \"script\",\n\t\tcache: true,\n\t\tasync: false,\n\t\tglobal: false,\n\n\t\t// Only evaluate the response if it is successful (gh-4126)\n\t\t// dataFilter is not invoked for failure responses, so using it instead\n\t\t// of the default converter is kludgy but it works.\n\t\tconverters: {\n\t\t\t\"text script\": function() {}\n\t\t},\n\t\tdataFilter: function( response ) {\n\t\t\tjQuery.globalEval( response, options, doc );\n\t\t}\n\t} );\n};\n\n\njQuery.fn.extend( {\n\twrapAll: function( html ) {\n\t\tvar wrap;\n\n\t\tif ( this[ 0 ] ) {\n\t\t\tif ( isFunction( html ) ) {\n\t\t\t\thtml = html.call( this[ 0 ] );\n\t\t\t}\n\n\t\t\t// The elements to wrap the target around\n\t\t\twrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );\n\n\t\t\tif ( this[ 0 ].parentNode ) {\n\t\t\t\twrap.insertBefore( this[ 0 ] );\n\t\t\t}\n\n\t\t\twrap.map( function() {\n\t\t\t\tvar elem = this;\n\n\t\t\t\twhile ( elem.firstElementChild ) {\n\t\t\t\t\telem = elem.firstElementChild;\n\t\t\t\t}\n\n\t\t\t\treturn elem;\n\t\t\t} ).append( this );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\twrapInner: function( html ) {\n\t\tif ( isFunction( html ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).wrapInner( html.call( this, i ) );\n\t\t\t} );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar self = jQuery( this ),\n\t\t\t\tcontents = self.contents();\n\n\t\t\tif ( contents.length ) {\n\t\t\t\tcontents.wrapAll( html );\n\n\t\t\t} else {\n\t\t\t\tself.append( html );\n\t\t\t}\n\t\t} );\n\t},\n\n\twrap: function( html ) {\n\t\tvar htmlIsFunction = isFunction( html );\n\n\t\treturn this.each( function( i ) {\n\t\t\tjQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html );\n\t\t} );\n\t},\n\n\tunwrap: function( selector ) {\n\t\tthis.parent( selector ).not( \"body\" ).each( function() {\n\t\t\tjQuery( this ).replaceWith( this.childNodes );\n\t\t} );\n\t\treturn this;\n\t}\n} );\n\n\njQuery.expr.pseudos.hidden = function( elem ) {\n\treturn !jQuery.expr.pseudos.visible( elem );\n};\njQuery.expr.pseudos.visible = function( elem ) {\n\treturn !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );\n};\n\n\n\n\njQuery.ajaxSettings.xhr = function() {\n\ttry {\n\t\treturn new window.XMLHttpRequest();\n\t} catch ( e ) {}\n};\n\nvar xhrSuccessStatus = {\n\n\t\t// File protocol always yields status code 0, assume 200\n\t\t0: 200,\n\n\t\t// Support: IE <=9 only\n\t\t// trac-1450: sometimes IE returns 1223 when it should be 204\n\t\t1223: 204\n\t},\n\txhrSupported = jQuery.ajaxSettings.xhr();\n\nsupport.cors = !!xhrSupported && ( \"withCredentials\" in xhrSupported );\nsupport.ajax = xhrSupported = !!xhrSupported;\n\njQuery.ajaxTransport( function( options ) {\n\tvar callback, errorCallback;\n\n\t// Cross domain only allowed if supported through XMLHttpRequest\n\tif ( support.cors || xhrSupported && !options.crossDomain ) {\n\t\treturn {\n\t\t\tsend: function( headers, complete ) {\n\t\t\t\tvar i,\n\t\t\t\t\txhr = options.xhr();\n\n\t\t\t\txhr.open(\n\t\t\t\t\toptions.type,\n\t\t\t\t\toptions.url,\n\t\t\t\t\toptions.async,\n\t\t\t\t\toptions.username,\n\t\t\t\t\toptions.password\n\t\t\t\t);\n\n\t\t\t\t// Apply custom fields if provided\n\t\t\t\tif ( options.xhrFields ) {\n\t\t\t\t\tfor ( i in options.xhrFields ) {\n\t\t\t\t\t\txhr[ i ] = options.xhrFields[ i ];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Override mime type if needed\n\t\t\t\tif ( options.mimeType && xhr.overrideMimeType ) {\n\t\t\t\t\txhr.overrideMimeType( options.mimeType );\n\t\t\t\t}\n\n\t\t\t\t// X-Requested-With header\n\t\t\t\t// For cross-domain requests, seeing as conditions for a preflight are\n\t\t\t\t// akin to a jigsaw puzzle, we simply never set it to be sure.\n\t\t\t\t// (it can always be set on a per-request basis or even using ajaxSetup)\n\t\t\t\t// For same-domain requests, won't change header if already provided.\n\t\t\t\tif ( !options.crossDomain && !headers[ \"X-Requested-With\" ] ) {\n\t\t\t\t\theaders[ \"X-Requested-With\" ] = \"XMLHttpRequest\";\n\t\t\t\t}\n\n\t\t\t\t// Set headers\n\t\t\t\tfor ( i in headers ) {\n\t\t\t\t\txhr.setRequestHeader( i, headers[ i ] );\n\t\t\t\t}\n\n\t\t\t\t// Callback\n\t\t\t\tcallback = function( type ) {\n\t\t\t\t\treturn function() {\n\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\tcallback = errorCallback = xhr.onload =\n\t\t\t\t\t\t\t\txhr.onerror = xhr.onabort = xhr.ontimeout =\n\t\t\t\t\t\t\t\t\txhr.onreadystatechange = null;\n\n\t\t\t\t\t\t\tif ( type === \"abort\" ) {\n\t\t\t\t\t\t\t\txhr.abort();\n\t\t\t\t\t\t\t} else if ( type === \"error\" ) {\n\n\t\t\t\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t\t\t\t// On a manual native abort, IE9 throws\n\t\t\t\t\t\t\t\t// errors on any property access that is not readyState\n\t\t\t\t\t\t\t\tif ( typeof xhr.status !== \"number\" ) {\n\t\t\t\t\t\t\t\t\tcomplete( 0, \"error\" );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tcomplete(\n\n\t\t\t\t\t\t\t\t\t\t// File: protocol always yields status 0; see trac-8605, trac-14207\n\t\t\t\t\t\t\t\t\t\txhr.status,\n\t\t\t\t\t\t\t\t\t\txhr.statusText\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tcomplete(\n\t\t\t\t\t\t\t\t\txhrSuccessStatus[ xhr.status ] || xhr.status,\n\t\t\t\t\t\t\t\t\txhr.statusText,\n\n\t\t\t\t\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t\t\t\t\t// IE9 has no XHR2 but throws on binary (trac-11426)\n\t\t\t\t\t\t\t\t\t// For XHR2 non-text, let the caller handle it (gh-2498)\n\t\t\t\t\t\t\t\t\t( xhr.responseType || \"text\" ) !== \"text\"  ||\n\t\t\t\t\t\t\t\t\ttypeof xhr.responseText !== \"string\" ?\n\t\t\t\t\t\t\t\t\t\t{ binary: xhr.response } :\n\t\t\t\t\t\t\t\t\t\t{ text: xhr.responseText },\n\t\t\t\t\t\t\t\t\txhr.getAllResponseHeaders()\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t};\n\n\t\t\t\t// Listen to events\n\t\t\t\txhr.onload = callback();\n\t\t\t\terrorCallback = xhr.onerror = xhr.ontimeout = callback( \"error\" );\n\n\t\t\t\t// Support: IE 9 only\n\t\t\t\t// Use onreadystatechange to replace onabort\n\t\t\t\t// to handle uncaught aborts\n\t\t\t\tif ( xhr.onabort !== undefined ) {\n\t\t\t\t\txhr.onabort = errorCallback;\n\t\t\t\t} else {\n\t\t\t\t\txhr.onreadystatechange = function() {\n\n\t\t\t\t\t\t// Check readyState before timeout as it changes\n\t\t\t\t\t\tif ( xhr.readyState === 4 ) {\n\n\t\t\t\t\t\t\t// Allow onerror to be called first,\n\t\t\t\t\t\t\t// but that will not handle a native abort\n\t\t\t\t\t\t\t// Also, save errorCallback to a variable\n\t\t\t\t\t\t\t// as xhr.onerror cannot be accessed\n\t\t\t\t\t\t\twindow.setTimeout( function() {\n\t\t\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\t\t\terrorCallback();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\t// Create the abort callback\n\t\t\t\tcallback = callback( \"abort\" );\n\n\t\t\t\ttry {\n\n\t\t\t\t\t// Do send the request (this may raise an exception)\n\t\t\t\t\txhr.send( options.hasContent && options.data || null );\n\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t// trac-14683: Only rethrow if this hasn't been notified as an error yet\n\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\tthrow e;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n} );\n\n\n\n\n// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)\njQuery.ajaxPrefilter( function( s ) {\n\tif ( s.crossDomain ) {\n\t\ts.contents.script = false;\n\t}\n} );\n\n// Install script dataType\njQuery.ajaxSetup( {\n\taccepts: {\n\t\tscript: \"text/javascript, application/javascript, \" +\n\t\t\t\"application/ecmascript, application/x-ecmascript\"\n\t},\n\tcontents: {\n\t\tscript: /\\b(?:java|ecma)script\\b/\n\t},\n\tconverters: {\n\t\t\"text script\": function( text ) {\n\t\t\tjQuery.globalEval( text );\n\t\t\treturn text;\n\t\t}\n\t}\n} );\n\n// Handle cache's special case and crossDomain\njQuery.ajaxPrefilter( \"script\", function( s ) {\n\tif ( s.cache === undefined ) {\n\t\ts.cache = false;\n\t}\n\tif ( s.crossDomain ) {\n\t\ts.type = \"GET\";\n\t}\n} );\n\n// Bind script tag hack transport\njQuery.ajaxTransport( \"script\", function( s ) {\n\n\t// This transport only deals with cross domain or forced-by-attrs requests\n\tif ( s.crossDomain || s.scriptAttrs ) {\n\t\tvar script, callback;\n\t\treturn {\n\t\t\tsend: function( _, complete ) {\n\t\t\t\tscript = jQuery( \"<script>\" )\n\t\t\t\t\t.attr( s.scriptAttrs || {} )\n\t\t\t\t\t.prop( { charset: s.scriptCharset, src: s.url } )\n\t\t\t\t\t.on( \"load error\", callback = function( evt ) {\n\t\t\t\t\t\tscript.remove();\n\t\t\t\t\t\tcallback = null;\n\t\t\t\t\t\tif ( evt ) {\n\t\t\t\t\t\t\tcomplete( evt.type === \"error\" ? 404 : 200, evt.type );\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\n\t\t\t\t// Use native DOM manipulation to avoid our domManip AJAX trickery\n\t\t\t\tdocument.head.appendChild( script[ 0 ] );\n\t\t\t},\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n} );\n\n\n\n\nvar oldCallbacks = [],\n\trjsonp = /(=)\\?(?=&|$)|\\?\\?/;\n\n// Default jsonp settings\njQuery.ajaxSetup( {\n\tjsonp: \"callback\",\n\tjsonpCallback: function() {\n\t\tvar callback = oldCallbacks.pop() || ( jQuery.expando + \"_\" + ( nonce.guid++ ) );\n\t\tthis[ callback ] = true;\n\t\treturn callback;\n\t}\n} );\n\n// Detect, normalize options and install callbacks for jsonp requests\njQuery.ajaxPrefilter( \"json jsonp\", function( s, originalSettings, jqXHR ) {\n\n\tvar callbackName, overwritten, responseContainer,\n\t\tjsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?\n\t\t\t\"url\" :\n\t\t\ttypeof s.data === \"string\" &&\n\t\t\t\t( s.contentType || \"\" )\n\t\t\t\t\t.indexOf( \"application/x-www-form-urlencoded\" ) === 0 &&\n\t\t\t\trjsonp.test( s.data ) && \"data\"\n\t\t);\n\n\t// Handle iff the expected data type is \"jsonp\" or we have a parameter to set\n\tif ( jsonProp || s.dataTypes[ 0 ] === \"jsonp\" ) {\n\n\t\t// Get callback name, remembering preexisting value associated with it\n\t\tcallbackName = s.jsonpCallback = isFunction( s.jsonpCallback ) ?\n\t\t\ts.jsonpCallback() :\n\t\t\ts.jsonpCallback;\n\n\t\t// Insert callback into url or form data\n\t\tif ( jsonProp ) {\n\t\t\ts[ jsonProp ] = s[ jsonProp ].replace( rjsonp, \"$1\" + callbackName );\n\t\t} else if ( s.jsonp !== false ) {\n\t\t\ts.url += ( rquery.test( s.url ) ? \"&\" : \"?\" ) + s.jsonp + \"=\" + callbackName;\n\t\t}\n\n\t\t// Use data converter to retrieve json after script execution\n\t\ts.converters[ \"script json\" ] = function() {\n\t\t\tif ( !responseContainer ) {\n\t\t\t\tjQuery.error( callbackName + \" was not called\" );\n\t\t\t}\n\t\t\treturn responseContainer[ 0 ];\n\t\t};\n\n\t\t// Force json dataType\n\t\ts.dataTypes[ 0 ] = \"json\";\n\n\t\t// Install callback\n\t\toverwritten = window[ callbackName ];\n\t\twindow[ callbackName ] = function() {\n\t\t\tresponseContainer = arguments;\n\t\t};\n\n\t\t// Clean-up function (fires after converters)\n\t\tjqXHR.always( function() {\n\n\t\t\t// If previous value didn't exist - remove it\n\t\t\tif ( overwritten === undefined ) {\n\t\t\t\tjQuery( window ).removeProp( callbackName );\n\n\t\t\t// Otherwise restore preexisting value\n\t\t\t} else {\n\t\t\t\twindow[ callbackName ] = overwritten;\n\t\t\t}\n\n\t\t\t// Save back as free\n\t\t\tif ( s[ callbackName ] ) {\n\n\t\t\t\t// Make sure that re-using the options doesn't screw things around\n\t\t\t\ts.jsonpCallback = originalSettings.jsonpCallback;\n\n\t\t\t\t// Save the callback name for future use\n\t\t\t\toldCallbacks.push( callbackName );\n\t\t\t}\n\n\t\t\t// Call if it was a function and we have a response\n\t\t\tif ( responseContainer && isFunction( overwritten ) ) {\n\t\t\t\toverwritten( responseContainer[ 0 ] );\n\t\t\t}\n\n\t\t\tresponseContainer = overwritten = undefined;\n\t\t} );\n\n\t\t// Delegate to script\n\t\treturn \"script\";\n\t}\n} );\n\n\n\n\n// Support: Safari 8 only\n// In Safari 8 documents created via document.implementation.createHTMLDocument\n// collapse sibling forms: the second one becomes a child of the first one.\n// Because of that, this security measure has to be disabled in Safari 8.\n// https://bugs.webkit.org/show_bug.cgi?id=137337\nsupport.createHTMLDocument = ( function() {\n\tvar body = document.implementation.createHTMLDocument( \"\" ).body;\n\tbody.innerHTML = \"<form></form><form></form>\";\n\treturn body.childNodes.length === 2;\n} )();\n\n\n// Argument \"data\" should be string of html\n// context (optional): If specified, the fragment will be created in this context,\n// defaults to document\n// keepScripts (optional): If true, will include scripts passed in the html string\njQuery.parseHTML = function( data, context, keepScripts ) {\n\tif ( typeof data !== \"string\" ) {\n\t\treturn [];\n\t}\n\tif ( typeof context === \"boolean\" ) {\n\t\tkeepScripts = context;\n\t\tcontext = false;\n\t}\n\n\tvar base, parsed, scripts;\n\n\tif ( !context ) {\n\n\t\t// Stop scripts or inline event handlers from being executed immediately\n\t\t// by using document.implementation\n\t\tif ( support.createHTMLDocument ) {\n\t\t\tcontext = document.implementation.createHTMLDocument( \"\" );\n\n\t\t\t// Set the base href for the created document\n\t\t\t// so any parsed elements with URLs\n\t\t\t// are based on the document's URL (gh-2965)\n\t\t\tbase = context.createElement( \"base\" );\n\t\t\tbase.href = document.location.href;\n\t\t\tcontext.head.appendChild( base );\n\t\t} else {\n\t\t\tcontext = document;\n\t\t}\n\t}\n\n\tparsed = rsingleTag.exec( data );\n\tscripts = !keepScripts && [];\n\n\t// Single tag\n\tif ( parsed ) {\n\t\treturn [ context.createElement( parsed[ 1 ] ) ];\n\t}\n\n\tparsed = buildFragment( [ data ], context, scripts );\n\n\tif ( scripts && scripts.length ) {\n\t\tjQuery( scripts ).remove();\n\t}\n\n\treturn jQuery.merge( [], parsed.childNodes );\n};\n\n\n/**\n * Load a url into a page\n */\njQuery.fn.load = function( url, params, callback ) {\n\tvar selector, type, response,\n\t\tself = this,\n\t\toff = url.indexOf( \" \" );\n\n\tif ( off > -1 ) {\n\t\tselector = stripAndCollapse( url.slice( off ) );\n\t\turl = url.slice( 0, off );\n\t}\n\n\t// If it's a function\n\tif ( isFunction( params ) ) {\n\n\t\t// We assume that it's the callback\n\t\tcallback = params;\n\t\tparams = undefined;\n\n\t// Otherwise, build a param string\n\t} else if ( params && typeof params === \"object\" ) {\n\t\ttype = \"POST\";\n\t}\n\n\t// If we have elements to modify, make the request\n\tif ( self.length > 0 ) {\n\t\tjQuery.ajax( {\n\t\t\turl: url,\n\n\t\t\t// If \"type\" variable is undefined, then \"GET\" method will be used.\n\t\t\t// Make value of this field explicit since\n\t\t\t// user can override it through ajaxSetup method\n\t\t\ttype: type || \"GET\",\n\t\t\tdataType: \"html\",\n\t\t\tdata: params\n\t\t} ).done( function( responseText ) {\n\n\t\t\t// Save response for use in complete callback\n\t\t\tresponse = arguments;\n\n\t\t\tself.html( selector ?\n\n\t\t\t\t// If a selector was specified, locate the right elements in a dummy div\n\t\t\t\t// Exclude scripts to avoid IE 'Permission Denied' errors\n\t\t\t\tjQuery( \"<div>\" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :\n\n\t\t\t\t// Otherwise use the full result\n\t\t\t\tresponseText );\n\n\t\t// If the request succeeds, this function gets \"data\", \"status\", \"jqXHR\"\n\t\t// but they are ignored because response was set above.\n\t\t// If it fails, this function gets \"jqXHR\", \"status\", \"error\"\n\t\t} ).always( callback && function( jqXHR, status ) {\n\t\t\tself.each( function() {\n\t\t\t\tcallback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );\n\t\t\t} );\n\t\t} );\n\t}\n\n\treturn this;\n};\n\n\n\n\njQuery.expr.pseudos.animated = function( elem ) {\n\treturn jQuery.grep( jQuery.timers, function( fn ) {\n\t\treturn elem === fn.elem;\n\t} ).length;\n};\n\n\n\n\njQuery.offset = {\n\tsetOffset: function( elem, options, i ) {\n\t\tvar curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,\n\t\t\tposition = jQuery.css( elem, \"position\" ),\n\t\t\tcurElem = jQuery( elem ),\n\t\t\tprops = {};\n\n\t\t// Set position first, in-case top/left are set even on static elem\n\t\tif ( position === \"static\" ) {\n\t\t\telem.style.position = \"relative\";\n\t\t}\n\n\t\tcurOffset = curElem.offset();\n\t\tcurCSSTop = jQuery.css( elem, \"top\" );\n\t\tcurCSSLeft = jQuery.css( elem, \"left\" );\n\t\tcalculatePosition = ( position === \"absolute\" || position === \"fixed\" ) &&\n\t\t\t( curCSSTop + curCSSLeft ).indexOf( \"auto\" ) > -1;\n\n\t\t// Need to be able to calculate position if either\n\t\t// top or left is auto and position is either absolute or fixed\n\t\tif ( calculatePosition ) {\n\t\t\tcurPosition = curElem.position();\n\t\t\tcurTop = curPosition.top;\n\t\t\tcurLeft = curPosition.left;\n\n\t\t} else {\n\t\t\tcurTop = parseFloat( curCSSTop ) || 0;\n\t\t\tcurLeft = parseFloat( curCSSLeft ) || 0;\n\t\t}\n\n\t\tif ( isFunction( options ) ) {\n\n\t\t\t// Use jQuery.extend here to allow modification of coordinates argument (gh-1848)\n\t\t\toptions = options.call( elem, i, jQuery.extend( {}, curOffset ) );\n\t\t}\n\n\t\tif ( options.top != null ) {\n\t\t\tprops.top = ( options.top - curOffset.top ) + curTop;\n\t\t}\n\t\tif ( options.left != null ) {\n\t\t\tprops.left = ( options.left - curOffset.left ) + curLeft;\n\t\t}\n\n\t\tif ( \"using\" in options ) {\n\t\t\toptions.using.call( elem, props );\n\n\t\t} else {\n\t\t\tcurElem.css( props );\n\t\t}\n\t}\n};\n\njQuery.fn.extend( {\n\n\t// offset() relates an element's border box to the document origin\n\toffset: function( options ) {\n\n\t\t// Preserve chaining for setter\n\t\tif ( arguments.length ) {\n\t\t\treturn options === undefined ?\n\t\t\t\tthis :\n\t\t\t\tthis.each( function( i ) {\n\t\t\t\t\tjQuery.offset.setOffset( this, options, i );\n\t\t\t\t} );\n\t\t}\n\n\t\tvar rect, win,\n\t\t\telem = this[ 0 ];\n\n\t\tif ( !elem ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Return zeros for disconnected and hidden (display: none) elements (gh-2310)\n\t\t// Support: IE <=11 only\n\t\t// Running getBoundingClientRect on a\n\t\t// disconnected node in IE throws an error\n\t\tif ( !elem.getClientRects().length ) {\n\t\t\treturn { top: 0, left: 0 };\n\t\t}\n\n\t\t// Get document-relative position by adding viewport scroll to viewport-relative gBCR\n\t\trect = elem.getBoundingClientRect();\n\t\twin = elem.ownerDocument.defaultView;\n\t\treturn {\n\t\t\ttop: rect.top + win.pageYOffset,\n\t\t\tleft: rect.left + win.pageXOffset\n\t\t};\n\t},\n\n\t// position() relates an element's margin box to its offset parent's padding box\n\t// This corresponds to the behavior of CSS absolute positioning\n\tposition: function() {\n\t\tif ( !this[ 0 ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar offsetParent, offset, doc,\n\t\t\telem = this[ 0 ],\n\t\t\tparentOffset = { top: 0, left: 0 };\n\n\t\t// position:fixed elements are offset from the viewport, which itself always has zero offset\n\t\tif ( jQuery.css( elem, \"position\" ) === \"fixed\" ) {\n\n\t\t\t// Assume position:fixed implies availability of getBoundingClientRect\n\t\t\toffset = elem.getBoundingClientRect();\n\n\t\t} else {\n\t\t\toffset = this.offset();\n\n\t\t\t// Account for the *real* offset parent, which can be the document or its root element\n\t\t\t// when a statically positioned element is identified\n\t\t\tdoc = elem.ownerDocument;\n\t\t\toffsetParent = elem.offsetParent || doc.documentElement;\n\t\t\twhile ( offsetParent &&\n\t\t\t\t( offsetParent === doc.body || offsetParent === doc.documentElement ) &&\n\t\t\t\tjQuery.css( offsetParent, \"position\" ) === \"static\" ) {\n\n\t\t\t\toffsetParent = offsetParent.parentNode;\n\t\t\t}\n\t\t\tif ( offsetParent && offsetParent !== elem && offsetParent.nodeType === 1 ) {\n\n\t\t\t\t// Incorporate borders into its offset, since they are outside its content origin\n\t\t\t\tparentOffset = jQuery( offsetParent ).offset();\n\t\t\t\tparentOffset.top += jQuery.css( offsetParent, \"borderTopWidth\", true );\n\t\t\t\tparentOffset.left += jQuery.css( offsetParent, \"borderLeftWidth\", true );\n\t\t\t}\n\t\t}\n\n\t\t// Subtract parent offsets and element margins\n\t\treturn {\n\t\t\ttop: offset.top - parentOffset.top - jQuery.css( elem, \"marginTop\", true ),\n\t\t\tleft: offset.left - parentOffset.left - jQuery.css( elem, \"marginLeft\", true )\n\t\t};\n\t},\n\n\t// This method will return documentElement in the following cases:\n\t// 1) For the element inside the iframe without offsetParent, this method will return\n\t//    documentElement of the parent window\n\t// 2) For the hidden or detached element\n\t// 3) For body or html element, i.e. in case of the html node - it will return itself\n\t//\n\t// but those exceptions were never presented as a real life use-cases\n\t// and might be considered as more preferable results.\n\t//\n\t// This logic, however, is not guaranteed and can change at any point in the future\n\toffsetParent: function() {\n\t\treturn this.map( function() {\n\t\t\tvar offsetParent = this.offsetParent;\n\n\t\t\twhile ( offsetParent && jQuery.css( offsetParent, \"position\" ) === \"static\" ) {\n\t\t\t\toffsetParent = offsetParent.offsetParent;\n\t\t\t}\n\n\t\t\treturn offsetParent || documentElement;\n\t\t} );\n\t}\n} );\n\n// Create scrollLeft and scrollTop methods\njQuery.each( { scrollLeft: \"pageXOffset\", scrollTop: \"pageYOffset\" }, function( method, prop ) {\n\tvar top = \"pageYOffset\" === prop;\n\n\tjQuery.fn[ method ] = function( val ) {\n\t\treturn access( this, function( elem, method, val ) {\n\n\t\t\t// Coalesce documents and windows\n\t\t\tvar win;\n\t\t\tif ( isWindow( elem ) ) {\n\t\t\t\twin = elem;\n\t\t\t} else if ( elem.nodeType === 9 ) {\n\t\t\t\twin = elem.defaultView;\n\t\t\t}\n\n\t\t\tif ( val === undefined ) {\n\t\t\t\treturn win ? win[ prop ] : elem[ method ];\n\t\t\t}\n\n\t\t\tif ( win ) {\n\t\t\t\twin.scrollTo(\n\t\t\t\t\t!top ? val : win.pageXOffset,\n\t\t\t\t\ttop ? val : win.pageYOffset\n\t\t\t\t);\n\n\t\t\t} else {\n\t\t\t\telem[ method ] = val;\n\t\t\t}\n\t\t}, method, val, arguments.length );\n\t};\n} );\n\n// Support: Safari <=7 - 9.1, Chrome <=37 - 49\n// Add the top/left cssHooks using jQuery.fn.position\n// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084\n// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347\n// getComputedStyle returns percent when specified for top/left/bottom/right;\n// rather than make the css module depend on the offset module, just check for it here\njQuery.each( [ \"top\", \"left\" ], function( _i, prop ) {\n\tjQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,\n\t\tfunction( elem, computed ) {\n\t\t\tif ( computed ) {\n\t\t\t\tcomputed = curCSS( elem, prop );\n\n\t\t\t\t// If curCSS returns percentage, fallback to offset\n\t\t\t\treturn rnumnonpx.test( computed ) ?\n\t\t\t\t\tjQuery( elem ).position()[ prop ] + \"px\" :\n\t\t\t\t\tcomputed;\n\t\t\t}\n\t\t}\n\t);\n} );\n\n\n// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods\njQuery.each( { Height: \"height\", Width: \"width\" }, function( name, type ) {\n\tjQuery.each( {\n\t\tpadding: \"inner\" + name,\n\t\tcontent: type,\n\t\t\"\": \"outer\" + name\n\t}, function( defaultExtra, funcName ) {\n\n\t\t// Margin is only for outerHeight, outerWidth\n\t\tjQuery.fn[ funcName ] = function( margin, value ) {\n\t\t\tvar chainable = arguments.length && ( defaultExtra || typeof margin !== \"boolean\" ),\n\t\t\t\textra = defaultExtra || ( margin === true || value === true ? \"margin\" : \"border\" );\n\n\t\t\treturn access( this, function( elem, type, value ) {\n\t\t\t\tvar doc;\n\n\t\t\t\tif ( isWindow( elem ) ) {\n\n\t\t\t\t\t// $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)\n\t\t\t\t\treturn funcName.indexOf( \"outer\" ) === 0 ?\n\t\t\t\t\t\telem[ \"inner\" + name ] :\n\t\t\t\t\t\telem.document.documentElement[ \"client\" + name ];\n\t\t\t\t}\n\n\t\t\t\t// Get document width or height\n\t\t\t\tif ( elem.nodeType === 9 ) {\n\t\t\t\t\tdoc = elem.documentElement;\n\n\t\t\t\t\t// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],\n\t\t\t\t\t// whichever is greatest\n\t\t\t\t\treturn Math.max(\n\t\t\t\t\t\telem.body[ \"scroll\" + name ], doc[ \"scroll\" + name ],\n\t\t\t\t\t\telem.body[ \"offset\" + name ], doc[ \"offset\" + name ],\n\t\t\t\t\t\tdoc[ \"client\" + name ]\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn value === undefined ?\n\n\t\t\t\t\t// Get width or height on the element, requesting but not forcing parseFloat\n\t\t\t\t\tjQuery.css( elem, type, extra ) :\n\n\t\t\t\t\t// Set width or height on the element\n\t\t\t\t\tjQuery.style( elem, type, value, extra );\n\t\t\t}, type, chainable ? margin : undefined, chainable );\n\t\t};\n\t} );\n} );\n\n\njQuery.each( [\n\t\"ajaxStart\",\n\t\"ajaxStop\",\n\t\"ajaxComplete\",\n\t\"ajaxError\",\n\t\"ajaxSuccess\",\n\t\"ajaxSend\"\n], function( _i, type ) {\n\tjQuery.fn[ type ] = function( fn ) {\n\t\treturn this.on( type, fn );\n\t};\n} );\n\n\n\n\njQuery.fn.extend( {\n\n\tbind: function( types, data, fn ) {\n\t\treturn this.on( types, null, data, fn );\n\t},\n\tunbind: function( types, fn ) {\n\t\treturn this.off( types, null, fn );\n\t},\n\n\tdelegate: function( selector, types, data, fn ) {\n\t\treturn this.on( types, selector, data, fn );\n\t},\n\tundelegate: function( selector, types, fn ) {\n\n\t\t// ( namespace ) or ( selector, types [, fn] )\n\t\treturn arguments.length === 1 ?\n\t\t\tthis.off( selector, \"**\" ) :\n\t\t\tthis.off( types, selector || \"**\", fn );\n\t},\n\n\thover: function( fnOver, fnOut ) {\n\t\treturn this\n\t\t\t.on( \"mouseenter\", fnOver )\n\t\t\t.on( \"mouseleave\", fnOut || fnOver );\n\t}\n} );\n\njQuery.each(\n\t( \"blur focus focusin focusout resize scroll click dblclick \" +\n\t\"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave \" +\n\t\"change select submit keydown keypress keyup contextmenu\" ).split( \" \" ),\n\tfunction( _i, name ) {\n\n\t\t// Handle event binding\n\t\tjQuery.fn[ name ] = function( data, fn ) {\n\t\t\treturn arguments.length > 0 ?\n\t\t\t\tthis.on( name, null, data, fn ) :\n\t\t\t\tthis.trigger( name );\n\t\t};\n\t}\n);\n\n\n\n\n// Support: Android <=4.0 only\n// Make sure we trim BOM and NBSP\n// Require that the \"whitespace run\" starts from a non-whitespace\n// to avoid O(N^2) behavior when the engine would try matching \"\\s+$\" at each space position.\nvar rtrim = /^[\\s\\uFEFF\\xA0]+|([^\\s\\uFEFF\\xA0])[\\s\\uFEFF\\xA0]+$/g;\n\n// Bind a function to a context, optionally partially applying any\n// arguments.\n// jQuery.proxy is deprecated to promote standards (specifically Function#bind)\n// However, it is not slated for removal any time soon\njQuery.proxy = function( fn, context ) {\n\tvar tmp, args, proxy;\n\n\tif ( typeof context === \"string\" ) {\n\t\ttmp = fn[ context ];\n\t\tcontext = fn;\n\t\tfn = tmp;\n\t}\n\n\t// Quick check to determine if target is callable, in the spec\n\t// this throws a TypeError, but we will just return undefined.\n\tif ( !isFunction( fn ) ) {\n\t\treturn undefined;\n\t}\n\n\t// Simulated bind\n\targs = slice.call( arguments, 2 );\n\tproxy = function() {\n\t\treturn fn.apply( context || this, args.concat( slice.call( arguments ) ) );\n\t};\n\n\t// Set the guid of unique handler to the same of original handler, so it can be removed\n\tproxy.guid = fn.guid = fn.guid || jQuery.guid++;\n\n\treturn proxy;\n};\n\njQuery.holdReady = function( hold ) {\n\tif ( hold ) {\n\t\tjQuery.readyWait++;\n\t} else {\n\t\tjQuery.ready( true );\n\t}\n};\njQuery.isArray = Array.isArray;\njQuery.parseJSON = JSON.parse;\njQuery.nodeName = nodeName;\njQuery.isFunction = isFunction;\njQuery.isWindow = isWindow;\njQuery.camelCase = camelCase;\njQuery.type = toType;\n\njQuery.now = Date.now;\n\njQuery.isNumeric = function( obj ) {\n\n\t// As of jQuery 3.0, isNumeric is limited to\n\t// strings and numbers (primitives or objects)\n\t// that can be coerced to finite numbers (gh-2662)\n\tvar type = jQuery.type( obj );\n\treturn ( type === \"number\" || type === \"string\" ) &&\n\n\t\t// parseFloat NaNs numeric-cast false positives (\"\")\n\t\t// ...but misinterprets leading-number strings, particularly hex literals (\"0x...\")\n\t\t// subtraction forces infinities to NaN\n\t\t!isNaN( obj - parseFloat( obj ) );\n};\n\njQuery.trim = function( text ) {\n\treturn text == null ?\n\t\t\"\" :\n\t\t( text + \"\" ).replace( rtrim, \"$1\" );\n};\n\n\n\n// Register as a named AMD module, since jQuery can be concatenated with other\n// files that may use define, but not via a proper concatenation script that\n// understands anonymous AMD modules. A named AMD is safest and most robust\n// way to register. Lowercase jquery is used because AMD module names are\n// derived from file names, and jQuery is normally delivered in a lowercase\n// file name. Do this after creating the global so that if an AMD module wants\n// to call noConflict to hide this version of jQuery, it will work.\n\n// Note that for maximum portability, libraries that are not jQuery should\n// declare themselves as anonymous modules, and avoid setting a global if an\n// AMD loader is present. jQuery is a special case. For more information, see\n// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon\n\nif ( typeof define === \"function\" && define.amd ) {\n\tdefine( \"jquery\", [], function() {\n\t\treturn jQuery;\n\t} );\n}\n\n\n\n\nvar\n\n\t// Map over jQuery in case of overwrite\n\t_jQuery = window.jQuery,\n\n\t// Map over the $ in case of overwrite\n\t_$ = window.$;\n\njQuery.noConflict = function( deep ) {\n\tif ( window.$ === jQuery ) {\n\t\twindow.$ = _$;\n\t}\n\n\tif ( deep && window.jQuery === jQuery ) {\n\t\twindow.jQuery = _jQuery;\n\t}\n\n\treturn jQuery;\n};\n\n// Expose jQuery and $ identifiers, even in AMD\n// (trac-7102#comment:10, https://github.com/jquery/jquery/pull/557)\n// and CommonJS for browser emulators (trac-13566)\nif ( typeof noGlobal === \"undefined\" ) {\n\twindow.jQuery = window.$ = jQuery;\n}\n\n\n\n\nreturn jQuery;\n} );\n","'use strict';\nvar $ = require('../internals/export');\nvar isArray = require('../internals/is-array');\nvar isConstructor = require('../internals/is-constructor');\nvar isObject = require('../internals/is-object');\nvar toAbsoluteIndex = require('../internals/to-absolute-index');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar createProperty = require('../internals/create-property');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support');\nvar nativeSlice = require('../internals/array-slice');\n\nvar HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('slice');\n\nvar SPECIES = wellKnownSymbol('species');\nvar $Array = Array;\nvar max = Math.max;\n\n// `Array.prototype.slice` method\n// https://tc39.es/ecma262/#sec-array.prototype.slice\n// fallback for not array-like ES3 strings and DOM objects\n$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT }, {\n  slice: function slice(start, end) {\n    var O = toIndexedObject(this);\n    var length = lengthOfArrayLike(O);\n    var k = toAbsoluteIndex(start, length);\n    var fin = toAbsoluteIndex(end === undefined ? length : end, length);\n    // inline `ArraySpeciesCreate` for usage native `Array#slice` where it's possible\n    var Constructor, result, n;\n    if (isArray(O)) {\n      Constructor = O.constructor;\n      // cross-realm fallback\n      if (isConstructor(Constructor) && (Constructor === $Array || isArray(Constructor.prototype))) {\n        Constructor = undefined;\n      } else if (isObject(Constructor)) {\n        Constructor = Constructor[SPECIES];\n        if (Constructor === null) Constructor = undefined;\n      }\n      if (Constructor === $Array || Constructor === undefined) {\n        return nativeSlice(O, k, fin);\n      }\n    }\n    result = new (Constructor === undefined ? $Array : Constructor)(max(fin - k, 0));\n    for (n = 0; k < fin; k++, n++) if (k in O) createProperty(result, n, O[k]);\n    result.length = n;\n    return result;\n  }\n});\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nObject.defineProperty(exports, \"default\", {\n    enumerable: true,\n    get: function() {\n        return getAllConfigs;\n    }\n});\nconst _configfull = /*#__PURE__*/ _interop_require_default(require(\"../../stubs/config.full.js\"));\nconst _featureFlags = require(\"../featureFlags\");\nfunction _interop_require_default(obj) {\n    return obj && obj.__esModule ? obj : {\n        default: obj\n    };\n}\nfunction getAllConfigs(config) {\n    var _config_presets;\n    const configs = ((_config_presets = config === null || config === void 0 ? void 0 : config.presets) !== null && _config_presets !== void 0 ? _config_presets : [\n        _configfull.default\n    ]).slice().reverse().flatMap((preset)=>getAllConfigs(preset instanceof Function ? preset() : preset));\n    const features = {\n        // Add experimental configs here...\n        respectDefaultRingColorOpacity: {\n            theme: {\n                ringColor: ({ theme  })=>({\n                        DEFAULT: \"#3b82f67f\",\n                        ...theme(\"colors\")\n                    })\n            }\n        },\n        disableColorOpacityUtilitiesByDefault: {\n            corePlugins: {\n                backgroundOpacity: false,\n                borderOpacity: false,\n                divideOpacity: false,\n                placeholderOpacity: false,\n                ringOpacity: false,\n                textOpacity: false\n            }\n        }\n    };\n    const experimentals = Object.keys(features).filter((feature)=>(0, _featureFlags.flagEnabled)(config, feature)).map((feature)=>features[feature]);\n    return [\n        config,\n        ...experimentals,\n        ...configs\n    ];\n}\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar globalThis = require('../internals/global-this');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar isForced = require('../internals/is-forced');\nvar inheritIfRequired = require('../internals/inherit-if-required');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar create = require('../internals/object-create');\nvar getOwnPropertyNames = require('../internals/object-get-own-property-names').f;\nvar isPrototypeOf = require('../internals/object-is-prototype-of');\nvar isRegExp = require('../internals/is-regexp');\nvar toString = require('../internals/to-string');\nvar getRegExpFlags = require('../internals/regexp-get-flags');\nvar stickyHelpers = require('../internals/regexp-sticky-helpers');\nvar proxyAccessor = require('../internals/proxy-accessor');\nvar defineBuiltIn = require('../internals/define-built-in');\nvar fails = require('../internals/fails');\nvar hasOwn = require('../internals/has-own-property');\nvar enforceInternalState = require('../internals/internal-state').enforce;\nvar setSpecies = require('../internals/set-species');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar UNSUPPORTED_DOT_ALL = require('../internals/regexp-unsupported-dot-all');\nvar UNSUPPORTED_NCG = require('../internals/regexp-unsupported-ncg');\n\nvar MATCH = wellKnownSymbol('match');\nvar NativeRegExp = globalThis.RegExp;\nvar RegExpPrototype = NativeRegExp.prototype;\nvar SyntaxError = globalThis.SyntaxError;\nvar exec = uncurryThis(RegExpPrototype.exec);\nvar charAt = uncurryThis(''.charAt);\nvar replace = uncurryThis(''.replace);\nvar stringIndexOf = uncurryThis(''.indexOf);\nvar stringSlice = uncurryThis(''.slice);\n// TODO: Use only proper RegExpIdentifierName\nvar IS_NCG = /^\\?<[^\\s\\d!#%&*+<=>@^][^\\s!#%&*+<=>@^]*>/;\nvar re1 = /a/g;\nvar re2 = /a/g;\n\n// \"new\" should create a new object, old webkit bug\nvar CORRECT_NEW = new NativeRegExp(re1) !== re1;\n\nvar MISSED_STICKY = stickyHelpers.MISSED_STICKY;\nvar UNSUPPORTED_Y = stickyHelpers.UNSUPPORTED_Y;\n\nvar BASE_FORCED = DESCRIPTORS &&\n  (!CORRECT_NEW || MISSED_STICKY || UNSUPPORTED_DOT_ALL || UNSUPPORTED_NCG || fails(function () {\n    re2[MATCH] = false;\n    // RegExp constructor can alter flags and IsRegExp works correct with @@match\n    // eslint-disable-next-line sonarjs/inconsistent-function-call -- required for testing\n    return NativeRegExp(re1) !== re1 || NativeRegExp(re2) === re2 || String(NativeRegExp(re1, 'i')) !== '/a/i';\n  }));\n\nvar handleDotAll = function (string) {\n  var length = string.length;\n  var index = 0;\n  var result = '';\n  var brackets = false;\n  var chr;\n  for (; index <= length; index++) {\n    chr = charAt(string, index);\n    if (chr === '\\\\') {\n      result += chr + charAt(string, ++index);\n      continue;\n    }\n    if (!brackets && chr === '.') {\n      result += '[\\\\s\\\\S]';\n    } else {\n      if (chr === '[') {\n        brackets = true;\n      } else if (chr === ']') {\n        brackets = false;\n      } result += chr;\n    }\n  } return result;\n};\n\nvar handleNCG = function (string) {\n  var length = string.length;\n  var index = 0;\n  var result = '';\n  var named = [];\n  var names = create(null);\n  var brackets = false;\n  var ncg = false;\n  var groupid = 0;\n  var groupname = '';\n  var chr;\n  for (; index <= length; index++) {\n    chr = charAt(string, index);\n    if (chr === '\\\\') {\n      chr += charAt(string, ++index);\n    } else if (chr === ']') {\n      brackets = false;\n    } else if (!brackets) switch (true) {\n      case chr === '[':\n        brackets = true;\n        break;\n      case chr === '(':\n        result += chr;\n        // ignore non-capturing groups\n        if (stringSlice(string, index + 1, index + 3) === '?:') {\n          continue;\n        }\n        if (exec(IS_NCG, stringSlice(string, index + 1))) {\n          index += 2;\n          ncg = true;\n        }\n        groupid++;\n        continue;\n      case chr === '>' && ncg:\n        if (groupname === '' || hasOwn(names, groupname)) {\n          throw new SyntaxError('Invalid capture group name');\n        }\n        names[groupname] = true;\n        named[named.length] = [groupname, groupid];\n        ncg = false;\n        groupname = '';\n        continue;\n    }\n    if (ncg) groupname += chr;\n    else result += chr;\n  } return [result, named];\n};\n\n// `RegExp` constructor\n// https://tc39.es/ecma262/#sec-regexp-constructor\nif (isForced('RegExp', BASE_FORCED)) {\n  var RegExpWrapper = function RegExp(pattern, flags) {\n    var thisIsRegExp = isPrototypeOf(RegExpPrototype, this);\n    var patternIsRegExp = isRegExp(pattern);\n    var flagsAreUndefined = flags === undefined;\n    var groups = [];\n    var rawPattern = pattern;\n    var rawFlags, dotAll, sticky, handled, result, state;\n\n    if (!thisIsRegExp && patternIsRegExp && flagsAreUndefined && pattern.constructor === RegExpWrapper) {\n      return pattern;\n    }\n\n    if (patternIsRegExp || isPrototypeOf(RegExpPrototype, pattern)) {\n      pattern = pattern.source;\n      if (flagsAreUndefined) flags = getRegExpFlags(rawPattern);\n    }\n\n    pattern = pattern === undefined ? '' : toString(pattern);\n    flags = flags === undefined ? '' : toString(flags);\n    rawPattern = pattern;\n\n    if (UNSUPPORTED_DOT_ALL && 'dotAll' in re1) {\n      dotAll = !!flags && stringIndexOf(flags, 's') > -1;\n      if (dotAll) flags = replace(flags, /s/g, '');\n    }\n\n    rawFlags = flags;\n\n    if (MISSED_STICKY && 'sticky' in re1) {\n      sticky = !!flags && stringIndexOf(flags, 'y') > -1;\n      if (sticky && UNSUPPORTED_Y) flags = replace(flags, /y/g, '');\n    }\n\n    if (UNSUPPORTED_NCG) {\n      handled = handleNCG(pattern);\n      pattern = handled[0];\n      groups = handled[1];\n    }\n\n    result = inheritIfRequired(NativeRegExp(pattern, flags), thisIsRegExp ? this : RegExpPrototype, RegExpWrapper);\n\n    if (dotAll || sticky || groups.length) {\n      state = enforceInternalState(result);\n      if (dotAll) {\n        state.dotAll = true;\n        state.raw = RegExpWrapper(handleDotAll(pattern), rawFlags);\n      }\n      if (sticky) state.sticky = true;\n      if (groups.length) state.groups = groups;\n    }\n\n    if (pattern !== rawPattern) try {\n      // fails in old engines, but we have no alternatives for unsupported regex syntax\n      createNonEnumerableProperty(result, 'source', rawPattern === '' ? '(?:)' : rawPattern);\n    } catch (error) { /* empty */ }\n\n    return result;\n  };\n\n  for (var keys = getOwnPropertyNames(NativeRegExp), index = 0; keys.length > index;) {\n    proxyAccessor(RegExpWrapper, NativeRegExp, keys[index++]);\n  }\n\n  RegExpPrototype.constructor = RegExpWrapper;\n  RegExpWrapper.prototype = RegExpPrototype;\n  defineBuiltIn(globalThis, 'RegExp', RegExpWrapper, { constructor: true });\n}\n\n// https://tc39.es/ecma262/#sec-get-regexp-@@species\nsetSpecies('RegExp');\n","\"use strict\";\n\nexports.__esModule = true;\nexports.isNode = isNode;\nexports.isPseudoElement = isPseudoElement;\nexports.isPseudoClass = isPseudoClass;\nexports.isContainer = isContainer;\nexports.isNamespace = isNamespace;\nexports.isUniversal = exports.isTag = exports.isString = exports.isSelector = exports.isRoot = exports.isPseudo = exports.isNesting = exports.isIdentifier = exports.isComment = exports.isCombinator = exports.isClassName = exports.isAttribute = void 0;\n\nvar _types = require(\"./types\");\n\nvar _IS_TYPE;\n\nvar IS_TYPE = (_IS_TYPE = {}, _IS_TYPE[_types.ATTRIBUTE] = true, _IS_TYPE[_types.CLASS] = true, _IS_TYPE[_types.COMBINATOR] = true, _IS_TYPE[_types.COMMENT] = true, _IS_TYPE[_types.ID] = true, _IS_TYPE[_types.NESTING] = true, _IS_TYPE[_types.PSEUDO] = true, _IS_TYPE[_types.ROOT] = true, _IS_TYPE[_types.SELECTOR] = true, _IS_TYPE[_types.STRING] = true, _IS_TYPE[_types.TAG] = true, _IS_TYPE[_types.UNIVERSAL] = true, _IS_TYPE);\n\nfunction isNode(node) {\n  return typeof node === \"object\" && IS_TYPE[node.type];\n}\n\nfunction isNodeType(type, node) {\n  return isNode(node) && node.type === type;\n}\n\nvar isAttribute = isNodeType.bind(null, _types.ATTRIBUTE);\nexports.isAttribute = isAttribute;\nvar isClassName = isNodeType.bind(null, _types.CLASS);\nexports.isClassName = isClassName;\nvar isCombinator = isNodeType.bind(null, _types.COMBINATOR);\nexports.isCombinator = isCombinator;\nvar isComment = isNodeType.bind(null, _types.COMMENT);\nexports.isComment = isComment;\nvar isIdentifier = isNodeType.bind(null, _types.ID);\nexports.isIdentifier = isIdentifier;\nvar isNesting = isNodeType.bind(null, _types.NESTING);\nexports.isNesting = isNesting;\nvar isPseudo = isNodeType.bind(null, _types.PSEUDO);\nexports.isPseudo = isPseudo;\nvar isRoot = isNodeType.bind(null, _types.ROOT);\nexports.isRoot = isRoot;\nvar isSelector = isNodeType.bind(null, _types.SELECTOR);\nexports.isSelector = isSelector;\nvar isString = isNodeType.bind(null, _types.STRING);\nexports.isString = isString;\nvar isTag = isNodeType.bind(null, _types.TAG);\nexports.isTag = isTag;\nvar isUniversal = isNodeType.bind(null, _types.UNIVERSAL);\nexports.isUniversal = isUniversal;\n\nfunction isPseudoElement(node) {\n  return isPseudo(node) && node.value && (node.value.startsWith(\"::\") || node.value.toLowerCase() === \":before\" || node.value.toLowerCase() === \":after\" || node.value.toLowerCase() === \":first-letter\" || node.value.toLowerCase() === \":first-line\");\n}\n\nfunction isPseudoClass(node) {\n  return isPseudo(node) && !isPseudoElement(node);\n}\n\nfunction isContainer(node) {\n  return !!(isNode(node) && node.walk);\n}\n\nfunction isNamespace(node) {\n  return isAttribute(node) || isTag(node);\n}","'use strict';\n// https://tc39.es/ecma262/#sec-IsHTMLDDA-internal-slot\nvar documentAll = typeof document == 'object' && document.all;\n\n// `IsCallable` abstract operation\n// https://tc39.es/ecma262/#sec-iscallable\n// eslint-disable-next-line unicorn/no-typeof-undefined -- required for testing\nmodule.exports = typeof documentAll == 'undefined' && documentAll !== undefined ? function (argument) {\n  return typeof argument == 'function' || argument === documentAll;\n} : function (argument) {\n  return typeof argument == 'function';\n};\n","\"use strict\";\n\nexports.__esModule = true;\nexports.combinator = exports.word = exports.comment = exports.str = exports.tab = exports.newline = exports.feed = exports.cr = exports.backslash = exports.bang = exports.slash = exports.doubleQuote = exports.singleQuote = exports.space = exports.greaterThan = exports.pipe = exports.equals = exports.plus = exports.caret = exports.tilde = exports.dollar = exports.closeSquare = exports.openSquare = exports.closeParenthesis = exports.openParenthesis = exports.semicolon = exports.colon = exports.comma = exports.at = exports.asterisk = exports.ampersand = void 0;\nvar ampersand = 38; // `&`.charCodeAt(0);\n\nexports.ampersand = ampersand;\nvar asterisk = 42; // `*`.charCodeAt(0);\n\nexports.asterisk = asterisk;\nvar at = 64; // `@`.charCodeAt(0);\n\nexports.at = at;\nvar comma = 44; // `,`.charCodeAt(0);\n\nexports.comma = comma;\nvar colon = 58; // `:`.charCodeAt(0);\n\nexports.colon = colon;\nvar semicolon = 59; // `;`.charCodeAt(0);\n\nexports.semicolon = semicolon;\nvar openParenthesis = 40; // `(`.charCodeAt(0);\n\nexports.openParenthesis = openParenthesis;\nvar closeParenthesis = 41; // `)`.charCodeAt(0);\n\nexports.closeParenthesis = closeParenthesis;\nvar openSquare = 91; // `[`.charCodeAt(0);\n\nexports.openSquare = openSquare;\nvar closeSquare = 93; // `]`.charCodeAt(0);\n\nexports.closeSquare = closeSquare;\nvar dollar = 36; // `$`.charCodeAt(0);\n\nexports.dollar = dollar;\nvar tilde = 126; // `~`.charCodeAt(0);\n\nexports.tilde = tilde;\nvar caret = 94; // `^`.charCodeAt(0);\n\nexports.caret = caret;\nvar plus = 43; // `+`.charCodeAt(0);\n\nexports.plus = plus;\nvar equals = 61; // `=`.charCodeAt(0);\n\nexports.equals = equals;\nvar pipe = 124; // `|`.charCodeAt(0);\n\nexports.pipe = pipe;\nvar greaterThan = 62; // `>`.charCodeAt(0);\n\nexports.greaterThan = greaterThan;\nvar space = 32; // ` `.charCodeAt(0);\n\nexports.space = space;\nvar singleQuote = 39; // `'`.charCodeAt(0);\n\nexports.singleQuote = singleQuote;\nvar doubleQuote = 34; // `\"`.charCodeAt(0);\n\nexports.doubleQuote = doubleQuote;\nvar slash = 47; // `/`.charCodeAt(0);\n\nexports.slash = slash;\nvar bang = 33; // `!`.charCodeAt(0);\n\nexports.bang = bang;\nvar backslash = 92; // '\\\\'.charCodeAt(0);\n\nexports.backslash = backslash;\nvar cr = 13; // '\\r'.charCodeAt(0);\n\nexports.cr = cr;\nvar feed = 12; // '\\f'.charCodeAt(0);\n\nexports.feed = feed;\nvar newline = 10; // '\\n'.charCodeAt(0);\n\nexports.newline = newline;\nvar tab = 9; // '\\t'.charCodeAt(0);\n// Expose aliases primarily for readability.\n\nexports.tab = tab;\nvar str = singleQuote; // No good single character representation!\n\nexports.str = str;\nvar comment = -1;\nexports.comment = comment;\nvar word = -2;\nexports.word = word;\nvar combinator = -3;\nexports.combinator = combinator;","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nObject.defineProperty(exports, \"default\", {\n    enumerable: true,\n    get: function() {\n        return _default;\n    }\n});\nconst _log = /*#__PURE__*/ _interop_require_default(require(\"../util/log\"));\nfunction _interop_require_default(obj) {\n    return obj && obj.__esModule ? obj : {\n        default: obj\n    };\n}\nfunction warn({ version , from , to  }) {\n    _log.default.warn(`${from}-color-renamed`, [\n        `As of Tailwind CSS ${version}, \\`${from}\\` has been renamed to \\`${to}\\`.`,\n        \"Update your configuration file to silence this warning.\"\n    ]);\n}\nconst _default = {\n    inherit: \"inherit\",\n    current: \"currentColor\",\n    transparent: \"transparent\",\n    black: \"#000\",\n    white: \"#fff\",\n    slate: {\n        50: \"#f8fafc\",\n        100: \"#f1f5f9\",\n        200: \"#e2e8f0\",\n        300: \"#cbd5e1\",\n        400: \"#94a3b8\",\n        500: \"#64748b\",\n        600: \"#475569\",\n        700: \"#334155\",\n        800: \"#1e293b\",\n        900: \"#0f172a\",\n        950: \"#020617\"\n    },\n    gray: {\n        50: \"#f9fafb\",\n        100: \"#f3f4f6\",\n        200: \"#e5e7eb\",\n        300: \"#d1d5db\",\n        400: \"#9ca3af\",\n        500: \"#6b7280\",\n        600: \"#4b5563\",\n        700: \"#374151\",\n        800: \"#1f2937\",\n        900: \"#111827\",\n        950: \"#030712\"\n    },\n    zinc: {\n        50: \"#fafafa\",\n        100: \"#f4f4f5\",\n        200: \"#e4e4e7\",\n        300: \"#d4d4d8\",\n        400: \"#a1a1aa\",\n        500: \"#71717a\",\n        600: \"#52525b\",\n        700: \"#3f3f46\",\n        800: \"#27272a\",\n        900: \"#18181b\",\n        950: \"#09090b\"\n    },\n    neutral: {\n        50: \"#fafafa\",\n        100: \"#f5f5f5\",\n        200: \"#e5e5e5\",\n        300: \"#d4d4d4\",\n        400: \"#a3a3a3\",\n        500: \"#737373\",\n        600: \"#525252\",\n        700: \"#404040\",\n        800: \"#262626\",\n        900: \"#171717\",\n        950: \"#0a0a0a\"\n    },\n    stone: {\n        50: \"#fafaf9\",\n        100: \"#f5f5f4\",\n        200: \"#e7e5e4\",\n        300: \"#d6d3d1\",\n        400: \"#a8a29e\",\n        500: \"#78716c\",\n        600: \"#57534e\",\n        700: \"#44403c\",\n        800: \"#292524\",\n        900: \"#1c1917\",\n        950: \"#0c0a09\"\n    },\n    red: {\n        50: \"#fef2f2\",\n        100: \"#fee2e2\",\n        200: \"#fecaca\",\n        300: \"#fca5a5\",\n        400: \"#f87171\",\n        500: \"#ef4444\",\n        600: \"#dc2626\",\n        700: \"#b91c1c\",\n        800: \"#991b1b\",\n        900: \"#7f1d1d\",\n        950: \"#450a0a\"\n    },\n    orange: {\n        50: \"#fff7ed\",\n        100: \"#ffedd5\",\n        200: \"#fed7aa\",\n        300: \"#fdba74\",\n        400: \"#fb923c\",\n        500: \"#f97316\",\n        600: \"#ea580c\",\n        700: \"#c2410c\",\n        800: \"#9a3412\",\n        900: \"#7c2d12\",\n        950: \"#431407\"\n    },\n    amber: {\n        50: \"#fffbeb\",\n        100: \"#fef3c7\",\n        200: \"#fde68a\",\n        300: \"#fcd34d\",\n        400: \"#fbbf24\",\n        500: \"#f59e0b\",\n        600: \"#d97706\",\n        700: \"#b45309\",\n        800: \"#92400e\",\n        900: \"#78350f\",\n        950: \"#451a03\"\n    },\n    yellow: {\n        50: \"#fefce8\",\n        100: \"#fef9c3\",\n        200: \"#fef08a\",\n        300: \"#fde047\",\n        400: \"#facc15\",\n        500: \"#eab308\",\n        600: \"#ca8a04\",\n        700: \"#a16207\",\n        800: \"#854d0e\",\n        900: \"#713f12\",\n        950: \"#422006\"\n    },\n    lime: {\n        50: \"#f7fee7\",\n        100: \"#ecfccb\",\n        200: \"#d9f99d\",\n        300: \"#bef264\",\n        400: \"#a3e635\",\n        500: \"#84cc16\",\n        600: \"#65a30d\",\n        700: \"#4d7c0f\",\n        800: \"#3f6212\",\n        900: \"#365314\",\n        950: \"#1a2e05\"\n    },\n    green: {\n        50: \"#f0fdf4\",\n        100: \"#dcfce7\",\n        200: \"#bbf7d0\",\n        300: \"#86efac\",\n        400: \"#4ade80\",\n        500: \"#22c55e\",\n        600: \"#16a34a\",\n        700: \"#15803d\",\n        800: \"#166534\",\n        900: \"#14532d\",\n        950: \"#052e16\"\n    },\n    emerald: {\n        50: \"#ecfdf5\",\n        100: \"#d1fae5\",\n        200: \"#a7f3d0\",\n        300: \"#6ee7b7\",\n        400: \"#34d399\",\n        500: \"#10b981\",\n        600: \"#059669\",\n        700: \"#047857\",\n        800: \"#065f46\",\n        900: \"#064e3b\",\n        950: \"#022c22\"\n    },\n    teal: {\n        50: \"#f0fdfa\",\n        100: \"#ccfbf1\",\n        200: \"#99f6e4\",\n        300: \"#5eead4\",\n        400: \"#2dd4bf\",\n        500: \"#14b8a6\",\n        600: \"#0d9488\",\n        700: \"#0f766e\",\n        800: \"#115e59\",\n        900: \"#134e4a\",\n        950: \"#042f2e\"\n    },\n    cyan: {\n        50: \"#ecfeff\",\n        100: \"#cffafe\",\n        200: \"#a5f3fc\",\n        300: \"#67e8f9\",\n        400: \"#22d3ee\",\n        500: \"#06b6d4\",\n        600: \"#0891b2\",\n        700: \"#0e7490\",\n        800: \"#155e75\",\n        900: \"#164e63\",\n        950: \"#083344\"\n    },\n    sky: {\n        50: \"#f0f9ff\",\n        100: \"#e0f2fe\",\n        200: \"#bae6fd\",\n        300: \"#7dd3fc\",\n        400: \"#38bdf8\",\n        500: \"#0ea5e9\",\n        600: \"#0284c7\",\n        700: \"#0369a1\",\n        800: \"#075985\",\n        900: \"#0c4a6e\",\n        950: \"#082f49\"\n    },\n    blue: {\n        50: \"#eff6ff\",\n        100: \"#dbeafe\",\n        200: \"#bfdbfe\",\n        300: \"#93c5fd\",\n        400: \"#60a5fa\",\n        500: \"#3b82f6\",\n        600: \"#2563eb\",\n        700: \"#1d4ed8\",\n        800: \"#1e40af\",\n        900: \"#1e3a8a\",\n        950: \"#172554\"\n    },\n    indigo: {\n        50: \"#eef2ff\",\n        100: \"#e0e7ff\",\n        200: \"#c7d2fe\",\n        300: \"#a5b4fc\",\n        400: \"#818cf8\",\n        500: \"#6366f1\",\n        600: \"#4f46e5\",\n        700: \"#4338ca\",\n        800: \"#3730a3\",\n        900: \"#312e81\",\n        950: \"#1e1b4b\"\n    },\n    violet: {\n        50: \"#f5f3ff\",\n        100: \"#ede9fe\",\n        200: \"#ddd6fe\",\n        300: \"#c4b5fd\",\n        400: \"#a78bfa\",\n        500: \"#8b5cf6\",\n        600: \"#7c3aed\",\n        700: \"#6d28d9\",\n        800: \"#5b21b6\",\n        900: \"#4c1d95\",\n        950: \"#2e1065\"\n    },\n    purple: {\n        50: \"#faf5ff\",\n        100: \"#f3e8ff\",\n        200: \"#e9d5ff\",\n        300: \"#d8b4fe\",\n        400: \"#c084fc\",\n        500: \"#a855f7\",\n        600: \"#9333ea\",\n        700: \"#7e22ce\",\n        800: \"#6b21a8\",\n        900: \"#581c87\",\n        950: \"#3b0764\"\n    },\n    fuchsia: {\n        50: \"#fdf4ff\",\n        100: \"#fae8ff\",\n        200: \"#f5d0fe\",\n        300: \"#f0abfc\",\n        400: \"#e879f9\",\n        500: \"#d946ef\",\n        600: \"#c026d3\",\n        700: \"#a21caf\",\n        800: \"#86198f\",\n        900: \"#701a75\",\n        950: \"#4a044e\"\n    },\n    pink: {\n        50: \"#fdf2f8\",\n        100: \"#fce7f3\",\n        200: \"#fbcfe8\",\n        300: \"#f9a8d4\",\n        400: \"#f472b6\",\n        500: \"#ec4899\",\n        600: \"#db2777\",\n        700: \"#be185d\",\n        800: \"#9d174d\",\n        900: \"#831843\",\n        950: \"#500724\"\n    },\n    rose: {\n        50: \"#fff1f2\",\n        100: \"#ffe4e6\",\n        200: \"#fecdd3\",\n        300: \"#fda4af\",\n        400: \"#fb7185\",\n        500: \"#f43f5e\",\n        600: \"#e11d48\",\n        700: \"#be123c\",\n        800: \"#9f1239\",\n        900: \"#881337\",\n        950: \"#4c0519\"\n    },\n    get lightBlue () {\n        warn({\n            version: \"v2.2\",\n            from: \"lightBlue\",\n            to: \"sky\"\n        });\n        return this.sky;\n    },\n    get warmGray () {\n        warn({\n            version: \"v3.0\",\n            from: \"warmGray\",\n            to: \"stone\"\n        });\n        return this.stone;\n    },\n    get trueGray () {\n        warn({\n            version: \"v3.0\",\n            from: \"trueGray\",\n            to: \"neutral\"\n        });\n        return this.neutral;\n    },\n    get coolGray () {\n        warn({\n            version: \"v3.0\",\n            from: \"coolGray\",\n            to: \"gray\"\n        });\n        return this.gray;\n    },\n    get blueGray () {\n        warn({\n            version: \"v3.0\",\n            from: \"blueGray\",\n            to: \"slate\"\n        });\n        return this.slate;\n    }\n};\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar IE8_DOM_DEFINE = require('../internals/ie8-dom-define');\nvar V8_PROTOTYPE_DEFINE_BUG = require('../internals/v8-prototype-define-bug');\nvar anObject = require('../internals/an-object');\nvar toPropertyKey = require('../internals/to-property-key');\n\nvar $TypeError = TypeError;\n// eslint-disable-next-line es/no-object-defineproperty -- safe\nvar $defineProperty = Object.defineProperty;\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\nvar ENUMERABLE = 'enumerable';\nvar CONFIGURABLE = 'configurable';\nvar WRITABLE = 'writable';\n\n// `Object.defineProperty` method\n// https://tc39.es/ecma262/#sec-object.defineproperty\nexports.f = DESCRIPTORS ? V8_PROTOTYPE_DEFINE_BUG ? function defineProperty(O, P, Attributes) {\n  anObject(O);\n  P = toPropertyKey(P);\n  anObject(Attributes);\n  if (typeof O === 'function' && P === 'prototype' && 'value' in Attributes && WRITABLE in Attributes && !Attributes[WRITABLE]) {\n    var current = $getOwnPropertyDescriptor(O, P);\n    if (current && current[WRITABLE]) {\n      O[P] = Attributes.value;\n      Attributes = {\n        configurable: CONFIGURABLE in Attributes ? Attributes[CONFIGURABLE] : current[CONFIGURABLE],\n        enumerable: ENUMERABLE in Attributes ? Attributes[ENUMERABLE] : current[ENUMERABLE],\n        writable: false\n      };\n    }\n  } return $defineProperty(O, P, Attributes);\n} : $defineProperty : function defineProperty(O, P, Attributes) {\n  anObject(O);\n  P = toPropertyKey(P);\n  anObject(Attributes);\n  if (IE8_DOM_DEFINE) try {\n    return $defineProperty(O, P, Attributes);\n  } catch (error) { /* empty */ }\n  if ('get' in Attributes || 'set' in Attributes) throw new $TypeError('Accessors not supported');\n  if ('value' in Attributes) O[P] = Attributes.value;\n  return O;\n};\n","'use strict';\nvar getBuiltIn = require('../internals/get-built-in');\n\nvar createSetLike = function (size) {\n  return {\n    size: size,\n    has: function () {\n      return false;\n    },\n    keys: function () {\n      return {\n        next: function () {\n          return { done: true };\n        }\n      };\n    }\n  };\n};\n\nvar createSetLikeWithInfinitySize = function (size) {\n  return {\n    size: size,\n    has: function () {\n      return true;\n    },\n    keys: function () {\n      throw new Error('e');\n    }\n  };\n};\n\nmodule.exports = function (name, callback) {\n  var Set = getBuiltIn('Set');\n  try {\n    new Set()[name](createSetLike(0));\n    try {\n      // late spec change, early WebKit ~ Safari 17 implementation does not pass it\n      // https://github.com/tc39/proposal-set-methods/pull/88\n      // also covered engines with\n      // https://bugs.webkit.org/show_bug.cgi?id=272679\n      new Set()[name](createSetLike(-1));\n      return false;\n    } catch (error2) {\n      if (!callback) return true;\n      // early V8 implementation bug\n      // https://issues.chromium.org/issues/351332634\n      try {\n        new Set()[name](createSetLikeWithInfinitySize(-Infinity));\n        return false;\n      } catch (error) {\n        var set = new Set([1, 2]);\n        return callback(set[name](createSetLikeWithInfinitySize(Infinity)));\n      }\n    }\n  } catch (error) {\n    return false;\n  }\n};\n","/**\n * @license\n * Copyright 2010-2025 Three.js Authors\n * SPDX-License-Identifier: MIT\n */\nconst REVISION = '181';\n\n/**\n * Represents mouse buttons and interaction types in context of controls.\n *\n * @type {ConstantsMouse}\n * @constant\n */\nconst MOUSE = { LEFT: 0, MIDDLE: 1, RIGHT: 2, ROTATE: 0, DOLLY: 1, PAN: 2 };\n\n/**\n * Represents touch interaction types in context of controls.\n *\n * @type {ConstantsTouch}\n * @constant\n */\nconst TOUCH = { ROTATE: 0, PAN: 1, DOLLY_PAN: 2, DOLLY_ROTATE: 3 };\n\n/**\n * Disables face culling.\n *\n * @type {number}\n * @constant\n */\nconst CullFaceNone = 0;\n\n/**\n * Culls back faces.\n *\n * @type {number}\n * @constant\n */\nconst CullFaceBack = 1;\n\n/**\n * Culls front faces.\n *\n * @type {number}\n * @constant\n */\nconst CullFaceFront = 2;\n\n/**\n * Culls both front and back faces.\n *\n * @type {number}\n * @constant\n */\nconst CullFaceFrontBack = 3;\n\n/**\n * Gives unfiltered shadow maps - fastest, but lowest quality.\n *\n * @type {number}\n * @constant\n */\nconst BasicShadowMap = 0;\n\n/**\n * Filters shadow maps using the Percentage-Closer Filtering (PCF) algorithm.\n *\n * @type {number}\n * @constant\n */\nconst PCFShadowMap = 1;\n\n/**\n * Filters shadow maps using the Percentage-Closer Filtering (PCF) algorithm with\n * better soft shadows especially when using low-resolution shadow maps.\n *\n * @type {number}\n * @constant\n */\nconst PCFSoftShadowMap = 2;\n\n/**\n * Filters shadow maps using the Variance Shadow Map (VSM) algorithm.\n * When using VSMShadowMap all shadow receivers will also cast shadows.\n *\n * @type {number}\n * @constant\n */\nconst VSMShadowMap = 3;\n\n/**\n * Only front faces are rendered.\n *\n * @type {number}\n * @constant\n */\nconst FrontSide = 0;\n\n/**\n * Only back faces are rendered.\n *\n * @type {number}\n * @constant\n */\nconst BackSide = 1;\n\n/**\n * Both front and back faces are rendered.\n *\n * @type {number}\n * @constant\n */\nconst DoubleSide = 2;\n\n/**\n * No blending is performed which effectively disables\n * alpha transparency.\n *\n * @type {number}\n * @constant\n */\nconst NoBlending = 0;\n\n/**\n * The default blending.\n *\n * @type {number}\n * @constant\n */\nconst NormalBlending = 1;\n\n/**\n * Represents additive blending.\n *\n * @type {number}\n * @constant\n */\nconst AdditiveBlending = 2;\n\n/**\n * Represents subtractive blending.\n *\n * @type {number}\n * @constant\n */\nconst SubtractiveBlending = 3;\n\n/**\n * Represents multiply blending.\n *\n * @type {number}\n * @constant\n */\nconst MultiplyBlending = 4;\n\n/**\n * Represents custom blending.\n *\n * @type {number}\n * @constant\n */\nconst CustomBlending = 5;\n\n/**\n * A `source + destination` blending equation.\n *\n * @type {number}\n * @constant\n */\nconst AddEquation = 100;\n\n/**\n * A `source - destination` blending equation.\n *\n * @type {number}\n * @constant\n */\nconst SubtractEquation = 101;\n\n/**\n * A `destination - source` blending equation.\n *\n * @type {number}\n * @constant\n */\nconst ReverseSubtractEquation = 102;\n\n/**\n * A blend equation that uses the minimum of source and destination.\n *\n * @type {number}\n * @constant\n */\nconst MinEquation = 103;\n\n/**\n * A blend equation that uses the maximum of source and destination.\n *\n * @type {number}\n * @constant\n */\nconst MaxEquation = 104;\n\n/**\n * Multiplies all colors by `0`.\n *\n * @type {number}\n * @constant\n */\nconst ZeroFactor = 200;\n\n/**\n * Multiplies all colors by `1`.\n *\n * @type {number}\n * @constant\n */\nconst OneFactor = 201;\n\n/**\n * Multiplies all colors by the source colors.\n *\n * @type {number}\n * @constant\n */\nconst SrcColorFactor = 202;\n\n/**\n * Multiplies all colors by `1` minus each source color.\n *\n * @type {number}\n * @constant\n */\nconst OneMinusSrcColorFactor = 203;\n\n/**\n * Multiplies all colors by the source alpha value.\n *\n * @type {number}\n * @constant\n */\nconst SrcAlphaFactor = 204;\n\n/**\n * Multiplies all colors by 1 minus the source alpha value.\n *\n * @type {number}\n * @constant\n */\nconst OneMinusSrcAlphaFactor = 205;\n\n/**\n * Multiplies all colors by the destination alpha value.\n *\n * @type {number}\n * @constant\n */\nconst DstAlphaFactor = 206;\n\n/**\n * Multiplies all colors by `1` minus the destination alpha value.\n *\n * @type {number}\n * @constant\n */\nconst OneMinusDstAlphaFactor = 207;\n\n/**\n * Multiplies all colors by the destination color.\n *\n * @type {number}\n * @constant\n */\nconst DstColorFactor = 208;\n\n/**\n * Multiplies all colors by `1` minus each destination color.\n *\n * @type {number}\n * @constant\n */\nconst OneMinusDstColorFactor = 209;\n\n/**\n * Multiplies the RGB colors by the smaller of either the source alpha\n * value or the value of `1` minus the destination alpha value. The alpha\n * value is multiplied by `1`.\n *\n * @type {number}\n * @constant\n */\nconst SrcAlphaSaturateFactor = 210;\n\n/**\n * Multiplies all colors by a constant color.\n *\n * @type {number}\n * @constant\n */\nconst ConstantColorFactor = 211;\n\n/**\n * Multiplies all colors by `1` minus a constant color.\n *\n * @type {number}\n * @constant\n */\nconst OneMinusConstantColorFactor = 212;\n\n/**\n * Multiplies all colors by a constant alpha value.\n *\n * @type {number}\n * @constant\n */\nconst ConstantAlphaFactor = 213;\n\n/**\n * Multiplies all colors by 1 minus a constant alpha value.\n *\n * @type {number}\n * @constant\n */\nconst OneMinusConstantAlphaFactor = 214;\n\n/**\n * Never pass.\n *\n * @type {number}\n * @constant\n */\nconst NeverDepth = 0;\n\n/**\n * Always pass.\n *\n * @type {number}\n * @constant\n */\nconst AlwaysDepth = 1;\n\n/**\n * Pass if the incoming value is less than the depth buffer value.\n *\n * @type {number}\n * @constant\n */\nconst LessDepth = 2;\n\n/**\n * Pass if the incoming value is less than or equal to the depth buffer value.\n *\n * @type {number}\n * @constant\n */\nconst LessEqualDepth = 3;\n\n/**\n * Pass if the incoming value equals the depth buffer value.\n *\n * @type {number}\n * @constant\n */\nconst EqualDepth = 4;\n\n/**\n * Pass if the incoming value is greater than or equal to the depth buffer value.\n *\n * @type {number}\n * @constant\n */\nconst GreaterEqualDepth = 5;\n\n/**\n * Pass if the incoming value is greater than the depth buffer value.\n *\n * @type {number}\n * @constant\n */\nconst GreaterDepth = 6;\n\n/**\n * Pass if the incoming value is not equal to the depth buffer value.\n *\n * @type {number}\n * @constant\n */\nconst NotEqualDepth = 7;\n\n/**\n * Multiplies the environment map color with the surface color.\n *\n * @type {number}\n * @constant\n */\nconst MultiplyOperation = 0;\n\n/**\n * Uses reflectivity to blend between the two colors.\n *\n * @type {number}\n * @constant\n */\nconst MixOperation = 1;\n\n/**\n * Adds the two colors.\n *\n * @type {number}\n * @constant\n */\nconst AddOperation = 2;\n\n/**\n * No tone mapping is applied.\n *\n * @type {number}\n * @constant\n */\nconst NoToneMapping = 0;\n\n/**\n * Linear tone mapping.\n *\n * @type {number}\n * @constant\n */\nconst LinearToneMapping = 1;\n\n/**\n * Reinhard tone mapping.\n *\n * @type {number}\n * @constant\n */\nconst ReinhardToneMapping = 2;\n\n/**\n * Cineon tone mapping.\n *\n * @type {number}\n * @constant\n */\nconst CineonToneMapping = 3;\n\n/**\n * ACES Filmic tone mapping.\n *\n * @type {number}\n * @constant\n */\nconst ACESFilmicToneMapping = 4;\n\n/**\n * Custom tone mapping.\n *\n * Expects a custom implementation by modifying shader code of the material's fragment shader.\n *\n * @type {number}\n * @constant\n */\nconst CustomToneMapping = 5;\n\n/**\n * AgX tone mapping.\n *\n * @type {number}\n * @constant\n */\nconst AgXToneMapping = 6;\n\n/**\n * Neutral tone mapping.\n *\n * Implementation based on the Khronos 3D Commerce Group standard tone mapping.\n *\n * @type {number}\n * @constant\n */\nconst NeutralToneMapping = 7;\n\n/**\n * The skinned mesh shares the same world space as the skeleton.\n *\n * @type {string}\n * @constant\n */\nconst AttachedBindMode = 'attached';\n\n/**\n * The skinned mesh does not share the same world space as the skeleton.\n * This is useful when a skeleton is shared across multiple skinned meshes.\n *\n * @type {string}\n * @constant\n */\nconst DetachedBindMode = 'detached';\n\n/**\n * Maps textures using the geometry's UV coordinates.\n *\n * @type {number}\n * @constant\n */\nconst UVMapping = 300;\n\n/**\n * Reflection mapping for cube textures.\n *\n * @type {number}\n * @constant\n */\nconst CubeReflectionMapping = 301;\n\n/**\n * Refraction mapping for cube textures.\n *\n * @type {number}\n * @constant\n */\nconst CubeRefractionMapping = 302;\n\n/**\n * Reflection mapping for equirectangular textures.\n *\n * @type {number}\n * @constant\n */\nconst EquirectangularReflectionMapping = 303;\n\n/**\n * Refraction mapping for equirectangular textures.\n *\n * @type {number}\n * @constant\n */\nconst EquirectangularRefractionMapping = 304;\n\n/**\n * Reflection mapping for PMREM textures.\n *\n * @type {number}\n * @constant\n */\nconst CubeUVReflectionMapping = 306;\n\n/**\n * The texture will simply repeat to infinity.\n *\n * @type {number}\n * @constant\n */\nconst RepeatWrapping = 1000;\n\n/**\n * The last pixel of the texture stretches to the edge of the mesh.\n *\n * @type {number}\n * @constant\n */\nconst ClampToEdgeWrapping = 1001;\n\n/**\n * The texture will repeats to infinity, mirroring on each repeat.\n *\n * @type {number}\n * @constant\n */\nconst MirroredRepeatWrapping = 1002;\n\n/**\n * Returns the value of the texture element that is nearest (in Manhattan distance)\n * to the specified texture coordinates.\n *\n * @type {number}\n * @constant\n */\nconst NearestFilter = 1003;\n\n/**\n * Chooses the mipmap that most closely matches the size of the pixel being textured\n * and uses the `NearestFilter` criterion (the texel nearest to the center of the pixel)\n * to produce a texture value.\n *\n * @type {number}\n * @constant\n */\nconst NearestMipmapNearestFilter = 1004;\nconst NearestMipMapNearestFilter = 1004; // legacy\n\n/**\n * Chooses the two mipmaps that most closely match the size of the pixel being textured and\n * uses the `NearestFilter` criterion to produce a texture value from each mipmap.\n * The final texture value is a weighted average of those two values.\n *\n * @type {number}\n * @constant\n */\nconst NearestMipmapLinearFilter = 1005;\nconst NearestMipMapLinearFilter = 1005; // legacy\n\n/**\n * Returns the weighted average of the four texture elements that are closest to the specified\n * texture coordinates, and can include items wrapped or repeated from other parts of a texture,\n * depending on the values of `wrapS` and `wrapT`, and on the exact mapping.\n *\n * @type {number}\n * @constant\n */\nconst LinearFilter = 1006;\n\n/**\n * Chooses the mipmap that most closely matches the size of the pixel being textured and uses\n * the `LinearFilter` criterion (a weighted average of the four texels that are closest to the\n * center of the pixel) to produce a texture value.\n *\n * @type {number}\n * @constant\n */\nconst LinearMipmapNearestFilter = 1007;\nconst LinearMipMapNearestFilter = 1007; // legacy\n\n/**\n * Chooses the two mipmaps that most closely match the size of the pixel being textured and uses\n * the `LinearFilter` criterion to produce a texture value from each mipmap. The final texture value\n * is a weighted average of those two values.\n *\n * @type {number}\n * @constant\n */\nconst LinearMipmapLinearFilter = 1008;\nconst LinearMipMapLinearFilter = 1008; // legacy\n\n/**\n * An unsigned byte data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst UnsignedByteType = 1009;\n\n/**\n * A byte data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst ByteType = 1010;\n\n/**\n * A short data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst ShortType = 1011;\n\n/**\n * An unsigned short data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst UnsignedShortType = 1012;\n\n/**\n * An int data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst IntType = 1013;\n\n/**\n * An unsigned int data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst UnsignedIntType = 1014;\n\n/**\n * A float data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst FloatType = 1015;\n\n/**\n * A half float data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst HalfFloatType = 1016;\n\n/**\n * An unsigned short 4_4_4_4 (packed) data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst UnsignedShort4444Type = 1017;\n\n/**\n * An unsigned short 5_5_5_1 (packed) data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst UnsignedShort5551Type = 1018;\n\n/**\n * An unsigned int 24_8 data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst UnsignedInt248Type = 1020;\n\n/**\n * An unsigned int 5_9_9_9 (packed) data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst UnsignedInt5999Type = 35902;\n\n/**\n * An unsigned int 10_11_11 (packed) data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst UnsignedInt101111Type = 35899;\n\n/**\n * Discards the red, green and blue components and reads just the alpha component.\n *\n * @type {number}\n * @constant\n */\nconst AlphaFormat = 1021;\n\n/**\n * Discards the alpha component and reads the red, green and blue component.\n *\n * @type {number}\n * @constant\n */\nconst RGBFormat = 1022;\n\n/**\n * Reads the red, green, blue and alpha components.\n *\n * @type {number}\n * @constant\n */\nconst RGBAFormat = 1023;\n\n/**\n * Reads each element as a single depth value, converts it to floating point, and clamps to the range `[0,1]`.\n *\n * @type {number}\n * @constant\n */\nconst DepthFormat = 1026;\n\n/**\n * Reads each element is a pair of depth and stencil values. The depth component of the pair is interpreted as\n * in `DepthFormat`. The stencil component is interpreted based on the depth + stencil internal format.\n *\n * @type {number}\n * @constant\n */\nconst DepthStencilFormat = 1027;\n\n/**\n * Discards the green, blue and alpha components and reads just the red component.\n *\n * @type {number}\n * @constant\n */\nconst RedFormat = 1028;\n\n/**\n * Discards the green, blue and alpha components and reads just the red component. The texels are read as integers instead of floating point.\n *\n * @type {number}\n * @constant\n */\nconst RedIntegerFormat = 1029;\n\n/**\n * Discards the alpha, and blue components and reads the red, and green components.\n *\n * @type {number}\n * @constant\n */\nconst RGFormat = 1030;\n\n/**\n * Discards the alpha, and blue components and reads the red, and green components. The texels are read as integers instead of floating point.\n *\n * @type {number}\n * @constant\n */\nconst RGIntegerFormat = 1031;\n\n/**\n * Discards the alpha component and reads the red, green and blue component. The texels are read as integers instead of floating point.\n *\n * @type {number}\n * @constant\n */\nconst RGBIntegerFormat = 1032;\n\n/**\n * Reads the red, green, blue and alpha components. The texels are read as integers instead of floating point.\n *\n * @type {number}\n * @constant\n */\nconst RGBAIntegerFormat = 1033;\n\n/**\n * A DXT1-compressed image in an RGB image format.\n *\n * @type {number}\n * @constant\n */\nconst RGB_S3TC_DXT1_Format = 33776;\n\n/**\n * A DXT1-compressed image in an RGB image format with a simple on/off alpha value.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_S3TC_DXT1_Format = 33777;\n\n/**\n * A DXT3-compressed image in an RGBA image format. Compared to a 32-bit RGBA texture, it offers 4:1 compression.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_S3TC_DXT3_Format = 33778;\n\n/**\n * A DXT5-compressed image in an RGBA image format. It also provides a 4:1 compression, but differs to the DXT3\n * compression in how the alpha compression is done.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_S3TC_DXT5_Format = 33779;\n\n/**\n * PVRTC RGB compression in 4-bit mode. One block for each 4×4 pixels.\n *\n * @type {number}\n * @constant\n */\nconst RGB_PVRTC_4BPPV1_Format = 35840;\n\n/**\n * PVRTC RGB compression in 2-bit mode. One block for each 8×4 pixels.\n *\n * @type {number}\n * @constant\n */\nconst RGB_PVRTC_2BPPV1_Format = 35841;\n\n/**\n * PVRTC RGBA compression in 4-bit mode. One block for each 4×4 pixels.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_PVRTC_4BPPV1_Format = 35842;\n\n/**\n * PVRTC RGBA compression in 2-bit mode. One block for each 8×4 pixels.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_PVRTC_2BPPV1_Format = 35843;\n\n/**\n * ETC1 RGB format.\n *\n * @type {number}\n * @constant\n */\nconst RGB_ETC1_Format = 36196;\n\n/**\n * ETC2 RGB format.\n *\n * @type {number}\n * @constant\n */\nconst RGB_ETC2_Format = 37492;\n\n/**\n * ETC2 RGBA format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ETC2_EAC_Format = 37496;\n\n/**\n * ASTC RGBA 4x4 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_4x4_Format = 37808;\n\n/**\n * ASTC RGBA 5x4 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_5x4_Format = 37809;\n\n/**\n * ASTC RGBA 5x5 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_5x5_Format = 37810;\n\n/**\n * ASTC RGBA 6x5 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_6x5_Format = 37811;\n\n/**\n * ASTC RGBA 6x6 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_6x6_Format = 37812;\n\n/**\n * ASTC RGBA 8x5 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_8x5_Format = 37813;\n\n/**\n * ASTC RGBA 8x6 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_8x6_Format = 37814;\n\n/**\n * ASTC RGBA 8x8 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_8x8_Format = 37815;\n\n/**\n * ASTC RGBA 10x5 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_10x5_Format = 37816;\n\n/**\n * ASTC RGBA 10x6 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_10x6_Format = 37817;\n\n/**\n * ASTC RGBA 10x8 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_10x8_Format = 37818;\n\n/**\n * ASTC RGBA 10x10 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_10x10_Format = 37819;\n\n/**\n * ASTC RGBA 12x10 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_12x10_Format = 37820;\n\n/**\n * ASTC RGBA 12x12 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_12x12_Format = 37821;\n\n/**\n * BPTC RGBA format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_BPTC_Format = 36492;\n\n/**\n * BPTC Signed RGB format.\n *\n * @type {number}\n * @constant\n */\nconst RGB_BPTC_SIGNED_Format = 36494;\n\n/**\n * BPTC Unsigned RGB format.\n *\n * @type {number}\n * @constant\n */\nconst RGB_BPTC_UNSIGNED_Format = 36495;\n\n/**\n * RGTC1 Red format.\n *\n * @type {number}\n * @constant\n */\nconst RED_RGTC1_Format = 36283;\n\n/**\n * RGTC1 Signed Red format.\n *\n * @type {number}\n * @constant\n */\nconst SIGNED_RED_RGTC1_Format = 36284;\n\n/**\n * RGTC2 Red Green format.\n *\n * @type {number}\n * @constant\n */\nconst RED_GREEN_RGTC2_Format = 36285;\n\n/**\n * RGTC2 Signed Red Green format.\n *\n * @type {number}\n * @constant\n */\nconst SIGNED_RED_GREEN_RGTC2_Format = 36286;\n\n/**\n * Animations are played once.\n *\n * @type {number}\n * @constant\n */\nconst LoopOnce = 2200;\n\n/**\n * Animations are played with a chosen number of repetitions, each time jumping from\n * the end of the clip directly to its beginning.\n *\n * @type {number}\n * @constant\n */\nconst LoopRepeat = 2201;\n\n/**\n * Animations are played with a chosen number of repetitions, alternately playing forward\n * and backward.\n *\n * @type {number}\n * @constant\n */\nconst LoopPingPong = 2202;\n\n/**\n * Discrete interpolation mode for keyframe tracks.\n *\n * @type {number}\n * @constant\n */\nconst InterpolateDiscrete = 2300;\n\n/**\n * Linear interpolation mode for keyframe tracks.\n *\n * @type {number}\n * @constant\n */\nconst InterpolateLinear = 2301;\n\n/**\n * Smooth interpolation mode for keyframe tracks.\n *\n * @type {number}\n * @constant\n */\nconst InterpolateSmooth = 2302;\n\n/**\n * Zero curvature ending for animations.\n *\n * @type {number}\n * @constant\n */\nconst ZeroCurvatureEnding = 2400;\n\n/**\n * Zero slope ending for animations.\n *\n * @type {number}\n * @constant\n */\nconst ZeroSlopeEnding = 2401;\n\n/**\n * Wrap around ending for animations.\n *\n * @type {number}\n * @constant\n */\nconst WrapAroundEnding = 2402;\n\n/**\n * Default animation blend mode.\n *\n * @type {number}\n * @constant\n */\nconst NormalAnimationBlendMode = 2500;\n\n/**\n * Additive animation blend mode. Can be used to layer motions on top of\n * each other to build complex performances from smaller re-usable assets.\n *\n * @type {number}\n * @constant\n */\nconst AdditiveAnimationBlendMode = 2501;\n\n/**\n * For every three vertices draw a single triangle.\n *\n * @type {number}\n * @constant\n */\nconst TrianglesDrawMode = 0;\n\n/**\n * For each vertex draw a triangle from the last three vertices.\n *\n * @type {number}\n * @constant\n */\nconst TriangleStripDrawMode = 1;\n\n/**\n * For each vertex draw a triangle from the first vertex and the last two vertices.\n *\n * @type {number}\n * @constant\n */\nconst TriangleFanDrawMode = 2;\n\n/**\n * Basic depth packing.\n *\n * @type {number}\n * @constant\n */\nconst BasicDepthPacking = 3200;\n\n/**\n * A depth value is packed into 32 bit RGBA.\n *\n * @type {number}\n * @constant\n */\nconst RGBADepthPacking = 3201;\n\n/**\n * A depth value is packed into 24 bit RGB.\n *\n * @type {number}\n * @constant\n */\nconst RGBDepthPacking = 3202;\n\n/**\n * A depth value is packed into 16 bit RG.\n *\n * @type {number}\n * @constant\n */\nconst RGDepthPacking = 3203;\n\n/**\n * Normal information is relative to the underlying surface.\n *\n * @type {number}\n * @constant\n */\nconst TangentSpaceNormalMap = 0;\n\n/**\n * Normal information is relative to the object orientation.\n *\n * @type {number}\n * @constant\n */\nconst ObjectSpaceNormalMap = 1;\n\n// Color space string identifiers, matching CSS Color Module Level 4 and WebGPU names where available.\n\n/**\n * No color space.\n *\n * @type {string}\n * @constant\n */\nconst NoColorSpace = '';\n\n/**\n * sRGB color space.\n *\n * @type {string}\n * @constant\n */\nconst SRGBColorSpace = 'srgb';\n\n/**\n * sRGB-linear color space.\n *\n * @type {string}\n * @constant\n */\nconst LinearSRGBColorSpace = 'srgb-linear';\n\n/**\n * Linear transfer function.\n *\n * @type {string}\n * @constant\n */\nconst LinearTransfer = 'linear';\n\n/**\n * sRGB transfer function.\n *\n * @type {string}\n * @constant\n */\nconst SRGBTransfer = 'srgb';\n\n/**\n * Sets the stencil buffer value to `0`.\n *\n * @type {number}\n * @constant\n */\nconst ZeroStencilOp = 0;\n\n/**\n * Keeps the current value.\n *\n * @type {number}\n * @constant\n */\nconst KeepStencilOp = 7680;\n\n/**\n * Sets the stencil buffer value to the specified reference value.\n *\n * @type {number}\n * @constant\n */\nconst ReplaceStencilOp = 7681;\n\n/**\n * Increments the current stencil buffer value. Clamps to the maximum representable unsigned value.\n *\n * @type {number}\n * @constant\n */\nconst IncrementStencilOp = 7682;\n\n/**\n * Decrements the current stencil buffer value. Clamps to `0`.\n *\n * @type {number}\n * @constant\n */\nconst DecrementStencilOp = 7683;\n\n/**\n * Increments the current stencil buffer value. Wraps stencil buffer value to zero when incrementing\n * the maximum representable unsigned value.\n *\n * @type {number}\n * @constant\n */\nconst IncrementWrapStencilOp = 34055;\n\n/**\n * Decrements the current stencil buffer value. Wraps stencil buffer value to the maximum representable\n * unsigned value when decrementing a stencil buffer value of `0`.\n *\n * @type {number}\n * @constant\n */\nconst DecrementWrapStencilOp = 34056;\n\n/**\n * Inverts the current stencil buffer value bitwise.\n *\n * @type {number}\n * @constant\n */\nconst InvertStencilOp = 5386;\n\n/**\n * Will never return true.\n *\n * @type {number}\n * @constant\n */\nconst NeverStencilFunc = 512;\n\n/**\n * Will return true if the stencil reference value is less than the current stencil value.\n *\n * @type {number}\n * @constant\n */\nconst LessStencilFunc = 513;\n\n/**\n * Will return true if the stencil reference value is equal to the current stencil value.\n *\n * @type {number}\n * @constant\n */\nconst EqualStencilFunc = 514;\n\n/**\n * Will return true if the stencil reference value is less than or equal to the current stencil value.\n *\n * @type {number}\n * @constant\n */\nconst LessEqualStencilFunc = 515;\n\n/**\n * Will return true if the stencil reference value is greater than the current stencil value.\n *\n * @type {number}\n * @constant\n */\nconst GreaterStencilFunc = 516;\n\n/**\n * Will return true if the stencil reference value is not equal to the current stencil value.\n *\n * @type {number}\n * @constant\n */\nconst NotEqualStencilFunc = 517;\n\n/**\n * Will return true if the stencil reference value is greater than or equal to the current stencil value.\n *\n * @type {number}\n * @constant\n */\nconst GreaterEqualStencilFunc = 518;\n\n/**\n * Will always return true.\n *\n * @type {number}\n * @constant\n */\nconst AlwaysStencilFunc = 519;\n\n/**\n * Never pass.\n *\n * @type {number}\n * @constant\n */\nconst NeverCompare = 512;\n\n/**\n * Pass if the incoming value is less than the texture value.\n *\n * @type {number}\n * @constant\n */\nconst LessCompare = 513;\n\n/**\n * Pass if the incoming value equals the texture value.\n *\n * @type {number}\n * @constant\n */\nconst EqualCompare = 514;\n\n/**\n * Pass if the incoming value is less than or equal to the texture value.\n *\n * @type {number}\n * @constant\n */\nconst LessEqualCompare = 515;\n\n/**\n * Pass if the incoming value is greater than the texture value.\n *\n * @type {number}\n * @constant\n */\nconst GreaterCompare = 516;\n\n/**\n * Pass if the incoming value is not equal to the texture value.\n *\n * @type {number}\n * @constant\n */\nconst NotEqualCompare = 517;\n\n/**\n * Pass if the incoming value is greater than or equal to the texture value.\n *\n * @type {number}\n * @constant\n */\nconst GreaterEqualCompare = 518;\n\n/**\n * Always pass.\n *\n * @type {number}\n * @constant\n */\nconst AlwaysCompare = 519;\n\n/**\n * The contents are intended to be specified once by the application, and used many\n * times as the source for drawing and image specification commands.\n *\n * @type {number}\n * @constant\n */\nconst StaticDrawUsage = 35044;\n\n/**\n * The contents are intended to be respecified repeatedly by the application, and\n * used many times as the source for drawing and image specification commands.\n *\n * @type {number}\n * @constant\n */\nconst DynamicDrawUsage = 35048;\n\n/**\n * The contents are intended to be specified once by the application, and used at most\n * a few times as the source for drawing and image specification commands.\n *\n * @type {number}\n * @constant\n */\nconst StreamDrawUsage = 35040;\n\n/**\n * The contents are intended to be specified once by reading data from the 3D API, and queried\n * many times by the application.\n *\n * @type {number}\n * @constant\n */\nconst StaticReadUsage = 35045;\n\n/**\n * The contents are intended to be respecified repeatedly by reading data from the 3D API, and queried\n * many times by the application.\n *\n * @type {number}\n * @constant\n */\nconst DynamicReadUsage = 35049;\n\n/**\n * The contents are intended to be specified once by reading data from the 3D API, and queried at most\n * a few times by the application\n *\n * @type {number}\n * @constant\n */\nconst StreamReadUsage = 35041;\n\n/**\n * The contents are intended to be specified once by reading data from the 3D API, and used many times as\n * the source for WebGL drawing and image specification commands.\n *\n * @type {number}\n * @constant\n */\nconst StaticCopyUsage = 35046;\n\n/**\n * The contents are intended to be respecified repeatedly by reading data from the 3D API, and used many times\n * as the source for WebGL drawing and image specification commands.\n *\n * @type {number}\n * @constant\n */\nconst DynamicCopyUsage = 35050;\n\n/**\n * The contents are intended to be specified once by reading data from the 3D API, and used at most a few times\n * as the source for WebGL drawing and image specification commands.\n *\n * @type {number}\n * @constant\n */\nconst StreamCopyUsage = 35042;\n\n/**\n * GLSL 1 shader code.\n *\n * @type {string}\n * @constant\n */\nconst GLSL1 = '100';\n\n/**\n * GLSL 3 shader code.\n *\n * @type {string}\n * @constant\n */\nconst GLSL3 = '300 es';\n\n/**\n * WebGL coordinate system.\n *\n * @type {number}\n * @constant\n */\nconst WebGLCoordinateSystem = 2000;\n\n/**\n * WebGPU coordinate system.\n *\n * @type {number}\n * @constant\n */\nconst WebGPUCoordinateSystem = 2001;\n\n/**\n * Represents the different timestamp query types.\n *\n * @type {ConstantsTimestampQuery}\n * @constant\n */\nconst TimestampQuery = {\n\tCOMPUTE: 'compute',\n\tRENDER: 'render'\n};\n\n/**\n * Represents mouse buttons and interaction types in context of controls.\n *\n * @type {ConstantsInterpolationSamplingType}\n * @constant\n */\nconst InterpolationSamplingType = {\n\tPERSPECTIVE: 'perspective',\n\tLINEAR: 'linear',\n\tFLAT: 'flat'\n};\n\n/**\n * Represents the different interpolation sampling modes.\n *\n * @type {ConstantsInterpolationSamplingMode}\n * @constant\n */\nconst InterpolationSamplingMode = {\n\tNORMAL: 'normal',\n\tCENTROID: 'centroid',\n\tSAMPLE: 'sample',\n\tFIRST: 'first',\n\tEITHER: 'either'\n};\n\n/**\n * This type represents mouse buttons and interaction types in context of controls.\n *\n * @typedef {Object} ConstantsMouse\n * @property {number} MIDDLE - The left mouse button.\n * @property {number} LEFT - The middle mouse button.\n * @property {number} RIGHT - The right mouse button.\n * @property {number} ROTATE - A rotate interaction.\n * @property {number} DOLLY - A dolly interaction.\n * @property {number} PAN - A pan interaction.\n **/\n\n/**\n * This type represents touch interaction types in context of controls.\n *\n * @typedef {Object} ConstantsTouch\n * @property {number} ROTATE - A rotate interaction.\n * @property {number} PAN - A pan interaction.\n * @property {number} DOLLY_PAN - The dolly-pan interaction.\n * @property {number} DOLLY_ROTATE - A dolly-rotate interaction.\n **/\n\n/**\n * This type represents the different timestamp query types.\n *\n * @typedef {Object} ConstantsTimestampQuery\n * @property {string} COMPUTE - A `compute` timestamp query.\n * @property {string} RENDER - A `render` timestamp query.\n **/\n\n/**\n * Represents the different interpolation sampling types.\n *\n * @typedef {Object} ConstantsInterpolationSamplingType\n * @property {string} PERSPECTIVE - Perspective-correct interpolation.\n * @property {string} LINEAR - Linear interpolation.\n * @property {string} FLAT - Flat interpolation.\n */\n\n/**\n * Represents the different interpolation sampling modes.\n *\n * @typedef {Object} ConstantsInterpolationSamplingMode\n * @property {string} NORMAL - Normal sampling mode.\n * @property {string} CENTROID - Centroid sampling mode.\n * @property {string} SAMPLE - Sample-specific sampling mode.\n * @property {string} FIRST - Flat interpolation using the first vertex.\n * @property {string} EITHER - Flat interpolation using either vertex.\n */\n\nfunction arrayNeedsUint32( array ) {\n\n\t// assumes larger values usually on last\n\n\tfor ( let i = array.length - 1; i >= 0; -- i ) {\n\n\t\tif ( array[ i ] >= 65535 ) return true; // account for PRIMITIVE_RESTART_FIXED_INDEX, #24565\n\n\t}\n\n\treturn false;\n\n}\n\nconst TYPED_ARRAYS = {\n\tInt8Array: Int8Array,\n\tUint8Array: Uint8Array,\n\tUint8ClampedArray: Uint8ClampedArray,\n\tInt16Array: Int16Array,\n\tUint16Array: Uint16Array,\n\tInt32Array: Int32Array,\n\tUint32Array: Uint32Array,\n\tFloat32Array: Float32Array,\n\tFloat64Array: Float64Array\n};\n\nfunction getTypedArray( type, buffer ) {\n\n\treturn new TYPED_ARRAYS[ type ]( buffer );\n\n}\n\nfunction createElementNS( name ) {\n\n\treturn document.createElementNS( 'http://www.w3.org/1999/xhtml', name );\n\n}\n\nfunction createCanvasElement() {\n\n\tconst canvas = createElementNS( 'canvas' );\n\tcanvas.style.display = 'block';\n\treturn canvas;\n\n}\n\nconst _cache = {};\n\nlet _setConsoleFunction = null;\n\nfunction setConsoleFunction( fn ) {\n\n\t_setConsoleFunction = fn;\n\n}\n\nfunction getConsoleFunction() {\n\n\treturn _setConsoleFunction;\n\n}\n\nfunction log( ...params ) {\n\n\tconst message = 'THREE.' + params.shift();\n\n\tif ( _setConsoleFunction ) {\n\n\t\t_setConsoleFunction( 'log', message, ...params );\n\n\t} else {\n\n\t\tconsole.log( message, ...params );\n\n\t}\n\n}\n\nfunction warn( ...params ) {\n\n\tconst message = 'THREE.' + params.shift();\n\n\tif ( _setConsoleFunction ) {\n\n\t\t_setConsoleFunction( 'warn', message, ...params );\n\n\t} else {\n\n\t\tconsole.warn( message, ...params );\n\n\t}\n\n}\n\nfunction error( ...params ) {\n\n\tconst message = 'THREE.' + params.shift();\n\n\tif ( _setConsoleFunction ) {\n\n\t\t_setConsoleFunction( 'error', message, ...params );\n\n\t} else {\n\n\t\tconsole.error( message, ...params );\n\n\t}\n\n}\n\nfunction warnOnce( ...params ) {\n\n\tconst message = params.join( ' ' );\n\n\tif ( message in _cache ) return;\n\n\t_cache[ message ] = true;\n\n\twarn( ...params );\n\n}\n\nfunction probeAsync( gl, sync, interval ) {\n\n\treturn new Promise( function ( resolve, reject ) {\n\n\t\tfunction probe() {\n\n\t\t\tswitch ( gl.clientWaitSync( sync, gl.SYNC_FLUSH_COMMANDS_BIT, 0 ) ) {\n\n\t\t\t\tcase gl.WAIT_FAILED:\n\t\t\t\t\treject();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase gl.TIMEOUT_EXPIRED:\n\t\t\t\t\tsetTimeout( probe, interval );\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tresolve();\n\n\t\t\t}\n\n\t\t}\n\n\t\tsetTimeout( probe, interval );\n\n\t} );\n\n}\n\n/**\n * This modules allows to dispatch event objects on custom JavaScript objects.\n *\n * Main repository: [eventdispatcher.js](https://github.com/mrdoob/eventdispatcher.js/)\n *\n * Code Example:\n * ```js\n * class Car extends EventDispatcher {\n * \tstart() {\n *\t\tthis.dispatchEvent( { type: 'start', message: 'vroom vroom!' } );\n *\t}\n *};\n *\n * // Using events with the custom object\n * const car = new Car();\n * car.addEventListener( 'start', function ( event ) {\n * \talert( event.message );\n * } );\n *\n * car.start();\n * ```\n */\nclass EventDispatcher {\n\n\t/**\n\t * Adds the given event listener to the given event type.\n\t *\n\t * @param {string} type - The type of event to listen to.\n\t * @param {Function} listener - The function that gets called when the event is fired.\n\t */\n\taddEventListener( type, listener ) {\n\n\t\tif ( this._listeners === undefined ) this._listeners = {};\n\n\t\tconst listeners = this._listeners;\n\n\t\tif ( listeners[ type ] === undefined ) {\n\n\t\t\tlisteners[ type ] = [];\n\n\t\t}\n\n\t\tif ( listeners[ type ].indexOf( listener ) === -1 ) {\n\n\t\t\tlisteners[ type ].push( listener );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns `true` if the given event listener has been added to the given event type.\n\t *\n\t * @param {string} type - The type of event.\n\t * @param {Function} listener - The listener to check.\n\t * @return {boolean} Whether the given event listener has been added to the given event type.\n\t */\n\thasEventListener( type, listener ) {\n\n\t\tconst listeners = this._listeners;\n\n\t\tif ( listeners === undefined ) return false;\n\n\t\treturn listeners[ type ] !== undefined && listeners[ type ].indexOf( listener ) !== -1;\n\n\t}\n\n\t/**\n\t * Removes the given event listener from the given event type.\n\t *\n\t * @param {string} type - The type of event.\n\t * @param {Function} listener - The listener to remove.\n\t */\n\tremoveEventListener( type, listener ) {\n\n\t\tconst listeners = this._listeners;\n\n\t\tif ( listeners === undefined ) return;\n\n\t\tconst listenerArray = listeners[ type ];\n\n\t\tif ( listenerArray !== undefined ) {\n\n\t\t\tconst index = listenerArray.indexOf( listener );\n\n\t\t\tif ( index !== -1 ) {\n\n\t\t\t\tlistenerArray.splice( index, 1 );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Dispatches an event object.\n\t *\n\t * @param {Object} event - The event that gets fired.\n\t */\n\tdispatchEvent( event ) {\n\n\t\tconst listeners = this._listeners;\n\n\t\tif ( listeners === undefined ) return;\n\n\t\tconst listenerArray = listeners[ event.type ];\n\n\t\tif ( listenerArray !== undefined ) {\n\n\t\t\tevent.target = this;\n\n\t\t\t// Make a copy, in case listeners are removed while iterating.\n\t\t\tconst array = listenerArray.slice( 0 );\n\n\t\t\tfor ( let i = 0, l = array.length; i < l; i ++ ) {\n\n\t\t\t\tarray[ i ].call( this, event );\n\n\t\t\t}\n\n\t\t\tevent.target = null;\n\n\t\t}\n\n\t}\n\n}\n\nconst _lut = [ '00', '01', '02', '03', '04', '05', '06', '07', '08', '09', '0a', '0b', '0c', '0d', '0e', '0f', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '1a', '1b', '1c', '1d', '1e', '1f', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '2a', '2b', '2c', '2d', '2e', '2f', '30', '31', '32', '33', '34', '35', '36', '37', '38', '39', '3a', '3b', '3c', '3d', '3e', '3f', '40', '41', '42', '43', '44', '45', '46', '47', '48', '49', '4a', '4b', '4c', '4d', '4e', '4f', '50', '51', '52', '53', '54', '55', '56', '57', '58', '59', '5a', '5b', '5c', '5d', '5e', '5f', '60', '61', '62', '63', '64', '65', '66', '67', '68', '69', '6a', '6b', '6c', '6d', '6e', '6f', '70', '71', '72', '73', '74', '75', '76', '77', '78', '79', '7a', '7b', '7c', '7d', '7e', '7f', '80', '81', '82', '83', '84', '85', '86', '87', '88', '89', '8a', '8b', '8c', '8d', '8e', '8f', '90', '91', '92', '93', '94', '95', '96', '97', '98', '99', '9a', '9b', '9c', '9d', '9e', '9f', 'a0', 'a1', 'a2', 'a3', 'a4', 'a5', 'a6', 'a7', 'a8', 'a9', 'aa', 'ab', 'ac', 'ad', 'ae', 'af', 'b0', 'b1', 'b2', 'b3', 'b4', 'b5', 'b6', 'b7', 'b8', 'b9', 'ba', 'bb', 'bc', 'bd', 'be', 'bf', 'c0', 'c1', 'c2', 'c3', 'c4', 'c5', 'c6', 'c7', 'c8', 'c9', 'ca', 'cb', 'cc', 'cd', 'ce', 'cf', 'd0', 'd1', 'd2', 'd3', 'd4', 'd5', 'd6', 'd7', 'd8', 'd9', 'da', 'db', 'dc', 'dd', 'de', 'df', 'e0', 'e1', 'e2', 'e3', 'e4', 'e5', 'e6', 'e7', 'e8', 'e9', 'ea', 'eb', 'ec', 'ed', 'ee', 'ef', 'f0', 'f1', 'f2', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9', 'fa', 'fb', 'fc', 'fd', 'fe', 'ff' ];\n\nlet _seed = 1234567;\n\n\nconst DEG2RAD = Math.PI / 180;\nconst RAD2DEG = 180 / Math.PI;\n\n/**\n * Generate a [UUID](https://en.wikipedia.org/wiki/Universally_unique_identifier)\n * (universally unique identifier).\n *\n * @return {string} The UUID.\n */\nfunction generateUUID() {\n\n\t// http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/21963136#21963136\n\n\tconst d0 = Math.random() * 0xffffffff | 0;\n\tconst d1 = Math.random() * 0xffffffff | 0;\n\tconst d2 = Math.random() * 0xffffffff | 0;\n\tconst d3 = Math.random() * 0xffffffff | 0;\n\tconst uuid = _lut[ d0 & 0xff ] + _lut[ d0 >> 8 & 0xff ] + _lut[ d0 >> 16 & 0xff ] + _lut[ d0 >> 24 & 0xff ] + '-' +\n\t\t\t_lut[ d1 & 0xff ] + _lut[ d1 >> 8 & 0xff ] + '-' + _lut[ d1 >> 16 & 0x0f | 0x40 ] + _lut[ d1 >> 24 & 0xff ] + '-' +\n\t\t\t_lut[ d2 & 0x3f | 0x80 ] + _lut[ d2 >> 8 & 0xff ] + '-' + _lut[ d2 >> 16 & 0xff ] + _lut[ d2 >> 24 & 0xff ] +\n\t\t\t_lut[ d3 & 0xff ] + _lut[ d3 >> 8 & 0xff ] + _lut[ d3 >> 16 & 0xff ] + _lut[ d3 >> 24 & 0xff ];\n\n\t// .toLowerCase() here flattens concatenated strings to save heap memory space.\n\treturn uuid.toLowerCase();\n\n}\n\n/**\n * Clamps the given value between min and max.\n *\n * @param {number} value - The value to clamp.\n * @param {number} min - The min value.\n * @param {number} max - The max value.\n * @return {number} The clamped value.\n */\nfunction clamp( value, min, max ) {\n\n\treturn Math.max( min, Math.min( max, value ) );\n\n}\n\n/**\n * Computes the Euclidean modulo of the given parameters that\n * is `( ( n % m ) + m ) % m`.\n *\n * @param {number} n - The first parameter.\n * @param {number} m - The second parameter.\n * @return {number} The Euclidean modulo.\n */\nfunction euclideanModulo( n, m ) {\n\n\t// https://en.wikipedia.org/wiki/Modulo_operation\n\n\treturn ( ( n % m ) + m ) % m;\n\n}\n\n/**\n * Performs a linear mapping from range `<a1, a2>` to range `<b1, b2>`\n * for the given value.\n *\n * @param {number} x - The value to be mapped.\n * @param {number} a1 - Minimum value for range A.\n * @param {number} a2 - Maximum value for range A.\n * @param {number} b1 - Minimum value for range B.\n * @param {number} b2 - Maximum value for range B.\n * @return {number} The mapped value.\n */\nfunction mapLinear( x, a1, a2, b1, b2 ) {\n\n\treturn b1 + ( x - a1 ) * ( b2 - b1 ) / ( a2 - a1 );\n\n}\n\n/**\n * Returns the percentage in the closed interval `[0, 1]` of the given value\n * between the start and end point.\n *\n * @param {number} x - The start point\n * @param {number} y - The end point.\n * @param {number} value - A value between start and end.\n * @return {number} The interpolation factor.\n */\nfunction inverseLerp( x, y, value ) {\n\n\t// https://www.gamedev.net/tutorials/programming/general-and-gameplay-programming/inverse-lerp-a-super-useful-yet-often-overlooked-function-r5230/\n\n\tif ( x !== y ) {\n\n\t\treturn ( value - x ) / ( y - x );\n\n\t} else {\n\n\t\treturn 0;\n\n\t}\n\n}\n\n/**\n * Returns a value linearly interpolated from two known points based on the given interval -\n * `t = 0` will return `x` and `t = 1` will return `y`.\n *\n * @param {number} x - The start point\n * @param {number} y - The end point.\n * @param {number} t - The interpolation factor in the closed interval `[0, 1]`.\n * @return {number} The interpolated value.\n */\nfunction lerp( x, y, t ) {\n\n\treturn ( 1 - t ) * x + t * y;\n\n}\n\n/**\n * Smoothly interpolate a number from `x` to `y` in  a spring-like manner using a delta\n * time to maintain frame rate independent movement. For details, see\n * [Frame rate independent damping using lerp](http://www.rorydriscoll.com/2016/03/07/frame-rate-independent-damping-using-lerp/).\n *\n * @param {number} x - The current point.\n * @param {number} y - The target point.\n * @param {number} lambda - A higher lambda value will make the movement more sudden,\n * and a lower value will make the movement more gradual.\n * @param {number} dt - Delta time in seconds.\n * @return {number} The interpolated value.\n */\nfunction damp( x, y, lambda, dt ) {\n\n\treturn lerp( x, y, 1 - Math.exp( - lambda * dt ) );\n\n}\n\n/**\n * Returns a value that alternates between `0` and the given `length` parameter.\n *\n * @param {number} x - The value to pingpong.\n * @param {number} [length=1] - The positive value the function will pingpong to.\n * @return {number} The alternated value.\n */\nfunction pingpong( x, length = 1 ) {\n\n\t// https://www.desmos.com/calculator/vcsjnyz7x4\n\n\treturn length - Math.abs( euclideanModulo( x, length * 2 ) - length );\n\n}\n\n/**\n * Returns a value in the range `[0,1]` that represents the percentage that `x` has\n * moved between `min` and `max`, but smoothed or slowed down the closer `x` is to\n * the `min` and `max`.\n *\n * See [Smoothstep](http://en.wikipedia.org/wiki/Smoothstep) for more details.\n *\n * @param {number} x - The value to evaluate based on its position between min and max.\n * @param {number} min - The min value. Any x value below min will be `0`.\n * @param {number} max - The max value. Any x value above max will be `1`.\n * @return {number} The alternated value.\n */\nfunction smoothstep( x, min, max ) {\n\n\tif ( x <= min ) return 0;\n\tif ( x >= max ) return 1;\n\n\tx = ( x - min ) / ( max - min );\n\n\treturn x * x * ( 3 - 2 * x );\n\n}\n\n/**\n * A [variation on smoothstep](https://en.wikipedia.org/wiki/Smoothstep#Variations)\n * that has zero 1st and 2nd order derivatives at x=0 and x=1.\n *\n * @param {number} x - The value to evaluate based on its position between min and max.\n * @param {number} min - The min value. Any x value below min will be `0`.\n * @param {number} max - The max value. Any x value above max will be `1`.\n * @return {number} The alternated value.\n */\nfunction smootherstep( x, min, max ) {\n\n\tif ( x <= min ) return 0;\n\tif ( x >= max ) return 1;\n\n\tx = ( x - min ) / ( max - min );\n\n\treturn x * x * x * ( x * ( x * 6 - 15 ) + 10 );\n\n}\n\n/**\n * Returns a random integer from `<low, high>` interval.\n *\n * @param {number} low - The lower value boundary.\n * @param {number} high - The upper value boundary\n * @return {number} A random integer.\n */\nfunction randInt( low, high ) {\n\n\treturn low + Math.floor( Math.random() * ( high - low + 1 ) );\n\n}\n\n/**\n * Returns a random float from `<low, high>` interval.\n *\n * @param {number} low - The lower value boundary.\n * @param {number} high - The upper value boundary\n * @return {number} A random float.\n */\nfunction randFloat( low, high ) {\n\n\treturn low + Math.random() * ( high - low );\n\n}\n\n/**\n * Returns a random integer from `<-range/2, range/2>` interval.\n *\n * @param {number} range - Defines the value range.\n * @return {number} A random float.\n */\nfunction randFloatSpread( range ) {\n\n\treturn range * ( 0.5 - Math.random() );\n\n}\n\n/**\n * Returns a deterministic pseudo-random float in the interval `[0, 1]`.\n *\n * @param {number} [s] - The integer seed.\n * @return {number} A random float.\n */\nfunction seededRandom( s ) {\n\n\tif ( s !== undefined ) _seed = s;\n\n\t// Mulberry32 generator\n\n\tlet t = _seed += 0x6D2B79F5;\n\n\tt = Math.imul( t ^ t >>> 15, t | 1 );\n\n\tt ^= t + Math.imul( t ^ t >>> 7, t | 61 );\n\n\treturn ( ( t ^ t >>> 14 ) >>> 0 ) / 4294967296;\n\n}\n\n/**\n * Converts degrees to radians.\n *\n * @param {number} degrees - A value in degrees.\n * @return {number} The converted value in radians.\n */\nfunction degToRad( degrees ) {\n\n\treturn degrees * DEG2RAD;\n\n}\n\n/**\n * Converts radians to degrees.\n *\n * @param {number} radians - A value in radians.\n * @return {number} The converted value in degrees.\n */\nfunction radToDeg( radians ) {\n\n\treturn radians * RAD2DEG;\n\n}\n\n/**\n * Returns `true` if the given number is a power of two.\n *\n * @param {number} value - The value to check.\n * @return {boolean} Whether the given number is a power of two or not.\n */\nfunction isPowerOfTwo( value ) {\n\n\treturn ( value & ( value - 1 ) ) === 0 && value !== 0;\n\n}\n\n/**\n * Returns the smallest power of two that is greater than or equal to the given number.\n *\n * @param {number} value - The value to find a POT for.\n * @return {number} The smallest power of two that is greater than or equal to the given number.\n */\nfunction ceilPowerOfTwo( value ) {\n\n\treturn Math.pow( 2, Math.ceil( Math.log( value ) / Math.LN2 ) );\n\n}\n\n/**\n * Returns the largest power of two that is less than or equal to the given number.\n *\n * @param {number} value - The value to find a POT for.\n * @return {number} The largest power of two that is less than or equal to the given number.\n */\nfunction floorPowerOfTwo( value ) {\n\n\treturn Math.pow( 2, Math.floor( Math.log( value ) / Math.LN2 ) );\n\n}\n\n/**\n * Sets the given quaternion from the [Intrinsic Proper Euler Angles](https://en.wikipedia.org/wiki/Euler_angles)\n * defined by the given angles and order.\n *\n * Rotations are applied to the axes in the order specified by order:\n * rotation by angle `a` is applied first, then by angle `b`, then by angle `c`.\n *\n * @param {Quaternion} q - The quaternion to set.\n * @param {number} a - The rotation applied to the first axis, in radians.\n * @param {number} b - The rotation applied to the second axis, in radians.\n * @param {number} c - The rotation applied to the third axis, in radians.\n * @param {('XYX'|'XZX'|'YXY'|'YZY'|'ZXZ'|'ZYZ')} order - A string specifying the axes order.\n */\nfunction setQuaternionFromProperEuler( q, a, b, c, order ) {\n\n\tconst cos = Math.cos;\n\tconst sin = Math.sin;\n\n\tconst c2 = cos( b / 2 );\n\tconst s2 = sin( b / 2 );\n\n\tconst c13 = cos( ( a + c ) / 2 );\n\tconst s13 = sin( ( a + c ) / 2 );\n\n\tconst c1_3 = cos( ( a - c ) / 2 );\n\tconst s1_3 = sin( ( a - c ) / 2 );\n\n\tconst c3_1 = cos( ( c - a ) / 2 );\n\tconst s3_1 = sin( ( c - a ) / 2 );\n\n\tswitch ( order ) {\n\n\t\tcase 'XYX':\n\t\t\tq.set( c2 * s13, s2 * c1_3, s2 * s1_3, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'YZY':\n\t\t\tq.set( s2 * s1_3, c2 * s13, s2 * c1_3, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'ZXZ':\n\t\t\tq.set( s2 * c1_3, s2 * s1_3, c2 * s13, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'XZX':\n\t\t\tq.set( c2 * s13, s2 * s3_1, s2 * c3_1, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'YXY':\n\t\t\tq.set( s2 * c3_1, c2 * s13, s2 * s3_1, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'ZYZ':\n\t\t\tq.set( s2 * s3_1, s2 * c3_1, c2 * s13, c2 * c13 );\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\twarn( 'MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: ' + order );\n\n\t}\n\n}\n\n/**\n * Denormalizes the given value according to the given typed array.\n *\n * @param {number} value - The value to denormalize.\n * @param {TypedArray} array - The typed array that defines the data type of the value.\n * @return {number} The denormalize (float) value in the range `[0,1]`.\n */\nfunction denormalize( value, array ) {\n\n\tswitch ( array.constructor ) {\n\n\t\tcase Float32Array:\n\n\t\t\treturn value;\n\n\t\tcase Uint32Array:\n\n\t\t\treturn value / 4294967295.0;\n\n\t\tcase Uint16Array:\n\n\t\t\treturn value / 65535.0;\n\n\t\tcase Uint8Array:\n\n\t\t\treturn value / 255.0;\n\n\t\tcase Int32Array:\n\n\t\t\treturn Math.max( value / 2147483647.0, -1 );\n\n\t\tcase Int16Array:\n\n\t\t\treturn Math.max( value / 32767.0, -1 );\n\n\t\tcase Int8Array:\n\n\t\t\treturn Math.max( value / 127.0, -1 );\n\n\t\tdefault:\n\n\t\t\tthrow new Error( 'Invalid component type.' );\n\n\t}\n\n}\n\n/**\n * Normalizes the given value according to the given typed array.\n *\n * @param {number} value - The float value in the range `[0,1]` to normalize.\n * @param {TypedArray} array - The typed array that defines the data type of the value.\n * @return {number} The normalize value.\n */\nfunction normalize( value, array ) {\n\n\tswitch ( array.constructor ) {\n\n\t\tcase Float32Array:\n\n\t\t\treturn value;\n\n\t\tcase Uint32Array:\n\n\t\t\treturn Math.round( value * 4294967295.0 );\n\n\t\tcase Uint16Array:\n\n\t\t\treturn Math.round( value * 65535.0 );\n\n\t\tcase Uint8Array:\n\n\t\t\treturn Math.round( value * 255.0 );\n\n\t\tcase Int32Array:\n\n\t\t\treturn Math.round( value * 2147483647.0 );\n\n\t\tcase Int16Array:\n\n\t\t\treturn Math.round( value * 32767.0 );\n\n\t\tcase Int8Array:\n\n\t\t\treturn Math.round( value * 127.0 );\n\n\t\tdefault:\n\n\t\t\tthrow new Error( 'Invalid component type.' );\n\n\t}\n\n}\n\n/**\n * @class\n * @classdesc A collection of math utility functions.\n * @hideconstructor\n */\nconst MathUtils = {\n\tDEG2RAD: DEG2RAD,\n\tRAD2DEG: RAD2DEG,\n\t/**\n\t * Generate a [UUID](https://en.wikipedia.org/wiki/Universally_unique_identifier)\n\t * (universally unique identifier).\n\t *\n\t * @static\n\t * @method\n\t * @return {string} The UUID.\n\t */\n\tgenerateUUID: generateUUID,\n\t/**\n\t * Clamps the given value between min and max.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} value - The value to clamp.\n\t * @param {number} min - The min value.\n\t * @param {number} max - The max value.\n\t * @return {number} The clamped value.\n\t */\n\tclamp: clamp,\n\t/**\n\t * Computes the Euclidean modulo of the given parameters that\n\t * is `( ( n % m ) + m ) % m`.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} n - The first parameter.\n\t * @param {number} m - The second parameter.\n\t * @return {number} The Euclidean modulo.\n\t */\n\teuclideanModulo: euclideanModulo,\n\t/**\n\t * Performs a linear mapping from range `<a1, a2>` to range `<b1, b2>`\n\t * for the given value.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} x - The value to be mapped.\n\t * @param {number} a1 - Minimum value for range A.\n\t * @param {number} a2 - Maximum value for range A.\n\t * @param {number} b1 - Minimum value for range B.\n\t * @param {number} b2 - Maximum value for range B.\n\t * @return {number} The mapped value.\n\t */\n\tmapLinear: mapLinear,\n\t/**\n\t * Returns the percentage in the closed interval `[0, 1]` of the given value\n\t * between the start and end point.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} x - The start point\n\t * @param {number} y - The end point.\n\t * @param {number} value - A value between start and end.\n\t * @return {number} The interpolation factor.\n\t */\n\tinverseLerp: inverseLerp,\n\t/**\n\t * Returns a value linearly interpolated from two known points based on the given interval -\n\t * `t = 0` will return `x` and `t = 1` will return `y`.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} x - The start point\n\t * @param {number} y - The end point.\n\t * @param {number} t - The interpolation factor in the closed interval `[0, 1]`.\n\t * @return {number} The interpolated value.\n\t */\n\tlerp: lerp,\n\t/**\n\t * Smoothly interpolate a number from `x` to `y` in  a spring-like manner using a delta\n\t * time to maintain frame rate independent movement. For details, see\n\t * [Frame rate independent damping using lerp](http://www.rorydriscoll.com/2016/03/07/frame-rate-independent-damping-using-lerp/).\n\t *\n\t * @static\n\t * @method\n\t * @param {number} x - The current point.\n\t * @param {number} y - The target point.\n\t * @param {number} lambda - A higher lambda value will make the movement more sudden,\n\t * and a lower value will make the movement more gradual.\n\t * @param {number} dt - Delta time in seconds.\n\t * @return {number} The interpolated value.\n\t */\n\tdamp: damp,\n\t/**\n\t * Returns a value that alternates between `0` and the given `length` parameter.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} x - The value to pingpong.\n\t * @param {number} [length=1] - The positive value the function will pingpong to.\n\t * @return {number} The alternated value.\n\t */\n\tpingpong: pingpong,\n\t/**\n\t * Returns a value in the range `[0,1]` that represents the percentage that `x` has\n\t * moved between `min` and `max`, but smoothed or slowed down the closer `x` is to\n\t * the `min` and `max`.\n\t *\n\t * See [Smoothstep](http://en.wikipedia.org/wiki/Smoothstep) for more details.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} x - The value to evaluate based on its position between min and max.\n\t * @param {number} min - The min value. Any x value below min will be `0`.\n\t * @param {number} max - The max value. Any x value above max will be `1`.\n\t * @return {number} The alternated value.\n\t */\n\tsmoothstep: smoothstep,\n\t/**\n\t * A [variation on smoothstep](https://en.wikipedia.org/wiki/Smoothstep#Variations)\n\t * that has zero 1st and 2nd order derivatives at x=0 and x=1.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} x - The value to evaluate based on its position between min and max.\n\t * @param {number} min - The min value. Any x value below min will be `0`.\n\t * @param {number} max - The max value. Any x value above max will be `1`.\n\t * @return {number} The alternated value.\n\t */\n\tsmootherstep: smootherstep,\n\t/**\n\t * Returns a random integer from `<low, high>` interval.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} low - The lower value boundary.\n\t * @param {number} high - The upper value boundary\n\t * @return {number} A random integer.\n\t */\n\trandInt: randInt,\n\t/**\n\t * Returns a random float from `<low, high>` interval.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} low - The lower value boundary.\n\t * @param {number} high - The upper value boundary\n\t * @return {number} A random float.\n\t */\n\trandFloat: randFloat,\n\t/**\n\t * Returns a random integer from `<-range/2, range/2>` interval.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} range - Defines the value range.\n\t * @return {number} A random float.\n\t */\n\trandFloatSpread: randFloatSpread,\n\t/**\n\t * Returns a deterministic pseudo-random float in the interval `[0, 1]`.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} [s] - The integer seed.\n\t * @return {number} A random float.\n\t */\n\tseededRandom: seededRandom,\n\t/**\n\t * Converts degrees to radians.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} degrees - A value in degrees.\n\t * @return {number} The converted value in radians.\n\t */\n\tdegToRad: degToRad,\n\t/**\n\t * Converts radians to degrees.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} radians - A value in radians.\n\t * @return {number} The converted value in degrees.\n\t */\n\tradToDeg: radToDeg,\n\t/**\n\t * Returns `true` if the given number is a power of two.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} value - The value to check.\n\t * @return {boolean} Whether the given number is a power of two or not.\n\t */\n\tisPowerOfTwo: isPowerOfTwo,\n\t/**\n\t * Returns the smallest power of two that is greater than or equal to the given number.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} value - The value to find a POT for.\n\t * @return {number} The smallest power of two that is greater than or equal to the given number.\n\t */\n\tceilPowerOfTwo: ceilPowerOfTwo,\n\t/**\n\t * Returns the largest power of two that is less than or equal to the given number.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} value - The value to find a POT for.\n\t * @return {number} The largest power of two that is less than or equal to the given number.\n\t */\n\tfloorPowerOfTwo: floorPowerOfTwo,\n\t/**\n\t * Sets the given quaternion from the [Intrinsic Proper Euler Angles](https://en.wikipedia.org/wiki/Euler_angles)\n\t * defined by the given angles and order.\n\t *\n\t * Rotations are applied to the axes in the order specified by order:\n\t * rotation by angle `a` is applied first, then by angle `b`, then by angle `c`.\n\t *\n\t * @static\n\t * @method\n\t * @param {Quaternion} q - The quaternion to set.\n\t * @param {number} a - The rotation applied to the first axis, in radians.\n\t * @param {number} b - The rotation applied to the second axis, in radians.\n\t * @param {number} c - The rotation applied to the third axis, in radians.\n\t * @param {('XYX'|'XZX'|'YXY'|'YZY'|'ZXZ'|'ZYZ')} order - A string specifying the axes order.\n\t */\n\tsetQuaternionFromProperEuler: setQuaternionFromProperEuler,\n\t/**\n\t * Normalizes the given value according to the given typed array.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} value - The float value in the range `[0,1]` to normalize.\n\t * @param {TypedArray} array - The typed array that defines the data type of the value.\n\t * @return {number} The normalize value.\n\t */\n\tnormalize: normalize,\n\t/**\n\t * Denormalizes the given value according to the given typed array.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} value - The value to denormalize.\n\t * @param {TypedArray} array - The typed array that defines the data type of the value.\n\t * @return {number} The denormalize (float) value in the range `[0,1]`.\n\t */\n\tdenormalize: denormalize\n};\n\n/**\n * Class representing a 2D vector. A 2D vector is an ordered pair of numbers\n * (labeled x and y), which can be used to represent a number of things, such as:\n *\n * - A point in 2D space (i.e. a position on a plane).\n * - A direction and length across a plane. In three.js the length will\n * always be the Euclidean distance(straight-line distance) from `(0, 0)` to `(x, y)`\n * and the direction is also measured from `(0, 0)` towards `(x, y)`.\n * - Any arbitrary ordered pair of numbers.\n *\n * There are other things a 2D vector can be used to represent, such as\n * momentum vectors, complex numbers and so on, however these are the most\n * common uses in three.js.\n *\n * Iterating through a vector instance will yield its components `(x, y)` in\n * the corresponding order.\n * ```js\n * const a = new THREE.Vector2( 0, 1 );\n *\n * //no arguments; will be initialised to (0, 0)\n * const b = new THREE.Vector2( );\n *\n * const d = a.distanceTo( b );\n * ```\n */\nclass Vector2 {\n\n\t/**\n\t * Constructs a new 2D vector.\n\t *\n\t * @param {number} [x=0] - The x value of this vector.\n\t * @param {number} [y=0] - The y value of this vector.\n\t */\n\tconstructor( x = 0, y = 0 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tVector2.prototype.isVector2 = true;\n\n\t\t/**\n\t\t * The x value of this vector.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.x = x;\n\n\t\t/**\n\t\t * The y value of this vector.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.y = y;\n\n\t}\n\n\t/**\n\t * Alias for {@link Vector2#x}.\n\t *\n\t * @type {number}\n\t */\n\tget width() {\n\n\t\treturn this.x;\n\n\t}\n\n\tset width( value ) {\n\n\t\tthis.x = value;\n\n\t}\n\n\t/**\n\t * Alias for {@link Vector2#y}.\n\t *\n\t * @type {number}\n\t */\n\tget height() {\n\n\t\treturn this.y;\n\n\t}\n\n\tset height( value ) {\n\n\t\tthis.y = value;\n\n\t}\n\n\t/**\n\t * Sets the vector components.\n\t *\n\t * @param {number} x - The value of the x component.\n\t * @param {number} y - The value of the y component.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tset( x, y ) {\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector components to the same value.\n\t *\n\t * @param {number} scalar - The value to set for all vector components.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tsetScalar( scalar ) {\n\n\t\tthis.x = scalar;\n\t\tthis.y = scalar;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector's x component to the given value\n\t *\n\t * @param {number} x - The value to set.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tsetX( x ) {\n\n\t\tthis.x = x;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector's y component to the given value\n\t *\n\t * @param {number} y - The value to set.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tsetY( y ) {\n\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Allows to set a vector component with an index.\n\t *\n\t * @param {number} index - The component index. `0` equals to x, `1` equals to y.\n\t * @param {number} value - The value to set.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tsetComponent( index, value ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: this.x = value; break;\n\t\t\tcase 1: this.y = value; break;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the value of the vector component which matches the given index.\n\t *\n\t * @param {number} index - The component index. `0` equals to x, `1` equals to y.\n\t * @return {number} A vector component value.\n\t */\n\tgetComponent( index ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: return this.x;\n\t\t\tcase 1: return this.y;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns a new vector with copied values from this instance.\n\t *\n\t * @return {Vector2} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor( this.x, this.y );\n\n\t}\n\n\t/**\n\t * Copies the values of the given vector to this instance.\n\t *\n\t * @param {Vector2} v - The vector to copy.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tcopy( v ) {\n\n\t\tthis.x = v.x;\n\t\tthis.y = v.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given vector to this instance.\n\t *\n\t * @param {Vector2} v - The vector to add.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tadd( v ) {\n\n\t\tthis.x += v.x;\n\t\tthis.y += v.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given scalar value to all components of this instance.\n\t *\n\t * @param {number} s - The scalar to add.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\taddScalar( s ) {\n\n\t\tthis.x += s;\n\t\tthis.y += s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given vectors and stores the result in this instance.\n\t *\n\t * @param {Vector2} a - The first vector.\n\t * @param {Vector2} b - The second vector.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\taddVectors( a, b ) {\n\n\t\tthis.x = a.x + b.x;\n\t\tthis.y = a.y + b.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given vector scaled by the given factor to this instance.\n\t *\n\t * @param {Vector2} v - The vector.\n\t * @param {number} s - The factor that scales `v`.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\taddScaledVector( v, s ) {\n\n\t\tthis.x += v.x * s;\n\t\tthis.y += v.y * s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the given vector from this instance.\n\t *\n\t * @param {Vector2} v - The vector to subtract.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tsub( v ) {\n\n\t\tthis.x -= v.x;\n\t\tthis.y -= v.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the given scalar value from all components of this instance.\n\t *\n\t * @param {number} s - The scalar to subtract.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tsubScalar( s ) {\n\n\t\tthis.x -= s;\n\t\tthis.y -= s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the given vectors and stores the result in this instance.\n\t *\n\t * @param {Vector2} a - The first vector.\n\t * @param {Vector2} b - The second vector.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tsubVectors( a, b ) {\n\n\t\tthis.x = a.x - b.x;\n\t\tthis.y = a.y - b.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the given vector with this instance.\n\t *\n\t * @param {Vector2} v - The vector to multiply.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tmultiply( v ) {\n\n\t\tthis.x *= v.x;\n\t\tthis.y *= v.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the given scalar value with all components of this instance.\n\t *\n\t * @param {number} scalar - The scalar to multiply.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tmultiplyScalar( scalar ) {\n\n\t\tthis.x *= scalar;\n\t\tthis.y *= scalar;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Divides this instance by the given vector.\n\t *\n\t * @param {Vector2} v - The vector to divide.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tdivide( v ) {\n\n\t\tthis.x /= v.x;\n\t\tthis.y /= v.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Divides this vector by the given scalar.\n\t *\n\t * @param {number} scalar - The scalar to divide.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tdivideScalar( scalar ) {\n\n\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t}\n\n\t/**\n\t * Multiplies this vector (with an implicit 1 as the 3rd component) by\n\t * the given 3x3 matrix.\n\t *\n\t * @param {Matrix3} m - The matrix to apply.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tapplyMatrix3( m ) {\n\n\t\tconst x = this.x, y = this.y;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ];\n\t\tthis.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x or y value is greater than the given vector's x or y\n\t * value, replace that value with the corresponding min value.\n\t *\n\t * @param {Vector2} v - The vector.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tmin( v ) {\n\n\t\tthis.x = Math.min( this.x, v.x );\n\t\tthis.y = Math.min( this.y, v.y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x or y value is less than the given vector's x or y\n\t * value, replace that value with the corresponding max value.\n\t *\n\t * @param {Vector2} v - The vector.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tmax( v ) {\n\n\t\tthis.x = Math.max( this.x, v.x );\n\t\tthis.y = Math.max( this.y, v.y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x or y value is greater than the max vector's x or y\n\t * value, it is replaced by the corresponding value.\n\t * If this vector's x or y value is less than the min vector's x or y value,\n\t * it is replaced by the corresponding value.\n\t *\n\t * @param {Vector2} min - The minimum x and y values.\n\t * @param {Vector2} max - The maximum x and y values in the desired range.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tclamp( min, max ) {\n\n\t\t// assumes min < max, componentwise\n\n\t\tthis.x = clamp( this.x, min.x, max.x );\n\t\tthis.y = clamp( this.y, min.y, max.y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x or y values are greater than the max value, they are\n\t * replaced by the max value.\n\t * If this vector's x or y values are less than the min value, they are\n\t * replaced by the min value.\n\t *\n\t * @param {number} minVal - The minimum value the components will be clamped to.\n\t * @param {number} maxVal - The maximum value the components will be clamped to.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tclampScalar( minVal, maxVal ) {\n\n\t\tthis.x = clamp( this.x, minVal, maxVal );\n\t\tthis.y = clamp( this.y, minVal, maxVal );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's length is greater than the max value, it is replaced by\n\t * the max value.\n\t * If this vector's length is less than the min value, it is replaced by the\n\t * min value.\n\t *\n\t * @param {number} min - The minimum value the vector length will be clamped to.\n\t * @param {number} max - The maximum value the vector length will be clamped to.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tclampLength( min, max ) {\n\n\t\tconst length = this.length();\n\n\t\treturn this.divideScalar( length || 1 ).multiplyScalar( clamp( length, min, max ) );\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded down to the nearest integer value.\n\t *\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tfloor() {\n\n\t\tthis.x = Math.floor( this.x );\n\t\tthis.y = Math.floor( this.y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded up to the nearest integer value.\n\t *\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tceil() {\n\n\t\tthis.x = Math.ceil( this.x );\n\t\tthis.y = Math.ceil( this.y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded to the nearest integer value\n\t *\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tround() {\n\n\t\tthis.x = Math.round( this.x );\n\t\tthis.y = Math.round( this.y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded towards zero (up if negative,\n\t * down if positive) to an integer value.\n\t *\n\t * @return {Vector2} A reference to this vector.\n\t */\n\troundToZero() {\n\n\t\tthis.x = Math.trunc( this.x );\n\t\tthis.y = Math.trunc( this.y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Inverts this vector - i.e. sets x = -x and y = -y.\n\t *\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tnegate() {\n\n\t\tthis.x = - this.x;\n\t\tthis.y = - this.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Calculates the dot product of the given vector with this instance.\n\t *\n\t * @param {Vector2} v - The vector to compute the dot product with.\n\t * @return {number} The result of the dot product.\n\t */\n\tdot( v ) {\n\n\t\treturn this.x * v.x + this.y * v.y;\n\n\t}\n\n\t/**\n\t * Calculates the cross product of the given vector with this instance.\n\t *\n\t * @param {Vector2} v - The vector to compute the cross product with.\n\t * @return {number} The result of the cross product.\n\t */\n\tcross( v ) {\n\n\t\treturn this.x * v.y - this.y * v.x;\n\n\t}\n\n\t/**\n\t * Computes the square of the Euclidean length (straight-line length) from\n\t * (0, 0) to (x, y). If you are comparing the lengths of vectors, you should\n\t * compare the length squared instead as it is slightly more efficient to calculate.\n\t *\n\t * @return {number} The square length of this vector.\n\t */\n\tlengthSq() {\n\n\t\treturn this.x * this.x + this.y * this.y;\n\n\t}\n\n\t/**\n\t * Computes the  Euclidean length (straight-line length) from (0, 0) to (x, y).\n\t *\n\t * @return {number} The length of this vector.\n\t */\n\tlength() {\n\n\t\treturn Math.sqrt( this.x * this.x + this.y * this.y );\n\n\t}\n\n\t/**\n\t * Computes the Manhattan length of this vector.\n\t *\n\t * @return {number} The length of this vector.\n\t */\n\tmanhattanLength() {\n\n\t\treturn Math.abs( this.x ) + Math.abs( this.y );\n\n\t}\n\n\t/**\n\t * Converts this vector to a unit vector - that is, sets it equal to a vector\n\t * with the same direction as this one, but with a vector length of `1`.\n\t *\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tnormalize() {\n\n\t\treturn this.divideScalar( this.length() || 1 );\n\n\t}\n\n\t/**\n\t * Computes the angle in radians of this vector with respect to the positive x-axis.\n\t *\n\t * @return {number} The angle in radians.\n\t */\n\tangle() {\n\n\t\tconst angle = Math.atan2( - this.y, - this.x ) + Math.PI;\n\n\t\treturn angle;\n\n\t}\n\n\t/**\n\t * Returns the angle between the given vector and this instance in radians.\n\t *\n\t * @param {Vector2} v - The vector to compute the angle with.\n\t * @return {number} The angle in radians.\n\t */\n\tangleTo( v ) {\n\n\t\tconst denominator = Math.sqrt( this.lengthSq() * v.lengthSq() );\n\n\t\tif ( denominator === 0 ) return Math.PI / 2;\n\n\t\tconst theta = this.dot( v ) / denominator;\n\n\t\t// clamp, to handle numerical problems\n\n\t\treturn Math.acos( clamp( theta, -1, 1 ) );\n\n\t}\n\n\t/**\n\t * Computes the distance from the given vector to this instance.\n\t *\n\t * @param {Vector2} v - The vector to compute the distance to.\n\t * @return {number} The distance.\n\t */\n\tdistanceTo( v ) {\n\n\t\treturn Math.sqrt( this.distanceToSquared( v ) );\n\n\t}\n\n\t/**\n\t * Computes the squared distance from the given vector to this instance.\n\t * If you are just comparing the distance with another distance, you should compare\n\t * the distance squared instead as it is slightly more efficient to calculate.\n\t *\n\t * @param {Vector2} v - The vector to compute the squared distance to.\n\t * @return {number} The squared distance.\n\t */\n\tdistanceToSquared( v ) {\n\n\t\tconst dx = this.x - v.x, dy = this.y - v.y;\n\t\treturn dx * dx + dy * dy;\n\n\t}\n\n\t/**\n\t * Computes the Manhattan distance from the given vector to this instance.\n\t *\n\t * @param {Vector2} v - The vector to compute the Manhattan distance to.\n\t * @return {number} The Manhattan distance.\n\t */\n\tmanhattanDistanceTo( v ) {\n\n\t\treturn Math.abs( this.x - v.x ) + Math.abs( this.y - v.y );\n\n\t}\n\n\t/**\n\t * Sets this vector to a vector with the same direction as this one, but\n\t * with the specified length.\n\t *\n\t * @param {number} length - The new length of this vector.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tsetLength( length ) {\n\n\t\treturn this.normalize().multiplyScalar( length );\n\n\t}\n\n\t/**\n\t * Linearly interpolates between the given vector and this instance, where\n\t * alpha is the percent distance along the line - alpha = 0 will be this\n\t * vector, and alpha = 1 will be the given one.\n\t *\n\t * @param {Vector2} v - The vector to interpolate towards.\n\t * @param {number} alpha - The interpolation factor, typically in the closed interval `[0, 1]`.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tlerp( v, alpha ) {\n\n\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\tthis.y += ( v.y - this.y ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Linearly interpolates between the given vectors, where alpha is the percent\n\t * distance along the line - alpha = 0 will be first vector, and alpha = 1 will\n\t * be the second one. The result is stored in this instance.\n\t *\n\t * @param {Vector2} v1 - The first vector.\n\t * @param {Vector2} v2 - The second vector.\n\t * @param {number} alpha - The interpolation factor, typically in the closed interval `[0, 1]`.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tlerpVectors( v1, v2, alpha ) {\n\n\t\tthis.x = v1.x + ( v2.x - v1.x ) * alpha;\n\t\tthis.y = v1.y + ( v2.y - v1.y ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this vector is equal with the given one.\n\t *\n\t * @param {Vector2} v - The vector to test for equality.\n\t * @return {boolean} Whether this vector is equal with the given one.\n\t */\n\tequals( v ) {\n\n\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) );\n\n\t}\n\n\t/**\n\t * Sets this vector's x value to be `array[ offset ]` and y\n\t * value to be `array[ offset + 1 ]`.\n\t *\n\t * @param {Array<number>} array - An array holding the vector component values.\n\t * @param {number} [offset=0] - The offset into the array.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis.x = array[ offset ];\n\t\tthis.y = array[ offset + 1 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Writes the components of this vector to the given array. If no array is provided,\n\t * the method returns a new instance.\n\t *\n\t * @param {Array<number>} [array=[]] - The target array holding the vector components.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Array<number>} The vector components.\n\t */\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this.x;\n\t\tarray[ offset + 1 ] = this.y;\n\n\t\treturn array;\n\n\t}\n\n\t/**\n\t * Sets the components of this vector from the given buffer attribute.\n\t *\n\t * @param {BufferAttribute} attribute - The buffer attribute holding vector data.\n\t * @param {number} index - The index into the attribute.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tfromBufferAttribute( attribute, index ) {\n\n\t\tthis.x = attribute.getX( index );\n\t\tthis.y = attribute.getY( index );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Rotates this vector around the given center by the given angle.\n\t *\n\t * @param {Vector2} center - The point around which to rotate.\n\t * @param {number} angle - The angle to rotate, in radians.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\trotateAround( center, angle ) {\n\n\t\tconst c = Math.cos( angle ), s = Math.sin( angle );\n\n\t\tconst x = this.x - center.x;\n\t\tconst y = this.y - center.y;\n\n\t\tthis.x = x * c - y * s + center.x;\n\t\tthis.y = x * s + y * c + center.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets each component of this vector to a pseudo-random value between `0` and\n\t * `1`, excluding `1`.\n\t *\n\t * @return {Vector2} A reference to this vector.\n\t */\n\trandom() {\n\n\t\tthis.x = Math.random();\n\t\tthis.y = Math.random();\n\n\t\treturn this;\n\n\t}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this.x;\n\t\tyield this.y;\n\n\t}\n\n}\n\n/**\n * Class for representing a Quaternion. Quaternions are used in three.js to represent rotations.\n *\n * Iterating through a vector instance will yield its components `(x, y, z, w)` in\n * the corresponding order.\n *\n * Note that three.js expects Quaternions to be normalized.\n * ```js\n * const quaternion = new THREE.Quaternion();\n * quaternion.setFromAxisAngle( new THREE.Vector3( 0, 1, 0 ), Math.PI / 2 );\n *\n * const vector = new THREE.Vector3( 1, 0, 0 );\n * vector.applyQuaternion( quaternion );\n * ```\n */\nclass Quaternion {\n\n\t/**\n\t * Constructs a new quaternion.\n\t *\n\t * @param {number} [x=0] - The x value of this quaternion.\n\t * @param {number} [y=0] - The y value of this quaternion.\n\t * @param {number} [z=0] - The z value of this quaternion.\n\t * @param {number} [w=1] - The w value of this quaternion.\n\t */\n\tconstructor( x = 0, y = 0, z = 0, w = 1 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isQuaternion = true;\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._w = w;\n\n\t}\n\n\t/**\n\t * Interpolates between two quaternions via SLERP. This implementation assumes the\n\t * quaternion data are managed in flat arrays.\n\t *\n\t * @param {Array<number>} dst - The destination array.\n\t * @param {number} dstOffset - An offset into the destination array.\n\t * @param {Array<number>} src0 - The source array of the first quaternion.\n\t * @param {number} srcOffset0 - An offset into the first source array.\n\t * @param {Array<number>} src1 -  The source array of the second quaternion.\n\t * @param {number} srcOffset1 - An offset into the second source array.\n\t * @param {number} t - The interpolation factor in the range `[0,1]`.\n\t * @see {@link Quaternion#slerp}\n\t */\n\tstatic slerpFlat( dst, dstOffset, src0, srcOffset0, src1, srcOffset1, t ) {\n\n\t\tlet x0 = src0[ srcOffset0 + 0 ],\n\t\t\ty0 = src0[ srcOffset0 + 1 ],\n\t\t\tz0 = src0[ srcOffset0 + 2 ],\n\t\t\tw0 = src0[ srcOffset0 + 3 ];\n\n\t\tlet x1 = src1[ srcOffset1 + 0 ],\n\t\t\ty1 = src1[ srcOffset1 + 1 ],\n\t\t\tz1 = src1[ srcOffset1 + 2 ],\n\t\t\tw1 = src1[ srcOffset1 + 3 ];\n\n\t\tif ( t <= 0 ) {\n\n\t\t\tdst[ dstOffset + 0 ] = x0;\n\t\t\tdst[ dstOffset + 1 ] = y0;\n\t\t\tdst[ dstOffset + 2 ] = z0;\n\t\t\tdst[ dstOffset + 3 ] = w0;\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( t >= 1 ) {\n\n\t\t\tdst[ dstOffset + 0 ] = x1;\n\t\t\tdst[ dstOffset + 1 ] = y1;\n\t\t\tdst[ dstOffset + 2 ] = z1;\n\t\t\tdst[ dstOffset + 3 ] = w1;\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1 ) {\n\n\t\t\tlet dot = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1;\n\n\t\t\tif ( dot < 0 ) {\n\n\t\t\t\tx1 = - x1;\n\t\t\t\ty1 = - y1;\n\t\t\t\tz1 = - z1;\n\t\t\t\tw1 = - w1;\n\n\t\t\t\tdot = - dot;\n\n\t\t\t}\n\n\t\t\tlet s = 1 - t;\n\n\t\t\tif ( dot < 0.9995 ) {\n\n\t\t\t\t// slerp\n\n\t\t\t\tconst theta = Math.acos( dot );\n\t\t\t\tconst sin = Math.sin( theta );\n\n\t\t\t\ts = Math.sin( s * theta ) / sin;\n\t\t\t\tt = Math.sin( t * theta ) / sin;\n\n\t\t\t\tx0 = x0 * s + x1 * t;\n\t\t\t\ty0 = y0 * s + y1 * t;\n\t\t\t\tz0 = z0 * s + z1 * t;\n\t\t\t\tw0 = w0 * s + w1 * t;\n\n\t\t\t} else {\n\n\t\t\t\t// for small angles, lerp then normalize\n\n\t\t\t\tx0 = x0 * s + x1 * t;\n\t\t\t\ty0 = y0 * s + y1 * t;\n\t\t\t\tz0 = z0 * s + z1 * t;\n\t\t\t\tw0 = w0 * s + w1 * t;\n\n\t\t\t\tconst f = 1 / Math.sqrt( x0 * x0 + y0 * y0 + z0 * z0 + w0 * w0 );\n\n\t\t\t\tx0 *= f;\n\t\t\t\ty0 *= f;\n\t\t\t\tz0 *= f;\n\t\t\t\tw0 *= f;\n\n\t\t\t}\n\n\t\t}\n\n\t\tdst[ dstOffset ] = x0;\n\t\tdst[ dstOffset + 1 ] = y0;\n\t\tdst[ dstOffset + 2 ] = z0;\n\t\tdst[ dstOffset + 3 ] = w0;\n\n\t}\n\n\t/**\n\t * Multiplies two quaternions. This implementation assumes the quaternion data are managed\n\t * in flat arrays.\n\t *\n\t * @param {Array<number>} dst - The destination array.\n\t * @param {number} dstOffset - An offset into the destination array.\n\t * @param {Array<number>} src0 - The source array of the first quaternion.\n\t * @param {number} srcOffset0 - An offset into the first source array.\n\t * @param {Array<number>} src1 -  The source array of the second quaternion.\n\t * @param {number} srcOffset1 - An offset into the second source array.\n\t * @return {Array<number>} The destination array.\n\t * @see {@link Quaternion#multiplyQuaternions}.\n\t */\n\tstatic multiplyQuaternionsFlat( dst, dstOffset, src0, srcOffset0, src1, srcOffset1 ) {\n\n\t\tconst x0 = src0[ srcOffset0 ];\n\t\tconst y0 = src0[ srcOffset0 + 1 ];\n\t\tconst z0 = src0[ srcOffset0 + 2 ];\n\t\tconst w0 = src0[ srcOffset0 + 3 ];\n\n\t\tconst x1 = src1[ srcOffset1 ];\n\t\tconst y1 = src1[ srcOffset1 + 1 ];\n\t\tconst z1 = src1[ srcOffset1 + 2 ];\n\t\tconst w1 = src1[ srcOffset1 + 3 ];\n\n\t\tdst[ dstOffset ] = x0 * w1 + w0 * x1 + y0 * z1 - z0 * y1;\n\t\tdst[ dstOffset + 1 ] = y0 * w1 + w0 * y1 + z0 * x1 - x0 * z1;\n\t\tdst[ dstOffset + 2 ] = z0 * w1 + w0 * z1 + x0 * y1 - y0 * x1;\n\t\tdst[ dstOffset + 3 ] = w0 * w1 - x0 * x1 - y0 * y1 - z0 * z1;\n\n\t\treturn dst;\n\n\t}\n\n\t/**\n\t * The x value of this quaternion.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget x() {\n\n\t\treturn this._x;\n\n\t}\n\n\tset x( value ) {\n\n\t\tthis._x = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\t/**\n\t * The y value of this quaternion.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget y() {\n\n\t\treturn this._y;\n\n\t}\n\n\tset y( value ) {\n\n\t\tthis._y = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\t/**\n\t * The z value of this quaternion.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget z() {\n\n\t\treturn this._z;\n\n\t}\n\n\tset z( value ) {\n\n\t\tthis._z = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\t/**\n\t * The w value of this quaternion.\n\t *\n\t * @type {number}\n\t * @default 1\n\t */\n\tget w() {\n\n\t\treturn this._w;\n\n\t}\n\n\tset w( value ) {\n\n\t\tthis._w = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\t/**\n\t * Sets the quaternion components.\n\t *\n\t * @param {number} x - The x value of this quaternion.\n\t * @param {number} y - The y value of this quaternion.\n\t * @param {number} z - The z value of this quaternion.\n\t * @param {number} w - The w value of this quaternion.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tset( x, y, z, w ) {\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._w = w;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new quaternion with copied values from this instance.\n\t *\n\t * @return {Quaternion} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor( this._x, this._y, this._z, this._w );\n\n\t}\n\n\t/**\n\t * Copies the values of the given quaternion to this instance.\n\t *\n\t * @param {Quaternion} quaternion - The quaternion to copy.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tcopy( quaternion ) {\n\n\t\tthis._x = quaternion.x;\n\t\tthis._y = quaternion.y;\n\t\tthis._z = quaternion.z;\n\t\tthis._w = quaternion.w;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this quaternion from the rotation specified by the given\n\t * Euler angles.\n\t *\n\t * @param {Euler} euler - The Euler angles.\n\t * @param {boolean} [update=true] - Whether the internal `onChange` callback should be executed or not.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tsetFromEuler( euler, update = true ) {\n\n\t\tconst x = euler._x, y = euler._y, z = euler._z, order = euler._order;\n\n\t\t// http://www.mathworks.com/matlabcentral/fileexchange/\n\t\t// \t20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/\n\t\t//\tcontent/SpinCalc.m\n\n\t\tconst cos = Math.cos;\n\t\tconst sin = Math.sin;\n\n\t\tconst c1 = cos( x / 2 );\n\t\tconst c2 = cos( y / 2 );\n\t\tconst c3 = cos( z / 2 );\n\n\t\tconst s1 = sin( x / 2 );\n\t\tconst s2 = sin( y / 2 );\n\t\tconst s3 = sin( z / 2 );\n\n\t\tswitch ( order ) {\n\n\t\t\tcase 'XYZ':\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'YXZ':\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZXY':\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZYX':\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'YZX':\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'XZY':\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\twarn( 'Quaternion: .setFromEuler() encountered an unknown order: ' + order );\n\n\t\t}\n\n\t\tif ( update === true ) this._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this quaternion from the given axis and angle.\n\t *\n\t * @param {Vector3} axis - The normalized axis.\n\t * @param {number} angle - The angle in radians.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tsetFromAxisAngle( axis, angle ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm\n\n\t\tconst halfAngle = angle / 2, s = Math.sin( halfAngle );\n\n\t\tthis._x = axis.x * s;\n\t\tthis._y = axis.y * s;\n\t\tthis._z = axis.z * s;\n\t\tthis._w = Math.cos( halfAngle );\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this quaternion from the given rotation matrix.\n\t *\n\t * @param {Matrix4} m - A 4x4 matrix of which the upper 3x3 of matrix is a pure rotation matrix (i.e. unscaled).\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tsetFromRotationMatrix( m ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tconst te = m.elements,\n\n\t\t\tm11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],\n\t\t\tm21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],\n\t\t\tm31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ],\n\n\t\t\ttrace = m11 + m22 + m33;\n\n\t\tif ( trace > 0 ) {\n\n\t\t\tconst s = 0.5 / Math.sqrt( trace + 1.0 );\n\n\t\t\tthis._w = 0.25 / s;\n\t\t\tthis._x = ( m32 - m23 ) * s;\n\t\t\tthis._y = ( m13 - m31 ) * s;\n\t\t\tthis._z = ( m21 - m12 ) * s;\n\n\t\t} else if ( m11 > m22 && m11 > m33 ) {\n\n\t\t\tconst s = 2.0 * Math.sqrt( 1.0 + m11 - m22 - m33 );\n\n\t\t\tthis._w = ( m32 - m23 ) / s;\n\t\t\tthis._x = 0.25 * s;\n\t\t\tthis._y = ( m12 + m21 ) / s;\n\t\t\tthis._z = ( m13 + m31 ) / s;\n\n\t\t} else if ( m22 > m33 ) {\n\n\t\t\tconst s = 2.0 * Math.sqrt( 1.0 + m22 - m11 - m33 );\n\n\t\t\tthis._w = ( m13 - m31 ) / s;\n\t\t\tthis._x = ( m12 + m21 ) / s;\n\t\t\tthis._y = 0.25 * s;\n\t\t\tthis._z = ( m23 + m32 ) / s;\n\n\t\t} else {\n\n\t\t\tconst s = 2.0 * Math.sqrt( 1.0 + m33 - m11 - m22 );\n\n\t\t\tthis._w = ( m21 - m12 ) / s;\n\t\t\tthis._x = ( m13 + m31 ) / s;\n\t\t\tthis._y = ( m23 + m32 ) / s;\n\t\t\tthis._z = 0.25 * s;\n\n\t\t}\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this quaternion to the rotation required to rotate the direction vector\n\t * `vFrom` to the direction vector `vTo`.\n\t *\n\t * @param {Vector3} vFrom - The first (normalized) direction vector.\n\t * @param {Vector3} vTo - The second (normalized) direction vector.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tsetFromUnitVectors( vFrom, vTo ) {\n\n\t\t// assumes direction vectors vFrom and vTo are normalized\n\n\t\tlet r = vFrom.dot( vTo ) + 1;\n\n\t\tif ( r < 1e-8 ) { // the epsilon value has been discussed in #31286\n\n\t\t\t// vFrom and vTo point in opposite directions\n\n\t\t\tr = 0;\n\n\t\t\tif ( Math.abs( vFrom.x ) > Math.abs( vFrom.z ) ) {\n\n\t\t\t\tthis._x = - vFrom.y;\n\t\t\t\tthis._y = vFrom.x;\n\t\t\t\tthis._z = 0;\n\t\t\t\tthis._w = r;\n\n\t\t\t} else {\n\n\t\t\t\tthis._x = 0;\n\t\t\t\tthis._y = - vFrom.z;\n\t\t\t\tthis._z = vFrom.y;\n\t\t\t\tthis._w = r;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// crossVectors( vFrom, vTo ); // inlined to avoid cyclic dependency on Vector3\n\n\t\t\tthis._x = vFrom.y * vTo.z - vFrom.z * vTo.y;\n\t\t\tthis._y = vFrom.z * vTo.x - vFrom.x * vTo.z;\n\t\t\tthis._z = vFrom.x * vTo.y - vFrom.y * vTo.x;\n\t\t\tthis._w = r;\n\n\t\t}\n\n\t\treturn this.normalize();\n\n\t}\n\n\t/**\n\t * Returns the angle between this quaternion and the given one in radians.\n\t *\n\t * @param {Quaternion} q - The quaternion to compute the angle with.\n\t * @return {number} The angle in radians.\n\t */\n\tangleTo( q ) {\n\n\t\treturn 2 * Math.acos( Math.abs( clamp( this.dot( q ), -1, 1 ) ) );\n\n\t}\n\n\t/**\n\t * Rotates this quaternion by a given angular step to the given quaternion.\n\t * The method ensures that the final quaternion will not overshoot `q`.\n\t *\n\t * @param {Quaternion} q - The target quaternion.\n\t * @param {number} step - The angular step in radians.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\trotateTowards( q, step ) {\n\n\t\tconst angle = this.angleTo( q );\n\n\t\tif ( angle === 0 ) return this;\n\n\t\tconst t = Math.min( 1, step / angle );\n\n\t\tthis.slerp( q, t );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this quaternion to the identity quaternion; that is, to the\n\t * quaternion that represents \"no rotation\".\n\t *\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tidentity() {\n\n\t\treturn this.set( 0, 0, 0, 1 );\n\n\t}\n\n\t/**\n\t * Inverts this quaternion via {@link Quaternion#conjugate}. The\n\t * quaternion is assumed to have unit length.\n\t *\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tinvert() {\n\n\t\treturn this.conjugate();\n\n\t}\n\n\t/**\n\t * Returns the rotational conjugate of this quaternion. The conjugate of a\n\t * quaternion represents the same rotation in the opposite direction about\n\t * the rotational axis.\n\t *\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tconjugate() {\n\n\t\tthis._x *= -1;\n\t\tthis._y *= -1;\n\t\tthis._z *= -1;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Calculates the dot product of this quaternion and the given one.\n\t *\n\t * @param {Quaternion} v - The quaternion to compute the dot product with.\n\t * @return {number} The result of the dot product.\n\t */\n\tdot( v ) {\n\n\t\treturn this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w;\n\n\t}\n\n\t/**\n\t * Computes the squared Euclidean length (straight-line length) of this quaternion,\n\t * considered as a 4 dimensional vector. This can be useful if you are comparing the\n\t * lengths of two quaternions, as this is a slightly more efficient calculation than\n\t * {@link Quaternion#length}.\n\t *\n\t * @return {number} The squared Euclidean length.\n\t */\n\tlengthSq() {\n\n\t\treturn this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w;\n\n\t}\n\n\t/**\n\t * Computes the Euclidean length (straight-line length) of this quaternion,\n\t * considered as a 4 dimensional vector.\n\t *\n\t * @return {number} The Euclidean length.\n\t */\n\tlength() {\n\n\t\treturn Math.sqrt( this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w );\n\n\t}\n\n\t/**\n\t * Normalizes this quaternion - that is, calculated the quaternion that performs\n\t * the same rotation as this one, but has a length equal to `1`.\n\t *\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tnormalize() {\n\n\t\tlet l = this.length();\n\n\t\tif ( l === 0 ) {\n\n\t\t\tthis._x = 0;\n\t\t\tthis._y = 0;\n\t\t\tthis._z = 0;\n\t\t\tthis._w = 1;\n\n\t\t} else {\n\n\t\t\tl = 1 / l;\n\n\t\t\tthis._x = this._x * l;\n\t\t\tthis._y = this._y * l;\n\t\t\tthis._z = this._z * l;\n\t\t\tthis._w = this._w * l;\n\n\t\t}\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies this quaternion by the given one.\n\t *\n\t * @param {Quaternion} q - The quaternion.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tmultiply( q ) {\n\n\t\treturn this.multiplyQuaternions( this, q );\n\n\t}\n\n\t/**\n\t * Pre-multiplies this quaternion by the given one.\n\t *\n\t * @param {Quaternion} q - The quaternion.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tpremultiply( q ) {\n\n\t\treturn this.multiplyQuaternions( q, this );\n\n\t}\n\n\t/**\n\t * Multiplies the given quaternions and stores the result in this instance.\n\t *\n\t * @param {Quaternion} a - The first quaternion.\n\t * @param {Quaternion} b - The second quaternion.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tmultiplyQuaternions( a, b ) {\n\n\t\t// from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm\n\n\t\tconst qax = a._x, qay = a._y, qaz = a._z, qaw = a._w;\n\t\tconst qbx = b._x, qby = b._y, qbz = b._z, qbw = b._w;\n\n\t\tthis._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby;\n\t\tthis._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz;\n\t\tthis._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx;\n\t\tthis._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Performs a spherical linear interpolation between quaternions.\n\t *\n\t * @param {Quaternion} qb - The target quaternion.\n\t * @param {number} t - The interpolation factor in the closed interval `[0, 1]`.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tslerp( qb, t ) {\n\n\t\tif ( t <= 0 ) return this;\n\n\t\tif ( t >= 1 ) return this.copy( qb ); // copy calls _onChangeCallback()\n\n\t\tlet x = qb._x, y = qb._y, z = qb._z, w = qb._w;\n\n\t\tlet dot = this.dot( qb );\n\n\t\tif ( dot < 0 ) {\n\n\t\t\tx = - x;\n\t\t\ty = - y;\n\t\t\tz = - z;\n\t\t\tw = - w;\n\n\t\t\tdot = - dot;\n\n\t\t}\n\n\t\tlet s = 1 - t;\n\n\t\tif ( dot < 0.9995 ) {\n\n\t\t\t// slerp\n\n\t\t\tconst theta = Math.acos( dot );\n\t\t\tconst sin = Math.sin( theta );\n\n\t\t\ts = Math.sin( s * theta ) / sin;\n\t\t\tt = Math.sin( t * theta ) / sin;\n\n\t\t\tthis._x = this._x * s + x * t;\n\t\t\tthis._y = this._y * s + y * t;\n\t\t\tthis._z = this._z * s + z * t;\n\t\t\tthis._w = this._w * s + w * t;\n\n\t\t\tthis._onChangeCallback();\n\n\t\t} else {\n\n\t\t\t// for small angles, lerp then normalize\n\n\t\t\tthis._x = this._x * s + x * t;\n\t\t\tthis._y = this._y * s + y * t;\n\t\t\tthis._z = this._z * s + z * t;\n\t\t\tthis._w = this._w * s + w * t;\n\n\t\t\tthis.normalize(); // normalize calls _onChangeCallback()\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Performs a spherical linear interpolation between the given quaternions\n\t * and stores the result in this quaternion.\n\t *\n\t * @param {Quaternion} qa - The source quaternion.\n\t * @param {Quaternion} qb - The target quaternion.\n\t * @param {number} t - The interpolation factor in the closed interval `[0, 1]`.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tslerpQuaternions( qa, qb, t ) {\n\n\t\treturn this.copy( qa ).slerp( qb, t );\n\n\t}\n\n\t/**\n\t * Sets this quaternion to a uniformly random, normalized quaternion.\n\t *\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\trandom() {\n\n\t\t// Ken Shoemake\n\t\t// Uniform random rotations\n\t\t// D. Kirk, editor, Graphics Gems III, pages 124-132. Academic Press, New York, 1992.\n\n\t\tconst theta1 = 2 * Math.PI * Math.random();\n\t\tconst theta2 = 2 * Math.PI * Math.random();\n\n\t\tconst x0 = Math.random();\n\t\tconst r1 = Math.sqrt( 1 - x0 );\n\t\tconst r2 = Math.sqrt( x0 );\n\n\t\treturn this.set(\n\t\t\tr1 * Math.sin( theta1 ),\n\t\t\tr1 * Math.cos( theta1 ),\n\t\t\tr2 * Math.sin( theta2 ),\n\t\t\tr2 * Math.cos( theta2 ),\n\t\t);\n\n\t}\n\n\t/**\n\t * Returns `true` if this quaternion is equal with the given one.\n\t *\n\t * @param {Quaternion} quaternion - The quaternion to test for equality.\n\t * @return {boolean} Whether this quaternion is equal with the given one.\n\t */\n\tequals( quaternion ) {\n\n\t\treturn ( quaternion._x === this._x ) && ( quaternion._y === this._y ) && ( quaternion._z === this._z ) && ( quaternion._w === this._w );\n\n\t}\n\n\t/**\n\t * Sets this quaternion's components from the given array.\n\t *\n\t * @param {Array<number>} array - An array holding the quaternion component values.\n\t * @param {number} [offset=0] - The offset into the array.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis._x = array[ offset ];\n\t\tthis._y = array[ offset + 1 ];\n\t\tthis._z = array[ offset + 2 ];\n\t\tthis._w = array[ offset + 3 ];\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Writes the components of this quaternion to the given array. If no array is provided,\n\t * the method returns a new instance.\n\t *\n\t * @param {Array<number>} [array=[]] - The target array holding the quaternion components.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Array<number>} The quaternion components.\n\t */\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this._x;\n\t\tarray[ offset + 1 ] = this._y;\n\t\tarray[ offset + 2 ] = this._z;\n\t\tarray[ offset + 3 ] = this._w;\n\n\t\treturn array;\n\n\t}\n\n\t/**\n\t * Sets the components of this quaternion from the given buffer attribute.\n\t *\n\t * @param {BufferAttribute} attribute - The buffer attribute holding quaternion data.\n\t * @param {number} index - The index into the attribute.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tfromBufferAttribute( attribute, index ) {\n\n\t\tthis._x = attribute.getX( index );\n\t\tthis._y = attribute.getY( index );\n\t\tthis._z = attribute.getZ( index );\n\t\tthis._w = attribute.getW( index );\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * This methods defines the serialization result of this class. Returns the\n\t * numerical elements of this quaternion in an array of format `[x, y, z, w]`.\n\t *\n\t * @return {Array<number>} The serialized quaternion.\n\t */\n\ttoJSON() {\n\n\t\treturn this.toArray();\n\n\t}\n\n\t_onChange( callback ) {\n\n\t\tthis._onChangeCallback = callback;\n\n\t\treturn this;\n\n\t}\n\n\t_onChangeCallback() {}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this._x;\n\t\tyield this._y;\n\t\tyield this._z;\n\t\tyield this._w;\n\n\t}\n\n}\n\n/**\n * Class representing a 3D vector. A 3D vector is an ordered triplet of numbers\n * (labeled x, y and z), which can be used to represent a number of things, such as:\n *\n * - A point in 3D space.\n * - A direction and length in 3D space. In three.js the length will\n * always be the Euclidean distance(straight-line distance) from `(0, 0, 0)` to `(x, y, z)`\n * and the direction is also measured from `(0, 0, 0)` towards `(x, y, z)`.\n * - Any arbitrary ordered triplet of numbers.\n *\n * There are other things a 3D vector can be used to represent, such as\n * momentum vectors and so on, however these are the most\n * common uses in three.js.\n *\n * Iterating through a vector instance will yield its components `(x, y, z)` in\n * the corresponding order.\n * ```js\n * const a = new THREE.Vector3( 0, 1, 0 );\n *\n * //no arguments; will be initialised to (0, 0, 0)\n * const b = new THREE.Vector3( );\n *\n * const d = a.distanceTo( b );\n * ```\n */\nclass Vector3 {\n\n\t/**\n\t * Constructs a new 3D vector.\n\t *\n\t * @param {number} [x=0] - The x value of this vector.\n\t * @param {number} [y=0] - The y value of this vector.\n\t * @param {number} [z=0] - The z value of this vector.\n\t */\n\tconstructor( x = 0, y = 0, z = 0 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tVector3.prototype.isVector3 = true;\n\n\t\t/**\n\t\t * The x value of this vector.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.x = x;\n\n\t\t/**\n\t\t * The y value of this vector.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.y = y;\n\n\t\t/**\n\t\t * The z value of this vector.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.z = z;\n\n\t}\n\n\t/**\n\t * Sets the vector components.\n\t *\n\t * @param {number} x - The value of the x component.\n\t * @param {number} y - The value of the y component.\n\t * @param {number} z - The value of the z component.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tset( x, y, z ) {\n\n\t\tif ( z === undefined ) z = this.z; // sprite.scale.set(x,y)\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector components to the same value.\n\t *\n\t * @param {number} scalar - The value to set for all vector components.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetScalar( scalar ) {\n\n\t\tthis.x = scalar;\n\t\tthis.y = scalar;\n\t\tthis.z = scalar;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector's x component to the given value\n\t *\n\t * @param {number} x - The value to set.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetX( x ) {\n\n\t\tthis.x = x;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector's y component to the given value\n\t *\n\t * @param {number} y - The value to set.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetY( y ) {\n\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector's z component to the given value\n\t *\n\t * @param {number} z - The value to set.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetZ( z ) {\n\n\t\tthis.z = z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Allows to set a vector component with an index.\n\t *\n\t * @param {number} index - The component index. `0` equals to x, `1` equals to y, `2` equals to z.\n\t * @param {number} value - The value to set.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetComponent( index, value ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: this.x = value; break;\n\t\t\tcase 1: this.y = value; break;\n\t\t\tcase 2: this.z = value; break;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the value of the vector component which matches the given index.\n\t *\n\t * @param {number} index - The component index. `0` equals to x, `1` equals to y, `2` equals to z.\n\t * @return {number} A vector component value.\n\t */\n\tgetComponent( index ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: return this.x;\n\t\t\tcase 1: return this.y;\n\t\t\tcase 2: return this.z;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns a new vector with copied values from this instance.\n\t *\n\t * @return {Vector3} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor( this.x, this.y, this.z );\n\n\t}\n\n\t/**\n\t * Copies the values of the given vector to this instance.\n\t *\n\t * @param {Vector3} v - The vector to copy.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tcopy( v ) {\n\n\t\tthis.x = v.x;\n\t\tthis.y = v.y;\n\t\tthis.z = v.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given vector to this instance.\n\t *\n\t * @param {Vector3} v - The vector to add.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tadd( v ) {\n\n\t\tthis.x += v.x;\n\t\tthis.y += v.y;\n\t\tthis.z += v.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given scalar value to all components of this instance.\n\t *\n\t * @param {number} s - The scalar to add.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\taddScalar( s ) {\n\n\t\tthis.x += s;\n\t\tthis.y += s;\n\t\tthis.z += s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given vectors and stores the result in this instance.\n\t *\n\t * @param {Vector3} a - The first vector.\n\t * @param {Vector3} b - The second vector.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\taddVectors( a, b ) {\n\n\t\tthis.x = a.x + b.x;\n\t\tthis.y = a.y + b.y;\n\t\tthis.z = a.z + b.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given vector scaled by the given factor to this instance.\n\t *\n\t * @param {Vector3|Vector4} v - The vector.\n\t * @param {number} s - The factor that scales `v`.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\taddScaledVector( v, s ) {\n\n\t\tthis.x += v.x * s;\n\t\tthis.y += v.y * s;\n\t\tthis.z += v.z * s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the given vector from this instance.\n\t *\n\t * @param {Vector3} v - The vector to subtract.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsub( v ) {\n\n\t\tthis.x -= v.x;\n\t\tthis.y -= v.y;\n\t\tthis.z -= v.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the given scalar value from all components of this instance.\n\t *\n\t * @param {number} s - The scalar to subtract.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsubScalar( s ) {\n\n\t\tthis.x -= s;\n\t\tthis.y -= s;\n\t\tthis.z -= s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the given vectors and stores the result in this instance.\n\t *\n\t * @param {Vector3} a - The first vector.\n\t * @param {Vector3} b - The second vector.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsubVectors( a, b ) {\n\n\t\tthis.x = a.x - b.x;\n\t\tthis.y = a.y - b.y;\n\t\tthis.z = a.z - b.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the given vector with this instance.\n\t *\n\t * @param {Vector3} v - The vector to multiply.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tmultiply( v ) {\n\n\t\tthis.x *= v.x;\n\t\tthis.y *= v.y;\n\t\tthis.z *= v.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the given scalar value with all components of this instance.\n\t *\n\t * @param {number} scalar - The scalar to multiply.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tmultiplyScalar( scalar ) {\n\n\t\tthis.x *= scalar;\n\t\tthis.y *= scalar;\n\t\tthis.z *= scalar;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the given vectors and stores the result in this instance.\n\t *\n\t * @param {Vector3} a - The first vector.\n\t * @param {Vector3} b - The second vector.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tmultiplyVectors( a, b ) {\n\n\t\tthis.x = a.x * b.x;\n\t\tthis.y = a.y * b.y;\n\t\tthis.z = a.z * b.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Applies the given Euler rotation to this vector.\n\t *\n\t * @param {Euler} euler - The Euler angles.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tapplyEuler( euler ) {\n\n\t\treturn this.applyQuaternion( _quaternion$4.setFromEuler( euler ) );\n\n\t}\n\n\t/**\n\t * Applies a rotation specified by an axis and an angle to this vector.\n\t *\n\t * @param {Vector3} axis - A normalized vector representing the rotation axis.\n\t * @param {number} angle - The angle in radians.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tapplyAxisAngle( axis, angle ) {\n\n\t\treturn this.applyQuaternion( _quaternion$4.setFromAxisAngle( axis, angle ) );\n\n\t}\n\n\t/**\n\t * Multiplies this vector with the given 3x3 matrix.\n\t *\n\t * @param {Matrix3} m - The 3x3 matrix.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tapplyMatrix3( m ) {\n\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ] * z;\n\t\tthis.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ] * z;\n\t\tthis.z = e[ 2 ] * x + e[ 5 ] * y + e[ 8 ] * z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies this vector by the given normal matrix and normalizes\n\t * the result.\n\t *\n\t * @param {Matrix3} m - The normal matrix.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tapplyNormalMatrix( m ) {\n\n\t\treturn this.applyMatrix3( m ).normalize();\n\n\t}\n\n\t/**\n\t * Multiplies this vector (with an implicit 1 in the 4th dimension) by m, and\n\t * divides by perspective.\n\t *\n\t * @param {Matrix4} m - The matrix to apply.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tapplyMatrix4( m ) {\n\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst e = m.elements;\n\n\t\tconst w = 1 / ( e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] );\n\n\t\tthis.x = ( e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] ) * w;\n\t\tthis.y = ( e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] ) * w;\n\t\tthis.z = ( e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] ) * w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Applies the given Quaternion to this vector.\n\t *\n\t * @param {Quaternion} q - The Quaternion.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tapplyQuaternion( q ) {\n\n\t\t// quaternion q is assumed to have unit length\n\n\t\tconst vx = this.x, vy = this.y, vz = this.z;\n\t\tconst qx = q.x, qy = q.y, qz = q.z, qw = q.w;\n\n\t\t// t = 2 * cross( q.xyz, v );\n\t\tconst tx = 2 * ( qy * vz - qz * vy );\n\t\tconst ty = 2 * ( qz * vx - qx * vz );\n\t\tconst tz = 2 * ( qx * vy - qy * vx );\n\n\t\t// v + q.w * t + cross( q.xyz, t );\n\t\tthis.x = vx + qw * tx + qy * tz - qz * ty;\n\t\tthis.y = vy + qw * ty + qz * tx - qx * tz;\n\t\tthis.z = vz + qw * tz + qx * ty - qy * tx;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Projects this vector from world space into the camera's normalized\n\t * device coordinate (NDC) space.\n\t *\n\t * @param {Camera} camera - The camera.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tproject( camera ) {\n\n\t\treturn this.applyMatrix4( camera.matrixWorldInverse ).applyMatrix4( camera.projectionMatrix );\n\n\t}\n\n\t/**\n\t * Unprojects this vector from the camera's normalized device coordinate (NDC)\n\t * space into world space.\n\t *\n\t * @param {Camera} camera - The camera.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tunproject( camera ) {\n\n\t\treturn this.applyMatrix4( camera.projectionMatrixInverse ).applyMatrix4( camera.matrixWorld );\n\n\t}\n\n\t/**\n\t * Transforms the direction of this vector by a matrix (the upper left 3 x 3\n\t * subset of the given 4x4 matrix and then normalizes the result.\n\t *\n\t * @param {Matrix4} m - The matrix.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\ttransformDirection( m ) {\n\n\t\t// input: THREE.Matrix4 affine matrix\n\t\t// vector interpreted as a direction\n\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z;\n\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z;\n\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z;\n\n\t\treturn this.normalize();\n\n\t}\n\n\t/**\n\t * Divides this instance by the given vector.\n\t *\n\t * @param {Vector3} v - The vector to divide.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tdivide( v ) {\n\n\t\tthis.x /= v.x;\n\t\tthis.y /= v.y;\n\t\tthis.z /= v.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Divides this vector by the given scalar.\n\t *\n\t * @param {number} scalar - The scalar to divide.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tdivideScalar( scalar ) {\n\n\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t}\n\n\t/**\n\t * If this vector's x, y or z value is greater than the given vector's x, y or z\n\t * value, replace that value with the corresponding min value.\n\t *\n\t * @param {Vector3} v - The vector.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tmin( v ) {\n\n\t\tthis.x = Math.min( this.x, v.x );\n\t\tthis.y = Math.min( this.y, v.y );\n\t\tthis.z = Math.min( this.z, v.z );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x, y or z value is less than the given vector's x, y or z\n\t * value, replace that value with the corresponding max value.\n\t *\n\t * @param {Vector3} v - The vector.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tmax( v ) {\n\n\t\tthis.x = Math.max( this.x, v.x );\n\t\tthis.y = Math.max( this.y, v.y );\n\t\tthis.z = Math.max( this.z, v.z );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x, y or z value is greater than the max vector's x, y or z\n\t * value, it is replaced by the corresponding value.\n\t * If this vector's x, y or z value is less than the min vector's x, y or z value,\n\t * it is replaced by the corresponding value.\n\t *\n\t * @param {Vector3} min - The minimum x, y and z values.\n\t * @param {Vector3} max - The maximum x, y and z values in the desired range.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tclamp( min, max ) {\n\n\t\t// assumes min < max, componentwise\n\n\t\tthis.x = clamp( this.x, min.x, max.x );\n\t\tthis.y = clamp( this.y, min.y, max.y );\n\t\tthis.z = clamp( this.z, min.z, max.z );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x, y or z values are greater than the max value, they are\n\t * replaced by the max value.\n\t * If this vector's x, y or z values are less than the min value, they are\n\t * replaced by the min value.\n\t *\n\t * @param {number} minVal - The minimum value the components will be clamped to.\n\t * @param {number} maxVal - The maximum value the components will be clamped to.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tclampScalar( minVal, maxVal ) {\n\n\t\tthis.x = clamp( this.x, minVal, maxVal );\n\t\tthis.y = clamp( this.y, minVal, maxVal );\n\t\tthis.z = clamp( this.z, minVal, maxVal );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's length is greater than the max value, it is replaced by\n\t * the max value.\n\t * If this vector's length is less than the min value, it is replaced by the\n\t * min value.\n\t *\n\t * @param {number} min - The minimum value the vector length will be clamped to.\n\t * @param {number} max - The maximum value the vector length will be clamped to.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tclampLength( min, max ) {\n\n\t\tconst length = this.length();\n\n\t\treturn this.divideScalar( length || 1 ).multiplyScalar( clamp( length, min, max ) );\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded down to the nearest integer value.\n\t *\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tfloor() {\n\n\t\tthis.x = Math.floor( this.x );\n\t\tthis.y = Math.floor( this.y );\n\t\tthis.z = Math.floor( this.z );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded up to the nearest integer value.\n\t *\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tceil() {\n\n\t\tthis.x = Math.ceil( this.x );\n\t\tthis.y = Math.ceil( this.y );\n\t\tthis.z = Math.ceil( this.z );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded to the nearest integer value\n\t *\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tround() {\n\n\t\tthis.x = Math.round( this.x );\n\t\tthis.y = Math.round( this.y );\n\t\tthis.z = Math.round( this.z );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded towards zero (up if negative,\n\t * down if positive) to an integer value.\n\t *\n\t * @return {Vector3} A reference to this vector.\n\t */\n\troundToZero() {\n\n\t\tthis.x = Math.trunc( this.x );\n\t\tthis.y = Math.trunc( this.y );\n\t\tthis.z = Math.trunc( this.z );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Inverts this vector - i.e. sets x = -x, y = -y and z = -z.\n\t *\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tnegate() {\n\n\t\tthis.x = - this.x;\n\t\tthis.y = - this.y;\n\t\tthis.z = - this.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Calculates the dot product of the given vector with this instance.\n\t *\n\t * @param {Vector3} v - The vector to compute the dot product with.\n\t * @return {number} The result of the dot product.\n\t */\n\tdot( v ) {\n\n\t\treturn this.x * v.x + this.y * v.y + this.z * v.z;\n\n\t}\n\n\t// TODO lengthSquared?\n\n\t/**\n\t * Computes the square of the Euclidean length (straight-line length) from\n\t * (0, 0, 0) to (x, y, z). If you are comparing the lengths of vectors, you should\n\t * compare the length squared instead as it is slightly more efficient to calculate.\n\t *\n\t * @return {number} The square length of this vector.\n\t */\n\tlengthSq() {\n\n\t\treturn this.x * this.x + this.y * this.y + this.z * this.z;\n\n\t}\n\n\t/**\n\t * Computes the  Euclidean length (straight-line length) from (0, 0, 0) to (x, y, z).\n\t *\n\t * @return {number} The length of this vector.\n\t */\n\tlength() {\n\n\t\treturn Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z );\n\n\t}\n\n\t/**\n\t * Computes the Manhattan length of this vector.\n\t *\n\t * @return {number} The length of this vector.\n\t */\n\tmanhattanLength() {\n\n\t\treturn Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z );\n\n\t}\n\n\t/**\n\t * Converts this vector to a unit vector - that is, sets it equal to a vector\n\t * with the same direction as this one, but with a vector length of `1`.\n\t *\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tnormalize() {\n\n\t\treturn this.divideScalar( this.length() || 1 );\n\n\t}\n\n\t/**\n\t * Sets this vector to a vector with the same direction as this one, but\n\t * with the specified length.\n\t *\n\t * @param {number} length - The new length of this vector.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetLength( length ) {\n\n\t\treturn this.normalize().multiplyScalar( length );\n\n\t}\n\n\t/**\n\t * Linearly interpolates between the given vector and this instance, where\n\t * alpha is the percent distance along the line - alpha = 0 will be this\n\t * vector, and alpha = 1 will be the given one.\n\t *\n\t * @param {Vector3} v - The vector to interpolate towards.\n\t * @param {number} alpha - The interpolation factor, typically in the closed interval `[0, 1]`.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tlerp( v, alpha ) {\n\n\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\tthis.y += ( v.y - this.y ) * alpha;\n\t\tthis.z += ( v.z - this.z ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Linearly interpolates between the given vectors, where alpha is the percent\n\t * distance along the line - alpha = 0 will be first vector, and alpha = 1 will\n\t * be the second one. The result is stored in this instance.\n\t *\n\t * @param {Vector3} v1 - The first vector.\n\t * @param {Vector3} v2 - The second vector.\n\t * @param {number} alpha - The interpolation factor, typically in the closed interval `[0, 1]`.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tlerpVectors( v1, v2, alpha ) {\n\n\t\tthis.x = v1.x + ( v2.x - v1.x ) * alpha;\n\t\tthis.y = v1.y + ( v2.y - v1.y ) * alpha;\n\t\tthis.z = v1.z + ( v2.z - v1.z ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Calculates the cross product of the given vector with this instance.\n\t *\n\t * @param {Vector3} v - The vector to compute the cross product with.\n\t * @return {Vector3} The result of the cross product.\n\t */\n\tcross( v ) {\n\n\t\treturn this.crossVectors( this, v );\n\n\t}\n\n\t/**\n\t * Calculates the cross product of the given vectors and stores the result\n\t * in this instance.\n\t *\n\t * @param {Vector3} a - The first vector.\n\t * @param {Vector3} b - The second vector.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tcrossVectors( a, b ) {\n\n\t\tconst ax = a.x, ay = a.y, az = a.z;\n\t\tconst bx = b.x, by = b.y, bz = b.z;\n\n\t\tthis.x = ay * bz - az * by;\n\t\tthis.y = az * bx - ax * bz;\n\t\tthis.z = ax * by - ay * bx;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Projects this vector onto the given one.\n\t *\n\t * @param {Vector3} v - The vector to project to.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tprojectOnVector( v ) {\n\n\t\tconst denominator = v.lengthSq();\n\n\t\tif ( denominator === 0 ) return this.set( 0, 0, 0 );\n\n\t\tconst scalar = v.dot( this ) / denominator;\n\n\t\treturn this.copy( v ).multiplyScalar( scalar );\n\n\t}\n\n\t/**\n\t * Projects this vector onto a plane by subtracting this\n\t * vector projected onto the plane's normal from this vector.\n\t *\n\t * @param {Vector3} planeNormal - The plane normal.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tprojectOnPlane( planeNormal ) {\n\n\t\t_vector$c.copy( this ).projectOnVector( planeNormal );\n\n\t\treturn this.sub( _vector$c );\n\n\t}\n\n\t/**\n\t * Reflects this vector off a plane orthogonal to the given normal vector.\n\t *\n\t * @param {Vector3} normal - The (normalized) normal vector.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\treflect( normal ) {\n\n\t\treturn this.sub( _vector$c.copy( normal ).multiplyScalar( 2 * this.dot( normal ) ) );\n\n\t}\n\t/**\n\t * Returns the angle between the given vector and this instance in radians.\n\t *\n\t * @param {Vector3} v - The vector to compute the angle with.\n\t * @return {number} The angle in radians.\n\t */\n\tangleTo( v ) {\n\n\t\tconst denominator = Math.sqrt( this.lengthSq() * v.lengthSq() );\n\n\t\tif ( denominator === 0 ) return Math.PI / 2;\n\n\t\tconst theta = this.dot( v ) / denominator;\n\n\t\t// clamp, to handle numerical problems\n\n\t\treturn Math.acos( clamp( theta, -1, 1 ) );\n\n\t}\n\n\t/**\n\t * Computes the distance from the given vector to this instance.\n\t *\n\t * @param {Vector3} v - The vector to compute the distance to.\n\t * @return {number} The distance.\n\t */\n\tdistanceTo( v ) {\n\n\t\treturn Math.sqrt( this.distanceToSquared( v ) );\n\n\t}\n\n\t/**\n\t * Computes the squared distance from the given vector to this instance.\n\t * If you are just comparing the distance with another distance, you should compare\n\t * the distance squared instead as it is slightly more efficient to calculate.\n\t *\n\t * @param {Vector3} v - The vector to compute the squared distance to.\n\t * @return {number} The squared distance.\n\t */\n\tdistanceToSquared( v ) {\n\n\t\tconst dx = this.x - v.x, dy = this.y - v.y, dz = this.z - v.z;\n\n\t\treturn dx * dx + dy * dy + dz * dz;\n\n\t}\n\n\t/**\n\t * Computes the Manhattan distance from the given vector to this instance.\n\t *\n\t * @param {Vector3} v - The vector to compute the Manhattan distance to.\n\t * @return {number} The Manhattan distance.\n\t */\n\tmanhattanDistanceTo( v ) {\n\n\t\treturn Math.abs( this.x - v.x ) + Math.abs( this.y - v.y ) + Math.abs( this.z - v.z );\n\n\t}\n\n\t/**\n\t * Sets the vector components from the given spherical coordinates.\n\t *\n\t * @param {Spherical} s - The spherical coordinates.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromSpherical( s ) {\n\n\t\treturn this.setFromSphericalCoords( s.radius, s.phi, s.theta );\n\n\t}\n\n\t/**\n\t * Sets the vector components from the given spherical coordinates.\n\t *\n\t * @param {number} radius - The radius.\n\t * @param {number} phi - The phi angle in radians.\n\t * @param {number} theta - The theta angle in radians.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromSphericalCoords( radius, phi, theta ) {\n\n\t\tconst sinPhiRadius = Math.sin( phi ) * radius;\n\n\t\tthis.x = sinPhiRadius * Math.sin( theta );\n\t\tthis.y = Math.cos( phi ) * radius;\n\t\tthis.z = sinPhiRadius * Math.cos( theta );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector components from the given cylindrical coordinates.\n\t *\n\t * @param {Cylindrical} c - The cylindrical coordinates.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromCylindrical( c ) {\n\n\t\treturn this.setFromCylindricalCoords( c.radius, c.theta, c.y );\n\n\t}\n\n\t/**\n\t * Sets the vector components from the given cylindrical coordinates.\n\t *\n\t * @param {number} radius - The radius.\n\t * @param {number} theta - The theta angle in radians.\n\t * @param {number} y - The y value.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromCylindricalCoords( radius, theta, y ) {\n\n\t\tthis.x = radius * Math.sin( theta );\n\t\tthis.y = y;\n\t\tthis.z = radius * Math.cos( theta );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector components to the position elements of the\n\t * given transformation matrix.\n\t *\n\t * @param {Matrix4} m - The 4x4 matrix.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromMatrixPosition( m ) {\n\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 12 ];\n\t\tthis.y = e[ 13 ];\n\t\tthis.z = e[ 14 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector components to the scale elements of the\n\t * given transformation matrix.\n\t *\n\t * @param {Matrix4} m - The 4x4 matrix.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromMatrixScale( m ) {\n\n\t\tconst sx = this.setFromMatrixColumn( m, 0 ).length();\n\t\tconst sy = this.setFromMatrixColumn( m, 1 ).length();\n\t\tconst sz = this.setFromMatrixColumn( m, 2 ).length();\n\n\t\tthis.x = sx;\n\t\tthis.y = sy;\n\t\tthis.z = sz;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector components from the specified matrix column.\n\t *\n\t * @param {Matrix4} m - The 4x4 matrix.\n\t * @param {number} index - The column index.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromMatrixColumn( m, index ) {\n\n\t\treturn this.fromArray( m.elements, index * 4 );\n\n\t}\n\n\t/**\n\t * Sets the vector components from the specified matrix column.\n\t *\n\t * @param {Matrix3} m - The 3x3 matrix.\n\t * @param {number} index - The column index.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromMatrix3Column( m, index ) {\n\n\t\treturn this.fromArray( m.elements, index * 3 );\n\n\t}\n\n\t/**\n\t * Sets the vector components from the given Euler angles.\n\t *\n\t * @param {Euler} e - The Euler angles to set.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromEuler( e ) {\n\n\t\tthis.x = e._x;\n\t\tthis.y = e._y;\n\t\tthis.z = e._z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector components from the RGB components of the\n\t * given color.\n\t *\n\t * @param {Color} c - The color to set.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromColor( c ) {\n\n\t\tthis.x = c.r;\n\t\tthis.y = c.g;\n\t\tthis.z = c.b;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this vector is equal with the given one.\n\t *\n\t * @param {Vector3} v - The vector to test for equality.\n\t * @return {boolean} Whether this vector is equal with the given one.\n\t */\n\tequals( v ) {\n\n\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) );\n\n\t}\n\n\t/**\n\t * Sets this vector's x value to be `array[ offset ]`, y value to be `array[ offset + 1 ]`\n\t * and z value to be `array[ offset + 2 ]`.\n\t *\n\t * @param {Array<number>} array - An array holding the vector component values.\n\t * @param {number} [offset=0] - The offset into the array.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis.x = array[ offset ];\n\t\tthis.y = array[ offset + 1 ];\n\t\tthis.z = array[ offset + 2 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Writes the components of this vector to the given array. If no array is provided,\n\t * the method returns a new instance.\n\t *\n\t * @param {Array<number>} [array=[]] - The target array holding the vector components.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Array<number>} The vector components.\n\t */\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this.x;\n\t\tarray[ offset + 1 ] = this.y;\n\t\tarray[ offset + 2 ] = this.z;\n\n\t\treturn array;\n\n\t}\n\n\t/**\n\t * Sets the components of this vector from the given buffer attribute.\n\t *\n\t * @param {BufferAttribute} attribute - The buffer attribute holding vector data.\n\t * @param {number} index - The index into the attribute.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tfromBufferAttribute( attribute, index ) {\n\n\t\tthis.x = attribute.getX( index );\n\t\tthis.y = attribute.getY( index );\n\t\tthis.z = attribute.getZ( index );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets each component of this vector to a pseudo-random value between `0` and\n\t * `1`, excluding `1`.\n\t *\n\t * @return {Vector3} A reference to this vector.\n\t */\n\trandom() {\n\n\t\tthis.x = Math.random();\n\t\tthis.y = Math.random();\n\t\tthis.z = Math.random();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this vector to a uniformly random point on a unit sphere.\n\t *\n\t * @return {Vector3} A reference to this vector.\n\t */\n\trandomDirection() {\n\n\t\t// https://mathworld.wolfram.com/SpherePointPicking.html\n\n\t\tconst theta = Math.random() * Math.PI * 2;\n\t\tconst u = Math.random() * 2 - 1;\n\t\tconst c = Math.sqrt( 1 - u * u );\n\n\t\tthis.x = c * Math.cos( theta );\n\t\tthis.y = u;\n\t\tthis.z = c * Math.sin( theta );\n\n\t\treturn this;\n\n\t}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this.x;\n\t\tyield this.y;\n\t\tyield this.z;\n\n\t}\n\n}\n\nconst _vector$c = /*@__PURE__*/ new Vector3();\nconst _quaternion$4 = /*@__PURE__*/ new Quaternion();\n\n/**\n * Represents a 3x3 matrix.\n *\n * A Note on Row-Major and Column-Major Ordering:\n *\n * The constructor and {@link Matrix3#set} method take arguments in\n * [row-major](https://en.wikipedia.org/wiki/Row-_and_column-major_order#Column-major_order)\n * order, while internally they are stored in the {@link Matrix3#elements} array in column-major order.\n * This means that calling:\n * ```js\n * const m = new THREE.Matrix();\n * m.set( 11, 12, 13,\n *        21, 22, 23,\n *        31, 32, 33 );\n * ```\n * will result in the elements array containing:\n * ```js\n * m.elements = [ 11, 21, 31,\n *                12, 22, 32,\n *                13, 23, 33 ];\n * ```\n * and internally all calculations are performed using column-major ordering.\n * However, as the actual ordering makes no difference mathematically and\n * most people are used to thinking about matrices in row-major order, the\n * three.js documentation shows matrices in row-major order. Just bear in\n * mind that if you are reading the source code, you'll have to take the\n * transpose of any matrices outlined here to make sense of the calculations.\n */\nclass Matrix3 {\n\n\t/**\n\t * Constructs a new 3x3 matrix. The arguments are supposed to be\n\t * in row-major order. If no arguments are provided, the constructor\n\t * initializes the matrix as an identity matrix.\n\t *\n\t * @param {number} [n11] - 1-1 matrix element.\n\t * @param {number} [n12] - 1-2 matrix element.\n\t * @param {number} [n13] - 1-3 matrix element.\n\t * @param {number} [n21] - 2-1 matrix element.\n\t * @param {number} [n22] - 2-2 matrix element.\n\t * @param {number} [n23] - 2-3 matrix element.\n\t * @param {number} [n31] - 3-1 matrix element.\n\t * @param {number} [n32] - 3-2 matrix element.\n\t * @param {number} [n33] - 3-3 matrix element.\n\t */\n\tconstructor( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tMatrix3.prototype.isMatrix3 = true;\n\n\t\t/**\n\t\t * A column-major list of matrix values.\n\t\t *\n\t\t * @type {Array<number>}\n\t\t */\n\t\tthis.elements = [\n\n\t\t\t1, 0, 0,\n\t\t\t0, 1, 0,\n\t\t\t0, 0, 1\n\n\t\t];\n\n\t\tif ( n11 !== undefined ) {\n\n\t\t\tthis.set( n11, n12, n13, n21, n22, n23, n31, n32, n33 );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the elements of the matrix.The arguments are supposed to be\n\t * in row-major order.\n\t *\n\t * @param {number} [n11] - 1-1 matrix element.\n\t * @param {number} [n12] - 1-2 matrix element.\n\t * @param {number} [n13] - 1-3 matrix element.\n\t * @param {number} [n21] - 2-1 matrix element.\n\t * @param {number} [n22] - 2-2 matrix element.\n\t * @param {number} [n23] - 2-3 matrix element.\n\t * @param {number} [n31] - 3-1 matrix element.\n\t * @param {number} [n32] - 3-2 matrix element.\n\t * @param {number} [n33] - 3-3 matrix element.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tset( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] = n11; te[ 1 ] = n21; te[ 2 ] = n31;\n\t\tte[ 3 ] = n12; te[ 4 ] = n22; te[ 5 ] = n32;\n\t\tte[ 6 ] = n13; te[ 7 ] = n23; te[ 8 ] = n33;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix to the 3x3 identity matrix.\n\t *\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tidentity() {\n\n\t\tthis.set(\n\n\t\t\t1, 0, 0,\n\t\t\t0, 1, 0,\n\t\t\t0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the values of the given matrix to this instance.\n\t *\n\t * @param {Matrix3} m - The matrix to copy.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tcopy( m ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = m.elements;\n\n\t\tte[ 0 ] = me[ 0 ]; te[ 1 ] = me[ 1 ]; te[ 2 ] = me[ 2 ];\n\t\tte[ 3 ] = me[ 3 ]; te[ 4 ] = me[ 4 ]; te[ 5 ] = me[ 5 ];\n\t\tte[ 6 ] = me[ 6 ]; te[ 7 ] = me[ 7 ]; te[ 8 ] = me[ 8 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Extracts the basis of this matrix into the three axis vectors provided.\n\t *\n\t * @param {Vector3} xAxis - The basis's x axis.\n\t * @param {Vector3} yAxis - The basis's y axis.\n\t * @param {Vector3} zAxis - The basis's z axis.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\textractBasis( xAxis, yAxis, zAxis ) {\n\n\t\txAxis.setFromMatrix3Column( this, 0 );\n\t\tyAxis.setFromMatrix3Column( this, 1 );\n\t\tzAxis.setFromMatrix3Column( this, 2 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Set this matrix to the upper 3x3 matrix of the given 4x4 matrix.\n\t *\n\t * @param {Matrix4} m - The 4x4 matrix.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tsetFromMatrix4( m ) {\n\n\t\tconst me = m.elements;\n\n\t\tthis.set(\n\n\t\t\tme[ 0 ], me[ 4 ], me[ 8 ],\n\t\t\tme[ 1 ], me[ 5 ], me[ 9 ],\n\t\t\tme[ 2 ], me[ 6 ], me[ 10 ]\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Post-multiplies this matrix by the given 3x3 matrix.\n\t *\n\t * @param {Matrix3} m - The matrix to multiply with.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tmultiply( m ) {\n\n\t\treturn this.multiplyMatrices( this, m );\n\n\t}\n\n\t/**\n\t * Pre-multiplies this matrix by the given 3x3 matrix.\n\t *\n\t * @param {Matrix3} m - The matrix to multiply with.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tpremultiply( m ) {\n\n\t\treturn this.multiplyMatrices( m, this );\n\n\t}\n\n\t/**\n\t * Multiples the given 3x3 matrices and stores the result\n\t * in this matrix.\n\t *\n\t * @param {Matrix3} a - The first matrix.\n\t * @param {Matrix3} b - The second matrix.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tmultiplyMatrices( a, b ) {\n\n\t\tconst ae = a.elements;\n\t\tconst be = b.elements;\n\t\tconst te = this.elements;\n\n\t\tconst a11 = ae[ 0 ], a12 = ae[ 3 ], a13 = ae[ 6 ];\n\t\tconst a21 = ae[ 1 ], a22 = ae[ 4 ], a23 = ae[ 7 ];\n\t\tconst a31 = ae[ 2 ], a32 = ae[ 5 ], a33 = ae[ 8 ];\n\n\t\tconst b11 = be[ 0 ], b12 = be[ 3 ], b13 = be[ 6 ];\n\t\tconst b21 = be[ 1 ], b22 = be[ 4 ], b23 = be[ 7 ];\n\t\tconst b31 = be[ 2 ], b32 = be[ 5 ], b33 = be[ 8 ];\n\n\t\tte[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31;\n\t\tte[ 3 ] = a11 * b12 + a12 * b22 + a13 * b32;\n\t\tte[ 6 ] = a11 * b13 + a12 * b23 + a13 * b33;\n\n\t\tte[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31;\n\t\tte[ 4 ] = a21 * b12 + a22 * b22 + a23 * b32;\n\t\tte[ 7 ] = a21 * b13 + a22 * b23 + a23 * b33;\n\n\t\tte[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31;\n\t\tte[ 5 ] = a31 * b12 + a32 * b22 + a33 * b32;\n\t\tte[ 8 ] = a31 * b13 + a32 * b23 + a33 * b33;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies every component of the matrix by the given scalar.\n\t *\n\t * @param {number} s - The scalar.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tmultiplyScalar( s ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] *= s; te[ 3 ] *= s; te[ 6 ] *= s;\n\t\tte[ 1 ] *= s; te[ 4 ] *= s; te[ 7 ] *= s;\n\t\tte[ 2 ] *= s; te[ 5 ] *= s; te[ 8 ] *= s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes and returns the determinant of this matrix.\n\t *\n\t * @return {number} The determinant.\n\t */\n\tdeterminant() {\n\n\t\tconst te = this.elements;\n\n\t\tconst a = te[ 0 ], b = te[ 1 ], c = te[ 2 ],\n\t\t\td = te[ 3 ], e = te[ 4 ], f = te[ 5 ],\n\t\t\tg = te[ 6 ], h = te[ 7 ], i = te[ 8 ];\n\n\t\treturn a * e * i - a * f * h - b * d * i + b * f * g + c * d * h - c * e * g;\n\n\t}\n\n\t/**\n\t * Inverts this matrix, using the [analytic method](https://en.wikipedia.org/wiki/Invertible_matrix#Analytic_solution).\n\t * You can not invert with a determinant of zero. If you attempt this, the method produces\n\t * a zero matrix instead.\n\t *\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tinvert() {\n\n\t\tconst te = this.elements,\n\n\t\t\tn11 = te[ 0 ], n21 = te[ 1 ], n31 = te[ 2 ],\n\t\t\tn12 = te[ 3 ], n22 = te[ 4 ], n32 = te[ 5 ],\n\t\t\tn13 = te[ 6 ], n23 = te[ 7 ], n33 = te[ 8 ],\n\n\t\t\tt11 = n33 * n22 - n32 * n23,\n\t\t\tt12 = n32 * n13 - n33 * n12,\n\t\t\tt13 = n23 * n12 - n22 * n13,\n\n\t\t\tdet = n11 * t11 + n21 * t12 + n31 * t13;\n\n\t\tif ( det === 0 ) return this.set( 0, 0, 0, 0, 0, 0, 0, 0, 0 );\n\n\t\tconst detInv = 1 / det;\n\n\t\tte[ 0 ] = t11 * detInv;\n\t\tte[ 1 ] = ( n31 * n23 - n33 * n21 ) * detInv;\n\t\tte[ 2 ] = ( n32 * n21 - n31 * n22 ) * detInv;\n\n\t\tte[ 3 ] = t12 * detInv;\n\t\tte[ 4 ] = ( n33 * n11 - n31 * n13 ) * detInv;\n\t\tte[ 5 ] = ( n31 * n12 - n32 * n11 ) * detInv;\n\n\t\tte[ 6 ] = t13 * detInv;\n\t\tte[ 7 ] = ( n21 * n13 - n23 * n11 ) * detInv;\n\t\tte[ 8 ] = ( n22 * n11 - n21 * n12 ) * detInv;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Transposes this matrix in place.\n\t *\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\ttranspose() {\n\n\t\tlet tmp;\n\t\tconst m = this.elements;\n\n\t\ttmp = m[ 1 ]; m[ 1 ] = m[ 3 ]; m[ 3 ] = tmp;\n\t\ttmp = m[ 2 ]; m[ 2 ] = m[ 6 ]; m[ 6 ] = tmp;\n\t\ttmp = m[ 5 ]; m[ 5 ] = m[ 7 ]; m[ 7 ] = tmp;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes the normal matrix which is the inverse transpose of the upper\n\t * left 3x3 portion of the given 4x4 matrix.\n\t *\n\t * @param {Matrix4} matrix4 - The 4x4 matrix.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tgetNormalMatrix( matrix4 ) {\n\n\t\treturn this.setFromMatrix4( matrix4 ).invert().transpose();\n\n\t}\n\n\t/**\n\t * Transposes this matrix into the supplied array, and returns itself unchanged.\n\t *\n\t * @param {Array<number>} r - An array to store the transposed matrix elements.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\ttransposeIntoArray( r ) {\n\n\t\tconst m = this.elements;\n\n\t\tr[ 0 ] = m[ 0 ];\n\t\tr[ 1 ] = m[ 3 ];\n\t\tr[ 2 ] = m[ 6 ];\n\t\tr[ 3 ] = m[ 1 ];\n\t\tr[ 4 ] = m[ 4 ];\n\t\tr[ 5 ] = m[ 7 ];\n\t\tr[ 6 ] = m[ 2 ];\n\t\tr[ 7 ] = m[ 5 ];\n\t\tr[ 8 ] = m[ 8 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the UV transform matrix from offset, repeat, rotation, and center.\n\t *\n\t * @param {number} tx - Offset x.\n\t * @param {number} ty - Offset y.\n\t * @param {number} sx - Repeat x.\n\t * @param {number} sy - Repeat y.\n\t * @param {number} rotation - Rotation, in radians. Positive values rotate counterclockwise.\n\t * @param {number} cx - Center x of rotation.\n\t * @param {number} cy - Center y of rotation\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tsetUvTransform( tx, ty, sx, sy, rotation, cx, cy ) {\n\n\t\tconst c = Math.cos( rotation );\n\t\tconst s = Math.sin( rotation );\n\n\t\tthis.set(\n\t\t\tsx * c, sx * s, - sx * ( c * cx + s * cy ) + cx + tx,\n\t\t\t- sy * s, sy * c, - sy * ( - s * cx + c * cy ) + cy + ty,\n\t\t\t0, 0, 1\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Scales this matrix with the given scalar values.\n\t *\n\t * @param {number} sx - The amount to scale in the X axis.\n\t * @param {number} sy - The amount to scale in the Y axis.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tscale( sx, sy ) {\n\n\t\tthis.premultiply( _m3.makeScale( sx, sy ) );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Rotates this matrix by the given angle.\n\t *\n\t * @param {number} theta - The rotation in radians.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\trotate( theta ) {\n\n\t\tthis.premultiply( _m3.makeRotation( - theta ) );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Translates this matrix by the given scalar values.\n\t *\n\t * @param {number} tx - The amount to translate in the X axis.\n\t * @param {number} ty - The amount to translate in the Y axis.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\ttranslate( tx, ty ) {\n\n\t\tthis.premultiply( _m3.makeTranslation( tx, ty ) );\n\n\t\treturn this;\n\n\t}\n\n\t// for 2D Transforms\n\n\t/**\n\t * Sets this matrix as a 2D translation transform.\n\t *\n\t * @param {number|Vector2} x - The amount to translate in the X axis or alternatively a translation vector.\n\t * @param {number} y - The amount to translate in the Y axis.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tmakeTranslation( x, y ) {\n\n\t\tif ( x.isVector2 ) {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, x.x,\n\t\t\t\t0, 1, x.y,\n\t\t\t\t0, 0, 1\n\n\t\t\t);\n\n\t\t} else {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, x,\n\t\t\t\t0, 1, y,\n\t\t\t\t0, 0, 1\n\n\t\t\t);\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix as a 2D rotational transformation.\n\t *\n\t * @param {number} theta - The rotation in radians.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tmakeRotation( theta ) {\n\n\t\t// counterclockwise\n\n\t\tconst c = Math.cos( theta );\n\t\tconst s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\tc, - s, 0,\n\t\t\ts, c, 0,\n\t\t\t0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix as a 2D scale transform.\n\t *\n\t * @param {number} x - The amount to scale in the X axis.\n\t * @param {number} y - The amount to scale in the Y axis.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tmakeScale( x, y ) {\n\n\t\tthis.set(\n\n\t\t\tx, 0, 0,\n\t\t\t0, y, 0,\n\t\t\t0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this matrix is equal with the given one.\n\t *\n\t * @param {Matrix3} matrix - The matrix to test for equality.\n\t * @return {boolean} Whether this matrix is equal with the given one.\n\t */\n\tequals( matrix ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = matrix.elements;\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tif ( te[ i ] !== me[ i ] ) return false;\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\t/**\n\t * Sets the elements of the matrix from the given array.\n\t *\n\t * @param {Array<number>} array - The matrix elements in column-major order.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tfromArray( array, offset = 0 ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Writes the elements of this matrix to the given array. If no array is provided,\n\t * the method returns a new instance.\n\t *\n\t * @param {Array<number>} [array=[]] - The target array holding the matrix elements in column-major order.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Array<number>} The matrix elements in column-major order.\n\t */\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tconst te = this.elements;\n\n\t\tarray[ offset ] = te[ 0 ];\n\t\tarray[ offset + 1 ] = te[ 1 ];\n\t\tarray[ offset + 2 ] = te[ 2 ];\n\n\t\tarray[ offset + 3 ] = te[ 3 ];\n\t\tarray[ offset + 4 ] = te[ 4 ];\n\t\tarray[ offset + 5 ] = te[ 5 ];\n\n\t\tarray[ offset + 6 ] = te[ 6 ];\n\t\tarray[ offset + 7 ] = te[ 7 ];\n\t\tarray[ offset + 8 ] = te[ 8 ];\n\n\t\treturn array;\n\n\t}\n\n\t/**\n\t * Returns a matrix with copied values from this instance.\n\t *\n\t * @return {Matrix3} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().fromArray( this.elements );\n\n\t}\n\n}\n\nconst _m3 = /*@__PURE__*/ new Matrix3();\n\nconst LINEAR_REC709_TO_XYZ = /*@__PURE__*/ new Matrix3().set(\n\t0.4123908, 0.3575843, 0.1804808,\n\t0.2126390, 0.7151687, 0.0721923,\n\t0.0193308, 0.1191948, 0.9505322\n);\n\nconst XYZ_TO_LINEAR_REC709 = /*@__PURE__*/ new Matrix3().set(\n\t3.2409699, -1.5373832, -0.4986108,\n\t-0.9692436, 1.8759675, 0.0415551,\n\t0.0556301, -0.203977, 1.0569715\n);\n\nfunction createColorManagement() {\n\n\tconst ColorManagement = {\n\n\t\tenabled: true,\n\n\t\tworkingColorSpace: LinearSRGBColorSpace,\n\n\t\t/**\n\t\t * Implementations of supported color spaces.\n\t\t *\n\t\t * Required:\n\t\t *\t- primaries: chromaticity coordinates [ rx ry gx gy bx by ]\n\t\t *\t- whitePoint: reference white [ x y ]\n\t\t *\t- transfer: transfer function (pre-defined)\n\t\t *\t- toXYZ: Matrix3 RGB to XYZ transform\n\t\t *\t- fromXYZ: Matrix3 XYZ to RGB transform\n\t\t *\t- luminanceCoefficients: RGB luminance coefficients\n\t\t *\n\t\t * Optional:\n\t\t *  - outputColorSpaceConfig: { drawingBufferColorSpace: ColorSpace, toneMappingMode: 'extended' | 'standard' }\n\t\t *  - workingColorSpaceConfig: { unpackColorSpace: ColorSpace }\n\t\t *\n\t\t * Reference:\n\t\t * - https://www.russellcottrell.com/photo/matrixCalculator.htm\n\t\t */\n\t\tspaces: {},\n\n\t\tconvert: function ( color, sourceColorSpace, targetColorSpace ) {\n\n\t\t\tif ( this.enabled === false || sourceColorSpace === targetColorSpace || ! sourceColorSpace || ! targetColorSpace ) {\n\n\t\t\t\treturn color;\n\n\t\t\t}\n\n\t\t\tif ( this.spaces[ sourceColorSpace ].transfer === SRGBTransfer ) {\n\n\t\t\t\tcolor.r = SRGBToLinear( color.r );\n\t\t\t\tcolor.g = SRGBToLinear( color.g );\n\t\t\t\tcolor.b = SRGBToLinear( color.b );\n\n\t\t\t}\n\n\t\t\tif ( this.spaces[ sourceColorSpace ].primaries !== this.spaces[ targetColorSpace ].primaries ) {\n\n\t\t\t\tcolor.applyMatrix3( this.spaces[ sourceColorSpace ].toXYZ );\n\t\t\t\tcolor.applyMatrix3( this.spaces[ targetColorSpace ].fromXYZ );\n\n\t\t\t}\n\n\t\t\tif ( this.spaces[ targetColorSpace ].transfer === SRGBTransfer ) {\n\n\t\t\t\tcolor.r = LinearToSRGB( color.r );\n\t\t\t\tcolor.g = LinearToSRGB( color.g );\n\t\t\t\tcolor.b = LinearToSRGB( color.b );\n\n\t\t\t}\n\n\t\t\treturn color;\n\n\t\t},\n\n\t\tworkingToColorSpace: function ( color, targetColorSpace ) {\n\n\t\t\treturn this.convert( color, this.workingColorSpace, targetColorSpace );\n\n\t\t},\n\n\t\tcolorSpaceToWorking: function ( color, sourceColorSpace ) {\n\n\t\t\treturn this.convert( color, sourceColorSpace, this.workingColorSpace );\n\n\t\t},\n\n\t\tgetPrimaries: function ( colorSpace ) {\n\n\t\t\treturn this.spaces[ colorSpace ].primaries;\n\n\t\t},\n\n\t\tgetTransfer: function ( colorSpace ) {\n\n\t\t\tif ( colorSpace === NoColorSpace ) return LinearTransfer;\n\n\t\t\treturn this.spaces[ colorSpace ].transfer;\n\n\t\t},\n\n\t\tgetToneMappingMode: function ( colorSpace ) {\n\n\t\t\treturn this.spaces[ colorSpace ].outputColorSpaceConfig.toneMappingMode || 'standard';\n\n\t\t},\n\n\t\tgetLuminanceCoefficients: function ( target, colorSpace = this.workingColorSpace ) {\n\n\t\t\treturn target.fromArray( this.spaces[ colorSpace ].luminanceCoefficients );\n\n\t\t},\n\n\t\tdefine: function ( colorSpaces ) {\n\n\t\t\tObject.assign( this.spaces, colorSpaces );\n\n\t\t},\n\n\t\t// Internal APIs\n\n\t\t_getMatrix: function ( targetMatrix, sourceColorSpace, targetColorSpace ) {\n\n\t\t\treturn targetMatrix\n\t\t\t\t.copy( this.spaces[ sourceColorSpace ].toXYZ )\n\t\t\t\t.multiply( this.spaces[ targetColorSpace ].fromXYZ );\n\n\t\t},\n\n\t\t_getDrawingBufferColorSpace: function ( colorSpace ) {\n\n\t\t\treturn this.spaces[ colorSpace ].outputColorSpaceConfig.drawingBufferColorSpace;\n\n\t\t},\n\n\t\t_getUnpackColorSpace: function ( colorSpace = this.workingColorSpace ) {\n\n\t\t\treturn this.spaces[ colorSpace ].workingColorSpaceConfig.unpackColorSpace;\n\n\t\t},\n\n\t\t// Deprecated\n\n\t\tfromWorkingColorSpace: function ( color, targetColorSpace ) {\n\n\t\t\twarnOnce( 'ColorManagement: .fromWorkingColorSpace() has been renamed to .workingToColorSpace().' ); // @deprecated, r177\n\n\t\t\treturn ColorManagement.workingToColorSpace( color, targetColorSpace );\n\n\t\t},\n\n\t\ttoWorkingColorSpace: function ( color, sourceColorSpace ) {\n\n\t\t\twarnOnce( 'ColorManagement: .toWorkingColorSpace() has been renamed to .colorSpaceToWorking().' ); // @deprecated, r177\n\n\t\t\treturn ColorManagement.colorSpaceToWorking( color, sourceColorSpace );\n\n\t\t},\n\n\t};\n\n\t/******************************************************************************\n\t * sRGB definitions\n\t */\n\n\tconst REC709_PRIMARIES = [ 0.640, 0.330, 0.300, 0.600, 0.150, 0.060 ];\n\tconst REC709_LUMINANCE_COEFFICIENTS = [ 0.2126, 0.7152, 0.0722 ];\n\tconst D65 = [ 0.3127, 0.3290 ];\n\n\tColorManagement.define( {\n\n\t\t[ LinearSRGBColorSpace ]: {\n\t\t\tprimaries: REC709_PRIMARIES,\n\t\t\twhitePoint: D65,\n\t\t\ttransfer: LinearTransfer,\n\t\t\ttoXYZ: LINEAR_REC709_TO_XYZ,\n\t\t\tfromXYZ: XYZ_TO_LINEAR_REC709,\n\t\t\tluminanceCoefficients: REC709_LUMINANCE_COEFFICIENTS,\n\t\t\tworkingColorSpaceConfig: { unpackColorSpace: SRGBColorSpace },\n\t\t\toutputColorSpaceConfig: { drawingBufferColorSpace: SRGBColorSpace }\n\t\t},\n\n\t\t[ SRGBColorSpace ]: {\n\t\t\tprimaries: REC709_PRIMARIES,\n\t\t\twhitePoint: D65,\n\t\t\ttransfer: SRGBTransfer,\n\t\t\ttoXYZ: LINEAR_REC709_TO_XYZ,\n\t\t\tfromXYZ: XYZ_TO_LINEAR_REC709,\n\t\t\tluminanceCoefficients: REC709_LUMINANCE_COEFFICIENTS,\n\t\t\toutputColorSpaceConfig: { drawingBufferColorSpace: SRGBColorSpace }\n\t\t},\n\n\t} );\n\n\treturn ColorManagement;\n\n}\n\nconst ColorManagement = /*@__PURE__*/ createColorManagement();\n\nfunction SRGBToLinear( c ) {\n\n\treturn ( c < 0.04045 ) ? c * 0.0773993808 : Math.pow( c * 0.9478672986 + 0.0521327014, 2.4 );\n\n}\n\nfunction LinearToSRGB( c ) {\n\n\treturn ( c < 0.0031308 ) ? c * 12.92 : 1.055 * ( Math.pow( c, 0.41666 ) ) - 0.055;\n\n}\n\nlet _canvas;\n\n/**\n * A class containing utility functions for images.\n *\n * @hideconstructor\n */\nclass ImageUtils {\n\n\t/**\n\t * Returns a data URI containing a representation of the given image.\n\t *\n\t * @param {(HTMLImageElement|HTMLCanvasElement)} image - The image object.\n\t * @param {string} [type='image/png'] - Indicates the image format.\n\t * @return {string} The data URI.\n\t */\n\tstatic getDataURL( image, type = 'image/png' ) {\n\n\t\tif ( /^data:/i.test( image.src ) ) {\n\n\t\t\treturn image.src;\n\n\t\t}\n\n\t\tif ( typeof HTMLCanvasElement === 'undefined' ) {\n\n\t\t\treturn image.src;\n\n\t\t}\n\n\t\tlet canvas;\n\n\t\tif ( image instanceof HTMLCanvasElement ) {\n\n\t\t\tcanvas = image;\n\n\t\t} else {\n\n\t\t\tif ( _canvas === undefined ) _canvas = createElementNS( 'canvas' );\n\n\t\t\t_canvas.width = image.width;\n\t\t\t_canvas.height = image.height;\n\n\t\t\tconst context = _canvas.getContext( '2d' );\n\n\t\t\tif ( image instanceof ImageData ) {\n\n\t\t\t\tcontext.putImageData( image, 0, 0 );\n\n\t\t\t} else {\n\n\t\t\t\tcontext.drawImage( image, 0, 0, image.width, image.height );\n\n\t\t\t}\n\n\t\t\tcanvas = _canvas;\n\n\t\t}\n\n\t\treturn canvas.toDataURL( type );\n\n\t}\n\n\t/**\n\t * Converts the given sRGB image data to linear color space.\n\t *\n\t * @param {(HTMLImageElement|HTMLCanvasElement|ImageBitmap|Object)} image - The image object.\n\t * @return {HTMLCanvasElement|Object} The converted image.\n\t */\n\tstatic sRGBToLinear( image ) {\n\n\t\tif ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) ||\n\t\t\t( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) ||\n\t\t\t( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ) {\n\n\t\t\tconst canvas = createElementNS( 'canvas' );\n\n\t\t\tcanvas.width = image.width;\n\t\t\tcanvas.height = image.height;\n\n\t\t\tconst context = canvas.getContext( '2d' );\n\t\t\tcontext.drawImage( image, 0, 0, image.width, image.height );\n\n\t\t\tconst imageData = context.getImageData( 0, 0, image.width, image.height );\n\t\t\tconst data = imageData.data;\n\n\t\t\tfor ( let i = 0; i < data.length; i ++ ) {\n\n\t\t\t\tdata[ i ] = SRGBToLinear( data[ i ] / 255 ) * 255;\n\n\t\t\t}\n\n\t\t\tcontext.putImageData( imageData, 0, 0 );\n\n\t\t\treturn canvas;\n\n\t\t} else if ( image.data ) {\n\n\t\t\tconst data = image.data.slice( 0 );\n\n\t\t\tfor ( let i = 0; i < data.length; i ++ ) {\n\n\t\t\t\tif ( data instanceof Uint8Array || data instanceof Uint8ClampedArray ) {\n\n\t\t\t\t\tdata[ i ] = Math.floor( SRGBToLinear( data[ i ] / 255 ) * 255 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// assuming float\n\n\t\t\t\t\tdata[ i ] = SRGBToLinear( data[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tdata: data,\n\t\t\t\twidth: image.width,\n\t\t\t\theight: image.height\n\t\t\t};\n\n\t\t} else {\n\n\t\t\twarn( 'ImageUtils.sRGBToLinear(): Unsupported image type. No color space conversion applied.' );\n\t\t\treturn image;\n\n\t\t}\n\n\t}\n\n}\n\nlet _sourceId = 0;\n\n/**\n * Represents the data source of a texture.\n *\n * The main purpose of this class is to decouple the data definition from the texture\n * definition so the same data can be used with multiple texture instances.\n */\nclass Source {\n\n\t/**\n\t * Constructs a new video texture.\n\t *\n\t * @param {any} [data=null] - The data definition of a texture.\n\t */\n\tconstructor( data = null ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSource = true;\n\n\t\t/**\n\t\t * The ID of the source.\n\t\t *\n\t\t * @name Source#id\n\t\t * @type {number}\n\t\t * @readonly\n\t\t */\n\t\tObject.defineProperty( this, 'id', { value: _sourceId ++ } );\n\n\t\t/**\n\t\t * The UUID of the source.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.uuid = generateUUID();\n\n\t\t/**\n\t\t * The data definition of a texture.\n\t\t *\n\t\t * @type {any}\n\t\t */\n\t\tthis.data = data;\n\n\t\t/**\n\t\t * This property is only relevant when {@link Source#needsUpdate} is set to `true` and\n\t\t * provides more control on how texture data should be processed. When `dataReady` is set\n\t\t * to `false`, the engine performs the memory allocation (if necessary) but does not transfer\n\t\t * the data into the GPU memory.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.dataReady = true;\n\n\t\t/**\n\t\t * This starts at `0` and counts how many times {@link Source#needsUpdate} is set to `true`.\n\t\t *\n\t\t * @type {number}\n\t\t * @readonly\n\t\t * @default 0\n\t\t */\n\t\tthis.version = 0;\n\n\t}\n\n\t/**\n\t * Returns the dimensions of the source into the given target vector.\n\t *\n\t * @param {(Vector2|Vector3)} target - The target object the result is written into.\n\t * @return {(Vector2|Vector3)} The dimensions of the source.\n\t */\n\tgetSize( target ) {\n\n\t\tconst data = this.data;\n\n\t\tif ( ( typeof HTMLVideoElement !== 'undefined' ) && ( data instanceof HTMLVideoElement ) ) {\n\n\t\t\ttarget.set( data.videoWidth, data.videoHeight, 0 );\n\n\t\t} else if ( data instanceof VideoFrame ) {\n\n\t\t\ttarget.set( data.displayHeight, data.displayWidth, 0 );\n\n\t\t} else if ( data !== null ) {\n\n\t\t\ttarget.set( data.width, data.height, data.depth || 0 );\n\n\t\t} else {\n\n\t\t\ttarget.set( 0, 0, 0 );\n\n\t\t}\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * When the property is set to `true`, the engine allocates the memory\n\t * for the texture (if necessary) and triggers the actual texture upload\n\t * to the GPU next time the source is used.\n\t *\n\t * @type {boolean}\n\t * @default false\n\t * @param {boolean} value\n\t */\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n\t/**\n\t * Serializes the source into JSON.\n\t *\n\t * @param {?(Object|string)} meta - An optional value holding meta information about the serialization.\n\t * @return {Object} A JSON object representing the serialized source.\n\t * @see {@link ObjectLoader#parse}\n\t */\n\ttoJSON( meta ) {\n\n\t\tconst isRootObject = ( meta === undefined || typeof meta === 'string' );\n\n\t\tif ( ! isRootObject && meta.images[ this.uuid ] !== undefined ) {\n\n\t\t\treturn meta.images[ this.uuid ];\n\n\t\t}\n\n\t\tconst output = {\n\t\t\tuuid: this.uuid,\n\t\t\turl: ''\n\t\t};\n\n\t\tconst data = this.data;\n\n\t\tif ( data !== null ) {\n\n\t\t\tlet url;\n\n\t\t\tif ( Array.isArray( data ) ) {\n\n\t\t\t\t// cube texture\n\n\t\t\t\turl = [];\n\n\t\t\t\tfor ( let i = 0, l = data.length; i < l; i ++ ) {\n\n\t\t\t\t\tif ( data[ i ].isDataTexture ) {\n\n\t\t\t\t\t\turl.push( serializeImage( data[ i ].image ) );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\turl.push( serializeImage( data[ i ] ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// texture\n\n\t\t\t\turl = serializeImage( data );\n\n\t\t\t}\n\n\t\t\toutput.url = url;\n\n\t\t}\n\n\t\tif ( ! isRootObject ) {\n\n\t\t\tmeta.images[ this.uuid ] = output;\n\n\t\t}\n\n\t\treturn output;\n\n\t}\n\n}\n\nfunction serializeImage( image ) {\n\n\tif ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) ||\n\t\t( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) ||\n\t\t( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ) {\n\n\t\t// default images\n\n\t\treturn ImageUtils.getDataURL( image );\n\n\t} else {\n\n\t\tif ( image.data ) {\n\n\t\t\t// images of DataTexture\n\n\t\t\treturn {\n\t\t\t\tdata: Array.from( image.data ),\n\t\t\t\twidth: image.width,\n\t\t\t\theight: image.height,\n\t\t\t\ttype: image.data.constructor.name\n\t\t\t};\n\n\t\t} else {\n\n\t\t\twarn( 'Texture: Unable to serialize Texture.' );\n\t\t\treturn {};\n\n\t\t}\n\n\t}\n\n}\n\nlet _textureId = 0;\n\nconst _tempVec3 = /*@__PURE__*/ new Vector3();\n\n/**\n * Base class for all textures.\n *\n * Note: After the initial use of a texture, its dimensions, format, and type\n * cannot be changed. Instead, call {@link Texture#dispose} on the texture and instantiate a new one.\n *\n * @augments EventDispatcher\n */\nclass Texture extends EventDispatcher {\n\n\t/**\n\t * Constructs a new texture.\n\t *\n\t * @param {?Object} [image=Texture.DEFAULT_IMAGE] - The image holding the texture data.\n\t * @param {number} [mapping=Texture.DEFAULT_MAPPING] - The texture mapping.\n\t * @param {number} [wrapS=ClampToEdgeWrapping] - The wrapS value.\n\t * @param {number} [wrapT=ClampToEdgeWrapping] - The wrapT value.\n\t * @param {number} [magFilter=LinearFilter] - The mag filter value.\n\t * @param {number} [minFilter=LinearMipmapLinearFilter] - The min filter value.\n\t * @param {number} [format=RGBAFormat] - The texture format.\n\t * @param {number} [type=UnsignedByteType] - The texture type.\n\t * @param {number} [anisotropy=Texture.DEFAULT_ANISOTROPY] - The anisotropy value.\n\t * @param {string} [colorSpace=NoColorSpace] - The color space.\n\t */\n\tconstructor( image = Texture.DEFAULT_IMAGE, mapping = Texture.DEFAULT_MAPPING, wrapS = ClampToEdgeWrapping, wrapT = ClampToEdgeWrapping, magFilter = LinearFilter, minFilter = LinearMipmapLinearFilter, format = RGBAFormat, type = UnsignedByteType, anisotropy = Texture.DEFAULT_ANISOTROPY, colorSpace = NoColorSpace ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isTexture = true;\n\n\t\t/**\n\t\t * The ID of the texture.\n\t\t *\n\t\t * @name Texture#id\n\t\t * @type {number}\n\t\t * @readonly\n\t\t */\n\t\tObject.defineProperty( this, 'id', { value: _textureId ++ } );\n\n\t\t/**\n\t\t * The UUID of the material.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.uuid = generateUUID();\n\n\t\t/**\n\t\t * The name of the material.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\n\t\t/**\n\t\t * The data definition of a texture. A reference to the data source can be\n\t\t * shared across textures. This is often useful in context of spritesheets\n\t\t * where multiple textures render the same data but with different texture\n\t\t * transformations.\n\t\t *\n\t\t * @type {Source}\n\t\t */\n\t\tthis.source = new Source( image );\n\n\t\t/**\n\t\t * An array holding user-defined mipmaps.\n\t\t *\n\t\t * @type {Array<Object>}\n\t\t */\n\t\tthis.mipmaps = [];\n\n\t\t/**\n\t\t * How the texture is applied to the object. The value `UVMapping`\n\t\t * is the default, where texture or uv coordinates are used to apply the map.\n\t\t *\n\t\t * @type {(UVMapping|CubeReflectionMapping|CubeRefractionMapping|EquirectangularReflectionMapping|EquirectangularRefractionMapping|CubeUVReflectionMapping)}\n\t\t * @default UVMapping\n\t\t*/\n\t\tthis.mapping = mapping;\n\n\t\t/**\n\t\t * Lets you select the uv attribute to map the texture to. `0` for `uv`,\n\t\t * `1` for `uv1`, `2` for `uv2` and `3` for `uv3`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.channel = 0;\n\n\t\t/**\n\t\t * This defines how the texture is wrapped horizontally and corresponds to\n\t\t * *U* in UV mapping.\n\t\t *\n\t\t * @type {(RepeatWrapping|ClampToEdgeWrapping|MirroredRepeatWrapping)}\n\t\t * @default ClampToEdgeWrapping\n\t\t */\n\t\tthis.wrapS = wrapS;\n\n\t\t/**\n\t\t * This defines how the texture is wrapped horizontally and corresponds to\n\t\t * *V* in UV mapping.\n\t\t *\n\t\t * @type {(RepeatWrapping|ClampToEdgeWrapping|MirroredRepeatWrapping)}\n\t\t * @default ClampToEdgeWrapping\n\t\t */\n\t\tthis.wrapT = wrapT;\n\n\t\t/**\n\t\t * How the texture is sampled when a texel covers more than one pixel.\n\t\t *\n\t\t * @type {(NearestFilter|NearestMipmapNearestFilter|NearestMipmapLinearFilter|LinearFilter|LinearMipmapNearestFilter|LinearMipmapLinearFilter)}\n\t\t * @default LinearFilter\n\t\t */\n\t\tthis.magFilter = magFilter;\n\n\t\t/**\n\t\t * How the texture is sampled when a texel covers less than one pixel.\n\t\t *\n\t\t * @type {(NearestFilter|NearestMipmapNearestFilter|NearestMipmapLinearFilter|LinearFilter|LinearMipmapNearestFilter|LinearMipmapLinearFilter)}\n\t\t * @default LinearMipmapLinearFilter\n\t\t */\n\t\tthis.minFilter = minFilter;\n\n\t\t/**\n\t\t * The number of samples taken along the axis through the pixel that has the\n\t\t * highest density of texels. By default, this value is `1`. A higher value\n\t\t * gives a less blurry result than a basic mipmap, at the cost of more\n\t\t * texture samples being used.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.anisotropy = anisotropy;\n\n\t\t/**\n\t\t * The format of the texture.\n\t\t *\n\t\t * @type {number}\n\t\t * @default RGBAFormat\n\t\t */\n\t\tthis.format = format;\n\n\t\t/**\n\t\t * The default internal format is derived from {@link Texture#format} and {@link Texture#type} and\n\t\t * defines how the texture data is going to be stored on the GPU.\n\t\t *\n\t\t * This property allows to overwrite the default format.\n\t\t *\n\t\t * @type {?string}\n\t\t * @default null\n\t\t */\n\t\tthis.internalFormat = null;\n\n\t\t/**\n\t\t * The data type of the texture.\n\t\t *\n\t\t * @type {number}\n\t\t * @default UnsignedByteType\n\t\t */\n\t\tthis.type = type;\n\n\t\t/**\n\t\t * How much a single repetition of the texture is offset from the beginning,\n\t\t * in each direction U and V. Typical range is `0.0` to `1.0`.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (0,0)\n\t\t */\n\t\tthis.offset = new Vector2( 0, 0 );\n\n\t\t/**\n\t\t * How many times the texture is repeated across the surface, in each\n\t\t * direction U and V. If repeat is set greater than `1` in either direction,\n\t\t * the corresponding wrap parameter should also be set to `RepeatWrapping`\n\t\t * or `MirroredRepeatWrapping` to achieve the desired tiling effect.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (1,1)\n\t\t */\n\t\tthis.repeat = new Vector2( 1, 1 );\n\n\t\t/**\n\t\t * The point around which rotation occurs. A value of `(0.5, 0.5)` corresponds\n\t\t * to the center of the texture. Default is `(0, 0)`, the lower left.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (0,0)\n\t\t */\n\t\tthis.center = new Vector2( 0, 0 );\n\n\t\t/**\n\t\t * How much the texture is rotated around the center point, in radians.\n\t\t * Positive values are counter-clockwise.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.rotation = 0;\n\n\t\t/**\n\t\t * Whether to update the texture's uv-transformation {@link Texture#matrix}\n\t\t * from the properties {@link Texture#offset}, {@link Texture#repeat},\n\t\t * {@link Texture#rotation}, and {@link Texture#center}.\n\t\t *\n\t\t * Set this to `false` if you are specifying the uv-transform matrix directly.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.matrixAutoUpdate = true;\n\n\t\t/**\n\t\t * The uv-transformation matrix of the texture.\n\t\t *\n\t\t * @type {Matrix3}\n\t\t */\n\t\tthis.matrix = new Matrix3();\n\n\t\t/**\n\t\t * Whether to generate mipmaps (if possible) for a texture.\n\t\t *\n\t\t * Set this to `false` if you are creating mipmaps manually.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.generateMipmaps = true;\n\n\t\t/**\n\t\t * If set to `true`, the alpha channel, if present, is multiplied into the\n\t\t * color channels when the texture is uploaded to the GPU.\n\t\t *\n\t\t * Note that this property has no effect when using `ImageBitmap`. You need to\n\t\t * configure premultiply alpha on bitmap creation instead.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.premultiplyAlpha = false;\n\n\t\t/**\n\t\t * If set to `true`, the texture is flipped along the vertical axis when\n\t\t * uploaded to the GPU.\n\t\t *\n\t\t * Note that this property has no effect when using `ImageBitmap`. You need to\n\t\t * configure the flip on bitmap creation instead.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.flipY = true;\n\n\t\t/**\n\t\t * Specifies the alignment requirements for the start of each pixel row in memory.\n\t\t * The allowable values are `1` (byte-alignment), `2` (rows aligned to even-numbered bytes),\n\t\t * `4` (word-alignment), and `8` (rows start on double-word boundaries).\n\t\t *\n\t\t * @type {number}\n\t\t * @default 4\n\t\t */\n\t\tthis.unpackAlignment = 4;\t// valid values: 1, 2, 4, 8 (see http://www.khronos.org/opengles/sdk/docs/man/xhtml/glPixelStorei.xml)\n\n\t\t/**\n\t\t * Textures containing color data should be annotated with `SRGBColorSpace` or `LinearSRGBColorSpace`.\n\t\t *\n\t\t * @type {string}\n\t\t * @default NoColorSpace\n\t\t */\n\t\tthis.colorSpace = colorSpace;\n\n\t\t/**\n\t\t * An object that can be used to store custom data about the texture. It\n\t\t * should not hold references to functions as these will not be cloned.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.userData = {};\n\n\t\t/**\n\t\t * This can be used to only update a subregion or specific rows of the texture (for example, just the\n\t\t * first 3 rows). Use the `addUpdateRange()` function to add ranges to this array.\n\t\t *\n\t\t * @type {Array<Object>}\n\t\t */\n\t\tthis.updateRanges = [];\n\n\t\t/**\n\t\t * This starts at `0` and counts how many times {@link Texture#needsUpdate} is set to `true`.\n\t\t *\n\t\t * @type {number}\n\t\t * @readonly\n\t\t * @default 0\n\t\t */\n\t\tthis.version = 0;\n\n\t\t/**\n\t\t * A callback function, called when the texture is updated (e.g., when\n\t\t * {@link Texture#needsUpdate} has been set to true and then the texture is used).\n\t\t *\n\t\t * @type {?Function}\n\t\t * @default null\n\t\t */\n\t\tthis.onUpdate = null;\n\n\t\t/**\n\t\t * An optional back reference to the textures render target.\n\t\t *\n\t\t * @type {?(RenderTarget|WebGLRenderTarget)}\n\t\t * @default null\n\t\t */\n\t\tthis.renderTarget = null;\n\n\t\t/**\n\t\t * Indicates whether a texture belongs to a render target or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default false\n\t\t */\n\t\tthis.isRenderTargetTexture = false;\n\n\t\t/**\n\t\t * Indicates if a texture should be handled like a texture array.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default false\n\t\t */\n\t\tthis.isArrayTexture = image && image.depth && image.depth > 1 ? true : false;\n\n\t\t/**\n\t\t * Indicates whether this texture should be processed by `PMREMGenerator` or not\n\t\t * (only relevant for render target textures).\n\t\t *\n\t\t * @type {number}\n\t\t * @readonly\n\t\t * @default 0\n\t\t */\n\t\tthis.pmremVersion = 0;\n\n\t}\n\n\t/**\n\t * The width of the texture in pixels.\n\t */\n\tget width() {\n\n\t\treturn this.source.getSize( _tempVec3 ).x;\n\n\t}\n\n\t/**\n\t * The height of the texture in pixels.\n\t */\n\tget height() {\n\n\t\treturn this.source.getSize( _tempVec3 ).y;\n\n\t}\n\n\t/**\n\t * The depth of the texture in pixels.\n\t */\n\tget depth() {\n\n\t\treturn this.source.getSize( _tempVec3 ).z;\n\n\t}\n\n\t/**\n\t * The image object holding the texture data.\n\t *\n\t * @type {?Object}\n\t */\n\tget image() {\n\n\t\treturn this.source.data;\n\n\t}\n\n\tset image( value = null ) {\n\n\t\tthis.source.data = value;\n\n\t}\n\n\t/**\n\t * Updates the texture transformation matrix from the from the properties {@link Texture#offset},\n\t * {@link Texture#repeat}, {@link Texture#rotation}, and {@link Texture#center}.\n\t */\n\tupdateMatrix() {\n\n\t\tthis.matrix.setUvTransform( this.offset.x, this.offset.y, this.repeat.x, this.repeat.y, this.rotation, this.center.x, this.center.y );\n\n\t}\n\n\t/**\n\t * Adds a range of data in the data texture to be updated on the GPU.\n\t *\n\t * @param {number} start - Position at which to start update.\n\t * @param {number} count - The number of components to update.\n\t */\n\taddUpdateRange( start, count ) {\n\n\t\tthis.updateRanges.push( { start, count } );\n\n\t}\n\n\t/**\n\t * Clears the update ranges.\n\t */\n\tclearUpdateRanges() {\n\n\t\tthis.updateRanges.length = 0;\n\n\t}\n\n\t/**\n\t * Returns a new texture with copied values from this instance.\n\t *\n\t * @return {Texture} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Copies the values of the given texture to this instance.\n\t *\n\t * @param {Texture} source - The texture to copy.\n\t * @return {Texture} A reference to this instance.\n\t */\n\tcopy( source ) {\n\n\t\tthis.name = source.name;\n\n\t\tthis.source = source.source;\n\t\tthis.mipmaps = source.mipmaps.slice( 0 );\n\n\t\tthis.mapping = source.mapping;\n\t\tthis.channel = source.channel;\n\n\t\tthis.wrapS = source.wrapS;\n\t\tthis.wrapT = source.wrapT;\n\n\t\tthis.magFilter = source.magFilter;\n\t\tthis.minFilter = source.minFilter;\n\n\t\tthis.anisotropy = source.anisotropy;\n\n\t\tthis.format = source.format;\n\t\tthis.internalFormat = source.internalFormat;\n\t\tthis.type = source.type;\n\n\t\tthis.offset.copy( source.offset );\n\t\tthis.repeat.copy( source.repeat );\n\t\tthis.center.copy( source.center );\n\t\tthis.rotation = source.rotation;\n\n\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\t\tthis.matrix.copy( source.matrix );\n\n\t\tthis.generateMipmaps = source.generateMipmaps;\n\t\tthis.premultiplyAlpha = source.premultiplyAlpha;\n\t\tthis.flipY = source.flipY;\n\t\tthis.unpackAlignment = source.unpackAlignment;\n\t\tthis.colorSpace = source.colorSpace;\n\n\t\tthis.renderTarget = source.renderTarget;\n\t\tthis.isRenderTargetTexture = source.isRenderTargetTexture;\n\t\tthis.isArrayTexture = source.isArrayTexture;\n\n\t\tthis.userData = JSON.parse( JSON.stringify( source.userData ) );\n\n\t\tthis.needsUpdate = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this texture's properties based on `values`.\n\t * @param {Object} values - A container with texture parameters.\n\t */\n\tsetValues( values ) {\n\n\t\tfor ( const key in values ) {\n\n\t\t\tconst newValue = values[ key ];\n\n\t\t\tif ( newValue === undefined ) {\n\n\t\t\t\twarn( `Texture.setValues(): parameter '${ key }' has value of undefined.` );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tconst currentValue = this[ key ];\n\n\t\t\tif ( currentValue === undefined ) {\n\n\t\t\t\twarn( `Texture.setValues(): property '${ key }' does not exist.` );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tif ( ( currentValue && newValue ) && ( currentValue.isVector2 && newValue.isVector2 ) ) {\n\n\t\t\t\tcurrentValue.copy( newValue );\n\n\t\t\t} else if ( ( currentValue && newValue ) && ( currentValue.isVector3 && newValue.isVector3 ) ) {\n\n\t\t\t\tcurrentValue.copy( newValue );\n\n\t\t\t} else if ( ( currentValue && newValue ) && ( currentValue.isMatrix3 && newValue.isMatrix3 ) ) {\n\n\t\t\t\tcurrentValue.copy( newValue );\n\n\t\t\t} else {\n\n\t\t\t\tthis[ key ] = newValue;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Serializes the texture into JSON.\n\t *\n\t * @param {?(Object|string)} meta - An optional value holding meta information about the serialization.\n\t * @return {Object} A JSON object representing the serialized texture.\n\t * @see {@link ObjectLoader#parse}\n\t */\n\ttoJSON( meta ) {\n\n\t\tconst isRootObject = ( meta === undefined || typeof meta === 'string' );\n\n\t\tif ( ! isRootObject && meta.textures[ this.uuid ] !== undefined ) {\n\n\t\t\treturn meta.textures[ this.uuid ];\n\n\t\t}\n\n\t\tconst output = {\n\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.7,\n\t\t\t\ttype: 'Texture',\n\t\t\t\tgenerator: 'Texture.toJSON'\n\t\t\t},\n\n\t\t\tuuid: this.uuid,\n\t\t\tname: this.name,\n\n\t\t\timage: this.source.toJSON( meta ).uuid,\n\n\t\t\tmapping: this.mapping,\n\t\t\tchannel: this.channel,\n\n\t\t\trepeat: [ this.repeat.x, this.repeat.y ],\n\t\t\toffset: [ this.offset.x, this.offset.y ],\n\t\t\tcenter: [ this.center.x, this.center.y ],\n\t\t\trotation: this.rotation,\n\n\t\t\twrap: [ this.wrapS, this.wrapT ],\n\n\t\t\tformat: this.format,\n\t\t\tinternalFormat: this.internalFormat,\n\t\t\ttype: this.type,\n\t\t\tcolorSpace: this.colorSpace,\n\n\t\t\tminFilter: this.minFilter,\n\t\t\tmagFilter: this.magFilter,\n\t\t\tanisotropy: this.anisotropy,\n\n\t\t\tflipY: this.flipY,\n\n\t\t\tgenerateMipmaps: this.generateMipmaps,\n\t\t\tpremultiplyAlpha: this.premultiplyAlpha,\n\t\t\tunpackAlignment: this.unpackAlignment\n\n\t\t};\n\n\t\tif ( Object.keys( this.userData ).length > 0 ) output.userData = this.userData;\n\n\t\tif ( ! isRootObject ) {\n\n\t\t\tmeta.textures[ this.uuid ] = output;\n\n\t\t}\n\n\t\treturn output;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t *\n\t * @fires Texture#dispose\n\t */\n\tdispose() {\n\n\t\t/**\n\t\t * Fires when the texture has been disposed of.\n\t\t *\n\t\t * @event Texture#dispose\n\t\t * @type {Object}\n\t\t */\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n\t/**\n\t * Transforms the given uv vector with the textures uv transformation matrix.\n\t *\n\t * @param {Vector2} uv - The uv vector.\n\t * @return {Vector2} The transformed uv vector.\n\t */\n\ttransformUv( uv ) {\n\n\t\tif ( this.mapping !== UVMapping ) return uv;\n\n\t\tuv.applyMatrix3( this.matrix );\n\n\t\tif ( uv.x < 0 || uv.x > 1 ) {\n\n\t\t\tswitch ( this.wrapS ) {\n\n\t\t\t\tcase RepeatWrapping:\n\n\t\t\t\t\tuv.x = uv.x - Math.floor( uv.x );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase ClampToEdgeWrapping:\n\n\t\t\t\t\tuv.x = uv.x < 0 ? 0 : 1;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MirroredRepeatWrapping:\n\n\t\t\t\t\tif ( Math.abs( Math.floor( uv.x ) % 2 ) === 1 ) {\n\n\t\t\t\t\t\tuv.x = Math.ceil( uv.x ) - uv.x;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tuv.x = uv.x - Math.floor( uv.x );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( uv.y < 0 || uv.y > 1 ) {\n\n\t\t\tswitch ( this.wrapT ) {\n\n\t\t\t\tcase RepeatWrapping:\n\n\t\t\t\t\tuv.y = uv.y - Math.floor( uv.y );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase ClampToEdgeWrapping:\n\n\t\t\t\t\tuv.y = uv.y < 0 ? 0 : 1;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MirroredRepeatWrapping:\n\n\t\t\t\t\tif ( Math.abs( Math.floor( uv.y ) % 2 ) === 1 ) {\n\n\t\t\t\t\t\tuv.y = Math.ceil( uv.y ) - uv.y;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tuv.y = uv.y - Math.floor( uv.y );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.flipY ) {\n\n\t\t\tuv.y = 1 - uv.y;\n\n\t\t}\n\n\t\treturn uv;\n\n\t}\n\n\t/**\n\t * Setting this property to `true` indicates the engine the texture\n\t * must be updated in the next render. This triggers a texture upload\n\t * to the GPU and ensures correct texture parameter configuration.\n\t *\n\t * @type {boolean}\n\t * @default false\n\t * @param {boolean} value\n\t */\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) {\n\n\t\t\tthis.version ++;\n\t\t\tthis.source.needsUpdate = true;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Setting this property to `true` indicates the engine the PMREM\n\t * must be regenerated.\n\t *\n\t * @type {boolean}\n\t * @default false\n\t * @param {boolean} value\n\t */\n\tset needsPMREMUpdate( value ) {\n\n\t\tif ( value === true ) {\n\n\t\t\tthis.pmremVersion ++;\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * The default image for all textures.\n *\n * @static\n * @type {?Image}\n * @default null\n */\nTexture.DEFAULT_IMAGE = null;\n\n/**\n * The default mapping for all textures.\n *\n * @static\n * @type {number}\n * @default UVMapping\n */\nTexture.DEFAULT_MAPPING = UVMapping;\n\n/**\n * The default anisotropy value for all textures.\n *\n * @static\n * @type {number}\n * @default 1\n */\nTexture.DEFAULT_ANISOTROPY = 1;\n\n/**\n * Class representing a 4D vector. A 4D vector is an ordered quadruplet of numbers\n * (labeled x, y, z and w), which can be used to represent a number of things, such as:\n *\n * - A point in 4D space.\n * - A direction and length in 4D space. In three.js the length will\n * always be the Euclidean distance(straight-line distance) from `(0, 0, 0, 0)` to `(x, y, z, w)`\n * and the direction is also measured from `(0, 0, 0, 0)` towards `(x, y, z, w)`.\n * - Any arbitrary ordered quadruplet of numbers.\n *\n * There are other things a 4D vector can be used to represent, however these\n * are the most common uses in *three.js*.\n *\n * Iterating through a vector instance will yield its components `(x, y, z, w)` in\n * the corresponding order.\n * ```js\n * const a = new THREE.Vector4( 0, 1, 0, 0 );\n *\n * //no arguments; will be initialised to (0, 0, 0, 1)\n * const b = new THREE.Vector4( );\n *\n * const d = a.dot( b );\n * ```\n */\nclass Vector4 {\n\n\t/**\n\t * Constructs a new 4D vector.\n\t *\n\t * @param {number} [x=0] - The x value of this vector.\n\t * @param {number} [y=0] - The y value of this vector.\n\t * @param {number} [z=0] - The z value of this vector.\n\t * @param {number} [w=1] - The w value of this vector.\n\t */\n\tconstructor( x = 0, y = 0, z = 0, w = 1 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tVector4.prototype.isVector4 = true;\n\n\t\t/**\n\t\t * The x value of this vector.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.x = x;\n\n\t\t/**\n\t\t * The y value of this vector.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.y = y;\n\n\t\t/**\n\t\t * The z value of this vector.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.z = z;\n\n\t\t/**\n\t\t * The w value of this vector.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.w = w;\n\n\t}\n\n\t/**\n\t * Alias for {@link Vector4#z}.\n\t *\n\t * @type {number}\n\t */\n\tget width() {\n\n\t\treturn this.z;\n\n\t}\n\n\tset width( value ) {\n\n\t\tthis.z = value;\n\n\t}\n\n\t/**\n\t * Alias for {@link Vector4#w}.\n\t *\n\t * @type {number}\n\t */\n\tget height() {\n\n\t\treturn this.w;\n\n\t}\n\n\tset height( value ) {\n\n\t\tthis.w = value;\n\n\t}\n\n\t/**\n\t * Sets the vector components.\n\t *\n\t * @param {number} x - The value of the x component.\n\t * @param {number} y - The value of the y component.\n\t * @param {number} z - The value of the z component.\n\t * @param {number} w - The value of the w component.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tset( x, y, z, w ) {\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\t\tthis.w = w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector components to the same value.\n\t *\n\t * @param {number} scalar - The value to set for all vector components.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetScalar( scalar ) {\n\n\t\tthis.x = scalar;\n\t\tthis.y = scalar;\n\t\tthis.z = scalar;\n\t\tthis.w = scalar;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector's x component to the given value\n\t *\n\t * @param {number} x - The value to set.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetX( x ) {\n\n\t\tthis.x = x;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector's y component to the given value\n\t *\n\t * @param {number} y - The value to set.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetY( y ) {\n\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector's z component to the given value\n\t *\n\t * @param {number} z - The value to set.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetZ( z ) {\n\n\t\tthis.z = z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector's w component to the given value\n\t *\n\t * @param {number} w - The value to set.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetW( w ) {\n\n\t\tthis.w = w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Allows to set a vector component with an index.\n\t *\n\t * @param {number} index - The component index. `0` equals to x, `1` equals to y,\n\t * `2` equals to z, `3` equals to w.\n\t * @param {number} value - The value to set.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetComponent( index, value ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: this.x = value; break;\n\t\t\tcase 1: this.y = value; break;\n\t\t\tcase 2: this.z = value; break;\n\t\t\tcase 3: this.w = value; break;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the value of the vector component which matches the given index.\n\t *\n\t * @param {number} index - The component index. `0` equals to x, `1` equals to y,\n\t * `2` equals to z, `3` equals to w.\n\t * @return {number} A vector component value.\n\t */\n\tgetComponent( index ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: return this.x;\n\t\t\tcase 1: return this.y;\n\t\t\tcase 2: return this.z;\n\t\t\tcase 3: return this.w;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns a new vector with copied values from this instance.\n\t *\n\t * @return {Vector4} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor( this.x, this.y, this.z, this.w );\n\n\t}\n\n\t/**\n\t * Copies the values of the given vector to this instance.\n\t *\n\t * @param {Vector3|Vector4} v - The vector to copy.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tcopy( v ) {\n\n\t\tthis.x = v.x;\n\t\tthis.y = v.y;\n\t\tthis.z = v.z;\n\t\tthis.w = ( v.w !== undefined ) ? v.w : 1;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given vector to this instance.\n\t *\n\t * @param {Vector4} v - The vector to add.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tadd( v ) {\n\n\t\tthis.x += v.x;\n\t\tthis.y += v.y;\n\t\tthis.z += v.z;\n\t\tthis.w += v.w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given scalar value to all components of this instance.\n\t *\n\t * @param {number} s - The scalar to add.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\taddScalar( s ) {\n\n\t\tthis.x += s;\n\t\tthis.y += s;\n\t\tthis.z += s;\n\t\tthis.w += s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given vectors and stores the result in this instance.\n\t *\n\t * @param {Vector4} a - The first vector.\n\t * @param {Vector4} b - The second vector.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\taddVectors( a, b ) {\n\n\t\tthis.x = a.x + b.x;\n\t\tthis.y = a.y + b.y;\n\t\tthis.z = a.z + b.z;\n\t\tthis.w = a.w + b.w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given vector scaled by the given factor to this instance.\n\t *\n\t * @param {Vector4} v - The vector.\n\t * @param {number} s - The factor that scales `v`.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\taddScaledVector( v, s ) {\n\n\t\tthis.x += v.x * s;\n\t\tthis.y += v.y * s;\n\t\tthis.z += v.z * s;\n\t\tthis.w += v.w * s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the given vector from this instance.\n\t *\n\t * @param {Vector4} v - The vector to subtract.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsub( v ) {\n\n\t\tthis.x -= v.x;\n\t\tthis.y -= v.y;\n\t\tthis.z -= v.z;\n\t\tthis.w -= v.w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the given scalar value from all components of this instance.\n\t *\n\t * @param {number} s - The scalar to subtract.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsubScalar( s ) {\n\n\t\tthis.x -= s;\n\t\tthis.y -= s;\n\t\tthis.z -= s;\n\t\tthis.w -= s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the given vectors and stores the result in this instance.\n\t *\n\t * @param {Vector4} a - The first vector.\n\t * @param {Vector4} b - The second vector.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsubVectors( a, b ) {\n\n\t\tthis.x = a.x - b.x;\n\t\tthis.y = a.y - b.y;\n\t\tthis.z = a.z - b.z;\n\t\tthis.w = a.w - b.w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the given vector with this instance.\n\t *\n\t * @param {Vector4} v - The vector to multiply.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tmultiply( v ) {\n\n\t\tthis.x *= v.x;\n\t\tthis.y *= v.y;\n\t\tthis.z *= v.z;\n\t\tthis.w *= v.w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the given scalar value with all components of this instance.\n\t *\n\t * @param {number} scalar - The scalar to multiply.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tmultiplyScalar( scalar ) {\n\n\t\tthis.x *= scalar;\n\t\tthis.y *= scalar;\n\t\tthis.z *= scalar;\n\t\tthis.w *= scalar;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies this vector with the given 4x4 matrix.\n\t *\n\t * @param {Matrix4} m - The 4x4 matrix.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tapplyMatrix4( m ) {\n\n\t\tconst x = this.x, y = this.y, z = this.z, w = this.w;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] * w;\n\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] * w;\n\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] * w;\n\t\tthis.w = e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] * w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Divides this instance by the given vector.\n\t *\n\t * @param {Vector4} v - The vector to divide.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tdivide( v ) {\n\n\t\tthis.x /= v.x;\n\t\tthis.y /= v.y;\n\t\tthis.z /= v.z;\n\t\tthis.w /= v.w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Divides this vector by the given scalar.\n\t *\n\t * @param {number} scalar - The scalar to divide.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tdivideScalar( scalar ) {\n\n\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t}\n\n\t/**\n\t * Sets the x, y and z components of this\n\t * vector to the quaternion's axis and w to the angle.\n\t *\n\t * @param {Quaternion} q - The Quaternion to set.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetAxisAngleFromQuaternion( q ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm\n\n\t\t// q is assumed to be normalized\n\n\t\tthis.w = 2 * Math.acos( q.w );\n\n\t\tconst s = Math.sqrt( 1 - q.w * q.w );\n\n\t\tif ( s < 0.0001 ) {\n\n\t\t\tthis.x = 1;\n\t\t\tthis.y = 0;\n\t\t\tthis.z = 0;\n\n\t\t} else {\n\n\t\t\tthis.x = q.x / s;\n\t\t\tthis.y = q.y / s;\n\t\t\tthis.z = q.z / s;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the x, y and z components of this\n\t * vector to the axis of rotation and w to the angle.\n\t *\n\t * @param {Matrix4} m - A 4x4 matrix of which the upper left 3x3 matrix is a pure rotation matrix.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetAxisAngleFromRotationMatrix( m ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToAngle/index.htm\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tlet angle, x, y, z; // variables for result\n\t\tconst epsilon = 0.01,\t\t// margin to allow for rounding errors\n\t\t\tepsilon2 = 0.1,\t\t// margin to distinguish between 0 and 180 degrees\n\n\t\t\tte = m.elements,\n\n\t\t\tm11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],\n\t\t\tm21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],\n\t\t\tm31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];\n\n\t\tif ( ( Math.abs( m12 - m21 ) < epsilon ) &&\n\t\t     ( Math.abs( m13 - m31 ) < epsilon ) &&\n\t\t     ( Math.abs( m23 - m32 ) < epsilon ) ) {\n\n\t\t\t// singularity found\n\t\t\t// first check for identity matrix which must have +1 for all terms\n\t\t\t// in leading diagonal and zero in other terms\n\n\t\t\tif ( ( Math.abs( m12 + m21 ) < epsilon2 ) &&\n\t\t\t     ( Math.abs( m13 + m31 ) < epsilon2 ) &&\n\t\t\t     ( Math.abs( m23 + m32 ) < epsilon2 ) &&\n\t\t\t     ( Math.abs( m11 + m22 + m33 - 3 ) < epsilon2 ) ) {\n\n\t\t\t\t// this singularity is identity matrix so angle = 0\n\n\t\t\t\tthis.set( 1, 0, 0, 0 );\n\n\t\t\t\treturn this; // zero angle, arbitrary axis\n\n\t\t\t}\n\n\t\t\t// otherwise this singularity is angle = 180\n\n\t\t\tangle = Math.PI;\n\n\t\t\tconst xx = ( m11 + 1 ) / 2;\n\t\t\tconst yy = ( m22 + 1 ) / 2;\n\t\t\tconst zz = ( m33 + 1 ) / 2;\n\t\t\tconst xy = ( m12 + m21 ) / 4;\n\t\t\tconst xz = ( m13 + m31 ) / 4;\n\t\t\tconst yz = ( m23 + m32 ) / 4;\n\n\t\t\tif ( ( xx > yy ) && ( xx > zz ) ) {\n\n\t\t\t\t// m11 is the largest diagonal term\n\n\t\t\t\tif ( xx < epsilon ) {\n\n\t\t\t\t\tx = 0;\n\t\t\t\t\ty = 0.707106781;\n\t\t\t\t\tz = 0.707106781;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tx = Math.sqrt( xx );\n\t\t\t\t\ty = xy / x;\n\t\t\t\t\tz = xz / x;\n\n\t\t\t\t}\n\n\t\t\t} else if ( yy > zz ) {\n\n\t\t\t\t// m22 is the largest diagonal term\n\n\t\t\t\tif ( yy < epsilon ) {\n\n\t\t\t\t\tx = 0.707106781;\n\t\t\t\t\ty = 0;\n\t\t\t\t\tz = 0.707106781;\n\n\t\t\t\t} else {\n\n\t\t\t\t\ty = Math.sqrt( yy );\n\t\t\t\t\tx = xy / y;\n\t\t\t\t\tz = yz / y;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// m33 is the largest diagonal term so base result on this\n\n\t\t\t\tif ( zz < epsilon ) {\n\n\t\t\t\t\tx = 0.707106781;\n\t\t\t\t\ty = 0.707106781;\n\t\t\t\t\tz = 0;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tz = Math.sqrt( zz );\n\t\t\t\t\tx = xz / z;\n\t\t\t\t\ty = yz / z;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.set( x, y, z, angle );\n\n\t\t\treturn this; // return 180 deg rotation\n\n\t\t}\n\n\t\t// as we have reached here there are no singularities so we can handle normally\n\n\t\tlet s = Math.sqrt( ( m32 - m23 ) * ( m32 - m23 ) +\n\t\t\t( m13 - m31 ) * ( m13 - m31 ) +\n\t\t\t( m21 - m12 ) * ( m21 - m12 ) ); // used to normalize\n\n\t\tif ( Math.abs( s ) < 0.001 ) s = 1;\n\n\t\t// prevent divide by zero, should not happen if matrix is orthogonal and should be\n\t\t// caught by singularity test above, but I've left it in just in case\n\n\t\tthis.x = ( m32 - m23 ) / s;\n\t\tthis.y = ( m13 - m31 ) / s;\n\t\tthis.z = ( m21 - m12 ) / s;\n\t\tthis.w = Math.acos( ( m11 + m22 + m33 - 1 ) / 2 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector components to the position elements of the\n\t * given transformation matrix.\n\t *\n\t * @param {Matrix4} m - The 4x4 matrix.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetFromMatrixPosition( m ) {\n\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 12 ];\n\t\tthis.y = e[ 13 ];\n\t\tthis.z = e[ 14 ];\n\t\tthis.w = e[ 15 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x, y, z or w value is greater than the given vector's x, y, z or w\n\t * value, replace that value with the corresponding min value.\n\t *\n\t * @param {Vector4} v - The vector.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tmin( v ) {\n\n\t\tthis.x = Math.min( this.x, v.x );\n\t\tthis.y = Math.min( this.y, v.y );\n\t\tthis.z = Math.min( this.z, v.z );\n\t\tthis.w = Math.min( this.w, v.w );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x, y, z or w value is less than the given vector's x, y, z or w\n\t * value, replace that value with the corresponding max value.\n\t *\n\t * @param {Vector4} v - The vector.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tmax( v ) {\n\n\t\tthis.x = Math.max( this.x, v.x );\n\t\tthis.y = Math.max( this.y, v.y );\n\t\tthis.z = Math.max( this.z, v.z );\n\t\tthis.w = Math.max( this.w, v.w );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x, y, z or w value is greater than the max vector's x, y, z or w\n\t * value, it is replaced by the corresponding value.\n\t * If this vector's x, y, z or w value is less than the min vector's x, y, z or w value,\n\t * it is replaced by the corresponding value.\n\t *\n\t * @param {Vector4} min - The minimum x, y and z values.\n\t * @param {Vector4} max - The maximum x, y and z values in the desired range.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tclamp( min, max ) {\n\n\t\t// assumes min < max, componentwise\n\n\t\tthis.x = clamp( this.x, min.x, max.x );\n\t\tthis.y = clamp( this.y, min.y, max.y );\n\t\tthis.z = clamp( this.z, min.z, max.z );\n\t\tthis.w = clamp( this.w, min.w, max.w );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x, y, z or w values are greater than the max value, they are\n\t * replaced by the max value.\n\t * If this vector's x, y, z or w values are less than the min value, they are\n\t * replaced by the min value.\n\t *\n\t * @param {number} minVal - The minimum value the components will be clamped to.\n\t * @param {number} maxVal - The maximum value the components will be clamped to.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tclampScalar( minVal, maxVal ) {\n\n\t\tthis.x = clamp( this.x, minVal, maxVal );\n\t\tthis.y = clamp( this.y, minVal, maxVal );\n\t\tthis.z = clamp( this.z, minVal, maxVal );\n\t\tthis.w = clamp( this.w, minVal, maxVal );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's length is greater than the max value, it is replaced by\n\t * the max value.\n\t * If this vector's length is less than the min value, it is replaced by the\n\t * min value.\n\t *\n\t * @param {number} min - The minimum value the vector length will be clamped to.\n\t * @param {number} max - The maximum value the vector length will be clamped to.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tclampLength( min, max ) {\n\n\t\tconst length = this.length();\n\n\t\treturn this.divideScalar( length || 1 ).multiplyScalar( clamp( length, min, max ) );\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded down to the nearest integer value.\n\t *\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tfloor() {\n\n\t\tthis.x = Math.floor( this.x );\n\t\tthis.y = Math.floor( this.y );\n\t\tthis.z = Math.floor( this.z );\n\t\tthis.w = Math.floor( this.w );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded up to the nearest integer value.\n\t *\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tceil() {\n\n\t\tthis.x = Math.ceil( this.x );\n\t\tthis.y = Math.ceil( this.y );\n\t\tthis.z = Math.ceil( this.z );\n\t\tthis.w = Math.ceil( this.w );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded to the nearest integer value\n\t *\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tround() {\n\n\t\tthis.x = Math.round( this.x );\n\t\tthis.y = Math.round( this.y );\n\t\tthis.z = Math.round( this.z );\n\t\tthis.w = Math.round( this.w );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded towards zero (up if negative,\n\t * down if positive) to an integer value.\n\t *\n\t * @return {Vector4} A reference to this vector.\n\t */\n\troundToZero() {\n\n\t\tthis.x = Math.trunc( this.x );\n\t\tthis.y = Math.trunc( this.y );\n\t\tthis.z = Math.trunc( this.z );\n\t\tthis.w = Math.trunc( this.w );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Inverts this vector - i.e. sets x = -x, y = -y, z = -z, w = -w.\n\t *\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tnegate() {\n\n\t\tthis.x = - this.x;\n\t\tthis.y = - this.y;\n\t\tthis.z = - this.z;\n\t\tthis.w = - this.w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Calculates the dot product of the given vector with this instance.\n\t *\n\t * @param {Vector4} v - The vector to compute the dot product with.\n\t * @return {number} The result of the dot product.\n\t */\n\tdot( v ) {\n\n\t\treturn this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w;\n\n\t}\n\n\t/**\n\t * Computes the square of the Euclidean length (straight-line length) from\n\t * (0, 0, 0, 0) to (x, y, z, w). If you are comparing the lengths of vectors, you should\n\t * compare the length squared instead as it is slightly more efficient to calculate.\n\t *\n\t * @return {number} The square length of this vector.\n\t */\n\tlengthSq() {\n\n\t\treturn this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w;\n\n\t}\n\n\t/**\n\t * Computes the  Euclidean length (straight-line length) from (0, 0, 0, 0) to (x, y, z, w).\n\t *\n\t * @return {number} The length of this vector.\n\t */\n\tlength() {\n\n\t\treturn Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w );\n\n\t}\n\n\t/**\n\t * Computes the Manhattan length of this vector.\n\t *\n\t * @return {number} The length of this vector.\n\t */\n\tmanhattanLength() {\n\n\t\treturn Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ) + Math.abs( this.w );\n\n\t}\n\n\t/**\n\t * Converts this vector to a unit vector - that is, sets it equal to a vector\n\t * with the same direction as this one, but with a vector length of `1`.\n\t *\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tnormalize() {\n\n\t\treturn this.divideScalar( this.length() || 1 );\n\n\t}\n\n\t/**\n\t * Sets this vector to a vector with the same direction as this one, but\n\t * with the specified length.\n\t *\n\t * @param {number} length - The new length of this vector.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetLength( length ) {\n\n\t\treturn this.normalize().multiplyScalar( length );\n\n\t}\n\n\t/**\n\t * Linearly interpolates between the given vector and this instance, where\n\t * alpha is the percent distance along the line - alpha = 0 will be this\n\t * vector, and alpha = 1 will be the given one.\n\t *\n\t * @param {Vector4} v - The vector to interpolate towards.\n\t * @param {number} alpha - The interpolation factor, typically in the closed interval `[0, 1]`.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tlerp( v, alpha ) {\n\n\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\tthis.y += ( v.y - this.y ) * alpha;\n\t\tthis.z += ( v.z - this.z ) * alpha;\n\t\tthis.w += ( v.w - this.w ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Linearly interpolates between the given vectors, where alpha is the percent\n\t * distance along the line - alpha = 0 will be first vector, and alpha = 1 will\n\t * be the second one. The result is stored in this instance.\n\t *\n\t * @param {Vector4} v1 - The first vector.\n\t * @param {Vector4} v2 - The second vector.\n\t * @param {number} alpha - The interpolation factor, typically in the closed interval `[0, 1]`.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tlerpVectors( v1, v2, alpha ) {\n\n\t\tthis.x = v1.x + ( v2.x - v1.x ) * alpha;\n\t\tthis.y = v1.y + ( v2.y - v1.y ) * alpha;\n\t\tthis.z = v1.z + ( v2.z - v1.z ) * alpha;\n\t\tthis.w = v1.w + ( v2.w - v1.w ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this vector is equal with the given one.\n\t *\n\t * @param {Vector4} v - The vector to test for equality.\n\t * @return {boolean} Whether this vector is equal with the given one.\n\t */\n\tequals( v ) {\n\n\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) && ( v.w === this.w ) );\n\n\t}\n\n\t/**\n\t * Sets this vector's x value to be `array[ offset ]`, y value to be `array[ offset + 1 ]`,\n\t * z value to be `array[ offset + 2 ]`, w value to be `array[ offset + 3 ]`.\n\t *\n\t * @param {Array<number>} array - An array holding the vector component values.\n\t * @param {number} [offset=0] - The offset into the array.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis.x = array[ offset ];\n\t\tthis.y = array[ offset + 1 ];\n\t\tthis.z = array[ offset + 2 ];\n\t\tthis.w = array[ offset + 3 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Writes the components of this vector to the given array. If no array is provided,\n\t * the method returns a new instance.\n\t *\n\t * @param {Array<number>} [array=[]] - The target array holding the vector components.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Array<number>} The vector components.\n\t */\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this.x;\n\t\tarray[ offset + 1 ] = this.y;\n\t\tarray[ offset + 2 ] = this.z;\n\t\tarray[ offset + 3 ] = this.w;\n\n\t\treturn array;\n\n\t}\n\n\t/**\n\t * Sets the components of this vector from the given buffer attribute.\n\t *\n\t * @param {BufferAttribute} attribute - The buffer attribute holding vector data.\n\t * @param {number} index - The index into the attribute.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tfromBufferAttribute( attribute, index ) {\n\n\t\tthis.x = attribute.getX( index );\n\t\tthis.y = attribute.getY( index );\n\t\tthis.z = attribute.getZ( index );\n\t\tthis.w = attribute.getW( index );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets each component of this vector to a pseudo-random value between `0` and\n\t * `1`, excluding `1`.\n\t *\n\t * @return {Vector4} A reference to this vector.\n\t */\n\trandom() {\n\n\t\tthis.x = Math.random();\n\t\tthis.y = Math.random();\n\t\tthis.z = Math.random();\n\t\tthis.w = Math.random();\n\n\t\treturn this;\n\n\t}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this.x;\n\t\tyield this.y;\n\t\tyield this.z;\n\t\tyield this.w;\n\n\t}\n\n}\n\n/**\n * A render target is a buffer where the video card draws pixels for a scene\n * that is being rendered in the background. It is used in different effects,\n * such as applying postprocessing to a rendered image before displaying it\n * on the screen.\n *\n * @augments EventDispatcher\n */\nclass RenderTarget extends EventDispatcher {\n\n\t/**\n\t * Render target options.\n\t *\n\t * @typedef {Object} RenderTarget~Options\n\t * @property {boolean} [generateMipmaps=false] - Whether to generate mipmaps or not.\n\t * @property {number} [magFilter=LinearFilter] - The mag filter.\n\t * @property {number} [minFilter=LinearFilter] - The min filter.\n\t * @property {number} [format=RGBAFormat] - The texture format.\n\t * @property {number} [type=UnsignedByteType] - The texture type.\n\t * @property {?string} [internalFormat=null] - The texture's internal format.\n\t * @property {number} [wrapS=ClampToEdgeWrapping] - The texture's uv wrapping mode.\n\t * @property {number} [wrapT=ClampToEdgeWrapping] - The texture's uv wrapping mode.\n\t * @property {number} [anisotropy=1] - The texture's anisotropy value.\n\t * @property {string} [colorSpace=NoColorSpace] - The texture's color space.\n\t * @property {boolean} [depthBuffer=true] - Whether to allocate a depth buffer or not.\n\t * @property {boolean} [stencilBuffer=false] - Whether to allocate a stencil buffer or not.\n\t * @property {boolean} [resolveDepthBuffer=true] - Whether to resolve the depth buffer or not.\n\t * @property {boolean} [resolveStencilBuffer=true] - Whether  to resolve the stencil buffer or not.\n\t * @property {?Texture} [depthTexture=null] - Reference to a depth texture.\n\t * @property {number} [samples=0] - The MSAA samples count.\n\t * @property {number} [count=1] - Defines the number of color attachments . Must be at least `1`.\n\t * @property {number} [depth=1] - The texture depth.\n\t * @property {boolean} [multiview=false] - Whether this target is used for multiview rendering.\n\t */\n\n\t/**\n\t * Constructs a new render target.\n\t *\n\t * @param {number} [width=1] - The width of the render target.\n\t * @param {number} [height=1] - The height of the render target.\n\t * @param {RenderTarget~Options} [options] - The configuration object.\n\t */\n\tconstructor( width = 1, height = 1, options = {} ) {\n\n\t\tsuper();\n\n\t\toptions = Object.assign( {\n\t\t\tgenerateMipmaps: false,\n\t\t\tinternalFormat: null,\n\t\t\tminFilter: LinearFilter,\n\t\t\tdepthBuffer: true,\n\t\t\tstencilBuffer: false,\n\t\t\tresolveDepthBuffer: true,\n\t\t\tresolveStencilBuffer: true,\n\t\t\tdepthTexture: null,\n\t\t\tsamples: 0,\n\t\t\tcount: 1,\n\t\t\tdepth: 1,\n\t\t\tmultiview: false\n\t\t}, options );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isRenderTarget = true;\n\n\t\t/**\n\t\t * The width of the render target.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.width = width;\n\n\t\t/**\n\t\t * The height of the render target.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.height = height;\n\n\t\t/**\n\t\t * The depth of the render target.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.depth = options.depth;\n\n\t\t/**\n\t\t * A rectangular area inside the render target's viewport. Fragments that are\n\t\t * outside the area will be discarded.\n\t\t *\n\t\t * @type {Vector4}\n\t\t * @default (0,0,width,height)\n\t\t */\n\t\tthis.scissor = new Vector4( 0, 0, width, height );\n\n\t\t/**\n\t\t * Indicates whether the scissor test should be enabled when rendering into\n\t\t * this render target or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.scissorTest = false;\n\n\t\t/**\n\t\t * A rectangular area representing the render target's viewport.\n\t\t *\n\t\t * @type {Vector4}\n\t\t * @default (0,0,width,height)\n\t\t */\n\t\tthis.viewport = new Vector4( 0, 0, width, height );\n\n\t\tconst image = { width: width, height: height, depth: options.depth };\n\n\t\tconst texture = new Texture( image );\n\n\t\t/**\n\t\t * An array of textures. Each color attachment is represented as a separate texture.\n\t\t * Has at least a single entry for the default color attachment.\n\t\t *\n\t\t * @type {Array<Texture>}\n\t\t */\n\t\tthis.textures = [];\n\n\t\tconst count = options.count;\n\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\tthis.textures[ i ] = texture.clone();\n\t\t\tthis.textures[ i ].isRenderTargetTexture = true;\n\t\t\tthis.textures[ i ].renderTarget = this;\n\n\t\t}\n\n\t\tthis._setTextureOptions( options );\n\n\t\t/**\n\t\t * Whether to allocate a depth buffer or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.depthBuffer = options.depthBuffer;\n\n\t\t/**\n\t\t * Whether to allocate a stencil buffer or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.stencilBuffer = options.stencilBuffer;\n\n\t\t/**\n\t\t * Whether to resolve the depth buffer or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.resolveDepthBuffer = options.resolveDepthBuffer;\n\n\t\t/**\n\t\t * Whether to resolve the stencil buffer or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.resolveStencilBuffer = options.resolveStencilBuffer;\n\n\t\tthis._depthTexture = null;\n\t\tthis.depthTexture = options.depthTexture;\n\n\t\t/**\n\t\t * The number of MSAA samples.\n\t\t *\n\t\t * A value of `0` disables MSAA.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.samples = options.samples;\n\n\t\t/**\n\t\t * Whether to this target is used in multiview rendering.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.multiview = options.multiview;\n\n\t}\n\n\t_setTextureOptions( options = {} ) {\n\n\t\tconst values = {\n\t\t\tminFilter: LinearFilter,\n\t\t\tgenerateMipmaps: false,\n\t\t\tflipY: false,\n\t\t\tinternalFormat: null\n\t\t};\n\n\t\tif ( options.mapping !== undefined ) values.mapping = options.mapping;\n\t\tif ( options.wrapS !== undefined ) values.wrapS = options.wrapS;\n\t\tif ( options.wrapT !== undefined ) values.wrapT = options.wrapT;\n\t\tif ( options.wrapR !== undefined ) values.wrapR = options.wrapR;\n\t\tif ( options.magFilter !== undefined ) values.magFilter = options.magFilter;\n\t\tif ( options.minFilter !== undefined ) values.minFilter = options.minFilter;\n\t\tif ( options.format !== undefined ) values.format = options.format;\n\t\tif ( options.type !== undefined ) values.type = options.type;\n\t\tif ( options.anisotropy !== undefined ) values.anisotropy = options.anisotropy;\n\t\tif ( options.colorSpace !== undefined ) values.colorSpace = options.colorSpace;\n\t\tif ( options.flipY !== undefined ) values.flipY = options.flipY;\n\t\tif ( options.generateMipmaps !== undefined ) values.generateMipmaps = options.generateMipmaps;\n\t\tif ( options.internalFormat !== undefined ) values.internalFormat = options.internalFormat;\n\n\t\tfor ( let i = 0; i < this.textures.length; i ++ ) {\n\n\t\t\tconst texture = this.textures[ i ];\n\t\t\ttexture.setValues( values );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * The texture representing the default color attachment.\n\t *\n\t * @type {Texture}\n\t */\n\tget texture() {\n\n\t\treturn this.textures[ 0 ];\n\n\t}\n\n\tset texture( value ) {\n\n\t\tthis.textures[ 0 ] = value;\n\n\t}\n\n\tset depthTexture( current ) {\n\n\t\tif ( this._depthTexture !== null ) this._depthTexture.renderTarget = null;\n\t\tif ( current !== null ) current.renderTarget = this;\n\n\t\tthis._depthTexture = current;\n\n\t}\n\n\t/**\n\t * Instead of saving the depth in a renderbuffer, a texture\n\t * can be used instead which is useful for further processing\n\t * e.g. in context of post-processing.\n\t *\n\t * @type {?DepthTexture}\n\t * @default null\n\t */\n\tget depthTexture() {\n\n\t\treturn this._depthTexture;\n\n\t}\n\n\t/**\n\t * Sets the size of this render target.\n\t *\n\t * @param {number} width - The width.\n\t * @param {number} height - The height.\n\t * @param {number} [depth=1] - The depth.\n\t */\n\tsetSize( width, height, depth = 1 ) {\n\n\t\tif ( this.width !== width || this.height !== height || this.depth !== depth ) {\n\n\t\t\tthis.width = width;\n\t\t\tthis.height = height;\n\t\t\tthis.depth = depth;\n\n\t\t\tfor ( let i = 0, il = this.textures.length; i < il; i ++ ) {\n\n\t\t\t\tthis.textures[ i ].image.width = width;\n\t\t\t\tthis.textures[ i ].image.height = height;\n\t\t\t\tthis.textures[ i ].image.depth = depth;\n\n\t\t\t\tif ( this.textures[ i ].isData3DTexture !== true ) { // Fix for #31693\n\n\t\t\t\t\t// TODO: Reconsider setting isArrayTexture flag here and in the ctor of Texture.\n\t\t\t\t\t// Maybe a method `isArrayTexture()` or just a getter could replace a flag since\n\t\t\t\t\t// both are evaluated on each call?\n\n\t\t\t\t\tthis.textures[ i ].isArrayTexture = this.textures[ i ].image.depth > 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.dispose();\n\n\t\t}\n\n\t\tthis.viewport.set( 0, 0, width, height );\n\t\tthis.scissor.set( 0, 0, width, height );\n\n\t}\n\n\t/**\n\t * Returns a new render target with copied values from this instance.\n\t *\n\t * @return {RenderTarget} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Copies the settings of the given render target. This is a structural copy so\n\t * no resources are shared between render targets after the copy. That includes\n\t * all MRT textures and the depth texture.\n\t *\n\t * @param {RenderTarget} source - The render target to copy.\n\t * @return {RenderTarget} A reference to this instance.\n\t */\n\tcopy( source ) {\n\n\t\tthis.width = source.width;\n\t\tthis.height = source.height;\n\t\tthis.depth = source.depth;\n\n\t\tthis.scissor.copy( source.scissor );\n\t\tthis.scissorTest = source.scissorTest;\n\n\t\tthis.viewport.copy( source.viewport );\n\n\t\tthis.textures.length = 0;\n\n\t\tfor ( let i = 0, il = source.textures.length; i < il; i ++ ) {\n\n\t\t\tthis.textures[ i ] = source.textures[ i ].clone();\n\t\t\tthis.textures[ i ].isRenderTargetTexture = true;\n\t\t\tthis.textures[ i ].renderTarget = this;\n\n\t\t\t// ensure image object is not shared, see #20328\n\n\t\t\tconst image = Object.assign( {}, source.textures[ i ].image );\n\t\t\tthis.textures[ i ].source = new Source( image );\n\n\t\t}\n\n\t\tthis.depthBuffer = source.depthBuffer;\n\t\tthis.stencilBuffer = source.stencilBuffer;\n\n\t\tthis.resolveDepthBuffer = source.resolveDepthBuffer;\n\t\tthis.resolveStencilBuffer = source.resolveStencilBuffer;\n\n\t\tif ( source.depthTexture !== null ) this.depthTexture = source.depthTexture.clone();\n\n\t\tthis.samples = source.samples;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t *\n\t * @fires RenderTarget#dispose\n\t */\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n}\n\n/**\n * A render target used in context of {@link WebGLRenderer}.\n *\n * @augments RenderTarget\n */\nclass WebGLRenderTarget extends RenderTarget {\n\n\t/**\n\t * Constructs a new 3D render target.\n\t *\n\t * @param {number} [width=1] - The width of the render target.\n\t * @param {number} [height=1] - The height of the render target.\n\t * @param {RenderTarget~Options} [options] - The configuration object.\n\t */\n\tconstructor( width = 1, height = 1, options = {} ) {\n\n\t\tsuper( width, height, options );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isWebGLRenderTarget = true;\n\n\t}\n\n}\n\n/**\n * Creates an array of textures directly from raw buffer data.\n *\n * @augments Texture\n */\nclass DataArrayTexture extends Texture {\n\n\t/**\n\t * Constructs a new data array texture.\n\t *\n\t * @param {?TypedArray} [data=null] - The buffer data.\n\t * @param {number} [width=1] - The width of the texture.\n\t * @param {number} [height=1] - The height of the texture.\n\t * @param {number} [depth=1] - The depth of the texture.\n\t */\n\tconstructor( data = null, width = 1, height = 1, depth = 1 ) {\n\n\t\tsuper( null );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isDataArrayTexture = true;\n\n\t\t/**\n\t\t * The image definition of a data texture.\n\t\t *\n\t\t * @type {{data:TypedArray,width:number,height:number,depth:number}}\n\t\t */\n\t\tthis.image = { data, width, height, depth };\n\n\t\t/**\n\t\t * How the texture is sampled when a texel covers more than one pixel.\n\t\t *\n\t\t * Overwritten and set to `NearestFilter` by default.\n\t\t *\n\t\t * @type {(NearestFilter|NearestMipmapNearestFilter|NearestMipmapLinearFilter|LinearFilter|LinearMipmapNearestFilter|LinearMipmapLinearFilter)}\n\t\t * @default NearestFilter\n\t\t */\n\t\tthis.magFilter = NearestFilter;\n\n\t\t/**\n\t\t * How the texture is sampled when a texel covers less than one pixel.\n\t\t *\n\t\t * Overwritten and set to `NearestFilter` by default.\n\t\t *\n\t\t * @type {(NearestFilter|NearestMipmapNearestFilter|NearestMipmapLinearFilter|LinearFilter|LinearMipmapNearestFilter|LinearMipmapLinearFilter)}\n\t\t * @default NearestFilter\n\t\t */\n\t\tthis.minFilter = NearestFilter;\n\n\t\t/**\n\t\t * This defines how the texture is wrapped in the depth and corresponds to\n\t\t * *W* in UVW mapping.\n\t\t *\n\t\t * @type {(RepeatWrapping|ClampToEdgeWrapping|MirroredRepeatWrapping)}\n\t\t * @default ClampToEdgeWrapping\n\t\t */\n\t\tthis.wrapR = ClampToEdgeWrapping;\n\n\t\t/**\n\t\t * Whether to generate mipmaps (if possible) for a texture.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.generateMipmaps = false;\n\n\t\t/**\n\t\t * If set to `true`, the texture is flipped along the vertical axis when\n\t\t * uploaded to the GPU.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.flipY = false;\n\n\t\t/**\n\t\t * Specifies the alignment requirements for the start of each pixel row in memory.\n\t\t *\n\t\t * Overwritten and set to `1` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default 1\n\t\t */\n\t\tthis.unpackAlignment = 1;\n\n\t\t/**\n\t\t * A set of all layers which need to be updated in the texture.\n\t\t *\n\t\t * @type {Set<number>}\n\t\t */\n\t\tthis.layerUpdates = new Set();\n\n\t}\n\n\t/**\n\t * Describes that a specific layer of the texture needs to be updated.\n\t * Normally when {@link Texture#needsUpdate} is set to `true`, the\n\t * entire data texture array is sent to the GPU. Marking specific\n\t * layers will only transmit subsets of all mipmaps associated with a\n\t * specific depth in the array which is often much more performant.\n\t *\n\t * @param {number} layerIndex - The layer index that should be updated.\n\t */\n\taddLayerUpdate( layerIndex ) {\n\n\t\tthis.layerUpdates.add( layerIndex );\n\n\t}\n\n\t/**\n\t * Resets the layer updates registry.\n\t */\n\tclearLayerUpdates() {\n\n\t\tthis.layerUpdates.clear();\n\n\t}\n\n}\n\n/**\n * An array render target used in context of {@link WebGLRenderer}.\n *\n * @augments WebGLRenderTarget\n */\nclass WebGLArrayRenderTarget extends WebGLRenderTarget {\n\n\t/**\n\t * Constructs a new array render target.\n\t *\n\t * @param {number} [width=1] - The width of the render target.\n\t * @param {number} [height=1] - The height of the render target.\n\t * @param {number} [depth=1] - The height of the render target.\n\t * @param {RenderTarget~Options} [options] - The configuration object.\n\t */\n\tconstructor( width = 1, height = 1, depth = 1, options = {} ) {\n\n\t\tsuper( width, height, options );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isWebGLArrayRenderTarget = true;\n\n\t\tthis.depth = depth;\n\n\t\t/**\n\t\t * Overwritten with a different texture type.\n\t\t *\n\t\t * @type {DataArrayTexture}\n\t\t */\n\t\tthis.texture = new DataArrayTexture( null, width, height, depth );\n\t\tthis._setTextureOptions( options );\n\n\t\tthis.texture.isRenderTargetTexture = true;\n\n\t}\n\n}\n\n/**\n * Creates a three-dimensional texture from raw data, with parameters to\n * divide it into width, height, and depth.\n *\n * @augments Texture\n */\nclass Data3DTexture extends Texture {\n\n\t/**\n\t * Constructs a new data array texture.\n\t *\n\t * @param {?TypedArray} [data=null] - The buffer data.\n\t * @param {number} [width=1] - The width of the texture.\n\t * @param {number} [height=1] - The height of the texture.\n\t * @param {number} [depth=1] - The depth of the texture.\n\t */\n\tconstructor( data = null, width = 1, height = 1, depth = 1 ) {\n\n\t\t// We're going to add .setXXX() methods for setting properties later.\n\t\t// Users can still set in Data3DTexture directly.\n\t\t//\n\t\t//\tconst texture = new THREE.Data3DTexture( data, width, height, depth );\n\t\t// \ttexture.anisotropy = 16;\n\t\t//\n\t\t// See #14839\n\n\t\tsuper( null );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isData3DTexture = true;\n\n\t\t/**\n\t\t * The image definition of a data texture.\n\t\t *\n\t\t * @type {{data:TypedArray,width:number,height:number,depth:number}}\n\t\t */\n\t\tthis.image = { data, width, height, depth };\n\n\t\t/**\n\t\t * How the texture is sampled when a texel covers more than one pixel.\n\t\t *\n\t\t * Overwritten and set to `NearestFilter` by default.\n\t\t *\n\t\t * @type {(NearestFilter|NearestMipmapNearestFilter|NearestMipmapLinearFilter|LinearFilter|LinearMipmapNearestFilter|LinearMipmapLinearFilter)}\n\t\t * @default NearestFilter\n\t\t */\n\t\tthis.magFilter = NearestFilter;\n\n\t\t/**\n\t\t * How the texture is sampled when a texel covers less than one pixel.\n\t\t *\n\t\t * Overwritten and set to `NearestFilter` by default.\n\t\t *\n\t\t * @type {(NearestFilter|NearestMipmapNearestFilter|NearestMipmapLinearFilter|LinearFilter|LinearMipmapNearestFilter|LinearMipmapLinearFilter)}\n\t\t * @default NearestFilter\n\t\t */\n\t\tthis.minFilter = NearestFilter;\n\n\t\t/**\n\t\t * This defines how the texture is wrapped in the depth and corresponds to\n\t\t * *W* in UVW mapping.\n\t\t *\n\t\t * @type {(RepeatWrapping|ClampToEdgeWrapping|MirroredRepeatWrapping)}\n\t\t * @default ClampToEdgeWrapping\n\t\t */\n\t\tthis.wrapR = ClampToEdgeWrapping;\n\n\t\t/**\n\t\t * Whether to generate mipmaps (if possible) for a texture.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.generateMipmaps = false;\n\n\t\t/**\n\t\t * If set to `true`, the texture is flipped along the vertical axis when\n\t\t * uploaded to the GPU.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.flipY = false;\n\n\t\t/**\n\t\t * Specifies the alignment requirements for the start of each pixel row in memory.\n\t\t *\n\t\t * Overwritten and set to `1` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default 1\n\t\t */\n\t\tthis.unpackAlignment = 1;\n\n\t}\n\n}\n\n/**\n * A 3D render target used in context of {@link WebGLRenderer}.\n *\n * @augments WebGLRenderTarget\n */\nclass WebGL3DRenderTarget extends WebGLRenderTarget {\n\n\t/**\n\t * Constructs a new 3D render target.\n\t *\n\t * @param {number} [width=1] - The width of the render target.\n\t * @param {number} [height=1] - The height of the render target.\n\t * @param {number} [depth=1] - The height of the render target.\n\t * @param {RenderTarget~Options} [options] - The configuration object.\n\t */\n\tconstructor( width = 1, height = 1, depth = 1, options = {} ) {\n\n\t\tsuper( width, height, options );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isWebGL3DRenderTarget = true;\n\n\t\tthis.depth = depth;\n\n\t\t/**\n\t\t * Overwritten with a different texture type.\n\t\t *\n\t\t * @type {Data3DTexture}\n\t\t */\n\t\tthis.texture = new Data3DTexture( null, width, height, depth );\n\t\tthis._setTextureOptions( options );\n\n\t\tthis.texture.isRenderTargetTexture = true;\n\n\t}\n\n}\n\n/**\n * Represents an axis-aligned bounding box (AABB) in 3D space.\n */\nclass Box3 {\n\n\t/**\n\t * Constructs a new bounding box.\n\t *\n\t * @param {Vector3} [min=(Infinity,Infinity,Infinity)] - A vector representing the lower boundary of the box.\n\t * @param {Vector3} [max=(-Infinity,-Infinity,-Infinity)] - A vector representing the upper boundary of the box.\n\t */\n\tconstructor( min = new Vector3( + Infinity, + Infinity, + Infinity ), max = new Vector3( - Infinity, - Infinity, - Infinity ) ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isBox3 = true;\n\n\t\t/**\n\t\t * The lower boundary of the box.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.min = min;\n\n\t\t/**\n\t\t * The upper boundary of the box.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.max = max;\n\n\t}\n\n\t/**\n\t * Sets the lower and upper boundaries of this box.\n\t * Please note that this method only copies the values from the given objects.\n\t *\n\t * @param {Vector3} min - The lower boundary of the box.\n\t * @param {Vector3} max - The upper boundary of the box.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tset( min, max ) {\n\n\t\tthis.min.copy( min );\n\t\tthis.max.copy( max );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the upper and lower bounds of this box so it encloses the position data\n\t * in the given array.\n\t *\n\t * @param {Array<number>} array - An array holding 3D position data.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tsetFromArray( array ) {\n\n\t\tthis.makeEmpty();\n\n\t\tfor ( let i = 0, il = array.length; i < il; i += 3 ) {\n\n\t\t\tthis.expandByPoint( _vector$b.fromArray( array, i ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the upper and lower bounds of this box so it encloses the position data\n\t * in the given buffer attribute.\n\t *\n\t * @param {BufferAttribute} attribute - A buffer attribute holding 3D position data.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tsetFromBufferAttribute( attribute ) {\n\n\t\tthis.makeEmpty();\n\n\t\tfor ( let i = 0, il = attribute.count; i < il; i ++ ) {\n\n\t\t\tthis.expandByPoint( _vector$b.fromBufferAttribute( attribute, i ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the upper and lower bounds of this box so it encloses the position data\n\t * in the given array.\n\t *\n\t * @param {Array<Vector3>} points - An array holding 3D position data as instances of {@link Vector3}.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tsetFromPoints( points ) {\n\n\t\tthis.makeEmpty();\n\n\t\tfor ( let i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\tthis.expandByPoint( points[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Centers this box on the given center vector and sets this box's width, height and\n\t * depth to the given size values.\n\t *\n\t * @param {Vector3} center - The center of the box.\n\t * @param {Vector3} size - The x, y and z dimensions of the box.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tsetFromCenterAndSize( center, size ) {\n\n\t\tconst halfSize = _vector$b.copy( size ).multiplyScalar( 0.5 );\n\n\t\tthis.min.copy( center ).sub( halfSize );\n\t\tthis.max.copy( center ).add( halfSize );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes the world-axis-aligned bounding box for the given 3D object\n\t * (including its children), accounting for the object's, and children's,\n\t * world transforms. The function may result in a larger box than strictly necessary.\n\t *\n\t * @param {Object3D} object - The 3D object to compute the bounding box for.\n\t * @param {boolean} [precise=false] - If set to `true`, the method computes the smallest\n\t * world-axis-aligned bounding box at the expense of more computation.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tsetFromObject( object, precise = false ) {\n\n\t\tthis.makeEmpty();\n\n\t\treturn this.expandByObject( object, precise );\n\n\t}\n\n\t/**\n\t * Returns a new box with copied values from this instance.\n\t *\n\t * @return {Box3} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Copies the values of the given box to this instance.\n\t *\n\t * @param {Box3} box - The box to copy.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tcopy( box ) {\n\n\t\tthis.min.copy( box.min );\n\t\tthis.max.copy( box.max );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Makes this box empty which means in encloses a zero space in 3D.\n\t *\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tmakeEmpty() {\n\n\t\tthis.min.x = this.min.y = this.min.z = + Infinity;\n\t\tthis.max.x = this.max.y = this.max.z = - Infinity;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns true if this box includes zero points within its bounds.\n\t * Note that a box with equal lower and upper bounds still includes one\n\t * point, the one both bounds share.\n\t *\n\t * @return {boolean} Whether this box is empty or not.\n\t */\n\tisEmpty() {\n\n\t\t// this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes\n\n\t\treturn ( this.max.x < this.min.x ) || ( this.max.y < this.min.y ) || ( this.max.z < this.min.z );\n\n\t}\n\n\t/**\n\t * Returns the center point of this box.\n\t *\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The center point.\n\t */\n\tgetCenter( target ) {\n\n\t\treturn this.isEmpty() ? target.set( 0, 0, 0 ) : target.addVectors( this.min, this.max ).multiplyScalar( 0.5 );\n\n\t}\n\n\t/**\n\t * Returns the dimensions of this box.\n\t *\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The size.\n\t */\n\tgetSize( target ) {\n\n\t\treturn this.isEmpty() ? target.set( 0, 0, 0 ) : target.subVectors( this.max, this.min );\n\n\t}\n\n\t/**\n\t * Expands the boundaries of this box to include the given point.\n\t *\n\t * @param {Vector3} point - The point that should be included by the bounding box.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\texpandByPoint( point ) {\n\n\t\tthis.min.min( point );\n\t\tthis.max.max( point );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Expands this box equilaterally by the given vector. The width of this\n\t * box will be expanded by the x component of the vector in both\n\t * directions. The height of this box will be expanded by the y component of\n\t * the vector in both directions. The depth of this box will be\n\t * expanded by the z component of the vector in both directions.\n\t *\n\t * @param {Vector3} vector - The vector that should expand the bounding box.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\texpandByVector( vector ) {\n\n\t\tthis.min.sub( vector );\n\t\tthis.max.add( vector );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Expands each dimension of the box by the given scalar. If negative, the\n\t * dimensions of the box will be contracted.\n\t *\n\t * @param {number} scalar - The scalar value that should expand the bounding box.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\texpandByScalar( scalar ) {\n\n\t\tthis.min.addScalar( - scalar );\n\t\tthis.max.addScalar( scalar );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Expands the boundaries of this box to include the given 3D object and\n\t * its children, accounting for the object's, and children's, world\n\t * transforms. The function may result in a larger box than strictly\n\t * necessary (unless the precise parameter is set to true).\n\t *\n\t * @param {Object3D} object - The 3D object that should expand the bounding box.\n\t * @param {boolean} precise - If set to `true`, the method expands the bounding box\n\t * as little as necessary at the expense of more computation.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\texpandByObject( object, precise = false ) {\n\n\t\t// Computes the world-axis-aligned bounding box of an object (including its children),\n\t\t// accounting for both the object's, and children's, world transforms\n\n\t\tobject.updateWorldMatrix( false, false );\n\n\t\tconst geometry = object.geometry;\n\n\t\tif ( geometry !== undefined ) {\n\n\t\t\tconst positionAttribute = geometry.getAttribute( 'position' );\n\n\t\t\t// precise AABB computation based on vertex data requires at least a position attribute.\n\t\t\t// instancing isn't supported so far and uses the normal (conservative) code path.\n\n\t\t\tif ( precise === true && positionAttribute !== undefined && object.isInstancedMesh !== true ) {\n\n\t\t\t\tfor ( let i = 0, l = positionAttribute.count; i < l; i ++ ) {\n\n\t\t\t\t\tif ( object.isMesh === true ) {\n\n\t\t\t\t\t\tobject.getVertexPosition( i, _vector$b );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_vector$b.fromBufferAttribute( positionAttribute, i );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_vector$b.applyMatrix4( object.matrixWorld );\n\t\t\t\t\tthis.expandByPoint( _vector$b );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( object.boundingBox !== undefined ) {\n\n\t\t\t\t\t// object-level bounding box\n\n\t\t\t\t\tif ( object.boundingBox === null ) {\n\n\t\t\t\t\t\tobject.computeBoundingBox();\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_box$4.copy( object.boundingBox );\n\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// geometry-level bounding box\n\n\t\t\t\t\tif ( geometry.boundingBox === null ) {\n\n\t\t\t\t\t\tgeometry.computeBoundingBox();\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_box$4.copy( geometry.boundingBox );\n\n\t\t\t\t}\n\n\t\t\t\t_box$4.applyMatrix4( object.matrixWorld );\n\n\t\t\t\tthis.union( _box$4 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst children = object.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tthis.expandByObject( children[ i ], precise );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if the given point lies within or on the boundaries of this box.\n\t *\n\t * @param {Vector3} point - The point to test.\n\t * @return {boolean} Whether the bounding box contains the given point or not.\n\t */\n\tcontainsPoint( point ) {\n\n\t\treturn point.x >= this.min.x && point.x <= this.max.x &&\n\t\t\tpoint.y >= this.min.y && point.y <= this.max.y &&\n\t\t\tpoint.z >= this.min.z && point.z <= this.max.z;\n\n\t}\n\n\t/**\n\t * Returns `true` if this bounding box includes the entirety of the given bounding box.\n\t * If this box and the given one are identical, this function also returns `true`.\n\t *\n\t * @param {Box3} box - The bounding box to test.\n\t * @return {boolean} Whether the bounding box contains the given bounding box or not.\n\t */\n\tcontainsBox( box ) {\n\n\t\treturn this.min.x <= box.min.x && box.max.x <= this.max.x &&\n\t\t\tthis.min.y <= box.min.y && box.max.y <= this.max.y &&\n\t\t\tthis.min.z <= box.min.z && box.max.z <= this.max.z;\n\n\t}\n\n\t/**\n\t * Returns a point as a proportion of this box's width, height and depth.\n\t *\n\t * @param {Vector3} point - A point in 3D space.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} A point as a proportion of this box's width, height and depth.\n\t */\n\tgetParameter( point, target ) {\n\n\t\t// This can potentially have a divide by zero if the box\n\t\t// has a size dimension of 0.\n\n\t\treturn target.set(\n\t\t\t( point.x - this.min.x ) / ( this.max.x - this.min.x ),\n\t\t\t( point.y - this.min.y ) / ( this.max.y - this.min.y ),\n\t\t\t( point.z - this.min.z ) / ( this.max.z - this.min.z )\n\t\t);\n\n\t}\n\n\t/**\n\t * Returns `true` if the given bounding box intersects with this bounding box.\n\t *\n\t * @param {Box3} box - The bounding box to test.\n\t * @return {boolean} Whether the given bounding box intersects with this bounding box.\n\t */\n\tintersectsBox( box ) {\n\n\t\t// using 6 splitting planes to rule out intersections.\n\t\treturn box.max.x >= this.min.x && box.min.x <= this.max.x &&\n\t\t\tbox.max.y >= this.min.y && box.min.y <= this.max.y &&\n\t\t\tbox.max.z >= this.min.z && box.min.z <= this.max.z;\n\n\t}\n\n\t/**\n\t * Returns `true` if the given bounding sphere intersects with this bounding box.\n\t *\n\t * @param {Sphere} sphere - The bounding sphere to test.\n\t * @return {boolean} Whether the given bounding sphere intersects with this bounding box.\n\t */\n\tintersectsSphere( sphere ) {\n\n\t\t// Find the point on the AABB closest to the sphere center.\n\t\tthis.clampPoint( sphere.center, _vector$b );\n\n\t\t// If that point is inside the sphere, the AABB and sphere intersect.\n\t\treturn _vector$b.distanceToSquared( sphere.center ) <= ( sphere.radius * sphere.radius );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given plane intersects with this bounding box.\n\t *\n\t * @param {Plane} plane - The plane to test.\n\t * @return {boolean} Whether the given plane intersects with this bounding box.\n\t */\n\tintersectsPlane( plane ) {\n\n\t\t// We compute the minimum and maximum dot product values. If those values\n\t\t// are on the same side (back or front) of the plane, then there is no intersection.\n\n\t\tlet min, max;\n\n\t\tif ( plane.normal.x > 0 ) {\n\n\t\t\tmin = plane.normal.x * this.min.x;\n\t\t\tmax = plane.normal.x * this.max.x;\n\n\t\t} else {\n\n\t\t\tmin = plane.normal.x * this.max.x;\n\t\t\tmax = plane.normal.x * this.min.x;\n\n\t\t}\n\n\t\tif ( plane.normal.y > 0 ) {\n\n\t\t\tmin += plane.normal.y * this.min.y;\n\t\t\tmax += plane.normal.y * this.max.y;\n\n\t\t} else {\n\n\t\t\tmin += plane.normal.y * this.max.y;\n\t\t\tmax += plane.normal.y * this.min.y;\n\n\t\t}\n\n\t\tif ( plane.normal.z > 0 ) {\n\n\t\t\tmin += plane.normal.z * this.min.z;\n\t\t\tmax += plane.normal.z * this.max.z;\n\n\t\t} else {\n\n\t\t\tmin += plane.normal.z * this.max.z;\n\t\t\tmax += plane.normal.z * this.min.z;\n\n\t\t}\n\n\t\treturn ( min <= - plane.constant && max >= - plane.constant );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given triangle intersects with this bounding box.\n\t *\n\t * @param {Triangle} triangle - The triangle to test.\n\t * @return {boolean} Whether the given triangle intersects with this bounding box.\n\t */\n\tintersectsTriangle( triangle ) {\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// compute box center and extents\n\t\tthis.getCenter( _center );\n\t\t_extents.subVectors( this.max, _center );\n\n\t\t// translate triangle to aabb origin\n\t\t_v0$2.subVectors( triangle.a, _center );\n\t\t_v1$7.subVectors( triangle.b, _center );\n\t\t_v2$4.subVectors( triangle.c, _center );\n\n\t\t// compute edge vectors for triangle\n\t\t_f0.subVectors( _v1$7, _v0$2 );\n\t\t_f1.subVectors( _v2$4, _v1$7 );\n\t\t_f2.subVectors( _v0$2, _v2$4 );\n\n\t\t// test against axes that are given by cross product combinations of the edges of the triangle and the edges of the aabb\n\t\t// make an axis testing of each of the 3 sides of the aabb against each of the 3 sides of the triangle = 9 axis of separation\n\t\t// axis_ij = u_i x f_j (u0, u1, u2 = face normals of aabb = x,y,z axes vectors since aabb is axis aligned)\n\t\tlet axes = [\n\t\t\t0, - _f0.z, _f0.y, 0, - _f1.z, _f1.y, 0, - _f2.z, _f2.y,\n\t\t\t_f0.z, 0, - _f0.x, _f1.z, 0, - _f1.x, _f2.z, 0, - _f2.x,\n\t\t\t- _f0.y, _f0.x, 0, - _f1.y, _f1.x, 0, - _f2.y, _f2.x, 0\n\t\t];\n\t\tif ( ! satForAxes( axes, _v0$2, _v1$7, _v2$4, _extents ) ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// test 3 face normals from the aabb\n\t\taxes = [ 1, 0, 0, 0, 1, 0, 0, 0, 1 ];\n\t\tif ( ! satForAxes( axes, _v0$2, _v1$7, _v2$4, _extents ) ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// finally testing the face normal of the triangle\n\t\t// use already existing triangle edge vectors here\n\t\t_triangleNormal.crossVectors( _f0, _f1 );\n\t\taxes = [ _triangleNormal.x, _triangleNormal.y, _triangleNormal.z ];\n\n\t\treturn satForAxes( axes, _v0$2, _v1$7, _v2$4, _extents );\n\n\t}\n\n\t/**\n\t * Clamps the given point within the bounds of this box.\n\t *\n\t * @param {Vector3} point - The point to clamp.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The clamped point.\n\t */\n\tclampPoint( point, target ) {\n\n\t\treturn target.copy( point ).clamp( this.min, this.max );\n\n\t}\n\n\t/**\n\t * Returns the euclidean distance from any edge of this box to the specified point. If\n\t * the given point lies inside of this box, the distance will be `0`.\n\t *\n\t * @param {Vector3} point - The point to compute the distance to.\n\t * @return {number} The euclidean distance.\n\t */\n\tdistanceToPoint( point ) {\n\n\t\treturn this.clampPoint( point, _vector$b ).distanceTo( point );\n\n\t}\n\n\t/**\n\t * Returns a bounding sphere that encloses this bounding box.\n\t *\n\t * @param {Sphere} target - The target sphere that is used to store the method's result.\n\t * @return {Sphere} The bounding sphere that encloses this bounding box.\n\t */\n\tgetBoundingSphere( target ) {\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\ttarget.makeEmpty();\n\n\t\t} else {\n\n\t\t\tthis.getCenter( target.center );\n\n\t\t\ttarget.radius = this.getSize( _vector$b ).length() * 0.5;\n\n\t\t}\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Computes the intersection of this bounding box and the given one, setting the upper\n\t * bound of this box to the lesser of the two boxes' upper bounds and the\n\t * lower bound of this box to the greater of the two boxes' lower bounds. If\n\t * there's no overlap, makes this box empty.\n\t *\n\t * @param {Box3} box - The bounding box to intersect with.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tintersect( box ) {\n\n\t\tthis.min.max( box.min );\n\t\tthis.max.min( box.max );\n\n\t\t// ensure that if there is no overlap, the result is fully empty, not slightly empty with non-inf/+inf values that will cause subsequence intersects to erroneously return valid values.\n\t\tif ( this.isEmpty() ) this.makeEmpty();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes the union of this box and another and the given one, setting the upper\n\t * bound of this box to the greater of the two boxes' upper bounds and the\n\t * lower bound of this box to the lesser of the two boxes' lower bounds.\n\t *\n\t * @param {Box3} box - The bounding box that will be unioned with this instance.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tunion( box ) {\n\n\t\tthis.min.min( box.min );\n\t\tthis.max.max( box.max );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Transforms this bounding box by the given 4x4 transformation matrix.\n\t *\n\t * @param {Matrix4} matrix - The transformation matrix.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tapplyMatrix4( matrix ) {\n\n\t\t// transform of empty box is an empty box.\n\t\tif ( this.isEmpty() ) return this;\n\n\t\t// NOTE: I am using a binary pattern to specify all 2^3 combinations below\n\t\t_points[ 0 ].set( this.min.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 000\n\t\t_points[ 1 ].set( this.min.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 001\n\t\t_points[ 2 ].set( this.min.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 010\n\t\t_points[ 3 ].set( this.min.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 011\n\t\t_points[ 4 ].set( this.max.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 100\n\t\t_points[ 5 ].set( this.max.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 101\n\t\t_points[ 6 ].set( this.max.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 110\n\t\t_points[ 7 ].set( this.max.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 111\n\n\t\tthis.setFromPoints( _points );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given offset to both the upper and lower bounds of this bounding box,\n\t * effectively moving it in 3D space.\n\t *\n\t * @param {Vector3} offset - The offset that should be used to translate the bounding box.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\ttranslate( offset ) {\n\n\t\tthis.min.add( offset );\n\t\tthis.max.add( offset );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this bounding box is equal with the given one.\n\t *\n\t * @param {Box3} box - The box to test for equality.\n\t * @return {boolean} Whether this bounding box is equal with the given one.\n\t */\n\tequals( box ) {\n\n\t\treturn box.min.equals( this.min ) && box.max.equals( this.max );\n\n\t}\n\n\t/**\n\t * Returns a serialized structure of the bounding box.\n\t *\n\t * @return {Object} Serialized structure with fields representing the object state.\n\t */\n\ttoJSON() {\n\n\t\treturn {\n\t\t\tmin: this.min.toArray(),\n\t\t\tmax: this.max.toArray()\n\t\t};\n\n\t}\n\n\t/**\n\t * Returns a serialized structure of the bounding box.\n\t *\n\t * @param {Object} json - The serialized json to set the box from.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tfromJSON( json ) {\n\n\t\tthis.min.fromArray( json.min );\n\t\tthis.max.fromArray( json.max );\n\t\treturn this;\n\n\t}\n\n}\n\nconst _points = [\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3()\n];\n\nconst _vector$b = /*@__PURE__*/ new Vector3();\n\nconst _box$4 = /*@__PURE__*/ new Box3();\n\n// triangle centered vertices\n\nconst _v0$2 = /*@__PURE__*/ new Vector3();\nconst _v1$7 = /*@__PURE__*/ new Vector3();\nconst _v2$4 = /*@__PURE__*/ new Vector3();\n\n// triangle edge vectors\n\nconst _f0 = /*@__PURE__*/ new Vector3();\nconst _f1 = /*@__PURE__*/ new Vector3();\nconst _f2 = /*@__PURE__*/ new Vector3();\n\nconst _center = /*@__PURE__*/ new Vector3();\nconst _extents = /*@__PURE__*/ new Vector3();\nconst _triangleNormal = /*@__PURE__*/ new Vector3();\nconst _testAxis = /*@__PURE__*/ new Vector3();\n\nfunction satForAxes( axes, v0, v1, v2, extents ) {\n\n\tfor ( let i = 0, j = axes.length - 3; i <= j; i += 3 ) {\n\n\t\t_testAxis.fromArray( axes, i );\n\t\t// project the aabb onto the separating axis\n\t\tconst r = extents.x * Math.abs( _testAxis.x ) + extents.y * Math.abs( _testAxis.y ) + extents.z * Math.abs( _testAxis.z );\n\t\t// project all 3 vertices of the triangle onto the separating axis\n\t\tconst p0 = v0.dot( _testAxis );\n\t\tconst p1 = v1.dot( _testAxis );\n\t\tconst p2 = v2.dot( _testAxis );\n\t\t// actual test, basically see if either of the most extreme of the triangle points intersects r\n\t\tif ( Math.max( - Math.max( p0, p1, p2 ), Math.min( p0, p1, p2 ) ) > r ) {\n\n\t\t\t// points of the projected triangle are outside the projected half-length of the aabb\n\t\t\t// the axis is separating and we can exit\n\t\t\treturn false;\n\n\t\t}\n\n\t}\n\n\treturn true;\n\n}\n\nconst _box$3 = /*@__PURE__*/ new Box3();\nconst _v1$6 = /*@__PURE__*/ new Vector3();\nconst _v2$3 = /*@__PURE__*/ new Vector3();\n\n/**\n * An analytical 3D sphere defined by a center and radius. This class is mainly\n * used as a Bounding Sphere for 3D objects.\n */\nclass Sphere {\n\n\t/**\n\t * Constructs a new sphere.\n\t *\n\t * @param {Vector3} [center=(0,0,0)] - The center of the sphere\n\t * @param {number} [radius=-1] - The radius of the sphere.\n\t */\n\tconstructor( center = new Vector3(), radius = -1 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSphere = true;\n\n\t\t/**\n\t\t * The center of the sphere\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.center = center;\n\n\t\t/**\n\t\t * The radius of the sphere.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.radius = radius;\n\n\t}\n\n\t/**\n\t * Sets the sphere's components by copying the given values.\n\t *\n\t * @param {Vector3} center - The center.\n\t * @param {number} radius - The radius.\n\t * @return {Sphere} A reference to this sphere.\n\t */\n\tset( center, radius ) {\n\n\t\tthis.center.copy( center );\n\t\tthis.radius = radius;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes the minimum bounding sphere for list of points.\n\t * If the optional center point is given, it is used as the sphere's\n\t * center. Otherwise, the center of the axis-aligned bounding box\n\t * encompassing the points is calculated.\n\t *\n\t * @param {Array<Vector3>} points - A list of points in 3D space.\n\t * @param {Vector3} [optionalCenter] - The center of the sphere.\n\t * @return {Sphere} A reference to this sphere.\n\t */\n\tsetFromPoints( points, optionalCenter ) {\n\n\t\tconst center = this.center;\n\n\t\tif ( optionalCenter !== undefined ) {\n\n\t\t\tcenter.copy( optionalCenter );\n\n\t\t} else {\n\n\t\t\t_box$3.setFromPoints( points ).getCenter( center );\n\n\t\t}\n\n\t\tlet maxRadiusSq = 0;\n\n\t\tfor ( let i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( points[ i ] ) );\n\n\t\t}\n\n\t\tthis.radius = Math.sqrt( maxRadiusSq );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the values of the given sphere to this instance.\n\t *\n\t * @param {Sphere} sphere - The sphere to copy.\n\t * @return {Sphere} A reference to this sphere.\n\t */\n\tcopy( sphere ) {\n\n\t\tthis.center.copy( sphere.center );\n\t\tthis.radius = sphere.radius;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if the sphere is empty (the radius set to a negative number).\n\t *\n\t * Spheres with a radius of `0` contain only their center point and are not\n\t * considered to be empty.\n\t *\n\t * @return {boolean} Whether this sphere is empty or not.\n\t */\n\tisEmpty() {\n\n\t\treturn ( this.radius < 0 );\n\n\t}\n\n\t/**\n\t * Makes this sphere empty which means in encloses a zero space in 3D.\n\t *\n\t * @return {Sphere} A reference to this sphere.\n\t */\n\tmakeEmpty() {\n\n\t\tthis.center.set( 0, 0, 0 );\n\t\tthis.radius = -1;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this sphere contains the given point inclusive of\n\t * the surface of the sphere.\n\t *\n\t * @param {Vector3} point - The point to check.\n\t * @return {boolean} Whether this sphere contains the given point or not.\n\t */\n\tcontainsPoint( point ) {\n\n\t\treturn ( point.distanceToSquared( this.center ) <= ( this.radius * this.radius ) );\n\n\t}\n\n\t/**\n\t * Returns the closest distance from the boundary of the sphere to the\n\t * given point. If the sphere contains the point, the distance will\n\t * be negative.\n\t *\n\t * @param {Vector3} point - The point to compute the distance to.\n\t * @return {number} The distance to the point.\n\t */\n\tdistanceToPoint( point ) {\n\n\t\treturn ( point.distanceTo( this.center ) - this.radius );\n\n\t}\n\n\t/**\n\t * Returns `true` if this sphere intersects with the given one.\n\t *\n\t * @param {Sphere} sphere - The sphere to test.\n\t * @return {boolean} Whether this sphere intersects with the given one or not.\n\t */\n\tintersectsSphere( sphere ) {\n\n\t\tconst radiusSum = this.radius + sphere.radius;\n\n\t\treturn sphere.center.distanceToSquared( this.center ) <= ( radiusSum * radiusSum );\n\n\t}\n\n\t/**\n\t * Returns `true` if this sphere intersects with the given box.\n\t *\n\t * @param {Box3} box - The box to test.\n\t * @return {boolean} Whether this sphere intersects with the given box or not.\n\t */\n\tintersectsBox( box ) {\n\n\t\treturn box.intersectsSphere( this );\n\n\t}\n\n\t/**\n\t * Returns `true` if this sphere intersects with the given plane.\n\t *\n\t * @param {Plane} plane - The plane to test.\n\t * @return {boolean} Whether this sphere intersects with the given plane or not.\n\t */\n\tintersectsPlane( plane ) {\n\n\t\treturn Math.abs( plane.distanceToPoint( this.center ) ) <= this.radius;\n\n\t}\n\n\t/**\n\t * Clamps a point within the sphere. If the point is outside the sphere, it\n\t * will clamp it to the closest point on the edge of the sphere. Points\n\t * already inside the sphere will not be affected.\n\t *\n\t * @param {Vector3} point - The plane to clamp.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The clamped point.\n\t */\n\tclampPoint( point, target ) {\n\n\t\tconst deltaLengthSq = this.center.distanceToSquared( point );\n\n\t\ttarget.copy( point );\n\n\t\tif ( deltaLengthSq > ( this.radius * this.radius ) ) {\n\n\t\t\ttarget.sub( this.center ).normalize();\n\t\t\ttarget.multiplyScalar( this.radius ).add( this.center );\n\n\t\t}\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Returns a bounding box that encloses this sphere.\n\t *\n\t * @param {Box3} target - The target box that is used to store the method's result.\n\t * @return {Box3} The bounding box that encloses this sphere.\n\t */\n\tgetBoundingBox( target ) {\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\t// Empty sphere produces empty bounding box\n\t\t\ttarget.makeEmpty();\n\t\t\treturn target;\n\n\t\t}\n\n\t\ttarget.set( this.center, this.center );\n\t\ttarget.expandByScalar( this.radius );\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Transforms this sphere with the given 4x4 transformation matrix.\n\t *\n\t * @param {Matrix4} matrix - The transformation matrix.\n\t * @return {Sphere} A reference to this sphere.\n\t */\n\tapplyMatrix4( matrix ) {\n\n\t\tthis.center.applyMatrix4( matrix );\n\t\tthis.radius = this.radius * matrix.getMaxScaleOnAxis();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Translates the sphere's center by the given offset.\n\t *\n\t * @param {Vector3} offset - The offset.\n\t * @return {Sphere} A reference to this sphere.\n\t */\n\ttranslate( offset ) {\n\n\t\tthis.center.add( offset );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Expands the boundaries of this sphere to include the given point.\n\t *\n\t * @param {Vector3} point - The point to include.\n\t * @return {Sphere} A reference to this sphere.\n\t */\n\texpandByPoint( point ) {\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\tthis.center.copy( point );\n\n\t\t\tthis.radius = 0;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\t_v1$6.subVectors( point, this.center );\n\n\t\tconst lengthSq = _v1$6.lengthSq();\n\n\t\tif ( lengthSq > ( this.radius * this.radius ) ) {\n\n\t\t\t// calculate the minimal sphere\n\n\t\t\tconst length = Math.sqrt( lengthSq );\n\n\t\t\tconst delta = ( length - this.radius ) * 0.5;\n\n\t\t\tthis.center.addScaledVector( _v1$6, delta / length );\n\n\t\t\tthis.radius += delta;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Expands this sphere to enclose both the original sphere and the given sphere.\n\t *\n\t * @param {Sphere} sphere - The sphere to include.\n\t * @return {Sphere} A reference to this sphere.\n\t */\n\tunion( sphere ) {\n\n\t\tif ( sphere.isEmpty() ) {\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\tthis.copy( sphere );\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tif ( this.center.equals( sphere.center ) === true ) {\n\n\t\t\t this.radius = Math.max( this.radius, sphere.radius );\n\n\t\t} else {\n\n\t\t\t_v2$3.subVectors( sphere.center, this.center ).setLength( sphere.radius );\n\n\t\t\tthis.expandByPoint( _v1$6.copy( sphere.center ).add( _v2$3 ) );\n\n\t\t\tthis.expandByPoint( _v1$6.copy( sphere.center ).sub( _v2$3 ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this sphere is equal with the given one.\n\t *\n\t * @param {Sphere} sphere - The sphere to test for equality.\n\t * @return {boolean} Whether this bounding sphere is equal with the given one.\n\t */\n\tequals( sphere ) {\n\n\t\treturn sphere.center.equals( this.center ) && ( sphere.radius === this.radius );\n\n\t}\n\n\t/**\n\t * Returns a new sphere with copied values from this instance.\n\t *\n\t * @return {Sphere} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Returns a serialized structure of the bounding sphere.\n\t *\n\t * @return {Object} Serialized structure with fields representing the object state.\n\t */\n\ttoJSON() {\n\n\t\treturn {\n\t\t\tradius: this.radius,\n\t\t\tcenter: this.center.toArray()\n\t\t};\n\n\t}\n\n\t/**\n\t * Returns a serialized structure of the bounding sphere.\n\t *\n\t * @param {Object} json - The serialized json to set the sphere from.\n\t * @return {Box3} A reference to this bounding sphere.\n\t */\n\tfromJSON( json ) {\n\n\t\tthis.radius = json.radius;\n\t\tthis.center.fromArray( json.center );\n\t\treturn this;\n\n\t}\n\n}\n\nconst _vector$a = /*@__PURE__*/ new Vector3();\nconst _segCenter = /*@__PURE__*/ new Vector3();\nconst _segDir = /*@__PURE__*/ new Vector3();\nconst _diff = /*@__PURE__*/ new Vector3();\n\nconst _edge1 = /*@__PURE__*/ new Vector3();\nconst _edge2 = /*@__PURE__*/ new Vector3();\nconst _normal$1 = /*@__PURE__*/ new Vector3();\n\n/**\n * A ray that emits from an origin in a certain direction. The class is used by\n * {@link Raycaster} to assist with raycasting. Raycasting is used for\n * mouse picking (working out what objects in the 3D space the mouse is over)\n * amongst other things.\n */\nclass Ray {\n\n\t/**\n\t * Constructs a new ray.\n\t *\n\t * @param {Vector3} [origin=(0,0,0)] - The origin of the ray.\n\t * @param {Vector3} [direction=(0,0,-1)] - The (normalized) direction of the ray.\n\t */\n\tconstructor( origin = new Vector3(), direction = new Vector3( 0, 0, -1 ) ) {\n\n\t\t/**\n\t\t * The origin of the ray.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.origin = origin;\n\n\t\t/**\n\t\t * The (normalized) direction of the ray.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.direction = direction;\n\n\t}\n\n\t/**\n\t * Sets the ray's components by copying the given values.\n\t *\n\t * @param {Vector3} origin - The origin.\n\t * @param {Vector3} direction - The direction.\n\t * @return {Ray} A reference to this ray.\n\t */\n\tset( origin, direction ) {\n\n\t\tthis.origin.copy( origin );\n\t\tthis.direction.copy( direction );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the values of the given ray to this instance.\n\t *\n\t * @param {Ray} ray - The ray to copy.\n\t * @return {Ray} A reference to this ray.\n\t */\n\tcopy( ray ) {\n\n\t\tthis.origin.copy( ray.origin );\n\t\tthis.direction.copy( ray.direction );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a vector that is located at a given distance along this ray.\n\t *\n\t * @param {number} t - The distance along the ray to retrieve a position for.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} A position on the ray.\n\t */\n\tat( t, target ) {\n\n\t\treturn target.copy( this.origin ).addScaledVector( this.direction, t );\n\n\t}\n\n\t/**\n\t * Adjusts the direction of the ray to point at the given vector in world space.\n\t *\n\t * @param {Vector3} v - The target position.\n\t * @return {Ray} A reference to this ray.\n\t */\n\tlookAt( v ) {\n\n\t\tthis.direction.copy( v ).sub( this.origin ).normalize();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Shift the origin of this ray along its direction by the given distance.\n\t *\n\t * @param {number} t - The distance along the ray to interpolate.\n\t * @return {Ray} A reference to this ray.\n\t */\n\trecast( t ) {\n\n\t\tthis.origin.copy( this.at( t, _vector$a ) );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the point along this ray that is closest to the given point.\n\t *\n\t * @param {Vector3} point - A point in 3D space to get the closet location on the ray for.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The closest point on this ray.\n\t */\n\tclosestPointToPoint( point, target ) {\n\n\t\ttarget.subVectors( point, this.origin );\n\n\t\tconst directionDistance = target.dot( this.direction );\n\n\t\tif ( directionDistance < 0 ) {\n\n\t\t\treturn target.copy( this.origin );\n\n\t\t}\n\n\t\treturn target.copy( this.origin ).addScaledVector( this.direction, directionDistance );\n\n\t}\n\n\t/**\n\t * Returns the distance of the closest approach between this ray and the given point.\n\t *\n\t * @param {Vector3} point - A point in 3D space to compute the distance to.\n\t * @return {number} The distance.\n\t */\n\tdistanceToPoint( point ) {\n\n\t\treturn Math.sqrt( this.distanceSqToPoint( point ) );\n\n\t}\n\n\t/**\n\t * Returns the squared distance of the closest approach between this ray and the given point.\n\t *\n\t * @param {Vector3} point - A point in 3D space to compute the distance to.\n\t * @return {number} The squared distance.\n\t */\n\tdistanceSqToPoint( point ) {\n\n\t\tconst directionDistance = _vector$a.subVectors( point, this.origin ).dot( this.direction );\n\n\t\t// point behind the ray\n\n\t\tif ( directionDistance < 0 ) {\n\n\t\t\treturn this.origin.distanceToSquared( point );\n\n\t\t}\n\n\t\t_vector$a.copy( this.origin ).addScaledVector( this.direction, directionDistance );\n\n\t\treturn _vector$a.distanceToSquared( point );\n\n\t}\n\n\t/**\n\t * Returns the squared distance between this ray and the given line segment.\n\t *\n\t * @param {Vector3} v0 - The start point of the line segment.\n\t * @param {Vector3} v1 - The end point of the line segment.\n\t * @param {Vector3} [optionalPointOnRay] - When provided, it receives the point on this ray that is closest to the segment.\n\t * @param {Vector3} [optionalPointOnSegment] - When provided, it receives the point on the line segment that is closest to this ray.\n\t * @return {number} The squared distance.\n\t */\n\tdistanceSqToSegment( v0, v1, optionalPointOnRay, optionalPointOnSegment ) {\n\n\t\t// from https://github.com/pmjoniak/GeometricTools/blob/master/GTEngine/Include/Mathematics/GteDistRaySegment.h\n\t\t// It returns the min distance between the ray and the segment\n\t\t// defined by v0 and v1\n\t\t// It can also set two optional targets :\n\t\t// - The closest point on the ray\n\t\t// - The closest point on the segment\n\n\t\t_segCenter.copy( v0 ).add( v1 ).multiplyScalar( 0.5 );\n\t\t_segDir.copy( v1 ).sub( v0 ).normalize();\n\t\t_diff.copy( this.origin ).sub( _segCenter );\n\n\t\tconst segExtent = v0.distanceTo( v1 ) * 0.5;\n\t\tconst a01 = - this.direction.dot( _segDir );\n\t\tconst b0 = _diff.dot( this.direction );\n\t\tconst b1 = - _diff.dot( _segDir );\n\t\tconst c = _diff.lengthSq();\n\t\tconst det = Math.abs( 1 - a01 * a01 );\n\t\tlet s0, s1, sqrDist, extDet;\n\n\t\tif ( det > 0 ) {\n\n\t\t\t// The ray and segment are not parallel.\n\n\t\t\ts0 = a01 * b1 - b0;\n\t\t\ts1 = a01 * b0 - b1;\n\t\t\textDet = segExtent * det;\n\n\t\t\tif ( s0 >= 0 ) {\n\n\t\t\t\tif ( s1 >= - extDet ) {\n\n\t\t\t\t\tif ( s1 <= extDet ) {\n\n\t\t\t\t\t\t// region 0\n\t\t\t\t\t\t// Minimum at interior points of ray and segment.\n\n\t\t\t\t\t\tconst invDet = 1 / det;\n\t\t\t\t\t\ts0 *= invDet;\n\t\t\t\t\t\ts1 *= invDet;\n\t\t\t\t\t\tsqrDist = s0 * ( s0 + a01 * s1 + 2 * b0 ) + s1 * ( a01 * s0 + s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// region 1\n\n\t\t\t\t\t\ts1 = segExtent;\n\t\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// region 5\n\n\t\t\t\t\ts1 = - segExtent;\n\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( s1 <= - extDet ) {\n\n\t\t\t\t\t// region 4\n\n\t\t\t\t\ts0 = Math.max( 0, - ( - a01 * segExtent + b0 ) );\n\t\t\t\t\ts1 = ( s0 > 0 ) ? - segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t} else if ( s1 <= extDet ) {\n\n\t\t\t\t\t// region 3\n\n\t\t\t\t\ts0 = 0;\n\t\t\t\t\ts1 = Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\tsqrDist = s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// region 2\n\n\t\t\t\t\ts0 = Math.max( 0, - ( a01 * segExtent + b0 ) );\n\t\t\t\t\ts1 = ( s0 > 0 ) ? segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// Ray and segment are parallel.\n\n\t\t\ts1 = ( a01 > 0 ) ? - segExtent : segExtent;\n\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t}\n\n\t\tif ( optionalPointOnRay ) {\n\n\t\t\toptionalPointOnRay.copy( this.origin ).addScaledVector( this.direction, s0 );\n\n\t\t}\n\n\t\tif ( optionalPointOnSegment ) {\n\n\t\t\toptionalPointOnSegment.copy( _segCenter ).addScaledVector( _segDir, s1 );\n\n\t\t}\n\n\t\treturn sqrDist;\n\n\t}\n\n\t/**\n\t * Intersects this ray with the given sphere, returning the intersection\n\t * point or `null` if there is no intersection.\n\t *\n\t * @param {Sphere} sphere - The sphere to intersect.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {?Vector3} The intersection point.\n\t */\n\tintersectSphere( sphere, target ) {\n\n\t\t_vector$a.subVectors( sphere.center, this.origin );\n\t\tconst tca = _vector$a.dot( this.direction );\n\t\tconst d2 = _vector$a.dot( _vector$a ) - tca * tca;\n\t\tconst radius2 = sphere.radius * sphere.radius;\n\n\t\tif ( d2 > radius2 ) return null;\n\n\t\tconst thc = Math.sqrt( radius2 - d2 );\n\n\t\t// t0 = first intersect point - entrance on front of sphere\n\t\tconst t0 = tca - thc;\n\n\t\t// t1 = second intersect point - exit point on back of sphere\n\t\tconst t1 = tca + thc;\n\n\t\t// test to see if t1 is behind the ray - if so, return null\n\t\tif ( t1 < 0 ) return null;\n\n\t\t// test to see if t0 is behind the ray:\n\t\t// if it is, the ray is inside the sphere, so return the second exit point scaled by t1,\n\t\t// in order to always return an intersect point that is in front of the ray.\n\t\tif ( t0 < 0 ) return this.at( t1, target );\n\n\t\t// else t0 is in front of the ray, so return the first collision point scaled by t0\n\t\treturn this.at( t0, target );\n\n\t}\n\n\t/**\n\t * Returns `true` if this ray intersects with the given sphere.\n\t *\n\t * @param {Sphere} sphere - The sphere to intersect.\n\t * @return {boolean} Whether this ray intersects with the given sphere or not.\n\t */\n\tintersectsSphere( sphere ) {\n\n\t\tif ( sphere.radius < 0 ) return false; // handle empty spheres, see #31187\n\n\t\treturn this.distanceSqToPoint( sphere.center ) <= ( sphere.radius * sphere.radius );\n\n\t}\n\n\t/**\n\t * Computes the distance from the ray's origin to the given plane. Returns `null` if the ray\n\t * does not intersect with the plane.\n\t *\n\t * @param {Plane} plane - The plane to compute the distance to.\n\t * @return {?number} Whether this ray intersects with the given sphere or not.\n\t */\n\tdistanceToPlane( plane ) {\n\n\t\tconst denominator = plane.normal.dot( this.direction );\n\n\t\tif ( denominator === 0 ) {\n\n\t\t\t// line is coplanar, return origin\n\t\t\tif ( plane.distanceToPoint( this.origin ) === 0 ) {\n\n\t\t\t\treturn 0;\n\n\t\t\t}\n\n\t\t\t// Null is preferable to undefined since undefined means.... it is undefined\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst t = - ( this.origin.dot( plane.normal ) + plane.constant ) / denominator;\n\n\t\t// Return if the ray never intersects the plane\n\n\t\treturn t >= 0 ? t : null;\n\n\t}\n\n\t/**\n\t * Intersects this ray with the given plane, returning the intersection\n\t * point or `null` if there is no intersection.\n\t *\n\t * @param {Plane} plane - The plane to intersect.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {?Vector3} The intersection point.\n\t */\n\tintersectPlane( plane, target ) {\n\n\t\tconst t = this.distanceToPlane( plane );\n\n\t\tif ( t === null ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\treturn this.at( t, target );\n\n\t}\n\n\t/**\n\t * Returns `true` if this ray intersects with the given plane.\n\t *\n\t * @param {Plane} plane - The plane to intersect.\n\t * @return {boolean} Whether this ray intersects with the given plane or not.\n\t */\n\tintersectsPlane( plane ) {\n\n\t\t// check if the ray lies on the plane first\n\n\t\tconst distToPoint = plane.distanceToPoint( this.origin );\n\n\t\tif ( distToPoint === 0 ) {\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\tconst denominator = plane.normal.dot( this.direction );\n\n\t\tif ( denominator * distToPoint < 0 ) {\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\t// ray origin is behind the plane (and is pointing behind it)\n\n\t\treturn false;\n\n\t}\n\n\t/**\n\t * Intersects this ray with the given bounding box, returning the intersection\n\t * point or `null` if there is no intersection.\n\t *\n\t * @param {Box3} box - The box to intersect.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {?Vector3} The intersection point.\n\t */\n\tintersectBox( box, target ) {\n\n\t\tlet tmin, tmax, tymin, tymax, tzmin, tzmax;\n\n\t\tconst invdirx = 1 / this.direction.x,\n\t\t\tinvdiry = 1 / this.direction.y,\n\t\t\tinvdirz = 1 / this.direction.z;\n\n\t\tconst origin = this.origin;\n\n\t\tif ( invdirx >= 0 ) {\n\n\t\t\ttmin = ( box.min.x - origin.x ) * invdirx;\n\t\t\ttmax = ( box.max.x - origin.x ) * invdirx;\n\n\t\t} else {\n\n\t\t\ttmin = ( box.max.x - origin.x ) * invdirx;\n\t\t\ttmax = ( box.min.x - origin.x ) * invdirx;\n\n\t\t}\n\n\t\tif ( invdiry >= 0 ) {\n\n\t\t\ttymin = ( box.min.y - origin.y ) * invdiry;\n\t\t\ttymax = ( box.max.y - origin.y ) * invdiry;\n\n\t\t} else {\n\n\t\t\ttymin = ( box.max.y - origin.y ) * invdiry;\n\t\t\ttymax = ( box.min.y - origin.y ) * invdiry;\n\n\t\t}\n\n\t\tif ( ( tmin > tymax ) || ( tymin > tmax ) ) return null;\n\n\t\tif ( tymin > tmin || isNaN( tmin ) ) tmin = tymin;\n\n\t\tif ( tymax < tmax || isNaN( tmax ) ) tmax = tymax;\n\n\t\tif ( invdirz >= 0 ) {\n\n\t\t\ttzmin = ( box.min.z - origin.z ) * invdirz;\n\t\t\ttzmax = ( box.max.z - origin.z ) * invdirz;\n\n\t\t} else {\n\n\t\t\ttzmin = ( box.max.z - origin.z ) * invdirz;\n\t\t\ttzmax = ( box.min.z - origin.z ) * invdirz;\n\n\t\t}\n\n\t\tif ( ( tmin > tzmax ) || ( tzmin > tmax ) ) return null;\n\n\t\tif ( tzmin > tmin || tmin !== tmin ) tmin = tzmin;\n\n\t\tif ( tzmax < tmax || tmax !== tmax ) tmax = tzmax;\n\n\t\t//return point closest to the ray (positive side)\n\n\t\tif ( tmax < 0 ) return null;\n\n\t\treturn this.at( tmin >= 0 ? tmin : tmax, target );\n\n\t}\n\n\t/**\n\t * Returns `true` if this ray intersects with the given box.\n\t *\n\t * @param {Box3} box - The box to intersect.\n\t * @return {boolean} Whether this ray intersects with the given box or not.\n\t */\n\tintersectsBox( box ) {\n\n\t\treturn this.intersectBox( box, _vector$a ) !== null;\n\n\t}\n\n\t/**\n\t * Intersects this ray with the given triangle, returning the intersection\n\t * point or `null` if there is no intersection.\n\t *\n\t * @param {Vector3} a - The first vertex of the triangle.\n\t * @param {Vector3} b - The second vertex of the triangle.\n\t * @param {Vector3} c - The third vertex of the triangle.\n\t * @param {boolean} backfaceCulling - Whether to use backface culling or not.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {?Vector3} The intersection point.\n\t */\n\tintersectTriangle( a, b, c, backfaceCulling, target ) {\n\n\t\t// Compute the offset origin, edges, and normal.\n\n\t\t// from https://github.com/pmjoniak/GeometricTools/blob/master/GTEngine/Include/Mathematics/GteIntrRay3Triangle3.h\n\n\t\t_edge1.subVectors( b, a );\n\t\t_edge2.subVectors( c, a );\n\t\t_normal$1.crossVectors( _edge1, _edge2 );\n\n\t\t// Solve Q + t*D = b1*E1 + b2*E2 (Q = kDiff, D = ray direction,\n\t\t// E1 = kEdge1, E2 = kEdge2, N = Cross(E1,E2)) by\n\t\t//   |Dot(D,N)|*b1 = sign(Dot(D,N))*Dot(D,Cross(Q,E2))\n\t\t//   |Dot(D,N)|*b2 = sign(Dot(D,N))*Dot(D,Cross(E1,Q))\n\t\t//   |Dot(D,N)|*t = -sign(Dot(D,N))*Dot(Q,N)\n\t\tlet DdN = this.direction.dot( _normal$1 );\n\t\tlet sign;\n\n\t\tif ( DdN > 0 ) {\n\n\t\t\tif ( backfaceCulling ) return null;\n\t\t\tsign = 1;\n\n\t\t} else if ( DdN < 0 ) {\n\n\t\t\tsign = -1;\n\t\t\tDdN = - DdN;\n\n\t\t} else {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t_diff.subVectors( this.origin, a );\n\t\tconst DdQxE2 = sign * this.direction.dot( _edge2.crossVectors( _diff, _edge2 ) );\n\n\t\t// b1 < 0, no intersection\n\t\tif ( DdQxE2 < 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst DdE1xQ = sign * this.direction.dot( _edge1.cross( _diff ) );\n\n\t\t// b2 < 0, no intersection\n\t\tif ( DdE1xQ < 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// b1+b2 > 1, no intersection\n\t\tif ( DdQxE2 + DdE1xQ > DdN ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// Line intersects triangle, check if ray does.\n\t\tconst QdN = - sign * _diff.dot( _normal$1 );\n\n\t\t// t < 0, no intersection\n\t\tif ( QdN < 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// Ray intersects triangle.\n\t\treturn this.at( QdN / DdN, target );\n\n\t}\n\n\t/**\n\t * Transforms this ray with the given 4x4 transformation matrix.\n\t *\n\t * @param {Matrix4} matrix4 - The transformation matrix.\n\t * @return {Ray} A reference to this ray.\n\t */\n\tapplyMatrix4( matrix4 ) {\n\n\t\tthis.origin.applyMatrix4( matrix4 );\n\t\tthis.direction.transformDirection( matrix4 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this ray is equal with the given one.\n\t *\n\t * @param {Ray} ray - The ray to test for equality.\n\t * @return {boolean} Whether this ray is equal with the given one.\n\t */\n\tequals( ray ) {\n\n\t\treturn ray.origin.equals( this.origin ) && ray.direction.equals( this.direction );\n\n\t}\n\n\t/**\n\t * Returns a new ray with copied values from this instance.\n\t *\n\t * @return {Ray} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\n/**\n * Represents a 4x4 matrix.\n *\n * The most common use of a 4x4 matrix in 3D computer graphics is as a transformation matrix.\n * For an introduction to transformation matrices as used in WebGL, check out [this tutorial](https://www.opengl-tutorial.org/beginners-tutorials/tutorial-3-matrices)\n *\n * This allows a 3D vector representing a point in 3D space to undergo\n * transformations such as translation, rotation, shear, scale, reflection,\n * orthogonal or perspective projection and so on, by being multiplied by the\n * matrix. This is known as `applying` the matrix to the vector.\n *\n * A Note on Row-Major and Column-Major Ordering:\n *\n * The constructor and {@link Matrix3#set} method take arguments in\n * [row-major](https://en.wikipedia.org/wiki/Row-_and_column-major_order#Column-major_order)\n * order, while internally they are stored in the {@link Matrix3#elements} array in column-major order.\n * This means that calling:\n * ```js\n * const m = new THREE.Matrix4();\n * m.set( 11, 12, 13, 14,\n *        21, 22, 23, 24,\n *        31, 32, 33, 34,\n *        41, 42, 43, 44 );\n * ```\n * will result in the elements array containing:\n * ```js\n * m.elements = [ 11, 21, 31, 41,\n *                12, 22, 32, 42,\n *                13, 23, 33, 43,\n *                14, 24, 34, 44 ];\n * ```\n * and internally all calculations are performed using column-major ordering.\n * However, as the actual ordering makes no difference mathematically and\n * most people are used to thinking about matrices in row-major order, the\n * three.js documentation shows matrices in row-major order. Just bear in\n * mind that if you are reading the source code, you'll have to take the\n * transpose of any matrices outlined here to make sense of the calculations.\n */\nclass Matrix4 {\n\n\t/**\n\t * Constructs a new 4x4 matrix. The arguments are supposed to be\n\t * in row-major order. If no arguments are provided, the constructor\n\t * initializes the matrix as an identity matrix.\n\t *\n\t * @param {number} [n11] - 1-1 matrix element.\n\t * @param {number} [n12] - 1-2 matrix element.\n\t * @param {number} [n13] - 1-3 matrix element.\n\t * @param {number} [n14] - 1-4 matrix element.\n\t * @param {number} [n21] - 2-1 matrix element.\n\t * @param {number} [n22] - 2-2 matrix element.\n\t * @param {number} [n23] - 2-3 matrix element.\n\t * @param {number} [n24] - 2-4 matrix element.\n\t * @param {number} [n31] - 3-1 matrix element.\n\t * @param {number} [n32] - 3-2 matrix element.\n\t * @param {number} [n33] - 3-3 matrix element.\n\t * @param {number} [n34] - 3-4 matrix element.\n\t * @param {number} [n41] - 4-1 matrix element.\n\t * @param {number} [n42] - 4-2 matrix element.\n\t * @param {number} [n43] - 4-3 matrix element.\n\t * @param {number} [n44] - 4-4 matrix element.\n\t */\n\tconstructor( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tMatrix4.prototype.isMatrix4 = true;\n\n\t\t/**\n\t\t * A column-major list of matrix values.\n\t\t *\n\t\t * @type {Array<number>}\n\t\t */\n\t\tthis.elements = [\n\n\t\t\t1, 0, 0, 0,\n\t\t\t0, 1, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t];\n\n\t\tif ( n11 !== undefined ) {\n\n\t\t\tthis.set( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the elements of the matrix.The arguments are supposed to be\n\t * in row-major order.\n\t *\n\t * @param {number} [n11] - 1-1 matrix element.\n\t * @param {number} [n12] - 1-2 matrix element.\n\t * @param {number} [n13] - 1-3 matrix element.\n\t * @param {number} [n14] - 1-4 matrix element.\n\t * @param {number} [n21] - 2-1 matrix element.\n\t * @param {number} [n22] - 2-2 matrix element.\n\t * @param {number} [n23] - 2-3 matrix element.\n\t * @param {number} [n24] - 2-4 matrix element.\n\t * @param {number} [n31] - 3-1 matrix element.\n\t * @param {number} [n32] - 3-2 matrix element.\n\t * @param {number} [n33] - 3-3 matrix element.\n\t * @param {number} [n34] - 3-4 matrix element.\n\t * @param {number} [n41] - 4-1 matrix element.\n\t * @param {number} [n42] - 4-2 matrix element.\n\t * @param {number} [n43] - 4-3 matrix element.\n\t * @param {number} [n44] - 4-4 matrix element.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tset( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] = n11; te[ 4 ] = n12; te[ 8 ] = n13; te[ 12 ] = n14;\n\t\tte[ 1 ] = n21; te[ 5 ] = n22; te[ 9 ] = n23; te[ 13 ] = n24;\n\t\tte[ 2 ] = n31; te[ 6 ] = n32; te[ 10 ] = n33; te[ 14 ] = n34;\n\t\tte[ 3 ] = n41; te[ 7 ] = n42; te[ 11 ] = n43; te[ 15 ] = n44;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix to the 4x4 identity matrix.\n\t *\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tidentity() {\n\n\t\tthis.set(\n\n\t\t\t1, 0, 0, 0,\n\t\t\t0, 1, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a matrix with copied values from this instance.\n\t *\n\t * @return {Matrix4} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new Matrix4().fromArray( this.elements );\n\n\t}\n\n\t/**\n\t * Copies the values of the given matrix to this instance.\n\t *\n\t * @param {Matrix4} m - The matrix to copy.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tcopy( m ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = m.elements;\n\n\t\tte[ 0 ] = me[ 0 ]; te[ 1 ] = me[ 1 ]; te[ 2 ] = me[ 2 ]; te[ 3 ] = me[ 3 ];\n\t\tte[ 4 ] = me[ 4 ]; te[ 5 ] = me[ 5 ]; te[ 6 ] = me[ 6 ]; te[ 7 ] = me[ 7 ];\n\t\tte[ 8 ] = me[ 8 ]; te[ 9 ] = me[ 9 ]; te[ 10 ] = me[ 10 ]; te[ 11 ] = me[ 11 ];\n\t\tte[ 12 ] = me[ 12 ]; te[ 13 ] = me[ 13 ]; te[ 14 ] = me[ 14 ]; te[ 15 ] = me[ 15 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the translation component of the given matrix\n\t * into this matrix's translation component.\n\t *\n\t * @param {Matrix4} m - The matrix to copy the translation component.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tcopyPosition( m ) {\n\n\t\tconst te = this.elements, me = m.elements;\n\n\t\tte[ 12 ] = me[ 12 ];\n\t\tte[ 13 ] = me[ 13 ];\n\t\tte[ 14 ] = me[ 14 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Set the upper 3x3 elements of this matrix to the values of given 3x3 matrix.\n\t *\n\t * @param {Matrix3} m - The 3x3 matrix.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tsetFromMatrix3( m ) {\n\n\t\tconst me = m.elements;\n\n\t\tthis.set(\n\n\t\t\tme[ 0 ], me[ 3 ], me[ 6 ], 0,\n\t\t\tme[ 1 ], me[ 4 ], me[ 7 ], 0,\n\t\t\tme[ 2 ], me[ 5 ], me[ 8 ], 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Extracts the basis of this matrix into the three axis vectors provided.\n\t *\n\t * @param {Vector3} xAxis - The basis's x axis.\n\t * @param {Vector3} yAxis - The basis's y axis.\n\t * @param {Vector3} zAxis - The basis's z axis.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\textractBasis( xAxis, yAxis, zAxis ) {\n\n\t\txAxis.setFromMatrixColumn( this, 0 );\n\t\tyAxis.setFromMatrixColumn( this, 1 );\n\t\tzAxis.setFromMatrixColumn( this, 2 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given basis vectors to this matrix.\n\t *\n\t * @param {Vector3} xAxis - The basis's x axis.\n\t * @param {Vector3} yAxis - The basis's y axis.\n\t * @param {Vector3} zAxis - The basis's z axis.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeBasis( xAxis, yAxis, zAxis ) {\n\n\t\tthis.set(\n\t\t\txAxis.x, yAxis.x, zAxis.x, 0,\n\t\t\txAxis.y, yAxis.y, zAxis.y, 0,\n\t\t\txAxis.z, yAxis.z, zAxis.z, 0,\n\t\t\t0, 0, 0, 1\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Extracts the rotation component of the given matrix\n\t * into this matrix's rotation component.\n\t *\n\t * Note: This method does not support reflection matrices.\n\t *\n\t * @param {Matrix4} m - The matrix.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\textractRotation( m ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = m.elements;\n\n\t\tconst scaleX = 1 / _v1$5.setFromMatrixColumn( m, 0 ).length();\n\t\tconst scaleY = 1 / _v1$5.setFromMatrixColumn( m, 1 ).length();\n\t\tconst scaleZ = 1 / _v1$5.setFromMatrixColumn( m, 2 ).length();\n\n\t\tte[ 0 ] = me[ 0 ] * scaleX;\n\t\tte[ 1 ] = me[ 1 ] * scaleX;\n\t\tte[ 2 ] = me[ 2 ] * scaleX;\n\t\tte[ 3 ] = 0;\n\n\t\tte[ 4 ] = me[ 4 ] * scaleY;\n\t\tte[ 5 ] = me[ 5 ] * scaleY;\n\t\tte[ 6 ] = me[ 6 ] * scaleY;\n\t\tte[ 7 ] = 0;\n\n\t\tte[ 8 ] = me[ 8 ] * scaleZ;\n\t\tte[ 9 ] = me[ 9 ] * scaleZ;\n\t\tte[ 10 ] = me[ 10 ] * scaleZ;\n\t\tte[ 11 ] = 0;\n\n\t\tte[ 12 ] = 0;\n\t\tte[ 13 ] = 0;\n\t\tte[ 14 ] = 0;\n\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the rotation component (the upper left 3x3 matrix) of this matrix to\n\t * the rotation specified by the given Euler angles. The rest of\n\t * the matrix is set to the identity. Depending on the {@link Euler#order},\n\t * there are six possible outcomes. See [this page](https://en.wikipedia.org/wiki/Euler_angles#Rotation_matrix)\n\t * for a complete list.\n\t *\n\t * @param {Euler} euler - The Euler angles.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeRotationFromEuler( euler ) {\n\n\t\tconst te = this.elements;\n\n\t\tconst x = euler.x, y = euler.y, z = euler.z;\n\t\tconst a = Math.cos( x ), b = Math.sin( x );\n\t\tconst c = Math.cos( y ), d = Math.sin( y );\n\t\tconst e = Math.cos( z ), f = Math.sin( z );\n\n\t\tif ( euler.order === 'XYZ' ) {\n\n\t\t\tconst ae = a * e, af = a * f, be = b * e, bf = b * f;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = - c * f;\n\t\t\tte[ 8 ] = d;\n\n\t\t\tte[ 1 ] = af + be * d;\n\t\t\tte[ 5 ] = ae - bf * d;\n\t\t\tte[ 9 ] = - b * c;\n\n\t\t\tte[ 2 ] = bf - ae * d;\n\t\t\tte[ 6 ] = be + af * d;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'YXZ' ) {\n\n\t\t\tconst ce = c * e, cf = c * f, de = d * e, df = d * f;\n\n\t\t\tte[ 0 ] = ce + df * b;\n\t\t\tte[ 4 ] = de * b - cf;\n\t\t\tte[ 8 ] = a * d;\n\n\t\t\tte[ 1 ] = a * f;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = - b;\n\n\t\t\tte[ 2 ] = cf * b - de;\n\t\t\tte[ 6 ] = df + ce * b;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'ZXY' ) {\n\n\t\t\tconst ce = c * e, cf = c * f, de = d * e, df = d * f;\n\n\t\t\tte[ 0 ] = ce - df * b;\n\t\t\tte[ 4 ] = - a * f;\n\t\t\tte[ 8 ] = de + cf * b;\n\n\t\t\tte[ 1 ] = cf + de * b;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = df - ce * b;\n\n\t\t\tte[ 2 ] = - a * d;\n\t\t\tte[ 6 ] = b;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'ZYX' ) {\n\n\t\t\tconst ae = a * e, af = a * f, be = b * e, bf = b * f;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = be * d - af;\n\t\t\tte[ 8 ] = ae * d + bf;\n\n\t\t\tte[ 1 ] = c * f;\n\t\t\tte[ 5 ] = bf * d + ae;\n\t\t\tte[ 9 ] = af * d - be;\n\n\t\t\tte[ 2 ] = - d;\n\t\t\tte[ 6 ] = b * c;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'YZX' ) {\n\n\t\t\tconst ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = bd - ac * f;\n\t\t\tte[ 8 ] = bc * f + ad;\n\n\t\t\tte[ 1 ] = f;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = - b * e;\n\n\t\t\tte[ 2 ] = - d * e;\n\t\t\tte[ 6 ] = ad * f + bc;\n\t\t\tte[ 10 ] = ac - bd * f;\n\n\t\t} else if ( euler.order === 'XZY' ) {\n\n\t\t\tconst ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = - f;\n\t\t\tte[ 8 ] = d * e;\n\n\t\t\tte[ 1 ] = ac * f + bd;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = ad * f - bc;\n\n\t\t\tte[ 2 ] = bc * f - ad;\n\t\t\tte[ 6 ] = b * e;\n\t\t\tte[ 10 ] = bd * f + ac;\n\n\t\t}\n\n\t\t// bottom row\n\t\tte[ 3 ] = 0;\n\t\tte[ 7 ] = 0;\n\t\tte[ 11 ] = 0;\n\n\t\t// last column\n\t\tte[ 12 ] = 0;\n\t\tte[ 13 ] = 0;\n\t\tte[ 14 ] = 0;\n\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the rotation component of this matrix to the rotation specified by\n\t * the given Quaternion as outlined [here](https://en.wikipedia.org/wiki/Rotation_matrix#Quaternion)\n\t * The rest of the matrix is set to the identity.\n\t *\n\t * @param {Quaternion} q - The Quaternion.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeRotationFromQuaternion( q ) {\n\n\t\treturn this.compose( _zero, q, _one );\n\n\t}\n\n\t/**\n\t * Sets the rotation component of the transformation matrix, looking from `eye` towards\n\t * `target`, and oriented by the up-direction.\n\t *\n\t * @param {Vector3} eye - The eye vector.\n\t * @param {Vector3} target - The target vector.\n\t * @param {Vector3} up - The up vector.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tlookAt( eye, target, up ) {\n\n\t\tconst te = this.elements;\n\n\t\t_z.subVectors( eye, target );\n\n\t\tif ( _z.lengthSq() === 0 ) {\n\n\t\t\t// eye and target are in the same position\n\n\t\t\t_z.z = 1;\n\n\t\t}\n\n\t\t_z.normalize();\n\t\t_x.crossVectors( up, _z );\n\n\t\tif ( _x.lengthSq() === 0 ) {\n\n\t\t\t// up and z are parallel\n\n\t\t\tif ( Math.abs( up.z ) === 1 ) {\n\n\t\t\t\t_z.x += 0.0001;\n\n\t\t\t} else {\n\n\t\t\t\t_z.z += 0.0001;\n\n\t\t\t}\n\n\t\t\t_z.normalize();\n\t\t\t_x.crossVectors( up, _z );\n\n\t\t}\n\n\t\t_x.normalize();\n\t\t_y.crossVectors( _z, _x );\n\n\t\tte[ 0 ] = _x.x; te[ 4 ] = _y.x; te[ 8 ] = _z.x;\n\t\tte[ 1 ] = _x.y; te[ 5 ] = _y.y; te[ 9 ] = _z.y;\n\t\tte[ 2 ] = _x.z; te[ 6 ] = _y.z; te[ 10 ] = _z.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Post-multiplies this matrix by the given 4x4 matrix.\n\t *\n\t * @param {Matrix4} m - The matrix to multiply with.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmultiply( m ) {\n\n\t\treturn this.multiplyMatrices( this, m );\n\n\t}\n\n\t/**\n\t * Pre-multiplies this matrix by the given 4x4 matrix.\n\t *\n\t * @param {Matrix4} m - The matrix to multiply with.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tpremultiply( m ) {\n\n\t\treturn this.multiplyMatrices( m, this );\n\n\t}\n\n\t/**\n\t * Multiples the given 4x4 matrices and stores the result\n\t * in this matrix.\n\t *\n\t * @param {Matrix4} a - The first matrix.\n\t * @param {Matrix4} b - The second matrix.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmultiplyMatrices( a, b ) {\n\n\t\tconst ae = a.elements;\n\t\tconst be = b.elements;\n\t\tconst te = this.elements;\n\n\t\tconst a11 = ae[ 0 ], a12 = ae[ 4 ], a13 = ae[ 8 ], a14 = ae[ 12 ];\n\t\tconst a21 = ae[ 1 ], a22 = ae[ 5 ], a23 = ae[ 9 ], a24 = ae[ 13 ];\n\t\tconst a31 = ae[ 2 ], a32 = ae[ 6 ], a33 = ae[ 10 ], a34 = ae[ 14 ];\n\t\tconst a41 = ae[ 3 ], a42 = ae[ 7 ], a43 = ae[ 11 ], a44 = ae[ 15 ];\n\n\t\tconst b11 = be[ 0 ], b12 = be[ 4 ], b13 = be[ 8 ], b14 = be[ 12 ];\n\t\tconst b21 = be[ 1 ], b22 = be[ 5 ], b23 = be[ 9 ], b24 = be[ 13 ];\n\t\tconst b31 = be[ 2 ], b32 = be[ 6 ], b33 = be[ 10 ], b34 = be[ 14 ];\n\t\tconst b41 = be[ 3 ], b42 = be[ 7 ], b43 = be[ 11 ], b44 = be[ 15 ];\n\n\t\tte[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41;\n\t\tte[ 4 ] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42;\n\t\tte[ 8 ] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43;\n\t\tte[ 12 ] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44;\n\n\t\tte[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41;\n\t\tte[ 5 ] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42;\n\t\tte[ 9 ] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43;\n\t\tte[ 13 ] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44;\n\n\t\tte[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41;\n\t\tte[ 6 ] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42;\n\t\tte[ 10 ] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43;\n\t\tte[ 14 ] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44;\n\n\t\tte[ 3 ] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41;\n\t\tte[ 7 ] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42;\n\t\tte[ 11 ] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43;\n\t\tte[ 15 ] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies every component of the matrix by the given scalar.\n\t *\n\t * @param {number} s - The scalar.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmultiplyScalar( s ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] *= s; te[ 4 ] *= s; te[ 8 ] *= s; te[ 12 ] *= s;\n\t\tte[ 1 ] *= s; te[ 5 ] *= s; te[ 9 ] *= s; te[ 13 ] *= s;\n\t\tte[ 2 ] *= s; te[ 6 ] *= s; te[ 10 ] *= s; te[ 14 ] *= s;\n\t\tte[ 3 ] *= s; te[ 7 ] *= s; te[ 11 ] *= s; te[ 15 ] *= s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes and returns the determinant of this matrix.\n\t *\n\t * Based on the method outlined [here](http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.html).\n\t *\n\t * @return {number} The determinant.\n\t */\n\tdeterminant() {\n\n\t\tconst te = this.elements;\n\n\t\tconst n11 = te[ 0 ], n12 = te[ 4 ], n13 = te[ 8 ], n14 = te[ 12 ];\n\t\tconst n21 = te[ 1 ], n22 = te[ 5 ], n23 = te[ 9 ], n24 = te[ 13 ];\n\t\tconst n31 = te[ 2 ], n32 = te[ 6 ], n33 = te[ 10 ], n34 = te[ 14 ];\n\t\tconst n41 = te[ 3 ], n42 = te[ 7 ], n43 = te[ 11 ], n44 = te[ 15 ];\n\n\t\t//TODO: make this more efficient\n\n\t\treturn (\n\t\t\tn41 * (\n\t\t\t\t+ n14 * n23 * n32\n\t\t\t\t - n13 * n24 * n32\n\t\t\t\t - n14 * n22 * n33\n\t\t\t\t + n12 * n24 * n33\n\t\t\t\t + n13 * n22 * n34\n\t\t\t\t - n12 * n23 * n34\n\t\t\t) +\n\t\t\tn42 * (\n\t\t\t\t+ n11 * n23 * n34\n\t\t\t\t - n11 * n24 * n33\n\t\t\t\t + n14 * n21 * n33\n\t\t\t\t - n13 * n21 * n34\n\t\t\t\t + n13 * n24 * n31\n\t\t\t\t - n14 * n23 * n31\n\t\t\t) +\n\t\t\tn43 * (\n\t\t\t\t+ n11 * n24 * n32\n\t\t\t\t - n11 * n22 * n34\n\t\t\t\t - n14 * n21 * n32\n\t\t\t\t + n12 * n21 * n34\n\t\t\t\t + n14 * n22 * n31\n\t\t\t\t - n12 * n24 * n31\n\t\t\t) +\n\t\t\tn44 * (\n\t\t\t\t- n13 * n22 * n31\n\t\t\t\t - n11 * n23 * n32\n\t\t\t\t + n11 * n22 * n33\n\t\t\t\t + n13 * n21 * n32\n\t\t\t\t - n12 * n21 * n33\n\t\t\t\t + n12 * n23 * n31\n\t\t\t)\n\n\t\t);\n\n\t}\n\n\t/**\n\t * Transposes this matrix in place.\n\t *\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\ttranspose() {\n\n\t\tconst te = this.elements;\n\t\tlet tmp;\n\n\t\ttmp = te[ 1 ]; te[ 1 ] = te[ 4 ]; te[ 4 ] = tmp;\n\t\ttmp = te[ 2 ]; te[ 2 ] = te[ 8 ]; te[ 8 ] = tmp;\n\t\ttmp = te[ 6 ]; te[ 6 ] = te[ 9 ]; te[ 9 ] = tmp;\n\n\t\ttmp = te[ 3 ]; te[ 3 ] = te[ 12 ]; te[ 12 ] = tmp;\n\t\ttmp = te[ 7 ]; te[ 7 ] = te[ 13 ]; te[ 13 ] = tmp;\n\t\ttmp = te[ 11 ]; te[ 11 ] = te[ 14 ]; te[ 14 ] = tmp;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the position component for this matrix from the given vector,\n\t * without affecting the rest of the matrix.\n\t *\n\t * @param {number|Vector3} x - The x component of the vector or alternatively the vector object.\n\t * @param {number} y - The y component of the vector.\n\t * @param {number} z - The z component of the vector.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tsetPosition( x, y, z ) {\n\n\t\tconst te = this.elements;\n\n\t\tif ( x.isVector3 ) {\n\n\t\t\tte[ 12 ] = x.x;\n\t\t\tte[ 13 ] = x.y;\n\t\t\tte[ 14 ] = x.z;\n\n\t\t} else {\n\n\t\t\tte[ 12 ] = x;\n\t\t\tte[ 13 ] = y;\n\t\t\tte[ 14 ] = z;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Inverts this matrix, using the [analytic method](https://en.wikipedia.org/wiki/Invertible_matrix#Analytic_solution).\n\t * You can not invert with a determinant of zero. If you attempt this, the method produces\n\t * a zero matrix instead.\n\t *\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tinvert() {\n\n\t\t// based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm\n\t\tconst te = this.elements,\n\n\t\t\tn11 = te[ 0 ], n21 = te[ 1 ], n31 = te[ 2 ], n41 = te[ 3 ],\n\t\t\tn12 = te[ 4 ], n22 = te[ 5 ], n32 = te[ 6 ], n42 = te[ 7 ],\n\t\t\tn13 = te[ 8 ], n23 = te[ 9 ], n33 = te[ 10 ], n43 = te[ 11 ],\n\t\t\tn14 = te[ 12 ], n24 = te[ 13 ], n34 = te[ 14 ], n44 = te[ 15 ],\n\n\t\t\tt11 = n23 * n34 * n42 - n24 * n33 * n42 + n24 * n32 * n43 - n22 * n34 * n43 - n23 * n32 * n44 + n22 * n33 * n44,\n\t\t\tt12 = n14 * n33 * n42 - n13 * n34 * n42 - n14 * n32 * n43 + n12 * n34 * n43 + n13 * n32 * n44 - n12 * n33 * n44,\n\t\t\tt13 = n13 * n24 * n42 - n14 * n23 * n42 + n14 * n22 * n43 - n12 * n24 * n43 - n13 * n22 * n44 + n12 * n23 * n44,\n\t\t\tt14 = n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34;\n\n\t\tconst det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14;\n\n\t\tif ( det === 0 ) return this.set( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 );\n\n\t\tconst detInv = 1 / det;\n\n\t\tte[ 0 ] = t11 * detInv;\n\t\tte[ 1 ] = ( n24 * n33 * n41 - n23 * n34 * n41 - n24 * n31 * n43 + n21 * n34 * n43 + n23 * n31 * n44 - n21 * n33 * n44 ) * detInv;\n\t\tte[ 2 ] = ( n22 * n34 * n41 - n24 * n32 * n41 + n24 * n31 * n42 - n21 * n34 * n42 - n22 * n31 * n44 + n21 * n32 * n44 ) * detInv;\n\t\tte[ 3 ] = ( n23 * n32 * n41 - n22 * n33 * n41 - n23 * n31 * n42 + n21 * n33 * n42 + n22 * n31 * n43 - n21 * n32 * n43 ) * detInv;\n\n\t\tte[ 4 ] = t12 * detInv;\n\t\tte[ 5 ] = ( n13 * n34 * n41 - n14 * n33 * n41 + n14 * n31 * n43 - n11 * n34 * n43 - n13 * n31 * n44 + n11 * n33 * n44 ) * detInv;\n\t\tte[ 6 ] = ( n14 * n32 * n41 - n12 * n34 * n41 - n14 * n31 * n42 + n11 * n34 * n42 + n12 * n31 * n44 - n11 * n32 * n44 ) * detInv;\n\t\tte[ 7 ] = ( n12 * n33 * n41 - n13 * n32 * n41 + n13 * n31 * n42 - n11 * n33 * n42 - n12 * n31 * n43 + n11 * n32 * n43 ) * detInv;\n\n\t\tte[ 8 ] = t13 * detInv;\n\t\tte[ 9 ] = ( n14 * n23 * n41 - n13 * n24 * n41 - n14 * n21 * n43 + n11 * n24 * n43 + n13 * n21 * n44 - n11 * n23 * n44 ) * detInv;\n\t\tte[ 10 ] = ( n12 * n24 * n41 - n14 * n22 * n41 + n14 * n21 * n42 - n11 * n24 * n42 - n12 * n21 * n44 + n11 * n22 * n44 ) * detInv;\n\t\tte[ 11 ] = ( n13 * n22 * n41 - n12 * n23 * n41 - n13 * n21 * n42 + n11 * n23 * n42 + n12 * n21 * n43 - n11 * n22 * n43 ) * detInv;\n\n\t\tte[ 12 ] = t14 * detInv;\n\t\tte[ 13 ] = ( n13 * n24 * n31 - n14 * n23 * n31 + n14 * n21 * n33 - n11 * n24 * n33 - n13 * n21 * n34 + n11 * n23 * n34 ) * detInv;\n\t\tte[ 14 ] = ( n14 * n22 * n31 - n12 * n24 * n31 - n14 * n21 * n32 + n11 * n24 * n32 + n12 * n21 * n34 - n11 * n22 * n34 ) * detInv;\n\t\tte[ 15 ] = ( n12 * n23 * n31 - n13 * n22 * n31 + n13 * n21 * n32 - n11 * n23 * n32 - n12 * n21 * n33 + n11 * n22 * n33 ) * detInv;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the columns of this matrix by the given vector.\n\t *\n\t * @param {Vector3} v - The scale vector.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tscale( v ) {\n\n\t\tconst te = this.elements;\n\t\tconst x = v.x, y = v.y, z = v.z;\n\n\t\tte[ 0 ] *= x; te[ 4 ] *= y; te[ 8 ] *= z;\n\t\tte[ 1 ] *= x; te[ 5 ] *= y; te[ 9 ] *= z;\n\t\tte[ 2 ] *= x; te[ 6 ] *= y; te[ 10 ] *= z;\n\t\tte[ 3 ] *= x; te[ 7 ] *= y; te[ 11 ] *= z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Gets the maximum scale value of the three axes.\n\t *\n\t * @return {number} The maximum scale.\n\t */\n\tgetMaxScaleOnAxis() {\n\n\t\tconst te = this.elements;\n\n\t\tconst scaleXSq = te[ 0 ] * te[ 0 ] + te[ 1 ] * te[ 1 ] + te[ 2 ] * te[ 2 ];\n\t\tconst scaleYSq = te[ 4 ] * te[ 4 ] + te[ 5 ] * te[ 5 ] + te[ 6 ] * te[ 6 ];\n\t\tconst scaleZSq = te[ 8 ] * te[ 8 ] + te[ 9 ] * te[ 9 ] + te[ 10 ] * te[ 10 ];\n\n\t\treturn Math.sqrt( Math.max( scaleXSq, scaleYSq, scaleZSq ) );\n\n\t}\n\n\t/**\n\t * Sets this matrix as a translation transform from the given vector.\n\t *\n\t * @param {number|Vector3} x - The amount to translate in the X axis or alternatively a translation vector.\n\t * @param {number} y - The amount to translate in the Y axis.\n\t * @param {number} z - The amount to translate in the z axis.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeTranslation( x, y, z ) {\n\n\t\tif ( x.isVector3 ) {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, 0, x.x,\n\t\t\t\t0, 1, 0, x.y,\n\t\t\t\t0, 0, 1, x.z,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t} else {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, 0, x,\n\t\t\t\t0, 1, 0, y,\n\t\t\t\t0, 0, 1, z,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix as a rotational transformation around the X axis by\n\t * the given angle.\n\t *\n\t * @param {number} theta - The rotation in radians.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeRotationX( theta ) {\n\n\t\tconst c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\t1, 0, 0, 0,\n\t\t\t0, c, - s, 0,\n\t\t\t0, s, c, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix as a rotational transformation around the Y axis by\n\t * the given angle.\n\t *\n\t * @param {number} theta - The rotation in radians.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeRotationY( theta ) {\n\n\t\tconst c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\t c, 0, s, 0,\n\t\t\t 0, 1, 0, 0,\n\t\t\t- s, 0, c, 0,\n\t\t\t 0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix as a rotational transformation around the Z axis by\n\t * the given angle.\n\t *\n\t * @param {number} theta - The rotation in radians.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeRotationZ( theta ) {\n\n\t\tconst c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\tc, - s, 0, 0,\n\t\t\ts, c, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix as a rotational transformation around the given axis by\n\t * the given angle.\n\t *\n\t * This is a somewhat controversial but mathematically sound alternative to\n\t * rotating via Quaternions. See the discussion [here](https://www.gamedev.net/articles/programming/math-and-physics/do-we-really-need-quaternions-r1199).\n\t *\n\t * @param {Vector3} axis - The normalized rotation axis.\n\t * @param {number} angle - The rotation in radians.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeRotationAxis( axis, angle ) {\n\n\t\t// Based on http://www.gamedev.net/reference/articles/article1199.asp\n\n\t\tconst c = Math.cos( angle );\n\t\tconst s = Math.sin( angle );\n\t\tconst t = 1 - c;\n\t\tconst x = axis.x, y = axis.y, z = axis.z;\n\t\tconst tx = t * x, ty = t * y;\n\n\t\tthis.set(\n\n\t\t\ttx * x + c, tx * y - s * z, tx * z + s * y, 0,\n\t\t\ttx * y + s * z, ty * y + c, ty * z - s * x, 0,\n\t\t\ttx * z - s * y, ty * z + s * x, t * z * z + c, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix as a scale transformation.\n\t *\n\t * @param {number} x - The amount to scale in the X axis.\n\t * @param {number} y - The amount to scale in the Y axis.\n\t * @param {number} z - The amount to scale in the Z axis.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeScale( x, y, z ) {\n\n\t\tthis.set(\n\n\t\t\tx, 0, 0, 0,\n\t\t\t0, y, 0, 0,\n\t\t\t0, 0, z, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix as a shear transformation.\n\t *\n\t * @param {number} xy - The amount to shear X by Y.\n\t * @param {number} xz - The amount to shear X by Z.\n\t * @param {number} yx - The amount to shear Y by X.\n\t * @param {number} yz - The amount to shear Y by Z.\n\t * @param {number} zx - The amount to shear Z by X.\n\t * @param {number} zy - The amount to shear Z by Y.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeShear( xy, xz, yx, yz, zx, zy ) {\n\n\t\tthis.set(\n\n\t\t\t1, yx, zx, 0,\n\t\t\txy, 1, zy, 0,\n\t\t\txz, yz, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix to the transformation composed of the given position,\n\t * rotation (Quaternion) and scale.\n\t *\n\t * @param {Vector3} position - The position vector.\n\t * @param {Quaternion} quaternion - The rotation as a Quaternion.\n\t * @param {Vector3} scale - The scale vector.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tcompose( position, quaternion, scale ) {\n\n\t\tconst te = this.elements;\n\n\t\tconst x = quaternion._x, y = quaternion._y, z = quaternion._z, w = quaternion._w;\n\t\tconst x2 = x + x,\ty2 = y + y, z2 = z + z;\n\t\tconst xx = x * x2, xy = x * y2, xz = x * z2;\n\t\tconst yy = y * y2, yz = y * z2, zz = z * z2;\n\t\tconst wx = w * x2, wy = w * y2, wz = w * z2;\n\n\t\tconst sx = scale.x, sy = scale.y, sz = scale.z;\n\n\t\tte[ 0 ] = ( 1 - ( yy + zz ) ) * sx;\n\t\tte[ 1 ] = ( xy + wz ) * sx;\n\t\tte[ 2 ] = ( xz - wy ) * sx;\n\t\tte[ 3 ] = 0;\n\n\t\tte[ 4 ] = ( xy - wz ) * sy;\n\t\tte[ 5 ] = ( 1 - ( xx + zz ) ) * sy;\n\t\tte[ 6 ] = ( yz + wx ) * sy;\n\t\tte[ 7 ] = 0;\n\n\t\tte[ 8 ] = ( xz + wy ) * sz;\n\t\tte[ 9 ] = ( yz - wx ) * sz;\n\t\tte[ 10 ] = ( 1 - ( xx + yy ) ) * sz;\n\t\tte[ 11 ] = 0;\n\n\t\tte[ 12 ] = position.x;\n\t\tte[ 13 ] = position.y;\n\t\tte[ 14 ] = position.z;\n\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Decomposes this matrix into its position, rotation and scale components\n\t * and provides the result in the given objects.\n\t *\n\t * Note: Not all matrices are decomposable in this way. For example, if an\n\t * object has a non-uniformly scaled parent, then the object's world matrix\n\t * may not be decomposable, and this method may not be appropriate.\n\t *\n\t * @param {Vector3} position - The position vector.\n\t * @param {Quaternion} quaternion - The rotation as a Quaternion.\n\t * @param {Vector3} scale - The scale vector.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tdecompose( position, quaternion, scale ) {\n\n\t\tconst te = this.elements;\n\n\t\tlet sx = _v1$5.set( te[ 0 ], te[ 1 ], te[ 2 ] ).length();\n\t\tconst sy = _v1$5.set( te[ 4 ], te[ 5 ], te[ 6 ] ).length();\n\t\tconst sz = _v1$5.set( te[ 8 ], te[ 9 ], te[ 10 ] ).length();\n\n\t\t// if determine is negative, we need to invert one scale\n\t\tconst det = this.determinant();\n\t\tif ( det < 0 ) sx = - sx;\n\n\t\tposition.x = te[ 12 ];\n\t\tposition.y = te[ 13 ];\n\t\tposition.z = te[ 14 ];\n\n\t\t// scale the rotation part\n\t\t_m1$2.copy( this );\n\n\t\tconst invSX = 1 / sx;\n\t\tconst invSY = 1 / sy;\n\t\tconst invSZ = 1 / sz;\n\n\t\t_m1$2.elements[ 0 ] *= invSX;\n\t\t_m1$2.elements[ 1 ] *= invSX;\n\t\t_m1$2.elements[ 2 ] *= invSX;\n\n\t\t_m1$2.elements[ 4 ] *= invSY;\n\t\t_m1$2.elements[ 5 ] *= invSY;\n\t\t_m1$2.elements[ 6 ] *= invSY;\n\n\t\t_m1$2.elements[ 8 ] *= invSZ;\n\t\t_m1$2.elements[ 9 ] *= invSZ;\n\t\t_m1$2.elements[ 10 ] *= invSZ;\n\n\t\tquaternion.setFromRotationMatrix( _m1$2 );\n\n\t\tscale.x = sx;\n\t\tscale.y = sy;\n\t\tscale.z = sz;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Creates a perspective projection matrix. This is used internally by\n\t * {@link PerspectiveCamera#updateProjectionMatrix}.\n\n\t * @param {number} left - Left boundary of the viewing frustum at the near plane.\n\t * @param {number} right - Right boundary of the viewing frustum at the near plane.\n\t * @param {number} top - Top boundary of the viewing frustum at the near plane.\n\t * @param {number} bottom - Bottom boundary of the viewing frustum at the near plane.\n\t * @param {number} near - The distance from the camera to the near plane.\n\t * @param {number} far - The distance from the camera to the far plane.\n\t * @param {(WebGLCoordinateSystem|WebGPUCoordinateSystem)} [coordinateSystem=WebGLCoordinateSystem] - The coordinate system.\n\t * @param {boolean} [reversedDepth=false] - Whether to use a reversed depth.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakePerspective( left, right, top, bottom, near, far, coordinateSystem = WebGLCoordinateSystem, reversedDepth = false ) {\n\n\t\tconst te = this.elements;\n\n\t\tconst x = 2 * near / ( right - left );\n\t\tconst y = 2 * near / ( top - bottom );\n\n\t\tconst a = ( right + left ) / ( right - left );\n\t\tconst b = ( top + bottom ) / ( top - bottom );\n\n\t\tlet c, d;\n\n\t\tif ( reversedDepth ) {\n\n\t\t\tc = near / ( far - near );\n\t\t\td = ( far * near ) / ( far - near );\n\n\t\t} else {\n\n\t\t\tif ( coordinateSystem === WebGLCoordinateSystem ) {\n\n\t\t\t\tc = - ( far + near ) / ( far - near );\n\t\t\t\td = ( -2 * far * near ) / ( far - near );\n\n\t\t\t} else if ( coordinateSystem === WebGPUCoordinateSystem ) {\n\n\t\t\t\tc = - far / ( far - near );\n\t\t\t\td = ( - far * near ) / ( far - near );\n\n\t\t\t} else {\n\n\t\t\t\tthrow new Error( 'THREE.Matrix4.makePerspective(): Invalid coordinate system: ' + coordinateSystem );\n\n\t\t\t}\n\n\t\t}\n\n\t\tte[ 0 ] = x;\tte[ 4 ] = 0;\tte[ 8 ] = a; \tte[ 12 ] = 0;\n\t\tte[ 1 ] = 0;\tte[ 5 ] = y;\tte[ 9 ] = b; \tte[ 13 ] = 0;\n\t\tte[ 2 ] = 0;\tte[ 6 ] = 0;\tte[ 10 ] = c; \tte[ 14 ] = d;\n\t\tte[ 3 ] = 0;\tte[ 7 ] = 0;\tte[ 11 ] = -1;\tte[ 15 ] = 0;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Creates a orthographic projection matrix. This is used internally by\n\t * {@link OrthographicCamera#updateProjectionMatrix}.\n\n\t * @param {number} left - Left boundary of the viewing frustum at the near plane.\n\t * @param {number} right - Right boundary of the viewing frustum at the near plane.\n\t * @param {number} top - Top boundary of the viewing frustum at the near plane.\n\t * @param {number} bottom - Bottom boundary of the viewing frustum at the near plane.\n\t * @param {number} near - The distance from the camera to the near plane.\n\t * @param {number} far - The distance from the camera to the far plane.\n\t * @param {(WebGLCoordinateSystem|WebGPUCoordinateSystem)} [coordinateSystem=WebGLCoordinateSystem] - The coordinate system.\n\t * @param {boolean} [reversedDepth=false] - Whether to use a reversed depth.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeOrthographic( left, right, top, bottom, near, far, coordinateSystem = WebGLCoordinateSystem, reversedDepth = false ) {\n\n\t\tconst te = this.elements;\n\n\t\tconst x = 2 / ( right - left );\n\t\tconst y = 2 / ( top - bottom );\n\n\t\tconst a = - ( right + left ) / ( right - left );\n\t\tconst b = - ( top + bottom ) / ( top - bottom );\n\n\t\tlet c, d;\n\n\t\tif ( reversedDepth ) {\n\n\t\t\tc = 1 / ( far - near );\n\t\t\td = far / ( far - near );\n\n\t\t} else {\n\n\t\t\tif ( coordinateSystem === WebGLCoordinateSystem ) {\n\n\t\t\t\tc = -2 / ( far - near );\n\t\t\t\td = - ( far + near ) / ( far - near );\n\n\t\t\t} else if ( coordinateSystem === WebGPUCoordinateSystem ) {\n\n\t\t\t\tc = -1 / ( far - near );\n\t\t\t\td = - near / ( far - near );\n\n\t\t\t} else {\n\n\t\t\t\tthrow new Error( 'THREE.Matrix4.makeOrthographic(): Invalid coordinate system: ' + coordinateSystem );\n\n\t\t\t}\n\n\t\t}\n\n\t\tte[ 0 ] = x;\t\tte[ 4 ] = 0;\t\tte[ 8 ] = 0; \t\tte[ 12 ] = a;\n\t\tte[ 1 ] = 0; \t\tte[ 5 ] = y;\t\tte[ 9 ] = 0; \t\tte[ 13 ] = b;\n\t\tte[ 2 ] = 0; \t\tte[ 6 ] = 0;\t\tte[ 10 ] = c;\t\tte[ 14 ] = d;\n\t\tte[ 3 ] = 0; \t\tte[ 7 ] = 0;\t\tte[ 11 ] = 0;\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this matrix is equal with the given one.\n\t *\n\t * @param {Matrix4} matrix - The matrix to test for equality.\n\t * @return {boolean} Whether this matrix is equal with the given one.\n\t */\n\tequals( matrix ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = matrix.elements;\n\n\t\tfor ( let i = 0; i < 16; i ++ ) {\n\n\t\t\tif ( te[ i ] !== me[ i ] ) return false;\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\t/**\n\t * Sets the elements of the matrix from the given array.\n\t *\n\t * @param {Array<number>} array - The matrix elements in column-major order.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tfromArray( array, offset = 0 ) {\n\n\t\tfor ( let i = 0; i < 16; i ++ ) {\n\n\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Writes the elements of this matrix to the given array. If no array is provided,\n\t * the method returns a new instance.\n\t *\n\t * @param {Array<number>} [array=[]] - The target array holding the matrix elements in column-major order.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Array<number>} The matrix elements in column-major order.\n\t */\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tconst te = this.elements;\n\n\t\tarray[ offset ] = te[ 0 ];\n\t\tarray[ offset + 1 ] = te[ 1 ];\n\t\tarray[ offset + 2 ] = te[ 2 ];\n\t\tarray[ offset + 3 ] = te[ 3 ];\n\n\t\tarray[ offset + 4 ] = te[ 4 ];\n\t\tarray[ offset + 5 ] = te[ 5 ];\n\t\tarray[ offset + 6 ] = te[ 6 ];\n\t\tarray[ offset + 7 ] = te[ 7 ];\n\n\t\tarray[ offset + 8 ] = te[ 8 ];\n\t\tarray[ offset + 9 ] = te[ 9 ];\n\t\tarray[ offset + 10 ] = te[ 10 ];\n\t\tarray[ offset + 11 ] = te[ 11 ];\n\n\t\tarray[ offset + 12 ] = te[ 12 ];\n\t\tarray[ offset + 13 ] = te[ 13 ];\n\t\tarray[ offset + 14 ] = te[ 14 ];\n\t\tarray[ offset + 15 ] = te[ 15 ];\n\n\t\treturn array;\n\n\t}\n\n}\n\nconst _v1$5 = /*@__PURE__*/ new Vector3();\nconst _m1$2 = /*@__PURE__*/ new Matrix4();\nconst _zero = /*@__PURE__*/ new Vector3( 0, 0, 0 );\nconst _one = /*@__PURE__*/ new Vector3( 1, 1, 1 );\nconst _x = /*@__PURE__*/ new Vector3();\nconst _y = /*@__PURE__*/ new Vector3();\nconst _z = /*@__PURE__*/ new Vector3();\n\nconst _matrix$2 = /*@__PURE__*/ new Matrix4();\nconst _quaternion$3 = /*@__PURE__*/ new Quaternion();\n\n/**\n * A class representing Euler angles.\n *\n * Euler angles describe a rotational transformation by rotating an object on\n * its various axes in specified amounts per axis, and a specified axis\n * order.\n *\n * Iterating through an instance will yield its components (x, y, z,\n * order) in the corresponding order.\n *\n * ```js\n * const a = new THREE.Euler( 0, 1, 1.57, 'XYZ' );\n * const b = new THREE.Vector3( 1, 0, 1 );\n * b.applyEuler(a);\n * ```\n */\nclass Euler {\n\n\t/**\n\t * Constructs a new euler instance.\n\t *\n\t * @param {number} [x=0] - The angle of the x axis in radians.\n\t * @param {number} [y=0] - The angle of the y axis in radians.\n\t * @param {number} [z=0] - The angle of the z axis in radians.\n\t * @param {string} [order=Euler.DEFAULT_ORDER] - A string representing the order that the rotations are applied.\n\t */\n\tconstructor( x = 0, y = 0, z = 0, order = Euler.DEFAULT_ORDER ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isEuler = true;\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._order = order;\n\n\t}\n\n\t/**\n\t * The angle of the x axis in radians.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget x() {\n\n\t\treturn this._x;\n\n\t}\n\n\tset x( value ) {\n\n\t\tthis._x = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\t/**\n\t * The angle of the y axis in radians.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget y() {\n\n\t\treturn this._y;\n\n\t}\n\n\tset y( value ) {\n\n\t\tthis._y = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\t/**\n\t * The angle of the z axis in radians.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget z() {\n\n\t\treturn this._z;\n\n\t}\n\n\tset z( value ) {\n\n\t\tthis._z = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\t/**\n\t * A string representing the order that the rotations are applied.\n\t *\n\t * @type {string}\n\t * @default 'XYZ'\n\t */\n\tget order() {\n\n\t\treturn this._order;\n\n\t}\n\n\tset order( value ) {\n\n\t\tthis._order = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\t/**\n\t * Sets the Euler components.\n\t *\n\t * @param {number} x - The angle of the x axis in radians.\n\t * @param {number} y - The angle of the y axis in radians.\n\t * @param {number} z - The angle of the z axis in radians.\n\t * @param {string} [order] - A string representing the order that the rotations are applied.\n\t * @return {Euler} A reference to this Euler instance.\n\t */\n\tset( x, y, z, order = this._order ) {\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._order = order;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new Euler instance with copied values from this instance.\n\t *\n\t * @return {Euler} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor( this._x, this._y, this._z, this._order );\n\n\t}\n\n\t/**\n\t * Copies the values of the given Euler instance to this instance.\n\t *\n\t * @param {Euler} euler - The Euler instance to copy.\n\t * @return {Euler} A reference to this Euler instance.\n\t */\n\tcopy( euler ) {\n\n\t\tthis._x = euler._x;\n\t\tthis._y = euler._y;\n\t\tthis._z = euler._z;\n\t\tthis._order = euler._order;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the angles of this Euler instance from a pure rotation matrix.\n\t *\n\t * @param {Matrix4} m - A 4x4 matrix of which the upper 3x3 of matrix is a pure rotation matrix (i.e. unscaled).\n\t * @param {string} [order] - A string representing the order that the rotations are applied.\n\t * @param {boolean} [update=true] - Whether the internal `onChange` callback should be executed or not.\n\t * @return {Euler} A reference to this Euler instance.\n\t */\n\tsetFromRotationMatrix( m, order = this._order, update = true ) {\n\n\t\tconst te = m.elements;\n\t\tconst m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ];\n\t\tconst m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ];\n\t\tconst m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];\n\n\t\tswitch ( order ) {\n\n\t\t\tcase 'XYZ':\n\n\t\t\t\tthis._y = Math.asin( clamp( m13, -1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m13 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m33 );\n\t\t\t\t\tthis._z = Math.atan2( - m12, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m22 );\n\t\t\t\t\tthis._z = 0;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'YXZ':\n\n\t\t\t\tthis._x = Math.asin( - clamp( m23, -1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m23 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._y = Math.atan2( m13, m33 );\n\t\t\t\t\tthis._z = Math.atan2( m21, m22 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._y = Math.atan2( - m31, m11 );\n\t\t\t\t\tthis._z = 0;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZXY':\n\n\t\t\t\tthis._x = Math.asin( clamp( m32, -1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m32 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._y = Math.atan2( - m31, m33 );\n\t\t\t\t\tthis._z = Math.atan2( - m12, m22 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._y = 0;\n\t\t\t\t\tthis._z = Math.atan2( m21, m11 );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZYX':\n\n\t\t\t\tthis._y = Math.asin( - clamp( m31, -1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m31 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m33 );\n\t\t\t\t\tthis._z = Math.atan2( m21, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = 0;\n\t\t\t\t\tthis._z = Math.atan2( - m12, m22 );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'YZX':\n\n\t\t\t\tthis._z = Math.asin( clamp( m21, -1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m21 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m22 );\n\t\t\t\t\tthis._y = Math.atan2( - m31, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = 0;\n\t\t\t\t\tthis._y = Math.atan2( m13, m33 );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'XZY':\n\n\t\t\t\tthis._z = Math.asin( - clamp( m12, -1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m12 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m22 );\n\t\t\t\t\tthis._y = Math.atan2( m13, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m33 );\n\t\t\t\t\tthis._y = 0;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\twarn( 'Euler: .setFromRotationMatrix() encountered an unknown order: ' + order );\n\n\t\t}\n\n\t\tthis._order = order;\n\n\t\tif ( update === true ) this._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the angles of this Euler instance from a normalized quaternion.\n\t *\n\t * @param {Quaternion} q - A normalized Quaternion.\n\t * @param {string} [order] - A string representing the order that the rotations are applied.\n\t * @param {boolean} [update=true] - Whether the internal `onChange` callback should be executed or not.\n\t * @return {Euler} A reference to this Euler instance.\n\t */\n\tsetFromQuaternion( q, order, update ) {\n\n\t\t_matrix$2.makeRotationFromQuaternion( q );\n\n\t\treturn this.setFromRotationMatrix( _matrix$2, order, update );\n\n\t}\n\n\t/**\n\t * Sets the angles of this Euler instance from the given vector.\n\t *\n\t * @param {Vector3} v - The vector.\n\t * @param {string} [order] - A string representing the order that the rotations are applied.\n\t * @return {Euler} A reference to this Euler instance.\n\t */\n\tsetFromVector3( v, order = this._order ) {\n\n\t\treturn this.set( v.x, v.y, v.z, order );\n\n\t}\n\n\t/**\n\t * Resets the euler angle with a new order by creating a quaternion from this\n\t * euler angle and then setting this euler angle with the quaternion and the\n\t * new order.\n\t *\n\t * Warning: This discards revolution information.\n\t *\n\t * @param {string} [newOrder] - A string representing the new order that the rotations are applied.\n\t * @return {Euler} A reference to this Euler instance.\n\t */\n\treorder( newOrder ) {\n\n\t\t_quaternion$3.setFromEuler( this );\n\n\t\treturn this.setFromQuaternion( _quaternion$3, newOrder );\n\n\t}\n\n\t/**\n\t * Returns `true` if this Euler instance is equal with the given one.\n\t *\n\t * @param {Euler} euler - The Euler instance to test for equality.\n\t * @return {boolean} Whether this Euler instance is equal with the given one.\n\t */\n\tequals( euler ) {\n\n\t\treturn ( euler._x === this._x ) && ( euler._y === this._y ) && ( euler._z === this._z ) && ( euler._order === this._order );\n\n\t}\n\n\t/**\n\t * Sets this Euler instance's components to values from the given array. The first three\n\t * entries of the array are assign to the x,y and z components. An optional fourth entry\n\t * defines the Euler order.\n\t *\n\t * @param {Array<number,number,number,?string>} array - An array holding the Euler component values.\n\t * @return {Euler} A reference to this Euler instance.\n\t */\n\tfromArray( array ) {\n\n\t\tthis._x = array[ 0 ];\n\t\tthis._y = array[ 1 ];\n\t\tthis._z = array[ 2 ];\n\t\tif ( array[ 3 ] !== undefined ) this._order = array[ 3 ];\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Writes the components of this Euler instance to the given array. If no array is provided,\n\t * the method returns a new instance.\n\t *\n\t * @param {Array<number,number,number,string>} [array=[]] - The target array holding the Euler components.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Array<number,number,number,string>} The Euler components.\n\t */\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this._x;\n\t\tarray[ offset + 1 ] = this._y;\n\t\tarray[ offset + 2 ] = this._z;\n\t\tarray[ offset + 3 ] = this._order;\n\n\t\treturn array;\n\n\t}\n\n\t_onChange( callback ) {\n\n\t\tthis._onChangeCallback = callback;\n\n\t\treturn this;\n\n\t}\n\n\t_onChangeCallback() {}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this._x;\n\t\tyield this._y;\n\t\tyield this._z;\n\t\tyield this._order;\n\n\t}\n\n}\n\n/**\n * The default Euler angle order.\n *\n * @static\n * @type {string}\n * @default 'XYZ'\n */\nEuler.DEFAULT_ORDER = 'XYZ';\n\n/**\n * A layers object assigns an 3D object to 1 or more of 32\n * layers numbered `0` to `31` - internally the layers are stored as a\n * bit mask], and by default all 3D objects are a member of layer `0`.\n *\n * This can be used to control visibility - an object must share a layer with\n * a camera to be visible when that camera's view is\n * rendered.\n *\n * All classes that inherit from {@link Object3D} have an `layers` property which\n * is an instance of this class.\n */\nclass Layers {\n\n\t/**\n\t * Constructs a new layers instance, with membership\n\t * initially set to layer `0`.\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * A bit mask storing which of the 32 layers this layers object is currently\n\t\t * a member of.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.mask = 1 | 0;\n\n\t}\n\n\t/**\n\t * Sets membership to the given layer, and remove membership all other layers.\n\t *\n\t * @param {number} layer - The layer to set.\n\t */\n\tset( layer ) {\n\n\t\tthis.mask = ( 1 << layer | 0 ) >>> 0;\n\n\t}\n\n\t/**\n\t * Adds membership of the given layer.\n\t *\n\t * @param {number} layer - The layer to enable.\n\t */\n\tenable( layer ) {\n\n\t\tthis.mask |= 1 << layer | 0;\n\n\t}\n\n\t/**\n\t * Adds membership to all layers.\n\t */\n\tenableAll() {\n\n\t\tthis.mask = 0xffffffff | 0;\n\n\t}\n\n\t/**\n\t * Toggles the membership of the given layer.\n\t *\n\t * @param {number} layer - The layer to toggle.\n\t */\n\ttoggle( layer ) {\n\n\t\tthis.mask ^= 1 << layer | 0;\n\n\t}\n\n\t/**\n\t * Removes membership of the given layer.\n\t *\n\t * @param {number} layer - The layer to enable.\n\t */\n\tdisable( layer ) {\n\n\t\tthis.mask &= ~ ( 1 << layer | 0 );\n\n\t}\n\n\t/**\n\t * Removes the membership from all layers.\n\t */\n\tdisableAll() {\n\n\t\tthis.mask = 0;\n\n\t}\n\n\t/**\n\t * Returns `true` if this and the given layers object have at least one\n\t * layer in common.\n\t *\n\t * @param {Layers} layers - The layers to test.\n\t * @return {boolean } Whether this and the given layers object have at least one layer in common or not.\n\t */\n\ttest( layers ) {\n\n\t\treturn ( this.mask & layers.mask ) !== 0;\n\n\t}\n\n\t/**\n\t * Returns `true` if the given layer is enabled.\n\t *\n\t * @param {number} layer - The layer to test.\n\t * @return {boolean } Whether the given layer is enabled or not.\n\t */\n\tisEnabled( layer ) {\n\n\t\treturn ( this.mask & ( 1 << layer | 0 ) ) !== 0;\n\n\t}\n\n}\n\nlet _object3DId = 0;\n\nconst _v1$4 = /*@__PURE__*/ new Vector3();\nconst _q1 = /*@__PURE__*/ new Quaternion();\nconst _m1$1 = /*@__PURE__*/ new Matrix4();\nconst _target = /*@__PURE__*/ new Vector3();\n\nconst _position$3 = /*@__PURE__*/ new Vector3();\nconst _scale$2 = /*@__PURE__*/ new Vector3();\nconst _quaternion$2 = /*@__PURE__*/ new Quaternion();\n\nconst _xAxis = /*@__PURE__*/ new Vector3( 1, 0, 0 );\nconst _yAxis = /*@__PURE__*/ new Vector3( 0, 1, 0 );\nconst _zAxis = /*@__PURE__*/ new Vector3( 0, 0, 1 );\n\n/**\n * Fires when the object has been added to its parent object.\n *\n * @event Object3D#added\n * @type {Object}\n */\nconst _addedEvent = { type: 'added' };\n\n/**\n * Fires when the object has been removed from its parent object.\n *\n * @event Object3D#removed\n * @type {Object}\n */\nconst _removedEvent = { type: 'removed' };\n\n/**\n * Fires when a new child object has been added.\n *\n * @event Object3D#childadded\n * @type {Object}\n */\nconst _childaddedEvent = { type: 'childadded', child: null };\n\n/**\n * Fires when a child object has been removed.\n *\n * @event Object3D#childremoved\n * @type {Object}\n */\nconst _childremovedEvent = { type: 'childremoved', child: null };\n\n/**\n * This is the base class for most objects in three.js and provides a set of\n * properties and methods for manipulating objects in 3D space.\n *\n * @augments EventDispatcher\n */\nclass Object3D extends EventDispatcher {\n\n\t/**\n\t * Constructs a new 3D object.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isObject3D = true;\n\n\t\t/**\n\t\t * The ID of the 3D object.\n\t\t *\n\t\t * @name Object3D#id\n\t\t * @type {number}\n\t\t * @readonly\n\t\t */\n\t\tObject.defineProperty( this, 'id', { value: _object3DId ++ } );\n\n\t\t/**\n\t\t * The UUID of the 3D object.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.uuid = generateUUID();\n\n\t\t/**\n\t\t * The name of the 3D object.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\n\t\t/**\n\t\t * The type property is used for detecting the object type\n\t\t * in context of serialization/deserialization.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.type = 'Object3D';\n\n\t\t/**\n\t\t * A reference to the parent object.\n\t\t *\n\t\t * @type {?Object3D}\n\t\t * @default null\n\t\t */\n\t\tthis.parent = null;\n\n\t\t/**\n\t\t * An array holding the child 3D objects of this instance.\n\t\t *\n\t\t * @type {Array<Object3D>}\n\t\t */\n\t\tthis.children = [];\n\n\t\t/**\n\t\t * Defines the `up` direction of the 3D object which influences\n\t\t * the orientation via methods like {@link Object3D#lookAt}.\n\t\t *\n\t\t * The default values for all 3D objects is defined by `Object3D.DEFAULT_UP`.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.up = Object3D.DEFAULT_UP.clone();\n\n\t\tconst position = new Vector3();\n\t\tconst rotation = new Euler();\n\t\tconst quaternion = new Quaternion();\n\t\tconst scale = new Vector3( 1, 1, 1 );\n\n\t\tfunction onRotationChange() {\n\n\t\t\tquaternion.setFromEuler( rotation, false );\n\n\t\t}\n\n\t\tfunction onQuaternionChange() {\n\n\t\t\trotation.setFromQuaternion( quaternion, undefined, false );\n\n\t\t}\n\n\t\trotation._onChange( onRotationChange );\n\t\tquaternion._onChange( onQuaternionChange );\n\n\t\tObject.defineProperties( this, {\n\t\t\t/**\n\t\t\t * Represents the object's local position.\n\t\t\t *\n\t\t\t * @name Object3D#position\n\t\t\t * @type {Vector3}\n\t\t\t * @default (0,0,0)\n\t\t\t */\n\t\t\tposition: {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: position\n\t\t\t},\n\t\t\t/**\n\t\t\t * Represents the object's local rotation as Euler angles, in radians.\n\t\t\t *\n\t\t\t * @name Object3D#rotation\n\t\t\t * @type {Euler}\n\t\t\t * @default (0,0,0)\n\t\t\t */\n\t\t\trotation: {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: rotation\n\t\t\t},\n\t\t\t/**\n\t\t\t * Represents the object's local rotation as Quaternions.\n\t\t\t *\n\t\t\t * @name Object3D#quaternion\n\t\t\t * @type {Quaternion}\n\t\t\t */\n\t\t\tquaternion: {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: quaternion\n\t\t\t},\n\t\t\t/**\n\t\t\t * Represents the object's local scale.\n\t\t\t *\n\t\t\t * @name Object3D#scale\n\t\t\t * @type {Vector3}\n\t\t\t * @default (1,1,1)\n\t\t\t */\n\t\t\tscale: {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: scale\n\t\t\t},\n\t\t\t/**\n\t\t\t * Represents the object's model-view matrix.\n\t\t\t *\n\t\t\t * @name Object3D#modelViewMatrix\n\t\t\t * @type {Matrix4}\n\t\t\t */\n\t\t\tmodelViewMatrix: {\n\t\t\t\tvalue: new Matrix4()\n\t\t\t},\n\t\t\t/**\n\t\t\t * Represents the object's normal matrix.\n\t\t\t *\n\t\t\t * @name Object3D#normalMatrix\n\t\t\t * @type {Matrix3}\n\t\t\t */\n\t\t\tnormalMatrix: {\n\t\t\t\tvalue: new Matrix3()\n\t\t\t}\n\t\t} );\n\n\t\t/**\n\t\t * Represents the object's transformation matrix in local space.\n\t\t *\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.matrix = new Matrix4();\n\n\t\t/**\n\t\t * Represents the object's transformation matrix in world space.\n\t\t * If the 3D object has no parent, then it's identical to the local transformation matrix\n\t\t *\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.matrixWorld = new Matrix4();\n\n\t\t/**\n\t\t * When set to `true`, the engine automatically computes the local matrix from position,\n\t\t * rotation and scale every frame.\n\t\t *\n\t\t * The default values for all 3D objects is defined by `Object3D.DEFAULT_MATRIX_AUTO_UPDATE`.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.matrixAutoUpdate = Object3D.DEFAULT_MATRIX_AUTO_UPDATE;\n\n\t\t/**\n\t\t * When set to `true`, the engine automatically computes the world matrix from the current local\n\t\t * matrix and the object's transformation hierarchy.\n\t\t *\n\t\t * The default values for all 3D objects is defined by `Object3D.DEFAULT_MATRIX_WORLD_AUTO_UPDATE`.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.matrixWorldAutoUpdate = Object3D.DEFAULT_MATRIX_WORLD_AUTO_UPDATE; // checked by the renderer\n\n\t\t/**\n\t\t * When set to `true`, it calculates the world matrix in that frame and resets this property\n\t\t * to `false`.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.matrixWorldNeedsUpdate = false;\n\n\t\t/**\n\t\t * The layer membership of the 3D object. The 3D object is only visible if it has\n\t\t * at least one layer in common with the camera in use. This property can also be\n\t\t * used to filter out unwanted objects in ray-intersection tests when using {@link Raycaster}.\n\t\t *\n\t\t * @type {Layers}\n\t\t */\n\t\tthis.layers = new Layers();\n\n\t\t/**\n\t\t * When set to `true`, the 3D object gets rendered.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.visible = true;\n\n\t\t/**\n\t\t * When set to `true`, the 3D object gets rendered into shadow maps.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.castShadow = false;\n\n\t\t/**\n\t\t * When set to `true`, the 3D object is affected by shadows in the scene.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.receiveShadow = false;\n\n\t\t/**\n\t\t * When set to `true`, the 3D object is honored by view frustum culling.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.frustumCulled = true;\n\n\t\t/**\n\t\t * This value allows the default rendering order of scene graph objects to be\n\t\t * overridden although opaque and transparent objects remain sorted independently.\n\t\t * When this property is set for an instance of {@link Group},all descendants\n\t\t * objects will be sorted and rendered together. Sorting is from lowest to highest\n\t\t * render order.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.renderOrder = 0;\n\n\t\t/**\n\t\t * An array holding the animation clips of the 3D object.\n\t\t *\n\t\t * @type {Array<AnimationClip>}\n\t\t */\n\t\tthis.animations = [];\n\n\t\t/**\n\t\t * Custom depth material to be used when rendering to the depth map. Can only be used\n\t\t * in context of meshes. When shadow-casting with a {@link DirectionalLight} or {@link SpotLight},\n\t\t * if you are modifying vertex positions in the vertex shader you must specify a custom depth\n\t\t * material for proper shadows.\n\t\t *\n\t\t * Only relevant in context of {@link WebGLRenderer}.\n\t\t *\n\t\t * @type {(Material|undefined)}\n\t\t * @default undefined\n\t\t */\n\t\tthis.customDepthMaterial = undefined;\n\n\t\t/**\n\t\t * Same as {@link Object3D#customDepthMaterial}, but used with {@link PointLight}.\n\t\t *\n\t\t * Only relevant in context of {@link WebGLRenderer}.\n\t\t *\n\t\t * @type {(Material|undefined)}\n\t\t * @default undefined\n\t\t */\n\t\tthis.customDistanceMaterial = undefined;\n\n\t\t/**\n\t\t * An object that can be used to store custom data about the 3D object. It\n\t\t * should not hold references to functions as these will not be cloned.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.userData = {};\n\n\t}\n\n\t/**\n\t * A callback that is executed immediately before a 3D object is rendered to a shadow map.\n\t *\n\t * @param {Renderer|WebGLRenderer} renderer - The renderer.\n\t * @param {Object3D} object - The 3D object.\n\t * @param {Camera} camera - The camera that is used to render the scene.\n\t * @param {Camera} shadowCamera - The shadow camera.\n\t * @param {BufferGeometry} geometry - The 3D object's geometry.\n\t * @param {Material} depthMaterial - The depth material.\n\t * @param {Object} group - The geometry group data.\n\t */\n\tonBeforeShadow( /* renderer, object, camera, shadowCamera, geometry, depthMaterial, group */ ) {}\n\n\t/**\n\t * A callback that is executed immediately after a 3D object is rendered to a shadow map.\n\t *\n\t * @param {Renderer|WebGLRenderer} renderer - The renderer.\n\t * @param {Object3D} object - The 3D object.\n\t * @param {Camera} camera - The camera that is used to render the scene.\n\t * @param {Camera} shadowCamera - The shadow camera.\n\t * @param {BufferGeometry} geometry - The 3D object's geometry.\n\t * @param {Material} depthMaterial - The depth material.\n\t * @param {Object} group - The geometry group data.\n\t */\n\tonAfterShadow( /* renderer, object, camera, shadowCamera, geometry, depthMaterial, group */ ) {}\n\n\t/**\n\t * A callback that is executed immediately before a 3D object is rendered.\n\t *\n\t * @param {Renderer|WebGLRenderer} renderer - The renderer.\n\t * @param {Object3D} object - The 3D object.\n\t * @param {Camera} camera - The camera that is used to render the scene.\n\t * @param {BufferGeometry} geometry - The 3D object's geometry.\n\t * @param {Material} material - The 3D object's material.\n\t * @param {Object} group - The geometry group data.\n\t */\n\tonBeforeRender( /* renderer, scene, camera, geometry, material, group */ ) {}\n\n\t/**\n\t * A callback that is executed immediately after a 3D object is rendered.\n\t *\n\t * @param {Renderer|WebGLRenderer} renderer - The renderer.\n\t * @param {Object3D} object - The 3D object.\n\t * @param {Camera} camera - The camera that is used to render the scene.\n\t * @param {BufferGeometry} geometry - The 3D object's geometry.\n\t * @param {Material} material - The 3D object's material.\n\t * @param {Object} group - The geometry group data.\n\t */\n\tonAfterRender( /* renderer, scene, camera, geometry, material, group */ ) {}\n\n\t/**\n\t * Applies the given transformation matrix to the object and updates the object's position,\n\t * rotation and scale.\n\t *\n\t * @param {Matrix4} matrix - The transformation matrix.\n\t */\n\tapplyMatrix4( matrix ) {\n\n\t\tif ( this.matrixAutoUpdate ) this.updateMatrix();\n\n\t\tthis.matrix.premultiply( matrix );\n\n\t\tthis.matrix.decompose( this.position, this.quaternion, this.scale );\n\n\t}\n\n\t/**\n\t * Applies a rotation represented by given the quaternion to the 3D object.\n\t *\n\t * @param {Quaternion} q - The quaternion.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\tapplyQuaternion( q ) {\n\n\t\tthis.quaternion.premultiply( q );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given rotation represented as an axis/angle couple to the 3D object.\n\t *\n\t * @param {Vector3} axis - The (normalized) axis vector.\n\t * @param {number} angle - The angle in radians.\n\t */\n\tsetRotationFromAxisAngle( axis, angle ) {\n\n\t\t// assumes axis is normalized\n\n\t\tthis.quaternion.setFromAxisAngle( axis, angle );\n\n\t}\n\n\t/**\n\t * Sets the given rotation represented as Euler angles to the 3D object.\n\t *\n\t * @param {Euler} euler - The Euler angles.\n\t */\n\tsetRotationFromEuler( euler ) {\n\n\t\tthis.quaternion.setFromEuler( euler, true );\n\n\t}\n\n\t/**\n\t * Sets the given rotation represented as rotation matrix to the 3D object.\n\t *\n\t * @param {Matrix4} m - Although a 4x4 matrix is expected, the upper 3x3 portion must be\n\t * a pure rotation matrix (i.e, unscaled).\n\t */\n\tsetRotationFromMatrix( m ) {\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tthis.quaternion.setFromRotationMatrix( m );\n\n\t}\n\n\t/**\n\t * Sets the given rotation represented as a Quaternion to the 3D object.\n\t *\n\t * @param {Quaternion} q - The Quaternion\n\t */\n\tsetRotationFromQuaternion( q ) {\n\n\t\t// assumes q is normalized\n\n\t\tthis.quaternion.copy( q );\n\n\t}\n\n\t/**\n\t * Rotates the 3D object along an axis in local space.\n\t *\n\t * @param {Vector3} axis - The (normalized) axis vector.\n\t * @param {number} angle - The angle in radians.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\trotateOnAxis( axis, angle ) {\n\n\t\t// rotate object on axis in object space\n\t\t// axis is assumed to be normalized\n\n\t\t_q1.setFromAxisAngle( axis, angle );\n\n\t\tthis.quaternion.multiply( _q1 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Rotates the 3D object along an axis in world space.\n\t *\n\t * @param {Vector3} axis - The (normalized) axis vector.\n\t * @param {number} angle - The angle in radians.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\trotateOnWorldAxis( axis, angle ) {\n\n\t\t// rotate object on axis in world space\n\t\t// axis is assumed to be normalized\n\t\t// method assumes no rotated parent\n\n\t\t_q1.setFromAxisAngle( axis, angle );\n\n\t\tthis.quaternion.premultiply( _q1 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Rotates the 3D object around its X axis in local space.\n\t *\n\t * @param {number} angle - The angle in radians.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\trotateX( angle ) {\n\n\t\treturn this.rotateOnAxis( _xAxis, angle );\n\n\t}\n\n\t/**\n\t * Rotates the 3D object around its Y axis in local space.\n\t *\n\t * @param {number} angle - The angle in radians.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\trotateY( angle ) {\n\n\t\treturn this.rotateOnAxis( _yAxis, angle );\n\n\t}\n\n\t/**\n\t * Rotates the 3D object around its Z axis in local space.\n\t *\n\t * @param {number} angle - The angle in radians.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\trotateZ( angle ) {\n\n\t\treturn this.rotateOnAxis( _zAxis, angle );\n\n\t}\n\n\t/**\n\t * Translate the 3D object by a distance along the given axis in local space.\n\t *\n\t * @param {Vector3} axis - The (normalized) axis vector.\n\t * @param {number} distance - The distance in world units.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\ttranslateOnAxis( axis, distance ) {\n\n\t\t// translate object by distance along axis in object space\n\t\t// axis is assumed to be normalized\n\n\t\t_v1$4.copy( axis ).applyQuaternion( this.quaternion );\n\n\t\tthis.position.add( _v1$4.multiplyScalar( distance ) );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Translate the 3D object by a distance along its X-axis in local space.\n\t *\n\t * @param {number} distance - The distance in world units.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\ttranslateX( distance ) {\n\n\t\treturn this.translateOnAxis( _xAxis, distance );\n\n\t}\n\n\t/**\n\t * Translate the 3D object by a distance along its Y-axis in local space.\n\t *\n\t * @param {number} distance - The distance in world units.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\ttranslateY( distance ) {\n\n\t\treturn this.translateOnAxis( _yAxis, distance );\n\n\t}\n\n\t/**\n\t * Translate the 3D object by a distance along its Z-axis in local space.\n\t *\n\t * @param {number} distance - The distance in world units.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\ttranslateZ( distance ) {\n\n\t\treturn this.translateOnAxis( _zAxis, distance );\n\n\t}\n\n\t/**\n\t * Converts the given vector from this 3D object's local space to world space.\n\t *\n\t * @param {Vector3} vector - The vector to convert.\n\t * @return {Vector3} The converted vector.\n\t */\n\tlocalToWorld( vector ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\treturn vector.applyMatrix4( this.matrixWorld );\n\n\t}\n\n\t/**\n\t * Converts the given vector from this 3D object's word space to local space.\n\t *\n\t * @param {Vector3} vector - The vector to convert.\n\t * @return {Vector3} The converted vector.\n\t */\n\tworldToLocal( vector ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\treturn vector.applyMatrix4( _m1$1.copy( this.matrixWorld ).invert() );\n\n\t}\n\n\t/**\n\t * Rotates the object to face a point in world space.\n\t *\n\t * This method does not support objects having non-uniformly-scaled parent(s).\n\t *\n\t * @param {number|Vector3} x - The x coordinate in world space. Alternatively, a vector representing a position in world space\n\t * @param {number} [y] - The y coordinate in world space.\n\t * @param {number} [z] - The z coordinate in world space.\n\t */\n\tlookAt( x, y, z ) {\n\n\t\t// This method does not support objects having non-uniformly-scaled parent(s)\n\n\t\tif ( x.isVector3 ) {\n\n\t\t\t_target.copy( x );\n\n\t\t} else {\n\n\t\t\t_target.set( x, y, z );\n\n\t\t}\n\n\t\tconst parent = this.parent;\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\t_position$3.setFromMatrixPosition( this.matrixWorld );\n\n\t\tif ( this.isCamera || this.isLight ) {\n\n\t\t\t_m1$1.lookAt( _position$3, _target, this.up );\n\n\t\t} else {\n\n\t\t\t_m1$1.lookAt( _target, _position$3, this.up );\n\n\t\t}\n\n\t\tthis.quaternion.setFromRotationMatrix( _m1$1 );\n\n\t\tif ( parent ) {\n\n\t\t\t_m1$1.extractRotation( parent.matrixWorld );\n\t\t\t_q1.setFromRotationMatrix( _m1$1 );\n\t\t\tthis.quaternion.premultiply( _q1.invert() );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Adds the given 3D object as a child to this 3D object. An arbitrary number of\n\t * objects may be added. Any current parent on an object passed in here will be\n\t * removed, since an object can have at most one parent.\n\t *\n\t * @fires Object3D#added\n\t * @fires Object3D#childadded\n\t * @param {Object3D} object - The 3D object to add.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\tadd( object ) {\n\n\t\tif ( arguments.length > 1 ) {\n\n\t\t\tfor ( let i = 0; i < arguments.length; i ++ ) {\n\n\t\t\t\tthis.add( arguments[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tif ( object === this ) {\n\n\t\t\terror( 'Object3D.add: object can\\'t be added as a child of itself.', object );\n\t\t\treturn this;\n\n\t\t}\n\n\t\tif ( object && object.isObject3D ) {\n\n\t\t\tobject.removeFromParent();\n\t\t\tobject.parent = this;\n\t\t\tthis.children.push( object );\n\n\t\t\tobject.dispatchEvent( _addedEvent );\n\n\t\t\t_childaddedEvent.child = object;\n\t\t\tthis.dispatchEvent( _childaddedEvent );\n\t\t\t_childaddedEvent.child = null;\n\n\t\t} else {\n\n\t\t\terror( 'Object3D.add: object not an instance of THREE.Object3D.', object );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Removes the given 3D object as child from this 3D object.\n\t * An arbitrary number of objects may be removed.\n\t *\n\t * @fires Object3D#removed\n\t * @fires Object3D#childremoved\n\t * @param {Object3D} object - The 3D object to remove.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\tremove( object ) {\n\n\t\tif ( arguments.length > 1 ) {\n\n\t\t\tfor ( let i = 0; i < arguments.length; i ++ ) {\n\n\t\t\t\tthis.remove( arguments[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tconst index = this.children.indexOf( object );\n\n\t\tif ( index !== -1 ) {\n\n\t\t\tobject.parent = null;\n\t\t\tthis.children.splice( index, 1 );\n\n\t\t\tobject.dispatchEvent( _removedEvent );\n\n\t\t\t_childremovedEvent.child = object;\n\t\t\tthis.dispatchEvent( _childremovedEvent );\n\t\t\t_childremovedEvent.child = null;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Removes this 3D object from its current parent.\n\t *\n\t * @fires Object3D#removed\n\t * @fires Object3D#childremoved\n\t * @return {Object3D} A reference to this instance.\n\t */\n\tremoveFromParent() {\n\n\t\tconst parent = this.parent;\n\n\t\tif ( parent !== null ) {\n\n\t\t\tparent.remove( this );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Removes all child objects.\n\t *\n\t * @fires Object3D#removed\n\t * @fires Object3D#childremoved\n\t * @return {Object3D} A reference to this instance.\n\t */\n\tclear() {\n\n\t\treturn this.remove( ... this.children );\n\n\t}\n\n\t/**\n\t * Adds the given 3D object as a child of this 3D object, while maintaining the object's world\n\t * transform. This method does not support scene graphs having non-uniformly-scaled nodes(s).\n\t *\n\t * @fires Object3D#added\n\t * @fires Object3D#childadded\n\t * @param {Object3D} object - The 3D object to attach.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\tattach( object ) {\n\n\t\t// adds object as a child of this, while maintaining the object's world transform\n\n\t\t// Note: This method does not support scene graphs having non-uniformly-scaled nodes(s)\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\t_m1$1.copy( this.matrixWorld ).invert();\n\n\t\tif ( object.parent !== null ) {\n\n\t\t\tobject.parent.updateWorldMatrix( true, false );\n\n\t\t\t_m1$1.multiply( object.parent.matrixWorld );\n\n\t\t}\n\n\t\tobject.applyMatrix4( _m1$1 );\n\n\t\tobject.removeFromParent();\n\t\tobject.parent = this;\n\t\tthis.children.push( object );\n\n\t\tobject.updateWorldMatrix( false, true );\n\n\t\tobject.dispatchEvent( _addedEvent );\n\n\t\t_childaddedEvent.child = object;\n\t\tthis.dispatchEvent( _childaddedEvent );\n\t\t_childaddedEvent.child = null;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Searches through the 3D object and its children, starting with the 3D object\n\t * itself, and returns the first with a matching ID.\n\t *\n\t * @param {number} id - The id.\n\t * @return {Object3D|undefined} The found 3D object. Returns `undefined` if no 3D object has been found.\n\t */\n\tgetObjectById( id ) {\n\n\t\treturn this.getObjectByProperty( 'id', id );\n\n\t}\n\n\t/**\n\t * Searches through the 3D object and its children, starting with the 3D object\n\t * itself, and returns the first with a matching name.\n\t *\n\t * @param {string} name - The name.\n\t * @return {Object3D|undefined} The found 3D object. Returns `undefined` if no 3D object has been found.\n\t */\n\tgetObjectByName( name ) {\n\n\t\treturn this.getObjectByProperty( 'name', name );\n\n\t}\n\n\t/**\n\t * Searches through the 3D object and its children, starting with the 3D object\n\t * itself, and returns the first with a matching property value.\n\t *\n\t * @param {string} name - The name of the property.\n\t * @param {any} value - The value.\n\t * @return {Object3D|undefined} The found 3D object. Returns `undefined` if no 3D object has been found.\n\t */\n\tgetObjectByProperty( name, value ) {\n\n\t\tif ( this[ name ] === value ) return this;\n\n\t\tfor ( let i = 0, l = this.children.length; i < l; i ++ ) {\n\n\t\t\tconst child = this.children[ i ];\n\t\t\tconst object = child.getObjectByProperty( name, value );\n\n\t\t\tif ( object !== undefined ) {\n\n\t\t\t\treturn object;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn undefined;\n\n\t}\n\n\t/**\n\t * Searches through the 3D object and its children, starting with the 3D object\n\t * itself, and returns all 3D objects with a matching property value.\n\t *\n\t * @param {string} name - The name of the property.\n\t * @param {any} value - The value.\n\t * @param {Array<Object3D>} result - The method stores the result in this array.\n\t * @return {Array<Object3D>} The found 3D objects.\n\t */\n\tgetObjectsByProperty( name, value, result = [] ) {\n\n\t\tif ( this[ name ] === value ) result.push( this );\n\n\t\tconst children = this.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tchildren[ i ].getObjectsByProperty( name, value, result );\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\t/**\n\t * Returns a vector representing the position of the 3D object in world space.\n\t *\n\t * @param {Vector3} target - The target vector the result is stored to.\n\t * @return {Vector3} The 3D object's position in world space.\n\t */\n\tgetWorldPosition( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\treturn target.setFromMatrixPosition( this.matrixWorld );\n\n\t}\n\n\t/**\n\t * Returns a Quaternion representing the position of the 3D object in world space.\n\t *\n\t * @param {Quaternion} target - The target Quaternion the result is stored to.\n\t * @return {Quaternion} The 3D object's rotation in world space.\n\t */\n\tgetWorldQuaternion( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\tthis.matrixWorld.decompose( _position$3, target, _scale$2 );\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Returns a vector representing the scale of the 3D object in world space.\n\t *\n\t * @param {Vector3} target - The target vector the result is stored to.\n\t * @return {Vector3} The 3D object's scale in world space.\n\t */\n\tgetWorldScale( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\tthis.matrixWorld.decompose( _position$3, _quaternion$2, target );\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Returns a vector representing the (\"look\") direction of the 3D object in world space.\n\t *\n\t * @param {Vector3} target - The target vector the result is stored to.\n\t * @return {Vector3} The 3D object's direction in world space.\n\t */\n\tgetWorldDirection( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\tconst e = this.matrixWorld.elements;\n\n\t\treturn target.set( e[ 8 ], e[ 9 ], e[ 10 ] ).normalize();\n\n\t}\n\n\t/**\n\t * Abstract method to get intersections between a casted ray and this\n\t * 3D object. Renderable 3D objects such as {@link Mesh}, {@link Line} or {@link Points}\n\t * implement this method in order to use raycasting.\n\t *\n\t * @abstract\n\t * @param {Raycaster} raycaster - The raycaster.\n\t * @param {Array<Object>} intersects - An array holding the result of the method.\n\t */\n\traycast( /* raycaster, intersects */ ) {}\n\n\t/**\n\t * Executes the callback on this 3D object and all descendants.\n\t *\n\t * Note: Modifying the scene graph inside the callback is discouraged.\n\t *\n\t * @param {Function} callback - A callback function that allows to process the current 3D object.\n\t */\n\ttraverse( callback ) {\n\n\t\tcallback( this );\n\n\t\tconst children = this.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tchildren[ i ].traverse( callback );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Like {@link Object3D#traverse}, but the callback will only be executed for visible 3D objects.\n\t * Descendants of invisible 3D objects are not traversed.\n\t *\n\t * Note: Modifying the scene graph inside the callback is discouraged.\n\t *\n\t * @param {Function} callback - A callback function that allows to process the current 3D object.\n\t */\n\ttraverseVisible( callback ) {\n\n\t\tif ( this.visible === false ) return;\n\n\t\tcallback( this );\n\n\t\tconst children = this.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tchildren[ i ].traverseVisible( callback );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Like {@link Object3D#traverse}, but the callback will only be executed for all ancestors.\n\t *\n\t * Note: Modifying the scene graph inside the callback is discouraged.\n\t *\n\t * @param {Function} callback - A callback function that allows to process the current 3D object.\n\t */\n\ttraverseAncestors( callback ) {\n\n\t\tconst parent = this.parent;\n\n\t\tif ( parent !== null ) {\n\n\t\t\tcallback( parent );\n\n\t\t\tparent.traverseAncestors( callback );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Updates the transformation matrix in local space by computing it from the current\n\t * position, rotation and scale values.\n\t */\n\tupdateMatrix() {\n\n\t\tthis.matrix.compose( this.position, this.quaternion, this.scale );\n\n\t\tthis.matrixWorldNeedsUpdate = true;\n\n\t}\n\n\t/**\n\t * Updates the transformation matrix in world space of this 3D objects and its descendants.\n\t *\n\t * To ensure correct results, this method also recomputes the 3D object's transformation matrix in\n\t * local space. The computation of the local and world matrix can be controlled with the\n\t * {@link Object3D#matrixAutoUpdate} and {@link Object3D#matrixWorldAutoUpdate} flags which are both\n\t * `true` by default.  Set these flags to `false` if you need more control over the update matrix process.\n\t *\n\t * @param {boolean} [force=false] - When set to `true`, a recomputation of world matrices is forced even\n\t * when {@link Object3D#matrixWorldAutoUpdate} is set to `false`.\n\t */\n\tupdateMatrixWorld( force ) {\n\n\t\tif ( this.matrixAutoUpdate ) this.updateMatrix();\n\n\t\tif ( this.matrixWorldNeedsUpdate || force ) {\n\n\t\t\tif ( this.matrixWorldAutoUpdate === true ) {\n\n\t\t\t\tif ( this.parent === null ) {\n\n\t\t\t\t\tthis.matrixWorld.copy( this.matrix );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.matrixWorldNeedsUpdate = false;\n\n\t\t\tforce = true;\n\n\t\t}\n\n\t\t// make sure descendants are updated if required\n\n\t\tconst children = this.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tconst child = children[ i ];\n\n\t\t\tchild.updateMatrixWorld( force );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * An alternative version of {@link Object3D#updateMatrixWorld} with more control over the\n\t * update of ancestor and descendant nodes.\n\t *\n\t * @param {boolean} [updateParents=false] Whether ancestor nodes should be updated or not.\n\t * @param {boolean} [updateChildren=false] Whether descendant nodes should be updated or not.\n\t */\n\tupdateWorldMatrix( updateParents, updateChildren ) {\n\n\t\tconst parent = this.parent;\n\n\t\tif ( updateParents === true && parent !== null ) {\n\n\t\t\tparent.updateWorldMatrix( true, false );\n\n\t\t}\n\n\t\tif ( this.matrixAutoUpdate ) this.updateMatrix();\n\n\t\tif ( this.matrixWorldAutoUpdate === true ) {\n\n\t\t\tif ( this.parent === null ) {\n\n\t\t\t\tthis.matrixWorld.copy( this.matrix );\n\n\t\t\t} else {\n\n\t\t\t\tthis.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// make sure descendants are updated\n\n\t\tif ( updateChildren === true ) {\n\n\t\t\tconst children = this.children;\n\n\t\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tconst child = children[ i ];\n\n\t\t\t\tchild.updateWorldMatrix( false, true );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Serializes the 3D object into JSON.\n\t *\n\t * @param {?(Object|string)} meta - An optional value holding meta information about the serialization.\n\t * @return {Object} A JSON object representing the serialized 3D object.\n\t * @see {@link ObjectLoader#parse}\n\t */\n\ttoJSON( meta ) {\n\n\t\t// meta is a string when called from JSON.stringify\n\t\tconst isRootObject = ( meta === undefined || typeof meta === 'string' );\n\n\t\tconst output = {};\n\n\t\t// meta is a hash used to collect geometries, materials.\n\t\t// not providing it implies that this is the root object\n\t\t// being serialized.\n\t\tif ( isRootObject ) {\n\n\t\t\t// initialize meta obj\n\t\t\tmeta = {\n\t\t\t\tgeometries: {},\n\t\t\t\tmaterials: {},\n\t\t\t\ttextures: {},\n\t\t\t\timages: {},\n\t\t\t\tshapes: {},\n\t\t\t\tskeletons: {},\n\t\t\t\tanimations: {},\n\t\t\t\tnodes: {}\n\t\t\t};\n\n\t\t\toutput.metadata = {\n\t\t\t\tversion: 4.7,\n\t\t\t\ttype: 'Object',\n\t\t\t\tgenerator: 'Object3D.toJSON'\n\t\t\t};\n\n\t\t}\n\n\t\t// standard Object3D serialization\n\n\t\tconst object = {};\n\n\t\tobject.uuid = this.uuid;\n\t\tobject.type = this.type;\n\n\t\tif ( this.name !== '' ) object.name = this.name;\n\t\tif ( this.castShadow === true ) object.castShadow = true;\n\t\tif ( this.receiveShadow === true ) object.receiveShadow = true;\n\t\tif ( this.visible === false ) object.visible = false;\n\t\tif ( this.frustumCulled === false ) object.frustumCulled = false;\n\t\tif ( this.renderOrder !== 0 ) object.renderOrder = this.renderOrder;\n\t\tif ( Object.keys( this.userData ).length > 0 ) object.userData = this.userData;\n\n\t\tobject.layers = this.layers.mask;\n\t\tobject.matrix = this.matrix.toArray();\n\t\tobject.up = this.up.toArray();\n\n\t\tif ( this.matrixAutoUpdate === false ) object.matrixAutoUpdate = false;\n\n\t\t// object specific properties\n\n\t\tif ( this.isInstancedMesh ) {\n\n\t\t\tobject.type = 'InstancedMesh';\n\t\t\tobject.count = this.count;\n\t\t\tobject.instanceMatrix = this.instanceMatrix.toJSON();\n\t\t\tif ( this.instanceColor !== null ) object.instanceColor = this.instanceColor.toJSON();\n\n\t\t}\n\n\t\tif ( this.isBatchedMesh ) {\n\n\t\t\tobject.type = 'BatchedMesh';\n\t\t\tobject.perObjectFrustumCulled = this.perObjectFrustumCulled;\n\t\t\tobject.sortObjects = this.sortObjects;\n\n\t\t\tobject.drawRanges = this._drawRanges;\n\t\t\tobject.reservedRanges = this._reservedRanges;\n\n\t\t\tobject.geometryInfo = this._geometryInfo.map( info => ( {\n\t\t\t\t...info,\n\t\t\t\tboundingBox: info.boundingBox ? info.boundingBox.toJSON() : undefined,\n\t\t\t\tboundingSphere: info.boundingSphere ? info.boundingSphere.toJSON() : undefined\n\t\t\t} ) );\n\t\t\tobject.instanceInfo = this._instanceInfo.map( info => ( { ...info } ) );\n\n\t\t\tobject.availableInstanceIds = this._availableInstanceIds.slice();\n\t\t\tobject.availableGeometryIds = this._availableGeometryIds.slice();\n\n\t\t\tobject.nextIndexStart = this._nextIndexStart;\n\t\t\tobject.nextVertexStart = this._nextVertexStart;\n\t\t\tobject.geometryCount = this._geometryCount;\n\n\t\t\tobject.maxInstanceCount = this._maxInstanceCount;\n\t\t\tobject.maxVertexCount = this._maxVertexCount;\n\t\t\tobject.maxIndexCount = this._maxIndexCount;\n\n\t\t\tobject.geometryInitialized = this._geometryInitialized;\n\n\t\t\tobject.matricesTexture = this._matricesTexture.toJSON( meta );\n\n\t\t\tobject.indirectTexture = this._indirectTexture.toJSON( meta );\n\n\t\t\tif ( this._colorsTexture !== null ) {\n\n\t\t\t\tobject.colorsTexture = this._colorsTexture.toJSON( meta );\n\n\t\t\t}\n\n\t\t\tif ( this.boundingSphere !== null ) {\n\n\t\t\t\tobject.boundingSphere = this.boundingSphere.toJSON();\n\n\t\t\t}\n\n\t\t\tif ( this.boundingBox !== null ) {\n\n\t\t\t\tobject.boundingBox = this.boundingBox.toJSON();\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tfunction serialize( library, element ) {\n\n\t\t\tif ( library[ element.uuid ] === undefined ) {\n\n\t\t\t\tlibrary[ element.uuid ] = element.toJSON( meta );\n\n\t\t\t}\n\n\t\t\treturn element.uuid;\n\n\t\t}\n\n\t\tif ( this.isScene ) {\n\n\t\t\tif ( this.background ) {\n\n\t\t\t\tif ( this.background.isColor ) {\n\n\t\t\t\t\tobject.background = this.background.toJSON();\n\n\t\t\t\t} else if ( this.background.isTexture ) {\n\n\t\t\t\t\tobject.background = this.background.toJSON( meta ).uuid;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.environment && this.environment.isTexture && this.environment.isRenderTargetTexture !== true ) {\n\n\t\t\t\tobject.environment = this.environment.toJSON( meta ).uuid;\n\n\t\t\t}\n\n\t\t} else if ( this.isMesh || this.isLine || this.isPoints ) {\n\n\t\t\tobject.geometry = serialize( meta.geometries, this.geometry );\n\n\t\t\tconst parameters = this.geometry.parameters;\n\n\t\t\tif ( parameters !== undefined && parameters.shapes !== undefined ) {\n\n\t\t\t\tconst shapes = parameters.shapes;\n\n\t\t\t\tif ( Array.isArray( shapes ) ) {\n\n\t\t\t\t\tfor ( let i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tconst shape = shapes[ i ];\n\n\t\t\t\t\t\tserialize( meta.shapes, shape );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tserialize( meta.shapes, shapes );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.isSkinnedMesh ) {\n\n\t\t\tobject.bindMode = this.bindMode;\n\t\t\tobject.bindMatrix = this.bindMatrix.toArray();\n\n\t\t\tif ( this.skeleton !== undefined ) {\n\n\t\t\t\tserialize( meta.skeletons, this.skeleton );\n\n\t\t\t\tobject.skeleton = this.skeleton.uuid;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.material !== undefined ) {\n\n\t\t\tif ( Array.isArray( this.material ) ) {\n\n\t\t\t\tconst uuids = [];\n\n\t\t\t\tfor ( let i = 0, l = this.material.length; i < l; i ++ ) {\n\n\t\t\t\t\tuuids.push( serialize( meta.materials, this.material[ i ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tobject.material = uuids;\n\n\t\t\t} else {\n\n\t\t\t\tobject.material = serialize( meta.materials, this.material );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tif ( this.children.length > 0 ) {\n\n\t\t\tobject.children = [];\n\n\t\t\tfor ( let i = 0; i < this.children.length; i ++ ) {\n\n\t\t\t\tobject.children.push( this.children[ i ].toJSON( meta ).object );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tif ( this.animations.length > 0 ) {\n\n\t\t\tobject.animations = [];\n\n\t\t\tfor ( let i = 0; i < this.animations.length; i ++ ) {\n\n\t\t\t\tconst animation = this.animations[ i ];\n\n\t\t\t\tobject.animations.push( serialize( meta.animations, animation ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( isRootObject ) {\n\n\t\t\tconst geometries = extractFromCache( meta.geometries );\n\t\t\tconst materials = extractFromCache( meta.materials );\n\t\t\tconst textures = extractFromCache( meta.textures );\n\t\t\tconst images = extractFromCache( meta.images );\n\t\t\tconst shapes = extractFromCache( meta.shapes );\n\t\t\tconst skeletons = extractFromCache( meta.skeletons );\n\t\t\tconst animations = extractFromCache( meta.animations );\n\t\t\tconst nodes = extractFromCache( meta.nodes );\n\n\t\t\tif ( geometries.length > 0 ) output.geometries = geometries;\n\t\t\tif ( materials.length > 0 ) output.materials = materials;\n\t\t\tif ( textures.length > 0 ) output.textures = textures;\n\t\t\tif ( images.length > 0 ) output.images = images;\n\t\t\tif ( shapes.length > 0 ) output.shapes = shapes;\n\t\t\tif ( skeletons.length > 0 ) output.skeletons = skeletons;\n\t\t\tif ( animations.length > 0 ) output.animations = animations;\n\t\t\tif ( nodes.length > 0 ) output.nodes = nodes;\n\n\t\t}\n\n\t\toutput.object = object;\n\n\t\treturn output;\n\n\t\t// extract data from the cache hash\n\t\t// remove metadata on each item\n\t\t// and return as array\n\t\tfunction extractFromCache( cache ) {\n\n\t\t\tconst values = [];\n\t\t\tfor ( const key in cache ) {\n\n\t\t\t\tconst data = cache[ key ];\n\t\t\t\tdelete data.metadata;\n\t\t\t\tvalues.push( data );\n\n\t\t\t}\n\n\t\t\treturn values;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns a new 3D object with copied values from this instance.\n\t *\n\t * @param {boolean} [recursive=true] - When set to `true`, descendants of the 3D object are also cloned.\n\t * @return {Object3D} A clone of this instance.\n\t */\n\tclone( recursive ) {\n\n\t\treturn new this.constructor().copy( this, recursive );\n\n\t}\n\n\t/**\n\t * Copies the values of the given 3D object to this instance.\n\t *\n\t * @param {Object3D} source - The 3D object to copy.\n\t * @param {boolean} [recursive=true] - When set to `true`, descendants of the 3D object are cloned.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\tcopy( source, recursive = true ) {\n\n\t\tthis.name = source.name;\n\n\t\tthis.up.copy( source.up );\n\n\t\tthis.position.copy( source.position );\n\t\tthis.rotation.order = source.rotation.order;\n\t\tthis.quaternion.copy( source.quaternion );\n\t\tthis.scale.copy( source.scale );\n\n\t\tthis.matrix.copy( source.matrix );\n\t\tthis.matrixWorld.copy( source.matrixWorld );\n\n\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\n\t\tthis.matrixWorldAutoUpdate = source.matrixWorldAutoUpdate;\n\t\tthis.matrixWorldNeedsUpdate = source.matrixWorldNeedsUpdate;\n\n\t\tthis.layers.mask = source.layers.mask;\n\t\tthis.visible = source.visible;\n\n\t\tthis.castShadow = source.castShadow;\n\t\tthis.receiveShadow = source.receiveShadow;\n\n\t\tthis.frustumCulled = source.frustumCulled;\n\t\tthis.renderOrder = source.renderOrder;\n\n\t\tthis.animations = source.animations.slice();\n\n\t\tthis.userData = JSON.parse( JSON.stringify( source.userData ) );\n\n\t\tif ( recursive === true ) {\n\n\t\t\tfor ( let i = 0; i < source.children.length; i ++ ) {\n\n\t\t\t\tconst child = source.children[ i ];\n\t\t\t\tthis.add( child.clone() );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * The default up direction for objects, also used as the default\n * position for {@link DirectionalLight} and {@link HemisphereLight}.\n *\n * @static\n * @type {Vector3}\n * @default (0,1,0)\n */\nObject3D.DEFAULT_UP = /*@__PURE__*/ new Vector3( 0, 1, 0 );\n\n/**\n * The default setting for {@link Object3D#matrixAutoUpdate} for\n * newly created 3D objects.\n *\n * @static\n * @type {boolean}\n * @default true\n */\nObject3D.DEFAULT_MATRIX_AUTO_UPDATE = true;\n\n/**\n * The default setting for {@link Object3D#matrixWorldAutoUpdate} for\n * newly created 3D objects.\n *\n * @static\n * @type {boolean}\n * @default true\n */\nObject3D.DEFAULT_MATRIX_WORLD_AUTO_UPDATE = true;\n\nconst _v0$1 = /*@__PURE__*/ new Vector3();\nconst _v1$3 = /*@__PURE__*/ new Vector3();\nconst _v2$2 = /*@__PURE__*/ new Vector3();\nconst _v3$2 = /*@__PURE__*/ new Vector3();\n\nconst _vab = /*@__PURE__*/ new Vector3();\nconst _vac = /*@__PURE__*/ new Vector3();\nconst _vbc = /*@__PURE__*/ new Vector3();\nconst _vap = /*@__PURE__*/ new Vector3();\nconst _vbp = /*@__PURE__*/ new Vector3();\nconst _vcp = /*@__PURE__*/ new Vector3();\n\nconst _v40 = /*@__PURE__*/ new Vector4();\nconst _v41 = /*@__PURE__*/ new Vector4();\nconst _v42 = /*@__PURE__*/ new Vector4();\n\n/**\n * A geometric triangle as defined by three vectors representing its three corners.\n */\nclass Triangle {\n\n\t/**\n\t * Constructs a new triangle.\n\t *\n\t * @param {Vector3} [a=(0,0,0)] - The first corner of the triangle.\n\t * @param {Vector3} [b=(0,0,0)] - The second corner of the triangle.\n\t * @param {Vector3} [c=(0,0,0)] - The third corner of the triangle.\n\t */\n\tconstructor( a = new Vector3(), b = new Vector3(), c = new Vector3() ) {\n\n\t\t/**\n\t\t * The first corner of the triangle.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.a = a;\n\n\t\t/**\n\t\t * The second corner of the triangle.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.b = b;\n\n\t\t/**\n\t\t * The third corner of the triangle.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.c = c;\n\n\t}\n\n\t/**\n\t * Computes the normal vector of a triangle.\n\t *\n\t * @param {Vector3} a - The first corner of the triangle.\n\t * @param {Vector3} b - The second corner of the triangle.\n\t * @param {Vector3} c - The third corner of the triangle.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The triangle's normal.\n\t */\n\tstatic getNormal( a, b, c, target ) {\n\n\t\ttarget.subVectors( c, b );\n\t\t_v0$1.subVectors( a, b );\n\t\ttarget.cross( _v0$1 );\n\n\t\tconst targetLengthSq = target.lengthSq();\n\t\tif ( targetLengthSq > 0 ) {\n\n\t\t\treturn target.multiplyScalar( 1 / Math.sqrt( targetLengthSq ) );\n\n\t\t}\n\n\t\treturn target.set( 0, 0, 0 );\n\n\t}\n\n\t/**\n\t * Computes a barycentric coordinates from the given vector.\n\t * Returns `null` if the triangle is degenerate.\n\t *\n\t * @param {Vector3} point - A point in 3D space.\n\t * @param {Vector3} a - The first corner of the triangle.\n\t * @param {Vector3} b - The second corner of the triangle.\n\t * @param {Vector3} c - The third corner of the triangle.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {?Vector3} The barycentric coordinates for the given point\n\t */\n\tstatic getBarycoord( point, a, b, c, target ) {\n\n\t\t// based on: http://www.blackpawn.com/texts/pointinpoly/default.html\n\n\t\t_v0$1.subVectors( c, a );\n\t\t_v1$3.subVectors( b, a );\n\t\t_v2$2.subVectors( point, a );\n\n\t\tconst dot00 = _v0$1.dot( _v0$1 );\n\t\tconst dot01 = _v0$1.dot( _v1$3 );\n\t\tconst dot02 = _v0$1.dot( _v2$2 );\n\t\tconst dot11 = _v1$3.dot( _v1$3 );\n\t\tconst dot12 = _v1$3.dot( _v2$2 );\n\n\t\tconst denom = ( dot00 * dot11 - dot01 * dot01 );\n\n\t\t// collinear or singular triangle\n\t\tif ( denom === 0 ) {\n\n\t\t\ttarget.set( 0, 0, 0 );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst invDenom = 1 / denom;\n\t\tconst u = ( dot11 * dot02 - dot01 * dot12 ) * invDenom;\n\t\tconst v = ( dot00 * dot12 - dot01 * dot02 ) * invDenom;\n\n\t\t// barycentric coordinates must always sum to 1\n\t\treturn target.set( 1 - u - v, v, u );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given point, when projected onto the plane of the\n\t * triangle, lies within the triangle.\n\t *\n\t * @param {Vector3} point - The point in 3D space to test.\n\t * @param {Vector3} a - The first corner of the triangle.\n\t * @param {Vector3} b - The second corner of the triangle.\n\t * @param {Vector3} c - The third corner of the triangle.\n\t * @return {boolean} Whether the given point, when projected onto the plane of the\n\t * triangle, lies within the triangle or not.\n\t */\n\tstatic containsPoint( point, a, b, c ) {\n\n\t\t// if the triangle is degenerate then we can't contain a point\n\t\tif ( this.getBarycoord( point, a, b, c, _v3$2 ) === null ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\treturn ( _v3$2.x >= 0 ) && ( _v3$2.y >= 0 ) && ( ( _v3$2.x + _v3$2.y ) <= 1 );\n\n\t}\n\n\t/**\n\t * Computes the value barycentrically interpolated for the given point on the\n\t * triangle. Returns `null` if the triangle is degenerate.\n\t *\n\t * @param {Vector3} point - Position of interpolated point.\n\t * @param {Vector3} p1 - The first corner of the triangle.\n\t * @param {Vector3} p2 - The second corner of the triangle.\n\t * @param {Vector3} p3 - The third corner of the triangle.\n\t * @param {Vector3} v1 - Value to interpolate of first vertex.\n\t * @param {Vector3} v2 - Value to interpolate of second vertex.\n\t * @param {Vector3} v3 - Value to interpolate of third vertex.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {?Vector3} The interpolated value.\n\t */\n\tstatic getInterpolation( point, p1, p2, p3, v1, v2, v3, target ) {\n\n\t\tif ( this.getBarycoord( point, p1, p2, p3, _v3$2 ) === null ) {\n\n\t\t\ttarget.x = 0;\n\t\t\ttarget.y = 0;\n\t\t\tif ( 'z' in target ) target.z = 0;\n\t\t\tif ( 'w' in target ) target.w = 0;\n\t\t\treturn null;\n\n\t\t}\n\n\t\ttarget.setScalar( 0 );\n\t\ttarget.addScaledVector( v1, _v3$2.x );\n\t\ttarget.addScaledVector( v2, _v3$2.y );\n\t\ttarget.addScaledVector( v3, _v3$2.z );\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Computes the value barycentrically interpolated for the given attribute and indices.\n\t *\n\t * @param {BufferAttribute} attr - The attribute to interpolate.\n\t * @param {number} i1 - Index of first vertex.\n\t * @param {number} i2 - Index of second vertex.\n\t * @param {number} i3 - Index of third vertex.\n\t * @param {Vector3} barycoord - The barycoordinate value to use to interpolate.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The interpolated attribute value.\n\t */\n\tstatic getInterpolatedAttribute( attr, i1, i2, i3, barycoord, target ) {\n\n\t\t_v40.setScalar( 0 );\n\t\t_v41.setScalar( 0 );\n\t\t_v42.setScalar( 0 );\n\n\t\t_v40.fromBufferAttribute( attr, i1 );\n\t\t_v41.fromBufferAttribute( attr, i2 );\n\t\t_v42.fromBufferAttribute( attr, i3 );\n\n\t\ttarget.setScalar( 0 );\n\t\ttarget.addScaledVector( _v40, barycoord.x );\n\t\ttarget.addScaledVector( _v41, barycoord.y );\n\t\ttarget.addScaledVector( _v42, barycoord.z );\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Returns `true` if the triangle is oriented towards the given direction.\n\t *\n\t * @param {Vector3} a - The first corner of the triangle.\n\t * @param {Vector3} b - The second corner of the triangle.\n\t * @param {Vector3} c - The third corner of the triangle.\n\t * @param {Vector3} direction - The (normalized) direction vector.\n\t * @return {boolean} Whether the triangle is oriented towards the given direction or not.\n\t */\n\tstatic isFrontFacing( a, b, c, direction ) {\n\n\t\t_v0$1.subVectors( c, b );\n\t\t_v1$3.subVectors( a, b );\n\n\t\t// strictly front facing\n\t\treturn ( _v0$1.cross( _v1$3 ).dot( direction ) < 0 ) ? true : false;\n\n\t}\n\n\t/**\n\t * Sets the triangle's vertices by copying the given values.\n\t *\n\t * @param {Vector3} a - The first corner of the triangle.\n\t * @param {Vector3} b - The second corner of the triangle.\n\t * @param {Vector3} c - The third corner of the triangle.\n\t * @return {Triangle} A reference to this triangle.\n\t */\n\tset( a, b, c ) {\n\n\t\tthis.a.copy( a );\n\t\tthis.b.copy( b );\n\t\tthis.c.copy( c );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the triangle's vertices by copying the given array values.\n\t *\n\t * @param {Array<Vector3>} points - An array with 3D points.\n\t * @param {number} i0 - The array index representing the first corner of the triangle.\n\t * @param {number} i1 - The array index representing the second corner of the triangle.\n\t * @param {number} i2 - The array index representing the third corner of the triangle.\n\t * @return {Triangle} A reference to this triangle.\n\t */\n\tsetFromPointsAndIndices( points, i0, i1, i2 ) {\n\n\t\tthis.a.copy( points[ i0 ] );\n\t\tthis.b.copy( points[ i1 ] );\n\t\tthis.c.copy( points[ i2 ] );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the triangle's vertices by copying the given attribute values.\n\t *\n\t * @param {BufferAttribute} attribute - A buffer attribute with 3D points data.\n\t * @param {number} i0 - The attribute index representing the first corner of the triangle.\n\t * @param {number} i1 - The attribute index representing the second corner of the triangle.\n\t * @param {number} i2 - The attribute index representing the third corner of the triangle.\n\t * @return {Triangle} A reference to this triangle.\n\t */\n\tsetFromAttributeAndIndices( attribute, i0, i1, i2 ) {\n\n\t\tthis.a.fromBufferAttribute( attribute, i0 );\n\t\tthis.b.fromBufferAttribute( attribute, i1 );\n\t\tthis.c.fromBufferAttribute( attribute, i2 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new triangle with copied values from this instance.\n\t *\n\t * @return {Triangle} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Copies the values of the given triangle to this instance.\n\t *\n\t * @param {Triangle} triangle - The triangle to copy.\n\t * @return {Triangle} A reference to this triangle.\n\t */\n\tcopy( triangle ) {\n\n\t\tthis.a.copy( triangle.a );\n\t\tthis.b.copy( triangle.b );\n\t\tthis.c.copy( triangle.c );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes the area of the triangle.\n\t *\n\t * @return {number} The triangle's area.\n\t */\n\tgetArea() {\n\n\t\t_v0$1.subVectors( this.c, this.b );\n\t\t_v1$3.subVectors( this.a, this.b );\n\n\t\treturn _v0$1.cross( _v1$3 ).length() * 0.5;\n\n\t}\n\n\t/**\n\t * Computes the midpoint of the triangle.\n\t *\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The triangle's midpoint.\n\t */\n\tgetMidpoint( target ) {\n\n\t\treturn target.addVectors( this.a, this.b ).add( this.c ).multiplyScalar( 1 / 3 );\n\n\t}\n\n\t/**\n\t * Computes the normal of the triangle.\n\t *\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The triangle's normal.\n\t */\n\tgetNormal( target ) {\n\n\t\treturn Triangle.getNormal( this.a, this.b, this.c, target );\n\n\t}\n\n\t/**\n\t * Computes a plane the triangle lies within.\n\t *\n\t * @param {Plane} target - The target vector that is used to store the method's result.\n\t * @return {Plane} The plane the triangle lies within.\n\t */\n\tgetPlane( target ) {\n\n\t\treturn target.setFromCoplanarPoints( this.a, this.b, this.c );\n\n\t}\n\n\t/**\n\t * Computes a barycentric coordinates from the given vector.\n\t * Returns `null` if the triangle is degenerate.\n\t *\n\t * @param {Vector3} point - A point in 3D space.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {?Vector3} The barycentric coordinates for the given point\n\t */\n\tgetBarycoord( point, target ) {\n\n\t\treturn Triangle.getBarycoord( point, this.a, this.b, this.c, target );\n\n\t}\n\n\t/**\n\t * Computes the value barycentrically interpolated for the given point on the\n\t * triangle. Returns `null` if the triangle is degenerate.\n\t *\n\t * @param {Vector3} point - Position of interpolated point.\n\t * @param {Vector3} v1 - Value to interpolate of first vertex.\n\t * @param {Vector3} v2 - Value to interpolate of second vertex.\n\t * @param {Vector3} v3 - Value to interpolate of third vertex.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {?Vector3} The interpolated value.\n\t */\n\tgetInterpolation( point, v1, v2, v3, target ) {\n\n\t\treturn Triangle.getInterpolation( point, this.a, this.b, this.c, v1, v2, v3, target );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given point, when projected onto the plane of the\n\t * triangle, lies within the triangle.\n\t *\n\t * @param {Vector3} point - The point in 3D space to test.\n\t * @return {boolean} Whether the given point, when projected onto the plane of the\n\t * triangle, lies within the triangle or not.\n\t */\n\tcontainsPoint( point ) {\n\n\t\treturn Triangle.containsPoint( point, this.a, this.b, this.c );\n\n\t}\n\n\t/**\n\t * Returns `true` if the triangle is oriented towards the given direction.\n\t *\n\t * @param {Vector3} direction - The (normalized) direction vector.\n\t * @return {boolean} Whether the triangle is oriented towards the given direction or not.\n\t */\n\tisFrontFacing( direction ) {\n\n\t\treturn Triangle.isFrontFacing( this.a, this.b, this.c, direction );\n\n\t}\n\n\t/**\n\t * Returns `true` if this triangle intersects with the given box.\n\t *\n\t * @param {Box3} box - The box to intersect.\n\t * @return {boolean} Whether this triangle intersects with the given box or not.\n\t */\n\tintersectsBox( box ) {\n\n\t\treturn box.intersectsTriangle( this );\n\n\t}\n\n\t/**\n\t * Returns the closest point on the triangle to the given point.\n\t *\n\t * @param {Vector3} p - The point to compute the closest point for.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The closest point on the triangle.\n\t */\n\tclosestPointToPoint( p, target ) {\n\n\t\tconst a = this.a, b = this.b, c = this.c;\n\t\tlet v, w;\n\n\t\t// algorithm thanks to Real-Time Collision Detection by Christer Ericson,\n\t\t// published by Morgan Kaufmann Publishers, (c) 2005 Elsevier Inc.,\n\t\t// under the accompanying license; see chapter 5.1.5 for detailed explanation.\n\t\t// basically, we're distinguishing which of the voronoi regions of the triangle\n\t\t// the point lies in with the minimum amount of redundant computation.\n\n\t\t_vab.subVectors( b, a );\n\t\t_vac.subVectors( c, a );\n\t\t_vap.subVectors( p, a );\n\t\tconst d1 = _vab.dot( _vap );\n\t\tconst d2 = _vac.dot( _vap );\n\t\tif ( d1 <= 0 && d2 <= 0 ) {\n\n\t\t\t// vertex region of A; barycentric coords (1, 0, 0)\n\t\t\treturn target.copy( a );\n\n\t\t}\n\n\t\t_vbp.subVectors( p, b );\n\t\tconst d3 = _vab.dot( _vbp );\n\t\tconst d4 = _vac.dot( _vbp );\n\t\tif ( d3 >= 0 && d4 <= d3 ) {\n\n\t\t\t// vertex region of B; barycentric coords (0, 1, 0)\n\t\t\treturn target.copy( b );\n\n\t\t}\n\n\t\tconst vc = d1 * d4 - d3 * d2;\n\t\tif ( vc <= 0 && d1 >= 0 && d3 <= 0 ) {\n\n\t\t\tv = d1 / ( d1 - d3 );\n\t\t\t// edge region of AB; barycentric coords (1-v, v, 0)\n\t\t\treturn target.copy( a ).addScaledVector( _vab, v );\n\n\t\t}\n\n\t\t_vcp.subVectors( p, c );\n\t\tconst d5 = _vab.dot( _vcp );\n\t\tconst d6 = _vac.dot( _vcp );\n\t\tif ( d6 >= 0 && d5 <= d6 ) {\n\n\t\t\t// vertex region of C; barycentric coords (0, 0, 1)\n\t\t\treturn target.copy( c );\n\n\t\t}\n\n\t\tconst vb = d5 * d2 - d1 * d6;\n\t\tif ( vb <= 0 && d2 >= 0 && d6 <= 0 ) {\n\n\t\t\tw = d2 / ( d2 - d6 );\n\t\t\t// edge region of AC; barycentric coords (1-w, 0, w)\n\t\t\treturn target.copy( a ).addScaledVector( _vac, w );\n\n\t\t}\n\n\t\tconst va = d3 * d6 - d5 * d4;\n\t\tif ( va <= 0 && ( d4 - d3 ) >= 0 && ( d5 - d6 ) >= 0 ) {\n\n\t\t\t_vbc.subVectors( c, b );\n\t\t\tw = ( d4 - d3 ) / ( ( d4 - d3 ) + ( d5 - d6 ) );\n\t\t\t// edge region of BC; barycentric coords (0, 1-w, w)\n\t\t\treturn target.copy( b ).addScaledVector( _vbc, w ); // edge region of BC\n\n\t\t}\n\n\t\t// face region\n\t\tconst denom = 1 / ( va + vb + vc );\n\t\t// u = va * denom\n\t\tv = vb * denom;\n\t\tw = vc * denom;\n\n\t\treturn target.copy( a ).addScaledVector( _vab, v ).addScaledVector( _vac, w );\n\n\t}\n\n\t/**\n\t * Returns `true` if this triangle is equal with the given one.\n\t *\n\t * @param {Triangle} triangle - The triangle to test for equality.\n\t * @return {boolean} Whether this triangle is equal with the given one.\n\t */\n\tequals( triangle ) {\n\n\t\treturn triangle.a.equals( this.a ) && triangle.b.equals( this.b ) && triangle.c.equals( this.c );\n\n\t}\n\n}\n\nconst _colorKeywords = { 'aliceblue': 0xF0F8FF, 'antiquewhite': 0xFAEBD7, 'aqua': 0x00FFFF, 'aquamarine': 0x7FFFD4, 'azure': 0xF0FFFF,\n\t'beige': 0xF5F5DC, 'bisque': 0xFFE4C4, 'black': 0x000000, 'blanchedalmond': 0xFFEBCD, 'blue': 0x0000FF, 'blueviolet': 0x8A2BE2,\n\t'brown': 0xA52A2A, 'burlywood': 0xDEB887, 'cadetblue': 0x5F9EA0, 'chartreuse': 0x7FFF00, 'chocolate': 0xD2691E, 'coral': 0xFF7F50,\n\t'cornflowerblue': 0x6495ED, 'cornsilk': 0xFFF8DC, 'crimson': 0xDC143C, 'cyan': 0x00FFFF, 'darkblue': 0x00008B, 'darkcyan': 0x008B8B,\n\t'darkgoldenrod': 0xB8860B, 'darkgray': 0xA9A9A9, 'darkgreen': 0x006400, 'darkgrey': 0xA9A9A9, 'darkkhaki': 0xBDB76B, 'darkmagenta': 0x8B008B,\n\t'darkolivegreen': 0x556B2F, 'darkorange': 0xFF8C00, 'darkorchid': 0x9932CC, 'darkred': 0x8B0000, 'darksalmon': 0xE9967A, 'darkseagreen': 0x8FBC8F,\n\t'darkslateblue': 0x483D8B, 'darkslategray': 0x2F4F4F, 'darkslategrey': 0x2F4F4F, 'darkturquoise': 0x00CED1, 'darkviolet': 0x9400D3,\n\t'deeppink': 0xFF1493, 'deepskyblue': 0x00BFFF, 'dimgray': 0x696969, 'dimgrey': 0x696969, 'dodgerblue': 0x1E90FF, 'firebrick': 0xB22222,\n\t'floralwhite': 0xFFFAF0, 'forestgreen': 0x228B22, 'fuchsia': 0xFF00FF, 'gainsboro': 0xDCDCDC, 'ghostwhite': 0xF8F8FF, 'gold': 0xFFD700,\n\t'goldenrod': 0xDAA520, 'gray': 0x808080, 'green': 0x008000, 'greenyellow': 0xADFF2F, 'grey': 0x808080, 'honeydew': 0xF0FFF0, 'hotpink': 0xFF69B4,\n\t'indianred': 0xCD5C5C, 'indigo': 0x4B0082, 'ivory': 0xFFFFF0, 'khaki': 0xF0E68C, 'lavender': 0xE6E6FA, 'lavenderblush': 0xFFF0F5, 'lawngreen': 0x7CFC00,\n\t'lemonchiffon': 0xFFFACD, 'lightblue': 0xADD8E6, 'lightcoral': 0xF08080, 'lightcyan': 0xE0FFFF, 'lightgoldenrodyellow': 0xFAFAD2, 'lightgray': 0xD3D3D3,\n\t'lightgreen': 0x90EE90, 'lightgrey': 0xD3D3D3, 'lightpink': 0xFFB6C1, 'lightsalmon': 0xFFA07A, 'lightseagreen': 0x20B2AA, 'lightskyblue': 0x87CEFA,\n\t'lightslategray': 0x778899, 'lightslategrey': 0x778899, 'lightsteelblue': 0xB0C4DE, 'lightyellow': 0xFFFFE0, 'lime': 0x00FF00, 'limegreen': 0x32CD32,\n\t'linen': 0xFAF0E6, 'magenta': 0xFF00FF, 'maroon': 0x800000, 'mediumaquamarine': 0x66CDAA, 'mediumblue': 0x0000CD, 'mediumorchid': 0xBA55D3,\n\t'mediumpurple': 0x9370DB, 'mediumseagreen': 0x3CB371, 'mediumslateblue': 0x7B68EE, 'mediumspringgreen': 0x00FA9A, 'mediumturquoise': 0x48D1CC,\n\t'mediumvioletred': 0xC71585, 'midnightblue': 0x191970, 'mintcream': 0xF5FFFA, 'mistyrose': 0xFFE4E1, 'moccasin': 0xFFE4B5, 'navajowhite': 0xFFDEAD,\n\t'navy': 0x000080, 'oldlace': 0xFDF5E6, 'olive': 0x808000, 'olivedrab': 0x6B8E23, 'orange': 0xFFA500, 'orangered': 0xFF4500, 'orchid': 0xDA70D6,\n\t'palegoldenrod': 0xEEE8AA, 'palegreen': 0x98FB98, 'paleturquoise': 0xAFEEEE, 'palevioletred': 0xDB7093, 'papayawhip': 0xFFEFD5, 'peachpuff': 0xFFDAB9,\n\t'peru': 0xCD853F, 'pink': 0xFFC0CB, 'plum': 0xDDA0DD, 'powderblue': 0xB0E0E6, 'purple': 0x800080, 'rebeccapurple': 0x663399, 'red': 0xFF0000, 'rosybrown': 0xBC8F8F,\n\t'royalblue': 0x4169E1, 'saddlebrown': 0x8B4513, 'salmon': 0xFA8072, 'sandybrown': 0xF4A460, 'seagreen': 0x2E8B57, 'seashell': 0xFFF5EE,\n\t'sienna': 0xA0522D, 'silver': 0xC0C0C0, 'skyblue': 0x87CEEB, 'slateblue': 0x6A5ACD, 'slategray': 0x708090, 'slategrey': 0x708090, 'snow': 0xFFFAFA,\n\t'springgreen': 0x00FF7F, 'steelblue': 0x4682B4, 'tan': 0xD2B48C, 'teal': 0x008080, 'thistle': 0xD8BFD8, 'tomato': 0xFF6347, 'turquoise': 0x40E0D0,\n\t'violet': 0xEE82EE, 'wheat': 0xF5DEB3, 'white': 0xFFFFFF, 'whitesmoke': 0xF5F5F5, 'yellow': 0xFFFF00, 'yellowgreen': 0x9ACD32 };\n\nconst _hslA = { h: 0, s: 0, l: 0 };\nconst _hslB = { h: 0, s: 0, l: 0 };\n\nfunction hue2rgb( p, q, t ) {\n\n\tif ( t < 0 ) t += 1;\n\tif ( t > 1 ) t -= 1;\n\tif ( t < 1 / 6 ) return p + ( q - p ) * 6 * t;\n\tif ( t < 1 / 2 ) return q;\n\tif ( t < 2 / 3 ) return p + ( q - p ) * 6 * ( 2 / 3 - t );\n\treturn p;\n\n}\n\n/**\n * A Color instance is represented by RGB components in the linear <i>working\n * color space</i>, which defaults to `LinearSRGBColorSpace`. Inputs\n * conventionally using `SRGBColorSpace` (such as hexadecimals and CSS\n * strings) are converted to the working color space automatically.\n *\n * ```js\n * // converted automatically from SRGBColorSpace to LinearSRGBColorSpace\n * const color = new THREE.Color().setHex( 0x112233 );\n * ```\n * Source color spaces may be specified explicitly, to ensure correct conversions.\n * ```js\n * // assumed already LinearSRGBColorSpace; no conversion\n * const color = new THREE.Color().setRGB( 0.5, 0.5, 0.5 );\n *\n * // converted explicitly from SRGBColorSpace to LinearSRGBColorSpace\n * const color = new THREE.Color().setRGB( 0.5, 0.5, 0.5, SRGBColorSpace );\n * ```\n * If THREE.ColorManagement is disabled, no conversions occur. For details,\n * see <i>Color management</i>. Iterating through a Color instance will yield\n * its components (r, g, b) in the corresponding order. A Color can be initialised\n * in any of the following ways:\n * ```js\n * //empty constructor - will default white\n * const color1 = new THREE.Color();\n *\n * //Hexadecimal color (recommended)\n * const color2 = new THREE.Color( 0xff0000 );\n *\n * //RGB string\n * const color3 = new THREE.Color(\"rgb(255, 0, 0)\");\n * const color4 = new THREE.Color(\"rgb(100%, 0%, 0%)\");\n *\n * //X11 color name - all 140 color names are supported.\n * //Note the lack of CamelCase in the name\n * const color5 = new THREE.Color( 'skyblue' );\n * //HSL string\n * const color6 = new THREE.Color(\"hsl(0, 100%, 50%)\");\n *\n * //Separate RGB values between 0 and 1\n * const color7 = new THREE.Color( 1, 0, 0 );\n * ```\n */\nclass Color {\n\n\t/**\n\t * Constructs a new color.\n\t *\n\t * Note that standard method of specifying color in three.js is with a hexadecimal triplet,\n\t * and that method is used throughout the rest of the documentation.\n\t *\n\t * @param {(number|string|Color)} [r] - The red component of the color. If `g` and `b` are\n\t * not provided, it can be hexadecimal triplet, a CSS-style string or another `Color` instance.\n\t * @param {number} [g] - The green component.\n\t * @param {number} [b] - The blue component.\n\t */\n\tconstructor( r, g, b ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isColor = true;\n\n\t\t/**\n\t\t * The red component.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.r = 1;\n\n\t\t/**\n\t\t * The green component.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.g = 1;\n\n\t\t/**\n\t\t * The blue component.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.b = 1;\n\n\t\treturn this.set( r, g, b );\n\n\t}\n\n\t/**\n\t * Sets the colors's components from the given values.\n\t *\n\t * @param {(number|string|Color)} [r] - The red component of the color. If `g` and `b` are\n\t * not provided, it can be hexadecimal triplet, a CSS-style string or another `Color` instance.\n\t * @param {number} [g] - The green component.\n\t * @param {number} [b] - The blue component.\n\t * @return {Color} A reference to this color.\n\t */\n\tset( r, g, b ) {\n\n\t\tif ( g === undefined && b === undefined ) {\n\n\t\t\t// r is THREE.Color, hex or string\n\n\t\t\tconst value = r;\n\n\t\t\tif ( value && value.isColor ) {\n\n\t\t\t\tthis.copy( value );\n\n\t\t\t} else if ( typeof value === 'number' ) {\n\n\t\t\t\tthis.setHex( value );\n\n\t\t\t} else if ( typeof value === 'string' ) {\n\n\t\t\t\tthis.setStyle( value );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tthis.setRGB( r, g, b );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the colors's components to the given scalar value.\n\t *\n\t * @param {number} scalar - The scalar value.\n\t * @return {Color} A reference to this color.\n\t */\n\tsetScalar( scalar ) {\n\n\t\tthis.r = scalar;\n\t\tthis.g = scalar;\n\t\tthis.b = scalar;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this color from a hexadecimal value.\n\t *\n\t * @param {number} hex - The hexadecimal value.\n\t * @param {string} [colorSpace=SRGBColorSpace] - The color space.\n\t * @return {Color} A reference to this color.\n\t */\n\tsetHex( hex, colorSpace = SRGBColorSpace ) {\n\n\t\thex = Math.floor( hex );\n\n\t\tthis.r = ( hex >> 16 & 255 ) / 255;\n\t\tthis.g = ( hex >> 8 & 255 ) / 255;\n\t\tthis.b = ( hex & 255 ) / 255;\n\n\t\tColorManagement.colorSpaceToWorking( this, colorSpace );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this color from RGB values.\n\t *\n\t * @param {number} r - Red channel value between `0.0` and `1.0`.\n\t * @param {number} g - Green channel value between `0.0` and `1.0`.\n\t * @param {number} b - Blue channel value between `0.0` and `1.0`.\n\t * @param {string} [colorSpace=ColorManagement.workingColorSpace] - The color space.\n\t * @return {Color} A reference to this color.\n\t */\n\tsetRGB( r, g, b, colorSpace = ColorManagement.workingColorSpace ) {\n\n\t\tthis.r = r;\n\t\tthis.g = g;\n\t\tthis.b = b;\n\n\t\tColorManagement.colorSpaceToWorking( this, colorSpace );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this color from RGB values.\n\t *\n\t * @param {number} h - Hue value between `0.0` and `1.0`.\n\t * @param {number} s - Saturation value between `0.0` and `1.0`.\n\t * @param {number} l - Lightness value between `0.0` and `1.0`.\n\t * @param {string} [colorSpace=ColorManagement.workingColorSpace] - The color space.\n\t * @return {Color} A reference to this color.\n\t */\n\tsetHSL( h, s, l, colorSpace = ColorManagement.workingColorSpace ) {\n\n\t\t// h,s,l ranges are in 0.0 - 1.0\n\t\th = euclideanModulo( h, 1 );\n\t\ts = clamp( s, 0, 1 );\n\t\tl = clamp( l, 0, 1 );\n\n\t\tif ( s === 0 ) {\n\n\t\t\tthis.r = this.g = this.b = l;\n\n\t\t} else {\n\n\t\t\tconst p = l <= 0.5 ? l * ( 1 + s ) : l + s - ( l * s );\n\t\t\tconst q = ( 2 * l ) - p;\n\n\t\t\tthis.r = hue2rgb( q, p, h + 1 / 3 );\n\t\t\tthis.g = hue2rgb( q, p, h );\n\t\t\tthis.b = hue2rgb( q, p, h - 1 / 3 );\n\n\t\t}\n\n\t\tColorManagement.colorSpaceToWorking( this, colorSpace );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this color from a CSS-style string. For example, `rgb(250, 0,0)`,\n\t * `rgb(100%, 0%, 0%)`, `hsl(0, 100%, 50%)`, `#ff0000`, `#f00`, or `red` ( or\n\t * any [X11 color name](https://en.wikipedia.org/wiki/X11_color_names#Color_name_chart) -\n\t * all 140 color names are supported).\n\t *\n\t * @param {string} style - Color as a CSS-style string.\n\t * @param {string} [colorSpace=SRGBColorSpace] - The color space.\n\t * @return {Color} A reference to this color.\n\t */\n\tsetStyle( style, colorSpace = SRGBColorSpace ) {\n\n\t\tfunction handleAlpha( string ) {\n\n\t\t\tif ( string === undefined ) return;\n\n\t\t\tif ( parseFloat( string ) < 1 ) {\n\n\t\t\t\twarn( 'Color: Alpha component of ' + style + ' will be ignored.' );\n\n\t\t\t}\n\n\t\t}\n\n\n\t\tlet m;\n\n\t\tif ( m = /^(\\w+)\\(([^\\)]*)\\)/.exec( style ) ) {\n\n\t\t\t// rgb / hsl\n\n\t\t\tlet color;\n\t\t\tconst name = m[ 1 ];\n\t\t\tconst components = m[ 2 ];\n\n\t\t\tswitch ( name ) {\n\n\t\t\t\tcase 'rgb':\n\t\t\t\tcase 'rgba':\n\n\t\t\t\t\tif ( color = /^\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t// rgb(255,0,0) rgba(255,0,0,0.5)\n\n\t\t\t\t\t\thandleAlpha( color[ 4 ] );\n\n\t\t\t\t\t\treturn this.setRGB(\n\t\t\t\t\t\t\tMath.min( 255, parseInt( color[ 1 ], 10 ) ) / 255,\n\t\t\t\t\t\t\tMath.min( 255, parseInt( color[ 2 ], 10 ) ) / 255,\n\t\t\t\t\t\t\tMath.min( 255, parseInt( color[ 3 ], 10 ) ) / 255,\n\t\t\t\t\t\t\tcolorSpace\n\t\t\t\t\t\t);\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( color = /^\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t// rgb(100%,0%,0%) rgba(100%,0%,0%,0.5)\n\n\t\t\t\t\t\thandleAlpha( color[ 4 ] );\n\n\t\t\t\t\t\treturn this.setRGB(\n\t\t\t\t\t\t\tMath.min( 100, parseInt( color[ 1 ], 10 ) ) / 100,\n\t\t\t\t\t\t\tMath.min( 100, parseInt( color[ 2 ], 10 ) ) / 100,\n\t\t\t\t\t\t\tMath.min( 100, parseInt( color[ 3 ], 10 ) ) / 100,\n\t\t\t\t\t\t\tcolorSpace\n\t\t\t\t\t\t);\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'hsl':\n\t\t\t\tcase 'hsla':\n\n\t\t\t\t\tif ( color = /^\\s*(\\d*\\.?\\d+)\\s*,\\s*(\\d*\\.?\\d+)\\%\\s*,\\s*(\\d*\\.?\\d+)\\%\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t// hsl(120,50%,50%) hsla(120,50%,50%,0.5)\n\n\t\t\t\t\t\thandleAlpha( color[ 4 ] );\n\n\t\t\t\t\t\treturn this.setHSL(\n\t\t\t\t\t\t\tparseFloat( color[ 1 ] ) / 360,\n\t\t\t\t\t\t\tparseFloat( color[ 2 ] ) / 100,\n\t\t\t\t\t\t\tparseFloat( color[ 3 ] ) / 100,\n\t\t\t\t\t\t\tcolorSpace\n\t\t\t\t\t\t);\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\twarn( 'Color: Unknown color model ' + style );\n\n\t\t\t}\n\n\t\t} else if ( m = /^\\#([A-Fa-f\\d]+)$/.exec( style ) ) {\n\n\t\t\t// hex color\n\n\t\t\tconst hex = m[ 1 ];\n\t\t\tconst size = hex.length;\n\n\t\t\tif ( size === 3 ) {\n\n\t\t\t\t// #ff0\n\t\t\t\treturn this.setRGB(\n\t\t\t\t\tparseInt( hex.charAt( 0 ), 16 ) / 15,\n\t\t\t\t\tparseInt( hex.charAt( 1 ), 16 ) / 15,\n\t\t\t\t\tparseInt( hex.charAt( 2 ), 16 ) / 15,\n\t\t\t\t\tcolorSpace\n\t\t\t\t);\n\n\t\t\t} else if ( size === 6 ) {\n\n\t\t\t\t// #ff0000\n\t\t\t\treturn this.setHex( parseInt( hex, 16 ), colorSpace );\n\n\t\t\t} else {\n\n\t\t\t\twarn( 'Color: Invalid hex color ' + style );\n\n\t\t\t}\n\n\t\t} else if ( style && style.length > 0 ) {\n\n\t\t\treturn this.setColorName( style, colorSpace );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this color from a color name. Faster than {@link Color#setStyle} if\n\t * you don't need the other CSS-style formats.\n\t *\n\t * For convenience, the list of names is exposed in `Color.NAMES` as a hash.\n\t * ```js\n\t * Color.NAMES.aliceblue // returns 0xF0F8FF\n\t * ```\n\t *\n\t * @param {string} style - The color name.\n\t * @param {string} [colorSpace=SRGBColorSpace] - The color space.\n\t * @return {Color} A reference to this color.\n\t */\n\tsetColorName( style, colorSpace = SRGBColorSpace ) {\n\n\t\t// color keywords\n\t\tconst hex = _colorKeywords[ style.toLowerCase() ];\n\n\t\tif ( hex !== undefined ) {\n\n\t\t\t// red\n\t\t\tthis.setHex( hex, colorSpace );\n\n\t\t} else {\n\n\t\t\t// unknown color\n\t\t\twarn( 'Color: Unknown color ' + style );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new color with copied values from this instance.\n\t *\n\t * @return {Color} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor( this.r, this.g, this.b );\n\n\t}\n\n\t/**\n\t * Copies the values of the given color to this instance.\n\t *\n\t * @param {Color} color - The color to copy.\n\t * @return {Color} A reference to this color.\n\t */\n\tcopy( color ) {\n\n\t\tthis.r = color.r;\n\t\tthis.g = color.g;\n\t\tthis.b = color.b;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the given color into this color, and then converts this color from\n\t * `SRGBColorSpace` to `LinearSRGBColorSpace`.\n\t *\n\t * @param {Color} color - The color to copy/convert.\n\t * @return {Color} A reference to this color.\n\t */\n\tcopySRGBToLinear( color ) {\n\n\t\tthis.r = SRGBToLinear( color.r );\n\t\tthis.g = SRGBToLinear( color.g );\n\t\tthis.b = SRGBToLinear( color.b );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the given color into this color, and then converts this color from\n\t * `LinearSRGBColorSpace` to `SRGBColorSpace`.\n\t *\n\t * @param {Color} color - The color to copy/convert.\n\t * @return {Color} A reference to this color.\n\t */\n\tcopyLinearToSRGB( color ) {\n\n\t\tthis.r = LinearToSRGB( color.r );\n\t\tthis.g = LinearToSRGB( color.g );\n\t\tthis.b = LinearToSRGB( color.b );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Converts this color from `SRGBColorSpace` to `LinearSRGBColorSpace`.\n\t *\n\t * @return {Color} A reference to this color.\n\t */\n\tconvertSRGBToLinear() {\n\n\t\tthis.copySRGBToLinear( this );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Converts this color from `LinearSRGBColorSpace` to `SRGBColorSpace`.\n\t *\n\t * @return {Color} A reference to this color.\n\t */\n\tconvertLinearToSRGB() {\n\n\t\tthis.copyLinearToSRGB( this );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the hexadecimal value of this color.\n\t *\n\t * @param {string} [colorSpace=SRGBColorSpace] - The color space.\n\t * @return {number} The hexadecimal value.\n\t */\n\tgetHex( colorSpace = SRGBColorSpace ) {\n\n\t\tColorManagement.workingToColorSpace( _color.copy( this ), colorSpace );\n\n\t\treturn Math.round( clamp( _color.r * 255, 0, 255 ) ) * 65536 + Math.round( clamp( _color.g * 255, 0, 255 ) ) * 256 + Math.round( clamp( _color.b * 255, 0, 255 ) );\n\n\t}\n\n\t/**\n\t * Returns the hexadecimal value of this color as a string (for example, 'FFFFFF').\n\t *\n\t * @param {string} [colorSpace=SRGBColorSpace] - The color space.\n\t * @return {string} The hexadecimal value as a string.\n\t */\n\tgetHexString( colorSpace = SRGBColorSpace ) {\n\n\t\treturn ( '000000' + this.getHex( colorSpace ).toString( 16 ) ).slice( -6 );\n\n\t}\n\n\t/**\n\t * Converts the colors RGB values into the HSL format and stores them into the\n\t * given target object.\n\t *\n\t * @param {{h:number,s:number,l:number}} target - The target object that is used to store the method's result.\n\t * @param {string} [colorSpace=ColorManagement.workingColorSpace] - The color space.\n\t * @return {{h:number,s:number,l:number}} The HSL representation of this color.\n\t */\n\tgetHSL( target, colorSpace = ColorManagement.workingColorSpace ) {\n\n\t\t// h,s,l ranges are in 0.0 - 1.0\n\n\t\tColorManagement.workingToColorSpace( _color.copy( this ), colorSpace );\n\n\t\tconst r = _color.r, g = _color.g, b = _color.b;\n\n\t\tconst max = Math.max( r, g, b );\n\t\tconst min = Math.min( r, g, b );\n\n\t\tlet hue, saturation;\n\t\tconst lightness = ( min + max ) / 2.0;\n\n\t\tif ( min === max ) {\n\n\t\t\thue = 0;\n\t\t\tsaturation = 0;\n\n\t\t} else {\n\n\t\t\tconst delta = max - min;\n\n\t\t\tsaturation = lightness <= 0.5 ? delta / ( max + min ) : delta / ( 2 - max - min );\n\n\t\t\tswitch ( max ) {\n\n\t\t\t\tcase r: hue = ( g - b ) / delta + ( g < b ? 6 : 0 ); break;\n\t\t\t\tcase g: hue = ( b - r ) / delta + 2; break;\n\t\t\t\tcase b: hue = ( r - g ) / delta + 4; break;\n\n\t\t\t}\n\n\t\t\thue /= 6;\n\n\t\t}\n\n\t\ttarget.h = hue;\n\t\ttarget.s = saturation;\n\t\ttarget.l = lightness;\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Returns the RGB values of this color and stores them into the given target object.\n\t *\n\t * @param {Color} target - The target color that is used to store the method's result.\n\t * @param {string} [colorSpace=ColorManagement.workingColorSpace] - The color space.\n\t * @return {Color} The RGB representation of this color.\n\t */\n\tgetRGB( target, colorSpace = ColorManagement.workingColorSpace ) {\n\n\t\tColorManagement.workingToColorSpace( _color.copy( this ), colorSpace );\n\n\t\ttarget.r = _color.r;\n\t\ttarget.g = _color.g;\n\t\ttarget.b = _color.b;\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Returns the value of this color as a CSS style string. Example: `rgb(255,0,0)`.\n\t *\n\t * @param {string} [colorSpace=SRGBColorSpace] - The color space.\n\t * @return {string} The CSS representation of this color.\n\t */\n\tgetStyle( colorSpace = SRGBColorSpace ) {\n\n\t\tColorManagement.workingToColorSpace( _color.copy( this ), colorSpace );\n\n\t\tconst r = _color.r, g = _color.g, b = _color.b;\n\n\t\tif ( colorSpace !== SRGBColorSpace ) {\n\n\t\t\t// Requires CSS Color Module Level 4 (https://www.w3.org/TR/css-color-4/).\n\t\t\treturn `color(${ colorSpace } ${ r.toFixed( 3 ) } ${ g.toFixed( 3 ) } ${ b.toFixed( 3 ) })`;\n\n\t\t}\n\n\t\treturn `rgb(${ Math.round( r * 255 ) },${ Math.round( g * 255 ) },${ Math.round( b * 255 ) })`;\n\n\t}\n\n\t/**\n\t * Adds the given HSL values to this color's values.\n\t * Internally, this converts the color's RGB values to HSL, adds HSL\n\t * and then converts the color back to RGB.\n\t *\n\t * @param {number} h - Hue value between `0.0` and `1.0`.\n\t * @param {number} s - Saturation value between `0.0` and `1.0`.\n\t * @param {number} l - Lightness value between `0.0` and `1.0`.\n\t * @return {Color} A reference to this color.\n\t */\n\toffsetHSL( h, s, l ) {\n\n\t\tthis.getHSL( _hslA );\n\n\t\treturn this.setHSL( _hslA.h + h, _hslA.s + s, _hslA.l + l );\n\n\t}\n\n\t/**\n\t * Adds the RGB values of the given color to the RGB values of this color.\n\t *\n\t * @param {Color} color - The color to add.\n\t * @return {Color} A reference to this color.\n\t */\n\tadd( color ) {\n\n\t\tthis.r += color.r;\n\t\tthis.g += color.g;\n\t\tthis.b += color.b;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the RGB values of the given colors and stores the result in this instance.\n\t *\n\t * @param {Color} color1 - The first color.\n\t * @param {Color} color2 - The second color.\n\t * @return {Color} A reference to this color.\n\t */\n\taddColors( color1, color2 ) {\n\n\t\tthis.r = color1.r + color2.r;\n\t\tthis.g = color1.g + color2.g;\n\t\tthis.b = color1.b + color2.b;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given scalar value to the RGB values of this color.\n\t *\n\t * @param {number} s - The scalar to add.\n\t * @return {Color} A reference to this color.\n\t */\n\taddScalar( s ) {\n\n\t\tthis.r += s;\n\t\tthis.g += s;\n\t\tthis.b += s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the RGB values of the given color from the RGB values of this color.\n\t *\n\t * @param {Color} color - The color to subtract.\n\t * @return {Color} A reference to this color.\n\t */\n\tsub( color ) {\n\n\t\tthis.r = Math.max( 0, this.r - color.r );\n\t\tthis.g = Math.max( 0, this.g - color.g );\n\t\tthis.b = Math.max( 0, this.b - color.b );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the RGB values of the given color with the RGB values of this color.\n\t *\n\t * @param {Color} color - The color to multiply.\n\t * @return {Color} A reference to this color.\n\t */\n\tmultiply( color ) {\n\n\t\tthis.r *= color.r;\n\t\tthis.g *= color.g;\n\t\tthis.b *= color.b;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the given scalar value with the RGB values of this color.\n\t *\n\t * @param {number} s - The scalar to multiply.\n\t * @return {Color} A reference to this color.\n\t */\n\tmultiplyScalar( s ) {\n\n\t\tthis.r *= s;\n\t\tthis.g *= s;\n\t\tthis.b *= s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Linearly interpolates this color's RGB values toward the RGB values of the\n\t * given color. The alpha argument can be thought of as the ratio between\n\t * the two colors, where `0.0` is this color and `1.0` is the first argument.\n\t *\n\t * @param {Color} color - The color to converge on.\n\t * @param {number} alpha - The interpolation factor in the closed interval `[0,1]`.\n\t * @return {Color} A reference to this color.\n\t */\n\tlerp( color, alpha ) {\n\n\t\tthis.r += ( color.r - this.r ) * alpha;\n\t\tthis.g += ( color.g - this.g ) * alpha;\n\t\tthis.b += ( color.b - this.b ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Linearly interpolates between the given colors and stores the result in this instance.\n\t * The alpha argument can be thought of as the ratio between the two colors, where `0.0`\n\t * is the first and `1.0` is the second color.\n\t *\n\t * @param {Color} color1 - The first color.\n\t * @param {Color} color2 - The second color.\n\t * @param {number} alpha - The interpolation factor in the closed interval `[0,1]`.\n\t * @return {Color} A reference to this color.\n\t */\n\tlerpColors( color1, color2, alpha ) {\n\n\t\tthis.r = color1.r + ( color2.r - color1.r ) * alpha;\n\t\tthis.g = color1.g + ( color2.g - color1.g ) * alpha;\n\t\tthis.b = color1.b + ( color2.b - color1.b ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Linearly interpolates this color's HSL values toward the HSL values of the\n\t * given color. It differs from {@link Color#lerp} by not interpolating straight\n\t * from one color to the other, but instead going through all the hues in between\n\t * those two colors. The alpha argument can be thought of as the ratio between\n\t * the two colors, where 0.0 is this color and 1.0 is the first argument.\n\t *\n\t * @param {Color} color - The color to converge on.\n\t * @param {number} alpha - The interpolation factor in the closed interval `[0,1]`.\n\t * @return {Color} A reference to this color.\n\t */\n\tlerpHSL( color, alpha ) {\n\n\t\tthis.getHSL( _hslA );\n\t\tcolor.getHSL( _hslB );\n\n\t\tconst h = lerp( _hslA.h, _hslB.h, alpha );\n\t\tconst s = lerp( _hslA.s, _hslB.s, alpha );\n\t\tconst l = lerp( _hslA.l, _hslB.l, alpha );\n\n\t\tthis.setHSL( h, s, l );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the color's RGB components from the given 3D vector.\n\t *\n\t * @param {Vector3} v - The vector to set.\n\t * @return {Color} A reference to this color.\n\t */\n\tsetFromVector3( v ) {\n\n\t\tthis.r = v.x;\n\t\tthis.g = v.y;\n\t\tthis.b = v.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Transforms this color with the given 3x3 matrix.\n\t *\n\t * @param {Matrix3} m - The matrix.\n\t * @return {Color} A reference to this color.\n\t */\n\tapplyMatrix3( m ) {\n\n\t\tconst r = this.r, g = this.g, b = this.b;\n\t\tconst e = m.elements;\n\n\t\tthis.r = e[ 0 ] * r + e[ 3 ] * g + e[ 6 ] * b;\n\t\tthis.g = e[ 1 ] * r + e[ 4 ] * g + e[ 7 ] * b;\n\t\tthis.b = e[ 2 ] * r + e[ 5 ] * g + e[ 8 ] * b;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this color is equal with the given one.\n\t *\n\t * @param {Color} c - The color to test for equality.\n\t * @return {boolean} Whether this bounding color is equal with the given one.\n\t */\n\tequals( c ) {\n\n\t\treturn ( c.r === this.r ) && ( c.g === this.g ) && ( c.b === this.b );\n\n\t}\n\n\t/**\n\t * Sets this color's RGB components from the given array.\n\t *\n\t * @param {Array<number>} array - An array holding the RGB values.\n\t * @param {number} [offset=0] - The offset into the array.\n\t * @return {Color} A reference to this color.\n\t */\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis.r = array[ offset ];\n\t\tthis.g = array[ offset + 1 ];\n\t\tthis.b = array[ offset + 2 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Writes the RGB components of this color to the given array. If no array is provided,\n\t * the method returns a new instance.\n\t *\n\t * @param {Array<number>} [array=[]] - The target array holding the color components.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Array<number>} The color components.\n\t */\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this.r;\n\t\tarray[ offset + 1 ] = this.g;\n\t\tarray[ offset + 2 ] = this.b;\n\n\t\treturn array;\n\n\t}\n\n\t/**\n\t * Sets the components of this color from the given buffer attribute.\n\t *\n\t * @param {BufferAttribute} attribute - The buffer attribute holding color data.\n\t * @param {number} index - The index into the attribute.\n\t * @return {Color} A reference to this color.\n\t */\n\tfromBufferAttribute( attribute, index ) {\n\n\t\tthis.r = attribute.getX( index );\n\t\tthis.g = attribute.getY( index );\n\t\tthis.b = attribute.getZ( index );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * This methods defines the serialization result of this class. Returns the color\n\t * as a hexadecimal value.\n\t *\n\t * @return {number} The hexadecimal value.\n\t */\n\ttoJSON() {\n\n\t\treturn this.getHex();\n\n\t}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this.r;\n\t\tyield this.g;\n\t\tyield this.b;\n\n\t}\n\n}\n\nconst _color = /*@__PURE__*/ new Color();\n\n/**\n * A dictionary with X11 color names.\n *\n * Note that multiple words such as Dark Orange become the string 'darkorange'.\n *\n * @static\n * @type {Object}\n */\nColor.NAMES = _colorKeywords;\n\nlet _materialId = 0;\n\n/**\n * Abstract base class for materials.\n *\n * Materials define the appearance of renderable 3D objects.\n *\n * @abstract\n * @augments EventDispatcher\n */\nclass Material extends EventDispatcher {\n\n\t/**\n\t * Constructs a new material.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMaterial = true;\n\n\t\t/**\n\t\t * The ID of the material.\n\t\t *\n\t\t * @name Material#id\n\t\t * @type {number}\n\t\t * @readonly\n\t\t */\n\t\tObject.defineProperty( this, 'id', { value: _materialId ++ } );\n\n\t\t/**\n\t\t * The UUID of the material.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.uuid = generateUUID();\n\n\t\t/**\n\t\t * The name of the material.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\n\t\t/**\n\t\t * The type property is used for detecting the object type\n\t\t * in context of serialization/deserialization.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.type = 'Material';\n\n\t\t/**\n\t\t * Defines the blending type of the material.\n\t\t *\n\t\t * It must be set to `CustomBlending` if custom blending properties like\n\t\t * {@link Material#blendSrc}, {@link Material#blendDst} or {@link Material#blendEquation}\n\t\t * should have any effect.\n\t\t *\n\t\t * @type {(NoBlending|NormalBlending|AdditiveBlending|SubtractiveBlending|MultiplyBlending|CustomBlending)}\n\t\t * @default NormalBlending\n\t\t */\n\t\tthis.blending = NormalBlending;\n\n\t\t/**\n\t\t * Defines which side of faces will be rendered - front, back or both.\n\t\t *\n\t\t * @type {(FrontSide|BackSide|DoubleSide)}\n\t\t * @default FrontSide\n\t\t */\n\t\tthis.side = FrontSide;\n\n\t\t/**\n\t\t * If set to `true`, vertex colors should be used.\n\t\t *\n\t\t * The engine supports RGB and RGBA vertex colors depending on whether a three (RGB) or\n\t\t * four (RGBA) component color buffer attribute is used.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.vertexColors = false;\n\n\t\t/**\n\t\t * Defines how transparent the material is.\n\t\t * A value of `0.0` indicates fully transparent, `1.0` is fully opaque.\n\t\t *\n\t\t * If the {@link Material#transparent} is not set to `true`,\n\t\t * the material will remain fully opaque and this value will only affect its color.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.opacity = 1;\n\n\t\t/**\n\t\t * Defines whether this material is transparent. This has an effect on\n\t\t * rendering as transparent objects need special treatment and are rendered\n\t\t * after non-transparent objects.\n\t\t *\n\t\t * When set to true, the extent to which the material is transparent is\n\t\t * controlled by {@link Material#opacity}.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.transparent = false;\n\n\t\t/**\n\t\t * Enables alpha hashed transparency, an alternative to {@link Material#transparent} or\n\t\t * {@link Material#alphaTest}. The material will not be rendered if opacity is lower than\n\t\t * a random threshold. Randomization introduces some grain or noise, but approximates alpha\n\t\t * blending without the associated problems of sorting. Using TAA can reduce the resulting noise.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.alphaHash = false;\n\n\t\t/**\n\t\t * Defines the blending source factor.\n\t\t *\n\t\t * @type {(ZeroFactor|OneFactor|SrcColorFactor|OneMinusSrcColorFactor|SrcAlphaFactor|OneMinusSrcAlphaFactor|DstAlphaFactor|OneMinusDstAlphaFactor|DstColorFactor|OneMinusDstColorFactor|SrcAlphaSaturateFactor|ConstantColorFactor|OneMinusConstantColorFactor|ConstantAlphaFactor|OneMinusConstantAlphaFactor)}\n\t\t * @default SrcAlphaFactor\n\t\t */\n\t\tthis.blendSrc = SrcAlphaFactor;\n\n\t\t/**\n\t\t * Defines the blending destination factor.\n\t\t *\n\t\t * @type {(ZeroFactor|OneFactor|SrcColorFactor|OneMinusSrcColorFactor|SrcAlphaFactor|OneMinusSrcAlphaFactor|DstAlphaFactor|OneMinusDstAlphaFactor|DstColorFactor|OneMinusDstColorFactor|SrcAlphaSaturateFactor|ConstantColorFactor|OneMinusConstantColorFactor|ConstantAlphaFactor|OneMinusConstantAlphaFactor)}\n\t\t * @default OneMinusSrcAlphaFactor\n\t\t */\n\t\tthis.blendDst = OneMinusSrcAlphaFactor;\n\n\t\t/**\n\t\t * Defines the blending equation.\n\t\t *\n\t\t * @type {(AddEquation|SubtractEquation|ReverseSubtractEquation|MinEquation|MaxEquation)}\n\t\t * @default AddEquation\n\t\t */\n\t\tthis.blendEquation = AddEquation;\n\n\t\t/**\n\t\t * Defines the blending source alpha factor.\n\t\t *\n\t\t * @type {?(ZeroFactor|OneFactor|SrcColorFactor|OneMinusSrcColorFactor|SrcAlphaFactor|OneMinusSrcAlphaFactor|DstAlphaFactor|OneMinusDstAlphaFactor|DstColorFactor|OneMinusDstColorFactor|SrcAlphaSaturateFactor|ConstantColorFactor|OneMinusConstantColorFactor|ConstantAlphaFactor|OneMinusConstantAlphaFactor)}\n\t\t * @default null\n\t\t */\n\t\tthis.blendSrcAlpha = null;\n\n\t\t/**\n\t\t * Defines the blending destination alpha factor.\n\t\t *\n\t\t * @type {?(ZeroFactor|OneFactor|SrcColorFactor|OneMinusSrcColorFactor|SrcAlphaFactor|OneMinusSrcAlphaFactor|DstAlphaFactor|OneMinusDstAlphaFactor|DstColorFactor|OneMinusDstColorFactor|SrcAlphaSaturateFactor|ConstantColorFactor|OneMinusConstantColorFactor|ConstantAlphaFactor|OneMinusConstantAlphaFactor)}\n\t\t * @default null\n\t\t */\n\t\tthis.blendDstAlpha = null;\n\n\t\t/**\n\t\t * Defines the blending equation of the alpha channel.\n\t\t *\n\t\t * @type {?(AddEquation|SubtractEquation|ReverseSubtractEquation|MinEquation|MaxEquation)}\n\t\t * @default null\n\t\t */\n\t\tthis.blendEquationAlpha = null;\n\n\t\t/**\n\t\t * Represents the RGB values of the constant blend color.\n\t\t *\n\t\t * This property has only an effect when using custom blending with `ConstantColor` or `OneMinusConstantColor`.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.blendColor = new Color( 0, 0, 0 );\n\n\t\t/**\n\t\t * Represents the alpha value of the constant blend color.\n\t\t *\n\t\t * This property has only an effect when using custom blending with `ConstantAlpha` or `OneMinusConstantAlpha`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.blendAlpha = 0;\n\n\t\t/**\n\t\t * Defines the depth function.\n\t\t *\n\t\t * @type {(NeverDepth|AlwaysDepth|LessDepth|LessEqualDepth|EqualDepth|GreaterEqualDepth|GreaterDepth|NotEqualDepth)}\n\t\t * @default LessEqualDepth\n\t\t */\n\t\tthis.depthFunc = LessEqualDepth;\n\n\t\t/**\n\t\t * Whether to have depth test enabled when rendering this material.\n\t\t * When the depth test is disabled, the depth write will also be implicitly disabled.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.depthTest = true;\n\n\t\t/**\n\t\t * Whether rendering this material has any effect on the depth buffer.\n\t\t *\n\t\t * When drawing 2D overlays it can be useful to disable the depth writing in\n\t\t * order to layer several things together without creating z-index artifacts.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.depthWrite = true;\n\n\t\t/**\n\t\t * The bit mask to use when writing to the stencil buffer.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0xff\n\t\t */\n\t\tthis.stencilWriteMask = 0xff;\n\n\t\t/**\n\t\t * The stencil comparison function to use.\n\t\t *\n\t\t * @type {NeverStencilFunc|LessStencilFunc|EqualStencilFunc|LessEqualStencilFunc|GreaterStencilFunc|NotEqualStencilFunc|GreaterEqualStencilFunc|AlwaysStencilFunc}\n\t\t * @default AlwaysStencilFunc\n\t\t */\n\t\tthis.stencilFunc = AlwaysStencilFunc;\n\n\t\t/**\n\t\t * The value to use when performing stencil comparisons or stencil operations.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.stencilRef = 0;\n\n\t\t/**\n\t\t * The bit mask to use when comparing against the stencil buffer.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0xff\n\t\t */\n\t\tthis.stencilFuncMask = 0xff;\n\n\t\t/**\n\t\t * Which stencil operation to perform when the comparison function returns `false`.\n\t\t *\n\t\t * @type {ZeroStencilOp|KeepStencilOp|ReplaceStencilOp|IncrementStencilOp|DecrementStencilOp|IncrementWrapStencilOp|DecrementWrapStencilOp|InvertStencilOp}\n\t\t * @default KeepStencilOp\n\t\t */\n\t\tthis.stencilFail = KeepStencilOp;\n\n\t\t/**\n\t\t * Which stencil operation to perform when the comparison function returns\n\t\t * `true` but the depth test fails.\n\t\t *\n\t\t * @type {ZeroStencilOp|KeepStencilOp|ReplaceStencilOp|IncrementStencilOp|DecrementStencilOp|IncrementWrapStencilOp|DecrementWrapStencilOp|InvertStencilOp}\n\t\t * @default KeepStencilOp\n\t\t */\n\t\tthis.stencilZFail = KeepStencilOp;\n\n\t\t/**\n\t\t * Which stencil operation to perform when the comparison function returns\n\t\t * `true` and the depth test passes.\n\t\t *\n\t\t * @type {ZeroStencilOp|KeepStencilOp|ReplaceStencilOp|IncrementStencilOp|DecrementStencilOp|IncrementWrapStencilOp|DecrementWrapStencilOp|InvertStencilOp}\n\t\t * @default KeepStencilOp\n\t\t */\n\t\tthis.stencilZPass = KeepStencilOp;\n\n\t\t/**\n\t\t * Whether stencil operations are performed against the stencil buffer. In\n\t\t * order to perform writes or comparisons against the stencil buffer this\n\t\t * value must be `true`.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.stencilWrite = false;\n\n\t\t/**\n\t\t * User-defined clipping planes specified as THREE.Plane objects in world\n\t\t * space. These planes apply to the objects this material is attached to.\n\t\t * Points in space whose signed distance to the plane is negative are clipped\n\t\t * (not rendered). This requires {@link WebGLRenderer#localClippingEnabled} to\n\t\t * be `true`.\n\t\t *\n\t\t * @type {?Array<Plane>}\n\t\t * @default null\n\t\t */\n\t\tthis.clippingPlanes = null;\n\n\t\t/**\n\t\t * Changes the behavior of clipping planes so that only their intersection is\n\t\t * clipped, rather than their union.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.clipIntersection = false;\n\n\t\t/**\n\t\t * Defines whether to clip shadows according to the clipping planes specified\n\t\t * on this material.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.clipShadows = false;\n\n\t\t/**\n\t\t * Defines which side of faces cast shadows. If `null`, the side casting shadows\n\t\t * is determined as follows:\n\t\t *\n\t\t * - When {@link Material#side} is set to `FrontSide`, the back side cast shadows.\n\t\t * - When {@link Material#side} is set to `BackSide`, the front side cast shadows.\n\t\t * - When {@link Material#side} is set to `DoubleSide`, both sides cast shadows.\n\t\t *\n\t\t * @type {?(FrontSide|BackSide|DoubleSide)}\n\t\t * @default null\n\t\t */\n\t\tthis.shadowSide = null;\n\n\t\t/**\n\t\t * Whether to render the material's color.\n\t\t *\n\t\t * This can be used in conjunction with {@link Object3D#renderOder} to create invisible\n\t\t * objects that occlude other objects.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.colorWrite = true;\n\n\t\t/**\n\t\t * Override the renderer's default precision for this material.\n\t\t *\n\t\t * @type {?('highp'|'mediump'|'lowp')}\n\t\t * @default null\n\t\t */\n\t\tthis.precision = null;\n\n\t\t/**\n\t\t * Whether to use polygon offset or not. When enabled, each fragment's depth value will\n\t\t * be offset after it is interpolated from the depth values of the appropriate vertices.\n\t\t * The offset is added before the depth test is performed and before the value is written\n\t\t * into the depth buffer.\n\t\t *\n\t\t * Can be useful for rendering hidden-line images, for applying decals to surfaces, and for\n\t\t * rendering solids with highlighted edges.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.polygonOffset = false;\n\n\t\t/**\n\t\t * Specifies a scale factor that is used to create a variable depth offset for each polygon.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.polygonOffsetFactor = 0;\n\n\t\t/**\n\t\t * Is multiplied by an implementation-specific value to create a constant depth offset.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.polygonOffsetUnits = 0;\n\n\t\t/**\n\t\t * Whether to apply dithering to the color to remove the appearance of banding.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.dithering = false;\n\n\t\t/**\n\t\t * Whether alpha to coverage should be enabled or not. Can only be used with MSAA-enabled contexts\n\t\t * (meaning when the renderer was created with *antialias* parameter set to `true`). Enabling this\n\t\t * will smooth aliasing on clip plane edges and alphaTest-clipped edges.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.alphaToCoverage = false;\n\n\t\t/**\n\t\t * Whether to premultiply the alpha (transparency) value.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.premultipliedAlpha = false;\n\n\t\t/**\n\t\t * Whether double-sided, transparent objects should be rendered with a single pass or not.\n\t\t *\n\t\t * The engine renders double-sided, transparent objects with two draw calls (back faces first,\n\t\t * then front faces) to mitigate transparency artifacts. There are scenarios however where this\n\t\t * approach produces no quality gains but still doubles draw calls e.g. when rendering flat\n\t\t * vegetation like grass sprites. In these cases, set the `forceSinglePass` flag to `true` to\n\t\t * disable the two pass rendering to avoid performance issues.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.forceSinglePass = false;\n\n\t\t/**\n\t\t * Whether it's possible to override the material with {@link Scene#overrideMaterial} or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.allowOverride = true;\n\n\t\t/**\n\t\t * Defines whether 3D objects using this material are visible.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.visible = true;\n\n\t\t/**\n\t\t * Defines whether this material is tone mapped according to the renderer's tone mapping setting.\n\t\t *\n\t\t * It is ignored when rendering to a render target or using post processing or when using\n\t\t * `WebGPURenderer`. In all these cases, all materials are honored by tone mapping.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.toneMapped = true;\n\n\t\t/**\n\t\t * An object that can be used to store custom data about the Material. It\n\t\t * should not hold references to functions as these will not be cloned.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.userData = {};\n\n\t\t/**\n\t\t * This starts at `0` and counts how many times {@link Material#needsUpdate} is set to `true`.\n\t\t *\n\t\t * @type {number}\n\t\t * @readonly\n\t\t * @default 0\n\t\t */\n\t\tthis.version = 0;\n\n\t\tthis._alphaTest = 0;\n\n\t}\n\n\t/**\n\t * Sets the alpha value to be used when running an alpha test. The material\n\t * will not be rendered if the opacity is lower than this value.\n\t *\n\t * @type {number}\n\t * @readonly\n\t * @default 0\n\t */\n\tget alphaTest() {\n\n\t\treturn this._alphaTest;\n\n\t}\n\n\tset alphaTest( value ) {\n\n\t\tif ( this._alphaTest > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._alphaTest = value;\n\n\t}\n\n\t/**\n\t * An optional callback that is executed immediately before the material is used to render a 3D object.\n\t *\n\t * This method can only be used when rendering with {@link WebGLRenderer}.\n\t *\n\t * @param {WebGLRenderer} renderer - The renderer.\n\t * @param {Scene} scene - The scene.\n\t * @param {Camera} camera - The camera that is used to render the scene.\n\t * @param {BufferGeometry} geometry - The 3D object's geometry.\n\t * @param {Object3D} object - The 3D object.\n\t * @param {Object} group - The geometry group data.\n\t */\n\tonBeforeRender( /* renderer, scene, camera, geometry, object, group */ ) {}\n\n\t/**\n\t * An optional callback that is executed immediately before the shader\n\t * program is compiled. This function is called with the shader source code\n\t * as a parameter. Useful for the modification of built-in materials.\n\t *\n\t * This method can only be used when rendering with {@link WebGLRenderer}. The\n\t * recommended approach when customizing materials is to use `WebGPURenderer` with the new\n\t * Node Material system and [TSL](https://github.com/mrdoob/three.js/wiki/Three.js-Shading-Language).\n\t *\n\t * @param {{vertexShader:string,fragmentShader:string,uniforms:Object}} shaderobject - The object holds the uniforms and the vertex and fragment shader source.\n\t * @param {WebGLRenderer} renderer - A reference to the renderer.\n\t */\n\tonBeforeCompile( /* shaderobject, renderer */ ) {}\n\n\t/**\n\t * In case {@link Material#onBeforeCompile} is used, this callback can be used to identify\n\t * values of settings used in `onBeforeCompile()`, so three.js can reuse a cached\n\t * shader or recompile the shader for this material as needed.\n\t *\n\t * This method can only be used when rendering with {@link WebGLRenderer}.\n\t *\n\t * @return {string} The custom program cache key.\n\t */\n\tcustomProgramCacheKey() {\n\n\t\treturn this.onBeforeCompile.toString();\n\n\t}\n\n\t/**\n\t * This method can be used to set default values from parameter objects.\n\t * It is a generic implementation so it can be used with different types\n\t * of materials.\n\t *\n\t * @param {Object} [values] - The material values to set.\n\t */\n\tsetValues( values ) {\n\n\t\tif ( values === undefined ) return;\n\n\t\tfor ( const key in values ) {\n\n\t\t\tconst newValue = values[ key ];\n\n\t\t\tif ( newValue === undefined ) {\n\n\t\t\t\twarn( `Material: parameter '${ key }' has value of undefined.` );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tconst currentValue = this[ key ];\n\n\t\t\tif ( currentValue === undefined ) {\n\n\t\t\t\twarn( `Material: '${ key }' is not a property of THREE.${ this.type }.` );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tif ( currentValue && currentValue.isColor ) {\n\n\t\t\t\tcurrentValue.set( newValue );\n\n\t\t\t} else if ( ( currentValue && currentValue.isVector3 ) && ( newValue && newValue.isVector3 ) ) {\n\n\t\t\t\tcurrentValue.copy( newValue );\n\n\t\t\t} else {\n\n\t\t\t\tthis[ key ] = newValue;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Serializes the material into JSON.\n\t *\n\t * @param {?(Object|string)} meta - An optional value holding meta information about the serialization.\n\t * @return {Object} A JSON object representing the serialized material.\n\t * @see {@link ObjectLoader#parse}\n\t */\n\ttoJSON( meta ) {\n\n\t\tconst isRootObject = ( meta === undefined || typeof meta === 'string' );\n\n\t\tif ( isRootObject ) {\n\n\t\t\tmeta = {\n\t\t\t\ttextures: {},\n\t\t\t\timages: {}\n\t\t\t};\n\n\t\t}\n\n\t\tconst data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.7,\n\t\t\t\ttype: 'Material',\n\t\t\t\tgenerator: 'Material.toJSON'\n\t\t\t}\n\t\t};\n\n\t\t// standard Material serialization\n\t\tdata.uuid = this.uuid;\n\t\tdata.type = this.type;\n\n\t\tif ( this.name !== '' ) data.name = this.name;\n\n\t\tif ( this.color && this.color.isColor ) data.color = this.color.getHex();\n\n\t\tif ( this.roughness !== undefined ) data.roughness = this.roughness;\n\t\tif ( this.metalness !== undefined ) data.metalness = this.metalness;\n\n\t\tif ( this.sheen !== undefined ) data.sheen = this.sheen;\n\t\tif ( this.sheenColor && this.sheenColor.isColor ) data.sheenColor = this.sheenColor.getHex();\n\t\tif ( this.sheenRoughness !== undefined ) data.sheenRoughness = this.sheenRoughness;\n\t\tif ( this.emissive && this.emissive.isColor ) data.emissive = this.emissive.getHex();\n\t\tif ( this.emissiveIntensity !== undefined && this.emissiveIntensity !== 1 ) data.emissiveIntensity = this.emissiveIntensity;\n\n\t\tif ( this.specular && this.specular.isColor ) data.specular = this.specular.getHex();\n\t\tif ( this.specularIntensity !== undefined ) data.specularIntensity = this.specularIntensity;\n\t\tif ( this.specularColor && this.specularColor.isColor ) data.specularColor = this.specularColor.getHex();\n\t\tif ( this.shininess !== undefined ) data.shininess = this.shininess;\n\t\tif ( this.clearcoat !== undefined ) data.clearcoat = this.clearcoat;\n\t\tif ( this.clearcoatRoughness !== undefined ) data.clearcoatRoughness = this.clearcoatRoughness;\n\n\t\tif ( this.clearcoatMap && this.clearcoatMap.isTexture ) {\n\n\t\t\tdata.clearcoatMap = this.clearcoatMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.clearcoatRoughnessMap && this.clearcoatRoughnessMap.isTexture ) {\n\n\t\t\tdata.clearcoatRoughnessMap = this.clearcoatRoughnessMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.clearcoatNormalMap && this.clearcoatNormalMap.isTexture ) {\n\n\t\t\tdata.clearcoatNormalMap = this.clearcoatNormalMap.toJSON( meta ).uuid;\n\t\t\tdata.clearcoatNormalScale = this.clearcoatNormalScale.toArray();\n\n\t\t}\n\n\t\tif ( this.sheenColorMap && this.sheenColorMap.isTexture ) {\n\n\t\t\tdata.sheenColorMap = this.sheenColorMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.sheenRoughnessMap && this.sheenRoughnessMap.isTexture ) {\n\n\t\t\tdata.sheenRoughnessMap = this.sheenRoughnessMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.dispersion !== undefined ) data.dispersion = this.dispersion;\n\n\t\tif ( this.iridescence !== undefined ) data.iridescence = this.iridescence;\n\t\tif ( this.iridescenceIOR !== undefined ) data.iridescenceIOR = this.iridescenceIOR;\n\t\tif ( this.iridescenceThicknessRange !== undefined ) data.iridescenceThicknessRange = this.iridescenceThicknessRange;\n\n\t\tif ( this.iridescenceMap && this.iridescenceMap.isTexture ) {\n\n\t\t\tdata.iridescenceMap = this.iridescenceMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.iridescenceThicknessMap && this.iridescenceThicknessMap.isTexture ) {\n\n\t\t\tdata.iridescenceThicknessMap = this.iridescenceThicknessMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.anisotropy !== undefined ) data.anisotropy = this.anisotropy;\n\t\tif ( this.anisotropyRotation !== undefined ) data.anisotropyRotation = this.anisotropyRotation;\n\n\t\tif ( this.anisotropyMap && this.anisotropyMap.isTexture ) {\n\n\t\t\tdata.anisotropyMap = this.anisotropyMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.map && this.map.isTexture ) data.map = this.map.toJSON( meta ).uuid;\n\t\tif ( this.matcap && this.matcap.isTexture ) data.matcap = this.matcap.toJSON( meta ).uuid;\n\t\tif ( this.alphaMap && this.alphaMap.isTexture ) data.alphaMap = this.alphaMap.toJSON( meta ).uuid;\n\n\t\tif ( this.lightMap && this.lightMap.isTexture ) {\n\n\t\t\tdata.lightMap = this.lightMap.toJSON( meta ).uuid;\n\t\t\tdata.lightMapIntensity = this.lightMapIntensity;\n\n\t\t}\n\n\t\tif ( this.aoMap && this.aoMap.isTexture ) {\n\n\t\t\tdata.aoMap = this.aoMap.toJSON( meta ).uuid;\n\t\t\tdata.aoMapIntensity = this.aoMapIntensity;\n\n\t\t}\n\n\t\tif ( this.bumpMap && this.bumpMap.isTexture ) {\n\n\t\t\tdata.bumpMap = this.bumpMap.toJSON( meta ).uuid;\n\t\t\tdata.bumpScale = this.bumpScale;\n\n\t\t}\n\n\t\tif ( this.normalMap && this.normalMap.isTexture ) {\n\n\t\t\tdata.normalMap = this.normalMap.toJSON( meta ).uuid;\n\t\t\tdata.normalMapType = this.normalMapType;\n\t\t\tdata.normalScale = this.normalScale.toArray();\n\n\t\t}\n\n\t\tif ( this.displacementMap && this.displacementMap.isTexture ) {\n\n\t\t\tdata.displacementMap = this.displacementMap.toJSON( meta ).uuid;\n\t\t\tdata.displacementScale = this.displacementScale;\n\t\t\tdata.displacementBias = this.displacementBias;\n\n\t\t}\n\n\t\tif ( this.roughnessMap && this.roughnessMap.isTexture ) data.roughnessMap = this.roughnessMap.toJSON( meta ).uuid;\n\t\tif ( this.metalnessMap && this.metalnessMap.isTexture ) data.metalnessMap = this.metalnessMap.toJSON( meta ).uuid;\n\n\t\tif ( this.emissiveMap && this.emissiveMap.isTexture ) data.emissiveMap = this.emissiveMap.toJSON( meta ).uuid;\n\t\tif ( this.specularMap && this.specularMap.isTexture ) data.specularMap = this.specularMap.toJSON( meta ).uuid;\n\t\tif ( this.specularIntensityMap && this.specularIntensityMap.isTexture ) data.specularIntensityMap = this.specularIntensityMap.toJSON( meta ).uuid;\n\t\tif ( this.specularColorMap && this.specularColorMap.isTexture ) data.specularColorMap = this.specularColorMap.toJSON( meta ).uuid;\n\n\t\tif ( this.envMap && this.envMap.isTexture ) {\n\n\t\t\tdata.envMap = this.envMap.toJSON( meta ).uuid;\n\n\t\t\tif ( this.combine !== undefined ) data.combine = this.combine;\n\n\t\t}\n\n\t\tif ( this.envMapRotation !== undefined ) data.envMapRotation = this.envMapRotation.toArray();\n\t\tif ( this.envMapIntensity !== undefined ) data.envMapIntensity = this.envMapIntensity;\n\t\tif ( this.reflectivity !== undefined ) data.reflectivity = this.reflectivity;\n\t\tif ( this.refractionRatio !== undefined ) data.refractionRatio = this.refractionRatio;\n\n\t\tif ( this.gradientMap && this.gradientMap.isTexture ) {\n\n\t\t\tdata.gradientMap = this.gradientMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.transmission !== undefined ) data.transmission = this.transmission;\n\t\tif ( this.transmissionMap && this.transmissionMap.isTexture ) data.transmissionMap = this.transmissionMap.toJSON( meta ).uuid;\n\t\tif ( this.thickness !== undefined ) data.thickness = this.thickness;\n\t\tif ( this.thicknessMap && this.thicknessMap.isTexture ) data.thicknessMap = this.thicknessMap.toJSON( meta ).uuid;\n\t\tif ( this.attenuationDistance !== undefined && this.attenuationDistance !== Infinity ) data.attenuationDistance = this.attenuationDistance;\n\t\tif ( this.attenuationColor !== undefined ) data.attenuationColor = this.attenuationColor.getHex();\n\n\t\tif ( this.size !== undefined ) data.size = this.size;\n\t\tif ( this.shadowSide !== null ) data.shadowSide = this.shadowSide;\n\t\tif ( this.sizeAttenuation !== undefined ) data.sizeAttenuation = this.sizeAttenuation;\n\n\t\tif ( this.blending !== NormalBlending ) data.blending = this.blending;\n\t\tif ( this.side !== FrontSide ) data.side = this.side;\n\t\tif ( this.vertexColors === true ) data.vertexColors = true;\n\n\t\tif ( this.opacity < 1 ) data.opacity = this.opacity;\n\t\tif ( this.transparent === true ) data.transparent = true;\n\n\t\tif ( this.blendSrc !== SrcAlphaFactor ) data.blendSrc = this.blendSrc;\n\t\tif ( this.blendDst !== OneMinusSrcAlphaFactor ) data.blendDst = this.blendDst;\n\t\tif ( this.blendEquation !== AddEquation ) data.blendEquation = this.blendEquation;\n\t\tif ( this.blendSrcAlpha !== null ) data.blendSrcAlpha = this.blendSrcAlpha;\n\t\tif ( this.blendDstAlpha !== null ) data.blendDstAlpha = this.blendDstAlpha;\n\t\tif ( this.blendEquationAlpha !== null ) data.blendEquationAlpha = this.blendEquationAlpha;\n\t\tif ( this.blendColor && this.blendColor.isColor ) data.blendColor = this.blendColor.getHex();\n\t\tif ( this.blendAlpha !== 0 ) data.blendAlpha = this.blendAlpha;\n\n\t\tif ( this.depthFunc !== LessEqualDepth ) data.depthFunc = this.depthFunc;\n\t\tif ( this.depthTest === false ) data.depthTest = this.depthTest;\n\t\tif ( this.depthWrite === false ) data.depthWrite = this.depthWrite;\n\t\tif ( this.colorWrite === false ) data.colorWrite = this.colorWrite;\n\n\t\tif ( this.stencilWriteMask !== 0xff ) data.stencilWriteMask = this.stencilWriteMask;\n\t\tif ( this.stencilFunc !== AlwaysStencilFunc ) data.stencilFunc = this.stencilFunc;\n\t\tif ( this.stencilRef !== 0 ) data.stencilRef = this.stencilRef;\n\t\tif ( this.stencilFuncMask !== 0xff ) data.stencilFuncMask = this.stencilFuncMask;\n\t\tif ( this.stencilFail !== KeepStencilOp ) data.stencilFail = this.stencilFail;\n\t\tif ( this.stencilZFail !== KeepStencilOp ) data.stencilZFail = this.stencilZFail;\n\t\tif ( this.stencilZPass !== KeepStencilOp ) data.stencilZPass = this.stencilZPass;\n\t\tif ( this.stencilWrite === true ) data.stencilWrite = this.stencilWrite;\n\n\t\t// rotation (SpriteMaterial)\n\t\tif ( this.rotation !== undefined && this.rotation !== 0 ) data.rotation = this.rotation;\n\n\t\tif ( this.polygonOffset === true ) data.polygonOffset = true;\n\t\tif ( this.polygonOffsetFactor !== 0 ) data.polygonOffsetFactor = this.polygonOffsetFactor;\n\t\tif ( this.polygonOffsetUnits !== 0 ) data.polygonOffsetUnits = this.polygonOffsetUnits;\n\n\t\tif ( this.linewidth !== undefined && this.linewidth !== 1 ) data.linewidth = this.linewidth;\n\t\tif ( this.dashSize !== undefined ) data.dashSize = this.dashSize;\n\t\tif ( this.gapSize !== undefined ) data.gapSize = this.gapSize;\n\t\tif ( this.scale !== undefined ) data.scale = this.scale;\n\n\t\tif ( this.dithering === true ) data.dithering = true;\n\n\t\tif ( this.alphaTest > 0 ) data.alphaTest = this.alphaTest;\n\t\tif ( this.alphaHash === true ) data.alphaHash = true;\n\t\tif ( this.alphaToCoverage === true ) data.alphaToCoverage = true;\n\t\tif ( this.premultipliedAlpha === true ) data.premultipliedAlpha = true;\n\t\tif ( this.forceSinglePass === true ) data.forceSinglePass = true;\n\n\t\tif ( this.wireframe === true ) data.wireframe = true;\n\t\tif ( this.wireframeLinewidth > 1 ) data.wireframeLinewidth = this.wireframeLinewidth;\n\t\tif ( this.wireframeLinecap !== 'round' ) data.wireframeLinecap = this.wireframeLinecap;\n\t\tif ( this.wireframeLinejoin !== 'round' ) data.wireframeLinejoin = this.wireframeLinejoin;\n\n\t\tif ( this.flatShading === true ) data.flatShading = true;\n\n\t\tif ( this.visible === false ) data.visible = false;\n\n\t\tif ( this.toneMapped === false ) data.toneMapped = false;\n\n\t\tif ( this.fog === false ) data.fog = false;\n\n\t\tif ( Object.keys( this.userData ).length > 0 ) data.userData = this.userData;\n\n\t\t// TODO: Copied from Object3D.toJSON\n\n\t\tfunction extractFromCache( cache ) {\n\n\t\t\tconst values = [];\n\n\t\t\tfor ( const key in cache ) {\n\n\t\t\t\tconst data = cache[ key ];\n\t\t\t\tdelete data.metadata;\n\t\t\t\tvalues.push( data );\n\n\t\t\t}\n\n\t\t\treturn values;\n\n\t\t}\n\n\t\tif ( isRootObject ) {\n\n\t\t\tconst textures = extractFromCache( meta.textures );\n\t\t\tconst images = extractFromCache( meta.images );\n\n\t\t\tif ( textures.length > 0 ) data.textures = textures;\n\t\t\tif ( images.length > 0 ) data.images = images;\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\t/**\n\t * Returns a new material with copied values from this instance.\n\t *\n\t * @return {Material} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Copies the values of the given material to this instance.\n\t *\n\t * @param {Material} source - The material to copy.\n\t * @return {Material} A reference to this instance.\n\t */\n\tcopy( source ) {\n\n\t\tthis.name = source.name;\n\n\t\tthis.blending = source.blending;\n\t\tthis.side = source.side;\n\t\tthis.vertexColors = source.vertexColors;\n\n\t\tthis.opacity = source.opacity;\n\t\tthis.transparent = source.transparent;\n\n\t\tthis.blendSrc = source.blendSrc;\n\t\tthis.blendDst = source.blendDst;\n\t\tthis.blendEquation = source.blendEquation;\n\t\tthis.blendSrcAlpha = source.blendSrcAlpha;\n\t\tthis.blendDstAlpha = source.blendDstAlpha;\n\t\tthis.blendEquationAlpha = source.blendEquationAlpha;\n\t\tthis.blendColor.copy( source.blendColor );\n\t\tthis.blendAlpha = source.blendAlpha;\n\n\t\tthis.depthFunc = source.depthFunc;\n\t\tthis.depthTest = source.depthTest;\n\t\tthis.depthWrite = source.depthWrite;\n\n\t\tthis.stencilWriteMask = source.stencilWriteMask;\n\t\tthis.stencilFunc = source.stencilFunc;\n\t\tthis.stencilRef = source.stencilRef;\n\t\tthis.stencilFuncMask = source.stencilFuncMask;\n\t\tthis.stencilFail = source.stencilFail;\n\t\tthis.stencilZFail = source.stencilZFail;\n\t\tthis.stencilZPass = source.stencilZPass;\n\t\tthis.stencilWrite = source.stencilWrite;\n\n\t\tconst srcPlanes = source.clippingPlanes;\n\t\tlet dstPlanes = null;\n\n\t\tif ( srcPlanes !== null ) {\n\n\t\t\tconst n = srcPlanes.length;\n\t\t\tdstPlanes = new Array( n );\n\n\t\t\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\t\t\tdstPlanes[ i ] = srcPlanes[ i ].clone();\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.clippingPlanes = dstPlanes;\n\t\tthis.clipIntersection = source.clipIntersection;\n\t\tthis.clipShadows = source.clipShadows;\n\n\t\tthis.shadowSide = source.shadowSide;\n\n\t\tthis.colorWrite = source.colorWrite;\n\n\t\tthis.precision = source.precision;\n\n\t\tthis.polygonOffset = source.polygonOffset;\n\t\tthis.polygonOffsetFactor = source.polygonOffsetFactor;\n\t\tthis.polygonOffsetUnits = source.polygonOffsetUnits;\n\n\t\tthis.dithering = source.dithering;\n\n\t\tthis.alphaTest = source.alphaTest;\n\t\tthis.alphaHash = source.alphaHash;\n\t\tthis.alphaToCoverage = source.alphaToCoverage;\n\t\tthis.premultipliedAlpha = source.premultipliedAlpha;\n\t\tthis.forceSinglePass = source.forceSinglePass;\n\n\t\tthis.visible = source.visible;\n\n\t\tthis.toneMapped = source.toneMapped;\n\n\t\tthis.userData = JSON.parse( JSON.stringify( source.userData ) );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t *\n\t * @fires Material#dispose\n\t */\n\tdispose() {\n\n\t\t/**\n\t\t * Fires when the material has been disposed of.\n\t\t *\n\t\t * @event Material#dispose\n\t\t * @type {Object}\n\t\t */\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n\t/**\n\t * Setting this property to `true` indicates the engine the material\n\t * needs to be recompiled.\n\t *\n\t * @type {boolean}\n\t * @default false\n\t * @param {boolean} value\n\t */\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n}\n\n/**\n * A material for drawing geometries in a simple shaded (flat or wireframe) way.\n *\n * This material is not affected by lights.\n *\n * @augments Material\n * @demo scenes/material-browser.html#MeshBasicMaterial\n */\nclass MeshBasicMaterial extends Material {\n\n\t/**\n\t * Constructs a new mesh basic material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshBasicMaterial = true;\n\n\t\tthis.type = 'MeshBasicMaterial';\n\n\t\t/**\n\t\t * Color of the material.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\n\t\t/**\n\t\t * The color map. May optionally include an alpha channel, typically combined\n\t\t * with {@link Material#transparent} or {@link Material#alphaTest}. The texture map\n\t\t * color is modulated by the diffuse `color`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * The light map. Requires a second set of UVs.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.lightMap = null;\n\n\t\t/**\n\t\t * Intensity of the baked light.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\t/**\n\t\t * The red channel of this texture is used as the ambient occlusion map.\n\t\t * Requires a second set of UVs.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.aoMap = null;\n\n\t\t/**\n\t\t * Intensity of the ambient occlusion effect. Range is `[0,1]`, where `0`\n\t\t * disables ambient occlusion. Where intensity is `1` and the AO map's\n\t\t * red channel is also `1`, ambient light is fully occluded on a surface.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\t/**\n\t\t * Specular map used by the material.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.specularMap = null;\n\n\t\t/**\n\t\t * The alpha map is a grayscale texture that controls the opacity across the\n\t\t * surface (black: fully transparent; white: fully opaque).\n\t\t *\n\t\t * Only the color of the texture is used, ignoring the alpha channel if one\n\t\t * exists. For RGB and RGBA textures, the renderer will use the green channel\n\t\t * when sampling this texture due to the extra bit of precision provided for\n\t\t * green in DXT-compressed and uncompressed RGB 565 formats. Luminance-only and\n\t\t * luminance/alpha textures will also still work as expected.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.alphaMap = null;\n\n\t\t/**\n\t\t * The environment map.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.envMap = null;\n\n\t\t/**\n\t\t * The rotation of the environment map in radians.\n\t\t *\n\t\t * @type {Euler}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.envMapRotation = new Euler();\n\n\t\t/**\n\t\t * How to combine the result of the surface's color with the environment map, if any.\n\t\t *\n\t\t * When set to `MixOperation`, the {@link MeshBasicMaterial#reflectivity} is used to\n\t\t * blend between the two colors.\n\t\t *\n\t\t * @type {(MultiplyOperation|MixOperation|AddOperation)}\n\t\t * @default MultiplyOperation\n\t\t */\n\t\tthis.combine = MultiplyOperation;\n\n\t\t/**\n\t\t * How much the environment map affects the surface.\n\t\t * The valid range is between `0` (no reflections) and `1` (full reflections).\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.reflectivity = 1;\n\n\t\t/**\n\t\t * The index of refraction (IOR) of air (approximately 1) divided by the\n\t\t * index of refraction of the material. It is used with environment mapping\n\t\t * modes {@link CubeRefractionMapping} and {@link EquirectangularRefractionMapping}.\n\t\t * The refraction ratio should not exceed `1`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.98\n\t\t */\n\t\tthis.refractionRatio = 0.98;\n\n\t\t/**\n\t\t * Renders the geometry as a wireframe.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.wireframe = false;\n\n\t\t/**\n\t\t * Controls the thickness of the wireframe.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.wireframeLinewidth = 1;\n\n\t\t/**\n\t\t * Defines appearance of wireframe ends.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.wireframeLinecap = 'round';\n\n\t\t/**\n\t\t * Defines appearance of wireframe joints.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\t/**\n\t\t * Whether the material is affected by fog or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.specularMap = source.specularMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.envMapRotation.copy( source.envMapRotation );\n\t\tthis.combine = source.combine;\n\t\tthis.reflectivity = source.reflectivity;\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\n// Fast Half Float Conversions, http://www.fox-toolkit.org/ftp/fasthalffloatconversion.pdf\n\nconst _tables = /*@__PURE__*/ _generateTables();\n\nfunction _generateTables() {\n\n\t// float32 to float16 helpers\n\n\tconst buffer = new ArrayBuffer( 4 );\n\tconst floatView = new Float32Array( buffer );\n\tconst uint32View = new Uint32Array( buffer );\n\n\tconst baseTable = new Uint32Array( 512 );\n\tconst shiftTable = new Uint32Array( 512 );\n\n\tfor ( let i = 0; i < 256; ++ i ) {\n\n\t\tconst e = i - 127;\n\n\t\t// very small number (0, -0)\n\n\t\tif ( e < -27 ) {\n\n\t\t\tbaseTable[ i ] = 0x0000;\n\t\t\tbaseTable[ i | 0x100 ] = 0x8000;\n\t\t\tshiftTable[ i ] = 24;\n\t\t\tshiftTable[ i | 0x100 ] = 24;\n\n\t\t\t// small number (denorm)\n\n\t\t} else if ( e < -14 ) {\n\n\t\t\tbaseTable[ i ] = 0x0400 >> ( - e - 14 );\n\t\t\tbaseTable[ i | 0x100 ] = ( 0x0400 >> ( - e - 14 ) ) | 0x8000;\n\t\t\tshiftTable[ i ] = - e - 1;\n\t\t\tshiftTable[ i | 0x100 ] = - e - 1;\n\n\t\t\t// normal number\n\n\t\t} else if ( e <= 15 ) {\n\n\t\t\tbaseTable[ i ] = ( e + 15 ) << 10;\n\t\t\tbaseTable[ i | 0x100 ] = ( ( e + 15 ) << 10 ) | 0x8000;\n\t\t\tshiftTable[ i ] = 13;\n\t\t\tshiftTable[ i | 0x100 ] = 13;\n\n\t\t\t// large number (Infinity, -Infinity)\n\n\t\t} else if ( e < 128 ) {\n\n\t\t\tbaseTable[ i ] = 0x7c00;\n\t\t\tbaseTable[ i | 0x100 ] = 0xfc00;\n\t\t\tshiftTable[ i ] = 24;\n\t\t\tshiftTable[ i | 0x100 ] = 24;\n\n\t\t\t// stay (NaN, Infinity, -Infinity)\n\n\t\t} else {\n\n\t\t\tbaseTable[ i ] = 0x7c00;\n\t\t\tbaseTable[ i | 0x100 ] = 0xfc00;\n\t\t\tshiftTable[ i ] = 13;\n\t\t\tshiftTable[ i | 0x100 ] = 13;\n\n\t\t}\n\n\t}\n\n\t// float16 to float32 helpers\n\n\tconst mantissaTable = new Uint32Array( 2048 );\n\tconst exponentTable = new Uint32Array( 64 );\n\tconst offsetTable = new Uint32Array( 64 );\n\n\tfor ( let i = 1; i < 1024; ++ i ) {\n\n\t\tlet m = i << 13; // zero pad mantissa bits\n\t\tlet e = 0; // zero exponent\n\n\t\t// normalized\n\t\twhile ( ( m & 0x00800000 ) === 0 ) {\n\n\t\t\tm <<= 1;\n\t\t\te -= 0x00800000; // decrement exponent\n\n\t\t}\n\n\t\tm &= -8388609; // clear leading 1 bit\n\t\te += 0x38800000; // adjust bias\n\n\t\tmantissaTable[ i ] = m | e;\n\n\t}\n\n\tfor ( let i = 1024; i < 2048; ++ i ) {\n\n\t\tmantissaTable[ i ] = 0x38000000 + ( ( i - 1024 ) << 13 );\n\n\t}\n\n\tfor ( let i = 1; i < 31; ++ i ) {\n\n\t\texponentTable[ i ] = i << 23;\n\n\t}\n\n\texponentTable[ 31 ] = 0x47800000;\n\texponentTable[ 32 ] = 0x80000000;\n\n\tfor ( let i = 33; i < 63; ++ i ) {\n\n\t\texponentTable[ i ] = 0x80000000 + ( ( i - 32 ) << 23 );\n\n\t}\n\n\texponentTable[ 63 ] = 0xc7800000;\n\n\tfor ( let i = 1; i < 64; ++ i ) {\n\n\t\tif ( i !== 32 ) {\n\n\t\t\toffsetTable[ i ] = 1024;\n\n\t\t}\n\n\t}\n\n\treturn {\n\t\tfloatView: floatView,\n\t\tuint32View: uint32View,\n\t\tbaseTable: baseTable,\n\t\tshiftTable: shiftTable,\n\t\tmantissaTable: mantissaTable,\n\t\texponentTable: exponentTable,\n\t\toffsetTable: offsetTable\n\t};\n\n}\n\n/**\n * Returns a half precision floating point value (FP16) from the given single\n * precision floating point value (FP32).\n *\n * @param {number} val - A single precision floating point value.\n * @return {number} The FP16 value.\n */\nfunction toHalfFloat( val ) {\n\n\tif ( Math.abs( val ) > 65504 ) warn( 'DataUtils.toHalfFloat(): Value out of range.' );\n\n\tval = clamp( val, -65504, 65504 );\n\n\t_tables.floatView[ 0 ] = val;\n\tconst f = _tables.uint32View[ 0 ];\n\tconst e = ( f >> 23 ) & 0x1ff;\n\treturn _tables.baseTable[ e ] + ( ( f & 0x007fffff ) >> _tables.shiftTable[ e ] );\n\n}\n\n/**\n * Returns a single precision floating point value (FP32) from the given half\n * precision floating point value (FP16).\n *\n * @param {number} val - A half precision floating point value.\n * @return {number} The FP32 value.\n */\nfunction fromHalfFloat( val ) {\n\n\tconst m = val >> 10;\n\t_tables.uint32View[ 0 ] = _tables.mantissaTable[ _tables.offsetTable[ m ] + ( val & 0x3ff ) ] + _tables.exponentTable[ m ];\n\treturn _tables.floatView[ 0 ];\n\n}\n\n/**\n * A class containing utility functions for data.\n *\n * @hideconstructor\n */\nclass DataUtils {\n\n\t/**\n\t * Returns a half precision floating point value (FP16) from the given single\n\t * precision floating point value (FP32).\n\t *\n\t * @param {number} val - A single precision floating point value.\n\t * @return {number} The FP16 value.\n\t */\n\tstatic toHalfFloat( val ) {\n\n\t\treturn toHalfFloat( val );\n\n\t}\n\n\t/**\n\t * Returns a single precision floating point value (FP32) from the given half\n\t * precision floating point value (FP16).\n\t *\n\t * @param {number} val - A half precision floating point value.\n\t * @return {number} The FP32 value.\n\t */\n\tstatic fromHalfFloat( val ) {\n\n\t\treturn fromHalfFloat( val );\n\n\t}\n\n}\n\nconst _vector$9 = /*@__PURE__*/ new Vector3();\nconst _vector2$1 = /*@__PURE__*/ new Vector2();\n\nlet _id$2 = 0;\n\n/**\n * This class stores data for an attribute (such as vertex positions, face\n * indices, normals, colors, UVs, and any custom attributes ) associated with\n * a geometry, which allows for more efficient passing of data to the GPU.\n *\n * When working with vector-like data, the `fromBufferAttribute( attribute, index )`\n * helper methods on vector and color class might be helpful. E.g. {@link Vector3#fromBufferAttribute}.\n */\nclass BufferAttribute {\n\n\t/**\n\t * Constructs a new buffer attribute.\n\t *\n\t * @param {TypedArray} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( array, itemSize, normalized = false ) {\n\n\t\tif ( Array.isArray( array ) ) {\n\n\t\t\tthrow new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' );\n\n\t\t}\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isBufferAttribute = true;\n\n\t\t/**\n\t\t * The ID of the buffer attribute.\n\t\t *\n\t\t * @name BufferAttribute#id\n\t\t * @type {number}\n\t\t * @readonly\n\t\t */\n\t\tObject.defineProperty( this, 'id', { value: _id$2 ++ } );\n\n\t\t/**\n\t\t * The name of the buffer attribute.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\n\t\t/**\n\t\t * The array holding the attribute data. It should have `itemSize * numVertices`\n\t\t * elements, where `numVertices` is the number of vertices in the associated geometry.\n\t\t *\n\t\t * @type {TypedArray}\n\t\t */\n\t\tthis.array = array;\n\n\t\t/**\n\t\t * The number of values of the array that should be associated with a particular vertex.\n\t\t * For instance, if this attribute is storing a 3-component vector (such as a position,\n\t\t * normal, or color), then the value should be `3`.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.itemSize = itemSize;\n\n\t\t/**\n\t\t * Represents the number of items this buffer attribute stores. It is internally computed\n\t\t * by dividing the `array` length by the `itemSize`.\n\t\t *\n\t\t * @type {number}\n\t\t * @readonly\n\t\t */\n\t\tthis.count = array !== undefined ? array.length / itemSize : 0;\n\n\t\t/**\n\t\t * Applies to integer data only. Indicates how the underlying data in the buffer maps to\n\t\t * the values in the GLSL code. For instance, if `array` is an instance of `UInt16Array`,\n\t\t * and `normalized` is `true`, the values `0 - +65535` in the array data will be mapped to\n\t\t * `0.0f - +1.0f` in the GLSL attribute. If `normalized` is `false`, the values will be converted\n\t\t * to floats unmodified, i.e. `65535` becomes `65535.0f`.\n\t\t *\n\t\t * @type {boolean}\n\t\t */\n\t\tthis.normalized = normalized;\n\n\t\t/**\n\t\t * Defines the intended usage pattern of the data store for optimization purposes.\n\t\t *\n\t\t * Note: After the initial use of a buffer, its usage cannot be changed. Instead,\n\t\t * instantiate a new one and set the desired usage before the next render.\n\t\t *\n\t\t * @type {(StaticDrawUsage|DynamicDrawUsage|StreamDrawUsage|StaticReadUsage|DynamicReadUsage|StreamReadUsage|StaticCopyUsage|DynamicCopyUsage|StreamCopyUsage)}\n\t\t * @default StaticDrawUsage\n\t\t */\n\t\tthis.usage = StaticDrawUsage;\n\n\t\t/**\n\t\t * This can be used to only update some components of stored vectors (for example, just the\n\t\t * component related to color). Use the `addUpdateRange()` function to add ranges to this array.\n\t\t *\n\t\t * @type {Array<Object>}\n\t\t */\n\t\tthis.updateRanges = [];\n\n\t\t/**\n\t\t * Configures the bound GPU type for use in shaders.\n\t\t *\n\t\t * Note: this only has an effect for integer arrays and is not configurable for float arrays.\n\t\t * For lower precision float types, use `Float16BufferAttribute`.\n\t\t *\n\t\t * @type {(FloatType|IntType)}\n\t\t * @default FloatType\n\t\t */\n\t\tthis.gpuType = FloatType;\n\n\t\t/**\n\t\t * A version number, incremented every time the `needsUpdate` is set to `true`.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.version = 0;\n\n\t}\n\n\t/**\n\t * A callback function that is executed after the renderer has transferred the attribute\n\t * array data to the GPU.\n\t */\n\tonUploadCallback() {}\n\n\t/**\n\t * Flag to indicate that this attribute has changed and should be re-sent to\n\t * the GPU. Set this to `true` when you modify the value of the array.\n\t *\n\t * @type {number}\n\t * @default false\n\t * @param {boolean} value\n\t */\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n\t/**\n\t * Sets the usage of this buffer attribute.\n\t *\n\t * @param {(StaticDrawUsage|DynamicDrawUsage|StreamDrawUsage|StaticReadUsage|DynamicReadUsage|StreamReadUsage|StaticCopyUsage|DynamicCopyUsage|StreamCopyUsage)} value - The usage to set.\n\t * @return {BufferAttribute} A reference to this buffer attribute.\n\t */\n\tsetUsage( value ) {\n\n\t\tthis.usage = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds a range of data in the data array to be updated on the GPU.\n\t *\n\t * @param {number} start - Position at which to start update.\n\t * @param {number} count - The number of components to update.\n\t */\n\taddUpdateRange( start, count ) {\n\n\t\tthis.updateRanges.push( { start, count } );\n\n\t}\n\n\t/**\n\t * Clears the update ranges.\n\t */\n\tclearUpdateRanges() {\n\n\t\tthis.updateRanges.length = 0;\n\n\t}\n\n\t/**\n\t * Copies the values of the given buffer attribute to this instance.\n\t *\n\t * @param {BufferAttribute} source - The buffer attribute to copy.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tcopy( source ) {\n\n\t\tthis.name = source.name;\n\t\tthis.array = new source.array.constructor( source.array );\n\t\tthis.itemSize = source.itemSize;\n\t\tthis.count = source.count;\n\t\tthis.normalized = source.normalized;\n\n\t\tthis.usage = source.usage;\n\t\tthis.gpuType = source.gpuType;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies a vector from the given buffer attribute to this one. The start\n\t * and destination position in the attribute buffers are represented by the\n\t * given indices.\n\t *\n\t * @param {number} index1 - The destination index into this buffer attribute.\n\t * @param {BufferAttribute} attribute - The buffer attribute to copy from.\n\t * @param {number} index2 - The source index into the given buffer attribute.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tcopyAt( index1, attribute, index2 ) {\n\n\t\tindex1 *= this.itemSize;\n\t\tindex2 *= attribute.itemSize;\n\n\t\tfor ( let i = 0, l = this.itemSize; i < l; i ++ ) {\n\n\t\t\tthis.array[ index1 + i ] = attribute.array[ index2 + i ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the given array data into this buffer attribute.\n\t *\n\t * @param {(TypedArray|Array)} array - The array to copy.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tcopyArray( array ) {\n\n\t\tthis.array.set( array );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Applies the given 3x3 matrix to the given attribute. Works with\n\t * item size `2` and `3`.\n\t *\n\t * @param {Matrix3} m - The matrix to apply.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tapplyMatrix3( m ) {\n\n\t\tif ( this.itemSize === 2 ) {\n\n\t\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t\t_vector2$1.fromBufferAttribute( this, i );\n\t\t\t\t_vector2$1.applyMatrix3( m );\n\n\t\t\t\tthis.setXY( i, _vector2$1.x, _vector2$1.y );\n\n\t\t\t}\n\n\t\t} else if ( this.itemSize === 3 ) {\n\n\t\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t\t_vector$9.fromBufferAttribute( this, i );\n\t\t\t\t_vector$9.applyMatrix3( m );\n\n\t\t\t\tthis.setXYZ( i, _vector$9.x, _vector$9.y, _vector$9.z );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Applies the given 4x4 matrix to the given attribute. Only works with\n\t * item size `3`.\n\t *\n\t * @param {Matrix4} m - The matrix to apply.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tapplyMatrix4( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$9.fromBufferAttribute( this, i );\n\n\t\t\t_vector$9.applyMatrix4( m );\n\n\t\t\tthis.setXYZ( i, _vector$9.x, _vector$9.y, _vector$9.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Applies the given 3x3 normal matrix to the given attribute. Only works with\n\t * item size `3`.\n\t *\n\t * @param {Matrix3} m - The normal matrix to apply.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tapplyNormalMatrix( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$9.fromBufferAttribute( this, i );\n\n\t\t\t_vector$9.applyNormalMatrix( m );\n\n\t\t\tthis.setXYZ( i, _vector$9.x, _vector$9.y, _vector$9.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Applies the given 4x4 matrix to the given attribute. Only works with\n\t * item size `3` and with direction vectors.\n\t *\n\t * @param {Matrix4} m - The matrix to apply.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\ttransformDirection( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$9.fromBufferAttribute( this, i );\n\n\t\t\t_vector$9.transformDirection( m );\n\n\t\t\tthis.setXYZ( i, _vector$9.x, _vector$9.y, _vector$9.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given array data in the buffer attribute.\n\t *\n\t * @param {(TypedArray|Array)} value - The array data to set.\n\t * @param {number} [offset=0] - The offset in this buffer attribute's array.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tset( value, offset = 0 ) {\n\n\t\t// Matching BufferAttribute constructor, do not normalize the array.\n\t\tthis.array.set( value, offset );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the given component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} component - The component index.\n\t * @return {number} The returned value.\n\t */\n\tgetComponent( index, component ) {\n\n\t\tlet value = this.array[ index * this.itemSize + component ];\n\n\t\tif ( this.normalized ) value = denormalize( value, this.array );\n\n\t\treturn value;\n\n\t}\n\n\t/**\n\t * Sets the given value to the given component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} component - The component index.\n\t * @param {number} value - The value to set.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetComponent( index, component, value ) {\n\n\t\tif ( this.normalized ) value = normalize( value, this.array );\n\n\t\tthis.array[ index * this.itemSize + component ] = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the x component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @return {number} The x component.\n\t */\n\tgetX( index ) {\n\n\t\tlet x = this.array[ index * this.itemSize ];\n\n\t\tif ( this.normalized ) x = denormalize( x, this.array );\n\n\t\treturn x;\n\n\t}\n\n\t/**\n\t * Sets the x component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} x - The value to set.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetX( index, x ) {\n\n\t\tif ( this.normalized ) x = normalize( x, this.array );\n\n\t\tthis.array[ index * this.itemSize ] = x;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the y component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @return {number} The y component.\n\t */\n\tgetY( index ) {\n\n\t\tlet y = this.array[ index * this.itemSize + 1 ];\n\n\t\tif ( this.normalized ) y = denormalize( y, this.array );\n\n\t\treturn y;\n\n\t}\n\n\t/**\n\t * Sets the y component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} y - The value to set.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetY( index, y ) {\n\n\t\tif ( this.normalized ) y = normalize( y, this.array );\n\n\t\tthis.array[ index * this.itemSize + 1 ] = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the z component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @return {number} The z component.\n\t */\n\tgetZ( index ) {\n\n\t\tlet z = this.array[ index * this.itemSize + 2 ];\n\n\t\tif ( this.normalized ) z = denormalize( z, this.array );\n\n\t\treturn z;\n\n\t}\n\n\t/**\n\t * Sets the z component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} z - The value to set.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetZ( index, z ) {\n\n\t\tif ( this.normalized ) z = normalize( z, this.array );\n\n\t\tthis.array[ index * this.itemSize + 2 ] = z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the w component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @return {number} The w component.\n\t */\n\tgetW( index ) {\n\n\t\tlet w = this.array[ index * this.itemSize + 3 ];\n\n\t\tif ( this.normalized ) w = denormalize( w, this.array );\n\n\t\treturn w;\n\n\t}\n\n\t/**\n\t * Sets the w component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} w - The value to set.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetW( index, w ) {\n\n\t\tif ( this.normalized ) w = normalize( w, this.array );\n\n\t\tthis.array[ index * this.itemSize + 3 ] = w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the x and y component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} x - The value for the x component to set.\n\t * @param {number} y - The value for the y component to set.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetXY( index, x, y ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\n\t\t}\n\n\t\tthis.array[ index + 0 ] = x;\n\t\tthis.array[ index + 1 ] = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the x, y and z component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} x - The value for the x component to set.\n\t * @param {number} y - The value for the y component to set.\n\t * @param {number} z - The value for the z component to set.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetXYZ( index, x, y, z ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\t\t\tz = normalize( z, this.array );\n\n\t\t}\n\n\t\tthis.array[ index + 0 ] = x;\n\t\tthis.array[ index + 1 ] = y;\n\t\tthis.array[ index + 2 ] = z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the x, y, z and w component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} x - The value for the x component to set.\n\t * @param {number} y - The value for the y component to set.\n\t * @param {number} z - The value for the z component to set.\n\t * @param {number} w - The value for the w component to set.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetXYZW( index, x, y, z, w ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\t\t\tz = normalize( z, this.array );\n\t\t\tw = normalize( w, this.array );\n\n\t\t}\n\n\t\tthis.array[ index + 0 ] = x;\n\t\tthis.array[ index + 1 ] = y;\n\t\tthis.array[ index + 2 ] = z;\n\t\tthis.array[ index + 3 ] = w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given callback function that is executed after the Renderer has transferred\n\t * the attribute array data to the GPU. Can be used to perform clean-up operations after\n\t * the upload when attribute data are not needed anymore on the CPU side.\n\t *\n\t * @param {Function} callback - The `onUpload()` callback.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tonUpload( callback ) {\n\n\t\tthis.onUploadCallback = callback;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new buffer attribute with copied values from this instance.\n\t *\n\t * @return {BufferAttribute} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor( this.array, this.itemSize ).copy( this );\n\n\t}\n\n\t/**\n\t * Serializes the buffer attribute into JSON.\n\t *\n\t * @return {Object} A JSON object representing the serialized buffer attribute.\n\t */\n\ttoJSON() {\n\n\t\tconst data = {\n\t\t\titemSize: this.itemSize,\n\t\t\ttype: this.array.constructor.name,\n\t\t\tarray: Array.from( this.array ),\n\t\t\tnormalized: this.normalized\n\t\t};\n\n\t\tif ( this.name !== '' ) data.name = this.name;\n\t\tif ( this.usage !== StaticDrawUsage ) data.usage = this.usage;\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * Convenient class that can be used when creating a `Int8` buffer attribute with\n * a plain `Array` instance.\n *\n * @augments BufferAttribute\n */\nclass Int8BufferAttribute extends BufferAttribute {\n\n\t/**\n\t * Constructs a new buffer attribute.\n\t *\n\t * @param {(Array<number>|Int8Array)} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Int8Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\n/**\n * Convenient class that can be used when creating a `UInt8` buffer attribute with\n * a plain `Array` instance.\n *\n * @augments BufferAttribute\n */\nclass Uint8BufferAttribute extends BufferAttribute {\n\n\t/**\n\t * Constructs a new buffer attribute.\n\t *\n\t * @param {(Array<number>|Uint8Array)} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint8Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\n/**\n * Convenient class that can be used when creating a `UInt8Clamped` buffer attribute with\n * a plain `Array` instance.\n *\n * @augments BufferAttribute\n */\nclass Uint8ClampedBufferAttribute extends BufferAttribute {\n\n\t/**\n\t * Constructs a new buffer attribute.\n\t *\n\t * @param {(Array<number>|Uint8ClampedArray)} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint8ClampedArray( array ), itemSize, normalized );\n\n\t}\n\n}\n\n/**\n * Convenient class that can be used when creating a `Int16` buffer attribute with\n * a plain `Array` instance.\n *\n * @augments BufferAttribute\n */\nclass Int16BufferAttribute extends BufferAttribute {\n\n\t/**\n\t * Constructs a new buffer attribute.\n\t *\n\t * @param {(Array<number>|Int16Array)} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Int16Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\n/**\n * Convenient class that can be used when creating a `UInt16` buffer attribute with\n * a plain `Array` instance.\n *\n * @augments BufferAttribute\n */\nclass Uint16BufferAttribute extends BufferAttribute {\n\n\t/**\n\t * Constructs a new buffer attribute.\n\t *\n\t * @param {(Array<number>|Uint16Array)} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint16Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\n/**\n * Convenient class that can be used when creating a `Int32` buffer attribute with\n * a plain `Array` instance.\n *\n * @augments BufferAttribute\n */\nclass Int32BufferAttribute extends BufferAttribute {\n\n\t/**\n\t * Constructs a new buffer attribute.\n\t *\n\t * @param {(Array<number>|Int32Array)} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Int32Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\n/**\n * Convenient class that can be used when creating a `UInt32` buffer attribute with\n * a plain `Array` instance.\n *\n * @augments BufferAttribute\n */\nclass Uint32BufferAttribute extends BufferAttribute {\n\n\t/**\n\t * Constructs a new buffer attribute.\n\t *\n\t * @param {(Array<number>|Uint32Array)} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint32Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\n/**\n * Convenient class that can be used when creating a `Float16` buffer attribute with\n * a plain `Array` instance.\n *\n * This class automatically converts to and from FP16 via `Uint16Array` since `Float16Array`\n * browser support is still problematic.\n *\n * @augments BufferAttribute\n */\nclass Float16BufferAttribute extends BufferAttribute {\n\n\t/**\n\t * Constructs a new buffer attribute.\n\t *\n\t * @param {(Array<number>|Uint16Array)} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint16Array( array ), itemSize, normalized );\n\n\t\tthis.isFloat16BufferAttribute = true;\n\n\t}\n\n\tgetX( index ) {\n\n\t\tlet x = fromHalfFloat( this.array[ index * this.itemSize ] );\n\n\t\tif ( this.normalized ) x = denormalize( x, this.array );\n\n\t\treturn x;\n\n\t}\n\n\tsetX( index, x ) {\n\n\t\tif ( this.normalized ) x = normalize( x, this.array );\n\n\t\tthis.array[ index * this.itemSize ] = toHalfFloat( x );\n\n\t\treturn this;\n\n\t}\n\n\tgetY( index ) {\n\n\t\tlet y = fromHalfFloat( this.array[ index * this.itemSize + 1 ] );\n\n\t\tif ( this.normalized ) y = denormalize( y, this.array );\n\n\t\treturn y;\n\n\t}\n\n\tsetY( index, y ) {\n\n\t\tif ( this.normalized ) y = normalize( y, this.array );\n\n\t\tthis.array[ index * this.itemSize + 1 ] = toHalfFloat( y );\n\n\t\treturn this;\n\n\t}\n\n\tgetZ( index ) {\n\n\t\tlet z = fromHalfFloat( this.array[ index * this.itemSize + 2 ] );\n\n\t\tif ( this.normalized ) z = denormalize( z, this.array );\n\n\t\treturn z;\n\n\t}\n\n\tsetZ( index, z ) {\n\n\t\tif ( this.normalized ) z = normalize( z, this.array );\n\n\t\tthis.array[ index * this.itemSize + 2 ] = toHalfFloat( z );\n\n\t\treturn this;\n\n\t}\n\n\tgetW( index ) {\n\n\t\tlet w = fromHalfFloat( this.array[ index * this.itemSize + 3 ] );\n\n\t\tif ( this.normalized ) w = denormalize( w, this.array );\n\n\t\treturn w;\n\n\t}\n\n\tsetW( index, w ) {\n\n\t\tif ( this.normalized ) w = normalize( w, this.array );\n\n\t\tthis.array[ index * this.itemSize + 3 ] = toHalfFloat( w );\n\n\t\treturn this;\n\n\t}\n\n\tsetXY( index, x, y ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\n\t\t}\n\n\t\tthis.array[ index + 0 ] = toHalfFloat( x );\n\t\tthis.array[ index + 1 ] = toHalfFloat( y );\n\n\t\treturn this;\n\n\t}\n\n\tsetXYZ( index, x, y, z ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\t\t\tz = normalize( z, this.array );\n\n\t\t}\n\n\t\tthis.array[ index + 0 ] = toHalfFloat( x );\n\t\tthis.array[ index + 1 ] = toHalfFloat( y );\n\t\tthis.array[ index + 2 ] = toHalfFloat( z );\n\n\t\treturn this;\n\n\t}\n\n\tsetXYZW( index, x, y, z, w ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\t\t\tz = normalize( z, this.array );\n\t\t\tw = normalize( w, this.array );\n\n\t\t}\n\n\t\tthis.array[ index + 0 ] = toHalfFloat( x );\n\t\tthis.array[ index + 1 ] = toHalfFloat( y );\n\t\tthis.array[ index + 2 ] = toHalfFloat( z );\n\t\tthis.array[ index + 3 ] = toHalfFloat( w );\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * Convenient class that can be used when creating a `Float32` buffer attribute with\n * a plain `Array` instance.\n *\n * @augments BufferAttribute\n */\nclass Float32BufferAttribute extends BufferAttribute {\n\n\t/**\n\t * Constructs a new buffer attribute.\n\t *\n\t * @param {(Array<number>|Float32Array)} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Float32Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nlet _id$1 = 0;\n\nconst _m1 = /*@__PURE__*/ new Matrix4();\nconst _obj = /*@__PURE__*/ new Object3D();\nconst _offset = /*@__PURE__*/ new Vector3();\nconst _box$2 = /*@__PURE__*/ new Box3();\nconst _boxMorphTargets = /*@__PURE__*/ new Box3();\nconst _vector$8 = /*@__PURE__*/ new Vector3();\n\n/**\n * A representation of mesh, line, or point geometry. Includes vertex\n * positions, face indices, normals, colors, UVs, and custom attributes\n * within buffers, reducing the cost of passing all this data to the GPU.\n *\n * ```js\n * const geometry = new THREE.BufferGeometry();\n * // create a simple square shape. We duplicate the top left and bottom right\n * // vertices because each vertex needs to appear once per triangle.\n * const vertices = new Float32Array( [\n * \t-1.0, -1.0,  1.0, // v0\n * \t 1.0, -1.0,  1.0, // v1\n * \t 1.0,  1.0,  1.0, // v2\n *\n * \t 1.0,  1.0,  1.0, // v3\n * \t-1.0,  1.0,  1.0, // v4\n * \t-1.0, -1.0,  1.0  // v5\n * ] );\n * // itemSize = 3 because there are 3 values (components) per vertex\n * geometry.setAttribute( 'position', new THREE.BufferAttribute( vertices, 3 ) );\n * const material = new THREE.MeshBasicMaterial( { color: 0xff0000 } );\n * const mesh = new THREE.Mesh( geometry, material );\n * ```\n *\n * @augments EventDispatcher\n */\nclass BufferGeometry extends EventDispatcher {\n\n\t/**\n\t * Constructs a new geometry.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isBufferGeometry = true;\n\n\t\t/**\n\t\t * The ID of the geometry.\n\t\t *\n\t\t * @name BufferGeometry#id\n\t\t * @type {number}\n\t\t * @readonly\n\t\t */\n\t\tObject.defineProperty( this, 'id', { value: _id$1 ++ } );\n\n\t\t/**\n\t\t * The UUID of the geometry.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.uuid = generateUUID();\n\n\t\t/**\n\t\t * The name of the geometry.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\t\tthis.type = 'BufferGeometry';\n\n\t\t/**\n\t\t * Allows for vertices to be re-used across multiple triangles; this is\n\t\t * called using \"indexed triangles\". Each triangle is associated with the\n\t\t * indices of three vertices. This attribute therefore stores the index of\n\t\t * each vertex for each triangular face. If this attribute is not set, the\n\t\t * renderer assumes that each three contiguous positions represent a single triangle.\n\t\t *\n\t\t * @type {?BufferAttribute}\n\t\t * @default null\n\t\t */\n\t\tthis.index = null;\n\n\t\t/**\n\t\t * A (storage) buffer attribute which was generated with a compute shader and\n\t\t * now defines indirect draw calls.\n\t\t *\n\t\t * Can only be used with {@link WebGPURenderer} and a WebGPU backend.\n\t\t *\n\t\t * @type {?BufferAttribute}\n\t\t * @default null\n\t\t */\n\t\tthis.indirect = null;\n\n\t\t/**\n\t\t * This dictionary has as id the name of the attribute to be set and as value\n\t\t * the buffer attribute to set it to. Rather than accessing this property directly,\n\t\t * use `setAttribute()` and `getAttribute()` to access attributes of this geometry.\n\t\t *\n\t\t * @type {Object<string,(BufferAttribute|InterleavedBufferAttribute)>}\n\t\t */\n\t\tthis.attributes = {};\n\n\t\t/**\n\t\t * This dictionary holds the morph targets of the geometry.\n\t\t *\n\t\t * Note: Once the geometry has been rendered, the morph attribute data cannot\n\t\t * be changed. You will have to call `dispose()?, and create a new geometry instance.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.morphAttributes = {};\n\n\t\t/**\n\t\t * Used to control the morph target behavior; when set to `true`, the morph\n\t\t * target data is treated as relative offsets, rather than as absolute\n\t\t * positions/normals.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.morphTargetsRelative = false;\n\n\t\t/**\n\t\t * Split the geometry into groups, each of which will be rendered in a\n\t\t * separate draw call. This allows an array of materials to be used with the geometry.\n\t\t *\n\t\t * Use `addGroup()` and `clearGroups()` to edit groups, rather than modifying this array directly.\n\t\t *\n\t\t * Every vertex and index must belong to exactly one group — groups must not share vertices or\n\t\t * indices, and must not leave vertices or indices unused.\n\t\t *\n\t\t * @type {Array<Object>}\n\t\t */\n\t\tthis.groups = [];\n\n\t\t/**\n\t\t * Bounding box for the geometry which can be calculated with `computeBoundingBox()`.\n\t\t *\n\t\t * @type {?Box3}\n\t\t * @default null\n\t\t */\n\t\tthis.boundingBox = null;\n\n\t\t/**\n\t\t * Bounding sphere for the geometry which can be calculated with `computeBoundingSphere()`.\n\t\t *\n\t\t * @type {?Sphere}\n\t\t * @default null\n\t\t */\n\t\tthis.boundingSphere = null;\n\n\t\t/**\n\t\t * Determines the part of the geometry to render. This should not be set directly,\n\t\t * instead use `setDrawRange()`.\n\t\t *\n\t\t * @type {{start:number,count:number}}\n\t\t */\n\t\tthis.drawRange = { start: 0, count: Infinity };\n\n\t\t/**\n\t\t * An object that can be used to store custom data about the geometry.\n\t\t * It should not hold references to functions as these will not be cloned.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.userData = {};\n\n\t}\n\n\t/**\n\t * Returns the index of this geometry.\n\t *\n\t * @return {?BufferAttribute} The index. Returns `null` if no index is defined.\n\t */\n\tgetIndex() {\n\n\t\treturn this.index;\n\n\t}\n\n\t/**\n\t * Sets the given index to this geometry.\n\t *\n\t * @param {Array<number>|BufferAttribute} index - The index to set.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tsetIndex( index ) {\n\n\t\tif ( Array.isArray( index ) ) {\n\n\t\t\tthis.index = new ( arrayNeedsUint32( index ) ? Uint32BufferAttribute : Uint16BufferAttribute )( index, 1 );\n\n\t\t} else {\n\n\t\t\tthis.index = index;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given indirect attribute to this geometry.\n\t *\n\t * @param {BufferAttribute} indirect - The attribute holding indirect draw calls.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tsetIndirect( indirect ) {\n\n\t\tthis.indirect = indirect;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the indirect attribute of this geometry.\n\t *\n\t * @return {?BufferAttribute} The indirect attribute. Returns `null` if no indirect attribute is defined.\n\t */\n\tgetIndirect() {\n\n\t\treturn this.indirect;\n\n\t}\n\n\t/**\n\t * Returns the buffer attribute for the given name.\n\t *\n\t * @param {string} name - The attribute name.\n\t * @return {BufferAttribute|InterleavedBufferAttribute|undefined} The buffer attribute.\n\t * Returns `undefined` if not attribute has been found.\n\t */\n\tgetAttribute( name ) {\n\n\t\treturn this.attributes[ name ];\n\n\t}\n\n\t/**\n\t * Sets the given attribute for the given name.\n\t *\n\t * @param {string} name - The attribute name.\n\t * @param {BufferAttribute|InterleavedBufferAttribute} attribute - The attribute to set.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tsetAttribute( name, attribute ) {\n\n\t\tthis.attributes[ name ] = attribute;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Deletes the attribute for the given name.\n\t *\n\t * @param {string} name - The attribute name to delete.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tdeleteAttribute( name ) {\n\n\t\tdelete this.attributes[ name ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this geometry has an attribute for the given name.\n\t *\n\t * @param {string} name - The attribute name.\n\t * @return {boolean} Whether this geometry has an attribute for the given name or not.\n\t */\n\thasAttribute( name ) {\n\n\t\treturn this.attributes[ name ] !== undefined;\n\n\t}\n\n\t/**\n\t * Adds a group to this geometry.\n\t *\n\t * @param {number} start - The first element in this draw call. That is the first\n\t * vertex for non-indexed geometry, otherwise the first triangle index.\n\t * @param {number} count - Specifies how many vertices (or indices) are part of this group.\n\t * @param {number} [materialIndex=0] - The material array index to use.\n\t */\n\taddGroup( start, count, materialIndex = 0 ) {\n\n\t\tthis.groups.push( {\n\n\t\t\tstart: start,\n\t\t\tcount: count,\n\t\t\tmaterialIndex: materialIndex\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Clears all groups.\n\t */\n\tclearGroups() {\n\n\t\tthis.groups = [];\n\n\t}\n\n\t/**\n\t * Sets the draw range for this geometry.\n\t *\n\t * @param {number} start - The first vertex for non-indexed geometry, otherwise the first triangle index.\n\t * @param {number} count - For non-indexed BufferGeometry, `count` is the number of vertices to render.\n\t * For indexed BufferGeometry, `count` is the number of indices to render.\n\t */\n\tsetDrawRange( start, count ) {\n\n\t\tthis.drawRange.start = start;\n\t\tthis.drawRange.count = count;\n\n\t}\n\n\t/**\n\t * Applies the given 4x4 transformation matrix to the geometry.\n\t *\n\t * @param {Matrix4} matrix - The matrix to apply.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tapplyMatrix4( matrix ) {\n\n\t\tconst position = this.attributes.position;\n\n\t\tif ( position !== undefined ) {\n\n\t\t\tposition.applyMatrix4( matrix );\n\n\t\t\tposition.needsUpdate = true;\n\n\t\t}\n\n\t\tconst normal = this.attributes.normal;\n\n\t\tif ( normal !== undefined ) {\n\n\t\t\tconst normalMatrix = new Matrix3().getNormalMatrix( matrix );\n\n\t\t\tnormal.applyNormalMatrix( normalMatrix );\n\n\t\t\tnormal.needsUpdate = true;\n\n\t\t}\n\n\t\tconst tangent = this.attributes.tangent;\n\n\t\tif ( tangent !== undefined ) {\n\n\t\t\ttangent.transformDirection( matrix );\n\n\t\t\ttangent.needsUpdate = true;\n\n\t\t}\n\n\t\tif ( this.boundingBox !== null ) {\n\n\t\t\tthis.computeBoundingBox();\n\n\t\t}\n\n\t\tif ( this.boundingSphere !== null ) {\n\n\t\t\tthis.computeBoundingSphere();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Applies the rotation represented by the Quaternion to the geometry.\n\t *\n\t * @param {Quaternion} q - The Quaternion to apply.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tapplyQuaternion( q ) {\n\n\t\t_m1.makeRotationFromQuaternion( q );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Rotates the geometry about the X axis. This is typically done as a one time\n\t * operation, and not during a loop. Use {@link Object3D#rotation} for typical\n\t * real-time mesh rotation.\n\t *\n\t * @param {number} angle - The angle in radians.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\trotateX( angle ) {\n\n\t\t// rotate geometry around world x-axis\n\n\t\t_m1.makeRotationX( angle );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Rotates the geometry about the Y axis. This is typically done as a one time\n\t * operation, and not during a loop. Use {@link Object3D#rotation} for typical\n\t * real-time mesh rotation.\n\t *\n\t * @param {number} angle - The angle in radians.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\trotateY( angle ) {\n\n\t\t// rotate geometry around world y-axis\n\n\t\t_m1.makeRotationY( angle );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Rotates the geometry about the Z axis. This is typically done as a one time\n\t * operation, and not during a loop. Use {@link Object3D#rotation} for typical\n\t * real-time mesh rotation.\n\t *\n\t * @param {number} angle - The angle in radians.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\trotateZ( angle ) {\n\n\t\t// rotate geometry around world z-axis\n\n\t\t_m1.makeRotationZ( angle );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Translates the geometry. This is typically done as a one time\n\t * operation, and not during a loop. Use {@link Object3D#position} for typical\n\t * real-time mesh rotation.\n\t *\n\t * @param {number} x - The x offset.\n\t * @param {number} y - The y offset.\n\t * @param {number} z - The z offset.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\ttranslate( x, y, z ) {\n\n\t\t// translate geometry\n\n\t\t_m1.makeTranslation( x, y, z );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Scales the geometry. This is typically done as a one time\n\t * operation, and not during a loop. Use {@link Object3D#scale} for typical\n\t * real-time mesh rotation.\n\t *\n\t * @param {number} x - The x scale.\n\t * @param {number} y - The y scale.\n\t * @param {number} z - The z scale.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tscale( x, y, z ) {\n\n\t\t// scale geometry\n\n\t\t_m1.makeScale( x, y, z );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Rotates the geometry to face a point in 3D space. This is typically done as a one time\n\t * operation, and not during a loop. Use {@link Object3D#lookAt} for typical\n\t * real-time mesh rotation.\n\t *\n\t * @param {Vector3} vector - The target point.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tlookAt( vector ) {\n\n\t\t_obj.lookAt( vector );\n\n\t\t_obj.updateMatrix();\n\n\t\tthis.applyMatrix4( _obj.matrix );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Center the geometry based on its bounding box.\n\t *\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tcenter() {\n\n\t\tthis.computeBoundingBox();\n\n\t\tthis.boundingBox.getCenter( _offset ).negate();\n\n\t\tthis.translate( _offset.x, _offset.y, _offset.z );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Defines a geometry by creating a `position` attribute based on the given array of points. The array\n\t * can hold 2D or 3D vectors. When using two-dimensional data, the `z` coordinate for all vertices is\n\t * set to `0`.\n\t *\n\t * If the method is used with an existing `position` attribute, the vertex data are overwritten with the\n\t * data from the array. The length of the array must match the vertex count.\n\t *\n\t * @param {Array<Vector2>|Array<Vector3>} points - The points.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tsetFromPoints( points ) {\n\n\t\tconst positionAttribute = this.getAttribute( 'position' );\n\n\t\tif ( positionAttribute === undefined ) {\n\n\t\t\tconst position = [];\n\n\t\t\tfor ( let i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\t\tconst point = points[ i ];\n\t\t\t\tposition.push( point.x, point.y, point.z || 0 );\n\n\t\t\t}\n\n\t\t\tthis.setAttribute( 'position', new Float32BufferAttribute( position, 3 ) );\n\n\t\t} else {\n\n\t\t\tconst l = Math.min( points.length, positionAttribute.count ); // make sure data do not exceed buffer size\n\n\t\t\tfor ( let i = 0; i < l; i ++ ) {\n\n\t\t\t\tconst point = points[ i ];\n\t\t\t\tpositionAttribute.setXYZ( i, point.x, point.y, point.z || 0 );\n\n\t\t\t}\n\n\t\t\tif ( points.length > positionAttribute.count ) {\n\n\t\t\t\twarn( 'BufferGeometry: Buffer size too small for points data. Use .dispose() and create a new geometry.' );\n\n\t\t\t}\n\n\t\t\tpositionAttribute.needsUpdate = true;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes the bounding box of the geometry, and updates the `boundingBox` member.\n\t * The bounding box is not computed by the engine; it must be computed by your app.\n\t * You may need to recompute the bounding box if the geometry vertices are modified.\n\t */\n\tcomputeBoundingBox() {\n\n\t\tif ( this.boundingBox === null ) {\n\n\t\t\tthis.boundingBox = new Box3();\n\n\t\t}\n\n\t\tconst position = this.attributes.position;\n\t\tconst morphAttributesPosition = this.morphAttributes.position;\n\n\t\tif ( position && position.isGLBufferAttribute ) {\n\n\t\t\terror( 'BufferGeometry.computeBoundingBox(): GLBufferAttribute requires a manual bounding box.', this );\n\n\t\t\tthis.boundingBox.set(\n\t\t\t\tnew Vector3( - Infinity, - Infinity, - Infinity ),\n\t\t\t\tnew Vector3( + Infinity, + Infinity, + Infinity )\n\t\t\t);\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( position !== undefined ) {\n\n\t\t\tthis.boundingBox.setFromBufferAttribute( position );\n\n\t\t\t// process morph attributes if present\n\n\t\t\tif ( morphAttributesPosition ) {\n\n\t\t\t\tfor ( let i = 0, il = morphAttributesPosition.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst morphAttribute = morphAttributesPosition[ i ];\n\t\t\t\t\t_box$2.setFromBufferAttribute( morphAttribute );\n\n\t\t\t\t\tif ( this.morphTargetsRelative ) {\n\n\t\t\t\t\t\t_vector$8.addVectors( this.boundingBox.min, _box$2.min );\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _vector$8 );\n\n\t\t\t\t\t\t_vector$8.addVectors( this.boundingBox.max, _box$2.max );\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _vector$8 );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _box$2.min );\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _box$2.max );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tthis.boundingBox.makeEmpty();\n\n\t\t}\n\n\t\tif ( isNaN( this.boundingBox.min.x ) || isNaN( this.boundingBox.min.y ) || isNaN( this.boundingBox.min.z ) ) {\n\n\t\t\terror( 'BufferGeometry.computeBoundingBox(): Computed min/max have NaN values. The \"position\" attribute is likely to have NaN values.', this );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Computes the bounding sphere of the geometry, and updates the `boundingSphere` member.\n\t * The engine automatically computes the bounding sphere when it is needed, e.g., for ray casting or view frustum culling.\n\t * You may need to recompute the bounding sphere if the geometry vertices are modified.\n\t */\n\tcomputeBoundingSphere() {\n\n\t\tif ( this.boundingSphere === null ) {\n\n\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t}\n\n\t\tconst position = this.attributes.position;\n\t\tconst morphAttributesPosition = this.morphAttributes.position;\n\n\t\tif ( position && position.isGLBufferAttribute ) {\n\n\t\t\terror( 'BufferGeometry.computeBoundingSphere(): GLBufferAttribute requires a manual bounding sphere.', this );\n\n\t\t\tthis.boundingSphere.set( new Vector3(), Infinity );\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( position ) {\n\n\t\t\t// first, find the center of the bounding sphere\n\n\t\t\tconst center = this.boundingSphere.center;\n\n\t\t\t_box$2.setFromBufferAttribute( position );\n\n\t\t\t// process morph attributes if present\n\n\t\t\tif ( morphAttributesPosition ) {\n\n\t\t\t\tfor ( let i = 0, il = morphAttributesPosition.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst morphAttribute = morphAttributesPosition[ i ];\n\t\t\t\t\t_boxMorphTargets.setFromBufferAttribute( morphAttribute );\n\n\t\t\t\t\tif ( this.morphTargetsRelative ) {\n\n\t\t\t\t\t\t_vector$8.addVectors( _box$2.min, _boxMorphTargets.min );\n\t\t\t\t\t\t_box$2.expandByPoint( _vector$8 );\n\n\t\t\t\t\t\t_vector$8.addVectors( _box$2.max, _boxMorphTargets.max );\n\t\t\t\t\t\t_box$2.expandByPoint( _vector$8 );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_box$2.expandByPoint( _boxMorphTargets.min );\n\t\t\t\t\t\t_box$2.expandByPoint( _boxMorphTargets.max );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_box$2.getCenter( center );\n\n\t\t\t// second, try to find a boundingSphere with a radius smaller than the\n\t\t\t// boundingSphere of the boundingBox: sqrt(3) smaller in the best case\n\n\t\t\tlet maxRadiusSq = 0;\n\n\t\t\tfor ( let i = 0, il = position.count; i < il; i ++ ) {\n\n\t\t\t\t_vector$8.fromBufferAttribute( position, i );\n\n\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( _vector$8 ) );\n\n\t\t\t}\n\n\t\t\t// process morph attributes if present\n\n\t\t\tif ( morphAttributesPosition ) {\n\n\t\t\t\tfor ( let i = 0, il = morphAttributesPosition.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst morphAttribute = morphAttributesPosition[ i ];\n\t\t\t\t\tconst morphTargetsRelative = this.morphTargetsRelative;\n\n\t\t\t\t\tfor ( let j = 0, jl = morphAttribute.count; j < jl; j ++ ) {\n\n\t\t\t\t\t\t_vector$8.fromBufferAttribute( morphAttribute, j );\n\n\t\t\t\t\t\tif ( morphTargetsRelative ) {\n\n\t\t\t\t\t\t\t_offset.fromBufferAttribute( position, j );\n\t\t\t\t\t\t\t_vector$8.add( _offset );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( _vector$8 ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.boundingSphere.radius = Math.sqrt( maxRadiusSq );\n\n\t\t\tif ( isNaN( this.boundingSphere.radius ) ) {\n\n\t\t\t\terror( 'BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The \"position\" attribute is likely to have NaN values.', this );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Calculates and adds a tangent attribute to this geometry.\n\t *\n\t * The computation is only supported for indexed geometries and if position, normal, and uv attributes\n\t * are defined. When using a tangent space normal map, prefer the MikkTSpace algorithm provided by\n\t * {@link BufferGeometryUtils#computeMikkTSpaceTangents} instead.\n\t */\n\tcomputeTangents() {\n\n\t\tconst index = this.index;\n\t\tconst attributes = this.attributes;\n\n\t\t// based on http://www.terathon.com/code/tangent.html\n\t\t// (per vertex tangents)\n\n\t\tif ( index === null ||\n\t\t\t attributes.position === undefined ||\n\t\t\t attributes.normal === undefined ||\n\t\t\t attributes.uv === undefined ) {\n\n\t\t\terror( 'BufferGeometry: .computeTangents() failed. Missing required attributes (index, position, normal or uv)' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst positionAttribute = attributes.position;\n\t\tconst normalAttribute = attributes.normal;\n\t\tconst uvAttribute = attributes.uv;\n\n\t\tif ( this.hasAttribute( 'tangent' ) === false ) {\n\n\t\t\tthis.setAttribute( 'tangent', new BufferAttribute( new Float32Array( 4 * positionAttribute.count ), 4 ) );\n\n\t\t}\n\n\t\tconst tangentAttribute = this.getAttribute( 'tangent' );\n\n\t\tconst tan1 = [], tan2 = [];\n\n\t\tfor ( let i = 0; i < positionAttribute.count; i ++ ) {\n\n\t\t\ttan1[ i ] = new Vector3();\n\t\t\ttan2[ i ] = new Vector3();\n\n\t\t}\n\n\t\tconst vA = new Vector3(),\n\t\t\tvB = new Vector3(),\n\t\t\tvC = new Vector3(),\n\n\t\t\tuvA = new Vector2(),\n\t\t\tuvB = new Vector2(),\n\t\t\tuvC = new Vector2(),\n\n\t\t\tsdir = new Vector3(),\n\t\t\ttdir = new Vector3();\n\n\t\tfunction handleTriangle( a, b, c ) {\n\n\t\t\tvA.fromBufferAttribute( positionAttribute, a );\n\t\t\tvB.fromBufferAttribute( positionAttribute, b );\n\t\t\tvC.fromBufferAttribute( positionAttribute, c );\n\n\t\t\tuvA.fromBufferAttribute( uvAttribute, a );\n\t\t\tuvB.fromBufferAttribute( uvAttribute, b );\n\t\t\tuvC.fromBufferAttribute( uvAttribute, c );\n\n\t\t\tvB.sub( vA );\n\t\t\tvC.sub( vA );\n\n\t\t\tuvB.sub( uvA );\n\t\t\tuvC.sub( uvA );\n\n\t\t\tconst r = 1.0 / ( uvB.x * uvC.y - uvC.x * uvB.y );\n\n\t\t\t// silently ignore degenerate uv triangles having coincident or colinear vertices\n\n\t\t\tif ( ! isFinite( r ) ) return;\n\n\t\t\tsdir.copy( vB ).multiplyScalar( uvC.y ).addScaledVector( vC, - uvB.y ).multiplyScalar( r );\n\t\t\ttdir.copy( vC ).multiplyScalar( uvB.x ).addScaledVector( vB, - uvC.x ).multiplyScalar( r );\n\n\t\t\ttan1[ a ].add( sdir );\n\t\t\ttan1[ b ].add( sdir );\n\t\t\ttan1[ c ].add( sdir );\n\n\t\t\ttan2[ a ].add( tdir );\n\t\t\ttan2[ b ].add( tdir );\n\t\t\ttan2[ c ].add( tdir );\n\n\t\t}\n\n\t\tlet groups = this.groups;\n\n\t\tif ( groups.length === 0 ) {\n\n\t\t\tgroups = [ {\n\t\t\t\tstart: 0,\n\t\t\t\tcount: index.count\n\t\t\t} ];\n\n\t\t}\n\n\t\tfor ( let i = 0, il = groups.length; i < il; ++ i ) {\n\n\t\t\tconst group = groups[ i ];\n\n\t\t\tconst start = group.start;\n\t\t\tconst count = group.count;\n\n\t\t\tfor ( let j = start, jl = start + count; j < jl; j += 3 ) {\n\n\t\t\t\thandleTriangle(\n\t\t\t\t\tindex.getX( j + 0 ),\n\t\t\t\t\tindex.getX( j + 1 ),\n\t\t\t\t\tindex.getX( j + 2 )\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst tmp = new Vector3(), tmp2 = new Vector3();\n\t\tconst n = new Vector3(), n2 = new Vector3();\n\n\t\tfunction handleVertex( v ) {\n\n\t\t\tn.fromBufferAttribute( normalAttribute, v );\n\t\t\tn2.copy( n );\n\n\t\t\tconst t = tan1[ v ];\n\n\t\t\t// Gram-Schmidt orthogonalize\n\n\t\t\ttmp.copy( t );\n\t\t\ttmp.sub( n.multiplyScalar( n.dot( t ) ) ).normalize();\n\n\t\t\t// Calculate handedness\n\n\t\t\ttmp2.crossVectors( n2, t );\n\t\t\tconst test = tmp2.dot( tan2[ v ] );\n\t\t\tconst w = ( test < 0.0 ) ? -1 : 1.0;\n\n\t\t\ttangentAttribute.setXYZW( v, tmp.x, tmp.y, tmp.z, w );\n\n\t\t}\n\n\t\tfor ( let i = 0, il = groups.length; i < il; ++ i ) {\n\n\t\t\tconst group = groups[ i ];\n\n\t\t\tconst start = group.start;\n\t\t\tconst count = group.count;\n\n\t\t\tfor ( let j = start, jl = start + count; j < jl; j += 3 ) {\n\n\t\t\t\thandleVertex( index.getX( j + 0 ) );\n\t\t\t\thandleVertex( index.getX( j + 1 ) );\n\t\t\t\thandleVertex( index.getX( j + 2 ) );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Computes vertex normals for the given vertex data. For indexed geometries, the method sets\n\t * each vertex normal to be the average of the face normals of the faces that share that vertex.\n\t * For non-indexed geometries, vertices are not shared, and the method sets each vertex normal\n\t * to be the same as the face normal.\n\t */\n\tcomputeVertexNormals() {\n\n\t\tconst index = this.index;\n\t\tconst positionAttribute = this.getAttribute( 'position' );\n\n\t\tif ( positionAttribute !== undefined ) {\n\n\t\t\tlet normalAttribute = this.getAttribute( 'normal' );\n\n\t\t\tif ( normalAttribute === undefined ) {\n\n\t\t\t\tnormalAttribute = new BufferAttribute( new Float32Array( positionAttribute.count * 3 ), 3 );\n\t\t\t\tthis.setAttribute( 'normal', normalAttribute );\n\n\t\t\t} else {\n\n\t\t\t\t// reset existing normals to zero\n\n\t\t\t\tfor ( let i = 0, il = normalAttribute.count; i < il; i ++ ) {\n\n\t\t\t\t\tnormalAttribute.setXYZ( i, 0, 0, 0 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst pA = new Vector3(), pB = new Vector3(), pC = new Vector3();\n\t\t\tconst nA = new Vector3(), nB = new Vector3(), nC = new Vector3();\n\t\t\tconst cb = new Vector3(), ab = new Vector3();\n\n\t\t\t// indexed elements\n\n\t\t\tif ( index ) {\n\n\t\t\t\tfor ( let i = 0, il = index.count; i < il; i += 3 ) {\n\n\t\t\t\t\tconst vA = index.getX( i + 0 );\n\t\t\t\t\tconst vB = index.getX( i + 1 );\n\t\t\t\t\tconst vC = index.getX( i + 2 );\n\n\t\t\t\t\tpA.fromBufferAttribute( positionAttribute, vA );\n\t\t\t\t\tpB.fromBufferAttribute( positionAttribute, vB );\n\t\t\t\t\tpC.fromBufferAttribute( positionAttribute, vC );\n\n\t\t\t\t\tcb.subVectors( pC, pB );\n\t\t\t\t\tab.subVectors( pA, pB );\n\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\tnA.fromBufferAttribute( normalAttribute, vA );\n\t\t\t\t\tnB.fromBufferAttribute( normalAttribute, vB );\n\t\t\t\t\tnC.fromBufferAttribute( normalAttribute, vC );\n\n\t\t\t\t\tnA.add( cb );\n\t\t\t\t\tnB.add( cb );\n\t\t\t\t\tnC.add( cb );\n\n\t\t\t\t\tnormalAttribute.setXYZ( vA, nA.x, nA.y, nA.z );\n\t\t\t\t\tnormalAttribute.setXYZ( vB, nB.x, nB.y, nB.z );\n\t\t\t\t\tnormalAttribute.setXYZ( vC, nC.x, nC.y, nC.z );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// non-indexed elements (unconnected triangle soup)\n\n\t\t\t\tfor ( let i = 0, il = positionAttribute.count; i < il; i += 3 ) {\n\n\t\t\t\t\tpA.fromBufferAttribute( positionAttribute, i + 0 );\n\t\t\t\t\tpB.fromBufferAttribute( positionAttribute, i + 1 );\n\t\t\t\t\tpC.fromBufferAttribute( positionAttribute, i + 2 );\n\n\t\t\t\t\tcb.subVectors( pC, pB );\n\t\t\t\t\tab.subVectors( pA, pB );\n\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\tnormalAttribute.setXYZ( i + 0, cb.x, cb.y, cb.z );\n\t\t\t\t\tnormalAttribute.setXYZ( i + 1, cb.x, cb.y, cb.z );\n\t\t\t\t\tnormalAttribute.setXYZ( i + 2, cb.x, cb.y, cb.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.normalizeNormals();\n\n\t\t\tnormalAttribute.needsUpdate = true;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Ensures every normal vector in a geometry will have a magnitude of `1`. This will\n\t * correct lighting on the geometry surfaces.\n\t */\n\tnormalizeNormals() {\n\n\t\tconst normals = this.attributes.normal;\n\n\t\tfor ( let i = 0, il = normals.count; i < il; i ++ ) {\n\n\t\t\t_vector$8.fromBufferAttribute( normals, i );\n\n\t\t\t_vector$8.normalize();\n\n\t\t\tnormals.setXYZ( i, _vector$8.x, _vector$8.y, _vector$8.z );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Return a new non-index version of this indexed geometry. If the geometry\n\t * is already non-indexed, the method is a NOOP.\n\t *\n\t * @return {BufferGeometry} The non-indexed version of this indexed geometry.\n\t */\n\ttoNonIndexed() {\n\n\t\tfunction convertBufferAttribute( attribute, indices ) {\n\n\t\t\tconst array = attribute.array;\n\t\t\tconst itemSize = attribute.itemSize;\n\t\t\tconst normalized = attribute.normalized;\n\n\t\t\tconst array2 = new array.constructor( indices.length * itemSize );\n\n\t\t\tlet index = 0, index2 = 0;\n\n\t\t\tfor ( let i = 0, l = indices.length; i < l; i ++ ) {\n\n\t\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\t\tindex = indices[ i ] * attribute.data.stride + attribute.offset;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tindex = indices[ i ] * itemSize;\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let j = 0; j < itemSize; j ++ ) {\n\n\t\t\t\t\tarray2[ index2 ++ ] = array[ index ++ ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new BufferAttribute( array2, itemSize, normalized );\n\n\t\t}\n\n\t\t//\n\n\t\tif ( this.index === null ) {\n\n\t\t\twarn( 'BufferGeometry.toNonIndexed(): BufferGeometry is already non-indexed.' );\n\t\t\treturn this;\n\n\t\t}\n\n\t\tconst geometry2 = new BufferGeometry();\n\n\t\tconst indices = this.index.array;\n\t\tconst attributes = this.attributes;\n\n\t\t// attributes\n\n\t\tfor ( const name in attributes ) {\n\n\t\t\tconst attribute = attributes[ name ];\n\n\t\t\tconst newAttribute = convertBufferAttribute( attribute, indices );\n\n\t\t\tgeometry2.setAttribute( name, newAttribute );\n\n\t\t}\n\n\t\t// morph attributes\n\n\t\tconst morphAttributes = this.morphAttributes;\n\n\t\tfor ( const name in morphAttributes ) {\n\n\t\t\tconst morphArray = [];\n\t\t\tconst morphAttribute = morphAttributes[ name ]; // morphAttribute: array of Float32BufferAttributes\n\n\t\t\tfor ( let i = 0, il = morphAttribute.length; i < il; i ++ ) {\n\n\t\t\t\tconst attribute = morphAttribute[ i ];\n\n\t\t\t\tconst newAttribute = convertBufferAttribute( attribute, indices );\n\n\t\t\t\tmorphArray.push( newAttribute );\n\n\t\t\t}\n\n\t\t\tgeometry2.morphAttributes[ name ] = morphArray;\n\n\t\t}\n\n\t\tgeometry2.morphTargetsRelative = this.morphTargetsRelative;\n\n\t\t// groups\n\n\t\tconst groups = this.groups;\n\n\t\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\tconst group = groups[ i ];\n\t\t\tgeometry2.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t}\n\n\t\treturn geometry2;\n\n\t}\n\n\t/**\n\t * Serializes the geometry into JSON.\n\t *\n\t * @return {Object} A JSON object representing the serialized geometry.\n\t */\n\ttoJSON() {\n\n\t\tconst data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.7,\n\t\t\t\ttype: 'BufferGeometry',\n\t\t\t\tgenerator: 'BufferGeometry.toJSON'\n\t\t\t}\n\t\t};\n\n\t\t// standard BufferGeometry serialization\n\n\t\tdata.uuid = this.uuid;\n\t\tdata.type = this.type;\n\t\tif ( this.name !== '' ) data.name = this.name;\n\t\tif ( Object.keys( this.userData ).length > 0 ) data.userData = this.userData;\n\n\t\tif ( this.parameters !== undefined ) {\n\n\t\t\tconst parameters = this.parameters;\n\n\t\t\tfor ( const key in parameters ) {\n\n\t\t\t\tif ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ];\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\t// for simplicity the code assumes attributes are not shared across geometries, see #15811\n\n\t\tdata.data = { attributes: {} };\n\n\t\tconst index = this.index;\n\n\t\tif ( index !== null ) {\n\n\t\t\tdata.data.index = {\n\t\t\t\ttype: index.array.constructor.name,\n\t\t\t\tarray: Array.prototype.slice.call( index.array )\n\t\t\t};\n\n\t\t}\n\n\t\tconst attributes = this.attributes;\n\n\t\tfor ( const key in attributes ) {\n\n\t\t\tconst attribute = attributes[ key ];\n\n\t\t\tdata.data.attributes[ key ] = attribute.toJSON( data.data );\n\n\t\t}\n\n\t\tconst morphAttributes = {};\n\t\tlet hasMorphAttributes = false;\n\n\t\tfor ( const key in this.morphAttributes ) {\n\n\t\t\tconst attributeArray = this.morphAttributes[ key ];\n\n\t\t\tconst array = [];\n\n\t\t\tfor ( let i = 0, il = attributeArray.length; i < il; i ++ ) {\n\n\t\t\t\tconst attribute = attributeArray[ i ];\n\n\t\t\t\tarray.push( attribute.toJSON( data.data ) );\n\n\t\t\t}\n\n\t\t\tif ( array.length > 0 ) {\n\n\t\t\t\tmorphAttributes[ key ] = array;\n\n\t\t\t\thasMorphAttributes = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( hasMorphAttributes ) {\n\n\t\t\tdata.data.morphAttributes = morphAttributes;\n\t\t\tdata.data.morphTargetsRelative = this.morphTargetsRelative;\n\n\t\t}\n\n\t\tconst groups = this.groups;\n\n\t\tif ( groups.length > 0 ) {\n\n\t\t\tdata.data.groups = JSON.parse( JSON.stringify( groups ) );\n\n\t\t}\n\n\t\tconst boundingSphere = this.boundingSphere;\n\n\t\tif ( boundingSphere !== null ) {\n\n\t\t\tdata.data.boundingSphere = boundingSphere.toJSON();\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\t/**\n\t * Returns a new geometry with copied values from this instance.\n\t *\n\t * @return {BufferGeometry} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Copies the values of the given geometry to this instance.\n\t *\n\t * @param {BufferGeometry} source - The geometry to copy.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tcopy( source ) {\n\n\t\t// reset\n\n\t\tthis.index = null;\n\t\tthis.attributes = {};\n\t\tthis.morphAttributes = {};\n\t\tthis.groups = [];\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\n\t\t// used for storing cloned, shared data\n\n\t\tconst data = {};\n\n\t\t// name\n\n\t\tthis.name = source.name;\n\n\t\t// index\n\n\t\tconst index = source.index;\n\n\t\tif ( index !== null ) {\n\n\t\t\tthis.setIndex( index.clone() );\n\n\t\t}\n\n\t\t// attributes\n\n\t\tconst attributes = source.attributes;\n\n\t\tfor ( const name in attributes ) {\n\n\t\t\tconst attribute = attributes[ name ];\n\t\t\tthis.setAttribute( name, attribute.clone( data ) );\n\n\t\t}\n\n\t\t// morph attributes\n\n\t\tconst morphAttributes = source.morphAttributes;\n\n\t\tfor ( const name in morphAttributes ) {\n\n\t\t\tconst array = [];\n\t\t\tconst morphAttribute = morphAttributes[ name ]; // morphAttribute: array of Float32BufferAttributes\n\n\t\t\tfor ( let i = 0, l = morphAttribute.length; i < l; i ++ ) {\n\n\t\t\t\tarray.push( morphAttribute[ i ].clone( data ) );\n\n\t\t\t}\n\n\t\t\tthis.morphAttributes[ name ] = array;\n\n\t\t}\n\n\t\tthis.morphTargetsRelative = source.morphTargetsRelative;\n\n\t\t// groups\n\n\t\tconst groups = source.groups;\n\n\t\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\tconst group = groups[ i ];\n\t\t\tthis.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t}\n\n\t\t// bounding box\n\n\t\tconst boundingBox = source.boundingBox;\n\n\t\tif ( boundingBox !== null ) {\n\n\t\t\tthis.boundingBox = boundingBox.clone();\n\n\t\t}\n\n\t\t// bounding sphere\n\n\t\tconst boundingSphere = source.boundingSphere;\n\n\t\tif ( boundingSphere !== null ) {\n\n\t\t\tthis.boundingSphere = boundingSphere.clone();\n\n\t\t}\n\n\t\t// draw range\n\n\t\tthis.drawRange.start = source.drawRange.start;\n\t\tthis.drawRange.count = source.drawRange.count;\n\n\t\t// user data\n\n\t\tthis.userData = source.userData;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t *\n\t * @fires BufferGeometry#dispose\n\t */\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n}\n\nconst _inverseMatrix$3 = /*@__PURE__*/ new Matrix4();\nconst _ray$3 = /*@__PURE__*/ new Ray();\nconst _sphere$6 = /*@__PURE__*/ new Sphere();\nconst _sphereHitAt = /*@__PURE__*/ new Vector3();\n\nconst _vA$1 = /*@__PURE__*/ new Vector3();\nconst _vB$1 = /*@__PURE__*/ new Vector3();\nconst _vC$1 = /*@__PURE__*/ new Vector3();\n\nconst _tempA = /*@__PURE__*/ new Vector3();\nconst _morphA = /*@__PURE__*/ new Vector3();\n\nconst _intersectionPoint = /*@__PURE__*/ new Vector3();\nconst _intersectionPointWorld = /*@__PURE__*/ new Vector3();\n\n/**\n * Class representing triangular polygon mesh based objects.\n *\n * ```js\n * const geometry = new THREE.BoxGeometry( 1, 1, 1 );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const mesh = new THREE.Mesh( geometry, material );\n * scene.add( mesh );\n * ```\n *\n * @augments Object3D\n */\nclass Mesh extends Object3D {\n\n\t/**\n\t * Constructs a new mesh.\n\t *\n\t * @param {BufferGeometry} [geometry] - The mesh geometry.\n\t * @param {Material|Array<Material>} [material] - The mesh material.\n\t */\n\tconstructor( geometry = new BufferGeometry(), material = new MeshBasicMaterial() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMesh = true;\n\n\t\tthis.type = 'Mesh';\n\n\t\t/**\n\t\t * The mesh geometry.\n\t\t *\n\t\t * @type {BufferGeometry}\n\t\t */\n\t\tthis.geometry = geometry;\n\n\t\t/**\n\t\t * The mesh material.\n\t\t *\n\t\t * @type {Material|Array<Material>}\n\t\t * @default MeshBasicMaterial\n\t\t */\n\t\tthis.material = material;\n\n\t\t/**\n\t\t * A dictionary representing the morph targets in the geometry. The key is the\n\t\t * morph targets name, the value its attribute index. This member is `undefined`\n\t\t * by default and only set when morph targets are detected in the geometry.\n\t\t *\n\t\t * @type {Object<String,number>|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.morphTargetDictionary = undefined;\n\n\t\t/**\n\t\t * An array of weights typically in the range `[0,1]` that specify how much of the morph\n\t\t * is applied. This member is `undefined` by default and only set when morph targets are\n\t\t * detected in the geometry.\n\t\t *\n\t\t * @type {Array<number>|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.morphTargetInfluences = undefined;\n\n\t\t/**\n\t\t * The number of instances of this mesh.\n\t\t * Can only be used with {@link WebGPURenderer}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.count = 1;\n\n\t\tthis.updateMorphTargets();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tif ( source.morphTargetInfluences !== undefined ) {\n\n\t\t\tthis.morphTargetInfluences = source.morphTargetInfluences.slice();\n\n\t\t}\n\n\t\tif ( source.morphTargetDictionary !== undefined ) {\n\n\t\t\tthis.morphTargetDictionary = Object.assign( {}, source.morphTargetDictionary );\n\n\t\t}\n\n\t\tthis.material = Array.isArray( source.material ) ? source.material.slice() : source.material;\n\t\tthis.geometry = source.geometry;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the values of {@link Mesh#morphTargetDictionary} and {@link Mesh#morphTargetInfluences}\n\t * to make sure existing morph targets can influence this 3D object.\n\t */\n\tupdateMorphTargets() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tconst morphAttributes = geometry.morphAttributes;\n\t\tconst keys = Object.keys( morphAttributes );\n\n\t\tif ( keys.length > 0 ) {\n\n\t\t\tconst morphAttribute = morphAttributes[ keys[ 0 ] ];\n\n\t\t\tif ( morphAttribute !== undefined ) {\n\n\t\t\t\tthis.morphTargetInfluences = [];\n\t\t\t\tthis.morphTargetDictionary = {};\n\n\t\t\t\tfor ( let m = 0, ml = morphAttribute.length; m < ml; m ++ ) {\n\n\t\t\t\t\tconst name = morphAttribute[ m ].name || String( m );\n\n\t\t\t\t\tthis.morphTargetInfluences.push( 0 );\n\t\t\t\t\tthis.morphTargetDictionary[ name ] = m;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns the local-space position of the vertex at the given index, taking into\n\t * account the current animation state of both morph targets and skinning.\n\t *\n\t * @param {number} index - The vertex index.\n\t * @param {Vector3} target - The target object that is used to store the method's result.\n\t * @return {Vector3} The vertex position in local space.\n\t */\n\tgetVertexPosition( index, target ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst position = geometry.attributes.position;\n\t\tconst morphPosition = geometry.morphAttributes.position;\n\t\tconst morphTargetsRelative = geometry.morphTargetsRelative;\n\n\t\ttarget.fromBufferAttribute( position, index );\n\n\t\tconst morphInfluences = this.morphTargetInfluences;\n\n\t\tif ( morphPosition && morphInfluences ) {\n\n\t\t\t_morphA.set( 0, 0, 0 );\n\n\t\t\tfor ( let i = 0, il = morphPosition.length; i < il; i ++ ) {\n\n\t\t\t\tconst influence = morphInfluences[ i ];\n\t\t\t\tconst morphAttribute = morphPosition[ i ];\n\n\t\t\t\tif ( influence === 0 ) continue;\n\n\t\t\t\t_tempA.fromBufferAttribute( morphAttribute, index );\n\n\t\t\t\tif ( morphTargetsRelative ) {\n\n\t\t\t\t\t_morphA.addScaledVector( _tempA, influence );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_morphA.addScaledVector( _tempA.sub( target ), influence );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\ttarget.add( _morphA );\n\n\t\t}\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Computes intersection points between a casted ray and this line.\n\t *\n\t * @param {Raycaster} raycaster - The raycaster.\n\t * @param {Array<Object>} intersects - The target array that holds the intersection points.\n\t */\n\traycast( raycaster, intersects ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst material = this.material;\n\t\tconst matrixWorld = this.matrixWorld;\n\n\t\tif ( material === undefined ) return;\n\n\t\t// test with bounding sphere in world space\n\n\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t_sphere$6.copy( geometry.boundingSphere );\n\t\t_sphere$6.applyMatrix4( matrixWorld );\n\n\t\t// check distance from ray origin to bounding sphere\n\n\t\t_ray$3.copy( raycaster.ray ).recast( raycaster.near );\n\n\t\tif ( _sphere$6.containsPoint( _ray$3.origin ) === false ) {\n\n\t\t\tif ( _ray$3.intersectSphere( _sphere$6, _sphereHitAt ) === null ) return;\n\n\t\t\tif ( _ray$3.origin.distanceToSquared( _sphereHitAt ) > ( raycaster.far - raycaster.near ) ** 2 ) return;\n\n\t\t}\n\n\t\t// convert ray to local space of mesh\n\n\t\t_inverseMatrix$3.copy( matrixWorld ).invert();\n\t\t_ray$3.copy( raycaster.ray ).applyMatrix4( _inverseMatrix$3 );\n\n\t\t// test with bounding box in local space\n\n\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\tif ( _ray$3.intersectsBox( geometry.boundingBox ) === false ) return;\n\n\t\t}\n\n\t\t// test for intersections with geometry\n\n\t\tthis._computeIntersections( raycaster, intersects, _ray$3 );\n\n\t}\n\n\t_computeIntersections( raycaster, intersects, rayLocalSpace ) {\n\n\t\tlet intersection;\n\n\t\tconst geometry = this.geometry;\n\t\tconst material = this.material;\n\n\t\tconst index = geometry.index;\n\t\tconst position = geometry.attributes.position;\n\t\tconst uv = geometry.attributes.uv;\n\t\tconst uv1 = geometry.attributes.uv1;\n\t\tconst normal = geometry.attributes.normal;\n\t\tconst groups = geometry.groups;\n\t\tconst drawRange = geometry.drawRange;\n\n\t\tif ( index !== null ) {\n\n\t\t\t// indexed buffer geometry\n\n\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\tfor ( let i = 0, il = groups.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst group = groups[ i ];\n\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\tconst start = Math.max( group.start, drawRange.start );\n\t\t\t\t\tconst end = Math.min( index.count, Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) ) );\n\n\t\t\t\t\tfor ( let j = start, jl = end; j < jl; j += 3 ) {\n\n\t\t\t\t\t\tconst a = index.getX( j );\n\t\t\t\t\t\tconst b = index.getX( j + 1 );\n\t\t\t\t\t\tconst c = index.getX( j + 2 );\n\n\t\t\t\t\t\tintersection = checkGeometryIntersection( this, groupMaterial, raycaster, rayLocalSpace, uv, uv1, normal, a, b, c );\n\n\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\tintersection.faceIndex = Math.floor( j / 3 ); // triangle number in indexed buffer semantics\n\t\t\t\t\t\t\tintersection.face.materialIndex = group.materialIndex;\n\t\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\t\tconst end = Math.min( index.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\t\tfor ( let i = start, il = end; i < il; i += 3 ) {\n\n\t\t\t\t\tconst a = index.getX( i );\n\t\t\t\t\tconst b = index.getX( i + 1 );\n\t\t\t\t\tconst c = index.getX( i + 2 );\n\n\t\t\t\t\tintersection = checkGeometryIntersection( this, material, raycaster, rayLocalSpace, uv, uv1, normal, a, b, c );\n\n\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\tintersection.faceIndex = Math.floor( i / 3 ); // triangle number in indexed buffer semantics\n\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else if ( position !== undefined ) {\n\n\t\t\t// non-indexed buffer geometry\n\n\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\tfor ( let i = 0, il = groups.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst group = groups[ i ];\n\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\tconst start = Math.max( group.start, drawRange.start );\n\t\t\t\t\tconst end = Math.min( position.count, Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) ) );\n\n\t\t\t\t\tfor ( let j = start, jl = end; j < jl; j += 3 ) {\n\n\t\t\t\t\t\tconst a = j;\n\t\t\t\t\t\tconst b = j + 1;\n\t\t\t\t\t\tconst c = j + 2;\n\n\t\t\t\t\t\tintersection = checkGeometryIntersection( this, groupMaterial, raycaster, rayLocalSpace, uv, uv1, normal, a, b, c );\n\n\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\tintersection.faceIndex = Math.floor( j / 3 ); // triangle number in non-indexed buffer semantics\n\t\t\t\t\t\t\tintersection.face.materialIndex = group.materialIndex;\n\t\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\t\tconst end = Math.min( position.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\t\tfor ( let i = start, il = end; i < il; i += 3 ) {\n\n\t\t\t\t\tconst a = i;\n\t\t\t\t\tconst b = i + 1;\n\t\t\t\t\tconst c = i + 2;\n\n\t\t\t\t\tintersection = checkGeometryIntersection( this, material, raycaster, rayLocalSpace, uv, uv1, normal, a, b, c );\n\n\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\tintersection.faceIndex = Math.floor( i / 3 ); // triangle number in non-indexed buffer semantics\n\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nfunction checkIntersection$1( object, material, raycaster, ray, pA, pB, pC, point ) {\n\n\tlet intersect;\n\n\tif ( material.side === BackSide ) {\n\n\t\tintersect = ray.intersectTriangle( pC, pB, pA, true, point );\n\n\t} else {\n\n\t\tintersect = ray.intersectTriangle( pA, pB, pC, ( material.side === FrontSide ), point );\n\n\t}\n\n\tif ( intersect === null ) return null;\n\n\t_intersectionPointWorld.copy( point );\n\t_intersectionPointWorld.applyMatrix4( object.matrixWorld );\n\n\tconst distance = raycaster.ray.origin.distanceTo( _intersectionPointWorld );\n\n\tif ( distance < raycaster.near || distance > raycaster.far ) return null;\n\n\treturn {\n\t\tdistance: distance,\n\t\tpoint: _intersectionPointWorld.clone(),\n\t\tobject: object\n\t};\n\n}\n\nfunction checkGeometryIntersection( object, material, raycaster, ray, uv, uv1, normal, a, b, c ) {\n\n\tobject.getVertexPosition( a, _vA$1 );\n\tobject.getVertexPosition( b, _vB$1 );\n\tobject.getVertexPosition( c, _vC$1 );\n\n\tconst intersection = checkIntersection$1( object, material, raycaster, ray, _vA$1, _vB$1, _vC$1, _intersectionPoint );\n\n\tif ( intersection ) {\n\n\t\tconst barycoord = new Vector3();\n\t\tTriangle.getBarycoord( _intersectionPoint, _vA$1, _vB$1, _vC$1, barycoord );\n\n\t\tif ( uv ) {\n\n\t\t\tintersection.uv = Triangle.getInterpolatedAttribute( uv, a, b, c, barycoord, new Vector2() );\n\n\t\t}\n\n\t\tif ( uv1 ) {\n\n\t\t\tintersection.uv1 = Triangle.getInterpolatedAttribute( uv1, a, b, c, barycoord, new Vector2() );\n\n\t\t}\n\n\t\tif ( normal ) {\n\n\t\t\tintersection.normal = Triangle.getInterpolatedAttribute( normal, a, b, c, barycoord, new Vector3() );\n\n\t\t\tif ( intersection.normal.dot( ray.direction ) > 0 ) {\n\n\t\t\t\tintersection.normal.multiplyScalar( -1 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst face = {\n\t\t\ta: a,\n\t\t\tb: b,\n\t\t\tc: c,\n\t\t\tnormal: new Vector3(),\n\t\t\tmaterialIndex: 0\n\t\t};\n\n\t\tTriangle.getNormal( _vA$1, _vB$1, _vC$1, face.normal );\n\n\t\tintersection.face = face;\n\t\tintersection.barycoord = barycoord;\n\n\t}\n\n\treturn intersection;\n\n}\n\n/**\n * A geometry class for a rectangular cuboid with a given width, height, and depth.\n * On creation, the cuboid is centred on the origin, with each edge parallel to one\n * of the axes.\n *\n * ```js\n * const geometry = new THREE.BoxGeometry( 1, 1, 1 );\n * const material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );\n * const cube = new THREE.Mesh( geometry, material );\n * scene.add( cube );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#BoxGeometry\n */\nclass BoxGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new box geometry.\n\t *\n\t * @param {number} [width=1] - The width. That is, the length of the edges parallel to the X axis.\n\t * @param {number} [height=1] - The height. That is, the length of the edges parallel to the Y axis.\n\t * @param {number} [depth=1] - The depth. That is, the length of the edges parallel to the Z axis.\n\t * @param {number} [widthSegments=1] - Number of segmented rectangular faces along the width of the sides.\n\t * @param {number} [heightSegments=1] - Number of segmented rectangular faces along the height of the sides.\n\t * @param {number} [depthSegments=1] - Number of segmented rectangular faces along the depth of the sides.\n\t */\n\tconstructor( width = 1, height = 1, depth = 1, widthSegments = 1, heightSegments = 1, depthSegments = 1 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'BoxGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\tdepth: depth,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\tdepthSegments: depthSegments\n\t\t};\n\n\t\tconst scope = this;\n\n\t\t// segments\n\n\t\twidthSegments = Math.floor( widthSegments );\n\t\theightSegments = Math.floor( heightSegments );\n\t\tdepthSegments = Math.floor( depthSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tlet numberOfVertices = 0;\n\t\tlet groupStart = 0;\n\n\t\t// build each side of the box geometry\n\n\t\tbuildPlane( 'z', 'y', 'x', -1, -1, depth, height, width, depthSegments, heightSegments, 0 ); // px\n\t\tbuildPlane( 'z', 'y', 'x', 1, -1, depth, height, - width, depthSegments, heightSegments, 1 ); // nx\n\t\tbuildPlane( 'x', 'z', 'y', 1, 1, width, depth, height, widthSegments, depthSegments, 2 ); // py\n\t\tbuildPlane( 'x', 'z', 'y', 1, -1, width, depth, - height, widthSegments, depthSegments, 3 ); // ny\n\t\tbuildPlane( 'x', 'y', 'z', 1, -1, width, height, depth, widthSegments, heightSegments, 4 ); // pz\n\t\tbuildPlane( 'x', 'y', 'z', -1, -1, width, height, - depth, widthSegments, heightSegments, 5 ); // nz\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\tfunction buildPlane( u, v, w, udir, vdir, width, height, depth, gridX, gridY, materialIndex ) {\n\n\t\t\tconst segmentWidth = width / gridX;\n\t\t\tconst segmentHeight = height / gridY;\n\n\t\t\tconst widthHalf = width / 2;\n\t\t\tconst heightHalf = height / 2;\n\t\t\tconst depthHalf = depth / 2;\n\n\t\t\tconst gridX1 = gridX + 1;\n\t\t\tconst gridY1 = gridY + 1;\n\n\t\t\tlet vertexCounter = 0;\n\t\t\tlet groupCount = 0;\n\n\t\t\tconst vector = new Vector3();\n\n\t\t\t// generate vertices, normals and uvs\n\n\t\t\tfor ( let iy = 0; iy < gridY1; iy ++ ) {\n\n\t\t\t\tconst y = iy * segmentHeight - heightHalf;\n\n\t\t\t\tfor ( let ix = 0; ix < gridX1; ix ++ ) {\n\n\t\t\t\t\tconst x = ix * segmentWidth - widthHalf;\n\n\t\t\t\t\t// set values to correct vector component\n\n\t\t\t\t\tvector[ u ] = x * udir;\n\t\t\t\t\tvector[ v ] = y * vdir;\n\t\t\t\t\tvector[ w ] = depthHalf;\n\n\t\t\t\t\t// now apply vector to vertex buffer\n\n\t\t\t\t\tvertices.push( vector.x, vector.y, vector.z );\n\n\t\t\t\t\t// set values to correct vector component\n\n\t\t\t\t\tvector[ u ] = 0;\n\t\t\t\t\tvector[ v ] = 0;\n\t\t\t\t\tvector[ w ] = depth > 0 ? 1 : -1;\n\n\t\t\t\t\t// now apply vector to normal buffer\n\n\t\t\t\t\tnormals.push( vector.x, vector.y, vector.z );\n\n\t\t\t\t\t// uvs\n\n\t\t\t\t\tuvs.push( ix / gridX );\n\t\t\t\t\tuvs.push( 1 - ( iy / gridY ) );\n\n\t\t\t\t\t// counters\n\n\t\t\t\t\tvertexCounter += 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// indices\n\n\t\t\t// 1. you need three indices to draw a single face\n\t\t\t// 2. a single segment consists of two faces\n\t\t\t// 3. so we need to generate six (2*3) indices per segment\n\n\t\t\tfor ( let iy = 0; iy < gridY; iy ++ ) {\n\n\t\t\t\tfor ( let ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\t\t\tconst a = numberOfVertices + ix + gridX1 * iy;\n\t\t\t\t\tconst b = numberOfVertices + ix + gridX1 * ( iy + 1 );\n\t\t\t\t\tconst c = numberOfVertices + ( ix + 1 ) + gridX1 * ( iy + 1 );\n\t\t\t\t\tconst d = numberOfVertices + ( ix + 1 ) + gridX1 * iy;\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tindices.push( a, b, d );\n\t\t\t\t\tindices.push( b, c, d );\n\n\t\t\t\t\t// increase counter\n\n\t\t\t\t\tgroupCount += 6;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup( groupStart, groupCount, materialIndex );\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\n\t\t\t// update total number of vertices\n\n\t\t\tnumberOfVertices += vertexCounter;\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {BoxGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new BoxGeometry( data.width, data.height, data.depth, data.widthSegments, data.heightSegments, data.depthSegments );\n\n\t}\n\n}\n\n/**\n * Provides utility functions for managing uniforms.\n *\n * @module UniformsUtils\n */\n\n/**\n * Clones the given uniform definitions by performing a deep-copy. That means\n * if the value of a uniform refers to an object like a Vector3 or Texture,\n * the cloned uniform will refer to a new object reference.\n *\n * @param {Object} src - An object representing uniform definitions.\n * @return {Object} The cloned uniforms.\n */\nfunction cloneUniforms( src ) {\n\n\tconst dst = {};\n\n\tfor ( const u in src ) {\n\n\t\tdst[ u ] = {};\n\n\t\tfor ( const p in src[ u ] ) {\n\n\t\t\tconst property = src[ u ][ p ];\n\n\t\t\tif ( property && ( property.isColor ||\n\t\t\t\tproperty.isMatrix3 || property.isMatrix4 ||\n\t\t\t\tproperty.isVector2 || property.isVector3 || property.isVector4 ||\n\t\t\t\tproperty.isTexture || property.isQuaternion ) ) {\n\n\t\t\t\tif ( property.isRenderTargetTexture ) {\n\n\t\t\t\t\twarn( 'UniformsUtils: Textures of render targets cannot be cloned via cloneUniforms() or mergeUniforms().' );\n\t\t\t\t\tdst[ u ][ p ] = null;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tdst[ u ][ p ] = property.clone();\n\n\t\t\t\t}\n\n\t\t\t} else if ( Array.isArray( property ) ) {\n\n\t\t\t\tdst[ u ][ p ] = property.slice();\n\n\t\t\t} else {\n\n\t\t\t\tdst[ u ][ p ] = property;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn dst;\n\n}\n\n/**\n * Merges the given uniform definitions into a single object. Since the\n * method internally uses cloneUniforms(), it performs a deep-copy when\n * producing the merged uniform definitions.\n *\n * @param {Array} uniforms - An array of objects containing uniform definitions.\n * @return {Object} The merged uniforms.\n */\nfunction mergeUniforms( uniforms ) {\n\n\tconst merged = {};\n\n\tfor ( let u = 0; u < uniforms.length; u ++ ) {\n\n\t\tconst tmp = cloneUniforms( uniforms[ u ] );\n\n\t\tfor ( const p in tmp ) {\n\n\t\t\tmerged[ p ] = tmp[ p ];\n\n\t\t}\n\n\t}\n\n\treturn merged;\n\n}\n\nfunction cloneUniformsGroups( src ) {\n\n\tconst dst = [];\n\n\tfor ( let u = 0; u < src.length; u ++ ) {\n\n\t\tdst.push( src[ u ].clone() );\n\n\t}\n\n\treturn dst;\n\n}\n\nfunction getUnlitUniformColorSpace( renderer ) {\n\n\tconst currentRenderTarget = renderer.getRenderTarget();\n\n\tif ( currentRenderTarget === null ) {\n\n\t\t// https://github.com/mrdoob/three.js/pull/23937#issuecomment-1111067398\n\t\treturn renderer.outputColorSpace;\n\n\t}\n\n\t// https://github.com/mrdoob/three.js/issues/27868\n\tif ( currentRenderTarget.isXRRenderTarget === true ) {\n\n\t\treturn currentRenderTarget.texture.colorSpace;\n\n\t}\n\n\treturn ColorManagement.workingColorSpace;\n\n}\n\n// Legacy\n\nconst UniformsUtils = { clone: cloneUniforms, merge: mergeUniforms };\n\nvar default_vertex = \"void main() {\\n\\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\\n}\";\n\nvar default_fragment = \"void main() {\\n\\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\\n}\";\n\n/**\n * A material rendered with custom shaders. A shader is a small program written in GLSL.\n * that runs on the GPU. You may want to use a custom shader if you need to implement an\n * effect not included with any of the built-in materials.\n *\n * There are the following notes to bear in mind when using a `ShaderMaterial`:\n *\n * - `ShaderMaterial` can only be used with {@link WebGLRenderer}.\n * - Built in attributes and uniforms are passed to the shaders along with your code. If\n * you don't want that, use {@link RawShaderMaterial} instead.\n * - You can use the directive `#pragma unroll_loop_start` and `#pragma unroll_loop_end`\n * in order to unroll a `for` loop in GLSL by the shader preprocessor. The directive has\n * to be placed right above the loop. The loop formatting has to correspond to a defined standard.\n *   - The loop has to be [normalized](https://en.wikipedia.org/wiki/Normalized_loop).\n *   - The loop variable has to be *i*.\n *   - The value `UNROLLED_LOOP_INDEX` will be replaced with the explicitly\n * value of *i* for the given iteration and can be used in preprocessor\n * statements.\n *\n * ```js\n * const material = new THREE.ShaderMaterial( {\n * \tuniforms: {\n * \t\ttime: { value: 1.0 },\n * \t\tresolution: { value: new THREE.Vector2() }\n * \t},\n * \tvertexShader: document.getElementById( 'vertexShader' ).textContent,\n * \tfragmentShader: document.getElementById( 'fragmentShader' ).textContent\n * } );\n * ```\n *\n * @augments Material\n */\nclass ShaderMaterial extends Material {\n\n\t/**\n\t * Constructs a new shader material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isShaderMaterial = true;\n\n\t\tthis.type = 'ShaderMaterial';\n\n\t\t/**\n\t\t * Defines custom constants using `#define` directives within the GLSL code\n\t\t * for both the vertex shader and the fragment shader; each key/value pair\n\t\t * yields another directive.\n\t\t * ```js\n\t\t * defines: {\n\t\t * \tFOO: 15,\n\t\t * \tBAR: true\n\t\t * }\n\t\t * ```\n\t\t * Yields the lines:\n\t\t * ```\n\t\t * #define FOO 15\n\t\t * #define BAR true\n\t\t * ```\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.defines = {};\n\n\t\t/**\n\t\t * An object of the form:\n\t\t * ```js\n\t\t * {\n\t\t * \t\"uniform1\": { value: 1.0 },\n\t\t * \t\"uniform2\": { value: 2 }\n\t\t * }\n\t\t * ```\n\t\t * specifying the uniforms to be passed to the shader code; keys are uniform\n\t\t * names, values are definitions of the form\n\t\t * ```\n\t\t * {\n\t\t * \tvalue: 1.0\n\t\t * }\n\t\t * ```\n\t\t * where `value` is the value of the uniform. Names must match the name of\n\t\t * the uniform, as defined in the GLSL code. Note that uniforms are refreshed\n\t\t * on every frame, so updating the value of the uniform will immediately\n\t\t * update the value available to the GLSL code.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.uniforms = {};\n\n\t\t/**\n\t\t * An array holding uniforms groups for configuring UBOs.\n\t\t *\n\t\t * @type {Array<UniformsGroup>}\n\t\t */\n\t\tthis.uniformsGroups = [];\n\n\t\t/**\n\t\t * Vertex shader GLSL code. This is the actual code for the shader.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.vertexShader = default_vertex;\n\n\t\t/**\n\t\t * Fragment shader GLSL code. This is the actual code for the shader.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.fragmentShader = default_fragment;\n\n\t\t/**\n\t\t * Controls line thickness or lines.\n\t\t *\n\t\t * WebGL and WebGPU ignore this setting and always render line primitives with a\n\t\t * width of one pixel.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.linewidth = 1;\n\n\t\t/**\n\t\t * Renders the geometry as a wireframe.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.wireframe = false;\n\n\t\t/**\n\t\t * Controls the thickness of the wireframe.\n\t\t *\n\t\t * WebGL and WebGPU ignore this property and always render\n\t\t * 1 pixel wide lines.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.wireframeLinewidth = 1;\n\n\t\t/**\n\t\t * Define whether the material color is affected by global fog settings; `true`\n\t\t * to pass fog uniforms to the shader.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.fog = false;\n\n\t\t/**\n\t\t * Defines whether this material uses lighting; `true` to pass uniform data\n\t\t * related to lighting to this shader.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.lights = false;\n\n\t\t/**\n\t\t * Defines whether this material supports clipping; `true` to let the renderer\n\t\t * pass the clippingPlanes uniform.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.clipping = false;\n\n\t\t/**\n\t\t * Overwritten and set to `true` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.forceSinglePass = true;\n\n\t\t/**\n\t\t * This object allows to enable certain WebGL 2 extensions.\n\t\t *\n\t\t * - clipCullDistance: set to `true` to use vertex shader clipping\n\t\t * - multiDraw: set to `true` to use vertex shader multi_draw / enable gl_DrawID\n\t\t *\n\t\t * @type {{clipCullDistance:false,multiDraw:false}}\n\t\t */\n\t\tthis.extensions = {\n\t\t\tclipCullDistance: false, // set to use vertex shader clipping\n\t\t\tmultiDraw: false // set to use vertex shader multi_draw / enable gl_DrawID\n\t\t};\n\n\t\t/**\n\t\t * When the rendered geometry doesn't include these attributes but the\n\t\t * material does, these default values will be passed to the shaders. This\n\t\t * avoids errors when buffer data is missing.\n\t\t *\n\t\t * - color: [ 1, 1, 1 ]\n\t\t * - uv: [ 0, 0 ]\n\t\t * - uv1: [ 0, 0 ]\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.defaultAttributeValues = {\n\t\t\t'color': [ 1, 1, 1 ],\n\t\t\t'uv': [ 0, 0 ],\n\t\t\t'uv1': [ 0, 0 ]\n\t\t};\n\n\t\t/**\n\t\t * If set, this calls [gl.bindAttribLocation](https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/bindAttribLocation)\n\t\t * to bind a generic vertex index to an attribute variable.\n\t\t *\n\t\t * @type {string|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.index0AttributeName = undefined;\n\n\t\t/**\n\t\t * Can be used to force a uniform update while changing uniforms in\n\t\t * {@link Object3D#onBeforeRender}.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.uniformsNeedUpdate = false;\n\n\t\t/**\n\t\t * Defines the GLSL version of custom shader code.\n\t\t *\n\t\t * @type {?(GLSL1|GLSL3)}\n\t\t * @default null\n\t\t */\n\t\tthis.glslVersion = null;\n\n\t\tif ( parameters !== undefined ) {\n\n\t\t\tthis.setValues( parameters );\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.fragmentShader = source.fragmentShader;\n\t\tthis.vertexShader = source.vertexShader;\n\n\t\tthis.uniforms = cloneUniforms( source.uniforms );\n\t\tthis.uniformsGroups = cloneUniformsGroups( source.uniformsGroups );\n\n\t\tthis.defines = Object.assign( {}, source.defines );\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\tthis.fog = source.fog;\n\t\tthis.lights = source.lights;\n\t\tthis.clipping = source.clipping;\n\n\t\tthis.extensions = Object.assign( {}, source.extensions );\n\n\t\tthis.glslVersion = source.glslVersion;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.glslVersion = this.glslVersion;\n\t\tdata.uniforms = {};\n\n\t\tfor ( const name in this.uniforms ) {\n\n\t\t\tconst uniform = this.uniforms[ name ];\n\t\t\tconst value = uniform.value;\n\n\t\t\tif ( value && value.isTexture ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 't',\n\t\t\t\t\tvalue: value.toJSON( meta ).uuid\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isColor ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'c',\n\t\t\t\t\tvalue: value.getHex()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isVector2 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'v2',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isVector3 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'v3',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isVector4 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'v4',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isMatrix3 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'm3',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isMatrix4 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'm4',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\tvalue: value\n\t\t\t\t};\n\n\t\t\t\t// note: the array variants v2v, v3v, v4v, m4v and tv are not supported so far\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( Object.keys( this.defines ).length > 0 ) data.defines = this.defines;\n\n\t\tdata.vertexShader = this.vertexShader;\n\t\tdata.fragmentShader = this.fragmentShader;\n\n\t\tdata.lights = this.lights;\n\t\tdata.clipping = this.clipping;\n\n\t\tconst extensions = {};\n\n\t\tfor ( const key in this.extensions ) {\n\n\t\t\tif ( this.extensions[ key ] === true ) extensions[ key ] = true;\n\n\t\t}\n\n\t\tif ( Object.keys( extensions ).length > 0 ) data.extensions = extensions;\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * Abstract base class for cameras. This class should always be inherited\n * when you build a new camera.\n *\n * @abstract\n * @augments Object3D\n */\nclass Camera extends Object3D {\n\n\t/**\n\t * Constructs a new camera.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCamera = true;\n\n\t\tthis.type = 'Camera';\n\n\t\t/**\n\t\t * The inverse of the camera's world matrix.\n\t\t *\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.matrixWorldInverse = new Matrix4();\n\n\t\t/**\n\t\t * The camera's projection matrix.\n\t\t *\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.projectionMatrix = new Matrix4();\n\n\t\t/**\n\t\t * The inverse of the camera's projection matrix.\n\t\t *\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.projectionMatrixInverse = new Matrix4();\n\n\t\t/**\n\t\t * The coordinate system in which the camera is used.\n\t\t *\n\t\t * @type {(WebGLCoordinateSystem|WebGPUCoordinateSystem)}\n\t\t */\n\t\tthis.coordinateSystem = WebGLCoordinateSystem;\n\n\t\tthis._reversedDepth = false;\n\n\t}\n\n\t/**\n\t * The flag that indicates whether the camera uses a reversed depth buffer.\n\t *\n\t * @type {boolean}\n\t * @default false\n\t */\n\tget reversedDepth() {\n\n\t\treturn this._reversedDepth;\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.matrixWorldInverse.copy( source.matrixWorldInverse );\n\n\t\tthis.projectionMatrix.copy( source.projectionMatrix );\n\t\tthis.projectionMatrixInverse.copy( source.projectionMatrixInverse );\n\n\t\tthis.coordinateSystem = source.coordinateSystem;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a vector representing the (\"look\") direction of the 3D object in world space.\n\t *\n\t * This method is overwritten since cameras have a different forward vector compared to other\n\t * 3D objects. A camera looks down its local, negative z-axis by default.\n\t *\n\t * @param {Vector3} target - The target vector the result is stored to.\n\t * @return {Vector3} The 3D object's direction in world space.\n\t */\n\tgetWorldDirection( target ) {\n\n\t\treturn super.getWorldDirection( target ).negate();\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t\tthis.matrixWorldInverse.copy( this.matrixWorld ).invert();\n\n\t}\n\n\tupdateWorldMatrix( updateParents, updateChildren ) {\n\n\t\tsuper.updateWorldMatrix( updateParents, updateChildren );\n\n\t\tthis.matrixWorldInverse.copy( this.matrixWorld ).invert();\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nconst _v3$1 = /*@__PURE__*/ new Vector3();\nconst _minTarget = /*@__PURE__*/ new Vector2();\nconst _maxTarget = /*@__PURE__*/ new Vector2();\n\n/**\n * Camera that uses [perspective projection](https://en.wikipedia.org/wiki/Perspective_(graphical)).\n *\n * This projection mode is designed to mimic the way the human eye sees. It\n * is the most common projection mode used for rendering a 3D scene.\n *\n * ```js\n * const camera = new THREE.PerspectiveCamera( 45, width / height, 1, 1000 );\n * scene.add( camera );\n * ```\n *\n * @augments Camera\n */\nclass PerspectiveCamera extends Camera {\n\n\t/**\n\t * Constructs a new perspective camera.\n\t *\n\t * @param {number} [fov=50] - The vertical field of view.\n\t * @param {number} [aspect=1] - The aspect ratio.\n\t * @param {number} [near=0.1] - The camera's near plane.\n\t * @param {number} [far=2000] - The camera's far plane.\n\t */\n\tconstructor( fov = 50, aspect = 1, near = 0.1, far = 2000 ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isPerspectiveCamera = true;\n\n\t\tthis.type = 'PerspectiveCamera';\n\n\t\t/**\n\t\t * The vertical field of view, from bottom to top of view,\n\t\t * in degrees.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 50\n\t\t */\n\t\tthis.fov = fov;\n\n\t\t/**\n\t\t * The zoom factor of the camera.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.zoom = 1;\n\n\t\t/**\n\t\t * The camera's near plane. The valid range is greater than `0`\n\t\t * and less than the current value of {@link PerspectiveCamera#far}.\n\t\t *\n\t\t * Note that, unlike for the {@link OrthographicCamera}, `0` is <em>not</em> a\n\t\t * valid value for a perspective camera's near plane.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.1\n\t\t */\n\t\tthis.near = near;\n\n\t\t/**\n\t\t * The camera's far plane. Must be greater than the\n\t\t * current value of {@link PerspectiveCamera#near}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 2000\n\t\t */\n\t\tthis.far = far;\n\n\t\t/**\n\t\t * Object distance used for stereoscopy and depth-of-field effects. This\n\t\t * parameter does not influence the projection matrix unless a\n\t\t * {@link StereoCamera} is being used.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 10\n\t\t */\n\t\tthis.focus = 10;\n\n\t\t/**\n\t\t * The aspect ratio, usually the canvas width / canvas height.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.aspect = aspect;\n\n\t\t/**\n\t\t * Represents the frustum window specification. This property should not be edited\n\t\t * directly but via {@link PerspectiveCamera#setViewOffset} and {@link PerspectiveCamera#clearViewOffset}.\n\t\t *\n\t\t * @type {?Object}\n\t\t * @default null\n\t\t */\n\t\tthis.view = null;\n\n\t\t/**\n\t\t * Film size used for the larger axis. Default is `35` (millimeters). This\n\t\t * parameter does not influence the projection matrix unless {@link PerspectiveCamera#filmOffset}\n\t\t * is set to a nonzero value.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 35\n\t\t */\n\t\tthis.filmGauge = 35;\n\n\t\t/**\n\t\t * Horizontal off-center offset in the same unit as {@link PerspectiveCamera#filmGauge}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.filmOffset = 0;\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.fov = source.fov;\n\t\tthis.zoom = source.zoom;\n\n\t\tthis.near = source.near;\n\t\tthis.far = source.far;\n\t\tthis.focus = source.focus;\n\n\t\tthis.aspect = source.aspect;\n\t\tthis.view = source.view === null ? null : Object.assign( {}, source.view );\n\n\t\tthis.filmGauge = source.filmGauge;\n\t\tthis.filmOffset = source.filmOffset;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the FOV by focal length in respect to the current {@link PerspectiveCamera#filmGauge}.\n\t *\n\t * The default film gauge is 35, so that the focal length can be specified for\n\t * a 35mm (full frame) camera.\n\t *\n\t * @param {number} focalLength - Values for focal length and film gauge must have the same unit.\n\t */\n\tsetFocalLength( focalLength ) {\n\n\t\t/** see {@link http://www.bobatkins.com/photography/technical/field_of_view.html} */\n\t\tconst vExtentSlope = 0.5 * this.getFilmHeight() / focalLength;\n\n\t\tthis.fov = RAD2DEG * 2 * Math.atan( vExtentSlope );\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\t/**\n\t * Returns the focal length from the current {@link PerspectiveCamera#fov} and\n\t * {@link PerspectiveCamera#filmGauge}.\n\t *\n\t * @return {number} The computed focal length.\n\t */\n\tgetFocalLength() {\n\n\t\tconst vExtentSlope = Math.tan( DEG2RAD * 0.5 * this.fov );\n\n\t\treturn 0.5 * this.getFilmHeight() / vExtentSlope;\n\n\t}\n\n\t/**\n\t * Returns the current vertical field of view angle in degrees considering {@link PerspectiveCamera#zoom}.\n\t *\n\t * @return {number} The effective FOV.\n\t */\n\tgetEffectiveFOV() {\n\n\t\treturn RAD2DEG * 2 * Math.atan(\n\t\t\tMath.tan( DEG2RAD * 0.5 * this.fov ) / this.zoom );\n\n\t}\n\n\t/**\n\t * Returns the width of the image on the film. If {@link PerspectiveCamera#aspect} is greater than or\n\t * equal to one (landscape format), the result equals {@link PerspectiveCamera#filmGauge}.\n\t *\n\t * @return {number} The film width.\n\t */\n\tgetFilmWidth() {\n\n\t\t// film not completely covered in portrait format (aspect < 1)\n\t\treturn this.filmGauge * Math.min( this.aspect, 1 );\n\n\t}\n\n\t/**\n\t * Returns the height of the image on the film. If {@link PerspectiveCamera#aspect} is greater than or\n\t * equal to one (landscape format), the result equals {@link PerspectiveCamera#filmGauge}.\n\t *\n\t * @return {number} The film width.\n\t */\n\tgetFilmHeight() {\n\n\t\t// film not completely covered in landscape format (aspect > 1)\n\t\treturn this.filmGauge / Math.max( this.aspect, 1 );\n\n\t}\n\n\t/**\n\t * Computes the 2D bounds of the camera's viewable rectangle at a given distance along the viewing direction.\n\t * Sets `minTarget` and `maxTarget` to the coordinates of the lower-left and upper-right corners of the view rectangle.\n\t *\n\t * @param {number} distance - The viewing distance.\n\t * @param {Vector2} minTarget - The lower-left corner of the view rectangle is written into this vector.\n\t * @param {Vector2} maxTarget - The upper-right corner of the view rectangle is written into this vector.\n\t */\n\tgetViewBounds( distance, minTarget, maxTarget ) {\n\n\t\t_v3$1.set( -1, -1, 0.5 ).applyMatrix4( this.projectionMatrixInverse );\n\n\t\tminTarget.set( _v3$1.x, _v3$1.y ).multiplyScalar( - distance / _v3$1.z );\n\n\t\t_v3$1.set( 1, 1, 0.5 ).applyMatrix4( this.projectionMatrixInverse );\n\n\t\tmaxTarget.set( _v3$1.x, _v3$1.y ).multiplyScalar( - distance / _v3$1.z );\n\n\t}\n\n\t/**\n\t * Computes the width and height of the camera's viewable rectangle at a given distance along the viewing direction.\n\t *\n\t * @param {number} distance - The viewing distance.\n\t * @param {Vector2} target - The target vector that is used to store result where x is width and y is height.\n\t * @returns {Vector2} The view size.\n\t */\n\tgetViewSize( distance, target ) {\n\n\t\tthis.getViewBounds( distance, _minTarget, _maxTarget );\n\n\t\treturn target.subVectors( _maxTarget, _minTarget );\n\n\t}\n\n\t/**\n\t * Sets an offset in a larger frustum. This is useful for multi-window or\n\t * multi-monitor/multi-machine setups.\n\t *\n\t * For example, if you have 3x2 monitors and each monitor is 1920x1080 and\n\t * the monitors are in grid like this\n\t *```\n\t *   +---+---+---+\n\t *   | A | B | C |\n\t *   +---+---+---+\n\t *   | D | E | F |\n\t *   +---+---+---+\n\t *```\n\t * then for each monitor you would call it like this:\n\t *```js\n\t * const w = 1920;\n\t * const h = 1080;\n\t * const fullWidth = w * 3;\n\t * const fullHeight = h * 2;\n\t *\n\t * // --A--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 0, h * 0, w, h );\n\t * // --B--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 1, h * 0, w, h );\n\t * // --C--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 2, h * 0, w, h );\n\t * // --D--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 0, h * 1, w, h );\n\t * // --E--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 1, h * 1, w, h );\n\t * // --F--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 2, h * 1, w, h );\n\t * ```\n\t *\n\t * Note there is no reason monitors have to be the same size or in a grid.\n\t *\n\t * @param {number} fullWidth - The full width of multiview setup.\n\t * @param {number} fullHeight - The full height of multiview setup.\n\t * @param {number} x - The horizontal offset of the subcamera.\n\t * @param {number} y - The vertical offset of the subcamera.\n\t * @param {number} width - The width of subcamera.\n\t * @param {number} height - The height of subcamera.\n\t */\n\tsetViewOffset( fullWidth, fullHeight, x, y, width, height ) {\n\n\t\tthis.aspect = fullWidth / fullHeight;\n\n\t\tif ( this.view === null ) {\n\n\t\t\tthis.view = {\n\t\t\t\tenabled: true,\n\t\t\t\tfullWidth: 1,\n\t\t\t\tfullHeight: 1,\n\t\t\t\toffsetX: 0,\n\t\t\t\toffsetY: 0,\n\t\t\t\twidth: 1,\n\t\t\t\theight: 1\n\t\t\t};\n\n\t\t}\n\n\t\tthis.view.enabled = true;\n\t\tthis.view.fullWidth = fullWidth;\n\t\tthis.view.fullHeight = fullHeight;\n\t\tthis.view.offsetX = x;\n\t\tthis.view.offsetY = y;\n\t\tthis.view.width = width;\n\t\tthis.view.height = height;\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\t/**\n\t * Removes the view offset from the projection matrix.\n\t */\n\tclearViewOffset() {\n\n\t\tif ( this.view !== null ) {\n\n\t\t\tthis.view.enabled = false;\n\n\t\t}\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\t/**\n\t * Updates the camera's projection matrix. Must be called after any change of\n\t * camera properties.\n\t */\n\tupdateProjectionMatrix() {\n\n\t\tconst near = this.near;\n\t\tlet top = near * Math.tan( DEG2RAD * 0.5 * this.fov ) / this.zoom;\n\t\tlet height = 2 * top;\n\t\tlet width = this.aspect * height;\n\t\tlet left = -0.5 * width;\n\t\tconst view = this.view;\n\n\t\tif ( this.view !== null && this.view.enabled ) {\n\n\t\t\tconst fullWidth = view.fullWidth,\n\t\t\t\tfullHeight = view.fullHeight;\n\n\t\t\tleft += view.offsetX * width / fullWidth;\n\t\t\ttop -= view.offsetY * height / fullHeight;\n\t\t\twidth *= view.width / fullWidth;\n\t\t\theight *= view.height / fullHeight;\n\n\t\t}\n\n\t\tconst skew = this.filmOffset;\n\t\tif ( skew !== 0 ) left += near * skew / this.getFilmWidth();\n\n\t\tthis.projectionMatrix.makePerspective( left, left + width, top, top - height, near, this.far, this.coordinateSystem, this.reversedDepth );\n\n\t\tthis.projectionMatrixInverse.copy( this.projectionMatrix ).invert();\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.fov = this.fov;\n\t\tdata.object.zoom = this.zoom;\n\n\t\tdata.object.near = this.near;\n\t\tdata.object.far = this.far;\n\t\tdata.object.focus = this.focus;\n\n\t\tdata.object.aspect = this.aspect;\n\n\t\tif ( this.view !== null ) data.object.view = Object.assign( {}, this.view );\n\n\t\tdata.object.filmGauge = this.filmGauge;\n\t\tdata.object.filmOffset = this.filmOffset;\n\n\t\treturn data;\n\n\t}\n\n}\n\nconst fov = -90; // negative fov is not an error\nconst aspect = 1;\n\n/**\n * A special type of camera that is positioned in 3D space to render its surroundings into a\n * cube render target. The render target can then be used as an environment map for rendering\n * realtime reflections in your scene.\n *\n * ```js\n * // Create cube render target\n * const cubeRenderTarget = new THREE.WebGLCubeRenderTarget( 256, { generateMipmaps: true, minFilter: THREE.LinearMipmapLinearFilter } );\n *\n * // Create cube camera\n * const cubeCamera = new THREE.CubeCamera( 1, 100000, cubeRenderTarget );\n * scene.add( cubeCamera );\n *\n * // Create car\n * const chromeMaterial = new THREE.MeshLambertMaterial( { color: 0xffffff, envMap: cubeRenderTarget.texture } );\n * const car = new THREE.Mesh( carGeometry, chromeMaterial );\n * scene.add( car );\n *\n * // Update the render target cube\n * car.visible = false;\n * cubeCamera.position.copy( car.position );\n * cubeCamera.update( renderer, scene );\n *\n * // Render the scene\n * car.visible = true;\n * renderer.render( scene, camera );\n * ```\n *\n * @augments Object3D\n */\nclass CubeCamera extends Object3D {\n\n\t/**\n\t * Constructs a new cube camera.\n\t *\n\t * @param {number} near - The camera's near plane.\n\t * @param {number} far - The camera's far plane.\n\t * @param {WebGLCubeRenderTarget} renderTarget - The cube render target.\n\t */\n\tconstructor( near, far, renderTarget ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'CubeCamera';\n\n\t\t/**\n\t\t * A reference to the cube render target.\n\t\t *\n\t\t * @type {WebGLCubeRenderTarget}\n\t\t */\n\t\tthis.renderTarget = renderTarget;\n\n\t\t/**\n\t\t * The current active coordinate system.\n\t\t *\n\t\t * @type {?(WebGLCoordinateSystem|WebGPUCoordinateSystem)}\n\t\t * @default null\n\t\t */\n\t\tthis.coordinateSystem = null;\n\n\t\t/**\n\t\t * The current active mipmap level\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.activeMipmapLevel = 0;\n\n\t\tconst cameraPX = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPX.layers = this.layers;\n\t\tthis.add( cameraPX );\n\n\t\tconst cameraNX = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNX.layers = this.layers;\n\t\tthis.add( cameraNX );\n\n\t\tconst cameraPY = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPY.layers = this.layers;\n\t\tthis.add( cameraPY );\n\n\t\tconst cameraNY = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNY.layers = this.layers;\n\t\tthis.add( cameraNY );\n\n\t\tconst cameraPZ = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPZ.layers = this.layers;\n\t\tthis.add( cameraPZ );\n\n\t\tconst cameraNZ = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNZ.layers = this.layers;\n\t\tthis.add( cameraNZ );\n\n\t}\n\n\t/**\n\t * Must be called when the coordinate system of the cube camera is changed.\n\t */\n\tupdateCoordinateSystem() {\n\n\t\tconst coordinateSystem = this.coordinateSystem;\n\n\t\tconst cameras = this.children.concat();\n\n\t\tconst [ cameraPX, cameraNX, cameraPY, cameraNY, cameraPZ, cameraNZ ] = cameras;\n\n\t\tfor ( const camera of cameras ) this.remove( camera );\n\n\t\tif ( coordinateSystem === WebGLCoordinateSystem ) {\n\n\t\t\tcameraPX.up.set( 0, 1, 0 );\n\t\t\tcameraPX.lookAt( 1, 0, 0 );\n\n\t\t\tcameraNX.up.set( 0, 1, 0 );\n\t\t\tcameraNX.lookAt( -1, 0, 0 );\n\n\t\t\tcameraPY.up.set( 0, 0, -1 );\n\t\t\tcameraPY.lookAt( 0, 1, 0 );\n\n\t\t\tcameraNY.up.set( 0, 0, 1 );\n\t\t\tcameraNY.lookAt( 0, -1, 0 );\n\n\t\t\tcameraPZ.up.set( 0, 1, 0 );\n\t\t\tcameraPZ.lookAt( 0, 0, 1 );\n\n\t\t\tcameraNZ.up.set( 0, 1, 0 );\n\t\t\tcameraNZ.lookAt( 0, 0, -1 );\n\n\t\t} else if ( coordinateSystem === WebGPUCoordinateSystem ) {\n\n\t\t\tcameraPX.up.set( 0, -1, 0 );\n\t\t\tcameraPX.lookAt( -1, 0, 0 );\n\n\t\t\tcameraNX.up.set( 0, -1, 0 );\n\t\t\tcameraNX.lookAt( 1, 0, 0 );\n\n\t\t\tcameraPY.up.set( 0, 0, 1 );\n\t\t\tcameraPY.lookAt( 0, 1, 0 );\n\n\t\t\tcameraNY.up.set( 0, 0, -1 );\n\t\t\tcameraNY.lookAt( 0, -1, 0 );\n\n\t\t\tcameraPZ.up.set( 0, -1, 0 );\n\t\t\tcameraPZ.lookAt( 0, 0, 1 );\n\n\t\t\tcameraNZ.up.set( 0, -1, 0 );\n\t\t\tcameraNZ.lookAt( 0, 0, -1 );\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'THREE.CubeCamera.updateCoordinateSystem(): Invalid coordinate system: ' + coordinateSystem );\n\n\t\t}\n\n\t\tfor ( const camera of cameras ) {\n\n\t\t\tthis.add( camera );\n\n\t\t\tcamera.updateMatrixWorld();\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Calling this method will render the given scene with the given renderer\n\t * into the cube render target of the camera.\n\t *\n\t * @param {(Renderer|WebGLRenderer)} renderer - The renderer.\n\t * @param {Scene} scene - The scene to render.\n\t */\n\tupdate( renderer, scene ) {\n\n\t\tif ( this.parent === null ) this.updateMatrixWorld();\n\n\t\tconst { renderTarget, activeMipmapLevel } = this;\n\n\t\tif ( this.coordinateSystem !== renderer.coordinateSystem ) {\n\n\t\t\tthis.coordinateSystem = renderer.coordinateSystem;\n\n\t\t\tthis.updateCoordinateSystem();\n\n\t\t}\n\n\t\tconst [ cameraPX, cameraNX, cameraPY, cameraNY, cameraPZ, cameraNZ ] = this.children;\n\n\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\t\tconst currentActiveCubeFace = renderer.getActiveCubeFace();\n\t\tconst currentActiveMipmapLevel = renderer.getActiveMipmapLevel();\n\n\t\tconst currentXrEnabled = renderer.xr.enabled;\n\n\t\trenderer.xr.enabled = false;\n\n\t\tconst generateMipmaps = renderTarget.texture.generateMipmaps;\n\n\t\trenderTarget.texture.generateMipmaps = false;\n\n\t\trenderer.setRenderTarget( renderTarget, 0, activeMipmapLevel );\n\t\trenderer.render( scene, cameraPX );\n\n\t\trenderer.setRenderTarget( renderTarget, 1, activeMipmapLevel );\n\t\trenderer.render( scene, cameraNX );\n\n\t\trenderer.setRenderTarget( renderTarget, 2, activeMipmapLevel );\n\t\trenderer.render( scene, cameraPY );\n\n\t\trenderer.setRenderTarget( renderTarget, 3, activeMipmapLevel );\n\t\trenderer.render( scene, cameraNY );\n\n\t\trenderer.setRenderTarget( renderTarget, 4, activeMipmapLevel );\n\t\trenderer.render( scene, cameraPZ );\n\n\t\t// mipmaps are generated during the last call of render()\n\t\t// at this point, all sides of the cube render target are defined\n\n\t\trenderTarget.texture.generateMipmaps = generateMipmaps;\n\n\t\trenderer.setRenderTarget( renderTarget, 5, activeMipmapLevel );\n\t\trenderer.render( scene, cameraNZ );\n\n\t\trenderer.setRenderTarget( currentRenderTarget, currentActiveCubeFace, currentActiveMipmapLevel );\n\n\t\trenderer.xr.enabled = currentXrEnabled;\n\n\t\trenderTarget.texture.needsPMREMUpdate = true;\n\n\t}\n\n}\n\n/**\n * Creates a cube texture made up of six images.\n *\n * ```js\n * const loader = new THREE.CubeTextureLoader();\n * loader.setPath( 'textures/cube/pisa/' );\n *\n * const textureCube = loader.load( [\n * \t'px.png', 'nx.png', 'py.png', 'ny.png', 'pz.png', 'nz.png'\n * ] );\n *\n * const material = new THREE.MeshBasicMaterial( { color: 0xffffff, envMap: textureCube } );\n * ```\n *\n * @augments Texture\n */\nclass CubeTexture extends Texture {\n\n\t/**\n\t * Constructs a new cube texture.\n\t *\n\t * @param {Array<Image>} [images=[]] - An array holding a image for each side of a cube.\n\t * @param {number} [mapping=CubeReflectionMapping] - The texture mapping.\n\t * @param {number} [wrapS=ClampToEdgeWrapping] - The wrapS value.\n\t * @param {number} [wrapT=ClampToEdgeWrapping] - The wrapT value.\n\t * @param {number} [magFilter=LinearFilter] - The mag filter value.\n\t * @param {number} [minFilter=LinearMipmapLinearFilter] - The min filter value.\n\t * @param {number} [format=RGBAFormat] - The texture format.\n\t * @param {number} [type=UnsignedByteType] - The texture type.\n\t * @param {number} [anisotropy=Texture.DEFAULT_ANISOTROPY] - The anisotropy value.\n\t * @param {string} [colorSpace=NoColorSpace] - The color space value.\n\t */\n\tconstructor( images = [], mapping = CubeReflectionMapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, colorSpace ) {\n\n\t\tsuper( images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, colorSpace );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCubeTexture = true;\n\n\t\t/**\n\t\t * If set to `true`, the texture is flipped along the vertical axis when\n\t\t * uploaded to the GPU.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.flipY = false;\n\n\t}\n\n\t/**\n\t * Alias for {@link CubeTexture#image}.\n\t *\n\t * @type {Array<Image>}\n\t */\n\tget images() {\n\n\t\treturn this.image;\n\n\t}\n\n\tset images( value ) {\n\n\t\tthis.image = value;\n\n\t}\n\n}\n\n/**\n * A cube render target used in context of {@link WebGLRenderer}.\n *\n * @augments WebGLRenderTarget\n */\nclass WebGLCubeRenderTarget extends WebGLRenderTarget {\n\n\t/**\n\t * Constructs a new cube render target.\n\t *\n\t * @param {number} [size=1] - The size of the render target.\n\t * @param {RenderTarget~Options} [options] - The configuration object.\n\t */\n\tconstructor( size = 1, options = {} ) {\n\n\t\tsuper( size, size, options );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isWebGLCubeRenderTarget = true;\n\n\t\tconst image = { width: size, height: size, depth: 1 };\n\t\tconst images = [ image, image, image, image, image, image ];\n\n\t\t/**\n\t\t * Overwritten with a different texture type.\n\t\t *\n\t\t * @type {DataArrayTexture}\n\t\t */\n\t\tthis.texture = new CubeTexture( images );\n\t\tthis._setTextureOptions( options );\n\n\t\t// By convention -- likely based on the RenderMan spec from the 1990's -- cube maps are specified by WebGL (and three.js)\n\t\t// in a coordinate system in which positive-x is to the right when looking up the positive-z axis -- in other words,\n\t\t// in a left-handed coordinate system. By continuing this convention, preexisting cube maps continued to render correctly.\n\n\t\t// three.js uses a right-handed coordinate system. So environment maps used in three.js appear to have px and nx swapped\n\t\t// and the flag isRenderTargetTexture controls this conversion. The flip is not required when using WebGLCubeRenderTarget.texture\n\t\t// as a cube texture (this is detected when isRenderTargetTexture is set to true for cube textures).\n\n\t\tthis.texture.isRenderTargetTexture = true;\n\n\t}\n\n\t/**\n\t * Converts the given equirectangular texture to a cube map.\n\t *\n\t * @param {WebGLRenderer} renderer - The renderer.\n\t * @param {Texture} texture - The equirectangular texture.\n\t * @return {WebGLCubeRenderTarget} A reference to this cube render target.\n\t */\n\tfromEquirectangularTexture( renderer, texture ) {\n\n\t\tthis.texture.type = texture.type;\n\t\tthis.texture.colorSpace = texture.colorSpace;\n\n\t\tthis.texture.generateMipmaps = texture.generateMipmaps;\n\t\tthis.texture.minFilter = texture.minFilter;\n\t\tthis.texture.magFilter = texture.magFilter;\n\n\t\tconst shader = {\n\n\t\t\tuniforms: {\n\t\t\t\ttEquirect: { value: null },\n\t\t\t},\n\n\t\t\tvertexShader: /* glsl */`\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\tvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\n\t\t\t\t\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n\n\t\t\t\t}\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvWorldDirection = transformDirection( position, modelMatrix );\n\n\t\t\t\t\t#include <begin_vertex>\n\t\t\t\t\t#include <project_vertex>\n\n\t\t\t\t}\n\t\t\t`,\n\n\t\t\tfragmentShader: /* glsl */`\n\n\t\t\t\tuniform sampler2D tEquirect;\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\t#include <common>\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvec3 direction = normalize( vWorldDirection );\n\n\t\t\t\t\tvec2 sampleUV = equirectUv( direction );\n\n\t\t\t\t\tgl_FragColor = texture2D( tEquirect, sampleUV );\n\n\t\t\t\t}\n\t\t\t`\n\t\t};\n\n\t\tconst geometry = new BoxGeometry( 5, 5, 5 );\n\n\t\tconst material = new ShaderMaterial( {\n\n\t\t\tname: 'CubemapFromEquirect',\n\n\t\t\tuniforms: cloneUniforms( shader.uniforms ),\n\t\t\tvertexShader: shader.vertexShader,\n\t\t\tfragmentShader: shader.fragmentShader,\n\t\t\tside: BackSide,\n\t\t\tblending: NoBlending\n\n\t\t} );\n\n\t\tmaterial.uniforms.tEquirect.value = texture;\n\n\t\tconst mesh = new Mesh( geometry, material );\n\n\t\tconst currentMinFilter = texture.minFilter;\n\n\t\t// Avoid blurred poles\n\t\tif ( texture.minFilter === LinearMipmapLinearFilter ) texture.minFilter = LinearFilter;\n\n\t\tconst camera = new CubeCamera( 1, 10, this );\n\t\tcamera.update( renderer, mesh );\n\n\t\ttexture.minFilter = currentMinFilter;\n\n\t\tmesh.geometry.dispose();\n\t\tmesh.material.dispose();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Clears this cube render target.\n\t *\n\t * @param {WebGLRenderer} renderer - The renderer.\n\t * @param {boolean} [color=true] - Whether the color buffer should be cleared or not.\n\t * @param {boolean} [depth=true] - Whether the depth buffer should be cleared or not.\n\t * @param {boolean} [stencil=true] - Whether the stencil buffer should be cleared or not.\n\t */\n\tclear( renderer, color = true, depth = true, stencil = true ) {\n\n\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\trenderer.setRenderTarget( this, i );\n\n\t\t\trenderer.clear( color, depth, stencil );\n\n\t\t}\n\n\t\trenderer.setRenderTarget( currentRenderTarget );\n\n\t}\n\n}\n\n/**\n * This is almost identical to an {@link Object3D}. Its purpose is to\n * make working with groups of objects syntactically clearer.\n *\n * ```js\n * // Create a group and add the two cubes.\n * // These cubes can now be rotated / scaled etc as a group.\n * const group = new THREE.Group();\n *\n * group.add( meshA );\n * group.add( meshB );\n *\n * scene.add( group );\n * ```\n *\n * @augments Object3D\n */\nclass Group extends Object3D {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isGroup = true;\n\n\t\tthis.type = 'Group';\n\n\t}\n\n}\n\nconst _moveEvent = { type: 'move' };\n\n/**\n * Class for representing a XR controller with its\n * different coordinate systems.\n *\n * @private\n */\nclass WebXRController {\n\n\t/**\n\t * Constructs a new XR controller.\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * A group representing the target ray space\n\t\t * of the XR controller.\n\t\t *\n\t\t * @private\n\t\t * @type {?Group}\n\t\t * @default null\n\t\t */\n\t\tthis._targetRay = null;\n\n\t\t/**\n\t\t * A group representing the grip space\n\t\t * of the XR controller.\n\t\t *\n\t\t * @private\n\t\t * @type {?Group}\n\t\t * @default null\n\t\t */\n\t\tthis._grip = null;\n\n\t\t/**\n\t\t * A group representing the hand space\n\t\t * of the XR controller.\n\t\t *\n\t\t * @private\n\t\t * @type {?Group}\n\t\t * @default null\n\t\t */\n\t\tthis._hand = null;\n\n\t}\n\n\t/**\n\t * Returns a group representing the hand space of the XR controller.\n\t *\n\t * @return {Group} A group representing the hand space of the XR controller.\n\t */\n\tgetHandSpace() {\n\n\t\tif ( this._hand === null ) {\n\n\t\t\tthis._hand = new Group();\n\t\t\tthis._hand.matrixAutoUpdate = false;\n\t\t\tthis._hand.visible = false;\n\n\t\t\tthis._hand.joints = {};\n\t\t\tthis._hand.inputState = { pinching: false };\n\n\t\t}\n\n\t\treturn this._hand;\n\n\t}\n\n\t/**\n\t * Returns a group representing the target ray space of the XR controller.\n\t *\n\t * @return {Group} A group representing the target ray space of the XR controller.\n\t */\n\tgetTargetRaySpace() {\n\n\t\tif ( this._targetRay === null ) {\n\n\t\t\tthis._targetRay = new Group();\n\t\t\tthis._targetRay.matrixAutoUpdate = false;\n\t\t\tthis._targetRay.visible = false;\n\t\t\tthis._targetRay.hasLinearVelocity = false;\n\t\t\tthis._targetRay.linearVelocity = new Vector3();\n\t\t\tthis._targetRay.hasAngularVelocity = false;\n\t\t\tthis._targetRay.angularVelocity = new Vector3();\n\n\t\t}\n\n\t\treturn this._targetRay;\n\n\t}\n\n\t/**\n\t * Returns a group representing the grip space of the XR controller.\n\t *\n\t * @return {Group} A group representing the grip space of the XR controller.\n\t */\n\tgetGripSpace() {\n\n\t\tif ( this._grip === null ) {\n\n\t\t\tthis._grip = new Group();\n\t\t\tthis._grip.matrixAutoUpdate = false;\n\t\t\tthis._grip.visible = false;\n\t\t\tthis._grip.hasLinearVelocity = false;\n\t\t\tthis._grip.linearVelocity = new Vector3();\n\t\t\tthis._grip.hasAngularVelocity = false;\n\t\t\tthis._grip.angularVelocity = new Vector3();\n\n\t\t}\n\n\t\treturn this._grip;\n\n\t}\n\n\t/**\n\t * Dispatches the given event to the groups representing\n\t * the different coordinate spaces of the XR controller.\n\t *\n\t * @param {Object} event - The event to dispatch.\n\t * @return {WebXRController} A reference to this instance.\n\t */\n\tdispatchEvent( event ) {\n\n\t\tif ( this._targetRay !== null ) {\n\n\t\t\tthis._targetRay.dispatchEvent( event );\n\n\t\t}\n\n\t\tif ( this._grip !== null ) {\n\n\t\t\tthis._grip.dispatchEvent( event );\n\n\t\t}\n\n\t\tif ( this._hand !== null ) {\n\n\t\t\tthis._hand.dispatchEvent( event );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Connects the controller with the given XR input source.\n\t *\n\t * @param {XRInputSource} inputSource - The input source.\n\t * @return {WebXRController} A reference to this instance.\n\t */\n\tconnect( inputSource ) {\n\n\t\tif ( inputSource && inputSource.hand ) {\n\n\t\t\tconst hand = this._hand;\n\n\t\t\tif ( hand ) {\n\n\t\t\t\tfor ( const inputjoint of inputSource.hand.values() ) {\n\n\t\t\t\t\t// Initialize hand with joints when connected\n\t\t\t\t\tthis._getHandJoint( hand, inputjoint );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.dispatchEvent( { type: 'connected', data: inputSource } );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Disconnects the controller from the given XR input source.\n\t *\n\t * @param {XRInputSource} inputSource - The input source.\n\t * @return {WebXRController} A reference to this instance.\n\t */\n\tdisconnect( inputSource ) {\n\n\t\tthis.dispatchEvent( { type: 'disconnected', data: inputSource } );\n\n\t\tif ( this._targetRay !== null ) {\n\n\t\t\tthis._targetRay.visible = false;\n\n\t\t}\n\n\t\tif ( this._grip !== null ) {\n\n\t\t\tthis._grip.visible = false;\n\n\t\t}\n\n\t\tif ( this._hand !== null ) {\n\n\t\t\tthis._hand.visible = false;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Updates the controller with the given input source, XR frame and reference space.\n\t * This updates the transformations of the groups that represent the different\n\t * coordinate systems of the controller.\n\t *\n\t * @param {XRInputSource} inputSource - The input source.\n\t * @param {XRFrame} frame - The XR frame.\n\t * @param {XRReferenceSpace} referenceSpace - The reference space.\n\t * @return {WebXRController} A reference to this instance.\n\t */\n\tupdate( inputSource, frame, referenceSpace ) {\n\n\t\tlet inputPose = null;\n\t\tlet gripPose = null;\n\t\tlet handPose = null;\n\n\t\tconst targetRay = this._targetRay;\n\t\tconst grip = this._grip;\n\t\tconst hand = this._hand;\n\n\t\tif ( inputSource && frame.session.visibilityState !== 'visible-blurred' ) {\n\n\t\t\tif ( hand && inputSource.hand ) {\n\n\t\t\t\thandPose = true;\n\n\t\t\t\tfor ( const inputjoint of inputSource.hand.values() ) {\n\n\t\t\t\t\t// Update the joints groups with the XRJoint poses\n\t\t\t\t\tconst jointPose = frame.getJointPose( inputjoint, referenceSpace );\n\n\t\t\t\t\t// The transform of this joint will be updated with the joint pose on each frame\n\t\t\t\t\tconst joint = this._getHandJoint( hand, inputjoint );\n\n\t\t\t\t\tif ( jointPose !== null ) {\n\n\t\t\t\t\t\tjoint.matrix.fromArray( jointPose.transform.matrix );\n\t\t\t\t\t\tjoint.matrix.decompose( joint.position, joint.rotation, joint.scale );\n\t\t\t\t\t\tjoint.matrixWorldNeedsUpdate = true;\n\t\t\t\t\t\tjoint.jointRadius = jointPose.radius;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tjoint.visible = jointPose !== null;\n\n\t\t\t\t}\n\n\t\t\t\t// Custom events\n\n\t\t\t\t// Check pinchz\n\t\t\t\tconst indexTip = hand.joints[ 'index-finger-tip' ];\n\t\t\t\tconst thumbTip = hand.joints[ 'thumb-tip' ];\n\t\t\t\tconst distance = indexTip.position.distanceTo( thumbTip.position );\n\n\t\t\t\tconst distanceToPinch = 0.02;\n\t\t\t\tconst threshold = 0.005;\n\n\t\t\t\tif ( hand.inputState.pinching && distance > distanceToPinch + threshold ) {\n\n\t\t\t\t\thand.inputState.pinching = false;\n\t\t\t\t\tthis.dispatchEvent( {\n\t\t\t\t\t\ttype: 'pinchend',\n\t\t\t\t\t\thandedness: inputSource.handedness,\n\t\t\t\t\t\ttarget: this\n\t\t\t\t\t} );\n\n\t\t\t\t} else if ( ! hand.inputState.pinching && distance <= distanceToPinch - threshold ) {\n\n\t\t\t\t\thand.inputState.pinching = true;\n\t\t\t\t\tthis.dispatchEvent( {\n\t\t\t\t\t\ttype: 'pinchstart',\n\t\t\t\t\t\thandedness: inputSource.handedness,\n\t\t\t\t\t\ttarget: this\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( grip !== null && inputSource.gripSpace ) {\n\n\t\t\t\t\tgripPose = frame.getPose( inputSource.gripSpace, referenceSpace );\n\n\t\t\t\t\tif ( gripPose !== null ) {\n\n\t\t\t\t\t\tgrip.matrix.fromArray( gripPose.transform.matrix );\n\t\t\t\t\t\tgrip.matrix.decompose( grip.position, grip.rotation, grip.scale );\n\t\t\t\t\t\tgrip.matrixWorldNeedsUpdate = true;\n\n\t\t\t\t\t\tif ( gripPose.linearVelocity ) {\n\n\t\t\t\t\t\t\tgrip.hasLinearVelocity = true;\n\t\t\t\t\t\t\tgrip.linearVelocity.copy( gripPose.linearVelocity );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tgrip.hasLinearVelocity = false;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( gripPose.angularVelocity ) {\n\n\t\t\t\t\t\t\tgrip.hasAngularVelocity = true;\n\t\t\t\t\t\t\tgrip.angularVelocity.copy( gripPose.angularVelocity );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tgrip.hasAngularVelocity = false;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( targetRay !== null ) {\n\n\t\t\t\tinputPose = frame.getPose( inputSource.targetRaySpace, referenceSpace );\n\n\t\t\t\t// Some runtimes (namely Vive Cosmos with Vive OpenXR Runtime) have only grip space and ray space is equal to it\n\t\t\t\tif ( inputPose === null && gripPose !== null ) {\n\n\t\t\t\t\tinputPose = gripPose;\n\n\t\t\t\t}\n\n\t\t\t\tif ( inputPose !== null ) {\n\n\t\t\t\t\ttargetRay.matrix.fromArray( inputPose.transform.matrix );\n\t\t\t\t\ttargetRay.matrix.decompose( targetRay.position, targetRay.rotation, targetRay.scale );\n\t\t\t\t\ttargetRay.matrixWorldNeedsUpdate = true;\n\n\t\t\t\t\tif ( inputPose.linearVelocity ) {\n\n\t\t\t\t\t\ttargetRay.hasLinearVelocity = true;\n\t\t\t\t\t\ttargetRay.linearVelocity.copy( inputPose.linearVelocity );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttargetRay.hasLinearVelocity = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( inputPose.angularVelocity ) {\n\n\t\t\t\t\t\ttargetRay.hasAngularVelocity = true;\n\t\t\t\t\t\ttargetRay.angularVelocity.copy( inputPose.angularVelocity );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttargetRay.hasAngularVelocity = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.dispatchEvent( _moveEvent );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t}\n\n\t\tif ( targetRay !== null ) {\n\n\t\t\ttargetRay.visible = ( inputPose !== null );\n\n\t\t}\n\n\t\tif ( grip !== null ) {\n\n\t\t\tgrip.visible = ( gripPose !== null );\n\n\t\t}\n\n\t\tif ( hand !== null ) {\n\n\t\t\thand.visible = ( handPose !== null );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a group representing the hand joint for the given input joint.\n\t *\n\t * @private\n\t * @param {Group} hand - The group representing the hand space.\n\t * @param {XRJointSpace} inputjoint - The hand joint data.\n\t * @return {Group} A group representing the hand joint for the given input joint.\n\t */\n\t_getHandJoint( hand, inputjoint ) {\n\n\t\tif ( hand.joints[ inputjoint.jointName ] === undefined ) {\n\n\t\t\tconst joint = new Group();\n\t\t\tjoint.matrixAutoUpdate = false;\n\t\t\tjoint.visible = false;\n\t\t\thand.joints[ inputjoint.jointName ] = joint;\n\n\t\t\thand.add( joint );\n\n\t\t}\n\n\t\treturn hand.joints[ inputjoint.jointName ];\n\n\t}\n\n}\n\n/**\n * This class can be used to define an exponential squared fog,\n * which gives a clear view near the camera and a faster than exponentially\n * densening fog farther from the camera.\n *\n * ```js\n * const scene = new THREE.Scene();\n * scene.fog = new THREE.FogExp2( 0xcccccc, 0.002 );\n * ```\n */\nclass FogExp2 {\n\n\t/**\n\t * Constructs a new fog.\n\t *\n\t * @param {number|Color} color - The fog's color.\n\t * @param {number} [density=0.00025] - Defines how fast the fog will grow dense.\n\t */\n\tconstructor( color, density = 0.00025 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isFogExp2 = true;\n\n\t\t/**\n\t\t * The name of the fog.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\n\t\t/**\n\t\t * The fog's color.\n\t\t *\n\t\t * @type {Color}\n\t\t */\n\t\tthis.color = new Color( color );\n\n\t\t/**\n\t\t *  Defines how fast the fog will grow dense.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.00025\n\t\t */\n\t\tthis.density = density;\n\n\t}\n\n\t/**\n\t * Returns a new fog with copied values from this instance.\n\t *\n\t * @return {FogExp2} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new FogExp2( this.color, this.density );\n\n\t}\n\n\t/**\n\t * Serializes the fog into JSON.\n\t *\n\t * @param {?(Object|string)} meta - An optional value holding meta information about the serialization.\n\t * @return {Object} A JSON object representing the serialized fog\n\t */\n\ttoJSON( /* meta */ ) {\n\n\t\treturn {\n\t\t\ttype: 'FogExp2',\n\t\t\tname: this.name,\n\t\t\tcolor: this.color.getHex(),\n\t\t\tdensity: this.density\n\t\t};\n\n\t}\n\n}\n\n/**\n * This class can be used to define a linear fog that grows linearly denser\n * with the distance.\n *\n * ```js\n * const scene = new THREE.Scene();\n * scene.fog = new THREE.Fog( 0xcccccc, 10, 15 );\n * ```\n */\nclass Fog {\n\n\t/**\n\t * Constructs a new fog.\n\t *\n\t * @param {number|Color} color - The fog's color.\n\t * @param {number} [near=1] - The minimum distance to start applying fog.\n\t * @param {number} [far=1000] - The maximum distance at which fog stops being calculated and applied.\n\t */\n\tconstructor( color, near = 1, far = 1000 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isFog = true;\n\n\t\t/**\n\t\t * The name of the fog.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\n\t\t/**\n\t\t * The fog's color.\n\t\t *\n\t\t * @type {Color}\n\t\t */\n\t\tthis.color = new Color( color );\n\n\t\t/**\n\t\t * The minimum distance to start applying fog. Objects that are less than\n\t\t * `near` units from the active camera won't be affected by fog.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.near = near;\n\n\t\t/**\n\t\t * The maximum distance at which fog stops being calculated and applied.\n\t\t * Objects that are more than `far` units away from the active camera won't\n\t\t * be affected by fog.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1000\n\t\t */\n\t\tthis.far = far;\n\n\t}\n\n\t/**\n\t * Returns a new fog with copied values from this instance.\n\t *\n\t * @return {Fog} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new Fog( this.color, this.near, this.far );\n\n\t}\n\n\t/**\n\t * Serializes the fog into JSON.\n\t *\n\t * @param {?(Object|string)} meta - An optional value holding meta information about the serialization.\n\t * @return {Object} A JSON object representing the serialized fog\n\t */\n\ttoJSON( /* meta */ ) {\n\n\t\treturn {\n\t\t\ttype: 'Fog',\n\t\t\tname: this.name,\n\t\t\tcolor: this.color.getHex(),\n\t\t\tnear: this.near,\n\t\t\tfar: this.far\n\t\t};\n\n\t}\n\n}\n\n/**\n * Scenes allow you to set up what is to be rendered and where by three.js.\n * This is where you place 3D objects like meshes, lines or lights.\n *\n * @augments Object3D\n */\nclass Scene extends Object3D {\n\n\t/**\n\t * Constructs a new scene.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isScene = true;\n\n\t\tthis.type = 'Scene';\n\n\t\t/**\n\t\t * Defines the background of the scene. Valid inputs are:\n\t\t *\n\t\t * - A color for defining a uniform colored background.\n\t\t * - A texture for defining a (flat) textured background.\n\t\t * - Cube textures or equirectangular textures for defining a skybox.\n\t\t *\n\t\t * @type {?(Color|Texture)}\n\t\t * @default null\n\t\t */\n\t\tthis.background = null;\n\n\t\t/**\n\t\t * Sets the environment map for all physical materials in the scene. However,\n\t\t * it's not possible to overwrite an existing texture assigned to the `envMap`\n\t\t * material property.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.environment = null;\n\n\t\t/**\n\t\t * A fog instance defining the type of fog that affects everything\n\t\t * rendered in the scene.\n\t\t *\n\t\t * @type {?(Fog|FogExp2)}\n\t\t * @default null\n\t\t */\n\t\tthis.fog = null;\n\n\t\t/**\n\t\t * Sets the blurriness of the background. Only influences environment maps\n\t\t * assigned to {@link Scene#background}. Valid input is a float between `0`\n\t\t * and `1`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.backgroundBlurriness = 0;\n\n\t\t/**\n\t\t * Attenuates the color of the background. Only applies to background textures.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.backgroundIntensity = 1;\n\n\t\t/**\n\t\t * The rotation of the background in radians. Only influences environment maps\n\t\t * assigned to {@link Scene#background}.\n\t\t *\n\t\t * @type {Euler}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.backgroundRotation = new Euler();\n\n\t\t/**\n\t\t * Attenuates the color of the environment. Only influences environment maps\n\t\t * assigned to {@link Scene#environment}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.environmentIntensity = 1;\n\n\t\t/**\n\t\t * The rotation of the environment map in radians. Only influences physical materials\n\t\t * in the scene when {@link Scene#environment} is used.\n\t\t *\n\t\t * @type {Euler}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.environmentRotation = new Euler();\n\n\t\t/**\n\t\t * Forces everything in the scene to be rendered with the defined material. It is possible\n\t\t * to exclude materials from override by setting {@link Material#allowOverride} to `false`.\n\t\t *\n\t\t * @type {?Material}\n\t\t * @default null\n\t\t */\n\t\tthis.overrideMaterial = null;\n\n\t\tif ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) {\n\n\t\t\t__THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'observe', { detail: this } ) );\n\n\t\t}\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tif ( source.background !== null ) this.background = source.background.clone();\n\t\tif ( source.environment !== null ) this.environment = source.environment.clone();\n\t\tif ( source.fog !== null ) this.fog = source.fog.clone();\n\n\t\tthis.backgroundBlurriness = source.backgroundBlurriness;\n\t\tthis.backgroundIntensity = source.backgroundIntensity;\n\t\tthis.backgroundRotation.copy( source.backgroundRotation );\n\n\t\tthis.environmentIntensity = source.environmentIntensity;\n\t\tthis.environmentRotation.copy( source.environmentRotation );\n\n\t\tif ( source.overrideMaterial !== null ) this.overrideMaterial = source.overrideMaterial.clone();\n\n\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tif ( this.fog !== null ) data.object.fog = this.fog.toJSON();\n\n\t\tif ( this.backgroundBlurriness > 0 ) data.object.backgroundBlurriness = this.backgroundBlurriness;\n\t\tif ( this.backgroundIntensity !== 1 ) data.object.backgroundIntensity = this.backgroundIntensity;\n\t\tdata.object.backgroundRotation = this.backgroundRotation.toArray();\n\n\t\tif ( this.environmentIntensity !== 1 ) data.object.environmentIntensity = this.environmentIntensity;\n\t\tdata.object.environmentRotation = this.environmentRotation.toArray();\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * \"Interleaved\" means that multiple attributes, possibly of different types,\n * (e.g., position, normal, uv, color) are packed into a single array buffer.\n *\n * An introduction into interleaved arrays can be found here: [Interleaved array basics](https://blog.tojicode.com/2011/05/interleaved-array-basics.html)\n */\nclass InterleavedBuffer {\n\n\t/**\n\t * Constructs a new interleaved buffer.\n\t *\n\t * @param {TypedArray} array - A typed array with a shared buffer storing attribute data.\n\t * @param {number} stride - The number of typed-array elements per vertex.\n\t */\n\tconstructor( array, stride ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isInterleavedBuffer = true;\n\n\t\t/**\n\t\t * A typed array with a shared buffer storing attribute data.\n\t\t *\n\t\t * @type {TypedArray}\n\t\t */\n\t\tthis.array = array;\n\n\t\t/**\n\t\t * The number of typed-array elements per vertex.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.stride = stride;\n\n\t\t/**\n\t\t * The total number of elements in the array\n\t\t *\n\t\t * @type {number}\n\t\t * @readonly\n\t\t */\n\t\tthis.count = array !== undefined ? array.length / stride : 0;\n\n\t\t/**\n\t\t * Defines the intended usage pattern of the data store for optimization purposes.\n\t\t *\n\t\t * Note: After the initial use of a buffer, its usage cannot be changed. Instead,\n\t\t * instantiate a new one and set the desired usage before the next render.\n\t\t *\n\t\t * @type {(StaticDrawUsage|DynamicDrawUsage|StreamDrawUsage|StaticReadUsage|DynamicReadUsage|StreamReadUsage|StaticCopyUsage|DynamicCopyUsage|StreamCopyUsage)}\n\t\t * @default StaticDrawUsage\n\t\t */\n\t\tthis.usage = StaticDrawUsage;\n\n\t\t/**\n\t\t * This can be used to only update some components of stored vectors (for example, just the\n\t\t * component related to color). Use the `addUpdateRange()` function to add ranges to this array.\n\t\t *\n\t\t * @type {Array<Object>}\n\t\t */\n\t\tthis.updateRanges = [];\n\n\t\t/**\n\t\t * A version number, incremented every time the `needsUpdate` is set to `true`.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.version = 0;\n\n\t\t/**\n\t\t * The UUID of the interleaved buffer.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.uuid = generateUUID();\n\n\t}\n\n\t/**\n\t * A callback function that is executed after the renderer has transferred the attribute array\n\t * data to the GPU.\n\t */\n\tonUploadCallback() {}\n\n\t/**\n\t * Flag to indicate that this attribute has changed and should be re-sent to\n\t * the GPU. Set this to `true` when you modify the value of the array.\n\t *\n\t * @type {number}\n\t * @default false\n\t * @param {boolean} value\n\t */\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n\t/**\n\t * Sets the usage of this interleaved buffer.\n\t *\n\t * @param {(StaticDrawUsage|DynamicDrawUsage|StreamDrawUsage|StaticReadUsage|DynamicReadUsage|StreamReadUsage|StaticCopyUsage|DynamicCopyUsage|StreamCopyUsage)} value - The usage to set.\n\t * @return {InterleavedBuffer} A reference to this interleaved buffer.\n\t */\n\tsetUsage( value ) {\n\n\t\tthis.usage = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds a range of data in the data array to be updated on the GPU.\n\t *\n\t * @param {number} start - Position at which to start update.\n\t * @param {number} count - The number of components to update.\n\t */\n\taddUpdateRange( start, count ) {\n\n\t\tthis.updateRanges.push( { start, count } );\n\n\t}\n\n\t/**\n\t * Clears the update ranges.\n\t */\n\tclearUpdateRanges() {\n\n\t\tthis.updateRanges.length = 0;\n\n\t}\n\n\t/**\n\t * Copies the values of the given interleaved buffer to this instance.\n\t *\n\t * @param {InterleavedBuffer} source - The interleaved buffer to copy.\n\t * @return {InterleavedBuffer} A reference to this instance.\n\t */\n\tcopy( source ) {\n\n\t\tthis.array = new source.array.constructor( source.array );\n\t\tthis.count = source.count;\n\t\tthis.stride = source.stride;\n\t\tthis.usage = source.usage;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies a vector from the given interleaved buffer to this one. The start\n\t * and destination position in the attribute buffers are represented by the\n\t * given indices.\n\t *\n\t * @param {number} index1 - The destination index into this interleaved buffer.\n\t * @param {InterleavedBuffer} interleavedBuffer - The interleaved buffer to copy from.\n\t * @param {number} index2 - The source index into the given interleaved buffer.\n\t * @return {InterleavedBuffer} A reference to this instance.\n\t */\n\tcopyAt( index1, interleavedBuffer, index2 ) {\n\n\t\tindex1 *= this.stride;\n\t\tindex2 *= interleavedBuffer.stride;\n\n\t\tfor ( let i = 0, l = this.stride; i < l; i ++ ) {\n\n\t\t\tthis.array[ index1 + i ] = interleavedBuffer.array[ index2 + i ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given array data in the interleaved buffer.\n\t *\n\t * @param {(TypedArray|Array)} value - The array data to set.\n\t * @param {number} [offset=0] - The offset in this interleaved buffer's array.\n\t * @return {InterleavedBuffer} A reference to this instance.\n\t */\n\tset( value, offset = 0 ) {\n\n\t\tthis.array.set( value, offset );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new interleaved buffer with copied values from this instance.\n\t *\n\t * @param {Object} [data] - An object with shared array buffers that allows to retain shared structures.\n\t * @return {InterleavedBuffer} A clone of this instance.\n\t */\n\tclone( data ) {\n\n\t\tif ( data.arrayBuffers === undefined ) {\n\n\t\t\tdata.arrayBuffers = {};\n\n\t\t}\n\n\t\tif ( this.array.buffer._uuid === undefined ) {\n\n\t\t\tthis.array.buffer._uuid = generateUUID();\n\n\t\t}\n\n\t\tif ( data.arrayBuffers[ this.array.buffer._uuid ] === undefined ) {\n\n\t\t\tdata.arrayBuffers[ this.array.buffer._uuid ] = this.array.slice( 0 ).buffer;\n\n\t\t}\n\n\t\tconst array = new this.array.constructor( data.arrayBuffers[ this.array.buffer._uuid ] );\n\n\t\tconst ib = new this.constructor( array, this.stride );\n\t\tib.setUsage( this.usage );\n\n\t\treturn ib;\n\n\t}\n\n\t/**\n\t * Sets the given callback function that is executed after the Renderer has transferred\n\t * the array data to the GPU. Can be used to perform clean-up operations after\n\t * the upload when data are not needed anymore on the CPU side.\n\t *\n\t * @param {Function} callback - The `onUpload()` callback.\n\t * @return {InterleavedBuffer} A reference to this instance.\n\t */\n\tonUpload( callback ) {\n\n\t\tthis.onUploadCallback = callback;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Serializes the interleaved buffer into JSON.\n\t *\n\t * @param {Object} [data] - An optional value holding meta information about the serialization.\n\t * @return {Object} A JSON object representing the serialized interleaved buffer.\n\t */\n\ttoJSON( data ) {\n\n\t\tif ( data.arrayBuffers === undefined ) {\n\n\t\t\tdata.arrayBuffers = {};\n\n\t\t}\n\n\t\t// generate UUID for array buffer if necessary\n\n\t\tif ( this.array.buffer._uuid === undefined ) {\n\n\t\t\tthis.array.buffer._uuid = generateUUID();\n\n\t\t}\n\n\t\tif ( data.arrayBuffers[ this.array.buffer._uuid ] === undefined ) {\n\n\t\t\tdata.arrayBuffers[ this.array.buffer._uuid ] = Array.from( new Uint32Array( this.array.buffer ) );\n\n\t\t}\n\n\t\t//\n\n\t\treturn {\n\t\t\tuuid: this.uuid,\n\t\t\tbuffer: this.array.buffer._uuid,\n\t\t\ttype: this.array.constructor.name,\n\t\t\tstride: this.stride\n\t\t};\n\n\t}\n\n}\n\nconst _vector$7 = /*@__PURE__*/ new Vector3();\n\n/**\n * An alternative version of a buffer attribute with interleaved data. Interleaved\n * attributes share a common interleaved data storage ({@link InterleavedBuffer}) and refer with\n * different offsets into the buffer.\n */\nclass InterleavedBufferAttribute {\n\n\t/**\n\t * Constructs a new interleaved buffer attribute.\n\t *\n\t * @param {InterleavedBuffer} interleavedBuffer - The buffer holding the interleaved data.\n\t * @param {number} itemSize - The item size.\n\t * @param {number} offset - The attribute offset into the buffer.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( interleavedBuffer, itemSize, offset, normalized = false ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isInterleavedBufferAttribute = true;\n\n\t\t/**\n\t\t * The name of the buffer attribute.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\n\t\t/**\n\t\t * The buffer holding the interleaved data.\n\t\t *\n\t\t * @type {InterleavedBuffer}\n\t\t */\n\t\tthis.data = interleavedBuffer;\n\n\t\t/**\n\t\t * The item size, see {@link BufferAttribute#itemSize}.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.itemSize = itemSize;\n\n\t\t/**\n\t\t * The attribute offset into the buffer.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.offset = offset;\n\n\t\t/**\n\t\t * Whether the data are normalized or not, see {@link BufferAttribute#normalized}\n\t\t *\n\t\t * @type {InterleavedBuffer}\n\t\t */\n\t\tthis.normalized = normalized;\n\n\t}\n\n\t/**\n\t * The item count of this buffer attribute.\n\t *\n\t * @type {number}\n\t * @readonly\n\t */\n\tget count() {\n\n\t\treturn this.data.count;\n\n\t}\n\n\t/**\n\t * The array holding the interleaved buffer attribute data.\n\t *\n\t * @type {TypedArray}\n\t */\n\tget array() {\n\n\t\treturn this.data.array;\n\n\t}\n\n\t/**\n\t * Flag to indicate that this attribute has changed and should be re-sent to\n\t * the GPU. Set this to `true` when you modify the value of the array.\n\t *\n\t * @type {number}\n\t * @default false\n\t * @param {boolean} value\n\t */\n\tset needsUpdate( value ) {\n\n\t\tthis.data.needsUpdate = value;\n\n\t}\n\n\t/**\n\t * Applies the given 4x4 matrix to the given attribute. Only works with\n\t * item size `3`.\n\t *\n\t * @param {Matrix4} m - The matrix to apply.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\tapplyMatrix4( m ) {\n\n\t\tfor ( let i = 0, l = this.data.count; i < l; i ++ ) {\n\n\t\t\t_vector$7.fromBufferAttribute( this, i );\n\n\t\t\t_vector$7.applyMatrix4( m );\n\n\t\t\tthis.setXYZ( i, _vector$7.x, _vector$7.y, _vector$7.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Applies the given 3x3 normal matrix to the given attribute. Only works with\n\t * item size `3`.\n\t *\n\t * @param {Matrix3} m - The normal matrix to apply.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\tapplyNormalMatrix( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$7.fromBufferAttribute( this, i );\n\n\t\t\t_vector$7.applyNormalMatrix( m );\n\n\t\t\tthis.setXYZ( i, _vector$7.x, _vector$7.y, _vector$7.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Applies the given 4x4 matrix to the given attribute. Only works with\n\t * item size `3` and with direction vectors.\n\t *\n\t * @param {Matrix4} m - The matrix to apply.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\ttransformDirection( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$7.fromBufferAttribute( this, i );\n\n\t\t\t_vector$7.transformDirection( m );\n\n\t\t\tthis.setXYZ( i, _vector$7.x, _vector$7.y, _vector$7.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the given component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} component - The component index.\n\t * @return {number} The returned value.\n\t */\n\tgetComponent( index, component ) {\n\n\t\tlet value = this.array[ index * this.data.stride + this.offset + component ];\n\n\t\tif ( this.normalized ) value = denormalize( value, this.array );\n\n\t\treturn value;\n\n\t}\n\n\t/**\n\t * Sets the given value to the given component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} component - The component index.\n\t * @param {number} value - The value to set.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\tsetComponent( index, component, value ) {\n\n\t\tif ( this.normalized ) value = normalize( value, this.array );\n\n\t\tthis.data.array[ index * this.data.stride + this.offset + component ] = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the x component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} x - The value to set.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\tsetX( index, x ) {\n\n\t\tif ( this.normalized ) x = normalize( x, this.array );\n\n\t\tthis.data.array[ index * this.data.stride + this.offset ] = x;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the y component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} y - The value to set.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\tsetY( index, y ) {\n\n\t\tif ( this.normalized ) y = normalize( y, this.array );\n\n\t\tthis.data.array[ index * this.data.stride + this.offset + 1 ] = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the z component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} z - The value to set.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\tsetZ( index, z ) {\n\n\t\tif ( this.normalized ) z = normalize( z, this.array );\n\n\t\tthis.data.array[ index * this.data.stride + this.offset + 2 ] = z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the w component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} w - The value to set.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\tsetW( index, w ) {\n\n\t\tif ( this.normalized ) w = normalize( w, this.array );\n\n\t\tthis.data.array[ index * this.data.stride + this.offset + 3 ] = w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the x component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @return {number} The x component.\n\t */\n\tgetX( index ) {\n\n\t\tlet x = this.data.array[ index * this.data.stride + this.offset ];\n\n\t\tif ( this.normalized ) x = denormalize( x, this.array );\n\n\t\treturn x;\n\n\t}\n\n\t/**\n\t * Returns the y component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @return {number} The y component.\n\t */\n\tgetY( index ) {\n\n\t\tlet y = this.data.array[ index * this.data.stride + this.offset + 1 ];\n\n\t\tif ( this.normalized ) y = denormalize( y, this.array );\n\n\t\treturn y;\n\n\t}\n\n\t/**\n\t * Returns the z component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @return {number} The z component.\n\t */\n\tgetZ( index ) {\n\n\t\tlet z = this.data.array[ index * this.data.stride + this.offset + 2 ];\n\n\t\tif ( this.normalized ) z = denormalize( z, this.array );\n\n\t\treturn z;\n\n\t}\n\n\t/**\n\t * Returns the w component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @return {number} The w component.\n\t */\n\tgetW( index ) {\n\n\t\tlet w = this.data.array[ index * this.data.stride + this.offset + 3 ];\n\n\t\tif ( this.normalized ) w = denormalize( w, this.array );\n\n\t\treturn w;\n\n\t}\n\n\t/**\n\t * Sets the x and y component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} x - The value for the x component to set.\n\t * @param {number} y - The value for the y component to set.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\tsetXY( index, x, y ) {\n\n\t\tindex = index * this.data.stride + this.offset;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\n\t\t}\n\n\t\tthis.data.array[ index + 0 ] = x;\n\t\tthis.data.array[ index + 1 ] = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the x, y and z component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} x - The value for the x component to set.\n\t * @param {number} y - The value for the y component to set.\n\t * @param {number} z - The value for the z component to set.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\tsetXYZ( index, x, y, z ) {\n\n\t\tindex = index * this.data.stride + this.offset;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\t\t\tz = normalize( z, this.array );\n\n\t\t}\n\n\t\tthis.data.array[ index + 0 ] = x;\n\t\tthis.data.array[ index + 1 ] = y;\n\t\tthis.data.array[ index + 2 ] = z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the x, y, z and w component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} x - The value for the x component to set.\n\t * @param {number} y - The value for the y component to set.\n\t * @param {number} z - The value for the z component to set.\n\t * @param {number} w - The value for the w component to set.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\tsetXYZW( index, x, y, z, w ) {\n\n\t\tindex = index * this.data.stride + this.offset;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\t\t\tz = normalize( z, this.array );\n\t\t\tw = normalize( w, this.array );\n\n\t\t}\n\n\t\tthis.data.array[ index + 0 ] = x;\n\t\tthis.data.array[ index + 1 ] = y;\n\t\tthis.data.array[ index + 2 ] = z;\n\t\tthis.data.array[ index + 3 ] = w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new buffer attribute with copied values from this instance.\n\t *\n\t * If no parameter is provided, cloning an interleaved buffer attribute will de-interleave buffer data.\n\t *\n\t * @param {Object} [data] - An object with interleaved buffers that allows to retain the interleaved property.\n\t * @return {BufferAttribute|InterleavedBufferAttribute} A clone of this instance.\n\t */\n\tclone( data ) {\n\n\t\tif ( data === undefined ) {\n\n\t\t\tlog( 'InterleavedBufferAttribute.clone(): Cloning an interleaved buffer attribute will de-interleave buffer data.' );\n\n\t\t\tconst array = [];\n\n\t\t\tfor ( let i = 0; i < this.count; i ++ ) {\n\n\t\t\t\tconst index = i * this.data.stride + this.offset;\n\n\t\t\t\tfor ( let j = 0; j < this.itemSize; j ++ ) {\n\n\t\t\t\t\tarray.push( this.data.array[ index + j ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new BufferAttribute( new this.array.constructor( array ), this.itemSize, this.normalized );\n\n\t\t} else {\n\n\t\t\tif ( data.interleavedBuffers === undefined ) {\n\n\t\t\t\tdata.interleavedBuffers = {};\n\n\t\t\t}\n\n\t\t\tif ( data.interleavedBuffers[ this.data.uuid ] === undefined ) {\n\n\t\t\t\tdata.interleavedBuffers[ this.data.uuid ] = this.data.clone( data );\n\n\t\t\t}\n\n\t\t\treturn new InterleavedBufferAttribute( data.interleavedBuffers[ this.data.uuid ], this.itemSize, this.offset, this.normalized );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Serializes the buffer attribute into JSON.\n\t *\n\t * If no parameter is provided, cloning an interleaved buffer attribute will de-interleave buffer data.\n\t *\n\t * @param {Object} [data] - An optional value holding meta information about the serialization.\n\t * @return {Object} A JSON object representing the serialized buffer attribute.\n\t */\n\ttoJSON( data ) {\n\n\t\tif ( data === undefined ) {\n\n\t\t\tlog( 'InterleavedBufferAttribute.toJSON(): Serializing an interleaved buffer attribute will de-interleave buffer data.' );\n\n\t\t\tconst array = [];\n\n\t\t\tfor ( let i = 0; i < this.count; i ++ ) {\n\n\t\t\t\tconst index = i * this.data.stride + this.offset;\n\n\t\t\t\tfor ( let j = 0; j < this.itemSize; j ++ ) {\n\n\t\t\t\t\tarray.push( this.data.array[ index + j ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// de-interleave data and save it as an ordinary buffer attribute for now\n\n\t\t\treturn {\n\t\t\t\titemSize: this.itemSize,\n\t\t\t\ttype: this.array.constructor.name,\n\t\t\t\tarray: array,\n\t\t\t\tnormalized: this.normalized\n\t\t\t};\n\n\t\t} else {\n\n\t\t\t// save as true interleaved attribute\n\n\t\t\tif ( data.interleavedBuffers === undefined ) {\n\n\t\t\t\tdata.interleavedBuffers = {};\n\n\t\t\t}\n\n\t\t\tif ( data.interleavedBuffers[ this.data.uuid ] === undefined ) {\n\n\t\t\t\tdata.interleavedBuffers[ this.data.uuid ] = this.data.toJSON( data );\n\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tisInterleavedBufferAttribute: true,\n\t\t\t\titemSize: this.itemSize,\n\t\t\t\tdata: this.data.uuid,\n\t\t\t\toffset: this.offset,\n\t\t\t\tnormalized: this.normalized\n\t\t\t};\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * A material for rendering instances of {@link Sprite}.\n *\n * ```js\n * const map = new THREE.TextureLoader().load( 'textures/sprite.png' );\n * const material = new THREE.SpriteMaterial( { map: map, color: 0xffffff } );\n *\n * const sprite = new THREE.Sprite( material );\n * sprite.scale.set(200, 200, 1)\n * scene.add( sprite );\n * ```\n *\n * @augments Material\n */\nclass SpriteMaterial extends Material {\n\n\t/**\n\t * Constructs a new sprite material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSpriteMaterial = true;\n\n\t\tthis.type = 'SpriteMaterial';\n\n\t\t/**\n\t\t * Color of the material.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.color = new Color( 0xffffff );\n\n\t\t/**\n\t\t * The color map. May optionally include an alpha channel, typically combined\n\t\t * with {@link Material#transparent} or {@link Material#alphaTest}. The texture map\n\t\t * color is modulated by the diffuse `color`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * The alpha map is a grayscale texture that controls the opacity across the\n\t\t * surface (black: fully transparent; white: fully opaque).\n\t\t *\n\t\t * Only the color of the texture is used, ignoring the alpha channel if one\n\t\t * exists. For RGB and RGBA textures, the renderer will use the green channel\n\t\t * when sampling this texture due to the extra bit of precision provided for\n\t\t * green in DXT-compressed and uncompressed RGB 565 formats. Luminance-only and\n\t\t * luminance/alpha textures will also still work as expected.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.alphaMap = null;\n\n\t\t/**\n\t\t * The rotation of the sprite in radians.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.rotation = 0;\n\n\t\t/**\n\t\t * Specifies whether size of the sprite is attenuated by the camera depth (perspective camera only).\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.sizeAttenuation = true;\n\n\t\t/**\n\t\t * Overwritten since sprite materials are transparent\n\t\t * by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.transparent = true;\n\n\t\t/**\n\t\t * Whether the material is affected by fog or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.rotation = source.rotation;\n\n\t\tthis.sizeAttenuation = source.sizeAttenuation;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nlet _geometry;\n\nconst _intersectPoint = /*@__PURE__*/ new Vector3();\nconst _worldScale = /*@__PURE__*/ new Vector3();\nconst _mvPosition = /*@__PURE__*/ new Vector3();\n\nconst _alignedPosition = /*@__PURE__*/ new Vector2();\nconst _rotatedPosition = /*@__PURE__*/ new Vector2();\nconst _viewWorldMatrix = /*@__PURE__*/ new Matrix4();\n\nconst _vA = /*@__PURE__*/ new Vector3();\nconst _vB = /*@__PURE__*/ new Vector3();\nconst _vC = /*@__PURE__*/ new Vector3();\n\nconst _uvA = /*@__PURE__*/ new Vector2();\nconst _uvB = /*@__PURE__*/ new Vector2();\nconst _uvC = /*@__PURE__*/ new Vector2();\n\n/**\n * A sprite is a plane that always faces towards the camera, generally with a\n * partially transparent texture applied.\n *\n * Sprites do not cast shadows, setting {@link Object3D#castShadow} to `true` will\n * have no effect.\n *\n * ```js\n * const map = new THREE.TextureLoader().load( 'sprite.png' );\n * const material = new THREE.SpriteMaterial( { map: map } );\n *\n * const sprite = new THREE.Sprite( material );\n * scene.add( sprite );\n * ```\n *\n * @augments Object3D\n */\nclass Sprite extends Object3D {\n\n\t/**\n\t * Constructs a new sprite.\n\t *\n\t * @param {(SpriteMaterial|SpriteNodeMaterial)} [material] - The sprite material.\n\t */\n\tconstructor( material = new SpriteMaterial() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSprite = true;\n\n\t\tthis.type = 'Sprite';\n\n\t\tif ( _geometry === undefined ) {\n\n\t\t\t_geometry = new BufferGeometry();\n\n\t\t\tconst float32Array = new Float32Array( [\n\t\t\t\t-0.5, -0.5, 0, 0, 0,\n\t\t\t\t0.5, -0.5, 0, 1, 0,\n\t\t\t\t0.5, 0.5, 0, 1, 1,\n\t\t\t\t-0.5, 0.5, 0, 0, 1\n\t\t\t] );\n\n\t\t\tconst interleavedBuffer = new InterleavedBuffer( float32Array, 5 );\n\n\t\t\t_geometry.setIndex( [ 0, 1, 2,\t0, 2, 3 ] );\n\t\t\t_geometry.setAttribute( 'position', new InterleavedBufferAttribute( interleavedBuffer, 3, 0, false ) );\n\t\t\t_geometry.setAttribute( 'uv', new InterleavedBufferAttribute( interleavedBuffer, 2, 3, false ) );\n\n\t\t}\n\n\t\t/**\n\t\t * The sprite geometry.\n\t\t *\n\t\t * @type {BufferGeometry}\n\t\t */\n\t\tthis.geometry = _geometry;\n\n\t\t/**\n\t\t * The sprite material.\n\t\t *\n\t\t * @type {(SpriteMaterial|SpriteNodeMaterial)}\n\t\t */\n\t\tthis.material = material;\n\n\t\t/**\n\t\t * The sprite's anchor point, and the point around which the sprite rotates.\n\t\t * A value of `(0.5, 0.5)` corresponds to the midpoint of the sprite. A value\n\t\t * of `(0, 0)` corresponds to the lower left corner of the sprite.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (0.5,0.5)\n\t\t */\n\t\tthis.center = new Vector2( 0.5, 0.5 );\n\n\t\t/**\n\t\t * The number of instances of this sprite.\n\t\t * Can only be used with {@link WebGPURenderer}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.count = 1;\n\n\t}\n\n\t/**\n\t * Computes intersection points between a casted ray and this sprite.\n\t *\n\t * @param {Raycaster} raycaster - The raycaster.\n\t * @param {Array<Object>} intersects - The target array that holds the intersection points.\n\t */\n\traycast( raycaster, intersects ) {\n\n\t\tif ( raycaster.camera === null ) {\n\n\t\t\terror( 'Sprite: \"Raycaster.camera\" needs to be set in order to raycast against sprites.' );\n\n\t\t}\n\n\t\t_worldScale.setFromMatrixScale( this.matrixWorld );\n\n\t\t_viewWorldMatrix.copy( raycaster.camera.matrixWorld );\n\t\tthis.modelViewMatrix.multiplyMatrices( raycaster.camera.matrixWorldInverse, this.matrixWorld );\n\n\t\t_mvPosition.setFromMatrixPosition( this.modelViewMatrix );\n\n\t\tif ( raycaster.camera.isPerspectiveCamera && this.material.sizeAttenuation === false ) {\n\n\t\t\t_worldScale.multiplyScalar( - _mvPosition.z );\n\n\t\t}\n\n\t\tconst rotation = this.material.rotation;\n\t\tlet sin, cos;\n\n\t\tif ( rotation !== 0 ) {\n\n\t\t\tcos = Math.cos( rotation );\n\t\t\tsin = Math.sin( rotation );\n\n\t\t}\n\n\t\tconst center = this.center;\n\n\t\ttransformVertex( _vA.set( -0.5, -0.5, 0 ), _mvPosition, center, _worldScale, sin, cos );\n\t\ttransformVertex( _vB.set( 0.5, -0.5, 0 ), _mvPosition, center, _worldScale, sin, cos );\n\t\ttransformVertex( _vC.set( 0.5, 0.5, 0 ), _mvPosition, center, _worldScale, sin, cos );\n\n\t\t_uvA.set( 0, 0 );\n\t\t_uvB.set( 1, 0 );\n\t\t_uvC.set( 1, 1 );\n\n\t\t// check first triangle\n\t\tlet intersect = raycaster.ray.intersectTriangle( _vA, _vB, _vC, false, _intersectPoint );\n\n\t\tif ( intersect === null ) {\n\n\t\t\t// check second triangle\n\t\t\ttransformVertex( _vB.set( -0.5, 0.5, 0 ), _mvPosition, center, _worldScale, sin, cos );\n\t\t\t_uvB.set( 0, 1 );\n\n\t\t\tintersect = raycaster.ray.intersectTriangle( _vA, _vC, _vB, false, _intersectPoint );\n\t\t\tif ( intersect === null ) {\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst distance = raycaster.ray.origin.distanceTo( _intersectPoint );\n\n\t\tif ( distance < raycaster.near || distance > raycaster.far ) return;\n\n\t\tintersects.push( {\n\n\t\t\tdistance: distance,\n\t\t\tpoint: _intersectPoint.clone(),\n\t\t\tuv: Triangle.getInterpolation( _intersectPoint, _vA, _vB, _vC, _uvA, _uvB, _uvC, new Vector2() ),\n\t\t\tface: null,\n\t\t\tobject: this\n\n\t\t} );\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tif ( source.center !== undefined ) this.center.copy( source.center );\n\n\t\tthis.material = source.material;\n\n\t\treturn this;\n\n\t}\n\n}\n\nfunction transformVertex( vertexPosition, mvPosition, center, scale, sin, cos ) {\n\n\t// compute position in camera space\n\t_alignedPosition.subVectors( vertexPosition, center ).addScalar( 0.5 ).multiply( scale );\n\n\t// to check if rotation is not zero\n\tif ( sin !== undefined ) {\n\n\t\t_rotatedPosition.x = ( cos * _alignedPosition.x ) - ( sin * _alignedPosition.y );\n\t\t_rotatedPosition.y = ( sin * _alignedPosition.x ) + ( cos * _alignedPosition.y );\n\n\t} else {\n\n\t\t_rotatedPosition.copy( _alignedPosition );\n\n\t}\n\n\n\tvertexPosition.copy( mvPosition );\n\tvertexPosition.x += _rotatedPosition.x;\n\tvertexPosition.y += _rotatedPosition.y;\n\n\t// transform to world space\n\tvertexPosition.applyMatrix4( _viewWorldMatrix );\n\n}\n\nconst _v1$2 = /*@__PURE__*/ new Vector3();\nconst _v2$1 = /*@__PURE__*/ new Vector3();\n\n/**\n * A component for providing a basic Level of Detail (LOD) mechanism.\n *\n * Every LOD level is associated with an object, and rendering can be switched\n * between them at the distances specified. Typically you would create, say,\n * three meshes, one for far away (low detail), one for mid range (medium\n * detail) and one for close up (high detail).\n *\n * ```js\n * const lod = new THREE.LOD();\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n *\n * //Create spheres with 3 levels of detail and create new LOD levels for them\n * for( let i = 0; i < 3; i++ ) {\n *\n * \tconst geometry = new THREE.IcosahedronGeometry( 10, 3 - i );\n * \tconst mesh = new THREE.Mesh( geometry, material );\n * \tlod.addLevel( mesh, i * 75 );\n *\n * }\n *\n * scene.add( lod );\n * ```\n *\n * @augments Object3D\n */\nclass LOD extends Object3D {\n\n\t/**\n\t * Constructs a new LOD.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLOD = true;\n\n\t\t/**\n\t\t * The current LOD index.\n\t\t *\n\t\t * @private\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis._currentLevel = 0;\n\n\t\tthis.type = 'LOD';\n\n\t\tObject.defineProperties( this, {\n\t\t\t/**\n\t\t\t * This array holds the LOD levels.\n\t\t\t *\n\t\t\t * @name LOD#levels\n\t\t\t * @type {Array<{object:Object3D,distance:number,hysteresis:number}>}\n\t\t\t */\n\t\t\tlevels: {\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: []\n\t\t\t}\n\t\t} );\n\n\t\t/**\n\t\t * Whether the LOD object is updated automatically by the renderer per frame\n\t\t * or not. If set to `false`, you have to call {@link LOD#update} in the\n\t\t * render loop by yourself.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.autoUpdate = true;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source, false );\n\n\t\tconst levels = source.levels;\n\n\t\tfor ( let i = 0, l = levels.length; i < l; i ++ ) {\n\n\t\t\tconst level = levels[ i ];\n\n\t\t\tthis.addLevel( level.object.clone(), level.distance, level.hysteresis );\n\n\t\t}\n\n\t\tthis.autoUpdate = source.autoUpdate;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds a mesh that will display at a certain distance and greater. Typically\n\t * the further away the distance, the lower the detail on the mesh.\n\t *\n\t * @param {Object3D} object - The 3D object to display at this level.\n\t * @param {number} [distance=0] - The distance at which to display this level of detail.\n\t * @param {number} [hysteresis=0] - Threshold used to avoid flickering at LOD boundaries, as a fraction of distance.\n\t * @return {LOD} A reference to this instance.\n\t */\n\taddLevel( object, distance = 0, hysteresis = 0 ) {\n\n\t\tdistance = Math.abs( distance );\n\n\t\tconst levels = this.levels;\n\n\t\tlet l;\n\n\t\tfor ( l = 0; l < levels.length; l ++ ) {\n\n\t\t\tif ( distance < levels[ l ].distance ) {\n\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tlevels.splice( l, 0, { distance: distance, hysteresis: hysteresis, object: object } );\n\n\t\tthis.add( object );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Removes an existing level, based on the distance from the camera.\n\t * Returns `true` when the level has been removed. Otherwise `false`.\n\t *\n\t * @param {number} distance - Distance of the level to remove.\n\t * @return {boolean} Whether the level has been removed or not.\n\t */\n\tremoveLevel( distance ) {\n\n\t\tconst levels = this.levels;\n\n\t\tfor ( let i = 0; i < levels.length; i ++ ) {\n\n\t\t\tif ( levels[ i ].distance === distance ) {\n\n\t\t\t\tconst removedElements = levels.splice( i, 1 );\n\t\t\t\tthis.remove( removedElements[ 0 ].object );\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\t/**\n\t * Returns the currently active LOD level index.\n\t *\n\t * @return {number} The current active LOD level index.\n\t */\n\tgetCurrentLevel() {\n\n\t\treturn this._currentLevel;\n\n\t}\n\n\t/**\n\t * Returns a reference to the first 3D object that is greater than\n\t * the given distance.\n\t *\n\t * @param {number} distance - The LOD distance.\n\t * @return {?Object3D} The found 3D object. `null` if no 3D object has been found.\n\t */\n\tgetObjectForDistance( distance ) {\n\n\t\tconst levels = this.levels;\n\n\t\tif ( levels.length > 0 ) {\n\n\t\t\tlet i, l;\n\n\t\t\tfor ( i = 1, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\tlet levelDistance = levels[ i ].distance;\n\n\t\t\t\tif ( levels[ i ].object.visible ) {\n\n\t\t\t\t\tlevelDistance -= levelDistance * levels[ i ].hysteresis;\n\n\t\t\t\t}\n\n\t\t\t\tif ( distance < levelDistance ) {\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn levels[ i - 1 ].object;\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\t/**\n\t * Computes intersection points between a casted ray and this LOD.\n\t *\n\t * @param {Raycaster} raycaster - The raycaster.\n\t * @param {Array<Object>} intersects - The target array that holds the intersection points.\n\t */\n\traycast( raycaster, intersects ) {\n\n\t\tconst levels = this.levels;\n\n\t\tif ( levels.length > 0 ) {\n\n\t\t\t_v1$2.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\tconst distance = raycaster.ray.origin.distanceTo( _v1$2 );\n\n\t\t\tthis.getObjectForDistance( distance ).raycast( raycaster, intersects );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Updates the LOD by computing which LOD level should be visible according\n\t * to the current distance of the given camera.\n\t *\n\t * @param {Camera} camera - The camera the scene is rendered with.\n\t */\n\tupdate( camera ) {\n\n\t\tconst levels = this.levels;\n\n\t\tif ( levels.length > 1 ) {\n\n\t\t\t_v1$2.setFromMatrixPosition( camera.matrixWorld );\n\t\t\t_v2$1.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\tconst distance = _v1$2.distanceTo( _v2$1 ) / camera.zoom;\n\n\t\t\tlevels[ 0 ].object.visible = true;\n\n\t\t\tlet i, l;\n\n\t\t\tfor ( i = 1, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\tlet levelDistance = levels[ i ].distance;\n\n\t\t\t\tif ( levels[ i ].object.visible ) {\n\n\t\t\t\t\tlevelDistance -= levelDistance * levels[ i ].hysteresis;\n\n\t\t\t\t}\n\n\t\t\t\tif ( distance >= levelDistance ) {\n\n\t\t\t\t\tlevels[ i - 1 ].object.visible = false;\n\t\t\t\t\tlevels[ i ].object.visible = true;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis._currentLevel = i - 1;\n\n\t\t\tfor ( ; i < l; i ++ ) {\n\n\t\t\t\tlevels[ i ].object.visible = false;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tif ( this.autoUpdate === false ) data.object.autoUpdate = false;\n\n\t\tdata.object.levels = [];\n\n\t\tconst levels = this.levels;\n\n\t\tfor ( let i = 0, l = levels.length; i < l; i ++ ) {\n\n\t\t\tconst level = levels[ i ];\n\n\t\t\tdata.object.levels.push( {\n\t\t\t\tobject: level.object.uuid,\n\t\t\t\tdistance: level.distance,\n\t\t\t\thysteresis: level.hysteresis\n\t\t\t} );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n}\n\nconst _basePosition = /*@__PURE__*/ new Vector3();\n\nconst _skinIndex = /*@__PURE__*/ new Vector4();\nconst _skinWeight = /*@__PURE__*/ new Vector4();\n\nconst _vector3 = /*@__PURE__*/ new Vector3();\nconst _matrix4 = /*@__PURE__*/ new Matrix4();\nconst _vertex = /*@__PURE__*/ new Vector3();\n\nconst _sphere$5 = /*@__PURE__*/ new Sphere();\nconst _inverseMatrix$2 = /*@__PURE__*/ new Matrix4();\nconst _ray$2 = /*@__PURE__*/ new Ray();\n\n/**\n * A mesh that has a {@link Skeleton} that can then be used to animate the\n * vertices of the geometry with skinning/skeleton animation.\n *\n * Next to a valid skeleton, the skinned mesh requires skin indices and weights\n * as buffer attributes in its geometry. These attribute define which bones affect a single\n * vertex to a certain extend.\n *\n * Typically skinned meshes are not created manually but loaders like {@link GLTFLoader}\n * or {@link FBXLoader } import respective models.\n *\n * @augments Mesh\n * @demo scenes/bones-browser.html\n */\nclass SkinnedMesh extends Mesh {\n\n\t/**\n\t * Constructs a new skinned mesh.\n\t *\n\t * @param {BufferGeometry} [geometry] - The mesh geometry.\n\t * @param {Material|Array<Material>} [material] - The mesh material.\n\t */\n\tconstructor( geometry, material ) {\n\n\t\tsuper( geometry, material );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSkinnedMesh = true;\n\n\t\tthis.type = 'SkinnedMesh';\n\n\t\t/**\n\t\t * `AttachedBindMode` means the skinned mesh shares the same world space as the skeleton.\n\t\t * This is not true when using `DetachedBindMode` which is useful when sharing a skeleton\n\t\t * across multiple skinned meshes.\n\t\t *\n\t\t * @type {(AttachedBindMode|DetachedBindMode)}\n\t\t * @default AttachedBindMode\n\t\t */\n\t\tthis.bindMode = AttachedBindMode;\n\n\t\t/**\n\t\t * The base matrix that is used for the bound bone transforms.\n\t\t *\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.bindMatrix = new Matrix4();\n\n\t\t/**\n\t\t * The base matrix that is used for resetting the bound bone transforms.\n\t\t *\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.bindMatrixInverse = new Matrix4();\n\n\t\t/**\n\t\t * The bounding box of the skinned mesh. Can be computed via {@link SkinnedMesh#computeBoundingBox}.\n\t\t *\n\t\t * @type {?Box3}\n\t\t * @default null\n\t\t */\n\t\tthis.boundingBox = null;\n\n\t\t/**\n\t\t * The bounding sphere of the skinned mesh. Can be computed via {@link SkinnedMesh#computeBoundingSphere}.\n\t\t *\n\t\t * @type {?Sphere}\n\t\t * @default null\n\t\t */\n\t\tthis.boundingSphere = null;\n\n\t}\n\n\t/**\n\t * Computes the bounding box of the skinned mesh, and updates {@link SkinnedMesh#boundingBox}.\n\t * The bounding box is not automatically computed by the engine; this method must be called by your app.\n\t * If the skinned mesh is animated, the bounding box should be recomputed per frame in order to reflect\n\t * the current animation state.\n\t */\n\tcomputeBoundingBox() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tif ( this.boundingBox === null ) {\n\n\t\t\tthis.boundingBox = new Box3();\n\n\t\t}\n\n\t\tthis.boundingBox.makeEmpty();\n\n\t\tconst positionAttribute = geometry.getAttribute( 'position' );\n\n\t\tfor ( let i = 0; i < positionAttribute.count; i ++ ) {\n\n\t\t\tthis.getVertexPosition( i, _vertex );\n\t\t\tthis.boundingBox.expandByPoint( _vertex );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Computes the bounding sphere of the skinned mesh, and updates {@link SkinnedMesh#boundingSphere}.\n\t * The bounding sphere is automatically computed by the engine once when it is needed, e.g., for ray casting\n\t * and view frustum culling. If the skinned mesh is animated, the bounding sphere should be recomputed\n\t * per frame in order to reflect the current animation state.\n\t */\n\tcomputeBoundingSphere() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tif ( this.boundingSphere === null ) {\n\n\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t}\n\n\t\tthis.boundingSphere.makeEmpty();\n\n\t\tconst positionAttribute = geometry.getAttribute( 'position' );\n\n\t\tfor ( let i = 0; i < positionAttribute.count; i ++ ) {\n\n\t\t\tthis.getVertexPosition( i, _vertex );\n\t\t\tthis.boundingSphere.expandByPoint( _vertex );\n\n\t\t}\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.bindMode = source.bindMode;\n\t\tthis.bindMatrix.copy( source.bindMatrix );\n\t\tthis.bindMatrixInverse.copy( source.bindMatrixInverse );\n\n\t\tthis.skeleton = source.skeleton;\n\n\t\tif ( source.boundingBox !== null ) this.boundingBox = source.boundingBox.clone();\n\t\tif ( source.boundingSphere !== null ) this.boundingSphere = source.boundingSphere.clone();\n\n\t\treturn this;\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tconst material = this.material;\n\t\tconst matrixWorld = this.matrixWorld;\n\n\t\tif ( material === undefined ) return;\n\n\t\t// test with bounding sphere in world space\n\n\t\tif ( this.boundingSphere === null ) this.computeBoundingSphere();\n\n\t\t_sphere$5.copy( this.boundingSphere );\n\t\t_sphere$5.applyMatrix4( matrixWorld );\n\n\t\tif ( raycaster.ray.intersectsSphere( _sphere$5 ) === false ) return;\n\n\t\t// convert ray to local space of skinned mesh\n\n\t\t_inverseMatrix$2.copy( matrixWorld ).invert();\n\t\t_ray$2.copy( raycaster.ray ).applyMatrix4( _inverseMatrix$2 );\n\n\t\t// test with bounding box in local space\n\n\t\tif ( this.boundingBox !== null ) {\n\n\t\t\tif ( _ray$2.intersectsBox( this.boundingBox ) === false ) return;\n\n\t\t}\n\n\t\t// test for intersections with geometry\n\n\t\tthis._computeIntersections( raycaster, intersects, _ray$2 );\n\n\t}\n\n\tgetVertexPosition( index, target ) {\n\n\t\tsuper.getVertexPosition( index, target );\n\n\t\tthis.applyBoneTransform( index, target );\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Binds the given skeleton to the skinned mesh.\n\t *\n\t * @param {Skeleton} skeleton - The skeleton to bind.\n\t * @param {Matrix4} [bindMatrix] - The bind matrix. If no bind matrix is provided,\n\t * the skinned mesh's world matrix will be used instead.\n\t */\n\tbind( skeleton, bindMatrix ) {\n\n\t\tthis.skeleton = skeleton;\n\n\t\tif ( bindMatrix === undefined ) {\n\n\t\t\tthis.updateMatrixWorld( true );\n\n\t\t\tthis.skeleton.calculateInverses();\n\n\t\t\tbindMatrix = this.matrixWorld;\n\n\t\t}\n\n\t\tthis.bindMatrix.copy( bindMatrix );\n\t\tthis.bindMatrixInverse.copy( bindMatrix ).invert();\n\n\t}\n\n\t/**\n\t * This method sets the skinned mesh in the rest pose).\n\t */\n\tpose() {\n\n\t\tthis.skeleton.pose();\n\n\t}\n\n\t/**\n\t * Normalizes the skin weights which are defined as a buffer attribute\n\t * in the skinned mesh's geometry.\n\t */\n\tnormalizeSkinWeights() {\n\n\t\tconst vector = new Vector4();\n\n\t\tconst skinWeight = this.geometry.attributes.skinWeight;\n\n\t\tfor ( let i = 0, l = skinWeight.count; i < l; i ++ ) {\n\n\t\t\tvector.fromBufferAttribute( skinWeight, i );\n\n\t\t\tconst scale = 1.0 / vector.manhattanLength();\n\n\t\t\tif ( scale !== Infinity ) {\n\n\t\t\t\tvector.multiplyScalar( scale );\n\n\t\t\t} else {\n\n\t\t\t\tvector.set( 1, 0, 0, 0 ); // do something reasonable\n\n\t\t\t}\n\n\t\t\tskinWeight.setXYZW( i, vector.x, vector.y, vector.z, vector.w );\n\n\t\t}\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t\tif ( this.bindMode === AttachedBindMode ) {\n\n\t\t\tthis.bindMatrixInverse.copy( this.matrixWorld ).invert();\n\n\t\t} else if ( this.bindMode === DetachedBindMode ) {\n\n\t\t\tthis.bindMatrixInverse.copy( this.bindMatrix ).invert();\n\n\t\t} else {\n\n\t\t\twarn( 'SkinnedMesh: Unrecognized bindMode: ' + this.bindMode );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Applies the bone transform associated with the given index to the given\n\t * vertex position. Returns the updated vector.\n\t *\n\t * @param {number} index - The vertex index.\n\t * @param {Vector3} target - The target object that is used to store the method's result.\n\t * the skinned mesh's world matrix will be used instead.\n\t * @return {Vector3} The updated vertex position.\n\t */\n\tapplyBoneTransform( index, target ) {\n\n\t\tconst skeleton = this.skeleton;\n\t\tconst geometry = this.geometry;\n\n\t\t_skinIndex.fromBufferAttribute( geometry.attributes.skinIndex, index );\n\t\t_skinWeight.fromBufferAttribute( geometry.attributes.skinWeight, index );\n\n\t\t_basePosition.copy( target ).applyMatrix4( this.bindMatrix );\n\n\t\ttarget.set( 0, 0, 0 );\n\n\t\tfor ( let i = 0; i < 4; i ++ ) {\n\n\t\t\tconst weight = _skinWeight.getComponent( i );\n\n\t\t\tif ( weight !== 0 ) {\n\n\t\t\t\tconst boneIndex = _skinIndex.getComponent( i );\n\n\t\t\t\t_matrix4.multiplyMatrices( skeleton.bones[ boneIndex ].matrixWorld, skeleton.boneInverses[ boneIndex ] );\n\n\t\t\t\ttarget.addScaledVector( _vector3.copy( _basePosition ).applyMatrix4( _matrix4 ), weight );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn target.applyMatrix4( this.bindMatrixInverse );\n\n\t}\n\n}\n\n/**\n * A bone which is part of a {@link Skeleton}. The skeleton in turn is used by\n * the {@link SkinnedMesh}.\n *\n * ```js\n * const root = new THREE.Bone();\n * const child = new THREE.Bone();\n *\n * root.add( child );\n * child.position.y = 5;\n * ```\n *\n * @augments Object3D\n */\nclass Bone extends Object3D {\n\n\t/**\n\t * Constructs a new bone.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isBone = true;\n\n\t\tthis.type = 'Bone';\n\n\t}\n\n}\n\n/**\n * Creates a texture directly from raw buffer data.\n *\n * The interpretation of the data depends on type and format: If the type is\n * `UnsignedByteType`, a `Uint8Array` will be useful for addressing the\n * texel data. If the format is `RGBAFormat`, data needs four values for\n * one texel; Red, Green, Blue and Alpha (typically the opacity).\n *\n * @augments Texture\n */\nclass DataTexture extends Texture {\n\n\t/**\n\t * Constructs a new data texture.\n\t *\n\t * @param {?TypedArray} [data=null] - The buffer data.\n\t * @param {number} [width=1] - The width of the texture.\n\t * @param {number} [height=1] - The height of the texture.\n\t * @param {number} [format=RGBAFormat] - The texture format.\n\t * @param {number} [type=UnsignedByteType] - The texture type.\n\t * @param {number} [mapping=Texture.DEFAULT_MAPPING] - The texture mapping.\n\t * @param {number} [wrapS=ClampToEdgeWrapping] - The wrapS value.\n\t * @param {number} [wrapT=ClampToEdgeWrapping] - The wrapT value.\n\t * @param {number} [magFilter=NearestFilter] - The mag filter value.\n\t * @param {number} [minFilter=NearestFilter] - The min filter value.\n\t * @param {number} [anisotropy=Texture.DEFAULT_ANISOTROPY] - The anisotropy value.\n\t * @param {string} [colorSpace=NoColorSpace] - The color space.\n\t */\n\tconstructor( data = null, width = 1, height = 1, format, type, mapping, wrapS, wrapT, magFilter = NearestFilter, minFilter = NearestFilter, anisotropy, colorSpace ) {\n\n\t\tsuper( null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, colorSpace );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isDataTexture = true;\n\n\t\t/**\n\t\t * The image definition of a data texture.\n\t\t *\n\t\t * @type {{data:TypedArray,width:number,height:number}}\n\t\t */\n\t\tthis.image = { data: data, width: width, height: height };\n\n\t\t/**\n\t\t * Whether to generate mipmaps (if possible) for a texture.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.generateMipmaps = false;\n\n\t\t/**\n\t\t * If set to `true`, the texture is flipped along the vertical axis when\n\t\t * uploaded to the GPU.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.flipY = false;\n\n\t\t/**\n\t\t * Specifies the alignment requirements for the start of each pixel row in memory.\n\t\t *\n\t\t * Overwritten and set to `1` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default 1\n\t\t */\n\t\tthis.unpackAlignment = 1;\n\n\t}\n\n}\n\nconst _offsetMatrix = /*@__PURE__*/ new Matrix4();\nconst _identityMatrix = /*@__PURE__*/ new Matrix4();\n\n/**\n * Class for representing the armatures in `three.js`. The skeleton\n * is defined by a hierarchy of bones.\n *\n * ```js\n * const bones = [];\n *\n * const shoulder = new THREE.Bone();\n * const elbow = new THREE.Bone();\n * const hand = new THREE.Bone();\n *\n * shoulder.add( elbow );\n * elbow.add( hand );\n *\n * bones.push( shoulder , elbow, hand);\n *\n * shoulder.position.y = -5;\n * elbow.position.y = 0;\n * hand.position.y = 5;\n *\n * const armSkeleton = new THREE.Skeleton( bones );\n * ```\n */\nclass Skeleton {\n\n\t/**\n\t * Constructs a new skeleton.\n\t *\n\t * @param {Array<Bone>} [bones] - An array of bones.\n\t * @param {Array<Matrix4>} [boneInverses] - An array of bone inverse matrices.\n\t * If not provided, these matrices will be computed automatically via {@link Skeleton#calculateInverses}.\n\t */\n\tconstructor( bones = [], boneInverses = [] ) {\n\n\t\tthis.uuid = generateUUID();\n\n\t\t/**\n\t\t * An array of bones defining the skeleton.\n\t\t *\n\t\t * @type {Array<Bone>}\n\t\t */\n\t\tthis.bones = bones.slice( 0 );\n\n\t\t/**\n\t\t * An array of bone inverse matrices.\n\t\t *\n\t\t * @type {Array<Matrix4>}\n\t\t */\n\t\tthis.boneInverses = boneInverses;\n\n\t\t/**\n\t\t * An array buffer holding the bone data.\n\t\t * Input data for {@link Skeleton#boneTexture}.\n\t\t *\n\t\t * @type {?Float32Array}\n\t\t * @default null\n\t\t */\n\t\tthis.boneMatrices = null;\n\n\t\t/**\n\t\t * A texture holding the bone data for use\n\t\t * in the vertex shader.\n\t\t *\n\t\t * @type {?DataTexture}\n\t\t * @default null\n\t\t */\n\t\tthis.boneTexture = null;\n\n\t\tthis.init();\n\n\t}\n\n\t/**\n\t * Initializes the skeleton. This method gets automatically called by the constructor\n\t * but depending on how the skeleton is created it might be necessary to call this method\n\t * manually.\n\t */\n\tinit() {\n\n\t\tconst bones = this.bones;\n\t\tconst boneInverses = this.boneInverses;\n\n\t\tthis.boneMatrices = new Float32Array( bones.length * 16 );\n\n\t\t// calculate inverse bone matrices if necessary\n\n\t\tif ( boneInverses.length === 0 ) {\n\n\t\t\tthis.calculateInverses();\n\n\t\t} else {\n\n\t\t\t// handle special case\n\n\t\t\tif ( bones.length !== boneInverses.length ) {\n\n\t\t\t\twarn( 'Skeleton: Number of inverse bone matrices does not match amount of bones.' );\n\n\t\t\t\tthis.boneInverses = [];\n\n\t\t\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\t\t\tthis.boneInverses.push( new Matrix4() );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Computes the bone inverse matrices. This method resets {@link Skeleton#boneInverses}\n\t * and fills it with new matrices.\n\t */\n\tcalculateInverses() {\n\n\t\tthis.boneInverses.length = 0;\n\n\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\tconst inverse = new Matrix4();\n\n\t\t\tif ( this.bones[ i ] ) {\n\n\t\t\t\tinverse.copy( this.bones[ i ].matrixWorld ).invert();\n\n\t\t\t}\n\n\t\t\tthis.boneInverses.push( inverse );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Resets the skeleton to the base pose.\n\t */\n\tpose() {\n\n\t\t// recover the bind-time world matrices\n\n\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\tconst bone = this.bones[ i ];\n\n\t\t\tif ( bone ) {\n\n\t\t\t\tbone.matrixWorld.copy( this.boneInverses[ i ] ).invert();\n\n\t\t\t}\n\n\t\t}\n\n\t\t// compute the local matrices, positions, rotations and scales\n\n\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\tconst bone = this.bones[ i ];\n\n\t\t\tif ( bone ) {\n\n\t\t\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\t\t\tbone.matrix.copy( bone.parent.matrixWorld ).invert();\n\t\t\t\t\tbone.matrix.multiply( bone.matrixWorld );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbone.matrix.copy( bone.matrixWorld );\n\n\t\t\t\t}\n\n\t\t\t\tbone.matrix.decompose( bone.position, bone.quaternion, bone.scale );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Resets the skeleton to the base pose.\n\t */\n\tupdate() {\n\n\t\tconst bones = this.bones;\n\t\tconst boneInverses = this.boneInverses;\n\t\tconst boneMatrices = this.boneMatrices;\n\t\tconst boneTexture = this.boneTexture;\n\n\t\t// flatten bone matrices to array\n\n\t\tfor ( let i = 0, il = bones.length; i < il; i ++ ) {\n\n\t\t\t// compute the offset between the current and the original transform\n\n\t\t\tconst matrix = bones[ i ] ? bones[ i ].matrixWorld : _identityMatrix;\n\n\t\t\t_offsetMatrix.multiplyMatrices( matrix, boneInverses[ i ] );\n\t\t\t_offsetMatrix.toArray( boneMatrices, i * 16 );\n\n\t\t}\n\n\t\tif ( boneTexture !== null ) {\n\n\t\t\tboneTexture.needsUpdate = true;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns a new skeleton with copied values from this instance.\n\t *\n\t * @return {Skeleton} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new Skeleton( this.bones, this.boneInverses );\n\n\t}\n\n\t/**\n\t * Computes a data texture for passing bone data to the vertex shader.\n\t *\n\t * @return {Skeleton} A reference of this instance.\n\t */\n\tcomputeBoneTexture() {\n\n\t\t// layout (1 matrix = 4 pixels)\n\t\t//      RGBA RGBA RGBA RGBA (=> column1, column2, column3, column4)\n\t\t//  with  8x8  pixel texture max   16 bones * 4 pixels =  (8 * 8)\n\t\t//       16x16 pixel texture max   64 bones * 4 pixels = (16 * 16)\n\t\t//       32x32 pixel texture max  256 bones * 4 pixels = (32 * 32)\n\t\t//       64x64 pixel texture max 1024 bones * 4 pixels = (64 * 64)\n\n\t\tlet size = Math.sqrt( this.bones.length * 4 ); // 4 pixels needed for 1 matrix\n\t\tsize = Math.ceil( size / 4 ) * 4;\n\t\tsize = Math.max( size, 4 );\n\n\t\tconst boneMatrices = new Float32Array( size * size * 4 ); // 4 floats per RGBA pixel\n\t\tboneMatrices.set( this.boneMatrices ); // copy current values\n\n\t\tconst boneTexture = new DataTexture( boneMatrices, size, size, RGBAFormat, FloatType );\n\t\tboneTexture.needsUpdate = true;\n\n\t\tthis.boneMatrices = boneMatrices;\n\t\tthis.boneTexture = boneTexture;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Searches through the skeleton's bone array and returns the first with a\n\t * matching name.\n\t *\n\t * @param {string} name - The name of the bone.\n\t * @return {Bone|undefined} The found bone. `undefined` if no bone has been found.\n\t */\n\tgetBoneByName( name ) {\n\n\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\tconst bone = this.bones[ i ];\n\n\t\t\tif ( bone.name === name ) {\n\n\t\t\t\treturn bone;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn undefined;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose( ) {\n\n\t\tif ( this.boneTexture !== null ) {\n\n\t\t\tthis.boneTexture.dispose();\n\n\t\t\tthis.boneTexture = null;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Setups the skeleton by the given JSON and bones.\n\t *\n\t * @param {Object} json - The skeleton as serialized JSON.\n\t * @param {Object<string, Bone>} bones - An array of bones.\n\t * @return {Skeleton} A reference of this instance.\n\t */\n\tfromJSON( json, bones ) {\n\n\t\tthis.uuid = json.uuid;\n\n\t\tfor ( let i = 0, l = json.bones.length; i < l; i ++ ) {\n\n\t\t\tconst uuid = json.bones[ i ];\n\t\t\tlet bone = bones[ uuid ];\n\n\t\t\tif ( bone === undefined ) {\n\n\t\t\t\twarn( 'Skeleton: No bone found with UUID:', uuid );\n\t\t\t\tbone = new Bone();\n\n\t\t\t}\n\n\t\t\tthis.bones.push( bone );\n\t\t\tthis.boneInverses.push( new Matrix4().fromArray( json.boneInverses[ i ] ) );\n\n\t\t}\n\n\t\tthis.init();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Serializes the skeleton into JSON.\n\t *\n\t * @return {Object} A JSON object representing the serialized skeleton.\n\t * @see {@link ObjectLoader#parse}\n\t */\n\ttoJSON() {\n\n\t\tconst data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.7,\n\t\t\t\ttype: 'Skeleton',\n\t\t\t\tgenerator: 'Skeleton.toJSON'\n\t\t\t},\n\t\t\tbones: [],\n\t\t\tboneInverses: []\n\t\t};\n\n\t\tdata.uuid = this.uuid;\n\n\t\tconst bones = this.bones;\n\t\tconst boneInverses = this.boneInverses;\n\n\t\tfor ( let i = 0, l = bones.length; i < l; i ++ ) {\n\n\t\t\tconst bone = bones[ i ];\n\t\t\tdata.bones.push( bone.uuid );\n\n\t\t\tconst boneInverse = boneInverses[ i ];\n\t\t\tdata.boneInverses.push( boneInverse.toArray() );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * An instanced version of a buffer attribute.\n *\n * @augments BufferAttribute\n */\nclass InstancedBufferAttribute extends BufferAttribute {\n\n\t/**\n\t * Constructs a new instanced buffer attribute.\n\t *\n\t * @param {TypedArray} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t * @param {number} [meshPerAttribute=1] - How often a value of this buffer attribute should be repeated.\n\t */\n\tconstructor( array, itemSize, normalized, meshPerAttribute = 1 ) {\n\n\t\tsuper( array, itemSize, normalized );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isInstancedBufferAttribute = true;\n\n\t\t/**\n\t\t * Defines how often a value of this buffer attribute should be repeated. A\n\t\t * value of one means that each value of the instanced attribute is used for\n\t\t * a single instance. A value of two means that each value is used for two\n\t\t * consecutive instances (and so on).\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.meshPerAttribute = meshPerAttribute;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.meshPerAttribute = source.meshPerAttribute;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.meshPerAttribute = this.meshPerAttribute;\n\n\t\tdata.isInstancedBufferAttribute = true;\n\n\t\treturn data;\n\n\t}\n\n}\n\nconst _instanceLocalMatrix = /*@__PURE__*/ new Matrix4();\nconst _instanceWorldMatrix = /*@__PURE__*/ new Matrix4();\n\nconst _instanceIntersects = [];\n\nconst _box3 = /*@__PURE__*/ new Box3();\nconst _identity = /*@__PURE__*/ new Matrix4();\nconst _mesh$1 = /*@__PURE__*/ new Mesh();\nconst _sphere$4 = /*@__PURE__*/ new Sphere();\n\n/**\n * A special version of a mesh with instanced rendering support. Use\n * this class if you have to render a large number of objects with the same\n * geometry and material(s) but with different world transformations. The usage\n * of 'InstancedMesh' will help you to reduce the number of draw calls and thus\n * improve the overall rendering performance in your application.\n *\n * @augments Mesh\n */\nclass InstancedMesh extends Mesh {\n\n\t/**\n\t * Constructs a new instanced mesh.\n\t *\n\t * @param {BufferGeometry} [geometry] - The mesh geometry.\n\t * @param {Material|Array<Material>} [material] - The mesh material.\n\t * @param {number} count - The number of instances.\n\t */\n\tconstructor( geometry, material, count ) {\n\n\t\tsuper( geometry, material );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isInstancedMesh = true;\n\n\t\t/**\n\t\t * Represents the local transformation of all instances. You have to set its\n\t\t * {@link BufferAttribute#needsUpdate} flag to true if you modify instanced data\n\t\t * via {@link InstancedMesh#setMatrixAt}.\n\t\t *\n\t\t * @type {InstancedBufferAttribute}\n\t\t */\n\t\tthis.instanceMatrix = new InstancedBufferAttribute( new Float32Array( count * 16 ), 16 );\n\n\t\t/**\n\t\t * Represents the color of all instances. You have to set its\n\t\t * {@link BufferAttribute#needsUpdate} flag to true if you modify instanced data\n\t\t * via {@link InstancedMesh#setColorAt}.\n\t\t *\n\t\t * @type {?InstancedBufferAttribute}\n\t\t * @default null\n\t\t */\n\t\tthis.instanceColor = null;\n\n\t\t/**\n\t\t * Represents the morph target weights of all instances. You have to set its\n\t\t * {@link Texture#needsUpdate} flag to true if you modify instanced data\n\t\t * via {@link InstancedMesh#setMorphAt}.\n\t\t *\n\t\t * @type {?DataTexture}\n\t\t * @default null\n\t\t */\n\t\tthis.morphTexture = null;\n\n\t\t/**\n\t\t * The number of instances.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.count = count;\n\n\t\t/**\n\t\t * The bounding box of the instanced mesh. Can be computed via {@link InstancedMesh#computeBoundingBox}.\n\t\t *\n\t\t * @type {?Box3}\n\t\t * @default null\n\t\t */\n\t\tthis.boundingBox = null;\n\n\t\t/**\n\t\t * The bounding sphere of the instanced mesh. Can be computed via {@link InstancedMesh#computeBoundingSphere}.\n\t\t *\n\t\t * @type {?Sphere}\n\t\t * @default null\n\t\t */\n\t\tthis.boundingSphere = null;\n\n\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\tthis.setMatrixAt( i, _identity );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Computes the bounding box of the instanced mesh, and updates {@link InstancedMesh#boundingBox}.\n\t * The bounding box is not automatically computed by the engine; this method must be called by your app.\n\t * You may need to recompute the bounding box if an instance is transformed via {@link InstancedMesh#setMatrixAt}.\n\t */\n\tcomputeBoundingBox() {\n\n\t\tconst geometry = this.geometry;\n\t\tconst count = this.count;\n\n\t\tif ( this.boundingBox === null ) {\n\n\t\t\tthis.boundingBox = new Box3();\n\n\t\t}\n\n\t\tif ( geometry.boundingBox === null ) {\n\n\t\t\tgeometry.computeBoundingBox();\n\n\t\t}\n\n\t\tthis.boundingBox.makeEmpty();\n\n\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\tthis.getMatrixAt( i, _instanceLocalMatrix );\n\n\t\t\t_box3.copy( geometry.boundingBox ).applyMatrix4( _instanceLocalMatrix );\n\n\t\t\tthis.boundingBox.union( _box3 );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Computes the bounding sphere of the instanced mesh, and updates {@link InstancedMesh#boundingSphere}\n\t * The engine automatically computes the bounding sphere when it is needed, e.g., for ray casting or view frustum culling.\n\t * You may need to recompute the bounding sphere if an instance is transformed via {@link InstancedMesh#setMatrixAt}.\n\t */\n\tcomputeBoundingSphere() {\n\n\t\tconst geometry = this.geometry;\n\t\tconst count = this.count;\n\n\t\tif ( this.boundingSphere === null ) {\n\n\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t}\n\n\t\tif ( geometry.boundingSphere === null ) {\n\n\t\t\tgeometry.computeBoundingSphere();\n\n\t\t}\n\n\t\tthis.boundingSphere.makeEmpty();\n\n\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\tthis.getMatrixAt( i, _instanceLocalMatrix );\n\n\t\t\t_sphere$4.copy( geometry.boundingSphere ).applyMatrix4( _instanceLocalMatrix );\n\n\t\t\tthis.boundingSphere.union( _sphere$4 );\n\n\t\t}\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.instanceMatrix.copy( source.instanceMatrix );\n\n\t\tif ( source.morphTexture !== null ) this.morphTexture = source.morphTexture.clone();\n\t\tif ( source.instanceColor !== null ) this.instanceColor = source.instanceColor.clone();\n\n\t\tthis.count = source.count;\n\n\t\tif ( source.boundingBox !== null ) this.boundingBox = source.boundingBox.clone();\n\t\tif ( source.boundingSphere !== null ) this.boundingSphere = source.boundingSphere.clone();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Gets the color of the defined instance.\n\t *\n\t * @param {number} index - The instance index.\n\t * @param {Color} color - The target object that is used to store the method's result.\n\t */\n\tgetColorAt( index, color ) {\n\n\t\tcolor.fromArray( this.instanceColor.array, index * 3 );\n\n\t}\n\n\t/**\n\t * Gets the local transformation matrix of the defined instance.\n\t *\n\t * @param {number} index - The instance index.\n\t * @param {Matrix4} matrix - The target object that is used to store the method's result.\n\t */\n\tgetMatrixAt( index, matrix ) {\n\n\t\tmatrix.fromArray( this.instanceMatrix.array, index * 16 );\n\n\t}\n\n\t/**\n\t * Gets the morph target weights of the defined instance.\n\t *\n\t * @param {number} index - The instance index.\n\t * @param {Mesh} object - The target object that is used to store the method's result.\n\t */\n\tgetMorphAt( index, object ) {\n\n\t\tconst objectInfluences = object.morphTargetInfluences;\n\n\t\tconst array = this.morphTexture.source.data.data;\n\n\t\tconst len = objectInfluences.length + 1; // All influences + the baseInfluenceSum\n\n\t\tconst dataIndex = index * len + 1; // Skip the baseInfluenceSum at the beginning\n\n\t\tfor ( let i = 0; i < objectInfluences.length; i ++ ) {\n\n\t\t\tobjectInfluences[ i ] = array[ dataIndex + i ];\n\n\t\t}\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tconst matrixWorld = this.matrixWorld;\n\t\tconst raycastTimes = this.count;\n\n\t\t_mesh$1.geometry = this.geometry;\n\t\t_mesh$1.material = this.material;\n\n\t\tif ( _mesh$1.material === undefined ) return;\n\n\t\t// test with bounding sphere first\n\n\t\tif ( this.boundingSphere === null ) this.computeBoundingSphere();\n\n\t\t_sphere$4.copy( this.boundingSphere );\n\t\t_sphere$4.applyMatrix4( matrixWorld );\n\n\t\tif ( raycaster.ray.intersectsSphere( _sphere$4 ) === false ) return;\n\n\t\t// now test each instance\n\n\t\tfor ( let instanceId = 0; instanceId < raycastTimes; instanceId ++ ) {\n\n\t\t\t// calculate the world matrix for each instance\n\n\t\t\tthis.getMatrixAt( instanceId, _instanceLocalMatrix );\n\n\t\t\t_instanceWorldMatrix.multiplyMatrices( matrixWorld, _instanceLocalMatrix );\n\n\t\t\t// the mesh represents this single instance\n\n\t\t\t_mesh$1.matrixWorld = _instanceWorldMatrix;\n\n\t\t\t_mesh$1.raycast( raycaster, _instanceIntersects );\n\n\t\t\t// process the result of raycast\n\n\t\t\tfor ( let i = 0, l = _instanceIntersects.length; i < l; i ++ ) {\n\n\t\t\t\tconst intersect = _instanceIntersects[ i ];\n\t\t\t\tintersect.instanceId = instanceId;\n\t\t\t\tintersect.object = this;\n\t\t\t\tintersects.push( intersect );\n\n\t\t\t}\n\n\t\t\t_instanceIntersects.length = 0;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the given color to the defined instance. Make sure you set the `needsUpdate` flag of\n\t * {@link InstancedMesh#instanceColor} to `true` after updating all the colors.\n\t *\n\t * @param {number} index - The instance index.\n\t * @param {Color} color - The instance color.\n\t */\n\tsetColorAt( index, color ) {\n\n\t\tif ( this.instanceColor === null ) {\n\n\t\t\tthis.instanceColor = new InstancedBufferAttribute( new Float32Array( this.instanceMatrix.count * 3 ).fill( 1 ), 3 );\n\n\t\t}\n\n\t\tcolor.toArray( this.instanceColor.array, index * 3 );\n\n\t}\n\n\t/**\n\t * Sets the given local transformation matrix to the defined instance. Make sure you set the `needsUpdate` flag of\n\t * {@link InstancedMesh#instanceMatrix} to `true` after updating all the colors.\n\t *\n\t * @param {number} index - The instance index.\n\t * @param {Matrix4} matrix - The local transformation.\n\t */\n\tsetMatrixAt( index, matrix ) {\n\n\t\tmatrix.toArray( this.instanceMatrix.array, index * 16 );\n\n\t}\n\n\t/**\n\t * Sets the morph target weights to the defined instance. Make sure you set the `needsUpdate` flag of\n\t * {@link InstancedMesh#morphTexture} to `true` after updating all the influences.\n\t *\n\t * @param {number} index - The instance index.\n\t * @param {Mesh} object -  A mesh which `morphTargetInfluences` property containing the morph target weights\n\t * of a single instance.\n\t */\n\tsetMorphAt( index, object ) {\n\n\t\tconst objectInfluences = object.morphTargetInfluences;\n\n\t\tconst len = objectInfluences.length + 1; // morphBaseInfluence + all influences\n\n\t\tif ( this.morphTexture === null ) {\n\n\t\t\tthis.morphTexture = new DataTexture( new Float32Array( len * this.count ), len, this.count, RedFormat, FloatType );\n\n\t\t}\n\n\t\tconst array = this.morphTexture.source.data.data;\n\n\t\tlet morphInfluencesSum = 0;\n\n\t\tfor ( let i = 0; i < objectInfluences.length; i ++ ) {\n\n\t\t\tmorphInfluencesSum += objectInfluences[ i ];\n\n\t\t}\n\n\t\tconst morphBaseInfluence = this.geometry.morphTargetsRelative ? 1 : 1 - morphInfluencesSum;\n\n\t\tconst dataIndex = len * index;\n\n\t\tarray[ dataIndex ] = morphBaseInfluence;\n\n\t\tarray.set( objectInfluences, dataIndex + 1 );\n\n\t}\n\n\tupdateMorphTargets() {\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\tif ( this.morphTexture !== null ) {\n\n\t\t\tthis.morphTexture.dispose();\n\t\t\tthis.morphTexture = null;\n\n\t\t}\n\n\t}\n\n}\n\nconst _vector1 = /*@__PURE__*/ new Vector3();\nconst _vector2 = /*@__PURE__*/ new Vector3();\nconst _normalMatrix = /*@__PURE__*/ new Matrix3();\n\n/**\n * A two dimensional surface that extends infinitely in 3D space, represented\n * in [Hessian normal form](http://mathworld.wolfram.com/HessianNormalForm.html)\n * by a unit length normal vector and a constant.\n */\nclass Plane {\n\n\t/**\n\t * Constructs a new plane.\n\t *\n\t * @param {Vector3} [normal=(1,0,0)] - A unit length vector defining the normal of the plane.\n\t * @param {number} [constant=0] - The signed distance from the origin to the plane.\n\t */\n\tconstructor( normal = new Vector3( 1, 0, 0 ), constant = 0 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isPlane = true;\n\n\t\t/**\n\t\t * A unit length vector defining the normal of the plane.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.normal = normal;\n\n\t\t/**\n\t\t * The signed distance from the origin to the plane.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.constant = constant;\n\n\t}\n\n\t/**\n\t * Sets the plane components by copying the given values.\n\t *\n\t * @param {Vector3} normal - The normal.\n\t * @param {number} constant - The constant.\n\t * @return {Plane} A reference to this plane.\n\t */\n\tset( normal, constant ) {\n\n\t\tthis.normal.copy( normal );\n\t\tthis.constant = constant;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the plane components by defining `x`, `y`, `z` as the\n\t * plane normal and `w` as the constant.\n\t *\n\t * @param {number} x - The value for the normal's x component.\n\t * @param {number} y - The value for the normal's y component.\n\t * @param {number} z - The value for the normal's z component.\n\t * @param {number} w - The constant value.\n\t * @return {Plane} A reference to this plane.\n\t */\n\tsetComponents( x, y, z, w ) {\n\n\t\tthis.normal.set( x, y, z );\n\t\tthis.constant = w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the plane from the given normal and coplanar point (that is a point\n\t * that lies onto the plane).\n\t *\n\t * @param {Vector3} normal - The normal.\n\t * @param {Vector3} point - A coplanar point.\n\t * @return {Plane} A reference to this plane.\n\t */\n\tsetFromNormalAndCoplanarPoint( normal, point ) {\n\n\t\tthis.normal.copy( normal );\n\t\tthis.constant = - point.dot( this.normal );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the plane from three coplanar points. The winding order is\n\t * assumed to be counter-clockwise, and determines the direction of\n\t * the plane normal.\n\t *\n\t * @param {Vector3} a - The first coplanar point.\n\t * @param {Vector3} b - The second coplanar point.\n\t * @param {Vector3} c - The third coplanar point.\n\t * @return {Plane} A reference to this plane.\n\t */\n\tsetFromCoplanarPoints( a, b, c ) {\n\n\t\tconst normal = _vector1.subVectors( c, b ).cross( _vector2.subVectors( a, b ) ).normalize();\n\n\t\t// Q: should an error be thrown if normal is zero (e.g. degenerate plane)?\n\n\t\tthis.setFromNormalAndCoplanarPoint( normal, a );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the values of the given plane to this instance.\n\t *\n\t * @param {Plane} plane - The plane to copy.\n\t * @return {Plane} A reference to this plane.\n\t */\n\tcopy( plane ) {\n\n\t\tthis.normal.copy( plane.normal );\n\t\tthis.constant = plane.constant;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Normalizes the plane normal and adjusts the constant accordingly.\n\t *\n\t * @return {Plane} A reference to this plane.\n\t */\n\tnormalize() {\n\n\t\t// Note: will lead to a divide by zero if the plane is invalid.\n\n\t\tconst inverseNormalLength = 1.0 / this.normal.length();\n\t\tthis.normal.multiplyScalar( inverseNormalLength );\n\t\tthis.constant *= inverseNormalLength;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Negates both the plane normal and the constant.\n\t *\n\t * @return {Plane} A reference to this plane.\n\t */\n\tnegate() {\n\n\t\tthis.constant *= -1;\n\t\tthis.normal.negate();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the signed distance from the given point to this plane.\n\t *\n\t * @param {Vector3} point - The point to compute the distance for.\n\t * @return {number} The signed distance.\n\t */\n\tdistanceToPoint( point ) {\n\n\t\treturn this.normal.dot( point ) + this.constant;\n\n\t}\n\n\t/**\n\t * Returns the signed distance from the given sphere to this plane.\n\t *\n\t * @param {Sphere} sphere - The sphere to compute the distance for.\n\t * @return {number} The signed distance.\n\t */\n\tdistanceToSphere( sphere ) {\n\n\t\treturn this.distanceToPoint( sphere.center ) - sphere.radius;\n\n\t}\n\n\t/**\n\t * Projects a the given point onto the plane.\n\t *\n\t * @param {Vector3} point - The point to project.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The projected point on the plane.\n\t */\n\tprojectPoint( point, target ) {\n\n\t\treturn target.copy( point ).addScaledVector( this.normal, - this.distanceToPoint( point ) );\n\n\t}\n\n\t/**\n\t * Returns the intersection point of the passed line and the plane. Returns\n\t * `null` if the line does not intersect. Returns the line's starting point if\n\t * the line is coplanar with the plane.\n\t *\n\t * @param {Line3} line - The line to compute the intersection for.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {?Vector3} The intersection point.\n\t */\n\tintersectLine( line, target ) {\n\n\t\tconst direction = line.delta( _vector1 );\n\n\t\tconst denominator = this.normal.dot( direction );\n\n\t\tif ( denominator === 0 ) {\n\n\t\t\t// line is coplanar, return origin\n\t\t\tif ( this.distanceToPoint( line.start ) === 0 ) {\n\n\t\t\t\treturn target.copy( line.start );\n\n\t\t\t}\n\n\t\t\t// Unsure if this is the correct method to handle this case.\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst t = - ( line.start.dot( this.normal ) + this.constant ) / denominator;\n\n\t\tif ( t < 0 || t > 1 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\treturn target.copy( line.start ).addScaledVector( direction, t );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given line segment intersects with (passes through) the plane.\n\t *\n\t * @param {Line3} line - The line to test.\n\t * @return {boolean} Whether the given line segment intersects with the plane or not.\n\t */\n\tintersectsLine( line ) {\n\n\t\t// Note: this tests if a line intersects the plane, not whether it (or its end-points) are coplanar with it.\n\n\t\tconst startSign = this.distanceToPoint( line.start );\n\t\tconst endSign = this.distanceToPoint( line.end );\n\n\t\treturn ( startSign < 0 && endSign > 0 ) || ( endSign < 0 && startSign > 0 );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given bounding box intersects with the plane.\n\t *\n\t * @param {Box3} box - The bounding box to test.\n\t * @return {boolean} Whether the given bounding box intersects with the plane or not.\n\t */\n\tintersectsBox( box ) {\n\n\t\treturn box.intersectsPlane( this );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given bounding sphere intersects with the plane.\n\t *\n\t * @param {Sphere} sphere - The bounding sphere to test.\n\t * @return {boolean} Whether the given bounding sphere intersects with the plane or not.\n\t */\n\tintersectsSphere( sphere ) {\n\n\t\treturn sphere.intersectsPlane( this );\n\n\t}\n\n\t/**\n\t * Returns a coplanar vector to the plane, by calculating the\n\t * projection of the normal at the origin onto the plane.\n\t *\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The coplanar point.\n\t */\n\tcoplanarPoint( target ) {\n\n\t\treturn target.copy( this.normal ).multiplyScalar( - this.constant );\n\n\t}\n\n\t/**\n\t * Apply a 4x4 matrix to the plane. The matrix must be an affine, homogeneous transform.\n\t *\n\t * The optional normal matrix can be pre-computed like so:\n\t * ```js\n\t * const optionalNormalMatrix = new THREE.Matrix3().getNormalMatrix( matrix );\n\t * ```\n\t *\n\t * @param {Matrix4} matrix - The transformation matrix.\n\t * @param {Matrix4} [optionalNormalMatrix] - A pre-computed normal matrix.\n\t * @return {Plane} A reference to this plane.\n\t */\n\tapplyMatrix4( matrix, optionalNormalMatrix ) {\n\n\t\tconst normalMatrix = optionalNormalMatrix || _normalMatrix.getNormalMatrix( matrix );\n\n\t\tconst referencePoint = this.coplanarPoint( _vector1 ).applyMatrix4( matrix );\n\n\t\tconst normal = this.normal.applyMatrix3( normalMatrix ).normalize();\n\n\t\tthis.constant = - referencePoint.dot( normal );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Translates the plane by the distance defined by the given offset vector.\n\t * Note that this only affects the plane constant and will not affect the normal vector.\n\t *\n\t * @param {Vector3} offset - The offset vector.\n\t * @return {Plane} A reference to this plane.\n\t */\n\ttranslate( offset ) {\n\n\t\tthis.constant -= offset.dot( this.normal );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this plane is equal with the given one.\n\t *\n\t * @param {Plane} plane - The plane to test for equality.\n\t * @return {boolean} Whether this plane is equal with the given one.\n\t */\n\tequals( plane ) {\n\n\t\treturn plane.normal.equals( this.normal ) && ( plane.constant === this.constant );\n\n\t}\n\n\t/**\n\t * Returns a new plane with copied values from this instance.\n\t *\n\t * @return {Plane} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nconst _sphere$3 = /*@__PURE__*/ new Sphere();\nconst _defaultSpriteCenter = /*@__PURE__*/ new Vector2( 0.5, 0.5 );\nconst _vector$6 = /*@__PURE__*/ new Vector3();\n\n/**\n * Frustums are used to determine what is inside the camera's field of view.\n * They help speed up the rendering process - objects which lie outside a camera's\n * frustum can safely be excluded from rendering.\n *\n * This class is mainly intended for use internally by a renderer.\n */\nclass Frustum {\n\n\t/**\n\t * Constructs a new frustum.\n\t *\n\t * @param {Plane} [p0] - The first plane that encloses the frustum.\n\t * @param {Plane} [p1] - The second plane that encloses the frustum.\n\t * @param {Plane} [p2] - The third plane that encloses the frustum.\n\t * @param {Plane} [p3] - The fourth plane that encloses the frustum.\n\t * @param {Plane} [p4] - The fifth plane that encloses the frustum.\n\t * @param {Plane} [p5] - The sixth plane that encloses the frustum.\n\t */\n\tconstructor( p0 = new Plane(), p1 = new Plane(), p2 = new Plane(), p3 = new Plane(), p4 = new Plane(), p5 = new Plane() ) {\n\n\t\t/**\n\t\t * This array holds the planes that enclose the frustum.\n\t\t *\n\t\t * @type {Array<Plane>}\n\t\t */\n\t\tthis.planes = [ p0, p1, p2, p3, p4, p5 ];\n\n\t}\n\n\t/**\n\t * Sets the frustum planes by copying the given planes.\n\t *\n\t * @param {Plane} [p0] - The first plane that encloses the frustum.\n\t * @param {Plane} [p1] - The second plane that encloses the frustum.\n\t * @param {Plane} [p2] - The third plane that encloses the frustum.\n\t * @param {Plane} [p3] - The fourth plane that encloses the frustum.\n\t * @param {Plane} [p4] - The fifth plane that encloses the frustum.\n\t * @param {Plane} [p5] - The sixth plane that encloses the frustum.\n\t * @return {Frustum} A reference to this frustum.\n\t */\n\tset( p0, p1, p2, p3, p4, p5 ) {\n\n\t\tconst planes = this.planes;\n\n\t\tplanes[ 0 ].copy( p0 );\n\t\tplanes[ 1 ].copy( p1 );\n\t\tplanes[ 2 ].copy( p2 );\n\t\tplanes[ 3 ].copy( p3 );\n\t\tplanes[ 4 ].copy( p4 );\n\t\tplanes[ 5 ].copy( p5 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the values of the given frustum to this instance.\n\t *\n\t * @param {Frustum} frustum - The frustum to copy.\n\t * @return {Frustum} A reference to this frustum.\n\t */\n\tcopy( frustum ) {\n\n\t\tconst planes = this.planes;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tplanes[ i ].copy( frustum.planes[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the frustum planes from the given projection matrix.\n\t *\n\t * @param {Matrix4} m - The projection matrix.\n\t * @param {(WebGLCoordinateSystem|WebGPUCoordinateSystem)} coordinateSystem - The coordinate system.\n\t * @param {boolean} [reversedDepth=false] - Whether to use a reversed depth.\n\t * @return {Frustum} A reference to this frustum.\n\t */\n\tsetFromProjectionMatrix( m, coordinateSystem = WebGLCoordinateSystem, reversedDepth = false ) {\n\n\t\tconst planes = this.planes;\n\t\tconst me = m.elements;\n\t\tconst me0 = me[ 0 ], me1 = me[ 1 ], me2 = me[ 2 ], me3 = me[ 3 ];\n\t\tconst me4 = me[ 4 ], me5 = me[ 5 ], me6 = me[ 6 ], me7 = me[ 7 ];\n\t\tconst me8 = me[ 8 ], me9 = me[ 9 ], me10 = me[ 10 ], me11 = me[ 11 ];\n\t\tconst me12 = me[ 12 ], me13 = me[ 13 ], me14 = me[ 14 ], me15 = me[ 15 ];\n\n\t\tplanes[ 0 ].setComponents( me3 - me0, me7 - me4, me11 - me8, me15 - me12 ).normalize();\n\t\tplanes[ 1 ].setComponents( me3 + me0, me7 + me4, me11 + me8, me15 + me12 ).normalize();\n\t\tplanes[ 2 ].setComponents( me3 + me1, me7 + me5, me11 + me9, me15 + me13 ).normalize();\n\t\tplanes[ 3 ].setComponents( me3 - me1, me7 - me5, me11 - me9, me15 - me13 ).normalize();\n\n\t\tif ( reversedDepth ) {\n\n\t\t\tplanes[ 4 ].setComponents( me2, me6, me10, me14 ).normalize(); // far\n\t\t\tplanes[ 5 ].setComponents( me3 - me2, me7 - me6, me11 - me10, me15 - me14 ).normalize(); // near\n\n\t\t} else {\n\n\t\t\tplanes[ 4 ].setComponents( me3 - me2, me7 - me6, me11 - me10, me15 - me14 ).normalize(); // far\n\n\t\t\tif ( coordinateSystem === WebGLCoordinateSystem ) {\n\n\t\t\t\tplanes[ 5 ].setComponents( me3 + me2, me7 + me6, me11 + me10, me15 + me14 ).normalize(); // near\n\n\t\t\t} else if ( coordinateSystem === WebGPUCoordinateSystem ) {\n\n\t\t\t\tplanes[ 5 ].setComponents( me2, me6, me10, me14 ).normalize(); // near\n\n\t\t\t} else {\n\n\t\t\t\tthrow new Error( 'THREE.Frustum.setFromProjectionMatrix(): Invalid coordinate system: ' + coordinateSystem );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if the 3D object's bounding sphere is intersecting this frustum.\n\t *\n\t * Note that the 3D object must have a geometry so that the bounding sphere can be calculated.\n\t *\n\t * @param {Object3D} object - The 3D object to test.\n\t * @return {boolean} Whether the 3D object's bounding sphere is intersecting this frustum or not.\n\t */\n\tintersectsObject( object ) {\n\n\t\tif ( object.boundingSphere !== undefined ) {\n\n\t\t\tif ( object.boundingSphere === null ) object.computeBoundingSphere();\n\n\t\t\t_sphere$3.copy( object.boundingSphere ).applyMatrix4( object.matrixWorld );\n\n\t\t} else {\n\n\t\t\tconst geometry = object.geometry;\n\n\t\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t\t_sphere$3.copy( geometry.boundingSphere ).applyMatrix4( object.matrixWorld );\n\n\t\t}\n\n\t\treturn this.intersectsSphere( _sphere$3 );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given sprite is intersecting this frustum.\n\t *\n\t * @param {Sprite} sprite - The sprite to test.\n\t * @return {boolean} Whether the sprite is intersecting this frustum or not.\n\t */\n\tintersectsSprite( sprite ) {\n\n\t\t_sphere$3.center.set( 0, 0, 0 );\n\n\t\tconst offset = _defaultSpriteCenter.distanceTo( sprite.center );\n\n\t\t_sphere$3.radius = 0.7071067811865476 + offset;\n\t\t_sphere$3.applyMatrix4( sprite.matrixWorld );\n\n\t\treturn this.intersectsSphere( _sphere$3 );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given bounding sphere is intersecting this frustum.\n\t *\n\t * @param {Sphere} sphere - The bounding sphere to test.\n\t * @return {boolean} Whether the bounding sphere is intersecting this frustum or not.\n\t */\n\tintersectsSphere( sphere ) {\n\n\t\tconst planes = this.planes;\n\t\tconst center = sphere.center;\n\t\tconst negRadius = - sphere.radius;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tconst distance = planes[ i ].distanceToPoint( center );\n\n\t\t\tif ( distance < negRadius ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\t/**\n\t * Returns `true` if the given bounding box is intersecting this frustum.\n\t *\n\t * @param {Box3} box - The bounding box to test.\n\t * @return {boolean} Whether the bounding box is intersecting this frustum or not.\n\t */\n\tintersectsBox( box ) {\n\n\t\tconst planes = this.planes;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tconst plane = planes[ i ];\n\n\t\t\t// corner at max distance\n\n\t\t\t_vector$6.x = plane.normal.x > 0 ? box.max.x : box.min.x;\n\t\t\t_vector$6.y = plane.normal.y > 0 ? box.max.y : box.min.y;\n\t\t\t_vector$6.z = plane.normal.z > 0 ? box.max.z : box.min.z;\n\n\t\t\tif ( plane.distanceToPoint( _vector$6 ) < 0 ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\t/**\n\t * Returns `true` if the given point lies within the frustum.\n\t *\n\t * @param {Vector3} point - The point to test.\n\t * @return {boolean} Whether the point lies within this frustum or not.\n\t */\n\tcontainsPoint( point ) {\n\n\t\tconst planes = this.planes;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tif ( planes[ i ].distanceToPoint( point ) < 0 ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\t/**\n\t * Returns a new frustum with copied values from this instance.\n\t *\n\t * @return {Frustum} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nconst _projScreenMatrix$2 = /*@__PURE__*/ new Matrix4();\nconst _frustum$1 = /*@__PURE__*/ new Frustum();\n\n/**\n * FrustumArray is used to determine if an object is visible in at least one camera\n * from an array of cameras. This is particularly useful for multi-view renderers.\n*/\nclass FrustumArray {\n\n\t/**\n\t * Constructs a new frustum array.\n\t *\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * The coordinate system to use.\n\t\t *\n\t\t * @type {WebGLCoordinateSystem|WebGPUCoordinateSystem}\n\t\t * @default WebGLCoordinateSystem\n\t\t */\n\t\tthis.coordinateSystem = WebGLCoordinateSystem;\n\n\t}\n\n\t/**\n\t * Returns `true` if the 3D object's bounding sphere is intersecting any frustum\n\t * from the camera array.\n\t *\n\t * @param {Object3D} object - The 3D object to test.\n\t * @param {Object} cameraArray - An object with a cameras property containing an array of cameras.\n\t * @return {boolean} Whether the 3D object is visible in any camera.\n\t */\n\tintersectsObject( object, cameraArray ) {\n\n\t\tif ( ! cameraArray.isArrayCamera || cameraArray.cameras.length === 0 ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\tfor ( let i = 0; i < cameraArray.cameras.length; i ++ ) {\n\n\t\t\tconst camera = cameraArray.cameras[ i ];\n\n\t\t\t_projScreenMatrix$2.multiplyMatrices(\n\t\t\t\tcamera.projectionMatrix,\n\t\t\t\tcamera.matrixWorldInverse\n\t\t\t);\n\n\t\t\t_frustum$1.setFromProjectionMatrix(\n\t\t\t\t_projScreenMatrix$2,\n\t\t\t\tcamera.coordinateSystem,\n\t\t\t\tcamera.reversedDepth\n\t\t\t);\n\n\t\t\tif ( _frustum$1.intersectsObject( object ) ) {\n\n\t\t\t\treturn true; // Object is visible in at least one camera\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn false; // Not visible in any camera\n\n\t}\n\n\t/**\n\t * Returns `true` if the given sprite is intersecting any frustum\n\t * from the camera array.\n\t *\n\t * @param {Sprite} sprite - The sprite to test.\n\t * @param {Object} cameraArray - An object with a cameras property containing an array of cameras.\n\t * @return {boolean} Whether the sprite is visible in any camera.\n\t */\n\tintersectsSprite( sprite, cameraArray ) {\n\n\t\tif ( ! cameraArray || ! cameraArray.cameras || cameraArray.cameras.length === 0 ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\tfor ( let i = 0; i < cameraArray.cameras.length; i ++ ) {\n\n\t\t\tconst camera = cameraArray.cameras[ i ];\n\n\t\t\t_projScreenMatrix$2.multiplyMatrices(\n\t\t\t\tcamera.projectionMatrix,\n\t\t\t\tcamera.matrixWorldInverse\n\t\t\t);\n\n\t\t\t_frustum$1.setFromProjectionMatrix(\n\t\t\t\t_projScreenMatrix$2,\n\t\t\t\tcamera.coordinateSystem,\n\t\t\t\tcamera.reversedDepth\n\t\t\t);\n\n\t\t\tif ( _frustum$1.intersectsSprite( sprite ) ) {\n\n\t\t\t\treturn true; // Sprite is visible in at least one camera\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn false; // Not visible in any camera\n\n\t}\n\n\t/**\n\t * Returns `true` if the given bounding sphere is intersecting any frustum\n\t * from the camera array.\n\t *\n\t * @param {Sphere} sphere - The bounding sphere to test.\n\t * @param {Object} cameraArray - An object with a cameras property containing an array of cameras.\n\t * @return {boolean} Whether the sphere is visible in any camera.\n\t */\n\tintersectsSphere( sphere, cameraArray ) {\n\n\t\tif ( ! cameraArray || ! cameraArray.cameras || cameraArray.cameras.length === 0 ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\tfor ( let i = 0; i < cameraArray.cameras.length; i ++ ) {\n\n\t\t\tconst camera = cameraArray.cameras[ i ];\n\n\t\t\t_projScreenMatrix$2.multiplyMatrices(\n\t\t\t\tcamera.projectionMatrix,\n\t\t\t\tcamera.matrixWorldInverse\n\t\t\t);\n\n\t\t\t_frustum$1.setFromProjectionMatrix(\n\t\t\t\t_projScreenMatrix$2,\n\t\t\t\tcamera.coordinateSystem,\n\t\t\t\tcamera.reversedDepth\n\t\t\t);\n\n\t\t\tif ( _frustum$1.intersectsSphere( sphere ) ) {\n\n\t\t\t\treturn true; // Sphere is visible in at least one camera\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn false; // Not visible in any camera\n\n\t}\n\n\t/**\n\t * Returns `true` if the given bounding box is intersecting any frustum\n\t * from the camera array.\n\t *\n\t * @param {Box3} box - The bounding box to test.\n\t * @param {Object} cameraArray - An object with a cameras property containing an array of cameras.\n\t * @return {boolean} Whether the box is visible in any camera.\n\t */\n\tintersectsBox( box, cameraArray ) {\n\n\t\tif ( ! cameraArray || ! cameraArray.cameras || cameraArray.cameras.length === 0 ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\tfor ( let i = 0; i < cameraArray.cameras.length; i ++ ) {\n\n\t\t\tconst camera = cameraArray.cameras[ i ];\n\n\t\t\t_projScreenMatrix$2.multiplyMatrices(\n\t\t\t\tcamera.projectionMatrix,\n\t\t\t\tcamera.matrixWorldInverse\n\t\t\t);\n\n\t\t\t_frustum$1.setFromProjectionMatrix(\n\t\t\t\t_projScreenMatrix$2,\n\t\t\t\tcamera.coordinateSystem,\n\t\t\t\tcamera.reversedDepth\n\t\t\t);\n\n\t\t\tif ( _frustum$1.intersectsBox( box ) ) {\n\n\t\t\t\treturn true; // Box is visible in at least one camera\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn false; // Not visible in any camera\n\n\t}\n\n\t/**\n\t * Returns `true` if the given point lies within any frustum\n\t * from the camera array.\n\t *\n\t * @param {Vector3} point - The point to test.\n\t * @param {Object} cameraArray - An object with a cameras property containing an array of cameras.\n\t * @return {boolean} Whether the point is visible in any camera.\n\t */\n\tcontainsPoint( point, cameraArray ) {\n\n\t\tif ( ! cameraArray || ! cameraArray.cameras || cameraArray.cameras.length === 0 ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\tfor ( let i = 0; i < cameraArray.cameras.length; i ++ ) {\n\n\t\t\tconst camera = cameraArray.cameras[ i ];\n\n\t\t\t_projScreenMatrix$2.multiplyMatrices(\n\t\t\t\tcamera.projectionMatrix,\n\t\t\t\tcamera.matrixWorldInverse\n\t\t\t);\n\n\t\t\t_frustum$1.setFromProjectionMatrix(\n\t\t\t\t_projScreenMatrix$2,\n\t\t\t\tcamera.coordinateSystem,\n\t\t\t\tcamera.reversedDepth\n\t\t\t);\n\n\t\t\tif ( _frustum$1.containsPoint( point ) ) {\n\n\t\t\t\treturn true; // Point is visible in at least one camera\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn false; // Not visible in any camera\n\n\t}\n\n\t/**\n\t * Returns a new frustum array with copied values from this instance.\n\t *\n\t * @return {FrustumArray} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new FrustumArray();\n\n\t}\n\n}\n\nfunction ascIdSort( a, b ) {\n\n\treturn a - b;\n\n}\n\nfunction sortOpaque( a, b ) {\n\n\treturn a.z - b.z;\n\n}\n\nfunction sortTransparent( a, b ) {\n\n\treturn b.z - a.z;\n\n}\n\nclass MultiDrawRenderList {\n\n\tconstructor() {\n\n\t\tthis.index = 0;\n\t\tthis.pool = [];\n\t\tthis.list = [];\n\n\t}\n\n\tpush( start, count, z, index ) {\n\n\t\tconst pool = this.pool;\n\t\tconst list = this.list;\n\t\tif ( this.index >= pool.length ) {\n\n\t\t\tpool.push( {\n\n\t\t\t\tstart: -1,\n\t\t\t\tcount: -1,\n\t\t\t\tz: -1,\n\t\t\t\tindex: -1,\n\n\t\t\t} );\n\n\t\t}\n\n\t\tconst item = pool[ this.index ];\n\t\tlist.push( item );\n\t\tthis.index ++;\n\n\t\titem.start = start;\n\t\titem.count = count;\n\t\titem.z = z;\n\t\titem.index = index;\n\n\t}\n\n\treset() {\n\n\t\tthis.list.length = 0;\n\t\tthis.index = 0;\n\n\t}\n\n}\n\nconst _matrix$1 = /*@__PURE__*/ new Matrix4();\nconst _whiteColor = /*@__PURE__*/ new Color( 1, 1, 1 );\nconst _frustum = /*@__PURE__*/ new Frustum();\nconst _frustumArray = /*@__PURE__*/ new FrustumArray();\nconst _box$1 = /*@__PURE__*/ new Box3();\nconst _sphere$2 = /*@__PURE__*/ new Sphere();\nconst _vector$5 = /*@__PURE__*/ new Vector3();\nconst _forward$1 = /*@__PURE__*/ new Vector3();\nconst _temp = /*@__PURE__*/ new Vector3();\nconst _renderList = /*@__PURE__*/ new MultiDrawRenderList();\nconst _mesh = /*@__PURE__*/ new Mesh();\nconst _batchIntersects = [];\n\n// copies data from attribute \"src\" into \"target\" starting at \"targetOffset\"\nfunction copyAttributeData( src, target, targetOffset = 0 ) {\n\n\tconst itemSize = target.itemSize;\n\tif ( src.isInterleavedBufferAttribute || src.array.constructor !== target.array.constructor ) {\n\n\t\t// use the component getters and setters if the array data cannot\n\t\t// be copied directly\n\t\tconst vertexCount = src.count;\n\t\tfor ( let i = 0; i < vertexCount; i ++ ) {\n\n\t\t\tfor ( let c = 0; c < itemSize; c ++ ) {\n\n\t\t\t\ttarget.setComponent( i + targetOffset, c, src.getComponent( i, c ) );\n\n\t\t\t}\n\n\t\t}\n\n\t} else {\n\n\t\t// faster copy approach using typed array set function\n\t\ttarget.array.set( src.array, targetOffset * itemSize );\n\n\t}\n\n\ttarget.needsUpdate = true;\n\n}\n\n// safely copies array contents to a potentially smaller array\nfunction copyArrayContents( src, target ) {\n\n\tif ( src.constructor !== target.constructor ) {\n\n\t\t// if arrays are of a different type (eg due to index size increasing) then data must be per-element copied\n\t\tconst len = Math.min( src.length, target.length );\n\t\tfor ( let i = 0; i < len; i ++ ) {\n\n\t\t\ttarget[ i ] = src[ i ];\n\n\t\t}\n\n\t} else {\n\n\t\t// if the arrays use the same data layout we can use a fast block copy\n\t\tconst len = Math.min( src.length, target.length );\n\t\ttarget.set( new src.constructor( src.buffer, 0, len ) );\n\n\t}\n\n}\n\n/**\n * A special version of a mesh with multi draw batch rendering support. Use\n * this class if you have to render a large number of objects with the same\n * material but with different geometries or world transformations. The usage of\n * `BatchedMesh` will help you to reduce the number of draw calls and thus improve the overall\n * rendering performance in your application.\n *\n * ```js\n * const box = new THREE.BoxGeometry( 1, 1, 1 );\n * const sphere = new THREE.SphereGeometry( 1, 12, 12 );\n * const material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );\n *\n * // initialize and add geometries into the batched mesh\n * const batchedMesh = new BatchedMesh( 10, 5000, 10000, material );\n * const boxGeometryId = batchedMesh.addGeometry( box );\n * const sphereGeometryId = batchedMesh.addGeometry( sphere );\n *\n * // create instances of those geometries\n * const boxInstancedId1 = batchedMesh.addInstance( boxGeometryId );\n * const boxInstancedId2 = batchedMesh.addInstance( boxGeometryId );\n *\n * const sphereInstancedId1 = batchedMesh.addInstance( sphereGeometryId );\n * const sphereInstancedId2 = batchedMesh.addInstance( sphereGeometryId );\n *\n * // position the geometries\n * batchedMesh.setMatrixAt( boxInstancedId1, boxMatrix1 );\n * batchedMesh.setMatrixAt( boxInstancedId2, boxMatrix2 );\n *\n * batchedMesh.setMatrixAt( sphereInstancedId1, sphereMatrix1 );\n * batchedMesh.setMatrixAt( sphereInstancedId2, sphereMatrix2 );\n *\n * scene.add( batchedMesh );\n * ```\n *\n * @augments Mesh\n */\nclass BatchedMesh extends Mesh {\n\n\t/**\n\t * Constructs a new batched mesh.\n\t *\n\t * @param {number} maxInstanceCount - The maximum number of individual instances planned to be added and rendered.\n\t * @param {number} maxVertexCount - The maximum number of vertices to be used by all unique geometries.\n\t * @param {number} [maxIndexCount=maxVertexCount*2] - The maximum number of indices to be used by all unique geometries\n\t * @param {Material|Array<Material>} [material] - The mesh material.\n\t */\n\tconstructor( maxInstanceCount, maxVertexCount, maxIndexCount = maxVertexCount * 2, material ) {\n\n\t\tsuper( new BufferGeometry(), material );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isBatchedMesh = true;\n\n\t\t/**\n\t\t * When set ot `true`, the individual objects of a batch are frustum culled.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.perObjectFrustumCulled = true;\n\n\t\t/**\n\t\t * When set to `true`, the individual objects of a batch are sorted to improve overdraw-related artifacts.\n\t\t * If the material is marked as \"transparent\" objects are rendered back to front and if not then they are\n\t\t * rendered front to back.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.sortObjects = true;\n\n\t\t/**\n\t\t * The bounding box of the batched mesh. Can be computed via {@link BatchedMesh#computeBoundingBox}.\n\t\t *\n\t\t * @type {?Box3}\n\t\t * @default null\n\t\t */\n\t\tthis.boundingBox = null;\n\n\t\t/**\n\t\t * The bounding sphere of the batched mesh. Can be computed via {@link BatchedMesh#computeBoundingSphere}.\n\t\t *\n\t\t * @type {?Sphere}\n\t\t * @default null\n\t\t */\n\t\tthis.boundingSphere = null;\n\n\t\t/**\n\t\t * Takes a sort a function that is run before render. The function takes a list of instances to\n\t\t * sort and a camera. The objects in the list include a \"z\" field to perform a depth-ordered\n\t\t * sort with.\n\t\t *\n\t\t * @type {?Function}\n\t\t * @default null\n\t\t */\n\t\tthis.customSort = null;\n\n\t\t// stores visible, active, and geometry id per instance and reserved buffer ranges for geometries\n\t\tthis._instanceInfo = [];\n\t\tthis._geometryInfo = [];\n\n\t\t// instance, geometry ids that have been set as inactive, and are available to be overwritten\n\t\tthis._availableInstanceIds = [];\n\t\tthis._availableGeometryIds = [];\n\n\t\t// used to track where the next point is that geometry should be inserted\n\t\tthis._nextIndexStart = 0;\n\t\tthis._nextVertexStart = 0;\n\t\tthis._geometryCount = 0;\n\n\t\t// flags\n\t\tthis._visibilityChanged = true;\n\t\tthis._geometryInitialized = false;\n\n\t\t// cached user options\n\t\tthis._maxInstanceCount = maxInstanceCount;\n\t\tthis._maxVertexCount = maxVertexCount;\n\t\tthis._maxIndexCount = maxIndexCount;\n\n\t\t// buffers for multi draw\n\t\tthis._multiDrawCounts = new Int32Array( maxInstanceCount );\n\t\tthis._multiDrawStarts = new Int32Array( maxInstanceCount );\n\t\tthis._multiDrawCount = 0;\n\t\tthis._multiDrawInstances = null;\n\n\t\t// Local matrix per geometry by using data texture\n\t\tthis._matricesTexture = null;\n\t\tthis._indirectTexture = null;\n\t\tthis._colorsTexture = null;\n\n\t\tthis._initMatricesTexture();\n\t\tthis._initIndirectTexture();\n\n\t}\n\n\t/**\n\t * The maximum number of individual instances that can be stored in the batch.\n\t *\n\t * @type {number}\n\t * @readonly\n\t */\n\tget maxInstanceCount() {\n\n\t\treturn this._maxInstanceCount;\n\n\t}\n\n\t/**\n\t * The instance count.\n\t *\n\t * @type {number}\n\t * @readonly\n\t */\n\tget instanceCount() {\n\n\t\treturn this._instanceInfo.length - this._availableInstanceIds.length;\n\n\t}\n\n\t/**\n\t * The number of unused vertices.\n\t *\n\t * @type {number}\n\t * @readonly\n\t */\n\tget unusedVertexCount() {\n\n\t\treturn this._maxVertexCount - this._nextVertexStart;\n\n\t}\n\n\t/**\n\t * The number of unused indices.\n\t *\n\t * @type {number}\n\t * @readonly\n\t */\n\tget unusedIndexCount() {\n\n\t\treturn this._maxIndexCount - this._nextIndexStart;\n\n\t}\n\n\t_initMatricesTexture() {\n\n\t\t// layout (1 matrix = 4 pixels)\n\t\t//      RGBA RGBA RGBA RGBA (=> column1, column2, column3, column4)\n\t\t//  with  8x8  pixel texture max   16 matrices * 4 pixels =  (8 * 8)\n\t\t//       16x16 pixel texture max   64 matrices * 4 pixels = (16 * 16)\n\t\t//       32x32 pixel texture max  256 matrices * 4 pixels = (32 * 32)\n\t\t//       64x64 pixel texture max 1024 matrices * 4 pixels = (64 * 64)\n\n\t\tlet size = Math.sqrt( this._maxInstanceCount * 4 ); // 4 pixels needed for 1 matrix\n\t\tsize = Math.ceil( size / 4 ) * 4;\n\t\tsize = Math.max( size, 4 );\n\n\t\tconst matricesArray = new Float32Array( size * size * 4 ); // 4 floats per RGBA pixel\n\t\tconst matricesTexture = new DataTexture( matricesArray, size, size, RGBAFormat, FloatType );\n\n\t\tthis._matricesTexture = matricesTexture;\n\n\t}\n\n\t_initIndirectTexture() {\n\n\t\tlet size = Math.sqrt( this._maxInstanceCount );\n\t\tsize = Math.ceil( size );\n\n\t\tconst indirectArray = new Uint32Array( size * size );\n\t\tconst indirectTexture = new DataTexture( indirectArray, size, size, RedIntegerFormat, UnsignedIntType );\n\n\t\tthis._indirectTexture = indirectTexture;\n\n\t}\n\n\t_initColorsTexture() {\n\n\t\tlet size = Math.sqrt( this._maxInstanceCount );\n\t\tsize = Math.ceil( size );\n\n\t\t// 4 floats per RGBA pixel initialized to white\n\t\tconst colorsArray = new Float32Array( size * size * 4 ).fill( 1 );\n\t\tconst colorsTexture = new DataTexture( colorsArray, size, size, RGBAFormat, FloatType );\n\t\tcolorsTexture.colorSpace = ColorManagement.workingColorSpace;\n\n\t\tthis._colorsTexture = colorsTexture;\n\n\t}\n\n\t_initializeGeometry( reference ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst maxVertexCount = this._maxVertexCount;\n\t\tconst maxIndexCount = this._maxIndexCount;\n\t\tif ( this._geometryInitialized === false ) {\n\n\t\t\tfor ( const attributeName in reference.attributes ) {\n\n\t\t\t\tconst srcAttribute = reference.getAttribute( attributeName );\n\t\t\t\tconst { array, itemSize, normalized } = srcAttribute;\n\n\t\t\t\tconst dstArray = new array.constructor( maxVertexCount * itemSize );\n\t\t\t\tconst dstAttribute = new BufferAttribute( dstArray, itemSize, normalized );\n\n\t\t\t\tgeometry.setAttribute( attributeName, dstAttribute );\n\n\t\t\t}\n\n\t\t\tif ( reference.getIndex() !== null ) {\n\n\t\t\t\t// Reserve last u16 index for primitive restart.\n\t\t\t\tconst indexArray = maxVertexCount > 65535\n\t\t\t\t\t? new Uint32Array( maxIndexCount )\n\t\t\t\t\t: new Uint16Array( maxIndexCount );\n\n\t\t\t\tgeometry.setIndex( new BufferAttribute( indexArray, 1 ) );\n\n\t\t\t}\n\n\t\t\tthis._geometryInitialized = true;\n\n\t\t}\n\n\t}\n\n\t// Make sure the geometry is compatible with the existing combined geometry attributes\n\t_validateGeometry( geometry ) {\n\n\t\t// check to ensure the geometries are using consistent attributes and indices\n\t\tconst batchGeometry = this.geometry;\n\t\tif ( Boolean( geometry.getIndex() ) !== Boolean( batchGeometry.getIndex() ) ) {\n\n\t\t\tthrow new Error( 'THREE.BatchedMesh: All geometries must consistently have \"index\".' );\n\n\t\t}\n\n\t\tfor ( const attributeName in batchGeometry.attributes ) {\n\n\t\t\tif ( ! geometry.hasAttribute( attributeName ) ) {\n\n\t\t\t\tthrow new Error( `THREE.BatchedMesh: Added geometry missing \"${ attributeName }\". All geometries must have consistent attributes.` );\n\n\t\t\t}\n\n\t\t\tconst srcAttribute = geometry.getAttribute( attributeName );\n\t\t\tconst dstAttribute = batchGeometry.getAttribute( attributeName );\n\t\t\tif ( srcAttribute.itemSize !== dstAttribute.itemSize || srcAttribute.normalized !== dstAttribute.normalized ) {\n\n\t\t\t\tthrow new Error( 'THREE.BatchedMesh: All attributes must have a consistent itemSize and normalized value.' );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Validates the instance defined by the given ID.\n\t *\n\t * @param {number} instanceId - The instance to validate.\n\t */\n\tvalidateInstanceId( instanceId ) {\n\n\t\tconst instanceInfo = this._instanceInfo;\n\t\tif ( instanceId < 0 || instanceId >= instanceInfo.length || instanceInfo[ instanceId ].active === false ) {\n\n\t\t\tthrow new Error( `THREE.BatchedMesh: Invalid instanceId ${instanceId}. Instance is either out of range or has been deleted.` );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Validates the geometry defined by the given ID.\n\t *\n\t * @param {number} geometryId - The geometry to validate.\n\t */\n\tvalidateGeometryId( geometryId ) {\n\n\t\tconst geometryInfoList = this._geometryInfo;\n\t\tif ( geometryId < 0 || geometryId >= geometryInfoList.length || geometryInfoList[ geometryId ].active === false ) {\n\n\t\t\tthrow new Error( `THREE.BatchedMesh: Invalid geometryId ${geometryId}. Geometry is either out of range or has been deleted.` );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Takes a sort a function that is run before render. The function takes a list of instances to\n\t * sort and a camera. The objects in the list include a \"z\" field to perform a depth-ordered sort with.\n\t *\n\t * @param {Function} func - The custom sort function.\n\t * @return {BatchedMesh} A reference to this batched mesh.\n\t */\n\tsetCustomSort( func ) {\n\n\t\tthis.customSort = func;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes the bounding box, updating {@link BatchedMesh#boundingBox}.\n\t * Bounding boxes aren't computed by default. They need to be explicitly computed,\n\t * otherwise they are `null`.\n\t */\n\tcomputeBoundingBox() {\n\n\t\tif ( this.boundingBox === null ) {\n\n\t\t\tthis.boundingBox = new Box3();\n\n\t\t}\n\n\t\tconst boundingBox = this.boundingBox;\n\t\tconst instanceInfo = this._instanceInfo;\n\n\t\tboundingBox.makeEmpty();\n\t\tfor ( let i = 0, l = instanceInfo.length; i < l; i ++ ) {\n\n\t\t\tif ( instanceInfo[ i ].active === false ) continue;\n\n\t\t\tconst geometryId = instanceInfo[ i ].geometryIndex;\n\t\t\tthis.getMatrixAt( i, _matrix$1 );\n\t\t\tthis.getBoundingBoxAt( geometryId, _box$1 ).applyMatrix4( _matrix$1 );\n\t\t\tboundingBox.union( _box$1 );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Computes the bounding sphere, updating {@link BatchedMesh#boundingSphere}.\n\t * Bounding spheres aren't computed by default. They need to be explicitly computed,\n\t * otherwise they are `null`.\n\t */\n\tcomputeBoundingSphere() {\n\n\t\tif ( this.boundingSphere === null ) {\n\n\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t}\n\n\t\tconst boundingSphere = this.boundingSphere;\n\t\tconst instanceInfo = this._instanceInfo;\n\n\t\tboundingSphere.makeEmpty();\n\t\tfor ( let i = 0, l = instanceInfo.length; i < l; i ++ ) {\n\n\t\t\tif ( instanceInfo[ i ].active === false ) continue;\n\n\t\t\tconst geometryId = instanceInfo[ i ].geometryIndex;\n\t\t\tthis.getMatrixAt( i, _matrix$1 );\n\t\t\tthis.getBoundingSphereAt( geometryId, _sphere$2 ).applyMatrix4( _matrix$1 );\n\t\t\tboundingSphere.union( _sphere$2 );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Adds a new instance to the batch using the geometry of the given ID and returns\n\t * a new id referring to the new instance to be used by other functions.\n\t *\n\t * @param {number} geometryId - The ID of a previously added geometry via {@link BatchedMesh#addGeometry}.\n\t * @return {number} The instance ID.\n\t */\n\taddInstance( geometryId ) {\n\n\t\tconst atCapacity = this._instanceInfo.length >= this.maxInstanceCount;\n\n\t\t// ensure we're not over geometry\n\t\tif ( atCapacity && this._availableInstanceIds.length === 0 ) {\n\n\t\t\tthrow new Error( 'THREE.BatchedMesh: Maximum item count reached.' );\n\n\t\t}\n\n\t\tconst instanceInfo = {\n\t\t\tvisible: true,\n\t\t\tactive: true,\n\t\t\tgeometryIndex: geometryId,\n\t\t};\n\n\t\tlet drawId = null;\n\n\t\t// Prioritize using previously freed instance ids\n\t\tif ( this._availableInstanceIds.length > 0 ) {\n\n\t\t\tthis._availableInstanceIds.sort( ascIdSort );\n\n\t\t\tdrawId = this._availableInstanceIds.shift();\n\t\t\tthis._instanceInfo[ drawId ] = instanceInfo;\n\n\t\t} else {\n\n\t\t\tdrawId = this._instanceInfo.length;\n\t\t\tthis._instanceInfo.push( instanceInfo );\n\n\t\t}\n\n\t\tconst matricesTexture = this._matricesTexture;\n\t\t_matrix$1.identity().toArray( matricesTexture.image.data, drawId * 16 );\n\t\tmatricesTexture.needsUpdate = true;\n\n\t\tconst colorsTexture = this._colorsTexture;\n\t\tif ( colorsTexture ) {\n\n\t\t\t_whiteColor.toArray( colorsTexture.image.data, drawId * 4 );\n\t\t\tcolorsTexture.needsUpdate = true;\n\n\t\t}\n\n\t\tthis._visibilityChanged = true;\n\t\treturn drawId;\n\n\t}\n\n\t/**\n\t * Adds the given geometry to the batch and returns the associated\n\t * geometry id referring to it to be used in other functions.\n\t *\n\t * @param {BufferGeometry} geometry - The geometry to add.\n\t * @param {number} [reservedVertexCount=-1] - Optional parameter specifying the amount of\n\t * vertex buffer space to reserve for the added geometry. This is necessary if it is planned\n\t * to set a new geometry at this index at a later time that is larger than the original geometry.\n\t * Defaults to the length of the given geometry vertex buffer.\n\t * @param {number} [reservedIndexCount=-1] - Optional parameter specifying the amount of index\n\t * buffer space to reserve for the added geometry. This is necessary if it is planned to set a\n\t * new geometry at this index at a later time that is larger than the original geometry. Defaults to\n\t * the length of the given geometry index buffer.\n\t * @return {number} The geometry ID.\n\t */\n\taddGeometry( geometry, reservedVertexCount = -1, reservedIndexCount = -1 ) {\n\n\t\tthis._initializeGeometry( geometry );\n\n\t\tthis._validateGeometry( geometry );\n\n\t\tconst geometryInfo = {\n\t\t\t// geometry information\n\t\t\tvertexStart: -1,\n\t\t\tvertexCount: -1,\n\t\t\treservedVertexCount: -1,\n\n\t\t\tindexStart: -1,\n\t\t\tindexCount: -1,\n\t\t\treservedIndexCount: -1,\n\n\t\t\t// draw range information\n\t\t\tstart: -1,\n\t\t\tcount: -1,\n\n\t\t\t// state\n\t\t\tboundingBox: null,\n\t\t\tboundingSphere: null,\n\t\t\tactive: true,\n\t\t};\n\n\t\tconst geometryInfoList = this._geometryInfo;\n\t\tgeometryInfo.vertexStart = this._nextVertexStart;\n\t\tgeometryInfo.reservedVertexCount = reservedVertexCount === -1 ? geometry.getAttribute( 'position' ).count : reservedVertexCount;\n\n\t\tconst index = geometry.getIndex();\n\t\tconst hasIndex = index !== null;\n\t\tif ( hasIndex ) {\n\n\t\t\tgeometryInfo.indexStart = this._nextIndexStart;\n\t\t\tgeometryInfo.reservedIndexCount = reservedIndexCount === -1 ? index.count : reservedIndexCount;\n\n\t\t}\n\n\t\tif (\n\t\t\tgeometryInfo.indexStart !== -1 &&\n\t\t\tgeometryInfo.indexStart + geometryInfo.reservedIndexCount > this._maxIndexCount ||\n\t\t\tgeometryInfo.vertexStart + geometryInfo.reservedVertexCount > this._maxVertexCount\n\t\t) {\n\n\t\t\tthrow new Error( 'THREE.BatchedMesh: Reserved space request exceeds the maximum buffer size.' );\n\n\t\t}\n\n\t\t// update id\n\t\tlet geometryId;\n\t\tif ( this._availableGeometryIds.length > 0 ) {\n\n\t\t\tthis._availableGeometryIds.sort( ascIdSort );\n\n\t\t\tgeometryId = this._availableGeometryIds.shift();\n\t\t\tgeometryInfoList[ geometryId ] = geometryInfo;\n\n\n\t\t} else {\n\n\t\t\tgeometryId = this._geometryCount;\n\t\t\tthis._geometryCount ++;\n\t\t\tgeometryInfoList.push( geometryInfo );\n\n\t\t}\n\n\t\t// update the geometry\n\t\tthis.setGeometryAt( geometryId, geometry );\n\n\t\t// increment the next geometry position\n\t\tthis._nextIndexStart = geometryInfo.indexStart + geometryInfo.reservedIndexCount;\n\t\tthis._nextVertexStart = geometryInfo.vertexStart + geometryInfo.reservedVertexCount;\n\n\t\treturn geometryId;\n\n\t}\n\n\t/**\n\t * Replaces the geometry at the given ID with the provided geometry. Throws an error if there\n\t * is not enough space reserved for geometry. Calling this will change all instances that are\n\t * rendering that geometry.\n\t *\n\t * @param {number} geometryId - The ID of the geometry that should be replaced with the given geometry.\n\t * @param {BufferGeometry} geometry - The new geometry.\n\t * @return {number} The geometry ID.\n\t */\n\tsetGeometryAt( geometryId, geometry ) {\n\n\t\tif ( geometryId >= this._geometryCount ) {\n\n\t\t\tthrow new Error( 'THREE.BatchedMesh: Maximum geometry count reached.' );\n\n\t\t}\n\n\t\tthis._validateGeometry( geometry );\n\n\t\tconst batchGeometry = this.geometry;\n\t\tconst hasIndex = batchGeometry.getIndex() !== null;\n\t\tconst dstIndex = batchGeometry.getIndex();\n\t\tconst srcIndex = geometry.getIndex();\n\t\tconst geometryInfo = this._geometryInfo[ geometryId ];\n\t\tif (\n\t\t\thasIndex &&\n\t\t\tsrcIndex.count > geometryInfo.reservedIndexCount ||\n\t\t\tgeometry.attributes.position.count > geometryInfo.reservedVertexCount\n\t\t) {\n\n\t\t\tthrow new Error( 'THREE.BatchedMesh: Reserved space not large enough for provided geometry.' );\n\n\t\t}\n\n\t\t// copy geometry buffer data over\n\t\tconst vertexStart = geometryInfo.vertexStart;\n\t\tconst reservedVertexCount = geometryInfo.reservedVertexCount;\n\t\tgeometryInfo.vertexCount = geometry.getAttribute( 'position' ).count;\n\n\t\tfor ( const attributeName in batchGeometry.attributes ) {\n\n\t\t\t// copy attribute data\n\t\t\tconst srcAttribute = geometry.getAttribute( attributeName );\n\t\t\tconst dstAttribute = batchGeometry.getAttribute( attributeName );\n\t\t\tcopyAttributeData( srcAttribute, dstAttribute, vertexStart );\n\n\t\t\t// fill the rest in with zeroes\n\t\t\tconst itemSize = srcAttribute.itemSize;\n\t\t\tfor ( let i = srcAttribute.count, l = reservedVertexCount; i < l; i ++ ) {\n\n\t\t\t\tconst index = vertexStart + i;\n\t\t\t\tfor ( let c = 0; c < itemSize; c ++ ) {\n\n\t\t\t\t\tdstAttribute.setComponent( index, c, 0 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tdstAttribute.needsUpdate = true;\n\t\t\tdstAttribute.addUpdateRange( vertexStart * itemSize, reservedVertexCount * itemSize );\n\n\t\t}\n\n\t\t// copy index\n\t\tif ( hasIndex ) {\n\n\t\t\tconst indexStart = geometryInfo.indexStart;\n\t\t\tconst reservedIndexCount = geometryInfo.reservedIndexCount;\n\t\t\tgeometryInfo.indexCount = geometry.getIndex().count;\n\n\t\t\t// copy index data over\n\t\t\tfor ( let i = 0; i < srcIndex.count; i ++ ) {\n\n\t\t\t\tdstIndex.setX( indexStart + i, vertexStart + srcIndex.getX( i ) );\n\n\t\t\t}\n\n\t\t\t// fill the rest in with zeroes\n\t\t\tfor ( let i = srcIndex.count, l = reservedIndexCount; i < l; i ++ ) {\n\n\t\t\t\tdstIndex.setX( indexStart + i, vertexStart );\n\n\t\t\t}\n\n\t\t\tdstIndex.needsUpdate = true;\n\t\t\tdstIndex.addUpdateRange( indexStart, geometryInfo.reservedIndexCount );\n\n\t\t}\n\n\t\t// update the draw range\n\t\tgeometryInfo.start = hasIndex ? geometryInfo.indexStart : geometryInfo.vertexStart;\n\t\tgeometryInfo.count = hasIndex ? geometryInfo.indexCount : geometryInfo.vertexCount;\n\n\t\t// store the bounding boxes\n\t\tgeometryInfo.boundingBox = null;\n\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\tgeometryInfo.boundingBox = geometry.boundingBox.clone();\n\n\t\t}\n\n\t\tgeometryInfo.boundingSphere = null;\n\t\tif ( geometry.boundingSphere !== null ) {\n\n\t\t\tgeometryInfo.boundingSphere = geometry.boundingSphere.clone();\n\n\t\t}\n\n\t\tthis._visibilityChanged = true;\n\t\treturn geometryId;\n\n\t}\n\n\t/**\n\t * Deletes the geometry defined by the given ID from this batch. Any instances referencing\n\t * this geometry will also be removed as a side effect.\n\t *\n\t * @param {number} geometryId - The ID of the geometry to remove from the batch.\n\t * @return {BatchedMesh} A reference to this batched mesh.\n\t */\n\tdeleteGeometry( geometryId ) {\n\n\t\tconst geometryInfoList = this._geometryInfo;\n\t\tif ( geometryId >= geometryInfoList.length || geometryInfoList[ geometryId ].active === false ) {\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\t// delete any instances associated with this geometry\n\t\tconst instanceInfo = this._instanceInfo;\n\t\tfor ( let i = 0, l = instanceInfo.length; i < l; i ++ ) {\n\n\t\t\tif ( instanceInfo[ i ].active && instanceInfo[ i ].geometryIndex === geometryId ) {\n\n\t\t\t\tthis.deleteInstance( i );\n\n\t\t\t}\n\n\t\t}\n\n\t\tgeometryInfoList[ geometryId ].active = false;\n\t\tthis._availableGeometryIds.push( geometryId );\n\t\tthis._visibilityChanged = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Deletes an existing instance from the batch using the given ID.\n\t *\n\t * @param {number} instanceId - The ID of the instance to remove from the batch.\n\t * @return {BatchedMesh} A reference to this batched mesh.\n\t */\n\tdeleteInstance( instanceId ) {\n\n\t\tthis.validateInstanceId( instanceId );\n\n\t\tthis._instanceInfo[ instanceId ].active = false;\n\t\tthis._availableInstanceIds.push( instanceId );\n\t\tthis._visibilityChanged = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Repacks the sub geometries in [name] to remove any unused space remaining from\n\t * previously deleted geometry, freeing up space to add new geometry.\n\t *\n\t * @param {number} instanceId - The ID of the instance to remove from the batch.\n\t * @return {BatchedMesh} A reference to this batched mesh.\n\t */\n\toptimize() {\n\n\t\t// track the next indices to copy data to\n\t\tlet nextVertexStart = 0;\n\t\tlet nextIndexStart = 0;\n\n\t\t// Iterate over all geometry ranges in order sorted from earliest in the geometry buffer to latest\n\t\t// in the geometry buffer. Because draw range objects can be reused there is no guarantee of their order.\n\t\tconst geometryInfoList = this._geometryInfo;\n\t\tconst indices = geometryInfoList\n\t\t\t.map( ( e, i ) => i )\n\t\t\t.sort( ( a, b ) => {\n\n\t\t\t\treturn geometryInfoList[ a ].vertexStart - geometryInfoList[ b ].vertexStart;\n\n\t\t\t} );\n\n\t\tconst geometry = this.geometry;\n\t\tfor ( let i = 0, l = geometryInfoList.length; i < l; i ++ ) {\n\n\t\t\t// if a geometry range is inactive then don't copy anything\n\t\t\tconst index = indices[ i ];\n\t\t\tconst geometryInfo = geometryInfoList[ index ];\n\t\t\tif ( geometryInfo.active === false ) {\n\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\t// if a geometry contains an index buffer then shift it, as well\n\t\t\tif ( geometry.index !== null ) {\n\n\t\t\t\tif ( geometryInfo.indexStart !== nextIndexStart ) {\n\n\t\t\t\t\tconst { indexStart, vertexStart, reservedIndexCount } = geometryInfo;\n\t\t\t\t\tconst index = geometry.index;\n\t\t\t\t\tconst array = index.array;\n\n\t\t\t\t\t// shift the index pointers based on how the vertex data will shift\n\t\t\t\t\t// adjusting the index must happen first so the original vertex start value is available\n\t\t\t\t\tconst elementDelta = nextVertexStart - vertexStart;\n\t\t\t\t\tfor ( let j = indexStart; j < indexStart + reservedIndexCount; j ++ ) {\n\n\t\t\t\t\t\tarray[ j ] = array[ j ] + elementDelta;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tindex.array.copyWithin( nextIndexStart, indexStart, indexStart + reservedIndexCount );\n\t\t\t\t\tindex.addUpdateRange( nextIndexStart, reservedIndexCount );\n\n\t\t\t\t\tgeometryInfo.indexStart = nextIndexStart;\n\n\t\t\t\t}\n\n\t\t\t\tnextIndexStart += geometryInfo.reservedIndexCount;\n\n\t\t\t}\n\n\t\t\t// if a geometry needs to be moved then copy attribute data to overwrite unused space\n\t\t\tif ( geometryInfo.vertexStart !== nextVertexStart ) {\n\n\t\t\t\tconst { vertexStart, reservedVertexCount } = geometryInfo;\n\t\t\t\tconst attributes = geometry.attributes;\n\t\t\t\tfor ( const key in attributes ) {\n\n\t\t\t\t\tconst attribute = attributes[ key ];\n\t\t\t\t\tconst { array, itemSize } = attribute;\n\t\t\t\t\tarray.copyWithin( nextVertexStart * itemSize, vertexStart * itemSize, ( vertexStart + reservedVertexCount ) * itemSize );\n\t\t\t\t\tattribute.addUpdateRange( nextVertexStart * itemSize, reservedVertexCount * itemSize );\n\n\t\t\t\t}\n\n\t\t\t\tgeometryInfo.vertexStart = nextVertexStart;\n\n\t\t\t}\n\n\t\t\tnextVertexStart += geometryInfo.reservedVertexCount;\n\t\t\tgeometryInfo.start = geometry.index ? geometryInfo.indexStart : geometryInfo.vertexStart;\n\n\t\t\t// step the next geometry points to the shifted position\n\t\t\tthis._nextIndexStart = geometry.index ? geometryInfo.indexStart + geometryInfo.reservedIndexCount : 0;\n\t\t\tthis._nextVertexStart = geometryInfo.vertexStart + geometryInfo.reservedVertexCount;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the bounding box for the given geometry.\n\t *\n\t * @param {number} geometryId - The ID of the geometry to return the bounding box for.\n\t * @param {Box3} target - The target object that is used to store the method's result.\n\t * @return {?Box3} The geometry's bounding box. Returns `null` if no geometry has been found for the given ID.\n\t */\n\tgetBoundingBoxAt( geometryId, target ) {\n\n\t\tif ( geometryId >= this._geometryCount ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// compute bounding box\n\t\tconst geometry = this.geometry;\n\t\tconst geometryInfo = this._geometryInfo[ geometryId ];\n\t\tif ( geometryInfo.boundingBox === null ) {\n\n\t\t\tconst box = new Box3();\n\t\t\tconst index = geometry.index;\n\t\t\tconst position = geometry.attributes.position;\n\t\t\tfor ( let i = geometryInfo.start, l = geometryInfo.start + geometryInfo.count; i < l; i ++ ) {\n\n\t\t\t\tlet iv = i;\n\t\t\t\tif ( index ) {\n\n\t\t\t\t\tiv = index.getX( iv );\n\n\t\t\t\t}\n\n\t\t\t\tbox.expandByPoint( _vector$5.fromBufferAttribute( position, iv ) );\n\n\t\t\t}\n\n\t\t\tgeometryInfo.boundingBox = box;\n\n\t\t}\n\n\t\ttarget.copy( geometryInfo.boundingBox );\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Returns the bounding sphere for the given geometry.\n\t *\n\t * @param {number} geometryId - The ID of the geometry to return the bounding sphere for.\n\t * @param {Sphere} target - The target object that is used to store the method's result.\n\t * @return {?Sphere} The geometry's bounding sphere. Returns `null` if no geometry has been found for the given ID.\n\t */\n\tgetBoundingSphereAt( geometryId, target ) {\n\n\t\tif ( geometryId >= this._geometryCount ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// compute bounding sphere\n\t\tconst geometry = this.geometry;\n\t\tconst geometryInfo = this._geometryInfo[ geometryId ];\n\t\tif ( geometryInfo.boundingSphere === null ) {\n\n\t\t\tconst sphere = new Sphere();\n\t\t\tthis.getBoundingBoxAt( geometryId, _box$1 );\n\t\t\t_box$1.getCenter( sphere.center );\n\n\t\t\tconst index = geometry.index;\n\t\t\tconst position = geometry.attributes.position;\n\n\t\t\tlet maxRadiusSq = 0;\n\t\t\tfor ( let i = geometryInfo.start, l = geometryInfo.start + geometryInfo.count; i < l; i ++ ) {\n\n\t\t\t\tlet iv = i;\n\t\t\t\tif ( index ) {\n\n\t\t\t\t\tiv = index.getX( iv );\n\n\t\t\t\t}\n\n\t\t\t\t_vector$5.fromBufferAttribute( position, iv );\n\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, sphere.center.distanceToSquared( _vector$5 ) );\n\n\t\t\t}\n\n\t\t\tsphere.radius = Math.sqrt( maxRadiusSq );\n\t\t\tgeometryInfo.boundingSphere = sphere;\n\n\t\t}\n\n\t\ttarget.copy( geometryInfo.boundingSphere );\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Sets the given local transformation matrix to the defined instance.\n\t * Negatively scaled matrices are not supported.\n\t *\n\t * @param {number} instanceId - The ID of an instance to set the matrix of.\n\t * @param {Matrix4} matrix - A 4x4 matrix representing the local transformation of a single instance.\n\t * @return {BatchedMesh} A reference to this batched mesh.\n\t */\n\tsetMatrixAt( instanceId, matrix ) {\n\n\t\tthis.validateInstanceId( instanceId );\n\n\t\tconst matricesTexture = this._matricesTexture;\n\t\tconst matricesArray = this._matricesTexture.image.data;\n\t\tmatrix.toArray( matricesArray, instanceId * 16 );\n\t\tmatricesTexture.needsUpdate = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the local transformation matrix of the defined instance.\n\t *\n\t * @param {number} instanceId - The ID of an instance to get the matrix of.\n\t * @param {Matrix4} matrix - The target object that is used to store the method's result.\n\t * @return {Matrix4} The instance's local transformation matrix.\n\t */\n\tgetMatrixAt( instanceId, matrix ) {\n\n\t\tthis.validateInstanceId( instanceId );\n\t\treturn matrix.fromArray( this._matricesTexture.image.data, instanceId * 16 );\n\n\t}\n\n\t/**\n\t * Sets the given color to the defined instance.\n\t *\n\t * @param {number} instanceId - The ID of an instance to set the color of.\n\t * @param {Color} color - The color to set the instance to.\n\t * @return {BatchedMesh} A reference to this batched mesh.\n\t */\n\tsetColorAt( instanceId, color ) {\n\n\t\tthis.validateInstanceId( instanceId );\n\n\t\tif ( this._colorsTexture === null ) {\n\n\t\t\tthis._initColorsTexture();\n\n\t\t}\n\n\t\tcolor.toArray( this._colorsTexture.image.data, instanceId * 4 );\n\t\tthis._colorsTexture.needsUpdate = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the color of the defined instance.\n\t *\n\t * @param {number} instanceId - The ID of an instance to get the color of.\n\t * @param {Color} color - The target object that is used to store the method's result.\n\t * @return {Color} The instance's color.\n\t */\n\tgetColorAt( instanceId, color ) {\n\n\t\tthis.validateInstanceId( instanceId );\n\t\treturn color.fromArray( this._colorsTexture.image.data, instanceId * 4 );\n\n\t}\n\n\t/**\n\t * Sets the visibility of the instance.\n\t *\n\t * @param {number} instanceId - The id of the instance to set the visibility of.\n\t * @param {boolean} visible - Whether the instance is visible or not.\n\t * @return {BatchedMesh} A reference to this batched mesh.\n\t */\n\tsetVisibleAt( instanceId, visible ) {\n\n\t\tthis.validateInstanceId( instanceId );\n\n\t\tif ( this._instanceInfo[ instanceId ].visible === visible ) {\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tthis._instanceInfo[ instanceId ].visible = visible;\n\t\tthis._visibilityChanged = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the visibility state of the defined instance.\n\t *\n\t * @param {number} instanceId - The ID of an instance to get the visibility state of.\n\t * @return {boolean} Whether the instance is visible or not.\n\t */\n\tgetVisibleAt( instanceId ) {\n\n\t\tthis.validateInstanceId( instanceId );\n\n\t\treturn this._instanceInfo[ instanceId ].visible;\n\n\t}\n\n\t/**\n\t * Sets the geometry ID of the instance at the given index.\n\t *\n\t * @param {number} instanceId - The ID of the instance to set the geometry ID of.\n\t * @param {number} geometryId - The geometry ID to be use by the instance.\n\t * @return {BatchedMesh} A reference to this batched mesh.\n\t */\n\tsetGeometryIdAt( instanceId, geometryId ) {\n\n\t\tthis.validateInstanceId( instanceId );\n\t\tthis.validateGeometryId( geometryId );\n\n\t\tthis._instanceInfo[ instanceId ].geometryIndex = geometryId;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the geometry ID of the defined instance.\n\t *\n\t * @param {number} instanceId - The ID of an instance to get the geometry ID of.\n\t * @return {number} The instance's geometry ID.\n\t */\n\tgetGeometryIdAt( instanceId ) {\n\n\t\tthis.validateInstanceId( instanceId );\n\n\t\treturn this._instanceInfo[ instanceId ].geometryIndex;\n\n\t}\n\n\t/**\n\t * Get the range representing the subset of triangles related to the attached geometry,\n\t * indicating the starting offset and count, or `null` if invalid.\n\t *\n\t * @param {number} geometryId - The id of the geometry to get the range of.\n\t * @param {Object} [target] - The target object that is used to store the method's result.\n\t * @return {{\n\t * \tvertexStart:number,vertexCount:number,reservedVertexCount:number,\n\t * \tindexStart:number,indexCount:number,reservedIndexCount:number,\n\t * \tstart:number,count:number\n\t * }} The result object with range data.\n\t */\n\tgetGeometryRangeAt( geometryId, target = {} ) {\n\n\t\tthis.validateGeometryId( geometryId );\n\n\t\tconst geometryInfo = this._geometryInfo[ geometryId ];\n\t\ttarget.vertexStart = geometryInfo.vertexStart;\n\t\ttarget.vertexCount = geometryInfo.vertexCount;\n\t\ttarget.reservedVertexCount = geometryInfo.reservedVertexCount;\n\n\t\ttarget.indexStart = geometryInfo.indexStart;\n\t\ttarget.indexCount = geometryInfo.indexCount;\n\t\ttarget.reservedIndexCount = geometryInfo.reservedIndexCount;\n\n\t\ttarget.start = geometryInfo.start;\n\t\ttarget.count = geometryInfo.count;\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Resizes the necessary buffers to support the provided number of instances.\n\t * If the provided arguments shrink the number of instances but there are not enough\n\t * unused Ids at the end of the list then an error is thrown.\n\t *\n\t * @param {number} maxInstanceCount - The max number of individual instances that can be added and rendered by the batch.\n\t*/\n\tsetInstanceCount( maxInstanceCount ) {\n\n\t\t// shrink the available instances as much as possible\n\t\tconst availableInstanceIds = this._availableInstanceIds;\n\t\tconst instanceInfo = this._instanceInfo;\n\t\tavailableInstanceIds.sort( ascIdSort );\n\t\twhile ( availableInstanceIds[ availableInstanceIds.length - 1 ] === instanceInfo.length - 1 ) {\n\n\t\t\tinstanceInfo.pop();\n\t\t\tavailableInstanceIds.pop();\n\n\t\t}\n\n\t\t// throw an error if it can't be shrunk to the desired size\n\t\tif ( maxInstanceCount < instanceInfo.length ) {\n\n\t\t\tthrow new Error( `BatchedMesh: Instance ids outside the range ${ maxInstanceCount } are being used. Cannot shrink instance count.` );\n\n\t\t}\n\n\t\t// copy the multi draw counts\n\t\tconst multiDrawCounts = new Int32Array( maxInstanceCount );\n\t\tconst multiDrawStarts = new Int32Array( maxInstanceCount );\n\t\tcopyArrayContents( this._multiDrawCounts, multiDrawCounts );\n\t\tcopyArrayContents( this._multiDrawStarts, multiDrawStarts );\n\n\t\tthis._multiDrawCounts = multiDrawCounts;\n\t\tthis._multiDrawStarts = multiDrawStarts;\n\t\tthis._maxInstanceCount = maxInstanceCount;\n\n\t\t// update texture data for instance sampling\n\t\tconst indirectTexture = this._indirectTexture;\n\t\tconst matricesTexture = this._matricesTexture;\n\t\tconst colorsTexture = this._colorsTexture;\n\n\t\tindirectTexture.dispose();\n\t\tthis._initIndirectTexture();\n\t\tcopyArrayContents( indirectTexture.image.data, this._indirectTexture.image.data );\n\n\t\tmatricesTexture.dispose();\n\t\tthis._initMatricesTexture();\n\t\tcopyArrayContents( matricesTexture.image.data, this._matricesTexture.image.data );\n\n\t\tif ( colorsTexture ) {\n\n\t\t\tcolorsTexture.dispose();\n\t\t\tthis._initColorsTexture();\n\t\t\tcopyArrayContents( colorsTexture.image.data, this._colorsTexture.image.data );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Resizes the available space in the batch's vertex and index buffer attributes to the provided sizes.\n\t * If the provided arguments shrink the geometry buffers but there is not enough unused space at the\n\t * end of the geometry attributes then an error is thrown.\n\t *\n\t * @param {number} maxVertexCount - The maximum number of vertices to be used by all unique geometries to resize to.\n\t * @param {number} maxIndexCount - The maximum number of indices to be used by all unique geometries to resize to.\n\t*/\n\tsetGeometrySize( maxVertexCount, maxIndexCount ) {\n\n\t\t// Check if we can shrink to the requested vertex attribute size\n\t\tconst validRanges = [ ...this._geometryInfo ].filter( info => info.active );\n\t\tconst requiredVertexLength = Math.max( ...validRanges.map( range => range.vertexStart + range.reservedVertexCount ) );\n\t\tif ( requiredVertexLength > maxVertexCount ) {\n\n\t\t\tthrow new Error( `BatchedMesh: Geometry vertex values are being used outside the range ${ maxIndexCount }. Cannot shrink further.` );\n\n\t\t}\n\n\t\t// Check if we can shrink to the requested index attribute size\n\t\tif ( this.geometry.index ) {\n\n\t\t\tconst requiredIndexLength = Math.max( ...validRanges.map( range => range.indexStart + range.reservedIndexCount ) );\n\t\t\tif ( requiredIndexLength > maxIndexCount ) {\n\n\t\t\t\tthrow new Error( `BatchedMesh: Geometry index values are being used outside the range ${ maxIndexCount }. Cannot shrink further.` );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\t// dispose of the previous geometry\n\t\tconst oldGeometry = this.geometry;\n\t\toldGeometry.dispose();\n\n\t\t// recreate the geometry needed based on the previous variant\n\t\tthis._maxVertexCount = maxVertexCount;\n\t\tthis._maxIndexCount = maxIndexCount;\n\n\t\tif ( this._geometryInitialized ) {\n\n\t\t\tthis._geometryInitialized = false;\n\t\t\tthis.geometry = new BufferGeometry();\n\t\t\tthis._initializeGeometry( oldGeometry );\n\n\t\t}\n\n\t\t// copy data from the previous geometry\n\t\tconst geometry = this.geometry;\n\t\tif ( oldGeometry.index ) {\n\n\t\t\tcopyArrayContents( oldGeometry.index.array, geometry.index.array );\n\n\t\t}\n\n\t\tfor ( const key in oldGeometry.attributes ) {\n\n\t\t\tcopyArrayContents( oldGeometry.attributes[ key ].array, geometry.attributes[ key ].array );\n\n\t\t}\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tconst instanceInfo = this._instanceInfo;\n\t\tconst geometryInfoList = this._geometryInfo;\n\t\tconst matrixWorld = this.matrixWorld;\n\t\tconst batchGeometry = this.geometry;\n\n\t\t// iterate over each geometry\n\t\t_mesh.material = this.material;\n\t\t_mesh.geometry.index = batchGeometry.index;\n\t\t_mesh.geometry.attributes = batchGeometry.attributes;\n\t\tif ( _mesh.geometry.boundingBox === null ) {\n\n\t\t\t_mesh.geometry.boundingBox = new Box3();\n\n\t\t}\n\n\t\tif ( _mesh.geometry.boundingSphere === null ) {\n\n\t\t\t_mesh.geometry.boundingSphere = new Sphere();\n\n\t\t}\n\n\t\tfor ( let i = 0, l = instanceInfo.length; i < l; i ++ ) {\n\n\t\t\tif ( ! instanceInfo[ i ].visible || ! instanceInfo[ i ].active ) {\n\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tconst geometryId = instanceInfo[ i ].geometryIndex;\n\t\t\tconst geometryInfo = geometryInfoList[ geometryId ];\n\t\t\t_mesh.geometry.setDrawRange( geometryInfo.start, geometryInfo.count );\n\n\t\t\t// get the intersects\n\t\t\tthis.getMatrixAt( i, _mesh.matrixWorld ).premultiply( matrixWorld );\n\t\t\tthis.getBoundingBoxAt( geometryId, _mesh.geometry.boundingBox );\n\t\t\tthis.getBoundingSphereAt( geometryId, _mesh.geometry.boundingSphere );\n\t\t\t_mesh.raycast( raycaster, _batchIntersects );\n\n\t\t\t// add batch id to the intersects\n\t\t\tfor ( let j = 0, l = _batchIntersects.length; j < l; j ++ ) {\n\n\t\t\t\tconst intersect = _batchIntersects[ j ];\n\t\t\t\tintersect.object = this;\n\t\t\t\tintersect.batchId = i;\n\t\t\t\tintersects.push( intersect );\n\n\t\t\t}\n\n\t\t\t_batchIntersects.length = 0;\n\n\t\t}\n\n\t\t_mesh.material = null;\n\t\t_mesh.geometry.index = null;\n\t\t_mesh.geometry.attributes = {};\n\t\t_mesh.geometry.setDrawRange( 0, Infinity );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.geometry = source.geometry.clone();\n\t\tthis.perObjectFrustumCulled = source.perObjectFrustumCulled;\n\t\tthis.sortObjects = source.sortObjects;\n\t\tthis.boundingBox = source.boundingBox !== null ? source.boundingBox.clone() : null;\n\t\tthis.boundingSphere = source.boundingSphere !== null ? source.boundingSphere.clone() : null;\n\n\t\tthis._geometryInfo = source._geometryInfo.map( info => ( {\n\t\t\t...info,\n\n\t\t\tboundingBox: info.boundingBox !== null ? info.boundingBox.clone() : null,\n\t\t\tboundingSphere: info.boundingSphere !== null ? info.boundingSphere.clone() : null,\n\t\t} ) );\n\t\tthis._instanceInfo = source._instanceInfo.map( info => ( { ...info } ) );\n\n\t\tthis._availableInstanceIds = source._availableInstanceIds.slice();\n\t\tthis._availableGeometryIds = source._availableGeometryIds.slice();\n\n\t\tthis._nextIndexStart = source._nextIndexStart;\n\t\tthis._nextVertexStart = source._nextVertexStart;\n\t\tthis._geometryCount = source._geometryCount;\n\n\t\tthis._maxInstanceCount = source._maxInstanceCount;\n\t\tthis._maxVertexCount = source._maxVertexCount;\n\t\tthis._maxIndexCount = source._maxIndexCount;\n\n\t\tthis._geometryInitialized = source._geometryInitialized;\n\t\tthis._multiDrawCounts = source._multiDrawCounts.slice();\n\t\tthis._multiDrawStarts = source._multiDrawStarts.slice();\n\n\t\tthis._indirectTexture = source._indirectTexture.clone();\n\t\tthis._indirectTexture.image.data = this._indirectTexture.image.data.slice();\n\n\t\tthis._matricesTexture = source._matricesTexture.clone();\n\t\tthis._matricesTexture.image.data = this._matricesTexture.image.data.slice();\n\n\t\tif ( this._colorsTexture !== null ) {\n\n\t\t\tthis._colorsTexture = source._colorsTexture.clone();\n\t\t\tthis._colorsTexture.image.data = this._colorsTexture.image.data.slice();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\t// Assuming the geometry is not shared with other meshes\n\t\tthis.geometry.dispose();\n\n\t\tthis._matricesTexture.dispose();\n\t\tthis._matricesTexture = null;\n\n\t\tthis._indirectTexture.dispose();\n\t\tthis._indirectTexture = null;\n\n\t\tif ( this._colorsTexture !== null ) {\n\n\t\t\tthis._colorsTexture.dispose();\n\t\t\tthis._colorsTexture = null;\n\n\t\t}\n\n\t}\n\n\tonBeforeRender( renderer, scene, camera, geometry, material/*, _group*/ ) {\n\n\t\t// if visibility has not changed and frustum culling and object sorting is not required\n\t\t// then skip iterating over all items\n\t\tif ( ! this._visibilityChanged && ! this.perObjectFrustumCulled && ! this.sortObjects ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t// the indexed version of the multi draw function requires specifying the start\n\t\t// offset in bytes.\n\t\tconst index = geometry.getIndex();\n\t\tconst bytesPerElement = index === null ? 1 : index.array.BYTES_PER_ELEMENT;\n\n\t\tconst instanceInfo = this._instanceInfo;\n\t\tconst multiDrawStarts = this._multiDrawStarts;\n\t\tconst multiDrawCounts = this._multiDrawCounts;\n\t\tconst geometryInfoList = this._geometryInfo;\n\t\tconst perObjectFrustumCulled = this.perObjectFrustumCulled;\n\t\tconst indirectTexture = this._indirectTexture;\n\t\tconst indirectArray = indirectTexture.image.data;\n\n\t\tconst frustum = camera.isArrayCamera ? _frustumArray : _frustum;\n\t\t// prepare the frustum in the local frame\n\t\tif ( perObjectFrustumCulled && ! camera.isArrayCamera ) {\n\n\t\t\t_matrix$1\n\t\t\t\t.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse )\n\t\t\t\t.multiply( this.matrixWorld );\n\n\t\t\t_frustum.setFromProjectionMatrix(\n\t\t\t\t_matrix$1,\n\t\t\t\tcamera.coordinateSystem,\n\t\t\t\tcamera.reversedDepth\n\t\t\t);\n\n\t\t}\n\n\t\tlet multiDrawCount = 0;\n\t\tif ( this.sortObjects ) {\n\n\t\t\t// get the camera position in the local frame\n\t\t\t_matrix$1.copy( this.matrixWorld ).invert();\n\t\t\t_vector$5.setFromMatrixPosition( camera.matrixWorld ).applyMatrix4( _matrix$1 );\n\t\t\t_forward$1.set( 0, 0, -1 ).transformDirection( camera.matrixWorld ).transformDirection( _matrix$1 );\n\n\t\t\tfor ( let i = 0, l = instanceInfo.length; i < l; i ++ ) {\n\n\t\t\t\tif ( instanceInfo[ i ].visible && instanceInfo[ i ].active ) {\n\n\t\t\t\t\tconst geometryId = instanceInfo[ i ].geometryIndex;\n\n\t\t\t\t\t// get the bounds in world space\n\t\t\t\t\tthis.getMatrixAt( i, _matrix$1 );\n\t\t\t\t\tthis.getBoundingSphereAt( geometryId, _sphere$2 ).applyMatrix4( _matrix$1 );\n\n\t\t\t\t\t// determine whether the batched geometry is within the frustum\n\t\t\t\t\tlet culled = false;\n\t\t\t\t\tif ( perObjectFrustumCulled ) {\n\n\t\t\t\t\t\tculled = ! frustum.intersectsSphere( _sphere$2, camera );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! culled ) {\n\n\t\t\t\t\t\t// get the distance from camera used for sorting\n\t\t\t\t\t\tconst geometryInfo = geometryInfoList[ geometryId ];\n\t\t\t\t\t\tconst z = _temp.subVectors( _sphere$2.center, _vector$5 ).dot( _forward$1 );\n\t\t\t\t\t\t_renderList.push( geometryInfo.start, geometryInfo.count, z, i );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Sort the draw ranges and prep for rendering\n\t\t\tconst list = _renderList.list;\n\t\t\tconst customSort = this.customSort;\n\t\t\tif ( customSort === null ) {\n\n\t\t\t\tlist.sort( material.transparent ? sortTransparent : sortOpaque );\n\n\t\t\t} else {\n\n\t\t\t\tcustomSort.call( this, list, camera );\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0, l = list.length; i < l; i ++ ) {\n\n\t\t\t\tconst item = list[ i ];\n\t\t\t\tmultiDrawStarts[ multiDrawCount ] = item.start * bytesPerElement;\n\t\t\t\tmultiDrawCounts[ multiDrawCount ] = item.count;\n\t\t\t\tindirectArray[ multiDrawCount ] = item.index;\n\t\t\t\tmultiDrawCount ++;\n\n\t\t\t}\n\n\t\t\t_renderList.reset();\n\n\t\t} else {\n\n\t\t\tfor ( let i = 0, l = instanceInfo.length; i < l; i ++ ) {\n\n\t\t\t\tif ( instanceInfo[ i ].visible && instanceInfo[ i ].active ) {\n\n\t\t\t\t\tconst geometryId = instanceInfo[ i ].geometryIndex;\n\n\t\t\t\t\t// determine whether the batched geometry is within the frustum\n\t\t\t\t\tlet culled = false;\n\t\t\t\t\tif ( perObjectFrustumCulled ) {\n\n\t\t\t\t\t\t// get the bounds in world space\n\t\t\t\t\t\tthis.getMatrixAt( i, _matrix$1 );\n\t\t\t\t\t\tthis.getBoundingSphereAt( geometryId, _sphere$2 ).applyMatrix4( _matrix$1 );\n\t\t\t\t\t\tculled = ! frustum.intersectsSphere( _sphere$2, camera );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! culled ) {\n\n\t\t\t\t\t\tconst geometryInfo = geometryInfoList[ geometryId ];\n\t\t\t\t\t\tmultiDrawStarts[ multiDrawCount ] = geometryInfo.start * bytesPerElement;\n\t\t\t\t\t\tmultiDrawCounts[ multiDrawCount ] = geometryInfo.count;\n\t\t\t\t\t\tindirectArray[ multiDrawCount ] = i;\n\t\t\t\t\t\tmultiDrawCount ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tindirectTexture.needsUpdate = true;\n\t\tthis._multiDrawCount = multiDrawCount;\n\t\tthis._visibilityChanged = false;\n\n\t}\n\n\tonBeforeShadow( renderer, object, camera, shadowCamera, geometry, depthMaterial/* , group */ ) {\n\n\t\tthis.onBeforeRender( renderer, null, shadowCamera, geometry, depthMaterial );\n\n\t}\n\n}\n\n/**\n * A material for rendering line primitives.\n *\n * Materials define the appearance of renderable 3D objects.\n *\n * ```js\n * const material = new THREE.LineBasicMaterial( { color: 0xffffff } );\n * ```\n *\n * @augments Material\n */\nclass LineBasicMaterial extends Material {\n\n\t/**\n\t * Constructs a new line basic material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLineBasicMaterial = true;\n\n\t\tthis.type = 'LineBasicMaterial';\n\n\t\t/**\n\t\t * Color of the material.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.color = new Color( 0xffffff );\n\n\t\t/**\n\t\t * Sets the color of the lines using data from a texture. The texture map\n\t\t * color is modulated by the diffuse `color`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * Controls line thickness or lines.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}. WebGL and WebGPU\n\t\t * ignore this setting and always render line primitives with a\n\t\t * width of one pixel.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.linewidth = 1;\n\n\t\t/**\n\t\t * Defines appearance of line ends.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('butt'|'round'|'square')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.linecap = 'round';\n\n\t\t/**\n\t\t * Defines appearance of line joints.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.linejoin = 'round';\n\n\t\t/**\n\t\t * Whether the material is affected by fog or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.linewidth = source.linewidth;\n\t\tthis.linecap = source.linecap;\n\t\tthis.linejoin = source.linejoin;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _vStart = /*@__PURE__*/ new Vector3();\nconst _vEnd = /*@__PURE__*/ new Vector3();\n\nconst _inverseMatrix$1 = /*@__PURE__*/ new Matrix4();\nconst _ray$1 = /*@__PURE__*/ new Ray();\nconst _sphere$1 = /*@__PURE__*/ new Sphere();\n\nconst _intersectPointOnRay = /*@__PURE__*/ new Vector3();\nconst _intersectPointOnSegment = /*@__PURE__*/ new Vector3();\n\n/**\n * A continuous line. The line are rendered by connecting consecutive\n * vertices with straight lines.\n *\n * ```js\n * const material = new THREE.LineBasicMaterial( { color: 0x0000ff } );\n *\n * const points = [];\n * points.push( new THREE.Vector3( - 10, 0, 0 ) );\n * points.push( new THREE.Vector3( 0, 10, 0 ) );\n * points.push( new THREE.Vector3( 10, 0, 0 ) );\n *\n * const geometry = new THREE.BufferGeometry().setFromPoints( points );\n *\n * const line = new THREE.Line( geometry, material );\n * scene.add( line );\n * ```\n *\n * @augments Object3D\n */\nclass Line extends Object3D {\n\n\t/**\n\t * Constructs a new line.\n\t *\n\t * @param {BufferGeometry} [geometry] - The line geometry.\n\t * @param {Material|Array<Material>} [material] - The line material.\n\t */\n\tconstructor( geometry = new BufferGeometry(), material = new LineBasicMaterial() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLine = true;\n\n\t\tthis.type = 'Line';\n\n\t\t/**\n\t\t * The line geometry.\n\t\t *\n\t\t * @type {BufferGeometry}\n\t\t */\n\t\tthis.geometry = geometry;\n\n\t\t/**\n\t\t * The line material.\n\t\t *\n\t\t * @type {Material|Array<Material>}\n\t\t * @default LineBasicMaterial\n\t\t */\n\t\tthis.material = material;\n\n\t\t/**\n\t\t * A dictionary representing the morph targets in the geometry. The key is the\n\t\t * morph targets name, the value its attribute index. This member is `undefined`\n\t\t * by default and only set when morph targets are detected in the geometry.\n\t\t *\n\t\t * @type {Object<String,number>|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.morphTargetDictionary = undefined;\n\n\t\t/**\n\t\t * An array of weights typically in the range `[0,1]` that specify how much of the morph\n\t\t * is applied. This member is `undefined` by default and only set when morph targets are\n\t\t * detected in the geometry.\n\t\t *\n\t\t * @type {Array<number>|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.morphTargetInfluences = undefined;\n\n\t\tthis.updateMorphTargets();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.material = Array.isArray( source.material ) ? source.material.slice() : source.material;\n\t\tthis.geometry = source.geometry;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes an array of distance values which are necessary for rendering dashed lines.\n\t * For each vertex in the geometry, the method calculates the cumulative length from the\n\t * current point to the very beginning of the line.\n\t *\n\t * @return {Line} A reference to this line.\n\t */\n\tcomputeLineDistances() {\n\n\t\tconst geometry = this.geometry;\n\n\t\t// we assume non-indexed geometry\n\n\t\tif ( geometry.index === null ) {\n\n\t\t\tconst positionAttribute = geometry.attributes.position;\n\t\t\tconst lineDistances = [ 0 ];\n\n\t\t\tfor ( let i = 1, l = positionAttribute.count; i < l; i ++ ) {\n\n\t\t\t\t_vStart.fromBufferAttribute( positionAttribute, i - 1 );\n\t\t\t\t_vEnd.fromBufferAttribute( positionAttribute, i );\n\n\t\t\t\tlineDistances[ i ] = lineDistances[ i - 1 ];\n\t\t\t\tlineDistances[ i ] += _vStart.distanceTo( _vEnd );\n\n\t\t\t}\n\n\t\t\tgeometry.setAttribute( 'lineDistance', new Float32BufferAttribute( lineDistances, 1 ) );\n\n\t\t} else {\n\n\t\t\twarn( 'Line.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.' );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes intersection points between a casted ray and this line.\n\t *\n\t * @param {Raycaster} raycaster - The raycaster.\n\t * @param {Array<Object>} intersects - The target array that holds the intersection points.\n\t */\n\traycast( raycaster, intersects ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst matrixWorld = this.matrixWorld;\n\t\tconst threshold = raycaster.params.Line.threshold;\n\t\tconst drawRange = geometry.drawRange;\n\n\t\t// Checking boundingSphere distance to ray\n\n\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t_sphere$1.copy( geometry.boundingSphere );\n\t\t_sphere$1.applyMatrix4( matrixWorld );\n\t\t_sphere$1.radius += threshold;\n\n\t\tif ( raycaster.ray.intersectsSphere( _sphere$1 ) === false ) return;\n\n\t\t//\n\n\t\t_inverseMatrix$1.copy( matrixWorld ).invert();\n\t\t_ray$1.copy( raycaster.ray ).applyMatrix4( _inverseMatrix$1 );\n\n\t\tconst localThreshold = threshold / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 );\n\t\tconst localThresholdSq = localThreshold * localThreshold;\n\n\t\tconst step = this.isLineSegments ? 2 : 1;\n\n\t\tconst index = geometry.index;\n\t\tconst attributes = geometry.attributes;\n\t\tconst positionAttribute = attributes.position;\n\n\t\tif ( index !== null ) {\n\n\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\tconst end = Math.min( index.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( let i = start, l = end - 1; i < l; i += step ) {\n\n\t\t\t\tconst a = index.getX( i );\n\t\t\t\tconst b = index.getX( i + 1 );\n\n\t\t\t\tconst intersect = checkIntersection( this, raycaster, _ray$1, localThresholdSq, a, b, i );\n\n\t\t\t\tif ( intersect ) {\n\n\t\t\t\t\tintersects.push( intersect );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.isLineLoop ) {\n\n\t\t\t\tconst a = index.getX( end - 1 );\n\t\t\t\tconst b = index.getX( start );\n\n\t\t\t\tconst intersect = checkIntersection( this, raycaster, _ray$1, localThresholdSq, a, b, end - 1 );\n\n\t\t\t\tif ( intersect ) {\n\n\t\t\t\t\tintersects.push( intersect );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\tconst end = Math.min( positionAttribute.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( let i = start, l = end - 1; i < l; i += step ) {\n\n\t\t\t\tconst intersect = checkIntersection( this, raycaster, _ray$1, localThresholdSq, i, i + 1, i );\n\n\t\t\t\tif ( intersect ) {\n\n\t\t\t\t\tintersects.push( intersect );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.isLineLoop ) {\n\n\t\t\t\tconst intersect = checkIntersection( this, raycaster, _ray$1, localThresholdSq, end - 1, start, end - 1 );\n\n\t\t\t\tif ( intersect ) {\n\n\t\t\t\t\tintersects.push( intersect );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the values of {@link Line#morphTargetDictionary} and {@link Line#morphTargetInfluences}\n\t * to make sure existing morph targets can influence this 3D object.\n\t */\n\tupdateMorphTargets() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tconst morphAttributes = geometry.morphAttributes;\n\t\tconst keys = Object.keys( morphAttributes );\n\n\t\tif ( keys.length > 0 ) {\n\n\t\t\tconst morphAttribute = morphAttributes[ keys[ 0 ] ];\n\n\t\t\tif ( morphAttribute !== undefined ) {\n\n\t\t\t\tthis.morphTargetInfluences = [];\n\t\t\t\tthis.morphTargetDictionary = {};\n\n\t\t\t\tfor ( let m = 0, ml = morphAttribute.length; m < ml; m ++ ) {\n\n\t\t\t\t\tconst name = morphAttribute[ m ].name || String( m );\n\n\t\t\t\t\tthis.morphTargetInfluences.push( 0 );\n\t\t\t\t\tthis.morphTargetDictionary[ name ] = m;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nfunction checkIntersection( object, raycaster, ray, thresholdSq, a, b, i ) {\n\n\tconst positionAttribute = object.geometry.attributes.position;\n\n\t_vStart.fromBufferAttribute( positionAttribute, a );\n\t_vEnd.fromBufferAttribute( positionAttribute, b );\n\n\tconst distSq = ray.distanceSqToSegment( _vStart, _vEnd, _intersectPointOnRay, _intersectPointOnSegment );\n\n\tif ( distSq > thresholdSq ) return;\n\n\t_intersectPointOnRay.applyMatrix4( object.matrixWorld ); // Move back to world space for distance calculation\n\n\tconst distance = raycaster.ray.origin.distanceTo( _intersectPointOnRay );\n\n\tif ( distance < raycaster.near || distance > raycaster.far ) return;\n\n\treturn {\n\n\t\tdistance: distance,\n\t\t// What do we want? intersection point on the ray or on the segment??\n\t\t// point: raycaster.ray.at( distance ),\n\t\tpoint: _intersectPointOnSegment.clone().applyMatrix4( object.matrixWorld ),\n\t\tindex: i,\n\t\tface: null,\n\t\tfaceIndex: null,\n\t\tbarycoord: null,\n\t\tobject: object\n\n\t};\n\n}\n\nconst _start = /*@__PURE__*/ new Vector3();\nconst _end = /*@__PURE__*/ new Vector3();\n\n/**\n * A series of lines drawn between pairs of vertices.\n *\n * @augments Line\n */\nclass LineSegments extends Line {\n\n\t/**\n\t * Constructs a new line segments.\n\t *\n\t * @param {BufferGeometry} [geometry] - The line geometry.\n\t * @param {Material|Array<Material>} [material] - The line material.\n\t */\n\tconstructor( geometry, material ) {\n\n\t\tsuper( geometry, material );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLineSegments = true;\n\n\t\tthis.type = 'LineSegments';\n\n\t}\n\n\tcomputeLineDistances() {\n\n\t\tconst geometry = this.geometry;\n\n\t\t// we assume non-indexed geometry\n\n\t\tif ( geometry.index === null ) {\n\n\t\t\tconst positionAttribute = geometry.attributes.position;\n\t\t\tconst lineDistances = [];\n\n\t\t\tfor ( let i = 0, l = positionAttribute.count; i < l; i += 2 ) {\n\n\t\t\t\t_start.fromBufferAttribute( positionAttribute, i );\n\t\t\t\t_end.fromBufferAttribute( positionAttribute, i + 1 );\n\n\t\t\t\tlineDistances[ i ] = ( i === 0 ) ? 0 : lineDistances[ i - 1 ];\n\t\t\t\tlineDistances[ i + 1 ] = lineDistances[ i ] + _start.distanceTo( _end );\n\n\t\t\t}\n\n\t\t\tgeometry.setAttribute( 'lineDistance', new Float32BufferAttribute( lineDistances, 1 ) );\n\n\t\t} else {\n\n\t\t\twarn( 'LineSegments.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.' );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A continuous line. This is nearly the same as {@link Line} the only difference\n * is that the last vertex is connected with the first vertex in order to close\n * the line to form a loop.\n *\n * @augments Line\n */\nclass LineLoop extends Line {\n\n\t/**\n\t * Constructs a new line loop.\n\t *\n\t * @param {BufferGeometry} [geometry] - The line geometry.\n\t * @param {Material|Array<Material>} [material] - The line material.\n\t */\n\tconstructor( geometry, material ) {\n\n\t\tsuper( geometry, material );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLineLoop = true;\n\n\t\tthis.type = 'LineLoop';\n\n\t}\n\n}\n\n/**\n * A material for rendering point primitives.\n *\n * Materials define the appearance of renderable 3D objects.\n *\n * ```js\n * const vertices = [];\n *\n * for ( let i = 0; i < 10000; i ++ ) {\n * \tconst x = THREE.MathUtils.randFloatSpread( 2000 );\n * \tconst y = THREE.MathUtils.randFloatSpread( 2000 );\n * \tconst z = THREE.MathUtils.randFloatSpread( 2000 );\n *\n * \tvertices.push( x, y, z );\n * }\n *\n * const geometry = new THREE.BufferGeometry();\n * geometry.setAttribute( 'position', new THREE.Float32BufferAttribute( vertices, 3 ) );\n * const material = new THREE.PointsMaterial( { color: 0x888888 } );\n * const points = new THREE.Points( geometry, material );\n * scene.add( points );\n * ```\n *\n * @augments Material\n */\nclass PointsMaterial extends Material {\n\n\t/**\n\t * Constructs a new points material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isPointsMaterial = true;\n\n\t\tthis.type = 'PointsMaterial';\n\n\t\t/**\n\t\t * Color of the material.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.color = new Color( 0xffffff );\n\n\t\t/**\n\t\t * The color map. May optionally include an alpha channel, typically combined\n\t\t * with {@link Material#transparent} or {@link Material#alphaTest}. The texture map\n\t\t * color is modulated by the diffuse `color`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * The alpha map is a grayscale texture that controls the opacity across the\n\t\t * surface (black: fully transparent; white: fully opaque).\n\t\t *\n\t\t * Only the color of the texture is used, ignoring the alpha channel if one\n\t\t * exists. For RGB and RGBA textures, the renderer will use the green channel\n\t\t * when sampling this texture due to the extra bit of precision provided for\n\t\t * green in DXT-compressed and uncompressed RGB 565 formats. Luminance-only and\n\t\t * luminance/alpha textures will also still work as expected.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.alphaMap = null;\n\n\t\t/**\n\t\t * Defines the size of the points in pixels.\n\t\t *\n\t\t * Might be capped if the value exceeds hardware dependent parameters like [gl.ALIASED_POINT_SIZE_RANGE](https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getParamete).\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.size = 1;\n\n\t\t/**\n\t\t * Specifies whether size of individual points is attenuated by the camera depth (perspective camera only).\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.sizeAttenuation = true;\n\n\t\t/**\n\t\t * Whether the material is affected by fog or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.size = source.size;\n\t\tthis.sizeAttenuation = source.sizeAttenuation;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _inverseMatrix = /*@__PURE__*/ new Matrix4();\nconst _ray = /*@__PURE__*/ new Ray();\nconst _sphere = /*@__PURE__*/ new Sphere();\nconst _position$2 = /*@__PURE__*/ new Vector3();\n\n/**\n * A class for displaying points or point clouds.\n *\n * @augments Object3D\n */\nclass Points extends Object3D {\n\n\t/**\n\t * Constructs a new point cloud.\n\t *\n\t * @param {BufferGeometry} [geometry] - The points geometry.\n\t * @param {Material|Array<Material>} [material] - The points material.\n\t */\n\tconstructor( geometry = new BufferGeometry(), material = new PointsMaterial() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isPoints = true;\n\n\t\tthis.type = 'Points';\n\n\t\t/**\n\t\t * The points geometry.\n\t\t *\n\t\t * @type {BufferGeometry}\n\t\t */\n\t\tthis.geometry = geometry;\n\n\t\t/**\n\t\t * The line material.\n\t\t *\n\t\t * @type {Material|Array<Material>}\n\t\t * @default PointsMaterial\n\t\t */\n\t\tthis.material = material;\n\n\t\t/**\n\t\t * A dictionary representing the morph targets in the geometry. The key is the\n\t\t * morph targets name, the value its attribute index. This member is `undefined`\n\t\t * by default and only set when morph targets are detected in the geometry.\n\t\t *\n\t\t * @type {Object<String,number>|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.morphTargetDictionary = undefined;\n\n\t\t/**\n\t\t * An array of weights typically in the range `[0,1]` that specify how much of the morph\n\t\t * is applied. This member is `undefined` by default and only set when morph targets are\n\t\t * detected in the geometry.\n\t\t *\n\t\t * @type {Array<number>|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.morphTargetInfluences = undefined;\n\n\t\tthis.updateMorphTargets();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.material = Array.isArray( source.material ) ? source.material.slice() : source.material;\n\t\tthis.geometry = source.geometry;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes intersection points between a casted ray and this point cloud.\n\t *\n\t * @param {Raycaster} raycaster - The raycaster.\n\t * @param {Array<Object>} intersects - The target array that holds the intersection points.\n\t */\n\traycast( raycaster, intersects ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst matrixWorld = this.matrixWorld;\n\t\tconst threshold = raycaster.params.Points.threshold;\n\t\tconst drawRange = geometry.drawRange;\n\n\t\t// Checking boundingSphere distance to ray\n\n\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t_sphere.copy( geometry.boundingSphere );\n\t\t_sphere.applyMatrix4( matrixWorld );\n\t\t_sphere.radius += threshold;\n\n\t\tif ( raycaster.ray.intersectsSphere( _sphere ) === false ) return;\n\n\t\t//\n\n\t\t_inverseMatrix.copy( matrixWorld ).invert();\n\t\t_ray.copy( raycaster.ray ).applyMatrix4( _inverseMatrix );\n\n\t\tconst localThreshold = threshold / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 );\n\t\tconst localThresholdSq = localThreshold * localThreshold;\n\n\t\tconst index = geometry.index;\n\t\tconst attributes = geometry.attributes;\n\t\tconst positionAttribute = attributes.position;\n\n\t\tif ( index !== null ) {\n\n\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\tconst end = Math.min( index.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( let i = start, il = end; i < il; i ++ ) {\n\n\t\t\t\tconst a = index.getX( i );\n\n\t\t\t\t_position$2.fromBufferAttribute( positionAttribute, a );\n\n\t\t\t\ttestPoint( _position$2, a, localThresholdSq, matrixWorld, raycaster, intersects, this );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\tconst end = Math.min( positionAttribute.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( let i = start, l = end; i < l; i ++ ) {\n\n\t\t\t\t_position$2.fromBufferAttribute( positionAttribute, i );\n\n\t\t\t\ttestPoint( _position$2, i, localThresholdSq, matrixWorld, raycaster, intersects, this );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the values of {@link Points#morphTargetDictionary} and {@link Points#morphTargetInfluences}\n\t * to make sure existing morph targets can influence this 3D object.\n\t */\n\tupdateMorphTargets() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tconst morphAttributes = geometry.morphAttributes;\n\t\tconst keys = Object.keys( morphAttributes );\n\n\t\tif ( keys.length > 0 ) {\n\n\t\t\tconst morphAttribute = morphAttributes[ keys[ 0 ] ];\n\n\t\t\tif ( morphAttribute !== undefined ) {\n\n\t\t\t\tthis.morphTargetInfluences = [];\n\t\t\t\tthis.morphTargetDictionary = {};\n\n\t\t\t\tfor ( let m = 0, ml = morphAttribute.length; m < ml; m ++ ) {\n\n\t\t\t\t\tconst name = morphAttribute[ m ].name || String( m );\n\n\t\t\t\t\tthis.morphTargetInfluences.push( 0 );\n\t\t\t\t\tthis.morphTargetDictionary[ name ] = m;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nfunction testPoint( point, index, localThresholdSq, matrixWorld, raycaster, intersects, object ) {\n\n\tconst rayPointDistanceSq = _ray.distanceSqToPoint( point );\n\n\tif ( rayPointDistanceSq < localThresholdSq ) {\n\n\t\tconst intersectPoint = new Vector3();\n\n\t\t_ray.closestPointToPoint( point, intersectPoint );\n\t\tintersectPoint.applyMatrix4( matrixWorld );\n\n\t\tconst distance = raycaster.ray.origin.distanceTo( intersectPoint );\n\n\t\tif ( distance < raycaster.near || distance > raycaster.far ) return;\n\n\t\tintersects.push( {\n\n\t\t\tdistance: distance,\n\t\t\tdistanceToRay: Math.sqrt( rayPointDistanceSq ),\n\t\t\tpoint: intersectPoint,\n\t\t\tindex: index,\n\t\t\tface: null,\n\t\t\tfaceIndex: null,\n\t\t\tbarycoord: null,\n\t\t\tobject: object\n\n\t\t} );\n\n\t}\n\n}\n\n/**\n * A texture for use with a video.\n *\n * ```js\n * // assuming you have created a HTML video element with id=\"video\"\n * const video = document.getElementById( 'video' );\n * const texture = new THREE.VideoTexture( video );\n * ```\n *\n * Note: When using video textures with {@link WebGPURenderer}, {@link Texture#colorSpace} must be\n * set to THREE.SRGBColorSpace.\n *\n * Note: After the initial use of a texture, its dimensions, format, and type\n * cannot be changed. Instead, call {@link Texture#dispose} on the texture and instantiate a new one.\n *\n * @augments Texture\n */\nclass VideoTexture extends Texture {\n\n\t/**\n\t * Constructs a new video texture.\n\t *\n\t * @param {HTMLVideoElement} video - The video element to use as a data source for the texture.\n\t * @param {number} [mapping=Texture.DEFAULT_MAPPING] - The texture mapping.\n\t * @param {number} [wrapS=ClampToEdgeWrapping] - The wrapS value.\n\t * @param {number} [wrapT=ClampToEdgeWrapping] - The wrapT value.\n\t * @param {number} [magFilter=LinearFilter] - The mag filter value.\n\t * @param {number} [minFilter=LinearFilter] - The min filter value.\n\t * @param {number} [format=RGBAFormat] - The texture format.\n\t * @param {number} [type=UnsignedByteType] - The texture type.\n\t * @param {number} [anisotropy=Texture.DEFAULT_ANISOTROPY] - The anisotropy value.\n\t */\n\tconstructor( video, mapping, wrapS, wrapT, magFilter = LinearFilter, minFilter = LinearFilter, format, type, anisotropy ) {\n\n\t\tsuper( video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isVideoTexture = true;\n\n\t\t/**\n\t\t * Whether to generate mipmaps (if possible) for a texture.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.generateMipmaps = false;\n\n\t\t/**\n\t\t * The video frame request callback identifier, which is a positive integer.\n\t\t *\n\t\t * Value of 0 represents no scheduled rVFC.\n\t\t *\n\t\t * @private\n\t\t * @type {number}\n\t\t */\n\t\tthis._requestVideoFrameCallbackId = 0;\n\n\t\tconst scope = this;\n\n\t\tfunction updateVideo() {\n\n\t\t\tscope.needsUpdate = true;\n\t\t\tscope._requestVideoFrameCallbackId = video.requestVideoFrameCallback( updateVideo );\n\n\t\t}\n\n\t\tif ( 'requestVideoFrameCallback' in video ) {\n\n\t\t\tthis._requestVideoFrameCallbackId = video.requestVideoFrameCallback( updateVideo );\n\n\t\t}\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this.image ).copy( this );\n\n\t}\n\n\t/**\n\t * This method is called automatically by the renderer and sets {@link Texture#needsUpdate}\n\t * to `true` every time a new frame is available.\n\t *\n\t * Only relevant if `requestVideoFrameCallback` is not supported in the browser.\n\t */\n\tupdate() {\n\n\t\tconst video = this.image;\n\t\tconst hasVideoFrameCallback = 'requestVideoFrameCallback' in video;\n\n\t\tif ( hasVideoFrameCallback === false && video.readyState >= video.HAVE_CURRENT_DATA ) {\n\n\t\t\tthis.needsUpdate = true;\n\n\t\t}\n\n\t}\n\n\tdispose() {\n\n\t\tif ( this._requestVideoFrameCallbackId !== 0 ) {\n\n\t\t\tthis.source.data.cancelVideoFrameCallback( this._requestVideoFrameCallbackId );\n\n\t\t\tthis._requestVideoFrameCallbackId = 0;\n\n\t\t}\n\n\t\tsuper.dispose();\n\n\t}\n\n}\n\n/**\n * This class can be used as an alternative way to define video data. Instead of using\n * an instance of `HTMLVideoElement` like with `VideoTexture`, `VideoFrameTexture` expects each frame is\n * defined manually via {@link VideoFrameTexture#setFrame}. A typical use case for this module is when\n * video frames are decoded with the WebCodecs API.\n *\n * ```js\n * const texture = new THREE.VideoFrameTexture();\n * texture.setFrame( frame );\n * ```\n *\n * @augments VideoTexture\n */\nclass VideoFrameTexture extends VideoTexture {\n\n\t/**\n\t * Constructs a new video frame texture.\n\t *\n\t * @param {number} [mapping=Texture.DEFAULT_MAPPING] - The texture mapping.\n\t * @param {number} [wrapS=ClampToEdgeWrapping] - The wrapS value.\n\t * @param {number} [wrapT=ClampToEdgeWrapping] - The wrapT value.\n\t * @param {number} [magFilter=LinearFilter] - The mag filter value.\n\t * @param {number} [minFilter=LinearFilter] - The min filter value.\n\t * @param {number} [format=RGBAFormat] - The texture format.\n\t * @param {number} [type=UnsignedByteType] - The texture type.\n\t * @param {number} [anisotropy=Texture.DEFAULT_ANISOTROPY] - The anisotropy value.\n\t */\n\tconstructor( mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) {\n\n\t\tsuper( {}, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isVideoFrameTexture = true;\n\n\t}\n\n\t/**\n\t * This method overwritten with an empty implementation since\n\t * this type of texture is updated via `setFrame()`.\n\t */\n\tupdate() {}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this ); // restoring Texture.clone()\n\n\t}\n\n\t/**\n\t * Sets the current frame of the video. This will automatically update the texture\n\t * so the data can be used for rendering.\n\t *\n\t * @param {VideoFrame} frame - The video frame.\n\t */\n\tsetFrame( frame ) {\n\n\t\tthis.image = frame;\n\t\tthis.needsUpdate = true;\n\n\t}\n\n}\n\n/**\n * This class can only be used in combination with `copyFramebufferToTexture()` methods\n * of renderers. It extracts the contents of the current bound framebuffer and provides it\n * as a texture for further usage.\n *\n * ```js\n * const pixelRatio = window.devicePixelRatio;\n * const textureSize = 128 * pixelRatio;\n *\n * const frameTexture = new FramebufferTexture( textureSize, textureSize );\n *\n * // calculate start position for copying part of the frame data\n * const vector = new Vector2();\n * vector.x = ( window.innerWidth * pixelRatio / 2 ) - ( textureSize / 2 );\n * vector.y = ( window.innerHeight * pixelRatio / 2 ) - ( textureSize / 2 );\n *\n * renderer.render( scene, camera );\n *\n * // copy part of the rendered frame into the framebuffer texture\n * renderer.copyFramebufferToTexture( frameTexture, vector );\n * ```\n *\n * @augments Texture\n */\nclass FramebufferTexture extends Texture {\n\n\t/**\n\t * Constructs a new framebuffer texture.\n\t *\n\t * @param {number} [width] - The width of the texture.\n\t * @param {number} [height] - The height of the texture.\n\t */\n\tconstructor( width, height ) {\n\n\t\tsuper( { width, height } );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isFramebufferTexture = true;\n\n\t\t/**\n\t\t * How the texture is sampled when a texel covers more than one pixel.\n\t\t *\n\t\t * Overwritten and set to `NearestFilter` by default to disable filtering.\n\t\t *\n\t\t * @type {(NearestFilter|NearestMipmapNearestFilter|NearestMipmapLinearFilter|LinearFilter|LinearMipmapNearestFilter|LinearMipmapLinearFilter)}\n\t\t * @default NearestFilter\n\t\t */\n\t\tthis.magFilter = NearestFilter;\n\n\t\t/**\n\t\t * How the texture is sampled when a texel covers less than one pixel.\n\t\t *\n\t\t * Overwritten and set to `NearestFilter` by default to disable filtering.\n\t\t *\n\t\t * @type {(NearestFilter|NearestMipmapNearestFilter|NearestMipmapLinearFilter|LinearFilter|LinearMipmapNearestFilter|LinearMipmapLinearFilter)}\n\t\t * @default NearestFilter\n\t\t */\n\t\tthis.minFilter = NearestFilter;\n\n\t\t/**\n\t\t * Whether to generate mipmaps (if possible) for a texture.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.generateMipmaps = false;\n\n\t\tthis.needsUpdate = true;\n\n\t}\n\n}\n\n/**\n * Creates a texture based on data in compressed form.\n *\n * These texture are usually loaded with {@link CompressedTextureLoader}.\n *\n * @augments Texture\n */\nclass CompressedTexture extends Texture {\n\n\t/**\n\t * Constructs a new compressed texture.\n\t *\n\t * @param {Array<Object>} mipmaps - This array holds for all mipmaps (including the bases mip)\n\t * the data and dimensions.\n\t * @param {number} width - The width of the texture.\n\t * @param {number} height - The height of the texture.\n\t * @param {number} [format=RGBAFormat] - The texture format.\n\t * @param {number} [type=UnsignedByteType] - The texture type.\n\t * @param {number} [mapping=Texture.DEFAULT_MAPPING] - The texture mapping.\n\t * @param {number} [wrapS=ClampToEdgeWrapping] - The wrapS value.\n\t * @param {number} [wrapT=ClampToEdgeWrapping] - The wrapT value.\n\t * @param {number} [magFilter=LinearFilter] - The mag filter value.\n\t * @param {number} [minFilter=LinearMipmapLinearFilter] - The min filter value.\n\t * @param {number} [anisotropy=Texture.DEFAULT_ANISOTROPY] - The anisotropy value.\n\t * @param {string} [colorSpace=NoColorSpace] - The color space.\n\t */\n\tconstructor( mipmaps, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, colorSpace ) {\n\n\t\tsuper( null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, colorSpace );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCompressedTexture = true;\n\n\t\t/**\n\t\t * The image property of a compressed texture just defines its dimensions.\n\t\t *\n\t\t * @type {{width:number,height:number}}\n\t\t */\n\t\tthis.image = { width: width, height: height };\n\n\t\t/**\n\t\t * This array holds for all mipmaps (including the bases mip) the data and dimensions.\n\t\t *\n\t\t * @type {Array<Object>}\n\t\t */\n\t\tthis.mipmaps = mipmaps;\n\n\t\t/**\n\t\t * If set to `true`, the texture is flipped along the vertical axis when\n\t\t * uploaded to the GPU.\n\t\t *\n\t\t * Overwritten and set to `false` by default since it is not possible to\n\t\t * flip compressed textures.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t * @readonly\n\t\t */\n\t\tthis.flipY = false;\n\n\t\t/**\n\t\t * Whether to generate mipmaps (if possible) for a texture.\n\t\t *\n\t\t * Overwritten and set to `false` by default since it is not\n\t\t * possible to generate mipmaps for compressed data. Mipmaps\n\t\t * must be embedded in the compressed texture file.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t * @readonly\n\t\t */\n\t\tthis.generateMipmaps = false;\n\n\t}\n\n}\n\n/**\n * Creates a texture 2D array based on data in compressed form.\n *\n * These texture are usually loaded with {@link CompressedTextureLoader}.\n *\n * @augments CompressedTexture\n */\nclass CompressedArrayTexture extends CompressedTexture {\n\n\t/**\n\t * Constructs a new compressed array texture.\n\t *\n\t * @param {Array<Object>} mipmaps - This array holds for all mipmaps (including the bases mip)\n\t * the data and dimensions.\n\t * @param {number} width - The width of the texture.\n\t * @param {number} height - The height of the texture.\n\t * @param {number} depth - The depth of the texture.\n\t * @param {number} [format=RGBAFormat] - The min filter value.\n\t * @param {number} [type=UnsignedByteType] - The min filter value.\n\t */\n\tconstructor( mipmaps, width, height, depth, format, type ) {\n\n\t\tsuper( mipmaps, width, height, format, type );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCompressedArrayTexture = true;\n\n\t\t/**\n\t\t * The image property of a compressed texture just defines its dimensions.\n\t\t *\n\t\t * @name CompressedArrayTexture#image\n\t\t * @type {{width:number,height:number,depth:number}}\n\t\t */\n\t\tthis.image.depth = depth;\n\n\t\t/**\n\t\t * This defines how the texture is wrapped in the depth and corresponds to\n\t\t * *W* in UVW mapping.\n\t\t *\n\t\t * @type {(RepeatWrapping|ClampToEdgeWrapping|MirroredRepeatWrapping)}\n\t\t * @default ClampToEdgeWrapping\n\t\t */\n\t\tthis.wrapR = ClampToEdgeWrapping;\n\n\t\t/**\n\t\t * A set of all layers which need to be updated in the texture.\n\t\t *\n\t\t * @type {Set<number>}\n\t\t */\n\t\tthis.layerUpdates = new Set();\n\n\t}\n\n\t/**\n\t * Describes that a specific layer of the texture needs to be updated.\n\t * Normally when {@link Texture#needsUpdate} is set to `true`, the\n\t * entire compressed texture array is sent to the GPU. Marking specific\n\t * layers will only transmit subsets of all mipmaps associated with a\n\t * specific depth in the array which is often much more performant.\n\t *\n\t * @param {number} layerIndex - The layer index that should be updated.\n\t */\n\taddLayerUpdate( layerIndex ) {\n\n\t\tthis.layerUpdates.add( layerIndex );\n\n\t}\n\n\t/**\n\t * Resets the layer updates registry.\n\t */\n\tclearLayerUpdates() {\n\n\t\tthis.layerUpdates.clear();\n\n\t}\n\n}\n\n/**\n * Creates a cube texture based on data in compressed form.\n *\n * These texture are usually loaded with {@link CompressedTextureLoader}.\n *\n * @augments CompressedTexture\n */\nclass CompressedCubeTexture extends CompressedTexture {\n\n\t/**\n\t * Constructs a new compressed texture.\n\t *\n\t * @param {Array<CompressedTexture>} images - An array of compressed textures.\n\t * @param {number} [format=RGBAFormat] - The texture format.\n\t * @param {number} [type=UnsignedByteType] - The texture type.\n\t */\n\tconstructor( images, format, type ) {\n\n\t\tsuper( undefined, images[ 0 ].width, images[ 0 ].height, format, type, CubeReflectionMapping );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCompressedCubeTexture = true;\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCubeTexture = true;\n\n\t\tthis.image = images;\n\n\t}\n\n}\n\n/**\n * Creates a texture from a canvas element.\n *\n * This is almost the same as the base texture class, except that it sets {@link Texture#needsUpdate}\n * to `true` immediately since a canvas can directly be used for rendering.\n *\n * @augments Texture\n */\nclass CanvasTexture extends Texture {\n\n\t/**\n\t * Constructs a new texture.\n\t *\n\t * @param {HTMLCanvasElement} [canvas] - The HTML canvas element.\n\t * @param {number} [mapping=Texture.DEFAULT_MAPPING] - The texture mapping.\n\t * @param {number} [wrapS=ClampToEdgeWrapping] - The wrapS value.\n\t * @param {number} [wrapT=ClampToEdgeWrapping] - The wrapT value.\n\t * @param {number} [magFilter=LinearFilter] - The mag filter value.\n\t * @param {number} [minFilter=LinearMipmapLinearFilter] - The min filter value.\n\t * @param {number} [format=RGBAFormat] - The texture format.\n\t * @param {number} [type=UnsignedByteType] - The texture type.\n\t * @param {number} [anisotropy=Texture.DEFAULT_ANISOTROPY] - The anisotropy value.\n\t */\n\tconstructor( canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) {\n\n\t\tsuper( canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCanvasTexture = true;\n\n\t\tthis.needsUpdate = true;\n\n\t}\n\n}\n\n/**\n * This class can be used to automatically save the depth information of a\n * rendering into a texture.\n *\n * @augments Texture\n */\nclass DepthTexture extends Texture {\n\n\t/**\n\t * Constructs a new depth texture.\n\t *\n\t * @param {number} width - The width of the texture.\n\t * @param {number} height - The height of the texture.\n\t * @param {number} [type=UnsignedIntType] - The texture type.\n\t * @param {number} [mapping=Texture.DEFAULT_MAPPING] - The texture mapping.\n\t * @param {number} [wrapS=ClampToEdgeWrapping] - The wrapS value.\n\t * @param {number} [wrapT=ClampToEdgeWrapping] - The wrapT value.\n\t * @param {number} [magFilter=LinearFilter] - The mag filter value.\n\t * @param {number} [minFilter=LinearFilter] - The min filter value.\n\t * @param {number} [anisotropy=Texture.DEFAULT_ANISOTROPY] - The anisotropy value.\n\t * @param {number} [format=DepthFormat] - The texture format.\n\t * @param {number} [depth=1] - The depth of the texture.\n\t */\n\tconstructor( width, height, type = UnsignedIntType, mapping, wrapS, wrapT, magFilter = NearestFilter, minFilter = NearestFilter, anisotropy, format = DepthFormat, depth = 1 ) {\n\n\t\tif ( format !== DepthFormat && format !== DepthStencilFormat ) {\n\n\t\t\tthrow new Error( 'DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat' );\n\n\t\t}\n\n\t\tconst image = { width: width, height: height, depth: depth };\n\n\t\tsuper( image, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isDepthTexture = true;\n\n\t\t/**\n\t\t * If set to `true`, the texture is flipped along the vertical axis when\n\t\t * uploaded to the GPU.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.flipY = false;\n\n\t\t/**\n\t\t * Whether to generate mipmaps (if possible) for a texture.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.generateMipmaps = false;\n\n\t\t/**\n\t\t * Code corresponding to the depth compare function.\n\t\t *\n\t\t * @type {?(NeverCompare|LessCompare|EqualCompare|LessEqualCompare|GreaterCompare|NotEqualCompare|GreaterEqualCompare|AlwaysCompare)}\n\t\t * @default null\n\t\t */\n\t\tthis.compareFunction = null;\n\n\t}\n\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.source = new Source( Object.assign( {}, source.image ) ); // see #30540\n\t\tthis.compareFunction = source.compareFunction;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tif ( this.compareFunction !== null ) data.compareFunction = this.compareFunction;\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * Represents a texture created externally with the same renderer context.\n *\n * This may be a texture from a protected media stream, device camera feed,\n * or other data feeds like a depth sensor.\n *\n * Note that this class is only supported in {@link WebGLRenderer}, and in\n * the {@link WebGPURenderer} WebGPU backend.\n *\n * @augments Texture\n */\nclass ExternalTexture extends Texture {\n\n\t/**\n\t * Creates a new raw texture.\n\t *\n\t * @param {?(WebGLTexture|GPUTexture)} [sourceTexture=null] - The external texture.\n\t */\n\tconstructor( sourceTexture = null ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The external source texture.\n\t\t *\n\t\t * @type {?(WebGLTexture|GPUTexture)}\n\t\t * @default null\n\t\t */\n\t\tthis.sourceTexture = sourceTexture;\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isExternalTexture = true;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.sourceTexture = source.sourceTexture;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A geometry class for representing a capsule.\n *\n * ```js\n * const geometry = new THREE.CapsuleGeometry( 1, 1, 4, 8, 1 );\n * const material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );\n * const capsule = new THREE.Mesh( geometry, material );\n * scene.add( capsule );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#CapsuleGeometry\n */\nclass CapsuleGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new capsule geometry.\n\t *\n\t * @param {number} [radius=1] - Radius of the capsule.\n\t * @param {number} [height=1] - Height of the middle section.\n\t * @param {number} [capSegments=4] - Number of curve segments used to build each cap.\n\t * @param {number} [radialSegments=8] - Number of segmented faces around the circumference of the capsule. Must be an integer >= 3.\n\t * @param {number} [heightSegments=1] - Number of rows of faces along the height of the middle section. Must be an integer >= 1.\n\t */\n\tconstructor( radius = 1, height = 1, capSegments = 4, radialSegments = 8, heightSegments = 1 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'CapsuleGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\theight: height,\n\t\t\tcapSegments: capSegments,\n\t\t\tradialSegments: radialSegments,\n\t\t\theightSegments: heightSegments,\n\t\t};\n\n\t\theight = Math.max( 0, height );\n\t\tcapSegments = Math.max( 1, Math.floor( capSegments ) );\n\t\tradialSegments = Math.max( 3, Math.floor( radialSegments ) );\n\t\theightSegments = Math.max( 1, Math.floor( heightSegments ) );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tconst halfHeight = height / 2;\n\t\tconst capArcLength = ( Math.PI / 2 ) * radius;\n\t\tconst cylinderPartLength = height;\n\t\tconst totalArcLength = 2 * capArcLength + cylinderPartLength;\n\n\t\tconst numVerticalSegments = capSegments * 2 + heightSegments;\n\t\tconst verticesPerRow = radialSegments + 1;\n\n\t\tconst normal = new Vector3();\n\t\tconst vertex = new Vector3();\n\n\t\t// generate vertices, normals, and uvs\n\n\t\tfor ( let iy = 0; iy <= numVerticalSegments; iy ++ ) {\n\n\t\t\tlet currentArcLength = 0;\n\t\t\tlet profileY = 0;\n\t\t\tlet profileRadius = 0;\n\t\t\tlet normalYComponent = 0;\n\n\t\t\tif ( iy <= capSegments ) {\n\n\t\t\t\t// bottom cap\n\t\t\t\tconst segmentProgress = iy / capSegments;\n\t\t\t\tconst angle = ( segmentProgress * Math.PI ) / 2;\n\t\t\t\tprofileY = - halfHeight - radius * Math.cos( angle );\n\t\t\t\tprofileRadius = radius * Math.sin( angle );\n\t\t\t\tnormalYComponent = - radius * Math.cos( angle );\n\t\t\t\tcurrentArcLength = segmentProgress * capArcLength;\n\n\t\t\t} else if ( iy <= capSegments + heightSegments ) {\n\n\t\t\t\t// middle section\n\t\t\t\tconst segmentProgress = ( iy - capSegments ) / heightSegments;\n\t\t\t\tprofileY = - halfHeight + segmentProgress * height;\n\t\t\t\tprofileRadius = radius;\n\t\t\t\tnormalYComponent = 0;\n\t\t\t\tcurrentArcLength = capArcLength + segmentProgress * cylinderPartLength;\n\n\t\t\t} else {\n\n\t\t\t\t// top cap\n\t\t\t\tconst segmentProgress =\n\t\t\t\t\t( iy - capSegments - heightSegments ) / capSegments;\n\t\t\t\tconst angle = ( segmentProgress * Math.PI ) / 2;\n\t\t\t\tprofileY = halfHeight + radius * Math.sin( angle );\n\t\t\t\tprofileRadius = radius * Math.cos( angle );\n\t\t\t\tnormalYComponent = radius * Math.sin( angle );\n\t\t\t\tcurrentArcLength =\n\t\t\t\t\tcapArcLength + cylinderPartLength + segmentProgress * capArcLength;\n\n\t\t\t}\n\n\t\t\tconst v = Math.max( 0, Math.min( 1, currentArcLength / totalArcLength ) );\n\n\n\t\t\t// special case for the poles\n\n\t\t\tlet uOffset = 0;\n\n\t\t\tif ( iy === 0 ) {\n\n\t\t\t\tuOffset = 0.5 / radialSegments;\n\n\t\t\t} else if ( iy === numVerticalSegments ) {\n\n\t\t\t\tuOffset = -0.5 / radialSegments;\n\n\t\t\t}\n\n\t\t\tfor ( let ix = 0; ix <= radialSegments; ix ++ ) {\n\n\t\t\t\tconst u = ix / radialSegments;\n\t\t\t\tconst theta = u * Math.PI * 2;\n\n\t\t\t\tconst sinTheta = Math.sin( theta );\n\t\t\t\tconst cosTheta = Math.cos( theta );\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = - profileRadius * cosTheta;\n\t\t\t\tvertex.y = profileY;\n\t\t\t\tvertex.z = profileRadius * sinTheta;\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormal.set(\n\t\t\t\t\t- profileRadius * cosTheta,\n\t\t\t\t\tnormalYComponent,\n\t\t\t\t\tprofileRadius * sinTheta\n\t\t\t\t);\n\t\t\t\tnormal.normalize();\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( u + uOffset, v );\n\n\t\t\t}\n\n\t\t\tif ( iy > 0 ) {\n\n\t\t\t\tconst prevIndexRow = ( iy - 1 ) * verticesPerRow;\n\t\t\t\tfor ( let ix = 0; ix < radialSegments; ix ++ ) {\n\n\t\t\t\t\tconst i1 = prevIndexRow + ix;\n\t\t\t\t\tconst i2 = prevIndexRow + ix + 1;\n\t\t\t\t\tconst i3 = iy * verticesPerRow + ix;\n\t\t\t\t\tconst i4 = iy * verticesPerRow + ix + 1;\n\n\t\t\t\t\tindices.push( i1, i2, i3 );\n\t\t\t\t\tindices.push( i2, i4, i3 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {CapsuleGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new CapsuleGeometry( data.radius, data.height, data.capSegments, data.radialSegments, data.heightSegments );\n\n\t}\n\n}\n\n/**\n * A simple shape of Euclidean geometry. It is constructed from a\n * number of triangular segments that are oriented around a central point and\n * extend as far out as a given radius. It is built counter-clockwise from a\n * start angle and a given central angle. It can also be used to create\n * regular polygons, where the number of segments determines the number of\n * sides.\n *\n * ```js\n * const geometry = new THREE.CircleGeometry( 5, 32 );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const circle = new THREE.Mesh( geometry, material );\n * scene.add( circle )\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#CircleGeometry\n */\nclass CircleGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new circle geometry.\n\t *\n\t * @param {number} [radius=1] - Radius of the circle.\n\t * @param {number} [segments=32] - Number of segments (triangles), minimum = `3`.\n\t * @param {number} [thetaStart=0] - Start angle for first segment in radians.\n\t * @param {number} [thetaLength=Math.PI*2] - The central angle, often called theta,\n\t * of the circular sector in radians. The default value results in a complete circle.\n\t */\n\tconstructor( radius = 1, segments = 32, thetaStart = 0, thetaLength = Math.PI * 2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'CircleGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tsegments: segments,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tsegments = Math.max( 3, segments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tconst vertex = new Vector3();\n\t\tconst uv = new Vector2();\n\n\t\t// center point\n\n\t\tvertices.push( 0, 0, 0 );\n\t\tnormals.push( 0, 0, 1 );\n\t\tuvs.push( 0.5, 0.5 );\n\n\t\tfor ( let s = 0, i = 3; s <= segments; s ++, i += 3 ) {\n\n\t\t\tconst segment = thetaStart + s / segments * thetaLength;\n\n\t\t\t// vertex\n\n\t\t\tvertex.x = radius * Math.cos( segment );\n\t\t\tvertex.y = radius * Math.sin( segment );\n\n\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t// normal\n\n\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\t// uvs\n\n\t\t\tuv.x = ( vertices[ i ] / radius + 1 ) / 2;\n\t\t\tuv.y = ( vertices[ i + 1 ] / radius + 1 ) / 2;\n\n\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( let i = 1; i <= segments; i ++ ) {\n\n\t\t\tindices.push( i, i + 1, 0 );\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {CircleGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new CircleGeometry( data.radius, data.segments, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\n/**\n * A geometry class for representing a cylinder.\n *\n * ```js\n * const geometry = new THREE.CylinderGeometry( 5, 5, 20, 32 );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const cylinder = new THREE.Mesh( geometry, material );\n * scene.add( cylinder );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#CylinderGeometry\n */\nclass CylinderGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new cylinder geometry.\n\t *\n\t * @param {number} [radiusTop=1] - Radius of the cylinder at the top.\n\t * @param {number} [radiusBottom=1] - Radius of the cylinder at the bottom.\n\t * @param {number} [height=1] - Height of the cylinder.\n\t * @param {number} [radialSegments=32] - Number of segmented faces around the circumference of the cylinder.\n\t * @param {number} [heightSegments=1] - Number of rows of faces along the height of the cylinder.\n\t * @param {boolean} [openEnded=false] - Whether the base of the cylinder is open or capped.\n\t * @param {number} [thetaStart=0] - Start angle for first segment, in radians.\n\t * @param {number} [thetaLength=Math.PI*2] - The central angle, often called theta, of the circular sector, in radians.\n\t * The default value results in a complete cylinder.\n\t */\n\tconstructor( radiusTop = 1, radiusBottom = 1, height = 1, radialSegments = 32, heightSegments = 1, openEnded = false, thetaStart = 0, thetaLength = Math.PI * 2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'CylinderGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradiusTop: radiusTop,\n\t\t\tradiusBottom: radiusBottom,\n\t\t\theight: height,\n\t\t\tradialSegments: radialSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\topenEnded: openEnded,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tconst scope = this;\n\n\t\tradialSegments = Math.floor( radialSegments );\n\t\theightSegments = Math.floor( heightSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tlet index = 0;\n\t\tconst indexArray = [];\n\t\tconst halfHeight = height / 2;\n\t\tlet groupStart = 0;\n\n\t\t// generate geometry\n\n\t\tgenerateTorso();\n\n\t\tif ( openEnded === false ) {\n\n\t\t\tif ( radiusTop > 0 ) generateCap( true );\n\t\t\tif ( radiusBottom > 0 ) generateCap( false );\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\tfunction generateTorso() {\n\n\t\t\tconst normal = new Vector3();\n\t\t\tconst vertex = new Vector3();\n\n\t\t\tlet groupCount = 0;\n\n\t\t\t// this will be used to calculate the normal\n\t\t\tconst slope = ( radiusBottom - radiusTop ) / height;\n\n\t\t\t// generate vertices, normals and uvs\n\n\t\t\tfor ( let y = 0; y <= heightSegments; y ++ ) {\n\n\t\t\t\tconst indexRow = [];\n\n\t\t\t\tconst v = y / heightSegments;\n\n\t\t\t\t// calculate the radius of the current row\n\n\t\t\t\tconst radius = v * ( radiusBottom - radiusTop ) + radiusTop;\n\n\t\t\t\tfor ( let x = 0; x <= radialSegments; x ++ ) {\n\n\t\t\t\t\tconst u = x / radialSegments;\n\n\t\t\t\t\tconst theta = u * thetaLength + thetaStart;\n\n\t\t\t\t\tconst sinTheta = Math.sin( theta );\n\t\t\t\t\tconst cosTheta = Math.cos( theta );\n\n\t\t\t\t\t// vertex\n\n\t\t\t\t\tvertex.x = radius * sinTheta;\n\t\t\t\t\tvertex.y = - v * height + halfHeight;\n\t\t\t\t\tvertex.z = radius * cosTheta;\n\t\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t\t// normal\n\n\t\t\t\t\tnormal.set( sinTheta, slope, cosTheta ).normalize();\n\t\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t\t// uv\n\n\t\t\t\t\tuvs.push( u, 1 - v );\n\n\t\t\t\t\t// save index of vertex in respective row\n\n\t\t\t\t\tindexRow.push( index ++ );\n\n\t\t\t\t}\n\n\t\t\t\t// now save vertices of the row in our index array\n\n\t\t\t\tindexArray.push( indexRow );\n\n\t\t\t}\n\n\t\t\t// generate indices\n\n\t\t\tfor ( let x = 0; x < radialSegments; x ++ ) {\n\n\t\t\t\tfor ( let y = 0; y < heightSegments; y ++ ) {\n\n\t\t\t\t\t// we use the index array to access the correct indices\n\n\t\t\t\t\tconst a = indexArray[ y ][ x ];\n\t\t\t\t\tconst b = indexArray[ y + 1 ][ x ];\n\t\t\t\t\tconst c = indexArray[ y + 1 ][ x + 1 ];\n\t\t\t\t\tconst d = indexArray[ y ][ x + 1 ];\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tif ( radiusTop > 0 || y !== 0 ) {\n\n\t\t\t\t\t\tindices.push( a, b, d );\n\t\t\t\t\t\tgroupCount += 3;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( radiusBottom > 0 || y !== heightSegments - 1 ) {\n\n\t\t\t\t\t\tindices.push( b, c, d );\n\t\t\t\t\t\tgroupCount += 3;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup( groupStart, groupCount, 0 );\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\n\t\t}\n\n\t\tfunction generateCap( top ) {\n\n\t\t\t// save the index of the first center vertex\n\t\t\tconst centerIndexStart = index;\n\n\t\t\tconst uv = new Vector2();\n\t\t\tconst vertex = new Vector3();\n\n\t\t\tlet groupCount = 0;\n\n\t\t\tconst radius = ( top === true ) ? radiusTop : radiusBottom;\n\t\t\tconst sign = ( top === true ) ? 1 : -1;\n\n\t\t\t// first we generate the center vertex data of the cap.\n\t\t\t// because the geometry needs one set of uvs per face,\n\t\t\t// we must generate a center vertex per face/segment\n\n\t\t\tfor ( let x = 1; x <= radialSegments; x ++ ) {\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertices.push( 0, halfHeight * sign, 0 );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormals.push( 0, sign, 0 );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( 0.5, 0.5 );\n\n\t\t\t\t// increase index\n\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t\t// save the index of the last center vertex\n\t\t\tconst centerIndexEnd = index;\n\n\t\t\t// now we generate the surrounding vertices, normals and uvs\n\n\t\t\tfor ( let x = 0; x <= radialSegments; x ++ ) {\n\n\t\t\t\tconst u = x / radialSegments;\n\t\t\t\tconst theta = u * thetaLength + thetaStart;\n\n\t\t\t\tconst cosTheta = Math.cos( theta );\n\t\t\t\tconst sinTheta = Math.sin( theta );\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = radius * sinTheta;\n\t\t\t\tvertex.y = halfHeight * sign;\n\t\t\t\tvertex.z = radius * cosTheta;\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormals.push( 0, sign, 0 );\n\n\t\t\t\t// uv\n\n\t\t\t\tuv.x = ( cosTheta * 0.5 ) + 0.5;\n\t\t\t\tuv.y = ( sinTheta * 0.5 * sign ) + 0.5;\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t\t// increase index\n\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t\t// generate indices\n\n\t\t\tfor ( let x = 0; x < radialSegments; x ++ ) {\n\n\t\t\t\tconst c = centerIndexStart + x;\n\t\t\t\tconst i = centerIndexEnd + x;\n\n\t\t\t\tif ( top === true ) {\n\n\t\t\t\t\t// face top\n\n\t\t\t\t\tindices.push( i, i + 1, c );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// face bottom\n\n\t\t\t\t\tindices.push( i + 1, i, c );\n\n\t\t\t\t}\n\n\t\t\t\tgroupCount += 3;\n\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup( groupStart, groupCount, top === true ? 1 : 2 );\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {CylinderGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new CylinderGeometry( data.radiusTop, data.radiusBottom, data.height, data.radialSegments, data.heightSegments, data.openEnded, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\n/**\n * A geometry class for representing a cone.\n *\n * ```js\n * const geometry = new THREE.ConeGeometry( 5, 20, 32 );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const cone = new THREE.Mesh(geometry, material );\n * scene.add( cone );\n * ```\n *\n * @augments CylinderGeometry\n * @demo scenes/geometry-browser.html#ConeGeometry\n */\nclass ConeGeometry extends CylinderGeometry {\n\n\t/**\n\t * Constructs a new cone geometry.\n\t *\n\t * @param {number} [radius=1] - Radius of the cone base.\n\t * @param {number} [height=1] - Height of the cone.\n\t * @param {number} [radialSegments=32] - Number of segmented faces around the circumference of the cone.\n\t * @param {number} [heightSegments=1] - Number of rows of faces along the height of the cone.\n\t * @param {boolean} [openEnded=false] - Whether the base of the cone is open or capped.\n\t * @param {number} [thetaStart=0] - Start angle for first segment, in radians.\n\t * @param {number} [thetaLength=Math.PI*2] - The central angle, often called theta, of the circular sector, in radians.\n\t * The default value results in a complete cone.\n\t */\n\tconstructor( radius = 1, height = 1, radialSegments = 32, heightSegments = 1, openEnded = false, thetaStart = 0, thetaLength = Math.PI * 2 ) {\n\n\t\tsuper( 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength );\n\n\t\tthis.type = 'ConeGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\theight: height,\n\t\t\tradialSegments: radialSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\topenEnded: openEnded,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {ConeGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new ConeGeometry( data.radius, data.height, data.radialSegments, data.heightSegments, data.openEnded, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\n/**\n * A polyhedron is a solid in three dimensions with flat faces. This class\n * will take an array of vertices, project them onto a sphere, and then\n * divide them up to the desired level of detail.\n *\n * @augments BufferGeometry\n */\nclass PolyhedronGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new polyhedron geometry.\n\t *\n\t * @param {Array<number>} [vertices] - A flat array of vertices describing the base shape.\n\t * @param {Array<number>} [indices] - A flat array of indices describing the base shape.\n\t * @param {number} [radius=1] - The radius of the shape.\n\t * @param {number} [detail=0] - How many levels to subdivide the geometry. The more detail, the smoother the shape.\n\t */\n\tconstructor( vertices = [], indices = [], radius = 1, detail = 0 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'PolyhedronGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tvertices: vertices,\n\t\t\tindices: indices,\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t\t// default buffer data\n\n\t\tconst vertexBuffer = [];\n\t\tconst uvBuffer = [];\n\n\t\t// the subdivision creates the vertex buffer data\n\n\t\tsubdivide( detail );\n\n\t\t// all vertices should lie on a conceptual sphere with a given radius\n\n\t\tapplyRadius( radius );\n\n\t\t// finally, create the uv data\n\n\t\tgenerateUVs();\n\n\t\t// build non-indexed geometry\n\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertexBuffer, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( vertexBuffer.slice(), 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvBuffer, 2 ) );\n\n\t\tif ( detail === 0 ) {\n\n\t\t\tthis.computeVertexNormals(); // flat normals\n\n\t\t} else {\n\n\t\t\tthis.normalizeNormals(); // smooth normals\n\n\t\t}\n\n\t\t// helper functions\n\n\t\tfunction subdivide( detail ) {\n\n\t\t\tconst a = new Vector3();\n\t\t\tconst b = new Vector3();\n\t\t\tconst c = new Vector3();\n\n\t\t\t// iterate over all faces and apply a subdivision with the given detail value\n\n\t\t\tfor ( let i = 0; i < indices.length; i += 3 ) {\n\n\t\t\t\t// get the vertices of the face\n\n\t\t\t\tgetVertexByIndex( indices[ i + 0 ], a );\n\t\t\t\tgetVertexByIndex( indices[ i + 1 ], b );\n\t\t\t\tgetVertexByIndex( indices[ i + 2 ], c );\n\n\t\t\t\t// perform subdivision\n\n\t\t\t\tsubdivideFace( a, b, c, detail );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction subdivideFace( a, b, c, detail ) {\n\n\t\t\tconst cols = detail + 1;\n\n\t\t\t// we use this multidimensional array as a data structure for creating the subdivision\n\n\t\t\tconst v = [];\n\n\t\t\t// construct all of the vertices for this subdivision\n\n\t\t\tfor ( let i = 0; i <= cols; i ++ ) {\n\n\t\t\t\tv[ i ] = [];\n\n\t\t\t\tconst aj = a.clone().lerp( c, i / cols );\n\t\t\t\tconst bj = b.clone().lerp( c, i / cols );\n\n\t\t\t\tconst rows = cols - i;\n\n\t\t\t\tfor ( let j = 0; j <= rows; j ++ ) {\n\n\t\t\t\t\tif ( j === 0 && i === cols ) {\n\n\t\t\t\t\t\tv[ i ][ j ] = aj;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tv[ i ][ j ] = aj.clone().lerp( bj, j / rows );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// construct all of the faces\n\n\t\t\tfor ( let i = 0; i < cols; i ++ ) {\n\n\t\t\t\tfor ( let j = 0; j < 2 * ( cols - i ) - 1; j ++ ) {\n\n\t\t\t\t\tconst k = Math.floor( j / 2 );\n\n\t\t\t\t\tif ( j % 2 === 0 ) {\n\n\t\t\t\t\t\tpushVertex( v[ i ][ k + 1 ] );\n\t\t\t\t\t\tpushVertex( v[ i + 1 ][ k ] );\n\t\t\t\t\t\tpushVertex( v[ i ][ k ] );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tpushVertex( v[ i ][ k + 1 ] );\n\t\t\t\t\t\tpushVertex( v[ i + 1 ][ k + 1 ] );\n\t\t\t\t\t\tpushVertex( v[ i + 1 ][ k ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction applyRadius( radius ) {\n\n\t\t\tconst vertex = new Vector3();\n\n\t\t\t// iterate over the entire buffer and apply the radius to each vertex\n\n\t\t\tfor ( let i = 0; i < vertexBuffer.length; i += 3 ) {\n\n\t\t\t\tvertex.x = vertexBuffer[ i + 0 ];\n\t\t\t\tvertex.y = vertexBuffer[ i + 1 ];\n\t\t\t\tvertex.z = vertexBuffer[ i + 2 ];\n\n\t\t\t\tvertex.normalize().multiplyScalar( radius );\n\n\t\t\t\tvertexBuffer[ i + 0 ] = vertex.x;\n\t\t\t\tvertexBuffer[ i + 1 ] = vertex.y;\n\t\t\t\tvertexBuffer[ i + 2 ] = vertex.z;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction generateUVs() {\n\n\t\t\tconst vertex = new Vector3();\n\n\t\t\tfor ( let i = 0; i < vertexBuffer.length; i += 3 ) {\n\n\t\t\t\tvertex.x = vertexBuffer[ i + 0 ];\n\t\t\t\tvertex.y = vertexBuffer[ i + 1 ];\n\t\t\t\tvertex.z = vertexBuffer[ i + 2 ];\n\n\t\t\t\tconst u = azimuth( vertex ) / 2 / Math.PI + 0.5;\n\t\t\t\tconst v = inclination( vertex ) / Math.PI + 0.5;\n\t\t\t\tuvBuffer.push( u, 1 - v );\n\n\t\t\t}\n\n\t\t\tcorrectUVs();\n\n\t\t\tcorrectSeam();\n\n\t\t}\n\n\t\tfunction correctSeam() {\n\n\t\t\t// handle case when face straddles the seam, see #3269\n\n\t\t\tfor ( let i = 0; i < uvBuffer.length; i += 6 ) {\n\n\t\t\t\t// uv data of a single face\n\n\t\t\t\tconst x0 = uvBuffer[ i + 0 ];\n\t\t\t\tconst x1 = uvBuffer[ i + 2 ];\n\t\t\t\tconst x2 = uvBuffer[ i + 4 ];\n\n\t\t\t\tconst max = Math.max( x0, x1, x2 );\n\t\t\t\tconst min = Math.min( x0, x1, x2 );\n\n\t\t\t\t// 0.9 is somewhat arbitrary\n\n\t\t\t\tif ( max > 0.9 && min < 0.1 ) {\n\n\t\t\t\t\tif ( x0 < 0.2 ) uvBuffer[ i + 0 ] += 1;\n\t\t\t\t\tif ( x1 < 0.2 ) uvBuffer[ i + 2 ] += 1;\n\t\t\t\t\tif ( x2 < 0.2 ) uvBuffer[ i + 4 ] += 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction pushVertex( vertex ) {\n\n\t\t\tvertexBuffer.push( vertex.x, vertex.y, vertex.z );\n\n\t\t}\n\n\t\tfunction getVertexByIndex( index, vertex ) {\n\n\t\t\tconst stride = index * 3;\n\n\t\t\tvertex.x = vertices[ stride + 0 ];\n\t\t\tvertex.y = vertices[ stride + 1 ];\n\t\t\tvertex.z = vertices[ stride + 2 ];\n\n\t\t}\n\n\t\tfunction correctUVs() {\n\n\t\t\tconst a = new Vector3();\n\t\t\tconst b = new Vector3();\n\t\t\tconst c = new Vector3();\n\n\t\t\tconst centroid = new Vector3();\n\n\t\t\tconst uvA = new Vector2();\n\t\t\tconst uvB = new Vector2();\n\t\t\tconst uvC = new Vector2();\n\n\t\t\tfor ( let i = 0, j = 0; i < vertexBuffer.length; i += 9, j += 6 ) {\n\n\t\t\t\ta.set( vertexBuffer[ i + 0 ], vertexBuffer[ i + 1 ], vertexBuffer[ i + 2 ] );\n\t\t\t\tb.set( vertexBuffer[ i + 3 ], vertexBuffer[ i + 4 ], vertexBuffer[ i + 5 ] );\n\t\t\t\tc.set( vertexBuffer[ i + 6 ], vertexBuffer[ i + 7 ], vertexBuffer[ i + 8 ] );\n\n\t\t\t\tuvA.set( uvBuffer[ j + 0 ], uvBuffer[ j + 1 ] );\n\t\t\t\tuvB.set( uvBuffer[ j + 2 ], uvBuffer[ j + 3 ] );\n\t\t\t\tuvC.set( uvBuffer[ j + 4 ], uvBuffer[ j + 5 ] );\n\n\t\t\t\tcentroid.copy( a ).add( b ).add( c ).divideScalar( 3 );\n\n\t\t\t\tconst azi = azimuth( centroid );\n\n\t\t\t\tcorrectUV( uvA, j + 0, a, azi );\n\t\t\t\tcorrectUV( uvB, j + 2, b, azi );\n\t\t\t\tcorrectUV( uvC, j + 4, c, azi );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction correctUV( uv, stride, vector, azimuth ) {\n\n\t\t\tif ( ( azimuth < 0 ) && ( uv.x === 1 ) ) {\n\n\t\t\t\tuvBuffer[ stride ] = uv.x - 1;\n\n\t\t\t}\n\n\t\t\tif ( ( vector.x === 0 ) && ( vector.z === 0 ) ) {\n\n\t\t\t\tuvBuffer[ stride ] = azimuth / 2 / Math.PI + 0.5;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Angle around the Y axis, counter-clockwise when looking from above.\n\n\t\tfunction azimuth( vector ) {\n\n\t\t\treturn Math.atan2( vector.z, - vector.x );\n\n\t\t}\n\n\n\t\t// Angle above the XZ plane.\n\n\t\tfunction inclination( vector ) {\n\n\t\t\treturn Math.atan2( - vector.y, Math.sqrt( ( vector.x * vector.x ) + ( vector.z * vector.z ) ) );\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {PolyhedronGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new PolyhedronGeometry( data.vertices, data.indices, data.radius, data.details );\n\n\t}\n\n}\n\n/**\n * A geometry class for representing a dodecahedron.\n *\n * ```js\n * const geometry = new THREE.DodecahedronGeometry();\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const dodecahedron = new THREE.Mesh( geometry, material );\n * scene.add( dodecahedron );\n * ```\n *\n * @augments PolyhedronGeometry\n * @demo scenes/geometry-browser.html#DodecahedronGeometry\n */\nclass DodecahedronGeometry extends PolyhedronGeometry {\n\n\t/**\n\t * Constructs a new dodecahedron geometry.\n\t *\n\t * @param {number} [radius=1] - Radius of the dodecahedron.\n\t * @param {number} [detail=0] - Setting this to a value greater than `0` adds vertices making it no longer a dodecahedron.\n\t */\n\tconstructor( radius = 1, detail = 0 ) {\n\n\t\tconst t = ( 1 + Math.sqrt( 5 ) ) / 2;\n\t\tconst r = 1 / t;\n\n\t\tconst vertices = [\n\n\t\t\t// (±1, ±1, ±1)\n\t\t\t-1, -1, -1,\t-1, -1, 1,\n\t\t\t-1, 1, -1, -1, 1, 1,\n\t\t\t1, -1, -1, 1, -1, 1,\n\t\t\t1, 1, -1, 1, 1, 1,\n\n\t\t\t// (0, ±1/φ, ±φ)\n\t\t\t0, - r, - t, 0, - r, t,\n\t\t\t0, r, - t, 0, r, t,\n\n\t\t\t// (±1/φ, ±φ, 0)\n\t\t\t- r, - t, 0, - r, t, 0,\n\t\t\tr, - t, 0, r, t, 0,\n\n\t\t\t// (±φ, 0, ±1/φ)\n\t\t\t- t, 0, - r, t, 0, - r,\n\t\t\t- t, 0, r, t, 0, r\n\t\t];\n\n\t\tconst indices = [\n\t\t\t3, 11, 7, \t3, 7, 15, \t3, 15, 13,\n\t\t\t7, 19, 17, \t7, 17, 6, \t7, 6, 15,\n\t\t\t17, 4, 8, \t17, 8, 10, \t17, 10, 6,\n\t\t\t8, 0, 16, \t8, 16, 2, \t8, 2, 10,\n\t\t\t0, 12, 1, \t0, 1, 18, \t0, 18, 16,\n\t\t\t6, 10, 2, \t6, 2, 13, \t6, 13, 15,\n\t\t\t2, 16, 18, \t2, 18, 3, \t2, 3, 13,\n\t\t\t18, 1, 9, \t18, 9, 11, \t18, 11, 3,\n\t\t\t4, 14, 12, \t4, 12, 0, \t4, 0, 8,\n\t\t\t11, 9, 5, \t11, 5, 19, \t11, 19, 7,\n\t\t\t19, 5, 14, \t19, 14, 4, \t19, 4, 17,\n\t\t\t1, 12, 14, \t1, 14, 5, \t1, 5, 9\n\t\t];\n\n\t\tsuper( vertices, indices, radius, detail );\n\n\t\tthis.type = 'DodecahedronGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {DodecahedronGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new DodecahedronGeometry( data.radius, data.detail );\n\n\t}\n\n}\n\nconst _v0 = /*@__PURE__*/ new Vector3();\nconst _v1$1 = /*@__PURE__*/ new Vector3();\nconst _normal = /*@__PURE__*/ new Vector3();\nconst _triangle = /*@__PURE__*/ new Triangle();\n\n/**\n * Can be used as a helper object to view the edges of a geometry.\n *\n * ```js\n * const geometry = new THREE.BoxGeometry();\n * const edges = new THREE.EdgesGeometry( geometry );\n * const line = new THREE.LineSegments( edges );\n * scene.add( line );\n * ```\n *\n * Note: It is not yet possible to serialize/deserialize instances of this class.\n *\n * @augments BufferGeometry\n */\nclass EdgesGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new edges geometry.\n\t *\n\t * @param {?BufferGeometry} [geometry=null] - The geometry.\n\t * @param {number} [thresholdAngle=1] - An edge is only rendered if the angle (in degrees)\n\t * between the face normals of the adjoining faces exceeds this value.\n\t */\n\tconstructor( geometry = null, thresholdAngle = 1 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'EdgesGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tgeometry: geometry,\n\t\t\tthresholdAngle: thresholdAngle\n\t\t};\n\n\t\tif ( geometry !== null ) {\n\n\t\t\tconst precisionPoints = 4;\n\t\t\tconst precision = Math.pow( 10, precisionPoints );\n\t\t\tconst thresholdDot = Math.cos( DEG2RAD * thresholdAngle );\n\n\t\t\tconst indexAttr = geometry.getIndex();\n\t\t\tconst positionAttr = geometry.getAttribute( 'position' );\n\t\t\tconst indexCount = indexAttr ? indexAttr.count : positionAttr.count;\n\n\t\t\tconst indexArr = [ 0, 0, 0 ];\n\t\t\tconst vertKeys = [ 'a', 'b', 'c' ];\n\t\t\tconst hashes = new Array( 3 );\n\n\t\t\tconst edgeData = {};\n\t\t\tconst vertices = [];\n\t\t\tfor ( let i = 0; i < indexCount; i += 3 ) {\n\n\t\t\t\tif ( indexAttr ) {\n\n\t\t\t\t\tindexArr[ 0 ] = indexAttr.getX( i );\n\t\t\t\t\tindexArr[ 1 ] = indexAttr.getX( i + 1 );\n\t\t\t\t\tindexArr[ 2 ] = indexAttr.getX( i + 2 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tindexArr[ 0 ] = i;\n\t\t\t\t\tindexArr[ 1 ] = i + 1;\n\t\t\t\t\tindexArr[ 2 ] = i + 2;\n\n\t\t\t\t}\n\n\t\t\t\tconst { a, b, c } = _triangle;\n\t\t\t\ta.fromBufferAttribute( positionAttr, indexArr[ 0 ] );\n\t\t\t\tb.fromBufferAttribute( positionAttr, indexArr[ 1 ] );\n\t\t\t\tc.fromBufferAttribute( positionAttr, indexArr[ 2 ] );\n\t\t\t\t_triangle.getNormal( _normal );\n\n\t\t\t\t// create hashes for the edge from the vertices\n\t\t\t\thashes[ 0 ] = `${ Math.round( a.x * precision ) },${ Math.round( a.y * precision ) },${ Math.round( a.z * precision ) }`;\n\t\t\t\thashes[ 1 ] = `${ Math.round( b.x * precision ) },${ Math.round( b.y * precision ) },${ Math.round( b.z * precision ) }`;\n\t\t\t\thashes[ 2 ] = `${ Math.round( c.x * precision ) },${ Math.round( c.y * precision ) },${ Math.round( c.z * precision ) }`;\n\n\t\t\t\t// skip degenerate triangles\n\t\t\t\tif ( hashes[ 0 ] === hashes[ 1 ] || hashes[ 1 ] === hashes[ 2 ] || hashes[ 2 ] === hashes[ 0 ] ) {\n\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\t// iterate over every edge\n\t\t\t\tfor ( let j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t// get the first and next vertex making up the edge\n\t\t\t\t\tconst jNext = ( j + 1 ) % 3;\n\t\t\t\t\tconst vecHash0 = hashes[ j ];\n\t\t\t\t\tconst vecHash1 = hashes[ jNext ];\n\t\t\t\t\tconst v0 = _triangle[ vertKeys[ j ] ];\n\t\t\t\t\tconst v1 = _triangle[ vertKeys[ jNext ] ];\n\n\t\t\t\t\tconst hash = `${ vecHash0 }_${ vecHash1 }`;\n\t\t\t\t\tconst reverseHash = `${ vecHash1 }_${ vecHash0 }`;\n\n\t\t\t\t\tif ( reverseHash in edgeData && edgeData[ reverseHash ] ) {\n\n\t\t\t\t\t\t// if we found a sibling edge add it into the vertex array if\n\t\t\t\t\t\t// it meets the angle threshold and delete the edge from the map.\n\t\t\t\t\t\tif ( _normal.dot( edgeData[ reverseHash ].normal ) <= thresholdDot ) {\n\n\t\t\t\t\t\t\tvertices.push( v0.x, v0.y, v0.z );\n\t\t\t\t\t\t\tvertices.push( v1.x, v1.y, v1.z );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tedgeData[ reverseHash ] = null;\n\n\t\t\t\t\t} else if ( ! ( hash in edgeData ) ) {\n\n\t\t\t\t\t\t// if we've already got an edge here then skip adding a new one\n\t\t\t\t\t\tedgeData[ hash ] = {\n\n\t\t\t\t\t\t\tindex0: indexArr[ j ],\n\t\t\t\t\t\t\tindex1: indexArr[ jNext ],\n\t\t\t\t\t\t\tnormal: _normal.clone(),\n\n\t\t\t\t\t\t};\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// iterate over all remaining, unmatched edges and add them to the vertex array\n\t\t\tfor ( const key in edgeData ) {\n\n\t\t\t\tif ( edgeData[ key ] ) {\n\n\t\t\t\t\tconst { index0, index1 } = edgeData[ key ];\n\t\t\t\t\t_v0.fromBufferAttribute( positionAttr, index0 );\n\t\t\t\t\t_v1$1.fromBufferAttribute( positionAttr, index1 );\n\n\t\t\t\t\tvertices.push( _v0.x, _v0.y, _v0.z );\n\t\t\t\t\tvertices.push( _v1$1.x, _v1$1.y, _v1$1.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * An abstract base class for creating an analytic curve object that contains methods\n * for interpolation.\n *\n * @abstract\n */\nclass Curve {\n\n\t/**\n\t * Constructs a new curve.\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * The type property is used for detecting the object type\n\t\t * in context of serialization/deserialization.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.type = 'Curve';\n\n\t\t/**\n\t\t * This value determines the amount of divisions when calculating the\n\t\t * cumulative segment lengths of a curve via {@link Curve#getLengths}. To ensure\n\t\t * precision when using methods like {@link Curve#getSpacedPoints}, it is\n\t\t * recommended to increase the value of this property if the curve is very large.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 200\n\t\t */\n\t\tthis.arcLengthDivisions = 200;\n\n\t\t/**\n\t\t * Must be set to `true` if the curve parameters have changed.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.needsUpdate = false;\n\n\t\t/**\n\t\t * An internal cache that holds precomputed curve length values.\n\t\t *\n\t\t * @private\n\t\t * @type {?Array<number>}\n\t\t * @default null\n\t\t */\n\t\tthis.cacheArcLengths = null;\n\n\t}\n\n\t/**\n\t * This method returns a vector in 2D or 3D space (depending on the curve definition)\n\t * for the given interpolation factor.\n\t *\n\t * @abstract\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {(Vector2|Vector3)} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {(Vector2|Vector3)} The position on the curve. It can be a 2D or 3D vector depending on the curve definition.\n\t */\n\tgetPoint( /* t, optionalTarget */ ) {\n\n\t\twarn( 'Curve: .getPoint() not implemented.' );\n\n\t}\n\n\t/**\n\t * This method returns a vector in 2D or 3D space (depending on the curve definition)\n\t * for the given interpolation factor. Unlike {@link Curve#getPoint}, this method honors the length\n\t * of the curve which equidistant samples.\n\t *\n\t * @param {number} u - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {(Vector2|Vector3)} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {(Vector2|Vector3)} The position on the curve. It can be a 2D or 3D vector depending on the curve definition.\n\t */\n\tgetPointAt( u, optionalTarget ) {\n\n\t\tconst t = this.getUtoTmapping( u );\n\t\treturn this.getPoint( t, optionalTarget );\n\n\t}\n\n\t/**\n\t * This method samples the curve via {@link Curve#getPoint} and returns an array of points representing\n\t * the curve shape.\n\t *\n\t * @param {number} [divisions=5] - The number of divisions.\n\t * @return {Array<(Vector2|Vector3)>} An array holding the sampled curve values. The number of points is `divisions + 1`.\n\t */\n\tgetPoints( divisions = 5 ) {\n\n\t\tconst points = [];\n\n\t\tfor ( let d = 0; d <= divisions; d ++ ) {\n\n\t\t\tpoints.push( this.getPoint( d / divisions ) );\n\n\t\t}\n\n\t\treturn points;\n\n\t}\n\n\t// Get sequence of points using getPointAt( u )\n\n\t/**\n\t * This method samples the curve via {@link Curve#getPointAt} and returns an array of points representing\n\t * the curve shape. Unlike {@link Curve#getPoints}, this method returns equi-spaced points across the entire\n\t * curve.\n\t *\n\t * @param {number} [divisions=5] - The number of divisions.\n\t * @return {Array<(Vector2|Vector3)>} An array holding the sampled curve values. The number of points is `divisions + 1`.\n\t */\n\tgetSpacedPoints( divisions = 5 ) {\n\n\t\tconst points = [];\n\n\t\tfor ( let d = 0; d <= divisions; d ++ ) {\n\n\t\t\tpoints.push( this.getPointAt( d / divisions ) );\n\n\t\t}\n\n\t\treturn points;\n\n\t}\n\n\t/**\n\t * Returns the total arc length of the curve.\n\t *\n\t * @return {number} The length of the curve.\n\t */\n\tgetLength() {\n\n\t\tconst lengths = this.getLengths();\n\t\treturn lengths[ lengths.length - 1 ];\n\n\t}\n\n\t/**\n\t * Returns an array of cumulative segment lengths of the curve.\n\t *\n\t * @param {number} [divisions=this.arcLengthDivisions] - The number of divisions.\n\t * @return {Array<number>} An array holding the cumulative segment lengths.\n\t */\n\tgetLengths( divisions = this.arcLengthDivisions ) {\n\n\t\tif ( this.cacheArcLengths &&\n\t\t\t( this.cacheArcLengths.length === divisions + 1 ) &&\n\t\t\t! this.needsUpdate ) {\n\n\t\t\treturn this.cacheArcLengths;\n\n\t\t}\n\n\t\tthis.needsUpdate = false;\n\n\t\tconst cache = [];\n\t\tlet current, last = this.getPoint( 0 );\n\t\tlet sum = 0;\n\n\t\tcache.push( 0 );\n\n\t\tfor ( let p = 1; p <= divisions; p ++ ) {\n\n\t\t\tcurrent = this.getPoint( p / divisions );\n\t\t\tsum += current.distanceTo( last );\n\t\t\tcache.push( sum );\n\t\t\tlast = current;\n\n\t\t}\n\n\t\tthis.cacheArcLengths = cache;\n\n\t\treturn cache; // { sums: cache, sum: sum }; Sum is in the last element.\n\n\t}\n\n\t/**\n\t * Update the cumulative segment distance cache. The method must be called\n\t * every time curve parameters are changed. If an updated curve is part of a\n\t * composed curve like {@link CurvePath}, this method must be called on the\n\t * composed curve, too.\n\t */\n\tupdateArcLengths() {\n\n\t\tthis.needsUpdate = true;\n\t\tthis.getLengths();\n\n\t}\n\n\t/**\n\t * Given an interpolation factor in the range `[0,1]`, this method returns an updated\n\t * interpolation factor in the same range that can be ued to sample equidistant points\n\t * from a curve.\n\t *\n\t * @param {number} u - The interpolation factor.\n\t * @param {?number} distance - An optional distance on the curve.\n\t * @return {number} The updated interpolation factor.\n\t */\n\tgetUtoTmapping( u, distance = null ) {\n\n\t\tconst arcLengths = this.getLengths();\n\n\t\tlet i = 0;\n\t\tconst il = arcLengths.length;\n\n\t\tlet targetArcLength; // The targeted u distance value to get\n\n\t\tif ( distance ) {\n\n\t\t\ttargetArcLength = distance;\n\n\t\t} else {\n\n\t\t\ttargetArcLength = u * arcLengths[ il - 1 ];\n\n\t\t}\n\n\t\t// binary search for the index with largest value smaller than target u distance\n\n\t\tlet low = 0, high = il - 1, comparison;\n\n\t\twhile ( low <= high ) {\n\n\t\t\ti = Math.floor( low + ( high - low ) / 2 ); // less likely to overflow, though probably not issue here, JS doesn't really have integers, all numbers are floats\n\n\t\t\tcomparison = arcLengths[ i ] - targetArcLength;\n\n\t\t\tif ( comparison < 0 ) {\n\n\t\t\t\tlow = i + 1;\n\n\t\t\t} else if ( comparison > 0 ) {\n\n\t\t\t\thigh = i - 1;\n\n\t\t\t} else {\n\n\t\t\t\thigh = i;\n\t\t\t\tbreak;\n\n\t\t\t\t// DONE\n\n\t\t\t}\n\n\t\t}\n\n\t\ti = high;\n\n\t\tif ( arcLengths[ i ] === targetArcLength ) {\n\n\t\t\treturn i / ( il - 1 );\n\n\t\t}\n\n\t\t// we could get finer grain at lengths, or use simple interpolation between two points\n\n\t\tconst lengthBefore = arcLengths[ i ];\n\t\tconst lengthAfter = arcLengths[ i + 1 ];\n\n\t\tconst segmentLength = lengthAfter - lengthBefore;\n\n\t\t// determine where we are between the 'before' and 'after' points\n\n\t\tconst segmentFraction = ( targetArcLength - lengthBefore ) / segmentLength;\n\n\t\t// add that fractional amount to t\n\n\t\tconst t = ( i + segmentFraction ) / ( il - 1 );\n\n\t\treturn t;\n\n\t}\n\n\t/**\n\t * Returns a unit vector tangent for the given interpolation factor.\n\t * If the derived curve does not implement its tangent derivation,\n\t * two points a small delta apart will be used to find its gradient\n\t * which seems to give a reasonable approximation.\n\t *\n\t * @param {number} t - The interpolation factor.\n\t * @param {(Vector2|Vector3)} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {(Vector2|Vector3)} The tangent vector.\n\t */\n\tgetTangent( t, optionalTarget ) {\n\n\t\tconst delta = 0.0001;\n\t\tlet t1 = t - delta;\n\t\tlet t2 = t + delta;\n\n\t\t// Capping in case of danger\n\n\t\tif ( t1 < 0 ) t1 = 0;\n\t\tif ( t2 > 1 ) t2 = 1;\n\n\t\tconst pt1 = this.getPoint( t1 );\n\t\tconst pt2 = this.getPoint( t2 );\n\n\t\tconst tangent = optionalTarget || ( ( pt1.isVector2 ) ? new Vector2() : new Vector3() );\n\n\t\ttangent.copy( pt2 ).sub( pt1 ).normalize();\n\n\t\treturn tangent;\n\n\t}\n\n\t/**\n\t * Same as {@link Curve#getTangent} but with equidistant samples.\n\t *\n\t * @param {number} u - The interpolation factor.\n\t * @param {(Vector2|Vector3)} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {(Vector2|Vector3)} The tangent vector.\n\t * @see {@link Curve#getPointAt}\n\t */\n\tgetTangentAt( u, optionalTarget ) {\n\n\t\tconst t = this.getUtoTmapping( u );\n\t\treturn this.getTangent( t, optionalTarget );\n\n\t}\n\n\t/**\n\t * Generates the Frenet Frames. Requires a curve definition in 3D space. Used\n\t * in geometries like {@link TubeGeometry} or {@link ExtrudeGeometry}.\n\t *\n\t * @param {number} segments - The number of segments.\n\t * @param {boolean} [closed=false] - Whether the curve is closed or not.\n\t * @return {{tangents: Array<Vector3>, normals: Array<Vector3>, binormals: Array<Vector3>}} The Frenet Frames.\n\t */\n\tcomputeFrenetFrames( segments, closed = false ) {\n\n\t\t// see http://www.cs.indiana.edu/pub/techreports/TR425.pdf\n\n\t\tconst normal = new Vector3();\n\n\t\tconst tangents = [];\n\t\tconst normals = [];\n\t\tconst binormals = [];\n\n\t\tconst vec = new Vector3();\n\t\tconst mat = new Matrix4();\n\n\t\t// compute the tangent vectors for each segment on the curve\n\n\t\tfor ( let i = 0; i <= segments; i ++ ) {\n\n\t\t\tconst u = i / segments;\n\n\t\t\ttangents[ i ] = this.getTangentAt( u, new Vector3() );\n\n\t\t}\n\n\t\t// select an initial normal vector perpendicular to the first tangent vector,\n\t\t// and in the direction of the minimum tangent xyz component\n\n\t\tnormals[ 0 ] = new Vector3();\n\t\tbinormals[ 0 ] = new Vector3();\n\t\tlet min = Number.MAX_VALUE;\n\t\tconst tx = Math.abs( tangents[ 0 ].x );\n\t\tconst ty = Math.abs( tangents[ 0 ].y );\n\t\tconst tz = Math.abs( tangents[ 0 ].z );\n\n\t\tif ( tx <= min ) {\n\n\t\t\tmin = tx;\n\t\t\tnormal.set( 1, 0, 0 );\n\n\t\t}\n\n\t\tif ( ty <= min ) {\n\n\t\t\tmin = ty;\n\t\t\tnormal.set( 0, 1, 0 );\n\n\t\t}\n\n\t\tif ( tz <= min ) {\n\n\t\t\tnormal.set( 0, 0, 1 );\n\n\t\t}\n\n\t\tvec.crossVectors( tangents[ 0 ], normal ).normalize();\n\n\t\tnormals[ 0 ].crossVectors( tangents[ 0 ], vec );\n\t\tbinormals[ 0 ].crossVectors( tangents[ 0 ], normals[ 0 ] );\n\n\n\t\t// compute the slowly-varying normal and binormal vectors for each segment on the curve\n\n\t\tfor ( let i = 1; i <= segments; i ++ ) {\n\n\t\t\tnormals[ i ] = normals[ i - 1 ].clone();\n\n\t\t\tbinormals[ i ] = binormals[ i - 1 ].clone();\n\n\t\t\tvec.crossVectors( tangents[ i - 1 ], tangents[ i ] );\n\n\t\t\tif ( vec.length() > Number.EPSILON ) {\n\n\t\t\t\tvec.normalize();\n\n\t\t\t\tconst theta = Math.acos( clamp( tangents[ i - 1 ].dot( tangents[ i ] ), -1, 1 ) ); // clamp for floating pt errors\n\n\t\t\t\tnormals[ i ].applyMatrix4( mat.makeRotationAxis( vec, theta ) );\n\n\t\t\t}\n\n\t\t\tbinormals[ i ].crossVectors( tangents[ i ], normals[ i ] );\n\n\t\t}\n\n\t\t// if the curve is closed, postprocess the vectors so the first and last normal vectors are the same\n\n\t\tif ( closed === true ) {\n\n\t\t\tlet theta = Math.acos( clamp( normals[ 0 ].dot( normals[ segments ] ), -1, 1 ) );\n\t\t\ttheta /= segments;\n\n\t\t\tif ( tangents[ 0 ].dot( vec.crossVectors( normals[ 0 ], normals[ segments ] ) ) > 0 ) {\n\n\t\t\t\ttheta = - theta;\n\n\t\t\t}\n\n\t\t\tfor ( let i = 1; i <= segments; i ++ ) {\n\n\t\t\t\t// twist a little...\n\t\t\t\tnormals[ i ].applyMatrix4( mat.makeRotationAxis( tangents[ i ], theta * i ) );\n\t\t\t\tbinormals[ i ].crossVectors( tangents[ i ], normals[ i ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn {\n\t\t\ttangents: tangents,\n\t\t\tnormals: normals,\n\t\t\tbinormals: binormals\n\t\t};\n\n\t}\n\n\t/**\n\t * Returns a new curve with copied values from this instance.\n\t *\n\t * @return {Curve} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Copies the values of the given curve to this instance.\n\t *\n\t * @param {Curve} source - The curve to copy.\n\t * @return {Curve} A reference to this curve.\n\t */\n\tcopy( source ) {\n\n\t\tthis.arcLengthDivisions = source.arcLengthDivisions;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Serializes the curve into JSON.\n\t *\n\t * @return {Object} A JSON object representing the serialized curve.\n\t * @see {@link ObjectLoader#parse}\n\t */\n\ttoJSON() {\n\n\t\tconst data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.7,\n\t\t\t\ttype: 'Curve',\n\t\t\t\tgenerator: 'Curve.toJSON'\n\t\t\t}\n\t\t};\n\n\t\tdata.arcLengthDivisions = this.arcLengthDivisions;\n\t\tdata.type = this.type;\n\n\t\treturn data;\n\n\t}\n\n\t/**\n\t * Deserializes the curve from the given JSON.\n\t *\n\t * @param {Object} json - The JSON holding the serialized curve.\n\t * @return {Curve} A reference to this curve.\n\t */\n\tfromJSON( json ) {\n\n\t\tthis.arcLengthDivisions = json.arcLengthDivisions;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A curve representing an ellipse.\n *\n * ```js\n * const curve = new THREE.EllipseCurve(\n * \t0, 0,\n * \t10, 10,\n * \t0, 2 * Math.PI,\n * \tfalse,\n * \t0\n * );\n *\n * const points = curve.getPoints( 50 );\n * const geometry = new THREE.BufferGeometry().setFromPoints( points );\n *\n * const material = new THREE.LineBasicMaterial( { color: 0xff0000 } );\n *\n * // Create the final object to add to the scene\n * const ellipse = new THREE.Line( geometry, material );\n * ```\n *\n * @augments Curve\n */\nclass EllipseCurve extends Curve {\n\n\t/**\n\t * Constructs a new ellipse curve.\n\t *\n\t * @param {number} [aX=0] - The X center of the ellipse.\n\t * @param {number} [aY=0] - The Y center of the ellipse.\n\t * @param {number} [xRadius=1] - The radius of the ellipse in the x direction.\n\t * @param {number} [yRadius=1] - The radius of the ellipse in the y direction.\n\t * @param {number} [aStartAngle=0] - The start angle of the curve in radians starting from the positive X axis.\n\t * @param {number} [aEndAngle=Math.PI*2] - The end angle of the curve in radians starting from the positive X axis.\n\t * @param {boolean} [aClockwise=false] - Whether the ellipse is drawn clockwise or not.\n\t * @param {number} [aRotation=0] - The rotation angle of the ellipse in radians, counterclockwise from the positive X axis.\n\t */\n\tconstructor( aX = 0, aY = 0, xRadius = 1, yRadius = 1, aStartAngle = 0, aEndAngle = Math.PI * 2, aClockwise = false, aRotation = 0 ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isEllipseCurve = true;\n\n\t\tthis.type = 'EllipseCurve';\n\n\t\t/**\n\t\t * The X center of the ellipse.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.aX = aX;\n\n\t\t/**\n\t\t * The Y center of the ellipse.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.aY = aY;\n\n\t\t/**\n\t\t * The radius of the ellipse in the x direction.\n\t\t * Setting the this value equal to the {@link EllipseCurve#yRadius} will result in a circle.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.xRadius = xRadius;\n\n\t\t/**\n\t\t * The radius of the ellipse in the y direction.\n\t\t * Setting the this value equal to the {@link EllipseCurve#xRadius} will result in a circle.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.yRadius = yRadius;\n\n\t\t/**\n\t\t * The start angle of the curve in radians starting from the positive X axis.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.aStartAngle = aStartAngle;\n\n\t\t/**\n\t\t * The end angle of the curve in radians starting from the positive X axis.\n\t\t *\n\t\t * @type {number}\n\t\t * @default Math.PI*2\n\t\t */\n\t\tthis.aEndAngle = aEndAngle;\n\n\t\t/**\n\t\t * Whether the ellipse is drawn clockwise or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.aClockwise = aClockwise;\n\n\t\t/**\n\t\t * The rotation angle of the ellipse in radians, counterclockwise from the positive X axis.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.aRotation = aRotation;\n\n\t}\n\n\t/**\n\t * Returns a point on the curve.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {Vector2} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector2} The position on the curve.\n\t */\n\tgetPoint( t, optionalTarget = new Vector2() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst twoPi = Math.PI * 2;\n\t\tlet deltaAngle = this.aEndAngle - this.aStartAngle;\n\t\tconst samePoints = Math.abs( deltaAngle ) < Number.EPSILON;\n\n\t\t// ensures that deltaAngle is 0 .. 2 PI\n\t\twhile ( deltaAngle < 0 ) deltaAngle += twoPi;\n\t\twhile ( deltaAngle > twoPi ) deltaAngle -= twoPi;\n\n\t\tif ( deltaAngle < Number.EPSILON ) {\n\n\t\t\tif ( samePoints ) {\n\n\t\t\t\tdeltaAngle = 0;\n\n\t\t\t} else {\n\n\t\t\t\tdeltaAngle = twoPi;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.aClockwise === true && ! samePoints ) {\n\n\t\t\tif ( deltaAngle === twoPi ) {\n\n\t\t\t\tdeltaAngle = - twoPi;\n\n\t\t\t} else {\n\n\t\t\t\tdeltaAngle = deltaAngle - twoPi;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst angle = this.aStartAngle + t * deltaAngle;\n\t\tlet x = this.aX + this.xRadius * Math.cos( angle );\n\t\tlet y = this.aY + this.yRadius * Math.sin( angle );\n\n\t\tif ( this.aRotation !== 0 ) {\n\n\t\t\tconst cos = Math.cos( this.aRotation );\n\t\t\tconst sin = Math.sin( this.aRotation );\n\n\t\t\tconst tx = x - this.aX;\n\t\t\tconst ty = y - this.aY;\n\n\t\t\t// Rotate the point about the center of the ellipse.\n\t\t\tx = tx * cos - ty * sin + this.aX;\n\t\t\ty = tx * sin + ty * cos + this.aY;\n\n\t\t}\n\n\t\treturn point.set( x, y );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.aX = source.aX;\n\t\tthis.aY = source.aY;\n\n\t\tthis.xRadius = source.xRadius;\n\t\tthis.yRadius = source.yRadius;\n\n\t\tthis.aStartAngle = source.aStartAngle;\n\t\tthis.aEndAngle = source.aEndAngle;\n\n\t\tthis.aClockwise = source.aClockwise;\n\n\t\tthis.aRotation = source.aRotation;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.aX = this.aX;\n\t\tdata.aY = this.aY;\n\n\t\tdata.xRadius = this.xRadius;\n\t\tdata.yRadius = this.yRadius;\n\n\t\tdata.aStartAngle = this.aStartAngle;\n\t\tdata.aEndAngle = this.aEndAngle;\n\n\t\tdata.aClockwise = this.aClockwise;\n\n\t\tdata.aRotation = this.aRotation;\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.aX = json.aX;\n\t\tthis.aY = json.aY;\n\n\t\tthis.xRadius = json.xRadius;\n\t\tthis.yRadius = json.yRadius;\n\n\t\tthis.aStartAngle = json.aStartAngle;\n\t\tthis.aEndAngle = json.aEndAngle;\n\n\t\tthis.aClockwise = json.aClockwise;\n\n\t\tthis.aRotation = json.aRotation;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A curve representing an arc.\n *\n * @augments EllipseCurve\n */\nclass ArcCurve extends EllipseCurve {\n\n\t/**\n\t * Constructs a new arc curve.\n\t *\n\t * @param {number} [aX=0] - The X center of the ellipse.\n\t * @param {number} [aY=0] - The Y center of the ellipse.\n\t * @param {number} [aRadius=1] - The radius of the ellipse in the x direction.\n\t * @param {number} [aStartAngle=0] - The start angle of the curve in radians starting from the positive X axis.\n\t * @param {number} [aEndAngle=Math.PI*2] - The end angle of the curve in radians starting from the positive X axis.\n\t * @param {boolean} [aClockwise=false] - Whether the ellipse is drawn clockwise or not.\n\t */\n\tconstructor( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\tsuper( aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isArcCurve = true;\n\n\t\tthis.type = 'ArcCurve';\n\n\t}\n\n}\n\nfunction CubicPoly() {\n\n\t/**\n\t * Centripetal CatmullRom Curve - which is useful for avoiding\n\t* cusps and self-intersections in non-uniform catmull rom curves.\n\t* http://www.cemyuksel.com/research/catmullrom_param/catmullrom.pdf\n\t*\n\t* curve.type accepts centripetal(default), chordal and catmullrom\n\t* curve.tension is used for catmullrom which defaults to 0.5\n\t*/\n\n\t/*\n\tBased on an optimized c++ solution in\n\t- http://stackoverflow.com/questions/9489736/catmull-rom-curve-with-no-cusps-and-no-self-intersections/\n\t- http://ideone.com/NoEbVM\n\n\tThis CubicPoly class could be used for reusing some variables and calculations,\n\tbut for three.js curve use, it could be possible inlined and flatten into a single function call\n\twhich can be placed in CurveUtils.\n\t*/\n\n\tlet c0 = 0, c1 = 0, c2 = 0, c3 = 0;\n\n\t/*\n\t * Compute coefficients for a cubic polynomial\n\t *   p(s) = c0 + c1*s + c2*s^2 + c3*s^3\n\t * such that\n\t *   p(0) = x0, p(1) = x1\n\t *  and\n\t *   p'(0) = t0, p'(1) = t1.\n\t */\n\tfunction init( x0, x1, t0, t1 ) {\n\n\t\tc0 = x0;\n\t\tc1 = t0;\n\t\tc2 = -3 * x0 + 3 * x1 - 2 * t0 - t1;\n\t\tc3 = 2 * x0 - 2 * x1 + t0 + t1;\n\n\t}\n\n\treturn {\n\n\t\tinitCatmullRom: function ( x0, x1, x2, x3, tension ) {\n\n\t\t\tinit( x1, x2, tension * ( x2 - x0 ), tension * ( x3 - x1 ) );\n\n\t\t},\n\n\t\tinitNonuniformCatmullRom: function ( x0, x1, x2, x3, dt0, dt1, dt2 ) {\n\n\t\t\t// compute tangents when parameterized in [t1,t2]\n\t\t\tlet t1 = ( x1 - x0 ) / dt0 - ( x2 - x0 ) / ( dt0 + dt1 ) + ( x2 - x1 ) / dt1;\n\t\t\tlet t2 = ( x2 - x1 ) / dt1 - ( x3 - x1 ) / ( dt1 + dt2 ) + ( x3 - x2 ) / dt2;\n\n\t\t\t// rescale tangents for parametrization in [0,1]\n\t\t\tt1 *= dt1;\n\t\t\tt2 *= dt1;\n\n\t\t\tinit( x1, x2, t1, t2 );\n\n\t\t},\n\n\t\tcalc: function ( t ) {\n\n\t\t\tconst t2 = t * t;\n\t\t\tconst t3 = t2 * t;\n\t\t\treturn c0 + c1 * t + c2 * t2 + c3 * t3;\n\n\t\t}\n\n\t};\n\n}\n\n//\n\nconst tmp = /*@__PURE__*/ new Vector3();\nconst px = /*@__PURE__*/ new CubicPoly();\nconst py = /*@__PURE__*/ new CubicPoly();\nconst pz = /*@__PURE__*/ new CubicPoly();\n\n/**\n * A curve representing a Catmull-Rom spline.\n *\n * ```js\n * //Create a closed wavey loop\n * const curve = new THREE.CatmullRomCurve3( [\n * \tnew THREE.Vector3( -10, 0, 10 ),\n * \tnew THREE.Vector3( -5, 5, 5 ),\n * \tnew THREE.Vector3( 0, 0, 0 ),\n * \tnew THREE.Vector3( 5, -5, 5 ),\n * \tnew THREE.Vector3( 10, 0, 10 )\n * ] );\n *\n * const points = curve.getPoints( 50 );\n * const geometry = new THREE.BufferGeometry().setFromPoints( points );\n *\n * const material = new THREE.LineBasicMaterial( { color: 0xff0000 } );\n *\n * // Create the final object to add to the scene\n * const curveObject = new THREE.Line( geometry, material );\n * ```\n *\n * @augments Curve\n */\nclass CatmullRomCurve3 extends Curve {\n\n\t/**\n\t * Constructs a new Catmull-Rom curve.\n\t *\n\t * @param {Array<Vector3>} [points] - An array of 3D points defining the curve.\n\t * @param {boolean} [closed=false] - Whether the curve is closed or not.\n\t * @param {('centripetal'|'chordal'|'catmullrom')} [curveType='centripetal'] - The curve type.\n\t * @param {number} [tension=0.5] - Tension of the curve.\n\t */\n\tconstructor( points = [], closed = false, curveType = 'centripetal', tension = 0.5 ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCatmullRomCurve3 = true;\n\n\t\tthis.type = 'CatmullRomCurve3';\n\n\t\t/**\n\t\t * An array of 3D points defining the curve.\n\t\t *\n\t\t * @type {Array<Vector3>}\n\t\t */\n\t\tthis.points = points;\n\n\t\t/**\n\t\t * Whether the curve is closed or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.closed = closed;\n\n\t\t/**\n\t\t * The curve type.\n\t\t *\n\t\t * @type {('centripetal'|'chordal'|'catmullrom')}\n\t\t * @default 'centripetal'\n\t\t */\n\t\tthis.curveType = curveType;\n\n\t\t/**\n\t\t * Tension of the curve.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.5\n\t\t */\n\t\tthis.tension = tension;\n\n\t}\n\n\t/**\n\t * Returns a point on the curve.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {Vector3} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector3} The position on the curve.\n\t */\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst points = this.points;\n\t\tconst l = points.length;\n\n\t\tconst p = ( l - ( this.closed ? 0 : 1 ) ) * t;\n\t\tlet intPoint = Math.floor( p );\n\t\tlet weight = p - intPoint;\n\n\t\tif ( this.closed ) {\n\n\t\t\tintPoint += intPoint > 0 ? 0 : ( Math.floor( Math.abs( intPoint ) / l ) + 1 ) * l;\n\n\t\t} else if ( weight === 0 && intPoint === l - 1 ) {\n\n\t\t\tintPoint = l - 2;\n\t\t\tweight = 1;\n\n\t\t}\n\n\t\tlet p0, p3; // 4 points (p1 & p2 defined below)\n\n\t\tif ( this.closed || intPoint > 0 ) {\n\n\t\t\tp0 = points[ ( intPoint - 1 ) % l ];\n\n\t\t} else {\n\n\t\t\t// extrapolate first point\n\t\t\ttmp.subVectors( points[ 0 ], points[ 1 ] ).add( points[ 0 ] );\n\t\t\tp0 = tmp;\n\n\t\t}\n\n\t\tconst p1 = points[ intPoint % l ];\n\t\tconst p2 = points[ ( intPoint + 1 ) % l ];\n\n\t\tif ( this.closed || intPoint + 2 < l ) {\n\n\t\t\tp3 = points[ ( intPoint + 2 ) % l ];\n\n\t\t} else {\n\n\t\t\t// extrapolate last point\n\t\t\ttmp.subVectors( points[ l - 1 ], points[ l - 2 ] ).add( points[ l - 1 ] );\n\t\t\tp3 = tmp;\n\n\t\t}\n\n\t\tif ( this.curveType === 'centripetal' || this.curveType === 'chordal' ) {\n\n\t\t\t// init Centripetal / Chordal Catmull-Rom\n\t\t\tconst pow = this.curveType === 'chordal' ? 0.5 : 0.25;\n\t\t\tlet dt0 = Math.pow( p0.distanceToSquared( p1 ), pow );\n\t\t\tlet dt1 = Math.pow( p1.distanceToSquared( p2 ), pow );\n\t\t\tlet dt2 = Math.pow( p2.distanceToSquared( p3 ), pow );\n\n\t\t\t// safety check for repeated points\n\t\t\tif ( dt1 < 1e-4 ) dt1 = 1.0;\n\t\t\tif ( dt0 < 1e-4 ) dt0 = dt1;\n\t\t\tif ( dt2 < 1e-4 ) dt2 = dt1;\n\n\t\t\tpx.initNonuniformCatmullRom( p0.x, p1.x, p2.x, p3.x, dt0, dt1, dt2 );\n\t\t\tpy.initNonuniformCatmullRom( p0.y, p1.y, p2.y, p3.y, dt0, dt1, dt2 );\n\t\t\tpz.initNonuniformCatmullRom( p0.z, p1.z, p2.z, p3.z, dt0, dt1, dt2 );\n\n\t\t} else if ( this.curveType === 'catmullrom' ) {\n\n\t\t\tpx.initCatmullRom( p0.x, p1.x, p2.x, p3.x, this.tension );\n\t\t\tpy.initCatmullRom( p0.y, p1.y, p2.y, p3.y, this.tension );\n\t\t\tpz.initCatmullRom( p0.z, p1.z, p2.z, p3.z, this.tension );\n\n\t\t}\n\n\t\tpoint.set(\n\t\t\tpx.calc( weight ),\n\t\t\tpy.calc( weight ),\n\t\t\tpz.calc( weight )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.points = [];\n\n\t\tfor ( let i = 0, l = source.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = source.points[ i ];\n\n\t\t\tthis.points.push( point.clone() );\n\n\t\t}\n\n\t\tthis.closed = source.closed;\n\t\tthis.curveType = source.curveType;\n\t\tthis.tension = source.tension;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.points = [];\n\n\t\tfor ( let i = 0, l = this.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = this.points[ i ];\n\t\t\tdata.points.push( point.toArray() );\n\n\t\t}\n\n\t\tdata.closed = this.closed;\n\t\tdata.curveType = this.curveType;\n\t\tdata.tension = this.tension;\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.points = [];\n\n\t\tfor ( let i = 0, l = json.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = json.points[ i ];\n\t\t\tthis.points.push( new Vector3().fromArray( point ) );\n\n\t\t}\n\n\t\tthis.closed = json.closed;\n\t\tthis.curveType = json.curveType;\n\t\tthis.tension = json.tension;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * Interpolations contains spline and Bézier functions internally used by concrete curve classes.\n *\n * Bezier Curves formulas obtained from: https://en.wikipedia.org/wiki/B%C3%A9zier_curve\n *\n * @module Interpolations\n */\n\n/**\n * Computes a point on a Catmull-Rom spline.\n *\n * @param {number} t - The interpolation factor.\n * @param {number} p0 - The first control point.\n * @param {number} p1 - The second control point.\n * @param {number} p2 - The third control point.\n * @param {number} p3 - The fourth control point.\n * @return {number} The calculated point on a Catmull-Rom spline.\n */\nfunction CatmullRom( t, p0, p1, p2, p3 ) {\n\n\tconst v0 = ( p2 - p0 ) * 0.5;\n\tconst v1 = ( p3 - p1 ) * 0.5;\n\tconst t2 = t * t;\n\tconst t3 = t * t2;\n\treturn ( 2 * p1 - 2 * p2 + v0 + v1 ) * t3 + ( -3 * p1 + 3 * p2 - 2 * v0 - v1 ) * t2 + v0 * t + p1;\n\n}\n\n//\n\nfunction QuadraticBezierP0( t, p ) {\n\n\tconst k = 1 - t;\n\treturn k * k * p;\n\n}\n\nfunction QuadraticBezierP1( t, p ) {\n\n\treturn 2 * ( 1 - t ) * t * p;\n\n}\n\nfunction QuadraticBezierP2( t, p ) {\n\n\treturn t * t * p;\n\n}\n\n/**\n * Computes a point on a Quadratic Bezier curve.\n *\n * @param {number} t - The interpolation factor.\n * @param {number} p0 - The first control point.\n * @param {number} p1 - The second control point.\n * @param {number} p2 - The third control point.\n * @return {number} The calculated point on a Quadratic Bezier curve.\n */\nfunction QuadraticBezier( t, p0, p1, p2 ) {\n\n\treturn QuadraticBezierP0( t, p0 ) + QuadraticBezierP1( t, p1 ) +\n\t\tQuadraticBezierP2( t, p2 );\n\n}\n\n//\n\nfunction CubicBezierP0( t, p ) {\n\n\tconst k = 1 - t;\n\treturn k * k * k * p;\n\n}\n\nfunction CubicBezierP1( t, p ) {\n\n\tconst k = 1 - t;\n\treturn 3 * k * k * t * p;\n\n}\n\nfunction CubicBezierP2( t, p ) {\n\n\treturn 3 * ( 1 - t ) * t * t * p;\n\n}\n\nfunction CubicBezierP3( t, p ) {\n\n\treturn t * t * t * p;\n\n}\n\n/**\n * Computes a point on a Cubic Bezier curve.\n *\n * @param {number} t - The interpolation factor.\n * @param {number} p0 - The first control point.\n * @param {number} p1 - The second control point.\n * @param {number} p2 - The third control point.\n * @param {number} p3 - The fourth control point.\n * @return {number} The calculated point on a Cubic Bezier curve.\n */\nfunction CubicBezier( t, p0, p1, p2, p3 ) {\n\n\treturn CubicBezierP0( t, p0 ) + CubicBezierP1( t, p1 ) + CubicBezierP2( t, p2 ) +\n\t\tCubicBezierP3( t, p3 );\n\n}\n\n/**\n * A curve representing a 2D Cubic Bezier curve.\n *\n * ```js\n * const curve = new THREE.CubicBezierCurve(\n * \tnew THREE.Vector2( - 0, 0 ),\n * \tnew THREE.Vector2( - 5, 15 ),\n * \tnew THREE.Vector2( 20, 15 ),\n * \tnew THREE.Vector2( 10, 0 )\n * );\n *\n * const points = curve.getPoints( 50 );\n * const geometry = new THREE.BufferGeometry().setFromPoints( points );\n *\n * const material = new THREE.LineBasicMaterial( { color: 0xff0000 } );\n *\n * // Create the final object to add to the scene\n * const curveObject = new THREE.Line( geometry, material );\n * ```\n *\n * @augments Curve\n */\nclass CubicBezierCurve extends Curve {\n\n\t/**\n\t * Constructs a new Cubic Bezier curve.\n\t *\n\t * @param {Vector2} [v0] - The start point.\n\t * @param {Vector2} [v1] - The first control point.\n\t * @param {Vector2} [v2] - The second control point.\n\t * @param {Vector2} [v3] - The end point.\n\t */\n\tconstructor( v0 = new Vector2(), v1 = new Vector2(), v2 = new Vector2(), v3 = new Vector2() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCubicBezierCurve = true;\n\n\t\tthis.type = 'CubicBezierCurve';\n\n\t\t/**\n\t\t * The start point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v0 = v0;\n\n\t\t/**\n\t\t * The first control point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v1 = v1;\n\n\t\t/**\n\t\t * The second control point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v2 = v2;\n\n\t\t/**\n\t\t * The end point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v3 = v3;\n\n\t}\n\n\t/**\n\t * Returns a point on the curve.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {Vector2} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector2} The position on the curve.\n\t */\n\tgetPoint( t, optionalTarget = new Vector2() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3;\n\n\t\tpoint.set(\n\t\t\tCubicBezier( t, v0.x, v1.x, v2.x, v3.x ),\n\t\t\tCubicBezier( t, v0.y, v1.y, v2.y, v3.y )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v0.copy( source.v0 );\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\t\tthis.v3.copy( source.v3 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v0 = this.v0.toArray();\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\t\tdata.v3 = this.v3.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v0.fromArray( json.v0 );\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\t\tthis.v3.fromArray( json.v3 );\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A curve representing a 3D Cubic Bezier curve.\n *\n * @augments Curve\n */\nclass CubicBezierCurve3 extends Curve {\n\n\t/**\n\t * Constructs a new Cubic Bezier curve.\n\t *\n\t * @param {Vector3} [v0] - The start point.\n\t * @param {Vector3} [v1] - The first control point.\n\t * @param {Vector3} [v2] - The second control point.\n\t * @param {Vector3} [v3] - The end point.\n\t */\n\tconstructor( v0 = new Vector3(), v1 = new Vector3(), v2 = new Vector3(), v3 = new Vector3() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCubicBezierCurve3 = true;\n\n\t\tthis.type = 'CubicBezierCurve3';\n\n\t\t/**\n\t\t * The start point.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.v0 = v0;\n\n\t\t/**\n\t\t * The first control point.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.v1 = v1;\n\n\t\t/**\n\t\t * The second control point.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.v2 = v2;\n\n\t\t/**\n\t\t * The end point.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.v3 = v3;\n\n\t}\n\n\t/**\n\t * Returns a point on the curve.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {Vector3} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector3} The position on the curve.\n\t */\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3;\n\n\t\tpoint.set(\n\t\t\tCubicBezier( t, v0.x, v1.x, v2.x, v3.x ),\n\t\t\tCubicBezier( t, v0.y, v1.y, v2.y, v3.y ),\n\t\t\tCubicBezier( t, v0.z, v1.z, v2.z, v3.z )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v0.copy( source.v0 );\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\t\tthis.v3.copy( source.v3 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v0 = this.v0.toArray();\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\t\tdata.v3 = this.v3.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v0.fromArray( json.v0 );\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\t\tthis.v3.fromArray( json.v3 );\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A curve representing a 2D line segment.\n *\n * @augments Curve\n */\nclass LineCurve extends Curve {\n\n\t/**\n\t * Constructs a new line curve.\n\t *\n\t * @param {Vector2} [v1] - The start point.\n\t * @param {Vector2} [v2] - The end point.\n\t */\n\tconstructor( v1 = new Vector2(), v2 = new Vector2() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLineCurve = true;\n\n\t\tthis.type = 'LineCurve';\n\n\t\t/**\n\t\t * The start point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v1 = v1;\n\n\t\t/**\n\t\t * The end point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v2 = v2;\n\n\t}\n\n\t/**\n\t * Returns a point on the line.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the line. Must be in the range `[0,1]`.\n\t * @param {Vector2} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector2} The position on the line.\n\t */\n\tgetPoint( t, optionalTarget = new Vector2() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tif ( t === 1 ) {\n\n\t\t\tpoint.copy( this.v2 );\n\n\t\t} else {\n\n\t\t\tpoint.copy( this.v2 ).sub( this.v1 );\n\t\t\tpoint.multiplyScalar( t ).add( this.v1 );\n\n\t\t}\n\n\t\treturn point;\n\n\t}\n\n\t// Line curve is linear, so we can overwrite default getPointAt\n\tgetPointAt( u, optionalTarget ) {\n\n\t\treturn this.getPoint( u, optionalTarget );\n\n\t}\n\n\tgetTangent( t, optionalTarget = new Vector2() ) {\n\n\t\treturn optionalTarget.subVectors( this.v2, this.v1 ).normalize();\n\n\t}\n\n\tgetTangentAt( u, optionalTarget ) {\n\n\t\treturn this.getTangent( u, optionalTarget );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A curve representing a 3D line segment.\n *\n * @augments Curve\n */\nclass LineCurve3 extends Curve {\n\n\t/**\n\t * Constructs a new line curve.\n\t *\n\t * @param {Vector3} [v1] - The start point.\n\t * @param {Vector3} [v2] - The end point.\n\t */\n\tconstructor( v1 = new Vector3(), v2 = new Vector3() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLineCurve3 = true;\n\n\t\tthis.type = 'LineCurve3';\n\n\t\t/**\n\t\t * The start point.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.v1 = v1;\n\n\t\t/**\n\t\t * The end point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v2 = v2;\n\n\t}\n\n\t/**\n\t * Returns a point on the line.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the line. Must be in the range `[0,1]`.\n\t * @param {Vector3} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector3} The position on the line.\n\t */\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tif ( t === 1 ) {\n\n\t\t\tpoint.copy( this.v2 );\n\n\t\t} else {\n\n\t\t\tpoint.copy( this.v2 ).sub( this.v1 );\n\t\t\tpoint.multiplyScalar( t ).add( this.v1 );\n\n\t\t}\n\n\t\treturn point;\n\n\t}\n\n\t// Line curve is linear, so we can overwrite default getPointAt\n\tgetPointAt( u, optionalTarget ) {\n\n\t\treturn this.getPoint( u, optionalTarget );\n\n\t}\n\n\tgetTangent( t, optionalTarget = new Vector3() ) {\n\n\t\treturn optionalTarget.subVectors( this.v2, this.v1 ).normalize();\n\n\t}\n\n\tgetTangentAt( u, optionalTarget ) {\n\n\t\treturn this.getTangent( u, optionalTarget );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A curve representing a 2D Quadratic Bezier curve.\n *\n * ```js\n * const curve = new THREE.QuadraticBezierCurve(\n * \tnew THREE.Vector2( - 10, 0 ),\n * \tnew THREE.Vector2( 20, 15 ),\n * \tnew THREE.Vector2( 10, 0 )\n * )\n *\n * const points = curve.getPoints( 50 );\n * const geometry = new THREE.BufferGeometry().setFromPoints( points );\n *\n * const material = new THREE.LineBasicMaterial( { color: 0xff0000 } );\n *\n * // Create the final object to add to the scene\n * const curveObject = new THREE.Line( geometry, material );\n * ```\n *\n * @augments Curve\n */\nclass QuadraticBezierCurve extends Curve {\n\n\t/**\n\t * Constructs a new Quadratic Bezier curve.\n\t *\n\t * @param {Vector2} [v0] - The start point.\n\t * @param {Vector2} [v1] - The control point.\n\t * @param {Vector2} [v2] - The end point.\n\t */\n\tconstructor( v0 = new Vector2(), v1 = new Vector2(), v2 = new Vector2() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isQuadraticBezierCurve = true;\n\n\t\tthis.type = 'QuadraticBezierCurve';\n\n\t\t/**\n\t\t * The start point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v0 = v0;\n\n\t\t/**\n\t\t * The control point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v1 = v1;\n\n\t\t/**\n\t\t * The end point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v2 = v2;\n\n\t}\n\n\t/**\n\t * Returns a point on the curve.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {Vector2} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector2} The position on the curve.\n\t */\n\tgetPoint( t, optionalTarget = new Vector2() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst v0 = this.v0, v1 = this.v1, v2 = this.v2;\n\n\t\tpoint.set(\n\t\t\tQuadraticBezier( t, v0.x, v1.x, v2.x ),\n\t\t\tQuadraticBezier( t, v0.y, v1.y, v2.y )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v0.copy( source.v0 );\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v0 = this.v0.toArray();\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v0.fromArray( json.v0 );\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A curve representing a 3D Quadratic Bezier curve.\n *\n * @augments Curve\n */\nclass QuadraticBezierCurve3 extends Curve {\n\n\t/**\n\t * Constructs a new Quadratic Bezier curve.\n\t *\n\t * @param {Vector3} [v0] - The start point.\n\t * @param {Vector3} [v1] - The control point.\n\t * @param {Vector3} [v2] - The end point.\n\t */\n\tconstructor( v0 = new Vector3(), v1 = new Vector3(), v2 = new Vector3() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isQuadraticBezierCurve3 = true;\n\n\t\tthis.type = 'QuadraticBezierCurve3';\n\n\t\t/**\n\t\t * The start point.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.v0 = v0;\n\n\t\t/**\n\t\t * The control point.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.v1 = v1;\n\n\t\t/**\n\t\t * The end point.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.v2 = v2;\n\n\t}\n\n\t/**\n\t * Returns a point on the curve.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {Vector3} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector3} The position on the curve.\n\t */\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst v0 = this.v0, v1 = this.v1, v2 = this.v2;\n\n\t\tpoint.set(\n\t\t\tQuadraticBezier( t, v0.x, v1.x, v2.x ),\n\t\t\tQuadraticBezier( t, v0.y, v1.y, v2.y ),\n\t\t\tQuadraticBezier( t, v0.z, v1.z, v2.z )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v0.copy( source.v0 );\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v0 = this.v0.toArray();\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v0.fromArray( json.v0 );\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A curve representing a 2D spline curve.\n *\n * ```js\n * // Create a sine-like wave\n * const curve = new THREE.SplineCurve( [\n * \tnew THREE.Vector2( -10, 0 ),\n * \tnew THREE.Vector2( -5, 5 ),\n * \tnew THREE.Vector2( 0, 0 ),\n * \tnew THREE.Vector2( 5, -5 ),\n * \tnew THREE.Vector2( 10, 0 )\n * ] );\n *\n * const points = curve.getPoints( 50 );\n * const geometry = new THREE.BufferGeometry().setFromPoints( points );\n *\n * const material = new THREE.LineBasicMaterial( { color: 0xff0000 } );\n *\n * // Create the final object to add to the scene\n * const splineObject = new THREE.Line( geometry, material );\n * ```\n *\n * @augments Curve\n */\nclass SplineCurve extends Curve {\n\n\t/**\n\t * Constructs a new 2D spline curve.\n\t *\n\t * @param {Array<Vector2>} [points] -  An array of 2D points defining the curve.\n\t */\n\tconstructor( points = [] ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSplineCurve = true;\n\n\t\tthis.type = 'SplineCurve';\n\n\t\t/**\n\t\t * An array of 2D points defining the curve.\n\t\t *\n\t\t * @type {Array<Vector2>}\n\t\t */\n\t\tthis.points = points;\n\n\t}\n\n\t/**\n\t * Returns a point on the curve.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {Vector2} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector2} The position on the curve.\n\t */\n\tgetPoint( t, optionalTarget = new Vector2() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst points = this.points;\n\t\tconst p = ( points.length - 1 ) * t;\n\n\t\tconst intPoint = Math.floor( p );\n\t\tconst weight = p - intPoint;\n\n\t\tconst p0 = points[ intPoint === 0 ? intPoint : intPoint - 1 ];\n\t\tconst p1 = points[ intPoint ];\n\t\tconst p2 = points[ intPoint > points.length - 2 ? points.length - 1 : intPoint + 1 ];\n\t\tconst p3 = points[ intPoint > points.length - 3 ? points.length - 1 : intPoint + 2 ];\n\n\t\tpoint.set(\n\t\t\tCatmullRom( weight, p0.x, p1.x, p2.x, p3.x ),\n\t\t\tCatmullRom( weight, p0.y, p1.y, p2.y, p3.y )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.points = [];\n\n\t\tfor ( let i = 0, l = source.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = source.points[ i ];\n\n\t\t\tthis.points.push( point.clone() );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.points = [];\n\n\t\tfor ( let i = 0, l = this.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = this.points[ i ];\n\t\t\tdata.points.push( point.toArray() );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.points = [];\n\n\t\tfor ( let i = 0, l = json.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = json.points[ i ];\n\t\t\tthis.points.push( new Vector2().fromArray( point ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\nvar Curves = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\tArcCurve: ArcCurve,\n\tCatmullRomCurve3: CatmullRomCurve3,\n\tCubicBezierCurve: CubicBezierCurve,\n\tCubicBezierCurve3: CubicBezierCurve3,\n\tEllipseCurve: EllipseCurve,\n\tLineCurve: LineCurve,\n\tLineCurve3: LineCurve3,\n\tQuadraticBezierCurve: QuadraticBezierCurve,\n\tQuadraticBezierCurve3: QuadraticBezierCurve3,\n\tSplineCurve: SplineCurve\n});\n\n/**\n * A base class extending {@link Curve}. `CurvePath` is simply an\n * array of connected curves, but retains the API of a curve.\n *\n * @augments Curve\n */\nclass CurvePath extends Curve {\n\n\t/**\n\t * Constructs a new curve path.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.type = 'CurvePath';\n\n\t\t/**\n\t\t * An array of curves defining the\n\t\t * path.\n\t\t *\n\t\t * @type {Array<Curve>}\n\t\t */\n\t\tthis.curves = [];\n\n\t\t/**\n\t\t * Whether the path should automatically be closed\n\t\t * by a line curve.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.autoClose = false;\n\n\t}\n\n\t/**\n\t * Adds a curve to this curve path.\n\t *\n\t * @param {Curve} curve - The curve to add.\n\t */\n\tadd( curve ) {\n\n\t\tthis.curves.push( curve );\n\n\t}\n\n\t/**\n\t * Adds a line curve to close the path.\n\t *\n\t * @return {CurvePath} A reference to this curve path.\n\t */\n\tclosePath() {\n\n\t\t// Add a line curve if start and end of lines are not connected\n\t\tconst startPoint = this.curves[ 0 ].getPoint( 0 );\n\t\tconst endPoint = this.curves[ this.curves.length - 1 ].getPoint( 1 );\n\n\t\tif ( ! startPoint.equals( endPoint ) ) {\n\n\t\t\tconst lineType = ( startPoint.isVector2 === true ) ? 'LineCurve' : 'LineCurve3';\n\t\t\tthis.curves.push( new Curves[ lineType ]( endPoint, startPoint ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * This method returns a vector in 2D or 3D space (depending on the curve definitions)\n\t * for the given interpolation factor.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {(Vector2|Vector3)} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {?(Vector2|Vector3)} The position on the curve. It can be a 2D or 3D vector depending on the curve definition.\n\t */\n\tgetPoint( t, optionalTarget ) {\n\n\t\t// To get accurate point with reference to\n\t\t// entire path distance at time t,\n\t\t// following has to be done:\n\n\t\t// 1. Length of each sub path have to be known\n\t\t// 2. Locate and identify type of curve\n\t\t// 3. Get t for the curve\n\t\t// 4. Return curve.getPointAt(t')\n\n\t\tconst d = t * this.getLength();\n\t\tconst curveLengths = this.getCurveLengths();\n\t\tlet i = 0;\n\n\t\t// To think about boundaries points.\n\n\t\twhile ( i < curveLengths.length ) {\n\n\t\t\tif ( curveLengths[ i ] >= d ) {\n\n\t\t\t\tconst diff = curveLengths[ i ] - d;\n\t\t\t\tconst curve = this.curves[ i ];\n\n\t\t\t\tconst segmentLength = curve.getLength();\n\t\t\t\tconst u = segmentLength === 0 ? 0 : 1 - diff / segmentLength;\n\n\t\t\t\treturn curve.getPointAt( u, optionalTarget );\n\n\t\t\t}\n\n\t\t\ti ++;\n\n\t\t}\n\n\t\treturn null;\n\n\t\t// loop where sum != 0, sum > d , sum+1 <d\n\n\t}\n\n\tgetLength() {\n\n\t\t// We cannot use the default THREE.Curve getPoint() with getLength() because in\n\t\t// THREE.Curve, getLength() depends on getPoint() but in THREE.CurvePath\n\t\t// getPoint() depends on getLength\n\n\t\tconst lens = this.getCurveLengths();\n\t\treturn lens[ lens.length - 1 ];\n\n\t}\n\n\tupdateArcLengths() {\n\n\t\t// cacheLengths must be recalculated.\n\n\t\tthis.needsUpdate = true;\n\t\tthis.cacheLengths = null;\n\t\tthis.getCurveLengths();\n\n\t}\n\n\t/**\n\t * Returns list of cumulative curve lengths of the defined curves.\n\t *\n\t * @return {Array<number>} The curve lengths.\n\t */\n\tgetCurveLengths() {\n\n\t\t// Compute lengths and cache them\n\t\t// We cannot overwrite getLengths() because UtoT mapping uses it.\n\t\t// We use cache values if curves and cache array are same length\n\n\t\tif ( this.cacheLengths && this.cacheLengths.length === this.curves.length ) {\n\n\t\t\treturn this.cacheLengths;\n\n\t\t}\n\n\t\t// Get length of sub-curve\n\t\t// Push sums into cached array\n\n\t\tconst lengths = [];\n\t\tlet sums = 0;\n\n\t\tfor ( let i = 0, l = this.curves.length; i < l; i ++ ) {\n\n\t\t\tsums += this.curves[ i ].getLength();\n\t\t\tlengths.push( sums );\n\n\t\t}\n\n\t\tthis.cacheLengths = lengths;\n\n\t\treturn lengths;\n\n\t}\n\n\tgetSpacedPoints( divisions = 40 ) {\n\n\t\tconst points = [];\n\n\t\tfor ( let i = 0; i <= divisions; i ++ ) {\n\n\t\t\tpoints.push( this.getPoint( i / divisions ) );\n\n\t\t}\n\n\t\tif ( this.autoClose ) {\n\n\t\t\tpoints.push( points[ 0 ] );\n\n\t\t}\n\n\t\treturn points;\n\n\t}\n\n\tgetPoints( divisions = 12 ) {\n\n\t\tconst points = [];\n\t\tlet last;\n\n\t\tfor ( let i = 0, curves = this.curves; i < curves.length; i ++ ) {\n\n\t\t\tconst curve = curves[ i ];\n\t\t\tconst resolution = curve.isEllipseCurve ? divisions * 2\n\t\t\t\t: ( curve.isLineCurve || curve.isLineCurve3 ) ? 1\n\t\t\t\t\t: curve.isSplineCurve ? divisions * curve.points.length\n\t\t\t\t\t\t: divisions;\n\n\t\t\tconst pts = curve.getPoints( resolution );\n\n\t\t\tfor ( let j = 0; j < pts.length; j ++ ) {\n\n\t\t\t\tconst point = pts[ j ];\n\n\t\t\t\tif ( last && last.equals( point ) ) continue; // ensures no consecutive points are duplicates\n\n\t\t\t\tpoints.push( point );\n\t\t\t\tlast = point;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.autoClose && points.length > 1 && ! points[ points.length - 1 ].equals( points[ 0 ] ) ) {\n\n\t\t\tpoints.push( points[ 0 ] );\n\n\t\t}\n\n\t\treturn points;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.curves = [];\n\n\t\tfor ( let i = 0, l = source.curves.length; i < l; i ++ ) {\n\n\t\t\tconst curve = source.curves[ i ];\n\n\t\t\tthis.curves.push( curve.clone() );\n\n\t\t}\n\n\t\tthis.autoClose = source.autoClose;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.autoClose = this.autoClose;\n\t\tdata.curves = [];\n\n\t\tfor ( let i = 0, l = this.curves.length; i < l; i ++ ) {\n\n\t\t\tconst curve = this.curves[ i ];\n\t\t\tdata.curves.push( curve.toJSON() );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.autoClose = json.autoClose;\n\t\tthis.curves = [];\n\n\t\tfor ( let i = 0, l = json.curves.length; i < l; i ++ ) {\n\n\t\t\tconst curve = json.curves[ i ];\n\t\t\tthis.curves.push( new Curves[ curve.type ]().fromJSON( curve ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A 2D path representation. The class provides methods for creating paths\n * and contours of 2D shapes similar to the 2D Canvas API.\n *\n * ```js\n * const path = new THREE.Path();\n *\n * path.lineTo( 0, 0.8 );\n * path.quadraticCurveTo( 0, 1, 0.2, 1 );\n * path.lineTo( 1, 1 );\n *\n * const points = path.getPoints();\n *\n * const geometry = new THREE.BufferGeometry().setFromPoints( points );\n * const material = new THREE.LineBasicMaterial( { color: 0xffffff } );\n *\n * const line = new THREE.Line( geometry, material );\n * scene.add( line );\n * ```\n *\n * @augments CurvePath\n */\nclass Path extends CurvePath {\n\n\t/**\n\t * Constructs a new path.\n\t *\n\t * @param {Array<Vector2>} [points] - An array of 2D points defining the path.\n\t */\n\tconstructor( points ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'Path';\n\n\t\t/**\n\t\t * The current offset of the path. Any new curve added will start here.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.currentPoint = new Vector2();\n\n\t\tif ( points ) {\n\n\t\t\tthis.setFromPoints( points );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Creates a path from the given list of points. The points are added\n\t * to the path as instances of {@link LineCurve}.\n\t *\n\t * @param {Array<Vector2>} points - An array of 2D points.\n\t * @return {Path} A reference to this path.\n\t */\n\tsetFromPoints( points ) {\n\n\t\tthis.moveTo( points[ 0 ].x, points[ 0 ].y );\n\n\t\tfor ( let i = 1, l = points.length; i < l; i ++ ) {\n\n\t\t\tthis.lineTo( points[ i ].x, points[ i ].y );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Moves {@link Path#currentPoint} to the given point.\n\t *\n\t * @param {number} x - The x coordinate.\n\t * @param {number} y - The y coordinate.\n\t * @return {Path} A reference to this path.\n\t */\n\tmoveTo( x, y ) {\n\n\t\tthis.currentPoint.set( x, y ); // TODO consider referencing vectors instead of copying?\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an instance of {@link LineCurve} to the path by connecting\n\t * the current point with the given one.\n\t *\n\t * @param {number} x - The x coordinate of the end point.\n\t * @param {number} y - The y coordinate of the end point.\n\t * @return {Path} A reference to this path.\n\t */\n\tlineTo( x, y ) {\n\n\t\tconst curve = new LineCurve( this.currentPoint.clone(), new Vector2( x, y ) );\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.set( x, y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an instance of {@link QuadraticBezierCurve} to the path by connecting\n\t * the current point with the given one.\n\t *\n\t * @param {number} aCPx - The x coordinate of the control point.\n\t * @param {number} aCPy - The y coordinate of the control point.\n\t * @param {number} aX - The x coordinate of the end point.\n\t * @param {number} aY - The y coordinate of the end point.\n\t * @return {Path} A reference to this path.\n\t */\n\tquadraticCurveTo( aCPx, aCPy, aX, aY ) {\n\n\t\tconst curve = new QuadraticBezierCurve(\n\t\t\tthis.currentPoint.clone(),\n\t\t\tnew Vector2( aCPx, aCPy ),\n\t\t\tnew Vector2( aX, aY )\n\t\t);\n\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.set( aX, aY );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an instance of {@link CubicBezierCurve} to the path by connecting\n\t * the current point with the given one.\n\t *\n\t * @param {number} aCP1x - The x coordinate of the first control point.\n\t * @param {number} aCP1y - The y coordinate of the first control point.\n\t * @param {number} aCP2x - The x coordinate of the second control point.\n\t * @param {number} aCP2y - The y coordinate of the second control point.\n\t * @param {number} aX - The x coordinate of the end point.\n\t * @param {number} aY - The y coordinate of the end point.\n\t * @return {Path} A reference to this path.\n\t */\n\tbezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) {\n\n\t\tconst curve = new CubicBezierCurve(\n\t\t\tthis.currentPoint.clone(),\n\t\t\tnew Vector2( aCP1x, aCP1y ),\n\t\t\tnew Vector2( aCP2x, aCP2y ),\n\t\t\tnew Vector2( aX, aY )\n\t\t);\n\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.set( aX, aY );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an instance of {@link SplineCurve} to the path by connecting\n\t * the current point with the given list of points.\n\t *\n\t * @param {Array<Vector2>} pts - An array of points in 2D space.\n\t * @return {Path} A reference to this path.\n\t */\n\tsplineThru( pts ) {\n\n\t\tconst npts = [ this.currentPoint.clone() ].concat( pts );\n\n\t\tconst curve = new SplineCurve( npts );\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.copy( pts[ pts.length - 1 ] );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an arc as an instance of {@link EllipseCurve} to the path, positioned relative\n\t * to the current point.\n\t *\n\t * @param {number} [aX=0] - The x coordinate of the center of the arc offsetted from the previous curve.\n\t * @param {number} [aY=0] - The y coordinate of the center of the arc offsetted from the previous curve.\n\t * @param {number} [aRadius=1] - The radius of the arc.\n\t * @param {number} [aStartAngle=0] - The start angle in radians.\n\t * @param {number} [aEndAngle=Math.PI*2] - The end angle in radians.\n\t * @param {boolean} [aClockwise=false] - Whether to sweep the arc clockwise or not.\n\t * @return {Path} A reference to this path.\n\t */\n\tarc( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\tconst x0 = this.currentPoint.x;\n\t\tconst y0 = this.currentPoint.y;\n\n\t\tthis.absarc( aX + x0, aY + y0, aRadius,\n\t\t\taStartAngle, aEndAngle, aClockwise );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an absolutely positioned arc as an instance of {@link EllipseCurve} to the path.\n\t *\n\t * @param {number} [aX=0] - The x coordinate of the center of the arc.\n\t * @param {number} [aY=0] - The y coordinate of the center of the arc.\n\t * @param {number} [aRadius=1] - The radius of the arc.\n\t * @param {number} [aStartAngle=0] - The start angle in radians.\n\t * @param {number} [aEndAngle=Math.PI*2] - The end angle in radians.\n\t * @param {boolean} [aClockwise=false] - Whether to sweep the arc clockwise or not.\n\t * @return {Path} A reference to this path.\n\t */\n\tabsarc( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\tthis.absellipse( aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an ellipse as an instance of {@link EllipseCurve} to the path, positioned relative\n\t * to the current point\n\t *\n\t * @param {number} [aX=0] - The x coordinate of the center of the ellipse offsetted from the previous curve.\n\t * @param {number} [aY=0] - The y coordinate of the center of the ellipse offsetted from the previous curve.\n\t * @param {number} [xRadius=1] - The radius of the ellipse in the x axis.\n\t * @param {number} [yRadius=1] - The radius of the ellipse in the y axis.\n\t * @param {number} [aStartAngle=0] - The start angle in radians.\n\t * @param {number} [aEndAngle=Math.PI*2] - The end angle in radians.\n\t * @param {boolean} [aClockwise=false] - Whether to sweep the ellipse clockwise or not.\n\t * @param {number} [aRotation=0] - The rotation angle of the ellipse in radians, counterclockwise from the positive X axis.\n\t * @return {Path} A reference to this path.\n\t */\n\tellipse( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\t\tconst x0 = this.currentPoint.x;\n\t\tconst y0 = this.currentPoint.y;\n\n\t\tthis.absellipse( aX + x0, aY + y0, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an absolutely positioned ellipse as an instance of {@link EllipseCurve} to the path.\n\t *\n\t * @param {number} [aX=0] - The x coordinate of the absolute center of the ellipse.\n\t * @param {number} [aY=0] - The y coordinate of the absolute center of the ellipse.\n\t * @param {number} [xRadius=1] - The radius of the ellipse in the x axis.\n\t * @param {number} [yRadius=1] - The radius of the ellipse in the y axis.\n\t * @param {number} [aStartAngle=0] - The start angle in radians.\n\t * @param {number} [aEndAngle=Math.PI*2] - The end angle in radians.\n\t * @param {boolean} [aClockwise=false] - Whether to sweep the ellipse clockwise or not.\n\t * @param {number} [aRotation=0] - The rotation angle of the ellipse in radians, counterclockwise from the positive X axis.\n\t * @return {Path} A reference to this path.\n\t */\n\tabsellipse( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\t\tconst curve = new EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation );\n\n\t\tif ( this.curves.length > 0 ) {\n\n\t\t\t// if a previous curve is present, attempt to join\n\t\t\tconst firstPoint = curve.getPoint( 0 );\n\n\t\t\tif ( ! firstPoint.equals( this.currentPoint ) ) {\n\n\t\t\t\tthis.lineTo( firstPoint.x, firstPoint.y );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.curves.push( curve );\n\n\t\tconst lastPoint = curve.getPoint( 1 );\n\t\tthis.currentPoint.copy( lastPoint );\n\n\t\treturn this;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.currentPoint.copy( source.currentPoint );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.currentPoint = this.currentPoint.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.currentPoint.fromArray( json.currentPoint );\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * Defines an arbitrary 2d shape plane using paths with optional holes. It\n * can be used with {@link ExtrudeGeometry}, {@link ShapeGeometry}, to get\n * points, or to get triangulated faces.\n *\n * ```js\n * const heartShape = new THREE.Shape();\n *\n * heartShape.moveTo( 25, 25 );\n * heartShape.bezierCurveTo( 25, 25, 20, 0, 0, 0 );\n * heartShape.bezierCurveTo( - 30, 0, - 30, 35, - 30, 35 );\n * heartShape.bezierCurveTo( - 30, 55, - 10, 77, 25, 95 );\n * heartShape.bezierCurveTo( 60, 77, 80, 55, 80, 35 );\n * heartShape.bezierCurveTo( 80, 35, 80, 0, 50, 0 );\n * heartShape.bezierCurveTo( 35, 0, 25, 25, 25, 25 );\n *\n * const extrudeSettings = {\n * \tdepth: 8,\n * \tbevelEnabled: true,\n * \tbevelSegments: 2,\n * \tsteps: 2,\n * \tbevelSize: 1,\n * \tbevelThickness: 1\n * };\n *\n * const geometry = new THREE.ExtrudeGeometry( heartShape, extrudeSettings );\n * const mesh = new THREE.Mesh( geometry, new THREE.MeshBasicMaterial() );\n * ```\n *\n * @augments Path\n */\nclass Shape extends Path {\n\n\t/**\n\t * Constructs a new shape.\n\t *\n\t * @param {Array<Vector2>} [points] - An array of 2D points defining the shape.\n\t */\n\tconstructor( points ) {\n\n\t\tsuper( points );\n\n\t\t/**\n\t\t * The UUID of the shape.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.uuid = generateUUID();\n\n\t\tthis.type = 'Shape';\n\n\t\t/**\n\t\t * Defines the holes in the shape. Hole definitions must use the\n\t\t * opposite winding order (CW/CCW) than the outer shape.\n\t\t *\n\t\t * @type {Array<Path>}\n\t\t * @readonly\n\t\t */\n\t\tthis.holes = [];\n\n\t}\n\n\t/**\n\t * Returns an array representing each contour of the holes\n\t * as a list of 2D points.\n\t *\n\t * @param {number} divisions - The fineness of the result.\n\t * @return {Array<Array<Vector2>>} The holes as a series of 2D points.\n\t */\n\tgetPointsHoles( divisions ) {\n\n\t\tconst holesPts = [];\n\n\t\tfor ( let i = 0, l = this.holes.length; i < l; i ++ ) {\n\n\t\t\tholesPts[ i ] = this.holes[ i ].getPoints( divisions );\n\n\t\t}\n\n\t\treturn holesPts;\n\n\t}\n\n\t// get points of shape and holes (keypoints based on segments parameter)\n\n\t/**\n\t * Returns an object that holds contour data for the shape and its holes as\n\t * arrays of 2D points.\n\t *\n\t * @param {number} divisions - The fineness of the result.\n\t * @return {{shape:Array<Vector2>,holes:Array<Array<Vector2>>}} An object with contour data.\n\t */\n\textractPoints( divisions ) {\n\n\t\treturn {\n\n\t\t\tshape: this.getPoints( divisions ),\n\t\t\tholes: this.getPointsHoles( divisions )\n\n\t\t};\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.holes = [];\n\n\t\tfor ( let i = 0, l = source.holes.length; i < l; i ++ ) {\n\n\t\t\tconst hole = source.holes[ i ];\n\n\t\t\tthis.holes.push( hole.clone() );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.uuid = this.uuid;\n\t\tdata.holes = [];\n\n\t\tfor ( let i = 0, l = this.holes.length; i < l; i ++ ) {\n\n\t\t\tconst hole = this.holes[ i ];\n\t\t\tdata.holes.push( hole.toJSON() );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.uuid = json.uuid;\n\t\tthis.holes = [];\n\n\t\tfor ( let i = 0, l = json.holes.length; i < l; i ++ ) {\n\n\t\t\tconst hole = json.holes[ i ];\n\t\t\tthis.holes.push( new Path().fromJSON( hole ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\n/* eslint-disable */\n// copy of mapbox/earcut version 3.0.2\n// https://github.com/mapbox/earcut/tree/v3.0.2\n\nfunction earcut(data, holeIndices, dim = 2) {\n\n    const hasHoles = holeIndices && holeIndices.length;\n    const outerLen = hasHoles ? holeIndices[0] * dim : data.length;\n    let outerNode = linkedList(data, 0, outerLen, dim, true);\n    const triangles = [];\n\n    if (!outerNode || outerNode.next === outerNode.prev) return triangles;\n\n    let minX, minY, invSize;\n\n    if (hasHoles) outerNode = eliminateHoles(data, holeIndices, outerNode, dim);\n\n    // if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox\n    if (data.length > 80 * dim) {\n        minX = data[0];\n        minY = data[1];\n        let maxX = minX;\n        let maxY = minY;\n\n        for (let i = dim; i < outerLen; i += dim) {\n            const x = data[i];\n            const y = data[i + 1];\n            if (x < minX) minX = x;\n            if (y < minY) minY = y;\n            if (x > maxX) maxX = x;\n            if (y > maxY) maxY = y;\n        }\n\n        // minX, minY and invSize are later used to transform coords into integers for z-order calculation\n        invSize = Math.max(maxX - minX, maxY - minY);\n        invSize = invSize !== 0 ? 32767 / invSize : 0;\n    }\n\n    earcutLinked(outerNode, triangles, dim, minX, minY, invSize, 0);\n\n    return triangles;\n}\n\n// create a circular doubly linked list from polygon points in the specified winding order\nfunction linkedList(data, start, end, dim, clockwise) {\n    let last;\n\n    if (clockwise === (signedArea(data, start, end, dim) > 0)) {\n        for (let i = start; i < end; i += dim) last = insertNode(i / dim | 0, data[i], data[i + 1], last);\n    } else {\n        for (let i = end - dim; i >= start; i -= dim) last = insertNode(i / dim | 0, data[i], data[i + 1], last);\n    }\n\n    if (last && equals(last, last.next)) {\n        removeNode(last);\n        last = last.next;\n    }\n\n    return last;\n}\n\n// eliminate colinear or duplicate points\nfunction filterPoints(start, end) {\n    if (!start) return start;\n    if (!end) end = start;\n\n    let p = start,\n        again;\n    do {\n        again = false;\n\n        if (!p.steiner && (equals(p, p.next) || area(p.prev, p, p.next) === 0)) {\n            removeNode(p);\n            p = end = p.prev;\n            if (p === p.next) break;\n            again = true;\n\n        } else {\n            p = p.next;\n        }\n    } while (again || p !== end);\n\n    return end;\n}\n\n// main ear slicing loop which triangulates a polygon (given as a linked list)\nfunction earcutLinked(ear, triangles, dim, minX, minY, invSize, pass) {\n    if (!ear) return;\n\n    // interlink polygon nodes in z-order\n    if (!pass && invSize) indexCurve(ear, minX, minY, invSize);\n\n    let stop = ear;\n\n    // iterate through ears, slicing them one by one\n    while (ear.prev !== ear.next) {\n        const prev = ear.prev;\n        const next = ear.next;\n\n        if (invSize ? isEarHashed(ear, minX, minY, invSize) : isEar(ear)) {\n            triangles.push(prev.i, ear.i, next.i); // cut off the triangle\n\n            removeNode(ear);\n\n            // skipping the next vertex leads to less sliver triangles\n            ear = next.next;\n            stop = next.next;\n\n            continue;\n        }\n\n        ear = next;\n\n        // if we looped through the whole remaining polygon and can't find any more ears\n        if (ear === stop) {\n            // try filtering points and slicing again\n            if (!pass) {\n                earcutLinked(filterPoints(ear), triangles, dim, minX, minY, invSize, 1);\n\n            // if this didn't work, try curing all small self-intersections locally\n            } else if (pass === 1) {\n                ear = cureLocalIntersections(filterPoints(ear), triangles);\n                earcutLinked(ear, triangles, dim, minX, minY, invSize, 2);\n\n            // as a last resort, try splitting the remaining polygon into two\n            } else if (pass === 2) {\n                splitEarcut(ear, triangles, dim, minX, minY, invSize);\n            }\n\n            break;\n        }\n    }\n}\n\n// check whether a polygon node forms a valid ear with adjacent nodes\nfunction isEar(ear) {\n    const a = ear.prev,\n        b = ear,\n        c = ear.next;\n\n    if (area(a, b, c) >= 0) return false; // reflex, can't be an ear\n\n    // now make sure we don't have other points inside the potential ear\n    const ax = a.x, bx = b.x, cx = c.x, ay = a.y, by = b.y, cy = c.y;\n\n    // triangle bbox\n    const x0 = Math.min(ax, bx, cx),\n        y0 = Math.min(ay, by, cy),\n        x1 = Math.max(ax, bx, cx),\n        y1 = Math.max(ay, by, cy);\n\n    let p = c.next;\n    while (p !== a) {\n        if (p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 &&\n            pointInTriangleExceptFirst(ax, ay, bx, by, cx, cy, p.x, p.y) &&\n            area(p.prev, p, p.next) >= 0) return false;\n        p = p.next;\n    }\n\n    return true;\n}\n\nfunction isEarHashed(ear, minX, minY, invSize) {\n    const a = ear.prev,\n        b = ear,\n        c = ear.next;\n\n    if (area(a, b, c) >= 0) return false; // reflex, can't be an ear\n\n    const ax = a.x, bx = b.x, cx = c.x, ay = a.y, by = b.y, cy = c.y;\n\n    // triangle bbox\n    const x0 = Math.min(ax, bx, cx),\n        y0 = Math.min(ay, by, cy),\n        x1 = Math.max(ax, bx, cx),\n        y1 = Math.max(ay, by, cy);\n\n    // z-order range for the current triangle bbox;\n    const minZ = zOrder(x0, y0, minX, minY, invSize),\n        maxZ = zOrder(x1, y1, minX, minY, invSize);\n\n    let p = ear.prevZ,\n        n = ear.nextZ;\n\n    // look for points inside the triangle in both directions\n    while (p && p.z >= minZ && n && n.z <= maxZ) {\n        if (p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 && p !== a && p !== c &&\n            pointInTriangleExceptFirst(ax, ay, bx, by, cx, cy, p.x, p.y) && area(p.prev, p, p.next) >= 0) return false;\n        p = p.prevZ;\n\n        if (n.x >= x0 && n.x <= x1 && n.y >= y0 && n.y <= y1 && n !== a && n !== c &&\n            pointInTriangleExceptFirst(ax, ay, bx, by, cx, cy, n.x, n.y) && area(n.prev, n, n.next) >= 0) return false;\n        n = n.nextZ;\n    }\n\n    // look for remaining points in decreasing z-order\n    while (p && p.z >= minZ) {\n        if (p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 && p !== a && p !== c &&\n            pointInTriangleExceptFirst(ax, ay, bx, by, cx, cy, p.x, p.y) && area(p.prev, p, p.next) >= 0) return false;\n        p = p.prevZ;\n    }\n\n    // look for remaining points in increasing z-order\n    while (n && n.z <= maxZ) {\n        if (n.x >= x0 && n.x <= x1 && n.y >= y0 && n.y <= y1 && n !== a && n !== c &&\n            pointInTriangleExceptFirst(ax, ay, bx, by, cx, cy, n.x, n.y) && area(n.prev, n, n.next) >= 0) return false;\n        n = n.nextZ;\n    }\n\n    return true;\n}\n\n// go through all polygon nodes and cure small local self-intersections\nfunction cureLocalIntersections(start, triangles) {\n    let p = start;\n    do {\n        const a = p.prev,\n            b = p.next.next;\n\n        if (!equals(a, b) && intersects(a, p, p.next, b) && locallyInside(a, b) && locallyInside(b, a)) {\n\n            triangles.push(a.i, p.i, b.i);\n\n            // remove two nodes involved\n            removeNode(p);\n            removeNode(p.next);\n\n            p = start = b;\n        }\n        p = p.next;\n    } while (p !== start);\n\n    return filterPoints(p);\n}\n\n// try splitting polygon into two and triangulate them independently\nfunction splitEarcut(start, triangles, dim, minX, minY, invSize) {\n    // look for a valid diagonal that divides the polygon into two\n    let a = start;\n    do {\n        let b = a.next.next;\n        while (b !== a.prev) {\n            if (a.i !== b.i && isValidDiagonal(a, b)) {\n                // split the polygon in two by the diagonal\n                let c = splitPolygon(a, b);\n\n                // filter colinear points around the cuts\n                a = filterPoints(a, a.next);\n                c = filterPoints(c, c.next);\n\n                // run earcut on each half\n                earcutLinked(a, triangles, dim, minX, minY, invSize, 0);\n                earcutLinked(c, triangles, dim, minX, minY, invSize, 0);\n                return;\n            }\n            b = b.next;\n        }\n        a = a.next;\n    } while (a !== start);\n}\n\n// link every hole into the outer loop, producing a single-ring polygon without holes\nfunction eliminateHoles(data, holeIndices, outerNode, dim) {\n    const queue = [];\n\n    for (let i = 0, len = holeIndices.length; i < len; i++) {\n        const start = holeIndices[i] * dim;\n        const end = i < len - 1 ? holeIndices[i + 1] * dim : data.length;\n        const list = linkedList(data, start, end, dim, false);\n        if (list === list.next) list.steiner = true;\n        queue.push(getLeftmost(list));\n    }\n\n    queue.sort(compareXYSlope);\n\n    // process holes from left to right\n    for (let i = 0; i < queue.length; i++) {\n        outerNode = eliminateHole(queue[i], outerNode);\n    }\n\n    return outerNode;\n}\n\nfunction compareXYSlope(a, b) {\n    let result = a.x - b.x;\n    // when the left-most point of 2 holes meet at a vertex, sort the holes counterclockwise so that when we find\n    // the bridge to the outer shell is always the point that they meet at.\n    if (result === 0) {\n        result = a.y - b.y;\n        if (result === 0) {\n            const aSlope = (a.next.y - a.y) / (a.next.x - a.x);\n            const bSlope = (b.next.y - b.y) / (b.next.x - b.x);\n            result = aSlope - bSlope;\n        }\n    }\n    return result;\n}\n\n// find a bridge between vertices that connects hole with an outer ring and link it\nfunction eliminateHole(hole, outerNode) {\n    const bridge = findHoleBridge(hole, outerNode);\n    if (!bridge) {\n        return outerNode;\n    }\n\n    const bridgeReverse = splitPolygon(bridge, hole);\n\n    // filter collinear points around the cuts\n    filterPoints(bridgeReverse, bridgeReverse.next);\n    return filterPoints(bridge, bridge.next);\n}\n\n// David Eberly's algorithm for finding a bridge between hole and outer polygon\nfunction findHoleBridge(hole, outerNode) {\n    let p = outerNode;\n    const hx = hole.x;\n    const hy = hole.y;\n    let qx = -Infinity;\n    let m;\n\n    // find a segment intersected by a ray from the hole's leftmost point to the left;\n    // segment's endpoint with lesser x will be potential connection point\n    // unless they intersect at a vertex, then choose the vertex\n    if (equals(hole, p)) return p;\n    do {\n        if (equals(hole, p.next)) return p.next;\n        else if (hy <= p.y && hy >= p.next.y && p.next.y !== p.y) {\n            const x = p.x + (hy - p.y) * (p.next.x - p.x) / (p.next.y - p.y);\n            if (x <= hx && x > qx) {\n                qx = x;\n                m = p.x < p.next.x ? p : p.next;\n                if (x === hx) return m; // hole touches outer segment; pick leftmost endpoint\n            }\n        }\n        p = p.next;\n    } while (p !== outerNode);\n\n    if (!m) return null;\n\n    // look for points inside the triangle of hole point, segment intersection and endpoint;\n    // if there are no points found, we have a valid connection;\n    // otherwise choose the point of the minimum angle with the ray as connection point\n\n    const stop = m;\n    const mx = m.x;\n    const my = m.y;\n    let tanMin = Infinity;\n\n    p = m;\n\n    do {\n        if (hx >= p.x && p.x >= mx && hx !== p.x &&\n                pointInTriangle(hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y)) {\n\n            const tan = Math.abs(hy - p.y) / (hx - p.x); // tangential\n\n            if (locallyInside(p, hole) &&\n                (tan < tanMin || (tan === tanMin && (p.x > m.x || (p.x === m.x && sectorContainsSector(m, p)))))) {\n                m = p;\n                tanMin = tan;\n            }\n        }\n\n        p = p.next;\n    } while (p !== stop);\n\n    return m;\n}\n\n// whether sector in vertex m contains sector in vertex p in the same coordinates\nfunction sectorContainsSector(m, p) {\n    return area(m.prev, m, p.prev) < 0 && area(p.next, m, m.next) < 0;\n}\n\n// interlink polygon nodes in z-order\nfunction indexCurve(start, minX, minY, invSize) {\n    let p = start;\n    do {\n        if (p.z === 0) p.z = zOrder(p.x, p.y, minX, minY, invSize);\n        p.prevZ = p.prev;\n        p.nextZ = p.next;\n        p = p.next;\n    } while (p !== start);\n\n    p.prevZ.nextZ = null;\n    p.prevZ = null;\n\n    sortLinked(p);\n}\n\n// Simon Tatham's linked list merge sort algorithm\n// http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html\nfunction sortLinked(list) {\n    let numMerges;\n    let inSize = 1;\n\n    do {\n        let p = list;\n        let e;\n        list = null;\n        let tail = null;\n        numMerges = 0;\n\n        while (p) {\n            numMerges++;\n            let q = p;\n            let pSize = 0;\n            for (let i = 0; i < inSize; i++) {\n                pSize++;\n                q = q.nextZ;\n                if (!q) break;\n            }\n            let qSize = inSize;\n\n            while (pSize > 0 || (qSize > 0 && q)) {\n\n                if (pSize !== 0 && (qSize === 0 || !q || p.z <= q.z)) {\n                    e = p;\n                    p = p.nextZ;\n                    pSize--;\n                } else {\n                    e = q;\n                    q = q.nextZ;\n                    qSize--;\n                }\n\n                if (tail) tail.nextZ = e;\n                else list = e;\n\n                e.prevZ = tail;\n                tail = e;\n            }\n\n            p = q;\n        }\n\n        tail.nextZ = null;\n        inSize *= 2;\n\n    } while (numMerges > 1);\n\n    return list;\n}\n\n// z-order of a point given coords and inverse of the longer side of data bbox\nfunction zOrder(x, y, minX, minY, invSize) {\n    // coords are transformed into non-negative 15-bit integer range\n    x = (x - minX) * invSize | 0;\n    y = (y - minY) * invSize | 0;\n\n    x = (x | (x << 8)) & 0x00FF00FF;\n    x = (x | (x << 4)) & 0x0F0F0F0F;\n    x = (x | (x << 2)) & 0x33333333;\n    x = (x | (x << 1)) & 0x55555555;\n\n    y = (y | (y << 8)) & 0x00FF00FF;\n    y = (y | (y << 4)) & 0x0F0F0F0F;\n    y = (y | (y << 2)) & 0x33333333;\n    y = (y | (y << 1)) & 0x55555555;\n\n    return x | (y << 1);\n}\n\n// find the leftmost node of a polygon ring\nfunction getLeftmost(start) {\n    let p = start,\n        leftmost = start;\n    do {\n        if (p.x < leftmost.x || (p.x === leftmost.x && p.y < leftmost.y)) leftmost = p;\n        p = p.next;\n    } while (p !== start);\n\n    return leftmost;\n}\n\n// check if a point lies within a convex triangle\nfunction pointInTriangle(ax, ay, bx, by, cx, cy, px, py) {\n    return (cx - px) * (ay - py) >= (ax - px) * (cy - py) &&\n           (ax - px) * (by - py) >= (bx - px) * (ay - py) &&\n           (bx - px) * (cy - py) >= (cx - px) * (by - py);\n}\n\n// check if a point lies within a convex triangle but false if its equal to the first point of the triangle\nfunction pointInTriangleExceptFirst(ax, ay, bx, by, cx, cy, px, py) {\n    return !(ax === px && ay === py) && pointInTriangle(ax, ay, bx, by, cx, cy, px, py);\n}\n\n// check if a diagonal between two polygon nodes is valid (lies in polygon interior)\nfunction isValidDiagonal(a, b) {\n    return a.next.i !== b.i && a.prev.i !== b.i && !intersectsPolygon(a, b) && // doesn't intersect other edges\n           (locallyInside(a, b) && locallyInside(b, a) && middleInside(a, b) && // locally visible\n            (area(a.prev, a, b.prev) || area(a, b.prev, b)) || // does not create opposite-facing sectors\n            equals(a, b) && area(a.prev, a, a.next) > 0 && area(b.prev, b, b.next) > 0); // special zero-length case\n}\n\n// signed area of a triangle\nfunction area(p, q, r) {\n    return (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y);\n}\n\n// check if two points are equal\nfunction equals(p1, p2) {\n    return p1.x === p2.x && p1.y === p2.y;\n}\n\n// check if two segments intersect\nfunction intersects(p1, q1, p2, q2) {\n    const o1 = sign(area(p1, q1, p2));\n    const o2 = sign(area(p1, q1, q2));\n    const o3 = sign(area(p2, q2, p1));\n    const o4 = sign(area(p2, q2, q1));\n\n    if (o1 !== o2 && o3 !== o4) return true; // general case\n\n    if (o1 === 0 && onSegment(p1, p2, q1)) return true; // p1, q1 and p2 are collinear and p2 lies on p1q1\n    if (o2 === 0 && onSegment(p1, q2, q1)) return true; // p1, q1 and q2 are collinear and q2 lies on p1q1\n    if (o3 === 0 && onSegment(p2, p1, q2)) return true; // p2, q2 and p1 are collinear and p1 lies on p2q2\n    if (o4 === 0 && onSegment(p2, q1, q2)) return true; // p2, q2 and q1 are collinear and q1 lies on p2q2\n\n    return false;\n}\n\n// for collinear points p, q, r, check if point q lies on segment pr\nfunction onSegment(p, q, r) {\n    return q.x <= Math.max(p.x, r.x) && q.x >= Math.min(p.x, r.x) && q.y <= Math.max(p.y, r.y) && q.y >= Math.min(p.y, r.y);\n}\n\nfunction sign(num) {\n    return num > 0 ? 1 : num < 0 ? -1 : 0;\n}\n\n// check if a polygon diagonal intersects any polygon segments\nfunction intersectsPolygon(a, b) {\n    let p = a;\n    do {\n        if (p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i &&\n                intersects(p, p.next, a, b)) return true;\n        p = p.next;\n    } while (p !== a);\n\n    return false;\n}\n\n// check if a polygon diagonal is locally inside the polygon\nfunction locallyInside(a, b) {\n    return area(a.prev, a, a.next) < 0 ?\n        area(a, b, a.next) >= 0 && area(a, a.prev, b) >= 0 :\n        area(a, b, a.prev) < 0 || area(a, a.next, b) < 0;\n}\n\n// check if the middle point of a polygon diagonal is inside the polygon\nfunction middleInside(a, b) {\n    let p = a;\n    let inside = false;\n    const px = (a.x + b.x) / 2;\n    const py = (a.y + b.y) / 2;\n    do {\n        if (((p.y > py) !== (p.next.y > py)) && p.next.y !== p.y &&\n                (px < (p.next.x - p.x) * (py - p.y) / (p.next.y - p.y) + p.x))\n            inside = !inside;\n        p = p.next;\n    } while (p !== a);\n\n    return inside;\n}\n\n// link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two;\n// if one belongs to the outer ring and another to a hole, it merges it into a single ring\nfunction splitPolygon(a, b) {\n    const a2 = createNode(a.i, a.x, a.y),\n        b2 = createNode(b.i, b.x, b.y),\n        an = a.next,\n        bp = b.prev;\n\n    a.next = b;\n    b.prev = a;\n\n    a2.next = an;\n    an.prev = a2;\n\n    b2.next = a2;\n    a2.prev = b2;\n\n    bp.next = b2;\n    b2.prev = bp;\n\n    return b2;\n}\n\n// create a node and optionally link it with previous one (in a circular doubly linked list)\nfunction insertNode(i, x, y, last) {\n    const p = createNode(i, x, y);\n\n    if (!last) {\n        p.prev = p;\n        p.next = p;\n\n    } else {\n        p.next = last.next;\n        p.prev = last;\n        last.next.prev = p;\n        last.next = p;\n    }\n    return p;\n}\n\nfunction removeNode(p) {\n    p.next.prev = p.prev;\n    p.prev.next = p.next;\n\n    if (p.prevZ) p.prevZ.nextZ = p.nextZ;\n    if (p.nextZ) p.nextZ.prevZ = p.prevZ;\n}\n\nfunction createNode(i, x, y) {\n    return {\n        i, // vertex index in coordinates array\n        x, y, // vertex coordinates\n        prev: null, // previous and next vertex nodes in a polygon ring\n        next: null,\n        z: 0, // z-order curve value\n        prevZ: null, // previous and next nodes in z-order\n        nextZ: null,\n        steiner: false // indicates whether this is a steiner point\n    };\n}\n\nfunction signedArea(data, start, end, dim) {\n    let sum = 0;\n    for (let i = start, j = end - dim; i < end; i += dim) {\n        sum += (data[j] - data[i]) * (data[i + 1] + data[j + 1]);\n        j = i;\n    }\n    return sum;\n}\n\n/**\n * An implementation of the earcut polygon triangulation algorithm.\n * The code is a port of [mapbox/earcut](https://github.com/mapbox/earcut).\n *\n * @see https://github.com/mapbox/earcut\n */\nclass Earcut {\n\n\t/**\n\t * Triangulates the given shape definition by returning an array of triangles.\n\t *\n\t * @param {Array<number>} data - An array with 2D points.\n\t * @param {Array<number>} holeIndices - An array with indices defining holes.\n\t * @param {number} [dim=2] - The number of coordinates per vertex in the input array.\n\t * @return {Array<number>} An array representing the triangulated faces. Each face is defined by three consecutive numbers\n\t * representing vertex indices.\n\t */\n\tstatic triangulate( data, holeIndices, dim = 2 ) {\n\n\t\treturn earcut( data, holeIndices, dim );\n\n\t}\n\n}\n\n/**\n * A class containing utility functions for shapes.\n *\n * @hideconstructor\n */\nclass ShapeUtils {\n\n\t/**\n\t * Calculate area of a ( 2D ) contour polygon.\n\t *\n\t * @param {Array<Vector2>} contour - An array of 2D points.\n\t * @return {number} The area.\n\t */\n\tstatic area( contour ) {\n\n\t\tconst n = contour.length;\n\t\tlet a = 0.0;\n\n\t\tfor ( let p = n - 1, q = 0; q < n; p = q ++ ) {\n\n\t\t\ta += contour[ p ].x * contour[ q ].y - contour[ q ].x * contour[ p ].y;\n\n\t\t}\n\n\t\treturn a * 0.5;\n\n\t}\n\n\t/**\n\t * Returns `true` if the given contour uses a clockwise winding order.\n\t *\n\t * @param {Array<Vector2>} pts - An array of 2D points defining a polygon.\n\t * @return {boolean} Whether the given contour uses a clockwise winding order or not.\n\t */\n\tstatic isClockWise( pts ) {\n\n\t\treturn ShapeUtils.area( pts ) < 0;\n\n\t}\n\n\t/**\n\t * Triangulates the given shape definition.\n\t *\n\t * @param {Array<Vector2>} contour - An array of 2D points defining the contour.\n\t * @param {Array<Array<Vector2>>} holes - An array that holds arrays of 2D points defining the holes.\n\t * @return {Array<Array<number>>} An array that holds for each face definition an array with three indices.\n\t */\n\tstatic triangulateShape( contour, holes ) {\n\n\t\tconst vertices = []; // flat array of vertices like [ x0,y0, x1,y1, x2,y2, ... ]\n\t\tconst holeIndices = []; // array of hole indices\n\t\tconst faces = []; // final array of vertex indices like [ [ a,b,d ], [ b,c,d ] ]\n\n\t\tremoveDupEndPts( contour );\n\t\taddContour( vertices, contour );\n\n\t\t//\n\n\t\tlet holeIndex = contour.length;\n\n\t\tholes.forEach( removeDupEndPts );\n\n\t\tfor ( let i = 0; i < holes.length; i ++ ) {\n\n\t\t\tholeIndices.push( holeIndex );\n\t\t\tholeIndex += holes[ i ].length;\n\t\t\taddContour( vertices, holes[ i ] );\n\n\t\t}\n\n\t\t//\n\n\t\tconst triangles = Earcut.triangulate( vertices, holeIndices );\n\n\t\t//\n\n\t\tfor ( let i = 0; i < triangles.length; i += 3 ) {\n\n\t\t\tfaces.push( triangles.slice( i, i + 3 ) );\n\n\t\t}\n\n\t\treturn faces;\n\n\t}\n\n}\n\nfunction removeDupEndPts( points ) {\n\n\tconst l = points.length;\n\n\tif ( l > 2 && points[ l - 1 ].equals( points[ 0 ] ) ) {\n\n\t\tpoints.pop();\n\n\t}\n\n}\n\nfunction addContour( vertices, contour ) {\n\n\tfor ( let i = 0; i < contour.length; i ++ ) {\n\n\t\tvertices.push( contour[ i ].x );\n\t\tvertices.push( contour[ i ].y );\n\n\t}\n\n}\n\n/**\n * Creates extruded geometry from a path shape.\n *\n * ```js\n * const length = 12, width = 8;\n *\n * const shape = new THREE.Shape();\n * shape.moveTo( 0,0 );\n * shape.lineTo( 0, width );\n * shape.lineTo( length, width );\n * shape.lineTo( length, 0 );\n * shape.lineTo( 0, 0 );\n *\n * const geometry = new THREE.ExtrudeGeometry( shape );\n * const material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );\n * const mesh = new THREE.Mesh( geometry, material ) ;\n * scene.add( mesh );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#ExtrudeGeometry\n */\nclass ExtrudeGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new extrude geometry.\n\t *\n\t * @param {Shape|Array<Shape>} [shapes] - A shape or an array of shapes.\n\t * @param {ExtrudeGeometry~Options} [options] - The extrude settings.\n\t */\n\tconstructor( shapes = new Shape( [ new Vector2( 0.5, 0.5 ), new Vector2( -0.5, 0.5 ), new Vector2( -0.5, -0.5 ), new Vector2( 0.5, -0.5 ) ] ), options = {} ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'ExtrudeGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tshapes: shapes,\n\t\t\toptions: options\n\t\t};\n\n\t\tshapes = Array.isArray( shapes ) ? shapes : [ shapes ];\n\n\t\tconst scope = this;\n\n\t\tconst verticesArray = [];\n\t\tconst uvArray = [];\n\n\t\tfor ( let i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\tconst shape = shapes[ i ];\n\t\t\taddShape( shape );\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( verticesArray, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvArray, 2 ) );\n\n\t\tthis.computeVertexNormals();\n\n\t\t// functions\n\n\t\tfunction addShape( shape ) {\n\n\t\t\tconst placeholder = [];\n\n\t\t\t// options\n\n\t\t\tconst curveSegments = options.curveSegments !== undefined ? options.curveSegments : 12;\n\t\t\tconst steps = options.steps !== undefined ? options.steps : 1;\n\t\t\tconst depth = options.depth !== undefined ? options.depth : 1;\n\n\t\t\tlet bevelEnabled = options.bevelEnabled !== undefined ? options.bevelEnabled : true;\n\t\t\tlet bevelThickness = options.bevelThickness !== undefined ? options.bevelThickness : 0.2;\n\t\t\tlet bevelSize = options.bevelSize !== undefined ? options.bevelSize : bevelThickness - 0.1;\n\t\t\tlet bevelOffset = options.bevelOffset !== undefined ? options.bevelOffset : 0;\n\t\t\tlet bevelSegments = options.bevelSegments !== undefined ? options.bevelSegments : 3;\n\n\t\t\tconst extrudePath = options.extrudePath;\n\n\t\t\tconst uvgen = options.UVGenerator !== undefined ? options.UVGenerator : WorldUVGenerator;\n\n\t\t\t//\n\n\t\t\tlet extrudePts, extrudeByPath = false;\n\t\t\tlet splineTube, binormal, normal, position2;\n\n\t\t\tif ( extrudePath ) {\n\n\t\t\t\textrudePts = extrudePath.getSpacedPoints( steps );\n\n\t\t\t\textrudeByPath = true;\n\t\t\t\tbevelEnabled = false; // bevels not supported for path extrusion\n\n\t\t\t\t// SETUP TNB variables\n\n\t\t\t\t// TODO1 - have a .isClosed in spline?\n\n\t\t\t\tsplineTube = extrudePath.computeFrenetFrames( steps, false );\n\n\t\t\t\t// log(splineTube, 'splineTube', splineTube.normals.length, 'steps', steps, 'extrudePts', extrudePts.length);\n\n\t\t\t\tbinormal = new Vector3();\n\t\t\t\tnormal = new Vector3();\n\t\t\t\tposition2 = new Vector3();\n\n\t\t\t}\n\n\t\t\t// Safeguards if bevels are not enabled\n\n\t\t\tif ( ! bevelEnabled ) {\n\n\t\t\t\tbevelSegments = 0;\n\t\t\t\tbevelThickness = 0;\n\t\t\t\tbevelSize = 0;\n\t\t\t\tbevelOffset = 0;\n\n\t\t\t}\n\n\t\t\t// Variables initialization\n\n\t\t\tconst shapePoints = shape.extractPoints( curveSegments );\n\n\t\t\tlet vertices = shapePoints.shape;\n\t\t\tconst holes = shapePoints.holes;\n\n\t\t\tconst reverse = ! ShapeUtils.isClockWise( vertices );\n\n\t\t\tif ( reverse ) {\n\n\t\t\t\tvertices = vertices.reverse();\n\n\t\t\t\t// Maybe we should also check if holes are in the opposite direction, just to be safe ...\n\n\t\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\t\tconst ahole = holes[ h ];\n\n\t\t\t\t\tif ( ShapeUtils.isClockWise( ahole ) ) {\n\n\t\t\t\t\t\tholes[ h ] = ahole.reverse();\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t/**Merges index-adjacent points that are within a threshold distance of each other. Array is modified in-place. Threshold distance is empirical, and scaled based on the magnitude of point coordinates.\n\t\t\t * @param {Array<Vector2>} points\n\t\t\t*/\n\t\t\tfunction mergeOverlappingPoints( points ) {\n\n\t\t\t\tconst THRESHOLD = 1e-10;\n\t\t\t\tconst THRESHOLD_SQ = THRESHOLD * THRESHOLD;\n\t\t\t\tlet prevPos = points[ 0 ];\n\t\t\t\tfor ( let i = 1; i <= points.length; i ++ ) {\n\n\t\t\t\t\tconst currentIndex = i % points.length;\n\t\t\t\t\tconst currentPos = points[ currentIndex ];\n\t\t\t\t\tconst dx = currentPos.x - prevPos.x;\n\t\t\t\t\tconst dy = currentPos.y - prevPos.y;\n\t\t\t\t\tconst distSq = dx * dx + dy * dy;\n\n\t\t\t\t\tconst scalingFactorSqrt = Math.max(\n\t\t\t\t\t\tMath.abs( currentPos.x ),\n\t\t\t\t\t\tMath.abs( currentPos.y ),\n\t\t\t\t\t\tMath.abs( prevPos.x ),\n\t\t\t\t\t\tMath.abs( prevPos.y )\n\t\t\t\t\t);\n\t\t\t\t\tconst thresholdSqScaled = THRESHOLD_SQ * scalingFactorSqrt * scalingFactorSqrt;\n\t\t\t\t\tif ( distSq <= thresholdSqScaled ) {\n\n\t\t\t\t\t\tpoints.splice( currentIndex, 1 );\n\t\t\t\t\t\ti --;\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tprevPos = currentPos;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tmergeOverlappingPoints( vertices );\n\t\t\tholes.forEach( mergeOverlappingPoints );\n\n\t\t\tconst numHoles = holes.length;\n\n\t\t\t/* Vertices */\n\n\t\t\tconst contour = vertices; // vertices has all points but contour has only points of circumference\n\n\t\t\tfor ( let h = 0; h < numHoles; h ++ ) {\n\n\t\t\t\tconst ahole = holes[ h ];\n\n\t\t\t\tvertices = vertices.concat( ahole );\n\n\t\t\t}\n\n\n\t\t\tfunction scalePt2( pt, vec, size ) {\n\n\t\t\t\tif ( ! vec ) error( 'ExtrudeGeometry: vec does not exist' );\n\n\t\t\t\treturn pt.clone().addScaledVector( vec, size );\n\n\t\t\t}\n\n\t\t\tconst vlen = vertices.length;\n\n\n\t\t\t// Find directions for point movement\n\n\n\t\t\tfunction getBevelVec( inPt, inPrev, inNext ) {\n\n\t\t\t\t// computes for inPt the corresponding point inPt' on a new contour\n\t\t\t\t//   shifted by 1 unit (length of normalized vector) to the left\n\t\t\t\t// if we walk along contour clockwise, this new contour is outside the old one\n\t\t\t\t//\n\t\t\t\t// inPt' is the intersection of the two lines parallel to the two\n\t\t\t\t//  adjacent edges of inPt at a distance of 1 unit on the left side.\n\n\t\t\t\tlet v_trans_x, v_trans_y, shrink_by; // resulting translation vector for inPt\n\n\t\t\t\t// good reading for geometry algorithms (here: line-line intersection)\n\t\t\t\t// http://geomalgorithms.com/a05-_intersect-1.html\n\n\t\t\t\tconst v_prev_x = inPt.x - inPrev.x,\n\t\t\t\t\tv_prev_y = inPt.y - inPrev.y;\n\t\t\t\tconst v_next_x = inNext.x - inPt.x,\n\t\t\t\t\tv_next_y = inNext.y - inPt.y;\n\n\t\t\t\tconst v_prev_lensq = ( v_prev_x * v_prev_x + v_prev_y * v_prev_y );\n\n\t\t\t\t// check for collinear edges\n\t\t\t\tconst collinear0 = ( v_prev_x * v_next_y - v_prev_y * v_next_x );\n\n\t\t\t\tif ( Math.abs( collinear0 ) > Number.EPSILON ) {\n\n\t\t\t\t\t// not collinear\n\n\t\t\t\t\t// length of vectors for normalizing\n\n\t\t\t\t\tconst v_prev_len = Math.sqrt( v_prev_lensq );\n\t\t\t\t\tconst v_next_len = Math.sqrt( v_next_x * v_next_x + v_next_y * v_next_y );\n\n\t\t\t\t\t// shift adjacent points by unit vectors to the left\n\n\t\t\t\t\tconst ptPrevShift_x = ( inPrev.x - v_prev_y / v_prev_len );\n\t\t\t\t\tconst ptPrevShift_y = ( inPrev.y + v_prev_x / v_prev_len );\n\n\t\t\t\t\tconst ptNextShift_x = ( inNext.x - v_next_y / v_next_len );\n\t\t\t\t\tconst ptNextShift_y = ( inNext.y + v_next_x / v_next_len );\n\n\t\t\t\t\t// scaling factor for v_prev to intersection point\n\n\t\t\t\t\tconst sf = ( ( ptNextShift_x - ptPrevShift_x ) * v_next_y -\n\t\t\t\t\t\t\t( ptNextShift_y - ptPrevShift_y ) * v_next_x ) /\n\t\t\t\t\t\t( v_prev_x * v_next_y - v_prev_y * v_next_x );\n\n\t\t\t\t\t// vector from inPt to intersection point\n\n\t\t\t\t\tv_trans_x = ( ptPrevShift_x + v_prev_x * sf - inPt.x );\n\t\t\t\t\tv_trans_y = ( ptPrevShift_y + v_prev_y * sf - inPt.y );\n\n\t\t\t\t\t// Don't normalize!, otherwise sharp corners become ugly\n\t\t\t\t\t//  but prevent crazy spikes\n\t\t\t\t\tconst v_trans_lensq = ( v_trans_x * v_trans_x + v_trans_y * v_trans_y );\n\t\t\t\t\tif ( v_trans_lensq <= 2 ) {\n\n\t\t\t\t\t\treturn new Vector2( v_trans_x, v_trans_y );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tshrink_by = Math.sqrt( v_trans_lensq / 2 );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// handle special case of collinear edges\n\n\t\t\t\t\tlet direction_eq = false; // assumes: opposite\n\n\t\t\t\t\tif ( v_prev_x > Number.EPSILON ) {\n\n\t\t\t\t\t\tif ( v_next_x > Number.EPSILON ) {\n\n\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( v_prev_x < - Number.EPSILON ) {\n\n\t\t\t\t\t\t\tif ( v_next_x < - Number.EPSILON ) {\n\n\t\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tif ( Math.sign( v_prev_y ) === Math.sign( v_next_y ) ) {\n\n\t\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( direction_eq ) {\n\n\t\t\t\t\t\t// log(\"Warning: lines are a straight sequence\");\n\t\t\t\t\t\tv_trans_x = - v_prev_y;\n\t\t\t\t\t\tv_trans_y = v_prev_x;\n\t\t\t\t\t\tshrink_by = Math.sqrt( v_prev_lensq );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// log(\"Warning: lines are a straight spike\");\n\t\t\t\t\t\tv_trans_x = v_prev_x;\n\t\t\t\t\t\tv_trans_y = v_prev_y;\n\t\t\t\t\t\tshrink_by = Math.sqrt( v_prev_lensq / 2 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn new Vector2( v_trans_x / shrink_by, v_trans_y / shrink_by );\n\n\t\t\t}\n\n\n\t\t\tconst contourMovements = [];\n\n\t\t\tfor ( let i = 0, il = contour.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {\n\n\t\t\t\tif ( j === il ) j = 0;\n\t\t\t\tif ( k === il ) k = 0;\n\n\t\t\t\t//  (j)---(i)---(k)\n\t\t\t\t// log('i,j,k', i, j , k)\n\n\t\t\t\tcontourMovements[ i ] = getBevelVec( contour[ i ], contour[ j ], contour[ k ] );\n\n\t\t\t}\n\n\t\t\tconst holesMovements = [];\n\t\t\tlet oneHoleMovements, verticesMovements = contourMovements.concat();\n\n\t\t\tfor ( let h = 0, hl = numHoles; h < hl; h ++ ) {\n\n\t\t\t\tconst ahole = holes[ h ];\n\n\t\t\t\toneHoleMovements = [];\n\n\t\t\t\tfor ( let i = 0, il = ahole.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {\n\n\t\t\t\t\tif ( j === il ) j = 0;\n\t\t\t\t\tif ( k === il ) k = 0;\n\n\t\t\t\t\t//  (j)---(i)---(k)\n\t\t\t\t\toneHoleMovements[ i ] = getBevelVec( ahole[ i ], ahole[ j ], ahole[ k ] );\n\n\t\t\t\t}\n\n\t\t\t\tholesMovements.push( oneHoleMovements );\n\t\t\t\tverticesMovements = verticesMovements.concat( oneHoleMovements );\n\n\t\t\t}\n\n\t\t\tlet faces;\n\n\t\t\tif ( bevelSegments === 0 ) {\n\n\t\t\t\tfaces = ShapeUtils.triangulateShape( contour, holes );\n\n\t\t\t} else {\n\n\t\t\t\tconst contractedContourVertices = [];\n\t\t\t\tconst expandedHoleVertices = [];\n\n\t\t\t\t// Loop bevelSegments, 1 for the front, 1 for the back\n\n\t\t\t\tfor ( let b = 0; b < bevelSegments; b ++ ) {\n\n\t\t\t\t\t//for ( b = bevelSegments; b > 0; b -- ) {\n\n\t\t\t\t\tconst t = b / bevelSegments;\n\t\t\t\t\tconst z = bevelThickness * Math.cos( t * Math.PI / 2 );\n\t\t\t\t\tconst bs = bevelSize * Math.sin( t * Math.PI / 2 ) + bevelOffset;\n\n\t\t\t\t\t// contract shape\n\n\t\t\t\t\tfor ( let i = 0, il = contour.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tconst vert = scalePt2( contour[ i ], contourMovements[ i ], bs );\n\n\t\t\t\t\t\tv( vert.x, vert.y, - z );\n\t\t\t\t\t\tif ( t === 0 ) contractedContourVertices.push( vert );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// expand holes\n\n\t\t\t\t\tfor ( let h = 0, hl = numHoles; h < hl; h ++ ) {\n\n\t\t\t\t\t\tconst ahole = holes[ h ];\n\t\t\t\t\t\toneHoleMovements = holesMovements[ h ];\n\t\t\t\t\t\tconst oneHoleVertices = [];\n\t\t\t\t\t\tfor ( let i = 0, il = ahole.length; i < il; i ++ ) {\n\n\t\t\t\t\t\t\tconst vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );\n\n\t\t\t\t\t\t\tv( vert.x, vert.y, - z );\n\t\t\t\t\t\t\tif ( t === 0 ) oneHoleVertices.push( vert );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( t === 0 ) expandedHoleVertices.push( oneHoleVertices );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tfaces = ShapeUtils.triangulateShape( contractedContourVertices, expandedHoleVertices );\n\n\t\t\t}\n\n\t\t\tconst flen = faces.length;\n\n\t\t\tconst bs = bevelSize + bevelOffset;\n\n\t\t\t// Back facing vertices\n\n\t\t\tfor ( let i = 0; i < vlen; i ++ ) {\n\n\t\t\t\tconst vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ];\n\n\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\tv( vert.x, vert.y, 0 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// v( vert.x, vert.y + extrudePts[ 0 ].y, extrudePts[ 0 ].x );\n\n\t\t\t\t\tnormal.copy( splineTube.normals[ 0 ] ).multiplyScalar( vert.x );\n\t\t\t\t\tbinormal.copy( splineTube.binormals[ 0 ] ).multiplyScalar( vert.y );\n\n\t\t\t\t\tposition2.copy( extrudePts[ 0 ] ).add( normal ).add( binormal );\n\n\t\t\t\t\tv( position2.x, position2.y, position2.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Add stepped vertices...\n\t\t\t// Including front facing vertices\n\n\t\t\tfor ( let s = 1; s <= steps; s ++ ) {\n\n\t\t\t\tfor ( let i = 0; i < vlen; i ++ ) {\n\n\t\t\t\t\tconst vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ];\n\n\t\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\t\tv( vert.x, vert.y, depth / steps * s );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// v( vert.x, vert.y + extrudePts[ s - 1 ].y, extrudePts[ s - 1 ].x );\n\n\t\t\t\t\t\tnormal.copy( splineTube.normals[ s ] ).multiplyScalar( vert.x );\n\t\t\t\t\t\tbinormal.copy( splineTube.binormals[ s ] ).multiplyScalar( vert.y );\n\n\t\t\t\t\t\tposition2.copy( extrudePts[ s ] ).add( normal ).add( binormal );\n\n\t\t\t\t\t\tv( position2.x, position2.y, position2.z );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t\t// Add bevel segments planes\n\n\t\t\t//for ( b = 1; b <= bevelSegments; b ++ ) {\n\t\t\tfor ( let b = bevelSegments - 1; b >= 0; b -- ) {\n\n\t\t\t\tconst t = b / bevelSegments;\n\t\t\t\tconst z = bevelThickness * Math.cos( t * Math.PI / 2 );\n\t\t\t\tconst bs = bevelSize * Math.sin( t * Math.PI / 2 ) + bevelOffset;\n\n\t\t\t\t// contract shape\n\n\t\t\t\tfor ( let i = 0, il = contour.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst vert = scalePt2( contour[ i ], contourMovements[ i ], bs );\n\t\t\t\t\tv( vert.x, vert.y, depth + z );\n\n\t\t\t\t}\n\n\t\t\t\t// expand holes\n\n\t\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\t\tconst ahole = holes[ h ];\n\t\t\t\t\toneHoleMovements = holesMovements[ h ];\n\n\t\t\t\t\tfor ( let i = 0, il = ahole.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tconst vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );\n\n\t\t\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\t\t\tv( vert.x, vert.y, depth + z );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tv( vert.x, vert.y + extrudePts[ steps - 1 ].y, extrudePts[ steps - 1 ].x + z );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t/* Faces */\n\n\t\t\t// Top and bottom faces\n\n\t\t\tbuildLidFaces();\n\n\t\t\t// Sides faces\n\n\t\t\tbuildSideFaces();\n\n\n\t\t\t/////  Internal functions\n\n\t\t\tfunction buildLidFaces() {\n\n\t\t\t\tconst start = verticesArray.length / 3;\n\n\t\t\t\tif ( bevelEnabled ) {\n\n\t\t\t\t\tlet layer = 0; // steps + 1\n\t\t\t\t\tlet offset = vlen * layer;\n\n\t\t\t\t\t// Bottom faces\n\n\t\t\t\t\tfor ( let i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\t\tconst face = faces[ i ];\n\t\t\t\t\t\tf3( face[ 2 ] + offset, face[ 1 ] + offset, face[ 0 ] + offset );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tlayer = steps + bevelSegments * 2;\n\t\t\t\t\toffset = vlen * layer;\n\n\t\t\t\t\t// Top faces\n\n\t\t\t\t\tfor ( let i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\t\tconst face = faces[ i ];\n\t\t\t\t\t\tf3( face[ 0 ] + offset, face[ 1 ] + offset, face[ 2 ] + offset );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Bottom faces\n\n\t\t\t\t\tfor ( let i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\t\tconst face = faces[ i ];\n\t\t\t\t\t\tf3( face[ 2 ], face[ 1 ], face[ 0 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Top faces\n\n\t\t\t\t\tfor ( let i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\t\tconst face = faces[ i ];\n\t\t\t\t\t\tf3( face[ 0 ] + vlen * steps, face[ 1 ] + vlen * steps, face[ 2 ] + vlen * steps );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tscope.addGroup( start, verticesArray.length / 3 - start, 0 );\n\n\t\t\t}\n\n\t\t\t// Create faces for the z-sides of the shape\n\n\t\t\tfunction buildSideFaces() {\n\n\t\t\t\tconst start = verticesArray.length / 3;\n\t\t\t\tlet layeroffset = 0;\n\t\t\t\tsidewalls( contour, layeroffset );\n\t\t\t\tlayeroffset += contour.length;\n\n\t\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\t\tconst ahole = holes[ h ];\n\t\t\t\t\tsidewalls( ahole, layeroffset );\n\n\t\t\t\t\t//, true\n\t\t\t\t\tlayeroffset += ahole.length;\n\n\t\t\t\t}\n\n\n\t\t\t\tscope.addGroup( start, verticesArray.length / 3 - start, 1 );\n\n\n\t\t\t}\n\n\t\t\tfunction sidewalls( contour, layeroffset ) {\n\n\t\t\t\tlet i = contour.length;\n\n\t\t\t\twhile ( -- i >= 0 ) {\n\n\t\t\t\t\tconst j = i;\n\t\t\t\t\tlet k = i - 1;\n\t\t\t\t\tif ( k < 0 ) k = contour.length - 1;\n\n\t\t\t\t\t//log('b', i,j, i-1, k,vertices.length);\n\n\t\t\t\t\tfor ( let s = 0, sl = ( steps + bevelSegments * 2 ); s < sl; s ++ ) {\n\n\t\t\t\t\t\tconst slen1 = vlen * s;\n\t\t\t\t\t\tconst slen2 = vlen * ( s + 1 );\n\n\t\t\t\t\t\tconst a = layeroffset + j + slen1,\n\t\t\t\t\t\t\tb = layeroffset + k + slen1,\n\t\t\t\t\t\t\tc = layeroffset + k + slen2,\n\t\t\t\t\t\t\td = layeroffset + j + slen2;\n\n\t\t\t\t\t\tf4( a, b, c, d );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction v( x, y, z ) {\n\n\t\t\t\tplaceholder.push( x );\n\t\t\t\tplaceholder.push( y );\n\t\t\t\tplaceholder.push( z );\n\n\t\t\t}\n\n\n\t\t\tfunction f3( a, b, c ) {\n\n\t\t\t\taddVertex( a );\n\t\t\t\taddVertex( b );\n\t\t\t\taddVertex( c );\n\n\t\t\t\tconst nextIndex = verticesArray.length / 3;\n\t\t\t\tconst uvs = uvgen.generateTopUV( scope, verticesArray, nextIndex - 3, nextIndex - 2, nextIndex - 1 );\n\n\t\t\t\taddUV( uvs[ 0 ] );\n\t\t\t\taddUV( uvs[ 1 ] );\n\t\t\t\taddUV( uvs[ 2 ] );\n\n\t\t\t}\n\n\t\t\tfunction f4( a, b, c, d ) {\n\n\t\t\t\taddVertex( a );\n\t\t\t\taddVertex( b );\n\t\t\t\taddVertex( d );\n\n\t\t\t\taddVertex( b );\n\t\t\t\taddVertex( c );\n\t\t\t\taddVertex( d );\n\n\n\t\t\t\tconst nextIndex = verticesArray.length / 3;\n\t\t\t\tconst uvs = uvgen.generateSideWallUV( scope, verticesArray, nextIndex - 6, nextIndex - 3, nextIndex - 2, nextIndex - 1 );\n\n\t\t\t\taddUV( uvs[ 0 ] );\n\t\t\t\taddUV( uvs[ 1 ] );\n\t\t\t\taddUV( uvs[ 3 ] );\n\n\t\t\t\taddUV( uvs[ 1 ] );\n\t\t\t\taddUV( uvs[ 2 ] );\n\t\t\t\taddUV( uvs[ 3 ] );\n\n\t\t\t}\n\n\t\t\tfunction addVertex( index ) {\n\n\t\t\t\tverticesArray.push( placeholder[ index * 3 + 0 ] );\n\t\t\t\tverticesArray.push( placeholder[ index * 3 + 1 ] );\n\t\t\t\tverticesArray.push( placeholder[ index * 3 + 2 ] );\n\n\t\t\t}\n\n\n\t\t\tfunction addUV( vector2 ) {\n\n\t\t\t\tuvArray.push( vector2.x );\n\t\t\t\tuvArray.push( vector2.y );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tconst shapes = this.parameters.shapes;\n\t\tconst options = this.parameters.options;\n\n\t\treturn toJSON$1( shapes, options, data );\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @param {Array<Shape>} shapes - An array of shapes.\n\t * @return {ExtrudeGeometry} A new instance.\n\t */\n\tstatic fromJSON( data, shapes ) {\n\n\t\tconst geometryShapes = [];\n\n\t\tfor ( let j = 0, jl = data.shapes.length; j < jl; j ++ ) {\n\n\t\t\tconst shape = shapes[ data.shapes[ j ] ];\n\n\t\t\tgeometryShapes.push( shape );\n\n\t\t}\n\n\t\tconst extrudePath = data.options.extrudePath;\n\n\t\tif ( extrudePath !== undefined ) {\n\n\t\t\tdata.options.extrudePath = new Curves[ extrudePath.type ]().fromJSON( extrudePath );\n\n\t\t}\n\n\t\treturn new ExtrudeGeometry( geometryShapes, data.options );\n\n\t}\n\n}\n\nconst WorldUVGenerator = {\n\n\tgenerateTopUV: function ( geometry, vertices, indexA, indexB, indexC ) {\n\n\t\tconst a_x = vertices[ indexA * 3 ];\n\t\tconst a_y = vertices[ indexA * 3 + 1 ];\n\t\tconst b_x = vertices[ indexB * 3 ];\n\t\tconst b_y = vertices[ indexB * 3 + 1 ];\n\t\tconst c_x = vertices[ indexC * 3 ];\n\t\tconst c_y = vertices[ indexC * 3 + 1 ];\n\n\t\treturn [\n\t\t\tnew Vector2( a_x, a_y ),\n\t\t\tnew Vector2( b_x, b_y ),\n\t\t\tnew Vector2( c_x, c_y )\n\t\t];\n\n\t},\n\n\tgenerateSideWallUV: function ( geometry, vertices, indexA, indexB, indexC, indexD ) {\n\n\t\tconst a_x = vertices[ indexA * 3 ];\n\t\tconst a_y = vertices[ indexA * 3 + 1 ];\n\t\tconst a_z = vertices[ indexA * 3 + 2 ];\n\t\tconst b_x = vertices[ indexB * 3 ];\n\t\tconst b_y = vertices[ indexB * 3 + 1 ];\n\t\tconst b_z = vertices[ indexB * 3 + 2 ];\n\t\tconst c_x = vertices[ indexC * 3 ];\n\t\tconst c_y = vertices[ indexC * 3 + 1 ];\n\t\tconst c_z = vertices[ indexC * 3 + 2 ];\n\t\tconst d_x = vertices[ indexD * 3 ];\n\t\tconst d_y = vertices[ indexD * 3 + 1 ];\n\t\tconst d_z = vertices[ indexD * 3 + 2 ];\n\n\t\tif ( Math.abs( a_y - b_y ) < Math.abs( a_x - b_x ) ) {\n\n\t\t\treturn [\n\t\t\t\tnew Vector2( a_x, 1 - a_z ),\n\t\t\t\tnew Vector2( b_x, 1 - b_z ),\n\t\t\t\tnew Vector2( c_x, 1 - c_z ),\n\t\t\t\tnew Vector2( d_x, 1 - d_z )\n\t\t\t];\n\n\t\t} else {\n\n\t\t\treturn [\n\t\t\t\tnew Vector2( a_y, 1 - a_z ),\n\t\t\t\tnew Vector2( b_y, 1 - b_z ),\n\t\t\t\tnew Vector2( c_y, 1 - c_z ),\n\t\t\t\tnew Vector2( d_y, 1 - d_z )\n\t\t\t];\n\n\t\t}\n\n\t}\n\n};\n\nfunction toJSON$1( shapes, options, data ) {\n\n\tdata.shapes = [];\n\n\tif ( Array.isArray( shapes ) ) {\n\n\t\tfor ( let i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\tconst shape = shapes[ i ];\n\n\t\t\tdata.shapes.push( shape.uuid );\n\n\t\t}\n\n\t} else {\n\n\t\tdata.shapes.push( shapes.uuid );\n\n\t}\n\n\tdata.options = Object.assign( {}, options );\n\n\tif ( options.extrudePath !== undefined ) data.options.extrudePath = options.extrudePath.toJSON();\n\n\treturn data;\n\n}\n\n/**\n * A geometry class for representing an icosahedron.\n *\n * ```js\n * const geometry = new THREE.IcosahedronGeometry();\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const icosahedron = new THREE.Mesh( geometry, material );\n * scene.add( icosahedron );\n * ```\n *\n * @augments PolyhedronGeometry\n * @demo scenes/geometry-browser.html#IcosahedronGeometry\n */\nclass IcosahedronGeometry extends PolyhedronGeometry {\n\n\t/**\n\t * Constructs a new icosahedron geometry.\n\t *\n\t * @param {number} [radius=1] - Radius of the icosahedron.\n\t * @param {number} [detail=0] - Setting this to a value greater than `0` adds vertices making it no longer a icosahedron.\n\t */\n\tconstructor( radius = 1, detail = 0 ) {\n\n\t\tconst t = ( 1 + Math.sqrt( 5 ) ) / 2;\n\n\t\tconst vertices = [\n\t\t\t-1, t, 0, \t1, t, 0, \t-1, - t, 0, \t1, - t, 0,\n\t\t\t0, -1, t, \t0, 1, t,\t0, -1, - t, \t0, 1, - t,\n\t\t\tt, 0, -1, \tt, 0, 1, \t- t, 0, -1, \t- t, 0, 1\n\t\t];\n\n\t\tconst indices = [\n\t\t\t0, 11, 5, \t0, 5, 1, \t0, 1, 7, \t0, 7, 10, \t0, 10, 11,\n\t\t\t1, 5, 9, \t5, 11, 4,\t11, 10, 2,\t10, 7, 6,\t7, 1, 8,\n\t\t\t3, 9, 4, \t3, 4, 2,\t3, 2, 6,\t3, 6, 8,\t3, 8, 9,\n\t\t\t4, 9, 5, \t2, 4, 11,\t6, 2, 10,\t8, 6, 7,\t9, 8, 1\n\t\t];\n\n\t\tsuper( vertices, indices, radius, detail );\n\n\t\tthis.type = 'IcosahedronGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {IcosahedronGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new IcosahedronGeometry( data.radius, data.detail );\n\n\t}\n\n}\n\n/**\n * Creates meshes with axial symmetry like vases. The lathe rotates around the Y axis.\n *\n * ```js\n * const points = [];\n * for ( let i = 0; i < 10; i ++ ) {\n * \tpoints.push( new THREE.Vector2( Math.sin( i * 0.2 ) * 10 + 5, ( i - 5 ) * 2 ) );\n * }\n * const geometry = new THREE.LatheGeometry( points );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const lathe = new THREE.Mesh( geometry, material );\n * scene.add( lathe );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#LatheGeometry\n */\nclass LatheGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new lathe geometry.\n\t *\n\t * @param {Array<Vector2|Vector3>} [points] - An array of points in 2D space. The x-coordinate of each point\n\t * must be greater than zero.\n\t * @param {number} [segments=12] - The number of circumference segments to generate.\n\t * @param {number} [phiStart=0] - The starting angle in radians.\n\t * @param {number} [phiLength=Math.PI*2] - The radian (0 to 2PI) range of the lathed section 2PI is a\n\t * closed lathe, less than 2PI is a portion.\n\t */\n\tconstructor( points = [ new Vector2( 0, -0.5 ), new Vector2( 0.5, 0 ), new Vector2( 0, 0.5 ) ], segments = 12, phiStart = 0, phiLength = Math.PI * 2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'LatheGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tpoints: points,\n\t\t\tsegments: segments,\n\t\t\tphiStart: phiStart,\n\t\t\tphiLength: phiLength\n\t\t};\n\n\t\tsegments = Math.floor( segments );\n\n\t\t// clamp phiLength so it's in range of [ 0, 2PI ]\n\n\t\tphiLength = clamp( phiLength, 0, Math.PI * 2 );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst uvs = [];\n\t\tconst initNormals = [];\n\t\tconst normals = [];\n\n\t\t// helper variables\n\n\t\tconst inverseSegments = 1.0 / segments;\n\t\tconst vertex = new Vector3();\n\t\tconst uv = new Vector2();\n\t\tconst normal = new Vector3();\n\t\tconst curNormal = new Vector3();\n\t\tconst prevNormal = new Vector3();\n\t\tlet dx = 0;\n\t\tlet dy = 0;\n\n\t\t// pre-compute normals for initial \"meridian\"\n\n\t\tfor ( let j = 0; j <= ( points.length - 1 ); j ++ ) {\n\n\t\t\tswitch ( j ) {\n\n\t\t\t\tcase 0:\t\t\t\t// special handling for 1st vertex on path\n\n\t\t\t\t\tdx = points[ j + 1 ].x - points[ j ].x;\n\t\t\t\t\tdy = points[ j + 1 ].y - points[ j ].y;\n\n\t\t\t\t\tnormal.x = dy * 1.0;\n\t\t\t\t\tnormal.y = - dx;\n\t\t\t\t\tnormal.z = dy * 0.0;\n\n\t\t\t\t\tprevNormal.copy( normal );\n\n\t\t\t\t\tnormal.normalize();\n\n\t\t\t\t\tinitNormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase ( points.length - 1 ):\t// special handling for last Vertex on path\n\n\t\t\t\t\tinitNormals.push( prevNormal.x, prevNormal.y, prevNormal.z );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\t\t\t// default handling for all vertices in between\n\n\t\t\t\t\tdx = points[ j + 1 ].x - points[ j ].x;\n\t\t\t\t\tdy = points[ j + 1 ].y - points[ j ].y;\n\n\t\t\t\t\tnormal.x = dy * 1.0;\n\t\t\t\t\tnormal.y = - dx;\n\t\t\t\t\tnormal.z = dy * 0.0;\n\n\t\t\t\t\tcurNormal.copy( normal );\n\n\t\t\t\t\tnormal.x += prevNormal.x;\n\t\t\t\t\tnormal.y += prevNormal.y;\n\t\t\t\t\tnormal.z += prevNormal.z;\n\n\t\t\t\t\tnormal.normalize();\n\n\t\t\t\t\tinitNormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t\tprevNormal.copy( curNormal );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate vertices, uvs and normals\n\n\t\tfor ( let i = 0; i <= segments; i ++ ) {\n\n\t\t\tconst phi = phiStart + i * inverseSegments * phiLength;\n\n\t\t\tconst sin = Math.sin( phi );\n\t\t\tconst cos = Math.cos( phi );\n\n\t\t\tfor ( let j = 0; j <= ( points.length - 1 ); j ++ ) {\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = points[ j ].x * sin;\n\t\t\t\tvertex.y = points[ j ].y;\n\t\t\t\tvertex.z = points[ j ].x * cos;\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuv.x = i / segments;\n\t\t\t\tuv.y = j / ( points.length - 1 );\n\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t\t// normal\n\n\t\t\t\tconst x = initNormals[ 3 * j + 0 ] * sin;\n\t\t\t\tconst y = initNormals[ 3 * j + 1 ];\n\t\t\t\tconst z = initNormals[ 3 * j + 0 ] * cos;\n\n\t\t\t\tnormals.push( x, y, z );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( let i = 0; i < segments; i ++ ) {\n\n\t\t\tfor ( let j = 0; j < ( points.length - 1 ); j ++ ) {\n\n\t\t\t\tconst base = j + i * points.length;\n\n\t\t\t\tconst a = base;\n\t\t\t\tconst b = base + points.length;\n\t\t\t\tconst c = base + points.length + 1;\n\t\t\t\tconst d = base + 1;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( c, d, b );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {LatheGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new LatheGeometry( data.points, data.segments, data.phiStart, data.phiLength );\n\n\t}\n\n}\n\n/**\n * A geometry class for representing an octahedron.\n *\n * ```js\n * const geometry = new THREE.OctahedronGeometry();\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const octahedron = new THREE.Mesh( geometry, material );\n * scene.add( octahedron );\n * ```\n *\n * @augments PolyhedronGeometry\n * @demo scenes/geometry-browser.html#OctahedronGeometry\n */\nclass OctahedronGeometry extends PolyhedronGeometry {\n\n\t/**\n\t * Constructs a new octahedron geometry.\n\t *\n\t * @param {number} [radius=1] - Radius of the octahedron.\n\t * @param {number} [detail=0] - Setting this to a value greater than `0` adds vertices making it no longer a octahedron.\n\t */\n\tconstructor( radius = 1, detail = 0 ) {\n\n\t\tconst vertices = [\n\t\t\t1, 0, 0, \t-1, 0, 0,\t0, 1, 0,\n\t\t\t0, -1, 0, \t0, 0, 1,\t0, 0, -1\n\t\t];\n\n\t\tconst indices = [\n\t\t\t0, 2, 4,\t0, 4, 3,\t0, 3, 5,\n\t\t\t0, 5, 2,\t1, 2, 5,\t1, 5, 3,\n\t\t\t1, 3, 4,\t1, 4, 2\n\t\t];\n\n\t\tsuper( vertices, indices, radius, detail );\n\n\t\tthis.type = 'OctahedronGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {OctahedronGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new OctahedronGeometry( data.radius, data.detail );\n\n\t}\n\n}\n\n/**\n * A geometry class for representing a plane.\n *\n * ```js\n * const geometry = new THREE.PlaneGeometry( 1, 1 );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00, side: THREE.DoubleSide } );\n * const plane = new THREE.Mesh( geometry, material );\n * scene.add( plane );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#PlaneGeometry\n */\nclass PlaneGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new plane geometry.\n\t *\n\t * @param {number} [width=1] - The width along the X axis.\n\t * @param {number} [height=1] - The height along the Y axis\n\t * @param {number} [widthSegments=1] - The number of segments along the X axis.\n\t * @param {number} [heightSegments=1] - The number of segments along the Y axis.\n\t */\n\tconstructor( width = 1, height = 1, widthSegments = 1, heightSegments = 1 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'PlaneGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments\n\t\t};\n\n\t\tconst width_half = width / 2;\n\t\tconst height_half = height / 2;\n\n\t\tconst gridX = Math.floor( widthSegments );\n\t\tconst gridY = Math.floor( heightSegments );\n\n\t\tconst gridX1 = gridX + 1;\n\t\tconst gridY1 = gridY + 1;\n\n\t\tconst segment_width = width / gridX;\n\t\tconst segment_height = height / gridY;\n\n\t\t//\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\tfor ( let iy = 0; iy < gridY1; iy ++ ) {\n\n\t\t\tconst y = iy * segment_height - height_half;\n\n\t\t\tfor ( let ix = 0; ix < gridX1; ix ++ ) {\n\n\t\t\t\tconst x = ix * segment_width - width_half;\n\n\t\t\t\tvertices.push( x, - y, 0 );\n\n\t\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\t\tuvs.push( ix / gridX );\n\t\t\t\tuvs.push( 1 - ( iy / gridY ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( let iy = 0; iy < gridY; iy ++ ) {\n\n\t\t\tfor ( let ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\t\tconst a = ix + gridX1 * iy;\n\t\t\t\tconst b = ix + gridX1 * ( iy + 1 );\n\t\t\t\tconst c = ( ix + 1 ) + gridX1 * ( iy + 1 );\n\t\t\t\tconst d = ( ix + 1 ) + gridX1 * iy;\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {PlaneGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new PlaneGeometry( data.width, data.height, data.widthSegments, data.heightSegments );\n\n\t}\n\n}\n\n/**\n * A class for generating a two-dimensional ring geometry.\n *\n * ```js\n * const geometry = new THREE.RingGeometry( 1, 5, 32 );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00, side: THREE.DoubleSide } );\n * const mesh = new THREE.Mesh( geometry, material );\n * scene.add( mesh );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#RingGeometry\n */\nclass RingGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new ring geometry.\n\t *\n\t * @param {number} [innerRadius=0.5] - The inner radius of the ring.\n\t * @param {number} [outerRadius=1] - The outer radius of the ring.\n\t * @param {number} [thetaSegments=32] - Number of segments. A higher number means the ring will be more round. Minimum is `3`.\n\t * @param {number} [phiSegments=1] - Number of segments per ring segment. Minimum is `1`.\n\t * @param {number} [thetaStart=0] - Starting angle in radians.\n\t * @param {number} [thetaLength=Math.PI*2] - Central angle in radians.\n\t */\n\tconstructor( innerRadius = 0.5, outerRadius = 1, thetaSegments = 32, phiSegments = 1, thetaStart = 0, thetaLength = Math.PI * 2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'RingGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tinnerRadius: innerRadius,\n\t\t\touterRadius: outerRadius,\n\t\t\tthetaSegments: thetaSegments,\n\t\t\tphiSegments: phiSegments,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tthetaSegments = Math.max( 3, thetaSegments );\n\t\tphiSegments = Math.max( 1, phiSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// some helper variables\n\n\t\tlet radius = innerRadius;\n\t\tconst radiusStep = ( ( outerRadius - innerRadius ) / phiSegments );\n\t\tconst vertex = new Vector3();\n\t\tconst uv = new Vector2();\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( let j = 0; j <= phiSegments; j ++ ) {\n\n\t\t\tfor ( let i = 0; i <= thetaSegments; i ++ ) {\n\n\t\t\t\t// values are generate from the inside of the ring to the outside\n\n\t\t\t\tconst segment = thetaStart + i / thetaSegments * thetaLength;\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = radius * Math.cos( segment );\n\t\t\t\tvertex.y = radius * Math.sin( segment );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\t\t// uv\n\n\t\t\t\tuv.x = ( vertex.x / outerRadius + 1 ) / 2;\n\t\t\t\tuv.y = ( vertex.y / outerRadius + 1 ) / 2;\n\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t}\n\n\t\t\t// increase the radius for next row of vertices\n\n\t\t\tradius += radiusStep;\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( let j = 0; j < phiSegments; j ++ ) {\n\n\t\t\tconst thetaSegmentLevel = j * ( thetaSegments + 1 );\n\n\t\t\tfor ( let i = 0; i < thetaSegments; i ++ ) {\n\n\t\t\t\tconst segment = i + thetaSegmentLevel;\n\n\t\t\t\tconst a = segment;\n\t\t\t\tconst b = segment + thetaSegments + 1;\n\t\t\t\tconst c = segment + thetaSegments + 2;\n\t\t\t\tconst d = segment + 1;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {RingGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new RingGeometry( data.innerRadius, data.outerRadius, data.thetaSegments, data.phiSegments, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\n/**\n * Creates an one-sided polygonal geometry from one or more path shapes.\n *\n * ```js\n * const arcShape = new THREE.Shape()\n *\t.moveTo( 5, 1 )\n *\t.absarc( 1, 1, 4, 0, Math.PI * 2, false );\n *\n * const geometry = new THREE.ShapeGeometry( arcShape );\n * const material = new THREE.MeshBasicMaterial( { color: 0x00ff00, side: THREE.DoubleSide } );\n * const mesh = new THREE.Mesh( geometry, material ) ;\n * scene.add( mesh );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#ShapeGeometry\n */\nclass ShapeGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new shape geometry.\n\t *\n\t * @param {Shape|Array<Shape>} [shapes] - A shape or an array of shapes.\n\t * @param {number} [curveSegments=12] - Number of segments per shape.\n\t */\n\tconstructor( shapes = new Shape( [ new Vector2( 0, 0.5 ), new Vector2( -0.5, -0.5 ), new Vector2( 0.5, -0.5 ) ] ), curveSegments = 12 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'ShapeGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tshapes: shapes,\n\t\t\tcurveSegments: curveSegments\n\t\t};\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tlet groupStart = 0;\n\t\tlet groupCount = 0;\n\n\t\t// allow single and array values for \"shapes\" parameter\n\n\t\tif ( Array.isArray( shapes ) === false ) {\n\n\t\t\taddShape( shapes );\n\n\t\t} else {\n\n\t\t\tfor ( let i = 0; i < shapes.length; i ++ ) {\n\n\t\t\t\taddShape( shapes[ i ] );\n\n\t\t\t\tthis.addGroup( groupStart, groupCount, i ); // enables MultiMaterial support\n\n\t\t\t\tgroupStart += groupCount;\n\t\t\t\tgroupCount = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\n\t\t// helper functions\n\n\t\tfunction addShape( shape ) {\n\n\t\t\tconst indexOffset = vertices.length / 3;\n\t\t\tconst points = shape.extractPoints( curveSegments );\n\n\t\t\tlet shapeVertices = points.shape;\n\t\t\tconst shapeHoles = points.holes;\n\n\t\t\t// check direction of vertices\n\n\t\t\tif ( ShapeUtils.isClockWise( shapeVertices ) === false ) {\n\n\t\t\t\tshapeVertices = shapeVertices.reverse();\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0, l = shapeHoles.length; i < l; i ++ ) {\n\n\t\t\t\tconst shapeHole = shapeHoles[ i ];\n\n\t\t\t\tif ( ShapeUtils.isClockWise( shapeHole ) === true ) {\n\n\t\t\t\t\tshapeHoles[ i ] = shapeHole.reverse();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst faces = ShapeUtils.triangulateShape( shapeVertices, shapeHoles );\n\n\t\t\t// join vertices of inner and outer paths to a single array\n\n\t\t\tfor ( let i = 0, l = shapeHoles.length; i < l; i ++ ) {\n\n\t\t\t\tconst shapeHole = shapeHoles[ i ];\n\t\t\t\tshapeVertices = shapeVertices.concat( shapeHole );\n\n\t\t\t}\n\n\t\t\t// vertices, normals, uvs\n\n\t\t\tfor ( let i = 0, l = shapeVertices.length; i < l; i ++ ) {\n\n\t\t\t\tconst vertex = shapeVertices[ i ];\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, 0 );\n\t\t\t\tnormals.push( 0, 0, 1 );\n\t\t\t\tuvs.push( vertex.x, vertex.y ); // world uvs\n\n\t\t\t}\n\n\t\t\t// indices\n\n\t\t\tfor ( let i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\tconst face = faces[ i ];\n\n\t\t\t\tconst a = face[ 0 ] + indexOffset;\n\t\t\t\tconst b = face[ 1 ] + indexOffset;\n\t\t\t\tconst c = face[ 2 ] + indexOffset;\n\n\t\t\t\tindices.push( a, b, c );\n\t\t\t\tgroupCount += 3;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tconst shapes = this.parameters.shapes;\n\n\t\treturn toJSON( shapes, data );\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @param {Array<Shape>} shapes - An array of shapes.\n\t * @return {ShapeGeometry} A new instance.\n\t */\n\tstatic fromJSON( data, shapes ) {\n\n\t\tconst geometryShapes = [];\n\n\t\tfor ( let j = 0, jl = data.shapes.length; j < jl; j ++ ) {\n\n\t\t\tconst shape = shapes[ data.shapes[ j ] ];\n\n\t\t\tgeometryShapes.push( shape );\n\n\t\t}\n\n\t\treturn new ShapeGeometry( geometryShapes, data.curveSegments );\n\n\t}\n\n}\n\nfunction toJSON( shapes, data ) {\n\n\tdata.shapes = [];\n\n\tif ( Array.isArray( shapes ) ) {\n\n\t\tfor ( let i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\tconst shape = shapes[ i ];\n\n\t\t\tdata.shapes.push( shape.uuid );\n\n\t\t}\n\n\t} else {\n\n\t\tdata.shapes.push( shapes.uuid );\n\n\t}\n\n\treturn data;\n\n}\n\n/**\n * A class for generating a sphere geometry.\n *\n * ```js\n * const geometry = new THREE.SphereGeometry( 15, 32, 16 );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const sphere = new THREE.Mesh( geometry, material );\n * scene.add( sphere );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#SphereGeometry\n */\nclass SphereGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new sphere geometry.\n\t *\n\t * @param {number} [radius=1] - The sphere radius.\n\t * @param {number} [widthSegments=32] - The number of horizontal segments. Minimum value is `3`.\n\t * @param {number} [heightSegments=16] - The number of vertical segments. Minimum value is `2`.\n\t * @param {number} [phiStart=0] - The horizontal starting angle in radians.\n\t * @param {number} [phiLength=Math.PI*2] - The horizontal sweep angle size.\n\t * @param {number} [thetaStart=0] - The vertical starting angle in radians.\n\t * @param {number} [thetaLength=Math.PI] - The vertical sweep angle size.\n\t */\n\tconstructor( radius = 1, widthSegments = 32, heightSegments = 16, phiStart = 0, phiLength = Math.PI * 2, thetaStart = 0, thetaLength = Math.PI ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'SphereGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\tphiStart: phiStart,\n\t\t\tphiLength: phiLength,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\twidthSegments = Math.max( 3, Math.floor( widthSegments ) );\n\t\theightSegments = Math.max( 2, Math.floor( heightSegments ) );\n\n\t\tconst thetaEnd = Math.min( thetaStart + thetaLength, Math.PI );\n\n\t\tlet index = 0;\n\t\tconst grid = [];\n\n\t\tconst vertex = new Vector3();\n\t\tconst normal = new Vector3();\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( let iy = 0; iy <= heightSegments; iy ++ ) {\n\n\t\t\tconst verticesRow = [];\n\n\t\t\tconst v = iy / heightSegments;\n\n\t\t\t// special case for the poles\n\n\t\t\tlet uOffset = 0;\n\n\t\t\tif ( iy === 0 && thetaStart === 0 ) {\n\n\t\t\t\tuOffset = 0.5 / widthSegments;\n\n\t\t\t} else if ( iy === heightSegments && thetaEnd === Math.PI ) {\n\n\t\t\t\tuOffset = -0.5 / widthSegments;\n\n\t\t\t}\n\n\t\t\tfor ( let ix = 0; ix <= widthSegments; ix ++ ) {\n\n\t\t\t\tconst u = ix / widthSegments;\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = - radius * Math.cos( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );\n\t\t\t\tvertex.y = radius * Math.cos( thetaStart + v * thetaLength );\n\t\t\t\tvertex.z = radius * Math.sin( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormal.copy( vertex ).normalize();\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( u + uOffset, 1 - v );\n\n\t\t\t\tverticesRow.push( index ++ );\n\n\t\t\t}\n\n\t\t\tgrid.push( verticesRow );\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( let iy = 0; iy < heightSegments; iy ++ ) {\n\n\t\t\tfor ( let ix = 0; ix < widthSegments; ix ++ ) {\n\n\t\t\t\tconst a = grid[ iy ][ ix + 1 ];\n\t\t\t\tconst b = grid[ iy ][ ix ];\n\t\t\t\tconst c = grid[ iy + 1 ][ ix ];\n\t\t\t\tconst d = grid[ iy + 1 ][ ix + 1 ];\n\n\t\t\t\tif ( iy !== 0 || thetaStart > 0 ) indices.push( a, b, d );\n\t\t\t\tif ( iy !== heightSegments - 1 || thetaEnd < Math.PI ) indices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {SphereGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new SphereGeometry( data.radius, data.widthSegments, data.heightSegments, data.phiStart, data.phiLength, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\n/**\n * A geometry class for representing an tetrahedron.\n *\n * ```js\n * const geometry = new THREE.TetrahedronGeometry();\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const tetrahedron = new THREE.Mesh( geometry, material );\n * scene.add( tetrahedron );\n * ```\n *\n * @augments PolyhedronGeometry\n * @demo scenes/geometry-browser.html#TetrahedronGeometry\n */\nclass TetrahedronGeometry extends PolyhedronGeometry {\n\n\t/**\n\t * Constructs a new tetrahedron geometry.\n\t *\n\t * @param {number} [radius=1] - Radius of the tetrahedron.\n\t * @param {number} [detail=0] - Setting this to a value greater than `0` adds vertices making it no longer a tetrahedron.\n\t */\n\tconstructor( radius = 1, detail = 0 ) {\n\n\t\tconst vertices = [\n\t\t\t1, 1, 1, \t-1, -1, 1, \t-1, 1, -1, \t1, -1, -1\n\t\t];\n\n\t\tconst indices = [\n\t\t\t2, 1, 0, \t0, 3, 2,\t1, 3, 0,\t2, 3, 1\n\t\t];\n\n\t\tsuper( vertices, indices, radius, detail );\n\n\t\tthis.type = 'TetrahedronGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {TetrahedronGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new TetrahedronGeometry( data.radius, data.detail );\n\n\t}\n\n}\n\n/**\n * A geometry class for representing an torus.\n *\n * ```js\n * const geometry = new THREE.TorusGeometry( 10, 3, 16, 100 );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const torus = new THREE.Mesh( geometry, material );\n * scene.add( torus );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#TorusGeometry\n */\nclass TorusGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new torus geometry.\n\t *\n\t * @param {number} [radius=1] - Radius of the torus, from the center of the torus to the center of the tube.\n\t * @param {number} [tube=0.4] - Radius of the tube. Must be smaller than `radius`.\n\t * @param {number} [radialSegments=12] - The number of radial segments.\n\t * @param {number} [tubularSegments=48] - The number of tubular segments.\n\t * @param {number} [arc=Math.PI*2] - Central angle in radians.\n\t */\n\tconstructor( radius = 1, tube = 0.4, radialSegments = 12, tubularSegments = 48, arc = Math.PI * 2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'TorusGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\ttube: tube,\n\t\t\tradialSegments: radialSegments,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tarc: arc\n\t\t};\n\n\t\tradialSegments = Math.floor( radialSegments );\n\t\ttubularSegments = Math.floor( tubularSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tconst center = new Vector3();\n\t\tconst vertex = new Vector3();\n\t\tconst normal = new Vector3();\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( let j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\tfor ( let i = 0; i <= tubularSegments; i ++ ) {\n\n\t\t\t\tconst u = i / tubularSegments * arc;\n\t\t\t\tconst v = j / radialSegments * Math.PI * 2;\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = ( radius + tube * Math.cos( v ) ) * Math.cos( u );\n\t\t\t\tvertex.y = ( radius + tube * Math.cos( v ) ) * Math.sin( u );\n\t\t\t\tvertex.z = tube * Math.sin( v );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tcenter.x = radius * Math.cos( u );\n\t\t\t\tcenter.y = radius * Math.sin( u );\n\t\t\t\tnormal.subVectors( vertex, center ).normalize();\n\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( i / tubularSegments );\n\t\t\t\tuvs.push( j / radialSegments );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( let j = 1; j <= radialSegments; j ++ ) {\n\n\t\t\tfor ( let i = 1; i <= tubularSegments; i ++ ) {\n\n\t\t\t\t// indices\n\n\t\t\t\tconst a = ( tubularSegments + 1 ) * j + i - 1;\n\t\t\t\tconst b = ( tubularSegments + 1 ) * ( j - 1 ) + i - 1;\n\t\t\t\tconst c = ( tubularSegments + 1 ) * ( j - 1 ) + i;\n\t\t\t\tconst d = ( tubularSegments + 1 ) * j + i;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {TorusGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new TorusGeometry( data.radius, data.tube, data.radialSegments, data.tubularSegments, data.arc );\n\n\t}\n\n}\n\n/**\n * Creates a torus knot, the particular shape of which is defined by a pair\n * of coprime integers, p and q. If p and q are not coprime, the result will\n * be a torus link.\n *\n * ```js\n * const geometry = new THREE.TorusKnotGeometry( 10, 3, 100, 16 );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const torusKnot = new THREE.Mesh( geometry, material );\n * scene.add( torusKnot );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#TorusKnotGeometry\n */\nclass TorusKnotGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new torus knot geometry.\n\t *\n\t * @param {number} [radius=1] - Radius of the torus knot.\n\t * @param {number} [tube=0.4] - Radius of the tube.\n\t * @param {number} [tubularSegments=64] - The number of tubular segments.\n\t * @param {number} [radialSegments=8] - The number of radial segments.\n\t * @param {number} [p=2] - This value determines, how many times the geometry winds around its axis of rotational symmetry.\n\t * @param {number} [q=3] - This value determines, how many times the geometry winds around a circle in the interior of the torus.\n\t */\n\tconstructor( radius = 1, tube = 0.4, tubularSegments = 64, radialSegments = 8, p = 2, q = 3 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'TorusKnotGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\ttube: tube,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tradialSegments: radialSegments,\n\t\t\tp: p,\n\t\t\tq: q\n\t\t};\n\n\t\ttubularSegments = Math.floor( tubularSegments );\n\t\tradialSegments = Math.floor( radialSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tconst vertex = new Vector3();\n\t\tconst normal = new Vector3();\n\n\t\tconst P1 = new Vector3();\n\t\tconst P2 = new Vector3();\n\n\t\tconst B = new Vector3();\n\t\tconst T = new Vector3();\n\t\tconst N = new Vector3();\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( let i = 0; i <= tubularSegments; ++ i ) {\n\n\t\t\t// the radian \"u\" is used to calculate the position on the torus curve of the current tubular segment\n\n\t\t\tconst u = i / tubularSegments * p * Math.PI * 2;\n\n\t\t\t// now we calculate two points. P1 is our current position on the curve, P2 is a little farther ahead.\n\t\t\t// these points are used to create a special \"coordinate space\", which is necessary to calculate the correct vertex positions\n\n\t\t\tcalculatePositionOnCurve( u, p, q, radius, P1 );\n\t\t\tcalculatePositionOnCurve( u + 0.01, p, q, radius, P2 );\n\n\t\t\t// calculate orthonormal basis\n\n\t\t\tT.subVectors( P2, P1 );\n\t\t\tN.addVectors( P2, P1 );\n\t\t\tB.crossVectors( T, N );\n\t\t\tN.crossVectors( B, T );\n\n\t\t\t// normalize B, N. T can be ignored, we don't use it\n\n\t\t\tB.normalize();\n\t\t\tN.normalize();\n\n\t\t\tfor ( let j = 0; j <= radialSegments; ++ j ) {\n\n\t\t\t\t// now calculate the vertices. they are nothing more than an extrusion of the torus curve.\n\t\t\t\t// because we extrude a shape in the xy-plane, there is no need to calculate a z-value.\n\n\t\t\t\tconst v = j / radialSegments * Math.PI * 2;\n\t\t\t\tconst cx = - tube * Math.cos( v );\n\t\t\t\tconst cy = tube * Math.sin( v );\n\n\t\t\t\t// now calculate the final vertex position.\n\t\t\t\t// first we orient the extrusion with our basis vectors, then we add it to the current position on the curve\n\n\t\t\t\tvertex.x = P1.x + ( cx * N.x + cy * B.x );\n\t\t\t\tvertex.y = P1.y + ( cx * N.y + cy * B.y );\n\t\t\t\tvertex.z = P1.z + ( cx * N.z + cy * B.z );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal (P1 is always the center/origin of the extrusion, thus we can use it to calculate the normal)\n\n\t\t\t\tnormal.subVectors( vertex, P1 ).normalize();\n\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( i / tubularSegments );\n\t\t\t\tuvs.push( j / radialSegments );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( let j = 1; j <= tubularSegments; j ++ ) {\n\n\t\t\tfor ( let i = 1; i <= radialSegments; i ++ ) {\n\n\t\t\t\t// indices\n\n\t\t\t\tconst a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 );\n\t\t\t\tconst b = ( radialSegments + 1 ) * j + ( i - 1 );\n\t\t\t\tconst c = ( radialSegments + 1 ) * j + i;\n\t\t\t\tconst d = ( radialSegments + 1 ) * ( j - 1 ) + i;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\t// this function calculates the current position on the torus curve\n\n\t\tfunction calculatePositionOnCurve( u, p, q, radius, position ) {\n\n\t\t\tconst cu = Math.cos( u );\n\t\t\tconst su = Math.sin( u );\n\t\t\tconst quOverP = q / p * u;\n\t\t\tconst cs = Math.cos( quOverP );\n\n\t\t\tposition.x = radius * ( 2 + cs ) * 0.5 * cu;\n\t\t\tposition.y = radius * ( 2 + cs ) * su * 0.5;\n\t\t\tposition.z = radius * Math.sin( quOverP ) * 0.5;\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {TorusKnotGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new TorusKnotGeometry( data.radius, data.tube, data.tubularSegments, data.radialSegments, data.p, data.q );\n\n\t}\n\n}\n\n/**\n * Creates a tube that extrudes along a 3D curve.\n *\n * ```js\n * class CustomSinCurve extends THREE.Curve {\n *\n * \tgetPoint( t, optionalTarget = new THREE.Vector3() ) {\n *\n * \t\tconst tx = t * 3 - 1.5;\n * \t\tconst ty = Math.sin( 2 * Math.PI * t );\n * \t\tconst tz = 0;\n *\n * \t\treturn optionalTarget.set( tx, ty, tz );\n * \t}\n *\n * }\n *\n * const path = new CustomSinCurve( 10 );\n * const geometry = new THREE.TubeGeometry( path, 20, 2, 8, false );\n * const material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );\n * const mesh = new THREE.Mesh( geometry, material );\n * scene.add( mesh );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#TubeGeometry\n */\nclass TubeGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new tube geometry.\n\t *\n\t * @param {Curve} [path=QuadraticBezierCurve3] - A 3D curve defining the path of the tube.\n\t * @param {number} [tubularSegments=64] - The number of segments that make up the tube.\n\t * @param {number} [radius=1] -The radius of the tube.\n\t * @param {number} [radialSegments=8] - The number of segments that make up the cross-section.\n\t * @param {boolean} [closed=false] - Whether the tube is closed or not.\n\t */\n\tconstructor( path = new QuadraticBezierCurve3( new Vector3( -1, -1, 0 ), new Vector3( -1, 1, 0 ), new Vector3( 1, 1, 0 ) ), tubularSegments = 64, radius = 1, radialSegments = 8, closed = false ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'TubeGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tpath: path,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tradius: radius,\n\t\t\tradialSegments: radialSegments,\n\t\t\tclosed: closed\n\t\t};\n\n\t\tconst frames = path.computeFrenetFrames( tubularSegments, closed );\n\n\t\t// expose internals\n\n\t\tthis.tangents = frames.tangents;\n\t\tthis.normals = frames.normals;\n\t\tthis.binormals = frames.binormals;\n\n\t\t// helper variables\n\n\t\tconst vertex = new Vector3();\n\t\tconst normal = new Vector3();\n\t\tconst uv = new Vector2();\n\t\tlet P = new Vector3();\n\n\t\t// buffer\n\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\t\tconst indices = [];\n\n\t\t// create buffer data\n\n\t\tgenerateBufferData();\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\t// functions\n\n\t\tfunction generateBufferData() {\n\n\t\t\tfor ( let i = 0; i < tubularSegments; i ++ ) {\n\n\t\t\t\tgenerateSegment( i );\n\n\t\t\t}\n\n\t\t\t// if the geometry is not closed, generate the last row of vertices and normals\n\t\t\t// at the regular position on the given path\n\t\t\t//\n\t\t\t// if the geometry is closed, duplicate the first row of vertices and normals (uvs will differ)\n\n\t\t\tgenerateSegment( ( closed === false ) ? tubularSegments : 0 );\n\n\t\t\t// uvs are generated in a separate function.\n\t\t\t// this makes it easy compute correct values for closed geometries\n\n\t\t\tgenerateUVs();\n\n\t\t\t// finally create faces\n\n\t\t\tgenerateIndices();\n\n\t\t}\n\n\t\tfunction generateSegment( i ) {\n\n\t\t\t// we use getPointAt to sample evenly distributed points from the given path\n\n\t\t\tP = path.getPointAt( i / tubularSegments, P );\n\n\t\t\t// retrieve corresponding normal and binormal\n\n\t\t\tconst N = frames.normals[ i ];\n\t\t\tconst B = frames.binormals[ i ];\n\n\t\t\t// generate normals and vertices for the current segment\n\n\t\t\tfor ( let j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\t\tconst v = j / radialSegments * Math.PI * 2;\n\n\t\t\t\tconst sin = Math.sin( v );\n\t\t\t\tconst cos = - Math.cos( v );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormal.x = ( cos * N.x + sin * B.x );\n\t\t\t\tnormal.y = ( cos * N.y + sin * B.y );\n\t\t\t\tnormal.z = ( cos * N.z + sin * B.z );\n\t\t\t\tnormal.normalize();\n\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = P.x + radius * normal.x;\n\t\t\t\tvertex.y = P.y + radius * normal.y;\n\t\t\t\tvertex.z = P.z + radius * normal.z;\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction generateIndices() {\n\n\t\t\tfor ( let j = 1; j <= tubularSegments; j ++ ) {\n\n\t\t\t\tfor ( let i = 1; i <= radialSegments; i ++ ) {\n\n\t\t\t\t\tconst a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 );\n\t\t\t\t\tconst b = ( radialSegments + 1 ) * j + ( i - 1 );\n\t\t\t\t\tconst c = ( radialSegments + 1 ) * j + i;\n\t\t\t\t\tconst d = ( radialSegments + 1 ) * ( j - 1 ) + i;\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tindices.push( a, b, d );\n\t\t\t\t\tindices.push( b, c, d );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction generateUVs() {\n\n\t\t\tfor ( let i = 0; i <= tubularSegments; i ++ ) {\n\n\t\t\t\tfor ( let j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\t\t\tuv.x = i / tubularSegments;\n\t\t\t\t\tuv.y = j / radialSegments;\n\n\t\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.path = this.parameters.path.toJSON();\n\n\t\treturn data;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {TubeGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\t// This only works for built-in curves (e.g. CatmullRomCurve3).\n\t\t// User defined curves or instances of CurvePath will not be deserialized.\n\t\treturn new TubeGeometry(\n\t\t\tnew Curves[ data.path.type ]().fromJSON( data.path ),\n\t\t\tdata.tubularSegments,\n\t\t\tdata.radius,\n\t\t\tdata.radialSegments,\n\t\t\tdata.closed\n\t\t);\n\n\t}\n\n}\n\n/**\n * Can be used as a helper object to visualize a geometry as a wireframe.\n *\n * ```js\n * const geometry = new THREE.SphereGeometry();\n *\n * const wireframe = new THREE.WireframeGeometry( geometry );\n *\n * const line = new THREE.LineSegments( wireframe );\n * line.material.depthWrite = false;\n * line.material.opacity = 0.25;\n * line.material.transparent = true;\n *\n * scene.add( line );\n * ```\n *\n * Note: It is not yet possible to serialize/deserialize instances of this class.\n *\n * @augments BufferGeometry\n */\nclass WireframeGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new wireframe geometry.\n\t *\n\t * @param {?BufferGeometry} [geometry=null] - The geometry.\n\t */\n\tconstructor( geometry = null ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'WireframeGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tgeometry: geometry\n\t\t};\n\n\t\tif ( geometry !== null ) {\n\n\t\t\t// buffer\n\n\t\t\tconst vertices = [];\n\t\t\tconst edges = new Set();\n\n\t\t\t// helper variables\n\n\t\t\tconst start = new Vector3();\n\t\t\tconst end = new Vector3();\n\n\t\t\tif ( geometry.index !== null ) {\n\n\t\t\t\t// indexed BufferGeometry\n\n\t\t\t\tconst position = geometry.attributes.position;\n\t\t\t\tconst indices = geometry.index;\n\t\t\t\tlet groups = geometry.groups;\n\n\t\t\t\tif ( groups.length === 0 ) {\n\n\t\t\t\t\tgroups = [ { start: 0, count: indices.count, materialIndex: 0 } ];\n\n\t\t\t\t}\n\n\t\t\t\t// create a data structure that contains all edges without duplicates\n\n\t\t\t\tfor ( let o = 0, ol = groups.length; o < ol; ++ o ) {\n\n\t\t\t\t\tconst group = groups[ o ];\n\n\t\t\t\t\tconst groupStart = group.start;\n\t\t\t\t\tconst groupCount = group.count;\n\n\t\t\t\t\tfor ( let i = groupStart, l = ( groupStart + groupCount ); i < l; i += 3 ) {\n\n\t\t\t\t\t\tfor ( let j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\t\tconst index1 = indices.getX( i + j );\n\t\t\t\t\t\t\tconst index2 = indices.getX( i + ( j + 1 ) % 3 );\n\n\t\t\t\t\t\t\tstart.fromBufferAttribute( position, index1 );\n\t\t\t\t\t\t\tend.fromBufferAttribute( position, index2 );\n\n\t\t\t\t\t\t\tif ( isUniqueEdge( start, end, edges ) === true ) {\n\n\t\t\t\t\t\t\t\tvertices.push( start.x, start.y, start.z );\n\t\t\t\t\t\t\t\tvertices.push( end.x, end.y, end.z );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// non-indexed BufferGeometry\n\n\t\t\t\tconst position = geometry.attributes.position;\n\n\t\t\t\tfor ( let i = 0, l = ( position.count / 3 ); i < l; i ++ ) {\n\n\t\t\t\t\tfor ( let j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\t// three edges per triangle, an edge is represented as (index1, index2)\n\t\t\t\t\t\t// e.g. the first triangle has the following edges: (0,1),(1,2),(2,0)\n\n\t\t\t\t\t\tconst index1 = 3 * i + j;\n\t\t\t\t\t\tconst index2 = 3 * i + ( ( j + 1 ) % 3 );\n\n\t\t\t\t\t\tstart.fromBufferAttribute( position, index1 );\n\t\t\t\t\t\tend.fromBufferAttribute( position, index2 );\n\n\t\t\t\t\t\tif ( isUniqueEdge( start, end, edges ) === true ) {\n\n\t\t\t\t\t\t\tvertices.push( start.x, start.y, start.z );\n\t\t\t\t\t\t\tvertices.push( end.x, end.y, end.z );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// build geometry\n\n\t\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n}\n\nfunction isUniqueEdge( start, end, edges ) {\n\n\tconst hash1 = `${start.x},${start.y},${start.z}-${end.x},${end.y},${end.z}`;\n\tconst hash2 = `${end.x},${end.y},${end.z}-${start.x},${start.y},${start.z}`; // coincident edge\n\n\tif ( edges.has( hash1 ) === true || edges.has( hash2 ) === true ) {\n\n\t\treturn false;\n\n\t} else {\n\n\t\tedges.add( hash1 );\n\t\tedges.add( hash2 );\n\t\treturn true;\n\n\t}\n\n}\n\nvar Geometries = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\tBoxGeometry: BoxGeometry,\n\tCapsuleGeometry: CapsuleGeometry,\n\tCircleGeometry: CircleGeometry,\n\tConeGeometry: ConeGeometry,\n\tCylinderGeometry: CylinderGeometry,\n\tDodecahedronGeometry: DodecahedronGeometry,\n\tEdgesGeometry: EdgesGeometry,\n\tExtrudeGeometry: ExtrudeGeometry,\n\tIcosahedronGeometry: IcosahedronGeometry,\n\tLatheGeometry: LatheGeometry,\n\tOctahedronGeometry: OctahedronGeometry,\n\tPlaneGeometry: PlaneGeometry,\n\tPolyhedronGeometry: PolyhedronGeometry,\n\tRingGeometry: RingGeometry,\n\tShapeGeometry: ShapeGeometry,\n\tSphereGeometry: SphereGeometry,\n\tTetrahedronGeometry: TetrahedronGeometry,\n\tTorusGeometry: TorusGeometry,\n\tTorusKnotGeometry: TorusKnotGeometry,\n\tTubeGeometry: TubeGeometry,\n\tWireframeGeometry: WireframeGeometry\n});\n\n/**\n * This material can receive shadows, but otherwise is completely transparent.\n *\n * ```js\n * const geometry = new THREE.PlaneGeometry( 2000, 2000 );\n * geometry.rotateX( - Math.PI / 2 );\n *\n * const material = new THREE.ShadowMaterial();\n * material.opacity = 0.2;\n *\n * const plane = new THREE.Mesh( geometry, material );\n * plane.position.y = -200;\n * plane.receiveShadow = true;\n * scene.add( plane );\n * ```\n *\n * @augments Material\n */\nclass ShadowMaterial extends Material {\n\n\t/**\n\t * Constructs a new shadow material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isShadowMaterial = true;\n\n\t\tthis.type = 'ShadowMaterial';\n\n\t\t/**\n\t\t * Color of the material.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.color = new Color( 0x000000 );\n\n\t\t/**\n\t\t * Overwritten since shadow materials are transparent\n\t\t * by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.transparent = true;\n\n\t\t/**\n\t\t * Whether the material is affected by fog or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * This class works just like {@link ShaderMaterial}, except that definitions\n * of built-in uniforms and attributes are not automatically prepended to the\n * GLSL shader code.\n *\n * `RawShaderMaterial` can only be used with {@link WebGLRenderer}.\n *\n * @augments ShaderMaterial\n */\nclass RawShaderMaterial extends ShaderMaterial {\n\n\t/**\n\t * Constructs a new raw shader material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper( parameters );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isRawShaderMaterial = true;\n\n\t\tthis.type = 'RawShaderMaterial';\n\n\t}\n\n}\n\n/**\n * A standard physically based material, using Metallic-Roughness workflow.\n *\n * Physically based rendering (PBR) has recently become the standard in many\n * 3D applications, such as [Unity](https://blogs.unity3d.com/2014/10/29/physically-based-shading-in-unity-5-a-primer/),\n * [Unreal](https://docs.unrealengine.com/latest/INT/Engine/Rendering/Materials/PhysicallyBased/) and\n * [3D Studio Max](http://area.autodesk.com/blogs/the-3ds-max-blog/what039s-new-for-rendering-in-3ds-max-2017).\n *\n * This approach differs from older approaches in that instead of using\n * approximations for the way in which light interacts with a surface, a\n * physically correct model is used. The idea is that, instead of tweaking\n * materials to look good under specific lighting, a material can be created\n * that will react 'correctly' under all lighting scenarios.\n *\n * In practice this gives a more accurate and realistic looking result than\n * the {@link MeshLambertMaterial} or {@link MeshPhongMaterial}, at the cost of\n * being somewhat more computationally expensive. `MeshStandardMaterial` uses per-fragment\n * shading.\n *\n * Note that for best results you should always specify an environment map when using this material.\n *\n * For a non-technical introduction to the concept of PBR and how to set up a\n * PBR material, check out these articles by the people at [marmoset](https://www.marmoset.co):\n *\n * - [Basic Theory of Physically Based Rendering](https://www.marmoset.co/posts/basic-theory-of-physically-based-rendering/)\n * - [Physically Based Rendering and You Can Too](https://www.marmoset.co/posts/physically-based-rendering-and-you-can-too/)\n *\n * Technical details of the approach used in three.js (and most other PBR systems) can be found is this\n * [paper from Disney](https://media.disneyanimation.com/uploads/production/publication_asset/48/asset/s2012_pbs_disney_brdf_notes_v3.pdf)\n * (pdf), by Brent Burley.\n *\n * @augments Material\n * @demo scenes/material-browser.html#MeshStandardMaterial\n */\nclass MeshStandardMaterial extends Material {\n\n\t/**\n\t * Constructs a new mesh standard material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshStandardMaterial = true;\n\n\t\tthis.type = 'MeshStandardMaterial';\n\n\t\tthis.defines = { 'STANDARD': '' };\n\n\t\t/**\n\t\t * Color of the material.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\n\t\t/**\n\t\t * How rough the material appears. `0.0` means a smooth mirror reflection, `1.0`\n\t\t * means fully diffuse. If `roughnessMap` is also provided,\n\t\t * both values are multiplied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.roughness = 1.0;\n\n\t\t/**\n\t\t * How much the material is like a metal. Non-metallic materials such as wood\n\t\t * or stone use `0.0`, metallic use `1.0`, with nothing (usually) in between.\n\t\t * A value between `0.0` and `1.0` could be used for a rusty metal look.\n\t\t * If `metalnessMap` is also provided, both values are multiplied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.metalness = 0.0;\n\n\t\t/**\n\t\t * The color map. May optionally include an alpha channel, typically combined\n\t\t * with {@link Material#transparent} or {@link Material#alphaTest}. The texture map\n\t\t * color is modulated by the diffuse `color`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * The light map. Requires a second set of UVs.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.lightMap = null;\n\n\t\t/**\n\t\t * Intensity of the baked light.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\t/**\n\t\t * The red channel of this texture is used as the ambient occlusion map.\n\t\t * Requires a second set of UVs.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.aoMap = null;\n\n\t\t/**\n\t\t * Intensity of the ambient occlusion effect. Range is `[0,1]`, where `0`\n\t\t * disables ambient occlusion. Where intensity is `1` and the AO map's\n\t\t * red channel is also `1`, ambient light is fully occluded on a surface.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\t/**\n\t\t * Emissive (light) color of the material, essentially a solid color\n\t\t * unaffected by other lighting.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.emissive = new Color( 0x000000 );\n\n\t\t/**\n\t\t * Intensity of the emissive light. Modulates the emissive color.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.emissiveIntensity = 1.0;\n\n\t\t/**\n\t\t * Set emissive (glow) map. The emissive map color is modulated by the\n\t\t * emissive color and the emissive intensity. If you have an emissive map,\n\t\t * be sure to set the emissive color to something other than black.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.emissiveMap = null;\n\n\t\t/**\n\t\t * The texture to create a bump map. The black and white values map to the\n\t\t * perceived depth in relation to the lights. Bump doesn't actually affect\n\t\t * the geometry of the object, only the lighting. If a normal map is defined\n\t\t * this will be ignored.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.bumpMap = null;\n\n\t\t/**\n\t\t * How much the bump map affects the material. Typical range is `[0,1]`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.bumpScale = 1;\n\n\t\t/**\n\t\t * The texture to create a normal map. The RGB values affect the surface\n\t\t * normal for each pixel fragment and change the way the color is lit. Normal\n\t\t * maps do not change the actual shape of the surface, only the lighting. In\n\t\t * case the material has a normal map authored using the left handed\n\t\t * convention, the `y` component of `normalScale` should be negated to compensate\n\t\t * for the different handedness.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.normalMap = null;\n\n\t\t/**\n\t\t * The type of normal map.\n\t\t *\n\t\t * @type {(TangentSpaceNormalMap|ObjectSpaceNormalMap)}\n\t\t * @default TangentSpaceNormalMap\n\t\t */\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\n\t\t/**\n\t\t * How much the normal map affects the material. Typical value range is `[0,1]`.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (1,1)\n\t\t */\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\t/**\n\t\t * The displacement map affects the position of the mesh's vertices. Unlike\n\t\t * other maps which only affect the light and shade of the material the\n\t\t * displaced vertices can cast shadows, block other objects, and otherwise\n\t\t * act as real geometry. The displacement texture is an image where the value\n\t\t * of each pixel (white being the highest) is mapped against, and\n\t\t * repositions, the vertices of the mesh.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.displacementMap = null;\n\n\t\t/**\n\t\t * How much the displacement map affects the mesh (where black is no\n\t\t * displacement, and white is maximum displacement). Without a displacement\n\t\t * map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementScale = 1;\n\n\t\t/**\n\t\t * The offset of the displacement map's values on the mesh's vertices.\n\t\t * The bias is added to the scaled sample of the displacement map.\n\t\t * Without a displacement map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementBias = 0;\n\n\t\t/**\n\t\t * The green channel of this texture is used to alter the roughness of the\n\t\t * material.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.roughnessMap = null;\n\n\t\t/**\n\t\t * The blue channel of this texture is used to alter the metalness of the\n\t\t * material.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.metalnessMap = null;\n\n\t\t/**\n\t\t * The alpha map is a grayscale texture that controls the opacity across the\n\t\t * surface (black: fully transparent; white: fully opaque).\n\t\t *\n\t\t * Only the color of the texture is used, ignoring the alpha channel if one\n\t\t * exists. For RGB and RGBA textures, the renderer will use the green channel\n\t\t * when sampling this texture due to the extra bit of precision provided for\n\t\t * green in DXT-compressed and uncompressed RGB 565 formats. Luminance-only and\n\t\t * luminance/alpha textures will also still work as expected.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.alphaMap = null;\n\n\t\t/**\n\t\t * The environment map. To ensure a physically correct rendering, environment maps\n\t\t * are internally pre-processed with {@link PMREMGenerator}.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.envMap = null;\n\n\t\t/**\n\t\t * The rotation of the environment map in radians.\n\t\t *\n\t\t * @type {Euler}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.envMapRotation = new Euler();\n\n\t\t/**\n\t\t * Scales the effect of the environment map by multiplying its color.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.envMapIntensity = 1.0;\n\n\t\t/**\n\t\t * Renders the geometry as a wireframe.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.wireframe = false;\n\n\t\t/**\n\t\t * Controls the thickness of the wireframe.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.wireframeLinewidth = 1;\n\n\t\t/**\n\t\t * Defines appearance of wireframe ends.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.wireframeLinecap = 'round';\n\n\t\t/**\n\t\t * Defines appearance of wireframe joints.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\t/**\n\t\t * Whether the material is rendered with flat shading or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.flatShading = false;\n\n\t\t/**\n\t\t * Whether the material is affected by fog or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.defines = { 'STANDARD': '' };\n\n\t\tthis.color.copy( source.color );\n\t\tthis.roughness = source.roughness;\n\t\tthis.metalness = source.metalness;\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.roughnessMap = source.roughnessMap;\n\n\t\tthis.metalnessMap = source.metalnessMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.envMapRotation.copy( source.envMapRotation );\n\t\tthis.envMapIntensity = source.envMapIntensity;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.flatShading = source.flatShading;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * An extension of the {@link MeshStandardMaterial}, providing more advanced\n * physically-based rendering properties:\n *\n * - Anisotropy: Ability to represent the anisotropic property of materials\n * as observable with brushed metals.\n * - Clearcoat: Some materials — like car paints, carbon fiber, and wet surfaces — require\n * a clear, reflective layer on top of another layer that may be irregular or rough.\n * Clearcoat approximates this effect, without the need for a separate transparent surface.\n * - Iridescence: Allows to render the effect where hue varies  depending on the viewing\n * angle and illumination angle. This can be seen on soap bubbles, oil films, or on the\n * wings of many insects.\n * - Physically-based transparency: One limitation of {@link Material#opacity} is that highly\n * transparent materials are less reflective. Physically-based transmission provides a more\n * realistic option for thin, transparent surfaces like glass.\n * - Advanced reflectivity: More flexible reflectivity for non-metallic materials.\n * - Sheen: Can be used for representing cloth and fabric materials.\n *\n * As a result of these complex shading features, `MeshPhysicalMaterial` has a\n * higher performance cost, per pixel, than other three.js materials. Most\n * effects are disabled by default, and add cost as they are enabled. For\n * best results, always specify an environment map when using this material.\n *\n * @augments MeshStandardMaterial\n * @demo scenes/material-browser.html#MeshPhysicalMaterial\n */\nclass MeshPhysicalMaterial extends MeshStandardMaterial {\n\n\t/**\n\t * Constructs a new mesh physical material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshPhysicalMaterial = true;\n\n\t\tthis.defines = {\n\n\t\t\t'STANDARD': '',\n\t\t\t'PHYSICAL': ''\n\n\t\t};\n\n\t\tthis.type = 'MeshPhysicalMaterial';\n\n\t\t/**\n\t\t * The rotation of the anisotropy in tangent, bitangent space, measured in radians\n\t\t * counter-clockwise from the tangent. When `anisotropyMap` is present, this\n\t\t * property provides additional rotation to the vectors in the texture.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.anisotropyRotation = 0;\n\n\t\t/**\n\t\t * Red and green channels represent the anisotropy direction in `[-1, 1]` tangent,\n\t\t * bitangent space, to be rotated by `anisotropyRotation`. The blue channel\n\t\t * contains strength as `[0, 1]` to be multiplied by `anisotropy`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.anisotropyMap = null;\n\n\t\t/**\n\t\t * The red channel of this texture is multiplied against `clearcoat`,\n\t\t * for per-pixel control over a coating's intensity.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.clearcoatMap = null;\n\n\t\t/**\n\t\t * Roughness of the clear coat layer, from `0.0` to `1.0`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.clearcoatRoughness = 0.0;\n\n\t\t/**\n\t\t * The green channel of this texture is multiplied against\n\t\t * `clearcoatRoughness`, for per-pixel control over a coating's roughness.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.clearcoatRoughnessMap = null;\n\n\t\t/**\n\t\t * How much `clearcoatNormalMap` affects the clear coat layer, from\n\t\t * `(0,0)` to `(1,1)`.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (1,1)\n\t\t */\n\t\tthis.clearcoatNormalScale = new Vector2( 1, 1 );\n\n\t\t/**\n\t\t * Can be used to enable independent normals for the clear coat layer.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.clearcoatNormalMap = null;\n\n\t\t/**\n\t\t * Index-of-refraction for non-metallic materials, from `1.0` to `2.333`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1.5\n\t\t */\n\t\tthis.ior = 1.5;\n\n\t\t/**\n\t\t * Degree of reflectivity, from `0.0` to `1.0`. Default is `0.5`, which\n\t\t * corresponds to an index-of-refraction of `1.5`.\n\t\t *\n\t\t * This models the reflectivity of non-metallic materials. It has no effect\n\t\t * when `metalness` is `1.0`\n\t\t *\n\t\t * @name MeshPhysicalMaterial#reflectivity\n\t\t * @type {number}\n\t\t * @default 0.5\n\t\t */\n\t\tObject.defineProperty( this, 'reflectivity', {\n\t\t\tget: function () {\n\n\t\t\t\treturn ( clamp( 2.5 * ( this.ior - 1 ) / ( this.ior + 1 ), 0, 1 ) );\n\n\t\t\t},\n\t\t\tset: function ( reflectivity ) {\n\n\t\t\t\tthis.ior = ( 1 + 0.4 * reflectivity ) / ( 1 - 0.4 * reflectivity );\n\n\t\t\t}\n\t\t} );\n\n\t\t/**\n\t\t * The red channel of this texture is multiplied against `iridescence`, for per-pixel\n\t\t * control over iridescence.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.iridescenceMap = null;\n\n\t\t/**\n\t\t * Strength of the iridescence RGB color shift effect, represented by an index-of-refraction.\n\t\t * Between `1.0` to `2.333`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1.3\n\t\t */\n\t\tthis.iridescenceIOR = 1.3;\n\n\t\t/**\n\t\t *Array of exactly 2 elements, specifying minimum and maximum thickness of the iridescence layer.\n\t\t Thickness of iridescence layer has an equivalent effect of the one `thickness` has on `ior`.\n\t\t *\n\t\t * @type {Array<number,number>}\n\t\t * @default [100,400]\n\t\t */\n\t\tthis.iridescenceThicknessRange = [ 100, 400 ];\n\n\t\t/**\n\t\t * A texture that defines the thickness of the iridescence layer, stored in the green channel.\n\t\t * Minimum and maximum values of thickness are defined by `iridescenceThicknessRange` array:\n\t\t * - `0.0` in the green channel will result in thickness equal to first element of the array.\n\t\t * - `1.0` in the green channel will result in thickness equal to second element of the array.\n\t\t * - Values in-between will linearly interpolate between the elements of the array.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.iridescenceThicknessMap = null;\n\n\t\t/**\n\t\t * The sheen tint.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.sheenColor = new Color( 0x000000 );\n\n\t\t/**\n\t\t * The RGB channels of this texture are multiplied against  `sheenColor`, for per-pixel control\n\t\t * over sheen tint.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.sheenColorMap = null;\n\n\t\t/**\n\t\t * Roughness of the sheen layer, from `0.0` to `1.0`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.sheenRoughness = 1.0;\n\n\t\t/**\n\t\t * The alpha channel of this texture is multiplied against `sheenRoughness`, for per-pixel control\n\t\t * over sheen roughness.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.sheenRoughnessMap = null;\n\n\t\t/**\n\t\t * The red channel of this texture is multiplied against `transmission`, for per-pixel control over\n\t\t * optical transparency.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.transmissionMap = null;\n\n\t\t/**\n\t\t * The thickness of the volume beneath the surface. The value is given in the\n\t\t * coordinate space of the mesh. If the value is `0` the material is\n\t\t * thin-walled. Otherwise the material is a volume boundary.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.thickness = 0;\n\n\t\t/**\n\t\t * A texture that defines the thickness, stored in the green channel. This will\n\t\t * be multiplied by `thickness`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.thicknessMap = null;\n\n\t\t/**\n\t\t * Density of the medium given as the average distance that light travels in\n\t\t * the medium before interacting with a particle. The value is given in world\n\t\t * space units, and must be greater than zero.\n\t\t *\n\t\t * @type {number}\n\t\t * @default Infinity\n\t\t */\n\t\tthis.attenuationDistance = Infinity;\n\n\t\t/**\n\t\t * The color that white light turns into due to absorption when reaching the\n\t\t * attenuation distance.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.attenuationColor = new Color( 1, 1, 1 );\n\n\t\t/**\n\t\t * A float that scales the amount of specular reflection for non-metals only.\n\t\t * When set to zero, the model is effectively Lambertian. From `0.0` to `1.0`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.specularIntensity = 1.0;\n\n\t\t/**\n\t\t * The alpha channel of this texture is multiplied against `specularIntensity`,\n\t\t * for per-pixel control over specular intensity.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.specularIntensityMap = null;\n\n\t\t/**\n\t\t * Tints the specular reflection at normal incidence for non-metals only.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.specularColor = new Color( 1, 1, 1 );\n\n\t\t/**\n\t\t * The RGB channels of this texture are multiplied against `specularColor`,\n\t\t * for per-pixel control over specular color.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.specularColorMap = null;\n\n\t\tthis._anisotropy = 0;\n\t\tthis._clearcoat = 0;\n\t\tthis._dispersion = 0;\n\t\tthis._iridescence = 0;\n\t\tthis._sheen = 0.0;\n\t\tthis._transmission = 0;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\t/**\n\t * The anisotropy strength, from `0.0` to `1.0`.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget anisotropy() {\n\n\t\treturn this._anisotropy;\n\n\t}\n\n\tset anisotropy( value ) {\n\n\t\tif ( this._anisotropy > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._anisotropy = value;\n\n\t}\n\n\t/**\n\t * Represents the intensity of the clear coat layer, from `0.0` to `1.0`. Use\n\t * clear coat related properties to enable multilayer materials that have a\n\t * thin translucent layer over the base layer.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget clearcoat() {\n\n\t\treturn this._clearcoat;\n\n\t}\n\n\tset clearcoat( value ) {\n\n\t\tif ( this._clearcoat > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._clearcoat = value;\n\n\t}\n\t/**\n\t * The intensity of the iridescence layer, simulating RGB color shift based on the angle between\n\t * the surface and the viewer, from `0.0` to `1.0`.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget iridescence() {\n\n\t\treturn this._iridescence;\n\n\t}\n\n\tset iridescence( value ) {\n\n\t\tif ( this._iridescence > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._iridescence = value;\n\n\t}\n\n\t/**\n\t * Defines the strength of the angular separation of colors (chromatic aberration) transmitting\n\t * through a relatively clear volume. Any value zero or larger is valid, the typical range of\n\t * realistic values is `[0, 1]`. This property can be only be used with transmissive objects.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget dispersion() {\n\n\t\treturn this._dispersion;\n\n\t}\n\n\tset dispersion( value ) {\n\n\t\tif ( this._dispersion > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._dispersion = value;\n\n\t}\n\n\t/**\n\t * The intensity of the sheen layer, from `0.0` to `1.0`.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget sheen() {\n\n\t\treturn this._sheen;\n\n\t}\n\n\tset sheen( value ) {\n\n\t\tif ( this._sheen > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._sheen = value;\n\n\t}\n\n\t/**\n\t * Degree of transmission (or optical transparency), from `0.0` to `1.0`.\n\t *\n\t * Thin, transparent or semitransparent, plastic or glass materials remain\n\t * largely reflective even if they are fully transmissive. The transmission\n\t * property can be used to model these materials.\n\t *\n\t * When transmission is non-zero, `opacity` should be  set to `1`.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget transmission() {\n\n\t\treturn this._transmission;\n\n\t}\n\n\tset transmission( value ) {\n\n\t\tif ( this._transmission > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._transmission = value;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.defines = {\n\n\t\t\t'STANDARD': '',\n\t\t\t'PHYSICAL': ''\n\n\t\t};\n\n\t\tthis.anisotropy = source.anisotropy;\n\t\tthis.anisotropyRotation = source.anisotropyRotation;\n\t\tthis.anisotropyMap = source.anisotropyMap;\n\n\t\tthis.clearcoat = source.clearcoat;\n\t\tthis.clearcoatMap = source.clearcoatMap;\n\t\tthis.clearcoatRoughness = source.clearcoatRoughness;\n\t\tthis.clearcoatRoughnessMap = source.clearcoatRoughnessMap;\n\t\tthis.clearcoatNormalMap = source.clearcoatNormalMap;\n\t\tthis.clearcoatNormalScale.copy( source.clearcoatNormalScale );\n\n\t\tthis.dispersion = source.dispersion;\n\t\tthis.ior = source.ior;\n\n\t\tthis.iridescence = source.iridescence;\n\t\tthis.iridescenceMap = source.iridescenceMap;\n\t\tthis.iridescenceIOR = source.iridescenceIOR;\n\t\tthis.iridescenceThicknessRange = [ ...source.iridescenceThicknessRange ];\n\t\tthis.iridescenceThicknessMap = source.iridescenceThicknessMap;\n\n\t\tthis.sheen = source.sheen;\n\t\tthis.sheenColor.copy( source.sheenColor );\n\t\tthis.sheenColorMap = source.sheenColorMap;\n\t\tthis.sheenRoughness = source.sheenRoughness;\n\t\tthis.sheenRoughnessMap = source.sheenRoughnessMap;\n\n\t\tthis.transmission = source.transmission;\n\t\tthis.transmissionMap = source.transmissionMap;\n\n\t\tthis.thickness = source.thickness;\n\t\tthis.thicknessMap = source.thicknessMap;\n\t\tthis.attenuationDistance = source.attenuationDistance;\n\t\tthis.attenuationColor.copy( source.attenuationColor );\n\n\t\tthis.specularIntensity = source.specularIntensity;\n\t\tthis.specularIntensityMap = source.specularIntensityMap;\n\t\tthis.specularColor.copy( source.specularColor );\n\t\tthis.specularColorMap = source.specularColorMap;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A material for shiny surfaces with specular highlights.\n *\n * The material uses a non-physically based [Blinn-Phong](https://en.wikipedia.org/wiki/Blinn-Phong_shading_model)\n * model for calculating reflectance. Unlike the Lambertian model used in the\n * {@link MeshLambertMaterial} this can simulate shiny surfaces with specular\n * highlights (such as varnished wood). `MeshPhongMaterial` uses per-fragment shading.\n *\n * Performance will generally be greater when using this material over the\n * {@link MeshStandardMaterial} or {@link MeshPhysicalMaterial}, at the cost of\n * some graphical accuracy.\n *\n * @augments Material\n * @demo scenes/material-browser.html#MeshPhongMaterial\n */\nclass MeshPhongMaterial extends Material {\n\n\t/**\n\t * Constructs a new mesh phong material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshPhongMaterial = true;\n\n\t\tthis.type = 'MeshPhongMaterial';\n\n\t\t/**\n\t\t * Color of the material.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\n\t\t/**\n\t\t * Specular color of the material. The default color is set to `0x111111` (very dark grey)\n\t\t *\n\t\t * This defines how shiny the material is and the color of its shine.\n\t\t *\n\t\t * @type {Color}\n\t\t */\n\t\tthis.specular = new Color( 0x111111 );\n\n\t\t/**\n\t\t * How shiny the specular highlight is; a higher value gives a sharper highlight.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 30\n\t\t */\n\t\tthis.shininess = 30;\n\n\t\t/**\n\t\t * The color map. May optionally include an alpha channel, typically combined\n\t\t * with {@link Material#transparent} or {@link Material#alphaTest}. The texture map\n\t\t * color is modulated by the diffuse `color`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * The light map. Requires a second set of UVs.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.lightMap = null;\n\n\t\t/**\n\t\t * Intensity of the baked light.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\t/**\n\t\t * The red channel of this texture is used as the ambient occlusion map.\n\t\t * Requires a second set of UVs.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.aoMap = null;\n\n\t\t/**\n\t\t * Intensity of the ambient occlusion effect. Range is `[0,1]`, where `0`\n\t\t * disables ambient occlusion. Where intensity is `1` and the AO map's\n\t\t * red channel is also `1`, ambient light is fully occluded on a surface.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\t/**\n\t\t * Emissive (light) color of the material, essentially a solid color\n\t\t * unaffected by other lighting.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.emissive = new Color( 0x000000 );\n\n\t\t/**\n\t\t * Intensity of the emissive light. Modulates the emissive color.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.emissiveIntensity = 1.0;\n\n\t\t/**\n\t\t * Set emissive (glow) map. The emissive map color is modulated by the\n\t\t * emissive color and the emissive intensity. If you have an emissive map,\n\t\t * be sure to set the emissive color to something other than black.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.emissiveMap = null;\n\n\t\t/**\n\t\t * The texture to create a bump map. The black and white values map to the\n\t\t * perceived depth in relation to the lights. Bump doesn't actually affect\n\t\t * the geometry of the object, only the lighting. If a normal map is defined\n\t\t * this will be ignored.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.bumpMap = null;\n\n\t\t/**\n\t\t * How much the bump map affects the material. Typical range is `[0,1]`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.bumpScale = 1;\n\n\t\t/**\n\t\t * The texture to create a normal map. The RGB values affect the surface\n\t\t * normal for each pixel fragment and change the way the color is lit. Normal\n\t\t * maps do not change the actual shape of the surface, only the lighting. In\n\t\t * case the material has a normal map authored using the left handed\n\t\t * convention, the `y` component of `normalScale` should be negated to compensate\n\t\t * for the different handedness.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.normalMap = null;\n\n\t\t/**\n\t\t * The type of normal map.\n\t\t *\n\t\t * @type {(TangentSpaceNormalMap|ObjectSpaceNormalMap)}\n\t\t * @default TangentSpaceNormalMap\n\t\t */\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\n\t\t/**\n\t\t * How much the normal map affects the material. Typical value range is `[0,1]`.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (1,1)\n\t\t */\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\t/**\n\t\t * The displacement map affects the position of the mesh's vertices. Unlike\n\t\t * other maps which only affect the light and shade of the material the\n\t\t * displaced vertices can cast shadows, block other objects, and otherwise\n\t\t * act as real geometry. The displacement texture is an image where the value\n\t\t * of each pixel (white being the highest) is mapped against, and\n\t\t * repositions, the vertices of the mesh.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.displacementMap = null;\n\n\t\t/**\n\t\t * How much the displacement map affects the mesh (where black is no\n\t\t * displacement, and white is maximum displacement). Without a displacement\n\t\t * map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementScale = 1;\n\n\t\t/**\n\t\t * The offset of the displacement map's values on the mesh's vertices.\n\t\t * The bias is added to the scaled sample of the displacement map.\n\t\t * Without a displacement map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementBias = 0;\n\n\t\t/**\n\t\t * The specular map value affects both how much the specular surface\n\t\t * highlight contributes and how much of the environment map affects the\n\t\t * surface.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.specularMap = null;\n\n\t\t/**\n\t\t * The alpha map is a grayscale texture that controls the opacity across the\n\t\t * surface (black: fully transparent; white: fully opaque).\n\t\t *\n\t\t * Only the color of the texture is used, ignoring the alpha channel if one\n\t\t * exists. For RGB and RGBA textures, the renderer will use the green channel\n\t\t * when sampling this texture due to the extra bit of precision provided for\n\t\t * green in DXT-compressed and uncompressed RGB 565 formats. Luminance-only and\n\t\t * luminance/alpha textures will also still work as expected.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.alphaMap = null;\n\n\t\t/**\n\t\t * The environment map.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.envMap = null;\n\n\t\t/**\n\t\t * The rotation of the environment map in radians.\n\t\t *\n\t\t * @type {Euler}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.envMapRotation = new Euler();\n\n\t\t/**\n\t\t * How to combine the result of the surface's color with the environment map, if any.\n\t\t *\n\t\t * When set to `MixOperation`, the {@link MeshBasicMaterial#reflectivity} is used to\n\t\t * blend between the two colors.\n\t\t *\n\t\t * @type {(MultiplyOperation|MixOperation|AddOperation)}\n\t\t * @default MultiplyOperation\n\t\t */\n\t\tthis.combine = MultiplyOperation;\n\n\t\t/**\n\t\t * How much the environment map affects the surface.\n\t\t * The valid range is between `0` (no reflections) and `1` (full reflections).\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.reflectivity = 1;\n\n\t\t/**\n\t\t * The index of refraction (IOR) of air (approximately 1) divided by the\n\t\t * index of refraction of the material. It is used with environment mapping\n\t\t * modes {@link CubeRefractionMapping} and {@link EquirectangularRefractionMapping}.\n\t\t * The refraction ratio should not exceed `1`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.98\n\t\t */\n\t\tthis.refractionRatio = 0.98;\n\n\t\t/**\n\t\t * Renders the geometry as a wireframe.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.wireframe = false;\n\n\t\t/**\n\t\t * Controls the thickness of the wireframe.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.wireframeLinewidth = 1;\n\n\t\t/**\n\t\t * Defines appearance of wireframe ends.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.wireframeLinecap = 'round';\n\n\t\t/**\n\t\t * Defines appearance of wireframe joints.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\t/**\n\t\t * Whether the material is rendered with flat shading or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.flatShading = false;\n\n\t\t/**\n\t\t * Whether the material is affected by fog or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\t\tthis.specular.copy( source.specular );\n\t\tthis.shininess = source.shininess;\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.specularMap = source.specularMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.envMapRotation.copy( source.envMapRotation );\n\t\tthis.combine = source.combine;\n\t\tthis.reflectivity = source.reflectivity;\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.flatShading = source.flatShading;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A material implementing toon shading.\n *\n * @augments Material\n * @demo scenes/material-browser.html#MeshToonMaterial\n */\nclass MeshToonMaterial extends Material {\n\n\t/**\n\t * Constructs a new mesh toon material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshToonMaterial = true;\n\n\t\tthis.defines = { 'TOON': '' };\n\n\t\tthis.type = 'MeshToonMaterial';\n\n\t\t/**\n\t\t * Color of the material.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.color = new Color( 0xffffff );\n\n\t\t/**\n\t\t * The color map. May optionally include an alpha channel, typically combined\n\t\t * with {@link Material#transparent} or {@link Material#alphaTest}. The texture map\n\t\t * color is modulated by the diffuse `color`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * Gradient map for toon shading. It's required to set\n\t\t * {@link Texture#minFilter} and {@link Texture#magFilter} to {@linkNearestFilter}\n\t\t * when using this type of texture.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.gradientMap = null;\n\n\t\t/**\n\t\t * The light map. Requires a second set of UVs.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.lightMap = null;\n\n\t\t/**\n\t\t * Intensity of the baked light.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\t/**\n\t\t * The red channel of this texture is used as the ambient occlusion map.\n\t\t * Requires a second set of UVs.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.aoMap = null;\n\n\t\t/**\n\t\t * Intensity of the ambient occlusion effect. Range is `[0,1]`, where `0`\n\t\t * disables ambient occlusion. Where intensity is `1` and the AO map's\n\t\t * red channel is also `1`, ambient light is fully occluded on a surface.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\t/**\n\t\t * Emissive (light) color of the material, essentially a solid color\n\t\t * unaffected by other lighting.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.emissive = new Color( 0x000000 );\n\n\t\t/**\n\t\t * Intensity of the emissive light. Modulates the emissive color.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.emissiveIntensity = 1.0;\n\n\t\t/**\n\t\t * Set emissive (glow) map. The emissive map color is modulated by the\n\t\t * emissive color and the emissive intensity. If you have an emissive map,\n\t\t * be sure to set the emissive color to something other than black.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.emissiveMap = null;\n\n\t\t/**\n\t\t * The texture to create a bump map. The black and white values map to the\n\t\t * perceived depth in relation to the lights. Bump doesn't actually affect\n\t\t * the geometry of the object, only the lighting. If a normal map is defined\n\t\t * this will be ignored.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.bumpMap = null;\n\n\t\t/**\n\t\t * How much the bump map affects the material. Typical range is `[0,1]`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.bumpScale = 1;\n\n\t\t/**\n\t\t * The texture to create a normal map. The RGB values affect the surface\n\t\t * normal for each pixel fragment and change the way the color is lit. Normal\n\t\t * maps do not change the actual shape of the surface, only the lighting. In\n\t\t * case the material has a normal map authored using the left handed\n\t\t * convention, the `y` component of `normalScale` should be negated to compensate\n\t\t * for the different handedness.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.normalMap = null;\n\n\t\t/**\n\t\t * The type of normal map.\n\t\t *\n\t\t * @type {(TangentSpaceNormalMap|ObjectSpaceNormalMap)}\n\t\t * @default TangentSpaceNormalMap\n\t\t */\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\n\t\t/**\n\t\t * How much the normal map affects the material. Typical value range is `[0,1]`.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (1,1)\n\t\t */\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\t/**\n\t\t * The displacement map affects the position of the mesh's vertices. Unlike\n\t\t * other maps which only affect the light and shade of the material the\n\t\t * displaced vertices can cast shadows, block other objects, and otherwise\n\t\t * act as real geometry. The displacement texture is an image where the value\n\t\t * of each pixel (white being the highest) is mapped against, and\n\t\t * repositions, the vertices of the mesh.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.displacementMap = null;\n\n\t\t/**\n\t\t * How much the displacement map affects the mesh (where black is no\n\t\t * displacement, and white is maximum displacement). Without a displacement\n\t\t * map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementScale = 1;\n\n\t\t/**\n\t\t * The offset of the displacement map's values on the mesh's vertices.\n\t\t * The bias is added to the scaled sample of the displacement map.\n\t\t * Without a displacement map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementBias = 0;\n\n\t\t/**\n\t\t * The alpha map is a grayscale texture that controls the opacity across the\n\t\t * surface (black: fully transparent; white: fully opaque).\n\t\t *\n\t\t * Only the color of the texture is used, ignoring the alpha channel if one\n\t\t * exists. For RGB and RGBA textures, the renderer will use the green channel\n\t\t * when sampling this texture due to the extra bit of precision provided for\n\t\t * green in DXT-compressed and uncompressed RGB 565 formats. Luminance-only and\n\t\t * luminance/alpha textures will also still work as expected.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.alphaMap = null;\n\n\t\t/**\n\t\t * Renders the geometry as a wireframe.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.wireframe = false;\n\n\t\t/**\n\t\t * Controls the thickness of the wireframe.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.wireframeLinewidth = 1;\n\n\t\t/**\n\t\t * Defines appearance of wireframe ends.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.wireframeLinecap = 'round';\n\n\t\t/**\n\t\t * Defines appearance of wireframe joints.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\t/**\n\t\t * Whether the material is affected by fog or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\t\tthis.gradientMap = source.gradientMap;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A material that maps the normal vectors to RGB colors.\n *\n * @augments Material\n * @demo scenes/material-browser.html#MeshNormalMaterial\n */\nclass MeshNormalMaterial extends Material {\n\n\t/**\n\t * Constructs a new mesh normal material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshNormalMaterial = true;\n\n\t\tthis.type = 'MeshNormalMaterial';\n\n\t\t/**\n\t\t * The texture to create a bump map. The black and white values map to the\n\t\t * perceived depth in relation to the lights. Bump doesn't actually affect\n\t\t * the geometry of the object, only the lighting. If a normal map is defined\n\t\t * this will be ignored.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.bumpMap = null;\n\n\t\t/**\n\t\t * How much the bump map affects the material. Typical range is `[0,1]`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.bumpScale = 1;\n\n\t\t/**\n\t\t * The texture to create a normal map. The RGB values affect the surface\n\t\t * normal for each pixel fragment and change the way the color is lit. Normal\n\t\t * maps do not change the actual shape of the surface, only the lighting. In\n\t\t * case the material has a normal map authored using the left handed\n\t\t * convention, the `y` component of `normalScale` should be negated to compensate\n\t\t * for the different handedness.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.normalMap = null;\n\n\t\t/**\n\t\t * The type of normal map.\n\t\t *\n\t\t * @type {(TangentSpaceNormalMap|ObjectSpaceNormalMap)}\n\t\t * @default TangentSpaceNormalMap\n\t\t */\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\n\t\t/**\n\t\t * How much the normal map affects the material. Typical value range is `[0,1]`.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (1,1)\n\t\t */\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\t/**\n\t\t * The displacement map affects the position of the mesh's vertices. Unlike\n\t\t * other maps which only affect the light and shade of the material the\n\t\t * displaced vertices can cast shadows, block other objects, and otherwise\n\t\t * act as real geometry. The displacement texture is an image where the value\n\t\t * of each pixel (white being the highest) is mapped against, and\n\t\t * repositions, the vertices of the mesh.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.displacementMap = null;\n\n\t\t/**\n\t\t * How much the displacement map affects the mesh (where black is no\n\t\t * displacement, and white is maximum displacement). Without a displacement\n\t\t * map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementScale = 1;\n\n\t\t/**\n\t\t * The offset of the displacement map's values on the mesh's vertices.\n\t\t * The bias is added to the scaled sample of the displacement map.\n\t\t * Without a displacement map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementBias = 0;\n\n\t\t/**\n\t\t * Renders the geometry as a wireframe.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.wireframe = false;\n\n\t\t/**\n\t\t * Controls the thickness of the wireframe.\n\t\t *\n\t\t * WebGL and WebGPU ignore this property and always render\n\t\t * 1 pixel wide lines.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.wireframeLinewidth = 1;\n\n\t\t/**\n\t\t * Whether the material is rendered with flat shading or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.flatShading = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\tthis.flatShading = source.flatShading;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A material for non-shiny surfaces, without specular highlights.\n *\n * The material uses a non-physically based [Lambertian](https://en.wikipedia.org/wiki/Lambertian_reflectance)\n * model for calculating reflectance. This can simulate some surfaces (such\n * as untreated wood or stone) well, but cannot simulate shiny surfaces with\n * specular highlights (such as varnished wood). `MeshLambertMaterial` uses per-fragment\n * shading.\n *\n * Due to the simplicity of the reflectance and illumination models,\n * performance will be greater when using this material over the\n * {@link MeshPhongMaterial}, {@link MeshStandardMaterial} or\n * {@link MeshPhysicalMaterial}, at the cost of some graphical accuracy.\n *\n * @augments Material\n * @demo scenes/material-browser.html#MeshLambertMaterial\n */\nclass MeshLambertMaterial extends Material {\n\n\t/**\n\t * Constructs a new mesh lambert material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshLambertMaterial = true;\n\n\t\tthis.type = 'MeshLambertMaterial';\n\n\t\t/**\n\t\t * Color of the material.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\n\t\t/**\n\t\t * The color map. May optionally include an alpha channel, typically combined\n\t\t * with {@link Material#transparent} or {@link Material#alphaTest}. The texture map\n\t\t * color is modulated by the diffuse `color`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * The light map. Requires a second set of UVs.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.lightMap = null;\n\n\t\t/**\n\t\t * Intensity of the baked light.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\t/**\n\t\t * The red channel of this texture is used as the ambient occlusion map.\n\t\t * Requires a second set of UVs.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.aoMap = null;\n\n\t\t/**\n\t\t * Intensity of the ambient occlusion effect. Range is `[0,1]`, where `0`\n\t\t * disables ambient occlusion. Where intensity is `1` and the AO map's\n\t\t * red channel is also `1`, ambient light is fully occluded on a surface.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\t/**\n\t\t * Emissive (light) color of the material, essentially a solid color\n\t\t * unaffected by other lighting.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.emissive = new Color( 0x000000 );\n\n\t\t/**\n\t\t * Intensity of the emissive light. Modulates the emissive color.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.emissiveIntensity = 1.0;\n\n\t\t/**\n\t\t * Set emissive (glow) map. The emissive map color is modulated by the\n\t\t * emissive color and the emissive intensity. If you have an emissive map,\n\t\t * be sure to set the emissive color to something other than black.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.emissiveMap = null;\n\n\t\t/**\n\t\t * The texture to create a bump map. The black and white values map to the\n\t\t * perceived depth in relation to the lights. Bump doesn't actually affect\n\t\t * the geometry of the object, only the lighting. If a normal map is defined\n\t\t * this will be ignored.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.bumpMap = null;\n\n\t\t/**\n\t\t * How much the bump map affects the material. Typical range is `[0,1]`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.bumpScale = 1;\n\n\t\t/**\n\t\t * The texture to create a normal map. The RGB values affect the surface\n\t\t * normal for each pixel fragment and change the way the color is lit. Normal\n\t\t * maps do not change the actual shape of the surface, only the lighting. In\n\t\t * case the material has a normal map authored using the left handed\n\t\t * convention, the `y` component of `normalScale` should be negated to compensate\n\t\t * for the different handedness.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.normalMap = null;\n\n\t\t/**\n\t\t * The type of normal map.\n\t\t *\n\t\t * @type {(TangentSpaceNormalMap|ObjectSpaceNormalMap)}\n\t\t * @default TangentSpaceNormalMap\n\t\t */\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\n\t\t/**\n\t\t * How much the normal map affects the material. Typical value range is `[0,1]`.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (1,1)\n\t\t */\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\t/**\n\t\t * The displacement map affects the position of the mesh's vertices. Unlike\n\t\t * other maps which only affect the light and shade of the material the\n\t\t * displaced vertices can cast shadows, block other objects, and otherwise\n\t\t * act as real geometry. The displacement texture is an image where the value\n\t\t * of each pixel (white being the highest) is mapped against, and\n\t\t * repositions, the vertices of the mesh.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.displacementMap = null;\n\n\t\t/**\n\t\t * How much the displacement map affects the mesh (where black is no\n\t\t * displacement, and white is maximum displacement). Without a displacement\n\t\t * map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementScale = 1;\n\n\t\t/**\n\t\t * The offset of the displacement map's values on the mesh's vertices.\n\t\t * The bias is added to the scaled sample of the displacement map.\n\t\t * Without a displacement map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementBias = 0;\n\n\t\t/**\n\t\t * Specular map used by the material.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.specularMap = null;\n\n\t\t/**\n\t\t * The alpha map is a grayscale texture that controls the opacity across the\n\t\t * surface (black: fully transparent; white: fully opaque).\n\t\t *\n\t\t * Only the color of the texture is used, ignoring the alpha channel if one\n\t\t * exists. For RGB and RGBA textures, the renderer will use the green channel\n\t\t * when sampling this texture due to the extra bit of precision provided for\n\t\t * green in DXT-compressed and uncompressed RGB 565 formats. Luminance-only and\n\t\t * luminance/alpha textures will also still work as expected.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.alphaMap = null;\n\n\t\t/**\n\t\t * The environment map.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.envMap = null;\n\n\t\t/**\n\t\t * The rotation of the environment map in radians.\n\t\t *\n\t\t * @type {Euler}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.envMapRotation = new Euler();\n\n\t\t/**\n\t\t * How to combine the result of the surface's color with the environment map, if any.\n\t\t *\n\t\t * When set to `MixOperation`, the {@link MeshBasicMaterial#reflectivity} is used to\n\t\t * blend between the two colors.\n\t\t *\n\t\t * @type {(MultiplyOperation|MixOperation|AddOperation)}\n\t\t * @default MultiplyOperation\n\t\t */\n\t\tthis.combine = MultiplyOperation;\n\n\t\t/**\n\t\t * How much the environment map affects the surface.\n\t\t * The valid range is between `0` (no reflections) and `1` (full reflections).\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.reflectivity = 1;\n\n\t\t/**\n\t\t * The index of refraction (IOR) of air (approximately 1) divided by the\n\t\t * index of refraction of the material. It is used with environment mapping\n\t\t * modes {@link CubeRefractionMapping} and {@link EquirectangularRefractionMapping}.\n\t\t * The refraction ratio should not exceed `1`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.98\n\t\t */\n\t\tthis.refractionRatio = 0.98;\n\n\t\t/**\n\t\t * Renders the geometry as a wireframe.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.wireframe = false;\n\n\t\t/**\n\t\t * Controls the thickness of the wireframe.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.wireframeLinewidth = 1;\n\n\t\t/**\n\t\t * Defines appearance of wireframe ends.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.wireframeLinecap = 'round';\n\n\t\t/**\n\t\t * Defines appearance of wireframe joints.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\t/**\n\t\t * Whether the material is rendered with flat shading or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.flatShading = false;\n\n\t\t/**\n\t\t * Whether the material is affected by fog or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.specularMap = source.specularMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.envMapRotation.copy( source.envMapRotation );\n\t\tthis.combine = source.combine;\n\t\tthis.reflectivity = source.reflectivity;\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.flatShading = source.flatShading;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A material for drawing geometry by depth. Depth is based off of the camera\n * near and far plane. White is nearest, black is farthest.\n *\n * @augments Material\n * @demo scenes/material-browser.html#MeshDepthMaterial\n */\nclass MeshDepthMaterial extends Material {\n\n\t/**\n\t * Constructs a new mesh depth material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshDepthMaterial = true;\n\n\t\tthis.type = 'MeshDepthMaterial';\n\n\t\t/**\n\t\t * Type for depth packing.\n\t\t *\n\t\t * @type {(BasicDepthPacking|RGBADepthPacking|RGBDepthPacking|RGDepthPacking)}\n\t\t * @default BasicDepthPacking\n\t\t */\n\t\tthis.depthPacking = BasicDepthPacking;\n\n\t\t/**\n\t\t * The color map. May optionally include an alpha channel, typically combined\n\t\t * with {@link Material#transparent} or {@link Material#alphaTest}.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * The alpha map is a grayscale texture that controls the opacity across the\n\t\t * surface (black: fully transparent; white: fully opaque).\n\t\t *\n\t\t * Only the color of the texture is used, ignoring the alpha channel if one\n\t\t * exists. For RGB and RGBA textures, the renderer will use the green channel\n\t\t * when sampling this texture due to the extra bit of precision provided for\n\t\t * green in DXT-compressed and uncompressed RGB 565 formats. Luminance-only and\n\t\t * luminance/alpha textures will also still work as expected.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.alphaMap = null;\n\n\t\t/**\n\t\t * The displacement map affects the position of the mesh's vertices. Unlike\n\t\t * other maps which only affect the light and shade of the material the\n\t\t * displaced vertices can cast shadows, block other objects, and otherwise\n\t\t * act as real geometry. The displacement texture is an image where the value\n\t\t * of each pixel (white being the highest) is mapped against, and\n\t\t * repositions, the vertices of the mesh.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.displacementMap = null;\n\n\t\t/**\n\t\t * How much the displacement map affects the mesh (where black is no\n\t\t * displacement, and white is maximum displacement). Without a displacement\n\t\t * map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementScale = 1;\n\n\t\t/**\n\t\t * The offset of the displacement map's values on the mesh's vertices.\n\t\t * The bias is added to the scaled sample of the displacement map.\n\t\t * Without a displacement map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementBias = 0;\n\n\t\t/**\n\t\t * Renders the geometry as a wireframe.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.wireframe = false;\n\n\t\t/**\n\t\t * Controls the thickness of the wireframe.\n\t\t *\n\t\t * WebGL and WebGPU ignore this property and always render\n\t\t * 1 pixel wide lines.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.wireframeLinewidth = 1;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.depthPacking = source.depthPacking;\n\n\t\tthis.map = source.map;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A material used internally for implementing shadow mapping with\n * point lights.\n *\n * Can also be used to customize the shadow casting of an object by assigning\n * an instance of `MeshDistanceMaterial` to {@link Object3D#customDistanceMaterial}.\n * The following examples demonstrates this approach in order to ensure\n * transparent parts of objects do not cast shadows.\n *\n * @augments Material\n */\nclass MeshDistanceMaterial extends Material {\n\n\t/**\n\t * Constructs a new mesh distance material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshDistanceMaterial = true;\n\n\t\tthis.type = 'MeshDistanceMaterial';\n\n\t\t/**\n\t\t * The color map. May optionally include an alpha channel, typically combined\n\t\t * with {@link Material#transparent} or {@link Material#alphaTest}.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * The alpha map is a grayscale texture that controls the opacity across the\n\t\t * surface (black: fully transparent; white: fully opaque).\n\t\t *\n\t\t * Only the color of the texture is used, ignoring the alpha channel if one\n\t\t * exists. For RGB and RGBA textures, the renderer will use the green channel\n\t\t * when sampling this texture due to the extra bit of precision provided for\n\t\t * green in DXT-compressed and uncompressed RGB 565 formats. Luminance-only and\n\t\t * luminance/alpha textures will also still work as expected.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.alphaMap = null;\n\n\t\t/**\n\t\t * The displacement map affects the position of the mesh's vertices. Unlike\n\t\t * other maps which only affect the light and shade of the material the\n\t\t * displaced vertices can cast shadows, block other objects, and otherwise\n\t\t * act as real geometry. The displacement texture is an image where the value\n\t\t * of each pixel (white being the highest) is mapped against, and\n\t\t * repositions, the vertices of the mesh.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.displacementMap = null;\n\n\t\t/**\n\t\t * How much the displacement map affects the mesh (where black is no\n\t\t * displacement, and white is maximum displacement). Without a displacement\n\t\t * map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementScale = 1;\n\n\t\t/**\n\t\t * The offset of the displacement map's values on the mesh's vertices.\n\t\t * The bias is added to the scaled sample of the displacement map.\n\t\t * Without a displacement map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementBias = 0;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.map = source.map;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * This material is defined by a MatCap (or Lit Sphere) texture, which encodes the\n * material color and shading.\n *\n * `MeshMatcapMaterial` does not respond to lights since the matcap image file encodes\n * baked lighting. It will cast a shadow onto an object that receives shadows\n * (and shadow clipping works), but it will not self-shadow or receive\n * shadows.\n *\n * @augments Material\n * @demo scenes/material-browser.html#MeshMatcapMaterial\n */\nclass MeshMatcapMaterial extends Material {\n\n\t/**\n\t * Constructs a new mesh matcap material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshMatcapMaterial = true;\n\n\t\tthis.defines = { 'MATCAP': '' };\n\n\t\tthis.type = 'MeshMatcapMaterial';\n\n\t\t/**\n\t\t * Color of the material.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\n\t\t/**\n\t\t * The matcap map.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.matcap = null;\n\n\t\t/**\n\t\t * The color map. May optionally include an alpha channel, typically combined\n\t\t * with {@link Material#transparent} or {@link Material#alphaTest}. The texture map\n\t\t * color is modulated by the diffuse `color`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * The texture to create a bump map. The black and white values map to the\n\t\t * perceived depth in relation to the lights. Bump doesn't actually affect\n\t\t * the geometry of the object, only the lighting. If a normal map is defined\n\t\t * this will be ignored.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.bumpMap = null;\n\n\t\t/**\n\t\t * How much the bump map affects the material. Typical range is `[0,1]`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.bumpScale = 1;\n\n\t\t/**\n\t\t * The texture to create a normal map. The RGB values affect the surface\n\t\t * normal for each pixel fragment and change the way the color is lit. Normal\n\t\t * maps do not change the actual shape of the surface, only the lighting. In\n\t\t * case the material has a normal map authored using the left handed\n\t\t * convention, the `y` component of `normalScale` should be negated to compensate\n\t\t * for the different handedness.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.normalMap = null;\n\n\t\t/**\n\t\t * The type of normal map.\n\t\t *\n\t\t * @type {(TangentSpaceNormalMap|ObjectSpaceNormalMap)}\n\t\t * @default TangentSpaceNormalMap\n\t\t */\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\n\t\t/**\n\t\t * How much the normal map affects the material. Typical value range is `[0,1]`.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (1,1)\n\t\t */\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\t/**\n\t\t * The displacement map affects the position of the mesh's vertices. Unlike\n\t\t * other maps which only affect the light and shade of the material the\n\t\t * displaced vertices can cast shadows, block other objects, and otherwise\n\t\t * act as real geometry. The displacement texture is an image where the value\n\t\t * of each pixel (white being the highest) is mapped against, and\n\t\t * repositions, the vertices of the mesh.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.displacementMap = null;\n\n\t\t/**\n\t\t * How much the displacement map affects the mesh (where black is no\n\t\t * displacement, and white is maximum displacement). Without a displacement\n\t\t * map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementScale = 1;\n\n\t\t/**\n\t\t * The offset of the displacement map's values on the mesh's vertices.\n\t\t * The bias is added to the scaled sample of the displacement map.\n\t\t * Without a displacement map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementBias = 0;\n\n\t\t/**\n\t\t * The alpha map is a grayscale texture that controls the opacity across the\n\t\t * surface (black: fully transparent; white: fully opaque).\n\t\t *\n\t\t * Only the color of the texture is used, ignoring the alpha channel if one\n\t\t * exists. For RGB and RGBA textures, the renderer will use the green channel\n\t\t * when sampling this texture due to the extra bit of precision provided for\n\t\t * green in DXT-compressed and uncompressed RGB 565 formats. Luminance-only and\n\t\t * luminance/alpha textures will also still work as expected.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.alphaMap = null;\n\n\t\t/**\n\t\t * Renders the geometry as a wireframe.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.wireframe = false;\n\n\t\t/**\n\t\t * Controls the thickness of the wireframe.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.wireframeLinewidth = 1;\n\n\t\t/**\n\t\t * Whether the material is rendered with flat shading or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.flatShading = false;\n\n\t\t/**\n\t\t * Whether the material is affected by fog or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.defines = { 'MATCAP': '' };\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.matcap = source.matcap;\n\n\t\tthis.map = source.map;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\tthis.flatShading = source.flatShading;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A material for rendering line primitives.\n *\n * Materials define the appearance of renderable 3D objects.\n *\n * ```js\n * const material = new THREE.LineDashedMaterial( {\n * \tcolor: 0xffffff,\n * \tscale: 1,\n * \tdashSize: 3,\n * \tgapSize: 1,\n * } );\n * ```\n *\n * @augments LineBasicMaterial\n */\nclass LineDashedMaterial extends LineBasicMaterial {\n\n\t/**\n\t * Constructs a new line dashed material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLineDashedMaterial = true;\n\t\tthis.type = 'LineDashedMaterial';\n\n\t\t/**\n\t\t * The scale of the dashed part of a line.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.scale = 1;\n\n\t\t/**\n\t\t * The size of the dash. This is both the gap with the stroke.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 3\n\t\t */\n\t\tthis.dashSize = 3;\n\n\t\t/**\n\t\t * The size of the gap.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.gapSize = 1;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.scale = source.scale;\n\t\tthis.dashSize = source.dashSize;\n\t\tthis.gapSize = source.gapSize;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * Converts an array to a specific type.\n *\n * @param {TypedArray|Array} array - The array to convert.\n * @param {TypedArray.constructor} type - The constructor of a typed array that defines the new type.\n * @return {TypedArray} The converted array.\n */\nfunction convertArray( array, type ) {\n\n\tif ( ! array || array.constructor === type ) return array;\n\n\tif ( typeof type.BYTES_PER_ELEMENT === 'number' ) {\n\n\t\treturn new type( array ); // create typed array\n\n\t}\n\n\treturn Array.prototype.slice.call( array ); // create Array\n\n}\n\n/**\n * Returns `true` if the given object is a typed array.\n *\n * @param {any} object - The object to check.\n * @return {boolean} Whether the given object is a typed array.\n */\nfunction isTypedArray( object ) {\n\n\treturn ArrayBuffer.isView( object ) && ! ( object instanceof DataView );\n\n}\n\n/**\n * Returns an array by which times and values can be sorted.\n *\n * @param {Array<number>} times - The keyframe time values.\n * @return {Array<number>} The array.\n */\nfunction getKeyframeOrder( times ) {\n\n\tfunction compareTime( i, j ) {\n\n\t\treturn times[ i ] - times[ j ];\n\n\t}\n\n\tconst n = times.length;\n\tconst result = new Array( n );\n\tfor ( let i = 0; i !== n; ++ i ) result[ i ] = i;\n\n\tresult.sort( compareTime );\n\n\treturn result;\n\n}\n\n/**\n * Sorts the given array by the previously computed order via `getKeyframeOrder()`.\n *\n * @param {Array<number>} values - The values to sort.\n * @param {number} stride - The stride.\n * @param {Array<number>} order - The sort order.\n * @return {Array<number>} The sorted values.\n */\nfunction sortedArray( values, stride, order ) {\n\n\tconst nValues = values.length;\n\tconst result = new values.constructor( nValues );\n\n\tfor ( let i = 0, dstOffset = 0; dstOffset !== nValues; ++ i ) {\n\n\t\tconst srcOffset = order[ i ] * stride;\n\n\t\tfor ( let j = 0; j !== stride; ++ j ) {\n\n\t\t\tresult[ dstOffset ++ ] = values[ srcOffset + j ];\n\n\t\t}\n\n\t}\n\n\treturn result;\n\n}\n\n/**\n * Used for parsing AOS keyframe formats.\n *\n * @param {Array<number>} jsonKeys - A list of JSON keyframes.\n * @param {Array<number>} times - This array will be filled with keyframe times by this function.\n * @param {Array<number>} values - This array will be filled with keyframe values by this function.\n * @param {string} valuePropertyName - The name of the property to use.\n */\nfunction flattenJSON( jsonKeys, times, values, valuePropertyName ) {\n\n\tlet i = 1, key = jsonKeys[ 0 ];\n\n\twhile ( key !== undefined && key[ valuePropertyName ] === undefined ) {\n\n\t\tkey = jsonKeys[ i ++ ];\n\n\t}\n\n\tif ( key === undefined ) return; // no data\n\n\tlet value = key[ valuePropertyName ];\n\tif ( value === undefined ) return; // no data\n\n\tif ( Array.isArray( value ) ) {\n\n\t\tdo {\n\n\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\tif ( value !== undefined ) {\n\n\t\t\t\ttimes.push( key.time );\n\t\t\t\tvalues.push( ...value ); // push all elements\n\n\t\t\t}\n\n\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t} while ( key !== undefined );\n\n\t} else if ( value.toArray !== undefined ) {\n\n\t\t// ...assume THREE.Math-ish\n\n\t\tdo {\n\n\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\tif ( value !== undefined ) {\n\n\t\t\t\ttimes.push( key.time );\n\t\t\t\tvalue.toArray( values, values.length );\n\n\t\t\t}\n\n\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t} while ( key !== undefined );\n\n\t} else {\n\n\t\t// otherwise push as-is\n\n\t\tdo {\n\n\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\tif ( value !== undefined ) {\n\n\t\t\t\ttimes.push( key.time );\n\t\t\t\tvalues.push( value );\n\n\t\t\t}\n\n\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t} while ( key !== undefined );\n\n\t}\n\n}\n\n/**\n * Creates a new clip, containing only the segment of the original clip between the given frames.\n *\n * @param {AnimationClip} sourceClip - The values to sort.\n * @param {string} name - The name of the clip.\n * @param {number} startFrame - The start frame.\n * @param {number} endFrame - The end frame.\n * @param {number} [fps=30] - The FPS.\n * @return {AnimationClip} The new sub clip.\n */\nfunction subclip( sourceClip, name, startFrame, endFrame, fps = 30 ) {\n\n\tconst clip = sourceClip.clone();\n\n\tclip.name = name;\n\n\tconst tracks = [];\n\n\tfor ( let i = 0; i < clip.tracks.length; ++ i ) {\n\n\t\tconst track = clip.tracks[ i ];\n\t\tconst valueSize = track.getValueSize();\n\n\t\tconst times = [];\n\t\tconst values = [];\n\n\t\tfor ( let j = 0; j < track.times.length; ++ j ) {\n\n\t\t\tconst frame = track.times[ j ] * fps;\n\n\t\t\tif ( frame < startFrame || frame >= endFrame ) continue;\n\n\t\t\ttimes.push( track.times[ j ] );\n\n\t\t\tfor ( let k = 0; k < valueSize; ++ k ) {\n\n\t\t\t\tvalues.push( track.values[ j * valueSize + k ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( times.length === 0 ) continue;\n\n\t\ttrack.times = convertArray( times, track.times.constructor );\n\t\ttrack.values = convertArray( values, track.values.constructor );\n\n\t\ttracks.push( track );\n\n\t}\n\n\tclip.tracks = tracks;\n\n\t// find minimum .times value across all tracks in the trimmed clip\n\n\tlet minStartTime = Infinity;\n\n\tfor ( let i = 0; i < clip.tracks.length; ++ i ) {\n\n\t\tif ( minStartTime > clip.tracks[ i ].times[ 0 ] ) {\n\n\t\t\tminStartTime = clip.tracks[ i ].times[ 0 ];\n\n\t\t}\n\n\t}\n\n\t// shift all tracks such that clip begins at t=0\n\n\tfor ( let i = 0; i < clip.tracks.length; ++ i ) {\n\n\t\tclip.tracks[ i ].shift( -1 * minStartTime );\n\n\t}\n\n\tclip.resetDuration();\n\n\treturn clip;\n\n}\n\n/**\n * Converts the keyframes of the given animation clip to an additive format.\n *\n * @param {AnimationClip} targetClip - The clip to make additive.\n * @param {number} [referenceFrame=0] - The reference frame.\n * @param {AnimationClip} [referenceClip=targetClip] - The reference clip.\n * @param {number} [fps=30] - The FPS.\n * @return {AnimationClip} The updated clip which is now additive.\n */\nfunction makeClipAdditive( targetClip, referenceFrame = 0, referenceClip = targetClip, fps = 30 ) {\n\n\tif ( fps <= 0 ) fps = 30;\n\n\tconst numTracks = referenceClip.tracks.length;\n\tconst referenceTime = referenceFrame / fps;\n\n\t// Make each track's values relative to the values at the reference frame\n\tfor ( let i = 0; i < numTracks; ++ i ) {\n\n\t\tconst referenceTrack = referenceClip.tracks[ i ];\n\t\tconst referenceTrackType = referenceTrack.ValueTypeName;\n\n\t\t// Skip this track if it's non-numeric\n\t\tif ( referenceTrackType === 'bool' || referenceTrackType === 'string' ) continue;\n\n\t\t// Find the track in the target clip whose name and type matches the reference track\n\t\tconst targetTrack = targetClip.tracks.find( function ( track ) {\n\n\t\t\treturn track.name === referenceTrack.name\n\t\t\t\t&& track.ValueTypeName === referenceTrackType;\n\n\t\t} );\n\n\t\tif ( targetTrack === undefined ) continue;\n\n\t\tlet referenceOffset = 0;\n\t\tconst referenceValueSize = referenceTrack.getValueSize();\n\n\t\tif ( referenceTrack.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline ) {\n\n\t\t\treferenceOffset = referenceValueSize / 3;\n\n\t\t}\n\n\t\tlet targetOffset = 0;\n\t\tconst targetValueSize = targetTrack.getValueSize();\n\n\t\tif ( targetTrack.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline ) {\n\n\t\t\ttargetOffset = targetValueSize / 3;\n\n\t\t}\n\n\t\tconst lastIndex = referenceTrack.times.length - 1;\n\t\tlet referenceValue;\n\n\t\t// Find the value to subtract out of the track\n\t\tif ( referenceTime <= referenceTrack.times[ 0 ] ) {\n\n\t\t\t// Reference frame is earlier than the first keyframe, so just use the first keyframe\n\t\t\tconst startIndex = referenceOffset;\n\t\t\tconst endIndex = referenceValueSize - referenceOffset;\n\t\t\treferenceValue = referenceTrack.values.slice( startIndex, endIndex );\n\n\t\t} else if ( referenceTime >= referenceTrack.times[ lastIndex ] ) {\n\n\t\t\t// Reference frame is after the last keyframe, so just use the last keyframe\n\t\t\tconst startIndex = lastIndex * referenceValueSize + referenceOffset;\n\t\t\tconst endIndex = startIndex + referenceValueSize - referenceOffset;\n\t\t\treferenceValue = referenceTrack.values.slice( startIndex, endIndex );\n\n\t\t} else {\n\n\t\t\t// Interpolate to the reference value\n\t\t\tconst interpolant = referenceTrack.createInterpolant();\n\t\t\tconst startIndex = referenceOffset;\n\t\t\tconst endIndex = referenceValueSize - referenceOffset;\n\t\t\tinterpolant.evaluate( referenceTime );\n\t\t\treferenceValue = interpolant.resultBuffer.slice( startIndex, endIndex );\n\n\t\t}\n\n\t\t// Conjugate the quaternion\n\t\tif ( referenceTrackType === 'quaternion' ) {\n\n\t\t\tconst referenceQuat = new Quaternion().fromArray( referenceValue ).normalize().conjugate();\n\t\t\treferenceQuat.toArray( referenceValue );\n\n\t\t}\n\n\t\t// Subtract the reference value from all of the track values\n\n\t\tconst numTimes = targetTrack.times.length;\n\t\tfor ( let j = 0; j < numTimes; ++ j ) {\n\n\t\t\tconst valueStart = j * targetValueSize + targetOffset;\n\n\t\t\tif ( referenceTrackType === 'quaternion' ) {\n\n\t\t\t\t// Multiply the conjugate for quaternion track types\n\t\t\t\tQuaternion.multiplyQuaternionsFlat(\n\t\t\t\t\ttargetTrack.values,\n\t\t\t\t\tvalueStart,\n\t\t\t\t\treferenceValue,\n\t\t\t\t\t0,\n\t\t\t\t\ttargetTrack.values,\n\t\t\t\t\tvalueStart\n\t\t\t\t);\n\n\t\t\t} else {\n\n\t\t\t\tconst valueEnd = targetValueSize - targetOffset * 2;\n\n\t\t\t\t// Subtract each value for all other numeric track types\n\t\t\t\tfor ( let k = 0; k < valueEnd; ++ k ) {\n\n\t\t\t\t\ttargetTrack.values[ valueStart + k ] -= referenceValue[ k ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\ttargetClip.blendMode = AdditiveAnimationBlendMode;\n\n\treturn targetClip;\n\n}\n\n/**\n * A class with various methods to assist with animations.\n *\n * @hideconstructor\n */\nclass AnimationUtils {\n\n\t/**\n\t * Converts an array to a specific type\n\t *\n\t * @static\n\t * @param {TypedArray|Array} array - The array to convert.\n\t * @param {TypedArray.constructor} type - The constructor of a type array.\n\t * @return {TypedArray} The converted array\n\t */\n\tstatic convertArray( array, type ) {\n\n\t\treturn convertArray( array, type );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given object is a typed array.\n\t *\n\t * @static\n\t * @param {any} object - The object to check.\n\t * @return {boolean} Whether the given object is a typed array.\n\t */\n\tstatic isTypedArray( object ) {\n\n\t\treturn isTypedArray( object );\n\n\t}\n\n\t/**\n\t * Returns an array by which times and values can be sorted.\n\t *\n\t * @static\n\t * @param {Array<number>} times - The keyframe time values.\n\t * @return {Array<number>} The array.\n\t */\n\tstatic getKeyframeOrder( times ) {\n\n\t\treturn getKeyframeOrder( times );\n\n\t}\n\n\t/**\n\t * Sorts the given array by the previously computed order via `getKeyframeOrder()`.\n\t *\n\t * @static\n\t * @param {Array<number>} values - The values to sort.\n\t * @param {number} stride - The stride.\n\t * @param {Array<number>} order - The sort order.\n\t * @return {Array<number>} The sorted values.\n\t */\n\tstatic sortedArray( values, stride, order ) {\n\n\t\treturn sortedArray( values, stride, order );\n\n\t}\n\n\t/**\n\t * Used for parsing AOS keyframe formats.\n\t *\n\t * @static\n\t * @param {Array<number>} jsonKeys - A list of JSON keyframes.\n\t * @param {Array<number>} times - This array will be filled with keyframe times by this method.\n\t * @param {Array<number>} values - This array will be filled with keyframe values by this method.\n\t * @param {string} valuePropertyName - The name of the property to use.\n\t */\n\tstatic flattenJSON( jsonKeys, times, values, valuePropertyName ) {\n\n\t\tflattenJSON( jsonKeys, times, values, valuePropertyName );\n\n\t}\n\n\t/**\n\t * Creates a new clip, containing only the segment of the original clip between the given frames.\n\t *\n\t * @static\n\t * @param {AnimationClip} sourceClip - The values to sort.\n\t * @param {string} name - The name of the clip.\n\t * @param {number} startFrame - The start frame.\n\t * @param {number} endFrame - The end frame.\n\t * @param {number} [fps=30] - The FPS.\n\t * @return {AnimationClip} The new sub clip.\n\t */\n\tstatic subclip( sourceClip, name, startFrame, endFrame, fps = 30 ) {\n\n\t\treturn subclip( sourceClip, name, startFrame, endFrame, fps );\n\n\t}\n\n\t/**\n\t * Converts the keyframes of the given animation clip to an additive format.\n\t *\n\t * @static\n\t * @param {AnimationClip} targetClip - The clip to make additive.\n\t * @param {number} [referenceFrame=0] - The reference frame.\n\t * @param {AnimationClip} [referenceClip=targetClip] - The reference clip.\n\t * @param {number} [fps=30] - The FPS.\n\t * @return {AnimationClip} The updated clip which is now additive.\n\t */\n\tstatic makeClipAdditive( targetClip, referenceFrame = 0, referenceClip = targetClip, fps = 30 ) {\n\n\t\treturn makeClipAdditive( targetClip, referenceFrame, referenceClip, fps );\n\n\t}\n\n}\n\n/**\n * Abstract base class of interpolants over parametric samples.\n *\n * The parameter domain is one dimensional, typically the time or a path\n * along a curve defined by the data.\n *\n * The sample values can have any dimensionality and derived classes may\n * apply special interpretations to the data.\n *\n * This class provides the interval seek in a Template Method, deferring\n * the actual interpolation to derived classes.\n *\n * Time complexity is O(1) for linear access crossing at most two points\n * and O(log N) for random access, where N is the number of positions.\n *\n * References: {@link http://www.oodesign.com/template-method-pattern.html}\n *\n * @abstract\n */\nclass Interpolant {\n\n\t/**\n\t * Constructs a new interpolant.\n\t *\n\t * @param {TypedArray} parameterPositions - The parameter positions hold the interpolation factors.\n\t * @param {TypedArray} sampleValues - The sample values.\n\t * @param {number} sampleSize - The sample size\n\t * @param {TypedArray} [resultBuffer] - The result buffer.\n\t */\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\t/**\n\t\t * The parameter positions.\n\t\t *\n\t\t * @type {TypedArray}\n\t\t */\n\t\tthis.parameterPositions = parameterPositions;\n\n\t\t/**\n\t\t * A cache index.\n\t\t *\n\t\t * @private\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis._cachedIndex = 0;\n\n\t\t/**\n\t\t * The result buffer.\n\t\t *\n\t\t * @type {TypedArray}\n\t\t */\n\t\tthis.resultBuffer = resultBuffer !== undefined ? resultBuffer : new sampleValues.constructor( sampleSize );\n\n\t\t/**\n\t\t * The sample values.\n\t\t *\n\t\t * @type {TypedArray}\n\t\t */\n\t\tthis.sampleValues = sampleValues;\n\n\t\t/**\n\t\t * The value size.\n\t\t *\n\t\t * @type {TypedArray}\n\t\t */\n\t\tthis.valueSize = sampleSize;\n\n\t\t/**\n\t\t * The interpolation settings.\n\t\t *\n\t\t * @type {?Object}\n\t\t * @default null\n\t\t */\n\t\tthis.settings = null;\n\n\t\t/**\n\t\t * The default settings object.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.DefaultSettings_ = {};\n\n\t}\n\n\t/**\n\t * Evaluate the interpolant at position `t`.\n\t *\n\t * @param {number} t - The interpolation factor.\n\t * @return {TypedArray} The result buffer.\n\t */\n\tevaluate( t ) {\n\n\t\tconst pp = this.parameterPositions;\n\t\tlet i1 = this._cachedIndex,\n\t\t\tt1 = pp[ i1 ],\n\t\t\tt0 = pp[ i1 - 1 ];\n\n\t\tvalidate_interval: {\n\n\t\t\tseek: {\n\n\t\t\t\tlet right;\n\n\t\t\t\tlinear_scan: {\n\n\t\t\t\t\t//- See http://jsperf.com/comparison-to-undefined/3\n\t\t\t\t\t//- slower code:\n\t\t\t\t\t//-\n\t\t\t\t\t//- \t\t\t\tif ( t >= t1 || t1 === undefined ) {\n\t\t\t\t\tforward_scan: if ( ! ( t < t1 ) ) {\n\n\t\t\t\t\t\tfor ( let giveUpAt = i1 + 2; ; ) {\n\n\t\t\t\t\t\t\tif ( t1 === undefined ) {\n\n\t\t\t\t\t\t\t\tif ( t < t0 ) break forward_scan;\n\n\t\t\t\t\t\t\t\t// after end\n\n\t\t\t\t\t\t\t\ti1 = pp.length;\n\t\t\t\t\t\t\t\tthis._cachedIndex = i1;\n\t\t\t\t\t\t\t\treturn this.copySampleValue_( i1 - 1 );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( i1 === giveUpAt ) break; // this loop\n\n\t\t\t\t\t\t\tt0 = t1;\n\t\t\t\t\t\t\tt1 = pp[ ++ i1 ];\n\n\t\t\t\t\t\t\tif ( t < t1 ) {\n\n\t\t\t\t\t\t\t\t// we have arrived at the sought interval\n\t\t\t\t\t\t\t\tbreak seek;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// prepare binary search on the right side of the index\n\t\t\t\t\t\tright = pp.length;\n\t\t\t\t\t\tbreak linear_scan;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t//- slower code:\n\t\t\t\t\t//-\t\t\t\t\tif ( t < t0 || t0 === undefined ) {\n\t\t\t\t\tif ( ! ( t >= t0 ) ) {\n\n\t\t\t\t\t\t// looping?\n\n\t\t\t\t\t\tconst t1global = pp[ 1 ];\n\n\t\t\t\t\t\tif ( t < t1global ) {\n\n\t\t\t\t\t\t\ti1 = 2; // + 1, using the scan for the details\n\t\t\t\t\t\t\tt0 = t1global;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// linear reverse scan\n\n\t\t\t\t\t\tfor ( let giveUpAt = i1 - 2; ; ) {\n\n\t\t\t\t\t\t\tif ( t0 === undefined ) {\n\n\t\t\t\t\t\t\t\t// before start\n\n\t\t\t\t\t\t\t\tthis._cachedIndex = 0;\n\t\t\t\t\t\t\t\treturn this.copySampleValue_( 0 );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( i1 === giveUpAt ) break; // this loop\n\n\t\t\t\t\t\t\tt1 = t0;\n\t\t\t\t\t\t\tt0 = pp[ -- i1 - 1 ];\n\n\t\t\t\t\t\t\tif ( t >= t0 ) {\n\n\t\t\t\t\t\t\t\t// we have arrived at the sought interval\n\t\t\t\t\t\t\t\tbreak seek;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// prepare binary search on the left side of the index\n\t\t\t\t\t\tright = i1;\n\t\t\t\t\t\ti1 = 0;\n\t\t\t\t\t\tbreak linear_scan;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// the interval is valid\n\n\t\t\t\t\tbreak validate_interval;\n\n\t\t\t\t} // linear scan\n\n\t\t\t\t// binary search\n\n\t\t\t\twhile ( i1 < right ) {\n\n\t\t\t\t\tconst mid = ( i1 + right ) >>> 1;\n\n\t\t\t\t\tif ( t < pp[ mid ] ) {\n\n\t\t\t\t\t\tright = mid;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ti1 = mid + 1;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tt1 = pp[ i1 ];\n\t\t\t\tt0 = pp[ i1 - 1 ];\n\n\t\t\t\t// check boundary cases, again\n\n\t\t\t\tif ( t0 === undefined ) {\n\n\t\t\t\t\tthis._cachedIndex = 0;\n\t\t\t\t\treturn this.copySampleValue_( 0 );\n\n\t\t\t\t}\n\n\t\t\t\tif ( t1 === undefined ) {\n\n\t\t\t\t\ti1 = pp.length;\n\t\t\t\t\tthis._cachedIndex = i1;\n\t\t\t\t\treturn this.copySampleValue_( i1 - 1 );\n\n\t\t\t\t}\n\n\t\t\t} // seek\n\n\t\t\tthis._cachedIndex = i1;\n\n\t\t\tthis.intervalChanged_( i1, t0, t1 );\n\n\t\t} // validate_interval\n\n\t\treturn this.interpolate_( i1, t0, t, t1 );\n\n\t}\n\n\t/**\n\t * Returns the interpolation settings.\n\t *\n\t * @return {Object} The interpolation settings.\n\t */\n\tgetSettings_() {\n\n\t\treturn this.settings || this.DefaultSettings_;\n\n\t}\n\n\t/**\n\t * Copies a sample value to the result buffer.\n\t *\n\t * @param {number} index - An index into the sample value buffer.\n\t * @return {TypedArray} The result buffer.\n\t */\n\tcopySampleValue_( index ) {\n\n\t\t// copies a sample value to the result buffer\n\n\t\tconst result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tstride = this.valueSize,\n\t\t\toffset = index * stride;\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tresult[ i ] = values[ offset + i ];\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\t/**\n\t * Copies a sample value to the result buffer.\n\t *\n\t * @abstract\n\t * @param {number} i1 - An index into the sample value buffer.\n\t * @param {number} t0 - The previous interpolation factor.\n\t * @param {number} t - The current interpolation factor.\n\t * @param {number} t1 - The next interpolation factor.\n\t * @return {TypedArray} The result buffer.\n\t */\n\tinterpolate_( /* i1, t0, t, t1 */ ) {\n\n\t\tthrow new Error( 'call to abstract method' );\n\t\t// implementations shall return this.resultBuffer\n\n\t}\n\n\t/**\n\t * Optional method that is executed when the interval has changed.\n\t *\n\t * @param {number} i1 - An index into the sample value buffer.\n\t * @param {number} t0 - The previous interpolation factor.\n\t * @param {number} t - The current interpolation factor.\n\t */\n\tintervalChanged_( /* i1, t0, t1 */ ) {\n\n\t\t// empty\n\n\t}\n\n}\n\n/**\n * Fast and simple cubic spline interpolant.\n *\n * It was derived from a Hermitian construction setting the first derivative\n * at each sample position to the linear slope between neighboring positions\n * over their parameter interval.\n *\n * @augments Interpolant\n */\nclass CubicInterpolant extends Interpolant {\n\n\t/**\n\t * Constructs a new cubic interpolant.\n\t *\n\t * @param {TypedArray} parameterPositions - The parameter positions hold the interpolation factors.\n\t * @param {TypedArray} sampleValues - The sample values.\n\t * @param {number} sampleSize - The sample size\n\t * @param {TypedArray} [resultBuffer] - The result buffer.\n\t */\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tsuper( parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t\tthis._weightPrev = -0;\n\t\tthis._offsetPrev = -0;\n\t\tthis._weightNext = -0;\n\t\tthis._offsetNext = -0;\n\n\t\tthis.DefaultSettings_ = {\n\n\t\t\tendingStart: ZeroCurvatureEnding,\n\t\t\tendingEnd: ZeroCurvatureEnding\n\n\t\t};\n\n\t}\n\n\tintervalChanged_( i1, t0, t1 ) {\n\n\t\tconst pp = this.parameterPositions;\n\t\tlet iPrev = i1 - 2,\n\t\t\tiNext = i1 + 1,\n\n\t\t\ttPrev = pp[ iPrev ],\n\t\t\ttNext = pp[ iNext ];\n\n\t\tif ( tPrev === undefined ) {\n\n\t\t\tswitch ( this.getSettings_().endingStart ) {\n\n\t\t\t\tcase ZeroSlopeEnding:\n\n\t\t\t\t\t// f'(t0) = 0\n\t\t\t\t\tiPrev = i1;\n\t\t\t\t\ttPrev = 2 * t0 - t1;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase WrapAroundEnding:\n\n\t\t\t\t\t// use the other end of the curve\n\t\t\t\t\tiPrev = pp.length - 2;\n\t\t\t\t\ttPrev = t0 + pp[ iPrev ] - pp[ iPrev + 1 ];\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault: // ZeroCurvatureEnding\n\n\t\t\t\t\t// f''(t0) = 0 a.k.a. Natural Spline\n\t\t\t\t\tiPrev = i1;\n\t\t\t\t\ttPrev = t1;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( tNext === undefined ) {\n\n\t\t\tswitch ( this.getSettings_().endingEnd ) {\n\n\t\t\t\tcase ZeroSlopeEnding:\n\n\t\t\t\t\t// f'(tN) = 0\n\t\t\t\t\tiNext = i1;\n\t\t\t\t\ttNext = 2 * t1 - t0;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase WrapAroundEnding:\n\n\t\t\t\t\t// use the other end of the curve\n\t\t\t\t\tiNext = 1;\n\t\t\t\t\ttNext = t1 + pp[ 1 ] - pp[ 0 ];\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault: // ZeroCurvatureEnding\n\n\t\t\t\t\t// f''(tN) = 0, a.k.a. Natural Spline\n\t\t\t\t\tiNext = i1 - 1;\n\t\t\t\t\ttNext = t0;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst halfDt = ( t1 - t0 ) * 0.5,\n\t\t\tstride = this.valueSize;\n\n\t\tthis._weightPrev = halfDt / ( t0 - tPrev );\n\t\tthis._weightNext = halfDt / ( tNext - t1 );\n\t\tthis._offsetPrev = iPrev * stride;\n\t\tthis._offsetNext = iNext * stride;\n\n\t}\n\n\tinterpolate_( i1, t0, t, t1 ) {\n\n\t\tconst result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tstride = this.valueSize,\n\n\t\t\to1 = i1 * stride,\t\to0 = o1 - stride,\n\t\t\toP = this._offsetPrev, \toN = this._offsetNext,\n\t\t\twP = this._weightPrev,\twN = this._weightNext,\n\n\t\t\tp = ( t - t0 ) / ( t1 - t0 ),\n\t\t\tpp = p * p,\n\t\t\tppp = pp * p;\n\n\t\t// evaluate polynomials\n\n\t\tconst sP = - wP * ppp + 2 * wP * pp - wP * p;\n\t\tconst s0 = ( 1 + wP ) * ppp + ( -1.5 - 2 * wP ) * pp + ( -0.5 + wP ) * p + 1;\n\t\tconst s1 = ( -1 - wN ) * ppp + ( 1.5 + wN ) * pp + 0.5 * p;\n\t\tconst sN = wN * ppp - wN * pp;\n\n\t\t// combine data linearly\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tresult[ i ] =\n\t\t\t\t\tsP * values[ oP + i ] +\n\t\t\t\t\ts0 * values[ o0 + i ] +\n\t\t\t\t\ts1 * values[ o1 + i ] +\n\t\t\t\t\tsN * values[ oN + i ];\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n}\n\n/**\n * A basic linear interpolant.\n *\n * @augments Interpolant\n */\nclass LinearInterpolant extends Interpolant {\n\n\t/**\n\t * Constructs a new linear interpolant.\n\t *\n\t * @param {TypedArray} parameterPositions - The parameter positions hold the interpolation factors.\n\t * @param {TypedArray} sampleValues - The sample values.\n\t * @param {number} sampleSize - The sample size\n\t * @param {TypedArray} [resultBuffer] - The result buffer.\n\t */\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tsuper( parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tinterpolate_( i1, t0, t, t1 ) {\n\n\t\tconst result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tstride = this.valueSize,\n\n\t\t\toffset1 = i1 * stride,\n\t\t\toffset0 = offset1 - stride,\n\n\t\t\tweight1 = ( t - t0 ) / ( t1 - t0 ),\n\t\t\tweight0 = 1 - weight1;\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tresult[ i ] =\n\t\t\t\t\tvalues[ offset0 + i ] * weight0 +\n\t\t\t\t\tvalues[ offset1 + i ] * weight1;\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n}\n\n/**\n * Interpolant that evaluates to the sample value at the position preceding\n * the parameter.\n *\n * @augments Interpolant\n */\nclass DiscreteInterpolant extends Interpolant {\n\n\t/**\n\t * Constructs a new discrete interpolant.\n\t *\n\t * @param {TypedArray} parameterPositions - The parameter positions hold the interpolation factors.\n\t * @param {TypedArray} sampleValues - The sample values.\n\t * @param {number} sampleSize - The sample size\n\t * @param {TypedArray} [resultBuffer] - The result buffer.\n\t */\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tsuper( parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tinterpolate_( i1 /*, t0, t, t1 */ ) {\n\n\t\treturn this.copySampleValue_( i1 - 1 );\n\n\t}\n\n}\n\n/**\n * Represents s a timed sequence of keyframes, which are composed of lists of\n * times and related values, and which are used to animate a specific property\n * of an object.\n */\nclass KeyframeTrack {\n\n\t/**\n\t * Constructs a new keyframe track.\n\t *\n\t * @param {string} name - The keyframe track's name.\n\t * @param {Array<number>} times - A list of keyframe times.\n\t * @param {Array<number|string|boolean>} values - A list of keyframe values.\n\t * @param {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)} [interpolation] - The interpolation type.\n\t */\n\tconstructor( name, times, values, interpolation ) {\n\n\t\tif ( name === undefined ) throw new Error( 'THREE.KeyframeTrack: track name is undefined' );\n\t\tif ( times === undefined || times.length === 0 ) throw new Error( 'THREE.KeyframeTrack: no keyframes in track named ' + name );\n\n\t\t/**\n\t\t * The track's name can refer to morph targets or bones or\n\t\t * possibly other values within an animated object. See {@link PropertyBinding#parseTrackName}\n\t\t * for the forms of strings that can be parsed for property binding.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = name;\n\n\t\t/**\n\t\t * The keyframe times.\n\t\t *\n\t\t * @type {Float32Array}\n\t\t */\n\t\tthis.times = convertArray( times, this.TimeBufferType );\n\n\t\t/**\n\t\t * The keyframe values.\n\t\t *\n\t\t * @type {Float32Array}\n\t\t */\n\t\tthis.values = convertArray( values, this.ValueBufferType );\n\n\t\tthis.setInterpolation( interpolation || this.DefaultInterpolation );\n\n\t}\n\n\t/**\n\t * Converts the keyframe track to JSON.\n\t *\n\t * @static\n\t * @param {KeyframeTrack} track - The keyframe track to serialize.\n\t * @return {Object} The serialized keyframe track as JSON.\n\t */\n\tstatic toJSON( track ) {\n\n\t\tconst trackType = track.constructor;\n\n\t\tlet json;\n\n\t\t// derived classes can define a static toJSON method\n\t\tif ( trackType.toJSON !== this.toJSON ) {\n\n\t\t\tjson = trackType.toJSON( track );\n\n\t\t} else {\n\n\t\t\t// by default, we assume the data can be serialized as-is\n\t\t\tjson = {\n\n\t\t\t\t'name': track.name,\n\t\t\t\t'times': convertArray( track.times, Array ),\n\t\t\t\t'values': convertArray( track.values, Array )\n\n\t\t\t};\n\n\t\t\tconst interpolation = track.getInterpolation();\n\n\t\t\tif ( interpolation !== track.DefaultInterpolation ) {\n\n\t\t\t\tjson.interpolation = interpolation;\n\n\t\t\t}\n\n\t\t}\n\n\t\tjson.type = track.ValueTypeName; // mandatory\n\n\t\treturn json;\n\n\t}\n\n\t/**\n\t * Factory method for creating a new discrete interpolant.\n\t *\n\t * @static\n\t * @param {TypedArray} [result] - The result buffer.\n\t * @return {DiscreteInterpolant} The new interpolant.\n\t */\n\tInterpolantFactoryMethodDiscrete( result ) {\n\n\t\treturn new DiscreteInterpolant( this.times, this.values, this.getValueSize(), result );\n\n\t}\n\n\t/**\n\t * Factory method for creating a new linear interpolant.\n\t *\n\t * @static\n\t * @param {TypedArray} [result] - The result buffer.\n\t * @return {LinearInterpolant} The new interpolant.\n\t */\n\tInterpolantFactoryMethodLinear( result ) {\n\n\t\treturn new LinearInterpolant( this.times, this.values, this.getValueSize(), result );\n\n\t}\n\n\t/**\n\t * Factory method for creating a new smooth interpolant.\n\t *\n\t * @static\n\t * @param {TypedArray} [result] - The result buffer.\n\t * @return {CubicInterpolant} The new interpolant.\n\t */\n\tInterpolantFactoryMethodSmooth( result ) {\n\n\t\treturn new CubicInterpolant( this.times, this.values, this.getValueSize(), result );\n\n\t}\n\n\t/**\n\t * Defines the interpolation factor method for this keyframe track.\n\t *\n\t * @param {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)} interpolation - The interpolation type.\n\t * @return {KeyframeTrack} A reference to this keyframe track.\n\t */\n\tsetInterpolation( interpolation ) {\n\n\t\tlet factoryMethod;\n\n\t\tswitch ( interpolation ) {\n\n\t\t\tcase InterpolateDiscrete:\n\n\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodDiscrete;\n\n\t\t\t\tbreak;\n\n\t\t\tcase InterpolateLinear:\n\n\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodLinear;\n\n\t\t\t\tbreak;\n\n\t\t\tcase InterpolateSmooth:\n\n\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodSmooth;\n\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\tif ( factoryMethod === undefined ) {\n\n\t\t\tconst message = 'unsupported interpolation for ' +\n\t\t\t\tthis.ValueTypeName + ' keyframe track named ' + this.name;\n\n\t\t\tif ( this.createInterpolant === undefined ) {\n\n\t\t\t\t// fall back to default, unless the default itself is messed up\n\t\t\t\tif ( interpolation !== this.DefaultInterpolation ) {\n\n\t\t\t\t\tthis.setInterpolation( this.DefaultInterpolation );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new Error( message ); // fatal, in this case\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\twarn( 'KeyframeTrack:', message );\n\t\t\treturn this;\n\n\t\t}\n\n\t\tthis.createInterpolant = factoryMethod;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the current interpolation type.\n\t *\n\t * @return {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)} The interpolation type.\n\t */\n\tgetInterpolation() {\n\n\t\tswitch ( this.createInterpolant ) {\n\n\t\t\tcase this.InterpolantFactoryMethodDiscrete:\n\n\t\t\t\treturn InterpolateDiscrete;\n\n\t\t\tcase this.InterpolantFactoryMethodLinear:\n\n\t\t\t\treturn InterpolateLinear;\n\n\t\t\tcase this.InterpolantFactoryMethodSmooth:\n\n\t\t\t\treturn InterpolateSmooth;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns the value size.\n\t *\n\t * @return {number} The value size.\n\t */\n\tgetValueSize() {\n\n\t\treturn this.values.length / this.times.length;\n\n\t}\n\n\t/**\n\t * Moves all keyframes either forward or backward in time.\n\t *\n\t * @param {number} timeOffset - The offset to move the time values.\n\t * @return {KeyframeTrack} A reference to this keyframe track.\n\t */\n\tshift( timeOffset ) {\n\n\t\tif ( timeOffset !== 0.0 ) {\n\n\t\t\tconst times = this.times;\n\n\t\t\tfor ( let i = 0, n = times.length; i !== n; ++ i ) {\n\n\t\t\t\ttimes[ i ] += timeOffset;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Scale all keyframe times by a factor (useful for frame - seconds conversions).\n\t *\n\t * @param {number} timeScale - The time scale.\n\t * @return {KeyframeTrack} A reference to this keyframe track.\n\t */\n\tscale( timeScale ) {\n\n\t\tif ( timeScale !== 1.0 ) {\n\n\t\t\tconst times = this.times;\n\n\t\t\tfor ( let i = 0, n = times.length; i !== n; ++ i ) {\n\n\t\t\t\ttimes[ i ] *= timeScale;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Removes keyframes before and after animation without changing any values within the defined time range.\n\t *\n\t * Note: The method does not shift around keys to the start of the track time, because for interpolated\n\t * keys this will change their values\n\t *\n\t * @param {number} startTime - The start time.\n\t * @param {number} endTime - The end time.\n\t * @return {KeyframeTrack} A reference to this keyframe track.\n\t */\n\ttrim( startTime, endTime ) {\n\n\t\tconst times = this.times,\n\t\t\tnKeys = times.length;\n\n\t\tlet from = 0,\n\t\t\tto = nKeys - 1;\n\n\t\twhile ( from !== nKeys && times[ from ] < startTime ) {\n\n\t\t\t++ from;\n\n\t\t}\n\n\t\twhile ( to !== -1 && times[ to ] > endTime ) {\n\n\t\t\t-- to;\n\n\t\t}\n\n\t\t++ to; // inclusive -> exclusive bound\n\n\t\tif ( from !== 0 || to !== nKeys ) {\n\n\t\t\t// empty tracks are forbidden, so keep at least one keyframe\n\t\t\tif ( from >= to ) {\n\n\t\t\t\tto = Math.max( to, 1 );\n\t\t\t\tfrom = to - 1;\n\n\t\t\t}\n\n\t\t\tconst stride = this.getValueSize();\n\t\t\tthis.times = times.slice( from, to );\n\t\t\tthis.values = this.values.slice( from * stride, to * stride );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Performs minimal validation on the keyframe track. Returns `true` if the values\n\t * are valid.\n\t *\n\t * @return {boolean} Whether the keyframes are valid or not.\n\t */\n\tvalidate() {\n\n\t\tlet valid = true;\n\n\t\tconst valueSize = this.getValueSize();\n\t\tif ( valueSize - Math.floor( valueSize ) !== 0 ) {\n\n\t\t\terror( 'KeyframeTrack: Invalid value size in track.', this );\n\t\t\tvalid = false;\n\n\t\t}\n\n\t\tconst times = this.times,\n\t\t\tvalues = this.values,\n\n\t\t\tnKeys = times.length;\n\n\t\tif ( nKeys === 0 ) {\n\n\t\t\terror( 'KeyframeTrack: Track is empty.', this );\n\t\t\tvalid = false;\n\n\t\t}\n\n\t\tlet prevTime = null;\n\n\t\tfor ( let i = 0; i !== nKeys; i ++ ) {\n\n\t\t\tconst currTime = times[ i ];\n\n\t\t\tif ( typeof currTime === 'number' && isNaN( currTime ) ) {\n\n\t\t\t\terror( 'KeyframeTrack: Time is not a valid number.', this, i, currTime );\n\t\t\t\tvalid = false;\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tif ( prevTime !== null && prevTime > currTime ) {\n\n\t\t\t\terror( 'KeyframeTrack: Out of order keys.', this, i, currTime, prevTime );\n\t\t\t\tvalid = false;\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tprevTime = currTime;\n\n\t\t}\n\n\t\tif ( values !== undefined ) {\n\n\t\t\tif ( isTypedArray( values ) ) {\n\n\t\t\t\tfor ( let i = 0, n = values.length; i !== n; ++ i ) {\n\n\t\t\t\t\tconst value = values[ i ];\n\n\t\t\t\t\tif ( isNaN( value ) ) {\n\n\t\t\t\t\t\terror( 'KeyframeTrack: Value is not a valid number.', this, i, value );\n\t\t\t\t\t\tvalid = false;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn valid;\n\n\t}\n\n\t/**\n\t * Optimizes this keyframe track by removing equivalent sequential keys (which are\n\t * common in morph target sequences).\n\t *\n\t * @return {AnimationClip} A reference to this animation clip.\n\t */\n\toptimize() {\n\n\t\t// (0,0,0,0,1,1,1,0,0,0,0,0,0,0) --> (0,0,1,1,0,0)\n\n\t\t// times or values may be shared with other tracks, so overwriting is unsafe\n\t\tconst times = this.times.slice(),\n\t\t\tvalues = this.values.slice(),\n\t\t\tstride = this.getValueSize(),\n\n\t\t\tsmoothInterpolation = this.getInterpolation() === InterpolateSmooth,\n\n\t\t\tlastIndex = times.length - 1;\n\n\t\tlet writeIndex = 1;\n\n\t\tfor ( let i = 1; i < lastIndex; ++ i ) {\n\n\t\t\tlet keep = false;\n\n\t\t\tconst time = times[ i ];\n\t\t\tconst timeNext = times[ i + 1 ];\n\n\t\t\t// remove adjacent keyframes scheduled at the same time\n\n\t\t\tif ( time !== timeNext && ( i !== 1 || time !== times[ 0 ] ) ) {\n\n\t\t\t\tif ( ! smoothInterpolation ) {\n\n\t\t\t\t\t// remove unnecessary keyframes same as their neighbors\n\n\t\t\t\t\tconst offset = i * stride,\n\t\t\t\t\t\toffsetP = offset - stride,\n\t\t\t\t\t\toffsetN = offset + stride;\n\n\t\t\t\t\tfor ( let j = 0; j !== stride; ++ j ) {\n\n\t\t\t\t\t\tconst value = values[ offset + j ];\n\n\t\t\t\t\t\tif ( value !== values[ offsetP + j ] ||\n\t\t\t\t\t\t\tvalue !== values[ offsetN + j ] ) {\n\n\t\t\t\t\t\t\tkeep = true;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tkeep = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// in-place compaction\n\n\t\t\tif ( keep ) {\n\n\t\t\t\tif ( i !== writeIndex ) {\n\n\t\t\t\t\ttimes[ writeIndex ] = times[ i ];\n\n\t\t\t\t\tconst readOffset = i * stride,\n\t\t\t\t\t\twriteOffset = writeIndex * stride;\n\n\t\t\t\t\tfor ( let j = 0; j !== stride; ++ j ) {\n\n\t\t\t\t\t\tvalues[ writeOffset + j ] = values[ readOffset + j ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t++ writeIndex;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// flush last keyframe (compaction looks ahead)\n\n\t\tif ( lastIndex > 0 ) {\n\n\t\t\ttimes[ writeIndex ] = times[ lastIndex ];\n\n\t\t\tfor ( let readOffset = lastIndex * stride, writeOffset = writeIndex * stride, j = 0; j !== stride; ++ j ) {\n\n\t\t\t\tvalues[ writeOffset + j ] = values[ readOffset + j ];\n\n\t\t\t}\n\n\t\t\t++ writeIndex;\n\n\t\t}\n\n\t\tif ( writeIndex !== times.length ) {\n\n\t\t\tthis.times = times.slice( 0, writeIndex );\n\t\t\tthis.values = values.slice( 0, writeIndex * stride );\n\n\t\t} else {\n\n\t\t\tthis.times = times;\n\t\t\tthis.values = values;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new keyframe track with copied values from this instance.\n\t *\n\t * @return {KeyframeTrack} A clone of this instance.\n\t */\n\tclone() {\n\n\t\tconst times = this.times.slice();\n\t\tconst values = this.values.slice();\n\n\t\tconst TypedKeyframeTrack = this.constructor;\n\t\tconst track = new TypedKeyframeTrack( this.name, times, values );\n\n\t\t// Interpolant argument to constructor is not saved, so copy the factory method directly.\n\t\ttrack.createInterpolant = this.createInterpolant;\n\n\t\treturn track;\n\n\t}\n\n}\n\n/**\n * The value type name.\n *\n * @type {String}\n * @default ''\n */\nKeyframeTrack.prototype.ValueTypeName = '';\n\n/**\n * The time buffer type of this keyframe track.\n *\n * @type {TypedArray|Array}\n * @default Float32Array.constructor\n */\nKeyframeTrack.prototype.TimeBufferType = Float32Array;\n\n/**\n * The value buffer type of this keyframe track.\n *\n * @type {TypedArray|Array}\n * @default Float32Array.constructor\n */\nKeyframeTrack.prototype.ValueBufferType = Float32Array;\n\n/**\n * The default interpolation type of this keyframe track.\n *\n * @type {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)}\n * @default InterpolateLinear\n */\nKeyframeTrack.prototype.DefaultInterpolation = InterpolateLinear;\n\n/**\n * A track for boolean keyframe values.\n *\n * @augments KeyframeTrack\n */\nclass BooleanKeyframeTrack extends KeyframeTrack {\n\n\t/**\n\t * Constructs a new boolean keyframe track.\n\t *\n\t * This keyframe track type has no `interpolation` parameter because the\n\t * interpolation is always discrete.\n\t *\n\t * @param {string} name - The keyframe track's name.\n\t * @param {Array<number>} times - A list of keyframe times.\n\t * @param {Array<boolean>} values - A list of keyframe values.\n\t */\n\tconstructor( name, times, values ) {\n\n\t\tsuper( name, times, values );\n\n\t}\n\n}\n\n/**\n * The value type name.\n *\n * @type {String}\n * @default 'bool'\n */\nBooleanKeyframeTrack.prototype.ValueTypeName = 'bool';\n\n/**\n * The value buffer type of this keyframe track.\n *\n * @type {TypedArray|Array}\n * @default Array.constructor\n */\nBooleanKeyframeTrack.prototype.ValueBufferType = Array;\n\n/**\n * The default interpolation type of this keyframe track.\n *\n * @type {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)}\n * @default InterpolateDiscrete\n */\nBooleanKeyframeTrack.prototype.DefaultInterpolation = InterpolateDiscrete;\nBooleanKeyframeTrack.prototype.InterpolantFactoryMethodLinear = undefined;\nBooleanKeyframeTrack.prototype.InterpolantFactoryMethodSmooth = undefined;\n\n/**\n * A track for color keyframe values.\n *\n * @augments KeyframeTrack\n */\nclass ColorKeyframeTrack extends KeyframeTrack {\n\n\t/**\n\t * Constructs a new color keyframe track.\n\t *\n\t * @param {string} name - The keyframe track's name.\n\t * @param {Array<number>} times - A list of keyframe times.\n\t * @param {Array<number>} values - A list of keyframe values.\n\t * @param {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)} [interpolation] - The interpolation type.\n\t */\n\tconstructor( name, times, values, interpolation ) {\n\n\t\tsuper( name, times, values, interpolation );\n\n\t}\n\n}\n\n/**\n * The value type name.\n *\n * @type {String}\n * @default 'color'\n */\nColorKeyframeTrack.prototype.ValueTypeName = 'color';\n\n/**\n * A track for numeric keyframe values.\n *\n * @augments KeyframeTrack\n */\nclass NumberKeyframeTrack extends KeyframeTrack {\n\n\t/**\n\t * Constructs a new number keyframe track.\n\t *\n\t * @param {string} name - The keyframe track's name.\n\t * @param {Array<number>} times - A list of keyframe times.\n\t * @param {Array<number>} values - A list of keyframe values.\n\t * @param {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)} [interpolation] - The interpolation type.\n\t */\n\tconstructor( name, times, values, interpolation ) {\n\n\t\tsuper( name, times, values, interpolation );\n\n\t}\n\n}\n\n/**\n * The value type name.\n *\n * @type {String}\n * @default 'number'\n */\nNumberKeyframeTrack.prototype.ValueTypeName = 'number';\n\n/**\n * Spherical linear unit quaternion interpolant.\n *\n * @augments Interpolant\n */\nclass QuaternionLinearInterpolant extends Interpolant {\n\n\t/**\n\t * Constructs a new SLERP interpolant.\n\t *\n\t * @param {TypedArray} parameterPositions - The parameter positions hold the interpolation factors.\n\t * @param {TypedArray} sampleValues - The sample values.\n\t * @param {number} sampleSize - The sample size\n\t * @param {TypedArray} [resultBuffer] - The result buffer.\n\t */\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tsuper( parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tinterpolate_( i1, t0, t, t1 ) {\n\n\t\tconst result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tstride = this.valueSize,\n\n\t\t\talpha = ( t - t0 ) / ( t1 - t0 );\n\n\t\tlet offset = i1 * stride;\n\n\t\tfor ( let end = offset + stride; offset !== end; offset += 4 ) {\n\n\t\t\tQuaternion.slerpFlat( result, 0, values, offset - stride, values, offset, alpha );\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n}\n\n/**\n * A track for Quaternion keyframe values.\n *\n * @augments KeyframeTrack\n */\nclass QuaternionKeyframeTrack extends KeyframeTrack {\n\n\t/**\n\t * Constructs a new Quaternion keyframe track.\n\t *\n\t * @param {string} name - The keyframe track's name.\n\t * @param {Array<number>} times - A list of keyframe times.\n\t * @param {Array<number>} values - A list of keyframe values.\n\t * @param {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)} [interpolation] - The interpolation type.\n\t */\n\tconstructor( name, times, values, interpolation ) {\n\n\t\tsuper( name, times, values, interpolation );\n\n\t}\n\n\t/**\n\t * Overwritten so the method returns Quaternion based interpolant.\n\t *\n\t * @static\n\t * @param {TypedArray} [result] - The result buffer.\n\t * @return {QuaternionLinearInterpolant} The new interpolant.\n\t */\n\tInterpolantFactoryMethodLinear( result ) {\n\n\t\treturn new QuaternionLinearInterpolant( this.times, this.values, this.getValueSize(), result );\n\n\t}\n\n}\n\n/**\n * The value type name.\n *\n * @type {String}\n * @default 'quaternion'\n */\nQuaternionKeyframeTrack.prototype.ValueTypeName = 'quaternion';\n// ValueBufferType is inherited\n// DefaultInterpolation is inherited;\nQuaternionKeyframeTrack.prototype.InterpolantFactoryMethodSmooth = undefined;\n\n/**\n * A track for string keyframe values.\n *\n * @augments KeyframeTrack\n */\nclass StringKeyframeTrack extends KeyframeTrack {\n\n\t/**\n\t * Constructs a new string keyframe track.\n\t *\n\t * This keyframe track type has no `interpolation` parameter because the\n\t * interpolation is always discrete.\n\t *\n\t * @param {string} name - The keyframe track's name.\n\t * @param {Array<number>} times - A list of keyframe times.\n\t * @param {Array<string>} values - A list of keyframe values.\n\t */\n\tconstructor( name, times, values ) {\n\n\t\tsuper( name, times, values );\n\n\t}\n\n}\n\n/**\n * The value type name.\n *\n * @type {String}\n * @default 'string'\n */\nStringKeyframeTrack.prototype.ValueTypeName = 'string';\n\n/**\n * The value buffer type of this keyframe track.\n *\n * @type {TypedArray|Array}\n * @default Array.constructor\n */\nStringKeyframeTrack.prototype.ValueBufferType = Array;\n\n/**\n * The default interpolation type of this keyframe track.\n *\n * @type {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)}\n * @default InterpolateDiscrete\n */\nStringKeyframeTrack.prototype.DefaultInterpolation = InterpolateDiscrete;\nStringKeyframeTrack.prototype.InterpolantFactoryMethodLinear = undefined;\nStringKeyframeTrack.prototype.InterpolantFactoryMethodSmooth = undefined;\n\n/**\n * A track for vector keyframe values.\n *\n * @augments KeyframeTrack\n */\nclass VectorKeyframeTrack extends KeyframeTrack {\n\n\t/**\n\t * Constructs a new vector keyframe track.\n\t *\n\t * @param {string} name - The keyframe track's name.\n\t * @param {Array<number>} times - A list of keyframe times.\n\t * @param {Array<number>} values - A list of keyframe values.\n\t * @param {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)} [interpolation] - The interpolation type.\n\t */\n\tconstructor( name, times, values, interpolation ) {\n\n\t\tsuper( name, times, values, interpolation );\n\n\t}\n\n}\n\n/**\n * The value type name.\n *\n * @type {String}\n * @default 'vector'\n */\nVectorKeyframeTrack.prototype.ValueTypeName = 'vector';\n\n/**\n * A reusable set of keyframe tracks which represent an animation.\n */\nclass AnimationClip {\n\n\t/**\n\t * Constructs a new animation clip.\n\t *\n\t * Note: Instead of instantiating an AnimationClip directly with the constructor, you can\n\t * use the static interface of this class for creating clips. In most cases though, animation clips\n\t * will automatically be created by loaders when importing animated 3D assets.\n\t *\n\t * @param {string} [name=''] - The clip's name.\n\t * @param {number} [duration=-1] - The clip's duration in seconds. If a negative value is passed,\n\t * the duration will be calculated from the passed keyframes.\n\t * @param {Array<KeyframeTrack>} tracks - An array of keyframe tracks.\n\t * @param {(NormalAnimationBlendMode|AdditiveAnimationBlendMode)} [blendMode=NormalAnimationBlendMode] - Defines how the animation\n\t * is blended/combined when two or more animations are simultaneously played.\n\t */\n\tconstructor( name = '', duration = -1, tracks = [], blendMode = NormalAnimationBlendMode ) {\n\n\t\t/**\n\t\t * The clip's name.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = name;\n\n\t\t/**\n\t\t *  An array of keyframe tracks.\n\t\t *\n\t\t * @type {Array<KeyframeTrack>}\n\t\t */\n\t\tthis.tracks = tracks;\n\n\t\t/**\n\t\t * The clip's duration in seconds.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.duration = duration;\n\n\t\t/**\n\t\t * Defines how the animation is blended/combined when two or more animations\n\t\t * are simultaneously played.\n\t\t *\n\t\t * @type {(NormalAnimationBlendMode|AdditiveAnimationBlendMode)}\n\t\t */\n\t\tthis.blendMode = blendMode;\n\n\t\t/**\n\t\t * The UUID of the animation clip.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.uuid = generateUUID();\n\n\t\t/**\n\t\t * An object that can be used to store custom data about the animation clip.\n\t\t * It should not hold references to functions as these will not be cloned.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.userData = {};\n\n\t\t// this means it should figure out its duration by scanning the tracks\n\t\tif ( this.duration < 0 ) {\n\n\t\t\tthis.resetDuration();\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Factory method for creating an animation clip from the given JSON.\n\t *\n\t * @static\n\t * @param {Object} json - The serialized animation clip.\n\t * @return {AnimationClip} The new animation clip.\n\t */\n\tstatic parse( json ) {\n\n\t\tconst tracks = [],\n\t\t\tjsonTracks = json.tracks,\n\t\t\tframeTime = 1.0 / ( json.fps || 1.0 );\n\n\t\tfor ( let i = 0, n = jsonTracks.length; i !== n; ++ i ) {\n\n\t\t\ttracks.push( parseKeyframeTrack( jsonTracks[ i ] ).scale( frameTime ) );\n\n\t\t}\n\n\t\tconst clip = new this( json.name, json.duration, tracks, json.blendMode );\n\t\tclip.uuid = json.uuid;\n\n\t\tclip.userData = JSON.parse( json.userData || '{}' );\n\n\t\treturn clip;\n\n\t}\n\n\t/**\n\t * Serializes the given animation clip into JSON.\n\t *\n\t * @static\n\t * @param {AnimationClip} clip - The animation clip to serialize.\n\t * @return {Object} The JSON object.\n\t */\n\tstatic toJSON( clip ) {\n\n\t\tconst tracks = [],\n\t\t\tclipTracks = clip.tracks;\n\n\t\tconst json = {\n\n\t\t\t'name': clip.name,\n\t\t\t'duration': clip.duration,\n\t\t\t'tracks': tracks,\n\t\t\t'uuid': clip.uuid,\n\t\t\t'blendMode': clip.blendMode,\n\t\t\t'userData': JSON.stringify( clip.userData ),\n\n\t\t};\n\n\t\tfor ( let i = 0, n = clipTracks.length; i !== n; ++ i ) {\n\n\t\t\ttracks.push( KeyframeTrack.toJSON( clipTracks[ i ] ) );\n\n\t\t}\n\n\t\treturn json;\n\n\t}\n\n\t/**\n\t * Returns a new animation clip from the passed morph targets array of a\n\t * geometry, taking a name and the number of frames per second.\n\t *\n\t * Note: The fps parameter is required, but the animation speed can be\n\t * overridden via {@link AnimationAction#setDuration}.\n\t *\n\t * @static\n\t * @param {string} name - The name of the animation clip.\n\t * @param {Array<Object>} morphTargetSequence - A sequence of morph targets.\n\t * @param {number} fps - The Frames-Per-Second value.\n\t * @param {boolean} noLoop - Whether the clip should be no loop or not.\n\t * @return {AnimationClip} The new animation clip.\n\t */\n\tstatic CreateFromMorphTargetSequence( name, morphTargetSequence, fps, noLoop ) {\n\n\t\tconst numMorphTargets = morphTargetSequence.length;\n\t\tconst tracks = [];\n\n\t\tfor ( let i = 0; i < numMorphTargets; i ++ ) {\n\n\t\t\tlet times = [];\n\t\t\tlet values = [];\n\n\t\t\ttimes.push(\n\t\t\t\t( i + numMorphTargets - 1 ) % numMorphTargets,\n\t\t\t\ti,\n\t\t\t\t( i + 1 ) % numMorphTargets );\n\n\t\t\tvalues.push( 0, 1, 0 );\n\n\t\t\tconst order = getKeyframeOrder( times );\n\t\t\ttimes = sortedArray( times, 1, order );\n\t\t\tvalues = sortedArray( values, 1, order );\n\n\t\t\t// if there is a key at the first frame, duplicate it as the\n\t\t\t// last frame as well for perfect loop.\n\t\t\tif ( ! noLoop && times[ 0 ] === 0 ) {\n\n\t\t\t\ttimes.push( numMorphTargets );\n\t\t\t\tvalues.push( values[ 0 ] );\n\n\t\t\t}\n\n\t\t\ttracks.push(\n\t\t\t\tnew NumberKeyframeTrack(\n\t\t\t\t\t'.morphTargetInfluences[' + morphTargetSequence[ i ].name + ']',\n\t\t\t\t\ttimes, values\n\t\t\t\t).scale( 1.0 / fps ) );\n\n\t\t}\n\n\t\treturn new this( name, -1, tracks );\n\n\t}\n\n\t/**\n\t * Searches for an animation clip by name, taking as its first parameter\n\t * either an array of clips, or a mesh or geometry that contains an\n\t * array named \"animations\" property.\n\t *\n\t * @static\n\t * @param {(Array<AnimationClip>|Object3D)} objectOrClipArray - The array or object to search through.\n\t * @param {string} name - The name to search for.\n\t * @return {?AnimationClip} The found animation clip. Returns `null` if no clip has been found.\n\t */\n\tstatic findByName( objectOrClipArray, name ) {\n\n\t\tlet clipArray = objectOrClipArray;\n\n\t\tif ( ! Array.isArray( objectOrClipArray ) ) {\n\n\t\t\tconst o = objectOrClipArray;\n\t\t\tclipArray = o.geometry && o.geometry.animations || o.animations;\n\n\t\t}\n\n\t\tfor ( let i = 0; i < clipArray.length; i ++ ) {\n\n\t\t\tif ( clipArray[ i ].name === name ) {\n\n\t\t\t\treturn clipArray[ i ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\t/**\n\t * Returns an array of new AnimationClips created from the morph target\n\t * sequences of a geometry, trying to sort morph target names into\n\t * animation-group-based patterns like \"Walk_001, Walk_002, Run_001, Run_002...\".\n\t *\n\t * See {@link MD2Loader#parse} as an example for how the method should be used.\n\t *\n\t * @static\n\t * @param {Array<Object>} morphTargets - A sequence of morph targets.\n\t * @param {number} fps - The Frames-Per-Second value.\n\t * @param {boolean} noLoop - Whether the clip should be no loop or not.\n\t * @return {Array<AnimationClip>} An array of new animation clips.\n\t */\n\tstatic CreateClipsFromMorphTargetSequences( morphTargets, fps, noLoop ) {\n\n\t\tconst animationToMorphTargets = {};\n\n\t\t// tested with https://regex101.com/ on trick sequences\n\t\t// such flamingo_flyA_003, flamingo_run1_003, crdeath0059\n\t\tconst pattern = /^([\\w-]*?)([\\d]+)$/;\n\n\t\t// sort morph target names into animation groups based\n\t\t// patterns like Walk_001, Walk_002, Run_001, Run_002\n\t\tfor ( let i = 0, il = morphTargets.length; i < il; i ++ ) {\n\n\t\t\tconst morphTarget = morphTargets[ i ];\n\t\t\tconst parts = morphTarget.name.match( pattern );\n\n\t\t\tif ( parts && parts.length > 1 ) {\n\n\t\t\t\tconst name = parts[ 1 ];\n\n\t\t\t\tlet animationMorphTargets = animationToMorphTargets[ name ];\n\n\t\t\t\tif ( ! animationMorphTargets ) {\n\n\t\t\t\t\tanimationToMorphTargets[ name ] = animationMorphTargets = [];\n\n\t\t\t\t}\n\n\t\t\t\tanimationMorphTargets.push( morphTarget );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst clips = [];\n\n\t\tfor ( const name in animationToMorphTargets ) {\n\n\t\t\tclips.push( this.CreateFromMorphTargetSequence( name, animationToMorphTargets[ name ], fps, noLoop ) );\n\n\t\t}\n\n\t\treturn clips;\n\n\t}\n\n\t/**\n\t * Parses the `animation.hierarchy` format and returns a new animation clip.\n\t *\n\t * @static\n\t * @deprecated since r175.\n\t * @param {Object} animation - A serialized animation clip as JSON.\n\t * @param {Array<Bones>} bones - An array of bones.\n\t * @return {?AnimationClip} The new animation clip.\n\t */\n\tstatic parseAnimation( animation, bones ) {\n\n\t\twarn( 'AnimationClip: parseAnimation() is deprecated and will be removed with r185' );\n\n\t\tif ( ! animation ) {\n\n\t\t\terror( 'AnimationClip: No animation in JSONLoader data.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst addNonemptyTrack = function ( trackType, trackName, animationKeys, propertyName, destTracks ) {\n\n\t\t\t// only return track if there are actually keys.\n\t\t\tif ( animationKeys.length !== 0 ) {\n\n\t\t\t\tconst times = [];\n\t\t\t\tconst values = [];\n\n\t\t\t\tflattenJSON( animationKeys, times, values, propertyName );\n\n\t\t\t\t// empty keys are filtered out, so check again\n\t\t\t\tif ( times.length !== 0 ) {\n\n\t\t\t\t\tdestTracks.push( new trackType( trackName, times, values ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\tconst tracks = [];\n\n\t\tconst clipName = animation.name || 'default';\n\t\tconst fps = animation.fps || 30;\n\t\tconst blendMode = animation.blendMode;\n\n\t\t// automatic length determination in AnimationClip.\n\t\tlet duration = animation.length || -1;\n\n\t\tconst hierarchyTracks = animation.hierarchy || [];\n\n\t\tfor ( let h = 0; h < hierarchyTracks.length; h ++ ) {\n\n\t\t\tconst animationKeys = hierarchyTracks[ h ].keys;\n\n\t\t\t// skip empty tracks\n\t\t\tif ( ! animationKeys || animationKeys.length === 0 ) continue;\n\n\t\t\t// process morph targets\n\t\t\tif ( animationKeys[ 0 ].morphTargets ) {\n\n\t\t\t\t// figure out all morph targets used in this track\n\t\t\t\tconst morphTargetNames = {};\n\n\t\t\t\tlet k;\n\n\t\t\t\tfor ( k = 0; k < animationKeys.length; k ++ ) {\n\n\t\t\t\t\tif ( animationKeys[ k ].morphTargets ) {\n\n\t\t\t\t\t\tfor ( let m = 0; m < animationKeys[ k ].morphTargets.length; m ++ ) {\n\n\t\t\t\t\t\t\tmorphTargetNames[ animationKeys[ k ].morphTargets[ m ] ] = -1;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// create a track for each morph target with all zero\n\t\t\t\t// morphTargetInfluences except for the keys in which\n\t\t\t\t// the morphTarget is named.\n\t\t\t\tfor ( const morphTargetName in morphTargetNames ) {\n\n\t\t\t\t\tconst times = [];\n\t\t\t\t\tconst values = [];\n\n\t\t\t\t\tfor ( let m = 0; m !== animationKeys[ k ].morphTargets.length; ++ m ) {\n\n\t\t\t\t\t\tconst animationKey = animationKeys[ k ];\n\n\t\t\t\t\t\ttimes.push( animationKey.time );\n\t\t\t\t\t\tvalues.push( ( animationKey.morphTarget === morphTargetName ) ? 1 : 0 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttracks.push( new NumberKeyframeTrack( '.morphTargetInfluence[' + morphTargetName + ']', times, values ) );\n\n\t\t\t\t}\n\n\t\t\t\tduration = morphTargetNames.length * fps;\n\n\t\t\t} else {\n\n\t\t\t\t// ...assume skeletal animation\n\n\t\t\t\tconst boneName = '.bones[' + bones[ h ].name + ']';\n\n\t\t\t\taddNonemptyTrack(\n\t\t\t\t\tVectorKeyframeTrack, boneName + '.position',\n\t\t\t\t\tanimationKeys, 'pos', tracks );\n\n\t\t\t\taddNonemptyTrack(\n\t\t\t\t\tQuaternionKeyframeTrack, boneName + '.quaternion',\n\t\t\t\t\tanimationKeys, 'rot', tracks );\n\n\t\t\t\taddNonemptyTrack(\n\t\t\t\t\tVectorKeyframeTrack, boneName + '.scale',\n\t\t\t\t\tanimationKeys, 'scl', tracks );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( tracks.length === 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst clip = new this( clipName, duration, tracks, blendMode );\n\n\t\treturn clip;\n\n\t}\n\n\t/**\n\t * Sets the duration of this clip to the duration of its longest keyframe track.\n\t *\n\t * @return {AnimationClip} A reference to this animation clip.\n\t */\n\tresetDuration() {\n\n\t\tconst tracks = this.tracks;\n\t\tlet duration = 0;\n\n\t\tfor ( let i = 0, n = tracks.length; i !== n; ++ i ) {\n\n\t\t\tconst track = this.tracks[ i ];\n\n\t\t\tduration = Math.max( duration, track.times[ track.times.length - 1 ] );\n\n\t\t}\n\n\t\tthis.duration = duration;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Trims all tracks to the clip's duration.\n\t *\n\t * @return {AnimationClip} A reference to this animation clip.\n\t */\n\ttrim() {\n\n\t\tfor ( let i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\tthis.tracks[ i ].trim( 0, this.duration );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Performs minimal validation on each track in the clip. Returns `true` if all\n\t * tracks are valid.\n\t *\n\t * @return {boolean} Whether the clip's keyframes are valid or not.\n\t */\n\tvalidate() {\n\n\t\tlet valid = true;\n\n\t\tfor ( let i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\tvalid = valid && this.tracks[ i ].validate();\n\n\t\t}\n\n\t\treturn valid;\n\n\t}\n\n\t/**\n\t * Optimizes each track by removing equivalent sequential keys (which are\n\t * common in morph target sequences).\n\t *\n\t * @return {AnimationClip} A reference to this animation clip.\n\t */\n\toptimize() {\n\n\t\tfor ( let i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\tthis.tracks[ i ].optimize();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new animation clip with copied values from this instance.\n\t *\n\t * @return {AnimationClip} A clone of this instance.\n\t */\n\tclone() {\n\n\t\tconst tracks = [];\n\n\t\tfor ( let i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\ttracks.push( this.tracks[ i ].clone() );\n\n\t\t}\n\n\t\tconst clip = new this.constructor( this.name, this.duration, tracks, this.blendMode );\n\n\t\tclip.userData = JSON.parse( JSON.stringify( this.userData ) );\n\n\t\treturn clip;\n\n\t}\n\n\t/**\n\t * Serializes this animation clip into JSON.\n\t *\n\t * @return {Object} The JSON object.\n\t */\n\ttoJSON() {\n\n\t\treturn this.constructor.toJSON( this );\n\n\t}\n\n}\n\nfunction getTrackTypeForValueTypeName( typeName ) {\n\n\tswitch ( typeName.toLowerCase() ) {\n\n\t\tcase 'scalar':\n\t\tcase 'double':\n\t\tcase 'float':\n\t\tcase 'number':\n\t\tcase 'integer':\n\n\t\t\treturn NumberKeyframeTrack;\n\n\t\tcase 'vector':\n\t\tcase 'vector2':\n\t\tcase 'vector3':\n\t\tcase 'vector4':\n\n\t\t\treturn VectorKeyframeTrack;\n\n\t\tcase 'color':\n\n\t\t\treturn ColorKeyframeTrack;\n\n\t\tcase 'quaternion':\n\n\t\t\treturn QuaternionKeyframeTrack;\n\n\t\tcase 'bool':\n\t\tcase 'boolean':\n\n\t\t\treturn BooleanKeyframeTrack;\n\n\t\tcase 'string':\n\n\t\t\treturn StringKeyframeTrack;\n\n\t}\n\n\tthrow new Error( 'THREE.KeyframeTrack: Unsupported typeName: ' + typeName );\n\n}\n\nfunction parseKeyframeTrack( json ) {\n\n\tif ( json.type === undefined ) {\n\n\t\tthrow new Error( 'THREE.KeyframeTrack: track type undefined, can not parse' );\n\n\t}\n\n\tconst trackType = getTrackTypeForValueTypeName( json.type );\n\n\tif ( json.times === undefined ) {\n\n\t\tconst times = [], values = [];\n\n\t\tflattenJSON( json.keys, times, values, 'value' );\n\n\t\tjson.times = times;\n\t\tjson.values = values;\n\n\t}\n\n\t// derived classes can define a static parse method\n\tif ( trackType.parse !== undefined ) {\n\n\t\treturn trackType.parse( json );\n\n\t} else {\n\n\t\t// by default, we assume a constructor compatible with the base\n\t\treturn new trackType( json.name, json.times, json.values, json.interpolation );\n\n\t}\n\n}\n\n/**\n * @class\n * @classdesc A simple caching system, used internally by {@link FileLoader}.\n * To enable caching across all loaders that use {@link FileLoader}, add `THREE.Cache.enabled = true.` once in your app.\n * @hideconstructor\n */\nconst Cache = {\n\n\t/**\n\t * Whether caching is enabled or not.\n\t *\n\t * @static\n\t * @type {boolean}\n\t * @default false\n\t */\n\tenabled: false,\n\n\t/**\n\t * A dictionary that holds cached files.\n\t *\n\t * @static\n\t * @type {Object<string,Object>}\n\t */\n\tfiles: {},\n\n\t/**\n\t * Adds a cache entry with a key to reference the file. If this key already\n\t * holds a file, it is overwritten.\n\t *\n\t * @static\n\t * @param {string} key - The key to reference the cached file.\n\t * @param {Object} file -  The file to be cached.\n\t */\n\tadd: function ( key, file ) {\n\n\t\tif ( this.enabled === false ) return;\n\n\t\t// log( 'Cache', 'Adding key:', key );\n\n\t\tthis.files[ key ] = file;\n\n\t},\n\n\t/**\n\t * Gets the cached value for the given key.\n\t *\n\t * @static\n\t * @param {string} key - The key to reference the cached file.\n\t * @return {Object|undefined} The cached file. If the key does not exist `undefined` is returned.\n\t */\n\tget: function ( key ) {\n\n\t\tif ( this.enabled === false ) return;\n\n\t\t// log( 'Cache', 'Checking key:', key );\n\n\t\treturn this.files[ key ];\n\n\t},\n\n\t/**\n\t * Removes the cached file associated with the given key.\n\t *\n\t * @static\n\t * @param {string} key - The key to reference the cached file.\n\t */\n\tremove: function ( key ) {\n\n\t\tdelete this.files[ key ];\n\n\t},\n\n\t/**\n\t * Remove all values from the cache.\n\t *\n\t * @static\n\t */\n\tclear: function () {\n\n\t\tthis.files = {};\n\n\t}\n\n};\n\n/**\n * Handles and keeps track of loaded and pending data. A default global\n * instance of this class is created and used by loaders if not supplied\n * manually.\n *\n * In general that should be sufficient, however there are times when it can\n * be useful to have separate loaders - for example if you want to show\n * separate loading bars for objects and textures.\n *\n * ```js\n * const manager = new THREE.LoadingManager();\n * manager.onLoad = () => console.log( 'Loading complete!' );\n *\n * const loader1 = new OBJLoader( manager );\n * const loader2 = new ColladaLoader( manager );\n * ```\n */\nclass LoadingManager {\n\n\t/**\n\t * Constructs a new loading manager.\n\t *\n\t * @param {Function} [onLoad] - Executes when all items have been loaded.\n\t * @param {Function} [onProgress] - Executes when single items have been loaded.\n\t * @param {Function} [onError] - Executes when an error occurs.\n\t */\n\tconstructor( onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tlet isLoading = false;\n\t\tlet itemsLoaded = 0;\n\t\tlet itemsTotal = 0;\n\t\tlet urlModifier = undefined;\n\t\tconst handlers = [];\n\n\t\t// Refer to #5689 for the reason why we don't set .onStart\n\t\t// in the constructor\n\n\t\t/**\n\t\t * Executes when an item starts loading.\n\t\t *\n\t\t * @type {Function|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.onStart = undefined;\n\n\t\t/**\n\t\t * Executes when all items have been loaded.\n\t\t *\n\t\t * @type {Function|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.onLoad = onLoad;\n\n\t\t/**\n\t\t * Executes when single items have been loaded.\n\t\t *\n\t\t * @type {Function|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.onProgress = onProgress;\n\n\t\t/**\n\t\t * Executes when an error occurs.\n\t\t *\n\t\t * @type {Function|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.onError = onError;\n\n\t\t/**\n\t\t * Used for aborting ongoing requests in loaders using this manager.\n\t\t *\n\t\t * @private\n\t\t * @type {AbortController | null}\n\t\t */\n\t\tthis._abortController = null;\n\n\t\t/**\n\t\t * This should be called by any loader using the manager when the loader\n\t\t * starts loading an item.\n\t\t *\n\t\t * @param {string} url - The URL to load.\n\t\t */\n\t\tthis.itemStart = function ( url ) {\n\n\t\t\titemsTotal ++;\n\n\t\t\tif ( isLoading === false ) {\n\n\t\t\t\tif ( scope.onStart !== undefined ) {\n\n\t\t\t\t\tscope.onStart( url, itemsLoaded, itemsTotal );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tisLoading = true;\n\n\t\t};\n\n\t\t/**\n\t\t * This should be called by any loader using the manager when the loader\n\t\t * ended loading an item.\n\t\t *\n\t\t * @param {string} url - The URL of the loaded item.\n\t\t */\n\t\tthis.itemEnd = function ( url ) {\n\n\t\t\titemsLoaded ++;\n\n\t\t\tif ( scope.onProgress !== undefined ) {\n\n\t\t\t\tscope.onProgress( url, itemsLoaded, itemsTotal );\n\n\t\t\t}\n\n\t\t\tif ( itemsLoaded === itemsTotal ) {\n\n\t\t\t\tisLoading = false;\n\n\t\t\t\tif ( scope.onLoad !== undefined ) {\n\n\t\t\t\t\tscope.onLoad();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * This should be called by any loader using the manager when the loader\n\t\t * encounters an error when loading an item.\n\t\t *\n\t\t * @param {string} url - The URL of the item that produces an error.\n\t\t */\n\t\tthis.itemError = function ( url ) {\n\n\t\t\tif ( scope.onError !== undefined ) {\n\n\t\t\t\tscope.onError( url );\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Given a URL, uses the URL modifier callback (if any) and returns a\n\t\t * resolved URL. If no URL modifier is set, returns the original URL.\n\t\t *\n\t\t * @param {string} url - The URL to load.\n\t\t * @return {string} The resolved URL.\n\t\t */\n\t\tthis.resolveURL = function ( url ) {\n\n\t\t\tif ( urlModifier ) {\n\n\t\t\t\treturn urlModifier( url );\n\n\t\t\t}\n\n\t\t\treturn url;\n\n\t\t};\n\n\t\t/**\n\t\t * If provided, the callback will be passed each resource URL before a\n\t\t * request is sent. The callback may return the original URL, or a new URL to\n\t\t * override loading behavior. This behavior can be used to load assets from\n\t\t * .ZIP files, drag-and-drop APIs, and Data URIs.\n\t\t *\n\t\t * ```js\n\t\t * const blobs = {'fish.gltf': blob1, 'diffuse.png': blob2, 'normal.png': blob3};\n\t\t *\n\t\t * const manager = new THREE.LoadingManager();\n\t\t *\n\t\t * // Initialize loading manager with URL callback.\n\t\t * const objectURLs = [];\n\t\t * manager.setURLModifier( ( url ) => {\n\t\t *\n\t\t * \turl = URL.createObjectURL( blobs[ url ] );\n\t\t * \tobjectURLs.push( url );\n\t\t * \treturn url;\n\t\t *\n\t\t * } );\n\t\t *\n\t\t * // Load as usual, then revoke the blob URLs.\n\t\t * const loader = new GLTFLoader( manager );\n\t\t * loader.load( 'fish.gltf', (gltf) => {\n\t\t *\n\t\t * \tscene.add( gltf.scene );\n\t\t * \tobjectURLs.forEach( ( url ) => URL.revokeObjectURL( url ) );\n\t\t *\n\t\t * } );\n\t\t * ```\n\t\t *\n\t\t * @param {function(string):string} transform - URL modifier callback. Called with an URL and must return a resolved URL.\n\t\t * @return {LoadingManager} A reference to this loading manager.\n\t\t */\n\t\tthis.setURLModifier = function ( transform ) {\n\n\t\t\turlModifier = transform;\n\n\t\t\treturn this;\n\n\t\t};\n\n\t\t/**\n\t\t * Registers a loader with the given regular expression. Can be used to\n\t\t * define what loader should be used in order to load specific files. A\n\t\t * typical use case is to overwrite the default loader for textures.\n\t\t *\n\t\t * ```js\n\t\t * // add handler for TGA textures\n\t\t * manager.addHandler( /\\.tga$/i, new TGALoader() );\n\t\t * ```\n\t\t *\n\t\t * @param {string} regex - A regular expression.\n\t\t * @param {Loader} loader - A loader that should handle matched cases.\n\t\t * @return {LoadingManager} A reference to this loading manager.\n\t\t */\n\t\tthis.addHandler = function ( regex, loader ) {\n\n\t\t\thandlers.push( regex, loader );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t\t/**\n\t\t * Removes the loader for the given regular expression.\n\t\t *\n\t\t * @param {string} regex - A regular expression.\n\t\t * @return {LoadingManager} A reference to this loading manager.\n\t\t */\n\t\tthis.removeHandler = function ( regex ) {\n\n\t\t\tconst index = handlers.indexOf( regex );\n\n\t\t\tif ( index !== -1 ) {\n\n\t\t\t\thandlers.splice( index, 2 );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t};\n\n\t\t/**\n\t\t * Can be used to retrieve the registered loader for the given file path.\n\t\t *\n\t\t * @param {string} file - The file path.\n\t\t * @return {?Loader} The registered loader. Returns `null` if no loader was found.\n\t\t */\n\t\tthis.getHandler = function ( file ) {\n\n\t\t\tfor ( let i = 0, l = handlers.length; i < l; i += 2 ) {\n\n\t\t\t\tconst regex = handlers[ i ];\n\t\t\t\tconst loader = handlers[ i + 1 ];\n\n\t\t\t\tif ( regex.global ) regex.lastIndex = 0; // see #17920\n\n\t\t\t\tif ( regex.test( file ) ) {\n\n\t\t\t\t\treturn loader;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn null;\n\n\t\t};\n\n\t\t/**\n\t\t * Can be used to abort ongoing loading requests in loaders using this manager.\n\t\t * The abort only works if the loaders implement {@link Loader#abort} and `AbortSignal.any()`\n\t\t * is supported in the browser.\n\t\t *\n\t\t * @return {LoadingManager} A reference to this loading manager.\n\t\t */\n\t\tthis.abort = function () {\n\n\n\t\t\tthis.abortController.abort();\n\t\t\tthis._abortController = null;\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}\n\n\t// TODO: Revert this back to a single member variable once this issue has been fixed\n\t// https://github.com/cloudflare/workerd/issues/3657\n\n\t/**\n\t * Used for aborting ongoing requests in loaders using this manager.\n\t *\n\t * @type {AbortController}\n\t */\n\tget abortController() {\n\n\t\tif ( ! this._abortController ) {\n\n\t\t\tthis._abortController = new AbortController();\n\n\t\t}\n\n\t\treturn this._abortController;\n\n\t}\n\n}\n\n/**\n * The global default loading manager.\n *\n * @constant\n * @type {LoadingManager}\n */\nconst DefaultLoadingManager = /*@__PURE__*/ new LoadingManager();\n\n/**\n * Abstract base class for loaders.\n *\n * @abstract\n */\nclass Loader {\n\n\t/**\n\t * Constructs a new loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\t/**\n\t\t * The loading manager.\n\t\t *\n\t\t * @type {LoadingManager}\n\t\t * @default DefaultLoadingManager\n\t\t */\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t\t/**\n\t\t * The crossOrigin string to implement CORS for loading the url from a\n\t\t * different domain that allows CORS.\n\t\t *\n\t\t * @type {string}\n\t\t * @default 'anonymous'\n\t\t */\n\t\tthis.crossOrigin = 'anonymous';\n\n\t\t/**\n\t\t * Whether the XMLHttpRequest uses credentials.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.withCredentials = false;\n\n\t\t/**\n\t\t * The base path from which the asset will be loaded.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.path = '';\n\n\t\t/**\n\t\t * The base path from which additional resources like textures will be loaded.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.resourcePath = '';\n\n\t\t/**\n\t\t * The [request header](https://developer.mozilla.org/en-US/docs/Glossary/Request_header)\n\t\t * used in HTTP request.\n\t\t *\n\t\t * @type {Object<string, any>}\n\t\t */\n\t\tthis.requestHeader = {};\n\n\t}\n\n\t/**\n\t * This method needs to be implemented by all concrete loaders. It holds the\n\t * logic for loading assets from the backend.\n\t *\n\t * @abstract\n\t * @param {string} url - The path/URL of the file to be loaded.\n\t * @param {Function} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} [onProgress] - Executed while the loading is in progress.\n\t * @param {onErrorCallback} [onError] - Executed when errors occur.\n\t */\n\tload( /* url, onLoad, onProgress, onError */ ) {}\n\n\t/**\n\t * A async version of {@link Loader#load}.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded.\n\t * @param {onProgressCallback} [onProgress] - Executed while the loading is in progress.\n\t * @return {Promise} A Promise that resolves when the asset has been loaded.\n\t */\n\tloadAsync( url, onProgress ) {\n\n\t\tconst scope = this;\n\n\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\tscope.load( url, resolve, onProgress, reject );\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * This method needs to be implemented by all concrete loaders. It holds the\n\t * logic for parsing the asset into three.js entities.\n\t *\n\t * @abstract\n\t * @param {any} data - The data to parse.\n\t */\n\tparse( /* data */ ) {}\n\n\t/**\n\t * Sets the `crossOrigin` String to implement CORS for loading the URL\n\t * from a different domain that allows CORS.\n\t *\n\t * @param {string} crossOrigin - The `crossOrigin` value.\n\t * @return {Loader} A reference to this instance.\n\t */\n\tsetCrossOrigin( crossOrigin ) {\n\n\t\tthis.crossOrigin = crossOrigin;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Whether the XMLHttpRequest uses credentials such as cookies, authorization\n\t * headers or TLS client certificates, see [XMLHttpRequest.withCredentials](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/withCredentials).\n\t *\n\t * Note: This setting has no effect if you are loading files locally or from the same domain.\n\t *\n\t * @param {boolean} value - The `withCredentials` value.\n\t * @return {Loader} A reference to this instance.\n\t */\n\tsetWithCredentials( value ) {\n\n\t\tthis.withCredentials = value;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the base path for the asset.\n\t *\n\t * @param {string} path - The base path.\n\t * @return {Loader} A reference to this instance.\n\t */\n\tsetPath( path ) {\n\n\t\tthis.path = path;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the base path for dependent resources like textures.\n\t *\n\t * @param {string} resourcePath - The resource path.\n\t * @return {Loader} A reference to this instance.\n\t */\n\tsetResourcePath( resourcePath ) {\n\n\t\tthis.resourcePath = resourcePath;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given request header.\n\t *\n\t * @param {Object} requestHeader - A [request header](https://developer.mozilla.org/en-US/docs/Glossary/Request_header)\n\t * for configuring the HTTP request.\n\t * @return {Loader} A reference to this instance.\n\t */\n\tsetRequestHeader( requestHeader ) {\n\n\t\tthis.requestHeader = requestHeader;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * This method can be implemented in loaders for aborting ongoing requests.\n\t *\n\t * @abstract\n\t * @return {Loader} A reference to this instance.\n\t */\n\tabort() {\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * Callback for onProgress in loaders.\n *\n * @callback onProgressCallback\n * @param {ProgressEvent} event - An instance of `ProgressEvent` that represents the current loading status.\n */\n\n/**\n * Callback for onError in loaders.\n *\n * @callback onErrorCallback\n * @param {Error} error - The error which occurred during the loading process.\n */\n\n/**\n * The default material name that is used by loaders\n * when creating materials for loaded 3D objects.\n *\n * Note: Not all loaders might honor this setting.\n *\n * @static\n * @type {string}\n * @default '__DEFAULT'\n */\nLoader.DEFAULT_MATERIAL_NAME = '__DEFAULT';\n\nconst loading = {};\n\nclass HttpError extends Error {\n\n\tconstructor( message, response ) {\n\n\t\tsuper( message );\n\t\tthis.response = response;\n\n\t}\n\n}\n\n/**\n * A low level class for loading resources with the Fetch API, used internally by\n * most loaders. It can also be used directly to load any file type that does\n * not have a loader.\n *\n * This loader supports caching. If you want to use it, add `THREE.Cache.enabled = true;`\n * once to your application.\n *\n * ```js\n * const loader = new THREE.FileLoader();\n * const data = await loader.loadAsync( 'example.txt' );\n * ```\n *\n * @augments Loader\n */\nclass FileLoader extends Loader {\n\n\t/**\n\t * Constructs a new file loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\t/**\n\t\t * The expected mime type. Valid values can be found\n\t\t * [here](hhttps://developer.mozilla.org/en-US/docs/Web/API/DOMParser/parseFromString#mimetype)\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.mimeType = '';\n\n\t\t/**\n\t\t * The expected response type.\n\t\t *\n\t\t * @type {('arraybuffer'|'blob'|'document'|'json'|'')}\n\t\t * @default ''\n\t\t */\n\t\tthis.responseType = '';\n\n\t\t/**\n\t\t * Used for aborting requests.\n\t\t *\n\t\t * @private\n\t\t * @type {AbortController}\n\t\t */\n\t\tthis._abortController = new AbortController();\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and pass the loaded response to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(any)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} [onProgress] - Executed while the loading is in progress.\n\t * @param {onErrorCallback} [onError] - Executed when errors occur.\n\t * @return {any|undefined} The cached resource if available.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tif ( url === undefined ) url = '';\n\n\t\tif ( this.path !== undefined ) url = this.path + url;\n\n\t\turl = this.manager.resolveURL( url );\n\n\t\tconst cached = Cache.get( `file:${url}` );\n\n\t\tif ( cached !== undefined ) {\n\n\t\t\tthis.manager.itemStart( url );\n\n\t\t\tsetTimeout( () => {\n\n\t\t\t\tif ( onLoad ) onLoad( cached );\n\n\t\t\t\tthis.manager.itemEnd( url );\n\n\t\t\t}, 0 );\n\n\t\t\treturn cached;\n\n\t\t}\n\n\t\t// Check if request is duplicate\n\n\t\tif ( loading[ url ] !== undefined ) {\n\n\t\t\tloading[ url ].push( {\n\n\t\t\t\tonLoad: onLoad,\n\t\t\t\tonProgress: onProgress,\n\t\t\t\tonError: onError\n\n\t\t\t} );\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t// Initialise array for duplicate requests\n\t\tloading[ url ] = [];\n\n\t\tloading[ url ].push( {\n\t\t\tonLoad: onLoad,\n\t\t\tonProgress: onProgress,\n\t\t\tonError: onError,\n\t\t} );\n\n\t\t// create request\n\t\tconst req = new Request( url, {\n\t\t\theaders: new Headers( this.requestHeader ),\n\t\t\tcredentials: this.withCredentials ? 'include' : 'same-origin',\n\t\t\tsignal: ( typeof AbortSignal.any === 'function' ) ? AbortSignal.any( [ this._abortController.signal, this.manager.abortController.signal ] ) : this._abortController.signal\n\t\t} );\n\n\t\t// record states ( avoid data race )\n\t\tconst mimeType = this.mimeType;\n\t\tconst responseType = this.responseType;\n\n\t\t// start the fetch\n\t\tfetch( req )\n\t\t\t.then( response => {\n\n\t\t\t\tif ( response.status === 200 || response.status === 0 ) {\n\n\t\t\t\t\t// Some browsers return HTTP Status 0 when using non-http protocol\n\t\t\t\t\t// e.g. 'file://' or 'data://'. Handle as success.\n\n\t\t\t\t\tif ( response.status === 0 ) {\n\n\t\t\t\t\t\twarn( 'FileLoader: HTTP Status 0 received.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Workaround: Checking if response.body === undefined for Alipay browser #23548\n\n\t\t\t\t\tif ( typeof ReadableStream === 'undefined' || response.body === undefined || response.body.getReader === undefined ) {\n\n\t\t\t\t\t\treturn response;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst callbacks = loading[ url ];\n\t\t\t\t\tconst reader = response.body.getReader();\n\n\t\t\t\t\t// Nginx needs X-File-Size check\n\t\t\t\t\t// https://serverfault.com/questions/482875/why-does-nginx-remove-content-length-header-for-chunked-content\n\t\t\t\t\tconst contentLength = response.headers.get( 'X-File-Size' ) || response.headers.get( 'Content-Length' );\n\t\t\t\t\tconst total = contentLength ? parseInt( contentLength ) : 0;\n\t\t\t\t\tconst lengthComputable = total !== 0;\n\t\t\t\t\tlet loaded = 0;\n\n\t\t\t\t\t// periodically read data into the new stream tracking while download progress\n\t\t\t\t\tconst stream = new ReadableStream( {\n\t\t\t\t\t\tstart( controller ) {\n\n\t\t\t\t\t\t\treadData();\n\n\t\t\t\t\t\t\tfunction readData() {\n\n\t\t\t\t\t\t\t\treader.read().then( ( { done, value } ) => {\n\n\t\t\t\t\t\t\t\t\tif ( done ) {\n\n\t\t\t\t\t\t\t\t\t\tcontroller.close();\n\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\tloaded += value.byteLength;\n\n\t\t\t\t\t\t\t\t\t\tconst event = new ProgressEvent( 'progress', { lengthComputable, loaded, total } );\n\t\t\t\t\t\t\t\t\t\tfor ( let i = 0, il = callbacks.length; i < il; i ++ ) {\n\n\t\t\t\t\t\t\t\t\t\t\tconst callback = callbacks[ i ];\n\t\t\t\t\t\t\t\t\t\t\tif ( callback.onProgress ) callback.onProgress( event );\n\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tcontroller.enqueue( value );\n\t\t\t\t\t\t\t\t\t\treadData();\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t}, ( e ) => {\n\n\t\t\t\t\t\t\t\t\tcontroller.error( e );\n\n\t\t\t\t\t\t\t\t} );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} );\n\n\t\t\t\t\treturn new Response( stream );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new HttpError( `fetch for \"${response.url}\" responded with ${response.status}: ${response.statusText}`, response );\n\n\t\t\t\t}\n\n\t\t\t} )\n\t\t\t.then( response => {\n\n\t\t\t\tswitch ( responseType ) {\n\n\t\t\t\t\tcase 'arraybuffer':\n\n\t\t\t\t\t\treturn response.arrayBuffer();\n\n\t\t\t\t\tcase 'blob':\n\n\t\t\t\t\t\treturn response.blob();\n\n\t\t\t\t\tcase 'document':\n\n\t\t\t\t\t\treturn response.text()\n\t\t\t\t\t\t\t.then( text => {\n\n\t\t\t\t\t\t\t\tconst parser = new DOMParser();\n\t\t\t\t\t\t\t\treturn parser.parseFromString( text, mimeType );\n\n\t\t\t\t\t\t\t} );\n\n\t\t\t\t\tcase 'json':\n\n\t\t\t\t\t\treturn response.json();\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tif ( mimeType === '' ) {\n\n\t\t\t\t\t\t\treturn response.text();\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// sniff encoding\n\t\t\t\t\t\t\tconst re = /charset=\"?([^;\"\\s]*)\"?/i;\n\t\t\t\t\t\t\tconst exec = re.exec( mimeType );\n\t\t\t\t\t\t\tconst label = exec && exec[ 1 ] ? exec[ 1 ].toLowerCase() : undefined;\n\t\t\t\t\t\t\tconst decoder = new TextDecoder( label );\n\t\t\t\t\t\t\treturn response.arrayBuffer().then( ab => decoder.decode( ab ) );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} )\n\t\t\t.then( data => {\n\n\t\t\t\t// Add to cache only on HTTP success, so that we do not cache\n\t\t\t\t// error response bodies as proper responses to requests.\n\t\t\t\tCache.add( `file:${url}`, data );\n\n\t\t\t\tconst callbacks = loading[ url ];\n\t\t\t\tdelete loading[ url ];\n\n\t\t\t\tfor ( let i = 0, il = callbacks.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst callback = callbacks[ i ];\n\t\t\t\t\tif ( callback.onLoad ) callback.onLoad( data );\n\n\t\t\t\t}\n\n\t\t\t} )\n\t\t\t.catch( err => {\n\n\t\t\t\t// Abort errors and other errors are handled the same\n\n\t\t\t\tconst callbacks = loading[ url ];\n\n\t\t\t\tif ( callbacks === undefined ) {\n\n\t\t\t\t\t// When onLoad was called and url was deleted in `loading`\n\t\t\t\t\tthis.manager.itemError( url );\n\t\t\t\t\tthrow err;\n\n\t\t\t\t}\n\n\t\t\t\tdelete loading[ url ];\n\n\t\t\t\tfor ( let i = 0, il = callbacks.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst callback = callbacks[ i ];\n\t\t\t\t\tif ( callback.onError ) callback.onError( err );\n\n\t\t\t\t}\n\n\t\t\t\tthis.manager.itemError( url );\n\n\t\t\t} )\n\t\t\t.finally( () => {\n\n\t\t\t\tthis.manager.itemEnd( url );\n\n\t\t\t} );\n\n\t\tthis.manager.itemStart( url );\n\n\t}\n\n\t/**\n\t * Sets the expected response type.\n\t *\n\t * @param {('arraybuffer'|'blob'|'document'|'json'|'')} value - The response type.\n\t * @return {FileLoader} A reference to this file loader.\n\t */\n\tsetResponseType( value ) {\n\n\t\tthis.responseType = value;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the expected mime type of the loaded file.\n\t *\n\t * @param {string} value - The mime type.\n\t * @return {FileLoader} A reference to this file loader.\n\t */\n\tsetMimeType( value ) {\n\n\t\tthis.mimeType = value;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Aborts ongoing fetch requests.\n\t *\n\t * @return {FileLoader} A reference to this instance.\n\t */\n\tabort() {\n\n\t\tthis._abortController.abort();\n\t\tthis._abortController = new AbortController();\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * Class for loading animation clips in the JSON format. The files are internally\n * loaded via {@link FileLoader}.\n *\n * ```js\n * const loader = new THREE.AnimationLoader();\n * const animations = await loader.loadAsync( 'animations/animation.js' );\n * ```\n *\n * @augments Loader\n */\nclass AnimationLoader extends Loader {\n\n\t/**\n\t * Constructs a new animation loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and pass the loaded animations as an array\n\t * holding instances of {@link AnimationClip} to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(Array<AnimationClip>)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\terror( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\t/**\n\t * Parses the given JSON object and returns an array of animation clips.\n\t *\n\t * @param {Object} json - The serialized animation clips.\n\t * @return {Array<AnimationClip>} The parsed animation clips.\n\t */\n\tparse( json ) {\n\n\t\tconst animations = [];\n\n\t\tfor ( let i = 0; i < json.length; i ++ ) {\n\n\t\t\tconst clip = AnimationClip.parse( json[ i ] );\n\n\t\t\tanimations.push( clip );\n\n\t\t}\n\n\t\treturn animations;\n\n\t}\n\n}\n\n/**\n * Abstract base class for loading compressed texture formats S3TC, ASTC or ETC.\n * Textures are internally loaded via {@link FileLoader}.\n *\n * Derived classes have to implement the `parse()` method which holds the parsing\n * for the respective format.\n *\n * @abstract\n * @augments Loader\n */\nclass CompressedTextureLoader extends Loader {\n\n\t/**\n\t * Constructs a new compressed texture loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and passes the loaded compressed texture\n\t * to the `onLoad()` callback. The method also returns a new texture object which can\n\t * directly be used for material creation. If you do it this way, the texture\n\t * may pop up in your scene once the respective loading process is finished.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(CompressedTexture)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t * @return {CompressedTexture} The compressed texture.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst images = [];\n\n\t\tconst texture = new CompressedTexture();\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\n\t\tlet loaded = 0;\n\n\t\tfunction loadTexture( i ) {\n\n\t\t\tloader.load( url[ i ], function ( buffer ) {\n\n\t\t\t\tconst texDatas = scope.parse( buffer, true );\n\n\t\t\t\timages[ i ] = {\n\t\t\t\t\twidth: texDatas.width,\n\t\t\t\t\theight: texDatas.height,\n\t\t\t\t\tformat: texDatas.format,\n\t\t\t\t\tmipmaps: texDatas.mipmaps\n\t\t\t\t};\n\n\t\t\t\tloaded += 1;\n\n\t\t\t\tif ( loaded === 6 ) {\n\n\t\t\t\t\tif ( texDatas.mipmapCount === 1 ) texture.minFilter = LinearFilter;\n\n\t\t\t\t\ttexture.image = images;\n\t\t\t\t\ttexture.format = texDatas.format;\n\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t\t}\n\n\t\t\t}, onProgress, onError );\n\n\t\t}\n\n\t\tif ( Array.isArray( url ) ) {\n\n\t\t\tfor ( let i = 0, il = url.length; i < il; ++ i ) {\n\n\t\t\t\tloadTexture( i );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// compressed cubemap texture stored in a single DDS file\n\n\t\t\tloader.load( url, function ( buffer ) {\n\n\t\t\t\tconst texDatas = scope.parse( buffer, true );\n\n\t\t\t\tif ( texDatas.isCubemap ) {\n\n\t\t\t\t\tconst faces = texDatas.mipmaps.length / texDatas.mipmapCount;\n\n\t\t\t\t\tfor ( let f = 0; f < faces; f ++ ) {\n\n\t\t\t\t\t\timages[ f ] = { mipmaps: [] };\n\n\t\t\t\t\t\tfor ( let i = 0; i < texDatas.mipmapCount; i ++ ) {\n\n\t\t\t\t\t\t\timages[ f ].mipmaps.push( texDatas.mipmaps[ f * texDatas.mipmapCount + i ] );\n\t\t\t\t\t\t\timages[ f ].format = texDatas.format;\n\t\t\t\t\t\t\timages[ f ].width = texDatas.width;\n\t\t\t\t\t\t\timages[ f ].height = texDatas.height;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.image = images;\n\n\t\t\t\t} else {\n\n\t\t\t\t\ttexture.image.width = texDatas.width;\n\t\t\t\t\ttexture.image.height = texDatas.height;\n\t\t\t\t\ttexture.mipmaps = texDatas.mipmaps;\n\n\t\t\t\t}\n\n\t\t\t\tif ( texDatas.mipmapCount === 1 ) {\n\n\t\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t\t}\n\n\t\t\t\ttexture.format = texDatas.format;\n\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t}, onProgress, onError );\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n}\n\nconst _loading = new WeakMap();\n\n/**\n * A loader for loading images. The class loads images with the HTML `Image` API.\n *\n * ```js\n * const loader = new THREE.ImageLoader();\n * const image = await loader.loadAsync( 'image.png' );\n * ```\n * Please note that `ImageLoader` has dropped support for progress\n * events in `r84`. For an `ImageLoader` that supports progress events, see\n * [this thread](https://github.com/mrdoob/three.js/issues/10439#issuecomment-275785639).\n *\n * @augments Loader\n */\nclass ImageLoader extends Loader {\n\n\t/**\n\t * Constructs a new image loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and passes the loaded image\n\t * to the `onLoad()` callback. The method also returns a new `Image` object which can\n\t * directly be used for texture creation. If you do it this way, the texture\n\t * may pop up in your scene once the respective loading process is finished.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(Image)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Unsupported in this loader.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t * @return {Image} The image.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tif ( this.path !== undefined ) url = this.path + url;\n\n\t\turl = this.manager.resolveURL( url );\n\n\t\tconst scope = this;\n\n\t\tconst cached = Cache.get( `image:${url}` );\n\n\t\tif ( cached !== undefined ) {\n\n\t\t\tif ( cached.complete === true ) {\n\n\t\t\t\tscope.manager.itemStart( url );\n\n\t\t\t\tsetTimeout( function () {\n\n\t\t\t\t\tif ( onLoad ) onLoad( cached );\n\n\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t}, 0 );\n\n\t\t\t} else {\n\n\t\t\t\tlet arr = _loading.get( cached );\n\n\t\t\t\tif ( arr === undefined ) {\n\n\t\t\t\t\tarr = [];\n\t\t\t\t\t_loading.set( cached, arr );\n\n\t\t\t\t}\n\n\t\t\t\tarr.push( { onLoad, onError } );\n\n\t\t\t}\n\n\t\t\treturn cached;\n\n\t\t}\n\n\t\tconst image = createElementNS( 'img' );\n\n\t\tfunction onImageLoad() {\n\n\t\t\tremoveEventListeners();\n\n\t\t\tif ( onLoad ) onLoad( this );\n\n\t\t\t//\n\n\t\t\tconst callbacks = _loading.get( this ) || [];\n\n\t\t\tfor ( let i = 0; i < callbacks.length; i ++ ) {\n\n\t\t\t\tconst callback = callbacks[ i ];\n\t\t\t\tif ( callback.onLoad ) callback.onLoad( this );\n\n\t\t\t}\n\n\t\t\t_loading.delete( this );\n\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t}\n\n\t\tfunction onImageError( event ) {\n\n\t\t\tremoveEventListeners();\n\n\t\t\tif ( onError ) onError( event );\n\n\t\t\tCache.remove( `image:${url}` );\n\n\t\t\t//\n\n\t\t\tconst callbacks = _loading.get( this ) || [];\n\n\t\t\tfor ( let i = 0; i < callbacks.length; i ++ ) {\n\n\t\t\t\tconst callback = callbacks[ i ];\n\t\t\t\tif ( callback.onError ) callback.onError( event );\n\n\t\t\t}\n\n\t\t\t_loading.delete( this );\n\n\n\t\t\tscope.manager.itemError( url );\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t}\n\n\t\tfunction removeEventListeners() {\n\n\t\t\timage.removeEventListener( 'load', onImageLoad, false );\n\t\t\timage.removeEventListener( 'error', onImageError, false );\n\n\t\t}\n\n\t\timage.addEventListener( 'load', onImageLoad, false );\n\t\timage.addEventListener( 'error', onImageError, false );\n\n\t\tif ( url.slice( 0, 5 ) !== 'data:' ) {\n\n\t\t\tif ( this.crossOrigin !== undefined ) image.crossOrigin = this.crossOrigin;\n\n\t\t}\n\n\t\tCache.add( `image:${url}`, image );\n\t\tscope.manager.itemStart( url );\n\n\t\timage.src = url;\n\n\t\treturn image;\n\n\t}\n\n}\n\n/**\n * Class for loading cube textures. Images are internally loaded via {@link ImageLoader}.\n *\n * The loader returns an instance of {@link CubeTexture} and expects the cube map to\n * be defined as six separate images representing the sides of a cube. Other cube map definitions\n * like vertical and horizontal cross, column and row layouts are not supported.\n *\n * Note that, by convention, cube maps are specified in a coordinate system\n * in which positive-x is to the right when looking up the positive-z axis --\n * in other words, using a left-handed coordinate system. Since three.js uses\n * a right-handed coordinate system, environment maps used in three.js will\n * have pos-x and neg-x swapped.\n *\n * The loaded cube texture is in sRGB color space. Meaning {@link Texture#colorSpace}\n * is set to `SRGBColorSpace` by default.\n *\n * ```js\n * const loader = new THREE.CubeTextureLoader().setPath( 'textures/cubeMaps/' );\n * const cubeTexture = await loader.loadAsync( [\n * \t'px.png', 'nx.png', 'py.png', 'ny.png', 'pz.png', 'nz.png'\n * ] );\n * scene.background = cubeTexture;\n * ```\n *\n * @augments Loader\n */\nclass CubeTextureLoader extends Loader {\n\n\t/**\n\t * Constructs a new cube texture loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and pass the fully loaded cube texture\n\t * to the `onLoad()` callback. The method also returns a new cube texture object which can\n\t * directly be used for material creation. If you do it this way, the cube texture\n\t * may pop up in your scene once the respective loading process is finished.\n\t *\n\t * @param {Array<string>} urls - Array of 6 URLs to images, one for each side of the\n\t * cube texture. The urls should be specified in the following order: pos-x,\n\t * neg-x, pos-y, neg-y, pos-z, neg-z. An array of data URIs are allowed as well.\n\t * @param {function(CubeTexture)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Unsupported in this loader.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t * @return {CubeTexture} The cube texture.\n\t */\n\tload( urls, onLoad, onProgress, onError ) {\n\n\t\tconst texture = new CubeTexture();\n\t\ttexture.colorSpace = SRGBColorSpace;\n\n\t\tconst loader = new ImageLoader( this.manager );\n\t\tloader.setCrossOrigin( this.crossOrigin );\n\t\tloader.setPath( this.path );\n\n\t\tlet loaded = 0;\n\n\t\tfunction loadTexture( i ) {\n\n\t\t\tloader.load( urls[ i ], function ( image ) {\n\n\t\t\t\ttexture.images[ i ] = image;\n\n\t\t\t\tloaded ++;\n\n\t\t\t\tif ( loaded === 6 ) {\n\n\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t\t}\n\n\t\t\t}, undefined, onError );\n\n\t\t}\n\n\t\tfor ( let i = 0; i < urls.length; ++ i ) {\n\n\t\t\tloadTexture( i );\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n}\n\n/**\n * Abstract base class for loading binary texture formats RGBE, EXR or TGA.\n * Textures are internally loaded via {@link FileLoader}.\n *\n * Derived classes have to implement the `parse()` method which holds the parsing\n * for the respective format.\n *\n * @abstract\n * @augments Loader\n */\nclass DataTextureLoader extends Loader {\n\n\t/**\n\t * Constructs a new data texture loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and passes the loaded data texture\n\t * to the `onLoad()` callback. The method also returns a new texture object which can\n\t * directly be used for material creation. If you do it this way, the texture\n\t * may pop up in your scene once the respective loading process is finished.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(DataTexture)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t * @return {DataTexture} The data texture.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst texture = new DataTexture();\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setPath( this.path );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\t\tloader.load( url, function ( buffer ) {\n\n\t\t\tlet texData;\n\n\t\t\ttry {\n\n\t\t\t\ttexData = scope.parse( buffer );\n\n\t\t\t} catch ( error ) {\n\n\t\t\t\tif ( onError !== undefined ) {\n\n\t\t\t\t\tonError( error );\n\n\t\t\t\t} else {\n\n\t\t\t\t\terror( error );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( texData.image !== undefined ) {\n\n\t\t\t\ttexture.image = texData.image;\n\n\t\t\t} else if ( texData.data !== undefined ) {\n\n\t\t\t\ttexture.image.width = texData.width;\n\t\t\t\ttexture.image.height = texData.height;\n\t\t\t\ttexture.image.data = texData.data;\n\n\t\t\t}\n\n\t\t\ttexture.wrapS = texData.wrapS !== undefined ? texData.wrapS : ClampToEdgeWrapping;\n\t\t\ttexture.wrapT = texData.wrapT !== undefined ? texData.wrapT : ClampToEdgeWrapping;\n\n\t\t\ttexture.magFilter = texData.magFilter !== undefined ? texData.magFilter : LinearFilter;\n\t\t\ttexture.minFilter = texData.minFilter !== undefined ? texData.minFilter : LinearFilter;\n\n\t\t\ttexture.anisotropy = texData.anisotropy !== undefined ? texData.anisotropy : 1;\n\n\t\t\tif ( texData.colorSpace !== undefined ) {\n\n\t\t\t\ttexture.colorSpace = texData.colorSpace;\n\n\t\t\t}\n\n\t\t\tif ( texData.flipY !== undefined ) {\n\n\t\t\t\ttexture.flipY = texData.flipY;\n\n\t\t\t}\n\n\t\t\tif ( texData.format !== undefined ) {\n\n\t\t\t\ttexture.format = texData.format;\n\n\t\t\t}\n\n\t\t\tif ( texData.type !== undefined ) {\n\n\t\t\t\ttexture.type = texData.type;\n\n\t\t\t}\n\n\t\t\tif ( texData.mipmaps !== undefined ) {\n\n\t\t\t\ttexture.mipmaps = texData.mipmaps;\n\t\t\t\ttexture.minFilter = LinearMipmapLinearFilter; // presumably...\n\n\t\t\t}\n\n\t\t\tif ( texData.mipmapCount === 1 ) {\n\n\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t}\n\n\t\t\tif ( texData.generateMipmaps !== undefined ) {\n\n\t\t\t\ttexture.generateMipmaps = texData.generateMipmaps;\n\n\t\t\t}\n\n\t\t\ttexture.needsUpdate = true;\n\n\t\t\tif ( onLoad ) onLoad( texture, texData );\n\n\t\t}, onProgress, onError );\n\n\n\t\treturn texture;\n\n\t}\n\n}\n\n/**\n * Class for loading textures. Images are internally\n * loaded via {@link ImageLoader}.\n *\n * ```js\n * const loader = new THREE.TextureLoader();\n * const texture = await loader.loadAsync( 'textures/land_ocean_ice_cloud_2048.jpg' );\n *\n * const material = new THREE.MeshBasicMaterial( { map:texture } );\n * ```\n * Please note that `TextureLoader` has dropped support for progress\n * events in `r84`. For a `TextureLoader` that supports progress events, see\n * [this thread](https://github.com/mrdoob/three.js/issues/10439#issuecomment-293260145).\n *\n * @augments Loader\n */\nclass TextureLoader extends Loader {\n\n\t/**\n\t * Constructs a new texture loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and pass the fully loaded texture\n\t * to the `onLoad()` callback. The method also returns a new texture object which can\n\t * directly be used for material creation. If you do it this way, the texture\n\t * may pop up in your scene once the respective loading process is finished.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(Texture)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Unsupported in this loader.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t * @return {Texture} The texture.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst texture = new Texture();\n\n\t\tconst loader = new ImageLoader( this.manager );\n\t\tloader.setCrossOrigin( this.crossOrigin );\n\t\tloader.setPath( this.path );\n\n\t\tloader.load( url, function ( image ) {\n\n\t\t\ttexture.image = image;\n\t\t\ttexture.needsUpdate = true;\n\n\t\t\tif ( onLoad !== undefined ) {\n\n\t\t\t\tonLoad( texture );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t\treturn texture;\n\n\t}\n\n}\n\n/**\n * Abstract base class for lights - all other light types inherit the\n * properties and methods described here.\n *\n * @abstract\n * @augments Object3D\n */\nclass Light extends Object3D {\n\n\t/**\n\t * Constructs a new light.\n\t *\n\t * @param {(number|Color|string)} [color=0xffffff] - The light's color.\n\t * @param {number} [intensity=1] - The light's strength/intensity.\n\t */\n\tconstructor( color, intensity = 1 ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLight = true;\n\n\t\tthis.type = 'Light';\n\n\t\t/**\n\t\t * The light's color.\n\t\t *\n\t\t * @type {Color}\n\t\t */\n\t\tthis.color = new Color( color );\n\n\t\t/**\n\t\t * The light's intensity.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.intensity = intensity;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\t// Empty here in base class; some subclasses override.\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.color.copy( source.color );\n\t\tthis.intensity = source.intensity;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.color = this.color.getHex();\n\t\tdata.object.intensity = this.intensity;\n\n\t\tif ( this.groundColor !== undefined ) data.object.groundColor = this.groundColor.getHex();\n\n\t\tif ( this.distance !== undefined ) data.object.distance = this.distance;\n\t\tif ( this.angle !== undefined ) data.object.angle = this.angle;\n\t\tif ( this.decay !== undefined ) data.object.decay = this.decay;\n\t\tif ( this.penumbra !== undefined ) data.object.penumbra = this.penumbra;\n\n\t\tif ( this.shadow !== undefined ) data.object.shadow = this.shadow.toJSON();\n\t\tif ( this.target !== undefined ) data.object.target = this.target.uuid;\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * A light source positioned directly above the scene, with color fading from\n * the sky color to the ground color.\n *\n * This light cannot be used to cast shadows.\n *\n * ```js\n * const light = new THREE.HemisphereLight( 0xffffbb, 0x080820, 1 );\n * scene.add( light );\n * ```\n *\n * @augments Light\n */\nclass HemisphereLight extends Light {\n\n\t/**\n\t * Constructs a new hemisphere light.\n\t *\n\t * @param {(number|Color|string)} [skyColor=0xffffff] - The light's sky color.\n\t * @param {(number|Color|string)} [groundColor=0xffffff] - The light's ground color.\n\t * @param {number} [intensity=1] - The light's strength/intensity.\n\t */\n\tconstructor( skyColor, groundColor, intensity ) {\n\n\t\tsuper( skyColor, intensity );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isHemisphereLight = true;\n\n\t\tthis.type = 'HemisphereLight';\n\n\t\tthis.position.copy( Object3D.DEFAULT_UP );\n\t\tthis.updateMatrix();\n\n\t\t/**\n\t\t * The light's ground color.\n\t\t *\n\t\t * @type {Color}\n\t\t */\n\t\tthis.groundColor = new Color( groundColor );\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.groundColor.copy( source.groundColor );\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _projScreenMatrix$1 = /*@__PURE__*/ new Matrix4();\nconst _lightPositionWorld$1 = /*@__PURE__*/ new Vector3();\nconst _lookTarget$1 = /*@__PURE__*/ new Vector3();\n\n/**\n * Abstract base class for light shadow classes. These classes\n * represent the shadow configuration for different light types.\n *\n * @abstract\n */\nclass LightShadow {\n\n\t/**\n\t * Constructs a new light shadow.\n\t *\n\t * @param {Camera} camera - The light's view of the world.\n\t */\n\tconstructor( camera ) {\n\n\t\t/**\n\t\t * The light's view of the world.\n\t\t *\n\t\t * @type {Camera}\n\t\t */\n\t\tthis.camera = camera;\n\n\t\t/**\n\t\t * The intensity of the shadow. The default is `1`.\n\t\t * Valid values are in the range `[0, 1]`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.intensity = 1;\n\n\t\t/**\n\t\t * Shadow map bias, how much to add or subtract from the normalized depth\n\t\t * when deciding whether a surface is in shadow.\n\t\t *\n\t\t * The default is `0`. Very tiny adjustments here (in the order of `0.0001`)\n\t\t * may help reduce artifacts in shadows.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.bias = 0;\n\n\t\t/**\n\t\t * Defines how much the position used to query the shadow map is offset along\n\t\t * the object normal. The default is `0`. Increasing this value can be used to\n\t\t * reduce shadow acne especially in large scenes where light shines onto\n\t\t * geometry at a shallow angle. The cost is that shadows may appear distorted.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.normalBias = 0;\n\n\t\t/**\n\t\t * Setting this to values greater than 1 will blur the edges of the shadow.\n\t\t * High values will cause unwanted banding effects in the shadows - a greater\n\t\t * map size will allow for a higher value to be used here before these effects\n\t\t * become visible.\n\t\t *\n\t\t * The property has no effect when the shadow map type is `PCFSoftShadowMap` and\n\t\t * and it is recommended to increase softness by decreasing the shadow map size instead.\n\t\t *\n\t\t * The property has no effect when the shadow map type is `BasicShadowMap`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.radius = 1;\n\n\t\t/**\n\t\t * The amount of samples to use when blurring a VSM shadow map.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 8\n\t\t */\n\t\tthis.blurSamples = 8;\n\n\t\t/**\n\t\t * Defines the width and height of the shadow map. Higher values give better quality\n\t\t * shadows at the cost of computation time. Values must be powers of two.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (512,512)\n\t\t */\n\t\tthis.mapSize = new Vector2( 512, 512 );\n\n\t\t/**\n\t\t * The type of shadow texture. The default is `UnsignedByteType`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default UnsignedByteType\n\t\t */\n\t\tthis.mapType = UnsignedByteType;\n\n\t\t/**\n\t\t * The depth map generated using the internal camera; a location beyond a\n\t\t * pixel's depth is in shadow. Computed internally during rendering.\n\t\t *\n\t\t * @type {?RenderTarget}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * The distribution map generated using the internal camera; an occlusion is\n\t\t * calculated based on the distribution of depths. Computed internally during\n\t\t * rendering.\n\t\t *\n\t\t * @type {?RenderTarget}\n\t\t * @default null\n\t\t */\n\t\tthis.mapPass = null;\n\n\t\t/**\n\t\t * Model to shadow camera space, to compute location and depth in shadow map.\n\t\t * This is computed internally during rendering.\n\t\t *\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.matrix = new Matrix4();\n\n\t\t/**\n\t\t * Enables automatic updates of the light's shadow. If you do not require dynamic\n\t\t * lighting / shadows, you may set this to `false`.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.autoUpdate = true;\n\n\t\t/**\n\t\t * When set to `true`, shadow maps will be updated in the next `render` call.\n\t\t * If you have set {@link LightShadow#autoUpdate} to `false`, you will need to\n\t\t * set this property to `true` and then make a render call to update the light's shadow.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.needsUpdate = false;\n\n\t\tthis._frustum = new Frustum();\n\t\tthis._frameExtents = new Vector2( 1, 1 );\n\n\t\tthis._viewportCount = 1;\n\n\t\tthis._viewports = [\n\n\t\t\tnew Vector4( 0, 0, 1, 1 )\n\n\t\t];\n\n\t}\n\n\t/**\n\t * Used internally by the renderer to get the number of viewports that need\n\t * to be rendered for this shadow.\n\t *\n\t * @return {number} The viewport count.\n\t */\n\tgetViewportCount() {\n\n\t\treturn this._viewportCount;\n\n\t}\n\n\t/**\n\t * Gets the shadow cameras frustum. Used internally by the renderer to cull objects.\n\t *\n\t * @return {Frustum} The shadow camera frustum.\n\t */\n\tgetFrustum() {\n\n\t\treturn this._frustum;\n\n\t}\n\n\t/**\n\t * Update the matrices for the camera and shadow, used internally by the renderer.\n\t *\n\t * @param {Light} light - The light for which the shadow is being rendered.\n\t */\n\tupdateMatrices( light ) {\n\n\t\tconst shadowCamera = this.camera;\n\t\tconst shadowMatrix = this.matrix;\n\n\t\t_lightPositionWorld$1.setFromMatrixPosition( light.matrixWorld );\n\t\tshadowCamera.position.copy( _lightPositionWorld$1 );\n\n\t\t_lookTarget$1.setFromMatrixPosition( light.target.matrixWorld );\n\t\tshadowCamera.lookAt( _lookTarget$1 );\n\t\tshadowCamera.updateMatrixWorld();\n\n\t\t_projScreenMatrix$1.multiplyMatrices( shadowCamera.projectionMatrix, shadowCamera.matrixWorldInverse );\n\t\tthis._frustum.setFromProjectionMatrix( _projScreenMatrix$1, shadowCamera.coordinateSystem, shadowCamera.reversedDepth );\n\n\t\tif ( shadowCamera.reversedDepth ) {\n\n\t\t\tshadowMatrix.set(\n\t\t\t\t0.5, 0.0, 0.0, 0.5,\n\t\t\t\t0.0, 0.5, 0.0, 0.5,\n\t\t\t\t0.0, 0.0, 1.0, 0.0,\n\t\t\t\t0.0, 0.0, 0.0, 1.0\n\t\t\t);\n\n\t\t} else {\n\n\t\t\tshadowMatrix.set(\n\t\t\t\t0.5, 0.0, 0.0, 0.5,\n\t\t\t\t0.0, 0.5, 0.0, 0.5,\n\t\t\t\t0.0, 0.0, 0.5, 0.5,\n\t\t\t\t0.0, 0.0, 0.0, 1.0\n\t\t\t);\n\n\t\t}\n\n\t\tshadowMatrix.multiply( _projScreenMatrix$1 );\n\n\t}\n\n\t/**\n\t * Returns a viewport definition for the given viewport index.\n\t *\n\t * @param {number} viewportIndex - The viewport index.\n\t * @return {Vector4} The viewport.\n\t */\n\tgetViewport( viewportIndex ) {\n\n\t\treturn this._viewports[ viewportIndex ];\n\n\t}\n\n\t/**\n\t * Returns the frame extends.\n\t *\n\t * @return {Vector2} The frame extends.\n\t */\n\tgetFrameExtents() {\n\n\t\treturn this._frameExtents;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tif ( this.map ) {\n\n\t\t\tthis.map.dispose();\n\n\t\t}\n\n\t\tif ( this.mapPass ) {\n\n\t\t\tthis.mapPass.dispose();\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Copies the values of the given light shadow instance to this instance.\n\t *\n\t * @param {LightShadow} source - The light shadow to copy.\n\t * @return {LightShadow} A reference to this light shadow instance.\n\t */\n\tcopy( source ) {\n\n\t\tthis.camera = source.camera.clone();\n\n\t\tthis.intensity = source.intensity;\n\n\t\tthis.bias = source.bias;\n\t\tthis.radius = source.radius;\n\n\t\tthis.autoUpdate = source.autoUpdate;\n\t\tthis.needsUpdate = source.needsUpdate;\n\t\tthis.normalBias = source.normalBias;\n\t\tthis.blurSamples = source.blurSamples;\n\n\t\tthis.mapSize.copy( source.mapSize );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new light shadow instance with copied values from this instance.\n\t *\n\t * @return {LightShadow} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Serializes the light shadow into JSON.\n\t *\n\t * @return {Object} A JSON object representing the serialized light shadow.\n\t * @see {@link ObjectLoader#parse}\n\t */\n\ttoJSON() {\n\n\t\tconst object = {};\n\n\t\tif ( this.intensity !== 1 ) object.intensity = this.intensity;\n\t\tif ( this.bias !== 0 ) object.bias = this.bias;\n\t\tif ( this.normalBias !== 0 ) object.normalBias = this.normalBias;\n\t\tif ( this.radius !== 1 ) object.radius = this.radius;\n\t\tif ( this.mapSize.x !== 512 || this.mapSize.y !== 512 ) object.mapSize = this.mapSize.toArray();\n\n\t\tobject.camera = this.camera.toJSON( false ).object;\n\t\tdelete object.camera.matrix;\n\n\t\treturn object;\n\n\t}\n\n}\n\n/**\n * Represents the shadow configuration of directional lights.\n *\n * @augments LightShadow\n */\nclass SpotLightShadow extends LightShadow {\n\n\t/**\n\t * Constructs a new spot light shadow.\n\t */\n\tconstructor() {\n\n\t\tsuper( new PerspectiveCamera( 50, 1, 0.5, 500 ) );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSpotLightShadow = true;\n\n\t\t/**\n\t\t * Used to focus the shadow camera. The camera's field of view is set as a\n\t\t * percentage of the spotlight's field-of-view. Range is `[0, 1]`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.focus = 1;\n\n\t\t/**\n\t\t * Texture aspect ratio.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.aspect = 1;\n\n\t}\n\n\tupdateMatrices( light ) {\n\n\t\tconst camera = this.camera;\n\n\t\tconst fov = RAD2DEG * 2 * light.angle * this.focus;\n\t\tconst aspect = ( this.mapSize.width / this.mapSize.height ) * this.aspect;\n\t\tconst far = light.distance || camera.far;\n\n\t\tif ( fov !== camera.fov || aspect !== camera.aspect || far !== camera.far ) {\n\n\t\t\tcamera.fov = fov;\n\t\t\tcamera.aspect = aspect;\n\t\t\tcamera.far = far;\n\t\t\tcamera.updateProjectionMatrix();\n\n\t\t}\n\n\t\tsuper.updateMatrices( light );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.focus = source.focus;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * This light gets emitted from a single point in one direction, along a cone\n * that increases in size the further from the light it gets.\n *\n * This light can cast shadows - see the {@link SpotLightShadow} for details.\n *\n * ```js\n * // white spotlight shining from the side, modulated by a texture\n * const spotLight = new THREE.SpotLight( 0xffffff );\n * spotLight.position.set( 100, 1000, 100 );\n * spotLight.map = new THREE.TextureLoader().load( url );\n *\n * spotLight.castShadow = true;\n * spotLight.shadow.mapSize.width = 1024;\n * spotLight.shadow.mapSize.height = 1024;\n * spotLight.shadow.camera.near = 500;\n * spotLight.shadow.camera.far = 4000;\n * spotLight.shadow.camera.fov = 30;s\n * ```\n *\n * @augments Light\n */\nclass SpotLight extends Light {\n\n\t/**\n\t * Constructs a new spot light.\n\t *\n\t * @param {(number|Color|string)} [color=0xffffff] - The light's color.\n\t * @param {number} [intensity=1] - The light's strength/intensity measured in candela (cd).\n\t * @param {number} [distance=0] - Maximum range of the light. `0` means no limit.\n\t * @param {number} [angle=Math.PI/3] - Maximum angle of light dispersion from its direction whose upper bound is `Math.PI/2`.\n\t * @param {number} [penumbra=0] - Percent of the spotlight cone that is attenuated due to penumbra. Value range is `[0,1]`.\n\t * @param {number} [decay=2] - The amount the light dims along the distance of the light.\n\t */\n\tconstructor( color, intensity, distance = 0, angle = Math.PI / 3, penumbra = 0, decay = 2 ) {\n\n\t\tsuper( color, intensity );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSpotLight = true;\n\n\t\tthis.type = 'SpotLight';\n\n\t\tthis.position.copy( Object3D.DEFAULT_UP );\n\t\tthis.updateMatrix();\n\n\t\t/**\n\t\t * The spot light points from its position to the\n\t\t * target's position.\n\t\t *\n\t\t * For the target's position to be changed to anything other\n\t\t * than the default, it must be added to the scene.\n\t\t *\n\t\t * It is also possible to set the target to be another 3D object\n\t\t * in the scene. The light will now track the target object.\n\t\t *\n\t\t * @type {Object3D}\n\t\t */\n\t\tthis.target = new Object3D();\n\n\t\t/**\n\t\t * Maximum range of the light. `0` means no limit.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.distance = distance;\n\n\t\t/**\n\t\t * Maximum angle of light dispersion from its direction whose upper bound is `Math.PI/2`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default Math.PI/3\n\t\t */\n\t\tthis.angle = angle;\n\n\t\t/**\n\t\t * Percent of the spotlight cone that is attenuated due to penumbra.\n\t\t * Value range is `[0,1]`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.penumbra = penumbra;\n\n\t\t/**\n\t\t * The amount the light dims along the distance of the light. In context of\n\t\t * physically-correct rendering the default value should not be changed.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 2\n\t\t */\n\t\tthis.decay = decay;\n\n\t\t/**\n\t\t * A texture used to modulate the color of the light. The spot light\n\t\t * color is mixed with the RGB value of this texture, with a ratio\n\t\t * corresponding to its alpha value. The cookie-like masking effect is\n\t\t * reproduced using pixel values (0, 0, 0, 1-cookie_value).\n\t\t *\n\t\t * *Warning*: This property is disabled if {@link Object3D#castShadow} is set to `false`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * This property holds the light's shadow configuration.\n\t\t *\n\t\t * @type {SpotLightShadow}\n\t\t */\n\t\tthis.shadow = new SpotLightShadow();\n\n\t}\n\n\t/**\n\t * The light's power. Power is the luminous power of the light measured in lumens (lm).\n\t *  Changing the power will also change the light's intensity.\n\t *\n\t * @type {number}\n\t */\n\tget power() {\n\n\t\t// compute the light's luminous power (in lumens) from its intensity (in candela)\n\t\t// by convention for a spotlight, luminous power (lm) = π * luminous intensity (cd)\n\t\treturn this.intensity * Math.PI;\n\n\t}\n\n\tset power( power ) {\n\n\t\t// set the light's intensity (in candela) from the desired luminous power (in lumens)\n\t\tthis.intensity = power / Math.PI;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.shadow.dispose();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.distance = source.distance;\n\t\tthis.angle = source.angle;\n\t\tthis.penumbra = source.penumbra;\n\t\tthis.decay = source.decay;\n\n\t\tthis.target = source.target.clone();\n\n\t\tthis.shadow = source.shadow.clone();\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _projScreenMatrix = /*@__PURE__*/ new Matrix4();\nconst _lightPositionWorld = /*@__PURE__*/ new Vector3();\nconst _lookTarget = /*@__PURE__*/ new Vector3();\n\n/**\n * Represents the shadow configuration of point lights.\n *\n * @augments LightShadow\n */\nclass PointLightShadow extends LightShadow {\n\n\t/**\n\t * Constructs a new point light shadow.\n\t */\n\tconstructor() {\n\n\t\tsuper( new PerspectiveCamera( 90, 1, 0.5, 500 ) );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isPointLightShadow = true;\n\n\t\tthis._frameExtents = new Vector2( 4, 2 );\n\n\t\tthis._viewportCount = 6;\n\n\t\tthis._viewports = [\n\t\t\t// These viewports map a cube-map onto a 2D texture with the\n\t\t\t// following orientation:\n\t\t\t//\n\t\t\t//  xzXZ\n\t\t\t//   y Y\n\t\t\t//\n\t\t\t// X - Positive x direction\n\t\t\t// x - Negative x direction\n\t\t\t// Y - Positive y direction\n\t\t\t// y - Negative y direction\n\t\t\t// Z - Positive z direction\n\t\t\t// z - Negative z direction\n\n\t\t\t// positive X\n\t\t\tnew Vector4( 2, 1, 1, 1 ),\n\t\t\t// negative X\n\t\t\tnew Vector4( 0, 1, 1, 1 ),\n\t\t\t// positive Z\n\t\t\tnew Vector4( 3, 1, 1, 1 ),\n\t\t\t// negative Z\n\t\t\tnew Vector4( 1, 1, 1, 1 ),\n\t\t\t// positive Y\n\t\t\tnew Vector4( 3, 0, 1, 1 ),\n\t\t\t// negative Y\n\t\t\tnew Vector4( 1, 0, 1, 1 )\n\t\t];\n\n\t\tthis._cubeDirections = [\n\t\t\tnew Vector3( 1, 0, 0 ), new Vector3( -1, 0, 0 ), new Vector3( 0, 0, 1 ),\n\t\t\tnew Vector3( 0, 0, -1 ), new Vector3( 0, 1, 0 ), new Vector3( 0, -1, 0 )\n\t\t];\n\n\t\tthis._cubeUps = [\n\t\t\tnew Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ),\n\t\t\tnew Vector3( 0, 1, 0 ), new Vector3( 0, 0, 1 ),\tnew Vector3( 0, 0, -1 )\n\t\t];\n\n\t}\n\n\t/**\n\t * Update the matrices for the camera and shadow, used internally by the renderer.\n\t *\n\t * @param {Light} light - The light for which the shadow is being rendered.\n\t * @param {number} [viewportIndex=0] - The viewport index.\n\t */\n\tupdateMatrices( light, viewportIndex = 0 ) {\n\n\t\tconst camera = this.camera;\n\t\tconst shadowMatrix = this.matrix;\n\n\t\tconst far = light.distance || camera.far;\n\n\t\tif ( far !== camera.far ) {\n\n\t\t\tcamera.far = far;\n\t\t\tcamera.updateProjectionMatrix();\n\n\t\t}\n\n\t\t_lightPositionWorld.setFromMatrixPosition( light.matrixWorld );\n\t\tcamera.position.copy( _lightPositionWorld );\n\n\t\t_lookTarget.copy( camera.position );\n\t\t_lookTarget.add( this._cubeDirections[ viewportIndex ] );\n\t\tcamera.up.copy( this._cubeUps[ viewportIndex ] );\n\t\tcamera.lookAt( _lookTarget );\n\t\tcamera.updateMatrixWorld();\n\n\t\tshadowMatrix.makeTranslation( - _lightPositionWorld.x, - _lightPositionWorld.y, - _lightPositionWorld.z );\n\n\t\t_projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );\n\t\tthis._frustum.setFromProjectionMatrix( _projScreenMatrix, camera.coordinateSystem, camera.reversedDepth );\n\n\t}\n\n}\n\n/**\n * A light that gets emitted from a single point in all directions. A common\n * use case for this is to replicate the light emitted from a bare\n * lightbulb.\n *\n * This light can cast shadows - see the {@link PointLightShadow} for details.\n *\n * ```js\n * const light = new THREE.PointLight( 0xff0000, 1, 100 );\n * light.position.set( 50, 50, 50 );\n * scene.add( light );\n * ```\n *\n * @augments Light\n */\nclass PointLight extends Light {\n\n\t/**\n\t * Constructs a new point light.\n\t *\n\t * @param {(number|Color|string)} [color=0xffffff] - The light's color.\n\t * @param {number} [intensity=1] - The light's strength/intensity measured in candela (cd).\n\t * @param {number} [distance=0] - Maximum range of the light. `0` means no limit.\n\t * @param {number} [decay=2] - The amount the light dims along the distance of the light.\n\t */\n\tconstructor( color, intensity, distance = 0, decay = 2 ) {\n\n\t\tsuper( color, intensity );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isPointLight = true;\n\n\t\tthis.type = 'PointLight';\n\n\t\t/**\n\t\t * When distance is zero, light will attenuate according to inverse-square\n\t\t * law to infinite distance. When distance is non-zero, light will attenuate\n\t\t * according to inverse-square law until near the distance cutoff, where it\n\t\t * will then attenuate quickly and smoothly to 0. Inherently, cutoffs are not\n\t\t * physically correct.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.distance = distance;\n\n\t\t/**\n\t\t * The amount the light dims along the distance of the light. In context of\n\t\t * physically-correct rendering the default value should not be changed.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 2\n\t\t */\n\t\tthis.decay = decay;\n\n\t\t/**\n\t\t * This property holds the light's shadow configuration.\n\t\t *\n\t\t * @type {PointLightShadow}\n\t\t */\n\t\tthis.shadow = new PointLightShadow();\n\n\t}\n\n\t/**\n\t * The light's power. Power is the luminous power of the light measured in lumens (lm).\n\t * Changing the power will also change the light's intensity.\n\t *\n\t * @type {number}\n\t */\n\tget power() {\n\n\t\t// compute the light's luminous power (in lumens) from its intensity (in candela)\n\t\t// for an isotropic light source, luminous power (lm) = 4 π luminous intensity (cd)\n\t\treturn this.intensity * 4 * Math.PI;\n\n\t}\n\n\tset power( power ) {\n\n\t\t// set the light's intensity (in candela) from the desired luminous power (in lumens)\n\t\tthis.intensity = power / ( 4 * Math.PI );\n\n\t}\n\n\tdispose() {\n\n\t\tthis.shadow.dispose();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.distance = source.distance;\n\t\tthis.decay = source.decay;\n\n\t\tthis.shadow = source.shadow.clone();\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * Camera that uses [orthographic projection](https://en.wikipedia.org/wiki/Orthographic_projection).\n *\n * In this projection mode, an object's size in the rendered image stays\n * constant regardless of its distance from the camera. This can be useful\n * for rendering 2D scenes and UI elements, amongst other things.\n *\n * ```js\n * const camera = new THREE.OrthographicCamera( width / - 2, width / 2, height / 2, height / - 2, 1, 1000 );\n * scene.add( camera );\n * ```\n *\n * @augments Camera\n */\nclass OrthographicCamera extends Camera {\n\n\t/**\n\t * Constructs a new orthographic camera.\n\t *\n\t * @param {number} [left=-1] - The left plane of the camera's frustum.\n\t * @param {number} [right=1] - The right plane of the camera's frustum.\n\t * @param {number} [top=1] - The top plane of the camera's frustum.\n\t * @param {number} [bottom=-1] - The bottom plane of the camera's frustum.\n\t * @param {number} [near=0.1] - The camera's near plane.\n\t * @param {number} [far=2000] - The camera's far plane.\n\t */\n\tconstructor( left = -1, right = 1, top = 1, bottom = -1, near = 0.1, far = 2000 ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isOrthographicCamera = true;\n\n\t\tthis.type = 'OrthographicCamera';\n\n\t\t/**\n\t\t * The zoom factor of the camera.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.zoom = 1;\n\n\t\t/**\n\t\t * Represents the frustum window specification. This property should not be edited\n\t\t * directly but via {@link PerspectiveCamera#setViewOffset} and {@link PerspectiveCamera#clearViewOffset}.\n\t\t *\n\t\t * @type {?Object}\n\t\t * @default null\n\t\t */\n\t\tthis.view = null;\n\n\t\t/**\n\t\t * The left plane of the camera's frustum.\n\t\t *\n\t\t * @type {number}\n\t\t * @default -1\n\t\t */\n\t\tthis.left = left;\n\n\t\t/**\n\t\t * The right plane of the camera's frustum.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.right = right;\n\n\t\t/**\n\t\t * The top plane of the camera's frustum.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.top = top;\n\n\t\t/**\n\t\t * The bottom plane of the camera's frustum.\n\t\t *\n\t\t * @type {number}\n\t\t * @default -1\n\t\t */\n\t\tthis.bottom = bottom;\n\n\t\t/**\n\t\t * The camera's near plane. The valid range is greater than `0`\n\t\t * and less than the current value of {@link OrthographicCamera#far}.\n\t\t *\n\t\t * Note that, unlike for the {@link PerspectiveCamera}, `0` is a\n\t\t * valid value for an orthographic camera's near plane.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.1\n\t\t */\n\t\tthis.near = near;\n\n\t\t/**\n\t\t * The camera's far plane. Must be greater than the\n\t\t * current value of {@link OrthographicCamera#near}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 2000\n\t\t */\n\t\tthis.far = far;\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.left = source.left;\n\t\tthis.right = source.right;\n\t\tthis.top = source.top;\n\t\tthis.bottom = source.bottom;\n\t\tthis.near = source.near;\n\t\tthis.far = source.far;\n\n\t\tthis.zoom = source.zoom;\n\t\tthis.view = source.view === null ? null : Object.assign( {}, source.view );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets an offset in a larger frustum. This is useful for multi-window or\n\t * multi-monitor/multi-machine setups.\n\t *\n\t * @param {number} fullWidth - The full width of multiview setup.\n\t * @param {number} fullHeight - The full height of multiview setup.\n\t * @param {number} x - The horizontal offset of the subcamera.\n\t * @param {number} y - The vertical offset of the subcamera.\n\t * @param {number} width - The width of subcamera.\n\t * @param {number} height - The height of subcamera.\n\t * @see {@link PerspectiveCamera#setViewOffset}\n\t */\n\tsetViewOffset( fullWidth, fullHeight, x, y, width, height ) {\n\n\t\tif ( this.view === null ) {\n\n\t\t\tthis.view = {\n\t\t\t\tenabled: true,\n\t\t\t\tfullWidth: 1,\n\t\t\t\tfullHeight: 1,\n\t\t\t\toffsetX: 0,\n\t\t\t\toffsetY: 0,\n\t\t\t\twidth: 1,\n\t\t\t\theight: 1\n\t\t\t};\n\n\t\t}\n\n\t\tthis.view.enabled = true;\n\t\tthis.view.fullWidth = fullWidth;\n\t\tthis.view.fullHeight = fullHeight;\n\t\tthis.view.offsetX = x;\n\t\tthis.view.offsetY = y;\n\t\tthis.view.width = width;\n\t\tthis.view.height = height;\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\t/**\n\t * Removes the view offset from the projection matrix.\n\t */\n\tclearViewOffset() {\n\n\t\tif ( this.view !== null ) {\n\n\t\t\tthis.view.enabled = false;\n\n\t\t}\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\t/**\n\t * Updates the camera's projection matrix. Must be called after any change of\n\t * camera properties.\n\t */\n\tupdateProjectionMatrix() {\n\n\t\tconst dx = ( this.right - this.left ) / ( 2 * this.zoom );\n\t\tconst dy = ( this.top - this.bottom ) / ( 2 * this.zoom );\n\t\tconst cx = ( this.right + this.left ) / 2;\n\t\tconst cy = ( this.top + this.bottom ) / 2;\n\n\t\tlet left = cx - dx;\n\t\tlet right = cx + dx;\n\t\tlet top = cy + dy;\n\t\tlet bottom = cy - dy;\n\n\t\tif ( this.view !== null && this.view.enabled ) {\n\n\t\t\tconst scaleW = ( this.right - this.left ) / this.view.fullWidth / this.zoom;\n\t\t\tconst scaleH = ( this.top - this.bottom ) / this.view.fullHeight / this.zoom;\n\n\t\t\tleft += scaleW * this.view.offsetX;\n\t\t\tright = left + scaleW * this.view.width;\n\t\t\ttop -= scaleH * this.view.offsetY;\n\t\t\tbottom = top - scaleH * this.view.height;\n\n\t\t}\n\n\t\tthis.projectionMatrix.makeOrthographic( left, right, top, bottom, this.near, this.far, this.coordinateSystem, this.reversedDepth );\n\n\t\tthis.projectionMatrixInverse.copy( this.projectionMatrix ).invert();\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.zoom = this.zoom;\n\t\tdata.object.left = this.left;\n\t\tdata.object.right = this.right;\n\t\tdata.object.top = this.top;\n\t\tdata.object.bottom = this.bottom;\n\t\tdata.object.near = this.near;\n\t\tdata.object.far = this.far;\n\n\t\tif ( this.view !== null ) data.object.view = Object.assign( {}, this.view );\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * Represents the shadow configuration of directional lights.\n *\n * @augments LightShadow\n */\nclass DirectionalLightShadow extends LightShadow {\n\n\t/**\n\t * Constructs a new directional light shadow.\n\t */\n\tconstructor() {\n\n\t\tsuper( new OrthographicCamera( -5, 5, 5, -5, 0.5, 500 ) );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isDirectionalLightShadow = true;\n\n\t}\n\n}\n\n/**\n * A light that gets emitted in a specific direction. This light will behave\n * as though it is infinitely far away and the rays produced from it are all\n * parallel. The common use case for this is to simulate daylight; the sun is\n * far enough away that its position can be considered to be infinite, and\n * all light rays coming from it are parallel.\n *\n * A common point of confusion for directional lights is that setting the\n * rotation has no effect. This is because three.js's DirectionalLight is the\n * equivalent to what is often called a 'Target Direct Light' in other\n * applications.\n *\n * This means that its direction is calculated as pointing from the light's\n * {@link Object3D#position} to the {@link DirectionalLight#target} position\n * (as opposed to a 'Free Direct Light' that just has a rotation\n * component).\n *\n * This light can cast shadows - see the {@link DirectionalLightShadow} for details.\n *\n * ```js\n * // White directional light at half intensity shining from the top.\n * const directionalLight = new THREE.DirectionalLight( 0xffffff, 0.5 );\n * scene.add( directionalLight );\n * ```\n *\n * @augments Light\n */\nclass DirectionalLight extends Light {\n\n\t/**\n\t * Constructs a new directional light.\n\t *\n\t * @param {(number|Color|string)} [color=0xffffff] - The light's color.\n\t * @param {number} [intensity=1] - The light's strength/intensity.\n\t */\n\tconstructor( color, intensity ) {\n\n\t\tsuper( color, intensity );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isDirectionalLight = true;\n\n\t\tthis.type = 'DirectionalLight';\n\n\t\tthis.position.copy( Object3D.DEFAULT_UP );\n\t\tthis.updateMatrix();\n\n\t\t/**\n\t\t * The directional light points from its position to the\n\t\t * target's position.\n\t\t *\n\t\t * For the target's position to be changed to anything other\n\t\t * than the default, it must be added to the scene.\n\t\t *\n\t\t * It is also possible to set the target to be another 3D object\n\t\t * in the scene. The light will now track the target object.\n\t\t *\n\t\t * @type {Object3D}\n\t\t */\n\t\tthis.target = new Object3D();\n\n\t\t/**\n\t\t * This property holds the light's shadow configuration.\n\t\t *\n\t\t * @type {DirectionalLightShadow}\n\t\t */\n\t\tthis.shadow = new DirectionalLightShadow();\n\n\t}\n\n\tdispose() {\n\n\t\tthis.shadow.dispose();\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.target = source.target.clone();\n\t\tthis.shadow = source.shadow.clone();\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * This light globally illuminates all objects in the scene equally.\n *\n * It cannot be used to cast shadows as it does not have a direction.\n *\n * ```js\n * const light = new THREE.AmbientLight( 0x404040 ); // soft white light\n * scene.add( light );\n * ```\n *\n * @augments Light\n */\nclass AmbientLight extends Light {\n\n\t/**\n\t * Constructs a new ambient light.\n\t *\n\t * @param {(number|Color|string)} [color=0xffffff] - The light's color.\n\t * @param {number} [intensity=1] - The light's strength/intensity.\n\t */\n\tconstructor( color, intensity ) {\n\n\t\tsuper( color, intensity );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isAmbientLight = true;\n\n\t\tthis.type = 'AmbientLight';\n\n\t}\n\n}\n\n/**\n * This class emits light uniformly across the face a rectangular plane.\n * This light type can be used to simulate light sources such as bright\n * windows or strip lighting.\n *\n * Important Notes:\n *\n * - There is no shadow support.\n * - Only PBR materials are supported.\n * - You have to include `RectAreaLightUniformsLib` (`WebGLRenderer`) or `RectAreaLightTexturesLib` (`WebGPURenderer`)\n * into your app and init the uniforms/textures.\n *\n * ```js\n * RectAreaLightUniformsLib.init(); // only relevant for WebGLRenderer\n * THREE.RectAreaLightNode.setLTC( RectAreaLightTexturesLib.init() ); //  only relevant for WebGPURenderer\n *\n * const intensity = 1; const width = 10; const height = 10;\n * const rectLight = new THREE.RectAreaLight( 0xffffff, intensity, width, height );\n * rectLight.position.set( 5, 5, 0 );\n * rectLight.lookAt( 0, 0, 0 );\n * scene.add( rectLight )\n * ```\n *\n * @augments Light\n */\nclass RectAreaLight extends Light {\n\n\t/**\n\t * Constructs a new area light.\n\t *\n\t * @param {(number|Color|string)} [color=0xffffff] - The light's color.\n\t * @param {number} [intensity=1] - The light's strength/intensity.\n\t * @param {number} [width=10] - The width of the light.\n\t * @param {number} [height=10] - The height of the light.\n\t */\n\tconstructor( color, intensity, width = 10, height = 10 ) {\n\n\t\tsuper( color, intensity );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isRectAreaLight = true;\n\n\t\tthis.type = 'RectAreaLight';\n\n\t\t/**\n\t\t * The width of the light.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 10\n\t\t */\n\t\tthis.width = width;\n\n\t\t/**\n\t\t * The height of the light.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 10\n\t\t */\n\t\tthis.height = height;\n\n\t}\n\n\t/**\n\t * The light's power. Power is the luminous power of the light measured in lumens (lm).\n\t * Changing the power will also change the light's intensity.\n\t *\n\t * @type {number}\n\t */\n\tget power() {\n\n\t\t// compute the light's luminous power (in lumens) from its intensity (in nits)\n\t\treturn this.intensity * this.width * this.height * Math.PI;\n\n\t}\n\n\tset power( power ) {\n\n\t\t// set the light's intensity (in nits) from the desired luminous power (in lumens)\n\t\tthis.intensity = power / ( this.width * this.height * Math.PI );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.width = source.width;\n\t\tthis.height = source.height;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.width = this.width;\n\t\tdata.object.height = this.height;\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * Represents a third-order spherical harmonics (SH). Light probes use this class\n * to encode lighting information.\n *\n * - Primary reference: {@link https://graphics.stanford.edu/papers/envmap/envmap.pdf}\n * - Secondary reference: {@link https://www.ppsloan.org/publications/StupidSH36.pdf}\n */\nclass SphericalHarmonics3 {\n\n\t/**\n\t * Constructs a new spherical harmonics.\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSphericalHarmonics3 = true;\n\n\t\t/**\n\t\t * An array holding the (9) SH coefficients.\n\t\t *\n\t\t * @type {Array<Vector3>}\n\t\t */\n\t\tthis.coefficients = [];\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients.push( new Vector3() );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the given SH coefficients to this instance by copying\n\t * the values.\n\t *\n\t * @param {Array<Vector3>} coefficients - The SH coefficients.\n\t * @return {SphericalHarmonics3} A reference to this spherical harmonics.\n\t */\n\tset( coefficients ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].copy( coefficients[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets all SH coefficients to `0`.\n\t *\n\t * @return {SphericalHarmonics3} A reference to this spherical harmonics.\n\t */\n\tzero() {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].set( 0, 0, 0 );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the radiance in the direction of the given normal.\n\t *\n\t * @param {Vector3} normal - The normal vector (assumed to be unit length)\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The radiance.\n\t */\n\tgetAt( normal, target ) {\n\n\t\t// normal is assumed to be unit length\n\n\t\tconst x = normal.x, y = normal.y, z = normal.z;\n\n\t\tconst coeff = this.coefficients;\n\n\t\t// band 0\n\t\ttarget.copy( coeff[ 0 ] ).multiplyScalar( 0.282095 );\n\n\t\t// band 1\n\t\ttarget.addScaledVector( coeff[ 1 ], 0.488603 * y );\n\t\ttarget.addScaledVector( coeff[ 2 ], 0.488603 * z );\n\t\ttarget.addScaledVector( coeff[ 3 ], 0.488603 * x );\n\n\t\t// band 2\n\t\ttarget.addScaledVector( coeff[ 4 ], 1.092548 * ( x * y ) );\n\t\ttarget.addScaledVector( coeff[ 5 ], 1.092548 * ( y * z ) );\n\t\ttarget.addScaledVector( coeff[ 6 ], 0.315392 * ( 3.0 * z * z - 1.0 ) );\n\t\ttarget.addScaledVector( coeff[ 7 ], 1.092548 * ( x * z ) );\n\t\ttarget.addScaledVector( coeff[ 8 ], 0.546274 * ( x * x - y * y ) );\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Returns the irradiance (radiance convolved with cosine lobe) in the\n\t * direction of the given normal.\n\t *\n\t * @param {Vector3} normal - The normal vector (assumed to be unit length)\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The irradiance.\n\t */\n\tgetIrradianceAt( normal, target ) {\n\n\t\t// normal is assumed to be unit length\n\n\t\tconst x = normal.x, y = normal.y, z = normal.z;\n\n\t\tconst coeff = this.coefficients;\n\n\t\t// band 0\n\t\ttarget.copy( coeff[ 0 ] ).multiplyScalar( 0.886227 ); // π * 0.282095\n\n\t\t// band 1\n\t\ttarget.addScaledVector( coeff[ 1 ], 2.0 * 0.511664 * y ); // ( 2 * π / 3 ) * 0.488603\n\t\ttarget.addScaledVector( coeff[ 2 ], 2.0 * 0.511664 * z );\n\t\ttarget.addScaledVector( coeff[ 3 ], 2.0 * 0.511664 * x );\n\n\t\t// band 2\n\t\ttarget.addScaledVector( coeff[ 4 ], 2.0 * 0.429043 * x * y ); // ( π / 4 ) * 1.092548\n\t\ttarget.addScaledVector( coeff[ 5 ], 2.0 * 0.429043 * y * z );\n\t\ttarget.addScaledVector( coeff[ 6 ], 0.743125 * z * z - 0.247708 ); // ( π / 4 ) * 0.315392 * 3\n\t\ttarget.addScaledVector( coeff[ 7 ], 2.0 * 0.429043 * x * z );\n\t\ttarget.addScaledVector( coeff[ 8 ], 0.429043 * ( x * x - y * y ) ); // ( π / 4 ) * 0.546274\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Adds the given SH to this instance.\n\t *\n\t * @param {SphericalHarmonics3} sh - The SH to add.\n\t * @return {SphericalHarmonics3} A reference to this spherical harmonics.\n\t */\n\tadd( sh ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].add( sh.coefficients[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * A convenience method for performing {@link SphericalHarmonics3#add} and\n\t * {@link SphericalHarmonics3#scale} at once.\n\t *\n\t * @param {SphericalHarmonics3} sh - The SH to add.\n\t * @param {number} s - The scale factor.\n\t * @return {SphericalHarmonics3} A reference to this spherical harmonics.\n\t */\n\taddScaledSH( sh, s ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].addScaledVector( sh.coefficients[ i ], s );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Scales this SH by the given scale factor.\n\t *\n\t * @param {number} s - The scale factor.\n\t * @return {SphericalHarmonics3} A reference to this spherical harmonics.\n\t */\n\tscale( s ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].multiplyScalar( s );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Linear interpolates between the given SH and this instance by the given\n\t * alpha factor.\n\t *\n\t * @param {SphericalHarmonics3} sh - The SH to interpolate with.\n\t * @param {number} alpha - The alpha factor.\n\t * @return {SphericalHarmonics3} A reference to this spherical harmonics.\n\t */\n\tlerp( sh, alpha ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].lerp( sh.coefficients[ i ], alpha );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this spherical harmonics is equal with the given one.\n\t *\n\t * @param {SphericalHarmonics3} sh - The spherical harmonics to test for equality.\n\t * @return {boolean} Whether this spherical harmonics is equal with the given one.\n\t */\n\tequals( sh ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tif ( ! this.coefficients[ i ].equals( sh.coefficients[ i ] ) ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\t/**\n\t * Copies the values of the given spherical harmonics to this instance.\n\t *\n\t * @param {SphericalHarmonics3} sh - The spherical harmonics to copy.\n\t * @return {SphericalHarmonics3} A reference to this spherical harmonics.\n\t */\n\tcopy( sh ) {\n\n\t\treturn this.set( sh.coefficients );\n\n\t}\n\n\t/**\n\t * Returns a new spherical harmonics with copied values from this instance.\n\t *\n\t * @return {SphericalHarmonics3} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Sets the SH coefficients of this instance from the given array.\n\t *\n\t * @param {Array<number>} array - An array holding the SH coefficients.\n\t * @param {number} [offset=0] - The array offset where to start copying.\n\t * @return {SphericalHarmonics3} A clone of this instance.\n\t */\n\tfromArray( array, offset = 0 ) {\n\n\t\tconst coefficients = this.coefficients;\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tcoefficients[ i ].fromArray( array, offset + ( i * 3 ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns an array with the SH coefficients, or copies them into the provided\n\t * array. The coefficients are represented as numbers.\n\t *\n\t * @param {Array<number>} [array=[]] - The target array.\n\t * @param {number} [offset=0] - The array offset where to start copying.\n\t * @return {Array<number>} An array with flat SH coefficients.\n\t */\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tconst coefficients = this.coefficients;\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tcoefficients[ i ].toArray( array, offset + ( i * 3 ) );\n\n\t\t}\n\n\t\treturn array;\n\n\t}\n\n\t/**\n\t * Computes the SH basis for the given normal vector.\n\t *\n\t * @param {Vector3} normal - The normal.\n\t * @param {Array<number>} shBasis - The target array holding the SH basis.\n\t */\n\tstatic getBasisAt( normal, shBasis ) {\n\n\t\t// normal is assumed to be unit length\n\n\t\tconst x = normal.x, y = normal.y, z = normal.z;\n\n\t\t// band 0\n\t\tshBasis[ 0 ] = 0.282095;\n\n\t\t// band 1\n\t\tshBasis[ 1 ] = 0.488603 * y;\n\t\tshBasis[ 2 ] = 0.488603 * z;\n\t\tshBasis[ 3 ] = 0.488603 * x;\n\n\t\t// band 2\n\t\tshBasis[ 4 ] = 1.092548 * x * y;\n\t\tshBasis[ 5 ] = 1.092548 * y * z;\n\t\tshBasis[ 6 ] = 0.315392 * ( 3 * z * z - 1 );\n\t\tshBasis[ 7 ] = 1.092548 * x * z;\n\t\tshBasis[ 8 ] = 0.546274 * ( x * x - y * y );\n\n\t}\n\n}\n\n/**\n * Light probes are an alternative way of adding light to a 3D scene. Unlike\n * classical light sources (e.g. directional, point or spot lights), light\n * probes do not emit light. Instead they store information about light\n * passing through 3D space. During rendering, the light that hits a 3D\n * object is approximated by using the data from the light probe.\n *\n * Light probes are usually created from (radiance) environment maps. The\n * class {@link LightProbeGenerator} can be used to create light probes from\n * cube textures or render targets. However, light estimation data could also\n * be provided in other forms e.g. by WebXR. This enables the rendering of\n * augmented reality content that reacts to real world lighting.\n *\n * The current probe implementation in three.js supports so-called diffuse\n * light probes. This type of light probe is functionally equivalent to an\n * irradiance environment map.\n *\n * @augments Light\n */\nclass LightProbe extends Light {\n\n\t/**\n\t * Constructs a new light probe.\n\t *\n\t * @param {SphericalHarmonics3} sh - The spherical harmonics which represents encoded lighting information.\n\t * @param {number} [intensity=1] - The light's strength/intensity.\n\t */\n\tconstructor( sh = new SphericalHarmonics3(), intensity = 1 ) {\n\n\t\tsuper( undefined, intensity );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLightProbe = true;\n\n\t\t/**\n\t\t * A light probe uses spherical harmonics to encode lighting information.\n\t\t *\n\t\t * @type {SphericalHarmonics3}\n\t\t */\n\t\tthis.sh = sh;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.sh.copy( source.sh );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Deserializes the light prove from the given JSON.\n\t *\n\t * @param {Object} json - The JSON holding the serialized light probe.\n\t * @return {LightProbe} A reference to this light probe.\n\t */\n\tfromJSON( json ) {\n\n\t\tthis.intensity = json.intensity; // TODO: Move this bit to Light.fromJSON();\n\t\tthis.sh.fromArray( json.sh );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.sh = this.sh.toArray();\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * Class for loading geometries. The files are internally\n * loaded via {@link FileLoader}.\n *\n * ```js\n * const loader = new THREE.MaterialLoader();\n * const material = await loader.loadAsync( 'material.json' );\n * ```\n * This loader does not support node materials. Use {@link NodeMaterialLoader} instead.\n *\n * @augments Loader\n */\nclass MaterialLoader extends Loader {\n\n\t/**\n\t * Constructs a new material loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\t/**\n\t\t * A dictionary holding textures used by the material.\n\t\t *\n\t\t * @type {Object<string,Texture>}\n\t\t */\n\t\tthis.textures = {};\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and pass the loaded material to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(Material)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( scope.manager );\n\t\tloader.setPath( scope.path );\n\t\tloader.setRequestHeader( scope.requestHeader );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\terror( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\t/**\n\t * Parses the given JSON object and returns a material.\n\t *\n\t * @param {Object} json - The serialized material.\n\t * @return {Material} The parsed material.\n\t */\n\tparse( json ) {\n\n\t\tconst textures = this.textures;\n\n\t\tfunction getTexture( name ) {\n\n\t\t\tif ( textures[ name ] === undefined ) {\n\n\t\t\t\twarn( 'MaterialLoader: Undefined texture', name );\n\n\t\t\t}\n\n\t\t\treturn textures[ name ];\n\n\t\t}\n\n\t\tconst material = this.createMaterialFromType( json.type );\n\n\t\tif ( json.uuid !== undefined ) material.uuid = json.uuid;\n\t\tif ( json.name !== undefined ) material.name = json.name;\n\t\tif ( json.color !== undefined && material.color !== undefined ) material.color.setHex( json.color );\n\t\tif ( json.roughness !== undefined ) material.roughness = json.roughness;\n\t\tif ( json.metalness !== undefined ) material.metalness = json.metalness;\n\t\tif ( json.sheen !== undefined ) material.sheen = json.sheen;\n\t\tif ( json.sheenColor !== undefined ) material.sheenColor = new Color().setHex( json.sheenColor );\n\t\tif ( json.sheenRoughness !== undefined ) material.sheenRoughness = json.sheenRoughness;\n\t\tif ( json.emissive !== undefined && material.emissive !== undefined ) material.emissive.setHex( json.emissive );\n\t\tif ( json.specular !== undefined && material.specular !== undefined ) material.specular.setHex( json.specular );\n\t\tif ( json.specularIntensity !== undefined ) material.specularIntensity = json.specularIntensity;\n\t\tif ( json.specularColor !== undefined && material.specularColor !== undefined ) material.specularColor.setHex( json.specularColor );\n\t\tif ( json.shininess !== undefined ) material.shininess = json.shininess;\n\t\tif ( json.clearcoat !== undefined ) material.clearcoat = json.clearcoat;\n\t\tif ( json.clearcoatRoughness !== undefined ) material.clearcoatRoughness = json.clearcoatRoughness;\n\t\tif ( json.dispersion !== undefined ) material.dispersion = json.dispersion;\n\t\tif ( json.iridescence !== undefined ) material.iridescence = json.iridescence;\n\t\tif ( json.iridescenceIOR !== undefined ) material.iridescenceIOR = json.iridescenceIOR;\n\t\tif ( json.iridescenceThicknessRange !== undefined ) material.iridescenceThicknessRange = json.iridescenceThicknessRange;\n\t\tif ( json.transmission !== undefined ) material.transmission = json.transmission;\n\t\tif ( json.thickness !== undefined ) material.thickness = json.thickness;\n\t\tif ( json.attenuationDistance !== undefined ) material.attenuationDistance = json.attenuationDistance;\n\t\tif ( json.attenuationColor !== undefined && material.attenuationColor !== undefined ) material.attenuationColor.setHex( json.attenuationColor );\n\t\tif ( json.anisotropy !== undefined ) material.anisotropy = json.anisotropy;\n\t\tif ( json.anisotropyRotation !== undefined ) material.anisotropyRotation = json.anisotropyRotation;\n\t\tif ( json.fog !== undefined ) material.fog = json.fog;\n\t\tif ( json.flatShading !== undefined ) material.flatShading = json.flatShading;\n\t\tif ( json.blending !== undefined ) material.blending = json.blending;\n\t\tif ( json.combine !== undefined ) material.combine = json.combine;\n\t\tif ( json.side !== undefined ) material.side = json.side;\n\t\tif ( json.shadowSide !== undefined ) material.shadowSide = json.shadowSide;\n\t\tif ( json.opacity !== undefined ) material.opacity = json.opacity;\n\t\tif ( json.transparent !== undefined ) material.transparent = json.transparent;\n\t\tif ( json.alphaTest !== undefined ) material.alphaTest = json.alphaTest;\n\t\tif ( json.alphaHash !== undefined ) material.alphaHash = json.alphaHash;\n\t\tif ( json.depthFunc !== undefined ) material.depthFunc = json.depthFunc;\n\t\tif ( json.depthTest !== undefined ) material.depthTest = json.depthTest;\n\t\tif ( json.depthWrite !== undefined ) material.depthWrite = json.depthWrite;\n\t\tif ( json.colorWrite !== undefined ) material.colorWrite = json.colorWrite;\n\t\tif ( json.blendSrc !== undefined ) material.blendSrc = json.blendSrc;\n\t\tif ( json.blendDst !== undefined ) material.blendDst = json.blendDst;\n\t\tif ( json.blendEquation !== undefined ) material.blendEquation = json.blendEquation;\n\t\tif ( json.blendSrcAlpha !== undefined ) material.blendSrcAlpha = json.blendSrcAlpha;\n\t\tif ( json.blendDstAlpha !== undefined ) material.blendDstAlpha = json.blendDstAlpha;\n\t\tif ( json.blendEquationAlpha !== undefined ) material.blendEquationAlpha = json.blendEquationAlpha;\n\t\tif ( json.blendColor !== undefined && material.blendColor !== undefined ) material.blendColor.setHex( json.blendColor );\n\t\tif ( json.blendAlpha !== undefined ) material.blendAlpha = json.blendAlpha;\n\t\tif ( json.stencilWriteMask !== undefined ) material.stencilWriteMask = json.stencilWriteMask;\n\t\tif ( json.stencilFunc !== undefined ) material.stencilFunc = json.stencilFunc;\n\t\tif ( json.stencilRef !== undefined ) material.stencilRef = json.stencilRef;\n\t\tif ( json.stencilFuncMask !== undefined ) material.stencilFuncMask = json.stencilFuncMask;\n\t\tif ( json.stencilFail !== undefined ) material.stencilFail = json.stencilFail;\n\t\tif ( json.stencilZFail !== undefined ) material.stencilZFail = json.stencilZFail;\n\t\tif ( json.stencilZPass !== undefined ) material.stencilZPass = json.stencilZPass;\n\t\tif ( json.stencilWrite !== undefined ) material.stencilWrite = json.stencilWrite;\n\n\t\tif ( json.wireframe !== undefined ) material.wireframe = json.wireframe;\n\t\tif ( json.wireframeLinewidth !== undefined ) material.wireframeLinewidth = json.wireframeLinewidth;\n\t\tif ( json.wireframeLinecap !== undefined ) material.wireframeLinecap = json.wireframeLinecap;\n\t\tif ( json.wireframeLinejoin !== undefined ) material.wireframeLinejoin = json.wireframeLinejoin;\n\n\t\tif ( json.rotation !== undefined ) material.rotation = json.rotation;\n\n\t\tif ( json.linewidth !== undefined ) material.linewidth = json.linewidth;\n\t\tif ( json.dashSize !== undefined ) material.dashSize = json.dashSize;\n\t\tif ( json.gapSize !== undefined ) material.gapSize = json.gapSize;\n\t\tif ( json.scale !== undefined ) material.scale = json.scale;\n\n\t\tif ( json.polygonOffset !== undefined ) material.polygonOffset = json.polygonOffset;\n\t\tif ( json.polygonOffsetFactor !== undefined ) material.polygonOffsetFactor = json.polygonOffsetFactor;\n\t\tif ( json.polygonOffsetUnits !== undefined ) material.polygonOffsetUnits = json.polygonOffsetUnits;\n\n\t\tif ( json.dithering !== undefined ) material.dithering = json.dithering;\n\n\t\tif ( json.alphaToCoverage !== undefined ) material.alphaToCoverage = json.alphaToCoverage;\n\t\tif ( json.premultipliedAlpha !== undefined ) material.premultipliedAlpha = json.premultipliedAlpha;\n\t\tif ( json.forceSinglePass !== undefined ) material.forceSinglePass = json.forceSinglePass;\n\n\t\tif ( json.visible !== undefined ) material.visible = json.visible;\n\n\t\tif ( json.toneMapped !== undefined ) material.toneMapped = json.toneMapped;\n\n\t\tif ( json.userData !== undefined ) material.userData = json.userData;\n\n\t\tif ( json.vertexColors !== undefined ) {\n\n\t\t\tif ( typeof json.vertexColors === 'number' ) {\n\n\t\t\t\tmaterial.vertexColors = ( json.vertexColors > 0 ) ? true : false;\n\n\t\t\t} else {\n\n\t\t\t\tmaterial.vertexColors = json.vertexColors;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Shader Material\n\n\t\tif ( json.uniforms !== undefined ) {\n\n\t\t\tfor ( const name in json.uniforms ) {\n\n\t\t\t\tconst uniform = json.uniforms[ name ];\n\n\t\t\t\tmaterial.uniforms[ name ] = {};\n\n\t\t\t\tswitch ( uniform.type ) {\n\n\t\t\t\t\tcase 't':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = getTexture( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'c':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Color().setHex( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'v2':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Vector2().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'v3':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Vector3().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'v4':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Vector4().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'm3':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Matrix3().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'm4':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Matrix4().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = uniform.value;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( json.defines !== undefined ) material.defines = json.defines;\n\t\tif ( json.vertexShader !== undefined ) material.vertexShader = json.vertexShader;\n\t\tif ( json.fragmentShader !== undefined ) material.fragmentShader = json.fragmentShader;\n\t\tif ( json.glslVersion !== undefined ) material.glslVersion = json.glslVersion;\n\n\t\tif ( json.extensions !== undefined ) {\n\n\t\t\tfor ( const key in json.extensions ) {\n\n\t\t\t\tmaterial.extensions[ key ] = json.extensions[ key ];\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( json.lights !== undefined ) material.lights = json.lights;\n\t\tif ( json.clipping !== undefined ) material.clipping = json.clipping;\n\n\t\t// for PointsMaterial\n\n\t\tif ( json.size !== undefined ) material.size = json.size;\n\t\tif ( json.sizeAttenuation !== undefined ) material.sizeAttenuation = json.sizeAttenuation;\n\n\t\t// maps\n\n\t\tif ( json.map !== undefined ) material.map = getTexture( json.map );\n\t\tif ( json.matcap !== undefined ) material.matcap = getTexture( json.matcap );\n\n\t\tif ( json.alphaMap !== undefined ) material.alphaMap = getTexture( json.alphaMap );\n\n\t\tif ( json.bumpMap !== undefined ) material.bumpMap = getTexture( json.bumpMap );\n\t\tif ( json.bumpScale !== undefined ) material.bumpScale = json.bumpScale;\n\n\t\tif ( json.normalMap !== undefined ) material.normalMap = getTexture( json.normalMap );\n\t\tif ( json.normalMapType !== undefined ) material.normalMapType = json.normalMapType;\n\t\tif ( json.normalScale !== undefined ) {\n\n\t\t\tlet normalScale = json.normalScale;\n\n\t\t\tif ( Array.isArray( normalScale ) === false ) {\n\n\t\t\t\t// Blender exporter used to export a scalar. See #7459\n\n\t\t\t\tnormalScale = [ normalScale, normalScale ];\n\n\t\t\t}\n\n\t\t\tmaterial.normalScale = new Vector2().fromArray( normalScale );\n\n\t\t}\n\n\t\tif ( json.displacementMap !== undefined ) material.displacementMap = getTexture( json.displacementMap );\n\t\tif ( json.displacementScale !== undefined ) material.displacementScale = json.displacementScale;\n\t\tif ( json.displacementBias !== undefined ) material.displacementBias = json.displacementBias;\n\n\t\tif ( json.roughnessMap !== undefined ) material.roughnessMap = getTexture( json.roughnessMap );\n\t\tif ( json.metalnessMap !== undefined ) material.metalnessMap = getTexture( json.metalnessMap );\n\n\t\tif ( json.emissiveMap !== undefined ) material.emissiveMap = getTexture( json.emissiveMap );\n\t\tif ( json.emissiveIntensity !== undefined ) material.emissiveIntensity = json.emissiveIntensity;\n\n\t\tif ( json.specularMap !== undefined ) material.specularMap = getTexture( json.specularMap );\n\t\tif ( json.specularIntensityMap !== undefined ) material.specularIntensityMap = getTexture( json.specularIntensityMap );\n\t\tif ( json.specularColorMap !== undefined ) material.specularColorMap = getTexture( json.specularColorMap );\n\n\t\tif ( json.envMap !== undefined ) material.envMap = getTexture( json.envMap );\n\t\tif ( json.envMapRotation !== undefined ) material.envMapRotation.fromArray( json.envMapRotation );\n\t\tif ( json.envMapIntensity !== undefined ) material.envMapIntensity = json.envMapIntensity;\n\n\t\tif ( json.reflectivity !== undefined ) material.reflectivity = json.reflectivity;\n\t\tif ( json.refractionRatio !== undefined ) material.refractionRatio = json.refractionRatio;\n\n\t\tif ( json.lightMap !== undefined ) material.lightMap = getTexture( json.lightMap );\n\t\tif ( json.lightMapIntensity !== undefined ) material.lightMapIntensity = json.lightMapIntensity;\n\n\t\tif ( json.aoMap !== undefined ) material.aoMap = getTexture( json.aoMap );\n\t\tif ( json.aoMapIntensity !== undefined ) material.aoMapIntensity = json.aoMapIntensity;\n\n\t\tif ( json.gradientMap !== undefined ) material.gradientMap = getTexture( json.gradientMap );\n\n\t\tif ( json.clearcoatMap !== undefined ) material.clearcoatMap = getTexture( json.clearcoatMap );\n\t\tif ( json.clearcoatRoughnessMap !== undefined ) material.clearcoatRoughnessMap = getTexture( json.clearcoatRoughnessMap );\n\t\tif ( json.clearcoatNormalMap !== undefined ) material.clearcoatNormalMap = getTexture( json.clearcoatNormalMap );\n\t\tif ( json.clearcoatNormalScale !== undefined ) material.clearcoatNormalScale = new Vector2().fromArray( json.clearcoatNormalScale );\n\n\t\tif ( json.iridescenceMap !== undefined ) material.iridescenceMap = getTexture( json.iridescenceMap );\n\t\tif ( json.iridescenceThicknessMap !== undefined ) material.iridescenceThicknessMap = getTexture( json.iridescenceThicknessMap );\n\n\t\tif ( json.transmissionMap !== undefined ) material.transmissionMap = getTexture( json.transmissionMap );\n\t\tif ( json.thicknessMap !== undefined ) material.thicknessMap = getTexture( json.thicknessMap );\n\n\t\tif ( json.anisotropyMap !== undefined ) material.anisotropyMap = getTexture( json.anisotropyMap );\n\n\t\tif ( json.sheenColorMap !== undefined ) material.sheenColorMap = getTexture( json.sheenColorMap );\n\t\tif ( json.sheenRoughnessMap !== undefined ) material.sheenRoughnessMap = getTexture( json.sheenRoughnessMap );\n\n\t\treturn material;\n\n\t}\n\n\t/**\n\t * Textures are not embedded in the material JSON so they have\n\t * to be injected before the loading process starts.\n\t *\n\t * @param {Object} value - A dictionary holding textures for material properties.\n\t * @return {MaterialLoader} A reference to this material loader.\n\t */\n\tsetTextures( value ) {\n\n\t\tthis.textures = value;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Creates a material for the given type.\n\t *\n\t * @param {string} type - The material type.\n\t * @return {Material} The new material.\n\t */\n\tcreateMaterialFromType( type ) {\n\n\t\treturn MaterialLoader.createMaterialFromType( type );\n\n\t}\n\n\t/**\n\t * Creates a material for the given type.\n\t *\n\t * @static\n\t * @param {string} type - The material type.\n\t * @return {Material} The new material.\n\t */\n\tstatic createMaterialFromType( type ) {\n\n\t\tconst materialLib = {\n\t\t\tShadowMaterial,\n\t\t\tSpriteMaterial,\n\t\t\tRawShaderMaterial,\n\t\t\tShaderMaterial,\n\t\t\tPointsMaterial,\n\t\t\tMeshPhysicalMaterial,\n\t\t\tMeshStandardMaterial,\n\t\t\tMeshPhongMaterial,\n\t\t\tMeshToonMaterial,\n\t\t\tMeshNormalMaterial,\n\t\t\tMeshLambertMaterial,\n\t\t\tMeshDepthMaterial,\n\t\t\tMeshDistanceMaterial,\n\t\t\tMeshBasicMaterial,\n\t\t\tMeshMatcapMaterial,\n\t\t\tLineDashedMaterial,\n\t\t\tLineBasicMaterial,\n\t\t\tMaterial\n\t\t};\n\n\t\treturn new materialLib[ type ]();\n\n\t}\n\n}\n\n/**\n * A class with loader utility functions.\n */\nclass LoaderUtils {\n\n\t/**\n\t * Extracts the base URL from the given URL.\n\t *\n\t * @param {string} url -The URL to extract the base URL from.\n\t * @return {string} The extracted base URL.\n\t */\n\tstatic extractUrlBase( url ) {\n\n\t\tconst index = url.lastIndexOf( '/' );\n\n\t\tif ( index === -1 ) return './';\n\n\t\treturn url.slice( 0, index + 1 );\n\n\t}\n\n\t/**\n\t * Resolves relative URLs against the given path. Absolute paths, data urls,\n\t * and blob URLs will be returned as is. Invalid URLs will return an empty\n\t * string.\n\t *\n\t * @param {string} url -The URL to resolve.\n\t * @param {string} path - The base path for relative URLs to be resolved against.\n\t * @return {string} The resolved URL.\n\t */\n\tstatic resolveURL( url, path ) {\n\n\t\t// Invalid URL\n\t\tif ( typeof url !== 'string' || url === '' ) return '';\n\n\t\t// Host Relative URL\n\t\tif ( /^https?:\\/\\//i.test( path ) && /^\\//.test( url ) ) {\n\n\t\t\tpath = path.replace( /(^https?:\\/\\/[^\\/]+).*/i, '$1' );\n\n\t\t}\n\n\t\t// Absolute URL http://,https://,//\n\t\tif ( /^(https?:)?\\/\\//i.test( url ) ) return url;\n\n\t\t// Data URI\n\t\tif ( /^data:.*,.*$/i.test( url ) ) return url;\n\n\t\t// Blob URL\n\t\tif ( /^blob:.*$/i.test( url ) ) return url;\n\n\t\t// Relative URL\n\t\treturn path + url;\n\n\t}\n\n}\n\n/**\n * An instanced version of a geometry.\n */\nclass InstancedBufferGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new instanced buffer geometry.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isInstancedBufferGeometry = true;\n\n\t\tthis.type = 'InstancedBufferGeometry';\n\n\t\t/**\n\t\t * The instance count.\n\t\t *\n\t\t * @type {number}\n\t\t * @default Infinity\n\t\t */\n\t\tthis.instanceCount = Infinity;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.instanceCount = source.instanceCount;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.instanceCount = this.instanceCount;\n\n\t\tdata.isInstancedBufferGeometry = true;\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * Class for loading geometries. The files are internally\n * loaded via {@link FileLoader}.\n *\n * ```js\n * const loader = new THREE.BufferGeometryLoader();\n * const geometry = await loader.loadAsync( 'models/json/pressure.json' );\n *\n * const material = new THREE.MeshBasicMaterial( { color: 0xF5F5F5 } );\n * const object = new THREE.Mesh( geometry, material );\n * scene.add( object );\n * ```\n *\n * @augments Loader\n */\nclass BufferGeometryLoader extends Loader {\n\n\t/**\n\t * Constructs a new geometry loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and pass the loaded geometry to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(BufferGeometry)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( scope.manager );\n\t\tloader.setPath( scope.path );\n\t\tloader.setRequestHeader( scope.requestHeader );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\terror( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\t/**\n\t * Parses the given JSON object and returns a geometry.\n\t *\n\t * @param {Object} json - The serialized geometry.\n\t * @return {BufferGeometry} The parsed geometry.\n\t */\n\tparse( json ) {\n\n\t\tconst interleavedBufferMap = {};\n\t\tconst arrayBufferMap = {};\n\n\t\tfunction getInterleavedBuffer( json, uuid ) {\n\n\t\t\tif ( interleavedBufferMap[ uuid ] !== undefined ) return interleavedBufferMap[ uuid ];\n\n\t\t\tconst interleavedBuffers = json.interleavedBuffers;\n\t\t\tconst interleavedBuffer = interleavedBuffers[ uuid ];\n\n\t\t\tconst buffer = getArrayBuffer( json, interleavedBuffer.buffer );\n\n\t\t\tconst array = getTypedArray( interleavedBuffer.type, buffer );\n\t\t\tconst ib = new InterleavedBuffer( array, interleavedBuffer.stride );\n\t\t\tib.uuid = interleavedBuffer.uuid;\n\n\t\t\tinterleavedBufferMap[ uuid ] = ib;\n\n\t\t\treturn ib;\n\n\t\t}\n\n\t\tfunction getArrayBuffer( json, uuid ) {\n\n\t\t\tif ( arrayBufferMap[ uuid ] !== undefined ) return arrayBufferMap[ uuid ];\n\n\t\t\tconst arrayBuffers = json.arrayBuffers;\n\t\t\tconst arrayBuffer = arrayBuffers[ uuid ];\n\n\t\t\tconst ab = new Uint32Array( arrayBuffer ).buffer;\n\n\t\t\tarrayBufferMap[ uuid ] = ab;\n\n\t\t\treturn ab;\n\n\t\t}\n\n\t\tconst geometry = json.isInstancedBufferGeometry ? new InstancedBufferGeometry() : new BufferGeometry();\n\n\t\tconst index = json.data.index;\n\n\t\tif ( index !== undefined ) {\n\n\t\t\tconst typedArray = getTypedArray( index.type, index.array );\n\t\t\tgeometry.setIndex( new BufferAttribute( typedArray, 1 ) );\n\n\t\t}\n\n\t\tconst attributes = json.data.attributes;\n\n\t\tfor ( const key in attributes ) {\n\n\t\t\tconst attribute = attributes[ key ];\n\t\t\tlet bufferAttribute;\n\n\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\tconst interleavedBuffer = getInterleavedBuffer( json.data, attribute.data );\n\t\t\t\tbufferAttribute = new InterleavedBufferAttribute( interleavedBuffer, attribute.itemSize, attribute.offset, attribute.normalized );\n\n\t\t\t} else {\n\n\t\t\t\tconst typedArray = getTypedArray( attribute.type, attribute.array );\n\t\t\t\tconst bufferAttributeConstr = attribute.isInstancedBufferAttribute ? InstancedBufferAttribute : BufferAttribute;\n\t\t\t\tbufferAttribute = new bufferAttributeConstr( typedArray, attribute.itemSize, attribute.normalized );\n\n\t\t\t}\n\n\t\t\tif ( attribute.name !== undefined ) bufferAttribute.name = attribute.name;\n\t\t\tif ( attribute.usage !== undefined ) bufferAttribute.setUsage( attribute.usage );\n\n\t\t\tgeometry.setAttribute( key, bufferAttribute );\n\n\t\t}\n\n\t\tconst morphAttributes = json.data.morphAttributes;\n\n\t\tif ( morphAttributes ) {\n\n\t\t\tfor ( const key in morphAttributes ) {\n\n\t\t\t\tconst attributeArray = morphAttributes[ key ];\n\n\t\t\t\tconst array = [];\n\n\t\t\t\tfor ( let i = 0, il = attributeArray.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst attribute = attributeArray[ i ];\n\t\t\t\t\tlet bufferAttribute;\n\n\t\t\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\t\t\tconst interleavedBuffer = getInterleavedBuffer( json.data, attribute.data );\n\t\t\t\t\t\tbufferAttribute = new InterleavedBufferAttribute( interleavedBuffer, attribute.itemSize, attribute.offset, attribute.normalized );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconst typedArray = getTypedArray( attribute.type, attribute.array );\n\t\t\t\t\t\tbufferAttribute = new BufferAttribute( typedArray, attribute.itemSize, attribute.normalized );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( attribute.name !== undefined ) bufferAttribute.name = attribute.name;\n\t\t\t\t\tarray.push( bufferAttribute );\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.morphAttributes[ key ] = array;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst morphTargetsRelative = json.data.morphTargetsRelative;\n\n\t\tif ( morphTargetsRelative ) {\n\n\t\t\tgeometry.morphTargetsRelative = true;\n\n\t\t}\n\n\t\tconst groups = json.data.groups || json.data.drawcalls || json.data.offsets;\n\n\t\tif ( groups !== undefined ) {\n\n\t\t\tfor ( let i = 0, n = groups.length; i !== n; ++ i ) {\n\n\t\t\t\tconst group = groups[ i ];\n\n\t\t\t\tgeometry.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst boundingSphere = json.data.boundingSphere;\n\n\t\tif ( boundingSphere !== undefined ) {\n\n\t\t\tgeometry.boundingSphere = new Sphere().fromJSON( boundingSphere );\n\n\t\t}\n\n\t\tif ( json.name ) geometry.name = json.name;\n\t\tif ( json.userData ) geometry.userData = json.userData;\n\n\t\treturn geometry;\n\n\t}\n\n}\n\n/**\n * A loader for loading a JSON resource in the [JSON Object/Scene format](https://github.com/mrdoob/three.js/wiki/JSON-Object-Scene-format-4).\n * The files are internally loaded via {@link FileLoader}.\n *\n * ```js\n * const loader = new THREE.ObjectLoader();\n * const obj = await loader.loadAsync( 'models/json/example.json' );\n * scene.add( obj );\n *\n * // Alternatively, to parse a previously loaded JSON structure\n * const object = await loader.parseAsync( a_json_object );\n * scene.add( object );\n * ```\n *\n * @augments Loader\n */\nclass ObjectLoader extends Loader {\n\n\t/**\n\t * Constructs a new object loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and pass the loaded 3D object to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(Object3D)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst path = ( this.path === '' ) ? LoaderUtils.extractUrlBase( url ) : this.path;\n\t\tthis.resourcePath = this.resourcePath || path;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\tlet json = null;\n\n\t\t\ttry {\n\n\t\t\t\tjson = JSON.parse( text );\n\n\t\t\t} catch ( error ) {\n\n\t\t\t\tif ( onError !== undefined ) onError( error );\n\n\t\t\t\terror( 'ObjectLoader: Can\\'t parse ' + url + '.', error.message );\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tconst metadata = json.metadata;\n\n\t\t\tif ( metadata === undefined || metadata.type === undefined || metadata.type.toLowerCase() === 'geometry' ) {\n\n\t\t\t\tif ( onError !== undefined ) onError( new Error( 'THREE.ObjectLoader: Can\\'t load ' + url ) );\n\n\t\t\t\terror( 'ObjectLoader: Can\\'t load ' + url );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tscope.parse( json, onLoad );\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\t/**\n\t * Async version of {@link ObjectLoader#load}.\n\t *\n\t * @async\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @return {Promise<Object3D>} A Promise that resolves with the loaded 3D object.\n\t */\n\tasync loadAsync( url, onProgress ) {\n\n\t\tconst scope = this;\n\n\t\tconst path = ( this.path === '' ) ? LoaderUtils.extractUrlBase( url ) : this.path;\n\t\tthis.resourcePath = this.resourcePath || path;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\n\t\tconst text = await loader.loadAsync( url, onProgress );\n\n\t\tconst json = JSON.parse( text );\n\n\t\tconst metadata = json.metadata;\n\n\t\tif ( metadata === undefined || metadata.type === undefined || metadata.type.toLowerCase() === 'geometry' ) {\n\n\t\t\tthrow new Error( 'THREE.ObjectLoader: Can\\'t load ' + url );\n\n\t\t}\n\n\t\treturn await scope.parseAsync( json );\n\n\t}\n\n\t/**\n\t * Parses the given JSON. This is used internally by {@link ObjectLoader#load}\n\t * but can also be used directly to parse a previously loaded JSON structure.\n\t *\n\t * @param {Object} json - The serialized 3D object.\n\t * @param {onLoad} onLoad - Executed when all resources (e.g. textures) have been fully loaded.\n\t * @return {Object3D} The parsed 3D object.\n\t */\n\tparse( json, onLoad ) {\n\n\t\tconst animations = this.parseAnimations( json.animations );\n\t\tconst shapes = this.parseShapes( json.shapes );\n\t\tconst geometries = this.parseGeometries( json.geometries, shapes );\n\n\t\tconst images = this.parseImages( json.images, function () {\n\n\t\t\tif ( onLoad !== undefined ) onLoad( object );\n\n\t\t} );\n\n\t\tconst textures = this.parseTextures( json.textures, images );\n\t\tconst materials = this.parseMaterials( json.materials, textures );\n\n\t\tconst object = this.parseObject( json.object, geometries, materials, textures, animations );\n\t\tconst skeletons = this.parseSkeletons( json.skeletons, object );\n\n\t\tthis.bindSkeletons( object, skeletons );\n\t\tthis.bindLightTargets( object );\n\n\t\t//\n\n\t\tif ( onLoad !== undefined ) {\n\n\t\t\tlet hasImages = false;\n\n\t\t\tfor ( const uuid in images ) {\n\n\t\t\t\tif ( images[ uuid ].data instanceof HTMLImageElement ) {\n\n\t\t\t\t\thasImages = true;\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( hasImages === false ) onLoad( object );\n\n\t\t}\n\n\t\treturn object;\n\n\t}\n\n\t/**\n\t * Async version of {@link ObjectLoader#parse}.\n\t *\n\t * @param {Object} json - The serialized 3D object.\n\t * @return {Promise<Object3D>} A Promise that resolves with the parsed 3D object.\n\t */\n\tasync parseAsync( json ) {\n\n\t\tconst animations = this.parseAnimations( json.animations );\n\t\tconst shapes = this.parseShapes( json.shapes );\n\t\tconst geometries = this.parseGeometries( json.geometries, shapes );\n\n\t\tconst images = await this.parseImagesAsync( json.images );\n\n\t\tconst textures = this.parseTextures( json.textures, images );\n\t\tconst materials = this.parseMaterials( json.materials, textures );\n\n\t\tconst object = this.parseObject( json.object, geometries, materials, textures, animations );\n\t\tconst skeletons = this.parseSkeletons( json.skeletons, object );\n\n\t\tthis.bindSkeletons( object, skeletons );\n\t\tthis.bindLightTargets( object );\n\n\t\treturn object;\n\n\t}\n\n\t// internals\n\n\tparseShapes( json ) {\n\n\t\tconst shapes = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tconst shape = new Shape().fromJSON( json[ i ] );\n\n\t\t\t\tshapes[ shape.uuid ] = shape;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn shapes;\n\n\t}\n\n\tparseSkeletons( json, object ) {\n\n\t\tconst skeletons = {};\n\t\tconst bones = {};\n\n\t\t// generate bone lookup table\n\n\t\tobject.traverse( function ( child ) {\n\n\t\t\tif ( child.isBone ) bones[ child.uuid ] = child;\n\n\t\t} );\n\n\t\t// create skeletons\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tconst skeleton = new Skeleton().fromJSON( json[ i ], bones );\n\n\t\t\t\tskeletons[ skeleton.uuid ] = skeleton;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn skeletons;\n\n\t}\n\n\tparseGeometries( json, shapes ) {\n\n\t\tconst geometries = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tconst bufferGeometryLoader = new BufferGeometryLoader();\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tlet geometry;\n\t\t\t\tconst data = json[ i ];\n\n\t\t\t\tswitch ( data.type ) {\n\n\t\t\t\t\tcase 'BufferGeometry':\n\t\t\t\t\tcase 'InstancedBufferGeometry':\n\n\t\t\t\t\t\tgeometry = bufferGeometryLoader.parse( data );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tif ( data.type in Geometries ) {\n\n\t\t\t\t\t\t\tgeometry = Geometries[ data.type ].fromJSON( data, shapes );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\twarn( `ObjectLoader: Unsupported geometry type \"${ data.type }\"` );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.uuid = data.uuid;\n\n\t\t\t\tif ( data.name !== undefined ) geometry.name = data.name;\n\t\t\t\tif ( data.userData !== undefined ) geometry.userData = data.userData;\n\n\t\t\t\tgeometries[ data.uuid ] = geometry;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn geometries;\n\n\t}\n\n\tparseMaterials( json, textures ) {\n\n\t\tconst cache = {}; // MultiMaterial\n\t\tconst materials = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tconst loader = new MaterialLoader();\n\t\t\tloader.setTextures( textures );\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tconst data = json[ i ];\n\n\t\t\t\tif ( cache[ data.uuid ] === undefined ) {\n\n\t\t\t\t\tcache[ data.uuid ] = loader.parse( data );\n\n\t\t\t\t}\n\n\t\t\t\tmaterials[ data.uuid ] = cache[ data.uuid ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn materials;\n\n\t}\n\n\tparseAnimations( json ) {\n\n\t\tconst animations = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tfor ( let i = 0; i < json.length; i ++ ) {\n\n\t\t\t\tconst data = json[ i ];\n\n\t\t\t\tconst clip = AnimationClip.parse( data );\n\n\t\t\t\tanimations[ clip.uuid ] = clip;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn animations;\n\n\t}\n\n\tparseImages( json, onLoad ) {\n\n\t\tconst scope = this;\n\t\tconst images = {};\n\n\t\tlet loader;\n\n\t\tfunction loadImage( url ) {\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\treturn loader.load( url, function () {\n\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t}, undefined, function () {\n\n\t\t\t\tscope.manager.itemError( url );\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t} );\n\n\t\t}\n\n\t\tfunction deserializeImage( image ) {\n\n\t\t\tif ( typeof image === 'string' ) {\n\n\t\t\t\tconst url = image;\n\n\t\t\t\tconst path = /^(\\/\\/)|([a-z]+:(\\/\\/)?)/i.test( url ) ? url : scope.resourcePath + url;\n\n\t\t\t\treturn loadImage( path );\n\n\t\t\t} else {\n\n\t\t\t\tif ( image.data ) {\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tdata: getTypedArray( image.type, image.data ),\n\t\t\t\t\t\twidth: image.width,\n\t\t\t\t\t\theight: image.height\n\t\t\t\t\t};\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( json !== undefined && json.length > 0 ) {\n\n\t\t\tconst manager = new LoadingManager( onLoad );\n\n\t\t\tloader = new ImageLoader( manager );\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\n\t\t\tfor ( let i = 0, il = json.length; i < il; i ++ ) {\n\n\t\t\t\tconst image = json[ i ];\n\t\t\t\tconst url = image.url;\n\n\t\t\t\tif ( Array.isArray( url ) ) {\n\n\t\t\t\t\t// load array of images e.g CubeTexture\n\n\t\t\t\t\tconst imageArray = [];\n\n\t\t\t\t\tfor ( let j = 0, jl = url.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tconst currentUrl = url[ j ];\n\n\t\t\t\t\t\tconst deserializedImage = deserializeImage( currentUrl );\n\n\t\t\t\t\t\tif ( deserializedImage !== null ) {\n\n\t\t\t\t\t\t\tif ( deserializedImage instanceof HTMLImageElement ) {\n\n\t\t\t\t\t\t\t\timageArray.push( deserializedImage );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// special case: handle array of data textures for cube textures\n\n\t\t\t\t\t\t\t\timageArray.push( new DataTexture( deserializedImage.data, deserializedImage.width, deserializedImage.height ) );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\timages[ image.uuid ] = new Source( imageArray );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// load single image\n\n\t\t\t\t\tconst deserializedImage = deserializeImage( image.url );\n\t\t\t\t\timages[ image.uuid ] = new Source( deserializedImage );\n\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn images;\n\n\t}\n\n\tasync parseImagesAsync( json ) {\n\n\t\tconst scope = this;\n\t\tconst images = {};\n\n\t\tlet loader;\n\n\t\tasync function deserializeImage( image ) {\n\n\t\t\tif ( typeof image === 'string' ) {\n\n\t\t\t\tconst url = image;\n\n\t\t\t\tconst path = /^(\\/\\/)|([a-z]+:(\\/\\/)?)/i.test( url ) ? url : scope.resourcePath + url;\n\n\t\t\t\treturn await loader.loadAsync( path );\n\n\t\t\t} else {\n\n\t\t\t\tif ( image.data ) {\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tdata: getTypedArray( image.type, image.data ),\n\t\t\t\t\t\twidth: image.width,\n\t\t\t\t\t\theight: image.height\n\t\t\t\t\t};\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( json !== undefined && json.length > 0 ) {\n\n\t\t\tloader = new ImageLoader( this.manager );\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\n\t\t\tfor ( let i = 0, il = json.length; i < il; i ++ ) {\n\n\t\t\t\tconst image = json[ i ];\n\t\t\t\tconst url = image.url;\n\n\t\t\t\tif ( Array.isArray( url ) ) {\n\n\t\t\t\t\t// load array of images e.g CubeTexture\n\n\t\t\t\t\tconst imageArray = [];\n\n\t\t\t\t\tfor ( let j = 0, jl = url.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tconst currentUrl = url[ j ];\n\n\t\t\t\t\t\tconst deserializedImage = await deserializeImage( currentUrl );\n\n\t\t\t\t\t\tif ( deserializedImage !== null ) {\n\n\t\t\t\t\t\t\tif ( deserializedImage instanceof HTMLImageElement ) {\n\n\t\t\t\t\t\t\t\timageArray.push( deserializedImage );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// special case: handle array of data textures for cube textures\n\n\t\t\t\t\t\t\t\timageArray.push( new DataTexture( deserializedImage.data, deserializedImage.width, deserializedImage.height ) );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\timages[ image.uuid ] = new Source( imageArray );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// load single image\n\n\t\t\t\t\tconst deserializedImage = await deserializeImage( image.url );\n\t\t\t\t\timages[ image.uuid ] = new Source( deserializedImage );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn images;\n\n\t}\n\n\tparseTextures( json, images ) {\n\n\t\tfunction parseConstant( value, type ) {\n\n\t\t\tif ( typeof value === 'number' ) return value;\n\n\t\t\twarn( 'ObjectLoader.parseTexture: Constant should be in numeric form.', value );\n\n\t\t\treturn type[ value ];\n\n\t\t}\n\n\t\tconst textures = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tconst data = json[ i ];\n\n\t\t\t\tif ( data.image === undefined ) {\n\n\t\t\t\t\twarn( 'ObjectLoader: No \"image\" specified for', data.uuid );\n\n\t\t\t\t}\n\n\t\t\t\tif ( images[ data.image ] === undefined ) {\n\n\t\t\t\t\twarn( 'ObjectLoader: Undefined image', data.image );\n\n\t\t\t\t}\n\n\t\t\t\tconst source = images[ data.image ];\n\t\t\t\tconst image = source.data;\n\n\t\t\t\tlet texture;\n\n\t\t\t\tif ( Array.isArray( image ) ) {\n\n\t\t\t\t\ttexture = new CubeTexture();\n\n\t\t\t\t\tif ( image.length === 6 ) texture.needsUpdate = true;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( image && image.data ) {\n\n\t\t\t\t\t\ttexture = new DataTexture();\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttexture = new Texture();\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( image ) texture.needsUpdate = true; // textures can have undefined image data\n\n\t\t\t\t}\n\n\t\t\t\ttexture.source = source;\n\n\t\t\t\ttexture.uuid = data.uuid;\n\n\t\t\t\tif ( data.name !== undefined ) texture.name = data.name;\n\n\t\t\t\tif ( data.mapping !== undefined ) texture.mapping = parseConstant( data.mapping, TEXTURE_MAPPING );\n\t\t\t\tif ( data.channel !== undefined ) texture.channel = data.channel;\n\n\t\t\t\tif ( data.offset !== undefined ) texture.offset.fromArray( data.offset );\n\t\t\t\tif ( data.repeat !== undefined ) texture.repeat.fromArray( data.repeat );\n\t\t\t\tif ( data.center !== undefined ) texture.center.fromArray( data.center );\n\t\t\t\tif ( data.rotation !== undefined ) texture.rotation = data.rotation;\n\n\t\t\t\tif ( data.wrap !== undefined ) {\n\n\t\t\t\t\ttexture.wrapS = parseConstant( data.wrap[ 0 ], TEXTURE_WRAPPING );\n\t\t\t\t\ttexture.wrapT = parseConstant( data.wrap[ 1 ], TEXTURE_WRAPPING );\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.format !== undefined ) texture.format = data.format;\n\t\t\t\tif ( data.internalFormat !== undefined ) texture.internalFormat = data.internalFormat;\n\t\t\t\tif ( data.type !== undefined ) texture.type = data.type;\n\t\t\t\tif ( data.colorSpace !== undefined ) texture.colorSpace = data.colorSpace;\n\n\t\t\t\tif ( data.minFilter !== undefined ) texture.minFilter = parseConstant( data.minFilter, TEXTURE_FILTER );\n\t\t\t\tif ( data.magFilter !== undefined ) texture.magFilter = parseConstant( data.magFilter, TEXTURE_FILTER );\n\t\t\t\tif ( data.anisotropy !== undefined ) texture.anisotropy = data.anisotropy;\n\n\t\t\t\tif ( data.flipY !== undefined ) texture.flipY = data.flipY;\n\n\t\t\t\tif ( data.generateMipmaps !== undefined ) texture.generateMipmaps = data.generateMipmaps;\n\t\t\t\tif ( data.premultiplyAlpha !== undefined ) texture.premultiplyAlpha = data.premultiplyAlpha;\n\t\t\t\tif ( data.unpackAlignment !== undefined ) texture.unpackAlignment = data.unpackAlignment;\n\t\t\t\tif ( data.compareFunction !== undefined ) texture.compareFunction = data.compareFunction;\n\n\t\t\t\tif ( data.userData !== undefined ) texture.userData = data.userData;\n\n\t\t\t\ttextures[ data.uuid ] = texture;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn textures;\n\n\t}\n\n\tparseObject( data, geometries, materials, textures, animations ) {\n\n\t\tlet object;\n\n\t\tfunction getGeometry( name ) {\n\n\t\t\tif ( geometries[ name ] === undefined ) {\n\n\t\t\t\twarn( 'ObjectLoader: Undefined geometry', name );\n\n\t\t\t}\n\n\t\t\treturn geometries[ name ];\n\n\t\t}\n\n\t\tfunction getMaterial( name ) {\n\n\t\t\tif ( name === undefined ) return undefined;\n\n\t\t\tif ( Array.isArray( name ) ) {\n\n\t\t\t\tconst array = [];\n\n\t\t\t\tfor ( let i = 0, l = name.length; i < l; i ++ ) {\n\n\t\t\t\t\tconst uuid = name[ i ];\n\n\t\t\t\t\tif ( materials[ uuid ] === undefined ) {\n\n\t\t\t\t\t\twarn( 'ObjectLoader: Undefined material', uuid );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tarray.push( materials[ uuid ] );\n\n\t\t\t\t}\n\n\t\t\t\treturn array;\n\n\t\t\t}\n\n\t\t\tif ( materials[ name ] === undefined ) {\n\n\t\t\t\twarn( 'ObjectLoader: Undefined material', name );\n\n\t\t\t}\n\n\t\t\treturn materials[ name ];\n\n\t\t}\n\n\t\tfunction getTexture( uuid ) {\n\n\t\t\tif ( textures[ uuid ] === undefined ) {\n\n\t\t\t\twarn( 'ObjectLoader: Undefined texture', uuid );\n\n\t\t\t}\n\n\t\t\treturn textures[ uuid ];\n\n\t\t}\n\n\t\tlet geometry, material;\n\n\t\tswitch ( data.type ) {\n\n\t\t\tcase 'Scene':\n\n\t\t\t\tobject = new Scene();\n\n\t\t\t\tif ( data.background !== undefined ) {\n\n\t\t\t\t\tif ( Number.isInteger( data.background ) ) {\n\n\t\t\t\t\t\tobject.background = new Color( data.background );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tobject.background = getTexture( data.background );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.environment !== undefined ) {\n\n\t\t\t\t\tobject.environment = getTexture( data.environment );\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.fog !== undefined ) {\n\n\t\t\t\t\tif ( data.fog.type === 'Fog' ) {\n\n\t\t\t\t\t\tobject.fog = new Fog( data.fog.color, data.fog.near, data.fog.far );\n\n\t\t\t\t\t} else if ( data.fog.type === 'FogExp2' ) {\n\n\t\t\t\t\t\tobject.fog = new FogExp2( data.fog.color, data.fog.density );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( data.fog.name !== '' ) {\n\n\t\t\t\t\t\tobject.fog.name = data.fog.name;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.backgroundBlurriness !== undefined ) object.backgroundBlurriness = data.backgroundBlurriness;\n\t\t\t\tif ( data.backgroundIntensity !== undefined ) object.backgroundIntensity = data.backgroundIntensity;\n\t\t\t\tif ( data.backgroundRotation !== undefined ) object.backgroundRotation.fromArray( data.backgroundRotation );\n\n\t\t\t\tif ( data.environmentIntensity !== undefined ) object.environmentIntensity = data.environmentIntensity;\n\t\t\t\tif ( data.environmentRotation !== undefined ) object.environmentRotation.fromArray( data.environmentRotation );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'PerspectiveCamera':\n\n\t\t\t\tobject = new PerspectiveCamera( data.fov, data.aspect, data.near, data.far );\n\n\t\t\t\tif ( data.focus !== undefined ) object.focus = data.focus;\n\t\t\t\tif ( data.zoom !== undefined ) object.zoom = data.zoom;\n\t\t\t\tif ( data.filmGauge !== undefined ) object.filmGauge = data.filmGauge;\n\t\t\t\tif ( data.filmOffset !== undefined ) object.filmOffset = data.filmOffset;\n\t\t\t\tif ( data.view !== undefined ) object.view = Object.assign( {}, data.view );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'OrthographicCamera':\n\n\t\t\t\tobject = new OrthographicCamera( data.left, data.right, data.top, data.bottom, data.near, data.far );\n\n\t\t\t\tif ( data.zoom !== undefined ) object.zoom = data.zoom;\n\t\t\t\tif ( data.view !== undefined ) object.view = Object.assign( {}, data.view );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'AmbientLight':\n\n\t\t\t\tobject = new AmbientLight( data.color, data.intensity );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'DirectionalLight':\n\n\t\t\t\tobject = new DirectionalLight( data.color, data.intensity );\n\t\t\t\tobject.target = data.target || '';\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'PointLight':\n\n\t\t\t\tobject = new PointLight( data.color, data.intensity, data.distance, data.decay );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'RectAreaLight':\n\n\t\t\t\tobject = new RectAreaLight( data.color, data.intensity, data.width, data.height );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'SpotLight':\n\n\t\t\t\tobject = new SpotLight( data.color, data.intensity, data.distance, data.angle, data.penumbra, data.decay );\n\t\t\t\tobject.target = data.target || '';\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'HemisphereLight':\n\n\t\t\t\tobject = new HemisphereLight( data.color, data.groundColor, data.intensity );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'LightProbe':\n\n\t\t\t\tobject = new LightProbe().fromJSON( data );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'SkinnedMesh':\n\n\t\t\t\tgeometry = getGeometry( data.geometry );\n\t\t\t \tmaterial = getMaterial( data.material );\n\n\t\t\t\tobject = new SkinnedMesh( geometry, material );\n\n\t\t\t\tif ( data.bindMode !== undefined ) object.bindMode = data.bindMode;\n\t\t\t\tif ( data.bindMatrix !== undefined ) object.bindMatrix.fromArray( data.bindMatrix );\n\t\t\t\tif ( data.skeleton !== undefined ) object.skeleton = data.skeleton;\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Mesh':\n\n\t\t\t\tgeometry = getGeometry( data.geometry );\n\t\t\t\tmaterial = getMaterial( data.material );\n\n\t\t\t\tobject = new Mesh( geometry, material );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'InstancedMesh':\n\n\t\t\t\tgeometry = getGeometry( data.geometry );\n\t\t\t\tmaterial = getMaterial( data.material );\n\t\t\t\tconst count = data.count;\n\t\t\t\tconst instanceMatrix = data.instanceMatrix;\n\t\t\t\tconst instanceColor = data.instanceColor;\n\n\t\t\t\tobject = new InstancedMesh( geometry, material, count );\n\t\t\t\tobject.instanceMatrix = new InstancedBufferAttribute( new Float32Array( instanceMatrix.array ), 16 );\n\t\t\t\tif ( instanceColor !== undefined ) object.instanceColor = new InstancedBufferAttribute( new Float32Array( instanceColor.array ), instanceColor.itemSize );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'BatchedMesh':\n\n\t\t\t\tgeometry = getGeometry( data.geometry );\n\t\t\t\tmaterial = getMaterial( data.material );\n\n\t\t\t\tobject = new BatchedMesh( data.maxInstanceCount, data.maxVertexCount, data.maxIndexCount, material );\n\t\t\t\tobject.geometry = geometry;\n\t\t\t\tobject.perObjectFrustumCulled = data.perObjectFrustumCulled;\n\t\t\t\tobject.sortObjects = data.sortObjects;\n\n\t\t\t\tobject._drawRanges = data.drawRanges;\n\t\t\t\tobject._reservedRanges = data.reservedRanges;\n\n\t\t\t\tobject._geometryInfo = data.geometryInfo.map( info => {\n\n\t\t\t\t\tlet box = null;\n\t\t\t\t\tlet sphere = null;\n\t\t\t\t\tif ( info.boundingBox !== undefined ) {\n\n\t\t\t\t\t\tbox = new Box3().fromJSON( info.boundingBox );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( info.boundingSphere !== undefined ) {\n\n\t\t\t\t\t\tsphere = new Sphere().fromJSON( info.boundingSphere );\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...info,\n\t\t\t\t\t\tboundingBox: box,\n\t\t\t\t\t\tboundingSphere: sphere\n\t\t\t\t\t};\n\n\t\t\t\t} );\n\t\t\t\tobject._instanceInfo = data.instanceInfo;\n\n\t\t\t\tobject._availableInstanceIds = data._availableInstanceIds;\n\t\t\t\tobject._availableGeometryIds = data._availableGeometryIds;\n\n\t\t\t\tobject._nextIndexStart = data.nextIndexStart;\n\t\t\t\tobject._nextVertexStart = data.nextVertexStart;\n\t\t\t\tobject._geometryCount = data.geometryCount;\n\n\t\t\t\tobject._maxInstanceCount = data.maxInstanceCount;\n\t\t\t\tobject._maxVertexCount = data.maxVertexCount;\n\t\t\t\tobject._maxIndexCount = data.maxIndexCount;\n\n\t\t\t\tobject._geometryInitialized = data.geometryInitialized;\n\n\t\t\t\tobject._matricesTexture = getTexture( data.matricesTexture.uuid );\n\n\t\t\t\tobject._indirectTexture = getTexture( data.indirectTexture.uuid );\n\n\t\t\t\tif ( data.colorsTexture !== undefined ) {\n\n\t\t\t\t\tobject._colorsTexture = getTexture( data.colorsTexture.uuid );\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.boundingSphere !== undefined ) {\n\n\t\t\t\t\tobject.boundingSphere = new Sphere().fromJSON( data.boundingSphere );\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.boundingBox !== undefined ) {\n\n\t\t\t\t\tobject.boundingBox = new Box3().fromJSON( data.boundingBox );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'LOD':\n\n\t\t\t\tobject = new LOD();\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Line':\n\n\t\t\t\tobject = new Line( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'LineLoop':\n\n\t\t\t\tobject = new LineLoop( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'LineSegments':\n\n\t\t\t\tobject = new LineSegments( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'PointCloud':\n\t\t\tcase 'Points':\n\n\t\t\t\tobject = new Points( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Sprite':\n\n\t\t\t\tobject = new Sprite( getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Group':\n\n\t\t\t\tobject = new Group();\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Bone':\n\n\t\t\t\tobject = new Bone();\n\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tobject = new Object3D();\n\n\t\t}\n\n\t\tobject.uuid = data.uuid;\n\n\t\tif ( data.name !== undefined ) object.name = data.name;\n\n\t\tif ( data.matrix !== undefined ) {\n\n\t\t\tobject.matrix.fromArray( data.matrix );\n\n\t\t\tif ( data.matrixAutoUpdate !== undefined ) object.matrixAutoUpdate = data.matrixAutoUpdate;\n\t\t\tif ( object.matrixAutoUpdate ) object.matrix.decompose( object.position, object.quaternion, object.scale );\n\n\t\t} else {\n\n\t\t\tif ( data.position !== undefined ) object.position.fromArray( data.position );\n\t\t\tif ( data.rotation !== undefined ) object.rotation.fromArray( data.rotation );\n\t\t\tif ( data.quaternion !== undefined ) object.quaternion.fromArray( data.quaternion );\n\t\t\tif ( data.scale !== undefined ) object.scale.fromArray( data.scale );\n\n\t\t}\n\n\t\tif ( data.up !== undefined ) object.up.fromArray( data.up );\n\n\t\tif ( data.castShadow !== undefined ) object.castShadow = data.castShadow;\n\t\tif ( data.receiveShadow !== undefined ) object.receiveShadow = data.receiveShadow;\n\n\t\tif ( data.shadow ) {\n\n\t\t\tif ( data.shadow.intensity !== undefined ) object.shadow.intensity = data.shadow.intensity;\n\t\t\tif ( data.shadow.bias !== undefined ) object.shadow.bias = data.shadow.bias;\n\t\t\tif ( data.shadow.normalBias !== undefined ) object.shadow.normalBias = data.shadow.normalBias;\n\t\t\tif ( data.shadow.radius !== undefined ) object.shadow.radius = data.shadow.radius;\n\t\t\tif ( data.shadow.mapSize !== undefined ) object.shadow.mapSize.fromArray( data.shadow.mapSize );\n\t\t\tif ( data.shadow.camera !== undefined ) object.shadow.camera = this.parseObject( data.shadow.camera );\n\n\t\t}\n\n\t\tif ( data.visible !== undefined ) object.visible = data.visible;\n\t\tif ( data.frustumCulled !== undefined ) object.frustumCulled = data.frustumCulled;\n\t\tif ( data.renderOrder !== undefined ) object.renderOrder = data.renderOrder;\n\t\tif ( data.userData !== undefined ) object.userData = data.userData;\n\t\tif ( data.layers !== undefined ) object.layers.mask = data.layers;\n\n\t\tif ( data.children !== undefined ) {\n\n\t\t\tconst children = data.children;\n\n\t\t\tfor ( let i = 0; i < children.length; i ++ ) {\n\n\t\t\t\tobject.add( this.parseObject( children[ i ], geometries, materials, textures, animations ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( data.animations !== undefined ) {\n\n\t\t\tconst objectAnimations = data.animations;\n\n\t\t\tfor ( let i = 0; i < objectAnimations.length; i ++ ) {\n\n\t\t\t\tconst uuid = objectAnimations[ i ];\n\n\t\t\t\tobject.animations.push( animations[ uuid ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( data.type === 'LOD' ) {\n\n\t\t\tif ( data.autoUpdate !== undefined ) object.autoUpdate = data.autoUpdate;\n\n\t\t\tconst levels = data.levels;\n\n\t\t\tfor ( let l = 0; l < levels.length; l ++ ) {\n\n\t\t\t\tconst level = levels[ l ];\n\t\t\t\tconst child = object.getObjectByProperty( 'uuid', level.object );\n\n\t\t\t\tif ( child !== undefined ) {\n\n\t\t\t\t\tobject.addLevel( child, level.distance, level.hysteresis );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn object;\n\n\t}\n\n\tbindSkeletons( object, skeletons ) {\n\n\t\tif ( Object.keys( skeletons ).length === 0 ) return;\n\n\t\tobject.traverse( function ( child ) {\n\n\t\t\tif ( child.isSkinnedMesh === true && child.skeleton !== undefined ) {\n\n\t\t\t\tconst skeleton = skeletons[ child.skeleton ];\n\n\t\t\t\tif ( skeleton === undefined ) {\n\n\t\t\t\t\twarn( 'ObjectLoader: No skeleton found with UUID:', child.skeleton );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tchild.bind( skeleton, child.bindMatrix );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n\tbindLightTargets( object ) {\n\n\t\tobject.traverse( function ( child ) {\n\n\t\t\tif ( child.isDirectionalLight || child.isSpotLight ) {\n\n\t\t\t\tconst uuid = child.target;\n\n\t\t\t\tconst target = object.getObjectByProperty( 'uuid', uuid );\n\n\t\t\t\tif ( target !== undefined ) {\n\n\t\t\t\t\tchild.target = target;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tchild.target = new Object3D();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n}\n\nconst TEXTURE_MAPPING = {\n\tUVMapping: UVMapping,\n\tCubeReflectionMapping: CubeReflectionMapping,\n\tCubeRefractionMapping: CubeRefractionMapping,\n\tEquirectangularReflectionMapping: EquirectangularReflectionMapping,\n\tEquirectangularRefractionMapping: EquirectangularRefractionMapping,\n\tCubeUVReflectionMapping: CubeUVReflectionMapping\n};\n\nconst TEXTURE_WRAPPING = {\n\tRepeatWrapping: RepeatWrapping,\n\tClampToEdgeWrapping: ClampToEdgeWrapping,\n\tMirroredRepeatWrapping: MirroredRepeatWrapping\n};\n\nconst TEXTURE_FILTER = {\n\tNearestFilter: NearestFilter,\n\tNearestMipmapNearestFilter: NearestMipmapNearestFilter,\n\tNearestMipmapLinearFilter: NearestMipmapLinearFilter,\n\tLinearFilter: LinearFilter,\n\tLinearMipmapNearestFilter: LinearMipmapNearestFilter,\n\tLinearMipmapLinearFilter: LinearMipmapLinearFilter\n};\n\nconst _errorMap = new WeakMap();\n\n/**\n * A loader for loading images as an [ImageBitmap](https://developer.mozilla.org/en-US/docs/Web/API/ImageBitmap).\n * An `ImageBitmap` provides an asynchronous and resource efficient pathway to prepare\n * textures for rendering.\n *\n * Note that {@link Texture#flipY} and {@link Texture#premultiplyAlpha} are ignored with image bitmaps.\n * They needs these configuration on bitmap creation unlike regular images need them on uploading to GPU.\n *\n * You need to set the equivalent options via {@link ImageBitmapLoader#setOptions} instead.\n *\n * Also note that unlike {@link FileLoader}, this loader avoids multiple concurrent requests to the same URL only if `Cache` is enabled.\n *\n * ```js\n * const loader = new THREE.ImageBitmapLoader();\n * loader.setOptions( { imageOrientation: 'flipY' } ); // set options if needed\n * const imageBitmap = await loader.loadAsync( 'image.png' );\n *\n * const texture = new THREE.Texture( imageBitmap );\n * texture.needsUpdate = true;\n * ```\n *\n * @augments Loader\n */\nclass ImageBitmapLoader extends Loader {\n\n\t/**\n\t * Constructs a new image bitmap loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isImageBitmapLoader = true;\n\n\t\tif ( typeof createImageBitmap === 'undefined' ) {\n\n\t\t\twarn( 'ImageBitmapLoader: createImageBitmap() not supported.' );\n\n\t\t}\n\n\t\tif ( typeof fetch === 'undefined' ) {\n\n\t\t\twarn( 'ImageBitmapLoader: fetch() not supported.' );\n\n\t\t}\n\n\t\t/**\n\t\t * Represents the loader options.\n\t\t *\n\t\t * @type {Object}\n\t\t * @default {premultiplyAlpha:'none'}\n\t\t */\n\t\tthis.options = { premultiplyAlpha: 'none' };\n\n\t\t/**\n\t\t * Used for aborting requests.\n\t\t *\n\t\t * @private\n\t\t * @type {AbortController}\n\t\t */\n\t\tthis._abortController = new AbortController();\n\n\t}\n\n\t/**\n\t * Sets the given loader options. The structure of the object must match the `options` parameter of\n\t * [createImageBitmap](https://developer.mozilla.org/en-US/docs/Web/API/Window/createImageBitmap).\n\t *\n\t * @param {Object} options - The loader options to set.\n\t * @return {ImageBitmapLoader} A reference to this image bitmap loader.\n\t */\n\tsetOptions( options ) {\n\n\t\tthis.options = options;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and pass the loaded image bitmap to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(ImageBitmap)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Unsupported in this loader.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t * @return {ImageBitmap|undefined} The image bitmap.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tif ( url === undefined ) url = '';\n\n\t\tif ( this.path !== undefined ) url = this.path + url;\n\n\t\turl = this.manager.resolveURL( url );\n\n\t\tconst scope = this;\n\n\t\tconst cached = Cache.get( `image-bitmap:${url}` );\n\n\t\tif ( cached !== undefined ) {\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\t// If cached is a promise, wait for it to resolve\n\t\t\tif ( cached.then ) {\n\n\t\t\t\tcached.then( imageBitmap => {\n\n\t\t\t\t\t// check if there is an error for the cached promise\n\n\t\t\t\t\tif ( _errorMap.has( cached ) === true ) {\n\n\t\t\t\t\t\tif ( onError ) onError( _errorMap.get( cached ) );\n\n\t\t\t\t\t\tscope.manager.itemError( url );\n\t\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( onLoad ) onLoad( imageBitmap );\n\n\t\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t\t\treturn imageBitmap;\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\t// If cached is not a promise (i.e., it's already an imageBitmap)\n\t\t\tsetTimeout( function () {\n\n\t\t\t\tif ( onLoad ) onLoad( cached );\n\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t}, 0 );\n\n\t\t\treturn cached;\n\n\t\t}\n\n\t\tconst fetchOptions = {};\n\t\tfetchOptions.credentials = ( this.crossOrigin === 'anonymous' ) ? 'same-origin' : 'include';\n\t\tfetchOptions.headers = this.requestHeader;\n\t\tfetchOptions.signal = ( typeof AbortSignal.any === 'function' ) ? AbortSignal.any( [ this._abortController.signal, this.manager.abortController.signal ] ) : this._abortController.signal;\n\n\t\tconst promise = fetch( url, fetchOptions ).then( function ( res ) {\n\n\t\t\treturn res.blob();\n\n\t\t} ).then( function ( blob ) {\n\n\t\t\treturn createImageBitmap( blob, Object.assign( scope.options, { colorSpaceConversion: 'none' } ) );\n\n\t\t} ).then( function ( imageBitmap ) {\n\n\t\t\tCache.add( `image-bitmap:${url}`, imageBitmap );\n\n\t\t\tif ( onLoad ) onLoad( imageBitmap );\n\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t\treturn imageBitmap;\n\n\t\t} ).catch( function ( e ) {\n\n\t\t\tif ( onError ) onError( e );\n\n\t\t\t_errorMap.set( promise, e );\n\n\t\t\tCache.remove( `image-bitmap:${url}` );\n\n\t\t\tscope.manager.itemError( url );\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t} );\n\n\t\tCache.add( `image-bitmap:${url}`, promise );\n\t\tscope.manager.itemStart( url );\n\n\t}\n\n\t/**\n\t * Aborts ongoing fetch requests.\n\t *\n\t * @return {ImageBitmapLoader} A reference to this instance.\n\t */\n\tabort() {\n\n\t\tthis._abortController.abort();\n\t\tthis._abortController = new AbortController();\n\n\t\treturn this;\n\n\t}\n\n}\n\nlet _context;\n\n/**\n * Manages the global audio context in the engine.\n *\n * @hideconstructor\n */\nclass AudioContext {\n\n\t/**\n\t * Returns the global native audio context.\n\t *\n\t * @return {AudioContext} The native audio context.\n\t */\n\tstatic getContext() {\n\n\t\tif ( _context === undefined ) {\n\n\t\t\t_context = new ( window.AudioContext || window.webkitAudioContext )();\n\n\t\t}\n\n\t\treturn _context;\n\n\t}\n\n\t/**\n\t * Allows to set the global native audio context from outside.\n\t *\n\t * @param {AudioContext} value - The native context to set.\n\t */\n\tstatic setContext( value ) {\n\n\t\t_context = value;\n\n\t}\n\n}\n\n/**\n * Class for loading audio buffers. Audios are internally\n * loaded via {@link FileLoader}.\n *\n * ```js\n * const audioListener = new THREE.AudioListener();\n * const ambientSound = new THREE.Audio( audioListener );\n *\n * const loader = new THREE.AudioLoader();\n * const audioBuffer = await loader.loadAsync( 'audio/ambient_ocean.ogg' );\n *\n * ambientSound.setBuffer( audioBuffer );\n * ambientSound.play();\n * ```\n *\n * @augments Loader\n */\nclass AudioLoader extends Loader {\n\n\t/**\n\t * Constructs a new audio loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and passes the loaded audio buffer\n\t * to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(AudioBuffer)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setPath( this.path );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\t\tloader.load( url, function ( buffer ) {\n\n\t\t\ttry {\n\n\t\t\t\t// Create a copy of the buffer. The `decodeAudioData` method\n\t\t\t\t// detaches the buffer when complete, preventing reuse.\n\t\t\t\tconst bufferCopy = buffer.slice( 0 );\n\n\t\t\t\tconst context = AudioContext.getContext();\n\t\t\t\tcontext.decodeAudioData( bufferCopy, function ( audioBuffer ) {\n\n\t\t\t\t\tonLoad( audioBuffer );\n\n\t\t\t\t} ).catch( handleError );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\thandleError( e );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t\tfunction handleError( e ) {\n\n\t\t\tif ( onError ) {\n\n\t\t\t\tonError( e );\n\n\t\t\t} else {\n\n\t\t\t\terror( e );\n\n\t\t\t}\n\n\t\t\tscope.manager.itemError( url );\n\n\t\t}\n\n\t}\n\n}\n\nconst _eyeRight = /*@__PURE__*/ new Matrix4();\nconst _eyeLeft = /*@__PURE__*/ new Matrix4();\nconst _projectionMatrix = /*@__PURE__*/ new Matrix4();\n\n/**\n * A special type of camera that uses two perspective cameras with\n * stereoscopic projection. Can be used for rendering stereo effects\n * like [3D Anaglyph](https://en.wikipedia.org/wiki/Anaglyph_3D) or\n * [Parallax Barrier](https://en.wikipedia.org/wiki/parallax_barrier).\n */\nclass StereoCamera {\n\n\t/**\n\t * Constructs a new stereo camera.\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * The type property is used for detecting the object type\n\t\t * in context of serialization/deserialization.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.type = 'StereoCamera';\n\n\t\t/**\n\t\t * The aspect.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.aspect = 1;\n\n\t\t/**\n\t\t * The eye separation which represents the distance\n\t\t * between the left and right camera.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.064\n\t\t */\n\t\tthis.eyeSep = 0.064;\n\n\t\t/**\n\t\t * The camera representing the left eye. This is added to layer `1` so objects to be\n\t\t * rendered by the left camera must also be added to this layer.\n\t\t *\n\t\t * @type {PerspectiveCamera}\n\t\t */\n\t\tthis.cameraL = new PerspectiveCamera();\n\t\tthis.cameraL.layers.enable( 1 );\n\t\tthis.cameraL.matrixAutoUpdate = false;\n\n\t\t/**\n\t\t * The camera representing the right eye. This is added to layer `2` so objects to be\n\t\t * rendered by the right camera must also be added to this layer.\n\t\t *\n\t\t * @type {PerspectiveCamera}\n\t\t */\n\t\tthis.cameraR = new PerspectiveCamera();\n\t\tthis.cameraR.layers.enable( 2 );\n\t\tthis.cameraR.matrixAutoUpdate = false;\n\n\t\tthis._cache = {\n\t\t\tfocus: null,\n\t\t\tfov: null,\n\t\t\taspect: null,\n\t\t\tnear: null,\n\t\t\tfar: null,\n\t\t\tzoom: null,\n\t\t\teyeSep: null\n\t\t};\n\n\t}\n\n\t/**\n\t * Updates the stereo camera based on the given perspective camera.\n\t *\n\t * @param {PerspectiveCamera} camera - The perspective camera.\n\t */\n\tupdate( camera ) {\n\n\t\tconst cache = this._cache;\n\n\t\tconst needsUpdate = cache.focus !== camera.focus || cache.fov !== camera.fov ||\n\t\t\tcache.aspect !== camera.aspect * this.aspect || cache.near !== camera.near ||\n\t\t\tcache.far !== camera.far || cache.zoom !== camera.zoom || cache.eyeSep !== this.eyeSep;\n\n\t\tif ( needsUpdate ) {\n\n\t\t\tcache.focus = camera.focus;\n\t\t\tcache.fov = camera.fov;\n\t\t\tcache.aspect = camera.aspect * this.aspect;\n\t\t\tcache.near = camera.near;\n\t\t\tcache.far = camera.far;\n\t\t\tcache.zoom = camera.zoom;\n\t\t\tcache.eyeSep = this.eyeSep;\n\n\t\t\t// Off-axis stereoscopic effect based on\n\t\t\t// http://paulbourke.net/stereographics/stereorender/\n\n\t\t\t_projectionMatrix.copy( camera.projectionMatrix );\n\t\t\tconst eyeSepHalf = cache.eyeSep / 2;\n\t\t\tconst eyeSepOnProjection = eyeSepHalf * cache.near / cache.focus;\n\t\t\tconst ymax = ( cache.near * Math.tan( DEG2RAD * cache.fov * 0.5 ) ) / cache.zoom;\n\t\t\tlet xmin, xmax;\n\n\t\t\t// translate xOffset\n\n\t\t\t_eyeLeft.elements[ 12 ] = - eyeSepHalf;\n\t\t\t_eyeRight.elements[ 12 ] = eyeSepHalf;\n\n\t\t\t// for left eye\n\n\t\t\txmin = - ymax * cache.aspect + eyeSepOnProjection;\n\t\t\txmax = ymax * cache.aspect + eyeSepOnProjection;\n\n\t\t\t_projectionMatrix.elements[ 0 ] = 2 * cache.near / ( xmax - xmin );\n\t\t\t_projectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );\n\n\t\t\tthis.cameraL.projectionMatrix.copy( _projectionMatrix );\n\n\t\t\t// for right eye\n\n\t\t\txmin = - ymax * cache.aspect - eyeSepOnProjection;\n\t\t\txmax = ymax * cache.aspect - eyeSepOnProjection;\n\n\t\t\t_projectionMatrix.elements[ 0 ] = 2 * cache.near / ( xmax - xmin );\n\t\t\t_projectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );\n\n\t\t\tthis.cameraR.projectionMatrix.copy( _projectionMatrix );\n\n\t\t}\n\n\t\tthis.cameraL.matrixWorld.copy( camera.matrixWorld ).multiply( _eyeLeft );\n\t\tthis.cameraR.matrixWorld.copy( camera.matrixWorld ).multiply( _eyeRight );\n\n\t}\n\n}\n\n/**\n * This type of camera can be used in order to efficiently render a scene with a\n * predefined set of cameras. This is an important performance aspect for\n * rendering VR scenes.\n *\n * An instance of `ArrayCamera` always has an array of sub cameras. It's mandatory\n * to define for each sub camera the `viewport` property which determines the\n * part of the viewport that is rendered with this camera.\n *\n * @augments PerspectiveCamera\n */\nclass ArrayCamera extends PerspectiveCamera {\n\n\t/**\n\t * Constructs a new array camera.\n\t *\n\t * @param {Array<PerspectiveCamera>} [array=[]] - An array of perspective sub cameras.\n\t */\n\tconstructor( array = [] ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isArrayCamera = true;\n\n\t\t/**\n\t\t * Whether this camera is used with multiview rendering or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default false\n\t\t */\n\t\tthis.isMultiViewCamera = false;\n\n\t\t/**\n\t\t * An array of perspective sub cameras.\n\t\t *\n\t\t * @type {Array<PerspectiveCamera>}\n\t\t */\n\t\tthis.cameras = array;\n\n\t}\n\n}\n\n/**\n * Class for keeping track of time.\n */\nclass Clock {\n\n\t/**\n\t * Constructs a new clock.\n\t *\n\t * @param {boolean} [autoStart=true] - Whether to automatically start the clock when\n\t * `getDelta()` is called for the first time.\n\t */\n\tconstructor( autoStart = true ) {\n\n\t\t/**\n\t\t * If set to `true`, the clock starts automatically when `getDelta()` is called\n\t\t * for the first time.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.autoStart = autoStart;\n\n\t\t/**\n\t\t * Holds the time at which the clock's `start()` method was last called.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.startTime = 0;\n\n\t\t/**\n\t\t * Holds the time at which the clock's `start()`, `getElapsedTime()` or\n\t\t * `getDelta()` methods were last called.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.oldTime = 0;\n\n\t\t/**\n\t\t * Keeps track of the total time that the clock has been running.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.elapsedTime = 0;\n\n\t\t/**\n\t\t * Whether the clock is running or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.running = false;\n\n\t}\n\n\t/**\n\t * Starts the clock. When `autoStart` is set to `true`, the method is automatically\n\t * called by the class.\n\t */\n\tstart() {\n\n\t\tthis.startTime = performance.now();\n\n\t\tthis.oldTime = this.startTime;\n\t\tthis.elapsedTime = 0;\n\t\tthis.running = true;\n\n\t}\n\n\t/**\n\t * Stops the clock.\n\t */\n\tstop() {\n\n\t\tthis.getElapsedTime();\n\t\tthis.running = false;\n\t\tthis.autoStart = false;\n\n\t}\n\n\t/**\n\t * Returns the elapsed time in seconds.\n\t *\n\t * @return {number} The elapsed time.\n\t */\n\tgetElapsedTime() {\n\n\t\tthis.getDelta();\n\t\treturn this.elapsedTime;\n\n\t}\n\n\t/**\n\t * Returns the delta time in seconds.\n\t *\n\t * @return {number} The delta time.\n\t */\n\tgetDelta() {\n\n\t\tlet diff = 0;\n\n\t\tif ( this.autoStart && ! this.running ) {\n\n\t\t\tthis.start();\n\t\t\treturn 0;\n\n\t\t}\n\n\t\tif ( this.running ) {\n\n\t\t\tconst newTime = performance.now();\n\n\t\t\tdiff = ( newTime - this.oldTime ) / 1000;\n\t\t\tthis.oldTime = newTime;\n\n\t\t\tthis.elapsedTime += diff;\n\n\t\t}\n\n\t\treturn diff;\n\n\t}\n\n}\n\nconst _position$1 = /*@__PURE__*/ new Vector3();\nconst _quaternion$1 = /*@__PURE__*/ new Quaternion();\nconst _scale$1 = /*@__PURE__*/ new Vector3();\n\nconst _forward = /*@__PURE__*/ new Vector3();\nconst _up = /*@__PURE__*/ new Vector3();\n\n/**\n * The class represents a virtual listener of the all positional and non-positional audio effects\n * in the scene. A three.js application usually creates a single listener. It is a mandatory\n * constructor parameter for audios entities like {@link Audio} and {@link PositionalAudio}.\n *\n * In most cases, the listener object is a child of the camera. So the 3D transformation of the\n * camera represents the 3D transformation of the listener.\n *\n * @augments Object3D\n */\nclass AudioListener extends Object3D {\n\n\t/**\n\t * Constructs a new audio listener.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.type = 'AudioListener';\n\n\t\t/**\n\t\t * The native audio context.\n\t\t *\n\t\t * @type {AudioContext}\n\t\t * @readonly\n\t\t */\n\t\tthis.context = AudioContext.getContext();\n\n\t\t/**\n\t\t * The gain node used for volume control.\n\t\t *\n\t\t * @type {GainNode}\n\t\t * @readonly\n\t\t */\n\t\tthis.gain = this.context.createGain();\n\t\tthis.gain.connect( this.context.destination );\n\n\t\t/**\n\t\t * An optional filter.\n\t\t *\n\t\t * Defined via {@link AudioListener#setFilter}.\n\t\t *\n\t\t * @type {?AudioNode}\n\t\t * @default null\n\t\t * @readonly\n\t\t */\n\t\tthis.filter = null;\n\n\t\t/**\n\t\t * Time delta values required for `linearRampToValueAtTime()` usage.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t * @readonly\n\t\t */\n\t\tthis.timeDelta = 0;\n\n\t\t// private\n\n\t\tthis._clock = new Clock();\n\n\t}\n\n\t/**\n\t * Returns the listener's input node.\n\t *\n\t * This method is used by other audio nodes to connect to this listener.\n\t *\n\t * @return {GainNode} The input node.\n\t */\n\tgetInput() {\n\n\t\treturn this.gain;\n\n\t}\n\n\t/**\n\t * Removes the current filter from this listener.\n\t *\n\t * @return {AudioListener} A reference to this listener.\n\t */\n\tremoveFilter() {\n\n\t\tif ( this.filter !== null ) {\n\n\t\t\tthis.gain.disconnect( this.filter );\n\t\t\tthis.filter.disconnect( this.context.destination );\n\t\t\tthis.gain.connect( this.context.destination );\n\t\t\tthis.filter = null;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the current set filter.\n\t *\n\t * @return {?AudioNode} The filter.\n\t */\n\tgetFilter() {\n\n\t\treturn this.filter;\n\n\t}\n\n\t/**\n\t * Sets the given filter to this listener.\n\t *\n\t * @param {AudioNode} value - The filter to set.\n\t * @return {AudioListener} A reference to this listener.\n\t */\n\tsetFilter( value ) {\n\n\t\tif ( this.filter !== null ) {\n\n\t\t\tthis.gain.disconnect( this.filter );\n\t\t\tthis.filter.disconnect( this.context.destination );\n\n\t\t} else {\n\n\t\t\tthis.gain.disconnect( this.context.destination );\n\n\t\t}\n\n\t\tthis.filter = value;\n\t\tthis.gain.connect( this.filter );\n\t\tthis.filter.connect( this.context.destination );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the applications master volume.\n\t *\n\t * @return {number} The master volume.\n\t */\n\tgetMasterVolume() {\n\n\t\treturn this.gain.gain.value;\n\n\t}\n\n\t/**\n\t * Sets the applications master volume. This volume setting affects\n\t * all audio nodes in the scene.\n\t *\n\t * @param {number} value - The master volume to set.\n\t * @return {AudioListener} A reference to this listener.\n\t */\n\tsetMasterVolume( value ) {\n\n\t\tthis.gain.gain.setTargetAtTime( value, this.context.currentTime, 0.01 );\n\n\t\treturn this;\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t\tconst listener = this.context.listener;\n\n\t\tthis.timeDelta = this._clock.getDelta();\n\n\t\tthis.matrixWorld.decompose( _position$1, _quaternion$1, _scale$1 );\n\n\t\t// the initial forward and up directions must be orthogonal\n\t\t_forward.set( 0, 0, -1 ).applyQuaternion( _quaternion$1 );\n\t\t_up.set( 0, 1, 0 ).applyQuaternion( _quaternion$1 );\n\n\t\tif ( listener.positionX ) {\n\n\t\t\t// code path for Chrome (see #14393)\n\n\t\t\tconst endTime = this.context.currentTime + this.timeDelta;\n\n\t\t\tlistener.positionX.linearRampToValueAtTime( _position$1.x, endTime );\n\t\t\tlistener.positionY.linearRampToValueAtTime( _position$1.y, endTime );\n\t\t\tlistener.positionZ.linearRampToValueAtTime( _position$1.z, endTime );\n\t\t\tlistener.forwardX.linearRampToValueAtTime( _forward.x, endTime );\n\t\t\tlistener.forwardY.linearRampToValueAtTime( _forward.y, endTime );\n\t\t\tlistener.forwardZ.linearRampToValueAtTime( _forward.z, endTime );\n\t\t\tlistener.upX.linearRampToValueAtTime( _up.x, endTime );\n\t\t\tlistener.upY.linearRampToValueAtTime( _up.y, endTime );\n\t\t\tlistener.upZ.linearRampToValueAtTime( _up.z, endTime );\n\n\t\t} else {\n\n\t\t\tlistener.setPosition( _position$1.x, _position$1.y, _position$1.z );\n\t\t\tlistener.setOrientation( _forward.x, _forward.y, _forward.z, _up.x, _up.y, _up.z );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * Represents a non-positional ( global ) audio object.\n *\n * This and related audio modules make use of the [Web Audio API](https://www.w3.org/TR/webaudio-1.1/).\n *\n * ```js\n * // create an AudioListener and add it to the camera\n * const listener = new THREE.AudioListener();\n * camera.add( listener );\n *\n * // create a global audio source\n * const sound = new THREE.Audio( listener );\n *\n * // load a sound and set it as the Audio object's buffer\n * const audioLoader = new THREE.AudioLoader();\n * audioLoader.load( 'sounds/ambient.ogg', function( buffer ) {\n * \tsound.setBuffer( buffer );\n * \tsound.setLoop( true );\n * \tsound.setVolume( 0.5 );\n * \tsound.play();\n * });\n * ```\n *\n * @augments Object3D\n */\nclass Audio extends Object3D {\n\n\t/**\n\t * Constructs a new audio.\n\t *\n\t * @param {AudioListener} listener - The global audio listener.\n\t */\n\tconstructor( listener ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'Audio';\n\n\t\t/**\n\t\t * The global audio listener.\n\t\t *\n\t\t * @type {AudioListener}\n\t\t * @readonly\n\t\t */\n\t\tthis.listener = listener;\n\n\t\t/**\n\t\t * The audio context.\n\t\t *\n\t\t * @type {AudioContext}\n\t\t * @readonly\n\t\t */\n\t\tthis.context = listener.context;\n\n\t\t/**\n\t\t * The gain node used for volume control.\n\t\t *\n\t\t * @type {GainNode}\n\t\t * @readonly\n\t\t */\n\t\tthis.gain = this.context.createGain();\n\t\tthis.gain.connect( listener.getInput() );\n\n\t\t/**\n\t\t * Whether to start playback automatically or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.autoplay = false;\n\n\t\t/**\n\t\t * A reference to an audio buffer.\n\t\t *\n\t\t * Defined via {@link Audio#setBuffer}.\n\t\t *\n\t\t * @type {?AudioBuffer}\n\t\t * @default null\n\t\t * @readonly\n\t\t */\n\t\tthis.buffer = null;\n\n\t\t/**\n\t\t * Modify pitch, measured in cents. +/- 100 is a semitone.\n\t\t * +/- 1200 is an octave.\n\t\t *\n\t\t * Defined via {@link Audio#setDetune}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t * @readonly\n\t\t */\n\t\tthis.detune = 0;\n\n\t\t/**\n\t\t * Whether the audio should loop or not.\n\t\t *\n\t\t * Defined via {@link Audio#setLoop}.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t * @readonly\n\t\t */\n\t\tthis.loop = false;\n\n\t\t/**\n\t\t * Defines where in the audio buffer the replay should\n\t\t * start, in seconds.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.loopStart = 0;\n\n\t\t/**\n\t\t * Defines where in the audio buffer the replay should\n\t\t * stop, in seconds.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.loopEnd = 0;\n\n\t\t/**\n\t\t * An offset to the time within the audio buffer the playback\n\t\t * should begin, in seconds.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.offset = 0;\n\n\t\t/**\n\t\t * Overrides the default duration of the audio.\n\t\t *\n\t\t * @type {undefined|number}\n\t\t * @default undefined\n\t\t */\n\t\tthis.duration = undefined;\n\n\t\t/**\n\t\t * The playback speed.\n\t\t *\n\t\t * Defined via {@link Audio#setPlaybackRate}.\n\t\t *\n\t\t * @type {number}\n\t\t * @readonly\n\t\t * @default 1\n\t\t */\n\t\tthis.playbackRate = 1;\n\n\t\t/**\n\t\t * Indicates whether the audio is playing or not.\n\t\t *\n\t\t * This flag will be automatically set when using {@link Audio#play},\n\t\t * {@link Audio#pause}, {@link Audio#stop}.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default false\n\t\t */\n\t\tthis.isPlaying = false;\n\n\t\t/**\n\t\t * Indicates whether the audio playback can be controlled\n\t\t * with method like {@link Audio#play} or {@link Audio#pause}.\n\t\t *\n\t\t * This flag will be automatically set when audio sources are\n\t\t * defined.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.hasPlaybackControl = true;\n\n\t\t/**\n\t\t * Holds a reference to the current audio source.\n\t\t *\n\t\t * The property is automatically by one of the `set*()` methods.\n\t\t *\n\t\t * @type {?AudioNode}\n\t\t * @readonly\n\t\t * @default null\n\t\t */\n\t\tthis.source = null;\n\n\t\t/**\n\t\t * Defines the source type.\n\t\t *\n\t\t * The property is automatically by one of the `set*()` methods.\n\t\t *\n\t\t * @type {('empty'|'audioNode'|'mediaNode'|'mediaStreamNode'|'buffer')}\n\t\t * @readonly\n\t\t * @default 'empty'\n\t\t */\n\t\tthis.sourceType = 'empty';\n\n\t\tthis._startedAt = 0;\n\t\tthis._progress = 0;\n\t\tthis._connected = false;\n\n\t\t/**\n\t\t * Can be used to apply a variety of low-order filters to create\n\t\t * more complex sound effects e.g. via `BiquadFilterNode`.\n\t\t *\n\t\t * The property is automatically set by {@link Audio#setFilters}.\n\t\t *\n\t\t * @type {Array<AudioNode>}\n\t\t * @readonly\n\t\t */\n\t\tthis.filters = [];\n\n\t}\n\n\t/**\n\t * Returns the output audio node.\n\t *\n\t * @return {GainNode} The output node.\n\t */\n\tgetOutput() {\n\n\t\treturn this.gain;\n\n\t}\n\n\t/**\n\t * Sets the given audio node as the source of this instance.\n\t *\n\t * {@link Audio#sourceType} is set to `audioNode` and {@link Audio#hasPlaybackControl} to `false`.\n\t *\n\t * @param {AudioNode} audioNode - The audio node like an instance of `OscillatorNode`.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetNodeSource( audioNode ) {\n\n\t\tthis.hasPlaybackControl = false;\n\t\tthis.sourceType = 'audioNode';\n\t\tthis.source = audioNode;\n\t\tthis.connect();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given media element as the source of this instance.\n\t *\n\t * {@link Audio#sourceType} is set to `mediaNode` and {@link Audio#hasPlaybackControl} to `false`.\n\t *\n\t * @param {HTMLMediaElement} mediaElement - The media element.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetMediaElementSource( mediaElement ) {\n\n\t\tthis.hasPlaybackControl = false;\n\t\tthis.sourceType = 'mediaNode';\n\t\tthis.source = this.context.createMediaElementSource( mediaElement );\n\t\tthis.connect();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given media stream as the source of this instance.\n\t *\n\t * {@link Audio#sourceType} is set to `mediaStreamNode` and {@link Audio#hasPlaybackControl} to `false`.\n\t *\n\t * @param {MediaStream} mediaStream - The media stream.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetMediaStreamSource( mediaStream ) {\n\n\t\tthis.hasPlaybackControl = false;\n\t\tthis.sourceType = 'mediaStreamNode';\n\t\tthis.source = this.context.createMediaStreamSource( mediaStream );\n\t\tthis.connect();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given audio buffer as the source of this instance.\n\t *\n\t * {@link Audio#sourceType} is set to `buffer` and {@link Audio#hasPlaybackControl} to `true`.\n\t *\n\t * @param {AudioBuffer} audioBuffer - The audio buffer.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetBuffer( audioBuffer ) {\n\n\t\tthis.buffer = audioBuffer;\n\t\tthis.sourceType = 'buffer';\n\n\t\tif ( this.autoplay ) this.play();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Starts the playback of the audio.\n\t *\n\t * Can only be used with compatible audio sources that allow playback control.\n\t *\n\t * @param {number} [delay=0] - The delay, in seconds, at which the audio should start playing.\n\t * @return {Audio|undefined} A reference to this instance.\n\t */\n\tplay( delay = 0 ) {\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\twarn( 'Audio: Audio is already playing.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\twarn( 'Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis._startedAt = this.context.currentTime + delay;\n\n\t\tconst source = this.context.createBufferSource();\n\t\tsource.buffer = this.buffer;\n\t\tsource.loop = this.loop;\n\t\tsource.loopStart = this.loopStart;\n\t\tsource.loopEnd = this.loopEnd;\n\t\tsource.onended = this.onEnded.bind( this );\n\t\tsource.start( this._startedAt, this._progress + this.offset, this.duration );\n\n\t\tthis.isPlaying = true;\n\n\t\tthis.source = source;\n\n\t\tthis.setDetune( this.detune );\n\t\tthis.setPlaybackRate( this.playbackRate );\n\n\t\treturn this.connect();\n\n\t}\n\n\t/**\n\t * Pauses the playback of the audio.\n\t *\n\t * Can only be used with compatible audio sources that allow playback control.\n\t *\n\t * @return {Audio|undefined} A reference to this instance.\n\t */\n\tpause() {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\twarn( 'Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\t// update current progress\n\n\t\t\tthis._progress += Math.max( this.context.currentTime - this._startedAt, 0 ) * this.playbackRate;\n\n\t\t\tif ( this.loop === true ) {\n\n\t\t\t\t// ensure _progress does not exceed duration with looped audios\n\n\t\t\t\tthis._progress = this._progress % ( this.duration || this.buffer.duration );\n\n\t\t\t}\n\n\t\t\tthis.source.stop();\n\t\t\tthis.source.onended = null;\n\n\t\t\tthis.isPlaying = false;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Stops the playback of the audio.\n\t *\n\t * Can only be used with compatible audio sources that allow playback control.\n\t *\n\t * @param {number} [delay=0] - The delay, in seconds, at which the audio should stop playing.\n\t * @return {Audio|undefined} A reference to this instance.\n\t */\n\tstop( delay = 0 ) {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\twarn( 'Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis._progress = 0;\n\n\t\tif ( this.source !== null ) {\n\n\t\t\tthis.source.stop( this.context.currentTime + delay );\n\t\t\tthis.source.onended = null;\n\n\t\t}\n\n\t\tthis.isPlaying = false;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Connects to the audio source. This is used internally on\n\t * initialisation and when setting / removing filters.\n\t *\n\t * @return {Audio} A reference to this instance.\n\t */\n\tconnect() {\n\n\t\tif ( this.filters.length > 0 ) {\n\n\t\t\tthis.source.connect( this.filters[ 0 ] );\n\n\t\t\tfor ( let i = 1, l = this.filters.length; i < l; i ++ ) {\n\n\t\t\t\tthis.filters[ i - 1 ].connect( this.filters[ i ] );\n\n\t\t\t}\n\n\t\t\tthis.filters[ this.filters.length - 1 ].connect( this.getOutput() );\n\n\t\t} else {\n\n\t\t\tthis.source.connect( this.getOutput() );\n\n\t\t}\n\n\t\tthis._connected = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Disconnects to the audio source. This is used internally on\n\t * initialisation and when setting / removing filters.\n\t *\n\t * @return {Audio|undefined} A reference to this instance.\n\t */\n\tdisconnect() {\n\n\t\tif ( this._connected === false ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( this.filters.length > 0 ) {\n\n\t\t\tthis.source.disconnect( this.filters[ 0 ] );\n\n\t\t\tfor ( let i = 1, l = this.filters.length; i < l; i ++ ) {\n\n\t\t\t\tthis.filters[ i - 1 ].disconnect( this.filters[ i ] );\n\n\t\t\t}\n\n\t\t\tthis.filters[ this.filters.length - 1 ].disconnect( this.getOutput() );\n\n\t\t} else {\n\n\t\t\tthis.source.disconnect( this.getOutput() );\n\n\t\t}\n\n\t\tthis._connected = false;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the current set filters.\n\t *\n\t * @return {Array<AudioNode>} The list of filters.\n\t */\n\tgetFilters() {\n\n\t\treturn this.filters;\n\n\t}\n\n\t/**\n\t * Sets an array of filters and connects them with the audio source.\n\t *\n\t * @param {Array<AudioNode>} [value] - A list of filters.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetFilters( value ) {\n\n\t\tif ( ! value ) value = [];\n\n\t\tif ( this._connected === true ) {\n\n\t\t\tthis.disconnect();\n\t\t\tthis.filters = value.slice();\n\t\t\tthis.connect();\n\n\t\t} else {\n\n\t\t\tthis.filters = value.slice();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Defines the detuning of oscillation in cents.\n\t *\n\t * @param {number} value - The detuning of oscillation in cents.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetDetune( value ) {\n\n\t\tthis.detune = value;\n\n\t\tif ( this.isPlaying === true && this.source.detune !== undefined ) {\n\n\t\t\tthis.source.detune.setTargetAtTime( this.detune, this.context.currentTime, 0.01 );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the detuning of oscillation in cents.\n\t *\n\t * @return {number} The detuning of oscillation in cents.\n\t */\n\tgetDetune() {\n\n\t\treturn this.detune;\n\n\t}\n\n\t/**\n\t * Returns the first filter in the list of filters.\n\t *\n\t * @return {AudioNode|undefined} The first filter in the list of filters.\n\t */\n\tgetFilter() {\n\n\t\treturn this.getFilters()[ 0 ];\n\n\t}\n\n\t/**\n\t * Applies a single filter node to the audio.\n\t *\n\t * @param {AudioNode} [filter] - The filter to set.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetFilter( filter ) {\n\n\t\treturn this.setFilters( filter ? [ filter ] : [] );\n\n\t}\n\n\t/**\n\t * Sets the playback rate.\n\t *\n\t * Can only be used with compatible audio sources that allow playback control.\n\t *\n\t * @param {number} [value] - The playback rate to set.\n\t * @return {Audio|undefined} A reference to this instance.\n\t */\n\tsetPlaybackRate( value ) {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\twarn( 'Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis.playbackRate = value;\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\tthis.source.playbackRate.setTargetAtTime( this.playbackRate, this.context.currentTime, 0.01 );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the current playback rate.\n\n\t * @return {number} The playback rate.\n\t */\n\tgetPlaybackRate() {\n\n\t\treturn this.playbackRate;\n\n\t}\n\n\t/**\n\t * Automatically called when playback finished.\n\t */\n\tonEnded() {\n\n\t\tthis.isPlaying = false;\n\t\tthis._progress = 0;\n\n\t}\n\n\t/**\n\t * Returns the loop flag.\n\t *\n\t * Can only be used with compatible audio sources that allow playback control.\n\t *\n\t * @return {boolean} Whether the audio should loop or not.\n\t */\n\tgetLoop() {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\twarn( 'Audio: this Audio has no playback control.' );\n\t\t\treturn false;\n\n\t\t}\n\n\t\treturn this.loop;\n\n\t}\n\n\t/**\n\t * Sets the loop flag.\n\t *\n\t * Can only be used with compatible audio sources that allow playback control.\n\t *\n\t * @param {boolean} value - Whether the audio should loop or not.\n\t * @return {Audio|undefined} A reference to this instance.\n\t */\n\tsetLoop( value ) {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\twarn( 'Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis.loop = value;\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\tthis.source.loop = this.loop;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the loop start value which defines where in the audio buffer the replay should\n\t * start, in seconds.\n\t *\n\t * @param {number} value - The loop start value.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetLoopStart( value ) {\n\n\t\tthis.loopStart = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the loop end value which defines where in the audio buffer the replay should\n\t * stop, in seconds.\n\t *\n\t * @param {number} value - The loop end value.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetLoopEnd( value ) {\n\n\t\tthis.loopEnd = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the volume.\n\t *\n\t * @return {number} The volume.\n\t */\n\tgetVolume() {\n\n\t\treturn this.gain.gain.value;\n\n\t}\n\n\t/**\n\t * Sets the volume.\n\t *\n\t * @param {number} value - The volume to set.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetVolume( value ) {\n\n\t\tthis.gain.gain.setTargetAtTime( value, this.context.currentTime, 0.01 );\n\n\t\treturn this;\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tif ( source.sourceType !== 'buffer' ) {\n\n\t\t\twarn( 'Audio: Audio source type cannot be copied.' );\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tthis.autoplay = source.autoplay;\n\n\t\tthis.buffer = source.buffer;\n\t\tthis.detune = source.detune;\n\t\tthis.loop = source.loop;\n\t\tthis.loopStart = source.loopStart;\n\t\tthis.loopEnd = source.loopEnd;\n\t\tthis.offset = source.offset;\n\t\tthis.duration = source.duration;\n\t\tthis.playbackRate = source.playbackRate;\n\t\tthis.hasPlaybackControl = source.hasPlaybackControl;\n\t\tthis.sourceType = source.sourceType;\n\n\t\tthis.filters = source.filters.slice();\n\n\t\treturn this;\n\n\t}\n\n\tclone( recursive ) {\n\n\t\treturn new this.constructor( this.listener ).copy( this, recursive );\n\n\t}\n\n}\n\nconst _position = /*@__PURE__*/ new Vector3();\nconst _quaternion = /*@__PURE__*/ new Quaternion();\nconst _scale = /*@__PURE__*/ new Vector3();\nconst _orientation = /*@__PURE__*/ new Vector3();\n\n/**\n * Represents a positional audio object.\n *\n * ```js\n * // create an AudioListener and add it to the camera\n * const listener = new THREE.AudioListener();\n * camera.add( listener );\n *\n * // create the PositionalAudio object (passing in the listener)\n * const sound = new THREE.PositionalAudio( listener );\n *\n * // load a sound and set it as the PositionalAudio object's buffer\n * const audioLoader = new THREE.AudioLoader();\n * audioLoader.load( 'sounds/song.ogg', function( buffer ) {\n * \tsound.setBuffer( buffer );\n * \tsound.setRefDistance( 20 );\n * \tsound.play();\n * });\n *\n * // create an object for the sound to play from\n * const sphere = new THREE.SphereGeometry( 20, 32, 16 );\n * const material = new THREE.MeshPhongMaterial( { color: 0xff2200 } );\n * const mesh = new THREE.Mesh( sphere, material );\n * scene.add( mesh );\n *\n * // finally add the sound to the mesh\n * mesh.add( sound );\n *\n * @augments Audio\n */\nclass PositionalAudio extends Audio {\n\n\t/**\n\t * Constructs a positional audio.\n\t *\n\t * @param {AudioListener} listener - The global audio listener.\n\t */\n\tconstructor( listener ) {\n\n\t\tsuper( listener );\n\n\t\t/**\n\t\t * The panner node represents the location, direction, and behavior of an audio\n\t\t * source in 3D space.\n\t\t *\n\t\t * @type {PannerNode}\n\t\t * @readonly\n\t\t */\n\t\tthis.panner = this.context.createPanner();\n\t\tthis.panner.panningModel = 'HRTF';\n\t\tthis.panner.connect( this.gain );\n\n\t}\n\n\tconnect() {\n\n\t\tsuper.connect();\n\n\t\tthis.panner.connect( this.gain );\n\n\t\treturn this;\n\n\t}\n\n\tdisconnect() {\n\n\t\tsuper.disconnect();\n\n\t\tthis.panner.disconnect( this.gain );\n\n\t\treturn this;\n\n\t}\n\n\tgetOutput() {\n\n\t\treturn this.panner;\n\n\t}\n\n\t/**\n\t * Returns the current reference distance.\n\t *\n\t * @return {number} The reference distance.\n\t */\n\tgetRefDistance() {\n\n\t\treturn this.panner.refDistance;\n\n\t}\n\n\t/**\n\t * Defines the reference distance for reducing volume as the audio source moves\n\t * further from the listener – i.e. the distance at which the volume reduction\n\t * starts taking effect.\n\t *\n\t * @param {number} value - The reference distance to set.\n\t * @return {PositionalAudio} A reference to this instance.\n\t */\n\tsetRefDistance( value ) {\n\n\t\tthis.panner.refDistance = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the current rolloff factor.\n\t *\n\t * @return {number} The rolloff factor.\n\t */\n\tgetRolloffFactor() {\n\n\t\treturn this.panner.rolloffFactor;\n\n\t}\n\n\t/**\n\t * Defines how quickly the volume is reduced as the source moves away from the listener.\n\t *\n\t * @param {number} value - The rolloff factor.\n\t * @return {PositionalAudio} A reference to this instance.\n\t */\n\tsetRolloffFactor( value ) {\n\n\t\tthis.panner.rolloffFactor = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the current distance model.\n\t *\n\t * @return {('linear'|'inverse'|'exponential')} The distance model.\n\t */\n\tgetDistanceModel() {\n\n\t\treturn this.panner.distanceModel;\n\n\t}\n\n\t/**\n\t * Defines which algorithm to use to reduce the volume of the audio source\n\t * as it moves away from the listener.\n\t *\n\t * Read [the spec](https://www.w3.org/TR/webaudio-1.1/#enumdef-distancemodeltype)\n\t * for more details.\n\t *\n\t * @param {('linear'|'inverse'|'exponential')} value - The distance model to set.\n\t * @return {PositionalAudio} A reference to this instance.\n\t */\n\tsetDistanceModel( value ) {\n\n\t\tthis.panner.distanceModel = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the current max distance.\n\t *\n\t * @return {number} The max distance.\n\t */\n\tgetMaxDistance() {\n\n\t\treturn this.panner.maxDistance;\n\n\t}\n\n\t/**\n\t * Defines the maximum distance between the audio source and the listener,\n\t * after which the volume is not reduced any further.\n\t *\n\t * This value is used only by the `linear` distance model.\n\t *\n\t * @param {number} value - The max distance.\n\t * @return {PositionalAudio} A reference to this instance.\n\t */\n\tsetMaxDistance( value ) {\n\n\t\tthis.panner.maxDistance = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the directional cone in which the audio can be listened.\n\t *\n\t * @param {number} coneInnerAngle - An angle, in degrees, of a cone inside of which there will be no volume reduction.\n\t * @param {number} coneOuterAngle - An angle, in degrees, of a cone outside of which the volume will be reduced by a constant value, defined by the `coneOuterGain` parameter.\n\t * @param {number} coneOuterGain - The amount of volume reduction outside the cone defined by the `coneOuterAngle`. When set to `0`, no sound can be heard.\n\t * @return {PositionalAudio} A reference to this instance.\n\t */\n\tsetDirectionalCone( coneInnerAngle, coneOuterAngle, coneOuterGain ) {\n\n\t\tthis.panner.coneInnerAngle = coneInnerAngle;\n\t\tthis.panner.coneOuterAngle = coneOuterAngle;\n\t\tthis.panner.coneOuterGain = coneOuterGain;\n\n\t\treturn this;\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t\tif ( this.hasPlaybackControl === true && this.isPlaying === false ) return;\n\n\t\tthis.matrixWorld.decompose( _position, _quaternion, _scale );\n\n\t\t_orientation.set( 0, 0, 1 ).applyQuaternion( _quaternion );\n\n\t\tconst panner = this.panner;\n\n\t\tif ( panner.positionX ) {\n\n\t\t\t// code path for Chrome and Firefox (see #14393)\n\n\t\t\tconst endTime = this.context.currentTime + this.listener.timeDelta;\n\n\t\t\tpanner.positionX.linearRampToValueAtTime( _position.x, endTime );\n\t\t\tpanner.positionY.linearRampToValueAtTime( _position.y, endTime );\n\t\t\tpanner.positionZ.linearRampToValueAtTime( _position.z, endTime );\n\t\t\tpanner.orientationX.linearRampToValueAtTime( _orientation.x, endTime );\n\t\t\tpanner.orientationY.linearRampToValueAtTime( _orientation.y, endTime );\n\t\t\tpanner.orientationZ.linearRampToValueAtTime( _orientation.z, endTime );\n\n\t\t} else {\n\n\t\t\tpanner.setPosition( _position.x, _position.y, _position.z );\n\t\t\tpanner.setOrientation( _orientation.x, _orientation.y, _orientation.z );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * This class can be used to analyse audio data.\n *\n * ```js\n * // create an AudioListener and add it to the camera\n * const listener = new THREE.AudioListener();\n * camera.add( listener );\n *\n * // create an Audio source\n * const sound = new THREE.Audio( listener );\n *\n * // load a sound and set it as the Audio object's buffer\n * const audioLoader = new THREE.AudioLoader();\n * audioLoader.load( 'sounds/ambient.ogg', function( buffer ) {\n * \tsound.setBuffer( buffer );\n * \tsound.setLoop(true);\n * \tsound.setVolume(0.5);\n * \tsound.play();\n * });\n *\n * // create an AudioAnalyser, passing in the sound and desired fftSize\n * const analyser = new THREE.AudioAnalyser( sound, 32 );\n *\n * // get the average frequency of the sound\n * const data = analyser.getAverageFrequency();\n * ```\n */\nclass AudioAnalyser {\n\n\t/**\n\t * Constructs a new audio analyzer.\n\t *\n\t * @param {Audio} audio - The audio to analyze.\n\t * @param {number} [fftSize=2048] - The window size in samples that is used when performing a Fast Fourier Transform (FFT) to get frequency domain data.\n\t */\n\tconstructor( audio, fftSize = 2048 ) {\n\n\t\t/**\n\t\t * The global audio listener.\n\t\t *\n\t\t * @type {AnalyserNode}\n\t\t */\n\t\tthis.analyser = audio.context.createAnalyser();\n\t\tthis.analyser.fftSize = fftSize;\n\n\t\t/**\n\t\t * Holds the analyzed data.\n\t\t *\n\t\t * @type {Uint8Array}\n\t\t */\n\t\tthis.data = new Uint8Array( this.analyser.frequencyBinCount );\n\n\t\taudio.getOutput().connect( this.analyser );\n\n\t}\n\n\t/**\n\t * Returns an array with frequency data of the audio.\n\t *\n\t * Each item in the array represents the decibel value for a specific frequency.\n\t * The frequencies are spread linearly from 0 to 1/2 of the sample rate.\n\t * For example, for 48000 sample rate, the last item of the array will represent\n\t * the decibel value for 24000 Hz.\n\t *\n\t * @return {Uint8Array} The frequency data.\n\t */\n\tgetFrequencyData() {\n\n\t\tthis.analyser.getByteFrequencyData( this.data );\n\n\t\treturn this.data;\n\n\t}\n\n\t/**\n\t * Returns the average of the frequencies returned by {@link AudioAnalyser#getFrequencyData}.\n\t *\n\t * @return {number} The average frequency.\n\t */\n\tgetAverageFrequency() {\n\n\t\tlet value = 0;\n\t\tconst data = this.getFrequencyData();\n\n\t\tfor ( let i = 0; i < data.length; i ++ ) {\n\n\t\t\tvalue += data[ i ];\n\n\t\t}\n\n\t\treturn value / data.length;\n\n\t}\n\n}\n\n/**\n * Buffered scene graph property that allows weighted accumulation; used internally.\n */\nclass PropertyMixer {\n\n\t/**\n\t * Constructs a new property mixer.\n\t *\n\t * @param {PropertyBinding} binding - The property binding.\n\t * @param {string} typeName - The keyframe track type name.\n\t * @param {number} valueSize - The keyframe track value size.\n\t */\n\tconstructor( binding, typeName, valueSize ) {\n\n\t\t/**\n\t\t * The property binding.\n\t\t *\n\t\t * @type {PropertyBinding}\n\t\t */\n\t\tthis.binding = binding;\n\n\t\t/**\n\t\t * The keyframe track value size.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.valueSize = valueSize;\n\n\t\tlet mixFunction,\n\t\t\tmixFunctionAdditive,\n\t\t\tsetIdentity;\n\n\t\t// buffer layout: [ incoming | accu0 | accu1 | orig | addAccu | (optional work) ]\n\t\t//\n\t\t// interpolators can use .buffer as their .result\n\t\t// the data then goes to 'incoming'\n\t\t//\n\t\t// 'accu0' and 'accu1' are used frame-interleaved for\n\t\t// the cumulative result and are compared to detect\n\t\t// changes\n\t\t//\n\t\t// 'orig' stores the original state of the property\n\t\t//\n\t\t// 'add' is used for additive cumulative results\n\t\t//\n\t\t// 'work' is optional and is only present for quaternion types. It is used\n\t\t// to store intermediate quaternion multiplication results\n\n\t\tswitch ( typeName ) {\n\n\t\t\tcase 'quaternion':\n\t\t\t\tmixFunction = this._slerp;\n\t\t\t\tmixFunctionAdditive = this._slerpAdditive;\n\t\t\t\tsetIdentity = this._setAdditiveIdentityQuaternion;\n\n\t\t\t\tthis.buffer = new Float64Array( valueSize * 6 );\n\t\t\t\tthis._workIndex = 5;\n\t\t\t\tbreak;\n\n\t\t\tcase 'string':\n\t\t\tcase 'bool':\n\t\t\t\tmixFunction = this._select;\n\n\t\t\t\t// Use the regular mix function and for additive on these types,\n\t\t\t\t// additive is not relevant for non-numeric types\n\t\t\t\tmixFunctionAdditive = this._select;\n\n\t\t\t\tsetIdentity = this._setAdditiveIdentityOther;\n\n\t\t\t\tthis.buffer = new Array( valueSize * 5 );\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tmixFunction = this._lerp;\n\t\t\t\tmixFunctionAdditive = this._lerpAdditive;\n\t\t\t\tsetIdentity = this._setAdditiveIdentityNumeric;\n\n\t\t\t\tthis.buffer = new Float64Array( valueSize * 5 );\n\n\t\t}\n\n\t\tthis._mixBufferRegion = mixFunction;\n\t\tthis._mixBufferRegionAdditive = mixFunctionAdditive;\n\t\tthis._setIdentity = setIdentity;\n\t\tthis._origIndex = 3;\n\t\tthis._addIndex = 4;\n\n\t\t/**\n\t\t * TODO\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.cumulativeWeight = 0;\n\n\t\t/**\n\t\t * TODO\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.cumulativeWeightAdditive = 0;\n\n\t\t/**\n\t\t * TODO\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.useCount = 0;\n\n\t\t/**\n\t\t * TODO\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.referenceCount = 0;\n\n\t}\n\n\t/**\n\t * Accumulates data in the `incoming` region into `accu<i>`.\n\t *\n\t * @param {number} accuIndex - The accumulation index.\n\t * @param {number} weight - The weight.\n\t */\n\taccumulate( accuIndex, weight ) {\n\n\t\t// note: happily accumulating nothing when weight = 0, the caller knows\n\t\t// the weight and shouldn't have made the call in the first place\n\n\t\tconst buffer = this.buffer,\n\t\t\tstride = this.valueSize,\n\t\t\toffset = accuIndex * stride + stride;\n\n\t\tlet currentWeight = this.cumulativeWeight;\n\n\t\tif ( currentWeight === 0 ) {\n\n\t\t\t// accuN := incoming * weight\n\n\t\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tbuffer[ offset + i ] = buffer[ i ];\n\n\t\t\t}\n\n\t\t\tcurrentWeight = weight;\n\n\t\t} else {\n\n\t\t\t// accuN := accuN + incoming * weight\n\n\t\t\tcurrentWeight += weight;\n\t\t\tconst mix = weight / currentWeight;\n\t\t\tthis._mixBufferRegion( buffer, offset, 0, mix, stride );\n\n\t\t}\n\n\t\tthis.cumulativeWeight = currentWeight;\n\n\t}\n\n\t/**\n\t * Accumulates data in the `incoming` region into `add`.\n\t *\n\t * @param {number} weight - The weight.\n\t */\n\taccumulateAdditive( weight ) {\n\n\t\tconst buffer = this.buffer,\n\t\t\tstride = this.valueSize,\n\t\t\toffset = stride * this._addIndex;\n\n\t\tif ( this.cumulativeWeightAdditive === 0 ) {\n\n\t\t\t// add = identity\n\n\t\t\tthis._setIdentity();\n\n\t\t}\n\n\t\t// add := add + incoming * weight\n\n\t\tthis._mixBufferRegionAdditive( buffer, offset, 0, weight, stride );\n\t\tthis.cumulativeWeightAdditive += weight;\n\n\t}\n\n\t/**\n\t * Applies the state of `accu<i>` to the binding when accus differ.\n\t *\n\t * @param {number} accuIndex - The accumulation index.\n\t */\n\tapply( accuIndex ) {\n\n\t\tconst stride = this.valueSize,\n\t\t\tbuffer = this.buffer,\n\t\t\toffset = accuIndex * stride + stride,\n\n\t\t\tweight = this.cumulativeWeight,\n\t\t\tweightAdditive = this.cumulativeWeightAdditive,\n\n\t\t\tbinding = this.binding;\n\n\t\tthis.cumulativeWeight = 0;\n\t\tthis.cumulativeWeightAdditive = 0;\n\n\t\tif ( weight < 1 ) {\n\n\t\t\t// accuN := accuN + original * ( 1 - cumulativeWeight )\n\n\t\t\tconst originalValueOffset = stride * this._origIndex;\n\n\t\t\tthis._mixBufferRegion(\n\t\t\t\tbuffer, offset, originalValueOffset, 1 - weight, stride );\n\n\t\t}\n\n\t\tif ( weightAdditive > 0 ) {\n\n\t\t\t// accuN := accuN + additive accuN\n\n\t\t\tthis._mixBufferRegionAdditive( buffer, offset, this._addIndex * stride, 1, stride );\n\n\t\t}\n\n\t\tfor ( let i = stride, e = stride + stride; i !== e; ++ i ) {\n\n\t\t\tif ( buffer[ i ] !== buffer[ i + stride ] ) {\n\n\t\t\t\t// value has changed -> update scene graph\n\n\t\t\t\tbinding.setValue( buffer, offset );\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\n\t/**\n\t * Remembers the state of the bound property and copy it to both accus.\n\t */\n\tsaveOriginalState() {\n\n\t\tconst binding = this.binding;\n\n\t\tconst buffer = this.buffer,\n\t\t\tstride = this.valueSize,\n\n\t\t\toriginalValueOffset = stride * this._origIndex;\n\n\t\tbinding.getValue( buffer, originalValueOffset );\n\n\t\t// accu[0..1] := orig -- initially detect changes against the original\n\t\tfor ( let i = stride, e = originalValueOffset; i !== e; ++ i ) {\n\n\t\t\tbuffer[ i ] = buffer[ originalValueOffset + ( i % stride ) ];\n\n\t\t}\n\n\t\t// Add to identity for additive\n\t\tthis._setIdentity();\n\n\t\tthis.cumulativeWeight = 0;\n\t\tthis.cumulativeWeightAdditive = 0;\n\n\t}\n\n\t/**\n\t * Applies the state previously taken via {@link PropertyMixer#saveOriginalState} to the binding.\n\t */\n\trestoreOriginalState() {\n\n\t\tconst originalValueOffset = this.valueSize * 3;\n\t\tthis.binding.setValue( this.buffer, originalValueOffset );\n\n\t}\n\n\t// internals\n\n\t_setAdditiveIdentityNumeric() {\n\n\t\tconst startIndex = this._addIndex * this.valueSize;\n\t\tconst endIndex = startIndex + this.valueSize;\n\n\t\tfor ( let i = startIndex; i < endIndex; i ++ ) {\n\n\t\t\tthis.buffer[ i ] = 0;\n\n\t\t}\n\n\t}\n\n\t_setAdditiveIdentityQuaternion() {\n\n\t\tthis._setAdditiveIdentityNumeric();\n\t\tthis.buffer[ this._addIndex * this.valueSize + 3 ] = 1;\n\n\t}\n\n\t_setAdditiveIdentityOther() {\n\n\t\tconst startIndex = this._origIndex * this.valueSize;\n\t\tconst targetIndex = this._addIndex * this.valueSize;\n\n\t\tfor ( let i = 0; i < this.valueSize; i ++ ) {\n\n\t\t\tthis.buffer[ targetIndex + i ] = this.buffer[ startIndex + i ];\n\n\t\t}\n\n\t}\n\n\n\t// mix functions\n\n\t_select( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\tif ( t >= 0.5 ) {\n\n\t\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tbuffer[ dstOffset + i ] = buffer[ srcOffset + i ];\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_slerp( buffer, dstOffset, srcOffset, t ) {\n\n\t\tQuaternion.slerpFlat( buffer, dstOffset, buffer, dstOffset, buffer, srcOffset, t );\n\n\t}\n\n\t_slerpAdditive( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\tconst workOffset = this._workIndex * stride;\n\n\t\t// Store result in intermediate buffer offset\n\t\tQuaternion.multiplyQuaternionsFlat( buffer, workOffset, buffer, dstOffset, buffer, srcOffset );\n\n\t\t// Slerp to the intermediate result\n\t\tQuaternion.slerpFlat( buffer, dstOffset, buffer, dstOffset, buffer, workOffset, t );\n\n\t}\n\n\t_lerp( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\tconst s = 1 - t;\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tconst j = dstOffset + i;\n\n\t\t\tbuffer[ j ] = buffer[ j ] * s + buffer[ srcOffset + i ] * t;\n\n\t\t}\n\n\t}\n\n\t_lerpAdditive( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tconst j = dstOffset + i;\n\n\t\t\tbuffer[ j ] = buffer[ j ] + buffer[ srcOffset + i ] * t;\n\n\t\t}\n\n\t}\n\n}\n\n// Characters [].:/ are reserved for track binding syntax.\nconst _RESERVED_CHARS_RE = '\\\\[\\\\]\\\\.:\\\\/';\nconst _reservedRe = new RegExp( '[' + _RESERVED_CHARS_RE + ']', 'g' );\n\n// Attempts to allow node names from any language. ES5's `\\w` regexp matches\n// only latin characters, and the unicode \\p{L} is not yet supported. So\n// instead, we exclude reserved characters and match everything else.\nconst _wordChar = '[^' + _RESERVED_CHARS_RE + ']';\nconst _wordCharOrDot = '[^' + _RESERVED_CHARS_RE.replace( '\\\\.', '' ) + ']';\n\n// Parent directories, delimited by '/' or ':'. Currently unused, but must\n// be matched to parse the rest of the track name.\nconst _directoryRe = /*@__PURE__*/ /((?:WC+[\\/:])*)/.source.replace( 'WC', _wordChar );\n\n// Target node. May contain word characters (a-zA-Z0-9_) and '.' or '-'.\nconst _nodeRe = /*@__PURE__*/ /(WCOD+)?/.source.replace( 'WCOD', _wordCharOrDot );\n\n// Object on target node, and accessor. May not contain reserved\n// characters. Accessor may contain any character except closing bracket.\nconst _objectRe = /*@__PURE__*/ /(?:\\.(WC+)(?:\\[(.+)\\])?)?/.source.replace( 'WC', _wordChar );\n\n// Property and accessor. May not contain reserved characters. Accessor may\n// contain any non-bracket characters.\nconst _propertyRe = /*@__PURE__*/ /\\.(WC+)(?:\\[(.+)\\])?/.source.replace( 'WC', _wordChar );\n\nconst _trackRe = new RegExp( ''\n\t+ '^'\n\t+ _directoryRe\n\t+ _nodeRe\n\t+ _objectRe\n\t+ _propertyRe\n\t+ '$'\n);\n\nconst _supportedObjectNames = [ 'material', 'materials', 'bones', 'map' ];\n\nclass Composite {\n\n\tconstructor( targetGroup, path, optionalParsedPath ) {\n\n\t\tconst parsedPath = optionalParsedPath || PropertyBinding.parseTrackName( path );\n\n\t\tthis._targetGroup = targetGroup;\n\t\tthis._bindings = targetGroup.subscribe_( path, parsedPath );\n\n\t}\n\n\tgetValue( array, offset ) {\n\n\t\tthis.bind(); // bind all binding\n\n\t\tconst firstValidIndex = this._targetGroup.nCachedObjects_,\n\t\t\tbinding = this._bindings[ firstValidIndex ];\n\n\t\t// and only call .getValue on the first\n\t\tif ( binding !== undefined ) binding.getValue( array, offset );\n\n\t}\n\n\tsetValue( array, offset ) {\n\n\t\tconst bindings = this._bindings;\n\n\t\tfor ( let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\tbindings[ i ].setValue( array, offset );\n\n\t\t}\n\n\t}\n\n\tbind() {\n\n\t\tconst bindings = this._bindings;\n\n\t\tfor ( let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\tbindings[ i ].bind();\n\n\t\t}\n\n\t}\n\n\tunbind() {\n\n\t\tconst bindings = this._bindings;\n\n\t\tfor ( let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\tbindings[ i ].unbind();\n\n\t\t}\n\n\t}\n\n}\n\n// Note: This class uses a State pattern on a per-method basis:\n// 'bind' sets 'this.getValue' / 'setValue' and shadows the\n// prototype version of these methods with one that represents\n// the bound state. When the property is not found, the methods\n// become no-ops.\n\n\n/**\n * This holds a reference to a real property in the scene graph; used internally.\n */\nclass PropertyBinding {\n\n\t/**\n\t * Constructs a new property binding.\n\t *\n\t * @param {Object} rootNode - The root node.\n\t * @param {string} path - The path.\n\t * @param {?Object} [parsedPath] - The parsed path.\n\t */\n\tconstructor( rootNode, path, parsedPath ) {\n\n\t\t/**\n\t\t * The object path to the animated property.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.path = path;\n\n\t\t/**\n\t\t * An object holding information about the path.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parsedPath = parsedPath || PropertyBinding.parseTrackName( path );\n\n\t\t/**\n\t\t * The object owns the animated property.\n\t\t *\n\t\t * @type {?Object}\n\t\t */\n\t\tthis.node = PropertyBinding.findNode( rootNode, this.parsedPath.nodeName );\n\n\t\t/**\n\t\t * The root node.\n\t\t *\n\t\t * @type {Object3D|Skeleton}\n\t\t */\n\t\tthis.rootNode = rootNode;\n\n\t\t// initial state of these methods that calls 'bind'\n\t\tthis.getValue = this._getValue_unbound;\n\t\tthis.setValue = this._setValue_unbound;\n\n\t}\n\n\n\t/**\n\t * Factory method for creating a property binding from the given parameters.\n\t *\n\t * @static\n\t * @param {Object} root - The root node.\n\t * @param {string} path - The path.\n\t * @param {?Object} [parsedPath] - The parsed path.\n\t * @return {PropertyBinding|Composite} The created property binding or composite.\n\t */\n\tstatic create( root, path, parsedPath ) {\n\n\t\tif ( ! ( root && root.isAnimationObjectGroup ) ) {\n\n\t\t\treturn new PropertyBinding( root, path, parsedPath );\n\n\t\t} else {\n\n\t\t\treturn new PropertyBinding.Composite( root, path, parsedPath );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Replaces spaces with underscores and removes unsupported characters from\n\t * node names, to ensure compatibility with parseTrackName().\n\t *\n\t * @param {string} name - Node name to be sanitized.\n\t * @return {string} The sanitized node name.\n\t */\n\tstatic sanitizeNodeName( name ) {\n\n\t\treturn name.replace( /\\s/g, '_' ).replace( _reservedRe, '' );\n\n\t}\n\n\t/**\n\t * Parses the given track name (an object path to an animated property) and\n\t * returns an object with information about the path. Matches strings in the following forms:\n\t *\n\t * - nodeName.property\n\t * - nodeName.property[accessor]\n\t * - nodeName.material.property[accessor]\n\t * - uuid.property[accessor]\n\t * - uuid.objectName[objectIndex].propertyName[propertyIndex]\n\t * - parentName/nodeName.property\n\t * - parentName/parentName/nodeName.property[index]\n\t * - .bone[Armature.DEF_cog].position\n\t * - scene:helium_balloon_model:helium_balloon_model.position\n\t *\n\t * @static\n\t * @param {string} trackName - The track name to parse.\n\t * @return {Object} The parsed track name as an object.\n\t */\n\tstatic parseTrackName( trackName ) {\n\n\t\tconst matches = _trackRe.exec( trackName );\n\n\t\tif ( matches === null ) {\n\n\t\t\tthrow new Error( 'PropertyBinding: Cannot parse trackName: ' + trackName );\n\n\t\t}\n\n\t\tconst results = {\n\t\t\t// directoryName: matches[ 1 ], // (tschw) currently unused\n\t\t\tnodeName: matches[ 2 ],\n\t\t\tobjectName: matches[ 3 ],\n\t\t\tobjectIndex: matches[ 4 ],\n\t\t\tpropertyName: matches[ 5 ], // required\n\t\t\tpropertyIndex: matches[ 6 ]\n\t\t};\n\n\t\tconst lastDot = results.nodeName && results.nodeName.lastIndexOf( '.' );\n\n\t\tif ( lastDot !== undefined && lastDot !== -1 ) {\n\n\t\t\tconst objectName = results.nodeName.substring( lastDot + 1 );\n\n\t\t\t// Object names must be checked against an allowlist. Otherwise, there\n\t\t\t// is no way to parse 'foo.bar.baz': 'baz' must be a property, but\n\t\t\t// 'bar' could be the objectName, or part of a nodeName (which can\n\t\t\t// include '.' characters).\n\t\t\tif ( _supportedObjectNames.indexOf( objectName ) !== -1 ) {\n\n\t\t\t\tresults.nodeName = results.nodeName.substring( 0, lastDot );\n\t\t\t\tresults.objectName = objectName;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( results.propertyName === null || results.propertyName.length === 0 ) {\n\n\t\t\tthrow new Error( 'PropertyBinding: can not parse propertyName from trackName: ' + trackName );\n\n\t\t}\n\n\t\treturn results;\n\n\t}\n\n\t/**\n\t * Searches for a node in the hierarchy of the given root object by the given\n\t * node name.\n\t *\n\t * @static\n\t * @param {Object} root - The root object.\n\t * @param {string|number} nodeName - The name of the node.\n\t * @return {?Object} The found node. Returns `null` if no object was found.\n\t */\n\tstatic findNode( root, nodeName ) {\n\n\t\tif ( nodeName === undefined || nodeName === '' || nodeName === '.' || nodeName === -1 || nodeName === root.name || nodeName === root.uuid ) {\n\n\t\t\treturn root;\n\n\t\t}\n\n\t\t// search into skeleton bones.\n\t\tif ( root.skeleton ) {\n\n\t\t\tconst bone = root.skeleton.getBoneByName( nodeName );\n\n\t\t\tif ( bone !== undefined ) {\n\n\t\t\t\treturn bone;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// search into node subtree.\n\t\tif ( root.children ) {\n\n\t\t\tconst searchNodeSubtree = function ( children ) {\n\n\t\t\t\tfor ( let i = 0; i < children.length; i ++ ) {\n\n\t\t\t\t\tconst childNode = children[ i ];\n\n\t\t\t\t\tif ( childNode.name === nodeName || childNode.uuid === nodeName ) {\n\n\t\t\t\t\t\treturn childNode;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst result = searchNodeSubtree( childNode.children );\n\n\t\t\t\t\tif ( result ) return result;\n\n\t\t\t\t}\n\n\t\t\t\treturn null;\n\n\t\t\t};\n\n\t\t\tconst subTreeNode = searchNodeSubtree( root.children );\n\n\t\t\tif ( subTreeNode ) {\n\n\t\t\t\treturn subTreeNode;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\t// these are used to \"bind\" a nonexistent property\n\t_getValue_unavailable() {}\n\t_setValue_unavailable() {}\n\n\t// Getters\n\n\t_getValue_direct( buffer, offset ) {\n\n\t\tbuffer[ offset ] = this.targetObject[ this.propertyName ];\n\n\t}\n\n\t_getValue_array( buffer, offset ) {\n\n\t\tconst source = this.resolvedProperty;\n\n\t\tfor ( let i = 0, n = source.length; i !== n; ++ i ) {\n\n\t\t\tbuffer[ offset ++ ] = source[ i ];\n\n\t\t}\n\n\t}\n\n\t_getValue_arrayElement( buffer, offset ) {\n\n\t\tbuffer[ offset ] = this.resolvedProperty[ this.propertyIndex ];\n\n\t}\n\n\t_getValue_toArray( buffer, offset ) {\n\n\t\tthis.resolvedProperty.toArray( buffer, offset );\n\n\t}\n\n\t// Direct\n\n\t_setValue_direct( buffer, offset ) {\n\n\t\tthis.targetObject[ this.propertyName ] = buffer[ offset ];\n\n\t}\n\n\t_setValue_direct_setNeedsUpdate( buffer, offset ) {\n\n\t\tthis.targetObject[ this.propertyName ] = buffer[ offset ];\n\t\tthis.targetObject.needsUpdate = true;\n\n\t}\n\n\t_setValue_direct_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\tthis.targetObject[ this.propertyName ] = buffer[ offset ];\n\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t}\n\n\t// EntireArray\n\n\t_setValue_array( buffer, offset ) {\n\n\t\tconst dest = this.resolvedProperty;\n\n\t\tfor ( let i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t}\n\n\t}\n\n\t_setValue_array_setNeedsUpdate( buffer, offset ) {\n\n\t\tconst dest = this.resolvedProperty;\n\n\t\tfor ( let i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t}\n\n\t\tthis.targetObject.needsUpdate = true;\n\n\t}\n\n\t_setValue_array_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\tconst dest = this.resolvedProperty;\n\n\t\tfor ( let i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t}\n\n\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t}\n\n\t// ArrayElement\n\n\t_setValue_arrayElement( buffer, offset ) {\n\n\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\n\t}\n\n\t_setValue_arrayElement_setNeedsUpdate( buffer, offset ) {\n\n\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\t\tthis.targetObject.needsUpdate = true;\n\n\t}\n\n\t_setValue_arrayElement_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t}\n\n\t// HasToFromArray\n\n\t_setValue_fromArray( buffer, offset ) {\n\n\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\n\t}\n\n\t_setValue_fromArray_setNeedsUpdate( buffer, offset ) {\n\n\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\t\tthis.targetObject.needsUpdate = true;\n\n\t}\n\n\t_setValue_fromArray_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t}\n\n\t_getValue_unbound( targetArray, offset ) {\n\n\t\tthis.bind();\n\t\tthis.getValue( targetArray, offset );\n\n\t}\n\n\t_setValue_unbound( sourceArray, offset ) {\n\n\t\tthis.bind();\n\t\tthis.setValue( sourceArray, offset );\n\n\t}\n\n\t/**\n\t * Creates a getter / setter pair for the property tracked by this binding.\n\t */\n\tbind() {\n\n\t\tlet targetObject = this.node;\n\t\tconst parsedPath = this.parsedPath;\n\n\t\tconst objectName = parsedPath.objectName;\n\t\tconst propertyName = parsedPath.propertyName;\n\t\tlet propertyIndex = parsedPath.propertyIndex;\n\n\t\tif ( ! targetObject ) {\n\n\t\t\ttargetObject = PropertyBinding.findNode( this.rootNode, parsedPath.nodeName );\n\n\t\t\tthis.node = targetObject;\n\n\t\t}\n\n\t\t// set fail state so we can just 'return' on error\n\t\tthis.getValue = this._getValue_unavailable;\n\t\tthis.setValue = this._setValue_unavailable;\n\n\t\t// ensure there is a value node\n\t\tif ( ! targetObject ) {\n\n\t\t\twarn( 'PropertyBinding: No target node found for track: ' + this.path + '.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( objectName ) {\n\n\t\t\tlet objectIndex = parsedPath.objectIndex;\n\n\t\t\t// special cases were we need to reach deeper into the hierarchy to get the face materials....\n\t\t\tswitch ( objectName ) {\n\n\t\t\t\tcase 'materials':\n\n\t\t\t\t\tif ( ! targetObject.material ) {\n\n\t\t\t\t\t\terror( 'PropertyBinding: Can not bind to material as node does not have a material.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! targetObject.material.materials ) {\n\n\t\t\t\t\t\terror( 'PropertyBinding: Can not bind to material.materials as node.material does not have a materials array.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttargetObject = targetObject.material.materials;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'bones':\n\n\t\t\t\t\tif ( ! targetObject.skeleton ) {\n\n\t\t\t\t\t\terror( 'PropertyBinding: Can not bind to bones as node does not have a skeleton.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// potential future optimization: skip this if propertyIndex is already an integer\n\t\t\t\t\t// and convert the integer string to a true integer.\n\n\t\t\t\t\ttargetObject = targetObject.skeleton.bones;\n\n\t\t\t\t\t// support resolving morphTarget names into indices.\n\t\t\t\t\tfor ( let i = 0; i < targetObject.length; i ++ ) {\n\n\t\t\t\t\t\tif ( targetObject[ i ].name === objectIndex ) {\n\n\t\t\t\t\t\t\tobjectIndex = i;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'map':\n\n\t\t\t\t\tif ( 'map' in targetObject ) {\n\n\t\t\t\t\t\ttargetObject = targetObject.map;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! targetObject.material ) {\n\n\t\t\t\t\t\terror( 'PropertyBinding: Can not bind to material as node does not have a material.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! targetObject.material.map ) {\n\n\t\t\t\t\t\terror( 'PropertyBinding: Can not bind to material.map as node.material does not have a map.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttargetObject = targetObject.material.map;\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tif ( targetObject[ objectName ] === undefined ) {\n\n\t\t\t\t\t\terror( 'PropertyBinding: Can not bind to objectName of node undefined.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttargetObject = targetObject[ objectName ];\n\n\t\t\t}\n\n\n\t\t\tif ( objectIndex !== undefined ) {\n\n\t\t\t\tif ( targetObject[ objectIndex ] === undefined ) {\n\n\t\t\t\t\terror( 'PropertyBinding: Trying to bind to objectIndex of objectName, but is undefined.', this, targetObject );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\ttargetObject = targetObject[ objectIndex ];\n\n\t\t\t}\n\n\t\t}\n\n\t\t// resolve property\n\t\tconst nodeProperty = targetObject[ propertyName ];\n\n\t\tif ( nodeProperty === undefined ) {\n\n\t\t\tconst nodeName = parsedPath.nodeName;\n\n\t\t\terror( 'PropertyBinding: Trying to update property for track: ' + nodeName +\n\t\t\t\t'.' + propertyName + ' but it wasn\\'t found.', targetObject );\n\t\t\treturn;\n\n\t\t}\n\n\t\t// determine versioning scheme\n\t\tlet versioning = this.Versioning.None;\n\n\t\tthis.targetObject = targetObject;\n\n\t\tif ( targetObject.isMaterial === true ) {\n\n\t\t\tversioning = this.Versioning.NeedsUpdate;\n\n\t\t} else if ( targetObject.isObject3D === true ) {\n\n\t\t\tversioning = this.Versioning.MatrixWorldNeedsUpdate;\n\n\t\t}\n\n\t\t// determine how the property gets bound\n\t\tlet bindingType = this.BindingType.Direct;\n\n\t\tif ( propertyIndex !== undefined ) {\n\n\t\t\t// access a sub element of the property array (only primitives are supported right now)\n\n\t\t\tif ( propertyName === 'morphTargetInfluences' ) {\n\n\t\t\t\t// potential optimization, skip this if propertyIndex is already an integer, and convert the integer string to a true integer.\n\n\t\t\t\t// support resolving morphTarget names into indices.\n\t\t\t\tif ( ! targetObject.geometry ) {\n\n\t\t\t\t\terror( 'PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.', this );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tif ( ! targetObject.geometry.morphAttributes ) {\n\n\t\t\t\t\terror( 'PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphAttributes.', this );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tif ( targetObject.morphTargetDictionary[ propertyIndex ] !== undefined ) {\n\n\t\t\t\t\tpropertyIndex = targetObject.morphTargetDictionary[ propertyIndex ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tbindingType = this.BindingType.ArrayElement;\n\n\t\t\tthis.resolvedProperty = nodeProperty;\n\t\t\tthis.propertyIndex = propertyIndex;\n\n\t\t} else if ( nodeProperty.fromArray !== undefined && nodeProperty.toArray !== undefined ) {\n\n\t\t\t// must use copy for Object3D.Euler/Quaternion\n\n\t\t\tbindingType = this.BindingType.HasFromToArray;\n\n\t\t\tthis.resolvedProperty = nodeProperty;\n\n\t\t} else if ( Array.isArray( nodeProperty ) ) {\n\n\t\t\tbindingType = this.BindingType.EntireArray;\n\n\t\t\tthis.resolvedProperty = nodeProperty;\n\n\t\t} else {\n\n\t\t\tthis.propertyName = propertyName;\n\n\t\t}\n\n\t\t// select getter / setter\n\t\tthis.getValue = this.GetterByBindingType[ bindingType ];\n\t\tthis.setValue = this.SetterByBindingTypeAndVersioning[ bindingType ][ versioning ];\n\n\t}\n\n\t/**\n\t * Unbinds the property.\n\t */\n\tunbind() {\n\n\t\tthis.node = null;\n\n\t\t// back to the prototype version of getValue / setValue\n\t\t// note: avoiding to mutate the shape of 'this' via 'delete'\n\t\tthis.getValue = this._getValue_unbound;\n\t\tthis.setValue = this._setValue_unbound;\n\n\t}\n\n}\n\nPropertyBinding.Composite = Composite;\n\nPropertyBinding.prototype.BindingType = {\n\tDirect: 0,\n\tEntireArray: 1,\n\tArrayElement: 2,\n\tHasFromToArray: 3\n};\n\nPropertyBinding.prototype.Versioning = {\n\tNone: 0,\n\tNeedsUpdate: 1,\n\tMatrixWorldNeedsUpdate: 2\n};\n\nPropertyBinding.prototype.GetterByBindingType = [\n\n\tPropertyBinding.prototype._getValue_direct,\n\tPropertyBinding.prototype._getValue_array,\n\tPropertyBinding.prototype._getValue_arrayElement,\n\tPropertyBinding.prototype._getValue_toArray,\n\n];\n\nPropertyBinding.prototype.SetterByBindingTypeAndVersioning = [\n\n\t[\n\t\t// Direct\n\t\tPropertyBinding.prototype._setValue_direct,\n\t\tPropertyBinding.prototype._setValue_direct_setNeedsUpdate,\n\t\tPropertyBinding.prototype._setValue_direct_setMatrixWorldNeedsUpdate,\n\n\t], [\n\n\t\t// EntireArray\n\n\t\tPropertyBinding.prototype._setValue_array,\n\t\tPropertyBinding.prototype._setValue_array_setNeedsUpdate,\n\t\tPropertyBinding.prototype._setValue_array_setMatrixWorldNeedsUpdate,\n\n\t], [\n\n\t\t// ArrayElement\n\t\tPropertyBinding.prototype._setValue_arrayElement,\n\t\tPropertyBinding.prototype._setValue_arrayElement_setNeedsUpdate,\n\t\tPropertyBinding.prototype._setValue_arrayElement_setMatrixWorldNeedsUpdate,\n\n\t], [\n\n\t\t// HasToFromArray\n\t\tPropertyBinding.prototype._setValue_fromArray,\n\t\tPropertyBinding.prototype._setValue_fromArray_setNeedsUpdate,\n\t\tPropertyBinding.prototype._setValue_fromArray_setMatrixWorldNeedsUpdate,\n\n\t]\n\n];\n\n/**\n * A group of objects that receives a shared animation state.\n *\n * Usage:\n *\n * - Add objects you would otherwise pass as 'root' to the\n * constructor or the .clipAction method of AnimationMixer.\n * - Instead pass this object as 'root'.\n * - You can also add and remove objects later when the mixer is running.\n *\n * Note:\n *\n * - Objects of this class appear as one object to the mixer,\n * so cache control of the individual objects must be done on the group.\n *\n * Limitation:\n *\n * - The animated properties must be compatible among the all objects in the group.\n * - A single property can either be controlled through a target group or directly, but not both.\n */\nclass AnimationObjectGroup {\n\n\t/**\n\t * Constructs a new animation group.\n\t *\n\t * @param {...Object3D} arguments - An arbitrary number of 3D objects that share the same animation state.\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isAnimationObjectGroup = true;\n\n\t\t/**\n\t\t * The UUID of the 3D object.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.uuid = generateUUID();\n\n\t\t// cached objects followed by the active ones\n\t\tthis._objects = Array.prototype.slice.call( arguments );\n\n\t\tthis.nCachedObjects_ = 0; // threshold\n\t\t// note: read by PropertyBinding.Composite\n\n\t\tconst indices = {};\n\t\tthis._indicesByUUID = indices; // for bookkeeping\n\n\t\tfor ( let i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tindices[ arguments[ i ].uuid ] = i;\n\n\t\t}\n\n\t\tthis._paths = []; // inside: string\n\t\tthis._parsedPaths = []; // inside: { we don't care, here }\n\t\tthis._bindings = []; // inside: Array< PropertyBinding >\n\t\tthis._bindingsIndicesByPath = {}; // inside: indices in these arrays\n\n\t\tconst scope = this;\n\n\t\tthis.stats = {\n\n\t\t\tobjects: {\n\t\t\t\tget total() {\n\n\t\t\t\t\treturn scope._objects.length;\n\n\t\t\t\t},\n\t\t\t\tget inUse() {\n\n\t\t\t\t\treturn this.total - scope.nCachedObjects_;\n\n\t\t\t\t}\n\t\t\t},\n\t\t\tget bindingsPerObject() {\n\n\t\t\t\treturn scope._bindings.length;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t/**\n\t * Adds an arbitrary number of objects to this animation group.\n\t *\n\t * @param {...Object3D} arguments - The 3D objects to add.\n\t */\n\tadd() {\n\n\t\tconst objects = this._objects,\n\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\tpaths = this._paths,\n\t\t\tparsedPaths = this._parsedPaths,\n\t\t\tbindings = this._bindings,\n\t\t\tnBindings = bindings.length;\n\n\t\tlet knownObject = undefined,\n\t\t\tnObjects = objects.length,\n\t\t\tnCachedObjects = this.nCachedObjects_;\n\n\t\tfor ( let i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tconst object = arguments[ i ],\n\t\t\t\tuuid = object.uuid;\n\t\t\tlet index = indicesByUUID[ uuid ];\n\n\t\t\tif ( index === undefined ) {\n\n\t\t\t\t// unknown object -> add it to the ACTIVE region\n\n\t\t\t\tindex = nObjects ++;\n\t\t\t\tindicesByUUID[ uuid ] = index;\n\t\t\t\tobjects.push( object );\n\n\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\tbindings[ j ].push( new PropertyBinding( object, paths[ j ], parsedPaths[ j ] ) );\n\n\t\t\t\t}\n\n\t\t\t} else if ( index < nCachedObjects ) {\n\n\t\t\t\tknownObject = objects[ index ];\n\n\t\t\t\t// move existing object to the ACTIVE region\n\n\t\t\t\tconst firstActiveIndex = -- nCachedObjects,\n\t\t\t\t\tlastCachedObject = objects[ firstActiveIndex ];\n\n\t\t\t\tindicesByUUID[ lastCachedObject.uuid ] = index;\n\t\t\t\tobjects[ index ] = lastCachedObject;\n\n\t\t\t\tindicesByUUID[ uuid ] = firstActiveIndex;\n\t\t\t\tobjects[ firstActiveIndex ] = object;\n\n\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\tconst bindingsForPath = bindings[ j ],\n\t\t\t\t\t\tlastCached = bindingsForPath[ firstActiveIndex ];\n\n\t\t\t\t\tlet binding = bindingsForPath[ index ];\n\n\t\t\t\t\tbindingsForPath[ index ] = lastCached;\n\n\t\t\t\t\tif ( binding === undefined ) {\n\n\t\t\t\t\t\t// since we do not bother to create new bindings\n\t\t\t\t\t\t// for objects that are cached, the binding may\n\t\t\t\t\t\t// or may not exist\n\n\t\t\t\t\t\tbinding = new PropertyBinding( object, paths[ j ], parsedPaths[ j ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbindingsForPath[ firstActiveIndex ] = binding;\n\n\t\t\t\t}\n\n\t\t\t} else if ( objects[ index ] !== knownObject ) {\n\n\t\t\t\terror( 'AnimationObjectGroup: Different objects with the same UUID ' +\n\t\t\t\t\t'detected. Clean the caches or recreate your infrastructure when reloading scenes.' );\n\n\t\t\t} // else the object is already where we want it to be\n\n\t\t} // for arguments\n\n\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t}\n\n\t/**\n\t * Removes an arbitrary number of objects to this animation group\n\t *\n\t * @param {...Object3D} arguments - The 3D objects to remove.\n\t */\n\tremove() {\n\n\t\tconst objects = this._objects,\n\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\tbindings = this._bindings,\n\t\t\tnBindings = bindings.length;\n\n\t\tlet nCachedObjects = this.nCachedObjects_;\n\n\t\tfor ( let i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tconst object = arguments[ i ],\n\t\t\t\tuuid = object.uuid,\n\t\t\t\tindex = indicesByUUID[ uuid ];\n\n\t\t\tif ( index !== undefined && index >= nCachedObjects ) {\n\n\t\t\t\t// move existing object into the CACHED region\n\n\t\t\t\tconst lastCachedIndex = nCachedObjects ++,\n\t\t\t\t\tfirstActiveObject = objects[ lastCachedIndex ];\n\n\t\t\t\tindicesByUUID[ firstActiveObject.uuid ] = index;\n\t\t\t\tobjects[ index ] = firstActiveObject;\n\n\t\t\t\tindicesByUUID[ uuid ] = lastCachedIndex;\n\t\t\t\tobjects[ lastCachedIndex ] = object;\n\n\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\tconst bindingsForPath = bindings[ j ],\n\t\t\t\t\t\tfirstActive = bindingsForPath[ lastCachedIndex ],\n\t\t\t\t\t\tbinding = bindingsForPath[ index ];\n\n\t\t\t\t\tbindingsForPath[ index ] = firstActive;\n\t\t\t\t\tbindingsForPath[ lastCachedIndex ] = binding;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} // for arguments\n\n\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t}\n\n\t/**\n\t * Deallocates all memory resources for the passed 3D objects of this animation group.\n\t *\n\t * @param {...Object3D} arguments - The 3D objects to uncache.\n\t */\n\tuncache() {\n\n\t\tconst objects = this._objects,\n\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\tbindings = this._bindings,\n\t\t\tnBindings = bindings.length;\n\n\t\tlet nCachedObjects = this.nCachedObjects_,\n\t\t\tnObjects = objects.length;\n\n\t\tfor ( let i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tconst object = arguments[ i ],\n\t\t\t\tuuid = object.uuid,\n\t\t\t\tindex = indicesByUUID[ uuid ];\n\n\t\t\tif ( index !== undefined ) {\n\n\t\t\t\tdelete indicesByUUID[ uuid ];\n\n\t\t\t\tif ( index < nCachedObjects ) {\n\n\t\t\t\t\t// object is cached, shrink the CACHED region\n\n\t\t\t\t\tconst firstActiveIndex = -- nCachedObjects,\n\t\t\t\t\t\tlastCachedObject = objects[ firstActiveIndex ],\n\t\t\t\t\t\tlastIndex = -- nObjects,\n\t\t\t\t\t\tlastObject = objects[ lastIndex ];\n\n\t\t\t\t\t// last cached object takes this object's place\n\t\t\t\t\tindicesByUUID[ lastCachedObject.uuid ] = index;\n\t\t\t\t\tobjects[ index ] = lastCachedObject;\n\n\t\t\t\t\t// last object goes to the activated slot and pop\n\t\t\t\t\tindicesByUUID[ lastObject.uuid ] = firstActiveIndex;\n\t\t\t\t\tobjects[ firstActiveIndex ] = lastObject;\n\t\t\t\t\tobjects.pop();\n\n\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\tconst bindingsForPath = bindings[ j ],\n\t\t\t\t\t\t\tlastCached = bindingsForPath[ firstActiveIndex ],\n\t\t\t\t\t\t\tlast = bindingsForPath[ lastIndex ];\n\n\t\t\t\t\t\tbindingsForPath[ index ] = lastCached;\n\t\t\t\t\t\tbindingsForPath[ firstActiveIndex ] = last;\n\t\t\t\t\t\tbindingsForPath.pop();\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// object is active, just swap with the last and pop\n\n\t\t\t\t\tconst lastIndex = -- nObjects,\n\t\t\t\t\t\tlastObject = objects[ lastIndex ];\n\n\t\t\t\t\tif ( lastIndex > 0 ) {\n\n\t\t\t\t\t\tindicesByUUID[ lastObject.uuid ] = index;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tobjects[ index ] = lastObject;\n\t\t\t\t\tobjects.pop();\n\n\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\tconst bindingsForPath = bindings[ j ];\n\n\t\t\t\t\t\tbindingsForPath[ index ] = bindingsForPath[ lastIndex ];\n\t\t\t\t\t\tbindingsForPath.pop();\n\n\t\t\t\t\t}\n\n\t\t\t\t} // cached or active\n\n\t\t\t} // if object is known\n\n\t\t} // for arguments\n\n\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t}\n\n\t// Internal interface used by befriended PropertyBinding.Composite:\n\n\tsubscribe_( path, parsedPath ) {\n\n\t\t// returns an array of bindings for the given path that is changed\n\t\t// according to the contained objects in the group\n\n\t\tconst indicesByPath = this._bindingsIndicesByPath;\n\t\tlet index = indicesByPath[ path ];\n\t\tconst bindings = this._bindings;\n\n\t\tif ( index !== undefined ) return bindings[ index ];\n\n\t\tconst paths = this._paths,\n\t\t\tparsedPaths = this._parsedPaths,\n\t\t\tobjects = this._objects,\n\t\t\tnObjects = objects.length,\n\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\tbindingsForPath = new Array( nObjects );\n\n\t\tindex = bindings.length;\n\n\t\tindicesByPath[ path ] = index;\n\n\t\tpaths.push( path );\n\t\tparsedPaths.push( parsedPath );\n\t\tbindings.push( bindingsForPath );\n\n\t\tfor ( let i = nCachedObjects, n = objects.length; i !== n; ++ i ) {\n\n\t\t\tconst object = objects[ i ];\n\t\t\tbindingsForPath[ i ] = new PropertyBinding( object, path, parsedPath );\n\n\t\t}\n\n\t\treturn bindingsForPath;\n\n\t}\n\n\tunsubscribe_( path ) {\n\n\t\t// tells the group to forget about a property path and no longer\n\t\t// update the array previously obtained with 'subscribe_'\n\n\t\tconst indicesByPath = this._bindingsIndicesByPath,\n\t\t\tindex = indicesByPath[ path ];\n\n\t\tif ( index !== undefined ) {\n\n\t\t\tconst paths = this._paths,\n\t\t\t\tparsedPaths = this._parsedPaths,\n\t\t\t\tbindings = this._bindings,\n\t\t\t\tlastBindingsIndex = bindings.length - 1,\n\t\t\t\tlastBindings = bindings[ lastBindingsIndex ],\n\t\t\t\tlastBindingsPath = path[ lastBindingsIndex ];\n\n\t\t\tindicesByPath[ lastBindingsPath ] = index;\n\n\t\t\tbindings[ index ] = lastBindings;\n\t\t\tbindings.pop();\n\n\t\t\tparsedPaths[ index ] = parsedPaths[ lastBindingsIndex ];\n\t\t\tparsedPaths.pop();\n\n\t\t\tpaths[ index ] = paths[ lastBindingsIndex ];\n\t\t\tpaths.pop();\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * An instance of `AnimationAction` schedules the playback of an animation which is\n * stored in {@link AnimationClip}.\n */\nclass AnimationAction {\n\n\t/**\n\t * Constructs a new animation action.\n\t *\n\t * @param {AnimationMixer} mixer - The mixer that is controlled by this action.\n\t * @param {AnimationClip} clip - The animation clip that holds the actual keyframes.\n\t * @param {?Object3D} [localRoot=null] - The root object on which this action is performed.\n\t * @param {(NormalAnimationBlendMode|AdditiveAnimationBlendMode)} [blendMode] - The blend mode.\n\t */\n\tconstructor( mixer, clip, localRoot = null, blendMode = clip.blendMode ) {\n\n\t\tthis._mixer = mixer;\n\t\tthis._clip = clip;\n\t\tthis._localRoot = localRoot;\n\n\t\t/**\n\t\t * Defines how the animation is blended/combined when two or more animations\n\t\t * are simultaneously played.\n\t\t *\n\t\t * @type {(NormalAnimationBlendMode|AdditiveAnimationBlendMode)}\n\t\t */\n\t\tthis.blendMode = blendMode;\n\n\t\tconst tracks = clip.tracks,\n\t\t\tnTracks = tracks.length,\n\t\t\tinterpolants = new Array( nTracks );\n\n\t\tconst interpolantSettings = {\n\t\t\tendingStart: ZeroCurvatureEnding,\n\t\t\tendingEnd: ZeroCurvatureEnding\n\t\t};\n\n\t\tfor ( let i = 0; i !== nTracks; ++ i ) {\n\n\t\t\tconst interpolant = tracks[ i ].createInterpolant( null );\n\t\t\tinterpolants[ i ] = interpolant;\n\t\t\tinterpolant.settings = interpolantSettings;\n\n\t\t}\n\n\t\tthis._interpolantSettings = interpolantSettings;\n\n\t\tthis._interpolants = interpolants; // bound by the mixer\n\n\t\t// inside: PropertyMixer (managed by the mixer)\n\t\tthis._propertyBindings = new Array( nTracks );\n\n\t\tthis._cacheIndex = null; // for the memory manager\n\t\tthis._byClipCacheIndex = null; // for the memory manager\n\n\t\tthis._timeScaleInterpolant = null;\n\t\tthis._weightInterpolant = null;\n\n\t\t/**\n\t\t * The loop mode, set via {@link AnimationAction#setLoop}.\n\t\t *\n\t\t * @type {(LoopRepeat|LoopOnce|LoopPingPong)}\n\t\t * @default LoopRepeat\n\t\t */\n\t\tthis.loop = LoopRepeat;\n\t\tthis._loopCount = -1;\n\n\t\t// global mixer time when the action is to be started\n\t\t// it's set back to 'null' upon start of the action\n\t\tthis._startTime = null;\n\n\t\t/**\n\t\t * The local time of this action (in seconds, starting with `0`).\n\t\t *\n\t\t * The value gets clamped or wrapped to `[0,clip.duration]` (according to the\n\t\t * loop state).\n\t\t *\n\t\t * @type {number}\n\t\t * @default Infinity\n\t\t */\n\t\tthis.time = 0;\n\n\t\t/**\n\t\t * Scaling factor for the {@link AnimationAction#time}. A value of `0` causes the\n\t\t * animation to pause. Negative values cause the animation to play backwards.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.timeScale = 1;\n\t\tthis._effectiveTimeScale = 1;\n\n\t\t/**\n\t\t * The degree of influence of this action (in the interval `[0, 1]`). Values\n\t\t * between `0` (no impact) and `1` (full impact) can be used to blend between\n\t\t * several actions.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.weight = 1;\n\t\tthis._effectiveWeight = 1;\n\n\t\t/**\n\t\t * The number of repetitions of the performed clip over the course of this action.\n\t\t * Can be set via {@link AnimationAction#setLoop}.\n\t\t *\n\t\t * Setting this number has no effect if {@link AnimationAction#loop} is set to\n\t\t * `THREE:LoopOnce`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default Infinity\n\t\t */\n\t\tthis.repetitions = Infinity;\n\n\t\t/**\n\t\t * If set to `true`, the playback of the action is paused.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.paused = false;\n\n\t\t/**\n\t\t * If set to `false`, the action is disabled so it has no impact.\n\t\t *\n\t\t * When the action is re-enabled, the animation continues from its current\n\t\t * time (setting `enabled` to `false` doesn't reset the action).\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.enabled = true;\n\n\t\t/**\n\t\t * If set to true the animation will automatically be paused on its last frame.\n\t\t *\n\t\t * If set to false, {@link AnimationAction#enabled} will automatically be switched\n\t\t * to `false` when the last loop of the action has finished, so that this action has\n\t\t * no further impact.\n\t\t *\n\t\t * Note: This member has no impact if the action is interrupted (it\n\t\t * has only an effect if its last loop has really finished).\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.clampWhenFinished = false;\n\n\t\t/**\n\t\t * Enables smooth interpolation without separate clips for start, loop and end.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.zeroSlopeAtStart = true;\n\n\t\t/**\n\t\t * Enables smooth interpolation without separate clips for start, loop and end.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.zeroSlopeAtEnd = true;\n\n\t}\n\n\t/**\n\t * Starts the playback of the animation.\n\t *\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tplay() {\n\n\t\tthis._mixer._activateAction( this );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Stops the playback of the animation.\n\t *\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tstop() {\n\n\t\tthis._mixer._deactivateAction( this );\n\n\t\treturn this.reset();\n\n\t}\n\n\t/**\n\t * Resets the playback of the animation.\n\t *\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\treset() {\n\n\t\tthis.paused = false;\n\t\tthis.enabled = true;\n\n\t\tthis.time = 0; // restart clip\n\t\tthis._loopCount = -1;// forget previous loops\n\t\tthis._startTime = null;// forget scheduling\n\n\t\treturn this.stopFading().stopWarping();\n\n\t}\n\n\t/**\n\t * Returns `true` if the animation is running.\n\t *\n\t * @return {boolean} Whether the animation is running or not.\n\t */\n\tisRunning() {\n\n\t\treturn this.enabled && ! this.paused && this.timeScale !== 0 &&\n\t\t\tthis._startTime === null && this._mixer._isActiveAction( this );\n\n\t}\n\n\t/**\n\t * Returns `true` when {@link AnimationAction#play} has been called.\n\t *\n\t * @return {boolean} Whether the animation is scheduled or not.\n\t */\n\tisScheduled() {\n\n\t\treturn this._mixer._isActiveAction( this );\n\n\t}\n\n\t/**\n\t * Defines the time when the animation should start.\n\t *\n\t * @param {number} time - The start time in seconds.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tstartAt( time ) {\n\n\t\tthis._startTime = time;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Configures the loop settings for this action.\n\t *\n\t * @param {(LoopRepeat|LoopOnce|LoopPingPong)} mode - The loop mode.\n\t * @param {number} repetitions - The number of repetitions.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tsetLoop( mode, repetitions ) {\n\n\t\tthis.loop = mode;\n\t\tthis.repetitions = repetitions;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the effective weight of this action.\n\t *\n\t * An action has no effect and thus an effective weight of zero when the\n\t * action is disabled.\n\t *\n\t * @param {number} weight - The weight to set.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tsetEffectiveWeight( weight ) {\n\n\t\tthis.weight = weight;\n\n\t\t// note: same logic as when updated at runtime\n\t\tthis._effectiveWeight = this.enabled ? weight : 0;\n\n\t\treturn this.stopFading();\n\n\t}\n\n\t/**\n\t * Returns the effective weight of this action.\n\t *\n\t * @return {number} The effective weight.\n\t */\n\tgetEffectiveWeight() {\n\n\t\treturn this._effectiveWeight;\n\n\t}\n\n\t/**\n\t * Fades the animation in by increasing its weight gradually from `0` to `1`,\n\t * within the passed time interval.\n\t *\n\t * @param {number} duration - The duration of the fade.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tfadeIn( duration ) {\n\n\t\treturn this._scheduleFading( duration, 0, 1 );\n\n\t}\n\n\t/**\n\t * Fades the animation out by decreasing its weight gradually from `1` to `0`,\n\t * within the passed time interval.\n\t *\n\t * @param {number} duration - The duration of the fade.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tfadeOut( duration ) {\n\n\t\treturn this._scheduleFading( duration, 1, 0 );\n\n\t}\n\n\t/**\n\t * Causes this action to fade in and the given action to fade out,\n\t * within the passed time interval.\n\t *\n\t * @param {AnimationAction} fadeOutAction - The animation action to fade out.\n\t * @param {number} duration - The duration of the fade.\n\t * @param {boolean} [warp=false] - Whether warping should be used or not.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tcrossFadeFrom( fadeOutAction, duration, warp = false ) {\n\n\t\tfadeOutAction.fadeOut( duration );\n\t\tthis.fadeIn( duration );\n\n\t\tif ( warp === true ) {\n\n\t\t\tconst fadeInDuration = this._clip.duration,\n\t\t\t\tfadeOutDuration = fadeOutAction._clip.duration,\n\n\t\t\t\tstartEndRatio = fadeOutDuration / fadeInDuration,\n\t\t\t\tendStartRatio = fadeInDuration / fadeOutDuration;\n\n\t\t\tfadeOutAction.warp( 1.0, startEndRatio, duration );\n\t\t\tthis.warp( endStartRatio, 1.0, duration );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Causes this action to fade out and the given action to fade in,\n\t * within the passed time interval.\n\t *\n\t * @param {AnimationAction} fadeInAction - The animation action to fade in.\n\t * @param {number} duration - The duration of the fade.\n\t * @param {boolean} [warp=false] - Whether warping should be used or not.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tcrossFadeTo( fadeInAction, duration, warp = false ) {\n\n\t\treturn fadeInAction.crossFadeFrom( this, duration, warp );\n\n\t}\n\n\t/**\n\t * Stops any fading which is applied to this action.\n\t *\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tstopFading() {\n\n\t\tconst weightInterpolant = this._weightInterpolant;\n\n\t\tif ( weightInterpolant !== null ) {\n\n\t\t\tthis._weightInterpolant = null;\n\t\t\tthis._mixer._takeBackControlInterpolant( weightInterpolant );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the effective time scale of this action.\n\t *\n\t * An action has no effect and thus an effective time scale of zero when the\n\t * action is paused.\n\t *\n\t * @param {number} timeScale - The time scale to set.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tsetEffectiveTimeScale( timeScale ) {\n\n\t\tthis.timeScale = timeScale;\n\t\tthis._effectiveTimeScale = this.paused ? 0 : timeScale;\n\n\t\treturn this.stopWarping();\n\n\t}\n\n\t/**\n\t * Returns the effective time scale of this action.\n\t *\n\t * @return {number} The effective time scale.\n\t */\n\tgetEffectiveTimeScale() {\n\n\t\treturn this._effectiveTimeScale;\n\n\t}\n\n\t/**\n\t * Sets the duration for a single loop of this action.\n\t *\n\t * @param {number} duration - The duration to set.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tsetDuration( duration ) {\n\n\t\tthis.timeScale = this._clip.duration / duration;\n\n\t\treturn this.stopWarping();\n\n\t}\n\n\t/**\n\t * Synchronizes this action with the passed other action.\n\t *\n\t * @param {AnimationAction} action - The action to sync with.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tsyncWith( action ) {\n\n\t\tthis.time = action.time;\n\t\tthis.timeScale = action.timeScale;\n\n\t\treturn this.stopWarping();\n\n\t}\n\n\t/**\n\t * Decelerates this animation's speed to `0` within the passed time interval.\n\t *\n\t * @param {number} duration - The duration.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\thalt( duration ) {\n\n\t\treturn this.warp( this._effectiveTimeScale, 0, duration );\n\n\t}\n\n\t/**\n\t * Changes the playback speed, within the passed time interval, by modifying\n\t * {@link AnimationAction#timeScale} gradually from `startTimeScale` to\n\t * `endTimeScale`.\n\t *\n\t * @param {number} startTimeScale - The start time scale.\n\t * @param {number} endTimeScale - The end time scale.\n\t * @param {number} duration - The duration.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\twarp( startTimeScale, endTimeScale, duration ) {\n\n\t\tconst mixer = this._mixer,\n\t\t\tnow = mixer.time,\n\t\t\ttimeScale = this.timeScale;\n\n\t\tlet interpolant = this._timeScaleInterpolant;\n\n\t\tif ( interpolant === null ) {\n\n\t\t\tinterpolant = mixer._lendControlInterpolant();\n\t\t\tthis._timeScaleInterpolant = interpolant;\n\n\t\t}\n\n\t\tconst times = interpolant.parameterPositions,\n\t\t\tvalues = interpolant.sampleValues;\n\n\t\ttimes[ 0 ] = now;\n\t\ttimes[ 1 ] = now + duration;\n\n\t\tvalues[ 0 ] = startTimeScale / timeScale;\n\t\tvalues[ 1 ] = endTimeScale / timeScale;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Stops any scheduled warping which is applied to this action.\n\t *\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tstopWarping() {\n\n\t\tconst timeScaleInterpolant = this._timeScaleInterpolant;\n\n\t\tif ( timeScaleInterpolant !== null ) {\n\n\t\t\tthis._timeScaleInterpolant = null;\n\t\t\tthis._mixer._takeBackControlInterpolant( timeScaleInterpolant );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the animation mixer of this animation action.\n\t *\n\t * @return {AnimationMixer} The animation mixer.\n\t */\n\tgetMixer() {\n\n\t\treturn this._mixer;\n\n\t}\n\n\t/**\n\t * Returns the animation clip of this animation action.\n\t *\n\t * @return {AnimationClip} The animation clip.\n\t */\n\tgetClip() {\n\n\t\treturn this._clip;\n\n\t}\n\n\t/**\n\t * Returns the root object of this animation action.\n\t *\n\t * @return {Object3D} The root object.\n\t */\n\tgetRoot() {\n\n\t\treturn this._localRoot || this._mixer._root;\n\n\t}\n\n\t// Interna\n\n\t_update( time, deltaTime, timeDirection, accuIndex ) {\n\n\t\t// called by the mixer\n\n\t\tif ( ! this.enabled ) {\n\n\t\t\t// call ._updateWeight() to update ._effectiveWeight\n\n\t\t\tthis._updateWeight( time );\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst startTime = this._startTime;\n\n\t\tif ( startTime !== null ) {\n\n\t\t\t// check for scheduled start of action\n\n\t\t\tconst timeRunning = ( time - startTime ) * timeDirection;\n\t\t\tif ( timeRunning < 0 || timeDirection === 0 ) {\n\n\t\t\t\tdeltaTime = 0;\n\n\t\t\t} else {\n\n\n\t\t\t\tthis._startTime = null; // unschedule\n\t\t\t\tdeltaTime = timeDirection * timeRunning;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// apply time scale and advance time\n\n\t\tdeltaTime *= this._updateTimeScale( time );\n\t\tconst clipTime = this._updateTime( deltaTime );\n\n\t\t// note: _updateTime may disable the action resulting in\n\t\t// an effective weight of 0\n\n\t\tconst weight = this._updateWeight( time );\n\n\t\tif ( weight > 0 ) {\n\n\t\t\tconst interpolants = this._interpolants;\n\t\t\tconst propertyMixers = this._propertyBindings;\n\n\t\t\tswitch ( this.blendMode ) {\n\n\t\t\t\tcase AdditiveAnimationBlendMode:\n\n\t\t\t\t\tfor ( let j = 0, m = interpolants.length; j !== m; ++ j ) {\n\n\t\t\t\t\t\tinterpolants[ j ].evaluate( clipTime );\n\t\t\t\t\t\tpropertyMixers[ j ].accumulateAdditive( weight );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase NormalAnimationBlendMode:\n\t\t\t\tdefault:\n\n\t\t\t\t\tfor ( let j = 0, m = interpolants.length; j !== m; ++ j ) {\n\n\t\t\t\t\t\tinterpolants[ j ].evaluate( clipTime );\n\t\t\t\t\t\tpropertyMixers[ j ].accumulate( accuIndex, weight );\n\n\t\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_updateWeight( time ) {\n\n\t\tlet weight = 0;\n\n\t\tif ( this.enabled ) {\n\n\t\t\tweight = this.weight;\n\t\t\tconst interpolant = this._weightInterpolant;\n\n\t\t\tif ( interpolant !== null ) {\n\n\t\t\t\tconst interpolantValue = interpolant.evaluate( time )[ 0 ];\n\n\t\t\t\tweight *= interpolantValue;\n\n\t\t\t\tif ( time > interpolant.parameterPositions[ 1 ] ) {\n\n\t\t\t\t\tthis.stopFading();\n\n\t\t\t\t\tif ( interpolantValue === 0 ) {\n\n\t\t\t\t\t\t// faded out, disable\n\t\t\t\t\t\tthis.enabled = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis._effectiveWeight = weight;\n\t\treturn weight;\n\n\t}\n\n\t_updateTimeScale( time ) {\n\n\t\tlet timeScale = 0;\n\n\t\tif ( ! this.paused ) {\n\n\t\t\ttimeScale = this.timeScale;\n\n\t\t\tconst interpolant = this._timeScaleInterpolant;\n\n\t\t\tif ( interpolant !== null ) {\n\n\t\t\t\tconst interpolantValue = interpolant.evaluate( time )[ 0 ];\n\n\t\t\t\ttimeScale *= interpolantValue;\n\n\t\t\t\tif ( time > interpolant.parameterPositions[ 1 ] ) {\n\n\t\t\t\t\tthis.stopWarping();\n\n\t\t\t\t\tif ( timeScale === 0 ) {\n\n\t\t\t\t\t\t// motion has halted, pause\n\t\t\t\t\t\tthis.paused = true;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// warp done - apply final time scale\n\t\t\t\t\t\tthis.timeScale = timeScale;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis._effectiveTimeScale = timeScale;\n\t\treturn timeScale;\n\n\t}\n\n\t_updateTime( deltaTime ) {\n\n\t\tconst duration = this._clip.duration;\n\t\tconst loop = this.loop;\n\n\t\tlet time = this.time + deltaTime;\n\t\tlet loopCount = this._loopCount;\n\n\t\tconst pingPong = ( loop === LoopPingPong );\n\n\t\tif ( deltaTime === 0 ) {\n\n\t\t\tif ( loopCount === -1 ) return time;\n\n\t\t\treturn ( pingPong && ( loopCount & 1 ) === 1 ) ? duration - time : time;\n\n\t\t}\n\n\t\tif ( loop === LoopOnce ) {\n\n\t\t\tif ( loopCount === -1 ) {\n\n\t\t\t\t// just started\n\n\t\t\t\tthis._loopCount = 0;\n\t\t\t\tthis._setEndings( true, true, false );\n\n\t\t\t}\n\n\t\t\thandle_stop: {\n\n\t\t\t\tif ( time >= duration ) {\n\n\t\t\t\t\ttime = duration;\n\n\t\t\t\t} else if ( time < 0 ) {\n\n\t\t\t\t\ttime = 0;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis.time = time;\n\n\t\t\t\t\tbreak handle_stop;\n\n\t\t\t\t}\n\n\t\t\t\tif ( this.clampWhenFinished ) this.paused = true;\n\t\t\t\telse this.enabled = false;\n\n\t\t\t\tthis.time = time;\n\n\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\ttype: 'finished', action: this,\n\t\t\t\t\tdirection: deltaTime < 0 ? -1 : 1\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t} else { // repetitive Repeat or PingPong\n\n\t\t\tif ( loopCount === -1 ) {\n\n\t\t\t\t// just started\n\n\t\t\t\tif ( deltaTime >= 0 ) {\n\n\t\t\t\t\tloopCount = 0;\n\n\t\t\t\t\tthis._setEndings( true, this.repetitions === 0, pingPong );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// when looping in reverse direction, the initial\n\t\t\t\t\t// transition through zero counts as a repetition,\n\t\t\t\t\t// so leave loopCount at -1\n\n\t\t\t\t\tthis._setEndings( this.repetitions === 0, true, pingPong );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( time >= duration || time < 0 ) {\n\n\t\t\t\t// wrap around\n\n\t\t\t\tconst loopDelta = Math.floor( time / duration ); // signed\n\t\t\t\ttime -= duration * loopDelta;\n\n\t\t\t\tloopCount += Math.abs( loopDelta );\n\n\t\t\t\tconst pending = this.repetitions - loopCount;\n\n\t\t\t\tif ( pending <= 0 ) {\n\n\t\t\t\t\t// have to stop (switch state, clamp time, fire event)\n\n\t\t\t\t\tif ( this.clampWhenFinished ) this.paused = true;\n\t\t\t\t\telse this.enabled = false;\n\n\t\t\t\t\ttime = deltaTime > 0 ? duration : 0;\n\n\t\t\t\t\tthis.time = time;\n\n\t\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\t\ttype: 'finished', action: this,\n\t\t\t\t\t\tdirection: deltaTime > 0 ? 1 : -1\n\t\t\t\t\t} );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// keep running\n\n\t\t\t\t\tif ( pending === 1 ) {\n\n\t\t\t\t\t\t// entering the last round\n\n\t\t\t\t\t\tconst atStart = deltaTime < 0;\n\t\t\t\t\t\tthis._setEndings( atStart, ! atStart, pingPong );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tthis._setEndings( false, false, pingPong );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis._loopCount = loopCount;\n\n\t\t\t\t\tthis.time = time;\n\n\t\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\t\ttype: 'loop', action: this, loopDelta: loopDelta\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tthis.time = time;\n\n\t\t\t}\n\n\t\t\tif ( pingPong && ( loopCount & 1 ) === 1 ) {\n\n\t\t\t\t// invert time for the \"pong round\"\n\n\t\t\t\treturn duration - time;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn time;\n\n\t}\n\n\t_setEndings( atStart, atEnd, pingPong ) {\n\n\t\tconst settings = this._interpolantSettings;\n\n\t\tif ( pingPong ) {\n\n\t\t\tsettings.endingStart = ZeroSlopeEnding;\n\t\t\tsettings.endingEnd = ZeroSlopeEnding;\n\n\t\t} else {\n\n\t\t\t// assuming for LoopOnce atStart == atEnd == true\n\n\t\t\tif ( atStart ) {\n\n\t\t\t\tsettings.endingStart = this.zeroSlopeAtStart ? ZeroSlopeEnding : ZeroCurvatureEnding;\n\n\t\t\t} else {\n\n\t\t\t\tsettings.endingStart = WrapAroundEnding;\n\n\t\t\t}\n\n\t\t\tif ( atEnd ) {\n\n\t\t\t\tsettings.endingEnd = this.zeroSlopeAtEnd ? ZeroSlopeEnding : ZeroCurvatureEnding;\n\n\t\t\t} else {\n\n\t\t\t\tsettings.endingEnd \t = WrapAroundEnding;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_scheduleFading( duration, weightNow, weightThen ) {\n\n\t\tconst mixer = this._mixer, now = mixer.time;\n\t\tlet interpolant = this._weightInterpolant;\n\n\t\tif ( interpolant === null ) {\n\n\t\t\tinterpolant = mixer._lendControlInterpolant();\n\t\t\tthis._weightInterpolant = interpolant;\n\n\t\t}\n\n\t\tconst times = interpolant.parameterPositions,\n\t\t\tvalues = interpolant.sampleValues;\n\n\t\ttimes[ 0 ] = now;\n\t\tvalues[ 0 ] = weightNow;\n\t\ttimes[ 1 ] = now + duration;\n\t\tvalues[ 1 ] = weightThen;\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _controlInterpolantsResultBuffer = new Float32Array( 1 );\n\n/**\n * `AnimationMixer` is a player for animations on a particular object in\n * the scene. When multiple objects in the scene are animated independently,\n * one `AnimationMixer` may be used for each object.\n */\nclass AnimationMixer extends EventDispatcher {\n\n\t/**\n\t * Constructs a new animation mixer.\n\t *\n\t * @param {Object3D} root - The object whose animations shall be played by this mixer.\n\t */\n\tconstructor( root ) {\n\n\t\tsuper();\n\n\t\tthis._root = root;\n\t\tthis._initMemoryManager();\n\t\tthis._accuIndex = 0;\n\n\t\t/**\n\t\t * The global mixer time (in seconds; starting with `0` on the mixer's creation).\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.time = 0;\n\n\t\t/**\n\t\t * A scaling factor for the global time.\n\t\t *\n\t\t * Note: Setting this member to `0` and later back to `1` is a\n\t\t * possibility to pause/unpause all actions that are controlled by this\n\t\t * mixer.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.timeScale = 1.0;\n\n\t}\n\n\t_bindAction( action, prototypeAction ) {\n\n\t\tconst root = action._localRoot || this._root,\n\t\t\ttracks = action._clip.tracks,\n\t\t\tnTracks = tracks.length,\n\t\t\tbindings = action._propertyBindings,\n\t\t\tinterpolants = action._interpolants,\n\t\t\trootUuid = root.uuid,\n\t\t\tbindingsByRoot = this._bindingsByRootAndName;\n\n\t\tlet bindingsByName = bindingsByRoot[ rootUuid ];\n\n\t\tif ( bindingsByName === undefined ) {\n\n\t\t\tbindingsByName = {};\n\t\t\tbindingsByRoot[ rootUuid ] = bindingsByName;\n\n\t\t}\n\n\t\tfor ( let i = 0; i !== nTracks; ++ i ) {\n\n\t\t\tconst track = tracks[ i ],\n\t\t\t\ttrackName = track.name;\n\n\t\t\tlet binding = bindingsByName[ trackName ];\n\n\t\t\tif ( binding !== undefined ) {\n\n\t\t\t\t++ binding.referenceCount;\n\t\t\t\tbindings[ i ] = binding;\n\n\t\t\t} else {\n\n\t\t\t\tbinding = bindings[ i ];\n\n\t\t\t\tif ( binding !== undefined ) {\n\n\t\t\t\t\t// existing binding, make sure the cache knows\n\n\t\t\t\t\tif ( binding._cacheIndex === null ) {\n\n\t\t\t\t\t\t++ binding.referenceCount;\n\t\t\t\t\t\tthis._addInactiveBinding( binding, rootUuid, trackName );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tconst path = prototypeAction && prototypeAction.\n\t\t\t\t\t_propertyBindings[ i ].binding.parsedPath;\n\n\t\t\t\tbinding = new PropertyMixer(\n\t\t\t\t\tPropertyBinding.create( root, trackName, path ),\n\t\t\t\t\ttrack.ValueTypeName, track.getValueSize() );\n\n\t\t\t\t++ binding.referenceCount;\n\t\t\t\tthis._addInactiveBinding( binding, rootUuid, trackName );\n\n\t\t\t\tbindings[ i ] = binding;\n\n\t\t\t}\n\n\t\t\tinterpolants[ i ].resultBuffer = binding.buffer;\n\n\t\t}\n\n\t}\n\n\t_activateAction( action ) {\n\n\t\tif ( ! this._isActiveAction( action ) ) {\n\n\t\t\tif ( action._cacheIndex === null ) {\n\n\t\t\t\t// this action has been forgotten by the cache, but the user\n\t\t\t\t// appears to be still using it -> rebind\n\n\t\t\t\tconst rootUuid = ( action._localRoot || this._root ).uuid,\n\t\t\t\t\tclipUuid = action._clip.uuid,\n\t\t\t\t\tactionsForClip = this._actionsByClip[ clipUuid ];\n\n\t\t\t\tthis._bindAction( action,\n\t\t\t\t\tactionsForClip && actionsForClip.knownActions[ 0 ] );\n\n\t\t\t\tthis._addInactiveAction( action, clipUuid, rootUuid );\n\n\t\t\t}\n\n\t\t\tconst bindings = action._propertyBindings;\n\n\t\t\t// increment reference counts / sort out state\n\t\t\tfor ( let i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tconst binding = bindings[ i ];\n\n\t\t\t\tif ( binding.useCount ++ === 0 ) {\n\n\t\t\t\t\tthis._lendBinding( binding );\n\t\t\t\t\tbinding.saveOriginalState();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis._lendAction( action );\n\n\t\t}\n\n\t}\n\n\t_deactivateAction( action ) {\n\n\t\tif ( this._isActiveAction( action ) ) {\n\n\t\t\tconst bindings = action._propertyBindings;\n\n\t\t\t// decrement reference counts / sort out state\n\t\t\tfor ( let i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tconst binding = bindings[ i ];\n\n\t\t\t\tif ( -- binding.useCount === 0 ) {\n\n\t\t\t\t\tbinding.restoreOriginalState();\n\t\t\t\t\tthis._takeBackBinding( binding );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis._takeBackAction( action );\n\n\t\t}\n\n\t}\n\n\t// Memory manager\n\n\t_initMemoryManager() {\n\n\t\tthis._actions = []; // 'nActiveActions' followed by inactive ones\n\t\tthis._nActiveActions = 0;\n\n\t\tthis._actionsByClip = {};\n\t\t// inside:\n\t\t// {\n\t\t// \tknownActions: Array< AnimationAction > - used as prototypes\n\t\t// \tactionByRoot: AnimationAction - lookup\n\t\t// }\n\n\n\t\tthis._bindings = []; // 'nActiveBindings' followed by inactive ones\n\t\tthis._nActiveBindings = 0;\n\n\t\tthis._bindingsByRootAndName = {}; // inside: Map< name, PropertyMixer >\n\n\n\t\tthis._controlInterpolants = []; // same game as above\n\t\tthis._nActiveControlInterpolants = 0;\n\n\t\tconst scope = this;\n\n\t\tthis.stats = {\n\n\t\t\tactions: {\n\t\t\t\tget total() {\n\n\t\t\t\t\treturn scope._actions.length;\n\n\t\t\t\t},\n\t\t\t\tget inUse() {\n\n\t\t\t\t\treturn scope._nActiveActions;\n\n\t\t\t\t}\n\t\t\t},\n\t\t\tbindings: {\n\t\t\t\tget total() {\n\n\t\t\t\t\treturn scope._bindings.length;\n\n\t\t\t\t},\n\t\t\t\tget inUse() {\n\n\t\t\t\t\treturn scope._nActiveBindings;\n\n\t\t\t\t}\n\t\t\t},\n\t\t\tcontrolInterpolants: {\n\t\t\t\tget total() {\n\n\t\t\t\t\treturn scope._controlInterpolants.length;\n\n\t\t\t\t},\n\t\t\t\tget inUse() {\n\n\t\t\t\t\treturn scope._nActiveControlInterpolants;\n\n\t\t\t\t}\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t// Memory management for AnimationAction objects\n\n\t_isActiveAction( action ) {\n\n\t\tconst index = action._cacheIndex;\n\t\treturn index !== null && index < this._nActiveActions;\n\n\t}\n\n\t_addInactiveAction( action, clipUuid, rootUuid ) {\n\n\t\tconst actions = this._actions,\n\t\t\tactionsByClip = this._actionsByClip;\n\n\t\tlet actionsForClip = actionsByClip[ clipUuid ];\n\n\t\tif ( actionsForClip === undefined ) {\n\n\t\t\tactionsForClip = {\n\n\t\t\t\tknownActions: [ action ],\n\t\t\t\tactionByRoot: {}\n\n\t\t\t};\n\n\t\t\taction._byClipCacheIndex = 0;\n\n\t\t\tactionsByClip[ clipUuid ] = actionsForClip;\n\n\t\t} else {\n\n\t\t\tconst knownActions = actionsForClip.knownActions;\n\n\t\t\taction._byClipCacheIndex = knownActions.length;\n\t\t\tknownActions.push( action );\n\n\t\t}\n\n\t\taction._cacheIndex = actions.length;\n\t\tactions.push( action );\n\n\t\tactionsForClip.actionByRoot[ rootUuid ] = action;\n\n\t}\n\n\t_removeInactiveAction( action ) {\n\n\t\tconst actions = this._actions,\n\t\t\tlastInactiveAction = actions[ actions.length - 1 ],\n\t\t\tcacheIndex = action._cacheIndex;\n\n\t\tlastInactiveAction._cacheIndex = cacheIndex;\n\t\tactions[ cacheIndex ] = lastInactiveAction;\n\t\tactions.pop();\n\n\t\taction._cacheIndex = null;\n\n\n\t\tconst clipUuid = action._clip.uuid,\n\t\t\tactionsByClip = this._actionsByClip,\n\t\t\tactionsForClip = actionsByClip[ clipUuid ],\n\t\t\tknownActionsForClip = actionsForClip.knownActions,\n\n\t\t\tlastKnownAction =\n\t\t\t\tknownActionsForClip[ knownActionsForClip.length - 1 ],\n\n\t\t\tbyClipCacheIndex = action._byClipCacheIndex;\n\n\t\tlastKnownAction._byClipCacheIndex = byClipCacheIndex;\n\t\tknownActionsForClip[ byClipCacheIndex ] = lastKnownAction;\n\t\tknownActionsForClip.pop();\n\n\t\taction._byClipCacheIndex = null;\n\n\n\t\tconst actionByRoot = actionsForClip.actionByRoot,\n\t\t\trootUuid = ( action._localRoot || this._root ).uuid;\n\n\t\tdelete actionByRoot[ rootUuid ];\n\n\t\tif ( knownActionsForClip.length === 0 ) {\n\n\t\t\tdelete actionsByClip[ clipUuid ];\n\n\t\t}\n\n\t\tthis._removeInactiveBindingsForAction( action );\n\n\t}\n\n\t_removeInactiveBindingsForAction( action ) {\n\n\t\tconst bindings = action._propertyBindings;\n\n\t\tfor ( let i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\tconst binding = bindings[ i ];\n\n\t\t\tif ( -- binding.referenceCount === 0 ) {\n\n\t\t\t\tthis._removeInactiveBinding( binding );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_lendAction( action ) {\n\n\t\t// [ active actions |  inactive actions  ]\n\t\t// [  active actions >| inactive actions ]\n\t\t//                 s        a\n\t\t//                  <-swap->\n\t\t//                 a        s\n\n\t\tconst actions = this._actions,\n\t\t\tprevIndex = action._cacheIndex,\n\n\t\t\tlastActiveIndex = this._nActiveActions ++,\n\n\t\t\tfirstInactiveAction = actions[ lastActiveIndex ];\n\n\t\taction._cacheIndex = lastActiveIndex;\n\t\tactions[ lastActiveIndex ] = action;\n\n\t\tfirstInactiveAction._cacheIndex = prevIndex;\n\t\tactions[ prevIndex ] = firstInactiveAction;\n\n\t}\n\n\t_takeBackAction( action ) {\n\n\t\t// [  active actions  | inactive actions ]\n\t\t// [ active actions |< inactive actions  ]\n\t\t//        a        s\n\t\t//         <-swap->\n\t\t//        s        a\n\n\t\tconst actions = this._actions,\n\t\t\tprevIndex = action._cacheIndex,\n\n\t\t\tfirstInactiveIndex = -- this._nActiveActions,\n\n\t\t\tlastActiveAction = actions[ firstInactiveIndex ];\n\n\t\taction._cacheIndex = firstInactiveIndex;\n\t\tactions[ firstInactiveIndex ] = action;\n\n\t\tlastActiveAction._cacheIndex = prevIndex;\n\t\tactions[ prevIndex ] = lastActiveAction;\n\n\t}\n\n\t// Memory management for PropertyMixer objects\n\n\t_addInactiveBinding( binding, rootUuid, trackName ) {\n\n\t\tconst bindingsByRoot = this._bindingsByRootAndName,\n\t\t\tbindings = this._bindings;\n\n\t\tlet bindingByName = bindingsByRoot[ rootUuid ];\n\n\t\tif ( bindingByName === undefined ) {\n\n\t\t\tbindingByName = {};\n\t\t\tbindingsByRoot[ rootUuid ] = bindingByName;\n\n\t\t}\n\n\t\tbindingByName[ trackName ] = binding;\n\n\t\tbinding._cacheIndex = bindings.length;\n\t\tbindings.push( binding );\n\n\t}\n\n\t_removeInactiveBinding( binding ) {\n\n\t\tconst bindings = this._bindings,\n\t\t\tpropBinding = binding.binding,\n\t\t\trootUuid = propBinding.rootNode.uuid,\n\t\t\ttrackName = propBinding.path,\n\t\t\tbindingsByRoot = this._bindingsByRootAndName,\n\t\t\tbindingByName = bindingsByRoot[ rootUuid ],\n\n\t\t\tlastInactiveBinding = bindings[ bindings.length - 1 ],\n\t\t\tcacheIndex = binding._cacheIndex;\n\n\t\tlastInactiveBinding._cacheIndex = cacheIndex;\n\t\tbindings[ cacheIndex ] = lastInactiveBinding;\n\t\tbindings.pop();\n\n\t\tdelete bindingByName[ trackName ];\n\n\t\tif ( Object.keys( bindingByName ).length === 0 ) {\n\n\t\t\tdelete bindingsByRoot[ rootUuid ];\n\n\t\t}\n\n\t}\n\n\t_lendBinding( binding ) {\n\n\t\tconst bindings = this._bindings,\n\t\t\tprevIndex = binding._cacheIndex,\n\n\t\t\tlastActiveIndex = this._nActiveBindings ++,\n\n\t\t\tfirstInactiveBinding = bindings[ lastActiveIndex ];\n\n\t\tbinding._cacheIndex = lastActiveIndex;\n\t\tbindings[ lastActiveIndex ] = binding;\n\n\t\tfirstInactiveBinding._cacheIndex = prevIndex;\n\t\tbindings[ prevIndex ] = firstInactiveBinding;\n\n\t}\n\n\t_takeBackBinding( binding ) {\n\n\t\tconst bindings = this._bindings,\n\t\t\tprevIndex = binding._cacheIndex,\n\n\t\t\tfirstInactiveIndex = -- this._nActiveBindings,\n\n\t\t\tlastActiveBinding = bindings[ firstInactiveIndex ];\n\n\t\tbinding._cacheIndex = firstInactiveIndex;\n\t\tbindings[ firstInactiveIndex ] = binding;\n\n\t\tlastActiveBinding._cacheIndex = prevIndex;\n\t\tbindings[ prevIndex ] = lastActiveBinding;\n\n\t}\n\n\n\t// Memory management of Interpolants for weight and time scale\n\n\t_lendControlInterpolant() {\n\n\t\tconst interpolants = this._controlInterpolants,\n\t\t\tlastActiveIndex = this._nActiveControlInterpolants ++;\n\n\t\tlet interpolant = interpolants[ lastActiveIndex ];\n\n\t\tif ( interpolant === undefined ) {\n\n\t\t\tinterpolant = new LinearInterpolant(\n\t\t\t\tnew Float32Array( 2 ), new Float32Array( 2 ),\n\t\t\t\t1, _controlInterpolantsResultBuffer );\n\n\t\t\tinterpolant.__cacheIndex = lastActiveIndex;\n\t\t\tinterpolants[ lastActiveIndex ] = interpolant;\n\n\t\t}\n\n\t\treturn interpolant;\n\n\t}\n\n\t_takeBackControlInterpolant( interpolant ) {\n\n\t\tconst interpolants = this._controlInterpolants,\n\t\t\tprevIndex = interpolant.__cacheIndex,\n\n\t\t\tfirstInactiveIndex = -- this._nActiveControlInterpolants,\n\n\t\t\tlastActiveInterpolant = interpolants[ firstInactiveIndex ];\n\n\t\tinterpolant.__cacheIndex = firstInactiveIndex;\n\t\tinterpolants[ firstInactiveIndex ] = interpolant;\n\n\t\tlastActiveInterpolant.__cacheIndex = prevIndex;\n\t\tinterpolants[ prevIndex ] = lastActiveInterpolant;\n\n\t}\n\n\t/**\n\t * Returns an instance of {@link AnimationAction} for the passed clip.\n\t *\n\t * If an action fitting the clip and root parameters doesn't yet exist, it\n\t * will be created by this method. Calling this method several times with the\n\t * same clip and root parameters always returns the same action.\n\t *\n\t * @param {AnimationClip|string} clip - An animation clip or alternatively the name of the animation clip.\n\t * @param {Object3D} [optionalRoot] - An alternative root object.\n\t * @param {(NormalAnimationBlendMode|AdditiveAnimationBlendMode)} [blendMode] - The blend mode.\n\t * @return {?AnimationAction} The animation action.\n\t */\n\tclipAction( clip, optionalRoot, blendMode ) {\n\n\t\tconst root = optionalRoot || this._root,\n\t\t\trootUuid = root.uuid;\n\n\t\tlet clipObject = typeof clip === 'string' ? AnimationClip.findByName( root, clip ) : clip;\n\n\t\tconst clipUuid = clipObject !== null ? clipObject.uuid : clip;\n\n\t\tconst actionsForClip = this._actionsByClip[ clipUuid ];\n\t\tlet prototypeAction = null;\n\n\t\tif ( blendMode === undefined ) {\n\n\t\t\tif ( clipObject !== null ) {\n\n\t\t\t\tblendMode = clipObject.blendMode;\n\n\t\t\t} else {\n\n\t\t\t\tblendMode = NormalAnimationBlendMode;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\tconst existingAction = actionsForClip.actionByRoot[ rootUuid ];\n\n\t\t\tif ( existingAction !== undefined && existingAction.blendMode === blendMode ) {\n\n\t\t\t\treturn existingAction;\n\n\t\t\t}\n\n\t\t\t// we know the clip, so we don't have to parse all\n\t\t\t// the bindings again but can just copy\n\t\t\tprototypeAction = actionsForClip.knownActions[ 0 ];\n\n\t\t\t// also, take the clip from the prototype action\n\t\t\tif ( clipObject === null )\n\t\t\t\tclipObject = prototypeAction._clip;\n\n\t\t}\n\n\t\t// clip must be known when specified via string\n\t\tif ( clipObject === null ) return null;\n\n\t\t// allocate all resources required to run it\n\t\tconst newAction = new AnimationAction( this, clipObject, optionalRoot, blendMode );\n\n\t\tthis._bindAction( newAction, prototypeAction );\n\n\t\t// and make the action known to the memory manager\n\t\tthis._addInactiveAction( newAction, clipUuid, rootUuid );\n\n\t\treturn newAction;\n\n\t}\n\n\t/**\n\t * Returns an existing animation action for the passed clip.\n\t *\n\t * @param {AnimationClip|string} clip - An animation clip or alternatively the name of the animation clip.\n\t * @param {Object3D} [optionalRoot] - An alternative root object.\n\t * @return {?AnimationAction} The animation action. Returns `null` if no action was found.\n\t */\n\texistingAction( clip, optionalRoot ) {\n\n\t\tconst root = optionalRoot || this._root,\n\t\t\trootUuid = root.uuid,\n\n\t\t\tclipObject = typeof clip === 'string' ?\n\t\t\t\tAnimationClip.findByName( root, clip ) : clip,\n\n\t\t\tclipUuid = clipObject ? clipObject.uuid : clip,\n\n\t\t\tactionsForClip = this._actionsByClip[ clipUuid ];\n\n\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\treturn actionsForClip.actionByRoot[ rootUuid ] || null;\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\t/**\n\t * Deactivates all previously scheduled actions on this mixer.\n\t *\n\t * @return {AnimationMixer} A reference to this animation mixer.\n\t */\n\tstopAllAction() {\n\n\t\tconst actions = this._actions,\n\t\t\tnActions = this._nActiveActions;\n\n\t\tfor ( let i = nActions - 1; i >= 0; -- i ) {\n\n\t\t\tactions[ i ].stop();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Advances the global mixer time and updates the animation.\n\t *\n\t * This is usually done in the render loop by passing the delta\n\t * time from {@link Clock} or {@link Timer}.\n\t *\n\t * @param {number} deltaTime - The delta time in seconds.\n\t * @return {AnimationMixer} A reference to this animation mixer.\n\t */\n\tupdate( deltaTime ) {\n\n\t\tdeltaTime *= this.timeScale;\n\n\t\tconst actions = this._actions,\n\t\t\tnActions = this._nActiveActions,\n\n\t\t\ttime = this.time += deltaTime,\n\t\t\ttimeDirection = Math.sign( deltaTime ),\n\n\t\t\taccuIndex = this._accuIndex ^= 1;\n\n\t\t// run active actions\n\n\t\tfor ( let i = 0; i !== nActions; ++ i ) {\n\n\t\t\tconst action = actions[ i ];\n\n\t\t\taction._update( time, deltaTime, timeDirection, accuIndex );\n\n\t\t}\n\n\t\t// update scene graph\n\n\t\tconst bindings = this._bindings,\n\t\t\tnBindings = this._nActiveBindings;\n\n\t\tfor ( let i = 0; i !== nBindings; ++ i ) {\n\n\t\t\tbindings[ i ].apply( accuIndex );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the global mixer to a specific time and updates the animation accordingly.\n\t *\n\t * This is useful when you need to jump to an exact time in an animation. The\n\t * input parameter will be scaled by {@link AnimationMixer#timeScale}\n\t *\n\t * @param {number} time - The time to set in seconds.\n\t * @return {AnimationMixer} A reference to this animation mixer.\n\t */\n\tsetTime( time ) {\n\n\t\tthis.time = 0; // Zero out time attribute for AnimationMixer object;\n\t\tfor ( let i = 0; i < this._actions.length; i ++ ) {\n\n\t\t\tthis._actions[ i ].time = 0; // Zero out time attribute for all associated AnimationAction objects.\n\n\t\t}\n\n\t\treturn this.update( time ); // Update used to set exact time. Returns \"this\" AnimationMixer object.\n\n\t}\n\n\t/**\n\t * Returns this mixer's root object.\n\t *\n\t * @return {Object3D} The mixer's root object.\n\t */\n\tgetRoot() {\n\n\t\treturn this._root;\n\n\t}\n\n\t/**\n\t * Deallocates all memory resources for a clip. Before using this method make\n\t * sure to call {@link AnimationAction#stop} for all related actions.\n\t *\n\t * @param {AnimationClip} clip - The clip to uncache.\n\t */\n\tuncacheClip( clip ) {\n\n\t\tconst actions = this._actions,\n\t\t\tclipUuid = clip.uuid,\n\t\t\tactionsByClip = this._actionsByClip,\n\t\t\tactionsForClip = actionsByClip[ clipUuid ];\n\n\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\t// note: just calling _removeInactiveAction would mess up the\n\t\t\t// iteration state and also require updating the state we can\n\t\t\t// just throw away\n\n\t\t\tconst actionsToRemove = actionsForClip.knownActions;\n\n\t\t\tfor ( let i = 0, n = actionsToRemove.length; i !== n; ++ i ) {\n\n\t\t\t\tconst action = actionsToRemove[ i ];\n\n\t\t\t\tthis._deactivateAction( action );\n\n\t\t\t\tconst cacheIndex = action._cacheIndex,\n\t\t\t\t\tlastInactiveAction = actions[ actions.length - 1 ];\n\n\t\t\t\taction._cacheIndex = null;\n\t\t\t\taction._byClipCacheIndex = null;\n\n\t\t\t\tlastInactiveAction._cacheIndex = cacheIndex;\n\t\t\t\tactions[ cacheIndex ] = lastInactiveAction;\n\t\t\t\tactions.pop();\n\n\t\t\t\tthis._removeInactiveBindingsForAction( action );\n\n\t\t\t}\n\n\t\t\tdelete actionsByClip[ clipUuid ];\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Deallocates all memory resources for a root object. Before using this\n\t * method make sure to call {@link AnimationAction#stop} for all related\n\t * actions or alternatively {@link AnimationMixer#stopAllAction} when the\n\t * mixer operates on a single root.\n\t *\n\t * @param {Object3D} root - The root object to uncache.\n\t */\n\tuncacheRoot( root ) {\n\n\t\tconst rootUuid = root.uuid,\n\t\t\tactionsByClip = this._actionsByClip;\n\n\t\tfor ( const clipUuid in actionsByClip ) {\n\n\t\t\tconst actionByRoot = actionsByClip[ clipUuid ].actionByRoot,\n\t\t\t\taction = actionByRoot[ rootUuid ];\n\n\t\t\tif ( action !== undefined ) {\n\n\t\t\t\tthis._deactivateAction( action );\n\t\t\t\tthis._removeInactiveAction( action );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst bindingsByRoot = this._bindingsByRootAndName,\n\t\t\tbindingByName = bindingsByRoot[ rootUuid ];\n\n\t\tif ( bindingByName !== undefined ) {\n\n\t\t\tfor ( const trackName in bindingByName ) {\n\n\t\t\t\tconst binding = bindingByName[ trackName ];\n\t\t\t\tbinding.restoreOriginalState();\n\t\t\t\tthis._removeInactiveBinding( binding );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Deallocates all memory resources for an action. The action is identified by the\n\t * given clip and an optional root object. Before using this method make\n\t * sure to call {@link AnimationAction#stop} to deactivate the action.\n\t *\n\t * @param {AnimationClip|string} clip - An animation clip or alternatively the name of the animation clip.\n\t * @param {Object3D} [optionalRoot] - An alternative root object.\n\t */\n\tuncacheAction( clip, optionalRoot ) {\n\n\t\tconst action = this.existingAction( clip, optionalRoot );\n\n\t\tif ( action !== null ) {\n\n\t\t\tthis._deactivateAction( action );\n\t\t\tthis._removeInactiveAction( action );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * Represents a 3D render target.\n *\n * @augments RenderTarget\n */\nclass RenderTarget3D extends RenderTarget {\n\n\t/**\n\t * Constructs a new 3D render target.\n\t *\n\t * @param {number} [width=1] - The width of the render target.\n\t * @param {number} [height=1] - The height of the render target.\n\t * @param {number} [depth=1] - The height of the render target.\n\t * @param {RenderTarget~Options} [options] - The configuration object.\n\t */\n\tconstructor( width = 1, height = 1, depth = 1, options = {} ) {\n\n\t\tsuper( width, height, options );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isRenderTarget3D = true;\n\n\t\tthis.depth = depth;\n\n\t\t/**\n\t\t * Overwritten with a different texture type.\n\t\t *\n\t\t * @type {Data3DTexture}\n\t\t */\n\t\tthis.texture = new Data3DTexture( null, width, height, depth );\n\t\tthis._setTextureOptions( options );\n\n\t\tthis.texture.isRenderTargetTexture = true;\n\n\t}\n\n}\n\n/**\n * Represents a uniform which is a global shader variable. They are passed to shader programs.\n *\n * When declaring a uniform of a {@link ShaderMaterial}, it is declared by value or by object.\n * ```js\n * uniforms: {\n * \ttime: { value: 1.0 },\n * \tresolution: new Uniform( new Vector2() )\n * };\n * ```\n * Since this class can only be used in context of {@link ShaderMaterial}, it is only supported\n * in {@link WebGLRenderer}.\n */\nclass Uniform {\n\n\t/**\n\t * Constructs a new uniform.\n\t *\n\t * @param {any} value - The uniform value.\n\t */\n\tconstructor( value ) {\n\n\t\t/**\n\t\t * The uniform value.\n\t\t *\n\t\t * @type {any}\n\t\t */\n\t\tthis.value = value;\n\n\t}\n\n\t/**\n\t * Returns a new uniform with copied values from this instance.\n\t * If the value has a `clone()` method, the value is cloned as well.\n\t *\n\t * @return {Uniform} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new Uniform( this.value.clone === undefined ? this.value : this.value.clone() );\n\n\t}\n\n}\n\nlet _id = 0;\n\n/**\n * A class for managing multiple uniforms in a single group. The renderer will process\n * such a definition as a single UBO.\n *\n * Since this class can only be used in context of {@link ShaderMaterial}, it is only supported\n * in {@link WebGLRenderer}.\n *\n * @augments EventDispatcher\n */\nclass UniformsGroup extends EventDispatcher {\n\n\t/**\n\t * Constructs a new uniforms group.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isUniformsGroup = true;\n\n\t\t/**\n\t\t * The ID of the 3D object.\n\t\t *\n\t\t * @name UniformsGroup#id\n\t\t * @type {number}\n\t\t * @readonly\n\t\t */\n\t\tObject.defineProperty( this, 'id', { value: _id ++ } );\n\n\t\t/**\n\t\t * The name of the uniforms group.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\n\t\t/**\n\t\t * The buffer usage.\n\t\t *\n\t\t * @type {(StaticDrawUsage|DynamicDrawUsage|StreamDrawUsage|StaticReadUsage|DynamicReadUsage|StreamReadUsage|StaticCopyUsage|DynamicCopyUsage|StreamCopyUsage)}\n\t\t * @default StaticDrawUsage\n\t\t */\n\t\tthis.usage = StaticDrawUsage;\n\n\t\t/**\n\t\t * An array holding the uniforms.\n\t\t *\n\t\t * @type {Array<Uniform>}\n\t\t */\n\t\tthis.uniforms = [];\n\n\t}\n\n\t/**\n\t * Adds the given uniform to this uniforms group.\n\t *\n\t * @param {Uniform} uniform - The uniform to add.\n\t * @return {UniformsGroup} A reference to this uniforms group.\n\t */\n\tadd( uniform ) {\n\n\t\tthis.uniforms.push( uniform );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Removes the given uniform from this uniforms group.\n\t *\n\t * @param {Uniform} uniform - The uniform to remove.\n\t * @return {UniformsGroup} A reference to this uniforms group.\n\t */\n\tremove( uniform ) {\n\n\t\tconst index = this.uniforms.indexOf( uniform );\n\n\t\tif ( index !== -1 ) this.uniforms.splice( index, 1 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the name of this uniforms group.\n\t *\n\t * @param {string} name - The name to set.\n\t * @return {UniformsGroup} A reference to this uniforms group.\n\t */\n\tsetName( name ) {\n\n\t\tthis.name = name;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the usage of this uniforms group.\n\t *\n\t * @param {(StaticDrawUsage|DynamicDrawUsage|StreamDrawUsage|StaticReadUsage|DynamicReadUsage|StreamReadUsage|StaticCopyUsage|DynamicCopyUsage|StreamCopyUsage)} value - The usage to set.\n\t * @return {UniformsGroup} A reference to this uniforms group.\n\t */\n\tsetUsage( value ) {\n\n\t\tthis.usage = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t *\n\t * @fires Texture#dispose\n\t */\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n\t/**\n\t * Copies the values of the given uniforms group to this instance.\n\t *\n\t * @param {UniformsGroup} source - The uniforms group to copy.\n\t * @return {UniformsGroup} A reference to this uniforms group.\n\t */\n\tcopy( source ) {\n\n\t\tthis.name = source.name;\n\t\tthis.usage = source.usage;\n\n\t\tconst uniformsSource = source.uniforms;\n\n\t\tthis.uniforms.length = 0;\n\n\t\tfor ( let i = 0, l = uniformsSource.length; i < l; i ++ ) {\n\n\t\t\tconst uniforms = Array.isArray( uniformsSource[ i ] ) ? uniformsSource[ i ] : [ uniformsSource[ i ] ];\n\n\t\t\tfor ( let j = 0; j < uniforms.length; j ++ ) {\n\n\t\t\t\tthis.uniforms.push( uniforms[ j ].clone() );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new uniforms group with copied values from this instance.\n\t *\n\t * @return {UniformsGroup} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\n/**\n * An instanced version of an interleaved buffer.\n *\n * @augments InterleavedBuffer\n */\nclass InstancedInterleavedBuffer extends InterleavedBuffer {\n\n\t/**\n\t * Constructs a new instanced interleaved buffer.\n\t *\n\t * @param {TypedArray} array - A typed array with a shared buffer storing attribute data.\n\t * @param {number} stride - The number of typed-array elements per vertex.\n\t * @param {number} [meshPerAttribute=1] - Defines how often a value of this interleaved buffer should be repeated.\n\t */\n\tconstructor( array, stride, meshPerAttribute = 1 ) {\n\n\t\tsuper( array, stride );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isInstancedInterleavedBuffer = true;\n\n\t\t/**\n\t\t * Defines how often a value of this buffer attribute should be repeated,\n\t\t * see {@link InstancedBufferAttribute#meshPerAttribute}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.meshPerAttribute = meshPerAttribute;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.meshPerAttribute = source.meshPerAttribute;\n\n\t\treturn this;\n\n\t}\n\n\tclone( data ) {\n\n\t\tconst ib = super.clone( data );\n\n\t\tib.meshPerAttribute = this.meshPerAttribute;\n\n\t\treturn ib;\n\n\t}\n\n\ttoJSON( data ) {\n\n\t\tconst json = super.toJSON( data );\n\n\t\tjson.isInstancedInterleavedBuffer = true;\n\t\tjson.meshPerAttribute = this.meshPerAttribute;\n\n\t\treturn json;\n\n\t}\n\n}\n\n/**\n * An alternative version of a buffer attribute with more control over the VBO.\n *\n * The renderer does not construct a VBO for this kind of attribute. Instead, it uses\n * whatever VBO is passed in constructor and can later be altered via the `buffer` property.\n *\n * The most common use case for this class is when some kind of GPGPU calculation interferes\n * or even produces the VBOs in question.\n *\n * Notice that this class can only be used with {@link WebGLRenderer}.\n */\nclass GLBufferAttribute {\n\n\t/**\n\t * Constructs a new GL buffer attribute.\n\t *\n\t * @param {WebGLBuffer} buffer - The native WebGL buffer.\n\t * @param {number} type - The native data type (e.g. `gl.FLOAT`).\n\t * @param {number} itemSize - The item size.\n\t * @param {number} elementSize - The corresponding size (in bytes) for the given `type` parameter.\n\t * @param {number} count - The expected number of vertices in VBO.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( buffer, type, itemSize, elementSize, count, normalized = false ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isGLBufferAttribute = true;\n\n\t\t/**\n\t\t * The name of the buffer attribute.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\n\t\t/**\n\t\t * The native WebGL buffer.\n\t\t *\n\t\t * @type {WebGLBuffer}\n\t\t */\n\t\tthis.buffer = buffer;\n\n\t\t/**\n\t\t * The native data type.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.type = type;\n\n\t\t/**\n\t\t * The item size, see {@link BufferAttribute#itemSize}.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.itemSize = itemSize;\n\n\t\t/**\n\t\t * The corresponding size (in bytes) for the given `type` parameter.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.elementSize = elementSize;\n\n\t\t/**\n\t\t * The expected number of vertices in VBO.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.count = count;\n\n\t\t/**\n\t\t * Applies to integer data only. Indicates how the underlying data in the buffer maps to\n\t\t * the values in the GLSL code. For instance, if `buffer` contains data of `gl.UNSIGNED_SHORT`,\n\t\t * and `normalized` is `true`, the values `0 - +65535` in the buffer data will be mapped to\n\t\t * `0.0f - +1.0f` in the GLSL attribute. If `normalized` is `false`, the values will be converted\n\t\t * to floats unmodified, i.e. `65535` becomes `65535.0f`.\n\t\t *\n\t\t * @type {boolean}\n\t\t */\n\t\tthis.normalized = normalized;\n\n\t\t/**\n\t\t * A version number, incremented every time the `needsUpdate` is set to `true`.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.version = 0;\n\n\t}\n\n\t/**\n\t * Flag to indicate that this attribute has changed and should be re-sent to\n\t * the GPU. Set this to `true` when you modify the value of the array.\n\t *\n\t * @type {number}\n\t * @default false\n\t * @param {boolean} value\n\t */\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n\t/**\n\t * Sets the given native WebGL buffer.\n\t *\n\t * @param {WebGLBuffer} buffer - The buffer to set.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetBuffer( buffer ) {\n\n\t\tthis.buffer = buffer;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given native data type and element size.\n\t *\n\t * @param {number} type - The native data type (e.g. `gl.FLOAT`).\n\t * @param {number} elementSize - The corresponding size (in bytes) for the given `type` parameter.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetType( type, elementSize ) {\n\n\t\tthis.type = type;\n\t\tthis.elementSize = elementSize;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the item size.\n\t *\n\t * @param {number} itemSize - The item size.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetItemSize( itemSize ) {\n\n\t\tthis.itemSize = itemSize;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the count (the expected number of vertices in VBO).\n\t *\n\t * @param {number} count - The count.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetCount( count ) {\n\n\t\tthis.count = count;\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _matrix = /*@__PURE__*/ new Matrix4();\n\n/**\n * This class is designed to assist with raycasting. Raycasting is used for\n * mouse picking (working out what objects in the 3d space the mouse is over)\n * amongst other things.\n */\nclass Raycaster {\n\n\t/**\n\t * Constructs a new raycaster.\n\t *\n\t * @param {Vector3} origin - The origin vector where the ray casts from.\n\t * @param {Vector3} direction - The (normalized) direction vector that gives direction to the ray.\n\t * @param {number} [near=0] - All results returned are further away than near. Near can't be negative.\n\t * @param {number} [far=Infinity] - All results returned are closer than far. Far can't be lower than near.\n\t */\n\tconstructor( origin, direction, near = 0, far = Infinity ) {\n\n\t\t/**\n\t\t * The ray used for raycasting.\n\t\t *\n\t\t * @type {Ray}\n\t\t */\n\t\tthis.ray = new Ray( origin, direction );\n\n\t\t/**\n\t\t * All results returned are further away than near. Near can't be negative.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.near = near;\n\n\t\t/**\n\t\t * All results returned are further away than near. Near can't be negative.\n\t\t *\n\t\t * @type {number}\n\t\t * @default Infinity\n\t\t */\n\t\tthis.far = far;\n\n\t\t/**\n\t\t * The camera to use when raycasting against view-dependent objects such as\n\t\t * billboarded objects like sprites. This field can be set manually or\n\t\t * is set when calling `setFromCamera()`.\n\t\t *\n\t\t * @type {?Camera}\n\t\t * @default null\n\t\t */\n\t\tthis.camera = null;\n\n\t\t/**\n\t\t * Allows to selectively ignore 3D objects when performing intersection tests.\n\t\t * The following code example ensures that only 3D objects on layer `1` will be\n\t\t * honored by raycaster.\n\t\t * ```js\n\t\t * raycaster.layers.set( 1 );\n\t\t * object.layers.enable( 1 );\n\t\t * ```\n\t\t *\n\t\t * @type {Layers}\n\t\t */\n\t\tthis.layers = new Layers();\n\n\n\t\t/**\n\t\t * A parameter object that configures the raycasting. It has the structure:\n\t\t *\n\t\t * ```\n\t\t * {\n\t\t * \tMesh: {},\n\t\t * \tLine: { threshold: 1 },\n\t\t * \tLOD: {},\n\t\t * \tPoints: { threshold: 1 },\n\t\t * \tSprite: {}\n\t\t * }\n\t\t * ```\n\t\t * Where `threshold` is the precision of the raycaster when intersecting objects, in world units.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.params = {\n\t\t\tMesh: {},\n\t\t\tLine: { threshold: 1 },\n\t\t\tLOD: {},\n\t\t\tPoints: { threshold: 1 },\n\t\t\tSprite: {}\n\t\t};\n\n\t}\n\n\t/**\n\t * Updates the ray with a new origin and direction by copying the values from the arguments.\n\t *\n\t * @param {Vector3} origin - The origin vector where the ray casts from.\n\t * @param {Vector3} direction - The (normalized) direction vector that gives direction to the ray.\n\t */\n\tset( origin, direction ) {\n\n\t\t// direction is assumed to be normalized (for accurate distance calculations)\n\n\t\tthis.ray.set( origin, direction );\n\n\t}\n\n\t/**\n\t * Uses the given coordinates and camera to compute a new origin and direction for the internal ray.\n\t *\n\t * @param {Vector2} coords - 2D coordinates of the mouse, in normalized device coordinates (NDC).\n\t * X and Y components should be between `-1` and `1`.\n\t * @param {Camera} camera - The camera from which the ray should originate.\n\t */\n\tsetFromCamera( coords, camera ) {\n\n\t\tif ( camera.isPerspectiveCamera ) {\n\n\t\t\tthis.ray.origin.setFromMatrixPosition( camera.matrixWorld );\n\t\t\tthis.ray.direction.set( coords.x, coords.y, 0.5 ).unproject( camera ).sub( this.ray.origin ).normalize();\n\t\t\tthis.camera = camera;\n\n\t\t} else if ( camera.isOrthographicCamera ) {\n\n\t\t\tthis.ray.origin.set( coords.x, coords.y, ( camera.near + camera.far ) / ( camera.near - camera.far ) ).unproject( camera ); // set origin in plane of camera\n\t\t\tthis.ray.direction.set( 0, 0, -1 ).transformDirection( camera.matrixWorld );\n\t\t\tthis.camera = camera;\n\n\t\t} else {\n\n\t\t\terror( 'Raycaster: Unsupported camera type: ' + camera.type );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Uses the given WebXR controller to compute a new origin and direction for the internal ray.\n\t *\n\t * @param {WebXRController} controller - The controller to copy the position and direction from.\n\t * @return {Raycaster} A reference to this raycaster.\n\t */\n\tsetFromXRController( controller ) {\n\n\t\t_matrix.identity().extractRotation( controller.matrixWorld );\n\n\t\tthis.ray.origin.setFromMatrixPosition( controller.matrixWorld );\n\t\tthis.ray.direction.set( 0, 0, -1 ).applyMatrix4( _matrix );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The intersection point of a raycaster intersection test.\n\t * @typedef {Object} Raycaster~Intersection\n\t * @property {number} distance - The distance from the ray's origin to the intersection point.\n\t * @property {number} distanceToRay -  Some 3D objects e.g. {@link Points} provide the distance of the\n\t * intersection to the nearest point on the ray. For other objects it will be `undefined`.\n\t * @property {Vector3} point - The intersection point, in world coordinates.\n\t * @property {Object} face - The face that has been intersected.\n\t * @property {number} faceIndex - The face index.\n\t * @property {Object3D} object - The 3D object that has been intersected.\n\t * @property {Vector2} uv - U,V coordinates at point of intersection.\n\t * @property {Vector2} uv1 - Second set of U,V coordinates at point of intersection.\n\t * @property {Vector3} uv1 - Interpolated normal vector at point of intersection.\n\t * @property {number} instanceId - The index number of the instance where the ray\n\t * intersects the {@link InstancedMesh}.\n\t */\n\n\t/**\n\t * Checks all intersection between the ray and the object with or without the\n\t * descendants. Intersections are returned sorted by distance, closest first.\n\t *\n\t * `Raycaster` delegates to the `raycast()` method of the passed 3D object, when\n\t * evaluating whether the ray intersects the object or not. This allows meshes to respond\n\t * differently to ray casting than lines or points.\n\t *\n\t * Note that for meshes, faces must be pointed towards the origin of the ray in order\n\t * to be detected; intersections of the ray passing through the back of a face will not\n\t * be detected. To raycast against both faces of an object, you'll want to set  {@link Material#side}\n\t * to `THREE.DoubleSide`.\n\t *\n\t * @param {Object3D} object - The 3D object to check for intersection with the ray.\n\t * @param {boolean} [recursive=true] - If set to `true`, it also checks all descendants.\n\t * Otherwise it only checks intersection with the object.\n\t * @param {Array<Raycaster~Intersection>} [intersects=[]] The target array that holds the result of the method.\n\t * @return {Array<Raycaster~Intersection>} An array holding the intersection points.\n\t */\n\tintersectObject( object, recursive = true, intersects = [] ) {\n\n\t\tintersect( object, this, intersects, recursive );\n\n\t\tintersects.sort( ascSort );\n\n\t\treturn intersects;\n\n\t}\n\n\t/**\n\t * Checks all intersection between the ray and the objects with or without\n\t * the descendants. Intersections are returned sorted by distance, closest first.\n\t *\n\t * @param {Array<Object3D>} objects - The 3D objects to check for intersection with the ray.\n\t * @param {boolean} [recursive=true] - If set to `true`, it also checks all descendants.\n\t * Otherwise it only checks intersection with the object.\n\t * @param {Array<Raycaster~Intersection>} [intersects=[]] The target array that holds the result of the method.\n\t * @return {Array<Raycaster~Intersection>} An array holding the intersection points.\n\t */\n\tintersectObjects( objects, recursive = true, intersects = [] ) {\n\n\t\tfor ( let i = 0, l = objects.length; i < l; i ++ ) {\n\n\t\t\tintersect( objects[ i ], this, intersects, recursive );\n\n\t\t}\n\n\t\tintersects.sort( ascSort );\n\n\t\treturn intersects;\n\n\t}\n\n}\n\nfunction ascSort( a, b ) {\n\n\treturn a.distance - b.distance;\n\n}\n\nfunction intersect( object, raycaster, intersects, recursive ) {\n\n\tlet propagate = true;\n\n\tif ( object.layers.test( raycaster.layers ) ) {\n\n\t\tconst result = object.raycast( raycaster, intersects );\n\n\t\tif ( result === false ) propagate = false;\n\n\t}\n\n\tif ( propagate === true && recursive === true ) {\n\n\t\tconst children = object.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tintersect( children[ i ], raycaster, intersects, true );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * This class is an alternative to {@link Clock} with a different API design and behavior.\n * The goal is to avoid the conceptual flaws that became apparent in `Clock` over time.\n *\n * - `Timer` has an `update()` method that updates its internal state. That makes it possible to\n * call `getDelta()` and `getElapsed()` multiple times per simulation step without getting different values.\n * - The class can make use of the Page Visibility API to avoid large time delta values when the app\n * is inactive (e.g. tab switched or browser hidden).\n *\n * ```js\n * const timer = new Timer();\n * timer.connect( document ); // use Page Visibility API\n * ```\n */\nclass Timer {\n\n\t/**\n\t * Constructs a new timer.\n\t */\n\tconstructor() {\n\n\t\tthis._previousTime = 0;\n\t\tthis._currentTime = 0;\n\t\tthis._startTime = performance.now();\n\n\t\tthis._delta = 0;\n\t\tthis._elapsed = 0;\n\n\t\tthis._timescale = 1;\n\n\t\tthis._document = null;\n\t\tthis._pageVisibilityHandler = null;\n\n\t}\n\n\t/**\n\t * Connect the timer to the given document.Calling this method is not mandatory to\n\t * use the timer but enables the usage of the Page Visibility API to avoid large time\n\t * delta values.\n\t *\n\t * @param {Document} document - The document.\n\t */\n\tconnect( document ) {\n\n\t\tthis._document = document;\n\n\t\t// use Page Visibility API to avoid large time delta values\n\n\t\tif ( document.hidden !== undefined ) {\n\n\t\t\tthis._pageVisibilityHandler = handleVisibilityChange.bind( this );\n\n\t\t\tdocument.addEventListener( 'visibilitychange', this._pageVisibilityHandler, false );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Disconnects the timer from the DOM and also disables the usage of the Page Visibility API.\n\t */\n\tdisconnect() {\n\n\t\tif ( this._pageVisibilityHandler !== null ) {\n\n\t\t\tthis._document.removeEventListener( 'visibilitychange', this._pageVisibilityHandler );\n\t\t\tthis._pageVisibilityHandler = null;\n\n\t\t}\n\n\t\tthis._document = null;\n\n\t}\n\n\t/**\n\t * Returns the time delta in seconds.\n\t *\n\t * @return {number} The time delta in second.\n\t */\n\tgetDelta() {\n\n\t\treturn this._delta / 1000;\n\n\t}\n\n\t/**\n\t * Returns the elapsed time in seconds.\n\t *\n\t * @return {number} The elapsed time in second.\n\t */\n\tgetElapsed() {\n\n\t\treturn this._elapsed / 1000;\n\n\t}\n\n\t/**\n\t * Returns the timescale.\n\t *\n\t * @return {number} The timescale.\n\t */\n\tgetTimescale() {\n\n\t\treturn this._timescale;\n\n\t}\n\n\t/**\n\t * Sets the given timescale which scale the time delta computation\n\t * in `update()`.\n\t *\n\t * @param {number} timescale - The timescale to set.\n\t * @return {Timer} A reference to this timer.\n\t */\n\tsetTimescale( timescale ) {\n\n\t\tthis._timescale = timescale;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Resets the time computation for the current simulation step.\n\t *\n\t * @return {Timer} A reference to this timer.\n\t */\n\treset() {\n\n\t\tthis._currentTime = performance.now() - this._startTime;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Can be used to free all internal resources. Usually called when\n\t * the timer instance isn't required anymore.\n\t */\n\tdispose() {\n\n\t\tthis.disconnect();\n\n\t}\n\n\t/**\n\t * Updates the internal state of the timer. This method should be called\n\t * once per simulation step and before you perform queries against the timer\n\t * (e.g. via `getDelta()`).\n\t *\n\t * @param {number} timestamp - The current time in milliseconds. Can be obtained\n\t * from the `requestAnimationFrame` callback argument. If not provided, the current\n\t * time will be determined with `performance.now`.\n\t * @return {Timer} A reference to this timer.\n\t */\n\tupdate( timestamp ) {\n\n\t\tif ( this._pageVisibilityHandler !== null && this._document.hidden === true ) {\n\n\t\t\tthis._delta = 0;\n\n\t\t} else {\n\n\t\t\tthis._previousTime = this._currentTime;\n\t\t\tthis._currentTime = ( timestamp !== undefined ? timestamp : performance.now() ) - this._startTime;\n\n\t\t\tthis._delta = ( this._currentTime - this._previousTime ) * this._timescale;\n\t\t\tthis._elapsed += this._delta; // _elapsed is the accumulation of all previous deltas\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\nfunction handleVisibilityChange() {\n\n\tif ( this._document.hidden === false ) this.reset();\n\n}\n\n/**\n * This class can be used to represent points in 3D space as\n * [Spherical coordinates](https://en.wikipedia.org/wiki/Spherical_coordinate_system).\n */\nclass Spherical {\n\n\t/**\n\t * Constructs a new spherical.\n\t *\n\t * @param {number} [radius=1] - The radius, or the Euclidean distance (straight-line distance) from the point to the origin.\n\t * @param {number} [phi=0] - The polar angle in radians from the y (up) axis.\n\t * @param {number} [theta=0] - The equator/azimuthal angle in radians around the y (up) axis.\n\t */\n\tconstructor( radius = 1, phi = 0, theta = 0 ) {\n\n\t\t/**\n\t\t * The radius, or the Euclidean distance (straight-line distance) from the point to the origin.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.radius = radius;\n\n\t\t/**\n\t\t * The polar angle in radians from the y (up) axis.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.phi = phi;\n\n\t\t/**\n\t\t * The equator/azimuthal angle in radians around the y (up) axis.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.theta = theta;\n\n\t}\n\n\t/**\n\t * Sets the spherical components by copying the given values.\n\t *\n\t * @param {number} radius - The radius.\n\t * @param {number} phi - The polar angle.\n\t * @param {number} theta - The azimuthal angle.\n\t * @return {Spherical} A reference to this spherical.\n\t */\n\tset( radius, phi, theta ) {\n\n\t\tthis.radius = radius;\n\t\tthis.phi = phi;\n\t\tthis.theta = theta;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the values of the given spherical to this instance.\n\t *\n\t * @param {Spherical} other - The spherical to copy.\n\t * @return {Spherical} A reference to this spherical.\n\t */\n\tcopy( other ) {\n\n\t\tthis.radius = other.radius;\n\t\tthis.phi = other.phi;\n\t\tthis.theta = other.theta;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Restricts the polar angle [page:.phi phi] to be between `0.000001` and pi -\n\t * `0.000001`.\n\t *\n\t * @return {Spherical} A reference to this spherical.\n\t */\n\tmakeSafe() {\n\n\t\tconst EPS = 0.000001;\n\t\tthis.phi = clamp( this.phi, EPS, Math.PI - EPS );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the spherical components from the given vector which is assumed to hold\n\t * Cartesian coordinates.\n\t *\n\t * @param {Vector3} v - The vector to set.\n\t * @return {Spherical} A reference to this spherical.\n\t */\n\tsetFromVector3( v ) {\n\n\t\treturn this.setFromCartesianCoords( v.x, v.y, v.z );\n\n\t}\n\n\t/**\n\t * Sets the spherical components from the given Cartesian coordinates.\n\t *\n\t * @param {number} x - The x value.\n\t * @param {number} y - The y value.\n\t * @param {number} z - The z value.\n\t * @return {Spherical} A reference to this spherical.\n\t */\n\tsetFromCartesianCoords( x, y, z ) {\n\n\t\tthis.radius = Math.sqrt( x * x + y * y + z * z );\n\n\t\tif ( this.radius === 0 ) {\n\n\t\t\tthis.theta = 0;\n\t\t\tthis.phi = 0;\n\n\t\t} else {\n\n\t\t\tthis.theta = Math.atan2( x, z );\n\t\t\tthis.phi = Math.acos( clamp( y / this.radius, -1, 1 ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new spherical with copied values from this instance.\n\t *\n\t * @return {Spherical} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\n/**\n * This class can be used to represent points in 3D space as\n * [Cylindrical coordinates](https://en.wikipedia.org/wiki/Cylindrical_coordinate_system).\n */\nclass Cylindrical {\n\n\t/**\n\t * Constructs a new cylindrical.\n\t *\n\t * @param {number} [radius=1] - The distance from the origin to a point in the x-z plane.\n\t * @param {number} [theta=0] - A counterclockwise angle in the x-z plane measured in radians from the positive z-axis.\n\t * @param {number} [y=0] - The height above the x-z plane.\n\t */\n\tconstructor( radius = 1, theta = 0, y = 0 ) {\n\n\t\t/**\n\t\t * The distance from the origin to a point in the x-z plane.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.radius = radius;\n\n\t\t/**\n\t\t * A counterclockwise angle in the x-z plane measured in radians from the positive z-axis.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.theta = theta;\n\n\t\t/**\n\t\t * The height above the x-z plane.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.y = y;\n\n\t}\n\n\t/**\n\t * Sets the cylindrical components by copying the given values.\n\t *\n\t * @param {number} radius - The radius.\n\t * @param {number} theta - The theta angle.\n\t * @param {number} y - The height value.\n\t * @return {Cylindrical} A reference to this cylindrical.\n\t */\n\tset( radius, theta, y ) {\n\n\t\tthis.radius = radius;\n\t\tthis.theta = theta;\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the values of the given cylindrical to this instance.\n\t *\n\t * @param {Cylindrical} other - The cylindrical to copy.\n\t * @return {Cylindrical} A reference to this cylindrical.\n\t */\n\tcopy( other ) {\n\n\t\tthis.radius = other.radius;\n\t\tthis.theta = other.theta;\n\t\tthis.y = other.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the cylindrical components from the given vector which is assumed to hold\n\t * Cartesian coordinates.\n\t *\n\t * @param {Vector3} v - The vector to set.\n\t * @return {Cylindrical} A reference to this cylindrical.\n\t */\n\tsetFromVector3( v ) {\n\n\t\treturn this.setFromCartesianCoords( v.x, v.y, v.z );\n\n\t}\n\n\t/**\n\t * Sets the cylindrical components from the given Cartesian coordinates.\n\t *\n\t * @param {number} x - The x value.\n\t * @param {number} y - The x value.\n\t * @param {number} z - The x value.\n\t * @return {Cylindrical} A reference to this cylindrical.\n\t */\n\tsetFromCartesianCoords( x, y, z ) {\n\n\t\tthis.radius = Math.sqrt( x * x + z * z );\n\t\tthis.theta = Math.atan2( x, z );\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new cylindrical with copied values from this instance.\n\t *\n\t * @return {Cylindrical} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\n/**\n * Represents a 2x2 matrix.\n *\n * A Note on Row-Major and Column-Major Ordering:\n *\n * The constructor and {@link Matrix2#set} method take arguments in\n * [row-major](https://en.wikipedia.org/wiki/Row-_and_column-major_order#Column-major_order)\n * order, while internally they are stored in the {@link Matrix2#elements} array in column-major order.\n * This means that calling:\n * ```js\n * const m = new THREE.Matrix2();\n * m.set( 11, 12,\n *        21, 22 );\n * ```\n * will result in the elements array containing:\n * ```js\n * m.elements = [ 11, 21,\n *                12, 22 ];\n * ```\n * and internally all calculations are performed using column-major ordering.\n * However, as the actual ordering makes no difference mathematically and\n * most people are used to thinking about matrices in row-major order, the\n * three.js documentation shows matrices in row-major order. Just bear in\n * mind that if you are reading the source code, you'll have to take the\n * transpose of any matrices outlined here to make sense of the calculations.\n */\nclass Matrix2 {\n\n\t/**\n\t * Constructs a new 2x2 matrix. The arguments are supposed to be\n\t * in row-major order. If no arguments are provided, the constructor\n\t * initializes the matrix as an identity matrix.\n\t *\n\t * @param {number} [n11] - 1-1 matrix element.\n\t * @param {number} [n12] - 1-2 matrix element.\n\t * @param {number} [n21] - 2-1 matrix element.\n\t * @param {number} [n22] - 2-2 matrix element.\n\t */\n\tconstructor( n11, n12, n21, n22 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tMatrix2.prototype.isMatrix2 = true;\n\n\t\t/**\n\t\t * A column-major list of matrix values.\n\t\t *\n\t\t * @type {Array<number>}\n\t\t */\n\t\tthis.elements = [\n\t\t\t1, 0,\n\t\t\t0, 1,\n\t\t];\n\n\t\tif ( n11 !== undefined ) {\n\n\t\t\tthis.set( n11, n12, n21, n22 );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets this matrix to the 2x2 identity matrix.\n\t *\n\t * @return {Matrix2} A reference to this matrix.\n\t */\n\tidentity() {\n\n\t\tthis.set(\n\t\t\t1, 0,\n\t\t\t0, 1,\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the elements of the matrix from the given array.\n\t *\n\t * @param {Array<number>} array - The matrix elements in column-major order.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Matrix2} A reference to this matrix.\n\t */\n\tfromArray( array, offset = 0 ) {\n\n\t\tfor ( let i = 0; i < 4; i ++ ) {\n\n\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the elements of the matrix.The arguments are supposed to be\n\t * in row-major order.\n\t *\n\t * @param {number} n11 - 1-1 matrix element.\n\t * @param {number} n12 - 1-2 matrix element.\n\t * @param {number} n21 - 2-1 matrix element.\n\t * @param {number} n22 - 2-2 matrix element.\n\t * @return {Matrix2} A reference to this matrix.\n\t */\n\tset( n11, n12, n21, n22 ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] = n11; te[ 2 ] = n12;\n\t\tte[ 1 ] = n21; te[ 3 ] = n22;\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _vector$4 = /*@__PURE__*/ new Vector2();\n\n/**\n * Represents an axis-aligned bounding box (AABB) in 2D space.\n */\nclass Box2 {\n\n\t/**\n\t * Constructs a new bounding box.\n\t *\n\t * @param {Vector2} [min=(Infinity,Infinity)] - A vector representing the lower boundary of the box.\n\t * @param {Vector2} [max=(-Infinity,-Infinity)] - A vector representing the upper boundary of the box.\n\t */\n\tconstructor( min = new Vector2( + Infinity, + Infinity ), max = new Vector2( - Infinity, - Infinity ) ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isBox2 = true;\n\n\t\t/**\n\t\t * The lower boundary of the box.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.min = min;\n\n\t\t/**\n\t\t * The upper boundary of the box.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.max = max;\n\n\t}\n\n\t/**\n\t * Sets the lower and upper boundaries of this box.\n\t * Please note that this method only copies the values from the given objects.\n\t *\n\t * @param {Vector2} min - The lower boundary of the box.\n\t * @param {Vector2} max - The upper boundary of the box.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\tset( min, max ) {\n\n\t\tthis.min.copy( min );\n\t\tthis.max.copy( max );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the upper and lower bounds of this box so it encloses the position data\n\t * in the given array.\n\t *\n\t * @param {Array<Vector2>} points - An array holding 2D position data as instances of {@link Vector2}.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\tsetFromPoints( points ) {\n\n\t\tthis.makeEmpty();\n\n\t\tfor ( let i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\tthis.expandByPoint( points[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Centers this box on the given center vector and sets this box's width, height and\n\t * depth to the given size values.\n\t *\n\t * @param {Vector2} center - The center of the box.\n\t * @param {Vector2} size - The x and y dimensions of the box.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\tsetFromCenterAndSize( center, size ) {\n\n\t\tconst halfSize = _vector$4.copy( size ).multiplyScalar( 0.5 );\n\t\tthis.min.copy( center ).sub( halfSize );\n\t\tthis.max.copy( center ).add( halfSize );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new box with copied values from this instance.\n\t *\n\t * @return {Box2} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Copies the values of the given box to this instance.\n\t *\n\t * @param {Box2} box - The box to copy.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\tcopy( box ) {\n\n\t\tthis.min.copy( box.min );\n\t\tthis.max.copy( box.max );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Makes this box empty which means in encloses a zero space in 2D.\n\t *\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\tmakeEmpty() {\n\n\t\tthis.min.x = this.min.y = + Infinity;\n\t\tthis.max.x = this.max.y = - Infinity;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns true if this box includes zero points within its bounds.\n\t * Note that a box with equal lower and upper bounds still includes one\n\t * point, the one both bounds share.\n\t *\n\t * @return {boolean} Whether this box is empty or not.\n\t */\n\tisEmpty() {\n\n\t\t// this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes\n\n\t\treturn ( this.max.x < this.min.x ) || ( this.max.y < this.min.y );\n\n\t}\n\n\t/**\n\t * Returns the center point of this box.\n\t *\n\t * @param {Vector2} target - The target vector that is used to store the method's result.\n\t * @return {Vector2} The center point.\n\t */\n\tgetCenter( target ) {\n\n\t\treturn this.isEmpty() ? target.set( 0, 0 ) : target.addVectors( this.min, this.max ).multiplyScalar( 0.5 );\n\n\t}\n\n\t/**\n\t * Returns the dimensions of this box.\n\t *\n\t * @param {Vector2} target - The target vector that is used to store the method's result.\n\t * @return {Vector2} The size.\n\t */\n\tgetSize( target ) {\n\n\t\treturn this.isEmpty() ? target.set( 0, 0 ) : target.subVectors( this.max, this.min );\n\n\t}\n\n\t/**\n\t * Expands the boundaries of this box to include the given point.\n\t *\n\t * @param {Vector2} point - The point that should be included by the bounding box.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\texpandByPoint( point ) {\n\n\t\tthis.min.min( point );\n\t\tthis.max.max( point );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Expands this box equilaterally by the given vector. The width of this\n\t * box will be expanded by the x component of the vector in both\n\t * directions. The height of this box will be expanded by the y component of\n\t * the vector in both directions.\n\t *\n\t * @param {Vector2} vector - The vector that should expand the bounding box.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\texpandByVector( vector ) {\n\n\t\tthis.min.sub( vector );\n\t\tthis.max.add( vector );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Expands each dimension of the box by the given scalar. If negative, the\n\t * dimensions of the box will be contracted.\n\t *\n\t * @param {number} scalar - The scalar value that should expand the bounding box.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\texpandByScalar( scalar ) {\n\n\t\tthis.min.addScalar( - scalar );\n\t\tthis.max.addScalar( scalar );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if the given point lies within or on the boundaries of this box.\n\t *\n\t * @param {Vector2} point - The point to test.\n\t * @return {boolean} Whether the bounding box contains the given point or not.\n\t */\n\tcontainsPoint( point ) {\n\n\t\treturn point.x >= this.min.x && point.x <= this.max.x &&\n\t\t\tpoint.y >= this.min.y && point.y <= this.max.y;\n\n\t}\n\n\t/**\n\t * Returns `true` if this bounding box includes the entirety of the given bounding box.\n\t * If this box and the given one are identical, this function also returns `true`.\n\t *\n\t * @param {Box2} box - The bounding box to test.\n\t * @return {boolean} Whether the bounding box contains the given bounding box or not.\n\t */\n\tcontainsBox( box ) {\n\n\t\treturn this.min.x <= box.min.x && box.max.x <= this.max.x &&\n\t\t\tthis.min.y <= box.min.y && box.max.y <= this.max.y;\n\n\t}\n\n\t/**\n\t * Returns a point as a proportion of this box's width and height.\n\t *\n\t * @param {Vector2} point - A point in 2D space.\n\t * @param {Vector2} target - The target vector that is used to store the method's result.\n\t * @return {Vector2} A point as a proportion of this box's width and height.\n\t */\n\tgetParameter( point, target ) {\n\n\t\t// This can potentially have a divide by zero if the box\n\t\t// has a size dimension of 0.\n\n\t\treturn target.set(\n\t\t\t( point.x - this.min.x ) / ( this.max.x - this.min.x ),\n\t\t\t( point.y - this.min.y ) / ( this.max.y - this.min.y )\n\t\t);\n\n\t}\n\n\t/**\n\t * Returns `true` if the given bounding box intersects with this bounding box.\n\t *\n\t * @param {Box2} box - The bounding box to test.\n\t * @return {boolean} Whether the given bounding box intersects with this bounding box.\n\t */\n\tintersectsBox( box ) {\n\n\t\t// using 4 splitting planes to rule out intersections\n\n\t\treturn box.max.x >= this.min.x && box.min.x <= this.max.x &&\n\t\t\tbox.max.y >= this.min.y && box.min.y <= this.max.y;\n\n\t}\n\n\t/**\n\t * Clamps the given point within the bounds of this box.\n\t *\n\t * @param {Vector2} point - The point to clamp.\n\t * @param {Vector2} target - The target vector that is used to store the method's result.\n\t * @return {Vector2} The clamped point.\n\t */\n\tclampPoint( point, target ) {\n\n\t\treturn target.copy( point ).clamp( this.min, this.max );\n\n\t}\n\n\t/**\n\t * Returns the euclidean distance from any edge of this box to the specified point. If\n\t * the given point lies inside of this box, the distance will be `0`.\n\t *\n\t * @param {Vector2} point - The point to compute the distance to.\n\t * @return {number} The euclidean distance.\n\t */\n\tdistanceToPoint( point ) {\n\n\t\treturn this.clampPoint( point, _vector$4 ).distanceTo( point );\n\n\t}\n\n\t/**\n\t * Computes the intersection of this bounding box and the given one, setting the upper\n\t * bound of this box to the lesser of the two boxes' upper bounds and the\n\t * lower bound of this box to the greater of the two boxes' lower bounds. If\n\t * there's no overlap, makes this box empty.\n\t *\n\t * @param {Box2} box - The bounding box to intersect with.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\tintersect( box ) {\n\n\t\tthis.min.max( box.min );\n\t\tthis.max.min( box.max );\n\n\t\tif ( this.isEmpty() ) this.makeEmpty();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes the union of this box and another and the given one, setting the upper\n\t * bound of this box to the greater of the two boxes' upper bounds and the\n\t * lower bound of this box to the lesser of the two boxes' lower bounds.\n\t *\n\t * @param {Box2} box - The bounding box that will be unioned with this instance.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\tunion( box ) {\n\n\t\tthis.min.min( box.min );\n\t\tthis.max.max( box.max );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given offset to both the upper and lower bounds of this bounding box,\n\t * effectively moving it in 2D space.\n\t *\n\t * @param {Vector2} offset - The offset that should be used to translate the bounding box.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\ttranslate( offset ) {\n\n\t\tthis.min.add( offset );\n\t\tthis.max.add( offset );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this bounding box is equal with the given one.\n\t *\n\t * @param {Box2} box - The box to test for equality.\n\t * @return {boolean} Whether this bounding box is equal with the given one.\n\t */\n\tequals( box ) {\n\n\t\treturn box.min.equals( this.min ) && box.max.equals( this.max );\n\n\t}\n\n}\n\nconst _startP = /*@__PURE__*/ new Vector3();\nconst _startEnd = /*@__PURE__*/ new Vector3();\n\nconst _d1 = /*@__PURE__*/ new Vector3();\nconst _d2 = /*@__PURE__*/ new Vector3();\nconst _r = /*@__PURE__*/ new Vector3();\nconst _c1 = /*@__PURE__*/ new Vector3();\nconst _c2 = /*@__PURE__*/ new Vector3();\n\n/**\n * An analytical line segment in 3D space represented by a start and end point.\n */\nclass Line3 {\n\n\t/**\n\t * Constructs a new line segment.\n\t *\n\t * @param {Vector3} [start=(0,0,0)] - Start of the line segment.\n\t * @param {Vector3} [end=(0,0,0)] - End of the line segment.\n\t */\n\tconstructor( start = new Vector3(), end = new Vector3() ) {\n\n\t\t/**\n\t\t * Start of the line segment.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.start = start;\n\n\t\t/**\n\t\t * End of the line segment.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.end = end;\n\n\t}\n\n\t/**\n\t * Sets the start and end values by copying the given vectors.\n\t *\n\t * @param {Vector3} start - The start point.\n\t * @param {Vector3} end - The end point.\n\t * @return {Line3} A reference to this line segment.\n\t */\n\tset( start, end ) {\n\n\t\tthis.start.copy( start );\n\t\tthis.end.copy( end );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the values of the given line segment to this instance.\n\t *\n\t * @param {Line3} line - The line segment to copy.\n\t * @return {Line3} A reference to this line segment.\n\t */\n\tcopy( line ) {\n\n\t\tthis.start.copy( line.start );\n\t\tthis.end.copy( line.end );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the center of the line segment.\n\t *\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The center point.\n\t */\n\tgetCenter( target ) {\n\n\t\treturn target.addVectors( this.start, this.end ).multiplyScalar( 0.5 );\n\n\t}\n\n\t/**\n\t * Returns the delta vector of the line segment's start and end point.\n\t *\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The delta vector.\n\t */\n\tdelta( target ) {\n\n\t\treturn target.subVectors( this.end, this.start );\n\n\t}\n\n\t/**\n\t * Returns the squared Euclidean distance between the line' start and end point.\n\t *\n\t * @return {number} The squared Euclidean distance.\n\t */\n\tdistanceSq() {\n\n\t\treturn this.start.distanceToSquared( this.end );\n\n\t}\n\n\t/**\n\t * Returns the Euclidean distance between the line' start and end point.\n\t *\n\t * @return {number} The Euclidean distance.\n\t */\n\tdistance() {\n\n\t\treturn this.start.distanceTo( this.end );\n\n\t}\n\n\t/**\n\t * Returns a vector at a certain position along the line segment.\n\t *\n\t * @param {number} t - A value between `[0,1]` to represent a position along the line segment.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The delta vector.\n\t */\n\tat( t, target ) {\n\n\t\treturn this.delta( target ).multiplyScalar( t ).add( this.start );\n\n\t}\n\n\t/**\n\t * Returns a point parameter based on the closest point as projected on the line segment.\n\t *\n\t * @param {Vector3} point - The point for which to return a point parameter.\n\t * @param {boolean} clampToLine - Whether to clamp the result to the range `[0,1]` or not.\n\t * @return {number} The point parameter.\n\t */\n\tclosestPointToPointParameter( point, clampToLine ) {\n\n\t\t_startP.subVectors( point, this.start );\n\t\t_startEnd.subVectors( this.end, this.start );\n\n\t\tconst startEnd2 = _startEnd.dot( _startEnd );\n\t\tconst startEnd_startP = _startEnd.dot( _startP );\n\n\t\tlet t = startEnd_startP / startEnd2;\n\n\t\tif ( clampToLine ) {\n\n\t\t\tt = clamp( t, 0, 1 );\n\n\t\t}\n\n\t\treturn t;\n\n\t}\n\n\t/**\n\t * Returns the closest point on the line for a given point.\n\t *\n\t * @param {Vector3} point - The point to compute the closest point on the line for.\n\t * @param {boolean} clampToLine - Whether to clamp the result to the range `[0,1]` or not.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The closest point on the line.\n\t */\n\tclosestPointToPoint( point, clampToLine, target ) {\n\n\t\tconst t = this.closestPointToPointParameter( point, clampToLine );\n\n\t\treturn this.delta( target ).multiplyScalar( t ).add( this.start );\n\n\t}\n\n\t/**\n\t * Returns the closest squared distance between this line segment and the given one.\n\t *\n\t * @param {Line3} line - The line segment to compute the closest squared distance to.\n\t * @param {Vector3} [c1] - The closest point on this line segment.\n\t * @param {Vector3} [c2] - The closest point on the given line segment.\n\t * @return {number} The squared distance between this line segment and the given one.\n\t */\n\tdistanceSqToLine3( line, c1 = _c1, c2 = _c2 ) {\n\n\t\t// from Real-Time Collision Detection by Christer Ericson, chapter 5.1.9\n\n\t\t// Computes closest points C1 and C2 of S1(s)=P1+s*(Q1-P1) and\n\t\t// S2(t)=P2+t*(Q2-P2), returning s and t. Function result is squared\n\t\t// distance between between S1(s) and S2(t)\n\n\t\tconst EPSILON = 1e-8 * 1e-8; // must be squared since we compare squared length\n\t\tlet s, t;\n\n\t\tconst p1 = this.start;\n\t\tconst p2 = line.start;\n\t\tconst q1 = this.end;\n\t\tconst q2 = line.end;\n\n\t\t_d1.subVectors( q1, p1 ); // Direction vector of segment S1\n\t\t_d2.subVectors( q2, p2 ); // Direction vector of segment S2\n\t\t_r.subVectors( p1, p2 );\n\n\t\tconst a = _d1.dot( _d1 ); // Squared length of segment S1, always nonnegative\n\t\tconst e = _d2.dot( _d2 ); // Squared length of segment S2, always nonnegative\n\t\tconst f = _d2.dot( _r );\n\n\t\t// Check if either or both segments degenerate into points\n\n\t\tif ( a <= EPSILON && e <= EPSILON ) {\n\n\t\t\t// Both segments degenerate into points\n\n\t\t\tc1.copy( p1 );\n\t\t\tc2.copy( p2 );\n\n\t\t\tc1.sub( c2 );\n\n\t\t\treturn c1.dot( c1 );\n\n\t\t}\n\n\t\tif ( a <= EPSILON ) {\n\n\t\t\t// First segment degenerates into a point\n\n\t\t\ts = 0;\n\t\t\tt = f / e; // s = 0 => t = (b*s + f) / e = f / e\n\t\t\tt = clamp( t, 0, 1 );\n\n\n\t\t} else {\n\n\t\t\tconst c = _d1.dot( _r );\n\n\t\t\tif ( e <= EPSILON ) {\n\n\t\t\t\t// Second segment degenerates into a point\n\n\t\t\t\tt = 0;\n\t\t\t\ts = clamp( - c / a, 0, 1 ); // t = 0 => s = (b*t - c) / a = -c / a\n\n\t\t\t} else {\n\n\t\t\t\t// The general nondegenerate case starts here\n\n\t\t\t\tconst b = _d1.dot( _d2 );\n\t\t\t\tconst denom = a * e - b * b; // Always nonnegative\n\n\t\t\t\t// If segments not parallel, compute closest point on L1 to L2 and\n\t\t\t\t// clamp to segment S1. Else pick arbitrary s (here 0)\n\n\t\t\t\tif ( denom !== 0 ) {\n\n\t\t\t\t\ts = clamp( ( b * f - c * e ) / denom, 0, 1 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\ts = 0;\n\n\t\t\t\t}\n\n\t\t\t\t// Compute point on L2 closest to S1(s) using\n\t\t\t\t// t = Dot((P1 + D1*s) - P2,D2) / Dot(D2,D2) = (b*s + f) / e\n\n\t\t\t\tt = ( b * s + f ) / e;\n\n\t\t\t\t// If t in [0,1] done. Else clamp t, recompute s for the new value\n\t\t\t\t// of t using s = Dot((P2 + D2*t) - P1,D1) / Dot(D1,D1)= (t*b - c) / a\n\t\t\t\t// and clamp s to [0, 1]\n\n\t\t\t\tif ( t < 0 ) {\n\n\t\t\t\t\tt = 0.;\n\t\t\t\t\ts = clamp( - c / a, 0, 1 );\n\n\t\t\t\t} else if ( t > 1 ) {\n\n\t\t\t\t\tt = 1;\n\t\t\t\t\ts = clamp( ( b - c ) / a, 0, 1 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tc1.copy( p1 ).add( _d1.multiplyScalar( s ) );\n\t\tc2.copy( p2 ).add( _d2.multiplyScalar( t ) );\n\n\t\tc1.sub( c2 );\n\n\t\treturn c1.dot( c1 );\n\n\t}\n\n\t/**\n\t * Applies a 4x4 transformation matrix to this line segment.\n\t *\n\t * @param {Matrix4} matrix - The transformation matrix.\n\t * @return {Line3} A reference to this line segment.\n\t */\n\tapplyMatrix4( matrix ) {\n\n\t\tthis.start.applyMatrix4( matrix );\n\t\tthis.end.applyMatrix4( matrix );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this line segment is equal with the given one.\n\t *\n\t * @param {Line3} line - The line segment to test for equality.\n\t * @return {boolean} Whether this line segment is equal with the given one.\n\t */\n\tequals( line ) {\n\n\t\treturn line.start.equals( this.start ) && line.end.equals( this.end );\n\n\t}\n\n\t/**\n\t * Returns a new line segment with copied values from this instance.\n\t *\n\t * @return {Line3} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nconst _vector$3 = /*@__PURE__*/ new Vector3();\n\n/**\n * This displays a cone shaped helper object for a {@link SpotLight}.\n *\n * ```js\n * const spotLight = new THREE.SpotLight( 0xffffff );\n * spotLight.position.set( 10, 10, 10 );\n * scene.add( spotLight );\n *\n * const spotLightHelper = new THREE.SpotLightHelper( spotLight );\n * scene.add( spotLightHelper );\n * ```\n *\n * @augments Object3D\n */\nclass SpotLightHelper extends Object3D {\n\n\t/**\n\t * Constructs a new spot light helper.\n\t *\n\t * @param {HemisphereLight} light - The light to be visualized.\n\t * @param {number|Color|string} [color] - The helper's color. If not set, the helper will take\n\t * the color of the light.\n\t */\n\tconstructor( light, color ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The light being visualized.\n\t\t *\n\t\t * @type {SpotLight}\n\t\t */\n\t\tthis.light = light;\n\n\t\tthis.matrixAutoUpdate = false;\n\n\t\t/**\n\t\t * The color parameter passed in the constructor.\n\t\t * If not set, the helper will take the color of the light.\n\t\t *\n\t\t * @type {number|Color|string}\n\t\t */\n\t\tthis.color = color;\n\n\t\tthis.type = 'SpotLightHelper';\n\n\t\tconst geometry = new BufferGeometry();\n\n\t\tconst positions = [\n\t\t\t0, 0, 0, \t0, 0, 1,\n\t\t\t0, 0, 0, \t1, 0, 1,\n\t\t\t0, 0, 0,\t-1, 0, 1,\n\t\t\t0, 0, 0, \t0, 1, 1,\n\t\t\t0, 0, 0, \t0, -1, 1\n\t\t];\n\n\t\tfor ( let i = 0, j = 1, l = 32; i < l; i ++, j ++ ) {\n\n\t\t\tconst p1 = ( i / l ) * Math.PI * 2;\n\t\t\tconst p2 = ( j / l ) * Math.PI * 2;\n\n\t\t\tpositions.push(\n\t\t\t\tMath.cos( p1 ), Math.sin( p1 ), 1,\n\t\t\t\tMath.cos( p2 ), Math.sin( p2 ), 1\n\t\t\t);\n\n\t\t}\n\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { fog: false, toneMapped: false } );\n\n\t\tthis.cone = new LineSegments( geometry, material );\n\t\tthis.add( this.cone );\n\n\t\tthis.update();\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.cone.geometry.dispose();\n\t\tthis.cone.material.dispose();\n\n\t}\n\n\t/**\n\t * Updates the helper to match the position and direction of the\n\t * light being visualized.\n\t */\n\tupdate() {\n\n\t\tthis.light.updateWorldMatrix( true, false );\n\t\tthis.light.target.updateWorldMatrix( true, false );\n\n\t\t// update the local matrix based on the parent and light target transforms\n\t\tif ( this.parent ) {\n\n\t\t\tthis.parent.updateWorldMatrix( true );\n\n\t\t\tthis.matrix\n\t\t\t\t.copy( this.parent.matrixWorld )\n\t\t\t\t.invert()\n\t\t\t\t.multiply( this.light.matrixWorld );\n\n\t\t} else {\n\n\t\t\tthis.matrix.copy( this.light.matrixWorld );\n\n\t\t}\n\n\t\tthis.matrixWorld.copy( this.light.matrixWorld );\n\n\t\tconst coneLength = this.light.distance ? this.light.distance : 1000;\n\t\tconst coneWidth = coneLength * Math.tan( this.light.angle );\n\n\t\tthis.cone.scale.set( coneWidth, coneWidth, coneLength );\n\n\t\t_vector$3.setFromMatrixPosition( this.light.target.matrixWorld );\n\n\t\tthis.cone.lookAt( _vector$3 );\n\n\t\tif ( this.color !== undefined ) {\n\n\t\t\tthis.cone.material.color.set( this.color );\n\n\t\t} else {\n\n\t\t\tthis.cone.material.color.copy( this.light.color );\n\n\t\t}\n\n\t}\n\n}\n\nconst _vector$2 = /*@__PURE__*/ new Vector3();\nconst _boneMatrix = /*@__PURE__*/ new Matrix4();\nconst _matrixWorldInv = /*@__PURE__*/ new Matrix4();\n\n/**\n * A helper object to assist with visualizing a {@link Skeleton}.\n *\n * ```js\n * const helper = new THREE.SkeletonHelper( skinnedMesh );\n * scene.add( helper );\n * ```\n *\n * @augments LineSegments\n */\nclass SkeletonHelper extends LineSegments {\n\n\t/**\n\t * Constructs a new skeleton helper.\n\t *\n\t * @param {Object3D} object -  Usually an instance of {@link SkinnedMesh}. However, any 3D object\n\t * can be used if it represents a hierarchy of bones (see {@link Bone}).\n\t */\n\tconstructor( object ) {\n\n\t\tconst bones = getBoneList( object );\n\n\t\tconst geometry = new BufferGeometry();\n\n\t\tconst vertices = [];\n\t\tconst colors = [];\n\n\t\tfor ( let i = 0; i < bones.length; i ++ ) {\n\n\t\t\tconst bone = bones[ i ];\n\n\t\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\t\tvertices.push( 0, 0, 0 );\n\t\t\t\tvertices.push( 0, 0, 0 );\n\t\t\t\tcolors.push( 0, 0, 0 );\n\t\t\t\tcolors.push( 0, 0, 0 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { vertexColors: true, depthTest: false, depthWrite: false, toneMapped: false, transparent: true } );\n\n\t\tsuper( geometry, material );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSkeletonHelper = true;\n\n\t\tthis.type = 'SkeletonHelper';\n\n\t\t/**\n\t\t * The object being visualized.\n\t\t *\n\t\t * @type {Object3D}\n\t\t */\n\t\tthis.root = object;\n\n\t\t/**\n\t\t * The list of bones that the helper visualizes.\n\t\t *\n\t\t * @type {Array<Bone>}\n\t\t */\n\t\tthis.bones = bones;\n\n\t\tthis.matrix = object.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\t// colors\n\n\t\tconst color1 = new Color( 0x0000ff );\n\t\tconst color2 = new Color( 0x00ff00 );\n\n\t\tthis.setColors( color1, color2 );\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tconst bones = this.bones;\n\n\t\tconst geometry = this.geometry;\n\t\tconst position = geometry.getAttribute( 'position' );\n\n\t\t_matrixWorldInv.copy( this.root.matrixWorld ).invert();\n\n\t\tfor ( let i = 0, j = 0; i < bones.length; i ++ ) {\n\n\t\t\tconst bone = bones[ i ];\n\n\t\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\t\t_boneMatrix.multiplyMatrices( _matrixWorldInv, bone.matrixWorld );\n\t\t\t\t_vector$2.setFromMatrixPosition( _boneMatrix );\n\t\t\t\tposition.setXYZ( j, _vector$2.x, _vector$2.y, _vector$2.z );\n\n\t\t\t\t_boneMatrix.multiplyMatrices( _matrixWorldInv, bone.parent.matrixWorld );\n\t\t\t\t_vector$2.setFromMatrixPosition( _boneMatrix );\n\t\t\t\tposition.setXYZ( j + 1, _vector$2.x, _vector$2.y, _vector$2.z );\n\n\t\t\t\tj += 2;\n\n\t\t\t}\n\n\t\t}\n\n\t\tgeometry.getAttribute( 'position' ).needsUpdate = true;\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t}\n\n\t/**\n\t * Defines the colors of the helper.\n\t *\n\t * @param {Color} color1 - The first line color for each bone.\n\t * @param {Color} color2 - The second line color for each bone.\n\t * @return {SkeletonHelper} A reference to this helper.\n\t */\n\tsetColors( color1, color2 ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst colorAttribute = geometry.getAttribute( 'color' );\n\n\t\tfor ( let i = 0; i < colorAttribute.count; i += 2 ) {\n\n\t\t\tcolorAttribute.setXYZ( i, color1.r, color1.g, color1.b );\n\t\t\tcolorAttribute.setXYZ( i + 1, color2.r, color2.g, color2.b );\n\n\t\t}\n\n\t\tcolorAttribute.needsUpdate = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\n\nfunction getBoneList( object ) {\n\n\tconst boneList = [];\n\n\tif ( object.isBone === true ) {\n\n\t\tboneList.push( object );\n\n\t}\n\n\tfor ( let i = 0; i < object.children.length; i ++ ) {\n\n\t\tboneList.push( ...getBoneList( object.children[ i ] ) );\n\n\t}\n\n\treturn boneList;\n\n}\n\n/**\n * This displays a helper object consisting of a spherical mesh for\n * visualizing an instance of {@link PointLight}.\n *\n * ```js\n * const pointLight = new THREE.PointLight( 0xff0000, 1, 100 );\n * pointLight.position.set( 10, 10, 10 );\n * scene.add( pointLight );\n *\n * const sphereSize = 1;\n * const pointLightHelper = new THREE.PointLightHelper( pointLight, sphereSize );\n * scene.add( pointLightHelper );\n * ```\n *\n * @augments Mesh\n */\nclass PointLightHelper extends Mesh {\n\n\t/**\n\t * Constructs a new point light helper.\n\t *\n\t * @param {PointLight} light - The light to be visualized.\n\t * @param {number} [sphereSize=1] - The size of the sphere helper.\n\t * @param {number|Color|string} [color] - The helper's color. If not set, the helper will take\n\t * the color of the light.\n\t */\n\tconstructor( light, sphereSize, color ) {\n\n\t\tconst geometry = new SphereGeometry( sphereSize, 4, 2 );\n\t\tconst material = new MeshBasicMaterial( { wireframe: true, fog: false, toneMapped: false } );\n\n\t\tsuper( geometry, material );\n\n\t\t/**\n\t\t * The light being visualized.\n\t\t *\n\t\t * @type {HemisphereLight}\n\t\t */\n\t\tthis.light = light;\n\n\t\t/**\n\t\t * The color parameter passed in the constructor.\n\t\t * If not set, the helper will take the color of the light.\n\t\t *\n\t\t * @type {number|Color|string}\n\t\t */\n\t\tthis.color = color;\n\n\t\tthis.type = 'PointLightHelper';\n\n\t\tthis.matrix = this.light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.update();\n\n\n\t\t/*\n\t// TODO: delete this comment?\n\tconst distanceGeometry = new THREE.IcosahedronGeometry( 1, 2 );\n\tconst distanceMaterial = new THREE.MeshBasicMaterial( { color: hexColor, fog: false, wireframe: true, opacity: 0.1, transparent: true } );\n\n\tthis.lightSphere = new THREE.Mesh( bulbGeometry, bulbMaterial );\n\tthis.lightDistance = new THREE.Mesh( distanceGeometry, distanceMaterial );\n\n\tconst d = light.distance;\n\n\tif ( d === 0.0 ) {\n\n\t\tthis.lightDistance.visible = false;\n\n\t} else {\n\n\t\tthis.lightDistance.scale.set( d, d, d );\n\n\t}\n\n\tthis.add( this.lightDistance );\n\t*/\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n\t/**\n\t * Updates the helper to match the position of the\n\t * light being visualized.\n\t */\n\tupdate() {\n\n\t\tthis.light.updateWorldMatrix( true, false );\n\n\t\tif ( this.color !== undefined ) {\n\n\t\t\tthis.material.color.set( this.color );\n\n\t\t} else {\n\n\t\t\tthis.material.color.copy( this.light.color );\n\n\t\t}\n\n\t\t/*\n\t\tconst d = this.light.distance;\n\n\t\tif ( d === 0.0 ) {\n\n\t\t\tthis.lightDistance.visible = false;\n\n\t\t} else {\n\n\t\t\tthis.lightDistance.visible = true;\n\t\t\tthis.lightDistance.scale.set( d, d, d );\n\n\t\t}\n\t\t*/\n\n\t}\n\n}\n\nconst _vector$1 = /*@__PURE__*/ new Vector3();\nconst _color1 = /*@__PURE__*/ new Color();\nconst _color2 = /*@__PURE__*/ new Color();\n\n/**\n * Creates a visual aid consisting of a spherical mesh for a\n * given {@link HemisphereLight}.\n *\n * ```js\n * const light = new THREE.HemisphereLight( 0xffffbb, 0x080820, 1 );\n * const helper = new THREE.HemisphereLightHelper( light, 5 );\n * scene.add( helper );\n * ```\n *\n * @augments Object3D\n */\nclass HemisphereLightHelper extends Object3D {\n\n\t/**\n\t * Constructs a new hemisphere light helper.\n\t *\n\t * @param {HemisphereLight} light - The light to be visualized.\n\t * @param {number} [size=1] - The size of the mesh used to visualize the light.\n\t * @param {number|Color|string} [color] - The helper's color. If not set, the helper will take\n\t * the color of the light.\n\t */\n\tconstructor( light, size, color ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The light being visualized.\n\t\t *\n\t\t * @type {HemisphereLight}\n\t\t */\n\t\tthis.light = light;\n\n\t\tthis.matrix = light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\t/**\n\t\t * The color parameter passed in the constructor.\n\t\t * If not set, the helper will take the color of the light.\n\t\t *\n\t\t * @type {number|Color|string}\n\t\t */\n\t\tthis.color = color;\n\n\t\tthis.type = 'HemisphereLightHelper';\n\n\t\tconst geometry = new OctahedronGeometry( size );\n\t\tgeometry.rotateY( Math.PI * 0.5 );\n\n\t\tthis.material = new MeshBasicMaterial( { wireframe: true, fog: false, toneMapped: false } );\n\t\tif ( this.color === undefined ) this.material.vertexColors = true;\n\n\t\tconst position = geometry.getAttribute( 'position' );\n\t\tconst colors = new Float32Array( position.count * 3 );\n\n\t\tgeometry.setAttribute( 'color', new BufferAttribute( colors, 3 ) );\n\n\t\tthis.add( new Mesh( geometry, this.material ) );\n\n\t\tthis.update();\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.children[ 0 ].geometry.dispose();\n\t\tthis.children[ 0 ].material.dispose();\n\n\t}\n\n\t/**\n\t * Updates the helper to match the position and direction of the\n\t * light being visualized.\n\t */\n\tupdate() {\n\n\t\tconst mesh = this.children[ 0 ];\n\n\t\tif ( this.color !== undefined ) {\n\n\t\t\tthis.material.color.set( this.color );\n\n\t\t} else {\n\n\t\t\tconst colors = mesh.geometry.getAttribute( 'color' );\n\n\t\t\t_color1.copy( this.light.color );\n\t\t\t_color2.copy( this.light.groundColor );\n\n\t\t\tfor ( let i = 0, l = colors.count; i < l; i ++ ) {\n\n\t\t\t\tconst color = ( i < ( l / 2 ) ) ? _color1 : _color2;\n\n\t\t\t\tcolors.setXYZ( i, color.r, color.g, color.b );\n\n\t\t\t}\n\n\t\t\tcolors.needsUpdate = true;\n\n\t\t}\n\n\t\tthis.light.updateWorldMatrix( true, false );\n\n\t\tmesh.lookAt( _vector$1.setFromMatrixPosition( this.light.matrixWorld ).negate() );\n\n\t}\n\n}\n\n/**\n * The helper is an object to define grids. Grids are two-dimensional\n * arrays of lines.\n *\n * ```js\n * const size = 10;\n * const divisions = 10;\n *\n * const gridHelper = new THREE.GridHelper( size, divisions );\n * scene.add( gridHelper );\n * ```\n *\n * @augments LineSegments\n */\nclass GridHelper extends LineSegments {\n\n\t/**\n\t * Constructs a new grid helper.\n\t *\n\t * @param {number} [size=10] - The size of the grid.\n\t * @param {number} [divisions=10] - The number of divisions across the grid.\n\t * @param {number|Color|string} [color1=0x444444] - The color of the center line.\n\t * @param {number|Color|string} [color2=0x888888] - The color of the lines of the grid.\n\t */\n\tconstructor( size = 10, divisions = 10, color1 = 0x444444, color2 = 0x888888 ) {\n\n\t\tcolor1 = new Color( color1 );\n\t\tcolor2 = new Color( color2 );\n\n\t\tconst center = divisions / 2;\n\t\tconst step = size / divisions;\n\t\tconst halfSize = size / 2;\n\n\t\tconst vertices = [], colors = [];\n\n\t\tfor ( let i = 0, j = 0, k = - halfSize; i <= divisions; i ++, k += step ) {\n\n\t\t\tvertices.push( - halfSize, 0, k, halfSize, 0, k );\n\t\t\tvertices.push( k, 0, - halfSize, k, 0, halfSize );\n\n\t\t\tconst color = i === center ? color1 : color2;\n\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\n\t\t}\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { vertexColors: true, toneMapped: false } );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.type = 'GridHelper';\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\n/**\n * This helper is an object to define polar grids. Grids are\n * two-dimensional arrays of lines.\n *\n * ```js\n * const radius = 10;\n * const sectors = 16;\n * const rings = 8;\n * const divisions = 64;\n *\n * const helper = new THREE.PolarGridHelper( radius, sectors, rings, divisions );\n * scene.add( helper );\n * ```\n *\n * @augments LineSegments\n */\nclass PolarGridHelper extends LineSegments {\n\n\t/**\n\t * Constructs a new polar grid helper.\n\t *\n\t * @param {number} [radius=10] - The radius of the polar grid. This can be any positive number.\n\t * @param {number} [sectors=16] - The number of sectors the grid will be divided into. This can be any positive integer.\n\t * @param {number} [rings=16] - The number of rings. This can be any positive integer.\n\t * @param {number} [divisions=64] - The number of line segments used for each circle. This can be any positive integer.\n\t * @param {number|Color|string} [color1=0x444444] - The first color used for grid elements.\n\t * @param {number|Color|string} [color2=0x888888] -  The second color used for grid elements.\n\t */\n\tconstructor( radius = 10, sectors = 16, rings = 8, divisions = 64, color1 = 0x444444, color2 = 0x888888 ) {\n\n\t\tcolor1 = new Color( color1 );\n\t\tcolor2 = new Color( color2 );\n\n\t\tconst vertices = [];\n\t\tconst colors = [];\n\n\t\t// create the sectors\n\n\t\tif ( sectors > 1 ) {\n\n\t\t\tfor ( let i = 0; i < sectors; i ++ ) {\n\n\t\t\t\tconst v = ( i / sectors ) * ( Math.PI * 2 );\n\n\t\t\t\tconst x = Math.sin( v ) * radius;\n\t\t\t\tconst z = Math.cos( v ) * radius;\n\n\t\t\t\tvertices.push( 0, 0, 0 );\n\t\t\t\tvertices.push( x, 0, z );\n\n\t\t\t\tconst color = ( i & 1 ) ? color1 : color2;\n\n\t\t\t\tcolors.push( color.r, color.g, color.b );\n\t\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// create the rings\n\n\t\tfor ( let i = 0; i < rings; i ++ ) {\n\n\t\t\tconst color = ( i & 1 ) ? color1 : color2;\n\n\t\t\tconst r = radius - ( radius / rings * i );\n\n\t\t\tfor ( let j = 0; j < divisions; j ++ ) {\n\n\t\t\t\t// first vertex\n\n\t\t\t\tlet v = ( j / divisions ) * ( Math.PI * 2 );\n\n\t\t\t\tlet x = Math.sin( v ) * r;\n\t\t\t\tlet z = Math.cos( v ) * r;\n\n\t\t\t\tvertices.push( x, 0, z );\n\t\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t\t\t// second vertex\n\n\t\t\t\tv = ( ( j + 1 ) / divisions ) * ( Math.PI * 2 );\n\n\t\t\t\tx = Math.sin( v ) * r;\n\t\t\t\tz = Math.cos( v ) * r;\n\n\t\t\t\tvertices.push( x, 0, z );\n\t\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { vertexColors: true, toneMapped: false } );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.type = 'PolarGridHelper';\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\nconst _v1 = /*@__PURE__*/ new Vector3();\nconst _v2 = /*@__PURE__*/ new Vector3();\nconst _v3 = /*@__PURE__*/ new Vector3();\n\n/**\n * Helper object to assist with visualizing a {@link DirectionalLight}'s\n * effect on the scene. This consists of plane and a line representing the\n * light's position and direction.\n *\n * ```js\n * const light = new THREE.DirectionalLight( 0xFFFFFF );\n * scene.add( light );\n *\n * const helper = new THREE.DirectionalLightHelper( light, 5 );\n * scene.add( helper );\n * ```\n *\n * @augments Object3D\n */\nclass DirectionalLightHelper extends Object3D {\n\n\t/**\n\t * Constructs a new directional light helper.\n\t *\n\t * @param {DirectionalLight} light - The light to be visualized.\n\t * @param {number} [size=1] - The dimensions of the plane.\n\t * @param {number|Color|string} [color] - The helper's color. If not set, the helper will take\n\t * the color of the light.\n\t */\n\tconstructor( light, size, color ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The light being visualized.\n\t\t *\n\t\t * @type {DirectionalLight}\n\t\t */\n\t\tthis.light = light;\n\n\t\tthis.matrix = light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\t/**\n\t\t * The color parameter passed in the constructor.\n\t\t * If not set, the helper will take the color of the light.\n\t\t *\n\t\t * @type {number|Color|string}\n\t\t */\n\t\tthis.color = color;\n\n\t\tthis.type = 'DirectionalLightHelper';\n\n\t\tif ( size === undefined ) size = 1;\n\n\t\tlet geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( [\n\t\t\t- size, size, 0,\n\t\t\tsize, size, 0,\n\t\t\tsize, - size, 0,\n\t\t\t- size, - size, 0,\n\t\t\t- size, size, 0\n\t\t], 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { fog: false, toneMapped: false } );\n\n\t\t/**\n\t\t * Contains the line showing the location of the directional light.\n\t\t *\n\t\t * @type {Line}\n\t\t */\n\t\tthis.lightPlane = new Line( geometry, material );\n\t\tthis.add( this.lightPlane );\n\n\t\tgeometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 0, 1 ], 3 ) );\n\n\t\t/**\n\t\t * Represents the target line of the directional light.\n\t\t *\n\t\t * @type {Line}\n\t\t */\n\t\tthis.targetLine = new Line( geometry, material );\n\t\tthis.add( this.targetLine );\n\n\t\tthis.update();\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.lightPlane.geometry.dispose();\n\t\tthis.lightPlane.material.dispose();\n\t\tthis.targetLine.geometry.dispose();\n\t\tthis.targetLine.material.dispose();\n\n\t}\n\n\t/**\n\t * Updates the helper to match the position and direction of the\n\t * light being visualized.\n\t */\n\tupdate() {\n\n\t\tthis.light.updateWorldMatrix( true, false );\n\t\tthis.light.target.updateWorldMatrix( true, false );\n\n\t\t_v1.setFromMatrixPosition( this.light.matrixWorld );\n\t\t_v2.setFromMatrixPosition( this.light.target.matrixWorld );\n\t\t_v3.subVectors( _v2, _v1 );\n\n\t\tthis.lightPlane.lookAt( _v2 );\n\n\t\tif ( this.color !== undefined ) {\n\n\t\t\tthis.lightPlane.material.color.set( this.color );\n\t\t\tthis.targetLine.material.color.set( this.color );\n\n\t\t} else {\n\n\t\t\tthis.lightPlane.material.color.copy( this.light.color );\n\t\t\tthis.targetLine.material.color.copy( this.light.color );\n\n\t\t}\n\n\t\tthis.targetLine.lookAt( _v2 );\n\t\tthis.targetLine.scale.z = _v3.length();\n\n\t}\n\n}\n\nconst _vector = /*@__PURE__*/ new Vector3();\nconst _camera = /*@__PURE__*/ new Camera();\n\n/**\n * This helps with visualizing what a camera contains in its frustum. It\n * visualizes the frustum of a camera using a line segments.\n *\n * Based on frustum visualization in [lightgl.js shadowmap example](https://github.com/evanw/lightgl.js/blob/master/tests/shadowmap.html).\n *\n * `CameraHelper` must be a child of the scene.\n *\n * ```js\n * const camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 1000 );\n * const helper = new THREE.CameraHelper( camera );\n * scene.add( helper );\n * ```\n *\n * @augments LineSegments\n */\nclass CameraHelper extends LineSegments {\n\n\t/**\n\t * Constructs a new arrow helper.\n\t *\n\t * @param {Camera} camera - The camera to visualize.\n\t */\n\tconstructor( camera ) {\n\n\t\tconst geometry = new BufferGeometry();\n\t\tconst material = new LineBasicMaterial( { color: 0xffffff, vertexColors: true, toneMapped: false } );\n\n\t\tconst vertices = [];\n\t\tconst colors = [];\n\n\t\tconst pointMap = {};\n\n\t\t// near\n\n\t\taddLine( 'n1', 'n2' );\n\t\taddLine( 'n2', 'n4' );\n\t\taddLine( 'n4', 'n3' );\n\t\taddLine( 'n3', 'n1' );\n\n\t\t// far\n\n\t\taddLine( 'f1', 'f2' );\n\t\taddLine( 'f2', 'f4' );\n\t\taddLine( 'f4', 'f3' );\n\t\taddLine( 'f3', 'f1' );\n\n\t\t// sides\n\n\t\taddLine( 'n1', 'f1' );\n\t\taddLine( 'n2', 'f2' );\n\t\taddLine( 'n3', 'f3' );\n\t\taddLine( 'n4', 'f4' );\n\n\t\t// cone\n\n\t\taddLine( 'p', 'n1' );\n\t\taddLine( 'p', 'n2' );\n\t\taddLine( 'p', 'n3' );\n\t\taddLine( 'p', 'n4' );\n\n\t\t// up\n\n\t\taddLine( 'u1', 'u2' );\n\t\taddLine( 'u2', 'u3' );\n\t\taddLine( 'u3', 'u1' );\n\n\t\t// target\n\n\t\taddLine( 'c', 't' );\n\t\taddLine( 'p', 'c' );\n\n\t\t// cross\n\n\t\taddLine( 'cn1', 'cn2' );\n\t\taddLine( 'cn3', 'cn4' );\n\n\t\taddLine( 'cf1', 'cf2' );\n\t\taddLine( 'cf3', 'cf4' );\n\n\t\tfunction addLine( a, b ) {\n\n\t\t\taddPoint( a );\n\t\t\taddPoint( b );\n\n\t\t}\n\n\t\tfunction addPoint( id ) {\n\n\t\t\tvertices.push( 0, 0, 0 );\n\t\t\tcolors.push( 0, 0, 0 );\n\n\t\t\tif ( pointMap[ id ] === undefined ) {\n\n\t\t\t\tpointMap[ id ] = [];\n\n\t\t\t}\n\n\t\t\tpointMap[ id ].push( ( vertices.length / 3 ) - 1 );\n\n\t\t}\n\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.type = 'CameraHelper';\n\n\t\t/**\n\t\t * The camera being visualized.\n\t\t *\n\t\t * @type {Camera}\n\t\t */\n\t\tthis.camera = camera;\n\t\tif ( this.camera.updateProjectionMatrix ) this.camera.updateProjectionMatrix();\n\n\t\tthis.matrix = camera.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\t/**\n\t\t * This contains the points used to visualize the camera.\n\t\t *\n\t\t * @type {Object<string,Array<number>>}\n\t\t */\n\t\tthis.pointMap = pointMap;\n\n\t\tthis.update();\n\n\t\t// colors\n\n\t\tconst colorFrustum = new Color( 0xffaa00 );\n\t\tconst colorCone = new Color( 0xff0000 );\n\t\tconst colorUp = new Color( 0x00aaff );\n\t\tconst colorTarget = new Color( 0xffffff );\n\t\tconst colorCross = new Color( 0x333333 );\n\n\t\tthis.setColors( colorFrustum, colorCone, colorUp, colorTarget, colorCross );\n\n\t}\n\n\t/**\n\t * Defines the colors of the helper.\n\t *\n\t * @param {Color} frustum - The frustum line color.\n\t * @param {Color} cone - The cone line color.\n\t * @param {Color} up - The up line color.\n\t * @param {Color} target - The target line color.\n\t * @param {Color} cross - The cross line color.\n\t * @return {CameraHelper} A reference to this helper.\n\t */\n\tsetColors( frustum, cone, up, target, cross ) {\n\n\t\tconst geometry = this.geometry;\n\n\t\tconst colorAttribute = geometry.getAttribute( 'color' );\n\n\t\t// near\n\n\t\tcolorAttribute.setXYZ( 0, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 1, frustum.r, frustum.g, frustum.b ); // n1, n2\n\t\tcolorAttribute.setXYZ( 2, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 3, frustum.r, frustum.g, frustum.b ); // n2, n4\n\t\tcolorAttribute.setXYZ( 4, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 5, frustum.r, frustum.g, frustum.b ); // n4, n3\n\t\tcolorAttribute.setXYZ( 6, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 7, frustum.r, frustum.g, frustum.b ); // n3, n1\n\n\t\t// far\n\n\t\tcolorAttribute.setXYZ( 8, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 9, frustum.r, frustum.g, frustum.b ); // f1, f2\n\t\tcolorAttribute.setXYZ( 10, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 11, frustum.r, frustum.g, frustum.b ); // f2, f4\n\t\tcolorAttribute.setXYZ( 12, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 13, frustum.r, frustum.g, frustum.b ); // f4, f3\n\t\tcolorAttribute.setXYZ( 14, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 15, frustum.r, frustum.g, frustum.b ); // f3, f1\n\n\t\t// sides\n\n\t\tcolorAttribute.setXYZ( 16, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 17, frustum.r, frustum.g, frustum.b ); // n1, f1\n\t\tcolorAttribute.setXYZ( 18, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 19, frustum.r, frustum.g, frustum.b ); // n2, f2\n\t\tcolorAttribute.setXYZ( 20, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 21, frustum.r, frustum.g, frustum.b ); // n3, f3\n\t\tcolorAttribute.setXYZ( 22, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 23, frustum.r, frustum.g, frustum.b ); // n4, f4\n\n\t\t// cone\n\n\t\tcolorAttribute.setXYZ( 24, cone.r, cone.g, cone.b ); colorAttribute.setXYZ( 25, cone.r, cone.g, cone.b ); // p, n1\n\t\tcolorAttribute.setXYZ( 26, cone.r, cone.g, cone.b ); colorAttribute.setXYZ( 27, cone.r, cone.g, cone.b ); // p, n2\n\t\tcolorAttribute.setXYZ( 28, cone.r, cone.g, cone.b ); colorAttribute.setXYZ( 29, cone.r, cone.g, cone.b ); // p, n3\n\t\tcolorAttribute.setXYZ( 30, cone.r, cone.g, cone.b ); colorAttribute.setXYZ( 31, cone.r, cone.g, cone.b ); // p, n4\n\n\t\t// up\n\n\t\tcolorAttribute.setXYZ( 32, up.r, up.g, up.b ); colorAttribute.setXYZ( 33, up.r, up.g, up.b ); // u1, u2\n\t\tcolorAttribute.setXYZ( 34, up.r, up.g, up.b ); colorAttribute.setXYZ( 35, up.r, up.g, up.b ); // u2, u3\n\t\tcolorAttribute.setXYZ( 36, up.r, up.g, up.b ); colorAttribute.setXYZ( 37, up.r, up.g, up.b ); // u3, u1\n\n\t\t// target\n\n\t\tcolorAttribute.setXYZ( 38, target.r, target.g, target.b ); colorAttribute.setXYZ( 39, target.r, target.g, target.b ); // c, t\n\t\tcolorAttribute.setXYZ( 40, cross.r, cross.g, cross.b ); colorAttribute.setXYZ( 41, cross.r, cross.g, cross.b ); // p, c\n\n\t\t// cross\n\n\t\tcolorAttribute.setXYZ( 42, cross.r, cross.g, cross.b ); colorAttribute.setXYZ( 43, cross.r, cross.g, cross.b ); // cn1, cn2\n\t\tcolorAttribute.setXYZ( 44, cross.r, cross.g, cross.b ); colorAttribute.setXYZ( 45, cross.r, cross.g, cross.b ); // cn3, cn4\n\n\t\tcolorAttribute.setXYZ( 46, cross.r, cross.g, cross.b ); colorAttribute.setXYZ( 47, cross.r, cross.g, cross.b ); // cf1, cf2\n\t\tcolorAttribute.setXYZ( 48, cross.r, cross.g, cross.b ); colorAttribute.setXYZ( 49, cross.r, cross.g, cross.b ); // cf3, cf4\n\n\t\tcolorAttribute.needsUpdate = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Updates the helper based on the projection matrix of the camera.\n\t */\n\tupdate() {\n\n\t\tconst geometry = this.geometry;\n\t\tconst pointMap = this.pointMap;\n\n\t\tconst w = 1, h = 1;\n\n\t\tlet nearZ, farZ;\n\n\t\t// we need just camera projection matrix inverse\n\t\t// world matrix must be identity\n\n\t\t_camera.projectionMatrixInverse.copy( this.camera.projectionMatrixInverse );\n\n\t\t// Adjust z values based on coordinate system\n\n\t\tif ( this.camera.reversedDepth === true ) {\n\n\t\t\tnearZ = 1;\n\t\t\tfarZ = 0;\n\n\t\t} else {\n\n\t\t\tif ( this.camera.coordinateSystem === WebGLCoordinateSystem ) {\n\n\t\t\t\tnearZ = -1;\n\t\t\t\tfarZ = 1;\n\n\t\t\t} else if ( this.camera.coordinateSystem === WebGPUCoordinateSystem ) {\n\n\t\t\t\tnearZ = 0;\n\t\t\t\tfarZ = 1;\n\n\t\t\t} else {\n\n\t\t\t\tthrow new Error( 'THREE.CameraHelper.update(): Invalid coordinate system: ' + this.camera.coordinateSystem );\n\n\t\t\t}\n\n\t\t}\n\n\n\t\t// center / target\n\t\tsetPoint( 'c', pointMap, geometry, _camera, 0, 0, nearZ );\n\t\tsetPoint( 't', pointMap, geometry, _camera, 0, 0, farZ );\n\n\t\t// near\n\n\t\tsetPoint( 'n1', pointMap, geometry, _camera, - w, - h, nearZ );\n\t\tsetPoint( 'n2', pointMap, geometry, _camera, w, - h, nearZ );\n\t\tsetPoint( 'n3', pointMap, geometry, _camera, - w, h, nearZ );\n\t\tsetPoint( 'n4', pointMap, geometry, _camera, w, h, nearZ );\n\n\t\t// far\n\n\t\tsetPoint( 'f1', pointMap, geometry, _camera, - w, - h, farZ );\n\t\tsetPoint( 'f2', pointMap, geometry, _camera, w, - h, farZ );\n\t\tsetPoint( 'f3', pointMap, geometry, _camera, - w, h, farZ );\n\t\tsetPoint( 'f4', pointMap, geometry, _camera, w, h, farZ );\n\n\t\t// up\n\n\t\tsetPoint( 'u1', pointMap, geometry, _camera, w * 0.7, h * 1.1, nearZ );\n\t\tsetPoint( 'u2', pointMap, geometry, _camera, - w * 0.7, h * 1.1, nearZ );\n\t\tsetPoint( 'u3', pointMap, geometry, _camera, 0, h * 2, nearZ );\n\n\t\t// cross\n\n\t\tsetPoint( 'cf1', pointMap, geometry, _camera, - w, 0, farZ );\n\t\tsetPoint( 'cf2', pointMap, geometry, _camera, w, 0, farZ );\n\t\tsetPoint( 'cf3', pointMap, geometry, _camera, 0, - h, farZ );\n\t\tsetPoint( 'cf4', pointMap, geometry, _camera, 0, h, farZ );\n\n\t\tsetPoint( 'cn1', pointMap, geometry, _camera, - w, 0, nearZ );\n\t\tsetPoint( 'cn2', pointMap, geometry, _camera, w, 0, nearZ );\n\t\tsetPoint( 'cn3', pointMap, geometry, _camera, 0, - h, nearZ );\n\t\tsetPoint( 'cn4', pointMap, geometry, _camera, 0, h, nearZ );\n\n\t\tgeometry.getAttribute( 'position' ).needsUpdate = true;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\n\nfunction setPoint( point, pointMap, geometry, camera, x, y, z ) {\n\n\t_vector.set( x, y, z ).unproject( camera );\n\n\tconst points = pointMap[ point ];\n\n\tif ( points !== undefined ) {\n\n\t\tconst position = geometry.getAttribute( 'position' );\n\n\t\tfor ( let i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\tposition.setXYZ( points[ i ], _vector.x, _vector.y, _vector.z );\n\n\t\t}\n\n\t}\n\n}\n\nconst _box = /*@__PURE__*/ new Box3();\n\n/**\n * Helper object to graphically show the world-axis-aligned bounding box\n * around an object. The actual bounding box is handled with {@link Box3},\n * this is just a visual helper for debugging. It can be automatically\n * resized with {@link BoxHelper#update} when the object it's created from\n * is transformed. Note that the object must have a geometry for this to work,\n * so it won't work with sprites.\n *\n * ```js\n * const sphere = new THREE.SphereGeometry();\n * const object = new THREE.Mesh( sphere, new THREE.MeshBasicMaterial( 0xff0000 ) );\n * const box = new THREE.BoxHelper( object, 0xffff00 );\n * scene.add( box );\n * ```\n *\n * @augments LineSegments\n */\nclass BoxHelper extends LineSegments {\n\n\t/**\n\t * Constructs a new box helper.\n\t *\n\t * @param {Object3D} [object] - The 3D object to show the world-axis-aligned bounding box.\n\t * @param {number|Color|string} [color=0xffff00] - The box's color.\n\t */\n\tconstructor( object, color = 0xffff00 ) {\n\n\t\tconst indices = new Uint16Array( [ 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 ] );\n\t\tconst positions = new Float32Array( 8 * 3 );\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setIndex( new BufferAttribute( indices, 1 ) );\n\t\tgeometry.setAttribute( 'position', new BufferAttribute( positions, 3 ) );\n\n\t\tsuper( geometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );\n\n\t\t/**\n\t\t * The 3D object being visualized.\n\t\t *\n\t\t * @type {Object3D}\n\t\t */\n\t\tthis.object = object;\n\t\tthis.type = 'BoxHelper';\n\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.update();\n\n\t}\n\n\t/**\n\t * Updates the helper's geometry to match the dimensions of the object,\n\t * including any children.\n\t */\n\tupdate() {\n\n\t\tif ( this.object !== undefined ) {\n\n\t\t\t_box.setFromObject( this.object );\n\n\t\t}\n\n\t\tif ( _box.isEmpty() ) return;\n\n\t\tconst min = _box.min;\n\t\tconst max = _box.max;\n\n\t\t/*\n\t\t\t5____4\n\t\t1/___0/|\n\t\t| 6__|_7\n\t\t2/___3/\n\n\t\t0: max.x, max.y, max.z\n\t\t1: min.x, max.y, max.z\n\t\t2: min.x, min.y, max.z\n\t\t3: max.x, min.y, max.z\n\t\t4: max.x, max.y, min.z\n\t\t5: min.x, max.y, min.z\n\t\t6: min.x, min.y, min.z\n\t\t7: max.x, min.y, min.z\n\t\t*/\n\n\t\tconst position = this.geometry.attributes.position;\n\t\tconst array = position.array;\n\n\t\tarray[ 0 ] = max.x; array[ 1 ] = max.y; array[ 2 ] = max.z;\n\t\tarray[ 3 ] = min.x; array[ 4 ] = max.y; array[ 5 ] = max.z;\n\t\tarray[ 6 ] = min.x; array[ 7 ] = min.y; array[ 8 ] = max.z;\n\t\tarray[ 9 ] = max.x; array[ 10 ] = min.y; array[ 11 ] = max.z;\n\t\tarray[ 12 ] = max.x; array[ 13 ] = max.y; array[ 14 ] = min.z;\n\t\tarray[ 15 ] = min.x; array[ 16 ] = max.y; array[ 17 ] = min.z;\n\t\tarray[ 18 ] = min.x; array[ 19 ] = min.y; array[ 20 ] = min.z;\n\t\tarray[ 21 ] = max.x; array[ 22 ] = min.y; array[ 23 ] = min.z;\n\n\t\tposition.needsUpdate = true;\n\n\t\tthis.geometry.computeBoundingSphere();\n\n\t}\n\n\t/**\n\t * Updates the wireframe box for the passed object.\n\t *\n\t * @param {Object3D} object - The 3D object to create the helper for.\n\t * @return {BoxHelper} A reference to this instance.\n\t */\n\tsetFromObject( object ) {\n\n\t\tthis.object = object;\n\t\tthis.update();\n\n\t\treturn this;\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.object = source.object;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\n/**\n * A helper object to visualize an instance of {@link Box3}.\n *\n * ```js\n * const box = new THREE.Box3();\n * box.setFromCenterAndSize( new THREE.Vector3( 1, 1, 1 ), new THREE.Vector3( 2, 1, 3 ) );\n *\n * const helper = new THREE.Box3Helper( box, 0xffff00 );\n * scene.add( helper )\n * ```\n *\n * @augments LineSegments\n */\nclass Box3Helper extends LineSegments {\n\n\t/**\n\t * Constructs a new box3 helper.\n\t *\n\t * @param {Box3} box - The box to visualize.\n\t * @param {number|Color|string} [color=0xffff00] - The box's color.\n\t */\n\tconstructor( box, color = 0xffff00 ) {\n\n\t\tconst indices = new Uint16Array( [ 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 ] );\n\n\t\tconst positions = [ 1, 1, 1, -1, 1, 1, -1, -1, 1, 1, -1, 1, 1, 1, -1, -1, 1, -1, -1, -1, -1, 1, -1, -1 ];\n\n\t\tconst geometry = new BufferGeometry();\n\n\t\tgeometry.setIndex( new BufferAttribute( indices, 1 ) );\n\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\n\t\tsuper( geometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );\n\n\t\t/**\n\t\t * The box being visualized.\n\t\t *\n\t\t * @type {Box3}\n\t\t */\n\t\tthis.box = box;\n\n\t\tthis.type = 'Box3Helper';\n\n\t\tthis.geometry.computeBoundingSphere();\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tconst box = this.box;\n\n\t\tif ( box.isEmpty() ) return;\n\n\t\tbox.getCenter( this.position );\n\n\t\tbox.getSize( this.scale );\n\n\t\tthis.scale.multiplyScalar( 0.5 );\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\n/**\n * A helper object to visualize an instance of {@link Plane}.\n *\n * ```js\n * const plane = new THREE.Plane( new THREE.Vector3( 1, 1, 0.2 ), 3 );\n * const helper = new THREE.PlaneHelper( plane, 1, 0xffff00 );\n * scene.add( helper );\n * ```\n *\n * @augments Line\n */\nclass PlaneHelper extends Line {\n\n\t/**\n\t * Constructs a new plane helper.\n\t *\n\t * @param {Plane} plane - The plane to be visualized.\n\t * @param {number} [size=1] - The side length of plane helper.\n\t * @param {number|Color|string} [hex=0xffff00] - The helper's color.\n\t */\n\tconstructor( plane, size = 1, hex = 0xffff00 ) {\n\n\t\tconst color = hex;\n\n\t\tconst positions = [ 1, -1, 0, -1, 1, 0, -1, -1, 0, 1, 1, 0, -1, 1, 0, -1, -1, 0, 1, -1, 0, 1, 1, 0 ];\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\t\tgeometry.computeBoundingSphere();\n\n\t\tsuper( geometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );\n\n\t\tthis.type = 'PlaneHelper';\n\n\t\t/**\n\t\t * The plane being visualized.\n\t\t *\n\t\t * @type {Plane}\n\t\t */\n\t\tthis.plane = plane;\n\n\t\t/**\n\t\t * The side length of plane helper.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.size = size;\n\n\t\tconst positions2 = [ 1, 1, 0, -1, 1, 0, -1, -1, 0, 1, 1, 0, -1, -1, 0, 1, -1, 0 ];\n\n\t\tconst geometry2 = new BufferGeometry();\n\t\tgeometry2.setAttribute( 'position', new Float32BufferAttribute( positions2, 3 ) );\n\t\tgeometry2.computeBoundingSphere();\n\n\t\tthis.add( new Mesh( geometry2, new MeshBasicMaterial( { color: color, opacity: 0.2, transparent: true, depthWrite: false, toneMapped: false } ) ) );\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tthis.position.set( 0, 0, 0 );\n\n\t\tthis.scale.set( 0.5 * this.size, 0.5 * this.size, 1 );\n\n\t\tthis.lookAt( this.plane.normal );\n\n\t\tthis.translateZ( - this.plane.constant );\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t}\n\n\t/**\n\t * Updates the helper to match the position and direction of the\n\t * light being visualized.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\t\tthis.children[ 0 ].geometry.dispose();\n\t\tthis.children[ 0 ].material.dispose();\n\n\t}\n\n}\n\nconst _axis = /*@__PURE__*/ new Vector3();\nlet _lineGeometry, _coneGeometry;\n\n/**\n * An 3D arrow object for visualizing directions.\n *\n * ```js\n * const dir = new THREE.Vector3( 1, 2, 0 );\n *\n * //normalize the direction vector (convert to vector of length 1)\n * dir.normalize();\n *\n * const origin = new THREE.Vector3( 0, 0, 0 );\n * const length = 1;\n * const hex = 0xffff00;\n *\n * const arrowHelper = new THREE.ArrowHelper( dir, origin, length, hex );\n * scene.add( arrowHelper );\n * ```\n *\n * @augments Object3D\n */\nclass ArrowHelper extends Object3D {\n\n\t/**\n\t * Constructs a new arrow helper.\n\t *\n\t * @param {Vector3} [dir=(0, 0, 1)] - The (normalized) direction vector.\n\t * @param {Vector3} [origin=(0, 0, 0)] - Point at which the arrow starts.\n\t * @param {number} [length=1] - Length of the arrow in world units.\n\t * @param {(number|Color|string)} [color=0xffff00] - Color of the arrow.\n\t * @param {number} [headLength=length*0.2] - The length of the head of the arrow.\n\t * @param {number} [headWidth=headLength*0.2] - The width of the head of the arrow.\n\t */\n\tconstructor( dir = new Vector3( 0, 0, 1 ), origin = new Vector3( 0, 0, 0 ), length = 1, color = 0xffff00, headLength = length * 0.2, headWidth = headLength * 0.2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'ArrowHelper';\n\n\t\tif ( _lineGeometry === undefined ) {\n\n\t\t\t_lineGeometry = new BufferGeometry();\n\t\t\t_lineGeometry.setAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 1, 0 ], 3 ) );\n\n\t\t\t_coneGeometry = new ConeGeometry( 0.5, 1, 5, 1 );\n\t\t\t_coneGeometry.translate( 0, -0.5, 0 );\n\n\t\t}\n\n\t\tthis.position.copy( origin );\n\n\t\t/**\n\t\t * The line part of the arrow helper.\n\t\t *\n\t\t * @type {Line}\n\t\t */\n\t\tthis.line = new Line( _lineGeometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );\n\t\tthis.line.matrixAutoUpdate = false;\n\t\tthis.add( this.line );\n\n\t\t/**\n\t\t * The cone part of the arrow helper.\n\t\t *\n\t\t * @type {Mesh}\n\t\t */\n\t\tthis.cone = new Mesh( _coneGeometry, new MeshBasicMaterial( { color: color, toneMapped: false } ) );\n\t\tthis.cone.matrixAutoUpdate = false;\n\t\tthis.add( this.cone );\n\n\t\tthis.setDirection( dir );\n\t\tthis.setLength( length, headLength, headWidth );\n\n\t}\n\n\t/**\n\t * Sets the direction of the helper.\n\t *\n\t * @param {Vector3} dir - The normalized direction vector.\n\t */\n\tsetDirection( dir ) {\n\n\t\t// dir is assumed to be normalized\n\n\t\tif ( dir.y > 0.99999 ) {\n\n\t\t\tthis.quaternion.set( 0, 0, 0, 1 );\n\n\t\t} else if ( dir.y < -0.99999 ) {\n\n\t\t\tthis.quaternion.set( 1, 0, 0, 0 );\n\n\t\t} else {\n\n\t\t\t_axis.set( dir.z, 0, - dir.x ).normalize();\n\n\t\t\tconst radians = Math.acos( dir.y );\n\n\t\t\tthis.quaternion.setFromAxisAngle( _axis, radians );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the length of the helper.\n\t *\n\t * @param {number} length - Length of the arrow in world units.\n\t * @param {number} [headLength=length*0.2] - The length of the head of the arrow.\n\t * @param {number} [headWidth=headLength*0.2] - The width of the head of the arrow.\n\t */\n\tsetLength( length, headLength = length * 0.2, headWidth = headLength * 0.2 ) {\n\n\t\tthis.line.scale.set( 1, Math.max( 0.0001, length - headLength ), 1 ); // see #17458\n\t\tthis.line.updateMatrix();\n\n\t\tthis.cone.scale.set( headWidth, headLength, headWidth );\n\t\tthis.cone.position.y = length;\n\t\tthis.cone.updateMatrix();\n\n\t}\n\n\t/**\n\t * Sets the color of the helper.\n\t *\n\t * @param {number|Color|string} color - The color to set.\n\t */\n\tsetColor( color ) {\n\n\t\tthis.line.material.color.set( color );\n\t\tthis.cone.material.color.set( color );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source, false );\n\n\t\tthis.line.copy( source.line );\n\t\tthis.cone.copy( source.cone );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.line.geometry.dispose();\n\t\tthis.line.material.dispose();\n\t\tthis.cone.geometry.dispose();\n\t\tthis.cone.material.dispose();\n\n\t}\n\n}\n\n/**\n * An axis object to visualize the 3 axes in a simple way.\n * The X axis is red. The Y axis is green. The Z axis is blue.\n *\n * ```js\n * const axesHelper = new THREE.AxesHelper( 5 );\n * scene.add( axesHelper );\n * ```\n *\n * @augments LineSegments\n */\nclass AxesHelper extends LineSegments {\n\n\t/**\n\t * Constructs a new axes helper.\n\t *\n\t * @param {number} [size=1] - Size of the lines representing the axes.\n\t */\n\tconstructor( size = 1 ) {\n\n\t\tconst vertices = [\n\t\t\t0, 0, 0,\tsize, 0, 0,\n\t\t\t0, 0, 0,\t0, size, 0,\n\t\t\t0, 0, 0,\t0, 0, size\n\t\t];\n\n\t\tconst colors = [\n\t\t\t1, 0, 0,\t1, 0.6, 0,\n\t\t\t0, 1, 0,\t0.6, 1, 0,\n\t\t\t0, 0, 1,\t0, 0.6, 1\n\t\t];\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { vertexColors: true, toneMapped: false } );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.type = 'AxesHelper';\n\n\t}\n\n\t/**\n\t * Defines the colors of the axes helper.\n\t *\n\t * @param {number|Color|string} xAxisColor - The color for the x axis.\n\t * @param {number|Color|string} yAxisColor - The color for the y axis.\n\t * @param {number|Color|string} zAxisColor - The color for the z axis.\n\t * @return {AxesHelper} A reference to this axes helper.\n\t */\n\tsetColors( xAxisColor, yAxisColor, zAxisColor ) {\n\n\t\tconst color = new Color();\n\t\tconst array = this.geometry.attributes.color.array;\n\n\t\tcolor.set( xAxisColor );\n\t\tcolor.toArray( array, 0 );\n\t\tcolor.toArray( array, 3 );\n\n\t\tcolor.set( yAxisColor );\n\t\tcolor.toArray( array, 6 );\n\t\tcolor.toArray( array, 9 );\n\n\t\tcolor.set( zAxisColor );\n\t\tcolor.toArray( array, 12 );\n\t\tcolor.toArray( array, 15 );\n\n\t\tthis.geometry.attributes.color.needsUpdate = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\n/**\n * This class is used to convert a series of paths to an array of\n * shapes. It is specifically used in context of fonts and SVG.\n */\nclass ShapePath {\n\n\t/**\n\t * Constructs a new shape path.\n\t */\n\tconstructor() {\n\n\t\tthis.type = 'ShapePath';\n\n\t\t/**\n\t\t * The color of the shape.\n\t\t *\n\t\t * @type {Color}\n\t\t */\n\t\tthis.color = new Color();\n\n\t\t/**\n\t\t * The paths that have been generated for this shape.\n\t\t *\n\t\t * @type {Array<Path>}\n\t\t * @default null\n\t\t */\n\t\tthis.subPaths = [];\n\n\t\t/**\n\t\t * The current path that is being generated.\n\t\t *\n\t\t * @type {?Path}\n\t\t * @default null\n\t\t */\n\t\tthis.currentPath = null;\n\n\t}\n\n\t/**\n\t * Creates a new path and moves it current point to the given one.\n\t *\n\t * @param {number} x - The x coordinate.\n\t * @param {number} y - The y coordinate.\n\t * @return {ShapePath} A reference to this shape path.\n\t */\n\tmoveTo( x, y ) {\n\n\t\tthis.currentPath = new Path();\n\t\tthis.subPaths.push( this.currentPath );\n\t\tthis.currentPath.moveTo( x, y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an instance of {@link LineCurve} to the path by connecting\n\t * the current point with the given one.\n\t *\n\t * @param {number} x - The x coordinate of the end point.\n\t * @param {number} y - The y coordinate of the end point.\n\t * @return {ShapePath} A reference to this shape path.\n\t */\n\tlineTo( x, y ) {\n\n\t\tthis.currentPath.lineTo( x, y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an instance of {@link QuadraticBezierCurve} to the path by connecting\n\t * the current point with the given one.\n\t *\n\t * @param {number} aCPx - The x coordinate of the control point.\n\t * @param {number} aCPy - The y coordinate of the control point.\n\t * @param {number} aX - The x coordinate of the end point.\n\t * @param {number} aY - The y coordinate of the end point.\n\t * @return {ShapePath} A reference to this shape path.\n\t */\n\tquadraticCurveTo( aCPx, aCPy, aX, aY ) {\n\n\t\tthis.currentPath.quadraticCurveTo( aCPx, aCPy, aX, aY );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an instance of {@link CubicBezierCurve} to the path by connecting\n\t * the current point with the given one.\n\t *\n\t * @param {number} aCP1x - The x coordinate of the first control point.\n\t * @param {number} aCP1y - The y coordinate of the first control point.\n\t * @param {number} aCP2x - The x coordinate of the second control point.\n\t * @param {number} aCP2y - The y coordinate of the second control point.\n\t * @param {number} aX - The x coordinate of the end point.\n\t * @param {number} aY - The y coordinate of the end point.\n\t * @return {ShapePath} A reference to this shape path.\n\t */\n\tbezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) {\n\n\t\tthis.currentPath.bezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an instance of {@link SplineCurve} to the path by connecting\n\t * the current point with the given list of points.\n\t *\n\t * @param {Array<Vector2>} pts - An array of points in 2D space.\n\t * @return {ShapePath} A reference to this shape path.\n\t */\n\tsplineThru( pts ) {\n\n\t\tthis.currentPath.splineThru( pts );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Converts the paths into an array of shapes.\n\t *\n\t * @param {boolean} isCCW - By default solid shapes are  defined clockwise (CW) and holes are defined counterclockwise (CCW).\n\t * If this flag is set to `true`, then those are flipped.\n\t * @return {Array<Shape>} An array of shapes.\n\t */\n\ttoShapes( isCCW ) {\n\n\t\tfunction toShapesNoHoles( inSubpaths ) {\n\n\t\t\tconst shapes = [];\n\n\t\t\tfor ( let i = 0, l = inSubpaths.length; i < l; i ++ ) {\n\n\t\t\t\tconst tmpPath = inSubpaths[ i ];\n\n\t\t\t\tconst tmpShape = new Shape();\n\t\t\t\ttmpShape.curves = tmpPath.curves;\n\n\t\t\t\tshapes.push( tmpShape );\n\n\t\t\t}\n\n\t\t\treturn shapes;\n\n\t\t}\n\n\t\tfunction isPointInsidePolygon( inPt, inPolygon ) {\n\n\t\t\tconst polyLen = inPolygon.length;\n\n\t\t\t// inPt on polygon contour => immediate success    or\n\t\t\t// toggling of inside/outside at every single! intersection point of an edge\n\t\t\t//  with the horizontal line through inPt, left of inPt\n\t\t\t//  not counting lowerY endpoints of edges and whole edges on that line\n\t\t\tlet inside = false;\n\t\t\tfor ( let p = polyLen - 1, q = 0; q < polyLen; p = q ++ ) {\n\n\t\t\t\tlet edgeLowPt = inPolygon[ p ];\n\t\t\t\tlet edgeHighPt = inPolygon[ q ];\n\n\t\t\t\tlet edgeDx = edgeHighPt.x - edgeLowPt.x;\n\t\t\t\tlet edgeDy = edgeHighPt.y - edgeLowPt.y;\n\n\t\t\t\tif ( Math.abs( edgeDy ) > Number.EPSILON ) {\n\n\t\t\t\t\t// not parallel\n\t\t\t\t\tif ( edgeDy < 0 ) {\n\n\t\t\t\t\t\tedgeLowPt = inPolygon[ q ]; edgeDx = - edgeDx;\n\t\t\t\t\t\tedgeHighPt = inPolygon[ p ]; edgeDy = - edgeDy;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ( inPt.y < edgeLowPt.y ) || ( inPt.y > edgeHighPt.y ) ) \t\tcontinue;\n\n\t\t\t\t\tif ( inPt.y === edgeLowPt.y ) {\n\n\t\t\t\t\t\tif ( inPt.x === edgeLowPt.x )\t\treturn\ttrue;\t\t// inPt is on contour ?\n\t\t\t\t\t\t// continue;\t\t\t\t// no intersection or edgeLowPt => doesn't count !!!\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconst perpEdge = edgeDy * ( inPt.x - edgeLowPt.x ) - edgeDx * ( inPt.y - edgeLowPt.y );\n\t\t\t\t\t\tif ( perpEdge === 0 )\t\t\t\treturn\ttrue;\t\t// inPt is on contour ?\n\t\t\t\t\t\tif ( perpEdge < 0 ) \t\t\t\tcontinue;\n\t\t\t\t\t\tinside = ! inside;\t\t// true intersection left of inPt\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// parallel or collinear\n\t\t\t\t\tif ( inPt.y !== edgeLowPt.y ) \t\tcontinue;\t\t\t// parallel\n\t\t\t\t\t// edge lies on the same horizontal line as inPt\n\t\t\t\t\tif ( ( ( edgeHighPt.x <= inPt.x ) && ( inPt.x <= edgeLowPt.x ) ) ||\n\t\t\t\t\t\t ( ( edgeLowPt.x <= inPt.x ) && ( inPt.x <= edgeHighPt.x ) ) )\t\treturn\ttrue;\t// inPt: Point on contour !\n\t\t\t\t\t// continue;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn\tinside;\n\n\t\t}\n\n\t\tconst isClockWise = ShapeUtils.isClockWise;\n\n\t\tconst subPaths = this.subPaths;\n\t\tif ( subPaths.length === 0 ) return [];\n\n\t\tlet solid, tmpPath, tmpShape;\n\t\tconst shapes = [];\n\n\t\tif ( subPaths.length === 1 ) {\n\n\t\t\ttmpPath = subPaths[ 0 ];\n\t\t\ttmpShape = new Shape();\n\t\t\ttmpShape.curves = tmpPath.curves;\n\t\t\tshapes.push( tmpShape );\n\t\t\treturn shapes;\n\n\t\t}\n\n\t\tlet holesFirst = ! isClockWise( subPaths[ 0 ].getPoints() );\n\t\tholesFirst = isCCW ? ! holesFirst : holesFirst;\n\n\t\t// log(\"Holes first\", holesFirst);\n\n\t\tconst betterShapeHoles = [];\n\t\tconst newShapes = [];\n\t\tlet newShapeHoles = [];\n\t\tlet mainIdx = 0;\n\t\tlet tmpPoints;\n\n\t\tnewShapes[ mainIdx ] = undefined;\n\t\tnewShapeHoles[ mainIdx ] = [];\n\n\t\tfor ( let i = 0, l = subPaths.length; i < l; i ++ ) {\n\n\t\t\ttmpPath = subPaths[ i ];\n\t\t\ttmpPoints = tmpPath.getPoints();\n\t\t\tsolid = isClockWise( tmpPoints );\n\t\t\tsolid = isCCW ? ! solid : solid;\n\n\t\t\tif ( solid ) {\n\n\t\t\t\tif ( ( ! holesFirst ) && ( newShapes[ mainIdx ] ) )\tmainIdx ++;\n\n\t\t\t\tnewShapes[ mainIdx ] = { s: new Shape(), p: tmpPoints };\n\t\t\t\tnewShapes[ mainIdx ].s.curves = tmpPath.curves;\n\n\t\t\t\tif ( holesFirst )\tmainIdx ++;\n\t\t\t\tnewShapeHoles[ mainIdx ] = [];\n\n\t\t\t\t//log('cw', i);\n\n\t\t\t} else {\n\n\t\t\t\tnewShapeHoles[ mainIdx ].push( { h: tmpPath, p: tmpPoints[ 0 ] } );\n\n\t\t\t\t//log('ccw', i);\n\n\t\t\t}\n\n\t\t}\n\n\t\t// only Holes? -> probably all Shapes with wrong orientation\n\t\tif ( ! newShapes[ 0 ] )\treturn\ttoShapesNoHoles( subPaths );\n\n\n\t\tif ( newShapes.length > 1 ) {\n\n\t\t\tlet ambiguous = false;\n\t\t\tlet toChange = 0;\n\n\t\t\tfor ( let sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) {\n\n\t\t\t\tbetterShapeHoles[ sIdx ] = [];\n\n\t\t\t}\n\n\t\t\tfor ( let sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) {\n\n\t\t\t\tconst sho = newShapeHoles[ sIdx ];\n\n\t\t\t\tfor ( let hIdx = 0; hIdx < sho.length; hIdx ++ ) {\n\n\t\t\t\t\tconst ho = sho[ hIdx ];\n\t\t\t\t\tlet hole_unassigned = true;\n\n\t\t\t\t\tfor ( let s2Idx = 0; s2Idx < newShapes.length; s2Idx ++ ) {\n\n\t\t\t\t\t\tif ( isPointInsidePolygon( ho.p, newShapes[ s2Idx ].p ) ) {\n\n\t\t\t\t\t\t\tif ( sIdx !== s2Idx )\ttoChange ++;\n\n\t\t\t\t\t\t\tif ( hole_unassigned ) {\n\n\t\t\t\t\t\t\t\thole_unassigned = false;\n\t\t\t\t\t\t\t\tbetterShapeHoles[ s2Idx ].push( ho );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tambiguous = true;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( hole_unassigned ) {\n\n\t\t\t\t\t\tbetterShapeHoles[ sIdx ].push( ho );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( toChange > 0 && ambiguous === false ) {\n\n\t\t\t\tnewShapeHoles = betterShapeHoles;\n\n\t\t\t}\n\n\t\t}\n\n\t\tlet tmpHoles;\n\n\t\tfor ( let i = 0, il = newShapes.length; i < il; i ++ ) {\n\n\t\t\ttmpShape = newShapes[ i ].s;\n\t\t\tshapes.push( tmpShape );\n\t\t\ttmpHoles = newShapeHoles[ i ];\n\n\t\t\tfor ( let j = 0, jl = tmpHoles.length; j < jl; j ++ ) {\n\n\t\t\t\ttmpShape.holes.push( tmpHoles[ j ].h );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//log(\"shape\", shapes);\n\n\t\treturn shapes;\n\n\t}\n\n}\n\n/**\n * Abstract base class for controls.\n *\n * @abstract\n * @augments EventDispatcher\n */\nclass Controls extends EventDispatcher {\n\n\t/**\n\t * Constructs a new controls instance.\n\t *\n\t * @param {Object3D} object - The object that is managed by the controls.\n\t * @param {?HTMLElement} domElement - The HTML element used for event listeners.\n\t */\n\tconstructor( object, domElement = null ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The object that is managed by the controls.\n\t\t *\n\t\t * @type {Object3D}\n\t\t */\n\t\tthis.object = object;\n\n\t\t/**\n\t\t * The HTML element used for event listeners.\n\t\t *\n\t\t * @type {?HTMLElement}\n\t\t * @default null\n\t\t */\n\t\tthis.domElement = domElement;\n\n\t\t/**\n\t\t * Whether the controls responds to user input or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.enabled = true;\n\n\t\t/**\n\t\t * The internal state of the controls.\n\t\t *\n\t\t * @type {number}\n\t\t * @default -1\n\t\t */\n\t\tthis.state = -1;\n\n\t\t/**\n\t\t * This object defines the keyboard input of the controls.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.keys = {};\n\n\t\t/**\n\t\t * This object defines what type of actions are assigned to the available mouse buttons.\n\t\t * It depends on the control implementation what kind of mouse buttons and actions are supported.\n\t\t *\n\t\t * @type {{LEFT: ?number, MIDDLE: ?number, RIGHT: ?number}}\n\t\t */\n\t\tthis.mouseButtons = { LEFT: null, MIDDLE: null, RIGHT: null };\n\n\t\t/**\n\t\t * This object defines what type of actions are assigned to what kind of touch interaction.\n\t\t * It depends on the control implementation what kind of touch interaction and actions are supported.\n\t\t *\n\t\t * @type {{ONE: ?number, TWO: ?number}}\n\t\t */\n\t\tthis.touches = { ONE: null, TWO: null };\n\n\t}\n\n\t/**\n\t * Connects the controls to the DOM. This method has so called \"side effects\" since\n\t * it adds the module's event listeners to the DOM.\n\t *\n\t * @param {HTMLElement} element - The DOM element to connect to.\n\t */\n\tconnect( element ) {\n\n\t\tif ( element === undefined ) {\n\n\t\t\twarn( 'Controls: connect() now requires an element.' ); // @deprecated, the warning can be removed with r185\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( this.domElement !== null ) this.disconnect();\n\n\t\tthis.domElement = element;\n\n\t}\n\n\t/**\n\t * Disconnects the controls from the DOM.\n\t */\n\tdisconnect() {}\n\n\t/**\n\t * Call this method if you no longer want use to the controls. It frees all internal\n\t * resources and removes all event listeners.\n\t */\n\tdispose() {}\n\n\t/**\n\t * Controls should implement this method if they have to update their internal state\n\t * per simulation step.\n\t *\n\t * @param {number} [delta] - The time delta in seconds.\n\t */\n\tupdate( /* delta */ ) {}\n\n}\n\n/**\n * Scales the texture as large as possible within its surface without cropping\n * or stretching the texture. The method preserves the original aspect ratio of\n * the texture. Akin to CSS `object-fit: contain`\n *\n * @param {Texture} texture - The texture.\n * @param {number} aspect - The texture's aspect ratio.\n * @return {Texture} The updated texture.\n */\nfunction contain( texture, aspect ) {\n\n\tconst imageAspect = ( texture.image && texture.image.width ) ? texture.image.width / texture.image.height : 1;\n\n\tif ( imageAspect > aspect ) {\n\n\t\ttexture.repeat.x = 1;\n\t\ttexture.repeat.y = imageAspect / aspect;\n\n\t\ttexture.offset.x = 0;\n\t\ttexture.offset.y = ( 1 - texture.repeat.y ) / 2;\n\n\t} else {\n\n\t\ttexture.repeat.x = aspect / imageAspect;\n\t\ttexture.repeat.y = 1;\n\n\t\ttexture.offset.x = ( 1 - texture.repeat.x ) / 2;\n\t\ttexture.offset.y = 0;\n\n\t}\n\n\treturn texture;\n\n}\n\n/**\n * Scales the texture to the smallest possible size to fill the surface, leaving\n * no empty space. The method preserves the original aspect ratio of the texture.\n * Akin to CSS `object-fit: cover`.\n *\n * @param {Texture} texture - The texture.\n * @param {number} aspect - The texture's aspect ratio.\n * @return {Texture} The updated texture.\n */\nfunction cover( texture, aspect ) {\n\n\tconst imageAspect = ( texture.image && texture.image.width ) ? texture.image.width / texture.image.height : 1;\n\n\tif ( imageAspect > aspect ) {\n\n\t\ttexture.repeat.x = aspect / imageAspect;\n\t\ttexture.repeat.y = 1;\n\n\t\ttexture.offset.x = ( 1 - texture.repeat.x ) / 2;\n\t\ttexture.offset.y = 0;\n\n\t} else {\n\n\t\ttexture.repeat.x = 1;\n\t\ttexture.repeat.y = imageAspect / aspect;\n\n\t\ttexture.offset.x = 0;\n\t\ttexture.offset.y = ( 1 - texture.repeat.y ) / 2;\n\n\t}\n\n\treturn texture;\n\n}\n\n/**\n * Configures the texture to the default transformation. Akin to CSS `object-fit: fill`.\n *\n * @param {Texture} texture - The texture.\n * @return {Texture} The updated texture.\n */\nfunction fill( texture ) {\n\n\ttexture.repeat.x = 1;\n\ttexture.repeat.y = 1;\n\n\ttexture.offset.x = 0;\n\ttexture.offset.y = 0;\n\n\treturn texture;\n\n}\n\n/**\n * Determines how many bytes must be used to represent the texture.\n *\n * @param {number} width - The width of the texture.\n * @param {number} height - The height of the texture.\n * @param {number} format - The texture's format.\n * @param {number} type - The texture's type.\n * @return {number} The byte length.\n */\nfunction getByteLength( width, height, format, type ) {\n\n\tconst typeByteLength = getTextureTypeByteLength( type );\n\n\tswitch ( format ) {\n\n\t\t// https://registry.khronos.org/OpenGL-Refpages/es3.0/html/glTexImage2D.xhtml\n\t\tcase AlphaFormat:\n\t\t\treturn width * height;\n\t\tcase RedFormat:\n\t\t\treturn ( ( width * height ) / typeByteLength.components ) * typeByteLength.byteLength;\n\t\tcase RedIntegerFormat:\n\t\t\treturn ( ( width * height ) / typeByteLength.components ) * typeByteLength.byteLength;\n\t\tcase RGFormat:\n\t\t\treturn ( ( width * height * 2 ) / typeByteLength.components ) * typeByteLength.byteLength;\n\t\tcase RGIntegerFormat:\n\t\t\treturn ( ( width * height * 2 ) / typeByteLength.components ) * typeByteLength.byteLength;\n\t\tcase RGBFormat:\n\t\t\treturn ( ( width * height * 3 ) / typeByteLength.components ) * typeByteLength.byteLength;\n\t\tcase RGBAFormat:\n\t\t\treturn ( ( width * height * 4 ) / typeByteLength.components ) * typeByteLength.byteLength;\n\t\tcase RGBAIntegerFormat:\n\t\t\treturn ( ( width * height * 4 ) / typeByteLength.components ) * typeByteLength.byteLength;\n\n\t\t// https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_s3tc_srgb/\n\t\tcase RGB_S3TC_DXT1_Format:\n\t\tcase RGBA_S3TC_DXT1_Format:\n\t\t\treturn Math.floor( ( width + 3 ) / 4 ) * Math.floor( ( height + 3 ) / 4 ) * 8;\n\t\tcase RGBA_S3TC_DXT3_Format:\n\t\tcase RGBA_S3TC_DXT5_Format:\n\t\t\treturn Math.floor( ( width + 3 ) / 4 ) * Math.floor( ( height + 3 ) / 4 ) * 16;\n\n\t\t// https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_pvrtc/\n\t\tcase RGB_PVRTC_2BPPV1_Format:\n\t\tcase RGBA_PVRTC_2BPPV1_Format:\n\t\t\treturn ( Math.max( width, 16 ) * Math.max( height, 8 ) ) / 4;\n\t\tcase RGB_PVRTC_4BPPV1_Format:\n\t\tcase RGBA_PVRTC_4BPPV1_Format:\n\t\t\treturn ( Math.max( width, 8 ) * Math.max( height, 8 ) ) / 2;\n\n\t\t// https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_etc/\n\t\tcase RGB_ETC1_Format:\n\t\tcase RGB_ETC2_Format:\n\t\t\treturn Math.floor( ( width + 3 ) / 4 ) * Math.floor( ( height + 3 ) / 4 ) * 8;\n\t\tcase RGBA_ETC2_EAC_Format:\n\t\t\treturn Math.floor( ( width + 3 ) / 4 ) * Math.floor( ( height + 3 ) / 4 ) * 16;\n\n\t\t// https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_astc/\n\t\tcase RGBA_ASTC_4x4_Format:\n\t\t\treturn Math.floor( ( width + 3 ) / 4 ) * Math.floor( ( height + 3 ) / 4 ) * 16;\n\t\tcase RGBA_ASTC_5x4_Format:\n\t\t\treturn Math.floor( ( width + 4 ) / 5 ) * Math.floor( ( height + 3 ) / 4 ) * 16;\n\t\tcase RGBA_ASTC_5x5_Format:\n\t\t\treturn Math.floor( ( width + 4 ) / 5 ) * Math.floor( ( height + 4 ) / 5 ) * 16;\n\t\tcase RGBA_ASTC_6x5_Format:\n\t\t\treturn Math.floor( ( width + 5 ) / 6 ) * Math.floor( ( height + 4 ) / 5 ) * 16;\n\t\tcase RGBA_ASTC_6x6_Format:\n\t\t\treturn Math.floor( ( width + 5 ) / 6 ) * Math.floor( ( height + 5 ) / 6 ) * 16;\n\t\tcase RGBA_ASTC_8x5_Format:\n\t\t\treturn Math.floor( ( width + 7 ) / 8 ) * Math.floor( ( height + 4 ) / 5 ) * 16;\n\t\tcase RGBA_ASTC_8x6_Format:\n\t\t\treturn Math.floor( ( width + 7 ) / 8 ) * Math.floor( ( height + 5 ) / 6 ) * 16;\n\t\tcase RGBA_ASTC_8x8_Format:\n\t\t\treturn Math.floor( ( width + 7 ) / 8 ) * Math.floor( ( height + 7 ) / 8 ) * 16;\n\t\tcase RGBA_ASTC_10x5_Format:\n\t\t\treturn Math.floor( ( width + 9 ) / 10 ) * Math.floor( ( height + 4 ) / 5 ) * 16;\n\t\tcase RGBA_ASTC_10x6_Format:\n\t\t\treturn Math.floor( ( width + 9 ) / 10 ) * Math.floor( ( height + 5 ) / 6 ) * 16;\n\t\tcase RGBA_ASTC_10x8_Format:\n\t\t\treturn Math.floor( ( width + 9 ) / 10 ) * Math.floor( ( height + 7 ) / 8 ) * 16;\n\t\tcase RGBA_ASTC_10x10_Format:\n\t\t\treturn Math.floor( ( width + 9 ) / 10 ) * Math.floor( ( height + 9 ) / 10 ) * 16;\n\t\tcase RGBA_ASTC_12x10_Format:\n\t\t\treturn Math.floor( ( width + 11 ) / 12 ) * Math.floor( ( height + 9 ) / 10 ) * 16;\n\t\tcase RGBA_ASTC_12x12_Format:\n\t\t\treturn Math.floor( ( width + 11 ) / 12 ) * Math.floor( ( height + 11 ) / 12 ) * 16;\n\n\t\t// https://registry.khronos.org/webgl/extensions/EXT_texture_compression_bptc/\n\t\tcase RGBA_BPTC_Format:\n\t\tcase RGB_BPTC_SIGNED_Format:\n\t\tcase RGB_BPTC_UNSIGNED_Format:\n\t\t\treturn Math.ceil( width / 4 ) * Math.ceil( height / 4 ) * 16;\n\n\t\t// https://registry.khronos.org/webgl/extensions/EXT_texture_compression_rgtc/\n\t\tcase RED_RGTC1_Format:\n\t\tcase SIGNED_RED_RGTC1_Format:\n\t\t\treturn Math.ceil( width / 4 ) * Math.ceil( height / 4 ) * 8;\n\t\tcase RED_GREEN_RGTC2_Format:\n\t\tcase SIGNED_RED_GREEN_RGTC2_Format:\n\t\t\treturn Math.ceil( width / 4 ) * Math.ceil( height / 4 ) * 16;\n\n\t}\n\n\tthrow new Error(\n\t\t`Unable to determine texture byte length for ${format} format.`,\n\t);\n\n}\n\nfunction getTextureTypeByteLength( type ) {\n\n\tswitch ( type ) {\n\n\t\tcase UnsignedByteType:\n\t\tcase ByteType:\n\t\t\treturn { byteLength: 1, components: 1 };\n\t\tcase UnsignedShortType:\n\t\tcase ShortType:\n\t\tcase HalfFloatType:\n\t\t\treturn { byteLength: 2, components: 1 };\n\t\tcase UnsignedShort4444Type:\n\t\tcase UnsignedShort5551Type:\n\t\t\treturn { byteLength: 2, components: 4 };\n\t\tcase UnsignedIntType:\n\t\tcase IntType:\n\t\tcase FloatType:\n\t\t\treturn { byteLength: 4, components: 1 };\n\t\tcase UnsignedInt5999Type:\n\t\tcase UnsignedInt101111Type:\n\t\t\treturn { byteLength: 4, components: 3 };\n\n\t}\n\n\tthrow new Error( `Unknown texture type ${type}.` );\n\n}\n\n/**\n * A class containing utility functions for textures.\n *\n * @hideconstructor\n */\nclass TextureUtils {\n\n\t/**\n\t * Scales the texture as large as possible within its surface without cropping\n\t * or stretching the texture. The method preserves the original aspect ratio of\n\t * the texture. Akin to CSS `object-fit: contain`\n\t *\n\t * @param {Texture} texture - The texture.\n\t * @param {number} aspect - The texture's aspect ratio.\n\t * @return {Texture} The updated texture.\n\t */\n\tstatic contain( texture, aspect ) {\n\n\t\treturn contain( texture, aspect );\n\n\t}\n\n\t/**\n\t * Scales the texture to the smallest possible size to fill the surface, leaving\n\t * no empty space. The method preserves the original aspect ratio of the texture.\n\t * Akin to CSS `object-fit: cover`.\n\t *\n\t * @param {Texture} texture - The texture.\n\t * @param {number} aspect - The texture's aspect ratio.\n\t * @return {Texture} The updated texture.\n\t */\n\tstatic cover( texture, aspect ) {\n\n\t\treturn cover( texture, aspect );\n\n\t}\n\n\t/**\n\t * Configures the texture to the default transformation. Akin to CSS `object-fit: fill`.\n\t *\n\t * @param {Texture} texture - The texture.\n\t * @return {Texture} The updated texture.\n\t */\n\tstatic fill( texture ) {\n\n\t\treturn fill( texture );\n\n\t}\n\n\t/**\n\t * Determines how many bytes must be used to represent the texture.\n\t *\n\t * @param {number} width - The width of the texture.\n\t * @param {number} height - The height of the texture.\n\t * @param {number} format - The texture's format.\n\t * @param {number} type - The texture's type.\n\t * @return {number} The byte length.\n\t */\n\tstatic getByteLength( width, height, format, type ) {\n\n\t\treturn getByteLength( width, height, format, type );\n\n\t}\n\n}\n\nif ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) {\n\n\t__THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'register', { detail: {\n\t\trevision: REVISION,\n\t} } ) );\n\n}\n\nif ( typeof window !== 'undefined' ) {\n\n\tif ( window.__THREE__ ) {\n\n\t\twarn( 'WARNING: Multiple instances of Three.js being imported.' );\n\n\t} else {\n\n\t\twindow.__THREE__ = REVISION;\n\n\t}\n\n}\n\nexport { ACESFilmicToneMapping, AddEquation, AddOperation, AdditiveAnimationBlendMode, AdditiveBlending, AgXToneMapping, AlphaFormat, AlwaysCompare, AlwaysDepth, AlwaysStencilFunc, AmbientLight, AnimationAction, AnimationClip, AnimationLoader, AnimationMixer, AnimationObjectGroup, AnimationUtils, ArcCurve, ArrayCamera, ArrowHelper, AttachedBindMode, Audio, AudioAnalyser, AudioContext, AudioListener, AudioLoader, AxesHelper, BackSide, BasicDepthPacking, BasicShadowMap, BatchedMesh, Bone, BooleanKeyframeTrack, Box2, Box3, Box3Helper, BoxGeometry, BoxHelper, BufferAttribute, BufferGeometry, BufferGeometryLoader, ByteType, Cache, Camera, CameraHelper, CanvasTexture, CapsuleGeometry, CatmullRomCurve3, CineonToneMapping, CircleGeometry, ClampToEdgeWrapping, Clock, Color, ColorKeyframeTrack, ColorManagement, CompressedArrayTexture, CompressedCubeTexture, CompressedTexture, CompressedTextureLoader, ConeGeometry, ConstantAlphaFactor, ConstantColorFactor, Controls, CubeCamera, CubeReflectionMapping, CubeRefractionMapping, CubeTexture, CubeTextureLoader, CubeUVReflectionMapping, CubicBezierCurve, CubicBezierCurve3, CubicInterpolant, CullFaceBack, CullFaceFront, CullFaceFrontBack, CullFaceNone, Curve, CurvePath, CustomBlending, CustomToneMapping, CylinderGeometry, Cylindrical, Data3DTexture, DataArrayTexture, DataTexture, DataTextureLoader, DataUtils, DecrementStencilOp, DecrementWrapStencilOp, DefaultLoadingManager, DepthFormat, DepthStencilFormat, DepthTexture, DetachedBindMode, DirectionalLight, DirectionalLightHelper, DiscreteInterpolant, DodecahedronGeometry, DoubleSide, DstAlphaFactor, DstColorFactor, DynamicCopyUsage, DynamicDrawUsage, DynamicReadUsage, EdgesGeometry, EllipseCurve, EqualCompare, EqualDepth, EqualStencilFunc, EquirectangularReflectionMapping, EquirectangularRefractionMapping, Euler, EventDispatcher, ExternalTexture, ExtrudeGeometry, FileLoader, Float16BufferAttribute, Float32BufferAttribute, FloatType, Fog, FogExp2, FramebufferTexture, FrontSide, Frustum, FrustumArray, GLBufferAttribute, GLSL1, GLSL3, GreaterCompare, GreaterDepth, GreaterEqualCompare, GreaterEqualDepth, GreaterEqualStencilFunc, GreaterStencilFunc, GridHelper, Group, HalfFloatType, HemisphereLight, HemisphereLightHelper, IcosahedronGeometry, ImageBitmapLoader, ImageLoader, ImageUtils, IncrementStencilOp, IncrementWrapStencilOp, InstancedBufferAttribute, InstancedBufferGeometry, InstancedInterleavedBuffer, InstancedMesh, Int16BufferAttribute, Int32BufferAttribute, Int8BufferAttribute, IntType, InterleavedBuffer, InterleavedBufferAttribute, Interpolant, InterpolateDiscrete, InterpolateLinear, InterpolateSmooth, InterpolationSamplingMode, InterpolationSamplingType, InvertStencilOp, KeepStencilOp, KeyframeTrack, LOD, LatheGeometry, Layers, LessCompare, LessDepth, LessEqualCompare, LessEqualDepth, LessEqualStencilFunc, LessStencilFunc, Light, LightProbe, Line, Line3, LineBasicMaterial, LineCurve, LineCurve3, LineDashedMaterial, LineLoop, LineSegments, LinearFilter, LinearInterpolant, LinearMipMapLinearFilter, LinearMipMapNearestFilter, LinearMipmapLinearFilter, LinearMipmapNearestFilter, LinearSRGBColorSpace, LinearToneMapping, LinearTransfer, Loader, LoaderUtils, LoadingManager, LoopOnce, LoopPingPong, LoopRepeat, MOUSE, Material, MaterialLoader, MathUtils, Matrix2, Matrix3, Matrix4, MaxEquation, Mesh, MeshBasicMaterial, MeshDepthMaterial, MeshDistanceMaterial, MeshLambertMaterial, MeshMatcapMaterial, MeshNormalMaterial, MeshPhongMaterial, MeshPhysicalMaterial, MeshStandardMaterial, MeshToonMaterial, MinEquation, MirroredRepeatWrapping, MixOperation, MultiplyBlending, MultiplyOperation, NearestFilter, NearestMipMapLinearFilter, NearestMipMapNearestFilter, NearestMipmapLinearFilter, NearestMipmapNearestFilter, NeutralToneMapping, NeverCompare, NeverDepth, NeverStencilFunc, NoBlending, NoColorSpace, NoToneMapping, NormalAnimationBlendMode, NormalBlending, NotEqualCompare, NotEqualDepth, NotEqualStencilFunc, NumberKeyframeTrack, Object3D, ObjectLoader, ObjectSpaceNormalMap, OctahedronGeometry, OneFactor, OneMinusConstantAlphaFactor, OneMinusConstantColorFactor, OneMinusDstAlphaFactor, OneMinusDstColorFactor, OneMinusSrcAlphaFactor, OneMinusSrcColorFactor, OrthographicCamera, PCFShadowMap, PCFSoftShadowMap, Path, PerspectiveCamera, Plane, PlaneGeometry, PlaneHelper, PointLight, PointLightHelper, Points, PointsMaterial, PolarGridHelper, PolyhedronGeometry, PositionalAudio, PropertyBinding, PropertyMixer, QuadraticBezierCurve, QuadraticBezierCurve3, Quaternion, QuaternionKeyframeTrack, QuaternionLinearInterpolant, RAD2DEG, RED_GREEN_RGTC2_Format, RED_RGTC1_Format, REVISION, RGBADepthPacking, RGBAFormat, RGBAIntegerFormat, RGBA_ASTC_10x10_Format, RGBA_ASTC_10x5_Format, RGBA_ASTC_10x6_Format, RGBA_ASTC_10x8_Format, RGBA_ASTC_12x10_Format, RGBA_ASTC_12x12_Format, RGBA_ASTC_4x4_Format, RGBA_ASTC_5x4_Format, RGBA_ASTC_5x5_Format, RGBA_ASTC_6x5_Format, RGBA_ASTC_6x6_Format, RGBA_ASTC_8x5_Format, RGBA_ASTC_8x6_Format, RGBA_ASTC_8x8_Format, RGBA_BPTC_Format, RGBA_ETC2_EAC_Format, RGBA_PVRTC_2BPPV1_Format, RGBA_PVRTC_4BPPV1_Format, RGBA_S3TC_DXT1_Format, RGBA_S3TC_DXT3_Format, RGBA_S3TC_DXT5_Format, RGBDepthPacking, RGBFormat, RGBIntegerFormat, RGB_BPTC_SIGNED_Format, RGB_BPTC_UNSIGNED_Format, RGB_ETC1_Format, RGB_ETC2_Format, RGB_PVRTC_2BPPV1_Format, RGB_PVRTC_4BPPV1_Format, RGB_S3TC_DXT1_Format, RGDepthPacking, RGFormat, RGIntegerFormat, RawShaderMaterial, Ray, Raycaster, RectAreaLight, RedFormat, RedIntegerFormat, ReinhardToneMapping, RenderTarget, RenderTarget3D, RepeatWrapping, ReplaceStencilOp, ReverseSubtractEquation, RingGeometry, SIGNED_RED_GREEN_RGTC2_Format, SIGNED_RED_RGTC1_Format, SRGBColorSpace, SRGBTransfer, Scene, ShaderMaterial, ShadowMaterial, Shape, ShapeGeometry, ShapePath, ShapeUtils, ShortType, Skeleton, SkeletonHelper, SkinnedMesh, Source, Sphere, SphereGeometry, Spherical, SphericalHarmonics3, SplineCurve, SpotLight, SpotLightHelper, Sprite, SpriteMaterial, SrcAlphaFactor, SrcAlphaSaturateFactor, SrcColorFactor, StaticCopyUsage, StaticDrawUsage, StaticReadUsage, StereoCamera, StreamCopyUsage, StreamDrawUsage, StreamReadUsage, StringKeyframeTrack, SubtractEquation, SubtractiveBlending, TOUCH, TangentSpaceNormalMap, TetrahedronGeometry, Texture, TextureLoader, TextureUtils, Timer, TimestampQuery, TorusGeometry, TorusKnotGeometry, Triangle, TriangleFanDrawMode, TriangleStripDrawMode, TrianglesDrawMode, TubeGeometry, UVMapping, Uint16BufferAttribute, Uint32BufferAttribute, Uint8BufferAttribute, Uint8ClampedBufferAttribute, Uniform, UniformsGroup, UniformsUtils, UnsignedByteType, UnsignedInt101111Type, UnsignedInt248Type, UnsignedInt5999Type, UnsignedIntType, UnsignedShort4444Type, UnsignedShort5551Type, UnsignedShortType, VSMShadowMap, Vector2, Vector3, Vector4, VectorKeyframeTrack, VideoFrameTexture, VideoTexture, WebGL3DRenderTarget, WebGLArrayRenderTarget, WebGLCoordinateSystem, WebGLCubeRenderTarget, WebGLRenderTarget, WebGPUCoordinateSystem, WebXRController, WireframeGeometry, WrapAroundEnding, ZeroCurvatureEnding, ZeroFactor, ZeroSlopeEnding, ZeroStencilOp, arrayNeedsUint32, cloneUniforms, createCanvasElement, createElementNS, error, getByteLength, getConsoleFunction, getUnlitUniformColorSpace, log, mergeUniforms, probeAsync, setConsoleFunction, warn, warnOnce };\n","\"use strict\";\n\nexports.__esModule = true;\nexports[\"default\"] = stripComments;\n\nfunction stripComments(str) {\n  var s = \"\";\n  var commentStart = str.indexOf(\"/*\");\n  var lastEnd = 0;\n\n  while (commentStart >= 0) {\n    s = s + str.slice(lastEnd, commentStart);\n    var commentEnd = str.indexOf(\"*/\", commentStart + 2);\n\n    if (commentEnd < 0) {\n      return s;\n    }\n\n    lastEnd = commentEnd + 2;\n    commentStart = str.indexOf(\"/*\", lastEnd);\n  }\n\n  s = s + str.slice(lastEnd);\n  return s;\n}\n\nmodule.exports = exports.default;","\"use strict\";\n\nexports.__esModule = true;\nexports[\"default\"] = void 0;\n\nvar _cssesc = _interopRequireDefault(require(\"cssesc\"));\n\nvar _util = require(\"../util\");\n\nvar _node = _interopRequireDefault(require(\"./node\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nvar Namespace = /*#__PURE__*/function (_Node) {\n  _inheritsLoose(Namespace, _Node);\n\n  function Namespace() {\n    return _Node.apply(this, arguments) || this;\n  }\n\n  var _proto = Namespace.prototype;\n\n  _proto.qualifiedName = function qualifiedName(value) {\n    if (this.namespace) {\n      return this.namespaceString + \"|\" + value;\n    } else {\n      return value;\n    }\n  };\n\n  _proto.valueToString = function valueToString() {\n    return this.qualifiedName(_Node.prototype.valueToString.call(this));\n  };\n\n  _createClass(Namespace, [{\n    key: \"namespace\",\n    get: function get() {\n      return this._namespace;\n    },\n    set: function set(namespace) {\n      if (namespace === true || namespace === \"*\" || namespace === \"&\") {\n        this._namespace = namespace;\n\n        if (this.raws) {\n          delete this.raws.namespace;\n        }\n\n        return;\n      }\n\n      var escaped = (0, _cssesc[\"default\"])(namespace, {\n        isIdentifier: true\n      });\n      this._namespace = namespace;\n\n      if (escaped !== namespace) {\n        (0, _util.ensureObject)(this, \"raws\");\n        this.raws.namespace = escaped;\n      } else if (this.raws) {\n        delete this.raws.namespace;\n      }\n    }\n  }, {\n    key: \"ns\",\n    get: function get() {\n      return this._namespace;\n    },\n    set: function set(namespace) {\n      this.namespace = namespace;\n    }\n  }, {\n    key: \"namespaceString\",\n    get: function get() {\n      if (this.namespace) {\n        var ns = this.stringifyProperty(\"namespace\");\n\n        if (ns === true) {\n          return '';\n        } else {\n          return ns;\n        }\n      } else {\n        return '';\n      }\n    }\n  }]);\n\n  return Namespace;\n}(_node[\"default\"]);\n\nexports[\"default\"] = Namespace;\n;\nmodule.exports = exports.default;","'use strict';\nvar $ = require('../internals/export');\nvar symmetricDifference = require('../internals/set-symmetric-difference');\nvar setMethodGetKeysBeforeCloning = require('../internals/set-method-get-keys-before-cloning-detection');\nvar setMethodAcceptSetLike = require('../internals/set-method-accept-set-like');\n\nvar FORCED = !setMethodAcceptSetLike('symmetricDifference') || !setMethodGetKeysBeforeCloning('symmetricDifference');\n\n// `Set.prototype.symmetricDifference` method\n// https://tc39.es/ecma262/#sec-set.prototype.symmetricdifference\n$({ target: 'Set', proto: true, real: true, forced: FORCED }, {\n  symmetricDifference: symmetricDifference\n});\n","'use strict';\nvar getBuiltIn = require('../internals/get-built-in');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar getOwnPropertyNamesModule = require('../internals/object-get-own-property-names');\nvar getOwnPropertySymbolsModule = require('../internals/object-get-own-property-symbols');\nvar anObject = require('../internals/an-object');\n\nvar concat = uncurryThis([].concat);\n\n// all object keys, includes non-enumerable and symbols\nmodule.exports = getBuiltIn('Reflect', 'ownKeys') || function ownKeys(it) {\n  var keys = getOwnPropertyNamesModule.f(anObject(it));\n  var getOwnPropertySymbols = getOwnPropertySymbolsModule.f;\n  return getOwnPropertySymbols ? concat(keys, getOwnPropertySymbols(it)) : keys;\n};\n","/*\nThis plugin extends lazySizes to lazyLoad:\nbackground images, videos/posters and scripts\n\nBackground-Image:\nFor background images, use data-bg attribute:\n<div class=\"lazyload\" data-bg=\"bg-img.jpg\"></div>\n\n Video:\n For video/audio use data-poster and preload=\"none\":\n <video class=\"lazyload\" preload=\"none\" data-poster=\"poster.jpg\" src=\"src.mp4\">\n <!-- sources -->\n </video>\n\n For video that plays automatically if in view:\n <video\n\tclass=\"lazyload\"\n\tpreload=\"none\"\n\tmuted=\"\"\n\tdata-autoplay=\"\"\n\tdata-poster=\"poster.jpg\"\n\tsrc=\"src.mp4\">\n</video>\n\n Scripts:\n For scripts use data-script:\n <div class=\"lazyload\" data-script=\"module-name.js\"></div>\n\n\n Script modules using require:\n For modules using require use data-require:\n <div class=\"lazyload\" data-require=\"module-name\"></div>\n*/\n\n(function(window, factory) {\n\tvar globalInstall = function(){\n\t\tfactory(window.lazySizes);\n\t\twindow.removeEventListener('lazyunveilread', globalInstall, true);\n\t};\n\n\tfactory = factory.bind(null, window, window.document);\n\n\tif(typeof module == 'object' && module.exports){\n\t\tfactory(require('lazysizes'));\n\t} else if (typeof define == 'function' && define.amd) {\n\t\tdefine(['lazysizes'], factory);\n\t} else if(window.lazySizes) {\n\t\tglobalInstall();\n\t} else {\n\t\twindow.addEventListener('lazyunveilread', globalInstall, true);\n\t}\n}(window, function(window, document, lazySizes) {\n\t/*jshint eqnull:true */\n\t'use strict';\n\tvar bgLoad, regBgUrlEscape;\n\tvar uniqueUrls = {};\n\n\tif(document.addEventListener){\n\t\tregBgUrlEscape = /\\(|\\)|\\s|'/;\n\n\t\tbgLoad = function (url, cb){\n\t\t\tvar img = document.createElement('img');\n\t\t\timg.onload = function(){\n\t\t\t\timg.onload = null;\n\t\t\t\timg.onerror = null;\n\t\t\t\timg = null;\n\t\t\t\tcb();\n\t\t\t};\n\t\t\timg.onerror = img.onload;\n\n\t\t\timg.src = url;\n\n\t\t\tif(img && img.complete && img.onload){\n\t\t\t\timg.onload();\n\t\t\t}\n\t\t};\n\n\t\taddEventListener('lazybeforeunveil', function(e){\n\t\t\tif(e.detail.instance != lazySizes){return;}\n\n\t\t\tvar tmp, load, bg, poster;\n\t\t\tif(!e.defaultPrevented) {\n\n\t\t\t\tvar target = e.target;\n\n\t\t\t\tif(target.preload == 'none'){\n\t\t\t\t\ttarget.preload = target.getAttribute('data-preload') || 'auto';\n\t\t\t\t}\n\n\t\t\t\tif (target.getAttribute('data-autoplay') != null) {\n\t\t\t\t\tif (target.getAttribute('data-expand') && !target.autoplay) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\ttarget.play();\n\t\t\t\t\t\t} catch (er) {}\n\t\t\t\t\t} else {\n\t\t\t\t\t\trequestAnimationFrame(function () {\n\t\t\t\t\t\t\ttarget.setAttribute('data-expand', '-10');\n\t\t\t\t\t\t\tlazySizes.aC(target, lazySizes.cfg.lazyClass);\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\ttmp = target.getAttribute('data-link');\n\t\t\t\tif(tmp){\n\t\t\t\t\taddStyleScript(tmp, true);\n\t\t\t\t}\n\n\t\t\t\t// handle data-script\n\t\t\t\ttmp = target.getAttribute('data-script');\n\t\t\t\tif(tmp){\n\t\t\t\t\te.detail.firesLoad = true;\n\t\t\t\t\tload = function(){\n\t\t\t\t\t\te.detail.firesLoad = false;\n\t\t\t\t\t\tlazySizes.fire(target, '_lazyloaded', {}, true, true);\n\t\t\t\t\t};\n\t\t\t\t\taddStyleScript(tmp, null, load);\n\t\t\t\t}\n\n\t\t\t\t// handle data-require\n\t\t\t\ttmp = target.getAttribute('data-require');\n\t\t\t\tif(tmp){\n\t\t\t\t\tif(lazySizes.cfg.requireJs){\n\t\t\t\t\t\tlazySizes.cfg.requireJs([tmp]);\n\t\t\t\t\t} else {\n\t\t\t\t\t\taddStyleScript(tmp);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// handle data-bg\n\t\t\t\tbg = target.getAttribute('data-bg');\n\t\t\t\tif (bg) {\n\t\t\t\t\te.detail.firesLoad = true;\n\t\t\t\t\tload = function(){\n\t\t\t\t\t\ttarget.style.backgroundImage = 'url(' + (regBgUrlEscape.test(bg) ? JSON.stringify(bg) : bg ) + ')';\n\t\t\t\t\t\te.detail.firesLoad = false;\n\t\t\t\t\t\tlazySizes.fire(target, '_lazyloaded', {}, true, true);\n\t\t\t\t\t};\n\n\t\t\t\t\tbgLoad(bg, load);\n\t\t\t\t}\n\n\t\t\t\t// handle data-poster\n\t\t\t\tposter = target.getAttribute('data-poster');\n\t\t\t\tif(poster){\n\t\t\t\t\te.detail.firesLoad = true;\n\t\t\t\t\tload = function(){\n\t\t\t\t\t\ttarget.poster = poster;\n\t\t\t\t\t\te.detail.firesLoad = false;\n\t\t\t\t\t\tlazySizes.fire(target, '_lazyloaded', {}, true, true);\n\t\t\t\t\t};\n\n\t\t\t\t\tbgLoad(poster, load);\n\n\t\t\t\t}\n\t\t\t}\n\t\t}, false);\n\n\t}\n\n\tfunction addStyleScript(src, style, cb){\n\t\tif(uniqueUrls[src]){\n\t\t\treturn;\n\t\t}\n\t\tvar elem = document.createElement(style ? 'link' : 'script');\n\t\tvar insertElem = document.getElementsByTagName('script')[0];\n\n\t\tif(style){\n\t\t\telem.rel = 'stylesheet';\n\t\t\telem.href = src;\n\t\t} else {\n\t\t\telem.onload = function(){\n\t\t\t\telem.onerror = null;\n\t\t\t\telem.onload = null;\n\t\t\t\tcb();\n\t\t\t};\n\t\t\telem.onerror = elem.onload;\n\n\t\t\telem.src = src;\n\t\t}\n\t\tuniqueUrls[src] = true;\n\t\tuniqueUrls[elem.src || elem.href] = true;\n\t\tinsertElem.parentNode.insertBefore(elem, insertElem);\n\t}\n}));\n","'use strict';\nvar uncurryThisAccessor = require('../internals/function-uncurry-this-accessor');\nvar SetHelpers = require('../internals/set-helpers');\n\nmodule.exports = uncurryThisAccessor(SetHelpers.proto, 'size', 'get') || function (set) {\n  return set.size;\n};\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar fails = require('../internals/fails');\n\n// babel-minify and Closure Compiler transpiles RegExp('.', 'd') -> /./d and it causes SyntaxError\nvar RegExp = globalThis.RegExp;\n\nvar FLAGS_GETTER_IS_CORRECT = !fails(function () {\n  var INDICES_SUPPORT = true;\n  try {\n    RegExp('.', 'd');\n  } catch (error) {\n    INDICES_SUPPORT = false;\n  }\n\n  var O = {};\n  // modern V8 bug\n  var calls = '';\n  var expected = INDICES_SUPPORT ? 'dgimsy' : 'gimsy';\n\n  var addGetter = function (key, chr) {\n    // eslint-disable-next-line es/no-object-defineproperty -- safe\n    Object.defineProperty(O, key, { get: function () {\n      calls += chr;\n      return true;\n    } });\n  };\n\n  var pairs = {\n    dotAll: 's',\n    global: 'g',\n    ignoreCase: 'i',\n    multiline: 'm',\n    sticky: 'y'\n  };\n\n  if (INDICES_SUPPORT) pairs.hasIndices = 'd';\n\n  for (var key in pairs) addGetter(key, pairs[key]);\n\n  // eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\n  var result = Object.getOwnPropertyDescriptor(RegExp.prototype, 'flags').get.call(O);\n\n  return result !== expected || calls !== expected;\n});\n\nmodule.exports = { correct: FLAGS_GETTER_IS_CORRECT };\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nObject.defineProperty(exports, \"cloneDeep\", {\n    enumerable: true,\n    get: function() {\n        return cloneDeep;\n    }\n});\nfunction cloneDeep(value) {\n    if (Array.isArray(value)) {\n        return value.map((child)=>cloneDeep(child));\n    }\n    if (typeof value === \"object\" && value !== null) {\n        return Object.fromEntries(Object.entries(value).map(([k, v])=>[\n                k,\n                cloneDeep(v)\n            ]));\n    }\n    return value;\n}\n","'use strict';\nrequire('../../modules/es.array.iterator');\nrequire('../../modules/es.map');\nrequire('../../modules/es.map.group-by');\nrequire('../../modules/es.object.to-string');\nrequire('../../modules/es.string.iterator');\nvar path = require('../../internals/path');\n\nmodule.exports = path.Map;\n","'use strict';\n/* eslint-disable es/no-array-prototype-indexof -- required for testing */\nvar $ = require('../internals/export');\nvar uncurryThis = require('../internals/function-uncurry-this-clause');\nvar $indexOf = require('../internals/array-includes').indexOf;\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\n\nvar nativeIndexOf = uncurryThis([].indexOf);\n\nvar NEGATIVE_ZERO = !!nativeIndexOf && 1 / nativeIndexOf([1], 1, -0) < 0;\nvar FORCED = NEGATIVE_ZERO || !arrayMethodIsStrict('indexOf');\n\n// `Array.prototype.indexOf` method\n// https://tc39.es/ecma262/#sec-array.prototype.indexof\n$({ target: 'Array', proto: true, forced: FORCED }, {\n  indexOf: function indexOf(searchElement /* , fromIndex = 0 */) {\n    var fromIndex = arguments.length > 1 ? arguments[1] : undefined;\n    return NEGATIVE_ZERO\n      // convert -0 to +0\n      ? nativeIndexOf(this, searchElement, fromIndex) || 0\n      : $indexOf(this, searchElement, fromIndex);\n  }\n});\n","const isPlainObject = require('lodash.isplainobject')\n\nconst parser = require('postcss-selector-parser')\nconst parseSelector = parser()\n\nmodule.exports = {\n  isUsableColor(color, values) {\n    return isPlainObject(values) && color !== 'gray' && values[600]\n  },\n\n  /**\n   * @param {string} selector\n   */\n  commonTrailingPseudos(selector) {\n    let ast = parseSelector.astSync(selector)\n\n    /** @type {import('postcss-selector-parser').Pseudo[][]} */\n    let matrix = []\n\n    // Put the pseudo elements in reverse order in a sparse, column-major 2D array\n    for (let [i, sel] of ast.nodes.entries()) {\n      for (const [j, child] of [...sel.nodes].reverse().entries()) {\n        // We only care about pseudo elements\n        if (child.type !== 'pseudo' || !child.value.startsWith('::')) {\n          break\n        }\n\n        matrix[j] = matrix[j] || []\n        matrix[j][i] = child\n      }\n    }\n\n    let trailingPseudos = parser.selector()\n\n    // At this point the pseudo elements are in a column-major 2D array\n    // This means each row contains one \"column\" of pseudo elements from each selector\n    // We can compare all the pseudo elements in a row to see if they are the same\n    for (const pseudos of matrix) {\n      // It's a sparse 2D array so there are going to be holes in the rows\n      // We skip those\n      if (!pseudos) {\n        continue\n      }\n\n      let values = new Set(pseudos.map((p) => p.value))\n\n      // The pseudo elements are not the same\n      if (values.size > 1) {\n        break\n      }\n\n      pseudos.forEach((pseudo) => pseudo.remove())\n      trailingPseudos.prepend(pseudos[0])\n    }\n\n    if (trailingPseudos.nodes.length) {\n      return [trailingPseudos.toString(), ast.toString()]\n    }\n\n    return [null, selector]\n  },\n}\n","'use strict';\n// toObject with fallback for non-array-like ES3 strings\nvar IndexedObject = require('../internals/indexed-object');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n\nmodule.exports = function (it) {\n  return IndexedObject(requireObjectCoercible(it));\n};\n","'use strict';\nvar apply = require('../internals/function-apply');\nvar call = require('../internals/function-call');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar fixRegExpWellKnownSymbolLogic = require('../internals/fix-regexp-well-known-symbol-logic');\nvar fails = require('../internals/fails');\nvar anObject = require('../internals/an-object');\nvar isCallable = require('../internals/is-callable');\nvar isObject = require('../internals/is-object');\nvar toIntegerOrInfinity = require('../internals/to-integer-or-infinity');\nvar toLength = require('../internals/to-length');\nvar toString = require('../internals/to-string');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar advanceStringIndex = require('../internals/advance-string-index');\nvar getMethod = require('../internals/get-method');\nvar getSubstitution = require('../internals/get-substitution');\nvar getRegExpFlags = require('../internals/regexp-get-flags');\nvar regExpExec = require('../internals/regexp-exec-abstract');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar REPLACE = wellKnownSymbol('replace');\nvar max = Math.max;\nvar min = Math.min;\nvar concat = uncurryThis([].concat);\nvar push = uncurryThis([].push);\nvar stringIndexOf = uncurryThis(''.indexOf);\nvar stringSlice = uncurryThis(''.slice);\n\nvar maybeToString = function (it) {\n  return it === undefined ? it : String(it);\n};\n\n// IE <= 11 replaces $0 with the whole match, as if it was $&\n// https://stackoverflow.com/questions/6024666/getting-ie-to-replace-a-regex-with-the-literal-string-0\nvar REPLACE_KEEPS_$0 = (function () {\n  // eslint-disable-next-line regexp/prefer-escape-replacement-dollar-char -- required for testing\n  return 'a'.replace(/./, '$0') === '$0';\n})();\n\n// Safari <= 13.0.3(?) substitutes nth capture where n>m with an empty string\nvar REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE = (function () {\n  if (/./[REPLACE]) {\n    return /./[REPLACE]('a', '$0') === '';\n  }\n  return false;\n})();\n\nvar REPLACE_SUPPORTS_NAMED_GROUPS = !fails(function () {\n  var re = /./;\n  re.exec = function () {\n    var result = [];\n    result.groups = { a: '7' };\n    return result;\n  };\n  // eslint-disable-next-line regexp/no-useless-dollar-replacements -- false positive\n  return ''.replace(re, '$<a>') !== '7';\n});\n\n// @@replace logic\nfixRegExpWellKnownSymbolLogic('replace', function (_, nativeReplace, maybeCallNative) {\n  var UNSAFE_SUBSTITUTE = REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE ? '$' : '$0';\n\n  return [\n    // `String.prototype.replace` method\n    // https://tc39.es/ecma262/#sec-string.prototype.replace\n    function replace(searchValue, replaceValue) {\n      var O = requireObjectCoercible(this);\n      var replacer = isObject(searchValue) ? getMethod(searchValue, REPLACE) : undefined;\n      return replacer\n        ? call(replacer, searchValue, O, replaceValue)\n        : call(nativeReplace, toString(O), searchValue, replaceValue);\n    },\n    // `RegExp.prototype[@@replace]` method\n    // https://tc39.es/ecma262/#sec-regexp.prototype-@@replace\n    function (string, replaceValue) {\n      var rx = anObject(this);\n      var S = toString(string);\n\n      if (\n        typeof replaceValue == 'string' &&\n        stringIndexOf(replaceValue, UNSAFE_SUBSTITUTE) === -1 &&\n        stringIndexOf(replaceValue, '$<') === -1\n      ) {\n        var res = maybeCallNative(nativeReplace, rx, S, replaceValue);\n        if (res.done) return res.value;\n      }\n\n      var functionalReplace = isCallable(replaceValue);\n      if (!functionalReplace) replaceValue = toString(replaceValue);\n\n      var flags = toString(getRegExpFlags(rx));\n      var global = stringIndexOf(flags, 'g') !== -1;\n      var fullUnicode;\n      if (global) {\n        fullUnicode = stringIndexOf(flags, 'u') !== -1;\n        rx.lastIndex = 0;\n      }\n\n      var results = [];\n      var result;\n      while (true) {\n        result = regExpExec(rx, S);\n        if (result === null) break;\n\n        push(results, result);\n        if (!global) break;\n\n        var matchStr = toString(result[0]);\n        if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n      }\n\n      var accumulatedResult = '';\n      var nextSourcePosition = 0;\n      for (var i = 0; i < results.length; i++) {\n        result = results[i];\n\n        var matched = toString(result[0]);\n        var position = max(min(toIntegerOrInfinity(result.index), S.length), 0);\n        var captures = [];\n        var replacement;\n        // NOTE: This is equivalent to\n        //   captures = result.slice(1).map(maybeToString)\n        // but for some reason `nativeSlice.call(result, 1, result.length)` (called in\n        // the slice polyfill when slicing native arrays) \"doesn't work\" in safari 9 and\n        // causes a crash (https://pastebin.com/N21QzeQA) when trying to debug it.\n        for (var j = 1; j < result.length; j++) push(captures, maybeToString(result[j]));\n        var namedCaptures = result.groups;\n        if (functionalReplace) {\n          var replacerArgs = concat([matched], captures, position, S);\n          if (namedCaptures !== undefined) push(replacerArgs, namedCaptures);\n          replacement = toString(apply(replaceValue, undefined, replacerArgs));\n        } else {\n          replacement = getSubstitution(matched, S, position, captures, namedCaptures, replaceValue);\n        }\n        if (position >= nextSourcePosition) {\n          accumulatedResult += stringSlice(S, nextSourcePosition, position) + replacement;\n          nextSourcePosition = position + matched.length;\n        }\n      }\n\n      return accumulatedResult + stringSlice(S, nextSourcePosition);\n    }\n  ];\n}, !REPLACE_SUPPORTS_NAMED_GROUPS || !REPLACE_KEEPS_$0 || REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE);\n","'use strict';\nvar $ = require('../internals/export');\nvar $entries = require('../internals/object-to-array').entries;\n\n// `Object.entries` method\n// https://tc39.es/ecma262/#sec-object.entries\n$({ target: 'Object', stat: true }, {\n  entries: function entries(O) {\n    return $entries(O);\n  }\n});\n","/**\n * Isotope Item\n**/\n\n( function( window, factory ) {\n  // universal module definition\n  /* jshint strict: false */ /*globals define, module, require */\n  if ( typeof define == 'function' && define.amd ) {\n    // AMD\n    define( [\n        'outlayer/outlayer'\n      ],\n      factory );\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n      require('outlayer')\n    );\n  } else {\n    // browser global\n    window.Isotope = window.Isotope || {};\n    window.Isotope.Item = factory(\n      window.Outlayer\n    );\n  }\n\n}( window, function factory( Outlayer ) {\n'use strict';\n\n// -------------------------- Item -------------------------- //\n\n// sub-class Outlayer Item\nfunction Item() {\n  Outlayer.Item.apply( this, arguments );\n}\n\nvar proto = Item.prototype = Object.create( Outlayer.Item.prototype );\n\nvar _create = proto._create;\nproto._create = function() {\n  // assign id, used for original-order sorting\n  this.id = this.layout.itemGUID++;\n  _create.call( this );\n  this.sortData = {};\n};\n\nproto.updateSortData = function() {\n  if ( this.isIgnored ) {\n    return;\n  }\n  // default sorters\n  this.sortData.id = this.id;\n  // for backward compatibility\n  this.sortData['original-order'] = this.id;\n  this.sortData.random = Math.random();\n  // go thru getSortData obj and apply the sorters\n  var getSortData = this.layout.options.getSortData;\n  var sorters = this.layout._sorters;\n  for ( var key in getSortData ) {\n    var sorter = sorters[ key ];\n    this.sortData[ key ] = sorter( this.element, this );\n  }\n};\n\nvar _destroy = proto.destroy;\nproto.destroy = function() {\n  // call super\n  _destroy.apply( this, arguments );\n  // reset display, #741\n  this.css({\n    display: ''\n  });\n};\n\nreturn Item;\n\n}));\n","(function(window, factory) {\n\tif(!window) {return;}\n\tvar globalInstall = function(initialEvent){\n\t\tfactory(window.lazySizes, initialEvent);\n\t\twindow.removeEventListener('lazyunveilread', globalInstall, true);\n\t};\n\n\tfactory = factory.bind(null, window, window.document);\n\n\tif(typeof module == 'object' && module.exports){\n\t\tfactory(require('lazysizes'));\n\t} else if (typeof define == 'function' && define.amd) {\n\t\tdefine(['lazysizes'], factory);\n\t} else if(window.lazySizes) {\n\t\tglobalInstall();\n\t} else {\n\t\twindow.addEventListener('lazyunveilread', globalInstall, true);\n\t}\n}(typeof window != 'undefined' ?\n\twindow : 0, function(window, document, lazySizes, initialEvent) {\n\t'use strict';\n\tvar cloneElementClass;\n\tvar style = document.createElement('a').style;\n\tvar fitSupport = 'objectFit' in style;\n\tvar positionSupport = fitSupport && 'objectPosition' in style;\n\tvar regCssFit = /object-fit[\"']*\\s*:\\s*[\"']*(contain|cover)/;\n\tvar regCssPosition = /object-position[\"']*\\s*:\\s*[\"']*(.+?)(?=($|,|'|\"|;))/;\n\tvar blankSrc = 'data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==';\n\tvar regBgUrlEscape = /\\(|\\)|'/;\n\tvar positionDefaults = {\n\t\tcenter: 'center',\n\t\t'50% 50%': 'center',\n\t};\n\n\tfunction getObject(element){\n\t\tvar css = (getComputedStyle(element, null) || {});\n\t\tvar content = css.fontFamily || '';\n\t\tvar objectFit = content.match(regCssFit) || '';\n\t\tvar objectPosition = objectFit && content.match(regCssPosition) || '';\n\n\t\tif(objectPosition){\n\t\t\tobjectPosition = objectPosition[1];\n\t\t}\n\n\t\treturn {\n\t\t\tfit: objectFit && objectFit[1] || '',\n\t\t\tposition: positionDefaults[objectPosition] || objectPosition || 'center',\n\t\t};\n\t}\n\n\tfunction generateStyleClass() {\n\t\tif (cloneElementClass) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar styleElement = document.createElement('style');\n\n\t\tcloneElementClass = lazySizes.cfg.objectFitClass || 'lazysizes-display-clone';\n\n\t\tdocument.querySelector('head').appendChild(styleElement);\n\t}\n\n\tfunction removePrevClone(element) {\n\t\tvar prev = element.previousElementSibling;\n\n\t\tif (prev && lazySizes.hC(prev, cloneElementClass)) {\n\t\t\tprev.parentNode.removeChild(prev);\n\t\t\telement.style.position = prev.getAttribute('data-position') || '';\n\t\t\telement.style.visibility = prev.getAttribute('data-visibility') || '';\n\t\t}\n\t}\n\n\tfunction initFix(element, config){\n\t\tvar switchClassesAdded, addedSrc, styleElement, styleElementStyle;\n\t\tvar lazysizesCfg = lazySizes.cfg;\n\n\t\tvar onChange = function(){\n\t\t\tvar src = element.currentSrc || element.src;\n\n\t\t\tif(src && addedSrc !== src){\n\t\t\t\taddedSrc = src;\n\t\t\t\tstyleElementStyle.backgroundImage = 'url(' + (regBgUrlEscape.test(src) ? JSON.stringify(src) : src ) + ')';\n\n\t\t\t\tif(!switchClassesAdded){\n\t\t\t\t\tswitchClassesAdded = true;\n\t\t\t\t\tlazySizes.rC(styleElement, lazysizesCfg.loadingClass);\n\t\t\t\t\tlazySizes.aC(styleElement, lazysizesCfg.loadedClass);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\tvar rafedOnChange = function(){\n\t\t\tlazySizes.rAF(onChange);\n\t\t};\n\n\t\telement._lazysizesParentFit = config.fit;\n\n\t\telement.addEventListener('lazyloaded', rafedOnChange, true);\n\t\telement.addEventListener('load', rafedOnChange, true);\n\n\t\tlazySizes.rAF(function(){\n\n\t\t\tvar hideElement = element;\n\t\t\tvar container = element.parentNode;\n\n\t\t\tif(container.nodeName.toUpperCase() == 'PICTURE'){\n\t\t\t\thideElement = container;\n\t\t\t\tcontainer = container.parentNode;\n\t\t\t}\n\n\t\t\tremovePrevClone(hideElement);\n\n\t\t\tif (!cloneElementClass) {\n\t\t\t\tgenerateStyleClass();\n\t\t\t}\n\n\t\t\tstyleElement = element.cloneNode(false);\n\t\t\tstyleElementStyle = styleElement.style;\n\n\t\t\tstyleElement.addEventListener('load', function(){\n\t\t\t\tvar curSrc = styleElement.currentSrc || styleElement.src;\n\n\t\t\t\tif(curSrc && curSrc != blankSrc){\n\t\t\t\t\tstyleElement.src = blankSrc;\n\t\t\t\t\tstyleElement.srcset = '';\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tlazySizes.rC(styleElement, lazysizesCfg.loadedClass);\n\t\t\tlazySizes.rC(styleElement, lazysizesCfg.lazyClass);\n\t\t\tlazySizes.rC(styleElement, lazysizesCfg.autosizesClass);\n\t\t\tlazySizes.aC(styleElement, lazysizesCfg.loadingClass);\n\t\t\tlazySizes.aC(styleElement, cloneElementClass);\n\n\t\t\t['data-parent-fit', 'data-parent-container', 'data-object-fit-polyfilled',\n\t\t\t\tlazysizesCfg.srcsetAttr, lazysizesCfg.srcAttr].forEach(function(attr) {\n\t\t\t\tstyleElement.removeAttribute(attr);\n\t\t\t});\n\n\t\t\tstyleElement.src = blankSrc;\n\t\t\tstyleElement.srcset = '';\n\n\t\t\tstyleElementStyle.backgroundRepeat = 'no-repeat';\n\t\t\tstyleElementStyle.backgroundPosition = config.position;\n\t\t\tstyleElementStyle.backgroundSize = config.fit;\n\n\t\t\tstyleElement.setAttribute('data-position', hideElement.style.position);\n\t\t\tstyleElement.setAttribute('data-visibility', hideElement.style.visibility);\n\n\t\t\thideElement.style.visibility = 'hidden';\n\t\t\thideElement.style.position = 'absolute';\n\n\t\t\telement.setAttribute('data-parent-fit', config.fit);\n\t\t\telement.setAttribute('data-parent-container', 'prev');\n\t\t\telement.setAttribute('data-object-fit-polyfilled', '');\n\t\t\telement._objectFitPolyfilledDisplay = styleElement;\n\n\t\t\tcontainer.insertBefore(styleElement, hideElement);\n\n\t\t\tif(element._lazysizesParentFit){\n\t\t\t\tdelete element._lazysizesParentFit;\n\t\t\t}\n\n\t\t\tif(element.complete){\n\t\t\t\tonChange();\n\t\t\t}\n\t\t});\n\t}\n\n\tif(!fitSupport || !positionSupport){\n\t\tvar onRead = function(e){\n\t\t\tif(e.detail.instance != lazySizes){return;}\n\n\t\t\tvar element = e.target;\n\t\t\tvar obj = getObject(element);\n\n\t\t\tif(obj.fit && (!fitSupport || (obj.position != 'center'))){\n\t\t\t\tinitFix(element, obj);\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\treturn false;\n\t\t};\n\n\t\twindow.addEventListener('lazybeforesizes', function(e) {\n\t\t\tif(e.detail.instance != lazySizes){return;}\n\t\t\tvar element = e.target;\n\n\t\t\tif (element.getAttribute('data-object-fit-polyfilled') != null && !element._objectFitPolyfilledDisplay) {\n\t\t\t\tif(!onRead(e)){\n\t\t\t\t\tlazySizes.rAF(function () {\n\t\t\t\t\t\telement.removeAttribute('data-object-fit-polyfilled');\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\twindow.addEventListener('lazyunveilread', onRead, true);\n\n\t\tif(initialEvent && initialEvent.detail){\n\t\t\tonRead(initialEvent);\n\t\t}\n\t}\n}));\n","'use strict';\nvar isConstructor = require('../internals/is-constructor');\nvar tryToString = require('../internals/try-to-string');\n\nvar $TypeError = TypeError;\n\n// `Assert: IsConstructor(argument) is true`\nmodule.exports = function (argument) {\n  if (isConstructor(argument)) return argument;\n  throw new $TypeError(tryToString(argument) + ' is not a constructor');\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar globalThis = require('../internals/global-this');\nvar schedulersFix = require('../internals/schedulers-fix');\n\nvar setInterval = schedulersFix(globalThis.setInterval, true);\n\n// Bun / IE9- setInterval additional parameters fix\n// https://html.spec.whatwg.org/multipage/timers-and-user-prompts.html#dom-setinterval\n$({ global: true, bind: true, forced: globalThis.setInterval !== setInterval }, {\n  setInterval: setInterval\n});\n","'use strict';\nvar toIntegerOrInfinity = require('../internals/to-integer-or-infinity');\n\nvar max = Math.max;\nvar min = Math.min;\n\n// Helper for a popular repeating case of the spec:\n// Let integer be ? ToInteger(index).\n// If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length).\nmodule.exports = function (index, length) {\n  var integer = toIntegerOrInfinity(index);\n  return integer < 0 ? max(integer + length, 0) : min(integer, length);\n};\n","'use strict';\n// FF26- bug: ArrayBuffers are non-extensible, but Object.isExtensible does not report it\nvar fails = require('../internals/fails');\n\nmodule.exports = fails(function () {\n  if (typeof ArrayBuffer == 'function') {\n    var buffer = new ArrayBuffer(8);\n    // eslint-disable-next-line es/no-object-isextensible, es/no-object-defineproperty -- safe\n    if (Object.isExtensible(buffer)) Object.defineProperty(buffer, 'a', { value: 8 });\n  }\n});\n","'use strict';\nvar defineWellKnownSymbol = require('../internals/well-known-symbol-define');\nvar defineSymbolToPrimitive = require('../internals/symbol-define-to-primitive');\n\n// `Symbol.toPrimitive` well-known symbol\n// https://tc39.es/ecma262/#sec-symbol.toprimitive\ndefineWellKnownSymbol('toPrimitive');\n\n// `Symbol.prototype[@@toPrimitive]` method\n// https://tc39.es/ecma262/#sec-symbol.prototype-@@toprimitive\ndefineSymbolToPrimitive();\n","'use strict';\nvar store = require('../internals/shared-store');\n\nmodule.exports = function (key, value) {\n  return store[key] || (store[key] = value || {});\n};\n","'use strict';\nvar FREEZING = require('../internals/freezing');\nvar globalThis = require('../internals/global-this');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar defineBuiltIns = require('../internals/define-built-ins');\nvar InternalMetadataModule = require('../internals/internal-metadata');\nvar collection = require('../internals/collection');\nvar collectionWeak = require('../internals/collection-weak');\nvar isObject = require('../internals/is-object');\nvar enforceInternalState = require('../internals/internal-state').enforce;\nvar fails = require('../internals/fails');\nvar NATIVE_WEAK_MAP = require('../internals/weak-map-basic-detection');\n\nvar $Object = Object;\n// eslint-disable-next-line es/no-array-isarray -- safe\nvar isArray = Array.isArray;\n// eslint-disable-next-line es/no-object-isextensible -- safe\nvar isExtensible = $Object.isExtensible;\n// eslint-disable-next-line es/no-object-isfrozen -- safe\nvar isFrozen = $Object.isFrozen;\n// eslint-disable-next-line es/no-object-issealed -- safe\nvar isSealed = $Object.isSealed;\n// eslint-disable-next-line es/no-object-freeze -- safe\nvar freeze = $Object.freeze;\n// eslint-disable-next-line es/no-object-seal -- safe\nvar seal = $Object.seal;\n\nvar IS_IE11 = !globalThis.ActiveXObject && 'ActiveXObject' in globalThis;\nvar InternalWeakMap;\n\nvar wrapper = function (init) {\n  return function WeakMap() {\n    return init(this, arguments.length ? arguments[0] : undefined);\n  };\n};\n\n// `WeakMap` constructor\n// https://tc39.es/ecma262/#sec-weakmap-constructor\nvar $WeakMap = collection('WeakMap', wrapper, collectionWeak);\nvar WeakMapPrototype = $WeakMap.prototype;\nvar nativeSet = uncurryThis(WeakMapPrototype.set);\n\n// Chakra Edge bug: adding frozen arrays to WeakMap unfreeze them\nvar hasMSEdgeFreezingBug = function () {\n  return FREEZING && fails(function () {\n    var frozenArray = freeze([]);\n    nativeSet(new $WeakMap(), frozenArray, 1);\n    return !isFrozen(frozenArray);\n  });\n};\n\n// IE11 WeakMap frozen keys fix\n// We can't use feature detection because it crash some old IE builds\n// https://github.com/zloirock/core-js/issues/485\nif (NATIVE_WEAK_MAP) if (IS_IE11) {\n  InternalWeakMap = collectionWeak.getConstructor(wrapper, 'WeakMap', true);\n  InternalMetadataModule.enable();\n  var nativeDelete = uncurryThis(WeakMapPrototype['delete']);\n  var nativeHas = uncurryThis(WeakMapPrototype.has);\n  var nativeGet = uncurryThis(WeakMapPrototype.get);\n  defineBuiltIns(WeakMapPrototype, {\n    'delete': function (key) {\n      if (isObject(key) && !isExtensible(key)) {\n        var state = enforceInternalState(this);\n        if (!state.frozen) state.frozen = new InternalWeakMap();\n        return nativeDelete(this, key) || state.frozen['delete'](key);\n      } return nativeDelete(this, key);\n    },\n    has: function has(key) {\n      if (isObject(key) && !isExtensible(key)) {\n        var state = enforceInternalState(this);\n        if (!state.frozen) state.frozen = new InternalWeakMap();\n        return nativeHas(this, key) || state.frozen.has(key);\n      } return nativeHas(this, key);\n    },\n    get: function get(key) {\n      if (isObject(key) && !isExtensible(key)) {\n        var state = enforceInternalState(this);\n        if (!state.frozen) state.frozen = new InternalWeakMap();\n        return nativeHas(this, key) ? nativeGet(this, key) : state.frozen.get(key);\n      } return nativeGet(this, key);\n    },\n    set: function set(key, value) {\n      if (isObject(key) && !isExtensible(key)) {\n        var state = enforceInternalState(this);\n        if (!state.frozen) state.frozen = new InternalWeakMap();\n        nativeHas(this, key) ? nativeSet(this, key, value) : state.frozen.set(key, value);\n      } else nativeSet(this, key, value);\n      return this;\n    }\n  });\n// Chakra Edge frozen keys fix\n} else if (hasMSEdgeFreezingBug()) {\n  defineBuiltIns(WeakMapPrototype, {\n    set: function set(key, value) {\n      var arrayIntegrityLevel;\n      if (isArray(key)) {\n        if (isFrozen(key)) arrayIntegrityLevel = freeze;\n        else if (isSealed(key)) arrayIntegrityLevel = seal;\n      }\n      nativeSet(this, key, value);\n      if (arrayIntegrityLevel) arrayIntegrityLevel(key);\n      return this;\n    }\n  });\n}\n","'use strict';\nvar isRegExp = require('../internals/is-regexp');\n\nvar $TypeError = TypeError;\n\nmodule.exports = function (it) {\n  if (isRegExp(it)) {\n    throw new $TypeError(\"The method doesn't accept regular expressions\");\n  } return it;\n};\n","'use strict';\nvar isObject = require('../internals/is-object');\nvar getInternalState = require('../internals/internal-state').get;\n\nmodule.exports = function isRawJSON(O) {\n  if (!isObject(O)) return false;\n  var state = getInternalState(O);\n  return !!state && state.type === 'RawJSON';\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nObject.defineProperty(exports, \"default\", {\n    enumerable: true,\n    get: function() {\n        return negateValue;\n    }\n});\nfunction negateValue(value) {\n    value = `${value}`;\n    if (value === \"0\") {\n        return \"0\";\n    }\n    // Flip sign of numbers\n    if (/^[+-]?(\\d+|\\d*\\.\\d+)(e[+-]?\\d+)?(%|\\w+)?$/.test(value)) {\n        return value.replace(/^[+-]?/, (sign)=>sign === \"-\" ? \"\" : \"-\");\n    }\n    // What functions we support negating numeric values for\n    // var() isn't inherently a numeric function but we support it anyway\n    // The trigonometric functions are omitted because you'll need to use calc(…) with them _anyway_\n    // to produce generally useful results and that will be covered already\n    let numericFunctions = [\n        \"var\",\n        \"calc\",\n        \"min\",\n        \"max\",\n        \"clamp\"\n    ];\n    for (const fn of numericFunctions){\n        if (value.includes(`${fn}(`)) {\n            return `calc(${value} * -1)`;\n        }\n    }\n}\n","'use strict';\nvar $ = require('../internals/export');\nvar isSubsetOf = require('../internals/set-is-subset-of');\nvar setMethodAcceptSetLike = require('../internals/set-method-accept-set-like');\n\nvar INCORRECT = !setMethodAcceptSetLike('isSubsetOf', function (result) {\n  return result;\n});\n\n// `Set.prototype.isSubsetOf` method\n// https://tc39.es/ecma262/#sec-set.prototype.issubsetof\n$({ target: 'Set', proto: true, real: true, forced: INCORRECT }, {\n  isSubsetOf: isSubsetOf\n});\n","function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }\n\n/*!\n * GSAP 3.14.2\n * https://gsap.com\n *\n * @license Copyright 2008-2025, GreenSock. All rights reserved.\n * Subject to the terms at https://gsap.com/standard-license\n * @author: Jack Doyle, jack@greensock.com\n*/\n\n/* eslint-disable */\nvar _config = {\n  autoSleep: 120,\n  force3D: \"auto\",\n  nullTargetWarn: 1,\n  units: {\n    lineHeight: \"\"\n  }\n},\n    _defaults = {\n  duration: .5,\n  overwrite: false,\n  delay: 0\n},\n    _suppressOverwrites,\n    _reverting,\n    _context,\n    _bigNum = 1e8,\n    _tinyNum = 1 / _bigNum,\n    _2PI = Math.PI * 2,\n    _HALF_PI = _2PI / 4,\n    _gsID = 0,\n    _sqrt = Math.sqrt,\n    _cos = Math.cos,\n    _sin = Math.sin,\n    _isString = function _isString(value) {\n  return typeof value === \"string\";\n},\n    _isFunction = function _isFunction(value) {\n  return typeof value === \"function\";\n},\n    _isNumber = function _isNumber(value) {\n  return typeof value === \"number\";\n},\n    _isUndefined = function _isUndefined(value) {\n  return typeof value === \"undefined\";\n},\n    _isObject = function _isObject(value) {\n  return typeof value === \"object\";\n},\n    _isNotFalse = function _isNotFalse(value) {\n  return value !== false;\n},\n    _windowExists = function _windowExists() {\n  return typeof window !== \"undefined\";\n},\n    _isFuncOrString = function _isFuncOrString(value) {\n  return _isFunction(value) || _isString(value);\n},\n    _isTypedArray = typeof ArrayBuffer === \"function\" && ArrayBuffer.isView || function () {},\n    // note: IE10 has ArrayBuffer, but NOT ArrayBuffer.isView().\n_isArray = Array.isArray,\n    _randomExp = /random\\([^)]+\\)/g,\n    _commaDelimExp = /,\\s*/g,\n    _strictNumExp = /(?:-?\\.?\\d|\\.)+/gi,\n    //only numbers (including negatives and decimals) but NOT relative values.\n_numExp = /[-+=.]*\\d+[.e\\-+]*\\d*[e\\-+]*\\d*/g,\n    //finds any numbers, including ones that start with += or -=, negative numbers, and ones in scientific notation like 1e-8.\n_numWithUnitExp = /[-+=.]*\\d+[.e-]*\\d*[a-z%]*/g,\n    _complexStringNumExp = /[-+=.]*\\d+\\.?\\d*(?:e-|e\\+)?\\d*/gi,\n    //duplicate so that while we're looping through matches from exec(), it doesn't contaminate the lastIndex of _numExp which we use to search for colors too.\n_relExp = /[+-]=-?[.\\d]+/,\n    _delimitedValueExp = /[^,'\"\\[\\]\\s]+/gi,\n    // previously /[#\\-+.]*\\b[a-z\\d\\-=+%.]+/gi but didn't catch special characters.\n_unitExp = /^[+\\-=e\\s\\d]*\\d+[.\\d]*([a-z]*|%)\\s*$/i,\n    _globalTimeline,\n    _win,\n    _coreInitted,\n    _doc,\n    _globals = {},\n    _installScope = {},\n    _coreReady,\n    _install = function _install(scope) {\n  return (_installScope = _merge(scope, _globals)) && gsap;\n},\n    _missingPlugin = function _missingPlugin(property, value) {\n  return console.warn(\"Invalid property\", property, \"set to\", value, \"Missing plugin? gsap.registerPlugin()\");\n},\n    _warn = function _warn(message, suppress) {\n  return !suppress && console.warn(message);\n},\n    _addGlobal = function _addGlobal(name, obj) {\n  return name && (_globals[name] = obj) && _installScope && (_installScope[name] = obj) || _globals;\n},\n    _emptyFunc = function _emptyFunc() {\n  return 0;\n},\n    _startAtRevertConfig = {\n  suppressEvents: true,\n  isStart: true,\n  kill: false\n},\n    _revertConfigNoKill = {\n  suppressEvents: true,\n  kill: false\n},\n    _revertConfig = {\n  suppressEvents: true\n},\n    _reservedProps = {},\n    _lazyTweens = [],\n    _lazyLookup = {},\n    _lastRenderedFrame,\n    _plugins = {},\n    _effects = {},\n    _nextGCFrame = 30,\n    _harnessPlugins = [],\n    _callbackNames = \"\",\n    _harness = function _harness(targets) {\n  var target = targets[0],\n      harnessPlugin,\n      i;\n  _isObject(target) || _isFunction(target) || (targets = [targets]);\n\n  if (!(harnessPlugin = (target._gsap || {}).harness)) {\n    // find the first target with a harness. We assume targets passed into an animation will be of similar type, meaning the same kind of harness can be used for them all (performance optimization)\n    i = _harnessPlugins.length;\n\n    while (i-- && !_harnessPlugins[i].targetTest(target)) {}\n\n    harnessPlugin = _harnessPlugins[i];\n  }\n\n  i = targets.length;\n\n  while (i--) {\n    targets[i] && (targets[i]._gsap || (targets[i]._gsap = new GSCache(targets[i], harnessPlugin))) || targets.splice(i, 1);\n  }\n\n  return targets;\n},\n    _getCache = function _getCache(target) {\n  return target._gsap || _harness(toArray(target))[0]._gsap;\n},\n    _getProperty = function _getProperty(target, property, v) {\n  return (v = target[property]) && _isFunction(v) ? target[property]() : _isUndefined(v) && target.getAttribute && target.getAttribute(property) || v;\n},\n    _forEachName = function _forEachName(names, func) {\n  return (names = names.split(\",\")).forEach(func) || names;\n},\n    //split a comma-delimited list of names into an array, then run a forEach() function and return the split array (this is just a way to consolidate/shorten some code).\n_round = function _round(value) {\n  return Math.round(value * 100000) / 100000 || 0;\n},\n    _roundPrecise = function _roundPrecise(value) {\n  return Math.round(value * 10000000) / 10000000 || 0;\n},\n    // increased precision mostly for timing values.\n_parseRelative = function _parseRelative(start, value) {\n  var operator = value.charAt(0),\n      end = parseFloat(value.substr(2));\n  start = parseFloat(start);\n  return operator === \"+\" ? start + end : operator === \"-\" ? start - end : operator === \"*\" ? start * end : start / end;\n},\n    _arrayContainsAny = function _arrayContainsAny(toSearch, toFind) {\n  //searches one array to find matches for any of the items in the toFind array. As soon as one is found, it returns true. It does NOT return all the matches; it's simply a boolean search.\n  var l = toFind.length,\n      i = 0;\n\n  for (; toSearch.indexOf(toFind[i]) < 0 && ++i < l;) {}\n\n  return i < l;\n},\n    _lazyRender = function _lazyRender() {\n  var l = _lazyTweens.length,\n      a = _lazyTweens.slice(0),\n      i,\n      tween;\n\n  _lazyLookup = {};\n  _lazyTweens.length = 0;\n\n  for (i = 0; i < l; i++) {\n    tween = a[i];\n    tween && tween._lazy && (tween.render(tween._lazy[0], tween._lazy[1], true)._lazy = 0);\n  }\n},\n    _isRevertWorthy = function _isRevertWorthy(animation) {\n  return !!(animation._initted || animation._startAt || animation.add);\n},\n    _lazySafeRender = function _lazySafeRender(animation, time, suppressEvents, force) {\n  _lazyTweens.length && !_reverting && _lazyRender();\n  animation.render(time, suppressEvents, force || !!(_reverting && time < 0 && _isRevertWorthy(animation)));\n  _lazyTweens.length && !_reverting && _lazyRender(); //in case rendering caused any tweens to lazy-init, we should render them because typically when someone calls seek() or time() or progress(), they expect an immediate render.\n},\n    _numericIfPossible = function _numericIfPossible(value) {\n  var n = parseFloat(value);\n  return (n || n === 0) && (value + \"\").match(_delimitedValueExp).length < 2 ? n : _isString(value) ? value.trim() : value;\n},\n    _passThrough = function _passThrough(p) {\n  return p;\n},\n    _setDefaults = function _setDefaults(obj, defaults) {\n  for (var p in defaults) {\n    p in obj || (obj[p] = defaults[p]);\n  }\n\n  return obj;\n},\n    _setKeyframeDefaults = function _setKeyframeDefaults(excludeDuration) {\n  return function (obj, defaults) {\n    for (var p in defaults) {\n      p in obj || p === \"duration\" && excludeDuration || p === \"ease\" || (obj[p] = defaults[p]);\n    }\n  };\n},\n    _merge = function _merge(base, toMerge) {\n  for (var p in toMerge) {\n    base[p] = toMerge[p];\n  }\n\n  return base;\n},\n    _mergeDeep = function _mergeDeep(base, toMerge) {\n  for (var p in toMerge) {\n    p !== \"__proto__\" && p !== \"constructor\" && p !== \"prototype\" && (base[p] = _isObject(toMerge[p]) ? _mergeDeep(base[p] || (base[p] = {}), toMerge[p]) : toMerge[p]);\n  }\n\n  return base;\n},\n    _copyExcluding = function _copyExcluding(obj, excluding) {\n  var copy = {},\n      p;\n\n  for (p in obj) {\n    p in excluding || (copy[p] = obj[p]);\n  }\n\n  return copy;\n},\n    _inheritDefaults = function _inheritDefaults(vars) {\n  var parent = vars.parent || _globalTimeline,\n      func = vars.keyframes ? _setKeyframeDefaults(_isArray(vars.keyframes)) : _setDefaults;\n\n  if (_isNotFalse(vars.inherit)) {\n    while (parent) {\n      func(vars, parent.vars.defaults);\n      parent = parent.parent || parent._dp;\n    }\n  }\n\n  return vars;\n},\n    _arraysMatch = function _arraysMatch(a1, a2) {\n  var i = a1.length,\n      match = i === a2.length;\n\n  while (match && i-- && a1[i] === a2[i]) {}\n\n  return i < 0;\n},\n    _addLinkedListItem = function _addLinkedListItem(parent, child, firstProp, lastProp, sortBy) {\n  if (firstProp === void 0) {\n    firstProp = \"_first\";\n  }\n\n  if (lastProp === void 0) {\n    lastProp = \"_last\";\n  }\n\n  var prev = parent[lastProp],\n      t;\n\n  if (sortBy) {\n    t = child[sortBy];\n\n    while (prev && prev[sortBy] > t) {\n      prev = prev._prev;\n    }\n  }\n\n  if (prev) {\n    child._next = prev._next;\n    prev._next = child;\n  } else {\n    child._next = parent[firstProp];\n    parent[firstProp] = child;\n  }\n\n  if (child._next) {\n    child._next._prev = child;\n  } else {\n    parent[lastProp] = child;\n  }\n\n  child._prev = prev;\n  child.parent = child._dp = parent;\n  return child;\n},\n    _removeLinkedListItem = function _removeLinkedListItem(parent, child, firstProp, lastProp) {\n  if (firstProp === void 0) {\n    firstProp = \"_first\";\n  }\n\n  if (lastProp === void 0) {\n    lastProp = \"_last\";\n  }\n\n  var prev = child._prev,\n      next = child._next;\n\n  if (prev) {\n    prev._next = next;\n  } else if (parent[firstProp] === child) {\n    parent[firstProp] = next;\n  }\n\n  if (next) {\n    next._prev = prev;\n  } else if (parent[lastProp] === child) {\n    parent[lastProp] = prev;\n  }\n\n  child._next = child._prev = child.parent = null; // don't delete the _dp just so we can revert if necessary. But parent should be null to indicate the item isn't in a linked list.\n},\n    _removeFromParent = function _removeFromParent(child, onlyIfParentHasAutoRemove) {\n  child.parent && (!onlyIfParentHasAutoRemove || child.parent.autoRemoveChildren) && child.parent.remove && child.parent.remove(child);\n  child._act = 0;\n},\n    _uncache = function _uncache(animation, child) {\n  if (animation && (!child || child._end > animation._dur || child._start < 0)) {\n    // performance optimization: if a child animation is passed in we should only uncache if that child EXTENDS the animation (its end time is beyond the end)\n    var a = animation;\n\n    while (a) {\n      a._dirty = 1;\n      a = a.parent;\n    }\n  }\n\n  return animation;\n},\n    _recacheAncestors = function _recacheAncestors(animation) {\n  var parent = animation.parent;\n\n  while (parent && parent.parent) {\n    //sometimes we must force a re-sort of all children and update the duration/totalDuration of all ancestor timelines immediately in case, for example, in the middle of a render loop, one tween alters another tween's timeScale which shoves its startTime before 0, forcing the parent timeline to shift around and shiftChildren() which could affect that next tween's render (startTime). Doesn't matter for the root timeline though.\n    parent._dirty = 1;\n    parent.totalDuration();\n    parent = parent.parent;\n  }\n\n  return animation;\n},\n    _rewindStartAt = function _rewindStartAt(tween, totalTime, suppressEvents, force) {\n  return tween._startAt && (_reverting ? tween._startAt.revert(_revertConfigNoKill) : tween.vars.immediateRender && !tween.vars.autoRevert || tween._startAt.render(totalTime, true, force));\n},\n    _hasNoPausedAncestors = function _hasNoPausedAncestors(animation) {\n  return !animation || animation._ts && _hasNoPausedAncestors(animation.parent);\n},\n    _elapsedCycleDuration = function _elapsedCycleDuration(animation) {\n  return animation._repeat ? _animationCycle(animation._tTime, animation = animation.duration() + animation._rDelay) * animation : 0;\n},\n    // feed in the totalTime and cycleDuration and it'll return the cycle (iteration minus 1) and if the playhead is exactly at the very END, it will NOT bump up to the next cycle.\n_animationCycle = function _animationCycle(tTime, cycleDuration) {\n  var whole = Math.floor(tTime = _roundPrecise(tTime / cycleDuration));\n  return tTime && whole === tTime ? whole - 1 : whole;\n},\n    _parentToChildTotalTime = function _parentToChildTotalTime(parentTime, child) {\n  return (parentTime - child._start) * child._ts + (child._ts >= 0 ? 0 : child._dirty ? child.totalDuration() : child._tDur);\n},\n    _setEnd = function _setEnd(animation) {\n  return animation._end = _roundPrecise(animation._start + (animation._tDur / Math.abs(animation._ts || animation._rts || _tinyNum) || 0));\n},\n    _alignPlayhead = function _alignPlayhead(animation, totalTime) {\n  // adjusts the animation's _start and _end according to the provided totalTime (only if the parent's smoothChildTiming is true and the animation isn't paused). It doesn't do any rendering or forcing things back into parent timelines, etc. - that's what totalTime() is for.\n  var parent = animation._dp;\n\n  if (parent && parent.smoothChildTiming && animation._ts) {\n    animation._start = _roundPrecise(parent._time - (animation._ts > 0 ? totalTime / animation._ts : ((animation._dirty ? animation.totalDuration() : animation._tDur) - totalTime) / -animation._ts));\n\n    _setEnd(animation);\n\n    parent._dirty || _uncache(parent, animation); //for performance improvement. If the parent's cache is already dirty, it already took care of marking the ancestors as dirty too, so skip the function call here.\n  }\n\n  return animation;\n},\n\n/*\n_totalTimeToTime = (clampedTotalTime, duration, repeat, repeatDelay, yoyo) => {\n\tlet cycleDuration = duration + repeatDelay,\n\t\ttime = _round(clampedTotalTime % cycleDuration);\n\tif (time > duration) {\n\t\ttime = duration;\n\t}\n\treturn (yoyo && (~~(clampedTotalTime / cycleDuration) & 1)) ? duration - time : time;\n},\n*/\n_postAddChecks = function _postAddChecks(timeline, child) {\n  var t;\n\n  if (child._time || !child._dur && child._initted || child._start < timeline._time && (child._dur || !child.add)) {\n    // in case, for example, the _start is moved on a tween that has already rendered, or if it's being inserted into a timeline BEFORE where the playhead is currently. Imagine it's at its end state, then the startTime is moved WAY later (after the end of this timeline), it should render at its beginning. Special case: if it's a timeline (has .add() method) and no duration, we can skip rendering because the user may be populating it AFTER adding it to a parent timeline (unconventional, but possible, and we wouldn't want it to get removed if the parent's autoRemoveChildren is true).\n    t = _parentToChildTotalTime(timeline.rawTime(), child);\n\n    if (!child._dur || _clamp(0, child.totalDuration(), t) - child._tTime > _tinyNum) {\n      child.render(t, true);\n    }\n  } //if the timeline has already ended but the inserted tween/timeline extends the duration, we should enable this timeline again so that it renders properly. We should also align the playhead with the parent timeline's when appropriate.\n\n\n  if (_uncache(timeline, child)._dp && timeline._initted && timeline._time >= timeline._dur && timeline._ts) {\n    //in case any of the ancestors had completed but should now be enabled...\n    if (timeline._dur < timeline.duration()) {\n      t = timeline;\n\n      while (t._dp) {\n        t.rawTime() >= 0 && t.totalTime(t._tTime); //moves the timeline (shifts its startTime) if necessary, and also enables it. If it's currently zero, though, it may not be scheduled to render until later so there's no need to force it to align with the current playhead position. Only move to catch up with the playhead.\n\n        t = t._dp;\n      }\n    }\n\n    timeline._zTime = -_tinyNum; // helps ensure that the next render() will be forced (crossingStart = true in render()), even if the duration hasn't changed (we're adding a child which would need to get rendered). Definitely an edge case. Note: we MUST do this AFTER the loop above where the totalTime() might trigger a render() because this _addToTimeline() method gets called from the Animation constructor, BEFORE tweens even record their targets, etc. so we wouldn't want things to get triggered in the wrong order.\n  }\n},\n    _addToTimeline = function _addToTimeline(timeline, child, position, skipChecks) {\n  child.parent && _removeFromParent(child);\n  child._start = _roundPrecise((_isNumber(position) ? position : position || timeline !== _globalTimeline ? _parsePosition(timeline, position, child) : timeline._time) + child._delay);\n  child._end = _roundPrecise(child._start + (child.totalDuration() / Math.abs(child.timeScale()) || 0));\n\n  _addLinkedListItem(timeline, child, \"_first\", \"_last\", timeline._sort ? \"_start\" : 0);\n\n  _isFromOrFromStart(child) || (timeline._recent = child);\n  skipChecks || _postAddChecks(timeline, child);\n  timeline._ts < 0 && _alignPlayhead(timeline, timeline._tTime); // if the timeline is reversed and the new child makes it longer, we may need to adjust the parent's _start (push it back)\n\n  return timeline;\n},\n    _scrollTrigger = function _scrollTrigger(animation, trigger) {\n  return (_globals.ScrollTrigger || _missingPlugin(\"scrollTrigger\", trigger)) && _globals.ScrollTrigger.create(trigger, animation);\n},\n    _attemptInitTween = function _attemptInitTween(tween, time, force, suppressEvents, tTime) {\n  _initTween(tween, time, tTime);\n\n  if (!tween._initted) {\n    return 1;\n  }\n\n  if (!force && tween._pt && !_reverting && (tween._dur && tween.vars.lazy !== false || !tween._dur && tween.vars.lazy) && _lastRenderedFrame !== _ticker.frame) {\n    _lazyTweens.push(tween);\n\n    tween._lazy = [tTime, suppressEvents];\n    return 1;\n  }\n},\n    _parentPlayheadIsBeforeStart = function _parentPlayheadIsBeforeStart(_ref) {\n  var parent = _ref.parent;\n  return parent && parent._ts && parent._initted && !parent._lock && (parent.rawTime() < 0 || _parentPlayheadIsBeforeStart(parent));\n},\n    // check parent's _lock because when a timeline repeats/yoyos and does its artificial wrapping, we shouldn't force the ratio back to 0\n_isFromOrFromStart = function _isFromOrFromStart(_ref2) {\n  var data = _ref2.data;\n  return data === \"isFromStart\" || data === \"isStart\";\n},\n    _renderZeroDurationTween = function _renderZeroDurationTween(tween, totalTime, suppressEvents, force) {\n  var prevRatio = tween.ratio,\n      ratio = totalTime < 0 || !totalTime && (!tween._start && _parentPlayheadIsBeforeStart(tween) && !(!tween._initted && _isFromOrFromStart(tween)) || (tween._ts < 0 || tween._dp._ts < 0) && !_isFromOrFromStart(tween)) ? 0 : 1,\n      // if the tween or its parent is reversed and the totalTime is 0, we should go to a ratio of 0. Edge case: if a from() or fromTo() stagger tween is placed later in a timeline, the \"startAt\" zero-duration tween could initially render at a time when the parent timeline's playhead is technically BEFORE where this tween is, so make sure that any \"from\" and \"fromTo\" startAt tweens are rendered the first time at a ratio of 1.\n  repeatDelay = tween._rDelay,\n      tTime = 0,\n      pt,\n      iteration,\n      prevIteration;\n\n  if (repeatDelay && tween._repeat) {\n    // in case there's a zero-duration tween that has a repeat with a repeatDelay\n    tTime = _clamp(0, tween._tDur, totalTime);\n    iteration = _animationCycle(tTime, repeatDelay);\n    tween._yoyo && iteration & 1 && (ratio = 1 - ratio);\n\n    if (iteration !== _animationCycle(tween._tTime, repeatDelay)) {\n      // if iteration changed\n      prevRatio = 1 - ratio;\n      tween.vars.repeatRefresh && tween._initted && tween.invalidate();\n    }\n  }\n\n  if (ratio !== prevRatio || _reverting || force || tween._zTime === _tinyNum || !totalTime && tween._zTime) {\n    if (!tween._initted && _attemptInitTween(tween, totalTime, force, suppressEvents, tTime)) {\n      // if we render the very beginning (time == 0) of a fromTo(), we must force the render (normal tweens wouldn't need to render at a time of 0 when the prevTime was also 0). This is also mandatory to make sure overwriting kicks in immediately.\n      return;\n    }\n\n    prevIteration = tween._zTime;\n    tween._zTime = totalTime || (suppressEvents ? _tinyNum : 0); // when the playhead arrives at EXACTLY time 0 (right on top) of a zero-duration tween, we need to discern if events are suppressed so that when the playhead moves again (next time), it'll trigger the callback. If events are NOT suppressed, obviously the callback would be triggered in this render. Basically, the callback should fire either when the playhead ARRIVES or LEAVES this exact spot, not both. Imagine doing a timeline.seek(0) and there's a callback that sits at 0. Since events are suppressed on that seek() by default, nothing will fire, but when the playhead moves off of that position, the callback should fire. This behavior is what people intuitively expect.\n\n    suppressEvents || (suppressEvents = totalTime && !prevIteration); // if it was rendered previously at exactly 0 (_zTime) and now the playhead is moving away, DON'T fire callbacks otherwise they'll seem like duplicates.\n\n    tween.ratio = ratio;\n    tween._from && (ratio = 1 - ratio);\n    tween._time = 0;\n    tween._tTime = tTime;\n    pt = tween._pt;\n\n    while (pt) {\n      pt.r(ratio, pt.d);\n      pt = pt._next;\n    }\n\n    totalTime < 0 && _rewindStartAt(tween, totalTime, suppressEvents, true);\n    tween._onUpdate && !suppressEvents && _callback(tween, \"onUpdate\");\n    tTime && tween._repeat && !suppressEvents && tween.parent && _callback(tween, \"onRepeat\");\n\n    if ((totalTime >= tween._tDur || totalTime < 0) && tween.ratio === ratio) {\n      ratio && _removeFromParent(tween, 1);\n\n      if (!suppressEvents && !_reverting) {\n        _callback(tween, ratio ? \"onComplete\" : \"onReverseComplete\", true);\n\n        tween._prom && tween._prom();\n      }\n    }\n  } else if (!tween._zTime) {\n    tween._zTime = totalTime;\n  }\n},\n    _findNextPauseTween = function _findNextPauseTween(animation, prevTime, time) {\n  var child;\n\n  if (time > prevTime) {\n    child = animation._first;\n\n    while (child && child._start <= time) {\n      if (child.data === \"isPause\" && child._start > prevTime) {\n        return child;\n      }\n\n      child = child._next;\n    }\n  } else {\n    child = animation._last;\n\n    while (child && child._start >= time) {\n      if (child.data === \"isPause\" && child._start < prevTime) {\n        return child;\n      }\n\n      child = child._prev;\n    }\n  }\n},\n    _setDuration = function _setDuration(animation, duration, skipUncache, leavePlayhead) {\n  var repeat = animation._repeat,\n      dur = _roundPrecise(duration) || 0,\n      totalProgress = animation._tTime / animation._tDur;\n  totalProgress && !leavePlayhead && (animation._time *= dur / animation._dur);\n  animation._dur = dur;\n  animation._tDur = !repeat ? dur : repeat < 0 ? 1e10 : _roundPrecise(dur * (repeat + 1) + animation._rDelay * repeat);\n  totalProgress > 0 && !leavePlayhead && _alignPlayhead(animation, animation._tTime = animation._tDur * totalProgress);\n  animation.parent && _setEnd(animation);\n  skipUncache || _uncache(animation.parent, animation);\n  return animation;\n},\n    _onUpdateTotalDuration = function _onUpdateTotalDuration(animation) {\n  return animation instanceof Timeline ? _uncache(animation) : _setDuration(animation, animation._dur);\n},\n    _zeroPosition = {\n  _start: 0,\n  endTime: _emptyFunc,\n  totalDuration: _emptyFunc\n},\n    _parsePosition = function _parsePosition(animation, position, percentAnimation) {\n  var labels = animation.labels,\n      recent = animation._recent || _zeroPosition,\n      clippedDuration = animation.duration() >= _bigNum ? recent.endTime(false) : animation._dur,\n      //in case there's a child that infinitely repeats, users almost never intend for the insertion point of a new child to be based on a SUPER long value like that so we clip it and assume the most recently-added child's endTime should be used instead.\n  i,\n      offset,\n      isPercent;\n\n  if (_isString(position) && (isNaN(position) || position in labels)) {\n    //if the string is a number like \"1\", check to see if there's a label with that name, otherwise interpret it as a number (absolute value).\n    offset = position.charAt(0);\n    isPercent = position.substr(-1) === \"%\";\n    i = position.indexOf(\"=\");\n\n    if (offset === \"<\" || offset === \">\") {\n      i >= 0 && (position = position.replace(/=/, \"\"));\n      return (offset === \"<\" ? recent._start : recent.endTime(recent._repeat >= 0)) + (parseFloat(position.substr(1)) || 0) * (isPercent ? (i < 0 ? recent : percentAnimation).totalDuration() / 100 : 1);\n    }\n\n    if (i < 0) {\n      position in labels || (labels[position] = clippedDuration);\n      return labels[position];\n    }\n\n    offset = parseFloat(position.charAt(i - 1) + position.substr(i + 1));\n\n    if (isPercent && percentAnimation) {\n      offset = offset / 100 * (_isArray(percentAnimation) ? percentAnimation[0] : percentAnimation).totalDuration();\n    }\n\n    return i > 1 ? _parsePosition(animation, position.substr(0, i - 1), percentAnimation) + offset : clippedDuration + offset;\n  }\n\n  return position == null ? clippedDuration : +position;\n},\n    _createTweenType = function _createTweenType(type, params, timeline) {\n  var isLegacy = _isNumber(params[1]),\n      varsIndex = (isLegacy ? 2 : 1) + (type < 2 ? 0 : 1),\n      vars = params[varsIndex],\n      irVars,\n      parent;\n\n  isLegacy && (vars.duration = params[1]);\n  vars.parent = timeline;\n\n  if (type) {\n    irVars = vars;\n    parent = timeline;\n\n    while (parent && !(\"immediateRender\" in irVars)) {\n      // inheritance hasn't happened yet, but someone may have set a default in an ancestor timeline. We could do vars.immediateRender = _isNotFalse(_inheritDefaults(vars).immediateRender) but that'd exact a slight performance penalty because _inheritDefaults() also runs in the Tween constructor. We're paying a small kb price here to gain speed.\n      irVars = parent.vars.defaults || {};\n      parent = _isNotFalse(parent.vars.inherit) && parent.parent;\n    }\n\n    vars.immediateRender = _isNotFalse(irVars.immediateRender);\n    type < 2 ? vars.runBackwards = 1 : vars.startAt = params[varsIndex - 1]; // \"from\" vars\n  }\n\n  return new Tween(params[0], vars, params[varsIndex + 1]);\n},\n    _conditionalReturn = function _conditionalReturn(value, func) {\n  return value || value === 0 ? func(value) : func;\n},\n    _clamp = function _clamp(min, max, value) {\n  return value < min ? min : value > max ? max : value;\n},\n    getUnit = function getUnit(value, v) {\n  return !_isString(value) || !(v = _unitExp.exec(value)) ? \"\" : v[1];\n},\n    // note: protect against padded numbers as strings, like \"100.100\". That shouldn't return \"00\" as the unit. If it's numeric, return no unit.\nclamp = function clamp(min, max, value) {\n  return _conditionalReturn(value, function (v) {\n    return _clamp(min, max, v);\n  });\n},\n    _slice = [].slice,\n    _isArrayLike = function _isArrayLike(value, nonEmpty) {\n  return value && _isObject(value) && \"length\" in value && (!nonEmpty && !value.length || value.length - 1 in value && _isObject(value[0])) && !value.nodeType && value !== _win;\n},\n    _flatten = function _flatten(ar, leaveStrings, accumulator) {\n  if (accumulator === void 0) {\n    accumulator = [];\n  }\n\n  return ar.forEach(function (value) {\n    var _accumulator;\n\n    return _isString(value) && !leaveStrings || _isArrayLike(value, 1) ? (_accumulator = accumulator).push.apply(_accumulator, toArray(value)) : accumulator.push(value);\n  }) || accumulator;\n},\n    // takes any value and returns an Array. If it's a string (and leaveStrings isn't true), it'll use document.querySelectorAll() and convert that to an array. It'll also accept iterables like jQuery objects.\ntoArray = function toArray(value, scope, leaveStrings) {\n  return _context && !scope && _context.selector ? _context.selector(value) : _isString(value) && !leaveStrings && (_coreInitted || !_wake()) ? _slice.call((scope || _doc).querySelectorAll(value), 0) : _isArray(value) ? _flatten(value, leaveStrings) : _isArrayLike(value) ? _slice.call(value, 0) : value ? [value] : [];\n},\n    selector = function selector(value) {\n  value = toArray(value)[0] || _warn(\"Invalid scope\") || {};\n  return function (v) {\n    var el = value.current || value.nativeElement || value;\n    return toArray(v, el.querySelectorAll ? el : el === value ? _warn(\"Invalid scope\") || _doc.createElement(\"div\") : value);\n  };\n},\n    shuffle = function shuffle(a) {\n  return a.sort(function () {\n    return .5 - Math.random();\n  });\n},\n    // alternative that's a bit faster and more reliably diverse but bigger:   for (let j, v, i = a.length; i; j = (Math.random() * i) | 0, v = a[--i], a[i] = a[j], a[j] = v); return a;\n// for distributing values across an Array. Can accept a number, a function or (most commonly) an object which can contain the following properties: {base, amount, from, ease, grid, axis, length, each}. Returns a function that expects the following parameters: index, target, array.\ndistribute = function distribute(v) {\n  if (_isFunction(v)) {\n    return v;\n  }\n\n  var vars = _isObject(v) ? v : {\n    each: v\n  },\n      //n:1 is just to indicate v was a number; we leverage that later to set v according to the length we get. If a number is passed in, we treat it like the old stagger value where 0.1, for example, would mean that things would be distributed with 0.1 between each element in the array rather than a total \"amount\" that's chunked out among them all.\n  ease = _parseEase(vars.ease),\n      from = vars.from || 0,\n      base = parseFloat(vars.base) || 0,\n      cache = {},\n      isDecimal = from > 0 && from < 1,\n      ratios = isNaN(from) || isDecimal,\n      axis = vars.axis,\n      ratioX = from,\n      ratioY = from;\n\n  if (_isString(from)) {\n    ratioX = ratioY = {\n      center: .5,\n      edges: .5,\n      end: 1\n    }[from] || 0;\n  } else if (!isDecimal && ratios) {\n    ratioX = from[0];\n    ratioY = from[1];\n  }\n\n  return function (i, target, a) {\n    var l = (a || vars).length,\n        distances = cache[l],\n        originX,\n        originY,\n        x,\n        y,\n        d,\n        j,\n        max,\n        min,\n        wrapAt;\n\n    if (!distances) {\n      wrapAt = vars.grid === \"auto\" ? 0 : (vars.grid || [1, _bigNum])[1];\n\n      if (!wrapAt) {\n        max = -_bigNum;\n\n        while (max < (max = a[wrapAt++].getBoundingClientRect().left) && wrapAt < l) {}\n\n        wrapAt < l && wrapAt--;\n      }\n\n      distances = cache[l] = [];\n      originX = ratios ? Math.min(wrapAt, l) * ratioX - .5 : from % wrapAt;\n      originY = wrapAt === _bigNum ? 0 : ratios ? l * ratioY / wrapAt - .5 : from / wrapAt | 0;\n      max = 0;\n      min = _bigNum;\n\n      for (j = 0; j < l; j++) {\n        x = j % wrapAt - originX;\n        y = originY - (j / wrapAt | 0);\n        distances[j] = d = !axis ? _sqrt(x * x + y * y) : Math.abs(axis === \"y\" ? y : x);\n        d > max && (max = d);\n        d < min && (min = d);\n      }\n\n      from === \"random\" && shuffle(distances);\n      distances.max = max - min;\n      distances.min = min;\n      distances.v = l = (parseFloat(vars.amount) || parseFloat(vars.each) * (wrapAt > l ? l - 1 : !axis ? Math.max(wrapAt, l / wrapAt) : axis === \"y\" ? l / wrapAt : wrapAt) || 0) * (from === \"edges\" ? -1 : 1);\n      distances.b = l < 0 ? base - l : base;\n      distances.u = getUnit(vars.amount || vars.each) || 0; //unit\n\n      ease = ease && l < 0 ? _invertEase(ease) : ease;\n    }\n\n    l = (distances[i] - distances.min) / distances.max || 0;\n    return _roundPrecise(distances.b + (ease ? ease(l) : l) * distances.v) + distances.u; //round in order to work around floating point errors\n  };\n},\n    _roundModifier = function _roundModifier(v) {\n  //pass in 0.1 get a function that'll round to the nearest tenth, or 5 to round to the closest 5, or 0.001 to the closest 1000th, etc.\n  var p = Math.pow(10, ((v + \"\").split(\".\")[1] || \"\").length); //to avoid floating point math errors (like 24 * 0.1 == 2.4000000000000004), we chop off at a specific number of decimal places (much faster than toFixed())\n\n  return function (raw) {\n    var n = _roundPrecise(Math.round(parseFloat(raw) / v) * v * p);\n\n    return (n - n % 1) / p + (_isNumber(raw) ? 0 : getUnit(raw)); // n - n % 1 replaces Math.floor() in order to handle negative values properly. For example, Math.floor(-150.00000000000003) is 151!\n  };\n},\n    snap = function snap(snapTo, value) {\n  var isArray = _isArray(snapTo),\n      radius,\n      is2D;\n\n  if (!isArray && _isObject(snapTo)) {\n    radius = isArray = snapTo.radius || _bigNum;\n\n    if (snapTo.values) {\n      snapTo = toArray(snapTo.values);\n\n      if (is2D = !_isNumber(snapTo[0])) {\n        radius *= radius; //performance optimization so we don't have to Math.sqrt() in the loop.\n      }\n    } else {\n      snapTo = _roundModifier(snapTo.increment);\n    }\n  }\n\n  return _conditionalReturn(value, !isArray ? _roundModifier(snapTo) : _isFunction(snapTo) ? function (raw) {\n    is2D = snapTo(raw);\n    return Math.abs(is2D - raw) <= radius ? is2D : raw;\n  } : function (raw) {\n    var x = parseFloat(is2D ? raw.x : raw),\n        y = parseFloat(is2D ? raw.y : 0),\n        min = _bigNum,\n        closest = 0,\n        i = snapTo.length,\n        dx,\n        dy;\n\n    while (i--) {\n      if (is2D) {\n        dx = snapTo[i].x - x;\n        dy = snapTo[i].y - y;\n        dx = dx * dx + dy * dy;\n      } else {\n        dx = Math.abs(snapTo[i] - x);\n      }\n\n      if (dx < min) {\n        min = dx;\n        closest = i;\n      }\n    }\n\n    closest = !radius || min <= radius ? snapTo[closest] : raw;\n    return is2D || closest === raw || _isNumber(raw) ? closest : closest + getUnit(raw);\n  });\n},\n    random = function random(min, max, roundingIncrement, returnFunction) {\n  return _conditionalReturn(_isArray(min) ? !max : roundingIncrement === true ? !!(roundingIncrement = 0) : !returnFunction, function () {\n    return _isArray(min) ? min[~~(Math.random() * min.length)] : (roundingIncrement = roundingIncrement || 1e-5) && (returnFunction = roundingIncrement < 1 ? Math.pow(10, (roundingIncrement + \"\").length - 2) : 1) && Math.floor(Math.round((min - roundingIncrement / 2 + Math.random() * (max - min + roundingIncrement * .99)) / roundingIncrement) * roundingIncrement * returnFunction) / returnFunction;\n  });\n},\n    pipe = function pipe() {\n  for (var _len = arguments.length, functions = new Array(_len), _key = 0; _key < _len; _key++) {\n    functions[_key] = arguments[_key];\n  }\n\n  return function (value) {\n    return functions.reduce(function (v, f) {\n      return f(v);\n    }, value);\n  };\n},\n    unitize = function unitize(func, unit) {\n  return function (value) {\n    return func(parseFloat(value)) + (unit || getUnit(value));\n  };\n},\n    normalize = function normalize(min, max, value) {\n  return mapRange(min, max, 0, 1, value);\n},\n    _wrapArray = function _wrapArray(a, wrapper, value) {\n  return _conditionalReturn(value, function (index) {\n    return a[~~wrapper(index)];\n  });\n},\n    wrap = function wrap(min, max, value) {\n  // NOTE: wrap() CANNOT be an arrow function! A very odd compiling bug causes problems (unrelated to GSAP).\n  var range = max - min;\n  return _isArray(min) ? _wrapArray(min, wrap(0, min.length), max) : _conditionalReturn(value, function (value) {\n    return (range + (value - min) % range) % range + min;\n  });\n},\n    wrapYoyo = function wrapYoyo(min, max, value) {\n  var range = max - min,\n      total = range * 2;\n  return _isArray(min) ? _wrapArray(min, wrapYoyo(0, min.length - 1), max) : _conditionalReturn(value, function (value) {\n    value = (total + (value - min) % total) % total || 0;\n    return min + (value > range ? total - value : value);\n  });\n},\n    _replaceRandom = function _replaceRandom(s) {\n  return s.replace(_randomExp, function (match) {\n    //replaces all occurrences of random(...) in a string with the calculated random value. can be a range like random(-100, 100, 5) or an array like random([0, 100, 500])\n    var arIndex = match.indexOf(\"[\") + 1,\n        values = match.substring(arIndex || 7, arIndex ? match.indexOf(\"]\") : match.length - 1).split(_commaDelimExp);\n    return random(arIndex ? values : +values[0], arIndex ? 0 : +values[1], +values[2] || 1e-5);\n  });\n},\n    mapRange = function mapRange(inMin, inMax, outMin, outMax, value) {\n  var inRange = inMax - inMin,\n      outRange = outMax - outMin;\n  return _conditionalReturn(value, function (value) {\n    return outMin + ((value - inMin) / inRange * outRange || 0);\n  });\n},\n    interpolate = function interpolate(start, end, progress, mutate) {\n  var func = isNaN(start + end) ? 0 : function (p) {\n    return (1 - p) * start + p * end;\n  };\n\n  if (!func) {\n    var isString = _isString(start),\n        master = {},\n        p,\n        i,\n        interpolators,\n        l,\n        il;\n\n    progress === true && (mutate = 1) && (progress = null);\n\n    if (isString) {\n      start = {\n        p: start\n      };\n      end = {\n        p: end\n      };\n    } else if (_isArray(start) && !_isArray(end)) {\n      interpolators = [];\n      l = start.length;\n      il = l - 2;\n\n      for (i = 1; i < l; i++) {\n        interpolators.push(interpolate(start[i - 1], start[i])); //build the interpolators up front as a performance optimization so that when the function is called many times, it can just reuse them.\n      }\n\n      l--;\n\n      func = function func(p) {\n        p *= l;\n        var i = Math.min(il, ~~p);\n        return interpolators[i](p - i);\n      };\n\n      progress = end;\n    } else if (!mutate) {\n      start = _merge(_isArray(start) ? [] : {}, start);\n    }\n\n    if (!interpolators) {\n      for (p in end) {\n        _addPropTween.call(master, start, p, \"get\", end[p]);\n      }\n\n      func = function func(p) {\n        return _renderPropTweens(p, master) || (isString ? start.p : start);\n      };\n    }\n  }\n\n  return _conditionalReturn(progress, func);\n},\n    _getLabelInDirection = function _getLabelInDirection(timeline, fromTime, backward) {\n  //used for nextLabel() and previousLabel()\n  var labels = timeline.labels,\n      min = _bigNum,\n      p,\n      distance,\n      label;\n\n  for (p in labels) {\n    distance = labels[p] - fromTime;\n\n    if (distance < 0 === !!backward && distance && min > (distance = Math.abs(distance))) {\n      label = p;\n      min = distance;\n    }\n  }\n\n  return label;\n},\n    _callback = function _callback(animation, type, executeLazyFirst) {\n  var v = animation.vars,\n      callback = v[type],\n      prevContext = _context,\n      context = animation._ctx,\n      params,\n      scope,\n      result;\n\n  if (!callback) {\n    return;\n  }\n\n  params = v[type + \"Params\"];\n  scope = v.callbackScope || animation;\n  executeLazyFirst && _lazyTweens.length && _lazyRender(); //in case rendering caused any tweens to lazy-init, we should render them because typically when a timeline finishes, users expect things to have rendered fully. Imagine an onUpdate on a timeline that reports/checks tweened values.\n\n  context && (_context = context);\n  result = params ? callback.apply(scope, params) : callback.call(scope);\n  _context = prevContext;\n  return result;\n},\n    _interrupt = function _interrupt(animation) {\n  _removeFromParent(animation);\n\n  animation.scrollTrigger && animation.scrollTrigger.kill(!!_reverting);\n  animation.progress() < 1 && _callback(animation, \"onInterrupt\");\n  return animation;\n},\n    _quickTween,\n    _registerPluginQueue = [],\n    _createPlugin = function _createPlugin(config) {\n  if (!config) return;\n  config = !config.name && config[\"default\"] || config; // UMD packaging wraps things oddly, so for example MotionPathHelper becomes {MotionPathHelper:MotionPathHelper, default:MotionPathHelper}.\n\n  if (_windowExists() || config.headless) {\n    // edge case: some build tools may pass in a null/undefined value\n    var name = config.name,\n        isFunc = _isFunction(config),\n        Plugin = name && !isFunc && config.init ? function () {\n      this._props = [];\n    } : config,\n        //in case someone passes in an object that's not a plugin, like CustomEase\n    instanceDefaults = {\n      init: _emptyFunc,\n      render: _renderPropTweens,\n      add: _addPropTween,\n      kill: _killPropTweensOf,\n      modifier: _addPluginModifier,\n      rawVars: 0\n    },\n        statics = {\n      targetTest: 0,\n      get: 0,\n      getSetter: _getSetter,\n      aliases: {},\n      register: 0\n    };\n\n    _wake();\n\n    if (config !== Plugin) {\n      if (_plugins[name]) {\n        return;\n      }\n\n      _setDefaults(Plugin, _setDefaults(_copyExcluding(config, instanceDefaults), statics)); //static methods\n\n\n      _merge(Plugin.prototype, _merge(instanceDefaults, _copyExcluding(config, statics))); //instance methods\n\n\n      _plugins[Plugin.prop = name] = Plugin;\n\n      if (config.targetTest) {\n        _harnessPlugins.push(Plugin);\n\n        _reservedProps[name] = 1;\n      }\n\n      name = (name === \"css\" ? \"CSS\" : name.charAt(0).toUpperCase() + name.substr(1)) + \"Plugin\"; //for the global name. \"motionPath\" should become MotionPathPlugin\n    }\n\n    _addGlobal(name, Plugin);\n\n    config.register && config.register(gsap, Plugin, PropTween);\n  } else {\n    _registerPluginQueue.push(config);\n  }\n},\n\n/*\n * --------------------------------------------------------------------------------------\n * COLORS\n * --------------------------------------------------------------------------------------\n */\n_255 = 255,\n    _colorLookup = {\n  aqua: [0, _255, _255],\n  lime: [0, _255, 0],\n  silver: [192, 192, 192],\n  black: [0, 0, 0],\n  maroon: [128, 0, 0],\n  teal: [0, 128, 128],\n  blue: [0, 0, _255],\n  navy: [0, 0, 128],\n  white: [_255, _255, _255],\n  olive: [128, 128, 0],\n  yellow: [_255, _255, 0],\n  orange: [_255, 165, 0],\n  gray: [128, 128, 128],\n  purple: [128, 0, 128],\n  green: [0, 128, 0],\n  red: [_255, 0, 0],\n  pink: [_255, 192, 203],\n  cyan: [0, _255, _255],\n  transparent: [_255, _255, _255, 0]\n},\n    // possible future idea to replace the hard-coded color name values - put this in the ticker.wake() where we set the _doc:\n// let ctx = _doc.createElement(\"canvas\").getContext(\"2d\");\n// _forEachName(\"aqua,lime,silver,black,maroon,teal,blue,navy,white,olive,yellow,orange,gray,purple,green,red,pink,cyan\", color => {ctx.fillStyle = color; _colorLookup[color] = splitColor(ctx.fillStyle)});\n_hue = function _hue(h, m1, m2) {\n  h += h < 0 ? 1 : h > 1 ? -1 : 0;\n  return (h * 6 < 1 ? m1 + (m2 - m1) * h * 6 : h < .5 ? m2 : h * 3 < 2 ? m1 + (m2 - m1) * (2 / 3 - h) * 6 : m1) * _255 + .5 | 0;\n},\n    splitColor = function splitColor(v, toHSL, forceAlpha) {\n  var a = !v ? _colorLookup.black : _isNumber(v) ? [v >> 16, v >> 8 & _255, v & _255] : 0,\n      r,\n      g,\n      b,\n      h,\n      s,\n      l,\n      max,\n      min,\n      d,\n      wasHSL;\n\n  if (!a) {\n    if (v.substr(-1) === \",\") {\n      //sometimes a trailing comma is included and we should chop it off (typically from a comma-delimited list of values like a textShadow:\"2px 2px 2px blue, 5px 5px 5px rgb(255,0,0)\" - in this example \"blue,\" has a trailing comma. We could strip it out inside parseComplex() but we'd need to do it to the beginning and ending values plus it wouldn't provide protection from other potential scenarios like if the user passes in a similar value.\n      v = v.substr(0, v.length - 1);\n    }\n\n    if (_colorLookup[v]) {\n      a = _colorLookup[v];\n    } else if (v.charAt(0) === \"#\") {\n      if (v.length < 6) {\n        //for shorthand like #9F0 or #9F0F (could have alpha)\n        r = v.charAt(1);\n        g = v.charAt(2);\n        b = v.charAt(3);\n        v = \"#\" + r + r + g + g + b + b + (v.length === 5 ? v.charAt(4) + v.charAt(4) : \"\");\n      }\n\n      if (v.length === 9) {\n        // hex with alpha, like #fd5e53ff\n        a = parseInt(v.substr(1, 6), 16);\n        return [a >> 16, a >> 8 & _255, a & _255, parseInt(v.substr(7), 16) / 255];\n      }\n\n      v = parseInt(v.substr(1), 16);\n      a = [v >> 16, v >> 8 & _255, v & _255];\n    } else if (v.substr(0, 3) === \"hsl\") {\n      a = wasHSL = v.match(_strictNumExp);\n\n      if (!toHSL) {\n        h = +a[0] % 360 / 360;\n        s = +a[1] / 100;\n        l = +a[2] / 100;\n        g = l <= .5 ? l * (s + 1) : l + s - l * s;\n        r = l * 2 - g;\n        a.length > 3 && (a[3] *= 1); //cast as number\n\n        a[0] = _hue(h + 1 / 3, r, g);\n        a[1] = _hue(h, r, g);\n        a[2] = _hue(h - 1 / 3, r, g);\n      } else if (~v.indexOf(\"=\")) {\n        //if relative values are found, just return the raw strings with the relative prefixes in place.\n        a = v.match(_numExp);\n        forceAlpha && a.length < 4 && (a[3] = 1);\n        return a;\n      }\n    } else {\n      a = v.match(_strictNumExp) || _colorLookup.transparent;\n    }\n\n    a = a.map(Number);\n  }\n\n  if (toHSL && !wasHSL) {\n    r = a[0] / _255;\n    g = a[1] / _255;\n    b = a[2] / _255;\n    max = Math.max(r, g, b);\n    min = Math.min(r, g, b);\n    l = (max + min) / 2;\n\n    if (max === min) {\n      h = s = 0;\n    } else {\n      d = max - min;\n      s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n      h = max === r ? (g - b) / d + (g < b ? 6 : 0) : max === g ? (b - r) / d + 2 : (r - g) / d + 4;\n      h *= 60;\n    }\n\n    a[0] = ~~(h + .5);\n    a[1] = ~~(s * 100 + .5);\n    a[2] = ~~(l * 100 + .5);\n  }\n\n  forceAlpha && a.length < 4 && (a[3] = 1);\n  return a;\n},\n    _colorOrderData = function _colorOrderData(v) {\n  // strips out the colors from the string, finds all the numeric slots (with units) and returns an array of those. The Array also has a \"c\" property which is an Array of the index values where the colors belong. This is to help work around issues where there's a mis-matched order of color/numeric data like drop-shadow(#f00 0px 1px 2px) and drop-shadow(0x 1px 2px #f00). This is basically a helper function used in _formatColors()\n  var values = [],\n      c = [],\n      i = -1;\n  v.split(_colorExp).forEach(function (v) {\n    var a = v.match(_numWithUnitExp) || [];\n    values.push.apply(values, a);\n    c.push(i += a.length + 1);\n  });\n  values.c = c;\n  return values;\n},\n    _formatColors = function _formatColors(s, toHSL, orderMatchData) {\n  var result = \"\",\n      colors = (s + result).match(_colorExp),\n      type = toHSL ? \"hsla(\" : \"rgba(\",\n      i = 0,\n      c,\n      shell,\n      d,\n      l;\n\n  if (!colors) {\n    return s;\n  }\n\n  colors = colors.map(function (color) {\n    return (color = splitColor(color, toHSL, 1)) && type + (toHSL ? color[0] + \",\" + color[1] + \"%,\" + color[2] + \"%,\" + color[3] : color.join(\",\")) + \")\";\n  });\n\n  if (orderMatchData) {\n    d = _colorOrderData(s);\n    c = orderMatchData.c;\n\n    if (c.join(result) !== d.c.join(result)) {\n      shell = s.replace(_colorExp, \"1\").split(_numWithUnitExp);\n      l = shell.length - 1;\n\n      for (; i < l; i++) {\n        result += shell[i] + (~c.indexOf(i) ? colors.shift() || type + \"0,0,0,0)\" : (d.length ? d : colors.length ? colors : orderMatchData).shift());\n      }\n    }\n  }\n\n  if (!shell) {\n    shell = s.split(_colorExp);\n    l = shell.length - 1;\n\n    for (; i < l; i++) {\n      result += shell[i] + colors[i];\n    }\n  }\n\n  return result + shell[l];\n},\n    _colorExp = function () {\n  var s = \"(?:\\\\b(?:(?:rgb|rgba|hsl|hsla)\\\\(.+?\\\\))|\\\\B#(?:[0-9a-f]{3,4}){1,2}\\\\b\",\n      //we'll dynamically build this Regular Expression to conserve file size. After building it, it will be able to find rgb(), rgba(), # (hexadecimal), and named color values like red, blue, purple, etc.,\n  p;\n\n  for (p in _colorLookup) {\n    s += \"|\" + p + \"\\\\b\";\n  }\n\n  return new RegExp(s + \")\", \"gi\");\n}(),\n    _hslExp = /hsl[a]?\\(/,\n    _colorStringFilter = function _colorStringFilter(a) {\n  var combined = a.join(\" \"),\n      toHSL;\n  _colorExp.lastIndex = 0;\n\n  if (_colorExp.test(combined)) {\n    toHSL = _hslExp.test(combined);\n    a[1] = _formatColors(a[1], toHSL);\n    a[0] = _formatColors(a[0], toHSL, _colorOrderData(a[1])); // make sure the order of numbers/colors match with the END value.\n\n    return true;\n  }\n},\n\n/*\n * --------------------------------------------------------------------------------------\n * TICKER\n * --------------------------------------------------------------------------------------\n */\n_tickerActive,\n    _ticker = function () {\n  var _getTime = Date.now,\n      _lagThreshold = 500,\n      _adjustedLag = 33,\n      _startTime = _getTime(),\n      _lastUpdate = _startTime,\n      _gap = 1000 / 240,\n      _nextTime = _gap,\n      _listeners = [],\n      _id,\n      _req,\n      _raf,\n      _self,\n      _delta,\n      _i,\n      _tick = function _tick(v) {\n    var elapsed = _getTime() - _lastUpdate,\n        manual = v === true,\n        overlap,\n        dispatch,\n        time,\n        frame;\n\n    (elapsed > _lagThreshold || elapsed < 0) && (_startTime += elapsed - _adjustedLag);\n    _lastUpdate += elapsed;\n    time = _lastUpdate - _startTime;\n    overlap = time - _nextTime;\n\n    if (overlap > 0 || manual) {\n      frame = ++_self.frame;\n      _delta = time - _self.time * 1000;\n      _self.time = time = time / 1000;\n      _nextTime += overlap + (overlap >= _gap ? 4 : _gap - overlap);\n      dispatch = 1;\n    }\n\n    manual || (_id = _req(_tick)); //make sure the request is made before we dispatch the \"tick\" event so that timing is maintained. Otherwise, if processing the \"tick\" requires a bunch of time (like 15ms) and we're using a setTimeout() that's based on 16.7ms, it'd technically take 31.7ms between frames otherwise.\n\n    if (dispatch) {\n      for (_i = 0; _i < _listeners.length; _i++) {\n        // use _i and check _listeners.length instead of a variable because a listener could get removed during the loop, and if that happens to an element less than the current index, it'd throw things off in the loop.\n        _listeners[_i](time, _delta, frame, v);\n      }\n    }\n  };\n\n  _self = {\n    time: 0,\n    frame: 0,\n    tick: function tick() {\n      _tick(true);\n    },\n    deltaRatio: function deltaRatio(fps) {\n      return _delta / (1000 / (fps || 60));\n    },\n    wake: function wake() {\n      if (_coreReady) {\n        if (!_coreInitted && _windowExists()) {\n          _win = _coreInitted = window;\n          _doc = _win.document || {};\n          _globals.gsap = gsap;\n          (_win.gsapVersions || (_win.gsapVersions = [])).push(gsap.version);\n\n          _install(_installScope || _win.GreenSockGlobals || !_win.gsap && _win || {});\n\n          _registerPluginQueue.forEach(_createPlugin);\n        }\n\n        _raf = typeof requestAnimationFrame !== \"undefined\" && requestAnimationFrame;\n        _id && _self.sleep();\n\n        _req = _raf || function (f) {\n          return setTimeout(f, _nextTime - _self.time * 1000 + 1 | 0);\n        };\n\n        _tickerActive = 1;\n\n        _tick(2);\n      }\n    },\n    sleep: function sleep() {\n      (_raf ? cancelAnimationFrame : clearTimeout)(_id);\n      _tickerActive = 0;\n      _req = _emptyFunc;\n    },\n    lagSmoothing: function lagSmoothing(threshold, adjustedLag) {\n      _lagThreshold = threshold || Infinity; // zero should be interpreted as basically unlimited\n\n      _adjustedLag = Math.min(adjustedLag || 33, _lagThreshold);\n    },\n    fps: function fps(_fps) {\n      _gap = 1000 / (_fps || 240);\n      _nextTime = _self.time * 1000 + _gap;\n    },\n    add: function add(callback, once, prioritize) {\n      var func = once ? function (t, d, f, v) {\n        callback(t, d, f, v);\n\n        _self.remove(func);\n      } : callback;\n\n      _self.remove(callback);\n\n      _listeners[prioritize ? \"unshift\" : \"push\"](func);\n\n      _wake();\n\n      return func;\n    },\n    remove: function remove(callback, i) {\n      ~(i = _listeners.indexOf(callback)) && _listeners.splice(i, 1) && _i >= i && _i--;\n    },\n    _listeners: _listeners\n  };\n  return _self;\n}(),\n    _wake = function _wake() {\n  return !_tickerActive && _ticker.wake();\n},\n    //also ensures the core classes are initialized.\n\n/*\n* -------------------------------------------------\n* EASING\n* -------------------------------------------------\n*/\n_easeMap = {},\n    _customEaseExp = /^[\\d.\\-M][\\d.\\-,\\s]/,\n    _quotesExp = /[\"']/g,\n    _parseObjectInString = function _parseObjectInString(value) {\n  //takes a string like \"{wiggles:10, type:anticipate})\" and turns it into a real object. Notice it ends in \")\" and includes the {} wrappers. This is because we only use this function for parsing ease configs and prioritized optimization rather than reusability.\n  var obj = {},\n      split = value.substr(1, value.length - 3).split(\":\"),\n      key = split[0],\n      i = 1,\n      l = split.length,\n      index,\n      val,\n      parsedVal;\n\n  for (; i < l; i++) {\n    val = split[i];\n    index = i !== l - 1 ? val.lastIndexOf(\",\") : val.length;\n    parsedVal = val.substr(0, index);\n    obj[key] = isNaN(parsedVal) ? parsedVal.replace(_quotesExp, \"\").trim() : +parsedVal;\n    key = val.substr(index + 1).trim();\n  }\n\n  return obj;\n},\n    _valueInParentheses = function _valueInParentheses(value) {\n  var open = value.indexOf(\"(\") + 1,\n      close = value.indexOf(\")\"),\n      nested = value.indexOf(\"(\", open);\n  return value.substring(open, ~nested && nested < close ? value.indexOf(\")\", close + 1) : close);\n},\n    _configEaseFromString = function _configEaseFromString(name) {\n  //name can be a string like \"elastic.out(1,0.5)\", and pass in _easeMap as obj and it'll parse it out and call the actual function like _easeMap.Elastic.easeOut.config(1,0.5). It will also parse custom ease strings as long as CustomEase is loaded and registered (internally as _easeMap._CE).\n  var split = (name + \"\").split(\"(\"),\n      ease = _easeMap[split[0]];\n  return ease && split.length > 1 && ease.config ? ease.config.apply(null, ~name.indexOf(\"{\") ? [_parseObjectInString(split[1])] : _valueInParentheses(name).split(\",\").map(_numericIfPossible)) : _easeMap._CE && _customEaseExp.test(name) ? _easeMap._CE(\"\", name) : ease;\n},\n    _invertEase = function _invertEase(ease) {\n  return function (p) {\n    return 1 - ease(1 - p);\n  };\n},\n    // allow yoyoEase to be set in children and have those affected when the parent/ancestor timeline yoyos.\n_propagateYoyoEase = function _propagateYoyoEase(timeline, isYoyo) {\n  var child = timeline._first,\n      ease;\n\n  while (child) {\n    if (child instanceof Timeline) {\n      _propagateYoyoEase(child, isYoyo);\n    } else if (child.vars.yoyoEase && (!child._yoyo || !child._repeat) && child._yoyo !== isYoyo) {\n      if (child.timeline) {\n        _propagateYoyoEase(child.timeline, isYoyo);\n      } else {\n        ease = child._ease;\n        child._ease = child._yEase;\n        child._yEase = ease;\n        child._yoyo = isYoyo;\n      }\n    }\n\n    child = child._next;\n  }\n},\n    _parseEase = function _parseEase(ease, defaultEase) {\n  return !ease ? defaultEase : (_isFunction(ease) ? ease : _easeMap[ease] || _configEaseFromString(ease)) || defaultEase;\n},\n    _insertEase = function _insertEase(names, easeIn, easeOut, easeInOut) {\n  if (easeOut === void 0) {\n    easeOut = function easeOut(p) {\n      return 1 - easeIn(1 - p);\n    };\n  }\n\n  if (easeInOut === void 0) {\n    easeInOut = function easeInOut(p) {\n      return p < .5 ? easeIn(p * 2) / 2 : 1 - easeIn((1 - p) * 2) / 2;\n    };\n  }\n\n  var ease = {\n    easeIn: easeIn,\n    easeOut: easeOut,\n    easeInOut: easeInOut\n  },\n      lowercaseName;\n\n  _forEachName(names, function (name) {\n    _easeMap[name] = _globals[name] = ease;\n    _easeMap[lowercaseName = name.toLowerCase()] = easeOut;\n\n    for (var p in ease) {\n      _easeMap[lowercaseName + (p === \"easeIn\" ? \".in\" : p === \"easeOut\" ? \".out\" : \".inOut\")] = _easeMap[name + \".\" + p] = ease[p];\n    }\n  });\n\n  return ease;\n},\n    _easeInOutFromOut = function _easeInOutFromOut(easeOut) {\n  return function (p) {\n    return p < .5 ? (1 - easeOut(1 - p * 2)) / 2 : .5 + easeOut((p - .5) * 2) / 2;\n  };\n},\n    _configElastic = function _configElastic(type, amplitude, period) {\n  var p1 = amplitude >= 1 ? amplitude : 1,\n      //note: if amplitude is < 1, we simply adjust the period for a more natural feel. Otherwise the math doesn't work right and the curve starts at 1.\n  p2 = (period || (type ? .3 : .45)) / (amplitude < 1 ? amplitude : 1),\n      p3 = p2 / _2PI * (Math.asin(1 / p1) || 0),\n      easeOut = function easeOut(p) {\n    return p === 1 ? 1 : p1 * Math.pow(2, -10 * p) * _sin((p - p3) * p2) + 1;\n  },\n      ease = type === \"out\" ? easeOut : type === \"in\" ? function (p) {\n    return 1 - easeOut(1 - p);\n  } : _easeInOutFromOut(easeOut);\n\n  p2 = _2PI / p2; //precalculate to optimize\n\n  ease.config = function (amplitude, period) {\n    return _configElastic(type, amplitude, period);\n  };\n\n  return ease;\n},\n    _configBack = function _configBack(type, overshoot) {\n  if (overshoot === void 0) {\n    overshoot = 1.70158;\n  }\n\n  var easeOut = function easeOut(p) {\n    return p ? --p * p * ((overshoot + 1) * p + overshoot) + 1 : 0;\n  },\n      ease = type === \"out\" ? easeOut : type === \"in\" ? function (p) {\n    return 1 - easeOut(1 - p);\n  } : _easeInOutFromOut(easeOut);\n\n  ease.config = function (overshoot) {\n    return _configBack(type, overshoot);\n  };\n\n  return ease;\n}; // a cheaper (kb and cpu) but more mild way to get a parameterized weighted ease by feeding in a value between -1 (easeIn) and 1 (easeOut) where 0 is linear.\n// _weightedEase = ratio => {\n// \tlet y = 0.5 + ratio / 2;\n// \treturn p => (2 * (1 - p) * p * y + p * p);\n// },\n// a stronger (but more expensive kb/cpu) parameterized weighted ease that lets you feed in a value between -1 (easeIn) and 1 (easeOut) where 0 is linear.\n// _weightedEaseStrong = ratio => {\n// \tratio = .5 + ratio / 2;\n// \tlet o = 1 / 3 * (ratio < .5 ? ratio : 1 - ratio),\n// \t\tb = ratio - o,\n// \t\tc = ratio + o;\n// \treturn p => p === 1 ? p : 3 * b * (1 - p) * (1 - p) * p + 3 * c * (1 - p) * p * p + p * p * p;\n// };\n\n\n_forEachName(\"Linear,Quad,Cubic,Quart,Quint,Strong\", function (name, i) {\n  var power = i < 5 ? i + 1 : i;\n\n  _insertEase(name + \",Power\" + (power - 1), i ? function (p) {\n    return Math.pow(p, power);\n  } : function (p) {\n    return p;\n  }, function (p) {\n    return 1 - Math.pow(1 - p, power);\n  }, function (p) {\n    return p < .5 ? Math.pow(p * 2, power) / 2 : 1 - Math.pow((1 - p) * 2, power) / 2;\n  });\n});\n\n_easeMap.Linear.easeNone = _easeMap.none = _easeMap.Linear.easeIn;\n\n_insertEase(\"Elastic\", _configElastic(\"in\"), _configElastic(\"out\"), _configElastic());\n\n(function (n, c) {\n  var n1 = 1 / c,\n      n2 = 2 * n1,\n      n3 = 2.5 * n1,\n      easeOut = function easeOut(p) {\n    return p < n1 ? n * p * p : p < n2 ? n * Math.pow(p - 1.5 / c, 2) + .75 : p < n3 ? n * (p -= 2.25 / c) * p + .9375 : n * Math.pow(p - 2.625 / c, 2) + .984375;\n  };\n\n  _insertEase(\"Bounce\", function (p) {\n    return 1 - easeOut(1 - p);\n  }, easeOut);\n})(7.5625, 2.75);\n\n_insertEase(\"Expo\", function (p) {\n  return Math.pow(2, 10 * (p - 1)) * p + p * p * p * p * p * p * (1 - p);\n}); // previously 2 ** (10 * (p - 1)) but that doesn't end up with the value quite at the right spot so we do a blended ease to ensure it lands where it should perfectly.\n\n\n_insertEase(\"Circ\", function (p) {\n  return -(_sqrt(1 - p * p) - 1);\n});\n\n_insertEase(\"Sine\", function (p) {\n  return p === 1 ? 1 : -_cos(p * _HALF_PI) + 1;\n});\n\n_insertEase(\"Back\", _configBack(\"in\"), _configBack(\"out\"), _configBack());\n\n_easeMap.SteppedEase = _easeMap.steps = _globals.SteppedEase = {\n  config: function config(steps, immediateStart) {\n    if (steps === void 0) {\n      steps = 1;\n    }\n\n    var p1 = 1 / steps,\n        p2 = steps + (immediateStart ? 0 : 1),\n        p3 = immediateStart ? 1 : 0,\n        max = 1 - _tinyNum;\n    return function (p) {\n      return ((p2 * _clamp(0, max, p) | 0) + p3) * p1;\n    };\n  }\n};\n_defaults.ease = _easeMap[\"quad.out\"];\n\n_forEachName(\"onComplete,onUpdate,onStart,onRepeat,onReverseComplete,onInterrupt\", function (name) {\n  return _callbackNames += name + \",\" + name + \"Params,\";\n});\n/*\n * --------------------------------------------------------------------------------------\n * CACHE\n * --------------------------------------------------------------------------------------\n */\n\n\nexport var GSCache = function GSCache(target, harness) {\n  this.id = _gsID++;\n  target._gsap = this;\n  this.target = target;\n  this.harness = harness;\n  this.get = harness ? harness.get : _getProperty;\n  this.set = harness ? harness.getSetter : _getSetter;\n};\n/*\n * --------------------------------------------------------------------------------------\n * ANIMATION\n * --------------------------------------------------------------------------------------\n */\n\nexport var Animation = /*#__PURE__*/function () {\n  function Animation(vars) {\n    this.vars = vars;\n    this._delay = +vars.delay || 0;\n\n    if (this._repeat = vars.repeat === Infinity ? -2 : vars.repeat || 0) {\n      // TODO: repeat: Infinity on a timeline's children must flag that timeline internally and affect its totalDuration, otherwise it'll stop in the negative direction when reaching the start.\n      this._rDelay = vars.repeatDelay || 0;\n      this._yoyo = !!vars.yoyo || !!vars.yoyoEase;\n    }\n\n    this._ts = 1;\n\n    _setDuration(this, +vars.duration, 1, 1);\n\n    this.data = vars.data;\n\n    if (_context) {\n      this._ctx = _context;\n\n      _context.data.push(this);\n    }\n\n    _tickerActive || _ticker.wake();\n  }\n\n  var _proto = Animation.prototype;\n\n  _proto.delay = function delay(value) {\n    if (value || value === 0) {\n      this.parent && this.parent.smoothChildTiming && this.startTime(this._start + value - this._delay);\n      this._delay = value;\n      return this;\n    }\n\n    return this._delay;\n  };\n\n  _proto.duration = function duration(value) {\n    return arguments.length ? this.totalDuration(this._repeat > 0 ? value + (value + this._rDelay) * this._repeat : value) : this.totalDuration() && this._dur;\n  };\n\n  _proto.totalDuration = function totalDuration(value) {\n    if (!arguments.length) {\n      return this._tDur;\n    }\n\n    this._dirty = 0;\n    return _setDuration(this, this._repeat < 0 ? value : (value - this._repeat * this._rDelay) / (this._repeat + 1));\n  };\n\n  _proto.totalTime = function totalTime(_totalTime, suppressEvents) {\n    _wake();\n\n    if (!arguments.length) {\n      return this._tTime;\n    }\n\n    var parent = this._dp;\n\n    if (parent && parent.smoothChildTiming && this._ts) {\n      _alignPlayhead(this, _totalTime);\n\n      !parent._dp || parent.parent || _postAddChecks(parent, this); // edge case: if this is a child of a timeline that already completed, for example, we must re-activate the parent.\n      //in case any of the ancestor timelines had completed but should now be enabled, we should reset their totalTime() which will also ensure that they're lined up properly and enabled. Skip for animations that are on the root (wasteful). Example: a TimelineLite.exportRoot() is performed when there's a paused tween on the root, the export will not complete until that tween is unpaused, but imagine a child gets restarted later, after all [unpaused] tweens have completed. The start of that child would get pushed out, but one of the ancestors may have completed.\n\n      while (parent && parent.parent) {\n        if (parent.parent._time !== parent._start + (parent._ts >= 0 ? parent._tTime / parent._ts : (parent.totalDuration() - parent._tTime) / -parent._ts)) {\n          parent.totalTime(parent._tTime, true);\n        }\n\n        parent = parent.parent;\n      }\n\n      if (!this.parent && this._dp.autoRemoveChildren && (this._ts > 0 && _totalTime < this._tDur || this._ts < 0 && _totalTime > 0 || !this._tDur && !_totalTime)) {\n        //if the animation doesn't have a parent, put it back into its last parent (recorded as _dp for exactly cases like this). Limit to parents with autoRemoveChildren (like globalTimeline) so that if the user manually removes an animation from a timeline and then alters its playhead, it doesn't get added back in.\n        _addToTimeline(this._dp, this, this._start - this._delay);\n      }\n    }\n\n    if (this._tTime !== _totalTime || !this._dur && !suppressEvents || this._initted && Math.abs(this._zTime) === _tinyNum || !this._initted && this._dur && _totalTime || !_totalTime && !this._initted && (this.add || this._ptLookup)) {\n      // check for _ptLookup on a Tween instance to ensure it has actually finished being instantiated, otherwise if this.reverse() gets called in the Animation constructor, it could trigger a render() here even though the _targets weren't populated, thus when _init() is called there won't be any PropTweens (it'll act like the tween is non-functional)\n      this._ts || (this._pTime = _totalTime); // otherwise, if an animation is paused, then the playhead is moved back to zero, then resumed, it'd revert back to the original time at the pause\n      //if (!this._lock) { // avoid endless recursion (not sure we need this yet or if it's worth the performance hit)\n      //   this._lock = 1;\n\n      _lazySafeRender(this, _totalTime, suppressEvents); //   this._lock = 0;\n      //}\n\n    }\n\n    return this;\n  };\n\n  _proto.time = function time(value, suppressEvents) {\n    return arguments.length ? this.totalTime(Math.min(this.totalDuration(), value + _elapsedCycleDuration(this)) % (this._dur + this._rDelay) || (value ? this._dur : 0), suppressEvents) : this._time; // note: if the modulus results in 0, the playhead could be exactly at the end or the beginning, and we always defer to the END with a non-zero value, otherwise if you set the time() to the very end (duration()), it would render at the START!\n  };\n\n  _proto.totalProgress = function totalProgress(value, suppressEvents) {\n    return arguments.length ? this.totalTime(this.totalDuration() * value, suppressEvents) : this.totalDuration() ? Math.min(1, this._tTime / this._tDur) : this.rawTime() >= 0 && this._initted ? 1 : 0;\n  };\n\n  _proto.progress = function progress(value, suppressEvents) {\n    return arguments.length ? this.totalTime(this.duration() * (this._yoyo && !(this.iteration() & 1) ? 1 - value : value) + _elapsedCycleDuration(this), suppressEvents) : this.duration() ? Math.min(1, this._time / this._dur) : this.rawTime() > 0 ? 1 : 0;\n  };\n\n  _proto.iteration = function iteration(value, suppressEvents) {\n    var cycleDuration = this.duration() + this._rDelay;\n\n    return arguments.length ? this.totalTime(this._time + (value - 1) * cycleDuration, suppressEvents) : this._repeat ? _animationCycle(this._tTime, cycleDuration) + 1 : 1;\n  } // potential future addition:\n  // isPlayingBackwards() {\n  // \tlet animation = this,\n  // \t\torientation = 1; // 1 = forward, -1 = backward\n  // \twhile (animation) {\n  // \t\torientation *= animation.reversed() || (animation.repeat() && !(animation.iteration() & 1)) ? -1 : 1;\n  // \t\tanimation = animation.parent;\n  // \t}\n  // \treturn orientation < 0;\n  // }\n  ;\n\n  _proto.timeScale = function timeScale(value, suppressEvents) {\n    if (!arguments.length) {\n      return this._rts === -_tinyNum ? 0 : this._rts; // recorded timeScale. Special case: if someone calls reverse() on an animation with timeScale of 0, we assign it -_tinyNum to remember it's reversed.\n    }\n\n    if (this._rts === value) {\n      return this;\n    }\n\n    var tTime = this.parent && this._ts ? _parentToChildTotalTime(this.parent._time, this) : this._tTime; // make sure to do the parentToChildTotalTime() BEFORE setting the new _ts because the old one must be used in that calculation.\n    // future addition? Up side: fast and minimal file size. Down side: only works on this animation; if a timeline is reversed, for example, its childrens' onReverse wouldn't get called.\n    //(+value < 0 && this._rts >= 0) && _callback(this, \"onReverse\", true);\n    // prioritize rendering where the parent's playhead lines up instead of this._tTime because there could be a tween that's animating another tween's timeScale in the same rendering loop (same parent), thus if the timeScale tween renders first, it would alter _start BEFORE _tTime was set on that tick (in the rendering loop), effectively freezing it until the timeScale tween finishes.\n\n    this._rts = +value || 0;\n    this._ts = this._ps || value === -_tinyNum ? 0 : this._rts; // _ts is the functional timeScale which would be 0 if the animation is paused.\n\n    this.totalTime(_clamp(-Math.abs(this._delay), this.totalDuration(), tTime), suppressEvents !== false);\n\n    _setEnd(this); // if parent.smoothChildTiming was false, the end time didn't get updated in the _alignPlayhead() method, so do it here.\n\n\n    return _recacheAncestors(this);\n  };\n\n  _proto.paused = function paused(value) {\n    if (!arguments.length) {\n      return this._ps;\n    } // possible future addition - if an animation is removed from its parent and then .restart() or .play() or .resume() is called, perhaps we should force it back into the globalTimeline but be careful because what if it's already at its end? We don't want it to just persist forever and not get released for GC.\n    // !this.parent && !value && this._tTime < this._tDur && this !== _globalTimeline && _globalTimeline.add(this);\n\n\n    if (this._ps !== value) {\n      this._ps = value;\n\n      if (value) {\n        this._pTime = this._tTime || Math.max(-this._delay, this.rawTime()); // if the pause occurs during the delay phase, make sure that's factored in when resuming.\n\n        this._ts = this._act = 0; // _ts is the functional timeScale, so a paused tween would effectively have a timeScale of 0. We record the \"real\" timeScale as _rts (recorded time scale)\n      } else {\n        _wake();\n\n        this._ts = this._rts; //only defer to _pTime (pauseTime) if tTime is zero. Remember, someone could pause() an animation, then scrub the playhead and resume(). If the parent doesn't have smoothChildTiming, we render at the rawTime() because the startTime won't get updated.\n\n        this.totalTime(this.parent && !this.parent.smoothChildTiming ? this.rawTime() : this._tTime || this._pTime, this.progress() === 1 && Math.abs(this._zTime) !== _tinyNum && (this._tTime -= _tinyNum)); // edge case: animation.progress(1).pause().play() wouldn't render again because the playhead is already at the end, but the call to totalTime() below will add it back to its parent...and not remove it again (since removing only happens upon rendering at a new time). Offsetting the _tTime slightly is done simply to cause the final render in totalTime() that'll pop it off its timeline (if autoRemoveChildren is true, of course). Check to make sure _zTime isn't -_tinyNum to avoid an edge case where the playhead is pushed to the end but INSIDE a tween/callback, the timeline itself is paused thus halting rendering and leaving a few unrendered. When resuming, it wouldn't render those otherwise.\n      }\n    }\n\n    return this;\n  };\n\n  _proto.startTime = function startTime(value) {\n    if (arguments.length) {\n      this._start = _roundPrecise(value);\n      var parent = this.parent || this._dp;\n      parent && (parent._sort || !this.parent) && _addToTimeline(parent, this, this._start - this._delay);\n      return this;\n    }\n\n    return this._start;\n  };\n\n  _proto.endTime = function endTime(includeRepeats) {\n    return this._start + (_isNotFalse(includeRepeats) ? this.totalDuration() : this.duration()) / Math.abs(this._ts || 1);\n  };\n\n  _proto.rawTime = function rawTime(wrapRepeats) {\n    var parent = this.parent || this._dp; // _dp = detached parent\n\n    return !parent ? this._tTime : wrapRepeats && (!this._ts || this._repeat && this._time && this.totalProgress() < 1) ? this._tTime % (this._dur + this._rDelay) : !this._ts ? this._tTime : _parentToChildTotalTime(parent.rawTime(wrapRepeats), this);\n  };\n\n  _proto.revert = function revert(config) {\n    if (config === void 0) {\n      config = _revertConfig;\n    }\n\n    var prevIsReverting = _reverting;\n    _reverting = config;\n\n    if (_isRevertWorthy(this)) {\n      this.timeline && this.timeline.revert(config);\n      this.totalTime(-0.01, config.suppressEvents);\n    }\n\n    this.data !== \"nested\" && config.kill !== false && this.kill();\n    _reverting = prevIsReverting;\n    return this;\n  };\n\n  _proto.globalTime = function globalTime(rawTime) {\n    var animation = this,\n        time = arguments.length ? rawTime : animation.rawTime();\n\n    while (animation) {\n      time = animation._start + time / (Math.abs(animation._ts) || 1);\n      animation = animation._dp;\n    }\n\n    return !this.parent && this._sat ? this._sat.globalTime(rawTime) : time; // the _startAt tweens for .fromTo() and .from() that have immediateRender should always be FIRST in the timeline (important for context.revert()). \"_sat\" stands for _startAtTween, referring to the parent tween that created the _startAt. We must discern if that tween had immediateRender so that we can know whether or not to prioritize it in revert().\n  };\n\n  _proto.repeat = function repeat(value) {\n    if (arguments.length) {\n      this._repeat = value === Infinity ? -2 : value;\n      return _onUpdateTotalDuration(this);\n    }\n\n    return this._repeat === -2 ? Infinity : this._repeat;\n  };\n\n  _proto.repeatDelay = function repeatDelay(value) {\n    if (arguments.length) {\n      var time = this._time;\n      this._rDelay = value;\n\n      _onUpdateTotalDuration(this);\n\n      return time ? this.time(time) : this;\n    }\n\n    return this._rDelay;\n  };\n\n  _proto.yoyo = function yoyo(value) {\n    if (arguments.length) {\n      this._yoyo = value;\n      return this;\n    }\n\n    return this._yoyo;\n  };\n\n  _proto.seek = function seek(position, suppressEvents) {\n    return this.totalTime(_parsePosition(this, position), _isNotFalse(suppressEvents));\n  };\n\n  _proto.restart = function restart(includeDelay, suppressEvents) {\n    this.play().totalTime(includeDelay ? -this._delay : 0, _isNotFalse(suppressEvents));\n    this._dur || (this._zTime = -_tinyNum); // ensures onComplete fires on a zero-duration animation that gets restarted.\n\n    return this;\n  };\n\n  _proto.play = function play(from, suppressEvents) {\n    from != null && this.seek(from, suppressEvents);\n    return this.reversed(false).paused(false);\n  };\n\n  _proto.reverse = function reverse(from, suppressEvents) {\n    from != null && this.seek(from || this.totalDuration(), suppressEvents);\n    return this.reversed(true).paused(false);\n  };\n\n  _proto.pause = function pause(atTime, suppressEvents) {\n    atTime != null && this.seek(atTime, suppressEvents);\n    return this.paused(true);\n  };\n\n  _proto.resume = function resume() {\n    return this.paused(false);\n  };\n\n  _proto.reversed = function reversed(value) {\n    if (arguments.length) {\n      !!value !== this.reversed() && this.timeScale(-this._rts || (value ? -_tinyNum : 0)); // in case timeScale is zero, reversing would have no effect so we use _tinyNum.\n\n      return this;\n    }\n\n    return this._rts < 0;\n  };\n\n  _proto.invalidate = function invalidate() {\n    this._initted = this._act = 0;\n    this._zTime = -_tinyNum;\n    return this;\n  };\n\n  _proto.isActive = function isActive() {\n    var parent = this.parent || this._dp,\n        start = this._start,\n        rawTime;\n    return !!(!parent || this._ts && this._initted && parent.isActive() && (rawTime = parent.rawTime(true)) >= start && rawTime < this.endTime(true) - _tinyNum);\n  };\n\n  _proto.eventCallback = function eventCallback(type, callback, params) {\n    var vars = this.vars;\n\n    if (arguments.length > 1) {\n      if (!callback) {\n        delete vars[type];\n      } else {\n        vars[type] = callback;\n        params && (vars[type + \"Params\"] = params);\n        type === \"onUpdate\" && (this._onUpdate = callback);\n      }\n\n      return this;\n    }\n\n    return vars[type];\n  };\n\n  _proto.then = function then(onFulfilled) {\n    var self = this,\n        prevProm = self._prom;\n    return new Promise(function (resolve) {\n      var f = _isFunction(onFulfilled) ? onFulfilled : _passThrough,\n          _resolve = function _resolve() {\n        var _then = self.then;\n        self.then = null; // temporarily null the then() method to avoid an infinite loop (see https://github.com/greensock/GSAP/issues/322)\n\n        prevProm && prevProm();\n        _isFunction(f) && (f = f(self)) && (f.then || f === self) && (self.then = _then);\n        resolve(f);\n        self.then = _then;\n      };\n\n      if (self._initted && self.totalProgress() === 1 && self._ts >= 0 || !self._tTime && self._ts < 0) {\n        _resolve();\n      } else {\n        self._prom = _resolve;\n      }\n    });\n  };\n\n  _proto.kill = function kill() {\n    _interrupt(this);\n  };\n\n  return Animation;\n}();\n\n_setDefaults(Animation.prototype, {\n  _time: 0,\n  _start: 0,\n  _end: 0,\n  _tTime: 0,\n  _tDur: 0,\n  _dirty: 0,\n  _repeat: 0,\n  _yoyo: false,\n  parent: null,\n  _initted: false,\n  _rDelay: 0,\n  _ts: 1,\n  _dp: 0,\n  ratio: 0,\n  _zTime: -_tinyNum,\n  _prom: 0,\n  _ps: false,\n  _rts: 1\n});\n/*\n * -------------------------------------------------\n * TIMELINE\n * -------------------------------------------------\n */\n\n\nexport var Timeline = /*#__PURE__*/function (_Animation) {\n  _inheritsLoose(Timeline, _Animation);\n\n  function Timeline(vars, position) {\n    var _this;\n\n    if (vars === void 0) {\n      vars = {};\n    }\n\n    _this = _Animation.call(this, vars) || this;\n    _this.labels = {};\n    _this.smoothChildTiming = !!vars.smoothChildTiming;\n    _this.autoRemoveChildren = !!vars.autoRemoveChildren;\n    _this._sort = _isNotFalse(vars.sortChildren);\n    _globalTimeline && _addToTimeline(vars.parent || _globalTimeline, _assertThisInitialized(_this), position);\n    vars.reversed && _this.reverse();\n    vars.paused && _this.paused(true);\n    vars.scrollTrigger && _scrollTrigger(_assertThisInitialized(_this), vars.scrollTrigger);\n    return _this;\n  }\n\n  var _proto2 = Timeline.prototype;\n\n  _proto2.to = function to(targets, vars, position) {\n    _createTweenType(0, arguments, this);\n\n    return this;\n  };\n\n  _proto2.from = function from(targets, vars, position) {\n    _createTweenType(1, arguments, this);\n\n    return this;\n  };\n\n  _proto2.fromTo = function fromTo(targets, fromVars, toVars, position) {\n    _createTweenType(2, arguments, this);\n\n    return this;\n  };\n\n  _proto2.set = function set(targets, vars, position) {\n    vars.duration = 0;\n    vars.parent = this;\n    _inheritDefaults(vars).repeatDelay || (vars.repeat = 0);\n    vars.immediateRender = !!vars.immediateRender;\n    new Tween(targets, vars, _parsePosition(this, position), 1);\n    return this;\n  };\n\n  _proto2.call = function call(callback, params, position) {\n    return _addToTimeline(this, Tween.delayedCall(0, callback, params), position);\n  } //ONLY for backward compatibility! Maybe delete?\n  ;\n\n  _proto2.staggerTo = function staggerTo(targets, duration, vars, stagger, position, onCompleteAll, onCompleteAllParams) {\n    vars.duration = duration;\n    vars.stagger = vars.stagger || stagger;\n    vars.onComplete = onCompleteAll;\n    vars.onCompleteParams = onCompleteAllParams;\n    vars.parent = this;\n    new Tween(targets, vars, _parsePosition(this, position));\n    return this;\n  };\n\n  _proto2.staggerFrom = function staggerFrom(targets, duration, vars, stagger, position, onCompleteAll, onCompleteAllParams) {\n    vars.runBackwards = 1;\n    _inheritDefaults(vars).immediateRender = _isNotFalse(vars.immediateRender);\n    return this.staggerTo(targets, duration, vars, stagger, position, onCompleteAll, onCompleteAllParams);\n  };\n\n  _proto2.staggerFromTo = function staggerFromTo(targets, duration, fromVars, toVars, stagger, position, onCompleteAll, onCompleteAllParams) {\n    toVars.startAt = fromVars;\n    _inheritDefaults(toVars).immediateRender = _isNotFalse(toVars.immediateRender);\n    return this.staggerTo(targets, duration, toVars, stagger, position, onCompleteAll, onCompleteAllParams);\n  };\n\n  _proto2.render = function render(totalTime, suppressEvents, force) {\n    var prevTime = this._time,\n        tDur = this._dirty ? this.totalDuration() : this._tDur,\n        dur = this._dur,\n        tTime = totalTime <= 0 ? 0 : _roundPrecise(totalTime),\n        // if a paused timeline is resumed (or its _start is updated for another reason...which rounds it), that could result in the playhead shifting a **tiny** amount and a zero-duration child at that spot may get rendered at a different ratio, like its totalTime in render() may be 1e-17 instead of 0, for example.\n    crossingStart = this._zTime < 0 !== totalTime < 0 && (this._initted || !dur),\n        time,\n        child,\n        next,\n        iteration,\n        cycleDuration,\n        prevPaused,\n        pauseTween,\n        timeScale,\n        prevStart,\n        prevIteration,\n        yoyo,\n        isYoyo;\n    this !== _globalTimeline && tTime > tDur && totalTime >= 0 && (tTime = tDur);\n\n    if (tTime !== this._tTime || force || crossingStart) {\n      if (prevTime !== this._time && dur) {\n        //if totalDuration() finds a child with a negative startTime and smoothChildTiming is true, things get shifted around internally so we need to adjust the time accordingly. For example, if a tween starts at -30 we must shift EVERYTHING forward 30 seconds and move this timeline's startTime backward by 30 seconds so that things align with the playhead (no jump).\n        tTime += this._time - prevTime;\n        totalTime += this._time - prevTime;\n      }\n\n      time = tTime;\n      prevStart = this._start;\n      timeScale = this._ts;\n      prevPaused = !timeScale;\n\n      if (crossingStart) {\n        dur || (prevTime = this._zTime); //when the playhead arrives at EXACTLY time 0 (right on top) of a zero-duration timeline, we need to discern if events are suppressed so that when the playhead moves again (next time), it'll trigger the callback. If events are NOT suppressed, obviously the callback would be triggered in this render. Basically, the callback should fire either when the playhead ARRIVES or LEAVES this exact spot, not both. Imagine doing a timeline.seek(0) and there's a callback that sits at 0. Since events are suppressed on that seek() by default, nothing will fire, but when the playhead moves off of that position, the callback should fire. This behavior is what people intuitively expect.\n\n        (totalTime || !suppressEvents) && (this._zTime = totalTime);\n      }\n\n      if (this._repeat) {\n        //adjust the time for repeats and yoyos\n        yoyo = this._yoyo;\n        cycleDuration = dur + this._rDelay;\n\n        if (this._repeat < -1 && totalTime < 0) {\n          return this.totalTime(cycleDuration * 100 + totalTime, suppressEvents, force);\n        }\n\n        time = _roundPrecise(tTime % cycleDuration); //round to avoid floating point errors. (4 % 0.8 should be 0 but some browsers report it as 0.79999999!)\n\n        if (tTime === tDur) {\n          // the tDur === tTime is for edge cases where there's a lengthy decimal on the duration and it may reach the very end but the time is rendered as not-quite-there (remember, tDur is rounded to 4 decimals whereas dur isn't)\n          iteration = this._repeat;\n          time = dur;\n        } else {\n          prevIteration = _roundPrecise(tTime / cycleDuration); // full decimal version of iterations, not the previous iteration (we're reusing prevIteration variable for efficiency)\n\n          iteration = ~~prevIteration;\n\n          if (iteration && iteration === prevIteration) {\n            time = dur;\n            iteration--;\n          }\n\n          time > dur && (time = dur);\n        }\n\n        prevIteration = _animationCycle(this._tTime, cycleDuration);\n        !prevTime && this._tTime && prevIteration !== iteration && this._tTime - prevIteration * cycleDuration - this._dur <= 0 && (prevIteration = iteration); // edge case - if someone does addPause() at the very beginning of a repeating timeline, that pause is technically at the same spot as the end which causes this._time to get set to 0 when the totalTime would normally place the playhead at the end. See https://gsap.com/forums/topic/23823-closing-nav-animation-not-working-on-ie-and-iphone-6-maybe-other-older-browser/?tab=comments#comment-113005 also, this._tTime - prevIteration * cycleDuration - this._dur <= 0 just checks to make sure it wasn't previously in the \"repeatDelay\" portion\n\n        if (yoyo && iteration & 1) {\n          time = dur - time;\n          isYoyo = 1;\n        }\n        /*\n        make sure children at the end/beginning of the timeline are rendered properly. If, for example,\n        a 3-second long timeline rendered at 2.9 seconds previously, and now renders at 3.2 seconds (which\n        would get translated to 2.8 seconds if the timeline yoyos or 0.2 seconds if it just repeats), there\n        could be a callback or a short tween that's at 2.95 or 3 seconds in which wouldn't render. So\n        we need to push the timeline to the end (and/or beginning depending on its yoyo value). Also we must\n        ensure that zero-duration tweens at the very beginning or end of the Timeline work.\n        */\n\n\n        if (iteration !== prevIteration && !this._lock) {\n          var rewinding = yoyo && prevIteration & 1,\n              doesWrap = rewinding === (yoyo && iteration & 1);\n          iteration < prevIteration && (rewinding = !rewinding);\n          prevTime = rewinding ? 0 : tTime % dur ? dur : tTime; // if the playhead is landing exactly at the end of an iteration, use that totalTime rather than only the duration, otherwise it'll skip the 2nd render since it's effectively at the same time.\n\n          this._lock = 1;\n          this.render(prevTime || (isYoyo ? 0 : _roundPrecise(iteration * cycleDuration)), suppressEvents, !dur)._lock = 0;\n          this._tTime = tTime; // if a user gets the iteration() inside the onRepeat, for example, it should be accurate.\n\n          !suppressEvents && this.parent && _callback(this, \"onRepeat\");\n\n          if (this.vars.repeatRefresh && !isYoyo) {\n            this.invalidate()._lock = 1;\n            prevIteration = iteration; // otherwise, the onStart() may fire on the 2nd iteration.\n          }\n\n          if (prevTime && prevTime !== this._time || prevPaused !== !this._ts || this.vars.onRepeat && !this.parent && !this._act) {\n            // if prevTime is 0 and we render at the very end, _time will be the end, thus won't match. So in this edge case, prevTime won't match _time but that's okay. If it gets killed in the onRepeat, eject as well.\n            return this;\n          }\n\n          dur = this._dur; // in case the duration changed in the onRepeat\n\n          tDur = this._tDur;\n\n          if (doesWrap) {\n            this._lock = 2;\n            prevTime = rewinding ? dur : -0.0001;\n            this.render(prevTime, true);\n            this.vars.repeatRefresh && !isYoyo && this.invalidate();\n          }\n\n          this._lock = 0;\n\n          if (!this._ts && !prevPaused) {\n            return this;\n          } //in order for yoyoEase to work properly when there's a stagger, we must swap out the ease in each sub-tween.\n\n\n          _propagateYoyoEase(this, isYoyo);\n        }\n      }\n\n      if (this._hasPause && !this._forcing && this._lock < 2) {\n        pauseTween = _findNextPauseTween(this, _roundPrecise(prevTime), _roundPrecise(time));\n\n        if (pauseTween) {\n          tTime -= time - (time = pauseTween._start);\n        }\n      }\n\n      this._tTime = tTime;\n      this._time = time;\n      this._act = !timeScale; //as long as it's not paused, force it to be active so that if the user renders independent of the parent timeline, it'll be forced to re-render on the next tick.\n\n      if (!this._initted) {\n        this._onUpdate = this.vars.onUpdate;\n        this._initted = 1;\n        this._zTime = totalTime;\n        prevTime = 0; // upon init, the playhead should always go forward; someone could invalidate() a completed timeline and then if they restart(), that would make child tweens render in reverse order which could lock in the wrong starting values if they build on each other, like tl.to(obj, {x: 100}).to(obj, {x: 0}).\n      }\n\n      if (!prevTime && tTime && dur && !suppressEvents && !prevIteration) {\n        _callback(this, \"onStart\");\n\n        if (this._tTime !== tTime) {\n          // in case the onStart triggered a render at a different spot, eject. Like if someone did animation.pause(0.5) or something inside the onStart.\n          return this;\n        }\n      }\n\n      if (time >= prevTime && totalTime >= 0) {\n        child = this._first;\n\n        while (child) {\n          next = child._next;\n\n          if ((child._act || time >= child._start) && child._ts && pauseTween !== child) {\n            if (child.parent !== this) {\n              // an extreme edge case - the child's render could do something like kill() the \"next\" one in the linked list, or reparent it. In that case we must re-initiate the whole render to be safe.\n              return this.render(totalTime, suppressEvents, force);\n            }\n\n            child.render(child._ts > 0 ? (time - child._start) * child._ts : (child._dirty ? child.totalDuration() : child._tDur) + (time - child._start) * child._ts, suppressEvents, force);\n\n            if (time !== this._time || !this._ts && !prevPaused) {\n              //in case a tween pauses or seeks the timeline when rendering, like inside of an onUpdate/onComplete\n              pauseTween = 0;\n              next && (tTime += this._zTime = -_tinyNum); // it didn't finish rendering, so flag zTime as negative so that the next time render() is called it'll be forced (to render any remaining children)\n\n              break;\n            }\n          }\n\n          child = next;\n        }\n      } else {\n        child = this._last;\n        var adjustedTime = totalTime < 0 ? totalTime : time; //when the playhead goes backward beyond the start of this timeline, we must pass that information down to the child animations so that zero-duration tweens know whether to render their starting or ending values.\n\n        while (child) {\n          next = child._prev;\n\n          if ((child._act || adjustedTime <= child._end) && child._ts && pauseTween !== child) {\n            if (child.parent !== this) {\n              // an extreme edge case - the child's render could do something like kill() the \"next\" one in the linked list, or reparent it. In that case we must re-initiate the whole render to be safe.\n              return this.render(totalTime, suppressEvents, force);\n            }\n\n            child.render(child._ts > 0 ? (adjustedTime - child._start) * child._ts : (child._dirty ? child.totalDuration() : child._tDur) + (adjustedTime - child._start) * child._ts, suppressEvents, force || _reverting && _isRevertWorthy(child)); // if reverting, we should always force renders of initted tweens (but remember that .fromTo() or .from() may have a _startAt but not _initted yet). If, for example, a .fromTo() tween with a stagger (which creates an internal timeline) gets reverted BEFORE some of its child tweens render for the first time, it may not properly trigger them to revert.\n\n            if (time !== this._time || !this._ts && !prevPaused) {\n              //in case a tween pauses or seeks the timeline when rendering, like inside of an onUpdate/onComplete\n              pauseTween = 0;\n              next && (tTime += this._zTime = adjustedTime ? -_tinyNum : _tinyNum); // it didn't finish rendering, so adjust zTime so that so that the next time render() is called it'll be forced (to render any remaining children)\n\n              break;\n            }\n          }\n\n          child = next;\n        }\n      }\n\n      if (pauseTween && !suppressEvents) {\n        this.pause();\n        pauseTween.render(time >= prevTime ? 0 : -_tinyNum)._zTime = time >= prevTime ? 1 : -1;\n\n        if (this._ts) {\n          //the callback resumed playback! So since we may have held back the playhead due to where the pause is positioned, go ahead and jump to where it's SUPPOSED to be (if no pause happened).\n          this._start = prevStart; //if the pause was at an earlier time and the user resumed in the callback, it could reposition the timeline (changing its startTime), throwing things off slightly, so we make sure the _start doesn't shift.\n\n          _setEnd(this);\n\n          return this.render(totalTime, suppressEvents, force);\n        }\n      }\n\n      this._onUpdate && !suppressEvents && _callback(this, \"onUpdate\", true);\n      if (tTime === tDur && this._tTime >= this.totalDuration() || !tTime && prevTime) if (prevStart === this._start || Math.abs(timeScale) !== Math.abs(this._ts)) if (!this._lock) {\n        // remember, a child's callback may alter this timeline's playhead or timeScale which is why we need to add some of these checks.\n        (totalTime || !dur) && (tTime === tDur && this._ts > 0 || !tTime && this._ts < 0) && _removeFromParent(this, 1); // don't remove if the timeline is reversed and the playhead isn't at 0, otherwise tl.progress(1).reverse() won't work. Only remove if the playhead is at the end and timeScale is positive, or if the playhead is at 0 and the timeScale is negative.\n\n        if (!suppressEvents && !(totalTime < 0 && !prevTime) && (tTime || prevTime || !tDur)) {\n          _callback(this, tTime === tDur && totalTime >= 0 ? \"onComplete\" : \"onReverseComplete\", true);\n\n          this._prom && !(tTime < tDur && this.timeScale() > 0) && this._prom();\n        }\n      }\n    }\n\n    return this;\n  };\n\n  _proto2.add = function add(child, position) {\n    var _this2 = this;\n\n    _isNumber(position) || (position = _parsePosition(this, position, child));\n\n    if (!(child instanceof Animation)) {\n      if (_isArray(child)) {\n        child.forEach(function (obj) {\n          return _this2.add(obj, position);\n        });\n        return this;\n      }\n\n      if (_isString(child)) {\n        return this.addLabel(child, position);\n      }\n\n      if (_isFunction(child)) {\n        child = Tween.delayedCall(0, child);\n      } else {\n        return this;\n      }\n    }\n\n    return this !== child ? _addToTimeline(this, child, position) : this; //don't allow a timeline to be added to itself as a child!\n  };\n\n  _proto2.getChildren = function getChildren(nested, tweens, timelines, ignoreBeforeTime) {\n    if (nested === void 0) {\n      nested = true;\n    }\n\n    if (tweens === void 0) {\n      tweens = true;\n    }\n\n    if (timelines === void 0) {\n      timelines = true;\n    }\n\n    if (ignoreBeforeTime === void 0) {\n      ignoreBeforeTime = -_bigNum;\n    }\n\n    var a = [],\n        child = this._first;\n\n    while (child) {\n      if (child._start >= ignoreBeforeTime) {\n        if (child instanceof Tween) {\n          tweens && a.push(child);\n        } else {\n          timelines && a.push(child);\n          nested && a.push.apply(a, child.getChildren(true, tweens, timelines));\n        }\n      }\n\n      child = child._next;\n    }\n\n    return a;\n  };\n\n  _proto2.getById = function getById(id) {\n    var animations = this.getChildren(1, 1, 1),\n        i = animations.length;\n\n    while (i--) {\n      if (animations[i].vars.id === id) {\n        return animations[i];\n      }\n    }\n  };\n\n  _proto2.remove = function remove(child) {\n    if (_isString(child)) {\n      return this.removeLabel(child);\n    }\n\n    if (_isFunction(child)) {\n      return this.killTweensOf(child);\n    }\n\n    child.parent === this && _removeLinkedListItem(this, child);\n\n    if (child === this._recent) {\n      this._recent = this._last;\n    }\n\n    return _uncache(this);\n  };\n\n  _proto2.totalTime = function totalTime(_totalTime2, suppressEvents) {\n    if (!arguments.length) {\n      return this._tTime;\n    }\n\n    this._forcing = 1;\n\n    if (!this._dp && this._ts) {\n      //special case for the global timeline (or any other that has no parent or detached parent).\n      this._start = _roundPrecise(_ticker.time - (this._ts > 0 ? _totalTime2 / this._ts : (this.totalDuration() - _totalTime2) / -this._ts));\n    }\n\n    _Animation.prototype.totalTime.call(this, _totalTime2, suppressEvents);\n\n    this._forcing = 0;\n    return this;\n  };\n\n  _proto2.addLabel = function addLabel(label, position) {\n    this.labels[label] = _parsePosition(this, position);\n    return this;\n  };\n\n  _proto2.removeLabel = function removeLabel(label) {\n    delete this.labels[label];\n    return this;\n  };\n\n  _proto2.addPause = function addPause(position, callback, params) {\n    var t = Tween.delayedCall(0, callback || _emptyFunc, params);\n    t.data = \"isPause\";\n    this._hasPause = 1;\n    return _addToTimeline(this, t, _parsePosition(this, position));\n  };\n\n  _proto2.removePause = function removePause(position) {\n    var child = this._first;\n    position = _parsePosition(this, position);\n\n    while (child) {\n      if (child._start === position && child.data === \"isPause\") {\n        _removeFromParent(child);\n      }\n\n      child = child._next;\n    }\n  };\n\n  _proto2.killTweensOf = function killTweensOf(targets, props, onlyActive) {\n    var tweens = this.getTweensOf(targets, onlyActive),\n        i = tweens.length;\n\n    while (i--) {\n      _overwritingTween !== tweens[i] && tweens[i].kill(targets, props);\n    }\n\n    return this;\n  };\n\n  _proto2.getTweensOf = function getTweensOf(targets, onlyActive) {\n    var a = [],\n        parsedTargets = toArray(targets),\n        child = this._first,\n        isGlobalTime = _isNumber(onlyActive),\n        // a number is interpreted as a global time. If the animation spans\n    children;\n\n    while (child) {\n      if (child instanceof Tween) {\n        if (_arrayContainsAny(child._targets, parsedTargets) && (isGlobalTime ? (!_overwritingTween || child._initted && child._ts) && child.globalTime(0) <= onlyActive && child.globalTime(child.totalDuration()) > onlyActive : !onlyActive || child.isActive())) {\n          // note: if this is for overwriting, it should only be for tweens that aren't paused and are initted.\n          a.push(child);\n        }\n      } else if ((children = child.getTweensOf(parsedTargets, onlyActive)).length) {\n        a.push.apply(a, children);\n      }\n\n      child = child._next;\n    }\n\n    return a;\n  } // potential future feature - targets() on timelines\n  // targets() {\n  // \tlet result = [];\n  // \tthis.getChildren(true, true, false).forEach(t => result.push(...t.targets()));\n  // \treturn result.filter((v, i) => result.indexOf(v) === i);\n  // }\n  ;\n\n  _proto2.tweenTo = function tweenTo(position, vars) {\n    vars = vars || {};\n\n    var tl = this,\n        endTime = _parsePosition(tl, position),\n        _vars = vars,\n        startAt = _vars.startAt,\n        _onStart = _vars.onStart,\n        onStartParams = _vars.onStartParams,\n        immediateRender = _vars.immediateRender,\n        initted,\n        tween = Tween.to(tl, _setDefaults({\n      ease: vars.ease || \"none\",\n      lazy: false,\n      immediateRender: false,\n      time: endTime,\n      overwrite: \"auto\",\n      duration: vars.duration || Math.abs((endTime - (startAt && \"time\" in startAt ? startAt.time : tl._time)) / tl.timeScale()) || _tinyNum,\n      onStart: function onStart() {\n        tl.pause();\n\n        if (!initted) {\n          var duration = vars.duration || Math.abs((endTime - (startAt && \"time\" in startAt ? startAt.time : tl._time)) / tl.timeScale());\n          tween._dur !== duration && _setDuration(tween, duration, 0, 1).render(tween._time, true, true);\n          initted = 1;\n        }\n\n        _onStart && _onStart.apply(tween, onStartParams || []); //in case the user had an onStart in the vars - we don't want to overwrite it.\n      }\n    }, vars));\n\n    return immediateRender ? tween.render(0) : tween;\n  };\n\n  _proto2.tweenFromTo = function tweenFromTo(fromPosition, toPosition, vars) {\n    return this.tweenTo(toPosition, _setDefaults({\n      startAt: {\n        time: _parsePosition(this, fromPosition)\n      }\n    }, vars));\n  };\n\n  _proto2.recent = function recent() {\n    return this._recent;\n  };\n\n  _proto2.nextLabel = function nextLabel(afterTime) {\n    if (afterTime === void 0) {\n      afterTime = this._time;\n    }\n\n    return _getLabelInDirection(this, _parsePosition(this, afterTime));\n  };\n\n  _proto2.previousLabel = function previousLabel(beforeTime) {\n    if (beforeTime === void 0) {\n      beforeTime = this._time;\n    }\n\n    return _getLabelInDirection(this, _parsePosition(this, beforeTime), 1);\n  };\n\n  _proto2.currentLabel = function currentLabel(value) {\n    return arguments.length ? this.seek(value, true) : this.previousLabel(this._time + _tinyNum);\n  };\n\n  _proto2.shiftChildren = function shiftChildren(amount, adjustLabels, ignoreBeforeTime) {\n    if (ignoreBeforeTime === void 0) {\n      ignoreBeforeTime = 0;\n    }\n\n    var child = this._first,\n        labels = this.labels,\n        p;\n    amount = _roundPrecise(amount);\n\n    while (child) {\n      if (child._start >= ignoreBeforeTime) {\n        child._start += amount;\n        child._end += amount;\n      }\n\n      child = child._next;\n    }\n\n    if (adjustLabels) {\n      for (p in labels) {\n        if (labels[p] >= ignoreBeforeTime) {\n          labels[p] += amount;\n        }\n      }\n    }\n\n    return _uncache(this);\n  };\n\n  _proto2.invalidate = function invalidate(soft) {\n    var child = this._first;\n    this._lock = 0;\n\n    while (child) {\n      child.invalidate(soft);\n      child = child._next;\n    }\n\n    return _Animation.prototype.invalidate.call(this, soft);\n  };\n\n  _proto2.clear = function clear(includeLabels) {\n    if (includeLabels === void 0) {\n      includeLabels = true;\n    }\n\n    var child = this._first,\n        next;\n\n    while (child) {\n      next = child._next;\n      this.remove(child);\n      child = next;\n    }\n\n    this._dp && (this._time = this._tTime = this._pTime = 0);\n    includeLabels && (this.labels = {});\n    return _uncache(this);\n  };\n\n  _proto2.totalDuration = function totalDuration(value) {\n    var max = 0,\n        self = this,\n        child = self._last,\n        prevStart = _bigNum,\n        prev,\n        start,\n        parent;\n\n    if (arguments.length) {\n      return self.timeScale((self._repeat < 0 ? self.duration() : self.totalDuration()) / (self.reversed() ? -value : value));\n    }\n\n    if (self._dirty) {\n      parent = self.parent;\n\n      while (child) {\n        prev = child._prev; //record it here in case the tween changes position in the sequence...\n\n        child._dirty && child.totalDuration(); //could change the tween._startTime, so make sure the animation's cache is clean before analyzing it.\n\n        start = child._start;\n\n        if (start > prevStart && self._sort && child._ts && !self._lock) {\n          //in case one of the tweens shifted out of order, it needs to be re-inserted into the correct position in the sequence\n          self._lock = 1; //prevent endless recursive calls - there are methods that get triggered that check duration/totalDuration when we add().\n\n          _addToTimeline(self, child, start - child._delay, 1)._lock = 0;\n        } else {\n          prevStart = start;\n        }\n\n        if (start < 0 && child._ts) {\n          //children aren't allowed to have negative startTimes unless smoothChildTiming is true, so adjust here if one is found.\n          max -= start;\n\n          if (!parent && !self._dp || parent && parent.smoothChildTiming) {\n            self._start += _roundPrecise(start / self._ts);\n            self._time -= start;\n            self._tTime -= start;\n          }\n\n          self.shiftChildren(-start, false, -1e999);\n          prevStart = 0;\n        }\n\n        child._end > max && child._ts && (max = child._end);\n        child = prev;\n      }\n\n      _setDuration(self, self === _globalTimeline && self._time > max ? self._time : max, 1, 1);\n\n      self._dirty = 0;\n    }\n\n    return self._tDur;\n  };\n\n  Timeline.updateRoot = function updateRoot(time) {\n    if (_globalTimeline._ts) {\n      _lazySafeRender(_globalTimeline, _parentToChildTotalTime(time, _globalTimeline));\n\n      _lastRenderedFrame = _ticker.frame;\n    }\n\n    if (_ticker.frame >= _nextGCFrame) {\n      _nextGCFrame += _config.autoSleep || 120;\n      var child = _globalTimeline._first;\n      if (!child || !child._ts) if (_config.autoSleep && _ticker._listeners.length < 2) {\n        while (child && !child._ts) {\n          child = child._next;\n        }\n\n        child || _ticker.sleep();\n      }\n    }\n  };\n\n  return Timeline;\n}(Animation);\n\n_setDefaults(Timeline.prototype, {\n  _lock: 0,\n  _hasPause: 0,\n  _forcing: 0\n});\n\nvar _addComplexStringPropTween = function _addComplexStringPropTween(target, prop, start, end, setter, stringFilter, funcParam) {\n  //note: we call _addComplexStringPropTween.call(tweenInstance...) to ensure that it's scoped properly. We may call it from within a plugin too, thus \"this\" would refer to the plugin.\n  var pt = new PropTween(this._pt, target, prop, 0, 1, _renderComplexString, null, setter),\n      index = 0,\n      matchIndex = 0,\n      result,\n      startNums,\n      color,\n      endNum,\n      chunk,\n      startNum,\n      hasRandom,\n      a;\n  pt.b = start;\n  pt.e = end;\n  start += \"\"; //ensure values are strings\n\n  end += \"\";\n\n  if (hasRandom = ~end.indexOf(\"random(\")) {\n    end = _replaceRandom(end);\n  }\n\n  if (stringFilter) {\n    a = [start, end];\n    stringFilter(a, target, prop); //pass an array with the starting and ending values and let the filter do whatever it needs to the values.\n\n    start = a[0];\n    end = a[1];\n  }\n\n  startNums = start.match(_complexStringNumExp) || [];\n\n  while (result = _complexStringNumExp.exec(end)) {\n    endNum = result[0];\n    chunk = end.substring(index, result.index);\n\n    if (color) {\n      color = (color + 1) % 5;\n    } else if (chunk.substr(-5) === \"rgba(\") {\n      color = 1;\n    }\n\n    if (endNum !== startNums[matchIndex++]) {\n      startNum = parseFloat(startNums[matchIndex - 1]) || 0; //these nested PropTweens are handled in a special way - we'll never actually call a render or setter method on them. We'll just loop through them in the parent complex string PropTween's render method.\n\n      pt._pt = {\n        _next: pt._pt,\n        p: chunk || matchIndex === 1 ? chunk : \",\",\n        //note: SVG spec allows omission of comma/space when a negative sign is wedged between two numbers, like 2.5-5.3 instead of 2.5,-5.3 but when tweening, the negative value may switch to positive, so we insert the comma just in case.\n        s: startNum,\n        c: endNum.charAt(1) === \"=\" ? _parseRelative(startNum, endNum) - startNum : parseFloat(endNum) - startNum,\n        m: color && color < 4 ? Math.round : 0\n      };\n      index = _complexStringNumExp.lastIndex;\n    }\n  }\n\n  pt.c = index < end.length ? end.substring(index, end.length) : \"\"; //we use the \"c\" of the PropTween to store the final part of the string (after the last number)\n\n  pt.fp = funcParam;\n\n  if (_relExp.test(end) || hasRandom) {\n    pt.e = 0; //if the end string contains relative values or dynamic random(...) values, delete the end it so that on the final render we don't actually set it to the string with += or -= characters (forces it to use the calculated value).\n  }\n\n  this._pt = pt; //start the linked list with this new PropTween. Remember, we call _addComplexStringPropTween.call(tweenInstance...) to ensure that it's scoped properly. We may call it from within a plugin too, thus \"this\" would refer to the plugin.\n\n  return pt;\n},\n    _addPropTween = function _addPropTween(target, prop, start, end, index, targets, modifier, stringFilter, funcParam, optional) {\n  _isFunction(end) && (end = end(index || 0, target, targets));\n  var currentValue = target[prop],\n      parsedStart = start !== \"get\" ? start : !_isFunction(currentValue) ? currentValue : funcParam ? target[prop.indexOf(\"set\") || !_isFunction(target[\"get\" + prop.substr(3)]) ? prop : \"get\" + prop.substr(3)](funcParam) : target[prop](),\n      setter = !_isFunction(currentValue) ? _setterPlain : funcParam ? _setterFuncWithParam : _setterFunc,\n      pt;\n\n  if (_isString(end)) {\n    if (~end.indexOf(\"random(\")) {\n      end = _replaceRandom(end);\n    }\n\n    if (end.charAt(1) === \"=\") {\n      pt = _parseRelative(parsedStart, end) + (getUnit(parsedStart) || 0);\n\n      if (pt || pt === 0) {\n        // to avoid isNaN, like if someone passes in a value like \"!= whatever\"\n        end = pt;\n      }\n    }\n  }\n\n  if (!optional || parsedStart !== end || _forceAllPropTweens) {\n    if (!isNaN(parsedStart * end) && end !== \"\") {\n      // fun fact: any number multiplied by \"\" is evaluated as the number 0!\n      pt = new PropTween(this._pt, target, prop, +parsedStart || 0, end - (parsedStart || 0), typeof currentValue === \"boolean\" ? _renderBoolean : _renderPlain, 0, setter);\n      funcParam && (pt.fp = funcParam);\n      modifier && pt.modifier(modifier, this, target);\n      return this._pt = pt;\n    }\n\n    !currentValue && !(prop in target) && _missingPlugin(prop, end);\n    return _addComplexStringPropTween.call(this, target, prop, parsedStart, end, setter, stringFilter || _config.stringFilter, funcParam);\n  }\n},\n    //creates a copy of the vars object and processes any function-based values (putting the resulting values directly into the copy) as well as strings with \"random()\" in them. It does NOT process relative values.\n_processVars = function _processVars(vars, index, target, targets, tween) {\n  _isFunction(vars) && (vars = _parseFuncOrString(vars, tween, index, target, targets));\n\n  if (!_isObject(vars) || vars.style && vars.nodeType || _isArray(vars) || _isTypedArray(vars)) {\n    return _isString(vars) ? _parseFuncOrString(vars, tween, index, target, targets) : vars;\n  }\n\n  var copy = {},\n      p;\n\n  for (p in vars) {\n    copy[p] = _parseFuncOrString(vars[p], tween, index, target, targets);\n  }\n\n  return copy;\n},\n    _checkPlugin = function _checkPlugin(property, vars, tween, index, target, targets) {\n  var plugin, pt, ptLookup, i;\n\n  if (_plugins[property] && (plugin = new _plugins[property]()).init(target, plugin.rawVars ? vars[property] : _processVars(vars[property], index, target, targets, tween), tween, index, targets) !== false) {\n    tween._pt = pt = new PropTween(tween._pt, target, property, 0, 1, plugin.render, plugin, 0, plugin.priority);\n\n    if (tween !== _quickTween) {\n      ptLookup = tween._ptLookup[tween._targets.indexOf(target)]; //note: we can't use tween._ptLookup[index] because for staggered tweens, the index from the fullTargets array won't match what it is in each individual tween that spawns from the stagger.\n\n      i = plugin._props.length;\n\n      while (i--) {\n        ptLookup[plugin._props[i]] = pt;\n      }\n    }\n  }\n\n  return plugin;\n},\n    _overwritingTween,\n    //store a reference temporarily so we can avoid overwriting itself.\n_forceAllPropTweens,\n    _initTween = function _initTween(tween, time, tTime) {\n  var vars = tween.vars,\n      ease = vars.ease,\n      startAt = vars.startAt,\n      immediateRender = vars.immediateRender,\n      lazy = vars.lazy,\n      onUpdate = vars.onUpdate,\n      runBackwards = vars.runBackwards,\n      yoyoEase = vars.yoyoEase,\n      keyframes = vars.keyframes,\n      autoRevert = vars.autoRevert,\n      dur = tween._dur,\n      prevStartAt = tween._startAt,\n      targets = tween._targets,\n      parent = tween.parent,\n      fullTargets = parent && parent.data === \"nested\" ? parent.vars.targets : targets,\n      autoOverwrite = tween._overwrite === \"auto\" && !_suppressOverwrites,\n      tl = tween.timeline,\n      cleanVars,\n      i,\n      p,\n      pt,\n      target,\n      hasPriority,\n      gsData,\n      harness,\n      plugin,\n      ptLookup,\n      index,\n      harnessVars,\n      overwritten;\n  tl && (!keyframes || !ease) && (ease = \"none\");\n  tween._ease = _parseEase(ease, _defaults.ease);\n  tween._yEase = yoyoEase ? _invertEase(_parseEase(yoyoEase === true ? ease : yoyoEase, _defaults.ease)) : 0;\n\n  if (yoyoEase && tween._yoyo && !tween._repeat) {\n    //there must have been a parent timeline with yoyo:true that is currently in its yoyo phase, so flip the eases.\n    yoyoEase = tween._yEase;\n    tween._yEase = tween._ease;\n    tween._ease = yoyoEase;\n  }\n\n  tween._from = !tl && !!vars.runBackwards; //nested timelines should never run backwards - the backwards-ness is in the child tweens.\n\n  if (!tl || keyframes && !vars.stagger) {\n    //if there's an internal timeline, skip all the parsing because we passed that task down the chain.\n    harness = targets[0] ? _getCache(targets[0]).harness : 0;\n    harnessVars = harness && vars[harness.prop]; //someone may need to specify CSS-specific values AND non-CSS values, like if the element has an \"x\" property plus it's a standard DOM element. We allow people to distinguish by wrapping plugin-specific stuff in a css:{} object for example.\n\n    cleanVars = _copyExcluding(vars, _reservedProps);\n\n    if (prevStartAt) {\n      prevStartAt._zTime < 0 && prevStartAt.progress(1); // in case it's a lazy startAt that hasn't rendered yet.\n\n      time < 0 && runBackwards && immediateRender && !autoRevert ? prevStartAt.render(-1, true) : prevStartAt.revert(runBackwards && dur ? _revertConfigNoKill : _startAtRevertConfig); // if it's a \"startAt\" (not \"from()\" or runBackwards: true), we only need to do a shallow revert (keep transforms cached in CSSPlugin)\n      // don't just _removeFromParent(prevStartAt.render(-1, true)) because that'll leave inline styles. We're creating a new _startAt for \"startAt\" tweens that re-capture things to ensure that if the pre-tween values changed since the tween was created, they're recorded.\n\n      prevStartAt._lazy = 0;\n    }\n\n    if (startAt) {\n      _removeFromParent(tween._startAt = Tween.set(targets, _setDefaults({\n        data: \"isStart\",\n        overwrite: false,\n        parent: parent,\n        immediateRender: true,\n        lazy: !prevStartAt && _isNotFalse(lazy),\n        startAt: null,\n        delay: 0,\n        onUpdate: onUpdate && function () {\n          return _callback(tween, \"onUpdate\");\n        },\n        stagger: 0\n      }, startAt))); //copy the properties/values into a new object to avoid collisions, like var to = {x:0}, from = {x:500}; timeline.fromTo(e, from, to).fromTo(e, to, from);\n\n\n      tween._startAt._dp = 0; // don't allow it to get put back into root timeline! Like when revert() is called and totalTime() gets set.\n\n      tween._startAt._sat = tween; // used in globalTime(). _sat stands for _startAtTween\n\n      time < 0 && (_reverting || !immediateRender && !autoRevert) && tween._startAt.revert(_revertConfigNoKill); // rare edge case, like if a render is forced in the negative direction of a non-initted tween.\n\n      if (immediateRender) {\n        if (dur && time <= 0 && tTime <= 0) {\n          // check tTime here because in the case of a yoyo tween whose playhead gets pushed to the end like tween.progress(1), we should allow it through so that the onComplete gets fired properly.\n          time && (tween._zTime = time);\n          return; //we skip initialization here so that overwriting doesn't occur until the tween actually begins. Otherwise, if you create several immediateRender:true tweens of the same target/properties to drop into a Timeline, the last one created would overwrite the first ones because they didn't get placed into the timeline yet before the first render occurs and kicks in overwriting.\n        }\n      }\n    } else if (runBackwards && dur) {\n      //from() tweens must be handled uniquely: their beginning values must be rendered but we don't want overwriting to occur yet (when time is still 0). Wait until the tween actually begins before doing all the routines like overwriting. At that time, we should render at the END of the tween to ensure that things initialize correctly (remember, from() tweens go backwards)\n      if (!prevStartAt) {\n        time && (immediateRender = false); //in rare cases (like if a from() tween runs and then is invalidate()-ed), immediateRender could be true but the initial forced-render gets skipped, so there's no need to force the render in this context when the _time is greater than 0\n\n        p = _setDefaults({\n          overwrite: false,\n          data: \"isFromStart\",\n          //we tag the tween with as \"isFromStart\" so that if [inside a plugin] we need to only do something at the very END of a tween, we have a way of identifying this tween as merely the one that's setting the beginning values for a \"from()\" tween. For example, clearProps in CSSPlugin should only get applied at the very END of a tween and without this tag, from(...{height:100, clearProps:\"height\", delay:1}) would wipe the height at the beginning of the tween and after 1 second, it'd kick back in.\n          lazy: immediateRender && !prevStartAt && _isNotFalse(lazy),\n          immediateRender: immediateRender,\n          //zero-duration tweens render immediately by default, but if we're not specifically instructed to render this tween immediately, we should skip this and merely _init() to record the starting values (rendering them immediately would push them to completion which is wasteful in that case - we'd have to render(-1) immediately after)\n          stagger: 0,\n          parent: parent //ensures that nested tweens that had a stagger are handled properly, like gsap.from(\".class\", {y: gsap.utils.wrap([-100,100]), stagger: 0.5})\n\n        }, cleanVars);\n        harnessVars && (p[harness.prop] = harnessVars); // in case someone does something like .from(..., {css:{}})\n\n        _removeFromParent(tween._startAt = Tween.set(targets, p));\n\n        tween._startAt._dp = 0; // don't allow it to get put back into root timeline!\n\n        tween._startAt._sat = tween; // used in globalTime()\n\n        time < 0 && (_reverting ? tween._startAt.revert(_revertConfigNoKill) : tween._startAt.render(-1, true));\n        tween._zTime = time;\n\n        if (!immediateRender) {\n          _initTween(tween._startAt, _tinyNum, _tinyNum); //ensures that the initial values are recorded\n\n        } else if (!time) {\n          return;\n        }\n      }\n    }\n\n    tween._pt = tween._ptCache = 0;\n    lazy = dur && _isNotFalse(lazy) || lazy && !dur;\n\n    for (i = 0; i < targets.length; i++) {\n      target = targets[i];\n      gsData = target._gsap || _harness(targets)[i]._gsap;\n      tween._ptLookup[i] = ptLookup = {};\n      _lazyLookup[gsData.id] && _lazyTweens.length && _lazyRender(); //if other tweens of the same target have recently initted but haven't rendered yet, we've got to force the render so that the starting values are correct (imagine populating a timeline with a bunch of sequential tweens and then jumping to the end)\n\n      index = fullTargets === targets ? i : fullTargets.indexOf(target);\n\n      if (harness && (plugin = new harness()).init(target, harnessVars || cleanVars, tween, index, fullTargets) !== false) {\n        tween._pt = pt = new PropTween(tween._pt, target, plugin.name, 0, 1, plugin.render, plugin, 0, plugin.priority);\n\n        plugin._props.forEach(function (name) {\n          ptLookup[name] = pt;\n        });\n\n        plugin.priority && (hasPriority = 1);\n      }\n\n      if (!harness || harnessVars) {\n        for (p in cleanVars) {\n          if (_plugins[p] && (plugin = _checkPlugin(p, cleanVars, tween, index, target, fullTargets))) {\n            plugin.priority && (hasPriority = 1);\n          } else {\n            ptLookup[p] = pt = _addPropTween.call(tween, target, p, \"get\", cleanVars[p], index, fullTargets, 0, vars.stringFilter);\n          }\n        }\n      }\n\n      tween._op && tween._op[i] && tween.kill(target, tween._op[i]);\n\n      if (autoOverwrite && tween._pt) {\n        _overwritingTween = tween;\n\n        _globalTimeline.killTweensOf(target, ptLookup, tween.globalTime(time)); // make sure the overwriting doesn't overwrite THIS tween!!!\n\n\n        overwritten = !tween.parent;\n        _overwritingTween = 0;\n      }\n\n      tween._pt && lazy && (_lazyLookup[gsData.id] = 1);\n    }\n\n    hasPriority && _sortPropTweensByPriority(tween);\n    tween._onInit && tween._onInit(tween); //plugins like RoundProps must wait until ALL of the PropTweens are instantiated. In the plugin's init() function, it sets the _onInit on the tween instance. May not be pretty/intuitive, but it's fast and keeps file size down.\n  }\n\n  tween._onUpdate = onUpdate;\n  tween._initted = (!tween._op || tween._pt) && !overwritten; // if overwrittenProps resulted in the entire tween being killed, do NOT flag it as initted or else it may render for one tick.\n\n  keyframes && time <= 0 && tl.render(_bigNum, true, true); // if there's a 0% keyframe, it'll render in the \"before\" state for any staggered/delayed animations thus when the following tween initializes, it'll use the \"before\" state instead of the \"after\" state as the initial values.\n},\n    _updatePropTweens = function _updatePropTweens(tween, property, value, start, startIsRelative, ratio, time, skipRecursion) {\n  var ptCache = (tween._pt && tween._ptCache || (tween._ptCache = {}))[property],\n      pt,\n      rootPT,\n      lookup,\n      i;\n\n  if (!ptCache) {\n    ptCache = tween._ptCache[property] = [];\n    lookup = tween._ptLookup;\n    i = tween._targets.length;\n\n    while (i--) {\n      pt = lookup[i][property];\n\n      if (pt && pt.d && pt.d._pt) {\n        // it's a plugin, so find the nested PropTween\n        pt = pt.d._pt;\n\n        while (pt && pt.p !== property && pt.fp !== property) {\n          // \"fp\" is functionParam for things like setting CSS variables which require .setProperty(\"--var-name\", value)\n          pt = pt._next;\n        }\n      }\n\n      if (!pt) {\n        // there is no PropTween associated with that property, so we must FORCE one to be created and ditch out of this\n        // if the tween has other properties that already rendered at new positions, we'd normally have to rewind to put them back like tween.render(0, true) before forcing an _initTween(), but that can create another edge case like tweening a timeline's progress would trigger onUpdates to fire which could move other things around. It's better to just inform users that .resetTo() should ONLY be used for tweens that already have that property. For example, you can't gsap.to(...{ y: 0 }) and then tween.restTo(\"x\", 200) for example.\n        _forceAllPropTweens = 1; // otherwise, when we _addPropTween() and it finds no change between the start and end values, it skips creating a PropTween (for efficiency...why tween when there's no difference?) but in this case we NEED that PropTween created so we can edit it.\n\n        tween.vars[property] = \"+=0\";\n\n        _initTween(tween, time);\n\n        _forceAllPropTweens = 0;\n        return skipRecursion ? _warn(property + \" not eligible for reset\") : 1; // if someone tries to do a quickTo() on a special property like borderRadius which must get split into 4 different properties, that's not eligible for .resetTo().\n      }\n\n      ptCache.push(pt);\n    }\n  }\n\n  i = ptCache.length;\n\n  while (i--) {\n    rootPT = ptCache[i];\n    pt = rootPT._pt || rootPT; // complex values may have nested PropTweens. We only accommodate the FIRST value.\n\n    pt.s = (start || start === 0) && !startIsRelative ? start : pt.s + (start || 0) + ratio * pt.c;\n    pt.c = value - pt.s;\n    rootPT.e && (rootPT.e = _round(value) + getUnit(rootPT.e)); // mainly for CSSPlugin (end value)\n\n    rootPT.b && (rootPT.b = pt.s + getUnit(rootPT.b)); // (beginning value)\n  }\n},\n    _addAliasesToVars = function _addAliasesToVars(targets, vars) {\n  var harness = targets[0] ? _getCache(targets[0]).harness : 0,\n      propertyAliases = harness && harness.aliases,\n      copy,\n      p,\n      i,\n      aliases;\n\n  if (!propertyAliases) {\n    return vars;\n  }\n\n  copy = _merge({}, vars);\n\n  for (p in propertyAliases) {\n    if (p in copy) {\n      aliases = propertyAliases[p].split(\",\");\n      i = aliases.length;\n\n      while (i--) {\n        copy[aliases[i]] = copy[p];\n      }\n    }\n  }\n\n  return copy;\n},\n    // parses multiple formats, like {\"0%\": {x: 100}, {\"50%\": {x: -20}} and { x: {\"0%\": 100, \"50%\": -20} }, and an \"ease\" can be set on any object. We populate an \"allProps\" object with an Array for each property, like {x: [{}, {}], y:[{}, {}]} with data for each property tween. The objects have a \"t\" (time), \"v\", (value), and \"e\" (ease) property. This allows us to piece together a timeline later.\n_parseKeyframe = function _parseKeyframe(prop, obj, allProps, easeEach) {\n  var ease = obj.ease || easeEach || \"power1.inOut\",\n      p,\n      a;\n\n  if (_isArray(obj)) {\n    a = allProps[prop] || (allProps[prop] = []); // t = time (out of 100), v = value, e = ease\n\n    obj.forEach(function (value, i) {\n      return a.push({\n        t: i / (obj.length - 1) * 100,\n        v: value,\n        e: ease\n      });\n    });\n  } else {\n    for (p in obj) {\n      a = allProps[p] || (allProps[p] = []);\n      p === \"ease\" || a.push({\n        t: parseFloat(prop),\n        v: obj[p],\n        e: ease\n      });\n    }\n  }\n},\n    _parseFuncOrString = function _parseFuncOrString(value, tween, i, target, targets) {\n  return _isFunction(value) ? value.call(tween, i, target, targets) : _isString(value) && ~value.indexOf(\"random(\") ? _replaceRandom(value) : value;\n},\n    _staggerTweenProps = _callbackNames + \"repeat,repeatDelay,yoyo,repeatRefresh,yoyoEase,autoRevert\",\n    _staggerPropsToSkip = {};\n\n_forEachName(_staggerTweenProps + \",id,stagger,delay,duration,paused,scrollTrigger\", function (name) {\n  return _staggerPropsToSkip[name] = 1;\n});\n/*\n * --------------------------------------------------------------------------------------\n * TWEEN\n * --------------------------------------------------------------------------------------\n */\n\n\nexport var Tween = /*#__PURE__*/function (_Animation2) {\n  _inheritsLoose(Tween, _Animation2);\n\n  function Tween(targets, vars, position, skipInherit) {\n    var _this3;\n\n    if (typeof vars === \"number\") {\n      position.duration = vars;\n      vars = position;\n      position = null;\n    }\n\n    _this3 = _Animation2.call(this, skipInherit ? vars : _inheritDefaults(vars)) || this;\n    var _this3$vars = _this3.vars,\n        duration = _this3$vars.duration,\n        delay = _this3$vars.delay,\n        immediateRender = _this3$vars.immediateRender,\n        stagger = _this3$vars.stagger,\n        overwrite = _this3$vars.overwrite,\n        keyframes = _this3$vars.keyframes,\n        defaults = _this3$vars.defaults,\n        scrollTrigger = _this3$vars.scrollTrigger,\n        yoyoEase = _this3$vars.yoyoEase,\n        parent = vars.parent || _globalTimeline,\n        parsedTargets = (_isArray(targets) || _isTypedArray(targets) ? _isNumber(targets[0]) : \"length\" in vars) ? [targets] : toArray(targets),\n        tl,\n        i,\n        copy,\n        l,\n        p,\n        curTarget,\n        staggerFunc,\n        staggerVarsToMerge;\n    _this3._targets = parsedTargets.length ? _harness(parsedTargets) : _warn(\"GSAP target \" + targets + \" not found. https://gsap.com\", !_config.nullTargetWarn) || [];\n    _this3._ptLookup = []; //PropTween lookup. An array containing an object for each target, having keys for each tweening property\n\n    _this3._overwrite = overwrite;\n\n    if (keyframes || stagger || _isFuncOrString(duration) || _isFuncOrString(delay)) {\n      vars = _this3.vars;\n      tl = _this3.timeline = new Timeline({\n        data: \"nested\",\n        defaults: defaults || {},\n        targets: parent && parent.data === \"nested\" ? parent.vars.targets : parsedTargets\n      }); // we need to store the targets because for staggers and keyframes, we end up creating an individual tween for each but function-based values need to know the index and the whole Array of targets.\n\n      tl.kill();\n      tl.parent = tl._dp = _assertThisInitialized(_this3);\n      tl._start = 0;\n\n      if (stagger || _isFuncOrString(duration) || _isFuncOrString(delay)) {\n        l = parsedTargets.length;\n        staggerFunc = stagger && distribute(stagger);\n\n        if (_isObject(stagger)) {\n          //users can pass in callbacks like onStart/onComplete in the stagger object. These should fire with each individual tween.\n          for (p in stagger) {\n            if (~_staggerTweenProps.indexOf(p)) {\n              staggerVarsToMerge || (staggerVarsToMerge = {});\n              staggerVarsToMerge[p] = stagger[p];\n            }\n          }\n        }\n\n        for (i = 0; i < l; i++) {\n          copy = _copyExcluding(vars, _staggerPropsToSkip);\n          copy.stagger = 0;\n          yoyoEase && (copy.yoyoEase = yoyoEase);\n          staggerVarsToMerge && _merge(copy, staggerVarsToMerge);\n          curTarget = parsedTargets[i]; //don't just copy duration or delay because if they're a string or function, we'd end up in an infinite loop because _isFuncOrString() would evaluate as true in the child tweens, entering this loop, etc. So we parse the value straight from vars and default to 0.\n\n          copy.duration = +_parseFuncOrString(duration, _assertThisInitialized(_this3), i, curTarget, parsedTargets);\n          copy.delay = (+_parseFuncOrString(delay, _assertThisInitialized(_this3), i, curTarget, parsedTargets) || 0) - _this3._delay;\n\n          if (!stagger && l === 1 && copy.delay) {\n            // if someone does delay:\"random(1, 5)\", repeat:-1, for example, the delay shouldn't be inside the repeat.\n            _this3._delay = delay = copy.delay;\n            _this3._start += delay;\n            copy.delay = 0;\n          }\n\n          tl.to(curTarget, copy, staggerFunc ? staggerFunc(i, curTarget, parsedTargets) : 0);\n          tl._ease = _easeMap.none;\n        }\n\n        tl.duration() ? duration = delay = 0 : _this3.timeline = 0; // if the timeline's duration is 0, we don't need a timeline internally!\n      } else if (keyframes) {\n        _inheritDefaults(_setDefaults(tl.vars.defaults, {\n          ease: \"none\"\n        }));\n\n        tl._ease = _parseEase(keyframes.ease || vars.ease || \"none\");\n        var time = 0,\n            a,\n            kf,\n            v;\n\n        if (_isArray(keyframes)) {\n          keyframes.forEach(function (frame) {\n            return tl.to(parsedTargets, frame, \">\");\n          });\n          tl.duration(); // to ensure tl._dur is cached because we tap into it for performance purposes in the render() method.\n        } else {\n          copy = {};\n\n          for (p in keyframes) {\n            p === \"ease\" || p === \"easeEach\" || _parseKeyframe(p, keyframes[p], copy, keyframes.easeEach);\n          }\n\n          for (p in copy) {\n            a = copy[p].sort(function (a, b) {\n              return a.t - b.t;\n            });\n            time = 0;\n\n            for (i = 0; i < a.length; i++) {\n              kf = a[i];\n              v = {\n                ease: kf.e,\n                duration: (kf.t - (i ? a[i - 1].t : 0)) / 100 * duration\n              };\n              v[p] = kf.v;\n              tl.to(parsedTargets, v, time);\n              time += v.duration;\n            }\n          }\n\n          tl.duration() < duration && tl.to({}, {\n            duration: duration - tl.duration()\n          }); // in case keyframes didn't go to 100%\n        }\n      }\n\n      duration || _this3.duration(duration = tl.duration());\n    } else {\n      _this3.timeline = 0; //speed optimization, faster lookups (no going up the prototype chain)\n    }\n\n    if (overwrite === true && !_suppressOverwrites) {\n      _overwritingTween = _assertThisInitialized(_this3);\n\n      _globalTimeline.killTweensOf(parsedTargets);\n\n      _overwritingTween = 0;\n    }\n\n    _addToTimeline(parent, _assertThisInitialized(_this3), position);\n\n    vars.reversed && _this3.reverse();\n    vars.paused && _this3.paused(true);\n\n    if (immediateRender || !duration && !keyframes && _this3._start === _roundPrecise(parent._time) && _isNotFalse(immediateRender) && _hasNoPausedAncestors(_assertThisInitialized(_this3)) && parent.data !== \"nested\") {\n      _this3._tTime = -_tinyNum; //forces a render without having to set the render() \"force\" parameter to true because we want to allow lazying by default (using the \"force\" parameter always forces an immediate full render)\n\n      _this3.render(Math.max(0, -delay) || 0); //in case delay is negative\n\n    }\n\n    scrollTrigger && _scrollTrigger(_assertThisInitialized(_this3), scrollTrigger);\n    return _this3;\n  }\n\n  var _proto3 = Tween.prototype;\n\n  _proto3.render = function render(totalTime, suppressEvents, force) {\n    var prevTime = this._time,\n        tDur = this._tDur,\n        dur = this._dur,\n        isNegative = totalTime < 0,\n        tTime = totalTime > tDur - _tinyNum && !isNegative ? tDur : totalTime < _tinyNum ? 0 : totalTime,\n        time,\n        pt,\n        iteration,\n        cycleDuration,\n        prevIteration,\n        isYoyo,\n        ratio,\n        timeline,\n        yoyoEase;\n\n    if (!dur) {\n      _renderZeroDurationTween(this, totalTime, suppressEvents, force);\n    } else if (tTime !== this._tTime || !totalTime || force || !this._initted && this._tTime || this._startAt && this._zTime < 0 !== isNegative || this._lazy) {\n      // this senses if we're crossing over the start time, in which case we must record _zTime and force the render, but we do it in this lengthy conditional way for performance reasons (usually we can skip the calculations): this._initted && (this._zTime < 0) !== (totalTime < 0)\n      time = tTime;\n      timeline = this.timeline;\n\n      if (this._repeat) {\n        //adjust the time for repeats and yoyos\n        cycleDuration = dur + this._rDelay;\n\n        if (this._repeat < -1 && isNegative) {\n          return this.totalTime(cycleDuration * 100 + totalTime, suppressEvents, force);\n        }\n\n        time = _roundPrecise(tTime % cycleDuration); //round to avoid floating point errors. (4 % 0.8 should be 0 but some browsers report it as 0.79999999!)\n\n        if (tTime === tDur) {\n          // the tDur === tTime is for edge cases where there's a lengthy decimal on the duration and it may reach the very end but the time is rendered as not-quite-there (remember, tDur is rounded to 4 decimals whereas dur isn't)\n          iteration = this._repeat;\n          time = dur;\n        } else {\n          prevIteration = _roundPrecise(tTime / cycleDuration); // full decimal version of iterations, not the previous iteration (we're reusing prevIteration variable for efficiency)\n\n          iteration = ~~prevIteration;\n\n          if (iteration && iteration === prevIteration) {\n            time = dur;\n            iteration--;\n          } else if (time > dur) {\n            time = dur;\n          }\n        }\n\n        isYoyo = this._yoyo && iteration & 1;\n\n        if (isYoyo) {\n          yoyoEase = this._yEase;\n          time = dur - time;\n        }\n\n        prevIteration = _animationCycle(this._tTime, cycleDuration);\n\n        if (time === prevTime && !force && this._initted && iteration === prevIteration) {\n          //could be during the repeatDelay part. No need to render and fire callbacks.\n          this._tTime = tTime;\n          return this;\n        }\n\n        if (iteration !== prevIteration) {\n          timeline && this._yEase && _propagateYoyoEase(timeline, isYoyo); //repeatRefresh functionality\n\n          if (this.vars.repeatRefresh && !isYoyo && !this._lock && time !== cycleDuration && this._initted) {\n            // this._time will === cycleDuration when we render at EXACTLY the end of an iteration. Without this condition, it'd often do the repeatRefresh render TWICE (again on the very next tick).\n            this._lock = force = 1; //force, otherwise if lazy is true, the _attemptInitTween() will return and we'll jump out and get caught bouncing on each tick.\n\n            this.render(_roundPrecise(cycleDuration * iteration), true).invalidate()._lock = 0;\n          }\n        }\n      }\n\n      if (!this._initted) {\n        if (_attemptInitTween(this, isNegative ? totalTime : time, force, suppressEvents, tTime)) {\n          this._tTime = 0; // in constructor if immediateRender is true, we set _tTime to -_tinyNum to have the playhead cross the starting point but we can't leave _tTime as a negative number.\n\n          return this;\n        }\n\n        if (prevTime !== this._time && !(force && this.vars.repeatRefresh && iteration !== prevIteration)) {\n          // rare edge case - during initialization, an onUpdate in the _startAt (.fromTo()) might force this tween to render at a different spot in which case we should ditch this render() call so that it doesn't revert the values. But we also don't want to dump if we're doing a repeatRefresh render!\n          return this;\n        }\n\n        if (dur !== this._dur) {\n          // while initting, a plugin like InertiaPlugin might alter the duration, so rerun from the start to ensure everything renders as it should.\n          return this.render(totalTime, suppressEvents, force);\n        }\n      }\n\n      this._tTime = tTime;\n      this._time = time;\n\n      if (!this._act && this._ts) {\n        this._act = 1; //as long as it's not paused, force it to be active so that if the user renders independent of the parent timeline, it'll be forced to re-render on the next tick.\n\n        this._lazy = 0;\n      }\n\n      this.ratio = ratio = (yoyoEase || this._ease)(time / dur);\n\n      if (this._from) {\n        this.ratio = ratio = 1 - ratio;\n      }\n\n      if (!prevTime && tTime && !suppressEvents && !prevIteration) {\n        _callback(this, \"onStart\");\n\n        if (this._tTime !== tTime) {\n          // in case the onStart triggered a render at a different spot, eject. Like if someone did animation.pause(0.5) or something inside the onStart.\n          return this;\n        }\n      }\n\n      pt = this._pt;\n\n      while (pt) {\n        pt.r(ratio, pt.d);\n        pt = pt._next;\n      }\n\n      timeline && timeline.render(totalTime < 0 ? totalTime : timeline._dur * timeline._ease(time / this._dur), suppressEvents, force) || this._startAt && (this._zTime = totalTime);\n\n      if (this._onUpdate && !suppressEvents) {\n        isNegative && _rewindStartAt(this, totalTime, suppressEvents, force); //note: for performance reasons, we tuck this conditional logic inside less traveled areas (most tweens don't have an onUpdate). We'd just have it at the end before the onComplete, but the values should be updated before any onUpdate is called, so we ALSO put it here and then if it's not called, we do so later near the onComplete.\n\n        _callback(this, \"onUpdate\");\n      }\n\n      this._repeat && iteration !== prevIteration && this.vars.onRepeat && !suppressEvents && this.parent && _callback(this, \"onRepeat\");\n\n      if ((tTime === this._tDur || !tTime) && this._tTime === tTime) {\n        isNegative && !this._onUpdate && _rewindStartAt(this, totalTime, true, true);\n        (totalTime || !dur) && (tTime === this._tDur && this._ts > 0 || !tTime && this._ts < 0) && _removeFromParent(this, 1); // don't remove if we're rendering at exactly a time of 0, as there could be autoRevert values that should get set on the next tick (if the playhead goes backward beyond the startTime, negative totalTime). Don't remove if the timeline is reversed and the playhead isn't at 0, otherwise tl.progress(1).reverse() won't work. Only remove if the playhead is at the end and timeScale is positive, or if the playhead is at 0 and the timeScale is negative.\n\n        if (!suppressEvents && !(isNegative && !prevTime) && (tTime || prevTime || isYoyo)) {\n          // if prevTime and tTime are zero, we shouldn't fire the onReverseComplete. This could happen if you gsap.to(... {paused:true}).play();\n          _callback(this, tTime === tDur ? \"onComplete\" : \"onReverseComplete\", true);\n\n          this._prom && !(tTime < tDur && this.timeScale() > 0) && this._prom();\n        }\n      }\n    }\n\n    return this;\n  };\n\n  _proto3.targets = function targets() {\n    return this._targets;\n  };\n\n  _proto3.invalidate = function invalidate(soft) {\n    // \"soft\" gives us a way to clear out everything EXCEPT the recorded pre-\"from\" portion of from() tweens. Otherwise, for example, if you tween.progress(1).render(0, true true).invalidate(), the \"from\" values would persist and then on the next render, the from() tweens would initialize and the current value would match the \"from\" values, thus animate from the same value to the same value (no animation). We tap into this in ScrollTrigger's refresh() where we must push a tween to completion and then back again but honor its init state in case the tween is dependent on another tween further up on the page.\n    (!soft || !this.vars.runBackwards) && (this._startAt = 0);\n    this._pt = this._op = this._onUpdate = this._lazy = this.ratio = 0;\n    this._ptLookup = [];\n    this.timeline && this.timeline.invalidate(soft);\n    return _Animation2.prototype.invalidate.call(this, soft);\n  };\n\n  _proto3.resetTo = function resetTo(property, value, start, startIsRelative, skipRecursion) {\n    _tickerActive || _ticker.wake();\n    this._ts || this.play();\n    var time = Math.min(this._dur, (this._dp._time - this._start) * this._ts),\n        ratio;\n    this._initted || _initTween(this, time);\n    ratio = this._ease(time / this._dur); // don't just get tween.ratio because it may not have rendered yet.\n    // possible future addition to allow an object with multiple values to update, like tween.resetTo({x: 100, y: 200}); At this point, it doesn't seem worth the added kb given the fact that most users will likely opt for the convenient gsap.quickTo() way of interacting with this method.\n    // if (_isObject(property)) { // performance optimization\n    // \tfor (p in property) {\n    // \t\tif (_updatePropTweens(this, p, property[p], value ? value[p] : null, start, ratio, time)) {\n    // \t\t\treturn this.resetTo(property, value, start, startIsRelative); // if a PropTween wasn't found for the property, it'll get forced with a re-initialization so we need to jump out and start over again.\n    // \t\t}\n    // \t}\n    // } else {\n\n    if (_updatePropTweens(this, property, value, start, startIsRelative, ratio, time, skipRecursion)) {\n      return this.resetTo(property, value, start, startIsRelative, 1); // if a PropTween wasn't found for the property, it'll get forced with a re-initialization so we need to jump out and start over again.\n    } //}\n\n\n    _alignPlayhead(this, 0);\n\n    this.parent || _addLinkedListItem(this._dp, this, \"_first\", \"_last\", this._dp._sort ? \"_start\" : 0);\n    return this.render(0);\n  };\n\n  _proto3.kill = function kill(targets, vars) {\n    if (vars === void 0) {\n      vars = \"all\";\n    }\n\n    if (!targets && (!vars || vars === \"all\")) {\n      this._lazy = this._pt = 0;\n      this.parent ? _interrupt(this) : this.scrollTrigger && this.scrollTrigger.kill(!!_reverting);\n      return this;\n    }\n\n    if (this.timeline) {\n      var tDur = this.timeline.totalDuration();\n      this.timeline.killTweensOf(targets, vars, _overwritingTween && _overwritingTween.vars.overwrite !== true)._first || _interrupt(this); // if nothing is left tweening, interrupt.\n\n      this.parent && tDur !== this.timeline.totalDuration() && _setDuration(this, this._dur * this.timeline._tDur / tDur, 0, 1); // if a nested tween is killed that changes the duration, it should affect this tween's duration. We must use the ratio, though, because sometimes the internal timeline is stretched like for keyframes where they don't all add up to whatever the parent tween's duration was set to.\n\n      return this;\n    }\n\n    var parsedTargets = this._targets,\n        killingTargets = targets ? toArray(targets) : parsedTargets,\n        propTweenLookup = this._ptLookup,\n        firstPT = this._pt,\n        overwrittenProps,\n        curLookup,\n        curOverwriteProps,\n        props,\n        p,\n        pt,\n        i;\n\n    if ((!vars || vars === \"all\") && _arraysMatch(parsedTargets, killingTargets)) {\n      vars === \"all\" && (this._pt = 0);\n      return _interrupt(this);\n    }\n\n    overwrittenProps = this._op = this._op || [];\n\n    if (vars !== \"all\") {\n      //so people can pass in a comma-delimited list of property names\n      if (_isString(vars)) {\n        p = {};\n\n        _forEachName(vars, function (name) {\n          return p[name] = 1;\n        });\n\n        vars = p;\n      }\n\n      vars = _addAliasesToVars(parsedTargets, vars);\n    }\n\n    i = parsedTargets.length;\n\n    while (i--) {\n      if (~killingTargets.indexOf(parsedTargets[i])) {\n        curLookup = propTweenLookup[i];\n\n        if (vars === \"all\") {\n          overwrittenProps[i] = vars;\n          props = curLookup;\n          curOverwriteProps = {};\n        } else {\n          curOverwriteProps = overwrittenProps[i] = overwrittenProps[i] || {};\n          props = vars;\n        }\n\n        for (p in props) {\n          pt = curLookup && curLookup[p];\n\n          if (pt) {\n            if (!(\"kill\" in pt.d) || pt.d.kill(p) === true) {\n              _removeLinkedListItem(this, pt, \"_pt\");\n            }\n\n            delete curLookup[p];\n          }\n\n          if (curOverwriteProps !== \"all\") {\n            curOverwriteProps[p] = 1;\n          }\n        }\n      }\n    }\n\n    this._initted && !this._pt && firstPT && _interrupt(this); //if all tweening properties are killed, kill the tween. Without this line, if there's a tween with multiple targets and then you killTweensOf() each target individually, the tween would technically still remain active and fire its onComplete even though there aren't any more properties tweening.\n\n    return this;\n  };\n\n  Tween.to = function to(targets, vars) {\n    return new Tween(targets, vars, arguments[2]);\n  };\n\n  Tween.from = function from(targets, vars) {\n    return _createTweenType(1, arguments);\n  };\n\n  Tween.delayedCall = function delayedCall(delay, callback, params, scope) {\n    return new Tween(callback, 0, {\n      immediateRender: false,\n      lazy: false,\n      overwrite: false,\n      delay: delay,\n      onComplete: callback,\n      onReverseComplete: callback,\n      onCompleteParams: params,\n      onReverseCompleteParams: params,\n      callbackScope: scope\n    }); // we must use onReverseComplete too for things like timeline.add(() => {...}) which should be triggered in BOTH directions (forward and reverse)\n  };\n\n  Tween.fromTo = function fromTo(targets, fromVars, toVars) {\n    return _createTweenType(2, arguments);\n  };\n\n  Tween.set = function set(targets, vars) {\n    vars.duration = 0;\n    vars.repeatDelay || (vars.repeat = 0);\n    return new Tween(targets, vars);\n  };\n\n  Tween.killTweensOf = function killTweensOf(targets, props, onlyActive) {\n    return _globalTimeline.killTweensOf(targets, props, onlyActive);\n  };\n\n  return Tween;\n}(Animation);\n\n_setDefaults(Tween.prototype, {\n  _targets: [],\n  _lazy: 0,\n  _startAt: 0,\n  _op: 0,\n  _onInit: 0\n}); //add the pertinent timeline methods to Tween instances so that users can chain conveniently and create a timeline automatically. (removed due to concerns that it'd ultimately add to more confusion especially for beginners)\n// _forEachName(\"to,from,fromTo,set,call,add,addLabel,addPause\", name => {\n// \tTween.prototype[name] = function() {\n// \t\tlet tl = new Timeline();\n// \t\treturn _addToTimeline(tl, this)[name].apply(tl, toArray(arguments));\n// \t}\n// });\n//for backward compatibility. Leverage the timeline calls.\n\n\n_forEachName(\"staggerTo,staggerFrom,staggerFromTo\", function (name) {\n  Tween[name] = function () {\n    var tl = new Timeline(),\n        params = _slice.call(arguments, 0);\n\n    params.splice(name === \"staggerFromTo\" ? 5 : 4, 0, 0);\n    return tl[name].apply(tl, params);\n  };\n});\n/*\n * --------------------------------------------------------------------------------------\n * PROPTWEEN\n * --------------------------------------------------------------------------------------\n */\n\n\nvar _setterPlain = function _setterPlain(target, property, value) {\n  return target[property] = value;\n},\n    _setterFunc = function _setterFunc(target, property, value) {\n  return target[property](value);\n},\n    _setterFuncWithParam = function _setterFuncWithParam(target, property, value, data) {\n  return target[property](data.fp, value);\n},\n    _setterAttribute = function _setterAttribute(target, property, value) {\n  return target.setAttribute(property, value);\n},\n    _getSetter = function _getSetter(target, property) {\n  return _isFunction(target[property]) ? _setterFunc : _isUndefined(target[property]) && target.setAttribute ? _setterAttribute : _setterPlain;\n},\n    _renderPlain = function _renderPlain(ratio, data) {\n  return data.set(data.t, data.p, Math.round((data.s + data.c * ratio) * 1000000) / 1000000, data);\n},\n    _renderBoolean = function _renderBoolean(ratio, data) {\n  return data.set(data.t, data.p, !!(data.s + data.c * ratio), data);\n},\n    _renderComplexString = function _renderComplexString(ratio, data) {\n  var pt = data._pt,\n      s = \"\";\n\n  if (!ratio && data.b) {\n    //b = beginning string\n    s = data.b;\n  } else if (ratio === 1 && data.e) {\n    //e = ending string\n    s = data.e;\n  } else {\n    while (pt) {\n      s = pt.p + (pt.m ? pt.m(pt.s + pt.c * ratio) : Math.round((pt.s + pt.c * ratio) * 10000) / 10000) + s; //we use the \"p\" property for the text inbetween (like a suffix). And in the context of a complex string, the modifier (m) is typically just Math.round(), like for RGB colors.\n\n      pt = pt._next;\n    }\n\n    s += data.c; //we use the \"c\" of the PropTween to store the final chunk of non-numeric text.\n  }\n\n  data.set(data.t, data.p, s, data);\n},\n    _renderPropTweens = function _renderPropTweens(ratio, data) {\n  var pt = data._pt;\n\n  while (pt) {\n    pt.r(ratio, pt.d);\n    pt = pt._next;\n  }\n},\n    _addPluginModifier = function _addPluginModifier(modifier, tween, target, property) {\n  var pt = this._pt,\n      next;\n\n  while (pt) {\n    next = pt._next;\n    pt.p === property && pt.modifier(modifier, tween, target);\n    pt = next;\n  }\n},\n    _killPropTweensOf = function _killPropTweensOf(property) {\n  var pt = this._pt,\n      hasNonDependentRemaining,\n      next;\n\n  while (pt) {\n    next = pt._next;\n\n    if (pt.p === property && !pt.op || pt.op === property) {\n      _removeLinkedListItem(this, pt, \"_pt\");\n    } else if (!pt.dep) {\n      hasNonDependentRemaining = 1;\n    }\n\n    pt = next;\n  }\n\n  return !hasNonDependentRemaining;\n},\n    _setterWithModifier = function _setterWithModifier(target, property, value, data) {\n  data.mSet(target, property, data.m.call(data.tween, value, data.mt), data);\n},\n    _sortPropTweensByPriority = function _sortPropTweensByPriority(parent) {\n  var pt = parent._pt,\n      next,\n      pt2,\n      first,\n      last; //sorts the PropTween linked list in order of priority because some plugins need to do their work after ALL of the PropTweens were created (like RoundPropsPlugin and ModifiersPlugin)\n\n  while (pt) {\n    next = pt._next;\n    pt2 = first;\n\n    while (pt2 && pt2.pr > pt.pr) {\n      pt2 = pt2._next;\n    }\n\n    if (pt._prev = pt2 ? pt2._prev : last) {\n      pt._prev._next = pt;\n    } else {\n      first = pt;\n    }\n\n    if (pt._next = pt2) {\n      pt2._prev = pt;\n    } else {\n      last = pt;\n    }\n\n    pt = next;\n  }\n\n  parent._pt = first;\n}; //PropTween key: t = target, p = prop, r = renderer, d = data, s = start, c = change, op = overwriteProperty (ONLY populated when it's different than p), pr = priority, _next/_prev for the linked list siblings, set = setter, m = modifier, mSet = modifierSetter (the original setter, before a modifier was added)\n\n\nexport var PropTween = /*#__PURE__*/function () {\n  function PropTween(next, target, prop, start, change, renderer, data, setter, priority) {\n    this.t = target;\n    this.s = start;\n    this.c = change;\n    this.p = prop;\n    this.r = renderer || _renderPlain;\n    this.d = data || this;\n    this.set = setter || _setterPlain;\n    this.pr = priority || 0;\n    this._next = next;\n\n    if (next) {\n      next._prev = this;\n    }\n  }\n\n  var _proto4 = PropTween.prototype;\n\n  _proto4.modifier = function modifier(func, tween, target) {\n    this.mSet = this.mSet || this.set; //in case it was already set (a PropTween can only have one modifier)\n\n    this.set = _setterWithModifier;\n    this.m = func;\n    this.mt = target; //modifier target\n\n    this.tween = tween;\n  };\n\n  return PropTween;\n}(); //Initialization tasks\n\n_forEachName(_callbackNames + \"parent,duration,ease,delay,overwrite,runBackwards,startAt,yoyo,immediateRender,repeat,repeatDelay,data,paused,reversed,lazy,callbackScope,stringFilter,id,yoyoEase,stagger,inherit,repeatRefresh,keyframes,autoRevert,scrollTrigger\", function (name) {\n  return _reservedProps[name] = 1;\n});\n\n_globals.TweenMax = _globals.TweenLite = Tween;\n_globals.TimelineLite = _globals.TimelineMax = Timeline;\n_globalTimeline = new Timeline({\n  sortChildren: false,\n  defaults: _defaults,\n  autoRemoveChildren: true,\n  id: \"root\",\n  smoothChildTiming: true\n});\n_config.stringFilter = _colorStringFilter;\n\nvar _media = [],\n    _listeners = {},\n    _emptyArray = [],\n    _lastMediaTime = 0,\n    _contextID = 0,\n    _dispatch = function _dispatch(type) {\n  return (_listeners[type] || _emptyArray).map(function (f) {\n    return f();\n  });\n},\n    _onMediaChange = function _onMediaChange() {\n  var time = Date.now(),\n      matches = [];\n\n  if (time - _lastMediaTime > 2) {\n    _dispatch(\"matchMediaInit\");\n\n    _media.forEach(function (c) {\n      var queries = c.queries,\n          conditions = c.conditions,\n          match,\n          p,\n          anyMatch,\n          toggled;\n\n      for (p in queries) {\n        match = _win.matchMedia(queries[p]).matches; // Firefox doesn't update the \"matches\" property of the MediaQueryList object correctly - it only does so as it calls its change handler - so we must re-create a media query here to ensure it's accurate.\n\n        match && (anyMatch = 1);\n\n        if (match !== conditions[p]) {\n          conditions[p] = match;\n          toggled = 1;\n        }\n      }\n\n      if (toggled) {\n        c.revert();\n        anyMatch && matches.push(c);\n      }\n    });\n\n    _dispatch(\"matchMediaRevert\");\n\n    matches.forEach(function (c) {\n      return c.onMatch(c, function (func) {\n        return c.add(null, func);\n      });\n    });\n    _lastMediaTime = time;\n\n    _dispatch(\"matchMedia\");\n  }\n};\n\nvar Context = /*#__PURE__*/function () {\n  function Context(func, scope) {\n    this.selector = scope && selector(scope);\n    this.data = [];\n    this._r = []; // returned/cleanup functions\n\n    this.isReverted = false;\n    this.id = _contextID++; // to work around issues that frameworks like Vue cause by making things into Proxies which make it impossible to do something like _media.indexOf(this) because \"this\" would no longer refer to the Context instance itself - it'd refer to a Proxy! We needed a way to identify the context uniquely\n\n    func && this.add(func);\n  }\n\n  var _proto5 = Context.prototype;\n\n  _proto5.add = function add(name, func, scope) {\n    // possible future addition if we need the ability to add() an animation to a context and for whatever reason cannot create that animation inside of a context.add(() => {...}) function.\n    // if (name && _isFunction(name.revert)) {\n    // \tthis.data.push(name);\n    // \treturn (name._ctx = this);\n    // }\n    if (_isFunction(name)) {\n      scope = func;\n      func = name;\n      name = _isFunction;\n    }\n\n    var self = this,\n        f = function f() {\n      var prev = _context,\n          prevSelector = self.selector,\n          result;\n      prev && prev !== self && prev.data.push(self);\n      scope && (self.selector = selector(scope));\n      _context = self;\n      result = func.apply(self, arguments);\n      _isFunction(result) && self._r.push(result);\n      _context = prev;\n      self.selector = prevSelector;\n      self.isReverted = false;\n      return result;\n    };\n\n    self.last = f;\n    return name === _isFunction ? f(self, function (func) {\n      return self.add(null, func);\n    }) : name ? self[name] = f : f;\n  };\n\n  _proto5.ignore = function ignore(func) {\n    var prev = _context;\n    _context = null;\n    func(this);\n    _context = prev;\n  };\n\n  _proto5.getTweens = function getTweens() {\n    var a = [];\n    this.data.forEach(function (e) {\n      return e instanceof Context ? a.push.apply(a, e.getTweens()) : e instanceof Tween && !(e.parent && e.parent.data === \"nested\") && a.push(e);\n    });\n    return a;\n  };\n\n  _proto5.clear = function clear() {\n    this._r.length = this.data.length = 0;\n  };\n\n  _proto5.kill = function kill(revert, matchMedia) {\n    var _this4 = this;\n\n    if (revert) {\n      (function () {\n        var tweens = _this4.getTweens(),\n            i = _this4.data.length,\n            t;\n\n        while (i--) {\n          // Flip plugin tweens are very different in that they should actually be pushed to their end. The plugin replaces the timeline's .revert() method to do exactly that. But we also need to remove any of those nested tweens inside the flip timeline so that they don't get individually reverted.\n          t = _this4.data[i];\n\n          if (t.data === \"isFlip\") {\n            t.revert();\n            t.getChildren(true, true, false).forEach(function (tween) {\n              return tweens.splice(tweens.indexOf(tween), 1);\n            });\n          }\n        } // save as an object so that we can cache the globalTime for each tween to optimize performance during the sort\n\n\n        tweens.map(function (t) {\n          return {\n            g: t._dur || t._delay || t._sat && !t._sat.vars.immediateRender ? t.globalTime(0) : -Infinity,\n            t: t\n          };\n        }).sort(function (a, b) {\n          return b.g - a.g || -Infinity;\n        }).forEach(function (o) {\n          return o.t.revert(revert);\n        }); // note: all of the _startAt tweens should be reverted in reverse order that they were created, and they'll all have the same globalTime (-1) so the \" || -1\" in the sort keeps the order properly.\n\n        i = _this4.data.length;\n\n        while (i--) {\n          // make sure we loop backwards so that, for example, SplitTexts that were created later on the same element get reverted first\n          t = _this4.data[i];\n\n          if (t instanceof Timeline) {\n            if (t.data !== \"nested\") {\n              t.scrollTrigger && t.scrollTrigger.revert();\n              t.kill(); // don't revert() the timeline because that's duplicating efforts since we already reverted all the tweens\n            }\n          } else {\n            !(t instanceof Tween) && t.revert && t.revert(revert);\n          }\n        }\n\n        _this4._r.forEach(function (f) {\n          return f(revert, _this4);\n        });\n\n        _this4.isReverted = true;\n      })();\n    } else {\n      this.data.forEach(function (e) {\n        return e.kill && e.kill();\n      });\n    }\n\n    this.clear();\n\n    if (matchMedia) {\n      var i = _media.length;\n\n      while (i--) {\n        // previously, we checked _media.indexOf(this), but some frameworks like Vue enforce Proxy objects that make it impossible to get the proper result that way, so we must use a unique ID number instead.\n        _media[i].id === this.id && _media.splice(i, 1);\n      }\n    }\n  } // killWithCleanup() {\n  // \tthis.kill();\n  // \tthis._r.forEach(f => f(false, this));\n  // }\n  ;\n\n  _proto5.revert = function revert(config) {\n    this.kill(config || {});\n  };\n\n  return Context;\n}();\n\nvar MatchMedia = /*#__PURE__*/function () {\n  function MatchMedia(scope) {\n    this.contexts = [];\n    this.scope = scope;\n    _context && _context.data.push(this);\n  }\n\n  var _proto6 = MatchMedia.prototype;\n\n  _proto6.add = function add(conditions, func, scope) {\n    _isObject(conditions) || (conditions = {\n      matches: conditions\n    });\n    var context = new Context(0, scope || this.scope),\n        cond = context.conditions = {},\n        mq,\n        p,\n        active;\n    _context && !context.selector && (context.selector = _context.selector); // in case a context is created inside a context. Like a gsap.matchMedia() that's inside a scoped gsap.context()\n\n    this.contexts.push(context);\n    func = context.add(\"onMatch\", func);\n    context.queries = conditions;\n\n    for (p in conditions) {\n      if (p === \"all\") {\n        active = 1;\n      } else {\n        mq = _win.matchMedia(conditions[p]);\n\n        if (mq) {\n          _media.indexOf(context) < 0 && _media.push(context);\n          (cond[p] = mq.matches) && (active = 1);\n          mq.addListener ? mq.addListener(_onMediaChange) : mq.addEventListener(\"change\", _onMediaChange);\n        }\n      }\n    }\n\n    active && func(context, function (f) {\n      return context.add(null, f);\n    });\n    return this;\n  } // refresh() {\n  // \tlet time = _lastMediaTime,\n  // \t\tmedia = _media;\n  // \t_lastMediaTime = -1;\n  // \t_media = this.contexts;\n  // \t_onMediaChange();\n  // \t_lastMediaTime = time;\n  // \t_media = media;\n  // }\n  ;\n\n  _proto6.revert = function revert(config) {\n    this.kill(config || {});\n  };\n\n  _proto6.kill = function kill(revert) {\n    this.contexts.forEach(function (c) {\n      return c.kill(revert, true);\n    });\n  };\n\n  return MatchMedia;\n}();\n/*\n * --------------------------------------------------------------------------------------\n * GSAP\n * --------------------------------------------------------------------------------------\n */\n\n\nvar _gsap = {\n  registerPlugin: function registerPlugin() {\n    for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n      args[_key2] = arguments[_key2];\n    }\n\n    args.forEach(function (config) {\n      return _createPlugin(config);\n    });\n  },\n  timeline: function timeline(vars) {\n    return new Timeline(vars);\n  },\n  getTweensOf: function getTweensOf(targets, onlyActive) {\n    return _globalTimeline.getTweensOf(targets, onlyActive);\n  },\n  getProperty: function getProperty(target, property, unit, uncache) {\n    _isString(target) && (target = toArray(target)[0]); //in case selector text or an array is passed in\n\n    var getter = _getCache(target || {}).get,\n        format = unit ? _passThrough : _numericIfPossible;\n\n    unit === \"native\" && (unit = \"\");\n    return !target ? target : !property ? function (property, unit, uncache) {\n      return format((_plugins[property] && _plugins[property].get || getter)(target, property, unit, uncache));\n    } : format((_plugins[property] && _plugins[property].get || getter)(target, property, unit, uncache));\n  },\n  quickSetter: function quickSetter(target, property, unit) {\n    target = toArray(target);\n\n    if (target.length > 1) {\n      var setters = target.map(function (t) {\n        return gsap.quickSetter(t, property, unit);\n      }),\n          l = setters.length;\n      return function (value) {\n        var i = l;\n\n        while (i--) {\n          setters[i](value);\n        }\n      };\n    }\n\n    target = target[0] || {};\n\n    var Plugin = _plugins[property],\n        cache = _getCache(target),\n        p = cache.harness && (cache.harness.aliases || {})[property] || property,\n        // in case it's an alias, like \"rotate\" for \"rotation\".\n    setter = Plugin ? function (value) {\n      var p = new Plugin();\n      _quickTween._pt = 0;\n      p.init(target, unit ? value + unit : value, _quickTween, 0, [target]);\n      p.render(1, p);\n      _quickTween._pt && _renderPropTweens(1, _quickTween);\n    } : cache.set(target, p);\n\n    return Plugin ? setter : function (value) {\n      return setter(target, p, unit ? value + unit : value, cache, 1);\n    };\n  },\n  quickTo: function quickTo(target, property, vars) {\n    var _setDefaults2;\n\n    var tween = gsap.to(target, _setDefaults((_setDefaults2 = {}, _setDefaults2[property] = \"+=0.1\", _setDefaults2.paused = true, _setDefaults2.stagger = 0, _setDefaults2), vars || {})),\n        func = function func(value, start, startIsRelative) {\n      return tween.resetTo(property, value, start, startIsRelative);\n    };\n\n    func.tween = tween;\n    return func;\n  },\n  isTweening: function isTweening(targets) {\n    return _globalTimeline.getTweensOf(targets, true).length > 0;\n  },\n  defaults: function defaults(value) {\n    value && value.ease && (value.ease = _parseEase(value.ease, _defaults.ease));\n    return _mergeDeep(_defaults, value || {});\n  },\n  config: function config(value) {\n    return _mergeDeep(_config, value || {});\n  },\n  registerEffect: function registerEffect(_ref3) {\n    var name = _ref3.name,\n        effect = _ref3.effect,\n        plugins = _ref3.plugins,\n        defaults = _ref3.defaults,\n        extendTimeline = _ref3.extendTimeline;\n    (plugins || \"\").split(\",\").forEach(function (pluginName) {\n      return pluginName && !_plugins[pluginName] && !_globals[pluginName] && _warn(name + \" effect requires \" + pluginName + \" plugin.\");\n    });\n\n    _effects[name] = function (targets, vars, tl) {\n      return effect(toArray(targets), _setDefaults(vars || {}, defaults), tl);\n    };\n\n    if (extendTimeline) {\n      Timeline.prototype[name] = function (targets, vars, position) {\n        return this.add(_effects[name](targets, _isObject(vars) ? vars : (position = vars) && {}, this), position);\n      };\n    }\n  },\n  registerEase: function registerEase(name, ease) {\n    _easeMap[name] = _parseEase(ease);\n  },\n  parseEase: function parseEase(ease, defaultEase) {\n    return arguments.length ? _parseEase(ease, defaultEase) : _easeMap;\n  },\n  getById: function getById(id) {\n    return _globalTimeline.getById(id);\n  },\n  exportRoot: function exportRoot(vars, includeDelayedCalls) {\n    if (vars === void 0) {\n      vars = {};\n    }\n\n    var tl = new Timeline(vars),\n        child,\n        next;\n    tl.smoothChildTiming = _isNotFalse(vars.smoothChildTiming);\n\n    _globalTimeline.remove(tl);\n\n    tl._dp = 0; //otherwise it'll get re-activated when adding children and be re-introduced into _globalTimeline's linked list (then added to itself).\n\n    tl._time = tl._tTime = _globalTimeline._time;\n    child = _globalTimeline._first;\n\n    while (child) {\n      next = child._next;\n\n      if (includeDelayedCalls || !(!child._dur && child instanceof Tween && child.vars.onComplete === child._targets[0])) {\n        _addToTimeline(tl, child, child._start - child._delay);\n      }\n\n      child = next;\n    }\n\n    _addToTimeline(_globalTimeline, tl, 0);\n\n    return tl;\n  },\n  context: function context(func, scope) {\n    return func ? new Context(func, scope) : _context;\n  },\n  matchMedia: function matchMedia(scope) {\n    return new MatchMedia(scope);\n  },\n  matchMediaRefresh: function matchMediaRefresh() {\n    return _media.forEach(function (c) {\n      var cond = c.conditions,\n          found,\n          p;\n\n      for (p in cond) {\n        if (cond[p]) {\n          cond[p] = false;\n          found = 1;\n        }\n      }\n\n      found && c.revert();\n    }) || _onMediaChange();\n  },\n  addEventListener: function addEventListener(type, callback) {\n    var a = _listeners[type] || (_listeners[type] = []);\n    ~a.indexOf(callback) || a.push(callback);\n  },\n  removeEventListener: function removeEventListener(type, callback) {\n    var a = _listeners[type],\n        i = a && a.indexOf(callback);\n    i >= 0 && a.splice(i, 1);\n  },\n  utils: {\n    wrap: wrap,\n    wrapYoyo: wrapYoyo,\n    distribute: distribute,\n    random: random,\n    snap: snap,\n    normalize: normalize,\n    getUnit: getUnit,\n    clamp: clamp,\n    splitColor: splitColor,\n    toArray: toArray,\n    selector: selector,\n    mapRange: mapRange,\n    pipe: pipe,\n    unitize: unitize,\n    interpolate: interpolate,\n    shuffle: shuffle\n  },\n  install: _install,\n  effects: _effects,\n  ticker: _ticker,\n  updateRoot: Timeline.updateRoot,\n  plugins: _plugins,\n  globalTimeline: _globalTimeline,\n  core: {\n    PropTween: PropTween,\n    globals: _addGlobal,\n    Tween: Tween,\n    Timeline: Timeline,\n    Animation: Animation,\n    getCache: _getCache,\n    _removeLinkedListItem: _removeLinkedListItem,\n    reverting: function reverting() {\n      return _reverting;\n    },\n    context: function context(toAdd) {\n      if (toAdd && _context) {\n        _context.data.push(toAdd);\n\n        toAdd._ctx = _context;\n      }\n\n      return _context;\n    },\n    suppressOverwrites: function suppressOverwrites(value) {\n      return _suppressOverwrites = value;\n    }\n  }\n};\n\n_forEachName(\"to,from,fromTo,delayedCall,set,killTweensOf\", function (name) {\n  return _gsap[name] = Tween[name];\n});\n\n_ticker.add(Timeline.updateRoot);\n\n_quickTween = _gsap.to({}, {\n  duration: 0\n}); // ---- EXTRA PLUGINS --------------------------------------------------------\n\nvar _getPluginPropTween = function _getPluginPropTween(plugin, prop) {\n  var pt = plugin._pt;\n\n  while (pt && pt.p !== prop && pt.op !== prop && pt.fp !== prop) {\n    pt = pt._next;\n  }\n\n  return pt;\n},\n    _addModifiers = function _addModifiers(tween, modifiers) {\n  var targets = tween._targets,\n      p,\n      i,\n      pt;\n\n  for (p in modifiers) {\n    i = targets.length;\n\n    while (i--) {\n      pt = tween._ptLookup[i][p];\n\n      if (pt && (pt = pt.d)) {\n        if (pt._pt) {\n          // is a plugin\n          pt = _getPluginPropTween(pt, p);\n        }\n\n        pt && pt.modifier && pt.modifier(modifiers[p], tween, targets[i], p);\n      }\n    }\n  }\n},\n    _buildModifierPlugin = function _buildModifierPlugin(name, modifier) {\n  return {\n    name: name,\n    headless: 1,\n    rawVars: 1,\n    //don't pre-process function-based values or \"random()\" strings.\n    init: function init(target, vars, tween) {\n      tween._onInit = function (tween) {\n        var temp, p;\n\n        if (_isString(vars)) {\n          temp = {};\n\n          _forEachName(vars, function (name) {\n            return temp[name] = 1;\n          }); //if the user passes in a comma-delimited list of property names to roundProps, like \"x,y\", we round to whole numbers.\n\n\n          vars = temp;\n        }\n\n        if (modifier) {\n          temp = {};\n\n          for (p in vars) {\n            temp[p] = modifier(vars[p]);\n          }\n\n          vars = temp;\n        }\n\n        _addModifiers(tween, vars);\n      };\n    }\n  };\n}; //register core plugins\n\n\nexport var gsap = _gsap.registerPlugin({\n  name: \"attr\",\n  init: function init(target, vars, tween, index, targets) {\n    var p, pt, v;\n    this.tween = tween;\n\n    for (p in vars) {\n      v = target.getAttribute(p) || \"\";\n      pt = this.add(target, \"setAttribute\", (v || 0) + \"\", vars[p], index, targets, 0, 0, p);\n      pt.op = p;\n      pt.b = v; // record the beginning value so we can revert()\n\n      this._props.push(p);\n    }\n  },\n  render: function render(ratio, data) {\n    var pt = data._pt;\n\n    while (pt) {\n      _reverting ? pt.set(pt.t, pt.p, pt.b, pt) : pt.r(ratio, pt.d); // if reverting, go back to the original (pt.b)\n\n      pt = pt._next;\n    }\n  }\n}, {\n  name: \"endArray\",\n  headless: 1,\n  init: function init(target, value) {\n    var i = value.length;\n\n    while (i--) {\n      this.add(target, i, target[i] || 0, value[i], 0, 0, 0, 0, 0, 1);\n    }\n  }\n}, _buildModifierPlugin(\"roundProps\", _roundModifier), _buildModifierPlugin(\"modifiers\"), _buildModifierPlugin(\"snap\", snap)) || _gsap; //to prevent the core plugins from being dropped via aggressive tree shaking, we must include them in the variable declaration in this way.\n\nTween.version = Timeline.version = gsap.version = \"3.14.2\";\n_coreReady = 1;\n_windowExists() && _wake();\nvar Power0 = _easeMap.Power0,\n    Power1 = _easeMap.Power1,\n    Power2 = _easeMap.Power2,\n    Power3 = _easeMap.Power3,\n    Power4 = _easeMap.Power4,\n    Linear = _easeMap.Linear,\n    Quad = _easeMap.Quad,\n    Cubic = _easeMap.Cubic,\n    Quart = _easeMap.Quart,\n    Quint = _easeMap.Quint,\n    Strong = _easeMap.Strong,\n    Elastic = _easeMap.Elastic,\n    Back = _easeMap.Back,\n    SteppedEase = _easeMap.SteppedEase,\n    Bounce = _easeMap.Bounce,\n    Sine = _easeMap.Sine,\n    Expo = _easeMap.Expo,\n    Circ = _easeMap.Circ;\nexport { Power0, Power1, Power2, Power3, Power4, Linear, Quad, Cubic, Quart, Quint, Strong, Elastic, Back, SteppedEase, Bounce, Sine, Expo, Circ };\nexport { Tween as TweenMax, Tween as TweenLite, Timeline as TimelineMax, Timeline as TimelineLite, gsap as default, wrap, wrapYoyo, distribute, random, snap, normalize, getUnit, clamp, splitColor, toArray, selector, mapRange, pipe, unitize, interpolate, shuffle }; //export some internal methods/orojects for use in CSSPlugin so that we can externalize that file and allow custom builds that exclude it.\n\nexport { _getProperty, _numExp, _numWithUnitExp, _isString, _isUndefined, _renderComplexString, _relExp, _setDefaults, _removeLinkedListItem, _forEachName, _sortPropTweensByPriority, _colorStringFilter, _replaceRandom, _checkPlugin, _plugins, _ticker, _config, _roundModifier, _round, _missingPlugin, _getSetter, _getCache, _colorExp, _parseRelative };","/*!\n * CSSPlugin 3.14.2\n * https://gsap.com\n *\n * Copyright 2008-2025, GreenSock. All rights reserved.\n * Subject to the terms at https://gsap.com/standard-license\n * @author: Jack Doyle, jack@greensock.com\n*/\n\n/* eslint-disable */\nimport { gsap, _getProperty, _numExp, _numWithUnitExp, getUnit, _isString, _isUndefined, _renderComplexString, _relExp, _forEachName, _sortPropTweensByPriority, _colorStringFilter, _checkPlugin, _replaceRandom, _plugins, GSCache, PropTween, _config, _ticker, _round, _missingPlugin, _getSetter, _getCache, _colorExp, _parseRelative, _setDefaults, _removeLinkedListItem //for the commented-out className feature.\n} from \"./gsap-core.js\";\n\nvar _win,\n    _doc,\n    _docElement,\n    _pluginInitted,\n    _tempDiv,\n    _tempDivStyler,\n    _recentSetterPlugin,\n    _reverting,\n    _windowExists = function _windowExists() {\n  return typeof window !== \"undefined\";\n},\n    _transformProps = {},\n    _RAD2DEG = 180 / Math.PI,\n    _DEG2RAD = Math.PI / 180,\n    _atan2 = Math.atan2,\n    _bigNum = 1e8,\n    _capsExp = /([A-Z])/g,\n    _horizontalExp = /(left|right|width|margin|padding|x)/i,\n    _complexExp = /[\\s,\\(]\\S/,\n    _propertyAliases = {\n  autoAlpha: \"opacity,visibility\",\n  scale: \"scaleX,scaleY\",\n  alpha: \"opacity\"\n},\n    _renderCSSProp = function _renderCSSProp(ratio, data) {\n  return data.set(data.t, data.p, Math.round((data.s + data.c * ratio) * 10000) / 10000 + data.u, data);\n},\n    _renderPropWithEnd = function _renderPropWithEnd(ratio, data) {\n  return data.set(data.t, data.p, ratio === 1 ? data.e : Math.round((data.s + data.c * ratio) * 10000) / 10000 + data.u, data);\n},\n    _renderCSSPropWithBeginning = function _renderCSSPropWithBeginning(ratio, data) {\n  return data.set(data.t, data.p, ratio ? Math.round((data.s + data.c * ratio) * 10000) / 10000 + data.u : data.b, data);\n},\n    //if units change, we need a way to render the original unit/value when the tween goes all the way back to the beginning (ratio:0)\n_renderCSSPropWithBeginningAndEnd = function _renderCSSPropWithBeginningAndEnd(ratio, data) {\n  return data.set(data.t, data.p, ratio === 1 ? data.e : ratio ? Math.round((data.s + data.c * ratio) * 10000) / 10000 + data.u : data.b, data);\n},\n    //if units change, we need a way to render the original unit/value when the tween goes all the way back to the beginning (ratio:0)\n_renderRoundedCSSProp = function _renderRoundedCSSProp(ratio, data) {\n  var value = data.s + data.c * ratio;\n  data.set(data.t, data.p, ~~(value + (value < 0 ? -.5 : .5)) + data.u, data);\n},\n    _renderNonTweeningValue = function _renderNonTweeningValue(ratio, data) {\n  return data.set(data.t, data.p, ratio ? data.e : data.b, data);\n},\n    _renderNonTweeningValueOnlyAtEnd = function _renderNonTweeningValueOnlyAtEnd(ratio, data) {\n  return data.set(data.t, data.p, ratio !== 1 ? data.b : data.e, data);\n},\n    _setterCSSStyle = function _setterCSSStyle(target, property, value) {\n  return target.style[property] = value;\n},\n    _setterCSSProp = function _setterCSSProp(target, property, value) {\n  return target.style.setProperty(property, value);\n},\n    _setterTransform = function _setterTransform(target, property, value) {\n  return target._gsap[property] = value;\n},\n    _setterScale = function _setterScale(target, property, value) {\n  return target._gsap.scaleX = target._gsap.scaleY = value;\n},\n    _setterScaleWithRender = function _setterScaleWithRender(target, property, value, data, ratio) {\n  var cache = target._gsap;\n  cache.scaleX = cache.scaleY = value;\n  cache.renderTransform(ratio, cache);\n},\n    _setterTransformWithRender = function _setterTransformWithRender(target, property, value, data, ratio) {\n  var cache = target._gsap;\n  cache[property] = value;\n  cache.renderTransform(ratio, cache);\n},\n    _transformProp = \"transform\",\n    _transformOriginProp = _transformProp + \"Origin\",\n    _saveStyle = function _saveStyle(property, isNotCSS) {\n  var _this = this;\n\n  var target = this.target,\n      style = target.style,\n      cache = target._gsap;\n\n  if (property in _transformProps && style) {\n    this.tfm = this.tfm || {};\n\n    if (property !== \"transform\") {\n      property = _propertyAliases[property] || property;\n      ~property.indexOf(\",\") ? property.split(\",\").forEach(function (a) {\n        return _this.tfm[a] = _get(target, a);\n      }) : this.tfm[property] = cache.x ? cache[property] : _get(target, property); // note: scale would map to \"scaleX,scaleY\", thus we loop and apply them both.\n\n      property === _transformOriginProp && (this.tfm.zOrigin = cache.zOrigin);\n    } else {\n      return _propertyAliases.transform.split(\",\").forEach(function (p) {\n        return _saveStyle.call(_this, p, isNotCSS);\n      });\n    }\n\n    if (this.props.indexOf(_transformProp) >= 0) {\n      return;\n    }\n\n    if (cache.svg) {\n      this.svgo = target.getAttribute(\"data-svg-origin\");\n      this.props.push(_transformOriginProp, isNotCSS, \"\");\n    }\n\n    property = _transformProp;\n  }\n\n  (style || isNotCSS) && this.props.push(property, isNotCSS, style[property]);\n},\n    _removeIndependentTransforms = function _removeIndependentTransforms(style) {\n  if (style.translate) {\n    style.removeProperty(\"translate\");\n    style.removeProperty(\"scale\");\n    style.removeProperty(\"rotate\");\n  }\n},\n    _revertStyle = function _revertStyle() {\n  var props = this.props,\n      target = this.target,\n      style = target.style,\n      cache = target._gsap,\n      i,\n      p;\n\n  for (i = 0; i < props.length; i += 3) {\n    // stored like this: property, isNotCSS, value\n    if (!props[i + 1]) {\n      props[i + 2] ? style[props[i]] = props[i + 2] : style.removeProperty(props[i].substr(0, 2) === \"--\" ? props[i] : props[i].replace(_capsExp, \"-$1\").toLowerCase());\n    } else if (props[i + 1] === 2) {\n      // non-CSS value (function-based)\n      target[props[i]](props[i + 2]);\n    } else {\n      // non-CSS value (not function-based)\n      target[props[i]] = props[i + 2];\n    }\n  }\n\n  if (this.tfm) {\n    for (p in this.tfm) {\n      cache[p] = this.tfm[p];\n    }\n\n    if (cache.svg) {\n      cache.renderTransform();\n      target.setAttribute(\"data-svg-origin\", this.svgo || \"\");\n    }\n\n    i = _reverting();\n\n    if ((!i || !i.isStart) && !style[_transformProp]) {\n      _removeIndependentTransforms(style);\n\n      if (cache.zOrigin && style[_transformOriginProp]) {\n        style[_transformOriginProp] += \" \" + cache.zOrigin + \"px\"; // since we're uncaching, we must put the zOrigin back into the transformOrigin so that we can pull it out accurately when we parse again. Otherwise, we'd lose the z portion of the origin since we extract it to protect from Safari bugs.\n\n        cache.zOrigin = 0;\n        cache.renderTransform();\n      }\n\n      cache.uncache = 1; // if it's a startAt that's being reverted in the _initTween() of the core, we don't need to uncache transforms. This is purely a performance optimization.\n    }\n  }\n},\n    _getStyleSaver = function _getStyleSaver(target, properties) {\n  var saver = {\n    target: target,\n    props: [],\n    revert: _revertStyle,\n    save: _saveStyle\n  };\n  target._gsap || gsap.core.getCache(target); // just make sure there's a _gsap cache defined because we read from it in _saveStyle() and it's more efficient to just check it here once.\n\n  properties && target.style && target.nodeType && properties.split(\",\").forEach(function (p) {\n    return saver.save(p);\n  }); // make sure it's a DOM node too.\n\n  return saver;\n},\n    _supports3D,\n    _createElement = function _createElement(type, ns) {\n  var e = _doc.createElementNS ? _doc.createElementNS((ns || \"http://www.w3.org/1999/xhtml\").replace(/^https/, \"http\"), type) : _doc.createElement(type); //some servers swap in https for http in the namespace which can break things, making \"style\" inaccessible.\n\n  return e && e.style ? e : _doc.createElement(type); //some environments won't allow access to the element's style when created with a namespace in which case we default to the standard createElement() to work around the issue. Also note that when GSAP is embedded directly inside an SVG file, createElement() won't allow access to the style object in Firefox (see https://gsap.com/forums/topic/20215-problem-using-tweenmax-in-standalone-self-containing-svg-file-err-cannot-set-property-csstext-of-undefined/).\n},\n    _getComputedProperty = function _getComputedProperty(target, property, skipPrefixFallback) {\n  var cs = getComputedStyle(target);\n  return cs[property] || cs.getPropertyValue(property.replace(_capsExp, \"-$1\").toLowerCase()) || cs.getPropertyValue(property) || !skipPrefixFallback && _getComputedProperty(target, _checkPropPrefix(property) || property, 1) || \"\"; //css variables may not need caps swapped out for dashes and lowercase.\n},\n    _prefixes = \"O,Moz,ms,Ms,Webkit\".split(\",\"),\n    _checkPropPrefix = function _checkPropPrefix(property, element, preferPrefix) {\n  var e = element || _tempDiv,\n      s = e.style,\n      i = 5;\n\n  if (property in s && !preferPrefix) {\n    return property;\n  }\n\n  property = property.charAt(0).toUpperCase() + property.substr(1);\n\n  while (i-- && !(_prefixes[i] + property in s)) {}\n\n  return i < 0 ? null : (i === 3 ? \"ms\" : i >= 0 ? _prefixes[i] : \"\") + property;\n},\n    _initCore = function _initCore() {\n  if (_windowExists() && window.document) {\n    _win = window;\n    _doc = _win.document;\n    _docElement = _doc.documentElement;\n    _tempDiv = _createElement(\"div\") || {\n      style: {}\n    };\n    _tempDivStyler = _createElement(\"div\");\n    _transformProp = _checkPropPrefix(_transformProp);\n    _transformOriginProp = _transformProp + \"Origin\";\n    _tempDiv.style.cssText = \"border-width:0;line-height:0;position:absolute;padding:0\"; //make sure to override certain properties that may contaminate measurements, in case the user has overreaching style sheets.\n\n    _supports3D = !!_checkPropPrefix(\"perspective\");\n    _reverting = gsap.core.reverting;\n    _pluginInitted = 1;\n  }\n},\n    _getReparentedCloneBBox = function _getReparentedCloneBBox(target) {\n  //works around issues in some browsers (like Firefox) that don't correctly report getBBox() on SVG elements inside a <defs> element and/or <mask>. We try creating an SVG, adding it to the documentElement and toss the element in there so that it's definitely part of the rendering tree, then grab the bbox and if it works, we actually swap out the original getBBox() method for our own that does these extra steps whenever getBBox is needed. This helps ensure that performance is optimal (only do all these extra steps when absolutely necessary...most elements don't need it).\n  var owner = target.ownerSVGElement,\n      svg = _createElement(\"svg\", owner && owner.getAttribute(\"xmlns\") || \"http://www.w3.org/2000/svg\"),\n      clone = target.cloneNode(true),\n      bbox;\n\n  clone.style.display = \"block\";\n  svg.appendChild(clone);\n\n  _docElement.appendChild(svg);\n\n  try {\n    bbox = clone.getBBox();\n  } catch (e) {}\n\n  svg.removeChild(clone);\n\n  _docElement.removeChild(svg);\n\n  return bbox;\n},\n    _getAttributeFallbacks = function _getAttributeFallbacks(target, attributesArray) {\n  var i = attributesArray.length;\n\n  while (i--) {\n    if (target.hasAttribute(attributesArray[i])) {\n      return target.getAttribute(attributesArray[i]);\n    }\n  }\n},\n    _getBBox = function _getBBox(target) {\n  var bounds, cloned;\n\n  try {\n    bounds = target.getBBox(); //Firefox throws errors if you try calling getBBox() on an SVG element that's not rendered (like in a <symbol> or <defs>). https://bugzilla.mozilla.org/show_bug.cgi?id=612118\n  } catch (error) {\n    bounds = _getReparentedCloneBBox(target);\n    cloned = 1;\n  }\n\n  bounds && (bounds.width || bounds.height) || cloned || (bounds = _getReparentedCloneBBox(target)); //some browsers (like Firefox) misreport the bounds if the element has zero width and height (it just assumes it's at x:0, y:0), thus we need to manually grab the position in that case.\n\n  return bounds && !bounds.width && !bounds.x && !bounds.y ? {\n    x: +_getAttributeFallbacks(target, [\"x\", \"cx\", \"x1\"]) || 0,\n    y: +_getAttributeFallbacks(target, [\"y\", \"cy\", \"y1\"]) || 0,\n    width: 0,\n    height: 0\n  } : bounds;\n},\n    _isSVG = function _isSVG(e) {\n  return !!(e.getCTM && (!e.parentNode || e.ownerSVGElement) && _getBBox(e));\n},\n    //reports if the element is an SVG on which getBBox() actually works\n_removeProperty = function _removeProperty(target, property) {\n  if (property) {\n    var style = target.style,\n        first2Chars;\n\n    if (property in _transformProps && property !== _transformOriginProp) {\n      property = _transformProp;\n    }\n\n    if (style.removeProperty) {\n      first2Chars = property.substr(0, 2);\n\n      if (first2Chars === \"ms\" || property.substr(0, 6) === \"webkit\") {\n        //Microsoft and some Webkit browsers don't conform to the standard of capitalizing the first prefix character, so we adjust so that when we prefix the caps with a dash, it's correct (otherwise it'd be \"ms-transform\" instead of \"-ms-transform\" for IE9, for example)\n        property = \"-\" + property;\n      }\n\n      style.removeProperty(first2Chars === \"--\" ? property : property.replace(_capsExp, \"-$1\").toLowerCase());\n    } else {\n      //note: old versions of IE use \"removeAttribute()\" instead of \"removeProperty()\"\n      style.removeAttribute(property);\n    }\n  }\n},\n    _addNonTweeningPT = function _addNonTweeningPT(plugin, target, property, beginning, end, onlySetAtEnd) {\n  var pt = new PropTween(plugin._pt, target, property, 0, 1, onlySetAtEnd ? _renderNonTweeningValueOnlyAtEnd : _renderNonTweeningValue);\n  plugin._pt = pt;\n  pt.b = beginning;\n  pt.e = end;\n\n  plugin._props.push(property);\n\n  return pt;\n},\n    _nonConvertibleUnits = {\n  deg: 1,\n  rad: 1,\n  turn: 1\n},\n    _nonStandardLayouts = {\n  grid: 1,\n  flex: 1\n},\n    //takes a single value like 20px and converts it to the unit specified, like \"%\", returning only the numeric amount.\n_convertToUnit = function _convertToUnit(target, property, value, unit) {\n  var curValue = parseFloat(value) || 0,\n      curUnit = (value + \"\").trim().substr((curValue + \"\").length) || \"px\",\n      // some browsers leave extra whitespace at the beginning of CSS variables, hence the need to trim()\n  style = _tempDiv.style,\n      horizontal = _horizontalExp.test(property),\n      isRootSVG = target.tagName.toLowerCase() === \"svg\",\n      measureProperty = (isRootSVG ? \"client\" : \"offset\") + (horizontal ? \"Width\" : \"Height\"),\n      amount = 100,\n      toPixels = unit === \"px\",\n      toPercent = unit === \"%\",\n      px,\n      parent,\n      cache,\n      isSVG;\n\n  if (unit === curUnit || !curValue || _nonConvertibleUnits[unit] || _nonConvertibleUnits[curUnit]) {\n    return curValue;\n  }\n\n  curUnit !== \"px\" && !toPixels && (curValue = _convertToUnit(target, property, value, \"px\"));\n  isSVG = target.getCTM && _isSVG(target);\n\n  if ((toPercent || curUnit === \"%\") && (_transformProps[property] || ~property.indexOf(\"adius\"))) {\n    px = isSVG ? target.getBBox()[horizontal ? \"width\" : \"height\"] : target[measureProperty];\n    return _round(toPercent ? curValue / px * amount : curValue / 100 * px);\n  }\n\n  style[horizontal ? \"width\" : \"height\"] = amount + (toPixels ? curUnit : unit);\n  parent = unit !== \"rem\" && ~property.indexOf(\"adius\") || unit === \"em\" && target.appendChild && !isRootSVG ? target : target.parentNode;\n\n  if (isSVG) {\n    parent = (target.ownerSVGElement || {}).parentNode;\n  }\n\n  if (!parent || parent === _doc || !parent.appendChild) {\n    parent = _doc.body;\n  }\n\n  cache = parent._gsap;\n\n  if (cache && toPercent && cache.width && horizontal && cache.time === _ticker.time && !cache.uncache) {\n    return _round(curValue / cache.width * amount);\n  } else {\n    if (toPercent && (property === \"height\" || property === \"width\")) {\n      // if we're dealing with width/height that's inside a container with padding and/or it's a flexbox/grid container, we must apply it to the target itself rather than the _tempDiv in order to ensure complete accuracy, factoring in the parent's padding.\n      var v = target.style[property];\n      target.style[property] = amount + unit;\n      px = target[measureProperty];\n      v ? target.style[property] = v : _removeProperty(target, property);\n    } else {\n      (toPercent || curUnit === \"%\") && !_nonStandardLayouts[_getComputedProperty(parent, \"display\")] && (style.position = _getComputedProperty(target, \"position\"));\n      parent === target && (style.position = \"static\"); // like for borderRadius, if it's a % we must have it relative to the target itself but that may not have position: relative or position: absolute in which case it'd go up the chain until it finds its offsetParent (bad). position: static protects against that.\n\n      parent.appendChild(_tempDiv);\n      px = _tempDiv[measureProperty];\n      parent.removeChild(_tempDiv);\n      style.position = \"absolute\";\n    }\n\n    if (horizontal && toPercent) {\n      cache = _getCache(parent);\n      cache.time = _ticker.time;\n      cache.width = parent[measureProperty];\n    }\n  }\n\n  return _round(toPixels ? px * curValue / amount : px && curValue ? amount / px * curValue : 0);\n},\n    _get = function _get(target, property, unit, uncache) {\n  var value;\n  _pluginInitted || _initCore();\n\n  if (property in _propertyAliases && property !== \"transform\") {\n    property = _propertyAliases[property];\n\n    if (~property.indexOf(\",\")) {\n      property = property.split(\",\")[0];\n    }\n  }\n\n  if (_transformProps[property] && property !== \"transform\") {\n    value = _parseTransform(target, uncache);\n    value = property !== \"transformOrigin\" ? value[property] : value.svg ? value.origin : _firstTwoOnly(_getComputedProperty(target, _transformOriginProp)) + \" \" + value.zOrigin + \"px\";\n  } else {\n    value = target.style[property];\n\n    if (!value || value === \"auto\" || uncache || ~(value + \"\").indexOf(\"calc(\")) {\n      value = _specialProps[property] && _specialProps[property](target, property, unit) || _getComputedProperty(target, property) || _getProperty(target, property) || (property === \"opacity\" ? 1 : 0); // note: some browsers, like Firefox, don't report borderRadius correctly! Instead, it only reports every corner like  borderTopLeftRadius\n    }\n  }\n\n  return unit && !~(value + \"\").trim().indexOf(\" \") ? _convertToUnit(target, property, value, unit) + unit : value;\n},\n    _tweenComplexCSSString = function _tweenComplexCSSString(target, prop, start, end) {\n  // note: we call _tweenComplexCSSString.call(pluginInstance...) to ensure that it's scoped properly. We may call it from within a plugin too, thus \"this\" would refer to the plugin.\n  if (!start || start === \"none\") {\n    // some browsers like Safari actually PREFER the prefixed property and mis-report the unprefixed value like clipPath (BUG). In other words, even though clipPath exists in the style (\"clipPath\" in target.style) and it's set in the CSS properly (along with -webkit-clip-path), Safari reports clipPath as \"none\" whereas WebkitClipPath reports accurately like \"ellipse(100% 0% at 50% 0%)\", so in this case we must SWITCH to using the prefixed property instead. See https://gsap.com/forums/topic/18310-clippath-doesnt-work-on-ios/\n    var p = _checkPropPrefix(prop, target, 1),\n        s = p && _getComputedProperty(target, p, 1);\n\n    if (s && s !== start) {\n      prop = p;\n      start = s;\n    } else if (prop === \"borderColor\") {\n      start = _getComputedProperty(target, \"borderTopColor\"); // Firefox bug: always reports \"borderColor\" as \"\", so we must fall back to borderTopColor. See https://gsap.com/forums/topic/24583-how-to-return-colors-that-i-had-after-reverse/\n    }\n  }\n\n  var pt = new PropTween(this._pt, target.style, prop, 0, 1, _renderComplexString),\n      index = 0,\n      matchIndex = 0,\n      a,\n      result,\n      startValues,\n      startNum,\n      color,\n      startValue,\n      endValue,\n      endNum,\n      chunk,\n      endUnit,\n      startUnit,\n      endValues;\n  pt.b = start;\n  pt.e = end;\n  start += \"\"; // ensure values are strings\n\n  end += \"\";\n\n  if (end.substring(0, 6) === \"var(--\") {\n    end = _getComputedProperty(target, end.substring(4, end.indexOf(\")\")));\n  }\n\n  if (end === \"auto\") {\n    startValue = target.style[prop];\n    target.style[prop] = end;\n    end = _getComputedProperty(target, prop) || end;\n    startValue ? target.style[prop] = startValue : _removeProperty(target, prop);\n  }\n\n  a = [start, end];\n\n  _colorStringFilter(a); // pass an array with the starting and ending values and let the filter do whatever it needs to the values. If colors are found, it returns true and then we must match where the color shows up order-wise because for things like boxShadow, sometimes the browser provides the computed values with the color FIRST, but the user provides it with the color LAST, so flip them if necessary. Same for drop-shadow().\n\n\n  start = a[0];\n  end = a[1];\n  startValues = start.match(_numWithUnitExp) || [];\n  endValues = end.match(_numWithUnitExp) || [];\n\n  if (endValues.length) {\n    while (result = _numWithUnitExp.exec(end)) {\n      endValue = result[0];\n      chunk = end.substring(index, result.index);\n\n      if (color) {\n        color = (color + 1) % 5;\n      } else if (chunk.substr(-5) === \"rgba(\" || chunk.substr(-5) === \"hsla(\") {\n        color = 1;\n      }\n\n      if (endValue !== (startValue = startValues[matchIndex++] || \"\")) {\n        startNum = parseFloat(startValue) || 0;\n        startUnit = startValue.substr((startNum + \"\").length);\n        endValue.charAt(1) === \"=\" && (endValue = _parseRelative(startNum, endValue) + startUnit);\n        endNum = parseFloat(endValue);\n        endUnit = endValue.substr((endNum + \"\").length);\n        index = _numWithUnitExp.lastIndex - endUnit.length;\n\n        if (!endUnit) {\n          //if something like \"perspective:300\" is passed in and we must add a unit to the end\n          endUnit = endUnit || _config.units[prop] || startUnit;\n\n          if (index === end.length) {\n            end += endUnit;\n            pt.e += endUnit;\n          }\n        }\n\n        if (startUnit !== endUnit) {\n          startNum = _convertToUnit(target, prop, startValue, endUnit) || 0;\n        } // these nested PropTweens are handled in a special way - we'll never actually call a render or setter method on them. We'll just loop through them in the parent complex string PropTween's render method.\n\n\n        pt._pt = {\n          _next: pt._pt,\n          p: chunk || matchIndex === 1 ? chunk : \",\",\n          //note: SVG spec allows omission of comma/space when a negative sign is wedged between two numbers, like 2.5-5.3 instead of 2.5,-5.3 but when tweening, the negative value may switch to positive, so we insert the comma just in case.\n          s: startNum,\n          c: endNum - startNum,\n          m: color && color < 4 || prop === \"zIndex\" ? Math.round : 0\n        };\n      }\n    }\n\n    pt.c = index < end.length ? end.substring(index, end.length) : \"\"; //we use the \"c\" of the PropTween to store the final part of the string (after the last number)\n  } else {\n    pt.r = prop === \"display\" && end === \"none\" ? _renderNonTweeningValueOnlyAtEnd : _renderNonTweeningValue;\n  }\n\n  _relExp.test(end) && (pt.e = 0); //if the end string contains relative values or dynamic random(...) values, delete the end it so that on the final render we don't actually set it to the string with += or -= characters (forces it to use the calculated value).\n\n  this._pt = pt; //start the linked list with this new PropTween. Remember, we call _tweenComplexCSSString.call(pluginInstance...) to ensure that it's scoped properly. We may call it from within another plugin too, thus \"this\" would refer to the plugin.\n\n  return pt;\n},\n    _keywordToPercent = {\n  top: \"0%\",\n  bottom: \"100%\",\n  left: \"0%\",\n  right: \"100%\",\n  center: \"50%\"\n},\n    _convertKeywordsToPercentages = function _convertKeywordsToPercentages(value) {\n  var split = value.split(\" \"),\n      x = split[0],\n      y = split[1] || \"50%\";\n\n  if (x === \"top\" || x === \"bottom\" || y === \"left\" || y === \"right\") {\n    //the user provided them in the wrong order, so flip them\n    value = x;\n    x = y;\n    y = value;\n  }\n\n  split[0] = _keywordToPercent[x] || x;\n  split[1] = _keywordToPercent[y] || y;\n  return split.join(\" \");\n},\n    _renderClearProps = function _renderClearProps(ratio, data) {\n  if (data.tween && data.tween._time === data.tween._dur) {\n    var target = data.t,\n        style = target.style,\n        props = data.u,\n        cache = target._gsap,\n        prop,\n        clearTransforms,\n        i;\n\n    if (props === \"all\" || props === true) {\n      style.cssText = \"\";\n      clearTransforms = 1;\n    } else {\n      props = props.split(\",\");\n      i = props.length;\n\n      while (--i > -1) {\n        prop = props[i];\n\n        if (_transformProps[prop]) {\n          clearTransforms = 1;\n          prop = prop === \"transformOrigin\" ? _transformOriginProp : _transformProp;\n        }\n\n        _removeProperty(target, prop);\n      }\n    }\n\n    if (clearTransforms) {\n      _removeProperty(target, _transformProp);\n\n      if (cache) {\n        cache.svg && target.removeAttribute(\"transform\");\n        style.scale = style.rotate = style.translate = \"none\";\n\n        _parseTransform(target, 1); // force all the cached values back to \"normal\"/identity, otherwise if there's another tween that's already set to render transforms on this element, it could display the wrong values.\n\n\n        cache.uncache = 1;\n\n        _removeIndependentTransforms(style);\n      }\n    }\n  }\n},\n    // note: specialProps should return 1 if (and only if) they have a non-zero priority. It indicates we need to sort the linked list.\n_specialProps = {\n  clearProps: function clearProps(plugin, target, property, endValue, tween) {\n    if (tween.data !== \"isFromStart\") {\n      var pt = plugin._pt = new PropTween(plugin._pt, target, property, 0, 0, _renderClearProps);\n      pt.u = endValue;\n      pt.pr = -10;\n      pt.tween = tween;\n\n      plugin._props.push(property);\n\n      return 1;\n    }\n  }\n  /* className feature (about 0.4kb gzipped).\n  , className(plugin, target, property, endValue, tween) {\n  \tlet _renderClassName = (ratio, data) => {\n  \t\t\tdata.css.render(ratio, data.css);\n  \t\t\tif (!ratio || ratio === 1) {\n  \t\t\t\tlet inline = data.rmv,\n  \t\t\t\t\ttarget = data.t,\n  \t\t\t\t\tp;\n  \t\t\t\ttarget.setAttribute(\"class\", ratio ? data.e : data.b);\n  \t\t\t\tfor (p in inline) {\n  \t\t\t\t\t_removeProperty(target, p);\n  \t\t\t\t}\n  \t\t\t}\n  \t\t},\n  \t\t_getAllStyles = (target) => {\n  \t\t\tlet styles = {},\n  \t\t\t\tcomputed = getComputedStyle(target),\n  \t\t\t\tp;\n  \t\t\tfor (p in computed) {\n  \t\t\t\tif (isNaN(p) && p !== \"cssText\" && p !== \"length\") {\n  \t\t\t\t\tstyles[p] = computed[p];\n  \t\t\t\t}\n  \t\t\t}\n  \t\t\t_setDefaults(styles, _parseTransform(target, 1));\n  \t\t\treturn styles;\n  \t\t},\n  \t\tstartClassList = target.getAttribute(\"class\"),\n  \t\tstyle = target.style,\n  \t\tcssText = style.cssText,\n  \t\tcache = target._gsap,\n  \t\tclassPT = cache.classPT,\n  \t\tinlineToRemoveAtEnd = {},\n  \t\tdata = {t:target, plugin:plugin, rmv:inlineToRemoveAtEnd, b:startClassList, e:(endValue.charAt(1) !== \"=\") ? endValue : startClassList.replace(new RegExp(\"(?:\\\\s|^)\" + endValue.substr(2) + \"(?![\\\\w-])\"), \"\") + ((endValue.charAt(0) === \"+\") ? \" \" + endValue.substr(2) : \"\")},\n  \t\tchangingVars = {},\n  \t\tstartVars = _getAllStyles(target),\n  \t\ttransformRelated = /(transform|perspective)/i,\n  \t\tendVars, p;\n  \tif (classPT) {\n  \t\tclassPT.r(1, classPT.d);\n  \t\t_removeLinkedListItem(classPT.d.plugin, classPT, \"_pt\");\n  \t}\n  \ttarget.setAttribute(\"class\", data.e);\n  \tendVars = _getAllStyles(target, true);\n  \ttarget.setAttribute(\"class\", startClassList);\n  \tfor (p in endVars) {\n  \t\tif (endVars[p] !== startVars[p] && !transformRelated.test(p)) {\n  \t\t\tchangingVars[p] = endVars[p];\n  \t\t\tif (!style[p] && style[p] !== \"0\") {\n  \t\t\t\tinlineToRemoveAtEnd[p] = 1;\n  \t\t\t}\n  \t\t}\n  \t}\n  \tcache.classPT = plugin._pt = new PropTween(plugin._pt, target, \"className\", 0, 0, _renderClassName, data, 0, -11);\n  \tif (style.cssText !== cssText) { //only apply if things change. Otherwise, in cases like a background-image that's pulled dynamically, it could cause a refresh. See https://gsap.com/forums/topic/20368-possible-gsap-bug-switching-classnames-in-chrome/.\n  \t\tstyle.cssText = cssText; //we recorded cssText before we swapped classes and ran _getAllStyles() because in cases when a className tween is overwritten, we remove all the related tweening properties from that class change (otherwise class-specific stuff can't override properties we've directly set on the target's style object due to specificity).\n  \t}\n  \t_parseTransform(target, true); //to clear the caching of transforms\n  \tdata.css = new gsap.plugins.css();\n  \tdata.css.init(target, changingVars, tween);\n  \tplugin._props.push(...data.css._props);\n  \treturn 1;\n  }\n  */\n\n},\n\n/*\n * --------------------------------------------------------------------------------------\n * TRANSFORMS\n * --------------------------------------------------------------------------------------\n */\n_identity2DMatrix = [1, 0, 0, 1, 0, 0],\n    _rotationalProperties = {},\n    _isNullTransform = function _isNullTransform(value) {\n  return value === \"matrix(1, 0, 0, 1, 0, 0)\" || value === \"none\" || !value;\n},\n    _getComputedTransformMatrixAsArray = function _getComputedTransformMatrixAsArray(target) {\n  var matrixString = _getComputedProperty(target, _transformProp);\n\n  return _isNullTransform(matrixString) ? _identity2DMatrix : matrixString.substr(7).match(_numExp).map(_round);\n},\n    _getMatrix = function _getMatrix(target, force2D) {\n  var cache = target._gsap || _getCache(target),\n      style = target.style,\n      matrix = _getComputedTransformMatrixAsArray(target),\n      parent,\n      nextSibling,\n      temp,\n      addedToDOM;\n\n  if (cache.svg && target.getAttribute(\"transform\")) {\n    temp = target.transform.baseVal.consolidate().matrix; //ensures that even complex values like \"translate(50,60) rotate(135,0,0)\" are parsed because it mashes it into a matrix.\n\n    matrix = [temp.a, temp.b, temp.c, temp.d, temp.e, temp.f];\n    return matrix.join(\",\") === \"1,0,0,1,0,0\" ? _identity2DMatrix : matrix;\n  } else if (matrix === _identity2DMatrix && !target.offsetParent && target !== _docElement && !cache.svg) {\n    //note: if offsetParent is null, that means the element isn't in the normal document flow, like if it has display:none or one of its ancestors has display:none). Firefox returns null for getComputedStyle() if the element is in an iframe that has display:none. https://bugzilla.mozilla.org/show_bug.cgi?id=548397\n    //browsers don't report transforms accurately unless the element is in the DOM and has a display value that's not \"none\". Firefox and Microsoft browsers have a partial bug where they'll report transforms even if display:none BUT not any percentage-based values like translate(-50%, 8px) will be reported as if it's translate(0, 8px).\n    temp = style.display;\n    style.display = \"block\";\n    parent = target.parentNode;\n\n    if (!parent || !target.offsetParent && !target.getBoundingClientRect().width) {\n      // note: in 3.3.0 we switched target.offsetParent to _doc.body.contains(target) to avoid [sometimes unnecessary] MutationObserver calls but that wasn't adequate because there are edge cases where nested position: fixed elements need to get reparented to accurately sense transforms. See https://github.com/greensock/GSAP/issues/388 and https://github.com/greensock/GSAP/issues/375. Note: position: fixed elements report a null offsetParent but they could also be invisible because they're in an ancestor with display: none, so we check getBoundingClientRect(). We only want to alter the DOM if we absolutely have to because it can cause iframe content to reload, like a Vimeo video.\n      addedToDOM = 1; //flag\n\n      nextSibling = target.nextElementSibling;\n\n      _docElement.appendChild(target); //we must add it to the DOM in order to get values properly\n\n    }\n\n    matrix = _getComputedTransformMatrixAsArray(target);\n    temp ? style.display = temp : _removeProperty(target, \"display\");\n\n    if (addedToDOM) {\n      nextSibling ? parent.insertBefore(target, nextSibling) : parent ? parent.appendChild(target) : _docElement.removeChild(target);\n    }\n  }\n\n  return force2D && matrix.length > 6 ? [matrix[0], matrix[1], matrix[4], matrix[5], matrix[12], matrix[13]] : matrix;\n},\n    _applySVGOrigin = function _applySVGOrigin(target, origin, originIsAbsolute, smooth, matrixArray, pluginToAddPropTweensTo) {\n  var cache = target._gsap,\n      matrix = matrixArray || _getMatrix(target, true),\n      xOriginOld = cache.xOrigin || 0,\n      yOriginOld = cache.yOrigin || 0,\n      xOffsetOld = cache.xOffset || 0,\n      yOffsetOld = cache.yOffset || 0,\n      a = matrix[0],\n      b = matrix[1],\n      c = matrix[2],\n      d = matrix[3],\n      tx = matrix[4],\n      ty = matrix[5],\n      originSplit = origin.split(\" \"),\n      xOrigin = parseFloat(originSplit[0]) || 0,\n      yOrigin = parseFloat(originSplit[1]) || 0,\n      bounds,\n      determinant,\n      x,\n      y;\n\n  if (!originIsAbsolute) {\n    bounds = _getBBox(target);\n    xOrigin = bounds.x + (~originSplit[0].indexOf(\"%\") ? xOrigin / 100 * bounds.width : xOrigin);\n    yOrigin = bounds.y + (~(originSplit[1] || originSplit[0]).indexOf(\"%\") ? yOrigin / 100 * bounds.height : yOrigin); // if (!(\"xOrigin\" in cache) && (xOrigin || yOrigin)) { // added in 3.12.3, reverted in 3.12.4; requires more exploration\n    // \txOrigin -= bounds.x;\n    // \tyOrigin -= bounds.y;\n    // }\n  } else if (matrix !== _identity2DMatrix && (determinant = a * d - b * c)) {\n    //if it's zero (like if scaleX and scaleY are zero), skip it to avoid errors with dividing by zero.\n    x = xOrigin * (d / determinant) + yOrigin * (-c / determinant) + (c * ty - d * tx) / determinant;\n    y = xOrigin * (-b / determinant) + yOrigin * (a / determinant) - (a * ty - b * tx) / determinant;\n    xOrigin = x;\n    yOrigin = y; // theory: we only had to do this for smoothing and it assumes that the previous one was not originIsAbsolute.\n  }\n\n  if (smooth || smooth !== false && cache.smooth) {\n    tx = xOrigin - xOriginOld;\n    ty = yOrigin - yOriginOld;\n    cache.xOffset = xOffsetOld + (tx * a + ty * c) - tx;\n    cache.yOffset = yOffsetOld + (tx * b + ty * d) - ty;\n  } else {\n    cache.xOffset = cache.yOffset = 0;\n  }\n\n  cache.xOrigin = xOrigin;\n  cache.yOrigin = yOrigin;\n  cache.smooth = !!smooth;\n  cache.origin = origin;\n  cache.originIsAbsolute = !!originIsAbsolute;\n  target.style[_transformOriginProp] = \"0px 0px\"; //otherwise, if someone sets  an origin via CSS, it will likely interfere with the SVG transform attribute ones (because remember, we're baking the origin into the matrix() value).\n\n  if (pluginToAddPropTweensTo) {\n    _addNonTweeningPT(pluginToAddPropTweensTo, cache, \"xOrigin\", xOriginOld, xOrigin);\n\n    _addNonTweeningPT(pluginToAddPropTweensTo, cache, \"yOrigin\", yOriginOld, yOrigin);\n\n    _addNonTweeningPT(pluginToAddPropTweensTo, cache, \"xOffset\", xOffsetOld, cache.xOffset);\n\n    _addNonTweeningPT(pluginToAddPropTweensTo, cache, \"yOffset\", yOffsetOld, cache.yOffset);\n  }\n\n  target.setAttribute(\"data-svg-origin\", xOrigin + \" \" + yOrigin);\n},\n    _parseTransform = function _parseTransform(target, uncache) {\n  var cache = target._gsap || new GSCache(target);\n\n  if (\"x\" in cache && !uncache && !cache.uncache) {\n    return cache;\n  }\n\n  var style = target.style,\n      invertedScaleX = cache.scaleX < 0,\n      px = \"px\",\n      deg = \"deg\",\n      cs = getComputedStyle(target),\n      origin = _getComputedProperty(target, _transformOriginProp) || \"0\",\n      x,\n      y,\n      z,\n      scaleX,\n      scaleY,\n      rotation,\n      rotationX,\n      rotationY,\n      skewX,\n      skewY,\n      perspective,\n      xOrigin,\n      yOrigin,\n      matrix,\n      angle,\n      cos,\n      sin,\n      a,\n      b,\n      c,\n      d,\n      a12,\n      a22,\n      t1,\n      t2,\n      t3,\n      a13,\n      a23,\n      a33,\n      a42,\n      a43,\n      a32;\n  x = y = z = rotation = rotationX = rotationY = skewX = skewY = perspective = 0;\n  scaleX = scaleY = 1;\n  cache.svg = !!(target.getCTM && _isSVG(target));\n\n  if (cs.translate) {\n    // accommodate independent transforms by combining them into normal ones.\n    if (cs.translate !== \"none\" || cs.scale !== \"none\" || cs.rotate !== \"none\") {\n      style[_transformProp] = (cs.translate !== \"none\" ? \"translate3d(\" + (cs.translate + \" 0 0\").split(\" \").slice(0, 3).join(\", \") + \") \" : \"\") + (cs.rotate !== \"none\" ? \"rotate(\" + cs.rotate + \") \" : \"\") + (cs.scale !== \"none\" ? \"scale(\" + cs.scale.split(\" \").join(\",\") + \") \" : \"\") + (cs[_transformProp] !== \"none\" ? cs[_transformProp] : \"\");\n    }\n\n    style.scale = style.rotate = style.translate = \"none\";\n  }\n\n  matrix = _getMatrix(target, cache.svg);\n\n  if (cache.svg) {\n    if (cache.uncache) {\n      // if cache.uncache is true (and maybe if origin is 0,0), we need to set element.style.transformOrigin = (cache.xOrigin - bbox.x) + \"px \" + (cache.yOrigin - bbox.y) + \"px\". Previously we let the data-svg-origin stay instead, but when introducing revert(), it complicated things.\n      t2 = target.getBBox();\n      origin = cache.xOrigin - t2.x + \"px \" + (cache.yOrigin - t2.y) + \"px\";\n      t1 = \"\";\n    } else {\n      t1 = !uncache && target.getAttribute(\"data-svg-origin\"); //  Remember, to work around browser inconsistencies we always force SVG elements' transformOrigin to 0,0 and offset the translation accordingly.\n    }\n\n    _applySVGOrigin(target, t1 || origin, !!t1 || cache.originIsAbsolute, cache.smooth !== false, matrix);\n  }\n\n  xOrigin = cache.xOrigin || 0;\n  yOrigin = cache.yOrigin || 0;\n\n  if (matrix !== _identity2DMatrix) {\n    a = matrix[0]; //a11\n\n    b = matrix[1]; //a21\n\n    c = matrix[2]; //a31\n\n    d = matrix[3]; //a41\n\n    x = a12 = matrix[4];\n    y = a22 = matrix[5]; //2D matrix\n\n    if (matrix.length === 6) {\n      scaleX = Math.sqrt(a * a + b * b);\n      scaleY = Math.sqrt(d * d + c * c);\n      rotation = a || b ? _atan2(b, a) * _RAD2DEG : 0; //note: if scaleX is 0, we cannot accurately measure rotation. Same for skewX with a scaleY of 0. Therefore, we default to the previously recorded value (or zero if that doesn't exist).\n\n      skewX = c || d ? _atan2(c, d) * _RAD2DEG + rotation : 0;\n      skewX && (scaleY *= Math.abs(Math.cos(skewX * _DEG2RAD)));\n\n      if (cache.svg) {\n        x -= xOrigin - (xOrigin * a + yOrigin * c);\n        y -= yOrigin - (xOrigin * b + yOrigin * d);\n      } //3D matrix\n\n    } else {\n      a32 = matrix[6];\n      a42 = matrix[7];\n      a13 = matrix[8];\n      a23 = matrix[9];\n      a33 = matrix[10];\n      a43 = matrix[11];\n      x = matrix[12];\n      y = matrix[13];\n      z = matrix[14];\n      angle = _atan2(a32, a33);\n      rotationX = angle * _RAD2DEG; //rotationX\n\n      if (angle) {\n        cos = Math.cos(-angle);\n        sin = Math.sin(-angle);\n        t1 = a12 * cos + a13 * sin;\n        t2 = a22 * cos + a23 * sin;\n        t3 = a32 * cos + a33 * sin;\n        a13 = a12 * -sin + a13 * cos;\n        a23 = a22 * -sin + a23 * cos;\n        a33 = a32 * -sin + a33 * cos;\n        a43 = a42 * -sin + a43 * cos;\n        a12 = t1;\n        a22 = t2;\n        a32 = t3;\n      } //rotationY\n\n\n      angle = _atan2(-c, a33);\n      rotationY = angle * _RAD2DEG;\n\n      if (angle) {\n        cos = Math.cos(-angle);\n        sin = Math.sin(-angle);\n        t1 = a * cos - a13 * sin;\n        t2 = b * cos - a23 * sin;\n        t3 = c * cos - a33 * sin;\n        a43 = d * sin + a43 * cos;\n        a = t1;\n        b = t2;\n        c = t3;\n      } //rotationZ\n\n\n      angle = _atan2(b, a);\n      rotation = angle * _RAD2DEG;\n\n      if (angle) {\n        cos = Math.cos(angle);\n        sin = Math.sin(angle);\n        t1 = a * cos + b * sin;\n        t2 = a12 * cos + a22 * sin;\n        b = b * cos - a * sin;\n        a22 = a22 * cos - a12 * sin;\n        a = t1;\n        a12 = t2;\n      }\n\n      if (rotationX && Math.abs(rotationX) + Math.abs(rotation) > 359.9) {\n        //when rotationY is set, it will often be parsed as 180 degrees different than it should be, and rotationX and rotation both being 180 (it looks the same), so we adjust for that here.\n        rotationX = rotation = 0;\n        rotationY = 180 - rotationY;\n      }\n\n      scaleX = _round(Math.sqrt(a * a + b * b + c * c));\n      scaleY = _round(Math.sqrt(a22 * a22 + a32 * a32));\n      angle = _atan2(a12, a22);\n      skewX = Math.abs(angle) > 0.0002 ? angle * _RAD2DEG : 0;\n      perspective = a43 ? 1 / (a43 < 0 ? -a43 : a43) : 0;\n    }\n\n    if (cache.svg) {\n      //sense if there are CSS transforms applied on an SVG element in which case we must overwrite them when rendering. The transform attribute is more reliable cross-browser, but we can't just remove the CSS ones because they may be applied in a CSS rule somewhere (not just inline).\n      t1 = target.getAttribute(\"transform\");\n      cache.forceCSS = target.setAttribute(\"transform\", \"\") || !_isNullTransform(_getComputedProperty(target, _transformProp));\n      t1 && target.setAttribute(\"transform\", t1);\n    }\n  }\n\n  if (Math.abs(skewX) > 90 && Math.abs(skewX) < 270) {\n    if (invertedScaleX) {\n      scaleX *= -1;\n      skewX += rotation <= 0 ? 180 : -180;\n      rotation += rotation <= 0 ? 180 : -180;\n    } else {\n      scaleY *= -1;\n      skewX += skewX <= 0 ? 180 : -180;\n    }\n  }\n\n  uncache = uncache || cache.uncache;\n  cache.x = x - ((cache.xPercent = x && (!uncache && cache.xPercent || (Math.round(target.offsetWidth / 2) === Math.round(-x) ? -50 : 0))) ? target.offsetWidth * cache.xPercent / 100 : 0) + px;\n  cache.y = y - ((cache.yPercent = y && (!uncache && cache.yPercent || (Math.round(target.offsetHeight / 2) === Math.round(-y) ? -50 : 0))) ? target.offsetHeight * cache.yPercent / 100 : 0) + px;\n  cache.z = z + px;\n  cache.scaleX = _round(scaleX);\n  cache.scaleY = _round(scaleY);\n  cache.rotation = _round(rotation) + deg;\n  cache.rotationX = _round(rotationX) + deg;\n  cache.rotationY = _round(rotationY) + deg;\n  cache.skewX = skewX + deg;\n  cache.skewY = skewY + deg;\n  cache.transformPerspective = perspective + px;\n\n  if (cache.zOrigin = parseFloat(origin.split(\" \")[2]) || !uncache && cache.zOrigin || 0) {\n    style[_transformOriginProp] = _firstTwoOnly(origin);\n  }\n\n  cache.xOffset = cache.yOffset = 0;\n  cache.force3D = _config.force3D;\n  cache.renderTransform = cache.svg ? _renderSVGTransforms : _supports3D ? _renderCSSTransforms : _renderNon3DTransforms;\n  cache.uncache = 0;\n  return cache;\n},\n    _firstTwoOnly = function _firstTwoOnly(value) {\n  return (value = value.split(\" \"))[0] + \" \" + value[1];\n},\n    //for handling transformOrigin values, stripping out the 3rd dimension\n_addPxTranslate = function _addPxTranslate(target, start, value) {\n  var unit = getUnit(start);\n  return _round(parseFloat(start) + parseFloat(_convertToUnit(target, \"x\", value + \"px\", unit))) + unit;\n},\n    _renderNon3DTransforms = function _renderNon3DTransforms(ratio, cache) {\n  cache.z = \"0px\";\n  cache.rotationY = cache.rotationX = \"0deg\";\n  cache.force3D = 0;\n\n  _renderCSSTransforms(ratio, cache);\n},\n    _zeroDeg = \"0deg\",\n    _zeroPx = \"0px\",\n    _endParenthesis = \") \",\n    _renderCSSTransforms = function _renderCSSTransforms(ratio, cache) {\n  var _ref = cache || this,\n      xPercent = _ref.xPercent,\n      yPercent = _ref.yPercent,\n      x = _ref.x,\n      y = _ref.y,\n      z = _ref.z,\n      rotation = _ref.rotation,\n      rotationY = _ref.rotationY,\n      rotationX = _ref.rotationX,\n      skewX = _ref.skewX,\n      skewY = _ref.skewY,\n      scaleX = _ref.scaleX,\n      scaleY = _ref.scaleY,\n      transformPerspective = _ref.transformPerspective,\n      force3D = _ref.force3D,\n      target = _ref.target,\n      zOrigin = _ref.zOrigin,\n      transforms = \"\",\n      use3D = force3D === \"auto\" && ratio && ratio !== 1 || force3D === true; // Safari has a bug that causes it not to render 3D transform-origin values properly, so we force the z origin to 0, record it in the cache, and then do the math here to offset the translate values accordingly (basically do the 3D transform-origin part manually)\n\n\n  if (zOrigin && (rotationX !== _zeroDeg || rotationY !== _zeroDeg)) {\n    var angle = parseFloat(rotationY) * _DEG2RAD,\n        a13 = Math.sin(angle),\n        a33 = Math.cos(angle),\n        cos;\n\n    angle = parseFloat(rotationX) * _DEG2RAD;\n    cos = Math.cos(angle);\n    x = _addPxTranslate(target, x, a13 * cos * -zOrigin);\n    y = _addPxTranslate(target, y, -Math.sin(angle) * -zOrigin);\n    z = _addPxTranslate(target, z, a33 * cos * -zOrigin + zOrigin);\n  }\n\n  if (transformPerspective !== _zeroPx) {\n    transforms += \"perspective(\" + transformPerspective + _endParenthesis;\n  }\n\n  if (xPercent || yPercent) {\n    transforms += \"translate(\" + xPercent + \"%, \" + yPercent + \"%) \";\n  }\n\n  if (use3D || x !== _zeroPx || y !== _zeroPx || z !== _zeroPx) {\n    transforms += z !== _zeroPx || use3D ? \"translate3d(\" + x + \", \" + y + \", \" + z + \") \" : \"translate(\" + x + \", \" + y + _endParenthesis;\n  }\n\n  if (rotation !== _zeroDeg) {\n    transforms += \"rotate(\" + rotation + _endParenthesis;\n  }\n\n  if (rotationY !== _zeroDeg) {\n    transforms += \"rotateY(\" + rotationY + _endParenthesis;\n  }\n\n  if (rotationX !== _zeroDeg) {\n    transforms += \"rotateX(\" + rotationX + _endParenthesis;\n  }\n\n  if (skewX !== _zeroDeg || skewY !== _zeroDeg) {\n    transforms += \"skew(\" + skewX + \", \" + skewY + _endParenthesis;\n  }\n\n  if (scaleX !== 1 || scaleY !== 1) {\n    transforms += \"scale(\" + scaleX + \", \" + scaleY + _endParenthesis;\n  }\n\n  target.style[_transformProp] = transforms || \"translate(0, 0)\";\n},\n    _renderSVGTransforms = function _renderSVGTransforms(ratio, cache) {\n  var _ref2 = cache || this,\n      xPercent = _ref2.xPercent,\n      yPercent = _ref2.yPercent,\n      x = _ref2.x,\n      y = _ref2.y,\n      rotation = _ref2.rotation,\n      skewX = _ref2.skewX,\n      skewY = _ref2.skewY,\n      scaleX = _ref2.scaleX,\n      scaleY = _ref2.scaleY,\n      target = _ref2.target,\n      xOrigin = _ref2.xOrigin,\n      yOrigin = _ref2.yOrigin,\n      xOffset = _ref2.xOffset,\n      yOffset = _ref2.yOffset,\n      forceCSS = _ref2.forceCSS,\n      tx = parseFloat(x),\n      ty = parseFloat(y),\n      a11,\n      a21,\n      a12,\n      a22,\n      temp;\n\n  rotation = parseFloat(rotation);\n  skewX = parseFloat(skewX);\n  skewY = parseFloat(skewY);\n\n  if (skewY) {\n    //for performance reasons, we combine all skewing into the skewX and rotation values. Remember, a skewY of 10 degrees looks the same as a rotation of 10 degrees plus a skewX of 10 degrees.\n    skewY = parseFloat(skewY);\n    skewX += skewY;\n    rotation += skewY;\n  }\n\n  if (rotation || skewX) {\n    rotation *= _DEG2RAD;\n    skewX *= _DEG2RAD;\n    a11 = Math.cos(rotation) * scaleX;\n    a21 = Math.sin(rotation) * scaleX;\n    a12 = Math.sin(rotation - skewX) * -scaleY;\n    a22 = Math.cos(rotation - skewX) * scaleY;\n\n    if (skewX) {\n      skewY *= _DEG2RAD;\n      temp = Math.tan(skewX - skewY);\n      temp = Math.sqrt(1 + temp * temp);\n      a12 *= temp;\n      a22 *= temp;\n\n      if (skewY) {\n        temp = Math.tan(skewY);\n        temp = Math.sqrt(1 + temp * temp);\n        a11 *= temp;\n        a21 *= temp;\n      }\n    }\n\n    a11 = _round(a11);\n    a21 = _round(a21);\n    a12 = _round(a12);\n    a22 = _round(a22);\n  } else {\n    a11 = scaleX;\n    a22 = scaleY;\n    a21 = a12 = 0;\n  }\n\n  if (tx && !~(x + \"\").indexOf(\"px\") || ty && !~(y + \"\").indexOf(\"px\")) {\n    tx = _convertToUnit(target, \"x\", x, \"px\");\n    ty = _convertToUnit(target, \"y\", y, \"px\");\n  }\n\n  if (xOrigin || yOrigin || xOffset || yOffset) {\n    tx = _round(tx + xOrigin - (xOrigin * a11 + yOrigin * a12) + xOffset);\n    ty = _round(ty + yOrigin - (xOrigin * a21 + yOrigin * a22) + yOffset);\n  }\n\n  if (xPercent || yPercent) {\n    //The SVG spec doesn't support percentage-based translation in the \"transform\" attribute, so we merge it into the translation to simulate it.\n    temp = target.getBBox();\n    tx = _round(tx + xPercent / 100 * temp.width);\n    ty = _round(ty + yPercent / 100 * temp.height);\n  }\n\n  temp = \"matrix(\" + a11 + \",\" + a21 + \",\" + a12 + \",\" + a22 + \",\" + tx + \",\" + ty + \")\";\n  target.setAttribute(\"transform\", temp);\n  forceCSS && (target.style[_transformProp] = temp); //some browsers prioritize CSS transforms over the transform attribute. When we sense that the user has CSS transforms applied, we must overwrite them this way (otherwise some browser simply won't render the transform attribute changes!)\n},\n    _addRotationalPropTween = function _addRotationalPropTween(plugin, target, property, startNum, endValue) {\n  var cap = 360,\n      isString = _isString(endValue),\n      endNum = parseFloat(endValue) * (isString && ~endValue.indexOf(\"rad\") ? _RAD2DEG : 1),\n      change = endNum - startNum,\n      finalValue = startNum + change + \"deg\",\n      direction,\n      pt;\n\n  if (isString) {\n    direction = endValue.split(\"_\")[1];\n\n    if (direction === \"short\") {\n      change %= cap;\n\n      if (change !== change % (cap / 2)) {\n        change += change < 0 ? cap : -cap;\n      }\n    }\n\n    if (direction === \"cw\" && change < 0) {\n      change = (change + cap * _bigNum) % cap - ~~(change / cap) * cap;\n    } else if (direction === \"ccw\" && change > 0) {\n      change = (change - cap * _bigNum) % cap - ~~(change / cap) * cap;\n    }\n  }\n\n  plugin._pt = pt = new PropTween(plugin._pt, target, property, startNum, change, _renderPropWithEnd);\n  pt.e = finalValue;\n  pt.u = \"deg\";\n\n  plugin._props.push(property);\n\n  return pt;\n},\n    _assign = function _assign(target, source) {\n  // Internet Explorer doesn't have Object.assign(), so we recreate it here.\n  for (var p in source) {\n    target[p] = source[p];\n  }\n\n  return target;\n},\n    _addRawTransformPTs = function _addRawTransformPTs(plugin, transforms, target) {\n  //for handling cases where someone passes in a whole transform string, like transform: \"scale(2, 3) rotate(20deg) translateY(30em)\"\n  var startCache = _assign({}, target._gsap),\n      exclude = \"perspective,force3D,transformOrigin,svgOrigin\",\n      style = target.style,\n      endCache,\n      p,\n      startValue,\n      endValue,\n      startNum,\n      endNum,\n      startUnit,\n      endUnit;\n\n  if (startCache.svg) {\n    startValue = target.getAttribute(\"transform\");\n    target.setAttribute(\"transform\", \"\");\n    style[_transformProp] = transforms;\n    endCache = _parseTransform(target, 1);\n\n    _removeProperty(target, _transformProp);\n\n    target.setAttribute(\"transform\", startValue);\n  } else {\n    startValue = getComputedStyle(target)[_transformProp];\n    style[_transformProp] = transforms;\n    endCache = _parseTransform(target, 1);\n    style[_transformProp] = startValue;\n  }\n\n  for (p in _transformProps) {\n    startValue = startCache[p];\n    endValue = endCache[p];\n\n    if (startValue !== endValue && exclude.indexOf(p) < 0) {\n      //tweening to no perspective gives very unintuitive results - just keep the same perspective in that case.\n      startUnit = getUnit(startValue);\n      endUnit = getUnit(endValue);\n      startNum = startUnit !== endUnit ? _convertToUnit(target, p, startValue, endUnit) : parseFloat(startValue);\n      endNum = parseFloat(endValue);\n      plugin._pt = new PropTween(plugin._pt, endCache, p, startNum, endNum - startNum, _renderCSSProp);\n      plugin._pt.u = endUnit || 0;\n\n      plugin._props.push(p);\n    }\n  }\n\n  _assign(endCache, startCache);\n}; // handle splitting apart padding, margin, borderWidth, and borderRadius into their 4 components. Firefox, for example, won't report borderRadius correctly - it will only do borderTopLeftRadius and the other corners. We also want to handle paddingTop, marginLeft, borderRightWidth, etc.\n\n\n_forEachName(\"padding,margin,Width,Radius\", function (name, index) {\n  var t = \"Top\",\n      r = \"Right\",\n      b = \"Bottom\",\n      l = \"Left\",\n      props = (index < 3 ? [t, r, b, l] : [t + l, t + r, b + r, b + l]).map(function (side) {\n    return index < 2 ? name + side : \"border\" + side + name;\n  });\n\n  _specialProps[index > 1 ? \"border\" + name : name] = function (plugin, target, property, endValue, tween) {\n    var a, vars;\n\n    if (arguments.length < 4) {\n      // getter, passed target, property, and unit (from _get())\n      a = props.map(function (prop) {\n        return _get(plugin, prop, property);\n      });\n      vars = a.join(\" \");\n      return vars.split(a[0]).length === 5 ? a[0] : vars;\n    }\n\n    a = (endValue + \"\").split(\" \");\n    vars = {};\n    props.forEach(function (prop, i) {\n      return vars[prop] = a[i] = a[i] || a[(i - 1) / 2 | 0];\n    });\n    plugin.init(target, vars, tween);\n  };\n});\n\nexport var CSSPlugin = {\n  name: \"css\",\n  register: _initCore,\n  targetTest: function targetTest(target) {\n    return target.style && target.nodeType;\n  },\n  init: function init(target, vars, tween, index, targets) {\n    var props = this._props,\n        style = target.style,\n        startAt = tween.vars.startAt,\n        startValue,\n        endValue,\n        endNum,\n        startNum,\n        type,\n        specialProp,\n        p,\n        startUnit,\n        endUnit,\n        relative,\n        isTransformRelated,\n        transformPropTween,\n        cache,\n        smooth,\n        hasPriority,\n        inlineProps,\n        finalTransformValue;\n    _pluginInitted || _initCore(); // we may call init() multiple times on the same plugin instance, like when adding special properties, so make sure we don't overwrite the revert data or inlineProps\n\n    this.styles = this.styles || _getStyleSaver(target);\n    inlineProps = this.styles.props;\n    this.tween = tween;\n\n    for (p in vars) {\n      if (p === \"autoRound\") {\n        continue;\n      }\n\n      endValue = vars[p];\n\n      if (_plugins[p] && _checkPlugin(p, vars, tween, index, target, targets)) {\n        // plugins\n        continue;\n      }\n\n      type = typeof endValue;\n      specialProp = _specialProps[p];\n\n      if (type === \"function\") {\n        endValue = endValue.call(tween, index, target, targets);\n        type = typeof endValue;\n      }\n\n      if (type === \"string\" && ~endValue.indexOf(\"random(\")) {\n        endValue = _replaceRandom(endValue);\n      }\n\n      if (specialProp) {\n        specialProp(this, target, p, endValue, tween) && (hasPriority = 1);\n      } else if (p.substr(0, 2) === \"--\") {\n        //CSS variable\n        startValue = (getComputedStyle(target).getPropertyValue(p) + \"\").trim();\n        endValue += \"\";\n        _colorExp.lastIndex = 0;\n\n        if (!_colorExp.test(startValue)) {\n          // colors don't have units\n          startUnit = getUnit(startValue);\n          endUnit = getUnit(endValue);\n          endUnit ? startUnit !== endUnit && (startValue = _convertToUnit(target, p, startValue, endUnit) + endUnit) : startUnit && (endValue += startUnit);\n        }\n\n        this.add(style, \"setProperty\", startValue, endValue, index, targets, 0, 0, p);\n        props.push(p);\n        inlineProps.push(p, 0, style[p]);\n      } else if (type !== \"undefined\") {\n        if (startAt && p in startAt) {\n          // in case someone hard-codes a complex value as the start, like top: \"calc(2vh / 2)\". Without this, it'd use the computed value (always in px)\n          startValue = typeof startAt[p] === \"function\" ? startAt[p].call(tween, index, target, targets) : startAt[p];\n          _isString(startValue) && ~startValue.indexOf(\"random(\") && (startValue = _replaceRandom(startValue));\n          getUnit(startValue + \"\") || startValue === \"auto\" || (startValue += _config.units[p] || getUnit(_get(target, p)) || \"\"); // for cases when someone passes in a unitless value like {x: 100}; if we try setting translate(100, 0px) it won't work.\n\n          (startValue + \"\").charAt(1) === \"=\" && (startValue = _get(target, p)); // can't work with relative values\n        } else {\n          startValue = _get(target, p);\n        }\n\n        startNum = parseFloat(startValue);\n        relative = type === \"string\" && endValue.charAt(1) === \"=\" && endValue.substr(0, 2);\n        relative && (endValue = endValue.substr(2));\n        endNum = parseFloat(endValue);\n\n        if (p in _propertyAliases) {\n          if (p === \"autoAlpha\") {\n            //special case where we control the visibility along with opacity. We still allow the opacity value to pass through and get tweened.\n            if (startNum === 1 && _get(target, \"visibility\") === \"hidden\" && endNum) {\n              //if visibility is initially set to \"hidden\", we should interpret that as intent to make opacity 0 (a convenience)\n              startNum = 0;\n            }\n\n            inlineProps.push(\"visibility\", 0, style.visibility);\n\n            _addNonTweeningPT(this, style, \"visibility\", startNum ? \"inherit\" : \"hidden\", endNum ? \"inherit\" : \"hidden\", !endNum);\n          }\n\n          if (p !== \"scale\" && p !== \"transform\") {\n            p = _propertyAliases[p];\n            ~p.indexOf(\",\") && (p = p.split(\",\")[0]);\n          }\n        }\n\n        isTransformRelated = p in _transformProps; //--- TRANSFORM-RELATED ---\n\n        if (isTransformRelated) {\n          this.styles.save(p);\n          finalTransformValue = endValue; // this is always the same as endValue except when it's a var(--) value, in which case we need to calculate the end value.\n\n          if (type === \"string\" && endValue.substring(0, 6) === \"var(--\") {\n            endValue = _getComputedProperty(target, endValue.substring(4, endValue.indexOf(\")\")));\n\n            if (endValue.substring(0, 5) === \"calc(\") {\n              var origPerspective = target.style.perspective;\n              target.style.perspective = endValue;\n              endValue = _getComputedProperty(target, \"perspective\");\n              origPerspective ? target.style.perspective = origPerspective : _removeProperty(target, \"perspective\");\n            }\n\n            endNum = parseFloat(endValue);\n          }\n\n          if (!transformPropTween) {\n            cache = target._gsap;\n            cache.renderTransform && !vars.parseTransform || _parseTransform(target, vars.parseTransform); // if, for example, gsap.set(... {transform:\"translateX(50vw)\"}), the _get() call doesn't parse the transform, thus cache.renderTransform won't be set yet so force the parsing of the transform here.\n\n            smooth = vars.smoothOrigin !== false && cache.smooth;\n            transformPropTween = this._pt = new PropTween(this._pt, style, _transformProp, 0, 1, cache.renderTransform, cache, 0, -1); //the first time through, create the rendering PropTween so that it runs LAST (in the linked list, we keep adding to the beginning)\n\n            transformPropTween.dep = 1; //flag it as dependent so that if things get killed/overwritten and this is the only PropTween left, we can safely kill the whole tween.\n          }\n\n          if (p === \"scale\") {\n            this._pt = new PropTween(this._pt, cache, \"scaleY\", cache.scaleY, (relative ? _parseRelative(cache.scaleY, relative + endNum) : endNum) - cache.scaleY || 0, _renderCSSProp);\n            this._pt.u = 0;\n            props.push(\"scaleY\", p);\n            p += \"X\";\n          } else if (p === \"transformOrigin\") {\n            inlineProps.push(_transformOriginProp, 0, style[_transformOriginProp]);\n            endValue = _convertKeywordsToPercentages(endValue); //in case something like \"left top\" or \"bottom right\" is passed in. Convert to percentages.\n\n            if (cache.svg) {\n              _applySVGOrigin(target, endValue, 0, smooth, 0, this);\n            } else {\n              endUnit = parseFloat(endValue.split(\" \")[2]) || 0; //handle the zOrigin separately!\n\n              endUnit !== cache.zOrigin && _addNonTweeningPT(this, cache, \"zOrigin\", cache.zOrigin, endUnit);\n\n              _addNonTweeningPT(this, style, p, _firstTwoOnly(startValue), _firstTwoOnly(endValue));\n            }\n\n            continue;\n          } else if (p === \"svgOrigin\") {\n            _applySVGOrigin(target, endValue, 1, smooth, 0, this);\n\n            continue;\n          } else if (p in _rotationalProperties) {\n            _addRotationalPropTween(this, cache, p, startNum, relative ? _parseRelative(startNum, relative + endValue) : endValue);\n\n            continue;\n          } else if (p === \"smoothOrigin\") {\n            _addNonTweeningPT(this, cache, \"smooth\", cache.smooth, endValue);\n\n            continue;\n          } else if (p === \"force3D\") {\n            cache[p] = endValue;\n            continue;\n          } else if (p === \"transform\") {\n            _addRawTransformPTs(this, endValue, target);\n\n            continue;\n          }\n        } else if (!(p in style)) {\n          p = _checkPropPrefix(p) || p;\n        }\n\n        if (isTransformRelated || (endNum || endNum === 0) && (startNum || startNum === 0) && !_complexExp.test(endValue) && p in style) {\n          startUnit = (startValue + \"\").substr((startNum + \"\").length);\n          endNum || (endNum = 0); // protect against NaN\n\n          endUnit = getUnit(endValue) || (p in _config.units ? _config.units[p] : startUnit);\n          startUnit !== endUnit && (startNum = _convertToUnit(target, p, startValue, endUnit));\n          this._pt = new PropTween(this._pt, isTransformRelated ? cache : style, p, startNum, (relative ? _parseRelative(startNum, relative + endNum) : endNum) - startNum, !isTransformRelated && (endUnit === \"px\" || p === \"zIndex\") && vars.autoRound !== false ? _renderRoundedCSSProp : _renderCSSProp);\n          this._pt.u = endUnit || 0;\n\n          if (isTransformRelated && finalTransformValue !== endValue) {\n            this._pt.b = startValue;\n            this._pt.e = finalTransformValue;\n            this._pt.r = _renderCSSPropWithBeginningAndEnd;\n          } else if (startUnit !== endUnit && endUnit !== \"%\") {\n            //when the tween goes all the way back to the beginning, we need to revert it to the OLD/ORIGINAL value (with those units). We record that as a \"b\" (beginning) property and point to a render method that handles that. (performance optimization)\n            this._pt.b = startValue;\n            this._pt.r = _renderCSSPropWithBeginning;\n          }\n        } else if (!(p in style)) {\n          if (p in target) {\n            //maybe it's not a style - it could be a property added directly to an element in which case we'll try to animate that.\n            this.add(target, p, startValue || target[p], relative ? relative + endValue : endValue, index, targets);\n          } else if (p !== \"parseTransform\") {\n            _missingPlugin(p, endValue);\n\n            continue;\n          }\n        } else {\n          _tweenComplexCSSString.call(this, target, p, startValue, relative ? relative + endValue : endValue);\n        }\n\n        isTransformRelated || (p in style ? inlineProps.push(p, 0, style[p]) : typeof target[p] === \"function\" ? inlineProps.push(p, 2, target[p]()) : inlineProps.push(p, 1, startValue || target[p]));\n        props.push(p);\n      }\n    }\n\n    hasPriority && _sortPropTweensByPriority(this);\n  },\n  render: function render(ratio, data) {\n    if (data.tween._time || !_reverting()) {\n      var pt = data._pt;\n\n      while (pt) {\n        pt.r(ratio, pt.d);\n        pt = pt._next;\n      }\n    } else {\n      data.styles.revert();\n    }\n  },\n  get: _get,\n  aliases: _propertyAliases,\n  getSetter: function getSetter(target, property, plugin) {\n    //returns a setter function that accepts target, property, value and applies it accordingly. Remember, properties like \"x\" aren't as simple as target.style.property = value because they've got to be applied to a proxy object and then merged into a transform string in a renderer.\n    var p = _propertyAliases[property];\n    p && p.indexOf(\",\") < 0 && (property = p);\n    return property in _transformProps && property !== _transformOriginProp && (target._gsap.x || _get(target, \"x\")) ? plugin && _recentSetterPlugin === plugin ? property === \"scale\" ? _setterScale : _setterTransform : (_recentSetterPlugin = plugin || {}) && (property === \"scale\" ? _setterScaleWithRender : _setterTransformWithRender) : target.style && !_isUndefined(target.style[property]) ? _setterCSSStyle : ~property.indexOf(\"-\") ? _setterCSSProp : _getSetter(target, property);\n  },\n  core: {\n    _removeProperty: _removeProperty,\n    _getMatrix: _getMatrix\n  }\n};\ngsap.utils.checkPrefix = _checkPropPrefix;\ngsap.core.getStyleSaver = _getStyleSaver;\n\n(function (positionAndScale, rotation, others, aliases) {\n  var all = _forEachName(positionAndScale + \",\" + rotation + \",\" + others, function (name) {\n    _transformProps[name] = 1;\n  });\n\n  _forEachName(rotation, function (name) {\n    _config.units[name] = \"deg\";\n    _rotationalProperties[name] = 1;\n  });\n\n  _propertyAliases[all[13]] = positionAndScale + \",\" + rotation;\n\n  _forEachName(aliases, function (name) {\n    var split = name.split(\":\");\n    _propertyAliases[split[1]] = all[split[0]];\n  });\n})(\"x,y,z,scale,scaleX,scaleY,xPercent,yPercent\", \"rotation,rotationX,rotationY,skewX,skewY\", \"transform,transformOrigin,svgOrigin,force3D,smoothOrigin,transformPerspective\", \"0:translateX,1:translateY,2:translateZ,8:rotate,8:rotationZ,8:rotateZ,9:rotateX,10:rotateY\");\n\n_forEachName(\"x,y,z,top,right,bottom,left,width,height,fontSize,padding,margin,perspective\", function (name) {\n  _config.units[name] = \"px\";\n});\n\ngsap.registerPlugin(CSSPlugin);\nexport { CSSPlugin as default, _getBBox, _createElement, _checkPropPrefix as checkPrefix };","import { gsap, Power0, Power1, Power2, Power3, Power4, Linear, Quad, Cubic, Quart, Quint, Strong, Elastic, Back, SteppedEase, Bounce, Sine, Expo, Circ, TweenLite, TimelineLite, TimelineMax } from \"./gsap-core.js\";\nimport { CSSPlugin } from \"./CSSPlugin.js\";\nvar gsapWithCSS = gsap.registerPlugin(CSSPlugin) || gsap,\n    // to protect from tree shaking\nTweenMaxWithCSS = gsapWithCSS.core.Tween;\nexport { gsapWithCSS as gsap, gsapWithCSS as default, CSSPlugin, TweenMaxWithCSS as TweenMax, TweenLite, TimelineMax, TimelineLite, Power0, Power1, Power2, Power3, Power4, Linear, Quad, Cubic, Quart, Quint, Strong, Elastic, Back, SteppedEase, Bounce, Sine, Expo, Circ };","/**\n * Parse a path string into an array of path segments.\n *\n * Square bracket notation `a[b]` may be used to \"escape\" dots that would otherwise be interpreted as path separators.\n *\n * Example:\n * a -> ['a']\n * a.b.c -> ['a', 'b', 'c']\n * a[b].c -> ['a', 'b', 'c']\n * a[b.c].e.f -> ['a', 'b.c', 'e', 'f']\n * a[b][c][d] -> ['a', 'b', 'c', 'd']\n *\n * @param {string|string[]} path\n **/ \"use strict\";\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nObject.defineProperty(exports, \"toPath\", {\n    enumerable: true,\n    get: function() {\n        return toPath;\n    }\n});\nfunction toPath(path) {\n    if (Array.isArray(path)) return path;\n    let openBrackets = path.split(\"[\").length - 1;\n    let closedBrackets = path.split(\"]\").length - 1;\n    if (openBrackets !== closedBrackets) {\n        throw new Error(`Path is invalid. Has unbalanced brackets: ${path}`);\n    }\n    return path.split(/\\.(?![^\\[]*\\])|[\\[\\]]/g).filter(Boolean);\n}\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar fails = require('../internals/fails');\nvar createElement = require('../internals/document-create-element');\n\n// Thanks to IE8 for its funny defineProperty\nmodule.exports = !DESCRIPTORS && !fails(function () {\n  // eslint-disable-next-line es/no-object-defineproperty -- required for testing\n  return Object.defineProperty(createElement('div'), 'a', {\n    get: function () { return 7; }\n  }).a !== 7;\n});\n","/**\n * lodash 4.4.0 (Custom Build) <https://lodash.com/>\n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright 2012-2016 The Dojo Foundation <http://dojofoundation.org/>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright 2009-2016 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license <https://lodash.com/license>\n */\n\n/**\n * Casts `value` as an array if it's not one.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to inspect.\n * @returns {Array} Returns the cast array.\n * @example\n *\n * _.castArray(1);\n * // => [1]\n *\n * _.castArray({ 'a': 1 });\n * // => [{ 'a': 1 }]\n *\n * _.castArray('abc');\n * // => ['abc']\n *\n * _.castArray(null);\n * // => [null]\n *\n * _.castArray(undefined);\n * // => [undefined]\n *\n * _.castArray();\n * // => []\n *\n * var array = [1, 2, 3];\n * console.log(_.castArray(array) === array);\n * // => true\n */\nfunction castArray() {\n  if (!arguments.length) {\n    return [];\n  }\n  var value = arguments[0];\n  return isArray(value) ? value : [value];\n}\n\n/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @type {Function}\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nmodule.exports = castArray;\n","'use strict';\nvar aCallable = require('../internals/a-callable');\nvar isNullOrUndefined = require('../internals/is-null-or-undefined');\n\n// `GetMethod` abstract operation\n// https://tc39.es/ecma262/#sec-getmethod\nmodule.exports = function (V, P) {\n  var func = V[P];\n  return isNullOrUndefined(func) ? undefined : aCallable(func);\n};\n","'use strict';\n// TODO: Remove this module from `core-js@4` since it's split to modules listed below\nrequire('../modules/web.set-interval');\nrequire('../modules/web.set-timeout');\n","'use strict';\n// TODO: Remove this module from `core-js@4` since it's replaced to module below\nrequire('../modules/es.map.constructor');\n","'use strict';\nvar $ = require('../internals/export');\nvar $values = require('../internals/object-to-array').values;\n\n// `Object.values` method\n// https://tc39.es/ecma262/#sec-object.values\n$({ target: 'Object', stat: true }, {\n  values: function values(O) {\n    return $values(O);\n  }\n});\n","'use strict';\nvar aCallable = require('../internals/a-callable');\n\nvar $TypeError = TypeError;\n\nvar PromiseCapability = function (C) {\n  var resolve, reject;\n  this.promise = new C(function ($$resolve, $$reject) {\n    if (resolve !== undefined || reject !== undefined) throw new $TypeError('Bad Promise constructor');\n    resolve = $$resolve;\n    reject = $$reject;\n  });\n  this.resolve = aCallable(resolve);\n  this.reject = aCallable(reject);\n};\n\n// `NewPromiseCapability` abstract operation\n// https://tc39.es/ecma262/#sec-newpromisecapability\nmodule.exports.f = function (C) {\n  return new PromiseCapability(C);\n};\n","(function(f){if(typeof exports===\"object\"&&typeof module!==\"undefined\"){module.exports=f()}else if(typeof define===\"function\"&&define.amd){define([],f)}else{var g;if(typeof window!==\"undefined\"){g=window}else if(typeof global!==\"undefined\"){g=global}else if(typeof self!==\"undefined\"){g=self}else{g=this}g.braintree = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c=\"function\"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error(\"Cannot find module '\"+i+\"'\");throw a.code=\"MODULE_NOT_FOUND\",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u=\"function\"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(_dereq_,module,exports){\n\"use strict\";\nvar scriptPromiseCache = {};\nfunction loadScript(options) {\n    var scriptLoadPromise;\n    var stringifiedOptions = JSON.stringify(options);\n    if (!options.forceScriptReload) {\n        scriptLoadPromise = scriptPromiseCache[stringifiedOptions];\n        if (scriptLoadPromise) {\n            return scriptLoadPromise;\n        }\n    }\n    var script = document.createElement(\"script\");\n    var attrs = options.dataAttributes || {};\n    var container = options.container || document.head;\n    script.src = options.src;\n    script.id = options.id || \"\";\n    script.async = true;\n    if (options.type) {\n        script.setAttribute(\"type\", \"\".concat(options.type));\n    }\n    if (options.crossorigin) {\n        script.setAttribute(\"crossorigin\", \"\".concat(options.crossorigin));\n    }\n    if (options.integrity) {\n        script.setAttribute(\"integrity\", \"\".concat(options.integrity));\n    }\n    Object.keys(attrs).forEach(function (key) {\n        script.setAttribute(\"data-\".concat(key), \"\".concat(attrs[key]));\n    });\n    scriptLoadPromise = new Promise(function (resolve, reject) {\n        script.addEventListener(\"load\", function () {\n            resolve(script);\n        });\n        script.addEventListener(\"error\", function () {\n            reject(new Error(\"\".concat(options.src, \" failed to load.\")));\n        });\n        script.addEventListener(\"abort\", function () {\n            reject(new Error(\"\".concat(options.src, \" has aborted.\")));\n        });\n        container.appendChild(script);\n    });\n    scriptPromiseCache[stringifiedOptions] = scriptLoadPromise;\n    return scriptLoadPromise;\n}\nloadScript.clearCache = function () {\n    scriptPromiseCache = {};\n};\nmodule.exports = loadScript;\n\n},{}],2:[function(_dereq_,module,exports){\nmodule.exports = _dereq_(\"./dist/load-script\");\n\n},{\"./dist/load-script\":1}],3:[function(_dereq_,module,exports){\n\"use strict\";\nmodule.exports = function isAndroid(ua) {\n    ua = ua || window.navigator.userAgent;\n    return /Android/i.test(ua);\n};\n\n},{}],4:[function(_dereq_,module,exports){\n\"use strict\";\nmodule.exports = function isChromeOS(ua) {\n    ua = ua || window.navigator.userAgent;\n    return /CrOS/i.test(ua);\n};\n\n},{}],5:[function(_dereq_,module,exports){\n\"use strict\";\nvar isEdge = _dereq_(\"./is-edge\");\nvar isSamsung = _dereq_(\"./is-samsung\");\nvar isDuckDuckGo = _dereq_(\"./is-duckduckgo\");\nvar isOpera = _dereq_(\"./is-opera\");\nvar isSilk = _dereq_(\"./is-silk\");\nmodule.exports = function isChrome(ua) {\n    ua = ua || window.navigator.userAgent;\n    return ((ua.indexOf(\"Chrome\") !== -1 || ua.indexOf(\"CriOS\") !== -1) &&\n        !isEdge(ua) &&\n        !isSamsung(ua) &&\n        !isDuckDuckGo(ua) &&\n        !isOpera(ua) &&\n        !isSilk(ua));\n};\n\n},{\"./is-duckduckgo\":6,\"./is-edge\":7,\"./is-opera\":17,\"./is-samsung\":19,\"./is-silk\":20}],6:[function(_dereq_,module,exports){\n\"use strict\";\nmodule.exports = function isDuckDuckGo(ua) {\n    ua = ua || window.navigator.userAgent;\n    return ua.indexOf(\"DuckDuckGo/\") !== -1;\n};\n\n},{}],7:[function(_dereq_,module,exports){\n\"use strict\";\nmodule.exports = function isEdge(ua) {\n    ua = ua || window.navigator.userAgent;\n    return ua.indexOf(\"Edge/\") !== -1 || ua.indexOf(\"Edg/\") !== -1;\n};\n\n},{}],8:[function(_dereq_,module,exports){\n\"use strict\";\nmodule.exports = function isFirefox(ua) {\n    ua = ua || window.navigator.userAgent;\n    return /Firefox/i.test(ua);\n};\n\n},{}],9:[function(_dereq_,module,exports){\n\"use strict\";\nvar detectIncognito = _dereq_(\"detectincognitojs\");\nmodule.exports = function isIncognito() {\n    return detectIncognito.detectIncognito();\n};\n\n},{\"detectincognitojs\":52}],10:[function(_dereq_,module,exports){\n\"use strict\";\nmodule.exports = function isIosFirefox(ua) {\n    ua = ua || window.navigator.userAgent;\n    return /FxiOS/i.test(ua);\n};\n\n},{}],11:[function(_dereq_,module,exports){\n\"use strict\";\nvar isIos = _dereq_(\"./is-ios\");\nfunction isGoogleSearchApp(ua) {\n    return /\\bGSA\\b/.test(ua);\n}\nmodule.exports = function isIosGoogleSearchApp(ua) {\n    ua = ua || window.navigator.userAgent;\n    return isIos(ua) && isGoogleSearchApp(ua);\n};\n\n},{\"./is-ios\":15}],12:[function(_dereq_,module,exports){\n\"use strict\";\nvar isIos = _dereq_(\"./is-ios\");\nvar isIosFirefox = _dereq_(\"./is-ios-firefox\");\nvar webkitRegexp = /webkit/i;\nfunction isWebkit(ua) {\n    return webkitRegexp.test(ua);\n}\nfunction isIosChrome(ua) {\n    return ua.indexOf(\"CriOS\") > -1;\n}\nfunction isFacebook(ua) {\n    return ua.indexOf(\"FBAN\") > -1;\n}\nmodule.exports = function isIosSafari(ua) {\n    ua = ua || window.navigator.userAgent;\n    return (isIos(ua) &&\n        isWebkit(ua) &&\n        !isIosChrome(ua) &&\n        !isIosFirefox(ua) &&\n        !isFacebook(ua));\n};\n\n},{\"./is-ios\":15,\"./is-ios-firefox\":10}],13:[function(_dereq_,module,exports){\n\"use strict\";\nvar isIos = _dereq_(\"./is-ios\");\nvar isIosGoogleSearchApp = _dereq_(\"./is-ios-google-search-app\");\nmodule.exports = function isIosWebview(ua) {\n    ua = ua || window.navigator.userAgent;\n    if (isIos(ua)) {\n        // The Google Search iOS app is technically a webview and doesn't support popups.\n        if (isIosGoogleSearchApp(ua)) {\n            return true;\n        }\n        // Historically, a webview could be identified by the presence of AppleWebKit and _no_ presence of Safari after.\n        return /.+AppleWebKit(?!.*Safari)/i.test(ua);\n    }\n    return false;\n};\n\n},{\"./is-ios\":15,\"./is-ios-google-search-app\":11}],14:[function(_dereq_,module,exports){\n\"use strict\";\nvar isIosWebview = _dereq_(\"./is-ios-webview\");\nmodule.exports = function isIosWKWebview(ua, statusBarVisible) {\n    statusBarVisible =\n        typeof statusBarVisible !== \"undefined\"\n            ? statusBarVisible\n            : window.statusbar.visible;\n    return isIosWebview(ua) && statusBarVisible;\n};\n\n},{\"./is-ios-webview\":13}],15:[function(_dereq_,module,exports){\n\"use strict\";\nvar isIpadOS = _dereq_(\"./is-ipados\");\nmodule.exports = function isIos(ua, checkIpadOS, document) {\n    if (checkIpadOS === void 0) { checkIpadOS = true; }\n    ua = ua || window.navigator.userAgent;\n    var iOsTest = /iPhone|iPod|iPad/i.test(ua);\n    return checkIpadOS ? iOsTest || isIpadOS(ua, document) : iOsTest;\n};\n\n},{\"./is-ipados\":16}],16:[function(_dereq_,module,exports){\n\"use strict\";\nmodule.exports = function isIpadOS(ua, document) {\n    ua = ua || window.navigator.userAgent;\n    document = document || window.document;\n    // \"ontouchend\" is used to determine if a browser is on an iPad, otherwise\n    // user-agents for iPadOS behave/identify as a desktop browser\n    return /Mac|iPad/i.test(ua) && \"ontouchend\" in document;\n};\n\n},{}],17:[function(_dereq_,module,exports){\n\"use strict\";\nmodule.exports = function isOpera(ua) {\n    ua = ua || window.navigator.userAgent;\n    return (ua.indexOf(\"OPR/\") !== -1 ||\n        ua.indexOf(\"Opera/\") !== -1 ||\n        ua.indexOf(\"OPT/\") !== -1);\n};\n\n},{}],18:[function(_dereq_,module,exports){\n\"use strict\";\nmodule.exports = function isSafari(ua) {\n    ua = ua || window.navigator.userAgent;\n    return (/^Mozilla\\/5\\.0.*Safari\\//.test(ua) &&\n        !/(iPhone|iPad|iPod|Android|SM-)/i.test(ua) &&\n        !/Chrome|CriOS|FxiOS|OPiOS|mercury/i.test(ua));\n};\n\n},{}],19:[function(_dereq_,module,exports){\n\"use strict\";\nmodule.exports = function isSamsungBrowser(ua) {\n    ua = ua || window.navigator.userAgent;\n    return /SamsungBrowser/i.test(ua);\n};\n\n},{}],20:[function(_dereq_,module,exports){\n\"use strict\";\nmodule.exports = function isSilk(ua) {\n    ua = ua || window.navigator.userAgent;\n    return ua.indexOf(\"Silk/\") !== -1;\n};\n\n},{}],21:[function(_dereq_,module,exports){\n\"use strict\";\nvar MINIMUM_SUPPORTED_CHROME_IOS_VERSION = 48;\nvar isAndroid = _dereq_(\"./is-android\");\nvar isIosFirefox = _dereq_(\"./is-ios-firefox\");\nvar isIosWebview = _dereq_(\"./is-ios-webview\");\nvar isChrome = _dereq_(\"./is-chrome\");\nvar isSamsungBrowser = _dereq_(\"./is-samsung\");\nvar isDuckDuckGo = _dereq_(\"./is-duckduckgo\");\nfunction isUnsupportedIosChrome(ua) {\n    ua = ua || window.navigator.userAgent;\n    var match = ua.match(/CriOS\\/(\\d+)\\./);\n    if (!match) {\n        return false;\n    }\n    var version = parseInt(match[1], 10);\n    return version < MINIMUM_SUPPORTED_CHROME_IOS_VERSION;\n}\nfunction isOperaMini(ua) {\n    ua = ua || window.navigator.userAgent;\n    return ua.indexOf(\"Opera Mini\") > -1;\n}\nfunction isAndroidWebview(ua) {\n    var androidWebviewRegExp = /Version\\/[\\d.]+/i;\n    ua = ua || window.navigator.userAgent;\n    if (isAndroid(ua)) {\n        return (androidWebviewRegExp.test(ua) && !isOperaMini(ua) && !isDuckDuckGo(ua));\n    }\n    return false;\n}\nfunction isOldSamsungBrowserOrSamsungWebview(ua) {\n    return !isChrome(ua) && !isSamsungBrowser(ua) && /samsung/i.test(ua);\n}\nmodule.exports = function supportsPopups(ua) {\n    ua = ua || window.navigator.userAgent;\n    return !(isIosWebview(ua) ||\n        isIosFirefox(ua) ||\n        isAndroidWebview(ua) ||\n        isOperaMini(ua) ||\n        isUnsupportedIosChrome(ua) ||\n        isOldSamsungBrowserOrSamsungWebview(ua));\n};\n\n},{\"./is-android\":3,\"./is-chrome\":5,\"./is-duckduckgo\":6,\"./is-ios-firefox\":10,\"./is-ios-webview\":13,\"./is-samsung\":19}],22:[function(_dereq_,module,exports){\nmodule.exports = _dereq_(\"./dist/is-android\");\n\n},{\"./dist/is-android\":3}],23:[function(_dereq_,module,exports){\nmodule.exports = _dereq_(\"./dist/is-chrome-os\");\n\n},{\"./dist/is-chrome-os\":4}],24:[function(_dereq_,module,exports){\nmodule.exports = _dereq_(\"./dist/is-chrome\");\n\n},{\"./dist/is-chrome\":5}],25:[function(_dereq_,module,exports){\nmodule.exports = _dereq_(\"./dist/is-firefox\");\n\n},{\"./dist/is-firefox\":8}],26:[function(_dereq_,module,exports){\nmodule.exports = _dereq_(\"./dist/is-incognito\");\n\n},{\"./dist/is-incognito\":9}],27:[function(_dereq_,module,exports){\nmodule.exports = _dereq_(\"./dist/is-ios-safari\");\n\n},{\"./dist/is-ios-safari\":12}],28:[function(_dereq_,module,exports){\nmodule.exports = _dereq_(\"./dist/is-ios-webview\");\n\n},{\"./dist/is-ios-webview\":13}],29:[function(_dereq_,module,exports){\nmodule.exports = _dereq_(\"./dist/is-ios-wkwebview\");\n\n},{\"./dist/is-ios-wkwebview\":14}],30:[function(_dereq_,module,exports){\nmodule.exports = _dereq_(\"./dist/is-ios\");\n\n},{\"./dist/is-ios\":15}],31:[function(_dereq_,module,exports){\nmodule.exports = _dereq_(\"./dist/is-safari\");\n\n},{\"./dist/is-safari\":18}],32:[function(_dereq_,module,exports){\nmodule.exports = _dereq_(\"./dist/supports-popups\");\n\n},{\"./dist/supports-popups\":21}],33:[function(_dereq_,module,exports){\n\"use strict\";\nvar EventEmitter = /** @class */ (function () {\n    function EventEmitter() {\n        this._events = {};\n    }\n    EventEmitter.prototype.on = function (event, callback) {\n        if (this._events[event]) {\n            this._events[event].push(callback);\n        }\n        else {\n            this._events[event] = [callback];\n        }\n    };\n    EventEmitter.prototype.off = function (event, callback) {\n        var eventCallbacks = this._events[event];\n        if (!eventCallbacks) {\n            return;\n        }\n        var indexOfCallback = eventCallbacks.indexOf(callback);\n        eventCallbacks.splice(indexOfCallback, 1);\n    };\n    EventEmitter.prototype._emit = function (event) {\n        var args = [];\n        for (var _i = 1; _i < arguments.length; _i++) {\n            args[_i - 1] = arguments[_i];\n        }\n        var eventCallbacks = this._events[event];\n        if (!eventCallbacks) {\n            return;\n        }\n        eventCallbacks.forEach(function (callback) {\n            callback.apply(void 0, args);\n        });\n    };\n    EventEmitter.prototype.hasListener = function (event) {\n        var eventCallbacks = this._events[event];\n        if (!eventCallbacks) {\n            return false;\n        }\n        return eventCallbacks.length > 0;\n    };\n    EventEmitter.createChild = function (ChildObject) {\n        ChildObject.prototype = Object.create(EventEmitter.prototype, {\n            constructor: ChildObject,\n        });\n    };\n    return EventEmitter;\n}());\nmodule.exports = EventEmitter;\n\n},{}],34:[function(_dereq_,module,exports){\n\"use strict\";\nvar GlobalPromise = (typeof Promise !== \"undefined\"\n    ? Promise // eslint-disable-line no-undef\n    : null);\nvar ExtendedPromise = /** @class */ (function () {\n    function ExtendedPromise(options) {\n        var _this = this;\n        if (typeof options === \"function\") {\n            this._promise = new ExtendedPromise.Promise(options);\n            return;\n        }\n        this._promise = new ExtendedPromise.Promise(function (resolve, reject) {\n            _this._resolveFunction = resolve;\n            _this._rejectFunction = reject;\n        });\n        options = options || {};\n        this._onResolve = options.onResolve || ExtendedPromise.defaultOnResolve;\n        this._onReject = options.onReject || ExtendedPromise.defaultOnReject;\n        if (ExtendedPromise.shouldCatchExceptions(options)) {\n            this._promise.catch(function () {\n                // prevents unhandled promise rejection warning\n                // in the console for extended promises that\n                // that catch the error in an asynchronous manner\n            });\n        }\n        this._resetState();\n    }\n    ExtendedPromise.defaultOnResolve = function (result) {\n        return ExtendedPromise.Promise.resolve(result);\n    };\n    ExtendedPromise.defaultOnReject = function (err) {\n        return ExtendedPromise.Promise.reject(err);\n    };\n    ExtendedPromise.setPromise = function (PromiseClass) {\n        ExtendedPromise.Promise = PromiseClass;\n    };\n    ExtendedPromise.shouldCatchExceptions = function (options) {\n        if (options.hasOwnProperty(\"suppressUnhandledPromiseMessage\")) {\n            return Boolean(options.suppressUnhandledPromiseMessage);\n        }\n        return Boolean(ExtendedPromise.suppressUnhandledPromiseMessage);\n    };\n    // start Promise methods documented in:\n    // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise#Methods\n    ExtendedPromise.all = function (args) {\n        return ExtendedPromise.Promise.all(args);\n    };\n    ExtendedPromise.allSettled = function (args) {\n        return ExtendedPromise.Promise.allSettled(args);\n    };\n    ExtendedPromise.race = function (args) {\n        return ExtendedPromise.Promise.race(args);\n    };\n    ExtendedPromise.reject = function (arg) {\n        return ExtendedPromise.Promise.reject(arg);\n    };\n    ExtendedPromise.resolve = function (arg) {\n        return ExtendedPromise.Promise.resolve(arg);\n    };\n    ExtendedPromise.prototype.then = function () {\n        var _a;\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments[_i];\n        }\n        return (_a = this._promise).then.apply(_a, args);\n    };\n    ExtendedPromise.prototype.catch = function () {\n        var _a;\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments[_i];\n        }\n        return (_a = this._promise).catch.apply(_a, args);\n    };\n    ExtendedPromise.prototype.resolve = function (arg) {\n        var _this = this;\n        if (this.isFulfilled) {\n            return this;\n        }\n        this._setResolved();\n        ExtendedPromise.Promise.resolve()\n            .then(function () {\n            return _this._onResolve(arg);\n        })\n            .then(function (argForResolveFunction) {\n            _this._resolveFunction(argForResolveFunction);\n        })\n            .catch(function (err) {\n            _this._resetState();\n            _this.reject(err);\n        });\n        return this;\n    };\n    ExtendedPromise.prototype.reject = function (arg) {\n        var _this = this;\n        if (this.isFulfilled) {\n            return this;\n        }\n        this._setRejected();\n        ExtendedPromise.Promise.resolve()\n            .then(function () {\n            return _this._onReject(arg);\n        })\n            .then(function (result) {\n            _this._setResolved();\n            _this._resolveFunction(result);\n        })\n            .catch(function (err) {\n            return _this._rejectFunction(err);\n        });\n        return this;\n    };\n    ExtendedPromise.prototype._resetState = function () {\n        this.isFulfilled = false;\n        this.isResolved = false;\n        this.isRejected = false;\n    };\n    ExtendedPromise.prototype._setResolved = function () {\n        this.isFulfilled = true;\n        this.isResolved = true;\n        this.isRejected = false;\n    };\n    ExtendedPromise.prototype._setRejected = function () {\n        this.isFulfilled = true;\n        this.isResolved = false;\n        this.isRejected = true;\n    };\n    ExtendedPromise.Promise = GlobalPromise;\n    return ExtendedPromise;\n}());\nmodule.exports = ExtendedPromise;\n\n},{}],35:[function(_dereq_,module,exports){\n\"use strict\";\nvar set_attributes_1 = _dereq_(\"./lib/set-attributes\");\nvar default_attributes_1 = _dereq_(\"./lib/default-attributes\");\nvar assign_1 = _dereq_(\"./lib/assign\");\nmodule.exports = function createFrame(options) {\n    if (options === void 0) { options = {}; }\n    var iframe = document.createElement(\"iframe\");\n    var config = (0, assign_1.assign)({}, default_attributes_1.defaultAttributes, options);\n    if (config.style && typeof config.style !== \"string\") {\n        (0, assign_1.assign)(iframe.style, config.style);\n        delete config.style;\n    }\n    (0, set_attributes_1.setAttributes)(iframe, config);\n    if (!iframe.getAttribute(\"id\")) {\n        iframe.id = iframe.name;\n    }\n    return iframe;\n};\n\n},{\"./lib/assign\":36,\"./lib/default-attributes\":37,\"./lib/set-attributes\":38}],36:[function(_dereq_,module,exports){\n\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.assign = void 0;\nfunction assign(\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntarget) {\n    var objs = [];\n    for (var _i = 1; _i < arguments.length; _i++) {\n        objs[_i - 1] = arguments[_i];\n    }\n    objs.forEach(function (obj) {\n        if (typeof obj !== \"object\") {\n            return;\n        }\n        Object.keys(obj).forEach(function (key) {\n            target[key] = obj[key];\n        });\n    });\n    return target;\n}\nexports.assign = assign;\n\n},{}],37:[function(_dereq_,module,exports){\n\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.defaultAttributes = void 0;\nexports.defaultAttributes = {\n    src: \"about:blank\",\n    frameBorder: 0,\n    allowtransparency: true,\n    scrolling: \"no\",\n};\n\n},{}],38:[function(_dereq_,module,exports){\n\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.setAttributes = void 0;\nfunction setAttributes(element, \n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nattributes) {\n    for (var key in attributes) {\n        if (attributes.hasOwnProperty(key)) {\n            var value = attributes[key];\n            if (value == null) {\n                element.removeAttribute(key);\n            }\n            else {\n                element.setAttribute(key, value);\n            }\n        }\n    }\n}\nexports.setAttributes = setAttributes;\n\n},{}],39:[function(_dereq_,module,exports){\n\"use strict\";\n\nfunction uuid() {\n  return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, function (c) {\n    var r = (Math.random() * 16) | 0;\n    var v = c === \"x\" ? r : (r & 0x3) | 0x8;\n\n    return v.toString(16);\n  });\n}\n\nmodule.exports = uuid;\n\n},{}],40:[function(_dereq_,module,exports){\n\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nfunction deferred(fn) {\n    return function () {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments[_i];\n        }\n        setTimeout(function () {\n            try {\n                fn.apply(void 0, args);\n            }\n            catch (err) {\n                /* eslint-disable no-console */\n                console.log(\"Error in callback function\");\n                console.log(err);\n                /* eslint-enable no-console */\n            }\n        }, 1);\n    };\n}\nexports.deferred = deferred;\n\n},{}],41:[function(_dereq_,module,exports){\n\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nfunction once(fn) {\n    var called = false;\n    return function () {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments[_i];\n        }\n        if (!called) {\n            called = true;\n            fn.apply(void 0, args);\n        }\n    };\n}\nexports.once = once;\n\n},{}],42:[function(_dereq_,module,exports){\n\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/* eslint-disable consistent-return */\nfunction promiseOrCallback(promise, callback) {\n    if (!callback) {\n        return promise;\n    }\n    promise.then(function (data) { return callback(null, data); }).catch(function (err) { return callback(err); });\n}\nexports.promiseOrCallback = promiseOrCallback;\n\n},{}],43:[function(_dereq_,module,exports){\n\"use strict\";\nvar deferred_1 = _dereq_(\"./lib/deferred\");\nvar once_1 = _dereq_(\"./lib/once\");\nvar promise_or_callback_1 = _dereq_(\"./lib/promise-or-callback\");\nfunction wrapPromise(fn) {\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    return function () {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments[_i];\n        }\n        var callback;\n        var lastArg = args[args.length - 1];\n        if (typeof lastArg === \"function\") {\n            callback = args.pop();\n            callback = once_1.once(deferred_1.deferred(callback));\n        }\n        // I know, I know, this looks bad. But it's a quirk of the library that\n        // we need to allow passing the this context to the original function\n        // eslint-disable-next-line @typescript-eslint/ban-ts-ignore\n        // @ts-ignore: this has an implicit any\n        return promise_or_callback_1.promiseOrCallback(fn.apply(this, args), callback); // eslint-disable-line no-invalid-this\n    };\n}\nwrapPromise.wrapPrototype = function (target, options) {\n    if (options === void 0) { options = {}; }\n    var ignoreMethods = options.ignoreMethods || [];\n    var includePrivateMethods = options.transformPrivateMethods === true;\n    var methods = Object.getOwnPropertyNames(target.prototype).filter(function (method) {\n        var isNotPrivateMethod;\n        var isNonConstructorFunction = method !== \"constructor\" &&\n            typeof target.prototype[method] === \"function\";\n        var isNotAnIgnoredMethod = ignoreMethods.indexOf(method) === -1;\n        if (includePrivateMethods) {\n            isNotPrivateMethod = true;\n        }\n        else {\n            isNotPrivateMethod = method.charAt(0) !== \"_\";\n        }\n        return (isNonConstructorFunction && isNotPrivateMethod && isNotAnIgnoredMethod);\n    });\n    methods.forEach(function (method) {\n        var original = target.prototype[method];\n        target.prototype[method] = wrapPromise(original);\n    });\n    return target;\n};\nmodule.exports = wrapPromise;\n\n},{\"./lib/deferred\":40,\"./lib/once\":41,\"./lib/promise-or-callback\":42}],44:[function(_dereq_,module,exports){\n(function (global, factory) {\n    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n    typeof define === 'function' && define.amd ? define(['exports'], factory) :\n    (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.loadAxo = {}));\n})(this, (function (exports) { 'use strict';\n\n    /*! *****************************************************************************\r\n    Copyright (c) Microsoft Corporation.\r\n\r\n    Permission to use, copy, modify, and/or distribute this software for any\r\n    purpose with or without fee is hereby granted.\r\n\r\n    THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\n    REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\n    AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\n    INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\n    LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\n    OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\n    PERFORMANCE OF THIS SOFTWARE.\r\n    ***************************************************************************** */\r\n    /* global Reflect, Promise */\r\n\r\n\r\n    function __awaiter(thisArg, _arguments, P, generator) {\r\n        function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n        return new (P || (P = Promise))(function (resolve, reject) {\r\n            function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n            function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n            function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n            step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n        });\r\n    }\r\n\r\n    function __generator(thisArg, body) {\r\n        var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n        return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n        function verb(n) { return function (v) { return step([n, v]); }; }\r\n        function step(op) {\r\n            if (f) throw new TypeError(\"Generator is already executing.\");\r\n            while (_) try {\r\n                if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n                if (y = 0, t) op = [op[0] & 2, t.value];\r\n                switch (op[0]) {\r\n                    case 0: case 1: t = op; break;\r\n                    case 4: _.label++; return { value: op[1], done: false };\r\n                    case 5: _.label++; y = op[1]; op = [0]; continue;\r\n                    case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n                    default:\r\n                        if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n                        if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n                        if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n                        if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n                        if (t[2]) _.ops.pop();\r\n                        _.trys.pop(); continue;\r\n                }\r\n                op = body.call(thisArg, _);\r\n            } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n            if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n        }\r\n    }\n\n    var dist = {};\n\n    var scriptPromiseCache = {};\n    function loadScript$1(options) {\n        var scriptLoadPromise;\n        var stringifiedOptions = JSON.stringify(options);\n        if (!options.forceScriptReload) {\n            scriptLoadPromise = scriptPromiseCache[stringifiedOptions];\n            if (scriptLoadPromise) {\n                return scriptLoadPromise;\n            }\n        }\n        var script = document.createElement(\"script\");\n        var attrs = options.dataAttributes || {};\n        var container = options.container || document.head;\n        script.src = options.src;\n        script.id = options.id || \"\";\n        script.async = true;\n        if (options.type) {\n            script.setAttribute(\"type\", \"\".concat(options.type));\n        }\n        if (options.crossorigin) {\n            script.setAttribute(\"crossorigin\", \"\".concat(options.crossorigin));\n        }\n        Object.keys(attrs).forEach(function (key) {\n            script.setAttribute(\"data-\".concat(key), \"\".concat(attrs[key]));\n        });\n        scriptLoadPromise = new Promise(function (resolve, reject) {\n            script.addEventListener(\"load\", function () {\n                resolve(script);\n            });\n            script.addEventListener(\"error\", function () {\n                reject(new Error(\"\".concat(options.src, \" failed to load.\")));\n            });\n            script.addEventListener(\"abort\", function () {\n                reject(new Error(\"\".concat(options.src, \" has aborted.\")));\n            });\n            container.appendChild(script);\n        });\n        scriptPromiseCache[stringifiedOptions] = scriptLoadPromise;\n        return scriptLoadPromise;\n    }\n    loadScript$1.clearCache = function () {\n        scriptPromiseCache = {};\n    };\n    var loadScript_1$1 = loadScript$1;\n\n    var loadStylesheet$1 = function loadStylesheet(options) {\n        var stylesheet = document.querySelector(\"link[href=\\\"\".concat(options.href, \"\\\"]\"));\n        if (stylesheet) {\n            return Promise.resolve(stylesheet);\n        }\n        stylesheet = document.createElement(\"link\");\n        var container = options.container || document.head;\n        stylesheet.setAttribute(\"rel\", \"stylesheet\");\n        stylesheet.setAttribute(\"type\", \"text/css\");\n        stylesheet.setAttribute(\"href\", options.href);\n        stylesheet.setAttribute(\"id\", options.id);\n        if (container.firstChild) {\n            container.insertBefore(stylesheet, container.firstChild);\n        }\n        else {\n            container.appendChild(stylesheet);\n        }\n        return Promise.resolve(stylesheet);\n    };\n\n    Object.defineProperty(dist, \"__esModule\", { value: true });\n    dist.loadStylesheet = loadScript_1 = dist.loadScript = void 0;\n    var loadScript = loadScript_1$1;\n    var loadScript_1 = dist.loadScript = loadScript;\n    var loadStylesheet = loadStylesheet$1;\n    dist.loadStylesheet = loadStylesheet;\n\n    var CDNX_PROD = \"https://www.paypalobjects.com\";\n    var ASSET_NAME = {\n        minified: \"axo.min\",\n        unminified: \"axo\",\n    };\n    var FL_NAMESPACE = \"fastlane\";\n    var ASSET_PATH = \"connect-boba\";\n    var LOCALE_PATH = \"\".concat(ASSET_PATH, \"/locales/\");\n    var constants = {\n        AXO_ASSET_NAME: ASSET_NAME,\n        AXO_ASSET_PATH: ASSET_PATH,\n        LOCALE_PATH: LOCALE_PATH,\n        CDNX_PROD: CDNX_PROD,\n    };\n\n    var AxoSupportedPlatforms = {\n        BT: \"BT\",\n        PPCP: \"PPCP\",\n    };\n\n    /**\n     * Checks if the current environment is an AMD environment.\n     *\n     * @returns {boolean} True if the environment is AMD, false otherwise.\n     */\n    function isAmdEnv() {\n        return typeof window.define === \"function\" && !!window.define.amd;\n    }\n    /**\n     * Checks if the current environment is a RequireJS environment.\n     *\n     * @returns {boolean} True if the environment is RequireJS, false otherwise.\n     */\n    function isRequireJsEnv() {\n        return (isAmdEnv() &&\n            typeof window.requirejs === \"function\" &&\n            typeof window.requirejs.config === \"function\");\n    }\n\n    /**\n     * Safely loads BT modules by checking if the module already exists and verifying if versions mismatch\n     *\n     * @param loadConfig <BtModuleLoadConfig> Configuration of BT Module to load\n     * @param version <string> version that should be passed from the client getVersion\n     * @returns Promise<HTMLScriptElement>\n     * @returns Promise<true> when BT module with same version already exists\n     * @returns Promise.reject(err) when BT module already exists but versions mismatch or empty version passed in\n     */\n    function safeLoadBtModule(loadConfig, version, minified) {\n        var _a, _b;\n        if (minified === void 0) { minified = true; }\n        return __awaiter(this, void 0, void 0, function () {\n            var bt, existingVersion;\n            return __generator(this, function (_c) {\n                bt = getBraintree();\n                if (bt && bt[loadConfig.module]) {\n                    if (version && ((_a = bt[loadConfig.module]) === null || _a === void 0 ? void 0 : _a.VERSION) !== version) {\n                        existingVersion = (_b = bt[loadConfig.module]) === null || _b === void 0 ? void 0 : _b.VERSION;\n                        throw new Error(\"\".concat(loadConfig.module, \" already loaded with version \").concat(existingVersion, \" cannot load version \").concat(version));\n                    }\n                    else {\n                        return [2 /*return*/, true];\n                    }\n                }\n                if (!version) {\n                    throw new Error(\"Attempted to load \".concat(loadConfig.module, \" without specifying version\"));\n                }\n                return [2 /*return*/, loadBtModule(loadConfig, version, minified)];\n            });\n        });\n    }\n    /**\n     * Reads the version and to load the correct version of Bt module\n     *\n     * @param loadConfig <BtModuleLoadConfig> Configuration of BT Module to load\n     * @param version <string> Bt module version\n     * @returns Promise<HTMLScriptElement> or\n     */\n    function loadBtModule(loadConfig, version, minified) {\n        if (minified === void 0) { minified = true; }\n        if (isAmdEnv()) {\n            var module_1 = minified\n                ? loadConfig.amdModule.minified\n                : loadConfig.amdModule.unminified;\n            return new Promise(function (resolve, reject) {\n                // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n                // @ts-ignore\n                window.require([module_1], resolve, reject);\n            });\n        }\n        var script = minified\n            ? loadConfig.script.minified\n            : loadConfig.script.unminified;\n        return loadScript_1({\n            id: \"\".concat(loadConfig.id, \"-\").concat(version),\n            src: \"https://js.braintreegateway.com/web/\".concat(version, \"/js/\").concat(script),\n        });\n    }\n    /**\n     * Looks for the Braintree web sdk on the window object\n     *\n     * @returns Braintree web sdk\n     */\n    function getBraintree() {\n        return window === null || window === void 0 ? void 0 : window.braintree;\n    }\n\n    var _a, _b;\n    /**\n     * Maps to the BT module namespace created on the window.braintree object\n     */\n    var BtModule = {\n        Client: \"client\",\n        HostedCardFields: \"hostedFields\",\n    };\n    var BT_NAMESPACE = \"braintree\";\n    var BT_ASSET_NAME = (_a = {},\n        _a[BtModule.Client] = \"client\",\n        _a[BtModule.HostedCardFields] = \"hosted-fields\",\n        _a);\n    var btModulesLoadConfig = (_b = {},\n        _b[BtModule.Client] = {\n            id: \"client\",\n            module: BtModule.Client,\n            amdModule: {\n                unminified: \"\".concat(BT_NAMESPACE, \"/\").concat(BT_ASSET_NAME[BtModule.Client]),\n                minified: \"\".concat(BT_NAMESPACE, \"/\").concat(BT_ASSET_NAME[BtModule.Client], \".min\"),\n            },\n            script: {\n                unminified: \"\".concat(BT_ASSET_NAME[BtModule.Client], \".js\"),\n                minified: \"\".concat(BT_ASSET_NAME[BtModule.Client], \".min.js\"),\n            },\n        },\n        _b[BtModule.HostedCardFields] = {\n            id: \"hcf\",\n            module: BtModule.HostedCardFields,\n            amdModule: {\n                unminified: \"\".concat(BT_NAMESPACE, \"/\").concat(BT_ASSET_NAME[BtModule.HostedCardFields]),\n                minified: \"\".concat(BT_NAMESPACE, \"/\").concat(BT_ASSET_NAME[BtModule.HostedCardFields], \".min\"),\n            },\n            script: {\n                unminified: \"\".concat(BT_ASSET_NAME[BtModule.HostedCardFields], \".js\"),\n                minified: \"\".concat(BT_ASSET_NAME[BtModule.HostedCardFields], \".min.js\"),\n            },\n        },\n        _b);\n\n    /**\n     * Loads accelerated checkout components.\n     * @param options object with a minified parameter to determine if the script that is loaded should be minified or not (defaults to true if)\n     * @returns an object with metadata with a localeUrl parameter to be read by AXO SDK\n     */\n    function loadAxo(options) {\n        return __awaiter(this, void 0, void 0, function () {\n            var btSdkVersion, minified, assetUrl, localeUrl;\n            return __generator(this, function (_a) {\n                switch (_a.label) {\n                    case 0:\n                        performance.mark(\"pp_axo_sdk_init_invoked\");\n                        btSdkVersion = options.btSdkVersion, minified = options.minified;\n                        assetUrl = getAssetsUrl(options);\n                        localeUrl = getLocaleUrl(options);\n                        if (!(options.platform === AxoSupportedPlatforms.BT)) return [3 /*break*/, 2];\n                        return [4 /*yield*/, Promise.all([\n                                safeLoadBtModule(btModulesLoadConfig.hostedFields, btSdkVersion, minified),\n                                loadAXOScript(assetUrl, minified),\n                            ])];\n                    case 1:\n                        _a.sent();\n                        return [3 /*break*/, 5];\n                    case 2:\n                        if (!(options.platform === AxoSupportedPlatforms.PPCP)) return [3 /*break*/, 4];\n                        return [4 /*yield*/, Promise.all([\n                                safeLoadBtModule(btModulesLoadConfig.client, btSdkVersion, minified),\n                                safeLoadBtModule(btModulesLoadConfig.hostedFields, btSdkVersion, minified),\n                                loadAXOScript(assetUrl, minified),\n                            ])];\n                    case 3:\n                        _a.sent();\n                        return [3 /*break*/, 5];\n                    case 4: throw new Error(\"unsupported axo platform\");\n                    case 5: return [2 /*return*/, { metadata: { localeUrl: localeUrl } }];\n                }\n            });\n        });\n    }\n    /**\n     * Reads the url and to load the axo bundle script\n     * @param url (Required) string url for the correct axo asset\n     * @returns Promise<HTMLScriptElement>\n     */\n    function loadAXOScript(url, minified) {\n        var _a;\n        if (minified === void 0) { minified = true; }\n        if (isAmdEnv()) {\n            // AMD environment\n            if (isRequireJsEnv()) {\n                // Let's configure RequireJS\n                requirejs.config({\n                    paths: (_a = {},\n                        _a[FL_NAMESPACE] = url,\n                        _a),\n                });\n            }\n            var moduleName_1 = \"\".concat(FL_NAMESPACE, \"/\").concat(minified\n                ? constants.AXO_ASSET_NAME.minified\n                : constants.AXO_ASSET_NAME.unminified);\n            return new Promise(function (resolve, reject) {\n                window.require([moduleName_1], resolve, reject);\n            });\n        }\n        // Not an AMD environment\n        return loadScript_1({\n            id: \"axo-id\",\n            src: url,\n            forceScriptReload: true,\n        });\n    }\n    /**\n     * Prepends the domain to the asset url\n     * @param options object with assetUrl and bundleid parameters to determine which URL to return\n     * @returns full domain and assets URL as string\n     */\n    function generateAssetUrl(_a) {\n        var assetUrl = _a.assetUrl, bundleId = _a.bundleId;\n        return bundleId\n            ? \"https://cdn-\".concat(bundleId, \".static.engineering.dev.paypalinc.com/\").concat(assetUrl)\n            : \"\".concat(constants.CDNX_PROD, \"/\").concat(assetUrl);\n    }\n    /**\n     * Retrieves either the minified or unminified assets URL as specified\n     * @param options (Optional) object with a minified and metadata with bundleIdOverride parameters to determine which URL to return\n     * @returns assets URL as string\n     */\n    function getAssetsUrl(options) {\n        var _a;\n        var assetName = (options === null || options === void 0 ? void 0 : options.minified) !== false\n            ? constants.AXO_ASSET_NAME.minified\n            : constants.AXO_ASSET_NAME.unminified;\n        var assetUrl = isAmdEnv()\n            ? constants.AXO_ASSET_PATH\n            : \"\".concat(constants.AXO_ASSET_PATH, \"/\").concat(assetName, \".js\");\n        return generateAssetUrl({\n            assetUrl: assetUrl,\n            bundleId: (_a = options === null || options === void 0 ? void 0 : options.metadata) === null || _a === void 0 ? void 0 : _a.bundleIdOverride,\n        });\n    }\n    /**\n     * Retrieves the Locales URL, the path to our language files\n     * @param options (Optional) object with a minified and metadata with bundleIdOverride parameters to determine which URL to return\n     * @returns locale URL as string\n     */\n    function getLocaleUrl(options) {\n        var _a;\n        return generateAssetUrl({\n            assetUrl: constants.LOCALE_PATH,\n            bundleId: (_a = options === null || options === void 0 ? void 0 : options.metadata) === null || _a === void 0 ? void 0 : _a.bundleIdOverride,\n        });\n    }\n\n    exports.constants = constants;\n    exports.loadAxo = loadAxo;\n\n}));\n\n},{}],45:[function(_dereq_,module,exports){\n\"use strict\";\nvar __assign = (this && this.__assign) || function () {\n    __assign = Object.assign || function(t) {\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\n            s = arguments[i];\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n                t[p] = s[p];\n        }\n        return t;\n    };\n    return __assign.apply(this, arguments);\n};\nvar cardTypes = _dereq_(\"./lib/card-types\");\nvar add_matching_cards_to_results_1 = _dereq_(\"./lib/add-matching-cards-to-results\");\nvar is_valid_input_type_1 = _dereq_(\"./lib/is-valid-input-type\");\nvar find_best_match_1 = _dereq_(\"./lib/find-best-match\");\nvar clone_1 = _dereq_(\"./lib/clone\");\nvar customCards = {};\nvar cardNames = {\n    VISA: \"visa\",\n    MASTERCARD: \"mastercard\",\n    AMERICAN_EXPRESS: \"american-express\",\n    DINERS_CLUB: \"diners-club\",\n    DISCOVER: \"discover\",\n    JCB: \"jcb\",\n    UNIONPAY: \"unionpay\",\n    VERVE: \"verve\",\n    MAESTRO: \"maestro\",\n    ELO: \"elo\",\n    MIR: \"mir\",\n    HIPER: \"hiper\",\n    HIPERCARD: \"hipercard\",\n};\nvar ORIGINAL_TEST_ORDER = [\n    cardNames.VISA,\n    cardNames.MASTERCARD,\n    cardNames.AMERICAN_EXPRESS,\n    cardNames.DINERS_CLUB,\n    cardNames.DISCOVER,\n    cardNames.JCB,\n    cardNames.UNIONPAY,\n    cardNames.VERVE,\n    cardNames.MAESTRO,\n    cardNames.ELO,\n    cardNames.MIR,\n    cardNames.HIPER,\n    cardNames.HIPERCARD,\n];\nvar testOrder = (0, clone_1.clone)(ORIGINAL_TEST_ORDER);\nfunction findType(cardType) {\n    return customCards[cardType] || cardTypes[cardType];\n}\nfunction getAllCardTypes() {\n    return testOrder.map(function (cardType) { return (0, clone_1.clone)(findType(cardType)); });\n}\nfunction getCardPosition(name, ignoreErrorForNotExisting) {\n    if (ignoreErrorForNotExisting === void 0) { ignoreErrorForNotExisting = false; }\n    var position = testOrder.indexOf(name);\n    if (!ignoreErrorForNotExisting && position === -1) {\n        throw new Error('\"' + name + '\" is not a supported card type.');\n    }\n    return position;\n}\nfunction creditCardType(cardNumber) {\n    var results = [];\n    if (!(0, is_valid_input_type_1.isValidInputType)(cardNumber)) {\n        return results;\n    }\n    if (cardNumber.length === 0) {\n        return getAllCardTypes();\n    }\n    testOrder.forEach(function (cardType) {\n        var cardConfiguration = findType(cardType);\n        (0, add_matching_cards_to_results_1.addMatchingCardsToResults)(cardNumber, cardConfiguration, results);\n    });\n    var bestMatch = (0, find_best_match_1.findBestMatch)(results);\n    if (bestMatch) {\n        return [bestMatch];\n    }\n    return results;\n}\ncreditCardType.getTypeInfo = function (cardType) {\n    return (0, clone_1.clone)(findType(cardType));\n};\ncreditCardType.removeCard = function (name) {\n    var position = getCardPosition(name);\n    testOrder.splice(position, 1);\n};\ncreditCardType.addCard = function (config) {\n    var existingCardPosition = getCardPosition(config.type, true);\n    customCards[config.type] = config;\n    if (existingCardPosition === -1) {\n        testOrder.push(config.type);\n    }\n};\ncreditCardType.updateCard = function (cardType, updates) {\n    var originalObject = customCards[cardType] || cardTypes[cardType];\n    if (!originalObject) {\n        throw new Error(\"\\\"\".concat(cardType, \"\\\" is not a recognized type. Use `addCard` instead.'\"));\n    }\n    if (updates.type && originalObject.type !== updates.type) {\n        throw new Error(\"Cannot overwrite type parameter.\");\n    }\n    var clonedCard = (0, clone_1.clone)(originalObject);\n    clonedCard = __assign(__assign({}, clonedCard), updates);\n    customCards[clonedCard.type] = clonedCard;\n};\ncreditCardType.changeOrder = function (name, position) {\n    var currentPosition = getCardPosition(name);\n    testOrder.splice(currentPosition, 1);\n    testOrder.splice(position, 0, name);\n};\ncreditCardType.resetModifications = function () {\n    testOrder = (0, clone_1.clone)(ORIGINAL_TEST_ORDER);\n    customCards = {};\n};\ncreditCardType.types = cardNames;\nmodule.exports = creditCardType;\n\n},{\"./lib/add-matching-cards-to-results\":46,\"./lib/card-types\":47,\"./lib/clone\":48,\"./lib/find-best-match\":49,\"./lib/is-valid-input-type\":50}],46:[function(_dereq_,module,exports){\n\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.addMatchingCardsToResults = void 0;\nvar clone_1 = _dereq_(\"./clone\");\nvar matches_1 = _dereq_(\"./matches\");\nfunction addMatchingCardsToResults(cardNumber, cardConfiguration, results) {\n    var i, patternLength;\n    for (i = 0; i < cardConfiguration.patterns.length; i++) {\n        var pattern = cardConfiguration.patterns[i];\n        if (!(0, matches_1.matches)(cardNumber, pattern)) {\n            continue;\n        }\n        var clonedCardConfiguration = (0, clone_1.clone)(cardConfiguration);\n        if (Array.isArray(pattern)) {\n            patternLength = String(pattern[0]).length;\n        }\n        else {\n            patternLength = String(pattern).length;\n        }\n        if (cardNumber.length >= patternLength) {\n            clonedCardConfiguration.matchStrength = patternLength;\n        }\n        results.push(clonedCardConfiguration);\n        break;\n    }\n}\nexports.addMatchingCardsToResults = addMatchingCardsToResults;\n\n},{\"./clone\":48,\"./matches\":51}],47:[function(_dereq_,module,exports){\n\"use strict\";\nvar cardTypes = {\n    visa: {\n        niceType: \"Visa\",\n        type: \"visa\",\n        patterns: [4],\n        gaps: [4, 8, 12],\n        lengths: [16, 18, 19],\n        code: {\n            name: \"CVV\",\n            size: 3,\n        },\n    },\n    mastercard: {\n        niceType: \"Mastercard\",\n        type: \"mastercard\",\n        patterns: [[51, 55], [2221, 2229], [223, 229], [23, 26], [270, 271], 2720],\n        gaps: [4, 8, 12],\n        lengths: [16],\n        code: {\n            name: \"CVC\",\n            size: 3,\n        },\n    },\n    \"american-express\": {\n        niceType: \"American Express\",\n        type: \"american-express\",\n        patterns: [34, 37],\n        gaps: [4, 10],\n        lengths: [15],\n        code: {\n            name: \"CID\",\n            size: 4,\n        },\n    },\n    \"diners-club\": {\n        niceType: \"Diners Club\",\n        type: \"diners-club\",\n        patterns: [[300, 305], 36, 38, 39],\n        gaps: [4, 10],\n        lengths: [14, 16, 19],\n        code: {\n            name: \"CVV\",\n            size: 3,\n        },\n    },\n    discover: {\n        niceType: \"Discover\",\n        type: \"discover\",\n        patterns: [6011, [644, 649], 65],\n        gaps: [4, 8, 12],\n        lengths: [16, 19],\n        code: {\n            name: \"CID\",\n            size: 3,\n        },\n    },\n    jcb: {\n        niceType: \"JCB\",\n        type: \"jcb\",\n        patterns: [2131, 1800, [3528, 3589]],\n        gaps: [4, 8, 12],\n        lengths: [16, 17, 18, 19],\n        code: {\n            name: \"CVV\",\n            size: 3,\n        },\n    },\n    unionpay: {\n        niceType: \"UnionPay\",\n        type: \"unionpay\",\n        patterns: [\n            620,\n            [62100, 62182],\n            [62184, 62187],\n            [62185, 62197],\n            [62200, 62205],\n            [622010, 622999],\n            622018,\n            [62207, 62209],\n            [623, 626],\n            6270,\n            6272,\n            6276,\n            [627700, 627779],\n            [627781, 627799],\n            [6282, 6289],\n            6291,\n            6292,\n            810,\n            [8110, 8131],\n            [8132, 8151],\n            [8152, 8163],\n            [8164, 8171],\n        ],\n        gaps: [4, 8, 12],\n        lengths: [14, 15, 16, 17, 18, 19],\n        code: {\n            name: \"CVN\",\n            size: 3,\n        },\n    },\n    maestro: {\n        niceType: \"Maestro\",\n        type: \"maestro\",\n        patterns: [\n            493698,\n            [500000, 504174],\n            [504176, 506698],\n            [506779, 508999],\n            [56, 59],\n            63,\n            67,\n            6,\n        ],\n        gaps: [4, 8, 12],\n        lengths: [12, 13, 14, 15, 16, 17, 18, 19],\n        code: {\n            name: \"CVC\",\n            size: 3,\n        },\n    },\n    elo: {\n        niceType: \"Elo\",\n        type: \"elo\",\n        patterns: [\n            401178,\n            401179,\n            438935,\n            457631,\n            457632,\n            431274,\n            451416,\n            457393,\n            504175,\n            [506699, 506778],\n            [509000, 509999],\n            627780,\n            636297,\n            636368,\n            [650031, 650033],\n            [650035, 650051],\n            [650405, 650439],\n            [650485, 650538],\n            [650541, 650598],\n            [650700, 650718],\n            [650720, 650727],\n            [650901, 650978],\n            [651652, 651679],\n            [655000, 655019],\n            [655021, 655058],\n        ],\n        gaps: [4, 8, 12],\n        lengths: [16],\n        code: {\n            name: \"CVE\",\n            size: 3,\n        },\n    },\n    mir: {\n        niceType: \"Mir\",\n        type: \"mir\",\n        patterns: [[2200, 2204]],\n        gaps: [4, 8, 12],\n        lengths: [16, 17, 18, 19],\n        code: {\n            name: \"CVP2\",\n            size: 3,\n        },\n    },\n    hiper: {\n        niceType: \"Hiper\",\n        type: \"hiper\",\n        patterns: [637095, 63737423, 63743358, 637568, 637599, 637609, 637612],\n        gaps: [4, 8, 12],\n        lengths: [16],\n        code: {\n            name: \"CVC\",\n            size: 3,\n        },\n    },\n    hipercard: {\n        niceType: \"Hipercard\",\n        type: \"hipercard\",\n        patterns: [606282],\n        gaps: [4, 8, 12],\n        lengths: [16],\n        code: {\n            name: \"CVC\",\n            size: 3,\n        },\n    },\n    verve: {\n        niceType: \"Verve\",\n        type: \"verve\",\n        patterns: [\n            [506099, 506127],\n            506129,\n            [506133, 506150],\n            [506158, 506163],\n            506166,\n            506168,\n            506170,\n            506173,\n            [506176, 506180],\n            506184,\n            [506187, 506188],\n            506191,\n            506195,\n            506197,\n            507865,\n            507866,\n            [507868, 507877],\n            [507880, 507888],\n            507900,\n            507941,\n        ],\n        gaps: [4, 8, 12],\n        lengths: [16, 18, 19],\n        code: {\n            name: \"CVV\",\n            size: 3,\n        },\n    },\n};\nmodule.exports = cardTypes;\n\n},{}],48:[function(_dereq_,module,exports){\n\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.clone = void 0;\nfunction clone(originalObject) {\n    if (!originalObject) {\n        return null;\n    }\n    return JSON.parse(JSON.stringify(originalObject));\n}\nexports.clone = clone;\n\n},{}],49:[function(_dereq_,module,exports){\n\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.findBestMatch = void 0;\nfunction hasEnoughResultsToDetermineBestMatch(results) {\n    var numberOfResultsWithMaxStrengthProperty = results.filter(function (result) { return result.matchStrength; }).length;\n    /*\n     * if all possible results have a maxStrength property that means the card\n     * number is sufficiently long enough to determine conclusively what the card\n     * type is\n     * */\n    return (numberOfResultsWithMaxStrengthProperty > 0 &&\n        numberOfResultsWithMaxStrengthProperty === results.length);\n}\nfunction findBestMatch(results) {\n    if (!hasEnoughResultsToDetermineBestMatch(results)) {\n        return null;\n    }\n    return results.reduce(function (bestMatch, result) {\n        if (!bestMatch) {\n            return result;\n        }\n        /*\n         * If the current best match pattern is less specific than this result, set\n         * the result as the new best match\n         * */\n        if (Number(bestMatch.matchStrength) < Number(result.matchStrength)) {\n            return result;\n        }\n        return bestMatch;\n    });\n}\nexports.findBestMatch = findBestMatch;\n\n},{}],50:[function(_dereq_,module,exports){\n\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isValidInputType = void 0;\nfunction isValidInputType(cardNumber) {\n    return typeof cardNumber === \"string\" || cardNumber instanceof String;\n}\nexports.isValidInputType = isValidInputType;\n\n},{}],51:[function(_dereq_,module,exports){\n\"use strict\";\n/*\n * Adapted from https://github.com/polvo-labs/card-type/blob/aaab11f80fa1939bccc8f24905a06ae3cd864356/src/cardType.js#L37-L42\n * */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.matches = void 0;\nfunction matchesRange(cardNumber, min, max) {\n    var maxLengthToCheck = String(min).length;\n    var substr = cardNumber.substr(0, maxLengthToCheck);\n    var integerRepresentationOfCardNumber = parseInt(substr, 10);\n    min = parseInt(String(min).substr(0, substr.length), 10);\n    max = parseInt(String(max).substr(0, substr.length), 10);\n    return (integerRepresentationOfCardNumber >= min &&\n        integerRepresentationOfCardNumber <= max);\n}\nfunction matchesPattern(cardNumber, pattern) {\n    pattern = String(pattern);\n    return (pattern.substring(0, cardNumber.length) ===\n        cardNumber.substring(0, pattern.length));\n}\nfunction matches(cardNumber, pattern) {\n    if (Array.isArray(pattern)) {\n        return matchesRange(cardNumber, pattern[0], pattern[1]);\n    }\n    return matchesPattern(cardNumber, pattern);\n}\nexports.matches = matches;\n\n},{}],52:[function(_dereq_,module,exports){\n\"use strict\";\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n    return new (P || (P = Promise))(function (resolve, reject) {\n        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n        function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\n    });\n};\nvar __generator = (this && this.__generator) || function (thisArg, body) {\n    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\n    return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n    function verb(n) { return function (v) { return step([n, v]); }; }\n    function step(op) {\n        if (f) throw new TypeError(\"Generator is already executing.\");\n        while (g && (g = 0, op[0] && (_ = 0)), _) try {\n            if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n            if (y = 0, t) op = [op[0] & 2, t.value];\n            switch (op[0]) {\n                case 0: case 1: t = op; break;\n                case 4: _.label++; return { value: op[1], done: false };\n                case 5: _.label++; y = op[1]; op = [0]; continue;\n                case 7: op = _.ops.pop(); _.trys.pop(); continue;\n                default:\n                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n                    if (t[2]) _.ops.pop();\n                    _.trys.pop(); continue;\n            }\n            op = body.call(thisArg, _);\n        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n    }\n};\nexports.__esModule = true;\nexports.detectIncognito = void 0;\nfunction detectIncognito() {\n    return __awaiter(this, void 0, void 0, function () {\n        return __generator(this, function (_a) {\n            switch (_a.label) {\n                case 0: return [4 /*yield*/, new Promise(function (resolve, reject) {\n                        var browserName = 'Unknown';\n                        var callbackSettled = false;\n                        function __callback(isPrivate) {\n                            if (callbackSettled) {\n                                return;\n                            }\n                            callbackSettled = true;\n                            resolve({\n                                isPrivate: isPrivate,\n                                browserName: browserName\n                            });\n                        }\n                        function identifyChromium() {\n                            var ua = navigator.userAgent;\n                            if (ua.match(/Chrome/)) {\n                                if (navigator.brave !== undefined) {\n                                    return 'Brave';\n                                }\n                                else if (ua.match(/Edg/)) {\n                                    return 'Edge';\n                                }\n                                else if (ua.match(/OPR/)) {\n                                    return 'Opera';\n                                }\n                                return 'Chrome';\n                            }\n                            else {\n                                return 'Chromium';\n                            }\n                        }\n                        function assertEvalToString(value) {\n                            try {\n                                return value === eval.toString().length;\n                            }\n                            catch (e) {\n                                return false;\n                            }\n                        }\n                        function feid() {\n                            var toFixedEngineID = 0;\n                            var neg = parseInt(\"-1\");\n                            try {\n                                neg.toFixed(neg);\n                            }\n                            catch (e) {\n                                toFixedEngineID = e.message.length;\n                            }\n                            return toFixedEngineID;\n                        }\n                        function isSafari() {\n                            return feid() === 44;\n                        }\n                        function isChrome() {\n                            return feid() === 51;\n                        }\n                        function isFirefox() {\n                            return feid() === 25;\n                        }\n                        function isMSIE() {\n                            return (navigator.msSaveBlob !== undefined && assertEvalToString(39));\n                        }\n                        /**\n                         * Safari (Safari for iOS & macOS)\n                         **/\n                        function currentSafariTest() {\n                            var _a;\n                            return __awaiter(this, void 0, void 0, function () {\n                                var e_1, message, matchesExpectedError;\n                                return __generator(this, function (_b) {\n                                    switch (_b.label) {\n                                        case 0:\n                                            _b.trys.push([0, 2, , 3]);\n                                            return [4 /*yield*/, navigator.storage.getDirectory()];\n                                        case 1:\n                                            _b.sent();\n                                            __callback(false);\n                                            return [3 /*break*/, 3];\n                                        case 2:\n                                            e_1 = _b.sent();\n                                            message = e_1;\n                                            if (e_1 instanceof Error) {\n                                                message = (_a = e_1.message) !== null && _a !== void 0 ? _a : e_1;\n                                            }\n                                            if (typeof message !== 'string') {\n                                                __callback(false);\n                                                return [2 /*return*/];\n                                            }\n                                            matchesExpectedError = message.includes('unknown transient reason');\n                                            if (matchesExpectedError) {\n                                                __callback(true);\n                                            }\n                                            else {\n                                                __callback(false);\n                                            }\n                                            return [3 /*break*/, 3];\n                                        case 3: return [2 /*return*/];\n                                    }\n                                });\n                            });\n                        }\n                        function safari13to18Test() {\n                            var tmp = String(Math.random());\n                            try {\n                                var dbReq = indexedDB.open(tmp, 1);\n                                dbReq.onupgradeneeded = function (ev) {\n                                    var db = ev.target.result;\n                                    var finish = function (priv) { __callback(priv); };\n                                    try {\n                                        db.createObjectStore('t', { autoIncrement: true }).put(new Blob());\n                                        finish(false);\n                                    }\n                                    catch (err) {\n                                        var msg = err.message || '';\n                                        if (msg.includes('are not yet supported'))\n                                            finish(true);\n                                        else\n                                            finish(false);\n                                    }\n                                    finally {\n                                        db.close();\n                                        indexedDB.deleteDatabase(tmp);\n                                    }\n                                };\n                                dbReq.onerror = function () { return __callback(false); };\n                            }\n                            catch (_a) {\n                                __callback(false);\n                            }\n                        }\n                        function oldSafariTest() {\n                            var openDB = window.openDatabase;\n                            var storage = window.localStorage;\n                            try {\n                                openDB(null, null, null, null);\n                            }\n                            catch (e) {\n                                __callback(true);\n                                return;\n                            }\n                            try {\n                                storage.setItem('test', '1');\n                                storage.removeItem('test');\n                            }\n                            catch (e) {\n                                __callback(true);\n                                return;\n                            }\n                            __callback(false);\n                        }\n                        function safariPrivateTest() {\n                            var _a;\n                            return __awaiter(this, void 0, void 0, function () {\n                                return __generator(this, function (_b) {\n                                    switch (_b.label) {\n                                        case 0:\n                                            if (!(((_a = navigator.storage) === null || _a === void 0 ? void 0 : _a.getDirectory) !== undefined)) return [3 /*break*/, 2];\n                                            return [4 /*yield*/, currentSafariTest()];\n                                        case 1:\n                                            _b.sent();\n                                            return [3 /*break*/, 3];\n                                        case 2:\n                                            if (navigator.maxTouchPoints !== undefined) {\n                                                safari13to18Test();\n                                            }\n                                            else {\n                                                oldSafariTest();\n                                            }\n                                            _b.label = 3;\n                                        case 3: return [2 /*return*/];\n                                    }\n                                });\n                            });\n                        }\n                        /**\n                         * Chrome\n                         **/\n                        function getQuotaLimit() {\n                            var w = window;\n                            if (w.performance !== undefined &&\n                                w.performance.memory !== undefined &&\n                                w.performance.memory.jsHeapSizeLimit !== undefined) {\n                                return performance.memory.jsHeapSizeLimit;\n                            }\n                            return 1073741824;\n                        }\n                        // >= 76\n                        function storageQuotaChromePrivateTest() {\n                            navigator.webkitTemporaryStorage.queryUsageAndQuota(function (_, quota) {\n                                var quotaInMib = Math.round(quota / (1024 * 1024));\n                                var quotaLimitInMib = Math.round(getQuotaLimit() / (1024 * 1024)) * 2;\n                                __callback(quotaInMib < quotaLimitInMib);\n                            }, function (e) {\n                                reject(new Error('detectIncognito somehow failed to query storage quota: ' +\n                                    e.message));\n                            });\n                        }\n                        // 50 to 75\n                        function oldChromePrivateTest() {\n                            var fs = window.webkitRequestFileSystem;\n                            var success = function () {\n                                __callback(false);\n                            };\n                            var error = function () {\n                                __callback(true);\n                            };\n                            fs(0, 1, success, error);\n                        }\n                        function chromePrivateTest() {\n                            if (self.Promise !== undefined && self.Promise.allSettled !== undefined) {\n                                storageQuotaChromePrivateTest();\n                            }\n                            else {\n                                oldChromePrivateTest();\n                            }\n                        }\n                        /**\n                         * Firefox\n                         **/\n                        function firefoxPrivateTest() {\n                            return __awaiter(this, void 0, void 0, function () {\n                                var e_2, message, matchesExpectedError;\n                                return __generator(this, function (_a) {\n                                    switch (_a.label) {\n                                        case 0:\n                                            if (!(navigator.storage && navigator.storage.getDirectory)) return [3 /*break*/, 4];\n                                            _a.label = 1;\n                                        case 1:\n                                            _a.trys.push([1, 3, , 4]);\n                                            return [4 /*yield*/, navigator.storage.getDirectory()];\n                                        case 2:\n                                            _a.sent();\n                                            __callback(false);\n                                            return [3 /*break*/, 4];\n                                        case 3:\n                                            e_2 = _a.sent();\n                                            message = (e_2 instanceof Error && typeof e_2.message === 'string') ? e_2.message : String(e_2);\n                                            if (typeof message !== 'string') {\n                                                __callback(false);\n                                                return [2 /*return*/];\n                                            }\n                                            matchesExpectedError = message.includes('Security error');\n                                            __callback(matchesExpectedError);\n                                            return [2 /*return*/];\n                                        case 4:\n                                            __callback(navigator.serviceWorker === undefined);\n                                            return [2 /*return*/];\n                                    }\n                                });\n                            });\n                        }\n                        /**\n                         * MSIE\n                         **/\n                        function msiePrivateTest() {\n                            __callback(window.indexedDB === undefined);\n                        }\n                        function main() {\n                            return __awaiter(this, void 0, void 0, function () {\n                                return __generator(this, function (_a) {\n                                    switch (_a.label) {\n                                        case 0:\n                                            if (!isSafari()) return [3 /*break*/, 2];\n                                            browserName = 'Safari';\n                                            return [4 /*yield*/, safariPrivateTest()];\n                                        case 1:\n                                            _a.sent();\n                                            return [3 /*break*/, 6];\n                                        case 2:\n                                            if (!isChrome()) return [3 /*break*/, 3];\n                                            browserName = identifyChromium();\n                                            chromePrivateTest();\n                                            return [3 /*break*/, 6];\n                                        case 3:\n                                            if (!isFirefox()) return [3 /*break*/, 5];\n                                            browserName = 'Firefox';\n                                            return [4 /*yield*/, firefoxPrivateTest()];\n                                        case 4:\n                                            _a.sent();\n                                            return [3 /*break*/, 6];\n                                        case 5:\n                                            if (isMSIE()) {\n                                                browserName = 'Internet Explorer';\n                                                msiePrivateTest();\n                                            }\n                                            else {\n                                                reject(new Error('detectIncognito cannot determine the browser'));\n                                            }\n                                            _a.label = 6;\n                                        case 6: return [2 /*return*/];\n                                    }\n                                });\n                            });\n                        }\n                        main()[\"catch\"](reject);\n                    })];\n                case 1: return [2 /*return*/, _a.sent()];\n            }\n        });\n    });\n}\nexports.detectIncognito = detectIncognito;\nif (typeof window !== 'undefined') {\n    window.detectIncognito = detectIncognito;\n}\nexports[\"default\"] = detectIncognito;\n\n},{}],53:[function(_dereq_,module,exports){\n\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Framebus = void 0;\nvar lib_1 = _dereq_(\"./lib\");\nvar DefaultPromise = (typeof window !== \"undefined\" &&\n    window.Promise);\nvar Framebus = /** @class */ (function () {\n    function Framebus(options) {\n        if (options === void 0) { options = {}; }\n        this.origin = options.origin || \"*\";\n        this.channel = options.channel || \"\";\n        this.verifyDomain = options.verifyDomain;\n        // if a targetFrames configuration is not passed in,\n        // the default behavior is to broadcast the payload\n        // to the top level window or to the frame itself.\n        // By default, the broadcast function will loop through\n        // all the known siblings and children of the window.\n        // If a targetFrames array is passed, it will instead\n        // only broadcast to those specified targetFrames\n        this.targetFrames = options.targetFrames || [];\n        this.limitBroadcastToFramesArray = Boolean(options.targetFrames);\n        this.isDestroyed = false;\n        this.listeners = [];\n        this.hasAdditionalChecksForOnListeners = Boolean(this.verifyDomain || this.limitBroadcastToFramesArray);\n    }\n    Framebus.setPromise = function (PromiseGlobal) {\n        Framebus.Promise = PromiseGlobal;\n    };\n    Framebus.target = function (options) {\n        return new Framebus(options);\n    };\n    Framebus.prototype.addTargetFrame = function (frame) {\n        if (!this.limitBroadcastToFramesArray) {\n            return;\n        }\n        this.targetFrames.push(frame);\n    };\n    Framebus.prototype.include = function (childWindow) {\n        if (childWindow == null) {\n            return false;\n        }\n        if (childWindow.Window == null) {\n            return false;\n        }\n        if (childWindow.constructor !== childWindow.Window) {\n            return false;\n        }\n        lib_1.childWindows.push(childWindow);\n        return true;\n    };\n    Framebus.prototype.target = function (options) {\n        return Framebus.target(options);\n    };\n    Framebus.prototype.emit = function (eventName, data, reply) {\n        if (this.isDestroyed) {\n            return false;\n        }\n        var origin = this.origin;\n        eventName = this.namespaceEvent(eventName);\n        if ((0, lib_1.isntString)(eventName)) {\n            return false;\n        }\n        if ((0, lib_1.isntString)(origin)) {\n            return false;\n        }\n        if (typeof data === \"function\") {\n            reply = data;\n            data = undefined; // eslint-disable-line no-undefined\n        }\n        var payload = (0, lib_1.packagePayload)(eventName, origin, data, reply);\n        if (!payload) {\n            return false;\n        }\n        if (this.limitBroadcastToFramesArray) {\n            this.targetFramesAsWindows().forEach(function (frame) {\n                (0, lib_1.sendMessage)(frame, payload, origin);\n            });\n        }\n        else {\n            (0, lib_1.broadcast)(payload, {\n                origin: origin,\n                frame: window.top || window.self,\n            });\n        }\n        return true;\n    };\n    Framebus.prototype.emitAsPromise = function (eventName, data) {\n        var _this = this;\n        return new Framebus.Promise(function (resolve, reject) {\n            var didAttachListener = _this.emit(eventName, data, function (payload) {\n                resolve(payload);\n            });\n            if (!didAttachListener) {\n                reject(new Error(\"Listener not added for \\\"\".concat(eventName, \"\\\"\")));\n            }\n        });\n    };\n    Framebus.prototype.on = function (eventName, originalHandler) {\n        if (this.isDestroyed) {\n            return false;\n        }\n        // eslint-disable-next-line @typescript-eslint/no-this-alias\n        var self = this;\n        var origin = this.origin;\n        var handler = originalHandler;\n        eventName = this.namespaceEvent(eventName);\n        if ((0, lib_1.subscriptionArgsInvalid)(eventName, handler, origin)) {\n            return false;\n        }\n        if (this.hasAdditionalChecksForOnListeners) {\n            /* eslint-disable no-invalid-this, @typescript-eslint/ban-ts-comment */\n            handler = function () {\n                var args = [];\n                for (var _i = 0; _i < arguments.length; _i++) {\n                    args[_i] = arguments[_i];\n                }\n                // @ts-ignore\n                if (!self.passesVerifyDomainCheck(this && this.origin)) {\n                    return;\n                }\n                // @ts-ignore\n                if (!self.hasMatchingTargetFrame(this && this.source)) {\n                    return;\n                }\n                originalHandler.apply(void 0, args);\n            };\n            /* eslint-enable no-invalid-this, @typescript-eslint/ban-ts-comment */\n        }\n        this.listeners.push({\n            eventName: eventName,\n            handler: handler,\n            originalHandler: originalHandler,\n        });\n        lib_1.subscribers[origin] = lib_1.subscribers[origin] || {};\n        lib_1.subscribers[origin][eventName] = lib_1.subscribers[origin][eventName] || [];\n        lib_1.subscribers[origin][eventName].push(handler);\n        return true;\n    };\n    Framebus.prototype.off = function (eventName, originalHandler) {\n        var handler = originalHandler;\n        if (this.isDestroyed) {\n            return false;\n        }\n        if (this.hasAdditionalChecksForOnListeners) {\n            for (var i = 0; i < this.listeners.length; i++) {\n                var listener = this.listeners[i];\n                if (listener.originalHandler === originalHandler) {\n                    handler = listener.handler;\n                }\n            }\n        }\n        eventName = this.namespaceEvent(eventName);\n        var origin = this.origin;\n        if ((0, lib_1.subscriptionArgsInvalid)(eventName, handler, origin)) {\n            return false;\n        }\n        var subscriberList = lib_1.subscribers[origin] && lib_1.subscribers[origin][eventName];\n        if (!subscriberList) {\n            return false;\n        }\n        for (var i = 0; i < subscriberList.length; i++) {\n            if (subscriberList[i] === handler) {\n                subscriberList.splice(i, 1);\n                return true;\n            }\n        }\n        return false;\n    };\n    Framebus.prototype.teardown = function () {\n        if (this.isDestroyed) {\n            return;\n        }\n        this.isDestroyed = true;\n        for (var i = 0; i < this.listeners.length; i++) {\n            var listener = this.listeners[i];\n            this.off(listener.eventName, listener.handler);\n        }\n        this.listeners.length = 0;\n    };\n    Framebus.prototype.passesVerifyDomainCheck = function (origin) {\n        if (!this.verifyDomain) {\n            // always pass this check if no verifyDomain option was set\n            return true;\n        }\n        return this.checkOrigin(origin);\n    };\n    Framebus.prototype.targetFramesAsWindows = function () {\n        if (!this.limitBroadcastToFramesArray) {\n            return [];\n        }\n        return this.targetFrames\n            .map(function (frame) {\n            // we can't pull off the contentWindow\n            // when the iframe is originally added\n            // to the array, because if it is not\n            // in the DOM at that time, it will have\n            // a contentWindow of `null`\n            if (frame instanceof HTMLIFrameElement) {\n                return frame.contentWindow;\n            }\n            return frame;\n        })\n            .filter(function (win) {\n            // just in case an iframe element\n            // was removed from the DOM\n            // and the contentWindow property\n            // is null\n            return win;\n        });\n    };\n    Framebus.prototype.hasMatchingTargetFrame = function (source) {\n        if (!this.limitBroadcastToFramesArray) {\n            // always pass this check if we aren't limiting to the target frames\n            return true;\n        }\n        var matchingFrame = this.targetFramesAsWindows().find(function (frame) {\n            return frame === source;\n        });\n        return Boolean(matchingFrame);\n    };\n    Framebus.prototype.checkOrigin = function (postMessageOrigin) {\n        var merchantHost;\n        var a = document.createElement(\"a\");\n        a.href = location.href;\n        if (a.protocol === \"https:\") {\n            merchantHost = a.host.replace(/:443$/, \"\");\n        }\n        else if (a.protocol === \"http:\") {\n            merchantHost = a.host.replace(/:80$/, \"\");\n        }\n        else {\n            merchantHost = a.host;\n        }\n        var merchantOrigin = a.protocol + \"//\" + merchantHost;\n        if (merchantOrigin === postMessageOrigin) {\n            return true;\n        }\n        if (this.verifyDomain) {\n            return this.verifyDomain(postMessageOrigin);\n        }\n        return true;\n    };\n    Framebus.prototype.namespaceEvent = function (eventName) {\n        if (!this.channel) {\n            return eventName;\n        }\n        return \"\".concat(this.channel, \":\").concat(eventName);\n    };\n    Framebus.Promise = DefaultPromise;\n    return Framebus;\n}());\nexports.Framebus = Framebus;\n\n},{\"./lib\":61}],54:[function(_dereq_,module,exports){\n\"use strict\";\nvar lib_1 = _dereq_(\"./lib\");\nvar framebus_1 = _dereq_(\"./framebus\");\n(0, lib_1.attach)();\nmodule.exports = framebus_1.Framebus;\n\n},{\"./framebus\":53,\"./lib\":61}],55:[function(_dereq_,module,exports){\n\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.detach = exports.attach = void 0;\nvar _1 = _dereq_(\"./\");\nvar isAttached = false;\nfunction attach() {\n    if (isAttached || typeof window === \"undefined\") {\n        return;\n    }\n    isAttached = true;\n    window.addEventListener(\"message\", _1.onMessage, false);\n}\nexports.attach = attach;\n// removeIf(production)\nfunction detach() {\n    isAttached = false;\n    window.removeEventListener(\"message\", _1.onMessage, false);\n}\nexports.detach = detach;\n// endRemoveIf(production)\n\n},{\"./\":61}],56:[function(_dereq_,module,exports){\n\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.broadcastToChildWindows = void 0;\nvar _1 = _dereq_(\"./\");\nfunction broadcastToChildWindows(payload, origin, source) {\n    for (var i = _1.childWindows.length - 1; i >= 0; i--) {\n        var childWindow = _1.childWindows[i];\n        if (childWindow.closed) {\n            _1.childWindows.splice(i, 1);\n        }\n        else if (source !== childWindow) {\n            (0, _1.broadcast)(payload, {\n                origin: origin,\n                frame: childWindow.top,\n            });\n        }\n    }\n}\nexports.broadcastToChildWindows = broadcastToChildWindows;\n\n},{\"./\":61}],57:[function(_dereq_,module,exports){\n\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.broadcast = void 0;\nvar _1 = _dereq_(\"./\");\nfunction broadcast(payload, options) {\n    var i = 0;\n    var frameToBroadcastTo;\n    var origin = options.origin, frame = options.frame;\n    try {\n        frame.postMessage(payload, origin);\n        if ((0, _1.hasOpener)(frame) && frame.opener.top !== window.top) {\n            broadcast(payload, {\n                origin: origin,\n                frame: frame.opener.top,\n            });\n        }\n        // previously, our max value was frame.frames.length\n        // but frames.length inherits from window.length\n        // which can be overwritten if a developer does\n        // `var length = value;` outside of a function\n        // scope, it'll prevent us from looping through\n        // all the frames. With this, we loop through\n        // until there are no longer any frames\n        // eslint-disable-next-line no-cond-assign\n        while ((frameToBroadcastTo = frame.frames[i])) {\n            broadcast(payload, {\n                origin: origin,\n                frame: frameToBroadcastTo,\n            });\n            i++;\n        }\n    }\n    catch (_) {\n        /* ignored */\n    }\n}\nexports.broadcast = broadcast;\n\n},{\"./\":61}],58:[function(_dereq_,module,exports){\n\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.subscribers = exports.childWindows = exports.prefix = void 0;\nexports.prefix = \"/*framebus*/\";\nexports.childWindows = [];\nexports.subscribers = {};\n\n},{}],59:[function(_dereq_,module,exports){\n\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.dispatch = void 0;\nvar _1 = _dereq_(\"./\");\nfunction dispatch(origin, event, data, reply, e) {\n    if (!_1.subscribers[origin]) {\n        return;\n    }\n    if (!_1.subscribers[origin][event]) {\n        return;\n    }\n    var args = [];\n    if (data) {\n        args.push(data);\n    }\n    if (reply) {\n        args.push(reply);\n    }\n    for (var i = 0; i < _1.subscribers[origin][event].length; i++) {\n        _1.subscribers[origin][event][i].apply(e, args);\n    }\n}\nexports.dispatch = dispatch;\n\n},{\"./\":61}],60:[function(_dereq_,module,exports){\n\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.hasOpener = void 0;\nfunction hasOpener(frame) {\n    if (frame.top !== frame) {\n        return false;\n    }\n    if (frame.opener == null) {\n        return false;\n    }\n    if (frame.opener === frame) {\n        return false;\n    }\n    if (frame.opener.closed === true) {\n        return false;\n    }\n    return true;\n}\nexports.hasOpener = hasOpener;\n\n},{}],61:[function(_dereq_,module,exports){\n\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n    if (k2 === undefined) k2 = k;\n    var desc = Object.getOwnPropertyDescriptor(m, k);\n    if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n      desc = { enumerable: true, get: function() { return m[k]; } };\n    }\n    Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n    if (k2 === undefined) k2 = k;\n    o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n    for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\n__exportStar(_dereq_(\"./attach\"), exports);\n__exportStar(_dereq_(\"./broadcast-to-child-windows\"), exports);\n__exportStar(_dereq_(\"./broadcast\"), exports);\n__exportStar(_dereq_(\"./constants\"), exports);\n__exportStar(_dereq_(\"./dispatch\"), exports);\n__exportStar(_dereq_(\"./has-opener\"), exports);\n__exportStar(_dereq_(\"./is-not-string\"), exports);\n__exportStar(_dereq_(\"./message\"), exports);\n__exportStar(_dereq_(\"./package-payload\"), exports);\n__exportStar(_dereq_(\"./send-message\"), exports);\n__exportStar(_dereq_(\"./subscribe-replier\"), exports);\n__exportStar(_dereq_(\"./subscription-args-invalid\"), exports);\n__exportStar(_dereq_(\"./types\"), exports);\n__exportStar(_dereq_(\"./unpack-payload\"), exports);\n\n},{\"./attach\":55,\"./broadcast\":57,\"./broadcast-to-child-windows\":56,\"./constants\":58,\"./dispatch\":59,\"./has-opener\":60,\"./is-not-string\":62,\"./message\":63,\"./package-payload\":64,\"./send-message\":65,\"./subscribe-replier\":66,\"./subscription-args-invalid\":67,\"./types\":68,\"./unpack-payload\":69}],62:[function(_dereq_,module,exports){\n\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isntString = void 0;\nfunction isntString(str) {\n    return typeof str !== \"string\";\n}\nexports.isntString = isntString;\n\n},{}],63:[function(_dereq_,module,exports){\n\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.onMessage = void 0;\nvar _1 = _dereq_(\"./\");\nfunction onMessage(e) {\n    if ((0, _1.isntString)(e.data)) {\n        return;\n    }\n    var payload = (0, _1.unpackPayload)(e);\n    if (!payload) {\n        return;\n    }\n    var data = payload.eventData;\n    var reply = payload.reply;\n    (0, _1.dispatch)(\"*\", payload.event, data, reply, e);\n    (0, _1.dispatch)(e.origin, payload.event, data, reply, e);\n    (0, _1.broadcastToChildWindows)(e.data, payload.origin, e.source);\n}\nexports.onMessage = onMessage;\n\n},{\"./\":61}],64:[function(_dereq_,module,exports){\n\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.packagePayload = void 0;\nvar _1 = _dereq_(\"./\");\nfunction packagePayload(event, origin, data, reply) {\n    var packaged;\n    var payload = {\n        event: event,\n        origin: origin,\n    };\n    if (typeof reply === \"function\") {\n        payload.reply = (0, _1.subscribeReplier)(reply, origin);\n    }\n    payload.eventData = data;\n    try {\n        packaged = _1.prefix + JSON.stringify(payload);\n    }\n    catch (e) {\n        throw new Error(\"Could not stringify event: \".concat(e.message));\n    }\n    return packaged;\n}\nexports.packagePayload = packagePayload;\n\n},{\"./\":61}],65:[function(_dereq_,module,exports){\n\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.sendMessage = void 0;\n/**\n * A basic function for wrapping the sending of postMessages to frames.\n */\nfunction sendMessage(frame, payload, origin) {\n    try {\n        frame.postMessage(payload, origin);\n    }\n    catch (error) {\n        /* ignored */\n    }\n}\nexports.sendMessage = sendMessage;\n\n},{}],66:[function(_dereq_,module,exports){\n\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n    return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.subscribeReplier = void 0;\nvar framebus_1 = _dereq_(\"../framebus\");\nvar uuid_1 = __importDefault(_dereq_(\"@braintree/uuid\"));\nfunction subscribeReplier(fn, origin) {\n    var uuid = (0, uuid_1.default)();\n    function replier(data, replyOriginHandler) {\n        fn(data, replyOriginHandler);\n        framebus_1.Framebus.target({\n            origin: origin,\n        }).off(uuid, replier);\n    }\n    framebus_1.Framebus.target({\n        origin: origin,\n    }).on(uuid, replier);\n    return uuid;\n}\nexports.subscribeReplier = subscribeReplier;\n\n},{\"../framebus\":53,\"@braintree/uuid\":39}],67:[function(_dereq_,module,exports){\n\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.subscriptionArgsInvalid = void 0;\nvar _1 = _dereq_(\"./\");\nfunction subscriptionArgsInvalid(event, fn, origin) {\n    if ((0, _1.isntString)(event)) {\n        return true;\n    }\n    if (typeof fn !== \"function\") {\n        return true;\n    }\n    return (0, _1.isntString)(origin);\n}\nexports.subscriptionArgsInvalid = subscriptionArgsInvalid;\n\n},{\"./\":61}],68:[function(_dereq_,module,exports){\n\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n\n},{}],69:[function(_dereq_,module,exports){\n\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.unpackPayload = void 0;\nvar _1 = _dereq_(\"./\");\nfunction unpackPayload(e) {\n    var payload;\n    if (e.data.slice(0, _1.prefix.length) !== _1.prefix) {\n        return false;\n    }\n    try {\n        payload = JSON.parse(e.data.slice(_1.prefix.length));\n    }\n    catch (err) {\n        return false;\n    }\n    if (payload.reply) {\n        var replyOrigin_1 = e.origin;\n        var replySource_1 = e.source;\n        var replyEvent_1 = payload.reply;\n        payload.reply = function reply(replyData) {\n            if (!replySource_1) {\n                return;\n            }\n            var replyPayload = (0, _1.packagePayload)(replyEvent_1, replyOrigin_1, replyData);\n            if (!replyPayload) {\n                return;\n            }\n            replySource_1.postMessage(replyPayload, replyOrigin_1);\n        };\n    }\n    return payload;\n}\nexports.unpackPayload = unpackPayload;\n\n},{\"./\":61}],70:[function(_dereq_,module,exports){\n\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isIos = exports.isIE9 = exports.isSamsungBrowser = exports.isAndroidChrome = exports.isKitKatWebview = void 0;\n// server side rendering check\nvar UA = (typeof window !== \"undefined\" &&\n    window.navigator &&\n    window.navigator.userAgent);\n// TODO remove this when browser detection is converted to typescript\n/* eslint-disable @typescript-eslint/ban-ts-comment */\n// @ts-ignore\nvar isAndroid = _dereq_(\"@braintree/browser-detection/is-android\");\n// @ts-ignore\nvar isChromeOs = _dereq_(\"@braintree/browser-detection/is-chrome-os\");\n// @ts-ignore\nvar isChrome = _dereq_(\"@braintree/browser-detection/is-chrome\");\n// @ts-ignore\nvar isIos = _dereq_(\"@braintree/browser-detection/is-ios\");\nexports.isIos = isIos;\n// @ts-ignore\nvar isIE9 = _dereq_(\"@braintree/browser-detection/is-ie9\");\nexports.isIE9 = isIE9;\n/* eslint-enable @typescript-eslint/ban-ts-comment */\n// Old Android Webviews used specific versions of Chrome with 0.0.0 as their version suffix\n// https://developer.chrome.com/multidevice/user-agent#webview_user_agent\nvar KITKAT_WEBVIEW_REGEX = /Version\\/\\d\\.\\d* Chrome\\/\\d*\\.0\\.0\\.0/;\nfunction isOldSamsungBrowserOrSamsungWebview(ua) {\n    return !isChrome(ua) && ua.indexOf(\"Samsung\") > -1;\n}\nfunction isKitKatWebview(ua) {\n    if (ua === void 0) { ua = UA; }\n    return isAndroid(ua) && KITKAT_WEBVIEW_REGEX.test(ua);\n}\nexports.isKitKatWebview = isKitKatWebview;\nfunction isAndroidChrome(ua) {\n    if (ua === void 0) { ua = UA; }\n    return (isAndroid(ua) || isChromeOs(ua)) && isChrome(ua);\n}\nexports.isAndroidChrome = isAndroidChrome;\nfunction isSamsungBrowser(ua) {\n    if (ua === void 0) { ua = UA; }\n    return /SamsungBrowser/.test(ua) || isOldSamsungBrowserOrSamsungWebview(ua);\n}\nexports.isSamsungBrowser = isSamsungBrowser;\n\n},{\"@braintree/browser-detection/is-android\":83,\"@braintree/browser-detection/is-chrome\":85,\"@braintree/browser-detection/is-chrome-os\":84,\"@braintree/browser-detection/is-ie9\":86,\"@braintree/browser-detection/is-ios\":87}],71:[function(_dereq_,module,exports){\n\"use strict\";\nvar device_1 = _dereq_(\"./lib/device\");\nmodule.exports = function supportsInputFormatting() {\n    // Digits get dropped in samsung browser\n    return !(0, device_1.isSamsungBrowser)();\n};\n\n},{\"./lib/device\":70}],72:[function(_dereq_,module,exports){\narguments[4][3][0].apply(exports,arguments)\n},{\"dup\":3}],73:[function(_dereq_,module,exports){\narguments[4][4][0].apply(exports,arguments)\n},{\"dup\":4}],74:[function(_dereq_,module,exports){\narguments[4][5][0].apply(exports,arguments)\n},{\"./is-duckduckgo\":75,\"./is-edge\":76,\"./is-opera\":80,\"./is-samsung\":81,\"./is-silk\":82,\"dup\":5}],75:[function(_dereq_,module,exports){\narguments[4][6][0].apply(exports,arguments)\n},{\"dup\":6}],76:[function(_dereq_,module,exports){\narguments[4][7][0].apply(exports,arguments)\n},{\"dup\":7}],77:[function(_dereq_,module,exports){\n\"use strict\";\nmodule.exports = function isIe9(ua) {\n    ua = ua || window.navigator.userAgent;\n    return ua.indexOf(\"MSIE 9\") !== -1;\n};\n\n},{}],78:[function(_dereq_,module,exports){\narguments[4][15][0].apply(exports,arguments)\n},{\"./is-ipados\":79,\"dup\":15}],79:[function(_dereq_,module,exports){\narguments[4][16][0].apply(exports,arguments)\n},{\"dup\":16}],80:[function(_dereq_,module,exports){\narguments[4][17][0].apply(exports,arguments)\n},{\"dup\":17}],81:[function(_dereq_,module,exports){\narguments[4][19][0].apply(exports,arguments)\n},{\"dup\":19}],82:[function(_dereq_,module,exports){\narguments[4][20][0].apply(exports,arguments)\n},{\"dup\":20}],83:[function(_dereq_,module,exports){\narguments[4][22][0].apply(exports,arguments)\n},{\"./dist/is-android\":72,\"dup\":22}],84:[function(_dereq_,module,exports){\narguments[4][23][0].apply(exports,arguments)\n},{\"./dist/is-chrome-os\":73,\"dup\":23}],85:[function(_dereq_,module,exports){\narguments[4][24][0].apply(exports,arguments)\n},{\"./dist/is-chrome\":74,\"dup\":24}],86:[function(_dereq_,module,exports){\nmodule.exports = _dereq_(\"./dist/is-ie9\");\n\n},{\"./dist/is-ie9\":77}],87:[function(_dereq_,module,exports){\narguments[4][30][0].apply(exports,arguments)\n},{\"./dist/is-ios\":78,\"dup\":30}],88:[function(_dereq_,module,exports){\nmodule.exports = _dereq_(\"./dist/supports-input-formatting\");\n\n},{\"./dist/supports-input-formatting\":71}],89:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar BraintreeError = _dereq_(\"../lib/braintree-error\");\nvar errors = _dereq_(\"./errors\");\nvar assign = _dereq_(\"../lib/assign\").assign;\nvar methods = _dereq_(\"../lib/methods\");\nvar convertMethodsToError = _dereq_(\"../lib/convert-methods-to-error\");\nvar wrapPromise = _dereq_(\"@braintree/wrap-promise\");\n\n/**\n * @class\n * @param {object} options Options\n * @description <strong>You cannot use this constructor directly. Use {@link module:braintree-web/american-express.create|braintree.american-express.create} instead.</strong>\n * @classdesc This class allows you use a nonce to interact with American Express Checkout. To accept American Express cards, use Hosted Fields.\n */\nfunction AmericanExpress(options) {\n  this._client = options.client;\n}\n\n/**\n * Gets the rewards balance associated with a Braintree nonce.\n * @public\n * @param {object} options Request options\n * @param {string} options.nonce An existing Braintree nonce.\n * @param {callback} [callback] The second argument, <code>data</code>, is the returned server data. If no callback is provided, `getRewardsBalance` returns a promise that resolves with the server data.\n * @returns {(Promise|void)} Returns a promise if no callback is provided.\n * @example\n * var americanExpress = require('braintree-web/american-express');\n *\n * americanExpress.create({client: clientInstance}, function (createErr, americanExpressInstance) {\n *   var options = {nonce: existingBraintreeNonce};\n *   americanExpressInstance.getRewardsBalance(options, function (getErr, payload) {\n *     if (getErr || payload.error) {\n *       // Handle error\n *       return;\n *     }\n *\n *     console.log('Rewards amount: ' + payload.rewardsAmount);\n *   });\n * });\n */\nAmericanExpress.prototype.getRewardsBalance = function (options) {\n  var nonce = options.nonce;\n  var data;\n\n  if (!nonce) {\n    return Promise.reject(\n      new BraintreeError({\n        type: errors.AMEX_NONCE_REQUIRED.type,\n        code: errors.AMEX_NONCE_REQUIRED.code,\n        message: \"getRewardsBalance must be called with a nonce.\",\n      })\n    );\n  }\n\n  data = assign(\n    {\n      _meta: { source: \"american-express\" },\n      paymentMethodNonce: nonce,\n    },\n    options\n  );\n\n  delete data.nonce;\n\n  return this._client\n    .request({\n      method: \"get\",\n      endpoint: \"payment_methods/amex_rewards_balance\",\n      data: data,\n    })\n    .catch(function (err) {\n      return Promise.reject(\n        new BraintreeError({\n          type: errors.AMEX_NETWORK_ERROR.type,\n          code: errors.AMEX_NETWORK_ERROR.code,\n          message:\n            \"A network error occurred when getting the American Express rewards balance.\",\n          details: {\n            originalError: err,\n          },\n        })\n      );\n    });\n};\n\n/**\n * Gets the Express Checkout nonce profile given a nonce from American Express.\n * @public\n * @param {object} options Request options\n * @param {string} options.nonce An existing nonce from American Express (note that this is <em>not</em> a nonce from Braintree).\n * @param {callback} [callback] The second argument, <code>data</code>, is the returned server data. If no callback is provided, `getExpressCheckoutProfile` returns a promise that resolves with the server data.\n * @returns {(Promise|void)} Returns a promise if no callback is provided.\n * @example\n * var americanExpress = require('braintree-web/american-express');\n *\n * americanExpress.create({client: clientInstance}, function (createErr, americanExpressInstance) {\n *   var options = {nonce: existingAmericanExpressNonce};\n *   americanExpressInstance.getExpressCheckoutProfile(options, function (getErr, payload) {\n *     if (getErr) {\n *       // Handle error\n *       return;\n *     }\n *\n *     console.log('Number of cards: ' + payload.amexExpressCheckoutCards.length);\n *   });\n * });\n */\nAmericanExpress.prototype.getExpressCheckoutProfile = function (options) {\n  if (!options.nonce) {\n    return Promise.reject(\n      new BraintreeError({\n        type: errors.AMEX_NONCE_REQUIRED.type,\n        code: errors.AMEX_NONCE_REQUIRED.code,\n        message: \"getExpressCheckoutProfile must be called with a nonce.\",\n      })\n    );\n  }\n\n  return this._client\n    .request({\n      method: \"get\",\n      endpoint: \"payment_methods/amex_express_checkout_cards/\" + options.nonce,\n      data: {\n        _meta: { source: \"american-express\" },\n        paymentMethodNonce: options.nonce,\n      },\n    })\n    .catch(function (err) {\n      return Promise.reject(\n        new BraintreeError({\n          type: errors.AMEX_NETWORK_ERROR.type,\n          code: errors.AMEX_NETWORK_ERROR.code,\n          message:\n            \"A network error occurred when getting the American Express Checkout nonce profile.\",\n          details: {\n            originalError: err,\n          },\n        })\n      );\n    });\n};\n\n/**\n * Cleanly tear down anything set up by {@link module:braintree-web/american-express.create|create}.\n * @public\n * @param {callback} [callback] Called once teardown is complete. No data is returned if teardown completes successfully.\n * @example\n * americanExpressInstance.teardown();\n * @example <caption>With callback</caption>\n * americanExpressInstance.teardown(function () {\n *   // teardown is complete\n * });\n * @returns {(Promise|void)} Returns a promise if no callback is provided.\n */\nAmericanExpress.prototype.teardown = function () {\n  convertMethodsToError(this, methods(AmericanExpress.prototype));\n\n  return Promise.resolve();\n};\n\nmodule.exports = wrapPromise.wrapPrototype(AmericanExpress);\n\n},{\"../lib/assign\":145,\"../lib/braintree-error\":148,\"../lib/convert-methods-to-error\":150,\"../lib/methods\":180,\"./errors\":90,\"@braintree/wrap-promise\":43}],90:[function(_dereq_,module,exports){\n\"use strict\";\n\n/**\n * @name BraintreeError.American Express - getRewardsBalance Error Codes\n * @description Errors that occur when creating components.\n * @property {MERCHANT} AMEX_NONCE_REQUIRED Occurs when a nonce is not provided to method.\n * @property {NETWORK} AMEX_NETWORK_ERROR Occurs when there is an error communicating with the Braintree gateway.\n */\n\n/**\n * @name BraintreeError.American Express - getExpressCheckoutProfile Error Codes\n * @description Errors that occur when creating components.\n * @property {MERCHANT} AMEX_NONCE_REQUIRED Occurs when a nonce is not provided to method.\n * @property {NETWORK} AMEX_NETWORK_ERROR Occurs when there is an error communicating with the Braintree gateway.\n */\n\nvar BraintreeError = _dereq_(\"../lib/braintree-error\");\n\nmodule.exports = {\n  AMEX_NONCE_REQUIRED: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"AMEX_NONCE_REQUIRED\",\n  },\n  AMEX_NETWORK_ERROR: {\n    type: BraintreeError.types.NETWORK,\n    code: \"AMEX_NETWORK_ERROR\",\n  },\n};\n\n},{\"../lib/braintree-error\":148}],91:[function(_dereq_,module,exports){\n\"use strict\";\n/**\n * @module braintree-web/american-express\n * @description This module is for use with Amex Express Checkout. To accept American Express cards, use Hosted Fields.\n */\n\nvar AmericanExpress = _dereq_(\"./american-express\");\nvar basicComponentVerification = _dereq_(\"../lib/basic-component-verification\");\nvar createDeferredClient = _dereq_(\"../lib/create-deferred-client\");\nvar createAssetsUrl = _dereq_(\"../lib/create-assets-url\");\nvar VERSION = \"3.134.0\";\nvar wrapPromise = _dereq_(\"@braintree/wrap-promise\");\n\n/**\n * @static\n * @function create\n * @param {object} options Creation options:\n * @param {Client} [options.client] A {@link Client} instance.\n * @param {string} [options.authorization] A tokenizationKey or clientToken. Can be used in place of `options.client`.\n * @param {callback} [callback] The second argument, `data`, is the {@link AmericanExpress} instance. If no callback is provided, `create` returns a promise that resolves with the {@link AmericanExpress} instance.\n * @returns {(Promise|void)} Returns a promise if no callback is provided.\n */\nfunction create(options) {\n  var name = \"American Express\";\n\n  return basicComponentVerification\n    .verify({\n      name: name,\n      client: options.client,\n      authorization: options.authorization,\n    })\n    .then(function () {\n      return createDeferredClient.create({\n        authorization: options.authorization,\n        client: options.client,\n        debug: options.debug,\n        assetsUrl: createAssetsUrl.create(options.authorization),\n        name: name,\n      });\n    })\n    .then(function (client) {\n      options.client = client;\n\n      return new AmericanExpress(options);\n    });\n}\n\nmodule.exports = {\n  create: wrapPromise(create),\n  /**\n   * @description The current version of the SDK, i.e. `{@pkg version}`.\n   * @type {string}\n   */\n  VERSION: VERSION,\n};\n\n},{\"../lib/basic-component-verification\":146,\"../lib/create-assets-url\":152,\"../lib/create-deferred-client\":154,\"./american-express\":89,\"@braintree/wrap-promise\":43}],92:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar BraintreeError = _dereq_(\"../lib/braintree-error\");\nvar analytics = _dereq_(\"../lib/analytics\");\nvar errors = _dereq_(\"./errors\");\nvar methods = _dereq_(\"../lib/methods\");\nvar convertMethodsToError = _dereq_(\"../lib/convert-methods-to-error\");\nvar wrapPromise = _dereq_(\"@braintree/wrap-promise\");\nvar inIframe = _dereq_(\"../lib/in-iframe\");\n\n/**\n * @typedef {object} ApplePay~tokenizePayload\n * @property {string} nonce The payment method nonce.\n * @property {object} details Additional details.\n * @property {string} details.cardType Type of card, ex: Visa, MasterCard.\n * @property {string} details.cardHolderName The name of the card holder.\n * @property {string} details.dpanLastTwo Last two digits of card number.\n * @property {boolean} details.isDeviceToken Whether this tokenized card is a\n * device-specific account number (DPAN) ('true') or merchant/cloud token (MPAN) ('false').\n * @property {string} description A human-readable description.\n * @property {string} type The payment method type, always `ApplePayCard`.\n * @property {object} binData Information about the card based on the bin.\n * @property {string} binData.commercial Possible values: 'Yes', 'No', 'Unknown'.\n * @property {string} binData.countryOfIssuance The country of issuance.\n * @property {string} binData.debit Possible values: 'Yes', 'No', 'Unknown'.\n * @property {string} binData.durbinRegulated Possible values: 'Yes', 'No', 'Unknown'.\n * @property {string} binData.healthcare Possible values: 'Yes', 'No', 'Unknown'.\n * @property {string} binData.issuingBank The issuing bank.\n * @property {string} binData.payroll Possible values: 'Yes', 'No', 'Unknown'.\n * @property {string} binData.prepaid Possible values: 'Yes', 'No', 'Unknown'.\n * @property {string} binData.productId The product id.\n * @property {string} binData.business Possible values: 'Yes', 'No', 'Unknown'.\n * @property {string} binData.consumer Possible values: 'Yes', 'No', 'Unknown'.\n * @property {string} binData.purchase Possible values: 'Yes', 'No', 'Unknown'.\n * @property {string} binData.corporate Possible values: 'Yes', 'No', 'Unknown'.\n */\n\n/**\n * An Apple Pay Payment Authorization Event object.\n * @typedef {object} ApplePayPaymentAuthorizedEvent\n * @external ApplePayPaymentAuthorizedEvent\n * @see {@link https://developer.apple.com/reference/applepayjs/applepaypaymentauthorizedevent ApplePayPaymentAuthorizedEvent}\n */\n\n/**\n * An Apple Pay Payment Request object.\n * @typedef {object} ApplePayPaymentRequest\n * @external ApplePayPaymentRequest\n * @see {@link https://developer.apple.com/reference/applepayjs/1916082-applepay_js_data_types/paymentrequest PaymentRequest}\n */\n\n/**\n * @class\n * @param {object} options Options\n * @description <strong>You cannot use this constructor directly. Use {@link module:braintree-web/apple-pay.create|braintree.applePay.create} instead.</strong>\n * @classdesc This class represents an Apple Pay component. Instances of this class have methods for validating the merchant server and tokenizing payments.\n */\nfunction ApplePay(options) {\n  this._instantiatedWithClient = Boolean(!options.useDeferredClient);\n  this._client = options.client;\n  this._createPromise = options.createPromise;\n\n  if (this._client) {\n    this._setMerchantIdentifier();\n  }\n}\n\nApplePay.prototype._waitForClient = function () {\n  if (this._client) {\n    return Promise.resolve();\n  }\n\n  return this._createPromise.then(\n    function (client) {\n      this._client = client;\n\n      this._setMerchantIdentifier();\n    }.bind(this)\n  );\n};\n\nApplePay.prototype._setMerchantIdentifier = function () {\n  var applePayConfig =\n    this._client.getConfiguration().gatewayConfiguration.applePayWeb;\n\n  if (!applePayConfig) {\n    return;\n  }\n  /**\n   * @name ApplePay#merchantIdentifier\n   * @description A special merchant ID which represents the merchant association with Braintree. Required when using `ApplePaySession.canMakePaymentsWithActiveCard`.\n   * @example\n   * var promise = ApplePaySession.canMakePaymentsWithActiveCard(applePayInstance.merchantIdentifier);\n   * promise.then(function (canMakePaymentsWithActiveCard) {\n   *   if (canMakePaymentsWithActiveCard) {\n   *     // Set up Apple Pay buttons\n   *   }\n   * });\n   */\n  Object.defineProperty(this, \"merchantIdentifier\", {\n    value: applePayConfig.merchantIdentifier,\n    configurable: false,\n    writable: false,\n  });\n};\n\n/**\n * Merges a payment request with Braintree defaults to return an {external:ApplePayPaymentRequest}.\n *\n * The following properties are assigned to `paymentRequest` if not already defined. Their default values come from the Braintree gateway.\n * - `countryCode`\n * - `currencyCode`\n * - `merchantCapabilities`\n * - `supportedNetworks`\n * @public\n * @param {external:ApplePayPaymentRequest} paymentRequest The payment request details to apply on top of those from Braintree.\n * @returns {external:ApplePayPaymentRequest|Promise} The decorated `paymentRequest` object. If `useDeferredClient` is used along with an `authorization`, this method will return a promise that resolves with the `paymentRequest` object.\n * @example\n * var applePay = require('braintree-web/apple-pay');\n *\n * applePay.create({client: clientInstance}, function (applePayErr, applePayInstance) {\n *   if (applePayErr) {\n *     // Handle error here\n *     return;\n *   }\n *\n *   var paymentRequest = applePayInstance.createPaymentRequest({\n *     total: {\n *       label: 'My Company',\n *       amount: '19.99'\n *     }\n *   });\n *\n *   var session = new ApplePaySession(3, paymentRequest);\n *\n *   // ...\n * @example <caption>With deferred client</caption>\n * var applePay = require('braintree-web/apple-pay');\n *\n * applePay.create({\n *   authorization: 'client-token-or-tokenization-key',\n *   useDeferredClient: true\n * }, function (applePayErr, applePayInstance) {\n *   if (applePayErr) {\n *     // Handle error here\n *     return;\n *   }\n *\n *   applePayInstance.createPaymentRequest({\n *     total: {\n *       label: 'My Company',\n *       amount: '19.99'\n *     }\n *   }).then(function (paymentRequest) {\n *     var session = new ApplePaySession(3, paymentRequest);\n *\n *     // ...\n *   });\n */\nApplePay.prototype.createPaymentRequest = function (paymentRequest) {\n  if (this._instantiatedWithClient) {\n    return this._createPaymentRequestSynchronously(paymentRequest);\n  }\n\n  return this._waitForClient().then(\n    function () {\n      return this._createPaymentRequestSynchronously(paymentRequest);\n    }.bind(this)\n  );\n};\n\nApplePay.prototype._createPaymentRequestSynchronously = function (\n  paymentRequest\n) {\n  var applePay =\n    this._client.getConfiguration().gatewayConfiguration.applePayWeb;\n  var defaults = {\n    countryCode: applePay.countryCode,\n    currencyCode: applePay.currencyCode,\n    merchantCapabilities: applePay.merchantCapabilities || [\"supports3DS\"],\n    supportedNetworks: applePay.supportedNetworks.map(function (network) {\n      return network === \"mastercard\" ? \"masterCard\" : network;\n    }),\n  };\n\n  return Object.assign({}, defaults, paymentRequest);\n};\n\n/**\n * Validates your merchant website, as required by `ApplePaySession` before payment can be authorized.\n * @public\n * @param {object} options Options\n * @param {string} options.validationURL The validationURL from an `ApplePayValidateMerchantEvent`.\n * @param {string} options.displayName The canonical name for your store. Use a non-localized name. This parameter should be a UTF-8 string that is a maximum of 64 characters. The system may display this name to the user.\n * @param {callback} [callback] The second argument, <code>data</code>, is the Apple Pay merchant session object. If no callback is provided, `performValidation` returns a promise.\n * Pass the merchant session to your Apple Pay session's `completeMerchantValidation` method.\n * @returns {(Promise|void)} Returns a promise if no callback is provided.\n * @example\n * var applePay = require('braintree-web/apple-pay');\n *\n * applePay.create({client: clientInstance}, function (applePayErr, applePayInstance) {\n *   if (applePayErr) {\n *     // Handle error here\n *     return;\n *   }\n *\n *   var paymentRequest = applePayInstance.createPaymentRequest({\n *     total: {\n *       label: 'My Company',\n *       amount: '19.99'\n *     }\n *   });\n *   var session = new ApplePaySession(3, paymentRequest);\n *\n *   session.onvalidatemerchant = function (event) {\n *     applePayInstance.performValidation({\n *       validationURL: event.validationURL,\n *       displayName: 'My Great Store'\n *     }, function (validationErr, validationData) {\n *       if (validationErr) {\n *         console.error(validationErr);\n *         session.abort();\n *         return;\n *       }\n *\n *       session.completeMerchantValidation(validationData);\n *     });\n *   };\n * });\n */\nApplePay.prototype.performValidation = function (options) {\n  var self = this;\n\n  if (!options || !options.validationURL) {\n    return Promise.reject(\n      new BraintreeError(errors.APPLE_PAY_VALIDATION_URL_REQUIRED)\n    );\n  }\n\n  return this._waitForClient()\n    .then(function () {\n      var applePayWebSession = {\n        validationUrl: options.validationURL,\n        domainName:\n          options.domainName ||\n          (inIframe()\n            ? window.parent.location.hostname\n            : window.location.hostname),\n        merchantIdentifier:\n          options.merchantIdentifier || self.merchantIdentifier,\n      };\n\n      if (options.displayName != null) {\n        applePayWebSession.displayName = options.displayName;\n      }\n\n      return self._client.request({\n        method: \"post\",\n        endpoint: \"apple_pay_web/sessions\",\n        data: {\n          _meta: { source: \"apple-pay\" },\n          applePayWebSession: applePayWebSession,\n        },\n      });\n    })\n    .then(function (response) {\n      analytics.sendEvent(self._client, \"applepay.performValidation.succeeded\");\n\n      return Promise.resolve(response);\n    })\n    .catch(function (err) {\n      analytics.sendEvent(self._client, \"applepay.performValidation.failed\");\n\n      if (err.code === \"CLIENT_REQUEST_ERROR\") {\n        return Promise.reject(\n          new BraintreeError({\n            type: errors.APPLE_PAY_MERCHANT_VALIDATION_FAILED.type,\n            code: errors.APPLE_PAY_MERCHANT_VALIDATION_FAILED.code,\n            message: errors.APPLE_PAY_MERCHANT_VALIDATION_FAILED.message,\n            details: {\n              originalError: err.details.originalError,\n            },\n          })\n        );\n      }\n\n      return Promise.reject(\n        new BraintreeError({\n          type: errors.APPLE_PAY_MERCHANT_VALIDATION_NETWORK.type,\n          code: errors.APPLE_PAY_MERCHANT_VALIDATION_NETWORK.code,\n          message: errors.APPLE_PAY_MERCHANT_VALIDATION_NETWORK.message,\n          details: {\n            originalError: err,\n          },\n        })\n      );\n    });\n};\n\n/**\n * Tokenizes an Apple Pay payment. This will likely be called in your `ApplePaySession`'s `onpaymentauthorized` callback.\n * @public\n * @param {object} options Options\n * @param {object} options.token The `payment.token` property of an {@link external:ApplePayPaymentAuthorizedEvent}.\n * @param {callback} [callback] The second argument, <code>data</code>, is a {@link ApplePay~tokenizePayload|tokenizePayload}. If no callback is provided, `tokenize` returns a promise that resolves with a {@link ApplePay~tokenizePayload|tokenizePayload}.\n * @returns {(Promise|void)} Returns a promise if no callback is provided.\n * @example\n * var applePay = require('braintree-web/apple-pay');\n *\n * applePay.create({client: clientInstance}, function (applePayErr, applePayInstance) {\n *   if (applePayErr) {\n *     // Handle error here\n *     return;\n *   }\n *\n *   var paymentRequest = applePayInstance.createPaymentRequest({\n *     total: {\n *       label: 'My Company',\n *       amount: '19.99'\n *     }\n *   });\n *   var session = new ApplePaySession(3, paymentRequest);\n *\n *   session.onpaymentauthorized = function (event) {\n *     applePayInstance.tokenize({\n *       token: event.payment.token\n *     }, function (tokenizeErr, tokenizedPayload) {\n *       if (tokenizeErr) {\n *         session.completePayment(ApplePaySession.STATUS_FAILURE);\n *         return;\n *       }\n *       // Send the tokenizedPayload to your server here!\n *\n *       // Once the transaction is complete, call completePayment\n *       // to close the Apple Pay sheet\n *       session.completePayment(ApplePaySession.STATUS_SUCCESS);\n *     });\n *   };\n *\n *   // ...\n * });\n */\nApplePay.prototype.tokenize = function (options) {\n  var self = this;\n\n  if (!options.token) {\n    return Promise.reject(\n      new BraintreeError(errors.APPLE_PAY_PAYMENT_TOKEN_REQUIRED)\n    );\n  }\n\n  return this._waitForClient()\n    .then(function () {\n      return self._client.request({\n        method: \"post\",\n        endpoint: \"payment_methods/apple_payment_tokens\",\n        data: {\n          _meta: {\n            source: \"apple-pay\",\n          },\n          applePaymentToken: Object.assign({}, options.token, {\n            // The gateway requires this key to be base64-encoded.\n            paymentData: btoa(JSON.stringify(options.token.paymentData)),\n          }),\n        },\n      });\n    })\n    .then(function (response) {\n      analytics.sendEvent(self._client, \"applepay.tokenize.succeeded\");\n\n      return Promise.resolve(response.applePayCards[0]);\n    })\n    .catch(function (err) {\n      analytics.sendEvent(self._client, \"applepay.tokenize.failed\");\n\n      return Promise.reject(\n        new BraintreeError({\n          type: errors.APPLE_PAY_TOKENIZATION.type,\n          code: errors.APPLE_PAY_TOKENIZATION.code,\n          message: errors.APPLE_PAY_TOKENIZATION.message,\n          details: {\n            originalError: err,\n          },\n        })\n      );\n    });\n};\n\n/**\n * Cleanly tear down anything set up by {@link module:braintree-web/apple-pay.create|create}.\n * @public\n * @param {callback} [callback] Called once teardown is complete. No data is returned if teardown completes successfully.\n * @example\n * applePayInstance.teardown();\n * @example <caption>With callback</caption>\n * applePayInstance.teardown(function () {\n *   // teardown is complete\n * });\n * @returns {(Promise|void)} Returns a promise if no callback is provided.\n */\nApplePay.prototype.teardown = function () {\n  convertMethodsToError(this, methods(ApplePay.prototype));\n\n  return Promise.resolve();\n};\n\nmodule.exports = wrapPromise.wrapPrototype(ApplePay);\n\n},{\"../lib/analytics\":143,\"../lib/braintree-error\":148,\"../lib/convert-methods-to-error\":150,\"../lib/in-iframe\":174,\"../lib/methods\":180,\"./errors\":93,\"@braintree/wrap-promise\":43}],93:[function(_dereq_,module,exports){\n\"use strict\";\n\n/**\n * @name BraintreeError.Apple Pay - Creation Error Codes\n * @description Errors that occur when [creating the Apple Pay component](./module-braintree-web_apple-pay.html#.create).\n * @property {MERCHANT} APPLE_PAY_NOT_ENABLED Occurs when the authorization used is not authorized to process Apple Pay.\n */\n\n/**\n * @name BraintreeError.Apple Pay - performValidation Error Codes\n * @description Errors that occur when [validating](./ApplePay.html#performValidation).\n * @property {MERCHANT} APPLE_PAY_VALIDATION_URL_REQUIRED Occurs when the `validationURL` option is not passed in.\n * @property {MERCHANT} APPLE_PAY_MERCHANT_VALIDATION_FAILED Occurs when the website domain has not been registered in the Braintree control panel.\n * @property {NETWORK} APPLE_PAY_MERCHANT_VALIDATION_NETWORK Occurs when an unknown network error occurs.\n */\n\n/**\n * @name BraintreeError.Apple Pay - tokenize Error Codes\n * @description Errors that occur when [tokenizing](./ApplePay.html#tokenize).\n * @property {MERCHANT} APPLE_PAY_PAYMENT_TOKEN_REQUIRED Occurs when the `token` option is not passed in.\n * @property {NETWORK} APPLE_PAY_TOKENIZATION Occurs when an unknown network error occurs.\n */\n\nvar BraintreeError = _dereq_(\"../lib/braintree-error\");\n\nmodule.exports = {\n  APPLE_PAY_NOT_ENABLED: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"APPLE_PAY_NOT_ENABLED\",\n    message: \"Apple Pay is not enabled for this merchant.\",\n  },\n  APPLE_PAY_VALIDATION_URL_REQUIRED: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"APPLE_PAY_VALIDATION_URL_REQUIRED\",\n    message: \"performValidation must be called with a validationURL.\",\n  },\n  APPLE_PAY_MERCHANT_VALIDATION_NETWORK: {\n    type: BraintreeError.types.NETWORK,\n    code: \"APPLE_PAY_MERCHANT_VALIDATION_NETWORK\",\n    message: \"A network error occurred when validating the Apple Pay merchant.\",\n  },\n  APPLE_PAY_MERCHANT_VALIDATION_FAILED: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"APPLE_PAY_MERCHANT_VALIDATION_FAILED\",\n    message:\n      \"Make sure you have registered your domain name in the Braintree Control Panel.\",\n  },\n  APPLE_PAY_PAYMENT_TOKEN_REQUIRED: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"APPLE_PAY_PAYMENT_TOKEN_REQUIRED\",\n    message: \"tokenize must be called with a payment token.\",\n  },\n  APPLE_PAY_TOKENIZATION: {\n    type: BraintreeError.types.NETWORK,\n    code: \"APPLE_PAY_TOKENIZATION\",\n    message: \"A network error occurred when processing the Apple Pay payment.\",\n  },\n};\n\n},{\"../lib/braintree-error\":148}],94:[function(_dereq_,module,exports){\n\"use strict\";\n\n/**\n * @module braintree-web/apple-pay\n * @description Accept Apple Pay on the Web. *This component is currently in beta and is subject to change.*\n */\n\nvar ApplePay = _dereq_(\"./apple-pay\");\nvar analytics = _dereq_(\"../lib/analytics\");\nvar BraintreeError = _dereq_(\"../lib/braintree-error\");\nvar basicComponentVerification = _dereq_(\"../lib/basic-component-verification\");\nvar createAssetsUrl = _dereq_(\"../lib/create-assets-url\");\nvar createDeferredClient = _dereq_(\"../lib/create-deferred-client\");\nvar errors = _dereq_(\"./errors\");\nvar VERSION = \"3.134.0\";\nvar wrapPromise = _dereq_(\"@braintree/wrap-promise\");\n\n/**\n * @static\n * @function create\n * @param {object} options Creation options:\n * @param {Client} [options.client] A {@link Client} instance.\n * @param {string} [options.authorization] A tokenizationKey or clientToken. Can be used in place of `options.client`.\n * @param {boolean} [options.useDeferredClient] Used in conjunction with `authorization`, allows the Apple Pay instance to be available right away by fetching the client configuration in the background. When this option is used, {@link ApplePay#createPaymentRequest} will return a promise that resolves with the configuration instead of returning synchronously.\n * @param {callback} [callback] The second argument, `data`, is the {@link ApplePay} instance. If no callback is provided, `create` returns a promise that resolves with the {@link ApplePay} instance.\n * @returns {(Promise|void)} Returns a promise if no callback is provided.\n */\nfunction create(options) {\n  var name = \"Apple Pay\";\n\n  return basicComponentVerification\n    .verify({\n      name: name,\n      client: options.client,\n      authorization: options.authorization,\n    })\n    .then(function () {\n      var applePayInstance;\n      var createPromise = createDeferredClient\n        .create({\n          authorization: options.authorization,\n          client: options.client,\n          debug: options.debug,\n          assetsUrl: createAssetsUrl.create(options.authorization),\n          name: name,\n        })\n        .then(function (client) {\n          if (!client.getConfiguration().gatewayConfiguration.applePayWeb) {\n            return Promise.reject(\n              new BraintreeError(errors.APPLE_PAY_NOT_ENABLED)\n            );\n          }\n\n          analytics.sendEvent(client, \"applepay.initialized\");\n\n          return client;\n        });\n\n      options.createPromise = createPromise;\n      applePayInstance = new ApplePay(options);\n\n      if (!options.useDeferredClient) {\n        return createPromise.then(function (client) {\n          applePayInstance._client = client;\n\n          return applePayInstance;\n        });\n      }\n\n      return applePayInstance;\n    });\n}\n\nmodule.exports = {\n  create: wrapPromise(create),\n  /**\n   * @description The current version of the SDK, i.e. `{@pkg version}`.\n   * @type {string}\n   */\n  VERSION: VERSION,\n};\n\n},{\"../lib/analytics\":143,\"../lib/basic-component-verification\":146,\"../lib/braintree-error\":148,\"../lib/create-assets-url\":152,\"../lib/create-deferred-client\":154,\"./apple-pay\":92,\"./errors\":93,\"@braintree/wrap-promise\":43}],95:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar BRAINTREE_VERSION = _dereq_(\"./constants\").BRAINTREE_VERSION;\n\nvar GraphQL = _dereq_(\"./request/graphql\");\nvar request = _dereq_(\"./request\");\nvar isVerifiedDomain = _dereq_(\"../lib/is-verified-domain\");\nvar BraintreeError = _dereq_(\"../lib/braintree-error\");\nvar convertToBraintreeError = _dereq_(\"../lib/convert-to-braintree-error\");\nvar getGatewayConfiguration = _dereq_(\"./get-configuration\").getConfiguration;\nvar createAuthorizationData = _dereq_(\"../lib/create-authorization-data\");\nvar metadata = _dereq_(\"../lib/add-metadata\");\nvar wrapPromise = _dereq_(\"@braintree/wrap-promise\");\nvar once = _dereq_(\"../lib/once\");\nvar deferred = _dereq_(\"../lib/deferred\");\nvar assign = _dereq_(\"../lib/assign\").assign;\nvar analytics = _dereq_(\"../lib/analytics\");\nvar errors = _dereq_(\"./errors\");\nvar VERSION = _dereq_(\"../lib/constants\").VERSION;\nvar GRAPHQL_URLS = _dereq_(\"../lib/constants\").GRAPHQL_URLS;\nvar methods = _dereq_(\"../lib/methods\");\nvar convertMethodsToError = _dereq_(\"../lib/convert-methods-to-error\");\nvar assets = _dereq_(\"../lib/assets\");\nvar FRAUDNET_FNCLS = _dereq_(\"../lib/constants\").FRAUDNET_FNCLS;\nvar FRAUDNET_SOURCE = _dereq_(\"../lib/constants\").FRAUDNET_SOURCE;\nvar FRAUDNET_URL = _dereq_(\"../lib/constants\").FRAUDNET_URL;\n\nvar cachedClients = {};\n\n/**\n * This object is returned by {@link Client#getConfiguration|getConfiguration}. This information is used extensively by other Braintree modules to properly configure themselves.\n * @typedef {object} Client~configuration\n * @property {object} client The braintree-web/client parameters.\n * @property {string} client.authorization A tokenizationKey or clientToken.\n * @property {object} gatewayConfiguration Gateway-supplied configuration.\n * @property {object} analyticsMetadata Analytics-specific data.\n * @property {string} analyticsMetadata.sessionId Uniquely identifies a browsing session.\n * @property {string} analyticsMetadata.sdkVersion The braintree.js version.\n * @property {string} analyticsMetadata.merchantAppId Identifies the merchant's web app.\n */\n\n/**\n * @class\n * @param {Client~configuration} configuration Options\n * @description <strong>Do not use this constructor directly. Use {@link module:braintree-web/client.create|braintree.client.create} instead.</strong>\n * @classdesc This class is required by many other Braintree components. It serves as the base API layer that communicates with our servers. It is also capable of being used to formulate direct calls to our servers, such as direct credit card tokenization. See {@link Client#request}.\n */\nfunction Client(configuration) {\n  var configurationJSON, gatewayConfiguration;\n\n  configuration = configuration || {};\n\n  configurationJSON = JSON.stringify(configuration);\n  gatewayConfiguration = configuration.gatewayConfiguration;\n\n  if (!gatewayConfiguration) {\n    throw new BraintreeError(errors.CLIENT_MISSING_GATEWAY_CONFIGURATION);\n  }\n\n  [\"assetsUrl\", \"clientApiUrl\", \"configUrl\"].forEach(function (property) {\n    if (\n      property in gatewayConfiguration &&\n      !isVerifiedDomain(gatewayConfiguration[property])\n    ) {\n      throw new BraintreeError({\n        type: errors.CLIENT_GATEWAY_CONFIGURATION_INVALID_DOMAIN.type,\n        code: errors.CLIENT_GATEWAY_CONFIGURATION_INVALID_DOMAIN.code,\n        message: property + \" property is on an invalid domain.\",\n      });\n    }\n  });\n\n  /**\n   * Returns a copy of the configuration values.\n   * @public\n   * @returns {Client~configuration} configuration\n   */\n  this.getConfiguration = function () {\n    return JSON.parse(configurationJSON);\n  };\n\n  this._request = request;\n  this._configuration = this.getConfiguration();\n\n  this._clientApiBaseUrl = gatewayConfiguration.clientApiUrl + \"/v1/\";\n\n  if (gatewayConfiguration.graphQL) {\n    if (!isVerifiedDomain(gatewayConfiguration.graphQL.url)) {\n      throw new BraintreeError({\n        type: errors.CLIENT_GATEWAY_CONFIGURATION_INVALID_DOMAIN.type,\n        code: errors.CLIENT_GATEWAY_CONFIGURATION_INVALID_DOMAIN.code,\n        message: \"graphQL.url property is on an invalid domain.\",\n      });\n    }\n\n    this._graphQL = new GraphQL({\n      graphQL: gatewayConfiguration.graphQL,\n    });\n  }\n}\n\nClient.initialize = function (options) {\n  var clientInstance, authData;\n  var promise = cachedClients[options.authorization];\n\n  if (promise) {\n    analytics.sendEvent(promise, \"custom.client.load.cached\");\n\n    return promise;\n  }\n\n  try {\n    authData = createAuthorizationData(options.authorization);\n    // eslint-disable-next-line no-unused-vars\n  } catch (err) {\n    return Promise.reject(\n      new BraintreeError(errors.CLIENT_INVALID_AUTHORIZATION)\n    );\n  }\n\n  promise = getGatewayConfiguration(authData, options.sessionId).then(\n    function (configuration) {\n      if (options.debug) {\n        configuration.isDebug = true;\n      }\n\n      configuration.authorization = options.authorization;\n\n      clientInstance = new Client(configuration);\n\n      return clientInstance;\n    }\n  );\n\n  cachedClients[options.authorization] = promise;\n\n  analytics.sendEvent(promise, \"custom.client.load.initialized\");\n\n  return promise\n    .then(function (client) {\n      analytics.sendEvent(clientInstance, \"custom.client.load.succeeded\");\n\n      return client;\n    })\n    .catch(function (err) {\n      delete cachedClients[options.authorization];\n\n      return Promise.reject(err);\n    });\n};\n\n// Primarily used for testing the client initalization call\nClient.clearCache = function () {\n  cachedClients = {};\n};\n\nClient.prototype._findOrCreateFraudnetJSON = function (clientMetadataId) {\n  var el = document.querySelector('script[fncls=\"' + FRAUDNET_FNCLS + '\"]');\n  var config, additionalData, authorizationFingerprint, parameters;\n\n  if (!el) {\n    el = document.body.appendChild(document.createElement(\"script\"));\n    el.type = \"application/json\";\n    el.setAttribute(\"fncls\", FRAUDNET_FNCLS);\n  }\n\n  config = this.getConfiguration();\n  additionalData = {\n    rda_tenant: \"bt_card\", // eslint-disable-line camelcase\n    mid: config.gatewayConfiguration.merchantId,\n  };\n  authorizationFingerprint = config.authorizationFingerprint;\n\n  if (authorizationFingerprint) {\n    authorizationFingerprint.split(\"&\").forEach(function (pieces) {\n      var component = pieces.split(\"=\");\n\n      if (component[0] === \"customer_id\" && component.length > 1) {\n        additionalData.cid = component[1];\n      }\n    });\n  }\n\n  parameters = {\n    f: clientMetadataId.substr(0, 32),\n    fp: additionalData,\n    bu: false,\n    s: FRAUDNET_SOURCE,\n  };\n  el.text = JSON.stringify(parameters);\n};\n\n/**\n * Used by other modules to formulate all network requests to the Braintree gateway. It is also capable of being used directly from your own form to tokenize credit card information. However, be sure to satisfy PCI compliance if you use direct card tokenization.\n * @public\n * @param {object} options Request options:\n * @param {string} options.method HTTP method, e.g. \"get\" or \"post\".\n * @param {string} options.endpoint Endpoint path, e.g. \"payment_methods\".\n * @param {object} options.data Data to send with the request.\n * @param {number} [options.timeout=60000] Set a timeout (in milliseconds) for the request.\n * @param {callback} [callback] The second argument, <code>data</code>, is the returned server data.\n * @example\n * <caption>Direct Credit Card Tokenization</caption>\n * var createClient = require('braintree-web/client').create;\n *\n * createClient({\n *   authorization: CLIENT_AUTHORIZATION\n * }, function (createErr, clientInstance) {\n *   var form = document.getElementById('my-form-id');\n *   var data = {\n *     creditCard: {\n *       number: form['cc-number'].value,\n *       cvv: form['cc-cvv'].value,\n *       expirationDate: form['cc-expiration-date'].value,\n *       billingAddress: {\n *         postalCode: form['cc-postal-code'].value\n *       },\n *       options: {\n *         validate: false\n *       }\n *     }\n *   };\n *\n *   // Warning: For a merchant to be eligible for the easiest level of PCI compliance (SAQ A),\n *   // payment fields cannot be hosted on your checkout page.\n *   // For an alternative to the following, use Hosted Fields.\n *   clientInstance.request({\n *     endpoint: 'payment_methods/credit_cards',\n *     method: 'post',\n *     data: data\n *   }, function (requestErr, response) {\n *     // More detailed example of handling API errors: https://codepen.io/braintree/pen/MbwjdM\n *     if (requestErr) { throw new Error(requestErr); }\n *\n *     console.log('Got nonce:', response.creditCards[0].nonce);\n *   });\n * });\n * @example\n * <caption>Tokenizing Fields for AVS Checks</caption>\n * var createClient = require('braintree-web/client').create;\n *\n * createClient({\n *   authorization: CLIENT_AUTHORIZATION\n * }, function (createErr, clientInstance) {\n *   var form = document.getElementById('my-form-id');\n *   var data = {\n *     creditCard: {\n *       number: form['cc-number'].value,\n *       cvv: form['cc-cvv'].value,\n *       expirationDate: form['cc-date'].value,\n *       // The billing address can be checked with AVS rules.\n *       // See: https://articles.braintreepayments.com/support/guides/fraud-tools/basic/avs-cvv-rules\n *       billingAddress: {\n *         postalCode: form['cc-postal-code'].value,\n *         streetAddress: form['cc-street-address'].value,\n *         countryName: form['cc-country-name'].value,\n *         countryCodeAlpha2: form['cc-country-alpha2'].value,\n *         countryCodeAlpha3: form['cc-country-alpha3'].value,\n *         countryCodeNumeric: form['cc-country-numeric'].value\n *       },\n *       options: {\n *         validate: false\n *       }\n *     }\n *   };\n *\n *   // Warning: For a merchant to be eligible for the easiest level of PCI compliance (SAQ A),\n *   // payment fields cannot be hosted on your checkout page.\n *   // For an alternative to the following, use Hosted Fields.\n *   clientInstance.request({\n *     endpoint: 'payment_methods/credit_cards',\n *     method: 'post',\n *     data: data\n *   }, function (requestErr, response) {\n *     // More detailed example of handling API errors: https://codepen.io/braintree/pen/MbwjdM\n *     if (requestErr) { throw new Error(requestErr); }\n *\n *     console.log('Got nonce:', response.creditCards[0].nonce);\n *   });\n * });\n * @returns {(Promise|void)} Returns a promise if no callback is provided.\n */\nClient.prototype.request = function (options, callback) {\n  var self = this;\n  var requestPromise = new Promise(function (resolve, reject) {\n    var optionName, api, baseUrl, requestOptions;\n    var shouldCollectData = Boolean(\n      options.endpoint === \"payment_methods/credit_cards\" &&\n        self.getConfiguration().gatewayConfiguration.creditCards\n          .collectDeviceData\n    );\n\n    if (options.api !== \"graphQLApi\") {\n      if (!options.method) {\n        optionName = \"options.method\";\n      } else if (!options.endpoint) {\n        optionName = \"options.endpoint\";\n      }\n    }\n\n    if (optionName) {\n      throw new BraintreeError({\n        type: errors.CLIENT_OPTION_REQUIRED.type,\n        code: errors.CLIENT_OPTION_REQUIRED.code,\n        message: optionName + \" is required when making a request.\",\n      });\n    }\n\n    if (\"api\" in options) {\n      api = options.api;\n    } else {\n      api = \"clientApi\";\n    }\n\n    requestOptions = {\n      method: options.method,\n      graphQL: self._graphQL,\n      timeout: options.timeout,\n      metadata: self._configuration.analyticsMetadata,\n    };\n\n    if (api === \"clientApi\") {\n      baseUrl = self._clientApiBaseUrl;\n\n      requestOptions.data = metadata.addMetadata(\n        self._configuration,\n        options.data\n      );\n    } else if (api === \"graphQLApi\") {\n      baseUrl =\n        GRAPHQL_URLS[self._configuration.gatewayConfiguration.environment];\n      options.endpoint = \"\";\n      requestOptions.method = \"post\";\n      requestOptions.data = assign(\n        {\n          clientSdkMetadata: {\n            platform: self._configuration.analyticsMetadata.platform,\n            source: self._configuration.analyticsMetadata.source,\n            integration: self._configuration.analyticsMetadata.integration,\n            sessionId: self._configuration.analyticsMetadata.sessionId,\n            version: VERSION,\n          },\n        },\n        options.data\n      );\n\n      requestOptions.headers = getAuthorizationHeadersForGraphQL(\n        self._configuration\n      );\n    } else {\n      throw new BraintreeError({\n        type: errors.CLIENT_OPTION_INVALID.type,\n        code: errors.CLIENT_OPTION_INVALID.code,\n        message: \"options.api is invalid.\",\n      });\n    }\n\n    requestOptions.url = baseUrl + options.endpoint;\n    requestOptions.sendAnalyticsEvent = function (kind, extraFields) {\n      if (extraFields) {\n        analytics.sendEventPlus(self, kind, extraFields);\n      } else {\n        analytics.sendEvent(self, kind);\n      }\n    };\n\n    self._request(requestOptions, function (err, data, status) {\n      var resolvedData, requestError;\n\n      requestError = formatRequestError(status, err);\n\n      if (requestError) {\n        reject(requestError);\n\n        return;\n      }\n\n      if (api === \"graphQLApi\" && data.errors) {\n        reject(\n          convertToBraintreeError(data.errors, {\n            type: errors.CLIENT_GRAPHQL_REQUEST_ERROR.type,\n            code: errors.CLIENT_GRAPHQL_REQUEST_ERROR.code,\n            message: errors.CLIENT_GRAPHQL_REQUEST_ERROR.message,\n          })\n        );\n\n        return;\n      }\n\n      resolvedData = assign({ _httpStatus: status }, data);\n\n      if (\n        shouldCollectData &&\n        resolvedData.creditCards &&\n        resolvedData.creditCards.length > 0\n      ) {\n        self._findOrCreateFraudnetJSON(resolvedData.creditCards[0].nonce);\n\n        assets.loadScript({\n          src: FRAUDNET_URL,\n          forceScriptReload: true,\n        });\n      }\n      resolve(resolvedData);\n    });\n  });\n\n  if (typeof callback === \"function\") {\n    callback = once(deferred(callback));\n\n    requestPromise\n      .then(function (response) {\n        callback(null, response, response._httpStatus);\n      })\n      .catch(function (err) {\n        var status = err && err.details && err.details.httpStatus;\n\n        callback(err, null, status);\n      });\n\n    return;\n  }\n\n  return requestPromise; // eslint-disable-line consistent-return\n};\n\n// eslint-disable-next-line consistent-return\nfunction formatRequestError(status, err) {\n  var requestError;\n\n  if (status === -1) {\n    requestError = new BraintreeError(errors.CLIENT_REQUEST_TIMEOUT);\n  } else if (status === 401) {\n    requestError = new BraintreeError(errors.CLIENT_AUTHORIZATION_INVALID);\n  } else if (status === 403) {\n    requestError = new BraintreeError(errors.CLIENT_AUTHORIZATION_INSUFFICIENT);\n  } else if (status === 429) {\n    requestError = new BraintreeError(errors.CLIENT_RATE_LIMITED);\n  } else if (status >= 500) {\n    requestError = new BraintreeError(errors.CLIENT_GATEWAY_NETWORK);\n  } else if (status < 200 || status >= 400) {\n    requestError = convertToBraintreeError(err, {\n      type: errors.CLIENT_REQUEST_ERROR.type,\n      code: errors.CLIENT_REQUEST_ERROR.code,\n      message: errors.CLIENT_REQUEST_ERROR.message,\n    });\n  }\n\n  if (requestError) {\n    requestError.details = requestError.details || {};\n    requestError.details.httpStatus = status;\n\n    return requestError;\n  }\n}\n\nClient.prototype.toJSON = function () {\n  return this.getConfiguration();\n};\n\n/**\n * Returns the Client version.\n * @public\n * @returns {String} The created client's version.\n * @example\n * var createClient = require('braintree-web/client').create;\n *\n * createClient({\n *   authorization: CLIENT_AUTHORIZATION\n * }, function (createErr, clientInstance) {\n *   console.log(clientInstance.getVersion()); // Ex: 1.0.0\n * });\n */\nClient.prototype.getVersion = function () {\n  return VERSION;\n};\n\n/**\n * Cleanly tear down anything set up by {@link module:braintree-web/client.create|create}.\n * @public\n * @param {callback} [callback] Called once teardown is complete. No data is returned if teardown completes successfully.\n * @example\n * clientInstance.teardown();\n * @example <caption>With callback</caption>\n * clientInstance.teardown(function () {\n *   // teardown is complete\n * });\n * @returns {(Promise|void)} Returns a promise if no callback is provided.\n */\nClient.prototype.teardown = wrapPromise(function () {\n  var self = this;\n\n  delete cachedClients[self.getConfiguration().authorization];\n  convertMethodsToError(self, methods(Client.prototype));\n\n  return Promise.resolve();\n});\n\nfunction getAuthorizationHeadersForGraphQL(configuration) {\n  var token =\n    configuration.authorizationFingerprint || configuration.authorization;\n\n  return {\n    Authorization: \"Bearer \" + token,\n    \"Braintree-Version\": BRAINTREE_VERSION,\n  };\n}\n\nmodule.exports = Client;\n\n},{\"../lib/add-metadata\":142,\"../lib/analytics\":143,\"../lib/assets\":144,\"../lib/assign\":145,\"../lib/braintree-error\":148,\"../lib/constants\":149,\"../lib/convert-methods-to-error\":150,\"../lib/convert-to-braintree-error\":151,\"../lib/create-authorization-data\":153,\"../lib/deferred\":155,\"../lib/is-verified-domain\":178,\"../lib/methods\":180,\"../lib/once\":181,\"./constants\":96,\"./errors\":97,\"./get-configuration\":98,\"./request\":111,\"./request/graphql\":109,\"@braintree/wrap-promise\":43}],96:[function(_dereq_,module,exports){\n\"use strict\";\n\nmodule.exports = {\n  BRAINTREE_VERSION: \"2018-05-10\",\n};\n\n},{}],97:[function(_dereq_,module,exports){\n\"use strict\";\n\n/**\n * @name BraintreeError.Client - Internal Error Codes\n * @ignore\n * @description These codes should never be experienced by the merchant directly.\n * @property {MERCHANT} CLIENT_GATEWAY_CONFIGURATION_INVALID_DOMAIN An error to prevent client creation for domains that are not allowed in the JS.\n * @property {INTERNAL} CLIENT_MISSING_GATEWAY_CONFIGURATION Occurs when the client is created without a gateway configuration. Should never happen.\n */\n\n/**\n * @name BraintreeError.Client - Create Error Codes\n * @description Errors that may occur when [creating the client](./module-braintree-web_client.html#.create)\n * @property {MERCHANT} CLIENT_INVALID_AUTHORIZATION Occurs when client token cannot be parsed.\n */\n\n/**\n * @name BraintreeError.Client - Request Error Codes\n * @description Errors that may occur when [using the request method](./Client.html#request)\n * @property {MERCHANT} CLIENT_OPTION_REQUIRED An option required in the request method was not provided. Usually `options.method` or `options.endpoint`\n * @property {MERCHANT} CLIENT_OPTION_INVALID The request option provided is invalid.\n * @property {MERCHANT} CLIENT_GATEWAY_NETWORK The Braintree gateway could not be contacted.\n * @property {NETWORK} CLIENT_REQUEST_TIMEOUT The request took too long to complete and timed out.\n * @property {NETWORK} CLIENT_REQUEST_ERROR The response from a request had status 400 or greater.\n * @property {NETWORK} CLIENT_GRAPHQL_REQUEST_ERROR The response from a request to GraphQL contained an error.\n * @property {MERCHANT} CLIENT_RATE_LIMITED The response from a request had a status of 429, indicating rate limiting.\n * @property {MERCHANT} CLIENT_AUTHORIZATION_INSUFFICIENT The user associated with the client token or tokenization key does not have permissions to make the request.\n * @property {MERCHANT} CLIENT_AUTHORIZATION_INVALID The provided authorization could not be found. Either the client token has expired and a new client token must be generated or the tokenization key used is set to be inactive or has been deleted.\n */\n\nvar BraintreeError = _dereq_(\"../lib/braintree-error\");\n\nmodule.exports = {\n  CLIENT_GATEWAY_CONFIGURATION_INVALID_DOMAIN: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"CLIENT_GATEWAY_CONFIGURATION_INVALID_DOMAIN\",\n  },\n  CLIENT_OPTION_REQUIRED: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"CLIENT_OPTION_REQUIRED\",\n  },\n  CLIENT_OPTION_INVALID: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"CLIENT_OPTION_INVALID\",\n  },\n  CLIENT_MISSING_GATEWAY_CONFIGURATION: {\n    type: BraintreeError.types.INTERNAL,\n    code: \"CLIENT_MISSING_GATEWAY_CONFIGURATION\",\n    message: \"Missing gatewayConfiguration.\",\n  },\n  CLIENT_INVALID_AUTHORIZATION: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"CLIENT_INVALID_AUTHORIZATION\",\n    message:\n      \"Authorization is invalid. Make sure your client token or tokenization key is valid.\",\n  },\n  CLIENT_GATEWAY_NETWORK: {\n    type: BraintreeError.types.NETWORK,\n    code: \"CLIENT_GATEWAY_NETWORK\",\n    message: \"Cannot contact the gateway at this time.\",\n  },\n  CLIENT_REQUEST_TIMEOUT: {\n    type: BraintreeError.types.NETWORK,\n    code: \"CLIENT_REQUEST_TIMEOUT\",\n    message: \"Request timed out waiting for a reply.\",\n  },\n  CLIENT_REQUEST_ERROR: {\n    type: BraintreeError.types.NETWORK,\n    code: \"CLIENT_REQUEST_ERROR\",\n    message: \"There was a problem with your request.\",\n  },\n  CLIENT_GRAPHQL_REQUEST_ERROR: {\n    type: BraintreeError.types.NETWORK,\n    code: \"CLIENT_GRAPHQL_REQUEST_ERROR\",\n    message: \"There was a problem with your request.\",\n  },\n  CLIENT_RATE_LIMITED: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"CLIENT_RATE_LIMITED\",\n    message: \"You are being rate-limited; please try again in a few minutes.\",\n  },\n  CLIENT_AUTHORIZATION_INSUFFICIENT: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"CLIENT_AUTHORIZATION_INSUFFICIENT\",\n    message: \"The authorization used has insufficient privileges.\",\n  },\n  CLIENT_AUTHORIZATION_INVALID: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"CLIENT_AUTHORIZATION_INVALID\",\n    message:\n      \"Either the client token has expired and a new one should be generated or the tokenization key has been deactivated or deleted.\",\n  },\n};\n\n},{\"../lib/braintree-error\":148}],98:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar BraintreeError = _dereq_(\"../lib/braintree-error\");\nvar wrapPromise = _dereq_(\"@braintree/wrap-promise\");\nvar request = _dereq_(\"./request\");\nvar uuid = _dereq_(\"@braintree/uuid\");\nvar constants = _dereq_(\"../lib/constants\");\nvar errors = _dereq_(\"./errors\");\nvar GraphQL = _dereq_(\"./request/graphql\");\nvar GRAPHQL_URLS = _dereq_(\"../lib/constants\").GRAPHQL_URLS;\nvar isDateStringBeforeOrOn = _dereq_(\"../lib/is-date-string-before-or-on\");\n\nvar BRAINTREE_VERSION = _dereq_(\"./constants\").BRAINTREE_VERSION;\n\nfunction getConfiguration(authData, inputSessionId) {\n  return new Promise(function (resolve, reject) {\n    var configuration, attrs, configUrl, reqOptions;\n    var sessionId = inputSessionId || uuid();\n    var analyticsMetadata = {\n      merchantAppId: window.location.host,\n      platform: constants.PLATFORM,\n      sdkVersion: constants.VERSION,\n      source: constants.SOURCE,\n      // NEXT_MAJOR_VERSION remove one of these to not duplicate data. Target parity with mobile platforms approach.\n      integration: constants.INTEGRATION,\n      integrationType: constants.INTEGRATION,\n      sessionId: sessionId,\n    };\n\n    attrs = authData.attrs;\n    configUrl = authData.configUrl;\n\n    attrs._meta = analyticsMetadata;\n    attrs.braintreeLibraryVersion = constants.BRAINTREE_LIBRARY_VERSION;\n    attrs.configVersion = \"3\";\n\n    reqOptions = {\n      url: configUrl,\n      method: \"GET\",\n      data: attrs,\n    };\n\n    if (attrs.authorizationFingerprint && authData.graphQL) {\n      if (isDateStringBeforeOrOn(authData.graphQL.date, BRAINTREE_VERSION)) {\n        reqOptions.graphQL = new GraphQL({\n          graphQL: {\n            url: authData.graphQL.url,\n            features: [\"configuration\"],\n          },\n        });\n      }\n\n      reqOptions.metadata = analyticsMetadata;\n    } else if (attrs.tokenizationKey) {\n      reqOptions.graphQL = new GraphQL({\n        graphQL: {\n          url: GRAPHQL_URLS[authData.environment],\n          features: [\"configuration\"],\n        },\n      });\n\n      reqOptions.metadata = analyticsMetadata;\n    }\n\n    request(reqOptions, function (err, response, status) {\n      var errorTemplate;\n\n      if (err) {\n        if (status === 403) {\n          errorTemplate = errors.CLIENT_AUTHORIZATION_INSUFFICIENT;\n        } else if (status === 401) {\n          errorTemplate = errors.CLIENT_AUTHORIZATION_INVALID;\n        } else {\n          errorTemplate = errors.CLIENT_GATEWAY_NETWORK;\n        }\n\n        reject(\n          new BraintreeError({\n            type: errorTemplate.type,\n            code: errorTemplate.code,\n            message: errorTemplate.message,\n            details: {\n              originalError: err,\n            },\n          })\n        );\n\n        return;\n      }\n\n      configuration = {\n        authorizationType: attrs.tokenizationKey\n          ? \"TOKENIZATION_KEY\"\n          : \"CLIENT_TOKEN\",\n        authorizationFingerprint: attrs.authorizationFingerprint,\n        analyticsMetadata: analyticsMetadata,\n        gatewayConfiguration: response,\n      };\n\n      resolve(configuration);\n    });\n  });\n}\n\nmodule.exports = {\n  getConfiguration: wrapPromise(getConfiguration),\n};\n\n},{\"../lib/braintree-error\":148,\"../lib/constants\":149,\"../lib/is-date-string-before-or-on\":175,\"./constants\":96,\"./errors\":97,\"./request\":111,\"./request/graphql\":109,\"@braintree/uuid\":39,\"@braintree/wrap-promise\":43}],99:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar BraintreeError = _dereq_(\"../lib/braintree-error\");\nvar Client = _dereq_(\"./client\");\nvar VERSION = \"3.134.0\";\nvar wrapPromise = _dereq_(\"@braintree/wrap-promise\");\nvar sharedErrors = _dereq_(\"../lib/errors\");\n\n/** @module braintree-web/client */\n\n/**\n * @function create\n * @description This function is the entry point for the <code>braintree.client</code> module. It is used for creating {@link Client} instances that service communication to Braintree servers.\n * @param {object} options Object containing all {@link Client} options:\n * @param {string} options.authorization A tokenizationKey or clientToken.\n * @param {callback} [callback] The second argument, <code>data</code>, is the {@link Client} instance.\n * @returns {(Promise|void)} Returns a promise if no callback is provided.\n * @example\n * var createClient = require('braintree-web/client').create;\n *\n * createClient({\n *   authorization: CLIENT_AUTHORIZATION\n * }, function (createErr, clientInstance) {\n *   if (createErr) {\n *     if (createErr.code === 'CLIENT_AUTHORIZATION_INVALID') {\n *       // either the client token has expired, and a new one should be generated\n *       // or the tokenization key was deactivated or deleted\n *     } else {\n *       console.log('something went wrong creating the client instance', createErr);\n *     }\n *     return;\n *   }\n *\n *  // set up other components\n * });\n * @static\n */\nfunction create(options) {\n  if (!options.authorization) {\n    return Promise.reject(\n      new BraintreeError({\n        type: sharedErrors.INSTANTIATION_OPTION_REQUIRED.type,\n        code: sharedErrors.INSTANTIATION_OPTION_REQUIRED.code,\n        message:\n          \"options.authorization is required when instantiating a client.\",\n      })\n    );\n  }\n\n  return Client.initialize(options);\n}\n\nmodule.exports = {\n  create: wrapPromise(create),\n  /**\n   * @description The current version of the SDK, i.e. `{@pkg version}`.\n   * @type {string}\n   */\n  VERSION: VERSION,\n};\n\n},{\"../lib/braintree-error\":148,\"../lib/errors\":158,\"./client\":95,\"@braintree/wrap-promise\":43}],100:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar querystring = _dereq_(\"../../lib/querystring\");\nvar assign = _dereq_(\"../../lib/assign\").assign;\nvar prepBody = _dereq_(\"./prep-body\");\nvar parseBody = _dereq_(\"./parse-body\");\nvar xhr = _dereq_(\"./xhr\");\nvar isXHRAvailable = xhr.isAvailable;\nvar GraphQLRequest = _dereq_(\"./graphql/request\");\nvar DefaultRequest = _dereq_(\"./default-request\");\n\nvar MAX_TCP_RETRYCOUNT = 1;\nvar TCP_PRECONNECT_BUG_STATUS_CODE = 408;\nvar PAYPAL_HERMES_CREATE_PAYMENT_RESOURCE_PATTERN =\n  /\\/client_api\\/v1\\/paypal_hermes\\/create_payment_resource/;\nvar MERCHANT_ID_PATTERN = /\\/merchants\\/[A-Za-z0-9_-]+\\/client_api/;\n\nfunction requestShouldRetry(status) {\n  return !status || status === TCP_PRECONNECT_BUG_STATUS_CODE;\n}\n\nfunction sendApiLatencyAnalytics(url, analyticsStartTime, options) {\n  var domain, path, cleanedPath, parsedUrl;\n  var analyticsConnectionStartTime, analyticsRequestStartTime, analyticsEndTime;\n  var finalStartTime;\n  var entries, entry;\n\n  try {\n    parsedUrl = new URL(url);\n    domain = parsedUrl.hostname;\n    path = parsedUrl.pathname;\n    // eslint-disable-next-line no-unused-vars\n  } catch (e) {\n    domain = (url.match(/^https?:\\/\\/([^\\/]+)/) || [])[1] || \"\";\n    path = (url.match(/^https?:\\/\\/[^\\/]+(\\/.*)$/) || [])[1] || url;\n  }\n  cleanedPath = path.replace(MERCHANT_ID_PATTERN, \"\");\n\n  finalStartTime = analyticsStartTime;\n  analyticsEndTime = Date.now();\n\n  if (\n    typeof window !== \"undefined\" &&\n    window.performance &&\n    window.performance.getEntriesByName\n  ) {\n    entries = window.performance.getEntriesByName(url);\n    if (entries && entries.length > 0) {\n      entry = entries[entries.length - 1];\n      analyticsConnectionStartTime = entry.connectStart\n        ? Math.round(entry.connectStart)\n        : null;\n      analyticsRequestStartTime = entry.requestStart\n        ? Math.round(entry.requestStart)\n        : null;\n      finalStartTime = Math.round(entry.startTime);\n      analyticsEndTime = Math.round(entry.responseEnd);\n    }\n  }\n\n  options.sendAnalyticsEvent(\"core.api-request-latency\", {\n    connectionStartTime: analyticsConnectionStartTime,\n    domain: domain,\n    endpoint: cleanedPath,\n    endTime: analyticsEndTime,\n    requestStartTime: analyticsRequestStartTime,\n    startTime: finalStartTime,\n  });\n}\n\nfunction graphQLRequestShouldRetryWithClientApi(body) {\n  var errorClass =\n    !body.data &&\n    body.errors &&\n    body.errors[0] &&\n    body.errors[0].extensions &&\n    body.errors[0].extensions.errorClass;\n\n  return errorClass === \"UNKNOWN\" || errorClass === \"INTERNAL\";\n}\n\nfunction _requestWithRetry(options, tcpRetryCount, cb) {\n  var status, resBody, ajaxRequest, body, method, headers, parsedBody;\n  var analyticsStartTime = Date.now();\n  var url = options.url;\n  var graphQL = options.graphQL;\n  var timeout = options.timeout;\n  var req = xhr.getRequestObject();\n  var callback = cb;\n  var isGraphQLRequest = Boolean(\n    graphQL && graphQL.isGraphQLRequest(url, options.data)\n  );\n\n  options.headers = assign(\n    { \"Content-Type\": \"application/json\" },\n    options.headers\n  );\n\n  if (isGraphQLRequest) {\n    ajaxRequest = new GraphQLRequest(options);\n  } else {\n    ajaxRequest = new DefaultRequest(options);\n  }\n\n  url = ajaxRequest.getUrl();\n  body = ajaxRequest.getBody();\n  method = ajaxRequest.getMethod();\n  headers = ajaxRequest.getHeaders();\n\n  if (method === \"GET\") {\n    url = querystring.queryify(url, body);\n    body = null;\n  }\n\n  if (isXHRAvailable) {\n    req.onreadystatechange = function () {\n      if (req.readyState !== 4) {\n        return;\n      }\n\n      if (req.status === 0 && isGraphQLRequest) {\n        // If a merchant experiences a connection\n        // issue to the GraphQL endpoint (possibly\n        // due to a Content Security Policy), retry\n        // the request against the old client API.\n        delete options.graphQL;\n        _requestWithRetry(options, tcpRetryCount, cb);\n\n        return;\n      }\n\n      parsedBody = parseBody(req.responseText);\n      resBody = ajaxRequest.adaptResponseBody(parsedBody);\n      status = ajaxRequest.determineStatus(req.status, parsedBody);\n\n      if (\n        PAYPAL_HERMES_CREATE_PAYMENT_RESOURCE_PATTERN.test(url) &&\n        options.sendAnalyticsEvent\n      ) {\n        sendApiLatencyAnalytics(url, analyticsStartTime, options);\n      }\n\n      if (status >= 400 || status < 200) {\n        if (\n          isGraphQLRequest &&\n          graphQLRequestShouldRetryWithClientApi(parsedBody)\n        ) {\n          delete options.graphQL;\n          _requestWithRetry(options, tcpRetryCount, cb);\n\n          return;\n        }\n\n        if (tcpRetryCount < MAX_TCP_RETRYCOUNT && requestShouldRetry(status)) {\n          tcpRetryCount++;\n          _requestWithRetry(options, tcpRetryCount, cb);\n\n          return;\n        }\n        callback(resBody || \"error\", null, status || 500);\n      } else {\n        callback(null, resBody, status);\n      }\n    };\n  } else {\n    if (options.headers) {\n      url = querystring.queryify(url, headers);\n    }\n\n    req.onload = function () {\n      callback(null, parseBody(req.responseText), req.status);\n    };\n\n    req.onerror = function () {\n      // XDomainRequest does not report a body or status for errors, so\n      // hardcode to 'error' and 500, respectively\n      callback(\"error\", null, 500);\n    };\n\n    // This must remain for IE9 to work\n    req.onprogress = function () {};\n\n    req.ontimeout = function () {\n      callback(\"timeout\", null, -1);\n    };\n  }\n\n  try {\n    req.open(method, url, true);\n  } catch (requestOpenError) {\n    // If a merchant has a Content Security Policy and they have\n    // not allowed our endpoints, some browsers may\n    // synchronously throw an error. If it is not a GraphQL\n    // request, we throw the error. If it is a GraphQL request\n    // we remove the GraphQL option and try the request against\n    // the old client API.\n    if (!isGraphQLRequest) {\n      throw requestOpenError;\n    }\n\n    delete options.graphQL;\n\n    _requestWithRetry(options, tcpRetryCount, cb);\n\n    return;\n  }\n\n  req.timeout = timeout;\n\n  if (isXHRAvailable) {\n    Object.keys(headers).forEach(function (headerKey) {\n      req.setRequestHeader(headerKey, headers[headerKey]);\n    });\n  }\n\n  try {\n    req.send(prepBody(method, body));\n    // eslint-disable-next-line no-unused-vars\n  } catch (err) {\n    /* ignored */\n  }\n}\n\nfunction request(options, cb) {\n  _requestWithRetry(options, 0, cb);\n}\n\nmodule.exports = {\n  request: request,\n};\n\n},{\"../../lib/assign\":145,\"../../lib/querystring\":182,\"./default-request\":101,\"./graphql/request\":110,\"./parse-body\":112,\"./prep-body\":113,\"./xhr\":114}],101:[function(_dereq_,module,exports){\n\"use strict\";\n\nfunction DefaultRequest(options) {\n  this._url = options.url;\n  this._data = options.data;\n  this._method = options.method;\n  this._headers = options.headers;\n}\n\nDefaultRequest.prototype.getUrl = function () {\n  return this._url;\n};\n\nDefaultRequest.prototype.getBody = function () {\n  return this._data;\n};\n\nDefaultRequest.prototype.getMethod = function () {\n  return this._method;\n};\n\nDefaultRequest.prototype.getHeaders = function () {\n  return this._headers;\n};\n\nDefaultRequest.prototype.adaptResponseBody = function (parsedBody) {\n  return parsedBody;\n};\n\nDefaultRequest.prototype.determineStatus = function (status) {\n  return status;\n};\n\nmodule.exports = DefaultRequest;\n\n},{}],102:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar errorResponseAdapter = _dereq_(\"./error\");\nvar assign = _dereq_(\"../../../../lib/assign\").assign;\n\nvar cardTypeTransforms = {\n  creditCard: {\n    AMERICAN_EXPRESS: \"American Express\",\n    DISCOVER: \"Discover\",\n    INTERNATIONAL_MAESTRO: \"Maestro\",\n    JCB: \"JCB\",\n    MASTERCARD: \"MasterCard\",\n    SOLO: \"Solo\",\n    UK_MAESTRO: \"UK Maestro\",\n    UNION_PAY: \"UnionPay\",\n    VISA: \"Visa\",\n    ELO: \"Elo\",\n    HIPER: \"Hiper\",\n    HIPERCARD: \"Hipercard\",\n  },\n  applePayWeb: {\n    VISA: \"visa\",\n    MASTERCARD: \"mastercard\",\n    DISCOVER: \"discover\",\n    AMERICAN_EXPRESS: \"amex\",\n    INTERNATIONAL_MAESTRO: \"maestro\",\n    ELO: \"elo\",\n  },\n  visaCheckout: {\n    VISA: \"Visa\",\n    MASTERCARD: \"MasterCard\",\n    DISCOVER: \"Discover\",\n    AMERICAN_EXPRESS: \"American Express\",\n  },\n  googlePay: {\n    VISA: \"visa\",\n    MASTERCARD: \"mastercard\",\n    DISCOVER: \"discover\",\n    AMERICAN_EXPRESS: \"amex\",\n    INTERNATIONAL_MAESTRO: \"maestro\",\n    ELO: \"elo\",\n  },\n  masterpass: {\n    VISA: \"visa\",\n    MASTERCARD: \"master\",\n    DISCOVER: \"discover\",\n    AMERICAN_EXPRESS: \"amex\",\n    DINERS: \"diners\",\n    INTERNATIONAL_MAESTRO: \"maestro\",\n    JCB: \"jcb\",\n  },\n};\n\nfunction configurationResponseAdapter(responseBody, ctx) {\n  var adaptedResponse;\n\n  if (responseBody.data && !responseBody.errors) {\n    adaptedResponse = adaptConfigurationResponseBody(responseBody, ctx);\n  } else {\n    adaptedResponse = errorResponseAdapter(responseBody);\n  }\n\n  return adaptedResponse;\n}\n\nfunction adaptConfigurationResponseBody(body, ctx) {\n  var configuration = body.data.clientConfiguration;\n  var response;\n\n  response = {\n    environment: configuration.environment.toLowerCase(),\n    clientApiUrl: configuration.clientApiUrl,\n    assetsUrl: configuration.assetsUrl,\n    analytics: {\n      url: configuration.analyticsUrl,\n    },\n    merchantId: configuration.merchantId,\n    venmo: \"off\",\n  };\n\n  if (configuration.supportedFeatures) {\n    response.graphQL = {\n      url: ctx._graphQL._config.url,\n      features: configuration.supportedFeatures.map(function (feature) {\n        return feature.toLowerCase();\n      }),\n    };\n  }\n\n  if (configuration.braintreeApi) {\n    response.braintreeApi = configuration.braintreeApi;\n  }\n\n  if (configuration.applePayWeb) {\n    response.applePayWeb = configuration.applePayWeb;\n    response.applePayWeb.supportedNetworks = mapCardTypes(\n      configuration.applePayWeb.supportedCardBrands,\n      cardTypeTransforms.applePayWeb\n    );\n\n    delete response.applePayWeb.supportedCardBrands;\n  }\n\n  if (configuration.fastlane) {\n    response.fastlane = configuration.fastlane;\n  }\n\n  if (configuration.ideal) {\n    response.ideal = configuration.ideal;\n  }\n\n  if (configuration.creditCard) {\n    response.challenges = configuration.creditCard.challenges.map(\n      function (challenge) {\n        return challenge.toLowerCase();\n      }\n    );\n\n    response.creditCards = {\n      supportedCardTypes: mapCardTypes(\n        configuration.creditCard.supportedCardBrands,\n        cardTypeTransforms.creditCard\n      ),\n    };\n    response.threeDSecureEnabled = configuration.creditCard.threeDSecureEnabled;\n    response.threeDSecure = configuration.creditCard.threeDSecure;\n  } else {\n    response.challenges = [];\n    response.creditCards = {\n      supportedCardTypes: [],\n    };\n    response.threeDSecureEnabled = false;\n  }\n\n  if (configuration.googlePay) {\n    response.androidPay = {\n      displayName: configuration.googlePay.displayName,\n      enabled: true,\n      environment: configuration.googlePay.environment.toLowerCase(),\n      googleAuthorizationFingerprint:\n        configuration.googlePay.googleAuthorization,\n      paypalClientId: configuration.googlePay.paypalClientId,\n      supportedNetworks: mapCardTypes(\n        configuration.googlePay.supportedCardBrands,\n        cardTypeTransforms.googlePay\n      ),\n    };\n  }\n\n  if (configuration.venmo) {\n    response.payWithVenmo = {\n      merchantId: configuration.venmo.merchantId,\n      accessToken: configuration.venmo.accessToken,\n      environment: configuration.venmo.environment.toLowerCase(),\n      enrichedCustomerDataEnabled:\n        configuration.venmo.enrichedCustomerDataEnabled,\n    };\n  }\n\n  if (configuration.paypal) {\n    response.paypalEnabled = true;\n    response.paypal = assign({}, configuration.paypal);\n    response.paypal.currencyIsoCode = response.paypal.currencyCode;\n    response.paypal.environment = response.paypal.environment.toLowerCase();\n\n    delete response.paypal.currencyCode;\n  } else {\n    response.paypalEnabled = false;\n  }\n\n  if (configuration.unionPay) {\n    response.unionPay = {\n      enabled: true,\n      merchantAccountId: configuration.unionPay.merchantAccountId,\n    };\n  }\n\n  if (configuration.visaCheckout) {\n    response.visaCheckout = {\n      apikey: configuration.visaCheckout.apiKey,\n      encryptionKey: configuration.visaCheckout.encryptionKey,\n      externalClientId: configuration.visaCheckout.externalClientId,\n      supportedCardTypes: mapCardTypes(\n        configuration.visaCheckout.supportedCardBrands,\n        cardTypeTransforms.visaCheckout\n      ),\n    };\n  }\n\n  if (configuration.masterpass) {\n    response.masterpass = {\n      merchantCheckoutId: configuration.masterpass.merchantCheckoutId,\n      supportedNetworks: mapCardTypes(\n        configuration.masterpass.supportedCardBrands,\n        cardTypeTransforms.masterpass\n      ),\n    };\n  }\n\n  if (configuration.usBankAccount) {\n    response.usBankAccount = {\n      routeId: configuration.usBankAccount.routeId,\n      plaid: {\n        publicKey: configuration.usBankAccount.plaidPublicKey,\n      },\n    };\n  }\n\n  if (configuration.openBanking) {\n    response.openBanking = {\n      businessNames: configuration.openBanking.businessNames,\n      allowListedDomains: configuration.openBanking.allowListedDomains,\n      profileId: configuration.openBanking.profileId,\n    };\n  }\n\n  return response;\n}\n\nfunction mapCardTypes(cardTypes, cardTypeTransformMap) {\n  return cardTypes.reduce(function (acc, type) {\n    if (cardTypeTransformMap.hasOwnProperty(type)) {\n      return acc.concat(cardTypeTransformMap[type]);\n    }\n\n    return acc;\n  }, []);\n}\n\nmodule.exports = configurationResponseAdapter;\n\n},{\"../../../../lib/assign\":145,\"./error\":105}],103:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar errorResponseAdapter = _dereq_(\"./error\");\n\nvar CARD_BRAND_MAP = {\n  AMERICAN_EXPRESS: \"American Express\",\n  DINERS: \"Discover\",\n  DISCOVER: \"Discover\",\n  ELO: \"Elo\",\n  HIPER: \"Hiper\",\n  HIPERCARD: \"Hipercard\",\n  INTERNATIONAL_MAESTRO: \"Maestro\",\n  JCB: \"JCB\",\n  MASTERCARD: \"MasterCard\",\n  UK_MAESTRO: \"Maestro\",\n  UNION_PAY: \"UnionPay\",\n  VISA: \"Visa\",\n};\n\nvar BIN_DATA_MAP = {\n  YES: \"Yes\",\n  NO: \"No\",\n  UNKNOWN: \"Unknown\",\n};\n\nvar AUTHENTICATION_INSIGHT_MAP = {\n  PSDTWO: \"psd2\",\n};\n\nfunction creditCardTokenizationFastlaneResponseAdapter(responseBody) {\n  var adaptedResponse;\n\n  if (responseBody.data && !responseBody.errors) {\n    adaptedResponse =\n      adaptTokenizeCreditCardForFastlaneResponseBody(responseBody);\n  } else {\n    adaptedResponse = errorResponseAdapter(responseBody);\n  }\n\n  return adaptedResponse;\n}\n\nfunction adaptTokenizeCreditCardForFastlaneResponseBody(body) {\n  var data = body.data.tokenizeCreditCardForPayPalConnect;\n  var creditCard = data.paymentMethod.details;\n  var lastTwo = creditCard.last4 ? creditCard.last4.substr(2, 4) : \"\";\n  var binData = creditCard.binData;\n  var response, regulationEnvironment;\n\n  if (binData) {\n    [\n      \"commercial\",\n      \"debit\",\n      \"durbinRegulated\",\n      \"healthcare\",\n      \"payroll\",\n      \"prepaid\",\n    ].forEach(function (key) {\n      if (binData[key]) {\n        binData[key] = BIN_DATA_MAP[binData[key]];\n      } else {\n        binData[key] = \"Unknown\";\n      }\n    });\n\n    [\n      \"issuingBank\",\n      \"countryOfIssuance\",\n      \"productId\",\n      \"business\",\n      \"consumer\",\n      \"purchase\",\n      \"corporate\",\n    ].forEach(function (key) {\n      if (!binData[key]) {\n        binData[key] = \"Unknown\";\n      }\n    });\n  }\n\n  response = {\n    creditCards: [\n      {\n        binData: binData,\n        consumed: false,\n        description: lastTwo ? \"ending in \" + lastTwo : \"\",\n        nonce: data.paymentMethod.id,\n        details: {\n          cardholderName: creditCard.cardholderName,\n          expirationMonth: creditCard.expirationMonth,\n          expirationYear: creditCard.expirationYear,\n          bin: creditCard.bin || \"\",\n          cardType: CARD_BRAND_MAP[creditCard.brandCode] || \"Unknown\",\n          lastFour: creditCard.last4 || \"\",\n          lastTwo: lastTwo,\n        },\n        type: \"CreditCard\",\n        threeDSecureInfo: null,\n      },\n    ],\n  };\n\n  if (data.authenticationInsight) {\n    regulationEnvironment =\n      data.authenticationInsight.customerAuthenticationRegulationEnvironment;\n    response.creditCards[0].authenticationInsight = {\n      regulationEnvironment:\n        AUTHENTICATION_INSIGHT_MAP[regulationEnvironment] ||\n        regulationEnvironment.toLowerCase(),\n    };\n  }\n\n  return response;\n}\n\nmodule.exports = creditCardTokenizationFastlaneResponseAdapter;\n\n},{\"./error\":105}],104:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar errorResponseAdapter = _dereq_(\"./error\");\n\nvar CARD_BRAND_MAP = {\n  AMERICAN_EXPRESS: \"American Express\",\n  DINERS: \"Discover\",\n  DISCOVER: \"Discover\",\n  ELO: \"Elo\",\n  HIPER: \"Hiper\",\n  HIPERCARD: \"Hipercard\",\n  INTERNATIONAL_MAESTRO: \"Maestro\",\n  JCB: \"JCB\",\n  MASTERCARD: \"MasterCard\",\n  UK_MAESTRO: \"Maestro\",\n  UNION_PAY: \"UnionPay\",\n  VISA: \"Visa\",\n};\n\nvar BIN_DATA_MAP = {\n  YES: \"Yes\",\n  NO: \"No\",\n  UNKNOWN: \"Unknown\",\n};\n\nvar AUTHENTICATION_INSIGHT_MAP = {\n  PSDTWO: \"psd2\",\n};\n\nfunction creditCardTokenizationResponseAdapter(responseBody) {\n  var adaptedResponse;\n\n  if (responseBody.data && !responseBody.errors) {\n    adaptedResponse = adaptTokenizeCreditCardResponseBody(responseBody);\n  } else {\n    adaptedResponse = errorResponseAdapter(responseBody);\n  }\n\n  return adaptedResponse;\n}\n\nfunction adaptTokenizeCreditCardResponseBody(body) {\n  var data = body.data.tokenizeCreditCard;\n  var creditCard = data.creditCard;\n  var lastTwo = creditCard.last4 ? creditCard.last4.substr(2, 4) : \"\";\n  var binData = creditCard.binData;\n  var response, regulationEnvironment;\n\n  if (binData) {\n    [\n      \"commercial\",\n      \"debit\",\n      \"durbinRegulated\",\n      \"healthcare\",\n      \"payroll\",\n      \"prepaid\",\n    ].forEach(function (key) {\n      if (binData[key]) {\n        binData[key] = BIN_DATA_MAP[binData[key]];\n      } else {\n        binData[key] = \"Unknown\";\n      }\n    });\n\n    [\n      \"issuingBank\",\n      \"countryOfIssuance\",\n      \"productId\",\n      \"business\",\n      \"consumer\",\n      \"purchase\",\n      \"corporate\",\n    ].forEach(function (key) {\n      if (!binData[key]) {\n        binData[key] = \"Unknown\";\n      }\n    });\n  }\n\n  response = {\n    creditCards: [\n      {\n        binData: binData,\n        consumed: false,\n        description: lastTwo ? \"ending in \" + lastTwo : \"\",\n        nonce: data.token,\n        details: {\n          cardholderName: creditCard.cardholderName,\n          expirationMonth: creditCard.expirationMonth,\n          expirationYear: creditCard.expirationYear,\n          bin: creditCard.bin || \"\",\n          cardType: CARD_BRAND_MAP[creditCard.brandCode] || \"Unknown\",\n          lastFour: creditCard.last4 || \"\",\n          lastTwo: lastTwo,\n        },\n        type: \"CreditCard\",\n        threeDSecureInfo: null,\n      },\n    ],\n  };\n\n  if (data.authenticationInsight) {\n    regulationEnvironment =\n      data.authenticationInsight.customerAuthenticationRegulationEnvironment;\n    response.creditCards[0].authenticationInsight = {\n      regulationEnvironment:\n        AUTHENTICATION_INSIGHT_MAP[regulationEnvironment] ||\n        regulationEnvironment.toLowerCase(),\n    };\n  }\n\n  return response;\n}\n\nmodule.exports = creditCardTokenizationResponseAdapter;\n\n},{\"./error\":105}],105:[function(_dereq_,module,exports){\n\"use strict\";\n\nfunction errorResponseAdapter(responseBody) {\n  var response;\n  var errorClass =\n    responseBody.errors &&\n    responseBody.errors[0] &&\n    responseBody.errors[0].extensions &&\n    responseBody.errors[0].extensions.errorClass;\n\n  if (errorClass === \"VALIDATION\") {\n    response = userErrorResponseAdapter(responseBody);\n  } else if (errorClass) {\n    response = errorWithClassResponseAdapter(responseBody);\n  } else {\n    response = {\n      error: { message: \"There was a problem serving your request\" },\n      fieldErrors: [],\n    };\n  }\n\n  return response;\n}\n\nfunction errorWithClassResponseAdapter(responseBody) {\n  return {\n    error: { message: responseBody.errors[0].message },\n    fieldErrors: [],\n  };\n}\n\nfunction userErrorResponseAdapter(responseBody) {\n  var fieldErrors = buildFieldErrors(responseBody.errors);\n\n  if (fieldErrors.length === 0) {\n    return { error: { message: responseBody.errors[0].message } };\n  }\n\n  return {\n    error: { message: getLegacyMessage(fieldErrors) },\n    fieldErrors: fieldErrors,\n  };\n}\n\nfunction buildFieldErrors(errors) {\n  var fieldErrors = [];\n\n  errors.forEach(function (error) {\n    if (!(error.extensions && error.extensions.inputPath)) {\n      return;\n    }\n    addFieldError(error.extensions.inputPath.slice(1), error, fieldErrors);\n  });\n\n  return fieldErrors;\n}\n\nfunction addFieldError(inputPath, errorDetail, fieldErrors) {\n  var fieldError;\n  var legacyCode = errorDetail.extensions.legacyCode;\n  var inputField = inputPath[0];\n\n  if (inputPath.length === 1) {\n    fieldErrors.push({\n      code: legacyCode,\n      field: inputField,\n      message: errorDetail.message,\n    });\n\n    return;\n  }\n\n  fieldErrors.forEach(function (candidate) {\n    if (candidate.field === inputField) {\n      fieldError = candidate;\n    }\n  });\n\n  if (!fieldError) {\n    fieldError = { field: inputField, fieldErrors: [] };\n    fieldErrors.push(fieldError);\n  }\n\n  addFieldError(inputPath.slice(1), errorDetail, fieldError.fieldErrors);\n}\n\nfunction getLegacyMessage(errors) {\n  var legacyMessages = {\n    creditCard: \"Credit card is invalid\",\n  };\n\n  var field = errors[0].field;\n\n  return legacyMessages[field];\n}\n\nmodule.exports = errorResponseAdapter;\n\n},{}],106:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar CONFIGURATION_QUERY =\n  \"query ClientConfiguration { \" +\n  \"  clientConfiguration { \" +\n  \"    analyticsUrl \" +\n  \"    environment \" +\n  \"    merchantId \" +\n  \"    assetsUrl \" +\n  \"    clientApiUrl \" +\n  \"    creditCard { \" +\n  \"      supportedCardBrands \" +\n  \"      challenges \" +\n  \"      threeDSecureEnabled \" +\n  \"      threeDSecure { \" +\n  \"        cardinalAuthenticationJWT \" +\n  \"        cardinalSongbirdUrl \" +\n  \"        cardinalSongbirdIdentityHash \" +\n  \"      } \" +\n  \"    } \" +\n  \"    applePayWeb { \" +\n  \"      countryCode \" +\n  \"      currencyCode \" +\n  \"      merchantIdentifier \" +\n  \"      supportedCardBrands \" +\n  \"    } \" +\n  \"    fastlane { \" +\n  \"      enabled \" +\n  \"      tokensOnDemand { \" +\n  \"        enabled \" +\n  \"        tokenExchange { \" +\n  \"          enabled \" +\n  \"        } \" +\n  \"      } \" +\n  \"    } \" +\n  \"    googlePay { \" +\n  \"      displayName \" +\n  \"      supportedCardBrands \" +\n  \"      environment \" +\n  \"      googleAuthorization \" +\n  \"      paypalClientId \" +\n  \"    } \" +\n  \"    ideal { \" +\n  \"      routeId \" +\n  \"      assetsUrl \" +\n  \"    } \" +\n  \"    masterpass { \" +\n  \"      merchantCheckoutId \" +\n  \"      supportedCardBrands \" +\n  \"    } \" +\n  \"    openBanking { \" +\n  \"      businessNames \" +\n  \"      allowListedDomains \" +\n  \"      profileId \" +\n  \"    } \" +\n  \"    paypal { \" +\n  \"      displayName \" +\n  \"      clientId \" +\n  \"      assetsUrl \" +\n  \"      environment \" +\n  \"      environmentNoNetwork \" +\n  \"      unvettedMerchant \" +\n  \"      braintreeClientId \" +\n  \"      billingAgreementsEnabled \" +\n  \"      merchantAccountId \" +\n  \"      currencyCode \" +\n  \"      payeeEmail \" +\n  \"    } \" +\n  \"    unionPay { \" +\n  \"      merchantAccountId \" +\n  \"    } \" +\n  \"    usBankAccount { \" +\n  \"      routeId \" +\n  \"      plaidPublicKey \" +\n  \"    } \" +\n  \"    venmo { \" +\n  \"      merchantId \" +\n  \"      accessToken \" +\n  \"      environment \" +\n  \"      enrichedCustomerDataEnabled\" +\n  \"    } \" +\n  \"    visaCheckout { \" +\n  \"      apiKey \" +\n  \"      externalClientId \" +\n  \"      supportedCardBrands \" +\n  \"    } \" +\n  \"    braintreeApi { \" +\n  \"      accessToken \" +\n  \"      url \" +\n  \"    } \" +\n  \"    supportedFeatures \" +\n  \"  } \" +\n  \"}\";\n\nfunction configuration() {\n  return {\n    query: CONFIGURATION_QUERY,\n    operationName: \"ClientConfiguration\",\n  };\n}\n\nmodule.exports = configuration;\n\n},{}],107:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar assign = _dereq_(\"../../../../lib/assign\").assign;\n\nfunction createMutation(config) {\n  var hasAuthenticationInsight = config.hasAuthenticationInsight;\n  var mutation =\n    \"mutation TokenizeCreditCardForPayPalConnect($input: TokenizeCreditCardForPayPalConnectInput!\";\n\n  if (hasAuthenticationInsight) {\n    mutation += \", $authenticationInsightInput: AuthenticationInsightInput!\";\n  }\n\n  mutation +=\n    \") { \" +\n    \"  tokenizeCreditCardForPayPalConnect(input: $input) { \" +\n    \"    clientMutationId \" +\n    \"    paymentMethod { \" +\n    \"      id \" +\n    \"      details { \" +\n    \"        ... on CreditCardDetails { \" +\n    \"      bin \" +\n    \"      brandCode \" +\n    \"      last4 \" +\n    \"      cardholderName \" +\n    \"      expirationMonth\" +\n    \"      expirationYear\" +\n    \"      binData { \" +\n    \"        prepaid \" +\n    \"        healthcare \" +\n    \"        debit \" +\n    \"        durbinRegulated \" +\n    \"        commercial \" +\n    \"        payroll \" +\n    \"        issuingBank \" +\n    \"        countryOfIssuance \" +\n    \"        productId \" +\n    \"        business \" +\n    \"        consumer \" +\n    \"        purchase \" +\n    \"        corporate \" +\n    \"      } \" +\n    \"        } \" +\n    \"      } \" +\n    \"    }\";\n\n  if (hasAuthenticationInsight) {\n    mutation +=\n      \"    authenticationInsight(input: $authenticationInsightInput) {\" +\n      \"      customerAuthenticationRegulationEnvironment\" +\n      \"    }\";\n  }\n\n  mutation += \"  } }\";\n\n  return mutation;\n}\n\nfunction createCreditCardForFastlaneTokenizationBody(body, options) {\n  var creditCard = body.creditCard;\n  var fastlane = creditCard.fastlane || {};\n  var termsAndConditionsVersion =\n    \"fastlane\" in creditCard &&\n    \"termsAndConditionsVersion\" in creditCard.fastlane &&\n    creditCard.fastlane.termsAndConditionsVersion;\n  var termsAndConditionsCountry =\n    \"fastlane\" in creditCard &&\n    \"termsAndConditionsCountry\" in creditCard.fastlane &&\n    creditCard.fastlane.termsAndConditionsCountry;\n  var email = creditCard.email;\n  var optIn = \"hasBuyerConsent\" in fastlane && fastlane.hasBuyerConsent;\n  var shippingAddress = creditCard.shippingAddress;\n  var variables = createCreditCardTokenizationBody(body, options);\n\n  var ccpcVariables = assign({}, variables.input, {\n    email: email,\n    optIn: optIn,\n    phone: creditCard.phone,\n  });\n\n  if (termsAndConditionsVersion) {\n    ccpcVariables.termsAndConditionsVersion = termsAndConditionsVersion;\n  }\n\n  if (termsAndConditionsCountry) {\n    ccpcVariables.termsAndConditionsCountry = termsAndConditionsCountry;\n  }\n\n  if (\"authAssertion\" in fastlane) {\n    ccpcVariables.authAssertion = fastlane.authAssertion;\n  }\n\n  if (shippingAddress) {\n    ccpcVariables.shippingAddress = shippingAddress;\n  }\n\n  return { input: ccpcVariables };\n}\n\nfunction createCreditCardTokenizationBody(body, options) {\n  var cc = body.creditCard;\n  var billingAddress = cc && cc.billingAddress;\n  var expDate = cc && cc.expirationDate;\n  var expirationMonth =\n    cc && (cc.expirationMonth || (expDate && expDate.split(\"/\")[0].trim()));\n  var expirationYear =\n    cc && (cc.expirationYear || (expDate && expDate.split(\"/\")[1].trim()));\n  var variables = {\n    input: {\n      creditCard: {\n        number: cc && cc.number,\n        expirationMonth: expirationMonth,\n        expirationYear: expirationYear,\n        cvv: cc && cc.cvv,\n        cardholderName: cc && cc.cardholderName,\n      },\n\n      options: {},\n    },\n  };\n\n  if (options.hasAuthenticationInsight) {\n    variables.authenticationInsightInput = {\n      merchantAccountId: body.merchantAccountId,\n    };\n  }\n\n  if (billingAddress) {\n    variables.input.creditCard.billingAddress = billingAddress;\n  }\n\n  variables.input = addValidationRule(body, variables.input);\n\n  return variables;\n}\n\nfunction addValidationRule(body, input) {\n  var validate;\n\n  if (\n    body.creditCard &&\n    body.creditCard.options &&\n    typeof body.creditCard.options.validate === \"boolean\"\n  ) {\n    validate = body.creditCard.options.validate;\n  } else if (\n    (body.authorizationFingerprint && body.tokenizationKey) ||\n    body.authorizationFingerprint\n  ) {\n    validate = true;\n  } else if (body.tokenizationKey) {\n    validate = false;\n  }\n\n  if (typeof validate === \"boolean\") {\n    input.options = assign(\n      {\n        validate: validate,\n      },\n      input.options\n    );\n  }\n\n  return input;\n}\n\nfunction creditCardForFastlaneTokenization(body) {\n  var options = {\n    hasAuthenticationInsight: Boolean(\n      body.authenticationInsight && body.merchantAccountId\n    ),\n  };\n\n  return {\n    query: createMutation(options),\n    variables: createCreditCardForFastlaneTokenizationBody(body, options),\n    operationName: \"TokenizeCreditCardForPayPalConnect\",\n  };\n}\n\nmodule.exports = creditCardForFastlaneTokenization;\n\n},{\"../../../../lib/assign\":145}],108:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar assign = _dereq_(\"../../../../lib/assign\").assign;\n\nfunction createMutation(config) {\n  var hasAuthenticationInsight = config.hasAuthenticationInsight;\n  var mutation = \"mutation TokenizeCreditCard($input: TokenizeCreditCardInput!\";\n\n  if (hasAuthenticationInsight) {\n    mutation += \", $authenticationInsightInput: AuthenticationInsightInput!\";\n  }\n\n  mutation +=\n    \") { \" +\n    \"  tokenizeCreditCard(input: $input) { \" +\n    \"    token \" +\n    \"    creditCard { \" +\n    \"      bin \" +\n    \"      brandCode \" +\n    \"      last4 \" +\n    \"      cardholderName \" +\n    \"      expirationMonth\" +\n    \"      expirationYear\" +\n    \"      binData { \" +\n    \"        prepaid \" +\n    \"        healthcare \" +\n    \"        debit \" +\n    \"        durbinRegulated \" +\n    \"        commercial \" +\n    \"        payroll \" +\n    \"        issuingBank \" +\n    \"        countryOfIssuance \" +\n    \"        productId \" +\n    \"        business \" +\n    \"        consumer \" +\n    \"        purchase \" +\n    \"        corporate \" +\n    \"      } \" +\n    \"    } \";\n\n  if (hasAuthenticationInsight) {\n    mutation +=\n      \"    authenticationInsight(input: $authenticationInsightInput) {\" +\n      \"      customerAuthenticationRegulationEnvironment\" +\n      \"    }\";\n  }\n\n  mutation += \"  } }\";\n\n  return mutation;\n}\n\nfunction createCreditCardTokenizationBody(body, options) {\n  var cc = body.creditCard;\n  var billingAddress = cc && cc.billingAddress;\n  var expDate = cc && cc.expirationDate;\n  var expirationMonth =\n    cc && (cc.expirationMonth || (expDate && expDate.split(\"/\")[0].trim()));\n  var expirationYear =\n    cc && (cc.expirationYear || (expDate && expDate.split(\"/\")[1].trim()));\n  var variables = {\n    input: {\n      creditCard: {\n        number: cc && cc.number,\n        expirationMonth: expirationMonth,\n        expirationYear: expirationYear,\n        cvv: cc && cc.cvv,\n        cardholderName: cc && cc.cardholderName,\n      },\n      options: {},\n    },\n  };\n\n  if (options.hasAuthenticationInsight) {\n    variables.authenticationInsightInput = {\n      merchantAccountId: body.merchantAccountId,\n    };\n  }\n\n  if (billingAddress) {\n    variables.input.creditCard.billingAddress = billingAddress;\n  }\n\n  variables.input = addValidationRule(body, variables.input);\n\n  return variables;\n}\n\nfunction addValidationRule(body, input) {\n  var validate;\n\n  if (\n    body.creditCard &&\n    body.creditCard.options &&\n    typeof body.creditCard.options.validate === \"boolean\"\n  ) {\n    validate = body.creditCard.options.validate;\n  } else if (\n    (body.authorizationFingerprint && body.tokenizationKey) ||\n    body.authorizationFingerprint\n  ) {\n    validate = true;\n  } else if (body.tokenizationKey) {\n    validate = false;\n  }\n\n  if (typeof validate === \"boolean\") {\n    input.options = assign(\n      {\n        validate: validate,\n      },\n      input.options\n    );\n  }\n\n  return input;\n}\n\nfunction creditCardTokenization(body) {\n  var options = {\n    hasAuthenticationInsight: Boolean(\n      body.authenticationInsight && body.merchantAccountId\n    ),\n  };\n\n  return {\n    query: createMutation(options),\n    variables: createCreditCardTokenizationBody(body, options),\n    operationName: \"TokenizeCreditCard\",\n  };\n}\n\nmodule.exports = creditCardTokenization;\n\n},{\"../../../../lib/assign\":145}],109:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar features = {\n  tokenize_credit_cards: \"payment_methods/credit_cards\", // eslint-disable-line camelcase\n  configuration: \"configuration\",\n};\n\nvar disallowedInputPaths = [\"creditCard.options.unionPayEnrollment\"];\n\nfunction GraphQL(config) {\n  this._config = config.graphQL;\n}\n\nGraphQL.prototype.getGraphQLEndpoint = function () {\n  return this._config.url;\n};\n\nGraphQL.prototype.isGraphQLRequest = function (url, body) {\n  var featureEnabled;\n  var path = this.getClientApiPath(url);\n\n  if (!this._isGraphQLEnabled() || !path) {\n    return false;\n  }\n\n  featureEnabled = this._config.features.some(function (feature) {\n    return features[feature] === path;\n  });\n\n  if (containsDisallowedlistedKeys(body)) {\n    return false;\n  }\n\n  return featureEnabled;\n};\n\nGraphQL.prototype.getClientApiPath = function (url) {\n  var path;\n  var clientApiPrefix = \"/client_api/v1/\";\n  var pathParts = url.split(clientApiPrefix);\n\n  if (pathParts.length > 1) {\n    path = pathParts[1].split(\"?\")[0];\n  }\n\n  return path;\n};\n\nGraphQL.prototype._isGraphQLEnabled = function () {\n  return Boolean(this._config);\n};\n\nfunction containsDisallowedlistedKeys(body) {\n  return disallowedInputPaths.some(function (keys) {\n    var value = keys.split(\".\").reduce(function (accumulator, key) {\n      return accumulator && accumulator[key];\n    }, body);\n\n    return value !== undefined;\n  });\n}\n\nmodule.exports = GraphQL;\n\n},{}],110:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar BRAINTREE_VERSION = _dereq_(\"../../constants\").BRAINTREE_VERSION;\n\nvar assign = _dereq_(\"../../../lib/assign\").assign;\nvar snakeCaseToCamelCase = _dereq_(\"../../../lib/snake-case-to-camel-case\");\nvar isFastlaneCheckout = _dereq_(\"../../../lib/is-fastlane-checkout\");\n\nvar creditCardTokenizationBodyGenerator = _dereq_(\"./generators/credit-card-tokenization\");\nvar creditCardTokenizationResponseAdapter = _dereq_(\"./adapters/credit-card-tokenization\");\nvar creditCardTokenizationFastlaneResponseAdapter = _dereq_(\"./adapters/credit-card-tokenization-fastlane\");\nvar creditCardForFastlaneTokenizationBodyGenerator = _dereq_(\"./generators/credit-card-for-fastlane-tokenization\");\n\nvar configurationBodyGenerator = _dereq_(\"./generators/configuration\");\nvar configurationResponseAdapter = _dereq_(\"./adapters/configuration\");\n\nvar generators = {\n  \"payment_methods/credit_cards\": function (data, isFastlane) {\n    if (isFastlane) {\n      // Only want to use this generator when using the Fastlane flow\n      return creditCardForFastlaneTokenizationBodyGenerator(data);\n    }\n\n    return creditCardTokenizationBodyGenerator(data);\n  },\n  configuration: configurationBodyGenerator,\n};\n\nvar adapters = {\n  \"payment_methods/credit_cards\": function (parsedBody, context, isFastlane) {\n    if (isFastlane) {\n      // Only want to use this adapter when using the Fastlane flow\n      return creditCardTokenizationFastlaneResponseAdapter(parsedBody, context);\n    }\n\n    return creditCardTokenizationResponseAdapter(parsedBody, context);\n  },\n  configuration: configurationResponseAdapter,\n};\n\nfunction GraphQLRequest(options) {\n  var clientApiPath = options.graphQL.getClientApiPath(options.url);\n\n  this._graphQL = options.graphQL;\n  this._data = options.data;\n  this._method = options.method;\n  this._headers = options.headers;\n  this._clientSdkMetadata = {\n    source: options.metadata.source,\n    integration: options.metadata.integration,\n    sessionId: options.metadata.sessionId,\n  };\n  this._sendAnalyticsEvent = options.sendAnalyticsEvent || Function.prototype;\n\n  this._generator = generators[clientApiPath];\n  this._adapter = adapters[clientApiPath];\n\n  this._sendAnalyticsEvent(\"graphql.init\");\n}\n\nGraphQLRequest.prototype.getUrl = function () {\n  return this._graphQL.getGraphQLEndpoint();\n};\n\nGraphQLRequest.prototype.getBody = function () {\n  var formattedBody = formatBodyKeys(this._data);\n  var generatedBody = this._generator(\n    formattedBody,\n    // Since this is used for all GQL requests, we only want this if it's a Fastlane Tokenization request\n    isFastlaneCheckout(this._data.creditCard)\n  );\n  var body = assign(\n    { clientSdkMetadata: this._clientSdkMetadata },\n    generatedBody\n  );\n\n  return JSON.stringify(body);\n};\n\nGraphQLRequest.prototype.getMethod = function () {\n  return \"POST\";\n};\n\nGraphQLRequest.prototype.getHeaders = function () {\n  var authorization, headers;\n\n  if (this._data.authorizationFingerprint) {\n    this._sendAnalyticsEvent(\"graphql.authorization-fingerprint\");\n    authorization = this._data.authorizationFingerprint;\n  } else {\n    this._sendAnalyticsEvent(\"graphql.tokenization-key\");\n    authorization = this._data.tokenizationKey;\n  }\n\n  headers = {\n    Authorization: \"Bearer \" + authorization,\n    \"Braintree-Version\": BRAINTREE_VERSION,\n  };\n\n  return assign({}, this._headers, headers);\n};\n\nGraphQLRequest.prototype.adaptResponseBody = function (parsedBody) {\n  return this._adapter(\n    parsedBody,\n    this,\n    // Since this is used for all GQL requests, we only want this if it's a Fastlane Checkout Tokenization request\n    \"creditCard\" in this._data && isFastlaneCheckout(this._data.creditCard)\n  );\n};\n\nGraphQLRequest.prototype.determineStatus = function (\n  httpStatus,\n  parsedResponse\n) {\n  var status, errorClass;\n\n  if (httpStatus === 200) {\n    errorClass =\n      parsedResponse.errors &&\n      parsedResponse.errors[0] &&\n      parsedResponse.errors[0].extensions &&\n      parsedResponse.errors[0].extensions.errorClass;\n\n    if (parsedResponse.data && !parsedResponse.errors) {\n      status = 200;\n    } else if (errorClass === \"VALIDATION\") {\n      status = 422;\n    } else if (errorClass === \"AUTHORIZATION\") {\n      status = 403;\n    } else if (errorClass === \"AUTHENTICATION\") {\n      status = 401;\n    } else if (isGraphQLError(errorClass, parsedResponse)) {\n      status = 403;\n    } else {\n      status = 500;\n    }\n  } else if (!httpStatus) {\n    status = 500;\n  } else {\n    status = httpStatus;\n  }\n\n  this._sendAnalyticsEvent(\"graphql.status.\" + httpStatus);\n  this._sendAnalyticsEvent(\"graphql.determinedStatus.\" + status);\n\n  return status;\n};\n\nfunction isGraphQLError(errorClass, parsedResponse) {\n  return !errorClass && parsedResponse.errors[0].message;\n}\n\n/**\n * @ignore\n * This function formats the body consistently so _everything_ is camelCase.\n * @param {object} originalBody the body to format\n * @returns {object} The formatted object\n */\nfunction formatBodyKeys(originalBody) {\n  var body = {};\n\n  Object.keys(originalBody).forEach(function (key) {\n    var camelCaseKey = snakeCaseToCamelCase(key);\n\n    if (typeof originalBody[key] === \"object\") {\n      body[camelCaseKey] = formatBodyKeys(originalBody[key]);\n    } else if (typeof originalBody[key] === \"number\") {\n      body[camelCaseKey] = String(originalBody[key]);\n    } else {\n      body[camelCaseKey] = originalBody[key];\n    }\n  });\n\n  return body;\n}\n\nmodule.exports = GraphQLRequest;\n\n},{\"../../../lib/assign\":145,\"../../../lib/is-fastlane-checkout\":176,\"../../../lib/snake-case-to-camel-case\":184,\"../../constants\":96,\"./adapters/configuration\":102,\"./adapters/credit-card-tokenization\":104,\"./adapters/credit-card-tokenization-fastlane\":103,\"./generators/configuration\":106,\"./generators/credit-card-for-fastlane-tokenization\":107,\"./generators/credit-card-tokenization\":108}],111:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar once = _dereq_(\"../../lib/once\");\nvar AJAXDriver = _dereq_(\"./ajax-driver\");\n\nmodule.exports = function (options, cb) {\n  cb = once(cb || Function.prototype);\n  options.method = (options.method || \"GET\").toUpperCase();\n  options.timeout = options.timeout == null ? 60000 : options.timeout;\n  options.data = options.data || {};\n\n  AJAXDriver.request(options, cb);\n};\n\n},{\"../../lib/once\":181,\"./ajax-driver\":100}],112:[function(_dereq_,module,exports){\n\"use strict\";\n\nmodule.exports = function (body) {\n  try {\n    body = JSON.parse(body);\n    // eslint-disable-next-line no-unused-vars\n  } catch (err) {\n    /* ignored */\n  }\n\n  return body;\n};\n\n},{}],113:[function(_dereq_,module,exports){\n\"use strict\";\n\nmodule.exports = function (method, body) {\n  if (typeof method !== \"string\") {\n    throw new Error(\"Method must be a string\");\n  }\n\n  if (method.toLowerCase() !== \"get\" && body != null) {\n    body = typeof body === \"string\" ? body : JSON.stringify(body);\n  }\n\n  return body;\n};\n\n},{}],114:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar isXHRAvailable =\n  typeof window !== \"undefined\" &&\n  window.XMLHttpRequest &&\n  \"withCredentials\" in new window.XMLHttpRequest();\n\nfunction getRequestObject() {\n  return isXHRAvailable\n    ? new window.XMLHttpRequest()\n    : new window.XDomainRequest();\n}\n\nmodule.exports = {\n  isAvailable: isXHRAvailable,\n  getRequestObject: getRequestObject,\n};\n\n},{}],115:[function(_dereq_,module,exports){\n\"use strict\";\n\n/**\n * @name BraintreeError.Data Collector - Creation Error Codes\n * @description Errors that occur when [creating the Data Collector component](./module-braintree-web_data-collector.html#.create).\n * @property {MERCHANT} DATA_COLLECTOR_REQUIRES_CREATE_OPTIONS Occurs when PayPal Fraudnet could not be enabled.\n */\n\nvar BraintreeError = _dereq_(\"../lib/braintree-error\");\n\nmodule.exports = {\n  DATA_COLLECTOR_REQUIRES_CREATE_OPTIONS: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"DATA_COLLECTOR_REQUIRES_CREATE_OPTIONS\",\n    message: \"Data Collector must be created with Kount and/or PayPal.\",\n  },\n};\n\n},{\"../lib/braintree-error\":148}],116:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar FRAUDNET_FNCLS = _dereq_(\"../lib/constants\").FRAUDNET_FNCLS;\nvar FRAUDNET_SOURCE = _dereq_(\"../lib/constants\").FRAUDNET_SOURCE;\nvar FRAUDNET_URL = _dereq_(\"../lib/constants\").FRAUDNET_URL;\nvar loadScript = _dereq_(\"../lib/assets\").loadScript;\n\nvar TRUNCATION_LENGTH = 32;\n\nvar cachedSessionId;\n\nfunction setup(options) {\n  var fraudNet = new Fraudnet();\n\n  options = options || {};\n\n  if (!options.sessionId && cachedSessionId) {\n    fraudNet.sessionId = cachedSessionId;\n\n    return Promise.resolve(fraudNet);\n  }\n\n  return fraudNet.initialize(options);\n}\n\nfunction clearSessionIdCache() {\n  cachedSessionId = null;\n}\n\nfunction Fraudnet() {}\n\nFraudnet.prototype.initialize = function (options) {\n  var self = this;\n\n  this.sessionId = options.sessionId || options.clientSessionId;\n\n  if (this.sessionId) {\n    this.sessionId = this.sessionId.substring(0, TRUNCATION_LENGTH);\n  }\n\n  if (!options.sessionId) {\n    cachedSessionId = this.sessionId;\n  }\n\n  var parameterBlockConfig = {\n    f: this.sessionId,\n    s: FRAUDNET_SOURCE,\n  };\n\n  if (!options.hasOwnProperty(\"beacon\") || options.beacon === true) {\n    parameterBlockConfig.b = _generateBeaconId(this.sessionId);\n  } else {\n    parameterBlockConfig.bu = false;\n  }\n\n  if (options.hasOwnProperty(\"cb1\")) {\n    parameterBlockConfig.cb1 = options.cb1;\n  }\n\n  this._parameterBlock = _createParameterBlock(\n    parameterBlockConfig,\n    options.environment\n  );\n\n  return loadScript({\n    src: FRAUDNET_URL,\n  })\n    .then(function (block) {\n      self._thirdPartyBlock = block;\n\n      return self;\n    })\n    .catch(function () {\n      // if the fraudnet script fails to load\n      // we just resolve with nothing\n      // and data collector ignores it\n      return null;\n    });\n};\n\nFraudnet.prototype.teardown = function () {\n  removeElementIfOnPage(document.querySelector('iframe[title=\"ppfniframe\"]'));\n  removeElementIfOnPage(document.querySelector('iframe[title=\"pbf\"]'));\n\n  removeElementIfOnPage(this._parameterBlock);\n  removeElementIfOnPage(this._thirdPartyBlock);\n};\n\nfunction removeElementIfOnPage(element) {\n  if (element && element.parentNode) {\n    element.parentNode.removeChild(element);\n  }\n}\n\nfunction _generateBeaconId(sessionId) {\n  var timestamp = new Date().getTime() / 1000;\n\n  return (\n    \"https://b.stats.paypal.com/counter.cgi\" +\n    \"?i=127.0.0.1\" +\n    \"&p=\" +\n    sessionId +\n    \"&t=\" +\n    timestamp +\n    \"&a=14\"\n  );\n}\n\nfunction _createParameterBlock(config, environment) {\n  var el = document.body.appendChild(document.createElement(\"script\"));\n  // for some reason, the presence of the sandbox\n  // attribute in a production environment causes\n  // some weird behavior with what url paths are\n  // hit, so instead, we only apply this attribute\n  // when it is not a production environment\n  if (environment !== \"production\") {\n    config.sandbox = true;\n  }\n\n  el.type = \"application/json\";\n  el.setAttribute(\"fncls\", FRAUDNET_FNCLS);\n  el.text = JSON.stringify(config);\n\n  return el;\n}\n\nmodule.exports = {\n  setup: setup,\n  clearSessionIdCache: clearSessionIdCache,\n};\n\n},{\"../lib/assets\":144,\"../lib/constants\":149}],117:[function(_dereq_,module,exports){\n\"use strict\";\n/** @module braintree-web/data-collector */\n\nvar fraudnet = _dereq_(\"./fraudnet\");\nvar BraintreeError = _dereq_(\"../lib/braintree-error\");\nvar basicComponentVerification = _dereq_(\"../lib/basic-component-verification\");\nvar createDeferredClient = _dereq_(\"../lib/create-deferred-client\");\nvar createAssetsUrl = _dereq_(\"../lib/create-assets-url\");\nvar methods = _dereq_(\"../lib/methods\");\nvar convertMethodsToError = _dereq_(\"../lib/convert-methods-to-error\");\nvar VERSION = \"3.134.0\";\nvar wrapPromise = _dereq_(\"@braintree/wrap-promise\");\nvar errors = _dereq_(\"./errors\");\n\n/**\n * @class\n * @global\n * @name DataCollector\n * @description <strong>Do not use this constructor directly. Use {@link module:braintree-web/data-collector.create|braintree-web.data-collector.create} instead.</strong>\n * @classdesc This class is used for fraud integration with PayPal. Instances of this class have {@link DataCollector#deviceData|deviceData} which is used to correlate user sessions with server transactions.\n */\n\n/**\n * @memberof DataCollector\n * @name deviceData\n * @type string\n * @description JSON string to pass with server transactions.\n * @instance\n */\n\n/**\n * @memberof DataCollector\n * @name rawDeviceData\n * @type object\n * @description The device data as an object instead of a string.\n * @instance\n */\n\n/**\n * @memberof DataCollector\n * @name teardown\n * @function\n * @description Cleanly remove anything set up by {@link module:braintree-web/data-collector.create|create}.\n * @param {callback} [callback] Called on completion. If no callback is provided, `teardown` returns a promise.\n * @instance\n * @example\n * dataCollectorInstance.teardown();\n * @example <caption>With callback</caption>\n * dataCollectorInstance.teardown(function () {\n *   // teardown is complete\n * });\n * @returns {(Promise|void)} Returns a promise if no callback is provided.\n */\n\n/**\n * @memberof DataCollector\n * @name getDeviceData\n * @function\n * @description Resolves with device data once it is ready.\n * @param {object} [options] Options for how device data is resolved.\n * @param {boolean} [options.raw=false] When set to true, the device data will resolve as an object instead of a JSON string.\n * @param {callback} [callback] Called on completion. If no callback is provided, `getDeviceData` returns a promise.\n * @instance\n * @example\n * dataCollectorInstance.getDeviceData();\n * @example <caption>Without options</caption>\n * dataCollectorInstance.getDeviceData().then(function (deviceData) {\n *   // typeof deviceData === 'string'\n *   // pass onto your server with the payment method nonce\n * });\n * @example <caption>With options</caption>\n * dataCollectorInstance.getDeviceData({\n *   raw: true\n * }).then(function (deviceData) {\n *   // typeof deviceData === 'object'\n *   // for if you'd like to parse the data before sending it to your server\n * });\n * @returns {(Promise|void)} Returns a promise if no callback is provided.\n */\n\n/**\n * @static\n * @function create\n * @description Creates a DataCollector instance and collects device data based on your merchant configuration. We recommend that you call this method as early as possible, e.g. as soon as your website loads. If that's too early, call it at the beginning of customer checkout.\n * @param {object} options Creation options:\n * @param {Client} [options.client] A {@link Client} instance.\n * @param {string} [options.authorization] A tokenizationKey or clientToken. Can be used in place of `options.client`.\n * @param {boolean} [options.useDeferredClient] Used in conjunction with `authorization`, allows the Data Collector instance to be available right away by fetching the client configuration in the background. When this option is used, {@link GooglePayment#getDeviceData} must be used to collect the device data.\n * @param {boolean} [options.paypal] *Deprecated:* PayPal fraud data collection will occur when the DataCollector instance is created.\n * @param {string} [options.riskCorrelationId] Pass a custom risk correlation id when creating the data collector.\n * @param {string} [options.clientMetadataId] Deprecated. Use `options.riskCorrelationId` instead.\n * @param {string} [options.correlationId] Deprecated. Use `options.riskCorrelationId` instead.\n * @param {string} [options.cb1] Callback name for fraudnet that will be invoked on the window object when fraudnet is finished initializing.\n * @param {callback} [callback] The second argument, `data`, is the {@link DataCollector} instance.\n * @returns {(Promise|void)} Returns a promise that resolves the {@link DataCollector} instance if no callback is provided.\n */\nfunction create(options) {\n  var name = \"Data Collector\";\n  var result = {\n    _instances: [],\n  };\n  var data = {};\n\n  return basicComponentVerification\n    .verify({\n      name: name,\n      client: options.client,\n      authorization: options.authorization,\n    })\n    .then(function () {\n      result._instantiatedWithAClient = !options.useDeferredClient;\n      result._createPromise = createDeferredClient\n        .create({\n          authorization: options.authorization,\n          client: options.client,\n          debug: options.debug,\n          assetsUrl: createAssetsUrl.create(options.authorization),\n          name: name,\n        })\n        .then(function (client) {\n          var clientConfiguration = client.getConfiguration();\n          var fraudnetConfig = {\n            sessionId:\n              options.riskCorrelationId ||\n              options.clientMetadataId ||\n              options.correlationId,\n            clientSessionId: clientConfiguration.analyticsMetadata.sessionId,\n            environment: clientConfiguration.gatewayConfiguration.environment,\n            cb1: options.cb1,\n          };\n          if (options.hasOwnProperty(\"beacon\")) {\n            fraudnetConfig.beacon = options.beacon;\n          }\n          return fraudnet\n            .setup(fraudnetConfig)\n            .then(function (fraudnetInstance) {\n              if (fraudnetInstance) {\n                data.correlation_id = fraudnetInstance.sessionId; // eslint-disable-line camelcase\n                result._instances.push(fraudnetInstance);\n              }\n            });\n        })\n        .then(function () {\n          if (result._instances.length === 0) {\n            // NEXT_MAJOR_VERSION either this should error with a specific error that\n            // no data collector instances could be set up, or we should just swallow\n            // the error and document that no device data will be returned if\n            // data collector cannot be instantiated. We can't change the error code here\n            // without possibly breaking merchant integrations relying on this inccorrect\n            // behavior.\n            return Promise.reject(\n              new BraintreeError(errors.DATA_COLLECTOR_REQUIRES_CREATE_OPTIONS)\n            );\n          }\n\n          result.deviceData = JSON.stringify(data);\n          result.rawDeviceData = data;\n\n          return result;\n        });\n\n      result.teardown = createTeardownMethod(result);\n      result.getDeviceData = createGetDeviceDataMethod(result);\n\n      if (result._instantiatedWithAClient) {\n        return result._createPromise;\n      }\n\n      return result;\n    });\n}\n\nfunction createTeardownMethod(result) {\n  return wrapPromise(function teardown() {\n    return result._createPromise.then(function () {\n      result._instances.forEach(function (instance) {\n        if (instance) {\n          instance.teardown();\n        }\n      });\n\n      convertMethodsToError(result, methods(result));\n    });\n  });\n}\n\nfunction createGetDeviceDataMethod(result) {\n  return wrapPromise(function getDeviceData(options) {\n    options = options || {};\n\n    return result._createPromise.then(function () {\n      if (options.raw) {\n        return Promise.resolve(result.rawDeviceData);\n      }\n\n      return Promise.resolve(result.deviceData);\n    });\n  });\n}\n\nmodule.exports = {\n  create: wrapPromise(create),\n  /**\n   * @description The current version of the SDK, i.e. `{@pkg version}`.\n   * @type {string}\n   */\n  VERSION: VERSION,\n};\n\n},{\"../lib/basic-component-verification\":146,\"../lib/braintree-error\":148,\"../lib/convert-methods-to-error\":150,\"../lib/create-assets-url\":152,\"../lib/create-deferred-client\":154,\"../lib/methods\":180,\"./errors\":115,\"./fraudnet\":116,\"@braintree/wrap-promise\":43}],118:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar BraintreeError = _dereq_(\"../lib/braintree-error\");\n\nmodule.exports = {\n  FASTLANE_SDK_LOAD_ERROR: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"FASTLANE_SDK_LOAD_ERROR\",\n  },\n};\n\n},{\"../lib/braintree-error\":148}],119:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar BraintreeError = _dereq_(\"../lib/braintree-error\");\nvar errors = _dereq_(\"./errors\");\nvar loadFastlane = _dereq_(\"../lib/assets\").loadFastlane;\nvar wrapPromise = _dereq_(\"@braintree/wrap-promise\");\nvar assign = _dereq_(\"../lib/assign\").assign;\n\nfunction fastlane(options) {\n  var config = options.client.getConfiguration();\n  var sdkVersion = options.client.getVersion();\n  var environment = config.gatewayConfiguration.environment;\n\n  var minified = true;\n\n  if (environment !== \"production\") {\n    minified = false;\n  }\n\n  return loadFastlane(\n    assign(\n      { platform: \"BT\", btSdkVersion: sdkVersion, minified: minified },\n      options\n    )\n  )\n    .then(function (result) {\n      var platformOptions = {\n        platform: \"BT\",\n        authorization: options.authorization,\n        client: options.client,\n        deviceData: options.deviceData,\n      };\n\n      // We need the following options to be nested inside platformOptions rather than\n      // top level\n      delete options.authorization;\n      delete options.client;\n      delete options.deviceData;\n\n      // The following are options that we know are needed for the Fastlane Loader, but which\n      // we know are not needed for initializing the fastlane sdk.\n      delete options.minified;\n      delete options.btSdkVersion;\n\n      var createFn;\n      if (window.braintree._fastlane && window.braintree._fastlane.create) {\n        createFn = window.braintree._fastlane.create;\n      } else {\n        createFn = window.braintree.fastlane.create;\n      }\n\n      return createFn(\n        assign({ platformOptions: platformOptions }, options, result.metadata)\n      );\n    })\n    .catch(function (err) {\n      return Promise.reject(\n        new BraintreeError({\n          type: errors.FASTLANE_SDK_LOAD_ERROR.type,\n          code: errors.FASTLANE_SDK_LOAD_ERROR.code,\n          message: err.message,\n        })\n      );\n    });\n}\n\nmodule.exports = wrapPromise(fastlane);\n\n},{\"../lib/assets\":144,\"../lib/assign\":145,\"../lib/braintree-error\":148,\"./errors\":118,\"@braintree/wrap-promise\":43}],120:[function(_dereq_,module,exports){\n\"use strict\";\n\n/** @module braintree-web/fastlane */\n\nvar basicComponentVerification = _dereq_(\"../lib/basic-component-verification\");\nvar fastlane = _dereq_(\"./fastlane\");\nvar createAssetsUrl = _dereq_(\"../lib/create-assets-url\");\nvar createDeferredClient = _dereq_(\"../lib/create-deferred-client\");\nvar wrapPromise = _dereq_(\"@braintree/wrap-promise\");\nvar VERSION = \"3.134.0\";\nvar assign = _dereq_(\"../lib/assign\").assign;\n\n/**\n * @static\n * @function create\n * @param {object} options Creation options:\n * @param {Client} [options.client] A {@link Client} instance.\n * @param {string} [options.authorization] A tokenizationKey or clientToken. Can be used in place of `options.client`.\n * @param {string} [options.deviceData] A {@link DataCollector} instance.\n * @example\n * braintree.fastlane.create({\n *   client: clientInstance,\n *   deviceData: dataCollectorInstance\n * }).then(function (fastlaneInstance) {\n *   // fastlaneInstance is ready to create an identity instance.\n *     identity = fastlaneInstance.identity\n * }).catch(function (createErr) {\n *   console.error('Error creating fastlane instance', createErr);\n * });\n * @example <caption>Creating a fastlane component</caption>\n * braintree.fastlane.create({\n *   client: clientInstance,\n *   deviceData: dataCollectorInstance\n * }).then(function (fastlaneInstance) {\n *   // fastlaneInstance is ready to create an identity instance.\n *     identity = fastlaneInstance.identity\n * }).catch(function (createErr) {\n *   console.error('Error creating fastlane instance', createErr);\n * });\n * @returns {(Promise|void)} Returns the fastlane instance.\n */\n\nfunction create(options) {\n  var name = \"fastlane\";\n\n  return basicComponentVerification\n    .verify({\n      name: name,\n      client: options.client,\n      authorization: options.authorization,\n    })\n    .then(function () {\n      return createDeferredClient.create({\n        authorization: options.authorization,\n        client: options.client,\n        assetsUrl: createAssetsUrl.create(options.authorization),\n        name: name,\n      });\n    })\n    .then(function (client) {\n      return fastlane(\n        assign(\n          {\n            client: client,\n            deviceData: options.deviceData,\n          },\n          options\n        )\n      );\n    });\n}\nmodule.exports = {\n  create: wrapPromise(create),\n  /**\n   * @description The current version of the SDK, i.e. `{@pkg version}`.\n   * @type {string}\n   */\n  VERSION: VERSION,\n};\n\n},{\"../lib/assign\":145,\"../lib/basic-component-verification\":146,\"../lib/create-assets-url\":152,\"../lib/create-deferred-client\":154,\"./fastlane\":119,\"@braintree/wrap-promise\":43}],121:[function(_dereq_,module,exports){\n\"use strict\";\n\n/**\n * @name BraintreeError.Google Payment - Creation Error Codes\n * @description Errors that occur when [creating the Google Payment component](./module-braintree-web_google-payment.html#.create).\n * @property {MERCHANT} GOOGLE_PAYMENT_NOT_ENABLED Occurs when Google Pay is not enabled on the Braintree control panel.\n * @property {MERCHANT} GOOGLE_PAYMENT_UNSUPPORTED_VERSION Occurs when a Google Pay version is used that is not supported by the Braintree SDK.\n */\n\n/**\n * @name BraintreeError.Google Payment - parseResponse Error Codes\n * @description Errors that occur when [parsing the response from Google](./GooglePayment.html#parseResponse).\n * @property {UNKNOWN} GOOGLE_PAYMENT_GATEWAY_ERROR Occurs when Google Pay could not be tokenized.\n */\n\nvar BraintreeError = _dereq_(\"../lib/braintree-error\");\n\nmodule.exports = {\n  GOOGLE_PAYMENT_NOT_ENABLED: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"GOOGLE_PAYMENT_NOT_ENABLED\",\n    message: \"Google Pay is not enabled for this merchant.\",\n  },\n  GOOGLE_PAYMENT_GATEWAY_ERROR: {\n    code: \"GOOGLE_PAYMENT_GATEWAY_ERROR\",\n    message:\n      \"There was an error when tokenizing the Google Pay payment method.\",\n    type: BraintreeError.types.UNKNOWN,\n  },\n  GOOGLE_PAYMENT_UNSUPPORTED_VERSION: {\n    code: \"GOOGLE_PAYMENT_UNSUPPORTED_VERSION\",\n    type: BraintreeError.types.MERCHANT,\n  },\n};\n\n},{\"../lib/braintree-error\":148}],122:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar analytics = _dereq_(\"../lib/analytics\");\nvar assign = _dereq_(\"../lib/assign\").assign;\nvar convertMethodsToError = _dereq_(\"../lib/convert-methods-to-error\");\nvar find = _dereq_(\"../lib/find\");\nvar generateGooglePayConfiguration = _dereq_(\"../lib/generate-google-pay-configuration\");\nvar BraintreeError = _dereq_(\"../lib/braintree-error\");\nvar errors = _dereq_(\"./errors\");\nvar methods = _dereq_(\"../lib/methods\");\nvar wrapPromise = _dereq_(\"@braintree/wrap-promise\");\n\nvar CREATE_PAYMENT_DATA_REQUEST_METHODS = {\n  1: \"_createV1PaymentDataRequest\",\n  2: \"_createV2PaymentDataRequest\",\n};\n\n/**\n * @typedef {object} GooglePayment~tokenizePayload\n * @property {string} nonce The payment method nonce.\n * @property {object} details Additional account details.\n * @property {string} details.cardType Type of card, ex: Visa, MasterCard.\n * @property {string} details.lastFour Last four digits of card number.\n * @property {string} details.lastTwo Last two digits of card number.\n * @property {boolean} details.isNetworkTokenized True if the card is network tokenized.\n * @property {string} details.bin First six digits of card number.\n * @property {string} description A human-readable description.\n * @property {string} type The payment method type, `CreditCard` or `AndroidPayCard`.\n * @property {object} binData Information about the card based on the bin.\n * @property {string} binData.commercial Possible values: 'Yes', 'No', 'Unknown'.\n * @property {string} binData.countryOfIssuance The country of issuance.\n * @property {string} binData.debit Possible values: 'Yes', 'No', 'Unknown'.\n * @property {string} binData.durbinRegulated Possible values: 'Yes', 'No', 'Unknown'.\n * @property {string} binData.healthcare Possible values: 'Yes', 'No', 'Unknown'.\n * @property {string} binData.issuingBank The issuing bank.\n * @property {string} binData.payroll Possible values: 'Yes', 'No', 'Unknown'.\n * @property {string} binData.prepaid Possible values: 'Yes', 'No', 'Unknown'.\n * @property {string} binData.productId The product id.\n * @property {string} binData.business Possible values: 'Yes', 'No', 'Unknown'.\n * @property {string} binData.consumer Possible values: 'Yes', 'No', 'Unknown'.\n * @property {string} binData.purchase Possible values: 'Yes', 'No', 'Unknown'.\n * @property {string} binData.corporate Possible values: 'Yes', 'No', 'Unknown'.\n */\n\n/**\n * @class GooglePayment\n * @param {object} options Google Payment {@link module:braintree-web/google-payment.create create} options.\n * @description <strong>Do not use this constructor directly. Use {@link module:braintree-web/google-payment.create|braintree-web.google-payment.create} instead.</strong>\n * @classdesc This class represents a Google Payment component produced by {@link module:braintree-web/google-payment.create|braintree-web/google-payment.create}. Instances of this class have methods for initializing the Google Pay flow.\n */\nfunction GooglePayment(options) {\n  this._createPromise = options.createPromise;\n  this._client = options.client;\n  this._useDeferredClient = options.useDeferredClient;\n  // NEXT_MAJOR_VERSION this should be updated to 2 (or whatever the current latest version is)\n  this._googlePayVersion = options.googlePayVersion || 1;\n  this._googleMerchantId = options.googleMerchantId;\n\n  if (this._isUnsupportedGooglePayAPIVersion()) {\n    throw new BraintreeError({\n      code: errors.GOOGLE_PAYMENT_UNSUPPORTED_VERSION.code,\n      message:\n        \"The Braintree SDK does not support Google Pay version \" +\n        this._googlePayVersion +\n        \". Please upgrade the version of your Braintree SDK and contact support if this error persists.\",\n      type: errors.GOOGLE_PAYMENT_UNSUPPORTED_VERSION.type,\n    });\n  }\n}\n\nGooglePayment.prototype._waitForClient = function () {\n  if (this._client) {\n    return Promise.resolve();\n  }\n\n  return this._createPromise.then(\n    function (client) {\n      this._client = client;\n    }.bind(this)\n  );\n};\n\nGooglePayment.prototype._isUnsupportedGooglePayAPIVersion = function () {\n  // if we don't have createPaymentDatqRequest method for the specific\n  // API version, then the version is not supported\n  return !(this._googlePayVersion in CREATE_PAYMENT_DATA_REQUEST_METHODS);\n};\n\nGooglePayment.prototype._getDefaultConfig = function () {\n  if (!this._defaultConfig) {\n    this._defaultConfig = generateGooglePayConfiguration(\n      this._client.getConfiguration(),\n      this._googlePayVersion,\n      this._googleMerchantId\n    );\n  }\n\n  return this._defaultConfig;\n};\n\nGooglePayment.prototype._createV1PaymentDataRequest = function (\n  paymentDataRequest\n) {\n  var defaultConfig = this._getDefaultConfig();\n  var overrideCardNetworks =\n    paymentDataRequest.cardRequirements &&\n    paymentDataRequest.cardRequirements.allowedCardNetworks;\n  var defaultConfigCardNetworks =\n    defaultConfig.cardRequirements.allowedCardNetworks;\n  var allowedCardNetworks = overrideCardNetworks || defaultConfigCardNetworks;\n\n  paymentDataRequest = assign({}, defaultConfig, paymentDataRequest);\n\n  // this way we can preserve allowedCardNetworks from default integration\n  // if merchant did not pass any in `cardRequirements`\n  paymentDataRequest.cardRequirements.allowedCardNetworks = allowedCardNetworks;\n\n  return paymentDataRequest;\n};\n\nGooglePayment.prototype._createV2PaymentDataRequest = function (\n  paymentDataRequest\n) {\n  var defaultConfig = this._getDefaultConfig();\n\n  if (paymentDataRequest.allowedPaymentMethods) {\n    paymentDataRequest.allowedPaymentMethods.forEach(function (paymentMethod) {\n      var defaultPaymentMethod = find(\n        defaultConfig.allowedPaymentMethods,\n        \"type\",\n        paymentMethod.type\n      );\n\n      if (defaultPaymentMethod) {\n        applyDefaultsToPaymentMethodConfiguration(\n          paymentMethod,\n          defaultPaymentMethod\n        );\n      }\n    });\n  }\n\n  paymentDataRequest = assign({}, defaultConfig, paymentDataRequest);\n\n  return paymentDataRequest;\n};\n\n/**\n * Create a configuration object for use in the `loadPaymentData` method.\n *\n * **Note**: Version 1 of the Google Pay Api is deprecated and will become unsupported in a future version. Until then, version 1 will continue to be used by default, and version 1 schema parameters and overrides will remain functional on existing integrations. However, new integrations and all following examples will be presented in the GooglePay version 2 schema. See [Google Pay's upgrade guide](https://developers.google.com/pay/api/web/guides/resources/update-to-latest-version) to see how to update your integration.\n *\n * If `options.googlePayVersion === 2` was set during the initial {@link module:braintree-web/google-payment.create|create} call, overrides must match the Google Pay v2 schema to be valid.\n *\n * @public\n * @param {object} overrides The supplied parameters for creating the PaymentDataRequest object. Required parameters are:\n *  @param {object} overrides.transactionInfo Object according to the [Google Pay Transaction Info](https://developers.google.com/pay/api/web/reference/object#TransactionInfo) spec.\n *  Optionally, any of the parameters in the [PaymentDataRequest](https://developers.google.com/pay/api/web/reference/object#PaymentDataRequest) parameters can be overridden, but note that it is recommended only to override top level parameters to avoid squashing deeply nested configuration objects. An example can be found below showing how to safely edit these deeply nested objects.\n * @example\n * var paymentDataRequest = googlePaymentInstance.createPaymentDataRequest({\n *   merchantInfo: {\n *     merchantId: 'my-merchant-id-from-google'\n *   },\n *   transactionInfo: {\n *     currencyCode: 'USD',\n *     totalPriceStatus: 'FINAL',\n *     totalPrice: '100.00'\n *   }\n * });\n *\n * // Update card payment methods to require billing address\n * var cardPaymentMethod = paymentDataRequest.allowedPaymentMethods;\n * cardPaymentMethod.parameters.billingAddressRequired = true;\n * cardPaymentMethod.parameters.billingAddressParameters = {\n *   format: 'FULL',\n *   phoneNumberRequired: true\n * };\n *\n * var paymentsClient = new google.payments.api.PaymentsClient({\n *   environment: 'TEST' // or 'PRODUCTION'\n * })\n *\n * paymentsClient.loadPaymentData(paymentDataRequest).then(function (response) {\n *   // handle response with googlePaymentInstance.parseResponse\n *   // (see below)\n * });\n * @example <caption>With deferred client</caption>\n * googlePaymentInstance.createPaymentDataRequest({\n *   merchantInfo: {\n *     merchantId: 'my-merchant-id-from-google'\n *   },\n *   transactionInfo: {\n *     currencyCode: 'USD',\n *     totalPriceStatus: 'FINAL',\n *     totalPrice: '100.00'\n *   }\n * }).then(function (paymentDataRequest) {\n *   // Update card payment methods to require billing address\n *   var cardPaymentMethod = paymentDataRequest.allowedPaymentMethods;\n *   cardPaymentMethod.parameters.billingAddressRequired = true;\n *   cardPaymentMethod.parameters.billingAddressParameters = {\n *     format: 'FULL',\n *     phoneNumberRequired: true\n *   };\n *\n *   var paymentsClient = new google.payments.api.PaymentsClient({\n *     environment: 'TEST' // or 'PRODUCTION'\n *   })\n *\n *   return paymentsClient.loadPaymentData(paymentDataRequest);\n * }).then(function (response) {\n *   // handle response with googlePaymentInstance.parseResponse\n *   // (see below)\n * });\n * @returns {object|Promise} Returns a configuration object for Google PaymentDataRequest. If instantiated with `useDeferredClient` and an `authorization` it will return a promise that resolves with the configuration.\n */\nGooglePayment.prototype.createPaymentDataRequest = function (overrides) {\n  if (!this._useDeferredClient) {\n    return this._createPaymentDataRequestSyncronously(overrides);\n  }\n\n  return this._waitForClient().then(\n    function () {\n      return this._createPaymentDataRequestSyncronously(overrides);\n    }.bind(this)\n  );\n};\n\nGooglePayment.prototype._createPaymentDataRequestSyncronously = function (\n  overrides\n) {\n  var paymentDataRequest = assign({}, overrides);\n  var version = this._googlePayVersion;\n  var createPaymentDataRequestMethod =\n    CREATE_PAYMENT_DATA_REQUEST_METHODS[version];\n\n  if (\n    paymentDataRequest.transactionInfo &&\n    paymentDataRequest.transactionInfo.totalPrice\n  ) {\n    paymentDataRequest.transactionInfo.totalPrice =\n      paymentDataRequest.transactionInfo.totalPrice.toString();\n  }\n\n  analytics.sendEvent(\n    this._createPromise,\n    \"google-payment.v\" + version + \".createPaymentDataRequest\"\n  );\n\n  return this[createPaymentDataRequestMethod](paymentDataRequest);\n};\n\n/**\n * Parse the response from the tokenization.\n * @public\n * @param {object} response The response back from the Google Pay tokenization.\n * @param {callback} [callback] The second argument, <code>data</code>, is a {@link GooglePay~tokenizePayload|tokenizePayload}. If no callback is provided, `parseResponse` returns a promise that resolves with a {@link GooglePayment~tokenizePayload|tokenizePayload}.\n * @example with callback\n * var paymentsClient = new google.payments.api.PaymentsClient({\n *   environment: 'TEST' // or 'PRODUCTION'\n * })\n *\n * paymentsClient.loadPaymentData(paymentDataRequestFromCreatePaymentDataRequest).then(function (response) {\n *   googlePaymentInstance.parseResponse(response, function (err, data) {\n *     if (err) {\n *       // handle errors\n *     }\n *     // send parsedResponse.nonce to your server\n *   });\n * });\n * @example with promise\n * var paymentsClient = new google.payments.api.PaymentsClient({\n *   environment: 'TEST' // or 'PRODUCTION'\n * })\n *\n * paymentsClient.loadPaymentData(paymentDataRequestFromCreatePaymentDataRequest).then(function (response) {\n *   return googlePaymentInstance.parseResponse(response);\n * }).then(function (parsedResponse) {\n *   // send parsedResponse.nonce to your server\n * }).catch(function (err) {\n *   // handle errors\n * });\n * @returns {(Promise|void)} Returns a promise that resolves the parsed response if no callback is provided.\n */\nGooglePayment.prototype.parseResponse = function (response) {\n  var self = this;\n\n  return Promise.resolve()\n    .then(function () {\n      var payload;\n      var rawResponse =\n        response.apiVersion === 2\n          ? response.paymentMethodData.tokenizationData.token\n          : response.paymentMethodToken.token;\n      var parsedResponse = JSON.parse(rawResponse);\n      var error = parsedResponse.error;\n\n      if (error) {\n        return Promise.reject(error);\n      }\n\n      analytics.sendEvent(\n        self._createPromise,\n        \"google-payment.parseResponse.succeeded\"\n      );\n\n      if (parsedResponse.paypalAccounts) {\n        payload = parsedResponse.paypalAccounts[0];\n        analytics.sendEvent(\n          self._createPromise,\n          \"google-payment.parseResponse.succeeded.paypal\"\n        );\n\n        return Promise.resolve({\n          nonce: payload.nonce,\n          type: payload.type,\n          description: payload.description,\n        });\n      }\n      payload = parsedResponse.androidPayCards[0];\n      analytics.sendEvent(\n        self._createPromise,\n        \"google-payment.parseResponse.succeeded.google-payment\"\n      );\n\n      return Promise.resolve({\n        nonce: payload.nonce,\n        type: payload.type,\n        description: payload.description,\n        details: {\n          cardType: payload.details.cardType,\n          lastFour: payload.details.lastFour,\n          lastTwo: payload.details.lastTwo,\n          isNetworkTokenized: payload.details.isNetworkTokenized,\n          bin: payload.details.bin,\n        },\n        binData: payload.binData,\n      });\n    })\n    .catch(function (error) {\n      analytics.sendEvent(\n        self._createPromise,\n        \"google-payment.parseResponse.failed\"\n      );\n\n      return Promise.reject(\n        new BraintreeError({\n          code: errors.GOOGLE_PAYMENT_GATEWAY_ERROR.code,\n          message: errors.GOOGLE_PAYMENT_GATEWAY_ERROR.message,\n          type: errors.GOOGLE_PAYMENT_GATEWAY_ERROR.type,\n          details: {\n            originalError: error,\n          },\n        })\n      );\n    });\n};\n\n/**\n * Cleanly tear down anything set up by {@link module:braintree-web/google-payment.create|create}.\n * @public\n * @param {callback} [callback] Called once teardown is complete. No data is returned if teardown completes successfully.\n * @example\n * googlePaymentInstance.teardown();\n * @example <caption>With callback</caption>\n * googlePaymentInstance.teardown(function () {\n *   // teardown is complete\n * });\n * @returns {(Promise|void)} Returns a promise if no callback is provided.\n */\nGooglePayment.prototype.teardown = function () {\n  convertMethodsToError(this, methods(GooglePayment.prototype));\n\n  return Promise.resolve();\n};\n\nfunction applyDefaultsToPaymentMethodConfiguration(\n  merchantSubmittedPaymentMethod,\n  defaultPaymentMethod\n) {\n  Object.keys(defaultPaymentMethod).forEach(function (parameter) {\n    if (typeof defaultPaymentMethod[parameter] === \"object\") {\n      merchantSubmittedPaymentMethod[parameter] = assign(\n        {},\n        defaultPaymentMethod[parameter],\n        merchantSubmittedPaymentMethod[parameter]\n      );\n    } else {\n      merchantSubmittedPaymentMethod[parameter] =\n        merchantSubmittedPaymentMethod[parameter] ||\n        defaultPaymentMethod[parameter];\n    }\n  });\n}\n\nmodule.exports = wrapPromise.wrapPrototype(GooglePayment);\n\n},{\"../lib/analytics\":143,\"../lib/assign\":145,\"../lib/braintree-error\":148,\"../lib/convert-methods-to-error\":150,\"../lib/find\":160,\"../lib/generate-google-pay-configuration\":172,\"../lib/methods\":180,\"./errors\":121,\"@braintree/wrap-promise\":43}],123:[function(_dereq_,module,exports){\n\"use strict\";\n/**\n * @module braintree-web/google-payment\n * @description A component to integrate with Google Pay. The majority of the integration uses [Google's pay.js JavaScript file](https://pay.google.com/gp/p/js/pay.js). The Braintree component generates the configuration object necessary for Google Pay to initiate the Payment Request and parse the returned data to retrieve the payment method nonce which is used to process the transaction on the server.\n */\n\nvar GooglePayment = _dereq_(\"./google-payment\");\nvar BraintreeError = _dereq_(\"../lib/braintree-error\");\nvar createAssetsUrl = _dereq_(\"../lib/create-assets-url\");\nvar createDeferredClient = _dereq_(\"../lib/create-deferred-client\");\nvar basicComponentVerification = _dereq_(\"../lib/basic-component-verification\");\nvar wrapPromise = _dereq_(\"@braintree/wrap-promise\");\nvar VERSION = \"3.134.0\";\nvar errors = _dereq_(\"./errors\");\n\n/**\n * @static\n * @function create\n * @param {object} options Creation options:\n * @param {Client} [options.client] A {@link Client} instance.\n * @param {string} [options.authorization] A tokenizationKey or clientToken. Can be used in place of `options.client`.\n * @param {boolean} [options.useDeferredClient] Used in conjunction with `authorization`, allows the Google Payment instance to be available right away by fetching the client configuration in the background. When this option is used, {@link GooglePayment#createPaymentDataRequest} will return a promise that resolves with the configuration instead of returning synchronously.\n * @param {number} [options.googlePayVersion] The version of the Google Pay API to use. Value of 2 is required to accept parameters documented [by Google](https://developers.google.com/pay/api/web/reference/object). Omit this parameter to use the deprecated Google Pay Version 1.\n * @param {string} [options.googleMerchantId] A Google merchant identifier issued after your website is approved by Google. Required when PaymentsClient is initialized with an environment property of PRODUCTION, but may be omitted in TEST environment.\n * @param {callback} [callback] The second argument, `data`, is the {@link GooglePayment} instance. If no callback is provided, `create` returns a promise that resolves with the {@link GooglePayment} instance.\n * @example <caption>Simple Example</caption>\n * // include https://pay.google.com/gp/p/js/pay.js in a script tag\n * // on your page to load the `google.payments.api.PaymentsClient` global object.\n *\n * var paymentButton = document.querySelector('#google-pay-button');\n * var paymentsClient = new google.payments.api.PaymentsClient({\n *   environment: 'TEST' // or 'PRODUCTION'\n * });\n *\n * braintree.client.create({\n *   authorization: 'tokenization-key-or-client-token'\n * }).then(function (clientInstance) {\n *   return braintree.googlePayment.create({\n *     client: clientInstance,\n *      googlePayVersion: 2,\n *      googleMerchantId: 'your-merchant-id-from-google'\n *   });\n * }).then(function (googlePaymentInstance) {\n *   paymentButton.addEventListener('click', function (event) {\n *     var paymentDataRequest;\n *\n *     event.preventDefault();\n *\n *     paymentDataRequest = googlePaymentInstance.createPaymentDataRequest({\n *       transactionInfo: {\n *         currencyCode: 'USD',\n *         totalPriceStatus: 'FINAL',\n *         totalPrice: '100.00'\n *       }\n *     });\n *\n *     paymentsClient.loadPaymentData(paymentDataRequest).then(function (paymentData) {\n *       return googlePaymentInstance.parseResponse(paymentData);\n *     }).then(function (result) {\n *       // send result.nonce to your server\n *     }).catch(function (err) {\n *       // handle err\n *     });\n *   });\n * });\n * @example <caption>Check Browser and Customer Compatibility</caption>\n * var paymentsClient = new google.payments.api.PaymentsClient({\n *   environment: 'TEST' // or 'PRODUCTION'\n * });\n *\n * function setupGooglePayButton(googlePaymentInstance) {\n *   var button = document.createElement('button');\n *\n *   button.id = 'google-pay';\n *   button.appendChild(document.createTextNode('Google Pay'));\n *   button.addEventListener('click', function (event) {\n *     var paymentRequestData;\n *\n *     event.preventDefault();\n *\n *     paymentDataRequest = googlePaymentInstance.createPaymentDataRequest({\n *       transactionInfo: {\n *         currencyCode: 'USD',\n *         totalPriceStatus: 'FINAL',\n *         totalPrice: '100.00' // your amount\n *       }\n *     });\n *\n *     paymentsClient.loadPaymentData(paymentDataRequest).then(function (paymentData) {\n *       return googlePaymentInstance.parseResponse(paymentData);\n *       }).then(function (result) {\n *       // send result.nonce to your server\n *     }).catch(function (err) {\n *       // handle errors\n *     });\n *   });\n *\n *   document.getElementById('container').appendChild(button);\n * }\n *\n * braintree.client.create({\n *   authorization: 'tokenization-key-or-client-token'\n * }).then(function (clientInstance) {\n *   return braintree.googlePayment.create({\n *     client: clientInstance,\n *     googlePayVersion: 2,\n *     googleMerchantId: 'your-merchant-id-from-google'\n *   });\n * }).then(function (googlePaymentInstance) {\n *\n *   return paymentsClient.isReadyToPay({\n *     // see https://developers.google.com/pay/api/web/reference/object#IsReadyToPayRequest for all options\n *     apiVersion: 2,\n *     apiVersionMinor: 0,\n *     allowedPaymentMethods: googlePaymentInstance.createPaymentDataRequest().allowedPaymentMethods,\n *     existingPaymentMethodRequired: true\n *   });\n * }).then(function (response) {\n *   if (response.result) {\n *     setupGooglePayButton(googlePaymentInstance);\n *   }\n * }).catch(function (err) {\n *   // handle setup errors\n * });\n *\n * @returns {(Promise|void)} Returns a promise if no callback is provided.\n */\nfunction create(options) {\n  var name = \"Google Pay\";\n\n  return basicComponentVerification\n    .verify({\n      name: name,\n      client: options.client,\n      authorization: options.authorization,\n    })\n    .then(function () {\n      var createPromise, instance;\n\n      createPromise = createDeferredClient\n        .create({\n          authorization: options.authorization,\n          client: options.client,\n          debug: options.debug,\n          assetsUrl: createAssetsUrl.create(options.authorization),\n          name: name,\n        })\n        .then(function (client) {\n          var configuration = client.getConfiguration();\n\n          options.client = client;\n          if (!configuration.gatewayConfiguration.androidPay) {\n            return Promise.reject(\n              new BraintreeError(errors.GOOGLE_PAYMENT_NOT_ENABLED)\n            );\n          }\n\n          return client;\n        });\n\n      options.createPromise = createPromise;\n      instance = new GooglePayment(options);\n\n      if (!options.useDeferredClient) {\n        return createPromise.then(function (client) {\n          instance._client = client;\n\n          return instance;\n        });\n      }\n\n      return instance;\n    });\n}\n\nmodule.exports = {\n  create: wrapPromise(create),\n  /**\n   * @description The current version of the SDK, i.e. `{@pkg version}`.\n   * @type {string}\n   */\n  VERSION: VERSION,\n};\n\n},{\"../lib/basic-component-verification\":146,\"../lib/braintree-error\":148,\"../lib/create-assets-url\":152,\"../lib/create-deferred-client\":154,\"./errors\":121,\"./google-payment\":122,\"@braintree/wrap-promise\":43}],124:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar BraintreeError = _dereq_(\"../../lib/braintree-error\");\nvar errors = _dereq_(\"../shared/errors\");\nvar allowedAttributes = _dereq_(\"../shared/constants\").allowedAttributes;\n\nfunction attributeValidationError(attribute, value) {\n  var err;\n\n  if (!allowedAttributes.hasOwnProperty(attribute)) {\n    err = new BraintreeError({\n      type: errors.HOSTED_FIELDS_ATTRIBUTE_NOT_SUPPORTED.type,\n      code: errors.HOSTED_FIELDS_ATTRIBUTE_NOT_SUPPORTED.code,\n      message:\n        'The \"' + attribute + '\" attribute is not supported in Hosted Fields.',\n    });\n  } else if (value != null && !_isValid(attribute, value)) {\n    err = new BraintreeError({\n      type: errors.HOSTED_FIELDS_ATTRIBUTE_VALUE_NOT_ALLOWED.type,\n      code: errors.HOSTED_FIELDS_ATTRIBUTE_VALUE_NOT_ALLOWED.code,\n      message:\n        'Value \"' +\n        value +\n        '\" is not allowed for \"' +\n        attribute +\n        '\" attribute.',\n    });\n  }\n\n  return err;\n}\n\nfunction _isValid(attribute, value) {\n  if (allowedAttributes[attribute] === \"string\") {\n    return typeof value === \"string\" || typeof value === \"number\";\n  }\n  if (allowedAttributes[attribute] === \"boolean\") {\n    return String(value) === \"true\" || String(value) === \"false\";\n  }\n\n  return false;\n}\n\nmodule.exports = attributeValidationError;\n\n},{\"../../lib/braintree-error\":148,\"../shared/constants\":132,\"../shared/errors\":133}],125:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar constants = _dereq_(\"../shared/constants\");\nvar useMin = _dereq_(\"../../lib/use-min\");\n\nmodule.exports = function composeUrl(assetsUrl, componentId, isDebug) {\n  return (\n    assetsUrl +\n    \"/web/\" +\n    constants.VERSION +\n    \"/html/hosted-fields-frame\" +\n    useMin(isDebug) +\n    \".html#\" +\n    componentId\n  );\n};\n\n},{\"../../lib/use-min\":186,\"../shared/constants\":132}],126:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar directions = _dereq_(\"../shared/constants\").navigationDirections;\nvar browserDetection = _dereq_(\"../shared/browser-detection\");\nvar focusIntercept = _dereq_(\"../shared/focus-intercept\");\nvar findParentTags = _dereq_(\"../shared/find-parent-tags\");\nvar userFocusableTagNames = [\"INPUT\", \"SELECT\", \"TEXTAREA\"];\n// Devices with software keyboards do not or cannot focus on input types\n// that do not require keyboard-based interaction.\nvar unfocusedInputTypes = [\n  \"hidden\",\n  \"button\",\n  \"reset\",\n  \"submit\",\n  \"checkbox\",\n  \"radio\",\n  \"file\",\n];\n\nfunction _isUserFocusableElement(element) {\n  if (!browserDetection.hasSoftwareKeyboard()) {\n    // on desktop browsers, the only input type that isn't focusable\n    // is the hidden input\n    return element.type !== \"hidden\";\n  }\n\n  return (\n    userFocusableTagNames.indexOf(element.tagName) > -1 &&\n    unfocusedInputTypes.indexOf(element.type) < 0\n  );\n}\n\nfunction _createNavigationHelper(direction, numberOfElementsInForm) {\n  switch (direction) {\n    case directions.BACK:\n      return {\n        checkIndexBounds: function (index) {\n          return index < 0;\n        },\n        indexChange: -1,\n      };\n    case directions.FORWARD:\n      return {\n        checkIndexBounds: function (index) {\n          return index > numberOfElementsInForm - 1;\n        },\n        indexChange: 1,\n      };\n    default:\n  }\n\n  return {};\n}\n\nfunction _findFirstFocusableElement(elementsInForm) {\n  var elementsIndex, element;\n\n  for (\n    elementsIndex = 0;\n    elementsIndex < elementsInForm.length;\n    elementsIndex++\n  ) {\n    element = elementsInForm[elementsIndex];\n\n    if (_isUserFocusableElement(element)) {\n      return element;\n    }\n  }\n\n  return null;\n}\n\nmodule.exports = {\n  removeExtraFocusElements: function (checkoutForm, onRemoveFocusIntercepts) {\n    var elements = Array.prototype.slice.call(checkoutForm.elements);\n    var firstFocusableInput = _findFirstFocusableElement(elements);\n    var lastFocusableInput = _findFirstFocusableElement(elements.reverse());\n\n    // these should never be identical, because there will at least be the\n    // before and the after input\n    [firstFocusableInput, lastFocusableInput].forEach(function (input) {\n      if (!input) {\n        return;\n      }\n\n      if (focusIntercept.matchFocusElement(input.getAttribute(\"id\"))) {\n        onRemoveFocusIntercepts(input.getAttribute(\"id\"));\n      }\n    });\n  },\n\n  createFocusChangeHandler: function (hostedFieldsId, callbacks) {\n    return function (data) {\n      var currentIndex, targetElement, checkoutForm, navHelper;\n      var sourceElement = document.getElementById(\n        \"bt-\" + data.field + \"-\" + data.direction + \"-\" + hostedFieldsId\n      );\n\n      if (!sourceElement) {\n        return;\n      }\n\n      checkoutForm = findParentTags(sourceElement, \"form\")[0];\n\n      if (document.forms.length < 1 || !checkoutForm) {\n        callbacks.onRemoveFocusIntercepts();\n\n        return;\n      }\n\n      checkoutForm = [].slice.call(checkoutForm.elements);\n      currentIndex = checkoutForm.indexOf(sourceElement);\n      navHelper = _createNavigationHelper(data.direction, checkoutForm.length);\n\n      do {\n        currentIndex += navHelper.indexChange;\n        if (navHelper.checkIndexBounds(currentIndex)) {\n          return;\n        }\n        targetElement = checkoutForm[currentIndex];\n      } while (!_isUserFocusableElement(targetElement));\n\n      if (focusIntercept.matchFocusElement(targetElement.getAttribute(\"id\"))) {\n        callbacks.onTriggerInputFocus(\n          targetElement.getAttribute(\"data-braintree-type\")\n        );\n      } else {\n        targetElement.focus();\n      }\n    };\n  },\n};\n\n},{\"../shared/browser-detection\":131,\"../shared/constants\":132,\"../shared/find-parent-tags\":134,\"../shared/focus-intercept\":135}],127:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar allowedStyles = _dereq_(\"../shared/constants\").allowedStyles;\n\nmodule.exports = function getStylesFromClass(cssClass) {\n  var element = document.createElement(\"input\");\n  var styles = {};\n  var computedStyles;\n\n  if (cssClass[0] === \".\") {\n    cssClass = cssClass.substring(1);\n  }\n\n  element.className = cssClass;\n  element.style.display = \"none !important\";\n  element.style.position = \"fixed !important\";\n  element.style.left = \"-99999px !important\";\n  element.style.top = \"-99999px !important\";\n  document.body.appendChild(element);\n\n  computedStyles = window.getComputedStyle(element);\n\n  allowedStyles.forEach(function (style) {\n    var value = computedStyles[style];\n\n    if (value) {\n      styles[style] = value;\n    }\n  });\n\n  document.body.removeChild(element);\n\n  return styles;\n};\n\n},{\"../shared/constants\":132}],128:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar assign = _dereq_(\"../../lib/assign\").assign;\nvar createAssetsUrl = _dereq_(\"../../lib/create-assets-url\");\nvar isVerifiedDomain = _dereq_(\"../../lib/is-verified-domain\");\nvar Destructor = _dereq_(\"../../lib/destructor\");\nvar iFramer = _dereq_(\"@braintree/iframer\");\nvar Bus = _dereq_(\"framebus\");\nvar createDeferredClient = _dereq_(\"../../lib/create-deferred-client\");\nvar BraintreeError = _dereq_(\"../../lib/braintree-error\");\nvar composeUrl = _dereq_(\"./compose-url\");\nvar getStylesFromClass = _dereq_(\"./get-styles-from-class\");\nvar constants = _dereq_(\"../shared/constants\");\nvar errors = _dereq_(\"../shared/errors\");\nvar INTEGRATION_TIMEOUT_MS =\n  _dereq_(\"../../lib/constants\").INTEGRATION_TIMEOUT_MS;\nvar uuid = _dereq_(\"@braintree/uuid\");\nvar findParentTags = _dereq_(\"../shared/find-parent-tags\");\nvar browserDetection = _dereq_(\"../shared/browser-detection\");\nvar events = constants.events;\nvar EventEmitter = _dereq_(\"@braintree/event-emitter\");\nvar injectFrame = _dereq_(\"./inject-frame\");\nvar analytics = _dereq_(\"../../lib/analytics\");\nvar allowedFields = constants.allowedFields;\nvar methods = _dereq_(\"../../lib/methods\");\nvar shadow = _dereq_(\"../../lib/shadow\");\nvar findRootNode = _dereq_(\"../../lib/find-root-node\");\nvar convertMethodsToError = _dereq_(\"../../lib/convert-methods-to-error\");\nvar sharedErrors = _dereq_(\"../../lib/errors\");\nvar getCardTypes = _dereq_(\"../shared/get-card-types\");\nvar attributeValidationError = _dereq_(\"./attribute-validation-error\");\nvar wrapPromise = _dereq_(\"@braintree/wrap-promise\");\nvar focusChange = _dereq_(\"./focus-change\");\nvar destroyFocusIntercept = _dereq_(\"../shared/focus-intercept\").destroy;\n\nvar SAFARI_FOCUS_TIMEOUT = 5;\n\n/**\n * @typedef {object} HostedFields~tokenizePayload\n * @property {string} nonce The payment method nonce.\n * @property {object} authenticationInsight Info about the [regulatory environment](https://developer.paypal.com/braintree/docs/guides/3d-secure/advanced-options/javascript/v3#authentication-insight) of the tokenized card. Only available if `authenticationInsight.merchantAccountId` is passed in the `tokenize` method options.\n * @property {string} authenticationInsight.regulationEnvironment The [regulation environment](https://developer.paypal.com/braintree/docs/guides/3d-secure/advanced-options/javascript/v3#authentication-insight) for the tokenized card.\n * @property {object} details Additional account details.\n * @property {string} details.bin The BIN number of the card.\n * @property {string} details.cardType Type of card, ex: Visa, MasterCard.\n * @property {string} details.expirationMonth The expiration month of the card.\n * @property {string} details.expirationYear The expiration year of the card.\n * @property {string} details.cardholderName The cardholder name tokenized with the card.\n * @property {string} details.lastFour Last four digits of card number.\n * @property {string} details.lastTwo Last two digits of card number.\n * @property {string} description A human-readable description.\n * @property {string} type The payment method type, always `CreditCard`.\n * @property {object} binData Information about the card based on the bin.\n * @property {string} binData.commercial Possible values: 'Yes', 'No', 'Unknown'.\n * @property {string} binData.countryOfIssuance The country of issuance.\n * @property {string} binData.debit Possible values: 'Yes', 'No', 'Unknown'.\n * @property {string} binData.durbinRegulated Possible values: 'Yes', 'No', 'Unknown'.\n * @property {string} binData.healthcare Possible values: 'Yes', 'No', 'Unknown'.\n * @property {string} binData.issuingBank The issuing bank.\n * @property {string} binData.payroll Possible values: 'Yes', 'No', 'Unknown'.\n * @property {string} binData.prepaid Possible values: 'Yes', 'No', 'Unknown'.\n * @property {string} binData.productId The product id.\n * @property {string} binData.business Possible values: 'Yes', 'No', 'Unknown'.\n * @property {string} binData.consumer Possible values: 'Yes', 'No', 'Unknown'.\n * @property {string} binData.purchase Possible values: 'Yes', 'No', 'Unknown'.\n * @property {string} binData.corporate Possible values: 'Yes', 'No', 'Unknown'.\n */\n\n/**\n * @typedef {object} HostedFields~stateObject\n * @description The event payload sent from {@link HostedFields#on|on} or {@link HostedFields#getState|getState}.\n * @property {HostedFields~hostedFieldsCard[]} cards\n * This will return an array of potential {@link HostedFields~hostedFieldsCard|cards}. If the card type has been determined, the array will contain only one card.\n * Internally, Hosted Fields uses <a href=\"https://github.com/braintree/credit-card-type\">credit-card-type</a>,\n * an open-source card detection library.\n * @property {string} emittedBy\n * The name of the field associated with an event. This will not be included if returned by {@link HostedFields#getState|getState}. It will be one of the following strings:<br>\n * - `\"number\"`\n * - `\"cvv\"`\n * - `\"expirationDate\"`\n * - `\"expirationMonth\"`\n * - `\"expirationYear\"`\n * - `\"postalCode\"`\n * - `\"cardholderName\"`\n * @property {object} fields\n * @property {?HostedFields~hostedFieldsFieldData} fields.number {@link HostedFields~hostedFieldsFieldData|hostedFieldsFieldData} for the number field, if it is present.\n * @property {?HostedFields~hostedFieldsFieldData} fields.cvv {@link HostedFields~hostedFieldsFieldData|hostedFieldsFieldData} for the CVV field, if it is present.\n * @property {?HostedFields~hostedFieldsFieldData} fields.expirationDate {@link HostedFields~hostedFieldsFieldData|hostedFieldsFieldData} for the expiration date field, if it is present.\n * @property {?HostedFields~hostedFieldsFieldData} fields.expirationMonth {@link HostedFields~hostedFieldsFieldData|hostedFieldsFieldData} for the expiration month field, if it is present.\n * @property {?HostedFields~hostedFieldsFieldData} fields.expirationYear {@link HostedFields~hostedFieldsFieldData|hostedFieldsFieldData} for the expiration year field, if it is present.\n * @property {?HostedFields~hostedFieldsFieldData} fields.postalCode {@link HostedFields~hostedFieldsFieldData|hostedFieldsFieldData} for the postal code field, if it is present.\n * @property {?HostedFields~hostedFieldsFieldData} fields.cardholderName {@link HostedFields~hostedFieldsFieldData|hostedFieldsFieldData} for the cardholder name field, if it is present.\n */\n\n/**\n * @typedef {object} HostedFields~binPayload\n * @description The event payload sent from {@link HostedFields#on|on} when the {@link HostedFields#event:binAvailable|binAvailable} event is emitted.\n * @property {string} bin The first 6 digits of the card number.\n */\n\n/**\n * @typedef {object} HostedFields~hostedFieldsFieldData\n * @description Data about Hosted Fields fields, sent in {@link HostedFields~stateObject|stateObjects}.\n * @property {HTMLElement} container Reference to the container DOM element on your page associated with the current event.\n * @property {boolean} isFocused Whether or not the input is currently focused.\n * @property {boolean} isEmpty Whether or not the user has entered a value in the input.\n * @property {boolean} isPotentiallyValid\n * A determination based on the future validity of the input value.\n * This is helpful when a user is entering a card number and types <code>\"41\"</code>.\n * While that value is not valid for submission, it is still possible for\n * it to become a fully qualified entry. However, if the user enters <code>\"4x\"</code>\n * it is clear that the card number can never become valid and isPotentiallyValid will\n * return false.\n * @property {boolean} isValid Whether or not the value of the associated input is <i>fully</i> qualified for submission.\n */\n\n/**\n * @typedef {object} HostedFields~hostedFieldsCard\n * @description Information about the card type, sent in {@link HostedFields~stateObject|stateObjects}.\n * @property {string} type The code-friendly representation of the card type. It will be one of the following strings:\n * - `american-express`\n * - `diners-club`\n * - `discover`\n * - `elo`\n * - `hiper`\n * - `hipercard`\n * - `jcb`\n * - `maestro`\n * - `master-card`\n * - `unionpay`\n * - `visa`\n * @property {string} niceType The pretty-printed card type. It will be one of the following strings:\n * - `American Express`\n * - `Diners Club`\n * - `Discover`\n * - `Elo`\n * - `Hiper`\n * - `Hipercard`\n * - `JCB`\n * - `Maestro`\n * - `MasterCard`\n * - `UnionPay`\n * - `Visa`\n * @property {object} code\n * This object contains data relevant to the security code requirements of the card brand.\n * For example, on a Visa card there will be a <code>CVV</code> of 3 digits, whereas an\n * American Express card requires a 4-digit <code>CID</code>.\n * @property {string} code.name <code>\"CVV\"</code> <code>\"CID\"</code> <code>\"CVC\"</code>\n * @property {number} code.size The expected length of the security code. Typically, this is 3 or 4.\n */\n\n/**\n * @name HostedFields#on\n * @function\n * @param {string} event The name of the event to which you are subscribing.\n * @param {function} handler A callback to handle the event.\n * @description Subscribes a handler function to a named event.\n *\n * **Events that emit a {@link HostedFields~stateObject|stateObject}.**\n * * {@link HostedFields#event:blur|blur}\n * * {@link HostedFields#event:focus|focus}\n * * {@link HostedFields#event:empty|empty}\n * * {@link HostedFields#event:notEmpty|notEmpty}\n * * {@link HostedFields#event:cardTypeChange|cardTypeChange}\n * * {@link HostedFields#event:validityChange|validityChange}\n * * {@link HostedFields#event:inputSubmitRequest|inputSubmitRequest}\n *\n * **Other Events**\n * * {@link HostedFields#event:binAvailable|binAvailable} - emits a {@link HostedFields~binPayload|bin payload}. Note: If you are using a [Referrer-Policy](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referrer-Policy) header that prevents the origin from being sent, this event will not fire.\n * @example\n * <caption>Listening to a Hosted Field event, in this case 'focus'</caption>\n * hostedFields.create({ ... }, function (createErr, hostedFieldsInstance) {\n *   hostedFieldsInstance.on('focus', function (event) {\n *     console.log(event.emittedBy, 'has been focused');\n *   });\n * });\n * @returns {void}\n */\n\n/**\n * @name HostedFields#off\n * @function\n * @param {string} event The name of the event to which you are unsubscribing.\n * @param {function} handler The callback for the event you are unsubscribing from.\n * @description Unsubscribes the handler function to a named event.\n * @example\n * <caption>Subscribing and then unsubscribing from a Hosted Field event, in this case 'focus'</caption>\n * hostedFields.create({ ... }, function (createErr, hostedFieldsInstance) {\n *   var callback = function (event) {\n *     console.log(event.emittedBy, 'has been focused');\n *   };\n *   hostedFieldsInstance.on('focus', callback);\n *\n *   // later on\n *   hostedFieldsInstance.off('focus', callback);\n * });\n * @returns {void}\n */\n\n/**\n * This event is emitted when the user requests submission of an input field, such as by pressing the Enter or Return key on their keyboard, or mobile equivalent.\n * @event HostedFields#inputSubmitRequest\n * @type {HostedFields~stateObject}\n * @example\n * <caption>Clicking a submit button upon hitting Enter (or equivalent) within a Hosted Field</caption>\n * var hostedFields = require('braintree-web/hosted-fields');\n * var submitButton = document.querySelector('input[type=\"submit\"]');\n *\n * hostedFields.create({ ... }, function (createErr, hostedFieldsInstance) {\n *   hostedFieldsInstance.on('inputSubmitRequest', function () {\n *     // User requested submission, e.g. by pressing Enter or equivalent\n *     submitButton.click();\n *   });\n * });\n */\n\n/**\n * This event is emitted when a field transitions from having data to being empty.\n * @event HostedFields#empty\n * @type {HostedFields~stateObject}\n * @example\n * <caption>Listening to an empty event</caption>\n * hostedFields.create({ ... }, function (createErr, hostedFieldsInstance) {\n *   hostedFieldsInstance.on('empty', function (event) {\n *     console.log(event.emittedBy, 'is now empty');\n *   });\n * });\n */\n\n/**\n * This event is emitted when a field transitions from being empty to having data.\n * @event HostedFields#notEmpty\n * @type {HostedFields~stateObject}\n * @example\n * <caption>Listening to an notEmpty event</caption>\n * hostedFields.create({ ... }, function (createErr, hostedFieldsInstance) {\n *   hostedFieldsInstance.on('notEmpty', function (event) {\n *     console.log(event.emittedBy, 'is now not empty');\n *   });\n * });\n */\n\n/**\n * This event is emitted when a field loses focus.\n * @event HostedFields#blur\n * @type {HostedFields~stateObject}\n * @example\n * <caption>Listening to a blur event</caption>\n * hostedFields.create({ ... }, function (createErr, hostedFieldsInstance) {\n *   hostedFieldsInstance.on('blur', function (event) {\n *     console.log(event.emittedBy, 'lost focus');\n *   });\n * });\n */\n\n/**\n * This event is emitted when a field gains focus.\n * @event HostedFields#focus\n * @type {HostedFields~stateObject}\n * @example\n * <caption>Listening to a focus event</caption>\n * hostedFields.create({ ... }, function (createErr, hostedFieldsInstance) {\n *   hostedFieldsInstance.on('focus', function (event) {\n *     console.log(event.emittedBy, 'gained focus');\n *   });\n * });\n */\n\n/**\n * This event is emitted when activity within the number field has changed such that the possible card type has changed.\n * @event HostedFields#cardTypeChange\n * @type {HostedFields~stateObject}\n * @example\n * <caption>Listening to a cardTypeChange event</caption>\n * hostedFields.create({ ... }, function (createErr, hostedFieldsInstance) {\n *   hostedFieldsInstance.on('cardTypeChange', function (event) {\n *     if (event.cards.length === 1) {\n *       console.log(event.cards[0].type);\n *     } else {\n *       console.log('Type of card not yet known');\n *     }\n *   });\n * });\n */\n\n/**\n * This event is emitted when the validity of a field has changed. Validity is represented in the {@link HostedFields~stateObject|stateObject} as two booleans: `isValid` and `isPotentiallyValid`.\n * @event HostedFields#validityChange\n * @type {HostedFields~stateObject}\n * @example\n * <caption>Listening to a validityChange event</caption>\n * hostedFields.create({ ... }, function (createErr, hostedFieldsInstance) {\n *   hostedFieldsInstance.on('validityChange', function (event) {\n *     var field = event.fields[event.emittedBy];\n *\n *     if (field.isValid) {\n *       console.log(event.emittedBy, 'is fully valid');\n *     } else if (field.isPotentiallyValid) {\n *       console.log(event.emittedBy, 'is potentially valid');\n *     } else {\n *       console.log(event.emittedBy, 'is not valid');\n *     }\n *   });\n * });\n */\n\n/**\n * This event is emitted when the first 6 digits of the card number have been entered by the customer.\n * @event HostedFields#binAvailable\n * @type {string}\n * @example\n * <caption>Listening to a `binAvailable` event</caption>\n * hostedFields.create({ ... }, function (createErr, hostedFieldsInstance) {\n *   hostedFieldsInstance.on('binAvailable', function (event) {\n *     event.bin // send bin to 3rd party bin service\n *   });\n * });\n */\n\nfunction createInputEventHandler(fields) {\n  return function (eventData) {\n    var field;\n    var merchantPayload = eventData.merchantPayload;\n    var emittedBy = merchantPayload.emittedBy;\n    var container = fields[emittedBy].containerElement;\n\n    Object.keys(merchantPayload.fields).forEach(function (key) {\n      merchantPayload.fields[key].container = fields[key].containerElement;\n    });\n\n    field = merchantPayload.fields[emittedBy];\n\n    container.classList.toggle(\n      constants.externalClasses.FOCUSED,\n      field.isFocused\n    );\n    container.classList.toggle(constants.externalClasses.VALID, field.isValid);\n\n    container.classList.toggle(\n      constants.externalClasses.INVALID,\n      !field.isPotentiallyValid\n    );\n\n    this._state = {\n      cards: merchantPayload.cards,\n      fields: merchantPayload.fields,\n    };\n\n    this._emit(eventData.type, merchantPayload);\n  };\n}\n\nfunction isVisibleEnough(node) {\n  var boundingBox = node.getBoundingClientRect();\n  var verticalMidpoint = Math.floor(boundingBox.height / 2);\n  var horizontalMidpoint = Math.floor(boundingBox.width / 2);\n\n  return (\n    boundingBox.top <\n      (window.innerHeight - verticalMidpoint ||\n        document.documentElement.clientHeight - verticalMidpoint) &&\n    boundingBox.right > horizontalMidpoint &&\n    boundingBox.bottom > verticalMidpoint &&\n    boundingBox.left <\n      (window.innerWidth - horizontalMidpoint ||\n        document.documentElement.clientWidth - horizontalMidpoint)\n  );\n}\n\n/**\n * @class HostedFields\n * @param {object} options The Hosted Fields {@link module:braintree-web/hosted-fields.create create} options.\n * @description <strong>Do not use this constructor directly. Use {@link module:braintree-web/hosted-fields.create|braintree-web.hosted-fields.create} instead.</strong>\n * @classdesc This class represents a Hosted Fields component produced by {@link module:braintree-web/hosted-fields.create|braintree-web/hosted-fields.create}. Instances of this class have methods for interacting with the input fields within Hosted Fields' iframes.\n */\nfunction HostedFields(options) {\n  var failureTimeout, clientConfig, assetsUrl, isDebug, hostedFieldsUrl;\n  var self = this;\n  var fields = {};\n  var frameReadyPromiseResolveFunctions = {};\n  var frameReadyPromises = [];\n  var componentId = uuid();\n  var sessionId = options.sessionId;\n\n  this._merchantConfigurationOptions = assign({}, options);\n\n  if (options.client) {\n    clientConfig = options.client.getConfiguration(undefined, sessionId);\n    assetsUrl = clientConfig.gatewayConfiguration.assetsUrl;\n    isDebug = clientConfig.isDebug;\n  } else {\n    assetsUrl = createAssetsUrl.create(options.authorization);\n    isDebug = Boolean(options.isDebug);\n  }\n\n  this._clientPromise = createDeferredClient.create({\n    client: options.client,\n    authorization: options.authorization,\n    debug: isDebug,\n    assetsUrl: assetsUrl,\n    name: \"Hosted Fields\",\n    sessionId: sessionId,\n  });\n  // Default URL (used in production)\n  hostedFieldsUrl = composeUrl(assetsUrl, componentId, isDebug);\n\n  if (!options.fields || Object.keys(options.fields).length === 0) {\n    throw new BraintreeError({\n      type: sharedErrors.INSTANTIATION_OPTION_REQUIRED.type,\n      code: sharedErrors.INSTANTIATION_OPTION_REQUIRED.code,\n      message: \"options.fields is required when instantiating Hosted Fields.\",\n    });\n  }\n\n  EventEmitter.call(this);\n\n  this._injectedNodes = [];\n  this._destructor = new Destructor();\n  this._fields = fields;\n  this._state = {\n    fields: {},\n    cards: getCardTypes(\"\"),\n  };\n\n  this._bus = new Bus({\n    channel: componentId,\n    verifyDomain: isVerifiedDomain,\n    targetFrames: [window],\n  });\n\n  this._destructor.registerFunctionForTeardown(function () {\n    self._bus.teardown();\n  });\n\n  if (!options.client) {\n    analytics.sendEvent(\n      this._clientPromise,\n      \"custom.hosted-fields.initialized.deferred-client\"\n    );\n  } else {\n    analytics.sendEvent(\n      this._clientPromise,\n      \"custom.hosted-fields.initialized\"\n    );\n  }\n\n  Object.keys(options.fields).forEach(\n    function (key) {\n      var field, externalContainer, internalContainer, frame, frameReadyPromise;\n\n      if (!constants.allowedFields.hasOwnProperty(key)) {\n        throw new BraintreeError({\n          type: errors.HOSTED_FIELDS_INVALID_FIELD_KEY.type,\n          code: errors.HOSTED_FIELDS_INVALID_FIELD_KEY.code,\n          message: '\"' + key + '\" is not a valid field.',\n        });\n      }\n\n      field = options.fields[key];\n      // NEXT_MAJOR_VERSION remove selector as an option\n      // and simply make the API take a container\n      externalContainer = field.container || field.selector;\n\n      if (typeof externalContainer === \"string\") {\n        externalContainer = document.querySelector(externalContainer);\n      }\n\n      if (!externalContainer || externalContainer.nodeType !== 1) {\n        throw new BraintreeError({\n          type: errors.HOSTED_FIELDS_INVALID_FIELD_SELECTOR.type,\n          code: errors.HOSTED_FIELDS_INVALID_FIELD_SELECTOR.code,\n          message: errors.HOSTED_FIELDS_INVALID_FIELD_SELECTOR.message,\n          details: {\n            fieldSelector: field.selector,\n            fieldContainer: field.container,\n            fieldKey: key,\n          },\n        });\n      } else if (\n        externalContainer.querySelector('iframe[name^=\"braintree-\"]')\n      ) {\n        throw new BraintreeError({\n          type: errors.HOSTED_FIELDS_FIELD_DUPLICATE_IFRAME.type,\n          code: errors.HOSTED_FIELDS_FIELD_DUPLICATE_IFRAME.code,\n          message: errors.HOSTED_FIELDS_FIELD_DUPLICATE_IFRAME.message,\n          details: {\n            fieldSelector: field.selector,\n            fieldContainer: field.container,\n            fieldKey: key,\n          },\n        });\n      }\n\n      internalContainer = externalContainer;\n\n      if (shadow.isShadowElement(internalContainer)) {\n        internalContainer = shadow.transformToSlot(\n          internalContainer,\n          \"height: 100%\"\n        );\n      }\n\n      if (field.maxlength && typeof field.maxlength !== \"number\") {\n        throw new BraintreeError({\n          type: errors.HOSTED_FIELDS_FIELD_PROPERTY_INVALID.type,\n          code: errors.HOSTED_FIELDS_FIELD_PROPERTY_INVALID.code,\n          message: \"The value for maxlength must be a number.\",\n          details: {\n            fieldKey: key,\n          },\n        });\n      }\n\n      if (field.minlength && typeof field.minlength !== \"number\") {\n        throw new BraintreeError({\n          type: errors.HOSTED_FIELDS_FIELD_PROPERTY_INVALID.type,\n          code: errors.HOSTED_FIELDS_FIELD_PROPERTY_INVALID.code,\n          message: \"The value for minlength must be a number.\",\n          details: {\n            fieldKey: key,\n          },\n        });\n      }\n\n      frame = iFramer({\n        type: key,\n        name: \"braintree-hosted-field-\" + key,\n        style: constants.defaultIFrameStyle,\n        title:\n          field.iframeTitle ||\n          \"Secure Credit Card Frame - \" + constants.allowedFields[key].label,\n      });\n      this._bus.addTargetFrame(frame);\n\n      this._injectedNodes.push.apply(\n        this._injectedNodes,\n        injectFrame(componentId, frame, internalContainer, function () {\n          self.focus(key);\n        })\n      );\n\n      this._setupLabelFocus(key, externalContainer);\n      fields[key] = {\n        frameElement: frame,\n        containerElement: externalContainer,\n      };\n      frameReadyPromise = new Promise(function (resolve) {\n        frameReadyPromiseResolveFunctions[key] = resolve;\n      });\n      frameReadyPromises.push(frameReadyPromise);\n\n      this._state.fields[key] = {\n        isEmpty: true,\n        isValid: false,\n        isPotentiallyValid: true,\n        isFocused: false,\n        container: externalContainer,\n      };\n\n      // prevents loading the iframe from blocking the code\n      setTimeout(function () {\n        frame.src = hostedFieldsUrl;\n      }, 0);\n    }.bind(this)\n  );\n\n  if (this._merchantConfigurationOptions.styles) {\n    Object.keys(this._merchantConfigurationOptions.styles).forEach(\n      function (selector) {\n        var className = self._merchantConfigurationOptions.styles[selector];\n\n        if (typeof className === \"string\") {\n          self._merchantConfigurationOptions.styles[selector] =\n            getStylesFromClass(className);\n        }\n      }\n    );\n  }\n\n  this._bus.on(events.REMOVE_FOCUS_INTERCEPTS, function (data) {\n    destroyFocusIntercept(data && data.id);\n  });\n\n  this._bus.on(\n    events.TRIGGER_FOCUS_CHANGE,\n    focusChange.createFocusChangeHandler(componentId, {\n      onRemoveFocusIntercepts: function (element) {\n        self._bus.emit(events.REMOVE_FOCUS_INTERCEPTS, {\n          id: element,\n        });\n      },\n      onTriggerInputFocus: function (targetType) {\n        self.focus(targetType);\n      },\n    })\n  );\n\n  this._bus.on(events.READY_FOR_CLIENT, function (reply) {\n    self._clientPromise.then(function (client) {\n      reply(client);\n    });\n  });\n\n  this._bus.on(events.CARD_FORM_ENTRY_HAS_BEGUN, function () {\n    analytics.sendEvent(self._clientPromise, \"hosted-fields.input.started\");\n  });\n\n  this._bus.on(events.BIN_AVAILABLE, function (bin) {\n    self._emit(\"binAvailable\", {\n      bin: bin,\n    });\n  });\n\n  failureTimeout = setTimeout(function () {\n    analytics.sendEvent(\n      self._clientPromise,\n      \"custom.hosted-fields.load.timed-out\"\n    );\n    self._emit(\"timeout\");\n  }, INTEGRATION_TIMEOUT_MS);\n\n  Promise.all(frameReadyPromises).then(function (results) {\n    var reply = results[0];\n\n    clearTimeout(failureTimeout);\n    reply(\n      formatMerchantConfigurationForIframes(self._merchantConfigurationOptions)\n    );\n\n    self._cleanUpFocusIntercepts();\n\n    self._emit(\"ready\");\n  });\n\n  this._bus.on(events.FRAME_READY, function (data, reply) {\n    frameReadyPromiseResolveFunctions[data.field](reply);\n  });\n\n  this._bus.on(events.INPUT_EVENT, createInputEventHandler(fields).bind(this));\n\n  this._destructor.registerFunctionForTeardown(function () {\n    var j, node, parent;\n\n    for (j = 0; j < self._injectedNodes.length; j++) {\n      node = self._injectedNodes[j];\n      parent = node.parentNode;\n\n      parent.removeChild(node);\n\n      parent.classList.remove(\n        constants.externalClasses.FOCUSED,\n        constants.externalClasses.INVALID,\n        constants.externalClasses.VALID\n      );\n    }\n  });\n\n  this._destructor.registerFunctionForTeardown(function () {\n    destroyFocusIntercept();\n  });\n\n  this._destructor.registerFunctionForTeardown(function () {\n    var methodNames = methods(HostedFields.prototype).concat(\n      methods(EventEmitter.prototype)\n    );\n\n    convertMethodsToError(self, methodNames);\n  });\n}\n\nEventEmitter.createChild(HostedFields);\n\nHostedFields.prototype._setupLabelFocus = function (type, container) {\n  var labels, i;\n  var self = this;\n  var rootNode = findRootNode(container);\n\n  if (container.id == null) {\n    return;\n  }\n\n  function triggerFocus() {\n    self.focus(type);\n  }\n\n  // find any labels in the normal DOM\n  labels = Array.prototype.slice.call(\n    document.querySelectorAll('label[for=\"' + container.id + '\"]')\n  );\n  if (rootNode !== document) {\n    // find any labels within the shadow dom\n    labels = labels.concat(\n      Array.prototype.slice.call(\n        rootNode.querySelectorAll('label[for=\"' + container.id + '\"]')\n      )\n    );\n  }\n  // find any labels surrounding the container that don't also have the `for` attribute\n  labels = labels.concat(findParentTags(container, \"label\"));\n  // filter out any accidental duplicates\n  labels = labels.filter(function (label, index, arr) {\n    return arr.indexOf(label) === index;\n  });\n\n  for (i = 0; i < labels.length; i++) {\n    labels[i].addEventListener(\"click\", triggerFocus, false);\n  }\n\n  this._destructor.registerFunctionForTeardown(function () {\n    for (i = 0; i < labels.length; i++) {\n      labels[i].removeEventListener(\"click\", triggerFocus, false);\n    }\n  });\n};\n\nHostedFields.prototype._getAnyFieldContainer = function () {\n  var self = this;\n\n  return Object.keys(this._fields).reduce(function (found, field) {\n    return found || self._fields[field].containerElement;\n  }, null);\n};\n\nHostedFields.prototype._cleanUpFocusIntercepts = function () {\n  var iframeContainer, checkoutForm;\n\n  if (document.forms.length < 1) {\n    this._bus.emit(events.REMOVE_FOCUS_INTERCEPTS);\n  } else {\n    iframeContainer = this._getAnyFieldContainer();\n    checkoutForm = findParentTags(iframeContainer, \"form\")[0];\n\n    if (checkoutForm) {\n      focusChange.removeExtraFocusElements(\n        checkoutForm,\n        function (id) {\n          this._bus.emit(events.REMOVE_FOCUS_INTERCEPTS, {\n            id: id,\n          });\n        }.bind(this)\n      );\n    } else {\n      this._bus.emit(events.REMOVE_FOCUS_INTERCEPTS);\n    }\n  }\n};\n\nHostedFields.prototype._attachInvalidFieldContainersToError = function (err) {\n  if (\n    !(\n      err.details &&\n      err.details.invalidFieldKeys &&\n      err.details.invalidFieldKeys.length > 0\n    )\n  ) {\n    return;\n  }\n  err.details.invalidFields = {};\n  err.details.invalidFieldKeys.forEach(\n    function (field) {\n      err.details.invalidFields[field] = this._fields[field].containerElement;\n    }.bind(this)\n  );\n};\n\n/**\n * Get card verification challenges, such as requirements for cvv and postal code.\n * @public\n * @param {callback} [callback] Called on completion, containing an error if one occurred. If no callback is provided, `getChallenges` returns a promise.\n * @example\n * hostedFieldsInstance.getChallenges().then(function (challenges) {\n *   challenges // ['cvv', 'postal_code']\n * });\n * @returns {(Promise|void)} Returns a promise if no callback is provided.\n */\nHostedFields.prototype.getChallenges = function () {\n  return this._clientPromise.then(function (client) {\n    return client.getConfiguration().gatewayConfiguration.challenges;\n  });\n};\n\n/**\n * Get supported card types configured in the Braintree Control Panel\n * @public\n * @param {callback} [callback] Called on completion, containing an error if one occurred. If no callback is provided, `getSupportedCardTypes` returns a promise.\n * @example\n * hostedFieldsInstance.getSupportedCardTypes().then(function (cardTypes) {\n *   cardTypes // ['Visa', 'American Express', 'Mastercard']\n * });\n * @returns {(Promise|void)} Returns a promise if no callback is provided.\n */\nHostedFields.prototype.getSupportedCardTypes = function () {\n  return this._clientPromise.then(function (client) {\n    var cards = client\n      .getConfiguration()\n      .gatewayConfiguration.creditCards.supportedCardTypes.map(\n        function (cardType) {\n          if (cardType === \"MasterCard\") {\n            // Mastercard changed their branding. We can't update our\n            // config without creating a breaking change, so we just\n            // hard code the change here\n            return \"Mastercard\";\n          }\n\n          return cardType;\n        }\n      );\n\n    return cards;\n  });\n};\n\n/**\n * Cleanly remove anything set up by {@link module:braintree-web/hosted-fields.create|create}.\n * @public\n * @param {callback} [callback] Called on completion, containing an error if one occurred. No data is returned if teardown completes successfully. If no callback is provided, `teardown` returns a promise.\n * @example\n * hostedFieldsInstance.teardown(function (teardownErr) {\n *   if (teardownErr) {\n *     console.error('Could not tear down Hosted Fields!');\n *   } else {\n *     console.info('Hosted Fields has been torn down!');\n *   }\n * });\n * @returns {(Promise|void)} Returns a promise if no callback is provided.\n */\nHostedFields.prototype.teardown = function () {\n  var self = this;\n\n  return new Promise(function (resolve, reject) {\n    self._destructor.teardown(function (err) {\n      analytics.sendEvent(\n        self._clientPromise,\n        \"custom.hosted-fields.teardown-completed\"\n      );\n\n      if (err) {\n        reject(err);\n      } else {\n        resolve();\n      }\n    });\n  });\n};\n\n/**\n * Tokenizes fields and returns a nonce payload.\n * @public\n * @param {object} [options] All tokenization options for the Hosted Fields component.\n * @param {boolean} [options.vault=false] When true, will vault the tokenized card. Cards will only be vaulted when using a client created with a client token that includes a customer ID. Note: merchants using Advanced Fraud Tools should not use this option, as device data will not be included.\n * @param {object} [options.authenticationInsight] Options for checking authentication insight - the [regulatory environment](https://developer.paypal.com/braintree/docs/guides/3d-secure/advanced-options/javascript/v3#authentication-insight) of the tokenized card.\n * @param {string} options.authenticationInsight.merchantAccountId The Braintree merchant account id to use to look up the authentication insight information.\n * @param {array} [options.fieldsToTokenize] By default, all fields will be tokenized. You may specify which fields specifically you wish to tokenize with this property. Valid options are `'number'`, `'cvv'`, `'expirationDate'`, `'expirationMonth'`, `'expirationYear'`, `'postalCode'`, `'cardholderName'`.\n * @param {string} [options.cardholderName] When supplied, the cardholder name to be tokenized with the contents of the fields.\n * @param {string} [options.billingAddress.postalCode] When supplied, this postal code will be tokenized along with the contents of the fields. If a postal code is provided as part of the Hosted Fields configuration, the value of the field will be tokenized and this value will be ignored.\n * @param {string} [options.billingAddress.firstName] When supplied, this customer first name will be tokenized along with the contents of the fields.\n * @param {string} [options.billingAddress.lastName] When supplied, this customer last name will be tokenized along with the contents of the fields.\n * @param {string} [options.billingAddress.company] When supplied, this company name will be tokenized along with the contents of the fields.\n * @param {string} [options.billingAddress.streetAddress] When supplied, this street address will be tokenized along with the contents of the fields.\n * @param {string} [options.billingAddress.extendedAddress] When supplied, this extended address will be tokenized along with the contents of the fields.\n * @param {string} [options.billingAddress.locality] When supplied, this locality (the city) will be tokenized along with the contents of the fields.\n * @param {string} [options.billingAddress.region] When supplied, this region (the state) will be tokenized along with the contents of the fields.\n * @param {string} [options.billingAddress.countryCodeNumeric] When supplied, this numeric country code will be tokenized along with the contents of the fields.\n * @param {string} [options.billingAddress.countryCodeAlpha2] When supplied, this alpha 2 representation of a country will be tokenized along with the contents of the fields.\n * @param {string} [options.billingAddress.countryCodeAlpha3] When supplied, this alpha 3 representation of a country will be tokenized along with the contents of the fields.\n * @param {string} [options.billingAddress.countryName] When supplied, this country name will be tokenized along with the contents of the fields.\n *\n * @param {callback} [callback] May be used as the only parameter of the function if no options are passed in. The second argument, <code>data</code>, is a {@link HostedFields~tokenizePayload|tokenizePayload}. If no callback is provided, `tokenize` returns a function that resolves with a {@link HostedFields~tokenizePayload|tokenizePayload}.\n * @example <caption>Tokenize a card</caption>\n * hostedFieldsInstance.tokenize(function (tokenizeErr, payload) {\n *   if (tokenizeErr) {\n *     switch (tokenizeErr.code) {\n *       case 'HOSTED_FIELDS_FIELDS_EMPTY':\n *         // occurs when none of the fields are filled in\n *         console.error('All fields are empty! Please fill out the form.');\n *         break;\n *       case 'HOSTED_FIELDS_FIELDS_INVALID':\n *         // occurs when certain fields do not pass client side validation\n *         console.error('Some fields are invalid:', tokenizeErr.details.invalidFieldKeys);\n *\n *         // you can also programmatically access the field containers for the invalid fields\n *         tokenizeErr.details.invalidFields.forEach(function (fieldContainer) {\n *           fieldContainer.className = 'invalid';\n *         });\n *         break;\n *       case 'HOSTED_FIELDS_TOKENIZATION_FAIL_ON_DUPLICATE':\n *         // occurs when:\n *         //   * the client token used for client authorization was generated\n *         //     with a customer ID and the fail on duplicate payment method\n *         //     option is set to true\n *         //   * the card being tokenized has previously been vaulted (with any customer)\n *         // See: https://developer.paypal.com/braintree/docs/reference/request/client-token/generate#options.fail_on_duplicate_payment_method\n *         console.error('This payment method already exists in your vault.');\n *         break;\n *       case 'HOSTED_FIELDS_TOKENIZATION_CVV_VERIFICATION_FAILED':\n *         // occurs when:\n *         //   * the client token used for client authorization was generated\n *         //     with a customer ID and the verify card option is set to true\n *         //     and you have credit card verification turned on in the Braintree\n *         //     control panel\n *         //   * the cvv does not pass verification (https://developer.paypal.com/braintree/docs/reference/general/testing#avs-and-cvv/cid-responses)\n *         // See: https://developer.paypal.com/braintree/docs/reference/request/client-token/generate#options.verify_card\n *         console.error('CVV did not pass verification');\n *         break;\n *       case 'HOSTED_FIELDS_FAILED_TOKENIZATION':\n *         // occurs for any other tokenization error on the server\n *         console.error('Tokenization failed server side. Is the card valid?');\n *         break;\n *       case 'HOSTED_FIELDS_TOKENIZATION_NETWORK_ERROR':\n *         // occurs when the Braintree gateway cannot be contacted\n *         console.error('Network error occurred when tokenizing.');\n *         break;\n *       default:\n *         console.error('Something bad happened!', tokenizeErr);\n *     }\n *   } else {\n *     console.log('Got nonce:', payload.nonce);\n *   }\n * });\n * @example <caption>Tokenize and vault a card</caption>\n * hostedFieldsInstance.tokenize({\n *   vault: true\n * }, function (tokenizeErr, payload) {\n *   if (tokenizeErr) {\n *     console.error(tokenizeErr);\n *   } else {\n *     console.log('Got nonce:', payload.nonce);\n *   }\n * });\n * @example <caption>Tokenize a card with non-Hosted Fields cardholder name</caption>\n * hostedFieldsInstance.tokenize({\n *   cardholderName: 'First Last'\n * }, function (tokenizeErr, payload) {\n *   if (tokenizeErr) {\n *     console.error(tokenizeErr);\n *   } else {\n *     console.log('Got nonce:', payload.nonce);\n *   }\n * });\n * @example <caption>Tokenize a card with non-Hosted Fields postal code option</caption>\n * hostedFieldsInstance.tokenize({\n *   billingAddress: {\n *     postalCode: '11111'\n *   }\n * }, function (tokenizeErr, payload) {\n *   if (tokenizeErr) {\n *     console.error(tokenizeErr);\n *   } else {\n *     console.log('Got nonce:', payload.nonce);\n *   }\n * });\n * @example <caption>Tokenize a card with additional billing address options</caption>\n * hostedFieldsInstance.tokenize({\n *   billingAddress: {\n *     firstName: 'First',\n *     lastName: 'Last',\n *     company: 'Company',\n *     streetAddress: '123 Street',\n *     extendedAddress: 'Unit 1',\n *     // passing just one of the country options is sufficient to\n *     // associate the card details with a particular country\n *     // valid country names and codes can be found here:\n *     // https://developer.paypal.com/braintree/docs/reference/general/countries/ruby#list-of-countries\n *     countryName: 'United States',\n *     countryCodeAlpha2: 'US',\n *     countryCodeAlpha3: 'USA',\n *     countryCodeNumeric: '840'\n *   }\n * }, function (tokenizeErr, payload) {\n *   if (tokenizeErr) {\n *     console.error(tokenizeErr);\n *   } else {\n *     console.log('Got nonce:', payload.nonce);\n *   }\n * });\n * @example <caption>Allow tokenization with empty cardholder name field</caption>\n * var state = hostedFieldsInstance.getState();\n * var fields = Object.keys(state.fields);\n *\n * // normally, if you tried to tokenize an empty cardholder name field\n * // you would get an error, to allow making this field optional,\n * // tokenize all the fields except for the cardholder name field\n * // when the cardholder name field is empty. Otherwise, tokenize\n * // all the fields\n * if (state.fields.cardholderName.isEmpty) {\n *  fields = fields.filter(function (field) {\n *    return field !== 'cardholderName';\n *  });\n * }\n *\n * hostedFieldsInstance.tokenize({\n *  fieldsToTokenize: fields\n * }, function (tokenizeErr, payload) {\n *   if (tokenizeErr) {\n *     console.error(tokenizeErr);\n *   } else {\n *     console.log('Got nonce:', payload.nonce);\n *   }\n * });\n * @returns {(Promise|void)} Returns a promise if no callback is provided.\n */\nHostedFields.prototype.tokenize = function (options) {\n  var self = this;\n\n  if (!options) {\n    options = {};\n  }\n\n  return new Promise(function (resolve, reject) {\n    self._bus.emit(events.TOKENIZATION_REQUEST, options, function (response) {\n      var err = response[0];\n      var payload = response[1];\n\n      if (err) {\n        self._attachInvalidFieldContainersToError(err);\n        reject(new BraintreeError(err));\n      } else {\n        resolve(payload);\n      }\n    });\n  });\n};\n\n/**\n * Add a class to a {@link module:braintree-web/hosted-fields~field field}. Useful for updating field styles when events occur elsewhere in your checkout.\n * @public\n * @param {string} field The field you wish to add a class to. Must be a valid {@link module:braintree-web/hosted-fields~fieldOptions fieldOption}.\n * @param {string} classname The class to be added.\n * @param {callback} [callback] Callback executed on completion, containing an error if one occurred. No data is returned if the class is added successfully.\n *\n * @example\n * hostedFieldsInstance.addClass('number', 'custom-class', function (addClassErr) {\n *   if (addClassErr) {\n *     console.error(addClassErr);\n *   }\n * });\n * @returns {(Promise|void)} Returns a promise if no callback is provided.\n */\nHostedFields.prototype.addClass = function (field, classname) {\n  var err;\n\n  if (!allowedFields.hasOwnProperty(field)) {\n    err = new BraintreeError({\n      type: errors.HOSTED_FIELDS_FIELD_INVALID.type,\n      code: errors.HOSTED_FIELDS_FIELD_INVALID.code,\n      message:\n        '\"' +\n        field +\n        '\" is not a valid field. You must use a valid field option when adding a class.',\n    });\n  } else if (!this._fields.hasOwnProperty(field)) {\n    err = new BraintreeError({\n      type: errors.HOSTED_FIELDS_FIELD_NOT_PRESENT.type,\n      code: errors.HOSTED_FIELDS_FIELD_NOT_PRESENT.code,\n      message:\n        'Cannot add class to \"' +\n        field +\n        '\" field because it is not part of the current Hosted Fields options.',\n    });\n  } else {\n    this._bus.emit(events.ADD_CLASS, {\n      field: field,\n      classname: classname,\n    });\n  }\n\n  if (err) {\n    return Promise.reject(err);\n  }\n\n  return Promise.resolve();\n};\n\n/**\n * Removes a class to a {@link module:braintree-web/hosted-fields~field field}. Useful for updating field styles when events occur elsewhere in your checkout.\n * @public\n * @param {string} field The field you wish to remove a class from. Must be a valid {@link module:braintree-web/hosted-fields~fieldOptions fieldOption}.\n * @param {string} classname The class to be removed.\n * @param {callback} [callback] Callback executed on completion, containing an error if one occurred. No data is returned if the class is removed successfully.\n *\n * @example\n * hostedFieldsInstance.addClass('number', 'custom-class', function (addClassErr) {\n *   if (addClassErr) {\n *     console.error(addClassErr);\n *     return;\n *   }\n *\n *   // some time later...\n *   hostedFieldsInstance.removeClass('number', 'custom-class');\n * });\n * @returns {(Promise|void)} Returns a promise if no callback is provided.\n */\nHostedFields.prototype.removeClass = function (field, classname) {\n  var err;\n\n  if (!allowedFields.hasOwnProperty(field)) {\n    err = new BraintreeError({\n      type: errors.HOSTED_FIELDS_FIELD_INVALID.type,\n      code: errors.HOSTED_FIELDS_FIELD_INVALID.code,\n      message:\n        '\"' +\n        field +\n        '\" is not a valid field. You must use a valid field option when removing a class.',\n    });\n  } else if (!this._fields.hasOwnProperty(field)) {\n    err = new BraintreeError({\n      type: errors.HOSTED_FIELDS_FIELD_NOT_PRESENT.type,\n      code: errors.HOSTED_FIELDS_FIELD_NOT_PRESENT.code,\n      message:\n        'Cannot remove class from \"' +\n        field +\n        '\" field because it is not part of the current Hosted Fields options.',\n    });\n  } else {\n    this._bus.emit(events.REMOVE_CLASS, {\n      field: field,\n      classname: classname,\n    });\n  }\n\n  if (err) {\n    return Promise.reject(err);\n  }\n\n  return Promise.resolve();\n};\n\n/**\n * Sets an attribute of a {@link module:braintree-web/hosted-fields~field field}.\n * Supported attributes are `aria-invalid`, `aria-required`, `disabled`, and `placeholder`.\n *\n * @public\n * @param {object} options The options for the attribute you wish to set.\n * @param {string} options.field The field to which you wish to add an attribute. Must be a valid {@link module:braintree-web/hosted-fields~fieldOptions fieldOption}.\n * @param {string} options.attribute The name of the attribute you wish to add to the field.\n * @param {string} options.value The value for the attribute.\n * @param {callback} [callback] Callback executed on completion, containing an error if one occurred. No data is returned if the attribute is set successfully.\n *\n * @example <caption>Set the placeholder attribute of a field</caption>\n * hostedFieldsInstance.setAttribute({\n *   field: 'number',\n *   attribute: 'placeholder',\n *   value: '1111 1111 1111 1111'\n * }, function (attributeErr) {\n *   if (attributeErr) {\n *     console.error(attributeErr);\n *   }\n * });\n *\n * @example <caption>Set the aria-required attribute of a field</caption>\n * hostedFieldsInstance.setAttribute({\n *   field: 'number',\n *   attribute: 'aria-required',\n *   value: true\n * }, function (attributeErr) {\n *   if (attributeErr) {\n *     console.error(attributeErr);\n *   }\n * });\n *\n * @returns {(Promise|void)} Returns a promise if no callback is provided.\n */\nHostedFields.prototype.setAttribute = function (options) {\n  var attributeErr, err;\n\n  if (!allowedFields.hasOwnProperty(options.field)) {\n    err = new BraintreeError({\n      type: errors.HOSTED_FIELDS_FIELD_INVALID.type,\n      code: errors.HOSTED_FIELDS_FIELD_INVALID.code,\n      message:\n        '\"' +\n        options.field +\n        '\" is not a valid field. You must use a valid field option when setting an attribute.',\n    });\n  } else if (!this._fields.hasOwnProperty(options.field)) {\n    err = new BraintreeError({\n      type: errors.HOSTED_FIELDS_FIELD_NOT_PRESENT.type,\n      code: errors.HOSTED_FIELDS_FIELD_NOT_PRESENT.code,\n      message:\n        'Cannot set attribute for \"' +\n        options.field +\n        '\" field because it is not part of the current Hosted Fields options.',\n    });\n  } else {\n    attributeErr = attributeValidationError(options.attribute, options.value);\n\n    if (attributeErr) {\n      err = attributeErr;\n    } else {\n      this._bus.emit(events.SET_ATTRIBUTE, {\n        field: options.field,\n        attribute: options.attribute,\n        value: options.value,\n      });\n    }\n  }\n\n  if (err) {\n    return Promise.reject(err);\n  }\n\n  return Promise.resolve();\n};\n\n/**\n * Sets the month options for the expiration month field when presented as a select element.\n *\n * @public\n * @param {array} options An array of 12 entries corresponding to the 12 months.\n * @param {callback} [callback] Callback executed on completion, containing an error if one occurred. No data is returned if the options are updated successfully. Errors if expirationMonth is not configured on the Hosted Fields instance or if the expirationMonth field is not configured to be a select input.\n *\n * @example <caption>Update the month options to spanish</caption>\n * hostedFieldsInstance.setMonthOptions([\n *   '01 - enero',\n *   '02 - febrero',\n *   '03 - marzo',\n *   '04 - abril',\n *   '05 - mayo',\n *   '06 - junio',\n *   '07 - julio',\n *   '08 - agosto',\n *   '09 - septiembre',\n *   '10 - octubre',\n *   '11 - noviembre',\n *   '12 - diciembre'\n * ]);\n *\n * @returns {(Promise|void)} Returns a promise if no callback is provided.\n */\nHostedFields.prototype.setMonthOptions = function (options) {\n  var self = this;\n  var merchantOptions = this._merchantConfigurationOptions.fields;\n  var errorMessage;\n\n  if (!merchantOptions.expirationMonth) {\n    errorMessage = \"Expiration month field must exist to use setMonthOptions.\";\n  } else if (!merchantOptions.expirationMonth.select) {\n    errorMessage = \"Expiration month field must be a select element.\";\n  }\n\n  if (errorMessage) {\n    return Promise.reject(\n      new BraintreeError({\n        type: errors.HOSTED_FIELDS_FIELD_PROPERTY_INVALID.type,\n        code: errors.HOSTED_FIELDS_FIELD_PROPERTY_INVALID.code,\n        message: errorMessage,\n      })\n    );\n  }\n\n  return new Promise(function (resolve) {\n    self._bus.emit(events.SET_MONTH_OPTIONS, options, resolve);\n  });\n};\n\n/**\n * Sets a visually hidden message (for screen readers) on a {@link module:braintree-web/hosted-fields~field field}.\n *\n * @public\n * @param {object} options The options for the attribute you wish to set.\n * @param {string} options.field The field to which you wish to add an attribute. Must be a valid {@link module:braintree-web/hosted-fields~field field}.\n * @param {string} options.message The message to set.\n *\n * @example <caption>Set an error message on a field</caption>\n * hostedFieldsInstance.setMessage({\n *   field: 'number',\n *   message: 'Invalid card number'\n * });\n *\n * @example <caption>Remove the message on a field</caption>\n * hostedFieldsInstance.setMessage({\n *   field: 'number',\n *   message: ''\n * });\n *\n * @returns {void}\n */\nHostedFields.prototype.setMessage = function (options) {\n  this._bus.emit(events.SET_MESSAGE, {\n    field: options.field,\n    message: options.message,\n  });\n};\n\n/**\n * Removes a supported attribute from a {@link module:braintree-web/hosted-fields~field field}.\n *\n * @public\n * @param {object} options The options for the attribute you wish to remove.\n * @param {string} options.field The field from which you wish to remove an attribute. Must be a valid {@link module:braintree-web/hosted-fields~fieldOptions fieldOption}.\n * @param {string} options.attribute The name of the attribute you wish to remove from the field.\n * @param {callback} [callback] Callback executed on completion, containing an error if one occurred. No data is returned if the attribute is removed successfully.\n *\n * @example <caption>Remove the placeholder attribute of a field</caption>\n * hostedFieldsInstance.removeAttribute({\n *   field: 'number',\n *   attribute: 'placeholder'\n * }, function (attributeErr) {\n *   if (attributeErr) {\n *     console.error(attributeErr);\n *   }\n * });\n *\n * @returns {(Promise|void)} Returns a promise if no callback is provided.\n */\nHostedFields.prototype.removeAttribute = function (options) {\n  var attributeErr, err;\n\n  if (!allowedFields.hasOwnProperty(options.field)) {\n    err = new BraintreeError({\n      type: errors.HOSTED_FIELDS_FIELD_INVALID.type,\n      code: errors.HOSTED_FIELDS_FIELD_INVALID.code,\n      message:\n        '\"' +\n        options.field +\n        '\" is not a valid field. You must use a valid field option when removing an attribute.',\n    });\n  } else if (!this._fields.hasOwnProperty(options.field)) {\n    err = new BraintreeError({\n      type: errors.HOSTED_FIELDS_FIELD_NOT_PRESENT.type,\n      code: errors.HOSTED_FIELDS_FIELD_NOT_PRESENT.code,\n      message:\n        'Cannot remove attribute for \"' +\n        options.field +\n        '\" field because it is not part of the current Hosted Fields options.',\n    });\n  } else {\n    attributeErr = attributeValidationError(options.attribute);\n\n    if (attributeErr) {\n      err = attributeErr;\n    } else {\n      this._bus.emit(events.REMOVE_ATTRIBUTE, {\n        field: options.field,\n        attribute: options.attribute,\n      });\n    }\n  }\n\n  if (err) {\n    return Promise.reject(err);\n  }\n\n  return Promise.resolve();\n};\n\n/**\n * @deprecated since version 3.8.0. Use {@link HostedFields#setAttribute|setAttribute} instead.\n *\n * @public\n * @param {string} field The field whose placeholder you wish to change. Must be a valid {@link module:braintree-web/hosted-fields~fieldOptions fieldOption}.\n * @param {string} placeholder Will be used as the `placeholder` attribute of the input.\n * @param {callback} [callback] Callback executed on completion, containing an error if one occurred. No data is returned if the placeholder updated successfully.\n *\n * @returns {(Promise|void)} Returns a promise if no callback is provided.\n */\nHostedFields.prototype.setPlaceholder = function (field, placeholder) {\n  return this.setAttribute({\n    field: field,\n    attribute: \"placeholder\",\n    value: placeholder,\n  });\n};\n\n/**\n * Clear the value of a {@link module:braintree-web/hosted-fields~field field}.\n * @public\n * @param {string} field The field you wish to clear. Must be a valid {@link module:braintree-web/hosted-fields~fieldOptions fieldOption}.\n * @param {callback} [callback] Callback executed on completion, containing an error if one occurred. No data is returned if the field cleared successfully.\n * @returns {(Promise|void)} Returns a promise if no callback is provided.\n * @example\n * hostedFieldsInstance.clear('number', function (clearErr) {\n *   if (clearErr) {\n *     console.error(clearErr);\n *   }\n * });\n *\n * @example <caption>Clear several fields</caption>\n * hostedFieldsInstance.clear('number');\n * hostedFieldsInstance.clear('cvv');\n * hostedFieldsInstance.clear('expirationDate');\n */\nHostedFields.prototype.clear = function (field) {\n  var err;\n\n  if (!allowedFields.hasOwnProperty(field)) {\n    err = new BraintreeError({\n      type: errors.HOSTED_FIELDS_FIELD_INVALID.type,\n      code: errors.HOSTED_FIELDS_FIELD_INVALID.code,\n      message:\n        '\"' +\n        field +\n        '\" is not a valid field. You must use a valid field option when clearing a field.',\n    });\n  } else if (!this._fields.hasOwnProperty(field)) {\n    err = new BraintreeError({\n      type: errors.HOSTED_FIELDS_FIELD_NOT_PRESENT.type,\n      code: errors.HOSTED_FIELDS_FIELD_NOT_PRESENT.code,\n      message:\n        'Cannot clear \"' +\n        field +\n        '\" field because it is not part of the current Hosted Fields options.',\n    });\n  } else {\n    this._bus.emit(events.CLEAR_FIELD, {\n      field: field,\n    });\n  }\n\n  if (err) {\n    return Promise.reject(err);\n  }\n\n  return Promise.resolve();\n};\n\n/**\n * Programmatically focus a {@link module:braintree-web/hosted-fields~field field}.\n * @public\n * @param {string} field The field you want to focus. Must be a valid {@link module:braintree-web/hosted-fields~fieldOptions fieldOption}.\n * @param {callback} [callback] Callback executed on completion, containing an error if one occurred. No data is returned if the field focused successfully.\n * @returns {void}\n * @example\n * hostedFieldsInstance.focus('number', function (focusErr) {\n *   if (focusErr) {\n *     console.error(focusErr);\n *   }\n * });\n * @example <caption>Using an event listener</caption>\n * myElement.addEventListener('click', function (e) {\n *   // In Firefox, the focus method can be suppressed\n *   //   if the element has a tabindex property or the element\n *   //   is an anchor link with an href property.\n *   e.preventDefault();\n *   hostedFieldsInstance.focus('number');\n * });\n */\nHostedFields.prototype.focus = function (field) {\n  var err;\n  var fieldConfig = this._fields[field];\n\n  if (!allowedFields.hasOwnProperty(field)) {\n    err = new BraintreeError({\n      type: errors.HOSTED_FIELDS_FIELD_INVALID.type,\n      code: errors.HOSTED_FIELDS_FIELD_INVALID.code,\n      message:\n        '\"' +\n        field +\n        '\" is not a valid field. You must use a valid field option when focusing a field.',\n    });\n  } else if (!this._fields.hasOwnProperty(field)) {\n    err = new BraintreeError({\n      type: errors.HOSTED_FIELDS_FIELD_NOT_PRESENT.type,\n      code: errors.HOSTED_FIELDS_FIELD_NOT_PRESENT.code,\n      message:\n        'Cannot focus \"' +\n        field +\n        '\" field because it is not part of the current Hosted Fields options.',\n    });\n  } else {\n    fieldConfig.frameElement.focus();\n\n    this._bus.emit(events.TRIGGER_INPUT_FOCUS, {\n      field: field,\n    });\n\n    if (browserDetection.isIos()) {\n      // Inputs outside of the viewport don't always scroll into view on\n      // focus in iOS Safari. 5ms timeout gives the browser a chance to\n      // do the right thing and prevents stuttering.\n      setTimeout(function () {\n        if (!isVisibleEnough(fieldConfig.containerElement)) {\n          fieldConfig.containerElement.scrollIntoView();\n        }\n      }, SAFARI_FOCUS_TIMEOUT);\n    }\n  }\n\n  if (err) {\n    return Promise.reject(err);\n  }\n\n  return Promise.resolve();\n};\n\n/**\n * Returns an {@link HostedFields~stateObject|object} that includes the state of all fields and possible card types.\n * @public\n * @returns {object} {@link HostedFields~stateObject|stateObject}\n * @example <caption>Check if all fields are valid</caption>\n * var state = hostedFieldsInstance.getState();\n *\n * var formValid = Object.keys(state.fields).every(function (key) {\n *   return state.fields[key].isValid;\n * });\n */\nHostedFields.prototype.getState = function () {\n  return this._state;\n};\n\n// React adds decorations to DOM nodes that cause\n// circular dependencies, so we remove them from the\n// config before sending it to the iframes. However,\n// we don't want to mutate the original object that\n// was passed in, so we create fresh objects via assign\nfunction formatMerchantConfigurationForIframes(config) {\n  var formattedConfig = assign({}, config);\n\n  formattedConfig.fields = assign({}, formattedConfig.fields);\n  Object.keys(formattedConfig.fields).forEach(function (field) {\n    formattedConfig.fields[field] = assign({}, formattedConfig.fields[field]);\n    delete formattedConfig.fields[field].container;\n  });\n\n  return formattedConfig;\n}\n\nmodule.exports = wrapPromise.wrapPrototype(HostedFields);\n\n},{\"../../lib/analytics\":143,\"../../lib/assign\":145,\"../../lib/braintree-error\":148,\"../../lib/constants\":149,\"../../lib/convert-methods-to-error\":150,\"../../lib/create-assets-url\":152,\"../../lib/create-deferred-client\":154,\"../../lib/destructor\":156,\"../../lib/errors\":158,\"../../lib/find-root-node\":159,\"../../lib/is-verified-domain\":178,\"../../lib/methods\":180,\"../../lib/shadow\":183,\"../shared/browser-detection\":131,\"../shared/constants\":132,\"../shared/errors\":133,\"../shared/find-parent-tags\":134,\"../shared/focus-intercept\":135,\"../shared/get-card-types\":136,\"./attribute-validation-error\":124,\"./compose-url\":125,\"./focus-change\":126,\"./get-styles-from-class\":127,\"./inject-frame\":129,\"@braintree/event-emitter\":33,\"@braintree/iframer\":35,\"@braintree/uuid\":39,\"@braintree/wrap-promise\":43,\"framebus\":54}],129:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar focusIntercept = _dereq_(\"../shared/focus-intercept\");\nvar directions = _dereq_(\"../shared/constants\").navigationDirections;\n\nmodule.exports = function injectFrame(id, frame, container, focusHandler) {\n  var frameType = frame.getAttribute(\"type\");\n  var clearboth = document.createElement(\"div\");\n  var fragment = document.createDocumentFragment();\n  var focusInterceptBefore = focusIntercept.generate(\n    id,\n    frameType,\n    directions.BACK,\n    focusHandler\n  );\n  var focusInterceptAfter = focusIntercept.generate(\n    id,\n    frameType,\n    directions.FORWARD,\n    focusHandler\n  );\n\n  clearboth.style.clear = \"both\";\n\n  fragment.appendChild(focusInterceptBefore);\n  fragment.appendChild(frame);\n  fragment.appendChild(focusInterceptAfter);\n  fragment.appendChild(clearboth);\n\n  container.appendChild(fragment);\n\n  return [frame, clearboth];\n};\n\n},{\"../shared/constants\":132,\"../shared/focus-intercept\":135}],130:[function(_dereq_,module,exports){\n\"use strict\";\n/** @module braintree-web/hosted-fields */\n\nvar HostedFields = _dereq_(\"./external/hosted-fields\");\nvar basicComponentVerification = _dereq_(\"../lib/basic-component-verification\");\nvar errors = _dereq_(\"./shared/errors\");\nvar supportsInputFormatting = _dereq_(\"restricted-input/supports-input-formatting\");\nvar wrapPromise = _dereq_(\"@braintree/wrap-promise\");\nvar BraintreeError = _dereq_(\"../lib/braintree-error\");\nvar VERSION = \"3.134.0\";\n\n/**\n * Fields used in {@link module:braintree-web/hosted-fields~fieldOptions fields options}\n * @typedef {object} field\n * @property {string} selector Deprecated: Now an alias for `options.container`.\n * @property {(string|HTMLElement)} container A DOM node or CSS selector to find the container where the hosted field will be inserted.\n * @property {string} [placeholder] Will be used as the `placeholder` attribute of the input. If `placeholder` is not natively supported by the browser, it will be polyfilled.\n * @property {string} [type] Will be used as the `type` attribute of the input. To mask `cvv` input, for instance, `type: \"password\"` can be used.\n * @property {string} [iframeTitle] The title used for the iframe containing the credit card input. By default, this will be `Secure Credit Card Frame - <the name of the specific field>`.\n * @property {string} [internalLabel] Each Hosted Field iframe has a hidden label that is used by screen readers to identify the input. The `internalLabel` property can be used to customize the field for localization purposes. The default values are:\n * * number: Credit Card Number\n * * cvv: CVV\n * * expirationDate: Expiration Date\n * * expirationMonth: Expiration Month\n * * expirationYear: Expiration Year\n * * postalCode: Postal Code\n * * cardholderName: Cardholder Name\n * @property {boolean} [formatInput=true] Enable or disable automatic formatting on this field.\n * @property {(object|boolean)} [maskInput=false] Enable or disable input masking when input is not focused. If set to `true` instead of an object, the defaults for the `maskInput` parameters will be used.\n * @property {string} [maskInput.character=•] The character to use when masking the input. The default character ('•') uses a unicode symbol, so the webpage must support UTF-8 characters when using the default.\n * @property {Boolean} [maskInput.showLastFour=false] Only applicable for the credit card field. Whether or not to show the last 4 digits of the card when masking.\n * @property {(object|boolean)} [select] If truthy, this field becomes a `<select>` dropdown list. This can only be used for `expirationMonth` and `expirationYear` fields. If you do not use a `placeholder` property for the field, the current month/year will be the default selected value.\n * @property {string[]} [select.options] An array of 12 strings, one per month. This can only be used for the `expirationMonth` field. For example, the array can look like `['01 - January', '02 - February', ...]`.\n * @property {number} [maxCardLength] This option applies only to the number field. Allows a limit to the length of the card number, even if the card brand may support numbers of a greater length. If the value passed is greater than the max length for a card brand, the smaller number of the 2 values will be used. For example, is `maxCardLength` is set to 16, but an American Express card is entered (which has a max card length of 15), a max card length of 15 will be used.\n * @property {number} [maxlength] This option applies only to the CVV and postal code fields. Will be used as the `maxlength` attribute of the input. The primary use cases for the `maxlength` option are: limiting the length of the CVV input for CVV-only verifications when the card type is known and setting the length of the postal code input when cards are coming from a known region. The default `maxlength` for the postal code input is `10`.\n * @property {number} [minlength=3] This option applies only to the cvv and postal code fields. Will be used as the `minlength` attribute of the input.\n * For postal code fields, the default value is 3, representing the Icelandic postal code length. This option's primary use case is to increase the `minlength`, e.g. for US customers, the postal code `minlength` can be set to 5.\n * For cvv fields, the default value is 3. The `minlength` attribute only applies to integrations capturing a cvv without a number field.\n * @property {string} [prefill] A value to prefill the field with. For example, when creating an update card form, you can prefill the expiration date fields with the old expiration date data.\n * @property {boolean} [rejectUnsupportedCards=false] Deprecated since version 3.46.0, use `supportedCardBrands` instead. Only allow card types that your merchant account is able to process. Unsupported card types will invalidate the card form. e.g. if you only process Visa cards, a customer entering a American Express card would get an invalid card field. This can only be used for the `number` field.\n * @property {object} [supportedCardBrands] Override card brands that are supported by the card form. Pass `'card-brand-id': true` to override the default in the merchant configuration and enable a card brand. Pass `'card-brand-id': false` to disable a card brand. Unsupported card types will invalidate the card form. e.g. if you only process Visa cards, a customer entering an American Express card would get an invalid card field. This can only be used for the  `number` field. (Note: only allow card types that your merchant account is actually able to process.)\n *\n * Valid card brand ids are:\n * * visa\n * * mastercard\n * * american-express\n * * diners-club\n * * discover\n * * jcb\n * * union-pay\n * * maestro\n * * elo\n * * mir\n * * hiper\n * * hipercard\n */\n\n/**\n * An object that has {@link module:braintree-web/hosted-fields~field field objects} for each field. Used in {@link module:braintree-web/hosted-fields~create create}.\n * @typedef {object} fieldOptions\n * @property {field} [number] A field for card number.\n * @property {field} [expirationDate] A field for expiration date in `MM/YYYY` or `MM/YY` format. This should not be used with the `expirationMonth` and `expirationYear` properties.\n * @property {field} [expirationMonth] A field for expiration month in `MM` format. This should be used with the `expirationYear` property.\n * @property {field} [expirationYear] A field for expiration year in `YYYY` or `YY` format. This should be used with the `expirationMonth` property.\n * @property {field} [cvv] A field for 3 or 4 digit card verification code (like CVV or CID). If you wish to create a CVV-only payment method nonce to verify a card already stored in your Vault, omit all other fields to only collect CVV.\n * @property {field} [postalCode] A field for postal or region code.\n * @property {field} [cardholderName] A field for the cardholder name on the customer's credit card.\n */\n\n/**\n * An object that represents CSS that will be applied in each hosted field. This object looks similar to CSS. Typically, these styles involve fonts (such as `font-family` or `color`).\n *\n * You may also pass the name of a class on your site that contains the styles you would like to apply. The style properties will be automatically pulled off the class and applied to the Hosted Fields inputs. Note: this is recommended for `input` elements only. If using a `select` for the expiration date, unexpected styling may occur.\n *\n * These are the CSS properties that Hosted Fields supports. Any other CSS should be specified on your page and outside of any Braintree configuration. Trying to set unsupported properties will fail and put a warning in the console.\n *\n * Supported CSS properties are:\n * `appearance`\n * `box-shadow`\n * `color`\n * `direction`\n * `font-family`\n * `font-size-adjust`\n * `font-size`\n * `font-stretch`\n * `font-style`\n * `font-variant-alternates`\n * `font-variant-caps`\n * `font-variant-east-asian`\n * `font-variant-ligatures`\n * `font-variant-numeric`\n * `font-variant`\n * `font-weight`\n * `font`\n * `letter-spacing`\n * `line-height`\n * `opacity`\n * `outline`\n * `margin`\n * `margin-top`\n * `margin-right`\n * `margin-bottom`\n * `margin-left`\n * `padding`\n * `padding-top`\n * `padding-right`\n * `padding-bottom`\n * `padding-left`\n * `text-align`\n * `text-shadow`\n * `transition`\n * `-moz-appearance`\n * `-moz-box-shadow`\n * `-moz-osx-font-smoothing`\n * `-moz-tap-highlight-color`\n * `-moz-transition`\n * `-webkit-appearance`\n * `-webkit-box-shadow`\n * `-webkit-font-smoothing`\n * `-webkit-tap-highlight-color`\n * `-webkit-transition`\n * @typedef {object} styleOptions\n */\n\n/**\n * @static\n * @function create\n * @param {object} options Creation options:\n * @param {Client} [options.client] A {@link Client} instance.\n * @param {string} [options.authorization] A tokenizationKey or clientToken. Can be used in place of `options.client`.\n * @param {fieldOptions} options.fields A {@link module:braintree-web/hosted-fields~fieldOptions set of options for each field}.\n * @param {styleOptions} [options.styles] {@link module:braintree-web/hosted-fields~styleOptions Styles} applied to each field.\n * @param {boolean} [options.preventAutofill=false] When true, browsers will not try to prompt the customer to autofill their credit card information.\n * @param {string} [options.sessionId] Used in specific cases where associating SDK events with a specific external id is required.\n * @param {callback} [callback] The second argument, `data`, is the {@link HostedFields} instance. If no callback is provided, `create` returns a promise that resolves with the {@link HostedFields} instance.\n * @returns {void}\n * @example\n * braintree.hostedFields.create({\n *   client: clientInstance,\n *   styles: {\n *     'input': {\n *       'font-size': '16pt',\n *       'color': '#3A3A3A'\n *     },\n *     '.number': {\n *       'font-family': 'monospace'\n *     },\n *     '.valid': {\n *       'color': 'green'\n *     }\n *   },\n *   fields: {\n *     number: {\n *       container: '#card-number'\n *     },\n *     cvv: {\n *       container: '#cvv',\n *       placeholder: '•••'\n *     },\n *     expirationDate: {\n *       container: '#expiration-date'\n *     }\n *   }\n * }, callback);\n * @example <caption>With cardholder name</caption>\n * braintree.hostedFields.create({\n *   client: clientInstance,\n *   fields: {\n *     number: {\n *       container: '#card-number'\n *     },\n *     cardholderName: {\n *       container: '#cardholder-name'\n *     },\n *     cvv: {\n *       container: '#cvv',\n *     },\n *     expirationDate: {\n *       container: '#expiration-date'\n *     }\n *   }\n * }, callback);\n * @example <caption>Applying styles with a class name</caption>\n * // in document head\n * <style>\n *   .braintree-input-class {\n *     color: black;\n *   }\n *   .braintree-valid-class {\n *     color: green;\n *   }\n *   .braintree-invalid-class {\n *     color: red;\n *   }\n * </style>\n * // in a script tag\n * braintree.hostedFields.create({\n *   client: clientInstance,\n *   styles: {\n *     'input': 'braintree-input-class',\n *     '.invalid': 'braintree-invalid-class',\n *     '.valid': {\n *       // you can also use the object syntax alongside\n *       // the class name syntax\n *       color: green;\n *     }\n *   },\n *   fields: {\n *     number: {\n *       container: '#card-number'\n *     },\n *     // etc...\n *   }\n * }, callback);\n * @example <caption>Right to Left Language Support</caption>\n * braintree.hostedFields.create({\n *   client: clientInstance,\n *   styles: {\n *     'input': {\n *       // other styles\n *       direction: 'rtl'\n *     },\n *   },\n *   fields: {\n *     number: {\n *       container: '#card-number',\n *       // Credit card formatting is not currently supported\n *       // with RTL languages, so we need to turn it off for the number input\n *       formatInput: false\n *     },\n *     cvv: {\n *       container: '#cvv',\n *       placeholder: '•••'\n *     },\n *     expirationDate: {\n *       container: '#expiration-date',\n *       type: 'month'\n *     }\n *   }\n * }, callback);\n * @example <caption>Setting up Hosted Fields to tokenize CVV only</caption>\n * braintree.hostedFields.create({\n *   client: clientInstance,\n *   fields: {\n *     // Only add the `cvv` option.\n *     cvv: {\n *       container: '#cvv',\n *       placeholder: '•••'\n *     }\n *   }\n * }, callback);\n * @example <caption>Creating an expiration date update form with prefilled data</caption>\n * var storedCreditCardInformation = {\n *   // get this info from your server\n *   // with a payment method lookup\n *   month: '09',\n *   year: '2017'\n * };\n *\n * braintree.hostedFields.create({\n *   client: clientInstance,\n *   fields: {\n *     expirationMonth: {\n *       container: '#expiration-month',\n *       prefill: storedCreditCardInformation.month\n *     },\n *     expirationYear: {\n *       container: '#expiration-year',\n *       prefill: storedCreditCardInformation.year\n *     }\n *   }\n * }, callback);\n * @example <caption>Validate the card form for supported card types</caption>\n * braintree.hostedFields.create({\n *   client: clientInstance,\n *   fields: {\n *     number: {\n *       container: '#card-number',\n *       supportedCardBrands: {\n *         visa: false, // prevents Visas from showing up as valid even when the Braintree control panel is configured to allow them\n *         'diners-club': true // allow Diners Club cards to be valid (processed as Discover cards on the Braintree backend)\n *       }\n *     },\n *     cvv: {\n *       container: '#cvv',\n *       placeholder: '•••'\n *     },\n *     expirationDate: {\n *       container: '#expiration-date',\n *       type: 'month'\n *     }\n *   },\n * }, callback);\n */\nfunction create(options) {\n  return basicComponentVerification\n    .verify({\n      name: \"Hosted Fields\",\n      authorization: options.authorization,\n      client: options.client,\n    })\n    .then(function () {\n      var integration = new HostedFields(options);\n\n      return new Promise(function (resolve, reject) {\n        integration.on(\"ready\", function () {\n          resolve(integration);\n        });\n        integration.on(\"timeout\", function () {\n          reject(new BraintreeError(errors.HOSTED_FIELDS_TIMEOUT));\n        });\n      });\n    });\n}\n\nmodule.exports = {\n  /**\n   * @static\n   * @function supportsInputFormatting\n   * @description Returns false if input formatting will be automatically disabled due to browser incompatibility. Otherwise, returns true. For a list of unsupported browsers, [go here](https://github.com/braintree/restricted-input/blob/main/README.md#browsers-where-formatting-is-turned-off-automatically).\n   * @returns {Boolean} Returns false if input formatting will be automatically disabled due to browser incompatibility. Otherwise, returns true.\n   * @example\n   * <caption>Conditionally choosing split expiration date inputs if formatting is unavailable</caption>\n   * var canFormat = braintree.hostedFields.supportsInputFormatting();\n   * var fields = {\n   *   number: {\n   *     container: '#card-number'\n   *   },\n   *   cvv: {\n   *     container: '#cvv'\n   *   }\n   * };\n   *\n   * if (canFormat) {\n   *   fields.expirationDate = {\n   *     selection: '#expiration-date'\n   *   };\n   *   functionToCreateAndInsertExpirationDateDivToForm();\n   * } else {\n   *   fields.expirationMonth = {\n   *     selection: '#expiration-month'\n   *   };\n   *   fields.expirationYear = {\n   *     selection: '#expiration-year'\n   *   };\n   *   functionToCreateAndInsertExpirationMonthAndYearDivsToForm();\n   * }\n   *\n   * braintree.hostedFields.create({\n   *   client: clientInstance,\n   *   styles: {\n   *     // Styles\n   *   },\n   *   fields: fields\n   * }, callback);\n   */\n  supportsInputFormatting: supportsInputFormatting,\n  create: wrapPromise(create),\n  /**\n   * @description The current version of the SDK, i.e. `{@pkg version}`.\n   * @type {string}\n   */\n  VERSION: VERSION,\n};\n\n},{\"../lib/basic-component-verification\":146,\"../lib/braintree-error\":148,\"./external/hosted-fields\":128,\"./shared/errors\":133,\"@braintree/wrap-promise\":43,\"restricted-input/supports-input-formatting\":88}],131:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar isAndroid = _dereq_(\"@braintree/browser-detection/is-android\");\nvar isChromeOS = _dereq_(\"@braintree/browser-detection/is-chrome-os\");\nvar isIos = _dereq_(\"@braintree/browser-detection/is-ios\");\nvar isChrome = _dereq_(\"@braintree/browser-detection/is-chrome\");\nvar isSafari = _dereq_(\"@braintree/browser-detection/is-safari\");\nvar isIosSafari = _dereq_(\"@braintree/browser-detection/is-ios-safari\");\n\nfunction hasSoftwareKeyboard() {\n  return isAndroid() || isChromeOS() || isIos();\n}\n\nfunction isChromeIos() {\n  return isChrome() && isIos();\n}\n\nmodule.exports = {\n  isAndroid: isAndroid,\n  isChromeOS: isChromeOS,\n  isChromeIos: isChromeIos,\n  isFirefox: _dereq_(\"@braintree/browser-detection/is-firefox\"),\n  isIos: isIos,\n  isIosWebview: _dereq_(\"@braintree/browser-detection/is-ios-webview\"),\n  isSafari: isSafari,\n  isIosSafari: isIosSafari,\n  hasSoftwareKeyboard: hasSoftwareKeyboard,\n};\n\n},{\"@braintree/browser-detection/is-android\":22,\"@braintree/browser-detection/is-chrome\":24,\"@braintree/browser-detection/is-chrome-os\":23,\"@braintree/browser-detection/is-firefox\":25,\"@braintree/browser-detection/is-ios\":30,\"@braintree/browser-detection/is-ios-safari\":27,\"@braintree/browser-detection/is-ios-webview\":28,\"@braintree/browser-detection/is-safari\":31}],132:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar enumerate = _dereq_(\"../../lib/enumerate\");\nvar errors = _dereq_(\"./errors\");\nvar VERSION = \"3.134.0\";\n\nvar constants = {\n  VERSION: VERSION,\n  maxExpirationYearAge: 19,\n  externalEvents: {\n    FOCUS: \"focus\",\n    BLUR: \"blur\",\n    EMPTY: \"empty\",\n    NOT_EMPTY: \"notEmpty\",\n    VALIDITY_CHANGE: \"validityChange\",\n    CARD_TYPE_CHANGE: \"cardTypeChange\",\n  },\n  defaultMaxLengths: {\n    number: 19,\n    postalCode: 8,\n    expirationDate: 7,\n    expirationMonth: 2,\n    expirationYear: 4,\n    cvv: 3,\n  },\n  externalClasses: {\n    FOCUSED: \"braintree-hosted-fields-focused\",\n    INVALID: \"braintree-hosted-fields-invalid\",\n    VALID: \"braintree-hosted-fields-valid\",\n  },\n  navigationDirections: {\n    BACK: \"before\",\n    FORWARD: \"after\",\n  },\n  defaultIFrameStyle: {\n    border: \"none\",\n    width: \"100%\",\n    height: \"100%\",\n    float: \"left\",\n  },\n  tokenizationErrorCodes: {\n    81724: errors.HOSTED_FIELDS_TOKENIZATION_FAIL_ON_DUPLICATE,\n    // NEXT_MAJOR_VERSION this error triggers for both AVS and CVV errors\n    // but the code name implies that it would only trigger for CVV verification\n    // failures\n    81736: errors.HOSTED_FIELDS_TOKENIZATION_CVV_VERIFICATION_FAILED,\n  },\n  allowedStyles: [\n    \"-moz-appearance\",\n    \"-moz-box-shadow\",\n    \"-moz-osx-font-smoothing\",\n    \"-moz-tap-highlight-color\",\n    \"-moz-transition\",\n    \"-webkit-appearance\",\n    \"-webkit-box-shadow\",\n    \"-webkit-font-smoothing\",\n    \"-webkit-tap-highlight-color\",\n    \"-webkit-text-fill-color\",\n    \"-webkit-transition\",\n    \"appearance\",\n    \"box-shadow\",\n    \"color\",\n    \"direction\",\n    \"font\",\n    \"font-family\",\n    \"font-size\",\n    \"font-size-adjust\",\n    \"font-stretch\",\n    \"font-style\",\n    \"font-variant\",\n    \"font-variant-alternates\",\n    \"font-variant-caps\",\n    \"font-variant-east-asian\",\n    \"font-variant-ligatures\",\n    \"font-variant-numeric\",\n    \"font-weight\",\n    \"letter-spacing\",\n    \"line-height\",\n    \"margin\",\n    \"margin-top\",\n    \"margin-right\",\n    \"margin-bottom\",\n    \"margin-left\",\n    \"opacity\",\n    \"outline\",\n    \"padding\",\n    \"padding-top\",\n    \"padding-right\",\n    \"padding-bottom\",\n    \"padding-left\",\n    \"text-align\",\n    \"text-shadow\",\n    \"transition\",\n  ],\n  allowedFields: {\n    cardholderName: {\n      name: \"cardholder-name\",\n      label: \"Cardholder Name\",\n    },\n    number: {\n      name: \"credit-card-number\",\n      label: \"Credit Card Number\",\n    },\n    cvv: {\n      name: \"cvv\",\n      label: \"CVV\",\n    },\n    expirationDate: {\n      name: \"expiration\",\n      label: \"Expiration Date\",\n    },\n    expirationMonth: {\n      name: \"expiration-month\",\n      label: \"Expiration Month\",\n    },\n    expirationYear: {\n      name: \"expiration-year\",\n      label: \"Expiration Year\",\n    },\n    postalCode: {\n      name: \"postal-code\",\n      label: \"Postal Code\",\n    },\n  },\n  allowedAttributes: {\n    \"aria-invalid\": \"boolean\",\n    \"aria-required\": \"boolean\",\n    disabled: \"boolean\",\n    placeholder: \"string\",\n  },\n  allowedBillingAddressFields: [\n    \"company\",\n    \"countryCodeNumeric\",\n    \"countryCodeAlpha2\",\n    \"countryCodeAlpha3\",\n    \"countryName\",\n    \"extendedAddress\",\n    \"locality\",\n    \"region\",\n    \"firstName\",\n    \"lastName\",\n    \"postalCode\",\n    \"streetAddress\",\n  ],\n  allowedShippingAddressFields: [\n    \"company\",\n    \"countryCodeNumeric\",\n    \"countryCodeAlpha2\",\n    \"countryCodeAlpha3\",\n    \"countryName\",\n    \"extendedAddress\",\n    \"locality\",\n    \"region\",\n    \"firstName\",\n    \"lastName\",\n    \"postalCode\",\n    \"streetAddress\",\n  ],\n  autocompleteMappings: {\n    \"cardholder-name\": \"cc-name\",\n    \"credit-card-number\": \"cc-number\",\n    expiration: \"cc-exp\",\n    \"expiration-month\": \"cc-exp-month\",\n    \"expiration-year\": \"cc-exp-year\",\n    cvv: \"cc-csc\",\n    \"postal-code\": \"billing postal-code\",\n  },\n};\n\nconstants.events = enumerate(\n  [\n    \"ADD_CLASS\",\n    \"AUTOFILL_DATA_AVAILABLE\",\n    \"BIN_AVAILABLE\",\n    \"CARD_FORM_ENTRY_HAS_BEGUN\",\n    \"CLEAR_FIELD\",\n    \"CONFIGURATION\",\n    \"FRAME_READY\",\n    \"INPUT_EVENT\",\n    \"READY_FOR_CLIENT\",\n    \"REMOVE_ATTRIBUTE\",\n    \"REMOVE_CLASS\",\n    \"REMOVE_FOCUS_INTERCEPTS\",\n    \"SET_ATTRIBUTE\",\n    \"SET_MESSAGE\",\n    \"SET_MONTH_OPTIONS\",\n    \"TOKENIZATION_REQUEST\",\n    \"TRIGGER_FOCUS_CHANGE\",\n    \"TRIGGER_INPUT_FOCUS\",\n    \"VALIDATE_STRICT\",\n  ],\n  \"hosted-fields:\"\n);\n\nmodule.exports = constants;\n\n},{\"../../lib/enumerate\":157,\"./errors\":133}],133:[function(_dereq_,module,exports){\n\"use strict\";\n\n/**\n * @name BraintreeError.Hosted Fields - Creation Error Codes\n * @description Errors that occur when [creating the Hosted Fields component](./module-braintree-web_hosted-fields.html#.create).\n * @property {UNKNOWN} HOSTED_FIELDS_TIMEOUT Occurs when Hosted Fields does not finish setting up within 60 seconds.\n * @property {MERCHANT} HOSTED_FIELDS_INVALID_FIELD_KEY Occurs when Hosted Fields is instantiated with an invalid Field option.\n * @property {MERCHANT} HOSTED_FIELDS_INVALID_FIELD_SELECTOR Occurs when Hosted Fields given a field selector that is not valid.\n * @property {MERCHANT} HOSTED_FIELDS_FIELD_DUPLICATE_IFRAME Occurs when Hosted Fields given a field selector that already contains an iframe.\n * @property {MERCHANT} HOSTED_FIELDS_FIELD_PROPERTY_INVALID Occurs when a field configuration option is not valid.\n */\n\n/**\n * @name BraintreeError.Hosted Fields - Field Manipulation Error Codes\n * @description Errors that occur when modifying fields through [`addClass`](./HostedFields.html#addClass), [`removeClass`](./HostedFields.html#removeClass), [`setAttribute`](./HostedFields.html#setAttribute), [`removeAttribute`](./HostedFields.html#removeAttribute), [`clear`](./HostedFields.html#clear), [`focus`](./HostedFields.html#focus), and [`setMonthOptions`](./HostedFields.html#setMonthOptions).\n * @property {MERCHANT} HOSTED_FIELDS_FIELD_INVALID Occurs when attempting to modify a field that is not a valid Hosted Fields option.\n * @property {MERCHANT} HOSTED_FIELDS_FIELD_NOT_PRESENT Occurs when attempting to modify a field that is not configured with Hosted Fields.\n * @property {MERCHANT} HOSTED_FIELDS_FIELD_PROPERTY_INVALID Occurs when a field configuration option is not valid.\n */\n\n/**\n * @name BraintreeError.Hosted Fields - Set Attribute Error Codes\n * @description Errors that occur when using the [`setAttribute` method](./HostedFields.html#setAttribute)\n * @property {MERCHANT} HOSTED_FIELDS_ATTRIBUTE_NOT_SUPPORTED Occurs when trying to set an attribute that is not supported to be set.\n * @property {MERCHANT} HOSTED_FIELDS_ATTRIBUTE_VALUE_NOT_ALLOWED Occurs when the type of value for an attribute is not allowed to be set.\n */\n\n/**\n * @name BraintreeError.Hosted Fields - Tokenize Error Codes\n * @description Errors that occur when [tokenizing the card details with Hosted Fields](./HostedFields.html#tokenize).\n * @property {NETWORK} HOSTED_FIELDS_TOKENIZATION_NETWORK_ERROR Occurs when the Braintree gateway cannot be contacted.\n * @property {CUSTOMER} HOSTED_FIELDS_TOKENIZATION_FAIL_ON_DUPLICATE Occurs when attempting to vault a card, but the client token being used is configured to fail if the card already exists in the vault.\n * @property {CUSTOMER} HOSTED_FIELDS_TOKENIZATION_CVV_VERIFICATION_FAILED Occurs when cvv verification is turned on in the Braintree control panel.\n * @property {CUSTOMER} HOSTED_FIELDS_FAILED_TOKENIZATION Occurs when the credit card details were sent to Braintree, but failed to tokenize.\n * @property {CUSTOMER} HOSTED_FIELDS_FIELDS_EMPTY Occurs when all the Hosted Fields inputs are empty.\n * @property {CUSTOMER} HOSTED_FIELDS_FIELDS_INVALID Occurs when one ore more fields are invalid.\n */\n\nvar BraintreeError = _dereq_(\"../../lib/braintree-error\");\n\nmodule.exports = {\n  HOSTED_FIELDS_TIMEOUT: {\n    type: BraintreeError.types.UNKNOWN,\n    code: \"HOSTED_FIELDS_TIMEOUT\",\n    message: \"Hosted Fields timed out when attempting to set up.\",\n  },\n  HOSTED_FIELDS_INVALID_FIELD_KEY: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"HOSTED_FIELDS_INVALID_FIELD_KEY\",\n  },\n  HOSTED_FIELDS_INVALID_FIELD_SELECTOR: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"HOSTED_FIELDS_INVALID_FIELD_SELECTOR\",\n    message: \"Selector does not reference a valid DOM node.\",\n  },\n  HOSTED_FIELDS_FIELD_DUPLICATE_IFRAME: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"HOSTED_FIELDS_FIELD_DUPLICATE_IFRAME\",\n    message: \"Element already contains a Braintree iframe.\",\n  },\n  HOSTED_FIELDS_FIELD_INVALID: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"HOSTED_FIELDS_FIELD_INVALID\",\n  },\n  HOSTED_FIELDS_FIELD_NOT_PRESENT: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"HOSTED_FIELDS_FIELD_NOT_PRESENT\",\n  },\n  HOSTED_FIELDS_TOKENIZATION_NETWORK_ERROR: {\n    type: BraintreeError.types.NETWORK,\n    code: \"HOSTED_FIELDS_TOKENIZATION_NETWORK_ERROR\",\n    message: \"A tokenization network error occurred.\",\n  },\n  HOSTED_FIELDS_TOKENIZATION_FAIL_ON_DUPLICATE: {\n    type: BraintreeError.types.CUSTOMER,\n    code: \"HOSTED_FIELDS_TOKENIZATION_FAIL_ON_DUPLICATE\",\n    message: \"This credit card already exists in the merchant's vault.\",\n  },\n  HOSTED_FIELDS_TOKENIZATION_CVV_VERIFICATION_FAILED: {\n    type: BraintreeError.types.CUSTOMER,\n    code: \"HOSTED_FIELDS_TOKENIZATION_CVV_VERIFICATION_FAILED\",\n    message: \"CVV verification failed during tokenization.\",\n  },\n  HOSTED_FIELDS_FAILED_TOKENIZATION: {\n    type: BraintreeError.types.CUSTOMER,\n    code: \"HOSTED_FIELDS_FAILED_TOKENIZATION\",\n    message: \"The supplied card data failed tokenization.\",\n  },\n  HOSTED_FIELDS_FIELDS_EMPTY: {\n    type: BraintreeError.types.CUSTOMER,\n    code: \"HOSTED_FIELDS_FIELDS_EMPTY\",\n    message: \"All fields are empty. Cannot tokenize empty card fields.\",\n  },\n  HOSTED_FIELDS_FIELDS_INVALID: {\n    type: BraintreeError.types.CUSTOMER,\n    code: \"HOSTED_FIELDS_FIELDS_INVALID\",\n    message:\n      \"Some payment input fields are invalid. Cannot tokenize invalid card fields.\",\n  },\n  HOSTED_FIELDS_ATTRIBUTE_NOT_SUPPORTED: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"HOSTED_FIELDS_ATTRIBUTE_NOT_SUPPORTED\",\n  },\n  HOSTED_FIELDS_ATTRIBUTE_VALUE_NOT_ALLOWED: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"HOSTED_FIELDS_ATTRIBUTE_VALUE_NOT_ALLOWED\",\n  },\n  HOSTED_FIELDS_FIELD_PROPERTY_INVALID: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"HOSTED_FIELDS_FIELD_PROPERTY_INVALID\",\n  },\n};\n\n},{\"../../lib/braintree-error\":148}],134:[function(_dereq_,module,exports){\n\"use strict\";\n\nfunction findParentTags(element, tag) {\n  var parent = element.parentNode;\n  var parents = [];\n\n  while (parent != null) {\n    if (parent.tagName != null && parent.tagName.toLowerCase() === tag) {\n      parents.push(parent);\n    }\n\n    parent = parent.parentNode;\n  }\n\n  return parents;\n}\n\nmodule.exports = findParentTags;\n\n},{}],135:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar browserDetection = _dereq_(\"./browser-detection\");\nvar constants = _dereq_(\"./constants\");\nvar allowedFields = Object.keys(constants.allowedFields);\nvar directions = constants.navigationDirections;\n\nvar focusIntercept = {\n  generate: function (hostedFieldsId, type, direction, handler) {\n    var input = document.createElement(\"input\");\n    var focusInterceptStyles = {\n      border: \"none !important\",\n      display: \"block !important\",\n      height: \"1px !important\",\n      left: \"-1px !important\",\n      opacity: \"0 !important\",\n      position: \"absolute !important\",\n      top: \"-1px !important\",\n      width: \"1px !important\",\n    };\n    var shouldCreateFocusIntercept =\n      browserDetection.hasSoftwareKeyboard() || browserDetection.isFirefox();\n\n    if (!shouldCreateFocusIntercept) {\n      return document.createDocumentFragment();\n    }\n\n    input.setAttribute(\"aria-hidden\", \"true\");\n    input.setAttribute(\"autocomplete\", \"off\");\n    input.setAttribute(\"data-braintree-direction\", direction);\n    input.setAttribute(\"data-braintree-type\", type);\n    input.setAttribute(\n      \"id\",\n      \"bt-\" + type + \"-\" + direction + \"-\" + hostedFieldsId\n    );\n    input.setAttribute(\n      \"style\",\n      JSON.stringify(focusInterceptStyles)\n        .replace(/[{}\"]/g, \"\")\n        .replace(/,/g, \";\")\n    );\n\n    input.classList.add(\"focus-intercept\");\n\n    input.addEventListener(\"focus\", function (event) {\n      handler(event);\n\n      /*\n        Certain browsers without software keyboards (Firefox, Internet\n        Explorer) need the focus intercept inputs that get inserted\n        around the actual input to blur themselves, otherwise the\n        browser gets confused about what should have focus. Can't\n        apply this to browsers with software keyboards however,\n        because it blurs everything, and focus on the actual input is\n        also lost.\n      */\n      if (!browserDetection.hasSoftwareKeyboard()) {\n        input.blur();\n      }\n    });\n\n    return input;\n  },\n  destroy: function (idString) {\n    var focusInputs;\n\n    if (!idString) {\n      focusInputs = document.querySelectorAll(\"[data-braintree-direction]\");\n      focusInputs = [].slice.call(focusInputs);\n    } else {\n      focusInputs = [document.getElementById(idString)];\n    }\n\n    focusInputs.forEach(function (node) {\n      if (\n        node &&\n        node.nodeType === 1 &&\n        focusIntercept.matchFocusElement(node.getAttribute(\"id\"))\n      ) {\n        node.parentNode.removeChild(node);\n      }\n    });\n  },\n  matchFocusElement: function (idString) {\n    var idComponents, hasBTPrefix, isAllowedType, isValidDirection;\n\n    if (!idString) {\n      return false;\n    }\n\n    idComponents = idString.split(\"-\");\n\n    if (idComponents.length < 4) {\n      return false;\n    }\n\n    hasBTPrefix = idComponents[0] === \"bt\";\n    isAllowedType = allowedFields.indexOf(idComponents[1]) > -1;\n    isValidDirection =\n      idComponents[2] === directions.BACK ||\n      idComponents[2] === directions.FORWARD;\n\n    return Boolean(hasBTPrefix && isAllowedType && isValidDirection);\n  },\n};\n\nmodule.exports = focusIntercept;\n\n},{\"./browser-detection\":131,\"./constants\":132}],136:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar creditCardType = _dereq_(\"credit-card-type\");\n\nmodule.exports = function (number) {\n  var results = creditCardType(number);\n\n  results.forEach(function (card) {\n    // NEXT_MAJOR_VERSION credit-card-type fixed the mastercard enum\n    // but we still pass master-card in the braintree API\n    // in a major version bump, we can remove this and\n    // this will be mastercard instead of master-card\n    if (card.type === \"mastercard\") {\n      card.type = \"master-card\";\n    }\n  });\n\n  return results;\n};\n\n},{\"credit-card-type\":45}],137:[function(_dereq_,module,exports){\n\"use strict\";\n/**\n * @module braintree-web\n * @description This is the top-level module exported by the Braintree JavaScript SDK. In a browser environment, this will be the global <code>braintree</code> object. In a CommonJS environment (like Browserify or Webpack), it will be the default export of the <code>braintree-web</code> package. In AMD environments (like RequireJS), it can be `require`d like other modules.\n * @example\n * <caption>CommonJS</caption>\n * var braintree = require('braintree-web');\n *\n * braintree.client.create(...);\n * @example\n * <caption>In the browser</caption>\n * <script src=\"https://js.braintreegateway.com/web/{@pkg version}/js/client.min.js\"></script>\n * <script>\n *   window.braintree.client.create(...);\n * </script>\n * @example\n * <caption>AMD</caption>\n * // main.js\n * require.config({\n *   paths: {\n *     braintreeClient: 'https://js.braintreegateway.com/web/{@pkg version}/js/client.min'\n *   }\n * });\n *\n * require(['braintreeClient'], function (braintreeClient) {\n *   braintreeClient.create(...);\n * });\n */\n\n/**\n * @global\n * @callback callback\n * @param {?BraintreeError} [err] `null` or `undefined` if there was no error.\n * @param {?any} [data] The successful result of the asynchronous function call (if data exists).\n * @description The Node.js-style callback pattern used throughout the SDK.\n * @returns {void}\n */\n\nvar americanExpress = _dereq_(\"./american-express\");\nvar applePay = _dereq_(\"./apple-pay\");\nvar client = _dereq_(\"./client\");\nvar fastlane = _dereq_(\"./fastlane\");\nvar dataCollector = _dereq_(\"./data-collector\");\nvar hostedFields = _dereq_(\"./hosted-fields\");\nvar localPayment = _dereq_(\"./local-payment\");\nvar masterpass = _dereq_(\"./masterpass\");\nvar instantVerification = _dereq_(\"./instant-verification\");\nvar paymentRequest = _dereq_(\"./payment-request\");\nvar paymentReady = _dereq_(\"./payment-ready\");\nvar paypal = _dereq_(\"./paypal\");\nvar paypalCheckout = _dereq_(\"./paypal-checkout\");\nvar googlePayment = _dereq_(\"./google-payment\");\nvar sepa = _dereq_(\"./sepa\");\nvar threeDSecure = _dereq_(\"./three-d-secure\");\nvar unionpay = _dereq_(\"./unionpay\");\nvar usBankAccount = _dereq_(\"./us-bank-account\");\nvar vaultManager = _dereq_(\"./vault-manager\");\nvar venmo = _dereq_(\"./venmo\");\nvar visaCheckout = _dereq_(\"./visa-checkout\");\nvar preferredPaymentMethods = _dereq_(\"./preferred-payment-methods\");\nvar VERSION = \"3.134.0\";\n\nmodule.exports = {\n  /** @type {module:braintree-web/fastlane} */\n  fastlane: fastlane,\n  /** @type {module:braintree-web/american-express} */\n  americanExpress: americanExpress,\n  /** @type {module:braintree-web/apple-pay} */\n  applePay: applePay,\n  /** @type {module:braintree-web/client} */\n  client: client,\n  /** @type {module:braintree-web/data-collector} */\n  dataCollector: dataCollector,\n  /** @type {module:braintree-web/hosted-fields} */\n  hostedFields: hostedFields,\n  /** @type {module:braintree-web/instant-verification} */\n  instantVerification: instantVerification,\n  /** @type {module:braintree-web/local-payment} */\n  localPayment: localPayment,\n  /** @type {module:braintree-web/masterpass} */\n  masterpass: masterpass,\n  /** @type {module:braintree-web/google-payment} */\n  googlePayment: googlePayment,\n  /** @type {module:braintree-web/payment-request} */\n  paymentRequest: paymentRequest,\n  /** @type {module:braintree-web/payment-ready} */\n  paymentReady: paymentReady,\n  /** @type {module:braintree-web/paypal} */\n  paypal: paypal,\n  /** @type {module:braintree-web/paypal-checkout} */\n  paypalCheckout: paypalCheckout,\n  /** @type {module:braintree-web/three-d-secure} */\n  threeDSecure: threeDSecure,\n  /** @type {module:braintree-web/unionpay} */\n  unionpay: unionpay,\n  /** @type {module:braintree-web/us-bank-account} */\n  usBankAccount: usBankAccount,\n  /** @type {module:braintree-web/vault-manager} */\n  vaultManager: vaultManager,\n  /** @type {module:braintree-web/venmo} */\n  venmo: venmo,\n  /** @type {module:braintree-web/visa-checkout} */\n  visaCheckout: visaCheckout,\n  /** @type {module:braintree-web/sepa} */\n  sepa: sepa,\n  /** @type {module:braintree-web/preferred-payment-methods} */\n  preferredPaymentMethods: preferredPaymentMethods,\n  /**\n   * @description The current version of the SDK, i.e. `{@pkg version}`.\n   * @type {string}\n   */\n  VERSION: VERSION,\n};\n\n},{\"./american-express\":91,\"./apple-pay\":94,\"./client\":99,\"./data-collector\":117,\"./fastlane\":120,\"./google-payment\":123,\"./hosted-fields\":130,\"./instant-verification\":140,\"./local-payment\":191,\"./masterpass\":195,\"./payment-ready\":201,\"./payment-request\":204,\"./paypal\":211,\"./paypal-checkout\":208,\"./preferred-payment-methods\":214,\"./sepa\":218,\"./three-d-secure\":228,\"./unionpay\":232,\"./us-bank-account\":238,\"./vault-manager\":241,\"./venmo\":246,\"./visa-checkout\":256}],138:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar EXPERIENCE_URL = {\n  sandbox:\n    \"https://www.sandbox.paypal.com/openfinance/v1/bank/payment-method/create\",\n  production:\n    \"https://www.paypal.com/openfinance/v1/bank/payment-method/create\",\n};\n\n// endRemoveIf(production)\n\nvar ACH_MANDATE_DETAILS_QUERY =\n  \"query AchMandateDetails($id: ID!) { \" +\n  \"node(id: $id) { \" +\n  \"id \" +\n  \"... on PaymentMethod { \" +\n  \"id \" +\n  \"legacyId \" +\n  \"usage \" +\n  \"createdAt \" +\n  \"verifications { \" +\n  \"edges { \" +\n  \"node { \" +\n  \"status \" +\n  \"} \" +\n  \"} \" +\n  \"} \" +\n  \"details { \" +\n  \"__typename \" +\n  \"... on UsBankAccountDetails { \" +\n  \"accountholderName \" +\n  \"accountType \" +\n  \"ownershipType \" +\n  \"bankName \" +\n  \"last4 \" +\n  \"routingNumber \" +\n  \"verified \" +\n  \"} \" +\n  \"} \" +\n  \"} \" +\n  \"} \" +\n  \"}\";\n\nmodule.exports = {\n  EXPERIENCE_URL: EXPERIENCE_URL,\n  ACH_MANDATE_DETAILS_QUERY: ACH_MANDATE_DETAILS_QUERY,\n};\n\n},{}],139:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar BraintreeError = _dereq_(\"../lib/braintree-error\");\n\n/**\n * @name BraintreeError.InstantVerification - Creation Error Codes\n * @description Errors that occur when [creating the Instant Verification component](./module-braintree-web_instant-verification.html#.create).\n * @property {MERCHANT} INSTANT_VERIFICATION_NOT_ENABLED Occurs when Instant Verification is not enabled on the Braintree control panel.\n */\n\n/**\n * @name BraintreeError.InstantVerification - startPayment Error Codes\n * @description Errors that occur when using the [`startPayment` method](./InstantVerification.html#startPayment).\n * @property {MERCHANT} INSTANT_VERIFICATION_JWT_MISSING Occurs when the JWT parameter is missing from the startPayment call.\n */\n\n/**\n * @name BraintreeError.InstantVerification - handleRedirect Error Codes\n * @description Errors that occur when using the [`handleRedirect` method](./InstantVerification.html#handleRedirect).\n * @property {CUSTOMER} INSTANT_VERIFICATION_CANCELED Occurs when the customer cancels the Instant Verification payment before authorizing.\n * @property {UNKNOWN} INSTANT_VERIFICATION_FAILURE Occurs when the Instant Verification payment fails during the authorization process.\n */\n\n/**\n * @name BraintreeError.InstantVerification - General Error Codes\n * @description General errors that can occur when using Instant Verification.\n * @property {MERCHANT} INSTANT_VERIFICATION_ERROR Occurs when a general Instant Verification error is encountered.\n */\n\nmodule.exports = {\n  INSTANT_VERIFICATION_ERROR: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"INSTANT_VERIFICATION_ERROR\",\n  },\n  INSTANT_VERIFICATION_NOT_ENABLED: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"INSTANT_VERIFICATION_NOT_ENABLED\",\n    message: \"Instant Verification is not enabled for this merchant account.\",\n  },\n  INSTANT_VERIFICATION_CANCELED: {\n    type: BraintreeError.types.CUSTOMER,\n    code: \"INSTANT_VERIFICATION_CANCELED\",\n    message:\n      \"Customer canceled the Instant Verification payment before authorizing.\",\n  },\n  INSTANT_VERIFICATION_FAILURE: {\n    type: BraintreeError.types.UNKNOWN,\n    code: \"INSTANT_VERIFICATION_FAILURE\",\n    message: \"Instant Verification payment failed during authorizing.\",\n  },\n  INSTANT_VERIFICATION_JWT_REQUIRED: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"INSTANT_VERIFICATION_JWT_MISSING\",\n    message: \"JWT is required for Instant Verification payment flow.\",\n  },\n  INSTANT_VERIFICATION_MANDATE_ID_REQUIRED: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"INSTANT_VERIFICATION_MANDATE_ID_REQUIRED\",\n    message: \"Mandate ID is required to fetch ACH mandate details.\",\n  },\n  INSTANT_VERIFICATION_MANDATE_DETAILS_FAILED: {\n    type: BraintreeError.types.NETWORK,\n    code: \"INSTANT_VERIFICATION_MANDATE_DETAILS_FAILED\",\n    message: \"Failed to fetch ACH mandate details.\",\n  },\n};\n\n},{\"../lib/braintree-error\":148}],140:[function(_dereq_,module,exports){\n\"use strict\";\n\n/** @module braintree-web/instant-verification */\n\nvar basicComponentVerification = _dereq_(\"../lib/basic-component-verification\");\nvar BraintreeError = _dereq_(\"../lib/braintree-error\");\nvar createAssetsUrl = _dereq_(\"../lib/create-assets-url\");\nvar createDeferredClient = _dereq_(\"../lib/create-deferred-client\");\nvar errors = _dereq_(\"./errors\");\nvar InstantVerification = _dereq_(\"./instant-verification\");\nvar VERSION = \"3.134.0\";\nvar wrapPromise = _dereq_(\"@braintree/wrap-promise\");\n\n/**\n * @static\n * @function create\n * @param {object} options Creation options:\n * @param {Client} [options.client] A {@link Client} instance.\n * @param {string} [options.authorization] A tokenizationKey or clientToken. Can be used in place of `options.client`.\n * @param {callback} [callback] When provided, will be used instead of a promise. First argument is an error object, second is an instance of {@link InstantVerification}.\n * @returns {Promise<InstantVerification|error>} Returns the InstantVerification instance.\n * @example\n * braintree.instantVerification.create({\n *   client: clientInstance\n * }).then(function (instantVerificationInstance) {\n *   // instantVerificationInstance is ready to be used.\n * }).catch(function (createErr) {\n *   console.error('Error creating Instant Verification instance', createErr);\n * });\n */\nfunction create(options) {\n  var instantVerification;\n  var name = \"Instant Verification\";\n\n  return basicComponentVerification\n    .verify({\n      name: name,\n      client: options.client,\n      authorization: options.authorization,\n    })\n    .then(function () {\n      return createDeferredClient.create({\n        authorization: options.authorization,\n        client: options.client,\n        debug: options.debug,\n        assetsUrl: createAssetsUrl.create(options.authorization),\n        name: name,\n      });\n    })\n    .then(function (client) {\n      options.client = client;\n\n      // GraphQL Team decided to stick to the OpenBanking in the clientConfiguration\n      instantVerification =\n        options.client.getConfiguration().gatewayConfiguration.openBanking;\n\n      if (!instantVerification) {\n        return Promise.reject(\n          new BraintreeError(errors.INSTANT_VERIFICATION_NOT_ENABLED)\n        );\n      }\n\n      return new InstantVerification(options);\n    });\n}\n\nmodule.exports = {\n  create: wrapPromise(create),\n  /**\n   * @description The current version of the SDK, i.e. `{@pkg version}`.\n   * @type {string}\n   */\n  VERSION: VERSION,\n};\n\n},{\"../lib/basic-component-verification\":146,\"../lib/braintree-error\":148,\"../lib/create-assets-url\":152,\"../lib/create-deferred-client\":154,\"./errors\":139,\"./instant-verification\":141,\"@braintree/wrap-promise\":43}],141:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar atob = _dereq_(\"../lib/vendor/polyfill\").atob;\nvar analytics = _dereq_(\"../lib/analytics\");\nvar BraintreeError = _dereq_(\"../lib/braintree-error\");\nvar constants = _dereq_(\"./constants\");\nvar errors = _dereq_(\"./errors\");\nvar querystring = _dereq_(\"../lib/querystring\");\nvar wrapPromise = _dereq_(\"@braintree/wrap-promise\");\n\n/**\n * @class\n * @param {object} options see {@link module:braintree-web/instant-verification.create|instant-verification.create}\n * @classdesc This class represents an InstantVerification component. Instances of this class open an InstantVerification window for paying using banking account details in specific regions. Any additional UI, such as disabling the page while authentication is taking place, is up to the developer.\n *\n * @description <strong>Do not use this constructor directly. Use {@link module:braintree-web/instant-verification.create|braintree-web.instant-verification.create} instead.</strong>\n */\nfunction InstantVerification(options) {\n  this._instantiatedWithClient = Boolean(!options.useDeferredClient);\n  this._client = options.client;\n  this._createPromise = options.createPromise;\n\n  analytics.sendEvent(\n    this._client,\n    \"instant-verification.component.initialized\"\n  );\n}\n\n/**\n * Options used for startPayment\n * @typedef {object} InstantVerification~startPaymentOptions\n * @property {string} jwt - A JSON Web Token (JWT) containing the redirect URL and callback URL for the Instant Verification payment flow.\n */\n\n/**\n * Initiates the Instant Verification payment flow by redirecting to the authorization page.\n * @public\n * @param {InstantVerification~startPaymentOptions} options The options for starting a payment session.\n * @returns {(Promise|void)} Returns a promise if no callback is provided.\n * @example\n * button.addEventListener('click', function () {\n *   instantVerificationInstance.startPayment({\n *     jwt: 'JWT_STRING_FROM_YOUR_SERVER',\n *   }).catch(function (err) {\n *     // Handle error\n *     console.error(err);\n *   });\n * });\n */\nInstantVerification.prototype.startPayment = function (options) {\n  var self = this;\n\n  var clientAuthFingerprint =\n    self._client.getConfiguration().authorizationFingerprint;\n\n  var redirectUrl = \"\";\n\n  // Check if jwt is provided\n  if (!options.jwt) {\n    return Promise.reject(\n      new BraintreeError(errors.INSTANT_VERIFICATION_JWT_REQUIRED)\n    );\n  }\n\n  redirectUrl =\n    getBaseUrl(self._client.getConfiguration()) +\n    \"?\" +\n    querystring.stringify({\n      ct: options.jwt,\n      at: clientAuthFingerprint,\n    });\n\n  // Just perform the redirect directly instead of using _createPromise\n  if (typeof window !== \"undefined\" && window.location) {\n    analytics.sendEvent(\n      self._client,\n      \"instant-verification.redirect.initiated\"\n    );\n    window.location.href = redirectUrl;\n  }\n\n  return Promise.resolve();\n};\n\nfunction getBaseUrl(configuration) {\n  var url = constants.EXPERIENCE_URL.production;\n\n  if (\n    configuration &&\n    configuration.gatewayConfiguration &&\n    configuration.gatewayConfiguration.environment &&\n    constants.EXPERIENCE_URL[configuration.gatewayConfiguration.environment]\n  ) {\n    url =\n      constants.EXPERIENCE_URL[configuration.gatewayConfiguration.environment];\n  }\n\n  return url;\n}\n\n/**\n * Handle redirect back to merchant page from Instant Verification experience.\n * @param {object} options - Options for the handling redirect back from Instant Verification UI.\n * @param {string} [options.success] URL query param returned from Instant Verification UI\n * @param {string} [options.cancel] URL query param return from Instant Verification UI\n * @param {string} [options.error] URL query param return from Instant Verification UI\n * @returns {Promise<string>|BraintreeError}  Returns a promise if no callback is provided.\n * If the redirect from the Instant Verification page is successful, the Promise will resolve with a nonce.\n * Otherwise, the promise rejects with a `BraintreeError`.\n * @example\n * const urlParams = new URL(window.location.href).searchParams;\n * instantVerificationInstance.handleRedirect({\n *   success: urlParams.get('success');,\n *   cancel: urlParams.get('cancel');,\n *   error: urlParams.get('error');\n * })\n * .then((result) => {\n *   if (result) {\n *     console.log('nonce: %s', result);\n *   } else {\n *     console.log('empty result');\n *   }\n * })\n * .catch((err) => {\n *   console.error(error: ${JSON.stringify(err)}`);\n * })\n */\nInstantVerification.prototype.handleRedirect = function (options) {\n  var self = this;\n  var error, payload, nonce;\n\n  if (options.success) {\n    payload = JSON.parse(atob(options.success));\n\n    analytics.sendEvent(\n      self._client,\n      \"instant-verification.redirect.completed.success\"\n    );\n\n    if (payload.tokenizedAccounts && payload.tokenizedAccounts[0]) {\n      nonce = payload.tokenizedAccounts[0].tokenized_account;\n    }\n\n    return Promise.resolve(nonce);\n  }\n\n  if (options.cancel) {\n    payload = JSON.parse(atob(options.cancel));\n    analytics.sendEvent(\n      self._client,\n      \"instant-verification.redirect.completed.canceled\"\n    );\n    error = new BraintreeError(errors.INSTANT_VERIFICATION_CANCELED);\n  }\n\n  if (options.error) {\n    payload = JSON.parse(atob(options.error));\n    analytics.sendEvent(\n      self._client,\n      \"instant-verification.redirect.completed.error\"\n    );\n    error = new BraintreeError(errors.INSTANT_VERIFICATION_FAILURE);\n  }\n\n  return Promise.reject(error);\n};\n\n/**\n * Fetches ACH mandate details for a specific mandate ID.\n * @public\n * @param {object} options - Options for fetching ACH mandate details.\n * @param {string} options.mandateId - The ID of the mandate to retrieve details for.\n * @returns {Promise<object>} Returns a promise that resolves with the ACH mandate details.\n * If successful, the promise resolves with an object containing mandate information.\n * Otherwise, the promise rejects with a `BraintreeError`.\n * @example\n * instantVerificationInstance.getAchMandateDetails({\n *   mandateId: 'mandate-id-from-tokenization'\n * })\n * .then(function (mandateDetails) {\n *   console.log('Bank name:', mandateDetails.bankName);\n *   console.log('Account holder:', mandateDetails.accountHolderName);\n *   console.log('Last 4:', mandateDetails.last4);\n *   console.log('Routing number:', mandateDetails.routingNumber);\n * })\n * .catch(function (err) {\n *   if (err.code === 'INSTANT_VERIFICATION_MANDATE_ID_REQUIRED') {\n *     console.error('A mandate ID is required');\n *   } else if (err.code === 'INSTANT_VERIFICATION_MANDATE_DETAILS_FAILED') {\n *     console.error('Failed to fetch mandate details:', err);\n *   }\n * });\n */\nInstantVerification.prototype.getAchMandateDetails = function (options) {\n  var self = this;\n  var mandateId = options && options.mandateId;\n\n  return new Promise(function (resolve, reject) {\n    if (!mandateId) {\n      reject(\n        new BraintreeError(errors.INSTANT_VERIFICATION_MANDATE_ID_REQUIRED)\n      );\n      return;\n    }\n    self._client.request(\n      {\n        api: \"graphQLApi\",\n        method: \"post\",\n        data: {\n          query: constants.ACH_MANDATE_DETAILS_QUERY,\n          variables: { id: mandateId },\n          operationName: \"AchMandateDetails\",\n        },\n      },\n      function (err, response) {\n        if (err) {\n          analytics.sendEvent(\n            self._client,\n            \"instant-verification.ach-mandate-details.failed\"\n          );\n\n          reject(\n            new BraintreeError({\n              type: errors.INSTANT_VERIFICATION_MANDATE_DETAILS_FAILED.type,\n              code: errors.INSTANT_VERIFICATION_MANDATE_DETAILS_FAILED.code,\n              message:\n                errors.INSTANT_VERIFICATION_MANDATE_DETAILS_FAILED.message,\n              details: { originalError: err },\n            })\n          );\n          return;\n        }\n\n        if (!response.data || !response.data.node) {\n          reject(\n            new BraintreeError({\n              type: errors.INSTANT_VERIFICATION_MANDATE_DETAILS_FAILED.type,\n              code: errors.INSTANT_VERIFICATION_MANDATE_DETAILS_FAILED.code,\n              message: \"No mandate details found for the provided ID.\",\n            })\n          );\n          return;\n        }\n\n        var node = response.data.node;\n\n        if (!node.details) {\n          reject(\n            new BraintreeError({\n              type: errors.INSTANT_VERIFICATION_MANDATE_DETAILS_FAILED.type,\n              code: errors.INSTANT_VERIFICATION_MANDATE_DETAILS_FAILED.code,\n              message: \"Mandate details are missing in the response.\",\n            })\n          );\n          return;\n        }\n\n        analytics.sendEvent(\n          self._client,\n          \"instant-verification.ach-mandate-details.succeeded\"\n        );\n\n        resolve(_formatMandateResponse(node));\n      }\n    );\n  });\n};\n\nfunction _formatMandateResponse(nodeData) {\n  return {\n    accountHolderName: nodeData.details.accountholderName,\n    accountType: nodeData.details.accountType,\n    bankName: nodeData.details.bankName,\n    last4: nodeData.details.last4,\n    ownershipType: nodeData.details.ownershipType,\n    routingNumber: nodeData.details.routingNumber,\n  };\n}\n\nmodule.exports = wrapPromise.wrapPrototype(InstantVerification);\n\n},{\"../lib/analytics\":143,\"../lib/braintree-error\":148,\"../lib/querystring\":182,\"../lib/vendor/polyfill\":187,\"./constants\":138,\"./errors\":139,\"@braintree/wrap-promise\":43}],142:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar createAuthorizationData = _dereq_(\"./create-authorization-data\");\nvar jsonClone = _dereq_(\"./json-clone\");\nvar constants = _dereq_(\"./constants\");\n\nfunction addMetadata(configuration, data) {\n  var key;\n  var attrs = data ? jsonClone(data) : {};\n  var authAttrs = createAuthorizationData(configuration.authorization).attrs;\n  var _meta = jsonClone(configuration.analyticsMetadata);\n\n  attrs.braintreeLibraryVersion = constants.BRAINTREE_LIBRARY_VERSION;\n\n  for (key in attrs._meta) {\n    if (attrs._meta.hasOwnProperty(key)) {\n      _meta[key] = attrs._meta[key];\n    }\n  }\n\n  attrs._meta = _meta;\n\n  if (authAttrs.tokenizationKey) {\n    attrs.tokenizationKey = authAttrs.tokenizationKey;\n  } else {\n    attrs.authorizationFingerprint = authAttrs.authorizationFingerprint;\n  }\n\n  return attrs;\n}\n\nfunction addEventMetadata(clientInstanceOrPromise) {\n  var configuration = clientInstanceOrPromise.getConfiguration();\n  var authAttrs = createAuthorizationData(configuration.authorization).attrs;\n  var isProd = configuration.gatewayConfiguration.environment === \"production\";\n\n  /* eslint-disable camelcase */\n  var metadata = {\n    api_integration_type: configuration.analyticsMetadata.integrationType,\n    app_id: window.location.host,\n    c_sdk_ver: constants.VERSION,\n    component: \"braintreeclientsdk\",\n    merchant_sdk_env: isProd ? \"production\" : \"sandbox\",\n    merchant_id: configuration.gatewayConfiguration.merchantId,\n    event_source: \"web\",\n    platform: constants.PLATFORM,\n    platform_version: window.navigator.userAgent,\n    session_id: configuration.analyticsMetadata.sessionId,\n    client_session_id: configuration.analyticsMetadata.sessionId,\n    tenant_name: \"braintree\",\n    product_name: \"BT_DCC\",\n    space_key: \"SKDUYK\",\n  };\n  /* eslint-enable camelcase */\n\n  if (authAttrs.tokenizationKey) {\n    metadata.tokenization_key = authAttrs.tokenizationKey; // eslint-disable-line camelcase\n  } else {\n    metadata.auth_fingerprint = authAttrs.authorizationFingerprint; // eslint-disable-line camelcase\n  }\n\n  return metadata;\n}\n\nmodule.exports = {\n  addMetadata: addMetadata,\n  addEventMetadata: addEventMetadata,\n};\n\n},{\"./constants\":149,\"./create-authorization-data\":153,\"./json-clone\":179}],143:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar constants = _dereq_(\"./constants\");\nvar metadata = _dereq_(\"./add-metadata\");\nvar assign = _dereq_(\"./assign\").assign;\n\nfunction sendPaypalEvent(clientInstanceOrPromise, eventName, callback) {\n  return sendPaypalEventPlusFields(\n    clientInstanceOrPromise,\n    eventName,\n    {},\n    callback\n  );\n}\n\nfunction sendPaypalEventPlusFields(\n  clientInstanceOrPromise,\n  eventName,\n  extraFields,\n  callback\n) {\n  var timestamp = Date.now();\n  if (extraFields.flow === \"vault\") {\n    extraFields.context_type = \"BA_Token\"; //eslint-disable-line camelcase\n  } else if (extraFields.flow === \"checkout\") {\n    extraFields.context_type = \"EC_Token\"; //eslint-disable-line camelcase\n  }\n\n  return Promise.resolve(clientInstanceOrPromise)\n    .then(function (client) {\n      var request = client._request;\n      var url = constants.ANALYTICS_URL;\n      var qualifiedEvent = constants.ANALYTICS_PREFIX + eventName;\n      var configuration = client.getConfiguration();\n      var isProd =\n        configuration.gatewayConfiguration.environment === \"production\";\n      var data = {\n        events: [],\n        tracking: [],\n      };\n      var trackingMeta = metadata.addEventMetadata(client, data);\n\n      trackingMeta.event_name = qualifiedEvent; // eslint-disable-line camelcase\n      trackingMeta.t = timestamp;\n\n      data.events = [\n        {\n          level: \"info\",\n          event: qualifiedEvent,\n          payload: assign(\n            {\n              env: isProd ? \"production\" : \"sandbox\",\n              timestamp: timestamp,\n            },\n            extraFields\n          ),\n        },\n      ];\n      data.tracking = [trackingMeta];\n\n      if (extraFields && typeof extraFields === \"object\") {\n        data.tracking = [appendExtraFieldsTo(trackingMeta, extraFields)];\n      }\n\n      return request(\n        {\n          url: url,\n          method: \"post\",\n          data: data,\n          timeout: constants.ANALYTICS_REQUEST_TIMEOUT_MS,\n        },\n        callback\n      );\n    })\n    .catch(function (err) {\n      if (callback) {\n        callback(err);\n      }\n    });\n}\n\nfunction appendExtraFieldsTo(trackingMeta, extraFields) {\n  var result = {};\n  var allowedExtraFields = assign({}, extraFields);\n\n  Object.keys(allowedExtraFields).forEach(function (field) {\n    if (constants.ALLOWED_EXTRA_EVENT_FIELDS.indexOf(field) === -1) {\n      delete allowedExtraFields[field];\n    }\n  });\n\n  result = assign(trackingMeta, allowedExtraFields);\n\n  return result;\n}\n\nmodule.exports = {\n  sendEvent: sendPaypalEvent,\n  sendEventPlus: sendPaypalEventPlusFields,\n};\n\n},{\"./add-metadata\":142,\"./assign\":145,\"./constants\":149}],144:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar loadScript = _dereq_(\"@braintree/asset-loader/load-script\");\nvar loadConnectScript = _dereq_(\"@paypal/accelerated-checkout-loader\");\n\nmodule.exports = {\n  loadScript: loadScript,\n  loadFastlane: loadConnectScript.loadAxo,\n};\n\n},{\"@braintree/asset-loader/load-script\":2,\"@paypal/accelerated-checkout-loader\":44}],145:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar assignNormalized =\n  typeof Object.assign === \"function\" ? Object.assign : assignPolyfill;\n\nfunction assignPolyfill(destination) {\n  var i, source, key;\n\n  for (i = 1; i < arguments.length; i++) {\n    source = arguments[i];\n    for (key in source) {\n      if (source.hasOwnProperty(key)) {\n        destination[key] = source[key];\n      }\n    }\n  }\n\n  return destination;\n}\n\nmodule.exports = {\n  assign: assignNormalized,\n  _assign: assignPolyfill,\n};\n\n},{}],146:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar BraintreeError = _dereq_(\"./braintree-error\");\nvar sharedErrors = _dereq_(\"./errors\");\nvar VERSION = \"3.134.0\";\n\nfunction basicComponentVerification(options) {\n  var client, authorization, name;\n\n  if (!options) {\n    return Promise.reject(\n      new BraintreeError({\n        type: sharedErrors.INVALID_USE_OF_INTERNAL_FUNCTION.type,\n        code: sharedErrors.INVALID_USE_OF_INTERNAL_FUNCTION.code,\n        message:\n          \"Options must be passed to basicComponentVerification function.\",\n      })\n    );\n  }\n\n  name = options.name;\n  client = options.client;\n  authorization = options.authorization;\n\n  if (!client && !authorization) {\n    return Promise.reject(\n      new BraintreeError({\n        type: sharedErrors.INSTANTIATION_OPTION_REQUIRED.type,\n        code: sharedErrors.INSTANTIATION_OPTION_REQUIRED.code,\n        // NEXT_MAJOR_VERSION in major version, we expose passing in authorization for all components\n        // instead of passing in a client instance. Leave this a silent feature for now.\n        message: \"options.client is required when instantiating \" + name + \".\",\n      })\n    );\n  }\n\n  if (!authorization && client.getVersion() !== VERSION) {\n    return Promise.reject(\n      new BraintreeError({\n        type: sharedErrors.INCOMPATIBLE_VERSIONS.type,\n        code: sharedErrors.INCOMPATIBLE_VERSIONS.code,\n        message:\n          \"Client (version \" +\n          client.getVersion() +\n          \") and \" +\n          name +\n          \" (version \" +\n          VERSION +\n          \") components must be from the same SDK version.\",\n      })\n    );\n  }\n\n  return Promise.resolve();\n}\n\nmodule.exports = {\n  verify: basicComponentVerification,\n};\n\n},{\"./braintree-error\":148,\"./errors\":158}],147:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar once = _dereq_(\"./once\");\n\nfunction call(fn, callback) {\n  var isSync = fn.length === 0;\n\n  if (isSync) {\n    fn();\n    callback(null);\n  } else {\n    fn(callback);\n  }\n}\n\nmodule.exports = function (functions, cb) {\n  var i;\n  var length = functions.length;\n  var remaining = length;\n  var callback = once(cb);\n\n  if (length === 0) {\n    callback(null);\n\n    return;\n  }\n\n  function finish(err) {\n    if (err) {\n      callback(err);\n\n      return;\n    }\n\n    remaining -= 1;\n    if (remaining === 0) {\n      callback(null);\n    }\n  }\n\n  for (i = 0; i < length; i++) {\n    call(functions[i], finish);\n  }\n};\n\n},{\"./once\":181}],148:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar enumerate = _dereq_(\"./enumerate\");\n\n/**\n * @class\n * @global\n * @param {object} options Construction options\n * @classdesc This class is used to report error conditions, frequently as the first parameter to callbacks throughout the Braintree SDK.\n * @description <strong>You cannot use this constructor directly. Interact with instances of this class through {@link callback callbacks}.</strong>\n */\nfunction BraintreeError(options) {\n  if (!BraintreeError.types.hasOwnProperty(options.type)) {\n    throw new Error(options.type + \" is not a valid type.\");\n  }\n\n  if (!options.code) {\n    throw new Error(\"Error code required.\");\n  }\n\n  if (!options.message) {\n    throw new Error(\"Error message required.\");\n  }\n\n  this.name = \"BraintreeError\";\n\n  /**\n   * @type {string}\n   * @description A code that corresponds to specific errors.\n   */\n  this.code = options.code;\n\n  /**\n   * @type {string}\n   * @description A short description of the error.\n   */\n  this.message = options.message;\n\n  /**\n   * @type {BraintreeError.types}\n   * @description The type of error.\n   */\n  this.type = options.type;\n\n  /**\n   * @type {object=}\n   * @description Additional information about the error, such as an underlying network error response.\n   */\n  this.details = options.details;\n}\n\nBraintreeError.prototype = Object.create(Error.prototype);\nBraintreeError.prototype.constructor = BraintreeError;\n\n/**\n * Enum for {@link BraintreeError} types.\n * @name BraintreeError.types\n * @enum\n * @readonly\n * @memberof BraintreeError\n * @property {string} CUSTOMER An error caused by the customer.\n * @property {string} MERCHANT An error that is actionable by the merchant.\n * @property {string} NETWORK An error due to a network problem.\n * @property {string} INTERNAL An error caused by Braintree code.\n * @property {string} UNKNOWN An error where the origin is unknown.\n */\nBraintreeError.types = enumerate([\n  \"CUSTOMER\",\n  \"MERCHANT\",\n  \"NETWORK\",\n  \"INTERNAL\",\n  \"UNKNOWN\",\n]);\n\nBraintreeError.findRootError = function (err) {\n  if (\n    err instanceof BraintreeError &&\n    err.details &&\n    err.details.originalError\n  ) {\n    return BraintreeError.findRootError(err.details.originalError);\n  }\n\n  return err;\n};\n\nmodule.exports = BraintreeError;\n\n},{\"./enumerate\":157}],149:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar VERSION = \"3.134.0\";\nvar PLATFORM = \"web\";\n\nvar CLIENT_API_URLS = {\n  production: \"https://api.braintreegateway.com:443\",\n  sandbox: \"https://api.sandbox.braintreegateway.com:443\",\n};\n\nvar ASSETS_URLS = {\n  production: \"https://assets.braintreegateway.com\",\n  sandbox: \"https://assets.braintreegateway.com\",\n};\n\nvar GRAPHQL_URLS = {\n  production: \"https://payments.braintree-api.com/graphql\",\n  sandbox: \"https://payments.sandbox.braintree-api.com/graphql\",\n};\n\n// endRemoveIf(production)\n\nmodule.exports = {\n  ANALYTICS_PREFIX: PLATFORM + \".\",\n  ANALYTICS_REQUEST_TIMEOUT_MS: 2000,\n  ANALYTICS_URL: \"https://www.paypal.com/xoplatform/logger/api/logger\",\n  ASSETS_URLS: ASSETS_URLS,\n  CLIENT_API_URLS: CLIENT_API_URLS,\n  FRAUDNET_SOURCE: \"BRAINTREE_SIGNIN\",\n  FRAUDNET_FNCLS: \"fnparams-dede7cc5-15fd-4c75-a9f4-36c430ee3a99\",\n  FRAUDNET_URL: \"https://c.paypal.com/da/r/fb.js\",\n  BUS_CONFIGURATION_REQUEST_EVENT: \"BUS_CONFIGURATION_REQUEST\",\n  GRAPHQL_URLS: GRAPHQL_URLS,\n  INTEGRATION_TIMEOUT_MS: 60000,\n  VERSION: VERSION,\n  INTEGRATION: \"custom\",\n  SOURCE: \"client\",\n  PLATFORM: PLATFORM,\n  BRAINTREE_LIBRARY_VERSION: \"braintree/\" + PLATFORM + \"/\" + VERSION,\n  ALLOWED_EXTRA_EVENT_FIELDS: [\n    \"context_id\",\n    \"context_type\",\n    \"payment_ready_button_order\",\n    \"payment_ready_experiment_type\",\n    \"payment_ready_page_type\",\n    \"payment_ready_session_id\",\n    \"button_type\",\n    \"connectionStartTime\",\n    \"domain\",\n    \"endpoint\",\n    \"endTime\",\n    \"requestStartTime\",\n    \"startTime\",\n  ],\n};\n\n},{}],150:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar BraintreeError = _dereq_(\"./braintree-error\");\nvar sharedErrors = _dereq_(\"./errors\");\n\nmodule.exports = function (instance, methodNames) {\n  methodNames.forEach(function (methodName) {\n    instance[methodName] = function () {\n      throw new BraintreeError({\n        type: sharedErrors.METHOD_CALLED_AFTER_TEARDOWN.type,\n        code: sharedErrors.METHOD_CALLED_AFTER_TEARDOWN.code,\n        message: methodName + \" cannot be called after teardown.\",\n      });\n    };\n  });\n};\n\n},{\"./braintree-error\":148,\"./errors\":158}],151:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar BraintreeError = _dereq_(\"./braintree-error\");\n\nfunction convertToBraintreeError(originalErr, btErrorObject) {\n  if (originalErr instanceof BraintreeError) {\n    return originalErr;\n  }\n\n  return new BraintreeError({\n    type: btErrorObject.type,\n    code: btErrorObject.code,\n    message: btErrorObject.message,\n    details: {\n      originalError: originalErr,\n    },\n  });\n}\n\nmodule.exports = convertToBraintreeError;\n\n},{\"./braintree-error\":148}],152:[function(_dereq_,module,exports){\n\"use strict\";\n\n// endRemoveIf(production)\nvar ASSETS_URLS = _dereq_(\"./constants\").ASSETS_URLS;\n\nfunction createAssetsUrl(authorization) {\n  // endRemoveIf(production)\n\n  return ASSETS_URLS.production;\n}\n/* eslint-enable */\n\nmodule.exports = {\n  create: createAssetsUrl,\n};\n\n},{\"./constants\":149}],153:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar atob = _dereq_(\"../lib/vendor/polyfill\").atob;\nvar CLIENT_API_URLS = _dereq_(\"../lib/constants\").CLIENT_API_URLS;\n\nfunction _isTokenizationKey(str) {\n  return /^[a-zA-Z0-9]+_[a-zA-Z0-9]+_[a-zA-Z0-9_]+$/.test(str);\n}\n\nfunction _parseTokenizationKey(tokenizationKey) {\n  var tokens = tokenizationKey.split(\"_\");\n  var environment = tokens[0];\n  var merchantId = tokens.slice(2).join(\"_\");\n\n  return {\n    merchantId: merchantId,\n    environment: environment,\n  };\n}\n\nfunction createAuthorizationData(authorization) {\n  var parsedClientToken, parsedTokenizationKey;\n  var data = {\n    attrs: {},\n    configUrl: \"\",\n  };\n\n  if (_isTokenizationKey(authorization)) {\n    parsedTokenizationKey = _parseTokenizationKey(authorization);\n    data.environment = parsedTokenizationKey.environment;\n    data.attrs.tokenizationKey = authorization;\n    data.configUrl =\n      CLIENT_API_URLS[parsedTokenizationKey.environment] +\n      \"/merchants/\" +\n      parsedTokenizationKey.merchantId +\n      \"/client_api/v1/configuration\";\n  } else {\n    parsedClientToken = JSON.parse(atob(authorization));\n    data.environment = parsedClientToken.environment;\n    data.attrs.authorizationFingerprint =\n      parsedClientToken.authorizationFingerprint;\n    data.configUrl = parsedClientToken.configUrl;\n    data.graphQL = parsedClientToken.graphQL;\n  }\n\n  return data;\n}\n\nmodule.exports = createAuthorizationData;\n\n},{\"../lib/constants\":149,\"../lib/vendor/polyfill\":187}],154:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar BraintreeError = _dereq_(\"./braintree-error\");\nvar assets = _dereq_(\"./assets\");\nvar sharedErrors = _dereq_(\"./errors\");\n\nvar VERSION = \"3.134.0\";\n\nfunction createDeferredClient(options) {\n  var promise = Promise.resolve();\n\n  if (options.client) {\n    return Promise.resolve(options.client);\n  }\n\n  if (!(window.braintree && window.braintree.client)) {\n    promise = assets\n      .loadScript({\n        src: options.assetsUrl + \"/web/\" + VERSION + \"/js/client.min.js\",\n      })\n      .catch(function (err) {\n        return Promise.reject(\n          new BraintreeError({\n            type: sharedErrors.CLIENT_SCRIPT_FAILED_TO_LOAD.type,\n            code: sharedErrors.CLIENT_SCRIPT_FAILED_TO_LOAD.code,\n            message: sharedErrors.CLIENT_SCRIPT_FAILED_TO_LOAD.message,\n            details: {\n              originalError: err,\n            },\n          })\n        );\n      });\n  }\n\n  return promise.then(function () {\n    if (window.braintree.client.VERSION !== VERSION) {\n      return Promise.reject(\n        new BraintreeError({\n          type: sharedErrors.INCOMPATIBLE_VERSIONS.type,\n          code: sharedErrors.INCOMPATIBLE_VERSIONS.code,\n          message:\n            \"Client (version \" +\n            window.braintree.client.VERSION +\n            \") and \" +\n            options.name +\n            \" (version \" +\n            VERSION +\n            \") components must be from the same SDK version.\",\n        })\n      );\n    }\n\n    return window.braintree.client.create({\n      authorization: options.authorization,\n      debug: options.debug,\n    });\n  });\n}\n\nmodule.exports = {\n  create: createDeferredClient,\n};\n\n},{\"./assets\":144,\"./braintree-error\":148,\"./errors\":158}],155:[function(_dereq_,module,exports){\n\"use strict\";\n\nmodule.exports = function (fn) {\n  return function () {\n    // IE9 doesn't support passing arguments to setTimeout so we have to emulate it.\n    var args = arguments;\n\n    setTimeout(function () {\n      fn.apply(null, args);\n    }, 1);\n  };\n};\n\n},{}],156:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar batchExecuteFunctions = _dereq_(\"./batch-execute-functions\");\n\nfunction Destructor() {\n  this._teardownRegistry = [];\n\n  this._isTearingDown = false;\n}\n\nDestructor.prototype.registerFunctionForTeardown = function (fn) {\n  if (typeof fn === \"function\") {\n    this._teardownRegistry.push(fn);\n  }\n};\n\nDestructor.prototype.teardown = function (callback) {\n  if (this._isTearingDown) {\n    callback(new Error(\"Destructor is already tearing down\"));\n\n    return;\n  }\n\n  this._isTearingDown = true;\n\n  batchExecuteFunctions(\n    this._teardownRegistry,\n    function (err) {\n      this._teardownRegistry = [];\n      this._isTearingDown = false;\n\n      if (typeof callback === \"function\") {\n        callback(err);\n      }\n    }.bind(this)\n  );\n};\n\nmodule.exports = Destructor;\n\n},{\"./batch-execute-functions\":147}],157:[function(_dereq_,module,exports){\n\"use strict\";\n\nfunction enumerate(values, prefix) {\n  prefix = prefix == null ? \"\" : prefix;\n\n  return values.reduce(function (enumeration, value) {\n    enumeration[value] = prefix + value;\n\n    return enumeration;\n  }, {});\n}\n\nmodule.exports = enumerate;\n\n},{}],158:[function(_dereq_,module,exports){\n\"use strict\";\n\n/**\n * @name BraintreeError.Shared Internal Error Codes\n * @ignore\n * @description These codes should never be experienced by the merchant directly.\n * @property {INTERNAL} INVALID_USE_OF_INTERNAL_FUNCTION Occurs when the client is created without a gateway configuration. Should never happen.\n */\n\n/**\n * @name BraintreeError.Shared Errors - Component Creation Error Codes\n * @description Errors that occur when creating components.\n * @property {MERCHANT} INSTANTIATION_OPTION_REQUIRED Occurs when a component is created that is missing a required option.\n * @property {MERCHANT} INCOMPATIBLE_VERSIONS Occurs when a component is created with a client with a different version than the component.\n * @property {NETWORK} CLIENT_SCRIPT_FAILED_TO_LOAD Occurs when a component attempts to load the Braintree client script, but the request fails.\n */\n\n/**\n * @name BraintreeError.Shared Errors - Component Instance Error Codes\n * @description Errors that occur when using instances of components.\n * @property {MERCHANT} METHOD_CALLED_AFTER_TEARDOWN Occurs when a method is called on a component instance after it has been torn down.\n */\n\nvar BraintreeError = _dereq_(\"./braintree-error\");\n\nmodule.exports = {\n  INVALID_USE_OF_INTERNAL_FUNCTION: {\n    type: BraintreeError.types.INTERNAL,\n    code: \"INVALID_USE_OF_INTERNAL_FUNCTION\",\n  },\n  INSTANTIATION_OPTION_REQUIRED: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"INSTANTIATION_OPTION_REQUIRED\",\n  },\n  INCOMPATIBLE_VERSIONS: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"INCOMPATIBLE_VERSIONS\",\n  },\n  CLIENT_SCRIPT_FAILED_TO_LOAD: {\n    type: BraintreeError.types.NETWORK,\n    code: \"CLIENT_SCRIPT_FAILED_TO_LOAD\",\n    message: \"Braintree client script could not be loaded.\",\n  },\n  METHOD_CALLED_AFTER_TEARDOWN: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"METHOD_CALLED_AFTER_TEARDOWN\",\n  },\n};\n\n},{\"./braintree-error\":148}],159:[function(_dereq_,module,exports){\n\"use strict\";\n\nmodule.exports = function findRootNode(element) {\n  while (element.parentNode) {\n    element = element.parentNode;\n  }\n\n  return element;\n};\n\n},{}],160:[function(_dereq_,module,exports){\n\"use strict\";\n\nmodule.exports = function (array, key, value) {\n  var i;\n\n  for (i = 0; i < array.length; i++) {\n    if (array[i].hasOwnProperty(key) && array[i][key] === value) {\n      return array[i];\n    }\n  }\n\n  return null;\n};\n\n},{}],161:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar Popup = _dereq_(\"./strategies/popup\");\nvar PopupBridge = _dereq_(\"./strategies/popup-bridge\");\nvar Modal = _dereq_(\"./strategies/modal\");\nvar Bus = _dereq_(\"framebus\");\nvar events = _dereq_(\"../shared/events\");\nvar errors = _dereq_(\"../shared/errors\");\nvar constants = _dereq_(\"../shared/constants\");\nvar uuid = _dereq_(\"@braintree/uuid\");\nvar iFramer = _dereq_(\"@braintree/iframer\");\nvar BraintreeError = _dereq_(\"../../braintree-error\");\nvar browserDetection = _dereq_(\"../shared/browser-detection\");\nvar assign = _dereq_(\"./../../assign\").assign;\nvar BUS_CONFIGURATION_REQUEST_EVENT =\n  _dereq_(\"../../constants\").BUS_CONFIGURATION_REQUEST_EVENT;\n\nvar REQUIRED_CONFIG_KEYS = [\"name\", \"dispatchFrameUrl\", \"openFrameUrl\"];\n\nfunction noop() {}\n\nfunction _validateFrameConfiguration(options) {\n  if (!options) {\n    throw new Error(\"Valid configuration is required\");\n  }\n\n  REQUIRED_CONFIG_KEYS.forEach(function (key) {\n    if (!options.hasOwnProperty(key)) {\n      throw new Error(\"A valid frame \" + key + \" must be provided\");\n    }\n  });\n\n  if (!/^[\\w_]+$/.test(options.name)) {\n    throw new Error(\"A valid frame name must be provided\");\n  }\n}\n\nfunction FrameService(options) {\n  _validateFrameConfiguration(options);\n\n  this._serviceId = uuid().replace(/-/g, \"\");\n\n  this._options = {\n    name: options.name + \"_\" + this._serviceId,\n    dispatchFrameUrl: options.dispatchFrameUrl,\n    openFrameUrl: options.openFrameUrl,\n    height: options.height,\n    width: options.width,\n    top: options.top,\n    left: options.left,\n  };\n  this.state = options.state || {};\n\n  this._bus = new Bus({ channel: this._serviceId });\n  this._setBusEvents();\n}\n\nFrameService.prototype.initialize = function (callback) {\n  var dispatchFrameReadyHandler = function () {\n    callback();\n    this._bus.off(events.DISPATCH_FRAME_READY, dispatchFrameReadyHandler);\n  }.bind(this);\n\n  this._bus.on(events.DISPATCH_FRAME_READY, dispatchFrameReadyHandler);\n  this._writeDispatchFrame();\n};\n\nFrameService.prototype._writeDispatchFrame = function () {\n  var frameName = constants.DISPATCH_FRAME_NAME + \"_\" + this._serviceId;\n  var frameSrc = this._options.dispatchFrameUrl;\n\n  this._dispatchFrame = iFramer({\n    \"aria-hidden\": true,\n    name: frameName,\n    title: frameName,\n    src: frameSrc,\n    class: constants.DISPATCH_FRAME_CLASS,\n    height: 0,\n    width: 0,\n    style: {\n      position: \"absolute\",\n      left: \"-9999px\",\n    },\n  });\n\n  document.body.appendChild(this._dispatchFrame);\n};\n\nFrameService.prototype._setBusEvents = function () {\n  this._bus.on(\n    events.DISPATCH_FRAME_REPORT,\n    function (res, reply) {\n      if (this._onCompleteCallback) {\n        this._onCompleteCallback.call(null, res.err, res.payload);\n      }\n      this._frame.close();\n\n      this._onCompleteCallback = null;\n\n      if (reply) {\n        reply();\n      }\n    }.bind(this)\n  );\n\n  this._bus.on(\n    BUS_CONFIGURATION_REQUEST_EVENT,\n    function (reply) {\n      reply(this.state);\n    }.bind(this)\n  );\n};\n\nFrameService.prototype.open = function (options, callback) {\n  options = options || {};\n  this._frame = this._getFrameForEnvironment(options);\n\n  this._frame.initialize(callback);\n\n  if (this._frame instanceof PopupBridge) {\n    // Frameservice loads a spinner then redirects to the final destination url.\n    // For Popupbridge it doesn't have the same rules around popups since it's deferred to the mobile side\n    // therefore, skips the regular open path and instead uses `#redirect` to handle things\n    return;\n  }\n\n  assign(this.state, options.state);\n\n  this._onCompleteCallback = callback;\n  this._frame.open();\n\n  if (this.isFrameClosed()) {\n    this._cleanupFrame();\n\n    if (callback) {\n      callback(new BraintreeError(errors.FRAME_SERVICE_FRAME_OPEN_FAILED));\n    }\n\n    return;\n  }\n  this._pollForPopupClose();\n};\n\nFrameService.prototype.redirect = function (url) {\n  if (this._frame && !this.isFrameClosed()) {\n    this._frame.redirect(url);\n  }\n};\n\nFrameService.prototype.close = function () {\n  if (!this.isFrameClosed()) {\n    this._frame.close();\n  }\n};\n\nFrameService.prototype.focus = function () {\n  if (!this.isFrameClosed()) {\n    this._frame.focus();\n  }\n};\n\nFrameService.prototype.createHandler = function (options) {\n  options = options || {};\n\n  return {\n    close: function () {\n      if (options.beforeClose) {\n        options.beforeClose();\n      }\n\n      this.close();\n    }.bind(this),\n    focus: function () {\n      if (options.beforeFocus) {\n        options.beforeFocus();\n      }\n\n      this.focus();\n    }.bind(this),\n  };\n};\n\nFrameService.prototype.createNoopHandler = function () {\n  return {\n    close: noop,\n    focus: noop,\n  };\n};\n\nFrameService.prototype.teardown = function () {\n  this.close();\n  this._dispatchFrame.parentNode.removeChild(this._dispatchFrame);\n  this._dispatchFrame = null;\n  this._cleanupFrame();\n};\n\nFrameService.prototype.isFrameClosed = function () {\n  return this._frame == null || this._frame.isClosed();\n};\n\nFrameService.prototype._cleanupFrame = function () {\n  this._frame = null;\n  clearInterval(this._popupInterval);\n  this._popupInterval = null;\n};\n\nFrameService.prototype._pollForPopupClose = function () {\n  this._popupInterval = setInterval(\n    function () {\n      if (this.isFrameClosed()) {\n        this._cleanupFrame();\n        if (this._onCompleteCallback) {\n          this._onCompleteCallback(\n            new BraintreeError(errors.FRAME_SERVICE_FRAME_CLOSED)\n          );\n        }\n      }\n    }.bind(this),\n    constants.POPUP_POLL_INTERVAL\n  );\n\n  return this._popupInterval;\n};\n\nFrameService.prototype._getFrameForEnvironment = function (options) {\n  var usePopup = browserDetection.supportsPopups();\n  var popupBridgeExists = Boolean(window.popupBridge);\n\n  var initOptions = assign({}, this._options, options);\n\n  if (popupBridgeExists) {\n    return new PopupBridge(initOptions);\n  }\n  if (usePopup) {\n    return new Popup(initOptions);\n  }\n\n  return new Modal(initOptions);\n};\n\nmodule.exports = FrameService;\n\n},{\"../../braintree-error\":148,\"../../constants\":149,\"../shared/browser-detection\":168,\"../shared/constants\":169,\"../shared/errors\":170,\"../shared/events\":171,\"./../../assign\":145,\"./strategies/modal\":163,\"./strategies/popup\":166,\"./strategies/popup-bridge\":164,\"@braintree/iframer\":35,\"@braintree/uuid\":39,\"framebus\":54}],162:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar FrameService = _dereq_(\"./frame-service\");\n\n/**\n * @ignore\n * @function create\n * Initializing FrameService should be done at the point when the component is created, so it is ready whenever a component needs to open a popup window.\n * Browsers have varying rules around what constitutes and async action worth blocking a popup for, but the likes of Safari\n * will block the popup if `frameService#create` is invoked during any asynchronous process (such as an API request to tokenize payment details).\n *\n * The process of setting up the dispatch frame and subsequent framebus communications via event listeners are considered async by Safari's standards.\n *\n * @param {object} options The options provided to frameservice\n * @param {string} options.name The name to use for identifying the various pieces associated with frameservice.\n * @param {string} options.dispatchFrameUrl The static asset to load for use as the dispatch frame. This allows for secure communication between the iframe and the popup, since they are on the same asset domain (usually checkout.paypal.com or assets.braintreegateway.com)\n * @param {string} options.openFrameUrl The url to load in the popup. Sometimes it is the case that you'll need info that comes _after_ the popup loads in which case we load the `landing-frame` that's a loading spinner then redirect to the proper/final destination. See the PayPal component for an example.\n * Otherwise if all the info needed is ready up-front, then you can forego a landing frame and go straight to the final destination.\n * @param {string} [options.height] The desired popup height.\n * @param {string} [options.width] The desired popup width.\n * @param {string} [options.top] The desired top value of the popup for positioning.\n * @param {string} [options.left] The desired left value of the popup for positioning.\n * @param {object} [options.state] Seems to be dead code, but allows for injecting data in to popup. NEXT_MAJOR_VERSION remove this param if no usage exists.\n * @param {function} callback The function to invoke once the frameservice is created and ready to use. FrameService instance is returned.\n */\nmodule.exports = {\n  create: function createFrameService(options, callback) {\n    var frameService = new FrameService(options);\n\n    frameService.initialize(function () {\n      callback(frameService);\n    });\n  },\n};\n\n},{\"./frame-service\":161}],163:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar iFramer = _dereq_(\"@braintree/iframer\");\nvar assign = _dereq_(\"../../../assign\").assign;\nvar browserDetection = _dereq_(\"../../shared/browser-detection\");\n\nvar ELEMENT_STYLES = {\n  position: \"fixed\",\n  top: 0,\n  left: 0,\n  bottom: 0,\n  padding: 0,\n  margin: 0,\n  border: 0,\n  outline: \"none\",\n  zIndex: 20001,\n  background: \"#FFFFFF\",\n};\n\nfunction noop() {}\n\n/**\n *\n * We should not ever really use the Modal. Modals are _like_  popups, but the key difference is that the customer can't actually verify it's app domain and thus secure/valid. Old PP sdk (./src/paypal) uses this\n * to get info from webviews (e.g. facebook).\n */\n\nfunction Modal(options) {\n  this._closed = null;\n  this._frame = null;\n  this._options = options || {};\n  this._container = this._options.container || document.body;\n}\n\nModal.prototype.initialize = noop;\n\nModal.prototype.open = function () {\n  var iframerConfig = {\n    src: this._options.openFrameUrl,\n    name: this._options.name,\n    scrolling: \"yes\",\n    height: \"100%\",\n    width: \"100%\",\n    style: assign({}, ELEMENT_STYLES),\n    title: \"Lightbox Frame\",\n  };\n\n  if (browserDetection.isIos()) {\n    // WKWebView has buggy behavior when scrolling a fixed position modal. The workaround is to lock scrolling in\n    // the background. When modal is closed, we restore scrolling and return to the previous scroll position.\n    if (browserDetection.isIosWKWebview()) {\n      this._lockScrolling();\n      // Allows WKWebView to scroll all the way down to bottom\n      iframerConfig.style = {};\n    }\n\n    this._el = document.createElement(\"div\");\n\n    assign(this._el.style, ELEMENT_STYLES, {\n      height: \"100%\",\n      width: \"100%\",\n      overflow: \"auto\",\n      \"-webkit-overflow-scrolling\": \"touch\",\n    });\n\n    this._frame = iFramer(iframerConfig);\n    this._el.appendChild(this._frame);\n  } else {\n    this._el = this._frame = iFramer(iframerConfig);\n  }\n  this._closed = false;\n\n  this._container.appendChild(this._el);\n};\n\nModal.prototype.focus = noop;\n\nModal.prototype.close = function () {\n  this._container.removeChild(this._el);\n  this._frame = null;\n  this._closed = true;\n  if (browserDetection.isIosWKWebview()) {\n    this._unlockScrolling();\n  }\n};\n\nModal.prototype.isClosed = function () {\n  return Boolean(this._closed);\n};\n\nModal.prototype.redirect = function (redirectUrl) {\n  this._frame.src = redirectUrl;\n};\n\nModal.prototype._unlockScrolling = function () {\n  document.body.style.overflow = this._savedBodyProperties.overflowStyle;\n  document.body.style.position = this._savedBodyProperties.positionStyle;\n  window.scrollTo(\n    this._savedBodyProperties.left,\n    this._savedBodyProperties.top\n  );\n  delete this._savedBodyProperties;\n};\n\nModal.prototype._lockScrolling = function () {\n  var doc = document.documentElement;\n\n  // From https://stackoverflow.com/questions/9538868/prevent-body-from-scrolling-when-a-modal-is-opened#comment65626743_24727206\n  this._savedBodyProperties = {\n    left: (window.pageXOffset || doc.scrollLeft) - (doc.clientLeft || 0),\n    top: (window.pageYOffset || doc.scrollTop) - (doc.clientTop || 0),\n    overflowStyle: document.body.style.overflow,\n    positionStyle: document.body.style.position,\n  };\n  document.body.style.overflow = \"hidden\";\n  document.body.style.position = \"fixed\";\n  window.scrollTo(0, 0);\n};\n\nmodule.exports = Modal;\n\n},{\"../../../assign\":145,\"../../shared/browser-detection\":168,\"@braintree/iframer\":35}],164:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar BraintreeError = _dereq_(\"../../../braintree-error\");\nvar errors = _dereq_(\"../../shared/errors\");\n\nfunction noop() {}\n\nfunction PopupBridge(options) {\n  this._closed = null;\n  this._options = options;\n}\n\nPopupBridge.prototype.initialize = function (callback) {\n  var self = this;\n\n  window.popupBridge.onComplete = function (err, payload) {\n    var popupDismissed = !payload && !err;\n\n    self._closed = true;\n\n    if (err || popupDismissed) {\n      // User clicked \"Done\" button of browser view\n      callback(new BraintreeError(errors.FRAME_SERVICE_FRAME_CLOSED));\n\n      return;\n    }\n    // User completed popup flow (includes success and cancel cases)\n    callback(null, payload);\n  };\n};\n\nPopupBridge.prototype.open = function (options) {\n  var url;\n\n  options = options || {};\n  url = options.openFrameUrl || this._options.openFrameUrl;\n\n  this._closed = false;\n  window.popupBridge.open(url);\n};\n\nPopupBridge.prototype.focus = noop;\n\nPopupBridge.prototype.close = noop;\n\nPopupBridge.prototype.isClosed = function () {\n  return Boolean(this._closed);\n};\n\nPopupBridge.prototype.redirect = function (redirectUrl) {\n  this.open({ openFrameUrl: redirectUrl });\n};\n\nmodule.exports = PopupBridge;\n\n},{\"../../../braintree-error\":148,\"../../shared/errors\":170}],165:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar constants = _dereq_(\"../../../shared/constants\");\nvar position = _dereq_(\"./position\");\n\nfunction calculatePosition(type, userDefinedPosition, size) {\n  if (typeof userDefinedPosition !== \"undefined\") {\n    return userDefinedPosition;\n  }\n\n  return position[type](size);\n}\n\nmodule.exports = function composePopupOptions(options) {\n  var height = options.height || constants.DEFAULT_POPUP_HEIGHT;\n  var width = options.width || constants.DEFAULT_POPUP_WIDTH;\n  var top = calculatePosition(\"top\", options.top, height);\n  var left = calculatePosition(\"left\", options.left, width);\n\n  return [\n    constants.POPUP_BASE_OPTIONS,\n    \"height=\" + height,\n    \"width=\" + width,\n    \"top=\" + top,\n    \"left=\" + left,\n  ].join(\",\");\n};\n\n},{\"../../../shared/constants\":169,\"./position\":167}],166:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar composeOptions = _dereq_(\"./compose-options\");\n\nfunction noop() {}\n\nfunction Popup(options) {\n  this._frame = null;\n  this._options = options || {};\n}\n\nPopup.prototype.initialize = noop;\n\nPopup.prototype.open = function () {\n  this._frame = window.open(\n    this._options.openFrameUrl,\n    this._options.name,\n    composeOptions(this._options)\n  );\n};\n\nPopup.prototype.focus = function () {\n  this._frame.focus();\n};\n\nPopup.prototype.close = function () {\n  if (this._frame.closed) {\n    return;\n  }\n  this._frame.close();\n};\n\nPopup.prototype.isClosed = function () {\n  return !this._frame || Boolean(this._frame.closed);\n};\n\nPopup.prototype.redirect = function (redirectUrl) {\n  this._frame.location.href = redirectUrl;\n};\n\nmodule.exports = Popup;\n\n},{\"./compose-options\":165}],167:[function(_dereq_,module,exports){\n\"use strict\";\n\nfunction top(height) {\n  var windowHeight =\n    window.outerHeight || document.documentElement.clientHeight;\n  var windowTop = window.screenY == null ? window.screenTop : window.screenY;\n\n  return center(windowHeight, height, windowTop);\n}\n\nfunction left(width) {\n  var windowWidth = window.outerWidth || document.documentElement.clientWidth;\n  var windowLeft = window.screenX == null ? window.screenLeft : window.screenX;\n\n  return center(windowWidth, width, windowLeft);\n}\n\nfunction center(windowMetric, popupMetric, offset) {\n  return (windowMetric - popupMetric) / 2 + offset;\n}\n\nmodule.exports = {\n  top: top,\n  left: left,\n  center: center,\n};\n\n},{}],168:[function(_dereq_,module,exports){\n\"use strict\";\n\nmodule.exports = {\n  isIos: _dereq_(\"@braintree/browser-detection/is-ios\"),\n  isIosWKWebview: _dereq_(\"@braintree/browser-detection/is-ios-wkwebview\"),\n  supportsPopups: _dereq_(\"@braintree/browser-detection/supports-popups\"),\n};\n\n},{\"@braintree/browser-detection/is-ios\":30,\"@braintree/browser-detection/is-ios-wkwebview\":29,\"@braintree/browser-detection/supports-popups\":32}],169:[function(_dereq_,module,exports){\n\"use strict\";\n\nmodule.exports = {\n  DISPATCH_FRAME_NAME: \"dispatch\",\n  DISPATCH_FRAME_CLASS: \"braintree-dispatch-frame\",\n  POPUP_BASE_OPTIONS: \"resizable,scrollbars\",\n  DEFAULT_POPUP_WIDTH: 450,\n  DEFAULT_POPUP_HEIGHT: 535,\n  POPUP_POLL_INTERVAL: 100,\n  POPUP_CLOSE_TIMEOUT: 100,\n};\n\n},{}],170:[function(_dereq_,module,exports){\n\"use strict\";\n\n/**\n * @name BraintreeError.Popup Related Error Codes\n * @ignore\n * @description Errors that occur when using a component that opens a popup window.\n * @property {INTERNAL} FRAME_SERVICE_FRAME_CLOSED - Occurs when the frame is closed before tokenization can occur.\n * @property {INTERNAL} FRAME_SERVICE_FRAME_OPEN_FAILED - Occurs when the popup could not be opened.\n */\n\nvar BraintreeError = _dereq_(\"../../braintree-error\");\n\nmodule.exports = {\n  FRAME_SERVICE_FRAME_CLOSED: {\n    type: BraintreeError.types.INTERNAL,\n    code: \"FRAME_SERVICE_FRAME_CLOSED\",\n    message: \"Frame closed before tokenization could occur.\",\n  },\n  FRAME_SERVICE_FRAME_OPEN_FAILED: {\n    type: BraintreeError.types.INTERNAL,\n    code: \"FRAME_SERVICE_FRAME_OPEN_FAILED\",\n    message: \"Frame failed to open.\",\n  },\n};\n\n},{\"../../braintree-error\":148}],171:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar enumerate = _dereq_(\"../../enumerate\");\n\nmodule.exports = enumerate(\n  [\"DISPATCH_FRAME_READY\", \"DISPATCH_FRAME_REPORT\"],\n  \"frameService:\"\n);\n\n},{\"../../enumerate\":157}],172:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar VERSION = \"3.134.0\";\nvar assign = _dereq_(\"./assign\").assign;\n\nfunction generateTokenizationParameters(configuration, overrides) {\n  var metadata = configuration.analyticsMetadata;\n  var basicTokenizationParameters = {\n    gateway: \"braintree\",\n    \"braintree:merchantId\": configuration.gatewayConfiguration.merchantId,\n    \"braintree:apiVersion\": \"v1\",\n    \"braintree:sdkVersion\": VERSION,\n    \"braintree:metadata\": JSON.stringify({\n      source: metadata.source,\n      integration: metadata.integration,\n      sessionId: metadata.sessionId,\n      version: VERSION,\n      platform: metadata.platform,\n    }),\n  };\n\n  return assign({}, basicTokenizationParameters, overrides);\n}\n\nmodule.exports = function (configuration, googlePayVersion, googleMerchantId) {\n  var data, paypalPaymentMethod;\n  var androidPayConfiguration = configuration.gatewayConfiguration.androidPay;\n  var environment =\n    configuration.gatewayConfiguration.environment === \"production\"\n      ? \"PRODUCTION\"\n      : \"TEST\";\n\n  if (googlePayVersion === 2) {\n    data = {\n      apiVersion: 2,\n      apiVersionMinor: 0,\n      environment: environment,\n      allowedPaymentMethods: [\n        {\n          type: \"CARD\",\n          parameters: {\n            allowedAuthMethods: [\"PAN_ONLY\", \"CRYPTOGRAM_3DS\"],\n            allowedCardNetworks: androidPayConfiguration.supportedNetworks.map(\n              function (card) {\n                return card.toUpperCase();\n              }\n            ),\n          },\n          tokenizationSpecification: {\n            type: \"PAYMENT_GATEWAY\",\n            parameters: generateTokenizationParameters(configuration, {\n              \"braintree:authorizationFingerprint\":\n                androidPayConfiguration.googleAuthorizationFingerprint,\n            }),\n          },\n        },\n      ],\n    };\n\n    if (googleMerchantId) {\n      data.merchantInfo = {\n        merchantId: googleMerchantId,\n      };\n    }\n\n    if (androidPayConfiguration.paypalClientId) {\n      paypalPaymentMethod = {\n        type: \"PAYPAL\",\n        parameters: {\n          /* eslint-disable camelcase */\n          purchase_context: {\n            purchase_units: [\n              {\n                payee: {\n                  client_id: androidPayConfiguration.paypalClientId,\n                },\n                recurring_payment: true,\n              },\n            ],\n          },\n          /* eslint-enable camelcase */\n        },\n        tokenizationSpecification: {\n          type: \"PAYMENT_GATEWAY\",\n          parameters: generateTokenizationParameters(configuration, {\n            \"braintree:paypalClientId\": androidPayConfiguration.paypalClientId,\n          }),\n        },\n      };\n\n      data.allowedPaymentMethods.push(paypalPaymentMethod);\n    }\n  } else {\n    data = {\n      environment: environment,\n      allowedPaymentMethods: [\"CARD\", \"TOKENIZED_CARD\"],\n      paymentMethodTokenizationParameters: {\n        tokenizationType: \"PAYMENT_GATEWAY\",\n        parameters: generateTokenizationParameters(configuration, {\n          \"braintree:authorizationFingerprint\":\n            androidPayConfiguration.googleAuthorizationFingerprint,\n        }),\n      },\n      cardRequirements: {\n        allowedCardNetworks: androidPayConfiguration.supportedNetworks.map(\n          function (card) {\n            return card.toUpperCase();\n          }\n        ),\n      },\n    };\n\n    if (configuration.authorizationType === \"TOKENIZATION_KEY\") {\n      data.paymentMethodTokenizationParameters.parameters[\n        \"braintree:clientKey\"\n      ] = configuration.authorization;\n    }\n\n    if (googleMerchantId) {\n      data.merchantId = googleMerchantId;\n    }\n\n    if (googlePayVersion) {\n      data.apiVersion = googlePayVersion;\n    }\n  }\n\n  return data;\n};\n\n},{\"./assign\":145}],173:[function(_dereq_,module,exports){\n\"use strict\";\n\n/**\n * @ignore\n * @static\n * @function hasMissingOption\n * @param {object} options All options provided for validating required properties.\n * @param {array} required A list of required inputs that must be included as part of the options.\n * @returns {boolean} Returns `true` if any required option is missing, `false` otherwise.\n */\nfunction hasMissingOption(options, required) {\n  var i, option;\n\n  required = required || [];\n\n  for (i = 0; i < required.length; i++) {\n    option = required[i];\n\n    if (!options.hasOwnProperty(option)) {\n      return true;\n    }\n  }\n\n  return false;\n}\n\nmodule.exports = hasMissingOption;\n\n},{}],174:[function(_dereq_,module,exports){\n\"use strict\";\n\nmodule.exports = function inIframe(win) {\n  win = win || window;\n\n  try {\n    return win.self !== win.top;\n    // eslint-disable-next-line no-unused-vars\n  } catch (err) {\n    return true;\n  }\n};\n\n},{}],175:[function(_dereq_,module,exports){\n\"use strict\";\n\nfunction convertDateStringToDate(dateString) {\n  var splitDate = dateString.split(\"-\");\n\n  return new Date(splitDate[0], splitDate[1], splitDate[2]);\n}\n\nfunction isDateStringBeforeOrOn(firstDate, secondDate) {\n  return (\n    convertDateStringToDate(firstDate) <= convertDateStringToDate(secondDate)\n  );\n}\n\nmodule.exports = isDateStringBeforeOrOn;\n\n},{}],176:[function(_dereq_,module,exports){\n\"use strict\";\n\nmodule.exports = function (creditCardDetails) {\n  return (\n    creditCardDetails &&\n    creditCardDetails.hasOwnProperty(\"fastlane\") &&\n    creditCardDetails.fastlane\n  );\n};\n\n},{}],177:[function(_dereq_,module,exports){\n\"use strict\";\n\nfunction isHTTPS(protocol) {\n  protocol = protocol || window.location.protocol;\n\n  return protocol === \"https:\";\n}\n\nmodule.exports = {\n  isHTTPS: isHTTPS,\n};\n\n},{}],178:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar parser;\nvar legalHosts = {\n  \"paypal.com\": 1,\n  \"braintreepayments.com\": 1,\n  \"braintreegateway.com\": 1,\n  \"braintree-api.com\": 1,\n};\n\n// endRemoveIf(production)\n\nfunction stripSubdomains(domain) {\n  return domain.split(\".\").slice(-2).join(\".\");\n}\n\nfunction isVerifiedDomain(url) {\n  var mainDomain;\n\n  url = url.toLowerCase();\n\n  if (!/^https:/.test(url)) {\n    return false;\n  }\n\n  parser = parser || document.createElement(\"a\");\n  parser.href = url;\n  mainDomain = stripSubdomains(parser.hostname);\n\n  return legalHosts.hasOwnProperty(mainDomain);\n}\n\nmodule.exports = isVerifiedDomain;\n\n},{}],179:[function(_dereq_,module,exports){\n\"use strict\";\n\nmodule.exports = function (value) {\n  return JSON.parse(JSON.stringify(value));\n};\n\n},{}],180:[function(_dereq_,module,exports){\n\"use strict\";\n\nmodule.exports = function (obj) {\n  return Object.keys(obj).filter(function (key) {\n    return typeof obj[key] === \"function\";\n  });\n};\n\n},{}],181:[function(_dereq_,module,exports){\n\"use strict\";\n\nfunction once(fn) {\n  var called = false;\n\n  return function () {\n    if (!called) {\n      called = true;\n      fn.apply(null, arguments);\n    }\n  };\n}\n\nmodule.exports = once;\n\n},{}],182:[function(_dereq_,module,exports){\n\"use strict\";\n\nfunction _notEmpty(obj) {\n  var key;\n\n  for (key in obj) {\n    if (obj.hasOwnProperty(key)) {\n      return true;\n    }\n  }\n\n  return false;\n}\n\nfunction _isArray(value) {\n  return (\n    (value &&\n      typeof value === \"object\" &&\n      typeof value.length === \"number\" &&\n      Object.prototype.toString.call(value) === \"[object Array]\") ||\n    false\n  );\n}\n\nfunction hasQueryParams(url) {\n  url = url || window.location.href;\n\n  return /\\?/.test(url);\n}\n\nfunction parse(url) {\n  var query, params;\n\n  url = url || window.location.href;\n\n  if (!hasQueryParams(url)) {\n    return {};\n  }\n\n  query = url.split(\"?\")[1] || \"\";\n  query = query.replace(/#.*$/, \"\").split(\"&\");\n\n  params = query.reduce(function (toReturn, keyValue) {\n    var parts = keyValue.split(\"=\");\n    var key = decodeURIComponent(parts[0]);\n    var value = decodeURIComponent(parts[1]);\n\n    toReturn[key] = value;\n\n    return toReturn;\n  }, {});\n\n  return params;\n}\n\nfunction stringify(params, namespace) {\n  var k, v, p;\n  var query = [];\n\n  for (p in params) {\n    if (!params.hasOwnProperty(p)) {\n      continue;\n    }\n\n    v = params[p];\n\n    if (namespace) {\n      if (_isArray(params)) {\n        k = namespace + \"[]\";\n      } else {\n        k = namespace + \"[\" + p + \"]\";\n      }\n    } else {\n      k = p;\n    }\n    if (typeof v === \"object\") {\n      query.push(stringify(v, k));\n    } else {\n      query.push(encodeURIComponent(k) + \"=\" + encodeURIComponent(v));\n    }\n  }\n\n  return query.join(\"&\");\n}\n\nfunction queryify(url, params) {\n  url = url || \"\";\n\n  if (params != null && typeof params === \"object\" && _notEmpty(params)) {\n    url += url.indexOf(\"?\") === -1 ? \"?\" : \"\";\n    url += url.indexOf(\"=\") !== -1 ? \"&\" : \"\";\n    url += stringify(params);\n  }\n\n  return url;\n}\n\nmodule.exports = {\n  parse: parse,\n  stringify: stringify,\n  queryify: queryify,\n  hasQueryParams: hasQueryParams,\n};\n\n},{}],183:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar uuid = _dereq_(\"@braintree/uuid\");\nvar findRootNode = _dereq_(\"./find-root-node\");\n\n// based on https://github.com/krakenjs/belter/blob/cdddc4f8ddb172d29db9e7e1ad1eeeacfb93e215/src/dom.js#L981-L1031\n// thanks @bluepnume\n\nfunction isShadowElement(element) {\n  element = findRootNode(element);\n\n  return element.toString() === \"[object ShadowRoot]\";\n}\n\nfunction getShadowHost(element) {\n  element = findRootNode(element);\n\n  if (!isShadowElement(element)) {\n    return null;\n  }\n\n  return element.host;\n}\n\nfunction transformToSlot(element, styles) {\n  var styleNode = findRootNode(element).querySelector(\"style\");\n  var shadowHost = getShadowHost(element);\n  var slotName = \"shadow-slot-\" + uuid();\n  var slot = document.createElement(\"slot\");\n  var slotProvider = document.createElement(\"div\");\n\n  slot.setAttribute(\"name\", slotName);\n  element.appendChild(slot);\n\n  slotProvider.setAttribute(\"slot\", slotName);\n  shadowHost.appendChild(slotProvider);\n\n  if (styles) {\n    if (!styleNode) {\n      styleNode = document.createElement(\"style\");\n      element.appendChild(styleNode);\n    }\n\n    styleNode.sheet.insertRule(\n      '::slotted([slot=\"' + slotName + '\"]) { ' + styles + \" }\"\n    );\n  }\n\n  if (isShadowElement(shadowHost)) {\n    return transformToSlot(slotProvider, styles);\n  }\n\n  return slotProvider;\n}\n\nmodule.exports = {\n  isShadowElement: isShadowElement,\n  getShadowHost: getShadowHost,\n  transformToSlot: transformToSlot,\n};\n\n},{\"./find-root-node\":159,\"@braintree/uuid\":39}],184:[function(_dereq_,module,exports){\n\"use strict\";\n\nmodule.exports = function (snakeString) {\n  if (snakeString.indexOf(\"_\") === -1) {\n    return snakeString;\n  }\n\n  return snakeString.toLowerCase().replace(/(\\_\\w)/g, function (match) {\n    return match[1].toUpperCase();\n  });\n};\n\n},{}],185:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar querystring = _dereq_(\"./querystring\");\n\nfunction getUrlParams() {\n  return querystring.parse(window.location.href);\n}\n\nmodule.exports = {\n  getUrlParams: getUrlParams,\n};\n\n},{\"./querystring\":182}],186:[function(_dereq_,module,exports){\n\"use strict\";\n\nfunction useMin(isDebug) {\n  return isDebug ? \"\" : \".min\";\n}\n\nmodule.exports = useMin;\n\n},{}],187:[function(_dereq_,module,exports){\n\"use strict\";\n\n// NEXT_MAJOR_VERSION old versions of IE don't have atob, in the\n// next major version, we're dropping support for those versions\n// so we can eliminate the need to have this atob polyfill\nvar atobNormalized = typeof atob === \"function\" ? atob : atobPolyfill;\n\nfunction atobPolyfill(base64String) {\n  var a, b, c, b1, b2, b3, b4, i;\n  var base64Matcher =\n    /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{4})([=]{1,2})?$/;\n  var characters =\n    \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";\n  var result = \"\";\n\n  if (!base64Matcher.test(base64String)) {\n    throw new Error(\"Non base64 encoded input passed to window.atob polyfill\");\n  }\n\n  i = 0;\n  do {\n    b1 = characters.indexOf(base64String.charAt(i++));\n    b2 = characters.indexOf(base64String.charAt(i++));\n    b3 = characters.indexOf(base64String.charAt(i++));\n    b4 = characters.indexOf(base64String.charAt(i++));\n\n    a = ((b1 & 0x3f) << 2) | ((b2 >> 4) & 0x3);\n    b = ((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf);\n    c = ((b3 & 0x3) << 6) | (b4 & 0x3f);\n\n    result +=\n      String.fromCharCode(a) +\n      (b ? String.fromCharCode(b) : \"\") +\n      (c ? String.fromCharCode(c) : \"\");\n  } while (i < base64String.length);\n\n  return result;\n}\n\nmodule.exports = {\n  atob: function (base64String) {\n    return atobNormalized.call(window, base64String);\n  },\n  _atob: atobPolyfill,\n};\n\n},{}],188:[function(_dereq_,module,exports){\n\"use strict\";\n\nmodule.exports = {\n  REQUIRED_OPTIONS_FOR_START_PAYMENT: [\n    \"givenName\",\n    \"surname\",\n    \"currencyCode\",\n    \"paymentType\",\n    \"amount\",\n    \"fallback\",\n  ],\n  REQUIRED_OPTIONS_FOR_PAY_UPON_INVOICE_PAYMENT_TYPE: [\n    \"givenName\",\n    \"surname\",\n    \"currencyCode\",\n    \"onPaymentStart\",\n    \"paymentType\",\n    \"amount\",\n    \"address\",\n    \"billingAddress\",\n    \"birthDate\",\n    \"email\",\n    \"locale\",\n    \"customerServiceInstructions\",\n    \"correlationId\",\n    \"phone\",\n    \"phoneCountryCode\",\n    \"lineItems\",\n  ],\n  REQUIRED_OPTIONS_FOR_ADDRESS: [\n    \"streetAddress\",\n    \"locality\",\n    \"postalCode\",\n    \"countryCode\",\n  ],\n  REQUIRED_OPTIONS_FOR_LINE_ITEMS: [\n    \"category\",\n    \"name\",\n    \"quantity\",\n    \"unitAmount\",\n    \"unitTaxAmount\",\n  ],\n  REQUIRED_OPTIONS_FOR_BLIK_SEAMLESS_PAYMENT_TYPE: [\n    \"givenName\",\n    \"surname\",\n    \"currencyCode\",\n    \"paymentType\",\n    \"amount\",\n  ],\n  REQUIRED_OPTIONS_FOR_BLIK_OPTIONS_LEVEL_0: [\"authCode\"],\n  REQUIRED_OPTIONS_FOR_BLIK_OPTIONS_ONE_CLICK_FIRST: [\n    \"authCode\",\n    \"consumerReference\",\n    \"aliasLabel\",\n  ],\n  REQUIRED_OPTIONS_FOR_BLIK_OPTIONS_ONE_CLICK_SUBSEQUENT: [\n    \"consumerReference\",\n    \"aliasKey\",\n  ],\n};\n\n},{}],189:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar BraintreeError = _dereq_(\"../../lib/braintree-error\");\nvar errors = _dereq_(\"../shared/errors\");\n\n/**\n * Injects a QR code image into a specified container element.\n * @function\n * @param {string} base64Data The base64 encoded QR code image data.\n * @param {(string|HTMLElement)} container A CSS selector string or HTML element to inject the QR code into.\n * @returns {HTMLImageElement} The created image element containing the QR code.\n * @throws {BraintreeError} Throws an error if the container is invalid or base64 data is invalid.\n */\nfunction injectQrCode(base64Data, container) {\n  var containerElement, imageElement;\n  var base64regex =\n    /^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/;\n\n  if (\n    !base64Data ||\n    typeof base64Data !== \"string\" ||\n    !base64regex.test(base64Data)\n  ) {\n    throw new BraintreeError(errors.LOCAL_PAYMENT_QR_CODE_INVALID_DATA);\n  }\n\n  if (typeof container === \"string\") {\n    containerElement = document.querySelector(container);\n    if (!containerElement) {\n      throw new BraintreeError({\n        type: BraintreeError.types.MERCHANT,\n        code: \"LOCAL_PAYMENT_QR_CODE_CONTAINER_NOT_FOUND\",\n        message: \"QR code container element not found: \" + container,\n      });\n    }\n  } else if (container && container.nodeType === Node.ELEMENT_NODE) {\n    containerElement = container;\n  } else {\n    throw new BraintreeError(errors.LOCAL_PAYMENT_QR_CODE_INVALID_CONTAINER);\n  }\n\n  containerElement.innerHTML = \"\";\n\n  imageElement = document.createElement(\"img\");\n  imageElement.src = \"data:image/png;base64,\" + base64Data;\n  imageElement.alt = \"QR Code for payment\";\n  imageElement.style.display = \"block\";\n  imageElement.style.maxWidth = \"100%\";\n  imageElement.style.height = \"auto\";\n\n  containerElement.appendChild(imageElement);\n\n  return imageElement;\n}\n\nmodule.exports = injectQrCode;\n\n},{\"../../lib/braintree-error\":148,\"../shared/errors\":193}],190:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar frameService = _dereq_(\"../../lib/frame-service/external\");\nvar BraintreeError = _dereq_(\"../../lib/braintree-error\");\nvar useMin = _dereq_(\"../../lib/use-min\");\nvar VERSION = \"3.134.0\";\nvar INTEGRATION_TIMEOUT_MS =\n  _dereq_(\"../../lib/constants\").INTEGRATION_TIMEOUT_MS;\nvar analytics = _dereq_(\"../../lib/analytics\");\nvar methods = _dereq_(\"../../lib/methods\");\nvar convertMethodsToError = _dereq_(\"../../lib/convert-methods-to-error\");\nvar convertToBraintreeError = _dereq_(\"../../lib/convert-to-braintree-error\");\nvar ExtendedPromise = _dereq_(\"@braintree/extended-promise\");\nvar querystring = _dereq_(\"../../lib/querystring\");\nvar wrapPromise = _dereq_(\"@braintree/wrap-promise\");\nvar constants = _dereq_(\"./constants\");\nvar errors = _dereq_(\"../shared/errors\");\nvar assign = _dereq_(\"../../lib/assign\").assign;\nvar inIframe = _dereq_(\"../../lib/in-iframe\");\nvar isMobileDevice = _dereq_(\"../shared/browser-detection\");\nvar injectQrCode = _dereq_(\"./inject-qr-code\");\n\nvar DEFAULT_WINDOW_WIDTH = 1282;\nvar DEFAULT_WINDOW_HEIGHT = 720;\n\nExtendedPromise.suppressUnhandledPromiseMessage = true;\n\n/**\n * @class\n * @param {object} options see {@link module:braintree-web/local-payment.create|local-payment.create}\n * @classdesc This class represents a LocalPayment component. Instances of this class can open a LocalPayment window for paying with alternate payments local to a specific country. Any additional UI, such as disabling the page while authentication is taking place, is up to the developer.\n *\n * @description <strong>Do not use this constructor directly. Use {@link module:braintree-web/local-payment.create|braintree-web.local-payment.create} instead.</strong>\n */\nfunction LocalPayment(options) {\n  this._client = options.client;\n  this._assetsUrl =\n    options.client.getConfiguration().gatewayConfiguration.assetsUrl +\n    \"/web/\" +\n    VERSION;\n  this._isDebug = options.client.getConfiguration().isDebug;\n  this._loadingFrameUrl =\n    this._assetsUrl +\n    \"/html/local-payment-landing-frame\" +\n    useMin(this._isDebug) +\n    \".html\";\n  this._authorizationInProgress = false;\n  this._paymentType = \"unknown\";\n  this._merchantAccountId = options.merchantAccountId;\n  if (options.redirectUrl) {\n    this._redirectUrl = options.redirectUrl;\n    this._isRedirectFlow = true;\n  }\n}\n\nLocalPayment.prototype._initialize = function () {\n  var self = this;\n  var client = this._client;\n  var failureTimeout = setTimeout(function () {\n    analytics.sendEvent(client, \"local-payment.load.timed-out\");\n  }, INTEGRATION_TIMEOUT_MS);\n\n  return new Promise(function (resolve) {\n    frameService.create(\n      {\n        name: \"localpaymentlandingpage\",\n        dispatchFrameUrl:\n          self._assetsUrl +\n          \"/html/dispatch-frame\" +\n          useMin(self._isDebug) +\n          \".html\",\n        openFrameUrl: self._loadingFrameUrl,\n      },\n      function (service) {\n        self._frameService = service;\n        clearTimeout(failureTimeout);\n        analytics.sendEvent(client, \"local-payment.load.succeeded\");\n        resolve(self);\n      }\n    );\n  });\n};\n\n/**\n * Options used for most local payment types.\n * @typedef {object} LocalPayment~StartPaymentOptions\n * @property {object} fallback Configuration for what to do when app switching back from a Bank app on a mobile device. Only applicable to the popup flow.\n * @property {string} fallback.buttonText The text to display in a button to redirect back to the merchant page.\n * @property {string} fallback.url The url to redirect to when the redirect button is pressed. Query params will be added to the url to process the data returned from the bank.\n * @property {string} fallback.cancelButtonText The text to display in a button to redirect back to the merchant page when the customer cancels. If no `cancelButtonText` is provided, `buttonText` will be used.\n * @property {string} fallback.cancelUrl The url to redirect to when the redirect button is pressed when the customer cancels. Query params will be added to the url to check the state of the payment. If no `cancelUrl` is provided, `url` will be used.\n * @property {object} [windowOptions] The options for configuring the window that is opened when starting the payment. Only applicable to the popup flow.\n * @property {number} [windowOptions.width=1282] The width in pixels of the window opened when starting the payment. The default width size is this large to allow various banking partner landing pages to display the QR Code to be scanned by the bank's mobile app. Many will not display the QR code when the window size is smaller than a standard desktop screen.\n * @property {number} [windowOptions.height=720] The height in pixels of the window opened when starting the payment.\n * @property {string} amount The amount to authorize for the transaction.\n * @property {string} currencyCode The currency to process the payment (three-character ISO-4217).\n * @property {string} [displayName] The merchant name displayed inside of the window that is opened when starting the payment.\n * @property {string} paymentType The type of local payment. See https://developer.paypal.com/braintree/docs/guides/local-payment-methods/client-side-custom\n * @property {string} paymentTypeCountryCode The country code of the local payment. This value must be one of the supported country codes for a given local payment type listed {@link https://developer.paypal.com/braintree/docs/guides/local-payment-methods/client-side-custom/javascript/v3#render-local-payment-method-buttons|here}. For local payments supported in multiple countries, this value may determine which banks are presented to the customer.\n * @property {string} email Payer email of the customer.\n * @property {string} givenName First name of the customer.\n * @property {string} surname Last name of the customer.\n * @property {string} phone Phone number of the customer.\n * @property {boolean} recurrent Enable recurrent payment.\n * @property {string} customerId The customer's id in merchant's system (required for recurrent payments).\n * @property {boolean} shippingAddressRequired Indicates whether or not the payment needs to be shipped. For digital goods, this should be false. Defaults to false.\n * @property {object} address The shipping address.\n * @property {string} address.streetAddress Line 1 of the Address (eg. number, street, etc). An error will occur if this address is not valid.\n * @property {string} address.extendedAddress Line 2 of the Address (eg. suite, apt #, etc.). An error will occur if this address is not valid.\n * @property {string} address.locality Customer's city.\n * @property {string} address.region Customer's region or state.\n * @property {string} address.postalCode Customer's postal code.\n * @property {string} address.countryCode Customer's country code (two-character ISO 3166-1 code).\n * @property {function} onPaymentStart A function that will be called with two parameters: an object containing the  `paymentId` and a `continueCallback` that must be called to launch the flow. You can use method to do any preprocessing on your server before the flow begins..\n */\n\n/**\n * Options used for the Swish local payment type.\n * @typedef {object} LocalPayment~StartPaymentSwishOptions\n * @property {string} amount The amount to authorize for the transaction.\n * @property {string} currencyCode The currency to process the payment (three-character ISO-4217).\n * @property {string} [displayName] The merchant name displayed inside of the window that is opened when starting the payment.\n * @property {string} paymentType The type of local payment. Must be `swish`.\n * @property {string} paymentTypeCountryCode The country code of the local payment. Must be `SE` for Swish payments.\n * @property {string} email Payer email of the customer.\n * @property {string} givenName First name of the customer.\n * @property {string} surname Last name of the customer.\n * @property {string} phone Phone number of the customer.\n * @property {object} [swishOptions] Swish-specific options.\n * @property {boolean} [swishOptions.requestQrCode=false] For non-mobile devices, whether to use QR code data from the response with the intent of rendering the QR code on your page instead of following the standard redirect flow. Note: When using this option, it is important to store data.paymentId on your server so it can be mapped to a webhook sent by Braintree once the buyer completes their payment.\n * @property {(string|HTMLElement)} swishOptions.qrContainer Required when `swishOptions.requestQrCode` is set to `true`. A CSS selector string or HTML element where the QR code image will be automatically injected.\n * @property {string} swishOptions.returnUrl Required when using Swish Standard flow on mobile devices. The URL where users will be redirected after completing the Swish payment.\n * @property {function} [onPaymentStart] A function that will be called with an object containing the `paymentId`.\n */\n\n/**\n * Options used for the Pay Upon Invoice local payment type.\n * @typedef {object} LocalPayment~StartPaymentPayUponInvoiceOptions\n * @property {string} amount The amount to authorize for the transaction.\n * @property {string} currencyCode The currency to process the payment (three-character ISO-4217).\n * @property {string} [displayName] The merchant name displayed inside of the window that is opened when starting the payment.\n * @property {string} paymentType The type of local payment. Must be `pay_upon_invoice`.\n * @property {string} [paymentTypeCountryCode] The country code of the local payment. This value must be one of the supported country codes for a given local payment type listed {@link https://developer.paypal.com/braintree/docs/guides/local-payment-methods/client-side-custom/javascript/v3#render-local-payment-method-buttons|here}. For local payments supported in multiple countries, this value may determine which banks are presented to the customer.\n * @property {string} email Payer email of the customer.\n * @property {string} givenName First name of the customer.\n * @property {string} surname Last name of the customer.\n * @property {string} phone Phone number of the customer.\n * @property {string} phoneCountryCode The country calling code.\n * @property {string} birthDate The birth date of the customer in `YYYY-MM-DD` format.\n * @property {object} address The shipping address.\n * @property {string} address.streetAddress Line 1 of the Address (eg. number, street, etc). An error will occur if this address is not valid.\n * @property {string} [address.extendedAddress] Line 2 of the Address (eg. suite, apt #, etc.). An error will occur if this address is not valid.\n * @property {string} address.locality Customer's city.\n * @property {string} [address.region] Customer's region or state.\n * @property {string} address.postalCode Customer's postal code.\n * @property {string} address.countryCode Customer's country code (two-character ISO 3166-1 code).\n * @property {string} [shippingAmount] The shipping fee for all items. This value can not be a negative number.\n * @property {string} [discountAmount] The discount for all items. This value can not be a negative number.\n * @property {object} billingAddress The billing address.\n * @property {string} billingAddress.streetAddress Line 1 of the Address (eg. number, street, etc). An error will occur if this address is not valid.\n * @property {string} [billingAddress.extendedAddress] Line 2 of the Address (eg. suite, apt #, etc.). An error will occur if this address is not valid.\n * @property {string} billingAddress.locality Customer's city.\n * @property {string} [billingAddress.region] Customer's region or state.\n * @property {string} billingAddress.postalCode Customer's postal code.\n * @property {string} billingAddress.countryCode Customer's country code (two-character ISO 3166-1 code).\n * @property {object[]} lineItems List of line items.\n * @property {string} lineItems.category The item category type: `'DIGITAL_GOODS'`, `'PHYSICAL_GOODS'`, or `'DONATION'`.\n * @property {string} lineItems.name Item name. Maximum 127 characters.\n * @property {string} lineItems.quantity Number of units of the item purchased. This value must be a whole number and can't be negative or zero.\n * @property {string} lineItems.unitAmount Per-unit price of the item. Can include up to 2 decimal places. This value can't be negative or zero.\n * @property {string} lineItems.unitTaxAmount Per-unit tax price of the item. Can include up to 2 decimal places. This value can't be negative.\n * @property {string} locale The BCP 47-formatted locale. PayPal supports a five-character code. For example, `en-DE`, `da-DK`, `he-IL`, `id-ID`, `ja-JP`, `no-NO`, `pt-BR`, `ru-RU`, `sv-SE`, `th-TH`, `zh-CN`, `zh-HK`, or `zh-TW`.\n * @property {string} customerServiceInstructions Instructions for how to contact the merchant's customer service. Maximum 4,000 characters.\n * @property {string} correlationId Used to correlate user sessions with server transactions.\n * @property {function} onPaymentStart A function that will be called with an object containing the `paymentId`. The `continueCallback` is not provided as it is not needed for this use case.\n */\n\n/**\n * Options used for the seamless/oneclick BLIK local payment type.\n * @typedef {object} LocalPayment~StartPaymentOptions\n * @property {string} amount The amount to authorize for the transaction.\n * @property {string} currencyCode The currency to process the payment (three-character ISO-4217).\n * @property {string} [displayName] The merchant name displayed inside of the window that is opened when starting the payment.\n * @property {string} paymentType The type of local payment. Must be `blik`.\n * @property {string} paymentTypeCountryCode The country code of the local payment. This value must be one of the supported country codes for a given local payment type listed {@link https://developer.paypal.com/braintree/docs/guides/local-payment-methods/client-side-custom/javascript/v3#render-local-payment-method-buttons|here}. For local payments supported in multiple countries, this value may determine which banks are presented to the customer.\n * @property {string} email Payer email of the customer.\n * @property {string} givenName First name of the customer.\n * @property {string} surname Last name of the customer.\n * @property {string} phone Phone number of the customer.\n * @property {boolean} shippingAddressRequired Indicates whether or not the payment needs to be shipped. For digital goods, this should be false. Defaults to false.\n * @property {object} address The shipping address.\n * @property {string} address.streetAddress Line 1 of the Address (eg. number, street, etc). An error will occur if this address is not valid.\n * @property {string} address.extendedAddress Line 2 of the Address (eg. suite, apt #, etc.). An error will occur if this address is not valid.\n * @property {string} address.locality Customer's city.\n * @property {string} address.region Customer's region or state.\n * @property {string} address.postalCode Customer's postal code.\n * @property {string} address.countryCode Customer's country code (two-character ISO 3166-1 code).\n * @property {object} blikOptions Blik seamless/oneclick specific options. Should contain only one object: `level_0` or `oneClick`.\n * @property {object} blikOptions.level_0 Blik seamless specific options.\n * @property {string} blikOptions.level_0.authCode 6-digit code used to authenticate a consumer within BLIK.\n * @property {object} blikOptions.oneClick Blik oneclick specific options.\n * @property {string} blikOptions.oneClick.authCode 6-digit code used to authenticate a consumer within BLIK.\n * @property {string} blikOptions.oneClick.consumerReference The merchant generated, unique reference serving as a primary identifier for accounts connected between Blik and a merchant.\n * @property {string} blikOptions.oneClick.aliasLabel A bank defined identifier used as a display name to allow the payer to differentiate between multiple registered bank accounts.\n * @property {string} blikOptions.oneClick.aliasKey A Blik-defined identifier for a specific Blik-enabled bank account that is associated with a given merchant. Used only in conjunction with a Consumer Reference.\n * @property {function} onPaymentStart A function that will be called with an object containing the `paymentId`. The `continueCallback` is not provided as it is not needed for this use case.\n */\n\n/**\n * Launches the local payment flow and returns a nonce payload. Only one local payment flow should be active at a time. One way to achieve this is to disable your local payment button while the flow is open.\n * @public\n * @function\n * @param {LocalPayment~StartPaymentOptions|LocalPayment~StartPaymentPayUponInvoiceOptions|LocalPayment~StartPaymentSwishOptions} options Options for initiating the local payment payment flow.\n * @param {callback} callback The second argument, <code>data</code>, is a {@link LocalPayment~startPaymentPayload|startPaymentPayload}. If no callback is provided, the method will return a Promise that resolves with a {@link LocalPayment~startPaymentPayload|startPaymentPayload}.\n * @returns {(Promise|void)} Returns a promise if no callback is provided.\n * @example\n * localPaymentInstance.startPayment({\n *   paymentType: 'ideal',\n *   paymentTypeCountryCode: 'NL',\n *   fallback: {\n *     buttonText: 'Return to Merchant',\n *     url: 'https://example.com/my-checkout-page'\n *   },\n *   amount: '10.00',\n *   currencyCode: 'EUR',\n *   givenName: 'Joe',\n *   surname: 'Doe',\n *   address: {\n *     countryCode: 'NL'\n *   },\n *   onPaymentStart: function (data, continueCallback) {\n *     // Do any preprocessing before starting the flow\n *     // data.paymentId is the ID of the localPayment\n *     continueCallback();\n *   }\n * }).then(function (payload) {\n *   // Submit payload.nonce to your server\n * }).catch(function (startPaymentError) {\n *   // Handle flow errors or premature flow closure\n *   console.error('Error!', startPaymentError);\n * });\n * @example <caption>Pay Upon Invoice</caption>\n * localPaymentInstance.startPayment({\n *   paymentType: 'pay_upon_invoice',\n *   amount: '100.00',\n *   currencyCode: 'EUR',\n *   givenName: 'Max',\n *   surname: 'Mustermann',\n *   address: { // This is used as the shipping address.\n *     streetAddress: 'Taunusanlage 12',\n *     locality: 'Frankfurt',\n *     postalCode: '60325',\n *     countryCode: 'DE',\n *   },\n *   billingAddress: {\n *     streetAddress: 'Schönhauser Allee 84',\n *     locality: 'Berlin',\n *     postalCode: '10439',\n *     countryCode: 'DE'\n *   },\n *   birthDate: '1990-01-01',\n *   email: 'buyer@example.com',\n *   locale: 'en-DE',\n *   customerServiceInstructions: 'Customer service phone is +49 6912345678.',\n *   lineItems: [{\n *     category: 'PHYSICAL_GOODS',\n *     name: 'Basketball Shoes',\n *     quantity: '1',\n *     unitAmount: '81.00',\n *     unitTaxAmount: '19.00',\n *   }],\n *   phone: '6912345678',\n *   phoneCountryCode: '49',\n *   correlationId: correlationId,\n *   onPaymentStart: function (data) {\n *     // NOTE: It is critical here to store data.paymentId on your server\n *     //       so it can be mapped to a webhook sent by Braintree once the\n *     //       buyer completes their payment.\n *     console.log('Payment ID:', data.paymentId);\n *   },\n * }).catch(function (err) {\n *   // Handle any error calling startPayment.\n *   console.error(err);\n * });\n * @example <caption>BLIK seamless</caption>\n * localPaymentInstance.startPayment({\n *   paymentType: 'blik',\n *   paymentTypeCountryCode: 'PL',\n *   amount: '10.00',\n *   currencyCode: 'PLN',\n *   givenName: 'Joe',\n *   surname: 'Doe',\n *   phone: '1234566789',\n *   address: {\n *     streetAddress: 'Mokotowska 1234',\n *     locality: 'Warsaw',\n *     postalCode: '02-697',\n *     countryCode: 'PL',\n *   },\n *   blikOptions: {\n *     level_0: {\n *       authCode: \"123456\",\n *     },\n *   },\n *   onPaymentStart: function (data) {\n *     // NOTE: It is critical here to store data.paymentId on your server\n *     //       so it can be mapped to a webhook sent by Braintree once the\n *     //       buyer completes their payment.\n *     console.log('Payment ID:', data.paymentId);\n *   },\n * }).catch(function (err) {\n *   // Handle any error calling startPayment.\n *   console.error(err);\n * });\n * @example <caption>BLIK oneclick first payment</caption>\n * localPaymentInstance.startPayment({\n *   paymentType: 'blik',\n *   paymentTypeCountryCode: 'PL',\n *   amount: '10.00',\n *   currencyCode: 'PLN',\n *   givenName: 'Joe',\n *   surname: 'Doe',\n *   phone: '1234566789',\n *   address: {\n *     streetAddress: 'Mokotowska 1234',\n *     locality: 'Warsaw',\n *     postalCode: '02-697',\n *     countryCode: 'PL',\n *   },\n *   blikOptions: {\n *     oneClick: {\n *       authCode: \"123456\",\n *       consumerReference: \"ABCde123\",\n *       aliasLabel: \"my uniq alias\",\n *     },\n *   },\n *   onPaymentStart: function (data) {\n *     // NOTE: It is critical here to store data.paymentId on your server\n *     //       so it can be mapped to a webhook sent by Braintree once the\n *     //       buyer completes their payment.\n *     console.log('Payment ID:', data.paymentId);\n *   },\n * }).catch(function (err) {\n *   // Handle any error calling startPayment.\n *   console.error(err);\n * });\n * @example <caption>BLIK oneclick subsequent payment</caption>\n * localPaymentInstance.startPayment({\n *   paymentType: 'blik',\n *   paymentTypeCountryCode: 'PL',\n *   amount: '10.00',\n *   currencyCode: 'PLN',\n *   givenName: 'Joe',\n *   surname: 'Doe',\n *   phone: '1234566789',\n *   address: {\n *     streetAddress: 'Mokotowska 1234',\n *     locality: 'Warsaw',\n *     postalCode: '02-697',\n *     countryCode: 'PL',\n *   },\n *   blikOptions: {\n *     oneClick: {\n *       consumerReference: \"ABCde123\",\n *       aliasKey: \"123456789\",\n *     },\n *   },\n *   onPaymentStart: function (data) {\n *     // NOTE: It is critical here to store data.paymentId on your server\n *     //       so it can be mapped to a webhook sent by Braintree once the\n *     //       buyer completes their payment.\n *     console.log('Payment ID:', data.paymentId);\n *   },\n * }).catch(function (err) {\n *   // Handle any error calling startPayment.\n *   console.error(err);\n * });\n * @example <caption>MB WAY</caption>\n * localPaymentInstance.startPayment({\n *   paymentType: 'mbway',\n *   amount: '10.00',\n *   currencyCode: 'EUR',\n *   givenName: 'Joe',\n *   surname: 'Doe',\n *   phone: '1234566789',\n *   phoneCountryCode: '351'\n *   address: {\n *     streetAddress: 'Rua Escura 12',\n *     locality: 'Porto',\n *     postalCode: '4465-283',\n *     countryCode: 'PT',\n *   },\n *   onPaymentStart: function (data) {\n *     // NOTE: It is critical here to store data.paymentId on your server\n *     //       so it can be mapped to a webhook sent by Braintree once the\n *     //       buyer completes their payment.\n *     console.log('Payment ID:', data.paymentId);\n *   },\n * }).catch(function (err) {\n *   // Handle any error calling startPayment.\n *   console.error(err);\n * });\n * @example <caption>BANCOMAT PAY</caption>\n * localPaymentInstance.startPayment({\n *   paymentType: 'bancomatpay',\n *   amount: '10.00',\n *   currencyCode: 'EUR',\n *   givenName: 'Joe',\n *   surname: 'Doe',\n *   phone: '1234566789',\n *   phoneCountryCode: '49'\n *   address: {\n *     streetAddress: 'Via del Corso 12',\n *     locality: 'Roma',\n *     postalCode: '00100',\n *     countryCode: 'IT',\n *   },\n *   onPaymentStart: function (data) {\n *     // NOTE: It is critical here to store data.paymentId on your server\n *     //       so it can be mapped to a webhook sent by Braintree once the\n *     //       buyer completes their payment.\n *     console.log('Payment ID:', data.paymentId);\n *   },\n * }).catch(function (err) {\n *   // Handle any error calling startPayment.\n *   console.error(err);\n * });\n * @example <caption>Swish with QR Code (for desktop)</caption>\n * localPaymentInstance.startPayment({\n *   paymentType: 'swish',\n *   paymentTypeCountryCode: 'SE',\n *   amount: '10.00',\n *   currencyCode: 'SEK',\n *   givenName: 'Joe',\n *   surname: 'Doe',\n *   phone: '1234566789',\n *   email: 'joe.doe@example.com',\n *   swishOptions: {\n *     requestQrCode: true,\n *     qrContainer: '#qr-code-container' // QR code will be automatically injected here\n *   },\n *   onPaymentStart: function (data) {\n *     console.log('Payment ID:', data.paymentId);\n *     // QR code is already displayed in the container\n *   },\n * }).catch(function (err) {\n *   // Handle any error calling startPayment.\n *   console.error(err);\n * });\n * @example <caption>Swish with redirect</caption>\n * localPaymentInstance.startPayment({\n *   paymentType: 'swish',\n *   paymentTypeCountryCode: 'SE',\n *   amount: '10.00',\n *   currencyCode: 'SEK',\n *   givenName: 'Joe',\n *   surname: 'Doe',\n *   phone: '1234566789',\n *   email: 'joe.doe@example.com',\n *   swishOptions: {\n *     returnUrl: 'https://example.com/return'\n *   },\n *   fallback: {\n *     buttonText: 'Return to Store',\n *     url: 'https://example.com/my-checkout-page'\n *   },\n *   onPaymentStart: function (data, continueCallback) {\n *     // On desktop, this follows standard redirect flow\n *     console.log('Payment ID:', data.paymentId);\n *     continueCallback();\n *   }\n * }).then(function (payload) {\n *   // Submit payload.nonce to your server\n * }).catch(function (err) {\n *   // Handle any error calling startPayment.\n *   console.error(err);\n * });\n */\n// eslint-disable-next-line complexity\nLocalPayment.prototype.startPayment = function (options) {\n  var missingOption,\n    missingError,\n    address,\n    fallback,\n    params,\n    promise,\n    billingAddress,\n    windowOptions,\n    onPaymentStartPromise,\n    serviceId,\n    cancelUrl,\n    returnUrl;\n  var self = this;\n\n  if (self._isRedirectFlow) {\n    options.redirectUrl = self._redirectUrl;\n  } else {\n    serviceId = self._frameService._serviceId;\n  }\n  // In order to provide the merchant with appropriate error messaging,\n  // more robust validation is being done on the client-side, since some\n  // option names are mapped to legacy names for the sake of the API.\n  // For example, if `billingAddress.streetAddress` was missing, then\n  // the API error response would say that `billing_address.line1` was\n  // missing. This client-side validation will correctly tell the\n  // merchant that `billingAddress.streetAddress` was missing.\n  missingOption = hasMissingOption(options);\n  if (missingOption) {\n    missingError = new BraintreeError(\n      errors.LOCAL_PAYMENT_START_PAYMENT_MISSING_REQUIRED_OPTION\n    );\n    if (typeof missingOption === \"string\") {\n      missingError.details = \"Missing required '\" + missingOption + \"' option.\";\n    }\n\n    return Promise.reject(missingError);\n  }\n\n  if (\n    options.paymentType &&\n    options.paymentType.toLowerCase() === \"swish\" &&\n    options.swishOptions &&\n    options.swishOptions.requestQrCode\n  ) {\n    if (isMobileDevice.isMobileDevice()) {\n      return Promise.reject(\n        new BraintreeError(errors.LOCAL_PAYMENT_QR_CODE_NOT_SUPPORTED)\n      );\n    }\n    if (!options.swishOptions.qrContainer) {\n      return Promise.reject(\n        new BraintreeError(\n          errors.LOCAL_PAYMENT_START_PAYMENT_MISSING_REQUIRED_OPTION\n        )\n      );\n    }\n  }\n\n  windowOptions = options.windowOptions || {};\n  address = options.address || {};\n  fallback = options.fallback || {};\n  billingAddress = options.billingAddress || {};\n  params = {\n    amount: options.amount,\n    billingAddress: {\n      line1: billingAddress.streetAddress,\n      line2: billingAddress.extendedAddress,\n      city: billingAddress.locality,\n      state: billingAddress.region,\n      postalCode: billingAddress.postalCode,\n      countryCode: billingAddress.countryCode,\n    },\n    birthDate: options.birthDate,\n    blikOptions: options.blikOptions,\n    city: address.locality,\n    correlationId: options.correlationId,\n    countryCode: address.countryCode,\n    currencyIsoCode: options.currencyCode,\n    discountAmount: options.discountAmount,\n    experienceProfile: {\n      brandName: options.displayName,\n      customerServiceInstructions: options.customerServiceInstructions,\n      locale: options.locale,\n      noShipping: !options.shippingAddressRequired,\n    },\n    firstName: options.givenName,\n    fundingSource: options.paymentType,\n    intent: \"sale\",\n    lastName: options.surname,\n    line1: address.streetAddress,\n    line2: address.extendedAddress,\n    lineItems: options.lineItems,\n    merchantAccountId: self._merchantAccountId,\n    merchantOrPartnerCustomerId: options.customerId,\n    payerEmail: options.email,\n    paymentTypeCountryCode: options.paymentTypeCountryCode,\n    phone: options.phone,\n    phoneCountryCode: options.phoneCountryCode,\n    postalCode: address.postalCode,\n    recurrent: options.recurrent,\n    shippingAmount: options.shippingAmount,\n    state: address.region,\n  };\n\n  self._paymentType = options.paymentType.toLowerCase();\n\n  if (self._paymentType === \"swish\") {\n    if (isMobileDevice.isMobileDevice()) {\n      params.redirectToApp = true;\n      self._isRedirectFlow = true; // Set to true to trigger app switch for Swish\n    }\n  }\n\n  if (self._isRedirectFlow) {\n    if (\n      self._paymentType === \"swish\" &&\n      options.swishOptions &&\n      options.swishOptions.returnUrl &&\n      isMobileDevice.isMobileDevice()\n    ) {\n      cancelUrl = querystring.queryify(options.swishOptions.returnUrl, {\n        wasCanceled: true,\n      });\n      returnUrl = options.swishOptions.returnUrl;\n    } else {\n      cancelUrl = querystring.queryify(self._redirectUrl, {\n        wasCanceled: true,\n      });\n      returnUrl = self._redirectUrl;\n    }\n  } else {\n    cancelUrl = querystring.queryify(\n      self._assetsUrl +\n        \"/html/local-payment-redirect-frame\" +\n        useMin(self._isDebug) +\n        \".html\",\n      {\n        channel: serviceId,\n        r: fallback.cancelUrl || fallback.url,\n        t: fallback.cancelButtonText || fallback.buttonText,\n        c: 1, // indicating we went through the cancel flow\n      }\n    );\n    returnUrl = querystring.queryify(\n      self._assetsUrl +\n        \"/html/local-payment-redirect-frame\" +\n        useMin(self._isDebug) +\n        \".html\",\n      {\n        channel: serviceId,\n        r: fallback.url,\n        t: fallback.buttonText,\n      }\n    );\n  }\n\n  assign(params, { cancelUrl: cancelUrl, returnUrl: returnUrl });\n\n  if (self._authorizationInProgress && !self._isRedirectFlow) {\n    analytics.sendEvent(\n      self._client,\n      self._paymentType + \".local-payment.start-payment.error.already-opened\"\n    );\n\n    return Promise.reject(\n      new BraintreeError(errors.LOCAL_PAYMENT_ALREADY_IN_PROGRESS)\n    );\n  }\n\n  self._authorizationInProgress = true;\n\n  promise = new ExtendedPromise();\n\n  // For deferred payment types, the popup window should not be opened,\n  // since the actual payment will be done outside of this session.\n  if (!isDeferredPaymentTypeOptions(options) && !self._isRedirectFlow) {\n    self._startPaymentCallback = self._createStartPaymentCallback(\n      function (val) {\n        promise.resolve(val);\n      },\n      function (err) {\n        promise.reject(err);\n      }\n    );\n\n    self._frameService.open(\n      {\n        width: windowOptions.width || DEFAULT_WINDOW_WIDTH,\n        height: windowOptions.height || DEFAULT_WINDOW_HEIGHT,\n      },\n      self._startPaymentCallback\n    );\n  }\n\n  self._client\n    .request({\n      method: \"post\",\n      endpoint: \"local_payments/create\",\n      data: params,\n    })\n    .then(function (response) {\n      var redirectUrl = response.paymentResource.redirectUrl;\n\n      if (self._isRedirectFlow) {\n        analytics.sendEvent(\n          self._client,\n          self._paymentType + \".local-payment.start-payment.redirected\"\n        );\n      } else {\n        analytics.sendEvent(\n          self._client,\n          self._paymentType + \".local-payment.start-payment.opened\"\n        );\n      }\n      self._startPaymentOptions = options;\n\n      if (isSwishQrFlow(options, response, self._paymentType)) {\n        self._authorizationInProgress = false;\n\n        try {\n          injectQrCode(\n            response.paymentResource.qrDetails.qrImage,\n            options.swishOptions.qrContainer\n          );\n        } catch (injectError) {\n          return promise.reject(injectError);\n        }\n\n        if (typeof options.onPaymentStart === \"function\") {\n          onPaymentStartPromise = options.onPaymentStart({\n            paymentId: response.paymentResource.paymentToken,\n          });\n\n          if (onPaymentStartPromise instanceof Promise) {\n            onPaymentStartPromise\n              .then(function () {\n                promise.resolve();\n              })\n              .catch(function (error) {\n                promise.reject(error);\n              });\n          } else {\n            promise.resolve();\n          }\n        } else {\n          promise.resolve();\n        }\n      } else if (isDeferredPaymentTypeOptions(options)) {\n        self._authorizationInProgress = false;\n\n        if (typeof redirectUrl === \"string\" && redirectUrl.length) {\n          promise.reject(\n            new BraintreeError(\n              errors.LOCAL_PAYMENT_START_PAYMENT_DEFERRED_PAYMENT_FAILED\n            )\n          );\n        } else {\n          onPaymentStartPromise = options.onPaymentStart({\n            paymentId: response.paymentResource.paymentToken,\n          });\n\n          if (onPaymentStartPromise instanceof Promise) {\n            onPaymentStartPromise\n              .then(function () {\n                promise.resolve();\n              })\n              .catch(function (error) {\n                promise.reject(error);\n              });\n          } else {\n            promise.resolve();\n          }\n        }\n      } else if (typeof options.onPaymentStart === \"function\") {\n        Promise.resolve(\n          options.onPaymentStart(\n            { paymentId: response.paymentResource.paymentToken },\n            function () {\n              if (!self._isRedirectFlow) {\n                self._frameService.redirect(redirectUrl);\n              }\n            }\n          )\n        ).then(function () {\n          if (self._isRedirectFlow) {\n            self._redirectToPaymentResource(redirectUrl);\n            promise.resolve();\n          }\n        });\n      } else if (self._isRedirectFlow) {\n        self._redirectToPaymentResource(redirectUrl);\n\n        promise.resolve();\n      } else if (!self._isRedirectFlow) {\n        self._frameService.redirect(redirectUrl);\n      }\n\n      return promise;\n    })\n    .catch(function (err) {\n      var status = err.details && err.details.httpStatus;\n\n      if (!self._isRedirectFlow) {\n        self._frameService.close();\n      }\n      self._authorizationInProgress = false;\n\n      if (status === 422) {\n        promise.reject(\n          new BraintreeError({\n            type: errors.LOCAL_PAYMENT_INVALID_PAYMENT_OPTION.type,\n            code: errors.LOCAL_PAYMENT_INVALID_PAYMENT_OPTION.code,\n            message: errors.LOCAL_PAYMENT_INVALID_PAYMENT_OPTION.message,\n            details: {\n              originalError: err,\n            },\n          })\n        );\n\n        return;\n      }\n\n      promise.reject(\n        convertToBraintreeError(err, {\n          type: errors.LOCAL_PAYMENT_START_PAYMENT_FAILED.type,\n          code: errors.LOCAL_PAYMENT_START_PAYMENT_FAILED.code,\n          message: errors.LOCAL_PAYMENT_START_PAYMENT_FAILED.message,\n        })\n      );\n    });\n\n  return promise;\n};\n\nLocalPayment.prototype._redirectToPaymentResource = function (redirectUrl) {\n  if (inIframe()) {\n    window.top.location.href = redirectUrl;\n  } else {\n    window.location.href = redirectUrl;\n  }\n};\n\n/**\n * Manually tokenizes params for a local payment received from PayPal.When app switching back from a mobile application (such as a bank application for an iDEAL payment), the window may lose context with the parent page. In that case, a fallback url is used, and this method can be used to finish the flow.\n * @public\n * @function\n * @param {object} [params] All options for tokenizing local payment parameters. If no params are passed in, the params will be pulled off of the query string of the page.\n * @param {string} params.btLpToken The token representing the local payment. Aliased to `token` if `btLpToken` is not present.\n * @param {string} params.btLpPaymentId The payment id for the local payment. Aliased to `paymentId` if `btLpPaymentId` is not present.\n * @param {string} params.btLpPayerId The payer id for the local payment. Aliased to `PayerID` if `btLpPayerId` is not present.\n * @param {callback} [callback] The second argument, <code>data</code>, is a {@link LocalPayment~startPaymentPayload|startPaymentPayload}. If no callback is provided, the method will return a Promise that resolves with a {@link LocalPayment~startPaymentPayload|startPaymentPayload}.\n * @example\n * localPaymentInstance.tokenize().then(function (payload) {\n *   // send payload.nonce to your server\n * }).catch(function (err) {\n *   // handle tokenization error\n * });\n * @returns {(Promise|void)} Returns a promise if no callback is provided.\n */\nLocalPayment.prototype.tokenize = function (params) {\n  var self = this;\n  var client = this._client;\n\n  params = params || querystring.parse();\n\n  // iOS Safari parses query params by adding the params inside an object called: queryItems\n  if (params.queryItems) {\n    params = params.queryItems;\n  }\n\n  if (params.c || params.wasCanceled) {\n    return Promise.reject(\n      new BraintreeError({\n        type: errors.LOCAL_PAYMENT_CANCELED.type,\n        code: errors.LOCAL_PAYMENT_CANCELED.code,\n        message: errors.LOCAL_PAYMENT_CANCELED.message,\n        details: {\n          originalError: {\n            errorcode: params.errorcode,\n            token: params.btLpToken,\n          },\n        },\n      })\n    );\n  }\n  if (params.errorcode) {\n    return Promise.reject(\n      new BraintreeError({\n        type: errors.LOCAL_PAYMENT_START_PAYMENT_FAILED.type,\n        code: errors.LOCAL_PAYMENT_START_PAYMENT_FAILED.code,\n        message: errors.LOCAL_PAYMENT_START_PAYMENT_FAILED.message,\n        details: {\n          originalError: {\n            errorcode: params.errorcode,\n            token: params.btLpToken,\n          },\n        },\n      })\n    );\n  }\n\n  return client\n    .request({\n      endpoint: \"payment_methods/paypal_accounts\",\n      method: \"post\",\n      data: this._formatTokenizeData(params),\n    })\n    .then(function (response) {\n      var payload = self._formatTokenizePayload(response);\n\n      if (window.popupBridge) {\n        analytics.sendEvent(\n          client,\n          self._paymentType + \".local-payment.tokenization.success-popupbridge\"\n        );\n      } else {\n        analytics.sendEvent(\n          client,\n          self._paymentType + \".local-payment.tokenization.success\"\n        );\n      }\n\n      return payload;\n    })\n    .catch(function (err) {\n      analytics.sendEvent(\n        client,\n        self._paymentType + \".local-payment.tokenization.failed\"\n      );\n\n      return Promise.reject(\n        convertToBraintreeError(err, {\n          type: errors.LOCAL_PAYMENT_TOKENIZATION_FAILED.type,\n          code: errors.LOCAL_PAYMENT_TOKENIZATION_FAILED.code,\n          message: errors.LOCAL_PAYMENT_TOKENIZATION_FAILED.message,\n        })\n      );\n    });\n};\n\n/**\n * Closes the LocalPayment window if it is open.\n * @public\n * @example\n * localPaymentInstance.closeWindow();\n * @returns {void}\n */\nLocalPayment.prototype.closeWindow = function () {\n  if (this._authoriztionInProgress) {\n    analytics.sendEvent(\n      this._client,\n      this._paymentType + \".local-payment.start-payment.closed.by-merchant\"\n    );\n  }\n  this._frameService.close();\n};\n\n/**\n * Focuses the LocalPayment window if it is open.\n * @public\n * @example\n * localPaymentInstance.focusWindow();\n * @returns {void}\n */\nLocalPayment.prototype.focusWindow = function () {\n  this._frameService.focus();\n};\n\nLocalPayment.prototype._createStartPaymentCallback = function (\n  resolve,\n  reject\n) {\n  var self = this;\n  var client = this._client;\n\n  return function (err, params) {\n    self._authorizationInProgress = false;\n    if (err) {\n      if (err.code === \"FRAME_SERVICE_FRAME_CLOSED\") {\n        if (params && params.errorcode === \"processing_error\") {\n          // something failed within the payment window (rather than when\n          // tokenizing with Braintree)\n          analytics.sendEvent(\n            client,\n            self._paymentType + \".local-payment.failed-in-window\"\n          );\n          reject(new BraintreeError(errors.LOCAL_PAYMENT_START_PAYMENT_FAILED));\n\n          return;\n        }\n\n        // its possible to have a query param with errorcode=payment_error, which\n        // indicates that the customer cancelled the flow from within the UI,\n        // but as there's no meaningful difference to the merchant whether the\n        // customer closes via the UI or by manually closing the window, we\n        // don't differentiate these\n        analytics.sendEvent(\n          client,\n          self._paymentType + \".local-payment.tokenization.closed.by-user\"\n        );\n        reject(new BraintreeError(errors.LOCAL_PAYMENT_WINDOW_CLOSED));\n      } else if (\n        err.code &&\n        err.code.indexOf(\"FRAME_SERVICE_FRAME_OPEN_FAILED\") > -1\n      ) {\n        reject(\n          new BraintreeError({\n            code: errors.LOCAL_PAYMENT_WINDOW_OPEN_FAILED.code,\n            type: errors.LOCAL_PAYMENT_WINDOW_OPEN_FAILED.type,\n            message: errors.LOCAL_PAYMENT_WINDOW_OPEN_FAILED.message,\n            details: {\n              originalError: err,\n            },\n          })\n        );\n      }\n    } else if (params) {\n      if (!window.popupBridge) {\n        self._frameService.redirect(self._loadingFrameUrl);\n      }\n      self\n        .tokenize(params)\n        .then(resolve)\n        .catch(reject)\n        .then(function () {\n          self._frameService.close();\n        });\n    }\n  };\n};\n\nLocalPayment.prototype._formatTokenizePayload = function (response) {\n  var payload;\n  var account = {};\n\n  if (response.paypalAccounts) {\n    account = response.paypalAccounts[0];\n  }\n\n  payload = {\n    nonce: account.nonce,\n    details: {},\n    type: account.type,\n  };\n\n  if (account.details) {\n    if (account.details.payerInfo) {\n      payload.details = account.details.payerInfo;\n    }\n    if (account.details.correlationId) {\n      payload.correlationId = account.details.correlationId;\n    }\n  }\n\n  return payload;\n};\n\n/**\n * Checks if required tokenization parameters are available in querystring for manual tokenization requests.\n * @public\n * @function\n * @example\n * // if query string contains\n * // ?btLpToken=token&btLpPaymentId=payment-id&btLpPayerId=payer-id\n * localPaymentInstance.hasTokenizationParams(); // true\n *\n * // if query string has token: (full page redirect flow)\n * // ?token=abcdefg123456789\n * localPaymentInstance.hasTokenizationParams(); // true\n *\n * // if query string is missing required params\n * localPaymentInstance.hasTokenizationParams(); // false\n *\n * if (localPaymentInstance.hasTokenizationParams()) {\n *   localPaymentInstance.tokenize();\n * }\n * @returns {Boolean} Returns a Boolean value for the state of the query string.\n */\nLocalPayment.prototype.hasTokenizationParams = function () {\n  var params = querystring.parse();\n\n  if (params.errorcode || params.token) {\n    return true;\n  }\n\n  return Boolean(\n    params.btLpToken && params.btLpPaymentId && params.btLpPayerId\n  );\n};\n\nLocalPayment.prototype._formatTokenizeData = function (params) {\n  var clientConfiguration = this._client.getConfiguration();\n  var gatewayConfiguration = clientConfiguration.gatewayConfiguration;\n  var data = {\n    merchantAccountId: this._merchantAccountId,\n    paypalAccount: {\n      correlationId: params.btLpToken || params.token,\n      paymentToken: params.btLpPaymentId || params.paymentId,\n      payerId: params.btLpPayerId || params.PayerID,\n      unilateral: gatewayConfiguration.paypal.unvettedMerchant,\n      intent: \"sale\",\n    },\n  };\n\n  return data;\n};\n\n// Some payment types are deferred. Meaning, the actual payment will\n// occur at a later time outside of this session. For example, with\n// Pay Upon Invoice, the customer will later receive an email that will\n// be used to make the actual payment through RatePay. This function\n// will return `true` if the given options contain `paymentType` of\n// a deferred payment type; and/or some payments, like blik, may have\n// specific extra options to be treated as deferred. Otherwise, it\n// will return `false`.\nfunction isDeferredPaymentTypeOptions(options) {\n  var blikOptions = options.blikOptions || {};\n  var paymentType =\n    typeof options.paymentType === \"string\"\n      ? options.paymentType.toLowerCase()\n      : options.paymentType;\n\n  if (paymentType === \"blik\") {\n    return (\n      blikOptions.hasOwnProperty(\"level_0\") ||\n      blikOptions.hasOwnProperty(\"oneClick\")\n    );\n  }\n\n  if (\n    paymentType === \"swish\" &&\n    options.swishOptions &&\n    options.swishOptions.requestQrCode\n  ) {\n    return true;\n  }\n\n  return [\"pay_upon_invoice\", \"mbway\", \"bancomatpay\"].includes(paymentType);\n}\n\nfunction hasMissingAddressOption(options) {\n  var i, option;\n\n  for (i = 0; i < constants.REQUIRED_OPTIONS_FOR_ADDRESS.length; i++) {\n    option = constants.REQUIRED_OPTIONS_FOR_ADDRESS[i];\n    if (!options.hasOwnProperty(option)) {\n      return option;\n    }\n  }\n\n  return false;\n}\n\nfunction hasMissingLineItemsOption(items) {\n  var i, j, item, option;\n\n  for (j = 0; j < items.length; j++) {\n    item = items[j];\n    for (i = 0; i < constants.REQUIRED_OPTIONS_FOR_LINE_ITEMS.length; i++) {\n      option = constants.REQUIRED_OPTIONS_FOR_LINE_ITEMS[i];\n      if (!item.hasOwnProperty(option)) {\n        return option;\n      }\n    }\n  }\n\n  return false;\n}\n\nfunction hasMissingBlikOptions(options) {\n  var i, option, oneClick;\n  var blikOptions = options.blikOptions || {};\n\n  if (!options.redirectUrl) {\n    constants.REQUIRED_OPTIONS_FOR_BLIK_SEAMLESS_PAYMENT_TYPE.push(\n      \"onPaymentStart\"\n    );\n  }\n\n  for (\n    i = 0;\n    i < constants.REQUIRED_OPTIONS_FOR_BLIK_SEAMLESS_PAYMENT_TYPE.length;\n    i++\n  ) {\n    option = constants.REQUIRED_OPTIONS_FOR_BLIK_SEAMLESS_PAYMENT_TYPE[i];\n    if (!options.hasOwnProperty(option)) {\n      return option;\n    }\n  }\n\n  if (blikOptions.hasOwnProperty(\"level_0\")) {\n    for (\n      i = 0;\n      i < constants.REQUIRED_OPTIONS_FOR_BLIK_OPTIONS_LEVEL_0.length;\n      i++\n    ) {\n      option = constants.REQUIRED_OPTIONS_FOR_BLIK_OPTIONS_LEVEL_0[i];\n\n      if (!blikOptions.level_0.hasOwnProperty(option)) {\n        return \"blikOptions.level_0.\" + option;\n      }\n    }\n  } else if (blikOptions.hasOwnProperty(\"oneClick\")) {\n    oneClick = blikOptions.oneClick || {};\n\n    if (oneClick.hasOwnProperty(\"aliasKey\")) {\n      for (\n        i = 0;\n        i <\n        constants.REQUIRED_OPTIONS_FOR_BLIK_OPTIONS_ONE_CLICK_SUBSEQUENT.length;\n        i++\n      ) {\n        option =\n          constants.REQUIRED_OPTIONS_FOR_BLIK_OPTIONS_ONE_CLICK_SUBSEQUENT[i];\n\n        if (!oneClick.hasOwnProperty(option)) {\n          return \"blikOptions.oneClick.\" + option;\n        }\n      }\n    } else {\n      for (\n        i = 0;\n        i < constants.REQUIRED_OPTIONS_FOR_BLIK_OPTIONS_ONE_CLICK_FIRST.length;\n        i++\n      ) {\n        option = constants.REQUIRED_OPTIONS_FOR_BLIK_OPTIONS_ONE_CLICK_FIRST[i];\n\n        if (!oneClick.hasOwnProperty(option)) {\n          return \"blikOptions.oneClick.\" + option;\n        }\n      }\n    }\n  }\n\n  return false;\n}\n\nfunction hasMissingSwishOptions(options) {\n  var i, option;\n  var swishOptions = options.swishOptions || {};\n  var requiredSwishOptions = [\n    \"givenName\",\n    \"surname\",\n    \"currencyCode\",\n    \"paymentType\",\n    \"amount\",\n  ];\n\n  for (i = 0; i < requiredSwishOptions.length; i++) {\n    option = requiredSwishOptions[i];\n    if (!options.hasOwnProperty(option)) {\n      return option;\n    }\n  }\n\n  // If requestQrCode is true, qrContainer is required\n  if (swishOptions.requestQrCode && !swishOptions.qrContainer) {\n    return \"swishOptions.qrContainer\";\n  }\n\n  if (\n    !swishOptions.requestQrCode &&\n    !swishOptions.returnUrl &&\n    !options.redirectUrl &&\n    isMobileDevice.isMobileDevice()\n  ) {\n    return \"swishOptions.returnUrl\";\n  }\n\n  return false;\n}\n\nfunction isSwishQrFlow(options, response, paymentType) {\n  if (\n    paymentType === \"swish\" &&\n    options.swishOptions &&\n    options.swishOptions.requestQrCode &&\n    response.paymentResource.qrDetails &&\n    response.paymentResource.qrDetails.qrImage\n  ) {\n    return true;\n  }\n  return false;\n}\n\n// This will return the name of the first missing required option that\n// is found or `true` if `options` itself is not defined. Otherwise, it\n// will return `false`.\n// eslint-disable-next-line complexity\nfunction hasMissingOption(options) {\n  var i, option, missingAddressOption, missingLineItemOption, paymentType;\n\n  if (!options) {\n    return true;\n  }\n\n  paymentType = options.paymentType || \"\";\n\n  if (paymentType.toLowerCase() === \"swish\") {\n    return hasMissingSwishOptions(options);\n  }\n  if (isDeferredPaymentTypeOptions(options)) {\n    if (paymentType.toLowerCase() === \"pay_upon_invoice\") {\n      for (\n        i = 0;\n        i < constants.REQUIRED_OPTIONS_FOR_PAY_UPON_INVOICE_PAYMENT_TYPE.length;\n        i++\n      ) {\n        option =\n          constants.REQUIRED_OPTIONS_FOR_PAY_UPON_INVOICE_PAYMENT_TYPE[i];\n        if (!options.hasOwnProperty(option)) {\n          return option;\n        }\n        if (option === \"address\" || option === \"billingAddress\") {\n          missingAddressOption = hasMissingAddressOption(options[option]);\n          if (missingAddressOption) {\n            return option + \".\" + missingAddressOption;\n          }\n        } else if (option === \"lineItems\") {\n          missingLineItemOption = hasMissingLineItemsOption(options[option]);\n          if (missingLineItemOption) {\n            return option + \".\" + missingLineItemOption;\n          }\n        }\n      }\n    } else if (paymentType.toLowerCase() === \"blik\") {\n      return hasMissingBlikOptions(options);\n    }\n  } else {\n    if (!options.redirectUrl) {\n      constants.REQUIRED_OPTIONS_FOR_START_PAYMENT.push(\"onPaymentStart\");\n    }\n\n    for (i = 0; i < constants.REQUIRED_OPTIONS_FOR_START_PAYMENT.length; i++) {\n      option = constants.REQUIRED_OPTIONS_FOR_START_PAYMENT[i];\n\n      if (!options.hasOwnProperty(option)) {\n        return option;\n      }\n    }\n\n    if (!options.fallback.url) {\n      return \"fallback.url\";\n    }\n    if (!options.fallback.buttonText) {\n      return \"fallback.buttonText\";\n    }\n    if (options.recurrent === true && !options.customerId) {\n      return \"customerId\";\n    }\n  }\n\n  return false;\n}\n\n/**\n * Cleanly remove anything set up by {@link module:braintree-web/local-payment.create|create}.\n * @public\n * @param {callback} [callback] Called on completion.\n * @example\n * localPaymentInstance.teardown();\n * @example <caption>With callback</caption>\n * localPaymentInstance.teardown(function () {\n *   // teardown is complete\n * });\n * @returns {(Promise|void)} Returns a promise if no callback is provided.\n */\nLocalPayment.prototype.teardown = function () {\n  var self = this;\n\n  if (!self._isRedirectFlow) {\n    self._frameService.teardown();\n  }\n\n  convertMethodsToError(self, methods(LocalPayment.prototype));\n\n  analytics.sendEvent(self._client, \"local-payment.teardown-completed\");\n\n  return Promise.resolve();\n};\n\nmodule.exports = wrapPromise.wrapPrototype(LocalPayment);\n\n},{\"../../lib/analytics\":143,\"../../lib/assign\":145,\"../../lib/braintree-error\":148,\"../../lib/constants\":149,\"../../lib/convert-methods-to-error\":150,\"../../lib/convert-to-braintree-error\":151,\"../../lib/frame-service/external\":162,\"../../lib/in-iframe\":174,\"../../lib/methods\":180,\"../../lib/querystring\":182,\"../../lib/use-min\":186,\"../shared/browser-detection\":192,\"../shared/errors\":193,\"./constants\":188,\"./inject-qr-code\":189,\"@braintree/extended-promise\":34,\"@braintree/wrap-promise\":43}],191:[function(_dereq_,module,exports){\n\"use strict\";\n/**\n * @module braintree-web/local-payment\n * @description A component to integrate with local payment methods. *This component is currently in beta and is subject to change.*\n */\n\nvar analytics = _dereq_(\"../lib/analytics\");\nvar basicComponentVerification = _dereq_(\"../lib/basic-component-verification\");\nvar createDeferredClient = _dereq_(\"../lib/create-deferred-client\");\nvar createAssetsUrl = _dereq_(\"../lib/create-assets-url\");\nvar LocalPayment = _dereq_(\"./external/local-payment\");\nvar VERSION = \"3.134.0\";\nvar wrapPromise = _dereq_(\"@braintree/wrap-promise\");\nvar BraintreeError = _dereq_(\"../lib/braintree-error\");\nvar errors = _dereq_(\"./shared/errors\");\nvar parse = _dereq_(\"../lib/querystring\").parse;\n\n/**\n * @static\n * @function create\n * @param {object} options Creation options:\n * @param {Client} [options.client] A {@link Client} instance.\n * @param {string} [options.authorization] A tokenizationKey or clientToken. Can be used in place of `options.client`.\n * @param {string} [options.merchantAccountId] A non-default merchant account ID to use for tokenization and creation of the authorizing transaction. Braintree strongly recommends specifying this parameter.\n * @param {string} [options.redirectUrl] When provided, triggers full page redirect flow instead of popup flow.\n * @param {callback} callback The second argument, `data`, is the {@link LocalPayment} instance.\n * @example <caption>Using the local payment component to set up an iDEAL button</caption>\n * var idealButton = document.querySelector('.ideal-button');\n *\n * braintree.client.create({\n *   authorization: CLIENT_AUTHORIZATION\n * }, function (clientErr, clientInstance) {\n *   if (clientErr) {\n *     console.error('Error creating client:', clientErr);\n *     return;\n *   }\n *\n *   braintree.localPayment.create({\n *     client: clientInstance,\n *     merchantAccountId: 'merchantAccountEUR',\n *   }, function (localPaymentErr, localPaymentInstance) {\n *     if (localPaymentErr) {\n *       console.error('Error creating local payment component:', localPaymentErr);\n *       return;\n *     }\n *\n *     idealButton.removeAttribute('disabled');\n *\n *     // When the button is clicked, attempt to start the payment flow.\n *     idealButton.addEventListener('click', function (event) {\n *       // Because this opens a popup, this has to be called as a result of\n *       // customer action, like clicking a button. You cannot call this at any time.\n *       localPaymentInstance.startPayment({\n *         paymentType: 'ideal',\n *         amount: '10.67',\n *         city: 'Den Haag',\n *         countryCode: 'NL',\n *         firstName: 'Test',\n *         lastName: 'McTester',\n *         line1: '123 of 456 Fake Lane',\n *         line2: 'Apartment 789',\n *         payerEmail: 'payer@example.com',\n *         phone: '123456789',\n *         postalCode: '1234 AA',\n *         currencyCode: 'EUR',\n *         onPaymentStart: function (data, continueCallback) {\n *           // Do any preprocessing to store the ID and setup webhook\n *           // Call start to initiate the popup\n *           continueCallback();\n *         }\n **       }, function (startPaymentErr, payload) {\n *         if (startPaymentErr) {\n *           if (startPaymentErr.type !== 'CUSTOMER') {\n *             console.error('Error starting payment:', startPaymentErr);\n *           }\n *           return;\n *         }\n *\n *         idealButton.setAttribute('disabled', true);\n *\n *         console.log(payload.paymentId);\n *       });\n *     }, false);\n *   });\n * });\n * @returns {(Promise|void)} Returns a promise if no callback is provided.\n */\nfunction create(options) {\n  var name = \"Local Payment\";\n\n  return basicComponentVerification\n    .verify({\n      name: name,\n      client: options.client,\n      authorization: options.authorization,\n    })\n    .then(function () {\n      return createDeferredClient.create({\n        authorization: options.authorization,\n        client: options.client,\n        debug: options.debug,\n        assetsUrl: createAssetsUrl.create(options.authorization),\n        name: name,\n      });\n    })\n    .then(function (client) {\n      var localPaymentInstance, params;\n      var config = client.getConfiguration();\n\n      options.client = client;\n\n      if (config.gatewayConfiguration.paypalEnabled !== true) {\n        return Promise.reject(\n          new BraintreeError(errors.LOCAL_PAYMENT_NOT_ENABLED)\n        );\n      }\n\n      analytics.sendEvent(client, \"local-payment.initialized\");\n\n      localPaymentInstance = new LocalPayment(options);\n      if (options.redirectUrl) {\n        params = parse(window.location.href);\n\n        if (params.token || params.wasCanceled) {\n          return localPaymentInstance\n            .tokenize(params)\n            .then(function (payload) {\n              localPaymentInstance.tokenizePayload = payload;\n\n              return localPaymentInstance;\n            })\n            .catch(function (err) {\n              console.log(\"Error while tokenizing: \", err); // eslint-disable-line no-console\n\n              return localPaymentInstance;\n            });\n        }\n\n        return localPaymentInstance;\n      }\n\n      return localPaymentInstance._initialize();\n    });\n}\n\nmodule.exports = {\n  create: wrapPromise(create),\n  /**\n   * @description The current version of the SDK, i.e. `{@pkg version}`.\n   * @type {string}\n   */\n  VERSION: VERSION,\n};\n\n},{\"../lib/analytics\":143,\"../lib/basic-component-verification\":146,\"../lib/braintree-error\":148,\"../lib/create-assets-url\":152,\"../lib/create-deferred-client\":154,\"../lib/querystring\":182,\"./external/local-payment\":190,\"./shared/errors\":193,\"@braintree/wrap-promise\":43}],192:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar isAndroid = _dereq_(\"@braintree/browser-detection/is-android\");\nvar isIos = _dereq_(\"@braintree/browser-detection/is-ios\");\n\nfunction isMobileDevice() {\n  return isAndroid() || isIos();\n}\n\nmodule.exports = {\n  isMobileDevice: isMobileDevice,\n};\n\n},{\"@braintree/browser-detection/is-android\":22,\"@braintree/browser-detection/is-ios\":30}],193:[function(_dereq_,module,exports){\n\"use strict\";\n\n/**\n * @name BraintreeError.LocalPayment - Creation Error Codes\n * @description Errors that occur when [creating the Local Payment component](./module-braintree-web_local-payment.html#.create).\n * @property {MERCHANT} LOCAL_PAYMENT_NOT_ENABLED Occurs when Local Payment is not enabled on the Braintree control panel.\n */\n\n/**\n * @name BraintreeError.LocalPayment - startPayment Error Codes\n * @description Errors that occur when using the [`startPayment` method](./LocalPayment.html#startPayment).\n * @property {MERCHANT} LOCAL_PAYMENT_START_PAYMENT_MISSING_REQUIRED_OPTION Occurs when a startPayment is missing a required option.\n * @property {MERCHANT} LOCAL_PAYMENT_ALREADY_IN_PROGRESS Occurs when a startPayment call is already in progress.\n * @property {MERCHANT} LOCAL_PAYMENT_INVALID_PAYMENT_OPTION Occurs when a startPayment call has an invalid option.\n * @property {NETWORK} LOCAL_PAYMENT_START_PAYMENT_FAILED Occurs when a startPayment call fails.\n * @property {NETWORK} LOCAL_PAYMENT_TOKENIZATION_FAILED Occurs when a startPayment call fails to tokenize the result from authorization.\n * @property {CUSTOMER} LOCAL_PAYMENT_CANCELED Occurs when the customer cancels the Local Payment.\n * @property {CUSTOMER} LOCAL_PAYMENT_WINDOW_CLOSED Occurs when the customer closes the Local Payment window.\n * @property {MERCHANT} LOCAL_PAYMENT_WINDOW_OPEN_FAILED Occurs when the Local Payment window fails to open. Usually because `startPayment` was not called as a direct result of a user action.\n * @property {MERCHANT} LOCAL_PAYMENT_QR_CODE_INVALID_DATA Occurs when QR code data is not a valid base64 string.\n * @property {MERCHANT} LOCAL_PAYMENT_QR_CODE_CONTAINER_NOT_FOUND Occurs when the specified QR code container element cannot be found.\n * @property {MERCHANT} LOCAL_PAYMENT_QR_CODE_INVALID_CONTAINER Occurs when the QR code container is not a valid CSS selector string or HTML element.\n */\n\nvar BraintreeError = _dereq_(\"../../lib/braintree-error\");\n\nmodule.exports = {\n  LOCAL_PAYMENT_NOT_ENABLED: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"LOCAL_PAYMENT_NOT_ENABLED\",\n    message: \"LocalPayment is not enabled for this merchant.\",\n  },\n  LOCAL_PAYMENT_ALREADY_IN_PROGRESS: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"LOCAL_PAYMENT_ALREADY_IN_PROGRESS\",\n    message: \"LocalPayment payment is already in progress.\",\n  },\n  LOCAL_PAYMENT_CANCELED: {\n    type: BraintreeError.types.CUSTOMER,\n    code: \"LOCAL_PAYMENT_CANCELED\",\n    message: \"Customer canceled the LocalPayment before authorizing.\",\n  },\n  LOCAL_PAYMENT_WINDOW_CLOSED: {\n    type: BraintreeError.types.CUSTOMER,\n    code: \"LOCAL_PAYMENT_WINDOW_CLOSED\",\n    message: \"Customer closed LocalPayment window before authorizing.\",\n  },\n  LOCAL_PAYMENT_WINDOW_OPEN_FAILED: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"LOCAL_PAYMENT_WINDOW_OPEN_FAILED\",\n    message:\n      \"LocalPayment window failed to open; make sure startPayment was called in response to a user action.\",\n  },\n  LOCAL_PAYMENT_START_PAYMENT_FAILED: {\n    type: BraintreeError.types.NETWORK,\n    code: \"LOCAL_PAYMENT_START_PAYMENT_FAILED\",\n    message: \"LocalPayment startPayment failed.\",\n  },\n  LOCAL_PAYMENT_START_PAYMENT_MISSING_REQUIRED_OPTION: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"LOCAL_PAYMENT_START_PAYMENT_MISSING_REQUIRED_OPTION\",\n    message: \"Missing required option for startPayment.\",\n  },\n  LOCAL_PAYMENT_START_PAYMENT_DEFERRED_PAYMENT_FAILED: {\n    type: BraintreeError.types.UNKNOWN,\n    code: \"LOCAL_PAYMENT_START_PAYMENT_DEFERRED_PAYMENT_FAILED\",\n    message: \"LocalPayment startPayment deferred payment failed.\",\n  },\n  LOCAL_PAYMENT_TOKENIZATION_FAILED: {\n    type: BraintreeError.types.NETWORK,\n    code: \"LOCAL_PAYMENT_TOKENIZATION_FAILED\",\n    message: \"Could not tokenize user's local payment method.\",\n  },\n  LOCAL_PAYMENT_INVALID_PAYMENT_OPTION: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"LOCAL_PAYMENT_INVALID_PAYMENT_OPTION\",\n    message: \"Local payment options are invalid.\",\n  },\n  LOCAL_PAYMENT_QR_CODE_INVALID_DATA: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"LOCAL_PAYMENT_QR_CODE_INVALID_DATA\",\n    message: \"QR code data must be a valid base64 string.\",\n  },\n  LOCAL_PAYMENT_QR_CODE_CONTAINER_NOT_FOUND: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"LOCAL_PAYMENT_QR_CODE_CONTAINER_NOT_FOUND\",\n    message: \"QR code container element not found.\",\n  },\n  LOCAL_PAYMENT_QR_CODE_INVALID_CONTAINER: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"LOCAL_PAYMENT_QR_CODE_INVALID_CONTAINER\",\n    message:\n      \"QR code container must be a valid CSS selector string or HTML element.\",\n  },\n  LOCAL_PAYMENT_QR_CODE_NOT_SUPPORTED: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"LOCAL_PAYMENT_QR_CODE_NOT_SUPPORTED\",\n    message: \"QR code is only supported on desktop devices.\",\n  },\n};\n\n},{\"../../lib/braintree-error\":148}],194:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar frameService = _dereq_(\"../../lib/frame-service/external\");\nvar BraintreeError = _dereq_(\"../../lib/braintree-error\");\nvar errors = _dereq_(\"../shared/errors\");\nvar VERSION = \"3.134.0\";\nvar methods = _dereq_(\"../../lib/methods\");\nvar wrapPromise = _dereq_(\"@braintree/wrap-promise\");\nvar analytics = _dereq_(\"../../lib/analytics\");\nvar convertMethodsToError = _dereq_(\"../../lib/convert-methods-to-error\");\nvar convertToBraintreeError = _dereq_(\"../../lib/convert-to-braintree-error\");\nvar constants = _dereq_(\"../shared/constants\");\n\nvar INTEGRATION_TIMEOUT_MS =\n  _dereq_(\"../../lib/constants\").INTEGRATION_TIMEOUT_MS;\n\n/**\n * Masterpass Address object.\n * @typedef {object} Masterpass~Address\n * @property {string} countryCodeAlpha2 The customer's country code.\n * @property {string} extendedAddress The customer's extended address.\n * @property {string} locality The customer's locality.\n * @property {string} postalCode The customer's postal code.\n * @property {string} region The customer's region.\n * @property {string} streetAddress The customer's street address.\n */\n\n/**\n * @typedef {object} Masterpass~tokenizePayload\n * @property {string} nonce The payment method nonce.\n * @property {string} description The human readable description.\n * @property {string} type The payment method type, always `MasterpassCard`.\n * @property {object} details Additional account details.\n * @property {string} details.cardType Type of card, ex: Visa, MasterCard.\n * @property {string} details.lastFour Last four digits of card number.\n * @property {string} details.lastTwo Last two digits of card number.\n * @property {object} contact The customer's contact information.\n * @property {string} contact.firstName The customer's first name.\n * @property {string} contact.lastName The customer's last name.\n * @property {string} contact.phoneNumber The customer's phone number.\n * @property {string} contact.emailAddress The customer's email address.\n * @property {Masterpass~Address} billingAddress The customer's billing address.\n * @property {Masterpass~Address} shippingAddress The customer's shipping address.\n * @property {object} binData Information about the card based on the bin.\n * @property {string} binData.commercial Possible values: 'Yes', 'No', 'Unknown'.\n * @property {string} binData.countryOfIssuance The country of issuance.\n * @property {string} binData.debit Possible values: 'Yes', 'No', 'Unknown'.\n * @property {string} binData.durbinRegulated Possible values: 'Yes', 'No', 'Unknown'.\n * @property {string} binData.healthcare Possible values: 'Yes', 'No', 'Unknown'.\n * @property {string} binData.issuingBank The issuing bank.\n * @property {string} binData.payroll Possible values: 'Yes', 'No', 'Unknown'.\n * @property {string} binData.prepaid Possible values: 'Yes', 'No', 'Unknown'.\n * @property {string} binData.productId The product id.\n * @property {string} binData.business Possible values: 'Yes', 'No', 'Unknown'.\n * @property {string} binData.consumer Possible values: 'Yes', 'No', 'Unknown'.\n * @property {string} binData.purchase Possible values: 'Yes', 'No', 'Unknown'.\n * @property {string} binData.corporate Possible values: 'Yes', 'No', 'Unknown'.\n */\n\n/**\n * @class\n * @param {object} options see {@link module:braintree-web/masterpass.create|masterpass.create}\n * @description <strong>You cannot use this constructor directly. Use {@link module:braintree-web/masterpass.create|braintree.masterpass.create} instead.</strong>\n * @classdesc This class represents an Masterpass component. Instances of this class have methods for launching a new window to process a transaction with Masterpass.\n */\nfunction Masterpass(options) {\n  var configuration = options.client.getConfiguration();\n\n  this._client = options.client;\n  this._assetsUrl =\n    configuration.gatewayConfiguration.assetsUrl + \"/web/\" + VERSION;\n  this._isDebug = configuration.isDebug;\n  this._authInProgress = false;\n  if (\n    window.popupBridge &&\n    typeof window.popupBridge.getReturnUrlPrefix === \"function\"\n  ) {\n    this._callbackUrl = window.popupBridge.getReturnUrlPrefix() + \"return\";\n  } else {\n    this._callbackUrl =\n      this._assetsUrl +\n      \"/html/redirect-frame\" +\n      (this._isDebug ? \"\" : \".min\") +\n      \".html\";\n  }\n}\n\nMasterpass.prototype._initialize = function () {\n  var self = this;\n\n  return new Promise(function (resolve) {\n    var failureTimeout = setTimeout(function () {\n      analytics.sendEvent(self._client, \"masterpass.load.timed-out\");\n    }, INTEGRATION_TIMEOUT_MS);\n\n    frameService.create(\n      {\n        name: constants.LANDING_FRAME_NAME,\n        height: constants.POPUP_HEIGHT,\n        width: constants.POPUP_WIDTH,\n        dispatchFrameUrl:\n          self._assetsUrl +\n          \"/html/dispatch-frame\" +\n          (self._isDebug ? \"\" : \".min\") +\n          \".html\",\n        openFrameUrl:\n          self._assetsUrl +\n          \"/html/masterpass-landing-frame\" +\n          (self._isDebug ? \"\" : \".min\") +\n          \".html\",\n      },\n      function (service) {\n        self._frameService = service;\n        clearTimeout(failureTimeout);\n        analytics.sendEvent(self._client, \"masterpass.load.succeeded\");\n        resolve(self);\n      }\n    );\n  });\n};\n\n/**\n * Launches the Masterpass flow and returns a nonce payload. Only one Masterpass flow should be active at a time. One way to achieve this is to disable your Masterpass button while the flow is open.\n *\n * Braintree will apply these properties in `options.config`. Merchants should not override these values, except for advanced usage.\n *  - `environment`\n *  - `requestToken`\n *  - `callbackUrl`\n *  - `merchantCheckoutId`\n *  - `allowedCardTypes`\n *  - `version`\n *\n * @public\n * @param {object} options All options for initiating the Masterpass payment flow.\n * @param {string} options.currencyCode The currency code to process the payment.\n * @param {string} options.subtotal The amount to authorize for the transaction.\n * @param {object} [options.config] All configuration parameters accepted by Masterpass lightbox, except `function` data type. These options will override the values set by Braintree server. Please see {@link Masterpass Lightbox Parameters|https://developer.mastercard.com/page/masterpass-lightbox-parameters} for more information.\n * @param {object} [options.frameOptions] Used to configure the window that contains the Masterpass login.\n * @param {number} [options.frameOptions.width] Popup width to be used instead of default value (450px).\n * @param {number} [options.frameOptions.height] Popup height to be used instead of default value (660px).\n * @param {number} [options.frameOptions.top] The top position of the popup window to be used instead of default value, that is calculated based on provided height, and parent window size.\n * @param {number} [options.frameOptions.left] The left position to the popup window to be used instead of default value, that is calculated based on provided width, and parent window size.\n * @param {callback} [callback] The second argument, <code>data</code>, is a {@link Masterpass~tokenizePayload|tokenizePayload}. If no callback is provided, the method will return a Promise that resolves with a {@link Masterpass~tokenizePayload|tokenizePayload}.\n * @returns {(Promise|void)} Returns a promise if no callback is provided.\n * @example\n * button.addEventListener('click', function () {\n *   // Disable the button so that we don't attempt to open multiple popups.\n *   button.setAttribute('disabled', 'disabled');\n *\n *   // Because tokenize opens a new window, this must be called\n *   // as a result of a user action, such as a button click.\n *   masterpassInstance.tokenize({\n *     currencyCode: 'USD',\n *     subtotal: '10.00'\n *   }).then(function (payload) {\n *     button.removeAttribute('disabled');\n *     // Submit payload.nonce to your server\n *   }).catch(function (tokenizeError) {\n *     button.removeAttribute('disabled');\n *     // Handle flow errors or premature flow closure\n *\n *     switch (tokenizeErr.code) {\n *       case 'MASTERPASS_POPUP_CLOSED':\n *         console.error('Customer closed Masterpass popup.');\n *         break;\n *       case 'MASTERPASS_ACCOUNT_TOKENIZATION_FAILED':\n *         console.error('Masterpass tokenization failed. See details:', tokenizeErr.details);\n *         break;\n *       case 'MASTERPASS_FLOW_FAILED':\n *         console.error('Unable to initialize Masterpass flow. Are your options correct?', tokenizeErr.details);\n *         break;\n *       default:\n *         console.error('Error!', tokenizeErr);\n *     }\n *   });\n * });\n */\nMasterpass.prototype.tokenize = function (options) {\n  var self = this;\n\n  if (!options || hasMissingOption(options)) {\n    return Promise.reject(\n      new BraintreeError(errors.MASTERPASS_TOKENIZE_MISSING_REQUIRED_OPTION)\n    );\n  }\n\n  if (self._authInProgress) {\n    return Promise.reject(\n      new BraintreeError(errors.MASTERPASS_TOKENIZATION_ALREADY_IN_PROGRESS)\n    );\n  }\n\n  return new Promise(function (resolve, reject) {\n    self._navigateFrameToLoadingPage(options).catch(reject);\n    // This MUST happen after _navigateFrameToLoadingPage for Metro browsers to work.\n    self._frameService.open(\n      options.frameOptions,\n      self._createFrameOpenHandler(resolve, reject)\n    );\n  });\n};\n\nMasterpass.prototype._navigateFrameToLoadingPage = function (options) {\n  var self = this;\n\n  this._authInProgress = true;\n\n  return this._client\n    .request({\n      method: \"post\",\n      endpoint: \"masterpass/request_token\",\n      data: {\n        requestToken: {\n          originUrl: window.location.protocol + \"//\" + window.location.hostname,\n          subtotal: options.subtotal,\n          currencyCode: options.currencyCode,\n          callbackUrl: this._callbackUrl,\n        },\n      },\n    })\n    .then(function (response) {\n      var redirectUrl =\n        self._assetsUrl +\n        \"/html/masterpass-loading-frame\" +\n        (self._isDebug ? \"\" : \".min\") +\n        \".html?\";\n      var gatewayConfiguration =\n        self._client.getConfiguration().gatewayConfiguration;\n      var config = options.config || {};\n      var queryParams;\n\n      queryParams = {\n        environment: gatewayConfiguration.environment,\n        requestToken: response.requestToken,\n        callbackUrl: self._callbackUrl,\n        merchantCheckoutId: gatewayConfiguration.masterpass.merchantCheckoutId,\n        allowedCardTypes: gatewayConfiguration.masterpass.supportedNetworks,\n        version: constants.MASTERPASS_VERSION,\n      };\n\n      Object.keys(config).forEach(function (key) {\n        if (typeof config[key] !== \"function\") {\n          queryParams[key] = config[key];\n        }\n      });\n\n      redirectUrl += Object.keys(queryParams)\n        .map(function (key) {\n          return key + \"=\" + queryParams[key];\n        })\n        .join(\"&\");\n\n      self._frameService.redirect(redirectUrl);\n    })\n    .catch(function (err) {\n      var status = err.details && err.details.httpStatus;\n\n      self._closeWindow();\n\n      if (status === 422) {\n        return Promise.reject(\n          convertToBraintreeError(err, errors.MASTERPASS_INVALID_PAYMENT_OPTION)\n        );\n      }\n\n      return Promise.reject(\n        convertToBraintreeError(err, errors.MASTERPASS_FLOW_FAILED)\n      );\n    });\n};\n\nMasterpass.prototype._createFrameOpenHandler = function (resolve, reject) {\n  var self = this;\n\n  if (window.popupBridge) {\n    return function (popupBridgeErr, payload) {\n      self._authInProgress = false;\n\n      if (popupBridgeErr) {\n        analytics.sendEvent(\n          self._client,\n          \"masterpass.tokenization.closed-popupbridge.by-user\"\n        );\n        reject(\n          convertToBraintreeError(\n            popupBridgeErr,\n            errors.MASTERPASS_POPUP_CLOSED\n          )\n        );\n\n        return;\n      }\n      if (!payload.queryItems) {\n        analytics.sendEvent(\n          self._client,\n          \"masterpass.tokenization.failed-popupbridge\"\n        );\n        reject(new BraintreeError(errors.MASTERPASS_FLOW_FAILED));\n\n        return;\n      }\n\n      self._tokenizeMasterpass(payload.queryItems).then(resolve).catch(reject);\n    };\n  }\n\n  return function (frameServiceErr, payload) {\n    if (frameServiceErr) {\n      self._authInProgress = false;\n\n      if (frameServiceErr.code === \"FRAME_SERVICE_FRAME_CLOSED\") {\n        analytics.sendEvent(\n          self._client,\n          \"masterpass.tokenization.closed.by-user\"\n        );\n        reject(new BraintreeError(errors.MASTERPASS_POPUP_CLOSED));\n\n        return;\n      }\n\n      if (\n        frameServiceErr.code &&\n        frameServiceErr.code.indexOf(\"FRAME_SERVICE_FRAME_OPEN_FAILED\") > -1\n      ) {\n        analytics.sendEvent(\n          self._client,\n          \"masterpass.tokenization.failed.to-open\"\n        );\n        reject(\n          new BraintreeError({\n            code: errors.MASTERPASS_POPUP_OPEN_FAILED.code,\n            type: errors.MASTERPASS_POPUP_OPEN_FAILED.type,\n            message: errors.MASTERPASS_POPUP_OPEN_FAILED.message,\n            details: {\n              originalError: frameServiceErr,\n            },\n          })\n        );\n\n        return;\n      }\n\n      analytics.sendEvent(self._client, \"masterpass.tokenization.failed\");\n      self._closeWindow();\n      reject(\n        convertToBraintreeError(frameServiceErr, errors.MASTERPASS_FLOW_FAILED)\n      );\n\n      return;\n    }\n\n    self._tokenizeMasterpass(payload).then(resolve).catch(reject);\n  };\n};\n\nMasterpass.prototype._tokenizeMasterpass = function (payload) {\n  var self = this;\n\n  if (payload.mpstatus !== \"success\") {\n    analytics.sendEvent(self._client, \"masterpass.tokenization.closed.by-user\");\n    self._closeWindow();\n\n    return Promise.reject(new BraintreeError(errors.MASTERPASS_POPUP_CLOSED));\n  }\n\n  if (isMissingRequiredPayload(payload)) {\n    analytics.sendEvent(\n      self._client,\n      \"masterpass.tokenization.closed.missing-payload\"\n    );\n    self._closeWindow();\n\n    return Promise.reject(\n      new BraintreeError(errors.MASTERPASS_POPUP_MISSING_REQUIRED_PARAMETERS)\n    );\n  }\n\n  return self._client\n    .request({\n      endpoint: \"payment_methods/masterpass_cards\",\n      method: \"post\",\n      data: {\n        masterpassCard: {\n          checkoutResourceUrl: payload.checkout_resource_url,\n          requestToken: payload.oauth_token,\n          verifierToken: payload.oauth_verifier,\n        },\n      },\n    })\n    .then(function (response) {\n      self._closeWindow();\n      if (window.popupBridge) {\n        analytics.sendEvent(\n          self._client,\n          \"masterpass.tokenization.success-popupbridge\"\n        );\n      } else {\n        analytics.sendEvent(self._client, \"masterpass.tokenization.success\");\n      }\n\n      return response.masterpassCards[0];\n    })\n    .catch(function (tokenizeErr) {\n      self._closeWindow();\n      if (window.popupBridge) {\n        analytics.sendEvent(\n          self._client,\n          \"masterpass.tokenization.failed-popupbridge\"\n        );\n      } else {\n        analytics.sendEvent(self._client, \"masterpass.tokenization.failed\");\n      }\n\n      return Promise.reject(\n        convertToBraintreeError(\n          tokenizeErr,\n          errors.MASTERPASS_ACCOUNT_TOKENIZATION_FAILED\n        )\n      );\n    });\n};\n\nfunction isMissingRequiredPayload(payload) {\n  return [\n    payload.oauth_verifier,\n    payload.oauth_token,\n    payload.checkout_resource_url,\n  ].some(function (element) {\n    return element == null || element === \"null\";\n  });\n}\n\nMasterpass.prototype._closeWindow = function () {\n  this._authInProgress = false;\n  this._frameService.close();\n};\n\n/**\n * Cleanly tear down anything set up by {@link module:braintree-web/masterpass.create|create}.\n * @public\n * @param {callback} [callback] Called on completion. If no callback is provided, `teardown` returns a promise.\n * @example\n * masterpassInstance.teardown();\n * @example <caption>With callback</caption>\n * masterpassInstance.teardown(function () {\n *   // teardown is complete\n * });\n * @returns {(Promise|void)} Returns a promise if no callback is provided.\n */\nMasterpass.prototype.teardown = function () {\n  var self = this;\n\n  return new Promise(function (resolve) {\n    self._frameService.teardown();\n\n    convertMethodsToError(self, methods(Masterpass.prototype));\n\n    analytics.sendEvent(self._client, \"masterpass.teardown-completed\");\n\n    resolve();\n  });\n};\n\nfunction hasMissingOption(options) {\n  var i, option;\n\n  for (i = 0; i < constants.REQUIRED_OPTIONS_FOR_TOKENIZE.length; i++) {\n    option = constants.REQUIRED_OPTIONS_FOR_TOKENIZE[i];\n\n    if (!options.hasOwnProperty(option)) {\n      return true;\n    }\n  }\n\n  return false;\n}\n\nmodule.exports = wrapPromise.wrapPrototype(Masterpass);\n\n},{\"../../lib/analytics\":143,\"../../lib/braintree-error\":148,\"../../lib/constants\":149,\"../../lib/convert-methods-to-error\":150,\"../../lib/convert-to-braintree-error\":151,\"../../lib/frame-service/external\":162,\"../../lib/methods\":180,\"../shared/constants\":197,\"../shared/errors\":198,\"@braintree/wrap-promise\":43}],195:[function(_dereq_,module,exports){\n\"use strict\";\n/** @module braintree-web/masterpass\n * @description Processes Masterpass. *This component is currently in beta and is subject to change.*\n */\n\nvar BraintreeError = _dereq_(\"../lib/braintree-error\");\nvar basicComponentVerification = _dereq_(\"../lib/basic-component-verification\");\nvar browserDetection = _dereq_(\"./shared/browser-detection\");\nvar Masterpass = _dereq_(\"./external/masterpass\");\nvar createDeferredClient = _dereq_(\"../lib/create-deferred-client\");\nvar createAssetsUrl = _dereq_(\"../lib/create-assets-url\");\nvar VERSION = \"3.134.0\";\nvar errors = _dereq_(\"./shared/errors\");\nvar wrapPromise = _dereq_(\"@braintree/wrap-promise\");\n\n/**\n * @static\n * @function create\n * @param {object} options Creation options:\n * @param {Client} [options.client] A {@link Client} instance.\n * @param {string} [options.authorization] A tokenizationKey or clientToken. Can be used in place of `options.client`.\n * @param {callback} [callback] The second argument, `data`, is the {@link Masterpass} instance. If no callback is passed in, the create function returns a promise that resolves the {@link Masterpass} instance.\n * @example\n * braintree.masterpass.create({\n *   client: clientInstance\n * }, function (createErr, masterpassInstance) {\n *   if (createErr) {\n *     if (createErr.code === 'MASTERPASS_BROWSER_NOT_SUPPORTED') {\n *       console.error('This browser is not supported.');\n *     } else {\n *       console.error('Error!', createErr);\n *     }\n *     return;\n *   }\n * });\n * @returns {(Promise|void)} Returns a promise if no callback is provided.\n */\nfunction create(options) {\n  var name = \"Masterpass\";\n\n  return basicComponentVerification\n    .verify({\n      name: name,\n      client: options.client,\n      authorization: options.authorization,\n    })\n    .then(function () {\n      if (!isSupported()) {\n        return Promise.reject(\n          new BraintreeError(errors.MASTERPASS_BROWSER_NOT_SUPPORTED)\n        );\n      }\n\n      return Promise.resolve();\n    })\n    .then(function () {\n      return createDeferredClient.create({\n        authorization: options.authorization,\n        client: options.client,\n        debug: options.debug,\n        assetsUrl: createAssetsUrl.create(options.authorization),\n        name: name,\n      });\n    })\n    .then(function (client) {\n      var masterpassInstance, configuration;\n\n      options.client = client;\n      configuration = options.client.getConfiguration().gatewayConfiguration;\n\n      if (!configuration.masterpass) {\n        return Promise.reject(\n          new BraintreeError(errors.MASTERPASS_NOT_ENABLED)\n        );\n      }\n\n      masterpassInstance = new Masterpass(options);\n\n      return masterpassInstance._initialize();\n    });\n}\n\n/**\n * @static\n * @function isSupported\n * @description Returns true if Masterpass supports this browser.\n * @example\n * if (braintree.masterpass.isSupported()) {\n *   // Add Masterpass button to the page\n * } else {\n *   // Hide Masterpass payment option\n * }\n * @returns {Boolean} Returns true if Masterpass supports this browser.\n */\nfunction isSupported() {\n  return Boolean(window.popupBridge || browserDetection.supportsPopups());\n}\n\nmodule.exports = {\n  create: wrapPromise(create),\n  isSupported: isSupported,\n  /**\n   * @description The current version of the SDK, i.e. `{@pkg version}`.\n   * @type {string}\n   */\n  VERSION: VERSION,\n};\n\n},{\"../lib/basic-component-verification\":146,\"../lib/braintree-error\":148,\"../lib/create-assets-url\":152,\"../lib/create-deferred-client\":154,\"./external/masterpass\":194,\"./shared/browser-detection\":196,\"./shared/errors\":198,\"@braintree/wrap-promise\":43}],196:[function(_dereq_,module,exports){\n\"use strict\";\n\nmodule.exports = {\n  supportsPopups: _dereq_(\"@braintree/browser-detection/supports-popups\"),\n};\n\n},{\"@braintree/browser-detection/supports-popups\":32}],197:[function(_dereq_,module,exports){\n\"use strict\";\n\nmodule.exports = {\n  LANDING_FRAME_NAME: \"braintreemasterpasslanding\",\n  POPUP_WIDTH: 450,\n  POPUP_HEIGHT: 660,\n  MASTERPASS_VERSION: \"v6\",\n  REQUIRED_OPTIONS_FOR_TOKENIZE: [\"subtotal\", \"currencyCode\"],\n};\n\n},{}],198:[function(_dereq_,module,exports){\n\"use strict\";\n\n/**\n * @name BraintreeError.Masterpass - Creation Error Codes\n * @description Errors that occur when [creating the Masterpass component](./module-braintree-web_masterpass#.create).\n * @property {CUSTOMER} MASTERPASS_BROWSER_NOT_SUPPORTED Occurs when browser is not a supported browser for Masterpass.\n * @property {MERCHANT} MASTERPASS_NOT_ENABLED Occurs when Masterpass is not enabled in the Braintree control panel.\n */\n\n/**\n * @name BraintreeError.Masterpass - Tokenize Error Codes\n * @description Errors that occur when [tokenizing](./Masterpass.html#tokenize).\n * @property {MERCHANT} MASTERPASS_TOKENIZE_MISSING_REQUIRED_OPTION Occurs when tokenize is called without a required option.\n * @property {MERCHANT} MASTERPASS_TOKENIZATION_ALREADY_IN_PROGRESS Occurs if tokenization flow is initialized while another flow is already in progress.\n * @property {NETWORK} MASTERPASS_ACCOUNT_TOKENIZATION_FAILED Occurs when tokenization of Masterpass details fails.\n * @property {MERCHANT} MASTERPASS_POPUP_OPEN_FAILED Occurs when the popup fails to open.\n * @property {MERCHANT} MASTERPASS_POPUP_MISSING_REQUIRED_PARAMETERS Occurs when Masterpass is missing required parameters for tokenization.\n * @property {CUSTOMER} MASTERPASS_POPUP_CLOSED Occurs when the popup is closed by the customer.\n * @property {MERCHANT} MASTERPASS_INVALID_PAYMENT_OPTION Occurs when an invalid payment option is used to tokenize Masterpass.\n * @property {NETWORK} MASTERPASS_FLOW_FAILED Occurs when an error is returned from request to tokenize.\n */\n\nvar BraintreeError = _dereq_(\"../../lib/braintree-error\");\n\nmodule.exports = {\n  MASTERPASS_BROWSER_NOT_SUPPORTED: {\n    type: BraintreeError.types.CUSTOMER,\n    code: \"MASTERPASS_BROWSER_NOT_SUPPORTED\",\n    message: \"Browser is not supported.\",\n  },\n  MASTERPASS_NOT_ENABLED: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"MASTERPASS_NOT_ENABLED\",\n    message: \"Masterpass is not enabled for this merchant.\",\n  },\n  MASTERPASS_TOKENIZE_MISSING_REQUIRED_OPTION: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"MASTERPASS_TOKENIZE_MISSING_REQUIRED_OPTION\",\n    message: \"Missing required option for tokenize.\",\n  },\n  MASTERPASS_TOKENIZATION_ALREADY_IN_PROGRESS: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"MASTERPASS_TOKENIZATION_ALREADY_IN_PROGRESS\",\n    message: \"Masterpass tokenization is already in progress.\",\n  },\n  MASTERPASS_ACCOUNT_TOKENIZATION_FAILED: {\n    type: BraintreeError.types.NETWORK,\n    code: \"MASTERPASS_ACCOUNT_TOKENIZATION_FAILED\",\n    message: \"Could not tokenize user's Masterpass account.\",\n  },\n  MASTERPASS_POPUP_OPEN_FAILED: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"MASTERPASS_POPUP_OPEN_FAILED\",\n    message:\n      \"Masterpass popup failed to open. Make sure to tokenize in response to a user action, such as a click.\",\n  },\n  MASTERPASS_POPUP_MISSING_REQUIRED_PARAMETERS: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"MASTERPASS_POPUP_MISSING_REQUIRED_PARAMETERS\",\n    message:\n      \"Masterpass popup failed to return all required parameters needed to continue tokenization.\",\n  },\n  MASTERPASS_POPUP_CLOSED: {\n    type: BraintreeError.types.CUSTOMER,\n    code: \"MASTERPASS_POPUP_CLOSED\",\n    message: \"Customer closed Masterpass popup before authorizing.\",\n  },\n  MASTERPASS_INVALID_PAYMENT_OPTION: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"MASTERPASS_INVALID_PAYMENT_OPTION\",\n    message: \"Masterpass payment options are invalid.\",\n  },\n  MASTERPASS_FLOW_FAILED: {\n    type: BraintreeError.types.NETWORK,\n    code: \"MASTERPASS_FLOW_FAILED\",\n    message: \"Could not initialize Masterpass flow.\",\n  },\n};\n\n},{\"../../lib/braintree-error\":148}],199:[function(_dereq_,module,exports){\n\"use strict\";\n\nmodule.exports = {\n  CREATE_PAYMENT_READY_SESSION_QUERY:\n    \"mutation CreateCustomerSession($input: CreateCustomerSessionInput!) {\\n  createCustomerSession(input: $input) {\\n    sessionId\\n clientMutationId\\n }\\n}\",\n\n  /**\n   * @typedef PaymentReady~BUTTON_ORDER\n   * @property {string} FIRST \"first\"\n   * @property {string} SECOND \"second\"\n   * @property {string} THIRD \"third\"\n   * @property {string} FOURTH \"fourth\"\n   * @property {string} FIFTH \"fifth\"\n   * @property {string} SIXTH \"sixth\"\n   * @property {string} SEVENTH \"seventh\"\n   * @property {string} EIGHT \"eight\"\n   * @property {string} OTHER \"other\"\n   */\n  BUTTON_ORDER: {\n    FIRST: \"first\",\n    SECOND: \"second\",\n    THIRD: \"third\",\n    FOURTH: \"fourth\",\n    FIFTH: \"fifth\",\n    SIXTH: \"sixth\",\n    SEVENTH: \"seventh\",\n    EIGHT: \"eight\",\n    OTHER: \"other\",\n  },\n\n  /**\n   * @typedef PaymentReady~BUTTON_TYPE\n   * @property {string} PAYPAL \"paypal\"\n   * @property {string} VENMO \"venmo\"\n   * @property {string} OTHER \"other\"\n   */\n  BUTTON_TYPE: {\n    PAYPAL: \"paypal\",\n    VENMO: \"venmo\",\n    OTHER: \"other\",\n  },\n\n  EVENT_BUTTON_PRESENTED: \"payment-ready.button_presented\",\n  EVENT_BUTTON_SELECTED: \"payment-ready.button_selected\",\n\n  /**\n   * @typedef PaymentReady~EXPERIMENT_TYPE\n   * @property {string} CONTROL \"control\"\n   * @property {string} TEST \"test\"\n   */\n  EXPERIMENT_TYPE: {\n    CONTROL: \"control\",\n    TEST: \"test\",\n  },\n\n  /**\n   * @typedef PaymentReady~PAGE_TYPE\n   * @property {string} ABOUT \"about\"\n   * @property {string} CART \"cart\"\n   * @property {string} CHECKOUT \"checkout\"\n   * @property {string} HOMEPAGE \"homepage\"\n   * @property {string} MINICART \"minicart\"\n   * @property {string} ORDER_CONFIRMATION \"order_confirmation\"\n   * @property {string} ORDER_REVIEW \"order_review\"\n   * @property {string} PRODUCT_CATEGORY \"product_category\"\n   * @property {string} PRODUCT_DETAILS \"product_details\"\n   * @property {string} SEARCH \"search\"\n   * @property {string} OTHER \"other\"\n   */\n  PAGE_TYPE: {\n    HOMEPAGE: \"homepage\",\n    ABOUT: \"about\",\n    PRODUCT_CATEGORY: \"product_category\",\n    PRODUCT_DETAILS: \"product_details\",\n    SEARCH: \"search\",\n    CART: \"cart\",\n    CHECKOUT: \"checkout\",\n    ORDER_REVIEW: \"order_review\",\n    ORDER_CONFIRMATION: \"order_confirmation\",\n    MINICART: \"minicart\",\n    OTHER: \"other\",\n  },\n\n  UPDATE_PAYMENT_READY_SESSION_QUERY:\n    \"mutation UpdateCustomerSession($input: UpdateCustomerSessionInput!) {\\n  updateCustomerSession(input: $input) {\\n    sessionId\\n clientMutationId\\n }\\n}\",\n\n  GENERATE_CUSTOMER_RECOMMENDATIONS_QUERY:\n    \"mutation GenerateCustomerRecommendations($input: GenerateCustomerRecommendationsInput!) {\\n  generateCustomerRecommendations(input: $input) {\\n     clientMutationId\\n      sessionId\\n      paymentRecommendations {\\n        paymentOption\\n        recommendedPriority\\n      }\\n      isInPayPalNetwork\\n  }\\n}\",\n\n  REQUIRED_OPTIONS_CREATE_SESSION: [\"customer\"],\n  REQUIRED_OPTIONS_UPDATE_SESSION: [\"sessionId\", \"customer\"],\n  REQUIRED_OPTIONS_GET_RECOMMENDATIONS: [\"sessionId\"],\n};\n\n},{}],200:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar BraintreeError = _dereq_(\"../lib/braintree-error\");\n\nmodule.exports = {\n  PAYMENT_READY_ERROR: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"PAYMENT_READY_ERROR\",\n  },\n\n  PAYMENT_READY_MISSING_REQUIRED_OPTION: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"PAYMENT_READY_MISSING_REQUIRED_OPTION\",\n    message: \"Missing required option for Payment Ready method.\",\n  },\n\n  PAYMENT_READY_CREATE_SESSION_ERROR: {\n    type: BraintreeError.types.NETWORK,\n    code: \"PAYMENT_READY_CREATE_SESSION_ERROR\",\n    message: \"Error creating customer session.\",\n  },\n\n  PAYMENT_READY_UPDATE_SESSION_ERROR: {\n    type: BraintreeError.types.NETWORK,\n    code: \"PAYMENT_READY_UPDATE_SESSION_ERROR\",\n    message: \"Error updating customer session.\",\n  },\n\n  PAYMENT_READY_NO_SESSION_ID: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"PAYMENT_READY_NO_SESSION_ID\",\n    message: \"A session ID is required\",\n  },\n\n  PAYMENT_READY_GET_RECOMMENDATIONS_ERROR: {\n    type: BraintreeError.types.NETWORK,\n    code: \"PAYMENT_READY_GET_RECOMMENDATIONS_ERROR\",\n    message: \"Error getting customer recommendations\",\n  },\n};\n\n},{\"../lib/braintree-error\":148}],201:[function(_dereq_,module,exports){\n\"use strict\";\n/** @module braintree-web/payment-ready */\n\nvar analytics = _dereq_(\"../lib/analytics\");\nvar PaymentReady = _dereq_(\"./payment-ready\");\nvar createAssetsUrl = _dereq_(\"../lib/create-assets-url\");\nvar createDeferredClient = _dereq_(\"../lib/create-deferred-client\");\nvar basicComponentVerification = _dereq_(\"../lib/basic-component-verification\");\nvar wrapPromise = _dereq_(\"@braintree/wrap-promise\");\nvar VERSION = \"3.134.0\";\n\n/**\n * @static\n * @function create\n * @param {object} options Creation options:\n * @param {Client} [options.client] A {@link Client} instance.\n * @param {string} [options.authorization] A tokenizationKey or clientToken. Can be used in place of `options.client`.\n * @param {boolean} [options.debug] A debug flag.\n * @param {string} [options.redirectUrl] When provided, triggers full page redirect flow instead of popup flow.\n * @param {callback} [callback] When provided, will be used instead of a promise. First argument is an error object, where the second is an instance of {@link PaymentReady|PaymentReady}.\n * @returns {Promise<PaymentReady>} Returns the PAYMENTREADY instance.\n * @example\n * braintree.paymentReady.create({\n *   client: clientInstance\n * }).then(function (paymentReadyInstance) {\n *   // paymentReadyInstance is ready to be used.\n * }).catch(function (createErr) {\n *   console.error('Error creating PAYMENTREADY instance', createErr);\n * });\n * @example <caption>Creating a PAYMENTREADY component</caption>\n * braintree.paymentReady.create({\n *   client: clientInstance,\n * }).then(function (paymentReadyInstance) {\n *   // paymentReadyInstance is ready to be used.\n * }).catch(function (createErr) {\n *   console.error('Error creating PAYMENT READY instance', createErr);\n * });\n */\n\nfunction create(options) {\n  var name = \"PAYMENT READY\";\n\n  return basicComponentVerification\n    .verify({\n      name: name,\n      client: options.client,\n      authorization: options.authorization,\n    })\n    .then(function () {\n      return createDeferredClient.create({\n        authorization: options.authorization,\n        client: options.client,\n        debug: options.debug,\n        assetsUrl: createAssetsUrl.create(options.authorization),\n        name: name,\n      });\n    })\n    .then(function (client) {\n      options.client = client;\n\n      analytics.sendEvent(client, \"payment-ready.client.initialized\");\n\n      return new PaymentReady(options);\n    });\n}\n\nmodule.exports = {\n  create: wrapPromise(create),\n  /**\n   * @description The current version of the SDK, i.e. `{@pkg version}`.\n   * @type {string}\n   */\n  VERSION: VERSION,\n};\n\n},{\"../lib/analytics\":143,\"../lib/basic-component-verification\":146,\"../lib/create-assets-url\":152,\"../lib/create-deferred-client\":154,\"./payment-ready\":202,\"@braintree/wrap-promise\":43}],202:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar wrapPromise = _dereq_(\"@braintree/wrap-promise\");\n\nvar analytics = _dereq_(\"../lib/analytics\");\nvar BraintreeError = _dereq_(\"../lib/braintree-error\");\nvar constants = _dereq_(\"./constants\");\nvar errors = _dereq_(\"./errors\");\nvar hasMissingOption = _dereq_(\"../lib/has-missing-option\");\n\n/**\n * @class\n * @param {object} options see {@link module:braintree-web/payment-ready.create|payment-ready.create}\n * @description <strong>Do not use this constructor directly. Use {@link module:braintree-web/payment-ready.create|braintree-web.payment-ready.create} instead.</strong>\n * @classdesc This class represents a Payment Ready component produced by {@link module:braintree-web/payment-ready.create|braintree-web.payment-ready.create}. Instances provide methods for Payment Ready methods.\n */\nfunction PaymentReady(options) {\n  this._instantiatedWithClient = Boolean(!options.useDeferredClient);\n  this._client = options.client;\n  this._createPromise = options.createPromise;\n}\n\n/**\n * Payment Ready Customer data object.\n * @typedef {object} PaymentReady~Customer\n * @property {string} [deviceFingerprintId] - Unique device identifier\n * @property {string} [hashedEmail] - This field must contain a Hex-encoded SHA-256 hashed value of the actual email.\n * The email address must be sanitized before hashing:\n *  * email address in lowercase\n *  * remove leading and trailing whitespace\n * @property {string} [hashedPhoneNumber] - This field must contain a Hex-encoded SHA-256 hashed value of the phone number; and the phone number must be in E.164 format.\n * * E.164 format example 1: '+12345551234' where country code is '1', area code is '234' and subscriber number is '555-1234'\n * * E.164 format example 2: '+6129876543X' where country code is '61', area code is '2' and subscriber number is '9876 543X'\n * @property {boolean} [paypalAppInstalled] - A flag indicating if customer device has paypal application installed.\n * @property {boolean} [venmoAppInstalled] - A flag indicating if customer device has venmo applicaition installed.\n * @property {string} [userAgent] - The user agent string of customer browser describing application, OS, vendor, and version of requesting user agent.\n */\n\n/**\n * Creates a customer session using the Payment Ready API.\n *\n * @public\n * @param {object} options - The options for creating a customer session.\n * @param {PaymentReady~Customer} options.customer - The customer data object. At minimum, this object should contain  either `hashedEmail` or `hashedPhoneNumber` field.\n * @param {string} [options.sessionId] - Optionally, specify a unique identifier for this customer session. It must be at least 36 characters, no more than 100 characters and match the following regex: `[A-Za-z0-9-_.]+`.\n * @returns {Promise<object>} A promise that resolves with the created customer session data.\n * @throws {BraintreeError} If the specified `sessionId` has previously been used or has an invalid format.\n * @example\n * paymentReadyInstance.createCustomerSession({\n *   customer: {\n *     ... // Customer data\n *   }\n * }).then(function (sessionData) {\n *   // Handle the session data\n *   console.log(sessionData.sessionId);\n * }).catch(function (err) {\n *   // Handle errors\n *   console.error(err);\n * });\n */\nPaymentReady.prototype.createCustomerSession = function (options) {\n  var self = this;\n\n  if (\n    !options ||\n    hasMissingOption(options, constants.REQUIRED_OPTIONS_CREATE_SESSION)\n  ) {\n    analytics.sendEvent(\n      self._client,\n      \"payment-ready.create-customer-session.missing-options\"\n    );\n\n    return Promise.reject(\n      new BraintreeError(errors.PAYMENT_READY_MISSING_REQUIRED_OPTION)\n    );\n  }\n\n  return self._client\n    .request({\n      api: \"graphQLApi\",\n      data: {\n        query: constants.CREATE_PAYMENT_READY_SESSION_QUERY,\n        variables: {\n          input: {\n            sessionId: options.sessionId,\n            customer: options.customer,\n          },\n        },\n      },\n    })\n    .then(function (response) {\n      analytics.sendEvent(\n        self._client,\n        \"payment-ready.create-customer-session.succeeded\"\n      );\n\n      return response.data.createCustomerSession;\n    })\n    .catch(function (err) {\n      analytics.sendEvent(\n        self._client,\n        \"payment-ready.create-customer-session.failed\"\n      );\n\n      return Promise.reject(\n        new BraintreeError({\n          type: err.type || errors.PAYMENT_READY_CREATE_SESSION_ERROR.type,\n          code: err.code || errors.PAYMENT_READY_CREATE_SESSION_ERROR.code,\n          message:\n            err.message || errors.PAYMENT_READY_CREATE_SESSION_ERROR.message,\n          details: { originalError: err },\n        })\n      );\n    });\n};\n\n/**\n * Updates an existing customer session using the Payment Ready API.\n *\n * @public\n * @param {object} options - The options for updating a customer session.\n * @param {string} options.sessionId - The ID of the session to update.\n * @param {PaymentReady~Customer} options.customer - The updated customer data object.\n * @returns {Promise<object>} A promise that resolves with the updated customer session data.\n * @example\n * paymentReadyInstance.updateCustomerSession({\n *   sessionId: \"session-abc-123\",\n *   customer: {\n *     ... // Updated customer data\n *   }\n * }).then(function (sessionData) {\n *   // Handle the updated session data\n *   console.log(sessionData.sessionId);\n * }).catch(function (err) {\n *   // Handle errors\n *   console.error(err);\n * });\n */\nPaymentReady.prototype.updateCustomerSession = function (options) {\n  var self = this;\n\n  if (\n    !options ||\n    hasMissingOption(options, constants.REQUIRED_OPTIONS_UPDATE_SESSION)\n  ) {\n    analytics.sendEvent(\n      self._client,\n      \"payment-ready.update-customer-session.missing-options\"\n    );\n\n    return Promise.reject(\n      new BraintreeError(errors.PAYMENT_READY_MISSING_REQUIRED_OPTION)\n    );\n  }\n\n  return self._client\n    .request({\n      api: \"graphQLApi\",\n      data: {\n        query: constants.UPDATE_PAYMENT_READY_SESSION_QUERY,\n        variables: {\n          input: {\n            sessionId: options.sessionId,\n            customer: options.customer,\n          },\n        },\n      },\n    })\n    .then(function (response) {\n      analytics.sendEvent(\n        self._client,\n        \"payment-ready.update-customer-session.succeeded\"\n      );\n\n      return response.data.updateCustomerSession;\n    })\n    .catch(function (err) {\n      analytics.sendEvent(\n        self._client,\n        \"payment-ready.update-customer-session.failed\"\n      );\n\n      return Promise.reject(\n        new BraintreeError({\n          type: err.type || errors.PAYMENT_READY_UPDATE_SESSION_ERROR.type,\n          code: err.code || errors.PAYMENT_READY_UPDATE_SESSION_ERROR.code,\n          message:\n            err.message || errors.PAYMENT_READY_UPDATE_SESSION_ERROR.message,\n          details: { originalError: err },\n        })\n      );\n    });\n};\n\n/**\n * Generates customer payment recommendations using the Payment Ready API.\n *\n * @public\n * @param {object} options - The options for generating customer recommendations.\n * @param {string} options.sessionId - The ID of the session to get recommendations for.\n * @param {PaymentReady~Customer} [options.customer] - Optional customer data object.\n * @param {string} [options.domain] - Optional domain parameter.\n * @param {Array} [options.purchaseUnits] - Optional purchase units array.\n * @returns {Promise<object>} A promise that resolves with the customer recommendations data.\n * @example\n * paymentReadyInstance.getCustomerRecommendations({\n *   sessionId: \"session-abc-123\",\n *   customer: {\n *     // Optional customer data\n *   },\n *   domain: \"example.com\",\n *   purchaseUnits: [\n *     // Purchase unit data\n *   ]\n * }).then(function (recommendations) {\n *   // Handle the recommendations data\n *   console.log(recommendations.paymentRecommendations);\n * }).catch(function (err) {\n *   // Handle errors\n *   console.error(err);\n * });\n */\nPaymentReady.prototype.getCustomerRecommendations = function (options) {\n  var self = this;\n\n  if (\n    !options ||\n    hasMissingOption(options, constants.REQUIRED_OPTIONS_GET_RECOMMENDATIONS)\n  ) {\n    analytics.sendEvent(\n      self._client,\n      \"payment-ready.get-customer-recommendations.missing-options\"\n    );\n\n    return Promise.reject(\n      new BraintreeError(errors.PAYMENT_READY_NO_SESSION_ID)\n    );\n  }\n\n  return self._client\n    .request({\n      api: \"graphQLApi\",\n      data: {\n        query: constants.GENERATE_CUSTOMER_RECOMMENDATIONS_QUERY,\n        variables: {\n          input: {\n            sessionId: options.sessionId,\n            customer: options.customer,\n            domain: options.domain,\n            purchaseUnits: options.purchaseUnits,\n          },\n        },\n      },\n    })\n    .then(function (response) {\n      analytics.sendEvent(\n        self._client,\n        \"payment-ready.get-customer-recommendations.succeeded\"\n      );\n\n      return response.data.generateCustomerRecommendations;\n    })\n    .catch(function (err) {\n      analytics.sendEvent(\n        self._client,\n        \"payment-ready.get-customer-recommendations.failed\"\n      );\n\n      return Promise.reject(\n        new BraintreeError({\n          type: err.type || errors.PAYMENT_READY_GET_RECOMMENDATIONS_ERROR.type,\n          code: err.code || errors.PAYMENT_READY_GET_RECOMMENDATIONS_ERROR.code,\n          message:\n            err.message ||\n            errors.PAYMENT_READY_GET_RECOMMENDATIONS_ERROR.message,\n          details: { originalError: err },\n        })\n      );\n    });\n};\n\n/**\n * Call this method when a payment button has been successfully displayed to the buyer.\n * This method sends analytics to help improve the Shopper Insights feature experience.\n *\n * @public\n * @param {object} options - The options for the event.\n * @param {string} options.buttonType Type of button presented to the user.\n * @param {string} options.paymentReadySessionId - The id of paymentReady session created with createCustomerSession method.\n * @param {object} [options.presentmentDetails] Details of presentment. Includes experimentType, pageType, and buttonOrder.\n * @param {PaymentReady~EXPERIMENT_TYPE} [options.presentmentDetails.experimentType] Experiment type being used.\n * @param {PaymentReady~PAGE_TYPE} [options.presentmentDetails.pageType] Page type where the SDK is being used.\n * @param {PaymentReady~BUTTON_ORDER} [options.presentmentDetails.buttonOrder] Where in the list of buttons this button was presented.\n *\n * @example\n * paymentReadyInstance.sendPresentedEvent({\n *   buttonType: \"paypal\",\n *   paymentReadySessionId: \"SESSION_ID_123\",\n *   presentmentDetails: {\n *     experimentType: \"control\",\n *     pageType: \"checkout\",\n *     buttonOrder: \"second\"\n * });\n * @returns {void} This method does not return any value.\n */\nPaymentReady.prototype.sendPresentedEvent = function (options) {\n  var experimentType = options.presentmentDetails\n    ? options.presentmentDetails.experimentType\n    : null;\n  var pageType = options.presentmentDetails\n    ? options.presentmentDetails.pageType\n    : null;\n  var buttonOrder = options.presentmentDetails\n    ? options.presentmentDetails.buttonOrder\n    : null;\n\n  if (\n    !options.paymentReadySessionId ||\n    typeof options.paymentReadySessionId !== \"string\"\n  ) {\n    // eslint-disable-next-line no-console\n    console.warn(\n      \"sendPresentedEvent: paymentReadySessionId is missing or invalid\"\n    );\n\n    return;\n  }\n\n  if (!options.buttonType || typeof options.buttonType !== \"string\") {\n    // eslint-disable-next-line no-console\n    console.warn(\"sendPresentedEvent: buttonType is missing\");\n\n    return;\n  }\n\n  var buttonSelected = options.buttonType;\n  var presentAnalyticFields;\n\n  if (!Object.values(constants.BUTTON_TYPE).includes(buttonSelected)) {\n    buttonSelected = constants.BUTTON_TYPE.OTHER;\n  }\n\n  if (\n    buttonOrder &&\n    !Object.values(constants.BUTTON_ORDER).includes(buttonOrder)\n  ) {\n    buttonOrder = constants.BUTTON_ORDER.OTHER;\n  }\n\n  if (\n    experimentType &&\n    !Object.values(constants.EXPERIMENT_TYPE).includes(experimentType)\n  ) {\n    experimentType = constants.EXPERIMENT_TYPE.TEST;\n  }\n\n  if (pageType && !Object.values(constants.PAGE_TYPE).includes(pageType)) {\n    pageType = constants.PAGE_TYPE.OTHER;\n  }\n\n  presentAnalyticFields = buildPresentmentAnalyticFields({\n    buttonOrder: buttonOrder,\n    buttonType: buttonSelected,\n    experimentType: experimentType,\n    pageType: pageType,\n    sessionId: options.paymentReadySessionId,\n  });\n\n  analytics.sendEventPlus(\n    this._client,\n    constants.EVENT_BUTTON_PRESENTED,\n    presentAnalyticFields\n  );\n};\n\nfunction buildPresentmentAnalyticFields(options) {\n  var pkg = {\n    // eslint-disable-next-line camelcase\n    button_type: options.buttonType,\n    // eslint-disable-next-line camelcase\n    payment_ready_session_id: options.sessionId,\n  };\n  if (options.buttonOrder) {\n    pkg[\"payment_ready_button_order\"] = options.buttonOrder;\n  }\n  if (options.experimentType) {\n    pkg[\"payment_ready_experiment_type\"] = options.experimentType;\n  }\n  if (options.pageType) {\n    pkg[\"payment_ready_page_type\"] = options.pageType;\n  }\n\n  return pkg;\n}\n/**\n * Use PayPal Payment Ready to optimize your checkout experience by sending analytics events.\n *\n * @public\n * @param {object} options - The options for the event\n * @param {string} options.paymentReadySessionId - The ID of the session to update.\n * @param {PaymentReady~BUTTON_TYPE} options.buttonType Type of button presented to the user.\n * @returns {void}\n * @example\n * <caption>Sending analytics event</caption>\n * paymentReadyInstance.sendSelectedEvent({\n *   paymentReadySessionId: \"session-abc-123\",\n *   buttonType: \"paypal\"\n * });\n */\nPaymentReady.prototype.sendSelectedEvent = function (options) {\n  if (\n    !options.paymentReadySessionId ||\n    typeof options.paymentReadySessionId !== \"string\"\n  ) {\n    // eslint-disable-next-line no-console\n    console.warn(\n      \"sendSelectedEvent: paymentReadySessionId is missing or invalid\"\n    );\n\n    return;\n  }\n  if (!options.buttonType || typeof options.buttonType !== \"string\") {\n    // eslint-disable-next-line no-console\n    console.warn(\"sendSelectedEvent: buttonType is missing\");\n\n    return;\n  }\n\n  var buttonSelected = options.buttonType;\n\n  if (!Object.values(constants.BUTTON_TYPE).includes(buttonSelected)) {\n    buttonSelected = constants.BUTTON_TYPE.OTHER;\n  }\n\n  analytics.sendEventPlus(this._client, constants.EVENT_BUTTON_SELECTED, {\n    // eslint-disable-next-line camelcase\n    payment_ready_session_id: options.paymentReadySessionId,\n    // eslint-disable-next-line camelcase\n    button_type: buttonSelected,\n  });\n};\n\nmodule.exports = wrapPromise.wrapPrototype(PaymentReady);\n\n},{\"../lib/analytics\":143,\"../lib/braintree-error\":148,\"../lib/has-missing-option\":173,\"./constants\":199,\"./errors\":200,\"@braintree/wrap-promise\":43}],203:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar analytics = _dereq_(\"../../lib/analytics\");\nvar assign = _dereq_(\"../../lib/assign\").assign;\nvar Bus = _dereq_(\"framebus\");\nvar convertMethodsToError = _dereq_(\"../../lib/convert-methods-to-error\");\nvar generateGooglePayConfiguration = _dereq_(\"../../lib/generate-google-pay-configuration\");\nvar iFramer = _dereq_(\"@braintree/iframer\");\nvar uuid = _dereq_(\"@braintree/uuid\");\nvar useMin = _dereq_(\"../../lib/use-min\");\nvar methods = _dereq_(\"../../lib/methods\");\nvar EventEmitter = _dereq_(\"@braintree/event-emitter\");\nvar BraintreeError = _dereq_(\"../../lib/braintree-error\");\nvar VERSION = \"3.134.0\";\nvar constants = _dereq_(\"../shared/constants\");\nvar events = constants.events;\nvar errors = constants.errors;\nvar wrapPromise = _dereq_(\"@braintree/wrap-promise\");\n\n/**\n * @typedef {object} PaymentRequestComponent~tokenizePayload\n * @property {string} nonce The payment method nonce.\n * @property {object} details Additional account details.\n * @property {string} details.bin The BIN number of the card..\n * @property {string} details.cardType Type of card, ex: Visa, MasterCard.\n * @property {string} details.lastFour Last four digits of card number.\n * @property {string} details.lastTwo Last two digits of card number.\n * @property {object} details.rawPaymentResponse The raw payment response from the payment request, with sensitive card details removed.\n * @property {string} description A human-readable description.\n * @property {string} type The payment method type, `CreditCard` or `AndroidPayCard`.\n * @property {object} binData Information about the card based on the bin.\n * @property {string} binData.commercial Possible values: 'Yes', 'No', 'Unknown'.\n * @property {string} binData.countryOfIssuance The country of issuance.\n * @property {string} binData.debit Possible values: 'Yes', 'No', 'Unknown'.\n * @property {string} binData.durbinRegulated Possible values: 'Yes', 'No', 'Unknown'.\n * @property {string} binData.healthcare Possible values: 'Yes', 'No', 'Unknown'.\n * @property {string} binData.issuingBank The issuing bank.\n * @property {string} binData.payroll Possible values: 'Yes', 'No', 'Unknown'.\n * @property {string} binData.prepaid Possible values: 'Yes', 'No', 'Unknown'.\n * @property {string} binData.productId The product id.\n * @property {string} binData.business Possible values: 'Yes', 'No', 'Unknown'.\n * @property {string} binData.consumer Possible values: 'Yes', 'No', 'Unknown'.\n * @property {string} binData.purchase Possible values: 'Yes', 'No', 'Unknown'.\n * @property {string} binData.corporate Possible values: 'Yes', 'No', 'Unknown'.\n */\n\n/**\n * @typedef {object} PaymentRequestComponent~paymentRequestConfiguration\n * @property {object} configuration.details The payment details. For details on this object, see [Google's PaymentRequest API documentation](https://developers.google.com/web/fundamentals/discovery-and-monetization/payment-request/deep-dive-into-payment-request#defining_payment_details).\n * @property {array} [configuration.supportedPaymentMethods] The supported payment methods. If not passed in, the supported payment methods from the merchant account that generated the authorization for the client will be used. For details on this array, see [Google's PaymentRequest API documentation](https://developers.google.com/web/fundamentals/discovery-and-monetization/payment-request/deep-dive-into-payment-request#defining_supported_payment_methods).\n * @property {object} [configuration.options] Additional payment request options. For details on this object, see [Google's PaymentRequest API documentation](https://developers.google.com/web/fundamentals/discovery-and-monetization/payment-request/deep-dive-into-payment-request#defining_options_optional).\n */\n\n/**\n * @typedef {object} PaymentRequestComponent~shippingEventObject\n * @description The event payload sent from {@link PaymentRequestComponent#on|on}.\n * @property {object} target An object which contains data about the event.\n * @property {function} updateWith A method to call with the updated Payment Request details.\n */\n\n/**\n * @name PaymentRequestComponent#on\n * @function\n * @param {string} event The name of the event to which you are subscribing.\n * @param {function} handler A callback to handle the event.\n * @description Subscribes a handler function to a named event. `event` should be {@link PaymentRequestComponent#event:shippingAddressChange|shippingAddressChange} or {@link PaymentRequestComponent#event:shippingOptionChange|shippingOptionChange}. For convenience, you can also listen on `shippingaddresschange` or `shippingoptionchange` to match the event listeners in the [Payment Request API documentation](https://developers.google.com/web/fundamentals/payments/deep-dive-into-payment-request#shipping_in_payment_request_api). Events will emit a {@link PaymentRequestComponent~shippingEventObject|shippingEventObject}.\n * @example\n * <caption>Listening to a Payment Request event, in this case 'shippingAddressChange'</caption>\n * braintree.paymentRequest.create({ ... }, function (createErr, paymentRequestInstance) {\n *   paymentRequestInstance.on('shippingAddressChange', function (event) {\n *     console.log(event.target.shippingAddress);\n *   });\n * });\n * @returns {void}\n */\n\n/**\n * @name PaymentRequestComponent#off\n * @function\n * @param {string} event The name of the event to which you are unsubscribing.\n * @param {function} handler The callback for the event you are unsubscribing from.\n * @description Unsubscribes the handler function to a named event.\n * @example\n * <caption>Subscribing and then unsubscribing from a Payment Request event, in this case 'shippingAddressChange'</caption>\n * braintree.paymentRequest.create({ ... }, function (createErr, paymentRequestInstance) {\n *   var callback = function (event) {\n *     console.log(event.target.shippingAddress);\n *   };\n *   paymentRequestInstance.on('shippingAddressChange', callback);\n *\n *   // later on\n *   paymentRequestInstance.off('shippingAddressChange', callback);\n * });\n * @returns {void}\n */\n\n/**\n * This event is emitted when the customer selects a shipping address.\n * @event PaymentRequestComponent#shippingAddressChange\n * @type {PaymentRequestComponent~shippingEventObject}\n * @example\n * <caption>Listening to a shipping address change event</caption>\n * braintree.paymentRequest.create({ ... }, function (createErr, paymentRequestInstance) {\n *   paymentRequestInstance.on('shippingAddressChange', function (event) {\n *     // validate event.target.shippingAddress if needed\n *\n *     event.updateWith(paymentRequestDetails);\n *   });\n * });\n */\n\n/**\n * This event is emitted when the customer selects a shipping option.\n * @event PaymentRequestComponent#shippingOptionChange\n * @type {PaymentRequestComponent~shippingEventObject}\n * @example\n * <caption>Listening to a shipping option change event</caption>\n * braintree.paymentRequest.create({ ... }, function (createErr, paymentRequestInstance) {\n *   paymentRequestInstance.on('shippingOptionChange', function (event) {\n *     // validate event.target.shippingOption if needed\n *\n *     paymentRequestDetails.shippingOptions.forEach(function (option) {\n *       option.selected = option.id === event.target.shippingOption;\n *     });\n *\n *     event.updateWith(paymentRequestDetails);\n *   });\n * });\n */\n\nvar CARD_TYPE_MAPPINGS = {\n  Visa: \"visa\",\n  MasterCard: \"mastercard\",\n  \"American Express\": \"amex\",\n  \"Diners Club\": \"diners\",\n  Discover: \"discover\",\n  JCB: \"jcb\",\n  UnionPay: \"unionpay\",\n  Maestro: \"maestro\",\n};\n\nvar BRAINTREE_GOOGLE_PAY_MERCHANT_ID = \"18278000977346790994\";\n\nfunction composeUrl(assetsUrl, componentId, isDebug) {\n  var baseUrl = assetsUrl;\n\n  // endRemoveIf(production)\n\n  return (\n    baseUrl +\n    \"/web/\" +\n    VERSION +\n    \"/html/payment-request-frame\" +\n    useMin(isDebug) +\n    \".html#\" +\n    componentId\n  );\n}\n\n/**\n * @class PaymentRequestComponent\n * @param {object} options The Payment Request Component {@link module:braintree-web/payment-request.create create} options.\n * @description <strong>Do not use this constructor directly. Use {@link module:braintree-web/payment-request.create|braintree-web.payment-request.create} instead.</strong>\n *\n * @classdesc This class represents a Payment Request component produced by {@link module:braintree-web/payment-request.create|braintree-web/payment-request.create}. Instances of this class have methods for initializing a Payment Request.\n *\n * **Note:** This component is currently in beta and the API may include breaking changes when upgrading. Please review the [Changelog](https://github.com/braintree/braintree-web/blob/main/CHANGELOG.md) for upgrade steps whenever you upgrade the version of braintree-web.\n */\nfunction PaymentRequestComponent(options) {\n  var enabledPaymentMethods = options.enabledPaymentMethods || {};\n\n  EventEmitter.call(this);\n\n  this._componentId = uuid();\n  this._client = options.client;\n  this._enabledPaymentMethods = {\n    basicCard: enabledPaymentMethods.basicCard !== false,\n    googlePay: enabledPaymentMethods.googlePay !== false,\n  };\n  this._googlePayVersion = options.googlePayVersion === 2 ? 2 : 1;\n  this._googleMerchantId = BRAINTREE_GOOGLE_PAY_MERCHANT_ID;\n  this._supportedPaymentMethods =\n    this._constructDefaultSupportedPaymentMethods();\n  this._defaultSupportedPaymentMethods = Object.keys(\n    this._supportedPaymentMethods\n  ).map(\n    function (key) {\n      return this._supportedPaymentMethods[key];\n    }.bind(this)\n  );\n  this._bus = new Bus({ channel: this._componentId });\n}\n\nEventEmitter.createChild(PaymentRequestComponent);\n\nPaymentRequestComponent.prototype._constructDefaultSupportedPaymentMethods =\n  function () {\n    var configuration = this._client.getConfiguration();\n    var androidPayConfiguration = configuration.gatewayConfiguration.androidPay;\n    var cardConfiguration = configuration.gatewayConfiguration.creditCards;\n    var supportedPaymentMethods = {};\n\n    if (\n      this._enabledPaymentMethods.basicCard &&\n      cardConfiguration &&\n      cardConfiguration.supportedCardTypes.length > 0\n    ) {\n      supportedPaymentMethods.basicCard = {\n        supportedMethods: \"basic-card\",\n        data: {\n          supportedNetworks: cardConfiguration.supportedCardTypes.reduce(\n            function (types, cardType) {\n              if (cardType in CARD_TYPE_MAPPINGS) {\n                types.push(CARD_TYPE_MAPPINGS[cardType]);\n              }\n\n              return types;\n            },\n            []\n          ),\n        },\n      };\n    }\n\n    if (\n      this._enabledPaymentMethods.googlePay &&\n      androidPayConfiguration &&\n      androidPayConfiguration.enabled\n    ) {\n      supportedPaymentMethods.googlePay = {\n        supportedMethods: \"https://google.com/pay\",\n        data: generateGooglePayConfiguration(\n          configuration,\n          this._googlePayVersion,\n          this._googleMerchantId\n        ),\n      };\n    }\n\n    return supportedPaymentMethods;\n  };\n\nPaymentRequestComponent.prototype.initialize = function () {\n  var clientConfiguration = this._client.getConfiguration();\n  var self = this;\n\n  this._frame = iFramer({\n    allowPaymentRequest: true,\n    name: \"braintree-payment-request-frame\",\n    class: \"braintree-payment-request-frame\",\n    height: 0,\n    width: 0,\n    style: {\n      position: \"absolute\",\n      left: \"-9999px\",\n    },\n    title: \"Secure Payment Frame\",\n  });\n\n  if (this._defaultSupportedPaymentMethods.length === 0) {\n    return Promise.reject(\n      new BraintreeError(\n        errors.PAYMENT_REQUEST_NO_VALID_SUPPORTED_PAYMENT_METHODS\n      )\n    );\n  }\n\n  return new Promise(function (resolve) {\n    self._bus.on(events.FRAME_READY, function (reply) {\n      reply(self._client);\n    });\n    self._bus.on(events.FRAME_CAN_MAKE_REQUESTS, function () {\n      analytics.sendEvent(self._client, \"payment-request.initialized\");\n      self._bus.on(events.SHIPPING_ADDRESS_CHANGE, function (shippingAddress) {\n        var shippingAddressChangeEvent = {\n          target: {\n            shippingAddress: shippingAddress,\n          },\n          updateWith: function (paymentDetails) {\n            self._bus.emit(events.UPDATE_SHIPPING_ADDRESS, paymentDetails);\n          },\n        };\n\n        self._emit(\"shippingAddressChange\", shippingAddressChangeEvent);\n        self._emit(\"shippingaddresschange\", shippingAddressChangeEvent);\n      });\n      self._bus.on(events.SHIPPING_OPTION_CHANGE, function (shippingOption) {\n        var shippingOptionChangeEvent = {\n          target: {\n            shippingOption: shippingOption,\n          },\n          updateWith: function (paymentDetails) {\n            self._bus.emit(events.UPDATE_SHIPPING_OPTION, paymentDetails);\n          },\n        };\n\n        self._emit(\"shippingOptionChange\", shippingOptionChangeEvent);\n        self._emit(\"shippingoptionchange\", shippingOptionChangeEvent);\n      });\n      resolve(self);\n    });\n\n    // eslint-disable-next-line no-warning-comments\n    // TODO - We may need to apply the same setTimeout hack that Hosted Fields\n    // uses for iframes to load correctly in Edge. See:\n    // https://github.com/braintree/braintree-web/blob/0c951e5f9859c606652485de14188b6bd6656677/src/hosted-fields/external/hosted-fields.js#L449-L469\n    self._frame.src = composeUrl(\n      clientConfiguration.gatewayConfiguration.assetsUrl,\n      self._componentId,\n      clientConfiguration.isDebug\n    );\n    document.body.appendChild(self._frame);\n  });\n};\n\n/**\n * Create an object to pass into tokenize to specify a custom configuration. If no overrides are provided, the default configuration will be provided.\n * @public\n * @param {string} type The supported payment method type. Possible values are `basicCard` and `googlePay`.\n * If no type is provided, the function will throw an error. If the type provided is not an enabled payment method for the merchant account , the function will throw an error.\n * @param {object} [overrides] The configuration overrides for the [data property on the supported payment methods objects](https://developers.google.com/web/fundamentals/payments/deep-dive-into-payment-request). If not passed in, the default configuration for the specified type will be provided. If a property is not provided, the value from the default configuration will be used.\n * @example <caption>Getting the default configuration for a specified type</caption>\n * var configuration = paymentRequestInstance.createSupportedPaymentMethodsConfiguration('basicCard');\n *\n * configuration.supportedMethods; // 'basic-card'\n * configuration.data.supportedNetworks; // ['visa', 'mastercard', 'amex'] <- whatever the supported card networks for the merchant account are\n * @example <caption>Specifying overrides</caption>\n * var configuration = paymentRequestInstance.createSupportedPaymentMethodsConfiguration('basicCard', {\n *   supportedNetworks: ['visa'],\n *   supportedTypes: ['credit', 'debit']\n * });\n *\n * configuration.supportedMethods; // 'basic-card'\n * configuration.data.supportedNetworks; // ['visa']\n * configuration.data.supportedTypes; // ['credit', 'debit']\n * @returns {object} Returns a configuration object for use in the tokenize function.\n */\nPaymentRequestComponent.prototype.createSupportedPaymentMethodsConfiguration =\n  function (type, overrides) {\n    var configuration;\n\n    if (!type) {\n      throw new BraintreeError(\n        errors.PAYMENT_REQUEST_CREATE_SUPPORTED_PAYMENT_METHODS_CONFIGURATION_MUST_INCLUDE_TYPE\n      );\n    }\n\n    if (!this._enabledPaymentMethods[type]) {\n      throw new BraintreeError(\n        errors.PAYMENT_REQUEST_CREATE_SUPPORTED_PAYMENT_METHODS_CONFIGURATION_TYPE_NOT_ENABLED\n      );\n    }\n\n    configuration = assign({}, this._supportedPaymentMethods[type]);\n    configuration.data = assign({}, configuration.data, overrides);\n\n    return configuration;\n  };\n\n/**\n * Tokenizes a Payment Request\n * @public\n * @param {object} configuration A {@link PaymentRequestComponent~paymentRequestConfiguration|paymentRequestConfiguration}.\n * @param {callback} [callback] The second argument, <code>data</code>, is a {@link PaymentRequest~paymentPayload|paymentPayload}. If no callback is provided, `tokenize` returns a function that resolves with a {@link PaymentRequestComponent~tokenizePayload|tokenizePayload}.\n * @example\n * paymentRequestInstance.tokenize({\n *   details: {\n *     total: {\n *       label: 'Price',\n *       amount: {\n *         currency: 'USD',\n *         value: '100.00'\n *       }\n *     }\n *   }\n * }).then(function (payload) {\n *   // send payload.nonce to server\n *\n *   // examine the raw response (with card details removed for security) from the payment request\n *   console.log(payload.details.rawPaymentResponse);\n * }).catch(function (err) {\n *   if (err.code === 'PAYMENT_REQUEST_CANCELED') {\n *     // payment request was canceled by user\n *   } else {\n *     // an error occurred while processing\n *   }\n * });\n * @example <caption>Tokenize only Visa cards</caption>\n * var basicCardConfiguration = paymentRequestInstance.createSupportedPaymentMethodsConfiguration('basicCard', {\n *   supportedNetworks: ['visa']\n * };\n *\n * paymentRequestInstance.tokenize({\n *   supportedPaymentMethods: [basicCardConfiguration],\n *   details: {\n *     total: {\n *       label: 'Price',\n *       amount: {\n *         currency: 'USD',\n *         value: '100.00'\n *       }\n *     }\n *   }\n * }).then(function (payload) {\n *   // send payload.nonce to your server\n * });\n * @example <caption>Include payment request options</caption>\n * paymentRequestInstance.tokenize({\n *   details: {\n *     total: {\n *       label: 'Price',\n *       amount: {\n *         currency: 'USD',\n *         value: '100.00'\n *       }\n *     }\n *   },\n *   options: {\n *     requestPayerName: true,\n *     requestPayerPhone: true,\n *     requestPayerEmail: true\n *   }\n * }).then(function (payload) {\n *   // send payload.nonce to your server\n *   // collect additional info from the raw response\n *   console.log(payload.details.rawPaymentResponse);\n * });\n * @example <caption>Request Shipping Information</caption>\n * var shippingOptions = [\n *   {\n *     id: 'economy',\n *     label: 'Economy Shipping (5-7 Days)',\n *     amount: {\n *       currency: 'USD',\n *       value: '0',\n *     },\n *   }, {\n *     id: 'express',\n *     label: 'Express Shipping (2-3 Days)',\n *     amount: {\n *       currency: 'USD',\n *       value: '5',\n *     },\n *   }, {\n *     id: 'next-day',\n *     label: 'Next Day Delivery',\n *     amount: {\n *       currency: 'USD',\n *       value: '12',\n *     },\n *   },\n * ];\n * var paymentDetails = {\n * \t total: {\n *     label: 'Total',\n *     amount: {\n *       currency: 'USD',\n *       value: '10.00',\n *     }\n *   },\n *   shippingOptions: shippingOptions\n * };\n *\n * paymentRequestInstance.on('shippingAddressChange', function (event) {\n *   // validate shipping address on event.target.shippingAddress\n *   // make changes to the paymentDetails or shippingOptions if necessary\n *\n *   event.updateWith(paymentDetails)\n * });\n *\n * paymentRequestInstance.on('shippingOptionChange', function (event) {\n *   shippingOptions.forEach(function (option) {\n *     option.selected = option.id === event.target.shippingOption;\n *   });\n *\n *   event.updateWith(paymentDetails)\n * });\n *\n * paymentRequestInstance.tokenize({\n *   details: paymentDetails,\n *   options: {\n *     requestShipping: true\n *   }\n * }).then(function (payload) {\n *   // send payload.nonce to your server\n *   // collect shipping information from payload\n *   console.log(payload.details.rawPaymentResponse.shippingAddress);\n * });\n * @returns {(Promise|void)} Returns a promise if no callback is provided.\n */\nPaymentRequestComponent.prototype.tokenize = function (configuration) {\n  var self = this;\n\n  // NEXT_MAJOR_VERSION fail early if a payment method is passed in\n  // that the component does not support\n  return new Promise(function (resolve, reject) {\n    self._bus.emit(\n      events.PAYMENT_REQUEST_INITIALIZED,\n      {\n        supportedPaymentMethods:\n          configuration.supportedPaymentMethods ||\n          self._defaultSupportedPaymentMethods,\n        details: configuration.details,\n        options: configuration.options,\n      },\n      function (response) {\n        var rawError = response[0];\n        var payload = response[1];\n\n        if (rawError) {\n          reject(self._formatTokenizationError(rawError));\n\n          return;\n        }\n\n        analytics.sendEvent(self._client, \"payment-request.tokenize.succeeded\");\n        resolve({\n          nonce: payload.nonce,\n          type: payload.type,\n          description: payload.description,\n          details: {\n            rawPaymentResponse: payload.details.rawPaymentResponse,\n            cardType: payload.details.cardType,\n            lastFour: payload.details.lastFour,\n            lastTwo: payload.details.lastTwo,\n          },\n          binData: payload.binData,\n        });\n      }\n    );\n  });\n};\n\n/**\n * Check if the customer can make payments.\n * @public\n * @param {object} configuration A {@link PaymentRequestComponent~paymentRequestConfiguration|paymentRequestConfiguration}.\n * @param {callback} [callback] Called on completion.\n * @example\n * var paymentDetails = {\n * \t total: {\n *     label: 'Total',\n *     amount: {\n *       currency: 'USD',\n *       value: '10.00',\n *     }\n *   }\n * };\n *\n * paymentRequestInstance.canMakePayment({\n *   details: paymentDetails\n * }).then(function (result) {\n *   if (result) {\n *     // set up payment request button\n *   }\n * });\n * @returns {(Promise|void)} Returns a promise if no callback is provided.\n */\nPaymentRequestComponent.prototype.canMakePayment = function (configuration) {\n  var self = this;\n  var unsupportedPaymentMethod;\n\n  // NEXT_MAJOR_VERSION Move this check to component creation\n  if (!window.PaymentRequest) {\n    analytics.sendEvent(\n      self._client,\n      \"payment-request.can-make-payment.not-available\"\n    );\n\n    return Promise.resolve(false);\n  }\n\n  if (configuration.supportedPaymentMethods) {\n    configuration.supportedPaymentMethods.forEach(function (config) {\n      var supportedMethods = config.supportedMethods;\n\n      if (!(supportedMethods in constants.SUPPORTED_METHODS)) {\n        unsupportedPaymentMethod = supportedMethods;\n      }\n    });\n\n    if (unsupportedPaymentMethod) {\n      return Promise.reject(\n        new BraintreeError({\n          type: errors.PAYMENT_REQUEST_UNSUPPORTED_PAYMENT_METHOD.type,\n          code: errors.PAYMENT_REQUEST_UNSUPPORTED_PAYMENT_METHOD.code,\n          message:\n            unsupportedPaymentMethod + \" is not a supported payment method.\",\n        })\n      );\n    }\n  }\n\n  return new Promise(function (resolve, reject) {\n    self._bus.emit(\n      events.CAN_MAKE_PAYMENT,\n      {\n        supportedPaymentMethods:\n          configuration.supportedPaymentMethods ||\n          self._defaultSupportedPaymentMethods,\n        details: configuration.details,\n        options: configuration.options,\n      },\n      function (response) {\n        var error = response[0];\n        var payload = response[1];\n\n        if (error) {\n          reject(self._formatCanMakePaymentError(error));\n\n          return;\n        }\n\n        analytics.sendEvent(\n          self._client,\n          \"payment-request.can-make-payment.\" + payload\n        );\n\n        resolve(payload);\n      }\n    );\n  });\n};\n\n/**\n * Cleanly remove anything set up by {@link module:braintree-web/payment-request.create|create}.\n * @public\n * @param {callback} [callback] Called on completion.\n * @example\n * paymentRequestInstance.teardown();\n * @example <caption>With callback</caption>\n * paymentRequestInstance.teardown(function () {\n *   // teardown is complete\n * });\n * @returns {(Promise|void)} Returns a promise if no callback is provided.\n */\nPaymentRequestComponent.prototype.teardown = function () {\n  this._bus.teardown();\n  this._frame.parentNode.removeChild(this._frame);\n\n  convertMethodsToError(this, methods(PaymentRequestComponent.prototype));\n\n  analytics.sendEvent(this._client, \"payment-request.teardown-completed\");\n\n  return Promise.resolve();\n};\n\nPaymentRequestComponent.prototype._formatTokenizationError = function (error) {\n  var formattedError;\n\n  switch (error.name) {\n    case \"AbortError\":\n      formattedError = new BraintreeError({\n        type: errors.PAYMENT_REQUEST_CANCELED.type,\n        code: errors.PAYMENT_REQUEST_CANCELED.code,\n        message: errors.PAYMENT_REQUEST_CANCELED.message,\n        details: {\n          originalError: error,\n        },\n      });\n\n      analytics.sendEvent(this._client, \"payment-request.tokenize.canceled\");\n\n      return formattedError;\n    case \"PAYMENT_REQUEST_INITIALIZATION_FAILED\":\n      formattedError = new BraintreeError({\n        type: errors.PAYMENT_REQUEST_INITIALIZATION_MISCONFIGURED.type,\n        code: errors.PAYMENT_REQUEST_INITIALIZATION_MISCONFIGURED.code,\n        message: errors.PAYMENT_REQUEST_INITIALIZATION_MISCONFIGURED.message,\n        details: {\n          originalError: error,\n        },\n      });\n      break;\n    case \"BRAINTREE_GATEWAY_GOOGLE_PAYMENT_TOKENIZATION_ERROR\":\n      formattedError = new BraintreeError({\n        type: errors.PAYMENT_REQUEST_GOOGLE_PAYMENT_FAILED_TO_TOKENIZE.type,\n        code: errors.PAYMENT_REQUEST_GOOGLE_PAYMENT_FAILED_TO_TOKENIZE.code,\n        message:\n          errors.PAYMENT_REQUEST_GOOGLE_PAYMENT_FAILED_TO_TOKENIZE.message,\n        details: {\n          originalError: error,\n        },\n      });\n      break;\n    case \"BRAINTREE_GATEWAY_GOOGLE_PAYMENT_PARSING_ERROR\":\n      formattedError = new BraintreeError({\n        type: errors.PAYMENT_REQUEST_GOOGLE_PAYMENT_PARSING_ERROR.type,\n        code: errors.PAYMENT_REQUEST_GOOGLE_PAYMENT_PARSING_ERROR.code,\n        message: errors.PAYMENT_REQUEST_GOOGLE_PAYMENT_PARSING_ERROR.message,\n        details: {\n          originalError: error,\n        },\n      });\n      break;\n    default:\n      formattedError = new BraintreeError({\n        code: errors.PAYMENT_REQUEST_NOT_COMPLETED.code,\n        type: error.type || BraintreeError.types.CUSTOMER,\n        message: errors.PAYMENT_REQUEST_NOT_COMPLETED.message,\n        details: {\n          originalError: error,\n        },\n      });\n  }\n\n  analytics.sendEvent(this._client, \"payment-request.tokenize.failed\");\n\n  return formattedError;\n};\n\nPaymentRequestComponent.prototype._formatCanMakePaymentError = function (\n  error\n) {\n  var formattedError;\n\n  switch (error.name) {\n    case \"PAYMENT_REQUEST_INITIALIZATION_FAILED\":\n      formattedError = new BraintreeError({\n        type: errors.PAYMENT_REQUEST_INITIALIZATION_MISCONFIGURED.type,\n        code: errors.PAYMENT_REQUEST_INITIALIZATION_MISCONFIGURED.code,\n        message: errors.PAYMENT_REQUEST_INITIALIZATION_MISCONFIGURED.message,\n        details: {\n          originalError: error,\n        },\n      });\n      break;\n    case \"NotAllowedError\":\n      formattedError = new BraintreeError({\n        type: errors.PAYMENT_REQUEST_CAN_MAKE_PAYMENT_NOT_ALLOWED.type,\n        code: errors.PAYMENT_REQUEST_CAN_MAKE_PAYMENT_NOT_ALLOWED.code,\n        message: errors.PAYMENT_REQUEST_CAN_MAKE_PAYMENT_NOT_ALLOWED.message,\n        details: {\n          originalError: error,\n        },\n      });\n      break;\n    default:\n      formattedError = new BraintreeError({\n        code: errors.PAYMENT_REQUEST_CAN_MAKE_PAYMENT_FAILED.code,\n        type: errors.PAYMENT_REQUEST_CAN_MAKE_PAYMENT_FAILED.type,\n        message: errors.PAYMENT_REQUEST_CAN_MAKE_PAYMENT_FAILED.message,\n        details: {\n          originalError: error,\n        },\n      });\n  }\n\n  analytics.sendEvent(this._client, \"payment-request.can-make-payment.failed\");\n\n  return formattedError;\n};\n\nmodule.exports = wrapPromise.wrapPrototype(PaymentRequestComponent);\n\n},{\"../../lib/analytics\":143,\"../../lib/assign\":145,\"../../lib/braintree-error\":148,\"../../lib/convert-methods-to-error\":150,\"../../lib/generate-google-pay-configuration\":172,\"../../lib/methods\":180,\"../../lib/use-min\":186,\"../shared/constants\":205,\"@braintree/event-emitter\":33,\"@braintree/iframer\":35,\"@braintree/uuid\":39,\"@braintree/wrap-promise\":43,\"framebus\":54}],204:[function(_dereq_,module,exports){\n\"use strict\";\n/**\n * @module braintree-web/payment-request\n * @description A component to integrate with the Payment Request API.\n *\n * **Note:** This component is currently in beta and the API may include breaking changes when upgrading. Please review the [Changelog](https://github.com/braintree/braintree-web/blob/main/CHANGELOG.md) for upgrade steps whenever you upgrade the version of braintree-web.\n * */\n\nvar PaymentRequestComponent = _dereq_(\"./external/payment-request\");\nvar basicComponentVerification = _dereq_(\"../lib/basic-component-verification\");\nvar createDeferredClient = _dereq_(\"../lib/create-deferred-client\");\nvar createAssetsUrl = _dereq_(\"../lib/create-assets-url\");\nvar wrapPromise = _dereq_(\"@braintree/wrap-promise\");\nvar VERSION = \"3.134.0\";\n\n/**\n * @static\n * @function create\n * @param {object} options Creation options:\n * @param {Client} [options.client] A {@link Client} instance.\n * @param {string} [options.authorization] A tokenizationKey or clientToken. Can be used in place of `options.client`.\n * @param {object} [options.enabledPaymentMethods] An object representing which payment methods to display.\n * @param {boolean} [options.enabledPaymentMethods.basicCard=true] Whether or not to display credit card as an option in the Payment Request dialog. If left blank or set to true, credit cards will be displayed in the dialog if the merchant account is set up to process credit cards.\n * @param {boolean} [options.enabledPaymentMethods.googlePay=true] Whether or not to display Google Pay as an option in the Payment Request dialog. If left blank or set to true, Google Pay will be displayed in the dialog if the merchant account is set up to process Google Pay.\n * @param {Number} [options.googlePayVersion=1] Ignored if `options.enabledPaymentMethods.googlePay = false`. If `true`, this option specifies the version of Google Pay to use. Choose either 1 (default) or 2.\n * @param {callback} [callback] The second argument, `data`, is the {@link PaymentRequestComponent} instance. If no callback is provided, `create` returns a promise that resolves with the {@link PaymentRequestComponent} instance.\n * @returns {(Promise|void)} Returns a promise if no callback is provided.\n * @example\n * if (window.PaymentRequest) {\n *   braintree.paymentRequest.create({\n *     client: clientInstance\n *   }, cb);\n * } else {\n *   // fall back to Hosted Fields if browser does not support Payment Request API\n *   braintree.hostedFields.create(hostedFieldsOptions, cb);\n * }\n * @example <caption>Explicitly turning off credit cards from Payment Request API dialog</caption>\n * braintree.paymentRequest.create({\n *   client: clientInstance,\n *   enabledPaymentMethods: {\n *     googlePay: true,\n *     basicCard: false\n *   }\n * }, cb);\n * @example <caption>Using Google Pay v2 or basic card</caption>\n * braintree.paymentRequest.create({\n *   client: clientInstance,\n *   enabledPaymentMethods: {\n *     basicCard: true,\n *     googlePay: true\n *   },\n *   googlePayVersion: 2\n * }, cb);\n *\n */\nfunction create(options) {\n  var name = \"Payment Request\";\n\n  return basicComponentVerification\n    .verify({\n      name: name,\n      client: options.client,\n      authorization: options.authorization,\n    })\n    .then(function () {\n      return createDeferredClient.create({\n        authorization: options.authorization,\n        client: options.client,\n        debug: options.debug,\n        assetsUrl: createAssetsUrl.create(options.authorization),\n        name: name,\n      });\n    })\n    .then(function (client) {\n      var paymentRequestInstance;\n\n      options.client = client;\n      paymentRequestInstance = new PaymentRequestComponent(options);\n\n      return paymentRequestInstance.initialize();\n    });\n}\n\nmodule.exports = {\n  create: wrapPromise(create),\n  /**\n   * @description The current version of the SDK, i.e. `{@pkg version}`.\n   * @type {string}\n   */\n  VERSION: VERSION,\n};\n\n},{\"../lib/basic-component-verification\":146,\"../lib/create-assets-url\":152,\"../lib/create-deferred-client\":154,\"./external/payment-request\":203,\"@braintree/wrap-promise\":43}],205:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar enumerate = _dereq_(\"../../lib/enumerate\");\nvar errors = _dereq_(\"./errors\");\n\nvar constants = {};\n\nconstants.events = enumerate(\n  [\n    \"CAN_MAKE_PAYMENT\",\n    \"FRAME_READY\",\n    \"FRAME_CAN_MAKE_REQUESTS\",\n    \"PAYMENT_REQUEST_INITIALIZED\",\n    \"SHIPPING_ADDRESS_CHANGE\",\n    \"UPDATE_SHIPPING_ADDRESS\",\n    \"SHIPPING_OPTION_CHANGE\",\n    \"UPDATE_SHIPPING_OPTION\",\n  ],\n  \"payment-request:\"\n);\n\nconstants.errors = errors;\n\nconstants.SUPPORTED_METHODS = {\n  \"basic-card\": true,\n  \"https://google.com/pay\": true,\n};\n\nmodule.exports = constants;\n\n},{\"../../lib/enumerate\":157,\"./errors\":206}],206:[function(_dereq_,module,exports){\n\"use strict\";\n\n/**\n * @name BraintreeError.Payment Request - Creation Error Codes\n * @description Errors that occur when [creating the Payment Request component](./module-braintree-web_payment-request.html#.create).\n * @property {MERCHANT} PAYMENT_REQUEST_NO_VALID_SUPPORTED_PAYMENT_METHODS Occurs when there are no valid payment methods configured.\n */\n\n/**\n * @name BraintreeError.Payment Request - createSupportedPaymentMethodsConfiguration  Error Codes\n * @description Errors that occur when using the [`createSupportedPaymentMethodsConfiguration` method](./PaymentRequestComponent.html#createSupportedPaymentMethodsConfiguration)\n * @property {MERCHANT} PAYMENT_REQUEST_CREATE_SUPPORTED_PAYMENT_METHODS_CONFIGURATION_MUST_INCLUDE_TYPE Occurs when no type is supplied for method.\n * @property {MERCHANT} PAYMENT_REQUEST_CREATE_SUPPORTED_PAYMENT_METHODS_CONFIGURATION_TYPE_NOT_ENABLED Occurs when configured type is not enabled.\n */\n\n/**\n * @name BraintreeError.Payment Request - tokenize  Error Codes\n * @description Errors that occur when using the [`tokenize` method](./PaymentRequestComponent.html#tokenize)\n * @property {CUSTOMER} PAYMENT_REQUEST_CANCELED Occurs when customer cancels the Payment Request.\n * @property {MERCHANT} PAYMENT_REQUEST_INITIALIZATION_MISCONFIGURED Occurs when the Payment Request is closed do to the options being misconfigured.\n * @property {MERCHANT} PAYMENT_REQUEST_GOOGLE_PAYMENT_FAILED_TO_TOKENIZE Occurs when a Google Payment payment method is unable to be tokenized.\n * @property {UNKNOWN} PAYMENT_REQUEST_GOOGLE_PAYMENT_PARSING_ERROR Occurs when the result of tokenizing a Google Payment payment method could not be parsed.\n * @property {CUSTOMER} PAYMENT_REQUEST_NOT_COMPLETED Occurs when an error prevented the Payment Request from being completed.\n */\n\n/**\n * @name BraintreeError.Payment Request - canMakePayment  Error Codes\n * @description Errors that occur when using the [`canMakePayment` method](./PaymentRequestComponent.html#canMakePayment)\n * @property {MERCHANT} PAYMENT_REQUEST_INITIALIZATION_MISCONFIGURED Occurs when the Payment Request is instantiated with misconfigured options.\n * @property {MERCHANT} PAYMENT_REQUEST_CAN_MAKE_PAYMENT_NOT_ALLOWED Occurs when `canMakePayment` results in a `DomException` with a `NotAllowedError`. This usually occurs when `canMakePayment` is called multiple times with different supported payment options.\n * @property {MERCHANT} PAYMENT_REQUEST_UNSUPPORTED_PAYMENT_METHOD Occurs when `canMakePayment` is called with a `supportedPaymentMethods` array that contains a payment method that is not supported by the Braintree SDK.\n * @property {UNKNOWN} PAYMENT_REQUEST_CAN_MAKE_PAYMENT_FAILED Occurs when `canMakePayment` fails for any reason other than a misconfigured Payment Request object.\n */\n\nvar BraintreeError = _dereq_(\"../../lib/braintree-error\");\n\nmodule.exports = {\n  PAYMENT_REQUEST_NO_VALID_SUPPORTED_PAYMENT_METHODS: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"PAYMENT_REQUEST_NO_VALID_SUPPORTED_PAYMENT_METHODS\",\n    message:\n      \"There are no supported payment methods associated with this account.\",\n  },\n  PAYMENT_REQUEST_CANCELED: {\n    type: BraintreeError.types.CUSTOMER,\n    code: \"PAYMENT_REQUEST_CANCELED\",\n    message: \"Payment request was canceled.\",\n  },\n  PAYMENT_REQUEST_INITIALIZATION_MISCONFIGURED: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"PAYMENT_REQUEST_INITIALIZATION_MISCONFIGURED\",\n    message: \"Something went wrong when configuring the payment request.\",\n  },\n  PAYMENT_REQUEST_CAN_MAKE_PAYMENT_FAILED: {\n    type: BraintreeError.types.UNKNOWN,\n    code: \"PAYMENT_REQUEST_CAN_MAKE_PAYMENT_FAILED\",\n    message: \"Something went wrong when calling `canMakePayment`\",\n  },\n  PAYMENT_REQUEST_CAN_MAKE_PAYMENT_NOT_ALLOWED: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"PAYMENT_REQUEST_CAN_MAKE_PAYMENT_NOT_ALLOWED\",\n    message:\n      \"Something went wrong when calling `canMakePayment`. Most likely, `canMakePayment` was called multiple times with different supportedMethods configurations.\",\n  },\n  PAYMENT_REQUEST_UNSUPPORTED_PAYMENT_METHOD: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"PAYMENT_REQUEST_UNSUPPORTED_PAYMENT_METHOD\",\n  },\n  PAYMENT_REQUEST_GOOGLE_PAYMENT_FAILED_TO_TOKENIZE: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"PAYMENT_REQUEST_GOOGLE_PAYMENT_FAILED_TO_TOKENIZE\",\n    message: \"Something went wrong when tokenizing the Google Pay card.\",\n  },\n  PAYMENT_REQUEST_GOOGLE_PAYMENT_PARSING_ERROR: {\n    type: BraintreeError.types.UNKNOWN,\n    code: \"PAYMENT_REQUEST_GOOGLE_PAYMENT_PARSING_ERROR\",\n    message: \"Something went wrong when tokenizing the Google Pay card.\",\n  },\n  PAYMENT_REQUEST_NOT_COMPLETED: {\n    code: \"PAYMENT_REQUEST_NOT_COMPLETED\",\n    message: \"Payment request could not be completed.\",\n  },\n  PAYMENT_REQUEST_CREATE_SUPPORTED_PAYMENT_METHODS_CONFIGURATION_MUST_INCLUDE_TYPE:\n    {\n      type: BraintreeError.types.MERCHANT,\n      code: \"PAYMENT_REQUEST_CREATE_SUPPORTED_PAYMENT_METHODS_CONFIGURATION_MUST_INCLUDE_TYPE\",\n      message:\n        \"createSupportedPaymentMethodsConfiguration must include a type parameter.\",\n    },\n  PAYMENT_REQUEST_CREATE_SUPPORTED_PAYMENT_METHODS_CONFIGURATION_TYPE_NOT_ENABLED:\n    {\n      type: BraintreeError.types.MERCHANT,\n      code: \"PAYMENT_REQUEST_CREATE_SUPPORTED_PAYMENT_METHODS_CONFIGURATION_TYPE_NOT_ENABLED\",\n      message:\n        \"createSupportedPaymentMethodsConfiguration type parameter must be valid or enabled.\",\n    },\n};\n\n},{\"../../lib/braintree-error\":148}],207:[function(_dereq_,module,exports){\n\"use strict\";\n\n/**\n * @name BraintreeError.PayPal Checkout - Creation Error Codes\n * @description Errors that occur when [creating the PayPal Checkout component](./module-braintree-web_paypal-checkout.html#.create).\n * @property {MERCHANT} PAYPAL_NOT_ENABLED Occurs when PayPal is not enabled on the Braintree control panel.\n * @property {MERCHANT} PAYPAL_SANDBOX_ACCOUNT_NOT_LINKED Occurs only when testing in Sandbox, when a PayPal sandbox account is not linked to the merchant account in the Braintree control panel.\n */\n\n/**\n * @name BraintreeError.PayPal Checkout - createPayment Error Codes\n * @description Errors that occur when using the [`createPayment` method](./PayPalCheckout.html#createPayment).\n * @property {MERCHANT} PAYPAL_FLOW_OPTION_REQUIRED Occurs when a required option is missing.\n * @property {MERCHANT} PAYPAL_INVALID_PAYMENT_OPTION Occurs when an option contains an invalid value.\n * @property {NETWORK} PAYPAL_FLOW_FAILED Occurs when something goes wrong when initializing the flow.\n */\n\n/**\n * @name BraintreeError.PayPal Checkout - startVaultInitiatedCheckout Error Codes\n * @description Errors that occur when using the [`startVaultInitiatedCheckout` method](./PayPalCheckout.html#startVaultInitiatedCheckout).\n * @property {MERCHANT} PAYPAL_START_VAULT_INITIATED_CHECKOUT_PARAM_REQUIRED Occurs when a required param is missing when calling the method.\n * @property {MERCHANT} PAYPAL_START_VAULT_INITIATED_CHECKOUT_POPUP_OPEN_FAILED Occurs when PayPal window could not be opened. This often occurs because the call to start the vault initiated flow was not triggered from a click event.\n * @property {CUSTOMER} PAYPAL_START_VAULT_INITIATED_CHECKOUT_CANCELED Occurs when a customer closes the PayPal flow before completion.\n * @property {MERCHANT} PAYPAL_START_VAULT_INITIATED_CHECKOUT_IN_PROGRESS Occurs when the flow is initialized while an authorization is already in progress.\n * @property {NETWORK} PAYPAL_START_VAULT_INITIATED_CHECKOUT_SETUP_FAILED Occurs when something went wrong setting up the flow.\n */\n\n/**\n * @name BraintreeError.PayPal Checkout - tokenizePayment Error Codes\n * @description Errors that occur when using the [`tokenizePayment` method](./PayPalCheckout.html#tokenizePayment).\n * @property {NETWORK} PAYPAL_ACCOUNT_TOKENIZATION_FAILED Occurs when PayPal account could not be tokenized.\n */\n\n/**\n * @name BraintreeError.Paypal Checkout - updatePayment Error Codes\n * @description Errors that occur when using the [`updatePayment` method](./PayPalCheckout.html#updatePayment).\n * @property {MERCHANT} PAYPAL_INVALID_PAYMENT_OPTION Occurs when an option contains an invalid value.\n * @property {MERCHANT} PAYPAL_MISSING_REQUIRED_OPTION Occurs when a required option is missing.\n * @property {NETWORK} PAYPAL_FLOW_FAILED Occurs when something goes wrong when initializing the flow or communicating with the server.\n */\nvar BraintreeError = _dereq_(\"../lib/braintree-error\");\n\nmodule.exports = {\n  PAYPAL_NOT_ENABLED: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"PAYPAL_NOT_ENABLED\",\n    message: \"PayPal is not enabled for this merchant.\",\n  },\n  PAYPAL_SANDBOX_ACCOUNT_NOT_LINKED: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"PAYPAL_SANDBOX_ACCOUNT_NOT_LINKED\",\n    message:\n      \"A linked PayPal Sandbox account is required to use PayPal Checkout in Sandbox. See https://developer.paypal.com/braintree/docs/guides/paypal/testing-go-live#linked-paypal-testing for details on linking your PayPal sandbox with Braintree.\",\n  },\n  PAYPAL_ACCOUNT_TOKENIZATION_FAILED: {\n    type: BraintreeError.types.NETWORK,\n    code: \"PAYPAL_ACCOUNT_TOKENIZATION_FAILED\",\n    message: \"Could not tokenize user's PayPal account.\",\n  },\n  PAYPAL_FLOW_FAILED: {\n    type: BraintreeError.types.NETWORK,\n    code: \"PAYPAL_FLOW_FAILED\",\n    message: \"Could not initialize PayPal flow.\",\n  },\n  PAYPAL_FLOW_OPTION_REQUIRED: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"PAYPAL_FLOW_OPTION_REQUIRED\",\n    message: \"PayPal flow property is invalid or missing.\",\n  },\n  PAYPAL_START_VAULT_INITIATED_CHECKOUT_PARAM_REQUIRED: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"PAYPAL_START_VAULT_INITIATED_CHECKOUT_PARAM_REQUIRED\",\n  },\n  PAYPAL_START_VAULT_INITIATED_CHECKOUT_SETUP_FAILED: {\n    type: BraintreeError.types.NETWORK,\n    code: \"PAYPAL_START_VAULT_INITIATED_CHECKOUT_SETUP_FAILED\",\n    message: \"Something went wrong when setting up the checkout workflow.\",\n  },\n  PAYPAL_START_VAULT_INITIATED_CHECKOUT_POPUP_OPEN_FAILED: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"PAYPAL_START_VAULT_INITIATED_CHECKOUT_POPUP_OPEN_FAILED\",\n    message:\n      \"PayPal popup failed to open, make sure to initiate the vault checkout in response to a user action.\",\n  },\n  PAYPAL_START_VAULT_INITIATED_CHECKOUT_CANCELED: {\n    type: BraintreeError.types.CUSTOMER,\n    code: \"PAYPAL_START_VAULT_INITIATED_CHECKOUT_CANCELED\",\n    message: \"Customer closed PayPal popup before authorizing.\",\n  },\n  PAYPAL_START_VAULT_INITIATED_CHECKOUT_IN_PROGRESS: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"PAYPAL_START_VAULT_INITIATED_CHECKOUT_IN_PROGRESS\",\n    message: \"Vault initiated checkout already in progress.\",\n  },\n  PAYPAL_INVALID_PAYMENT_OPTION: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"PAYPAL_INVALID_PAYMENT_OPTION\",\n    message: \"PayPal payment options are invalid.\",\n  },\n  PAYPAL_MISSING_REQUIRED_OPTION: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"PAYPAL_MISSING_REQUIRED_OPTION\",\n    message: \"Missing required option.\",\n  },\n};\n\n},{\"../lib/braintree-error\":148}],208:[function(_dereq_,module,exports){\n\"use strict\";\n/**\n * @module braintree-web/paypal-checkout\n * @description A component to integrate with the [PayPal JS SDK](https://github.com/paypal/paypal-checkout-components).\n */\n\nvar basicComponentVerification = _dereq_(\"../lib/basic-component-verification\");\nvar wrapPromise = _dereq_(\"@braintree/wrap-promise\");\nvar PayPalCheckout = _dereq_(\"./paypal-checkout\");\nvar VERSION = \"3.134.0\";\n\n/**\n * @static\n * @function create\n * @description There are two ways to integrate the PayPal Checkout component. See the [PayPal Checkout constructor documentation](PayPalCheckout.html#PayPalCheckout) for more information and examples.\n *\n * @param {object} options Creation options:\n * @param {Client} [options.client] A {@link Client} instance.\n * @param {string} [options.authorization] A tokenizationKey or clientToken. Can be used in place of `options.client`.\n * @param {string} [options.merchantAccountId] A non-default merchant account ID to use for tokenization.\n * @param {boolean} [options.autoSetDataUserIdToken=false] Whether or not to render the PayPal SDK button with a customer's vaulted PayPal account. Must be used in conjunction with a Client Token generated with a customer id.\n * @param {callback} [callback] The second argument, `data`, is the {@link PayPalCheckout} instance.\n * @example\n * braintree.client.create({\n *   authorization: 'authorization'\n * }).then(function (clientInstance) {\n *   return braintree.paypalCheckout.create({\n *     client: clientInstance\n *   });\n * }).then(function (paypalCheckoutInstance) {\n *   // set up the PayPal JS SDK\n * }).catch(function (err) {\n *   console.error('Error!', err);\n * });\n * @returns {(Promise|void)} Returns a promise if no callback is provided.\n */\nfunction create(options) {\n  var name = \"PayPal Checkout\";\n\n  return basicComponentVerification\n    .verify({\n      name: name,\n      client: options.client,\n      authorization: options.authorization,\n    })\n    .then(function () {\n      var instance = new PayPalCheckout(options);\n\n      return instance._initialize(options);\n    });\n}\n\n/**\n * @static\n * @function isSupported\n * @description Returns true if PayPal Checkout [supports this browser](index.html#browser-support-webviews).\n * @deprecated Previously, this method checked for Popup support in the browser. The PayPal JS SDK now falls back to a modal if popups are not supported.\n * @returns {Boolean} Returns true if PayPal Checkout supports this browser.\n */\nfunction isSupported() {\n  return true;\n}\n\nmodule.exports = {\n  create: wrapPromise(create),\n  isSupported: isSupported,\n  /**\n   * @description The current version of the SDK, i.e. `{@pkg version}`.\n   * @type {string}\n   */\n  VERSION: VERSION,\n};\n\n},{\"../lib/basic-component-verification\":146,\"./paypal-checkout\":209,\"@braintree/wrap-promise\":43}],209:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar analytics = _dereq_(\"../lib/analytics\");\nvar assign = _dereq_(\"../lib/assign\").assign;\nvar createDeferredClient = _dereq_(\"../lib/create-deferred-client\");\nvar createAssetsUrl = _dereq_(\"../lib/create-assets-url\");\nvar ExtendedPromise = _dereq_(\"@braintree/extended-promise\");\nvar wrapPromise = _dereq_(\"@braintree/wrap-promise\");\nvar BraintreeError = _dereq_(\"../lib/braintree-error\");\nvar convertToBraintreeError = _dereq_(\"../lib/convert-to-braintree-error\");\nvar errors = _dereq_(\"./errors\");\nvar constants = _dereq_(\"../paypal/shared/constants\");\nvar frameService = _dereq_(\"../lib/frame-service/external\");\nvar createAuthorizationData = _dereq_(\"../lib/create-authorization-data\");\nvar methods = _dereq_(\"../lib/methods\");\nvar useMin = _dereq_(\"../lib/use-min\");\nvar convertMethodsToError = _dereq_(\"../lib/convert-methods-to-error\");\nvar querystring = _dereq_(\"../lib/querystring\");\nvar VERSION = \"3.134.0\";\nvar INTEGRATION_TIMEOUT_MS = _dereq_(\"../lib/constants\").INTEGRATION_TIMEOUT_MS;\n\nvar REQUIRED_PARAMS_FOR_START_VAULT_INITIATED_CHECKOUT = [\n  \"amount\",\n  \"currency\",\n  \"vaultInitiatedCheckoutPaymentMethodToken\",\n];\n\nvar PAYPAL_SDK_PRELOAD_URL =\n  \"https://www.{ENV}paypal.com/smart/buttons/preload\";\n\nExtendedPromise.suppressUnhandledPromiseMessage = true;\n\n/**\n * PayPal Checkout tokenized payload. Returned in {@link PayPalCheckout#tokenizePayment}'s callback as the second argument, `data`.\n * @typedef {object} PayPalCheckout~tokenizePayload\n * @property {string} nonce The payment method nonce.\n * @property {string} type The payment method type, always `PayPalAccount`.\n * @property {object} details Additional PayPal account details.\n * @property {string} details.email User's email address.\n * @property {string} details.payerId User's payer ID, the unique identifier for each PayPal account.\n * @property {string} details.firstName User's given name.\n * @property {string} details.lastName User's surname.\n * @property {?string} details.countryCode User's 2 character country code.\n * @property {?string} details.phone User's phone number (e.g. 555-867-5309).\n * @property {?object} details.shippingAddress User's shipping address details, only available if shipping address is enabled.\n * @property {string} details.shippingAddress.recipientName Recipient of postage.\n * @property {string} details.shippingAddress.line1 Street number and name.\n * @property {string} details.shippingAddress.line2 Extended address.\n * @property {string} details.shippingAddress.city City or locality.\n * @property {string} details.shippingAddress.state State or region.\n * @property {string} details.shippingAddress.postalCode Postal code.\n * @property {string} details.shippingAddress.countryCode 2 character country code (e.g. US).\n * @property {?object} details.billingAddress User's billing address details.\n * Not available to all merchants; [contact support](https://developer.paypal.com/braintree/help) for details on eligibility and enabling this feature.\n * Alternatively, see `shippingAddress` above as an available client option.\n * @property {string} details.billingAddress.line1 Street number and name.\n * @property {string} details.billingAddress.line2 Extended address.\n * @property {string} details.billingAddress.city City or locality.\n * @property {string} details.billingAddress.state State or region.\n * @property {string} details.billingAddress.postalCode Postal code.\n * @property {string} details.billingAddress.countryCode 2 character country code (e.g. US).\n * @property {?object} creditFinancingOffered This property will only be present when the customer pays with PayPal Credit.\n * @property {object} creditFinancingOffered.totalCost This is the estimated total payment amount including interest and fees the user will pay during the lifetime of the loan.\n * @property {string} creditFinancingOffered.totalCost.value An amount defined by [ISO 4217](https://www.iso.org/iso/home/standards/currency_codes.htm) for the given currency.\n * @property {string} creditFinancingOffered.totalCost.currency 3 letter currency code as defined by [ISO 4217](https://www.iso.org/iso/home/standards/currency_codes.htm).\n * @property {number} creditFinancingOffered.term Length of financing terms in months.\n * @property {object} creditFinancingOffered.monthlyPayment This is the estimated amount per month that the customer will need to pay including fees and interest.\n * @property {string} creditFinancingOffered.monthlyPayment.value An amount defined by [ISO 4217](https://www.iso.org/iso/home/standards/currency_codes.htm) for the given currency.\n * @property {string} creditFinancingOffered.monthlyPayment.currency 3 letter currency code as defined by [ISO 4217](https://www.iso.org/iso/home/standards/currency_codes.htm).\n * @property {object} creditFinancingOffered.totalInterest Estimated interest or fees amount the payer will have to pay during the lifetime of the loan.\n * @property {string} creditFinancingOffered.totalInterest.value An amount defined by [ISO 4217](https://www.iso.org/iso/home/standards/currency_codes.htm) for the given currency.\n * @property {string} creditFinancingOffered.totalInterest.currency 3 letter currency code as defined by [ISO 4217](https://www.iso.org/iso/home/standards/currency_codes.htm).\n * @property {boolean} creditFinancingOffered.payerAcceptance Status of whether the customer ultimately was approved for and chose to make the payment using the approved installment credit.\n * @property {boolean} creditFinancingOffered.cartAmountImmutable Indicates whether the cart amount is editable after payer's acceptance on PayPal side.\n */\n\n/**\n * @class\n * @param {object} options see {@link module:braintree-web/paypal-checkout.create|paypal-checkout.create}\n * @classdesc This class represents a PayPal Checkout component that coordinates with the {@link https://developer.paypal.com/docs/checkout/integrate/#2-add-the-paypal-script-to-your-web-page|PayPal SDK}. Instances of this class can generate payment data and tokenize authorized payments.\n *\n * All UI (such as preventing actions on the parent page while authentication is in progress) is managed by the {@link https://developer.paypal.com/docs/checkout/integrate/#2-add-the-paypal-script-to-your-web-page|PayPal SDK}. You must provide your PayPal `client-id` as a query parameter. You can [retrieve this value from the PayPal Dashboard](https://developer.paypal.com/docs/checkout/integrate/#1-get-paypal-rest-api-credentials).\n * @description <strong>Do not use this constructor directly. Use {@link module:braintree-web/paypal-checkout.create|braintree-web.paypal-checkout.create} instead.</strong>\n *\n * #### Integrate Checkout Flow with PayPal SDK\n *\n * You must have [PayPal's script, configured with various query parameters](https://developer.paypal.com/docs/checkout/integrate/#2-add-the-paypal-script-to-your-web-page), loaded on your page:\n *\n * ```html\n * <script src=\"https://www.paypal.com/sdk/js?client-id=your-sandbox-or-prod-client-id\"></script>\n * <div id=\"paypal-button\"></div>\n * ```\n *\n * When passing values in the `createPayment` method, make sure they match the [corresponding parameters in the query parameters for the PayPal SDK script](https://developer.paypal.com/docs/checkout/reference/customize-sdk/).\n *\n * ```javascript\n * braintree.client.create({\n *   authorization: 'authorization'\n * }).then(function (clientInstance) {\n *   return braintree.paypalCheckout.create({\n *     client: clientInstance\n *   });\n * }).then(function (paypalCheckoutInstance) {\n *   return paypal.Buttons({\n *     createOrder: function () {\n *       return paypalCheckoutInstance.createPayment({\n *         flow: 'checkout',\n *         currency: 'USD',\n *         amount: '10.00',\n *         intent: 'capture' // this value must either be `capture` or match the intent passed into the PayPal SDK intent query parameter\n *         // your other createPayment options here\n *       });\n *     },\n *\n *     onApprove: function (data, actions) {\n *       // some logic here before tokenization happens below\n *       return paypalCheckoutInstance.tokenizePayment(data).then(function (payload) {\n *         // Submit payload.nonce to your server\n *       });\n *     },\n *\n *     onCancel: function () {\n *       // handle case where user cancels\n *     },\n *\n *     onError: function (err) {\n *       // handle case where error occurs\n *     }\n *   }).render('#paypal-button');\n * }).catch(function (err) {\n *  console.error('Error!', err);\n * });\n * ```\n *\n * #### Integrate Vault Flow with PayPal SDK\n *\n * You must have [PayPal's script, configured with various query parameters](https://developer.paypal.com/docs/checkout/integrate/#2-add-the-paypal-script-to-your-web-page), loaded on your page:\n *\n * ```html\n * <script src=\"https://www.paypal.com/sdk/js?client-id=your-sandbox-or-prod-client-id&vault=true\"></script>\n * <div id=\"paypal-button\"></div>\n * ```\n *\n * When passing values in the `createPayment` method, make sure they match the [corresponding parameters in the query parameters for the PayPal SDK script](https://developer.paypal.com/docs/checkout/reference/customize-sdk/).\n *\n * ```javascript\n * braintree.client.create({\n *   authorization: 'authorization'\n * }).then(function (clientInstance) {\n *   return braintree.paypalCheckout.create({\n *     client: clientInstance\n *   });\n * }).then(function (paypalCheckoutInstance) {\n *   return paypal.Buttons({\n *     createBillingAgreement: function () {\n *       return paypalCheckoutInstance.createPayment({\n *         flow: 'vault'\n *         // your other createPayment options here\n *       });\n *     },\n *\n *     onApprove: function (data, actions) {\n *       // some logic here before tokenization happens below\n *       return paypalCheckoutInstance.tokenizePayment(data).then(function (payload) {\n *         // Submit payload.nonce to your server\n *       });\n *     },\n *\n *     onCancel: function () {\n *       // handle case where user cancels\n *     },\n *\n *     onError: function (err) {\n *       // handle case where error occurs\n *     }\n *   }).render('#paypal-button');\n * }).catch(function (err) {\n *  console.error('Error!', err);\n * });\n * ```\n *\n * #### Integrate AppSwitch Flow with PayPal SDK\n *\n * ```javascript\n * braintree.client.create({\n *   authorization: 'authorization'\n * }).then(function (clientInstance) {\n *   return braintree.paypalCheckout.create({\n *     client: clientInstance\n *   });\n * }).then(function (paypalCheckoutInstance) {\n *   const buttons = paypal.Buttons({\n *\n *      appSwitchPreference: { launchPaypalApp: true }, // Need an indicator to trigger app switch\n *\n *     createOrder: function () {\n *       return paypalCheckoutInstance.createPayment({\n *         flow: 'checkout',\n *         currency: 'USD',\n *         amount: '10.00',\n *         intent: 'capture', // this value must either be `capture` or match the intent passed into the PayPal SDK intent query parameter\n *         returnUrl: 'www.example.com/return',\n *         cancelUrl: 'www.example.com/cancel',\n *         // your other createPayment options here\n *       });\n *     },\n *\n *     onApprove: function (data, actions) {\n *       // some logic here before tokenization happens below\n *       return paypalCheckoutInstance.tokenizePayment(data).then(function (payload) {\n *         // Submit payload.nonce to your server\n *       });\n *     },\n *\n *     onCancel: function () {\n *       // handle case where user cancels\n *     },\n *\n *     onError: function (err) {\n *       // handle case where error occurs\n *     }\n *   });\n *\n *   // If you support app switch, depending on the browser the buyer may end up in a new tab\n *   // To trigger completion of the flow, execute the code below after re-instantiating buttons\n *   if (buttons.hasReturned()) {\n *     buttons.resume();\n *   } else {\n *     buttons.render('#paypal-button');\n *   };\n * }).catch(function (err) {\n *  console.error('Error!', err);\n * });\n * ```\n *\n * #### Integrate with Checkout.js (deprecated PayPal SDK)\n *\n * If you are creating a new PayPal integration, please follow the previous integration guide to use the current version of the PayPal SDK. Use this integration guide only as a reference if you are already integrated with Checkout.js.\n *\n * You must have PayPal's Checkout.js script loaded on your page.\n *\n * ```html\n * <script src=\"https://www.paypalobjects.com/api/checkout.js\" data-version-4 log-level=\"warn\"></script>\n * ```\n *\n * ```javascript\n * braintree.client.create({\n *   authorization: 'authorization'\n * }).then(function (clientInstance) {\n *   return braintree.paypalCheckout.create({\n *     client: clientInstance\n *   });\n * }).then(function (paypalCheckoutInstance) {\n *   return paypal.Button.render({\n *     env: 'production', // or 'sandbox'\n *\n *     payment: function () {\n *       return paypalCheckoutInstance.createPayment({\n *         // your createPayment options here\n *       });\n *     },\n *\n *     onAuthorize: function (data, actions) {\n *       // some logic here before tokenization happens below\n *       return paypalCheckoutInstance.tokenizePayment(data).then(function (payload) {\n *         // Submit payload.nonce to your server\n *       });\n *     }\n *   }, '#paypal-button');\n * }).catch(function (err) {\n *  console.error('Error!', err);\n * });\n * ```\n */\nfunction PayPalCheckout(options) {\n  this._merchantAccountId = options.merchantAccountId;\n  // eslint-disable-next-line no-warning-comments\n  // TODO remove this requirement for it to be opt in.\n  // This feature is not yet GA, so we're intentionally making\n  // it opt in and not publicly documenting it yet. Once it's\n  // GA, we can remove the requirement to opt in to it\n  this._autoSetDataUserIdToken = Boolean(options.autoSetDataUserIdToken);\n}\n\nPayPalCheckout.prototype._initialize = function (options) {\n  var config;\n\n  if (options.client) {\n    config = options.client.getConfiguration();\n    this._authorizationInformation = {\n      fingerprint: config.authorizationFingerprint,\n      environment: config.gatewayConfiguration.environment,\n    };\n  } else {\n    config = createAuthorizationData(options.authorization);\n    this._authorizationInformation = {\n      fingerprint: config.attrs.authorizationFingerprint,\n      environment: config.environment,\n    };\n  }\n\n  this._clientPromise = createDeferredClient\n    .create({\n      authorization: options.authorization,\n      client: options.client,\n      debug: options.debug,\n      assetsUrl: createAssetsUrl.create(options.authorization),\n      name: \"PayPal Checkout\",\n    })\n    .then(\n      function (client) {\n        this._configuration = client.getConfiguration();\n\n        // we skip these checks if a merchant account id is\n        // passed in, because the default merchant account\n        // may not have paypal enabled\n        if (!this._merchantAccountId) {\n          if (!this._configuration.gatewayConfiguration.paypalEnabled) {\n            this._setupError = new BraintreeError(errors.PAYPAL_NOT_ENABLED);\n          } else if (\n            this._configuration.gatewayConfiguration.paypal\n              .environmentNoNetwork === true\n          ) {\n            this._setupError = new BraintreeError(\n              errors.PAYPAL_SANDBOX_ACCOUNT_NOT_LINKED\n            );\n          }\n        }\n\n        if (this._setupError) {\n          return Promise.reject(this._setupError);\n        }\n\n        analytics.sendEvent(client, \"paypal-checkout.initialized\");\n        this._frameServicePromise = this._setupFrameService(client);\n\n        return client;\n      }.bind(this)\n    );\n\n  // if client was passed in, let config checks happen before\n  // resolving the instance. Otherwise, just resolve the instance\n  if (options.client) {\n    return this._clientPromise.then(\n      function () {\n        return this;\n      }.bind(this)\n    );\n  }\n\n  return Promise.resolve(this);\n};\n\nPayPalCheckout.prototype._setupFrameService = function (client) {\n  var frameServicePromise = new ExtendedPromise();\n  var config = client.getConfiguration();\n  var timeoutRef = setTimeout(function () {\n    analytics.sendEvent(client, \"paypal-checkout.frame-service.timed-out\");\n    frameServicePromise.reject(\n      new BraintreeError(\n        errors.PAYPAL_START_VAULT_INITIATED_CHECKOUT_SETUP_FAILED\n      )\n    );\n  }, INTEGRATION_TIMEOUT_MS);\n\n  this._assetsUrl =\n    config.gatewayConfiguration.paypal.assetsUrl + \"/web/\" + VERSION;\n  this._isDebug = config.isDebug;\n  // Note: this is using the static landing frame that the deprecated PayPal component builds and uses\n  this._loadingFrameUrl =\n    this._assetsUrl +\n    \"/html/paypal-landing-frame\" +\n    useMin(this._isDebug) +\n    \".html\";\n\n  frameService.create(\n    {\n      name: \"braintreepaypallanding\",\n      dispatchFrameUrl:\n        this._assetsUrl +\n        \"/html/dispatch-frame\" +\n        useMin(this._isDebug) +\n        \".html\",\n      openFrameUrl: this._loadingFrameUrl,\n    },\n    function (service) {\n      this._frameService = service;\n      clearTimeout(timeoutRef);\n\n      frameServicePromise.resolve();\n    }.bind(this)\n  );\n\n  return frameServicePromise;\n};\n\n/**\n * @typedef {object} PayPalCheckout~lineItem\n * @property {string} quantity Number of units of the item purchased. This value must be a whole number and can't be negative or zero.\n * @property {string} unitAmount Per-unit price of the item. Can include up to 2 decimal places. This value can't be negative or zero.\n * @property {string} name Item name. Maximum 127 characters.\n * @property {string} kind Indicates whether the line item is a debit (sale) or credit (refund) to the customer. Accepted values: `debit` and `credit`.\n * @property {?string} unitTaxAmount Per-unit tax price of the item. Can include up to 2 decimal places. This value can't be negative or zero.\n * @property {?string} description Item description. Maximum 127 characters.\n * @property {?string} productCode Product or UPC code for the item. Maximum 127 characters.\n * @property {?string} url The URL to product information.\n */\n\n/**\n * @typedef {object} PayPalCheckout~shippingOption\n * @property {string} id A unique ID that identifies a payer-selected shipping option.\n * @property {string} label A description that the payer sees, which helps them choose an appropriate shipping option. For example, `Free Shipping`, `USPS Priority Shipping`, `Expédition prioritaire USPS`, or `USPS yōuxiān fā huò`. Localize this description to the payer's locale.\n * @property {boolean} selected If `selected = true` is specified as part of the API request it represents the shipping option that the payee/merchant expects to be pre-selected for the payer when they first view the shipping options within the PayPal checkout experience. As part of the response if a shipping option has `selected = true` it represents the shipping option that the payer selected during the course of checkout with PayPal. Only 1 `shippingOption` can be set to `selected = true`.\n * @property {string} type The method by which the payer wants to get their items. The possible values are:\n * * `SHIPPING` - The payer intends to receive the items at a specified address.\n * * `PICKUP` - The payer intends to pick up the items at a specified address. For example, a store address.\n * @property {object} amount The shipping cost for the selected option.\n * @property {string} amount.currency The three-character ISO-4217 currency code. PayPal does not support all currencies.\n * @property {string} amount.value The amount the shipping option will cost. Includes the specified number of digits after decimal separator for the ISO-4217 currency code.\n */\n\n/** @typedef {object} PayPalCheckout~pricingScheme\n * @property {string} pricingModel The pricing model. Options are `FIXED`, `VARIABLE`, or `AUTO_RELOAD`.\n * @property {string} price The price for the billing cycle.\n * @property {string} reloadThresholdAmount The amount at which to reload on auto_reload plans.\n */\n\n/**\n * @typedef {Object} PayPalCheckout~billingCycles\n * @property {(string|number)} billingFrequency The frequency of billing. This value must be a whole number and can't be negative or zero.\n * @property {string} billingFrequencyUnit The unit of billing frequency. Options are `DAY`, `WEEK`, `MONTH`, or `YEAR`.\n * @property {(string|number)} numberOfExecutions The number of executions for the billing cycle.\n * @property {(string|number)} sequence The order in the upcoming billing cycles.\n * @property {string} startDate The start date in ISO 8601 format (`2024-04-06T00:00:00Z`). If populated and the intent is to charge the buyer for the billing cycle at the checkout, it should be populated as current time in ISO 8601 format.\n * @property {boolean} trial Indicates if the billing cycle is a trial.\n * @property {pricingScheme} pricingScheme The {@link PayPalCheckout~pricingScheme|pricing scheme object} for this billing cycle.\n */\n\n/**\n * @typedef {Object} PayPalCheckout~planMetadata\n * @property {billingCycles[]} [billingCycles] An array of {@link PayPalCheckout~billingCycles|billing cycles} for this plan.\n * @property {string} currencyIsoCode The ISO code for the currency, for example `USD`.\n * @property {string} name The name of the plan.\n * @property {(string|number)} oneTimeFeeAmount The one-time fee amount.\n * @property {string} productDescription A description of the product. (Accepts only one element)\n * @property {(string|number)} productPrice The price of the product.\n * @property {(string|number)} productQuantity The quantity of the product. (Accepts only one element)\n * @property {(string|number)} shippingAmount The amount for shipping.\n * @property {(string|number)} taxAmount The amount of tax.\n * @property {string} totalAmount This field is for vault with purchase only. Can include up to 2 decimal places. This value can't be negative or zero.\n */\n\n/**\n * Creates a PayPal payment ID or billing token using the given options. This is meant to be passed to the PayPal JS SDK.\n * When a {@link callback} is defined, the function returns undefined and invokes the callback with the id to be used with the PayPal JS SDK. Otherwise, it returns a Promise that resolves with the id.\n * @public\n * @param {object} options All options for the PayPalCheckout component.\n * @param {string} options.flow Set to 'checkout' for one-time payment flow, or 'vault' for Vault flow. If 'vault' is used with a client token generated with a customer ID, the PayPal account will be added to that customer as a saved payment method.\n * @param {string} [options.intent=authorize]\n * * `authorize` - Submits the transaction for authorization but not settlement.\n * * `order` - Validates the transaction without an authorization (i.e. without holding funds). Useful for authorizing and capturing funds up to 90 days after the order has been placed. Only available for Checkout flow.\n * * `capture` - Payment will be immediately submitted for settlement upon creating a transaction. `sale` can be used as an alias for this value.\n * @param {boolean} [options.offerCredit=false] Offers PayPal Credit as the default funding instrument for the transaction. If the customer isn't pre-approved for PayPal Credit, they will be prompted to apply for it.\n * @param {(string|number)} [options.amount] The amount of the transaction. Required when using the Checkout flow. Should not include shipping cost.\n * * Supports up to 2 digits after the decimal point\n * @param {string} [options.currency] The currency code of the amount, such as 'USD'. Required when using the Checkout flow.\n * @param {string} [options.displayName] The merchant name displayed inside of the PayPal lightbox; defaults to the company name on your Braintree account\n * @param {boolean} [options.requestBillingAgreement] If `true` and `flow = checkout`, the customer will be prompted to consent to a billing agreement during the checkout flow. This value is ignored when `flow = vault`.\n * @param {object} [options.billingAgreementDetails] When `requestBillingAgreement = true`, allows for details to be set for the billing agreement portion of the flow.\n * @param {string} [options.billingAgreementDetails.description] Description of the billing agreement to display to the customer.\n * @param {string} [options.vaultInitiatedCheckoutPaymentMethodToken] Use the payment method nonce representing a PayPal account with a Billing Agreement ID to create the payment and redirect the customer to select a new financial instrument. This option is only applicable to the `checkout` flow.\n * @param {shippingOption[]} [options.shippingOptions] List of shipping options offered by the payee or merchant to the payer to ship or pick up their items.\n * @param {boolean} [options.enableShippingAddress=false] Returns a shipping address object in {@link PayPal#tokenize}.\n * @param {string} [options.contactPreference] Optional field but required if using different recipient via `shippingAddressOverride`. Can be 'NO_CONTACT_INFO', 'RETAIN_CONTACT_INFO' or 'UPDATE_CONTACT_INFO'. If null, will default to 'NO_CONTACT_INFO'.\n * * Note: this feature is currently available for US-based merchants only; see https://developer.paypal.com/docs/checkout/standard/customize/contact-module/#availability for up-to-date regional availability.\n * @param {object} [options.shippingAddressOverride] Allows you to pass a shipping address you have already collected into the PayPal payment flow.\n * @param {string} options.shippingAddressOverride.line1 Street address.\n * @param {string} [options.shippingAddressOverride.line2] Street address (extended).\n * @param {string} options.shippingAddressOverride.city City.\n * @param {string} options.shippingAddressOverride.state State.\n * @param {string} options.shippingAddressOverride.postalCode Postal code.\n * @param {string} options.shippingAddressOverride.countryCode Country.\n * @param {string} [options.shippingAddressOverride.phone] Phone number.\n * @param {string} [options.shippingAddressOverride.recipientName] Recipient's name.\n * @param {string} [options.shippingAddressOverride.recipientEmail] Email address of the recipient.\n * @param {string} [options.shippingAddressOverride.internationalPhone.countryCode] Phone country code of the recipient.\n * @param {string} [options.shippingAddressOverride.internationalPhone.nationalNumber] Phone national number of the recipient.\n * @param {boolean} [options.shippingAddressEditable=true] Set to false to disable user editing of the shipping address.\n * @param {string} [options.billingAgreementDescription] Use this option to set the description of the preapproved payment agreement visible to customers in their PayPal profile during Vault flows. Max 255 characters.\n * @param {string} [options.landingPageType] Use this option to specify the PayPal page to display when a user lands on the PayPal site to complete the payment.\n * * `login` - A PayPal account login page is used.\n * * `billing` - A non-PayPal account landing page is used.\n * @param {lineItem[]} [options.lineItems] The {@link PayPalCheckout~lineItem|line items} for this transaction. It can include up to 249 line items.\n *\n * @param {string} [options.planType] Determines the charge pattern for the Recurring Billing Agreement. Can be 'RECURRING', 'SUBSCRIPTION', 'UNSCHEDULED', or 'INSTALLMENTS'.\n * @param {planMetadata} [options.planMetadata] When plan type is defined, allows for {@link PayPalCheckout~planMetadata|plan metadata} to be set for the Billing Agreement.\n * @param {string} [options.userAuthenticationEmail] Optional merchant-provided buyer email, used to streamline the sign-in process for both one-time checkout and vault flows.\n * @param {string} [options.returnUrl] The URL that the PayPal app will open after a successful authentication in the app switch flow\n * @param {string} [options.cancelUrl] The URL that the PayPal app will open after an unsuccessful authentication in the app switch flow\n * @param {object} [options.appSwitchPreference] Sets options for the app switch flow. Must use `returnUrl` and `cancelUrl` with this option.\n * @param {boolean} options.appSwitchPreference.launchPaypalApp Opts into the app switch flow.\n * @param {string} [options.shippingCallbackUrl] Optional server side shipping callback URL to be notified when a customer updates their shipping address or options. A callback request will be sent to the merchant server at this URL.\n * @param {string} [options.riskCorrelationId] Optional merchant-provided risk correlation ID. This ID is used for tracking risk management.\n * @param {string} [options.paymentReadySessionId] Optional session identifier returned from PaymentReady.createCustomerSession that can be used to track a specific checkout attempt. This ID is used for analytics and to connect multiple API calls associated with a single checkout flow.\n * @param {string} [options.userAction=CONTINUE] Changes the call-to-action on the PayPal review page\n *  * `CONTINUE` - Shows the default call-to-action text on the PayPal Express Checkout page.\n *  * `COMMIT` - Shows a deterministic call-to-action for the PayPal Checkout flow.\n *  * `SETUP_NOW` - Shows a deterministic call-to-action for the PayPal Vault flow.\n * @param {object} [options.amountBreakdown] Collection of amounts that break down the total into individual pieces.\n * @param {string} options.amountBreakdown.itemTotal item amount\n * @param {string} [options.amountBreakdown.taxTotal] Tax amount. Required when `lineItem.unitTaxAmount` is used\n * @param {string} [options.amountBreakdown.shipping] Shipping amount\n * @param {string} [options.amountBreakdown.handling] Handling amount. Not accepted with {@link PayPalCheckout~planMetadata|plan metadata}\n * @param {string} [options.amountBreakdown.insurance] Insurance amount. Not accepted with {@link PayPalCheckout~planMetadata|plan metadata}\n * @param {string} [options.amountBreakdown.shippingDiscount] Shipping discount amount. Not accepted with {@link PayPalCheckout~planMetadata|plan metadata}\n * @param {string} [options.amountBreakdown.discount] Discount amount. Not accepted with {@link PayPalCheckout~planMetadata|plan metadata}\n * @param {callback} [callback] The second argument is a PayPal `paymentId` or `billingToken` string, depending on whether `options.flow` is `checkout` or `vault`. This is also what is resolved by the promise if no callback is provided.\n * @example\n * // this paypal object is created by the PayPal JS SDK\n * // see https://github.com/paypal/paypal-checkout-components\n * paypal.Buttons({\n *   createOrder: function () {\n *     // when createPayment resolves, it is automatically passed to the PayPal JS SDK\n *     return paypalCheckoutInstance.createPayment({\n *       flow: 'checkout',\n *       amount: '10.00',\n *       currency: 'USD',\n *       intent: 'capture' // this value must either be `capture` or match the intent passed into the PayPal SDK intent query parameter\n *     });\n *   },\n *   // Add other options, e.g. onApproved, onCancel, onError\n * }).render('#paypal-button');\n *\n * @example\n * // shippingOptions are passed to createPayment. You can review the result from onAuthorize to determine which shipping option id was selected.\n * ```javascript\n * braintree.client.create({\n *   authorization: 'authorization'\n * }).then(function (clientInstance) {\n *   return braintree.paypalCheckout.create({\n *     client: clientInstance\n *   });\n * }).then(function (paypalCheckoutInstance) {\n *   return paypal.Button.render({\n *     env: 'production'\n *\n *     payment: function () {\n *       return paypalCheckoutInstance.createPayment({\n *         flow: 'checkout',\n *         amount: '10.00',\n *         currency: 'USD',\n *         shippingOptions: [\n *           {\n *             id: 'UUID-9',\n *             type: 'PICKUP',\n *             label: 'Store Location Five',\n *             selected: true,\n *             amount: {\n *               value: '1.00',\n *               currency: 'USD'\n *             }\n *           },\n *           {\n *             id: 'shipping-speed-fast',\n *             type: 'SHIPPING',\n *             label: 'Fast Shipping',\n *             selected: false,\n *             amount: {\n *               value: '1.00',\n *               currency: 'USD'\n *             }\n *           },\n *           {\n *             id: 'shipping-speed-slow',\n *             type: 'SHIPPING',\n *             label: 'Slow Shipping',\n *             selected: false,\n *             amount: {\n *               value: '1.00',\n *               currency: 'USD'\n *             }\n *           }\n *         ]\n *       });\n *     },\n *\n *     onAuthorize: function (data, actions) {\n *       return paypalCheckoutInstance.tokenizePayment(data).then(function (payload) {\n *         // Submit payload.nonce to your server\n *       });\n *     }\n *   }, '#paypal-button');\n * }).catch(function (err) {\n *  console.error('Error!', err);\n * });\n *\n * ```\n *\n * @example <caption>use the new plan features</caption>\n * // Plan and plan metadata are passed to createPayment\n * ```javascript\n * braintree.client.create({\n *   authorization: 'authorization'\n * }).then(function (clientInstance) {\n *   return braintree.paypalCheckout.create({\n *     client: clientInstance\n *   });\n * }).then(function (paypalCheckoutInstance) {\n *   return paypal.Button.render({\n *     env: 'production'\n *\n *     payment: function () {\n *       return paypalCheckoutInstance.createPayment({\n *         flow: 'vault',\n *         planType: 'RECURRING',\n *         planMetadata: {\n *           billingCycles: [\n *             {\n *                billingFrequency: \"1\",\n *                billingFrequencyUnit: \"MONTH\",\n *                numberOfExecutions: \"1\",\n *                sequence: \"1\",\n *                startDate: \"2024-04-06T00:00:00Z\",\n *                trial: true,\n *                pricingScheme: {\n *                  pricingModel: \"FIXED\",\n *              },\n *            },\n *            ],\n *           currencyIsoCode: \"USD\",\n *           name: \"Netflix with Ads\",\n *           productDescription: \"iPhone 13\",\n *           productQuantity: \"1.0\",\n *           oneTimeFeeAmount: \"10\",\n *           shippingAmount: \"3.0\",\n *           productPrice: \"200\",\n *           taxAmount: \"20\",\n *        };\n *       });\n *     },\n *\n *     onAuthorize: function (data, actions) {\n *       return paypalCheckoutInstance.tokenizePayment(data).then(function (payload) {\n *         // Submit payload.nonce to your server\n *       });\n *     }\n *   }, '#paypal-button');\n * }).catch(function (err) {\n *  console.error('Error!', err);\n * });\n *\n * ```\n * @example <caption>Vault Flow with Purchase (Billing Agreement with Recurring Payment)</caption>\n * paypal.Buttons({\n *   createBillingAgreement: function () {\n *     return paypalCheckoutInstance.createPayment({\n *       flow: 'vault',\n *       amount: '12.50',\n *       currency: 'USD',\n *       planType: 'SUBSCRIPTION',\n *       planMetadata: {\n *         billingCycles: [{\n *           billingFrequency: 1,\n *           billingFrequencyUnit: \"MONTH\",\n *           sequence: 1,\n *           pricingScheme: {\n *             pricingModel: \"FIXED\",\n *             price: \"10.00\"\n *           },\n *         }],\n *         currencyIsoCode: \"USD\",\n *         totalAmount: \"10.00\",\n *         name: \"My Recurring Product\"\n *       }\n *     });\n *   },\n *   onApprove: function (data) {\n *     return paypalCheckoutInstance.tokenizePayment(data);\n *   }\n * }).render('#paypal-button');\n *\n * @returns {(promise|void)} returns a promise if no callback is provided.\n */\nPayPalCheckout.prototype.createPayment = function (options) {\n  var self = this;\n  if (!options || !constants.FLOW_ENDPOINTS.hasOwnProperty(options.flow)) {\n    return Promise.reject(\n      new BraintreeError(errors.PAYPAL_FLOW_OPTION_REQUIRED)\n    );\n  }\n\n  analytics.sendEvent(this._clientPromise, \"paypal-checkout.createPayment\");\n\n  return this._createPaymentResource(options).then(function (response) {\n    var flowToken, urlParams;\n\n    if (options.flow === \"checkout\") {\n      urlParams = querystring.parse(response.paymentResource.redirectUrl);\n      flowToken = urlParams.token;\n    } else {\n      flowToken = response.agreementSetup.tokenId;\n    }\n\n    self._contextId = flowToken;\n\n    return flowToken;\n  });\n};\n\n/**\n * @private\n * @returns {Promise} A promise that resolves with payment resource data\n */\nPayPalCheckout.prototype._createPaymentResource = function (options, config) {\n  var self = this;\n  var endpoint = \"paypal_hermes/\" + constants.FLOW_ENDPOINTS[options.flow];\n\n  this._flow = options.flow;\n  delete this.intentFromCreatePayment;\n\n  config = config || {};\n\n  if (options.offerCredit === true) {\n    analytics.sendEvent(this._clientPromise, \"paypal-checkout.credit.offered\");\n  }\n\n  return this._clientPromise\n    .then(function (client) {\n      return client\n        .request({\n          endpoint: endpoint,\n          method: \"post\",\n          data: self._formatPaymentResourceData(options, config),\n        })\n        .then(function (data) {\n          self.intentFromCreatePayment = options.intent;\n\n          return data;\n        });\n    })\n    .catch(function (err) {\n      var status;\n\n      if (self._setupError) {\n        return Promise.reject(self._setupError);\n      }\n\n      status = err.details && err.details.httpStatus;\n\n      if (status === 422) {\n        return Promise.reject(\n          new BraintreeError({\n            type: errors.PAYPAL_INVALID_PAYMENT_OPTION.type,\n            code: errors.PAYPAL_INVALID_PAYMENT_OPTION.code,\n            message: errors.PAYPAL_INVALID_PAYMENT_OPTION.message,\n            details: {\n              originalError: err,\n            },\n          })\n        );\n      }\n\n      return Promise.reject(\n        convertToBraintreeError(err, {\n          type: errors.PAYPAL_FLOW_FAILED.type,\n          code: errors.PAYPAL_FLOW_FAILED.code,\n          message: errors.PAYPAL_FLOW_FAILED.message,\n        })\n      );\n    });\n};\n\n/**\n * Use this function to update {@link PayPalCheckout~lineItem|line items} and/or {@link PayPalCheckout~shippingOption|shipping options} associated with a PayPalCheckout flow (`paymentId`).\n * When a {@link callback} is defined, this function returns undefined and invokes the callback. The second callback argument, <code>data</code>, is the returned server data. If no callback is provided, `updatePayment` returns a promise that resolves with the server data.\n * @public\n * @param {object} options All options for the PayPalCheckout component.\n * @param {string} options.paymentId This should be PayPal `paymentId`.\n * @param {(string|number)} options.amount The amount of the transaction, including the amount of the selected shipping option, and all `line_items`.\n * * Supports up to 2 decimal digits.\n * @param {string} options.currency The currency code of the amount, such as 'USD'. Required when using the Checkout flow.\n * @param {string} [options.recipientEmail] Email address of the contact and shipping recipient of the order.\n * @param {shippingOption[]} [options.shippingOptions] List of {@link PayPalCheckout~shippingOption|shipping options} offered by the payee or merchant to the payer to ship or pick up their items.\n * @param {lineItem[]} [options.lineItems] The {@link PayPalCheckout~lineItem|line items} for this transaction. It can include up to 249 line items.\n * @param {object} [options.amountBreakdown] Optional collection of amounts that break down the total into individual pieces.\n * @param {string} [options.amountBreakdown.itemTotal] Optional, item amount\n * @param {string} [options.amountBreakdown.shipping] Optional, shipping amount\n * @param {string} [options.amountBreakdown.handling] Optional, handling amount\n * @param {string} [options.amountBreakdown.taxTotal] Optional, tax amount\n * @param {string} [options.amountBreakdown.insurance] Optional, insurance amount\n * @param {string} [options.amountBreakdown.shippingDiscount] Optional, shipping discount amount\n * @param {string} [options.amountBreakdown.discount] Optional, discount amount\n * @param {callback} [callback] The second argument is a PayPal `paymentId` or `billingToken` string, depending on whether `options.flow` is `checkout` or `vault`. This is also what is resolved by the promise if no callback is provided.\n * @returns {(Promise|void)} Returns a promise if no callback is provided.\n * @example\n * // this paypal object is created by the PayPal JS SDK\n * // see https://github.com/paypal/paypal-checkout-components\n * paypal.Buttons({\n *   createOrder: function () {\n *     // when createPayment resolves, it is automatically passed to the PayPal JS SDK\n *     return paypalCheckoutInstance.createPayment({\n *       //\n *     });\n *   },\n *   onShippingChange: function (data) {\n *     // Examine data and determine if the payment needs to be updated.\n *     // when updatePayment resolves, it is automatically passed to the PayPal JS SDK\n *     return paypalCheckoutInstance.updatePayment({\n *         paymentId: data.paymentId,\n *         amount: '15.00',\n *         currency: 'USD',\n *         shippingOptions: [\n *           {\n *             id: 'shipping-speed-fast',\n *             type: 'SHIPPING',\n *             label: 'Fast Shipping',\n *             selected: true,\n *             amount: {\n *               value: '5.00',\n *               currency: 'USD'\n *             }\n *           },\n *           {\n *             id: 'shipping-speed-slow',\n *             type: 'SHIPPING',\n *             label: 'Slow Shipping',\n *             selected: false,\n *             amount: {\n *               value: '1.00',\n *               currency: 'USD'\n *             }\n *           }\n *         ]\n *     });\n *   }\n *   // Add other options, e.g. onApproved, onCancel, onError\n * }).render('#paypal-button');\n *\n * ```\n *\n */\nPayPalCheckout.prototype.updatePayment = function (options) {\n  var self = this;\n  var endpoint = \"paypal_hermes/patch_payment_resource\";\n\n  if (!options || this._hasMissingOption(options, constants.REQUIRED_OPTIONS)) {\n    analytics.sendEventPlus(\n      self._clientPromise,\n      \"paypal-checkout.updatePayment.missing-options\",\n      {\n        flow: self._flow,\n        context_id: self._contextId, // eslint-disable-line camelcase\n      }\n    );\n\n    return Promise.reject(\n      new BraintreeError(errors.PAYPAL_MISSING_REQUIRED_OPTION)\n    );\n  }\n\n  if (!this._verifyConsistentCurrency(options)) {\n    analytics.sendEventPlus(\n      self._clientPromise,\n      \"paypal-checkout.updatePayment.inconsistent-currencies\",\n      {\n        flow: self._flow,\n        context_id: self._contextId, // eslint-disable-line camelcase\n      }\n    );\n\n    return Promise.reject(\n      new BraintreeError({\n        type: errors.PAYPAL_INVALID_PAYMENT_OPTION.type,\n        code: errors.PAYPAL_INVALID_PAYMENT_OPTION.code,\n        message: errors.PAYPAL_INVALID_PAYMENT_OPTION.message,\n        details: {\n          originalError: new Error(\n            \"One or more shipping option currencies differ from checkout currency.\"\n          ),\n        },\n      })\n    );\n  }\n  analytics.sendEventPlus(\n    this._clientPromise,\n    \"paypal-checkout.updatePayment\",\n    {\n      flow: self._flow,\n      context_id: self._contextId, // eslint-disable-line camelcase\n    }\n  );\n\n  return this._clientPromise\n    .then(function (client) {\n      return client.request({\n        endpoint: endpoint,\n        method: \"post\",\n        data: self._formatUpdatePaymentData(options),\n      });\n    })\n    .catch(function (err) {\n      var status = err.details && err.details.httpStatus;\n\n      if (status === 422) {\n        analytics.sendEventPlus(\n          self._clientPromise,\n          \"paypal-checkout.updatePayment.invalid\",\n          {\n            flow: self._flow,\n            context_id: self._contextId, // eslint-disable-line camelcase\n          }\n        );\n\n        return Promise.reject(\n          new BraintreeError({\n            type: errors.PAYPAL_INVALID_PAYMENT_OPTION.type,\n            code: errors.PAYPAL_INVALID_PAYMENT_OPTION.code,\n            message: errors.PAYPAL_INVALID_PAYMENT_OPTION.message,\n            details: {\n              originalError: err,\n            },\n          })\n        );\n      }\n\n      analytics.sendEventPlus(\n        self._clientPromise,\n        \"paypal-checkout.updatePayment.\" + errors.PAYPAL_FLOW_FAILED.code,\n        {\n          flow: self._flow,\n          context_id: self._contextId, // eslint-disable-line camelcase\n        }\n      );\n\n      return Promise.reject(\n        convertToBraintreeError(err, {\n          type: errors.PAYPAL_FLOW_FAILED.type,\n          code: errors.PAYPAL_FLOW_FAILED.code,\n          message: errors.PAYPAL_FLOW_FAILED.message,\n        })\n      );\n    });\n};\n\n/**\n * Initializes the PayPal checkout flow with a payment method nonce that represents a vaulted PayPal account.\n * When a {@link callback} is defined, the function returns undefined and invokes the callback with the id to be used with the PayPal JS SDK. Otherwise, it returns a Promise that resolves with the id.\n * @public\n * @ignore\n * @param {object} options These options are identical to the {@link PayPalCheckout#createPayment|options for creating a payment resource}, except for the following:\n * * `flow` cannot be set (will always be `'checkout'`)\n * * `amount`, `currency`, and `vaultInitiatedCheckoutPaymentMethodToken` are required instead of optional\n * * Additional configuration is available (listed below)\n * @param {boolean} [options.optOutOfModalBackdrop=false] By default, the webpage will darken and become unusable while the PayPal window is open. For full control of the UI, pass `true` for this option.\n * @param {callback} [callback] The second argument, <code>payload</code>, is a {@link PayPalCheckout~tokenizePayload|tokenizePayload}. If no callback is provided, the promise resolves with a {@link PayPalCheckout~tokenizePayload|tokenizePayload}.\n * @example\n * paypalCheckoutInstance.startVaultInitiatedCheckout({\n *   vaultInitiatedCheckoutPaymentMethodToken: 'nonce-that-represents-a-vaulted-paypal-account',\n *   amount: '10.00',\n *   currency: 'USD'\n * }).then(function (payload) {\n *   // send payload.nonce to your server\n * }).catch(function (err) {\n *   if (err.code === 'PAYPAL_POPUP_CLOSED') {\n *     // indicates that customer canceled by\n *     // manually closing the PayPal popup\n *   }\n *\n *   // handle other errors\n * });\n *\n * @returns {(Promise|void)} Returns a promise if no callback is provided.\n */\nPayPalCheckout.prototype.startVaultInitiatedCheckout = function (options) {\n  var missingRequiredParam;\n  var self = this;\n\n  if (this._vaultInitiatedCheckoutInProgress) {\n    analytics.sendEventPlus(\n      this._clientPromise,\n      \"paypal-checkout.startVaultInitiatedCheckout.error.already-in-progress\",\n      {\n        flow: self._flow,\n        context_id: self._contextId, // eslint-disable-line camelcase\n      }\n    );\n\n    return Promise.reject(\n      new BraintreeError(\n        errors.PAYPAL_START_VAULT_INITIATED_CHECKOUT_IN_PROGRESS\n      )\n    );\n  }\n\n  REQUIRED_PARAMS_FOR_START_VAULT_INITIATED_CHECKOUT.forEach(function (param) {\n    if (!options.hasOwnProperty(param)) {\n      missingRequiredParam = param;\n    }\n  });\n\n  if (missingRequiredParam) {\n    return Promise.reject(\n      new BraintreeError({\n        type: errors.PAYPAL_START_VAULT_INITIATED_CHECKOUT_PARAM_REQUIRED.type,\n        code: errors.PAYPAL_START_VAULT_INITIATED_CHECKOUT_PARAM_REQUIRED.code,\n        message: \"Required param \" + missingRequiredParam + \" is missing.\",\n      })\n    );\n  }\n\n  this._vaultInitiatedCheckoutInProgress = true;\n  this._addModalBackdrop(options);\n\n  options = assign({}, options, {\n    flow: \"checkout\",\n  });\n  analytics.sendEventPlus(\n    this._clientPromise,\n    \"paypal-checkout.startVaultInitiatedCheckout.started\",\n    {\n      flow: self._flow,\n      context_id: self._contextId, // eslint-disable-line camelcase\n    }\n  );\n\n  return this._waitForVaultInitiatedCheckoutDependencies()\n    .then(function () {\n      var frameCommunicationPromise = new ExtendedPromise();\n      var startVaultInitiatedCheckoutPromise = self\n        ._createPaymentResource(options, {\n          returnUrl: self._constructVaultCheckoutUrl(\"redirect-frame\"),\n          cancelUrl: self._constructVaultCheckoutUrl(\"cancel-frame\"),\n        })\n        .then(function (response) {\n          var redirectUrl = response.paymentResource.redirectUrl;\n\n          self._frameService.redirect(redirectUrl);\n\n          return frameCommunicationPromise;\n        });\n\n      self._frameService.open(\n        {},\n        self._createFrameServiceCallback(frameCommunicationPromise)\n      );\n\n      return startVaultInitiatedCheckoutPromise;\n    })\n    .catch(function (err) {\n      self._vaultInitiatedCheckoutInProgress = false;\n      self._removeModalBackdrop();\n\n      if (err.code === \"FRAME_SERVICE_FRAME_CLOSED\") {\n        analytics.sendEventPlus(\n          self._clientPromise,\n          \"paypal-checkout.startVaultInitiatedCheckout.canceled.by-customer\",\n          {\n            flow: self._flow,\n            context_id: self._contextId, // eslint-disable-line camelcase\n          }\n        );\n\n        return Promise.reject(\n          new BraintreeError(\n            errors.PAYPAL_START_VAULT_INITIATED_CHECKOUT_CANCELED\n          )\n        );\n      }\n\n      if (self._frameService) {\n        self._frameService.close();\n      }\n\n      if (\n        err.code &&\n        err.code.indexOf(\"FRAME_SERVICE_FRAME_OPEN_FAILED\") > -1\n      ) {\n        analytics.sendEventPlus(\n          self._clientPromise,\n          \"paypal-checkout.startVaultInitiatedCheckout.failed.popup-not-opened\",\n          {\n            flow: self._flow,\n            context_id: self._contextId, // eslint-disable-line camelcase\n          }\n        );\n\n        return Promise.reject(\n          new BraintreeError({\n            code: errors.PAYPAL_START_VAULT_INITIATED_CHECKOUT_POPUP_OPEN_FAILED\n              .code,\n            type: errors.PAYPAL_START_VAULT_INITIATED_CHECKOUT_POPUP_OPEN_FAILED\n              .type,\n            message:\n              errors.PAYPAL_START_VAULT_INITIATED_CHECKOUT_POPUP_OPEN_FAILED\n                .message,\n            details: {\n              originalError: err,\n            },\n          })\n        );\n      }\n\n      return Promise.reject(err);\n    })\n    .then(function (response) {\n      self._frameService.close();\n      self._vaultInitiatedCheckoutInProgress = false;\n      self._removeModalBackdrop();\n      analytics.sendEventPlus(\n        self._clientPromise,\n        \"paypal-checkout.startVaultInitiatedCheckout.succeeded\",\n        {\n          flow: self._flow,\n          context_id: self._contextId, // eslint-disable-line camelcase\n        }\n      );\n\n      return Promise.resolve(response);\n    });\n};\n\nPayPalCheckout.prototype._addModalBackdrop = function (options) {\n  if (options.optOutOfModalBackdrop) {\n    return;\n  }\n\n  if (!this._modalBackdrop) {\n    this._modalBackdrop = document.createElement(\"div\");\n    this._modalBackdrop.setAttribute(\n      \"data-braintree-paypal-vault-initiated-checkout-modal\",\n      true\n    );\n    this._modalBackdrop.style.position = \"fixed\";\n    this._modalBackdrop.style.top = 0;\n    this._modalBackdrop.style.bottom = 0;\n    this._modalBackdrop.style.left = 0;\n    this._modalBackdrop.style.right = 0;\n    this._modalBackdrop.style.zIndex = 9999;\n    this._modalBackdrop.style.background = \"black\";\n    this._modalBackdrop.style.opacity = \"0.7\";\n    this._modalBackdrop.addEventListener(\n      \"click\",\n      function () {\n        this.focusVaultInitiatedCheckoutWindow();\n      }.bind(this)\n    );\n  }\n\n  document.body.appendChild(this._modalBackdrop);\n};\n\nPayPalCheckout.prototype._removeModalBackdrop = function () {\n  if (!(this._modalBackdrop && this._modalBackdrop.parentNode)) {\n    return;\n  }\n\n  this._modalBackdrop.parentNode.removeChild(this._modalBackdrop);\n};\n\n/**\n * Closes the PayPal window if it is opened via `startVaultInitiatedCheckout`.\n * @public\n * @ignore\n * @param {callback} [callback] Gets called when window is closed.\n * @example\n * paypalCheckoutInstance.closeVaultInitiatedCheckoutWindow();\n * @returns {(Promise|void)} Returns a promise if no callback is provided.\n */\nPayPalCheckout.prototype.closeVaultInitiatedCheckoutWindow = function () {\n  if (this._vaultInitiatedCheckoutInProgress) {\n    analytics.sendEventPlus(\n      this._clientPromise,\n      \"paypal-checkout.startVaultInitiatedCheckout.canceled.by-merchant\",\n      {\n        flow: this._flow,\n        context_id: this._contextId, // eslint-disable-line camelcase\n      }\n    );\n  }\n\n  return this._waitForVaultInitiatedCheckoutDependencies().then(\n    function () {\n      this._frameService.close();\n    }.bind(this)\n  );\n};\n\n/**\n * Focuses the PayPal window if it is opened via `startVaultInitiatedCheckout`.\n * @public\n * @ignore\n * @param {callback} [callback] Gets called when window is focused.\n * @example\n * paypalCheckoutInstance.focusVaultInitiatedCheckoutWindow();\n * @returns {(Promise|void)} Returns a promise if no callback is provided.\n */\nPayPalCheckout.prototype.focusVaultInitiatedCheckoutWindow = function () {\n  return this._waitForVaultInitiatedCheckoutDependencies().then(\n    function () {\n      this._frameService.focus();\n    }.bind(this)\n  );\n};\n\nPayPalCheckout.prototype._createFrameServiceCallback = function (\n  frameCommunicationPromise\n) {\n  var self = this;\n\n  // eslint-disable-next-line no-warning-comments\n  // TODO when a merchant integrates an iOS or Android integration\n  // with a webview using the web SDK, we will have to add popupbridge\n  // support\n  return function (err, payload) {\n    if (err) {\n      frameCommunicationPromise.reject(err);\n    } else if (payload) {\n      self._frameService.redirect(self._loadingFrameUrl);\n      self\n        .tokenizePayment({\n          paymentToken: payload.token,\n          payerID: payload.PayerID,\n          paymentID: payload.paymentId,\n          orderID: payload.orderId,\n        })\n        .then(function (res) {\n          frameCommunicationPromise.resolve(res);\n        })\n        .catch(function (tokenizationError) {\n          frameCommunicationPromise.reject(tokenizationError);\n        });\n    }\n  };\n};\n\nPayPalCheckout.prototype._waitForVaultInitiatedCheckoutDependencies =\n  function () {\n    var self = this;\n\n    return this._clientPromise.then(function () {\n      return self._frameServicePromise;\n    });\n  };\n\nPayPalCheckout.prototype._constructVaultCheckoutUrl = function (frameName) {\n  var serviceId = this._frameService._serviceId;\n\n  return (\n    this._assetsUrl +\n    \"/html/\" +\n    frameName +\n    useMin(this._isDebug) +\n    \".html?channel=\" +\n    serviceId\n  );\n};\n\n/**\n * Tokenizes the authorize data from the PayPal JS SDK when completing a buyer approval flow.\n * When a {@link callback} is defined, invokes the callback with {@link PayPalCheckout~tokenizePayload|tokenizePayload} and returns undefined. Otherwise, returns a Promise that resolves with a {@link PayPalCheckout~tokenizePayload|tokenizePayload}.\n * @public\n * @param {object} tokenizeOptions Tokens and IDs required to tokenize the payment.\n * @param {string} tokenizeOptions.payerId Payer ID returned by PayPal `onApproved` callback.\n * @param {string} [tokenizeOptions.paymentId] Payment ID returned by PayPal `onApproved` callback.\n * @param {string} [tokenizeOptions.billingToken] Billing Token returned by PayPal `onApproved` callback.\n * @param {boolean} [tokenizeOptions.vault=true] Whether or not to vault the resulting PayPal account (if using a client token generated with a customer id and the vault flow).\n * @param {callback} [callback] The second argument, <code>payload</code>, is a {@link PayPalCheckout~tokenizePayload|tokenizePayload}. If no callback is provided, the promise resolves with a {@link PayPalCheckout~tokenizePayload|tokenizePayload}.\n * @example <caption>Opt out of auto-vaulting behavior</caption>\n * // create the paypalCheckoutInstance with a client token generated with a customer id\n * paypal.Buttons({\n *   createBillingAgreement: function () {\n *     return paypalCheckoutInstance.createPayment({\n *       flow: 'vault'\n *       // your other createPayment options here\n *     });\n *   },\n *   onApproved: function (data) {\n *     data.vault = false;\n *\n *     return paypalCheckoutInstance.tokenizePayment(data);\n *   },\n *   // Add other options, e.g. onCancel, onError\n * }).render('#paypal-button');\n *\n * @returns {(Promise|void)} Returns a promise if no callback is provided.\n */\nPayPalCheckout.prototype.tokenizePayment = function (tokenizeOptions) {\n  var self = this;\n  var shouldVault = true;\n  var payload;\n  var options = {\n    flow: this._flow,\n    intent: tokenizeOptions.intent || this.intentFromCreatePayment,\n  };\n  var params = {\n    // The paymentToken provided by the PayPal JS SDK is the EC Token\n    ecToken: tokenizeOptions.paymentToken,\n    billingToken: tokenizeOptions.billingToken,\n    payerId: tokenizeOptions.payerID,\n    paymentId: tokenizeOptions.paymentID,\n    orderId: tokenizeOptions.orderID,\n    shippingOptionsId: tokenizeOptions.shippingOptionsId,\n  };\n\n  if (tokenizeOptions.hasOwnProperty(\"vault\")) {\n    shouldVault = tokenizeOptions.vault;\n  }\n\n  options.vault = shouldVault;\n\n  analytics.sendEventPlus(\n    this._clientPromise,\n    \"paypal-checkout.tokenization.started\",\n    {\n      flow: self._flow,\n      context_id: self._contextId, // eslint-disable-line camelcase\n    }\n  );\n\n  return this._clientPromise\n    .then(function (client) {\n      return client.request({\n        endpoint: \"payment_methods/paypal_accounts\",\n        method: \"post\",\n        data: self._formatTokenizeData(options, params),\n      });\n    })\n    .then(function (response) {\n      payload = self._formatTokenizePayload(response);\n\n      analytics.sendEventPlus(\n        self._clientPromise,\n        \"paypal-checkout.tokenization.success\",\n        {\n          flow: self._flow,\n          context_id: self._contextId, // eslint-disable-line camelcase\n        }\n      );\n      if (payload.creditFinancingOffered) {\n        analytics.sendEventPlus(\n          self._clientPromise,\n          \"paypal-checkout.credit.accepted\",\n          {\n            flow: self._flow,\n            context_id: self._contextId, // eslint-disable-line camelcase\n          }\n        );\n      }\n\n      return payload;\n    })\n    .catch(function (err) {\n      if (self._setupError) {\n        return Promise.reject(self._setupError);\n      }\n\n      analytics.sendEventPlus(\n        self._clientPromise,\n        \"paypal-checkout.tokenization.failed\",\n        {\n          flow: self._flow,\n          context_id: self._contextId, // eslint-disable-line camelcase\n        }\n      );\n\n      return Promise.reject(\n        convertToBraintreeError(err, {\n          type: errors.PAYPAL_ACCOUNT_TOKENIZATION_FAILED.type,\n          code: errors.PAYPAL_ACCOUNT_TOKENIZATION_FAILED.code,\n          message: errors.PAYPAL_ACCOUNT_TOKENIZATION_FAILED.message,\n        })\n      );\n    });\n};\n\n/**\n * Resolves with the PayPal client id to be used when loading the PayPal SDK.\n * @public\n * @param {callback} [callback] The second argument, <code>id</code>, is a the PayPal client id. If no callback is provided, the promise resolves with the PayPal client id.\n * @returns {(Promise|void)} Returns a promise if no callback is provided.\n * @example\n * paypalCheckoutInstance.getClientId().then(function (id) {\n *  var script = document.createElement('script');\n *\n *  script.src = 'https://www.paypal.com/sdk/js?client-id=' + id;\n *  script.onload = function () {\n *    // setup the PayPal SDK\n *  };\n *\n *  document.body.appendChild(script);\n * });\n */\nPayPalCheckout.prototype.getClientId = function () {\n  return this._clientPromise.then(function (client) {\n    return client.getConfiguration().gatewayConfiguration.paypal.clientId;\n  });\n};\n\n/**\n * Resolves when the PayPal SDK has been successfully loaded onto the page.\n * @public\n * @param {object} [options] A configuration object to modify the query params and data-attributes on the PayPal SDK. A subset of the parameters are listed below. For a full list of query params, see the [PayPal docs](https://developer.paypal.com/docs/checkout/reference/customize-sdk/?mark=query#query-parameters).\n * @param {string} [options.client-id] By default, this will be the client id associated with the authorization used to create the Braintree component. When used in conjunction with passing `authorization` when creating the PayPal Checkout component, you can speed up the loading of the PayPal SDK.\n * @param {string} [options.intent=\"authorize\"] By default, the PayPal SDK defaults to an intent of `capture`. Since the default intent when calling {@link PayPalCheckout#createPayment|`createPayment`} is `authorize`, the PayPal SDK will be loaded with `intent=authorize`. If you wish to use a different intent when calling {@link PayPalCheckout#createPayment|`createPayment`}, make sure it matches here. If `sale` is used, it will be converted to `capture` for the PayPal SDK. If the `vault: true` param is used, `tokenize` will be passed as the default intent.\n * @param {string} [options.locale=en_US] Use this option to change the language, links, and terminology used in the PayPal flow. This locale will be used unless the buyer has set a preferred locale for their account. If an unsupported locale is supplied, a fallback locale (determined by buyer preference or browser data) will be used and no error will be thrown.\n *\n * Supported locales are:\n * `da_DK`,\n * `de_DE`,\n * `en_AU`,\n * `en_GB`,\n * `en_US`,\n * `es_ES`,\n * `fr_CA`,\n * `fr_FR`,\n * `id_ID`,\n * `it_IT`,\n * `ja_JP`,\n * `ko_KR`,\n * `nl_NL`,\n * `no_NO`,\n * `pl_PL`,\n * `pt_BR`,\n * `pt_PT`,\n * `ru_RU`,\n * `sv_SE`,\n * `th_TH`,\n * `zh_CN`,\n * `zh_HK`,\n * and `zh_TW`.\n *\n * @param {string} [options.currency=\"USD\"] If a currency is passed in {@link PayPalCheckout#createPayment|`createPayment`}, it must match the currency passed here.\n * @param {boolean} [options.vault] Must be `true` when using `flow: vault` in {@link PayPalCheckout#createPayment|`createPayment`}.\n * @param {string} [options.components=buttons] By default, the Braintree SDK will only load the PayPal smart buttons component. If you would like to load just the [messages component](https://developer.paypal.com/docs/business/checkout/add-capabilities/credit-messaging/), pass `messages`. If you would like to load both, pass `buttons,messages`\n * @param {object} [options.dataAttributes] The data attributes to apply to the script. Any data attribute can be passed. A subset of the parameters are listed below. For a full list of data attributes, see the [PayPal docs](https://developer.paypal.com/docs/checkout/reference/customize-sdk/#script-parameters).\n * @param {string} [options.dataAttributes.client-token] The client token to use in the script. (usually not needed)\n * @param {string} [options.dataAttributes.csp-nonce] See the [PayPal docs about content security nonces](https://developer.paypal.com/docs/checkout/reference/customize-sdk/#csp-nonce).\n * @param {callback} [callback] Called when the PayPal SDK has been loaded onto the page. The second argument is the PayPal Checkout instance. If no callback is provided, the promise resolves with the PayPal Checkout instance when the PayPal SDK has been loaded onto the page.\n * @returns {(Promise|void)} Returns a promise if no callback is provided.\n * @example <caption>Without options</caption>\n * paypalCheckoutInstance.loadPayPalSDK().then(function () {\n *   // window.paypal.Buttons is now available to use\n * });\n * @example <caption>With options</caption>\n * paypalCheckoutInstance.loadPayPalSDK({\n *   'client-id': 'PayPal Client Id', // Can speed up rendering time to hardcode this value\n *\n *   intent: 'capture', // Make sure this value matches the value in createPayment\n *   currency: 'USD', // Make sure this value matches the value in createPayment\n * }).then(function () {\n *   // window.paypal.Buttons is now available to use\n * });\n * @example <caption>With Vaulting</caption>\n * paypalCheckoutInstance.loadPayPalSDK({\n *   vault: true\n * }).then(function () {\n *   // window.paypal.Buttons is now available to use\n * });\n */\nPayPalCheckout.prototype.loadPayPalSDK = function (options) {\n  var idPromise, src;\n  var loadPromise = new ExtendedPromise();\n  var dataAttributes = (options && options.dataAttributes) || {};\n  var userIdToken =\n    dataAttributes[\"user-id-token\"] || dataAttributes[\"data-user-id-token\"];\n\n  if (this._configuration) {\n    dataAttributes[\"client-metadata-id\"] = dataAttributes[\"client-metadata-id\"]\n      ? dataAttributes[\"client-metadata-id\"]\n      : this._configuration.analyticsMetadata.sessionId;\n    // Adding this attribute for PayPal SDK to consume for their own analytics\n    dataAttributes[\"data-sdk-integration-source\"] =\n      constants.BT_INTEGRATION_SOURCE;\n  }\n\n  if (!userIdToken) {\n    userIdToken =\n      this._authorizationInformation.fingerprint &&\n      this._authorizationInformation.fingerprint.split(\"?\")[0];\n  }\n\n  this._paypalScript = document.createElement(\"script\");\n\n  // NEXT_MAJOR_VERSION\n  // this options object should have 2 properties:\n  // * queryParams\n  // * dataAttributes\n  // should make organizing this better than squashing\n  // all the query params at the top level and extracting\n  // the data attributes\n  options = assign(\n    {},\n    {\n      components: \"buttons\",\n    },\n    options\n  );\n  delete options.dataAttributes;\n\n  // NEXT_MAJOR_VERSION if merchant passes an explicit intent,\n  // currency, amount, etc, save those for use in createPayment\n  // if no explicit param of that type is passed in when calling\n  // createPayment to reduce the number of items that need to be\n  // duplicated here and in createPayment\n  if (options.vault) {\n    options.intent = options.intent || \"tokenize\";\n  } else {\n    options.intent = options.intent || \"authorize\";\n    options.currency = options.currency || \"USD\";\n  }\n  // for internal testing only\n  src = constants.ENVIRONMENT[options.env] || \"https://www.paypal.com/sdk/js?\";\n  delete options.env;\n\n  this._paypalScript.onload = function () {\n    loadPromise.resolve();\n  };\n\n  Object.keys(dataAttributes).forEach(\n    function (attribute) {\n      this._paypalScript.setAttribute(\n        \"data-\" + attribute.replace(/^data\\-/, \"\"),\n        dataAttributes[attribute]\n      );\n    }.bind(this)\n  );\n\n  if (options[\"client-id\"]) {\n    idPromise = Promise.resolve(options[\"client-id\"]);\n  } else {\n    idPromise = this.getClientId();\n  }\n\n  idPromise.then(\n    function (id) {\n      options[\"client-id\"] = id;\n\n      if (this._autoSetDataUserIdToken && userIdToken) {\n        this._paypalScript.setAttribute(\"data-user-id-token\", userIdToken);\n\n        // preloading improves the rendering time of the PayPal button\n        this._attachPreloadPixel({\n          id: id,\n          userIdToken: userIdToken,\n          amount: dataAttributes.amount,\n          currency: options.currency,\n          merchantId: options[\"merchant-id\"],\n        });\n      }\n\n      this._paypalScript.src = querystring.queryify(src, options);\n      document.head.insertBefore(\n        this._paypalScript,\n        document.head.firstElementChild\n      );\n    }.bind(this)\n  );\n\n  return loadPromise.then(\n    function () {\n      return this;\n    }.bind(this)\n  );\n};\n\nPayPalCheckout.prototype._attachPreloadPixel = function (options) {\n  var request;\n  var id = options.id;\n  var userIdToken = options.userIdToken;\n  var env = this._authorizationInformation.environment;\n  var subdomain = env === \"production\" ? \"\" : \"sandbox.\";\n  var url = PAYPAL_SDK_PRELOAD_URL.replace(\"{ENV}\", subdomain);\n  var preloadOptions = {\n    \"client-id\": id,\n    \"user-id-token\": userIdToken,\n  };\n\n  if (options.amount) {\n    preloadOptions.amount = options.amount;\n  }\n  if (options.currency) {\n    preloadOptions.currency = options.currency;\n  }\n  if (options.merchantId) {\n    preloadOptions[\"merchant-id\"] = options.merchantId;\n  }\n\n  request = new XMLHttpRequest();\n  request.open(\"GET\", querystring.queryify(url, preloadOptions));\n  request.send();\n};\n\nPayPalCheckout.prototype._formatPaymentResourceData = function (\n  options,\n  config\n) {\n  var self = this;\n  var gatewayConfiguration = this._configuration.gatewayConfiguration;\n  // NEXT_MAJOR_VERSION default value for intent in PayPal SDK is capture\n  // but our integrations default value is authorize. Default this to capture\n  // in the next major version.\n  var paymentResource = {\n    // returnUrl and cancelUrl are required in hermes create_payment_resource route\n    // but are not used by the PayPal sdk, except to redirect to an error page\n    returnUrl: config.returnUrl || \"https://www.paypal.com/checkoutnow/error\",\n    cancelUrl: config.cancelUrl || \"https://www.paypal.com/checkoutnow/error\",\n    offerPaypalCredit: options.offerCredit === true,\n    merchantAccountId: this._merchantAccountId,\n    experienceProfile: {\n      brandName: options.displayName || gatewayConfiguration.paypal.displayName,\n      localeCode: options.locale,\n      noShipping: (!options.enableShippingAddress).toString(),\n      addressOverride: options.shippingAddressEditable === false,\n      landingPageType: options.landingPageType,\n    },\n    shippingOptions: options.shippingOptions,\n    payer_email: options.userAuthenticationEmail, // eslint-disable-line camelcase\n  };\n\n  if (options.hasOwnProperty(\"returnUrl\")) {\n    paymentResource.returnUrl = options.returnUrl;\n  }\n\n  if (options.hasOwnProperty(\"cancelUrl\")) {\n    paymentResource.cancelUrl = options.cancelUrl;\n  }\n\n  if (options.hasOwnProperty(\"appSwitchPreference\")) {\n    paymentResource.appSwitchPreference = options.appSwitchPreference;\n  }\n\n  if (options.hasOwnProperty(\"shippingCallbackUrl\")) {\n    paymentResource.shippingCallbackUrl = options.shippingCallbackUrl;\n  }\n\n  if (options.hasOwnProperty(\"paymentReadySessionId\")) {\n    paymentResource.paymentReadySessionId = options.paymentReadySessionId;\n  }\n\n  if (options.hasOwnProperty(\"amountBreakdown\")) {\n    paymentResource.amountBreakdown = options.amountBreakdown;\n  }\n\n  if (options.planType) {\n    paymentResource.planType = options.planType;\n  }\n\n  if (options.planMetadata) {\n    paymentResource.planMetadata = this._formatPlanMetadata(\n      options.planMetadata\n    );\n  }\n\n  self._formatPaymentResourceCheckoutData(paymentResource, options);\n  self._formatPaymentResourceVaultData(paymentResource, options);\n\n  // this needs to be set outside of the block where add it to the\n  // payment request so that a follow up tokenization call can use it,\n  // but if a second create payment resource call is made without\n  // the correlation id, we want to reset it to undefined so that the\n  // tokenization call does not use a stale correlation id\n  this._riskCorrelationId = options.riskCorrelationId;\n  if (options.riskCorrelationId) {\n    paymentResource.correlationId = this._riskCorrelationId;\n  }\n\n  return paymentResource;\n};\n\nPayPalCheckout.prototype._formatPaymentResourceVaultData = function (\n  paymentResource,\n  options\n) {\n  if (options.flow !== \"checkout\") {\n    paymentResource.shippingAddress = options.shippingAddressOverride;\n\n    if (options.billingAgreementDescription) {\n      paymentResource.description = options.billingAgreementDescription;\n    }\n\n    if (options.hasOwnProperty(\"userAction\")) {\n      paymentResource.experienceProfile.userAction = options.userAction;\n    }\n  }\n};\n\nPayPalCheckout.prototype._formatPaymentResourceCheckoutData = function (\n  paymentResource,\n  options\n) {\n  var key;\n  var intent = options.intent;\n\n  if (options.flow === \"checkout\") {\n    paymentResource.amount = options.amount;\n    paymentResource.currencyIsoCode = options.currency;\n    paymentResource.requestBillingAgreement = options.requestBillingAgreement;\n\n    if (options.hasOwnProperty(\"userAction\")) {\n      paymentResource.experienceProfile.userAction = options.userAction;\n    }\n\n    if (intent) {\n      // 'sale' has been changed to 'capture' in PayPal's backend, but\n      // we use an old version with 'sale'. We provide capture as an alias\n      // to match the PayPal SDK\n      if (intent === \"capture\") {\n        intent = \"sale\";\n      }\n      paymentResource.intent = intent;\n    }\n\n    if (options.hasOwnProperty(\"lineItems\")) {\n      paymentResource.lineItems = options.lineItems;\n    }\n\n    if (options.hasOwnProperty(\"vaultInitiatedCheckoutPaymentMethodToken\")) {\n      paymentResource.vaultInitiatedCheckoutPaymentMethodToken =\n        options.vaultInitiatedCheckoutPaymentMethodToken;\n    }\n\n    if (options.hasOwnProperty(\"shippingOptions\")) {\n      paymentResource.shippingOptions = options.shippingOptions;\n    }\n\n    for (key in options.shippingAddressOverride) {\n      if (options.shippingAddressOverride.hasOwnProperty(key)) {\n        paymentResource[key] = options.shippingAddressOverride[key];\n      }\n    }\n\n    if (options.contactPreference) {\n      paymentResource.contactPreference = options.contactPreference;\n    }\n\n    if (options.hasOwnProperty(\"billingAgreementDetails\")) {\n      paymentResource.billingAgreementDetails = options.billingAgreementDetails;\n    }\n  }\n};\n\n/**\n * @ignore\n * @static\n * @function _verifyConsistentCurrency\n * Verifies that `options.currency` and the currencies for each `shippingOption` the same.\n * @param {object} options `options` provided for `updatePayment`.\n * @returns {boolean} true is currencies match (or no shipping options); false if currencies do not match.\n */\n\nPayPalCheckout.prototype._verifyConsistentCurrency = function (options) {\n  if (\n    options.currency &&\n    options.hasOwnProperty(\"shippingOptions\") &&\n    Array.isArray(options.shippingOptions)\n  ) {\n    return options.shippingOptions.every(function (item) {\n      return (\n        item.amount &&\n        item.amount.currency &&\n        options.currency.toLowerCase() === item.amount.currency.toLowerCase()\n      );\n    });\n  }\n\n  return true;\n};\n\n/**\n * @ignore\n * @static\n * @function _hasMissingOption\n * @param {object} options All options provided for intiating the PayPal flow.\n * @param {array} required A list of required inputs that must be include as part of the options.\n * @returns {boolean} Returns a boolean.\n */\n\nPayPalCheckout.prototype._hasMissingOption = function (options, required) {\n  var i, option;\n\n  required = required || [];\n\n  if (\n    !options.hasOwnProperty(\"amount\") &&\n    !options.hasOwnProperty(\"lineItems\")\n  ) {\n    return true;\n  }\n\n  for (i = 0; i < required.length; i++) {\n    option = required[i];\n\n    if (!options.hasOwnProperty(option)) {\n      return true;\n    }\n  }\n\n  return false;\n};\n\n/**\n * @ignore\n * @static\n * @function _formatPlanMetadata\n * @param {object} plan All options required for the billing agreement vault flow.\n * @returns {object} Returns a formatted planMetadata object.\n */\nPayPalCheckout.prototype._formatPlanMetadata = function (plan) {\n  var i, j, billingCycle, formattedBillingCycle;\n  var planProperties = [\n    \"currencyIsoCode\",\n    \"name\",\n    \"oneTimeFeeAmount\",\n    \"productDescription\",\n    \"productPrice\",\n    \"productQuantity\",\n    \"shippingAmount\",\n    \"taxAmount\",\n    \"totalAmount\",\n  ];\n  var requiredbillingCycle = [\n    \"billingFrequency\",\n    \"billingFrequencyUnit\",\n    \"numberOfExecutions\",\n    \"sequence\",\n    \"startDate\",\n    \"trial\",\n    \"pricingScheme\",\n  ];\n  var formattedPlan = { billingCycles: [] };\n\n  if (plan.hasOwnProperty(\"billingCycles\")) {\n    formattedPlan.billingCycles = [];\n\n    for (i = 0; i < plan.billingCycles.length; i++) {\n      billingCycle = plan.billingCycles[i];\n      formattedBillingCycle = {};\n\n      for (j = 0; j < requiredbillingCycle.length; j++) {\n        formattedBillingCycle[requiredbillingCycle[j]] =\n          billingCycle[requiredbillingCycle[j]];\n      }\n      formattedPlan.billingCycles.push(formattedBillingCycle);\n    }\n  }\n\n  for (i = 0; i < planProperties.length; i++) {\n    formattedPlan[planProperties[i]] = plan[planProperties[i]];\n  }\n\n  return formattedPlan;\n};\n\nPayPalCheckout.prototype._formatUpdatePaymentData = function (options) {\n  var self = this;\n  var paymentResource = {\n    merchantAccountId: this._merchantAccountId,\n    paymentId: options.paymentId || options.orderId,\n    currencyIsoCode: options.currency,\n  };\n\n  if (options.hasOwnProperty(\"amount\")) {\n    paymentResource.amount = options.amount;\n  }\n\n  if (options.hasOwnProperty(\"lineItems\")) {\n    paymentResource.lineItems = options.lineItems;\n  }\n\n  if (options.hasOwnProperty(\"shippingOptions\")) {\n    paymentResource.shippingOptions = options.shippingOptions;\n  }\n\n  if (options.hasOwnProperty(\"amountBreakdown\")) {\n    paymentResource.amountBreakdown = options.amountBreakdown;\n  }\n\n  /* shippingAddress not supported yet */\n  if (options.hasOwnProperty(\"shippingAddress\")) {\n    analytics.sendEventPlus(\n      self._clientPromise,\n      \"paypal-checkout.updatePayment.shippingAddress.provided.by-the-merchant\",\n      {\n        flow: self._flow,\n        context_id: self._contextId, // eslint-disable-line camelcase\n      }\n    );\n\n    paymentResource.line1 = options.shippingAddress.line1;\n\n    if (options.shippingAddress.hasOwnProperty(\"line2\")) {\n      paymentResource.line2 = options.shippingAddress.line2;\n    }\n\n    paymentResource.city = options.shippingAddress.city;\n    paymentResource.state = options.shippingAddress.state;\n    paymentResource.postalCode = options.shippingAddress.postalCode;\n    paymentResource.countryCode = options.shippingAddress.countryCode;\n\n    if (options.shippingAddress.hasOwnProperty(\"phone\")) {\n      paymentResource.phone = options.shippingAddress.phone;\n    }\n\n    if (options.shippingAddress.hasOwnProperty(\"recipientName\")) {\n      paymentResource.recipientName = options.shippingAddress.recipientName;\n    }\n  }\n\n  return paymentResource;\n};\n\nPayPalCheckout.prototype._formatTokenizeData = function (options, params) {\n  var clientConfiguration = this._configuration;\n  var gatewayConfiguration = clientConfiguration.gatewayConfiguration;\n  var isTokenizationKey =\n    clientConfiguration.authorizationType === \"TOKENIZATION_KEY\";\n  // Non-default browsers in the app-switch flow will return to a new tab\n  // where the context of flow is lost, so in these cases we need to check\n  // if paymentId is returned in the onApprove callback. This param is\n  // null for vault flows.\n  var isVaultFlow =\n    options.flow === \"vault\" || (options.flow == null && !params.paymentId);\n  var correlationId =\n    this._riskCorrelationId || params.billingToken || params.ecToken;\n  var data = {\n    paypalAccount: {\n      correlationId: correlationId,\n      options: {\n        validate: isVaultFlow && !isTokenizationKey && options.vault,\n      },\n    },\n  };\n\n  if (isVaultFlow) {\n    data.paypalAccount.billingAgreementToken = params.billingToken;\n  } else {\n    data.paypalAccount.paymentToken = params.paymentId || params.orderId;\n    data.paypalAccount.payerId = params.payerId;\n    data.paypalAccount.unilateral =\n      gatewayConfiguration.paypal.unvettedMerchant;\n\n    if (options.intent) {\n      data.paypalAccount.intent = options.intent;\n    }\n  }\n\n  if (this._merchantAccountId) {\n    data.merchantAccountId = this._merchantAccountId;\n  }\n\n  return data;\n};\n\nPayPalCheckout.prototype._formatTokenizePayload = function (response) {\n  var payload;\n  var account = {};\n\n  if (response.paypalAccounts) {\n    account = response.paypalAccounts[0];\n  }\n\n  payload = {\n    nonce: account.nonce,\n    details: {},\n    type: account.type,\n  };\n\n  if (account.details && account.details.payerInfo) {\n    payload.details = account.details.payerInfo;\n  }\n\n  if (account.details && account.details.creditFinancingOffered) {\n    payload.creditFinancingOffered = account.details.creditFinancingOffered;\n  }\n\n  if (account.details && account.details.shippingOptionId) {\n    payload.shippingOptionId = account.details.shippingOptionId;\n  }\n\n  if (account.details && account.details.cobrandedCardLabel) {\n    payload.cobrandedCardLabel = account.details.cobrandedCardLabel;\n  }\n\n  return payload;\n};\n\n/**\n * Cleanly tear down anything set up by {@link module:braintree-web/paypal-checkout.create|create}.\n * @public\n * @param {callback} [callback] Called once teardown is complete. No data is returned if teardown completes successfully.\n * @example\n * paypalCheckoutInstance.teardown();\n * @example <caption>With callback</caption>\n * paypalCheckoutInstance.teardown(function () {\n *   // teardown is complete\n * });\n * @returns {(Promise|void)} Returns a promise if no callback is provided.\n */\nPayPalCheckout.prototype.teardown = function () {\n  var self = this;\n\n  convertMethodsToError(this, methods(PayPalCheckout.prototype));\n\n  if (this._paypalScript && this._paypalScript.parentNode) {\n    this._paypalScript.parentNode.removeChild(this._paypalScript);\n  }\n\n  return this._frameServicePromise\n    .catch(function () {\n      // no need to error in teardown for an error setting up the frame service\n    })\n    .then(function () {\n      if (!self._frameService) {\n        return Promise.resolve();\n      }\n\n      return self._frameService.teardown();\n    });\n};\n\nmodule.exports = wrapPromise.wrapPrototype(PayPalCheckout);\n\n},{\"../lib/analytics\":143,\"../lib/assign\":145,\"../lib/braintree-error\":148,\"../lib/constants\":149,\"../lib/convert-methods-to-error\":150,\"../lib/convert-to-braintree-error\":151,\"../lib/create-assets-url\":152,\"../lib/create-authorization-data\":153,\"../lib/create-deferred-client\":154,\"../lib/frame-service/external\":162,\"../lib/methods\":180,\"../lib/querystring\":182,\"../lib/use-min\":186,\"../paypal/shared/constants\":212,\"./errors\":207,\"@braintree/extended-promise\":34,\"@braintree/wrap-promise\":43}],210:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar frameService = _dereq_(\"../../lib/frame-service/external\");\nvar BraintreeError = _dereq_(\"../../lib/braintree-error\");\nvar convertToBraintreeError = _dereq_(\"../../lib/convert-to-braintree-error\");\nvar useMin = _dereq_(\"../../lib/use-min\");\nvar once = _dereq_(\"../../lib/once\");\nvar VERSION = \"3.134.0\";\nvar constants = _dereq_(\"../shared/constants\");\nvar INTEGRATION_TIMEOUT_MS =\n  _dereq_(\"../../lib/constants\").INTEGRATION_TIMEOUT_MS;\nvar analytics = _dereq_(\"../../lib/analytics\");\nvar methods = _dereq_(\"../../lib/methods\");\nvar deferred = _dereq_(\"../../lib/deferred\");\nvar errors = _dereq_(\"../shared/errors\");\nvar convertMethodsToError = _dereq_(\"../../lib/convert-methods-to-error\");\nvar querystring = _dereq_(\"../../lib/querystring\");\nvar wrapPromise = _dereq_(\"@braintree/wrap-promise\");\n\n/**\n * @typedef {object} PayPal~tokenizePayload\n * @property {string} nonce The payment method nonce.\n * @property {string} type The payment method type, always `PayPalAccount`.\n * @property {object} details Additional PayPal account details.\n * @property {string} details.email User's email address.\n * @property {string} details.payerId User's payer ID, the unique identifier for each PayPal account.\n * @property {string} details.firstName User's given name.\n * @property {string} details.lastName User's surname.\n * @property {?string} details.countryCode User's 2 character country code.\n * @property {?string} details.phone User's phone number (e.g. 555-867-5309).\n * @property {?object} details.shippingAddress User's shipping address details, only available if shipping address is enabled.\n * @property {string} details.shippingAddress.recipientName Recipient of postage.\n * @property {string} details.shippingAddress.line1 Street number and name.\n * @property {string} details.shippingAddress.line2 Extended address.\n * @property {string} details.shippingAddress.city City or locality.\n * @property {string} details.shippingAddress.state State or region.\n * @property {string} details.shippingAddress.postalCode Postal code.\n * @property {string} details.shippingAddress.countryCode 2 character country code (e.g. US).\n * @property {?object} details.billingAddress User's billing address details.\n * Not available to all merchants; [contact support](https://developer.paypal.com/braintree/help) for details on eligibility and enabling this feature.\n * Alternatively, see `shippingAddress` above as an available client option.\n * @property {string} details.billingAddress.line1 Street number and name.\n * @property {string} details.billingAddress.line2 Extended address.\n * @property {string} details.billingAddress.city City or locality.\n * @property {string} details.billingAddress.state State or region.\n * @property {string} details.billingAddress.postalCode Postal code.\n * @property {string} details.billingAddress.countryCode 2 character country code (e.g. US).\n * @property {?object} creditFinancingOffered This property will only be present when the customer pays with PayPal Credit.\n * @property {object} creditFinancingOffered.totalCost This is the estimated total payment amount including interest and fees the user will pay during the lifetime of the loan.\n * @property {string} creditFinancingOffered.totalCost.value An amount defined by [ISO 4217](https://www.iso.org/iso/home/standards/currency_codes.htm) for the given currency.\n * @property {string} creditFinancingOffered.totalCost.currency 3 letter currency code as defined by [ISO 4217](https://www.iso.org/iso/home/standards/currency_codes.htm).\n * @property {number} creditFinancingOffered.term Length of financing terms in months.\n * @property {object} creditFinancingOffered.monthlyPayment This is the estimated amount per month that the customer will need to pay including fees and interest.\n * @property {string} creditFinancingOffered.monthlyPayment.value An amount defined by [ISO 4217](https://www.iso.org/iso/home/standards/currency_codes.htm) for the given currency.\n * @property {string} creditFinancingOffered.monthlyPayment.currency 3 letter currency code as defined by [ISO 4217](https://www.iso.org/iso/home/standards/currency_codes.htm).\n * @property {object} creditFinancingOffered.totalInterest Estimated interest or fees amount the payer will have to pay during the lifetime of the loan.\n * @property {string} creditFinancingOffered.totalInterest.value An amount defined by [ISO 4217](https://www.iso.org/iso/home/standards/currency_codes.htm) for the given currency.\n * @property {string} creditFinancingOffered.totalInterest.currency 3 letter currency code as defined by [ISO 4217](https://www.iso.org/iso/home/standards/currency_codes.htm).\n * @property {boolean} creditFinancingOffered.payerAcceptance Status of whether the customer ultimately was approved for and chose to make the payment using the approved installment credit.\n * @property {boolean} creditFinancingOffered.cartAmountImmutable Indicates whether the cart amount is editable after payer's acceptance on PayPal side.\n *\n */\n\n/**\n * @typedef {object} PayPal~tokenizeReturn\n * @property {Function} close A handle to close the PayPal checkout flow.\n * @property {Function} focus A handle to focus the PayPal checkout flow. Note that some browsers (notably iOS Safari) do not support focusing popups. Firefox requires the focus call to occur as the result of a user interaction, such as a button click.\n */\n\n/**\n * @class\n * @param {object} options see {@link module:braintree-web/paypal.create|paypal.create}\n * @classdesc This class represents a PayPal component. Instances of this class can open a PayPal window for authenticating a PayPal account. Any additional UI, such as disabling the page while authentication is taking place, is up to the developer.\n *\n * This component has been deprecated in favor of the {@link PayPalCheckout|PayPal Checkout component}, which provides a fully managed UI. New features will not be added to this component.\n * @description <strong>Do not use this constructor directly. Use {@link module:braintree-web/paypal.create|braintree-web.paypal.create} instead.</strong>\n */\nfunction PayPal(options) {\n  this._client = options.client;\n  this._assetsUrl =\n    options.client.getConfiguration().gatewayConfiguration.paypal.assetsUrl +\n    \"/web/\" +\n    VERSION;\n  this._isDebug = options.client.getConfiguration().isDebug;\n  this._loadingFrameUrl =\n    this._assetsUrl +\n    \"/html/paypal-landing-frame\" +\n    useMin(this._isDebug) +\n    \".html\";\n  this._authorizationInProgress = false;\n}\n\nPayPal.prototype._initialize = function () {\n  var self = this;\n  var client = this._client;\n  var failureTimeout = setTimeout(function () {\n    analytics.sendEvent(client, \"paypal.load.timed-out\");\n  }, INTEGRATION_TIMEOUT_MS);\n\n  return new Promise(function (resolve) {\n    frameService.create(\n      {\n        name: constants.LANDING_FRAME_NAME,\n        dispatchFrameUrl:\n          self._assetsUrl +\n          \"/html/dispatch-frame\" +\n          useMin(self._isDebug) +\n          \".html\",\n        openFrameUrl: self._loadingFrameUrl,\n      },\n      function (service) {\n        self._frameService = service;\n        clearTimeout(failureTimeout);\n        analytics.sendEvent(client, \"paypal.load.succeeded\");\n        resolve(self);\n      }\n    );\n  });\n};\n\n/**\n * Launches the PayPal login flow and returns a nonce payload. Only one PayPal login flow should be active at a time. One way to achieve this is to disable your PayPal button while the flow is open.\n * @public\n * @param {object} options All tokenization options for the PayPal component.\n * @param {string} options.flow Set to 'checkout' for one-time payment flow, or 'vault' for Vault flow. If 'vault' is used with a client token generated with a customer id, the PayPal account will be added to that customer as a saved payment method.\n * @param {string} [options.intent=authorize]\n * * `authorize` - Submits the transaction for authorization but not settlement.\n * * `order` - Validates the transaction without an authorization (i.e. without holding funds). Useful for authorizing and capturing funds up to 90 days after the order has been placed. Only available for Checkout flow.\n * * `sale` - Payment will be immediately submitted for settlement upon creating a transaction.\n * @param {boolean} [options.offerCredit=false] Offers PayPal Credit as the default funding instrument for the transaction. If the customer isn't pre-approved for PayPal Credit, they will be prompted to apply for it.\n * @param {boolean} [options.offerPayLater=false] Offers PayPal Pay Later if the customer qualifies. Defaults to false. Only available with `flow: 'checkout'`.\n * @param {string} [options.useraction]\n * Changes the call-to-action in the PayPal flow. By default the final button will show the localized\n * word for \"Continue\" and implies that the final amount billed is not yet known.\n *\n * Setting this option to `commit` changes the button text to \"Pay Now\" and page text will convey to\n * the user that billing will take place immediately.\n * @param {(string|number)} [options.amount] The amount of the transaction. Required when using the Checkout flow.\n * @param {string} [options.currency] The currency code of the amount, such as 'USD'. Required when using the Checkout flow.\n * @param {string} [options.displayName] The merchant name displayed inside of the PayPal lightbox; defaults to the company name on your Braintree account\n * @param {string} [options.locale=en_US] Use this option to change the language, links, and terminology used in the PayPal flow. This locale will be used unless the buyer has set a preferred locale for their account. If an unsupported locale is supplied, a fallback locale (determined by buyer preference or browser data) will be used and no error will be thrown.\n *\n * Supported locales are:\n * `da_DK`,\n * `de_DE`,\n * `en_AU`,\n * `en_GB`,\n * `en_US`,\n * `es_ES`,\n * `fr_CA`,\n * `fr_FR`,\n * `id_ID`,\n * `it_IT`,\n * `ja_JP`,\n * `ko_KR`,\n * `nl_NL`,\n * `no_NO`,\n * `pl_PL`,\n * `pt_BR`,\n * `pt_PT`,\n * `ru_RU`,\n * `sv_SE`,\n * `th_TH`,\n * `zh_CN`,\n * `zh_HK`,\n * and `zh_TW`.\n *\n * @param {boolean} [options.enableShippingAddress=false] Returns a shipping address object in {@link PayPal#tokenize}.\n * @param {object} [options.shippingAddressOverride] Allows you to pass a shipping address you have already collected into the PayPal payment flow.\n * @param {string} options.shippingAddressOverride.line1 Street address.\n * @param {string} [options.shippingAddressOverride.line2] Street address (extended).\n * @param {string} options.shippingAddressOverride.city City.\n * @param {string} options.shippingAddressOverride.state State.\n * @param {string} options.shippingAddressOverride.postalCode Postal code.\n * @param {string} options.shippingAddressOverride.countryCode Country.\n * @param {string} [options.shippingAddressOverride.phone] Phone number.\n * @param {string} [options.shippingAddressOverride.recipientName] Recipient's name.\n * @param {boolean} [options.shippingAddressEditable=true] Set to false to disable user editing of the shipping address.\n * @param {string} [options.billingAgreementDescription] Use this option to set the description of the preapproved payment agreement visible to customers in their PayPal profile during Vault flows. Max 255 characters.\n * @param {string} [options.landingPageType] Use this option to specify the PayPal page to display when a user lands on the PayPal site to complete the payment.\n * * `login` - A PayPal account login page is used.\n * * `billing` - A non-PayPal account landing page is used.\n * @param {callback} callback The second argument, <code>data</code>, is a {@link PayPal~tokenizePayload|tokenizePayload}.\n * @example\n * <caption>Tokenizing with the vault flow</caption>\n * button.addEventListener('click', function () {\n *   // Disable the button so that we don't attempt to open multiple popups.\n *   button.setAttribute('disabled', 'disabled');\n *\n *   // if there is any other part of the page that must be disabled\n *   // while authentication is in progress, do so now\n *\n *   // Because PayPal tokenization opens a popup, this must be called\n *   // as a result of a user action, such as a button click.\n *   paypalInstance.tokenize({\n *     flow: 'vault' // Required\n *     // Any other tokenization options\n *   }, function (tokenizeErr, payload) {\n *     button.removeAttribute('disabled');\n *\n *     // if any other part of the page was disabled, re-enable now\n *\n *     if (tokenizeErr) {\n *       // Handle tokenization errors or premature flow closure\n *\n *       switch (tokenizeErr.code) {\n *         case 'PAYPAL_POPUP_CLOSED':\n *           console.error('Customer closed PayPal popup.');\n *           break;\n *         case 'PAYPAL_ACCOUNT_TOKENIZATION_FAILED':\n *           console.error('PayPal tokenization failed. See details:', tokenizeErr.details);\n *           break;\n *         case 'PAYPAL_FLOW_FAILED':\n *           console.error('Unable to initialize PayPal flow. Are your options correct?', tokenizeErr.details);\n *           break;\n *         default:\n *           console.error('Error!', tokenizeErr);\n *       }\n *     } else {\n *       // Submit payload.nonce to your server\n *     }\n *   });\n * });\n\n * @example\n * <caption>Tokenizing with the checkout flow</caption>\n * button.addEventListener('click', function () {\n *   // Disable the button so that we don't attempt to open multiple popups.\n *   button.setAttribute('disabled', 'disabled');\n *\n *   // Because PayPal tokenization opens a popup, this must be called\n *   // as a result of a user action, such as a button click.\n *   paypalInstance.tokenize({\n *     flow: 'checkout', // Required\n *     amount: '10.00', // Required\n *     currency: 'USD' // Required\n *     // Any other tokenization options\n *   }, function (tokenizeErr, payload) {\n *     button.removeAttribute('disabled');\n *\n *     if (tokenizeErr) {\n *       // Handle tokenization errors or premature flow closure\n *\n *       switch (tokenizeErr.code) {\n *         case 'PAYPAL_POPUP_CLOSED':\n *           console.error('Customer closed PayPal popup.');\n *           break;\n *         case 'PAYPAL_ACCOUNT_TOKENIZATION_FAILED':\n *           console.error('PayPal tokenization failed. See details:', tokenizeErr.details);\n *           break;\n *         case 'PAYPAL_FLOW_FAILED':\n *           console.error('Unable to initialize PayPal flow. Are your options correct?', tokenizeErr.details);\n *           break;\n *         default:\n *           console.error('Error!', tokenizeErr);\n *       }\n *     } else {\n *       // Submit payload.nonce to your server\n *     }\n *   });\n * });\n * @returns {Promise|PayPal~tokenizeReturn} A handle to manage the PayPal checkout frame. If no callback is provided, returns a promise.\n */\nPayPal.prototype.tokenize = function (options, callback) {\n  var self = this;\n  var client = this._client;\n  var tokenizePromise, optionError;\n\n  if (callback) {\n    callback = once(deferred(callback));\n  }\n\n  if (!options || !constants.FLOW_ENDPOINTS.hasOwnProperty(options.flow)) {\n    optionError = new BraintreeError(errors.PAYPAL_FLOW_OPTION_REQUIRED);\n\n    if (callback) {\n      callback(optionError);\n\n      return this._frameService.createNoopHandler();\n    }\n\n    return Promise.reject(optionError);\n  }\n\n  tokenizePromise = new Promise(function (resolve, reject) {\n    if (self._authorizationInProgress) {\n      analytics.sendEvent(client, \"paypal.tokenization.error.already-opened\");\n\n      reject(new BraintreeError(errors.PAYPAL_TOKENIZATION_REQUEST_ACTIVE));\n    } else {\n      self._authorizationInProgress = true;\n\n      if (!window.popupBridge) {\n        analytics.sendEvent(client, \"paypal.tokenization.opened\");\n      }\n\n      if (options.offerCredit === true) {\n        analytics.sendEvent(client, \"paypal.credit.offered\");\n      }\n\n      if (options.offerPayLater === true) {\n        analytics.sendEvent(client, \"paypal.paylater.offered\");\n      }\n\n      self._navigateFrameToAuth(options).catch(reject);\n      // self MUST happen after _navigateFrameToAuth for Metro browsers to work.\n      self._frameService.open(\n        {},\n        self._createFrameServiceCallback(options, resolve, reject)\n      );\n    }\n  });\n\n  if (callback) {\n    tokenizePromise\n      .then(function (res) {\n        callback(null, res);\n      })\n      .catch(callback);\n\n    return this._frameService.createHandler({\n      beforeClose: function () {\n        analytics.sendEvent(client, \"paypal.tokenization.closed.by-merchant\");\n      },\n    });\n  }\n\n  return tokenizePromise;\n};\n\nPayPal.prototype._createFrameServiceCallback = function (\n  options,\n  resolve,\n  reject\n) {\n  var self = this;\n  var client = this._client;\n\n  if (window.popupBridge) {\n    return function (err, payload) {\n      var canceled =\n        payload && payload.path && payload.path.substring(0, 7) === \"/cancel\";\n\n      self._authorizationInProgress = false;\n\n      // `err` exists when the user clicks \"Done\" button of browser view\n      if (err || canceled) {\n        analytics.sendEvent(client, \"popup-bridge:paypal:canceled\");\n        // Call merchant's tokenize callback with an error\n        reject(new BraintreeError(errors.PAYPAL_POPUP_CLOSED));\n      } else if (payload) {\n        self\n          ._tokenizePayPal(options, payload.queryItems)\n          .then(resolve)\n          .catch(reject);\n      }\n    };\n  }\n\n  return function (err, params) {\n    self._authorizationInProgress = false;\n\n    if (err) {\n      if (err.code === \"FRAME_SERVICE_FRAME_CLOSED\") {\n        analytics.sendEvent(client, \"paypal.tokenization.closed.by-user\");\n        reject(new BraintreeError(errors.PAYPAL_POPUP_CLOSED));\n      } else if (\n        err.code &&\n        err.code.indexOf(\"FRAME_SERVICE_FRAME_OPEN_FAILED\") > -1\n      ) {\n        reject(\n          new BraintreeError({\n            code: errors.PAYPAL_POPUP_OPEN_FAILED.code,\n            type: errors.PAYPAL_POPUP_OPEN_FAILED.type,\n            message: errors.PAYPAL_POPUP_OPEN_FAILED.message,\n            details: {\n              originalError: err,\n            },\n          })\n        );\n      }\n    } else if (params) {\n      self._tokenizePayPal(options, params).then(resolve).catch(reject);\n    }\n  };\n};\n\nPayPal.prototype._tokenizePayPal = function (options, params) {\n  var self = this;\n  var client = this._client;\n\n  if (!window.popupBridge) {\n    this._frameService.redirect(this._loadingFrameUrl);\n  }\n\n  return client\n    .request({\n      endpoint: \"payment_methods/paypal_accounts\",\n      method: \"post\",\n      data: this._formatTokenizeData(options, params),\n    })\n    .then(function (response) {\n      var payload = self._formatTokenizePayload(response);\n\n      if (window.popupBridge) {\n        analytics.sendEvent(client, \"popup-bridge:paypal:succeeded\");\n      } else {\n        analytics.sendEvent(client, \"paypal.tokenization.success\");\n      }\n\n      if (payload.creditFinancingOffered) {\n        analytics.sendEvent(client, \"paypal.credit.accepted\");\n      }\n\n      self._frameService.close();\n\n      return payload;\n    })\n    .catch(function (err) {\n      if (window.popupBridge) {\n        analytics.sendEvent(client, \"popup-bridge:paypal:failed\");\n      } else {\n        analytics.sendEvent(client, \"paypal.tokenization.failed\");\n      }\n\n      self._frameService.close();\n\n      return Promise.reject(\n        convertToBraintreeError(err, {\n          type: errors.PAYPAL_ACCOUNT_TOKENIZATION_FAILED.type,\n          code: errors.PAYPAL_ACCOUNT_TOKENIZATION_FAILED.code,\n          message: errors.PAYPAL_ACCOUNT_TOKENIZATION_FAILED.message,\n        })\n      );\n    });\n};\n\nPayPal.prototype._formatTokenizePayload = function (response) {\n  var payload;\n  var account = {};\n\n  if (response.paypalAccounts) {\n    account = response.paypalAccounts[0];\n  }\n\n  payload = {\n    nonce: account.nonce,\n    details: {},\n    type: account.type,\n  };\n\n  if (account.details && account.details.payerInfo) {\n    payload.details = account.details.payerInfo;\n  }\n\n  if (account.details && account.details.creditFinancingOffered) {\n    payload.creditFinancingOffered = account.details.creditFinancingOffered;\n  }\n\n  return payload;\n};\n\nPayPal.prototype._formatTokenizeData = function (options, params) {\n  var clientConfiguration = this._client.getConfiguration();\n  var gatewayConfiguration = clientConfiguration.gatewayConfiguration;\n  var isTokenizationKey =\n    clientConfiguration.authorizationType === \"TOKENIZATION_KEY\";\n  var data = {\n    paypalAccount: {\n      correlationId: params.ba_token || params.token,\n      options: {\n        validate: options.flow === \"vault\" && !isTokenizationKey,\n      },\n    },\n  };\n\n  if (params.ba_token) {\n    data.paypalAccount.billingAgreementToken = params.ba_token;\n  } else {\n    data.paypalAccount.paymentToken = params.paymentId;\n    data.paypalAccount.payerId = params.PayerID;\n    data.paypalAccount.unilateral =\n      gatewayConfiguration.paypal.unvettedMerchant;\n\n    if (options.hasOwnProperty(\"intent\")) {\n      data.paypalAccount.intent = options.intent;\n    }\n  }\n\n  return data;\n};\n\nPayPal.prototype._navigateFrameToAuth = function (options) {\n  var self = this;\n  var client = this._client;\n  var endpoint = \"paypal_hermes/\" + constants.FLOW_ENDPOINTS[options.flow];\n\n  return client\n    .request({\n      endpoint: endpoint,\n      method: \"post\",\n      data: this._formatPaymentResourceData(options),\n    })\n    .then(function (response) {\n      var redirectUrl;\n\n      if (options.flow === \"checkout\") {\n        redirectUrl = response.paymentResource.redirectUrl;\n      } else {\n        redirectUrl = response.agreementSetup.approvalUrl;\n      }\n\n      if (options.useraction === \"commit\") {\n        redirectUrl = querystring.queryify(redirectUrl, {\n          useraction: \"commit\",\n        });\n      }\n\n      if (window.popupBridge) {\n        analytics.sendEvent(client, \"popup-bridge:paypal:started\");\n      }\n\n      self._frameService.redirect(redirectUrl);\n    })\n    .catch(function (err) {\n      var status = err.details && err.details.httpStatus;\n\n      self._frameService.close();\n      self._authorizationInProgress = false;\n\n      if (status === 422) {\n        return Promise.reject(\n          new BraintreeError({\n            type: errors.PAYPAL_INVALID_PAYMENT_OPTION.type,\n            code: errors.PAYPAL_INVALID_PAYMENT_OPTION.code,\n            message: errors.PAYPAL_INVALID_PAYMENT_OPTION.message,\n            details: {\n              originalError: err,\n            },\n          })\n        );\n      }\n\n      return Promise.reject(\n        convertToBraintreeError(err, {\n          type: errors.PAYPAL_FLOW_FAILED.type,\n          code: errors.PAYPAL_FLOW_FAILED.code,\n          message: errors.PAYPAL_FLOW_FAILED.message,\n        })\n      );\n    });\n};\n\nPayPal.prototype._formatPaymentResourceData = function (options) {\n  var key;\n  var gatewayConfiguration =\n    this._client.getConfiguration().gatewayConfiguration;\n  var serviceId = this._frameService._serviceId;\n  var paymentResource = {\n    returnUrl:\n      gatewayConfiguration.paypal.assetsUrl +\n      \"/web/\" +\n      VERSION +\n      \"/html/redirect-frame\" +\n      useMin(this._isDebug) +\n      \".html?channel=\" +\n      serviceId,\n    cancelUrl:\n      gatewayConfiguration.paypal.assetsUrl +\n      \"/web/\" +\n      VERSION +\n      \"/html/cancel-frame\" +\n      useMin(this._isDebug) +\n      \".html?channel=\" +\n      serviceId,\n    offerPaypalCredit: options.offerCredit === true,\n    offerPayLater: options.offerPayLater === true,\n    experienceProfile: {\n      brandName: options.displayName || gatewayConfiguration.paypal.displayName,\n      localeCode: options.locale,\n      noShipping: (!options.enableShippingAddress).toString(),\n      addressOverride: options.shippingAddressEditable === false,\n      landingPageType: options.landingPageType,\n    },\n  };\n\n  if (\n    window.popupBridge &&\n    typeof window.popupBridge.getReturnUrlPrefix === \"function\"\n  ) {\n    paymentResource.returnUrl =\n      window.popupBridge.getReturnUrlPrefix() + \"return\";\n    paymentResource.cancelUrl =\n      window.popupBridge.getReturnUrlPrefix() + \"cancel\";\n  }\n\n  if (options.flow === \"checkout\") {\n    paymentResource.amount = options.amount;\n    paymentResource.currencyIsoCode = options.currency;\n\n    if (options.hasOwnProperty(\"intent\")) {\n      paymentResource.intent = options.intent;\n    }\n\n    for (key in options.shippingAddressOverride) {\n      if (options.shippingAddressOverride.hasOwnProperty(key)) {\n        paymentResource[key] = options.shippingAddressOverride[key];\n      }\n    }\n  } else {\n    paymentResource.shippingAddress = options.shippingAddressOverride;\n\n    if (options.billingAgreementDescription) {\n      paymentResource.description = options.billingAgreementDescription;\n    }\n  }\n\n  return paymentResource;\n};\n\n/**\n * Closes the PayPal window if it is open.\n * @public\n * @example\n * paypalInstance.closeWindow();\n * @returns {void}\n */\nPayPal.prototype.closeWindow = function () {\n  if (this._authorizationInProgress) {\n    analytics.sendEvent(this._client, \"paypal.tokenize.closed.by-merchant\");\n  }\n  this._frameService.close();\n};\n\n/**\n * Focuses the PayPal window if it is open.\n * @public\n * @example\n * paypalInstance.focusWindow();\n * @returns {void}\n */\nPayPal.prototype.focusWindow = function () {\n  this._frameService.focus();\n};\n\n/**\n * Cleanly remove anything set up by {@link module:braintree-web/paypal.create|create}.\n * @public\n * @param {callback} [callback] Called on completion.\n * @example\n * paypalInstance.teardown();\n * @example <caption>With callback</caption>\n * paypalInstance.teardown(function () {\n *   // teardown is complete\n * });\n * @returns {(Promise|void)} Returns a promise if no callback is provided.\n */\nPayPal.prototype.teardown = wrapPromise(function () {\n  var self = this;\n\n  self._frameService.teardown();\n\n  convertMethodsToError(self, methods(PayPal.prototype));\n\n  analytics.sendEvent(self._client, \"paypal.teardown-completed\");\n\n  return Promise.resolve();\n});\n\nmodule.exports = PayPal;\n\n},{\"../../lib/analytics\":143,\"../../lib/braintree-error\":148,\"../../lib/constants\":149,\"../../lib/convert-methods-to-error\":150,\"../../lib/convert-to-braintree-error\":151,\"../../lib/deferred\":155,\"../../lib/frame-service/external\":162,\"../../lib/methods\":180,\"../../lib/once\":181,\"../../lib/querystring\":182,\"../../lib/use-min\":186,\"../shared/constants\":212,\"../shared/errors\":213,\"@braintree/wrap-promise\":43}],211:[function(_dereq_,module,exports){\n\"use strict\";\n/**\n * @module braintree-web/paypal\n * @description A component to integrate with PayPal.\n * @deprecated Use the {@link PayPalCheckout|PayPal Checkout component} instead.\n */\n\nvar analytics = _dereq_(\"../lib/analytics\");\nvar basicComponentVerification = _dereq_(\"../lib/basic-component-verification\");\nvar createDeferredClient = _dereq_(\"../lib/create-deferred-client\");\nvar createAssetsUrl = _dereq_(\"../lib/create-assets-url\");\nvar BraintreeError = _dereq_(\"../lib/braintree-error\");\nvar errors = _dereq_(\"./shared/errors\");\nvar PayPal = _dereq_(\"./external/paypal\");\nvar VERSION = \"3.134.0\";\nvar wrapPromise = _dereq_(\"@braintree/wrap-promise\");\n\n/**\n * @static\n * @function create\n * @param {object} options Creation options:\n * @param {Client} [options.client] A {@link Client} instance.\n * @param {string} [options.authorization] A tokenizationKey or clientToken. Can be used in place of `options.client`.\n * @param {callback} callback The second argument, `data`, is the {@link PayPal} instance.\n * @example\n * // We recommend creating your PayPal button with button.js\n * // For an example, see https://codepen.io/braintree/pen/LNKJWa\n * var paypalButton = document.querySelector('.paypal-button');\n *\n * braintree.client.create({\n *   authorization: CLIENT_AUTHORIZATION\n * }, function (clientErr, clientInstance) {\n *   if (clientErr) {\n *     console.error('Error creating client:', clientErr);\n *     return;\n *   }\n *\n *   braintree.paypal.create({\n *     client: clientInstance\n *   }, function (paypalErr, paypalInstance) {\n *     if (paypalErr) {\n *       console.error('Error creating PayPal:', paypalErr);\n *       return;\n *     }\n *\n *     paypalButton.removeAttribute('disabled');\n *\n *     // When the button is clicked, attempt to tokenize.\n *     paypalButton.addEventListener('click', function (event) {\n *       // Because tokenization opens a popup, this has to be called as a result of\n *       // customer action, like clicking a button. You cannot call this at any time.\n *       paypalInstance.tokenize({\n *         flow: 'vault'\n *         // For more tokenization options, see the full PayPal tokenization documentation\n *         // https://braintree.github.io/braintree-web/current/PayPal.html#tokenize\n *       }, function (tokenizeErr, payload) {\n *         if (tokenizeErr) {\n *           if (tokenizeErr.type !== 'CUSTOMER') {\n *             console.error('Error tokenizing:', tokenizeErr);\n *           }\n *           return;\n *         }\n *\n *         // Tokenization succeeded\n *         paypalButton.setAttribute('disabled', true);\n *         console.log('Got a nonce! You should submit this to your server.');\n *         console.log(payload.nonce);\n *       });\n *     }, false);\n *   });\n * });\n * @returns {(Promise|void)} Returns a promise if no callback is provided.\n */\nfunction create(options) {\n  var name = \"PayPal\";\n\n  return basicComponentVerification\n    .verify({\n      name: name,\n      client: options.client,\n      authorization: options.authorization,\n    })\n    .then(function () {\n      return createDeferredClient.create({\n        authorization: options.authorization,\n        client: options.client,\n        debug: options.debug,\n        assetsUrl: createAssetsUrl.create(options.authorization),\n        name: name,\n      });\n    })\n    .then(function (client) {\n      var pp;\n      var config = client.getConfiguration();\n\n      options.client = client;\n\n      if (config.gatewayConfiguration.paypalEnabled !== true) {\n        return Promise.reject(new BraintreeError(errors.PAYPAL_NOT_ENABLED));\n      }\n\n      analytics.sendEvent(options.client, \"paypal.initialized\");\n\n      pp = new PayPal(options);\n\n      return pp._initialize();\n    });\n}\n\n/**\n * @static\n * @function isSupported\n * @description Returns true if PayPal [supports this browser](index.html#browser-support-webviews).\n * @example\n * if (braintree.paypal.isSupported()) {\n *   // Add PayPal button to the page\n * } else {\n *   // Hide PayPal payment option\n * }\n * @returns {Boolean} Returns true if PayPal supports this browser.\n */\nfunction isSupported() {\n  return true;\n}\n\nmodule.exports = {\n  create: wrapPromise(create),\n  isSupported: isSupported,\n  /**\n   * @description The current version of the SDK, i.e. `{@pkg version}`.\n   * @type {string}\n   */\n  VERSION: VERSION,\n};\n\n},{\"../lib/analytics\":143,\"../lib/basic-component-verification\":146,\"../lib/braintree-error\":148,\"../lib/create-assets-url\":152,\"../lib/create-deferred-client\":154,\"./external/paypal\":210,\"./shared/errors\":213,\"@braintree/wrap-promise\":43}],212:[function(_dereq_,module,exports){\n\"use strict\";\n\nmodule.exports = {\n  LANDING_FRAME_NAME: \"braintreepaypallanding\",\n  FLOW_ENDPOINTS: {\n    checkout: \"create_payment_resource\",\n    vault: \"setup_billing_agreement\",\n  },\n  REQUIRED_OPTIONS: [\"paymentId\", \"currency\"],\n  ENVIRONMENT: {\n    stage: \"https://www.msmaster.qa.paypal.com/sdk/js?\",\n    sandbox: \"https://www.sandbox.paypal.com/sdk/js?\",\n    teBraintree: \"https://www.braintree.stage.paypal.com/sdk/js?\",\n  },\n  BT_INTEGRATION_SOURCE: \"BRAINTREE_WEB_SDK\",\n};\n\n},{}],213:[function(_dereq_,module,exports){\n\"use strict\";\n\n/**\n * @name BraintreeError.PayPal - Creation Error Codes\n * @description Errors that occur when [creating the PayPal component](./module-braintree-web_paypal.html#.create).\n * @property {MERCHANT} PAYPAL_NOT_ENABLED Occurs when PayPal is not enabled on the Braintree control panel.\n */\n\n/**\n * @name BraintreeError.PayPal - tokenize Error Codes\n * @description Errors that occur when using the [`tokenize` method](./PayPal.html#tokenize).\n * @property {MERCHANT} PAYPAL_TOKENIZATION_REQUEST_ACTIVE Occurs when a tokenization request is already in progress.\n * @property {MERCHANT} PAYPAL_FLOW_OPTION_REQUIRED Occurs when flow option is not provided.\n * @property {NETWORK} PAYPAL_ACCOUNT_TOKENIZATION_FAILED Occurs when PayPal account could not be tokenized.\n * @property {NETWORK} PAYPAL_FLOW_FAILED Occurs when PayPal flow could not be initiated.\n * @property {MERCHANT} PAYPAL_POPUP_OPEN_FAILED Occurs when PayPal window could not be opened.\n * @property {CUSTOMER} PAYPAL_POPUP_CLOSED Occurs when customer closes the PayPal window before completing the flow.\n * @property {MERCHANT} PAYPAL_INVALID_PAYMENT_OPTION Occurs when an invalid payment option is passed.\n */\n\nvar BraintreeError = _dereq_(\"../../lib/braintree-error\");\n\nmodule.exports = {\n  PAYPAL_NOT_ENABLED: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"PAYPAL_NOT_ENABLED\",\n    message: \"PayPal is not enabled for this merchant.\",\n  },\n  PAYPAL_TOKENIZATION_REQUEST_ACTIVE: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"PAYPAL_TOKENIZATION_REQUEST_ACTIVE\",\n    message: \"Another tokenization request is active.\",\n  },\n  PAYPAL_ACCOUNT_TOKENIZATION_FAILED: {\n    type: BraintreeError.types.NETWORK,\n    code: \"PAYPAL_ACCOUNT_TOKENIZATION_FAILED\",\n    message: \"Could not tokenize user's PayPal account.\",\n  },\n  PAYPAL_FLOW_FAILED: {\n    type: BraintreeError.types.NETWORK,\n    code: \"PAYPAL_FLOW_FAILED\",\n    message: \"Could not initialize PayPal flow.\",\n  },\n  PAYPAL_FLOW_OPTION_REQUIRED: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"PAYPAL_FLOW_OPTION_REQUIRED\",\n    message: \"PayPal flow property is invalid or missing.\",\n  },\n  PAYPAL_POPUP_OPEN_FAILED: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"PAYPAL_POPUP_OPEN_FAILED\",\n    message:\n      \"PayPal popup failed to open, make sure to tokenize in response to a user action.\",\n  },\n  PAYPAL_POPUP_CLOSED: {\n    type: BraintreeError.types.CUSTOMER,\n    code: \"PAYPAL_POPUP_CLOSED\",\n    message: \"Customer closed PayPal popup before authorizing.\",\n  },\n  PAYPAL_INVALID_PAYMENT_OPTION: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"PAYPAL_INVALID_PAYMENT_OPTION\",\n    message: \"PayPal payment options are invalid.\",\n  },\n};\n\n},{\"../../lib/braintree-error\":148}],214:[function(_dereq_,module,exports){\n\"use strict\";\n/** @module braintree-web/preferred-payment-methods */\n\nvar wrapPromise = _dereq_(\"@braintree/wrap-promise\");\nvar basicComponentVerification = _dereq_(\"../lib/basic-component-verification\");\nvar PreferredPaymentMethods = _dereq_(\"./preferred-payment-methods\");\nvar VERSION = \"3.134.0\";\n\n// NEXT_MAJOR_VERSION\n// Remove this integration entirely. It doesn't work, isn't documented, and otherwise isn't going to be pursued further beyond the non-operational beta it is in.\n/**\n * @static\n * @function create\n * @param {object} options Creation options:\n * @param {Client} [options.client] A {@link Client} instance.\n * @param {string} [options.authorization] A tokenizationKey or clientToken. Can be used in place of `options.client`.\n * @param {callback} [callback] The second argument, `data`, is the {@link PreferredPaymentMethods} instance.\n * @example\n * braintree.preferredPaymentMethods.create({\n *   client: clientInstance\n * }).then(function (preferredPaymentMethodsInstance) {\n *   // preferredPaymentMethodsInstance is ready to be used.\n * }).catch(function (error) {\n *   // handle creation error\n * });\n * @returns {Promise|void} Returns a Promise with resolves with the PreferredPaymentMethods instance.\n */\nfunction create(options) {\n  var name = \"PreferredPaymentMethods\";\n\n  return basicComponentVerification\n    .verify({\n      name: name,\n      client: options.client,\n      authorization: options.authorization,\n    })\n    .then(function () {\n      var instance = new PreferredPaymentMethods();\n\n      return instance.initialize(options);\n    });\n}\n\nmodule.exports = {\n  create: wrapPromise(create),\n  /**\n   * @description The current version of the SDK, i.e. `{@pkg version}`.\n   * @type {string}\n   */\n  VERSION: VERSION,\n};\n\n},{\"../lib/basic-component-verification\":146,\"./preferred-payment-methods\":215,\"@braintree/wrap-promise\":43}],215:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar wrapPromise = _dereq_(\"@braintree/wrap-promise\");\nvar analytics = _dereq_(\"../lib/analytics\");\nvar createAssetsUrl = _dereq_(\"../lib/create-assets-url\");\nvar createDeferredClient = _dereq_(\"../lib/create-deferred-client\");\n\n/**\n * @class\n * @param {object} options See {@link module:braintree-web/preferred-payment-methods.create|preferred-payment-methods.create}\n */\nfunction PreferredPaymentMethods() {}\n\nPreferredPaymentMethods.prototype.initialize = function (options) {\n  var self = this;\n\n  this._clientPromise = createDeferredClient\n    .create({\n      authorization: options.authorization,\n      client: options.client,\n      debug: options.debug,\n      assetsUrl: createAssetsUrl.create(options.authorization),\n      name: \"PreferredPaymentMethods\",\n    })\n    .catch(function (err) {\n      self._setupError = err;\n\n      return Promise.reject(err);\n    });\n\n  analytics.sendEvent(\n    this._clientPromise,\n    \"preferred-payment-methods.initialized\"\n  );\n\n  return Promise.resolve(this);\n};\n\n/**\n * Fetches information about which payment methods are preferred on the device.\n * Used to determine which payment methods are given preference in your UI,\n * not whether they are presented entirely.\n *\n * This class is currently in beta and may change in future releases.\n * @public\n * @returns {Promise|void} Returns a promise if no callback is provided.\n * @example\n * <caption>Preferred Payment Methods</caption>\n * preferredPaymentMethodsInstance.fetchPreferredPaymentMethods().then(function (result) {\n *   if (result.paypalPreferred) {\n *     // PayPal preferred\n *   } else {\n *     // PayPal not preferred\n *   }\n *\n *   if (result.venmoPreferred) {\n *     // Venmo preferred\n *   } else {\n *     // Venmo not preferred\n *   }\n * });\n */\nPreferredPaymentMethods.prototype.fetchPreferredPaymentMethods = function () {\n  var client;\n  var self = this;\n\n  return this._clientPromise\n    .then(function (clientInstance) {\n      client = clientInstance;\n\n      return client.request({\n        api: \"graphQLApi\",\n        data: {\n          query:\n            \"query PreferredPaymentMethods { \" +\n            \"preferredPaymentMethods { \" +\n            \"paypalPreferred \" +\n            \"venmoPreferred \" +\n            \"} \" +\n            \"}\",\n        },\n      });\n    })\n    .then(function (result) {\n      var paypalPreferred = result.data.preferredPaymentMethods.paypalPreferred;\n      var venmoPreferred = result.data.preferredPaymentMethods.venmoPreferred;\n\n      analytics.sendEvent(\n        client,\n        \"preferred-payment-methods.paypal.api-detected.\" + paypalPreferred\n      );\n      analytics.sendEvent(\n        client,\n        \"preferred-payment-methods.venmo.api-detected.\" + venmoPreferred\n      );\n\n      return {\n        paypalPreferred: paypalPreferred,\n        venmoPreferred: venmoPreferred,\n      };\n    })\n    .catch(function () {\n      if (self._setupError) {\n        return Promise.reject(self._setupError);\n      }\n\n      analytics.sendEvent(client, \"preferred-payment-methods.api-error\");\n\n      return {\n        paypalPreferred: false,\n        venmoPreferred: false,\n      };\n    });\n};\n\nmodule.exports = wrapPromise.wrapPrototype(PreferredPaymentMethods);\n\n},{\"../lib/analytics\":143,\"../lib/create-assets-url\":152,\"../lib/create-deferred-client\":154,\"@braintree/wrap-promise\":43}],216:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar BraintreeError = _dereq_(\"../../lib/braintree-error\");\nvar sepaErrors = _dereq_(\"../shared/errors\");\nvar frameService = _dereq_(\"../../lib/frame-service/external\");\nvar analytics = _dereq_(\"../../lib/analytics\");\nvar useMin = _dereq_(\"../../lib/use-min\");\nvar billingAddressOptions =\n  _dereq_(\"../shared/constants\").BILLING_ADDRESS_OPTIONS;\nvar snakeCaseToCamelCase = _dereq_(\"../../lib/snake-case-to-camel-case\");\nvar assign = _dereq_(\"../../lib/assign\").assign;\n\nvar POPUP_WIDTH = 400;\nvar POPUP_HEIGHT = 570;\n\n/**\n * @ignore\n * @typedef CreateMandateResponse\n * @property {string} approvalUrl The URL to present to the customer for payment approval.\n * @property {string} last4 The last four digits of the iban.\n * @property {string} bankReferenceToken The tokenized payment source to fun the payment.\n */\n\n/**\n *\n * A function that creates a mandate so that we can present the mandate to the customer via a popup.\n *\n * @ignore\n * @static\n * @function createMandate\n * @param {object} client The Braintree client.\n * @param {object} options All options for intiating the SEPA payment flow.\n * @param {string} [options.accountHolderName] The account holder name.\n * @param {object} [options.billingAddress] The customer's billing address\n * @param {string} [options.billingAddress.addressLine1] Line 1 of the Address (eg. number, street, etc). An error will occur if this address is not valid.\n * @param {string} [options.billingAddress.addressLine2] Line 2 of the Address (eg. suite, apt #, etc.). An error will occur if this address is not valid.\n * @param {string} [options.billingAddress.adminArea1] Customer's city.\n * @param {string} [options.billingAddress.adminArea2] Customer's region or state.\n * @param {string} [options.billingAddress.postalCode] Customer's postal code.\n * @param {string} [options.cancelUrl] The URL to redirect to if authorization is cancelled.\n * @param {string} [options.countryCode] The customer's country code. Also used as billing address country code.\n * @param {string} [options.customerId] The customer's id.\n * @param {string} [options.iban] The customer's International Bank Account Number.\n * @param {string} [options.locale] The BCP 47-formatted locale. See https://developer.paypal.com/reference/locale-codes/ for a list of possible values.\n * @param {string} [options.mandateType] Specify ONE_OFF or RECURRENT payment.\n * @param {string} [options.merchantAccountId] The merchant's account id.\n * @param {string} [options.merchantId] The merchant id.\n * @param {string} [options.returnUrl] The URL to redirect to if authorization is successful.\n * @returns {Promise<CreateMandateResponse|Error>} Returns a promise with the mandate response or an error.\n */\n\nfunction createMandate(client, options) {\n  // Disabling eslint because api is expecting snake_case format for the keys\n  /* eslint-disable camelcase */\n  var data = {\n    sepa_debit: {\n      account_holder_name: options.accountHolderName,\n      billing_address: {\n        country_code: options.countryCode,\n      },\n      iban: options.iban,\n      merchant_or_partner_customer_id: options.customerId,\n      mandate_type: options.mandateType,\n    },\n    locale: options.locale,\n    cancel_url: options.cancelUrl,\n    return_url: options.returnUrl,\n    merchant_account_id: options.merchantAccountId,\n  };\n  /* eslint-enable camelcase */\n\n  if (options.billingAddress) {\n    billingAddressOptions.forEach(function (option) {\n      var ccOption = snakeCaseToCamelCase(option);\n      if (ccOption in options.billingAddress) {\n        data.sepa_debit.billing_address[option] =\n          options.billingAddress[ccOption]; // camelCase equivilent of option (eg. postal_code = postalCode) ]\n      }\n    });\n  }\n\n  return client\n    .request({\n      api: \"clientApi\",\n      method: \"post\",\n      endpoint: \"sepa_debit\",\n      data: data,\n    })\n    .then(function (response) {\n      var sepaDebitAccount = response.message.body.sepaDebitAccount;\n\n      if (!sepaDebitAccount) {\n        throw new BraintreeError(sepaErrors.SEPA_CREATE_MANDATE_FAILED);\n      }\n\n      return {\n        approvalUrl: sepaDebitAccount.approvalUrl,\n        last4: sepaDebitAccount.last4,\n        bankReferenceToken: sepaDebitAccount.bankReferenceToken,\n      };\n    })\n    .catch(function () {\n      throw new BraintreeError(sepaErrors.SEPA_CREATE_MANDATE_FAILED);\n    });\n}\n\n/**\n *\n * A function for opening and managing the popup used for authorization.\n *\n * @ignore\n * @param {string} client The Braintree client.\n * @param {string} options The input options needed to manage the popup portion of the flow.\n * @param {string} [options.assetsUrl] The url to the Braintree asset to be used in frameservice.\n * @param {string} [options.approvalUrl] The url to open for SEPA authorization. It is `approvalUrl` coming back from the mandate creation, but commonly refered to as the mandate link.\n * @param {string} [options.debug] Whether to use debugging modes or not.\n * @returns {Promise<void|Error>} Returns a promise.\n */\nfunction openPopup(client, options) {\n  var popupName = \"sepadirectdebit\";\n  var assetsBaseUrl = options.assetsUrl + \"/html\";\n  var debug = options.debug || false;\n\n  return new Promise(function (resolve, reject) {\n    var popupLocation = centeredPopupDimensions();\n\n    frameService.create(\n      {\n        name: popupName,\n        dispatchFrameUrl:\n          assetsBaseUrl + \"/dispatch-frame\" + useMin(debug) + \".html\",\n        openFrameUrl:\n          assetsBaseUrl + \"/sepa-landing-frame\" + useMin(debug) + \".html\",\n        top: popupLocation.top,\n        left: popupLocation.left,\n        height: POPUP_HEIGHT,\n        width: POPUP_WIDTH,\n      },\n      function (frameServiceInstance) {\n        analytics.sendEvent(client, \"sepa.popup.initialized\");\n        frameServiceInstance.open({}, function (err, params) {\n          if (mandateApproved(params)) {\n            frameServiceInstance.close();\n\n            return resolve();\n          }\n\n          if (customerCanceled(params, err)) {\n            frameServiceInstance.close();\n\n            return reject(\n              new BraintreeError(sepaErrors.SEPA_CUSTOMER_CANCELED)\n            );\n          }\n\n          frameServiceInstance.close();\n\n          return reject(\n            new BraintreeError(sepaErrors.SEPA_TOKENIZATION_FAILED)\n          );\n        });\n\n        frameServiceInstance.redirect(options.approvalUrl);\n      }\n    );\n  });\n}\n\nfunction redirectPage(approvalUrl) {\n  window.location.href = approvalUrl;\n}\n\nfunction mandateApproved(params) {\n  return params && params.success;\n}\n\nfunction customerCanceled(params, error) {\n  return (\n    (params && params.cancel) ||\n    (error && error.code === \"FRAME_SERVICE_FRAME_CLOSED\")\n  );\n}\n\nfunction centeredPopupDimensions() {\n  var popupTop =\n    Math.round((window.outerHeight - POPUP_HEIGHT) / 2) + window.screenTop;\n  var popupLeft =\n    Math.round((window.outerWidth - POPUP_WIDTH) / 2) + window.screenLeft;\n\n  return {\n    top: popupTop,\n    left: popupLeft,\n  };\n}\n\n/**\n *\n * A function that creates a mandate so that we can present the mandate to the customer via a popup.\n *\n * @ignore\n * @static\n * @function handleApproval\n * @param {object} client The Braintree client.\n * @param {object} options All options for intiating the SEPA payment flow.\n * @param {string} [options.bankReferenceToken] The tokenized payment source to fun the payment.\n * @param {string} [options.customerId] The customer's id.\n * @param {string} [options.last4] The last four digits of iban.\n * @param {string} [options.mandateType] The mandate type being used. Specify ONE_OFF or RECURRENT payment.\n * @param {string} [options.merchantAccountId] The merchant's account id.\n * @param {string} [options.merchantId] The merchant id.\n * @returns {Promise<tokenizePayload|Error>} Returns a promise with the approval response or an error.\n */\n\nfunction handleApproval(client, options) {\n  // Disabling eslint because api is expecting snake_case format for the keys\n  /* eslint-disable camelcase */\n  var data = {\n    sepa_debit_account: {\n      last_4: options.last4,\n      merchant_or_partner_customer_id: options.customerId,\n      bank_reference_token: options.bankReferenceToken,\n      mandate_type: options.mandateType,\n    },\n    merchant_account_id: options.merchantAccountId,\n  };\n  /* eslint-enable camelcase */\n\n  return client\n    .request({\n      api: \"clientApi\",\n      method: \"post\",\n      endpoint: \"payment_methods/sepa_debit_accounts\",\n      data: data,\n    })\n    .then(function (response) {\n      if (!response.nonce) {\n        throw new BraintreeError(sepaErrors.SEPA_TRANSACTION_FAILED);\n      }\n\n      return {\n        nonce: response.nonce,\n        ibanLastFour: options.last4,\n        customerId: options.customerId,\n        mandateType: options.mandateType,\n      };\n    })\n    .catch(function () {\n      throw new BraintreeError(sepaErrors.SEPA_TRANSACTION_FAILED);\n    });\n}\n\nfunction handleApprovalForFullPageRedirect(client, options) {\n  return client\n    .request({\n      api: \"clientApi\",\n      method: \"get\",\n      endpoint: \"sepa_debit/\" + options.cart_id,\n    })\n    .then(function (response) {\n      var payload = response.sepaDebitMandateDetail;\n\n      analytics.sendEvent(client, \"sepa.redirect.mandate.approved\");\n\n      assign(options, {\n        last4: payload.last4,\n        customerId: payload.merchantOrPartnerCustomerId,\n        mandateType: payload.mandateType,\n        bankReferenceToken: payload.bankReferenceToken,\n      });\n\n      return handleApproval(client, options);\n    })\n    .then(function (response) {\n      analytics.sendEvent(client, \"sepa.redirect.tokenization.success\");\n\n      return response;\n    })\n    .catch(function () {\n      analytics.sendEvent(client, \"sepa.redirect.handle-approval.failed\");\n      throw new BraintreeError(sepaErrors.SEPA_TRANSACTION_FAILED);\n    });\n}\n\nmodule.exports = {\n  createMandate: createMandate,\n  openPopup: openPopup,\n  handleApproval: handleApproval,\n  POPUP_WIDTH: POPUP_WIDTH,\n  POPUP_HEIGHT: POPUP_HEIGHT,\n  redirectPage: redirectPage,\n  handleApprovalForFullPageRedirect: handleApprovalForFullPageRedirect,\n};\n\n},{\"../../lib/analytics\":143,\"../../lib/assign\":145,\"../../lib/braintree-error\":148,\"../../lib/frame-service/external\":162,\"../../lib/snake-case-to-camel-case\":184,\"../../lib/use-min\":186,\"../shared/constants\":219,\"../shared/errors\":220}],217:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar wrapPromise = _dereq_(\"@braintree/wrap-promise\");\nvar BraintreeError = _dereq_(\"../../lib/braintree-error\");\nvar sepaErrors = _dereq_(\"../shared/errors\");\nvar constants = _dereq_(\"../shared/constants\");\nvar mandates = _dereq_(\"./mandate\");\nvar hasMissingOption = _dereq_(\"../../lib/has-missing-option\");\nvar analytics = _dereq_(\"../../lib/analytics\");\nvar VERSION = \"3.134.0\";\nvar assign = _dereq_(\"../../lib/assign\").assign;\n\n/**\n * @class\n * @param {object} options see {@link module:braintree-web/sepa.create|sepa.create}\n * @description <strong>Do not use this constructor directly. Use {@link module:braintree-web/sepa.create|braintree-web.sepa.create} instead.</strong>\n * @classdesc This class represents a SEPA component produced by {@link module:braintree-web/sepa.create|braintree-web.sepa.create}. Instances provide methods for tokenizing SEPA payments.\n */\nfunction SEPA(options) {\n  var getConfiguration = options.client.getConfiguration();\n\n  this._client = options.client;\n  this._assetsUrl =\n    getConfiguration.gatewayConfiguration.assetsUrl + \"/web/\" + VERSION;\n  this._isDebug = getConfiguration.isDebug;\n  if (options.redirectUrl) {\n    this._returnUrl = options.redirectUrl;\n    this._cancelUrl = options.redirectUrl + \"?cancel=1\";\n    this._isRedirectFlow = true;\n  } else {\n    this._returnUrl = this._assetsUrl + \"/html/redirect-frame.html?success=1\";\n    this._cancelUrl = this._assetsUrl + \"/html/redirect-frame.html?cancel=1\";\n  }\n  if (options.tokenizePayload) {\n    this.tokenizePayload = options.tokenizePayload;\n  }\n\n  analytics.sendEvent(this._client, \"sepa.component.initialized\");\n}\n\n/**\n * SEPA tokenize payload.\n * @typedef SEPA~tokenizePayload\n * @property {string} nonce The payment nonce.\n * @property {string} ibanLastFour The last four digits of the customer's IBAN.\n * @property {string} mandateType The specified mandateType used.\n * @property {string} customerId The provided customer id.\n */\n\n/**\n * @public\n * @param {object} options All options for intiating the SEPA payment flow.\n * @param {string} [options.accountHolderName] The account holder name.\n * @param {string} [options.customerId] The customer's id.\n * @param {string} [options.iban] The customer's International Bank Account Number.\n * @param {string} [options.mandateType] Specify ONE_OFF or RECURRENT payment.\n * @param {string} [options.countryCode] The customer's country code.\n * @param {string} [options.merchantAccountId] The merchant's account id.\n * @param {callback} [callback] The first argument is an error object, where the second is a {@link SEPA~tokenizePayload|tokenizePayload}\n * @returns {(Promise<tokenizePayload|error>)} Returns a promise if no callback is provided.\n *\n * @example\n * button.addEventListener('click', function () {\n *   var tokenizeInputs = {\n *     accountHolderName: \"some-accnt-holder-name\",\n *     customerId: \"a-customer-id\",\n *     iban: \"a-full-iban\",\n *     mandateType: \"ONE_OFF\",\n *     countryCode: \"LI\",\n *     merchantAccountId: \"a-merchant-account-id\"\n *   }\n *   sepaInstance.tokenize(tokenizeInputs).then(function (payload) {\n *      // Submit payload.nonce to your server\n *   }).catch(function(tokenizationErr) {\n *     // Handle errors in the flow\n *   })\n * })\n */\nSEPA.prototype.tokenize = function (options) {\n  var self = this;\n  var popupPromise;\n  var createMandateOptions = assign(\n    { cancelUrl: self._cancelUrl, returnUrl: self._returnUrl },\n    options\n  );\n\n  if (!options || hasMissingOption(options, constants.REQUIRED_OPTIONS)) {\n    analytics.sendEvent(self._client, \"sepa.input-validation.missing-options\");\n\n    return Promise.reject(\n      new BraintreeError(sepaErrors.SEPA_TOKENIZE_MISSING_REQUIRED_OPTION)\n    );\n  }\n\n  if (!constants.MANDATE_TYPE_ENUM.includes(options.mandateType)) {\n    analytics.sendEvent(self._client, \"sepa.input-validation.invalid-mandate\");\n\n    return Promise.reject(\n      new BraintreeError(sepaErrors.SEPA_INVALID_MANDATE_TYPE)\n    );\n  }\n\n  popupPromise = mandates\n    .createMandate(self._client, createMandateOptions)\n    .then(function (mandateResponse) {\n      analytics.sendEvent(self._client, \"sepa.create-mandate.success\");\n\n      if (self._isRedirectFlow) {\n        return mandates.redirectPage(mandateResponse.approvalUrl);\n      }\n\n      options.last4 = mandateResponse.last4;\n      options.bankReferenceToken = mandateResponse.bankReferenceToken;\n\n      return mandates.openPopup(self._client, {\n        approvalUrl: mandateResponse.approvalUrl,\n        assetsUrl: self._assetsUrl,\n      });\n    });\n\n  // Must be outside of .then() to return from top-level function\n  if (self._isRedirectFlow) {\n    return Promise.resolve();\n  }\n\n  // At this point, we know the promise came from the popup flow\n  return popupPromise\n    .then(function () {\n      analytics.sendEvent(self._client, \"sepa.mandate.approved\");\n\n      return mandates.handleApproval(self._client, {\n        bankReferenceToken: options.bankReferenceToken,\n        last4: options.last4,\n        customerId: options.customerId,\n        mandateType: options.mandateType,\n        merchantAccountId: options.merchantAccountId,\n      });\n    })\n    .then(function (approval) {\n      analytics.sendEvent(self._client, \"sepa.tokenization.success\");\n\n      return Promise.resolve(approval);\n    })\n    .catch(function (err) {\n      analytics.sendEvent(self._client, \"sepa.\" + err.details + \".failed\");\n\n      return Promise.reject(err);\n    });\n};\n\nmodule.exports = wrapPromise.wrapPrototype(SEPA);\n\n},{\"../../lib/analytics\":143,\"../../lib/assign\":145,\"../../lib/braintree-error\":148,\"../../lib/has-missing-option\":173,\"../shared/constants\":219,\"../shared/errors\":220,\"./mandate\":216,\"@braintree/wrap-promise\":43}],218:[function(_dereq_,module,exports){\n\"use strict\";\n/** @module braintree-web/sepa */\n\nvar analytics = _dereq_(\"../lib/analytics\");\nvar SEPA = _dereq_(\"./external/sepa\");\nvar createAssetsUrl = _dereq_(\"../lib/create-assets-url\");\nvar createDeferredClient = _dereq_(\"../lib/create-deferred-client\");\nvar basicComponentVerification = _dereq_(\"../lib/basic-component-verification\");\nvar wrapPromise = _dereq_(\"@braintree/wrap-promise\");\nvar VERSION = \"3.134.0\";\nvar parse = _dereq_(\"../lib/querystring\").parse;\nvar assign = _dereq_(\"../lib/assign\").assign;\nvar mandate = _dereq_(\"./external/mandate\");\n\n/**\n * @static\n * @function create\n * @param {object} options Creation options:\n * @param {Client} [options.client] A {@link Client} instance.\n * @param {string} [options.authorization] A tokenizationKey or clientToken. Can be used in place of `options.client`.\n * @param {boolean} [options.debug] A debug flag.\n * @param {string} [options.redirectUrl] When provided, triggers full page redirect flow instead of popup flow.\n * @param {callback} [callback] When provided, will be used instead of a promise. First argument is an error object, where the second is an instance of {@link SEPA|SEPA}.\n * @returns {Promise<void|error>} Returns the SEPA instance.\n * @example\n * braintree.sepa.create({\n *   client: clientInstance\n * }).then(function (sepaInstance) {\n *   // sepaInstance is ready to be used.\n * }).catch(function (createErr) {\n *   console.error('Error creating SEPA instance', createErr);\n * });\n * @example <caption>Creating a SEPA component</caption>\n * braintree.sepa.create({\n *   client: clientInstance,\n * }).then(function (sepaInstance) {\n *   // sepaInstance is ready to be used.\n * }).catch(function (createErr) {\n *   console.error('Error creating SEPA instance', createErr);\n * });\n */\n\nfunction create(options) {\n  var name = \"SEPA\";\n  var params = parse(window.location.href);\n\n  return basicComponentVerification\n    .verify({\n      name: name,\n      client: options.client,\n      authorization: options.authorization,\n    })\n    .then(function () {\n      return createDeferredClient.create({\n        authorization: options.authorization,\n        client: options.client,\n        debug: options.debug,\n        assetsUrl: createAssetsUrl.create(options.authorization),\n        name: name,\n      });\n    })\n    .then(function (client) {\n      options.client = client;\n\n      analytics.sendEvent(client, \"sepa.client.initialized\");\n\n      return new SEPA(options);\n    })\n    .then(function (sepaInstance) {\n      // This cart_id is actually a V2 orderId\n      var redirectComplete =\n        params.success && params.success === \"true\" && params.cart_id;\n\n      if (redirectComplete) {\n        options = assign(options, params);\n\n        // Pick up redirect flow where it left off\n        return mandate\n          .handleApprovalForFullPageRedirect(options.client, options)\n          .then(function (payload) {\n            sepaInstance.tokenizePayload = payload;\n\n            return sepaInstance;\n          })\n          .catch(function (err) {\n            console.error(\"Problem while finishing tokenizing: \", err); // eslint-disable-line no-console\n          });\n      }\n      if (params.cancel) {\n        analytics.sendEvent(\n          options.client,\n          \"sepa.redirect.customer-canceled.failed\"\n        );\n      }\n\n      return sepaInstance;\n    });\n}\n\nmodule.exports = {\n  create: wrapPromise(create),\n  /**\n   * @description The current version of the SDK, i.e. `{@pkg version}`.\n   * @type {string}\n   */\n  VERSION: VERSION,\n};\n\n},{\"../lib/analytics\":143,\"../lib/assign\":145,\"../lib/basic-component-verification\":146,\"../lib/create-assets-url\":152,\"../lib/create-deferred-client\":154,\"../lib/querystring\":182,\"./external/mandate\":216,\"./external/sepa\":217,\"@braintree/wrap-promise\":43}],219:[function(_dereq_,module,exports){\n\"use strict\";\n\nmodule.exports = {\n  REQUIRED_OPTIONS: [\n    \"iban\",\n    \"merchantAccountId\",\n    \"mandateType\",\n    \"customerId\",\n    \"accountHolderName\",\n    \"countryCode\",\n  ],\n  BILLING_ADDRESS_OPTIONS: [\n    \"address_line_1\",\n    \"address_line_2\",\n    \"admin_area_1\",\n    \"admin_area_2\",\n    \"postal_code\",\n  ],\n  MANDATE_TYPE_ENUM: [\"ONE_OFF\", \"RECURRENT\"],\n};\n\n},{}],220:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar BraintreeError = _dereq_(\"../../lib/braintree-error\");\n\n/**\n * @name BraintreeError.SEPA - tokenize Error Codes\n * @description Errors that occur when using the {@link module:braintree-web/sepa.tokenize|sepa.tokenize} method.\n * @property {MERCHANT} SEPA_CREATE_MANDATE_FAILED Occurs when there was an issue creating a mandate. This can occur if the request fails, or if the merchant does not have SEPA enabled.\n * @property {CUSTOMER} SEPA_CUSTOMER_CANCELED Occurs when the customer has canceled the SEPA authorization process. This can be within the mandate approval popup, or by canceling the popup itself.\n * @property {MERCHANT} SEPA_INVALID_MANDATE_TYPE Occurs when an invalid mandate type is provided.\n * @property {UNKNOWN} SEPA_TOKENIZATION_FAILED Occurs when tokenization fails during the mandate approval process for unknown reasons.\n * @property {MERCHANT} SEPA_TOKENIZE_MISSING_REQUIRED_OPTION Occurs when there are required input options not provided.\n * @property {UNKNOWN} SEPA_TRANSACTION_FAILED Occurs when final tokenization fails.\n */\n\n// Those with a \"details\" property are used in specific locations and this prop serves to identify where in the imlpementation the error originates.\nmodule.exports = {\n  SEPA_CREATE_MANDATE_FAILED: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"SEPA_CREATE_MANDATE_FAILED\",\n    message: \"SEPA create mandate failed.\",\n    details: \"create-mandate\",\n  },\n  SEPA_CUSTOMER_CANCELED: {\n    type: BraintreeError.types.CUSTOMER,\n    code: \"SEPA_CUSTOMER_CANCELED\",\n    message: \"User canceled SEPA authorization\",\n    details: \"customer-canceled\",\n  },\n  SEPA_INVALID_MANDATE_TYPE: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"SEPA_INVALID_MANDATE_TYPE\",\n    message: \"SEPA mandate type is invalid\",\n  },\n  SEPA_TOKENIZATION_FAILED: {\n    type: BraintreeError.types.UNKNOWN,\n    code: \"SEPA_TOKENIZATION_FAILED\",\n    message: \"SEPA encountered a problem\",\n    details: \"open-popup\",\n  },\n  SEPA_TOKENIZE_MISSING_REQUIRED_OPTION: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"SEPA_TOKENIZE_MISSING_REQUIRED_OPTION\",\n    message: \"Missing required option for tokenize.\",\n  },\n  SEPA_TRANSACTION_FAILED: {\n    type: BraintreeError.types.UNKNOWN,\n    code: \"SEPA_TRANSACTION_FAILED\",\n    message: \"SEPA transaction failed\",\n    details: \"handle-approval\",\n  },\n};\n\n},{\"../../lib/braintree-error\":148}],221:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar assign = _dereq_(\"../../../lib/assign\").assign;\nvar analytics = _dereq_(\"../../../lib/analytics\");\nvar BraintreeError = _dereq_(\"../../../lib/braintree-error\");\nvar isVerifiedDomain = _dereq_(\"../../../lib/is-verified-domain\");\nvar ExtendedPromise = _dereq_(\"@braintree/extended-promise\");\nvar EventEmitter = _dereq_(\"@braintree/event-emitter\");\nvar errors = _dereq_(\"../../shared/errors\");\nvar iFramer = _dereq_(\"@braintree/iframer\");\nvar Bus = _dereq_(\"framebus\");\nvar constants = _dereq_(\"../../shared/constants\");\nvar uuid = _dereq_(\"@braintree/uuid\");\nvar events = _dereq_(\"../../shared/events\");\nvar useMin = _dereq_(\"../../../lib/use-min\");\nvar BUS_CONFIGURATION_REQUEST_EVENT =\n  _dereq_(\"../../../lib/constants\").BUS_CONFIGURATION_REQUEST_EVENT;\n\nvar VERSION = \"3.134.0\";\nvar IFRAME_HEIGHT = 400;\nvar IFRAME_WIDTH = 400;\n\nExtendedPromise.suppressUnhandledPromiseMessage = true;\n\nfunction BaseFramework(options) {\n  EventEmitter.call(this);\n\n  this._client = options.client;\n  this._createPromise = options.createPromise;\n  this._createOptions = options;\n\n  if (this._client) {\n    this._isDebug = this._client.getConfiguration().isDebug;\n    this._assetsUrl =\n      this._client.getConfiguration().gatewayConfiguration.assetsUrl;\n  } else {\n    this._isDebug = Boolean(options.isDebug);\n    this._assetsUrl = options.assetsUrl;\n  }\n  this._assetsUrl = this._assetsUrl + \"/web/\" + VERSION;\n}\n\nEventEmitter.createChild(BaseFramework);\n\nBaseFramework.prototype._waitForClient = function () {\n  if (this._client) {\n    return Promise.resolve();\n  }\n\n  return this._createPromise.then(\n    function (client) {\n      this._client = client;\n    }.bind(this)\n  );\n};\n\nBaseFramework.prototype.setUpEventListeners = function () {\n  throw new BraintreeError(errors.THREEDS_FRAMEWORK_METHOD_NOT_IMPLEMENTED);\n};\n\nBaseFramework.prototype.verifyCard = function (options, privateOptions) {\n  var formattedOptions, error;\n  var self = this;\n\n  privateOptions = privateOptions || {};\n\n  error = this._checkForVerifyCardError(options, privateOptions);\n\n  if (error) {\n    return Promise.reject(error);\n  }\n\n  this._verifyCardInProgress = true;\n\n  formattedOptions = this._formatVerifyCardOptions(options);\n\n  return this._formatLookupData(formattedOptions)\n    .then(function (data) {\n      analytics.sendEvent(\n        self._createPromise,\n        \"three-d-secure.verification-flow.started\"\n      );\n\n      return self._performLookup(formattedOptions.nonce, data);\n    })\n    .then(function (response) {\n      analytics.sendEvent(\n        self._createPromise,\n        \"three-d-secure.verification-flow.3ds-version.\" +\n          response.lookup.threeDSecureVersion\n      );\n\n      return self._onLookupComplete(response, formattedOptions);\n    })\n    .then(function (response) {\n      return self.initializeChallengeWithLookupResponse(\n        response,\n        formattedOptions\n      );\n    })\n    .then(function (payload) {\n      self._resetVerificationState();\n\n      analytics.sendEvent(\n        self._createPromise,\n        \"three-d-secure.verification-flow.completed\"\n      );\n\n      return payload;\n    })\n    .catch(function (err) {\n      self._resetVerificationState();\n\n      analytics.sendEvent(\n        self._createPromise,\n        \"three-d-secure.verification-flow.failed\"\n      );\n\n      return Promise.reject(err);\n    });\n};\n\nBaseFramework.prototype._checkForFrameworkSpecificVerifyCardErrors =\n  function () {\n    throw new BraintreeError(errors.THREEDS_FRAMEWORK_METHOD_NOT_IMPLEMENTED);\n  };\n\nBaseFramework.prototype._presentChallenge = function () {\n  throw new BraintreeError(errors.THREEDS_FRAMEWORK_METHOD_NOT_IMPLEMENTED);\n};\n\nBaseFramework.prototype.prepareLookup = function () {\n  throw new BraintreeError(errors.THREEDS_FRAMEWORK_METHOD_NOT_IMPLEMENTED);\n};\n\nBaseFramework.prototype._resetVerificationState = function () {\n  this._verifyCardInProgress = false;\n  this._verifyCardPromisePlus = null;\n\n  if (typeof this._reloadThreeDSecure === \"function\") {\n    this._reloadThreeDSecure();\n  }\n};\n\nBaseFramework.prototype._performLookup = function (nonce, data) {\n  var self = this;\n  var url = \"payment_methods/\" + nonce + \"/three_d_secure/lookup\";\n\n  return this._waitForClient().then(function () {\n    return self._client\n      .request({\n        endpoint: url,\n        method: \"post\",\n        data: data,\n      })\n      .catch(function (err) {\n        var status = err && err.details && err.details.httpStatus;\n        var analyticsMessage = \"three-d-secure.verification-flow.lookup-failed\";\n        var lookupError;\n\n        if (status === 404) {\n          lookupError = errors.THREEDS_LOOKUP_TOKENIZED_CARD_NOT_FOUND_ERROR;\n          analyticsMessage += \".404\";\n        } else if (status === 422) {\n          lookupError = errors.THREEDS_LOOKUP_VALIDATION_ERROR;\n          analyticsMessage += \".422\";\n        } else {\n          lookupError = errors.THREEDS_LOOKUP_ERROR;\n        }\n\n        analytics.sendEvent(self._createPromise, analyticsMessage);\n\n        return Promise.reject(\n          new BraintreeError({\n            type: lookupError.type,\n            code: lookupError.code,\n            message: lookupError.message,\n            details: {\n              originalError: err,\n            },\n          })\n        );\n      });\n  });\n};\n\nBaseFramework.prototype._existsAndIsNumeric = function (value) {\n  /**\n   * Returns true if value is numeric and false if value is:\n   *  - undefined\n   *  - null\n   *  - an array\n   *  - an empty string\n   *  - boolean\n   *  - otherwise non-numeric value (e.g. {}, \"cows\")\n   */\n  return !(\n    value === undefined ||\n    value === null ||\n    Array.isArray(value) ||\n    typeof value === \"boolean\" ||\n    (typeof value === \"string\" && value.trim() === \"\") ||\n    isNaN(Number(value))\n  );\n};\n\nBaseFramework.prototype._checkForVerifyCardError = function (\n  options,\n  privateOptions\n) {\n  var errorOption;\n\n  if (this._verifyCardInProgress === true) {\n    return new BraintreeError(errors.THREEDS_AUTHENTICATION_IN_PROGRESS);\n  }\n  if (!options.nonce) {\n    errorOption = \"a nonce\";\n  } else if (!this._existsAndIsNumeric(options.amount)) {\n    errorOption = \"an amount\";\n  }\n\n  if (!errorOption) {\n    errorOption = this._checkForFrameworkSpecificVerifyCardErrors(\n      options,\n      privateOptions\n    );\n  }\n\n  if (errorOption) {\n    return new BraintreeError({\n      type: errors.THREEDS_MISSING_VERIFY_CARD_OPTION.type,\n      code: errors.THREEDS_MISSING_VERIFY_CARD_OPTION.code,\n      message: \"verifyCard options must include \" + errorOption + \".\",\n    });\n  }\n\n  return null;\n};\n\nBaseFramework.prototype.initializeChallengeWithLookupResponse = function (\n  lookupResponse,\n  options\n) {\n  var self = this;\n\n  options = options || {};\n\n  this._lookupPaymentMethod = lookupResponse.paymentMethod;\n\n  // sets this in the case that initializeChallengeWithLookupResponse is\n  // called as a standalone method from a server side lookup. In a normal\n  // verifyCard flow, this promise will already exist\n  self._verifyCardPromisePlus =\n    self._verifyCardPromisePlus || new ExtendedPromise();\n  self._handleLookupResponse(lookupResponse, options);\n\n  return self._verifyCardPromisePlus.then(function (payload) {\n    analytics.sendEvent(\n      self._createPromise,\n      \"three-d-secure.verification-flow.liability-shifted.\" +\n        String(payload.liabilityShifted)\n    );\n    analytics.sendEvent(\n      self._createPromise,\n      \"three-d-secure.verification-flow.liability-shift-possible.\" +\n        String(payload.liabilityShiftPossible)\n    );\n\n    return payload;\n  });\n};\n\nBaseFramework.prototype._handleLookupResponse = function (\n  lookupResponse,\n  options\n) {\n  var challengeShouldBePresented = Boolean(\n    lookupResponse.lookup && lookupResponse.lookup.acsUrl\n  );\n  var details;\n\n  analytics.sendEvent(\n    this._createPromise,\n    \"three-d-secure.verification-flow.challenge-presented.\" +\n      String(challengeShouldBePresented)\n  );\n\n  if (challengeShouldBePresented) {\n    this._presentChallenge(lookupResponse, options);\n  } else {\n    details = this._formatAuthResponse(\n      lookupResponse.paymentMethod,\n      lookupResponse.threeDSecureInfo\n    );\n    details.verificationDetails = lookupResponse.threeDSecureInfo;\n\n    this._verifyCardPromisePlus.resolve(details);\n  }\n};\n\nBaseFramework.prototype._onLookupComplete = function (response) {\n  this._lookupPaymentMethod = response.paymentMethod;\n  this._verifyCardPromisePlus = new ExtendedPromise();\n\n  return Promise.resolve(response);\n};\n\nBaseFramework.prototype._formatAuthResponse = function (\n  paymentMethod,\n  threeDSecureInfo\n) {\n  return {\n    nonce: paymentMethod.nonce,\n    type: paymentMethod.type,\n    binData: paymentMethod.binData,\n    details: paymentMethod.details,\n    description:\n      paymentMethod.description &&\n      paymentMethod.description.replace(/\\+/g, \" \"),\n    liabilityShifted: threeDSecureInfo && threeDSecureInfo.liabilityShifted,\n    liabilityShiftPossible:\n      threeDSecureInfo && threeDSecureInfo.liabilityShiftPossible,\n    threeDSecureInfo: paymentMethod.threeDSecureInfo,\n  };\n};\n\nBaseFramework.prototype._formatVerifyCardOptions = function (options) {\n  return assign({}, options);\n};\n\nBaseFramework.prototype._formatLookupData = function (options) {\n  var data = {\n    amount: options.amount,\n  };\n\n  if (options.collectDeviceData === true) {\n    data.browserColorDepth = window.screen.colorDepth;\n    data.browserJavaEnabled = window.navigator.javaEnabled();\n    data.browserJavascriptEnabled = true;\n    data.browserLanguage = window.navigator.language;\n    data.browserScreenHeight = window.screen.height;\n    data.browserScreenWidth = window.screen.width;\n    data.browserTimeZone = new Date().getTimezoneOffset();\n    data.deviceChannel = \"Browser\";\n  }\n\n  return Promise.resolve(data);\n};\n\nBaseFramework.prototype._handleV1AuthResponse = function (data) {\n  var authResponse = JSON.parse(data.auth_response);\n\n  if (authResponse.success) {\n    this._verifyCardPromisePlus.resolve(\n      this._formatAuthResponse(\n        authResponse.paymentMethod,\n        authResponse.threeDSecureInfo\n      )\n    );\n  } else if (\n    authResponse.threeDSecureInfo &&\n    authResponse.threeDSecureInfo.liabilityShiftPossible\n  ) {\n    this._verifyCardPromisePlus.resolve(\n      this._formatAuthResponse(\n        this._lookupPaymentMethod,\n        authResponse.threeDSecureInfo\n      )\n    );\n  } else {\n    this._verifyCardPromisePlus.reject(\n      new BraintreeError({\n        type: BraintreeError.types.UNKNOWN,\n        code: \"UNKNOWN_AUTH_RESPONSE\",\n        message: authResponse.error.message,\n      })\n    );\n  }\n};\n\nBaseFramework.prototype.cancelVerifyCard = function () {\n  var response, threeDSecureInfo;\n\n  this._verifyCardInProgress = false;\n\n  if (!this._lookupPaymentMethod) {\n    return Promise.reject(\n      new BraintreeError(errors.THREEDS_NO_VERIFICATION_PAYLOAD)\n    );\n  }\n\n  threeDSecureInfo = this._lookupPaymentMethod.threeDSecureInfo;\n\n  response = assign({}, this._lookupPaymentMethod, {\n    liabilityShiftPossible:\n      threeDSecureInfo && threeDSecureInfo.liabilityShiftPossible,\n    liabilityShifted: threeDSecureInfo && threeDSecureInfo.liabilityShifted,\n    verificationDetails:\n      threeDSecureInfo && threeDSecureInfo.verificationDetails,\n  });\n\n  return Promise.resolve(response);\n};\n\nBaseFramework.prototype._setupV1Bus = function (options) {\n  var clientConfiguration = this._client.getConfiguration();\n  var parentURL = window.location.href.split(\"#\")[0];\n  var lookupResponse = options.lookupResponse;\n  var channel = uuid();\n  var bus = new Bus({\n    channel: channel,\n    verifyDomain: isVerifiedDomain,\n  });\n  var authenticationCompleteBaseUrl =\n    this._assetsUrl +\n    \"/html/three-d-secure-authentication-complete-frame.html?channel=\" +\n    encodeURIComponent(channel) +\n    \"&\";\n\n  bus.on(BUS_CONFIGURATION_REQUEST_EVENT, function (reply) {\n    reply({\n      clientConfiguration: clientConfiguration,\n      nonce: options.nonce,\n      acsUrl: lookupResponse.acsUrl,\n      pareq: lookupResponse.pareq,\n      termUrl:\n        lookupResponse.termUrl +\n        \"&three_d_secure_version=\" +\n        VERSION +\n        \"&authentication_complete_base_url=\" +\n        encodeURIComponent(authenticationCompleteBaseUrl),\n      md: lookupResponse.md,\n      parentUrl: parentURL,\n    });\n  });\n\n  bus.on(events.AUTHENTICATION_COMPLETE, options.handleAuthResponse);\n\n  return bus;\n};\n\nBaseFramework.prototype._setupV1Iframe = function (options) {\n  var url =\n    this._assetsUrl +\n    \"/html/three-d-secure-bank-frame\" +\n    useMin(this._isDebug) +\n    \".html?showLoader=\" +\n    options.showLoader;\n  var bankIframe = iFramer({\n    src: url,\n    height: IFRAME_HEIGHT,\n    width: IFRAME_WIDTH,\n    name: constants.LANDING_FRAME_NAME + \"_\" + this._v1Bus.channel,\n    title: \"3D Secure Authorization Frame\",\n  });\n\n  return bankIframe;\n};\n\nBaseFramework.prototype._setupV1Elements = function (options) {\n  this._v1Bus = this._setupV1Bus(options);\n  this._v1Iframe = this._setupV1Iframe(options);\n};\n\nBaseFramework.prototype._teardownV1Elements = function () {\n  if (this._v1Bus) {\n    this._v1Bus.teardown();\n    this._v1Bus = null;\n  }\n\n  if (this._v1Iframe && this._v1Iframe.parentNode) {\n    this._v1Iframe.parentNode.removeChild(this._v1Iframe);\n    this._v1Iframe = null;\n  }\n\n  if (this._onV1Keyup) {\n    document.removeEventListener(\"keyup\", this._onV1Keyup);\n    this._onV1Keyup = null;\n  }\n};\n\nBaseFramework.prototype.teardown = function () {\n  analytics.sendEvent(this._createPromise, \"three-d-secure.teardown-completed\");\n\n  this._teardownV1Elements();\n\n  return Promise.resolve();\n};\n\nmodule.exports = BaseFramework;\n\n},{\"../../../lib/analytics\":143,\"../../../lib/assign\":145,\"../../../lib/braintree-error\":148,\"../../../lib/constants\":149,\"../../../lib/is-verified-domain\":178,\"../../../lib/use-min\":186,\"../../shared/constants\":229,\"../../shared/errors\":230,\"../../shared/events\":231,\"@braintree/event-emitter\":33,\"@braintree/extended-promise\":34,\"@braintree/iframer\":35,\"@braintree/uuid\":39,\"framebus\":54}],222:[function(_dereq_,module,exports){\n\"use strict\";\n// NEXT_MAJOR_VERSION drop support for Bootstrap framework,\n// recomend using inline frame version and putting it in\n// the merchant's own bootstrap modal\n\nvar SongbirdFramework = _dereq_(\"./songbird\");\n\nfunction Bootstrap3ModalFramework(options) {\n  SongbirdFramework.call(this, options);\n}\n\nBootstrap3ModalFramework.prototype = Object.create(\n  SongbirdFramework.prototype,\n  {\n    constructor: SongbirdFramework,\n  }\n);\n\nBootstrap3ModalFramework.prototype._createV1IframeModalElement = function (\n  iframe\n) {\n  var modal = document.createElement(\"div\");\n\n  modal.innerHTML =\n    '<div class=\"modal fade in\" tabindex=\"-1\" role=\"dialog\" aria-labelledby=\"CCAFrameModal-label\" aria-hidden=\"true\" style=\"display: block;\">' +\n    '<div class=\"modal-dialog\" style=\"width:440px;z-index:999999;\">' +\n    '<div class=\"modal-content\">' +\n    '<div class=\"modal-body\" data-braintree-v1-fallback-iframe-container>' +\n    '<button type=\"button\" data-braintree-v1-fallback-close-button class=\"close\" data-dismiss=\"modal\" aria-hidden=\"true\">×</button>' +\n    \"</div>\" +\n    \"</div>\" +\n    \"</div>\" +\n    '<div data-braintree-v1-fallback-backdrop style=\"' +\n    \"position: fixed;\" +\n    \"cursor: pointer;\" +\n    \"z-index: 999998;\" +\n    \"top: 0;\" +\n    \"left: 0;\" +\n    \"width: 100%;\" +\n    \"height: 100%;\" +\n    '\"></div>' +\n    \"</div>\";\n\n  modal\n    .querySelector(\"[data-braintree-v1-fallback-iframe-container]\")\n    .appendChild(iframe);\n\n  return modal;\n};\n\nBootstrap3ModalFramework.prototype._createCardinalConfigurationOptions =\n  function (setupOptions) {\n    var options =\n      SongbirdFramework.prototype._createCardinalConfigurationOptions.call(\n        this,\n        setupOptions\n      );\n\n    options.payment.framework = \"bootstrap3\";\n\n    return options;\n  };\n\nmodule.exports = Bootstrap3ModalFramework;\n\n},{\"./songbird\":226}],223:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar SongbirdFramework = _dereq_(\"./songbird\");\n\nfunction CardinalModalFramework(options) {\n  SongbirdFramework.call(this, options);\n}\n\nCardinalModalFramework.prototype = Object.create(SongbirdFramework.prototype, {\n  constructor: SongbirdFramework,\n});\n\nCardinalModalFramework.prototype._createV1IframeModalElement = function (\n  iframe\n) {\n  var modal = document.createElement(\"div\");\n  var addCloseButton = Boolean(\n    this._createOptions &&\n      this._createOptions.cardinalSDKConfig &&\n      this._createOptions.cardinalSDKConfig.payment &&\n      this._createOptions.cardinalSDKConfig.payment.displayExitButton\n  );\n\n  modal.innerHTML =\n    '<div style=\"' +\n    \"position: fixed;\" +\n    \"z-index: 999999;\" +\n    \"top: 50%;\" +\n    \"left: 50%;\" +\n    \"padding: 24px 20px;\" +\n    \"transform: translate(-50%,-50%);\" +\n    \"border-radius: 2px;\" +\n    \"background: #fff;\" +\n    \"max-width: 100%;\" +\n    \"overflow: auto;\" +\n    '\">' +\n    \"<div>\" +\n    \"<button data-braintree-v1-fallback-close-button \" +\n    'style=\"' +\n    \"font-family: Helvetica,Arial,sans-serif;\" +\n    \"font-size: 25px;\" +\n    \"line-height: 12px;\" +\n    \"position: absolute;\" +\n    \"top: 2px;\" +\n    \"right: 0px;\" +\n    \"cursor: pointer;\" +\n    \"color: #999;\" +\n    \"border: 0;\" +\n    \"outline: none;\" +\n    \"background: none;\" +\n    '\" ' +\n    \"onMouseOver=\\\"this.style.color='#000'\\\" \" +\n    \"onMouseOut=\\\"this.style.color='#999'\\\"\" +\n    \">×</button>\" +\n    \"</div>\" +\n    // iframe container\n    '<div data-braintree-v1-fallback-iframe-container style=\"' +\n    \"height: 400px;\" +\n    '\"></div>' +\n    \"</div>\" +\n    // modal backdrop\n    '<div data-braintree-v1-fallback-backdrop style=\"' +\n    \"position: fixed;\" +\n    \"z-index: 999998;\" +\n    \"cursor: pointer;\" +\n    \"top: 0;\" +\n    \"left: 0;\" +\n    \"width: 100%;\" +\n    \"height: 100%;\" +\n    \"transition: opacity 1ms ease;\" +\n    \"background: rgba(0,0,0,.6);\" +\n    '\"></div>';\n\n  if (!addCloseButton) {\n    modal.querySelector(\n      \"[data-braintree-v1-fallback-close-button]\"\n    ).style.display = \"none\";\n  }\n  modal\n    .querySelector(\"[data-braintree-v1-fallback-iframe-container]\")\n    .appendChild(iframe);\n\n  return modal;\n};\n\nmodule.exports = CardinalModalFramework;\n\n},{\"./songbird\":226}],224:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar CardinalModalFramework = _dereq_(\"./cardinal-modal\");\nvar Bootstrap3ModalFramework = _dereq_(\"./bootstrap3-modal\");\nvar InlineIframeFramework = _dereq_(\"./inline-iframe\");\n\nmodule.exports = {\n  \"cardinal-modal\": CardinalModalFramework,\n  \"bootstrap3-modal\": Bootstrap3ModalFramework,\n  \"inline-iframe\": InlineIframeFramework,\n};\n\n},{\"./bootstrap3-modal\":222,\"./cardinal-modal\":223,\"./inline-iframe\":225}],225:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar SongbirdFramework = _dereq_(\"./songbird\");\nvar BraintreeError = _dereq_(\"../../../lib/braintree-error\");\nvar errors = _dereq_(\"../../shared/errors\");\nvar enumerate = _dereq_(\"../../../lib/enumerate\");\n\nfunction InlineIframeFramework(options) {\n  SongbirdFramework.call(this, options);\n}\n\nInlineIframeFramework.prototype = Object.create(SongbirdFramework.prototype, {\n  constructor: SongbirdFramework,\n});\n\nInlineIframeFramework.events = enumerate(\n  [\"AUTHENTICATION_IFRAME_AVAILABLE\"],\n  \"inline-iframe-framework:\"\n);\n\nInlineIframeFramework.prototype.setUpEventListeners = function (reply) {\n  SongbirdFramework.prototype.setUpEventListeners.call(this, reply);\n\n  this.on(\n    InlineIframeFramework.events.AUTHENTICATION_IFRAME_AVAILABLE,\n    function (payload, next) {\n      reply(\"authentication-iframe-available\", payload, next);\n    }\n  );\n};\n\nInlineIframeFramework.prototype._createCardinalConfigurationOptions = function (\n  setupOptions\n) {\n  var options =\n    SongbirdFramework.prototype._createCardinalConfigurationOptions.call(\n      this,\n      setupOptions\n    );\n\n  options.payment.framework = \"inline\";\n\n  return options;\n};\n\nInlineIframeFramework.prototype._addV1IframeToPage = function () {\n  this._emit(\n    InlineIframeFramework.events.AUTHENTICATION_IFRAME_AVAILABLE,\n    {\n      element: this._v1Modal,\n    },\n    function () {\n      // NOOP\n    }\n  );\n};\n\nInlineIframeFramework.prototype._setupFrameworkSpecificListeners = function () {\n  this.setCardinalListener(\"ui.inline.setup\", this._onInlineSetup.bind(this));\n};\n\nInlineIframeFramework.prototype._onInlineSetup = function (\n  htmlTemplate,\n  details,\n  resolve,\n  reject\n) {\n  var container, hasError;\n\n  if (!htmlTemplate || !details) {\n    hasError = true;\n  } else if (details.paymentType !== \"CCA\") {\n    hasError = true;\n  } else if (\n    !(details.data.mode === \"suppress\" || details.data.mode === \"static\")\n  ) {\n    hasError = true;\n  }\n\n  if (hasError) {\n    reject(new BraintreeError(errors.THREEDS_INLINE_IFRAME_DETAILS_INCORRECT));\n\n    return;\n  }\n\n  container = document.createElement(\"div\");\n  container.innerHTML = htmlTemplate;\n\n  if (details.data.mode === \"suppress\") {\n    container.style.display = \"none\";\n    document.body.appendChild(container);\n    resolve();\n  } else if (details.data.mode === \"static\") {\n    this._emit(\n      InlineIframeFramework.events.AUTHENTICATION_IFRAME_AVAILABLE,\n      {\n        element: container,\n      },\n      function () {\n        resolve();\n      }\n    );\n  }\n};\n\nmodule.exports = InlineIframeFramework;\n\n},{\"../../../lib/braintree-error\":148,\"../../../lib/enumerate\":157,\"../../shared/errors\":230,\"./songbird\":226}],226:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar BaseFramework = _dereq_(\"./base\");\nvar assign = _dereq_(\"../../../lib/assign\").assign;\nvar deferred = _dereq_(\"../../../lib/deferred\");\nvar BraintreeError = _dereq_(\"../../../lib/braintree-error\");\nvar convertToBraintreeError = _dereq_(\"../../../lib/convert-to-braintree-error\");\nvar analytics = _dereq_(\"../../../lib/analytics\");\nvar assets = _dereq_(\"../../../lib/assets\");\nvar errors = _dereq_(\"../../shared/errors\");\nvar enumerate = _dereq_(\"../../../lib/enumerate\");\nvar ExtendedPromise = _dereq_(\"@braintree/extended-promise\");\n\nvar INTEGRATION_TIMEOUT_MS =\n  _dereq_(\"../../../lib/constants\").INTEGRATION_TIMEOUT_MS;\nvar PLATFORM = _dereq_(\"../../../lib/constants\").PLATFORM;\nvar VERSION = \"3.134.0\";\nvar CUSTOMER_CANCELED_SONGBIRD_MODAL = \"01\";\nvar SONGBIRD_UI_EVENTS = [\n  \"ui.close\",\n  \"ui.render\",\n\n  // eslint-disable-next-line no-warning-comments\n  // TODO these events are not documented in the\n  // client reference because so far we have\n  // not been able to trigger them in our testing\n  \"ui.renderHidden\",\n  \"ui.loading.close\",\n  \"ui.loading.render\",\n];\n\nvar SCA_EXEMPTION_TYPES = [\"low_value\", \"transaction_risk_analysis\"];\n\nExtendedPromise.suppressUnhandledPromiseMessage = true;\n\nfunction SongbirdFramework(options) {\n  BaseFramework.call(this, options);\n\n  this._songbirdInitFailed = false;\n  this._clientMetadata = {\n    requestedThreeDSecureVersion: \"2\",\n    sdkVersion: PLATFORM + \"/\" + VERSION,\n  };\n  this.originalSetupOptions = options;\n  this._getDfReferenceIdPromisePlus = new ExtendedPromise();\n  this.setupSongbird(options);\n  this._cardinalEvents = [];\n}\n\nSongbirdFramework.prototype = Object.create(BaseFramework.prototype, {\n  constructor: SongbirdFramework,\n});\n\nSongbirdFramework.events = enumerate(\n  [\n    \"LOOKUP_COMPLETE\",\n    \"CUSTOMER_CANCELED\",\n    \"UI.CLOSE\",\n    \"UI.RENDER\",\n    \"UI.RENDERHIDDEN\",\n    \"UI.LOADING.CLOSE\",\n    \"UI.LOADING.RENDER\",\n  ],\n  \"songbird-framework:\"\n);\n\nSongbirdFramework.prototype.setUpEventListeners = function (reply) {\n  this.on(SongbirdFramework.events.LOOKUP_COMPLETE, function (data, next) {\n    reply(\"lookup-complete\", data, next);\n  });\n  this.on(SongbirdFramework.events.CUSTOMER_CANCELED, function () {\n    reply(\"customer-canceled\");\n  });\n  this.on(SongbirdFramework.events[\"UI.CLOSE\"], function () {\n    reply(\"authentication-modal-close\");\n  });\n  this.on(SongbirdFramework.events[\"UI.RENDER\"], function () {\n    reply(\"authentication-modal-render\");\n  });\n  this.on(SongbirdFramework.events[\"UI.RENDERHIDDEN\"], function () {\n    reply(\"authentication-modal-render-hidden\");\n  });\n  this.on(SongbirdFramework.events[\"UI.LOADING.CLOSE\"], function () {\n    reply(\"authentication-modal-loader-close\");\n  });\n  this.on(SongbirdFramework.events[\"UI.LOADING.RENDER\"], function () {\n    reply(\"authentication-modal-loader-render\");\n  });\n};\n\nSongbirdFramework.prototype.prepareLookup = function (options) {\n  var data = assign({}, options);\n  var self = this;\n\n  return this.getDfReferenceId()\n    .then(function (id) {\n      data.dfReferenceId = id;\n    })\n    .then(function () {\n      return self._triggerCardinalBinProcess(options.bin);\n    })\n    .catch(function () {\n      // catch and ignore errors from looking up\n      // df reference and Cardinal bin process\n    })\n    .then(function () {\n      return self._waitForClient();\n    })\n    .then(function () {\n      data.clientMetadata = self._clientMetadata;\n      data.authorizationFingerprint =\n        self._client.getConfiguration().authorizationFingerprint;\n      data.braintreeLibraryVersion = \"braintree/web/\" + VERSION;\n\n      return data;\n    });\n};\n\nSongbirdFramework.prototype.initializeChallengeWithLookupResponse = function (\n  lookupResponse,\n  options\n) {\n  return this.setupSongbird().then(\n    function () {\n      return BaseFramework.prototype.initializeChallengeWithLookupResponse.call(\n        this,\n        lookupResponse,\n        options\n      );\n    }.bind(this)\n  );\n};\n\nSongbirdFramework.prototype.handleSongbirdError = function (errorType) {\n  this._songbirdInitFailed = true;\n  this._removeSongbirdListeners();\n  analytics.sendEvent(\n    this._createPromise,\n    \"three-d-secure.cardinal-sdk.songbird-error.\" + errorType\n  );\n\n  if (this._songbirdPromise) {\n    this._songbirdPromise.resolve();\n  }\n};\n\nSongbirdFramework.prototype._triggerCardinalBinProcess = function (bin) {\n  var self = this;\n  var issuerStartTime = Date.now();\n\n  return window.Cardinal.trigger(\"bin.process\", bin).then(\n    function (binResults) {\n      self._clientMetadata.issuerDeviceDataCollectionTimeElapsed =\n        Date.now() - issuerStartTime;\n      self._clientMetadata.issuerDeviceDataCollectionResult =\n        binResults && binResults.Status;\n    }\n  );\n};\n\nSongbirdFramework.prototype.transformBillingAddress = function (\n  additionalInformation,\n  billingAddress\n) {\n  if (billingAddress) {\n    // map from public API to the API that the Gateway expects\n    extractAddressData(billingAddress, additionalInformation, \"billing\");\n    additionalInformation.billingPhoneNumber = billingAddress.phoneNumber;\n    additionalInformation.billingGivenName = billingAddress.givenName;\n    additionalInformation.billingSurname = billingAddress.surname;\n  }\n\n  return additionalInformation;\n};\n\nSongbirdFramework.prototype.transformShippingAddress = function (\n  additionalInformation\n) {\n  var shippingAddress = additionalInformation.shippingAddress;\n\n  if (shippingAddress) {\n    // map from public API to the API that the Gateway expects\n    extractAddressData(shippingAddress, additionalInformation, \"shipping\");\n\n    delete additionalInformation.shippingAddress;\n  }\n\n  return additionalInformation;\n};\n\nSongbirdFramework.prototype._createV1IframeModalElement = function (iframe) {\n  var modal = document.createElement(\"div\");\n\n  modal.innerHTML =\n    '<div data-braintree-v1-fallback-iframe-container=\"true\" style=\"' +\n    \"height: 400px;\" +\n    '\"></div>';\n  modal\n    .querySelector('[data-braintree-v1-fallback-iframe-container=\"true\"]')\n    .appendChild(iframe);\n\n  return modal;\n};\n\nSongbirdFramework.prototype._createV1IframeModal = function (iframe) {\n  var modal = this._createV1IframeModalElement(iframe);\n  var btn = modal.querySelector(\"[data-braintree-v1-fallback-close-button]\");\n  var backdrop = modal.querySelector(\"[data-braintree-v1-fallback-backdrop]\");\n  var self = this;\n\n  function closeHandler() {\n    modal.parentNode.removeChild(modal);\n    self.cancelVerifyCard(errors.THREEDS_CARDINAL_SDK_CANCELED);\n    document.removeEventListener(\"keyup\", self._onV1Keyup);\n    self._onV1Keyup = null;\n  }\n\n  this._onV1Keyup = function (e) {\n    if (e.key !== \"Escape\") {\n      return;\n    }\n\n    if (!modal.parentNode) {\n      // modal not on page\n      return;\n    }\n\n    closeHandler();\n  };\n\n  if (btn) {\n    btn.addEventListener(\"click\", closeHandler);\n  }\n\n  if (backdrop) {\n    backdrop.addEventListener(\"click\", closeHandler);\n  }\n\n  document.addEventListener(\"keyup\", this._onV1Keyup);\n\n  return modal;\n};\n\nSongbirdFramework.prototype._addV1IframeToPage = function () {\n  document.body.appendChild(this._v1Modal);\n};\n\nSongbirdFramework.prototype.setupSongbird = function (setupOptions) {\n  var self = this;\n  var startTime = Date.now();\n\n  if (this._songbirdPromise) {\n    return this._songbirdPromise;\n  }\n\n  setupOptions = setupOptions || {};\n\n  this._songbirdPromise = new ExtendedPromise();\n  this._v2SetupFailureReason = \"reason-unknown\";\n\n  self\n    ._loadCardinalScript(setupOptions)\n    .then(function () {\n      if (!window.Cardinal) {\n        self._v2SetupFailureReason = \"cardinal-global-unavailable\";\n\n        return Promise.reject(\n          new BraintreeError(errors.THREEDS_CARDINAL_SDK_SETUP_FAILED)\n        );\n      }\n\n      return self._configureCardinalSdk({\n        setupOptions: setupOptions,\n        setupStartTime: startTime,\n      });\n    })\n    .catch(function (err) {\n      var error = convertToBraintreeError(err, {\n        type: errors.THREEDS_CARDINAL_SDK_SETUP_FAILED.type,\n        code: errors.THREEDS_CARDINAL_SDK_SETUP_FAILED.code,\n        message: errors.THREEDS_CARDINAL_SDK_SETUP_FAILED.message,\n      });\n\n      self._getDfReferenceIdPromisePlus.reject(error);\n\n      window.clearTimeout(self._songbirdSetupTimeoutReference);\n      analytics.sendEvent(\n        self._client,\n        \"three-d-secure.cardinal-sdk.init.setup-failed\"\n      );\n      self.handleSongbirdError(\n        \"cardinal-sdk-setup-failed.\" + self._v2SetupFailureReason\n      );\n    });\n\n  return this._songbirdPromise;\n};\n\nSongbirdFramework.prototype._configureCardinalSdk = function (config) {\n  var self = this;\n\n  return this._waitForClient()\n    .then(function () {\n      var threeDSConfig =\n        self._client.getConfiguration().gatewayConfiguration.threeDSecure;\n\n      return threeDSConfig;\n    })\n    .then(function (threeDSConfig) {\n      var jwt = threeDSConfig.cardinalAuthenticationJWT;\n      var setupOptions = config.setupOptions;\n      var setupStartTime = config.setupStartTime;\n      var cardinalConfiguration =\n        self._createCardinalConfigurationOptions(setupOptions);\n\n      SONGBIRD_UI_EVENTS.forEach(function (eventName) {\n        self.setCardinalListener(eventName, function () {\n          self._emit(SongbirdFramework.events[eventName.toUpperCase()]);\n        });\n      });\n      self.setCardinalListener(\n        \"payments.setupComplete\",\n        self._createPaymentsSetupCompleteCallback()\n      );\n\n      self._setupFrameworkSpecificListeners();\n\n      window.Cardinal.configure(cardinalConfiguration);\n\n      window.Cardinal.setup(\"init\", {\n        jwt: jwt,\n      });\n\n      self._clientMetadata.cardinalDeviceDataCollectionTimeElapsed =\n        Date.now() - setupStartTime;\n\n      self.setCardinalListener(\n        \"payments.validated\",\n        self._createPaymentsValidatedCallback()\n      );\n    })\n    .catch(function (err) {\n      self._v2SetupFailureReason = \"cardinal-configuration-threw-error\";\n\n      return Promise.reject(err);\n    });\n};\n\nSongbirdFramework.prototype.setCardinalListener = function (eventName, cb) {\n  this._cardinalEvents.push(eventName);\n  window.Cardinal.on(eventName, cb);\n};\n\nSongbirdFramework.prototype._setupFrameworkSpecificListeners = function () {\n  // noop\n};\n\nSongbirdFramework.prototype._createCardinalConfigurationOptions = function (\n  setupOptions\n) {\n  var cardinalConfiguration = setupOptions.cardinalSDKConfig || {};\n  var paymentSettings = cardinalConfiguration.payment || {};\n\n  if (!cardinalConfiguration.logging && setupOptions.loggingEnabled) {\n    cardinalConfiguration.logging = {\n      level: \"verbose\",\n    };\n  }\n\n  cardinalConfiguration.payment = {};\n\n  if (paymentSettings.hasOwnProperty(\"displayLoading\")) {\n    cardinalConfiguration.payment.displayLoading =\n      paymentSettings.displayLoading;\n  }\n  if (paymentSettings.hasOwnProperty(\"displayExitButton\")) {\n    cardinalConfiguration.payment.displayExitButton =\n      paymentSettings.displayExitButton;\n  }\n\n  return cardinalConfiguration;\n};\n\nSongbirdFramework.prototype._loadCardinalScript = function (setupOptions) {\n  var self = this;\n  var scriptAttrs = {};\n  var identityHash;\n\n  return this._waitForClient()\n    .then(function () {\n      scriptAttrs.src =\n        self._client.getConfiguration().gatewayConfiguration.threeDSecure.cardinalSongbirdUrl;\n\n      identityHash =\n        self._client.getConfiguration().gatewayConfiguration.threeDSecure\n          .cardinalSongbirdIdentityHash;\n\n      if (identityHash) {\n        scriptAttrs.crossorigin = \"anonymous\";\n        scriptAttrs.integrity = identityHash;\n      }\n\n      self._songbirdSetupTimeoutReference = window.setTimeout(function () {\n        analytics.sendEvent(\n          self._client,\n          \"three-d-secure.cardinal-sdk.init.setup-timeout\"\n        );\n        self.handleSongbirdError(\"cardinal-sdk-setup-timeout\");\n      }, setupOptions.timeout || INTEGRATION_TIMEOUT_MS);\n\n      return assets.loadScript(scriptAttrs);\n    })\n    .catch(function (err) {\n      self._v2SetupFailureReason = \"songbird-js-failed-to-load\";\n\n      return Promise.reject(\n        convertToBraintreeError(\n          err,\n          errors.THREEDS_CARDINAL_SDK_SCRIPT_LOAD_FAILED\n        )\n      );\n    });\n};\n\nSongbirdFramework.prototype._createPaymentsSetupCompleteCallback = function () {\n  var self = this;\n\n  return function (data) {\n    self._getDfReferenceIdPromisePlus.resolve(data.sessionId);\n\n    window.clearTimeout(self._songbirdSetupTimeoutReference);\n    analytics.sendEvent(\n      self._createPromise,\n      \"three-d-secure.cardinal-sdk.init.setup-completed\"\n    );\n\n    self._songbirdPromise.resolve();\n  };\n};\n\nSongbirdFramework.prototype.getDfReferenceId = function () {\n  return this._getDfReferenceIdPromisePlus;\n};\n\nSongbirdFramework.prototype._performJWTValidation = function (\n  rawCardinalSDKVerificationData,\n  jwt\n) {\n  var self = this;\n  var nonce = this._lookupPaymentMethod.nonce;\n  var url =\n    \"payment_methods/\" + nonce + \"/three_d_secure/authenticate_from_jwt\";\n  var cancelCode =\n    rawCardinalSDKVerificationData &&\n    rawCardinalSDKVerificationData.Payment &&\n    rawCardinalSDKVerificationData.Payment.ExtendedData &&\n    rawCardinalSDKVerificationData.Payment.ExtendedData.ChallengeCancel;\n\n  if (cancelCode) {\n    // see ChallengeCancel docs here for different values:\n    // https://cardinaldocs.atlassian.net/wiki/spaces/CC/pages/98315/Response+Objects\n    analytics.sendEvent(\n      this._createPromise,\n      \"three-d-secure.verification-flow.cardinal-sdk.cancel-code.\" + cancelCode\n    );\n\n    if (cancelCode === CUSTOMER_CANCELED_SONGBIRD_MODAL) {\n      this._emit(SongbirdFramework.events.CUSTOMER_CANCELED);\n    }\n  }\n\n  analytics.sendEvent(\n    this._createPromise,\n    \"three-d-secure.verification-flow.upgrade-payment-method.started\"\n  );\n\n  return this._waitForClient()\n    .then(function () {\n      return self._client.request({\n        method: \"post\",\n        endpoint: url,\n        data: {\n          jwt: jwt,\n          paymentMethodNonce: nonce,\n        },\n      });\n    })\n    .then(function (response) {\n      var paymentMethod = response.paymentMethod || self._lookupPaymentMethod;\n      var formattedResponse = self._formatAuthResponse(\n        paymentMethod,\n        response.threeDSecureInfo\n      );\n\n      formattedResponse.rawCardinalSDKVerificationData =\n        rawCardinalSDKVerificationData;\n      analytics.sendEvent(\n        self._client,\n        \"three-d-secure.verification-flow.upgrade-payment-method.succeeded\"\n      );\n\n      return Promise.resolve(formattedResponse);\n    })\n    .catch(function (err) {\n      var error = new BraintreeError({\n        type: errors.THREEDS_JWT_AUTHENTICATION_FAILED.type,\n        code: errors.THREEDS_JWT_AUTHENTICATION_FAILED.code,\n        message: errors.THREEDS_JWT_AUTHENTICATION_FAILED.message,\n        details: {\n          originalError: err,\n        },\n      });\n\n      analytics.sendEvent(\n        self._client,\n        \"three-d-secure.verification-flow.upgrade-payment-method.errored\"\n      );\n\n      return Promise.reject(error);\n    });\n};\n\nSongbirdFramework.prototype._createPaymentsValidatedCallback = function () {\n  var self = this;\n\n  /**\n   * @param {object} data Response Data\n   * @see {@link https://cardinaldocs.atlassian.net/wiki/spaces/CC/pages/98315/Response+Objects#ResponseObjects-ObjectDefinition}\n   * @param {string} data.ActionCode The resulting state of the transaction.\n   * @param {boolean} data.Validated Represents whether transaction was successfully or not.\n   * @param {object} data.Payment Represents additional information about the verification.\n   * @param {number} data.ErrorNumber A non-zero value represents the error encountered while attempting the process the message request.\n   * @param {string} data.ErrorDescription Application error description for the associated error number.\n   * @param {string} validatedJwt Response JWT\n   * @returns {void}\n   * */\n  // eslint-disable-next-line complexity\n  return function (data, validatedJwt) {\n    var formattedError;\n\n    analytics.sendEvent(\n      self._createPromise,\n      \"three-d-secure.verification-flow.cardinal-sdk.action-code.\" +\n        data.ActionCode.toLowerCase()\n    );\n\n    if (!self._verifyCardPromisePlus) {\n      self.handleSongbirdError(\n        \"cardinal-sdk-setup-error.number-\" + data.ErrorNumber\n      );\n\n      return;\n    }\n\n    switch (data.ActionCode) {\n      // Handle these scenarios based on liability shift information in the response.\n      case \"SUCCESS\":\n      case \"NOACTION\":\n      case \"FAILURE\":\n        self\n          ._performJWTValidation(data, validatedJwt)\n          .then(function (result) {\n            self._verifyCardPromisePlus.resolve(result);\n          })\n          .catch(function (err) {\n            self._verifyCardPromisePlus.reject(err);\n          });\n        break;\n\n      case \"ERROR\":\n        analytics.sendEvent(\n          self._createPromise,\n          \"three-d-secure.verification-flow.cardinal-sdk-error.\" +\n            data.ErrorNumber\n        );\n\n        switch (data.ErrorNumber) {\n          case 10001: // Cardinal Docs: Timeout when sending an /Init message\n          case 10002: // Cardinal Docs: Timeout when sending an /Start message\n            formattedError = new BraintreeError(\n              errors.THREEDS_CARDINAL_SDK_SETUP_TIMEDOUT\n            );\n            break;\n          case 10003: // Cardinal Docs: Timeout when sending an /Validate message. Although this code exists we do not yet have a flow where a validate message is sent to Midas. This error should not yet be triggered\n          case 10007: // Cardinal Docs: Timeout when sending an /Confirm message\n          case 10009: // Cardinal Docs: Timeout when sending an /Continue message\n            formattedError = new BraintreeError(\n              errors.THREEDS_CARDINAL_SDK_RESPONSE_TIMEDOUT\n            );\n            break;\n          case 10005: // Cardinal Docs: Songbird was started without a request jwt.\n          case 10006: // Cardinal Docs: This is a general configuration error. The description is populated by the specific configuration error that caused the error.\n            formattedError = new BraintreeError(\n              errors.THREEDS_CARDINAL_SDK_BAD_CONFIG\n            );\n            break;\n          case 10008: // Cardinal Docs: Songbird was initialized without a merchant JWT.\n          case 10010: // Cardinal Docs: The response JWT was\n            formattedError = new BraintreeError(\n              errors.THREEDS_CARDINAL_SDK_BAD_JWT\n            );\n            break;\n          case 10011:\n            // This may never get called, according to the Cardinal docs:\n            // The user has canceled the transaction. This is generally found in alternative\n            // payments that supply a cancel button on the payment brand side.\n            analytics.sendEvent(\n              self._createPromise,\n              \"three-d-secure.verification-flow.canceled\"\n            );\n            formattedError = new BraintreeError(\n              errors.THREEDS_CARDINAL_SDK_CANCELED\n            );\n            break;\n          default:\n            formattedError = new BraintreeError(\n              errors.THREEDS_CARDINAL_SDK_ERROR\n            );\n        }\n\n        formattedError.details = {\n          originalError: {\n            code: data.ErrorNumber,\n            description: data.ErrorDescription,\n          },\n        };\n\n        self._verifyCardPromisePlus.reject(formattedError);\n        break;\n\n      default:\n    }\n  };\n};\n\nSongbirdFramework.prototype._checkForVerifyCardError = function (\n  options,\n  privateOptions\n) {\n  if (!options.bin) {\n    return new BraintreeError({\n      type: errors.THREEDS_MISSING_VERIFY_CARD_OPTION.type,\n      code: errors.THREEDS_MISSING_VERIFY_CARD_OPTION.code,\n      message: \"verifyCard options must include a BIN.\",\n    });\n  }\n\n  return BaseFramework.prototype._checkForVerifyCardError.call(\n    this,\n    options,\n    privateOptions\n  );\n};\n\nSongbirdFramework.prototype._checkForFrameworkSpecificVerifyCardErrors =\n  function (options, privateOptions) {\n    var errorOption;\n\n    if (\n      typeof options.onLookupComplete !== \"function\" &&\n      !privateOptions.ignoreOnLookupCompleteRequirement\n    ) {\n      errorOption = \"an onLookupComplete function\";\n    }\n\n    return errorOption;\n  };\n\nSongbirdFramework.prototype._formatVerifyCardOptions = function (options) {\n  var modifiedOptions = BaseFramework.prototype._formatVerifyCardOptions.call(\n    this,\n    options\n  );\n  var additionalInformation = modifiedOptions.additionalInformation || {};\n\n  additionalInformation = this.transformBillingAddress(\n    additionalInformation,\n    options.billingAddress\n  );\n  additionalInformation = this.transformShippingAddress(additionalInformation);\n\n  if (options.onLookupComplete) {\n    modifiedOptions.onLookupComplete = deferred(options.onLookupComplete);\n  }\n  if (options.email) {\n    additionalInformation.email = options.email;\n  }\n  if (options.mobilePhoneNumber) {\n    additionalInformation.mobilePhoneNumber = options.mobilePhoneNumber;\n  }\n\n  modifiedOptions.additionalInformation = additionalInformation;\n\n  return modifiedOptions;\n};\n\nSongbirdFramework.prototype._onLookupComplete = function (\n  lookupResponse,\n  options\n) {\n  var self = this;\n\n  return BaseFramework.prototype._onLookupComplete\n    .call(this, lookupResponse)\n    .then(function (response) {\n      return new Promise(function (resolve, reject) {\n        response.requiresUserAuthentication = Boolean(\n          response.lookup && response.lookup.acsUrl\n        );\n\n        function next() {\n          resolve(response);\n        }\n\n        self._verifyCardPromisePlus.catch(reject);\n\n        // If both event and callback are mistakenly used together,\n        // prefer the callback when it is passed into the verifyCard options\n        if (options.onLookupComplete) {\n          options.onLookupComplete(response, next);\n        } else {\n          self._emit(SongbirdFramework.events.LOOKUP_COMPLETE, response, next);\n        }\n      });\n    });\n};\n\nSongbirdFramework.prototype._presentChallenge = function (lookupResponse) {\n  // transactionId is required for the Songbird flow, so if it\n  // does not exist, we just return\n  if (this._songbirdInitFailed || !lookupResponse.lookup.transactionId) {\n    return;\n  }\n\n  // set up listener for ref id to call out to bt before calling verify callback\n  window.Cardinal.continue(\n    \"cca\",\n    {\n      AcsUrl: lookupResponse.lookup.acsUrl,\n      Payload: lookupResponse.lookup.pareq,\n    },\n    {\n      OrderDetails: { TransactionId: lookupResponse.lookup.transactionId },\n    }\n  );\n};\n\nSongbirdFramework.prototype._formatLookupData = function (options) {\n  var self = this;\n\n  return BaseFramework.prototype._formatLookupData\n    .call(this, options)\n    .then(function (data) {\n      data.additionalInfo = options.additionalInformation;\n\n      if (options.accountType) {\n        data.accountType = options.accountType;\n      }\n      if (options.challengeRequested) {\n        data.challengeRequested = options.challengeRequested;\n      }\n      if (options.requestedExemptionType) {\n        if (!SCA_EXEMPTION_TYPES.includes(options.requestedExemptionType)) {\n          throw new BraintreeError({\n            code: errors.THREEDS_REQUESTED_EXEMPTION_TYPE_INVALID.code,\n            type: errors.THREEDS_REQUESTED_EXEMPTION_TYPE_INVALID.type,\n            message:\n              \"requestedExemptionType `\" +\n              options.requestedExemptionType +\n              \"` is not a valid exemption. The accepted values are: `\" +\n              SCA_EXEMPTION_TYPES.join(\"`, `\") +\n              \"`\",\n          });\n        }\n        data.requestedExemptionType = options.requestedExemptionType;\n      }\n      if (options.customFields) {\n        data.customFields = options.customFields;\n      }\n      if (options.dataOnlyRequested) {\n        data.dataOnlyRequested = options.dataOnlyRequested;\n      }\n      if (options.exemptionRequested) {\n        data.exemptionRequested = options.exemptionRequested;\n      }\n      if (options.requestVisaDAF) {\n        data.requestVisaDAF = options.requestVisaDAF;\n      }\n      if (options.bin) {\n        data.bin = options.bin;\n      }\n      // NEXT_MAJOR_VERSION remove cardAdd in favor of cardAddChallengeRequested\n      if (options.cardAdd != null) {\n        data.cardAdd = options.cardAdd;\n      }\n      if (options.cardAddChallengeRequested != null) {\n        data.cardAdd = options.cardAddChallengeRequested;\n      }\n      if (options.merchantName) {\n        data.merchantName = options.merchantName;\n      }\n\n      return self.prepareLookup(data);\n    });\n};\n\nSongbirdFramework.prototype.cancelVerifyCard = function (verifyCardError) {\n  var self = this;\n\n  return BaseFramework.prototype.cancelVerifyCard\n    .call(this)\n    .then(function (response) {\n      if (self._verifyCardPromisePlus) {\n        verifyCardError =\n          verifyCardError ||\n          new BraintreeError(errors.THREEDS_VERIFY_CARD_CANCELED_BY_MERCHANT);\n\n        self._verifyCardPromisePlus.reject(verifyCardError);\n      }\n\n      return response;\n    });\n};\n\nSongbirdFramework.prototype._removeSongbirdListeners = function () {\n  this._cardinalEvents.forEach(function (eventName) {\n    window.Cardinal.off(eventName);\n  });\n\n  this._cardinalEvents = [];\n};\n\nSongbirdFramework.prototype.teardown = function () {\n  if (window.Cardinal) {\n    this._removeSongbirdListeners();\n  }\n\n  // we intentionally do not remove the Cardinal SDK\n  // from the page when tearing down. Subsequent\n  // component creations will be faster because\n  // the asset is already on the page\n\n  return BaseFramework.prototype.teardown.call(this);\n};\n\nSongbirdFramework.prototype._reloadThreeDSecure = function () {\n  var self = this;\n  var startTime = Date.now();\n\n  return self.teardown().then(function () {\n    self._configureCardinalSdk({\n      setupOptions: self.originalSetupOptions,\n      setupStartTime: startTime,\n    });\n  });\n};\n\nfunction extractAddressData(source, target, prefix) {\n  target[prefix + \"Line1\"] = source.streetAddress;\n  target[prefix + \"Line2\"] = source.extendedAddress;\n  target[prefix + \"Line3\"] = source.line3;\n  target[prefix + \"City\"] = source.locality;\n  target[prefix + \"State\"] = source.region;\n  target[prefix + \"PostalCode\"] = source.postalCode;\n  target[prefix + \"CountryCode\"] = source.countryCodeAlpha2;\n}\n\nmodule.exports = SongbirdFramework;\n\n},{\"../../../lib/analytics\":143,\"../../../lib/assets\":144,\"../../../lib/assign\":145,\"../../../lib/braintree-error\":148,\"../../../lib/constants\":149,\"../../../lib/convert-to-braintree-error\":151,\"../../../lib/deferred\":155,\"../../../lib/enumerate\":157,\"../../shared/errors\":230,\"./base\":221,\"@braintree/extended-promise\":34}],227:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar wrapPromise = _dereq_(\"@braintree/wrap-promise\");\nvar methods = _dereq_(\"../../lib/methods\");\nvar convertMethodsToError = _dereq_(\"../../lib/convert-methods-to-error\");\nvar EventEmitter = _dereq_(\"@braintree/event-emitter\");\nvar FRAMEWORKS = _dereq_(\"./frameworks\");\n\n/**\n * @deprecated\n * @callback ThreeDSecure~addFrameCallback\n * @param {?BraintreeError} [err] `null` or `undefined` if there was no error.\n * @param {HTMLIFrameElement} iframe An iframe element containing the bank's authentication page that you must put on your page.\n * @description **Deprecated** The callback used for options.addFrame in 3DS 1.0's {@link ThreeDSecure#verifyCard|verifyCard}.\n * @returns {void}\n */\n\n/**\n * @deprecated\n * @callback ThreeDSecure~removeFrameCallback\n * @description **Deprecated** The callback used for options.removeFrame in 3DS 1.0's {@link ThreeDSecure#verifyCard|verifyCard}.\n * @returns {void}\n */\n\n/**\n * @deprecated\n * @typedef {object} ThreeDSecure~verifyCardCustomerObject\n * @property {string} [customer.mobilePhoneNumber] The mobile phone number used for verification. Only numbers; remove dashes, parenthesis and other characters.\n * @property {string} [customer.email] The email used for verification.\n * @property {string} [customer.shippingMethod] The 2-digit string indicating the shipping method chosen for the transaction.\n * @property {string} [customer.billingAddress.firstName] The first name associated with the address.\n * @property {string} [customer.billingAddress.lastName] The last name associated with the address.\n * @property {string} [customer.billingAddress.streetAddress] Line 1 of the Address (eg. number, street, etc).\n * @property {string} [customer.billingAddress.extendedAddress] Line 2 of the Address (eg. suite, apt #, etc.).\n * @property {string} [customer.billingAddress.locality] The locality (city) name associated with the address.\n * @property {string} [customer.billingAddress.region] The 2 letter code for US states or an ISO-3166-2 country subdivision code of up to three letters.\n * @property {string} [customer.billingAddress.postalCode] The zip code or equivalent for countries that have them.\n * @property {string} [customer.billingAddress.countryCodeAlpha2] The 2 character country code.\n * @property {string} [customer.billingAddress.phoneNumber] The phone number associated with the address. Only numbers; remove dashes, parenthesis and other characters.\n * @description **Deprecated** Optional customer information to be passed to 3DS 1.0 for verification.\n */\n\n/**\n * @typedef {object} ThreeDSecure~verifyPayload\n * @property {string} nonce The new payment method nonce produced by the 3D Secure lookup. The original nonce passed into {@link ThreeDSecure#verifyCard|verifyCard} was consumed. This new nonce should be used to transact on your server.\n * @property {string} type The payment method type.\n * @property {object} details Additional account details.\n * @property {string} details.cardType Type of card, ex: Visa, MasterCard.\n * @property {string} details.lastFour Last four digits of card number.\n * @property {string} details.lastTwo Last two digits of card number.\n * @property {string} description A human-readable description.\n * @property {object} binData Information about the card based on the bin.\n * @property {string} binData.commercial Possible values: 'Yes', 'No', 'Unknown'.\n * @property {string} binData.countryOfIssuance The country of issuance.\n * @property {string} binData.debit Possible values: 'Yes', 'No', 'Unknown'.\n * @property {string} binData.durbinRegulated Possible values: 'Yes', 'No', 'Unknown'.\n * @property {string} binData.healthcare Possible values: 'Yes', 'No', 'Unknown'.\n * @property {string} binData.issuingBank The issuing bank.\n * @property {string} binData.payroll Possible values: 'Yes', 'No', 'Unknown'.\n * @property {string} binData.prepaid Possible values: 'Yes', 'No', 'Unknown'.\n * @property {string} binData.productId The product id.\n * @property {string} binData.business Possible values: 'Yes', 'No', 'Unknown'.\n * @property {string} binData.consumer Possible values: 'Yes', 'No', 'Unknown'.\n * @property {string} binData.purchase Possible values: 'Yes', 'No', 'Unknown'.\n * @property {string} binData.corporate Possible values: 'Yes', 'No', 'Unknown'.\n * @property {boolean} liabilityShiftPossible *Deprecated:* Use `threeDSecureInfo.liabilityShiftPossible` instead.\n * @property {boolean} liabilityShifted *Deprecated:* Use `threeDSecureInfo.liabilityShifted` instead.\n * @property {object} threeDSecureInfo 3DS information about the card. Note: This information should be verified on the server by using the [payment method nonce find method](https://developer.paypal.com/braintree/docs/reference/request/payment-method-nonce/find). The values provided here are merely for convenience. Only values looked up on the server should determine the logic about how to process a transaction.\n * @property {string} threeDSecureInfo.acsTransactionId The transaction identifier from the issuing bank.\n * @property {string} threeDSecureInfo.cavv Cardholder authentication verification value or CAVV. The main encrypted message issuers and card networks use to verify authentication has occurred. Mastercard uses an AVV message and American Express uses an AEVV message, each of which should also be passed in the cavv parameter.\n * @property {string} threeDSecureInfo.dsTransactionId Transaction identifier resulting from 3D Secure 2 authentication.\n * @property {string} threeDSecureInfo.eciFlag The value of the electronic commerce indicator (ECI) flag, which indicates the outcome of the 3DS authentication. This will be a two-digit value.\n * @property {string} threeDSecureInfo.enrolled Indicates the status of 3D Secure authentication eligibility with the card issuer.\n * @property {boolean} threeDSecureInfo.liabilityShifted Indicates whether the liability for fraud has been shifted away from the merchant.\n * @property {boolean} threeDSecureInfo.liabilityShiftPossible Indicates whether liability shift is still possible on a retry.\n * @property {string} threeDSecureInfo.paresStatus Transaction status result identifier.\n * @property {string} threeDSecureInfo.status Indicates the outcome of the 3D Secure event.\n * @property {string} threeDSecureInfo.threeDSecureAuthenticationId ID of the 3D Secure authentication performed for this transaction. Do not provide this field as a transaction sale parameter if you are using the returned payment method nonce from the payload.\n * @property {string} threeDSecureInfo.threeDSecureServerTransactionId Transaction identifier provided by the issuing bank who recieved the 3D Secure event.\n * @property {string} threeDSecureInfo.threeDSecureVersion The version of 3D Secure authentication used for the transaction.\n * @property {string} threeDSecureInfo.xid Transaction identifier resulting from 3D Secure authentication. Uniquely identifies the transaction and sometimes required in the authorization message. This is a base64-encoded value. This field will no longer be used in 3D Secure 2 authentications for Visa and Mastercard, however it will be supported by American Express.\n * @property {string} threeDSecureInfo.lookup.transStatus Error code returned from the 3D Secure MPI provider.\n * @property {string} threeDSecureInfo.lookup.transStatusReason Description correlating to the transStatus error code.\n * @property {string} threeDSecureInfo.authentication.transStatus Error code returned from the 3D Secure MPI provider.\n * @property {string} threeDSecureInfo.authentication.transStatusReason Description correlating to the transStatus error code.\n * @property {object} rawCardinalSDKVerificationData The response back from the Cardinal SDK after verification has completed. See [Cardinal's Documentation](https://cardinaldocs.atlassian.net/wiki/spaces/CC/pages/98315/Response+Objects) for more information. If the customer was not required to do a 3D Secure challenge, this object will not be available.\n */\n\n/**\n * @typedef {string} ThreeDSecure~prepareLookupPayload The client data to pass on when doing a server side lookup call.\n */\n\n/**\n * @typedef {object} ThreeDSecure~verificationData\n * @property {boolean} requiresUserAuthentication When `true`, the user will be presented with a 3D Secure challenge when calling `next` in the {@link ThreeDSecure#event:lookup-complete|`lookup-complete` event}.\n * @property {object} threeDSecureInfo Contains liability shift details.\n * @property {boolean} threeDSecureInfo.liabilityShiftPossible Indicates whether the card was eligible for 3D Secure.\n * @property {boolean} threeDSecureInfo.liabilityShifted Indicates whether the liability for fraud has been shifted away from the merchant.\n * @property {object} paymentMethod A {@link ThreeDSecure~verifyPayload|verifyPayload} object.\n * @property {object} lookup Details about the 3D Secure lookup.\n * @property {string} lookup.threeDSecureVersion The version of 3D Secure that will be used for the 3D Secure challenge.\n */\n\n/**\n * @typedef {object} ThreeDSecure~billingAddress\n * @property {string} [givenName] The first name associated with the billing address. (maximum length 50, ASCII characters)\n * @property {string} [surname] The last name associated with the billing address. (maximum length 50, ASCII characters)\n * @property {string} [phoneNumber] The phone number associated with the billing address. Only numbers; remove dashes, parenthesis and other characters.\n * @property {string} [streetAddress] Line 1 of the billing address (eg. number, street, etc). (maximum length 50)\n * @property {string} [extendedAddress] Line 2 of the billing address (eg. suite, apt #, etc.). (maximum length 50)\n * @property {string} [line3] Line 3 of the billing address if needed (eg. suite, apt #, etc). (maximum length 50)\n * @property {string} [locality] The locality (city) name associated with the billing address.\n * @property {string} [region] This field expects an ISO3166-2 subdivision code. The subdivision code is what follows the hyphen separator in the full ISO 3166-2 code. For example, the state of Ohio in the United States we expect \"OH\" as opposed to the full ISO 3166-2 code \"US-OH\".\n * @property {string} [postalCode] The zip code or equivalent for countries that have them.\n * @property {string} [countryCodeAlpha2] The 2 character country code.\n */\n\n/**\n * @typedef {object} ThreeDSecure~additionalInformation\n * @property {string} [workPhoneNumber] The work phone number used for verification. Only numbers; remove dashes, parenthesis and other characters. (maximum length 25)\n * @property {string} [shippingGivenName] The first name associated with the shipping address. (maximum length 50, ASCII characters)\n * @property {string} [shippingSurname] The last name associated with the shipping address. (maximum length 50, ASCII characters)\n * @property {object} [shippingAddress]\n * @property {string} [shippingAddress.streetAddress] Line 1 of the shipping address (eg. number, street, etc). (maximum length 50)\n * @property {string} [shippingAddress.extendedAddress] Line 2 of the shipping address (eg. suite, apt #, etc.). (maximum length 50)\n * @property {string} [shippingAddress.line3] Line 3 of the shipping address if needed (eg. suite, apt #, etc). (maximum length 50)\n * @property {string} [shippingAddress.locality] The locality (city) name associated with the shipping address. (maximum length 50)\n * @property {string} [shippingAddress.region] This field expects an ISO3166-2 subdivision code. The subdivision code is what follows the hyphen separator in the full ISO 3166-2 code. For example, the state of Ohio in the United States we expect \"OH\" as opposed to the full ISO 3166-2 code \"US-OH\".\n * @property {string} [shippingAddress.postalCode] The zip code or equivalent for countries that have them. (maximum length 10)\n * @property {string} [shippingAddress.countryCodeAlpha2] The 2 character country code. (maximum length 2)\n * @property {string} [shippingPhone] The phone number associated with the shipping address. Only numbers; remove dashes, parenthesis and other characters. (maximum length 20)\n * @property {string} [shippingMethod] The 2-digit string indicating the name of the shipping method chosen for the transaction. (maximum length 50) Possible values:\n * - `01` Same Day\n * - `02` Overnight / Expedited\n * - `03` Priority (2-3 Days)\n * - `04` Ground\n * - `05` Electronic Delivery\n * - `06` Ship to Store\n * @property {string} [shippingMethodIndicator] The 2-digit string indicating the shipping method chosen for the transaction Possible values.\n * - `01` Ship to cardholder billing address\n * - `02` Ship to another verified address on file with merchant\n * - `03` Ship to address that is different from billing address\n * - `04` Ship to store (store address should be populated on request)\n * - `05` Digital goods\n * - `06` Travel and event tickets, not shipped\n * - `07` Other\n * @property {string} [productCode] The 3-letter string representing the merchant product code. Possible values:\n * - `AIR` Airline\n * - `GEN` General Retail\n * - `DIG` Digital Goods\n * - `SVC` Services\n * - `RES` Restaurant\n * - `TRA` Travel\n * - `DSP` Cash Dispensing\n * - `REN` Car Rental\n * - `GAS` Fuel\n * - `LUX` Luxury Retail\n * - `ACC` Accommodation Retail\n * - `TBD` Other\n * @property {string} [deliveryTimeframe] The 2-digit number indicating the delivery time frame. Possible values:\n * - `01` Electronic delivery\n * - `02` Same day shipping\n * - `03` Overnight shipping\n * - `04` Two or more day shipping\n * @property {string} [deliveryEmail] For electronic delivery, email address to which the merchandise was delivered. (maximum length 254)\n * @property {string} [reorderindicator] The 2-digit number indicating whether the cardholder is reordering previously purchased merchandise. possible values:\n * - `01` First time ordered\n * - `02` Reordered\n * @property {string} [preorderIndicator] The 2-digit number indicating whether cardholder is placing an order with a future availability or release date. possible values:\n * - `01` Merchandise available\n * - `02` Future availability\n * @property {string} [preorderDate] The 8-digit number (format: YYYYMMDD) indicating expected date that a pre-ordered purchase will be available.\n * @property {string} [giftCardAmount] The purchase amount total for prepaid gift cards in major units. (maximum length 15)\n * @property {string} [giftCardCurrencyCode] ISO 4217 numeric currency code for the gift card purchased. (maximum length 3)\n * @property {string} [giftCardCount] Total count of individual prepaid gift cards purchased. (maximum length 2)\n * @property {string} [accountAgeIndicator] The 2-digit value representing the length of time cardholder has had account. Possible values:\n * - `01` No Account\n * - `02` Created during transaction\n * - `03` Less than 30 days\n * - `04` 30-60 days\n * - `05` More than 60 days\n * @property {string} [accountCreateDate] The 8-digit number (format: YYYYMMDD) indicating the date the cardholder opened the account.\n * @property {string} [accountChangeIndicator] The 2-digit value representing the length of time since the last change to the cardholder account. This includes shipping address, new payment account or new user added. Possible values:\n * - `01` Changed during transaction\n * - `02` Less than 30 days\n * - `03` 30-60 days\n * - `04` More than 60 days\n * @property {string} [accountChangeDate] The 8-digit number (format: YYYYMMDD) indicating the date the cardholder's account was last changed. This includes changes to the billing or shipping address, new payment accounts or new users added.\n * @property {string} [accountPwdChangeIndicator] The 2-digit value representing the length of time since the cardholder changed or reset the password on the account. Possible values:\n * - `01` No change\n * - `02` Changed during transaction\n * - `03` Less than 30 days\n * - `04` 30-60 days\n * - `05` More than 60 days\n * @property {string} [accountPwdChangeDate] The 8-digit number (format: YYYYMMDD) indicating the date the cardholder last changed or reset password on account.\n * @property {string} [shippingAddressUsageIndicator] The 2-digit value indicating when the shipping address used for transaction was first used. Possible values:\n * - `01` This transaction\n * - `02` Less than 30 days\n * - `03` 30-60 days\n * - `04` More than 60 days\n * @property {string} [shippingAddressUsageDate] The 8-digit number (format: YYYYMMDD) indicating the date when the shipping address used for this transaction was first used.\n * @property {string} [transactionCountDay] Number of transactions (successful or abandoned) for this cardholder account within the last 24 hours. (maximum length 3)\n * @property {string} [transactionCountYear] Number of transactions (successful or abandoned) for this cardholder account within the last year. (maximum length 3)\n * @property {string} [addCardAttempts] Number of add card attempts in the last 24 hours. (maximum length 3)\n * @property {string} [accountPurchases] Number of purchases with this cardholder account during the previous six months.\n * @property {string} [fraudActivity] The 2-digit value indicating whether the merchant experienced suspicious activity (including previous fraud) on the account. Possible values:\n * - `01` No suspicious activity\n * - `02` Suspicious activity observed\n * @property {string} [shippingNameIndicator] The 2-digit value indicating if the cardholder name on the account is identical to the shipping name used for the transaction. Possible values:\n * - `01` Account and shipping name identical\n * - `02` Account and shipping name differ\n * @property {string} [paymentAccountIndicator] The 2-digit value indicating the length of time that the payment account was enrolled in the merchant account. Possible values:\n * - `01` No account (guest checkout)\n * - `02` During the transaction\n * - `03` Less than 30 days\n * - `04` 30-60 days\n * - `05` More than 60 days\n * @property {string} [paymentAccountAge] The 8-digit number (format: YYYYMMDD) indicating the date the payment account was added to the cardholder account.\n * @property {string} [acsWindowSize] The 2-digit number to set the challenge window size to display to the end cardholder.  The ACS will reply with content that is formatted appropriately to this window size to allow for the best user experience.  The sizes are width x height in pixels of the window displayed in the cardholder browser window. Possible values:\n * - `01` 250x400\n * - `02` 390x400\n * - `03` 500x600\n * - `04` 600x400\n * - `05` Full page\n * @property {string} [sdkMaxTimeout] The 2-digit number of minutes (minimum 05) to set the maximum amount of time for all 3DS 2.0 messages to be communicated between all components.\n * @property {string} [addressMatch] The 1-character value (Y/N) indicating whether cardholder billing and shipping addresses match.\n * @property {string} [accountId] Additional cardholder account information. (maximum length 64)\n * @property {string} [ipAddress] The IP address of the consumer. IPv4 and IPv6 are supported.\n * - only one IP address supported\n * - only numbers, letters, period '.' chars, or colons ':' are acceptable\n * @property {string} [orderDescription] Brief description of items purchased. (maximum length 256)\n * @property {string} [taxAmount] Unformatted tax amount without any decimalization (ie. $123.67 = 12367). (maximum length 20)\n * @property {string} [userAgent] The exact content of the HTTP user agent header. (maximum length 500)\n * @property {string} [authenticationIndicator] The 2-digit number indicating the type of authentication request. Possible values:\n *  - `01` Payment\n *  - `02` Recurring transaction\n *  - `03` Installment\n *  - `04` Add card\n *  - `05` Maintain card\n *  - `06` Cardholder verification as part of EMV token ID&V\n *  - `08` Split Shipment\n *  - `09` Delayed Shipment\n *  - `85` Payment with multiple merchants\n * @property {string} [installment] An integer value greater than 1 indicating the maximum number of permitted authorizations for installment payments. (maximum length 3)\n * @property {string} [purchaseDate] The 14-digit number (format: YYYYMMDDHHMMSS) indicating the date in UTC of original purchase.\n * @property {string} [recurringEnd] The 8-digit number (format: YYYYMMDD) indicating the date after which no further recurring authorizations should be performed.\n * @property {string} [recurringFrequency] Integer value indicating the minimum number of days between recurring authorizations. A frequency of monthly is indicated by the value 28. Multiple of 28 days will be used to indicate months (ex. 6 months = 168). (maximum length 3)\n */\n\n/**\n * @name ThreeDSecure#on\n * @function\n * @param {string} event The name of the event to which you are subscribing.\n * @param {function} handler A callback to handle the event.\n * @description Subscribes a handler function to a named event. The following events are available:\n *   * {@link ThreeDSecure#event:lookup-complete|lookup-complete}\n *   * {@link ThreeDSecure#event:customer-canceled|customer-canceled}\n *   * {@link ThreeDSecure#event:authentication-iframe-available|authentication-iframe-available}\n *   * {@link ThreeDSecure#event:authentication-modal-render|authentication-modal-render}\n *   * {@link ThreeDSecure#event:authentication-modal-close|authentication-modal-close}\n * @example\n * <caption>Listening to a 3D Secure event</caption>\n * braintree.threeDSecure.create({ ... }, function (createErr, threeDSecureInstance) {\n *   threeDSecureInstance.on('lookup-complete', function (data, next) {\n *     console.log('data from the lookup', data);\n *     next();\n *   });\n *   threeDSecureInstance.on('customer-canceled', function () {\n *     console.log('log that the customer canceled');\n *   });\n * });\n * @returns {void}\n */\n\n/**\n * @name ThreeDSecure#off\n * @function\n * @param {string} event The name of the event to which you are unsubscribing.\n * @param {function} handler The callback for the event you are unsubscribing from.\n * @description Unsubscribes the handler function to a named event.\n * @example\n * <caption>Subscribing and then unsubscribing from a 3D Secure eld event</caption>\n * braintree.threeDSecure.create({ ... }, function (createErr, threeDSecureInstance) {\n *   var lookupCallback = function (data, next) {\n *     console.log(data);\n *     next();\n *   };\n *   var cancelCallback = function () {\n *     // log the cancelation\n *     // or update UI\n *   };\n *\n *   threeDSecureInstance.on('lookup-complete', lookupCallback);\n *   threeDSecureInstance.on('customer-canceled', cancelCallback);\n *\n *   // later on\n *   threeDSecureInstance.off('lookup-complete', lookupCallback);\n *   threeDSecureInstance.off('customer-canceled', cancelCallback);\n * });\n * @returns {void}\n */\n\n/**\n * This event is emitted when the `2-inline-iframe` version is specified when creating the 3D Secure instance and the authentication iframe becomes available.\n * @event ThreeDSecure#authentication-iframe-available\n * @example\n * <caption>Listening for the authentication iframe to be available</caption>\n *   threeDSecureInstance.on('authentication-iframe-available', function (event, next) {\n *     document.body.appendChild(event.element); // add iframe element to page\n *\n *     next(); // let the SDK know the iframe is ready\n *   });\n * });\n */\n\n/**\n * This event is emitted when using the 3D Secure 2.0 flow and the initial lookup request completes. If this is not used, a `onLookupComplete` callback must be passed into the `verifyCard` method.\n * @event ThreeDSecure#lookup-complete\n * @example\n * <caption>Listening for when the lookup request is complete</caption>\n * braintree.threeDSecure.create({\n *   client: clientInstance,\n *   version: '2'\n * }, function (createErr, threeDSecureInstance) {\n *   threeDSecureInstance.on('lookup-complete', function (data, next) {\n *     // inspect the data\n *\n *     // call next when ready to proceed with the challenge\n *     next();\n *   });\n * });\n */\n\n/**\n * This event is emitted when using the 3D Secure 2.0 flow and the customer cancels the 3D Secure challenge.\n * @event ThreeDSecure#customer-canceled\n * @example\n * <caption>Listening for when the customer cancels the 3D Secure challenge</caption>\n * braintree.threeDSecure.create({\n *   client: clientInstance,\n *   version: '2'\n * }, function (createErr, threeDSecureInstance) {\n *   threeDSecureInstance.on('customer-canceled', function () {\n *     // the customer canceled the 3D Secure challenge\n *   });\n * });\n */\n\n/**\n * This event is emitted when using the 3D Secure 2.0 flow and the authentication modal closes, either because the authentication was completed or because the customer canceled the process.\n * @event ThreeDSecure#authentication-modal-close\n * @example\n * braintree.threeDSecure.create({\n *   client: clientInstance,\n *   version: '2'\n * }, function (createErr, threeDSecureInstance) {\n *   threeDSecureInstance.on('authentication-modal-close', function () {\n *     // the modal was closed\n *   });\n * });\n */\n\n/**\n * This event is emitted when using the 3D Secure 2.0 flow and the authentication modal is rendered.\n * @event ThreeDSecure#authentication-modal-render\n * @example\n * braintree.threeDSecure.create({\n *   client: clientInstance,\n *   version: '2'\n * }, function (createErr, threeDSecureInstance) {\n *   threeDSecureInstance.on('authentication-modal-render', function () {\n *     // the modal was rendered, presenting the authentication form to the customer\n *   });\n * });\n */\n\n/**\n * @class\n * @param {object} options 3D Secure {@link module:braintree-web/three-d-secure.create create} options\n * @description <strong>Do not use this constructor directly. Use {@link module:braintree-web/three-d-secure.create|braintree.threeDSecure.create} instead.</strong>\n * @classdesc This class represents a ThreeDSecure component produced by {@link module:braintree-web/three-d-secure.create|braintree.threeDSecure.create}. Instances of this class have a method for launching a 3D Secure authentication flow.\n *\n * If you use the Braintree SDK from within an iframe, you must not use the `sandbox` attribute on your iframe or the 3D Secure modal will not function correctly.\n *\n * **Note**: 3D Secure 2.0 is documented below and will become the default integration method in a future version of Braintree-web. Until then, version 1.0 will continue to be supported. To view 3D Secure 1.0 documentation, look at Braintree-web documentation from version [3.40.0](https://braintree.github.io/braintree-web/3.40.0/ThreeDSecure.html) and earlier, or upgrade your integration by referring to the [3D Secure 2.0 adoption guide](https://developer.paypal.com/braintree/docs/guides/3d-secure/migration/javascript/v3).\n */\nfunction ThreeDSecure(options) {\n  var self = this;\n  var Framework = FRAMEWORKS[options.framework];\n\n  EventEmitter.call(this);\n\n  this._framework = new Framework(options);\n  this._framework.setUpEventListeners(function () {\n    self._emit.apply(self, arguments);\n  });\n}\n\nEventEmitter.createChild(ThreeDSecure);\n// NEXT_MAJOR_VERSION remove exemptionRequested entirely in favor of `requestedExemptionType`\n/**\n * Launch the 3D Secure login flow, returning a nonce payload.\n *\n * @public\n * @param {object} options Options for card verification.\n * @param {string} options.nonce The nonce representing the card from a tokenization payload. For example, this can be a {@link HostedFields~tokenizePayload|tokenizePayload} returned by Hosted Fields under `payload.nonce`.\n * @param {string} options.bin The numeric Bank Identification Number (bin) of the card from a tokenization payload. For example, this can be a {@link HostedFields~tokenizePayload|tokenizePayload} returned by Hosted Fields under `payload.details.bin`.\n * @param {string} options.amount The amount of the transaction in the current merchant account's currency. This must be expressed in numbers with an optional decimal (using `.`) and precision up to the hundredths place. For example, if you're processing a transaction for 1.234,56 € then `amount` should be `1234.56`.\n * @param {string} [options.accountType] The account type for the card (if known). Accepted values: `credit` or `debit`.\n * @param {boolean} [options.cardAddChallengeRequested] If set to `true`, a card-add challenge will be requested from the issuer. If set to `false`, a card-add challenge will not be requested. If the param is missing, a card-add challenge will only be requested for $0 amount. An authentication created using this flag should only be used for vaulting operations (creation of customers' credit cards or payment methods) and not for creating transactions.\n * @param {boolean} [options.cardAdd] *Deprecated:* Use `cardAddChallengeRequested` instead.\n * @param {boolean} [options.challengeRequested] If set to true, an authentication challenge will be forced if possible.\n * @param {boolean} [options.dataOnlyRequested] Indicates whether to use the data-only 3DS flow. If data-only is not supported by the processor, card brand or the transaction is in a PSD2 regulated region, it will fallback to a normal 3DS flow.\n * @param {boolean} [options.exemptionRequested] *Deprecated:* Use `requestedExemptionType` instead.\n * @param {boolean} [options.requestVisaDAF] Request to use VISA Digital Authentication Framework. If set to true, a Visa DAF authenticated payment credential will be created and/or used for authentication if the merchant is eligible.\n * @param {string} [options.merchantName] Allows to override the merchant name that is shown in the challenge.\n * @param {string} [options.requestedExemptionType] If an exemption is requested and the exemption's conditions are satisfied, then it will be applied. The following supported exemptions are defined as per PSD2 regulation: `low_value`, `transaction_risk_analysis`\n * @param {object} [options.customFields] Object where each key is the name of a custom field which has been configured in the Control Panel. In the Control Panel you can configure 3D Secure Rules which trigger on certain values.\n * @param {function} [options.onLookupComplete] *Deprecated:* Use {@link ThreeDSecure#event:lookup-complete|`threeDSecureInstance.on('lookup-complete')`} instead. Function to execute when lookup completes. The first argument, `data`, is a {@link ThreeDSecure~verificationData|verificationData} object, and the second argument, `next`, is a callback. `next` must be called to continue.\n * @param {string} [options.email] The email used for verification. (maximum length 255)\n * @param {string} [options.mobilePhoneNumber] The mobile phone number used for verification. Only numbers; remove dashes, parenthesis and other characters. (maximum length 25)\n * @param {object} [options.billingAddress] An {@link ThreeDSecure~billingAddress|billingAddress} object for verification.\n * @param {object} [options.additionalInformation] An {@link ThreeDSecure~additionalInformation|additionalInformation} object for verification.\n * @param {object} [options.collectDeviceData] If set to `true`, device data such as browser screen dimensions, language and time zone is submitted with lookup data.\n * @param {object} [options.customer] **Deprecated** Customer information for use in 3DS 1.0 verifications. Can contain any subset of a {@link ThreeDSecure~verifyCardCustomerObject|verifyCardCustomerObject}. Only to be used for 3DS 1.0 integrations.\n * @param {callback} options.addFrame **Deprecated** This {@link ThreeDSecure~addFrameCallback|addFrameCallback} will be called when the bank frame needs to be added to your page. Only to be used for 3DS 1.0 integrations.\n * @param {callback} options.removeFrame **Deprecated** For use in 3DS 1.0 Flows. This {@link ThreeDSecure~removeFrameCallback|removeFrameCallback} will be called when the bank frame needs to be removed from your page. Only to be used in 3DS 1.0 integrations.\n * @param {callback} [callback] The second argument, <code>data</code>, is a {@link ThreeDSecure~verifyPayload|verifyPayload}. If no callback is provided, it will return a promise that resolves {@link ThreeDSecure~verifyPayload|verifyPayload}.\n\n * @returns {(Promise|void)} Returns a promise if no callback is provided.\n * @example\n * <caption>Verifying a payment method nonce with 3DS 2.0</caption>\n * var my3DSContainer;\n *\n * // set up listener after initialization\n * threeDSecure.on(('lookup-complete', function (data, next) {\n *   // use `data` here, then call `next()`\n *   next();\n * });\n *\n * // call verifyCard after tokenizing a card\n * threeDSecure.verifyCard({\n *   amount: '123.45',\n *   nonce: hostedFieldsTokenizationPayload.nonce,\n *   bin: hostedFieldsTokenizationPayload.details.bin,\n *   email: 'test@example.com'\n *   billingAddress: {\n *     givenName: 'Jill',\n *     surname: 'Doe',\n *     phoneNumber: '8101234567',\n *     streetAddress: '555 Smith St.',\n *     extendedAddress: '#5',\n *     locality: 'Oakland',\n *     region: 'CA',\n *     postalCode: '12345',\n *     countryCodeAlpha2: 'US'\n *   },\n *   additionalInformation: {\n *     workPhoneNumber: '5555555555',\n *     shippingGivenName: 'Jill',\n *     shippingSurname: 'Doe',\n *     shippingAddress: {\n *       streetAddress: '555 Smith st',\n *       extendedAddress: '#5',\n *       locality: 'Oakland',\n *       region: 'CA',\n *       postalCode: '12345',\n *       countryCodeAlpha2: 'US'\n *     }\n *     shippingPhone: '8101234567'\n *   }\n * }, function (err, payload) {\n *   if (err) {\n *     console.error(err);\n *     return;\n *   }\n *\n *   if (payload.liabilityShifted) {\n *     // Liability has shifted\n *     submitNonceToServer(payload.nonce);\n *   } else if (payload.liabilityShiftPossible) {\n *     // Liability may still be shifted\n *     // Decide if you want to submit the nonce\n *   } else {\n *     // Liability has not shifted and will not shift\n *     // Decide if you want to submit the nonce\n *   }\n * });\n * @example\n * <caption>Verifying a payment method nonce with 3DS 2.0 with onLookupComplete callback</caption>\n * var my3DSContainer;\n *\n * threeDSecure.verifyCard({\n *   amount: '123.45',\n *   nonce: hostedFieldsTokenizationPayload.nonce,\n *   bin: hostedFieldsTokenizationPayload.details.bin,\n *   email: 'test@example.com'\n *   billingAddress: {\n *     givenName: 'Jill',\n *     surname: 'Doe',\n *     phoneNumber: '8101234567',\n *     streetAddress: '555 Smith St.',\n *     extendedAddress: '#5',\n *     locality: 'Oakland',\n *     region: 'CA',\n *     postalCode: '12345',\n *     countryCodeAlpha2: 'US'\n *   },\n *   additionalInformation: {\n *     workPhoneNumber: '5555555555',\n *     shippingGivenName: 'Jill',\n *     shippingSurname: 'Doe',\n *     shippingAddress: {\n *       streetAddress: '555 Smith st',\n *       extendedAddress: '#5',\n *       locality: 'Oakland',\n *       region: 'CA',\n *       postalCode: '12345',\n *       countryCodeAlpha2: 'US'\n *     }\n *     shippingPhone: '8101234567'\n *   },\n *   onLookupComplete: function (data, next) {\n *     // use `data` here, then call `next()`\n *     next();\n *   }\n * }, function (err, payload) {\n *   if (err) {\n *     console.error(err);\n *     return;\n *   }\n *\n *   if (payload.liabilityShifted) {\n *     // Liability has shifted\n *     submitNonceToServer(payload.nonce);\n *   } else if (payload.liabilityShiftPossible) {\n *     // Liability may still be shifted\n *     // Decide if you want to submit the nonce\n *   } else {\n *     // Liability has not shifted and will not shift\n *     // Decide if you want to submit the nonce\n *   }\n * });\n * @example\n * <caption>Handling 3DS lookup errors</caption>\n * var my3DSContainer;\n *\n * // set up listener after initialization\n * threeDSecure.on(('lookup-complete', function (data, next) {\n *   // use `data` here, then call `next()`\n *   next();\n * });\n *\n * // call verifyCard after tokenizing a card\n * threeDSecure.verifyCard({\n *   amount: '123.45',\n *   nonce: hostedFieldsTokenizationPayload.nonce,\n *   bin: hostedFieldsTokenizationPayload.details.bin,\n *   email: 'test@example.com',\n *   billingAddress: billingAddressFromCustomer,\n *   additionalInformation: additionalInfoFromCustomer\n * }, function (err, payload) {\n *   if (err) {\n *     if (err.code.indexOf('THREEDS_LOOKUP') === 0) {\n *       // an error occurred during the initial lookup request\n *\n *       if (err.code === 'THREEDS_LOOKUP_TOKENIZED_CARD_NOT_FOUND_ERROR') {\n *         // either the passed payment method nonce does not exist\n *         // or it was already consumed before the lookup call was made\n *       } else if (err.code.indexOf('THREEDS_LOOKUP_VALIDATION') === 0) {\n *         // a validation error occurred\n *         // likely some non-ascii characters were included in the billing\n *         // address given name or surname fields, or the cardholdername field\n *\n *         // Instruct your user to check their data and try again\n *       } else {\n *         // an unknown lookup error occurred\n *       }\n *     } else {\n *       // some other kind of error\n *     }\n *     return;\n *   }\n *\n *   // handle success\n * });\n */\nThreeDSecure.prototype.verifyCard = function (options) {\n  var privateOptions;\n\n  if (this.hasListener(\"lookup-complete\")) {\n    privateOptions = {\n      ignoreOnLookupCompleteRequirement: true,\n    };\n  }\n\n  return this._framework.verifyCard(options, privateOptions);\n};\n\n/**\n * Launch the iframe challenge using a 3D Secure lookup response from a server side lookup.\n *\n * @public\n * @param {(object|string)} lookupResponse The lookup response from the server side call to lookup the 3D Secure information. The raw string or a parsed object can be passed.\n * @returns {Promise} Returns a promise.\n * @example\n * var my3DSContainer;\n *\n * threeDSecure.initializeChallengeWithLookupResponse(lookupResponseFromServer).then(function (payload) {\n *   if (payload.liabilityShifted) {\n *     // Liability has shifted\n *     submitNonceToServer(payload.nonce);\n *   } else if (payload.liabilityShiftPossible) {\n *     // Liability may still be shifted\n *     // Decide if you want to submit the nonce\n *   } else {\n *     // Liability has not shifted and will not shift\n *     // Decide if you want to submit the nonce\n *   }\n * });\n */\nThreeDSecure.prototype.initializeChallengeWithLookupResponse = function (\n  lookupResponse\n) {\n  if (typeof lookupResponse === \"string\") {\n    lookupResponse = JSON.parse(lookupResponse);\n  }\n\n  return this._framework.initializeChallengeWithLookupResponse(lookupResponse);\n};\n\n/**\n * Gather the data needed for a 3D Secure lookup call.\n *\n * @public\n * @param {object} options Options for 3D Secure lookup.\n * @param {string} options.nonce The nonce representing the card from a tokenization payload. For example, this can be a {@link HostedFields~tokenizePayload|tokenizePayload} returned by Hosted Fields under `payload.nonce`.\n * @param {string} options.bin The numeric Bank Identification Number (bin) of the card from a tokenization payload. For example, this can be a {@link HostedFields~tokenizePayload|tokenizePayload} returned by Hosted Fields under `payload.details.bin`.\n * @param {callback} [callback] The second argument, <code>data</code>, is a {@link ThreeDSecure~prepareLookupPayload|prepareLookupPayload}. If no callback is provided, it will return a promise that resolves {@link ThreeDSecure~prepareLookupPayload|prepareLookupPayload}.\n\n * @returns {(Promise|void)} Returns a promise if no callback is provided.\n * @example\n * <caption>Preparing data for a 3D Secure lookup</caption>\n * threeDSecure.prepareLookup({\n *   nonce: hostedFieldsTokenizationPayload.nonce,\n *   bin: hostedFieldsTokenizationPayload.details.bin\n * }, function (err, payload) {\n *   if (err) {\n *     console.error(err);\n *     return;\n *   }\n *\n *   // send payload to server to do server side lookup\n * });\n */\nThreeDSecure.prototype.prepareLookup = function (options) {\n  return this._framework.prepareLookup(options).then(function (data) {\n    return JSON.stringify(data);\n  });\n};\n\n/**\n * Cancel the 3DS flow and return the verification payload if available. If using 3D Secure version 2, this will not close the UI of the authentication modal. It is recommended that this method only be used in the {@link ThreeDSecure#event:lookup-complete|`lookup-complete`} event or the `onLookupComplete` callback.\n * @public\n * @param {callback} [callback] The second argument is a {@link ThreeDSecure~verifyPayload|verifyPayload}. If there is no verifyPayload (the initial lookup did not complete), an error will be returned. If no callback is passed, `cancelVerifyCard` will return a promise.\n * @returns {(Promise|void)} Returns a promise if no callback is provided.\n * @example <caption>Cancel the verification in `lookup-complete` event</caption>\n * // set up listener after instantiation\n * threeDSecure.on('lookup-complete', function (data, next) {\n *   // determine if you want to call next to start the challenge,\n *   // if not, call cancelVerifyCard\n *   threeDSecure.cancelVerifyCard(function (err, verifyPayload) {\n *     if (err) {\n *       // Handle error\n *       console.log(err.message); // No verification payload available\n *       return;\n *     }\n *\n *     verifyPayload.nonce; // The nonce returned from the 3ds lookup call\n *     verifyPayload.liabilityShifted; // boolean\n *     verifyPayload.liabilityShiftPossible; // boolean\n *   });\n * });\n *\n * // after tokenizing a credit card\n * threeDSecure.verifyCard({\n *   amount: '100.00',\n *   nonce: nonceFromTokenizationPayload,\n *   bin: binFromTokenizationPayload\n *   // other fields such as billing address\n * }, function (verifyError, payload) {\n *   if (verifyError) {\n *     if (verifyError.code === 'THREEDS_VERIFY_CARD_CANCELED_BY_MERCHANT ') {\n *       // flow was canceled by merchant, 3ds info can be found in the payload\n *       // for cancelVerifyCard\n *     }\n *   }\n * });\n * @example <caption>Cancel the verification in onLookupComplete callback</caption>\n * threeDSecure.verifyCard({\n *   amount: '100.00',\n *   nonce: nonceFromTokenizationPayload,\n *   bin: binFromTokenizationPayload,\n *   // other fields such as billing address\n *   onLookupComplete: function (data, next) {\n *     // determine if you want to call next to start the challenge,\n *     // if not, call cancelVerifyCard\n *     threeDSecure.cancelVerifyCard(function (err, verifyPayload) {\n *       if (err) {\n *         // Handle error\n *         console.log(err.message); // No verification payload available\n *         return;\n *       }\n *\n *       verifyPayload.nonce; // The nonce returned from the 3ds lookup call\n *       verifyPayload.liabilityShifted; // boolean\n *       verifyPayload.liabilityShiftPossible; // boolean\n *     });\n *   }\n * }, function (verifyError, payload) {\n *   if (verifyError) {\n *     if (verifyError.code === 'THREEDS_VERIFY_CARD_CANCELED_BY_MERCHANT ') {\n *       // flow was canceled by merchant, 3ds info can be found in the payload\n *       // for cancelVerifyCard\n *     }\n *   }\n * });\n * @example <caption>Cancel the verification in 3D Secure version 1</caption>\n * // unlike with v2, this will not cause `verifyCard` to error, it will simply\n * // never call the callback\n * threeDSecure.cancelVerifyCard(function (err, verifyPayload) {\n *   if (err) {\n *     // Handle error\n *     console.log(err.message); // No verification payload available\n *     return;\n *   }\n *\n *   verifyPayload.nonce; // The nonce returned from the 3ds lookup call\n *   verifyPayload.liabilityShifted; // boolean\n *   verifyPayload.liabilityShiftPossible; // boolean\n * });\n */\nThreeDSecure.prototype.cancelVerifyCard = function () {\n  return this._framework.cancelVerifyCard();\n};\n\n/**\n * Cleanly remove anything set up by {@link module:braintree-web/three-d-secure.create|create}, with the exception that the Cardinal SDK, on window.Cardinal, will remain.\n * @public\n * @param {callback} [callback] Called on completion. If no callback is passed, `teardown` will return a promise.\n * @example\n * threeDSecure.teardown();\n * @example <caption>With callback</caption>\n * threeDSecure.teardown(function () {\n *   // teardown is complete\n * });\n * @returns {(Promise|void)} Returns a promise if no callback is provided.\n */\nThreeDSecure.prototype.teardown = function () {\n  var methodNames = methods(ThreeDSecure.prototype).concat(\n    methods(EventEmitter.prototype)\n  );\n\n  convertMethodsToError(this, methodNames);\n\n  return this._framework.teardown();\n};\n\nmodule.exports = wrapPromise.wrapPrototype(ThreeDSecure);\n\n},{\"../../lib/convert-methods-to-error\":150,\"../../lib/methods\":180,\"./frameworks\":224,\"@braintree/event-emitter\":33,\"@braintree/wrap-promise\":43}],228:[function(_dereq_,module,exports){\n\"use strict\";\n/** @module braintree-web/three-d-secure */\n\nvar ThreeDSecure = _dereq_(\"./external/three-d-secure\");\nvar isHTTPS = _dereq_(\"../lib/is-https\").isHTTPS;\nvar basicComponentVerification = _dereq_(\"../lib/basic-component-verification\");\nvar createDeferredClient = _dereq_(\"../lib/create-deferred-client\");\nvar createAssetsUrl = _dereq_(\"../lib/create-assets-url\");\nvar BraintreeError = _dereq_(\"../lib/braintree-error\");\nvar analytics = _dereq_(\"../lib/analytics\");\nvar errors = _dereq_(\"./shared/errors\");\nvar VERSION = \"3.134.0\";\nvar wrapPromise = _dereq_(\"@braintree/wrap-promise\");\n\n/**\n * @static\n * @function create\n * @param {object} options Creation options:\n * @param {object} [options.cardinalSDKConfig] A config for the underlying Cardinal SDK.\n * @param {object} [options.cardinalSDKConfig.logging] The logging configuration for the Cardinal SDK. See [Cardinal's documentation for the logging object](https://cardinaldocs.atlassian.net/wiki/spaces/CC/pages/1409568/Configurations#Configurations-Logging) for more information.\n * @param {number} [options.cardinalSDKConfig.timeout] The time in milliseconds to wait before a request to Cardinal's API times out. See [Cardinal's documentation for root level configuration](https://cardinaldocs.atlassian.net/wiki/spaces/CC/pages/1409568/Configurations#Configurations-RootLevelConfiguration) for more information.\n * @param {number} [options.cardinalSDKConfig.maxRequestRetries] How many times a request should be re-attempted to Cardinal's API before giving up as a failure. See [Cardinal's documentation for root level configuration](https://cardinaldocs.atlassian.net/wiki/spaces/CC/pages/1409568/Configurations#Configurations-RootLevelConfiguration) for more information.\n * @param {object} [options.cardinalSDKConfig.payment] An object to describe how you want the user interactions to behave. Only a subset of the [Cardinal SDK payment configuration object](https://cardinaldocs.atlassian.net/wiki/spaces/CC/pages/1409568/Configurations#Configurations-Payment) are supported: `displayLoading` and `displayExitButton`.\n * @param {Client} [options.client] A {@link Client} instance.\n * @param {string} [options.authorization] A tokenizationKey or clientToken. Can be used in place of `options.client`.\n * @param {(number|string)} [options.version=1] The version of 3D Secure to use. Possible options:\n * * 2 - A 3D Secure v2.0 integration that uses a modal to host the 3D Secure iframe.\n * * 2-bootstrap3-modal - A 3D Secure v2.0 integration that uses a modal styled with Bootstrap 3 styles to host the 3D Secure iframe. Requires having the Bootstrap 3 script files and stylesheets on your page.\n * * 2-inline-iframe - A 3D Secure v2.0 integration that provides the authentication iframe directly to the merchant.\n * @param {callback} [callback] The second argument, `data`, is the {@link ThreeDSecure} instance. If no callback is provided, it returns a promise that resolves the {@link ThreeDSecure} instance.\n * @returns {(Promise|void)} Returns a promise if no callback is provided.\n@example\n * <caption>Creating a v2 3D Secure component using 2 version (Cardinal modal)</caption>\n * braintree.threeDSecure.create({\n *   client: clientInstance,\n *   version: '2'\n * }, function (createError, threeDSecure) {\n *   // set up lookup-complete listener\n *   threeDSecure.on('lookup-complete', function (data, next) {\n *     // check lookup data\n *\n *     next();\n *   });\n *\n *   // using Hosted Fields, use `tokenize` to get back a credit card nonce\n *\n *   threeDSecure.verifyCard({\n *     nonce: nonceFromTokenizationPayload,,\n *     bin: binFromTokenizationPayload,\n *     amount: '100.00'\n *   }, function (verifyError, payload) {\n *     // inspect payload\n *     // send payload.nonce to your server\n *   });\n * });\n * @example\n * <caption>Creating a v2 3D Secure component using 2-bootstrap3-modal version</caption>\n * // must have the boostrap js, css and jquery files on your page\n * braintree.threeDSecure.create({\n *   client: clientInstance,\n *   version: '2-bootstrap3-modal'\n * }, function (createError, threeDSecure) {\n *   // set up lookup-complete listener\n *   threeDSecure.on('lookup-complete', function (data, next) {\n *     // check lookup data\n *\n *     next();\n *   });\n *\n *   // using Hosted Fields, use `tokenize` to get back a credit card nonce\n *\n *   // challenge will be presented in a bootstrap 3 modal\n *   threeDSecure.verifyCard({\n *     nonce: nonceFromTokenizationPayload,\n *     bin: binFromTokenizationPayload,\n *     amount: '100.00'\n *   }, function (verifyError, payload) {\n *     // inspect payload\n *     // send payload.nonce to your server\n *   });\n * });\n * @example\n * <caption>Creating a v2 3D Secure component using 2-inline-iframe version</caption>\n * braintree.threeDSecure.create({\n *   client: clientInstance,\n *   version: '2-inline-iframe'\n * }, function (createError, threeDSecure) {\n *   // set up lookup-complete listener\n *   threeDSecure.on('lookup-complete', function (data, next) {\n *     // check lookup data\n *\n *     next();\n *   });\n *   // set up iframe listener\n *   threeDSecure.on('authentication-iframe-available', function (event, next) {\n *     var element = event.element; // an html element that contains the iframe\n *\n *     document.body.appendChild(element); // put it on your page\n *\n *     next(); // let the sdk know the element has been added to the page\n *   });\n *\n *   // using Hosted Fields, use `tokenize` to get back a credit card nonce\n *\n *   threeDSecure.verifyCard({\n *     nonce: nonceFromTokenizationPayload,,\n *     bin: binFromTokenizationPayload,\n *     amount: '100.00'\n *   }, function (verifyError, payload) {\n *     // inspect payload\n *     // send payload.nonce to your server\n *   });\n * });\n */\nfunction create(options) {\n  var name = \"3D Secure\";\n  var framework = getFramework(options);\n\n  return basicComponentVerification\n    .verify({\n      name: name,\n      client: options.client,\n      authorization: options.authorization,\n    })\n    .then(function () {\n      var assetsUrl = createAssetsUrl.create(options.authorization);\n      var createPromise = createDeferredClient\n        .create({\n          authorization: options.authorization,\n          client: options.client,\n          debug: options.debug,\n          assetsUrl: assetsUrl,\n          name: name,\n        })\n        .then(function (client) {\n          var error, isProduction;\n          var config = client.getConfiguration();\n          var gwConfig = config.gatewayConfiguration;\n\n          options.client = client;\n\n          if (!gwConfig.threeDSecureEnabled) {\n            error = errors.THREEDS_NOT_ENABLED;\n          }\n\n          if (config.authorizationType === \"TOKENIZATION_KEY\") {\n            error = errors.THREEDS_CAN_NOT_USE_TOKENIZATION_KEY;\n          }\n\n          isProduction = gwConfig.environment === \"production\";\n\n          if (isProduction && !isHTTPS()) {\n            error = errors.THREEDS_HTTPS_REQUIRED;\n          }\n\n          if (\n            !(\n              gwConfig.threeDSecure &&\n              gwConfig.threeDSecure.cardinalAuthenticationJWT\n            )\n          ) {\n            analytics.sendEvent(\n              options.client,\n              \"three-d-secure.initialization.failed.missing-cardinalAuthenticationJWT\"\n            );\n            error = errors.THREEDS_NOT_ENABLED_FOR_V2;\n          }\n\n          if (error) {\n            return Promise.reject(new BraintreeError(error));\n          }\n\n          analytics.sendEvent(options.client, \"three-d-secure.initialized\");\n\n          return client;\n        });\n      var instance = new ThreeDSecure({\n        client: options.client,\n        assetsUrl: assetsUrl,\n        createPromise: createPromise,\n        loggingEnabled: options.loggingEnabled,\n        cardinalSDKConfig: options.cardinalSDKConfig,\n        framework: framework,\n      });\n\n      if (options.client) {\n        return createPromise.then(function () {\n          return instance;\n        });\n      }\n\n      return instance;\n    });\n}\n\nfunction getFramework(options) {\n  var version = String(options.version || \"\");\n\n  if (!version || version === \"1\") {\n    throw new BraintreeError({\n      code: errors.THREEDS_UNSUPPORTED_VERSION.code,\n      type: errors.THREEDS_UNSUPPORTED_VERSION.type,\n      message: errors.THREEDS_UNSUPPORTED_VERSION.message,\n    });\n  }\n\n  switch (version) {\n    case \"2\":\n    case \"2-cardinal-modal\":\n      return \"cardinal-modal\";\n    case \"2-bootstrap3-modal\":\n      return \"bootstrap3-modal\";\n    case \"2-inline-iframe\":\n      return \"inline-iframe\";\n    default:\n      throw new BraintreeError({\n        code: errors.THREEDS_UNRECOGNIZED_VERSION.code,\n        type: errors.THREEDS_UNRECOGNIZED_VERSION.type,\n        message:\n          \"Version `\" +\n          options.version +\n          \"` is not a recognized version. You may need to update the version of your Braintree SDK to support this version.\",\n      });\n  }\n}\n\nmodule.exports = {\n  create: wrapPromise(create),\n  /**\n   * @description The current version of the SDK, i.e. `{@pkg version}`.\n   * @type {string}\n   */\n  VERSION: VERSION,\n};\n\n},{\"../lib/analytics\":143,\"../lib/basic-component-verification\":146,\"../lib/braintree-error\":148,\"../lib/create-assets-url\":152,\"../lib/create-deferred-client\":154,\"../lib/is-https\":177,\"./external/three-d-secure\":227,\"./shared/errors\":230,\"@braintree/wrap-promise\":43}],229:[function(_dereq_,module,exports){\n\"use strict\";\n\nmodule.exports = {\n  LANDING_FRAME_NAME: \"braintreethreedsecurelanding\",\n};\n\n},{}],230:[function(_dereq_,module,exports){\n\"use strict\";\n\n/**\n * @name BraintreeError.3D Secure - Creation Error Codes\n * @description Errors that occur when [creating the 3D Secure component](./module-braintree-web_three-d-secure.html#.create).\n * @property {MERCHANT} THREEDS_NOT_ENABLED Occurs when 3D Secure is not enabled in the Braintree control panel.\n * @property {MERCHANT} THREEDS_CAN_NOT_USE_TOKENIZATION_KEY Occurs when 3D Secure component is created without a Client Token.\n * @property {MERCHANT} THREEDS_HTTPS_REQUIRED Occurs when 3D Secure component is created in production over HTTPS.\n * @property {MERCHANT} THREEDS_NOT_ENABLED_FOR_V2 Occurs when 3D Secure component is created with version 2 parameter, but merchant is not enabled to use version 2.\n * @property {MERCHANT} THREEDS_UNRECOGNIZED_VERSION Occurs when unrecognized version enum is passed into the create call.\n * @property {UNKNOWN} THREEDS_CARDINAL_SDK_SETUP_FAILED Occurs when Cardinal's Songbird.js library fails to setup for an unknown reason.\n * @property {NETWORK} THREEDS_CARDINAL_SDK_SCRIPT_LOAD_FAILED Occurs when using version 2 and Cardinal's Songbird.js script could not be loaded.\n * @property {UNKNOWN} THREEDS_CARDINAL_SDK_SETUP_TIMEDOUT Occurs when Cardinal's Songbird.js library takes longer than 60 seconds to set up.\n * @property {UNKNOWN} THREEDS_CARDINAL_SDK_RESPONSE_TIMEDOUT Occurs when Cardinal sends a response indicating a timeout on /Validate, /Confirm, or /Continue.\n * @property {MERCHANT} THREEDS_CARDINAL_SDK_BAD_CONFIG Occurs when there is no JWT in the request. Also when there's some other malformed aspect of config.\n * @property {MERCHANT} THREEDS_CARDINAL_SDK_BAD_JWT Occurs when a malformed config causes a either a missing response JWT or a malformed Cardinal response.\n * @property {UNKNOWN} THREEDS_CARDINAL_SDK_ERROR Occurs when a \"general error\" or a Cardinal hosted fields error happens. Description contains more details.\n * @property {CUSTOMER} THREEDS_CARDINAL_SDK_CANCELED Occurs when customer cancels the transaction mid-flow, usually with alt-pays that have their own cancel buttons.\n * @property {MERCHANT} THREEDS_UNSUPPORTED_VERSION Occurs when 3D Secure component is created with version 1 (or default version) parameter.\n */\n\n/**\n * @name BraintreeError.3D Secure - verifyCard Error Codes\n * @description Errors that occur when using the [`verifyCard` method](./ThreeDSecure.html#verifyCard).\n * @property {MERCHANT} THREEDS_AUTHENTICATION_IN_PROGRESS Occurs when another verification is already in progress.\n * @property {MERCHANT} THREEDS_MISSING_VERIFY_CARD_OPTION Occurs when a required option is missing.\n * @property {UNKNOWN} THREEDS_JWT_AUTHENTICATION_FAILED Occurs when something went wrong authenticating the JWT from the Cardinal SDK.\n * @property {MERCHANT} THREEDS_LOOKUP_TOKENIZED_CARD_NOT_FOUND_ERROR Occurs when the supplied payment method nonce does not exist or the payment method nonce has already been consumed.\n * @property {CUSTOMER} THREEDS_LOOKUP_VALIDATION_ERROR Occurs when a validation error occurs during the 3D Secure lookup.\n * @property {UNKNOWN} THREEDS_LOOKUP_ERROR An unknown error occurred while attempting the 3D Secure lookup.\n * @property {MERCHANT} THREEDS_VERIFY_CARD_CANCELED_BY_MERCHANT Occurs when the 3D Secure flow is canceled by the merchant using `cancelVerifyCard` (3D Secure v2 flows only).\n * @property {UNKNOWN} THREEDS_INLINE_IFRAME_DETAILS_INCORRECT An unknown error occurred while attempting to use the inline iframe framework.\n * @property {MERCHANT} THREEDS_REQUESTED_EXEMPTION_TYPE_INVALID Occurs when unrecognized exemption enum value is passed into verifyCard.\n */\n\n/**\n * @name BraintreeError.3D Secure - cancelVerifyCard Error Codes\n * @description Errors that occur when using the [`cancelVerifyCard` method](./ThreeDSecure.html#cancelVerifyCard).\n * @property {MERCHANT} THREEDS_NO_VERIFICATION_PAYLOAD Occurs when the 3D Secure flow is canceled, but there is no 3D Secure information available.\n */\n\n/**\n * @name BraintreeError.3D Secure - Internal Error Codes\n * @ignore\n * @description Errors that occur internally\n * @property {INTERNAL} THREEDS_TERM_URL_REQUIRES_BRAINTREE_DOMAIN Occurs when iframe is initialized on a non-verified domain.\n * @property {INTERNAL} THREEDS_FRAMEWORK_METHOD_NOT_IMPLEMENTED Occurs when a 3D Secure framework method is not implemented.\n */\n\nvar BraintreeError = _dereq_(\"../../lib/braintree-error\");\n\nmodule.exports = {\n  THREEDS_NOT_ENABLED: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"THREEDS_NOT_ENABLED\",\n    message: \"3D Secure is not enabled for this merchant.\",\n  },\n  THREEDS_CAN_NOT_USE_TOKENIZATION_KEY: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"THREEDS_CAN_NOT_USE_TOKENIZATION_KEY\",\n    message: \"3D Secure can not use a tokenization key for authorization.\",\n  },\n  THREEDS_HTTPS_REQUIRED: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"THREEDS_HTTPS_REQUIRED\",\n    message: \"3D Secure requires HTTPS.\",\n  },\n  THREEDS_NOT_ENABLED_FOR_V2: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"THREEDS_NOT_ENABLED_FOR_V2\",\n    message:\n      \"3D Secure version 2 is not enabled for this merchant. Contact Braintree Support for assistance at https://help.braintreepayments.com/\",\n  },\n  THREEDS_UNRECOGNIZED_VERSION: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"THREEDS_UNRECOGNIZED_VERSION\",\n  },\n  THREEDS_CARDINAL_SDK_SETUP_FAILED: {\n    type: BraintreeError.types.UNKNOWN,\n    code: \"THREEDS_CARDINAL_SDK_SETUP_FAILED\",\n    message: \"Something went wrong setting up Cardinal's Songbird.js library.\",\n  },\n  THREEDS_CARDINAL_SDK_SCRIPT_LOAD_FAILED: {\n    type: BraintreeError.types.NETWORK,\n    code: \"THREEDS_CARDINAL_SDK_SCRIPT_LOAD_FAILED\",\n    message: \"Cardinal's Songbird.js library could not be loaded.\",\n  },\n  THREEDS_CARDINAL_SDK_SETUP_TIMEDOUT: {\n    type: BraintreeError.types.UNKNOWN,\n    code: \"THREEDS_CARDINAL_SDK_SETUP_TIMEDOUT\",\n    message: \"Cardinal's Songbird.js took too long to setup.\",\n  },\n  THREEDS_CARDINAL_SDK_RESPONSE_TIMEDOUT: {\n    type: BraintreeError.types.UNKNOWN,\n    code: \"THREEDS_CARDINAL_SDK_RESPONSE_TIMEDOUT\",\n    message: \"Cardinal's API took too long to respond.\",\n  },\n  THREEDS_CARDINAL_SDK_BAD_CONFIG: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"THREEDS_CARDINAL_SDK_BAD_CONFIG\",\n    message:\n      \"JWT or other required field missing. Please check your setup configuration.\",\n  },\n  THREEDS_CARDINAL_SDK_BAD_JWT: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"THREEDS_CARDINAL_SDK_BAD_JWT\",\n    message:\n      \"Cardinal JWT missing or malformed. Please check your setup configuration.\",\n  },\n  THREEDS_CARDINAL_SDK_ERROR: {\n    type: BraintreeError.types.UNKNOWN,\n    code: \"THREEDS_CARDINAL_SDK_ERROR\",\n    message:\n      \"A general error has occurred with Cardinal. See description for more information.\",\n  },\n  THREEDS_CARDINAL_SDK_CANCELED: {\n    type: BraintreeError.types.CUSTOMER,\n    code: \"THREEDS_CARDINAL_SDK_CANCELED\",\n    message: \"Canceled by user.\",\n  },\n  THREEDS_VERIFY_CARD_CANCELED_BY_MERCHANT: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"THREEDS_VERIFY_CARD_CANCELED_BY_MERCHANT\",\n    message: \"3D Secure verfication canceled by merchant.\",\n  },\n  THREEDS_AUTHENTICATION_IN_PROGRESS: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"THREEDS_AUTHENTICATION_IN_PROGRESS\",\n    message:\n      \"Cannot call verifyCard while existing authentication is in progress.\",\n  },\n  THREEDS_MISSING_VERIFY_CARD_OPTION: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"THREEDS_MISSING_VERIFY_CARD_OPTION\",\n  },\n  THREEDS_JWT_AUTHENTICATION_FAILED: {\n    type: BraintreeError.types.UNKNOWN,\n    code: \"THREEDS_JWT_AUTHENTICATION_FAILED\",\n    message: \"Something went wrong authenticating the JWT from Cardinal\",\n  },\n  THREEDS_LOOKUP_TOKENIZED_CARD_NOT_FOUND_ERROR: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"THREEDS_LOOKUP_TOKENIZED_CARD_NOT_FOUND_ERROR\",\n    message:\n      \"Either the payment method nonce passed to `verifyCard` does not exist, or it was already consumed\",\n  },\n  THREEDS_LOOKUP_VALIDATION_ERROR: {\n    type: BraintreeError.types.CUSTOMER,\n    code: \"THREEDS_LOOKUP_VALIDATION_ERROR\",\n    message:\n      \"The data passed in `verifyCard` did not pass validation checks. See details for more info\",\n  },\n  THREEDS_LOOKUP_ERROR: {\n    type: BraintreeError.types.UNKNOWN,\n    code: \"THREEDS_LOOKUP_ERROR\",\n    message: \"Something went wrong during the 3D Secure lookup\",\n  },\n  THREEDS_INLINE_IFRAME_DETAILS_INCORRECT: {\n    type: BraintreeError.types.UNKNOWN,\n    code: \"THREEDS_INLINE_IFRAME_DETAILS_INCORRECT\",\n    message:\n      \"Something went wrong when attempting to add the authentication iframe to the page.\",\n  },\n  THREEDS_NO_VERIFICATION_PAYLOAD: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"THREEDS_NO_VERIFICATION_PAYLOAD\",\n    message: \"No verification payload available.\",\n  },\n  THREEDS_TERM_URL_REQUIRES_BRAINTREE_DOMAIN: {\n    type: BraintreeError.types.INTERNAL,\n    code: \"THREEDS_TERM_URL_REQUIRES_BRAINTREE_DOMAIN\",\n    message: \"Term Url must be on a Braintree domain.\",\n  },\n  THREEDS_FRAMEWORK_METHOD_NOT_IMPLEMENTED: {\n    type: BraintreeError.types.INTERNAL,\n    code: \"THREEDS_FRAMEWORK_METHOD_NOT_IMPLEMENTED\",\n    message: \"Method not implemented for this framework.\",\n  },\n  THREEDS_REQUESTED_EXEMPTION_TYPE_INVALID: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"THREEDS_REQUESTED_EXEMPTION_TYPE_INVALID\",\n    message: \"Requested Exemption Type is invalid.\",\n  },\n  THREEDS_UNSUPPORTED_VERSION: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"THREEDS_UNSUPPORTED_VERSION\",\n    message:\n      \"3D Secure `1` is deprecated and no longer supported. See available versions at https://braintree.github.io/braintree-web/current/module-braintree-web_three-d-secure.html#.create\",\n  },\n};\n\n},{\"../../lib/braintree-error\":148}],231:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar enumerate = _dereq_(\"../../lib/enumerate\");\n\nmodule.exports = enumerate([\"AUTHENTICATION_COMPLETE\"], \"threedsecure:\");\n\n},{\"../../lib/enumerate\":157}],232:[function(_dereq_,module,exports){\n\"use strict\";\n/**\n * @module braintree-web/unionpay\n * @description This module allows you to accept UnionPay payments. *It is currently in beta and is subject to change.*\n */\n\nvar UnionPay = _dereq_(\"./shared/unionpay\");\nvar basicComponentVerification = _dereq_(\"../lib/basic-component-verification\");\nvar BraintreeError = _dereq_(\"../lib/braintree-error\");\nvar createDeferredClient = _dereq_(\"../lib/create-deferred-client\");\nvar createAssetsUrl = _dereq_(\"../lib/create-assets-url\");\nvar analytics = _dereq_(\"../lib/analytics\");\nvar errors = _dereq_(\"./shared/errors\");\nvar VERSION = \"3.134.0\";\nvar wrapPromise = _dereq_(\"@braintree/wrap-promise\");\n\n/**\n * @static\n * @function create\n * @param {object} options Creation options:\n * @param {Client} [options.client] A {@link Client} instance.\n * @param {string} [options.authorization] A tokenizationKey or clientToken. Can be used in place of `options.client`.\n * @param {callback} [callback] The second argument, `data`, is the {@link UnionPay} instance. If no callback is provided, `create` returns a promise that resolves with the {@link UnionPay} instance.\n * @returns {(Promise|void)} Returns a promise if no callback is provided.\n * @example\n * braintree.unionpay.create({ client: clientInstance }, function (createErr, unionpayInstance) {\n *   if (createErr) {\n *     console.error(createErr);\n *     return;\n *   }\n *   // ...\n * });\n */\nfunction create(options) {\n  var name = \"UnionPay\";\n\n  return basicComponentVerification\n    .verify({\n      name: name,\n      client: options.client,\n      authorization: options.authorization,\n    })\n    .then(function () {\n      return createDeferredClient.create({\n        authorization: options.authorization,\n        client: options.client,\n        debug: options.debug,\n        assetsUrl: createAssetsUrl.create(options.authorization),\n        name: name,\n      });\n    })\n    .then(function (client) {\n      var config = client.getConfiguration();\n\n      options.client = client;\n\n      if (\n        !config.gatewayConfiguration.unionPay ||\n        config.gatewayConfiguration.unionPay.enabled !== true\n      ) {\n        return Promise.reject(new BraintreeError(errors.UNIONPAY_NOT_ENABLED));\n      }\n\n      analytics.sendEvent(options.client, \"unionpay.initialized\");\n\n      return new UnionPay(options);\n    });\n}\n\nmodule.exports = {\n  create: wrapPromise(create),\n  /**\n   * @description The current version of the SDK, i.e. `{@pkg version}`.\n   * @type {string}\n   */\n  VERSION: VERSION,\n};\n\n},{\"../lib/analytics\":143,\"../lib/basic-component-verification\":146,\"../lib/braintree-error\":148,\"../lib/create-assets-url\":152,\"../lib/create-deferred-client\":154,\"./shared/errors\":234,\"./shared/unionpay\":235,\"@braintree/wrap-promise\":43}],233:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar enumerate = _dereq_(\"../../lib/enumerate\");\n\nmodule.exports = {\n  events: enumerate(\n    [\n      \"HOSTED_FIELDS_FETCH_CAPABILITIES\",\n      \"HOSTED_FIELDS_ENROLL\",\n      \"HOSTED_FIELDS_TOKENIZE\",\n    ],\n    \"union-pay:\"\n  ),\n  HOSTED_FIELDS_FRAME_NAME: \"braintreeunionpayhostedfields\",\n};\n\n},{\"../../lib/enumerate\":157}],234:[function(_dereq_,module,exports){\n\"use strict\";\n\n/**\n * @name BraintreeError.Union Pay - Creation Error Codes\n * @description Errors that occur when [creating the Union Pay component](./module-braintree-web_union-pay.html#.create).\n * @property {MERCHANT} UNIONPAY_NOT_ENABLED Occurs when Union Pay is not enabled on the Braintree control panel.\n */\n\n/**\n * @name BraintreeError.Union Pay - Shared Error Codes\n * @description Errors that occur when starting the Union Pay Flow\n * @property {MERCHANT} UNIONPAY_CARD_AND_HOSTED_FIELDS_INSTANCES Occurs when a method is used with both card details and a Hosted Fields instance.\n * @property {MERCHANT} UNIONPAY_HOSTED_FIELDS_INSTANCE_INVALID Occurs when Hosted Fields instance used is not a valid Hosted Fields instance.\n * @property {MERCHANT} UNIONPAY_CARD_OR_HOSTED_FIELDS_INSTANCE_REQUIRED Occurs when neither card details or Hosted Fields are used.\n * @property {MERCHANT} UNIONPAY_HOSTED_FIELDS_INSTANCE_REQUIRED Occurs when Hosted Fields cannot be found on the page.\n */\n\n/**\n * @name BraintreeError.Union Pay - fetchCapabilities Error Codes\n * @description Errors that occur when using the [`fetchCapabilities` method](./UnionPay.html#fetchCapabilities).\n * @property {NETWORK} UNIONPAY_FETCH_CAPABILITIES_NETWORK_ERROR Occurs when there is an error looking up the Union Pay capabilities.\n */\n\n/**\n * @name BraintreeError.Union Pay - enroll Error Codes\n * @description Errors that occur when using the [`enroll` method](./UnionPay.html#enroll).\n * @property {MERCHANT} UNIONPAY_MISSING_MOBILE_PHONE_DATA Occurs when no mobile phone data is provided.\n * @property {MERCHANT} UNIONPAY_EXPIRATION_DATE_INCOMPLETE Occurs when expiration date is incomplete.\n * @property {CUSTOMER} UNIONPAY_ENROLLMENT_CUSTOMER_INPUT_INVALID Occurs when customer enrollment input is invalid.\n * @property {NETWORK} UNIONPAY_ENROLLMENT_NETWORK_ERROR Occurs when there is an error during enrollment.\n */\n\n/**\n * @name BraintreeError.Union Pay - tokenize Error Codes\n * @description Errors that occur when using the [`tokenize` method](./UnionPay.html#tokenize).\n * @property {CUSTOMER} UNIONPAY_FAILED_TOKENIZATION Occurs when data cannot be tokenized.\n * @property {NETWORK} UNIONPAY_TOKENIZATION_NETWORK_ERROR Occurs when the Braintree gateway cannot be reached.\n */\n\nvar BraintreeError = _dereq_(\"../../lib/braintree-error\");\n\nmodule.exports = {\n  UNIONPAY_NOT_ENABLED: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"UNIONPAY_NOT_ENABLED\",\n    message: \"UnionPay is not enabled for this merchant.\",\n  },\n  UNIONPAY_HOSTED_FIELDS_INSTANCE_INVALID: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"UNIONPAY_HOSTED_FIELDS_INSTANCE_INVALID\",\n    message:\n      \"Found an invalid Hosted Fields instance. Please use a valid Hosted Fields instance.\",\n  },\n  UNIONPAY_HOSTED_FIELDS_INSTANCE_REQUIRED: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"UNIONPAY_HOSTED_FIELDS_INSTANCE_REQUIRED\",\n    message: \"Could not find the Hosted Fields instance.\",\n  },\n  UNIONPAY_CARD_OR_HOSTED_FIELDS_INSTANCE_REQUIRED: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"UNIONPAY_CARD_OR_HOSTED_FIELDS_INSTANCE_REQUIRED\",\n    message:\n      \"A card or a Hosted Fields instance is required. Please supply a card or a Hosted Fields instance.\",\n  },\n  UNIONPAY_CARD_AND_HOSTED_FIELDS_INSTANCES: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"UNIONPAY_CARD_AND_HOSTED_FIELDS_INSTANCES\",\n    message:\n      \"Please supply either a card or a Hosted Fields instance, not both.\",\n  },\n  UNIONPAY_EXPIRATION_DATE_INCOMPLETE: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"UNIONPAY_EXPIRATION_DATE_INCOMPLETE\",\n    message: \"You must supply expiration month and year or neither.\",\n  },\n  UNIONPAY_ENROLLMENT_CUSTOMER_INPUT_INVALID: {\n    type: BraintreeError.types.CUSTOMER,\n    code: \"UNIONPAY_ENROLLMENT_CUSTOMER_INPUT_INVALID\",\n    message: \"Enrollment failed due to user input error.\",\n  },\n  UNIONPAY_ENROLLMENT_NETWORK_ERROR: {\n    type: BraintreeError.types.NETWORK,\n    code: \"UNIONPAY_ENROLLMENT_NETWORK_ERROR\",\n    message: \"Could not enroll UnionPay card.\",\n  },\n  UNIONPAY_FETCH_CAPABILITIES_NETWORK_ERROR: {\n    type: BraintreeError.types.NETWORK,\n    code: \"UNIONPAY_FETCH_CAPABILITIES_NETWORK_ERROR\",\n    message: \"Could not fetch card capabilities.\",\n  },\n  UNIONPAY_TOKENIZATION_NETWORK_ERROR: {\n    type: BraintreeError.types.NETWORK,\n    code: \"UNIONPAY_TOKENIZATION_NETWORK_ERROR\",\n    message: \"A tokenization network error occurred.\",\n  },\n  UNIONPAY_MISSING_MOBILE_PHONE_DATA: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"UNIONPAY_MISSING_MOBILE_PHONE_DATA\",\n    message: \"A `mobile` with `countryCode` and `number` is required.\",\n  },\n  UNIONPAY_FAILED_TOKENIZATION: {\n    type: BraintreeError.types.CUSTOMER,\n    code: \"UNIONPAY_FAILED_TOKENIZATION\",\n    message: \"The supplied card data failed tokenization.\",\n  },\n};\n\n},{\"../../lib/braintree-error\":148}],235:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar analytics = _dereq_(\"../../lib/analytics\");\nvar BraintreeError = _dereq_(\"../../lib/braintree-error\");\nvar Bus = _dereq_(\"framebus\");\nvar constants = _dereq_(\"./constants\");\nvar isVerifiedDomain = _dereq_(\"../../lib/is-verified-domain\");\nvar useMin = _dereq_(\"../../lib/use-min\");\nvar convertMethodsToError = _dereq_(\"../../lib/convert-methods-to-error\");\nvar errors = _dereq_(\"./errors\");\nvar events = constants.events;\nvar iFramer = _dereq_(\"@braintree/iframer\");\nvar methods = _dereq_(\"../../lib/methods\");\nvar VERSION = \"3.134.0\";\nvar uuid = _dereq_(\"@braintree/uuid\");\nvar wrapPromise = _dereq_(\"@braintree/wrap-promise\");\nvar BUS_CONFIGURATION_REQUEST_EVENT =\n  _dereq_(\"../../lib/constants\").BUS_CONFIGURATION_REQUEST_EVENT;\n\n/**\n * @class\n * @param {object} options See {@link module:braintree-web/unionpay.create|unionpay.create}.\n * @description <strong>You cannot use this constructor directly. Use {@link module:braintree-web/unionpay.create|braintree-web.unionpay.create} instead.</strong>\n * @classdesc This class represents a UnionPay component. Instances of this class have methods for {@link UnionPay#fetchCapabilities fetching capabilities} of UnionPay cards, {@link UnionPay#enroll enrolling} a UnionPay card, and {@link UnionPay#tokenize tokenizing} a UnionPay card.\n */\nfunction UnionPay(options) {\n  this._options = options;\n}\n\n/**\n * @typedef {object} UnionPay~fetchCapabilitiesPayload\n * @property {boolean} isUnionPay Determines if this card is a UnionPay card.\n * @property {boolean} isDebit Determines if this card is a debit card. This property is only present if `isUnionPay` is `true`.\n * @property {object} unionPay UnionPay specific properties. This property is only present if `isUnionPay` is `true`.\n * @property {boolean} unionPay.supportsTwoStepAuthAndCapture Determines if the card allows for an authorization, but settling the transaction later.\n * @property {boolean} unionPay.isSupported Determines if Braintree can process this UnionPay card. When false, Braintree cannot process this card and the user should use a different card.\n */\n\n/**\n * Fetches the capabilities of a card, including whether or not the SMS enrollment process is required.\n * @public\n * @param {object} options UnionPay {@link UnionPay#fetchCapabilities fetchCapabilities} options\n * @param {object} [options.card] The card from which to fetch capabilities. Note that this will only have one property, `number`. Required if you are not using the `hostedFields` option.\n * @param {string} options.card.number Card number.\n * @param {HostedFields} [options.hostedFields] The Hosted Fields instance used to collect card data. Required if you are not using the `card` option.\n * @param {callback} [callback] The second argument, <code>data</code>, is a {@link UnionPay#fetchCapabilitiesPayload fetchCapabilitiesPayload}. If no callback is provided, `fetchCapabilities` returns a promise that resolves with a {@link UnionPay#fetchCapabilitiesPayload fetchCapabilitiesPayload}.\n * @returns {(Promise|void)} Returns a promise if no callback is provided.\n */\nUnionPay.prototype.fetchCapabilities = function (options) {\n  var self = this;\n  var client = this._options.client;\n  var cardNumber = options.card ? options.card.number : null;\n  var hostedFields = options.hostedFields;\n\n  if (cardNumber && hostedFields) {\n    return Promise.reject(\n      new BraintreeError(errors.UNIONPAY_CARD_AND_HOSTED_FIELDS_INSTANCES)\n    );\n  }\n  if (cardNumber) {\n    return client\n      .request({\n        method: \"get\",\n        endpoint: \"payment_methods/credit_cards/capabilities\",\n        data: {\n          _meta: { source: \"unionpay\" },\n          creditCard: {\n            number: cardNumber,\n          },\n        },\n      })\n      .then(function (response) {\n        analytics.sendEvent(client, \"unionpay.capabilities-received\");\n\n        return response;\n      })\n      .catch(function (err) {\n        var status = err.details && err.details.httpStatus;\n\n        analytics.sendEvent(client, \"unionpay.capabilities-failed\");\n\n        if (status === 403) {\n          return Promise.reject(err);\n        }\n\n        return Promise.reject(\n          new BraintreeError({\n            type: errors.UNIONPAY_FETCH_CAPABILITIES_NETWORK_ERROR.type,\n            code: errors.UNIONPAY_FETCH_CAPABILITIES_NETWORK_ERROR.code,\n            message: errors.UNIONPAY_FETCH_CAPABILITIES_NETWORK_ERROR.message,\n            details: {\n              originalError: err,\n            },\n          })\n        );\n      });\n  }\n  if (hostedFields) {\n    if (!hostedFields._bus) {\n      return Promise.reject(\n        new BraintreeError(errors.UNIONPAY_HOSTED_FIELDS_INSTANCE_INVALID)\n      );\n    }\n\n    return self._initializeHostedFields().then(function () {\n      return new Promise(function (resolve, reject) {\n        self._bus.emit(\n          events.HOSTED_FIELDS_FETCH_CAPABILITIES,\n          { hostedFields: hostedFields },\n          function (response) {\n            if (response.err) {\n              reject(new BraintreeError(response.err));\n\n              return;\n            }\n\n            resolve(response.payload);\n          }\n        );\n      });\n    });\n  }\n\n  return Promise.reject(\n    new BraintreeError(errors.UNIONPAY_CARD_OR_HOSTED_FIELDS_INSTANCE_REQUIRED)\n  );\n};\n\n/**\n * @typedef {object} UnionPay~enrollPayload\n * @property {string} enrollmentId UnionPay enrollment ID. This value should be passed to `tokenize`.\n * @property {boolean} smsCodeRequired UnionPay `smsCodeRequired` flag.\n * </p><b>true</b> - the user will receive an SMS code that needs to be supplied for tokenization.\n * </p><b>false</b> - the card can be immediately tokenized.\n */\n\n/**\n * Enrolls a UnionPay card. Use {@link UnionPay#fetchCapabilities|fetchCapabilities} to determine if the SMS enrollment process is required.\n * @public\n * @param {object} options UnionPay enrollment options:\n * @param {object} [options.card] The card to enroll. Required if you are not using the `hostedFields` option.\n * @param {string} options.card.number The card number.\n * @param {string} [options.card.expirationDate] The card's expiration date. May be in the form `MM/YY` or `MM/YYYY`. When defined `expirationMonth` and `expirationYear` are ignored.\n * @param {string} [options.card.expirationMonth] The card's expiration month. This should be used with the `expirationYear` parameter. When `expirationDate` is defined this parameter is ignored.\n * @param {string} [options.card.expirationYear] The card's expiration year. This should be used with the `expirationMonth` parameter. When `expirationDate` is defined this parameter is ignored.\n * @param {HostedFields} [options.hostedFields] The Hosted Fields instance used to collect card data. Required if you are not using the `card` option.\n * @param {object} options.mobile The mobile information collected from the customer.\n * @param {string} options.mobile.countryCode The country code of the customer's mobile phone number.\n * @param {string} options.mobile.number The customer's mobile phone number.\n * @param {callback} [callback] The second argument, <code>data</code>, is a {@link UnionPay~enrollPayload|enrollPayload}. If no callback is provided, `enroll` returns a promise that resolves with {@link UnionPay~enrollPayload|enrollPayload}.\n * @returns {void}\n */\nUnionPay.prototype.enroll = function (options) {\n  var self = this;\n  var client = this._options.client;\n  var card = options.card;\n  var mobile = options.mobile;\n  var hostedFields = options.hostedFields;\n  var data;\n\n  if (!mobile) {\n    return Promise.reject(\n      new BraintreeError(errors.UNIONPAY_MISSING_MOBILE_PHONE_DATA)\n    );\n  }\n\n  if (hostedFields) {\n    if (!hostedFields._bus) {\n      return Promise.reject(\n        new BraintreeError(errors.UNIONPAY_HOSTED_FIELDS_INSTANCE_INVALID)\n      );\n    }\n    if (card) {\n      return Promise.reject(\n        new BraintreeError(errors.UNIONPAY_CARD_AND_HOSTED_FIELDS_INSTANCES)\n      );\n    }\n\n    return new Promise(function (resolve, reject) {\n      self._initializeHostedFields().then(function () {\n        self._bus.emit(\n          events.HOSTED_FIELDS_ENROLL,\n          { hostedFields: hostedFields, mobile: mobile },\n          function (response) {\n            if (response.err) {\n              reject(new BraintreeError(response.err));\n\n              return;\n            }\n\n            resolve(response.payload);\n          }\n        );\n      });\n    });\n  }\n  if (card && card.number) {\n    data = {\n      _meta: { source: \"unionpay\" },\n      unionPayEnrollment: {\n        number: card.number,\n        mobileCountryCode: mobile.countryCode,\n        mobileNumber: mobile.number,\n      },\n    };\n\n    if (card.expirationDate) {\n      data.unionPayEnrollment.expirationDate = card.expirationDate;\n    } else if (card.expirationMonth || card.expirationYear) {\n      if (card.expirationMonth && card.expirationYear) {\n        data.unionPayEnrollment.expirationYear = card.expirationYear;\n        data.unionPayEnrollment.expirationMonth = card.expirationMonth;\n      } else {\n        return Promise.reject(\n          new BraintreeError(errors.UNIONPAY_EXPIRATION_DATE_INCOMPLETE)\n        );\n      }\n    }\n\n    return client\n      .request({\n        method: \"post\",\n        endpoint: \"union_pay_enrollments\",\n        data: data,\n      })\n      .then(function (response) {\n        analytics.sendEvent(client, \"unionpay.enrollment-succeeded\");\n\n        return {\n          enrollmentId: response.unionPayEnrollmentId,\n          smsCodeRequired: response.smsCodeRequired,\n        };\n      })\n      .catch(function (err) {\n        var error;\n        var status = err.details && err.details.httpStatus;\n\n        if (status === 403) {\n          error = err;\n        } else if (status < 500) {\n          error = new BraintreeError(\n            errors.UNIONPAY_ENROLLMENT_CUSTOMER_INPUT_INVALID\n          );\n          error.details = { originalError: err };\n        } else {\n          error = new BraintreeError(errors.UNIONPAY_ENROLLMENT_NETWORK_ERROR);\n          error.details = { originalError: err };\n        }\n\n        analytics.sendEvent(client, \"unionpay.enrollment-failed\");\n\n        return Promise.reject(error);\n      });\n  }\n\n  return Promise.reject(\n    new BraintreeError(errors.UNIONPAY_CARD_OR_HOSTED_FIELDS_INSTANCE_REQUIRED)\n  );\n};\n\n/**\n * @typedef {object} UnionPay~tokenizePayload\n * @property {string} nonce The payment method nonce.\n * @property {string} type Always <code>CreditCard</code>.\n * @property {object} details Additional account details:\n * @property {string} details.cardType Type of card, ex: Visa, MasterCard.\n * @property {string} details.lastFour Last four digits of card number.\n * @property {string} details.lastTwo Last two digits of card number.\n * @property {string} description A human-readable description.\n */\n\n/**\n * Tokenizes a UnionPay card and returns a nonce payload.\n * @public\n * @param {object} options UnionPay tokenization options:\n * @param {object} [options.card] The card to enroll. Required if you are not using the `hostedFields` option.\n * @param {string} options.card.number The card number.\n * @param {string} [options.card.expirationDate] The card's expiration date. May be in the form `MM/YY` or `MM/YYYY`. When defined `expirationMonth` and `expirationYear` are ignored.\n * @param {string} [options.card.expirationMonth] The card's expiration month. This should be used with the `expirationYear` parameter. When `expirationDate` is defined this parameter is ignored.\n * @param {string} [options.card.expirationYear] The card's expiration year. This should be used with the `expirationMonth` parameter. When `expirationDate` is defined this parameter is ignored.\n * @param {string} [options.card.cvv] The card's security number.\n * @param {HostedFields} [options.hostedFields] The Hosted Fields instance used to collect card data. Required if you are not using the `card` option.\n * @param {string} options.enrollmentId The enrollment ID from {@link UnionPay#enroll}.\n * @param {string} [options.smsCode] The SMS code received from the user if {@link UnionPay#enroll} payload have `smsCodeRequired`. if `smsCodeRequired` is false, smsCode should not be passed.\n * @param {callback} [callback] The second argument, <code>data</code>, is a {@link UnionPay~tokenizePayload|tokenizePayload}. If no callback is provided, `tokenize` returns a promise that resolves with a {@link UnionPay~tokenizePayload|tokenizePayload}.\n * @returns {(Promise|void)} Returns a promise if no callback is provided.\n */\nUnionPay.prototype.tokenize = function (options) {\n  var data;\n  var self = this;\n  var client = this._options.client;\n  var card = options.card;\n  var hostedFields = options.hostedFields;\n\n  if (card && hostedFields) {\n    return Promise.reject(\n      new BraintreeError(errors.UNIONPAY_CARD_AND_HOSTED_FIELDS_INSTANCES)\n    );\n  }\n  if (card) {\n    data = {\n      _meta: { source: \"unionpay\" },\n      creditCard: {\n        number: options.card.number,\n        options: {\n          unionPayEnrollment: {\n            id: options.enrollmentId,\n          },\n        },\n      },\n    };\n\n    if (options.smsCode) {\n      data.creditCard.options.unionPayEnrollment.smsCode = options.smsCode;\n    }\n\n    if (card.expirationDate) {\n      data.creditCard.expirationDate = card.expirationDate;\n    } else if (card.expirationMonth && card.expirationYear) {\n      data.creditCard.expirationYear = card.expirationYear;\n      data.creditCard.expirationMonth = card.expirationMonth;\n    }\n\n    if (options.card.cvv) {\n      data.creditCard.cvv = options.card.cvv;\n    }\n\n    return client\n      .request({\n        method: \"post\",\n        endpoint: \"payment_methods/credit_cards\",\n        data: data,\n      })\n      .then(function (response) {\n        var tokenizedCard = response.creditCards[0];\n\n        delete tokenizedCard.consumed;\n        delete tokenizedCard.threeDSecureInfo;\n\n        analytics.sendEvent(client, \"unionpay.nonce-received\");\n\n        return tokenizedCard;\n      })\n      .catch(function (err) {\n        var error;\n        var status = err.details && err.details.httpStatus;\n\n        analytics.sendEvent(client, \"unionpay.nonce-failed\");\n\n        if (status === 403) {\n          error = err;\n        } else if (status < 500) {\n          error = new BraintreeError(errors.UNIONPAY_FAILED_TOKENIZATION);\n          error.details = { originalError: err };\n        } else {\n          error = new BraintreeError(\n            errors.UNIONPAY_TOKENIZATION_NETWORK_ERROR\n          );\n          error.details = { originalError: err };\n        }\n\n        return Promise.reject(error);\n      });\n  }\n  if (hostedFields) {\n    if (!hostedFields._bus) {\n      return Promise.reject(\n        new BraintreeError(errors.UNIONPAY_HOSTED_FIELDS_INSTANCE_INVALID)\n      );\n    }\n\n    return new Promise(function (resolve, reject) {\n      self._initializeHostedFields().then(function () {\n        self._bus.emit(\n          events.HOSTED_FIELDS_TOKENIZE,\n          options,\n          function (response) {\n            if (response.err) {\n              reject(new BraintreeError(response.err));\n\n              return;\n            }\n\n            resolve(response.payload);\n          }\n        );\n      });\n    });\n  }\n\n  return Promise.reject(\n    new BraintreeError(errors.UNIONPAY_CARD_OR_HOSTED_FIELDS_INSTANCE_REQUIRED)\n  );\n};\n\n/**\n * Cleanly remove anything set up by {@link module:braintree-web/unionpay.create|create}. This only needs to be called when using UnionPay with Hosted Fields.\n * @public\n * @param {callback} [callback] Called on completion. If no callback is provided, returns a promise.\n * @example\n * unionpayInstance.teardown();\n * @returns {(Promise|void)} Returns a promise if no callback is provided.\n */\nUnionPay.prototype.teardown = function () {\n  if (this._bus) {\n    this._hostedFieldsFrame.parentNode.removeChild(this._hostedFieldsFrame);\n    this._bus.teardown();\n  }\n\n  convertMethodsToError(this, methods(UnionPay.prototype));\n\n  return Promise.resolve();\n};\n\nUnionPay.prototype._initializeHostedFields = function () {\n  var assetsUrl, isDebug;\n  var componentId = uuid();\n  var self = this;\n\n  if (this._hostedFieldsInitializePromise) {\n    return this._hostedFieldsInitializePromise;\n  }\n\n  this._hostedFieldsInitializePromise = new Promise(function (resolve) {\n    assetsUrl =\n      self._options.client.getConfiguration().gatewayConfiguration.assetsUrl;\n    isDebug = self._options.client.getConfiguration().isDebug;\n\n    self._bus = new Bus({\n      channel: componentId,\n      verifyDomain: isVerifiedDomain,\n    });\n    self._hostedFieldsFrame = iFramer({\n      name: constants.HOSTED_FIELDS_FRAME_NAME + \"_\" + componentId,\n      src:\n        assetsUrl +\n        \"/web/\" +\n        VERSION +\n        \"/html/unionpay-hosted-fields-frame\" +\n        useMin(isDebug) +\n        \".html\",\n      height: 0,\n      width: 0,\n    });\n\n    self._bus.on(BUS_CONFIGURATION_REQUEST_EVENT, function (reply) {\n      reply(self._options.client);\n\n      resolve();\n    });\n\n    document.body.appendChild(self._hostedFieldsFrame);\n  });\n\n  return this._hostedFieldsInitializePromise;\n};\n\nmodule.exports = wrapPromise.wrapPrototype(UnionPay);\n\n},{\"../../lib/analytics\":143,\"../../lib/braintree-error\":148,\"../../lib/constants\":149,\"../../lib/convert-methods-to-error\":150,\"../../lib/is-verified-domain\":178,\"../../lib/methods\":180,\"../../lib/use-min\":186,\"./constants\":233,\"./errors\":234,\"@braintree/iframer\":35,\"@braintree/uuid\":39,\"@braintree/wrap-promise\":43,\"framebus\":54}],236:[function(_dereq_,module,exports){\n\"use strict\";\n\nmodule.exports = {\n  PLAID_LINK_JS: \"https://cdn.plaid.com/link/v2/stable/link-initialize.js\",\n};\n\n},{}],237:[function(_dereq_,module,exports){\n\"use strict\";\n\n/**\n * @name BraintreeError.Us Bank Account - Creation Error Codes\n * @description Errors that occur when [creating the Us Bank Account component](./module-braintree-web_us-bank-account.html#.create).\n * @property {MERCHANT} US_BANK_ACCOUNT_NOT_ENABLED Occurs when US Bank Account is not enabled in the Braintree control panel.\n */\n\n/**\n * @name BraintreeError.Us Bank Account - tokenize Error Codes\n * @description Errors that occur when using the [`tokenize` method](./UsBankAccount.html#tokenize).\n * @property {MERCHANT} US_BANK_ACCOUNT_OPTION_REQUIRED Occurs when a required option is not passed.\n * @property {MERCHANT} US_BANK_ACCOUNT_MUTUALLY_EXCLUSIVE_OPTIONS Occurs when 1 or more incompatible options are passed.\n * @property {NETWORK} US_BANK_ACCOUNT_LOGIN_LOAD_FAILED Occurs when bank login flow fails.\n * @property {CUSTOMER} US_BANK_ACCOUNT_LOGIN_CLOSED Occurs when bank login window is closed.\n * @property {MERCHANT} US_BANK_ACCOUNT_LOGIN_REQUEST_ACTIVE Occurs when a bank login flow is already active.\n * @property {NETWORK} US_BANK_ACCOUNT_TOKENIZATION_NETWORK_ERROR Occurs when payment details could not be tokenized.\n * @property {CUSTOMER} US_BANK_ACCOUNT_FAILED_TOKENIZATION Occurs when payment details failed to be tokenized.\n * @property {MERCHANT} US_BANK_ACCOUNT_BANK_LOGIN_NOT_ENABLED Occurs when bank login flow is not enabled in the Braintree control panel.\n */\n\nvar BraintreeError = _dereq_(\"../lib/braintree-error\");\n\nmodule.exports = {\n  US_BANK_ACCOUNT_OPTION_REQUIRED: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"US_BANK_ACCOUNT_OPTION_REQUIRED\",\n  },\n  US_BANK_ACCOUNT_MUTUALLY_EXCLUSIVE_OPTIONS: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"US_BANK_ACCOUNT_MUTUALLY_EXCLUSIVE_OPTIONS\",\n  },\n  US_BANK_ACCOUNT_LOGIN_LOAD_FAILED: {\n    type: BraintreeError.types.NETWORK,\n    code: \"US_BANK_ACCOUNT_LOGIN_LOAD_FAILED\",\n    message: \"Bank login flow failed to load.\",\n  },\n  US_BANK_ACCOUNT_LOGIN_CLOSED: {\n    type: BraintreeError.types.CUSTOMER,\n    code: \"US_BANK_ACCOUNT_LOGIN_CLOSED\",\n    message: \"Customer closed bank login flow before authorizing.\",\n  },\n  US_BANK_ACCOUNT_LOGIN_REQUEST_ACTIVE: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"US_BANK_ACCOUNT_LOGIN_REQUEST_ACTIVE\",\n    message: \"Another bank login tokenization request is active.\",\n  },\n  US_BANK_ACCOUNT_TOKENIZATION_NETWORK_ERROR: {\n    type: BraintreeError.types.NETWORK,\n    code: \"US_BANK_ACCOUNT_TOKENIZATION_NETWORK_ERROR\",\n    message: \"A tokenization network error occurred.\",\n  },\n  US_BANK_ACCOUNT_FAILED_TOKENIZATION: {\n    type: BraintreeError.types.CUSTOMER,\n    code: \"US_BANK_ACCOUNT_FAILED_TOKENIZATION\",\n    message: \"The supplied data failed tokenization.\",\n  },\n  US_BANK_ACCOUNT_NOT_ENABLED: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"US_BANK_ACCOUNT_NOT_ENABLED\",\n    message: \"US bank account is not enabled.\",\n  },\n  US_BANK_ACCOUNT_BANK_LOGIN_NOT_ENABLED: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"US_BANK_ACCOUNT_BANK_LOGIN_NOT_ENABLED\",\n    message: \"Bank login is not enabled.\",\n  },\n};\n\n},{\"../lib/braintree-error\":148}],238:[function(_dereq_,module,exports){\n\"use strict\";\n/**\n * @module braintree-web/us-bank-account\n * @description This module is for accepting payments of US bank accounts.\n */\n\nvar basicComponentVerification = _dereq_(\"../lib/basic-component-verification\");\nvar BraintreeError = _dereq_(\"../lib/braintree-error\");\nvar createDeferredClient = _dereq_(\"../lib/create-deferred-client\");\nvar createAssetsUrl = _dereq_(\"../lib/create-assets-url\");\nvar errors = _dereq_(\"./errors\");\nvar USBankAccount = _dereq_(\"./us-bank-account\");\nvar VERSION = \"3.134.0\";\nvar wrapPromise = _dereq_(\"@braintree/wrap-promise\");\n\n/**\n * @static\n * @function create\n * @param {object} options Creation options:\n * @param {Client} [options.client] A {@link Client} instance.\n * @param {string} [options.authorization] A tokenizationKey or clientToken. Can be used in place of `options.client`.\n * @param {callback} [callback] The second argument, `data`, is the {@link USBankAccount} instance. If no callback is provided, `create` returns a promise that resolves with the {@link USBankAccount} instance.\n * @returns {(Promise|void)} Returns a promise if no callback is provided.\n */\nfunction create(options) {\n  var name = \"US Bank Account\";\n\n  return basicComponentVerification\n    .verify({\n      name: name,\n      client: options.client,\n      authorization: options.authorization,\n    })\n    .then(function () {\n      return createDeferredClient.create({\n        authorization: options.authorization,\n        client: options.client,\n        debug: options.debug,\n        assetsUrl: createAssetsUrl.create(options.authorization),\n        name: name,\n      });\n    })\n    .then(function (client) {\n      var usBankAccount;\n\n      options.client = client;\n\n      usBankAccount =\n        options.client.getConfiguration().gatewayConfiguration.usBankAccount;\n      if (!usBankAccount) {\n        return Promise.reject(\n          new BraintreeError(errors.US_BANK_ACCOUNT_NOT_ENABLED)\n        );\n      }\n\n      return new USBankAccount(options);\n    });\n}\n\nmodule.exports = {\n  create: wrapPromise(create),\n  /**\n   * @description The current version of the SDK, i.e. `{@pkg version}`.\n   * @type {string}\n   */\n  VERSION: VERSION,\n};\n\n},{\"../lib/basic-component-verification\":146,\"../lib/braintree-error\":148,\"../lib/create-assets-url\":152,\"../lib/create-deferred-client\":154,\"./errors\":237,\"./us-bank-account\":239,\"@braintree/wrap-promise\":43}],239:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar BraintreeError = _dereq_(\"../lib/braintree-error\");\nvar constants = _dereq_(\"./constants\");\nvar errors = _dereq_(\"./errors\");\nvar sharedErrors = _dereq_(\"../lib/errors\");\nvar analytics = _dereq_(\"../lib/analytics\");\nvar once = _dereq_(\"../lib/once\");\nvar convertMethodsToError = _dereq_(\"../lib/convert-methods-to-error\");\nvar methods = _dereq_(\"../lib/methods\");\nvar wrapPromise = _dereq_(\"@braintree/wrap-promise\");\n\nvar TOKENIZE_BANK_DETAILS_MUTATION = createGraphQLMutation(\"UsBankAccount\");\nvar TOKENIZE_BANK_LOGIN_MUTATION = createGraphQLMutation(\"UsBankLogin\");\n\n/**\n * @typedef {object} USBankAccount~tokenizePayload\n * @property {string} nonce The payment method nonce.\n * @property {string} type The payment method type, always `us_bank_account`.\n * @property {object} details Additional account details. Currently empty.\n */\n\n/**\n * @class\n * @param {object} options See {@link module:braintree-web/us-bank-account.create|us-bank-account.create}.\n * @classdesc This class represents a US Bank Account component. Instances of this class can tokenize raw bank details or present a bank login. <strong>You cannot use this constructor directly. Use {@link module:braintree-web/us-bank-account.create|braintree.us-bank-account.create} instead.</strong>\n */\nfunction USBankAccount(options) {\n  this._client = options.client;\n\n  this._isTokenizingBankLogin = false;\n\n  analytics.sendEvent(this._client, \"usbankaccount.initialized\");\n}\n\n/**\n * Tokenizes bank information to return a payment method nonce. You can tokenize bank details by providing information like account and routing numbers. You can also tokenize with a bank login UI that prompts the customer to log into their bank account.\n * @public\n * @param {object} options All tokenization options for the US Bank Account component.\n * @param {string} options.mandateText A string for proof of customer authorization. For example, `'I authorize Braintree to debit my bank account on behalf of My Online Store.'`.\n * @param {object} [options.bankDetails] Bank detail information (such as account and routing numbers). `bankDetails` or `bankLogin` option must be provided.\n * @param {string} options.bankDetails.routingNumber The customer's bank routing number, such as `'307075259'`.\n * @param {string} options.bankDetails.accountNumber The customer's bank account number, such as `'999999999'`.\n * @param {string} options.bankDetails.accountType The customer's bank account type. Must be `'checking'` or `'savings'`.\n * @param {string} options.bankDetails.ownershipType The customer's bank account ownership type. Must be `'personal'` or `'business'`.\n * @param {string} [options.bankDetails.firstName] The customer's first name. Required when account ownership type is `personal`.\n * @param {string} [options.bankDetails.lastName] The customer's last name. Required when account ownership type is `personal`.\n * @param {string} [options.bankDetails.businessName] The customer's business name. Required when account ownership type is `business`.\n * @param {object} options.bankDetails.billingAddress The customer's billing address.\n * @param {string} options.bankDetails.billingAddress.streetAddress The street address for the customer's billing address, such as `'123 Fake St'`.\n * @param {string} [options.bankDetails.billingAddress.extendedAddress] The extended street address for the customer's billing address, such as `'Apartment B'`.\n * @param {string} options.bankDetails.billingAddress.locality The locality for the customer's billing address. This is typically a city, such as `'San Francisco'`.\n * @param {string} options.bankDetails.billingAddress.region The region for the customer's billing address. This is typically a state, such as `'CA'`.\n * @param {string} options.bankDetails.billingAddress.postalCode The postal code for the customer's billing address. This is typically a ZIP code, such as `'94119'`.\n * @param {object} [options.bankLogin] Bank login information. `bankLogin` or `bankDetails` option must be provided.\n * @param {string} options.bankLogin.displayName Display name for the bank login UI, such as `'My Store'`.\n * @param {string} options.bankLogin.ownershipType The customer's bank account ownership type. Must be `'personal'` or `'business'`.\n * @param {string} [options.bankLogin.firstName] The customer's first name. Required when account ownership type is `personal`.\n * @param {string} [options.bankLogin.lastName] The customer's last name. Required when account ownership type is `personal`.\n * @param {string} [options.bankLogin.businessName] The customer's business name. Required when account ownership type is `business`.\n * @param {object} options.bankLogin.billingAddress The customer's billing address.\n * @param {string} options.bankLogin.billingAddress.streetAddress The street address for the customer's billing address, such as `'123 Fake St'`.\n * @param {string} [options.bankLogin.billingAddress.extendedAddress] The extended street address for the customer's billing address, such as `'Apartment B'`.\n * @param {string} options.bankLogin.billingAddress.locality The locality for the customer's billing address. This is typically a city, such as `'San Francisco'`.\n * @param {string} options.bankLogin.billingAddress.region The region for the customer's billing address. This is typically a state, such as `'CA'`.\n * @param {string} options.bankLogin.billingAddress.postalCode The postal code for the customer's billing address. This is typically a ZIP code, such as `'94119'`.\n * @param {callback} [callback] The second argument, <code>data</code>, is a {@link USBankAccount~tokenizePayload|tokenizePayload}. If no callback is provided, `tokenize` returns a promise that resolves with {@link USBankAccount~tokenizePayload|tokenizePayload}.\n * @returns {(Promise|void)} Returns a promise if no callback is provided.\n * @example\n * <caption>Tokenizing raw bank details</caption>\n * var routingNumberInput = document.querySelector('input[name=\"routing-number\"]');\n * var accountNumberInput = document.querySelector('input[name=\"account-number\"]');\n * var accountTypeInput = document.querySelector('input[name=\"account-type\"]:checked');\n * var ownershipTypeInput = document.querySelector('input[name=\"ownership-type\"]:checked');\n * var firstNameInput = document.querySelector('input[name=\"first-name\"]');\n * var lastNameInput = document.querySelector('input[name=\"last-name\"]');\n * var businessNameInput = document.querySelector('input[name=\"business-name\"]');\n * var billingAddressStreetInput = document.querySelector('input[name=\"street-address\"]');\n * var billingAddressExtendedInput = document.querySelector('input[name=\"extended-address\"]');\n * var billingAddressLocalityInput = document.querySelector('input[name=\"locality\"]');\n * var billingAddressRegionSelect = document.querySelector('select[name=\"region\"]');\n * var billingAddressPostalInput = document.querySelector('input[name=\"postal-code\"]');\n *\n * submitButton.addEventListener('click', function (event) {\n *   var bankDetails = {\n *     routingNumber: routingNumberInput.value,\n *     accountNumber: accountNumberInput.value,\n *     accountType: accountTypeInput.value,\n *     ownershipType: ownershipTypeInput.value,\n *     billingAddress: {\n *       streetAddress: billingAddressStreetInput.value,\n *       extendedAddress: billingAddressExtendedInput.value,\n *       locality: billingAddressLocalityInput.value,\n *       region: billingAddressRegionSelect.value,\n *       postalCode: billingAddressPostalInput.value\n *     }\n *   };\n *\n *   if (bankDetails.ownershipType === 'personal') {\n *     bankDetails.firstName = firstNameInput.value;\n *     bankDetails.lastName = lastNameInput.value;\n *   } else {\n *     bankDetails.businessName = businessNameInput.value;\n *   }\n *\n *   event.preventDefault();\n *\n *   usBankAccountInstance.tokenize({\n *     bankDetails: bankDetails,\n *     mandateText: 'I authorize Braintree to debit my bank account on behalf of My Online Store.'\n *   }, function (tokenizeErr, tokenizedPayload) {\n *     if (tokenizeErr) {\n *       console.error('There was an error tokenizing the bank details.');\n *       return;\n *     }\n *\n *     // Send tokenizePayload.nonce to your server here!\n *   });\n * });\n * @example\n * <caption>Tokenizing with bank login UI</caption>\n * var ownershipTypeInput = document.querySelector('input[name=\"ownership-type\"]:checked');\n * var firstNameInput = document.querySelector('input[name=\"first-name\"]');\n * var lastNameInput = document.querySelector('input[name=\"last-name\"]');\n * var businessNameInput = document.querySelector('input[name=\"business-name\"]');\n * var billingAddressStreetInput = document.querySelector('input[name=\"street-address\"]');\n * var billingAddressExtendedInput = document.querySelector('input[name=\"extended-address\"]');\n * var billingAddressLocalityInput = document.querySelector('input[name=\"locality\"]');\n * var billingAddressRegionSelect = document.querySelector('select[name=\"region\"]');\n * var billingAddressPostalInput = document.querySelector('input[name=\"postal-code\"]');\n *\n * bankLoginButton.addEventListener('click', function (event) {\n *   var bankLogin = {\n *     displayName: 'My Online Store',\n *     ownershipType: ownershipTypeInput.value,\n *     billingAddress: {\n *       streetAddress: billingAddressStreetInput.value,\n *       extendedAddress: billingAddressExtendedInput.value,\n *       locality: billingAddressLocalityInput.value,\n *       region: billingAddressRegionSelect.value,\n *       postalCode: billingAddressPostalInput.value\n *     }\n *   }\n *   event.preventDefault();\n *\n *   if (bankLogin.ownershipType === 'personal') {\n *     bankLogin.firstName = firstNameInput.value;\n *     bankLogin.lastName = lastNameInput.value;\n *   } else {\n *     bankLogin.businessName = businessNameInput.value;\n *   }\n *\n *   usBankAccountInstance.tokenize({\n *     bankLogin: bankLogin,\n *     mandateText: 'I authorize Braintree to debit my bank account on behalf of My Online Store.'\n *   }, function (tokenizeErr, tokenizedPayload) {\n *     if (tokenizeErr) {\n *       console.error('There was an error tokenizing the bank details.');\n *       return;\n *     }\n *\n *     // Send tokenizePayload.nonce to your server here!\n *   });\n * });\n */\nUSBankAccount.prototype.tokenize = function (options) {\n  options = options || {};\n\n  if (!options.mandateText) {\n    return Promise.reject(\n      new BraintreeError({\n        type: errors.US_BANK_ACCOUNT_OPTION_REQUIRED.type,\n        code: errors.US_BANK_ACCOUNT_OPTION_REQUIRED.code,\n        message: \"mandateText property is required.\",\n      })\n    );\n  }\n\n  if (options.bankDetails && options.bankLogin) {\n    return Promise.reject(\n      new BraintreeError({\n        type: errors.US_BANK_ACCOUNT_MUTUALLY_EXCLUSIVE_OPTIONS.type,\n        code: errors.US_BANK_ACCOUNT_MUTUALLY_EXCLUSIVE_OPTIONS.code,\n        message:\n          \"tokenize must be called with bankDetails or bankLogin, not both.\",\n      })\n    );\n  }\n  if (options.bankDetails) {\n    return this._tokenizeBankDetails(options);\n  }\n  if (options.bankLogin) {\n    return this._tokenizeBankLogin(options);\n  }\n\n  return Promise.reject(\n    new BraintreeError({\n      type: errors.US_BANK_ACCOUNT_OPTION_REQUIRED.type,\n      code: errors.US_BANK_ACCOUNT_OPTION_REQUIRED.code,\n      message: \"tokenize must be called with bankDetails or bankLogin.\",\n    })\n  );\n};\n\nUSBankAccount.prototype._tokenizeBankDetails = function (options) {\n  var client = this._client;\n  var bankDetails = options.bankDetails;\n  var data = {\n    achMandate: options.mandateText,\n    routingNumber: bankDetails.routingNumber,\n    accountNumber: bankDetails.accountNumber,\n    accountType: bankDetails.accountType.toUpperCase(),\n    billingAddress: formatBillingAddressForGraphQL(\n      bankDetails.billingAddress || {}\n    ),\n  };\n\n  formatDataForOwnershipType(data, bankDetails);\n\n  return client\n    .request({\n      api: \"graphQLApi\",\n      data: {\n        query: TOKENIZE_BANK_DETAILS_MUTATION,\n        variables: {\n          input: {\n            usBankAccount: data,\n          },\n        },\n      },\n    })\n    .then(function (response) {\n      analytics.sendEvent(\n        client,\n        \"usbankaccount.bankdetails.tokenization.succeeded\"\n      );\n\n      return Promise.resolve(\n        formatTokenizeResponseFromGraphQL(response, \"tokenizeUsBankAccount\")\n      );\n    })\n    .catch(function (err) {\n      var error = errorFrom(err);\n\n      analytics.sendEvent(\n        client,\n        \"usbankaccount.bankdetails.tokenization.failed\"\n      );\n\n      return Promise.reject(error);\n    });\n};\n\nUSBankAccount.prototype._tokenizeBankLogin = function (options) {\n  var self = this;\n  var client = this._client;\n  var gatewayConfiguration = client.getConfiguration().gatewayConfiguration;\n  var isProduction = gatewayConfiguration.environment === \"production\";\n  var plaidConfig = gatewayConfiguration.usBankAccount.plaid;\n\n  if (!options.bankLogin.displayName) {\n    return Promise.reject(\n      new BraintreeError({\n        type: errors.US_BANK_ACCOUNT_OPTION_REQUIRED.type,\n        code: errors.US_BANK_ACCOUNT_OPTION_REQUIRED.code,\n        message: \"displayName property is required when using bankLogin.\",\n      })\n    );\n  }\n\n  if (!plaidConfig) {\n    return Promise.reject(\n      new BraintreeError(errors.US_BANK_ACCOUNT_BANK_LOGIN_NOT_ENABLED)\n    );\n  }\n\n  if (this._isTokenizingBankLogin) {\n    return Promise.reject(\n      new BraintreeError(errors.US_BANK_ACCOUNT_LOGIN_REQUEST_ACTIVE)\n    );\n  }\n  this._isTokenizingBankLogin = true;\n\n  return new Promise(function (resolve, reject) {\n    self._loadPlaid(function (plaidLoadErr, plaid) {\n      if (plaidLoadErr) {\n        reject(plaidLoadErr);\n\n        return;\n      }\n\n      plaid\n        .create({\n          clientName: options.bankLogin.displayName,\n          apiVersion: \"v2\",\n          env: isProduction ? \"production\" : \"sandbox\",\n          key: plaidConfig.publicKey,\n          product: \"auth\",\n          selectAccount: true,\n          onExit: function () {\n            self._isTokenizingBankLogin = false;\n\n            analytics.sendEvent(\n              client,\n              \"usbankaccount.banklogin.tokenization.closed.by-user\"\n            );\n\n            reject(new BraintreeError(errors.US_BANK_ACCOUNT_LOGIN_CLOSED));\n          },\n          onSuccess: function (publicToken, metadata) {\n            var bankLogin = options.bankLogin;\n            var data = {\n              publicToken: publicToken,\n              accountId: isProduction\n                ? metadata.account_id\n                : \"plaid_account_id\",\n              accountType: metadata.account.subtype.toUpperCase(),\n              achMandate: options.mandateText,\n              billingAddress: formatBillingAddressForGraphQL(\n                bankLogin.billingAddress || {}\n              ),\n            };\n\n            formatDataForOwnershipType(data, bankLogin);\n\n            client\n              .request({\n                api: \"graphQLApi\",\n                data: {\n                  query: TOKENIZE_BANK_LOGIN_MUTATION,\n                  variables: {\n                    input: {\n                      usBankLogin: data,\n                    },\n                  },\n                },\n              })\n              .then(function (response) {\n                self._isTokenizingBankLogin = false;\n\n                analytics.sendEvent(\n                  client,\n                  \"usbankaccount.banklogin.tokenization.succeeded\"\n                );\n\n                resolve(\n                  formatTokenizeResponseFromGraphQL(\n                    response,\n                    \"tokenizeUsBankLogin\"\n                  )\n                );\n              })\n              .catch(function (tokenizeErr) {\n                var error;\n\n                self._isTokenizingBankLogin = false;\n                error = errorFrom(tokenizeErr);\n\n                analytics.sendEvent(\n                  client,\n                  \"usbankaccount.banklogin.tokenization.failed\"\n                );\n\n                reject(error);\n              });\n          },\n        })\n        .open();\n\n      analytics.sendEvent(\n        client,\n        \"usbankaccount.banklogin.tokenization.started\"\n      );\n    });\n  });\n};\n\nfunction errorFrom(err) {\n  var error;\n  var status = err.details && err.details.httpStatus;\n\n  if (status === 401) {\n    error = new BraintreeError(sharedErrors.BRAINTREE_API_ACCESS_RESTRICTED);\n  } else if (status < 500) {\n    error = new BraintreeError(errors.US_BANK_ACCOUNT_FAILED_TOKENIZATION);\n  } else {\n    error = new BraintreeError(\n      errors.US_BANK_ACCOUNT_TOKENIZATION_NETWORK_ERROR\n    );\n  }\n  error.details = { originalError: err };\n\n  return error;\n}\n\nfunction formatTokenizeResponseFromGraphQL(response, type) {\n  var data = response.data[type].paymentMethod;\n  var last4 = data.details.last4;\n  var description = \"US bank account ending in - \" + last4;\n\n  return {\n    nonce: data.id,\n    details: {},\n    description: description,\n    type: \"us_bank_account\",\n  };\n}\n\nUSBankAccount.prototype._loadPlaid = function (callback) {\n  var existingScript, script;\n\n  callback = once(callback);\n\n  if (window.Plaid) {\n    callback(null, window.Plaid);\n\n    return;\n  }\n\n  existingScript = document.querySelector(\n    'script[src=\"' + constants.PLAID_LINK_JS + '\"]'\n  );\n\n  if (existingScript) {\n    addLoadListeners(existingScript, callback);\n  } else {\n    script = document.createElement(\"script\");\n\n    script.src = constants.PLAID_LINK_JS;\n    script.async = true;\n\n    addLoadListeners(script, callback);\n\n    document.body.appendChild(script);\n\n    this._plaidScript = script;\n  }\n};\n\nfunction addLoadListeners(script, callback) {\n  function loadHandler() {\n    var readyState = this.readyState;\n\n    if (!readyState || readyState === \"loaded\" || readyState === \"complete\") {\n      removeLoadListeners();\n      callback(null, window.Plaid);\n    }\n  }\n\n  function errorHandler() {\n    script.parentNode.removeChild(script);\n\n    callback(new BraintreeError(errors.US_BANK_ACCOUNT_LOGIN_LOAD_FAILED));\n  }\n\n  function removeLoadListeners() {\n    script.removeEventListener(\"error\", errorHandler);\n    script.removeEventListener(\"load\", loadHandler);\n    script.removeEventListener(\"readystatechange\", loadHandler);\n  }\n\n  script.addEventListener(\"error\", errorHandler);\n  script.addEventListener(\"load\", loadHandler);\n  script.addEventListener(\"readystatechange\", loadHandler);\n}\n\nfunction formatBillingAddressForGraphQL(address) {\n  return {\n    streetAddress: address.streetAddress,\n    extendedAddress: address.extendedAddress,\n    city: address.locality,\n    state: address.region,\n    zipCode: address.postalCode,\n  };\n}\n\nfunction formatDataForOwnershipType(data, details) {\n  if (details.ownershipType === \"personal\") {\n    data.individualOwner = {\n      firstName: details.firstName,\n      lastName: details.lastName,\n    };\n  } else if (details.ownershipType === \"business\") {\n    data.businessOwner = {\n      businessName: details.businessName,\n    };\n  }\n}\n\nfunction createGraphQLMutation(type) {\n  return (\n    \"\" +\n    \"mutation Tokenize\" +\n    type +\n    \"($input: Tokenize\" +\n    type +\n    \"Input!) {\" +\n    \"  tokenize\" +\n    type +\n    \"(input: $input) {\" +\n    \"    paymentMethod {\" +\n    \"      id\" +\n    \"      details {\" +\n    \"        ... on UsBankAccountDetails {\" +\n    \"          last4\" +\n    \"        }\" +\n    \"      }\" +\n    \"    }\" +\n    \"  }\" +\n    \"}\"\n  );\n}\n\n/**\n * Cleanly tear down anything set up by {@link module:braintree-web/us-bank-account.create|create}.\n * @public\n * @param {callback} [callback] Called once teardown is complete. No data is returned if teardown completes successfully.\n * @example\n * usBankAccountInstance.teardown();\n * @example <caption>With callback</caption>\n * usBankAccountInstance.teardown(function () {\n *   // teardown is complete\n * });\n * @returns {(Promise|void)} Returns a promise if no callback is provided.\n */\nUSBankAccount.prototype.teardown = function () {\n  if (this._plaidScript) {\n    document.body.removeChild(this._plaidScript);\n  }\n\n  convertMethodsToError(this, methods(USBankAccount.prototype));\n\n  return Promise.resolve();\n};\n\nmodule.exports = wrapPromise.wrapPrototype(USBankAccount);\n\n},{\"../lib/analytics\":143,\"../lib/braintree-error\":148,\"../lib/convert-methods-to-error\":150,\"../lib/errors\":158,\"../lib/methods\":180,\"../lib/once\":181,\"./constants\":236,\"./errors\":237,\"@braintree/wrap-promise\":43}],240:[function(_dereq_,module,exports){\n\"use strict\";\n\n/**\n * @name BraintreeError.Vault Manager - deletePaymentMethod Error Codes\n * @description Errors that occur when using the [`deletePaymentMethod` method](./VaultManager.html#deletePaymentMethod).\n * @property {MERCHANT} VAULT_MANAGER_DELETE_PAYMENT_METHOD_NONCE_REQUIRES_CLIENT_TOKEN Occurs when vault manager is initialized with a tokenization key instead of a Client Token.\n * @property {MERCHANT} VAULT_MANAGER_PAYMENT_METHOD_NONCE_NOT_FOUND Occurs when the specified payment method can not be found.\n * @property {UNKNOWN} VAULT_MANAGER_DELETE_PAYMENT_METHOD_UNKNOWN_ERROR Occurs when there is an error attempting to delete the payment method.\n */\n\nvar BraintreeError = _dereq_(\"../lib/braintree-error\");\n\nmodule.exports = {\n  VAULT_MANAGER_DELETE_PAYMENT_METHOD_NONCE_REQUIRES_CLIENT_TOKEN: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"VAULT_MANAGER_DELETE_PAYMENT_METHOD_NONCE_REQUIRES_CLIENT_TOKEN\",\n    message:\n      \"A client token with a customer id must be used to delete a payment method nonce.\",\n  },\n  VAULT_MANAGER_PAYMENT_METHOD_NONCE_NOT_FOUND: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"VAULT_MANAGER_PAYMENT_METHOD_NONCE_NOT_FOUND\",\n  },\n  VAULT_MANAGER_DELETE_PAYMENT_METHOD_UNKNOWN_ERROR: {\n    type: BraintreeError.types.UNKNOWN,\n    code: \"VAULT_MANAGER_DELETE_PAYMENT_METHOD_UNKNOWN_ERROR\",\n  },\n};\n\n},{\"../lib/braintree-error\":148}],241:[function(_dereq_,module,exports){\n\"use strict\";\n/**\n * @module braintree-web/vault-manager\n * @description Manages customer's payment methods.\n */\n\nvar basicComponentVerification = _dereq_(\"../lib/basic-component-verification\");\nvar createDeferredClient = _dereq_(\"../lib/create-deferred-client\");\nvar createAssetsUrl = _dereq_(\"../lib/create-assets-url\");\nvar VaultManager = _dereq_(\"./vault-manager\");\nvar VERSION = \"3.134.0\";\nvar wrapPromise = _dereq_(\"@braintree/wrap-promise\");\n\n/**\n * @static\n * @function create\n * @param {object} options Creation options:\n * @param {Client} [options.client] A {@link Client} instance.\n * @param {string} [options.authorization] A tokenizationKey or clientToken. Can be used in place of `options.client`.\n * @param {callback} callback The second argument, `data`, is the {@link VaultManager} instance.\n * @returns {void}\n */\nfunction create(options) {\n  var name = \"Vault Manager\";\n\n  return basicComponentVerification\n    .verify({\n      name: name,\n      client: options.client,\n      authorization: options.authorization,\n    })\n    .then(function () {\n      return new VaultManager({\n        createPromise: createDeferredClient.create({\n          authorization: options.authorization,\n          client: options.client,\n          debug: options.debug,\n          assetsUrl: createAssetsUrl.create(options.authorization),\n          name: name,\n        }),\n      });\n    });\n}\n\nmodule.exports = {\n  create: wrapPromise(create),\n  /**\n   * @description The current version of the SDK, i.e. `{@pkg version}`.\n   * @type {string}\n   */\n  VERSION: VERSION,\n};\n\n},{\"../lib/basic-component-verification\":146,\"../lib/create-assets-url\":152,\"../lib/create-deferred-client\":154,\"./vault-manager\":242,\"@braintree/wrap-promise\":43}],242:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar analytics = _dereq_(\"../lib/analytics\");\nvar BraintreeError = _dereq_(\"../lib/braintree-error\");\nvar errors = _dereq_(\"./errors\");\nvar convertMethodsToError = _dereq_(\"../lib/convert-methods-to-error\");\nvar methods = _dereq_(\"../lib/methods\");\nvar wrapPromise = _dereq_(\"@braintree/wrap-promise\");\n\nvar DELETE_PAYMENT_METHOD_MUTATION =\n  \"mutation DeletePaymentMethodFromSingleUseToken($input: DeletePaymentMethodFromSingleUseTokenInput!) {\" +\n  \"  deletePaymentMethodFromSingleUseToken(input: $input) {\" +\n  \"    clientMutationId\" +\n  \"  }\" +\n  \"}\";\n\n/**\n * @typedef {array} VaultManager~fetchPaymentMethodsPayload The customer's payment methods.\n * @property {object} paymentMethod The payment method object.\n * @property {string} paymentMethod.nonce A nonce that can be sent to your server to transact on the payment method.\n * @property {boolean} paymentMethod.default Whether or not this is the default payment method for the customer.\n * @property {object} paymentMethod.details Any additional details about the payment method. Varies depending on the type of payment method.\n * @property {string} paymentMethod.type A constant indicating the type of payment method.\n * @property {?string} paymentMethod.description Additional description about the payment method.\n * @property {?object} paymentMethod.binData Bin data about the payment method.\n *\n */\n\n/**\n * @class\n * @param {object} options Options\n * @description <strong>You cannot use this constructor directly. Use {@link module:braintree-web/vault-manager.create|braintree.vault-manager.create} instead.</strong>\n * @classdesc This class allows you to manage a customer's payment methods on the client.\n */\nfunction VaultManager(options) {\n  this._createPromise = options.createPromise;\n}\n\n/**\n * Fetches payment methods owned by the customer whose id was used to generate the client token used to create the {@link module:braintree-web/client|client}.\n * @public\n * @param {object} [options] Options for fetching payment methods.\n * @param {boolean} [options.defaultFirst = false] If `true`, the payment methods will be returned with the default payment method for the customer first. Otherwise, order is not guaranteed.\n * @param {callback} [callback] The second argument is a {@link VaultManager~fetchPaymentMethodsPayload|fetchPaymentMethodsPayload}. This is also what is resolved by the promise if no callback is provided.\n * @returns {(Promise|void)} Returns a promise if no callback is provided.\n * @example\n * vaultManagerInstance.fetchPaymentMethods(function (err, paymentMethods) {\n *   paymentMethods.forEach(function (paymentMethod) {\n *     // add payment method to UI\n *     // paymentMethod.nonce <- transactable nonce associated with payment method\n *     // paymentMethod.details <- object with additional information about payment method\n *     // paymentMethod.type <- a constant signifying the type\n *   });\n * });\n */\nVaultManager.prototype.fetchPaymentMethods = function (options) {\n  var defaultFirst;\n\n  options = options || {};\n\n  defaultFirst = options.defaultFirst === true ? 1 : 0;\n\n  return this._createPromise\n    .then(function (client) {\n      return client.request({\n        endpoint: \"payment_methods\",\n        method: \"get\",\n        data: {\n          defaultFirst: defaultFirst,\n        },\n      });\n    })\n    .then(\n      function (paymentMethodsPayload) {\n        analytics.sendEvent(\n          this._createPromise,\n          \"vault-manager.fetch-payment-methods.succeeded\"\n        );\n\n        return paymentMethodsPayload.paymentMethods.map(\n          formatPaymentMethodPayload\n        );\n      }.bind(this)\n    );\n};\n\n/**\n * Deletes a payment method owned by the customer whose id was used to generate the client token used to create the {@link module:braintree-web/client|client}.\n * @public\n * @param {string} paymentMethodNonce The payment method nonce that references a vaulted payment method.\n * @param {callback} [callback] No data is returned if the operation is successful.\n * @returns {(Promise|void)} Returns a promise if no callback is provided.\n * @example\n * vaultManagerInstance.deletePaymentMethod('nonce-to-delete', function (err) {\n *   // handle err if it exists\n * });\n */\nVaultManager.prototype.deletePaymentMethod = function (paymentMethodNonce) {\n  return this._createPromise.then(function (client) {\n    var usesClientToken =\n      client.getConfiguration().authorizationType === \"CLIENT_TOKEN\";\n\n    if (!usesClientToken) {\n      return Promise.reject(\n        new BraintreeError(\n          errors.VAULT_MANAGER_DELETE_PAYMENT_METHOD_NONCE_REQUIRES_CLIENT_TOKEN\n        )\n      );\n    }\n\n    return client\n      .request({\n        api: \"graphQLApi\",\n        data: {\n          query: DELETE_PAYMENT_METHOD_MUTATION,\n          variables: {\n            input: {\n              singleUseTokenId: paymentMethodNonce,\n            },\n          },\n          operationName: \"DeletePaymentMethodFromSingleUseToken\",\n        },\n      })\n      .then(function () {\n        analytics.sendEvent(\n          client,\n          \"vault-manager.delete-payment-method.succeeded\"\n        );\n\n        // noop to prevent sending back the raw graphql data\n      })\n      .catch(function (error) {\n        var originalError = error.details.originalError;\n        var formattedError;\n\n        analytics.sendEvent(\n          client,\n          \"vault-manager.delete-payment-method.failed\"\n        );\n\n        if (\n          originalError[0] &&\n          originalError[0].extensions.errorClass === \"NOT_FOUND\"\n        ) {\n          formattedError = new BraintreeError({\n            type: errors.VAULT_MANAGER_PAYMENT_METHOD_NONCE_NOT_FOUND.type,\n            code: errors.VAULT_MANAGER_PAYMENT_METHOD_NONCE_NOT_FOUND.code,\n            message:\n              \"A payment method for payment method nonce `\" +\n              paymentMethodNonce +\n              \"` could not be found.\",\n            details: {\n              originalError: originalError,\n            },\n          });\n        }\n\n        if (!formattedError) {\n          formattedError = new BraintreeError({\n            type: errors.VAULT_MANAGER_DELETE_PAYMENT_METHOD_UNKNOWN_ERROR.type,\n            code: errors.VAULT_MANAGER_DELETE_PAYMENT_METHOD_UNKNOWN_ERROR.code,\n            message:\n              \"An unknown error occured when attempting to delete the payment method assocaited with the payment method nonce `\" +\n              paymentMethodNonce +\n              \"`.\",\n            details: {\n              originalError: originalError,\n            },\n          });\n        }\n\n        return Promise.reject(formattedError);\n      });\n  });\n};\n\nfunction formatPaymentMethodPayload(paymentMethod) {\n  var formattedPaymentMethod = {\n    nonce: paymentMethod.nonce,\n    default: paymentMethod.default,\n    details: paymentMethod.details,\n    hasSubscription: paymentMethod.hasSubscription,\n    type: paymentMethod.type,\n  };\n\n  if (paymentMethod.description) {\n    formattedPaymentMethod.description = paymentMethod.description;\n  }\n\n  if (paymentMethod.binData) {\n    formattedPaymentMethod.binData = paymentMethod.binData;\n  }\n\n  return formattedPaymentMethod;\n}\n\n/**\n * Cleanly tear down anything set up by {@link module:braintree-web/vault-manager.create|create}.\n * @public\n * @param {callback} [callback] Called once teardown is complete. No data is returned if teardown completes successfully.\n * @example\n * vaultManagerInstance.teardown();\n * @example <caption>With callback</caption>\n * vaultManagerInstance.teardown(function () {\n *   // teardown is complete\n * });\n * @returns {(Promise|void)} Returns a promise if no callback is provided.\n */\nVaultManager.prototype.teardown = function () {\n  convertMethodsToError(this, methods(VaultManager.prototype));\n\n  return Promise.resolve();\n};\n\nmodule.exports = wrapPromise.wrapPrototype(VaultManager);\n\n},{\"../lib/analytics\":143,\"../lib/braintree-error\":148,\"../lib/convert-methods-to-error\":150,\"../lib/methods\":180,\"./errors\":240,\"@braintree/wrap-promise\":43}],243:[function(_dereq_,module,exports){\n\"use strict\";\nvar __importDefault =\n  (this && this.__importDefault) ||\n  function (mod) {\n    return mod && mod.__esModule ? mod : { default: mod };\n  };\nvar venmo_desktop_1 = __importDefault(_dereq_(\"./venmo-desktop\"));\nmodule.exports = function createVenmoDesktop(options) {\n  var instance = new venmo_desktop_1.default(options);\n  return instance.initialize();\n};\n\n},{\"./venmo-desktop\":245}],244:[function(_dereq_,module,exports){\n\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.VENMO_PAYMENT_CONTEXT_STATUS_QUERY =\n  exports.LEGACY_VENMO_PAYMENT_CONTEXT_STATUS_QUERY =\n  exports.UPDATE_PAYMENT_CONTEXT_QUERY =\n  exports.LEGACY_UPDATE_PAYMENT_CONTEXT_QUERY =\n  exports.CREATE_PAYMENT_CONTEXT_QUERY =\n  exports.LEGACY_CREATE_PAYMENT_CONTEXT_QUERY =\n    void 0;\nexports.LEGACY_CREATE_PAYMENT_CONTEXT_QUERY =\n  \"mutation CreateVenmoQRCodePaymentContext($input: CreateVenmoQRCodePaymentContextInput!) {\\n  createVenmoQRCodePaymentContext(input: $input) {\\n    clientMutationId\\n    venmoQRCodePaymentContext {\\n      id\\n      merchantId\\n      createdAt\\n      expiresAt\\n    }\\n  }\\n}\";\nexports.CREATE_PAYMENT_CONTEXT_QUERY =\n  \"mutation CreateVenmoPaymentContext($input: CreateVenmoPaymentContextInput!) {\\n  createVenmoPaymentContext(input: $input) {\\n    clientMutationId\\n    venmoPaymentContext {\\n      id\\n      merchantId\\n      createdAt\\n      expiresAt\\n    }\\n  }\\n}\";\nexports.LEGACY_UPDATE_PAYMENT_CONTEXT_QUERY =\n  \"mutation UpdateVenmoQRCodePaymentContext($input: UpdateVenmoQRCodePaymentContextInput!) {\\n  updateVenmoQRCodePaymentContext(input: $input) {\\n    clientMutationId\\n  }\\n}\";\nexports.UPDATE_PAYMENT_CONTEXT_QUERY =\n  \"mutation UpdateVenmoPaymentContextStatus($input: UpdateVenmoPaymentContextStatusInput!) {\\n  updateVenmoPaymentContextStatus(input: $input) {\\n    clientMutationId\\n  }\\n}\";\nexports.LEGACY_VENMO_PAYMENT_CONTEXT_STATUS_QUERY =\n  \"query PaymentContext($id: ID!) {\\n  node(id: $id) {\\n    ... on VenmoQRCodePaymentContext {\\n      status\\n      paymentMethodId\\n      userName\\n    }\\n  }\\n}\";\nexports.VENMO_PAYMENT_CONTEXT_STATUS_QUERY =\n  \"query PaymentContext($id: ID!) {\\n  node(id: $id) {\\n    ... on VenmoPaymentContext {\\n      status\\n      paymentMethodId\\n      userName\\n      payerInfo {\\n        firstName\\n        lastName\\n        phoneNumber\\n        email\\n        externalId\\n        userName\\n        billingAddress {\\n          fullName\\n          addressLine1\\n          addressLine2\\n          adminArea1\\n          adminArea2\\n          postalCode\\n          countryCode\\n        }\\n        shippingAddress {\\n          fullName\\n          addressLine1\\n          addressLine2\\n          adminArea1\\n          adminArea2\\n          postalCode\\n          countryCode\\n        }\\n      }\\n    }\\n  }\\n}\";\n\n},{}],245:[function(_dereq_,module,exports){\n\"use strict\";\nvar __assign =\n  (this && this.__assign) ||\n  function () {\n    __assign =\n      Object.assign ||\n      function (t) {\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\n          s = arguments[i];\n          for (var p in s)\n            if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n        }\n        return t;\n      };\n    return __assign.apply(this, arguments);\n  };\nvar __importDefault =\n  (this && this.__importDefault) ||\n  function (mod) {\n    return mod && mod.__esModule ? mod : { default: mod };\n  };\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar framebus_1 = __importDefault(_dereq_(\"framebus\"));\nvar iframer_1 = __importDefault(_dereq_(\"@braintree/iframer\"));\nvar uuid_1 = __importDefault(_dereq_(\"@braintree/uuid\"));\nvar events_1 = _dereq_(\"../shared/events\");\nvar queries_1 = _dereq_(\"./queries\");\nvar VENMO_DESKTOP_POLLING_INTERVAL = 1000; // 1 second\nvar VISUAL_DELAY_BEFORE_SIGNALLING_COMPLETION = 2000; // 2 seconds\nvar VenmoDesktop = /** @class */ (function () {\n  function VenmoDesktop(options) {\n    this.isHidden = true;\n    this.env = options.environment;\n    this.id = uuid_1.default();\n    this.profileId = options.profileId;\n    this.displayName = options.displayName;\n    this.paymentMethodUsage = options.paymentMethodUsage;\n    this.shouldUseLegacyQRCodeMutation = !this.paymentMethodUsage;\n    var frameUrl = options.url + \"#\" + this.env + \"_\" + this.id;\n    this.bus = new framebus_1.default({\n      channel: this.id,\n      verifyDomain: options.verifyDomain,\n      targetFrames: [],\n    });\n    this.apiRequest = options.apiRequest;\n    this.sendEvent = options.sendEvent;\n    this.Promise = options.Promise;\n    this.alertBox = document.createElement(\"div\");\n    this.alertBox.setAttribute(\"data-venmo-desktop-id\", this.id);\n    this.alertBox.setAttribute(\"role\", \"alert\");\n    this.alertBox.style.position = \"fixed\";\n    this.alertBox.style.display = \"none\";\n    this.alertBox.style.height = \"1px\";\n    this.alertBox.style.width = \"1px\";\n    this.alertBox.style.overflow = \"hidden\";\n    this.alertBox.style.zIndex = \"0\";\n    this.iframe = iframer_1.default({\n      src: frameUrl,\n      name: \"venmo-desktop-iframe\",\n      style: {\n        display: \"none\",\n        position: \"fixed\",\n        top: \"0\",\n        bottom: \"0\",\n        right: \"0\",\n        left: \"0\",\n        height: \"100%\",\n        width: \"100%\",\n        zIndex: \"9999999\",\n      },\n      title: \"Venmo Desktop\",\n    });\n    this.bus.addTargetFrame(this.iframe);\n  }\n  VenmoDesktop.prototype.initialize = function () {\n    var _this = this;\n    return new this.Promise(function (resolve) {\n      _this.bus.on(events_1.VENMO_DESKTOP_IFRAME_READY, function () {\n        resolve(_this);\n      });\n      _this.bus.on(events_1.VENMO_DESKTOP_REQUEST_NEW_QR_CODE, function () {\n        _this.sendEvent(\"venmo.tokenize.desktop.restarted-from-error-view\");\n        _this.startPolling();\n      });\n      document.body.appendChild(_this.iframe);\n      document.body.appendChild(_this.alertBox);\n    });\n  };\n  VenmoDesktop.prototype.launchDesktopFlow = function () {\n    var _this = this;\n    this.isHidden = false;\n    var promise = new this.Promise(function (resolve, reject) {\n      _this.launchDesktopPromiseRejectFunction = reject;\n      var removeListeners = function () {\n        /* eslint-disable @typescript-eslint/no-use-before-define */\n        _this.bus.off(\n          events_1.VENMO_DESKTOP_CUSTOMER_CANCELED,\n          customerCancelledHandler\n        );\n        _this.bus.off(\n          events_1.VENMO_DESKTOP_UNKNOWN_ERROR,\n          unknownErrorHandler\n        );\n        /* eslint-enable @typescript-eslint/no-use-before-define */\n      };\n      var unknownErrorHandler = function (err) {\n        removeListeners();\n        _this.sendEvent(\"venmo.tokenize.desktop.unknown-error\");\n        reject({\n          allowUIToHandleError: false,\n          reason: \"UNKNOWN_ERROR\",\n          err: err,\n        });\n      };\n      var customerCancelledHandler = function () {\n        removeListeners();\n        _this.updateVenmoDesktopPaymentContext(\"CANCELED\");\n        _this.sendEvent(\n          \"venmo.tokenize.desktop.status-change.canceled-from-modal\"\n        );\n        reject({\n          allowUIToHandleError: false,\n          reason: \"CUSTOMER_CANCELED\",\n        });\n      };\n      _this.completedHandler = function (payload) {\n        removeListeners();\n        resolve(payload);\n      };\n      _this.bus.on(\n        events_1.VENMO_DESKTOP_CUSTOMER_CANCELED,\n        customerCancelledHandler\n      );\n      _this.bus.on(events_1.VENMO_DESKTOP_UNKNOWN_ERROR, unknownErrorHandler);\n    });\n    this.iframe.style.display = \"block\";\n    this.setAlert(\"Generating a QR code, get your Venmo app ready\");\n    this.iframe.focus();\n    this.startPolling();\n    return promise\n      .then(function (result) {\n        delete _this.venmoContextId;\n        delete _this.launchDesktopPromiseRejectFunction;\n        return result;\n      })\n      .catch(function (err) {\n        delete _this.venmoContextId;\n        delete _this.launchDesktopPromiseRejectFunction;\n        return _this.Promise.reject(err);\n      });\n  };\n  VenmoDesktop.prototype.triggerCompleted = function (result) {\n    var _this = this;\n    if (this.isHidden) {\n      return;\n    }\n    setTimeout(function () {\n      if (_this.completedHandler) {\n        _this.completedHandler(result);\n      }\n      delete _this.completedHandler;\n    }, VISUAL_DELAY_BEFORE_SIGNALLING_COMPLETION);\n  };\n  VenmoDesktop.prototype.triggerRejected = function (err) {\n    if (this.launchDesktopPromiseRejectFunction) {\n      this.launchDesktopPromiseRejectFunction(err);\n    }\n  };\n  VenmoDesktop.prototype.hideDesktopFlow = function () {\n    this.setAlert(\"\");\n    this.iframe.style.display = \"none\";\n    this.bus.emit(events_1.VENMO_DESKTOP_CLOSED_FROM_PARENT);\n    this.isHidden = true;\n  };\n  VenmoDesktop.prototype.displayError = function (message) {\n    if (this.isHidden) {\n      return;\n    }\n    this.bus.emit(events_1.VENMO_DESKTOP_DISPLAY_ERROR, {\n      message: message,\n    });\n    this.setAlert(message);\n  };\n  VenmoDesktop.prototype.displayQRCode = function (id, merchantId) {\n    if (this.isHidden) {\n      return;\n    }\n    this.bus.emit(events_1.VENMO_DESKTOP_DISPLAY_QR_CODE, {\n      id: id,\n      merchantId: merchantId,\n    });\n    this.setAlert(\"To scan the QR code, open your Venmo app\");\n  };\n  VenmoDesktop.prototype.authorize = function () {\n    if (this.isHidden) {\n      return;\n    }\n    this.bus.emit(events_1.VENMO_DESKTOP_AUTHORIZE);\n    this.setAlert(\"Venmo account authorized\");\n  };\n  VenmoDesktop.prototype.authorizing = function () {\n    if (this.isHidden) {\n      return;\n    }\n    this.bus.emit(events_1.VENMO_DESKTOP_AUTHORIZING);\n    this.setAlert(\"Authorize on your Venmo app\");\n  };\n  VenmoDesktop.prototype.startPolling = function () {\n    var _this = this;\n    return this.createVenmoDesktopPaymentContext()\n      .then(function (result) {\n        var expiresIn =\n          new Date(result.expiresAt).getTime() -\n          new Date(result.createdAt).getTime();\n        var expiredTime = Date.now() + expiresIn;\n        _this.displayQRCode(result.id, result.merchantId);\n        return _this.pollForStatusChange(result.status, expiredTime);\n      })\n      .then(function (result) {\n        if (!result) {\n          return;\n        }\n        // since we are manually adding a prepended @ sign\n        // we want to make sure that the username does not\n        // start giving us the @ sign up front in the future\n        var username = result.userName || \"\";\n        username = \"@\" + username.replace(\"@\", \"\");\n        _this.triggerCompleted({\n          paymentMethodNonce: result.paymentMethodId,\n          username: username,\n          payerInfo: result.payerInfo,\n          id: _this.venmoContextId || \"\",\n        });\n      })\n      .catch(function (err) {\n        if (err.allowUIToHandleError) {\n          // noop here and let the UI handle the customer error\n          return;\n        }\n        _this.sendEvent(\"venmo.tokenize.desktop.unhandled-error\");\n        _this.triggerRejected(err);\n      });\n  };\n  VenmoDesktop.prototype.pollForStatusChange = function (status, expiredTime) {\n    var _this = this;\n    if (!this.venmoContextId) {\n      return this.Promise.resolve();\n    }\n    if (Date.now() > expiredTime) {\n      return this.updateVenmoDesktopPaymentContext(\"EXPIRED\").then(function () {\n        _this.displayError(\"Something went wrong\");\n        _this.sendEvent(\"venmo.tokenize.desktop.status-change.sdk-timeout\");\n        return _this.Promise.reject({\n          allowUIToHandleError: true,\n          reason: \"TIMEOUT\",\n        });\n      });\n    }\n    return this.lookupVenmoDesktopPaymentContext().then(function (response) {\n      if (!_this.venmoContextId || !response) {\n        return _this.Promise.resolve();\n      }\n      var newStatus = response.status;\n      if (newStatus !== status) {\n        status = newStatus;\n        _this.sendEvent(\n          \"venmo.tokenize.desktop.status-change.\" + status.toLowerCase()\n        );\n        switch (status) {\n          case \"CREATED\":\n            // noop, no need to do anything here\n            // should never be able to get to this point\n            // but we'll keep it in to enumerate the statuses\n            break;\n          case \"EXPIRED\":\n          case \"FAILED\":\n          case \"CANCELED\":\n            var message =\n              status === \"CANCELED\"\n                ? \"The authorization was canceled\"\n                : \"Something went wrong\";\n            _this.displayError(message);\n            // these are all terminal states, so we end it here\n            return _this.Promise.reject({\n              allowUIToHandleError: true,\n              reason: status,\n            });\n          case \"SCANNED\":\n            _this.authorizing();\n            break;\n          case \"APPROVED\":\n            _this.authorize();\n            return _this.Promise.resolve(response);\n          default:\n          // any other statuses are irrelevant to the polling\n          // and can just be ignored\n        }\n      }\n      return new _this.Promise(function (resolve, reject) {\n        setTimeout(function () {\n          _this\n            .pollForStatusChange(status, expiredTime)\n            .then(resolve)\n            .catch(reject);\n        }, VENMO_DESKTOP_POLLING_INTERVAL);\n      });\n    });\n  };\n  VenmoDesktop.prototype.teardown = function () {\n    this.bus.teardown();\n    if (this.iframe.parentNode) {\n      this.iframe.parentNode.removeChild(this.iframe);\n    }\n    if (this.alertBox.parentNode) {\n      this.alertBox.parentNode.removeChild(this.alertBox);\n    }\n  };\n  VenmoDesktop.prototype.setAlert = function (message) {\n    this.alertBox.style.display = message ? \"block\" : \"none\";\n    this.alertBox.textContent = message;\n  };\n  VenmoDesktop.prototype.createPaymentContextFromGraphqlLegacyQRCodeMutation =\n    function (intent) {\n      return this.apiRequest(queries_1.LEGACY_CREATE_PAYMENT_CONTEXT_QUERY, {\n        input: {\n          environment: this.env,\n          intent: intent,\n        },\n      }).then(function (response) {\n        return response.createVenmoQRCodePaymentContext\n          .venmoQRCodePaymentContext;\n      });\n    };\n  VenmoDesktop.prototype.createPaymentContextFromGraphQL = function (intent) {\n    var input = {\n      intent: intent,\n      paymentMethodUsage: this.paymentMethodUsage,\n      customerClient: \"DESKTOP\",\n    };\n    if (this.profileId) {\n      input.merchantProfileId = this.profileId;\n    }\n    if (this.displayName) {\n      input.displayName = this.displayName;\n    }\n    return this.apiRequest(queries_1.CREATE_PAYMENT_CONTEXT_QUERY, {\n      input: input,\n    }).then(function (response) {\n      return response.createVenmoPaymentContext.venmoPaymentContext;\n    });\n  };\n  VenmoDesktop.prototype.createVenmoDesktopPaymentContext = function () {\n    var _this = this;\n    var contextPromise = this.shouldUseLegacyQRCodeMutation\n      ? this.createPaymentContextFromGraphqlLegacyQRCodeMutation(\"PAY_FROM_APP\")\n      : this.createPaymentContextFromGraphQL(\"PAY_FROM_APP\");\n    return contextPromise.then(function (context) {\n      _this.venmoContextId = context.id;\n      var merchantId = _this.profileId || context.merchantId;\n      return {\n        id: context.id,\n        status: context.status,\n        merchantId: merchantId,\n        createdAt: context.createdAt,\n        expiresAt: context.expiresAt,\n      };\n    });\n  };\n  VenmoDesktop.prototype.updateVenmoDesktopPaymentContext = function (\n    status,\n    additionalOptions\n  ) {\n    if (additionalOptions === void 0) {\n      additionalOptions = {};\n    }\n    if (!this.venmoContextId) {\n      return this.Promise.resolve();\n    }\n    var data = {\n      input: __assign(\n        { id: this.venmoContextId, status: status },\n        additionalOptions\n      ),\n    };\n    var query = this.shouldUseLegacyQRCodeMutation\n      ? queries_1.LEGACY_UPDATE_PAYMENT_CONTEXT_QUERY\n      : queries_1.UPDATE_PAYMENT_CONTEXT_QUERY;\n    return this.apiRequest(query, data).then(function () {\n      // noop so we can resolve without any data to match the type\n    });\n  };\n  VenmoDesktop.prototype.lookupVenmoDesktopPaymentContext = function () {\n    if (!this.venmoContextId) {\n      return this.Promise.resolve();\n    }\n    var query = this.shouldUseLegacyQRCodeMutation\n      ? queries_1.LEGACY_VENMO_PAYMENT_CONTEXT_STATUS_QUERY\n      : queries_1.VENMO_PAYMENT_CONTEXT_STATUS_QUERY;\n    return this.apiRequest(query, {\n      id: this.venmoContextId,\n    }).then(function (response) {\n      return response.node;\n    });\n  };\n  return VenmoDesktop;\n})();\nexports.default = VenmoDesktop;\n\n},{\"../shared/events\":250,\"./queries\":244,\"@braintree/iframer\":35,\"@braintree/uuid\":39,\"framebus\":54}],246:[function(_dereq_,module,exports){\n\"use strict\";\n/** @module braintree-web/venmo */\n\nvar analytics = _dereq_(\"../lib/analytics\");\nvar basicComponentVerification = _dereq_(\"../lib/basic-component-verification\");\nvar createDeferredClient = _dereq_(\"../lib/create-deferred-client\");\nvar createAssetsUrl = _dereq_(\"../lib/create-assets-url\");\nvar errors = _dereq_(\"./shared/errors\");\nvar wrapPromise = _dereq_(\"@braintree/wrap-promise\");\nvar BraintreeError = _dereq_(\"../lib/braintree-error\");\nvar Venmo = _dereq_(\"./venmo\");\nvar supportsVenmo = _dereq_(\"./shared/supports-venmo\");\nvar VERSION = \"3.134.0\";\nvar browserDetection = _dereq_(\"./shared/browser-detection\");\n\n/**\n * @typedef {object} Venmo~lineItem\n * @property {number} quantity Number of units of the item purchased. This value must be a whole number and can't be negative or zero.\n * @property {string} unitAmount Per-unit price of the item. Can include up to 2 decimal places. This value can't be negative or zero.\n * @property {string} name Item name. Maximum 127 characters.\n * @property {string} kind Indicates whether the line item is a debit (sale) or credit (refund) to the customer. Accepted values: `debit` and `credit`.\n * @property {?string} unitTaxAmount Per-unit tax price of the item. Can include up to 2 decimal places. This value can't be negative or zero.\n * @property {?string} description Item description. Maximum 127 characters.\n * @property {?string} productCode Product or UPC code for the item. Maximum 127 characters.\n * @property {?string} url The URL to product information.\n */\n\n/**\n * @static\n * @function create\n * @param {object} options Creation options:\n * @param {Client} [options.client] A {@link Client} instance.\n * @param {string} [options.authorization] A tokenizationKey or clientToken. Can be used in place of `options.client`.\n * @param {boolean} [options.allowNewBrowserTab=true] This should be set to false if your payment flow requires returning to the same tab, e.g. single page applications. Doing so causes {@link Venmo#isBrowserSupported|isBrowserSupported} to return true only for mobile web browsers that support returning from the Venmo app to the same tab.\n * @param {boolean} [options.allowWebviews=true] This should be set to false if your payment flow does not occur from within a webview that you control. Doing so causes {@link Venmo#isBrowserSupported|isBrowserSupported} to return true only for mobile web browsers that are not webviews.\n * @param {boolean} [options.ignoreHistoryChanges=false] When the Venmo app returns to the website, it will modify the hash of the url to include data about the tokenization. By default, the SDK will put the state of the hash back to where it was before the change was made. Pass `true` to handle the hash change instead of the SDK.\n * @param {string} [options.profileId] The Venmo profile ID to be used during payment authorization. Customers will see the business name and logo associated with this Venmo profile, and it will show up in the Venmo app as a \"Connected Merchant\". Venmo profile IDs can be found in the Braintree Control Panel. Omitting this value will use the default Venmo profile.\n * @param {string} [options.deepLinkReturnUrl] An override for the URL that the Venmo iOS app opens to return from an app switch.\n * @param {boolean} [options.requireManualReturn=false] When `true`, the customer will have to manually switch back to the browser/webview that is presenting Venmo to complete the payment.\n * @param {boolean} [options.useRedirectForIOS=false] Normally, the Venmo flow is launched using `window.open` and the Venmo app intercepts that call and opens the Venmo app instead. If the customer does not have the Venmo app installed, it opens the Venmo website in a new window and instructs the customer to install the app.\n\n * In iOS webviews and Safari View Controllers (a webview-like environment which is indistinguishable from Safari for JavaScript environments), this call to `window.open` will always fail to app switch to Venmo, resulting instead in a white screen. Because of this, an alternate approach is required to launch the Venmo flow.\n *\n * When `useRedirectForIOS` is `true` and the Venmo flow is started in an iOS environment, the Venmo flow will be started by setting `window.location.href` to the Venmo website (which will still be intercepted by the Venmo app and should be the same behavior as if `window.open` was called). However, if the customer does not have the Venmo app installed, the merchant page will instead be replaced with the Venmo website and the customer will need to use the browser's back button to return to the merchant's website. Ensure that your customer's checkout information will not be lost if they are navigated away from the website and return using the browser back button.\n *\n * Due to a bug in iOS's implementation of `window.open` in iOS webviews and Safari View Controllers, if `useRedirectForIOS` is not set to `true` and the flow is launched from an iOS webview or Safari View Controller, the customer will be presented with a blank screen, halting the flow and leaving the customer unable to return to the merchant's website. Setting `useRedirectForIOS` to `true` will allow the flow to continue, but the Venmo app will be unable to return back to the webview/Safari View Controller. It will instead open the merchant's site in a new window in the customer's browser, which means the merchant site must be able to process the Venmo payment. If the SDK is configured with `allowNewBrowserTab = false`, it is unlikely that the website is set up to process the Venmo payment from a new window.\n *\n * If processing the payment from a new window is not possible, use this flag in conjunction with `requireManualReturn` so that the customer may start the flow from a webview/Safari View Controller or their Safari browser and manually return to the place that originated the flow once the Venmo app has authorized the payment and instructed them to do so.\n * @param {string} [options.paymentMethodUsage] The intended usage for the Venmo payment method nonce. Possible options are:\n * * single_use - intended as a one time transaction\n * * multi_use - intended to be vaulted and used for multiple transactions\n * @param {string} [options.displayName] The business name that will be displayed in the Venmo app payment approval screen. Only applicable when used with `paymentMethodUsage` and used by merchants onboarded as PayFast channel partners.\n * @param {boolean} [options.allowDesktop] Used to support desktop users. When enabled, the default mode is to render a scannable QR-code customers scan with their phone's to approve via the mobile app.\n * @param {boolean} [options.allowDesktopWebLogin=false] When `true`, the customer will authorize payment via a window popup that allows them to sign in to their Venmo account. This is used explicitly for customers operating from desktop browsers wanting to avoid the QR Code flow.\n * @param {boolean} [options.mobileWebFallBack] Use this option when you want to use a web-login experience, such as if on mobile and the Venmo app isn't installed.\n * @param {string} [options.styleCspNonce] specify a nonce for style code used by Venmo. This option requires either the option `allowDesktopWebLogin=true` or `mobileWebFallback=true`. This nonce should also appear in the `style-src` section of the content security policy. See more about nonces [here]{https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/CSP#nonces}.\n * @param {boolean} [options.allowAndroidRecreation=true] This flag is for when your integration uses the [Android PopupBridge](https://github.com/braintree/popup-bridge-android). Setting this flag to false will avoid a page refresh when returning to your page after payment authorization. If not specified, it defaults to true and the Android activity will be recreated, resulting in a page refresh.\n * @param {boolean} [options.allowNonDefaultBrowsers=true] When `true`, allows Venmo to be used in mobile browsers outside platform defaults (e.g. Chrome on iOS, Firefox on Android).\n * @param {boolean} [options.cancelOnReturnToBrowser=false] When `true`, the payment flow will be cancelled when the user returns to the browser before completing payment.\n * @param {boolean} [options.collectCustomerBillingAddress] When `true`, the customer's billing address will be collected and displayed on the Venmo paysheet (provided the Enriched Customer Data checkbox is also enabled for the merchant account).\n * @param {boolean} [options.collectCustomerShippingAddress] When `true`, the customer's shipping address will be collected and displayed on the Venmo paysheet (provided the Enriched Customer Data checkbox is also enabled for the merchant account).\n * @param {boolean} [options.isFinalAmount=false] When `true`, it denotes that the purchase amount (`totalAmount`) is final and will not change.\n * @param {lineItem[]} [options.lineItems] The {@link Venmo~lineItem|line items} belonging to the transaction. It can include up to 249 line items.\n * @param {string} [options.subTotalAmount] The subtotal amount of the transaction, excluding taxes, discounts, and shipping.\n * @param {string} [options.discountAmount] The total discount amount applied on the transaction.\n * @param {string} [options.shippingAmount] Shipping amount to be charged for the transaction.\n * @param {string} [options.taxAmount] The total tax amount applied to the transaction. This value can't be negative or zero.\n * @param {string} [options.totalAmount] The grand total amount of the transaction.\n *\n * Note: This flow currently requires a full page redirect, which means to utilize this flow your page will need to be able to handle the checkout session across different pages.\n * @param {callback} [callback] The second argument, `data`, is the {@link Venmo} instance. If no callback is provided, `create` returns a promise that resolves with the {@link Venmo} instance.\n * @example\n * braintree.venmo.create({\n *   client: clientInstance\n * }).then(function (venmoInstance) {\n *   // venmoInstance is ready to be used.\n * }).catch(function (createErr) {\n *   console.error('Error creating Venmo instance', createErr);\n * });\n * @example <caption>Allow desktop flow to be used</caption>\n * braintree.venmo.create({\n *   client: clientInstance,\n *   allowDesktop: true\n * }).then(function (venmoInstance) {\n *   // venmoInstance is ready to be used.\n * }).catch(function (createErr) {\n *   console.error('Error creating Venmo instance', createErr);\n * });\n * @returns {(Promise|void)} Returns the Venmo instance.\n */\nfunction create(options) {\n  var name = \"Venmo\";\n\n  return basicComponentVerification\n    .verify({\n      name: name,\n      client: options.client,\n      authorization: options.authorization,\n    })\n    .then(function () {\n      var createPromise, instance;\n      var incognitoPromise = browserDetection.isIncognito();\n\n      if (options.profileId && typeof options.profileId !== \"string\") {\n        return Promise.reject(\n          new BraintreeError(errors.VENMO_INVALID_PROFILE_ID)\n        );\n      }\n\n      if (\n        options.deepLinkReturnUrl &&\n        typeof options.deepLinkReturnUrl !== \"string\"\n      ) {\n        return Promise.reject(\n          new BraintreeError(errors.VENMO_INVALID_DEEP_LINK_RETURN_URL)\n        );\n      }\n\n      createPromise = createDeferredClient\n        .create({\n          authorization: options.authorization,\n          client: options.client,\n          debug: options.debug,\n          assetsUrl: createAssetsUrl.create(options.authorization),\n          name: name,\n        })\n        .then(function (client) {\n          var configuration = client.getConfiguration();\n\n          options.client = client;\n\n          if (!configuration.gatewayConfiguration.payWithVenmo) {\n            return Promise.reject(new BraintreeError(errors.VENMO_NOT_ENABLED));\n          }\n\n          return client;\n        });\n\n      return Promise.all([createPromise, incognitoPromise]).then(\n        function (results) {\n          var isIncognito = results[1];\n\n          options._isIncognito = isIncognito.isPrivate;\n\n          options.createPromise = createPromise;\n          instance = new Venmo(options);\n\n          analytics.sendEvent(createPromise, \"venmo.initialized\");\n\n          return instance;\n        }\n      );\n    });\n}\n\n/**\n * @static\n * @function isBrowserSupported\n * @param {object} [options] browser support options:\n * @param {boolean} [options.allowNewBrowserTab=true] This should be set to false if your payment flow requires returning to the same tab, e.g. single page applications.\n * @param {boolean} [options.allowNonDefaultBrowsers=true] This should be set to false if your payment flow requires disabling support for non-default browsers on iOS and Android.\n * @param {boolean} [options.allowWebviews=true] This should be set to false if your payment flow does not occur from within a webview that you control.\n * @example\n * if (braintree.venmo.isBrowserSupported()) {\n *   // set up Venmo\n * }\n * @example <caption>Explicitly require browser support returning to the same tab</caption>\n * if (braintree.venmo.isBrowserSupported({\n *   allowNewBrowserTab: false\n * })) {\n *   // set up Venmo\n * }\n * @example <caption>Explicitly disable non-default browser support</caption>\n * if (braintree.venmo.isBrowserSupported({\n *   allowNonDefaultBrowsers: false\n * })) {\n *   // set up Venmo\n * }\n * @example <caption>Explicitly set webviews as disallowed browsers</caption>\n * if (braintree.venmo.isBrowserSupported({\n *   allowWebviews: false\n * })) {\n *   // set up Venmo\n * }\n * @returns {boolean} Whether or not the browser supports Venmo.\n */\nfunction isBrowserSupported(options) {\n  return supportsVenmo.isBrowserSupported(options);\n}\n\nmodule.exports = {\n  create: wrapPromise(create),\n  isBrowserSupported: isBrowserSupported,\n  /**\n   * @description The current version of the SDK, i.e. `{@pkg version}`.\n   * @type {string}\n   */\n  VERSION: VERSION,\n};\n\n},{\"../lib/analytics\":143,\"../lib/basic-component-verification\":146,\"../lib/braintree-error\":148,\"../lib/create-assets-url\":152,\"../lib/create-deferred-client\":154,\"./shared/browser-detection\":247,\"./shared/errors\":249,\"./shared/supports-venmo\":252,\"./venmo\":254,\"@braintree/wrap-promise\":43}],247:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar isAndroid = _dereq_(\"@braintree/browser-detection/is-android\");\nvar isChrome = _dereq_(\"@braintree/browser-detection/is-chrome\");\nvar isIos = _dereq_(\"@braintree/browser-detection/is-ios\");\nvar isIosSafari = _dereq_(\"@braintree/browser-detection/is-ios-safari\");\nvar isIosWebview = _dereq_(\"@braintree/browser-detection/is-ios-webview\");\nvar isIncognito;\n\ntry {\n  isIncognito = _dereq_(\"@braintree/browser-detection/is-incognito\");\n  // eslint-disable-next-line no-unused-vars\n} catch (e) {\n  isIncognito = function () {\n    return Promise.resolve({\n      isPrivate: false,\n      browserName: \"unknown\",\n    });\n  };\n}\n\nfunction isAndroidWebview() {\n  return (\n    isAndroid() && window.navigator.userAgent.toLowerCase().indexOf(\"wv\") > -1\n  );\n}\n\nfunction doesNotSupportWindowOpenInIos() {\n  if (!isIos()) {\n    return false;\n  }\n\n  return isIosWebview() || !isIosSafari();\n}\n\nfunction isFacebookOwnedBrowserOnAndroid() {\n  var ua = window.navigator.userAgent.toLowerCase();\n\n  // Huawei's Facebook useragent does not include Android\n  if (ua.indexOf(\"huawei\") > -1 && ua.indexOf(\"fban\") > -1) {\n    return true;\n  }\n\n  if (!isAndroid()) {\n    return false;\n  }\n\n  return ua.indexOf(\"fb_iab\") > -1 || ua.indexOf(\"instagram\") > -1;\n}\n\nfunction isIosChrome() {\n  return isIos() && isChrome();\n}\n\nfunction isWebview() {\n  return isAndroidWebview() || isIosWebview();\n}\n\nmodule.exports = {\n  isAndroid: isAndroid,\n  isAndroidWebview: isAndroidWebview,\n  isChrome: isChrome,\n  isIos: isIos,\n  isIosChrome: isIosChrome,\n  isIosSafari: isIosSafari,\n  isIosWebview: isIosWebview,\n  isWebview: isWebview,\n  isFacebookOwnedBrowserOnAndroid: isFacebookOwnedBrowserOnAndroid,\n  doesNotSupportWindowOpenInIos: doesNotSupportWindowOpenInIos,\n  isIncognito: isIncognito,\n};\n\n},{\"@braintree/browser-detection/is-android\":22,\"@braintree/browser-detection/is-chrome\":24,\"@braintree/browser-detection/is-incognito\":26,\"@braintree/browser-detection/is-ios\":30,\"@braintree/browser-detection/is-ios-safari\":27,\"@braintree/browser-detection/is-ios-webview\":28}],248:[function(_dereq_,module,exports){\n\"use strict\";\n\n/**\n * Venmo shared constants\n * @typedef {object} Venmo~venmoConstants\n * @ignore\n * @property {string} VENMO_APP_OR_MOBILE_AUTH_URL A deep-linked url that will open the Venmo app if installed, or navigate to a Venmo web-login experience if the Venmo app is not present.\n * @property {string} VENMO_MOBILE_APP_AUTH_ONLY_URL A deep-linked url that leads to a Venmo dead-end page if the Venmo app is not installed (page asks customer to download the app).\n * @property {string} VENMO_WEB_LOGIN_URL A non-deeplinked url that leads to a Venmo login page. For use when explicitly wanting to avoid using the Venmo mobile app via a deep-linked url.\n */\nmodule.exports = {\n  DOCUMENT_VISIBILITY_CHANGE_EVENT_DELAY: 500,\n  DEFAULT_PROCESS_RESULTS_DELAY: 1000,\n  VENMO_APP_OR_MOBILE_AUTH_URL: \"https://venmo.com/go/checkout\",\n  VENMO_MOBILE_APP_AUTH_ONLY_URL: \"https://venmo.com/braintree/checkout\",\n  VENMO_WEB_LOGIN_URL: \"https://account.venmo.com/go/web\",\n};\n\n},{}],249:[function(_dereq_,module,exports){\n\"use strict\";\n\n/**\n * @name BraintreeError.Venmo - Creation Error Codes\n * @description Errors that occur when [creating the Venmo component](./module-braintree-web_venmo.html#.create).\n * @property {MERCHANT} VENMO_NOT_ENABLED Occurs when Venmo is not enabled on the Braintree control panel.\n * @property {MERCHANT} VENMO_INVALID_PROFILE_ID Occurs when Venmo is initialized with a profile id, but it is invalid.\n * @property {UNKNOWN} VENMO_MOBILE_POLLING_SETUP_FAILED __Deprecated__ No longer returned. Use `VENMO_MOBILE_PAYMENT_CONTEXT_SETUP_FAILED` instead.\n * @property {UNKNOWN} VENMO_MOBILE_PAYMENT_CONTEXT_SETUP_FAILED Occurs when the request to set up a Venmo Payment Context object fails.\n */\n\n/**\n * @name BraintreeError.Venmo - tokenize Error Codes\n * @description Errors that occur when using the [`tokenize` method](./Venmo.html#tokenize).\n * @property {CUSTOMER} VENMO_APP_CANCELED Occurs when customer cancels flow from the Venmo app.\n * @property {UNKNOWN} VENMO_APP_FAILED Occurs when tokenization fails.\n * @property {CUSTOMER} VENMO_CANCELED Occurs when customer cancels the flow or Venmo app is not available.\n * @property {CUSTOMER} VENMO_CUSTOMER_CANCELED Occurs when customer cancels the flow.\n * @property {CUSTOMER} VENMO_DESKTOP_CANCELED Occurs when customer cancels the Venmo Desktop flow by closing the modal.\n * @property {UNKNOWN} VENMO_DESKTOP_UNKNOWN_ERROR Occurs when an unknown error causes the Venmo Desktop flow to fail.\n * @property {UNKNOWN} VENMO_MOBILE_POLLING_TOKENIZATION_NETWORK_ERROR Occurs when an unknown network error causes the mobile polling process to fail.\n * @property {CUSTOMER} VENMO_MOBILE_POLLING_TOKENIZATION_EXPIRED Occurs when the polling has expired and the payment cannot be completed.\n * @property {CUSTOMER} VENMO_MOBILE_POLLING_TOKENIZATION_CANCELED Occurs when the polling operation is canceled by the customer.\n * @property {CUSTOMER} VENMO_MOBILE_POLLING_TOKENIZATION_TIMEOUT Occurs when customer takes too long to complete payment.\n * @property {UNKNOWN} VENMO_MOBILE_POLLING_TOKENIZATION_NO_CONTEXT_ID Occurs when payment context ID is not available.\n * @property {UNKNOWN} VENMO_MOBILE_POLLING_TOKENIZATION_FAILED Occurs if there is an unknown error during the mobile polling process.\n * @property {NETWORK} VENMO_NETWORK_ERROR Occurs when a network error causes a request to fail.\n * @property {MERCHANT} VENMO_TOKENIZATION_CANCELED_BY_MERCHANT Occurs when `cancelTokenization` is called while tokenization is in progress.\n * @property {UNKNOWN} VENMO_TOKENIZATION_FAILED Occurs when there is an unknown error during the web login experience.\n * @property {MERCHANT} VENMO_TOKENIZATION_REQUEST_ACTIVE Occurs when `tokenize` is called when the flow is already in progress.\n * @property {MERCHANT} VENMO_TOKENIZATION_REQUEST_NOT_ACTIVE Occurs when `cancelTokenization` is called when the flow is not in progress.\n * @property {MERCHANT} VENMO_ECD_DISABLED Occurs when the merchant tries to access customer details without enabling Enriched Customer Data.\n */\n\nvar BraintreeError = _dereq_(\"../../lib/braintree-error\");\n\nmodule.exports = {\n  VENMO_NOT_ENABLED: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"VENMO_NOT_ENABLED\",\n    message: \"Venmo is not enabled for this merchant.\",\n  },\n  VENMO_TOKENIZATION_REQUEST_ACTIVE: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"VENMO_TOKENIZATION_REQUEST_ACTIVE\",\n    message: \"Another tokenization request is active.\",\n  },\n  VENMO_TOKENIZATION_REQUEST_NOT_ACTIVE: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"VENMO_TOKENIZATION_REQUEST_NOT_ACTIVE\",\n    message: \"No tokenization in progress.\",\n  },\n  VENMO_APP_FAILED: {\n    type: BraintreeError.types.UNKNOWN,\n    code: \"VENMO_APP_FAILED\",\n    message: \"Venmo app encountered a problem.\",\n  },\n  VENMO_APP_CANCELED: {\n    type: BraintreeError.types.CUSTOMER,\n    code: \"VENMO_APP_CANCELED\",\n    message: \"Venmo app authorization was canceled.\",\n  },\n  VENMO_CANCELED: {\n    type: BraintreeError.types.CUSTOMER,\n    code: \"VENMO_CANCELED\",\n    message:\n      \"User canceled Venmo authorization, or Venmo app is not available.\",\n  },\n  VENMO_CUSTOMER_CANCELED: {\n    type: BraintreeError.types.CUSTOMER,\n    code: \"VENMO_CUSTOMER_CANCELED\",\n    message: \"User canceled Venmo authorization.\",\n  },\n  VENMO_NETWORK_ERROR: {\n    type: BraintreeError.types.NETWORK,\n    code: \"VENMO_NETWORK_ERROR\",\n    message: \"Something went wrong making the request\",\n  },\n  VENMO_DESKTOP_CANCELED: {\n    type: BraintreeError.types.CUSTOMER,\n    code: \"VENMO_DESKTOP_CANCELED\",\n    message:\n      \"User canceled Venmo authorization by closing the Venmo Desktop modal.\",\n  },\n  VENMO_TOKENIZATION_CANCELED_BY_MERCHANT: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"VENMO_TOKENIZATION_CANCELED_BY_MERCHANT\",\n    message: \"The Venmo tokenization was canceled by the merchant.\",\n  },\n  VENMO_DESKTOP_UNKNOWN_ERROR: {\n    type: BraintreeError.types.UNKNOWN,\n    code: \"VENMO_DESKTOP_UNKNOWN_ERROR\",\n    message: \"Something went wrong with the Venmo Desktop flow.\",\n  },\n  VENMO_MOBILE_PAYMENT_CONTEXT_SETUP_FAILED: {\n    type: BraintreeError.types.NETWORK,\n    code: \"VENMO_MOBILE_PAYMENT_CONTEXT_SETUP_FAILED\",\n    message: \"Something went wrong creating the Venmo Payment Context.\",\n  },\n  VENMO_MOBILE_POLLING_TOKENIZATION_NETWORK_ERROR: {\n    type: BraintreeError.types.UNKNOWN,\n    code: \"VENMO_MOBILE_POLLING_TOKENIZATION_NETWORK_ERROR\",\n    message: \"Something went wrong during mobile polling.\",\n  },\n  VENMO_MOBILE_POLLING_TOKENIZATION_EXPIRED: {\n    type: BraintreeError.types.CUSTOMER,\n    code: \"VENMO_MOBILE_POLLING_TOKENIZATION_EXPIRED\",\n    message: \"The Venmo authorization request is expired.\",\n  },\n  VENMO_MOBILE_POLLING_TOKENIZATION_CANCELED: {\n    type: BraintreeError.types.CUSTOMER,\n    code: \"VENMO_MOBILE_POLLING_TOKENIZATION_CANCELED\",\n    message: \"The Venmo authorization was canceled\",\n  },\n  VENMO_MOBILE_POLLING_TOKENIZATION_TIMEOUT: {\n    type: BraintreeError.types.CUSTOMER,\n    code: \"VENMO_MOBILE_POLLING_TOKENIZATION_TIMEOUT\",\n    message: \"Customer took too long to authorize Venmo payment.\",\n  },\n  VENMO_MOBILE_POLLING_TOKENIZATION_NO_CONTEXT_ID: {\n    type: BraintreeError.types.UNKNOWN,\n    code: \"VENMO_MOBILE_POLLING_TOKENIZATION_NO_CONTEXT_ID\",\n    message: \"No Venmo payment context ID available.\",\n  },\n  VENMO_MOBILE_POLLING_TOKENIZATION_FAILED: {\n    type: BraintreeError.types.UNKNOWN,\n    code: \"VENMO_MOBILE_POLLING_TOKENIZATION_FAILED\",\n    message: \"The Venmo authorization failed.\",\n  },\n  VENMO_INVALID_PROFILE_ID: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"VENMO_INVALID_PROFILE_ID\",\n    message: \"Venmo profile ID is invalid.\",\n  },\n  VENMO_INVALID_DEEP_LINK_RETURN_URL: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"VENMO_INVALID_DEEP_LINK_RETURN_URL\",\n    message: \"Venmo deep link return URL is invalid.\",\n  },\n  VENMO_TOKENIZATION_FAILED: {\n    type: BraintreeError.types.UNKNOWN,\n    code: \"VENMO_TOKENIZATION_FAILED\",\n    message: \"Venmo encountered a problem\",\n  },\n  VENMO_ECD_DISABLED: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"ECD_DISABLED\",\n    message:\n      \"Cannot collect customer data when ECD is disabled. Enable this feature in the Control Panel to collect this data.\",\n  },\n};\n\n},{\"../../lib/braintree-error\":148}],250:[function(_dereq_,module,exports){\n\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.VENMO_DESKTOP_UNKNOWN_ERROR =\n  exports.VENMO_DESKTOP_REQUEST_NEW_QR_CODE =\n  exports.VENMO_DESKTOP_CLOSED_FROM_PARENT =\n  exports.VENMO_DESKTOP_IFRAME_READY =\n  exports.VENMO_DESKTOP_DISPLAY_QR_CODE =\n  exports.VENMO_DESKTOP_DISPLAY_ERROR =\n  exports.VENMO_DESKTOP_CUSTOMER_CANCELED =\n  exports.VENMO_DESKTOP_AUTHORIZING =\n  exports.VENMO_DESKTOP_AUTHORIZE =\n  exports.VENMO_DESKTOP_AUTHORIZATION_TIMED_OUT =\n    void 0;\nexports.VENMO_DESKTOP_AUTHORIZATION_TIMED_OUT =\n  \"VENMO_DESKTOP_AUTHORIZATION_TIMED_OUT\";\nexports.VENMO_DESKTOP_AUTHORIZE = \"VENMO_DESKTOP_AUTHORIZE\";\nexports.VENMO_DESKTOP_AUTHORIZING = \"VENMO_DESKTOP_AUTHORIZING\";\nexports.VENMO_DESKTOP_CUSTOMER_CANCELED = \"VENMO_DESKTOP_CUSTOMER_CANCELED\";\nexports.VENMO_DESKTOP_DISPLAY_ERROR = \"VENMO_DESKTOP_DISPLAY_ERROR\";\nexports.VENMO_DESKTOP_DISPLAY_QR_CODE = \"VENMO_DESKTOP_DISPLAY_QR_CODE\";\nexports.VENMO_DESKTOP_IFRAME_READY = \"VENMO_DESKTOP_IFRAME_READY\";\nexports.VENMO_DESKTOP_CLOSED_FROM_PARENT = \"VENMO_DESKTOP_CLOSED_FROM_PARENT\";\nexports.VENMO_DESKTOP_REQUEST_NEW_QR_CODE = \"VENMO_DESKTOP_REQUEST_NEW_QR_CODE\";\nexports.VENMO_DESKTOP_UNKNOWN_ERROR = \"VENMO_DESKTOP_UNKNOWN_ERROR\";\n\n},{}],251:[function(_dereq_,module,exports){\n\"use strict\";\nvar venmoConstants = _dereq_(\"./constants\");\n\nfunction getVenmoUrl(options) {\n  if (options.useAllowDesktopWebLogin)\n    return venmoConstants.VENMO_WEB_LOGIN_URL;\n\n  if (options.mobileWebFallBack)\n    return venmoConstants.VENMO_APP_OR_MOBILE_AUTH_URL;\n\n  return venmoConstants.VENMO_MOBILE_APP_AUTH_ONLY_URL;\n}\n\nmodule.exports = getVenmoUrl;\n\n},{\"./constants\":248}],252:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar browserDetection = _dereq_(\"./browser-detection\");\nvar inIframe = _dereq_(\"../../lib/in-iframe\");\n\nfunction _parseOptions(options) {\n  options = options || {};\n\n  return {\n    // NEXT_MAJOR_VERSION allowDesktop will default to true, but can be opted out\n    merchantAllowsDesktopBrowsers:\n      (options.allowDesktopWebLogin || options.allowDesktop) === true,\n\n    merchantAllowsReturningToNewBrowserTab: options.hasOwnProperty(\n      \"allowNewBrowserTab\"\n    )\n      ? options.allowNewBrowserTab\n      : true,\n\n    merchantAllowsNonDefaultBrowsers: options.hasOwnProperty(\n      \"allowNonDefaultBrowsers\"\n    )\n      ? options.allowNonDefaultBrowsers\n      : true,\n    // NEXT_MAJOR_VERSION webviews are not supported, except for the case where\n    // the merchant themselves is presenting venmo in a webview using the deep\n    // link url to get back to their app. For the next major version, we should\n    // just not have this option and instead require the merchant to determine\n    // if the venmo button should be displayed when presenting it in the\n    // merchant's app via a webview.\n    merchantAllowsWebviews: options.hasOwnProperty(\"allowWebviews\")\n      ? options.allowWebviews\n      : true,\n  };\n}\n\nfunction _getBrowserInfo() {\n  var isAndroid = browserDetection.isAndroid();\n  var isAndroidChrome = isAndroid && browserDetection.isChrome();\n  var isIos = browserDetection.isIos();\n  var isIosSafari = browserDetection.isIosSafari();\n  var isMobileDevice = isAndroid || isIos;\n  var isMobileDeviceThatSupportsReturnToSameTab =\n    isIosSafari || isAndroidChrome;\n  var isWebview =\n    browserDetection.isAndroidWebview() || browserDetection.isIosWebview();\n\n  return {\n    isAndroid: isAndroid,\n    isAndroidChrome: isAndroidChrome,\n    isIos: isIos,\n    isIosSafari: isIosSafari,\n    isMobileDevice: isMobileDevice,\n    isMobileDeviceThatSupportsReturnToSameTab:\n      isMobileDeviceThatSupportsReturnToSameTab,\n    isWebview: isWebview,\n  };\n}\n\nfunction _isUnsupportedMobileBrowser(parsedOptions, browserInfo) {\n  // Venmo only works on iOS Chrome when the\n  // button is not rendered in an iFrame and\n  // allowNewBrowserTab is set to true\n  var merchantAllowsIosChrome =\n    (parsedOptions.merchantAllowsNonDefaultBrowsers ||\n      parsedOptions.merchantAllowsReturningToNewBrowserTab) &&\n    !inIframe();\n\n  if (merchantAllowsIosChrome && browserDetection.isIosChrome()) {\n    return false;\n  }\n\n  if (browserInfo.isIos && !browserInfo.isIosSafari) {\n    return !parsedOptions.merchantAllowsReturningToNewBrowserTab;\n  }\n\n  if (browserInfo.isAndroid && !browserInfo.isAndroidChrome) {\n    return !parsedOptions.merchantAllowsReturningToNewBrowserTab;\n  }\n\n  return browserDetection.isFacebookOwnedBrowserOnAndroid();\n}\n\nfunction _isUnsupportedWebview(parsedOptions, browserInfo) {\n  return !parsedOptions.merchantAllowsWebviews && browserInfo.isWebview;\n}\n\nfunction isNonDefaultBrowser() {\n  var browserInfo = _getBrowserInfo();\n  return (\n    browserInfo.isMobileDevice &&\n    !browserInfo.isIosSafari &&\n    !browserInfo.isAndroidChrome\n  );\n}\n\nfunction isBrowserSupported(options) {\n  var parsedOptions = _parseOptions(options);\n  var browserInfo = _getBrowserInfo();\n\n  if (\n    isNonDefaultBrowser() &&\n    !parsedOptions.merchantAllowsNonDefaultBrowsers\n  ) {\n    return false;\n  }\n\n  if (_isUnsupportedWebview(parsedOptions, browserInfo)) {\n    return false;\n  }\n\n  if (_isUnsupportedMobileBrowser(parsedOptions, browserInfo)) {\n    return false;\n  }\n\n  if (!browserInfo.isMobileDevice) {\n    return parsedOptions.merchantAllowsDesktopBrowsers;\n  }\n\n  return true;\n}\n\nmodule.exports = {\n  isBrowserSupported: isBrowserSupported,\n  isNonDefaultBrowser: isNonDefaultBrowser,\n};\n\n},{\"../../lib/in-iframe\":174,\"./browser-detection\":247}],253:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar frameService = _dereq_(\"../../lib/frame-service/external\");\nvar useMin = _dereq_(\"../../lib/use-min\");\nvar ExtendedPromise = _dereq_(\"@braintree/extended-promise\");\nvar errors = _dereq_(\"../shared/errors\");\nvar BraintreeError = _dereq_(\"../../lib/braintree-error\");\n\nvar VERSION = \"3.134.0\";\nvar VENMO_LOGO_SVG =\n  '<svg width=\"198\" height=\"58\" viewBox=\"0 0 198 58\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\\n  <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M43.0702 13.6572C44.1935 15.4585 44.6999 17.3139 44.6999 19.6576C44.6999 27.1328 38.1277 36.8436 32.7935 43.6625H20.6099L15.7236 15.2939L26.3917 14.3105L28.9751 34.4966C31.389 30.6783 34.3678 24.6779 34.3678 20.587C34.3678 18.3477 33.9727 16.8225 33.3553 15.5666L43.0702 13.6572Z\" fill=\"white\"/>\\n  <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M56.8965 26.1491C58.8596 26.1491 63.8018 25.2772 63.8018 22.5499C63.8018 21.2402 62.8481 20.587 61.7242 20.587C59.7579 20.587 57.1776 22.8763 56.8965 26.1491ZM56.6715 31.5506C56.6715 34.8807 58.5787 36.1873 61.107 36.1873C63.8603 36.1873 66.4966 35.534 69.923 33.8433L68.6324 42.3523C66.2183 43.4976 62.4559 44.2617 58.8039 44.2617C49.5403 44.2617 46.2249 38.8071 46.2249 31.9879C46.2249 23.1496 51.6179 13.765 62.7365 13.765C68.858 13.765 72.2809 17.0949 72.2809 21.7317C72.2815 29.2066 62.4005 31.4965 56.6715 31.5506Z\" fill=\"white\"/>\\n  <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M103.067 20.3142C103.067 21.4052 102.897 22.9875 102.727 24.0216L99.5262 43.6622H89.1385L92.0585 25.658C92.1139 25.1696 92.284 24.1865 92.284 23.6411C92.284 22.3314 91.4414 22.0047 90.4282 22.0047C89.0826 22.0047 87.7337 22.6042 86.8354 23.0418L83.5234 43.6625H73.0772L77.8495 14.257H86.8908L87.0052 16.6041C89.1382 15.2404 91.9469 13.7656 95.932 13.7656C101.212 13.765 103.067 16.3845 103.067 20.3142Z\" fill=\"white\"/>\\n  <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M133.906 16.9841C136.881 14.9131 139.69 13.765 143.563 13.765C148.897 13.765 150.753 16.3845 150.753 20.3142C150.753 21.4052 150.583 22.9875 150.413 24.0216L147.216 43.6622H136.825L139.801 25.2774C139.855 24.786 139.971 24.1865 139.971 23.8063C139.971 22.3317 139.128 22.0047 138.115 22.0047C136.824 22.0047 135.535 22.5501 134.577 23.0418L131.266 43.6625H120.878L123.854 25.2777C123.908 24.7863 124.02 24.1868 124.02 23.8065C124.02 22.332 123.177 22.0049 122.167 22.0049C120.819 22.0049 119.473 22.6045 118.574 23.0421L115.26 43.6628H104.817L109.589 14.2573H118.52L118.8 16.7122C120.878 15.241 123.684 13.7662 127.446 13.7662C130.704 13.765 132.837 15.129 133.906 16.9841Z\" fill=\"white\"/>\\n  <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M171.426 25.5502C171.426 23.1496 170.808 21.513 168.956 21.513C164.857 21.513 164.015 28.55 164.015 32.1498C164.015 34.8807 164.802 36.5709 166.653 36.5709C170.528 36.5709 171.426 29.1497 171.426 25.5502ZM153.458 31.7152C153.458 22.442 158.511 13.765 170.136 13.765C178.896 13.765 182.098 18.7854 182.098 25.7148C182.098 34.8805 177.099 44.3723 165.194 44.3723C156.378 44.3723 153.458 38.7525 153.458 31.7152Z\" fill=\"white\"/>\\n</svg>';\nvar CONTINUE_OR_CANCEL_INSTRUCTIONS =\n  \"Tap cancel payment to cancel and return to the business. Continue payment will relaunch the payment window.\";\n\nvar POPUP_WIDTH = 400;\nvar POPUP_HEIGHT = 570;\nvar ELEMENT_IDS = {\n  backdrop: \"venmo-desktop-web-backdrop\",\n  backdropHidden: \"venmo-desktop-web-backdrop.hidden\",\n  backdropContainer: \"venmo-backdrop-container\",\n  cancelButton: \"venmo-popup-cancel-button\",\n  continueButton: \"venmo-popup-continue-button\",\n  message: \"venmo-message\",\n  instructions: \"venmo-instructions\",\n  venmoLogo: \"venmo-full-logo\",\n};\n\nExtendedPromise.suppressUnhandledPromiseMessage = true;\n\nfunction openPopup(options) {\n  var frameServiceInstance = options.frameServiceInstance;\n  var venmoUrl = options.venmoUrl;\n  var checkForStatusChange = options.checkForStatusChange;\n  var cancelTokenization = options.cancelTokenization;\n  var checkPaymentContextStatus = options.checkPaymentContextStatus;\n  var extendedPromise = new ExtendedPromise();\n\n  document\n    .getElementById(ELEMENT_IDS.continueButton)\n    .addEventListener(\"click\", function () {\n      frameServiceInstance.focus();\n    });\n  document\n    .getElementById(ELEMENT_IDS.cancelButton)\n    .addEventListener(\"click\", function () {\n      frameServiceInstance.close();\n      cancelTokenization();\n      closeBackdrop();\n    });\n  frameServiceInstance.open({}, function (frameServiceErr) {\n    var retryStartingCount = 1;\n\n    if (frameServiceErr) {\n      extendedPromise.reject(frameServiceErr);\n    } else {\n      checkForStatusChange(retryStartingCount)\n        .then(function (data) {\n          extendedPromise.resolve(data);\n        })\n        .catch(function (statusCheckError) {\n          // We add this check here because at this point\n          // the status should not be in CREATED status.\n          // However, there is an edge case where if a buyer\n          // cancels in the popup, the popup might close itself\n          // before it can send the graphQL mutation to update its status.\n          // In these cases, the status will be stuck in CREATED status, and\n          // tokenization would fail, incorrectly throwing a tokenization error\n          // instead of informing the merchant that the customer canceled.\n          checkPaymentContextStatus().then(function (node) {\n            if (node.status === \"CREATED\") {\n              extendedPromise.reject(\n                new BraintreeError(errors.VENMO_CUSTOMER_CANCELED)\n              );\n            } else {\n              extendedPromise.reject(statusCheckError);\n            }\n          });\n        });\n    }\n\n    frameServiceInstance.close();\n    closeBackdrop();\n  });\n  frameServiceInstance.redirect(venmoUrl);\n\n  return extendedPromise;\n}\n\nfunction centeredPopupDimensions() {\n  var popupTop =\n    Math.round((window.outerHeight - POPUP_HEIGHT) / 2) + window.screenTop;\n  var popupLeft =\n    Math.round((window.outerWidth - POPUP_WIDTH) / 2) + window.screenLeft;\n\n  return {\n    top: popupTop,\n    left: popupLeft,\n  };\n}\n\nfunction closeBackdrop() {\n  document.getElementById(\"venmo-desktop-web-backdrop\").classList.add(\"hidden\");\n}\n\nfunction getElementStyles() {\n  var backdropStyles = [\n    \"#\" + ELEMENT_IDS.backdropHidden + \" {\",\n    \"display: none;\",\n    \"}\",\n    \"#\" + ELEMENT_IDS.backdrop + \" {\",\n    \"z-index: 3141592632;\",\n    \"cursor: pointer;\",\n    \"position: fixed;\",\n    \"top: 0;\",\n    \"left: 0;\",\n    \"bottom: 0;\",\n    \"width: 100%;\",\n    \"background: rgba(0, 0, 0, 0.8);\",\n    \"}\",\n  ];\n  var backdropContainerStyles = [\n    \"#\" + ELEMENT_IDS.backdropContainer + \" {\",\n    \"display: flex;\",\n    \"align-content: center;\",\n    \"justify-content: center;\",\n    \"align-items: center;\",\n    \"width: 100%;\",\n    \"height: 100%;\",\n    \"flex-direction: column;\",\n    \"}\",\n  ];\n\n  var cancelButtonStyles = [\n    \"#\" + ELEMENT_IDS.cancelButton + \" {\",\n    \"height: 24px;\",\n    \"width: 380px;\",\n    \"font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;\",\n    \"font-style: normal;\",\n    \"font-weight: 700;\",\n    \"font-size: 18px;\",\n    \"line-height: 24px;\",\n    \"text-align: center;\",\n    \"background-color: transparent;\",\n    \"border: none;\",\n    \"color: #FFFFFF;\",\n    \"margin-top: 28px;\",\n    \"}\",\n  ];\n\n  var continueButtonStyles = [\n    \"#\" + ELEMENT_IDS.continueButton + \" {\",\n    \"width: 400px;\",\n    \"height: 50px;\",\n    \"background: #0074DE;\",\n    \"border-radius: 24px;\",\n    \"border: none;\",\n    \"font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;\",\n    \"font-style: normal;\",\n    \"font-weight: 700;\",\n    \"font-size: 18px;\",\n    \"color: #FFFFFF;\",\n    \"margin-top: 44px;\",\n    \"}\",\n  ];\n\n  var messageStyles = [\n    \"#\" + ELEMENT_IDS.message + \" {\",\n    \"font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;\",\n    \"font-style: normal;\",\n    \"font-weight: 500;\",\n    \"font-size: 24px;\",\n    \"line-height: 32px;\",\n    \"text-align: center;\",\n    \"color: #FFFFFF;\",\n    \"margin-top: 32px;\",\n    \"}\",\n  ];\n\n  var instructionStyles = [\n    \"#\" + ELEMENT_IDS.instructions + \" {\",\n    \"font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;\",\n    \"font-style: normal;\",\n    \"font-weight: 400;\",\n    \"font-size: 16px;\",\n    \"line-height: 20px;\",\n    \"text-align: center;\",\n    \"color: #FFFFFF;\",\n    \"margin-top: 16px;\",\n    \"width: 400px;\",\n    \"}\",\n  ];\n\n  var allStyles = backdropStyles.concat(\n    backdropContainerStyles,\n    cancelButtonStyles,\n    continueButtonStyles,\n    messageStyles,\n    instructionStyles\n  );\n\n  return allStyles.join(\"\\n\");\n}\n\nfunction buildAndStyleElements(styleCspNonce) {\n  var alreadyRenderedBackdrop = document.getElementById(ELEMENT_IDS.backdrop);\n  var backdropStylesElement,\n    backdropDiv,\n    backDropContentContainer,\n    venmoLogoDiv,\n    venmoMessageDiv,\n    instructionsDiv,\n    continueButton,\n    cancelButton;\n\n  if (alreadyRenderedBackdrop) {\n    alreadyRenderedBackdrop.classList.remove(\"hidden\");\n\n    return;\n  }\n  backdropStylesElement = document.createElement(\"style\");\n  backdropDiv = document.createElement(\"div\");\n  backDropContentContainer = document.createElement(\"div\");\n  venmoLogoDiv = document.createElement(\"div\");\n  venmoMessageDiv = document.createElement(\"div\");\n  instructionsDiv = document.createElement(\"div\");\n  continueButton = document.createElement(\"button\");\n  cancelButton = document.createElement(\"button\");\n\n  if (styleCspNonce) {\n    backdropStylesElement.nonce = styleCspNonce;\n  }\n  backdropStylesElement.id = \"venmo-desktop-web__injected-styles\";\n  backdropStylesElement.innerHTML = getElementStyles();\n\n  backdropDiv.id = ELEMENT_IDS.backdrop;\n\n  backDropContentContainer.id = ELEMENT_IDS.backdropContainer;\n\n  venmoLogoDiv.id = ELEMENT_IDS.venmoLogo;\n  venmoLogoDiv.innerHTML = VENMO_LOGO_SVG;\n\n  venmoMessageDiv.id = ELEMENT_IDS.message;\n  venmoMessageDiv.innerText = \"What would you like to do?\";\n\n  instructionsDiv.id = ELEMENT_IDS.instructions;\n  instructionsDiv.innerText = CONTINUE_OR_CANCEL_INSTRUCTIONS;\n\n  continueButton.id = ELEMENT_IDS.continueButton;\n  continueButton.innerText = \"Continue payment\";\n\n  cancelButton.id = ELEMENT_IDS.cancelButton;\n  cancelButton.innerText = \"Cancel payment\";\n\n  document.head.appendChild(backdropStylesElement);\n  backDropContentContainer.appendChild(venmoLogoDiv);\n  backDropContentContainer.appendChild(venmoMessageDiv);\n  backDropContentContainer.appendChild(instructionsDiv);\n  backDropContentContainer.appendChild(continueButton);\n  backDropContentContainer.appendChild(cancelButton);\n  backdropDiv.appendChild(backDropContentContainer);\n  document.body.appendChild(backdropDiv);\n\n  backdropDiv.addEventListener(\"click\", function (event) {\n    event.stopPropagation();\n  });\n}\n\n/**\n * Applies a backdrop over the page, and opens a popup to the supplied url. Uses supplied status and cancel functions to handle the flow.\n * @function runWebLogin\n * @ignore\n * @param {object} options Options for running the web login flow.\n * @param {string} options.venmoUrl Venmo url that is to be used for logging in.\n * @param {Venmo~checkPaymentContextStatusAndProcessResult} options.checkForStatusChange {@link Venmo~checkPaymentContextStatusAndProcessResult} to be invoked in order to check for a payment context status update.\n * @param {Venmo~cancelTokenization} options.cancelTokenization {@link Venmo~cancelTokenization} to be invoked when the appropriate payment context status is retrieved.\n * @param {boolean} options.debug A flag to control whether to use minified assets or not.\n * @returns {Promise} Returns a promise\n */\nfunction runWebLogin(options) {\n  buildAndStyleElements(options.styleCspNonce);\n\n  return openPopup(options);\n}\n\n/**\n * When using frameservice, it needs to be created separately from the action of opening. The setup process includes\n * steps that browsers may consider async or too disconnected from the user action required to open a popup.\n *\n * This function enables us to do that setup at an appropriate time.\n * @function setupDesktopWebLogin\n * @ignore\n * @param {object} options Options use for setting up the Desktop Web Login flow.\n * @param {string} options.assetsUrl Url that points to the hosted Braintree assets.\n * @param {boolean} options.debug A flag to control whether to use minified assets or not.\n\n * @returns {Promise} Returns a promise\n */\nfunction setupDesktopWebLogin(options) {\n  var extendedPromise = new ExtendedPromise();\n  var popupName = \"venmoDesktopWebLogin\";\n  var assetsUrl = options.assetsUrl;\n  var debug = options.debug || false;\n  var popupLocation = centeredPopupDimensions();\n  var assetsBaseUrl = assetsUrl + \"/web/\" + VERSION + \"/html\";\n\n  frameService.create(\n    {\n      name: popupName,\n      dispatchFrameUrl:\n        assetsBaseUrl + \"/dispatch-frame\" + useMin(debug) + \".html\",\n      openFrameUrl:\n        assetsBaseUrl + \"/venmo-landing-frame\" + useMin(debug) + \".html\",\n      top: popupLocation.top,\n      left: popupLocation.left,\n      height: POPUP_HEIGHT,\n      width: POPUP_WIDTH,\n    },\n    function (frameServiceInstance) {\n      extendedPromise.resolve(frameServiceInstance);\n    }\n  );\n\n  return extendedPromise;\n}\n\nmodule.exports = {\n  runWebLogin: runWebLogin,\n  openPopup: openPopup,\n  setupDesktopWebLogin: setupDesktopWebLogin,\n  POPUP_WIDTH: POPUP_WIDTH,\n  POPUP_HEIGHT: POPUP_HEIGHT,\n};\n\n},{\"../../lib/braintree-error\":148,\"../../lib/frame-service/external\":162,\"../../lib/use-min\":186,\"../shared/errors\":249,\"@braintree/extended-promise\":34}],254:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar analytics = _dereq_(\"../lib/analytics\");\nvar assign = _dereq_(\"../lib/assign\").assign;\nvar isBrowserSupported = _dereq_(\"./shared/supports-venmo\");\nvar browserDetection = _dereq_(\"./shared/browser-detection\");\nvar constants = _dereq_(\"./shared/constants\");\nvar errors = _dereq_(\"./shared/errors\");\nvar querystring = _dereq_(\"../lib/querystring\");\nvar isVerifiedDomain = _dereq_(\"../lib/is-verified-domain\");\nvar methods = _dereq_(\"../lib/methods\");\nvar convertMethodsToError = _dereq_(\"../lib/convert-methods-to-error\");\nvar wrapPromise = _dereq_(\"@braintree/wrap-promise\");\nvar BraintreeError = _dereq_(\"../lib/braintree-error\");\nvar inIframe = _dereq_(\"../lib/in-iframe\");\nvar ExtendedPromise = _dereq_(\"@braintree/extended-promise\");\nvar getVenmoUrl = _dereq_(\"./shared/get-venmo-url\");\nvar desktopWebLogin = _dereq_(\"./shared/web-login-backdrop\");\nvar snakeCaseToCamelCase = _dereq_(\"../lib/snake-case-to-camel-case\");\nvar urlParams = _dereq_(\"../lib/url-params\");\n\n// NEXT_MAJOR_VERSION the source code for this is actually in a\n// typescript repo called venmo-desktop, once the SDK is migrated\n// to typescript, we can move the TS files out of that separate\n// repo and into the web SDK properly\nvar createVenmoDesktop = _dereq_(\"./external/\");\nvar graphqlQueries = _dereq_(\"./external/queries\");\n\nvar VERSION = \"3.134.0\";\nvar DEFAULT_MOBILE_POLLING_INTERVAL = 250; // 1/4 second\nvar DEFAULT_MOBILE_EXPIRING_THRESHOLD = 300000; // 5 minutes\n\nExtendedPromise.suppressUnhandledPromiseMessage = true;\n\n/**\n * Venmo tokenize payload.\n * @typedef {object} Venmo~tokenizePayload\n * @property {string} nonce The payment method nonce.\n * @property {string} type The payment method type, always `VenmoAccount`.\n * @property {object} details Additional Venmo account details.\n * @property {string} details.username The username of the Venmo account.\n * @property {string} details.paymentContextId The context ID of the Venmo payment. Only available when used with {@link https://braintree.github.io/braintree-web/current/module-braintree-web_venmo.html#.create|`paymentMethodUsage`}.\n */\n\n/**\n * @class\n * @param {object} options The Venmo {@link module:braintree-web/venmo.create create} options.\n * @description <strong>Do not use this constructor directly. Use {@link module:braintree-web/venmo.create|braintree-web.venmo.create} instead.</strong>\n * @classdesc This class represents a Venmo component produced by {@link module:braintree-web/venmo.create|braintree-web/venmo.create}. Instances of this class have methods for tokenizing Venmo payments.\n */\n// eslint-disable-next-line complexity\nfunction Venmo(options) {\n  var self = this;\n\n  this._allowDesktopWebLogin = options.allowDesktopWebLogin || false;\n  this._mobileWebFallBack = options.mobileWebFallBack || false;\n  this._createPromise = options.createPromise;\n  this._allowNewBrowserTab = options.allowNewBrowserTab !== false;\n  this._allowWebviews = options.allowWebviews !== false;\n  this._allowDesktop = options.allowDesktop === true;\n  this._useRedirectForIOS = options.useRedirectForIOS === true;\n  this._profileId = options.profileId;\n  this._displayName = options.displayName;\n  this._deepLinkReturnUrl = options.deepLinkReturnUrl;\n  this._ignoreHistoryChanges = options.ignoreHistoryChanges;\n  this._paymentMethodUsage = (options.paymentMethodUsage || \"\").toUpperCase();\n  this._shouldUseLegacyFlow = !this._paymentMethodUsage;\n  this._requireManualReturn = options.requireManualReturn === true;\n  this._useDesktopQRFlow =\n    this._allowDesktop && this._isDesktop() && !this._allowDesktopWebLogin;\n  this._useAllowDesktopWebLogin =\n    this._allowDesktopWebLogin && this._isDesktop();\n  this._cannotHaveReturnUrls = inIframe() || this._requireManualReturn;\n  this._allowAndroidRecreation = options.allowAndroidRecreation !== false;\n  this._allowNonDefaultBrowsers = options.allowNonDefaultBrowsers !== false;\n  this._maxRetryCount = 3;\n  this._collectCustomerBillingAddress =\n    options.collectCustomerBillingAddress || false;\n  this._collectCustomerShippingAddress =\n    options.collectCustomerShippingAddress || false;\n  this._cancelOnReturnToBrowser = options.cancelOnReturnToBrowser === true;\n  this._isFinalAmount = options.isFinalAmount || false;\n  this._lineItems = options.lineItems;\n  this._subTotalAmount = options.subTotalAmount;\n  this._discountAmount = options.discountAmount;\n  this._taxAmount = options.taxAmount;\n  this._shippingAmount = options.shippingAmount;\n  this._totalAmount = options.totalAmount;\n  this._cspNonce =\n    (this._mobileWebFallBack || this._allowDesktopWebLogin) &&\n    (options.styleCspNonce || false);\n  this._mobilePollingInterval = DEFAULT_MOBILE_POLLING_INTERVAL;\n  this._mobilePollingExpiresThreshold = DEFAULT_MOBILE_EXPIRING_THRESHOLD;\n  this._pollCount = 0;\n\n  this._shouldCreateVenmoPaymentContext =\n    this._cannotHaveReturnUrls || !this._shouldUseLegacyFlow;\n\n  this._isIncognito = options._isIncognito;\n\n  analytics.sendEvent(\n    this._createPromise,\n    \"venmo.options.is-incognito.\" + String(Boolean(this._isIncognito))\n  );\n\n  analytics.sendEvent(\n    this._createPromise,\n    \"venmo.desktop-flow.configured.\" + String(Boolean(this._allowDesktop))\n  );\n\n  // if the url has a tokenization result, that indicates\n  // that it cannot be the desktop flow or the manual return\n  // flow. If it's the hash change with paymentMethodUsage\n  // flow, we want to skip creating a new payment context, since\n  // there is already a pending payment context waiting to be\n  // processed. For the hash change flow without paymentMethodUsage,\n  // no further actions are needed.\n  if (this.hasTokenizationResult()) {\n    analytics.sendEvent(\n      this._createPromise,\n      \"venmo.appswitch.return-in-new-tab\"\n    );\n  } else if (this._useDesktopQRFlow) {\n    this._createPromise = this._createPromise.then(function (client) {\n      var config = client.getConfiguration().gatewayConfiguration;\n\n      return createVenmoDesktop({\n        url:\n          config.assetsUrl +\n          \"/web/\" +\n          VERSION +\n          \"/html/venmo-desktop-frame.html\",\n        environment:\n          config.environment === \"production\" ? \"PRODUCTION\" : \"SANDBOX\",\n        profileId: self._profileId || config.payWithVenmo.merchantId,\n        paymentMethodUsage: self._paymentMethodUsage,\n        displayName: self._displayName,\n        Promise: Promise,\n        apiRequest: function (query, data) {\n          return client\n            .request({\n              api: \"graphQLApi\",\n              data: {\n                query: query,\n                variables: data,\n              },\n            })\n            .then(function (response) {\n              return response.data;\n            });\n        },\n        sendEvent: function (eventName) {\n          analytics.sendEvent(self._createPromise, eventName);\n        },\n        verifyDomain: isVerifiedDomain,\n      })\n        .then(function (venmoDesktopInstance) {\n          self._venmoDesktopInstance = venmoDesktopInstance;\n          analytics.sendEvent(\n            self._createPromise,\n            \"venmo.desktop-flow.presented\"\n          );\n\n          return client;\n        })\n        .catch(function () {\n          analytics.sendEvent(\n            self._createPromise,\n            \"venmo.desktop-flow.setup-failed\"\n          );\n          self._useDesktopQRFlow = false;\n\n          return client;\n        });\n    });\n  } else if (this._shouldCreateVenmoPaymentContext) {\n    this._createPromise = this._createPromise.then(function (client) {\n      var paymentContextPromise, webLoginPromise;\n      var analyticsCategory = self._cannotHaveReturnUrls\n        ? \"manual-return\"\n        : \"mobile-payment-context\";\n      var config = client.getConfiguration();\n\n      webLoginPromise = desktopWebLogin\n        .setupDesktopWebLogin({\n          assetsUrl: config.gatewayConfiguration.assetsUrl,\n          debug: config.isDebug,\n        })\n        .then(function (frameServiceInstance) {\n          self._frameServiceInstance = frameServiceInstance;\n        })\n        .catch(function (desktopWebErr) {\n          return desktopWebErr;\n        });\n\n      self._mobilePollingContextEnvironment =\n        config.gatewayConfiguration.environment.toUpperCase();\n\n      paymentContextPromise = self\n        ._createVenmoPaymentContext(client)\n        .then(function () {\n          analytics.sendEvent(\n            self._createPromise,\n            \"venmo.\" + analyticsCategory + \".presented\"\n          );\n\n          return client;\n        })\n        .catch(function (err) {\n          analytics.sendEvent(\n            self._createPromise,\n            \"venmo.\" + analyticsCategory + \".setup-failed\"\n          );\n\n          return Promise.reject(\n            new BraintreeError({\n              type: errors.VENMO_MOBILE_PAYMENT_CONTEXT_SETUP_FAILED.type,\n              code: errors.VENMO_MOBILE_PAYMENT_CONTEXT_SETUP_FAILED.code,\n              message: isValidationError(err)\n                ? err.details.originalError[0].message\n                : errors.VENMO_MOBILE_PAYMENT_CONTEXT_SETUP_FAILED.message,\n              details: {\n                originalError: err,\n              },\n            })\n          );\n        });\n\n      return ExtendedPromise.all([webLoginPromise, paymentContextPromise])\n        .then(function (results) {\n          var paymentContextResult = results[1]; // We only care about the returned value of the paymentContextPromise\n\n          return Promise.resolve(paymentContextResult);\n        })\n        .catch(function (promiseErr) {\n          // ExtendedPromise.all returns just one error and it's either which fails first/at all.\n          return Promise.reject(promiseErr);\n        });\n    });\n  }\n}\n\nfunction isValidationError(err) {\n  return (\n    err.details &&\n    err.details.originalError &&\n    err.details.originalError[0] &&\n    err.details.originalError[0].extensions &&\n    err.details.originalError[0].extensions.errorClass === \"VALIDATION\" &&\n    err.details.originalError[0].extensions.errorType === \"user_error\"\n  );\n}\n\nVenmo.prototype._createVenmoPaymentContext = function (\n  client,\n  cancelIfTokenizationInProgress\n) {\n  var self = this;\n  var promise, transactionDetails;\n  var configuration = client.getConfiguration();\n  var venmoConfiguration = configuration.gatewayConfiguration.payWithVenmo;\n  var transactionDetailsPresent = false;\n  var customerClientChannel = self._useAllowDesktopWebLogin\n    ? \"NATIVE_WEB\"\n    : \"MOBILE_WEB\";\n\n  if (!this._shouldCreateVenmoPaymentContext) {\n    return Promise.resolve();\n  }\n\n  if (this._shouldUseLegacyFlow) {\n    promise = client\n      .request({\n        api: \"graphQLApi\",\n        data: {\n          query: graphqlQueries.LEGACY_CREATE_PAYMENT_CONTEXT_QUERY,\n          variables: {\n            input: {\n              environment: this._mobilePollingContextEnvironment,\n              intent: \"PAY_FROM_APP\",\n            },\n          },\n        },\n      })\n      .then(function (response) {\n        return response.data.createVenmoQRCodePaymentContext\n          .venmoQRCodePaymentContext;\n      });\n  } else {\n    // Merchants are not allowed to collect user addresses unless ECD (Enriched Customer Data) is enabled on the BT Control Panel.\n    if (\n      (this._collectCustomerBillingAddress ||\n        this._collectCustomerShippingAddress) &&\n      !venmoConfiguration.enrichedCustomerDataEnabled\n    ) {\n      return Promise.reject(new BraintreeError(errors.VENMO_ECD_DISABLED));\n    }\n\n    if (this._lineItems) {\n      this._lineItems.forEach(function (item) {\n        item.unitTaxAmount = item.unitTaxAmount || \"0\";\n      });\n    }\n    transactionDetails = {\n      subTotalAmount: this._subTotalAmount,\n      discountAmount: this._discountAmount,\n      taxAmount: this._taxAmount,\n      shippingAmount: this._shippingAmount,\n      totalAmount: this._totalAmount,\n      lineItems: this._lineItems,\n    };\n    transactionDetailsPresent = Object.keys(transactionDetails).some(\n      function (detail) {\n        return transactionDetails[detail] !== undefined;\n      }\n    );\n\n    promise = client\n      .request({\n        api: \"graphQLApi\",\n        data: {\n          query: graphqlQueries.CREATE_PAYMENT_CONTEXT_QUERY,\n          variables: {\n            input: {\n              paymentMethodUsage: this._paymentMethodUsage,\n              intent: \"CONTINUE\",\n              customerClient: customerClientChannel,\n              isFinalAmount: this._isFinalAmount,\n              displayName: this._displayName,\n              paysheetDetails: {\n                collectCustomerBillingAddress:\n                  this._collectCustomerBillingAddress,\n                collectCustomerShippingAddress:\n                  this._collectCustomerShippingAddress,\n                transactionDetails: transactionDetailsPresent\n                  ? transactionDetails\n                  : undefined,\n              },\n            },\n          },\n        },\n      })\n      .then(function (response) {\n        return response.data.createVenmoPaymentContext.venmoPaymentContext;\n      });\n  }\n\n  return promise.then(function (context) {\n    var expiredTime = new Date(context.expiresAt) - new Date(context.createdAt);\n    var refreshIn = expiredTime * 0.6666;\n\n    // prevents multiple setTimeouts from firing from separate calls\n    // to create a payment context by canceling the previous one\n    // if there is a pending call\n    clearTimeout(self._refreshPaymentContextTimeout);\n    self._refreshPaymentContextTimeout = setTimeout(function () {\n      if (self._tokenizationInProgress) {\n        return;\n      }\n      self._createVenmoPaymentContext(client, true);\n    }, refreshIn);\n\n    if (cancelIfTokenizationInProgress && self._tokenizationInProgress) {\n      return;\n    }\n\n    self._venmoPaymentContextStatus = context.status;\n    self._venmoPaymentContextId = context.id;\n  });\n};\n\nVenmo.prototype._popupBridgeIsInstalled = function () {\n  return window.popupBridge && typeof window.popupBridge.open === \"function\";\n};\n\nVenmo.prototype._venmoNativeAppIsInstalled = function () {\n  return Boolean(\n    window.popupBridge &&\n      ((window.parent && window.parent.popupBridge.isVenmoInstalled) ||\n        window.popupBridge.isVenmoInstalled)\n  );\n};\n\n/**\n * Handle app switching when a deep link return URL is configured\n * @private\n * @param {string} url - The URL to redirect to\n * @returns {void}\n */\nVenmo.prototype._handleDeepLinkAppSwitch = function (url) {\n  if (isIosWebviewInDeepLinkReturnUrlFlow()) {\n    this._handleIosWebviewDeepLink(url);\n  } else if (this._popupBridgeIsInstalled()) {\n    this._handlePopupBridgeAppSwitch(url);\n  } else if (browserDetection.isAndroidWebview()) {\n    analytics.sendEvent(\n      this._createPromise,\n      \"venmo.appswitch.start.android-webview-redirect\"\n    );\n\n    if (inIframe()) {\n      this._handleIFrameBreakout(url);\n    } else {\n      window.location.href = url;\n    }\n  } else {\n    analytics.sendEvent(this._createPromise, \"venmo.appswitch.start.webview\");\n    this._venmoWindow = window.open(url);\n  }\n};\n\n/**\n * Handle app switching for iOS webview with deep link return URL\n * @private\n * @param {string} url - The URL to redirect to\n * @returns {void}\n */\nVenmo.prototype._handleIosWebviewDeepLink = function (url) {\n  analytics.sendEvent(this._createPromise, \"venmo.appswitch.start.ios-webview\");\n\n  if (inIframe()) {\n    this._handleIosWebviewInIframe(url);\n  } else if (\n    !this._venmoNativeAppIsInstalled() &&\n    this._popupBridgeIsInstalled()\n  ) {\n    this._handlePopupBridgeAppSwitch(url);\n  } else {\n    // Deep link URLs do not launch iOS apps from a webview when using window.open or PopupBridge.open\n    window.location.href = url;\n  }\n};\n\n/**\n * Handle iOS webview app switching when in an iframe\n * @private\n * @param {string} url - The URL to redirect to\n * @returns {void}\n */\nVenmo.prototype._handleIosWebviewInIframe = function (url) {\n  if (this._venmoNativeAppIsInstalled()) {\n    this._handleIFrameBreakout(url);\n  } else if (this._popupBridgeIsInstalled()) {\n    this._handlePopupBridgeAppSwitch(url);\n  } else {\n    this._handleIFrameBreakout(url);\n  }\n};\n\n/**\n * Handle app switching with PopupBridge\n * @private\n * @param {string} url - The URL to redirect to\n * @returns {void}\n */\nVenmo.prototype._handlePopupBridgeAppSwitch = function (url) {\n  analytics.sendEvent(\n    this._createPromise,\n    \"venmo.appswitch.start.popup-bridge\"\n  );\n  window.popupBridge.open(url);\n};\n\n/**\n * Handle app switching for standard browser environments\n * @private\n * @param {string} url - The URL to redirect to\n * @returns {void}\n */\nVenmo.prototype._handleBrowserAppSwitch = function (url) {\n  analytics.sendEvent(this._createPromise, \"venmo.appswitch.start.browser\");\n\n  if (\n    browserDetection.doesNotSupportWindowOpenInIos() ||\n    this._shouldUseRedirectStrategy()\n  ) {\n    window.location.href = url;\n  } else if (\n    this._mobileWebFallBack &&\n    browserDetection.isAndroid() &&\n    browserDetection.isChrome()\n  ) {\n    // Android chrome needs to use window.location.href\n    // to remain in the same tab as expected.\n    // Chrome now defaults to opening a new tab.\n    window.location.href = url;\n  } else {\n    this._venmoWindow = window.open(url);\n  }\n};\n\n/**\n * Handle breaking out of the iframe we're in\n * @private\n * @param {string} url - The URL to redirect to\n * @returns {void}\n */\nVenmo.prototype._handleIFrameBreakout = function (url) {\n  window.top.location.href = url;\n};\n\nVenmo.prototype.appSwitch = function (url) {\n  if (this._deepLinkReturnUrl) {\n    this._handleDeepLinkAppSwitch(url);\n  } else {\n    this._handleBrowserAppSwitch(url);\n  }\n};\n\nVenmo.prototype.getUrl = function () {\n  return this._createPromise.then(\n    function (client) {\n      var configuration = client.getConfiguration();\n      var params = {};\n      var currentUrl =\n        this._deepLinkReturnUrl ||\n        window.location.href.replace(window.location.hash, \"\");\n      var venmoConfiguration = configuration.gatewayConfiguration.payWithVenmo;\n      var analyticsMetadata = configuration.analyticsMetadata;\n      var accessToken = venmoConfiguration.accessToken;\n      var braintreeData = {\n        _meta: {\n          version: analyticsMetadata.sdkVersion,\n          integration: analyticsMetadata.integration,\n          platform: analyticsMetadata.platform,\n          sessionId: analyticsMetadata.sessionId,\n        },\n      };\n\n      this._isDebug = configuration.isDebug;\n      this._assetsUrl = configuration.gatewayConfiguration.assetsUrl;\n\n      currentUrl = currentUrl.replace(/#*$/, \"\");\n\n      if (this._venmoPaymentContextId) {\n        if (this._shouldUseLegacyFlow) {\n          // NEXT_MAJOR_VERSION stop adding the context id to the access token.\n          // the context id is placed here for backwards compatiblity\n          // with versions of the venmo app that did not support\n          // pulling the resource id off of the query params\n          accessToken += \"|pcid:\" + this._venmoPaymentContextId;\n        } else {\n          params.resource_id = this._venmoPaymentContextId; // eslint-disable-line camelcase\n        }\n      }\n\n      if (this._shouldIncludeReturnUrls() || this._useAllowDesktopWebLogin) {\n        if (this._useAllowDesktopWebLogin) {\n          currentUrl =\n            this._assetsUrl + \"/web/\" + VERSION + \"/html/redirect-frame.html\";\n        }\n        params[\"x-success\"] = currentUrl + \"#venmoSuccess=1\";\n        params[\"x-cancel\"] = currentUrl + \"#venmoCancel=1\";\n        params[\"x-error\"] = currentUrl + \"#venmoError=1\";\n      } else {\n        params[\"x-success\"] = \"NOOP\";\n        params[\"x-cancel\"] = \"NOOP\";\n        params[\"x-error\"] = \"NOOP\";\n      }\n\n      if (!this._allowAndroidRecreation) {\n        params.allowAndroidRecreation = 0;\n      } else {\n        params.allowAndroidRecreation = 1;\n      }\n\n      params.ua = window.navigator.userAgent;\n      params.braintree_merchant_id = // eslint-disable-line camelcase\n        this._profileId || venmoConfiguration.merchantId;\n      params.braintree_access_token = accessToken; // eslint-disable-line camelcase\n      params.braintree_environment = venmoConfiguration.environment; // eslint-disable-line camelcase\n      params.braintree_sdk_data = btoa(JSON.stringify(braintreeData)); // eslint-disable-line camelcase\n\n      return (\n        getVenmoUrl({\n          useAllowDesktopWebLogin: this._useAllowDesktopWebLogin,\n          mobileWebFallBack: this._mobileWebFallBack,\n        }) +\n        \"?\" +\n        querystring.stringify(params)\n      );\n    }.bind(this)\n  );\n};\n\n/**\n * Returns a boolean indicating whether the current browser supports Venmo as a payment method. Please note that iOS Chrome is not supported when the Venmo button is rendered in an iFrame.\n *\n * If `options.allowNewBrowserTab` is false when calling {@link module:braintree-web/venmo.create|venmo.create}, this method will return true only for browsers known to support returning from the Venmo app to the same browser tab. Currently, this is limited to iOS Safari and Android Chrome.\n * If `options.allowWebviews` is false when calling {@link module:braintree-web/venmo.create|venmo.create}, this method will return true only for mobile browsers that are not webviews.\n * @public\n * @returns {boolean} True if the current browser is supported, false if not.\n */\nVenmo.prototype.isBrowserSupported = function () {\n  return isBrowserSupported.isBrowserSupported({\n    allowNewBrowserTab: this._allowNewBrowserTab,\n    allowWebviews: this._allowWebviews,\n    allowDesktop: this._allowDesktop,\n    allowDesktopWebLogin: this._allowDesktopWebLogin,\n    allowNonDefaultBrowsers: this._allowNonDefaultBrowsers,\n  });\n};\n\n/**\n * Returns a boolean indicating whether a Venmo tokenization result is ready to be processed immediately.\n *\n * This method should be called after initialization to see if the result of Venmo authorization is available. If it returns true, call {@link Venmo#tokenize|tokenize} immediately to process the results.\n *\n * @public\n * @returns {boolean} True if the results of Venmo payment authorization are available and ready to process.\n */\nVenmo.prototype.hasTokenizationResult = function () {\n  return this._hasTokenizationResult();\n};\n\n// a private version that lets us pass in a custom hash\n// when listening on a hashchange event\nVenmo.prototype._hasTokenizationResult = function (hash) {\n  var params = getFragmentParameters(hash);\n  var paramsFromUrl = urlParams.getUrlParams();\n\n  if (paramsFromUrl.resource_id) {\n    this._venmoPaymentContextId = paramsFromUrl.resource_id;\n  } else if (params.id) {\n    this._venmoPaymentContextId = params.id;\n  }\n\n  return (\n    typeof (params.venmoSuccess || params.venmoError || params.venmoCancel) !==\n    \"undefined\"\n  );\n};\n\nVenmo.prototype._shouldIncludeReturnUrls = function () {\n  // When the SDK is initialized in a non-default mobile browser (but not webviews\n  // and not Android)), it is not possible to automatically return to the browser\n  // from which the Venmo app was launched. When return URLs are omitted,\n  // the Venmo app prompts the user to return manually.\n  //\n  // Note: webviews are excluded from this restriction because deep link return URLs are\n  // specifically designed to work with webviews.\n  // Note: Android is excluded from this restriction because it can always return to the\n  // browser from which the Venmo app was launched.\n  if (\n    isBrowserSupported.isNonDefaultBrowser() &&\n    !browserDetection.isWebview() &&\n    !browserDetection.isAndroid()\n  ) {\n    return false;\n  }\n\n  // When we do support non-default browsers, and a deep link\n  // return url is passed, we should always respect it and\n  // include the return urls so the venmo app can app switch back to it\n  if (this._deepLinkReturnUrl) {\n    return true;\n  }\n\n  // Cannot include return URLs if in iframe or manual return is required\n  if (this._cannotHaveReturnUrls) {\n    return false;\n  }\n\n  // Special case: iOS Safari in private mode should include return URLs\n  // because it does allow app switching back to Safari\n  if (this._isIncognito && browserDetection.isIosSafari()) {\n    return true;\n  }\n\n  // For all other incognito/private modes, exclude return URLs\n  if (this._isIncognito) {\n    return false;\n  }\n\n  // Default case: include return URLs\n  return true;\n};\n\nVenmo.prototype._isDesktop = function () {\n  return !(browserDetection.isIos() || browserDetection.isAndroid());\n};\n\n/**\n * Detects iOS Safari in iframe without Venmo app installed\n * @private\n * @returns {boolean} True if we're on iOS mobile web, in an iframe, and the Venmo app is not installed\n */\nVenmo.prototype._isIOSIframeWithoutVenmoApp = function () {\n  return (\n    browserDetection.isIos() &&\n    inIframe() &&\n    !this._venmoNativeAppIsInstalled() &&\n    !this._requireManualReturn // Respect explicit merchant override\n  );\n};\n\n/**\n * Launches the Venmo flow and returns a nonce payload.\n *\n * If {@link Venmo#hasTokenizationResult|hasTokenizationResult} returns true, calling tokenize will immediately process and return the results without initiating the Venmo payment authorization flow.\n *\n * Only one Venmo flow can be active at a time. One way to achieve this is to disable your Venmo button while the flow is open.\n * @public\n * @param {object} [options] Options for tokenization.\n * @param {number} [options.processResultsDelay=500] The amount of time in milliseconds to delay processing the results. In most cases, this value should be left as the default.\n * @param {callback} [callback] The second argument, <code>data</code>, is a {@link Venmo~tokenizePayload|tokenizePayload}. If no callback is provided, the method will return a Promise that resolves with a {@link Venmo~tokenizePayload|tokenizePayload}.\n * @returns {(Promise|void)} Returns a promise if no callback is provided.\n * @example\n * button.addEventListener('click', function () {\n *   // Disable the button so that we don't attempt to open multiple popups.\n *   button.setAttribute('disabled', 'disabled');\n *\n *   // Because tokenize opens a new window, this must be called\n *   // as a result of a user action, such as a button click.\n *   venmoInstance.tokenize().then(function (payload) {\n *     // Submit payload.nonce to your server\n *     // Use payload.username to get the Venmo username and display any UI\n *   }).catch(function (tokenizeError) {\n *     // Handle flow errors or premature flow closure\n *     switch (tokenizeErr.code) {\n *       case 'VENMO_APP_CANCELED':\n *         console.log('User canceled Venmo flow.');\n *         break;\n *       case 'VENMO_CANCELED':\n *         console.log('User canceled Venmo, or Venmo app is not available.');\n *         break;\n *       default:\n *         console.error('Error!', tokenizeErr);\n *     }\n *   }).then(function () {\n *     button.removeAttribute('disabled');\n *   });\n * });\n */\nVenmo.prototype.tokenize = function (options) {\n  var self = this;\n  var tokenizationPromise;\n\n  options = options || {};\n\n  if (this._tokenizationInProgress === true) {\n    return Promise.reject(\n      new BraintreeError(errors.VENMO_TOKENIZATION_REQUEST_ACTIVE)\n    );\n  }\n\n  this._tokenizationInProgress = true;\n  if (this._useDesktopQRFlow) {\n    // for the desktop flow, we create a venmo payment\n    // context and then present a qr code modal to the\n    // customer and they will open up their venmo app\n    // and scan it and approve the purchase on their\n    // mobile device. The sdk will start polling\n    // in order to determine when the status of the\n    // payment context has updated and then pass the\n    // resulting nonce back to the merchant.\n    tokenizationPromise = this._tokenizeForDesktopQRFlow(options);\n  } else if (this._useAllowDesktopWebLogin) {\n    /**\n     * For Desktop Web Login, we open a browser popup to allow for authorization. Once authorized, the redirect urls are used by Venmo, and we query the API for a payment context status update.\n     *\n     * - Payment context is created on initialization\n     * - Popup is opened to Venmo login url.\n     *  - The payment is authorized or canceled, and the popup is closed\n     * - Once the popup is closed, we query the API for a payment context status update\n     *\n     * This is an alternate, opt-in flow to be used the Desktop QR Flow is not desired for Pay with Venmo desktop experiences.\n     */\n    tokenizationPromise = this._tokenizeWebLoginWithRedirect(options);\n  } else if (\n    this._cannotHaveReturnUrls &&\n    !this._isIOSIframeWithoutVenmoApp()\n  ) {\n    // in the manual return strategy, we create the payment\n    // context on initialization, then continually poll once\n    // the app switch begins until we get a response indiciating\n    // the payment context was approved by the customer on the\n    // Venmo app. The payment context response also includes a\n    // nonce. There are 2 cases where we use the manual return\n    // strategy:\n    // 1. the sdk is instantiated in an iframe, because\n    //    the venmo app is unable to redirect automatically\n    //    when that is the case so we rely on the customer\n    //    to do a manual redirect and continunally poll for\n    //    updates on the payment context to get the nonce\n    // 2. same deal for when `requireManualReturn` is configured\n    // NOTE: We exclude iOS iframe without Venmo app because it causes\n    // network errors due to Apple's iframe cross-domain restrictions\n    tokenizationPromise = this._tokenizeForMobileWithManualReturn();\n  } else {\n    // the default mobile flow is to app switch to the\n    // venmo app, and then have the venmo app switch\n    // back to the page with the venmo nonce details\n    // encoded into the hash portion of the url. If\n    // `paymentMethodUsage` is provided when instantiating\n    // the sdk, we also create a payment context and pass\n    // the resource id to the Venmo app during the app switch.\n    // Once we get a succesful return, we ping the payment\n    // context query to get any additional data needed\n    // to send back to the merchant.\n    tokenizationPromise =\n      this._tokenizeForMobileWithHashChangeListeners(options);\n  }\n\n  return tokenizationPromise\n    .then(function (payload) {\n      return self._createPromise\n        .then(function (client) {\n          return self._createVenmoPaymentContext(client);\n        })\n        .then(function () {\n          self._tokenizationInProgress = false;\n          self._venmoWindow = null;\n\n          return formatTokenizePayload(payload);\n        });\n    })\n    .catch(function (err) {\n      return self._createPromise\n        .then(function (client) {\n          // We create a new Payment Context because if the last one failed, then presumably we don't want to use it again.\n          // On the first pass, we create the payment context at initialization, and since we used that first one we now need to create a new one\n          // for the next time someone tries to tokenize.\n          return self._createVenmoPaymentContext(client);\n        })\n        .then(function () {\n          self._tokenizationInProgress = false;\n          self._venmoWindow = null;\n\n          return Promise.reject(err);\n        });\n    });\n};\n\n/**\n * Cancels the venmo tokenization process\n *\n * @public\n * @function Venmo~cancelTokenization\n * @returns {(Promise|void)} Returns a promise if no callback is provided.\n * @example\n * venmoTokenizeButton.addEventListener('click', function () {\n *   venmoInstance.tokenize().then(function (payload) {\n *     // handle payload\n *   }).catch(function (err) {\n *     if (err.code === 'VENMO_TOKENIZATION_CANCELED_BY_MERCHANT') {\n *       // tokenization was canceled by calling cancelTokenization\n *     }\n *   });\n * });\n *\n * venmoCancelButton.addEventListener('click', function () {\n *   // Hide the button when the venmo flow is not in progress\n *   venmoCancelButton.style.display = \"none\";\n *\n *   venmoInstance.cancelTokenization().then(function () {\n *     // done canceling the flow\n *   }).catch(function (err) {\n *     // should only get here if there is no tokenization in progress\n *   });\n * });\n */\nVenmo.prototype.cancelTokenization = function () {\n  if (!this._tokenizationInProgress) {\n    return Promise.reject(\n      new BraintreeError(errors.VENMO_TOKENIZATION_REQUEST_NOT_ACTIVE)\n    );\n  }\n\n  this._removeVisibilityEventListener();\n\n  // important to reject the tokenization promise first\n  // so the tokenize method rejects with this error\n  // rather than a customer canceled error in the mobile\n  // polling and desktop flows\n  if (this._tokenizePromise) {\n    this._tokenizePromise.reject(\n      new BraintreeError(errors.VENMO_TOKENIZATION_CANCELED_BY_MERCHANT)\n    );\n  }\n\n  return Promise.all([\n    this._cancelMobilePaymentContext(),\n    this._cancelVenmoDesktopContext(),\n  ]);\n};\n\nVenmo.prototype._tokenizeWebLoginWithRedirect = function () {\n  var self = this;\n  var webLoginOptions;\n\n  analytics.sendEventPlus(\n    self._createPromise,\n    \"venmo.tokenize.web-login.start\",\n    {\n      context_id: self._venmoPaymentContextId, // eslint-disable-line camelcase\n    }\n  );\n  this._tokenizePromise = new ExtendedPromise();\n\n  return this.getUrl().then(function (url) {\n    webLoginOptions = {\n      checkForStatusChange:\n        self._checkPaymentContextStatusAndProcessResult.bind(self),\n      cancelTokenization: self.cancelTokenization.bind(self),\n      frameServiceInstance: self._frameServiceInstance,\n      venmoUrl: url,\n      debug: self._isDebug,\n      checkPaymentContextStatus: self._checkPaymentContextStatus.bind(self),\n    };\n    if (self._cspNonce) {\n      webLoginOptions = assign({}, webLoginOptions, {\n        styleCspNonce: self._cspNonce,\n      });\n    }\n    desktopWebLogin\n      .runWebLogin(webLoginOptions)\n      .then(function (payload) {\n        analytics.sendEventPlus(\n          self._createPromise,\n          \"venmo.tokenize.web-login.success\",\n          {\n            context_id: self._venmoPaymentContextId, // eslint-disable-line camelcase\n          }\n        );\n\n        self._tokenizePromise.resolve({\n          paymentMethodNonce: payload.paymentMethodId,\n          username: payload.userName,\n          payerInfo: payload.payerInfo,\n          id: self._venmoPaymentContextId,\n        });\n      })\n      .catch(function (err) {\n        analytics.sendEventPlus(\n          self._createPromise,\n          \"venmo.tokenize.web-login.failure\",\n          {\n            context_id: self._venmoPaymentContextId, // eslint-disable-line camelcase\n          }\n        );\n\n        self._tokenizePromise.reject(err);\n      });\n\n    return self._tokenizePromise;\n  });\n};\n\nVenmo.prototype._queryPaymentContextStatus = function (id) {\n  var self = this;\n\n  return this._createPromise\n    .then(function (client) {\n      var query = self._shouldUseLegacyFlow\n        ? graphqlQueries.LEGACY_VENMO_PAYMENT_CONTEXT_STATUS_QUERY\n        : graphqlQueries.VENMO_PAYMENT_CONTEXT_STATUS_QUERY;\n\n      return client.request({\n        api: \"graphQLApi\",\n        data: {\n          query: query,\n          variables: {\n            id: id,\n          },\n        },\n      });\n    })\n    .then(function (response) {\n      return response.data.node;\n    });\n};\n\n/**\n * Queries the GraphQL API to get the payment context and process the status. Retries until there is an update to the payment context status.\n * @name Venmo~checkPaymentContextStatusAndProcessResult\n * @ignore\n * @param {number} retryCount The counter for tracking number of retries made against the API.\n * @returns {Promise} Returns a promise\n */\nVenmo.prototype._checkPaymentContextStatusAndProcessResult = function (\n  retryCount\n) {\n  var self = this;\n\n  return self._checkPaymentContextStatus().then(function (node) {\n    var resultStatus = node.status;\n\n    if (resultStatus !== self._venmoPaymentContextStatus) {\n      self._venmoPaymentContextStatus = resultStatus;\n\n      analytics.sendEventPlus(\n        self._createPromise,\n        \"venmo.tokenize.web-login.status-change\",\n        {\n          context_id: self._venmoPaymentContextId, // eslint-disable-line camelcase\n        }\n      );\n\n      switch (resultStatus) {\n        case \"APPROVED\":\n          return Promise.resolve(node);\n        case \"CANCELED\":\n          return Promise.reject(\n            new BraintreeError(errors.VENMO_CUSTOMER_CANCELED)\n          );\n        case \"FAILED\":\n          return Promise.reject(\n            new BraintreeError(errors.VENMO_TOKENIZATION_FAILED)\n          );\n        default:\n      }\n    }\n\n    return new Promise(function (resolve, reject) {\n      if (retryCount < self._maxRetryCount) {\n        retryCount++;\n\n        self\n          ._checkPaymentContextStatusAndProcessResult(retryCount)\n          .then(resolve)\n          .catch(reject);\n      } else {\n        reject(new BraintreeError(errors.VENMO_TOKENIZATION_FAILED));\n      }\n    });\n  });\n};\n\nVenmo.prototype._checkPaymentContextStatus = function () {\n  var self = this;\n\n  return self\n    ._queryPaymentContextStatus(self._venmoPaymentContextId)\n    .catch(function (networkError) {\n      return Promise.reject(\n        new BraintreeError({\n          type: errors.VENMO_NETWORK_ERROR.type,\n          code: errors.VENMO_NETWORK_ERROR.code,\n          message: errors.VENMO_NETWORK_ERROR.message,\n          details: networkError,\n        })\n      );\n    })\n    .then(function (node) {\n      return Promise.resolve(node);\n    });\n};\n\nVenmo.prototype._validatePollingContext = function () {\n  if (!this._venmoPaymentContextId) {\n    return Promise.reject(\n      new BraintreeError(errors.VENMO_MOBILE_POLLING_TOKENIZATION_NO_CONTEXT_ID)\n    );\n  }\n\n  if (Date.now() > this._mobilePollingContextExpiresIn) {\n    return Promise.reject(\n      new BraintreeError(errors.VENMO_MOBILE_POLLING_TOKENIZATION_TIMEOUT)\n    );\n  }\n\n  return null;\n};\n\nVenmo.prototype._handleWindowClosure = function () {\n  var self = this;\n\n  if (\n    self._venmoWindow &&\n    self._venmoWindow.closed &&\n    self._venmoPaymentContextStatus === \"CREATED\"\n  ) {\n    analytics.sendEventPlus(\n      self._createPromise,\n      \"venmo.appswitch.browser-window.closed\",\n      {\n        context_id: self._venmoPaymentContextId, // eslint-disable-line camelcase\n      }\n    );\n\n    self\n      ._cancelMobilePaymentContext()\n      .then(function () {\n        analytics.sendEventPlus(\n          self._createPromise,\n          \"venmo.tokenize.manual-return.canceled\",\n          {\n            context_id: self._venmoPaymentContextId, // eslint-disable-line camelcase\n          }\n        );\n      })\n      .catch(function (_err) {\n        analytics.sendEventPlus(\n          self._createPromise,\n          \"venmo.tokenize.manual-return.canceled.error\",\n          {\n            context_id: self._venmoPaymentContextId, // eslint-disable-line camelcase\n          }\n        );\n      });\n\n    return Promise.reject(\n      new BraintreeError(errors.VENMO_MOBILE_POLLING_TOKENIZATION_CANCELED)\n    );\n  }\n\n  return null;\n};\n\nVenmo.prototype._handleCancelOnReturn = function () {\n  var self = this;\n  var minPollsBeforeCancel, params;\n\n  if (!self._cancelOnReturnToBrowser) {\n    return null;\n  }\n\n  minPollsBeforeCancel = Math.ceil(\n    constants.DEFAULT_PROCESS_RESULTS_DELAY / self._mobilePollingInterval\n  );\n  params = getFragmentParameters();\n\n  self._pollCount++;\n\n  if (\n    typeof (params.venmoSuccess || params.venmoError || params.venmoCancel) ===\n      \"undefined\" &&\n    self._venmoPaymentContextStatus === \"CREATED\" &&\n    self._pollCount >= minPollsBeforeCancel\n  ) {\n    analytics.sendEventPlus(\n      self._createPromise,\n      \"venmo.appswitch.cancel-on-return-to-browser\",\n      {\n        context_id: self._venmoPaymentContextId, // eslint-disable-line camelcase\n      }\n    );\n\n    return self\n      ._cancelMobilePaymentContext()\n      .then(function () {\n        analytics.sendEventPlus(\n          self._createPromise,\n          \"venmo.appswitch.cancel-on-return-to-browser.success\",\n          {\n            context_id: self._venmoPaymentContextId, // eslint-disable-line camelcase\n          }\n        );\n      })\n      .catch(function () {\n        analytics.sendEventPlus(\n          self._createPromise,\n          \"venmo.appswitch.cancel-on-return-to-browser.error\",\n          {\n            context_id: self._venmoPaymentContextId, // eslint-disable-line camelcase\n          }\n        );\n      })\n      .finally(function () {\n        self._pollCount = 0;\n      });\n  }\n\n  return null;\n};\n\nVenmo.prototype._handleStatusChange = function (node) {\n  var self = this;\n  var newStatus = node.status;\n\n  if (newStatus !== self._venmoPaymentContextStatus) {\n    self._venmoPaymentContextStatus = newStatus;\n\n    analytics.sendEventPlus(\n      self._createPromise,\n      \"venmo.tokenize.manual-return.status-change.\" + newStatus.toLowerCase(),\n      {\n        context_id: self._venmoPaymentContextId, // eslint-disable-line camelcase\n      }\n    );\n\n    switch (newStatus) {\n      case \"EXPIRED\":\n      case \"FAILED\":\n      case \"CANCELED\":\n        return Promise.reject(\n          new BraintreeError(\n            errors[\"VENMO_MOBILE_POLLING_TOKENIZATION_\" + newStatus]\n          )\n        );\n      case \"APPROVED\":\n        return Promise.resolve(node);\n      case \"CREATED\":\n      case \"SCANNED\":\n      default:\n      // any other statuses are irrelevant to the polling\n      // and can just be ignored\n    }\n  }\n\n  return self._continuePolling();\n};\n\nVenmo.prototype._continuePolling = function () {\n  var self = this;\n\n  return new Promise(function (resolve, reject) {\n    setTimeout(function () {\n      self._pollForStatusChange().then(resolve).catch(reject);\n    }, self._mobilePollingInterval);\n  });\n};\n\nVenmo.prototype._queryAndProcessStatus = function () {\n  var self = this;\n\n  return this._queryPaymentContextStatus(this._venmoPaymentContextId)\n    .catch(function (networkError) {\n      return Promise.reject(\n        new BraintreeError({\n          type: errors.VENMO_MOBILE_POLLING_TOKENIZATION_NETWORK_ERROR.type,\n          code: errors.VENMO_MOBILE_POLLING_TOKENIZATION_NETWORK_ERROR.code,\n          message:\n            errors.VENMO_MOBILE_POLLING_TOKENIZATION_NETWORK_ERROR.message,\n          details: {\n            originalError: networkError,\n          },\n        })\n      );\n    })\n    .then(function (node) {\n      return self._handleStatusChange(node);\n    });\n};\n\nVenmo.prototype._pollForStatusChange = function () {\n  var validationError = this._validatePollingContext();\n\n  if (validationError) {\n    return validationError;\n  }\n\n  var windowClosureResult = this._handleWindowClosure();\n  if (windowClosureResult) {\n    return windowClosureResult;\n  }\n\n  // This function might cancel the payment context. We will still rely on\n  // _queryAndProcessStatus to see that the status has changed to CANCELED.\n  this._handleCancelOnReturn();\n\n  return this._queryAndProcessStatus();\n};\n\nVenmo.prototype._tokenizeForMobileWithManualReturn = function () {\n  var self = this;\n\n  analytics.sendEventPlus(\n    this._createPromise,\n    \"venmo.tokenize.manual-return.start\",\n    {\n      context_id: self._venmoPaymentContextId, // eslint-disable-line camelcase\n    }\n  );\n\n  this._mobilePollingContextExpiresIn =\n    Date.now() + this._mobilePollingExpiresThreshold;\n  this._tokenizePromise = new ExtendedPromise();\n\n  this._pollForStatusChange()\n    .then(function (payload) {\n      analytics.sendEventPlus(\n        self._createPromise,\n        \"venmo.tokenize.manual-return.success\",\n        {\n          context_id: self._venmoPaymentContextId, // eslint-disable-line camelcase\n        }\n      );\n\n      self._tokenizePromise.resolve({\n        paymentMethodNonce: payload.paymentMethodId,\n        username: payload.userName,\n        payerInfo: payload.payerInfo,\n        id: self._venmoPaymentContextId,\n      });\n    })\n    .catch(function (err) {\n      analytics.sendEventPlus(\n        self._createPromise,\n        \"venmo.tokenize.manual-return.failure\",\n        {\n          context_id: self._venmoPaymentContextId, // eslint-disable-line camelcase\n        }\n      );\n\n      self._tokenizePromise.reject(err);\n    });\n\n  return this.getUrl().then(function (url) {\n    self.appSwitch(url);\n\n    return self._tokenizePromise;\n  });\n};\n\nVenmo.prototype._shouldUseRedirectStrategy = function () {\n  if (!browserDetection.isIos()) {\n    return false;\n  }\n\n  if (this._mobileWebFallBack === true) {\n    return true;\n  }\n\n  return this._useRedirectForIOS;\n};\n\nVenmo.prototype._tokenizeForMobileWithHashChangeListeners = function (options) {\n  var self = this;\n  var resultProcessingInProgress, visibilityChangeListenerTimeout;\n\n  if (this.hasTokenizationResult()) {\n    return this.processHashChangeFlowResults();\n  }\n\n  analytics.sendEvent(this._createPromise, \"venmo.tokenize.mobile.start\");\n  this._tokenizePromise = new ExtendedPromise();\n\n  this._previousHash = window.location.hash;\n\n  function completeFlow(hash) {\n    var error;\n\n    self\n      .processHashChangeFlowResults(hash)\n      .catch(function (err) {\n        error = err;\n      })\n      .then(function (res) {\n        if (\n          !self._ignoreHistoryChanges &&\n          window.location.hash !== self._previousHash\n        ) {\n          window.location.hash = self._previousHash;\n        }\n        self._removeVisibilityEventListener();\n\n        if (error) {\n          self._tokenizePromise.reject(error);\n        } else {\n          self._tokenizePromise.resolve(res);\n        }\n        delete self._tokenizePromise;\n      });\n  }\n\n  // The Venmo SDK app switches back with the results of the\n  // tokenization encoded in the hash\n  this._onHashChangeListener = function (e) {\n    var hash = e.newURL.split(\"#\")[1];\n\n    if (!self._hasTokenizationResult(hash)) {\n      return;\n    }\n\n    resultProcessingInProgress = true;\n    clearTimeout(visibilityChangeListenerTimeout);\n    completeFlow(hash);\n  };\n\n  window.addEventListener(\"hashchange\", this._onHashChangeListener, false);\n\n  // Subscribe to document visibility change events to detect when app switch\n  // has returned. Acts as a fallback for the hashchange listener and catches\n  // the cancel case via manual app switch back\n  this._visibilityChangeListener = function () {\n    var delay =\n      options.processResultsDelay || constants.DEFAULT_PROCESS_RESULTS_DELAY;\n\n    if (!window.document.hidden) {\n      if (self._venmoWindow && !self._venmoWindow.closed) {\n        self._venmoWindow.close();\n      }\n\n      if (!resultProcessingInProgress) {\n        visibilityChangeListenerTimeout = setTimeout(completeFlow, delay);\n      }\n    }\n  };\n\n  return this.getUrl().then(function (url) {\n    self.appSwitch(url);\n\n    // Add a brief delay to ignore visibility change events that occur right before app switch\n    setTimeout(function () {\n      window.document.addEventListener(\n        documentVisibilityChangeEventName(),\n        self._visibilityChangeListener\n      );\n    }, constants.DOCUMENT_VISIBILITY_CHANGE_EVENT_DELAY);\n\n    return self._tokenizePromise;\n  });\n};\n\nVenmo.prototype._tokenizeForDesktopQRFlow = function () {\n  var self = this;\n\n  analytics.sendEvent(this._createPromise, \"venmo.tokenize.desktop.start\");\n\n  this._tokenizePromise = new ExtendedPromise();\n\n  this._createPromise\n    .then(function () {\n      return self._venmoDesktopInstance.launchDesktopFlow();\n    })\n    .then(function (payload) {\n      self._venmoDesktopInstance.hideDesktopFlow();\n\n      analytics.sendEvent(\n        self._createPromise,\n        \"venmo.tokenize.desktop.success\"\n      );\n\n      self._tokenizePromise.resolve(payload);\n    })\n    .catch(function (err) {\n      analytics.sendEvent(\n        self._createPromise,\n        \"venmo.tokenize.desktop.failure\"\n      );\n\n      if (self._venmoDesktopInstance) {\n        self._venmoDesktopInstance.hideDesktopFlow();\n      }\n\n      if (err && err.reason === \"CUSTOMER_CANCELED\") {\n        self._tokenizePromise.reject(\n          new BraintreeError(errors.VENMO_DESKTOP_CANCELED)\n        );\n\n        return;\n      }\n\n      self._tokenizePromise.reject(\n        new BraintreeError({\n          type: errors.VENMO_DESKTOP_UNKNOWN_ERROR.type,\n          code: errors.VENMO_DESKTOP_UNKNOWN_ERROR.code,\n          message: errors.VENMO_DESKTOP_UNKNOWN_ERROR.message,\n          details: {\n            originalError: err,\n          },\n        })\n      );\n    });\n\n  return this._tokenizePromise;\n};\n\nVenmo.prototype._cancelMobilePaymentContext = function () {\n  var self = this;\n\n  return this._createPromise.then(function (client) {\n    var query;\n\n    if (self._venmoPaymentContextId) {\n      query = self._shouldUseLegacyFlow\n        ? graphqlQueries.LEGACY_UPDATE_PAYMENT_CONTEXT_QUERY\n        : graphqlQueries.UPDATE_PAYMENT_CONTEXT_QUERY;\n\n      return client.request({\n        api: \"graphQLApi\",\n        data: {\n          query: query,\n          variables: {\n            input: {\n              id: self._venmoPaymentContextId,\n              status: \"CANCELED\",\n            },\n          },\n        },\n      });\n    }\n\n    return Promise.resolve();\n  });\n};\n\nVenmo.prototype._cancelVenmoDesktopContext = function () {\n  var self = this;\n\n  return this._createPromise.then(function () {\n    if (self._venmoDesktopInstance) {\n      self._venmoDesktopInstance.updateVenmoDesktopPaymentContext(\"CANCELED\");\n    }\n\n    return Promise.resolve();\n  });\n};\n\n/**\n * Cleanly tear down anything set up by {@link module:braintree-web/venmo.create|create}.\n * @public\n * @param {callback} [callback] Called once teardown is complete. No data is returned if teardown completes successfully.\n * @example\n * venmoInstance.teardown();\n * @example <caption>With callback</caption>\n * venmoInstance.teardown(function () {\n *   // teardown is complete\n * });\n * @returns {(Promise|void)} Returns a promise if no callback is provided.\n */\nVenmo.prototype.teardown = function () {\n  var self = this;\n\n  this._removeVisibilityEventListener();\n\n  return this._createPromise.then(\n    function () {\n      if (self._venmoDesktopInstance) {\n        self._venmoDesktopInstance.teardown();\n      }\n\n      clearTimeout(self._refreshPaymentContextTimeout);\n      self._cancelMobilePaymentContext();\n\n      convertMethodsToError(this, methods(Venmo.prototype));\n    }.bind(this)\n  );\n};\n\nVenmo.prototype._removeVisibilityEventListener = function () {\n  window.removeEventListener(\"hashchange\", this._onHashChangeListener);\n  window.document.removeEventListener(\n    documentVisibilityChangeEventName(),\n    this._visibilityChangeListener\n  );\n\n  delete this._visibilityChangeListener;\n  delete this._onHashChangeListener;\n};\n\n/**\n * The hash parameter in this function is optional. If no hash parameter is passed, the `getFragmentParameters` function will default to the hash present in the website's URL instead.\n *\n * There are two scenarios where this method is called:\n *\n * 1. When called within a browser that is capable of returning to the same tab that started the Venmo flow, we set up a listener to detect hash changes in the url. Part of the return to the merchant's website from the Venmo app includes encoding the details of the purchase in the hash of the url. The callback is invoked and the hash is pulled off from the event payload. The reason we pull the hash off of the event payload instead of pulling it directly from the URL is because sometimes a single page app will use the hash parameter for it's routing system, and it's possible to hit a race condition where the routing code has already removed the Venmo specific attributes from the hash before we are able to pull it off the url. Grabbing the hash from the event handler instead ensures we get the Venmo details, no matter what the url is converted to.\n * 2. The other scenario is for browsers that cannot return to the same tab, and instead the Venmo app must open a new tab. Since there is no hash listener to pull the hash from, we pull the hash details directly from the url using the `getFragmentParameters` method.\n *\n * @ignore\n * @param {string} [hash] Optionally provided browser url hash.\n * @returns {Promise} Returns a promise\n */\nVenmo.prototype.processHashChangeFlowResults = function (hash) {\n  var self = this;\n  var params = getFragmentParameters(hash);\n\n  // NEXT_MAJOR_VERSION only rely on payment context status call and stop relying on the\n  // content of the hash\n\n  return new Promise(function (resolve, reject) {\n    if (!self._shouldUseLegacyFlow) {\n      self\n        ._pollForStatusChange()\n        .then(function (payload) {\n          analytics.sendEventPlus(\n            self._createPromise,\n            \"venmo.appswitch.handle.payment-context-status-query.success\",\n            {\n              context_id: self._venmoPaymentContextId, // eslint-disable-line camelcase\n            }\n          );\n\n          if (window.popupBridge) {\n            analytics.sendEvent(\n              self._createPromise,\n              \"popup-bridge:venmo:succeeded\"\n            );\n          }\n\n          return resolve({\n            paymentMethodNonce: payload.paymentMethodId,\n            username: payload.userName,\n            payerInfo: payload.payerInfo,\n            id: self._venmoPaymentContextId,\n          });\n        })\n        .catch(function (err) {\n          if (\n            err.code === errors.VENMO_MOBILE_POLLING_TOKENIZATION_CANCELED.code\n          ) {\n            if (window.popupBridge) {\n              analytics.sendEvent(\n                self._createPromise,\n                \"popup-bridge:venmo:canceled\"\n              );\n            }\n            // We want to reject in this case because if the process was canceled, we don't want to take the happy path\n            reject(err);\n          } else if (window.popupBridge) {\n            analytics.sendEvent(\n              self._createPromise,\n              \"popup-bridge:venmo:failed\"\n            );\n          }\n\n          analytics.sendEventPlus(\n            self._createPromise,\n            \"venmo.process-results.payment-context-status-query-failed\",\n            {\n              context_id: self._venmoPaymentContextId, // eslint-disable-line camelcase\n            }\n          );\n          // If the polling request fails, but not because of cancelization, we will rely on the params provided from the hash\n          resolve(params);\n        });\n    } else if (params.venmoSuccess) {\n      analytics.sendEvent(\n        self._createPromise,\n        \"venmo.appswitch.handle.success\"\n      );\n\n      if (window.popupBridge) {\n        analytics.sendEvent(\n          self._createPromise,\n          \"popup-bridge:venmo:succeeded\"\n        );\n      }\n\n      resolve(params);\n    } else if (params.venmoError) {\n      analytics.sendEvent(self._createPromise, \"venmo.appswitch.handle.error\");\n\n      if (window.popupBridge) {\n        analytics.sendEvent(self._createPromise, \"popup-bridge:venmo:failed\");\n      }\n\n      reject(\n        new BraintreeError({\n          type: errors.VENMO_APP_FAILED.type,\n          code: errors.VENMO_APP_FAILED.code,\n          message: errors.VENMO_APP_FAILED.message,\n          details: {\n            originalError: {\n              message: decodeURIComponent(params.errorMessage),\n              code: params.errorCode,\n            },\n          },\n        })\n      );\n    } else if (params.venmoCancel) {\n      analytics.sendEvent(self._createPromise, \"venmo.appswitch.handle.cancel\");\n\n      if (window.popupBridge) {\n        analytics.sendEvent(self._createPromise, \"popup-bridge:venmo:canceled\");\n      }\n\n      reject(new BraintreeError(errors.VENMO_APP_CANCELED));\n    } else {\n      // User has either manually switched back to browser, or app is not available for app switch\n      analytics.sendEvent(\n        self._createPromise,\n        \"venmo.appswitch.cancel-or-unavailable\"\n      );\n      reject(new BraintreeError(errors.VENMO_CANCELED));\n    }\n\n    self._clearFragmentParameters();\n  });\n};\n\nVenmo.prototype._clearFragmentParameters = function () {\n  if (this._ignoreHistoryChanges) {\n    return;\n  }\n\n  if (\n    typeof window.history.replaceState === \"function\" &&\n    window.location.hash\n  ) {\n    history.pushState(\n      {},\n      \"\",\n      window.location.href.slice(0, window.location.href.indexOf(\"#\"))\n    );\n  }\n};\n\nfunction getFragmentParameters(hash) {\n  var keyValuesArray = (hash || window.location.hash.substring(1)).split(\"&\");\n\n  var parsedParams = keyValuesArray.reduce(function (toReturn, keyValue) {\n    var parts = keyValue.split(\"=\");\n    // some Single Page Apps may pre-pend a / to the first value\n    // in the hash, assuming it's a route in their app\n    // instead of information from Venmo, this removes all\n    // non-alphanumeric characters from the keys in the params\n    var decodedKey = decodeURIComponent(parts[0]).replace(/\\W/g, \"\");\n    var key = snakeCaseToCamelCase(decodedKey);\n    var value = decodeURIComponent(parts[1]);\n\n    toReturn[key] = value;\n\n    return toReturn;\n  }, {});\n\n  if (parsedParams.resourceId) {\n    parsedParams.id = parsedParams.resourceId;\n  }\n\n  return parsedParams;\n}\n\nfunction formatUserName(username) {\n  username = username || \"\";\n\n  // NEXT_MAJOR_VERSION the web sdks have a prepended @ sign\n  // but the ios and android ones do not. This should be standardized\n  return \"@\" + username.replace(\"@\", \"\");\n}\n\nfunction formatTokenizePayload(payload) {\n  var formattedPayload = {\n    nonce: payload.paymentMethodNonce,\n    type: \"VenmoAccount\",\n    details: {\n      username: formatUserName(payload.username),\n      paymentContextId: payload.id,\n    },\n  };\n\n  if (payload.payerInfo) {\n    formattedPayload.details.payerInfo = payload.payerInfo;\n    formattedPayload.details.payerInfo.userName = formatUserName(\n      payload.payerInfo.userName\n    );\n  }\n\n  return formattedPayload;\n}\n\n// From https://developer.mozilla.org/en-US/docs/Web/API/Page_Visibility_API\nfunction documentVisibilityChangeEventName() {\n  var visibilityChange;\n\n  if (typeof window.document.hidden !== \"undefined\") {\n    // Opera 12.10 and Firefox 18 and later support\n    visibilityChange = \"visibilitychange\";\n  } else if (typeof window.document.msHidden !== \"undefined\") {\n    visibilityChange = \"msvisibilitychange\";\n  } else if (typeof window.document.webkitHidden !== \"undefined\") {\n    visibilityChange = \"webkitvisibilitychange\";\n  }\n\n  return visibilityChange;\n}\n\nfunction isIosWebviewInDeepLinkReturnUrlFlow() {\n  // we know it's a webview because this flow only gets\n  // used when checking the deep link flow\n  // test the platform here to get around custom useragents\n  return (\n    window.navigator.platform &&\n    /iPhone|iPad|iPod/.test(window.navigator.platform)\n  );\n}\n\nmodule.exports = wrapPromise.wrapPrototype(Venmo);\n\n},{\"../lib/analytics\":143,\"../lib/assign\":145,\"../lib/braintree-error\":148,\"../lib/convert-methods-to-error\":150,\"../lib/in-iframe\":174,\"../lib/is-verified-domain\":178,\"../lib/methods\":180,\"../lib/querystring\":182,\"../lib/snake-case-to-camel-case\":184,\"../lib/url-params\":185,\"./external/\":243,\"./external/queries\":244,\"./shared/browser-detection\":247,\"./shared/constants\":248,\"./shared/errors\":249,\"./shared/get-venmo-url\":251,\"./shared/supports-venmo\":252,\"./shared/web-login-backdrop\":253,\"@braintree/extended-promise\":34,\"@braintree/wrap-promise\":43}],255:[function(_dereq_,module,exports){\n\"use strict\";\n\n/**\n * @name BraintreeError.Visa Checkout - Creation Error Codes\n * @description Errors that occur when [creating the Visa Checkout component](./module-braintree-web_venmo.html#.create).\n * @property {MERCHANT} VISA_CHECKOUT_NOT_ENABLED Occurs when Visa Checkout is not enabled in the Braintree control panel.\n */\n\n/**\n * @name BraintreeError.Visa Checkout - createInitOptions Error Codes\n * @description Errors that occur when using the [`createInitOptions` method](./VisaCheckout.html#createInitOptions).\n * @property {MERCHANT} VISA_CHECKOUT_INIT_OPTIONS_REQUIRED Occurs when no options are provided to method.\n */\n\n/**\n * @name BraintreeError.Visa Checkout - tokenize Error Codes\n * @description Errors that occur when using the [`tokenize` method](./VisaCheckout.html#tokenize).\n * @property {MERCHANT} VISA_CHECKOUT_PAYMENT_REQUIRED Occurs when no payment data is not provided.\n * @property {NETWORK} VISA_CHECKOUT_TOKENIZATION Occurs when tokenization fails.\n */\n\nvar BraintreeError = _dereq_(\"../lib/braintree-error\");\n\nmodule.exports = {\n  VISA_CHECKOUT_NOT_ENABLED: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"VISA_CHECKOUT_NOT_ENABLED\",\n    message: \"Visa Checkout is not enabled for this merchant.\",\n  },\n  VISA_CHECKOUT_INIT_OPTIONS_REQUIRED: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"VISA_CHECKOUT_INIT_OPTIONS_REQUIRED\",\n    message: \"initOptions requires an object.\",\n  },\n  VISA_CHECKOUT_PAYMENT_REQUIRED: {\n    type: BraintreeError.types.MERCHANT,\n    code: \"VISA_CHECKOUT_PAYMENT_REQUIRED\",\n    message: \"tokenize requires callid, encKey, and encPaymentData.\",\n  },\n  VISA_CHECKOUT_TOKENIZATION: {\n    type: BraintreeError.types.NETWORK,\n    code: \"VISA_CHECKOUT_TOKENIZATION\",\n    message:\n      \"A network error occurred when processing the Visa Checkout payment.\",\n  },\n};\n\n},{\"../lib/braintree-error\":148}],256:[function(_dereq_,module,exports){\n\"use strict\";\n\n/**\n * @module braintree-web/visa-checkout\n * @description Processes Visa Checkout. *This component is currently in beta and is subject to change.*\n */\n\nvar basicComponentVerification = _dereq_(\"../lib/basic-component-verification\");\nvar BraintreeError = _dereq_(\"../lib/braintree-error\");\nvar createDeferredClient = _dereq_(\"../lib/create-deferred-client\");\nvar createAssetsUrl = _dereq_(\"../lib/create-assets-url\");\nvar VisaCheckout = _dereq_(\"./visa-checkout\");\nvar analytics = _dereq_(\"../lib/analytics\");\nvar errors = _dereq_(\"./errors\");\nvar VERSION = \"3.134.0\";\nvar wrapPromise = _dereq_(\"@braintree/wrap-promise\");\n\n/**\n * @static\n * @function create\n * @param {object} options Creation options:\n * @param {Client} [options.client] A {@link Client} instance.\n * @param {string} [options.authorization] A tokenizationKey or clientToken. Can be used in place of `options.client`.\n * @param {callback} [callback] The second argument, `data`, is the {@link VisaCheckout} instance. If no callback is provided, `create` returns a promise that resolves with the {@link VisaCheckout} instance.\n * @returns {(Promise|void)} Returns a promise if no callback is provided.\n */\nfunction create(options) {\n  var name = \"Visa Checkout\";\n\n  return basicComponentVerification\n    .verify({\n      name: name,\n      client: options.client,\n      authorization: options.authorization,\n    })\n    .then(function () {\n      return createDeferredClient.create({\n        authorization: options.authorization,\n        client: options.client,\n        debug: options.debug,\n        assetsUrl: createAssetsUrl.create(options.authorization),\n        name: name,\n      });\n    })\n    .then(function (client) {\n      options.client = client;\n\n      if (\n        !options.client.getConfiguration().gatewayConfiguration.visaCheckout\n      ) {\n        return Promise.reject(\n          new BraintreeError(errors.VISA_CHECKOUT_NOT_ENABLED)\n        );\n      }\n\n      analytics.sendEvent(options.client, \"visacheckout.initialized\");\n\n      return new VisaCheckout(options);\n    });\n}\n\nmodule.exports = {\n  create: wrapPromise(create),\n  /**\n   * @description The current version of the SDK, i.e. `{@pkg version}`.\n   * @type {string}\n   */\n  VERSION: VERSION,\n};\n\n},{\"../lib/analytics\":143,\"../lib/basic-component-verification\":146,\"../lib/braintree-error\":148,\"../lib/create-assets-url\":152,\"../lib/create-deferred-client\":154,\"./errors\":255,\"./visa-checkout\":257,\"@braintree/wrap-promise\":43}],257:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar BraintreeError = _dereq_(\"../lib/braintree-error\");\nvar analytics = _dereq_(\"../lib/analytics\");\nvar errors = _dereq_(\"./errors\");\nvar jsonClone = _dereq_(\"../lib/json-clone\");\nvar methods = _dereq_(\"../lib/methods\");\nvar convertMethodsToError = _dereq_(\"../lib/convert-methods-to-error\");\nvar wrapPromise = _dereq_(\"@braintree/wrap-promise\");\nvar cardTypeTransformMap = {\n  Visa: \"VISA\",\n  MasterCard: \"MASTERCARD\",\n  Discover: \"DISCOVER\",\n  \"American Express\": \"AMEX\",\n};\n\n/**\n * Visa Checkout Address object.\n * @typedef {object} VisaCheckout~Address\n * @property {string} countryCode The customer's country code.\n * @property {string} extendedAddress The customer's extended address.\n * @property {string} firstName The customer's first name.\n * @property {string} lastName The customer's last name.\n * @property {string} locality The customer's locality.\n * @property {string} postalCode The customer's postal code.\n * @property {string} region The customer's region.\n * @property {string} streetAddress The customer's street address.\n * @property {string} phoneNumber The customer's phone number.\n */\n\n/**\n * Visa Checkout UserData object.\n * @typedef {object} VisaCheckout~UserData\n * @property {string} userEmail The customer's email address.\n * @property {string} userFirstName The customer's first name.\n * @property {string} userLastName The customer's last name.\n * @property {string} userFullName The customer's full name.\n * @property {string} userName The customer's username.\n */\n\n/**\n * Visa Checkout tokenize payload.\n * @typedef {object} VisaCheckout~tokenizePayload\n * @property {string} nonce The payment method nonce.\n * @property {object} details Additional account details.\n * @property {string} details.cardType Type of card, ex: Visa, MasterCard.\n * @property {string} details.lastFour Last four digits of card number.\n * @property {string} details.lastTwo Last two digits of card number.\n * @property {string} description A human-readable description.\n * @property {string} type The payment method type, always `VisaCheckoutCard`.\n * @property {VisaCheckout~Address} billingAddress The customer's billing address.\n * @property {VisaCheckout~Address} shippingAddress The customer's shipping address.\n * @property {VisaCheckout~UserData} userData Information about the customer.\n * @property {object} binData Information about the card based on the bin.\n * @property {string} binData.commercial Possible values: 'Yes', 'No', 'Unknown'.\n * @property {string} binData.countryOfIssuance The country of issuance.\n * @property {string} binData.debit Possible values: 'Yes', 'No', 'Unknown'.\n * @property {string} binData.durbinRegulated Possible values: 'Yes', 'No', 'Unknown'.\n * @property {string} binData.healthcare Possible values: 'Yes', 'No', 'Unknown'.\n * @property {string} binData.issuingBank The issuing bank.\n * @property {string} binData.payroll Possible values: 'Yes', 'No', 'Unknown'.\n * @property {string} binData.prepaid Possible values: 'Yes', 'No', 'Unknown'.\n * @property {string} binData.productId The product id.\n * @property {string} binData.business Possible values: 'Yes', 'No', 'Unknown'.\n * @property {string} binData.consumer Possible values: 'Yes', 'No', 'Unknown'.\n * @property {string} binData.purchase Possible values: 'Yes', 'No', 'Unknown'.\n * @property {string} binData.corporate Possible values: 'Yes', 'No', 'Unknown'.\n */\n\n/**\n * @class\n * @param {object} options The Visa Checkout {@link module:braintree-web/visa-checkout.create create} options.\n * @description <strong>Do not use this constructor directly. Use {@link module:braintree-web/visa-checkout.create|braintree-web.visa-checkout.create} instead.</strong>\n * @classdesc This class represents a Visa Checkout component produced by {@link module:braintree-web/visa-checkout.create|braintree-web/visa-checkout.create}. Instances of this class have methods for interacting with Visa Checkout's JavaScript library.\n */\nfunction VisaCheckout(options) {\n  this._client = options.client;\n}\n\nfunction transformCardTypes(cardTypes) {\n  return cardTypes.reduce(function (acc, type) {\n    if (cardTypeTransformMap.hasOwnProperty(type)) {\n      return acc.concat(cardTypeTransformMap[type]);\n    }\n\n    return acc;\n  }, []);\n}\n\n/**\n * Creates an `initOptions` object from the passed `options`, applying properties that Braintree needs to transact Visa Checkout.\n *\n * Braintree will apply these properties if they do not exist on the given `options`:\n *  - `apikey`\n *  - `externalClientId`\n *  - `settings.payment.cardBrands`\n *\n * Braintree will overwrite `settings.dataLevel = 'FULL'` to access the full payment method.\n * @public\n * @param {object} options The base `initOptions` that will be used to init Visa Checkout.\n * @param {string} [options.apikey] The API key used to initialize Visa Checkout. When not supplied, Braintree will set this property.\n * @param {string} [options.externalClientId] The external client ID key used to initialize Visa Checkout. When not supplied, Braintree will set this property.\n * @param {object} [options.settings] The settings object used to initialize Visa Checkout.\n * @param {string} [options.settings.dataLevel] The data level used to initialize Visa Checkout. Braintree will overwrite this property to 'FULL'.\n * @param {object} [options.settings.payment] The payment object used to initialize Visa Checkout.\n * @param {string[]} [options.settings.payment.cardBrands] The card brands that Visa Checkout will allow the customer to pay with. When not supplied, Braintree will set this property.\n * @returns {object} `initOptions` The `initOptions` that Visa Checkout should be initialized with.\n */\nVisaCheckout.prototype.createInitOptions = function (options) {\n  var initOptions;\n  var gatewayConfiguration =\n    this._client.getConfiguration().gatewayConfiguration;\n  var visaCheckoutConfiguration = gatewayConfiguration.visaCheckout;\n\n  if (!options) {\n    throw new BraintreeError(errors.VISA_CHECKOUT_INIT_OPTIONS_REQUIRED);\n  }\n\n  initOptions = jsonClone(options);\n  initOptions.apikey = initOptions.apikey || visaCheckoutConfiguration.apikey;\n  initOptions.encryptionKey = visaCheckoutConfiguration.encryptionKey;\n  initOptions.externalClientId =\n    initOptions.externalClientId || visaCheckoutConfiguration.externalClientId;\n  initOptions.settings = initOptions.settings || {};\n  initOptions.settings.dataLevel = \"FULL\";\n  initOptions.settings.payment = initOptions.settings.payment || {};\n\n  if (!initOptions.settings.payment.cardBrands) {\n    initOptions.settings.payment.cardBrands = transformCardTypes(\n      gatewayConfiguration.visaCheckout.supportedCardTypes\n    );\n  }\n\n  return initOptions;\n};\n\n/**\n * Tokenizes the Visa Checkout payload, returning a payment method nonce.\n * @public\n * @param {object} payment The object that Visa Checkout supplies on `payment.success`.\n * @param {string} payment.callid Visa Checkout transaction ID associated with this payment.\n * @param {string} payment.encKey The encrypted key used to decrypt the payment data.\n * @param {string} payment.encPaymentData The encrypted payment data.\n * @param {callback} [callback] The second argument, <code>tokenizePayload</code> is a {@link VisaCheckout~tokenizePayload|tokenizePayload}. If no callback is provided, `tokenize` returns a promise that resolves with the {@link VisaCheckout~tokenizePayload|tokenizePayload}.\n * @returns {(Promise|void)} Returns a promise if no callback is provided.\n */\nVisaCheckout.prototype.tokenize = function (payment) {\n  var self = this;\n\n  if (!payment.callid || !payment.encKey || !payment.encPaymentData) {\n    return Promise.reject(\n      new BraintreeError(errors.VISA_CHECKOUT_PAYMENT_REQUIRED)\n    );\n  }\n\n  return this._client\n    .request({\n      method: \"post\",\n      endpoint: \"payment_methods/visa_checkout_cards\",\n      data: {\n        _meta: {\n          source: \"visa-checkout\",\n        },\n        visaCheckoutCard: {\n          callId: payment.callid,\n          encryptedPaymentData: payment.encPaymentData,\n          encryptedKey: payment.encKey,\n        },\n      },\n    })\n    .then(function (response) {\n      analytics.sendEvent(self._client, \"visacheckout.tokenize.succeeded\");\n\n      return response.visaCheckoutCards[0];\n    })\n    .catch(function (err) {\n      analytics.sendEvent(self._client, \"visacheckout.tokenize.failed\");\n\n      return Promise.reject(\n        new BraintreeError({\n          type: errors.VISA_CHECKOUT_TOKENIZATION.type,\n          code: errors.VISA_CHECKOUT_TOKENIZATION.code,\n          message: errors.VISA_CHECKOUT_TOKENIZATION.message,\n          details: {\n            originalError: err,\n          },\n        })\n      );\n    });\n};\n\n/**\n * Cleanly tear down anything set up by {@link module:braintree-web/visa-checkout.create|create}.\n * @public\n * @param {callback} [callback] Called once teardown is complete. No data is returned if teardown completes successfully.\n * @example\n * visaCheckoutInstance.teardown();\n * @example <caption>With callback</caption>\n * visaCheckoutInstance.teardown(function () {\n *   // teardown is complete\n * });\n * @returns {(Promise|void)} Returns a promise if no callback is provided.\n */\nVisaCheckout.prototype.teardown = function () {\n  convertMethodsToError(this, methods(VisaCheckout.prototype));\n\n  return Promise.resolve();\n};\n\nmodule.exports = wrapPromise.wrapPrototype(VisaCheckout);\n\n},{\"../lib/analytics\":143,\"../lib/braintree-error\":148,\"../lib/convert-methods-to-error\":150,\"../lib/json-clone\":179,\"../lib/methods\":180,\"./errors\":255,\"@braintree/wrap-promise\":43}]},{},[137])(137)\n});\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this-clause');\nvar aCallable = require('../internals/a-callable');\nvar NATIVE_BIND = require('../internals/function-bind-native');\n\nvar bind = uncurryThis(uncurryThis.bind);\n\n// optional / simple context binding\nmodule.exports = function (fn, that) {\n  aCallable(fn);\n  return that === undefined ? fn : NATIVE_BIND ? bind(fn, that) : function (/* ...args */) {\n    return fn.apply(that, arguments);\n  };\n};\n","'use strict';\nvar TO_STRING_TAG_SUPPORT = require('../internals/to-string-tag-support');\nvar defineBuiltIn = require('../internals/define-built-in');\nvar toString = require('../internals/object-to-string');\n\n// `Object.prototype.toString` method\n// https://tc39.es/ecma262/#sec-object.prototype.tostring\nif (!TO_STRING_TAG_SUPPORT) {\n  defineBuiltIn(Object.prototype, 'toString', toString, { unsafe: true });\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nfunction _export(target, all) {\n    for(var name in all)Object.defineProperty(target, name, {\n        enumerable: true,\n        get: all[name]\n    });\n}\n_export(exports, {\n    parseBoxShadowValue: function() {\n        return parseBoxShadowValue;\n    },\n    formatBoxShadowValue: function() {\n        return formatBoxShadowValue;\n    }\n});\nconst _splitAtTopLevelOnly = require(\"./splitAtTopLevelOnly\");\nlet KEYWORDS = new Set([\n    \"inset\",\n    \"inherit\",\n    \"initial\",\n    \"revert\",\n    \"unset\"\n]);\nlet SPACE = /\\ +(?![^(]*\\))/g // Similar to the one above, but with spaces instead.\n;\nlet LENGTH = /^-?(\\d+|\\.\\d+)(.*?)$/g;\nfunction parseBoxShadowValue(input) {\n    let shadows = (0, _splitAtTopLevelOnly.splitAtTopLevelOnly)(input, \",\");\n    return shadows.map((shadow)=>{\n        let value = shadow.trim();\n        let result = {\n            raw: value\n        };\n        let parts = value.split(SPACE);\n        let seen = new Set();\n        for (let part of parts){\n            // Reset index, since the regex is stateful.\n            LENGTH.lastIndex = 0;\n            // Keyword\n            if (!seen.has(\"KEYWORD\") && KEYWORDS.has(part)) {\n                result.keyword = part;\n                seen.add(\"KEYWORD\");\n            } else if (LENGTH.test(part)) {\n                if (!seen.has(\"X\")) {\n                    result.x = part;\n                    seen.add(\"X\");\n                } else if (!seen.has(\"Y\")) {\n                    result.y = part;\n                    seen.add(\"Y\");\n                } else if (!seen.has(\"BLUR\")) {\n                    result.blur = part;\n                    seen.add(\"BLUR\");\n                } else if (!seen.has(\"SPREAD\")) {\n                    result.spread = part;\n                    seen.add(\"SPREAD\");\n                }\n            } else {\n                if (!result.color) {\n                    result.color = part;\n                } else {\n                    if (!result.unknown) result.unknown = [];\n                    result.unknown.push(part);\n                }\n            }\n        }\n        // Check if valid\n        result.valid = result.x !== undefined && result.y !== undefined;\n        return result;\n    });\n}\nfunction formatBoxShadowValue(shadows) {\n    return shadows.map((shadow)=>{\n        if (!shadow.valid) {\n            return shadow.raw;\n        }\n        return [\n            shadow.keyword,\n            shadow.x,\n            shadow.y,\n            shadow.blur,\n            shadow.spread,\n            shadow.color\n        ].filter(Boolean).join(\" \");\n    }).join(\", \");\n}\n","'use strict';\nvar shared = require('../internals/shared');\nvar uid = require('../internals/uid');\n\nvar keys = shared('keys');\n\nmodule.exports = function (key) {\n  return keys[key] || (keys[key] = uid(key));\n};\n","let resolveConfig = require('./lib/public/resolve-config')\nmodule.exports = (resolveConfig.__esModule ? resolveConfig : { default: resolveConfig }).default\n","'use strict';\nvar ENVIRONMENT = require('../internals/environment');\n\nmodule.exports = ENVIRONMENT === 'NODE';\n","'use strict';\nvar toLength = require('../internals/to-length');\n\n// `LengthOfArrayLike` abstract operation\n// https://tc39.es/ecma262/#sec-lengthofarraylike\nmodule.exports = function (obj) {\n  return toLength(obj.length);\n};\n","'use strict';\nmodule.exports = {};\n","'use strict';\nvar defineBuiltIn = require('../internals/define-built-in');\n\nmodule.exports = function (target, src, options) {\n  for (var key in src) defineBuiltIn(target, key, src[key], options);\n  return target;\n};\n","'use strict';\nvar anObject = require('../internals/an-object');\nvar iteratorClose = require('../internals/iterator-close');\n\n// call something on iterator step with safe closing on error\nmodule.exports = function (iterator, fn, value, ENTRIES) {\n  try {\n    return ENTRIES ? fn(anObject(value)[0], value[1]) : fn(value);\n  } catch (error) {\n    iteratorClose(iterator, 'throw', error);\n  }\n};\n","/*!\n * Isotope v3.0.6\n *\n * Licensed GPLv3 for open source use\n * or Isotope Commercial License for commercial use\n *\n * https://isotope.metafizzy.co\n * Copyright 2010-2018 Metafizzy\n */\n\n( function( window, factory ) {\n  // universal module definition\n  /* jshint strict: false */ /*globals define, module, require */\n  if ( typeof define == 'function' && define.amd ) {\n    // AMD\n    define( [\n        'outlayer/outlayer',\n        'get-size/get-size',\n        'desandro-matches-selector/matches-selector',\n        'fizzy-ui-utils/utils',\n        './item',\n        './layout-mode',\n        // include default layout modes\n        './layout-modes/masonry',\n        './layout-modes/fit-rows',\n        './layout-modes/vertical'\n      ],\n      function( Outlayer, getSize, matchesSelector, utils, Item, LayoutMode ) {\n        return factory( window, Outlayer, getSize, matchesSelector, utils, Item, LayoutMode );\n      });\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n      window,\n      require('outlayer'),\n      require('get-size'),\n      require('desandro-matches-selector'),\n      require('fizzy-ui-utils'),\n      require('./item'),\n      require('./layout-mode'),\n      // include default layout modes\n      require('./layout-modes/masonry'),\n      require('./layout-modes/fit-rows'),\n      require('./layout-modes/vertical')\n    );\n  } else {\n    // browser global\n    window.Isotope = factory(\n      window,\n      window.Outlayer,\n      window.getSize,\n      window.matchesSelector,\n      window.fizzyUIUtils,\n      window.Isotope.Item,\n      window.Isotope.LayoutMode\n    );\n  }\n\n}( window, function factory( window, Outlayer, getSize, matchesSelector, utils,\n  Item, LayoutMode ) {\n\n'use strict';\n\n// -------------------------- vars -------------------------- //\n\nvar jQuery = window.jQuery;\n\n// -------------------------- helpers -------------------------- //\n\nvar trim = String.prototype.trim ?\n  function( str ) {\n    return str.trim();\n  } :\n  function( str ) {\n    return str.replace( /^\\s+|\\s+$/g, '' );\n  };\n\n// -------------------------- isotopeDefinition -------------------------- //\n\n  // create an Outlayer layout class\n  var Isotope = Outlayer.create( 'isotope', {\n    layoutMode: 'masonry',\n    isJQueryFiltering: true,\n    sortAscending: true\n  });\n\n  Isotope.Item = Item;\n  Isotope.LayoutMode = LayoutMode;\n\n  var proto = Isotope.prototype;\n\n  proto._create = function() {\n    this.itemGUID = 0;\n    // functions that sort items\n    this._sorters = {};\n    this._getSorters();\n    // call super\n    Outlayer.prototype._create.call( this );\n\n    // create layout modes\n    this.modes = {};\n    // start filteredItems with all items\n    this.filteredItems = this.items;\n    // keep of track of sortBys\n    this.sortHistory = [ 'original-order' ];\n    // create from registered layout modes\n    for ( var name in LayoutMode.modes ) {\n      this._initLayoutMode( name );\n    }\n  };\n\n  proto.reloadItems = function() {\n    // reset item ID counter\n    this.itemGUID = 0;\n    // call super\n    Outlayer.prototype.reloadItems.call( this );\n  };\n\n  proto._itemize = function() {\n    var items = Outlayer.prototype._itemize.apply( this, arguments );\n    // assign ID for original-order\n    for ( var i=0; i < items.length; i++ ) {\n      var item = items[i];\n      item.id = this.itemGUID++;\n    }\n    this._updateItemsSortData( items );\n    return items;\n  };\n\n\n  // -------------------------- layout -------------------------- //\n\n  proto._initLayoutMode = function( name ) {\n    var Mode = LayoutMode.modes[ name ];\n    // set mode options\n    // HACK extend initial options, back-fill in default options\n    var initialOpts = this.options[ name ] || {};\n    this.options[ name ] = Mode.options ?\n      utils.extend( Mode.options, initialOpts ) : initialOpts;\n    // init layout mode instance\n    this.modes[ name ] = new Mode( this );\n  };\n\n\n  proto.layout = function() {\n    // if first time doing layout, do all magic\n    if ( !this._isLayoutInited && this._getOption('initLayout') ) {\n      this.arrange();\n      return;\n    }\n    this._layout();\n  };\n\n  // private method to be used in layout() & magic()\n  proto._layout = function() {\n    // don't animate first layout\n    var isInstant = this._getIsInstant();\n    // layout flow\n    this._resetLayout();\n    this._manageStamps();\n    this.layoutItems( this.filteredItems, isInstant );\n\n    // flag for initalized\n    this._isLayoutInited = true;\n  };\n\n  // filter + sort + layout\n  proto.arrange = function( opts ) {\n    // set any options pass\n    this.option( opts );\n    this._getIsInstant();\n    // filter, sort, and layout\n\n    // filter\n    var filtered = this._filter( this.items );\n    this.filteredItems = filtered.matches;\n\n    this._bindArrangeComplete();\n\n    if ( this._isInstant ) {\n      this._noTransition( this._hideReveal, [ filtered ] );\n    } else {\n      this._hideReveal( filtered );\n    }\n\n    this._sort();\n    this._layout();\n  };\n  // alias to _init for main plugin method\n  proto._init = proto.arrange;\n\n  proto._hideReveal = function( filtered ) {\n    this.reveal( filtered.needReveal );\n    this.hide( filtered.needHide );\n  };\n\n  // HACK\n  // Don't animate/transition first layout\n  // Or don't animate/transition other layouts\n  proto._getIsInstant = function() {\n    var isLayoutInstant = this._getOption('layoutInstant');\n    var isInstant = isLayoutInstant !== undefined ? isLayoutInstant :\n      !this._isLayoutInited;\n    this._isInstant = isInstant;\n    return isInstant;\n  };\n\n  // listen for layoutComplete, hideComplete and revealComplete\n  // to trigger arrangeComplete\n  proto._bindArrangeComplete = function() {\n    // listen for 3 events to trigger arrangeComplete\n    var isLayoutComplete, isHideComplete, isRevealComplete;\n    var _this = this;\n    function arrangeParallelCallback() {\n      if ( isLayoutComplete && isHideComplete && isRevealComplete ) {\n        _this.dispatchEvent( 'arrangeComplete', null, [ _this.filteredItems ] );\n      }\n    }\n    this.once( 'layoutComplete', function() {\n      isLayoutComplete = true;\n      arrangeParallelCallback();\n    });\n    this.once( 'hideComplete', function() {\n      isHideComplete = true;\n      arrangeParallelCallback();\n    });\n    this.once( 'revealComplete', function() {\n      isRevealComplete = true;\n      arrangeParallelCallback();\n    });\n  };\n\n  // -------------------------- filter -------------------------- //\n\n  proto._filter = function( items ) {\n    var filter = this.options.filter;\n    filter = filter || '*';\n    var matches = [];\n    var hiddenMatched = [];\n    var visibleUnmatched = [];\n\n    var test = this._getFilterTest( filter );\n\n    // test each item\n    for ( var i=0; i < items.length; i++ ) {\n      var item = items[i];\n      if ( item.isIgnored ) {\n        continue;\n      }\n      // add item to either matched or unmatched group\n      var isMatched = test( item );\n      // item.isFilterMatched = isMatched;\n      // add to matches if its a match\n      if ( isMatched ) {\n        matches.push( item );\n      }\n      // add to additional group if item needs to be hidden or revealed\n      if ( isMatched && item.isHidden ) {\n        hiddenMatched.push( item );\n      } else if ( !isMatched && !item.isHidden ) {\n        visibleUnmatched.push( item );\n      }\n    }\n\n    // return collections of items to be manipulated\n    return {\n      matches: matches,\n      needReveal: hiddenMatched,\n      needHide: visibleUnmatched\n    };\n  };\n\n  // get a jQuery, function, or a matchesSelector test given the filter\n  proto._getFilterTest = function( filter ) {\n    if ( jQuery && this.options.isJQueryFiltering ) {\n      // use jQuery\n      return function( item ) {\n        return jQuery( item.element ).is( filter );\n      };\n    }\n    if ( typeof filter == 'function' ) {\n      // use filter as function\n      return function( item ) {\n        return filter( item.element );\n      };\n    }\n    // default, use filter as selector string\n    return function( item ) {\n      return matchesSelector( item.element, filter );\n    };\n  };\n\n  // -------------------------- sorting -------------------------- //\n\n  /**\n   * @params {Array} elems\n   * @public\n   */\n  proto.updateSortData = function( elems ) {\n    // get items\n    var items;\n    if ( elems ) {\n      elems = utils.makeArray( elems );\n      items = this.getItems( elems );\n    } else {\n      // update all items if no elems provided\n      items = this.items;\n    }\n\n    this._getSorters();\n    this._updateItemsSortData( items );\n  };\n\n  proto._getSorters = function() {\n    var getSortData = this.options.getSortData;\n    for ( var key in getSortData ) {\n      var sorter = getSortData[ key ];\n      this._sorters[ key ] = mungeSorter( sorter );\n    }\n  };\n\n  /**\n   * @params {Array} items - of Isotope.Items\n   * @private\n   */\n  proto._updateItemsSortData = function( items ) {\n    // do not update if no items\n    var len = items && items.length;\n\n    for ( var i=0; len && i < len; i++ ) {\n      var item = items[i];\n      item.updateSortData();\n    }\n  };\n\n  // ----- munge sorter ----- //\n\n  // encapsulate this, as we just need mungeSorter\n  // other functions in here are just for munging\n  var mungeSorter = ( function() {\n    // add a magic layer to sorters for convienent shorthands\n    // `.foo-bar` will use the text of .foo-bar querySelector\n    // `[foo-bar]` will use attribute\n    // you can also add parser\n    // `.foo-bar parseInt` will parse that as a number\n    function mungeSorter( sorter ) {\n      // if not a string, return function or whatever it is\n      if ( typeof sorter != 'string' ) {\n        return sorter;\n      }\n      // parse the sorter string\n      var args = trim( sorter ).split(' ');\n      var query = args[0];\n      // check if query looks like [an-attribute]\n      var attrMatch = query.match( /^\\[(.+)\\]$/ );\n      var attr = attrMatch && attrMatch[1];\n      var getValue = getValueGetter( attr, query );\n      // use second argument as a parser\n      var parser = Isotope.sortDataParsers[ args[1] ];\n      // parse the value, if there was a parser\n      sorter = parser ? function( elem ) {\n        return elem && parser( getValue( elem ) );\n      } :\n      // otherwise just return value\n      function( elem ) {\n        return elem && getValue( elem );\n      };\n\n      return sorter;\n    }\n\n    // get an attribute getter, or get text of the querySelector\n    function getValueGetter( attr, query ) {\n      // if query looks like [foo-bar], get attribute\n      if ( attr ) {\n        return function getAttribute( elem ) {\n          return elem.getAttribute( attr );\n        };\n      }\n\n      // otherwise, assume its a querySelector, and get its text\n      return function getChildText( elem ) {\n        var child = elem.querySelector( query );\n        return child && child.textContent;\n      };\n    }\n\n    return mungeSorter;\n  })();\n\n  // parsers used in getSortData shortcut strings\n  Isotope.sortDataParsers = {\n    'parseInt': function( val ) {\n      return parseInt( val, 10 );\n    },\n    'parseFloat': function( val ) {\n      return parseFloat( val );\n    }\n  };\n\n  // ----- sort method ----- //\n\n  // sort filteredItem order\n  proto._sort = function() {\n    if ( !this.options.sortBy ) {\n      return;\n    }\n    // keep track of sortBy History\n    var sortBys = utils.makeArray( this.options.sortBy );\n    if ( !this._getIsSameSortBy( sortBys ) ) {\n      // concat all sortBy and sortHistory, add to front, oldest goes in last\n      this.sortHistory = sortBys.concat( this.sortHistory );\n    }\n    // sort magic\n    var itemSorter = getItemSorter( this.sortHistory, this.options.sortAscending );\n    this.filteredItems.sort( itemSorter );\n  };\n\n  // check if sortBys is same as start of sortHistory\n  proto._getIsSameSortBy = function( sortBys ) {\n    for ( var i=0; i < sortBys.length; i++ ) {\n      if ( sortBys[i] != this.sortHistory[i] ) {\n        return false;\n      }\n    }\n    return true;\n  };\n\n  // returns a function used for sorting\n  function getItemSorter( sortBys, sortAsc ) {\n    return function sorter( itemA, itemB ) {\n      // cycle through all sortKeys\n      for ( var i = 0; i < sortBys.length; i++ ) {\n        var sortBy = sortBys[i];\n        var a = itemA.sortData[ sortBy ];\n        var b = itemB.sortData[ sortBy ];\n        if ( a > b || a < b ) {\n          // if sortAsc is an object, use the value given the sortBy key\n          var isAscending = sortAsc[ sortBy ] !== undefined ? sortAsc[ sortBy ] : sortAsc;\n          var direction = isAscending ? 1 : -1;\n          return ( a > b ? 1 : -1 ) * direction;\n        }\n      }\n      return 0;\n    };\n  }\n\n  // -------------------------- methods -------------------------- //\n\n  // get layout mode\n  proto._mode = function() {\n    var layoutMode = this.options.layoutMode;\n    var mode = this.modes[ layoutMode ];\n    if ( !mode ) {\n      // TODO console.error\n      throw new Error( 'No layout mode: ' + layoutMode );\n    }\n    // HACK sync mode's options\n    // any options set after init for layout mode need to be synced\n    mode.options = this.options[ layoutMode ];\n    return mode;\n  };\n\n  proto._resetLayout = function() {\n    // trigger original reset layout\n    Outlayer.prototype._resetLayout.call( this );\n    this._mode()._resetLayout();\n  };\n\n  proto._getItemLayoutPosition = function( item  ) {\n    return this._mode()._getItemLayoutPosition( item );\n  };\n\n  proto._manageStamp = function( stamp ) {\n    this._mode()._manageStamp( stamp );\n  };\n\n  proto._getContainerSize = function() {\n    return this._mode()._getContainerSize();\n  };\n\n  proto.needsResizeLayout = function() {\n    return this._mode().needsResizeLayout();\n  };\n\n  // -------------------------- adding & removing -------------------------- //\n\n  // HEADS UP overwrites default Outlayer appended\n  proto.appended = function( elems ) {\n    var items = this.addItems( elems );\n    if ( !items.length ) {\n      return;\n    }\n    // filter, layout, reveal new items\n    var filteredItems = this._filterRevealAdded( items );\n    // add to filteredItems\n    this.filteredItems = this.filteredItems.concat( filteredItems );\n  };\n\n  // HEADS UP overwrites default Outlayer prepended\n  proto.prepended = function( elems ) {\n    var items = this._itemize( elems );\n    if ( !items.length ) {\n      return;\n    }\n    // start new layout\n    this._resetLayout();\n    this._manageStamps();\n    // filter, layout, reveal new items\n    var filteredItems = this._filterRevealAdded( items );\n    // layout previous items\n    this.layoutItems( this.filteredItems );\n    // add to items and filteredItems\n    this.filteredItems = filteredItems.concat( this.filteredItems );\n    this.items = items.concat( this.items );\n  };\n\n  proto._filterRevealAdded = function( items ) {\n    var filtered = this._filter( items );\n    this.hide( filtered.needHide );\n    // reveal all new items\n    this.reveal( filtered.matches );\n    // layout new items, no transition\n    this.layoutItems( filtered.matches, true );\n    return filtered.matches;\n  };\n\n  /**\n   * Filter, sort, and layout newly-appended item elements\n   * @param {Array or NodeList or Element} elems\n   */\n  proto.insert = function( elems ) {\n    var items = this.addItems( elems );\n    if ( !items.length ) {\n      return;\n    }\n    // append item elements\n    var i, item;\n    var len = items.length;\n    for ( i=0; i < len; i++ ) {\n      item = items[i];\n      this.element.appendChild( item.element );\n    }\n    // filter new stuff\n    var filteredInsertItems = this._filter( items ).matches;\n    // set flag\n    for ( i=0; i < len; i++ ) {\n      items[i].isLayoutInstant = true;\n    }\n    this.arrange();\n    // reset flag\n    for ( i=0; i < len; i++ ) {\n      delete items[i].isLayoutInstant;\n    }\n    this.reveal( filteredInsertItems );\n  };\n\n  var _remove = proto.remove;\n  proto.remove = function( elems ) {\n    elems = utils.makeArray( elems );\n    var removeItems = this.getItems( elems );\n    // do regular thing\n    _remove.call( this, elems );\n    // bail if no items to remove\n    var len = removeItems && removeItems.length;\n    // remove elems from filteredItems\n    for ( var i=0; len && i < len; i++ ) {\n      var item = removeItems[i];\n      // remove item from collection\n      utils.removeFrom( this.filteredItems, item );\n    }\n  };\n\n  proto.shuffle = function() {\n    // update random sortData\n    for ( var i=0; i < this.items.length; i++ ) {\n      var item = this.items[i];\n      item.sortData.random = Math.random();\n    }\n    this.options.sortBy = 'random';\n    this._sort();\n    this._layout();\n  };\n\n  /**\n   * trigger fn without transition\n   * kind of hacky to have this in the first place\n   * @param {Function} fn\n   * @param {Array} args\n   * @returns ret\n   * @private\n   */\n  proto._noTransition = function( fn, args ) {\n    // save transitionDuration before disabling\n    var transitionDuration = this.options.transitionDuration;\n    // disable transition\n    this.options.transitionDuration = 0;\n    // do it\n    var returnValue = fn.apply( this, args );\n    // re-enable transition for reveal\n    this.options.transitionDuration = transitionDuration;\n    return returnValue;\n  };\n\n  // ----- helper methods ----- //\n\n  /**\n   * getter method for getting filtered item elements\n   * @returns {Array} elems - collection of item elements\n   */\n  proto.getFilteredItemElements = function() {\n    return this.filteredItems.map( function( item ) {\n      return item.element;\n    });\n  };\n\n  // -----  ----- //\n\n  return Isotope;\n\n}));\n","'use strict';\nmodule.exports = false;\n","'use strict';\nvar $ = require('../internals/export');\nvar globalThis = require('../internals/global-this');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar isForced = require('../internals/is-forced');\nvar defineBuiltIn = require('../internals/define-built-in');\nvar InternalMetadataModule = require('../internals/internal-metadata');\nvar iterate = require('../internals/iterate');\nvar anInstance = require('../internals/an-instance');\nvar isCallable = require('../internals/is-callable');\nvar isNullOrUndefined = require('../internals/is-null-or-undefined');\nvar isObject = require('../internals/is-object');\nvar fails = require('../internals/fails');\nvar checkCorrectnessOfIteration = require('../internals/check-correctness-of-iteration');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar inheritIfRequired = require('../internals/inherit-if-required');\n\nmodule.exports = function (CONSTRUCTOR_NAME, wrapper, common) {\n  var IS_MAP = CONSTRUCTOR_NAME.indexOf('Map') !== -1;\n  var IS_WEAK = CONSTRUCTOR_NAME.indexOf('Weak') !== -1;\n  var ADDER = IS_MAP ? 'set' : 'add';\n  var NativeConstructor = globalThis[CONSTRUCTOR_NAME];\n  var NativePrototype = NativeConstructor && NativeConstructor.prototype;\n  var Constructor = NativeConstructor;\n  var exported = {};\n\n  var fixMethod = function (KEY) {\n    var uncurriedNativeMethod = uncurryThis(NativePrototype[KEY]);\n    defineBuiltIn(NativePrototype, KEY,\n      KEY === 'add' ? function add(value) {\n        uncurriedNativeMethod(this, value === 0 ? 0 : value);\n        return this;\n      } : KEY === 'delete' ? function (key) {\n        return IS_WEAK && !isObject(key) ? false : uncurriedNativeMethod(this, key === 0 ? 0 : key);\n      } : KEY === 'get' ? function get(key) {\n        return IS_WEAK && !isObject(key) ? undefined : uncurriedNativeMethod(this, key === 0 ? 0 : key);\n      } : KEY === 'has' ? function has(key) {\n        return IS_WEAK && !isObject(key) ? false : uncurriedNativeMethod(this, key === 0 ? 0 : key);\n      } : function set(key, value) {\n        uncurriedNativeMethod(this, key === 0 ? 0 : key, value);\n        return this;\n      }\n    );\n  };\n\n  var REPLACE = isForced(\n    CONSTRUCTOR_NAME,\n    !isCallable(NativeConstructor) || !(IS_WEAK || NativePrototype.forEach && !fails(function () {\n      new NativeConstructor().entries().next();\n    }))\n  );\n\n  if (REPLACE) {\n    // create collection constructor\n    Constructor = common.getConstructor(wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER);\n    InternalMetadataModule.enable();\n  } else if (isForced(CONSTRUCTOR_NAME, true)) {\n    var instance = new Constructor();\n    // early implementations not supports chaining\n    var HASNT_CHAINING = instance[ADDER](IS_WEAK ? {} : -0, 1) !== instance;\n    // V8 ~ Chromium 40- weak-collections throws on primitives, but should return false\n    var THROWS_ON_PRIMITIVES = fails(function () { instance.has(1); });\n    // most early implementations doesn't supports iterables, most modern - not close it correctly\n    // eslint-disable-next-line no-new -- required for testing\n    var ACCEPT_ITERABLES = checkCorrectnessOfIteration(function (iterable) { new NativeConstructor(iterable); });\n    // for early implementations -0 and +0 not the same\n    var BUGGY_ZERO = !IS_WEAK && fails(function () {\n      // V8 ~ Chromium 42- fails only with 5+ elements\n      var $instance = new NativeConstructor();\n      var index = 5;\n      while (index--) $instance[ADDER](index, index);\n      return !$instance.has(-0);\n    });\n\n    if (!ACCEPT_ITERABLES) {\n      Constructor = wrapper(function (dummy, iterable) {\n        anInstance(dummy, NativePrototype);\n        var that = inheritIfRequired(new NativeConstructor(), dummy, Constructor);\n        if (!isNullOrUndefined(iterable)) iterate(iterable, that[ADDER], { that: that, AS_ENTRIES: IS_MAP });\n        return that;\n      });\n      Constructor.prototype = NativePrototype;\n      NativePrototype.constructor = Constructor;\n    }\n\n    if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) {\n      fixMethod('delete');\n      fixMethod('has');\n      IS_MAP && fixMethod('get');\n    }\n\n    if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER);\n\n    // weak collections should not contains .clear method\n    if (IS_WEAK && NativePrototype.clear) delete NativePrototype.clear;\n  }\n\n  exported[CONSTRUCTOR_NAME] = Constructor;\n  $({ global: true, constructor: true, forced: Constructor !== NativeConstructor }, exported);\n\n  setToStringTag(Constructor, CONSTRUCTOR_NAME);\n\n  if (!IS_WEAK) common.setStrong(Constructor, CONSTRUCTOR_NAME, IS_MAP);\n\n  return Constructor;\n};\n","'use strict';\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar create = require('../internals/object-create');\nvar defineProperty = require('../internals/object-define-property').f;\n\nvar UNSCOPABLES = wellKnownSymbol('unscopables');\nvar ArrayPrototype = Array.prototype;\n\n// Array.prototype[@@unscopables]\n// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables\nif (ArrayPrototype[UNSCOPABLES] === undefined) {\n  defineProperty(ArrayPrototype, UNSCOPABLES, {\n    configurable: true,\n    value: create(null)\n  });\n}\n\n// add a key to Array.prototype[@@unscopables]\nmodule.exports = function (key) {\n  ArrayPrototype[UNSCOPABLES][key] = true;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar call = require('../internals/function-call');\nvar aCallable = require('../internals/a-callable');\nvar newPromiseCapabilityModule = require('../internals/new-promise-capability');\nvar perform = require('../internals/perform');\nvar iterate = require('../internals/iterate');\nvar PROMISE_STATICS_INCORRECT_ITERATION = require('../internals/promise-statics-incorrect-iteration');\n\n// `Promise.all` method\n// https://tc39.es/ecma262/#sec-promise.all\n$({ target: 'Promise', stat: true, forced: PROMISE_STATICS_INCORRECT_ITERATION }, {\n  all: function all(iterable) {\n    var C = this;\n    var capability = newPromiseCapabilityModule.f(C);\n    var resolve = capability.resolve;\n    var reject = capability.reject;\n    var result = perform(function () {\n      var $promiseResolve = aCallable(C.resolve);\n      var values = [];\n      var counter = 0;\n      var remaining = 1;\n      iterate(iterable, function (promise) {\n        var index = counter++;\n        var alreadyCalled = false;\n        remaining++;\n        call($promiseResolve, C, promise).then(function (value) {\n          if (alreadyCalled) return;\n          alreadyCalled = true;\n          values[index] = value;\n          --remaining || resolve(values);\n        }, reject);\n      });\n      --remaining || resolve(values);\n    });\n    if (result.error) reject(result.value);\n    return capability.promise;\n  }\n});\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar defineBuiltIn = require('../internals/define-built-in');\nvar defineGlobalProperty = require('../internals/define-global-property');\nvar copyConstructorProperties = require('../internals/copy-constructor-properties');\nvar isForced = require('../internals/is-forced');\n\n/*\n  options.target         - name of the target object\n  options.global         - target is the global object\n  options.stat           - export as static methods of target\n  options.proto          - export as prototype methods of target\n  options.real           - real prototype method for the `pure` version\n  options.forced         - export even if the native feature is available\n  options.bind           - bind methods to the target, required for the `pure` version\n  options.wrap           - wrap constructors to preventing global pollution, required for the `pure` version\n  options.unsafe         - use the simple assignment of property instead of delete + defineProperty\n  options.sham           - add a flag to not completely full polyfills\n  options.enumerable     - export as enumerable property\n  options.dontCallGetSet - prevent calling a getter on target\n  options.name           - the .name of the function if it does not match the key\n*/\nmodule.exports = function (options, source) {\n  var TARGET = options.target;\n  var GLOBAL = options.global;\n  var STATIC = options.stat;\n  var FORCED, target, key, targetProperty, sourceProperty, descriptor;\n  if (GLOBAL) {\n    target = globalThis;\n  } else if (STATIC) {\n    target = globalThis[TARGET] || defineGlobalProperty(TARGET, {});\n  } else {\n    target = globalThis[TARGET] && globalThis[TARGET].prototype;\n  }\n  if (target) for (key in source) {\n    sourceProperty = source[key];\n    if (options.dontCallGetSet) {\n      descriptor = getOwnPropertyDescriptor(target, key);\n      targetProperty = descriptor && descriptor.value;\n    } else targetProperty = target[key];\n    FORCED = isForced(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced);\n    // contained in target\n    if (!FORCED && targetProperty !== undefined) {\n      if (typeof sourceProperty == typeof targetProperty) continue;\n      copyConstructorProperties(sourceProperty, targetProperty);\n    }\n    // add a flag to not completely full polyfills\n    if (options.sham || (targetProperty && targetProperty.sham)) {\n      createNonEnumerableProperty(sourceProperty, 'sham', true);\n    }\n    defineBuiltIn(target, key, sourceProperty, options);\n  }\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nObject.defineProperty(exports, \"default\", {\n    enumerable: true,\n    get: function() {\n        return _default;\n    }\n});\nconst _default = {\n    aliceblue: [\n        240,\n        248,\n        255\n    ],\n    antiquewhite: [\n        250,\n        235,\n        215\n    ],\n    aqua: [\n        0,\n        255,\n        255\n    ],\n    aquamarine: [\n        127,\n        255,\n        212\n    ],\n    azure: [\n        240,\n        255,\n        255\n    ],\n    beige: [\n        245,\n        245,\n        220\n    ],\n    bisque: [\n        255,\n        228,\n        196\n    ],\n    black: [\n        0,\n        0,\n        0\n    ],\n    blanchedalmond: [\n        255,\n        235,\n        205\n    ],\n    blue: [\n        0,\n        0,\n        255\n    ],\n    blueviolet: [\n        138,\n        43,\n        226\n    ],\n    brown: [\n        165,\n        42,\n        42\n    ],\n    burlywood: [\n        222,\n        184,\n        135\n    ],\n    cadetblue: [\n        95,\n        158,\n        160\n    ],\n    chartreuse: [\n        127,\n        255,\n        0\n    ],\n    chocolate: [\n        210,\n        105,\n        30\n    ],\n    coral: [\n        255,\n        127,\n        80\n    ],\n    cornflowerblue: [\n        100,\n        149,\n        237\n    ],\n    cornsilk: [\n        255,\n        248,\n        220\n    ],\n    crimson: [\n        220,\n        20,\n        60\n    ],\n    cyan: [\n        0,\n        255,\n        255\n    ],\n    darkblue: [\n        0,\n        0,\n        139\n    ],\n    darkcyan: [\n        0,\n        139,\n        139\n    ],\n    darkgoldenrod: [\n        184,\n        134,\n        11\n    ],\n    darkgray: [\n        169,\n        169,\n        169\n    ],\n    darkgreen: [\n        0,\n        100,\n        0\n    ],\n    darkgrey: [\n        169,\n        169,\n        169\n    ],\n    darkkhaki: [\n        189,\n        183,\n        107\n    ],\n    darkmagenta: [\n        139,\n        0,\n        139\n    ],\n    darkolivegreen: [\n        85,\n        107,\n        47\n    ],\n    darkorange: [\n        255,\n        140,\n        0\n    ],\n    darkorchid: [\n        153,\n        50,\n        204\n    ],\n    darkred: [\n        139,\n        0,\n        0\n    ],\n    darksalmon: [\n        233,\n        150,\n        122\n    ],\n    darkseagreen: [\n        143,\n        188,\n        143\n    ],\n    darkslateblue: [\n        72,\n        61,\n        139\n    ],\n    darkslategray: [\n        47,\n        79,\n        79\n    ],\n    darkslategrey: [\n        47,\n        79,\n        79\n    ],\n    darkturquoise: [\n        0,\n        206,\n        209\n    ],\n    darkviolet: [\n        148,\n        0,\n        211\n    ],\n    deeppink: [\n        255,\n        20,\n        147\n    ],\n    deepskyblue: [\n        0,\n        191,\n        255\n    ],\n    dimgray: [\n        105,\n        105,\n        105\n    ],\n    dimgrey: [\n        105,\n        105,\n        105\n    ],\n    dodgerblue: [\n        30,\n        144,\n        255\n    ],\n    firebrick: [\n        178,\n        34,\n        34\n    ],\n    floralwhite: [\n        255,\n        250,\n        240\n    ],\n    forestgreen: [\n        34,\n        139,\n        34\n    ],\n    fuchsia: [\n        255,\n        0,\n        255\n    ],\n    gainsboro: [\n        220,\n        220,\n        220\n    ],\n    ghostwhite: [\n        248,\n        248,\n        255\n    ],\n    gold: [\n        255,\n        215,\n        0\n    ],\n    goldenrod: [\n        218,\n        165,\n        32\n    ],\n    gray: [\n        128,\n        128,\n        128\n    ],\n    green: [\n        0,\n        128,\n        0\n    ],\n    greenyellow: [\n        173,\n        255,\n        47\n    ],\n    grey: [\n        128,\n        128,\n        128\n    ],\n    honeydew: [\n        240,\n        255,\n        240\n    ],\n    hotpink: [\n        255,\n        105,\n        180\n    ],\n    indianred: [\n        205,\n        92,\n        92\n    ],\n    indigo: [\n        75,\n        0,\n        130\n    ],\n    ivory: [\n        255,\n        255,\n        240\n    ],\n    khaki: [\n        240,\n        230,\n        140\n    ],\n    lavender: [\n        230,\n        230,\n        250\n    ],\n    lavenderblush: [\n        255,\n        240,\n        245\n    ],\n    lawngreen: [\n        124,\n        252,\n        0\n    ],\n    lemonchiffon: [\n        255,\n        250,\n        205\n    ],\n    lightblue: [\n        173,\n        216,\n        230\n    ],\n    lightcoral: [\n        240,\n        128,\n        128\n    ],\n    lightcyan: [\n        224,\n        255,\n        255\n    ],\n    lightgoldenrodyellow: [\n        250,\n        250,\n        210\n    ],\n    lightgray: [\n        211,\n        211,\n        211\n    ],\n    lightgreen: [\n        144,\n        238,\n        144\n    ],\n    lightgrey: [\n        211,\n        211,\n        211\n    ],\n    lightpink: [\n        255,\n        182,\n        193\n    ],\n    lightsalmon: [\n        255,\n        160,\n        122\n    ],\n    lightseagreen: [\n        32,\n        178,\n        170\n    ],\n    lightskyblue: [\n        135,\n        206,\n        250\n    ],\n    lightslategray: [\n        119,\n        136,\n        153\n    ],\n    lightslategrey: [\n        119,\n        136,\n        153\n    ],\n    lightsteelblue: [\n        176,\n        196,\n        222\n    ],\n    lightyellow: [\n        255,\n        255,\n        224\n    ],\n    lime: [\n        0,\n        255,\n        0\n    ],\n    limegreen: [\n        50,\n        205,\n        50\n    ],\n    linen: [\n        250,\n        240,\n        230\n    ],\n    magenta: [\n        255,\n        0,\n        255\n    ],\n    maroon: [\n        128,\n        0,\n        0\n    ],\n    mediumaquamarine: [\n        102,\n        205,\n        170\n    ],\n    mediumblue: [\n        0,\n        0,\n        205\n    ],\n    mediumorchid: [\n        186,\n        85,\n        211\n    ],\n    mediumpurple: [\n        147,\n        112,\n        219\n    ],\n    mediumseagreen: [\n        60,\n        179,\n        113\n    ],\n    mediumslateblue: [\n        123,\n        104,\n        238\n    ],\n    mediumspringgreen: [\n        0,\n        250,\n        154\n    ],\n    mediumturquoise: [\n        72,\n        209,\n        204\n    ],\n    mediumvioletred: [\n        199,\n        21,\n        133\n    ],\n    midnightblue: [\n        25,\n        25,\n        112\n    ],\n    mintcream: [\n        245,\n        255,\n        250\n    ],\n    mistyrose: [\n        255,\n        228,\n        225\n    ],\n    moccasin: [\n        255,\n        228,\n        181\n    ],\n    navajowhite: [\n        255,\n        222,\n        173\n    ],\n    navy: [\n        0,\n        0,\n        128\n    ],\n    oldlace: [\n        253,\n        245,\n        230\n    ],\n    olive: [\n        128,\n        128,\n        0\n    ],\n    olivedrab: [\n        107,\n        142,\n        35\n    ],\n    orange: [\n        255,\n        165,\n        0\n    ],\n    orangered: [\n        255,\n        69,\n        0\n    ],\n    orchid: [\n        218,\n        112,\n        214\n    ],\n    palegoldenrod: [\n        238,\n        232,\n        170\n    ],\n    palegreen: [\n        152,\n        251,\n        152\n    ],\n    paleturquoise: [\n        175,\n        238,\n        238\n    ],\n    palevioletred: [\n        219,\n        112,\n        147\n    ],\n    papayawhip: [\n        255,\n        239,\n        213\n    ],\n    peachpuff: [\n        255,\n        218,\n        185\n    ],\n    peru: [\n        205,\n        133,\n        63\n    ],\n    pink: [\n        255,\n        192,\n        203\n    ],\n    plum: [\n        221,\n        160,\n        221\n    ],\n    powderblue: [\n        176,\n        224,\n        230\n    ],\n    purple: [\n        128,\n        0,\n        128\n    ],\n    rebeccapurple: [\n        102,\n        51,\n        153\n    ],\n    red: [\n        255,\n        0,\n        0\n    ],\n    rosybrown: [\n        188,\n        143,\n        143\n    ],\n    royalblue: [\n        65,\n        105,\n        225\n    ],\n    saddlebrown: [\n        139,\n        69,\n        19\n    ],\n    salmon: [\n        250,\n        128,\n        114\n    ],\n    sandybrown: [\n        244,\n        164,\n        96\n    ],\n    seagreen: [\n        46,\n        139,\n        87\n    ],\n    seashell: [\n        255,\n        245,\n        238\n    ],\n    sienna: [\n        160,\n        82,\n        45\n    ],\n    silver: [\n        192,\n        192,\n        192\n    ],\n    skyblue: [\n        135,\n        206,\n        235\n    ],\n    slateblue: [\n        106,\n        90,\n        205\n    ],\n    slategray: [\n        112,\n        128,\n        144\n    ],\n    slategrey: [\n        112,\n        128,\n        144\n    ],\n    snow: [\n        255,\n        250,\n        250\n    ],\n    springgreen: [\n        0,\n        255,\n        127\n    ],\n    steelblue: [\n        70,\n        130,\n        180\n    ],\n    tan: [\n        210,\n        180,\n        140\n    ],\n    teal: [\n        0,\n        128,\n        128\n    ],\n    thistle: [\n        216,\n        191,\n        216\n    ],\n    tomato: [\n        255,\n        99,\n        71\n    ],\n    turquoise: [\n        64,\n        224,\n        208\n    ],\n    violet: [\n        238,\n        130,\n        238\n    ],\n    wheat: [\n        245,\n        222,\n        179\n    ],\n    white: [\n        255,\n        255,\n        255\n    ],\n    whitesmoke: [\n        245,\n        245,\n        245\n    ],\n    yellow: [\n        255,\n        255,\n        0\n    ],\n    yellowgreen: [\n        154,\n        205,\n        50\n    ]\n};\n","'use strict';\nvar hasOwn = require('../internals/has-own-property');\n\nmodule.exports = function (descriptor) {\n  return descriptor !== undefined && (hasOwn(descriptor, 'value') || hasOwn(descriptor, 'writable'));\n};\n","\"use strict\";\n\nexports.__esModule = true;\nexports[\"default\"] = tokenize;\nexports.FIELDS = void 0;\n\nvar t = _interopRequireWildcard(require(\"./tokenTypes\"));\n\nvar _unescapable, _wordDelimiters;\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { \"default\": obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj[\"default\"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nvar unescapable = (_unescapable = {}, _unescapable[t.tab] = true, _unescapable[t.newline] = true, _unescapable[t.cr] = true, _unescapable[t.feed] = true, _unescapable);\nvar wordDelimiters = (_wordDelimiters = {}, _wordDelimiters[t.space] = true, _wordDelimiters[t.tab] = true, _wordDelimiters[t.newline] = true, _wordDelimiters[t.cr] = true, _wordDelimiters[t.feed] = true, _wordDelimiters[t.ampersand] = true, _wordDelimiters[t.asterisk] = true, _wordDelimiters[t.bang] = true, _wordDelimiters[t.comma] = true, _wordDelimiters[t.colon] = true, _wordDelimiters[t.semicolon] = true, _wordDelimiters[t.openParenthesis] = true, _wordDelimiters[t.closeParenthesis] = true, _wordDelimiters[t.openSquare] = true, _wordDelimiters[t.closeSquare] = true, _wordDelimiters[t.singleQuote] = true, _wordDelimiters[t.doubleQuote] = true, _wordDelimiters[t.plus] = true, _wordDelimiters[t.pipe] = true, _wordDelimiters[t.tilde] = true, _wordDelimiters[t.greaterThan] = true, _wordDelimiters[t.equals] = true, _wordDelimiters[t.dollar] = true, _wordDelimiters[t.caret] = true, _wordDelimiters[t.slash] = true, _wordDelimiters);\nvar hex = {};\nvar hexChars = \"0123456789abcdefABCDEF\";\n\nfor (var i = 0; i < hexChars.length; i++) {\n  hex[hexChars.charCodeAt(i)] = true;\n}\n/**\n *  Returns the last index of the bar css word\n * @param {string} css The string in which the word begins\n * @param {number} start The index into the string where word's first letter occurs\n */\n\n\nfunction consumeWord(css, start) {\n  var next = start;\n  var code;\n\n  do {\n    code = css.charCodeAt(next);\n\n    if (wordDelimiters[code]) {\n      return next - 1;\n    } else if (code === t.backslash) {\n      next = consumeEscape(css, next) + 1;\n    } else {\n      // All other characters are part of the word\n      next++;\n    }\n  } while (next < css.length);\n\n  return next - 1;\n}\n/**\n *  Returns the last index of the escape sequence\n * @param {string} css The string in which the sequence begins\n * @param {number} start The index into the string where escape character (`\\`) occurs.\n */\n\n\nfunction consumeEscape(css, start) {\n  var next = start;\n  var code = css.charCodeAt(next + 1);\n\n  if (unescapable[code]) {// just consume the escape char\n  } else if (hex[code]) {\n    var hexDigits = 0; // consume up to 6 hex chars\n\n    do {\n      next++;\n      hexDigits++;\n      code = css.charCodeAt(next + 1);\n    } while (hex[code] && hexDigits < 6); // if fewer than 6 hex chars, a trailing space ends the escape\n\n\n    if (hexDigits < 6 && code === t.space) {\n      next++;\n    }\n  } else {\n    // the next char is part of the current word\n    next++;\n  }\n\n  return next;\n}\n\nvar FIELDS = {\n  TYPE: 0,\n  START_LINE: 1,\n  START_COL: 2,\n  END_LINE: 3,\n  END_COL: 4,\n  START_POS: 5,\n  END_POS: 6\n};\nexports.FIELDS = FIELDS;\n\nfunction tokenize(input) {\n  var tokens = [];\n  var css = input.css.valueOf();\n  var _css = css,\n      length = _css.length;\n  var offset = -1;\n  var line = 1;\n  var start = 0;\n  var end = 0;\n  var code, content, endColumn, endLine, escaped, escapePos, last, lines, next, nextLine, nextOffset, quote, tokenType;\n\n  function unclosed(what, fix) {\n    if (input.safe) {\n      // fyi: this is never set to true.\n      css += fix;\n      next = css.length - 1;\n    } else {\n      throw input.error('Unclosed ' + what, line, start - offset, start);\n    }\n  }\n\n  while (start < length) {\n    code = css.charCodeAt(start);\n\n    if (code === t.newline) {\n      offset = start;\n      line += 1;\n    }\n\n    switch (code) {\n      case t.space:\n      case t.tab:\n      case t.newline:\n      case t.cr:\n      case t.feed:\n        next = start;\n\n        do {\n          next += 1;\n          code = css.charCodeAt(next);\n\n          if (code === t.newline) {\n            offset = next;\n            line += 1;\n          }\n        } while (code === t.space || code === t.newline || code === t.tab || code === t.cr || code === t.feed);\n\n        tokenType = t.space;\n        endLine = line;\n        endColumn = next - offset - 1;\n        end = next;\n        break;\n\n      case t.plus:\n      case t.greaterThan:\n      case t.tilde:\n      case t.pipe:\n        next = start;\n\n        do {\n          next += 1;\n          code = css.charCodeAt(next);\n        } while (code === t.plus || code === t.greaterThan || code === t.tilde || code === t.pipe);\n\n        tokenType = t.combinator;\n        endLine = line;\n        endColumn = start - offset;\n        end = next;\n        break;\n      // Consume these characters as single tokens.\n\n      case t.asterisk:\n      case t.ampersand:\n      case t.bang:\n      case t.comma:\n      case t.equals:\n      case t.dollar:\n      case t.caret:\n      case t.openSquare:\n      case t.closeSquare:\n      case t.colon:\n      case t.semicolon:\n      case t.openParenthesis:\n      case t.closeParenthesis:\n        next = start;\n        tokenType = code;\n        endLine = line;\n        endColumn = start - offset;\n        end = next + 1;\n        break;\n\n      case t.singleQuote:\n      case t.doubleQuote:\n        quote = code === t.singleQuote ? \"'\" : '\"';\n        next = start;\n\n        do {\n          escaped = false;\n          next = css.indexOf(quote, next + 1);\n\n          if (next === -1) {\n            unclosed('quote', quote);\n          }\n\n          escapePos = next;\n\n          while (css.charCodeAt(escapePos - 1) === t.backslash) {\n            escapePos -= 1;\n            escaped = !escaped;\n          }\n        } while (escaped);\n\n        tokenType = t.str;\n        endLine = line;\n        endColumn = start - offset;\n        end = next + 1;\n        break;\n\n      default:\n        if (code === t.slash && css.charCodeAt(start + 1) === t.asterisk) {\n          next = css.indexOf('*/', start + 2) + 1;\n\n          if (next === 0) {\n            unclosed('comment', '*/');\n          }\n\n          content = css.slice(start, next + 1);\n          lines = content.split('\\n');\n          last = lines.length - 1;\n\n          if (last > 0) {\n            nextLine = line + last;\n            nextOffset = next - lines[last].length;\n          } else {\n            nextLine = line;\n            nextOffset = offset;\n          }\n\n          tokenType = t.comment;\n          line = nextLine;\n          endLine = nextLine;\n          endColumn = next - nextOffset;\n        } else if (code === t.slash) {\n          next = start;\n          tokenType = code;\n          endLine = line;\n          endColumn = start - offset;\n          end = next + 1;\n        } else {\n          next = consumeWord(css, start);\n          tokenType = t.word;\n          endLine = line;\n          endColumn = next - offset;\n        }\n\n        end = next + 1;\n        break;\n    } // Ensure that the token structure remains consistent\n\n\n    tokens.push([tokenType, // [0] Token type\n    line, // [1] Starting line\n    start - offset, // [2] Starting column\n    endLine, // [3] Ending line\n    endColumn, // [4] Ending column\n    start, // [5] Start position / Source index\n    end // [6] End position\n    ]); // Reset offset for the next token\n\n    if (nextOffset) {\n      offset = nextOffset;\n      nextOffset = null;\n    }\n\n    start = end;\n  }\n\n  return tokens;\n}","'use strict';\nvar call = require('../internals/function-call');\nvar anObject = require('../internals/an-object');\nvar isCallable = require('../internals/is-callable');\nvar classof = require('../internals/classof-raw');\nvar regexpExec = require('../internals/regexp-exec');\n\nvar $TypeError = TypeError;\n\n// `RegExpExec` abstract operation\n// https://tc39.es/ecma262/#sec-regexpexec\nmodule.exports = function (R, S) {\n  var exec = R.exec;\n  if (isCallable(exec)) {\n    var result = call(exec, R, S);\n    if (result !== null) anObject(result);\n    return result;\n  }\n  if (classof(R) === 'RegExp') return call(regexpExec, R, S);\n  throw new $TypeError('RegExp#exec called on incompatible receiver');\n};\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar definePropertyModule = require('../internals/object-define-property');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\n\nmodule.exports = DESCRIPTORS ? function (object, key, value) {\n  return definePropertyModule.f(object, key, createPropertyDescriptor(1, value));\n} : function (object, key, value) {\n  object[key] = value;\n  return object;\n};\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar aCallable = require('../internals/a-callable');\n\nmodule.exports = function (object, key, method) {\n  try {\n    // eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\n    return uncurryThis(aCallable(Object.getOwnPropertyDescriptor(object, key)[method]));\n  } catch (error) { /* empty */ }\n};\n","!function(t,n){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=n():\"function\"==typeof define&&define.amd?define(n):(t||self).barba=n()}(this,function(){function t(t,n){for(var r=0;r<n.length;r++){var i=n[r];i.enumerable=i.enumerable||!1,i.configurable=!0,\"value\"in i&&(i.writable=!0),Object.defineProperty(t,\"symbol\"==typeof(e=function(t,n){if(\"object\"!=typeof t||null===t)return t;var r=t[Symbol.toPrimitive];if(void 0!==r){var i=r.call(t,\"string\");if(\"object\"!=typeof i)return i;throw new TypeError(\"@@toPrimitive must return a primitive value.\")}return String(t)}(i.key))?e:String(e),i)}var e}function n(n,r,i){return r&&t(n.prototype,r),i&&t(n,i),Object.defineProperty(n,\"prototype\",{writable:!1}),n}function r(){return r=Object.assign?Object.assign.bind():function(t){for(var n=1;n<arguments.length;n++){var r=arguments[n];for(var i in r)Object.prototype.hasOwnProperty.call(r,i)&&(t[i]=r[i])}return t},r.apply(this,arguments)}function i(t,n){t.prototype=Object.create(n.prototype),t.prototype.constructor=t,o(t,n)}function e(t){return e=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},e(t)}function o(t,n){return o=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,n){return t.__proto__=n,t},o(t,n)}function u(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch(t){return!1}}function s(t,n,r){return s=u()?Reflect.construct.bind():function(t,n,r){var i=[null];i.push.apply(i,n);var e=new(Function.bind.apply(t,i));return r&&o(e,r.prototype),e},s.apply(null,arguments)}function f(t){var n=\"function\"==typeof Map?new Map:void 0;return f=function(t){if(null===t||-1===Function.toString.call(t).indexOf(\"[native code]\"))return t;if(\"function\"!=typeof t)throw new TypeError(\"Super expression must either be null or a function\");if(void 0!==n){if(n.has(t))return n.get(t);n.set(t,r)}function r(){return s(t,arguments,e(this).constructor)}return r.prototype=Object.create(t.prototype,{constructor:{value:r,enumerable:!1,writable:!0,configurable:!0}}),o(r,t)},f(t)}function c(t){if(void 0===t)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return t}var a,h=function(){this.before=void 0,this.beforeLeave=void 0,this.leave=void 0,this.afterLeave=void 0,this.beforeEnter=void 0,this.enter=void 0,this.afterEnter=void 0,this.after=void 0};!function(t){t[t.off=0]=\"off\",t[t.error=1]=\"error\",t[t.warning=2]=\"warning\",t[t.info=3]=\"info\",t[t.debug=4]=\"debug\"}(a||(a={}));var v=a.off,d=/*#__PURE__*/function(){function t(t){this.t=void 0,this.t=t}t.getLevel=function(){return v},t.setLevel=function(t){return v=a[t]};var n=t.prototype;return n.error=function(){this.i(console.error,a.error,[].slice.call(arguments))},n.warn=function(){this.i(console.warn,a.warning,[].slice.call(arguments))},n.info=function(){this.i(console.info,a.info,[].slice.call(arguments))},n.debug=function(){this.i(console.log,a.debug,[].slice.call(arguments))},n.i=function(n,r,i){r<=t.getLevel()&&n.apply(console,[\"[\"+this.t+\"] \"].concat(i))},t}();function l(t){return t.replace(/([.+*?=^!:${}()[\\]|/\\\\])/g,\"\\\\$1\")}function p(t){return t&&t.sensitive?\"\":\"i\"}var m={container:\"container\",history:\"history\",namespace:\"namespace\",prefix:\"data-barba\",prevent:\"prevent\",wrapper:\"wrapper\"},w=/*#__PURE__*/function(){function t(){this.o=m,this.u=void 0,this.h={after:null,before:null,parent:null}}var n=t.prototype;return n.toString=function(t){return t.outerHTML},n.toDocument=function(t){return this.u||(this.u=new DOMParser),this.u.parseFromString(t,\"text/html\")},n.toElement=function(t){var n=document.createElement(\"div\");return n.innerHTML=t,n},n.getHtml=function(t){return void 0===t&&(t=document),this.toString(t.documentElement)},n.getWrapper=function(t){return void 0===t&&(t=document),t.querySelector(\"[\"+this.o.prefix+'=\"'+this.o.wrapper+'\"]')},n.getContainer=function(t){return void 0===t&&(t=document),t.querySelector(\"[\"+this.o.prefix+'=\"'+this.o.container+'\"]')},n.removeContainer=function(t){document.body.contains(t)&&(this.v(t),t.parentNode.removeChild(t))},n.addContainer=function(t,n){var r=this.getContainer()||this.h.before;r?this.l(t,r):this.h.after?this.h.after.parentNode.insertBefore(t,this.h.after):this.h.parent?this.h.parent.appendChild(t):n.appendChild(t)},n.getSibling=function(){return this.h},n.getNamespace=function(t){void 0===t&&(t=document);var n=t.querySelector(\"[\"+this.o.prefix+\"-\"+this.o.namespace+\"]\");return n?n.getAttribute(this.o.prefix+\"-\"+this.o.namespace):null},n.getHref=function(t){if(t.tagName&&\"a\"===t.tagName.toLowerCase()){if(\"string\"==typeof t.href)return t.href;var n=t.getAttribute(\"href\")||t.getAttribute(\"xlink:href\");if(n)return this.resolveUrl(n.baseVal||n)}return null},n.resolveUrl=function(){var t=[].slice.call(arguments).length;if(0===t)throw new Error(\"resolveUrl requires at least one argument; got none.\");var n=document.createElement(\"base\");if(n.href=arguments[0],1===t)return n.href;var r=document.getElementsByTagName(\"head\")[0];r.insertBefore(n,r.firstChild);for(var i,e=document.createElement(\"a\"),o=1;o<t;o++)e.href=arguments[o],n.href=i=e.href;return r.removeChild(n),i},n.l=function(t,n){n.parentNode.insertBefore(t,n.nextSibling)},n.v=function(t){return this.h={after:t.nextElementSibling,before:t.previousElementSibling,parent:t.parentElement},this.h},t}(),b=new w,y=/*#__PURE__*/function(){function t(){this.p=void 0,this.m=[],this.P=-1}var i=t.prototype;return i.init=function(t,n){this.p=\"barba\";var r={data:{},ns:n,scroll:{x:window.scrollX,y:window.scrollY},url:t};this.P=0,this.m.push(r);var i={from:this.p,index:this.P,states:[].concat(this.m)};window.history&&window.history.replaceState(i,\"\",t)},i.change=function(t,n,r){if(r&&r.state){var i=r.state,e=i.index;n=this.g(this.P-e),this.replace(i.states),this.P=e}else this.add(t,n);return n},i.add=function(t,n,r,i){var e=null!=r?r:this.R(n),o={data:null!=i?i:{},ns:\"tmp\",scroll:{x:window.scrollX,y:window.scrollY},url:t};switch(e){case\"push\":this.P=this.size,this.m.push(o);break;case\"replace\":this.set(this.P,o)}var u={from:this.p,index:this.P,states:[].concat(this.m)};switch(e){case\"push\":window.history&&window.history.pushState(u,\"\",t);break;case\"replace\":window.history&&window.history.replaceState(u,\"\",t)}},i.store=function(t,n){var i=n||this.P,e=this.get(i);e.data=r({},e.data,t),this.set(i,e);var o={from:this.p,index:this.P,states:[].concat(this.m)};window.history.replaceState(o,\"\")},i.update=function(t,n){var i=n||this.P,e=r({},this.get(i),t);this.set(i,e)},i.remove=function(t){t?this.m.splice(t,1):this.m.pop(),this.P--},i.clear=function(){this.m=[],this.P=-1},i.replace=function(t){this.m=t},i.get=function(t){return this.m[t]},i.set=function(t,n){return this.m[t]=n},i.R=function(t){var n=\"push\",r=t,i=m.prefix+\"-\"+m.history;return r.hasAttribute&&r.hasAttribute(i)&&(n=r.getAttribute(i)),n},i.g=function(t){return Math.abs(t)>1?t>0?\"forward\":\"back\":0===t?\"popstate\":t>0?\"back\":\"forward\"},n(t,[{key:\"current\",get:function(){return this.m[this.P]}},{key:\"previous\",get:function(){return this.P<1?null:this.m[this.P-1]}},{key:\"size\",get:function(){return this.m.length}}]),t}(),P=new y,g=function(t,n){try{var r=function(){if(!n.next.html)return Promise.resolve(t).then(function(t){var r=n.next;if(t){var i=b.toElement(t.html);r.namespace=b.getNamespace(i),r.container=b.getContainer(i),r.url=t.url,r.html=t.html,P.update({ns:r.namespace});var e=b.toDocument(t.html);document.title=e.title}})}();return Promise.resolve(r&&r.then?r.then(function(){}):void 0)}catch(t){return Promise.reject(t)}},E=function t(n,r,i){return n instanceof RegExp?function(t,n){if(!n)return t;for(var r=/\\((?:\\?<(.*?)>)?(?!\\?)/g,i=0,e=r.exec(t.source);e;)n.push({name:e[1]||i++,prefix:\"\",suffix:\"\",modifier:\"\",pattern:\"\"}),e=r.exec(t.source);return t}(n,r):Array.isArray(n)?function(n,r,i){var e=n.map(function(n){return t(n,r,i).source});return new RegExp(\"(?:\".concat(e.join(\"|\"),\")\"),p(i))}(n,r,i):function(t,n,r){return function(t,n,r){void 0===r&&(r={});for(var i=r.strict,e=void 0!==i&&i,o=r.start,u=void 0===o||o,s=r.end,f=void 0===s||s,c=r.encode,a=void 0===c?function(t){return t}:c,h=r.delimiter,v=void 0===h?\"/#?\":h,d=r.endsWith,m=\"[\".concat(l(void 0===d?\"\":d),\"]|$\"),w=\"[\".concat(l(v),\"]\"),b=u?\"^\":\"\",y=0,P=t;y<P.length;y++){var g=P[y];if(\"string\"==typeof g)b+=l(a(g));else{var E=l(a(g.prefix)),x=l(a(g.suffix));if(g.pattern)if(n&&n.push(g),E||x)if(\"+\"===g.modifier||\"*\"===g.modifier){var R=\"*\"===g.modifier?\"?\":\"\";b+=\"(?:\".concat(E,\"((?:\").concat(g.pattern,\")(?:\").concat(x).concat(E,\"(?:\").concat(g.pattern,\"))*)\").concat(x,\")\").concat(R)}else b+=\"(?:\".concat(E,\"(\").concat(g.pattern,\")\").concat(x,\")\").concat(g.modifier);else b+=\"+\"===g.modifier||\"*\"===g.modifier?\"((?:\".concat(g.pattern,\")\").concat(g.modifier,\")\"):\"(\".concat(g.pattern,\")\").concat(g.modifier);else b+=\"(?:\".concat(E).concat(x,\")\").concat(g.modifier)}}if(f)e||(b+=\"\".concat(w,\"?\")),b+=r.endsWith?\"(?=\".concat(m,\")\"):\"$\";else{var k=t[t.length-1],O=\"string\"==typeof k?w.indexOf(k[k.length-1])>-1:void 0===k;e||(b+=\"(?:\".concat(w,\"(?=\").concat(m,\"))?\")),O||(b+=\"(?=\".concat(w,\"|\").concat(m,\")\"))}return new RegExp(b,p(r))}(function(t,n){void 0===n&&(n={});for(var r=function(t){for(var n=[],r=0;r<t.length;){var i=t[r];if(\"*\"!==i&&\"+\"!==i&&\"?\"!==i)if(\"\\\\\"!==i)if(\"{\"!==i)if(\"}\"!==i)if(\":\"!==i)if(\"(\"!==i)n.push({type:\"CHAR\",index:r,value:t[r++]});else{var e=1,o=\"\";if(\"?\"===t[s=r+1])throw new TypeError('Pattern cannot start with \"?\" at '.concat(s));for(;s<t.length;)if(\"\\\\\"!==t[s]){if(\")\"===t[s]){if(0==--e){s++;break}}else if(\"(\"===t[s]&&(e++,\"?\"!==t[s+1]))throw new TypeError(\"Capturing groups are not allowed at \".concat(s));o+=t[s++]}else o+=t[s++]+t[s++];if(e)throw new TypeError(\"Unbalanced pattern at \".concat(r));if(!o)throw new TypeError(\"Missing pattern at \".concat(r));n.push({type:\"PATTERN\",index:r,value:o}),r=s}else{for(var u=\"\",s=r+1;s<t.length;){var f=t.charCodeAt(s);if(!(f>=48&&f<=57||f>=65&&f<=90||f>=97&&f<=122||95===f))break;u+=t[s++]}if(!u)throw new TypeError(\"Missing parameter name at \".concat(r));n.push({type:\"NAME\",index:r,value:u}),r=s}else n.push({type:\"CLOSE\",index:r,value:t[r++]});else n.push({type:\"OPEN\",index:r,value:t[r++]});else n.push({type:\"ESCAPED_CHAR\",index:r++,value:t[r++]});else n.push({type:\"MODIFIER\",index:r,value:t[r++]})}return n.push({type:\"END\",index:r,value:\"\"}),n}(t),i=n.prefixes,e=void 0===i?\"./\":i,o=\"[^\".concat(l(n.delimiter||\"/#?\"),\"]+?\"),u=[],s=0,f=0,c=\"\",a=function(t){if(f<r.length&&r[f].type===t)return r[f++].value},h=function(t){var n=a(t);if(void 0!==n)return n;var i=r[f],e=i.index;throw new TypeError(\"Unexpected \".concat(i.type,\" at \").concat(e,\", expected \").concat(t))},v=function(){for(var t,n=\"\";t=a(\"CHAR\")||a(\"ESCAPED_CHAR\");)n+=t;return n};f<r.length;){var d=a(\"CHAR\"),p=a(\"NAME\"),m=a(\"PATTERN\");if(p||m)-1===e.indexOf(b=d||\"\")&&(c+=b,b=\"\"),c&&(u.push(c),c=\"\"),u.push({name:p||s++,prefix:b,suffix:\"\",pattern:m||o,modifier:a(\"MODIFIER\")||\"\"});else{var w=d||a(\"ESCAPED_CHAR\");if(w)c+=w;else if(c&&(u.push(c),c=\"\"),a(\"OPEN\")){var b=v(),y=a(\"NAME\")||\"\",P=a(\"PATTERN\")||\"\",g=v();h(\"CLOSE\"),u.push({name:y||(P?s++:\"\"),pattern:y&&!P?o:P,prefix:b,suffix:g,modifier:a(\"MODIFIER\")||\"\"})}else h(\"END\")}}return u}(t,r),n,r)}(n,r,i)},x={__proto__:null,update:g,nextTick:function(){return new Promise(function(t){window.requestAnimationFrame(t)})},pathToRegexp:E},R=function(){return window.location.origin},k=function(t){return void 0===t&&(t=window.location.href),O(t).port},O=function(t){var n,r=t.match(/:\\d+/);if(null===r)/^http/.test(t)&&(n=80),/^https/.test(t)&&(n=443);else{var i=r[0].substring(1);n=parseInt(i,10)}var e,o=t.replace(R(),\"\"),u={},s=o.indexOf(\"#\");s>=0&&(e=o.slice(s+1),o=o.slice(0,s));var f=o.indexOf(\"?\");return f>=0&&(u=T(o.slice(f+1)),o=o.slice(0,f)),{hash:e,path:o,port:n,query:u}},T=function(t){return t.split(\"&\").reduce(function(t,n){var r=n.split(\"=\");return t[r[0]]=r[1],t},{})},A=function(t){return void 0===t&&(t=window.location.href),t.replace(/(\\/#.*|\\/|#.*)$/,\"\")},j={__proto__:null,getHref:function(){return window.location.href},getAbsoluteHref:function(t,n){return void 0===n&&(n=document.baseURI),new URL(t,n).href},getOrigin:R,getPort:k,getPath:function(t){return void 0===t&&(t=window.location.href),O(t).path},getQuery:function(t,n){return void 0===n&&(n=!1),n?JSON.stringify(O(t).query):O(t).query},getHash:function(t){return O(t).hash},parse:O,parseQuery:T,clean:A};function M(t,n,i,e,o){return void 0===n&&(n=2e3),new Promise(function(u,s){var f=new XMLHttpRequest;f.onreadystatechange=function(){if(f.readyState===XMLHttpRequest.DONE)if(200===f.status){var n=\"\"!==f.responseURL&&f.responseURL!==t?f.responseURL:t;u({html:f.responseText,url:r({href:n},O(n))}),e.update(t,{status:\"fulfilled\",target:n})}else if(f.status){var o={status:f.status,statusText:f.statusText};i(t,o),s(o),e.update(t,{status:\"rejected\"})}},f.ontimeout=function(){var r=new Error(\"Timeout error [\"+n+\"]\");i(t,r),s(r),e.update(t,{status:\"rejected\"})},f.onerror=function(){var n=new Error(\"Fetch error\");i(t,n),s(n),e.update(t,{status:\"rejected\"})},f.open(\"GET\",t),f.timeout=n,f.setRequestHeader(\"Accept\",\"text/html,application/xhtml+xml,application/xml\"),f.setRequestHeader(\"x-barba\",\"yes\"),o.all().forEach(function(t,n){f.setRequestHeader(n,t)}),f.send()})}function N(t){return!!t&&(\"object\"==typeof t||\"function\"==typeof t)&&\"function\"==typeof t.then}function S(t,n){return void 0===n&&(n={}),function(){var r=arguments,i=!1,e=new Promise(function(e,o){n.async=function(){return i=!0,function(t,n){t?o(t):e(n)}};var u=t.apply(n,[].slice.call(r));i||(N(u)?u.then(e,o):e(u))});return e}}var C=/*#__PURE__*/function(t){function n(){var n;return(n=t.call(this)||this).logger=new d(\"@barba/core\"),n.all=[\"ready\",\"page\",\"reset\",\"currentAdded\",\"currentRemoved\",\"nextAdded\",\"nextRemoved\",\"beforeOnce\",\"once\",\"afterOnce\",\"before\",\"beforeLeave\",\"leave\",\"afterLeave\",\"beforeEnter\",\"enter\",\"afterEnter\",\"after\"],n.registered=new Map,n.init(),n}i(n,t);var r=n.prototype;return r.init=function(){var t=this;this.registered.clear(),this.all.forEach(function(n){t[n]||(t[n]=function(r,i){t.registered.has(n)||t.registered.set(n,new Set),t.registered.get(n).add({ctx:i||{},fn:r})})})},r.do=function(t){var n=arguments,r=this;if(this.registered.has(t)){var i=Promise.resolve();return this.registered.get(t).forEach(function(t){i=i.then(function(){return S(t.fn,t.ctx).apply(void 0,[].slice.call(n,1))})}),i.catch(function(n){r.logger.debug(\"Hook error [\"+t+\"]\"),r.logger.error(n)})}return Promise.resolve()},r.clear=function(){var t=this;this.all.forEach(function(n){delete t[n]}),this.init()},r.help=function(){this.logger.info(\"Available hooks: \"+this.all.join(\",\"));var t=[];this.registered.forEach(function(n,r){return t.push(r)}),this.logger.info(\"Registered hooks: \"+t.join(\",\"))},n}(h),L=new C,H=/*#__PURE__*/function(){function t(t){if(this.k=void 0,this.O=[],\"boolean\"==typeof t)this.k=t;else{var n=Array.isArray(t)?t:[t];this.O=n.map(function(t){return E(t)})}}return t.prototype.checkHref=function(t){if(\"boolean\"==typeof this.k)return this.k;var n=O(t).path;return this.O.some(function(t){return null!==t.exec(n)})},t}(),_=/*#__PURE__*/function(t){function n(n){var r;return(r=t.call(this,n)||this).T=new Map,r}i(n,t);var e=n.prototype;return e.set=function(t,n,r,i,e){return this.T.set(t,{action:r,request:n,status:i,target:null!=e?e:t}),{action:r,request:n,status:i,target:e}},e.get=function(t){return this.T.get(t)},e.getRequest=function(t){return this.T.get(t).request},e.getAction=function(t){return this.T.get(t).action},e.getStatus=function(t){return this.T.get(t).status},e.getTarget=function(t){return this.T.get(t).target},e.has=function(t){return!this.checkHref(t)&&this.T.has(t)},e.delete=function(t){return this.T.delete(t)},e.update=function(t,n){var i=r({},this.T.get(t),n);return this.T.set(t,i),i},n}(H),D=/*#__PURE__*/function(){function t(){this.A=new Map}var n=t.prototype;return n.set=function(t,n){return this.A.set(t,n),{name:n}},n.get=function(t){return this.A.get(t)},n.all=function(){return this.A},n.has=function(t){return this.A.has(t)},n.delete=function(t){return this.A.delete(t)},n.clear=function(){return this.A.clear()},t}(),B=function(){return!window.history.pushState},q=function(t){return!t.el||!t.href},F=function(t){var n=t.event;return n.which>1||n.metaKey||n.ctrlKey||n.shiftKey||n.altKey},I=function(t){var n=t.el;return n.hasAttribute(\"target\")&&\"_blank\"===n.target},U=function(t){var n=t.el;return void 0!==n.protocol&&window.location.protocol!==n.protocol||void 0!==n.hostname&&window.location.hostname!==n.hostname},$=function(t){var n=t.el;return void 0!==n.port&&k()!==k(n.href)},Q=function(t){var n=t.el;return n.getAttribute&&\"string\"==typeof n.getAttribute(\"download\")},X=function(t){return t.el.hasAttribute(m.prefix+\"-\"+m.prevent)},z=function(t){return Boolean(t.el.closest(\"[\"+m.prefix+\"-\"+m.prevent+'=\"all\"]'))},G=function(t){var n=t.href;return A(n)===A()&&k(n)===k()},J=/*#__PURE__*/function(t){function n(n){var r;return(r=t.call(this,n)||this).suite=[],r.tests=new Map,r.init(),r}i(n,t);var r=n.prototype;return r.init=function(){this.add(\"pushState\",B),this.add(\"exists\",q),this.add(\"newTab\",F),this.add(\"blank\",I),this.add(\"corsDomain\",U),this.add(\"corsPort\",$),this.add(\"download\",Q),this.add(\"preventSelf\",X),this.add(\"preventAll\",z),this.add(\"sameUrl\",G,!1)},r.add=function(t,n,r){void 0===r&&(r=!0),this.tests.set(t,n),r&&this.suite.push(t)},r.run=function(t,n,r,i){return this.tests.get(t)({el:n,event:r,href:i})},r.checkLink=function(t,n,r){var i=this;return this.suite.some(function(e){return i.run(e,t,n,r)})},n}(H),W=/*#__PURE__*/function(t){function n(r,i){var e;return void 0===i&&(i=\"Barba error\"),(e=t.call.apply(t,[this].concat([].slice.call(arguments,2)))||this).error=void 0,e.label=void 0,e.error=r,e.label=i,Error.captureStackTrace&&Error.captureStackTrace(c(e),n),e.name=\"BarbaError\",e}return i(n,t),n}(/*#__PURE__*/f(Error)),K=/*#__PURE__*/function(){function t(t){void 0===t&&(t=[]),this.logger=new d(\"@barba/core\"),this.all=[],this.page=[],this.once=[],this.j=[{name:\"namespace\",type:\"strings\"},{name:\"custom\",type:\"function\"}],t&&(this.all=this.all.concat(t)),this.update()}var n=t.prototype;return n.add=function(t,n){\"rule\"===t?this.j.splice(n.position||0,0,n.value):this.all.push(n),this.update()},n.resolve=function(t,n){var r=this;void 0===n&&(n={});var i=n.once?this.once:this.page;i=i.filter(n.self?function(t){return t.name&&\"self\"===t.name}:function(t){return!t.name||\"self\"!==t.name});var e=new Map,o=i.find(function(i){var o=!0,u={};return n.self&&\"self\"===i.name?(e.set(i,u),!0):(r.j.reverse().forEach(function(n){o&&(o=r.M(i,n,t,u),i.from&&i.to&&(o=r.M(i,n,t,u,\"from\")&&r.M(i,n,t,u,\"to\")),i.from&&!i.to&&(o=r.M(i,n,t,u,\"from\")),!i.from&&i.to&&(o=r.M(i,n,t,u,\"to\")))}),e.set(i,u),o)}),u=e.get(o),s=[];if(s.push(n.once?\"once\":\"page\"),n.self&&s.push(\"self\"),u){var f,c=[o];Object.keys(u).length>0&&c.push(u),(f=this.logger).info.apply(f,[\"Transition found [\"+s.join(\",\")+\"]\"].concat(c))}else this.logger.info(\"No transition found [\"+s.join(\",\")+\"]\");return o},n.update=function(){var t=this;this.all=this.all.map(function(n){return t.N(n)}).sort(function(t,n){return t.priority-n.priority}).reverse().map(function(t){return delete t.priority,t}),this.page=this.all.filter(function(t){return void 0!==t.leave||void 0!==t.enter}),this.once=this.all.filter(function(t){return void 0!==t.once})},n.M=function(t,n,r,i,e){var o=!0,u=!1,s=t,f=n.name,c=f,a=f,h=f,v=e?s[e]:s,d=\"to\"===e?r.next:r.current;if(e?v&&v[f]:v[f]){switch(n.type){case\"strings\":default:var l=Array.isArray(v[c])?v[c]:[v[c]];d[c]&&-1!==l.indexOf(d[c])&&(u=!0),-1===l.indexOf(d[c])&&(o=!1);break;case\"object\":var p=Array.isArray(v[a])?v[a]:[v[a]];d[a]?(d[a].name&&-1!==p.indexOf(d[a].name)&&(u=!0),-1===p.indexOf(d[a].name)&&(o=!1)):o=!1;break;case\"function\":v[h](r)?u=!0:o=!1}u&&(e?(i[e]=i[e]||{},i[e][f]=s[e][f]):i[f]=s[f])}return o},n.S=function(t,n,r){var i=0;return(t[n]||t.from&&t.from[n]||t.to&&t.to[n])&&(i+=Math.pow(10,r),t.from&&t.from[n]&&(i+=1),t.to&&t.to[n]&&(i+=2)),i},n.N=function(t){var n=this;t.priority=0;var r=0;return this.j.forEach(function(i,e){r+=n.S(t,i.name,e+1)}),t.priority=r,t},t}();function V(t,n){try{var r=t()}catch(t){return n(t)}return r&&r.then?r.then(void 0,n):r}var Y=/*#__PURE__*/function(){function t(t){void 0===t&&(t=[]),this.logger=new d(\"@barba/core\"),this.store=void 0,this.C=!1,this.store=new K(t)}var r=t.prototype;return r.get=function(t,n){return this.store.resolve(t,n)},r.doOnce=function(t){var n=t.data,r=t.transition;try{var i=function(){e.C=!1},e=this,o=r||{};e.C=!0;var u=V(function(){return Promise.resolve(e.L(\"beforeOnce\",n,o)).then(function(){return Promise.resolve(e.once(n,o)).then(function(){return Promise.resolve(e.L(\"afterOnce\",n,o)).then(function(){})})})},function(t){e.C=!1,e.logger.debug(\"Transition error [before/after/once]\"),e.logger.error(t)});return Promise.resolve(u&&u.then?u.then(i):i())}catch(t){return Promise.reject(t)}},r.doPage=function(t){var n=t.data,r=t.transition,i=t.page,e=t.wrapper;try{var o=function(t){u.C=!1},u=this,s=r||{},f=!0===s.sync||!1;u.C=!0;var c=V(function(){function t(){return Promise.resolve(u.L(\"before\",n,s)).then(function(){function t(t){return Promise.resolve(u.remove(n)).then(function(){return Promise.resolve(u.L(\"after\",n,s)).then(function(){})})}var r=function(){if(f)return V(function(){return Promise.resolve(u.add(n,e)).then(function(){return Promise.resolve(u.L(\"beforeLeave\",n,s)).then(function(){return Promise.resolve(u.L(\"beforeEnter\",n,s)).then(function(){return Promise.resolve(Promise.all([u.leave(n,s),u.enter(n,s)])).then(function(){return Promise.resolve(u.L(\"afterLeave\",n,s)).then(function(){return Promise.resolve(u.L(\"afterEnter\",n,s)).then(function(){})})})})})})},function(t){if(u.H(t))throw new W(t,\"Transition error [sync]\")});var t=function(t){return V(function(){var t=function(){if(!1!==r)return Promise.resolve(u.add(n,e)).then(function(){return Promise.resolve(u.L(\"beforeEnter\",n,s)).then(function(){return Promise.resolve(u.enter(n,s,r)).then(function(){return Promise.resolve(u.L(\"afterEnter\",n,s)).then(function(){})})})})}();if(t&&t.then)return t.then(function(){})},function(t){if(u.H(t))throw new W(t,\"Transition error [before/after/enter]\")})},r=!1,o=V(function(){return Promise.resolve(u.L(\"beforeLeave\",n,s)).then(function(){return Promise.resolve(Promise.all([u.leave(n,s),g(i,n)]).then(function(t){return t[0]})).then(function(t){return r=t,Promise.resolve(u.L(\"afterLeave\",n,s)).then(function(){})})})},function(t){if(u.H(t))throw new W(t,\"Transition error [before/after/leave]\")});return o&&o.then?o.then(t):t()}();return r&&r.then?r.then(t):t()})}var r=function(){if(f)return Promise.resolve(g(i,n)).then(function(){})}();return r&&r.then?r.then(t):t()},function(t){if(u.C=!1,t.name&&\"BarbaError\"===t.name)throw u.logger.debug(t.label),u.logger.error(t.error),t;throw u.logger.debug(\"Transition error [page]\"),u.logger.error(t),t});return Promise.resolve(c&&c.then?c.then(o):o())}catch(t){return Promise.reject(t)}},r.once=function(t,n){try{return Promise.resolve(L.do(\"once\",t,n)).then(function(){return n.once?S(n.once,n)(t):Promise.resolve()})}catch(t){return Promise.reject(t)}},r.leave=function(t,n){try{return Promise.resolve(L.do(\"leave\",t,n)).then(function(){return n.leave?S(n.leave,n)(t):Promise.resolve()})}catch(t){return Promise.reject(t)}},r.enter=function(t,n,r){try{return Promise.resolve(L.do(\"enter\",t,n)).then(function(){return n.enter?S(n.enter,n)(t,r):Promise.resolve()})}catch(t){return Promise.reject(t)}},r.add=function(t,n){try{return b.addContainer(t.next.container,n),L.do(\"nextAdded\",t),Promise.resolve()}catch(t){return Promise.reject(t)}},r.remove=function(t){try{return b.removeContainer(t.current.container),L.do(\"currentRemoved\",t),Promise.resolve()}catch(t){return Promise.reject(t)}},r.H=function(t){return t.message?!/Timeout error|Fetch error/.test(t.message):!t.status},r.L=function(t,n,r){try{return Promise.resolve(L.do(t,n,r)).then(function(){return r[t]?S(r[t],r)(n):Promise.resolve()})}catch(t){return Promise.reject(t)}},n(t,[{key:\"isRunning\",get:function(){return this.C},set:function(t){this.C=t}},{key:\"hasOnce\",get:function(){return this.store.once.length>0}},{key:\"hasSelf\",get:function(){return this.store.all.some(function(t){return\"self\"===t.name})}},{key:\"shouldWait\",get:function(){return this.store.all.some(function(t){return t.to&&!t.to.route||t.sync})}}]),t}(),Z=/*#__PURE__*/function(){function t(t){var n=this;this.names=[\"beforeLeave\",\"afterLeave\",\"beforeEnter\",\"afterEnter\"],this.byNamespace=new Map,0!==t.length&&(t.forEach(function(t){n.byNamespace.set(t.namespace,t)}),this.names.forEach(function(t){L[t](n._(t))}))}return t.prototype._=function(t){var n=this;return function(r){var i=t.match(/enter/i)?r.next:r.current,e=n.byNamespace.get(i.namespace);return e&&e[t]?S(e[t],e)(r):Promise.resolve()}},t}();Element.prototype.matches||(Element.prototype.matches=Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector),Element.prototype.closest||(Element.prototype.closest=function(t){var n=this;do{if(n.matches(t))return n;n=n.parentElement||n.parentNode}while(null!==n&&1===n.nodeType);return null});var tt={container:null,html:\"\",namespace:\"\",url:{hash:\"\",href:\"\",path:\"\",port:null,query:{}}},nt=/*#__PURE__*/function(){function t(){this.version=\"2.10.3\",this.schemaPage=tt,this.Logger=d,this.logger=new d(\"@barba/core\"),this.plugins=[],this.timeout=void 0,this.cacheIgnore=void 0,this.cacheFirstPage=void 0,this.prefetchIgnore=void 0,this.preventRunning=void 0,this.hooks=L,this.cache=void 0,this.headers=void 0,this.prevent=void 0,this.transitions=void 0,this.views=void 0,this.dom=b,this.helpers=x,this.history=P,this.request=M,this.url=j,this.D=void 0,this.B=void 0,this.q=void 0,this.F=void 0}var i=t.prototype;return i.use=function(t,n){var r=this.plugins;r.indexOf(t)>-1?this.logger.warn(\"Plugin [\"+t.name+\"] already installed.\"):\"function\"==typeof t.install?(t.install(this,n),r.push(t)):this.logger.warn(\"Plugin [\"+t.name+'] has no \"install\" method.')},i.init=function(t){var n=void 0===t?{}:t,i=n.transitions,e=void 0===i?[]:i,o=n.views,u=void 0===o?[]:o,s=n.schema,f=void 0===s?m:s,c=n.requestError,a=n.timeout,h=void 0===a?2e3:a,v=n.cacheIgnore,l=void 0!==v&&v,p=n.cacheFirstPage,w=void 0!==p&&p,b=n.prefetchIgnore,y=void 0!==b&&b,P=n.preventRunning,g=void 0!==P&&P,E=n.prevent,x=void 0===E?null:E,R=n.debug,k=n.logLevel;if(d.setLevel(!0===(void 0!==R&&R)?\"debug\":void 0===k?\"off\":k),this.logger.info(this.version),Object.keys(f).forEach(function(t){m[t]&&(m[t]=f[t])}),this.B=c,this.timeout=h,this.cacheIgnore=l,this.cacheFirstPage=w,this.prefetchIgnore=y,this.preventRunning=g,this.q=this.dom.getWrapper(),!this.q)throw new Error(\"[@barba/core] No Barba wrapper found\");this.I();var O=this.data.current;if(!O.container)throw new Error(\"[@barba/core] No Barba container found\");if(this.cache=new _(l),this.headers=new D,this.prevent=new J(y),this.transitions=new Y(e),this.views=new Z(u),null!==x){if(\"function\"!=typeof x)throw new Error(\"[@barba/core] Prevent should be a function\");this.prevent.add(\"preventCustom\",x)}this.history.init(O.url.href,O.namespace),w&&this.cache.set(O.url.href,Promise.resolve({html:O.html,url:O.url}),\"init\",\"fulfilled\"),this.U=this.U.bind(this),this.$=this.$.bind(this),this.X=this.X.bind(this),this.G(),this.plugins.forEach(function(t){return t.init()});var T=this.data;T.trigger=\"barba\",T.next=T.current,T.current=r({},this.schemaPage),this.hooks.do(\"ready\",T),this.once(T),this.I()},i.destroy=function(){this.I(),this.J(),this.history.clear(),this.hooks.clear(),this.plugins=[]},i.force=function(t){window.location.assign(t)},i.go=function(t,n,r){var i;if(void 0===n&&(n=\"barba\"),this.F=null,this.transitions.isRunning)this.force(t);else if(!(i=\"popstate\"===n?this.history.current&&this.url.getPath(this.history.current.url)===this.url.getPath(t)&&this.url.getQuery(this.history.current.url,!0)===this.url.getQuery(t,!0):this.prevent.run(\"sameUrl\",null,null,t))||this.transitions.hasSelf)return n=this.history.change(this.cache.has(t)?this.cache.get(t).target:t,n,r),r&&(r.stopPropagation(),r.preventDefault()),this.page(t,n,null!=r?r:void 0,i)},i.once=function(t){try{var n=this;return Promise.resolve(n.hooks.do(\"beforeEnter\",t)).then(function(){function r(){return Promise.resolve(n.hooks.do(\"afterEnter\",t)).then(function(){})}var i=function(){if(n.transitions.hasOnce){var r=n.transitions.get(t,{once:!0});return Promise.resolve(n.transitions.doOnce({transition:r,data:t})).then(function(){})}}();return i&&i.then?i.then(r):r()})}catch(t){return Promise.reject(t)}},i.page=function(t,n,i,e){try{var o,u=function(){var t=s.data;return Promise.resolve(s.hooks.do(\"page\",t)).then(function(){var n=function(n,r){try{var i=(u=s.transitions.get(t,{once:!1,self:e}),Promise.resolve(s.transitions.doPage({data:t,page:o,transition:u,wrapper:s.q})).then(function(){s.I()}))}catch(t){return r()}var u;return i&&i.then?i.then(void 0,r):i}(0,function(){0===d.getLevel()&&s.force(t.next.url.href)});if(n&&n.then)return n.then(function(){})})},s=this;if(s.data.next.url=r({href:t},s.url.parse(t)),s.data.trigger=n,s.data.event=i,s.cache.has(t))o=s.cache.update(t,{action:\"click\"}).request;else{var f=s.request(t,s.timeout,s.onRequestError.bind(s,n),s.cache,s.headers);f.then(function(r){r.url.href!==t&&s.history.add(r.url.href,n,\"replace\")}),o=s.cache.set(t,f,\"click\",\"pending\").request}var c=function(){if(s.transitions.shouldWait)return Promise.resolve(g(o,s.data)).then(function(){})}();return Promise.resolve(c&&c.then?c.then(u):u())}catch(t){return Promise.reject(t)}},i.onRequestError=function(t){this.transitions.isRunning=!1;var n=[].slice.call(arguments,1),r=n[0],i=n[1],e=this.cache.getAction(r);return this.cache.delete(r),this.B&&!1===this.B(t,e,r,i)||\"click\"===e&&this.force(r),!1},i.prefetch=function(t){var n=this;t=this.url.getAbsoluteHref(t),this.cache.has(t)||this.cache.set(t,this.request(t,this.timeout,this.onRequestError.bind(this,\"barba\"),this.cache,this.headers).catch(function(t){n.logger.error(t)}),\"prefetch\",\"pending\")},i.G=function(){!0!==this.prefetchIgnore&&(document.addEventListener(\"mouseover\",this.U),document.addEventListener(\"touchstart\",this.U)),document.addEventListener(\"click\",this.$),window.addEventListener(\"popstate\",this.X)},i.J=function(){!0!==this.prefetchIgnore&&(document.removeEventListener(\"mouseover\",this.U),document.removeEventListener(\"touchstart\",this.U)),document.removeEventListener(\"click\",this.$),window.removeEventListener(\"popstate\",this.X)},i.U=function(t){var n=this,r=this.W(t);if(r){var i=this.url.getAbsoluteHref(this.dom.getHref(r));this.prevent.checkHref(i)||this.cache.has(i)||this.cache.set(i,this.request(i,this.timeout,this.onRequestError.bind(this,r),this.cache,this.headers).catch(function(t){n.logger.error(t)}),\"enter\",\"pending\")}},i.$=function(t){var n=this.W(t);if(n){if(this.transitions.isRunning&&this.preventRunning)return t.preventDefault(),void t.stopPropagation();this.F=t,this.go(this.dom.getHref(n),n,t)}},i.X=function(t){this.go(this.url.getHref(),\"popstate\",t)},i.W=function(t){for(var n=t.target;n&&!this.dom.getHref(n);)n=n.parentNode;if(n&&!this.prevent.checkLink(n,t,this.dom.getHref(n)))return n},i.I=function(){var t=this.url.getHref(),n={container:this.dom.getContainer(),html:this.dom.getHtml(),namespace:this.dom.getNamespace(),url:r({href:t},this.url.parse(t))};this.D={current:n,event:void 0,next:r({},this.schemaPage),trigger:void 0},this.hooks.do(\"reset\",this.data)},n(t,[{key:\"data\",get:function(){return this.D}},{key:\"wrapper\",get:function(){return this.q}}]),t}();return new nt});\n//# sourceMappingURL=barba.umd.js.map\n","'use strict';\nvar $ = require('../internals/export');\nvar globalThis = require('../internals/global-this');\nvar call = require('../internals/function-call');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar IS_PURE = require('../internals/is-pure');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar NATIVE_SYMBOL = require('../internals/symbol-constructor-detection');\nvar fails = require('../internals/fails');\nvar hasOwn = require('../internals/has-own-property');\nvar isPrototypeOf = require('../internals/object-is-prototype-of');\nvar anObject = require('../internals/an-object');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar toPropertyKey = require('../internals/to-property-key');\nvar $toString = require('../internals/to-string');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar nativeObjectCreate = require('../internals/object-create');\nvar objectKeys = require('../internals/object-keys');\nvar getOwnPropertyNamesModule = require('../internals/object-get-own-property-names');\nvar getOwnPropertyNamesExternal = require('../internals/object-get-own-property-names-external');\nvar getOwnPropertySymbolsModule = require('../internals/object-get-own-property-symbols');\nvar getOwnPropertyDescriptorModule = require('../internals/object-get-own-property-descriptor');\nvar definePropertyModule = require('../internals/object-define-property');\nvar definePropertiesModule = require('../internals/object-define-properties');\nvar propertyIsEnumerableModule = require('../internals/object-property-is-enumerable');\nvar defineBuiltIn = require('../internals/define-built-in');\nvar defineBuiltInAccessor = require('../internals/define-built-in-accessor');\nvar shared = require('../internals/shared');\nvar sharedKey = require('../internals/shared-key');\nvar hiddenKeys = require('../internals/hidden-keys');\nvar uid = require('../internals/uid');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar wrappedWellKnownSymbolModule = require('../internals/well-known-symbol-wrapped');\nvar defineWellKnownSymbol = require('../internals/well-known-symbol-define');\nvar defineSymbolToPrimitive = require('../internals/symbol-define-to-primitive');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar InternalStateModule = require('../internals/internal-state');\nvar $forEach = require('../internals/array-iteration').forEach;\n\nvar HIDDEN = sharedKey('hidden');\nvar SYMBOL = 'Symbol';\nvar PROTOTYPE = 'prototype';\n\nvar setInternalState = InternalStateModule.set;\nvar getInternalState = InternalStateModule.getterFor(SYMBOL);\n\nvar ObjectPrototype = Object[PROTOTYPE];\nvar $Symbol = globalThis.Symbol;\nvar SymbolPrototype = $Symbol && $Symbol[PROTOTYPE];\nvar RangeError = globalThis.RangeError;\nvar TypeError = globalThis.TypeError;\nvar QObject = globalThis.QObject;\nvar nativeGetOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;\nvar nativeDefineProperty = definePropertyModule.f;\nvar nativeGetOwnPropertyNames = getOwnPropertyNamesExternal.f;\nvar nativePropertyIsEnumerable = propertyIsEnumerableModule.f;\nvar push = uncurryThis([].push);\n\nvar AllSymbols = shared('symbols');\nvar ObjectPrototypeSymbols = shared('op-symbols');\nvar WellKnownSymbolsStore = shared('wks');\n\n// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173\nvar USE_SETTER = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;\n\n// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687\nvar fallbackDefineProperty = function (O, P, Attributes) {\n  var ObjectPrototypeDescriptor = nativeGetOwnPropertyDescriptor(ObjectPrototype, P);\n  if (ObjectPrototypeDescriptor) delete ObjectPrototype[P];\n  nativeDefineProperty(O, P, Attributes);\n  if (ObjectPrototypeDescriptor && O !== ObjectPrototype) {\n    nativeDefineProperty(ObjectPrototype, P, ObjectPrototypeDescriptor);\n  }\n};\n\nvar setSymbolDescriptor = DESCRIPTORS && fails(function () {\n  return nativeObjectCreate(nativeDefineProperty({}, 'a', {\n    get: function () { return nativeDefineProperty(this, 'a', { value: 7 }).a; }\n  })).a !== 7;\n}) ? fallbackDefineProperty : nativeDefineProperty;\n\nvar wrap = function (tag, description) {\n  var symbol = AllSymbols[tag] = nativeObjectCreate(SymbolPrototype);\n  setInternalState(symbol, {\n    type: SYMBOL,\n    tag: tag,\n    description: description\n  });\n  if (!DESCRIPTORS) symbol.description = description;\n  return symbol;\n};\n\nvar $defineProperty = function defineProperty(O, P, Attributes) {\n  if (O === ObjectPrototype) $defineProperty(ObjectPrototypeSymbols, P, Attributes);\n  anObject(O);\n  var key = toPropertyKey(P);\n  anObject(Attributes);\n  if (hasOwn(AllSymbols, key)) {\n    if (!Attributes.enumerable) {\n      if (!hasOwn(O, HIDDEN)) nativeDefineProperty(O, HIDDEN, createPropertyDescriptor(1, nativeObjectCreate(null)));\n      O[HIDDEN][key] = true;\n    } else {\n      if (hasOwn(O, HIDDEN) && O[HIDDEN][key]) O[HIDDEN][key] = false;\n      Attributes = nativeObjectCreate(Attributes, { enumerable: createPropertyDescriptor(0, false) });\n    } return setSymbolDescriptor(O, key, Attributes);\n  } return nativeDefineProperty(O, key, Attributes);\n};\n\nvar $defineProperties = function defineProperties(O, Properties) {\n  anObject(O);\n  var properties = toIndexedObject(Properties);\n  var keys = objectKeys(properties).concat($getOwnPropertySymbols(properties));\n  $forEach(keys, function (key) {\n    if (!DESCRIPTORS || call($propertyIsEnumerable, properties, key)) $defineProperty(O, key, properties[key]);\n  });\n  return O;\n};\n\nvar $create = function create(O, Properties) {\n  return Properties === undefined ? nativeObjectCreate(O) : $defineProperties(nativeObjectCreate(O), Properties);\n};\n\nvar $propertyIsEnumerable = function propertyIsEnumerable(V) {\n  var P = toPropertyKey(V);\n  var enumerable = call(nativePropertyIsEnumerable, this, P);\n  if (this === ObjectPrototype && hasOwn(AllSymbols, P) && !hasOwn(ObjectPrototypeSymbols, P)) return false;\n  return enumerable || !hasOwn(this, P) || !hasOwn(AllSymbols, P) || hasOwn(this, HIDDEN) && this[HIDDEN][P]\n    ? enumerable : true;\n};\n\nvar $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(O, P) {\n  var it = toIndexedObject(O);\n  var key = toPropertyKey(P);\n  if (it === ObjectPrototype && hasOwn(AllSymbols, key) && !hasOwn(ObjectPrototypeSymbols, key)) return;\n  var descriptor = nativeGetOwnPropertyDescriptor(it, key);\n  if (descriptor && hasOwn(AllSymbols, key) && !(hasOwn(it, HIDDEN) && it[HIDDEN][key])) {\n    descriptor.enumerable = true;\n  }\n  return descriptor;\n};\n\nvar $getOwnPropertyNames = function getOwnPropertyNames(O) {\n  var names = nativeGetOwnPropertyNames(toIndexedObject(O));\n  var result = [];\n  $forEach(names, function (key) {\n    if (!hasOwn(AllSymbols, key) && !hasOwn(hiddenKeys, key)) push(result, key);\n  });\n  return result;\n};\n\nvar $getOwnPropertySymbols = function (O) {\n  var IS_OBJECT_PROTOTYPE = O === ObjectPrototype;\n  var names = nativeGetOwnPropertyNames(IS_OBJECT_PROTOTYPE ? ObjectPrototypeSymbols : toIndexedObject(O));\n  var result = [];\n  $forEach(names, function (key) {\n    if (hasOwn(AllSymbols, key) && (!IS_OBJECT_PROTOTYPE || hasOwn(ObjectPrototype, key))) {\n      push(result, AllSymbols[key]);\n    }\n  });\n  return result;\n};\n\n// `Symbol` constructor\n// https://tc39.es/ecma262/#sec-symbol-constructor\nif (!NATIVE_SYMBOL) {\n  $Symbol = function Symbol() {\n    if (isPrototypeOf(SymbolPrototype, this)) throw new TypeError('Symbol is not a constructor');\n    var description = !arguments.length || arguments[0] === undefined ? undefined : $toString(arguments[0]);\n    var tag = uid(description);\n    var setter = function (value) {\n      var $this = this === undefined ? globalThis : this;\n      if ($this === ObjectPrototype) call(setter, ObjectPrototypeSymbols, value);\n      if (hasOwn($this, HIDDEN) && hasOwn($this[HIDDEN], tag)) $this[HIDDEN][tag] = false;\n      var descriptor = createPropertyDescriptor(1, value);\n      try {\n        setSymbolDescriptor($this, tag, descriptor);\n      } catch (error) {\n        if (!(error instanceof RangeError)) throw error;\n        fallbackDefineProperty($this, tag, descriptor);\n      }\n    };\n    if (DESCRIPTORS && USE_SETTER) setSymbolDescriptor(ObjectPrototype, tag, { configurable: true, set: setter });\n    return wrap(tag, description);\n  };\n\n  SymbolPrototype = $Symbol[PROTOTYPE];\n\n  defineBuiltIn(SymbolPrototype, 'toString', function toString() {\n    return getInternalState(this).tag;\n  });\n\n  defineBuiltIn($Symbol, 'withoutSetter', function (description) {\n    return wrap(uid(description), description);\n  });\n\n  propertyIsEnumerableModule.f = $propertyIsEnumerable;\n  definePropertyModule.f = $defineProperty;\n  definePropertiesModule.f = $defineProperties;\n  getOwnPropertyDescriptorModule.f = $getOwnPropertyDescriptor;\n  getOwnPropertyNamesModule.f = getOwnPropertyNamesExternal.f = $getOwnPropertyNames;\n  getOwnPropertySymbolsModule.f = $getOwnPropertySymbols;\n\n  wrappedWellKnownSymbolModule.f = function (name) {\n    return wrap(wellKnownSymbol(name), name);\n  };\n\n  if (DESCRIPTORS) {\n    // https://tc39.es/ecma262/#sec-symbol.prototype.description\n    defineBuiltInAccessor(SymbolPrototype, 'description', {\n      configurable: true,\n      get: function description() {\n        return getInternalState(this).description;\n      }\n    });\n    if (!IS_PURE) {\n      defineBuiltIn(ObjectPrototype, 'propertyIsEnumerable', $propertyIsEnumerable, { unsafe: true });\n    }\n  }\n}\n\n$({ global: true, constructor: true, wrap: true, forced: !NATIVE_SYMBOL, sham: !NATIVE_SYMBOL }, {\n  Symbol: $Symbol\n});\n\n$forEach(objectKeys(WellKnownSymbolsStore), function (name) {\n  defineWellKnownSymbol(name);\n});\n\n$({ target: SYMBOL, stat: true, forced: !NATIVE_SYMBOL }, {\n  useSetter: function () { USE_SETTER = true; },\n  useSimple: function () { USE_SETTER = false; }\n});\n\n$({ target: 'Object', stat: true, forced: !NATIVE_SYMBOL, sham: !DESCRIPTORS }, {\n  // `Object.create` method\n  // https://tc39.es/ecma262/#sec-object.create\n  create: $create,\n  // `Object.defineProperty` method\n  // https://tc39.es/ecma262/#sec-object.defineproperty\n  defineProperty: $defineProperty,\n  // `Object.defineProperties` method\n  // https://tc39.es/ecma262/#sec-object.defineproperties\n  defineProperties: $defineProperties,\n  // `Object.getOwnPropertyDescriptor` method\n  // https://tc39.es/ecma262/#sec-object.getownpropertydescriptors\n  getOwnPropertyDescriptor: $getOwnPropertyDescriptor\n});\n\n$({ target: 'Object', stat: true, forced: !NATIVE_SYMBOL }, {\n  // `Object.getOwnPropertyNames` method\n  // https://tc39.es/ecma262/#sec-object.getownpropertynames\n  getOwnPropertyNames: $getOwnPropertyNames\n});\n\n// `Symbol.prototype[@@toPrimitive]` method\n// https://tc39.es/ecma262/#sec-symbol.prototype-@@toprimitive\ndefineSymbolToPrimitive();\n\n// `Symbol.prototype[@@toStringTag]` property\n// https://tc39.es/ecma262/#sec-symbol.prototype-@@tostringtag\nsetToStringTag($Symbol, SYMBOL);\n\nhiddenKeys[HIDDEN] = true;\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar V8_PROTOTYPE_DEFINE_BUG = require('../internals/v8-prototype-define-bug');\nvar definePropertyModule = require('../internals/object-define-property');\nvar anObject = require('../internals/an-object');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar objectKeys = require('../internals/object-keys');\n\n// `Object.defineProperties` method\n// https://tc39.es/ecma262/#sec-object.defineproperties\n// eslint-disable-next-line es/no-object-defineproperties -- safe\nexports.f = DESCRIPTORS && !V8_PROTOTYPE_DEFINE_BUG ? Object.defineProperties : function defineProperties(O, Properties) {\n  anObject(O);\n  var props = toIndexedObject(Properties);\n  var keys = objectKeys(Properties);\n  var length = keys.length;\n  var index = 0;\n  var key;\n  while (length > index) definePropertyModule.f(O, key = keys[index++], props[key]);\n  return O;\n};\n","'use strict';\nvar $String = String;\n\nmodule.exports = function (argument) {\n  try {\n    return $String(argument);\n  } catch (error) {\n    return 'Object';\n  }\n};\n","'use strict';\nvar $TypeError = TypeError;\nvar MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF; // 2 ** 53 - 1 == 9007199254740991\n\nmodule.exports = function (it) {\n  if (it > MAX_SAFE_INTEGER) throw $TypeError('Maximum allowed index exceeded');\n  return it;\n};\n","'use strict';\nvar isCallable = require('../internals/is-callable');\nvar definePropertyModule = require('../internals/object-define-property');\nvar makeBuiltIn = require('../internals/make-built-in');\nvar defineGlobalProperty = require('../internals/define-global-property');\n\nmodule.exports = function (O, key, value, options) {\n  if (!options) options = {};\n  var simple = options.enumerable;\n  var name = options.name !== undefined ? options.name : key;\n  if (isCallable(value)) makeBuiltIn(value, name, options);\n  if (options.global) {\n    if (simple) O[key] = value;\n    else defineGlobalProperty(key, value);\n  } else {\n    try {\n      if (!options.unsafe) delete O[key];\n      else if (O[key]) simple = true;\n    } catch (error) { /* empty */ }\n    if (simple) O[key] = value;\n    else definePropertyModule.f(O, key, {\n      value: value,\n      enumerable: false,\n      configurable: !options.nonConfigurable,\n      writable: !options.nonWritable\n    });\n  } return O;\n};\n","(function(window, factory) {\n\tvar lazySizes = factory(window, window.document, Date);\n\twindow.lazySizes = lazySizes;\n\tif(typeof module == 'object' && module.exports){\n\t\tmodule.exports = lazySizes;\n\t}\n}(typeof window != 'undefined' ?\n      window : {}, \n/**\n * import(\"./types/global\")\n * @typedef { import(\"./types/lazysizes-config\").LazySizesConfigPartial } LazySizesConfigPartial\n */\nfunction l(window, document, Date) { // Pass in the window Date function also for SSR because the Date class can be lost\n\t'use strict';\n\t/*jshint eqnull:true */\n\n\tvar lazysizes,\n\t\t/**\n\t\t * @type { LazySizesConfigPartial }\n\t\t */\n\t\tlazySizesCfg;\n\n\t(function(){\n\t\tvar prop;\n\n\t\tvar lazySizesDefaults = {\n\t\t\tlazyClass: 'lazyload',\n\t\t\tloadedClass: 'lazyloaded',\n\t\t\tloadingClass: 'lazyloading',\n\t\t\tpreloadClass: 'lazypreload',\n\t\t\terrorClass: 'lazyerror',\n\t\t\t//strictClass: 'lazystrict',\n\t\t\tautosizesClass: 'lazyautosizes',\n\t\t\tfastLoadedClass: 'ls-is-cached',\n\t\t\tiframeLoadMode: 0,\n\t\t\tsrcAttr: 'data-src',\n\t\t\tsrcsetAttr: 'data-srcset',\n\t\t\tsizesAttr: 'data-sizes',\n\t\t\t//preloadAfterLoad: false,\n\t\t\tminSize: 40,\n\t\t\tcustomMedia: {},\n\t\t\tinit: true,\n\t\t\texpFactor: 1.5,\n\t\t\thFac: 0.8,\n\t\t\tloadMode: 2,\n\t\t\tloadHidden: true,\n\t\t\tricTimeout: 0,\n\t\t\tthrottleDelay: 125,\n\t\t};\n\n\t\tlazySizesCfg = window.lazySizesConfig || window.lazysizesConfig || {};\n\n\t\tfor(prop in lazySizesDefaults){\n\t\t\tif(!(prop in lazySizesCfg)){\n\t\t\t\tlazySizesCfg[prop] = lazySizesDefaults[prop];\n\t\t\t}\n\t\t}\n\t})();\n\n\tif (!document || !document.getElementsByClassName) {\n\t\treturn {\n\t\t\tinit: function () {},\n\t\t\t/**\n\t\t\t * @type { LazySizesConfigPartial }\n\t\t\t */\n\t\t\tcfg: lazySizesCfg,\n\t\t\t/**\n\t\t\t * @type { true }\n\t\t\t */\n\t\t\tnoSupport: true,\n\t\t};\n\t}\n\n\tvar docElem = document.documentElement;\n\n\tvar supportPicture = window.HTMLPictureElement;\n\n\tvar _addEventListener = 'addEventListener';\n\n\tvar _getAttribute = 'getAttribute';\n\n\t/**\n\t * Update to bind to window because 'this' becomes null during SSR\n\t * builds.\n\t */\n\tvar addEventListener = window[_addEventListener].bind(window);\n\n\tvar setTimeout = window.setTimeout;\n\n\tvar requestAnimationFrame = window.requestAnimationFrame || setTimeout;\n\n\tvar requestIdleCallback = window.requestIdleCallback;\n\n\tvar regPicture = /^picture$/i;\n\n\tvar loadEvents = ['load', 'error', 'lazyincluded', '_lazyloaded'];\n\n\tvar regClassCache = {};\n\n\tvar forEach = Array.prototype.forEach;\n\n\t/**\n\t * @param ele {Element}\n\t * @param cls {string}\n\t */\n\tvar hasClass = function(ele, cls) {\n\t\tif(!regClassCache[cls]){\n\t\t\tregClassCache[cls] = new RegExp('(\\\\s|^)'+cls+'(\\\\s|$)');\n\t\t}\n\t\treturn regClassCache[cls].test(ele[_getAttribute]('class') || '') && regClassCache[cls];\n\t};\n\n\t/**\n\t * @param ele {Element}\n\t * @param cls {string}\n\t */\n\tvar addClass = function(ele, cls) {\n\t\tif (!hasClass(ele, cls)){\n\t\t\tele.setAttribute('class', (ele[_getAttribute]('class') || '').trim() + ' ' + cls);\n\t\t}\n\t};\n\n\t/**\n\t * @param ele {Element}\n\t * @param cls {string}\n\t */\n\tvar removeClass = function(ele, cls) {\n\t\tvar reg;\n\t\tif ((reg = hasClass(ele,cls))) {\n\t\t\tele.setAttribute('class', (ele[_getAttribute]('class') || '').replace(reg, ' '));\n\t\t}\n\t};\n\n\tvar addRemoveLoadEvents = function(dom, fn, add){\n\t\tvar action = add ? _addEventListener : 'removeEventListener';\n\t\tif(add){\n\t\t\taddRemoveLoadEvents(dom, fn);\n\t\t}\n\t\tloadEvents.forEach(function(evt){\n\t\t\tdom[action](evt, fn);\n\t\t});\n\t};\n\n\t/**\n\t * @param elem { Element }\n\t * @param name { string }\n\t * @param detail { any }\n\t * @param noBubbles { boolean }\n\t * @param noCancelable { boolean }\n\t * @returns { CustomEvent }\n\t */\n\tvar triggerEvent = function(elem, name, detail, noBubbles, noCancelable){\n\t\tvar event = document.createEvent('Event');\n\n\t\tif(!detail){\n\t\t\tdetail = {};\n\t\t}\n\n\t\tdetail.instance = lazysizes;\n\n\t\tevent.initEvent(name, !noBubbles, !noCancelable);\n\n\t\tevent.detail = detail;\n\n\t\telem.dispatchEvent(event);\n\t\treturn event;\n\t};\n\n\tvar updatePolyfill = function (el, full){\n\t\tvar polyfill;\n\t\tif( !supportPicture && ( polyfill = (window.picturefill || lazySizesCfg.pf) ) ){\n\t\t\tif(full && full.src && !el[_getAttribute]('srcset')){\n\t\t\t\tel.setAttribute('srcset', full.src);\n\t\t\t}\n\t\t\tpolyfill({reevaluate: true, elements: [el]});\n\t\t} else if(full && full.src){\n\t\t\tel.src = full.src;\n\t\t}\n\t};\n\n\tvar getCSS = function (elem, style){\n\t\treturn (getComputedStyle(elem, null) || {})[style];\n\t};\n\n\t/**\n\t *\n\t * @param elem { Element }\n\t * @param parent { Element }\n\t * @param [width] {number}\n\t * @returns {number}\n\t */\n\tvar getWidth = function(elem, parent, width){\n\t\twidth = width || elem.offsetWidth;\n\n\t\twhile(width < lazySizesCfg.minSize && parent && !elem._lazysizesWidth){\n\t\t\twidth =  parent.offsetWidth;\n\t\t\tparent = parent.parentNode;\n\t\t}\n\n\t\treturn width;\n\t};\n\n\tvar rAF = (function(){\n\t\tvar running, waiting;\n\t\tvar firstFns = [];\n\t\tvar secondFns = [];\n\t\tvar fns = firstFns;\n\n\t\tvar run = function(){\n\t\t\tvar runFns = fns;\n\n\t\t\tfns = firstFns.length ? secondFns : firstFns;\n\n\t\t\trunning = true;\n\t\t\twaiting = false;\n\n\t\t\twhile(runFns.length){\n\t\t\t\trunFns.shift()();\n\t\t\t}\n\n\t\t\trunning = false;\n\t\t};\n\n\t\tvar rafBatch = function(fn, queue){\n\t\t\tif(running && !queue){\n\t\t\t\tfn.apply(this, arguments);\n\t\t\t} else {\n\t\t\t\tfns.push(fn);\n\n\t\t\t\tif(!waiting){\n\t\t\t\t\twaiting = true;\n\t\t\t\t\t(document.hidden ? setTimeout : requestAnimationFrame)(run);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\trafBatch._lsFlush = run;\n\n\t\treturn rafBatch;\n\t})();\n\n\tvar rAFIt = function(fn, simple){\n\t\treturn simple ?\n\t\t\tfunction() {\n\t\t\t\trAF(fn);\n\t\t\t} :\n\t\t\tfunction(){\n\t\t\t\tvar that = this;\n\t\t\t\tvar args = arguments;\n\t\t\t\trAF(function(){\n\t\t\t\t\tfn.apply(that, args);\n\t\t\t\t});\n\t\t\t}\n\t\t;\n\t};\n\n\tvar throttle = function(fn){\n\t\tvar running;\n\t\tvar lastTime = 0;\n\t\tvar gDelay = lazySizesCfg.throttleDelay;\n\t\tvar rICTimeout = lazySizesCfg.ricTimeout;\n\t\tvar run = function(){\n\t\t\trunning = false;\n\t\t\tlastTime = Date.now();\n\t\t\tfn();\n\t\t};\n\t\tvar idleCallback = requestIdleCallback && rICTimeout > 49 ?\n\t\t\tfunction(){\n\t\t\t\trequestIdleCallback(run, {timeout: rICTimeout});\n\n\t\t\t\tif(rICTimeout !== lazySizesCfg.ricTimeout){\n\t\t\t\t\trICTimeout = lazySizesCfg.ricTimeout;\n\t\t\t\t}\n\t\t\t} :\n\t\t\trAFIt(function(){\n\t\t\t\tsetTimeout(run);\n\t\t\t}, true)\n\t\t;\n\n\t\treturn function(isPriority){\n\t\t\tvar delay;\n\n\t\t\tif((isPriority = isPriority === true)){\n\t\t\t\trICTimeout = 33;\n\t\t\t}\n\n\t\t\tif(running){\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\trunning =  true;\n\n\t\t\tdelay = gDelay - (Date.now() - lastTime);\n\n\t\t\tif(delay < 0){\n\t\t\t\tdelay = 0;\n\t\t\t}\n\n\t\t\tif(isPriority || delay < 9){\n\t\t\t\tidleCallback();\n\t\t\t} else {\n\t\t\t\tsetTimeout(idleCallback, delay);\n\t\t\t}\n\t\t};\n\t};\n\n\t//based on http://modernjavascript.blogspot.de/2013/08/building-better-debounce.html\n\tvar debounce = function(func) {\n\t\tvar timeout, timestamp;\n\t\tvar wait = 99;\n\t\tvar run = function(){\n\t\t\ttimeout = null;\n\t\t\tfunc();\n\t\t};\n\t\tvar later = function() {\n\t\t\tvar last = Date.now() - timestamp;\n\n\t\t\tif (last < wait) {\n\t\t\t\tsetTimeout(later, wait - last);\n\t\t\t} else {\n\t\t\t\t(requestIdleCallback || run)(run);\n\t\t\t}\n\t\t};\n\n\t\treturn function() {\n\t\t\ttimestamp = Date.now();\n\n\t\t\tif (!timeout) {\n\t\t\t\ttimeout = setTimeout(later, wait);\n\t\t\t}\n\t\t};\n\t};\n\n\tvar loader = (function(){\n\t\tvar preloadElems, isCompleted, resetPreloadingTimer, loadMode, started;\n\n\t\tvar eLvW, elvH, eLtop, eLleft, eLright, eLbottom, isBodyHidden;\n\n\t\tvar regImg = /^img$/i;\n\t\tvar regIframe = /^iframe$/i;\n\n\t\tvar supportScroll = ('onscroll' in window) && !(/(gle|ing)bot/.test(navigator.userAgent));\n\n\t\tvar shrinkExpand = 0;\n\t\tvar currentExpand = 0;\n\n\t\tvar isLoading = 0;\n\t\tvar lowRuns = -1;\n\n\t\tvar resetPreloading = function(e){\n\t\t\tisLoading--;\n\t\t\tif(!e || isLoading < 0 || !e.target){\n\t\t\t\tisLoading = 0;\n\t\t\t}\n\t\t};\n\n\t\tvar isVisible = function (elem) {\n\t\t\tif (isBodyHidden == null) {\n\t\t\t\tisBodyHidden = getCSS(document.body, 'visibility') == 'hidden';\n\t\t\t}\n\n\t\t\treturn isBodyHidden || !(getCSS(elem.parentNode, 'visibility') == 'hidden' && getCSS(elem, 'visibility') == 'hidden');\n\t\t};\n\n\t\tvar isNestedVisible = function(elem, elemExpand){\n\t\t\tvar outerRect;\n\t\t\tvar parent = elem;\n\t\t\tvar visible = isVisible(elem);\n\n\t\t\teLtop -= elemExpand;\n\t\t\teLbottom += elemExpand;\n\t\t\teLleft -= elemExpand;\n\t\t\teLright += elemExpand;\n\n\t\t\twhile(visible && (parent = parent.offsetParent) && parent != document.body && parent != docElem){\n\t\t\t\tvisible = ((getCSS(parent, 'opacity') || 1) > 0);\n\n\t\t\t\tif(visible && getCSS(parent, 'overflow') != 'visible'){\n\t\t\t\t\touterRect = parent.getBoundingClientRect();\n\t\t\t\t\tvisible = eLright > outerRect.left &&\n\t\t\t\t\t\teLleft < outerRect.right &&\n\t\t\t\t\t\teLbottom > outerRect.top - 1 &&\n\t\t\t\t\t\teLtop < outerRect.bottom + 1\n\t\t\t\t\t;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn visible;\n\t\t};\n\n\t\tvar checkElements = function() {\n\t\t\tvar eLlen, i, rect, autoLoadElem, loadedSomething, elemExpand, elemNegativeExpand, elemExpandVal,\n\t\t\t\tbeforeExpandVal, defaultExpand, preloadExpand, hFac;\n\t\t\tvar lazyloadElems = lazysizes.elements;\n\n\t\t\tif((loadMode = lazySizesCfg.loadMode) && isLoading < 8 && (eLlen = lazyloadElems.length)){\n\n\t\t\t\ti = 0;\n\n\t\t\t\tlowRuns++;\n\n\t\t\t\tfor(; i < eLlen; i++){\n\n\t\t\t\t\tif(!lazyloadElems[i] || lazyloadElems[i]._lazyRace){continue;}\n\n\t\t\t\t\tif(!supportScroll || (lazysizes.prematureUnveil && lazysizes.prematureUnveil(lazyloadElems[i]))){unveilElement(lazyloadElems[i]);continue;}\n\n\t\t\t\t\tif(!(elemExpandVal = lazyloadElems[i][_getAttribute]('data-expand')) || !(elemExpand = elemExpandVal * 1)){\n\t\t\t\t\t\telemExpand = currentExpand;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!defaultExpand) {\n\t\t\t\t\t\tdefaultExpand = (!lazySizesCfg.expand || lazySizesCfg.expand < 1) ?\n\t\t\t\t\t\t\tdocElem.clientHeight > 500 && docElem.clientWidth > 500 ? 500 : 370 :\n\t\t\t\t\t\t\tlazySizesCfg.expand;\n\n\t\t\t\t\t\tlazysizes._defEx = defaultExpand;\n\n\t\t\t\t\t\tpreloadExpand = defaultExpand * lazySizesCfg.expFactor;\n\t\t\t\t\t\thFac = lazySizesCfg.hFac;\n\t\t\t\t\t\tisBodyHidden = null;\n\n\t\t\t\t\t\tif(currentExpand < preloadExpand && isLoading < 1 && lowRuns > 2 && loadMode > 2 && !document.hidden){\n\t\t\t\t\t\t\tcurrentExpand = preloadExpand;\n\t\t\t\t\t\t\tlowRuns = 0;\n\t\t\t\t\t\t} else if(loadMode > 1 && lowRuns > 1 && isLoading < 6){\n\t\t\t\t\t\t\tcurrentExpand = defaultExpand;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcurrentExpand = shrinkExpand;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif(beforeExpandVal !== elemExpand){\n\t\t\t\t\t\teLvW = innerWidth + (elemExpand * hFac);\n\t\t\t\t\t\telvH = innerHeight + elemExpand;\n\t\t\t\t\t\telemNegativeExpand = elemExpand * -1;\n\t\t\t\t\t\tbeforeExpandVal = elemExpand;\n\t\t\t\t\t}\n\n\t\t\t\t\trect = lazyloadElems[i].getBoundingClientRect();\n\n\t\t\t\t\tif ((eLbottom = rect.bottom) >= elemNegativeExpand &&\n\t\t\t\t\t\t(eLtop = rect.top) <= elvH &&\n\t\t\t\t\t\t(eLright = rect.right) >= elemNegativeExpand * hFac &&\n\t\t\t\t\t\t(eLleft = rect.left) <= eLvW &&\n\t\t\t\t\t\t(eLbottom || eLright || eLleft || eLtop) &&\n\t\t\t\t\t\t(lazySizesCfg.loadHidden || isVisible(lazyloadElems[i])) &&\n\t\t\t\t\t\t((isCompleted && isLoading < 3 && !elemExpandVal && (loadMode < 3 || lowRuns < 4)) || isNestedVisible(lazyloadElems[i], elemExpand))){\n\t\t\t\t\t\tunveilElement(lazyloadElems[i]);\n\t\t\t\t\t\tloadedSomething = true;\n\t\t\t\t\t\tif(isLoading > 9){break;}\n\t\t\t\t\t} else if(!loadedSomething && isCompleted && !autoLoadElem &&\n\t\t\t\t\t\tisLoading < 4 && lowRuns < 4 && loadMode > 2 &&\n\t\t\t\t\t\t(preloadElems[0] || lazySizesCfg.preloadAfterLoad) &&\n\t\t\t\t\t\t(preloadElems[0] || (!elemExpandVal && ((eLbottom || eLright || eLleft || eLtop) || lazyloadElems[i][_getAttribute](lazySizesCfg.sizesAttr) != 'auto')))){\n\t\t\t\t\t\tautoLoadElem = preloadElems[0] || lazyloadElems[i];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif(autoLoadElem && !loadedSomething){\n\t\t\t\t\tunveilElement(autoLoadElem);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tvar throttledCheckElements = throttle(checkElements);\n\n\t\tvar switchLoadingClass = function(e){\n\t\t\tvar elem = e.target;\n\n\t\t\tif (elem._lazyCache) {\n\t\t\t\tdelete elem._lazyCache;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tresetPreloading(e);\n\t\t\taddClass(elem, lazySizesCfg.loadedClass);\n\t\t\tremoveClass(elem, lazySizesCfg.loadingClass);\n\t\t\taddRemoveLoadEvents(elem, rafSwitchLoadingClass);\n\t\t\ttriggerEvent(elem, 'lazyloaded');\n\t\t};\n\t\tvar rafedSwitchLoadingClass = rAFIt(switchLoadingClass);\n\t\tvar rafSwitchLoadingClass = function(e){\n\t\t\trafedSwitchLoadingClass({target: e.target});\n\t\t};\n\n\t\tvar changeIframeSrc = function(elem, src){\n\t\t\tvar loadMode = elem.getAttribute('data-load-mode') || lazySizesCfg.iframeLoadMode;\n\n\t\t\t// loadMode can be also a string!\n\t\t\tif (loadMode == 0) {\n\t\t\t\telem.contentWindow.location.replace(src);\n\t\t\t} else if (loadMode == 1) {\n\t\t\t\telem.src = src;\n\t\t\t}\n\t\t};\n\n\t\tvar handleSources = function(source){\n\t\t\tvar customMedia;\n\n\t\t\tvar sourceSrcset = source[_getAttribute](lazySizesCfg.srcsetAttr);\n\n\t\t\tif( (customMedia = lazySizesCfg.customMedia[source[_getAttribute]('data-media') || source[_getAttribute]('media')]) ){\n\t\t\t\tsource.setAttribute('media', customMedia);\n\t\t\t}\n\n\t\t\tif(sourceSrcset){\n\t\t\t\tsource.setAttribute('srcset', sourceSrcset);\n\t\t\t}\n\t\t};\n\n\t\tvar lazyUnveil = rAFIt(function (elem, detail, isAuto, sizes, isImg){\n\t\t\tvar src, srcset, parent, isPicture, event, firesLoad;\n\n\t\t\tif(!(event = triggerEvent(elem, 'lazybeforeunveil', detail)).defaultPrevented){\n\n\t\t\t\tif(sizes){\n\t\t\t\t\tif(isAuto){\n\t\t\t\t\t\taddClass(elem, lazySizesCfg.autosizesClass);\n\t\t\t\t\t} else {\n\t\t\t\t\t\telem.setAttribute('sizes', sizes);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tsrcset = elem[_getAttribute](lazySizesCfg.srcsetAttr);\n\t\t\t\tsrc = elem[_getAttribute](lazySizesCfg.srcAttr);\n\n\t\t\t\tif(isImg) {\n\t\t\t\t\tparent = elem.parentNode;\n\t\t\t\t\tisPicture = parent && regPicture.test(parent.nodeName || '');\n\t\t\t\t}\n\n\t\t\t\tfiresLoad = detail.firesLoad || (('src' in elem) && (srcset || src || isPicture));\n\n\t\t\t\tevent = {target: elem};\n\n\t\t\t\taddClass(elem, lazySizesCfg.loadingClass);\n\n\t\t\t\tif(firesLoad){\n\t\t\t\t\tclearTimeout(resetPreloadingTimer);\n\t\t\t\t\tresetPreloadingTimer = setTimeout(resetPreloading, 2500);\n\t\t\t\t\taddRemoveLoadEvents(elem, rafSwitchLoadingClass, true);\n\t\t\t\t}\n\n\t\t\t\tif(isPicture){\n\t\t\t\t\tforEach.call(parent.getElementsByTagName('source'), handleSources);\n\t\t\t\t}\n\n\t\t\t\tif(srcset){\n\t\t\t\t\telem.setAttribute('srcset', srcset);\n\t\t\t\t} else if(src && !isPicture){\n\t\t\t\t\tif(regIframe.test(elem.nodeName)){\n\t\t\t\t\t\tchangeIframeSrc(elem, src);\n\t\t\t\t\t} else {\n\t\t\t\t\t\telem.src = src;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif(isImg && (srcset || isPicture)){\n\t\t\t\t\tupdatePolyfill(elem, {src: src});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(elem._lazyRace){\n\t\t\t\tdelete elem._lazyRace;\n\t\t\t}\n\t\t\tremoveClass(elem, lazySizesCfg.lazyClass);\n\n\t\t\trAF(function(){\n\t\t\t\t// Part of this can be removed as soon as this fix is older: https://bugs.chromium.org/p/chromium/issues/detail?id=7731 (2015)\n\t\t\t\tvar isLoaded = elem.complete && elem.naturalWidth > 1;\n\n\t\t\t\tif( !firesLoad || isLoaded){\n\t\t\t\t\tif (isLoaded) {\n\t\t\t\t\t\taddClass(elem, lazySizesCfg.fastLoadedClass);\n\t\t\t\t\t}\n\t\t\t\t\tswitchLoadingClass(event);\n\t\t\t\t\telem._lazyCache = true;\n\t\t\t\t\tsetTimeout(function(){\n\t\t\t\t\t\tif ('_lazyCache' in elem) {\n\t\t\t\t\t\t\tdelete elem._lazyCache;\n\t\t\t\t\t\t}\n\t\t\t\t\t}, 9);\n\t\t\t\t}\n\t\t\t\tif (elem.loading == 'lazy') {\n\t\t\t\t\tisLoading--;\n\t\t\t\t}\n\t\t\t}, true);\n\t\t});\n\n\t\t/**\n\t\t *\n\t\t * @param elem { Element }\n\t\t */\n\t\tvar unveilElement = function (elem){\n\t\t\tif (elem._lazyRace) {return;}\n\t\t\tvar detail;\n\n\t\t\tvar isImg = regImg.test(elem.nodeName);\n\n\t\t\t//allow using sizes=\"auto\", but don't use. it's invalid. Use data-sizes=\"auto\" or a valid value for sizes instead (i.e.: sizes=\"80vw\")\n\t\t\tvar sizes = isImg && (elem[_getAttribute](lazySizesCfg.sizesAttr) || elem[_getAttribute]('sizes'));\n\t\t\tvar isAuto = sizes == 'auto';\n\n\t\t\tif( (isAuto || !isCompleted) && isImg && (elem[_getAttribute]('src') || elem.srcset) && !elem.complete && !hasClass(elem, lazySizesCfg.errorClass) && hasClass(elem, lazySizesCfg.lazyClass)){return;}\n\n\t\t\tdetail = triggerEvent(elem, 'lazyunveilread').detail;\n\n\t\t\tif(isAuto){\n\t\t\t\t autoSizer.updateElem(elem, true, elem.offsetWidth);\n\t\t\t}\n\n\t\t\telem._lazyRace = true;\n\t\t\tisLoading++;\n\n\t\t\tlazyUnveil(elem, detail, isAuto, sizes, isImg);\n\t\t};\n\n\t\tvar afterScroll = debounce(function(){\n\t\t\tlazySizesCfg.loadMode = 3;\n\t\t\tthrottledCheckElements();\n\t\t});\n\n\t\tvar altLoadmodeScrollListner = function(){\n\t\t\tif(lazySizesCfg.loadMode == 3){\n\t\t\t\tlazySizesCfg.loadMode = 2;\n\t\t\t}\n\t\t\tafterScroll();\n\t\t};\n\n\t\tvar onload = function(){\n\t\t\tif(isCompleted){return;}\n\t\t\tif(Date.now() - started < 999){\n\t\t\t\tsetTimeout(onload, 999);\n\t\t\t\treturn;\n\t\t\t}\n\n\n\t\t\tisCompleted = true;\n\n\t\t\tlazySizesCfg.loadMode = 3;\n\n\t\t\tthrottledCheckElements();\n\n\t\t\taddEventListener('scroll', altLoadmodeScrollListner, true);\n\t\t};\n\n\t\treturn {\n\t\t\t_: function(){\n\t\t\t\tstarted = Date.now();\n\n\t\t\t\tlazysizes.elements = document.getElementsByClassName(lazySizesCfg.lazyClass);\n\t\t\t\tpreloadElems = document.getElementsByClassName(lazySizesCfg.lazyClass + ' ' + lazySizesCfg.preloadClass);\n\n\t\t\t\taddEventListener('scroll', throttledCheckElements, true);\n\n\t\t\t\taddEventListener('resize', throttledCheckElements, true);\n\n\t\t\t\taddEventListener('pageshow', function (e) {\n\t\t\t\t\tif (e.persisted) {\n\t\t\t\t\t\tvar loadingElements = document.querySelectorAll('.' + lazySizesCfg.loadingClass);\n\n\t\t\t\t\t\tif (loadingElements.length && loadingElements.forEach) {\n\t\t\t\t\t\t\trequestAnimationFrame(function () {\n\t\t\t\t\t\t\t\tloadingElements.forEach( function (img) {\n\t\t\t\t\t\t\t\t\tif (img.complete) {\n\t\t\t\t\t\t\t\t\t\tunveilElement(img);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tif(window.MutationObserver){\n\t\t\t\t\tnew MutationObserver( throttledCheckElements ).observe( docElem, {childList: true, subtree: true, attributes: true} );\n\t\t\t\t} else {\n\t\t\t\t\tdocElem[_addEventListener]('DOMNodeInserted', throttledCheckElements, true);\n\t\t\t\t\tdocElem[_addEventListener]('DOMAttrModified', throttledCheckElements, true);\n\t\t\t\t\tsetInterval(throttledCheckElements, 999);\n\t\t\t\t}\n\n\t\t\t\taddEventListener('hashchange', throttledCheckElements, true);\n\n\t\t\t\t//, 'fullscreenchange'\n\t\t\t\t['focus', 'mouseover', 'click', 'load', 'transitionend', 'animationend'].forEach(function(name){\n\t\t\t\t\tdocument[_addEventListener](name, throttledCheckElements, true);\n\t\t\t\t});\n\n\t\t\t\tif((/d$|^c/.test(document.readyState))){\n\t\t\t\t\tonload();\n\t\t\t\t} else {\n\t\t\t\t\taddEventListener('load', onload);\n\t\t\t\t\tdocument[_addEventListener]('DOMContentLoaded', throttledCheckElements);\n\t\t\t\t\tsetTimeout(onload, 20000);\n\t\t\t\t}\n\n\t\t\t\tif(lazysizes.elements.length){\n\t\t\t\t\tcheckElements();\n\t\t\t\t\trAF._lsFlush();\n\t\t\t\t} else {\n\t\t\t\t\tthrottledCheckElements();\n\t\t\t\t}\n\t\t\t},\n\t\t\tcheckElems: throttledCheckElements,\n\t\t\tunveil: unveilElement,\n\t\t\t_aLSL: altLoadmodeScrollListner,\n\t\t};\n\t})();\n\n\n\tvar autoSizer = (function(){\n\t\tvar autosizesElems;\n\n\t\tvar sizeElement = rAFIt(function(elem, parent, event, width){\n\t\t\tvar sources, i, len;\n\t\t\telem._lazysizesWidth = width;\n\t\t\twidth += 'px';\n\n\t\t\telem.setAttribute('sizes', width);\n\n\t\t\tif(regPicture.test(parent.nodeName || '')){\n\t\t\t\tsources = parent.getElementsByTagName('source');\n\t\t\t\tfor(i = 0, len = sources.length; i < len; i++){\n\t\t\t\t\tsources[i].setAttribute('sizes', width);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(!event.detail.dataAttr){\n\t\t\t\tupdatePolyfill(elem, event.detail);\n\t\t\t}\n\t\t});\n\t\t/**\n\t\t *\n\t\t * @param elem {Element}\n\t\t * @param dataAttr\n\t\t * @param [width] { number }\n\t\t */\n\t\tvar getSizeElement = function (elem, dataAttr, width){\n\t\t\tvar event;\n\t\t\tvar parent = elem.parentNode;\n\n\t\t\tif(parent){\n\t\t\t\twidth = getWidth(elem, parent, width);\n\t\t\t\tevent = triggerEvent(elem, 'lazybeforesizes', {width: width, dataAttr: !!dataAttr});\n\n\t\t\t\tif(!event.defaultPrevented){\n\t\t\t\t\twidth = event.detail.width;\n\n\t\t\t\t\tif(width && width !== elem._lazysizesWidth){\n\t\t\t\t\t\tsizeElement(elem, parent, event, width);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tvar updateElementsSizes = function(){\n\t\t\tvar i;\n\t\t\tvar len = autosizesElems.length;\n\t\t\tif(len){\n\t\t\t\ti = 0;\n\n\t\t\t\tfor(; i < len; i++){\n\t\t\t\t\tgetSizeElement(autosizesElems[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tvar debouncedUpdateElementsSizes = debounce(updateElementsSizes);\n\n\t\treturn {\n\t\t\t_: function(){\n\t\t\t\tautosizesElems = document.getElementsByClassName(lazySizesCfg.autosizesClass);\n\t\t\t\taddEventListener('resize', debouncedUpdateElementsSizes);\n\t\t\t},\n\t\t\tcheckElems: debouncedUpdateElementsSizes,\n\t\t\tupdateElem: getSizeElement\n\t\t};\n\t})();\n\n\tvar init = function(){\n\t\tif(!init.i && document.getElementsByClassName){\n\t\t\tinit.i = true;\n\t\t\tautoSizer._();\n\t\t\tloader._();\n\t\t}\n\t};\n\n\tsetTimeout(function(){\n\t\tif(lazySizesCfg.init){\n\t\t\tinit();\n\t\t}\n\t});\n\n\tlazysizes = {\n\t\t/**\n\t\t * @type { LazySizesConfigPartial }\n\t\t */\n\t\tcfg: lazySizesCfg,\n\t\tautoSizer: autoSizer,\n\t\tloader: loader,\n\t\tinit: init,\n\t\tuP: updatePolyfill,\n\t\taC: addClass,\n\t\trC: removeClass,\n\t\thC: hasClass,\n\t\tfire: triggerEvent,\n\t\tgW: getWidth,\n\t\trAF: rAF,\n\t};\n\n\treturn lazysizes;\n}\n));\n","var MiniMasonry = function(conf) {\n    this._sizes             = [];\n    this._columns           = [];\n    this._container         = null;\n    this._count             = null;\n    this._width             = 0;\n    this._removeListener    = null;\n    this._currentGutterX    = null;\n    this._currentGutterY    = null;\n\n    this._resizeTimeout = null,\n\n    this.conf = {\n        baseWidth: 255,\n        gutterX: null,\n        gutterY: null,\n        gutter: 10,\n        container: null,\n        minify: true,\n        ultimateGutter: 5,\n        surroundingGutter: true,\n        direction: 'ltr',\n        wedge: false\n    };\n\n    this.init(conf);\n\n    return this;\n};\n\nMiniMasonry.prototype.init = function(conf) {\n    for (var i in this.conf) {\n        if (conf[i] != undefined) {\n            this.conf[i] = conf[i];\n        }\n    }\n\n    if (this.conf.gutterX == null || this.conf.gutterY == null) {\n        this.conf.gutterX = this.conf.gutterY = this.conf.gutter;\n    }\n    this._currentGutterX = this.conf.gutterX;\n    this._currentGutterY = this.conf.gutterY;\n\n    this._container = typeof this.conf.container == 'object' && this.conf.container.nodeName ?\n        this.conf.container :\n        document.querySelector(this.conf.container);\n\n    if (!this._container) {\n        throw new Error('Container not found or missing');\n    }\n\n    var onResize = this.resizeThrottler.bind(this);\n    window.addEventListener(\"resize\", onResize);\n    this._removeListener = function() {\n        window.removeEventListener(\"resize\", onResize);\n        if (this._resizeTimeout != null) {\n            window.clearTimeout(this._resizeTimeout);\n            this._resizeTimeout = null;\n        }\n    };\n\n    this.layout();\n};\n\nMiniMasonry.prototype.reset = function() {\n    this._sizes   = [];\n    this._columns = [];\n    this._count   = null;\n    this._width   = this._container.clientWidth;\n    var minWidth  = this.conf.baseWidth;\n    if (this._width < minWidth) {\n        this._width = minWidth;\n        this._container.style.minWidth = minWidth + 'px';\n    }\n\n    if (this.getCount() == 1) {\n        // Set ultimate gutter when only one column is displayed\n        this._currentGutterX = this.conf.ultimateGutter;\n        // As gutters are reduced, two column may fit, forcing to 1\n        this._count = 1;\n    } else if (this._width < (this.conf.baseWidth + (2 * this._currentGutterX))) {\n        // Remove gutter when screen is to low\n        this._currentGutterX = 0;\n    } else {\n        this._currentGutterX = this.conf.gutterX;\n    }\n};\n\nMiniMasonry.prototype.getCount = function() {\n    if (this.conf.surroundingGutter) {\n        return Math.floor((this._width - this._currentGutterX) / (this.conf.baseWidth + this._currentGutterX));\n    }\n\n    return Math.floor((this._width + this._currentGutterX) / (this.conf.baseWidth + this._currentGutterX));\n};\n\nMiniMasonry.prototype.computeWidth = function() {\n    var width;\n    if (this.conf.surroundingGutter) {\n        width = ((this._width - this._currentGutterX) / this._count) - this._currentGutterX;\n    } else {\n        width = ((this._width + this._currentGutterX) / this._count) - this._currentGutterX;\n    }\n    width = Number.parseFloat(width.toFixed(2));\n\n    return width;\n};\n\nMiniMasonry.prototype.layout =  function() {\n    if (!this._container) {\n        console.error('Container not found');\n        return;\n    }\n    this.reset();\n\n    //Computing columns count\n    if (this._count == null) {\n        this._count = this.getCount();\n    }\n    //Computing columns width\n    var colWidth = this.computeWidth();\n\n    for (var i = 0; i < this._count; i++) {\n        this._columns[i] = 0;\n    }\n\n    //Saving children real heights\n    var children = this._container.children;\n    for (var k = 0;k< children.length; k++) {\n        // Set colWidth before retrieving element height if content is proportional\n        children[k].style.width = colWidth + 'px';\n        this._sizes[k] = children[k].clientHeight;\n    }\n\n    var startX;\n    if (this.conf.direction == 'ltr') {\n        startX = this.conf.surroundingGutter ? this._currentGutterX : 0;\n    } else {\n        startX = this._width - (this.conf.surroundingGutter ? this._currentGutterX : 0);\n    }\n    if (this._count > this._sizes.length) {\n        //If more columns than children\n        var occupiedSpace = (this._sizes.length * (colWidth + this._currentGutterX)) - this._currentGutterX;\n        if (this.conf.wedge === false) {\n            if (this.conf.direction == 'ltr') {\n                startX = ((this._width - occupiedSpace) / 2);\n            } else {\n                startX = this._width - ((this._width - occupiedSpace) / 2);\n            }\n        } else {\n            if (this.conf.direction == 'ltr') ; else {\n                startX = this._width - this._currentGutterX;\n            }\n        }\n    }\n\n    //Computing position of children\n    for (var index = 0;index < children.length; index++) {\n        var nextColumn = this.conf.minify ? this.getShortest() : this.getNextColumn(index);\n\n        var childrenGutter = 0;\n        if (this.conf.surroundingGutter || nextColumn != this._columns.length) {\n            childrenGutter = this._currentGutterX;\n        }\n        var x;\n        if (this.conf.direction == 'ltr') {\n            x = startX + ((colWidth + childrenGutter) * (nextColumn));\n        } else {\n            x = startX - ((colWidth + childrenGutter) * (nextColumn)) - colWidth;\n        }\n        var y = this._columns[nextColumn];\n\n\n        children[index].style.transform = 'translate3d(' + Math.round(x) + 'px,' + Math.round(y) + 'px,0)';\n\n        this._columns[nextColumn] += this._sizes[index] + (this._count > 1 ? this.conf.gutterY : this.conf.ultimateGutter);//margin-bottom\n    }\n\n    this._container.style.height = (this._columns[this.getLongest()] - this._currentGutterY) + 'px';\n};\n\nMiniMasonry.prototype.getNextColumn = function(index) {\n    return index % this._columns.length;\n};\n\nMiniMasonry.prototype.getShortest = function() {\n    var shortest = 0;\n    for (var i = 0; i < this._count; i++) {\n        if (this._columns[i] < this._columns[shortest]) {\n            shortest = i;\n        }\n    }\n\n    return shortest;\n};\n\nMiniMasonry.prototype.getLongest = function() {\n    var longest = 0;\n    for (var i = 0; i < this._count; i++) {\n        if (this._columns[i] > this._columns[longest]) {\n            longest = i;\n        }\n    }\n\n    return longest;\n};\n\nMiniMasonry.prototype.resizeThrottler = function() {\n    // ignore resize events as long as an actualResizeHandler execution is in the queue\n    if ( !this._resizeTimeout ) {\n\n        this._resizeTimeout = setTimeout(function() {\n            this._resizeTimeout = null;\n            //IOS Safari throw random resize event on scroll, call layout only if size has changed\n            if (this._container.clientWidth != this._width) {\n                this.layout();\n            }\n           // The actualResizeHandler will execute at a rate of 30fps\n        }.bind(this), 33);\n    }\n};\n\nMiniMasonry.prototype.destroy = function() {\n    if (typeof this._removeListener == \"function\") {\n        this._removeListener();\n    }\n\n    var children = this._container.children;\n    for (var k = 0;k< children.length; k++) {\n        children[k].style.removeProperty('width');\n        children[k].style.removeProperty('transform');\n    }\n    this._container.style.removeProperty('height');\n    this._container.style.removeProperty('min-width');\n};\n\nexport { MiniMasonry as default };\n","'use strict';\nvar create = require('../internals/object-create');\nvar defineBuiltInAccessor = require('../internals/define-built-in-accessor');\nvar defineBuiltIns = require('../internals/define-built-ins');\nvar bind = require('../internals/function-bind-context');\nvar anInstance = require('../internals/an-instance');\nvar isNullOrUndefined = require('../internals/is-null-or-undefined');\nvar iterate = require('../internals/iterate');\nvar defineIterator = require('../internals/iterator-define');\nvar createIterResultObject = require('../internals/create-iter-result-object');\nvar setSpecies = require('../internals/set-species');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar fastKey = require('../internals/internal-metadata').fastKey;\nvar InternalStateModule = require('../internals/internal-state');\n\nvar setInternalState = InternalStateModule.set;\nvar internalStateGetterFor = InternalStateModule.getterFor;\n\nmodule.exports = {\n  getConstructor: function (wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER) {\n    var Constructor = wrapper(function (that, iterable) {\n      anInstance(that, Prototype);\n      setInternalState(that, {\n        type: CONSTRUCTOR_NAME,\n        index: create(null),\n        first: null,\n        last: null,\n        size: 0\n      });\n      if (!DESCRIPTORS) that.size = 0;\n      if (!isNullOrUndefined(iterable)) iterate(iterable, that[ADDER], { that: that, AS_ENTRIES: IS_MAP });\n    });\n\n    var Prototype = Constructor.prototype;\n\n    var getInternalState = internalStateGetterFor(CONSTRUCTOR_NAME);\n\n    var define = function (that, key, value) {\n      var state = getInternalState(that);\n      var entry = getEntry(that, key);\n      var previous, index;\n      // change existing entry\n      if (entry) {\n        entry.value = value;\n      // create new entry\n      } else {\n        state.last = entry = {\n          index: index = fastKey(key, true),\n          key: key,\n          value: value,\n          previous: previous = state.last,\n          next: null,\n          removed: false\n        };\n        if (!state.first) state.first = entry;\n        if (previous) previous.next = entry;\n        if (DESCRIPTORS) state.size++;\n        else that.size++;\n        // add to index\n        if (index !== 'F') state.index[index] = entry;\n      } return that;\n    };\n\n    var getEntry = function (that, key) {\n      var state = getInternalState(that);\n      // fast case\n      var index = fastKey(key);\n      var entry;\n      if (index !== 'F') return state.index[index];\n      // frozen object case\n      for (entry = state.first; entry; entry = entry.next) {\n        if (entry.key === key) return entry;\n      }\n    };\n\n    defineBuiltIns(Prototype, {\n      // `{ Map, Set }.prototype.clear()` methods\n      // https://tc39.es/ecma262/#sec-map.prototype.clear\n      // https://tc39.es/ecma262/#sec-set.prototype.clear\n      clear: function clear() {\n        var that = this;\n        var state = getInternalState(that);\n        var entry = state.first;\n        while (entry) {\n          entry.removed = true;\n          if (entry.previous) entry.previous = entry.previous.next = null;\n          entry = entry.next;\n        }\n        state.first = state.last = null;\n        state.index = create(null);\n        if (DESCRIPTORS) state.size = 0;\n        else that.size = 0;\n      },\n      // `{ Map, Set }.prototype.delete(key)` methods\n      // https://tc39.es/ecma262/#sec-map.prototype.delete\n      // https://tc39.es/ecma262/#sec-set.prototype.delete\n      'delete': function (key) {\n        var that = this;\n        var state = getInternalState(that);\n        var entry = getEntry(that, key);\n        if (entry) {\n          var next = entry.next;\n          var prev = entry.previous;\n          delete state.index[entry.index];\n          entry.removed = true;\n          if (prev) prev.next = next;\n          if (next) next.previous = prev;\n          if (state.first === entry) state.first = next;\n          if (state.last === entry) state.last = prev;\n          if (DESCRIPTORS) state.size--;\n          else that.size--;\n        } return !!entry;\n      },\n      // `{ Map, Set }.prototype.forEach(callbackfn, thisArg = undefined)` methods\n      // https://tc39.es/ecma262/#sec-map.prototype.foreach\n      // https://tc39.es/ecma262/#sec-set.prototype.foreach\n      forEach: function forEach(callbackfn /* , that = undefined */) {\n        var state = getInternalState(this);\n        var boundFunction = bind(callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n        var entry;\n        while (entry = entry ? entry.next : state.first) {\n          boundFunction(entry.value, entry.key, this);\n          // revert to the last existing entry\n          while (entry && entry.removed) entry = entry.previous;\n        }\n      },\n      // `{ Map, Set}.prototype.has(key)` methods\n      // https://tc39.es/ecma262/#sec-map.prototype.has\n      // https://tc39.es/ecma262/#sec-set.prototype.has\n      has: function has(key) {\n        return !!getEntry(this, key);\n      }\n    });\n\n    defineBuiltIns(Prototype, IS_MAP ? {\n      // `Map.prototype.get(key)` method\n      // https://tc39.es/ecma262/#sec-map.prototype.get\n      get: function get(key) {\n        var entry = getEntry(this, key);\n        return entry && entry.value;\n      },\n      // `Map.prototype.set(key, value)` method\n      // https://tc39.es/ecma262/#sec-map.prototype.set\n      set: function set(key, value) {\n        return define(this, key === 0 ? 0 : key, value);\n      }\n    } : {\n      // `Set.prototype.add(value)` method\n      // https://tc39.es/ecma262/#sec-set.prototype.add\n      add: function add(value) {\n        return define(this, value = value === 0 ? 0 : value, value);\n      }\n    });\n    if (DESCRIPTORS) defineBuiltInAccessor(Prototype, 'size', {\n      configurable: true,\n      get: function () {\n        return getInternalState(this).size;\n      }\n    });\n    return Constructor;\n  },\n  setStrong: function (Constructor, CONSTRUCTOR_NAME, IS_MAP) {\n    var ITERATOR_NAME = CONSTRUCTOR_NAME + ' Iterator';\n    var getInternalCollectionState = internalStateGetterFor(CONSTRUCTOR_NAME);\n    var getInternalIteratorState = internalStateGetterFor(ITERATOR_NAME);\n    // `{ Map, Set }.prototype.{ keys, values, entries, @@iterator }()` methods\n    // https://tc39.es/ecma262/#sec-map.prototype.entries\n    // https://tc39.es/ecma262/#sec-map.prototype.keys\n    // https://tc39.es/ecma262/#sec-map.prototype.values\n    // https://tc39.es/ecma262/#sec-map.prototype-@@iterator\n    // https://tc39.es/ecma262/#sec-set.prototype.entries\n    // https://tc39.es/ecma262/#sec-set.prototype.keys\n    // https://tc39.es/ecma262/#sec-set.prototype.values\n    // https://tc39.es/ecma262/#sec-set.prototype-@@iterator\n    defineIterator(Constructor, CONSTRUCTOR_NAME, function (iterated, kind) {\n      setInternalState(this, {\n        type: ITERATOR_NAME,\n        target: iterated,\n        state: getInternalCollectionState(iterated),\n        kind: kind,\n        last: null\n      });\n    }, function () {\n      var state = getInternalIteratorState(this);\n      var kind = state.kind;\n      var entry = state.last;\n      // revert to the last existing entry\n      while (entry && entry.removed) entry = entry.previous;\n      // get next entry\n      if (!state.target || !(state.last = entry = entry ? entry.next : state.state.first)) {\n        // or finish the iteration\n        state.target = null;\n        return createIterResultObject(undefined, true);\n      }\n      // return step by kind\n      if (kind === 'keys') return createIterResultObject(entry.key, false);\n      if (kind === 'values') return createIterResultObject(entry.value, false);\n      return createIterResultObject([entry.key, entry.value], false);\n    }, IS_MAP ? 'entries' : 'values', !IS_MAP, true);\n\n    // `{ Map, Set }.prototype[@@species]` accessors\n    // https://tc39.es/ecma262/#sec-get-map-@@species\n    // https://tc39.es/ecma262/#sec-get-set-@@species\n    setSpecies(CONSTRUCTOR_NAME);\n  }\n};\n","'use strict';\nvar TO_STRING_TAG_SUPPORT = require('../internals/to-string-tag-support');\nvar isCallable = require('../internals/is-callable');\nvar classofRaw = require('../internals/classof-raw');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar $Object = Object;\n\n// ES3 wrong here\nvar CORRECT_ARGUMENTS = classofRaw(function () { return arguments; }()) === 'Arguments';\n\n// fallback for IE11 Script Access Denied error\nvar tryGet = function (it, key) {\n  try {\n    return it[key];\n  } catch (error) { /* empty */ }\n};\n\n// getting tag from ES6+ `Object.prototype.toString`\nmodule.exports = TO_STRING_TAG_SUPPORT ? classofRaw : function (it) {\n  var O, tag, result;\n  return it === undefined ? 'Undefined' : it === null ? 'Null'\n    // @@toStringTag case\n    : typeof (tag = tryGet(O = $Object(it), TO_STRING_TAG)) == 'string' ? tag\n    // builtinTag case\n    : CORRECT_ARGUMENTS ? classofRaw(O)\n    // ES3 arguments fallback\n    : (result = classofRaw(O)) === 'Object' && isCallable(O.callee) ? 'Arguments' : result;\n};\n","'use strict';\nvar toPrimitive = require('../internals/to-primitive');\nvar isSymbol = require('../internals/is-symbol');\n\n// `ToPropertyKey` abstract operation\n// https://tc39.es/ecma262/#sec-topropertykey\nmodule.exports = function (argument) {\n  var key = toPrimitive(argument, 'string');\n  return isSymbol(key) ? key : key + '';\n};\n","'use strict';\nmodule.exports = function (bitmap, value) {\n  return {\n    enumerable: !(bitmap & 1),\n    configurable: !(bitmap & 2),\n    writable: !(bitmap & 4),\n    value: value\n  };\n};\n","/**\n * vertical layout mode\n */\n\n( function( window, factory ) {\n  // universal module definition\n  /* jshint strict: false */ /*globals define, module, require */\n  if ( typeof define == 'function' && define.amd ) {\n    // AMD\n    define( [\n        '../layout-mode'\n      ],\n      factory );\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n      require('../layout-mode')\n    );\n  } else {\n    // browser global\n    factory(\n      window.Isotope.LayoutMode\n    );\n  }\n\n}( window, function factory( LayoutMode ) {\n'use strict';\n\nvar Vertical = LayoutMode.create( 'vertical', {\n  horizontalAlignment: 0\n});\n\nvar proto = Vertical.prototype;\n\nproto._resetLayout = function() {\n  this.y = 0;\n};\n\nproto._getItemLayoutPosition = function( item ) {\n  item.getSize();\n  var x = ( this.isotope.size.innerWidth - item.size.outerWidth ) *\n    this.options.horizontalAlignment;\n  var y = this.y;\n  this.y += item.size.outerHeight;\n  return { x: x, y: y };\n};\n\nproto._getContainerSize = function() {\n  return { height: this.y };\n};\n\nreturn Vertical;\n\n}));\n","/*!\n * Masonry v4.2.2\n * Cascading grid layout library\n * https://masonry.desandro.com\n * MIT License\n * by David DeSandro\n */\n\n( function( window, factory ) {\n  // universal module definition\n  /* jshint strict: false */ /*globals define, module, require */\n  if ( typeof define == 'function' && define.amd ) {\n    // AMD\n    define( [\n        'outlayer/outlayer',\n        'get-size/get-size'\n      ],\n      factory );\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n      require('outlayer'),\n      require('get-size')\n    );\n  } else {\n    // browser global\n    window.Masonry = factory(\n      window.Outlayer,\n      window.getSize\n    );\n  }\n\n}( window, function factory( Outlayer, getSize ) {\n\n'use strict';\n\n// -------------------------- masonryDefinition -------------------------- //\n\n  // create an Outlayer layout class\n  var Masonry = Outlayer.create('masonry');\n  // isFitWidth -> fitWidth\n  Masonry.compatOptions.fitWidth = 'isFitWidth';\n\n  var proto = Masonry.prototype;\n\n  proto._resetLayout = function() {\n    this.getSize();\n    this._getMeasurement( 'columnWidth', 'outerWidth' );\n    this._getMeasurement( 'gutter', 'outerWidth' );\n    this.measureColumns();\n\n    // reset column Y\n    this.colYs = [];\n    for ( var i=0; i < this.cols; i++ ) {\n      this.colYs.push( 0 );\n    }\n\n    this.maxY = 0;\n    this.horizontalColIndex = 0;\n  };\n\n  proto.measureColumns = function() {\n    this.getContainerWidth();\n    // if columnWidth is 0, default to outerWidth of first item\n    if ( !this.columnWidth ) {\n      var firstItem = this.items[0];\n      var firstItemElem = firstItem && firstItem.element;\n      // columnWidth fall back to item of first element\n      this.columnWidth = firstItemElem && getSize( firstItemElem ).outerWidth ||\n        // if first elem has no width, default to size of container\n        this.containerWidth;\n    }\n\n    var columnWidth = this.columnWidth += this.gutter;\n\n    // calculate columns\n    var containerWidth = this.containerWidth + this.gutter;\n    var cols = containerWidth / columnWidth;\n    // fix rounding errors, typically with gutters\n    var excess = columnWidth - containerWidth % columnWidth;\n    // if overshoot is less than a pixel, round up, otherwise floor it\n    var mathMethod = excess && excess < 1 ? 'round' : 'floor';\n    cols = Math[ mathMethod ]( cols );\n    this.cols = Math.max( cols, 1 );\n  };\n\n  proto.getContainerWidth = function() {\n    // container is parent if fit width\n    var isFitWidth = this._getOption('fitWidth');\n    var container = isFitWidth ? this.element.parentNode : this.element;\n    // check that this.size and size are there\n    // IE8 triggers resize on body size change, so they might not be\n    var size = getSize( container );\n    this.containerWidth = size && size.innerWidth;\n  };\n\n  proto._getItemLayoutPosition = function( item ) {\n    item.getSize();\n    // how many columns does this brick span\n    var remainder = item.size.outerWidth % this.columnWidth;\n    var mathMethod = remainder && remainder < 1 ? 'round' : 'ceil';\n    // round if off by 1 pixel, otherwise use ceil\n    var colSpan = Math[ mathMethod ]( item.size.outerWidth / this.columnWidth );\n    colSpan = Math.min( colSpan, this.cols );\n    // use horizontal or top column position\n    var colPosMethod = this.options.horizontalOrder ?\n      '_getHorizontalColPosition' : '_getTopColPosition';\n    var colPosition = this[ colPosMethod ]( colSpan, item );\n    // position the brick\n    var position = {\n      x: this.columnWidth * colPosition.col,\n      y: colPosition.y\n    };\n    // apply setHeight to necessary columns\n    var setHeight = colPosition.y + item.size.outerHeight;\n    var setMax = colSpan + colPosition.col;\n    for ( var i = colPosition.col; i < setMax; i++ ) {\n      this.colYs[i] = setHeight;\n    }\n\n    return position;\n  };\n\n  proto._getTopColPosition = function( colSpan ) {\n    var colGroup = this._getTopColGroup( colSpan );\n    // get the minimum Y value from the columns\n    var minimumY = Math.min.apply( Math, colGroup );\n\n    return {\n      col: colGroup.indexOf( minimumY ),\n      y: minimumY,\n    };\n  };\n\n  /**\n   * @param {Number} colSpan - number of columns the element spans\n   * @returns {Array} colGroup\n   */\n  proto._getTopColGroup = function( colSpan ) {\n    if ( colSpan < 2 ) {\n      // if brick spans only one column, use all the column Ys\n      return this.colYs;\n    }\n\n    var colGroup = [];\n    // how many different places could this brick fit horizontally\n    var groupCount = this.cols + 1 - colSpan;\n    // for each group potential horizontal position\n    for ( var i = 0; i < groupCount; i++ ) {\n      colGroup[i] = this._getColGroupY( i, colSpan );\n    }\n    return colGroup;\n  };\n\n  proto._getColGroupY = function( col, colSpan ) {\n    if ( colSpan < 2 ) {\n      return this.colYs[ col ];\n    }\n    // make an array of colY values for that one group\n    var groupColYs = this.colYs.slice( col, col + colSpan );\n    // and get the max value of the array\n    return Math.max.apply( Math, groupColYs );\n  };\n\n  // get column position based on horizontal index. #873\n  proto._getHorizontalColPosition = function( colSpan, item ) {\n    var col = this.horizontalColIndex % this.cols;\n    var isOver = colSpan > 1 && col + colSpan > this.cols;\n    // shift to next row if item can't fit on current row\n    col = isOver ? 0 : col;\n    // don't let zero-size items take up space\n    var hasSize = item.size.outerWidth && item.size.outerHeight;\n    this.horizontalColIndex = hasSize ? col + colSpan : this.horizontalColIndex;\n\n    return {\n      col: col,\n      y: this._getColGroupY( col, colSpan ),\n    };\n  };\n\n  proto._manageStamp = function( stamp ) {\n    var stampSize = getSize( stamp );\n    var offset = this._getElementOffset( stamp );\n    // get the columns that this stamp affects\n    var isOriginLeft = this._getOption('originLeft');\n    var firstX = isOriginLeft ? offset.left : offset.right;\n    var lastX = firstX + stampSize.outerWidth;\n    var firstCol = Math.floor( firstX / this.columnWidth );\n    firstCol = Math.max( 0, firstCol );\n    var lastCol = Math.floor( lastX / this.columnWidth );\n    // lastCol should not go over if multiple of columnWidth #425\n    lastCol -= lastX % this.columnWidth ? 0 : 1;\n    lastCol = Math.min( this.cols - 1, lastCol );\n    // set colYs to bottom of the stamp\n\n    var isOriginTop = this._getOption('originTop');\n    var stampMaxY = ( isOriginTop ? offset.top : offset.bottom ) +\n      stampSize.outerHeight;\n    for ( var i = firstCol; i <= lastCol; i++ ) {\n      this.colYs[i] = Math.max( stampMaxY, this.colYs[i] );\n    }\n  };\n\n  proto._getContainerSize = function() {\n    this.maxY = Math.max.apply( Math, this.colYs );\n    var size = {\n      height: this.maxY\n    };\n\n    if ( this._getOption('fitWidth') ) {\n      size.width = this._getContainerFitWidth();\n    }\n\n    return size;\n  };\n\n  proto._getContainerFitWidth = function() {\n    var unusedCols = 0;\n    // count unused columns\n    var i = this.cols;\n    while ( --i ) {\n      if ( this.colYs[i] !== 0 ) {\n        break;\n      }\n      unusedCols++;\n    }\n    // fit container to columns that have been used\n    return ( this.cols - unusedCols ) * this.columnWidth - this.gutter;\n  };\n\n  proto.needsResizeLayout = function() {\n    var previousWidth = this.containerWidth;\n    this.getContainerWidth();\n    return previousWidth != this.containerWidth;\n  };\n\n  return Masonry;\n\n}));\n","import {\n\tControls,\n\tMOUSE,\n\tQuaternion,\n\tSpherical,\n\tTOUCH,\n\tVector2,\n\tVector3,\n\tPlane,\n\tRay,\n\tMathUtils\n} from 'three';\n\n/**\n * Fires when the camera has been transformed by the controls.\n *\n * @event OrbitControls#change\n * @type {Object}\n */\nconst _changeEvent = { type: 'change' };\n\n/**\n * Fires when an interaction was initiated.\n *\n * @event OrbitControls#start\n * @type {Object}\n */\nconst _startEvent = { type: 'start' };\n\n/**\n * Fires when an interaction has finished.\n *\n * @event OrbitControls#end\n * @type {Object}\n */\nconst _endEvent = { type: 'end' };\n\nconst _ray = new Ray();\nconst _plane = new Plane();\nconst _TILT_LIMIT = Math.cos( 70 * MathUtils.DEG2RAD );\n\nconst _v = new Vector3();\nconst _twoPI = 2 * Math.PI;\n\nconst _STATE = {\n\tNONE: - 1,\n\tROTATE: 0,\n\tDOLLY: 1,\n\tPAN: 2,\n\tTOUCH_ROTATE: 3,\n\tTOUCH_PAN: 4,\n\tTOUCH_DOLLY_PAN: 5,\n\tTOUCH_DOLLY_ROTATE: 6\n};\nconst _EPS = 0.000001;\n\n\n/**\n * Orbit controls allow the camera to orbit around a target.\n *\n * OrbitControls performs orbiting, dollying (zooming), and panning. Unlike {@link TrackballControls},\n * it maintains the \"up\" direction `object.up` (+Y by default).\n *\n * - Orbit: Left mouse / touch: one-finger move.\n * - Zoom: Middle mouse, or mousewheel / touch: two-finger spread or squish.\n * - Pan: Right mouse, or left mouse + ctrl/meta/shiftKey, or arrow keys / touch: two-finger move.\n *\n * ```js\n * const controls = new OrbitControls( camera, renderer.domElement );\n *\n * // controls.update() must be called after any manual changes to the camera's transform\n * camera.position.set( 0, 20, 100 );\n * controls.update();\n *\n * function animate() {\n *\n * \t// required if controls.enableDamping or controls.autoRotate are set to true\n * \tcontrols.update();\n *\n * \trenderer.render( scene, camera );\n *\n * }\n * ```\n *\n * @augments Controls\n * @three_import import { OrbitControls } from 'three/addons/controls/OrbitControls.js';\n */\nclass OrbitControls extends Controls {\n\n\t/**\n\t * Constructs a new controls instance.\n\t *\n\t * @param {Object3D} object - The object that is managed by the controls.\n\t * @param {?HTMLElement} domElement - The HTML element used for event listeners.\n\t */\n\tconstructor( object, domElement = null ) {\n\n\t\tsuper( object, domElement );\n\n\t\tthis.state = _STATE.NONE;\n\n\t\t/**\n\t\t * The focus point of the controls, the `object` orbits around this.\n\t\t * It can be updated manually at any point to change the focus of the controls.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.target = new Vector3();\n\n\t\t/**\n\t\t * The focus point of the `minTargetRadius` and `maxTargetRadius` limits.\n\t\t * It can be updated manually at any point to change the center of interest\n\t\t * for the `target`.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.cursor = new Vector3();\n\n\t\t/**\n\t\t * How far you can dolly in (perspective camera only).\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.minDistance = 0;\n\n\t\t/**\n\t\t * How far you can dolly out (perspective camera only).\n\t\t *\n\t\t * @type {number}\n\t\t * @default Infinity\n\t\t */\n\t\tthis.maxDistance = Infinity;\n\n\t\t/**\n\t\t * How far you can zoom in (orthographic camera only).\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.minZoom = 0;\n\n\t\t/**\n\t\t * How far you can zoom out (orthographic camera only).\n\t\t *\n\t\t * @type {number}\n\t\t * @default Infinity\n\t\t */\n\t\tthis.maxZoom = Infinity;\n\n\t\t/**\n\t\t * How close you can get the target to the 3D `cursor`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.minTargetRadius = 0;\n\n\t\t/**\n\t\t * How far you can move the target from the 3D `cursor`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default Infinity\n\t\t */\n\t\tthis.maxTargetRadius = Infinity;\n\n\t\t/**\n\t\t * How far you can orbit vertically, lower limit. Range is `[0, Math.PI]` radians.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.minPolarAngle = 0;\n\n\t\t/**\n\t\t * How far you can orbit vertically, upper limit. Range is `[0, Math.PI]` radians.\n\t\t *\n\t\t * @type {number}\n\t\t * @default Math.PI\n\t\t */\n\t\tthis.maxPolarAngle = Math.PI;\n\n\t\t/**\n\t\t * How far you can orbit horizontally, lower limit. If set, the interval `[ min, max ]`\n\t\t * must be a sub-interval of `[ - 2 PI, 2 PI ]`, with `( max - min < 2 PI )`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default -Infinity\n\t\t */\n\t\tthis.minAzimuthAngle = - Infinity;\n\n\t\t/**\n\t\t * How far you can orbit horizontally, upper limit. If set, the interval `[ min, max ]`\n\t\t * must be a sub-interval of `[ - 2 PI, 2 PI ]`, with `( max - min < 2 PI )`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default -Infinity\n\t\t */\n\t\tthis.maxAzimuthAngle = Infinity;\n\n\t\t/**\n\t\t * Set to `true` to enable damping (inertia), which can be used to give a sense of weight\n\t\t * to the controls. Note that if this is enabled, you must call `update()` in your animation\n\t\t * loop.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.enableDamping = false;\n\n\t\t/**\n\t\t * The damping inertia used if `enableDamping` is set to `true`.\n\t\t *\n\t\t * Note that for this to work, you must call `update()` in your animation loop.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.05\n\t\t */\n\t\tthis.dampingFactor = 0.05;\n\n\t\t/**\n\t\t * Enable or disable zooming (dollying) of the camera.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.enableZoom = true;\n\n\t\t/**\n\t\t * Speed of zooming / dollying.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.zoomSpeed = 1.0;\n\n\t\t/**\n\t\t * Enable or disable horizontal and vertical rotation of the camera.\n\t\t *\n\t\t * Note that it is possible to disable a single axis by setting the min and max of the\n\t\t * `minPolarAngle` or `minAzimuthAngle` to the same value, which will cause the vertical\n\t\t * or horizontal rotation to be fixed at that value.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.enableRotate = true;\n\n\t\t/**\n\t\t * Speed of rotation.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.rotateSpeed = 1.0;\n\n\t\t/**\n\t\t * How fast to rotate the camera when the keyboard is used.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.keyRotateSpeed = 1.0;\n\n\t\t/**\n\t\t * Enable or disable camera panning.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.enablePan = true;\n\n\t\t/**\n\t\t * Speed of panning.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.panSpeed = 1.0;\n\n\t\t/**\n\t\t * Defines how the camera's position is translated when panning. If `true`, the camera pans\n\t\t * in screen space. Otherwise, the camera pans in the plane orthogonal to the camera's up\n\t\t * direction.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.screenSpacePanning = true;\n\n\t\t/**\n\t\t * How fast to pan the camera when the keyboard is used in\n\t\t * pixels per keypress.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 7\n\t\t */\n\t\tthis.keyPanSpeed = 7.0;\n\n\t\t/**\n\t\t * Setting this property to `true` allows to zoom to the cursor's position.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.zoomToCursor = false;\n\n\t\t/**\n\t\t * Set to true to automatically rotate around the target\n\t\t *\n\t\t * Note that if this is enabled, you must call `update()` in your animation loop.\n\t\t * If you want the auto-rotate speed to be independent of the frame rate (the refresh\n\t\t * rate of the display), you must pass the time `deltaTime`, in seconds, to `update()`.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.autoRotate = false;\n\n\t\t/**\n\t\t * How fast to rotate around the target if `autoRotate` is `true`. The default  equates to 30 seconds\n\t\t * per orbit at 60fps.\n\t\t *\n\t\t * Note that if `autoRotate` is enabled, you must call `update()` in your animation loop.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 2\n\t\t */\n\t\tthis.autoRotateSpeed = 2.0;\n\n\t\t/**\n\t\t * This object contains references to the keycodes for controlling camera panning.\n\t\t *\n\t\t * ```js\n\t\t * controls.keys = {\n\t\t * \tLEFT: 'ArrowLeft', //left arrow\n\t\t * \tUP: 'ArrowUp', // up arrow\n\t\t * \tRIGHT: 'ArrowRight', // right arrow\n\t\t * \tBOTTOM: 'ArrowDown' // down arrow\n\t\t * }\n\t\t * ```\n\t\t * @type {Object}\n\t\t */\n\t\tthis.keys = { LEFT: 'ArrowLeft', UP: 'ArrowUp', RIGHT: 'ArrowRight', BOTTOM: 'ArrowDown' };\n\n\t\t/**\n\t\t * This object contains references to the mouse actions used by the controls.\n\t\t *\n\t\t * ```js\n\t\t * controls.mouseButtons = {\n\t\t * \tLEFT: THREE.MOUSE.ROTATE,\n\t\t * \tMIDDLE: THREE.MOUSE.DOLLY,\n\t\t * \tRIGHT: THREE.MOUSE.PAN\n\t\t * }\n\t\t * ```\n\t\t * @type {Object}\n\t\t */\n\t\tthis.mouseButtons = { LEFT: MOUSE.ROTATE, MIDDLE: MOUSE.DOLLY, RIGHT: MOUSE.PAN };\n\n\t\t/**\n\t\t * This object contains references to the touch actions used by the controls.\n\t\t *\n\t\t * ```js\n\t\t * controls.mouseButtons = {\n\t\t * \tONE: THREE.TOUCH.ROTATE,\n\t\t * \tTWO: THREE.TOUCH.DOLLY_PAN\n\t\t * }\n\t\t * ```\n\t\t * @type {Object}\n\t\t */\n\t\tthis.touches = { ONE: TOUCH.ROTATE, TWO: TOUCH.DOLLY_PAN };\n\n\t\t/**\n\t\t * Used internally by `saveState()` and `reset()`.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.target0 = this.target.clone();\n\n\t\t/**\n\t\t * Used internally by `saveState()` and `reset()`.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.position0 = this.object.position.clone();\n\n\t\t/**\n\t\t * Used internally by `saveState()` and `reset()`.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.zoom0 = this.object.zoom;\n\n\t\t// the target DOM element for key events\n\t\tthis._domElementKeyEvents = null;\n\n\t\t// internals\n\n\t\tthis._lastPosition = new Vector3();\n\t\tthis._lastQuaternion = new Quaternion();\n\t\tthis._lastTargetPosition = new Vector3();\n\n\t\t// so camera.up is the orbit axis\n\t\tthis._quat = new Quaternion().setFromUnitVectors( object.up, new Vector3( 0, 1, 0 ) );\n\t\tthis._quatInverse = this._quat.clone().invert();\n\n\t\t// current position in spherical coordinates\n\t\tthis._spherical = new Spherical();\n\t\tthis._sphericalDelta = new Spherical();\n\n\t\tthis._scale = 1;\n\t\tthis._panOffset = new Vector3();\n\n\t\tthis._rotateStart = new Vector2();\n\t\tthis._rotateEnd = new Vector2();\n\t\tthis._rotateDelta = new Vector2();\n\n\t\tthis._panStart = new Vector2();\n\t\tthis._panEnd = new Vector2();\n\t\tthis._panDelta = new Vector2();\n\n\t\tthis._dollyStart = new Vector2();\n\t\tthis._dollyEnd = new Vector2();\n\t\tthis._dollyDelta = new Vector2();\n\n\t\tthis._dollyDirection = new Vector3();\n\t\tthis._mouse = new Vector2();\n\t\tthis._performCursorZoom = false;\n\n\t\tthis._pointers = [];\n\t\tthis._pointerPositions = {};\n\n\t\tthis._controlActive = false;\n\n\t\t// event listeners\n\n\t\tthis._onPointerMove = onPointerMove.bind( this );\n\t\tthis._onPointerDown = onPointerDown.bind( this );\n\t\tthis._onPointerUp = onPointerUp.bind( this );\n\t\tthis._onContextMenu = onContextMenu.bind( this );\n\t\tthis._onMouseWheel = onMouseWheel.bind( this );\n\t\tthis._onKeyDown = onKeyDown.bind( this );\n\n\t\tthis._onTouchStart = onTouchStart.bind( this );\n\t\tthis._onTouchMove = onTouchMove.bind( this );\n\n\t\tthis._onMouseDown = onMouseDown.bind( this );\n\t\tthis._onMouseMove = onMouseMove.bind( this );\n\n\t\tthis._interceptControlDown = interceptControlDown.bind( this );\n\t\tthis._interceptControlUp = interceptControlUp.bind( this );\n\n\t\t//\n\n\t\tif ( this.domElement !== null ) {\n\n\t\t\tthis.connect( this.domElement );\n\n\t\t}\n\n\t\tthis.update();\n\n\t}\n\n\tconnect( element ) {\n\n\t\tsuper.connect( element );\n\n\t\tthis.domElement.addEventListener( 'pointerdown', this._onPointerDown );\n\t\tthis.domElement.addEventListener( 'pointercancel', this._onPointerUp );\n\n\t\tthis.domElement.addEventListener( 'contextmenu', this._onContextMenu );\n\t\tthis.domElement.addEventListener( 'wheel', this._onMouseWheel, { passive: false } );\n\n\t\tconst document = this.domElement.getRootNode(); // offscreen canvas compatibility\n\t\tdocument.addEventListener( 'keydown', this._interceptControlDown, { passive: true, capture: true } );\n\n\t\tthis.domElement.style.touchAction = 'none'; // disable touch scroll\n\n\t}\n\n\tdisconnect() {\n\n\t\tthis.domElement.removeEventListener( 'pointerdown', this._onPointerDown );\n\t\tthis.domElement.removeEventListener( 'pointermove', this._onPointerMove );\n\t\tthis.domElement.removeEventListener( 'pointerup', this._onPointerUp );\n\t\tthis.domElement.removeEventListener( 'pointercancel', this._onPointerUp );\n\n\t\tthis.domElement.removeEventListener( 'wheel', this._onMouseWheel );\n\t\tthis.domElement.removeEventListener( 'contextmenu', this._onContextMenu );\n\n\t\tthis.stopListenToKeyEvents();\n\n\t\tconst document = this.domElement.getRootNode(); // offscreen canvas compatibility\n\t\tdocument.removeEventListener( 'keydown', this._interceptControlDown, { capture: true } );\n\n\t\tthis.domElement.style.touchAction = 'auto';\n\n\t}\n\n\tdispose() {\n\n\t\tthis.disconnect();\n\n\t}\n\n\t/**\n\t * Get the current vertical rotation, in radians.\n\t *\n\t * @return {number} The current vertical rotation, in radians.\n\t */\n\tgetPolarAngle() {\n\n\t\treturn this._spherical.phi;\n\n\t}\n\n\t/**\n\t * Get the current horizontal rotation, in radians.\n\t *\n\t * @return {number} The current horizontal rotation, in radians.\n\t */\n\tgetAzimuthalAngle() {\n\n\t\treturn this._spherical.theta;\n\n\t}\n\n\t/**\n\t * Returns the distance from the camera to the target.\n\t *\n\t * @return {number} The distance from the camera to the target.\n\t */\n\tgetDistance() {\n\n\t\treturn this.object.position.distanceTo( this.target );\n\n\t}\n\n\t/**\n\t * Adds key event listeners to the given DOM element.\n\t * `window` is a recommended argument for using this method.\n\t *\n\t * @param {HTMLElement} domElement - The DOM element\n\t */\n\tlistenToKeyEvents( domElement ) {\n\n\t\tdomElement.addEventListener( 'keydown', this._onKeyDown );\n\t\tthis._domElementKeyEvents = domElement;\n\n\t}\n\n\t/**\n\t * Removes the key event listener previously defined with `listenToKeyEvents()`.\n\t */\n\tstopListenToKeyEvents() {\n\n\t\tif ( this._domElementKeyEvents !== null ) {\n\n\t\t\tthis._domElementKeyEvents.removeEventListener( 'keydown', this._onKeyDown );\n\t\t\tthis._domElementKeyEvents = null;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Save the current state of the controls. This can later be recovered with `reset()`.\n\t */\n\tsaveState() {\n\n\t\tthis.target0.copy( this.target );\n\t\tthis.position0.copy( this.object.position );\n\t\tthis.zoom0 = this.object.zoom;\n\n\t}\n\n\t/**\n\t * Reset the controls to their state from either the last time the `saveState()`\n\t * was called, or the initial state.\n\t */\n\treset() {\n\n\t\tthis.target.copy( this.target0 );\n\t\tthis.object.position.copy( this.position0 );\n\t\tthis.object.zoom = this.zoom0;\n\n\t\tthis.object.updateProjectionMatrix();\n\t\tthis.dispatchEvent( _changeEvent );\n\n\t\tthis.update();\n\n\t\tthis.state = _STATE.NONE;\n\n\t}\n\n\tupdate( deltaTime = null ) {\n\n\t\tconst position = this.object.position;\n\n\t\t_v.copy( position ).sub( this.target );\n\n\t\t// rotate offset to \"y-axis-is-up\" space\n\t\t_v.applyQuaternion( this._quat );\n\n\t\t// angle from z-axis around y-axis\n\t\tthis._spherical.setFromVector3( _v );\n\n\t\tif ( this.autoRotate && this.state === _STATE.NONE ) {\n\n\t\t\tthis._rotateLeft( this._getAutoRotationAngle( deltaTime ) );\n\n\t\t}\n\n\t\tif ( this.enableDamping ) {\n\n\t\t\tthis._spherical.theta += this._sphericalDelta.theta * this.dampingFactor;\n\t\t\tthis._spherical.phi += this._sphericalDelta.phi * this.dampingFactor;\n\n\t\t} else {\n\n\t\t\tthis._spherical.theta += this._sphericalDelta.theta;\n\t\t\tthis._spherical.phi += this._sphericalDelta.phi;\n\n\t\t}\n\n\t\t// restrict theta to be between desired limits\n\n\t\tlet min = this.minAzimuthAngle;\n\t\tlet max = this.maxAzimuthAngle;\n\n\t\tif ( isFinite( min ) && isFinite( max ) ) {\n\n\t\t\tif ( min < - Math.PI ) min += _twoPI; else if ( min > Math.PI ) min -= _twoPI;\n\n\t\t\tif ( max < - Math.PI ) max += _twoPI; else if ( max > Math.PI ) max -= _twoPI;\n\n\t\t\tif ( min <= max ) {\n\n\t\t\t\tthis._spherical.theta = Math.max( min, Math.min( max, this._spherical.theta ) );\n\n\t\t\t} else {\n\n\t\t\t\tthis._spherical.theta = ( this._spherical.theta > ( min + max ) / 2 ) ?\n\t\t\t\t\tMath.max( min, this._spherical.theta ) :\n\t\t\t\t\tMath.min( max, this._spherical.theta );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// restrict phi to be between desired limits\n\t\tthis._spherical.phi = Math.max( this.minPolarAngle, Math.min( this.maxPolarAngle, this._spherical.phi ) );\n\n\t\tthis._spherical.makeSafe();\n\n\n\t\t// move target to panned location\n\n\t\tif ( this.enableDamping === true ) {\n\n\t\t\tthis.target.addScaledVector( this._panOffset, this.dampingFactor );\n\n\t\t} else {\n\n\t\t\tthis.target.add( this._panOffset );\n\n\t\t}\n\n\t\t// Limit the target distance from the cursor to create a sphere around the center of interest\n\t\tthis.target.sub( this.cursor );\n\t\tthis.target.clampLength( this.minTargetRadius, this.maxTargetRadius );\n\t\tthis.target.add( this.cursor );\n\n\t\tlet zoomChanged = false;\n\t\t// adjust the camera position based on zoom only if we're not zooming to the cursor or if it's an ortho camera\n\t\t// we adjust zoom later in these cases\n\t\tif ( this.zoomToCursor && this._performCursorZoom || this.object.isOrthographicCamera ) {\n\n\t\t\tthis._spherical.radius = this._clampDistance( this._spherical.radius );\n\n\t\t} else {\n\n\t\t\tconst prevRadius = this._spherical.radius;\n\t\t\tthis._spherical.radius = this._clampDistance( this._spherical.radius * this._scale );\n\t\t\tzoomChanged = prevRadius != this._spherical.radius;\n\n\t\t}\n\n\t\t_v.setFromSpherical( this._spherical );\n\n\t\t// rotate offset back to \"camera-up-vector-is-up\" space\n\t\t_v.applyQuaternion( this._quatInverse );\n\n\t\tposition.copy( this.target ).add( _v );\n\n\t\tthis.object.lookAt( this.target );\n\n\t\tif ( this.enableDamping === true ) {\n\n\t\t\tthis._sphericalDelta.theta *= ( 1 - this.dampingFactor );\n\t\t\tthis._sphericalDelta.phi *= ( 1 - this.dampingFactor );\n\n\t\t\tthis._panOffset.multiplyScalar( 1 - this.dampingFactor );\n\n\t\t} else {\n\n\t\t\tthis._sphericalDelta.set( 0, 0, 0 );\n\n\t\t\tthis._panOffset.set( 0, 0, 0 );\n\n\t\t}\n\n\t\t// adjust camera position\n\t\tif ( this.zoomToCursor && this._performCursorZoom ) {\n\n\t\t\tlet newRadius = null;\n\t\t\tif ( this.object.isPerspectiveCamera ) {\n\n\t\t\t\t// move the camera down the pointer ray\n\t\t\t\t// this method avoids floating point error\n\t\t\t\tconst prevRadius = _v.length();\n\t\t\t\tnewRadius = this._clampDistance( prevRadius * this._scale );\n\n\t\t\t\tconst radiusDelta = prevRadius - newRadius;\n\t\t\t\tthis.object.position.addScaledVector( this._dollyDirection, radiusDelta );\n\t\t\t\tthis.object.updateMatrixWorld();\n\n\t\t\t\tzoomChanged = !! radiusDelta;\n\n\t\t\t} else if ( this.object.isOrthographicCamera ) {\n\n\t\t\t\t// adjust the ortho camera position based on zoom changes\n\t\t\t\tconst mouseBefore = new Vector3( this._mouse.x, this._mouse.y, 0 );\n\t\t\t\tmouseBefore.unproject( this.object );\n\n\t\t\t\tconst prevZoom = this.object.zoom;\n\t\t\t\tthis.object.zoom = Math.max( this.minZoom, Math.min( this.maxZoom, this.object.zoom / this._scale ) );\n\t\t\t\tthis.object.updateProjectionMatrix();\n\n\t\t\t\tzoomChanged = prevZoom !== this.object.zoom;\n\n\t\t\t\tconst mouseAfter = new Vector3( this._mouse.x, this._mouse.y, 0 );\n\t\t\t\tmouseAfter.unproject( this.object );\n\n\t\t\t\tthis.object.position.sub( mouseAfter ).add( mouseBefore );\n\t\t\t\tthis.object.updateMatrixWorld();\n\n\t\t\t\tnewRadius = _v.length();\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - zoom to cursor disabled.' );\n\t\t\t\tthis.zoomToCursor = false;\n\n\t\t\t}\n\n\t\t\t// handle the placement of the target\n\t\t\tif ( newRadius !== null ) {\n\n\t\t\t\tif ( this.screenSpacePanning ) {\n\n\t\t\t\t\t// position the orbit target in front of the new camera position\n\t\t\t\t\tthis.target.set( 0, 0, - 1 )\n\t\t\t\t\t\t.transformDirection( this.object.matrix )\n\t\t\t\t\t\t.multiplyScalar( newRadius )\n\t\t\t\t\t\t.add( this.object.position );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// get the ray and translation plane to compute target\n\t\t\t\t\t_ray.origin.copy( this.object.position );\n\t\t\t\t\t_ray.direction.set( 0, 0, - 1 ).transformDirection( this.object.matrix );\n\n\t\t\t\t\t// if the camera is 20 degrees above the horizon then don't adjust the focus target to avoid\n\t\t\t\t\t// extremely large values\n\t\t\t\t\tif ( Math.abs( this.object.up.dot( _ray.direction ) ) < _TILT_LIMIT ) {\n\n\t\t\t\t\t\tthis.object.lookAt( this.target );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_plane.setFromNormalAndCoplanarPoint( this.object.up, this.target );\n\t\t\t\t\t\t_ray.intersectPlane( _plane, this.target );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else if ( this.object.isOrthographicCamera ) {\n\n\t\t\tconst prevZoom = this.object.zoom;\n\t\t\tthis.object.zoom = Math.max( this.minZoom, Math.min( this.maxZoom, this.object.zoom / this._scale ) );\n\n\t\t\tif ( prevZoom !== this.object.zoom ) {\n\n\t\t\t\tthis.object.updateProjectionMatrix();\n\t\t\t\tzoomChanged = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis._scale = 1;\n\t\tthis._performCursorZoom = false;\n\n\t\t// update condition is:\n\t\t// min(camera displacement, camera rotation in radians)^2 > EPS\n\t\t// using small-angle approximation cos(x/2) = 1 - x^2 / 8\n\n\t\tif ( zoomChanged ||\n\t\t\tthis._lastPosition.distanceToSquared( this.object.position ) > _EPS ||\n\t\t\t8 * ( 1 - this._lastQuaternion.dot( this.object.quaternion ) ) > _EPS ||\n\t\t\tthis._lastTargetPosition.distanceToSquared( this.target ) > _EPS ) {\n\n\t\t\tthis.dispatchEvent( _changeEvent );\n\n\t\t\tthis._lastPosition.copy( this.object.position );\n\t\t\tthis._lastQuaternion.copy( this.object.quaternion );\n\t\t\tthis._lastTargetPosition.copy( this.target );\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\t_getAutoRotationAngle( deltaTime ) {\n\n\t\tif ( deltaTime !== null ) {\n\n\t\t\treturn ( _twoPI / 60 * this.autoRotateSpeed ) * deltaTime;\n\n\t\t} else {\n\n\t\t\treturn _twoPI / 60 / 60 * this.autoRotateSpeed;\n\n\t\t}\n\n\t}\n\n\t_getZoomScale( delta ) {\n\n\t\tconst normalizedDelta = Math.abs( delta * 0.01 );\n\t\treturn Math.pow( 0.95, this.zoomSpeed * normalizedDelta );\n\n\t}\n\n\t_rotateLeft( angle ) {\n\n\t\tthis._sphericalDelta.theta -= angle;\n\n\t}\n\n\t_rotateUp( angle ) {\n\n\t\tthis._sphericalDelta.phi -= angle;\n\n\t}\n\n\t_panLeft( distance, objectMatrix ) {\n\n\t\t_v.setFromMatrixColumn( objectMatrix, 0 ); // get X column of objectMatrix\n\t\t_v.multiplyScalar( - distance );\n\n\t\tthis._panOffset.add( _v );\n\n\t}\n\n\t_panUp( distance, objectMatrix ) {\n\n\t\tif ( this.screenSpacePanning === true ) {\n\n\t\t\t_v.setFromMatrixColumn( objectMatrix, 1 );\n\n\t\t} else {\n\n\t\t\t_v.setFromMatrixColumn( objectMatrix, 0 );\n\t\t\t_v.crossVectors( this.object.up, _v );\n\n\t\t}\n\n\t\t_v.multiplyScalar( distance );\n\n\t\tthis._panOffset.add( _v );\n\n\t}\n\n\t// deltaX and deltaY are in pixels; right and down are positive\n\t_pan( deltaX, deltaY ) {\n\n\t\tconst element = this.domElement;\n\n\t\tif ( this.object.isPerspectiveCamera ) {\n\n\t\t\t// perspective\n\t\t\tconst position = this.object.position;\n\t\t\t_v.copy( position ).sub( this.target );\n\t\t\tlet targetDistance = _v.length();\n\n\t\t\t// half of the fov is center to top of screen\n\t\t\ttargetDistance *= Math.tan( ( this.object.fov / 2 ) * Math.PI / 180.0 );\n\n\t\t\t// we use only clientHeight here so aspect ratio does not distort speed\n\t\t\tthis._panLeft( 2 * deltaX * targetDistance / element.clientHeight, this.object.matrix );\n\t\t\tthis._panUp( 2 * deltaY * targetDistance / element.clientHeight, this.object.matrix );\n\n\t\t} else if ( this.object.isOrthographicCamera ) {\n\n\t\t\t// orthographic\n\t\t\tthis._panLeft( deltaX * ( this.object.right - this.object.left ) / this.object.zoom / element.clientWidth, this.object.matrix );\n\t\t\tthis._panUp( deltaY * ( this.object.top - this.object.bottom ) / this.object.zoom / element.clientHeight, this.object.matrix );\n\n\t\t} else {\n\n\t\t\t// camera neither orthographic nor perspective\n\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.' );\n\t\t\tthis.enablePan = false;\n\n\t\t}\n\n\t}\n\n\t_dollyOut( dollyScale ) {\n\n\t\tif ( this.object.isPerspectiveCamera || this.object.isOrthographicCamera ) {\n\n\t\t\tthis._scale /= dollyScale;\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' );\n\t\t\tthis.enableZoom = false;\n\n\t\t}\n\n\t}\n\n\t_dollyIn( dollyScale ) {\n\n\t\tif ( this.object.isPerspectiveCamera || this.object.isOrthographicCamera ) {\n\n\t\t\tthis._scale *= dollyScale;\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' );\n\t\t\tthis.enableZoom = false;\n\n\t\t}\n\n\t}\n\n\t_updateZoomParameters( x, y ) {\n\n\t\tif ( ! this.zoomToCursor ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis._performCursorZoom = true;\n\n\t\tconst rect = this.domElement.getBoundingClientRect();\n\t\tconst dx = x - rect.left;\n\t\tconst dy = y - rect.top;\n\t\tconst w = rect.width;\n\t\tconst h = rect.height;\n\n\t\tthis._mouse.x = ( dx / w ) * 2 - 1;\n\t\tthis._mouse.y = - ( dy / h ) * 2 + 1;\n\n\t\tthis._dollyDirection.set( this._mouse.x, this._mouse.y, 1 ).unproject( this.object ).sub( this.object.position ).normalize();\n\n\t}\n\n\t_clampDistance( dist ) {\n\n\t\treturn Math.max( this.minDistance, Math.min( this.maxDistance, dist ) );\n\n\t}\n\n\t//\n\t// event callbacks - update the object state\n\t//\n\n\t_handleMouseDownRotate( event ) {\n\n\t\tthis._rotateStart.set( event.clientX, event.clientY );\n\n\t}\n\n\t_handleMouseDownDolly( event ) {\n\n\t\tthis._updateZoomParameters( event.clientX, event.clientX );\n\t\tthis._dollyStart.set( event.clientX, event.clientY );\n\n\t}\n\n\t_handleMouseDownPan( event ) {\n\n\t\tthis._panStart.set( event.clientX, event.clientY );\n\n\t}\n\n\t_handleMouseMoveRotate( event ) {\n\n\t\tthis._rotateEnd.set( event.clientX, event.clientY );\n\n\t\tthis._rotateDelta.subVectors( this._rotateEnd, this._rotateStart ).multiplyScalar( this.rotateSpeed );\n\n\t\tconst element = this.domElement;\n\n\t\tthis._rotateLeft( _twoPI * this._rotateDelta.x / element.clientHeight ); // yes, height\n\n\t\tthis._rotateUp( _twoPI * this._rotateDelta.y / element.clientHeight );\n\n\t\tthis._rotateStart.copy( this._rotateEnd );\n\n\t\tthis.update();\n\n\t}\n\n\t_handleMouseMoveDolly( event ) {\n\n\t\tthis._dollyEnd.set( event.clientX, event.clientY );\n\n\t\tthis._dollyDelta.subVectors( this._dollyEnd, this._dollyStart );\n\n\t\tif ( this._dollyDelta.y > 0 ) {\n\n\t\t\tthis._dollyOut( this._getZoomScale( this._dollyDelta.y ) );\n\n\t\t} else if ( this._dollyDelta.y < 0 ) {\n\n\t\t\tthis._dollyIn( this._getZoomScale( this._dollyDelta.y ) );\n\n\t\t}\n\n\t\tthis._dollyStart.copy( this._dollyEnd );\n\n\t\tthis.update();\n\n\t}\n\n\t_handleMouseMovePan( event ) {\n\n\t\tthis._panEnd.set( event.clientX, event.clientY );\n\n\t\tthis._panDelta.subVectors( this._panEnd, this._panStart ).multiplyScalar( this.panSpeed );\n\n\t\tthis._pan( this._panDelta.x, this._panDelta.y );\n\n\t\tthis._panStart.copy( this._panEnd );\n\n\t\tthis.update();\n\n\t}\n\n\t_handleMouseWheel( event ) {\n\n\t\tthis._updateZoomParameters( event.clientX, event.clientY );\n\n\t\tif ( event.deltaY < 0 ) {\n\n\t\t\tthis._dollyIn( this._getZoomScale( event.deltaY ) );\n\n\t\t} else if ( event.deltaY > 0 ) {\n\n\t\t\tthis._dollyOut( this._getZoomScale( event.deltaY ) );\n\n\t\t}\n\n\t\tthis.update();\n\n\t}\n\n\t_handleKeyDown( event ) {\n\n\t\tlet needsUpdate = false;\n\n\t\tswitch ( event.code ) {\n\n\t\t\tcase this.keys.UP:\n\n\t\t\t\tif ( event.ctrlKey || event.metaKey || event.shiftKey ) {\n\n\t\t\t\t\tif ( this.enableRotate ) {\n\n\t\t\t\t\t\tthis._rotateUp( _twoPI * this.keyRotateSpeed / this.domElement.clientHeight );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( this.enablePan ) {\n\n\t\t\t\t\t\tthis._pan( 0, this.keyPanSpeed );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tneedsUpdate = true;\n\t\t\t\tbreak;\n\n\t\t\tcase this.keys.BOTTOM:\n\n\t\t\t\tif ( event.ctrlKey || event.metaKey || event.shiftKey ) {\n\n\t\t\t\t\tif ( this.enableRotate ) {\n\n\t\t\t\t\t\tthis._rotateUp( - _twoPI * this.keyRotateSpeed / this.domElement.clientHeight );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( this.enablePan ) {\n\n\t\t\t\t\t\tthis._pan( 0, - this.keyPanSpeed );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tneedsUpdate = true;\n\t\t\t\tbreak;\n\n\t\t\tcase this.keys.LEFT:\n\n\t\t\t\tif ( event.ctrlKey || event.metaKey || event.shiftKey ) {\n\n\t\t\t\t\tif ( this.enableRotate ) {\n\n\t\t\t\t\t\tthis._rotateLeft( _twoPI * this.keyRotateSpeed / this.domElement.clientHeight );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( this.enablePan ) {\n\n\t\t\t\t\t\tthis._pan( this.keyPanSpeed, 0 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tneedsUpdate = true;\n\t\t\t\tbreak;\n\n\t\t\tcase this.keys.RIGHT:\n\n\t\t\t\tif ( event.ctrlKey || event.metaKey || event.shiftKey ) {\n\n\t\t\t\t\tif ( this.enableRotate ) {\n\n\t\t\t\t\t\tthis._rotateLeft( - _twoPI * this.keyRotateSpeed / this.domElement.clientHeight );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( this.enablePan ) {\n\n\t\t\t\t\t\tthis._pan( - this.keyPanSpeed, 0 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tneedsUpdate = true;\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\tif ( needsUpdate ) {\n\n\t\t\t// prevent the browser from scrolling on cursor keys\n\t\t\tevent.preventDefault();\n\n\t\t\tthis.update();\n\n\t\t}\n\n\n\t}\n\n\t_handleTouchStartRotate( event ) {\n\n\t\tif ( this._pointers.length === 1 ) {\n\n\t\t\tthis._rotateStart.set( event.pageX, event.pageY );\n\n\t\t} else {\n\n\t\t\tconst position = this._getSecondPointerPosition( event );\n\n\t\t\tconst x = 0.5 * ( event.pageX + position.x );\n\t\t\tconst y = 0.5 * ( event.pageY + position.y );\n\n\t\t\tthis._rotateStart.set( x, y );\n\n\t\t}\n\n\t}\n\n\t_handleTouchStartPan( event ) {\n\n\t\tif ( this._pointers.length === 1 ) {\n\n\t\t\tthis._panStart.set( event.pageX, event.pageY );\n\n\t\t} else {\n\n\t\t\tconst position = this._getSecondPointerPosition( event );\n\n\t\t\tconst x = 0.5 * ( event.pageX + position.x );\n\t\t\tconst y = 0.5 * ( event.pageY + position.y );\n\n\t\t\tthis._panStart.set( x, y );\n\n\t\t}\n\n\t}\n\n\t_handleTouchStartDolly( event ) {\n\n\t\tconst position = this._getSecondPointerPosition( event );\n\n\t\tconst dx = event.pageX - position.x;\n\t\tconst dy = event.pageY - position.y;\n\n\t\tconst distance = Math.sqrt( dx * dx + dy * dy );\n\n\t\tthis._dollyStart.set( 0, distance );\n\n\t}\n\n\t_handleTouchStartDollyPan( event ) {\n\n\t\tif ( this.enableZoom ) this._handleTouchStartDolly( event );\n\n\t\tif ( this.enablePan ) this._handleTouchStartPan( event );\n\n\t}\n\n\t_handleTouchStartDollyRotate( event ) {\n\n\t\tif ( this.enableZoom ) this._handleTouchStartDolly( event );\n\n\t\tif ( this.enableRotate ) this._handleTouchStartRotate( event );\n\n\t}\n\n\t_handleTouchMoveRotate( event ) {\n\n\t\tif ( this._pointers.length == 1 ) {\n\n\t\t\tthis._rotateEnd.set( event.pageX, event.pageY );\n\n\t\t} else {\n\n\t\t\tconst position = this._getSecondPointerPosition( event );\n\n\t\t\tconst x = 0.5 * ( event.pageX + position.x );\n\t\t\tconst y = 0.5 * ( event.pageY + position.y );\n\n\t\t\tthis._rotateEnd.set( x, y );\n\n\t\t}\n\n\t\tthis._rotateDelta.subVectors( this._rotateEnd, this._rotateStart ).multiplyScalar( this.rotateSpeed );\n\n\t\tconst element = this.domElement;\n\n\t\tthis._rotateLeft( _twoPI * this._rotateDelta.x / element.clientHeight ); // yes, height\n\n\t\tthis._rotateUp( _twoPI * this._rotateDelta.y / element.clientHeight );\n\n\t\tthis._rotateStart.copy( this._rotateEnd );\n\n\t}\n\n\t_handleTouchMovePan( event ) {\n\n\t\tif ( this._pointers.length === 1 ) {\n\n\t\t\tthis._panEnd.set( event.pageX, event.pageY );\n\n\t\t} else {\n\n\t\t\tconst position = this._getSecondPointerPosition( event );\n\n\t\t\tconst x = 0.5 * ( event.pageX + position.x );\n\t\t\tconst y = 0.5 * ( event.pageY + position.y );\n\n\t\t\tthis._panEnd.set( x, y );\n\n\t\t}\n\n\t\tthis._panDelta.subVectors( this._panEnd, this._panStart ).multiplyScalar( this.panSpeed );\n\n\t\tthis._pan( this._panDelta.x, this._panDelta.y );\n\n\t\tthis._panStart.copy( this._panEnd );\n\n\t}\n\n\t_handleTouchMoveDolly( event ) {\n\n\t\tconst position = this._getSecondPointerPosition( event );\n\n\t\tconst dx = event.pageX - position.x;\n\t\tconst dy = event.pageY - position.y;\n\n\t\tconst distance = Math.sqrt( dx * dx + dy * dy );\n\n\t\tthis._dollyEnd.set( 0, distance );\n\n\t\tthis._dollyDelta.set( 0, Math.pow( this._dollyEnd.y / this._dollyStart.y, this.zoomSpeed ) );\n\n\t\tthis._dollyOut( this._dollyDelta.y );\n\n\t\tthis._dollyStart.copy( this._dollyEnd );\n\n\t\tconst centerX = ( event.pageX + position.x ) * 0.5;\n\t\tconst centerY = ( event.pageY + position.y ) * 0.5;\n\n\t\tthis._updateZoomParameters( centerX, centerY );\n\n\t}\n\n\t_handleTouchMoveDollyPan( event ) {\n\n\t\tif ( this.enableZoom ) this._handleTouchMoveDolly( event );\n\n\t\tif ( this.enablePan ) this._handleTouchMovePan( event );\n\n\t}\n\n\t_handleTouchMoveDollyRotate( event ) {\n\n\t\tif ( this.enableZoom ) this._handleTouchMoveDolly( event );\n\n\t\tif ( this.enableRotate ) this._handleTouchMoveRotate( event );\n\n\t}\n\n\t// pointers\n\n\t_addPointer( event ) {\n\n\t\tthis._pointers.push( event.pointerId );\n\n\t}\n\n\t_removePointer( event ) {\n\n\t\tdelete this._pointerPositions[ event.pointerId ];\n\n\t\tfor ( let i = 0; i < this._pointers.length; i ++ ) {\n\n\t\t\tif ( this._pointers[ i ] == event.pointerId ) {\n\n\t\t\t\tthis._pointers.splice( i, 1 );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_isTrackingPointer( event ) {\n\n\t\tfor ( let i = 0; i < this._pointers.length; i ++ ) {\n\n\t\t\tif ( this._pointers[ i ] == event.pointerId ) return true;\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\t_trackPointer( event ) {\n\n\t\tlet position = this._pointerPositions[ event.pointerId ];\n\n\t\tif ( position === undefined ) {\n\n\t\t\tposition = new Vector2();\n\t\t\tthis._pointerPositions[ event.pointerId ] = position;\n\n\t\t}\n\n\t\tposition.set( event.pageX, event.pageY );\n\n\t}\n\n\t_getSecondPointerPosition( event ) {\n\n\t\tconst pointerId = ( event.pointerId === this._pointers[ 0 ] ) ? this._pointers[ 1 ] : this._pointers[ 0 ];\n\n\t\treturn this._pointerPositions[ pointerId ];\n\n\t}\n\n\t//\n\n\t_customWheelEvent( event ) {\n\n\t\tconst mode = event.deltaMode;\n\n\t\t// minimal wheel event altered to meet delta-zoom demand\n\t\tconst newEvent = {\n\t\t\tclientX: event.clientX,\n\t\t\tclientY: event.clientY,\n\t\t\tdeltaY: event.deltaY,\n\t\t};\n\n\t\tswitch ( mode ) {\n\n\t\t\tcase 1: // LINE_MODE\n\t\t\t\tnewEvent.deltaY *= 16;\n\t\t\t\tbreak;\n\n\t\t\tcase 2: // PAGE_MODE\n\t\t\t\tnewEvent.deltaY *= 100;\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\t// detect if event was triggered by pinching\n\t\tif ( event.ctrlKey && ! this._controlActive ) {\n\n\t\t\tnewEvent.deltaY *= 10;\n\n\t\t}\n\n\t\treturn newEvent;\n\n\t}\n\n}\n\nfunction onPointerDown( event ) {\n\n\tif ( this.enabled === false ) return;\n\n\tif ( this._pointers.length === 0 ) {\n\n\t\tthis.domElement.setPointerCapture( event.pointerId );\n\n\t\tthis.domElement.addEventListener( 'pointermove', this._onPointerMove );\n\t\tthis.domElement.addEventListener( 'pointerup', this._onPointerUp );\n\n\t}\n\n\t//\n\n\tif ( this._isTrackingPointer( event ) ) return;\n\n\t//\n\n\tthis._addPointer( event );\n\n\tif ( event.pointerType === 'touch' ) {\n\n\t\tthis._onTouchStart( event );\n\n\t} else {\n\n\t\tthis._onMouseDown( event );\n\n\t}\n\n}\n\nfunction onPointerMove( event ) {\n\n\tif ( this.enabled === false ) return;\n\n\tif ( event.pointerType === 'touch' ) {\n\n\t\tthis._onTouchMove( event );\n\n\t} else {\n\n\t\tthis._onMouseMove( event );\n\n\t}\n\n}\n\nfunction onPointerUp( event ) {\n\n\tthis._removePointer( event );\n\n\tswitch ( this._pointers.length ) {\n\n\t\tcase 0:\n\n\t\t\tthis.domElement.releasePointerCapture( event.pointerId );\n\n\t\t\tthis.domElement.removeEventListener( 'pointermove', this._onPointerMove );\n\t\t\tthis.domElement.removeEventListener( 'pointerup', this._onPointerUp );\n\n\t\t\tthis.dispatchEvent( _endEvent );\n\n\t\t\tthis.state = _STATE.NONE;\n\n\t\t\tbreak;\n\n\t\tcase 1:\n\n\t\t\tconst pointerId = this._pointers[ 0 ];\n\t\t\tconst position = this._pointerPositions[ pointerId ];\n\n\t\t\t// minimal placeholder event - allows state correction on pointer-up\n\t\t\tthis._onTouchStart( { pointerId: pointerId, pageX: position.x, pageY: position.y } );\n\n\t\t\tbreak;\n\n\t}\n\n}\n\nfunction onMouseDown( event ) {\n\n\tlet mouseAction;\n\n\tswitch ( event.button ) {\n\n\t\tcase 0:\n\n\t\t\tmouseAction = this.mouseButtons.LEFT;\n\t\t\tbreak;\n\n\t\tcase 1:\n\n\t\t\tmouseAction = this.mouseButtons.MIDDLE;\n\t\t\tbreak;\n\n\t\tcase 2:\n\n\t\t\tmouseAction = this.mouseButtons.RIGHT;\n\t\t\tbreak;\n\n\t\tdefault:\n\n\t\t\tmouseAction = - 1;\n\n\t}\n\n\tswitch ( mouseAction ) {\n\n\t\tcase MOUSE.DOLLY:\n\n\t\t\tif ( this.enableZoom === false ) return;\n\n\t\t\tthis._handleMouseDownDolly( event );\n\n\t\t\tthis.state = _STATE.DOLLY;\n\n\t\t\tbreak;\n\n\t\tcase MOUSE.ROTATE:\n\n\t\t\tif ( event.ctrlKey || event.metaKey || event.shiftKey ) {\n\n\t\t\t\tif ( this.enablePan === false ) return;\n\n\t\t\t\tthis._handleMouseDownPan( event );\n\n\t\t\t\tthis.state = _STATE.PAN;\n\n\t\t\t} else {\n\n\t\t\t\tif ( this.enableRotate === false ) return;\n\n\t\t\t\tthis._handleMouseDownRotate( event );\n\n\t\t\t\tthis.state = _STATE.ROTATE;\n\n\t\t\t}\n\n\t\t\tbreak;\n\n\t\tcase MOUSE.PAN:\n\n\t\t\tif ( event.ctrlKey || event.metaKey || event.shiftKey ) {\n\n\t\t\t\tif ( this.enableRotate === false ) return;\n\n\t\t\t\tthis._handleMouseDownRotate( event );\n\n\t\t\t\tthis.state = _STATE.ROTATE;\n\n\t\t\t} else {\n\n\t\t\t\tif ( this.enablePan === false ) return;\n\n\t\t\t\tthis._handleMouseDownPan( event );\n\n\t\t\t\tthis.state = _STATE.PAN;\n\n\t\t\t}\n\n\t\t\tbreak;\n\n\t\tdefault:\n\n\t\t\tthis.state = _STATE.NONE;\n\n\t}\n\n\tif ( this.state !== _STATE.NONE ) {\n\n\t\tthis.dispatchEvent( _startEvent );\n\n\t}\n\n}\n\nfunction onMouseMove( event ) {\n\n\tswitch ( this.state ) {\n\n\t\tcase _STATE.ROTATE:\n\n\t\t\tif ( this.enableRotate === false ) return;\n\n\t\t\tthis._handleMouseMoveRotate( event );\n\n\t\t\tbreak;\n\n\t\tcase _STATE.DOLLY:\n\n\t\t\tif ( this.enableZoom === false ) return;\n\n\t\t\tthis._handleMouseMoveDolly( event );\n\n\t\t\tbreak;\n\n\t\tcase _STATE.PAN:\n\n\t\t\tif ( this.enablePan === false ) return;\n\n\t\t\tthis._handleMouseMovePan( event );\n\n\t\t\tbreak;\n\n\t}\n\n}\n\nfunction onMouseWheel( event ) {\n\n\tif ( this.enabled === false || this.enableZoom === false || this.state !== _STATE.NONE ) return;\n\n\tevent.preventDefault();\n\n\tthis.dispatchEvent( _startEvent );\n\n\tthis._handleMouseWheel( this._customWheelEvent( event ) );\n\n\tthis.dispatchEvent( _endEvent );\n\n}\n\nfunction onKeyDown( event ) {\n\n\tif ( this.enabled === false ) return;\n\n\tthis._handleKeyDown( event );\n\n}\n\nfunction onTouchStart( event ) {\n\n\tthis._trackPointer( event );\n\n\tswitch ( this._pointers.length ) {\n\n\t\tcase 1:\n\n\t\t\tswitch ( this.touches.ONE ) {\n\n\t\t\t\tcase TOUCH.ROTATE:\n\n\t\t\t\t\tif ( this.enableRotate === false ) return;\n\n\t\t\t\t\tthis._handleTouchStartRotate( event );\n\n\t\t\t\t\tthis.state = _STATE.TOUCH_ROTATE;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase TOUCH.PAN:\n\n\t\t\t\t\tif ( this.enablePan === false ) return;\n\n\t\t\t\t\tthis._handleTouchStartPan( event );\n\n\t\t\t\t\tthis.state = _STATE.TOUCH_PAN;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tthis.state = _STATE.NONE;\n\n\t\t\t}\n\n\t\t\tbreak;\n\n\t\tcase 2:\n\n\t\t\tswitch ( this.touches.TWO ) {\n\n\t\t\t\tcase TOUCH.DOLLY_PAN:\n\n\t\t\t\t\tif ( this.enableZoom === false && this.enablePan === false ) return;\n\n\t\t\t\t\tthis._handleTouchStartDollyPan( event );\n\n\t\t\t\t\tthis.state = _STATE.TOUCH_DOLLY_PAN;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase TOUCH.DOLLY_ROTATE:\n\n\t\t\t\t\tif ( this.enableZoom === false && this.enableRotate === false ) return;\n\n\t\t\t\t\tthis._handleTouchStartDollyRotate( event );\n\n\t\t\t\t\tthis.state = _STATE.TOUCH_DOLLY_ROTATE;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tthis.state = _STATE.NONE;\n\n\t\t\t}\n\n\t\t\tbreak;\n\n\t\tdefault:\n\n\t\t\tthis.state = _STATE.NONE;\n\n\t}\n\n\tif ( this.state !== _STATE.NONE ) {\n\n\t\tthis.dispatchEvent( _startEvent );\n\n\t}\n\n}\n\nfunction onTouchMove( event ) {\n\n\tthis._trackPointer( event );\n\n\tswitch ( this.state ) {\n\n\t\tcase _STATE.TOUCH_ROTATE:\n\n\t\t\tif ( this.enableRotate === false ) return;\n\n\t\t\tthis._handleTouchMoveRotate( event );\n\n\t\t\tthis.update();\n\n\t\t\tbreak;\n\n\t\tcase _STATE.TOUCH_PAN:\n\n\t\t\tif ( this.enablePan === false ) return;\n\n\t\t\tthis._handleTouchMovePan( event );\n\n\t\t\tthis.update();\n\n\t\t\tbreak;\n\n\t\tcase _STATE.TOUCH_DOLLY_PAN:\n\n\t\t\tif ( this.enableZoom === false && this.enablePan === false ) return;\n\n\t\t\tthis._handleTouchMoveDollyPan( event );\n\n\t\t\tthis.update();\n\n\t\t\tbreak;\n\n\t\tcase _STATE.TOUCH_DOLLY_ROTATE:\n\n\t\t\tif ( this.enableZoom === false && this.enableRotate === false ) return;\n\n\t\t\tthis._handleTouchMoveDollyRotate( event );\n\n\t\t\tthis.update();\n\n\t\t\tbreak;\n\n\t\tdefault:\n\n\t\t\tthis.state = _STATE.NONE;\n\n\t}\n\n}\n\nfunction onContextMenu( event ) {\n\n\tif ( this.enabled === false ) return;\n\n\tevent.preventDefault();\n\n}\n\nfunction interceptControlDown( event ) {\n\n\tif ( event.key === 'Control' ) {\n\n\t\tthis._controlActive = true;\n\n\t\tconst document = this.domElement.getRootNode(); // offscreen canvas compatibility\n\n\t\tdocument.addEventListener( 'keyup', this._interceptControlUp, { passive: true, capture: true } );\n\n\t}\n\n}\n\nfunction interceptControlUp( event ) {\n\n\tif ( event.key === 'Control' ) {\n\n\t\tthis._controlActive = false;\n\n\t\tconst document = this.domElement.getRootNode(); // offscreen canvas compatibility\n\n\t\tdocument.removeEventListener( 'keyup', this._interceptControlUp, { passive: true, capture: true } );\n\n\t}\n\n}\n\nexport { OrbitControls };\n","'use strict';\n/* eslint-disable es/no-symbol -- required for testing */\nvar NATIVE_SYMBOL = require('../internals/symbol-constructor-detection');\n\nmodule.exports = NATIVE_SYMBOL &&\n  !Symbol.sham &&\n  typeof Symbol.iterator == 'symbol';\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar fails = require('../internals/fails');\nvar classof = require('../internals/classof-raw');\n\nvar $Object = Object;\nvar split = uncurryThis(''.split);\n\n// fallback for non-array-like ES3 and non-enumerable old V8 strings\nmodule.exports = fails(function () {\n  // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346\n  // eslint-disable-next-line no-prototype-builtins -- safe\n  return !$Object('z').propertyIsEnumerable(0);\n}) ? function (it) {\n  return classof(it) === 'String' ? split(it, '') : $Object(it);\n} : $Object;\n","'use strict';\nvar $ = require('../internals/export');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar aCallable = require('../internals/a-callable');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar iterate = require('../internals/iterate');\nvar MapHelpers = require('../internals/map-helpers');\nvar IS_PURE = require('../internals/is-pure');\nvar fails = require('../internals/fails');\n\nvar Map = MapHelpers.Map;\nvar has = MapHelpers.has;\nvar get = MapHelpers.get;\nvar set = MapHelpers.set;\nvar push = uncurryThis([].push);\n\n// https://bugs.webkit.org/show_bug.cgi?id=271524\nvar DOES_NOT_WORK_WITH_PRIMITIVES = IS_PURE || fails(function () {\n  return Map.groupBy('ab', function (it) {\n    return it;\n  }).get('a').length !== 1;\n});\n\n// `Map.groupBy` method\n// https://tc39.es/ecma262/#sec-map.groupby\n$({ target: 'Map', stat: true, forced: IS_PURE || DOES_NOT_WORK_WITH_PRIMITIVES }, {\n  groupBy: function groupBy(items, callbackfn) {\n    requireObjectCoercible(items);\n    aCallable(callbackfn);\n    var map = new Map();\n    var k = 0;\n    iterate(items, function (value) {\n      var key = callbackfn(value, k++);\n      if (!has(map, key)) set(map, key, [value]);\n      else push(get(map, key), value);\n    });\n    return map;\n  }\n});\n","'use strict';\nvar has = require('../internals/set-helpers').has;\n\n// Perform ? RequireInternalSlot(M, [[SetData]])\nmodule.exports = function (it) {\n  has(it);\n  return it;\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nfunction _export(target, all) {\n    for(var name in all)Object.defineProperty(target, name, {\n        enumerable: true,\n        get: all[name]\n    });\n}\n_export(exports, {\n    withAlphaValue: function() {\n        return withAlphaValue;\n    },\n    default: function() {\n        return withAlphaVariable;\n    }\n});\nconst _color = require(\"./color\");\nfunction withAlphaValue(color, alphaValue, defaultValue) {\n    if (typeof color === \"function\") {\n        return color({\n            opacityValue: alphaValue\n        });\n    }\n    let parsed = (0, _color.parseColor)(color, {\n        loose: true\n    });\n    if (parsed === null) {\n        return defaultValue;\n    }\n    return (0, _color.formatColor)({\n        ...parsed,\n        alpha: alphaValue\n    });\n}\nfunction withAlphaVariable({ color , property , variable  }) {\n    let properties = [].concat(property);\n    if (typeof color === \"function\") {\n        return {\n            [variable]: \"1\",\n            ...Object.fromEntries(properties.map((p)=>{\n                return [\n                    p,\n                    color({\n                        opacityVariable: variable,\n                        opacityValue: `var(${variable}, 1)`\n                    })\n                ];\n            }))\n        };\n    }\n    const parsed = (0, _color.parseColor)(color);\n    if (parsed === null) {\n        return Object.fromEntries(properties.map((p)=>[\n                p,\n                color\n            ]));\n    }\n    if (parsed.alpha !== undefined) {\n        // Has an alpha value, return color as-is\n        return Object.fromEntries(properties.map((p)=>[\n                p,\n                color\n            ]));\n    }\n    return {\n        [variable]: \"1\",\n        ...Object.fromEntries(properties.map((p)=>{\n            return [\n                p,\n                (0, _color.formatColor)({\n                    ...parsed,\n                    alpha: `var(${variable}, 1)`\n                })\n            ];\n        }))\n    };\n}\n","/*! Hammer.JS - v2.0.7 - 2016-04-22\n * http://hammerjs.github.io/\n *\n * Copyright (c) 2016 Jorik Tangelder;\n * Licensed under the MIT license */\n(function(window, document, exportName, undefined) {\n  'use strict';\n\nvar VENDOR_PREFIXES = ['', 'webkit', 'Moz', 'MS', 'ms', 'o'];\nvar TEST_ELEMENT = document.createElement('div');\n\nvar TYPE_FUNCTION = 'function';\n\nvar round = Math.round;\nvar abs = Math.abs;\nvar now = Date.now;\n\n/**\n * set a timeout with a given scope\n * @param {Function} fn\n * @param {Number} timeout\n * @param {Object} context\n * @returns {number}\n */\nfunction setTimeoutContext(fn, timeout, context) {\n    return setTimeout(bindFn(fn, context), timeout);\n}\n\n/**\n * if the argument is an array, we want to execute the fn on each entry\n * if it aint an array we don't want to do a thing.\n * this is used by all the methods that accept a single and array argument.\n * @param {*|Array} arg\n * @param {String} fn\n * @param {Object} [context]\n * @returns {Boolean}\n */\nfunction invokeArrayArg(arg, fn, context) {\n    if (Array.isArray(arg)) {\n        each(arg, context[fn], context);\n        return true;\n    }\n    return false;\n}\n\n/**\n * walk objects and arrays\n * @param {Object} obj\n * @param {Function} iterator\n * @param {Object} context\n */\nfunction each(obj, iterator, context) {\n    var i;\n\n    if (!obj) {\n        return;\n    }\n\n    if (obj.forEach) {\n        obj.forEach(iterator, context);\n    } else if (obj.length !== undefined) {\n        i = 0;\n        while (i < obj.length) {\n            iterator.call(context, obj[i], i, obj);\n            i++;\n        }\n    } else {\n        for (i in obj) {\n            obj.hasOwnProperty(i) && iterator.call(context, obj[i], i, obj);\n        }\n    }\n}\n\n/**\n * wrap a method with a deprecation warning and stack trace\n * @param {Function} method\n * @param {String} name\n * @param {String} message\n * @returns {Function} A new function wrapping the supplied method.\n */\nfunction deprecate(method, name, message) {\n    var deprecationMessage = 'DEPRECATED METHOD: ' + name + '\\n' + message + ' AT \\n';\n    return function() {\n        var e = new Error('get-stack-trace');\n        var stack = e && e.stack ? e.stack.replace(/^[^\\(]+?[\\n$]/gm, '')\n            .replace(/^\\s+at\\s+/gm, '')\n            .replace(/^Object.<anonymous>\\s*\\(/gm, '{anonymous}()@') : 'Unknown Stack Trace';\n\n        var log = window.console && (window.console.warn || window.console.log);\n        if (log) {\n            log.call(window.console, deprecationMessage, stack);\n        }\n        return method.apply(this, arguments);\n    };\n}\n\n/**\n * extend object.\n * means that properties in dest will be overwritten by the ones in src.\n * @param {Object} target\n * @param {...Object} objects_to_assign\n * @returns {Object} target\n */\nvar assign;\nif (typeof Object.assign !== 'function') {\n    assign = function assign(target) {\n        if (target === undefined || target === null) {\n            throw new TypeError('Cannot convert undefined or null to object');\n        }\n\n        var output = Object(target);\n        for (var index = 1; index < arguments.length; index++) {\n            var source = arguments[index];\n            if (source !== undefined && source !== null) {\n                for (var nextKey in source) {\n                    if (source.hasOwnProperty(nextKey)) {\n                        output[nextKey] = source[nextKey];\n                    }\n                }\n            }\n        }\n        return output;\n    };\n} else {\n    assign = Object.assign;\n}\n\n/**\n * extend object.\n * means that properties in dest will be overwritten by the ones in src.\n * @param {Object} dest\n * @param {Object} src\n * @param {Boolean} [merge=false]\n * @returns {Object} dest\n */\nvar extend = deprecate(function extend(dest, src, merge) {\n    var keys = Object.keys(src);\n    var i = 0;\n    while (i < keys.length) {\n        if (!merge || (merge && dest[keys[i]] === undefined)) {\n            dest[keys[i]] = src[keys[i]];\n        }\n        i++;\n    }\n    return dest;\n}, 'extend', 'Use `assign`.');\n\n/**\n * merge the values from src in the dest.\n * means that properties that exist in dest will not be overwritten by src\n * @param {Object} dest\n * @param {Object} src\n * @returns {Object} dest\n */\nvar merge = deprecate(function merge(dest, src) {\n    return extend(dest, src, true);\n}, 'merge', 'Use `assign`.');\n\n/**\n * simple class inheritance\n * @param {Function} child\n * @param {Function} base\n * @param {Object} [properties]\n */\nfunction inherit(child, base, properties) {\n    var baseP = base.prototype,\n        childP;\n\n    childP = child.prototype = Object.create(baseP);\n    childP.constructor = child;\n    childP._super = baseP;\n\n    if (properties) {\n        assign(childP, properties);\n    }\n}\n\n/**\n * simple function bind\n * @param {Function} fn\n * @param {Object} context\n * @returns {Function}\n */\nfunction bindFn(fn, context) {\n    return function boundFn() {\n        return fn.apply(context, arguments);\n    };\n}\n\n/**\n * let a boolean value also be a function that must return a boolean\n * this first item in args will be used as the context\n * @param {Boolean|Function} val\n * @param {Array} [args]\n * @returns {Boolean}\n */\nfunction boolOrFn(val, args) {\n    if (typeof val == TYPE_FUNCTION) {\n        return val.apply(args ? args[0] || undefined : undefined, args);\n    }\n    return val;\n}\n\n/**\n * use the val2 when val1 is undefined\n * @param {*} val1\n * @param {*} val2\n * @returns {*}\n */\nfunction ifUndefined(val1, val2) {\n    return (val1 === undefined) ? val2 : val1;\n}\n\n/**\n * addEventListener with multiple events at once\n * @param {EventTarget} target\n * @param {String} types\n * @param {Function} handler\n */\nfunction addEventListeners(target, types, handler) {\n    each(splitStr(types), function(type) {\n        target.addEventListener(type, handler, false);\n    });\n}\n\n/**\n * removeEventListener with multiple events at once\n * @param {EventTarget} target\n * @param {String} types\n * @param {Function} handler\n */\nfunction removeEventListeners(target, types, handler) {\n    each(splitStr(types), function(type) {\n        target.removeEventListener(type, handler, false);\n    });\n}\n\n/**\n * find if a node is in the given parent\n * @method hasParent\n * @param {HTMLElement} node\n * @param {HTMLElement} parent\n * @return {Boolean} found\n */\nfunction hasParent(node, parent) {\n    while (node) {\n        if (node == parent) {\n            return true;\n        }\n        node = node.parentNode;\n    }\n    return false;\n}\n\n/**\n * small indexOf wrapper\n * @param {String} str\n * @param {String} find\n * @returns {Boolean} found\n */\nfunction inStr(str, find) {\n    return str.indexOf(find) > -1;\n}\n\n/**\n * split string on whitespace\n * @param {String} str\n * @returns {Array} words\n */\nfunction splitStr(str) {\n    return str.trim().split(/\\s+/g);\n}\n\n/**\n * find if a array contains the object using indexOf or a simple polyFill\n * @param {Array} src\n * @param {String} find\n * @param {String} [findByKey]\n * @return {Boolean|Number} false when not found, or the index\n */\nfunction inArray(src, find, findByKey) {\n    if (src.indexOf && !findByKey) {\n        return src.indexOf(find);\n    } else {\n        var i = 0;\n        while (i < src.length) {\n            if ((findByKey && src[i][findByKey] == find) || (!findByKey && src[i] === find)) {\n                return i;\n            }\n            i++;\n        }\n        return -1;\n    }\n}\n\n/**\n * convert array-like objects to real arrays\n * @param {Object} obj\n * @returns {Array}\n */\nfunction toArray(obj) {\n    return Array.prototype.slice.call(obj, 0);\n}\n\n/**\n * unique array with objects based on a key (like 'id') or just by the array's value\n * @param {Array} src [{id:1},{id:2},{id:1}]\n * @param {String} [key]\n * @param {Boolean} [sort=False]\n * @returns {Array} [{id:1},{id:2}]\n */\nfunction uniqueArray(src, key, sort) {\n    var results = [];\n    var values = [];\n    var i = 0;\n\n    while (i < src.length) {\n        var val = key ? src[i][key] : src[i];\n        if (inArray(values, val) < 0) {\n            results.push(src[i]);\n        }\n        values[i] = val;\n        i++;\n    }\n\n    if (sort) {\n        if (!key) {\n            results = results.sort();\n        } else {\n            results = results.sort(function sortUniqueArray(a, b) {\n                return a[key] > b[key];\n            });\n        }\n    }\n\n    return results;\n}\n\n/**\n * get the prefixed property\n * @param {Object} obj\n * @param {String} property\n * @returns {String|Undefined} prefixed\n */\nfunction prefixed(obj, property) {\n    var prefix, prop;\n    var camelProp = property[0].toUpperCase() + property.slice(1);\n\n    var i = 0;\n    while (i < VENDOR_PREFIXES.length) {\n        prefix = VENDOR_PREFIXES[i];\n        prop = (prefix) ? prefix + camelProp : property;\n\n        if (prop in obj) {\n            return prop;\n        }\n        i++;\n    }\n    return undefined;\n}\n\n/**\n * get a unique id\n * @returns {number} uniqueId\n */\nvar _uniqueId = 1;\nfunction uniqueId() {\n    return _uniqueId++;\n}\n\n/**\n * get the window object of an element\n * @param {HTMLElement} element\n * @returns {DocumentView|Window}\n */\nfunction getWindowForElement(element) {\n    var doc = element.ownerDocument || element;\n    return (doc.defaultView || doc.parentWindow || window);\n}\n\nvar MOBILE_REGEX = /mobile|tablet|ip(ad|hone|od)|android/i;\n\nvar SUPPORT_TOUCH = ('ontouchstart' in window);\nvar SUPPORT_POINTER_EVENTS = prefixed(window, 'PointerEvent') !== undefined;\nvar SUPPORT_ONLY_TOUCH = SUPPORT_TOUCH && MOBILE_REGEX.test(navigator.userAgent);\n\nvar INPUT_TYPE_TOUCH = 'touch';\nvar INPUT_TYPE_PEN = 'pen';\nvar INPUT_TYPE_MOUSE = 'mouse';\nvar INPUT_TYPE_KINECT = 'kinect';\n\nvar COMPUTE_INTERVAL = 25;\n\nvar INPUT_START = 1;\nvar INPUT_MOVE = 2;\nvar INPUT_END = 4;\nvar INPUT_CANCEL = 8;\n\nvar DIRECTION_NONE = 1;\nvar DIRECTION_LEFT = 2;\nvar DIRECTION_RIGHT = 4;\nvar DIRECTION_UP = 8;\nvar DIRECTION_DOWN = 16;\n\nvar DIRECTION_HORIZONTAL = DIRECTION_LEFT | DIRECTION_RIGHT;\nvar DIRECTION_VERTICAL = DIRECTION_UP | DIRECTION_DOWN;\nvar DIRECTION_ALL = DIRECTION_HORIZONTAL | DIRECTION_VERTICAL;\n\nvar PROPS_XY = ['x', 'y'];\nvar PROPS_CLIENT_XY = ['clientX', 'clientY'];\n\n/**\n * create new input type manager\n * @param {Manager} manager\n * @param {Function} callback\n * @returns {Input}\n * @constructor\n */\nfunction Input(manager, callback) {\n    var self = this;\n    this.manager = manager;\n    this.callback = callback;\n    this.element = manager.element;\n    this.target = manager.options.inputTarget;\n\n    // smaller wrapper around the handler, for the scope and the enabled state of the manager,\n    // so when disabled the input events are completely bypassed.\n    this.domHandler = function(ev) {\n        if (boolOrFn(manager.options.enable, [manager])) {\n            self.handler(ev);\n        }\n    };\n\n    this.init();\n\n}\n\nInput.prototype = {\n    /**\n     * should handle the inputEvent data and trigger the callback\n     * @virtual\n     */\n    handler: function() { },\n\n    /**\n     * bind the events\n     */\n    init: function() {\n        this.evEl && addEventListeners(this.element, this.evEl, this.domHandler);\n        this.evTarget && addEventListeners(this.target, this.evTarget, this.domHandler);\n        this.evWin && addEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler);\n    },\n\n    /**\n     * unbind the events\n     */\n    destroy: function() {\n        this.evEl && removeEventListeners(this.element, this.evEl, this.domHandler);\n        this.evTarget && removeEventListeners(this.target, this.evTarget, this.domHandler);\n        this.evWin && removeEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler);\n    }\n};\n\n/**\n * create new input type manager\n * called by the Manager constructor\n * @param {Hammer} manager\n * @returns {Input}\n */\nfunction createInputInstance(manager) {\n    var Type;\n    var inputClass = manager.options.inputClass;\n\n    if (inputClass) {\n        Type = inputClass;\n    } else if (SUPPORT_POINTER_EVENTS) {\n        Type = PointerEventInput;\n    } else if (SUPPORT_ONLY_TOUCH) {\n        Type = TouchInput;\n    } else if (!SUPPORT_TOUCH) {\n        Type = MouseInput;\n    } else {\n        Type = TouchMouseInput;\n    }\n    return new (Type)(manager, inputHandler);\n}\n\n/**\n * handle input events\n * @param {Manager} manager\n * @param {String} eventType\n * @param {Object} input\n */\nfunction inputHandler(manager, eventType, input) {\n    var pointersLen = input.pointers.length;\n    var changedPointersLen = input.changedPointers.length;\n    var isFirst = (eventType & INPUT_START && (pointersLen - changedPointersLen === 0));\n    var isFinal = (eventType & (INPUT_END | INPUT_CANCEL) && (pointersLen - changedPointersLen === 0));\n\n    input.isFirst = !!isFirst;\n    input.isFinal = !!isFinal;\n\n    if (isFirst) {\n        manager.session = {};\n    }\n\n    // source event is the normalized value of the domEvents\n    // like 'touchstart, mouseup, pointerdown'\n    input.eventType = eventType;\n\n    // compute scale, rotation etc\n    computeInputData(manager, input);\n\n    // emit secret event\n    manager.emit('hammer.input', input);\n\n    manager.recognize(input);\n    manager.session.prevInput = input;\n}\n\n/**\n * extend the data with some usable properties like scale, rotate, velocity etc\n * @param {Object} manager\n * @param {Object} input\n */\nfunction computeInputData(manager, input) {\n    var session = manager.session;\n    var pointers = input.pointers;\n    var pointersLength = pointers.length;\n\n    // store the first input to calculate the distance and direction\n    if (!session.firstInput) {\n        session.firstInput = simpleCloneInputData(input);\n    }\n\n    // to compute scale and rotation we need to store the multiple touches\n    if (pointersLength > 1 && !session.firstMultiple) {\n        session.firstMultiple = simpleCloneInputData(input);\n    } else if (pointersLength === 1) {\n        session.firstMultiple = false;\n    }\n\n    var firstInput = session.firstInput;\n    var firstMultiple = session.firstMultiple;\n    var offsetCenter = firstMultiple ? firstMultiple.center : firstInput.center;\n\n    var center = input.center = getCenter(pointers);\n    input.timeStamp = now();\n    input.deltaTime = input.timeStamp - firstInput.timeStamp;\n\n    input.angle = getAngle(offsetCenter, center);\n    input.distance = getDistance(offsetCenter, center);\n\n    computeDeltaXY(session, input);\n    input.offsetDirection = getDirection(input.deltaX, input.deltaY);\n\n    var overallVelocity = getVelocity(input.deltaTime, input.deltaX, input.deltaY);\n    input.overallVelocityX = overallVelocity.x;\n    input.overallVelocityY = overallVelocity.y;\n    input.overallVelocity = (abs(overallVelocity.x) > abs(overallVelocity.y)) ? overallVelocity.x : overallVelocity.y;\n\n    input.scale = firstMultiple ? getScale(firstMultiple.pointers, pointers) : 1;\n    input.rotation = firstMultiple ? getRotation(firstMultiple.pointers, pointers) : 0;\n\n    input.maxPointers = !session.prevInput ? input.pointers.length : ((input.pointers.length >\n        session.prevInput.maxPointers) ? input.pointers.length : session.prevInput.maxPointers);\n\n    computeIntervalInputData(session, input);\n\n    // find the correct target\n    var target = manager.element;\n    if (hasParent(input.srcEvent.target, target)) {\n        target = input.srcEvent.target;\n    }\n    input.target = target;\n}\n\nfunction computeDeltaXY(session, input) {\n    var center = input.center;\n    var offset = session.offsetDelta || {};\n    var prevDelta = session.prevDelta || {};\n    var prevInput = session.prevInput || {};\n\n    if (input.eventType === INPUT_START || prevInput.eventType === INPUT_END) {\n        prevDelta = session.prevDelta = {\n            x: prevInput.deltaX || 0,\n            y: prevInput.deltaY || 0\n        };\n\n        offset = session.offsetDelta = {\n            x: center.x,\n            y: center.y\n        };\n    }\n\n    input.deltaX = prevDelta.x + (center.x - offset.x);\n    input.deltaY = prevDelta.y + (center.y - offset.y);\n}\n\n/**\n * velocity is calculated every x ms\n * @param {Object} session\n * @param {Object} input\n */\nfunction computeIntervalInputData(session, input) {\n    var last = session.lastInterval || input,\n        deltaTime = input.timeStamp - last.timeStamp,\n        velocity, velocityX, velocityY, direction;\n\n    if (input.eventType != INPUT_CANCEL && (deltaTime > COMPUTE_INTERVAL || last.velocity === undefined)) {\n        var deltaX = input.deltaX - last.deltaX;\n        var deltaY = input.deltaY - last.deltaY;\n\n        var v = getVelocity(deltaTime, deltaX, deltaY);\n        velocityX = v.x;\n        velocityY = v.y;\n        velocity = (abs(v.x) > abs(v.y)) ? v.x : v.y;\n        direction = getDirection(deltaX, deltaY);\n\n        session.lastInterval = input;\n    } else {\n        // use latest velocity info if it doesn't overtake a minimum period\n        velocity = last.velocity;\n        velocityX = last.velocityX;\n        velocityY = last.velocityY;\n        direction = last.direction;\n    }\n\n    input.velocity = velocity;\n    input.velocityX = velocityX;\n    input.velocityY = velocityY;\n    input.direction = direction;\n}\n\n/**\n * create a simple clone from the input used for storage of firstInput and firstMultiple\n * @param {Object} input\n * @returns {Object} clonedInputData\n */\nfunction simpleCloneInputData(input) {\n    // make a simple copy of the pointers because we will get a reference if we don't\n    // we only need clientXY for the calculations\n    var pointers = [];\n    var i = 0;\n    while (i < input.pointers.length) {\n        pointers[i] = {\n            clientX: round(input.pointers[i].clientX),\n            clientY: round(input.pointers[i].clientY)\n        };\n        i++;\n    }\n\n    return {\n        timeStamp: now(),\n        pointers: pointers,\n        center: getCenter(pointers),\n        deltaX: input.deltaX,\n        deltaY: input.deltaY\n    };\n}\n\n/**\n * get the center of all the pointers\n * @param {Array} pointers\n * @return {Object} center contains `x` and `y` properties\n */\nfunction getCenter(pointers) {\n    var pointersLength = pointers.length;\n\n    // no need to loop when only one touch\n    if (pointersLength === 1) {\n        return {\n            x: round(pointers[0].clientX),\n            y: round(pointers[0].clientY)\n        };\n    }\n\n    var x = 0, y = 0, i = 0;\n    while (i < pointersLength) {\n        x += pointers[i].clientX;\n        y += pointers[i].clientY;\n        i++;\n    }\n\n    return {\n        x: round(x / pointersLength),\n        y: round(y / pointersLength)\n    };\n}\n\n/**\n * calculate the velocity between two points. unit is in px per ms.\n * @param {Number} deltaTime\n * @param {Number} x\n * @param {Number} y\n * @return {Object} velocity `x` and `y`\n */\nfunction getVelocity(deltaTime, x, y) {\n    return {\n        x: x / deltaTime || 0,\n        y: y / deltaTime || 0\n    };\n}\n\n/**\n * get the direction between two points\n * @param {Number} x\n * @param {Number} y\n * @return {Number} direction\n */\nfunction getDirection(x, y) {\n    if (x === y) {\n        return DIRECTION_NONE;\n    }\n\n    if (abs(x) >= abs(y)) {\n        return x < 0 ? DIRECTION_LEFT : DIRECTION_RIGHT;\n    }\n    return y < 0 ? DIRECTION_UP : DIRECTION_DOWN;\n}\n\n/**\n * calculate the absolute distance between two points\n * @param {Object} p1 {x, y}\n * @param {Object} p2 {x, y}\n * @param {Array} [props] containing x and y keys\n * @return {Number} distance\n */\nfunction getDistance(p1, p2, props) {\n    if (!props) {\n        props = PROPS_XY;\n    }\n    var x = p2[props[0]] - p1[props[0]],\n        y = p2[props[1]] - p1[props[1]];\n\n    return Math.sqrt((x * x) + (y * y));\n}\n\n/**\n * calculate the angle between two coordinates\n * @param {Object} p1\n * @param {Object} p2\n * @param {Array} [props] containing x and y keys\n * @return {Number} angle\n */\nfunction getAngle(p1, p2, props) {\n    if (!props) {\n        props = PROPS_XY;\n    }\n    var x = p2[props[0]] - p1[props[0]],\n        y = p2[props[1]] - p1[props[1]];\n    return Math.atan2(y, x) * 180 / Math.PI;\n}\n\n/**\n * calculate the rotation degrees between two pointersets\n * @param {Array} start array of pointers\n * @param {Array} end array of pointers\n * @return {Number} rotation\n */\nfunction getRotation(start, end) {\n    return getAngle(end[1], end[0], PROPS_CLIENT_XY) + getAngle(start[1], start[0], PROPS_CLIENT_XY);\n}\n\n/**\n * calculate the scale factor between two pointersets\n * no scale is 1, and goes down to 0 when pinched together, and bigger when pinched out\n * @param {Array} start array of pointers\n * @param {Array} end array of pointers\n * @return {Number} scale\n */\nfunction getScale(start, end) {\n    return getDistance(end[0], end[1], PROPS_CLIENT_XY) / getDistance(start[0], start[1], PROPS_CLIENT_XY);\n}\n\nvar MOUSE_INPUT_MAP = {\n    mousedown: INPUT_START,\n    mousemove: INPUT_MOVE,\n    mouseup: INPUT_END\n};\n\nvar MOUSE_ELEMENT_EVENTS = 'mousedown';\nvar MOUSE_WINDOW_EVENTS = 'mousemove mouseup';\n\n/**\n * Mouse events input\n * @constructor\n * @extends Input\n */\nfunction MouseInput() {\n    this.evEl = MOUSE_ELEMENT_EVENTS;\n    this.evWin = MOUSE_WINDOW_EVENTS;\n\n    this.pressed = false; // mousedown state\n\n    Input.apply(this, arguments);\n}\n\ninherit(MouseInput, Input, {\n    /**\n     * handle mouse events\n     * @param {Object} ev\n     */\n    handler: function MEhandler(ev) {\n        var eventType = MOUSE_INPUT_MAP[ev.type];\n\n        // on start we want to have the left mouse button down\n        if (eventType & INPUT_START && ev.button === 0) {\n            this.pressed = true;\n        }\n\n        if (eventType & INPUT_MOVE && ev.which !== 1) {\n            eventType = INPUT_END;\n        }\n\n        // mouse must be down\n        if (!this.pressed) {\n            return;\n        }\n\n        if (eventType & INPUT_END) {\n            this.pressed = false;\n        }\n\n        this.callback(this.manager, eventType, {\n            pointers: [ev],\n            changedPointers: [ev],\n            pointerType: INPUT_TYPE_MOUSE,\n            srcEvent: ev\n        });\n    }\n});\n\nvar POINTER_INPUT_MAP = {\n    pointerdown: INPUT_START,\n    pointermove: INPUT_MOVE,\n    pointerup: INPUT_END,\n    pointercancel: INPUT_CANCEL,\n    pointerout: INPUT_CANCEL\n};\n\n// in IE10 the pointer types is defined as an enum\nvar IE10_POINTER_TYPE_ENUM = {\n    2: INPUT_TYPE_TOUCH,\n    3: INPUT_TYPE_PEN,\n    4: INPUT_TYPE_MOUSE,\n    5: INPUT_TYPE_KINECT // see https://twitter.com/jacobrossi/status/480596438489890816\n};\n\nvar POINTER_ELEMENT_EVENTS = 'pointerdown';\nvar POINTER_WINDOW_EVENTS = 'pointermove pointerup pointercancel';\n\n// IE10 has prefixed support, and case-sensitive\nif (window.MSPointerEvent && !window.PointerEvent) {\n    POINTER_ELEMENT_EVENTS = 'MSPointerDown';\n    POINTER_WINDOW_EVENTS = 'MSPointerMove MSPointerUp MSPointerCancel';\n}\n\n/**\n * Pointer events input\n * @constructor\n * @extends Input\n */\nfunction PointerEventInput() {\n    this.evEl = POINTER_ELEMENT_EVENTS;\n    this.evWin = POINTER_WINDOW_EVENTS;\n\n    Input.apply(this, arguments);\n\n    this.store = (this.manager.session.pointerEvents = []);\n}\n\ninherit(PointerEventInput, Input, {\n    /**\n     * handle mouse events\n     * @param {Object} ev\n     */\n    handler: function PEhandler(ev) {\n        var store = this.store;\n        var removePointer = false;\n\n        var eventTypeNormalized = ev.type.toLowerCase().replace('ms', '');\n        var eventType = POINTER_INPUT_MAP[eventTypeNormalized];\n        var pointerType = IE10_POINTER_TYPE_ENUM[ev.pointerType] || ev.pointerType;\n\n        var isTouch = (pointerType == INPUT_TYPE_TOUCH);\n\n        // get index of the event in the store\n        var storeIndex = inArray(store, ev.pointerId, 'pointerId');\n\n        // start and mouse must be down\n        if (eventType & INPUT_START && (ev.button === 0 || isTouch)) {\n            if (storeIndex < 0) {\n                store.push(ev);\n                storeIndex = store.length - 1;\n            }\n        } else if (eventType & (INPUT_END | INPUT_CANCEL)) {\n            removePointer = true;\n        }\n\n        // it not found, so the pointer hasn't been down (so it's probably a hover)\n        if (storeIndex < 0) {\n            return;\n        }\n\n        // update the event in the store\n        store[storeIndex] = ev;\n\n        this.callback(this.manager, eventType, {\n            pointers: store,\n            changedPointers: [ev],\n            pointerType: pointerType,\n            srcEvent: ev\n        });\n\n        if (removePointer) {\n            // remove from the store\n            store.splice(storeIndex, 1);\n        }\n    }\n});\n\nvar SINGLE_TOUCH_INPUT_MAP = {\n    touchstart: INPUT_START,\n    touchmove: INPUT_MOVE,\n    touchend: INPUT_END,\n    touchcancel: INPUT_CANCEL\n};\n\nvar SINGLE_TOUCH_TARGET_EVENTS = 'touchstart';\nvar SINGLE_TOUCH_WINDOW_EVENTS = 'touchstart touchmove touchend touchcancel';\n\n/**\n * Touch events input\n * @constructor\n * @extends Input\n */\nfunction SingleTouchInput() {\n    this.evTarget = SINGLE_TOUCH_TARGET_EVENTS;\n    this.evWin = SINGLE_TOUCH_WINDOW_EVENTS;\n    this.started = false;\n\n    Input.apply(this, arguments);\n}\n\ninherit(SingleTouchInput, Input, {\n    handler: function TEhandler(ev) {\n        var type = SINGLE_TOUCH_INPUT_MAP[ev.type];\n\n        // should we handle the touch events?\n        if (type === INPUT_START) {\n            this.started = true;\n        }\n\n        if (!this.started) {\n            return;\n        }\n\n        var touches = normalizeSingleTouches.call(this, ev, type);\n\n        // when done, reset the started state\n        if (type & (INPUT_END | INPUT_CANCEL) && touches[0].length - touches[1].length === 0) {\n            this.started = false;\n        }\n\n        this.callback(this.manager, type, {\n            pointers: touches[0],\n            changedPointers: touches[1],\n            pointerType: INPUT_TYPE_TOUCH,\n            srcEvent: ev\n        });\n    }\n});\n\n/**\n * @this {TouchInput}\n * @param {Object} ev\n * @param {Number} type flag\n * @returns {undefined|Array} [all, changed]\n */\nfunction normalizeSingleTouches(ev, type) {\n    var all = toArray(ev.touches);\n    var changed = toArray(ev.changedTouches);\n\n    if (type & (INPUT_END | INPUT_CANCEL)) {\n        all = uniqueArray(all.concat(changed), 'identifier', true);\n    }\n\n    return [all, changed];\n}\n\nvar TOUCH_INPUT_MAP = {\n    touchstart: INPUT_START,\n    touchmove: INPUT_MOVE,\n    touchend: INPUT_END,\n    touchcancel: INPUT_CANCEL\n};\n\nvar TOUCH_TARGET_EVENTS = 'touchstart touchmove touchend touchcancel';\n\n/**\n * Multi-user touch events input\n * @constructor\n * @extends Input\n */\nfunction TouchInput() {\n    this.evTarget = TOUCH_TARGET_EVENTS;\n    this.targetIds = {};\n\n    Input.apply(this, arguments);\n}\n\ninherit(TouchInput, Input, {\n    handler: function MTEhandler(ev) {\n        var type = TOUCH_INPUT_MAP[ev.type];\n        var touches = getTouches.call(this, ev, type);\n        if (!touches) {\n            return;\n        }\n\n        this.callback(this.manager, type, {\n            pointers: touches[0],\n            changedPointers: touches[1],\n            pointerType: INPUT_TYPE_TOUCH,\n            srcEvent: ev\n        });\n    }\n});\n\n/**\n * @this {TouchInput}\n * @param {Object} ev\n * @param {Number} type flag\n * @returns {undefined|Array} [all, changed]\n */\nfunction getTouches(ev, type) {\n    var allTouches = toArray(ev.touches);\n    var targetIds = this.targetIds;\n\n    // when there is only one touch, the process can be simplified\n    if (type & (INPUT_START | INPUT_MOVE) && allTouches.length === 1) {\n        targetIds[allTouches[0].identifier] = true;\n        return [allTouches, allTouches];\n    }\n\n    var i,\n        targetTouches,\n        changedTouches = toArray(ev.changedTouches),\n        changedTargetTouches = [],\n        target = this.target;\n\n    // get target touches from touches\n    targetTouches = allTouches.filter(function(touch) {\n        return hasParent(touch.target, target);\n    });\n\n    // collect touches\n    if (type === INPUT_START) {\n        i = 0;\n        while (i < targetTouches.length) {\n            targetIds[targetTouches[i].identifier] = true;\n            i++;\n        }\n    }\n\n    // filter changed touches to only contain touches that exist in the collected target ids\n    i = 0;\n    while (i < changedTouches.length) {\n        if (targetIds[changedTouches[i].identifier]) {\n            changedTargetTouches.push(changedTouches[i]);\n        }\n\n        // cleanup removed touches\n        if (type & (INPUT_END | INPUT_CANCEL)) {\n            delete targetIds[changedTouches[i].identifier];\n        }\n        i++;\n    }\n\n    if (!changedTargetTouches.length) {\n        return;\n    }\n\n    return [\n        // merge targetTouches with changedTargetTouches so it contains ALL touches, including 'end' and 'cancel'\n        uniqueArray(targetTouches.concat(changedTargetTouches), 'identifier', true),\n        changedTargetTouches\n    ];\n}\n\n/**\n * Combined touch and mouse input\n *\n * Touch has a higher priority then mouse, and while touching no mouse events are allowed.\n * This because touch devices also emit mouse events while doing a touch.\n *\n * @constructor\n * @extends Input\n */\n\nvar DEDUP_TIMEOUT = 2500;\nvar DEDUP_DISTANCE = 25;\n\nfunction TouchMouseInput() {\n    Input.apply(this, arguments);\n\n    var handler = bindFn(this.handler, this);\n    this.touch = new TouchInput(this.manager, handler);\n    this.mouse = new MouseInput(this.manager, handler);\n\n    this.primaryTouch = null;\n    this.lastTouches = [];\n}\n\ninherit(TouchMouseInput, Input, {\n    /**\n     * handle mouse and touch events\n     * @param {Hammer} manager\n     * @param {String} inputEvent\n     * @param {Object} inputData\n     */\n    handler: function TMEhandler(manager, inputEvent, inputData) {\n        var isTouch = (inputData.pointerType == INPUT_TYPE_TOUCH),\n            isMouse = (inputData.pointerType == INPUT_TYPE_MOUSE);\n\n        if (isMouse && inputData.sourceCapabilities && inputData.sourceCapabilities.firesTouchEvents) {\n            return;\n        }\n\n        // when we're in a touch event, record touches to  de-dupe synthetic mouse event\n        if (isTouch) {\n            recordTouches.call(this, inputEvent, inputData);\n        } else if (isMouse && isSyntheticEvent.call(this, inputData)) {\n            return;\n        }\n\n        this.callback(manager, inputEvent, inputData);\n    },\n\n    /**\n     * remove the event listeners\n     */\n    destroy: function destroy() {\n        this.touch.destroy();\n        this.mouse.destroy();\n    }\n});\n\nfunction recordTouches(eventType, eventData) {\n    if (eventType & INPUT_START) {\n        this.primaryTouch = eventData.changedPointers[0].identifier;\n        setLastTouch.call(this, eventData);\n    } else if (eventType & (INPUT_END | INPUT_CANCEL)) {\n        setLastTouch.call(this, eventData);\n    }\n}\n\nfunction setLastTouch(eventData) {\n    var touch = eventData.changedPointers[0];\n\n    if (touch.identifier === this.primaryTouch) {\n        var lastTouch = {x: touch.clientX, y: touch.clientY};\n        this.lastTouches.push(lastTouch);\n        var lts = this.lastTouches;\n        var removeLastTouch = function() {\n            var i = lts.indexOf(lastTouch);\n            if (i > -1) {\n                lts.splice(i, 1);\n            }\n        };\n        setTimeout(removeLastTouch, DEDUP_TIMEOUT);\n    }\n}\n\nfunction isSyntheticEvent(eventData) {\n    var x = eventData.srcEvent.clientX, y = eventData.srcEvent.clientY;\n    for (var i = 0; i < this.lastTouches.length; i++) {\n        var t = this.lastTouches[i];\n        var dx = Math.abs(x - t.x), dy = Math.abs(y - t.y);\n        if (dx <= DEDUP_DISTANCE && dy <= DEDUP_DISTANCE) {\n            return true;\n        }\n    }\n    return false;\n}\n\nvar PREFIXED_TOUCH_ACTION = prefixed(TEST_ELEMENT.style, 'touchAction');\nvar NATIVE_TOUCH_ACTION = PREFIXED_TOUCH_ACTION !== undefined;\n\n// magical touchAction value\nvar TOUCH_ACTION_COMPUTE = 'compute';\nvar TOUCH_ACTION_AUTO = 'auto';\nvar TOUCH_ACTION_MANIPULATION = 'manipulation'; // not implemented\nvar TOUCH_ACTION_NONE = 'none';\nvar TOUCH_ACTION_PAN_X = 'pan-x';\nvar TOUCH_ACTION_PAN_Y = 'pan-y';\nvar TOUCH_ACTION_MAP = getTouchActionProps();\n\n/**\n * Touch Action\n * sets the touchAction property or uses the js alternative\n * @param {Manager} manager\n * @param {String} value\n * @constructor\n */\nfunction TouchAction(manager, value) {\n    this.manager = manager;\n    this.set(value);\n}\n\nTouchAction.prototype = {\n    /**\n     * set the touchAction value on the element or enable the polyfill\n     * @param {String} value\n     */\n    set: function(value) {\n        // find out the touch-action by the event handlers\n        if (value == TOUCH_ACTION_COMPUTE) {\n            value = this.compute();\n        }\n\n        if (NATIVE_TOUCH_ACTION && this.manager.element.style && TOUCH_ACTION_MAP[value]) {\n            this.manager.element.style[PREFIXED_TOUCH_ACTION] = value;\n        }\n        this.actions = value.toLowerCase().trim();\n    },\n\n    /**\n     * just re-set the touchAction value\n     */\n    update: function() {\n        this.set(this.manager.options.touchAction);\n    },\n\n    /**\n     * compute the value for the touchAction property based on the recognizer's settings\n     * @returns {String} value\n     */\n    compute: function() {\n        var actions = [];\n        each(this.manager.recognizers, function(recognizer) {\n            if (boolOrFn(recognizer.options.enable, [recognizer])) {\n                actions = actions.concat(recognizer.getTouchAction());\n            }\n        });\n        return cleanTouchActions(actions.join(' '));\n    },\n\n    /**\n     * this method is called on each input cycle and provides the preventing of the browser behavior\n     * @param {Object} input\n     */\n    preventDefaults: function(input) {\n        var srcEvent = input.srcEvent;\n        var direction = input.offsetDirection;\n\n        // if the touch action did prevented once this session\n        if (this.manager.session.prevented) {\n            srcEvent.preventDefault();\n            return;\n        }\n\n        var actions = this.actions;\n        var hasNone = inStr(actions, TOUCH_ACTION_NONE) && !TOUCH_ACTION_MAP[TOUCH_ACTION_NONE];\n        var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y) && !TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_Y];\n        var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X) && !TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_X];\n\n        if (hasNone) {\n            //do not prevent defaults if this is a tap gesture\n\n            var isTapPointer = input.pointers.length === 1;\n            var isTapMovement = input.distance < 2;\n            var isTapTouchTime = input.deltaTime < 250;\n\n            if (isTapPointer && isTapMovement && isTapTouchTime) {\n                return;\n            }\n        }\n\n        if (hasPanX && hasPanY) {\n            // `pan-x pan-y` means browser handles all scrolling/panning, do not prevent\n            return;\n        }\n\n        if (hasNone ||\n            (hasPanY && direction & DIRECTION_HORIZONTAL) ||\n            (hasPanX && direction & DIRECTION_VERTICAL)) {\n            return this.preventSrc(srcEvent);\n        }\n    },\n\n    /**\n     * call preventDefault to prevent the browser's default behavior (scrolling in most cases)\n     * @param {Object} srcEvent\n     */\n    preventSrc: function(srcEvent) {\n        this.manager.session.prevented = true;\n        srcEvent.preventDefault();\n    }\n};\n\n/**\n * when the touchActions are collected they are not a valid value, so we need to clean things up. *\n * @param {String} actions\n * @returns {*}\n */\nfunction cleanTouchActions(actions) {\n    // none\n    if (inStr(actions, TOUCH_ACTION_NONE)) {\n        return TOUCH_ACTION_NONE;\n    }\n\n    var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X);\n    var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y);\n\n    // if both pan-x and pan-y are set (different recognizers\n    // for different directions, e.g. horizontal pan but vertical swipe?)\n    // we need none (as otherwise with pan-x pan-y combined none of these\n    // recognizers will work, since the browser would handle all panning\n    if (hasPanX && hasPanY) {\n        return TOUCH_ACTION_NONE;\n    }\n\n    // pan-x OR pan-y\n    if (hasPanX || hasPanY) {\n        return hasPanX ? TOUCH_ACTION_PAN_X : TOUCH_ACTION_PAN_Y;\n    }\n\n    // manipulation\n    if (inStr(actions, TOUCH_ACTION_MANIPULATION)) {\n        return TOUCH_ACTION_MANIPULATION;\n    }\n\n    return TOUCH_ACTION_AUTO;\n}\n\nfunction getTouchActionProps() {\n    if (!NATIVE_TOUCH_ACTION) {\n        return false;\n    }\n    var touchMap = {};\n    var cssSupports = window.CSS && window.CSS.supports;\n    ['auto', 'manipulation', 'pan-y', 'pan-x', 'pan-x pan-y', 'none'].forEach(function(val) {\n\n        // If css.supports is not supported but there is native touch-action assume it supports\n        // all values. This is the case for IE 10 and 11.\n        touchMap[val] = cssSupports ? window.CSS.supports('touch-action', val) : true;\n    });\n    return touchMap;\n}\n\n/**\n * Recognizer flow explained; *\n * All recognizers have the initial state of POSSIBLE when a input session starts.\n * The definition of a input session is from the first input until the last input, with all it's movement in it. *\n * Example session for mouse-input: mousedown -> mousemove -> mouseup\n *\n * On each recognizing cycle (see Manager.recognize) the .recognize() method is executed\n * which determines with state it should be.\n *\n * If the recognizer has the state FAILED, CANCELLED or RECOGNIZED (equals ENDED), it is reset to\n * POSSIBLE to give it another change on the next cycle.\n *\n *               Possible\n *                  |\n *            +-----+---------------+\n *            |                     |\n *      +-----+-----+               |\n *      |           |               |\n *   Failed      Cancelled          |\n *                          +-------+------+\n *                          |              |\n *                      Recognized       Began\n *                                         |\n *                                      Changed\n *                                         |\n *                                  Ended/Recognized\n */\nvar STATE_POSSIBLE = 1;\nvar STATE_BEGAN = 2;\nvar STATE_CHANGED = 4;\nvar STATE_ENDED = 8;\nvar STATE_RECOGNIZED = STATE_ENDED;\nvar STATE_CANCELLED = 16;\nvar STATE_FAILED = 32;\n\n/**\n * Recognizer\n * Every recognizer needs to extend from this class.\n * @constructor\n * @param {Object} options\n */\nfunction Recognizer(options) {\n    this.options = assign({}, this.defaults, options || {});\n\n    this.id = uniqueId();\n\n    this.manager = null;\n\n    // default is enable true\n    this.options.enable = ifUndefined(this.options.enable, true);\n\n    this.state = STATE_POSSIBLE;\n\n    this.simultaneous = {};\n    this.requireFail = [];\n}\n\nRecognizer.prototype = {\n    /**\n     * @virtual\n     * @type {Object}\n     */\n    defaults: {},\n\n    /**\n     * set options\n     * @param {Object} options\n     * @return {Recognizer}\n     */\n    set: function(options) {\n        assign(this.options, options);\n\n        // also update the touchAction, in case something changed about the directions/enabled state\n        this.manager && this.manager.touchAction.update();\n        return this;\n    },\n\n    /**\n     * recognize simultaneous with an other recognizer.\n     * @param {Recognizer} otherRecognizer\n     * @returns {Recognizer} this\n     */\n    recognizeWith: function(otherRecognizer) {\n        if (invokeArrayArg(otherRecognizer, 'recognizeWith', this)) {\n            return this;\n        }\n\n        var simultaneous = this.simultaneous;\n        otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n        if (!simultaneous[otherRecognizer.id]) {\n            simultaneous[otherRecognizer.id] = otherRecognizer;\n            otherRecognizer.recognizeWith(this);\n        }\n        return this;\n    },\n\n    /**\n     * drop the simultaneous link. it doesnt remove the link on the other recognizer.\n     * @param {Recognizer} otherRecognizer\n     * @returns {Recognizer} this\n     */\n    dropRecognizeWith: function(otherRecognizer) {\n        if (invokeArrayArg(otherRecognizer, 'dropRecognizeWith', this)) {\n            return this;\n        }\n\n        otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n        delete this.simultaneous[otherRecognizer.id];\n        return this;\n    },\n\n    /**\n     * recognizer can only run when an other is failing\n     * @param {Recognizer} otherRecognizer\n     * @returns {Recognizer} this\n     */\n    requireFailure: function(otherRecognizer) {\n        if (invokeArrayArg(otherRecognizer, 'requireFailure', this)) {\n            return this;\n        }\n\n        var requireFail = this.requireFail;\n        otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n        if (inArray(requireFail, otherRecognizer) === -1) {\n            requireFail.push(otherRecognizer);\n            otherRecognizer.requireFailure(this);\n        }\n        return this;\n    },\n\n    /**\n     * drop the requireFailure link. it does not remove the link on the other recognizer.\n     * @param {Recognizer} otherRecognizer\n     * @returns {Recognizer} this\n     */\n    dropRequireFailure: function(otherRecognizer) {\n        if (invokeArrayArg(otherRecognizer, 'dropRequireFailure', this)) {\n            return this;\n        }\n\n        otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n        var index = inArray(this.requireFail, otherRecognizer);\n        if (index > -1) {\n            this.requireFail.splice(index, 1);\n        }\n        return this;\n    },\n\n    /**\n     * has require failures boolean\n     * @returns {boolean}\n     */\n    hasRequireFailures: function() {\n        return this.requireFail.length > 0;\n    },\n\n    /**\n     * if the recognizer can recognize simultaneous with an other recognizer\n     * @param {Recognizer} otherRecognizer\n     * @returns {Boolean}\n     */\n    canRecognizeWith: function(otherRecognizer) {\n        return !!this.simultaneous[otherRecognizer.id];\n    },\n\n    /**\n     * You should use `tryEmit` instead of `emit` directly to check\n     * that all the needed recognizers has failed before emitting.\n     * @param {Object} input\n     */\n    emit: function(input) {\n        var self = this;\n        var state = this.state;\n\n        function emit(event) {\n            self.manager.emit(event, input);\n        }\n\n        // 'panstart' and 'panmove'\n        if (state < STATE_ENDED) {\n            emit(self.options.event + stateStr(state));\n        }\n\n        emit(self.options.event); // simple 'eventName' events\n\n        if (input.additionalEvent) { // additional event(panleft, panright, pinchin, pinchout...)\n            emit(input.additionalEvent);\n        }\n\n        // panend and pancancel\n        if (state >= STATE_ENDED) {\n            emit(self.options.event + stateStr(state));\n        }\n    },\n\n    /**\n     * Check that all the require failure recognizers has failed,\n     * if true, it emits a gesture event,\n     * otherwise, setup the state to FAILED.\n     * @param {Object} input\n     */\n    tryEmit: function(input) {\n        if (this.canEmit()) {\n            return this.emit(input);\n        }\n        // it's failing anyway\n        this.state = STATE_FAILED;\n    },\n\n    /**\n     * can we emit?\n     * @returns {boolean}\n     */\n    canEmit: function() {\n        var i = 0;\n        while (i < this.requireFail.length) {\n            if (!(this.requireFail[i].state & (STATE_FAILED | STATE_POSSIBLE))) {\n                return false;\n            }\n            i++;\n        }\n        return true;\n    },\n\n    /**\n     * update the recognizer\n     * @param {Object} inputData\n     */\n    recognize: function(inputData) {\n        // make a new copy of the inputData\n        // so we can change the inputData without messing up the other recognizers\n        var inputDataClone = assign({}, inputData);\n\n        // is is enabled and allow recognizing?\n        if (!boolOrFn(this.options.enable, [this, inputDataClone])) {\n            this.reset();\n            this.state = STATE_FAILED;\n            return;\n        }\n\n        // reset when we've reached the end\n        if (this.state & (STATE_RECOGNIZED | STATE_CANCELLED | STATE_FAILED)) {\n            this.state = STATE_POSSIBLE;\n        }\n\n        this.state = this.process(inputDataClone);\n\n        // the recognizer has recognized a gesture\n        // so trigger an event\n        if (this.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED | STATE_CANCELLED)) {\n            this.tryEmit(inputDataClone);\n        }\n    },\n\n    /**\n     * return the state of the recognizer\n     * the actual recognizing happens in this method\n     * @virtual\n     * @param {Object} inputData\n     * @returns {Const} STATE\n     */\n    process: function(inputData) { }, // jshint ignore:line\n\n    /**\n     * return the preferred touch-action\n     * @virtual\n     * @returns {Array}\n     */\n    getTouchAction: function() { },\n\n    /**\n     * called when the gesture isn't allowed to recognize\n     * like when another is being recognized or it is disabled\n     * @virtual\n     */\n    reset: function() { }\n};\n\n/**\n * get a usable string, used as event postfix\n * @param {Const} state\n * @returns {String} state\n */\nfunction stateStr(state) {\n    if (state & STATE_CANCELLED) {\n        return 'cancel';\n    } else if (state & STATE_ENDED) {\n        return 'end';\n    } else if (state & STATE_CHANGED) {\n        return 'move';\n    } else if (state & STATE_BEGAN) {\n        return 'start';\n    }\n    return '';\n}\n\n/**\n * direction cons to string\n * @param {Const} direction\n * @returns {String}\n */\nfunction directionStr(direction) {\n    if (direction == DIRECTION_DOWN) {\n        return 'down';\n    } else if (direction == DIRECTION_UP) {\n        return 'up';\n    } else if (direction == DIRECTION_LEFT) {\n        return 'left';\n    } else if (direction == DIRECTION_RIGHT) {\n        return 'right';\n    }\n    return '';\n}\n\n/**\n * get a recognizer by name if it is bound to a manager\n * @param {Recognizer|String} otherRecognizer\n * @param {Recognizer} recognizer\n * @returns {Recognizer}\n */\nfunction getRecognizerByNameIfManager(otherRecognizer, recognizer) {\n    var manager = recognizer.manager;\n    if (manager) {\n        return manager.get(otherRecognizer);\n    }\n    return otherRecognizer;\n}\n\n/**\n * This recognizer is just used as a base for the simple attribute recognizers.\n * @constructor\n * @extends Recognizer\n */\nfunction AttrRecognizer() {\n    Recognizer.apply(this, arguments);\n}\n\ninherit(AttrRecognizer, Recognizer, {\n    /**\n     * @namespace\n     * @memberof AttrRecognizer\n     */\n    defaults: {\n        /**\n         * @type {Number}\n         * @default 1\n         */\n        pointers: 1\n    },\n\n    /**\n     * Used to check if it the recognizer receives valid input, like input.distance > 10.\n     * @memberof AttrRecognizer\n     * @param {Object} input\n     * @returns {Boolean} recognized\n     */\n    attrTest: function(input) {\n        var optionPointers = this.options.pointers;\n        return optionPointers === 0 || input.pointers.length === optionPointers;\n    },\n\n    /**\n     * Process the input and return the state for the recognizer\n     * @memberof AttrRecognizer\n     * @param {Object} input\n     * @returns {*} State\n     */\n    process: function(input) {\n        var state = this.state;\n        var eventType = input.eventType;\n\n        var isRecognized = state & (STATE_BEGAN | STATE_CHANGED);\n        var isValid = this.attrTest(input);\n\n        // on cancel input and we've recognized before, return STATE_CANCELLED\n        if (isRecognized && (eventType & INPUT_CANCEL || !isValid)) {\n            return state | STATE_CANCELLED;\n        } else if (isRecognized || isValid) {\n            if (eventType & INPUT_END) {\n                return state | STATE_ENDED;\n            } else if (!(state & STATE_BEGAN)) {\n                return STATE_BEGAN;\n            }\n            return state | STATE_CHANGED;\n        }\n        return STATE_FAILED;\n    }\n});\n\n/**\n * Pan\n * Recognized when the pointer is down and moved in the allowed direction.\n * @constructor\n * @extends AttrRecognizer\n */\nfunction PanRecognizer() {\n    AttrRecognizer.apply(this, arguments);\n\n    this.pX = null;\n    this.pY = null;\n}\n\ninherit(PanRecognizer, AttrRecognizer, {\n    /**\n     * @namespace\n     * @memberof PanRecognizer\n     */\n    defaults: {\n        event: 'pan',\n        threshold: 10,\n        pointers: 1,\n        direction: DIRECTION_ALL\n    },\n\n    getTouchAction: function() {\n        var direction = this.options.direction;\n        var actions = [];\n        if (direction & DIRECTION_HORIZONTAL) {\n            actions.push(TOUCH_ACTION_PAN_Y);\n        }\n        if (direction & DIRECTION_VERTICAL) {\n            actions.push(TOUCH_ACTION_PAN_X);\n        }\n        return actions;\n    },\n\n    directionTest: function(input) {\n        var options = this.options;\n        var hasMoved = true;\n        var distance = input.distance;\n        var direction = input.direction;\n        var x = input.deltaX;\n        var y = input.deltaY;\n\n        // lock to axis?\n        if (!(direction & options.direction)) {\n            if (options.direction & DIRECTION_HORIZONTAL) {\n                direction = (x === 0) ? DIRECTION_NONE : (x < 0) ? DIRECTION_LEFT : DIRECTION_RIGHT;\n                hasMoved = x != this.pX;\n                distance = Math.abs(input.deltaX);\n            } else {\n                direction = (y === 0) ? DIRECTION_NONE : (y < 0) ? DIRECTION_UP : DIRECTION_DOWN;\n                hasMoved = y != this.pY;\n                distance = Math.abs(input.deltaY);\n            }\n        }\n        input.direction = direction;\n        return hasMoved && distance > options.threshold && direction & options.direction;\n    },\n\n    attrTest: function(input) {\n        return AttrRecognizer.prototype.attrTest.call(this, input) &&\n            (this.state & STATE_BEGAN || (!(this.state & STATE_BEGAN) && this.directionTest(input)));\n    },\n\n    emit: function(input) {\n\n        this.pX = input.deltaX;\n        this.pY = input.deltaY;\n\n        var direction = directionStr(input.direction);\n\n        if (direction) {\n            input.additionalEvent = this.options.event + direction;\n        }\n        this._super.emit.call(this, input);\n    }\n});\n\n/**\n * Pinch\n * Recognized when two or more pointers are moving toward (zoom-in) or away from each other (zoom-out).\n * @constructor\n * @extends AttrRecognizer\n */\nfunction PinchRecognizer() {\n    AttrRecognizer.apply(this, arguments);\n}\n\ninherit(PinchRecognizer, AttrRecognizer, {\n    /**\n     * @namespace\n     * @memberof PinchRecognizer\n     */\n    defaults: {\n        event: 'pinch',\n        threshold: 0,\n        pointers: 2\n    },\n\n    getTouchAction: function() {\n        return [TOUCH_ACTION_NONE];\n    },\n\n    attrTest: function(input) {\n        return this._super.attrTest.call(this, input) &&\n            (Math.abs(input.scale - 1) > this.options.threshold || this.state & STATE_BEGAN);\n    },\n\n    emit: function(input) {\n        if (input.scale !== 1) {\n            var inOut = input.scale < 1 ? 'in' : 'out';\n            input.additionalEvent = this.options.event + inOut;\n        }\n        this._super.emit.call(this, input);\n    }\n});\n\n/**\n * Press\n * Recognized when the pointer is down for x ms without any movement.\n * @constructor\n * @extends Recognizer\n */\nfunction PressRecognizer() {\n    Recognizer.apply(this, arguments);\n\n    this._timer = null;\n    this._input = null;\n}\n\ninherit(PressRecognizer, Recognizer, {\n    /**\n     * @namespace\n     * @memberof PressRecognizer\n     */\n    defaults: {\n        event: 'press',\n        pointers: 1,\n        time: 251, // minimal time of the pointer to be pressed\n        threshold: 9 // a minimal movement is ok, but keep it low\n    },\n\n    getTouchAction: function() {\n        return [TOUCH_ACTION_AUTO];\n    },\n\n    process: function(input) {\n        var options = this.options;\n        var validPointers = input.pointers.length === options.pointers;\n        var validMovement = input.distance < options.threshold;\n        var validTime = input.deltaTime > options.time;\n\n        this._input = input;\n\n        // we only allow little movement\n        // and we've reached an end event, so a tap is possible\n        if (!validMovement || !validPointers || (input.eventType & (INPUT_END | INPUT_CANCEL) && !validTime)) {\n            this.reset();\n        } else if (input.eventType & INPUT_START) {\n            this.reset();\n            this._timer = setTimeoutContext(function() {\n                this.state = STATE_RECOGNIZED;\n                this.tryEmit();\n            }, options.time, this);\n        } else if (input.eventType & INPUT_END) {\n            return STATE_RECOGNIZED;\n        }\n        return STATE_FAILED;\n    },\n\n    reset: function() {\n        clearTimeout(this._timer);\n    },\n\n    emit: function(input) {\n        if (this.state !== STATE_RECOGNIZED) {\n            return;\n        }\n\n        if (input && (input.eventType & INPUT_END)) {\n            this.manager.emit(this.options.event + 'up', input);\n        } else {\n            this._input.timeStamp = now();\n            this.manager.emit(this.options.event, this._input);\n        }\n    }\n});\n\n/**\n * Rotate\n * Recognized when two or more pointer are moving in a circular motion.\n * @constructor\n * @extends AttrRecognizer\n */\nfunction RotateRecognizer() {\n    AttrRecognizer.apply(this, arguments);\n}\n\ninherit(RotateRecognizer, AttrRecognizer, {\n    /**\n     * @namespace\n     * @memberof RotateRecognizer\n     */\n    defaults: {\n        event: 'rotate',\n        threshold: 0,\n        pointers: 2\n    },\n\n    getTouchAction: function() {\n        return [TOUCH_ACTION_NONE];\n    },\n\n    attrTest: function(input) {\n        return this._super.attrTest.call(this, input) &&\n            (Math.abs(input.rotation) > this.options.threshold || this.state & STATE_BEGAN);\n    }\n});\n\n/**\n * Swipe\n * Recognized when the pointer is moving fast (velocity), with enough distance in the allowed direction.\n * @constructor\n * @extends AttrRecognizer\n */\nfunction SwipeRecognizer() {\n    AttrRecognizer.apply(this, arguments);\n}\n\ninherit(SwipeRecognizer, AttrRecognizer, {\n    /**\n     * @namespace\n     * @memberof SwipeRecognizer\n     */\n    defaults: {\n        event: 'swipe',\n        threshold: 10,\n        velocity: 0.3,\n        direction: DIRECTION_HORIZONTAL | DIRECTION_VERTICAL,\n        pointers: 1\n    },\n\n    getTouchAction: function() {\n        return PanRecognizer.prototype.getTouchAction.call(this);\n    },\n\n    attrTest: function(input) {\n        var direction = this.options.direction;\n        var velocity;\n\n        if (direction & (DIRECTION_HORIZONTAL | DIRECTION_VERTICAL)) {\n            velocity = input.overallVelocity;\n        } else if (direction & DIRECTION_HORIZONTAL) {\n            velocity = input.overallVelocityX;\n        } else if (direction & DIRECTION_VERTICAL) {\n            velocity = input.overallVelocityY;\n        }\n\n        return this._super.attrTest.call(this, input) &&\n            direction & input.offsetDirection &&\n            input.distance > this.options.threshold &&\n            input.maxPointers == this.options.pointers &&\n            abs(velocity) > this.options.velocity && input.eventType & INPUT_END;\n    },\n\n    emit: function(input) {\n        var direction = directionStr(input.offsetDirection);\n        if (direction) {\n            this.manager.emit(this.options.event + direction, input);\n        }\n\n        this.manager.emit(this.options.event, input);\n    }\n});\n\n/**\n * A tap is ecognized when the pointer is doing a small tap/click. Multiple taps are recognized if they occur\n * between the given interval and position. The delay option can be used to recognize multi-taps without firing\n * a single tap.\n *\n * The eventData from the emitted event contains the property `tapCount`, which contains the amount of\n * multi-taps being recognized.\n * @constructor\n * @extends Recognizer\n */\nfunction TapRecognizer() {\n    Recognizer.apply(this, arguments);\n\n    // previous time and center,\n    // used for tap counting\n    this.pTime = false;\n    this.pCenter = false;\n\n    this._timer = null;\n    this._input = null;\n    this.count = 0;\n}\n\ninherit(TapRecognizer, Recognizer, {\n    /**\n     * @namespace\n     * @memberof PinchRecognizer\n     */\n    defaults: {\n        event: 'tap',\n        pointers: 1,\n        taps: 1,\n        interval: 300, // max time between the multi-tap taps\n        time: 250, // max time of the pointer to be down (like finger on the screen)\n        threshold: 9, // a minimal movement is ok, but keep it low\n        posThreshold: 10 // a multi-tap can be a bit off the initial position\n    },\n\n    getTouchAction: function() {\n        return [TOUCH_ACTION_MANIPULATION];\n    },\n\n    process: function(input) {\n        var options = this.options;\n\n        var validPointers = input.pointers.length === options.pointers;\n        var validMovement = input.distance < options.threshold;\n        var validTouchTime = input.deltaTime < options.time;\n\n        this.reset();\n\n        if ((input.eventType & INPUT_START) && (this.count === 0)) {\n            return this.failTimeout();\n        }\n\n        // we only allow little movement\n        // and we've reached an end event, so a tap is possible\n        if (validMovement && validTouchTime && validPointers) {\n            if (input.eventType != INPUT_END) {\n                return this.failTimeout();\n            }\n\n            var validInterval = this.pTime ? (input.timeStamp - this.pTime < options.interval) : true;\n            var validMultiTap = !this.pCenter || getDistance(this.pCenter, input.center) < options.posThreshold;\n\n            this.pTime = input.timeStamp;\n            this.pCenter = input.center;\n\n            if (!validMultiTap || !validInterval) {\n                this.count = 1;\n            } else {\n                this.count += 1;\n            }\n\n            this._input = input;\n\n            // if tap count matches we have recognized it,\n            // else it has began recognizing...\n            var tapCount = this.count % options.taps;\n            if (tapCount === 0) {\n                // no failing requirements, immediately trigger the tap event\n                // or wait as long as the multitap interval to trigger\n                if (!this.hasRequireFailures()) {\n                    return STATE_RECOGNIZED;\n                } else {\n                    this._timer = setTimeoutContext(function() {\n                        this.state = STATE_RECOGNIZED;\n                        this.tryEmit();\n                    }, options.interval, this);\n                    return STATE_BEGAN;\n                }\n            }\n        }\n        return STATE_FAILED;\n    },\n\n    failTimeout: function() {\n        this._timer = setTimeoutContext(function() {\n            this.state = STATE_FAILED;\n        }, this.options.interval, this);\n        return STATE_FAILED;\n    },\n\n    reset: function() {\n        clearTimeout(this._timer);\n    },\n\n    emit: function() {\n        if (this.state == STATE_RECOGNIZED) {\n            this._input.tapCount = this.count;\n            this.manager.emit(this.options.event, this._input);\n        }\n    }\n});\n\n/**\n * Simple way to create a manager with a default set of recognizers.\n * @param {HTMLElement} element\n * @param {Object} [options]\n * @constructor\n */\nfunction Hammer(element, options) {\n    options = options || {};\n    options.recognizers = ifUndefined(options.recognizers, Hammer.defaults.preset);\n    return new Manager(element, options);\n}\n\n/**\n * @const {string}\n */\nHammer.VERSION = '2.0.7';\n\n/**\n * default settings\n * @namespace\n */\nHammer.defaults = {\n    /**\n     * set if DOM events are being triggered.\n     * But this is slower and unused by simple implementations, so disabled by default.\n     * @type {Boolean}\n     * @default false\n     */\n    domEvents: false,\n\n    /**\n     * The value for the touchAction property/fallback.\n     * When set to `compute` it will magically set the correct value based on the added recognizers.\n     * @type {String}\n     * @default compute\n     */\n    touchAction: TOUCH_ACTION_COMPUTE,\n\n    /**\n     * @type {Boolean}\n     * @default true\n     */\n    enable: true,\n\n    /**\n     * EXPERIMENTAL FEATURE -- can be removed/changed\n     * Change the parent input target element.\n     * If Null, then it is being set the to main element.\n     * @type {Null|EventTarget}\n     * @default null\n     */\n    inputTarget: null,\n\n    /**\n     * force an input class\n     * @type {Null|Function}\n     * @default null\n     */\n    inputClass: null,\n\n    /**\n     * Default recognizer setup when calling `Hammer()`\n     * When creating a new Manager these will be skipped.\n     * @type {Array}\n     */\n    preset: [\n        // RecognizerClass, options, [recognizeWith, ...], [requireFailure, ...]\n        [RotateRecognizer, {enable: false}],\n        [PinchRecognizer, {enable: false}, ['rotate']],\n        [SwipeRecognizer, {direction: DIRECTION_HORIZONTAL}],\n        [PanRecognizer, {direction: DIRECTION_HORIZONTAL}, ['swipe']],\n        [TapRecognizer],\n        [TapRecognizer, {event: 'doubletap', taps: 2}, ['tap']],\n        [PressRecognizer]\n    ],\n\n    /**\n     * Some CSS properties can be used to improve the working of Hammer.\n     * Add them to this method and they will be set when creating a new Manager.\n     * @namespace\n     */\n    cssProps: {\n        /**\n         * Disables text selection to improve the dragging gesture. Mainly for desktop browsers.\n         * @type {String}\n         * @default 'none'\n         */\n        userSelect: 'none',\n\n        /**\n         * Disable the Windows Phone grippers when pressing an element.\n         * @type {String}\n         * @default 'none'\n         */\n        touchSelect: 'none',\n\n        /**\n         * Disables the default callout shown when you touch and hold a touch target.\n         * On iOS, when you touch and hold a touch target such as a link, Safari displays\n         * a callout containing information about the link. This property allows you to disable that callout.\n         * @type {String}\n         * @default 'none'\n         */\n        touchCallout: 'none',\n\n        /**\n         * Specifies whether zooming is enabled. Used by IE10>\n         * @type {String}\n         * @default 'none'\n         */\n        contentZooming: 'none',\n\n        /**\n         * Specifies that an entire element should be draggable instead of its contents. Mainly for desktop browsers.\n         * @type {String}\n         * @default 'none'\n         */\n        userDrag: 'none',\n\n        /**\n         * Overrides the highlight color shown when the user taps a link or a JavaScript\n         * clickable element in iOS. This property obeys the alpha value, if specified.\n         * @type {String}\n         * @default 'rgba(0,0,0,0)'\n         */\n        tapHighlightColor: 'rgba(0,0,0,0)'\n    }\n};\n\nvar STOP = 1;\nvar FORCED_STOP = 2;\n\n/**\n * Manager\n * @param {HTMLElement} element\n * @param {Object} [options]\n * @constructor\n */\nfunction Manager(element, options) {\n    this.options = assign({}, Hammer.defaults, options || {});\n\n    this.options.inputTarget = this.options.inputTarget || element;\n\n    this.handlers = {};\n    this.session = {};\n    this.recognizers = [];\n    this.oldCssProps = {};\n\n    this.element = element;\n    this.input = createInputInstance(this);\n    this.touchAction = new TouchAction(this, this.options.touchAction);\n\n    toggleCssProps(this, true);\n\n    each(this.options.recognizers, function(item) {\n        var recognizer = this.add(new (item[0])(item[1]));\n        item[2] && recognizer.recognizeWith(item[2]);\n        item[3] && recognizer.requireFailure(item[3]);\n    }, this);\n}\n\nManager.prototype = {\n    /**\n     * set options\n     * @param {Object} options\n     * @returns {Manager}\n     */\n    set: function(options) {\n        assign(this.options, options);\n\n        // Options that need a little more setup\n        if (options.touchAction) {\n            this.touchAction.update();\n        }\n        if (options.inputTarget) {\n            // Clean up existing event listeners and reinitialize\n            this.input.destroy();\n            this.input.target = options.inputTarget;\n            this.input.init();\n        }\n        return this;\n    },\n\n    /**\n     * stop recognizing for this session.\n     * This session will be discarded, when a new [input]start event is fired.\n     * When forced, the recognizer cycle is stopped immediately.\n     * @param {Boolean} [force]\n     */\n    stop: function(force) {\n        this.session.stopped = force ? FORCED_STOP : STOP;\n    },\n\n    /**\n     * run the recognizers!\n     * called by the inputHandler function on every movement of the pointers (touches)\n     * it walks through all the recognizers and tries to detect the gesture that is being made\n     * @param {Object} inputData\n     */\n    recognize: function(inputData) {\n        var session = this.session;\n        if (session.stopped) {\n            return;\n        }\n\n        // run the touch-action polyfill\n        this.touchAction.preventDefaults(inputData);\n\n        var recognizer;\n        var recognizers = this.recognizers;\n\n        // this holds the recognizer that is being recognized.\n        // so the recognizer's state needs to be BEGAN, CHANGED, ENDED or RECOGNIZED\n        // if no recognizer is detecting a thing, it is set to `null`\n        var curRecognizer = session.curRecognizer;\n\n        // reset when the last recognizer is recognized\n        // or when we're in a new session\n        if (!curRecognizer || (curRecognizer && curRecognizer.state & STATE_RECOGNIZED)) {\n            curRecognizer = session.curRecognizer = null;\n        }\n\n        var i = 0;\n        while (i < recognizers.length) {\n            recognizer = recognizers[i];\n\n            // find out if we are allowed try to recognize the input for this one.\n            // 1.   allow if the session is NOT forced stopped (see the .stop() method)\n            // 2.   allow if we still haven't recognized a gesture in this session, or the this recognizer is the one\n            //      that is being recognized.\n            // 3.   allow if the recognizer is allowed to run simultaneous with the current recognized recognizer.\n            //      this can be setup with the `recognizeWith()` method on the recognizer.\n            if (session.stopped !== FORCED_STOP && ( // 1\n                    !curRecognizer || recognizer == curRecognizer || // 2\n                    recognizer.canRecognizeWith(curRecognizer))) { // 3\n                recognizer.recognize(inputData);\n            } else {\n                recognizer.reset();\n            }\n\n            // if the recognizer has been recognizing the input as a valid gesture, we want to store this one as the\n            // current active recognizer. but only if we don't already have an active recognizer\n            if (!curRecognizer && recognizer.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED)) {\n                curRecognizer = session.curRecognizer = recognizer;\n            }\n            i++;\n        }\n    },\n\n    /**\n     * get a recognizer by its event name.\n     * @param {Recognizer|String} recognizer\n     * @returns {Recognizer|Null}\n     */\n    get: function(recognizer) {\n        if (recognizer instanceof Recognizer) {\n            return recognizer;\n        }\n\n        var recognizers = this.recognizers;\n        for (var i = 0; i < recognizers.length; i++) {\n            if (recognizers[i].options.event == recognizer) {\n                return recognizers[i];\n            }\n        }\n        return null;\n    },\n\n    /**\n     * add a recognizer to the manager\n     * existing recognizers with the same event name will be removed\n     * @param {Recognizer} recognizer\n     * @returns {Recognizer|Manager}\n     */\n    add: function(recognizer) {\n        if (invokeArrayArg(recognizer, 'add', this)) {\n            return this;\n        }\n\n        // remove existing\n        var existing = this.get(recognizer.options.event);\n        if (existing) {\n            this.remove(existing);\n        }\n\n        this.recognizers.push(recognizer);\n        recognizer.manager = this;\n\n        this.touchAction.update();\n        return recognizer;\n    },\n\n    /**\n     * remove a recognizer by name or instance\n     * @param {Recognizer|String} recognizer\n     * @returns {Manager}\n     */\n    remove: function(recognizer) {\n        if (invokeArrayArg(recognizer, 'remove', this)) {\n            return this;\n        }\n\n        recognizer = this.get(recognizer);\n\n        // let's make sure this recognizer exists\n        if (recognizer) {\n            var recognizers = this.recognizers;\n            var index = inArray(recognizers, recognizer);\n\n            if (index !== -1) {\n                recognizers.splice(index, 1);\n                this.touchAction.update();\n            }\n        }\n\n        return this;\n    },\n\n    /**\n     * bind event\n     * @param {String} events\n     * @param {Function} handler\n     * @returns {EventEmitter} this\n     */\n    on: function(events, handler) {\n        if (events === undefined) {\n            return;\n        }\n        if (handler === undefined) {\n            return;\n        }\n\n        var handlers = this.handlers;\n        each(splitStr(events), function(event) {\n            handlers[event] = handlers[event] || [];\n            handlers[event].push(handler);\n        });\n        return this;\n    },\n\n    /**\n     * unbind event, leave emit blank to remove all handlers\n     * @param {String} events\n     * @param {Function} [handler]\n     * @returns {EventEmitter} this\n     */\n    off: function(events, handler) {\n        if (events === undefined) {\n            return;\n        }\n\n        var handlers = this.handlers;\n        each(splitStr(events), function(event) {\n            if (!handler) {\n                delete handlers[event];\n            } else {\n                handlers[event] && handlers[event].splice(inArray(handlers[event], handler), 1);\n            }\n        });\n        return this;\n    },\n\n    /**\n     * emit event to the listeners\n     * @param {String} event\n     * @param {Object} data\n     */\n    emit: function(event, data) {\n        // we also want to trigger dom events\n        if (this.options.domEvents) {\n            triggerDomEvent(event, data);\n        }\n\n        // no handlers, so skip it all\n        var handlers = this.handlers[event] && this.handlers[event].slice();\n        if (!handlers || !handlers.length) {\n            return;\n        }\n\n        data.type = event;\n        data.preventDefault = function() {\n            data.srcEvent.preventDefault();\n        };\n\n        var i = 0;\n        while (i < handlers.length) {\n            handlers[i](data);\n            i++;\n        }\n    },\n\n    /**\n     * destroy the manager and unbinds all events\n     * it doesn't unbind dom events, that is the user own responsibility\n     */\n    destroy: function() {\n        this.element && toggleCssProps(this, false);\n\n        this.handlers = {};\n        this.session = {};\n        this.input.destroy();\n        this.element = null;\n    }\n};\n\n/**\n * add/remove the css properties as defined in manager.options.cssProps\n * @param {Manager} manager\n * @param {Boolean} add\n */\nfunction toggleCssProps(manager, add) {\n    var element = manager.element;\n    if (!element.style) {\n        return;\n    }\n    var prop;\n    each(manager.options.cssProps, function(value, name) {\n        prop = prefixed(element.style, name);\n        if (add) {\n            manager.oldCssProps[prop] = element.style[prop];\n            element.style[prop] = value;\n        } else {\n            element.style[prop] = manager.oldCssProps[prop] || '';\n        }\n    });\n    if (!add) {\n        manager.oldCssProps = {};\n    }\n}\n\n/**\n * trigger dom event\n * @param {String} event\n * @param {Object} data\n */\nfunction triggerDomEvent(event, data) {\n    var gestureEvent = document.createEvent('Event');\n    gestureEvent.initEvent(event, true, true);\n    gestureEvent.gesture = data;\n    data.target.dispatchEvent(gestureEvent);\n}\n\nassign(Hammer, {\n    INPUT_START: INPUT_START,\n    INPUT_MOVE: INPUT_MOVE,\n    INPUT_END: INPUT_END,\n    INPUT_CANCEL: INPUT_CANCEL,\n\n    STATE_POSSIBLE: STATE_POSSIBLE,\n    STATE_BEGAN: STATE_BEGAN,\n    STATE_CHANGED: STATE_CHANGED,\n    STATE_ENDED: STATE_ENDED,\n    STATE_RECOGNIZED: STATE_RECOGNIZED,\n    STATE_CANCELLED: STATE_CANCELLED,\n    STATE_FAILED: STATE_FAILED,\n\n    DIRECTION_NONE: DIRECTION_NONE,\n    DIRECTION_LEFT: DIRECTION_LEFT,\n    DIRECTION_RIGHT: DIRECTION_RIGHT,\n    DIRECTION_UP: DIRECTION_UP,\n    DIRECTION_DOWN: DIRECTION_DOWN,\n    DIRECTION_HORIZONTAL: DIRECTION_HORIZONTAL,\n    DIRECTION_VERTICAL: DIRECTION_VERTICAL,\n    DIRECTION_ALL: DIRECTION_ALL,\n\n    Manager: Manager,\n    Input: Input,\n    TouchAction: TouchAction,\n\n    TouchInput: TouchInput,\n    MouseInput: MouseInput,\n    PointerEventInput: PointerEventInput,\n    TouchMouseInput: TouchMouseInput,\n    SingleTouchInput: SingleTouchInput,\n\n    Recognizer: Recognizer,\n    AttrRecognizer: AttrRecognizer,\n    Tap: TapRecognizer,\n    Pan: PanRecognizer,\n    Swipe: SwipeRecognizer,\n    Pinch: PinchRecognizer,\n    Rotate: RotateRecognizer,\n    Press: PressRecognizer,\n\n    on: addEventListeners,\n    off: removeEventListeners,\n    each: each,\n    merge: merge,\n    extend: extend,\n    assign: assign,\n    inherit: inherit,\n    bindFn: bindFn,\n    prefixed: prefixed\n});\n\n// this prevents errors when Hammer is loaded in the presence of an AMD\n//  style loader but by script tag, not by the loader.\nvar freeGlobal = (typeof window !== 'undefined' ? window : (typeof self !== 'undefined' ? self : {})); // jshint ignore:line\nfreeGlobal.Hammer = Hammer;\n\nif (typeof define === 'function' && define.amd) {\n    define(function() {\n        return Hammer;\n    });\n} else if (typeof module != 'undefined' && module.exports) {\n    module.exports = Hammer;\n} else {\n    window[exportName] = Hammer;\n}\n\n})(window, document, 'Hammer');\n","/**\n * @license\n * Copyright 2010-2025 Three.js Authors\n * SPDX-License-Identifier: MIT\n */\n'use strict';\n\nconst REVISION = '181';\n\n/**\n * Represents mouse buttons and interaction types in context of controls.\n *\n * @type {ConstantsMouse}\n * @constant\n */\nconst MOUSE = { LEFT: 0, MIDDLE: 1, RIGHT: 2, ROTATE: 0, DOLLY: 1, PAN: 2 };\n\n/**\n * Represents touch interaction types in context of controls.\n *\n * @type {ConstantsTouch}\n * @constant\n */\nconst TOUCH = { ROTATE: 0, PAN: 1, DOLLY_PAN: 2, DOLLY_ROTATE: 3 };\n\n/**\n * Disables face culling.\n *\n * @type {number}\n * @constant\n */\nconst CullFaceNone = 0;\n\n/**\n * Culls back faces.\n *\n * @type {number}\n * @constant\n */\nconst CullFaceBack = 1;\n\n/**\n * Culls front faces.\n *\n * @type {number}\n * @constant\n */\nconst CullFaceFront = 2;\n\n/**\n * Culls both front and back faces.\n *\n * @type {number}\n * @constant\n */\nconst CullFaceFrontBack = 3;\n\n/**\n * Gives unfiltered shadow maps - fastest, but lowest quality.\n *\n * @type {number}\n * @constant\n */\nconst BasicShadowMap = 0;\n\n/**\n * Filters shadow maps using the Percentage-Closer Filtering (PCF) algorithm.\n *\n * @type {number}\n * @constant\n */\nconst PCFShadowMap = 1;\n\n/**\n * Filters shadow maps using the Percentage-Closer Filtering (PCF) algorithm with\n * better soft shadows especially when using low-resolution shadow maps.\n *\n * @type {number}\n * @constant\n */\nconst PCFSoftShadowMap = 2;\n\n/**\n * Filters shadow maps using the Variance Shadow Map (VSM) algorithm.\n * When using VSMShadowMap all shadow receivers will also cast shadows.\n *\n * @type {number}\n * @constant\n */\nconst VSMShadowMap = 3;\n\n/**\n * Only front faces are rendered.\n *\n * @type {number}\n * @constant\n */\nconst FrontSide = 0;\n\n/**\n * Only back faces are rendered.\n *\n * @type {number}\n * @constant\n */\nconst BackSide = 1;\n\n/**\n * Both front and back faces are rendered.\n *\n * @type {number}\n * @constant\n */\nconst DoubleSide = 2;\n\n/**\n * No blending is performed which effectively disables\n * alpha transparency.\n *\n * @type {number}\n * @constant\n */\nconst NoBlending = 0;\n\n/**\n * The default blending.\n *\n * @type {number}\n * @constant\n */\nconst NormalBlending = 1;\n\n/**\n * Represents additive blending.\n *\n * @type {number}\n * @constant\n */\nconst AdditiveBlending = 2;\n\n/**\n * Represents subtractive blending.\n *\n * @type {number}\n * @constant\n */\nconst SubtractiveBlending = 3;\n\n/**\n * Represents multiply blending.\n *\n * @type {number}\n * @constant\n */\nconst MultiplyBlending = 4;\n\n/**\n * Represents custom blending.\n *\n * @type {number}\n * @constant\n */\nconst CustomBlending = 5;\n\n/**\n * A `source + destination` blending equation.\n *\n * @type {number}\n * @constant\n */\nconst AddEquation = 100;\n\n/**\n * A `source - destination` blending equation.\n *\n * @type {number}\n * @constant\n */\nconst SubtractEquation = 101;\n\n/**\n * A `destination - source` blending equation.\n *\n * @type {number}\n * @constant\n */\nconst ReverseSubtractEquation = 102;\n\n/**\n * A blend equation that uses the minimum of source and destination.\n *\n * @type {number}\n * @constant\n */\nconst MinEquation = 103;\n\n/**\n * A blend equation that uses the maximum of source and destination.\n *\n * @type {number}\n * @constant\n */\nconst MaxEquation = 104;\n\n/**\n * Multiplies all colors by `0`.\n *\n * @type {number}\n * @constant\n */\nconst ZeroFactor = 200;\n\n/**\n * Multiplies all colors by `1`.\n *\n * @type {number}\n * @constant\n */\nconst OneFactor = 201;\n\n/**\n * Multiplies all colors by the source colors.\n *\n * @type {number}\n * @constant\n */\nconst SrcColorFactor = 202;\n\n/**\n * Multiplies all colors by `1` minus each source color.\n *\n * @type {number}\n * @constant\n */\nconst OneMinusSrcColorFactor = 203;\n\n/**\n * Multiplies all colors by the source alpha value.\n *\n * @type {number}\n * @constant\n */\nconst SrcAlphaFactor = 204;\n\n/**\n * Multiplies all colors by 1 minus the source alpha value.\n *\n * @type {number}\n * @constant\n */\nconst OneMinusSrcAlphaFactor = 205;\n\n/**\n * Multiplies all colors by the destination alpha value.\n *\n * @type {number}\n * @constant\n */\nconst DstAlphaFactor = 206;\n\n/**\n * Multiplies all colors by `1` minus the destination alpha value.\n *\n * @type {number}\n * @constant\n */\nconst OneMinusDstAlphaFactor = 207;\n\n/**\n * Multiplies all colors by the destination color.\n *\n * @type {number}\n * @constant\n */\nconst DstColorFactor = 208;\n\n/**\n * Multiplies all colors by `1` minus each destination color.\n *\n * @type {number}\n * @constant\n */\nconst OneMinusDstColorFactor = 209;\n\n/**\n * Multiplies the RGB colors by the smaller of either the source alpha\n * value or the value of `1` minus the destination alpha value. The alpha\n * value is multiplied by `1`.\n *\n * @type {number}\n * @constant\n */\nconst SrcAlphaSaturateFactor = 210;\n\n/**\n * Multiplies all colors by a constant color.\n *\n * @type {number}\n * @constant\n */\nconst ConstantColorFactor = 211;\n\n/**\n * Multiplies all colors by `1` minus a constant color.\n *\n * @type {number}\n * @constant\n */\nconst OneMinusConstantColorFactor = 212;\n\n/**\n * Multiplies all colors by a constant alpha value.\n *\n * @type {number}\n * @constant\n */\nconst ConstantAlphaFactor = 213;\n\n/**\n * Multiplies all colors by 1 minus a constant alpha value.\n *\n * @type {number}\n * @constant\n */\nconst OneMinusConstantAlphaFactor = 214;\n\n/**\n * Never pass.\n *\n * @type {number}\n * @constant\n */\nconst NeverDepth = 0;\n\n/**\n * Always pass.\n *\n * @type {number}\n * @constant\n */\nconst AlwaysDepth = 1;\n\n/**\n * Pass if the incoming value is less than the depth buffer value.\n *\n * @type {number}\n * @constant\n */\nconst LessDepth = 2;\n\n/**\n * Pass if the incoming value is less than or equal to the depth buffer value.\n *\n * @type {number}\n * @constant\n */\nconst LessEqualDepth = 3;\n\n/**\n * Pass if the incoming value equals the depth buffer value.\n *\n * @type {number}\n * @constant\n */\nconst EqualDepth = 4;\n\n/**\n * Pass if the incoming value is greater than or equal to the depth buffer value.\n *\n * @type {number}\n * @constant\n */\nconst GreaterEqualDepth = 5;\n\n/**\n * Pass if the incoming value is greater than the depth buffer value.\n *\n * @type {number}\n * @constant\n */\nconst GreaterDepth = 6;\n\n/**\n * Pass if the incoming value is not equal to the depth buffer value.\n *\n * @type {number}\n * @constant\n */\nconst NotEqualDepth = 7;\n\n/**\n * Multiplies the environment map color with the surface color.\n *\n * @type {number}\n * @constant\n */\nconst MultiplyOperation = 0;\n\n/**\n * Uses reflectivity to blend between the two colors.\n *\n * @type {number}\n * @constant\n */\nconst MixOperation = 1;\n\n/**\n * Adds the two colors.\n *\n * @type {number}\n * @constant\n */\nconst AddOperation = 2;\n\n/**\n * No tone mapping is applied.\n *\n * @type {number}\n * @constant\n */\nconst NoToneMapping = 0;\n\n/**\n * Linear tone mapping.\n *\n * @type {number}\n * @constant\n */\nconst LinearToneMapping = 1;\n\n/**\n * Reinhard tone mapping.\n *\n * @type {number}\n * @constant\n */\nconst ReinhardToneMapping = 2;\n\n/**\n * Cineon tone mapping.\n *\n * @type {number}\n * @constant\n */\nconst CineonToneMapping = 3;\n\n/**\n * ACES Filmic tone mapping.\n *\n * @type {number}\n * @constant\n */\nconst ACESFilmicToneMapping = 4;\n\n/**\n * Custom tone mapping.\n *\n * Expects a custom implementation by modifying shader code of the material's fragment shader.\n *\n * @type {number}\n * @constant\n */\nconst CustomToneMapping = 5;\n\n/**\n * AgX tone mapping.\n *\n * @type {number}\n * @constant\n */\nconst AgXToneMapping = 6;\n\n/**\n * Neutral tone mapping.\n *\n * Implementation based on the Khronos 3D Commerce Group standard tone mapping.\n *\n * @type {number}\n * @constant\n */\nconst NeutralToneMapping = 7;\n\n/**\n * The skinned mesh shares the same world space as the skeleton.\n *\n * @type {string}\n * @constant\n */\nconst AttachedBindMode = 'attached';\n\n/**\n * The skinned mesh does not share the same world space as the skeleton.\n * This is useful when a skeleton is shared across multiple skinned meshes.\n *\n * @type {string}\n * @constant\n */\nconst DetachedBindMode = 'detached';\n\n/**\n * Maps textures using the geometry's UV coordinates.\n *\n * @type {number}\n * @constant\n */\nconst UVMapping = 300;\n\n/**\n * Reflection mapping for cube textures.\n *\n * @type {number}\n * @constant\n */\nconst CubeReflectionMapping = 301;\n\n/**\n * Refraction mapping for cube textures.\n *\n * @type {number}\n * @constant\n */\nconst CubeRefractionMapping = 302;\n\n/**\n * Reflection mapping for equirectangular textures.\n *\n * @type {number}\n * @constant\n */\nconst EquirectangularReflectionMapping = 303;\n\n/**\n * Refraction mapping for equirectangular textures.\n *\n * @type {number}\n * @constant\n */\nconst EquirectangularRefractionMapping = 304;\n\n/**\n * Reflection mapping for PMREM textures.\n *\n * @type {number}\n * @constant\n */\nconst CubeUVReflectionMapping = 306;\n\n/**\n * The texture will simply repeat to infinity.\n *\n * @type {number}\n * @constant\n */\nconst RepeatWrapping = 1000;\n\n/**\n * The last pixel of the texture stretches to the edge of the mesh.\n *\n * @type {number}\n * @constant\n */\nconst ClampToEdgeWrapping = 1001;\n\n/**\n * The texture will repeats to infinity, mirroring on each repeat.\n *\n * @type {number}\n * @constant\n */\nconst MirroredRepeatWrapping = 1002;\n\n/**\n * Returns the value of the texture element that is nearest (in Manhattan distance)\n * to the specified texture coordinates.\n *\n * @type {number}\n * @constant\n */\nconst NearestFilter = 1003;\n\n/**\n * Chooses the mipmap that most closely matches the size of the pixel being textured\n * and uses the `NearestFilter` criterion (the texel nearest to the center of the pixel)\n * to produce a texture value.\n *\n * @type {number}\n * @constant\n */\nconst NearestMipmapNearestFilter = 1004;\nconst NearestMipMapNearestFilter = 1004; // legacy\n\n/**\n * Chooses the two mipmaps that most closely match the size of the pixel being textured and\n * uses the `NearestFilter` criterion to produce a texture value from each mipmap.\n * The final texture value is a weighted average of those two values.\n *\n * @type {number}\n * @constant\n */\nconst NearestMipmapLinearFilter = 1005;\nconst NearestMipMapLinearFilter = 1005; // legacy\n\n/**\n * Returns the weighted average of the four texture elements that are closest to the specified\n * texture coordinates, and can include items wrapped or repeated from other parts of a texture,\n * depending on the values of `wrapS` and `wrapT`, and on the exact mapping.\n *\n * @type {number}\n * @constant\n */\nconst LinearFilter = 1006;\n\n/**\n * Chooses the mipmap that most closely matches the size of the pixel being textured and uses\n * the `LinearFilter` criterion (a weighted average of the four texels that are closest to the\n * center of the pixel) to produce a texture value.\n *\n * @type {number}\n * @constant\n */\nconst LinearMipmapNearestFilter = 1007;\nconst LinearMipMapNearestFilter = 1007; // legacy\n\n/**\n * Chooses the two mipmaps that most closely match the size of the pixel being textured and uses\n * the `LinearFilter` criterion to produce a texture value from each mipmap. The final texture value\n * is a weighted average of those two values.\n *\n * @type {number}\n * @constant\n */\nconst LinearMipmapLinearFilter = 1008;\nconst LinearMipMapLinearFilter = 1008; // legacy\n\n/**\n * An unsigned byte data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst UnsignedByteType = 1009;\n\n/**\n * A byte data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst ByteType = 1010;\n\n/**\n * A short data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst ShortType = 1011;\n\n/**\n * An unsigned short data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst UnsignedShortType = 1012;\n\n/**\n * An int data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst IntType = 1013;\n\n/**\n * An unsigned int data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst UnsignedIntType = 1014;\n\n/**\n * A float data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst FloatType = 1015;\n\n/**\n * A half float data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst HalfFloatType = 1016;\n\n/**\n * An unsigned short 4_4_4_4 (packed) data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst UnsignedShort4444Type = 1017;\n\n/**\n * An unsigned short 5_5_5_1 (packed) data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst UnsignedShort5551Type = 1018;\n\n/**\n * An unsigned int 24_8 data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst UnsignedInt248Type = 1020;\n\n/**\n * An unsigned int 5_9_9_9 (packed) data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst UnsignedInt5999Type = 35902;\n\n/**\n * An unsigned int 10_11_11 (packed) data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst UnsignedInt101111Type = 35899;\n\n/**\n * Discards the red, green and blue components and reads just the alpha component.\n *\n * @type {number}\n * @constant\n */\nconst AlphaFormat = 1021;\n\n/**\n * Discards the alpha component and reads the red, green and blue component.\n *\n * @type {number}\n * @constant\n */\nconst RGBFormat = 1022;\n\n/**\n * Reads the red, green, blue and alpha components.\n *\n * @type {number}\n * @constant\n */\nconst RGBAFormat = 1023;\n\n/**\n * Reads each element as a single depth value, converts it to floating point, and clamps to the range `[0,1]`.\n *\n * @type {number}\n * @constant\n */\nconst DepthFormat = 1026;\n\n/**\n * Reads each element is a pair of depth and stencil values. The depth component of the pair is interpreted as\n * in `DepthFormat`. The stencil component is interpreted based on the depth + stencil internal format.\n *\n * @type {number}\n * @constant\n */\nconst DepthStencilFormat = 1027;\n\n/**\n * Discards the green, blue and alpha components and reads just the red component.\n *\n * @type {number}\n * @constant\n */\nconst RedFormat = 1028;\n\n/**\n * Discards the green, blue and alpha components and reads just the red component. The texels are read as integers instead of floating point.\n *\n * @type {number}\n * @constant\n */\nconst RedIntegerFormat = 1029;\n\n/**\n * Discards the alpha, and blue components and reads the red, and green components.\n *\n * @type {number}\n * @constant\n */\nconst RGFormat = 1030;\n\n/**\n * Discards the alpha, and blue components and reads the red, and green components. The texels are read as integers instead of floating point.\n *\n * @type {number}\n * @constant\n */\nconst RGIntegerFormat = 1031;\n\n/**\n * Discards the alpha component and reads the red, green and blue component. The texels are read as integers instead of floating point.\n *\n * @type {number}\n * @constant\n */\nconst RGBIntegerFormat = 1032;\n\n/**\n * Reads the red, green, blue and alpha components. The texels are read as integers instead of floating point.\n *\n * @type {number}\n * @constant\n */\nconst RGBAIntegerFormat = 1033;\n\n/**\n * A DXT1-compressed image in an RGB image format.\n *\n * @type {number}\n * @constant\n */\nconst RGB_S3TC_DXT1_Format = 33776;\n\n/**\n * A DXT1-compressed image in an RGB image format with a simple on/off alpha value.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_S3TC_DXT1_Format = 33777;\n\n/**\n * A DXT3-compressed image in an RGBA image format. Compared to a 32-bit RGBA texture, it offers 4:1 compression.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_S3TC_DXT3_Format = 33778;\n\n/**\n * A DXT5-compressed image in an RGBA image format. It also provides a 4:1 compression, but differs to the DXT3\n * compression in how the alpha compression is done.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_S3TC_DXT5_Format = 33779;\n\n/**\n * PVRTC RGB compression in 4-bit mode. One block for each 4×4 pixels.\n *\n * @type {number}\n * @constant\n */\nconst RGB_PVRTC_4BPPV1_Format = 35840;\n\n/**\n * PVRTC RGB compression in 2-bit mode. One block for each 8×4 pixels.\n *\n * @type {number}\n * @constant\n */\nconst RGB_PVRTC_2BPPV1_Format = 35841;\n\n/**\n * PVRTC RGBA compression in 4-bit mode. One block for each 4×4 pixels.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_PVRTC_4BPPV1_Format = 35842;\n\n/**\n * PVRTC RGBA compression in 2-bit mode. One block for each 8×4 pixels.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_PVRTC_2BPPV1_Format = 35843;\n\n/**\n * ETC1 RGB format.\n *\n * @type {number}\n * @constant\n */\nconst RGB_ETC1_Format = 36196;\n\n/**\n * ETC2 RGB format.\n *\n * @type {number}\n * @constant\n */\nconst RGB_ETC2_Format = 37492;\n\n/**\n * ETC2 RGBA format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ETC2_EAC_Format = 37496;\n\n/**\n * ASTC RGBA 4x4 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_4x4_Format = 37808;\n\n/**\n * ASTC RGBA 5x4 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_5x4_Format = 37809;\n\n/**\n * ASTC RGBA 5x5 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_5x5_Format = 37810;\n\n/**\n * ASTC RGBA 6x5 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_6x5_Format = 37811;\n\n/**\n * ASTC RGBA 6x6 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_6x6_Format = 37812;\n\n/**\n * ASTC RGBA 8x5 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_8x5_Format = 37813;\n\n/**\n * ASTC RGBA 8x6 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_8x6_Format = 37814;\n\n/**\n * ASTC RGBA 8x8 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_8x8_Format = 37815;\n\n/**\n * ASTC RGBA 10x5 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_10x5_Format = 37816;\n\n/**\n * ASTC RGBA 10x6 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_10x6_Format = 37817;\n\n/**\n * ASTC RGBA 10x8 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_10x8_Format = 37818;\n\n/**\n * ASTC RGBA 10x10 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_10x10_Format = 37819;\n\n/**\n * ASTC RGBA 12x10 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_12x10_Format = 37820;\n\n/**\n * ASTC RGBA 12x12 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_12x12_Format = 37821;\n\n/**\n * BPTC RGBA format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_BPTC_Format = 36492;\n\n/**\n * BPTC Signed RGB format.\n *\n * @type {number}\n * @constant\n */\nconst RGB_BPTC_SIGNED_Format = 36494;\n\n/**\n * BPTC Unsigned RGB format.\n *\n * @type {number}\n * @constant\n */\nconst RGB_BPTC_UNSIGNED_Format = 36495;\n\n/**\n * RGTC1 Red format.\n *\n * @type {number}\n * @constant\n */\nconst RED_RGTC1_Format = 36283;\n\n/**\n * RGTC1 Signed Red format.\n *\n * @type {number}\n * @constant\n */\nconst SIGNED_RED_RGTC1_Format = 36284;\n\n/**\n * RGTC2 Red Green format.\n *\n * @type {number}\n * @constant\n */\nconst RED_GREEN_RGTC2_Format = 36285;\n\n/**\n * RGTC2 Signed Red Green format.\n *\n * @type {number}\n * @constant\n */\nconst SIGNED_RED_GREEN_RGTC2_Format = 36286;\n\n/**\n * Animations are played once.\n *\n * @type {number}\n * @constant\n */\nconst LoopOnce = 2200;\n\n/**\n * Animations are played with a chosen number of repetitions, each time jumping from\n * the end of the clip directly to its beginning.\n *\n * @type {number}\n * @constant\n */\nconst LoopRepeat = 2201;\n\n/**\n * Animations are played with a chosen number of repetitions, alternately playing forward\n * and backward.\n *\n * @type {number}\n * @constant\n */\nconst LoopPingPong = 2202;\n\n/**\n * Discrete interpolation mode for keyframe tracks.\n *\n * @type {number}\n * @constant\n */\nconst InterpolateDiscrete = 2300;\n\n/**\n * Linear interpolation mode for keyframe tracks.\n *\n * @type {number}\n * @constant\n */\nconst InterpolateLinear = 2301;\n\n/**\n * Smooth interpolation mode for keyframe tracks.\n *\n * @type {number}\n * @constant\n */\nconst InterpolateSmooth = 2302;\n\n/**\n * Zero curvature ending for animations.\n *\n * @type {number}\n * @constant\n */\nconst ZeroCurvatureEnding = 2400;\n\n/**\n * Zero slope ending for animations.\n *\n * @type {number}\n * @constant\n */\nconst ZeroSlopeEnding = 2401;\n\n/**\n * Wrap around ending for animations.\n *\n * @type {number}\n * @constant\n */\nconst WrapAroundEnding = 2402;\n\n/**\n * Default animation blend mode.\n *\n * @type {number}\n * @constant\n */\nconst NormalAnimationBlendMode = 2500;\n\n/**\n * Additive animation blend mode. Can be used to layer motions on top of\n * each other to build complex performances from smaller re-usable assets.\n *\n * @type {number}\n * @constant\n */\nconst AdditiveAnimationBlendMode = 2501;\n\n/**\n * For every three vertices draw a single triangle.\n *\n * @type {number}\n * @constant\n */\nconst TrianglesDrawMode = 0;\n\n/**\n * For each vertex draw a triangle from the last three vertices.\n *\n * @type {number}\n * @constant\n */\nconst TriangleStripDrawMode = 1;\n\n/**\n * For each vertex draw a triangle from the first vertex and the last two vertices.\n *\n * @type {number}\n * @constant\n */\nconst TriangleFanDrawMode = 2;\n\n/**\n * Basic depth packing.\n *\n * @type {number}\n * @constant\n */\nconst BasicDepthPacking = 3200;\n\n/**\n * A depth value is packed into 32 bit RGBA.\n *\n * @type {number}\n * @constant\n */\nconst RGBADepthPacking = 3201;\n\n/**\n * A depth value is packed into 24 bit RGB.\n *\n * @type {number}\n * @constant\n */\nconst RGBDepthPacking = 3202;\n\n/**\n * A depth value is packed into 16 bit RG.\n *\n * @type {number}\n * @constant\n */\nconst RGDepthPacking = 3203;\n\n/**\n * Normal information is relative to the underlying surface.\n *\n * @type {number}\n * @constant\n */\nconst TangentSpaceNormalMap = 0;\n\n/**\n * Normal information is relative to the object orientation.\n *\n * @type {number}\n * @constant\n */\nconst ObjectSpaceNormalMap = 1;\n\n// Color space string identifiers, matching CSS Color Module Level 4 and WebGPU names where available.\n\n/**\n * No color space.\n *\n * @type {string}\n * @constant\n */\nconst NoColorSpace = '';\n\n/**\n * sRGB color space.\n *\n * @type {string}\n * @constant\n */\nconst SRGBColorSpace = 'srgb';\n\n/**\n * sRGB-linear color space.\n *\n * @type {string}\n * @constant\n */\nconst LinearSRGBColorSpace = 'srgb-linear';\n\n/**\n * Linear transfer function.\n *\n * @type {string}\n * @constant\n */\nconst LinearTransfer = 'linear';\n\n/**\n * sRGB transfer function.\n *\n * @type {string}\n * @constant\n */\nconst SRGBTransfer = 'srgb';\n\n/**\n * Sets the stencil buffer value to `0`.\n *\n * @type {number}\n * @constant\n */\nconst ZeroStencilOp = 0;\n\n/**\n * Keeps the current value.\n *\n * @type {number}\n * @constant\n */\nconst KeepStencilOp = 7680;\n\n/**\n * Sets the stencil buffer value to the specified reference value.\n *\n * @type {number}\n * @constant\n */\nconst ReplaceStencilOp = 7681;\n\n/**\n * Increments the current stencil buffer value. Clamps to the maximum representable unsigned value.\n *\n * @type {number}\n * @constant\n */\nconst IncrementStencilOp = 7682;\n\n/**\n * Decrements the current stencil buffer value. Clamps to `0`.\n *\n * @type {number}\n * @constant\n */\nconst DecrementStencilOp = 7683;\n\n/**\n * Increments the current stencil buffer value. Wraps stencil buffer value to zero when incrementing\n * the maximum representable unsigned value.\n *\n * @type {number}\n * @constant\n */\nconst IncrementWrapStencilOp = 34055;\n\n/**\n * Decrements the current stencil buffer value. Wraps stencil buffer value to the maximum representable\n * unsigned value when decrementing a stencil buffer value of `0`.\n *\n * @type {number}\n * @constant\n */\nconst DecrementWrapStencilOp = 34056;\n\n/**\n * Inverts the current stencil buffer value bitwise.\n *\n * @type {number}\n * @constant\n */\nconst InvertStencilOp = 5386;\n\n/**\n * Will never return true.\n *\n * @type {number}\n * @constant\n */\nconst NeverStencilFunc = 512;\n\n/**\n * Will return true if the stencil reference value is less than the current stencil value.\n *\n * @type {number}\n * @constant\n */\nconst LessStencilFunc = 513;\n\n/**\n * Will return true if the stencil reference value is equal to the current stencil value.\n *\n * @type {number}\n * @constant\n */\nconst EqualStencilFunc = 514;\n\n/**\n * Will return true if the stencil reference value is less than or equal to the current stencil value.\n *\n * @type {number}\n * @constant\n */\nconst LessEqualStencilFunc = 515;\n\n/**\n * Will return true if the stencil reference value is greater than the current stencil value.\n *\n * @type {number}\n * @constant\n */\nconst GreaterStencilFunc = 516;\n\n/**\n * Will return true if the stencil reference value is not equal to the current stencil value.\n *\n * @type {number}\n * @constant\n */\nconst NotEqualStencilFunc = 517;\n\n/**\n * Will return true if the stencil reference value is greater than or equal to the current stencil value.\n *\n * @type {number}\n * @constant\n */\nconst GreaterEqualStencilFunc = 518;\n\n/**\n * Will always return true.\n *\n * @type {number}\n * @constant\n */\nconst AlwaysStencilFunc = 519;\n\n/**\n * Never pass.\n *\n * @type {number}\n * @constant\n */\nconst NeverCompare = 512;\n\n/**\n * Pass if the incoming value is less than the texture value.\n *\n * @type {number}\n * @constant\n */\nconst LessCompare = 513;\n\n/**\n * Pass if the incoming value equals the texture value.\n *\n * @type {number}\n * @constant\n */\nconst EqualCompare = 514;\n\n/**\n * Pass if the incoming value is less than or equal to the texture value.\n *\n * @type {number}\n * @constant\n */\nconst LessEqualCompare = 515;\n\n/**\n * Pass if the incoming value is greater than the texture value.\n *\n * @type {number}\n * @constant\n */\nconst GreaterCompare = 516;\n\n/**\n * Pass if the incoming value is not equal to the texture value.\n *\n * @type {number}\n * @constant\n */\nconst NotEqualCompare = 517;\n\n/**\n * Pass if the incoming value is greater than or equal to the texture value.\n *\n * @type {number}\n * @constant\n */\nconst GreaterEqualCompare = 518;\n\n/**\n * Always pass.\n *\n * @type {number}\n * @constant\n */\nconst AlwaysCompare = 519;\n\n/**\n * The contents are intended to be specified once by the application, and used many\n * times as the source for drawing and image specification commands.\n *\n * @type {number}\n * @constant\n */\nconst StaticDrawUsage = 35044;\n\n/**\n * The contents are intended to be respecified repeatedly by the application, and\n * used many times as the source for drawing and image specification commands.\n *\n * @type {number}\n * @constant\n */\nconst DynamicDrawUsage = 35048;\n\n/**\n * The contents are intended to be specified once by the application, and used at most\n * a few times as the source for drawing and image specification commands.\n *\n * @type {number}\n * @constant\n */\nconst StreamDrawUsage = 35040;\n\n/**\n * The contents are intended to be specified once by reading data from the 3D API, and queried\n * many times by the application.\n *\n * @type {number}\n * @constant\n */\nconst StaticReadUsage = 35045;\n\n/**\n * The contents are intended to be respecified repeatedly by reading data from the 3D API, and queried\n * many times by the application.\n *\n * @type {number}\n * @constant\n */\nconst DynamicReadUsage = 35049;\n\n/**\n * The contents are intended to be specified once by reading data from the 3D API, and queried at most\n * a few times by the application\n *\n * @type {number}\n * @constant\n */\nconst StreamReadUsage = 35041;\n\n/**\n * The contents are intended to be specified once by reading data from the 3D API, and used many times as\n * the source for WebGL drawing and image specification commands.\n *\n * @type {number}\n * @constant\n */\nconst StaticCopyUsage = 35046;\n\n/**\n * The contents are intended to be respecified repeatedly by reading data from the 3D API, and used many times\n * as the source for WebGL drawing and image specification commands.\n *\n * @type {number}\n * @constant\n */\nconst DynamicCopyUsage = 35050;\n\n/**\n * The contents are intended to be specified once by reading data from the 3D API, and used at most a few times\n * as the source for WebGL drawing and image specification commands.\n *\n * @type {number}\n * @constant\n */\nconst StreamCopyUsage = 35042;\n\n/**\n * GLSL 1 shader code.\n *\n * @type {string}\n * @constant\n */\nconst GLSL1 = '100';\n\n/**\n * GLSL 3 shader code.\n *\n * @type {string}\n * @constant\n */\nconst GLSL3 = '300 es';\n\n/**\n * WebGL coordinate system.\n *\n * @type {number}\n * @constant\n */\nconst WebGLCoordinateSystem = 2000;\n\n/**\n * WebGPU coordinate system.\n *\n * @type {number}\n * @constant\n */\nconst WebGPUCoordinateSystem = 2001;\n\n/**\n * Represents the different timestamp query types.\n *\n * @type {ConstantsTimestampQuery}\n * @constant\n */\nconst TimestampQuery = {\n\tCOMPUTE: 'compute',\n\tRENDER: 'render'\n};\n\n/**\n * Represents mouse buttons and interaction types in context of controls.\n *\n * @type {ConstantsInterpolationSamplingType}\n * @constant\n */\nconst InterpolationSamplingType = {\n\tPERSPECTIVE: 'perspective',\n\tLINEAR: 'linear',\n\tFLAT: 'flat'\n};\n\n/**\n * Represents the different interpolation sampling modes.\n *\n * @type {ConstantsInterpolationSamplingMode}\n * @constant\n */\nconst InterpolationSamplingMode = {\n\tNORMAL: 'normal',\n\tCENTROID: 'centroid',\n\tSAMPLE: 'sample',\n\tFIRST: 'first',\n\tEITHER: 'either'\n};\n\n/**\n * This type represents mouse buttons and interaction types in context of controls.\n *\n * @typedef {Object} ConstantsMouse\n * @property {number} MIDDLE - The left mouse button.\n * @property {number} LEFT - The middle mouse button.\n * @property {number} RIGHT - The right mouse button.\n * @property {number} ROTATE - A rotate interaction.\n * @property {number} DOLLY - A dolly interaction.\n * @property {number} PAN - A pan interaction.\n **/\n\n/**\n * This type represents touch interaction types in context of controls.\n *\n * @typedef {Object} ConstantsTouch\n * @property {number} ROTATE - A rotate interaction.\n * @property {number} PAN - A pan interaction.\n * @property {number} DOLLY_PAN - The dolly-pan interaction.\n * @property {number} DOLLY_ROTATE - A dolly-rotate interaction.\n **/\n\n/**\n * This type represents the different timestamp query types.\n *\n * @typedef {Object} ConstantsTimestampQuery\n * @property {string} COMPUTE - A `compute` timestamp query.\n * @property {string} RENDER - A `render` timestamp query.\n **/\n\n/**\n * Represents the different interpolation sampling types.\n *\n * @typedef {Object} ConstantsInterpolationSamplingType\n * @property {string} PERSPECTIVE - Perspective-correct interpolation.\n * @property {string} LINEAR - Linear interpolation.\n * @property {string} FLAT - Flat interpolation.\n */\n\n/**\n * Represents the different interpolation sampling modes.\n *\n * @typedef {Object} ConstantsInterpolationSamplingMode\n * @property {string} NORMAL - Normal sampling mode.\n * @property {string} CENTROID - Centroid sampling mode.\n * @property {string} SAMPLE - Sample-specific sampling mode.\n * @property {string} FIRST - Flat interpolation using the first vertex.\n * @property {string} EITHER - Flat interpolation using either vertex.\n */\n\nfunction arrayNeedsUint32( array ) {\n\n\t// assumes larger values usually on last\n\n\tfor ( let i = array.length - 1; i >= 0; -- i ) {\n\n\t\tif ( array[ i ] >= 65535 ) return true; // account for PRIMITIVE_RESTART_FIXED_INDEX, #24565\n\n\t}\n\n\treturn false;\n\n}\n\nconst TYPED_ARRAYS = {\n\tInt8Array: Int8Array,\n\tUint8Array: Uint8Array,\n\tUint8ClampedArray: Uint8ClampedArray,\n\tInt16Array: Int16Array,\n\tUint16Array: Uint16Array,\n\tInt32Array: Int32Array,\n\tUint32Array: Uint32Array,\n\tFloat32Array: Float32Array,\n\tFloat64Array: Float64Array\n};\n\nfunction getTypedArray( type, buffer ) {\n\n\treturn new TYPED_ARRAYS[ type ]( buffer );\n\n}\n\nfunction createElementNS( name ) {\n\n\treturn document.createElementNS( 'http://www.w3.org/1999/xhtml', name );\n\n}\n\nfunction createCanvasElement() {\n\n\tconst canvas = createElementNS( 'canvas' );\n\tcanvas.style.display = 'block';\n\treturn canvas;\n\n}\n\nconst _cache = {};\n\nlet _setConsoleFunction = null;\n\nfunction setConsoleFunction( fn ) {\n\n\t_setConsoleFunction = fn;\n\n}\n\nfunction getConsoleFunction() {\n\n\treturn _setConsoleFunction;\n\n}\n\nfunction log( ...params ) {\n\n\tconst message = 'THREE.' + params.shift();\n\n\tif ( _setConsoleFunction ) {\n\n\t\t_setConsoleFunction( 'log', message, ...params );\n\n\t} else {\n\n\t\tconsole.log( message, ...params );\n\n\t}\n\n}\n\nfunction warn( ...params ) {\n\n\tconst message = 'THREE.' + params.shift();\n\n\tif ( _setConsoleFunction ) {\n\n\t\t_setConsoleFunction( 'warn', message, ...params );\n\n\t} else {\n\n\t\tconsole.warn( message, ...params );\n\n\t}\n\n}\n\nfunction error( ...params ) {\n\n\tconst message = 'THREE.' + params.shift();\n\n\tif ( _setConsoleFunction ) {\n\n\t\t_setConsoleFunction( 'error', message, ...params );\n\n\t} else {\n\n\t\tconsole.error( message, ...params );\n\n\t}\n\n}\n\nfunction warnOnce( ...params ) {\n\n\tconst message = params.join( ' ' );\n\n\tif ( message in _cache ) return;\n\n\t_cache[ message ] = true;\n\n\twarn( ...params );\n\n}\n\nfunction probeAsync( gl, sync, interval ) {\n\n\treturn new Promise( function ( resolve, reject ) {\n\n\t\tfunction probe() {\n\n\t\t\tswitch ( gl.clientWaitSync( sync, gl.SYNC_FLUSH_COMMANDS_BIT, 0 ) ) {\n\n\t\t\t\tcase gl.WAIT_FAILED:\n\t\t\t\t\treject();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase gl.TIMEOUT_EXPIRED:\n\t\t\t\t\tsetTimeout( probe, interval );\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tresolve();\n\n\t\t\t}\n\n\t\t}\n\n\t\tsetTimeout( probe, interval );\n\n\t} );\n\n}\n\n/**\n * This modules allows to dispatch event objects on custom JavaScript objects.\n *\n * Main repository: [eventdispatcher.js](https://github.com/mrdoob/eventdispatcher.js/)\n *\n * Code Example:\n * ```js\n * class Car extends EventDispatcher {\n * \tstart() {\n *\t\tthis.dispatchEvent( { type: 'start', message: 'vroom vroom!' } );\n *\t}\n *};\n *\n * // Using events with the custom object\n * const car = new Car();\n * car.addEventListener( 'start', function ( event ) {\n * \talert( event.message );\n * } );\n *\n * car.start();\n * ```\n */\nclass EventDispatcher {\n\n\t/**\n\t * Adds the given event listener to the given event type.\n\t *\n\t * @param {string} type - The type of event to listen to.\n\t * @param {Function} listener - The function that gets called when the event is fired.\n\t */\n\taddEventListener( type, listener ) {\n\n\t\tif ( this._listeners === undefined ) this._listeners = {};\n\n\t\tconst listeners = this._listeners;\n\n\t\tif ( listeners[ type ] === undefined ) {\n\n\t\t\tlisteners[ type ] = [];\n\n\t\t}\n\n\t\tif ( listeners[ type ].indexOf( listener ) === -1 ) {\n\n\t\t\tlisteners[ type ].push( listener );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns `true` if the given event listener has been added to the given event type.\n\t *\n\t * @param {string} type - The type of event.\n\t * @param {Function} listener - The listener to check.\n\t * @return {boolean} Whether the given event listener has been added to the given event type.\n\t */\n\thasEventListener( type, listener ) {\n\n\t\tconst listeners = this._listeners;\n\n\t\tif ( listeners === undefined ) return false;\n\n\t\treturn listeners[ type ] !== undefined && listeners[ type ].indexOf( listener ) !== -1;\n\n\t}\n\n\t/**\n\t * Removes the given event listener from the given event type.\n\t *\n\t * @param {string} type - The type of event.\n\t * @param {Function} listener - The listener to remove.\n\t */\n\tremoveEventListener( type, listener ) {\n\n\t\tconst listeners = this._listeners;\n\n\t\tif ( listeners === undefined ) return;\n\n\t\tconst listenerArray = listeners[ type ];\n\n\t\tif ( listenerArray !== undefined ) {\n\n\t\t\tconst index = listenerArray.indexOf( listener );\n\n\t\t\tif ( index !== -1 ) {\n\n\t\t\t\tlistenerArray.splice( index, 1 );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Dispatches an event object.\n\t *\n\t * @param {Object} event - The event that gets fired.\n\t */\n\tdispatchEvent( event ) {\n\n\t\tconst listeners = this._listeners;\n\n\t\tif ( listeners === undefined ) return;\n\n\t\tconst listenerArray = listeners[ event.type ];\n\n\t\tif ( listenerArray !== undefined ) {\n\n\t\t\tevent.target = this;\n\n\t\t\t// Make a copy, in case listeners are removed while iterating.\n\t\t\tconst array = listenerArray.slice( 0 );\n\n\t\t\tfor ( let i = 0, l = array.length; i < l; i ++ ) {\n\n\t\t\t\tarray[ i ].call( this, event );\n\n\t\t\t}\n\n\t\t\tevent.target = null;\n\n\t\t}\n\n\t}\n\n}\n\nconst _lut = [ '00', '01', '02', '03', '04', '05', '06', '07', '08', '09', '0a', '0b', '0c', '0d', '0e', '0f', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '1a', '1b', '1c', '1d', '1e', '1f', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '2a', '2b', '2c', '2d', '2e', '2f', '30', '31', '32', '33', '34', '35', '36', '37', '38', '39', '3a', '3b', '3c', '3d', '3e', '3f', '40', '41', '42', '43', '44', '45', '46', '47', '48', '49', '4a', '4b', '4c', '4d', '4e', '4f', '50', '51', '52', '53', '54', '55', '56', '57', '58', '59', '5a', '5b', '5c', '5d', '5e', '5f', '60', '61', '62', '63', '64', '65', '66', '67', '68', '69', '6a', '6b', '6c', '6d', '6e', '6f', '70', '71', '72', '73', '74', '75', '76', '77', '78', '79', '7a', '7b', '7c', '7d', '7e', '7f', '80', '81', '82', '83', '84', '85', '86', '87', '88', '89', '8a', '8b', '8c', '8d', '8e', '8f', '90', '91', '92', '93', '94', '95', '96', '97', '98', '99', '9a', '9b', '9c', '9d', '9e', '9f', 'a0', 'a1', 'a2', 'a3', 'a4', 'a5', 'a6', 'a7', 'a8', 'a9', 'aa', 'ab', 'ac', 'ad', 'ae', 'af', 'b0', 'b1', 'b2', 'b3', 'b4', 'b5', 'b6', 'b7', 'b8', 'b9', 'ba', 'bb', 'bc', 'bd', 'be', 'bf', 'c0', 'c1', 'c2', 'c3', 'c4', 'c5', 'c6', 'c7', 'c8', 'c9', 'ca', 'cb', 'cc', 'cd', 'ce', 'cf', 'd0', 'd1', 'd2', 'd3', 'd4', 'd5', 'd6', 'd7', 'd8', 'd9', 'da', 'db', 'dc', 'dd', 'de', 'df', 'e0', 'e1', 'e2', 'e3', 'e4', 'e5', 'e6', 'e7', 'e8', 'e9', 'ea', 'eb', 'ec', 'ed', 'ee', 'ef', 'f0', 'f1', 'f2', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9', 'fa', 'fb', 'fc', 'fd', 'fe', 'ff' ];\n\nlet _seed = 1234567;\n\n\nconst DEG2RAD = Math.PI / 180;\nconst RAD2DEG = 180 / Math.PI;\n\n/**\n * Generate a [UUID](https://en.wikipedia.org/wiki/Universally_unique_identifier)\n * (universally unique identifier).\n *\n * @return {string} The UUID.\n */\nfunction generateUUID() {\n\n\t// http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/21963136#21963136\n\n\tconst d0 = Math.random() * 0xffffffff | 0;\n\tconst d1 = Math.random() * 0xffffffff | 0;\n\tconst d2 = Math.random() * 0xffffffff | 0;\n\tconst d3 = Math.random() * 0xffffffff | 0;\n\tconst uuid = _lut[ d0 & 0xff ] + _lut[ d0 >> 8 & 0xff ] + _lut[ d0 >> 16 & 0xff ] + _lut[ d0 >> 24 & 0xff ] + '-' +\n\t\t\t_lut[ d1 & 0xff ] + _lut[ d1 >> 8 & 0xff ] + '-' + _lut[ d1 >> 16 & 0x0f | 0x40 ] + _lut[ d1 >> 24 & 0xff ] + '-' +\n\t\t\t_lut[ d2 & 0x3f | 0x80 ] + _lut[ d2 >> 8 & 0xff ] + '-' + _lut[ d2 >> 16 & 0xff ] + _lut[ d2 >> 24 & 0xff ] +\n\t\t\t_lut[ d3 & 0xff ] + _lut[ d3 >> 8 & 0xff ] + _lut[ d3 >> 16 & 0xff ] + _lut[ d3 >> 24 & 0xff ];\n\n\t// .toLowerCase() here flattens concatenated strings to save heap memory space.\n\treturn uuid.toLowerCase();\n\n}\n\n/**\n * Clamps the given value between min and max.\n *\n * @param {number} value - The value to clamp.\n * @param {number} min - The min value.\n * @param {number} max - The max value.\n * @return {number} The clamped value.\n */\nfunction clamp( value, min, max ) {\n\n\treturn Math.max( min, Math.min( max, value ) );\n\n}\n\n/**\n * Computes the Euclidean modulo of the given parameters that\n * is `( ( n % m ) + m ) % m`.\n *\n * @param {number} n - The first parameter.\n * @param {number} m - The second parameter.\n * @return {number} The Euclidean modulo.\n */\nfunction euclideanModulo( n, m ) {\n\n\t// https://en.wikipedia.org/wiki/Modulo_operation\n\n\treturn ( ( n % m ) + m ) % m;\n\n}\n\n/**\n * Performs a linear mapping from range `<a1, a2>` to range `<b1, b2>`\n * for the given value.\n *\n * @param {number} x - The value to be mapped.\n * @param {number} a1 - Minimum value for range A.\n * @param {number} a2 - Maximum value for range A.\n * @param {number} b1 - Minimum value for range B.\n * @param {number} b2 - Maximum value for range B.\n * @return {number} The mapped value.\n */\nfunction mapLinear( x, a1, a2, b1, b2 ) {\n\n\treturn b1 + ( x - a1 ) * ( b2 - b1 ) / ( a2 - a1 );\n\n}\n\n/**\n * Returns the percentage in the closed interval `[0, 1]` of the given value\n * between the start and end point.\n *\n * @param {number} x - The start point\n * @param {number} y - The end point.\n * @param {number} value - A value between start and end.\n * @return {number} The interpolation factor.\n */\nfunction inverseLerp( x, y, value ) {\n\n\t// https://www.gamedev.net/tutorials/programming/general-and-gameplay-programming/inverse-lerp-a-super-useful-yet-often-overlooked-function-r5230/\n\n\tif ( x !== y ) {\n\n\t\treturn ( value - x ) / ( y - x );\n\n\t} else {\n\n\t\treturn 0;\n\n\t}\n\n}\n\n/**\n * Returns a value linearly interpolated from two known points based on the given interval -\n * `t = 0` will return `x` and `t = 1` will return `y`.\n *\n * @param {number} x - The start point\n * @param {number} y - The end point.\n * @param {number} t - The interpolation factor in the closed interval `[0, 1]`.\n * @return {number} The interpolated value.\n */\nfunction lerp( x, y, t ) {\n\n\treturn ( 1 - t ) * x + t * y;\n\n}\n\n/**\n * Smoothly interpolate a number from `x` to `y` in  a spring-like manner using a delta\n * time to maintain frame rate independent movement. For details, see\n * [Frame rate independent damping using lerp](http://www.rorydriscoll.com/2016/03/07/frame-rate-independent-damping-using-lerp/).\n *\n * @param {number} x - The current point.\n * @param {number} y - The target point.\n * @param {number} lambda - A higher lambda value will make the movement more sudden,\n * and a lower value will make the movement more gradual.\n * @param {number} dt - Delta time in seconds.\n * @return {number} The interpolated value.\n */\nfunction damp( x, y, lambda, dt ) {\n\n\treturn lerp( x, y, 1 - Math.exp( - lambda * dt ) );\n\n}\n\n/**\n * Returns a value that alternates between `0` and the given `length` parameter.\n *\n * @param {number} x - The value to pingpong.\n * @param {number} [length=1] - The positive value the function will pingpong to.\n * @return {number} The alternated value.\n */\nfunction pingpong( x, length = 1 ) {\n\n\t// https://www.desmos.com/calculator/vcsjnyz7x4\n\n\treturn length - Math.abs( euclideanModulo( x, length * 2 ) - length );\n\n}\n\n/**\n * Returns a value in the range `[0,1]` that represents the percentage that `x` has\n * moved between `min` and `max`, but smoothed or slowed down the closer `x` is to\n * the `min` and `max`.\n *\n * See [Smoothstep](http://en.wikipedia.org/wiki/Smoothstep) for more details.\n *\n * @param {number} x - The value to evaluate based on its position between min and max.\n * @param {number} min - The min value. Any x value below min will be `0`.\n * @param {number} max - The max value. Any x value above max will be `1`.\n * @return {number} The alternated value.\n */\nfunction smoothstep( x, min, max ) {\n\n\tif ( x <= min ) return 0;\n\tif ( x >= max ) return 1;\n\n\tx = ( x - min ) / ( max - min );\n\n\treturn x * x * ( 3 - 2 * x );\n\n}\n\n/**\n * A [variation on smoothstep](https://en.wikipedia.org/wiki/Smoothstep#Variations)\n * that has zero 1st and 2nd order derivatives at x=0 and x=1.\n *\n * @param {number} x - The value to evaluate based on its position between min and max.\n * @param {number} min - The min value. Any x value below min will be `0`.\n * @param {number} max - The max value. Any x value above max will be `1`.\n * @return {number} The alternated value.\n */\nfunction smootherstep( x, min, max ) {\n\n\tif ( x <= min ) return 0;\n\tif ( x >= max ) return 1;\n\n\tx = ( x - min ) / ( max - min );\n\n\treturn x * x * x * ( x * ( x * 6 - 15 ) + 10 );\n\n}\n\n/**\n * Returns a random integer from `<low, high>` interval.\n *\n * @param {number} low - The lower value boundary.\n * @param {number} high - The upper value boundary\n * @return {number} A random integer.\n */\nfunction randInt( low, high ) {\n\n\treturn low + Math.floor( Math.random() * ( high - low + 1 ) );\n\n}\n\n/**\n * Returns a random float from `<low, high>` interval.\n *\n * @param {number} low - The lower value boundary.\n * @param {number} high - The upper value boundary\n * @return {number} A random float.\n */\nfunction randFloat( low, high ) {\n\n\treturn low + Math.random() * ( high - low );\n\n}\n\n/**\n * Returns a random integer from `<-range/2, range/2>` interval.\n *\n * @param {number} range - Defines the value range.\n * @return {number} A random float.\n */\nfunction randFloatSpread( range ) {\n\n\treturn range * ( 0.5 - Math.random() );\n\n}\n\n/**\n * Returns a deterministic pseudo-random float in the interval `[0, 1]`.\n *\n * @param {number} [s] - The integer seed.\n * @return {number} A random float.\n */\nfunction seededRandom( s ) {\n\n\tif ( s !== undefined ) _seed = s;\n\n\t// Mulberry32 generator\n\n\tlet t = _seed += 0x6D2B79F5;\n\n\tt = Math.imul( t ^ t >>> 15, t | 1 );\n\n\tt ^= t + Math.imul( t ^ t >>> 7, t | 61 );\n\n\treturn ( ( t ^ t >>> 14 ) >>> 0 ) / 4294967296;\n\n}\n\n/**\n * Converts degrees to radians.\n *\n * @param {number} degrees - A value in degrees.\n * @return {number} The converted value in radians.\n */\nfunction degToRad( degrees ) {\n\n\treturn degrees * DEG2RAD;\n\n}\n\n/**\n * Converts radians to degrees.\n *\n * @param {number} radians - A value in radians.\n * @return {number} The converted value in degrees.\n */\nfunction radToDeg( radians ) {\n\n\treturn radians * RAD2DEG;\n\n}\n\n/**\n * Returns `true` if the given number is a power of two.\n *\n * @param {number} value - The value to check.\n * @return {boolean} Whether the given number is a power of two or not.\n */\nfunction isPowerOfTwo( value ) {\n\n\treturn ( value & ( value - 1 ) ) === 0 && value !== 0;\n\n}\n\n/**\n * Returns the smallest power of two that is greater than or equal to the given number.\n *\n * @param {number} value - The value to find a POT for.\n * @return {number} The smallest power of two that is greater than or equal to the given number.\n */\nfunction ceilPowerOfTwo( value ) {\n\n\treturn Math.pow( 2, Math.ceil( Math.log( value ) / Math.LN2 ) );\n\n}\n\n/**\n * Returns the largest power of two that is less than or equal to the given number.\n *\n * @param {number} value - The value to find a POT for.\n * @return {number} The largest power of two that is less than or equal to the given number.\n */\nfunction floorPowerOfTwo( value ) {\n\n\treturn Math.pow( 2, Math.floor( Math.log( value ) / Math.LN2 ) );\n\n}\n\n/**\n * Sets the given quaternion from the [Intrinsic Proper Euler Angles](https://en.wikipedia.org/wiki/Euler_angles)\n * defined by the given angles and order.\n *\n * Rotations are applied to the axes in the order specified by order:\n * rotation by angle `a` is applied first, then by angle `b`, then by angle `c`.\n *\n * @param {Quaternion} q - The quaternion to set.\n * @param {number} a - The rotation applied to the first axis, in radians.\n * @param {number} b - The rotation applied to the second axis, in radians.\n * @param {number} c - The rotation applied to the third axis, in radians.\n * @param {('XYX'|'XZX'|'YXY'|'YZY'|'ZXZ'|'ZYZ')} order - A string specifying the axes order.\n */\nfunction setQuaternionFromProperEuler( q, a, b, c, order ) {\n\n\tconst cos = Math.cos;\n\tconst sin = Math.sin;\n\n\tconst c2 = cos( b / 2 );\n\tconst s2 = sin( b / 2 );\n\n\tconst c13 = cos( ( a + c ) / 2 );\n\tconst s13 = sin( ( a + c ) / 2 );\n\n\tconst c1_3 = cos( ( a - c ) / 2 );\n\tconst s1_3 = sin( ( a - c ) / 2 );\n\n\tconst c3_1 = cos( ( c - a ) / 2 );\n\tconst s3_1 = sin( ( c - a ) / 2 );\n\n\tswitch ( order ) {\n\n\t\tcase 'XYX':\n\t\t\tq.set( c2 * s13, s2 * c1_3, s2 * s1_3, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'YZY':\n\t\t\tq.set( s2 * s1_3, c2 * s13, s2 * c1_3, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'ZXZ':\n\t\t\tq.set( s2 * c1_3, s2 * s1_3, c2 * s13, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'XZX':\n\t\t\tq.set( c2 * s13, s2 * s3_1, s2 * c3_1, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'YXY':\n\t\t\tq.set( s2 * c3_1, c2 * s13, s2 * s3_1, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'ZYZ':\n\t\t\tq.set( s2 * s3_1, s2 * c3_1, c2 * s13, c2 * c13 );\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\twarn( 'MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: ' + order );\n\n\t}\n\n}\n\n/**\n * Denormalizes the given value according to the given typed array.\n *\n * @param {number} value - The value to denormalize.\n * @param {TypedArray} array - The typed array that defines the data type of the value.\n * @return {number} The denormalize (float) value in the range `[0,1]`.\n */\nfunction denormalize( value, array ) {\n\n\tswitch ( array.constructor ) {\n\n\t\tcase Float32Array:\n\n\t\t\treturn value;\n\n\t\tcase Uint32Array:\n\n\t\t\treturn value / 4294967295.0;\n\n\t\tcase Uint16Array:\n\n\t\t\treturn value / 65535.0;\n\n\t\tcase Uint8Array:\n\n\t\t\treturn value / 255.0;\n\n\t\tcase Int32Array:\n\n\t\t\treturn Math.max( value / 2147483647.0, -1 );\n\n\t\tcase Int16Array:\n\n\t\t\treturn Math.max( value / 32767.0, -1 );\n\n\t\tcase Int8Array:\n\n\t\t\treturn Math.max( value / 127.0, -1 );\n\n\t\tdefault:\n\n\t\t\tthrow new Error( 'Invalid component type.' );\n\n\t}\n\n}\n\n/**\n * Normalizes the given value according to the given typed array.\n *\n * @param {number} value - The float value in the range `[0,1]` to normalize.\n * @param {TypedArray} array - The typed array that defines the data type of the value.\n * @return {number} The normalize value.\n */\nfunction normalize( value, array ) {\n\n\tswitch ( array.constructor ) {\n\n\t\tcase Float32Array:\n\n\t\t\treturn value;\n\n\t\tcase Uint32Array:\n\n\t\t\treturn Math.round( value * 4294967295.0 );\n\n\t\tcase Uint16Array:\n\n\t\t\treturn Math.round( value * 65535.0 );\n\n\t\tcase Uint8Array:\n\n\t\t\treturn Math.round( value * 255.0 );\n\n\t\tcase Int32Array:\n\n\t\t\treturn Math.round( value * 2147483647.0 );\n\n\t\tcase Int16Array:\n\n\t\t\treturn Math.round( value * 32767.0 );\n\n\t\tcase Int8Array:\n\n\t\t\treturn Math.round( value * 127.0 );\n\n\t\tdefault:\n\n\t\t\tthrow new Error( 'Invalid component type.' );\n\n\t}\n\n}\n\n/**\n * @class\n * @classdesc A collection of math utility functions.\n * @hideconstructor\n */\nconst MathUtils = {\n\tDEG2RAD: DEG2RAD,\n\tRAD2DEG: RAD2DEG,\n\t/**\n\t * Generate a [UUID](https://en.wikipedia.org/wiki/Universally_unique_identifier)\n\t * (universally unique identifier).\n\t *\n\t * @static\n\t * @method\n\t * @return {string} The UUID.\n\t */\n\tgenerateUUID: generateUUID,\n\t/**\n\t * Clamps the given value between min and max.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} value - The value to clamp.\n\t * @param {number} min - The min value.\n\t * @param {number} max - The max value.\n\t * @return {number} The clamped value.\n\t */\n\tclamp: clamp,\n\t/**\n\t * Computes the Euclidean modulo of the given parameters that\n\t * is `( ( n % m ) + m ) % m`.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} n - The first parameter.\n\t * @param {number} m - The second parameter.\n\t * @return {number} The Euclidean modulo.\n\t */\n\teuclideanModulo: euclideanModulo,\n\t/**\n\t * Performs a linear mapping from range `<a1, a2>` to range `<b1, b2>`\n\t * for the given value.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} x - The value to be mapped.\n\t * @param {number} a1 - Minimum value for range A.\n\t * @param {number} a2 - Maximum value for range A.\n\t * @param {number} b1 - Minimum value for range B.\n\t * @param {number} b2 - Maximum value for range B.\n\t * @return {number} The mapped value.\n\t */\n\tmapLinear: mapLinear,\n\t/**\n\t * Returns the percentage in the closed interval `[0, 1]` of the given value\n\t * between the start and end point.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} x - The start point\n\t * @param {number} y - The end point.\n\t * @param {number} value - A value between start and end.\n\t * @return {number} The interpolation factor.\n\t */\n\tinverseLerp: inverseLerp,\n\t/**\n\t * Returns a value linearly interpolated from two known points based on the given interval -\n\t * `t = 0` will return `x` and `t = 1` will return `y`.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} x - The start point\n\t * @param {number} y - The end point.\n\t * @param {number} t - The interpolation factor in the closed interval `[0, 1]`.\n\t * @return {number} The interpolated value.\n\t */\n\tlerp: lerp,\n\t/**\n\t * Smoothly interpolate a number from `x` to `y` in  a spring-like manner using a delta\n\t * time to maintain frame rate independent movement. For details, see\n\t * [Frame rate independent damping using lerp](http://www.rorydriscoll.com/2016/03/07/frame-rate-independent-damping-using-lerp/).\n\t *\n\t * @static\n\t * @method\n\t * @param {number} x - The current point.\n\t * @param {number} y - The target point.\n\t * @param {number} lambda - A higher lambda value will make the movement more sudden,\n\t * and a lower value will make the movement more gradual.\n\t * @param {number} dt - Delta time in seconds.\n\t * @return {number} The interpolated value.\n\t */\n\tdamp: damp,\n\t/**\n\t * Returns a value that alternates between `0` and the given `length` parameter.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} x - The value to pingpong.\n\t * @param {number} [length=1] - The positive value the function will pingpong to.\n\t * @return {number} The alternated value.\n\t */\n\tpingpong: pingpong,\n\t/**\n\t * Returns a value in the range `[0,1]` that represents the percentage that `x` has\n\t * moved between `min` and `max`, but smoothed or slowed down the closer `x` is to\n\t * the `min` and `max`.\n\t *\n\t * See [Smoothstep](http://en.wikipedia.org/wiki/Smoothstep) for more details.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} x - The value to evaluate based on its position between min and max.\n\t * @param {number} min - The min value. Any x value below min will be `0`.\n\t * @param {number} max - The max value. Any x value above max will be `1`.\n\t * @return {number} The alternated value.\n\t */\n\tsmoothstep: smoothstep,\n\t/**\n\t * A [variation on smoothstep](https://en.wikipedia.org/wiki/Smoothstep#Variations)\n\t * that has zero 1st and 2nd order derivatives at x=0 and x=1.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} x - The value to evaluate based on its position between min and max.\n\t * @param {number} min - The min value. Any x value below min will be `0`.\n\t * @param {number} max - The max value. Any x value above max will be `1`.\n\t * @return {number} The alternated value.\n\t */\n\tsmootherstep: smootherstep,\n\t/**\n\t * Returns a random integer from `<low, high>` interval.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} low - The lower value boundary.\n\t * @param {number} high - The upper value boundary\n\t * @return {number} A random integer.\n\t */\n\trandInt: randInt,\n\t/**\n\t * Returns a random float from `<low, high>` interval.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} low - The lower value boundary.\n\t * @param {number} high - The upper value boundary\n\t * @return {number} A random float.\n\t */\n\trandFloat: randFloat,\n\t/**\n\t * Returns a random integer from `<-range/2, range/2>` interval.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} range - Defines the value range.\n\t * @return {number} A random float.\n\t */\n\trandFloatSpread: randFloatSpread,\n\t/**\n\t * Returns a deterministic pseudo-random float in the interval `[0, 1]`.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} [s] - The integer seed.\n\t * @return {number} A random float.\n\t */\n\tseededRandom: seededRandom,\n\t/**\n\t * Converts degrees to radians.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} degrees - A value in degrees.\n\t * @return {number} The converted value in radians.\n\t */\n\tdegToRad: degToRad,\n\t/**\n\t * Converts radians to degrees.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} radians - A value in radians.\n\t * @return {number} The converted value in degrees.\n\t */\n\tradToDeg: radToDeg,\n\t/**\n\t * Returns `true` if the given number is a power of two.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} value - The value to check.\n\t * @return {boolean} Whether the given number is a power of two or not.\n\t */\n\tisPowerOfTwo: isPowerOfTwo,\n\t/**\n\t * Returns the smallest power of two that is greater than or equal to the given number.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} value - The value to find a POT for.\n\t * @return {number} The smallest power of two that is greater than or equal to the given number.\n\t */\n\tceilPowerOfTwo: ceilPowerOfTwo,\n\t/**\n\t * Returns the largest power of two that is less than or equal to the given number.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} value - The value to find a POT for.\n\t * @return {number} The largest power of two that is less than or equal to the given number.\n\t */\n\tfloorPowerOfTwo: floorPowerOfTwo,\n\t/**\n\t * Sets the given quaternion from the [Intrinsic Proper Euler Angles](https://en.wikipedia.org/wiki/Euler_angles)\n\t * defined by the given angles and order.\n\t *\n\t * Rotations are applied to the axes in the order specified by order:\n\t * rotation by angle `a` is applied first, then by angle `b`, then by angle `c`.\n\t *\n\t * @static\n\t * @method\n\t * @param {Quaternion} q - The quaternion to set.\n\t * @param {number} a - The rotation applied to the first axis, in radians.\n\t * @param {number} b - The rotation applied to the second axis, in radians.\n\t * @param {number} c - The rotation applied to the third axis, in radians.\n\t * @param {('XYX'|'XZX'|'YXY'|'YZY'|'ZXZ'|'ZYZ')} order - A string specifying the axes order.\n\t */\n\tsetQuaternionFromProperEuler: setQuaternionFromProperEuler,\n\t/**\n\t * Normalizes the given value according to the given typed array.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} value - The float value in the range `[0,1]` to normalize.\n\t * @param {TypedArray} array - The typed array that defines the data type of the value.\n\t * @return {number} The normalize value.\n\t */\n\tnormalize: normalize,\n\t/**\n\t * Denormalizes the given value according to the given typed array.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} value - The value to denormalize.\n\t * @param {TypedArray} array - The typed array that defines the data type of the value.\n\t * @return {number} The denormalize (float) value in the range `[0,1]`.\n\t */\n\tdenormalize: denormalize\n};\n\n/**\n * Class representing a 2D vector. A 2D vector is an ordered pair of numbers\n * (labeled x and y), which can be used to represent a number of things, such as:\n *\n * - A point in 2D space (i.e. a position on a plane).\n * - A direction and length across a plane. In three.js the length will\n * always be the Euclidean distance(straight-line distance) from `(0, 0)` to `(x, y)`\n * and the direction is also measured from `(0, 0)` towards `(x, y)`.\n * - Any arbitrary ordered pair of numbers.\n *\n * There are other things a 2D vector can be used to represent, such as\n * momentum vectors, complex numbers and so on, however these are the most\n * common uses in three.js.\n *\n * Iterating through a vector instance will yield its components `(x, y)` in\n * the corresponding order.\n * ```js\n * const a = new THREE.Vector2( 0, 1 );\n *\n * //no arguments; will be initialised to (0, 0)\n * const b = new THREE.Vector2( );\n *\n * const d = a.distanceTo( b );\n * ```\n */\nclass Vector2 {\n\n\t/**\n\t * Constructs a new 2D vector.\n\t *\n\t * @param {number} [x=0] - The x value of this vector.\n\t * @param {number} [y=0] - The y value of this vector.\n\t */\n\tconstructor( x = 0, y = 0 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tVector2.prototype.isVector2 = true;\n\n\t\t/**\n\t\t * The x value of this vector.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.x = x;\n\n\t\t/**\n\t\t * The y value of this vector.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.y = y;\n\n\t}\n\n\t/**\n\t * Alias for {@link Vector2#x}.\n\t *\n\t * @type {number}\n\t */\n\tget width() {\n\n\t\treturn this.x;\n\n\t}\n\n\tset width( value ) {\n\n\t\tthis.x = value;\n\n\t}\n\n\t/**\n\t * Alias for {@link Vector2#y}.\n\t *\n\t * @type {number}\n\t */\n\tget height() {\n\n\t\treturn this.y;\n\n\t}\n\n\tset height( value ) {\n\n\t\tthis.y = value;\n\n\t}\n\n\t/**\n\t * Sets the vector components.\n\t *\n\t * @param {number} x - The value of the x component.\n\t * @param {number} y - The value of the y component.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tset( x, y ) {\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector components to the same value.\n\t *\n\t * @param {number} scalar - The value to set for all vector components.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tsetScalar( scalar ) {\n\n\t\tthis.x = scalar;\n\t\tthis.y = scalar;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector's x component to the given value\n\t *\n\t * @param {number} x - The value to set.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tsetX( x ) {\n\n\t\tthis.x = x;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector's y component to the given value\n\t *\n\t * @param {number} y - The value to set.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tsetY( y ) {\n\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Allows to set a vector component with an index.\n\t *\n\t * @param {number} index - The component index. `0` equals to x, `1` equals to y.\n\t * @param {number} value - The value to set.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tsetComponent( index, value ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: this.x = value; break;\n\t\t\tcase 1: this.y = value; break;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the value of the vector component which matches the given index.\n\t *\n\t * @param {number} index - The component index. `0` equals to x, `1` equals to y.\n\t * @return {number} A vector component value.\n\t */\n\tgetComponent( index ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: return this.x;\n\t\t\tcase 1: return this.y;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns a new vector with copied values from this instance.\n\t *\n\t * @return {Vector2} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor( this.x, this.y );\n\n\t}\n\n\t/**\n\t * Copies the values of the given vector to this instance.\n\t *\n\t * @param {Vector2} v - The vector to copy.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tcopy( v ) {\n\n\t\tthis.x = v.x;\n\t\tthis.y = v.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given vector to this instance.\n\t *\n\t * @param {Vector2} v - The vector to add.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tadd( v ) {\n\n\t\tthis.x += v.x;\n\t\tthis.y += v.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given scalar value to all components of this instance.\n\t *\n\t * @param {number} s - The scalar to add.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\taddScalar( s ) {\n\n\t\tthis.x += s;\n\t\tthis.y += s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given vectors and stores the result in this instance.\n\t *\n\t * @param {Vector2} a - The first vector.\n\t * @param {Vector2} b - The second vector.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\taddVectors( a, b ) {\n\n\t\tthis.x = a.x + b.x;\n\t\tthis.y = a.y + b.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given vector scaled by the given factor to this instance.\n\t *\n\t * @param {Vector2} v - The vector.\n\t * @param {number} s - The factor that scales `v`.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\taddScaledVector( v, s ) {\n\n\t\tthis.x += v.x * s;\n\t\tthis.y += v.y * s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the given vector from this instance.\n\t *\n\t * @param {Vector2} v - The vector to subtract.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tsub( v ) {\n\n\t\tthis.x -= v.x;\n\t\tthis.y -= v.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the given scalar value from all components of this instance.\n\t *\n\t * @param {number} s - The scalar to subtract.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tsubScalar( s ) {\n\n\t\tthis.x -= s;\n\t\tthis.y -= s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the given vectors and stores the result in this instance.\n\t *\n\t * @param {Vector2} a - The first vector.\n\t * @param {Vector2} b - The second vector.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tsubVectors( a, b ) {\n\n\t\tthis.x = a.x - b.x;\n\t\tthis.y = a.y - b.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the given vector with this instance.\n\t *\n\t * @param {Vector2} v - The vector to multiply.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tmultiply( v ) {\n\n\t\tthis.x *= v.x;\n\t\tthis.y *= v.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the given scalar value with all components of this instance.\n\t *\n\t * @param {number} scalar - The scalar to multiply.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tmultiplyScalar( scalar ) {\n\n\t\tthis.x *= scalar;\n\t\tthis.y *= scalar;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Divides this instance by the given vector.\n\t *\n\t * @param {Vector2} v - The vector to divide.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tdivide( v ) {\n\n\t\tthis.x /= v.x;\n\t\tthis.y /= v.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Divides this vector by the given scalar.\n\t *\n\t * @param {number} scalar - The scalar to divide.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tdivideScalar( scalar ) {\n\n\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t}\n\n\t/**\n\t * Multiplies this vector (with an implicit 1 as the 3rd component) by\n\t * the given 3x3 matrix.\n\t *\n\t * @param {Matrix3} m - The matrix to apply.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tapplyMatrix3( m ) {\n\n\t\tconst x = this.x, y = this.y;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ];\n\t\tthis.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x or y value is greater than the given vector's x or y\n\t * value, replace that value with the corresponding min value.\n\t *\n\t * @param {Vector2} v - The vector.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tmin( v ) {\n\n\t\tthis.x = Math.min( this.x, v.x );\n\t\tthis.y = Math.min( this.y, v.y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x or y value is less than the given vector's x or y\n\t * value, replace that value with the corresponding max value.\n\t *\n\t * @param {Vector2} v - The vector.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tmax( v ) {\n\n\t\tthis.x = Math.max( this.x, v.x );\n\t\tthis.y = Math.max( this.y, v.y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x or y value is greater than the max vector's x or y\n\t * value, it is replaced by the corresponding value.\n\t * If this vector's x or y value is less than the min vector's x or y value,\n\t * it is replaced by the corresponding value.\n\t *\n\t * @param {Vector2} min - The minimum x and y values.\n\t * @param {Vector2} max - The maximum x and y values in the desired range.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tclamp( min, max ) {\n\n\t\t// assumes min < max, componentwise\n\n\t\tthis.x = clamp( this.x, min.x, max.x );\n\t\tthis.y = clamp( this.y, min.y, max.y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x or y values are greater than the max value, they are\n\t * replaced by the max value.\n\t * If this vector's x or y values are less than the min value, they are\n\t * replaced by the min value.\n\t *\n\t * @param {number} minVal - The minimum value the components will be clamped to.\n\t * @param {number} maxVal - The maximum value the components will be clamped to.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tclampScalar( minVal, maxVal ) {\n\n\t\tthis.x = clamp( this.x, minVal, maxVal );\n\t\tthis.y = clamp( this.y, minVal, maxVal );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's length is greater than the max value, it is replaced by\n\t * the max value.\n\t * If this vector's length is less than the min value, it is replaced by the\n\t * min value.\n\t *\n\t * @param {number} min - The minimum value the vector length will be clamped to.\n\t * @param {number} max - The maximum value the vector length will be clamped to.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tclampLength( min, max ) {\n\n\t\tconst length = this.length();\n\n\t\treturn this.divideScalar( length || 1 ).multiplyScalar( clamp( length, min, max ) );\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded down to the nearest integer value.\n\t *\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tfloor() {\n\n\t\tthis.x = Math.floor( this.x );\n\t\tthis.y = Math.floor( this.y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded up to the nearest integer value.\n\t *\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tceil() {\n\n\t\tthis.x = Math.ceil( this.x );\n\t\tthis.y = Math.ceil( this.y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded to the nearest integer value\n\t *\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tround() {\n\n\t\tthis.x = Math.round( this.x );\n\t\tthis.y = Math.round( this.y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded towards zero (up if negative,\n\t * down if positive) to an integer value.\n\t *\n\t * @return {Vector2} A reference to this vector.\n\t */\n\troundToZero() {\n\n\t\tthis.x = Math.trunc( this.x );\n\t\tthis.y = Math.trunc( this.y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Inverts this vector - i.e. sets x = -x and y = -y.\n\t *\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tnegate() {\n\n\t\tthis.x = - this.x;\n\t\tthis.y = - this.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Calculates the dot product of the given vector with this instance.\n\t *\n\t * @param {Vector2} v - The vector to compute the dot product with.\n\t * @return {number} The result of the dot product.\n\t */\n\tdot( v ) {\n\n\t\treturn this.x * v.x + this.y * v.y;\n\n\t}\n\n\t/**\n\t * Calculates the cross product of the given vector with this instance.\n\t *\n\t * @param {Vector2} v - The vector to compute the cross product with.\n\t * @return {number} The result of the cross product.\n\t */\n\tcross( v ) {\n\n\t\treturn this.x * v.y - this.y * v.x;\n\n\t}\n\n\t/**\n\t * Computes the square of the Euclidean length (straight-line length) from\n\t * (0, 0) to (x, y). If you are comparing the lengths of vectors, you should\n\t * compare the length squared instead as it is slightly more efficient to calculate.\n\t *\n\t * @return {number} The square length of this vector.\n\t */\n\tlengthSq() {\n\n\t\treturn this.x * this.x + this.y * this.y;\n\n\t}\n\n\t/**\n\t * Computes the  Euclidean length (straight-line length) from (0, 0) to (x, y).\n\t *\n\t * @return {number} The length of this vector.\n\t */\n\tlength() {\n\n\t\treturn Math.sqrt( this.x * this.x + this.y * this.y );\n\n\t}\n\n\t/**\n\t * Computes the Manhattan length of this vector.\n\t *\n\t * @return {number} The length of this vector.\n\t */\n\tmanhattanLength() {\n\n\t\treturn Math.abs( this.x ) + Math.abs( this.y );\n\n\t}\n\n\t/**\n\t * Converts this vector to a unit vector - that is, sets it equal to a vector\n\t * with the same direction as this one, but with a vector length of `1`.\n\t *\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tnormalize() {\n\n\t\treturn this.divideScalar( this.length() || 1 );\n\n\t}\n\n\t/**\n\t * Computes the angle in radians of this vector with respect to the positive x-axis.\n\t *\n\t * @return {number} The angle in radians.\n\t */\n\tangle() {\n\n\t\tconst angle = Math.atan2( - this.y, - this.x ) + Math.PI;\n\n\t\treturn angle;\n\n\t}\n\n\t/**\n\t * Returns the angle between the given vector and this instance in radians.\n\t *\n\t * @param {Vector2} v - The vector to compute the angle with.\n\t * @return {number} The angle in radians.\n\t */\n\tangleTo( v ) {\n\n\t\tconst denominator = Math.sqrt( this.lengthSq() * v.lengthSq() );\n\n\t\tif ( denominator === 0 ) return Math.PI / 2;\n\n\t\tconst theta = this.dot( v ) / denominator;\n\n\t\t// clamp, to handle numerical problems\n\n\t\treturn Math.acos( clamp( theta, -1, 1 ) );\n\n\t}\n\n\t/**\n\t * Computes the distance from the given vector to this instance.\n\t *\n\t * @param {Vector2} v - The vector to compute the distance to.\n\t * @return {number} The distance.\n\t */\n\tdistanceTo( v ) {\n\n\t\treturn Math.sqrt( this.distanceToSquared( v ) );\n\n\t}\n\n\t/**\n\t * Computes the squared distance from the given vector to this instance.\n\t * If you are just comparing the distance with another distance, you should compare\n\t * the distance squared instead as it is slightly more efficient to calculate.\n\t *\n\t * @param {Vector2} v - The vector to compute the squared distance to.\n\t * @return {number} The squared distance.\n\t */\n\tdistanceToSquared( v ) {\n\n\t\tconst dx = this.x - v.x, dy = this.y - v.y;\n\t\treturn dx * dx + dy * dy;\n\n\t}\n\n\t/**\n\t * Computes the Manhattan distance from the given vector to this instance.\n\t *\n\t * @param {Vector2} v - The vector to compute the Manhattan distance to.\n\t * @return {number} The Manhattan distance.\n\t */\n\tmanhattanDistanceTo( v ) {\n\n\t\treturn Math.abs( this.x - v.x ) + Math.abs( this.y - v.y );\n\n\t}\n\n\t/**\n\t * Sets this vector to a vector with the same direction as this one, but\n\t * with the specified length.\n\t *\n\t * @param {number} length - The new length of this vector.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tsetLength( length ) {\n\n\t\treturn this.normalize().multiplyScalar( length );\n\n\t}\n\n\t/**\n\t * Linearly interpolates between the given vector and this instance, where\n\t * alpha is the percent distance along the line - alpha = 0 will be this\n\t * vector, and alpha = 1 will be the given one.\n\t *\n\t * @param {Vector2} v - The vector to interpolate towards.\n\t * @param {number} alpha - The interpolation factor, typically in the closed interval `[0, 1]`.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tlerp( v, alpha ) {\n\n\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\tthis.y += ( v.y - this.y ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Linearly interpolates between the given vectors, where alpha is the percent\n\t * distance along the line - alpha = 0 will be first vector, and alpha = 1 will\n\t * be the second one. The result is stored in this instance.\n\t *\n\t * @param {Vector2} v1 - The first vector.\n\t * @param {Vector2} v2 - The second vector.\n\t * @param {number} alpha - The interpolation factor, typically in the closed interval `[0, 1]`.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tlerpVectors( v1, v2, alpha ) {\n\n\t\tthis.x = v1.x + ( v2.x - v1.x ) * alpha;\n\t\tthis.y = v1.y + ( v2.y - v1.y ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this vector is equal with the given one.\n\t *\n\t * @param {Vector2} v - The vector to test for equality.\n\t * @return {boolean} Whether this vector is equal with the given one.\n\t */\n\tequals( v ) {\n\n\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) );\n\n\t}\n\n\t/**\n\t * Sets this vector's x value to be `array[ offset ]` and y\n\t * value to be `array[ offset + 1 ]`.\n\t *\n\t * @param {Array<number>} array - An array holding the vector component values.\n\t * @param {number} [offset=0] - The offset into the array.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis.x = array[ offset ];\n\t\tthis.y = array[ offset + 1 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Writes the components of this vector to the given array. If no array is provided,\n\t * the method returns a new instance.\n\t *\n\t * @param {Array<number>} [array=[]] - The target array holding the vector components.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Array<number>} The vector components.\n\t */\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this.x;\n\t\tarray[ offset + 1 ] = this.y;\n\n\t\treturn array;\n\n\t}\n\n\t/**\n\t * Sets the components of this vector from the given buffer attribute.\n\t *\n\t * @param {BufferAttribute} attribute - The buffer attribute holding vector data.\n\t * @param {number} index - The index into the attribute.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tfromBufferAttribute( attribute, index ) {\n\n\t\tthis.x = attribute.getX( index );\n\t\tthis.y = attribute.getY( index );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Rotates this vector around the given center by the given angle.\n\t *\n\t * @param {Vector2} center - The point around which to rotate.\n\t * @param {number} angle - The angle to rotate, in radians.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\trotateAround( center, angle ) {\n\n\t\tconst c = Math.cos( angle ), s = Math.sin( angle );\n\n\t\tconst x = this.x - center.x;\n\t\tconst y = this.y - center.y;\n\n\t\tthis.x = x * c - y * s + center.x;\n\t\tthis.y = x * s + y * c + center.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets each component of this vector to a pseudo-random value between `0` and\n\t * `1`, excluding `1`.\n\t *\n\t * @return {Vector2} A reference to this vector.\n\t */\n\trandom() {\n\n\t\tthis.x = Math.random();\n\t\tthis.y = Math.random();\n\n\t\treturn this;\n\n\t}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this.x;\n\t\tyield this.y;\n\n\t}\n\n}\n\n/**\n * Class for representing a Quaternion. Quaternions are used in three.js to represent rotations.\n *\n * Iterating through a vector instance will yield its components `(x, y, z, w)` in\n * the corresponding order.\n *\n * Note that three.js expects Quaternions to be normalized.\n * ```js\n * const quaternion = new THREE.Quaternion();\n * quaternion.setFromAxisAngle( new THREE.Vector3( 0, 1, 0 ), Math.PI / 2 );\n *\n * const vector = new THREE.Vector3( 1, 0, 0 );\n * vector.applyQuaternion( quaternion );\n * ```\n */\nclass Quaternion {\n\n\t/**\n\t * Constructs a new quaternion.\n\t *\n\t * @param {number} [x=0] - The x value of this quaternion.\n\t * @param {number} [y=0] - The y value of this quaternion.\n\t * @param {number} [z=0] - The z value of this quaternion.\n\t * @param {number} [w=1] - The w value of this quaternion.\n\t */\n\tconstructor( x = 0, y = 0, z = 0, w = 1 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isQuaternion = true;\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._w = w;\n\n\t}\n\n\t/**\n\t * Interpolates between two quaternions via SLERP. This implementation assumes the\n\t * quaternion data are managed in flat arrays.\n\t *\n\t * @param {Array<number>} dst - The destination array.\n\t * @param {number} dstOffset - An offset into the destination array.\n\t * @param {Array<number>} src0 - The source array of the first quaternion.\n\t * @param {number} srcOffset0 - An offset into the first source array.\n\t * @param {Array<number>} src1 -  The source array of the second quaternion.\n\t * @param {number} srcOffset1 - An offset into the second source array.\n\t * @param {number} t - The interpolation factor in the range `[0,1]`.\n\t * @see {@link Quaternion#slerp}\n\t */\n\tstatic slerpFlat( dst, dstOffset, src0, srcOffset0, src1, srcOffset1, t ) {\n\n\t\tlet x0 = src0[ srcOffset0 + 0 ],\n\t\t\ty0 = src0[ srcOffset0 + 1 ],\n\t\t\tz0 = src0[ srcOffset0 + 2 ],\n\t\t\tw0 = src0[ srcOffset0 + 3 ];\n\n\t\tlet x1 = src1[ srcOffset1 + 0 ],\n\t\t\ty1 = src1[ srcOffset1 + 1 ],\n\t\t\tz1 = src1[ srcOffset1 + 2 ],\n\t\t\tw1 = src1[ srcOffset1 + 3 ];\n\n\t\tif ( t <= 0 ) {\n\n\t\t\tdst[ dstOffset + 0 ] = x0;\n\t\t\tdst[ dstOffset + 1 ] = y0;\n\t\t\tdst[ dstOffset + 2 ] = z0;\n\t\t\tdst[ dstOffset + 3 ] = w0;\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( t >= 1 ) {\n\n\t\t\tdst[ dstOffset + 0 ] = x1;\n\t\t\tdst[ dstOffset + 1 ] = y1;\n\t\t\tdst[ dstOffset + 2 ] = z1;\n\t\t\tdst[ dstOffset + 3 ] = w1;\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1 ) {\n\n\t\t\tlet dot = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1;\n\n\t\t\tif ( dot < 0 ) {\n\n\t\t\t\tx1 = - x1;\n\t\t\t\ty1 = - y1;\n\t\t\t\tz1 = - z1;\n\t\t\t\tw1 = - w1;\n\n\t\t\t\tdot = - dot;\n\n\t\t\t}\n\n\t\t\tlet s = 1 - t;\n\n\t\t\tif ( dot < 0.9995 ) {\n\n\t\t\t\t// slerp\n\n\t\t\t\tconst theta = Math.acos( dot );\n\t\t\t\tconst sin = Math.sin( theta );\n\n\t\t\t\ts = Math.sin( s * theta ) / sin;\n\t\t\t\tt = Math.sin( t * theta ) / sin;\n\n\t\t\t\tx0 = x0 * s + x1 * t;\n\t\t\t\ty0 = y0 * s + y1 * t;\n\t\t\t\tz0 = z0 * s + z1 * t;\n\t\t\t\tw0 = w0 * s + w1 * t;\n\n\t\t\t} else {\n\n\t\t\t\t// for small angles, lerp then normalize\n\n\t\t\t\tx0 = x0 * s + x1 * t;\n\t\t\t\ty0 = y0 * s + y1 * t;\n\t\t\t\tz0 = z0 * s + z1 * t;\n\t\t\t\tw0 = w0 * s + w1 * t;\n\n\t\t\t\tconst f = 1 / Math.sqrt( x0 * x0 + y0 * y0 + z0 * z0 + w0 * w0 );\n\n\t\t\t\tx0 *= f;\n\t\t\t\ty0 *= f;\n\t\t\t\tz0 *= f;\n\t\t\t\tw0 *= f;\n\n\t\t\t}\n\n\t\t}\n\n\t\tdst[ dstOffset ] = x0;\n\t\tdst[ dstOffset + 1 ] = y0;\n\t\tdst[ dstOffset + 2 ] = z0;\n\t\tdst[ dstOffset + 3 ] = w0;\n\n\t}\n\n\t/**\n\t * Multiplies two quaternions. This implementation assumes the quaternion data are managed\n\t * in flat arrays.\n\t *\n\t * @param {Array<number>} dst - The destination array.\n\t * @param {number} dstOffset - An offset into the destination array.\n\t * @param {Array<number>} src0 - The source array of the first quaternion.\n\t * @param {number} srcOffset0 - An offset into the first source array.\n\t * @param {Array<number>} src1 -  The source array of the second quaternion.\n\t * @param {number} srcOffset1 - An offset into the second source array.\n\t * @return {Array<number>} The destination array.\n\t * @see {@link Quaternion#multiplyQuaternions}.\n\t */\n\tstatic multiplyQuaternionsFlat( dst, dstOffset, src0, srcOffset0, src1, srcOffset1 ) {\n\n\t\tconst x0 = src0[ srcOffset0 ];\n\t\tconst y0 = src0[ srcOffset0 + 1 ];\n\t\tconst z0 = src0[ srcOffset0 + 2 ];\n\t\tconst w0 = src0[ srcOffset0 + 3 ];\n\n\t\tconst x1 = src1[ srcOffset1 ];\n\t\tconst y1 = src1[ srcOffset1 + 1 ];\n\t\tconst z1 = src1[ srcOffset1 + 2 ];\n\t\tconst w1 = src1[ srcOffset1 + 3 ];\n\n\t\tdst[ dstOffset ] = x0 * w1 + w0 * x1 + y0 * z1 - z0 * y1;\n\t\tdst[ dstOffset + 1 ] = y0 * w1 + w0 * y1 + z0 * x1 - x0 * z1;\n\t\tdst[ dstOffset + 2 ] = z0 * w1 + w0 * z1 + x0 * y1 - y0 * x1;\n\t\tdst[ dstOffset + 3 ] = w0 * w1 - x0 * x1 - y0 * y1 - z0 * z1;\n\n\t\treturn dst;\n\n\t}\n\n\t/**\n\t * The x value of this quaternion.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget x() {\n\n\t\treturn this._x;\n\n\t}\n\n\tset x( value ) {\n\n\t\tthis._x = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\t/**\n\t * The y value of this quaternion.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget y() {\n\n\t\treturn this._y;\n\n\t}\n\n\tset y( value ) {\n\n\t\tthis._y = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\t/**\n\t * The z value of this quaternion.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget z() {\n\n\t\treturn this._z;\n\n\t}\n\n\tset z( value ) {\n\n\t\tthis._z = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\t/**\n\t * The w value of this quaternion.\n\t *\n\t * @type {number}\n\t * @default 1\n\t */\n\tget w() {\n\n\t\treturn this._w;\n\n\t}\n\n\tset w( value ) {\n\n\t\tthis._w = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\t/**\n\t * Sets the quaternion components.\n\t *\n\t * @param {number} x - The x value of this quaternion.\n\t * @param {number} y - The y value of this quaternion.\n\t * @param {number} z - The z value of this quaternion.\n\t * @param {number} w - The w value of this quaternion.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tset( x, y, z, w ) {\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._w = w;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new quaternion with copied values from this instance.\n\t *\n\t * @return {Quaternion} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor( this._x, this._y, this._z, this._w );\n\n\t}\n\n\t/**\n\t * Copies the values of the given quaternion to this instance.\n\t *\n\t * @param {Quaternion} quaternion - The quaternion to copy.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tcopy( quaternion ) {\n\n\t\tthis._x = quaternion.x;\n\t\tthis._y = quaternion.y;\n\t\tthis._z = quaternion.z;\n\t\tthis._w = quaternion.w;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this quaternion from the rotation specified by the given\n\t * Euler angles.\n\t *\n\t * @param {Euler} euler - The Euler angles.\n\t * @param {boolean} [update=true] - Whether the internal `onChange` callback should be executed or not.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tsetFromEuler( euler, update = true ) {\n\n\t\tconst x = euler._x, y = euler._y, z = euler._z, order = euler._order;\n\n\t\t// http://www.mathworks.com/matlabcentral/fileexchange/\n\t\t// \t20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/\n\t\t//\tcontent/SpinCalc.m\n\n\t\tconst cos = Math.cos;\n\t\tconst sin = Math.sin;\n\n\t\tconst c1 = cos( x / 2 );\n\t\tconst c2 = cos( y / 2 );\n\t\tconst c3 = cos( z / 2 );\n\n\t\tconst s1 = sin( x / 2 );\n\t\tconst s2 = sin( y / 2 );\n\t\tconst s3 = sin( z / 2 );\n\n\t\tswitch ( order ) {\n\n\t\t\tcase 'XYZ':\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'YXZ':\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZXY':\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZYX':\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'YZX':\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'XZY':\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\twarn( 'Quaternion: .setFromEuler() encountered an unknown order: ' + order );\n\n\t\t}\n\n\t\tif ( update === true ) this._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this quaternion from the given axis and angle.\n\t *\n\t * @param {Vector3} axis - The normalized axis.\n\t * @param {number} angle - The angle in radians.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tsetFromAxisAngle( axis, angle ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm\n\n\t\tconst halfAngle = angle / 2, s = Math.sin( halfAngle );\n\n\t\tthis._x = axis.x * s;\n\t\tthis._y = axis.y * s;\n\t\tthis._z = axis.z * s;\n\t\tthis._w = Math.cos( halfAngle );\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this quaternion from the given rotation matrix.\n\t *\n\t * @param {Matrix4} m - A 4x4 matrix of which the upper 3x3 of matrix is a pure rotation matrix (i.e. unscaled).\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tsetFromRotationMatrix( m ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tconst te = m.elements,\n\n\t\t\tm11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],\n\t\t\tm21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],\n\t\t\tm31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ],\n\n\t\t\ttrace = m11 + m22 + m33;\n\n\t\tif ( trace > 0 ) {\n\n\t\t\tconst s = 0.5 / Math.sqrt( trace + 1.0 );\n\n\t\t\tthis._w = 0.25 / s;\n\t\t\tthis._x = ( m32 - m23 ) * s;\n\t\t\tthis._y = ( m13 - m31 ) * s;\n\t\t\tthis._z = ( m21 - m12 ) * s;\n\n\t\t} else if ( m11 > m22 && m11 > m33 ) {\n\n\t\t\tconst s = 2.0 * Math.sqrt( 1.0 + m11 - m22 - m33 );\n\n\t\t\tthis._w = ( m32 - m23 ) / s;\n\t\t\tthis._x = 0.25 * s;\n\t\t\tthis._y = ( m12 + m21 ) / s;\n\t\t\tthis._z = ( m13 + m31 ) / s;\n\n\t\t} else if ( m22 > m33 ) {\n\n\t\t\tconst s = 2.0 * Math.sqrt( 1.0 + m22 - m11 - m33 );\n\n\t\t\tthis._w = ( m13 - m31 ) / s;\n\t\t\tthis._x = ( m12 + m21 ) / s;\n\t\t\tthis._y = 0.25 * s;\n\t\t\tthis._z = ( m23 + m32 ) / s;\n\n\t\t} else {\n\n\t\t\tconst s = 2.0 * Math.sqrt( 1.0 + m33 - m11 - m22 );\n\n\t\t\tthis._w = ( m21 - m12 ) / s;\n\t\t\tthis._x = ( m13 + m31 ) / s;\n\t\t\tthis._y = ( m23 + m32 ) / s;\n\t\t\tthis._z = 0.25 * s;\n\n\t\t}\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this quaternion to the rotation required to rotate the direction vector\n\t * `vFrom` to the direction vector `vTo`.\n\t *\n\t * @param {Vector3} vFrom - The first (normalized) direction vector.\n\t * @param {Vector3} vTo - The second (normalized) direction vector.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tsetFromUnitVectors( vFrom, vTo ) {\n\n\t\t// assumes direction vectors vFrom and vTo are normalized\n\n\t\tlet r = vFrom.dot( vTo ) + 1;\n\n\t\tif ( r < 1e-8 ) { // the epsilon value has been discussed in #31286\n\n\t\t\t// vFrom and vTo point in opposite directions\n\n\t\t\tr = 0;\n\n\t\t\tif ( Math.abs( vFrom.x ) > Math.abs( vFrom.z ) ) {\n\n\t\t\t\tthis._x = - vFrom.y;\n\t\t\t\tthis._y = vFrom.x;\n\t\t\t\tthis._z = 0;\n\t\t\t\tthis._w = r;\n\n\t\t\t} else {\n\n\t\t\t\tthis._x = 0;\n\t\t\t\tthis._y = - vFrom.z;\n\t\t\t\tthis._z = vFrom.y;\n\t\t\t\tthis._w = r;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// crossVectors( vFrom, vTo ); // inlined to avoid cyclic dependency on Vector3\n\n\t\t\tthis._x = vFrom.y * vTo.z - vFrom.z * vTo.y;\n\t\t\tthis._y = vFrom.z * vTo.x - vFrom.x * vTo.z;\n\t\t\tthis._z = vFrom.x * vTo.y - vFrom.y * vTo.x;\n\t\t\tthis._w = r;\n\n\t\t}\n\n\t\treturn this.normalize();\n\n\t}\n\n\t/**\n\t * Returns the angle between this quaternion and the given one in radians.\n\t *\n\t * @param {Quaternion} q - The quaternion to compute the angle with.\n\t * @return {number} The angle in radians.\n\t */\n\tangleTo( q ) {\n\n\t\treturn 2 * Math.acos( Math.abs( clamp( this.dot( q ), -1, 1 ) ) );\n\n\t}\n\n\t/**\n\t * Rotates this quaternion by a given angular step to the given quaternion.\n\t * The method ensures that the final quaternion will not overshoot `q`.\n\t *\n\t * @param {Quaternion} q - The target quaternion.\n\t * @param {number} step - The angular step in radians.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\trotateTowards( q, step ) {\n\n\t\tconst angle = this.angleTo( q );\n\n\t\tif ( angle === 0 ) return this;\n\n\t\tconst t = Math.min( 1, step / angle );\n\n\t\tthis.slerp( q, t );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this quaternion to the identity quaternion; that is, to the\n\t * quaternion that represents \"no rotation\".\n\t *\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tidentity() {\n\n\t\treturn this.set( 0, 0, 0, 1 );\n\n\t}\n\n\t/**\n\t * Inverts this quaternion via {@link Quaternion#conjugate}. The\n\t * quaternion is assumed to have unit length.\n\t *\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tinvert() {\n\n\t\treturn this.conjugate();\n\n\t}\n\n\t/**\n\t * Returns the rotational conjugate of this quaternion. The conjugate of a\n\t * quaternion represents the same rotation in the opposite direction about\n\t * the rotational axis.\n\t *\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tconjugate() {\n\n\t\tthis._x *= -1;\n\t\tthis._y *= -1;\n\t\tthis._z *= -1;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Calculates the dot product of this quaternion and the given one.\n\t *\n\t * @param {Quaternion} v - The quaternion to compute the dot product with.\n\t * @return {number} The result of the dot product.\n\t */\n\tdot( v ) {\n\n\t\treturn this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w;\n\n\t}\n\n\t/**\n\t * Computes the squared Euclidean length (straight-line length) of this quaternion,\n\t * considered as a 4 dimensional vector. This can be useful if you are comparing the\n\t * lengths of two quaternions, as this is a slightly more efficient calculation than\n\t * {@link Quaternion#length}.\n\t *\n\t * @return {number} The squared Euclidean length.\n\t */\n\tlengthSq() {\n\n\t\treturn this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w;\n\n\t}\n\n\t/**\n\t * Computes the Euclidean length (straight-line length) of this quaternion,\n\t * considered as a 4 dimensional vector.\n\t *\n\t * @return {number} The Euclidean length.\n\t */\n\tlength() {\n\n\t\treturn Math.sqrt( this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w );\n\n\t}\n\n\t/**\n\t * Normalizes this quaternion - that is, calculated the quaternion that performs\n\t * the same rotation as this one, but has a length equal to `1`.\n\t *\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tnormalize() {\n\n\t\tlet l = this.length();\n\n\t\tif ( l === 0 ) {\n\n\t\t\tthis._x = 0;\n\t\t\tthis._y = 0;\n\t\t\tthis._z = 0;\n\t\t\tthis._w = 1;\n\n\t\t} else {\n\n\t\t\tl = 1 / l;\n\n\t\t\tthis._x = this._x * l;\n\t\t\tthis._y = this._y * l;\n\t\t\tthis._z = this._z * l;\n\t\t\tthis._w = this._w * l;\n\n\t\t}\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies this quaternion by the given one.\n\t *\n\t * @param {Quaternion} q - The quaternion.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tmultiply( q ) {\n\n\t\treturn this.multiplyQuaternions( this, q );\n\n\t}\n\n\t/**\n\t * Pre-multiplies this quaternion by the given one.\n\t *\n\t * @param {Quaternion} q - The quaternion.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tpremultiply( q ) {\n\n\t\treturn this.multiplyQuaternions( q, this );\n\n\t}\n\n\t/**\n\t * Multiplies the given quaternions and stores the result in this instance.\n\t *\n\t * @param {Quaternion} a - The first quaternion.\n\t * @param {Quaternion} b - The second quaternion.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tmultiplyQuaternions( a, b ) {\n\n\t\t// from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm\n\n\t\tconst qax = a._x, qay = a._y, qaz = a._z, qaw = a._w;\n\t\tconst qbx = b._x, qby = b._y, qbz = b._z, qbw = b._w;\n\n\t\tthis._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby;\n\t\tthis._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz;\n\t\tthis._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx;\n\t\tthis._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Performs a spherical linear interpolation between quaternions.\n\t *\n\t * @param {Quaternion} qb - The target quaternion.\n\t * @param {number} t - The interpolation factor in the closed interval `[0, 1]`.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tslerp( qb, t ) {\n\n\t\tif ( t <= 0 ) return this;\n\n\t\tif ( t >= 1 ) return this.copy( qb ); // copy calls _onChangeCallback()\n\n\t\tlet x = qb._x, y = qb._y, z = qb._z, w = qb._w;\n\n\t\tlet dot = this.dot( qb );\n\n\t\tif ( dot < 0 ) {\n\n\t\t\tx = - x;\n\t\t\ty = - y;\n\t\t\tz = - z;\n\t\t\tw = - w;\n\n\t\t\tdot = - dot;\n\n\t\t}\n\n\t\tlet s = 1 - t;\n\n\t\tif ( dot < 0.9995 ) {\n\n\t\t\t// slerp\n\n\t\t\tconst theta = Math.acos( dot );\n\t\t\tconst sin = Math.sin( theta );\n\n\t\t\ts = Math.sin( s * theta ) / sin;\n\t\t\tt = Math.sin( t * theta ) / sin;\n\n\t\t\tthis._x = this._x * s + x * t;\n\t\t\tthis._y = this._y * s + y * t;\n\t\t\tthis._z = this._z * s + z * t;\n\t\t\tthis._w = this._w * s + w * t;\n\n\t\t\tthis._onChangeCallback();\n\n\t\t} else {\n\n\t\t\t// for small angles, lerp then normalize\n\n\t\t\tthis._x = this._x * s + x * t;\n\t\t\tthis._y = this._y * s + y * t;\n\t\t\tthis._z = this._z * s + z * t;\n\t\t\tthis._w = this._w * s + w * t;\n\n\t\t\tthis.normalize(); // normalize calls _onChangeCallback()\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Performs a spherical linear interpolation between the given quaternions\n\t * and stores the result in this quaternion.\n\t *\n\t * @param {Quaternion} qa - The source quaternion.\n\t * @param {Quaternion} qb - The target quaternion.\n\t * @param {number} t - The interpolation factor in the closed interval `[0, 1]`.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tslerpQuaternions( qa, qb, t ) {\n\n\t\treturn this.copy( qa ).slerp( qb, t );\n\n\t}\n\n\t/**\n\t * Sets this quaternion to a uniformly random, normalized quaternion.\n\t *\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\trandom() {\n\n\t\t// Ken Shoemake\n\t\t// Uniform random rotations\n\t\t// D. Kirk, editor, Graphics Gems III, pages 124-132. Academic Press, New York, 1992.\n\n\t\tconst theta1 = 2 * Math.PI * Math.random();\n\t\tconst theta2 = 2 * Math.PI * Math.random();\n\n\t\tconst x0 = Math.random();\n\t\tconst r1 = Math.sqrt( 1 - x0 );\n\t\tconst r2 = Math.sqrt( x0 );\n\n\t\treturn this.set(\n\t\t\tr1 * Math.sin( theta1 ),\n\t\t\tr1 * Math.cos( theta1 ),\n\t\t\tr2 * Math.sin( theta2 ),\n\t\t\tr2 * Math.cos( theta2 ),\n\t\t);\n\n\t}\n\n\t/**\n\t * Returns `true` if this quaternion is equal with the given one.\n\t *\n\t * @param {Quaternion} quaternion - The quaternion to test for equality.\n\t * @return {boolean} Whether this quaternion is equal with the given one.\n\t */\n\tequals( quaternion ) {\n\n\t\treturn ( quaternion._x === this._x ) && ( quaternion._y === this._y ) && ( quaternion._z === this._z ) && ( quaternion._w === this._w );\n\n\t}\n\n\t/**\n\t * Sets this quaternion's components from the given array.\n\t *\n\t * @param {Array<number>} array - An array holding the quaternion component values.\n\t * @param {number} [offset=0] - The offset into the array.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis._x = array[ offset ];\n\t\tthis._y = array[ offset + 1 ];\n\t\tthis._z = array[ offset + 2 ];\n\t\tthis._w = array[ offset + 3 ];\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Writes the components of this quaternion to the given array. If no array is provided,\n\t * the method returns a new instance.\n\t *\n\t * @param {Array<number>} [array=[]] - The target array holding the quaternion components.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Array<number>} The quaternion components.\n\t */\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this._x;\n\t\tarray[ offset + 1 ] = this._y;\n\t\tarray[ offset + 2 ] = this._z;\n\t\tarray[ offset + 3 ] = this._w;\n\n\t\treturn array;\n\n\t}\n\n\t/**\n\t * Sets the components of this quaternion from the given buffer attribute.\n\t *\n\t * @param {BufferAttribute} attribute - The buffer attribute holding quaternion data.\n\t * @param {number} index - The index into the attribute.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tfromBufferAttribute( attribute, index ) {\n\n\t\tthis._x = attribute.getX( index );\n\t\tthis._y = attribute.getY( index );\n\t\tthis._z = attribute.getZ( index );\n\t\tthis._w = attribute.getW( index );\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * This methods defines the serialization result of this class. Returns the\n\t * numerical elements of this quaternion in an array of format `[x, y, z, w]`.\n\t *\n\t * @return {Array<number>} The serialized quaternion.\n\t */\n\ttoJSON() {\n\n\t\treturn this.toArray();\n\n\t}\n\n\t_onChange( callback ) {\n\n\t\tthis._onChangeCallback = callback;\n\n\t\treturn this;\n\n\t}\n\n\t_onChangeCallback() {}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this._x;\n\t\tyield this._y;\n\t\tyield this._z;\n\t\tyield this._w;\n\n\t}\n\n}\n\n/**\n * Class representing a 3D vector. A 3D vector is an ordered triplet of numbers\n * (labeled x, y and z), which can be used to represent a number of things, such as:\n *\n * - A point in 3D space.\n * - A direction and length in 3D space. In three.js the length will\n * always be the Euclidean distance(straight-line distance) from `(0, 0, 0)` to `(x, y, z)`\n * and the direction is also measured from `(0, 0, 0)` towards `(x, y, z)`.\n * - Any arbitrary ordered triplet of numbers.\n *\n * There are other things a 3D vector can be used to represent, such as\n * momentum vectors and so on, however these are the most\n * common uses in three.js.\n *\n * Iterating through a vector instance will yield its components `(x, y, z)` in\n * the corresponding order.\n * ```js\n * const a = new THREE.Vector3( 0, 1, 0 );\n *\n * //no arguments; will be initialised to (0, 0, 0)\n * const b = new THREE.Vector3( );\n *\n * const d = a.distanceTo( b );\n * ```\n */\nclass Vector3 {\n\n\t/**\n\t * Constructs a new 3D vector.\n\t *\n\t * @param {number} [x=0] - The x value of this vector.\n\t * @param {number} [y=0] - The y value of this vector.\n\t * @param {number} [z=0] - The z value of this vector.\n\t */\n\tconstructor( x = 0, y = 0, z = 0 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tVector3.prototype.isVector3 = true;\n\n\t\t/**\n\t\t * The x value of this vector.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.x = x;\n\n\t\t/**\n\t\t * The y value of this vector.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.y = y;\n\n\t\t/**\n\t\t * The z value of this vector.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.z = z;\n\n\t}\n\n\t/**\n\t * Sets the vector components.\n\t *\n\t * @param {number} x - The value of the x component.\n\t * @param {number} y - The value of the y component.\n\t * @param {number} z - The value of the z component.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tset( x, y, z ) {\n\n\t\tif ( z === undefined ) z = this.z; // sprite.scale.set(x,y)\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector components to the same value.\n\t *\n\t * @param {number} scalar - The value to set for all vector components.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetScalar( scalar ) {\n\n\t\tthis.x = scalar;\n\t\tthis.y = scalar;\n\t\tthis.z = scalar;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector's x component to the given value\n\t *\n\t * @param {number} x - The value to set.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetX( x ) {\n\n\t\tthis.x = x;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector's y component to the given value\n\t *\n\t * @param {number} y - The value to set.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetY( y ) {\n\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector's z component to the given value\n\t *\n\t * @param {number} z - The value to set.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetZ( z ) {\n\n\t\tthis.z = z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Allows to set a vector component with an index.\n\t *\n\t * @param {number} index - The component index. `0` equals to x, `1` equals to y, `2` equals to z.\n\t * @param {number} value - The value to set.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetComponent( index, value ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: this.x = value; break;\n\t\t\tcase 1: this.y = value; break;\n\t\t\tcase 2: this.z = value; break;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the value of the vector component which matches the given index.\n\t *\n\t * @param {number} index - The component index. `0` equals to x, `1` equals to y, `2` equals to z.\n\t * @return {number} A vector component value.\n\t */\n\tgetComponent( index ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: return this.x;\n\t\t\tcase 1: return this.y;\n\t\t\tcase 2: return this.z;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns a new vector with copied values from this instance.\n\t *\n\t * @return {Vector3} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor( this.x, this.y, this.z );\n\n\t}\n\n\t/**\n\t * Copies the values of the given vector to this instance.\n\t *\n\t * @param {Vector3} v - The vector to copy.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tcopy( v ) {\n\n\t\tthis.x = v.x;\n\t\tthis.y = v.y;\n\t\tthis.z = v.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given vector to this instance.\n\t *\n\t * @param {Vector3} v - The vector to add.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tadd( v ) {\n\n\t\tthis.x += v.x;\n\t\tthis.y += v.y;\n\t\tthis.z += v.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given scalar value to all components of this instance.\n\t *\n\t * @param {number} s - The scalar to add.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\taddScalar( s ) {\n\n\t\tthis.x += s;\n\t\tthis.y += s;\n\t\tthis.z += s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given vectors and stores the result in this instance.\n\t *\n\t * @param {Vector3} a - The first vector.\n\t * @param {Vector3} b - The second vector.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\taddVectors( a, b ) {\n\n\t\tthis.x = a.x + b.x;\n\t\tthis.y = a.y + b.y;\n\t\tthis.z = a.z + b.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given vector scaled by the given factor to this instance.\n\t *\n\t * @param {Vector3|Vector4} v - The vector.\n\t * @param {number} s - The factor that scales `v`.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\taddScaledVector( v, s ) {\n\n\t\tthis.x += v.x * s;\n\t\tthis.y += v.y * s;\n\t\tthis.z += v.z * s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the given vector from this instance.\n\t *\n\t * @param {Vector3} v - The vector to subtract.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsub( v ) {\n\n\t\tthis.x -= v.x;\n\t\tthis.y -= v.y;\n\t\tthis.z -= v.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the given scalar value from all components of this instance.\n\t *\n\t * @param {number} s - The scalar to subtract.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsubScalar( s ) {\n\n\t\tthis.x -= s;\n\t\tthis.y -= s;\n\t\tthis.z -= s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the given vectors and stores the result in this instance.\n\t *\n\t * @param {Vector3} a - The first vector.\n\t * @param {Vector3} b - The second vector.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsubVectors( a, b ) {\n\n\t\tthis.x = a.x - b.x;\n\t\tthis.y = a.y - b.y;\n\t\tthis.z = a.z - b.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the given vector with this instance.\n\t *\n\t * @param {Vector3} v - The vector to multiply.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tmultiply( v ) {\n\n\t\tthis.x *= v.x;\n\t\tthis.y *= v.y;\n\t\tthis.z *= v.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the given scalar value with all components of this instance.\n\t *\n\t * @param {number} scalar - The scalar to multiply.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tmultiplyScalar( scalar ) {\n\n\t\tthis.x *= scalar;\n\t\tthis.y *= scalar;\n\t\tthis.z *= scalar;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the given vectors and stores the result in this instance.\n\t *\n\t * @param {Vector3} a - The first vector.\n\t * @param {Vector3} b - The second vector.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tmultiplyVectors( a, b ) {\n\n\t\tthis.x = a.x * b.x;\n\t\tthis.y = a.y * b.y;\n\t\tthis.z = a.z * b.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Applies the given Euler rotation to this vector.\n\t *\n\t * @param {Euler} euler - The Euler angles.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tapplyEuler( euler ) {\n\n\t\treturn this.applyQuaternion( _quaternion$4.setFromEuler( euler ) );\n\n\t}\n\n\t/**\n\t * Applies a rotation specified by an axis and an angle to this vector.\n\t *\n\t * @param {Vector3} axis - A normalized vector representing the rotation axis.\n\t * @param {number} angle - The angle in radians.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tapplyAxisAngle( axis, angle ) {\n\n\t\treturn this.applyQuaternion( _quaternion$4.setFromAxisAngle( axis, angle ) );\n\n\t}\n\n\t/**\n\t * Multiplies this vector with the given 3x3 matrix.\n\t *\n\t * @param {Matrix3} m - The 3x3 matrix.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tapplyMatrix3( m ) {\n\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ] * z;\n\t\tthis.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ] * z;\n\t\tthis.z = e[ 2 ] * x + e[ 5 ] * y + e[ 8 ] * z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies this vector by the given normal matrix and normalizes\n\t * the result.\n\t *\n\t * @param {Matrix3} m - The normal matrix.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tapplyNormalMatrix( m ) {\n\n\t\treturn this.applyMatrix3( m ).normalize();\n\n\t}\n\n\t/**\n\t * Multiplies this vector (with an implicit 1 in the 4th dimension) by m, and\n\t * divides by perspective.\n\t *\n\t * @param {Matrix4} m - The matrix to apply.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tapplyMatrix4( m ) {\n\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst e = m.elements;\n\n\t\tconst w = 1 / ( e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] );\n\n\t\tthis.x = ( e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] ) * w;\n\t\tthis.y = ( e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] ) * w;\n\t\tthis.z = ( e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] ) * w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Applies the given Quaternion to this vector.\n\t *\n\t * @param {Quaternion} q - The Quaternion.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tapplyQuaternion( q ) {\n\n\t\t// quaternion q is assumed to have unit length\n\n\t\tconst vx = this.x, vy = this.y, vz = this.z;\n\t\tconst qx = q.x, qy = q.y, qz = q.z, qw = q.w;\n\n\t\t// t = 2 * cross( q.xyz, v );\n\t\tconst tx = 2 * ( qy * vz - qz * vy );\n\t\tconst ty = 2 * ( qz * vx - qx * vz );\n\t\tconst tz = 2 * ( qx * vy - qy * vx );\n\n\t\t// v + q.w * t + cross( q.xyz, t );\n\t\tthis.x = vx + qw * tx + qy * tz - qz * ty;\n\t\tthis.y = vy + qw * ty + qz * tx - qx * tz;\n\t\tthis.z = vz + qw * tz + qx * ty - qy * tx;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Projects this vector from world space into the camera's normalized\n\t * device coordinate (NDC) space.\n\t *\n\t * @param {Camera} camera - The camera.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tproject( camera ) {\n\n\t\treturn this.applyMatrix4( camera.matrixWorldInverse ).applyMatrix4( camera.projectionMatrix );\n\n\t}\n\n\t/**\n\t * Unprojects this vector from the camera's normalized device coordinate (NDC)\n\t * space into world space.\n\t *\n\t * @param {Camera} camera - The camera.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tunproject( camera ) {\n\n\t\treturn this.applyMatrix4( camera.projectionMatrixInverse ).applyMatrix4( camera.matrixWorld );\n\n\t}\n\n\t/**\n\t * Transforms the direction of this vector by a matrix (the upper left 3 x 3\n\t * subset of the given 4x4 matrix and then normalizes the result.\n\t *\n\t * @param {Matrix4} m - The matrix.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\ttransformDirection( m ) {\n\n\t\t// input: THREE.Matrix4 affine matrix\n\t\t// vector interpreted as a direction\n\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z;\n\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z;\n\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z;\n\n\t\treturn this.normalize();\n\n\t}\n\n\t/**\n\t * Divides this instance by the given vector.\n\t *\n\t * @param {Vector3} v - The vector to divide.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tdivide( v ) {\n\n\t\tthis.x /= v.x;\n\t\tthis.y /= v.y;\n\t\tthis.z /= v.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Divides this vector by the given scalar.\n\t *\n\t * @param {number} scalar - The scalar to divide.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tdivideScalar( scalar ) {\n\n\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t}\n\n\t/**\n\t * If this vector's x, y or z value is greater than the given vector's x, y or z\n\t * value, replace that value with the corresponding min value.\n\t *\n\t * @param {Vector3} v - The vector.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tmin( v ) {\n\n\t\tthis.x = Math.min( this.x, v.x );\n\t\tthis.y = Math.min( this.y, v.y );\n\t\tthis.z = Math.min( this.z, v.z );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x, y or z value is less than the given vector's x, y or z\n\t * value, replace that value with the corresponding max value.\n\t *\n\t * @param {Vector3} v - The vector.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tmax( v ) {\n\n\t\tthis.x = Math.max( this.x, v.x );\n\t\tthis.y = Math.max( this.y, v.y );\n\t\tthis.z = Math.max( this.z, v.z );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x, y or z value is greater than the max vector's x, y or z\n\t * value, it is replaced by the corresponding value.\n\t * If this vector's x, y or z value is less than the min vector's x, y or z value,\n\t * it is replaced by the corresponding value.\n\t *\n\t * @param {Vector3} min - The minimum x, y and z values.\n\t * @param {Vector3} max - The maximum x, y and z values in the desired range.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tclamp( min, max ) {\n\n\t\t// assumes min < max, componentwise\n\n\t\tthis.x = clamp( this.x, min.x, max.x );\n\t\tthis.y = clamp( this.y, min.y, max.y );\n\t\tthis.z = clamp( this.z, min.z, max.z );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x, y or z values are greater than the max value, they are\n\t * replaced by the max value.\n\t * If this vector's x, y or z values are less than the min value, they are\n\t * replaced by the min value.\n\t *\n\t * @param {number} minVal - The minimum value the components will be clamped to.\n\t * @param {number} maxVal - The maximum value the components will be clamped to.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tclampScalar( minVal, maxVal ) {\n\n\t\tthis.x = clamp( this.x, minVal, maxVal );\n\t\tthis.y = clamp( this.y, minVal, maxVal );\n\t\tthis.z = clamp( this.z, minVal, maxVal );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's length is greater than the max value, it is replaced by\n\t * the max value.\n\t * If this vector's length is less than the min value, it is replaced by the\n\t * min value.\n\t *\n\t * @param {number} min - The minimum value the vector length will be clamped to.\n\t * @param {number} max - The maximum value the vector length will be clamped to.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tclampLength( min, max ) {\n\n\t\tconst length = this.length();\n\n\t\treturn this.divideScalar( length || 1 ).multiplyScalar( clamp( length, min, max ) );\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded down to the nearest integer value.\n\t *\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tfloor() {\n\n\t\tthis.x = Math.floor( this.x );\n\t\tthis.y = Math.floor( this.y );\n\t\tthis.z = Math.floor( this.z );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded up to the nearest integer value.\n\t *\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tceil() {\n\n\t\tthis.x = Math.ceil( this.x );\n\t\tthis.y = Math.ceil( this.y );\n\t\tthis.z = Math.ceil( this.z );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded to the nearest integer value\n\t *\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tround() {\n\n\t\tthis.x = Math.round( this.x );\n\t\tthis.y = Math.round( this.y );\n\t\tthis.z = Math.round( this.z );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded towards zero (up if negative,\n\t * down if positive) to an integer value.\n\t *\n\t * @return {Vector3} A reference to this vector.\n\t */\n\troundToZero() {\n\n\t\tthis.x = Math.trunc( this.x );\n\t\tthis.y = Math.trunc( this.y );\n\t\tthis.z = Math.trunc( this.z );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Inverts this vector - i.e. sets x = -x, y = -y and z = -z.\n\t *\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tnegate() {\n\n\t\tthis.x = - this.x;\n\t\tthis.y = - this.y;\n\t\tthis.z = - this.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Calculates the dot product of the given vector with this instance.\n\t *\n\t * @param {Vector3} v - The vector to compute the dot product with.\n\t * @return {number} The result of the dot product.\n\t */\n\tdot( v ) {\n\n\t\treturn this.x * v.x + this.y * v.y + this.z * v.z;\n\n\t}\n\n\t// TODO lengthSquared?\n\n\t/**\n\t * Computes the square of the Euclidean length (straight-line length) from\n\t * (0, 0, 0) to (x, y, z). If you are comparing the lengths of vectors, you should\n\t * compare the length squared instead as it is slightly more efficient to calculate.\n\t *\n\t * @return {number} The square length of this vector.\n\t */\n\tlengthSq() {\n\n\t\treturn this.x * this.x + this.y * this.y + this.z * this.z;\n\n\t}\n\n\t/**\n\t * Computes the  Euclidean length (straight-line length) from (0, 0, 0) to (x, y, z).\n\t *\n\t * @return {number} The length of this vector.\n\t */\n\tlength() {\n\n\t\treturn Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z );\n\n\t}\n\n\t/**\n\t * Computes the Manhattan length of this vector.\n\t *\n\t * @return {number} The length of this vector.\n\t */\n\tmanhattanLength() {\n\n\t\treturn Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z );\n\n\t}\n\n\t/**\n\t * Converts this vector to a unit vector - that is, sets it equal to a vector\n\t * with the same direction as this one, but with a vector length of `1`.\n\t *\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tnormalize() {\n\n\t\treturn this.divideScalar( this.length() || 1 );\n\n\t}\n\n\t/**\n\t * Sets this vector to a vector with the same direction as this one, but\n\t * with the specified length.\n\t *\n\t * @param {number} length - The new length of this vector.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetLength( length ) {\n\n\t\treturn this.normalize().multiplyScalar( length );\n\n\t}\n\n\t/**\n\t * Linearly interpolates between the given vector and this instance, where\n\t * alpha is the percent distance along the line - alpha = 0 will be this\n\t * vector, and alpha = 1 will be the given one.\n\t *\n\t * @param {Vector3} v - The vector to interpolate towards.\n\t * @param {number} alpha - The interpolation factor, typically in the closed interval `[0, 1]`.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tlerp( v, alpha ) {\n\n\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\tthis.y += ( v.y - this.y ) * alpha;\n\t\tthis.z += ( v.z - this.z ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Linearly interpolates between the given vectors, where alpha is the percent\n\t * distance along the line - alpha = 0 will be first vector, and alpha = 1 will\n\t * be the second one. The result is stored in this instance.\n\t *\n\t * @param {Vector3} v1 - The first vector.\n\t * @param {Vector3} v2 - The second vector.\n\t * @param {number} alpha - The interpolation factor, typically in the closed interval `[0, 1]`.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tlerpVectors( v1, v2, alpha ) {\n\n\t\tthis.x = v1.x + ( v2.x - v1.x ) * alpha;\n\t\tthis.y = v1.y + ( v2.y - v1.y ) * alpha;\n\t\tthis.z = v1.z + ( v2.z - v1.z ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Calculates the cross product of the given vector with this instance.\n\t *\n\t * @param {Vector3} v - The vector to compute the cross product with.\n\t * @return {Vector3} The result of the cross product.\n\t */\n\tcross( v ) {\n\n\t\treturn this.crossVectors( this, v );\n\n\t}\n\n\t/**\n\t * Calculates the cross product of the given vectors and stores the result\n\t * in this instance.\n\t *\n\t * @param {Vector3} a - The first vector.\n\t * @param {Vector3} b - The second vector.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tcrossVectors( a, b ) {\n\n\t\tconst ax = a.x, ay = a.y, az = a.z;\n\t\tconst bx = b.x, by = b.y, bz = b.z;\n\n\t\tthis.x = ay * bz - az * by;\n\t\tthis.y = az * bx - ax * bz;\n\t\tthis.z = ax * by - ay * bx;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Projects this vector onto the given one.\n\t *\n\t * @param {Vector3} v - The vector to project to.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tprojectOnVector( v ) {\n\n\t\tconst denominator = v.lengthSq();\n\n\t\tif ( denominator === 0 ) return this.set( 0, 0, 0 );\n\n\t\tconst scalar = v.dot( this ) / denominator;\n\n\t\treturn this.copy( v ).multiplyScalar( scalar );\n\n\t}\n\n\t/**\n\t * Projects this vector onto a plane by subtracting this\n\t * vector projected onto the plane's normal from this vector.\n\t *\n\t * @param {Vector3} planeNormal - The plane normal.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tprojectOnPlane( planeNormal ) {\n\n\t\t_vector$c.copy( this ).projectOnVector( planeNormal );\n\n\t\treturn this.sub( _vector$c );\n\n\t}\n\n\t/**\n\t * Reflects this vector off a plane orthogonal to the given normal vector.\n\t *\n\t * @param {Vector3} normal - The (normalized) normal vector.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\treflect( normal ) {\n\n\t\treturn this.sub( _vector$c.copy( normal ).multiplyScalar( 2 * this.dot( normal ) ) );\n\n\t}\n\t/**\n\t * Returns the angle between the given vector and this instance in radians.\n\t *\n\t * @param {Vector3} v - The vector to compute the angle with.\n\t * @return {number} The angle in radians.\n\t */\n\tangleTo( v ) {\n\n\t\tconst denominator = Math.sqrt( this.lengthSq() * v.lengthSq() );\n\n\t\tif ( denominator === 0 ) return Math.PI / 2;\n\n\t\tconst theta = this.dot( v ) / denominator;\n\n\t\t// clamp, to handle numerical problems\n\n\t\treturn Math.acos( clamp( theta, -1, 1 ) );\n\n\t}\n\n\t/**\n\t * Computes the distance from the given vector to this instance.\n\t *\n\t * @param {Vector3} v - The vector to compute the distance to.\n\t * @return {number} The distance.\n\t */\n\tdistanceTo( v ) {\n\n\t\treturn Math.sqrt( this.distanceToSquared( v ) );\n\n\t}\n\n\t/**\n\t * Computes the squared distance from the given vector to this instance.\n\t * If you are just comparing the distance with another distance, you should compare\n\t * the distance squared instead as it is slightly more efficient to calculate.\n\t *\n\t * @param {Vector3} v - The vector to compute the squared distance to.\n\t * @return {number} The squared distance.\n\t */\n\tdistanceToSquared( v ) {\n\n\t\tconst dx = this.x - v.x, dy = this.y - v.y, dz = this.z - v.z;\n\n\t\treturn dx * dx + dy * dy + dz * dz;\n\n\t}\n\n\t/**\n\t * Computes the Manhattan distance from the given vector to this instance.\n\t *\n\t * @param {Vector3} v - The vector to compute the Manhattan distance to.\n\t * @return {number} The Manhattan distance.\n\t */\n\tmanhattanDistanceTo( v ) {\n\n\t\treturn Math.abs( this.x - v.x ) + Math.abs( this.y - v.y ) + Math.abs( this.z - v.z );\n\n\t}\n\n\t/**\n\t * Sets the vector components from the given spherical coordinates.\n\t *\n\t * @param {Spherical} s - The spherical coordinates.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromSpherical( s ) {\n\n\t\treturn this.setFromSphericalCoords( s.radius, s.phi, s.theta );\n\n\t}\n\n\t/**\n\t * Sets the vector components from the given spherical coordinates.\n\t *\n\t * @param {number} radius - The radius.\n\t * @param {number} phi - The phi angle in radians.\n\t * @param {number} theta - The theta angle in radians.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromSphericalCoords( radius, phi, theta ) {\n\n\t\tconst sinPhiRadius = Math.sin( phi ) * radius;\n\n\t\tthis.x = sinPhiRadius * Math.sin( theta );\n\t\tthis.y = Math.cos( phi ) * radius;\n\t\tthis.z = sinPhiRadius * Math.cos( theta );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector components from the given cylindrical coordinates.\n\t *\n\t * @param {Cylindrical} c - The cylindrical coordinates.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromCylindrical( c ) {\n\n\t\treturn this.setFromCylindricalCoords( c.radius, c.theta, c.y );\n\n\t}\n\n\t/**\n\t * Sets the vector components from the given cylindrical coordinates.\n\t *\n\t * @param {number} radius - The radius.\n\t * @param {number} theta - The theta angle in radians.\n\t * @param {number} y - The y value.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromCylindricalCoords( radius, theta, y ) {\n\n\t\tthis.x = radius * Math.sin( theta );\n\t\tthis.y = y;\n\t\tthis.z = radius * Math.cos( theta );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector components to the position elements of the\n\t * given transformation matrix.\n\t *\n\t * @param {Matrix4} m - The 4x4 matrix.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromMatrixPosition( m ) {\n\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 12 ];\n\t\tthis.y = e[ 13 ];\n\t\tthis.z = e[ 14 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector components to the scale elements of the\n\t * given transformation matrix.\n\t *\n\t * @param {Matrix4} m - The 4x4 matrix.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromMatrixScale( m ) {\n\n\t\tconst sx = this.setFromMatrixColumn( m, 0 ).length();\n\t\tconst sy = this.setFromMatrixColumn( m, 1 ).length();\n\t\tconst sz = this.setFromMatrixColumn( m, 2 ).length();\n\n\t\tthis.x = sx;\n\t\tthis.y = sy;\n\t\tthis.z = sz;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector components from the specified matrix column.\n\t *\n\t * @param {Matrix4} m - The 4x4 matrix.\n\t * @param {number} index - The column index.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromMatrixColumn( m, index ) {\n\n\t\treturn this.fromArray( m.elements, index * 4 );\n\n\t}\n\n\t/**\n\t * Sets the vector components from the specified matrix column.\n\t *\n\t * @param {Matrix3} m - The 3x3 matrix.\n\t * @param {number} index - The column index.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromMatrix3Column( m, index ) {\n\n\t\treturn this.fromArray( m.elements, index * 3 );\n\n\t}\n\n\t/**\n\t * Sets the vector components from the given Euler angles.\n\t *\n\t * @param {Euler} e - The Euler angles to set.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromEuler( e ) {\n\n\t\tthis.x = e._x;\n\t\tthis.y = e._y;\n\t\tthis.z = e._z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector components from the RGB components of the\n\t * given color.\n\t *\n\t * @param {Color} c - The color to set.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromColor( c ) {\n\n\t\tthis.x = c.r;\n\t\tthis.y = c.g;\n\t\tthis.z = c.b;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this vector is equal with the given one.\n\t *\n\t * @param {Vector3} v - The vector to test for equality.\n\t * @return {boolean} Whether this vector is equal with the given one.\n\t */\n\tequals( v ) {\n\n\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) );\n\n\t}\n\n\t/**\n\t * Sets this vector's x value to be `array[ offset ]`, y value to be `array[ offset + 1 ]`\n\t * and z value to be `array[ offset + 2 ]`.\n\t *\n\t * @param {Array<number>} array - An array holding the vector component values.\n\t * @param {number} [offset=0] - The offset into the array.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis.x = array[ offset ];\n\t\tthis.y = array[ offset + 1 ];\n\t\tthis.z = array[ offset + 2 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Writes the components of this vector to the given array. If no array is provided,\n\t * the method returns a new instance.\n\t *\n\t * @param {Array<number>} [array=[]] - The target array holding the vector components.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Array<number>} The vector components.\n\t */\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this.x;\n\t\tarray[ offset + 1 ] = this.y;\n\t\tarray[ offset + 2 ] = this.z;\n\n\t\treturn array;\n\n\t}\n\n\t/**\n\t * Sets the components of this vector from the given buffer attribute.\n\t *\n\t * @param {BufferAttribute} attribute - The buffer attribute holding vector data.\n\t * @param {number} index - The index into the attribute.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tfromBufferAttribute( attribute, index ) {\n\n\t\tthis.x = attribute.getX( index );\n\t\tthis.y = attribute.getY( index );\n\t\tthis.z = attribute.getZ( index );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets each component of this vector to a pseudo-random value between `0` and\n\t * `1`, excluding `1`.\n\t *\n\t * @return {Vector3} A reference to this vector.\n\t */\n\trandom() {\n\n\t\tthis.x = Math.random();\n\t\tthis.y = Math.random();\n\t\tthis.z = Math.random();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this vector to a uniformly random point on a unit sphere.\n\t *\n\t * @return {Vector3} A reference to this vector.\n\t */\n\trandomDirection() {\n\n\t\t// https://mathworld.wolfram.com/SpherePointPicking.html\n\n\t\tconst theta = Math.random() * Math.PI * 2;\n\t\tconst u = Math.random() * 2 - 1;\n\t\tconst c = Math.sqrt( 1 - u * u );\n\n\t\tthis.x = c * Math.cos( theta );\n\t\tthis.y = u;\n\t\tthis.z = c * Math.sin( theta );\n\n\t\treturn this;\n\n\t}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this.x;\n\t\tyield this.y;\n\t\tyield this.z;\n\n\t}\n\n}\n\nconst _vector$c = /*@__PURE__*/ new Vector3();\nconst _quaternion$4 = /*@__PURE__*/ new Quaternion();\n\n/**\n * Represents a 3x3 matrix.\n *\n * A Note on Row-Major and Column-Major Ordering:\n *\n * The constructor and {@link Matrix3#set} method take arguments in\n * [row-major](https://en.wikipedia.org/wiki/Row-_and_column-major_order#Column-major_order)\n * order, while internally they are stored in the {@link Matrix3#elements} array in column-major order.\n * This means that calling:\n * ```js\n * const m = new THREE.Matrix();\n * m.set( 11, 12, 13,\n *        21, 22, 23,\n *        31, 32, 33 );\n * ```\n * will result in the elements array containing:\n * ```js\n * m.elements = [ 11, 21, 31,\n *                12, 22, 32,\n *                13, 23, 33 ];\n * ```\n * and internally all calculations are performed using column-major ordering.\n * However, as the actual ordering makes no difference mathematically and\n * most people are used to thinking about matrices in row-major order, the\n * three.js documentation shows matrices in row-major order. Just bear in\n * mind that if you are reading the source code, you'll have to take the\n * transpose of any matrices outlined here to make sense of the calculations.\n */\nclass Matrix3 {\n\n\t/**\n\t * Constructs a new 3x3 matrix. The arguments are supposed to be\n\t * in row-major order. If no arguments are provided, the constructor\n\t * initializes the matrix as an identity matrix.\n\t *\n\t * @param {number} [n11] - 1-1 matrix element.\n\t * @param {number} [n12] - 1-2 matrix element.\n\t * @param {number} [n13] - 1-3 matrix element.\n\t * @param {number} [n21] - 2-1 matrix element.\n\t * @param {number} [n22] - 2-2 matrix element.\n\t * @param {number} [n23] - 2-3 matrix element.\n\t * @param {number} [n31] - 3-1 matrix element.\n\t * @param {number} [n32] - 3-2 matrix element.\n\t * @param {number} [n33] - 3-3 matrix element.\n\t */\n\tconstructor( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tMatrix3.prototype.isMatrix3 = true;\n\n\t\t/**\n\t\t * A column-major list of matrix values.\n\t\t *\n\t\t * @type {Array<number>}\n\t\t */\n\t\tthis.elements = [\n\n\t\t\t1, 0, 0,\n\t\t\t0, 1, 0,\n\t\t\t0, 0, 1\n\n\t\t];\n\n\t\tif ( n11 !== undefined ) {\n\n\t\t\tthis.set( n11, n12, n13, n21, n22, n23, n31, n32, n33 );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the elements of the matrix.The arguments are supposed to be\n\t * in row-major order.\n\t *\n\t * @param {number} [n11] - 1-1 matrix element.\n\t * @param {number} [n12] - 1-2 matrix element.\n\t * @param {number} [n13] - 1-3 matrix element.\n\t * @param {number} [n21] - 2-1 matrix element.\n\t * @param {number} [n22] - 2-2 matrix element.\n\t * @param {number} [n23] - 2-3 matrix element.\n\t * @param {number} [n31] - 3-1 matrix element.\n\t * @param {number} [n32] - 3-2 matrix element.\n\t * @param {number} [n33] - 3-3 matrix element.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tset( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] = n11; te[ 1 ] = n21; te[ 2 ] = n31;\n\t\tte[ 3 ] = n12; te[ 4 ] = n22; te[ 5 ] = n32;\n\t\tte[ 6 ] = n13; te[ 7 ] = n23; te[ 8 ] = n33;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix to the 3x3 identity matrix.\n\t *\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tidentity() {\n\n\t\tthis.set(\n\n\t\t\t1, 0, 0,\n\t\t\t0, 1, 0,\n\t\t\t0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the values of the given matrix to this instance.\n\t *\n\t * @param {Matrix3} m - The matrix to copy.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tcopy( m ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = m.elements;\n\n\t\tte[ 0 ] = me[ 0 ]; te[ 1 ] = me[ 1 ]; te[ 2 ] = me[ 2 ];\n\t\tte[ 3 ] = me[ 3 ]; te[ 4 ] = me[ 4 ]; te[ 5 ] = me[ 5 ];\n\t\tte[ 6 ] = me[ 6 ]; te[ 7 ] = me[ 7 ]; te[ 8 ] = me[ 8 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Extracts the basis of this matrix into the three axis vectors provided.\n\t *\n\t * @param {Vector3} xAxis - The basis's x axis.\n\t * @param {Vector3} yAxis - The basis's y axis.\n\t * @param {Vector3} zAxis - The basis's z axis.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\textractBasis( xAxis, yAxis, zAxis ) {\n\n\t\txAxis.setFromMatrix3Column( this, 0 );\n\t\tyAxis.setFromMatrix3Column( this, 1 );\n\t\tzAxis.setFromMatrix3Column( this, 2 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Set this matrix to the upper 3x3 matrix of the given 4x4 matrix.\n\t *\n\t * @param {Matrix4} m - The 4x4 matrix.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tsetFromMatrix4( m ) {\n\n\t\tconst me = m.elements;\n\n\t\tthis.set(\n\n\t\t\tme[ 0 ], me[ 4 ], me[ 8 ],\n\t\t\tme[ 1 ], me[ 5 ], me[ 9 ],\n\t\t\tme[ 2 ], me[ 6 ], me[ 10 ]\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Post-multiplies this matrix by the given 3x3 matrix.\n\t *\n\t * @param {Matrix3} m - The matrix to multiply with.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tmultiply( m ) {\n\n\t\treturn this.multiplyMatrices( this, m );\n\n\t}\n\n\t/**\n\t * Pre-multiplies this matrix by the given 3x3 matrix.\n\t *\n\t * @param {Matrix3} m - The matrix to multiply with.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tpremultiply( m ) {\n\n\t\treturn this.multiplyMatrices( m, this );\n\n\t}\n\n\t/**\n\t * Multiples the given 3x3 matrices and stores the result\n\t * in this matrix.\n\t *\n\t * @param {Matrix3} a - The first matrix.\n\t * @param {Matrix3} b - The second matrix.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tmultiplyMatrices( a, b ) {\n\n\t\tconst ae = a.elements;\n\t\tconst be = b.elements;\n\t\tconst te = this.elements;\n\n\t\tconst a11 = ae[ 0 ], a12 = ae[ 3 ], a13 = ae[ 6 ];\n\t\tconst a21 = ae[ 1 ], a22 = ae[ 4 ], a23 = ae[ 7 ];\n\t\tconst a31 = ae[ 2 ], a32 = ae[ 5 ], a33 = ae[ 8 ];\n\n\t\tconst b11 = be[ 0 ], b12 = be[ 3 ], b13 = be[ 6 ];\n\t\tconst b21 = be[ 1 ], b22 = be[ 4 ], b23 = be[ 7 ];\n\t\tconst b31 = be[ 2 ], b32 = be[ 5 ], b33 = be[ 8 ];\n\n\t\tte[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31;\n\t\tte[ 3 ] = a11 * b12 + a12 * b22 + a13 * b32;\n\t\tte[ 6 ] = a11 * b13 + a12 * b23 + a13 * b33;\n\n\t\tte[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31;\n\t\tte[ 4 ] = a21 * b12 + a22 * b22 + a23 * b32;\n\t\tte[ 7 ] = a21 * b13 + a22 * b23 + a23 * b33;\n\n\t\tte[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31;\n\t\tte[ 5 ] = a31 * b12 + a32 * b22 + a33 * b32;\n\t\tte[ 8 ] = a31 * b13 + a32 * b23 + a33 * b33;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies every component of the matrix by the given scalar.\n\t *\n\t * @param {number} s - The scalar.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tmultiplyScalar( s ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] *= s; te[ 3 ] *= s; te[ 6 ] *= s;\n\t\tte[ 1 ] *= s; te[ 4 ] *= s; te[ 7 ] *= s;\n\t\tte[ 2 ] *= s; te[ 5 ] *= s; te[ 8 ] *= s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes and returns the determinant of this matrix.\n\t *\n\t * @return {number} The determinant.\n\t */\n\tdeterminant() {\n\n\t\tconst te = this.elements;\n\n\t\tconst a = te[ 0 ], b = te[ 1 ], c = te[ 2 ],\n\t\t\td = te[ 3 ], e = te[ 4 ], f = te[ 5 ],\n\t\t\tg = te[ 6 ], h = te[ 7 ], i = te[ 8 ];\n\n\t\treturn a * e * i - a * f * h - b * d * i + b * f * g + c * d * h - c * e * g;\n\n\t}\n\n\t/**\n\t * Inverts this matrix, using the [analytic method](https://en.wikipedia.org/wiki/Invertible_matrix#Analytic_solution).\n\t * You can not invert with a determinant of zero. If you attempt this, the method produces\n\t * a zero matrix instead.\n\t *\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tinvert() {\n\n\t\tconst te = this.elements,\n\n\t\t\tn11 = te[ 0 ], n21 = te[ 1 ], n31 = te[ 2 ],\n\t\t\tn12 = te[ 3 ], n22 = te[ 4 ], n32 = te[ 5 ],\n\t\t\tn13 = te[ 6 ], n23 = te[ 7 ], n33 = te[ 8 ],\n\n\t\t\tt11 = n33 * n22 - n32 * n23,\n\t\t\tt12 = n32 * n13 - n33 * n12,\n\t\t\tt13 = n23 * n12 - n22 * n13,\n\n\t\t\tdet = n11 * t11 + n21 * t12 + n31 * t13;\n\n\t\tif ( det === 0 ) return this.set( 0, 0, 0, 0, 0, 0, 0, 0, 0 );\n\n\t\tconst detInv = 1 / det;\n\n\t\tte[ 0 ] = t11 * detInv;\n\t\tte[ 1 ] = ( n31 * n23 - n33 * n21 ) * detInv;\n\t\tte[ 2 ] = ( n32 * n21 - n31 * n22 ) * detInv;\n\n\t\tte[ 3 ] = t12 * detInv;\n\t\tte[ 4 ] = ( n33 * n11 - n31 * n13 ) * detInv;\n\t\tte[ 5 ] = ( n31 * n12 - n32 * n11 ) * detInv;\n\n\t\tte[ 6 ] = t13 * detInv;\n\t\tte[ 7 ] = ( n21 * n13 - n23 * n11 ) * detInv;\n\t\tte[ 8 ] = ( n22 * n11 - n21 * n12 ) * detInv;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Transposes this matrix in place.\n\t *\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\ttranspose() {\n\n\t\tlet tmp;\n\t\tconst m = this.elements;\n\n\t\ttmp = m[ 1 ]; m[ 1 ] = m[ 3 ]; m[ 3 ] = tmp;\n\t\ttmp = m[ 2 ]; m[ 2 ] = m[ 6 ]; m[ 6 ] = tmp;\n\t\ttmp = m[ 5 ]; m[ 5 ] = m[ 7 ]; m[ 7 ] = tmp;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes the normal matrix which is the inverse transpose of the upper\n\t * left 3x3 portion of the given 4x4 matrix.\n\t *\n\t * @param {Matrix4} matrix4 - The 4x4 matrix.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tgetNormalMatrix( matrix4 ) {\n\n\t\treturn this.setFromMatrix4( matrix4 ).invert().transpose();\n\n\t}\n\n\t/**\n\t * Transposes this matrix into the supplied array, and returns itself unchanged.\n\t *\n\t * @param {Array<number>} r - An array to store the transposed matrix elements.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\ttransposeIntoArray( r ) {\n\n\t\tconst m = this.elements;\n\n\t\tr[ 0 ] = m[ 0 ];\n\t\tr[ 1 ] = m[ 3 ];\n\t\tr[ 2 ] = m[ 6 ];\n\t\tr[ 3 ] = m[ 1 ];\n\t\tr[ 4 ] = m[ 4 ];\n\t\tr[ 5 ] = m[ 7 ];\n\t\tr[ 6 ] = m[ 2 ];\n\t\tr[ 7 ] = m[ 5 ];\n\t\tr[ 8 ] = m[ 8 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the UV transform matrix from offset, repeat, rotation, and center.\n\t *\n\t * @param {number} tx - Offset x.\n\t * @param {number} ty - Offset y.\n\t * @param {number} sx - Repeat x.\n\t * @param {number} sy - Repeat y.\n\t * @param {number} rotation - Rotation, in radians. Positive values rotate counterclockwise.\n\t * @param {number} cx - Center x of rotation.\n\t * @param {number} cy - Center y of rotation\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tsetUvTransform( tx, ty, sx, sy, rotation, cx, cy ) {\n\n\t\tconst c = Math.cos( rotation );\n\t\tconst s = Math.sin( rotation );\n\n\t\tthis.set(\n\t\t\tsx * c, sx * s, - sx * ( c * cx + s * cy ) + cx + tx,\n\t\t\t- sy * s, sy * c, - sy * ( - s * cx + c * cy ) + cy + ty,\n\t\t\t0, 0, 1\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Scales this matrix with the given scalar values.\n\t *\n\t * @param {number} sx - The amount to scale in the X axis.\n\t * @param {number} sy - The amount to scale in the Y axis.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tscale( sx, sy ) {\n\n\t\tthis.premultiply( _m3.makeScale( sx, sy ) );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Rotates this matrix by the given angle.\n\t *\n\t * @param {number} theta - The rotation in radians.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\trotate( theta ) {\n\n\t\tthis.premultiply( _m3.makeRotation( - theta ) );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Translates this matrix by the given scalar values.\n\t *\n\t * @param {number} tx - The amount to translate in the X axis.\n\t * @param {number} ty - The amount to translate in the Y axis.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\ttranslate( tx, ty ) {\n\n\t\tthis.premultiply( _m3.makeTranslation( tx, ty ) );\n\n\t\treturn this;\n\n\t}\n\n\t// for 2D Transforms\n\n\t/**\n\t * Sets this matrix as a 2D translation transform.\n\t *\n\t * @param {number|Vector2} x - The amount to translate in the X axis or alternatively a translation vector.\n\t * @param {number} y - The amount to translate in the Y axis.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tmakeTranslation( x, y ) {\n\n\t\tif ( x.isVector2 ) {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, x.x,\n\t\t\t\t0, 1, x.y,\n\t\t\t\t0, 0, 1\n\n\t\t\t);\n\n\t\t} else {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, x,\n\t\t\t\t0, 1, y,\n\t\t\t\t0, 0, 1\n\n\t\t\t);\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix as a 2D rotational transformation.\n\t *\n\t * @param {number} theta - The rotation in radians.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tmakeRotation( theta ) {\n\n\t\t// counterclockwise\n\n\t\tconst c = Math.cos( theta );\n\t\tconst s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\tc, - s, 0,\n\t\t\ts, c, 0,\n\t\t\t0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix as a 2D scale transform.\n\t *\n\t * @param {number} x - The amount to scale in the X axis.\n\t * @param {number} y - The amount to scale in the Y axis.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tmakeScale( x, y ) {\n\n\t\tthis.set(\n\n\t\t\tx, 0, 0,\n\t\t\t0, y, 0,\n\t\t\t0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this matrix is equal with the given one.\n\t *\n\t * @param {Matrix3} matrix - The matrix to test for equality.\n\t * @return {boolean} Whether this matrix is equal with the given one.\n\t */\n\tequals( matrix ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = matrix.elements;\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tif ( te[ i ] !== me[ i ] ) return false;\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\t/**\n\t * Sets the elements of the matrix from the given array.\n\t *\n\t * @param {Array<number>} array - The matrix elements in column-major order.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tfromArray( array, offset = 0 ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Writes the elements of this matrix to the given array. If no array is provided,\n\t * the method returns a new instance.\n\t *\n\t * @param {Array<number>} [array=[]] - The target array holding the matrix elements in column-major order.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Array<number>} The matrix elements in column-major order.\n\t */\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tconst te = this.elements;\n\n\t\tarray[ offset ] = te[ 0 ];\n\t\tarray[ offset + 1 ] = te[ 1 ];\n\t\tarray[ offset + 2 ] = te[ 2 ];\n\n\t\tarray[ offset + 3 ] = te[ 3 ];\n\t\tarray[ offset + 4 ] = te[ 4 ];\n\t\tarray[ offset + 5 ] = te[ 5 ];\n\n\t\tarray[ offset + 6 ] = te[ 6 ];\n\t\tarray[ offset + 7 ] = te[ 7 ];\n\t\tarray[ offset + 8 ] = te[ 8 ];\n\n\t\treturn array;\n\n\t}\n\n\t/**\n\t * Returns a matrix with copied values from this instance.\n\t *\n\t * @return {Matrix3} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().fromArray( this.elements );\n\n\t}\n\n}\n\nconst _m3 = /*@__PURE__*/ new Matrix3();\n\nconst LINEAR_REC709_TO_XYZ = /*@__PURE__*/ new Matrix3().set(\n\t0.4123908, 0.3575843, 0.1804808,\n\t0.2126390, 0.7151687, 0.0721923,\n\t0.0193308, 0.1191948, 0.9505322\n);\n\nconst XYZ_TO_LINEAR_REC709 = /*@__PURE__*/ new Matrix3().set(\n\t3.2409699, -1.5373832, -0.4986108,\n\t-0.9692436, 1.8759675, 0.0415551,\n\t0.0556301, -0.203977, 1.0569715\n);\n\nfunction createColorManagement() {\n\n\tconst ColorManagement = {\n\n\t\tenabled: true,\n\n\t\tworkingColorSpace: LinearSRGBColorSpace,\n\n\t\t/**\n\t\t * Implementations of supported color spaces.\n\t\t *\n\t\t * Required:\n\t\t *\t- primaries: chromaticity coordinates [ rx ry gx gy bx by ]\n\t\t *\t- whitePoint: reference white [ x y ]\n\t\t *\t- transfer: transfer function (pre-defined)\n\t\t *\t- toXYZ: Matrix3 RGB to XYZ transform\n\t\t *\t- fromXYZ: Matrix3 XYZ to RGB transform\n\t\t *\t- luminanceCoefficients: RGB luminance coefficients\n\t\t *\n\t\t * Optional:\n\t\t *  - outputColorSpaceConfig: { drawingBufferColorSpace: ColorSpace, toneMappingMode: 'extended' | 'standard' }\n\t\t *  - workingColorSpaceConfig: { unpackColorSpace: ColorSpace }\n\t\t *\n\t\t * Reference:\n\t\t * - https://www.russellcottrell.com/photo/matrixCalculator.htm\n\t\t */\n\t\tspaces: {},\n\n\t\tconvert: function ( color, sourceColorSpace, targetColorSpace ) {\n\n\t\t\tif ( this.enabled === false || sourceColorSpace === targetColorSpace || ! sourceColorSpace || ! targetColorSpace ) {\n\n\t\t\t\treturn color;\n\n\t\t\t}\n\n\t\t\tif ( this.spaces[ sourceColorSpace ].transfer === SRGBTransfer ) {\n\n\t\t\t\tcolor.r = SRGBToLinear( color.r );\n\t\t\t\tcolor.g = SRGBToLinear( color.g );\n\t\t\t\tcolor.b = SRGBToLinear( color.b );\n\n\t\t\t}\n\n\t\t\tif ( this.spaces[ sourceColorSpace ].primaries !== this.spaces[ targetColorSpace ].primaries ) {\n\n\t\t\t\tcolor.applyMatrix3( this.spaces[ sourceColorSpace ].toXYZ );\n\t\t\t\tcolor.applyMatrix3( this.spaces[ targetColorSpace ].fromXYZ );\n\n\t\t\t}\n\n\t\t\tif ( this.spaces[ targetColorSpace ].transfer === SRGBTransfer ) {\n\n\t\t\t\tcolor.r = LinearToSRGB( color.r );\n\t\t\t\tcolor.g = LinearToSRGB( color.g );\n\t\t\t\tcolor.b = LinearToSRGB( color.b );\n\n\t\t\t}\n\n\t\t\treturn color;\n\n\t\t},\n\n\t\tworkingToColorSpace: function ( color, targetColorSpace ) {\n\n\t\t\treturn this.convert( color, this.workingColorSpace, targetColorSpace );\n\n\t\t},\n\n\t\tcolorSpaceToWorking: function ( color, sourceColorSpace ) {\n\n\t\t\treturn this.convert( color, sourceColorSpace, this.workingColorSpace );\n\n\t\t},\n\n\t\tgetPrimaries: function ( colorSpace ) {\n\n\t\t\treturn this.spaces[ colorSpace ].primaries;\n\n\t\t},\n\n\t\tgetTransfer: function ( colorSpace ) {\n\n\t\t\tif ( colorSpace === NoColorSpace ) return LinearTransfer;\n\n\t\t\treturn this.spaces[ colorSpace ].transfer;\n\n\t\t},\n\n\t\tgetToneMappingMode: function ( colorSpace ) {\n\n\t\t\treturn this.spaces[ colorSpace ].outputColorSpaceConfig.toneMappingMode || 'standard';\n\n\t\t},\n\n\t\tgetLuminanceCoefficients: function ( target, colorSpace = this.workingColorSpace ) {\n\n\t\t\treturn target.fromArray( this.spaces[ colorSpace ].luminanceCoefficients );\n\n\t\t},\n\n\t\tdefine: function ( colorSpaces ) {\n\n\t\t\tObject.assign( this.spaces, colorSpaces );\n\n\t\t},\n\n\t\t// Internal APIs\n\n\t\t_getMatrix: function ( targetMatrix, sourceColorSpace, targetColorSpace ) {\n\n\t\t\treturn targetMatrix\n\t\t\t\t.copy( this.spaces[ sourceColorSpace ].toXYZ )\n\t\t\t\t.multiply( this.spaces[ targetColorSpace ].fromXYZ );\n\n\t\t},\n\n\t\t_getDrawingBufferColorSpace: function ( colorSpace ) {\n\n\t\t\treturn this.spaces[ colorSpace ].outputColorSpaceConfig.drawingBufferColorSpace;\n\n\t\t},\n\n\t\t_getUnpackColorSpace: function ( colorSpace = this.workingColorSpace ) {\n\n\t\t\treturn this.spaces[ colorSpace ].workingColorSpaceConfig.unpackColorSpace;\n\n\t\t},\n\n\t\t// Deprecated\n\n\t\tfromWorkingColorSpace: function ( color, targetColorSpace ) {\n\n\t\t\twarnOnce( 'ColorManagement: .fromWorkingColorSpace() has been renamed to .workingToColorSpace().' ); // @deprecated, r177\n\n\t\t\treturn ColorManagement.workingToColorSpace( color, targetColorSpace );\n\n\t\t},\n\n\t\ttoWorkingColorSpace: function ( color, sourceColorSpace ) {\n\n\t\t\twarnOnce( 'ColorManagement: .toWorkingColorSpace() has been renamed to .colorSpaceToWorking().' ); // @deprecated, r177\n\n\t\t\treturn ColorManagement.colorSpaceToWorking( color, sourceColorSpace );\n\n\t\t},\n\n\t};\n\n\t/******************************************************************************\n\t * sRGB definitions\n\t */\n\n\tconst REC709_PRIMARIES = [ 0.640, 0.330, 0.300, 0.600, 0.150, 0.060 ];\n\tconst REC709_LUMINANCE_COEFFICIENTS = [ 0.2126, 0.7152, 0.0722 ];\n\tconst D65 = [ 0.3127, 0.3290 ];\n\n\tColorManagement.define( {\n\n\t\t[ LinearSRGBColorSpace ]: {\n\t\t\tprimaries: REC709_PRIMARIES,\n\t\t\twhitePoint: D65,\n\t\t\ttransfer: LinearTransfer,\n\t\t\ttoXYZ: LINEAR_REC709_TO_XYZ,\n\t\t\tfromXYZ: XYZ_TO_LINEAR_REC709,\n\t\t\tluminanceCoefficients: REC709_LUMINANCE_COEFFICIENTS,\n\t\t\tworkingColorSpaceConfig: { unpackColorSpace: SRGBColorSpace },\n\t\t\toutputColorSpaceConfig: { drawingBufferColorSpace: SRGBColorSpace }\n\t\t},\n\n\t\t[ SRGBColorSpace ]: {\n\t\t\tprimaries: REC709_PRIMARIES,\n\t\t\twhitePoint: D65,\n\t\t\ttransfer: SRGBTransfer,\n\t\t\ttoXYZ: LINEAR_REC709_TO_XYZ,\n\t\t\tfromXYZ: XYZ_TO_LINEAR_REC709,\n\t\t\tluminanceCoefficients: REC709_LUMINANCE_COEFFICIENTS,\n\t\t\toutputColorSpaceConfig: { drawingBufferColorSpace: SRGBColorSpace }\n\t\t},\n\n\t} );\n\n\treturn ColorManagement;\n\n}\n\nconst ColorManagement = /*@__PURE__*/ createColorManagement();\n\nfunction SRGBToLinear( c ) {\n\n\treturn ( c < 0.04045 ) ? c * 0.0773993808 : Math.pow( c * 0.9478672986 + 0.0521327014, 2.4 );\n\n}\n\nfunction LinearToSRGB( c ) {\n\n\treturn ( c < 0.0031308 ) ? c * 12.92 : 1.055 * ( Math.pow( c, 0.41666 ) ) - 0.055;\n\n}\n\nlet _canvas;\n\n/**\n * A class containing utility functions for images.\n *\n * @hideconstructor\n */\nclass ImageUtils {\n\n\t/**\n\t * Returns a data URI containing a representation of the given image.\n\t *\n\t * @param {(HTMLImageElement|HTMLCanvasElement)} image - The image object.\n\t * @param {string} [type='image/png'] - Indicates the image format.\n\t * @return {string} The data URI.\n\t */\n\tstatic getDataURL( image, type = 'image/png' ) {\n\n\t\tif ( /^data:/i.test( image.src ) ) {\n\n\t\t\treturn image.src;\n\n\t\t}\n\n\t\tif ( typeof HTMLCanvasElement === 'undefined' ) {\n\n\t\t\treturn image.src;\n\n\t\t}\n\n\t\tlet canvas;\n\n\t\tif ( image instanceof HTMLCanvasElement ) {\n\n\t\t\tcanvas = image;\n\n\t\t} else {\n\n\t\t\tif ( _canvas === undefined ) _canvas = createElementNS( 'canvas' );\n\n\t\t\t_canvas.width = image.width;\n\t\t\t_canvas.height = image.height;\n\n\t\t\tconst context = _canvas.getContext( '2d' );\n\n\t\t\tif ( image instanceof ImageData ) {\n\n\t\t\t\tcontext.putImageData( image, 0, 0 );\n\n\t\t\t} else {\n\n\t\t\t\tcontext.drawImage( image, 0, 0, image.width, image.height );\n\n\t\t\t}\n\n\t\t\tcanvas = _canvas;\n\n\t\t}\n\n\t\treturn canvas.toDataURL( type );\n\n\t}\n\n\t/**\n\t * Converts the given sRGB image data to linear color space.\n\t *\n\t * @param {(HTMLImageElement|HTMLCanvasElement|ImageBitmap|Object)} image - The image object.\n\t * @return {HTMLCanvasElement|Object} The converted image.\n\t */\n\tstatic sRGBToLinear( image ) {\n\n\t\tif ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) ||\n\t\t\t( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) ||\n\t\t\t( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ) {\n\n\t\t\tconst canvas = createElementNS( 'canvas' );\n\n\t\t\tcanvas.width = image.width;\n\t\t\tcanvas.height = image.height;\n\n\t\t\tconst context = canvas.getContext( '2d' );\n\t\t\tcontext.drawImage( image, 0, 0, image.width, image.height );\n\n\t\t\tconst imageData = context.getImageData( 0, 0, image.width, image.height );\n\t\t\tconst data = imageData.data;\n\n\t\t\tfor ( let i = 0; i < data.length; i ++ ) {\n\n\t\t\t\tdata[ i ] = SRGBToLinear( data[ i ] / 255 ) * 255;\n\n\t\t\t}\n\n\t\t\tcontext.putImageData( imageData, 0, 0 );\n\n\t\t\treturn canvas;\n\n\t\t} else if ( image.data ) {\n\n\t\t\tconst data = image.data.slice( 0 );\n\n\t\t\tfor ( let i = 0; i < data.length; i ++ ) {\n\n\t\t\t\tif ( data instanceof Uint8Array || data instanceof Uint8ClampedArray ) {\n\n\t\t\t\t\tdata[ i ] = Math.floor( SRGBToLinear( data[ i ] / 255 ) * 255 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// assuming float\n\n\t\t\t\t\tdata[ i ] = SRGBToLinear( data[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tdata: data,\n\t\t\t\twidth: image.width,\n\t\t\t\theight: image.height\n\t\t\t};\n\n\t\t} else {\n\n\t\t\twarn( 'ImageUtils.sRGBToLinear(): Unsupported image type. No color space conversion applied.' );\n\t\t\treturn image;\n\n\t\t}\n\n\t}\n\n}\n\nlet _sourceId = 0;\n\n/**\n * Represents the data source of a texture.\n *\n * The main purpose of this class is to decouple the data definition from the texture\n * definition so the same data can be used with multiple texture instances.\n */\nclass Source {\n\n\t/**\n\t * Constructs a new video texture.\n\t *\n\t * @param {any} [data=null] - The data definition of a texture.\n\t */\n\tconstructor( data = null ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSource = true;\n\n\t\t/**\n\t\t * The ID of the source.\n\t\t *\n\t\t * @name Source#id\n\t\t * @type {number}\n\t\t * @readonly\n\t\t */\n\t\tObject.defineProperty( this, 'id', { value: _sourceId ++ } );\n\n\t\t/**\n\t\t * The UUID of the source.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.uuid = generateUUID();\n\n\t\t/**\n\t\t * The data definition of a texture.\n\t\t *\n\t\t * @type {any}\n\t\t */\n\t\tthis.data = data;\n\n\t\t/**\n\t\t * This property is only relevant when {@link Source#needsUpdate} is set to `true` and\n\t\t * provides more control on how texture data should be processed. When `dataReady` is set\n\t\t * to `false`, the engine performs the memory allocation (if necessary) but does not transfer\n\t\t * the data into the GPU memory.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.dataReady = true;\n\n\t\t/**\n\t\t * This starts at `0` and counts how many times {@link Source#needsUpdate} is set to `true`.\n\t\t *\n\t\t * @type {number}\n\t\t * @readonly\n\t\t * @default 0\n\t\t */\n\t\tthis.version = 0;\n\n\t}\n\n\t/**\n\t * Returns the dimensions of the source into the given target vector.\n\t *\n\t * @param {(Vector2|Vector3)} target - The target object the result is written into.\n\t * @return {(Vector2|Vector3)} The dimensions of the source.\n\t */\n\tgetSize( target ) {\n\n\t\tconst data = this.data;\n\n\t\tif ( ( typeof HTMLVideoElement !== 'undefined' ) && ( data instanceof HTMLVideoElement ) ) {\n\n\t\t\ttarget.set( data.videoWidth, data.videoHeight, 0 );\n\n\t\t} else if ( data instanceof VideoFrame ) {\n\n\t\t\ttarget.set( data.displayHeight, data.displayWidth, 0 );\n\n\t\t} else if ( data !== null ) {\n\n\t\t\ttarget.set( data.width, data.height, data.depth || 0 );\n\n\t\t} else {\n\n\t\t\ttarget.set( 0, 0, 0 );\n\n\t\t}\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * When the property is set to `true`, the engine allocates the memory\n\t * for the texture (if necessary) and triggers the actual texture upload\n\t * to the GPU next time the source is used.\n\t *\n\t * @type {boolean}\n\t * @default false\n\t * @param {boolean} value\n\t */\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n\t/**\n\t * Serializes the source into JSON.\n\t *\n\t * @param {?(Object|string)} meta - An optional value holding meta information about the serialization.\n\t * @return {Object} A JSON object representing the serialized source.\n\t * @see {@link ObjectLoader#parse}\n\t */\n\ttoJSON( meta ) {\n\n\t\tconst isRootObject = ( meta === undefined || typeof meta === 'string' );\n\n\t\tif ( ! isRootObject && meta.images[ this.uuid ] !== undefined ) {\n\n\t\t\treturn meta.images[ this.uuid ];\n\n\t\t}\n\n\t\tconst output = {\n\t\t\tuuid: this.uuid,\n\t\t\turl: ''\n\t\t};\n\n\t\tconst data = this.data;\n\n\t\tif ( data !== null ) {\n\n\t\t\tlet url;\n\n\t\t\tif ( Array.isArray( data ) ) {\n\n\t\t\t\t// cube texture\n\n\t\t\t\turl = [];\n\n\t\t\t\tfor ( let i = 0, l = data.length; i < l; i ++ ) {\n\n\t\t\t\t\tif ( data[ i ].isDataTexture ) {\n\n\t\t\t\t\t\turl.push( serializeImage( data[ i ].image ) );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\turl.push( serializeImage( data[ i ] ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// texture\n\n\t\t\t\turl = serializeImage( data );\n\n\t\t\t}\n\n\t\t\toutput.url = url;\n\n\t\t}\n\n\t\tif ( ! isRootObject ) {\n\n\t\t\tmeta.images[ this.uuid ] = output;\n\n\t\t}\n\n\t\treturn output;\n\n\t}\n\n}\n\nfunction serializeImage( image ) {\n\n\tif ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) ||\n\t\t( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) ||\n\t\t( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ) {\n\n\t\t// default images\n\n\t\treturn ImageUtils.getDataURL( image );\n\n\t} else {\n\n\t\tif ( image.data ) {\n\n\t\t\t// images of DataTexture\n\n\t\t\treturn {\n\t\t\t\tdata: Array.from( image.data ),\n\t\t\t\twidth: image.width,\n\t\t\t\theight: image.height,\n\t\t\t\ttype: image.data.constructor.name\n\t\t\t};\n\n\t\t} else {\n\n\t\t\twarn( 'Texture: Unable to serialize Texture.' );\n\t\t\treturn {};\n\n\t\t}\n\n\t}\n\n}\n\nlet _textureId = 0;\n\nconst _tempVec3 = /*@__PURE__*/ new Vector3();\n\n/**\n * Base class for all textures.\n *\n * Note: After the initial use of a texture, its dimensions, format, and type\n * cannot be changed. Instead, call {@link Texture#dispose} on the texture and instantiate a new one.\n *\n * @augments EventDispatcher\n */\nclass Texture extends EventDispatcher {\n\n\t/**\n\t * Constructs a new texture.\n\t *\n\t * @param {?Object} [image=Texture.DEFAULT_IMAGE] - The image holding the texture data.\n\t * @param {number} [mapping=Texture.DEFAULT_MAPPING] - The texture mapping.\n\t * @param {number} [wrapS=ClampToEdgeWrapping] - The wrapS value.\n\t * @param {number} [wrapT=ClampToEdgeWrapping] - The wrapT value.\n\t * @param {number} [magFilter=LinearFilter] - The mag filter value.\n\t * @param {number} [minFilter=LinearMipmapLinearFilter] - The min filter value.\n\t * @param {number} [format=RGBAFormat] - The texture format.\n\t * @param {number} [type=UnsignedByteType] - The texture type.\n\t * @param {number} [anisotropy=Texture.DEFAULT_ANISOTROPY] - The anisotropy value.\n\t * @param {string} [colorSpace=NoColorSpace] - The color space.\n\t */\n\tconstructor( image = Texture.DEFAULT_IMAGE, mapping = Texture.DEFAULT_MAPPING, wrapS = ClampToEdgeWrapping, wrapT = ClampToEdgeWrapping, magFilter = LinearFilter, minFilter = LinearMipmapLinearFilter, format = RGBAFormat, type = UnsignedByteType, anisotropy = Texture.DEFAULT_ANISOTROPY, colorSpace = NoColorSpace ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isTexture = true;\n\n\t\t/**\n\t\t * The ID of the texture.\n\t\t *\n\t\t * @name Texture#id\n\t\t * @type {number}\n\t\t * @readonly\n\t\t */\n\t\tObject.defineProperty( this, 'id', { value: _textureId ++ } );\n\n\t\t/**\n\t\t * The UUID of the material.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.uuid = generateUUID();\n\n\t\t/**\n\t\t * The name of the material.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\n\t\t/**\n\t\t * The data definition of a texture. A reference to the data source can be\n\t\t * shared across textures. This is often useful in context of spritesheets\n\t\t * where multiple textures render the same data but with different texture\n\t\t * transformations.\n\t\t *\n\t\t * @type {Source}\n\t\t */\n\t\tthis.source = new Source( image );\n\n\t\t/**\n\t\t * An array holding user-defined mipmaps.\n\t\t *\n\t\t * @type {Array<Object>}\n\t\t */\n\t\tthis.mipmaps = [];\n\n\t\t/**\n\t\t * How the texture is applied to the object. The value `UVMapping`\n\t\t * is the default, where texture or uv coordinates are used to apply the map.\n\t\t *\n\t\t * @type {(UVMapping|CubeReflectionMapping|CubeRefractionMapping|EquirectangularReflectionMapping|EquirectangularRefractionMapping|CubeUVReflectionMapping)}\n\t\t * @default UVMapping\n\t\t*/\n\t\tthis.mapping = mapping;\n\n\t\t/**\n\t\t * Lets you select the uv attribute to map the texture to. `0` for `uv`,\n\t\t * `1` for `uv1`, `2` for `uv2` and `3` for `uv3`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.channel = 0;\n\n\t\t/**\n\t\t * This defines how the texture is wrapped horizontally and corresponds to\n\t\t * *U* in UV mapping.\n\t\t *\n\t\t * @type {(RepeatWrapping|ClampToEdgeWrapping|MirroredRepeatWrapping)}\n\t\t * @default ClampToEdgeWrapping\n\t\t */\n\t\tthis.wrapS = wrapS;\n\n\t\t/**\n\t\t * This defines how the texture is wrapped horizontally and corresponds to\n\t\t * *V* in UV mapping.\n\t\t *\n\t\t * @type {(RepeatWrapping|ClampToEdgeWrapping|MirroredRepeatWrapping)}\n\t\t * @default ClampToEdgeWrapping\n\t\t */\n\t\tthis.wrapT = wrapT;\n\n\t\t/**\n\t\t * How the texture is sampled when a texel covers more than one pixel.\n\t\t *\n\t\t * @type {(NearestFilter|NearestMipmapNearestFilter|NearestMipmapLinearFilter|LinearFilter|LinearMipmapNearestFilter|LinearMipmapLinearFilter)}\n\t\t * @default LinearFilter\n\t\t */\n\t\tthis.magFilter = magFilter;\n\n\t\t/**\n\t\t * How the texture is sampled when a texel covers less than one pixel.\n\t\t *\n\t\t * @type {(NearestFilter|NearestMipmapNearestFilter|NearestMipmapLinearFilter|LinearFilter|LinearMipmapNearestFilter|LinearMipmapLinearFilter)}\n\t\t * @default LinearMipmapLinearFilter\n\t\t */\n\t\tthis.minFilter = minFilter;\n\n\t\t/**\n\t\t * The number of samples taken along the axis through the pixel that has the\n\t\t * highest density of texels. By default, this value is `1`. A higher value\n\t\t * gives a less blurry result than a basic mipmap, at the cost of more\n\t\t * texture samples being used.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.anisotropy = anisotropy;\n\n\t\t/**\n\t\t * The format of the texture.\n\t\t *\n\t\t * @type {number}\n\t\t * @default RGBAFormat\n\t\t */\n\t\tthis.format = format;\n\n\t\t/**\n\t\t * The default internal format is derived from {@link Texture#format} and {@link Texture#type} and\n\t\t * defines how the texture data is going to be stored on the GPU.\n\t\t *\n\t\t * This property allows to overwrite the default format.\n\t\t *\n\t\t * @type {?string}\n\t\t * @default null\n\t\t */\n\t\tthis.internalFormat = null;\n\n\t\t/**\n\t\t * The data type of the texture.\n\t\t *\n\t\t * @type {number}\n\t\t * @default UnsignedByteType\n\t\t */\n\t\tthis.type = type;\n\n\t\t/**\n\t\t * How much a single repetition of the texture is offset from the beginning,\n\t\t * in each direction U and V. Typical range is `0.0` to `1.0`.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (0,0)\n\t\t */\n\t\tthis.offset = new Vector2( 0, 0 );\n\n\t\t/**\n\t\t * How many times the texture is repeated across the surface, in each\n\t\t * direction U and V. If repeat is set greater than `1` in either direction,\n\t\t * the corresponding wrap parameter should also be set to `RepeatWrapping`\n\t\t * or `MirroredRepeatWrapping` to achieve the desired tiling effect.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (1,1)\n\t\t */\n\t\tthis.repeat = new Vector2( 1, 1 );\n\n\t\t/**\n\t\t * The point around which rotation occurs. A value of `(0.5, 0.5)` corresponds\n\t\t * to the center of the texture. Default is `(0, 0)`, the lower left.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (0,0)\n\t\t */\n\t\tthis.center = new Vector2( 0, 0 );\n\n\t\t/**\n\t\t * How much the texture is rotated around the center point, in radians.\n\t\t * Positive values are counter-clockwise.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.rotation = 0;\n\n\t\t/**\n\t\t * Whether to update the texture's uv-transformation {@link Texture#matrix}\n\t\t * from the properties {@link Texture#offset}, {@link Texture#repeat},\n\t\t * {@link Texture#rotation}, and {@link Texture#center}.\n\t\t *\n\t\t * Set this to `false` if you are specifying the uv-transform matrix directly.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.matrixAutoUpdate = true;\n\n\t\t/**\n\t\t * The uv-transformation matrix of the texture.\n\t\t *\n\t\t * @type {Matrix3}\n\t\t */\n\t\tthis.matrix = new Matrix3();\n\n\t\t/**\n\t\t * Whether to generate mipmaps (if possible) for a texture.\n\t\t *\n\t\t * Set this to `false` if you are creating mipmaps manually.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.generateMipmaps = true;\n\n\t\t/**\n\t\t * If set to `true`, the alpha channel, if present, is multiplied into the\n\t\t * color channels when the texture is uploaded to the GPU.\n\t\t *\n\t\t * Note that this property has no effect when using `ImageBitmap`. You need to\n\t\t * configure premultiply alpha on bitmap creation instead.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.premultiplyAlpha = false;\n\n\t\t/**\n\t\t * If set to `true`, the texture is flipped along the vertical axis when\n\t\t * uploaded to the GPU.\n\t\t *\n\t\t * Note that this property has no effect when using `ImageBitmap`. You need to\n\t\t * configure the flip on bitmap creation instead.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.flipY = true;\n\n\t\t/**\n\t\t * Specifies the alignment requirements for the start of each pixel row in memory.\n\t\t * The allowable values are `1` (byte-alignment), `2` (rows aligned to even-numbered bytes),\n\t\t * `4` (word-alignment), and `8` (rows start on double-word boundaries).\n\t\t *\n\t\t * @type {number}\n\t\t * @default 4\n\t\t */\n\t\tthis.unpackAlignment = 4;\t// valid values: 1, 2, 4, 8 (see http://www.khronos.org/opengles/sdk/docs/man/xhtml/glPixelStorei.xml)\n\n\t\t/**\n\t\t * Textures containing color data should be annotated with `SRGBColorSpace` or `LinearSRGBColorSpace`.\n\t\t *\n\t\t * @type {string}\n\t\t * @default NoColorSpace\n\t\t */\n\t\tthis.colorSpace = colorSpace;\n\n\t\t/**\n\t\t * An object that can be used to store custom data about the texture. It\n\t\t * should not hold references to functions as these will not be cloned.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.userData = {};\n\n\t\t/**\n\t\t * This can be used to only update a subregion or specific rows of the texture (for example, just the\n\t\t * first 3 rows). Use the `addUpdateRange()` function to add ranges to this array.\n\t\t *\n\t\t * @type {Array<Object>}\n\t\t */\n\t\tthis.updateRanges = [];\n\n\t\t/**\n\t\t * This starts at `0` and counts how many times {@link Texture#needsUpdate} is set to `true`.\n\t\t *\n\t\t * @type {number}\n\t\t * @readonly\n\t\t * @default 0\n\t\t */\n\t\tthis.version = 0;\n\n\t\t/**\n\t\t * A callback function, called when the texture is updated (e.g., when\n\t\t * {@link Texture#needsUpdate} has been set to true and then the texture is used).\n\t\t *\n\t\t * @type {?Function}\n\t\t * @default null\n\t\t */\n\t\tthis.onUpdate = null;\n\n\t\t/**\n\t\t * An optional back reference to the textures render target.\n\t\t *\n\t\t * @type {?(RenderTarget|WebGLRenderTarget)}\n\t\t * @default null\n\t\t */\n\t\tthis.renderTarget = null;\n\n\t\t/**\n\t\t * Indicates whether a texture belongs to a render target or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default false\n\t\t */\n\t\tthis.isRenderTargetTexture = false;\n\n\t\t/**\n\t\t * Indicates if a texture should be handled like a texture array.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default false\n\t\t */\n\t\tthis.isArrayTexture = image && image.depth && image.depth > 1 ? true : false;\n\n\t\t/**\n\t\t * Indicates whether this texture should be processed by `PMREMGenerator` or not\n\t\t * (only relevant for render target textures).\n\t\t *\n\t\t * @type {number}\n\t\t * @readonly\n\t\t * @default 0\n\t\t */\n\t\tthis.pmremVersion = 0;\n\n\t}\n\n\t/**\n\t * The width of the texture in pixels.\n\t */\n\tget width() {\n\n\t\treturn this.source.getSize( _tempVec3 ).x;\n\n\t}\n\n\t/**\n\t * The height of the texture in pixels.\n\t */\n\tget height() {\n\n\t\treturn this.source.getSize( _tempVec3 ).y;\n\n\t}\n\n\t/**\n\t * The depth of the texture in pixels.\n\t */\n\tget depth() {\n\n\t\treturn this.source.getSize( _tempVec3 ).z;\n\n\t}\n\n\t/**\n\t * The image object holding the texture data.\n\t *\n\t * @type {?Object}\n\t */\n\tget image() {\n\n\t\treturn this.source.data;\n\n\t}\n\n\tset image( value = null ) {\n\n\t\tthis.source.data = value;\n\n\t}\n\n\t/**\n\t * Updates the texture transformation matrix from the from the properties {@link Texture#offset},\n\t * {@link Texture#repeat}, {@link Texture#rotation}, and {@link Texture#center}.\n\t */\n\tupdateMatrix() {\n\n\t\tthis.matrix.setUvTransform( this.offset.x, this.offset.y, this.repeat.x, this.repeat.y, this.rotation, this.center.x, this.center.y );\n\n\t}\n\n\t/**\n\t * Adds a range of data in the data texture to be updated on the GPU.\n\t *\n\t * @param {number} start - Position at which to start update.\n\t * @param {number} count - The number of components to update.\n\t */\n\taddUpdateRange( start, count ) {\n\n\t\tthis.updateRanges.push( { start, count } );\n\n\t}\n\n\t/**\n\t * Clears the update ranges.\n\t */\n\tclearUpdateRanges() {\n\n\t\tthis.updateRanges.length = 0;\n\n\t}\n\n\t/**\n\t * Returns a new texture with copied values from this instance.\n\t *\n\t * @return {Texture} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Copies the values of the given texture to this instance.\n\t *\n\t * @param {Texture} source - The texture to copy.\n\t * @return {Texture} A reference to this instance.\n\t */\n\tcopy( source ) {\n\n\t\tthis.name = source.name;\n\n\t\tthis.source = source.source;\n\t\tthis.mipmaps = source.mipmaps.slice( 0 );\n\n\t\tthis.mapping = source.mapping;\n\t\tthis.channel = source.channel;\n\n\t\tthis.wrapS = source.wrapS;\n\t\tthis.wrapT = source.wrapT;\n\n\t\tthis.magFilter = source.magFilter;\n\t\tthis.minFilter = source.minFilter;\n\n\t\tthis.anisotropy = source.anisotropy;\n\n\t\tthis.format = source.format;\n\t\tthis.internalFormat = source.internalFormat;\n\t\tthis.type = source.type;\n\n\t\tthis.offset.copy( source.offset );\n\t\tthis.repeat.copy( source.repeat );\n\t\tthis.center.copy( source.center );\n\t\tthis.rotation = source.rotation;\n\n\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\t\tthis.matrix.copy( source.matrix );\n\n\t\tthis.generateMipmaps = source.generateMipmaps;\n\t\tthis.premultiplyAlpha = source.premultiplyAlpha;\n\t\tthis.flipY = source.flipY;\n\t\tthis.unpackAlignment = source.unpackAlignment;\n\t\tthis.colorSpace = source.colorSpace;\n\n\t\tthis.renderTarget = source.renderTarget;\n\t\tthis.isRenderTargetTexture = source.isRenderTargetTexture;\n\t\tthis.isArrayTexture = source.isArrayTexture;\n\n\t\tthis.userData = JSON.parse( JSON.stringify( source.userData ) );\n\n\t\tthis.needsUpdate = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this texture's properties based on `values`.\n\t * @param {Object} values - A container with texture parameters.\n\t */\n\tsetValues( values ) {\n\n\t\tfor ( const key in values ) {\n\n\t\t\tconst newValue = values[ key ];\n\n\t\t\tif ( newValue === undefined ) {\n\n\t\t\t\twarn( `Texture.setValues(): parameter '${ key }' has value of undefined.` );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tconst currentValue = this[ key ];\n\n\t\t\tif ( currentValue === undefined ) {\n\n\t\t\t\twarn( `Texture.setValues(): property '${ key }' does not exist.` );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tif ( ( currentValue && newValue ) && ( currentValue.isVector2 && newValue.isVector2 ) ) {\n\n\t\t\t\tcurrentValue.copy( newValue );\n\n\t\t\t} else if ( ( currentValue && newValue ) && ( currentValue.isVector3 && newValue.isVector3 ) ) {\n\n\t\t\t\tcurrentValue.copy( newValue );\n\n\t\t\t} else if ( ( currentValue && newValue ) && ( currentValue.isMatrix3 && newValue.isMatrix3 ) ) {\n\n\t\t\t\tcurrentValue.copy( newValue );\n\n\t\t\t} else {\n\n\t\t\t\tthis[ key ] = newValue;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Serializes the texture into JSON.\n\t *\n\t * @param {?(Object|string)} meta - An optional value holding meta information about the serialization.\n\t * @return {Object} A JSON object representing the serialized texture.\n\t * @see {@link ObjectLoader#parse}\n\t */\n\ttoJSON( meta ) {\n\n\t\tconst isRootObject = ( meta === undefined || typeof meta === 'string' );\n\n\t\tif ( ! isRootObject && meta.textures[ this.uuid ] !== undefined ) {\n\n\t\t\treturn meta.textures[ this.uuid ];\n\n\t\t}\n\n\t\tconst output = {\n\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.7,\n\t\t\t\ttype: 'Texture',\n\t\t\t\tgenerator: 'Texture.toJSON'\n\t\t\t},\n\n\t\t\tuuid: this.uuid,\n\t\t\tname: this.name,\n\n\t\t\timage: this.source.toJSON( meta ).uuid,\n\n\t\t\tmapping: this.mapping,\n\t\t\tchannel: this.channel,\n\n\t\t\trepeat: [ this.repeat.x, this.repeat.y ],\n\t\t\toffset: [ this.offset.x, this.offset.y ],\n\t\t\tcenter: [ this.center.x, this.center.y ],\n\t\t\trotation: this.rotation,\n\n\t\t\twrap: [ this.wrapS, this.wrapT ],\n\n\t\t\tformat: this.format,\n\t\t\tinternalFormat: this.internalFormat,\n\t\t\ttype: this.type,\n\t\t\tcolorSpace: this.colorSpace,\n\n\t\t\tminFilter: this.minFilter,\n\t\t\tmagFilter: this.magFilter,\n\t\t\tanisotropy: this.anisotropy,\n\n\t\t\tflipY: this.flipY,\n\n\t\t\tgenerateMipmaps: this.generateMipmaps,\n\t\t\tpremultiplyAlpha: this.premultiplyAlpha,\n\t\t\tunpackAlignment: this.unpackAlignment\n\n\t\t};\n\n\t\tif ( Object.keys( this.userData ).length > 0 ) output.userData = this.userData;\n\n\t\tif ( ! isRootObject ) {\n\n\t\t\tmeta.textures[ this.uuid ] = output;\n\n\t\t}\n\n\t\treturn output;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t *\n\t * @fires Texture#dispose\n\t */\n\tdispose() {\n\n\t\t/**\n\t\t * Fires when the texture has been disposed of.\n\t\t *\n\t\t * @event Texture#dispose\n\t\t * @type {Object}\n\t\t */\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n\t/**\n\t * Transforms the given uv vector with the textures uv transformation matrix.\n\t *\n\t * @param {Vector2} uv - The uv vector.\n\t * @return {Vector2} The transformed uv vector.\n\t */\n\ttransformUv( uv ) {\n\n\t\tif ( this.mapping !== UVMapping ) return uv;\n\n\t\tuv.applyMatrix3( this.matrix );\n\n\t\tif ( uv.x < 0 || uv.x > 1 ) {\n\n\t\t\tswitch ( this.wrapS ) {\n\n\t\t\t\tcase RepeatWrapping:\n\n\t\t\t\t\tuv.x = uv.x - Math.floor( uv.x );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase ClampToEdgeWrapping:\n\n\t\t\t\t\tuv.x = uv.x < 0 ? 0 : 1;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MirroredRepeatWrapping:\n\n\t\t\t\t\tif ( Math.abs( Math.floor( uv.x ) % 2 ) === 1 ) {\n\n\t\t\t\t\t\tuv.x = Math.ceil( uv.x ) - uv.x;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tuv.x = uv.x - Math.floor( uv.x );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( uv.y < 0 || uv.y > 1 ) {\n\n\t\t\tswitch ( this.wrapT ) {\n\n\t\t\t\tcase RepeatWrapping:\n\n\t\t\t\t\tuv.y = uv.y - Math.floor( uv.y );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase ClampToEdgeWrapping:\n\n\t\t\t\t\tuv.y = uv.y < 0 ? 0 : 1;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MirroredRepeatWrapping:\n\n\t\t\t\t\tif ( Math.abs( Math.floor( uv.y ) % 2 ) === 1 ) {\n\n\t\t\t\t\t\tuv.y = Math.ceil( uv.y ) - uv.y;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tuv.y = uv.y - Math.floor( uv.y );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.flipY ) {\n\n\t\t\tuv.y = 1 - uv.y;\n\n\t\t}\n\n\t\treturn uv;\n\n\t}\n\n\t/**\n\t * Setting this property to `true` indicates the engine the texture\n\t * must be updated in the next render. This triggers a texture upload\n\t * to the GPU and ensures correct texture parameter configuration.\n\t *\n\t * @type {boolean}\n\t * @default false\n\t * @param {boolean} value\n\t */\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) {\n\n\t\t\tthis.version ++;\n\t\t\tthis.source.needsUpdate = true;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Setting this property to `true` indicates the engine the PMREM\n\t * must be regenerated.\n\t *\n\t * @type {boolean}\n\t * @default false\n\t * @param {boolean} value\n\t */\n\tset needsPMREMUpdate( value ) {\n\n\t\tif ( value === true ) {\n\n\t\t\tthis.pmremVersion ++;\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * The default image for all textures.\n *\n * @static\n * @type {?Image}\n * @default null\n */\nTexture.DEFAULT_IMAGE = null;\n\n/**\n * The default mapping for all textures.\n *\n * @static\n * @type {number}\n * @default UVMapping\n */\nTexture.DEFAULT_MAPPING = UVMapping;\n\n/**\n * The default anisotropy value for all textures.\n *\n * @static\n * @type {number}\n * @default 1\n */\nTexture.DEFAULT_ANISOTROPY = 1;\n\n/**\n * Class representing a 4D vector. A 4D vector is an ordered quadruplet of numbers\n * (labeled x, y, z and w), which can be used to represent a number of things, such as:\n *\n * - A point in 4D space.\n * - A direction and length in 4D space. In three.js the length will\n * always be the Euclidean distance(straight-line distance) from `(0, 0, 0, 0)` to `(x, y, z, w)`\n * and the direction is also measured from `(0, 0, 0, 0)` towards `(x, y, z, w)`.\n * - Any arbitrary ordered quadruplet of numbers.\n *\n * There are other things a 4D vector can be used to represent, however these\n * are the most common uses in *three.js*.\n *\n * Iterating through a vector instance will yield its components `(x, y, z, w)` in\n * the corresponding order.\n * ```js\n * const a = new THREE.Vector4( 0, 1, 0, 0 );\n *\n * //no arguments; will be initialised to (0, 0, 0, 1)\n * const b = new THREE.Vector4( );\n *\n * const d = a.dot( b );\n * ```\n */\nclass Vector4 {\n\n\t/**\n\t * Constructs a new 4D vector.\n\t *\n\t * @param {number} [x=0] - The x value of this vector.\n\t * @param {number} [y=0] - The y value of this vector.\n\t * @param {number} [z=0] - The z value of this vector.\n\t * @param {number} [w=1] - The w value of this vector.\n\t */\n\tconstructor( x = 0, y = 0, z = 0, w = 1 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tVector4.prototype.isVector4 = true;\n\n\t\t/**\n\t\t * The x value of this vector.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.x = x;\n\n\t\t/**\n\t\t * The y value of this vector.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.y = y;\n\n\t\t/**\n\t\t * The z value of this vector.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.z = z;\n\n\t\t/**\n\t\t * The w value of this vector.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.w = w;\n\n\t}\n\n\t/**\n\t * Alias for {@link Vector4#z}.\n\t *\n\t * @type {number}\n\t */\n\tget width() {\n\n\t\treturn this.z;\n\n\t}\n\n\tset width( value ) {\n\n\t\tthis.z = value;\n\n\t}\n\n\t/**\n\t * Alias for {@link Vector4#w}.\n\t *\n\t * @type {number}\n\t */\n\tget height() {\n\n\t\treturn this.w;\n\n\t}\n\n\tset height( value ) {\n\n\t\tthis.w = value;\n\n\t}\n\n\t/**\n\t * Sets the vector components.\n\t *\n\t * @param {number} x - The value of the x component.\n\t * @param {number} y - The value of the y component.\n\t * @param {number} z - The value of the z component.\n\t * @param {number} w - The value of the w component.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tset( x, y, z, w ) {\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\t\tthis.w = w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector components to the same value.\n\t *\n\t * @param {number} scalar - The value to set for all vector components.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetScalar( scalar ) {\n\n\t\tthis.x = scalar;\n\t\tthis.y = scalar;\n\t\tthis.z = scalar;\n\t\tthis.w = scalar;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector's x component to the given value\n\t *\n\t * @param {number} x - The value to set.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetX( x ) {\n\n\t\tthis.x = x;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector's y component to the given value\n\t *\n\t * @param {number} y - The value to set.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetY( y ) {\n\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector's z component to the given value\n\t *\n\t * @param {number} z - The value to set.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetZ( z ) {\n\n\t\tthis.z = z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector's w component to the given value\n\t *\n\t * @param {number} w - The value to set.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetW( w ) {\n\n\t\tthis.w = w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Allows to set a vector component with an index.\n\t *\n\t * @param {number} index - The component index. `0` equals to x, `1` equals to y,\n\t * `2` equals to z, `3` equals to w.\n\t * @param {number} value - The value to set.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetComponent( index, value ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: this.x = value; break;\n\t\t\tcase 1: this.y = value; break;\n\t\t\tcase 2: this.z = value; break;\n\t\t\tcase 3: this.w = value; break;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the value of the vector component which matches the given index.\n\t *\n\t * @param {number} index - The component index. `0` equals to x, `1` equals to y,\n\t * `2` equals to z, `3` equals to w.\n\t * @return {number} A vector component value.\n\t */\n\tgetComponent( index ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: return this.x;\n\t\t\tcase 1: return this.y;\n\t\t\tcase 2: return this.z;\n\t\t\tcase 3: return this.w;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns a new vector with copied values from this instance.\n\t *\n\t * @return {Vector4} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor( this.x, this.y, this.z, this.w );\n\n\t}\n\n\t/**\n\t * Copies the values of the given vector to this instance.\n\t *\n\t * @param {Vector3|Vector4} v - The vector to copy.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tcopy( v ) {\n\n\t\tthis.x = v.x;\n\t\tthis.y = v.y;\n\t\tthis.z = v.z;\n\t\tthis.w = ( v.w !== undefined ) ? v.w : 1;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given vector to this instance.\n\t *\n\t * @param {Vector4} v - The vector to add.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tadd( v ) {\n\n\t\tthis.x += v.x;\n\t\tthis.y += v.y;\n\t\tthis.z += v.z;\n\t\tthis.w += v.w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given scalar value to all components of this instance.\n\t *\n\t * @param {number} s - The scalar to add.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\taddScalar( s ) {\n\n\t\tthis.x += s;\n\t\tthis.y += s;\n\t\tthis.z += s;\n\t\tthis.w += s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given vectors and stores the result in this instance.\n\t *\n\t * @param {Vector4} a - The first vector.\n\t * @param {Vector4} b - The second vector.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\taddVectors( a, b ) {\n\n\t\tthis.x = a.x + b.x;\n\t\tthis.y = a.y + b.y;\n\t\tthis.z = a.z + b.z;\n\t\tthis.w = a.w + b.w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given vector scaled by the given factor to this instance.\n\t *\n\t * @param {Vector4} v - The vector.\n\t * @param {number} s - The factor that scales `v`.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\taddScaledVector( v, s ) {\n\n\t\tthis.x += v.x * s;\n\t\tthis.y += v.y * s;\n\t\tthis.z += v.z * s;\n\t\tthis.w += v.w * s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the given vector from this instance.\n\t *\n\t * @param {Vector4} v - The vector to subtract.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsub( v ) {\n\n\t\tthis.x -= v.x;\n\t\tthis.y -= v.y;\n\t\tthis.z -= v.z;\n\t\tthis.w -= v.w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the given scalar value from all components of this instance.\n\t *\n\t * @param {number} s - The scalar to subtract.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsubScalar( s ) {\n\n\t\tthis.x -= s;\n\t\tthis.y -= s;\n\t\tthis.z -= s;\n\t\tthis.w -= s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the given vectors and stores the result in this instance.\n\t *\n\t * @param {Vector4} a - The first vector.\n\t * @param {Vector4} b - The second vector.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsubVectors( a, b ) {\n\n\t\tthis.x = a.x - b.x;\n\t\tthis.y = a.y - b.y;\n\t\tthis.z = a.z - b.z;\n\t\tthis.w = a.w - b.w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the given vector with this instance.\n\t *\n\t * @param {Vector4} v - The vector to multiply.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tmultiply( v ) {\n\n\t\tthis.x *= v.x;\n\t\tthis.y *= v.y;\n\t\tthis.z *= v.z;\n\t\tthis.w *= v.w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the given scalar value with all components of this instance.\n\t *\n\t * @param {number} scalar - The scalar to multiply.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tmultiplyScalar( scalar ) {\n\n\t\tthis.x *= scalar;\n\t\tthis.y *= scalar;\n\t\tthis.z *= scalar;\n\t\tthis.w *= scalar;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies this vector with the given 4x4 matrix.\n\t *\n\t * @param {Matrix4} m - The 4x4 matrix.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tapplyMatrix4( m ) {\n\n\t\tconst x = this.x, y = this.y, z = this.z, w = this.w;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] * w;\n\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] * w;\n\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] * w;\n\t\tthis.w = e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] * w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Divides this instance by the given vector.\n\t *\n\t * @param {Vector4} v - The vector to divide.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tdivide( v ) {\n\n\t\tthis.x /= v.x;\n\t\tthis.y /= v.y;\n\t\tthis.z /= v.z;\n\t\tthis.w /= v.w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Divides this vector by the given scalar.\n\t *\n\t * @param {number} scalar - The scalar to divide.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tdivideScalar( scalar ) {\n\n\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t}\n\n\t/**\n\t * Sets the x, y and z components of this\n\t * vector to the quaternion's axis and w to the angle.\n\t *\n\t * @param {Quaternion} q - The Quaternion to set.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetAxisAngleFromQuaternion( q ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm\n\n\t\t// q is assumed to be normalized\n\n\t\tthis.w = 2 * Math.acos( q.w );\n\n\t\tconst s = Math.sqrt( 1 - q.w * q.w );\n\n\t\tif ( s < 0.0001 ) {\n\n\t\t\tthis.x = 1;\n\t\t\tthis.y = 0;\n\t\t\tthis.z = 0;\n\n\t\t} else {\n\n\t\t\tthis.x = q.x / s;\n\t\t\tthis.y = q.y / s;\n\t\t\tthis.z = q.z / s;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the x, y and z components of this\n\t * vector to the axis of rotation and w to the angle.\n\t *\n\t * @param {Matrix4} m - A 4x4 matrix of which the upper left 3x3 matrix is a pure rotation matrix.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetAxisAngleFromRotationMatrix( m ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToAngle/index.htm\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tlet angle, x, y, z; // variables for result\n\t\tconst epsilon = 0.01,\t\t// margin to allow for rounding errors\n\t\t\tepsilon2 = 0.1,\t\t// margin to distinguish between 0 and 180 degrees\n\n\t\t\tte = m.elements,\n\n\t\t\tm11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],\n\t\t\tm21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],\n\t\t\tm31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];\n\n\t\tif ( ( Math.abs( m12 - m21 ) < epsilon ) &&\n\t\t     ( Math.abs( m13 - m31 ) < epsilon ) &&\n\t\t     ( Math.abs( m23 - m32 ) < epsilon ) ) {\n\n\t\t\t// singularity found\n\t\t\t// first check for identity matrix which must have +1 for all terms\n\t\t\t// in leading diagonal and zero in other terms\n\n\t\t\tif ( ( Math.abs( m12 + m21 ) < epsilon2 ) &&\n\t\t\t     ( Math.abs( m13 + m31 ) < epsilon2 ) &&\n\t\t\t     ( Math.abs( m23 + m32 ) < epsilon2 ) &&\n\t\t\t     ( Math.abs( m11 + m22 + m33 - 3 ) < epsilon2 ) ) {\n\n\t\t\t\t// this singularity is identity matrix so angle = 0\n\n\t\t\t\tthis.set( 1, 0, 0, 0 );\n\n\t\t\t\treturn this; // zero angle, arbitrary axis\n\n\t\t\t}\n\n\t\t\t// otherwise this singularity is angle = 180\n\n\t\t\tangle = Math.PI;\n\n\t\t\tconst xx = ( m11 + 1 ) / 2;\n\t\t\tconst yy = ( m22 + 1 ) / 2;\n\t\t\tconst zz = ( m33 + 1 ) / 2;\n\t\t\tconst xy = ( m12 + m21 ) / 4;\n\t\t\tconst xz = ( m13 + m31 ) / 4;\n\t\t\tconst yz = ( m23 + m32 ) / 4;\n\n\t\t\tif ( ( xx > yy ) && ( xx > zz ) ) {\n\n\t\t\t\t// m11 is the largest diagonal term\n\n\t\t\t\tif ( xx < epsilon ) {\n\n\t\t\t\t\tx = 0;\n\t\t\t\t\ty = 0.707106781;\n\t\t\t\t\tz = 0.707106781;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tx = Math.sqrt( xx );\n\t\t\t\t\ty = xy / x;\n\t\t\t\t\tz = xz / x;\n\n\t\t\t\t}\n\n\t\t\t} else if ( yy > zz ) {\n\n\t\t\t\t// m22 is the largest diagonal term\n\n\t\t\t\tif ( yy < epsilon ) {\n\n\t\t\t\t\tx = 0.707106781;\n\t\t\t\t\ty = 0;\n\t\t\t\t\tz = 0.707106781;\n\n\t\t\t\t} else {\n\n\t\t\t\t\ty = Math.sqrt( yy );\n\t\t\t\t\tx = xy / y;\n\t\t\t\t\tz = yz / y;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// m33 is the largest diagonal term so base result on this\n\n\t\t\t\tif ( zz < epsilon ) {\n\n\t\t\t\t\tx = 0.707106781;\n\t\t\t\t\ty = 0.707106781;\n\t\t\t\t\tz = 0;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tz = Math.sqrt( zz );\n\t\t\t\t\tx = xz / z;\n\t\t\t\t\ty = yz / z;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.set( x, y, z, angle );\n\n\t\t\treturn this; // return 180 deg rotation\n\n\t\t}\n\n\t\t// as we have reached here there are no singularities so we can handle normally\n\n\t\tlet s = Math.sqrt( ( m32 - m23 ) * ( m32 - m23 ) +\n\t\t\t( m13 - m31 ) * ( m13 - m31 ) +\n\t\t\t( m21 - m12 ) * ( m21 - m12 ) ); // used to normalize\n\n\t\tif ( Math.abs( s ) < 0.001 ) s = 1;\n\n\t\t// prevent divide by zero, should not happen if matrix is orthogonal and should be\n\t\t// caught by singularity test above, but I've left it in just in case\n\n\t\tthis.x = ( m32 - m23 ) / s;\n\t\tthis.y = ( m13 - m31 ) / s;\n\t\tthis.z = ( m21 - m12 ) / s;\n\t\tthis.w = Math.acos( ( m11 + m22 + m33 - 1 ) / 2 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector components to the position elements of the\n\t * given transformation matrix.\n\t *\n\t * @param {Matrix4} m - The 4x4 matrix.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetFromMatrixPosition( m ) {\n\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 12 ];\n\t\tthis.y = e[ 13 ];\n\t\tthis.z = e[ 14 ];\n\t\tthis.w = e[ 15 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x, y, z or w value is greater than the given vector's x, y, z or w\n\t * value, replace that value with the corresponding min value.\n\t *\n\t * @param {Vector4} v - The vector.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tmin( v ) {\n\n\t\tthis.x = Math.min( this.x, v.x );\n\t\tthis.y = Math.min( this.y, v.y );\n\t\tthis.z = Math.min( this.z, v.z );\n\t\tthis.w = Math.min( this.w, v.w );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x, y, z or w value is less than the given vector's x, y, z or w\n\t * value, replace that value with the corresponding max value.\n\t *\n\t * @param {Vector4} v - The vector.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tmax( v ) {\n\n\t\tthis.x = Math.max( this.x, v.x );\n\t\tthis.y = Math.max( this.y, v.y );\n\t\tthis.z = Math.max( this.z, v.z );\n\t\tthis.w = Math.max( this.w, v.w );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x, y, z or w value is greater than the max vector's x, y, z or w\n\t * value, it is replaced by the corresponding value.\n\t * If this vector's x, y, z or w value is less than the min vector's x, y, z or w value,\n\t * it is replaced by the corresponding value.\n\t *\n\t * @param {Vector4} min - The minimum x, y and z values.\n\t * @param {Vector4} max - The maximum x, y and z values in the desired range.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tclamp( min, max ) {\n\n\t\t// assumes min < max, componentwise\n\n\t\tthis.x = clamp( this.x, min.x, max.x );\n\t\tthis.y = clamp( this.y, min.y, max.y );\n\t\tthis.z = clamp( this.z, min.z, max.z );\n\t\tthis.w = clamp( this.w, min.w, max.w );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x, y, z or w values are greater than the max value, they are\n\t * replaced by the max value.\n\t * If this vector's x, y, z or w values are less than the min value, they are\n\t * replaced by the min value.\n\t *\n\t * @param {number} minVal - The minimum value the components will be clamped to.\n\t * @param {number} maxVal - The maximum value the components will be clamped to.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tclampScalar( minVal, maxVal ) {\n\n\t\tthis.x = clamp( this.x, minVal, maxVal );\n\t\tthis.y = clamp( this.y, minVal, maxVal );\n\t\tthis.z = clamp( this.z, minVal, maxVal );\n\t\tthis.w = clamp( this.w, minVal, maxVal );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's length is greater than the max value, it is replaced by\n\t * the max value.\n\t * If this vector's length is less than the min value, it is replaced by the\n\t * min value.\n\t *\n\t * @param {number} min - The minimum value the vector length will be clamped to.\n\t * @param {number} max - The maximum value the vector length will be clamped to.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tclampLength( min, max ) {\n\n\t\tconst length = this.length();\n\n\t\treturn this.divideScalar( length || 1 ).multiplyScalar( clamp( length, min, max ) );\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded down to the nearest integer value.\n\t *\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tfloor() {\n\n\t\tthis.x = Math.floor( this.x );\n\t\tthis.y = Math.floor( this.y );\n\t\tthis.z = Math.floor( this.z );\n\t\tthis.w = Math.floor( this.w );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded up to the nearest integer value.\n\t *\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tceil() {\n\n\t\tthis.x = Math.ceil( this.x );\n\t\tthis.y = Math.ceil( this.y );\n\t\tthis.z = Math.ceil( this.z );\n\t\tthis.w = Math.ceil( this.w );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded to the nearest integer value\n\t *\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tround() {\n\n\t\tthis.x = Math.round( this.x );\n\t\tthis.y = Math.round( this.y );\n\t\tthis.z = Math.round( this.z );\n\t\tthis.w = Math.round( this.w );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded towards zero (up if negative,\n\t * down if positive) to an integer value.\n\t *\n\t * @return {Vector4} A reference to this vector.\n\t */\n\troundToZero() {\n\n\t\tthis.x = Math.trunc( this.x );\n\t\tthis.y = Math.trunc( this.y );\n\t\tthis.z = Math.trunc( this.z );\n\t\tthis.w = Math.trunc( this.w );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Inverts this vector - i.e. sets x = -x, y = -y, z = -z, w = -w.\n\t *\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tnegate() {\n\n\t\tthis.x = - this.x;\n\t\tthis.y = - this.y;\n\t\tthis.z = - this.z;\n\t\tthis.w = - this.w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Calculates the dot product of the given vector with this instance.\n\t *\n\t * @param {Vector4} v - The vector to compute the dot product with.\n\t * @return {number} The result of the dot product.\n\t */\n\tdot( v ) {\n\n\t\treturn this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w;\n\n\t}\n\n\t/**\n\t * Computes the square of the Euclidean length (straight-line length) from\n\t * (0, 0, 0, 0) to (x, y, z, w). If you are comparing the lengths of vectors, you should\n\t * compare the length squared instead as it is slightly more efficient to calculate.\n\t *\n\t * @return {number} The square length of this vector.\n\t */\n\tlengthSq() {\n\n\t\treturn this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w;\n\n\t}\n\n\t/**\n\t * Computes the  Euclidean length (straight-line length) from (0, 0, 0, 0) to (x, y, z, w).\n\t *\n\t * @return {number} The length of this vector.\n\t */\n\tlength() {\n\n\t\treturn Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w );\n\n\t}\n\n\t/**\n\t * Computes the Manhattan length of this vector.\n\t *\n\t * @return {number} The length of this vector.\n\t */\n\tmanhattanLength() {\n\n\t\treturn Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ) + Math.abs( this.w );\n\n\t}\n\n\t/**\n\t * Converts this vector to a unit vector - that is, sets it equal to a vector\n\t * with the same direction as this one, but with a vector length of `1`.\n\t *\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tnormalize() {\n\n\t\treturn this.divideScalar( this.length() || 1 );\n\n\t}\n\n\t/**\n\t * Sets this vector to a vector with the same direction as this one, but\n\t * with the specified length.\n\t *\n\t * @param {number} length - The new length of this vector.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetLength( length ) {\n\n\t\treturn this.normalize().multiplyScalar( length );\n\n\t}\n\n\t/**\n\t * Linearly interpolates between the given vector and this instance, where\n\t * alpha is the percent distance along the line - alpha = 0 will be this\n\t * vector, and alpha = 1 will be the given one.\n\t *\n\t * @param {Vector4} v - The vector to interpolate towards.\n\t * @param {number} alpha - The interpolation factor, typically in the closed interval `[0, 1]`.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tlerp( v, alpha ) {\n\n\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\tthis.y += ( v.y - this.y ) * alpha;\n\t\tthis.z += ( v.z - this.z ) * alpha;\n\t\tthis.w += ( v.w - this.w ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Linearly interpolates between the given vectors, where alpha is the percent\n\t * distance along the line - alpha = 0 will be first vector, and alpha = 1 will\n\t * be the second one. The result is stored in this instance.\n\t *\n\t * @param {Vector4} v1 - The first vector.\n\t * @param {Vector4} v2 - The second vector.\n\t * @param {number} alpha - The interpolation factor, typically in the closed interval `[0, 1]`.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tlerpVectors( v1, v2, alpha ) {\n\n\t\tthis.x = v1.x + ( v2.x - v1.x ) * alpha;\n\t\tthis.y = v1.y + ( v2.y - v1.y ) * alpha;\n\t\tthis.z = v1.z + ( v2.z - v1.z ) * alpha;\n\t\tthis.w = v1.w + ( v2.w - v1.w ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this vector is equal with the given one.\n\t *\n\t * @param {Vector4} v - The vector to test for equality.\n\t * @return {boolean} Whether this vector is equal with the given one.\n\t */\n\tequals( v ) {\n\n\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) && ( v.w === this.w ) );\n\n\t}\n\n\t/**\n\t * Sets this vector's x value to be `array[ offset ]`, y value to be `array[ offset + 1 ]`,\n\t * z value to be `array[ offset + 2 ]`, w value to be `array[ offset + 3 ]`.\n\t *\n\t * @param {Array<number>} array - An array holding the vector component values.\n\t * @param {number} [offset=0] - The offset into the array.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis.x = array[ offset ];\n\t\tthis.y = array[ offset + 1 ];\n\t\tthis.z = array[ offset + 2 ];\n\t\tthis.w = array[ offset + 3 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Writes the components of this vector to the given array. If no array is provided,\n\t * the method returns a new instance.\n\t *\n\t * @param {Array<number>} [array=[]] - The target array holding the vector components.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Array<number>} The vector components.\n\t */\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this.x;\n\t\tarray[ offset + 1 ] = this.y;\n\t\tarray[ offset + 2 ] = this.z;\n\t\tarray[ offset + 3 ] = this.w;\n\n\t\treturn array;\n\n\t}\n\n\t/**\n\t * Sets the components of this vector from the given buffer attribute.\n\t *\n\t * @param {BufferAttribute} attribute - The buffer attribute holding vector data.\n\t * @param {number} index - The index into the attribute.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tfromBufferAttribute( attribute, index ) {\n\n\t\tthis.x = attribute.getX( index );\n\t\tthis.y = attribute.getY( index );\n\t\tthis.z = attribute.getZ( index );\n\t\tthis.w = attribute.getW( index );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets each component of this vector to a pseudo-random value between `0` and\n\t * `1`, excluding `1`.\n\t *\n\t * @return {Vector4} A reference to this vector.\n\t */\n\trandom() {\n\n\t\tthis.x = Math.random();\n\t\tthis.y = Math.random();\n\t\tthis.z = Math.random();\n\t\tthis.w = Math.random();\n\n\t\treturn this;\n\n\t}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this.x;\n\t\tyield this.y;\n\t\tyield this.z;\n\t\tyield this.w;\n\n\t}\n\n}\n\n/**\n * A render target is a buffer where the video card draws pixels for a scene\n * that is being rendered in the background. It is used in different effects,\n * such as applying postprocessing to a rendered image before displaying it\n * on the screen.\n *\n * @augments EventDispatcher\n */\nclass RenderTarget extends EventDispatcher {\n\n\t/**\n\t * Render target options.\n\t *\n\t * @typedef {Object} RenderTarget~Options\n\t * @property {boolean} [generateMipmaps=false] - Whether to generate mipmaps or not.\n\t * @property {number} [magFilter=LinearFilter] - The mag filter.\n\t * @property {number} [minFilter=LinearFilter] - The min filter.\n\t * @property {number} [format=RGBAFormat] - The texture format.\n\t * @property {number} [type=UnsignedByteType] - The texture type.\n\t * @property {?string} [internalFormat=null] - The texture's internal format.\n\t * @property {number} [wrapS=ClampToEdgeWrapping] - The texture's uv wrapping mode.\n\t * @property {number} [wrapT=ClampToEdgeWrapping] - The texture's uv wrapping mode.\n\t * @property {number} [anisotropy=1] - The texture's anisotropy value.\n\t * @property {string} [colorSpace=NoColorSpace] - The texture's color space.\n\t * @property {boolean} [depthBuffer=true] - Whether to allocate a depth buffer or not.\n\t * @property {boolean} [stencilBuffer=false] - Whether to allocate a stencil buffer or not.\n\t * @property {boolean} [resolveDepthBuffer=true] - Whether to resolve the depth buffer or not.\n\t * @property {boolean} [resolveStencilBuffer=true] - Whether  to resolve the stencil buffer or not.\n\t * @property {?Texture} [depthTexture=null] - Reference to a depth texture.\n\t * @property {number} [samples=0] - The MSAA samples count.\n\t * @property {number} [count=1] - Defines the number of color attachments . Must be at least `1`.\n\t * @property {number} [depth=1] - The texture depth.\n\t * @property {boolean} [multiview=false] - Whether this target is used for multiview rendering.\n\t */\n\n\t/**\n\t * Constructs a new render target.\n\t *\n\t * @param {number} [width=1] - The width of the render target.\n\t * @param {number} [height=1] - The height of the render target.\n\t * @param {RenderTarget~Options} [options] - The configuration object.\n\t */\n\tconstructor( width = 1, height = 1, options = {} ) {\n\n\t\tsuper();\n\n\t\toptions = Object.assign( {\n\t\t\tgenerateMipmaps: false,\n\t\t\tinternalFormat: null,\n\t\t\tminFilter: LinearFilter,\n\t\t\tdepthBuffer: true,\n\t\t\tstencilBuffer: false,\n\t\t\tresolveDepthBuffer: true,\n\t\t\tresolveStencilBuffer: true,\n\t\t\tdepthTexture: null,\n\t\t\tsamples: 0,\n\t\t\tcount: 1,\n\t\t\tdepth: 1,\n\t\t\tmultiview: false\n\t\t}, options );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isRenderTarget = true;\n\n\t\t/**\n\t\t * The width of the render target.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.width = width;\n\n\t\t/**\n\t\t * The height of the render target.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.height = height;\n\n\t\t/**\n\t\t * The depth of the render target.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.depth = options.depth;\n\n\t\t/**\n\t\t * A rectangular area inside the render target's viewport. Fragments that are\n\t\t * outside the area will be discarded.\n\t\t *\n\t\t * @type {Vector4}\n\t\t * @default (0,0,width,height)\n\t\t */\n\t\tthis.scissor = new Vector4( 0, 0, width, height );\n\n\t\t/**\n\t\t * Indicates whether the scissor test should be enabled when rendering into\n\t\t * this render target or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.scissorTest = false;\n\n\t\t/**\n\t\t * A rectangular area representing the render target's viewport.\n\t\t *\n\t\t * @type {Vector4}\n\t\t * @default (0,0,width,height)\n\t\t */\n\t\tthis.viewport = new Vector4( 0, 0, width, height );\n\n\t\tconst image = { width: width, height: height, depth: options.depth };\n\n\t\tconst texture = new Texture( image );\n\n\t\t/**\n\t\t * An array of textures. Each color attachment is represented as a separate texture.\n\t\t * Has at least a single entry for the default color attachment.\n\t\t *\n\t\t * @type {Array<Texture>}\n\t\t */\n\t\tthis.textures = [];\n\n\t\tconst count = options.count;\n\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\tthis.textures[ i ] = texture.clone();\n\t\t\tthis.textures[ i ].isRenderTargetTexture = true;\n\t\t\tthis.textures[ i ].renderTarget = this;\n\n\t\t}\n\n\t\tthis._setTextureOptions( options );\n\n\t\t/**\n\t\t * Whether to allocate a depth buffer or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.depthBuffer = options.depthBuffer;\n\n\t\t/**\n\t\t * Whether to allocate a stencil buffer or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.stencilBuffer = options.stencilBuffer;\n\n\t\t/**\n\t\t * Whether to resolve the depth buffer or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.resolveDepthBuffer = options.resolveDepthBuffer;\n\n\t\t/**\n\t\t * Whether to resolve the stencil buffer or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.resolveStencilBuffer = options.resolveStencilBuffer;\n\n\t\tthis._depthTexture = null;\n\t\tthis.depthTexture = options.depthTexture;\n\n\t\t/**\n\t\t * The number of MSAA samples.\n\t\t *\n\t\t * A value of `0` disables MSAA.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.samples = options.samples;\n\n\t\t/**\n\t\t * Whether to this target is used in multiview rendering.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.multiview = options.multiview;\n\n\t}\n\n\t_setTextureOptions( options = {} ) {\n\n\t\tconst values = {\n\t\t\tminFilter: LinearFilter,\n\t\t\tgenerateMipmaps: false,\n\t\t\tflipY: false,\n\t\t\tinternalFormat: null\n\t\t};\n\n\t\tif ( options.mapping !== undefined ) values.mapping = options.mapping;\n\t\tif ( options.wrapS !== undefined ) values.wrapS = options.wrapS;\n\t\tif ( options.wrapT !== undefined ) values.wrapT = options.wrapT;\n\t\tif ( options.wrapR !== undefined ) values.wrapR = options.wrapR;\n\t\tif ( options.magFilter !== undefined ) values.magFilter = options.magFilter;\n\t\tif ( options.minFilter !== undefined ) values.minFilter = options.minFilter;\n\t\tif ( options.format !== undefined ) values.format = options.format;\n\t\tif ( options.type !== undefined ) values.type = options.type;\n\t\tif ( options.anisotropy !== undefined ) values.anisotropy = options.anisotropy;\n\t\tif ( options.colorSpace !== undefined ) values.colorSpace = options.colorSpace;\n\t\tif ( options.flipY !== undefined ) values.flipY = options.flipY;\n\t\tif ( options.generateMipmaps !== undefined ) values.generateMipmaps = options.generateMipmaps;\n\t\tif ( options.internalFormat !== undefined ) values.internalFormat = options.internalFormat;\n\n\t\tfor ( let i = 0; i < this.textures.length; i ++ ) {\n\n\t\t\tconst texture = this.textures[ i ];\n\t\t\ttexture.setValues( values );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * The texture representing the default color attachment.\n\t *\n\t * @type {Texture}\n\t */\n\tget texture() {\n\n\t\treturn this.textures[ 0 ];\n\n\t}\n\n\tset texture( value ) {\n\n\t\tthis.textures[ 0 ] = value;\n\n\t}\n\n\tset depthTexture( current ) {\n\n\t\tif ( this._depthTexture !== null ) this._depthTexture.renderTarget = null;\n\t\tif ( current !== null ) current.renderTarget = this;\n\n\t\tthis._depthTexture = current;\n\n\t}\n\n\t/**\n\t * Instead of saving the depth in a renderbuffer, a texture\n\t * can be used instead which is useful for further processing\n\t * e.g. in context of post-processing.\n\t *\n\t * @type {?DepthTexture}\n\t * @default null\n\t */\n\tget depthTexture() {\n\n\t\treturn this._depthTexture;\n\n\t}\n\n\t/**\n\t * Sets the size of this render target.\n\t *\n\t * @param {number} width - The width.\n\t * @param {number} height - The height.\n\t * @param {number} [depth=1] - The depth.\n\t */\n\tsetSize( width, height, depth = 1 ) {\n\n\t\tif ( this.width !== width || this.height !== height || this.depth !== depth ) {\n\n\t\t\tthis.width = width;\n\t\t\tthis.height = height;\n\t\t\tthis.depth = depth;\n\n\t\t\tfor ( let i = 0, il = this.textures.length; i < il; i ++ ) {\n\n\t\t\t\tthis.textures[ i ].image.width = width;\n\t\t\t\tthis.textures[ i ].image.height = height;\n\t\t\t\tthis.textures[ i ].image.depth = depth;\n\n\t\t\t\tif ( this.textures[ i ].isData3DTexture !== true ) { // Fix for #31693\n\n\t\t\t\t\t// TODO: Reconsider setting isArrayTexture flag here and in the ctor of Texture.\n\t\t\t\t\t// Maybe a method `isArrayTexture()` or just a getter could replace a flag since\n\t\t\t\t\t// both are evaluated on each call?\n\n\t\t\t\t\tthis.textures[ i ].isArrayTexture = this.textures[ i ].image.depth > 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.dispose();\n\n\t\t}\n\n\t\tthis.viewport.set( 0, 0, width, height );\n\t\tthis.scissor.set( 0, 0, width, height );\n\n\t}\n\n\t/**\n\t * Returns a new render target with copied values from this instance.\n\t *\n\t * @return {RenderTarget} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Copies the settings of the given render target. This is a structural copy so\n\t * no resources are shared between render targets after the copy. That includes\n\t * all MRT textures and the depth texture.\n\t *\n\t * @param {RenderTarget} source - The render target to copy.\n\t * @return {RenderTarget} A reference to this instance.\n\t */\n\tcopy( source ) {\n\n\t\tthis.width = source.width;\n\t\tthis.height = source.height;\n\t\tthis.depth = source.depth;\n\n\t\tthis.scissor.copy( source.scissor );\n\t\tthis.scissorTest = source.scissorTest;\n\n\t\tthis.viewport.copy( source.viewport );\n\n\t\tthis.textures.length = 0;\n\n\t\tfor ( let i = 0, il = source.textures.length; i < il; i ++ ) {\n\n\t\t\tthis.textures[ i ] = source.textures[ i ].clone();\n\t\t\tthis.textures[ i ].isRenderTargetTexture = true;\n\t\t\tthis.textures[ i ].renderTarget = this;\n\n\t\t\t// ensure image object is not shared, see #20328\n\n\t\t\tconst image = Object.assign( {}, source.textures[ i ].image );\n\t\t\tthis.textures[ i ].source = new Source( image );\n\n\t\t}\n\n\t\tthis.depthBuffer = source.depthBuffer;\n\t\tthis.stencilBuffer = source.stencilBuffer;\n\n\t\tthis.resolveDepthBuffer = source.resolveDepthBuffer;\n\t\tthis.resolveStencilBuffer = source.resolveStencilBuffer;\n\n\t\tif ( source.depthTexture !== null ) this.depthTexture = source.depthTexture.clone();\n\n\t\tthis.samples = source.samples;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t *\n\t * @fires RenderTarget#dispose\n\t */\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n}\n\n/**\n * A render target used in context of {@link WebGLRenderer}.\n *\n * @augments RenderTarget\n */\nclass WebGLRenderTarget extends RenderTarget {\n\n\t/**\n\t * Constructs a new 3D render target.\n\t *\n\t * @param {number} [width=1] - The width of the render target.\n\t * @param {number} [height=1] - The height of the render target.\n\t * @param {RenderTarget~Options} [options] - The configuration object.\n\t */\n\tconstructor( width = 1, height = 1, options = {} ) {\n\n\t\tsuper( width, height, options );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isWebGLRenderTarget = true;\n\n\t}\n\n}\n\n/**\n * Creates an array of textures directly from raw buffer data.\n *\n * @augments Texture\n */\nclass DataArrayTexture extends Texture {\n\n\t/**\n\t * Constructs a new data array texture.\n\t *\n\t * @param {?TypedArray} [data=null] - The buffer data.\n\t * @param {number} [width=1] - The width of the texture.\n\t * @param {number} [height=1] - The height of the texture.\n\t * @param {number} [depth=1] - The depth of the texture.\n\t */\n\tconstructor( data = null, width = 1, height = 1, depth = 1 ) {\n\n\t\tsuper( null );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isDataArrayTexture = true;\n\n\t\t/**\n\t\t * The image definition of a data texture.\n\t\t *\n\t\t * @type {{data:TypedArray,width:number,height:number,depth:number}}\n\t\t */\n\t\tthis.image = { data, width, height, depth };\n\n\t\t/**\n\t\t * How the texture is sampled when a texel covers more than one pixel.\n\t\t *\n\t\t * Overwritten and set to `NearestFilter` by default.\n\t\t *\n\t\t * @type {(NearestFilter|NearestMipmapNearestFilter|NearestMipmapLinearFilter|LinearFilter|LinearMipmapNearestFilter|LinearMipmapLinearFilter)}\n\t\t * @default NearestFilter\n\t\t */\n\t\tthis.magFilter = NearestFilter;\n\n\t\t/**\n\t\t * How the texture is sampled when a texel covers less than one pixel.\n\t\t *\n\t\t * Overwritten and set to `NearestFilter` by default.\n\t\t *\n\t\t * @type {(NearestFilter|NearestMipmapNearestFilter|NearestMipmapLinearFilter|LinearFilter|LinearMipmapNearestFilter|LinearMipmapLinearFilter)}\n\t\t * @default NearestFilter\n\t\t */\n\t\tthis.minFilter = NearestFilter;\n\n\t\t/**\n\t\t * This defines how the texture is wrapped in the depth and corresponds to\n\t\t * *W* in UVW mapping.\n\t\t *\n\t\t * @type {(RepeatWrapping|ClampToEdgeWrapping|MirroredRepeatWrapping)}\n\t\t * @default ClampToEdgeWrapping\n\t\t */\n\t\tthis.wrapR = ClampToEdgeWrapping;\n\n\t\t/**\n\t\t * Whether to generate mipmaps (if possible) for a texture.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.generateMipmaps = false;\n\n\t\t/**\n\t\t * If set to `true`, the texture is flipped along the vertical axis when\n\t\t * uploaded to the GPU.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.flipY = false;\n\n\t\t/**\n\t\t * Specifies the alignment requirements for the start of each pixel row in memory.\n\t\t *\n\t\t * Overwritten and set to `1` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default 1\n\t\t */\n\t\tthis.unpackAlignment = 1;\n\n\t\t/**\n\t\t * A set of all layers which need to be updated in the texture.\n\t\t *\n\t\t * @type {Set<number>}\n\t\t */\n\t\tthis.layerUpdates = new Set();\n\n\t}\n\n\t/**\n\t * Describes that a specific layer of the texture needs to be updated.\n\t * Normally when {@link Texture#needsUpdate} is set to `true`, the\n\t * entire data texture array is sent to the GPU. Marking specific\n\t * layers will only transmit subsets of all mipmaps associated with a\n\t * specific depth in the array which is often much more performant.\n\t *\n\t * @param {number} layerIndex - The layer index that should be updated.\n\t */\n\taddLayerUpdate( layerIndex ) {\n\n\t\tthis.layerUpdates.add( layerIndex );\n\n\t}\n\n\t/**\n\t * Resets the layer updates registry.\n\t */\n\tclearLayerUpdates() {\n\n\t\tthis.layerUpdates.clear();\n\n\t}\n\n}\n\n/**\n * An array render target used in context of {@link WebGLRenderer}.\n *\n * @augments WebGLRenderTarget\n */\nclass WebGLArrayRenderTarget extends WebGLRenderTarget {\n\n\t/**\n\t * Constructs a new array render target.\n\t *\n\t * @param {number} [width=1] - The width of the render target.\n\t * @param {number} [height=1] - The height of the render target.\n\t * @param {number} [depth=1] - The height of the render target.\n\t * @param {RenderTarget~Options} [options] - The configuration object.\n\t */\n\tconstructor( width = 1, height = 1, depth = 1, options = {} ) {\n\n\t\tsuper( width, height, options );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isWebGLArrayRenderTarget = true;\n\n\t\tthis.depth = depth;\n\n\t\t/**\n\t\t * Overwritten with a different texture type.\n\t\t *\n\t\t * @type {DataArrayTexture}\n\t\t */\n\t\tthis.texture = new DataArrayTexture( null, width, height, depth );\n\t\tthis._setTextureOptions( options );\n\n\t\tthis.texture.isRenderTargetTexture = true;\n\n\t}\n\n}\n\n/**\n * Creates a three-dimensional texture from raw data, with parameters to\n * divide it into width, height, and depth.\n *\n * @augments Texture\n */\nclass Data3DTexture extends Texture {\n\n\t/**\n\t * Constructs a new data array texture.\n\t *\n\t * @param {?TypedArray} [data=null] - The buffer data.\n\t * @param {number} [width=1] - The width of the texture.\n\t * @param {number} [height=1] - The height of the texture.\n\t * @param {number} [depth=1] - The depth of the texture.\n\t */\n\tconstructor( data = null, width = 1, height = 1, depth = 1 ) {\n\n\t\t// We're going to add .setXXX() methods for setting properties later.\n\t\t// Users can still set in Data3DTexture directly.\n\t\t//\n\t\t//\tconst texture = new THREE.Data3DTexture( data, width, height, depth );\n\t\t// \ttexture.anisotropy = 16;\n\t\t//\n\t\t// See #14839\n\n\t\tsuper( null );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isData3DTexture = true;\n\n\t\t/**\n\t\t * The image definition of a data texture.\n\t\t *\n\t\t * @type {{data:TypedArray,width:number,height:number,depth:number}}\n\t\t */\n\t\tthis.image = { data, width, height, depth };\n\n\t\t/**\n\t\t * How the texture is sampled when a texel covers more than one pixel.\n\t\t *\n\t\t * Overwritten and set to `NearestFilter` by default.\n\t\t *\n\t\t * @type {(NearestFilter|NearestMipmapNearestFilter|NearestMipmapLinearFilter|LinearFilter|LinearMipmapNearestFilter|LinearMipmapLinearFilter)}\n\t\t * @default NearestFilter\n\t\t */\n\t\tthis.magFilter = NearestFilter;\n\n\t\t/**\n\t\t * How the texture is sampled when a texel covers less than one pixel.\n\t\t *\n\t\t * Overwritten and set to `NearestFilter` by default.\n\t\t *\n\t\t * @type {(NearestFilter|NearestMipmapNearestFilter|NearestMipmapLinearFilter|LinearFilter|LinearMipmapNearestFilter|LinearMipmapLinearFilter)}\n\t\t * @default NearestFilter\n\t\t */\n\t\tthis.minFilter = NearestFilter;\n\n\t\t/**\n\t\t * This defines how the texture is wrapped in the depth and corresponds to\n\t\t * *W* in UVW mapping.\n\t\t *\n\t\t * @type {(RepeatWrapping|ClampToEdgeWrapping|MirroredRepeatWrapping)}\n\t\t * @default ClampToEdgeWrapping\n\t\t */\n\t\tthis.wrapR = ClampToEdgeWrapping;\n\n\t\t/**\n\t\t * Whether to generate mipmaps (if possible) for a texture.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.generateMipmaps = false;\n\n\t\t/**\n\t\t * If set to `true`, the texture is flipped along the vertical axis when\n\t\t * uploaded to the GPU.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.flipY = false;\n\n\t\t/**\n\t\t * Specifies the alignment requirements for the start of each pixel row in memory.\n\t\t *\n\t\t * Overwritten and set to `1` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default 1\n\t\t */\n\t\tthis.unpackAlignment = 1;\n\n\t}\n\n}\n\n/**\n * A 3D render target used in context of {@link WebGLRenderer}.\n *\n * @augments WebGLRenderTarget\n */\nclass WebGL3DRenderTarget extends WebGLRenderTarget {\n\n\t/**\n\t * Constructs a new 3D render target.\n\t *\n\t * @param {number} [width=1] - The width of the render target.\n\t * @param {number} [height=1] - The height of the render target.\n\t * @param {number} [depth=1] - The height of the render target.\n\t * @param {RenderTarget~Options} [options] - The configuration object.\n\t */\n\tconstructor( width = 1, height = 1, depth = 1, options = {} ) {\n\n\t\tsuper( width, height, options );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isWebGL3DRenderTarget = true;\n\n\t\tthis.depth = depth;\n\n\t\t/**\n\t\t * Overwritten with a different texture type.\n\t\t *\n\t\t * @type {Data3DTexture}\n\t\t */\n\t\tthis.texture = new Data3DTexture( null, width, height, depth );\n\t\tthis._setTextureOptions( options );\n\n\t\tthis.texture.isRenderTargetTexture = true;\n\n\t}\n\n}\n\n/**\n * Represents an axis-aligned bounding box (AABB) in 3D space.\n */\nclass Box3 {\n\n\t/**\n\t * Constructs a new bounding box.\n\t *\n\t * @param {Vector3} [min=(Infinity,Infinity,Infinity)] - A vector representing the lower boundary of the box.\n\t * @param {Vector3} [max=(-Infinity,-Infinity,-Infinity)] - A vector representing the upper boundary of the box.\n\t */\n\tconstructor( min = new Vector3( + Infinity, + Infinity, + Infinity ), max = new Vector3( - Infinity, - Infinity, - Infinity ) ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isBox3 = true;\n\n\t\t/**\n\t\t * The lower boundary of the box.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.min = min;\n\n\t\t/**\n\t\t * The upper boundary of the box.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.max = max;\n\n\t}\n\n\t/**\n\t * Sets the lower and upper boundaries of this box.\n\t * Please note that this method only copies the values from the given objects.\n\t *\n\t * @param {Vector3} min - The lower boundary of the box.\n\t * @param {Vector3} max - The upper boundary of the box.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tset( min, max ) {\n\n\t\tthis.min.copy( min );\n\t\tthis.max.copy( max );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the upper and lower bounds of this box so it encloses the position data\n\t * in the given array.\n\t *\n\t * @param {Array<number>} array - An array holding 3D position data.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tsetFromArray( array ) {\n\n\t\tthis.makeEmpty();\n\n\t\tfor ( let i = 0, il = array.length; i < il; i += 3 ) {\n\n\t\t\tthis.expandByPoint( _vector$b.fromArray( array, i ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the upper and lower bounds of this box so it encloses the position data\n\t * in the given buffer attribute.\n\t *\n\t * @param {BufferAttribute} attribute - A buffer attribute holding 3D position data.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tsetFromBufferAttribute( attribute ) {\n\n\t\tthis.makeEmpty();\n\n\t\tfor ( let i = 0, il = attribute.count; i < il; i ++ ) {\n\n\t\t\tthis.expandByPoint( _vector$b.fromBufferAttribute( attribute, i ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the upper and lower bounds of this box so it encloses the position data\n\t * in the given array.\n\t *\n\t * @param {Array<Vector3>} points - An array holding 3D position data as instances of {@link Vector3}.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tsetFromPoints( points ) {\n\n\t\tthis.makeEmpty();\n\n\t\tfor ( let i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\tthis.expandByPoint( points[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Centers this box on the given center vector and sets this box's width, height and\n\t * depth to the given size values.\n\t *\n\t * @param {Vector3} center - The center of the box.\n\t * @param {Vector3} size - The x, y and z dimensions of the box.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tsetFromCenterAndSize( center, size ) {\n\n\t\tconst halfSize = _vector$b.copy( size ).multiplyScalar( 0.5 );\n\n\t\tthis.min.copy( center ).sub( halfSize );\n\t\tthis.max.copy( center ).add( halfSize );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes the world-axis-aligned bounding box for the given 3D object\n\t * (including its children), accounting for the object's, and children's,\n\t * world transforms. The function may result in a larger box than strictly necessary.\n\t *\n\t * @param {Object3D} object - The 3D object to compute the bounding box for.\n\t * @param {boolean} [precise=false] - If set to `true`, the method computes the smallest\n\t * world-axis-aligned bounding box at the expense of more computation.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tsetFromObject( object, precise = false ) {\n\n\t\tthis.makeEmpty();\n\n\t\treturn this.expandByObject( object, precise );\n\n\t}\n\n\t/**\n\t * Returns a new box with copied values from this instance.\n\t *\n\t * @return {Box3} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Copies the values of the given box to this instance.\n\t *\n\t * @param {Box3} box - The box to copy.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tcopy( box ) {\n\n\t\tthis.min.copy( box.min );\n\t\tthis.max.copy( box.max );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Makes this box empty which means in encloses a zero space in 3D.\n\t *\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tmakeEmpty() {\n\n\t\tthis.min.x = this.min.y = this.min.z = + Infinity;\n\t\tthis.max.x = this.max.y = this.max.z = - Infinity;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns true if this box includes zero points within its bounds.\n\t * Note that a box with equal lower and upper bounds still includes one\n\t * point, the one both bounds share.\n\t *\n\t * @return {boolean} Whether this box is empty or not.\n\t */\n\tisEmpty() {\n\n\t\t// this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes\n\n\t\treturn ( this.max.x < this.min.x ) || ( this.max.y < this.min.y ) || ( this.max.z < this.min.z );\n\n\t}\n\n\t/**\n\t * Returns the center point of this box.\n\t *\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The center point.\n\t */\n\tgetCenter( target ) {\n\n\t\treturn this.isEmpty() ? target.set( 0, 0, 0 ) : target.addVectors( this.min, this.max ).multiplyScalar( 0.5 );\n\n\t}\n\n\t/**\n\t * Returns the dimensions of this box.\n\t *\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The size.\n\t */\n\tgetSize( target ) {\n\n\t\treturn this.isEmpty() ? target.set( 0, 0, 0 ) : target.subVectors( this.max, this.min );\n\n\t}\n\n\t/**\n\t * Expands the boundaries of this box to include the given point.\n\t *\n\t * @param {Vector3} point - The point that should be included by the bounding box.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\texpandByPoint( point ) {\n\n\t\tthis.min.min( point );\n\t\tthis.max.max( point );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Expands this box equilaterally by the given vector. The width of this\n\t * box will be expanded by the x component of the vector in both\n\t * directions. The height of this box will be expanded by the y component of\n\t * the vector in both directions. The depth of this box will be\n\t * expanded by the z component of the vector in both directions.\n\t *\n\t * @param {Vector3} vector - The vector that should expand the bounding box.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\texpandByVector( vector ) {\n\n\t\tthis.min.sub( vector );\n\t\tthis.max.add( vector );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Expands each dimension of the box by the given scalar. If negative, the\n\t * dimensions of the box will be contracted.\n\t *\n\t * @param {number} scalar - The scalar value that should expand the bounding box.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\texpandByScalar( scalar ) {\n\n\t\tthis.min.addScalar( - scalar );\n\t\tthis.max.addScalar( scalar );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Expands the boundaries of this box to include the given 3D object and\n\t * its children, accounting for the object's, and children's, world\n\t * transforms. The function may result in a larger box than strictly\n\t * necessary (unless the precise parameter is set to true).\n\t *\n\t * @param {Object3D} object - The 3D object that should expand the bounding box.\n\t * @param {boolean} precise - If set to `true`, the method expands the bounding box\n\t * as little as necessary at the expense of more computation.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\texpandByObject( object, precise = false ) {\n\n\t\t// Computes the world-axis-aligned bounding box of an object (including its children),\n\t\t// accounting for both the object's, and children's, world transforms\n\n\t\tobject.updateWorldMatrix( false, false );\n\n\t\tconst geometry = object.geometry;\n\n\t\tif ( geometry !== undefined ) {\n\n\t\t\tconst positionAttribute = geometry.getAttribute( 'position' );\n\n\t\t\t// precise AABB computation based on vertex data requires at least a position attribute.\n\t\t\t// instancing isn't supported so far and uses the normal (conservative) code path.\n\n\t\t\tif ( precise === true && positionAttribute !== undefined && object.isInstancedMesh !== true ) {\n\n\t\t\t\tfor ( let i = 0, l = positionAttribute.count; i < l; i ++ ) {\n\n\t\t\t\t\tif ( object.isMesh === true ) {\n\n\t\t\t\t\t\tobject.getVertexPosition( i, _vector$b );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_vector$b.fromBufferAttribute( positionAttribute, i );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_vector$b.applyMatrix4( object.matrixWorld );\n\t\t\t\t\tthis.expandByPoint( _vector$b );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( object.boundingBox !== undefined ) {\n\n\t\t\t\t\t// object-level bounding box\n\n\t\t\t\t\tif ( object.boundingBox === null ) {\n\n\t\t\t\t\t\tobject.computeBoundingBox();\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_box$4.copy( object.boundingBox );\n\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// geometry-level bounding box\n\n\t\t\t\t\tif ( geometry.boundingBox === null ) {\n\n\t\t\t\t\t\tgeometry.computeBoundingBox();\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_box$4.copy( geometry.boundingBox );\n\n\t\t\t\t}\n\n\t\t\t\t_box$4.applyMatrix4( object.matrixWorld );\n\n\t\t\t\tthis.union( _box$4 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst children = object.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tthis.expandByObject( children[ i ], precise );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if the given point lies within or on the boundaries of this box.\n\t *\n\t * @param {Vector3} point - The point to test.\n\t * @return {boolean} Whether the bounding box contains the given point or not.\n\t */\n\tcontainsPoint( point ) {\n\n\t\treturn point.x >= this.min.x && point.x <= this.max.x &&\n\t\t\tpoint.y >= this.min.y && point.y <= this.max.y &&\n\t\t\tpoint.z >= this.min.z && point.z <= this.max.z;\n\n\t}\n\n\t/**\n\t * Returns `true` if this bounding box includes the entirety of the given bounding box.\n\t * If this box and the given one are identical, this function also returns `true`.\n\t *\n\t * @param {Box3} box - The bounding box to test.\n\t * @return {boolean} Whether the bounding box contains the given bounding box or not.\n\t */\n\tcontainsBox( box ) {\n\n\t\treturn this.min.x <= box.min.x && box.max.x <= this.max.x &&\n\t\t\tthis.min.y <= box.min.y && box.max.y <= this.max.y &&\n\t\t\tthis.min.z <= box.min.z && box.max.z <= this.max.z;\n\n\t}\n\n\t/**\n\t * Returns a point as a proportion of this box's width, height and depth.\n\t *\n\t * @param {Vector3} point - A point in 3D space.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} A point as a proportion of this box's width, height and depth.\n\t */\n\tgetParameter( point, target ) {\n\n\t\t// This can potentially have a divide by zero if the box\n\t\t// has a size dimension of 0.\n\n\t\treturn target.set(\n\t\t\t( point.x - this.min.x ) / ( this.max.x - this.min.x ),\n\t\t\t( point.y - this.min.y ) / ( this.max.y - this.min.y ),\n\t\t\t( point.z - this.min.z ) / ( this.max.z - this.min.z )\n\t\t);\n\n\t}\n\n\t/**\n\t * Returns `true` if the given bounding box intersects with this bounding box.\n\t *\n\t * @param {Box3} box - The bounding box to test.\n\t * @return {boolean} Whether the given bounding box intersects with this bounding box.\n\t */\n\tintersectsBox( box ) {\n\n\t\t// using 6 splitting planes to rule out intersections.\n\t\treturn box.max.x >= this.min.x && box.min.x <= this.max.x &&\n\t\t\tbox.max.y >= this.min.y && box.min.y <= this.max.y &&\n\t\t\tbox.max.z >= this.min.z && box.min.z <= this.max.z;\n\n\t}\n\n\t/**\n\t * Returns `true` if the given bounding sphere intersects with this bounding box.\n\t *\n\t * @param {Sphere} sphere - The bounding sphere to test.\n\t * @return {boolean} Whether the given bounding sphere intersects with this bounding box.\n\t */\n\tintersectsSphere( sphere ) {\n\n\t\t// Find the point on the AABB closest to the sphere center.\n\t\tthis.clampPoint( sphere.center, _vector$b );\n\n\t\t// If that point is inside the sphere, the AABB and sphere intersect.\n\t\treturn _vector$b.distanceToSquared( sphere.center ) <= ( sphere.radius * sphere.radius );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given plane intersects with this bounding box.\n\t *\n\t * @param {Plane} plane - The plane to test.\n\t * @return {boolean} Whether the given plane intersects with this bounding box.\n\t */\n\tintersectsPlane( plane ) {\n\n\t\t// We compute the minimum and maximum dot product values. If those values\n\t\t// are on the same side (back or front) of the plane, then there is no intersection.\n\n\t\tlet min, max;\n\n\t\tif ( plane.normal.x > 0 ) {\n\n\t\t\tmin = plane.normal.x * this.min.x;\n\t\t\tmax = plane.normal.x * this.max.x;\n\n\t\t} else {\n\n\t\t\tmin = plane.normal.x * this.max.x;\n\t\t\tmax = plane.normal.x * this.min.x;\n\n\t\t}\n\n\t\tif ( plane.normal.y > 0 ) {\n\n\t\t\tmin += plane.normal.y * this.min.y;\n\t\t\tmax += plane.normal.y * this.max.y;\n\n\t\t} else {\n\n\t\t\tmin += plane.normal.y * this.max.y;\n\t\t\tmax += plane.normal.y * this.min.y;\n\n\t\t}\n\n\t\tif ( plane.normal.z > 0 ) {\n\n\t\t\tmin += plane.normal.z * this.min.z;\n\t\t\tmax += plane.normal.z * this.max.z;\n\n\t\t} else {\n\n\t\t\tmin += plane.normal.z * this.max.z;\n\t\t\tmax += plane.normal.z * this.min.z;\n\n\t\t}\n\n\t\treturn ( min <= - plane.constant && max >= - plane.constant );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given triangle intersects with this bounding box.\n\t *\n\t * @param {Triangle} triangle - The triangle to test.\n\t * @return {boolean} Whether the given triangle intersects with this bounding box.\n\t */\n\tintersectsTriangle( triangle ) {\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// compute box center and extents\n\t\tthis.getCenter( _center );\n\t\t_extents.subVectors( this.max, _center );\n\n\t\t// translate triangle to aabb origin\n\t\t_v0$3.subVectors( triangle.a, _center );\n\t\t_v1$7.subVectors( triangle.b, _center );\n\t\t_v2$4.subVectors( triangle.c, _center );\n\n\t\t// compute edge vectors for triangle\n\t\t_f0.subVectors( _v1$7, _v0$3 );\n\t\t_f1.subVectors( _v2$4, _v1$7 );\n\t\t_f2.subVectors( _v0$3, _v2$4 );\n\n\t\t// test against axes that are given by cross product combinations of the edges of the triangle and the edges of the aabb\n\t\t// make an axis testing of each of the 3 sides of the aabb against each of the 3 sides of the triangle = 9 axis of separation\n\t\t// axis_ij = u_i x f_j (u0, u1, u2 = face normals of aabb = x,y,z axes vectors since aabb is axis aligned)\n\t\tlet axes = [\n\t\t\t0, - _f0.z, _f0.y, 0, - _f1.z, _f1.y, 0, - _f2.z, _f2.y,\n\t\t\t_f0.z, 0, - _f0.x, _f1.z, 0, - _f1.x, _f2.z, 0, - _f2.x,\n\t\t\t- _f0.y, _f0.x, 0, - _f1.y, _f1.x, 0, - _f2.y, _f2.x, 0\n\t\t];\n\t\tif ( ! satForAxes( axes, _v0$3, _v1$7, _v2$4, _extents ) ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// test 3 face normals from the aabb\n\t\taxes = [ 1, 0, 0, 0, 1, 0, 0, 0, 1 ];\n\t\tif ( ! satForAxes( axes, _v0$3, _v1$7, _v2$4, _extents ) ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// finally testing the face normal of the triangle\n\t\t// use already existing triangle edge vectors here\n\t\t_triangleNormal.crossVectors( _f0, _f1 );\n\t\taxes = [ _triangleNormal.x, _triangleNormal.y, _triangleNormal.z ];\n\n\t\treturn satForAxes( axes, _v0$3, _v1$7, _v2$4, _extents );\n\n\t}\n\n\t/**\n\t * Clamps the given point within the bounds of this box.\n\t *\n\t * @param {Vector3} point - The point to clamp.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The clamped point.\n\t */\n\tclampPoint( point, target ) {\n\n\t\treturn target.copy( point ).clamp( this.min, this.max );\n\n\t}\n\n\t/**\n\t * Returns the euclidean distance from any edge of this box to the specified point. If\n\t * the given point lies inside of this box, the distance will be `0`.\n\t *\n\t * @param {Vector3} point - The point to compute the distance to.\n\t * @return {number} The euclidean distance.\n\t */\n\tdistanceToPoint( point ) {\n\n\t\treturn this.clampPoint( point, _vector$b ).distanceTo( point );\n\n\t}\n\n\t/**\n\t * Returns a bounding sphere that encloses this bounding box.\n\t *\n\t * @param {Sphere} target - The target sphere that is used to store the method's result.\n\t * @return {Sphere} The bounding sphere that encloses this bounding box.\n\t */\n\tgetBoundingSphere( target ) {\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\ttarget.makeEmpty();\n\n\t\t} else {\n\n\t\t\tthis.getCenter( target.center );\n\n\t\t\ttarget.radius = this.getSize( _vector$b ).length() * 0.5;\n\n\t\t}\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Computes the intersection of this bounding box and the given one, setting the upper\n\t * bound of this box to the lesser of the two boxes' upper bounds and the\n\t * lower bound of this box to the greater of the two boxes' lower bounds. If\n\t * there's no overlap, makes this box empty.\n\t *\n\t * @param {Box3} box - The bounding box to intersect with.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tintersect( box ) {\n\n\t\tthis.min.max( box.min );\n\t\tthis.max.min( box.max );\n\n\t\t// ensure that if there is no overlap, the result is fully empty, not slightly empty with non-inf/+inf values that will cause subsequence intersects to erroneously return valid values.\n\t\tif ( this.isEmpty() ) this.makeEmpty();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes the union of this box and another and the given one, setting the upper\n\t * bound of this box to the greater of the two boxes' upper bounds and the\n\t * lower bound of this box to the lesser of the two boxes' lower bounds.\n\t *\n\t * @param {Box3} box - The bounding box that will be unioned with this instance.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tunion( box ) {\n\n\t\tthis.min.min( box.min );\n\t\tthis.max.max( box.max );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Transforms this bounding box by the given 4x4 transformation matrix.\n\t *\n\t * @param {Matrix4} matrix - The transformation matrix.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tapplyMatrix4( matrix ) {\n\n\t\t// transform of empty box is an empty box.\n\t\tif ( this.isEmpty() ) return this;\n\n\t\t// NOTE: I am using a binary pattern to specify all 2^3 combinations below\n\t\t_points[ 0 ].set( this.min.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 000\n\t\t_points[ 1 ].set( this.min.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 001\n\t\t_points[ 2 ].set( this.min.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 010\n\t\t_points[ 3 ].set( this.min.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 011\n\t\t_points[ 4 ].set( this.max.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 100\n\t\t_points[ 5 ].set( this.max.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 101\n\t\t_points[ 6 ].set( this.max.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 110\n\t\t_points[ 7 ].set( this.max.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 111\n\n\t\tthis.setFromPoints( _points );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given offset to both the upper and lower bounds of this bounding box,\n\t * effectively moving it in 3D space.\n\t *\n\t * @param {Vector3} offset - The offset that should be used to translate the bounding box.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\ttranslate( offset ) {\n\n\t\tthis.min.add( offset );\n\t\tthis.max.add( offset );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this bounding box is equal with the given one.\n\t *\n\t * @param {Box3} box - The box to test for equality.\n\t * @return {boolean} Whether this bounding box is equal with the given one.\n\t */\n\tequals( box ) {\n\n\t\treturn box.min.equals( this.min ) && box.max.equals( this.max );\n\n\t}\n\n\t/**\n\t * Returns a serialized structure of the bounding box.\n\t *\n\t * @return {Object} Serialized structure with fields representing the object state.\n\t */\n\ttoJSON() {\n\n\t\treturn {\n\t\t\tmin: this.min.toArray(),\n\t\t\tmax: this.max.toArray()\n\t\t};\n\n\t}\n\n\t/**\n\t * Returns a serialized structure of the bounding box.\n\t *\n\t * @param {Object} json - The serialized json to set the box from.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tfromJSON( json ) {\n\n\t\tthis.min.fromArray( json.min );\n\t\tthis.max.fromArray( json.max );\n\t\treturn this;\n\n\t}\n\n}\n\nconst _points = [\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3()\n];\n\nconst _vector$b = /*@__PURE__*/ new Vector3();\n\nconst _box$4 = /*@__PURE__*/ new Box3();\n\n// triangle centered vertices\n\nconst _v0$3 = /*@__PURE__*/ new Vector3();\nconst _v1$7 = /*@__PURE__*/ new Vector3();\nconst _v2$4 = /*@__PURE__*/ new Vector3();\n\n// triangle edge vectors\n\nconst _f0 = /*@__PURE__*/ new Vector3();\nconst _f1 = /*@__PURE__*/ new Vector3();\nconst _f2 = /*@__PURE__*/ new Vector3();\n\nconst _center = /*@__PURE__*/ new Vector3();\nconst _extents = /*@__PURE__*/ new Vector3();\nconst _triangleNormal = /*@__PURE__*/ new Vector3();\nconst _testAxis = /*@__PURE__*/ new Vector3();\n\nfunction satForAxes( axes, v0, v1, v2, extents ) {\n\n\tfor ( let i = 0, j = axes.length - 3; i <= j; i += 3 ) {\n\n\t\t_testAxis.fromArray( axes, i );\n\t\t// project the aabb onto the separating axis\n\t\tconst r = extents.x * Math.abs( _testAxis.x ) + extents.y * Math.abs( _testAxis.y ) + extents.z * Math.abs( _testAxis.z );\n\t\t// project all 3 vertices of the triangle onto the separating axis\n\t\tconst p0 = v0.dot( _testAxis );\n\t\tconst p1 = v1.dot( _testAxis );\n\t\tconst p2 = v2.dot( _testAxis );\n\t\t// actual test, basically see if either of the most extreme of the triangle points intersects r\n\t\tif ( Math.max( - Math.max( p0, p1, p2 ), Math.min( p0, p1, p2 ) ) > r ) {\n\n\t\t\t// points of the projected triangle are outside the projected half-length of the aabb\n\t\t\t// the axis is separating and we can exit\n\t\t\treturn false;\n\n\t\t}\n\n\t}\n\n\treturn true;\n\n}\n\nconst _box$3 = /*@__PURE__*/ new Box3();\nconst _v1$6 = /*@__PURE__*/ new Vector3();\nconst _v2$3 = /*@__PURE__*/ new Vector3();\n\n/**\n * An analytical 3D sphere defined by a center and radius. This class is mainly\n * used as a Bounding Sphere for 3D objects.\n */\nclass Sphere {\n\n\t/**\n\t * Constructs a new sphere.\n\t *\n\t * @param {Vector3} [center=(0,0,0)] - The center of the sphere\n\t * @param {number} [radius=-1] - The radius of the sphere.\n\t */\n\tconstructor( center = new Vector3(), radius = -1 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSphere = true;\n\n\t\t/**\n\t\t * The center of the sphere\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.center = center;\n\n\t\t/**\n\t\t * The radius of the sphere.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.radius = radius;\n\n\t}\n\n\t/**\n\t * Sets the sphere's components by copying the given values.\n\t *\n\t * @param {Vector3} center - The center.\n\t * @param {number} radius - The radius.\n\t * @return {Sphere} A reference to this sphere.\n\t */\n\tset( center, radius ) {\n\n\t\tthis.center.copy( center );\n\t\tthis.radius = radius;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes the minimum bounding sphere for list of points.\n\t * If the optional center point is given, it is used as the sphere's\n\t * center. Otherwise, the center of the axis-aligned bounding box\n\t * encompassing the points is calculated.\n\t *\n\t * @param {Array<Vector3>} points - A list of points in 3D space.\n\t * @param {Vector3} [optionalCenter] - The center of the sphere.\n\t * @return {Sphere} A reference to this sphere.\n\t */\n\tsetFromPoints( points, optionalCenter ) {\n\n\t\tconst center = this.center;\n\n\t\tif ( optionalCenter !== undefined ) {\n\n\t\t\tcenter.copy( optionalCenter );\n\n\t\t} else {\n\n\t\t\t_box$3.setFromPoints( points ).getCenter( center );\n\n\t\t}\n\n\t\tlet maxRadiusSq = 0;\n\n\t\tfor ( let i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( points[ i ] ) );\n\n\t\t}\n\n\t\tthis.radius = Math.sqrt( maxRadiusSq );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the values of the given sphere to this instance.\n\t *\n\t * @param {Sphere} sphere - The sphere to copy.\n\t * @return {Sphere} A reference to this sphere.\n\t */\n\tcopy( sphere ) {\n\n\t\tthis.center.copy( sphere.center );\n\t\tthis.radius = sphere.radius;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if the sphere is empty (the radius set to a negative number).\n\t *\n\t * Spheres with a radius of `0` contain only their center point and are not\n\t * considered to be empty.\n\t *\n\t * @return {boolean} Whether this sphere is empty or not.\n\t */\n\tisEmpty() {\n\n\t\treturn ( this.radius < 0 );\n\n\t}\n\n\t/**\n\t * Makes this sphere empty which means in encloses a zero space in 3D.\n\t *\n\t * @return {Sphere} A reference to this sphere.\n\t */\n\tmakeEmpty() {\n\n\t\tthis.center.set( 0, 0, 0 );\n\t\tthis.radius = -1;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this sphere contains the given point inclusive of\n\t * the surface of the sphere.\n\t *\n\t * @param {Vector3} point - The point to check.\n\t * @return {boolean} Whether this sphere contains the given point or not.\n\t */\n\tcontainsPoint( point ) {\n\n\t\treturn ( point.distanceToSquared( this.center ) <= ( this.radius * this.radius ) );\n\n\t}\n\n\t/**\n\t * Returns the closest distance from the boundary of the sphere to the\n\t * given point. If the sphere contains the point, the distance will\n\t * be negative.\n\t *\n\t * @param {Vector3} point - The point to compute the distance to.\n\t * @return {number} The distance to the point.\n\t */\n\tdistanceToPoint( point ) {\n\n\t\treturn ( point.distanceTo( this.center ) - this.radius );\n\n\t}\n\n\t/**\n\t * Returns `true` if this sphere intersects with the given one.\n\t *\n\t * @param {Sphere} sphere - The sphere to test.\n\t * @return {boolean} Whether this sphere intersects with the given one or not.\n\t */\n\tintersectsSphere( sphere ) {\n\n\t\tconst radiusSum = this.radius + sphere.radius;\n\n\t\treturn sphere.center.distanceToSquared( this.center ) <= ( radiusSum * radiusSum );\n\n\t}\n\n\t/**\n\t * Returns `true` if this sphere intersects with the given box.\n\t *\n\t * @param {Box3} box - The box to test.\n\t * @return {boolean} Whether this sphere intersects with the given box or not.\n\t */\n\tintersectsBox( box ) {\n\n\t\treturn box.intersectsSphere( this );\n\n\t}\n\n\t/**\n\t * Returns `true` if this sphere intersects with the given plane.\n\t *\n\t * @param {Plane} plane - The plane to test.\n\t * @return {boolean} Whether this sphere intersects with the given plane or not.\n\t */\n\tintersectsPlane( plane ) {\n\n\t\treturn Math.abs( plane.distanceToPoint( this.center ) ) <= this.radius;\n\n\t}\n\n\t/**\n\t * Clamps a point within the sphere. If the point is outside the sphere, it\n\t * will clamp it to the closest point on the edge of the sphere. Points\n\t * already inside the sphere will not be affected.\n\t *\n\t * @param {Vector3} point - The plane to clamp.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The clamped point.\n\t */\n\tclampPoint( point, target ) {\n\n\t\tconst deltaLengthSq = this.center.distanceToSquared( point );\n\n\t\ttarget.copy( point );\n\n\t\tif ( deltaLengthSq > ( this.radius * this.radius ) ) {\n\n\t\t\ttarget.sub( this.center ).normalize();\n\t\t\ttarget.multiplyScalar( this.radius ).add( this.center );\n\n\t\t}\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Returns a bounding box that encloses this sphere.\n\t *\n\t * @param {Box3} target - The target box that is used to store the method's result.\n\t * @return {Box3} The bounding box that encloses this sphere.\n\t */\n\tgetBoundingBox( target ) {\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\t// Empty sphere produces empty bounding box\n\t\t\ttarget.makeEmpty();\n\t\t\treturn target;\n\n\t\t}\n\n\t\ttarget.set( this.center, this.center );\n\t\ttarget.expandByScalar( this.radius );\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Transforms this sphere with the given 4x4 transformation matrix.\n\t *\n\t * @param {Matrix4} matrix - The transformation matrix.\n\t * @return {Sphere} A reference to this sphere.\n\t */\n\tapplyMatrix4( matrix ) {\n\n\t\tthis.center.applyMatrix4( matrix );\n\t\tthis.radius = this.radius * matrix.getMaxScaleOnAxis();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Translates the sphere's center by the given offset.\n\t *\n\t * @param {Vector3} offset - The offset.\n\t * @return {Sphere} A reference to this sphere.\n\t */\n\ttranslate( offset ) {\n\n\t\tthis.center.add( offset );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Expands the boundaries of this sphere to include the given point.\n\t *\n\t * @param {Vector3} point - The point to include.\n\t * @return {Sphere} A reference to this sphere.\n\t */\n\texpandByPoint( point ) {\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\tthis.center.copy( point );\n\n\t\t\tthis.radius = 0;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\t_v1$6.subVectors( point, this.center );\n\n\t\tconst lengthSq = _v1$6.lengthSq();\n\n\t\tif ( lengthSq > ( this.radius * this.radius ) ) {\n\n\t\t\t// calculate the minimal sphere\n\n\t\t\tconst length = Math.sqrt( lengthSq );\n\n\t\t\tconst delta = ( length - this.radius ) * 0.5;\n\n\t\t\tthis.center.addScaledVector( _v1$6, delta / length );\n\n\t\t\tthis.radius += delta;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Expands this sphere to enclose both the original sphere and the given sphere.\n\t *\n\t * @param {Sphere} sphere - The sphere to include.\n\t * @return {Sphere} A reference to this sphere.\n\t */\n\tunion( sphere ) {\n\n\t\tif ( sphere.isEmpty() ) {\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\tthis.copy( sphere );\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tif ( this.center.equals( sphere.center ) === true ) {\n\n\t\t\t this.radius = Math.max( this.radius, sphere.radius );\n\n\t\t} else {\n\n\t\t\t_v2$3.subVectors( sphere.center, this.center ).setLength( sphere.radius );\n\n\t\t\tthis.expandByPoint( _v1$6.copy( sphere.center ).add( _v2$3 ) );\n\n\t\t\tthis.expandByPoint( _v1$6.copy( sphere.center ).sub( _v2$3 ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this sphere is equal with the given one.\n\t *\n\t * @param {Sphere} sphere - The sphere to test for equality.\n\t * @return {boolean} Whether this bounding sphere is equal with the given one.\n\t */\n\tequals( sphere ) {\n\n\t\treturn sphere.center.equals( this.center ) && ( sphere.radius === this.radius );\n\n\t}\n\n\t/**\n\t * Returns a new sphere with copied values from this instance.\n\t *\n\t * @return {Sphere} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Returns a serialized structure of the bounding sphere.\n\t *\n\t * @return {Object} Serialized structure with fields representing the object state.\n\t */\n\ttoJSON() {\n\n\t\treturn {\n\t\t\tradius: this.radius,\n\t\t\tcenter: this.center.toArray()\n\t\t};\n\n\t}\n\n\t/**\n\t * Returns a serialized structure of the bounding sphere.\n\t *\n\t * @param {Object} json - The serialized json to set the sphere from.\n\t * @return {Box3} A reference to this bounding sphere.\n\t */\n\tfromJSON( json ) {\n\n\t\tthis.radius = json.radius;\n\t\tthis.center.fromArray( json.center );\n\t\treturn this;\n\n\t}\n\n}\n\nconst _vector$a = /*@__PURE__*/ new Vector3();\nconst _segCenter = /*@__PURE__*/ new Vector3();\nconst _segDir = /*@__PURE__*/ new Vector3();\nconst _diff = /*@__PURE__*/ new Vector3();\n\nconst _edge1 = /*@__PURE__*/ new Vector3();\nconst _edge2 = /*@__PURE__*/ new Vector3();\nconst _normal$1 = /*@__PURE__*/ new Vector3();\n\n/**\n * A ray that emits from an origin in a certain direction. The class is used by\n * {@link Raycaster} to assist with raycasting. Raycasting is used for\n * mouse picking (working out what objects in the 3D space the mouse is over)\n * amongst other things.\n */\nclass Ray {\n\n\t/**\n\t * Constructs a new ray.\n\t *\n\t * @param {Vector3} [origin=(0,0,0)] - The origin of the ray.\n\t * @param {Vector3} [direction=(0,0,-1)] - The (normalized) direction of the ray.\n\t */\n\tconstructor( origin = new Vector3(), direction = new Vector3( 0, 0, -1 ) ) {\n\n\t\t/**\n\t\t * The origin of the ray.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.origin = origin;\n\n\t\t/**\n\t\t * The (normalized) direction of the ray.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.direction = direction;\n\n\t}\n\n\t/**\n\t * Sets the ray's components by copying the given values.\n\t *\n\t * @param {Vector3} origin - The origin.\n\t * @param {Vector3} direction - The direction.\n\t * @return {Ray} A reference to this ray.\n\t */\n\tset( origin, direction ) {\n\n\t\tthis.origin.copy( origin );\n\t\tthis.direction.copy( direction );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the values of the given ray to this instance.\n\t *\n\t * @param {Ray} ray - The ray to copy.\n\t * @return {Ray} A reference to this ray.\n\t */\n\tcopy( ray ) {\n\n\t\tthis.origin.copy( ray.origin );\n\t\tthis.direction.copy( ray.direction );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a vector that is located at a given distance along this ray.\n\t *\n\t * @param {number} t - The distance along the ray to retrieve a position for.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} A position on the ray.\n\t */\n\tat( t, target ) {\n\n\t\treturn target.copy( this.origin ).addScaledVector( this.direction, t );\n\n\t}\n\n\t/**\n\t * Adjusts the direction of the ray to point at the given vector in world space.\n\t *\n\t * @param {Vector3} v - The target position.\n\t * @return {Ray} A reference to this ray.\n\t */\n\tlookAt( v ) {\n\n\t\tthis.direction.copy( v ).sub( this.origin ).normalize();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Shift the origin of this ray along its direction by the given distance.\n\t *\n\t * @param {number} t - The distance along the ray to interpolate.\n\t * @return {Ray} A reference to this ray.\n\t */\n\trecast( t ) {\n\n\t\tthis.origin.copy( this.at( t, _vector$a ) );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the point along this ray that is closest to the given point.\n\t *\n\t * @param {Vector3} point - A point in 3D space to get the closet location on the ray for.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The closest point on this ray.\n\t */\n\tclosestPointToPoint( point, target ) {\n\n\t\ttarget.subVectors( point, this.origin );\n\n\t\tconst directionDistance = target.dot( this.direction );\n\n\t\tif ( directionDistance < 0 ) {\n\n\t\t\treturn target.copy( this.origin );\n\n\t\t}\n\n\t\treturn target.copy( this.origin ).addScaledVector( this.direction, directionDistance );\n\n\t}\n\n\t/**\n\t * Returns the distance of the closest approach between this ray and the given point.\n\t *\n\t * @param {Vector3} point - A point in 3D space to compute the distance to.\n\t * @return {number} The distance.\n\t */\n\tdistanceToPoint( point ) {\n\n\t\treturn Math.sqrt( this.distanceSqToPoint( point ) );\n\n\t}\n\n\t/**\n\t * Returns the squared distance of the closest approach between this ray and the given point.\n\t *\n\t * @param {Vector3} point - A point in 3D space to compute the distance to.\n\t * @return {number} The squared distance.\n\t */\n\tdistanceSqToPoint( point ) {\n\n\t\tconst directionDistance = _vector$a.subVectors( point, this.origin ).dot( this.direction );\n\n\t\t// point behind the ray\n\n\t\tif ( directionDistance < 0 ) {\n\n\t\t\treturn this.origin.distanceToSquared( point );\n\n\t\t}\n\n\t\t_vector$a.copy( this.origin ).addScaledVector( this.direction, directionDistance );\n\n\t\treturn _vector$a.distanceToSquared( point );\n\n\t}\n\n\t/**\n\t * Returns the squared distance between this ray and the given line segment.\n\t *\n\t * @param {Vector3} v0 - The start point of the line segment.\n\t * @param {Vector3} v1 - The end point of the line segment.\n\t * @param {Vector3} [optionalPointOnRay] - When provided, it receives the point on this ray that is closest to the segment.\n\t * @param {Vector3} [optionalPointOnSegment] - When provided, it receives the point on the line segment that is closest to this ray.\n\t * @return {number} The squared distance.\n\t */\n\tdistanceSqToSegment( v0, v1, optionalPointOnRay, optionalPointOnSegment ) {\n\n\t\t// from https://github.com/pmjoniak/GeometricTools/blob/master/GTEngine/Include/Mathematics/GteDistRaySegment.h\n\t\t// It returns the min distance between the ray and the segment\n\t\t// defined by v0 and v1\n\t\t// It can also set two optional targets :\n\t\t// - The closest point on the ray\n\t\t// - The closest point on the segment\n\n\t\t_segCenter.copy( v0 ).add( v1 ).multiplyScalar( 0.5 );\n\t\t_segDir.copy( v1 ).sub( v0 ).normalize();\n\t\t_diff.copy( this.origin ).sub( _segCenter );\n\n\t\tconst segExtent = v0.distanceTo( v1 ) * 0.5;\n\t\tconst a01 = - this.direction.dot( _segDir );\n\t\tconst b0 = _diff.dot( this.direction );\n\t\tconst b1 = - _diff.dot( _segDir );\n\t\tconst c = _diff.lengthSq();\n\t\tconst det = Math.abs( 1 - a01 * a01 );\n\t\tlet s0, s1, sqrDist, extDet;\n\n\t\tif ( det > 0 ) {\n\n\t\t\t// The ray and segment are not parallel.\n\n\t\t\ts0 = a01 * b1 - b0;\n\t\t\ts1 = a01 * b0 - b1;\n\t\t\textDet = segExtent * det;\n\n\t\t\tif ( s0 >= 0 ) {\n\n\t\t\t\tif ( s1 >= - extDet ) {\n\n\t\t\t\t\tif ( s1 <= extDet ) {\n\n\t\t\t\t\t\t// region 0\n\t\t\t\t\t\t// Minimum at interior points of ray and segment.\n\n\t\t\t\t\t\tconst invDet = 1 / det;\n\t\t\t\t\t\ts0 *= invDet;\n\t\t\t\t\t\ts1 *= invDet;\n\t\t\t\t\t\tsqrDist = s0 * ( s0 + a01 * s1 + 2 * b0 ) + s1 * ( a01 * s0 + s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// region 1\n\n\t\t\t\t\t\ts1 = segExtent;\n\t\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// region 5\n\n\t\t\t\t\ts1 = - segExtent;\n\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( s1 <= - extDet ) {\n\n\t\t\t\t\t// region 4\n\n\t\t\t\t\ts0 = Math.max( 0, - ( - a01 * segExtent + b0 ) );\n\t\t\t\t\ts1 = ( s0 > 0 ) ? - segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t} else if ( s1 <= extDet ) {\n\n\t\t\t\t\t// region 3\n\n\t\t\t\t\ts0 = 0;\n\t\t\t\t\ts1 = Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\tsqrDist = s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// region 2\n\n\t\t\t\t\ts0 = Math.max( 0, - ( a01 * segExtent + b0 ) );\n\t\t\t\t\ts1 = ( s0 > 0 ) ? segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// Ray and segment are parallel.\n\n\t\t\ts1 = ( a01 > 0 ) ? - segExtent : segExtent;\n\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t}\n\n\t\tif ( optionalPointOnRay ) {\n\n\t\t\toptionalPointOnRay.copy( this.origin ).addScaledVector( this.direction, s0 );\n\n\t\t}\n\n\t\tif ( optionalPointOnSegment ) {\n\n\t\t\toptionalPointOnSegment.copy( _segCenter ).addScaledVector( _segDir, s1 );\n\n\t\t}\n\n\t\treturn sqrDist;\n\n\t}\n\n\t/**\n\t * Intersects this ray with the given sphere, returning the intersection\n\t * point or `null` if there is no intersection.\n\t *\n\t * @param {Sphere} sphere - The sphere to intersect.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {?Vector3} The intersection point.\n\t */\n\tintersectSphere( sphere, target ) {\n\n\t\t_vector$a.subVectors( sphere.center, this.origin );\n\t\tconst tca = _vector$a.dot( this.direction );\n\t\tconst d2 = _vector$a.dot( _vector$a ) - tca * tca;\n\t\tconst radius2 = sphere.radius * sphere.radius;\n\n\t\tif ( d2 > radius2 ) return null;\n\n\t\tconst thc = Math.sqrt( radius2 - d2 );\n\n\t\t// t0 = first intersect point - entrance on front of sphere\n\t\tconst t0 = tca - thc;\n\n\t\t// t1 = second intersect point - exit point on back of sphere\n\t\tconst t1 = tca + thc;\n\n\t\t// test to see if t1 is behind the ray - if so, return null\n\t\tif ( t1 < 0 ) return null;\n\n\t\t// test to see if t0 is behind the ray:\n\t\t// if it is, the ray is inside the sphere, so return the second exit point scaled by t1,\n\t\t// in order to always return an intersect point that is in front of the ray.\n\t\tif ( t0 < 0 ) return this.at( t1, target );\n\n\t\t// else t0 is in front of the ray, so return the first collision point scaled by t0\n\t\treturn this.at( t0, target );\n\n\t}\n\n\t/**\n\t * Returns `true` if this ray intersects with the given sphere.\n\t *\n\t * @param {Sphere} sphere - The sphere to intersect.\n\t * @return {boolean} Whether this ray intersects with the given sphere or not.\n\t */\n\tintersectsSphere( sphere ) {\n\n\t\tif ( sphere.radius < 0 ) return false; // handle empty spheres, see #31187\n\n\t\treturn this.distanceSqToPoint( sphere.center ) <= ( sphere.radius * sphere.radius );\n\n\t}\n\n\t/**\n\t * Computes the distance from the ray's origin to the given plane. Returns `null` if the ray\n\t * does not intersect with the plane.\n\t *\n\t * @param {Plane} plane - The plane to compute the distance to.\n\t * @return {?number} Whether this ray intersects with the given sphere or not.\n\t */\n\tdistanceToPlane( plane ) {\n\n\t\tconst denominator = plane.normal.dot( this.direction );\n\n\t\tif ( denominator === 0 ) {\n\n\t\t\t// line is coplanar, return origin\n\t\t\tif ( plane.distanceToPoint( this.origin ) === 0 ) {\n\n\t\t\t\treturn 0;\n\n\t\t\t}\n\n\t\t\t// Null is preferable to undefined since undefined means.... it is undefined\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst t = - ( this.origin.dot( plane.normal ) + plane.constant ) / denominator;\n\n\t\t// Return if the ray never intersects the plane\n\n\t\treturn t >= 0 ? t : null;\n\n\t}\n\n\t/**\n\t * Intersects this ray with the given plane, returning the intersection\n\t * point or `null` if there is no intersection.\n\t *\n\t * @param {Plane} plane - The plane to intersect.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {?Vector3} The intersection point.\n\t */\n\tintersectPlane( plane, target ) {\n\n\t\tconst t = this.distanceToPlane( plane );\n\n\t\tif ( t === null ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\treturn this.at( t, target );\n\n\t}\n\n\t/**\n\t * Returns `true` if this ray intersects with the given plane.\n\t *\n\t * @param {Plane} plane - The plane to intersect.\n\t * @return {boolean} Whether this ray intersects with the given plane or not.\n\t */\n\tintersectsPlane( plane ) {\n\n\t\t// check if the ray lies on the plane first\n\n\t\tconst distToPoint = plane.distanceToPoint( this.origin );\n\n\t\tif ( distToPoint === 0 ) {\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\tconst denominator = plane.normal.dot( this.direction );\n\n\t\tif ( denominator * distToPoint < 0 ) {\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\t// ray origin is behind the plane (and is pointing behind it)\n\n\t\treturn false;\n\n\t}\n\n\t/**\n\t * Intersects this ray with the given bounding box, returning the intersection\n\t * point or `null` if there is no intersection.\n\t *\n\t * @param {Box3} box - The box to intersect.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {?Vector3} The intersection point.\n\t */\n\tintersectBox( box, target ) {\n\n\t\tlet tmin, tmax, tymin, tymax, tzmin, tzmax;\n\n\t\tconst invdirx = 1 / this.direction.x,\n\t\t\tinvdiry = 1 / this.direction.y,\n\t\t\tinvdirz = 1 / this.direction.z;\n\n\t\tconst origin = this.origin;\n\n\t\tif ( invdirx >= 0 ) {\n\n\t\t\ttmin = ( box.min.x - origin.x ) * invdirx;\n\t\t\ttmax = ( box.max.x - origin.x ) * invdirx;\n\n\t\t} else {\n\n\t\t\ttmin = ( box.max.x - origin.x ) * invdirx;\n\t\t\ttmax = ( box.min.x - origin.x ) * invdirx;\n\n\t\t}\n\n\t\tif ( invdiry >= 0 ) {\n\n\t\t\ttymin = ( box.min.y - origin.y ) * invdiry;\n\t\t\ttymax = ( box.max.y - origin.y ) * invdiry;\n\n\t\t} else {\n\n\t\t\ttymin = ( box.max.y - origin.y ) * invdiry;\n\t\t\ttymax = ( box.min.y - origin.y ) * invdiry;\n\n\t\t}\n\n\t\tif ( ( tmin > tymax ) || ( tymin > tmax ) ) return null;\n\n\t\tif ( tymin > tmin || isNaN( tmin ) ) tmin = tymin;\n\n\t\tif ( tymax < tmax || isNaN( tmax ) ) tmax = tymax;\n\n\t\tif ( invdirz >= 0 ) {\n\n\t\t\ttzmin = ( box.min.z - origin.z ) * invdirz;\n\t\t\ttzmax = ( box.max.z - origin.z ) * invdirz;\n\n\t\t} else {\n\n\t\t\ttzmin = ( box.max.z - origin.z ) * invdirz;\n\t\t\ttzmax = ( box.min.z - origin.z ) * invdirz;\n\n\t\t}\n\n\t\tif ( ( tmin > tzmax ) || ( tzmin > tmax ) ) return null;\n\n\t\tif ( tzmin > tmin || tmin !== tmin ) tmin = tzmin;\n\n\t\tif ( tzmax < tmax || tmax !== tmax ) tmax = tzmax;\n\n\t\t//return point closest to the ray (positive side)\n\n\t\tif ( tmax < 0 ) return null;\n\n\t\treturn this.at( tmin >= 0 ? tmin : tmax, target );\n\n\t}\n\n\t/**\n\t * Returns `true` if this ray intersects with the given box.\n\t *\n\t * @param {Box3} box - The box to intersect.\n\t * @return {boolean} Whether this ray intersects with the given box or not.\n\t */\n\tintersectsBox( box ) {\n\n\t\treturn this.intersectBox( box, _vector$a ) !== null;\n\n\t}\n\n\t/**\n\t * Intersects this ray with the given triangle, returning the intersection\n\t * point or `null` if there is no intersection.\n\t *\n\t * @param {Vector3} a - The first vertex of the triangle.\n\t * @param {Vector3} b - The second vertex of the triangle.\n\t * @param {Vector3} c - The third vertex of the triangle.\n\t * @param {boolean} backfaceCulling - Whether to use backface culling or not.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {?Vector3} The intersection point.\n\t */\n\tintersectTriangle( a, b, c, backfaceCulling, target ) {\n\n\t\t// Compute the offset origin, edges, and normal.\n\n\t\t// from https://github.com/pmjoniak/GeometricTools/blob/master/GTEngine/Include/Mathematics/GteIntrRay3Triangle3.h\n\n\t\t_edge1.subVectors( b, a );\n\t\t_edge2.subVectors( c, a );\n\t\t_normal$1.crossVectors( _edge1, _edge2 );\n\n\t\t// Solve Q + t*D = b1*E1 + b2*E2 (Q = kDiff, D = ray direction,\n\t\t// E1 = kEdge1, E2 = kEdge2, N = Cross(E1,E2)) by\n\t\t//   |Dot(D,N)|*b1 = sign(Dot(D,N))*Dot(D,Cross(Q,E2))\n\t\t//   |Dot(D,N)|*b2 = sign(Dot(D,N))*Dot(D,Cross(E1,Q))\n\t\t//   |Dot(D,N)|*t = -sign(Dot(D,N))*Dot(Q,N)\n\t\tlet DdN = this.direction.dot( _normal$1 );\n\t\tlet sign;\n\n\t\tif ( DdN > 0 ) {\n\n\t\t\tif ( backfaceCulling ) return null;\n\t\t\tsign = 1;\n\n\t\t} else if ( DdN < 0 ) {\n\n\t\t\tsign = -1;\n\t\t\tDdN = - DdN;\n\n\t\t} else {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t_diff.subVectors( this.origin, a );\n\t\tconst DdQxE2 = sign * this.direction.dot( _edge2.crossVectors( _diff, _edge2 ) );\n\n\t\t// b1 < 0, no intersection\n\t\tif ( DdQxE2 < 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst DdE1xQ = sign * this.direction.dot( _edge1.cross( _diff ) );\n\n\t\t// b2 < 0, no intersection\n\t\tif ( DdE1xQ < 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// b1+b2 > 1, no intersection\n\t\tif ( DdQxE2 + DdE1xQ > DdN ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// Line intersects triangle, check if ray does.\n\t\tconst QdN = - sign * _diff.dot( _normal$1 );\n\n\t\t// t < 0, no intersection\n\t\tif ( QdN < 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// Ray intersects triangle.\n\t\treturn this.at( QdN / DdN, target );\n\n\t}\n\n\t/**\n\t * Transforms this ray with the given 4x4 transformation matrix.\n\t *\n\t * @param {Matrix4} matrix4 - The transformation matrix.\n\t * @return {Ray} A reference to this ray.\n\t */\n\tapplyMatrix4( matrix4 ) {\n\n\t\tthis.origin.applyMatrix4( matrix4 );\n\t\tthis.direction.transformDirection( matrix4 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this ray is equal with the given one.\n\t *\n\t * @param {Ray} ray - The ray to test for equality.\n\t * @return {boolean} Whether this ray is equal with the given one.\n\t */\n\tequals( ray ) {\n\n\t\treturn ray.origin.equals( this.origin ) && ray.direction.equals( this.direction );\n\n\t}\n\n\t/**\n\t * Returns a new ray with copied values from this instance.\n\t *\n\t * @return {Ray} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\n/**\n * Represents a 4x4 matrix.\n *\n * The most common use of a 4x4 matrix in 3D computer graphics is as a transformation matrix.\n * For an introduction to transformation matrices as used in WebGL, check out [this tutorial](https://www.opengl-tutorial.org/beginners-tutorials/tutorial-3-matrices)\n *\n * This allows a 3D vector representing a point in 3D space to undergo\n * transformations such as translation, rotation, shear, scale, reflection,\n * orthogonal or perspective projection and so on, by being multiplied by the\n * matrix. This is known as `applying` the matrix to the vector.\n *\n * A Note on Row-Major and Column-Major Ordering:\n *\n * The constructor and {@link Matrix3#set} method take arguments in\n * [row-major](https://en.wikipedia.org/wiki/Row-_and_column-major_order#Column-major_order)\n * order, while internally they are stored in the {@link Matrix3#elements} array in column-major order.\n * This means that calling:\n * ```js\n * const m = new THREE.Matrix4();\n * m.set( 11, 12, 13, 14,\n *        21, 22, 23, 24,\n *        31, 32, 33, 34,\n *        41, 42, 43, 44 );\n * ```\n * will result in the elements array containing:\n * ```js\n * m.elements = [ 11, 21, 31, 41,\n *                12, 22, 32, 42,\n *                13, 23, 33, 43,\n *                14, 24, 34, 44 ];\n * ```\n * and internally all calculations are performed using column-major ordering.\n * However, as the actual ordering makes no difference mathematically and\n * most people are used to thinking about matrices in row-major order, the\n * three.js documentation shows matrices in row-major order. Just bear in\n * mind that if you are reading the source code, you'll have to take the\n * transpose of any matrices outlined here to make sense of the calculations.\n */\nclass Matrix4 {\n\n\t/**\n\t * Constructs a new 4x4 matrix. The arguments are supposed to be\n\t * in row-major order. If no arguments are provided, the constructor\n\t * initializes the matrix as an identity matrix.\n\t *\n\t * @param {number} [n11] - 1-1 matrix element.\n\t * @param {number} [n12] - 1-2 matrix element.\n\t * @param {number} [n13] - 1-3 matrix element.\n\t * @param {number} [n14] - 1-4 matrix element.\n\t * @param {number} [n21] - 2-1 matrix element.\n\t * @param {number} [n22] - 2-2 matrix element.\n\t * @param {number} [n23] - 2-3 matrix element.\n\t * @param {number} [n24] - 2-4 matrix element.\n\t * @param {number} [n31] - 3-1 matrix element.\n\t * @param {number} [n32] - 3-2 matrix element.\n\t * @param {number} [n33] - 3-3 matrix element.\n\t * @param {number} [n34] - 3-4 matrix element.\n\t * @param {number} [n41] - 4-1 matrix element.\n\t * @param {number} [n42] - 4-2 matrix element.\n\t * @param {number} [n43] - 4-3 matrix element.\n\t * @param {number} [n44] - 4-4 matrix element.\n\t */\n\tconstructor( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tMatrix4.prototype.isMatrix4 = true;\n\n\t\t/**\n\t\t * A column-major list of matrix values.\n\t\t *\n\t\t * @type {Array<number>}\n\t\t */\n\t\tthis.elements = [\n\n\t\t\t1, 0, 0, 0,\n\t\t\t0, 1, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t];\n\n\t\tif ( n11 !== undefined ) {\n\n\t\t\tthis.set( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the elements of the matrix.The arguments are supposed to be\n\t * in row-major order.\n\t *\n\t * @param {number} [n11] - 1-1 matrix element.\n\t * @param {number} [n12] - 1-2 matrix element.\n\t * @param {number} [n13] - 1-3 matrix element.\n\t * @param {number} [n14] - 1-4 matrix element.\n\t * @param {number} [n21] - 2-1 matrix element.\n\t * @param {number} [n22] - 2-2 matrix element.\n\t * @param {number} [n23] - 2-3 matrix element.\n\t * @param {number} [n24] - 2-4 matrix element.\n\t * @param {number} [n31] - 3-1 matrix element.\n\t * @param {number} [n32] - 3-2 matrix element.\n\t * @param {number} [n33] - 3-3 matrix element.\n\t * @param {number} [n34] - 3-4 matrix element.\n\t * @param {number} [n41] - 4-1 matrix element.\n\t * @param {number} [n42] - 4-2 matrix element.\n\t * @param {number} [n43] - 4-3 matrix element.\n\t * @param {number} [n44] - 4-4 matrix element.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tset( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] = n11; te[ 4 ] = n12; te[ 8 ] = n13; te[ 12 ] = n14;\n\t\tte[ 1 ] = n21; te[ 5 ] = n22; te[ 9 ] = n23; te[ 13 ] = n24;\n\t\tte[ 2 ] = n31; te[ 6 ] = n32; te[ 10 ] = n33; te[ 14 ] = n34;\n\t\tte[ 3 ] = n41; te[ 7 ] = n42; te[ 11 ] = n43; te[ 15 ] = n44;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix to the 4x4 identity matrix.\n\t *\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tidentity() {\n\n\t\tthis.set(\n\n\t\t\t1, 0, 0, 0,\n\t\t\t0, 1, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a matrix with copied values from this instance.\n\t *\n\t * @return {Matrix4} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new Matrix4().fromArray( this.elements );\n\n\t}\n\n\t/**\n\t * Copies the values of the given matrix to this instance.\n\t *\n\t * @param {Matrix4} m - The matrix to copy.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tcopy( m ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = m.elements;\n\n\t\tte[ 0 ] = me[ 0 ]; te[ 1 ] = me[ 1 ]; te[ 2 ] = me[ 2 ]; te[ 3 ] = me[ 3 ];\n\t\tte[ 4 ] = me[ 4 ]; te[ 5 ] = me[ 5 ]; te[ 6 ] = me[ 6 ]; te[ 7 ] = me[ 7 ];\n\t\tte[ 8 ] = me[ 8 ]; te[ 9 ] = me[ 9 ]; te[ 10 ] = me[ 10 ]; te[ 11 ] = me[ 11 ];\n\t\tte[ 12 ] = me[ 12 ]; te[ 13 ] = me[ 13 ]; te[ 14 ] = me[ 14 ]; te[ 15 ] = me[ 15 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the translation component of the given matrix\n\t * into this matrix's translation component.\n\t *\n\t * @param {Matrix4} m - The matrix to copy the translation component.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tcopyPosition( m ) {\n\n\t\tconst te = this.elements, me = m.elements;\n\n\t\tte[ 12 ] = me[ 12 ];\n\t\tte[ 13 ] = me[ 13 ];\n\t\tte[ 14 ] = me[ 14 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Set the upper 3x3 elements of this matrix to the values of given 3x3 matrix.\n\t *\n\t * @param {Matrix3} m - The 3x3 matrix.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tsetFromMatrix3( m ) {\n\n\t\tconst me = m.elements;\n\n\t\tthis.set(\n\n\t\t\tme[ 0 ], me[ 3 ], me[ 6 ], 0,\n\t\t\tme[ 1 ], me[ 4 ], me[ 7 ], 0,\n\t\t\tme[ 2 ], me[ 5 ], me[ 8 ], 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Extracts the basis of this matrix into the three axis vectors provided.\n\t *\n\t * @param {Vector3} xAxis - The basis's x axis.\n\t * @param {Vector3} yAxis - The basis's y axis.\n\t * @param {Vector3} zAxis - The basis's z axis.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\textractBasis( xAxis, yAxis, zAxis ) {\n\n\t\txAxis.setFromMatrixColumn( this, 0 );\n\t\tyAxis.setFromMatrixColumn( this, 1 );\n\t\tzAxis.setFromMatrixColumn( this, 2 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given basis vectors to this matrix.\n\t *\n\t * @param {Vector3} xAxis - The basis's x axis.\n\t * @param {Vector3} yAxis - The basis's y axis.\n\t * @param {Vector3} zAxis - The basis's z axis.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeBasis( xAxis, yAxis, zAxis ) {\n\n\t\tthis.set(\n\t\t\txAxis.x, yAxis.x, zAxis.x, 0,\n\t\t\txAxis.y, yAxis.y, zAxis.y, 0,\n\t\t\txAxis.z, yAxis.z, zAxis.z, 0,\n\t\t\t0, 0, 0, 1\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Extracts the rotation component of the given matrix\n\t * into this matrix's rotation component.\n\t *\n\t * Note: This method does not support reflection matrices.\n\t *\n\t * @param {Matrix4} m - The matrix.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\textractRotation( m ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = m.elements;\n\n\t\tconst scaleX = 1 / _v1$5.setFromMatrixColumn( m, 0 ).length();\n\t\tconst scaleY = 1 / _v1$5.setFromMatrixColumn( m, 1 ).length();\n\t\tconst scaleZ = 1 / _v1$5.setFromMatrixColumn( m, 2 ).length();\n\n\t\tte[ 0 ] = me[ 0 ] * scaleX;\n\t\tte[ 1 ] = me[ 1 ] * scaleX;\n\t\tte[ 2 ] = me[ 2 ] * scaleX;\n\t\tte[ 3 ] = 0;\n\n\t\tte[ 4 ] = me[ 4 ] * scaleY;\n\t\tte[ 5 ] = me[ 5 ] * scaleY;\n\t\tte[ 6 ] = me[ 6 ] * scaleY;\n\t\tte[ 7 ] = 0;\n\n\t\tte[ 8 ] = me[ 8 ] * scaleZ;\n\t\tte[ 9 ] = me[ 9 ] * scaleZ;\n\t\tte[ 10 ] = me[ 10 ] * scaleZ;\n\t\tte[ 11 ] = 0;\n\n\t\tte[ 12 ] = 0;\n\t\tte[ 13 ] = 0;\n\t\tte[ 14 ] = 0;\n\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the rotation component (the upper left 3x3 matrix) of this matrix to\n\t * the rotation specified by the given Euler angles. The rest of\n\t * the matrix is set to the identity. Depending on the {@link Euler#order},\n\t * there are six possible outcomes. See [this page](https://en.wikipedia.org/wiki/Euler_angles#Rotation_matrix)\n\t * for a complete list.\n\t *\n\t * @param {Euler} euler - The Euler angles.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeRotationFromEuler( euler ) {\n\n\t\tconst te = this.elements;\n\n\t\tconst x = euler.x, y = euler.y, z = euler.z;\n\t\tconst a = Math.cos( x ), b = Math.sin( x );\n\t\tconst c = Math.cos( y ), d = Math.sin( y );\n\t\tconst e = Math.cos( z ), f = Math.sin( z );\n\n\t\tif ( euler.order === 'XYZ' ) {\n\n\t\t\tconst ae = a * e, af = a * f, be = b * e, bf = b * f;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = - c * f;\n\t\t\tte[ 8 ] = d;\n\n\t\t\tte[ 1 ] = af + be * d;\n\t\t\tte[ 5 ] = ae - bf * d;\n\t\t\tte[ 9 ] = - b * c;\n\n\t\t\tte[ 2 ] = bf - ae * d;\n\t\t\tte[ 6 ] = be + af * d;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'YXZ' ) {\n\n\t\t\tconst ce = c * e, cf = c * f, de = d * e, df = d * f;\n\n\t\t\tte[ 0 ] = ce + df * b;\n\t\t\tte[ 4 ] = de * b - cf;\n\t\t\tte[ 8 ] = a * d;\n\n\t\t\tte[ 1 ] = a * f;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = - b;\n\n\t\t\tte[ 2 ] = cf * b - de;\n\t\t\tte[ 6 ] = df + ce * b;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'ZXY' ) {\n\n\t\t\tconst ce = c * e, cf = c * f, de = d * e, df = d * f;\n\n\t\t\tte[ 0 ] = ce - df * b;\n\t\t\tte[ 4 ] = - a * f;\n\t\t\tte[ 8 ] = de + cf * b;\n\n\t\t\tte[ 1 ] = cf + de * b;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = df - ce * b;\n\n\t\t\tte[ 2 ] = - a * d;\n\t\t\tte[ 6 ] = b;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'ZYX' ) {\n\n\t\t\tconst ae = a * e, af = a * f, be = b * e, bf = b * f;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = be * d - af;\n\t\t\tte[ 8 ] = ae * d + bf;\n\n\t\t\tte[ 1 ] = c * f;\n\t\t\tte[ 5 ] = bf * d + ae;\n\t\t\tte[ 9 ] = af * d - be;\n\n\t\t\tte[ 2 ] = - d;\n\t\t\tte[ 6 ] = b * c;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'YZX' ) {\n\n\t\t\tconst ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = bd - ac * f;\n\t\t\tte[ 8 ] = bc * f + ad;\n\n\t\t\tte[ 1 ] = f;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = - b * e;\n\n\t\t\tte[ 2 ] = - d * e;\n\t\t\tte[ 6 ] = ad * f + bc;\n\t\t\tte[ 10 ] = ac - bd * f;\n\n\t\t} else if ( euler.order === 'XZY' ) {\n\n\t\t\tconst ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = - f;\n\t\t\tte[ 8 ] = d * e;\n\n\t\t\tte[ 1 ] = ac * f + bd;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = ad * f - bc;\n\n\t\t\tte[ 2 ] = bc * f - ad;\n\t\t\tte[ 6 ] = b * e;\n\t\t\tte[ 10 ] = bd * f + ac;\n\n\t\t}\n\n\t\t// bottom row\n\t\tte[ 3 ] = 0;\n\t\tte[ 7 ] = 0;\n\t\tte[ 11 ] = 0;\n\n\t\t// last column\n\t\tte[ 12 ] = 0;\n\t\tte[ 13 ] = 0;\n\t\tte[ 14 ] = 0;\n\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the rotation component of this matrix to the rotation specified by\n\t * the given Quaternion as outlined [here](https://en.wikipedia.org/wiki/Rotation_matrix#Quaternion)\n\t * The rest of the matrix is set to the identity.\n\t *\n\t * @param {Quaternion} q - The Quaternion.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeRotationFromQuaternion( q ) {\n\n\t\treturn this.compose( _zero, q, _one );\n\n\t}\n\n\t/**\n\t * Sets the rotation component of the transformation matrix, looking from `eye` towards\n\t * `target`, and oriented by the up-direction.\n\t *\n\t * @param {Vector3} eye - The eye vector.\n\t * @param {Vector3} target - The target vector.\n\t * @param {Vector3} up - The up vector.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tlookAt( eye, target, up ) {\n\n\t\tconst te = this.elements;\n\n\t\t_z.subVectors( eye, target );\n\n\t\tif ( _z.lengthSq() === 0 ) {\n\n\t\t\t// eye and target are in the same position\n\n\t\t\t_z.z = 1;\n\n\t\t}\n\n\t\t_z.normalize();\n\t\t_x.crossVectors( up, _z );\n\n\t\tif ( _x.lengthSq() === 0 ) {\n\n\t\t\t// up and z are parallel\n\n\t\t\tif ( Math.abs( up.z ) === 1 ) {\n\n\t\t\t\t_z.x += 0.0001;\n\n\t\t\t} else {\n\n\t\t\t\t_z.z += 0.0001;\n\n\t\t\t}\n\n\t\t\t_z.normalize();\n\t\t\t_x.crossVectors( up, _z );\n\n\t\t}\n\n\t\t_x.normalize();\n\t\t_y.crossVectors( _z, _x );\n\n\t\tte[ 0 ] = _x.x; te[ 4 ] = _y.x; te[ 8 ] = _z.x;\n\t\tte[ 1 ] = _x.y; te[ 5 ] = _y.y; te[ 9 ] = _z.y;\n\t\tte[ 2 ] = _x.z; te[ 6 ] = _y.z; te[ 10 ] = _z.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Post-multiplies this matrix by the given 4x4 matrix.\n\t *\n\t * @param {Matrix4} m - The matrix to multiply with.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmultiply( m ) {\n\n\t\treturn this.multiplyMatrices( this, m );\n\n\t}\n\n\t/**\n\t * Pre-multiplies this matrix by the given 4x4 matrix.\n\t *\n\t * @param {Matrix4} m - The matrix to multiply with.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tpremultiply( m ) {\n\n\t\treturn this.multiplyMatrices( m, this );\n\n\t}\n\n\t/**\n\t * Multiples the given 4x4 matrices and stores the result\n\t * in this matrix.\n\t *\n\t * @param {Matrix4} a - The first matrix.\n\t * @param {Matrix4} b - The second matrix.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmultiplyMatrices( a, b ) {\n\n\t\tconst ae = a.elements;\n\t\tconst be = b.elements;\n\t\tconst te = this.elements;\n\n\t\tconst a11 = ae[ 0 ], a12 = ae[ 4 ], a13 = ae[ 8 ], a14 = ae[ 12 ];\n\t\tconst a21 = ae[ 1 ], a22 = ae[ 5 ], a23 = ae[ 9 ], a24 = ae[ 13 ];\n\t\tconst a31 = ae[ 2 ], a32 = ae[ 6 ], a33 = ae[ 10 ], a34 = ae[ 14 ];\n\t\tconst a41 = ae[ 3 ], a42 = ae[ 7 ], a43 = ae[ 11 ], a44 = ae[ 15 ];\n\n\t\tconst b11 = be[ 0 ], b12 = be[ 4 ], b13 = be[ 8 ], b14 = be[ 12 ];\n\t\tconst b21 = be[ 1 ], b22 = be[ 5 ], b23 = be[ 9 ], b24 = be[ 13 ];\n\t\tconst b31 = be[ 2 ], b32 = be[ 6 ], b33 = be[ 10 ], b34 = be[ 14 ];\n\t\tconst b41 = be[ 3 ], b42 = be[ 7 ], b43 = be[ 11 ], b44 = be[ 15 ];\n\n\t\tte[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41;\n\t\tte[ 4 ] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42;\n\t\tte[ 8 ] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43;\n\t\tte[ 12 ] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44;\n\n\t\tte[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41;\n\t\tte[ 5 ] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42;\n\t\tte[ 9 ] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43;\n\t\tte[ 13 ] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44;\n\n\t\tte[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41;\n\t\tte[ 6 ] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42;\n\t\tte[ 10 ] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43;\n\t\tte[ 14 ] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44;\n\n\t\tte[ 3 ] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41;\n\t\tte[ 7 ] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42;\n\t\tte[ 11 ] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43;\n\t\tte[ 15 ] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies every component of the matrix by the given scalar.\n\t *\n\t * @param {number} s - The scalar.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmultiplyScalar( s ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] *= s; te[ 4 ] *= s; te[ 8 ] *= s; te[ 12 ] *= s;\n\t\tte[ 1 ] *= s; te[ 5 ] *= s; te[ 9 ] *= s; te[ 13 ] *= s;\n\t\tte[ 2 ] *= s; te[ 6 ] *= s; te[ 10 ] *= s; te[ 14 ] *= s;\n\t\tte[ 3 ] *= s; te[ 7 ] *= s; te[ 11 ] *= s; te[ 15 ] *= s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes and returns the determinant of this matrix.\n\t *\n\t * Based on the method outlined [here](http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.html).\n\t *\n\t * @return {number} The determinant.\n\t */\n\tdeterminant() {\n\n\t\tconst te = this.elements;\n\n\t\tconst n11 = te[ 0 ], n12 = te[ 4 ], n13 = te[ 8 ], n14 = te[ 12 ];\n\t\tconst n21 = te[ 1 ], n22 = te[ 5 ], n23 = te[ 9 ], n24 = te[ 13 ];\n\t\tconst n31 = te[ 2 ], n32 = te[ 6 ], n33 = te[ 10 ], n34 = te[ 14 ];\n\t\tconst n41 = te[ 3 ], n42 = te[ 7 ], n43 = te[ 11 ], n44 = te[ 15 ];\n\n\t\t//TODO: make this more efficient\n\n\t\treturn (\n\t\t\tn41 * (\n\t\t\t\t+ n14 * n23 * n32\n\t\t\t\t - n13 * n24 * n32\n\t\t\t\t - n14 * n22 * n33\n\t\t\t\t + n12 * n24 * n33\n\t\t\t\t + n13 * n22 * n34\n\t\t\t\t - n12 * n23 * n34\n\t\t\t) +\n\t\t\tn42 * (\n\t\t\t\t+ n11 * n23 * n34\n\t\t\t\t - n11 * n24 * n33\n\t\t\t\t + n14 * n21 * n33\n\t\t\t\t - n13 * n21 * n34\n\t\t\t\t + n13 * n24 * n31\n\t\t\t\t - n14 * n23 * n31\n\t\t\t) +\n\t\t\tn43 * (\n\t\t\t\t+ n11 * n24 * n32\n\t\t\t\t - n11 * n22 * n34\n\t\t\t\t - n14 * n21 * n32\n\t\t\t\t + n12 * n21 * n34\n\t\t\t\t + n14 * n22 * n31\n\t\t\t\t - n12 * n24 * n31\n\t\t\t) +\n\t\t\tn44 * (\n\t\t\t\t- n13 * n22 * n31\n\t\t\t\t - n11 * n23 * n32\n\t\t\t\t + n11 * n22 * n33\n\t\t\t\t + n13 * n21 * n32\n\t\t\t\t - n12 * n21 * n33\n\t\t\t\t + n12 * n23 * n31\n\t\t\t)\n\n\t\t);\n\n\t}\n\n\t/**\n\t * Transposes this matrix in place.\n\t *\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\ttranspose() {\n\n\t\tconst te = this.elements;\n\t\tlet tmp;\n\n\t\ttmp = te[ 1 ]; te[ 1 ] = te[ 4 ]; te[ 4 ] = tmp;\n\t\ttmp = te[ 2 ]; te[ 2 ] = te[ 8 ]; te[ 8 ] = tmp;\n\t\ttmp = te[ 6 ]; te[ 6 ] = te[ 9 ]; te[ 9 ] = tmp;\n\n\t\ttmp = te[ 3 ]; te[ 3 ] = te[ 12 ]; te[ 12 ] = tmp;\n\t\ttmp = te[ 7 ]; te[ 7 ] = te[ 13 ]; te[ 13 ] = tmp;\n\t\ttmp = te[ 11 ]; te[ 11 ] = te[ 14 ]; te[ 14 ] = tmp;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the position component for this matrix from the given vector,\n\t * without affecting the rest of the matrix.\n\t *\n\t * @param {number|Vector3} x - The x component of the vector or alternatively the vector object.\n\t * @param {number} y - The y component of the vector.\n\t * @param {number} z - The z component of the vector.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tsetPosition( x, y, z ) {\n\n\t\tconst te = this.elements;\n\n\t\tif ( x.isVector3 ) {\n\n\t\t\tte[ 12 ] = x.x;\n\t\t\tte[ 13 ] = x.y;\n\t\t\tte[ 14 ] = x.z;\n\n\t\t} else {\n\n\t\t\tte[ 12 ] = x;\n\t\t\tte[ 13 ] = y;\n\t\t\tte[ 14 ] = z;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Inverts this matrix, using the [analytic method](https://en.wikipedia.org/wiki/Invertible_matrix#Analytic_solution).\n\t * You can not invert with a determinant of zero. If you attempt this, the method produces\n\t * a zero matrix instead.\n\t *\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tinvert() {\n\n\t\t// based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm\n\t\tconst te = this.elements,\n\n\t\t\tn11 = te[ 0 ], n21 = te[ 1 ], n31 = te[ 2 ], n41 = te[ 3 ],\n\t\t\tn12 = te[ 4 ], n22 = te[ 5 ], n32 = te[ 6 ], n42 = te[ 7 ],\n\t\t\tn13 = te[ 8 ], n23 = te[ 9 ], n33 = te[ 10 ], n43 = te[ 11 ],\n\t\t\tn14 = te[ 12 ], n24 = te[ 13 ], n34 = te[ 14 ], n44 = te[ 15 ],\n\n\t\t\tt11 = n23 * n34 * n42 - n24 * n33 * n42 + n24 * n32 * n43 - n22 * n34 * n43 - n23 * n32 * n44 + n22 * n33 * n44,\n\t\t\tt12 = n14 * n33 * n42 - n13 * n34 * n42 - n14 * n32 * n43 + n12 * n34 * n43 + n13 * n32 * n44 - n12 * n33 * n44,\n\t\t\tt13 = n13 * n24 * n42 - n14 * n23 * n42 + n14 * n22 * n43 - n12 * n24 * n43 - n13 * n22 * n44 + n12 * n23 * n44,\n\t\t\tt14 = n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34;\n\n\t\tconst det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14;\n\n\t\tif ( det === 0 ) return this.set( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 );\n\n\t\tconst detInv = 1 / det;\n\n\t\tte[ 0 ] = t11 * detInv;\n\t\tte[ 1 ] = ( n24 * n33 * n41 - n23 * n34 * n41 - n24 * n31 * n43 + n21 * n34 * n43 + n23 * n31 * n44 - n21 * n33 * n44 ) * detInv;\n\t\tte[ 2 ] = ( n22 * n34 * n41 - n24 * n32 * n41 + n24 * n31 * n42 - n21 * n34 * n42 - n22 * n31 * n44 + n21 * n32 * n44 ) * detInv;\n\t\tte[ 3 ] = ( n23 * n32 * n41 - n22 * n33 * n41 - n23 * n31 * n42 + n21 * n33 * n42 + n22 * n31 * n43 - n21 * n32 * n43 ) * detInv;\n\n\t\tte[ 4 ] = t12 * detInv;\n\t\tte[ 5 ] = ( n13 * n34 * n41 - n14 * n33 * n41 + n14 * n31 * n43 - n11 * n34 * n43 - n13 * n31 * n44 + n11 * n33 * n44 ) * detInv;\n\t\tte[ 6 ] = ( n14 * n32 * n41 - n12 * n34 * n41 - n14 * n31 * n42 + n11 * n34 * n42 + n12 * n31 * n44 - n11 * n32 * n44 ) * detInv;\n\t\tte[ 7 ] = ( n12 * n33 * n41 - n13 * n32 * n41 + n13 * n31 * n42 - n11 * n33 * n42 - n12 * n31 * n43 + n11 * n32 * n43 ) * detInv;\n\n\t\tte[ 8 ] = t13 * detInv;\n\t\tte[ 9 ] = ( n14 * n23 * n41 - n13 * n24 * n41 - n14 * n21 * n43 + n11 * n24 * n43 + n13 * n21 * n44 - n11 * n23 * n44 ) * detInv;\n\t\tte[ 10 ] = ( n12 * n24 * n41 - n14 * n22 * n41 + n14 * n21 * n42 - n11 * n24 * n42 - n12 * n21 * n44 + n11 * n22 * n44 ) * detInv;\n\t\tte[ 11 ] = ( n13 * n22 * n41 - n12 * n23 * n41 - n13 * n21 * n42 + n11 * n23 * n42 + n12 * n21 * n43 - n11 * n22 * n43 ) * detInv;\n\n\t\tte[ 12 ] = t14 * detInv;\n\t\tte[ 13 ] = ( n13 * n24 * n31 - n14 * n23 * n31 + n14 * n21 * n33 - n11 * n24 * n33 - n13 * n21 * n34 + n11 * n23 * n34 ) * detInv;\n\t\tte[ 14 ] = ( n14 * n22 * n31 - n12 * n24 * n31 - n14 * n21 * n32 + n11 * n24 * n32 + n12 * n21 * n34 - n11 * n22 * n34 ) * detInv;\n\t\tte[ 15 ] = ( n12 * n23 * n31 - n13 * n22 * n31 + n13 * n21 * n32 - n11 * n23 * n32 - n12 * n21 * n33 + n11 * n22 * n33 ) * detInv;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the columns of this matrix by the given vector.\n\t *\n\t * @param {Vector3} v - The scale vector.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tscale( v ) {\n\n\t\tconst te = this.elements;\n\t\tconst x = v.x, y = v.y, z = v.z;\n\n\t\tte[ 0 ] *= x; te[ 4 ] *= y; te[ 8 ] *= z;\n\t\tte[ 1 ] *= x; te[ 5 ] *= y; te[ 9 ] *= z;\n\t\tte[ 2 ] *= x; te[ 6 ] *= y; te[ 10 ] *= z;\n\t\tte[ 3 ] *= x; te[ 7 ] *= y; te[ 11 ] *= z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Gets the maximum scale value of the three axes.\n\t *\n\t * @return {number} The maximum scale.\n\t */\n\tgetMaxScaleOnAxis() {\n\n\t\tconst te = this.elements;\n\n\t\tconst scaleXSq = te[ 0 ] * te[ 0 ] + te[ 1 ] * te[ 1 ] + te[ 2 ] * te[ 2 ];\n\t\tconst scaleYSq = te[ 4 ] * te[ 4 ] + te[ 5 ] * te[ 5 ] + te[ 6 ] * te[ 6 ];\n\t\tconst scaleZSq = te[ 8 ] * te[ 8 ] + te[ 9 ] * te[ 9 ] + te[ 10 ] * te[ 10 ];\n\n\t\treturn Math.sqrt( Math.max( scaleXSq, scaleYSq, scaleZSq ) );\n\n\t}\n\n\t/**\n\t * Sets this matrix as a translation transform from the given vector.\n\t *\n\t * @param {number|Vector3} x - The amount to translate in the X axis or alternatively a translation vector.\n\t * @param {number} y - The amount to translate in the Y axis.\n\t * @param {number} z - The amount to translate in the z axis.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeTranslation( x, y, z ) {\n\n\t\tif ( x.isVector3 ) {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, 0, x.x,\n\t\t\t\t0, 1, 0, x.y,\n\t\t\t\t0, 0, 1, x.z,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t} else {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, 0, x,\n\t\t\t\t0, 1, 0, y,\n\t\t\t\t0, 0, 1, z,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix as a rotational transformation around the X axis by\n\t * the given angle.\n\t *\n\t * @param {number} theta - The rotation in radians.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeRotationX( theta ) {\n\n\t\tconst c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\t1, 0, 0, 0,\n\t\t\t0, c, - s, 0,\n\t\t\t0, s, c, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix as a rotational transformation around the Y axis by\n\t * the given angle.\n\t *\n\t * @param {number} theta - The rotation in radians.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeRotationY( theta ) {\n\n\t\tconst c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\t c, 0, s, 0,\n\t\t\t 0, 1, 0, 0,\n\t\t\t- s, 0, c, 0,\n\t\t\t 0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix as a rotational transformation around the Z axis by\n\t * the given angle.\n\t *\n\t * @param {number} theta - The rotation in radians.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeRotationZ( theta ) {\n\n\t\tconst c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\tc, - s, 0, 0,\n\t\t\ts, c, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix as a rotational transformation around the given axis by\n\t * the given angle.\n\t *\n\t * This is a somewhat controversial but mathematically sound alternative to\n\t * rotating via Quaternions. See the discussion [here](https://www.gamedev.net/articles/programming/math-and-physics/do-we-really-need-quaternions-r1199).\n\t *\n\t * @param {Vector3} axis - The normalized rotation axis.\n\t * @param {number} angle - The rotation in radians.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeRotationAxis( axis, angle ) {\n\n\t\t// Based on http://www.gamedev.net/reference/articles/article1199.asp\n\n\t\tconst c = Math.cos( angle );\n\t\tconst s = Math.sin( angle );\n\t\tconst t = 1 - c;\n\t\tconst x = axis.x, y = axis.y, z = axis.z;\n\t\tconst tx = t * x, ty = t * y;\n\n\t\tthis.set(\n\n\t\t\ttx * x + c, tx * y - s * z, tx * z + s * y, 0,\n\t\t\ttx * y + s * z, ty * y + c, ty * z - s * x, 0,\n\t\t\ttx * z - s * y, ty * z + s * x, t * z * z + c, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix as a scale transformation.\n\t *\n\t * @param {number} x - The amount to scale in the X axis.\n\t * @param {number} y - The amount to scale in the Y axis.\n\t * @param {number} z - The amount to scale in the Z axis.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeScale( x, y, z ) {\n\n\t\tthis.set(\n\n\t\t\tx, 0, 0, 0,\n\t\t\t0, y, 0, 0,\n\t\t\t0, 0, z, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix as a shear transformation.\n\t *\n\t * @param {number} xy - The amount to shear X by Y.\n\t * @param {number} xz - The amount to shear X by Z.\n\t * @param {number} yx - The amount to shear Y by X.\n\t * @param {number} yz - The amount to shear Y by Z.\n\t * @param {number} zx - The amount to shear Z by X.\n\t * @param {number} zy - The amount to shear Z by Y.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeShear( xy, xz, yx, yz, zx, zy ) {\n\n\t\tthis.set(\n\n\t\t\t1, yx, zx, 0,\n\t\t\txy, 1, zy, 0,\n\t\t\txz, yz, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix to the transformation composed of the given position,\n\t * rotation (Quaternion) and scale.\n\t *\n\t * @param {Vector3} position - The position vector.\n\t * @param {Quaternion} quaternion - The rotation as a Quaternion.\n\t * @param {Vector3} scale - The scale vector.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tcompose( position, quaternion, scale ) {\n\n\t\tconst te = this.elements;\n\n\t\tconst x = quaternion._x, y = quaternion._y, z = quaternion._z, w = quaternion._w;\n\t\tconst x2 = x + x,\ty2 = y + y, z2 = z + z;\n\t\tconst xx = x * x2, xy = x * y2, xz = x * z2;\n\t\tconst yy = y * y2, yz = y * z2, zz = z * z2;\n\t\tconst wx = w * x2, wy = w * y2, wz = w * z2;\n\n\t\tconst sx = scale.x, sy = scale.y, sz = scale.z;\n\n\t\tte[ 0 ] = ( 1 - ( yy + zz ) ) * sx;\n\t\tte[ 1 ] = ( xy + wz ) * sx;\n\t\tte[ 2 ] = ( xz - wy ) * sx;\n\t\tte[ 3 ] = 0;\n\n\t\tte[ 4 ] = ( xy - wz ) * sy;\n\t\tte[ 5 ] = ( 1 - ( xx + zz ) ) * sy;\n\t\tte[ 6 ] = ( yz + wx ) * sy;\n\t\tte[ 7 ] = 0;\n\n\t\tte[ 8 ] = ( xz + wy ) * sz;\n\t\tte[ 9 ] = ( yz - wx ) * sz;\n\t\tte[ 10 ] = ( 1 - ( xx + yy ) ) * sz;\n\t\tte[ 11 ] = 0;\n\n\t\tte[ 12 ] = position.x;\n\t\tte[ 13 ] = position.y;\n\t\tte[ 14 ] = position.z;\n\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Decomposes this matrix into its position, rotation and scale components\n\t * and provides the result in the given objects.\n\t *\n\t * Note: Not all matrices are decomposable in this way. For example, if an\n\t * object has a non-uniformly scaled parent, then the object's world matrix\n\t * may not be decomposable, and this method may not be appropriate.\n\t *\n\t * @param {Vector3} position - The position vector.\n\t * @param {Quaternion} quaternion - The rotation as a Quaternion.\n\t * @param {Vector3} scale - The scale vector.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tdecompose( position, quaternion, scale ) {\n\n\t\tconst te = this.elements;\n\n\t\tlet sx = _v1$5.set( te[ 0 ], te[ 1 ], te[ 2 ] ).length();\n\t\tconst sy = _v1$5.set( te[ 4 ], te[ 5 ], te[ 6 ] ).length();\n\t\tconst sz = _v1$5.set( te[ 8 ], te[ 9 ], te[ 10 ] ).length();\n\n\t\t// if determine is negative, we need to invert one scale\n\t\tconst det = this.determinant();\n\t\tif ( det < 0 ) sx = - sx;\n\n\t\tposition.x = te[ 12 ];\n\t\tposition.y = te[ 13 ];\n\t\tposition.z = te[ 14 ];\n\n\t\t// scale the rotation part\n\t\t_m1$4.copy( this );\n\n\t\tconst invSX = 1 / sx;\n\t\tconst invSY = 1 / sy;\n\t\tconst invSZ = 1 / sz;\n\n\t\t_m1$4.elements[ 0 ] *= invSX;\n\t\t_m1$4.elements[ 1 ] *= invSX;\n\t\t_m1$4.elements[ 2 ] *= invSX;\n\n\t\t_m1$4.elements[ 4 ] *= invSY;\n\t\t_m1$4.elements[ 5 ] *= invSY;\n\t\t_m1$4.elements[ 6 ] *= invSY;\n\n\t\t_m1$4.elements[ 8 ] *= invSZ;\n\t\t_m1$4.elements[ 9 ] *= invSZ;\n\t\t_m1$4.elements[ 10 ] *= invSZ;\n\n\t\tquaternion.setFromRotationMatrix( _m1$4 );\n\n\t\tscale.x = sx;\n\t\tscale.y = sy;\n\t\tscale.z = sz;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Creates a perspective projection matrix. This is used internally by\n\t * {@link PerspectiveCamera#updateProjectionMatrix}.\n\n\t * @param {number} left - Left boundary of the viewing frustum at the near plane.\n\t * @param {number} right - Right boundary of the viewing frustum at the near plane.\n\t * @param {number} top - Top boundary of the viewing frustum at the near plane.\n\t * @param {number} bottom - Bottom boundary of the viewing frustum at the near plane.\n\t * @param {number} near - The distance from the camera to the near plane.\n\t * @param {number} far - The distance from the camera to the far plane.\n\t * @param {(WebGLCoordinateSystem|WebGPUCoordinateSystem)} [coordinateSystem=WebGLCoordinateSystem] - The coordinate system.\n\t * @param {boolean} [reversedDepth=false] - Whether to use a reversed depth.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakePerspective( left, right, top, bottom, near, far, coordinateSystem = WebGLCoordinateSystem, reversedDepth = false ) {\n\n\t\tconst te = this.elements;\n\n\t\tconst x = 2 * near / ( right - left );\n\t\tconst y = 2 * near / ( top - bottom );\n\n\t\tconst a = ( right + left ) / ( right - left );\n\t\tconst b = ( top + bottom ) / ( top - bottom );\n\n\t\tlet c, d;\n\n\t\tif ( reversedDepth ) {\n\n\t\t\tc = near / ( far - near );\n\t\t\td = ( far * near ) / ( far - near );\n\n\t\t} else {\n\n\t\t\tif ( coordinateSystem === WebGLCoordinateSystem ) {\n\n\t\t\t\tc = - ( far + near ) / ( far - near );\n\t\t\t\td = ( -2 * far * near ) / ( far - near );\n\n\t\t\t} else if ( coordinateSystem === WebGPUCoordinateSystem ) {\n\n\t\t\t\tc = - far / ( far - near );\n\t\t\t\td = ( - far * near ) / ( far - near );\n\n\t\t\t} else {\n\n\t\t\t\tthrow new Error( 'THREE.Matrix4.makePerspective(): Invalid coordinate system: ' + coordinateSystem );\n\n\t\t\t}\n\n\t\t}\n\n\t\tte[ 0 ] = x;\tte[ 4 ] = 0;\tte[ 8 ] = a; \tte[ 12 ] = 0;\n\t\tte[ 1 ] = 0;\tte[ 5 ] = y;\tte[ 9 ] = b; \tte[ 13 ] = 0;\n\t\tte[ 2 ] = 0;\tte[ 6 ] = 0;\tte[ 10 ] = c; \tte[ 14 ] = d;\n\t\tte[ 3 ] = 0;\tte[ 7 ] = 0;\tte[ 11 ] = -1;\tte[ 15 ] = 0;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Creates a orthographic projection matrix. This is used internally by\n\t * {@link OrthographicCamera#updateProjectionMatrix}.\n\n\t * @param {number} left - Left boundary of the viewing frustum at the near plane.\n\t * @param {number} right - Right boundary of the viewing frustum at the near plane.\n\t * @param {number} top - Top boundary of the viewing frustum at the near plane.\n\t * @param {number} bottom - Bottom boundary of the viewing frustum at the near plane.\n\t * @param {number} near - The distance from the camera to the near plane.\n\t * @param {number} far - The distance from the camera to the far plane.\n\t * @param {(WebGLCoordinateSystem|WebGPUCoordinateSystem)} [coordinateSystem=WebGLCoordinateSystem] - The coordinate system.\n\t * @param {boolean} [reversedDepth=false] - Whether to use a reversed depth.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeOrthographic( left, right, top, bottom, near, far, coordinateSystem = WebGLCoordinateSystem, reversedDepth = false ) {\n\n\t\tconst te = this.elements;\n\n\t\tconst x = 2 / ( right - left );\n\t\tconst y = 2 / ( top - bottom );\n\n\t\tconst a = - ( right + left ) / ( right - left );\n\t\tconst b = - ( top + bottom ) / ( top - bottom );\n\n\t\tlet c, d;\n\n\t\tif ( reversedDepth ) {\n\n\t\t\tc = 1 / ( far - near );\n\t\t\td = far / ( far - near );\n\n\t\t} else {\n\n\t\t\tif ( coordinateSystem === WebGLCoordinateSystem ) {\n\n\t\t\t\tc = -2 / ( far - near );\n\t\t\t\td = - ( far + near ) / ( far - near );\n\n\t\t\t} else if ( coordinateSystem === WebGPUCoordinateSystem ) {\n\n\t\t\t\tc = -1 / ( far - near );\n\t\t\t\td = - near / ( far - near );\n\n\t\t\t} else {\n\n\t\t\t\tthrow new Error( 'THREE.Matrix4.makeOrthographic(): Invalid coordinate system: ' + coordinateSystem );\n\n\t\t\t}\n\n\t\t}\n\n\t\tte[ 0 ] = x;\t\tte[ 4 ] = 0;\t\tte[ 8 ] = 0; \t\tte[ 12 ] = a;\n\t\tte[ 1 ] = 0; \t\tte[ 5 ] = y;\t\tte[ 9 ] = 0; \t\tte[ 13 ] = b;\n\t\tte[ 2 ] = 0; \t\tte[ 6 ] = 0;\t\tte[ 10 ] = c;\t\tte[ 14 ] = d;\n\t\tte[ 3 ] = 0; \t\tte[ 7 ] = 0;\t\tte[ 11 ] = 0;\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this matrix is equal with the given one.\n\t *\n\t * @param {Matrix4} matrix - The matrix to test for equality.\n\t * @return {boolean} Whether this matrix is equal with the given one.\n\t */\n\tequals( matrix ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = matrix.elements;\n\n\t\tfor ( let i = 0; i < 16; i ++ ) {\n\n\t\t\tif ( te[ i ] !== me[ i ] ) return false;\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\t/**\n\t * Sets the elements of the matrix from the given array.\n\t *\n\t * @param {Array<number>} array - The matrix elements in column-major order.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tfromArray( array, offset = 0 ) {\n\n\t\tfor ( let i = 0; i < 16; i ++ ) {\n\n\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Writes the elements of this matrix to the given array. If no array is provided,\n\t * the method returns a new instance.\n\t *\n\t * @param {Array<number>} [array=[]] - The target array holding the matrix elements in column-major order.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Array<number>} The matrix elements in column-major order.\n\t */\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tconst te = this.elements;\n\n\t\tarray[ offset ] = te[ 0 ];\n\t\tarray[ offset + 1 ] = te[ 1 ];\n\t\tarray[ offset + 2 ] = te[ 2 ];\n\t\tarray[ offset + 3 ] = te[ 3 ];\n\n\t\tarray[ offset + 4 ] = te[ 4 ];\n\t\tarray[ offset + 5 ] = te[ 5 ];\n\t\tarray[ offset + 6 ] = te[ 6 ];\n\t\tarray[ offset + 7 ] = te[ 7 ];\n\n\t\tarray[ offset + 8 ] = te[ 8 ];\n\t\tarray[ offset + 9 ] = te[ 9 ];\n\t\tarray[ offset + 10 ] = te[ 10 ];\n\t\tarray[ offset + 11 ] = te[ 11 ];\n\n\t\tarray[ offset + 12 ] = te[ 12 ];\n\t\tarray[ offset + 13 ] = te[ 13 ];\n\t\tarray[ offset + 14 ] = te[ 14 ];\n\t\tarray[ offset + 15 ] = te[ 15 ];\n\n\t\treturn array;\n\n\t}\n\n}\n\nconst _v1$5 = /*@__PURE__*/ new Vector3();\nconst _m1$4 = /*@__PURE__*/ new Matrix4();\nconst _zero = /*@__PURE__*/ new Vector3( 0, 0, 0 );\nconst _one = /*@__PURE__*/ new Vector3( 1, 1, 1 );\nconst _x = /*@__PURE__*/ new Vector3();\nconst _y = /*@__PURE__*/ new Vector3();\nconst _z = /*@__PURE__*/ new Vector3();\n\nconst _matrix$2 = /*@__PURE__*/ new Matrix4();\nconst _quaternion$3 = /*@__PURE__*/ new Quaternion();\n\n/**\n * A class representing Euler angles.\n *\n * Euler angles describe a rotational transformation by rotating an object on\n * its various axes in specified amounts per axis, and a specified axis\n * order.\n *\n * Iterating through an instance will yield its components (x, y, z,\n * order) in the corresponding order.\n *\n * ```js\n * const a = new THREE.Euler( 0, 1, 1.57, 'XYZ' );\n * const b = new THREE.Vector3( 1, 0, 1 );\n * b.applyEuler(a);\n * ```\n */\nclass Euler {\n\n\t/**\n\t * Constructs a new euler instance.\n\t *\n\t * @param {number} [x=0] - The angle of the x axis in radians.\n\t * @param {number} [y=0] - The angle of the y axis in radians.\n\t * @param {number} [z=0] - The angle of the z axis in radians.\n\t * @param {string} [order=Euler.DEFAULT_ORDER] - A string representing the order that the rotations are applied.\n\t */\n\tconstructor( x = 0, y = 0, z = 0, order = Euler.DEFAULT_ORDER ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isEuler = true;\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._order = order;\n\n\t}\n\n\t/**\n\t * The angle of the x axis in radians.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget x() {\n\n\t\treturn this._x;\n\n\t}\n\n\tset x( value ) {\n\n\t\tthis._x = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\t/**\n\t * The angle of the y axis in radians.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget y() {\n\n\t\treturn this._y;\n\n\t}\n\n\tset y( value ) {\n\n\t\tthis._y = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\t/**\n\t * The angle of the z axis in radians.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget z() {\n\n\t\treturn this._z;\n\n\t}\n\n\tset z( value ) {\n\n\t\tthis._z = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\t/**\n\t * A string representing the order that the rotations are applied.\n\t *\n\t * @type {string}\n\t * @default 'XYZ'\n\t */\n\tget order() {\n\n\t\treturn this._order;\n\n\t}\n\n\tset order( value ) {\n\n\t\tthis._order = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\t/**\n\t * Sets the Euler components.\n\t *\n\t * @param {number} x - The angle of the x axis in radians.\n\t * @param {number} y - The angle of the y axis in radians.\n\t * @param {number} z - The angle of the z axis in radians.\n\t * @param {string} [order] - A string representing the order that the rotations are applied.\n\t * @return {Euler} A reference to this Euler instance.\n\t */\n\tset( x, y, z, order = this._order ) {\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._order = order;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new Euler instance with copied values from this instance.\n\t *\n\t * @return {Euler} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor( this._x, this._y, this._z, this._order );\n\n\t}\n\n\t/**\n\t * Copies the values of the given Euler instance to this instance.\n\t *\n\t * @param {Euler} euler - The Euler instance to copy.\n\t * @return {Euler} A reference to this Euler instance.\n\t */\n\tcopy( euler ) {\n\n\t\tthis._x = euler._x;\n\t\tthis._y = euler._y;\n\t\tthis._z = euler._z;\n\t\tthis._order = euler._order;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the angles of this Euler instance from a pure rotation matrix.\n\t *\n\t * @param {Matrix4} m - A 4x4 matrix of which the upper 3x3 of matrix is a pure rotation matrix (i.e. unscaled).\n\t * @param {string} [order] - A string representing the order that the rotations are applied.\n\t * @param {boolean} [update=true] - Whether the internal `onChange` callback should be executed or not.\n\t * @return {Euler} A reference to this Euler instance.\n\t */\n\tsetFromRotationMatrix( m, order = this._order, update = true ) {\n\n\t\tconst te = m.elements;\n\t\tconst m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ];\n\t\tconst m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ];\n\t\tconst m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];\n\n\t\tswitch ( order ) {\n\n\t\t\tcase 'XYZ':\n\n\t\t\t\tthis._y = Math.asin( clamp( m13, -1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m13 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m33 );\n\t\t\t\t\tthis._z = Math.atan2( - m12, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m22 );\n\t\t\t\t\tthis._z = 0;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'YXZ':\n\n\t\t\t\tthis._x = Math.asin( - clamp( m23, -1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m23 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._y = Math.atan2( m13, m33 );\n\t\t\t\t\tthis._z = Math.atan2( m21, m22 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._y = Math.atan2( - m31, m11 );\n\t\t\t\t\tthis._z = 0;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZXY':\n\n\t\t\t\tthis._x = Math.asin( clamp( m32, -1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m32 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._y = Math.atan2( - m31, m33 );\n\t\t\t\t\tthis._z = Math.atan2( - m12, m22 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._y = 0;\n\t\t\t\t\tthis._z = Math.atan2( m21, m11 );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZYX':\n\n\t\t\t\tthis._y = Math.asin( - clamp( m31, -1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m31 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m33 );\n\t\t\t\t\tthis._z = Math.atan2( m21, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = 0;\n\t\t\t\t\tthis._z = Math.atan2( - m12, m22 );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'YZX':\n\n\t\t\t\tthis._z = Math.asin( clamp( m21, -1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m21 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m22 );\n\t\t\t\t\tthis._y = Math.atan2( - m31, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = 0;\n\t\t\t\t\tthis._y = Math.atan2( m13, m33 );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'XZY':\n\n\t\t\t\tthis._z = Math.asin( - clamp( m12, -1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m12 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m22 );\n\t\t\t\t\tthis._y = Math.atan2( m13, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m33 );\n\t\t\t\t\tthis._y = 0;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\twarn( 'Euler: .setFromRotationMatrix() encountered an unknown order: ' + order );\n\n\t\t}\n\n\t\tthis._order = order;\n\n\t\tif ( update === true ) this._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the angles of this Euler instance from a normalized quaternion.\n\t *\n\t * @param {Quaternion} q - A normalized Quaternion.\n\t * @param {string} [order] - A string representing the order that the rotations are applied.\n\t * @param {boolean} [update=true] - Whether the internal `onChange` callback should be executed or not.\n\t * @return {Euler} A reference to this Euler instance.\n\t */\n\tsetFromQuaternion( q, order, update ) {\n\n\t\t_matrix$2.makeRotationFromQuaternion( q );\n\n\t\treturn this.setFromRotationMatrix( _matrix$2, order, update );\n\n\t}\n\n\t/**\n\t * Sets the angles of this Euler instance from the given vector.\n\t *\n\t * @param {Vector3} v - The vector.\n\t * @param {string} [order] - A string representing the order that the rotations are applied.\n\t * @return {Euler} A reference to this Euler instance.\n\t */\n\tsetFromVector3( v, order = this._order ) {\n\n\t\treturn this.set( v.x, v.y, v.z, order );\n\n\t}\n\n\t/**\n\t * Resets the euler angle with a new order by creating a quaternion from this\n\t * euler angle and then setting this euler angle with the quaternion and the\n\t * new order.\n\t *\n\t * Warning: This discards revolution information.\n\t *\n\t * @param {string} [newOrder] - A string representing the new order that the rotations are applied.\n\t * @return {Euler} A reference to this Euler instance.\n\t */\n\treorder( newOrder ) {\n\n\t\t_quaternion$3.setFromEuler( this );\n\n\t\treturn this.setFromQuaternion( _quaternion$3, newOrder );\n\n\t}\n\n\t/**\n\t * Returns `true` if this Euler instance is equal with the given one.\n\t *\n\t * @param {Euler} euler - The Euler instance to test for equality.\n\t * @return {boolean} Whether this Euler instance is equal with the given one.\n\t */\n\tequals( euler ) {\n\n\t\treturn ( euler._x === this._x ) && ( euler._y === this._y ) && ( euler._z === this._z ) && ( euler._order === this._order );\n\n\t}\n\n\t/**\n\t * Sets this Euler instance's components to values from the given array. The first three\n\t * entries of the array are assign to the x,y and z components. An optional fourth entry\n\t * defines the Euler order.\n\t *\n\t * @param {Array<number,number,number,?string>} array - An array holding the Euler component values.\n\t * @return {Euler} A reference to this Euler instance.\n\t */\n\tfromArray( array ) {\n\n\t\tthis._x = array[ 0 ];\n\t\tthis._y = array[ 1 ];\n\t\tthis._z = array[ 2 ];\n\t\tif ( array[ 3 ] !== undefined ) this._order = array[ 3 ];\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Writes the components of this Euler instance to the given array. If no array is provided,\n\t * the method returns a new instance.\n\t *\n\t * @param {Array<number,number,number,string>} [array=[]] - The target array holding the Euler components.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Array<number,number,number,string>} The Euler components.\n\t */\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this._x;\n\t\tarray[ offset + 1 ] = this._y;\n\t\tarray[ offset + 2 ] = this._z;\n\t\tarray[ offset + 3 ] = this._order;\n\n\t\treturn array;\n\n\t}\n\n\t_onChange( callback ) {\n\n\t\tthis._onChangeCallback = callback;\n\n\t\treturn this;\n\n\t}\n\n\t_onChangeCallback() {}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this._x;\n\t\tyield this._y;\n\t\tyield this._z;\n\t\tyield this._order;\n\n\t}\n\n}\n\n/**\n * The default Euler angle order.\n *\n * @static\n * @type {string}\n * @default 'XYZ'\n */\nEuler.DEFAULT_ORDER = 'XYZ';\n\n/**\n * A layers object assigns an 3D object to 1 or more of 32\n * layers numbered `0` to `31` - internally the layers are stored as a\n * bit mask], and by default all 3D objects are a member of layer `0`.\n *\n * This can be used to control visibility - an object must share a layer with\n * a camera to be visible when that camera's view is\n * rendered.\n *\n * All classes that inherit from {@link Object3D} have an `layers` property which\n * is an instance of this class.\n */\nclass Layers {\n\n\t/**\n\t * Constructs a new layers instance, with membership\n\t * initially set to layer `0`.\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * A bit mask storing which of the 32 layers this layers object is currently\n\t\t * a member of.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.mask = 1 | 0;\n\n\t}\n\n\t/**\n\t * Sets membership to the given layer, and remove membership all other layers.\n\t *\n\t * @param {number} layer - The layer to set.\n\t */\n\tset( layer ) {\n\n\t\tthis.mask = ( 1 << layer | 0 ) >>> 0;\n\n\t}\n\n\t/**\n\t * Adds membership of the given layer.\n\t *\n\t * @param {number} layer - The layer to enable.\n\t */\n\tenable( layer ) {\n\n\t\tthis.mask |= 1 << layer | 0;\n\n\t}\n\n\t/**\n\t * Adds membership to all layers.\n\t */\n\tenableAll() {\n\n\t\tthis.mask = 0xffffffff | 0;\n\n\t}\n\n\t/**\n\t * Toggles the membership of the given layer.\n\t *\n\t * @param {number} layer - The layer to toggle.\n\t */\n\ttoggle( layer ) {\n\n\t\tthis.mask ^= 1 << layer | 0;\n\n\t}\n\n\t/**\n\t * Removes membership of the given layer.\n\t *\n\t * @param {number} layer - The layer to enable.\n\t */\n\tdisable( layer ) {\n\n\t\tthis.mask &= ~ ( 1 << layer | 0 );\n\n\t}\n\n\t/**\n\t * Removes the membership from all layers.\n\t */\n\tdisableAll() {\n\n\t\tthis.mask = 0;\n\n\t}\n\n\t/**\n\t * Returns `true` if this and the given layers object have at least one\n\t * layer in common.\n\t *\n\t * @param {Layers} layers - The layers to test.\n\t * @return {boolean } Whether this and the given layers object have at least one layer in common or not.\n\t */\n\ttest( layers ) {\n\n\t\treturn ( this.mask & layers.mask ) !== 0;\n\n\t}\n\n\t/**\n\t * Returns `true` if the given layer is enabled.\n\t *\n\t * @param {number} layer - The layer to test.\n\t * @return {boolean } Whether the given layer is enabled or not.\n\t */\n\tisEnabled( layer ) {\n\n\t\treturn ( this.mask & ( 1 << layer | 0 ) ) !== 0;\n\n\t}\n\n}\n\nlet _object3DId = 0;\n\nconst _v1$4 = /*@__PURE__*/ new Vector3();\nconst _q1 = /*@__PURE__*/ new Quaternion();\nconst _m1$3 = /*@__PURE__*/ new Matrix4();\nconst _target = /*@__PURE__*/ new Vector3();\n\nconst _position$3 = /*@__PURE__*/ new Vector3();\nconst _scale$2 = /*@__PURE__*/ new Vector3();\nconst _quaternion$2 = /*@__PURE__*/ new Quaternion();\n\nconst _xAxis = /*@__PURE__*/ new Vector3( 1, 0, 0 );\nconst _yAxis = /*@__PURE__*/ new Vector3( 0, 1, 0 );\nconst _zAxis = /*@__PURE__*/ new Vector3( 0, 0, 1 );\n\n/**\n * Fires when the object has been added to its parent object.\n *\n * @event Object3D#added\n * @type {Object}\n */\nconst _addedEvent = { type: 'added' };\n\n/**\n * Fires when the object has been removed from its parent object.\n *\n * @event Object3D#removed\n * @type {Object}\n */\nconst _removedEvent = { type: 'removed' };\n\n/**\n * Fires when a new child object has been added.\n *\n * @event Object3D#childadded\n * @type {Object}\n */\nconst _childaddedEvent = { type: 'childadded', child: null };\n\n/**\n * Fires when a child object has been removed.\n *\n * @event Object3D#childremoved\n * @type {Object}\n */\nconst _childremovedEvent = { type: 'childremoved', child: null };\n\n/**\n * This is the base class for most objects in three.js and provides a set of\n * properties and methods for manipulating objects in 3D space.\n *\n * @augments EventDispatcher\n */\nclass Object3D extends EventDispatcher {\n\n\t/**\n\t * Constructs a new 3D object.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isObject3D = true;\n\n\t\t/**\n\t\t * The ID of the 3D object.\n\t\t *\n\t\t * @name Object3D#id\n\t\t * @type {number}\n\t\t * @readonly\n\t\t */\n\t\tObject.defineProperty( this, 'id', { value: _object3DId ++ } );\n\n\t\t/**\n\t\t * The UUID of the 3D object.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.uuid = generateUUID();\n\n\t\t/**\n\t\t * The name of the 3D object.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\n\t\t/**\n\t\t * The type property is used for detecting the object type\n\t\t * in context of serialization/deserialization.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.type = 'Object3D';\n\n\t\t/**\n\t\t * A reference to the parent object.\n\t\t *\n\t\t * @type {?Object3D}\n\t\t * @default null\n\t\t */\n\t\tthis.parent = null;\n\n\t\t/**\n\t\t * An array holding the child 3D objects of this instance.\n\t\t *\n\t\t * @type {Array<Object3D>}\n\t\t */\n\t\tthis.children = [];\n\n\t\t/**\n\t\t * Defines the `up` direction of the 3D object which influences\n\t\t * the orientation via methods like {@link Object3D#lookAt}.\n\t\t *\n\t\t * The default values for all 3D objects is defined by `Object3D.DEFAULT_UP`.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.up = Object3D.DEFAULT_UP.clone();\n\n\t\tconst position = new Vector3();\n\t\tconst rotation = new Euler();\n\t\tconst quaternion = new Quaternion();\n\t\tconst scale = new Vector3( 1, 1, 1 );\n\n\t\tfunction onRotationChange() {\n\n\t\t\tquaternion.setFromEuler( rotation, false );\n\n\t\t}\n\n\t\tfunction onQuaternionChange() {\n\n\t\t\trotation.setFromQuaternion( quaternion, undefined, false );\n\n\t\t}\n\n\t\trotation._onChange( onRotationChange );\n\t\tquaternion._onChange( onQuaternionChange );\n\n\t\tObject.defineProperties( this, {\n\t\t\t/**\n\t\t\t * Represents the object's local position.\n\t\t\t *\n\t\t\t * @name Object3D#position\n\t\t\t * @type {Vector3}\n\t\t\t * @default (0,0,0)\n\t\t\t */\n\t\t\tposition: {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: position\n\t\t\t},\n\t\t\t/**\n\t\t\t * Represents the object's local rotation as Euler angles, in radians.\n\t\t\t *\n\t\t\t * @name Object3D#rotation\n\t\t\t * @type {Euler}\n\t\t\t * @default (0,0,0)\n\t\t\t */\n\t\t\trotation: {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: rotation\n\t\t\t},\n\t\t\t/**\n\t\t\t * Represents the object's local rotation as Quaternions.\n\t\t\t *\n\t\t\t * @name Object3D#quaternion\n\t\t\t * @type {Quaternion}\n\t\t\t */\n\t\t\tquaternion: {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: quaternion\n\t\t\t},\n\t\t\t/**\n\t\t\t * Represents the object's local scale.\n\t\t\t *\n\t\t\t * @name Object3D#scale\n\t\t\t * @type {Vector3}\n\t\t\t * @default (1,1,1)\n\t\t\t */\n\t\t\tscale: {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: scale\n\t\t\t},\n\t\t\t/**\n\t\t\t * Represents the object's model-view matrix.\n\t\t\t *\n\t\t\t * @name Object3D#modelViewMatrix\n\t\t\t * @type {Matrix4}\n\t\t\t */\n\t\t\tmodelViewMatrix: {\n\t\t\t\tvalue: new Matrix4()\n\t\t\t},\n\t\t\t/**\n\t\t\t * Represents the object's normal matrix.\n\t\t\t *\n\t\t\t * @name Object3D#normalMatrix\n\t\t\t * @type {Matrix3}\n\t\t\t */\n\t\t\tnormalMatrix: {\n\t\t\t\tvalue: new Matrix3()\n\t\t\t}\n\t\t} );\n\n\t\t/**\n\t\t * Represents the object's transformation matrix in local space.\n\t\t *\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.matrix = new Matrix4();\n\n\t\t/**\n\t\t * Represents the object's transformation matrix in world space.\n\t\t * If the 3D object has no parent, then it's identical to the local transformation matrix\n\t\t *\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.matrixWorld = new Matrix4();\n\n\t\t/**\n\t\t * When set to `true`, the engine automatically computes the local matrix from position,\n\t\t * rotation and scale every frame.\n\t\t *\n\t\t * The default values for all 3D objects is defined by `Object3D.DEFAULT_MATRIX_AUTO_UPDATE`.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.matrixAutoUpdate = Object3D.DEFAULT_MATRIX_AUTO_UPDATE;\n\n\t\t/**\n\t\t * When set to `true`, the engine automatically computes the world matrix from the current local\n\t\t * matrix and the object's transformation hierarchy.\n\t\t *\n\t\t * The default values for all 3D objects is defined by `Object3D.DEFAULT_MATRIX_WORLD_AUTO_UPDATE`.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.matrixWorldAutoUpdate = Object3D.DEFAULT_MATRIX_WORLD_AUTO_UPDATE; // checked by the renderer\n\n\t\t/**\n\t\t * When set to `true`, it calculates the world matrix in that frame and resets this property\n\t\t * to `false`.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.matrixWorldNeedsUpdate = false;\n\n\t\t/**\n\t\t * The layer membership of the 3D object. The 3D object is only visible if it has\n\t\t * at least one layer in common with the camera in use. This property can also be\n\t\t * used to filter out unwanted objects in ray-intersection tests when using {@link Raycaster}.\n\t\t *\n\t\t * @type {Layers}\n\t\t */\n\t\tthis.layers = new Layers();\n\n\t\t/**\n\t\t * When set to `true`, the 3D object gets rendered.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.visible = true;\n\n\t\t/**\n\t\t * When set to `true`, the 3D object gets rendered into shadow maps.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.castShadow = false;\n\n\t\t/**\n\t\t * When set to `true`, the 3D object is affected by shadows in the scene.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.receiveShadow = false;\n\n\t\t/**\n\t\t * When set to `true`, the 3D object is honored by view frustum culling.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.frustumCulled = true;\n\n\t\t/**\n\t\t * This value allows the default rendering order of scene graph objects to be\n\t\t * overridden although opaque and transparent objects remain sorted independently.\n\t\t * When this property is set for an instance of {@link Group},all descendants\n\t\t * objects will be sorted and rendered together. Sorting is from lowest to highest\n\t\t * render order.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.renderOrder = 0;\n\n\t\t/**\n\t\t * An array holding the animation clips of the 3D object.\n\t\t *\n\t\t * @type {Array<AnimationClip>}\n\t\t */\n\t\tthis.animations = [];\n\n\t\t/**\n\t\t * Custom depth material to be used when rendering to the depth map. Can only be used\n\t\t * in context of meshes. When shadow-casting with a {@link DirectionalLight} or {@link SpotLight},\n\t\t * if you are modifying vertex positions in the vertex shader you must specify a custom depth\n\t\t * material for proper shadows.\n\t\t *\n\t\t * Only relevant in context of {@link WebGLRenderer}.\n\t\t *\n\t\t * @type {(Material|undefined)}\n\t\t * @default undefined\n\t\t */\n\t\tthis.customDepthMaterial = undefined;\n\n\t\t/**\n\t\t * Same as {@link Object3D#customDepthMaterial}, but used with {@link PointLight}.\n\t\t *\n\t\t * Only relevant in context of {@link WebGLRenderer}.\n\t\t *\n\t\t * @type {(Material|undefined)}\n\t\t * @default undefined\n\t\t */\n\t\tthis.customDistanceMaterial = undefined;\n\n\t\t/**\n\t\t * An object that can be used to store custom data about the 3D object. It\n\t\t * should not hold references to functions as these will not be cloned.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.userData = {};\n\n\t}\n\n\t/**\n\t * A callback that is executed immediately before a 3D object is rendered to a shadow map.\n\t *\n\t * @param {Renderer|WebGLRenderer} renderer - The renderer.\n\t * @param {Object3D} object - The 3D object.\n\t * @param {Camera} camera - The camera that is used to render the scene.\n\t * @param {Camera} shadowCamera - The shadow camera.\n\t * @param {BufferGeometry} geometry - The 3D object's geometry.\n\t * @param {Material} depthMaterial - The depth material.\n\t * @param {Object} group - The geometry group data.\n\t */\n\tonBeforeShadow( /* renderer, object, camera, shadowCamera, geometry, depthMaterial, group */ ) {}\n\n\t/**\n\t * A callback that is executed immediately after a 3D object is rendered to a shadow map.\n\t *\n\t * @param {Renderer|WebGLRenderer} renderer - The renderer.\n\t * @param {Object3D} object - The 3D object.\n\t * @param {Camera} camera - The camera that is used to render the scene.\n\t * @param {Camera} shadowCamera - The shadow camera.\n\t * @param {BufferGeometry} geometry - The 3D object's geometry.\n\t * @param {Material} depthMaterial - The depth material.\n\t * @param {Object} group - The geometry group data.\n\t */\n\tonAfterShadow( /* renderer, object, camera, shadowCamera, geometry, depthMaterial, group */ ) {}\n\n\t/**\n\t * A callback that is executed immediately before a 3D object is rendered.\n\t *\n\t * @param {Renderer|WebGLRenderer} renderer - The renderer.\n\t * @param {Object3D} object - The 3D object.\n\t * @param {Camera} camera - The camera that is used to render the scene.\n\t * @param {BufferGeometry} geometry - The 3D object's geometry.\n\t * @param {Material} material - The 3D object's material.\n\t * @param {Object} group - The geometry group data.\n\t */\n\tonBeforeRender( /* renderer, scene, camera, geometry, material, group */ ) {}\n\n\t/**\n\t * A callback that is executed immediately after a 3D object is rendered.\n\t *\n\t * @param {Renderer|WebGLRenderer} renderer - The renderer.\n\t * @param {Object3D} object - The 3D object.\n\t * @param {Camera} camera - The camera that is used to render the scene.\n\t * @param {BufferGeometry} geometry - The 3D object's geometry.\n\t * @param {Material} material - The 3D object's material.\n\t * @param {Object} group - The geometry group data.\n\t */\n\tonAfterRender( /* renderer, scene, camera, geometry, material, group */ ) {}\n\n\t/**\n\t * Applies the given transformation matrix to the object and updates the object's position,\n\t * rotation and scale.\n\t *\n\t * @param {Matrix4} matrix - The transformation matrix.\n\t */\n\tapplyMatrix4( matrix ) {\n\n\t\tif ( this.matrixAutoUpdate ) this.updateMatrix();\n\n\t\tthis.matrix.premultiply( matrix );\n\n\t\tthis.matrix.decompose( this.position, this.quaternion, this.scale );\n\n\t}\n\n\t/**\n\t * Applies a rotation represented by given the quaternion to the 3D object.\n\t *\n\t * @param {Quaternion} q - The quaternion.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\tapplyQuaternion( q ) {\n\n\t\tthis.quaternion.premultiply( q );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given rotation represented as an axis/angle couple to the 3D object.\n\t *\n\t * @param {Vector3} axis - The (normalized) axis vector.\n\t * @param {number} angle - The angle in radians.\n\t */\n\tsetRotationFromAxisAngle( axis, angle ) {\n\n\t\t// assumes axis is normalized\n\n\t\tthis.quaternion.setFromAxisAngle( axis, angle );\n\n\t}\n\n\t/**\n\t * Sets the given rotation represented as Euler angles to the 3D object.\n\t *\n\t * @param {Euler} euler - The Euler angles.\n\t */\n\tsetRotationFromEuler( euler ) {\n\n\t\tthis.quaternion.setFromEuler( euler, true );\n\n\t}\n\n\t/**\n\t * Sets the given rotation represented as rotation matrix to the 3D object.\n\t *\n\t * @param {Matrix4} m - Although a 4x4 matrix is expected, the upper 3x3 portion must be\n\t * a pure rotation matrix (i.e, unscaled).\n\t */\n\tsetRotationFromMatrix( m ) {\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tthis.quaternion.setFromRotationMatrix( m );\n\n\t}\n\n\t/**\n\t * Sets the given rotation represented as a Quaternion to the 3D object.\n\t *\n\t * @param {Quaternion} q - The Quaternion\n\t */\n\tsetRotationFromQuaternion( q ) {\n\n\t\t// assumes q is normalized\n\n\t\tthis.quaternion.copy( q );\n\n\t}\n\n\t/**\n\t * Rotates the 3D object along an axis in local space.\n\t *\n\t * @param {Vector3} axis - The (normalized) axis vector.\n\t * @param {number} angle - The angle in radians.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\trotateOnAxis( axis, angle ) {\n\n\t\t// rotate object on axis in object space\n\t\t// axis is assumed to be normalized\n\n\t\t_q1.setFromAxisAngle( axis, angle );\n\n\t\tthis.quaternion.multiply( _q1 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Rotates the 3D object along an axis in world space.\n\t *\n\t * @param {Vector3} axis - The (normalized) axis vector.\n\t * @param {number} angle - The angle in radians.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\trotateOnWorldAxis( axis, angle ) {\n\n\t\t// rotate object on axis in world space\n\t\t// axis is assumed to be normalized\n\t\t// method assumes no rotated parent\n\n\t\t_q1.setFromAxisAngle( axis, angle );\n\n\t\tthis.quaternion.premultiply( _q1 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Rotates the 3D object around its X axis in local space.\n\t *\n\t * @param {number} angle - The angle in radians.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\trotateX( angle ) {\n\n\t\treturn this.rotateOnAxis( _xAxis, angle );\n\n\t}\n\n\t/**\n\t * Rotates the 3D object around its Y axis in local space.\n\t *\n\t * @param {number} angle - The angle in radians.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\trotateY( angle ) {\n\n\t\treturn this.rotateOnAxis( _yAxis, angle );\n\n\t}\n\n\t/**\n\t * Rotates the 3D object around its Z axis in local space.\n\t *\n\t * @param {number} angle - The angle in radians.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\trotateZ( angle ) {\n\n\t\treturn this.rotateOnAxis( _zAxis, angle );\n\n\t}\n\n\t/**\n\t * Translate the 3D object by a distance along the given axis in local space.\n\t *\n\t * @param {Vector3} axis - The (normalized) axis vector.\n\t * @param {number} distance - The distance in world units.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\ttranslateOnAxis( axis, distance ) {\n\n\t\t// translate object by distance along axis in object space\n\t\t// axis is assumed to be normalized\n\n\t\t_v1$4.copy( axis ).applyQuaternion( this.quaternion );\n\n\t\tthis.position.add( _v1$4.multiplyScalar( distance ) );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Translate the 3D object by a distance along its X-axis in local space.\n\t *\n\t * @param {number} distance - The distance in world units.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\ttranslateX( distance ) {\n\n\t\treturn this.translateOnAxis( _xAxis, distance );\n\n\t}\n\n\t/**\n\t * Translate the 3D object by a distance along its Y-axis in local space.\n\t *\n\t * @param {number} distance - The distance in world units.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\ttranslateY( distance ) {\n\n\t\treturn this.translateOnAxis( _yAxis, distance );\n\n\t}\n\n\t/**\n\t * Translate the 3D object by a distance along its Z-axis in local space.\n\t *\n\t * @param {number} distance - The distance in world units.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\ttranslateZ( distance ) {\n\n\t\treturn this.translateOnAxis( _zAxis, distance );\n\n\t}\n\n\t/**\n\t * Converts the given vector from this 3D object's local space to world space.\n\t *\n\t * @param {Vector3} vector - The vector to convert.\n\t * @return {Vector3} The converted vector.\n\t */\n\tlocalToWorld( vector ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\treturn vector.applyMatrix4( this.matrixWorld );\n\n\t}\n\n\t/**\n\t * Converts the given vector from this 3D object's word space to local space.\n\t *\n\t * @param {Vector3} vector - The vector to convert.\n\t * @return {Vector3} The converted vector.\n\t */\n\tworldToLocal( vector ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\treturn vector.applyMatrix4( _m1$3.copy( this.matrixWorld ).invert() );\n\n\t}\n\n\t/**\n\t * Rotates the object to face a point in world space.\n\t *\n\t * This method does not support objects having non-uniformly-scaled parent(s).\n\t *\n\t * @param {number|Vector3} x - The x coordinate in world space. Alternatively, a vector representing a position in world space\n\t * @param {number} [y] - The y coordinate in world space.\n\t * @param {number} [z] - The z coordinate in world space.\n\t */\n\tlookAt( x, y, z ) {\n\n\t\t// This method does not support objects having non-uniformly-scaled parent(s)\n\n\t\tif ( x.isVector3 ) {\n\n\t\t\t_target.copy( x );\n\n\t\t} else {\n\n\t\t\t_target.set( x, y, z );\n\n\t\t}\n\n\t\tconst parent = this.parent;\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\t_position$3.setFromMatrixPosition( this.matrixWorld );\n\n\t\tif ( this.isCamera || this.isLight ) {\n\n\t\t\t_m1$3.lookAt( _position$3, _target, this.up );\n\n\t\t} else {\n\n\t\t\t_m1$3.lookAt( _target, _position$3, this.up );\n\n\t\t}\n\n\t\tthis.quaternion.setFromRotationMatrix( _m1$3 );\n\n\t\tif ( parent ) {\n\n\t\t\t_m1$3.extractRotation( parent.matrixWorld );\n\t\t\t_q1.setFromRotationMatrix( _m1$3 );\n\t\t\tthis.quaternion.premultiply( _q1.invert() );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Adds the given 3D object as a child to this 3D object. An arbitrary number of\n\t * objects may be added. Any current parent on an object passed in here will be\n\t * removed, since an object can have at most one parent.\n\t *\n\t * @fires Object3D#added\n\t * @fires Object3D#childadded\n\t * @param {Object3D} object - The 3D object to add.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\tadd( object ) {\n\n\t\tif ( arguments.length > 1 ) {\n\n\t\t\tfor ( let i = 0; i < arguments.length; i ++ ) {\n\n\t\t\t\tthis.add( arguments[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tif ( object === this ) {\n\n\t\t\terror( 'Object3D.add: object can\\'t be added as a child of itself.', object );\n\t\t\treturn this;\n\n\t\t}\n\n\t\tif ( object && object.isObject3D ) {\n\n\t\t\tobject.removeFromParent();\n\t\t\tobject.parent = this;\n\t\t\tthis.children.push( object );\n\n\t\t\tobject.dispatchEvent( _addedEvent );\n\n\t\t\t_childaddedEvent.child = object;\n\t\t\tthis.dispatchEvent( _childaddedEvent );\n\t\t\t_childaddedEvent.child = null;\n\n\t\t} else {\n\n\t\t\terror( 'Object3D.add: object not an instance of THREE.Object3D.', object );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Removes the given 3D object as child from this 3D object.\n\t * An arbitrary number of objects may be removed.\n\t *\n\t * @fires Object3D#removed\n\t * @fires Object3D#childremoved\n\t * @param {Object3D} object - The 3D object to remove.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\tremove( object ) {\n\n\t\tif ( arguments.length > 1 ) {\n\n\t\t\tfor ( let i = 0; i < arguments.length; i ++ ) {\n\n\t\t\t\tthis.remove( arguments[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tconst index = this.children.indexOf( object );\n\n\t\tif ( index !== -1 ) {\n\n\t\t\tobject.parent = null;\n\t\t\tthis.children.splice( index, 1 );\n\n\t\t\tobject.dispatchEvent( _removedEvent );\n\n\t\t\t_childremovedEvent.child = object;\n\t\t\tthis.dispatchEvent( _childremovedEvent );\n\t\t\t_childremovedEvent.child = null;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Removes this 3D object from its current parent.\n\t *\n\t * @fires Object3D#removed\n\t * @fires Object3D#childremoved\n\t * @return {Object3D} A reference to this instance.\n\t */\n\tremoveFromParent() {\n\n\t\tconst parent = this.parent;\n\n\t\tif ( parent !== null ) {\n\n\t\t\tparent.remove( this );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Removes all child objects.\n\t *\n\t * @fires Object3D#removed\n\t * @fires Object3D#childremoved\n\t * @return {Object3D} A reference to this instance.\n\t */\n\tclear() {\n\n\t\treturn this.remove( ... this.children );\n\n\t}\n\n\t/**\n\t * Adds the given 3D object as a child of this 3D object, while maintaining the object's world\n\t * transform. This method does not support scene graphs having non-uniformly-scaled nodes(s).\n\t *\n\t * @fires Object3D#added\n\t * @fires Object3D#childadded\n\t * @param {Object3D} object - The 3D object to attach.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\tattach( object ) {\n\n\t\t// adds object as a child of this, while maintaining the object's world transform\n\n\t\t// Note: This method does not support scene graphs having non-uniformly-scaled nodes(s)\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\t_m1$3.copy( this.matrixWorld ).invert();\n\n\t\tif ( object.parent !== null ) {\n\n\t\t\tobject.parent.updateWorldMatrix( true, false );\n\n\t\t\t_m1$3.multiply( object.parent.matrixWorld );\n\n\t\t}\n\n\t\tobject.applyMatrix4( _m1$3 );\n\n\t\tobject.removeFromParent();\n\t\tobject.parent = this;\n\t\tthis.children.push( object );\n\n\t\tobject.updateWorldMatrix( false, true );\n\n\t\tobject.dispatchEvent( _addedEvent );\n\n\t\t_childaddedEvent.child = object;\n\t\tthis.dispatchEvent( _childaddedEvent );\n\t\t_childaddedEvent.child = null;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Searches through the 3D object and its children, starting with the 3D object\n\t * itself, and returns the first with a matching ID.\n\t *\n\t * @param {number} id - The id.\n\t * @return {Object3D|undefined} The found 3D object. Returns `undefined` if no 3D object has been found.\n\t */\n\tgetObjectById( id ) {\n\n\t\treturn this.getObjectByProperty( 'id', id );\n\n\t}\n\n\t/**\n\t * Searches through the 3D object and its children, starting with the 3D object\n\t * itself, and returns the first with a matching name.\n\t *\n\t * @param {string} name - The name.\n\t * @return {Object3D|undefined} The found 3D object. Returns `undefined` if no 3D object has been found.\n\t */\n\tgetObjectByName( name ) {\n\n\t\treturn this.getObjectByProperty( 'name', name );\n\n\t}\n\n\t/**\n\t * Searches through the 3D object and its children, starting with the 3D object\n\t * itself, and returns the first with a matching property value.\n\t *\n\t * @param {string} name - The name of the property.\n\t * @param {any} value - The value.\n\t * @return {Object3D|undefined} The found 3D object. Returns `undefined` if no 3D object has been found.\n\t */\n\tgetObjectByProperty( name, value ) {\n\n\t\tif ( this[ name ] === value ) return this;\n\n\t\tfor ( let i = 0, l = this.children.length; i < l; i ++ ) {\n\n\t\t\tconst child = this.children[ i ];\n\t\t\tconst object = child.getObjectByProperty( name, value );\n\n\t\t\tif ( object !== undefined ) {\n\n\t\t\t\treturn object;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn undefined;\n\n\t}\n\n\t/**\n\t * Searches through the 3D object and its children, starting with the 3D object\n\t * itself, and returns all 3D objects with a matching property value.\n\t *\n\t * @param {string} name - The name of the property.\n\t * @param {any} value - The value.\n\t * @param {Array<Object3D>} result - The method stores the result in this array.\n\t * @return {Array<Object3D>} The found 3D objects.\n\t */\n\tgetObjectsByProperty( name, value, result = [] ) {\n\n\t\tif ( this[ name ] === value ) result.push( this );\n\n\t\tconst children = this.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tchildren[ i ].getObjectsByProperty( name, value, result );\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\t/**\n\t * Returns a vector representing the position of the 3D object in world space.\n\t *\n\t * @param {Vector3} target - The target vector the result is stored to.\n\t * @return {Vector3} The 3D object's position in world space.\n\t */\n\tgetWorldPosition( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\treturn target.setFromMatrixPosition( this.matrixWorld );\n\n\t}\n\n\t/**\n\t * Returns a Quaternion representing the position of the 3D object in world space.\n\t *\n\t * @param {Quaternion} target - The target Quaternion the result is stored to.\n\t * @return {Quaternion} The 3D object's rotation in world space.\n\t */\n\tgetWorldQuaternion( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\tthis.matrixWorld.decompose( _position$3, target, _scale$2 );\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Returns a vector representing the scale of the 3D object in world space.\n\t *\n\t * @param {Vector3} target - The target vector the result is stored to.\n\t * @return {Vector3} The 3D object's scale in world space.\n\t */\n\tgetWorldScale( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\tthis.matrixWorld.decompose( _position$3, _quaternion$2, target );\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Returns a vector representing the (\"look\") direction of the 3D object in world space.\n\t *\n\t * @param {Vector3} target - The target vector the result is stored to.\n\t * @return {Vector3} The 3D object's direction in world space.\n\t */\n\tgetWorldDirection( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\tconst e = this.matrixWorld.elements;\n\n\t\treturn target.set( e[ 8 ], e[ 9 ], e[ 10 ] ).normalize();\n\n\t}\n\n\t/**\n\t * Abstract method to get intersections between a casted ray and this\n\t * 3D object. Renderable 3D objects such as {@link Mesh}, {@link Line} or {@link Points}\n\t * implement this method in order to use raycasting.\n\t *\n\t * @abstract\n\t * @param {Raycaster} raycaster - The raycaster.\n\t * @param {Array<Object>} intersects - An array holding the result of the method.\n\t */\n\traycast( /* raycaster, intersects */ ) {}\n\n\t/**\n\t * Executes the callback on this 3D object and all descendants.\n\t *\n\t * Note: Modifying the scene graph inside the callback is discouraged.\n\t *\n\t * @param {Function} callback - A callback function that allows to process the current 3D object.\n\t */\n\ttraverse( callback ) {\n\n\t\tcallback( this );\n\n\t\tconst children = this.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tchildren[ i ].traverse( callback );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Like {@link Object3D#traverse}, but the callback will only be executed for visible 3D objects.\n\t * Descendants of invisible 3D objects are not traversed.\n\t *\n\t * Note: Modifying the scene graph inside the callback is discouraged.\n\t *\n\t * @param {Function} callback - A callback function that allows to process the current 3D object.\n\t */\n\ttraverseVisible( callback ) {\n\n\t\tif ( this.visible === false ) return;\n\n\t\tcallback( this );\n\n\t\tconst children = this.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tchildren[ i ].traverseVisible( callback );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Like {@link Object3D#traverse}, but the callback will only be executed for all ancestors.\n\t *\n\t * Note: Modifying the scene graph inside the callback is discouraged.\n\t *\n\t * @param {Function} callback - A callback function that allows to process the current 3D object.\n\t */\n\ttraverseAncestors( callback ) {\n\n\t\tconst parent = this.parent;\n\n\t\tif ( parent !== null ) {\n\n\t\t\tcallback( parent );\n\n\t\t\tparent.traverseAncestors( callback );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Updates the transformation matrix in local space by computing it from the current\n\t * position, rotation and scale values.\n\t */\n\tupdateMatrix() {\n\n\t\tthis.matrix.compose( this.position, this.quaternion, this.scale );\n\n\t\tthis.matrixWorldNeedsUpdate = true;\n\n\t}\n\n\t/**\n\t * Updates the transformation matrix in world space of this 3D objects and its descendants.\n\t *\n\t * To ensure correct results, this method also recomputes the 3D object's transformation matrix in\n\t * local space. The computation of the local and world matrix can be controlled with the\n\t * {@link Object3D#matrixAutoUpdate} and {@link Object3D#matrixWorldAutoUpdate} flags which are both\n\t * `true` by default.  Set these flags to `false` if you need more control over the update matrix process.\n\t *\n\t * @param {boolean} [force=false] - When set to `true`, a recomputation of world matrices is forced even\n\t * when {@link Object3D#matrixWorldAutoUpdate} is set to `false`.\n\t */\n\tupdateMatrixWorld( force ) {\n\n\t\tif ( this.matrixAutoUpdate ) this.updateMatrix();\n\n\t\tif ( this.matrixWorldNeedsUpdate || force ) {\n\n\t\t\tif ( this.matrixWorldAutoUpdate === true ) {\n\n\t\t\t\tif ( this.parent === null ) {\n\n\t\t\t\t\tthis.matrixWorld.copy( this.matrix );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.matrixWorldNeedsUpdate = false;\n\n\t\t\tforce = true;\n\n\t\t}\n\n\t\t// make sure descendants are updated if required\n\n\t\tconst children = this.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tconst child = children[ i ];\n\n\t\t\tchild.updateMatrixWorld( force );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * An alternative version of {@link Object3D#updateMatrixWorld} with more control over the\n\t * update of ancestor and descendant nodes.\n\t *\n\t * @param {boolean} [updateParents=false] Whether ancestor nodes should be updated or not.\n\t * @param {boolean} [updateChildren=false] Whether descendant nodes should be updated or not.\n\t */\n\tupdateWorldMatrix( updateParents, updateChildren ) {\n\n\t\tconst parent = this.parent;\n\n\t\tif ( updateParents === true && parent !== null ) {\n\n\t\t\tparent.updateWorldMatrix( true, false );\n\n\t\t}\n\n\t\tif ( this.matrixAutoUpdate ) this.updateMatrix();\n\n\t\tif ( this.matrixWorldAutoUpdate === true ) {\n\n\t\t\tif ( this.parent === null ) {\n\n\t\t\t\tthis.matrixWorld.copy( this.matrix );\n\n\t\t\t} else {\n\n\t\t\t\tthis.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// make sure descendants are updated\n\n\t\tif ( updateChildren === true ) {\n\n\t\t\tconst children = this.children;\n\n\t\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tconst child = children[ i ];\n\n\t\t\t\tchild.updateWorldMatrix( false, true );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Serializes the 3D object into JSON.\n\t *\n\t * @param {?(Object|string)} meta - An optional value holding meta information about the serialization.\n\t * @return {Object} A JSON object representing the serialized 3D object.\n\t * @see {@link ObjectLoader#parse}\n\t */\n\ttoJSON( meta ) {\n\n\t\t// meta is a string when called from JSON.stringify\n\t\tconst isRootObject = ( meta === undefined || typeof meta === 'string' );\n\n\t\tconst output = {};\n\n\t\t// meta is a hash used to collect geometries, materials.\n\t\t// not providing it implies that this is the root object\n\t\t// being serialized.\n\t\tif ( isRootObject ) {\n\n\t\t\t// initialize meta obj\n\t\t\tmeta = {\n\t\t\t\tgeometries: {},\n\t\t\t\tmaterials: {},\n\t\t\t\ttextures: {},\n\t\t\t\timages: {},\n\t\t\t\tshapes: {},\n\t\t\t\tskeletons: {},\n\t\t\t\tanimations: {},\n\t\t\t\tnodes: {}\n\t\t\t};\n\n\t\t\toutput.metadata = {\n\t\t\t\tversion: 4.7,\n\t\t\t\ttype: 'Object',\n\t\t\t\tgenerator: 'Object3D.toJSON'\n\t\t\t};\n\n\t\t}\n\n\t\t// standard Object3D serialization\n\n\t\tconst object = {};\n\n\t\tobject.uuid = this.uuid;\n\t\tobject.type = this.type;\n\n\t\tif ( this.name !== '' ) object.name = this.name;\n\t\tif ( this.castShadow === true ) object.castShadow = true;\n\t\tif ( this.receiveShadow === true ) object.receiveShadow = true;\n\t\tif ( this.visible === false ) object.visible = false;\n\t\tif ( this.frustumCulled === false ) object.frustumCulled = false;\n\t\tif ( this.renderOrder !== 0 ) object.renderOrder = this.renderOrder;\n\t\tif ( Object.keys( this.userData ).length > 0 ) object.userData = this.userData;\n\n\t\tobject.layers = this.layers.mask;\n\t\tobject.matrix = this.matrix.toArray();\n\t\tobject.up = this.up.toArray();\n\n\t\tif ( this.matrixAutoUpdate === false ) object.matrixAutoUpdate = false;\n\n\t\t// object specific properties\n\n\t\tif ( this.isInstancedMesh ) {\n\n\t\t\tobject.type = 'InstancedMesh';\n\t\t\tobject.count = this.count;\n\t\t\tobject.instanceMatrix = this.instanceMatrix.toJSON();\n\t\t\tif ( this.instanceColor !== null ) object.instanceColor = this.instanceColor.toJSON();\n\n\t\t}\n\n\t\tif ( this.isBatchedMesh ) {\n\n\t\t\tobject.type = 'BatchedMesh';\n\t\t\tobject.perObjectFrustumCulled = this.perObjectFrustumCulled;\n\t\t\tobject.sortObjects = this.sortObjects;\n\n\t\t\tobject.drawRanges = this._drawRanges;\n\t\t\tobject.reservedRanges = this._reservedRanges;\n\n\t\t\tobject.geometryInfo = this._geometryInfo.map( info => ( {\n\t\t\t\t...info,\n\t\t\t\tboundingBox: info.boundingBox ? info.boundingBox.toJSON() : undefined,\n\t\t\t\tboundingSphere: info.boundingSphere ? info.boundingSphere.toJSON() : undefined\n\t\t\t} ) );\n\t\t\tobject.instanceInfo = this._instanceInfo.map( info => ( { ...info } ) );\n\n\t\t\tobject.availableInstanceIds = this._availableInstanceIds.slice();\n\t\t\tobject.availableGeometryIds = this._availableGeometryIds.slice();\n\n\t\t\tobject.nextIndexStart = this._nextIndexStart;\n\t\t\tobject.nextVertexStart = this._nextVertexStart;\n\t\t\tobject.geometryCount = this._geometryCount;\n\n\t\t\tobject.maxInstanceCount = this._maxInstanceCount;\n\t\t\tobject.maxVertexCount = this._maxVertexCount;\n\t\t\tobject.maxIndexCount = this._maxIndexCount;\n\n\t\t\tobject.geometryInitialized = this._geometryInitialized;\n\n\t\t\tobject.matricesTexture = this._matricesTexture.toJSON( meta );\n\n\t\t\tobject.indirectTexture = this._indirectTexture.toJSON( meta );\n\n\t\t\tif ( this._colorsTexture !== null ) {\n\n\t\t\t\tobject.colorsTexture = this._colorsTexture.toJSON( meta );\n\n\t\t\t}\n\n\t\t\tif ( this.boundingSphere !== null ) {\n\n\t\t\t\tobject.boundingSphere = this.boundingSphere.toJSON();\n\n\t\t\t}\n\n\t\t\tif ( this.boundingBox !== null ) {\n\n\t\t\t\tobject.boundingBox = this.boundingBox.toJSON();\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tfunction serialize( library, element ) {\n\n\t\t\tif ( library[ element.uuid ] === undefined ) {\n\n\t\t\t\tlibrary[ element.uuid ] = element.toJSON( meta );\n\n\t\t\t}\n\n\t\t\treturn element.uuid;\n\n\t\t}\n\n\t\tif ( this.isScene ) {\n\n\t\t\tif ( this.background ) {\n\n\t\t\t\tif ( this.background.isColor ) {\n\n\t\t\t\t\tobject.background = this.background.toJSON();\n\n\t\t\t\t} else if ( this.background.isTexture ) {\n\n\t\t\t\t\tobject.background = this.background.toJSON( meta ).uuid;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.environment && this.environment.isTexture && this.environment.isRenderTargetTexture !== true ) {\n\n\t\t\t\tobject.environment = this.environment.toJSON( meta ).uuid;\n\n\t\t\t}\n\n\t\t} else if ( this.isMesh || this.isLine || this.isPoints ) {\n\n\t\t\tobject.geometry = serialize( meta.geometries, this.geometry );\n\n\t\t\tconst parameters = this.geometry.parameters;\n\n\t\t\tif ( parameters !== undefined && parameters.shapes !== undefined ) {\n\n\t\t\t\tconst shapes = parameters.shapes;\n\n\t\t\t\tif ( Array.isArray( shapes ) ) {\n\n\t\t\t\t\tfor ( let i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tconst shape = shapes[ i ];\n\n\t\t\t\t\t\tserialize( meta.shapes, shape );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tserialize( meta.shapes, shapes );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.isSkinnedMesh ) {\n\n\t\t\tobject.bindMode = this.bindMode;\n\t\t\tobject.bindMatrix = this.bindMatrix.toArray();\n\n\t\t\tif ( this.skeleton !== undefined ) {\n\n\t\t\t\tserialize( meta.skeletons, this.skeleton );\n\n\t\t\t\tobject.skeleton = this.skeleton.uuid;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.material !== undefined ) {\n\n\t\t\tif ( Array.isArray( this.material ) ) {\n\n\t\t\t\tconst uuids = [];\n\n\t\t\t\tfor ( let i = 0, l = this.material.length; i < l; i ++ ) {\n\n\t\t\t\t\tuuids.push( serialize( meta.materials, this.material[ i ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tobject.material = uuids;\n\n\t\t\t} else {\n\n\t\t\t\tobject.material = serialize( meta.materials, this.material );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tif ( this.children.length > 0 ) {\n\n\t\t\tobject.children = [];\n\n\t\t\tfor ( let i = 0; i < this.children.length; i ++ ) {\n\n\t\t\t\tobject.children.push( this.children[ i ].toJSON( meta ).object );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tif ( this.animations.length > 0 ) {\n\n\t\t\tobject.animations = [];\n\n\t\t\tfor ( let i = 0; i < this.animations.length; i ++ ) {\n\n\t\t\t\tconst animation = this.animations[ i ];\n\n\t\t\t\tobject.animations.push( serialize( meta.animations, animation ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( isRootObject ) {\n\n\t\t\tconst geometries = extractFromCache( meta.geometries );\n\t\t\tconst materials = extractFromCache( meta.materials );\n\t\t\tconst textures = extractFromCache( meta.textures );\n\t\t\tconst images = extractFromCache( meta.images );\n\t\t\tconst shapes = extractFromCache( meta.shapes );\n\t\t\tconst skeletons = extractFromCache( meta.skeletons );\n\t\t\tconst animations = extractFromCache( meta.animations );\n\t\t\tconst nodes = extractFromCache( meta.nodes );\n\n\t\t\tif ( geometries.length > 0 ) output.geometries = geometries;\n\t\t\tif ( materials.length > 0 ) output.materials = materials;\n\t\t\tif ( textures.length > 0 ) output.textures = textures;\n\t\t\tif ( images.length > 0 ) output.images = images;\n\t\t\tif ( shapes.length > 0 ) output.shapes = shapes;\n\t\t\tif ( skeletons.length > 0 ) output.skeletons = skeletons;\n\t\t\tif ( animations.length > 0 ) output.animations = animations;\n\t\t\tif ( nodes.length > 0 ) output.nodes = nodes;\n\n\t\t}\n\n\t\toutput.object = object;\n\n\t\treturn output;\n\n\t\t// extract data from the cache hash\n\t\t// remove metadata on each item\n\t\t// and return as array\n\t\tfunction extractFromCache( cache ) {\n\n\t\t\tconst values = [];\n\t\t\tfor ( const key in cache ) {\n\n\t\t\t\tconst data = cache[ key ];\n\t\t\t\tdelete data.metadata;\n\t\t\t\tvalues.push( data );\n\n\t\t\t}\n\n\t\t\treturn values;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns a new 3D object with copied values from this instance.\n\t *\n\t * @param {boolean} [recursive=true] - When set to `true`, descendants of the 3D object are also cloned.\n\t * @return {Object3D} A clone of this instance.\n\t */\n\tclone( recursive ) {\n\n\t\treturn new this.constructor().copy( this, recursive );\n\n\t}\n\n\t/**\n\t * Copies the values of the given 3D object to this instance.\n\t *\n\t * @param {Object3D} source - The 3D object to copy.\n\t * @param {boolean} [recursive=true] - When set to `true`, descendants of the 3D object are cloned.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\tcopy( source, recursive = true ) {\n\n\t\tthis.name = source.name;\n\n\t\tthis.up.copy( source.up );\n\n\t\tthis.position.copy( source.position );\n\t\tthis.rotation.order = source.rotation.order;\n\t\tthis.quaternion.copy( source.quaternion );\n\t\tthis.scale.copy( source.scale );\n\n\t\tthis.matrix.copy( source.matrix );\n\t\tthis.matrixWorld.copy( source.matrixWorld );\n\n\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\n\t\tthis.matrixWorldAutoUpdate = source.matrixWorldAutoUpdate;\n\t\tthis.matrixWorldNeedsUpdate = source.matrixWorldNeedsUpdate;\n\n\t\tthis.layers.mask = source.layers.mask;\n\t\tthis.visible = source.visible;\n\n\t\tthis.castShadow = source.castShadow;\n\t\tthis.receiveShadow = source.receiveShadow;\n\n\t\tthis.frustumCulled = source.frustumCulled;\n\t\tthis.renderOrder = source.renderOrder;\n\n\t\tthis.animations = source.animations.slice();\n\n\t\tthis.userData = JSON.parse( JSON.stringify( source.userData ) );\n\n\t\tif ( recursive === true ) {\n\n\t\t\tfor ( let i = 0; i < source.children.length; i ++ ) {\n\n\t\t\t\tconst child = source.children[ i ];\n\t\t\t\tthis.add( child.clone() );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * The default up direction for objects, also used as the default\n * position for {@link DirectionalLight} and {@link HemisphereLight}.\n *\n * @static\n * @type {Vector3}\n * @default (0,1,0)\n */\nObject3D.DEFAULT_UP = /*@__PURE__*/ new Vector3( 0, 1, 0 );\n\n/**\n * The default setting for {@link Object3D#matrixAutoUpdate} for\n * newly created 3D objects.\n *\n * @static\n * @type {boolean}\n * @default true\n */\nObject3D.DEFAULT_MATRIX_AUTO_UPDATE = true;\n\n/**\n * The default setting for {@link Object3D#matrixWorldAutoUpdate} for\n * newly created 3D objects.\n *\n * @static\n * @type {boolean}\n * @default true\n */\nObject3D.DEFAULT_MATRIX_WORLD_AUTO_UPDATE = true;\n\nconst _v0$2 = /*@__PURE__*/ new Vector3();\nconst _v1$3 = /*@__PURE__*/ new Vector3();\nconst _v2$2 = /*@__PURE__*/ new Vector3();\nconst _v3$2 = /*@__PURE__*/ new Vector3();\n\nconst _vab = /*@__PURE__*/ new Vector3();\nconst _vac = /*@__PURE__*/ new Vector3();\nconst _vbc = /*@__PURE__*/ new Vector3();\nconst _vap = /*@__PURE__*/ new Vector3();\nconst _vbp = /*@__PURE__*/ new Vector3();\nconst _vcp = /*@__PURE__*/ new Vector3();\n\nconst _v40 = /*@__PURE__*/ new Vector4();\nconst _v41 = /*@__PURE__*/ new Vector4();\nconst _v42 = /*@__PURE__*/ new Vector4();\n\n/**\n * A geometric triangle as defined by three vectors representing its three corners.\n */\nclass Triangle {\n\n\t/**\n\t * Constructs a new triangle.\n\t *\n\t * @param {Vector3} [a=(0,0,0)] - The first corner of the triangle.\n\t * @param {Vector3} [b=(0,0,0)] - The second corner of the triangle.\n\t * @param {Vector3} [c=(0,0,0)] - The third corner of the triangle.\n\t */\n\tconstructor( a = new Vector3(), b = new Vector3(), c = new Vector3() ) {\n\n\t\t/**\n\t\t * The first corner of the triangle.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.a = a;\n\n\t\t/**\n\t\t * The second corner of the triangle.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.b = b;\n\n\t\t/**\n\t\t * The third corner of the triangle.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.c = c;\n\n\t}\n\n\t/**\n\t * Computes the normal vector of a triangle.\n\t *\n\t * @param {Vector3} a - The first corner of the triangle.\n\t * @param {Vector3} b - The second corner of the triangle.\n\t * @param {Vector3} c - The third corner of the triangle.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The triangle's normal.\n\t */\n\tstatic getNormal( a, b, c, target ) {\n\n\t\ttarget.subVectors( c, b );\n\t\t_v0$2.subVectors( a, b );\n\t\ttarget.cross( _v0$2 );\n\n\t\tconst targetLengthSq = target.lengthSq();\n\t\tif ( targetLengthSq > 0 ) {\n\n\t\t\treturn target.multiplyScalar( 1 / Math.sqrt( targetLengthSq ) );\n\n\t\t}\n\n\t\treturn target.set( 0, 0, 0 );\n\n\t}\n\n\t/**\n\t * Computes a barycentric coordinates from the given vector.\n\t * Returns `null` if the triangle is degenerate.\n\t *\n\t * @param {Vector3} point - A point in 3D space.\n\t * @param {Vector3} a - The first corner of the triangle.\n\t * @param {Vector3} b - The second corner of the triangle.\n\t * @param {Vector3} c - The third corner of the triangle.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {?Vector3} The barycentric coordinates for the given point\n\t */\n\tstatic getBarycoord( point, a, b, c, target ) {\n\n\t\t// based on: http://www.blackpawn.com/texts/pointinpoly/default.html\n\n\t\t_v0$2.subVectors( c, a );\n\t\t_v1$3.subVectors( b, a );\n\t\t_v2$2.subVectors( point, a );\n\n\t\tconst dot00 = _v0$2.dot( _v0$2 );\n\t\tconst dot01 = _v0$2.dot( _v1$3 );\n\t\tconst dot02 = _v0$2.dot( _v2$2 );\n\t\tconst dot11 = _v1$3.dot( _v1$3 );\n\t\tconst dot12 = _v1$3.dot( _v2$2 );\n\n\t\tconst denom = ( dot00 * dot11 - dot01 * dot01 );\n\n\t\t// collinear or singular triangle\n\t\tif ( denom === 0 ) {\n\n\t\t\ttarget.set( 0, 0, 0 );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst invDenom = 1 / denom;\n\t\tconst u = ( dot11 * dot02 - dot01 * dot12 ) * invDenom;\n\t\tconst v = ( dot00 * dot12 - dot01 * dot02 ) * invDenom;\n\n\t\t// barycentric coordinates must always sum to 1\n\t\treturn target.set( 1 - u - v, v, u );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given point, when projected onto the plane of the\n\t * triangle, lies within the triangle.\n\t *\n\t * @param {Vector3} point - The point in 3D space to test.\n\t * @param {Vector3} a - The first corner of the triangle.\n\t * @param {Vector3} b - The second corner of the triangle.\n\t * @param {Vector3} c - The third corner of the triangle.\n\t * @return {boolean} Whether the given point, when projected onto the plane of the\n\t * triangle, lies within the triangle or not.\n\t */\n\tstatic containsPoint( point, a, b, c ) {\n\n\t\t// if the triangle is degenerate then we can't contain a point\n\t\tif ( this.getBarycoord( point, a, b, c, _v3$2 ) === null ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\treturn ( _v3$2.x >= 0 ) && ( _v3$2.y >= 0 ) && ( ( _v3$2.x + _v3$2.y ) <= 1 );\n\n\t}\n\n\t/**\n\t * Computes the value barycentrically interpolated for the given point on the\n\t * triangle. Returns `null` if the triangle is degenerate.\n\t *\n\t * @param {Vector3} point - Position of interpolated point.\n\t * @param {Vector3} p1 - The first corner of the triangle.\n\t * @param {Vector3} p2 - The second corner of the triangle.\n\t * @param {Vector3} p3 - The third corner of the triangle.\n\t * @param {Vector3} v1 - Value to interpolate of first vertex.\n\t * @param {Vector3} v2 - Value to interpolate of second vertex.\n\t * @param {Vector3} v3 - Value to interpolate of third vertex.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {?Vector3} The interpolated value.\n\t */\n\tstatic getInterpolation( point, p1, p2, p3, v1, v2, v3, target ) {\n\n\t\tif ( this.getBarycoord( point, p1, p2, p3, _v3$2 ) === null ) {\n\n\t\t\ttarget.x = 0;\n\t\t\ttarget.y = 0;\n\t\t\tif ( 'z' in target ) target.z = 0;\n\t\t\tif ( 'w' in target ) target.w = 0;\n\t\t\treturn null;\n\n\t\t}\n\n\t\ttarget.setScalar( 0 );\n\t\ttarget.addScaledVector( v1, _v3$2.x );\n\t\ttarget.addScaledVector( v2, _v3$2.y );\n\t\ttarget.addScaledVector( v3, _v3$2.z );\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Computes the value barycentrically interpolated for the given attribute and indices.\n\t *\n\t * @param {BufferAttribute} attr - The attribute to interpolate.\n\t * @param {number} i1 - Index of first vertex.\n\t * @param {number} i2 - Index of second vertex.\n\t * @param {number} i3 - Index of third vertex.\n\t * @param {Vector3} barycoord - The barycoordinate value to use to interpolate.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The interpolated attribute value.\n\t */\n\tstatic getInterpolatedAttribute( attr, i1, i2, i3, barycoord, target ) {\n\n\t\t_v40.setScalar( 0 );\n\t\t_v41.setScalar( 0 );\n\t\t_v42.setScalar( 0 );\n\n\t\t_v40.fromBufferAttribute( attr, i1 );\n\t\t_v41.fromBufferAttribute( attr, i2 );\n\t\t_v42.fromBufferAttribute( attr, i3 );\n\n\t\ttarget.setScalar( 0 );\n\t\ttarget.addScaledVector( _v40, barycoord.x );\n\t\ttarget.addScaledVector( _v41, barycoord.y );\n\t\ttarget.addScaledVector( _v42, barycoord.z );\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Returns `true` if the triangle is oriented towards the given direction.\n\t *\n\t * @param {Vector3} a - The first corner of the triangle.\n\t * @param {Vector3} b - The second corner of the triangle.\n\t * @param {Vector3} c - The third corner of the triangle.\n\t * @param {Vector3} direction - The (normalized) direction vector.\n\t * @return {boolean} Whether the triangle is oriented towards the given direction or not.\n\t */\n\tstatic isFrontFacing( a, b, c, direction ) {\n\n\t\t_v0$2.subVectors( c, b );\n\t\t_v1$3.subVectors( a, b );\n\n\t\t// strictly front facing\n\t\treturn ( _v0$2.cross( _v1$3 ).dot( direction ) < 0 ) ? true : false;\n\n\t}\n\n\t/**\n\t * Sets the triangle's vertices by copying the given values.\n\t *\n\t * @param {Vector3} a - The first corner of the triangle.\n\t * @param {Vector3} b - The second corner of the triangle.\n\t * @param {Vector3} c - The third corner of the triangle.\n\t * @return {Triangle} A reference to this triangle.\n\t */\n\tset( a, b, c ) {\n\n\t\tthis.a.copy( a );\n\t\tthis.b.copy( b );\n\t\tthis.c.copy( c );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the triangle's vertices by copying the given array values.\n\t *\n\t * @param {Array<Vector3>} points - An array with 3D points.\n\t * @param {number} i0 - The array index representing the first corner of the triangle.\n\t * @param {number} i1 - The array index representing the second corner of the triangle.\n\t * @param {number} i2 - The array index representing the third corner of the triangle.\n\t * @return {Triangle} A reference to this triangle.\n\t */\n\tsetFromPointsAndIndices( points, i0, i1, i2 ) {\n\n\t\tthis.a.copy( points[ i0 ] );\n\t\tthis.b.copy( points[ i1 ] );\n\t\tthis.c.copy( points[ i2 ] );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the triangle's vertices by copying the given attribute values.\n\t *\n\t * @param {BufferAttribute} attribute - A buffer attribute with 3D points data.\n\t * @param {number} i0 - The attribute index representing the first corner of the triangle.\n\t * @param {number} i1 - The attribute index representing the second corner of the triangle.\n\t * @param {number} i2 - The attribute index representing the third corner of the triangle.\n\t * @return {Triangle} A reference to this triangle.\n\t */\n\tsetFromAttributeAndIndices( attribute, i0, i1, i2 ) {\n\n\t\tthis.a.fromBufferAttribute( attribute, i0 );\n\t\tthis.b.fromBufferAttribute( attribute, i1 );\n\t\tthis.c.fromBufferAttribute( attribute, i2 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new triangle with copied values from this instance.\n\t *\n\t * @return {Triangle} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Copies the values of the given triangle to this instance.\n\t *\n\t * @param {Triangle} triangle - The triangle to copy.\n\t * @return {Triangle} A reference to this triangle.\n\t */\n\tcopy( triangle ) {\n\n\t\tthis.a.copy( triangle.a );\n\t\tthis.b.copy( triangle.b );\n\t\tthis.c.copy( triangle.c );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes the area of the triangle.\n\t *\n\t * @return {number} The triangle's area.\n\t */\n\tgetArea() {\n\n\t\t_v0$2.subVectors( this.c, this.b );\n\t\t_v1$3.subVectors( this.a, this.b );\n\n\t\treturn _v0$2.cross( _v1$3 ).length() * 0.5;\n\n\t}\n\n\t/**\n\t * Computes the midpoint of the triangle.\n\t *\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The triangle's midpoint.\n\t */\n\tgetMidpoint( target ) {\n\n\t\treturn target.addVectors( this.a, this.b ).add( this.c ).multiplyScalar( 1 / 3 );\n\n\t}\n\n\t/**\n\t * Computes the normal of the triangle.\n\t *\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The triangle's normal.\n\t */\n\tgetNormal( target ) {\n\n\t\treturn Triangle.getNormal( this.a, this.b, this.c, target );\n\n\t}\n\n\t/**\n\t * Computes a plane the triangle lies within.\n\t *\n\t * @param {Plane} target - The target vector that is used to store the method's result.\n\t * @return {Plane} The plane the triangle lies within.\n\t */\n\tgetPlane( target ) {\n\n\t\treturn target.setFromCoplanarPoints( this.a, this.b, this.c );\n\n\t}\n\n\t/**\n\t * Computes a barycentric coordinates from the given vector.\n\t * Returns `null` if the triangle is degenerate.\n\t *\n\t * @param {Vector3} point - A point in 3D space.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {?Vector3} The barycentric coordinates for the given point\n\t */\n\tgetBarycoord( point, target ) {\n\n\t\treturn Triangle.getBarycoord( point, this.a, this.b, this.c, target );\n\n\t}\n\n\t/**\n\t * Computes the value barycentrically interpolated for the given point on the\n\t * triangle. Returns `null` if the triangle is degenerate.\n\t *\n\t * @param {Vector3} point - Position of interpolated point.\n\t * @param {Vector3} v1 - Value to interpolate of first vertex.\n\t * @param {Vector3} v2 - Value to interpolate of second vertex.\n\t * @param {Vector3} v3 - Value to interpolate of third vertex.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {?Vector3} The interpolated value.\n\t */\n\tgetInterpolation( point, v1, v2, v3, target ) {\n\n\t\treturn Triangle.getInterpolation( point, this.a, this.b, this.c, v1, v2, v3, target );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given point, when projected onto the plane of the\n\t * triangle, lies within the triangle.\n\t *\n\t * @param {Vector3} point - The point in 3D space to test.\n\t * @return {boolean} Whether the given point, when projected onto the plane of the\n\t * triangle, lies within the triangle or not.\n\t */\n\tcontainsPoint( point ) {\n\n\t\treturn Triangle.containsPoint( point, this.a, this.b, this.c );\n\n\t}\n\n\t/**\n\t * Returns `true` if the triangle is oriented towards the given direction.\n\t *\n\t * @param {Vector3} direction - The (normalized) direction vector.\n\t * @return {boolean} Whether the triangle is oriented towards the given direction or not.\n\t */\n\tisFrontFacing( direction ) {\n\n\t\treturn Triangle.isFrontFacing( this.a, this.b, this.c, direction );\n\n\t}\n\n\t/**\n\t * Returns `true` if this triangle intersects with the given box.\n\t *\n\t * @param {Box3} box - The box to intersect.\n\t * @return {boolean} Whether this triangle intersects with the given box or not.\n\t */\n\tintersectsBox( box ) {\n\n\t\treturn box.intersectsTriangle( this );\n\n\t}\n\n\t/**\n\t * Returns the closest point on the triangle to the given point.\n\t *\n\t * @param {Vector3} p - The point to compute the closest point for.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The closest point on the triangle.\n\t */\n\tclosestPointToPoint( p, target ) {\n\n\t\tconst a = this.a, b = this.b, c = this.c;\n\t\tlet v, w;\n\n\t\t// algorithm thanks to Real-Time Collision Detection by Christer Ericson,\n\t\t// published by Morgan Kaufmann Publishers, (c) 2005 Elsevier Inc.,\n\t\t// under the accompanying license; see chapter 5.1.5 for detailed explanation.\n\t\t// basically, we're distinguishing which of the voronoi regions of the triangle\n\t\t// the point lies in with the minimum amount of redundant computation.\n\n\t\t_vab.subVectors( b, a );\n\t\t_vac.subVectors( c, a );\n\t\t_vap.subVectors( p, a );\n\t\tconst d1 = _vab.dot( _vap );\n\t\tconst d2 = _vac.dot( _vap );\n\t\tif ( d1 <= 0 && d2 <= 0 ) {\n\n\t\t\t// vertex region of A; barycentric coords (1, 0, 0)\n\t\t\treturn target.copy( a );\n\n\t\t}\n\n\t\t_vbp.subVectors( p, b );\n\t\tconst d3 = _vab.dot( _vbp );\n\t\tconst d4 = _vac.dot( _vbp );\n\t\tif ( d3 >= 0 && d4 <= d3 ) {\n\n\t\t\t// vertex region of B; barycentric coords (0, 1, 0)\n\t\t\treturn target.copy( b );\n\n\t\t}\n\n\t\tconst vc = d1 * d4 - d3 * d2;\n\t\tif ( vc <= 0 && d1 >= 0 && d3 <= 0 ) {\n\n\t\t\tv = d1 / ( d1 - d3 );\n\t\t\t// edge region of AB; barycentric coords (1-v, v, 0)\n\t\t\treturn target.copy( a ).addScaledVector( _vab, v );\n\n\t\t}\n\n\t\t_vcp.subVectors( p, c );\n\t\tconst d5 = _vab.dot( _vcp );\n\t\tconst d6 = _vac.dot( _vcp );\n\t\tif ( d6 >= 0 && d5 <= d6 ) {\n\n\t\t\t// vertex region of C; barycentric coords (0, 0, 1)\n\t\t\treturn target.copy( c );\n\n\t\t}\n\n\t\tconst vb = d5 * d2 - d1 * d6;\n\t\tif ( vb <= 0 && d2 >= 0 && d6 <= 0 ) {\n\n\t\t\tw = d2 / ( d2 - d6 );\n\t\t\t// edge region of AC; barycentric coords (1-w, 0, w)\n\t\t\treturn target.copy( a ).addScaledVector( _vac, w );\n\n\t\t}\n\n\t\tconst va = d3 * d6 - d5 * d4;\n\t\tif ( va <= 0 && ( d4 - d3 ) >= 0 && ( d5 - d6 ) >= 0 ) {\n\n\t\t\t_vbc.subVectors( c, b );\n\t\t\tw = ( d4 - d3 ) / ( ( d4 - d3 ) + ( d5 - d6 ) );\n\t\t\t// edge region of BC; barycentric coords (0, 1-w, w)\n\t\t\treturn target.copy( b ).addScaledVector( _vbc, w ); // edge region of BC\n\n\t\t}\n\n\t\t// face region\n\t\tconst denom = 1 / ( va + vb + vc );\n\t\t// u = va * denom\n\t\tv = vb * denom;\n\t\tw = vc * denom;\n\n\t\treturn target.copy( a ).addScaledVector( _vab, v ).addScaledVector( _vac, w );\n\n\t}\n\n\t/**\n\t * Returns `true` if this triangle is equal with the given one.\n\t *\n\t * @param {Triangle} triangle - The triangle to test for equality.\n\t * @return {boolean} Whether this triangle is equal with the given one.\n\t */\n\tequals( triangle ) {\n\n\t\treturn triangle.a.equals( this.a ) && triangle.b.equals( this.b ) && triangle.c.equals( this.c );\n\n\t}\n\n}\n\nconst _colorKeywords = { 'aliceblue': 0xF0F8FF, 'antiquewhite': 0xFAEBD7, 'aqua': 0x00FFFF, 'aquamarine': 0x7FFFD4, 'azure': 0xF0FFFF,\n\t'beige': 0xF5F5DC, 'bisque': 0xFFE4C4, 'black': 0x000000, 'blanchedalmond': 0xFFEBCD, 'blue': 0x0000FF, 'blueviolet': 0x8A2BE2,\n\t'brown': 0xA52A2A, 'burlywood': 0xDEB887, 'cadetblue': 0x5F9EA0, 'chartreuse': 0x7FFF00, 'chocolate': 0xD2691E, 'coral': 0xFF7F50,\n\t'cornflowerblue': 0x6495ED, 'cornsilk': 0xFFF8DC, 'crimson': 0xDC143C, 'cyan': 0x00FFFF, 'darkblue': 0x00008B, 'darkcyan': 0x008B8B,\n\t'darkgoldenrod': 0xB8860B, 'darkgray': 0xA9A9A9, 'darkgreen': 0x006400, 'darkgrey': 0xA9A9A9, 'darkkhaki': 0xBDB76B, 'darkmagenta': 0x8B008B,\n\t'darkolivegreen': 0x556B2F, 'darkorange': 0xFF8C00, 'darkorchid': 0x9932CC, 'darkred': 0x8B0000, 'darksalmon': 0xE9967A, 'darkseagreen': 0x8FBC8F,\n\t'darkslateblue': 0x483D8B, 'darkslategray': 0x2F4F4F, 'darkslategrey': 0x2F4F4F, 'darkturquoise': 0x00CED1, 'darkviolet': 0x9400D3,\n\t'deeppink': 0xFF1493, 'deepskyblue': 0x00BFFF, 'dimgray': 0x696969, 'dimgrey': 0x696969, 'dodgerblue': 0x1E90FF, 'firebrick': 0xB22222,\n\t'floralwhite': 0xFFFAF0, 'forestgreen': 0x228B22, 'fuchsia': 0xFF00FF, 'gainsboro': 0xDCDCDC, 'ghostwhite': 0xF8F8FF, 'gold': 0xFFD700,\n\t'goldenrod': 0xDAA520, 'gray': 0x808080, 'green': 0x008000, 'greenyellow': 0xADFF2F, 'grey': 0x808080, 'honeydew': 0xF0FFF0, 'hotpink': 0xFF69B4,\n\t'indianred': 0xCD5C5C, 'indigo': 0x4B0082, 'ivory': 0xFFFFF0, 'khaki': 0xF0E68C, 'lavender': 0xE6E6FA, 'lavenderblush': 0xFFF0F5, 'lawngreen': 0x7CFC00,\n\t'lemonchiffon': 0xFFFACD, 'lightblue': 0xADD8E6, 'lightcoral': 0xF08080, 'lightcyan': 0xE0FFFF, 'lightgoldenrodyellow': 0xFAFAD2, 'lightgray': 0xD3D3D3,\n\t'lightgreen': 0x90EE90, 'lightgrey': 0xD3D3D3, 'lightpink': 0xFFB6C1, 'lightsalmon': 0xFFA07A, 'lightseagreen': 0x20B2AA, 'lightskyblue': 0x87CEFA,\n\t'lightslategray': 0x778899, 'lightslategrey': 0x778899, 'lightsteelblue': 0xB0C4DE, 'lightyellow': 0xFFFFE0, 'lime': 0x00FF00, 'limegreen': 0x32CD32,\n\t'linen': 0xFAF0E6, 'magenta': 0xFF00FF, 'maroon': 0x800000, 'mediumaquamarine': 0x66CDAA, 'mediumblue': 0x0000CD, 'mediumorchid': 0xBA55D3,\n\t'mediumpurple': 0x9370DB, 'mediumseagreen': 0x3CB371, 'mediumslateblue': 0x7B68EE, 'mediumspringgreen': 0x00FA9A, 'mediumturquoise': 0x48D1CC,\n\t'mediumvioletred': 0xC71585, 'midnightblue': 0x191970, 'mintcream': 0xF5FFFA, 'mistyrose': 0xFFE4E1, 'moccasin': 0xFFE4B5, 'navajowhite': 0xFFDEAD,\n\t'navy': 0x000080, 'oldlace': 0xFDF5E6, 'olive': 0x808000, 'olivedrab': 0x6B8E23, 'orange': 0xFFA500, 'orangered': 0xFF4500, 'orchid': 0xDA70D6,\n\t'palegoldenrod': 0xEEE8AA, 'palegreen': 0x98FB98, 'paleturquoise': 0xAFEEEE, 'palevioletred': 0xDB7093, 'papayawhip': 0xFFEFD5, 'peachpuff': 0xFFDAB9,\n\t'peru': 0xCD853F, 'pink': 0xFFC0CB, 'plum': 0xDDA0DD, 'powderblue': 0xB0E0E6, 'purple': 0x800080, 'rebeccapurple': 0x663399, 'red': 0xFF0000, 'rosybrown': 0xBC8F8F,\n\t'royalblue': 0x4169E1, 'saddlebrown': 0x8B4513, 'salmon': 0xFA8072, 'sandybrown': 0xF4A460, 'seagreen': 0x2E8B57, 'seashell': 0xFFF5EE,\n\t'sienna': 0xA0522D, 'silver': 0xC0C0C0, 'skyblue': 0x87CEEB, 'slateblue': 0x6A5ACD, 'slategray': 0x708090, 'slategrey': 0x708090, 'snow': 0xFFFAFA,\n\t'springgreen': 0x00FF7F, 'steelblue': 0x4682B4, 'tan': 0xD2B48C, 'teal': 0x008080, 'thistle': 0xD8BFD8, 'tomato': 0xFF6347, 'turquoise': 0x40E0D0,\n\t'violet': 0xEE82EE, 'wheat': 0xF5DEB3, 'white': 0xFFFFFF, 'whitesmoke': 0xF5F5F5, 'yellow': 0xFFFF00, 'yellowgreen': 0x9ACD32 };\n\nconst _hslA = { h: 0, s: 0, l: 0 };\nconst _hslB = { h: 0, s: 0, l: 0 };\n\nfunction hue2rgb( p, q, t ) {\n\n\tif ( t < 0 ) t += 1;\n\tif ( t > 1 ) t -= 1;\n\tif ( t < 1 / 6 ) return p + ( q - p ) * 6 * t;\n\tif ( t < 1 / 2 ) return q;\n\tif ( t < 2 / 3 ) return p + ( q - p ) * 6 * ( 2 / 3 - t );\n\treturn p;\n\n}\n\n/**\n * A Color instance is represented by RGB components in the linear <i>working\n * color space</i>, which defaults to `LinearSRGBColorSpace`. Inputs\n * conventionally using `SRGBColorSpace` (such as hexadecimals and CSS\n * strings) are converted to the working color space automatically.\n *\n * ```js\n * // converted automatically from SRGBColorSpace to LinearSRGBColorSpace\n * const color = new THREE.Color().setHex( 0x112233 );\n * ```\n * Source color spaces may be specified explicitly, to ensure correct conversions.\n * ```js\n * // assumed already LinearSRGBColorSpace; no conversion\n * const color = new THREE.Color().setRGB( 0.5, 0.5, 0.5 );\n *\n * // converted explicitly from SRGBColorSpace to LinearSRGBColorSpace\n * const color = new THREE.Color().setRGB( 0.5, 0.5, 0.5, SRGBColorSpace );\n * ```\n * If THREE.ColorManagement is disabled, no conversions occur. For details,\n * see <i>Color management</i>. Iterating through a Color instance will yield\n * its components (r, g, b) in the corresponding order. A Color can be initialised\n * in any of the following ways:\n * ```js\n * //empty constructor - will default white\n * const color1 = new THREE.Color();\n *\n * //Hexadecimal color (recommended)\n * const color2 = new THREE.Color( 0xff0000 );\n *\n * //RGB string\n * const color3 = new THREE.Color(\"rgb(255, 0, 0)\");\n * const color4 = new THREE.Color(\"rgb(100%, 0%, 0%)\");\n *\n * //X11 color name - all 140 color names are supported.\n * //Note the lack of CamelCase in the name\n * const color5 = new THREE.Color( 'skyblue' );\n * //HSL string\n * const color6 = new THREE.Color(\"hsl(0, 100%, 50%)\");\n *\n * //Separate RGB values between 0 and 1\n * const color7 = new THREE.Color( 1, 0, 0 );\n * ```\n */\nclass Color {\n\n\t/**\n\t * Constructs a new color.\n\t *\n\t * Note that standard method of specifying color in three.js is with a hexadecimal triplet,\n\t * and that method is used throughout the rest of the documentation.\n\t *\n\t * @param {(number|string|Color)} [r] - The red component of the color. If `g` and `b` are\n\t * not provided, it can be hexadecimal triplet, a CSS-style string or another `Color` instance.\n\t * @param {number} [g] - The green component.\n\t * @param {number} [b] - The blue component.\n\t */\n\tconstructor( r, g, b ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isColor = true;\n\n\t\t/**\n\t\t * The red component.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.r = 1;\n\n\t\t/**\n\t\t * The green component.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.g = 1;\n\n\t\t/**\n\t\t * The blue component.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.b = 1;\n\n\t\treturn this.set( r, g, b );\n\n\t}\n\n\t/**\n\t * Sets the colors's components from the given values.\n\t *\n\t * @param {(number|string|Color)} [r] - The red component of the color. If `g` and `b` are\n\t * not provided, it can be hexadecimal triplet, a CSS-style string or another `Color` instance.\n\t * @param {number} [g] - The green component.\n\t * @param {number} [b] - The blue component.\n\t * @return {Color} A reference to this color.\n\t */\n\tset( r, g, b ) {\n\n\t\tif ( g === undefined && b === undefined ) {\n\n\t\t\t// r is THREE.Color, hex or string\n\n\t\t\tconst value = r;\n\n\t\t\tif ( value && value.isColor ) {\n\n\t\t\t\tthis.copy( value );\n\n\t\t\t} else if ( typeof value === 'number' ) {\n\n\t\t\t\tthis.setHex( value );\n\n\t\t\t} else if ( typeof value === 'string' ) {\n\n\t\t\t\tthis.setStyle( value );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tthis.setRGB( r, g, b );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the colors's components to the given scalar value.\n\t *\n\t * @param {number} scalar - The scalar value.\n\t * @return {Color} A reference to this color.\n\t */\n\tsetScalar( scalar ) {\n\n\t\tthis.r = scalar;\n\t\tthis.g = scalar;\n\t\tthis.b = scalar;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this color from a hexadecimal value.\n\t *\n\t * @param {number} hex - The hexadecimal value.\n\t * @param {string} [colorSpace=SRGBColorSpace] - The color space.\n\t * @return {Color} A reference to this color.\n\t */\n\tsetHex( hex, colorSpace = SRGBColorSpace ) {\n\n\t\thex = Math.floor( hex );\n\n\t\tthis.r = ( hex >> 16 & 255 ) / 255;\n\t\tthis.g = ( hex >> 8 & 255 ) / 255;\n\t\tthis.b = ( hex & 255 ) / 255;\n\n\t\tColorManagement.colorSpaceToWorking( this, colorSpace );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this color from RGB values.\n\t *\n\t * @param {number} r - Red channel value between `0.0` and `1.0`.\n\t * @param {number} g - Green channel value between `0.0` and `1.0`.\n\t * @param {number} b - Blue channel value between `0.0` and `1.0`.\n\t * @param {string} [colorSpace=ColorManagement.workingColorSpace] - The color space.\n\t * @return {Color} A reference to this color.\n\t */\n\tsetRGB( r, g, b, colorSpace = ColorManagement.workingColorSpace ) {\n\n\t\tthis.r = r;\n\t\tthis.g = g;\n\t\tthis.b = b;\n\n\t\tColorManagement.colorSpaceToWorking( this, colorSpace );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this color from RGB values.\n\t *\n\t * @param {number} h - Hue value between `0.0` and `1.0`.\n\t * @param {number} s - Saturation value between `0.0` and `1.0`.\n\t * @param {number} l - Lightness value between `0.0` and `1.0`.\n\t * @param {string} [colorSpace=ColorManagement.workingColorSpace] - The color space.\n\t * @return {Color} A reference to this color.\n\t */\n\tsetHSL( h, s, l, colorSpace = ColorManagement.workingColorSpace ) {\n\n\t\t// h,s,l ranges are in 0.0 - 1.0\n\t\th = euclideanModulo( h, 1 );\n\t\ts = clamp( s, 0, 1 );\n\t\tl = clamp( l, 0, 1 );\n\n\t\tif ( s === 0 ) {\n\n\t\t\tthis.r = this.g = this.b = l;\n\n\t\t} else {\n\n\t\t\tconst p = l <= 0.5 ? l * ( 1 + s ) : l + s - ( l * s );\n\t\t\tconst q = ( 2 * l ) - p;\n\n\t\t\tthis.r = hue2rgb( q, p, h + 1 / 3 );\n\t\t\tthis.g = hue2rgb( q, p, h );\n\t\t\tthis.b = hue2rgb( q, p, h - 1 / 3 );\n\n\t\t}\n\n\t\tColorManagement.colorSpaceToWorking( this, colorSpace );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this color from a CSS-style string. For example, `rgb(250, 0,0)`,\n\t * `rgb(100%, 0%, 0%)`, `hsl(0, 100%, 50%)`, `#ff0000`, `#f00`, or `red` ( or\n\t * any [X11 color name](https://en.wikipedia.org/wiki/X11_color_names#Color_name_chart) -\n\t * all 140 color names are supported).\n\t *\n\t * @param {string} style - Color as a CSS-style string.\n\t * @param {string} [colorSpace=SRGBColorSpace] - The color space.\n\t * @return {Color} A reference to this color.\n\t */\n\tsetStyle( style, colorSpace = SRGBColorSpace ) {\n\n\t\tfunction handleAlpha( string ) {\n\n\t\t\tif ( string === undefined ) return;\n\n\t\t\tif ( parseFloat( string ) < 1 ) {\n\n\t\t\t\twarn( 'Color: Alpha component of ' + style + ' will be ignored.' );\n\n\t\t\t}\n\n\t\t}\n\n\n\t\tlet m;\n\n\t\tif ( m = /^(\\w+)\\(([^\\)]*)\\)/.exec( style ) ) {\n\n\t\t\t// rgb / hsl\n\n\t\t\tlet color;\n\t\t\tconst name = m[ 1 ];\n\t\t\tconst components = m[ 2 ];\n\n\t\t\tswitch ( name ) {\n\n\t\t\t\tcase 'rgb':\n\t\t\t\tcase 'rgba':\n\n\t\t\t\t\tif ( color = /^\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t// rgb(255,0,0) rgba(255,0,0,0.5)\n\n\t\t\t\t\t\thandleAlpha( color[ 4 ] );\n\n\t\t\t\t\t\treturn this.setRGB(\n\t\t\t\t\t\t\tMath.min( 255, parseInt( color[ 1 ], 10 ) ) / 255,\n\t\t\t\t\t\t\tMath.min( 255, parseInt( color[ 2 ], 10 ) ) / 255,\n\t\t\t\t\t\t\tMath.min( 255, parseInt( color[ 3 ], 10 ) ) / 255,\n\t\t\t\t\t\t\tcolorSpace\n\t\t\t\t\t\t);\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( color = /^\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t// rgb(100%,0%,0%) rgba(100%,0%,0%,0.5)\n\n\t\t\t\t\t\thandleAlpha( color[ 4 ] );\n\n\t\t\t\t\t\treturn this.setRGB(\n\t\t\t\t\t\t\tMath.min( 100, parseInt( color[ 1 ], 10 ) ) / 100,\n\t\t\t\t\t\t\tMath.min( 100, parseInt( color[ 2 ], 10 ) ) / 100,\n\t\t\t\t\t\t\tMath.min( 100, parseInt( color[ 3 ], 10 ) ) / 100,\n\t\t\t\t\t\t\tcolorSpace\n\t\t\t\t\t\t);\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'hsl':\n\t\t\t\tcase 'hsla':\n\n\t\t\t\t\tif ( color = /^\\s*(\\d*\\.?\\d+)\\s*,\\s*(\\d*\\.?\\d+)\\%\\s*,\\s*(\\d*\\.?\\d+)\\%\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t// hsl(120,50%,50%) hsla(120,50%,50%,0.5)\n\n\t\t\t\t\t\thandleAlpha( color[ 4 ] );\n\n\t\t\t\t\t\treturn this.setHSL(\n\t\t\t\t\t\t\tparseFloat( color[ 1 ] ) / 360,\n\t\t\t\t\t\t\tparseFloat( color[ 2 ] ) / 100,\n\t\t\t\t\t\t\tparseFloat( color[ 3 ] ) / 100,\n\t\t\t\t\t\t\tcolorSpace\n\t\t\t\t\t\t);\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\twarn( 'Color: Unknown color model ' + style );\n\n\t\t\t}\n\n\t\t} else if ( m = /^\\#([A-Fa-f\\d]+)$/.exec( style ) ) {\n\n\t\t\t// hex color\n\n\t\t\tconst hex = m[ 1 ];\n\t\t\tconst size = hex.length;\n\n\t\t\tif ( size === 3 ) {\n\n\t\t\t\t// #ff0\n\t\t\t\treturn this.setRGB(\n\t\t\t\t\tparseInt( hex.charAt( 0 ), 16 ) / 15,\n\t\t\t\t\tparseInt( hex.charAt( 1 ), 16 ) / 15,\n\t\t\t\t\tparseInt( hex.charAt( 2 ), 16 ) / 15,\n\t\t\t\t\tcolorSpace\n\t\t\t\t);\n\n\t\t\t} else if ( size === 6 ) {\n\n\t\t\t\t// #ff0000\n\t\t\t\treturn this.setHex( parseInt( hex, 16 ), colorSpace );\n\n\t\t\t} else {\n\n\t\t\t\twarn( 'Color: Invalid hex color ' + style );\n\n\t\t\t}\n\n\t\t} else if ( style && style.length > 0 ) {\n\n\t\t\treturn this.setColorName( style, colorSpace );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this color from a color name. Faster than {@link Color#setStyle} if\n\t * you don't need the other CSS-style formats.\n\t *\n\t * For convenience, the list of names is exposed in `Color.NAMES` as a hash.\n\t * ```js\n\t * Color.NAMES.aliceblue // returns 0xF0F8FF\n\t * ```\n\t *\n\t * @param {string} style - The color name.\n\t * @param {string} [colorSpace=SRGBColorSpace] - The color space.\n\t * @return {Color} A reference to this color.\n\t */\n\tsetColorName( style, colorSpace = SRGBColorSpace ) {\n\n\t\t// color keywords\n\t\tconst hex = _colorKeywords[ style.toLowerCase() ];\n\n\t\tif ( hex !== undefined ) {\n\n\t\t\t// red\n\t\t\tthis.setHex( hex, colorSpace );\n\n\t\t} else {\n\n\t\t\t// unknown color\n\t\t\twarn( 'Color: Unknown color ' + style );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new color with copied values from this instance.\n\t *\n\t * @return {Color} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor( this.r, this.g, this.b );\n\n\t}\n\n\t/**\n\t * Copies the values of the given color to this instance.\n\t *\n\t * @param {Color} color - The color to copy.\n\t * @return {Color} A reference to this color.\n\t */\n\tcopy( color ) {\n\n\t\tthis.r = color.r;\n\t\tthis.g = color.g;\n\t\tthis.b = color.b;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the given color into this color, and then converts this color from\n\t * `SRGBColorSpace` to `LinearSRGBColorSpace`.\n\t *\n\t * @param {Color} color - The color to copy/convert.\n\t * @return {Color} A reference to this color.\n\t */\n\tcopySRGBToLinear( color ) {\n\n\t\tthis.r = SRGBToLinear( color.r );\n\t\tthis.g = SRGBToLinear( color.g );\n\t\tthis.b = SRGBToLinear( color.b );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the given color into this color, and then converts this color from\n\t * `LinearSRGBColorSpace` to `SRGBColorSpace`.\n\t *\n\t * @param {Color} color - The color to copy/convert.\n\t * @return {Color} A reference to this color.\n\t */\n\tcopyLinearToSRGB( color ) {\n\n\t\tthis.r = LinearToSRGB( color.r );\n\t\tthis.g = LinearToSRGB( color.g );\n\t\tthis.b = LinearToSRGB( color.b );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Converts this color from `SRGBColorSpace` to `LinearSRGBColorSpace`.\n\t *\n\t * @return {Color} A reference to this color.\n\t */\n\tconvertSRGBToLinear() {\n\n\t\tthis.copySRGBToLinear( this );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Converts this color from `LinearSRGBColorSpace` to `SRGBColorSpace`.\n\t *\n\t * @return {Color} A reference to this color.\n\t */\n\tconvertLinearToSRGB() {\n\n\t\tthis.copyLinearToSRGB( this );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the hexadecimal value of this color.\n\t *\n\t * @param {string} [colorSpace=SRGBColorSpace] - The color space.\n\t * @return {number} The hexadecimal value.\n\t */\n\tgetHex( colorSpace = SRGBColorSpace ) {\n\n\t\tColorManagement.workingToColorSpace( _color.copy( this ), colorSpace );\n\n\t\treturn Math.round( clamp( _color.r * 255, 0, 255 ) ) * 65536 + Math.round( clamp( _color.g * 255, 0, 255 ) ) * 256 + Math.round( clamp( _color.b * 255, 0, 255 ) );\n\n\t}\n\n\t/**\n\t * Returns the hexadecimal value of this color as a string (for example, 'FFFFFF').\n\t *\n\t * @param {string} [colorSpace=SRGBColorSpace] - The color space.\n\t * @return {string} The hexadecimal value as a string.\n\t */\n\tgetHexString( colorSpace = SRGBColorSpace ) {\n\n\t\treturn ( '000000' + this.getHex( colorSpace ).toString( 16 ) ).slice( -6 );\n\n\t}\n\n\t/**\n\t * Converts the colors RGB values into the HSL format and stores them into the\n\t * given target object.\n\t *\n\t * @param {{h:number,s:number,l:number}} target - The target object that is used to store the method's result.\n\t * @param {string} [colorSpace=ColorManagement.workingColorSpace] - The color space.\n\t * @return {{h:number,s:number,l:number}} The HSL representation of this color.\n\t */\n\tgetHSL( target, colorSpace = ColorManagement.workingColorSpace ) {\n\n\t\t// h,s,l ranges are in 0.0 - 1.0\n\n\t\tColorManagement.workingToColorSpace( _color.copy( this ), colorSpace );\n\n\t\tconst r = _color.r, g = _color.g, b = _color.b;\n\n\t\tconst max = Math.max( r, g, b );\n\t\tconst min = Math.min( r, g, b );\n\n\t\tlet hue, saturation;\n\t\tconst lightness = ( min + max ) / 2.0;\n\n\t\tif ( min === max ) {\n\n\t\t\thue = 0;\n\t\t\tsaturation = 0;\n\n\t\t} else {\n\n\t\t\tconst delta = max - min;\n\n\t\t\tsaturation = lightness <= 0.5 ? delta / ( max + min ) : delta / ( 2 - max - min );\n\n\t\t\tswitch ( max ) {\n\n\t\t\t\tcase r: hue = ( g - b ) / delta + ( g < b ? 6 : 0 ); break;\n\t\t\t\tcase g: hue = ( b - r ) / delta + 2; break;\n\t\t\t\tcase b: hue = ( r - g ) / delta + 4; break;\n\n\t\t\t}\n\n\t\t\thue /= 6;\n\n\t\t}\n\n\t\ttarget.h = hue;\n\t\ttarget.s = saturation;\n\t\ttarget.l = lightness;\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Returns the RGB values of this color and stores them into the given target object.\n\t *\n\t * @param {Color} target - The target color that is used to store the method's result.\n\t * @param {string} [colorSpace=ColorManagement.workingColorSpace] - The color space.\n\t * @return {Color} The RGB representation of this color.\n\t */\n\tgetRGB( target, colorSpace = ColorManagement.workingColorSpace ) {\n\n\t\tColorManagement.workingToColorSpace( _color.copy( this ), colorSpace );\n\n\t\ttarget.r = _color.r;\n\t\ttarget.g = _color.g;\n\t\ttarget.b = _color.b;\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Returns the value of this color as a CSS style string. Example: `rgb(255,0,0)`.\n\t *\n\t * @param {string} [colorSpace=SRGBColorSpace] - The color space.\n\t * @return {string} The CSS representation of this color.\n\t */\n\tgetStyle( colorSpace = SRGBColorSpace ) {\n\n\t\tColorManagement.workingToColorSpace( _color.copy( this ), colorSpace );\n\n\t\tconst r = _color.r, g = _color.g, b = _color.b;\n\n\t\tif ( colorSpace !== SRGBColorSpace ) {\n\n\t\t\t// Requires CSS Color Module Level 4 (https://www.w3.org/TR/css-color-4/).\n\t\t\treturn `color(${ colorSpace } ${ r.toFixed( 3 ) } ${ g.toFixed( 3 ) } ${ b.toFixed( 3 ) })`;\n\n\t\t}\n\n\t\treturn `rgb(${ Math.round( r * 255 ) },${ Math.round( g * 255 ) },${ Math.round( b * 255 ) })`;\n\n\t}\n\n\t/**\n\t * Adds the given HSL values to this color's values.\n\t * Internally, this converts the color's RGB values to HSL, adds HSL\n\t * and then converts the color back to RGB.\n\t *\n\t * @param {number} h - Hue value between `0.0` and `1.0`.\n\t * @param {number} s - Saturation value between `0.0` and `1.0`.\n\t * @param {number} l - Lightness value between `0.0` and `1.0`.\n\t * @return {Color} A reference to this color.\n\t */\n\toffsetHSL( h, s, l ) {\n\n\t\tthis.getHSL( _hslA );\n\n\t\treturn this.setHSL( _hslA.h + h, _hslA.s + s, _hslA.l + l );\n\n\t}\n\n\t/**\n\t * Adds the RGB values of the given color to the RGB values of this color.\n\t *\n\t * @param {Color} color - The color to add.\n\t * @return {Color} A reference to this color.\n\t */\n\tadd( color ) {\n\n\t\tthis.r += color.r;\n\t\tthis.g += color.g;\n\t\tthis.b += color.b;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the RGB values of the given colors and stores the result in this instance.\n\t *\n\t * @param {Color} color1 - The first color.\n\t * @param {Color} color2 - The second color.\n\t * @return {Color} A reference to this color.\n\t */\n\taddColors( color1, color2 ) {\n\n\t\tthis.r = color1.r + color2.r;\n\t\tthis.g = color1.g + color2.g;\n\t\tthis.b = color1.b + color2.b;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given scalar value to the RGB values of this color.\n\t *\n\t * @param {number} s - The scalar to add.\n\t * @return {Color} A reference to this color.\n\t */\n\taddScalar( s ) {\n\n\t\tthis.r += s;\n\t\tthis.g += s;\n\t\tthis.b += s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the RGB values of the given color from the RGB values of this color.\n\t *\n\t * @param {Color} color - The color to subtract.\n\t * @return {Color} A reference to this color.\n\t */\n\tsub( color ) {\n\n\t\tthis.r = Math.max( 0, this.r - color.r );\n\t\tthis.g = Math.max( 0, this.g - color.g );\n\t\tthis.b = Math.max( 0, this.b - color.b );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the RGB values of the given color with the RGB values of this color.\n\t *\n\t * @param {Color} color - The color to multiply.\n\t * @return {Color} A reference to this color.\n\t */\n\tmultiply( color ) {\n\n\t\tthis.r *= color.r;\n\t\tthis.g *= color.g;\n\t\tthis.b *= color.b;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the given scalar value with the RGB values of this color.\n\t *\n\t * @param {number} s - The scalar to multiply.\n\t * @return {Color} A reference to this color.\n\t */\n\tmultiplyScalar( s ) {\n\n\t\tthis.r *= s;\n\t\tthis.g *= s;\n\t\tthis.b *= s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Linearly interpolates this color's RGB values toward the RGB values of the\n\t * given color. The alpha argument can be thought of as the ratio between\n\t * the two colors, where `0.0` is this color and `1.0` is the first argument.\n\t *\n\t * @param {Color} color - The color to converge on.\n\t * @param {number} alpha - The interpolation factor in the closed interval `[0,1]`.\n\t * @return {Color} A reference to this color.\n\t */\n\tlerp( color, alpha ) {\n\n\t\tthis.r += ( color.r - this.r ) * alpha;\n\t\tthis.g += ( color.g - this.g ) * alpha;\n\t\tthis.b += ( color.b - this.b ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Linearly interpolates between the given colors and stores the result in this instance.\n\t * The alpha argument can be thought of as the ratio between the two colors, where `0.0`\n\t * is the first and `1.0` is the second color.\n\t *\n\t * @param {Color} color1 - The first color.\n\t * @param {Color} color2 - The second color.\n\t * @param {number} alpha - The interpolation factor in the closed interval `[0,1]`.\n\t * @return {Color} A reference to this color.\n\t */\n\tlerpColors( color1, color2, alpha ) {\n\n\t\tthis.r = color1.r + ( color2.r - color1.r ) * alpha;\n\t\tthis.g = color1.g + ( color2.g - color1.g ) * alpha;\n\t\tthis.b = color1.b + ( color2.b - color1.b ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Linearly interpolates this color's HSL values toward the HSL values of the\n\t * given color. It differs from {@link Color#lerp} by not interpolating straight\n\t * from one color to the other, but instead going through all the hues in between\n\t * those two colors. The alpha argument can be thought of as the ratio between\n\t * the two colors, where 0.0 is this color and 1.0 is the first argument.\n\t *\n\t * @param {Color} color - The color to converge on.\n\t * @param {number} alpha - The interpolation factor in the closed interval `[0,1]`.\n\t * @return {Color} A reference to this color.\n\t */\n\tlerpHSL( color, alpha ) {\n\n\t\tthis.getHSL( _hslA );\n\t\tcolor.getHSL( _hslB );\n\n\t\tconst h = lerp( _hslA.h, _hslB.h, alpha );\n\t\tconst s = lerp( _hslA.s, _hslB.s, alpha );\n\t\tconst l = lerp( _hslA.l, _hslB.l, alpha );\n\n\t\tthis.setHSL( h, s, l );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the color's RGB components from the given 3D vector.\n\t *\n\t * @param {Vector3} v - The vector to set.\n\t * @return {Color} A reference to this color.\n\t */\n\tsetFromVector3( v ) {\n\n\t\tthis.r = v.x;\n\t\tthis.g = v.y;\n\t\tthis.b = v.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Transforms this color with the given 3x3 matrix.\n\t *\n\t * @param {Matrix3} m - The matrix.\n\t * @return {Color} A reference to this color.\n\t */\n\tapplyMatrix3( m ) {\n\n\t\tconst r = this.r, g = this.g, b = this.b;\n\t\tconst e = m.elements;\n\n\t\tthis.r = e[ 0 ] * r + e[ 3 ] * g + e[ 6 ] * b;\n\t\tthis.g = e[ 1 ] * r + e[ 4 ] * g + e[ 7 ] * b;\n\t\tthis.b = e[ 2 ] * r + e[ 5 ] * g + e[ 8 ] * b;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this color is equal with the given one.\n\t *\n\t * @param {Color} c - The color to test for equality.\n\t * @return {boolean} Whether this bounding color is equal with the given one.\n\t */\n\tequals( c ) {\n\n\t\treturn ( c.r === this.r ) && ( c.g === this.g ) && ( c.b === this.b );\n\n\t}\n\n\t/**\n\t * Sets this color's RGB components from the given array.\n\t *\n\t * @param {Array<number>} array - An array holding the RGB values.\n\t * @param {number} [offset=0] - The offset into the array.\n\t * @return {Color} A reference to this color.\n\t */\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis.r = array[ offset ];\n\t\tthis.g = array[ offset + 1 ];\n\t\tthis.b = array[ offset + 2 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Writes the RGB components of this color to the given array. If no array is provided,\n\t * the method returns a new instance.\n\t *\n\t * @param {Array<number>} [array=[]] - The target array holding the color components.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Array<number>} The color components.\n\t */\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this.r;\n\t\tarray[ offset + 1 ] = this.g;\n\t\tarray[ offset + 2 ] = this.b;\n\n\t\treturn array;\n\n\t}\n\n\t/**\n\t * Sets the components of this color from the given buffer attribute.\n\t *\n\t * @param {BufferAttribute} attribute - The buffer attribute holding color data.\n\t * @param {number} index - The index into the attribute.\n\t * @return {Color} A reference to this color.\n\t */\n\tfromBufferAttribute( attribute, index ) {\n\n\t\tthis.r = attribute.getX( index );\n\t\tthis.g = attribute.getY( index );\n\t\tthis.b = attribute.getZ( index );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * This methods defines the serialization result of this class. Returns the color\n\t * as a hexadecimal value.\n\t *\n\t * @return {number} The hexadecimal value.\n\t */\n\ttoJSON() {\n\n\t\treturn this.getHex();\n\n\t}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this.r;\n\t\tyield this.g;\n\t\tyield this.b;\n\n\t}\n\n}\n\nconst _color = /*@__PURE__*/ new Color();\n\n/**\n * A dictionary with X11 color names.\n *\n * Note that multiple words such as Dark Orange become the string 'darkorange'.\n *\n * @static\n * @type {Object}\n */\nColor.NAMES = _colorKeywords;\n\nlet _materialId = 0;\n\n/**\n * Abstract base class for materials.\n *\n * Materials define the appearance of renderable 3D objects.\n *\n * @abstract\n * @augments EventDispatcher\n */\nclass Material extends EventDispatcher {\n\n\t/**\n\t * Constructs a new material.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMaterial = true;\n\n\t\t/**\n\t\t * The ID of the material.\n\t\t *\n\t\t * @name Material#id\n\t\t * @type {number}\n\t\t * @readonly\n\t\t */\n\t\tObject.defineProperty( this, 'id', { value: _materialId ++ } );\n\n\t\t/**\n\t\t * The UUID of the material.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.uuid = generateUUID();\n\n\t\t/**\n\t\t * The name of the material.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\n\t\t/**\n\t\t * The type property is used for detecting the object type\n\t\t * in context of serialization/deserialization.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.type = 'Material';\n\n\t\t/**\n\t\t * Defines the blending type of the material.\n\t\t *\n\t\t * It must be set to `CustomBlending` if custom blending properties like\n\t\t * {@link Material#blendSrc}, {@link Material#blendDst} or {@link Material#blendEquation}\n\t\t * should have any effect.\n\t\t *\n\t\t * @type {(NoBlending|NormalBlending|AdditiveBlending|SubtractiveBlending|MultiplyBlending|CustomBlending)}\n\t\t * @default NormalBlending\n\t\t */\n\t\tthis.blending = NormalBlending;\n\n\t\t/**\n\t\t * Defines which side of faces will be rendered - front, back or both.\n\t\t *\n\t\t * @type {(FrontSide|BackSide|DoubleSide)}\n\t\t * @default FrontSide\n\t\t */\n\t\tthis.side = FrontSide;\n\n\t\t/**\n\t\t * If set to `true`, vertex colors should be used.\n\t\t *\n\t\t * The engine supports RGB and RGBA vertex colors depending on whether a three (RGB) or\n\t\t * four (RGBA) component color buffer attribute is used.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.vertexColors = false;\n\n\t\t/**\n\t\t * Defines how transparent the material is.\n\t\t * A value of `0.0` indicates fully transparent, `1.0` is fully opaque.\n\t\t *\n\t\t * If the {@link Material#transparent} is not set to `true`,\n\t\t * the material will remain fully opaque and this value will only affect its color.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.opacity = 1;\n\n\t\t/**\n\t\t * Defines whether this material is transparent. This has an effect on\n\t\t * rendering as transparent objects need special treatment and are rendered\n\t\t * after non-transparent objects.\n\t\t *\n\t\t * When set to true, the extent to which the material is transparent is\n\t\t * controlled by {@link Material#opacity}.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.transparent = false;\n\n\t\t/**\n\t\t * Enables alpha hashed transparency, an alternative to {@link Material#transparent} or\n\t\t * {@link Material#alphaTest}. The material will not be rendered if opacity is lower than\n\t\t * a random threshold. Randomization introduces some grain or noise, but approximates alpha\n\t\t * blending without the associated problems of sorting. Using TAA can reduce the resulting noise.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.alphaHash = false;\n\n\t\t/**\n\t\t * Defines the blending source factor.\n\t\t *\n\t\t * @type {(ZeroFactor|OneFactor|SrcColorFactor|OneMinusSrcColorFactor|SrcAlphaFactor|OneMinusSrcAlphaFactor|DstAlphaFactor|OneMinusDstAlphaFactor|DstColorFactor|OneMinusDstColorFactor|SrcAlphaSaturateFactor|ConstantColorFactor|OneMinusConstantColorFactor|ConstantAlphaFactor|OneMinusConstantAlphaFactor)}\n\t\t * @default SrcAlphaFactor\n\t\t */\n\t\tthis.blendSrc = SrcAlphaFactor;\n\n\t\t/**\n\t\t * Defines the blending destination factor.\n\t\t *\n\t\t * @type {(ZeroFactor|OneFactor|SrcColorFactor|OneMinusSrcColorFactor|SrcAlphaFactor|OneMinusSrcAlphaFactor|DstAlphaFactor|OneMinusDstAlphaFactor|DstColorFactor|OneMinusDstColorFactor|SrcAlphaSaturateFactor|ConstantColorFactor|OneMinusConstantColorFactor|ConstantAlphaFactor|OneMinusConstantAlphaFactor)}\n\t\t * @default OneMinusSrcAlphaFactor\n\t\t */\n\t\tthis.blendDst = OneMinusSrcAlphaFactor;\n\n\t\t/**\n\t\t * Defines the blending equation.\n\t\t *\n\t\t * @type {(AddEquation|SubtractEquation|ReverseSubtractEquation|MinEquation|MaxEquation)}\n\t\t * @default AddEquation\n\t\t */\n\t\tthis.blendEquation = AddEquation;\n\n\t\t/**\n\t\t * Defines the blending source alpha factor.\n\t\t *\n\t\t * @type {?(ZeroFactor|OneFactor|SrcColorFactor|OneMinusSrcColorFactor|SrcAlphaFactor|OneMinusSrcAlphaFactor|DstAlphaFactor|OneMinusDstAlphaFactor|DstColorFactor|OneMinusDstColorFactor|SrcAlphaSaturateFactor|ConstantColorFactor|OneMinusConstantColorFactor|ConstantAlphaFactor|OneMinusConstantAlphaFactor)}\n\t\t * @default null\n\t\t */\n\t\tthis.blendSrcAlpha = null;\n\n\t\t/**\n\t\t * Defines the blending destination alpha factor.\n\t\t *\n\t\t * @type {?(ZeroFactor|OneFactor|SrcColorFactor|OneMinusSrcColorFactor|SrcAlphaFactor|OneMinusSrcAlphaFactor|DstAlphaFactor|OneMinusDstAlphaFactor|DstColorFactor|OneMinusDstColorFactor|SrcAlphaSaturateFactor|ConstantColorFactor|OneMinusConstantColorFactor|ConstantAlphaFactor|OneMinusConstantAlphaFactor)}\n\t\t * @default null\n\t\t */\n\t\tthis.blendDstAlpha = null;\n\n\t\t/**\n\t\t * Defines the blending equation of the alpha channel.\n\t\t *\n\t\t * @type {?(AddEquation|SubtractEquation|ReverseSubtractEquation|MinEquation|MaxEquation)}\n\t\t * @default null\n\t\t */\n\t\tthis.blendEquationAlpha = null;\n\n\t\t/**\n\t\t * Represents the RGB values of the constant blend color.\n\t\t *\n\t\t * This property has only an effect when using custom blending with `ConstantColor` or `OneMinusConstantColor`.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.blendColor = new Color( 0, 0, 0 );\n\n\t\t/**\n\t\t * Represents the alpha value of the constant blend color.\n\t\t *\n\t\t * This property has only an effect when using custom blending with `ConstantAlpha` or `OneMinusConstantAlpha`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.blendAlpha = 0;\n\n\t\t/**\n\t\t * Defines the depth function.\n\t\t *\n\t\t * @type {(NeverDepth|AlwaysDepth|LessDepth|LessEqualDepth|EqualDepth|GreaterEqualDepth|GreaterDepth|NotEqualDepth)}\n\t\t * @default LessEqualDepth\n\t\t */\n\t\tthis.depthFunc = LessEqualDepth;\n\n\t\t/**\n\t\t * Whether to have depth test enabled when rendering this material.\n\t\t * When the depth test is disabled, the depth write will also be implicitly disabled.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.depthTest = true;\n\n\t\t/**\n\t\t * Whether rendering this material has any effect on the depth buffer.\n\t\t *\n\t\t * When drawing 2D overlays it can be useful to disable the depth writing in\n\t\t * order to layer several things together without creating z-index artifacts.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.depthWrite = true;\n\n\t\t/**\n\t\t * The bit mask to use when writing to the stencil buffer.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0xff\n\t\t */\n\t\tthis.stencilWriteMask = 0xff;\n\n\t\t/**\n\t\t * The stencil comparison function to use.\n\t\t *\n\t\t * @type {NeverStencilFunc|LessStencilFunc|EqualStencilFunc|LessEqualStencilFunc|GreaterStencilFunc|NotEqualStencilFunc|GreaterEqualStencilFunc|AlwaysStencilFunc}\n\t\t * @default AlwaysStencilFunc\n\t\t */\n\t\tthis.stencilFunc = AlwaysStencilFunc;\n\n\t\t/**\n\t\t * The value to use when performing stencil comparisons or stencil operations.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.stencilRef = 0;\n\n\t\t/**\n\t\t * The bit mask to use when comparing against the stencil buffer.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0xff\n\t\t */\n\t\tthis.stencilFuncMask = 0xff;\n\n\t\t/**\n\t\t * Which stencil operation to perform when the comparison function returns `false`.\n\t\t *\n\t\t * @type {ZeroStencilOp|KeepStencilOp|ReplaceStencilOp|IncrementStencilOp|DecrementStencilOp|IncrementWrapStencilOp|DecrementWrapStencilOp|InvertStencilOp}\n\t\t * @default KeepStencilOp\n\t\t */\n\t\tthis.stencilFail = KeepStencilOp;\n\n\t\t/**\n\t\t * Which stencil operation to perform when the comparison function returns\n\t\t * `true` but the depth test fails.\n\t\t *\n\t\t * @type {ZeroStencilOp|KeepStencilOp|ReplaceStencilOp|IncrementStencilOp|DecrementStencilOp|IncrementWrapStencilOp|DecrementWrapStencilOp|InvertStencilOp}\n\t\t * @default KeepStencilOp\n\t\t */\n\t\tthis.stencilZFail = KeepStencilOp;\n\n\t\t/**\n\t\t * Which stencil operation to perform when the comparison function returns\n\t\t * `true` and the depth test passes.\n\t\t *\n\t\t * @type {ZeroStencilOp|KeepStencilOp|ReplaceStencilOp|IncrementStencilOp|DecrementStencilOp|IncrementWrapStencilOp|DecrementWrapStencilOp|InvertStencilOp}\n\t\t * @default KeepStencilOp\n\t\t */\n\t\tthis.stencilZPass = KeepStencilOp;\n\n\t\t/**\n\t\t * Whether stencil operations are performed against the stencil buffer. In\n\t\t * order to perform writes or comparisons against the stencil buffer this\n\t\t * value must be `true`.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.stencilWrite = false;\n\n\t\t/**\n\t\t * User-defined clipping planes specified as THREE.Plane objects in world\n\t\t * space. These planes apply to the objects this material is attached to.\n\t\t * Points in space whose signed distance to the plane is negative are clipped\n\t\t * (not rendered). This requires {@link WebGLRenderer#localClippingEnabled} to\n\t\t * be `true`.\n\t\t *\n\t\t * @type {?Array<Plane>}\n\t\t * @default null\n\t\t */\n\t\tthis.clippingPlanes = null;\n\n\t\t/**\n\t\t * Changes the behavior of clipping planes so that only their intersection is\n\t\t * clipped, rather than their union.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.clipIntersection = false;\n\n\t\t/**\n\t\t * Defines whether to clip shadows according to the clipping planes specified\n\t\t * on this material.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.clipShadows = false;\n\n\t\t/**\n\t\t * Defines which side of faces cast shadows. If `null`, the side casting shadows\n\t\t * is determined as follows:\n\t\t *\n\t\t * - When {@link Material#side} is set to `FrontSide`, the back side cast shadows.\n\t\t * - When {@link Material#side} is set to `BackSide`, the front side cast shadows.\n\t\t * - When {@link Material#side} is set to `DoubleSide`, both sides cast shadows.\n\t\t *\n\t\t * @type {?(FrontSide|BackSide|DoubleSide)}\n\t\t * @default null\n\t\t */\n\t\tthis.shadowSide = null;\n\n\t\t/**\n\t\t * Whether to render the material's color.\n\t\t *\n\t\t * This can be used in conjunction with {@link Object3D#renderOder} to create invisible\n\t\t * objects that occlude other objects.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.colorWrite = true;\n\n\t\t/**\n\t\t * Override the renderer's default precision for this material.\n\t\t *\n\t\t * @type {?('highp'|'mediump'|'lowp')}\n\t\t * @default null\n\t\t */\n\t\tthis.precision = null;\n\n\t\t/**\n\t\t * Whether to use polygon offset or not. When enabled, each fragment's depth value will\n\t\t * be offset after it is interpolated from the depth values of the appropriate vertices.\n\t\t * The offset is added before the depth test is performed and before the value is written\n\t\t * into the depth buffer.\n\t\t *\n\t\t * Can be useful for rendering hidden-line images, for applying decals to surfaces, and for\n\t\t * rendering solids with highlighted edges.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.polygonOffset = false;\n\n\t\t/**\n\t\t * Specifies a scale factor that is used to create a variable depth offset for each polygon.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.polygonOffsetFactor = 0;\n\n\t\t/**\n\t\t * Is multiplied by an implementation-specific value to create a constant depth offset.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.polygonOffsetUnits = 0;\n\n\t\t/**\n\t\t * Whether to apply dithering to the color to remove the appearance of banding.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.dithering = false;\n\n\t\t/**\n\t\t * Whether alpha to coverage should be enabled or not. Can only be used with MSAA-enabled contexts\n\t\t * (meaning when the renderer was created with *antialias* parameter set to `true`). Enabling this\n\t\t * will smooth aliasing on clip plane edges and alphaTest-clipped edges.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.alphaToCoverage = false;\n\n\t\t/**\n\t\t * Whether to premultiply the alpha (transparency) value.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.premultipliedAlpha = false;\n\n\t\t/**\n\t\t * Whether double-sided, transparent objects should be rendered with a single pass or not.\n\t\t *\n\t\t * The engine renders double-sided, transparent objects with two draw calls (back faces first,\n\t\t * then front faces) to mitigate transparency artifacts. There are scenarios however where this\n\t\t * approach produces no quality gains but still doubles draw calls e.g. when rendering flat\n\t\t * vegetation like grass sprites. In these cases, set the `forceSinglePass` flag to `true` to\n\t\t * disable the two pass rendering to avoid performance issues.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.forceSinglePass = false;\n\n\t\t/**\n\t\t * Whether it's possible to override the material with {@link Scene#overrideMaterial} or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.allowOverride = true;\n\n\t\t/**\n\t\t * Defines whether 3D objects using this material are visible.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.visible = true;\n\n\t\t/**\n\t\t * Defines whether this material is tone mapped according to the renderer's tone mapping setting.\n\t\t *\n\t\t * It is ignored when rendering to a render target or using post processing or when using\n\t\t * `WebGPURenderer`. In all these cases, all materials are honored by tone mapping.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.toneMapped = true;\n\n\t\t/**\n\t\t * An object that can be used to store custom data about the Material. It\n\t\t * should not hold references to functions as these will not be cloned.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.userData = {};\n\n\t\t/**\n\t\t * This starts at `0` and counts how many times {@link Material#needsUpdate} is set to `true`.\n\t\t *\n\t\t * @type {number}\n\t\t * @readonly\n\t\t * @default 0\n\t\t */\n\t\tthis.version = 0;\n\n\t\tthis._alphaTest = 0;\n\n\t}\n\n\t/**\n\t * Sets the alpha value to be used when running an alpha test. The material\n\t * will not be rendered if the opacity is lower than this value.\n\t *\n\t * @type {number}\n\t * @readonly\n\t * @default 0\n\t */\n\tget alphaTest() {\n\n\t\treturn this._alphaTest;\n\n\t}\n\n\tset alphaTest( value ) {\n\n\t\tif ( this._alphaTest > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._alphaTest = value;\n\n\t}\n\n\t/**\n\t * An optional callback that is executed immediately before the material is used to render a 3D object.\n\t *\n\t * This method can only be used when rendering with {@link WebGLRenderer}.\n\t *\n\t * @param {WebGLRenderer} renderer - The renderer.\n\t * @param {Scene} scene - The scene.\n\t * @param {Camera} camera - The camera that is used to render the scene.\n\t * @param {BufferGeometry} geometry - The 3D object's geometry.\n\t * @param {Object3D} object - The 3D object.\n\t * @param {Object} group - The geometry group data.\n\t */\n\tonBeforeRender( /* renderer, scene, camera, geometry, object, group */ ) {}\n\n\t/**\n\t * An optional callback that is executed immediately before the shader\n\t * program is compiled. This function is called with the shader source code\n\t * as a parameter. Useful for the modification of built-in materials.\n\t *\n\t * This method can only be used when rendering with {@link WebGLRenderer}. The\n\t * recommended approach when customizing materials is to use `WebGPURenderer` with the new\n\t * Node Material system and [TSL](https://github.com/mrdoob/three.js/wiki/Three.js-Shading-Language).\n\t *\n\t * @param {{vertexShader:string,fragmentShader:string,uniforms:Object}} shaderobject - The object holds the uniforms and the vertex and fragment shader source.\n\t * @param {WebGLRenderer} renderer - A reference to the renderer.\n\t */\n\tonBeforeCompile( /* shaderobject, renderer */ ) {}\n\n\t/**\n\t * In case {@link Material#onBeforeCompile} is used, this callback can be used to identify\n\t * values of settings used in `onBeforeCompile()`, so three.js can reuse a cached\n\t * shader or recompile the shader for this material as needed.\n\t *\n\t * This method can only be used when rendering with {@link WebGLRenderer}.\n\t *\n\t * @return {string} The custom program cache key.\n\t */\n\tcustomProgramCacheKey() {\n\n\t\treturn this.onBeforeCompile.toString();\n\n\t}\n\n\t/**\n\t * This method can be used to set default values from parameter objects.\n\t * It is a generic implementation so it can be used with different types\n\t * of materials.\n\t *\n\t * @param {Object} [values] - The material values to set.\n\t */\n\tsetValues( values ) {\n\n\t\tif ( values === undefined ) return;\n\n\t\tfor ( const key in values ) {\n\n\t\t\tconst newValue = values[ key ];\n\n\t\t\tif ( newValue === undefined ) {\n\n\t\t\t\twarn( `Material: parameter '${ key }' has value of undefined.` );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tconst currentValue = this[ key ];\n\n\t\t\tif ( currentValue === undefined ) {\n\n\t\t\t\twarn( `Material: '${ key }' is not a property of THREE.${ this.type }.` );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tif ( currentValue && currentValue.isColor ) {\n\n\t\t\t\tcurrentValue.set( newValue );\n\n\t\t\t} else if ( ( currentValue && currentValue.isVector3 ) && ( newValue && newValue.isVector3 ) ) {\n\n\t\t\t\tcurrentValue.copy( newValue );\n\n\t\t\t} else {\n\n\t\t\t\tthis[ key ] = newValue;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Serializes the material into JSON.\n\t *\n\t * @param {?(Object|string)} meta - An optional value holding meta information about the serialization.\n\t * @return {Object} A JSON object representing the serialized material.\n\t * @see {@link ObjectLoader#parse}\n\t */\n\ttoJSON( meta ) {\n\n\t\tconst isRootObject = ( meta === undefined || typeof meta === 'string' );\n\n\t\tif ( isRootObject ) {\n\n\t\t\tmeta = {\n\t\t\t\ttextures: {},\n\t\t\t\timages: {}\n\t\t\t};\n\n\t\t}\n\n\t\tconst data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.7,\n\t\t\t\ttype: 'Material',\n\t\t\t\tgenerator: 'Material.toJSON'\n\t\t\t}\n\t\t};\n\n\t\t// standard Material serialization\n\t\tdata.uuid = this.uuid;\n\t\tdata.type = this.type;\n\n\t\tif ( this.name !== '' ) data.name = this.name;\n\n\t\tif ( this.color && this.color.isColor ) data.color = this.color.getHex();\n\n\t\tif ( this.roughness !== undefined ) data.roughness = this.roughness;\n\t\tif ( this.metalness !== undefined ) data.metalness = this.metalness;\n\n\t\tif ( this.sheen !== undefined ) data.sheen = this.sheen;\n\t\tif ( this.sheenColor && this.sheenColor.isColor ) data.sheenColor = this.sheenColor.getHex();\n\t\tif ( this.sheenRoughness !== undefined ) data.sheenRoughness = this.sheenRoughness;\n\t\tif ( this.emissive && this.emissive.isColor ) data.emissive = this.emissive.getHex();\n\t\tif ( this.emissiveIntensity !== undefined && this.emissiveIntensity !== 1 ) data.emissiveIntensity = this.emissiveIntensity;\n\n\t\tif ( this.specular && this.specular.isColor ) data.specular = this.specular.getHex();\n\t\tif ( this.specularIntensity !== undefined ) data.specularIntensity = this.specularIntensity;\n\t\tif ( this.specularColor && this.specularColor.isColor ) data.specularColor = this.specularColor.getHex();\n\t\tif ( this.shininess !== undefined ) data.shininess = this.shininess;\n\t\tif ( this.clearcoat !== undefined ) data.clearcoat = this.clearcoat;\n\t\tif ( this.clearcoatRoughness !== undefined ) data.clearcoatRoughness = this.clearcoatRoughness;\n\n\t\tif ( this.clearcoatMap && this.clearcoatMap.isTexture ) {\n\n\t\t\tdata.clearcoatMap = this.clearcoatMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.clearcoatRoughnessMap && this.clearcoatRoughnessMap.isTexture ) {\n\n\t\t\tdata.clearcoatRoughnessMap = this.clearcoatRoughnessMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.clearcoatNormalMap && this.clearcoatNormalMap.isTexture ) {\n\n\t\t\tdata.clearcoatNormalMap = this.clearcoatNormalMap.toJSON( meta ).uuid;\n\t\t\tdata.clearcoatNormalScale = this.clearcoatNormalScale.toArray();\n\n\t\t}\n\n\t\tif ( this.sheenColorMap && this.sheenColorMap.isTexture ) {\n\n\t\t\tdata.sheenColorMap = this.sheenColorMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.sheenRoughnessMap && this.sheenRoughnessMap.isTexture ) {\n\n\t\t\tdata.sheenRoughnessMap = this.sheenRoughnessMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.dispersion !== undefined ) data.dispersion = this.dispersion;\n\n\t\tif ( this.iridescence !== undefined ) data.iridescence = this.iridescence;\n\t\tif ( this.iridescenceIOR !== undefined ) data.iridescenceIOR = this.iridescenceIOR;\n\t\tif ( this.iridescenceThicknessRange !== undefined ) data.iridescenceThicknessRange = this.iridescenceThicknessRange;\n\n\t\tif ( this.iridescenceMap && this.iridescenceMap.isTexture ) {\n\n\t\t\tdata.iridescenceMap = this.iridescenceMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.iridescenceThicknessMap && this.iridescenceThicknessMap.isTexture ) {\n\n\t\t\tdata.iridescenceThicknessMap = this.iridescenceThicknessMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.anisotropy !== undefined ) data.anisotropy = this.anisotropy;\n\t\tif ( this.anisotropyRotation !== undefined ) data.anisotropyRotation = this.anisotropyRotation;\n\n\t\tif ( this.anisotropyMap && this.anisotropyMap.isTexture ) {\n\n\t\t\tdata.anisotropyMap = this.anisotropyMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.map && this.map.isTexture ) data.map = this.map.toJSON( meta ).uuid;\n\t\tif ( this.matcap && this.matcap.isTexture ) data.matcap = this.matcap.toJSON( meta ).uuid;\n\t\tif ( this.alphaMap && this.alphaMap.isTexture ) data.alphaMap = this.alphaMap.toJSON( meta ).uuid;\n\n\t\tif ( this.lightMap && this.lightMap.isTexture ) {\n\n\t\t\tdata.lightMap = this.lightMap.toJSON( meta ).uuid;\n\t\t\tdata.lightMapIntensity = this.lightMapIntensity;\n\n\t\t}\n\n\t\tif ( this.aoMap && this.aoMap.isTexture ) {\n\n\t\t\tdata.aoMap = this.aoMap.toJSON( meta ).uuid;\n\t\t\tdata.aoMapIntensity = this.aoMapIntensity;\n\n\t\t}\n\n\t\tif ( this.bumpMap && this.bumpMap.isTexture ) {\n\n\t\t\tdata.bumpMap = this.bumpMap.toJSON( meta ).uuid;\n\t\t\tdata.bumpScale = this.bumpScale;\n\n\t\t}\n\n\t\tif ( this.normalMap && this.normalMap.isTexture ) {\n\n\t\t\tdata.normalMap = this.normalMap.toJSON( meta ).uuid;\n\t\t\tdata.normalMapType = this.normalMapType;\n\t\t\tdata.normalScale = this.normalScale.toArray();\n\n\t\t}\n\n\t\tif ( this.displacementMap && this.displacementMap.isTexture ) {\n\n\t\t\tdata.displacementMap = this.displacementMap.toJSON( meta ).uuid;\n\t\t\tdata.displacementScale = this.displacementScale;\n\t\t\tdata.displacementBias = this.displacementBias;\n\n\t\t}\n\n\t\tif ( this.roughnessMap && this.roughnessMap.isTexture ) data.roughnessMap = this.roughnessMap.toJSON( meta ).uuid;\n\t\tif ( this.metalnessMap && this.metalnessMap.isTexture ) data.metalnessMap = this.metalnessMap.toJSON( meta ).uuid;\n\n\t\tif ( this.emissiveMap && this.emissiveMap.isTexture ) data.emissiveMap = this.emissiveMap.toJSON( meta ).uuid;\n\t\tif ( this.specularMap && this.specularMap.isTexture ) data.specularMap = this.specularMap.toJSON( meta ).uuid;\n\t\tif ( this.specularIntensityMap && this.specularIntensityMap.isTexture ) data.specularIntensityMap = this.specularIntensityMap.toJSON( meta ).uuid;\n\t\tif ( this.specularColorMap && this.specularColorMap.isTexture ) data.specularColorMap = this.specularColorMap.toJSON( meta ).uuid;\n\n\t\tif ( this.envMap && this.envMap.isTexture ) {\n\n\t\t\tdata.envMap = this.envMap.toJSON( meta ).uuid;\n\n\t\t\tif ( this.combine !== undefined ) data.combine = this.combine;\n\n\t\t}\n\n\t\tif ( this.envMapRotation !== undefined ) data.envMapRotation = this.envMapRotation.toArray();\n\t\tif ( this.envMapIntensity !== undefined ) data.envMapIntensity = this.envMapIntensity;\n\t\tif ( this.reflectivity !== undefined ) data.reflectivity = this.reflectivity;\n\t\tif ( this.refractionRatio !== undefined ) data.refractionRatio = this.refractionRatio;\n\n\t\tif ( this.gradientMap && this.gradientMap.isTexture ) {\n\n\t\t\tdata.gradientMap = this.gradientMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.transmission !== undefined ) data.transmission = this.transmission;\n\t\tif ( this.transmissionMap && this.transmissionMap.isTexture ) data.transmissionMap = this.transmissionMap.toJSON( meta ).uuid;\n\t\tif ( this.thickness !== undefined ) data.thickness = this.thickness;\n\t\tif ( this.thicknessMap && this.thicknessMap.isTexture ) data.thicknessMap = this.thicknessMap.toJSON( meta ).uuid;\n\t\tif ( this.attenuationDistance !== undefined && this.attenuationDistance !== Infinity ) data.attenuationDistance = this.attenuationDistance;\n\t\tif ( this.attenuationColor !== undefined ) data.attenuationColor = this.attenuationColor.getHex();\n\n\t\tif ( this.size !== undefined ) data.size = this.size;\n\t\tif ( this.shadowSide !== null ) data.shadowSide = this.shadowSide;\n\t\tif ( this.sizeAttenuation !== undefined ) data.sizeAttenuation = this.sizeAttenuation;\n\n\t\tif ( this.blending !== NormalBlending ) data.blending = this.blending;\n\t\tif ( this.side !== FrontSide ) data.side = this.side;\n\t\tif ( this.vertexColors === true ) data.vertexColors = true;\n\n\t\tif ( this.opacity < 1 ) data.opacity = this.opacity;\n\t\tif ( this.transparent === true ) data.transparent = true;\n\n\t\tif ( this.blendSrc !== SrcAlphaFactor ) data.blendSrc = this.blendSrc;\n\t\tif ( this.blendDst !== OneMinusSrcAlphaFactor ) data.blendDst = this.blendDst;\n\t\tif ( this.blendEquation !== AddEquation ) data.blendEquation = this.blendEquation;\n\t\tif ( this.blendSrcAlpha !== null ) data.blendSrcAlpha = this.blendSrcAlpha;\n\t\tif ( this.blendDstAlpha !== null ) data.blendDstAlpha = this.blendDstAlpha;\n\t\tif ( this.blendEquationAlpha !== null ) data.blendEquationAlpha = this.blendEquationAlpha;\n\t\tif ( this.blendColor && this.blendColor.isColor ) data.blendColor = this.blendColor.getHex();\n\t\tif ( this.blendAlpha !== 0 ) data.blendAlpha = this.blendAlpha;\n\n\t\tif ( this.depthFunc !== LessEqualDepth ) data.depthFunc = this.depthFunc;\n\t\tif ( this.depthTest === false ) data.depthTest = this.depthTest;\n\t\tif ( this.depthWrite === false ) data.depthWrite = this.depthWrite;\n\t\tif ( this.colorWrite === false ) data.colorWrite = this.colorWrite;\n\n\t\tif ( this.stencilWriteMask !== 0xff ) data.stencilWriteMask = this.stencilWriteMask;\n\t\tif ( this.stencilFunc !== AlwaysStencilFunc ) data.stencilFunc = this.stencilFunc;\n\t\tif ( this.stencilRef !== 0 ) data.stencilRef = this.stencilRef;\n\t\tif ( this.stencilFuncMask !== 0xff ) data.stencilFuncMask = this.stencilFuncMask;\n\t\tif ( this.stencilFail !== KeepStencilOp ) data.stencilFail = this.stencilFail;\n\t\tif ( this.stencilZFail !== KeepStencilOp ) data.stencilZFail = this.stencilZFail;\n\t\tif ( this.stencilZPass !== KeepStencilOp ) data.stencilZPass = this.stencilZPass;\n\t\tif ( this.stencilWrite === true ) data.stencilWrite = this.stencilWrite;\n\n\t\t// rotation (SpriteMaterial)\n\t\tif ( this.rotation !== undefined && this.rotation !== 0 ) data.rotation = this.rotation;\n\n\t\tif ( this.polygonOffset === true ) data.polygonOffset = true;\n\t\tif ( this.polygonOffsetFactor !== 0 ) data.polygonOffsetFactor = this.polygonOffsetFactor;\n\t\tif ( this.polygonOffsetUnits !== 0 ) data.polygonOffsetUnits = this.polygonOffsetUnits;\n\n\t\tif ( this.linewidth !== undefined && this.linewidth !== 1 ) data.linewidth = this.linewidth;\n\t\tif ( this.dashSize !== undefined ) data.dashSize = this.dashSize;\n\t\tif ( this.gapSize !== undefined ) data.gapSize = this.gapSize;\n\t\tif ( this.scale !== undefined ) data.scale = this.scale;\n\n\t\tif ( this.dithering === true ) data.dithering = true;\n\n\t\tif ( this.alphaTest > 0 ) data.alphaTest = this.alphaTest;\n\t\tif ( this.alphaHash === true ) data.alphaHash = true;\n\t\tif ( this.alphaToCoverage === true ) data.alphaToCoverage = true;\n\t\tif ( this.premultipliedAlpha === true ) data.premultipliedAlpha = true;\n\t\tif ( this.forceSinglePass === true ) data.forceSinglePass = true;\n\n\t\tif ( this.wireframe === true ) data.wireframe = true;\n\t\tif ( this.wireframeLinewidth > 1 ) data.wireframeLinewidth = this.wireframeLinewidth;\n\t\tif ( this.wireframeLinecap !== 'round' ) data.wireframeLinecap = this.wireframeLinecap;\n\t\tif ( this.wireframeLinejoin !== 'round' ) data.wireframeLinejoin = this.wireframeLinejoin;\n\n\t\tif ( this.flatShading === true ) data.flatShading = true;\n\n\t\tif ( this.visible === false ) data.visible = false;\n\n\t\tif ( this.toneMapped === false ) data.toneMapped = false;\n\n\t\tif ( this.fog === false ) data.fog = false;\n\n\t\tif ( Object.keys( this.userData ).length > 0 ) data.userData = this.userData;\n\n\t\t// TODO: Copied from Object3D.toJSON\n\n\t\tfunction extractFromCache( cache ) {\n\n\t\t\tconst values = [];\n\n\t\t\tfor ( const key in cache ) {\n\n\t\t\t\tconst data = cache[ key ];\n\t\t\t\tdelete data.metadata;\n\t\t\t\tvalues.push( data );\n\n\t\t\t}\n\n\t\t\treturn values;\n\n\t\t}\n\n\t\tif ( isRootObject ) {\n\n\t\t\tconst textures = extractFromCache( meta.textures );\n\t\t\tconst images = extractFromCache( meta.images );\n\n\t\t\tif ( textures.length > 0 ) data.textures = textures;\n\t\t\tif ( images.length > 0 ) data.images = images;\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\t/**\n\t * Returns a new material with copied values from this instance.\n\t *\n\t * @return {Material} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Copies the values of the given material to this instance.\n\t *\n\t * @param {Material} source - The material to copy.\n\t * @return {Material} A reference to this instance.\n\t */\n\tcopy( source ) {\n\n\t\tthis.name = source.name;\n\n\t\tthis.blending = source.blending;\n\t\tthis.side = source.side;\n\t\tthis.vertexColors = source.vertexColors;\n\n\t\tthis.opacity = source.opacity;\n\t\tthis.transparent = source.transparent;\n\n\t\tthis.blendSrc = source.blendSrc;\n\t\tthis.blendDst = source.blendDst;\n\t\tthis.blendEquation = source.blendEquation;\n\t\tthis.blendSrcAlpha = source.blendSrcAlpha;\n\t\tthis.blendDstAlpha = source.blendDstAlpha;\n\t\tthis.blendEquationAlpha = source.blendEquationAlpha;\n\t\tthis.blendColor.copy( source.blendColor );\n\t\tthis.blendAlpha = source.blendAlpha;\n\n\t\tthis.depthFunc = source.depthFunc;\n\t\tthis.depthTest = source.depthTest;\n\t\tthis.depthWrite = source.depthWrite;\n\n\t\tthis.stencilWriteMask = source.stencilWriteMask;\n\t\tthis.stencilFunc = source.stencilFunc;\n\t\tthis.stencilRef = source.stencilRef;\n\t\tthis.stencilFuncMask = source.stencilFuncMask;\n\t\tthis.stencilFail = source.stencilFail;\n\t\tthis.stencilZFail = source.stencilZFail;\n\t\tthis.stencilZPass = source.stencilZPass;\n\t\tthis.stencilWrite = source.stencilWrite;\n\n\t\tconst srcPlanes = source.clippingPlanes;\n\t\tlet dstPlanes = null;\n\n\t\tif ( srcPlanes !== null ) {\n\n\t\t\tconst n = srcPlanes.length;\n\t\t\tdstPlanes = new Array( n );\n\n\t\t\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\t\t\tdstPlanes[ i ] = srcPlanes[ i ].clone();\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.clippingPlanes = dstPlanes;\n\t\tthis.clipIntersection = source.clipIntersection;\n\t\tthis.clipShadows = source.clipShadows;\n\n\t\tthis.shadowSide = source.shadowSide;\n\n\t\tthis.colorWrite = source.colorWrite;\n\n\t\tthis.precision = source.precision;\n\n\t\tthis.polygonOffset = source.polygonOffset;\n\t\tthis.polygonOffsetFactor = source.polygonOffsetFactor;\n\t\tthis.polygonOffsetUnits = source.polygonOffsetUnits;\n\n\t\tthis.dithering = source.dithering;\n\n\t\tthis.alphaTest = source.alphaTest;\n\t\tthis.alphaHash = source.alphaHash;\n\t\tthis.alphaToCoverage = source.alphaToCoverage;\n\t\tthis.premultipliedAlpha = source.premultipliedAlpha;\n\t\tthis.forceSinglePass = source.forceSinglePass;\n\n\t\tthis.visible = source.visible;\n\n\t\tthis.toneMapped = source.toneMapped;\n\n\t\tthis.userData = JSON.parse( JSON.stringify( source.userData ) );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t *\n\t * @fires Material#dispose\n\t */\n\tdispose() {\n\n\t\t/**\n\t\t * Fires when the material has been disposed of.\n\t\t *\n\t\t * @event Material#dispose\n\t\t * @type {Object}\n\t\t */\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n\t/**\n\t * Setting this property to `true` indicates the engine the material\n\t * needs to be recompiled.\n\t *\n\t * @type {boolean}\n\t * @default false\n\t * @param {boolean} value\n\t */\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n}\n\n/**\n * A material for drawing geometries in a simple shaded (flat or wireframe) way.\n *\n * This material is not affected by lights.\n *\n * @augments Material\n * @demo scenes/material-browser.html#MeshBasicMaterial\n */\nclass MeshBasicMaterial extends Material {\n\n\t/**\n\t * Constructs a new mesh basic material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshBasicMaterial = true;\n\n\t\tthis.type = 'MeshBasicMaterial';\n\n\t\t/**\n\t\t * Color of the material.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\n\t\t/**\n\t\t * The color map. May optionally include an alpha channel, typically combined\n\t\t * with {@link Material#transparent} or {@link Material#alphaTest}. The texture map\n\t\t * color is modulated by the diffuse `color`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * The light map. Requires a second set of UVs.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.lightMap = null;\n\n\t\t/**\n\t\t * Intensity of the baked light.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\t/**\n\t\t * The red channel of this texture is used as the ambient occlusion map.\n\t\t * Requires a second set of UVs.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.aoMap = null;\n\n\t\t/**\n\t\t * Intensity of the ambient occlusion effect. Range is `[0,1]`, where `0`\n\t\t * disables ambient occlusion. Where intensity is `1` and the AO map's\n\t\t * red channel is also `1`, ambient light is fully occluded on a surface.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\t/**\n\t\t * Specular map used by the material.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.specularMap = null;\n\n\t\t/**\n\t\t * The alpha map is a grayscale texture that controls the opacity across the\n\t\t * surface (black: fully transparent; white: fully opaque).\n\t\t *\n\t\t * Only the color of the texture is used, ignoring the alpha channel if one\n\t\t * exists. For RGB and RGBA textures, the renderer will use the green channel\n\t\t * when sampling this texture due to the extra bit of precision provided for\n\t\t * green in DXT-compressed and uncompressed RGB 565 formats. Luminance-only and\n\t\t * luminance/alpha textures will also still work as expected.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.alphaMap = null;\n\n\t\t/**\n\t\t * The environment map.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.envMap = null;\n\n\t\t/**\n\t\t * The rotation of the environment map in radians.\n\t\t *\n\t\t * @type {Euler}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.envMapRotation = new Euler();\n\n\t\t/**\n\t\t * How to combine the result of the surface's color with the environment map, if any.\n\t\t *\n\t\t * When set to `MixOperation`, the {@link MeshBasicMaterial#reflectivity} is used to\n\t\t * blend between the two colors.\n\t\t *\n\t\t * @type {(MultiplyOperation|MixOperation|AddOperation)}\n\t\t * @default MultiplyOperation\n\t\t */\n\t\tthis.combine = MultiplyOperation;\n\n\t\t/**\n\t\t * How much the environment map affects the surface.\n\t\t * The valid range is between `0` (no reflections) and `1` (full reflections).\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.reflectivity = 1;\n\n\t\t/**\n\t\t * The index of refraction (IOR) of air (approximately 1) divided by the\n\t\t * index of refraction of the material. It is used with environment mapping\n\t\t * modes {@link CubeRefractionMapping} and {@link EquirectangularRefractionMapping}.\n\t\t * The refraction ratio should not exceed `1`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.98\n\t\t */\n\t\tthis.refractionRatio = 0.98;\n\n\t\t/**\n\t\t * Renders the geometry as a wireframe.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.wireframe = false;\n\n\t\t/**\n\t\t * Controls the thickness of the wireframe.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.wireframeLinewidth = 1;\n\n\t\t/**\n\t\t * Defines appearance of wireframe ends.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.wireframeLinecap = 'round';\n\n\t\t/**\n\t\t * Defines appearance of wireframe joints.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\t/**\n\t\t * Whether the material is affected by fog or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.specularMap = source.specularMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.envMapRotation.copy( source.envMapRotation );\n\t\tthis.combine = source.combine;\n\t\tthis.reflectivity = source.reflectivity;\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\n// Fast Half Float Conversions, http://www.fox-toolkit.org/ftp/fasthalffloatconversion.pdf\n\nconst _tables = /*@__PURE__*/ _generateTables();\n\nfunction _generateTables() {\n\n\t// float32 to float16 helpers\n\n\tconst buffer = new ArrayBuffer( 4 );\n\tconst floatView = new Float32Array( buffer );\n\tconst uint32View = new Uint32Array( buffer );\n\n\tconst baseTable = new Uint32Array( 512 );\n\tconst shiftTable = new Uint32Array( 512 );\n\n\tfor ( let i = 0; i < 256; ++ i ) {\n\n\t\tconst e = i - 127;\n\n\t\t// very small number (0, -0)\n\n\t\tif ( e < -27 ) {\n\n\t\t\tbaseTable[ i ] = 0x0000;\n\t\t\tbaseTable[ i | 0x100 ] = 0x8000;\n\t\t\tshiftTable[ i ] = 24;\n\t\t\tshiftTable[ i | 0x100 ] = 24;\n\n\t\t\t// small number (denorm)\n\n\t\t} else if ( e < -14 ) {\n\n\t\t\tbaseTable[ i ] = 0x0400 >> ( - e - 14 );\n\t\t\tbaseTable[ i | 0x100 ] = ( 0x0400 >> ( - e - 14 ) ) | 0x8000;\n\t\t\tshiftTable[ i ] = - e - 1;\n\t\t\tshiftTable[ i | 0x100 ] = - e - 1;\n\n\t\t\t// normal number\n\n\t\t} else if ( e <= 15 ) {\n\n\t\t\tbaseTable[ i ] = ( e + 15 ) << 10;\n\t\t\tbaseTable[ i | 0x100 ] = ( ( e + 15 ) << 10 ) | 0x8000;\n\t\t\tshiftTable[ i ] = 13;\n\t\t\tshiftTable[ i | 0x100 ] = 13;\n\n\t\t\t// large number (Infinity, -Infinity)\n\n\t\t} else if ( e < 128 ) {\n\n\t\t\tbaseTable[ i ] = 0x7c00;\n\t\t\tbaseTable[ i | 0x100 ] = 0xfc00;\n\t\t\tshiftTable[ i ] = 24;\n\t\t\tshiftTable[ i | 0x100 ] = 24;\n\n\t\t\t// stay (NaN, Infinity, -Infinity)\n\n\t\t} else {\n\n\t\t\tbaseTable[ i ] = 0x7c00;\n\t\t\tbaseTable[ i | 0x100 ] = 0xfc00;\n\t\t\tshiftTable[ i ] = 13;\n\t\t\tshiftTable[ i | 0x100 ] = 13;\n\n\t\t}\n\n\t}\n\n\t// float16 to float32 helpers\n\n\tconst mantissaTable = new Uint32Array( 2048 );\n\tconst exponentTable = new Uint32Array( 64 );\n\tconst offsetTable = new Uint32Array( 64 );\n\n\tfor ( let i = 1; i < 1024; ++ i ) {\n\n\t\tlet m = i << 13; // zero pad mantissa bits\n\t\tlet e = 0; // zero exponent\n\n\t\t// normalized\n\t\twhile ( ( m & 0x00800000 ) === 0 ) {\n\n\t\t\tm <<= 1;\n\t\t\te -= 0x00800000; // decrement exponent\n\n\t\t}\n\n\t\tm &= -8388609; // clear leading 1 bit\n\t\te += 0x38800000; // adjust bias\n\n\t\tmantissaTable[ i ] = m | e;\n\n\t}\n\n\tfor ( let i = 1024; i < 2048; ++ i ) {\n\n\t\tmantissaTable[ i ] = 0x38000000 + ( ( i - 1024 ) << 13 );\n\n\t}\n\n\tfor ( let i = 1; i < 31; ++ i ) {\n\n\t\texponentTable[ i ] = i << 23;\n\n\t}\n\n\texponentTable[ 31 ] = 0x47800000;\n\texponentTable[ 32 ] = 0x80000000;\n\n\tfor ( let i = 33; i < 63; ++ i ) {\n\n\t\texponentTable[ i ] = 0x80000000 + ( ( i - 32 ) << 23 );\n\n\t}\n\n\texponentTable[ 63 ] = 0xc7800000;\n\n\tfor ( let i = 1; i < 64; ++ i ) {\n\n\t\tif ( i !== 32 ) {\n\n\t\t\toffsetTable[ i ] = 1024;\n\n\t\t}\n\n\t}\n\n\treturn {\n\t\tfloatView: floatView,\n\t\tuint32View: uint32View,\n\t\tbaseTable: baseTable,\n\t\tshiftTable: shiftTable,\n\t\tmantissaTable: mantissaTable,\n\t\texponentTable: exponentTable,\n\t\toffsetTable: offsetTable\n\t};\n\n}\n\n/**\n * Returns a half precision floating point value (FP16) from the given single\n * precision floating point value (FP32).\n *\n * @param {number} val - A single precision floating point value.\n * @return {number} The FP16 value.\n */\nfunction toHalfFloat( val ) {\n\n\tif ( Math.abs( val ) > 65504 ) warn( 'DataUtils.toHalfFloat(): Value out of range.' );\n\n\tval = clamp( val, -65504, 65504 );\n\n\t_tables.floatView[ 0 ] = val;\n\tconst f = _tables.uint32View[ 0 ];\n\tconst e = ( f >> 23 ) & 0x1ff;\n\treturn _tables.baseTable[ e ] + ( ( f & 0x007fffff ) >> _tables.shiftTable[ e ] );\n\n}\n\n/**\n * Returns a single precision floating point value (FP32) from the given half\n * precision floating point value (FP16).\n *\n * @param {number} val - A half precision floating point value.\n * @return {number} The FP32 value.\n */\nfunction fromHalfFloat( val ) {\n\n\tconst m = val >> 10;\n\t_tables.uint32View[ 0 ] = _tables.mantissaTable[ _tables.offsetTable[ m ] + ( val & 0x3ff ) ] + _tables.exponentTable[ m ];\n\treturn _tables.floatView[ 0 ];\n\n}\n\n/**\n * A class containing utility functions for data.\n *\n * @hideconstructor\n */\nclass DataUtils {\n\n\t/**\n\t * Returns a half precision floating point value (FP16) from the given single\n\t * precision floating point value (FP32).\n\t *\n\t * @param {number} val - A single precision floating point value.\n\t * @return {number} The FP16 value.\n\t */\n\tstatic toHalfFloat( val ) {\n\n\t\treturn toHalfFloat( val );\n\n\t}\n\n\t/**\n\t * Returns a single precision floating point value (FP32) from the given half\n\t * precision floating point value (FP16).\n\t *\n\t * @param {number} val - A half precision floating point value.\n\t * @return {number} The FP32 value.\n\t */\n\tstatic fromHalfFloat( val ) {\n\n\t\treturn fromHalfFloat( val );\n\n\t}\n\n}\n\nconst _vector$9 = /*@__PURE__*/ new Vector3();\nconst _vector2$1 = /*@__PURE__*/ new Vector2();\n\nlet _id$3 = 0;\n\n/**\n * This class stores data for an attribute (such as vertex positions, face\n * indices, normals, colors, UVs, and any custom attributes ) associated with\n * a geometry, which allows for more efficient passing of data to the GPU.\n *\n * When working with vector-like data, the `fromBufferAttribute( attribute, index )`\n * helper methods on vector and color class might be helpful. E.g. {@link Vector3#fromBufferAttribute}.\n */\nclass BufferAttribute {\n\n\t/**\n\t * Constructs a new buffer attribute.\n\t *\n\t * @param {TypedArray} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( array, itemSize, normalized = false ) {\n\n\t\tif ( Array.isArray( array ) ) {\n\n\t\t\tthrow new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' );\n\n\t\t}\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isBufferAttribute = true;\n\n\t\t/**\n\t\t * The ID of the buffer attribute.\n\t\t *\n\t\t * @name BufferAttribute#id\n\t\t * @type {number}\n\t\t * @readonly\n\t\t */\n\t\tObject.defineProperty( this, 'id', { value: _id$3 ++ } );\n\n\t\t/**\n\t\t * The name of the buffer attribute.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\n\t\t/**\n\t\t * The array holding the attribute data. It should have `itemSize * numVertices`\n\t\t * elements, where `numVertices` is the number of vertices in the associated geometry.\n\t\t *\n\t\t * @type {TypedArray}\n\t\t */\n\t\tthis.array = array;\n\n\t\t/**\n\t\t * The number of values of the array that should be associated with a particular vertex.\n\t\t * For instance, if this attribute is storing a 3-component vector (such as a position,\n\t\t * normal, or color), then the value should be `3`.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.itemSize = itemSize;\n\n\t\t/**\n\t\t * Represents the number of items this buffer attribute stores. It is internally computed\n\t\t * by dividing the `array` length by the `itemSize`.\n\t\t *\n\t\t * @type {number}\n\t\t * @readonly\n\t\t */\n\t\tthis.count = array !== undefined ? array.length / itemSize : 0;\n\n\t\t/**\n\t\t * Applies to integer data only. Indicates how the underlying data in the buffer maps to\n\t\t * the values in the GLSL code. For instance, if `array` is an instance of `UInt16Array`,\n\t\t * and `normalized` is `true`, the values `0 - +65535` in the array data will be mapped to\n\t\t * `0.0f - +1.0f` in the GLSL attribute. If `normalized` is `false`, the values will be converted\n\t\t * to floats unmodified, i.e. `65535` becomes `65535.0f`.\n\t\t *\n\t\t * @type {boolean}\n\t\t */\n\t\tthis.normalized = normalized;\n\n\t\t/**\n\t\t * Defines the intended usage pattern of the data store for optimization purposes.\n\t\t *\n\t\t * Note: After the initial use of a buffer, its usage cannot be changed. Instead,\n\t\t * instantiate a new one and set the desired usage before the next render.\n\t\t *\n\t\t * @type {(StaticDrawUsage|DynamicDrawUsage|StreamDrawUsage|StaticReadUsage|DynamicReadUsage|StreamReadUsage|StaticCopyUsage|DynamicCopyUsage|StreamCopyUsage)}\n\t\t * @default StaticDrawUsage\n\t\t */\n\t\tthis.usage = StaticDrawUsage;\n\n\t\t/**\n\t\t * This can be used to only update some components of stored vectors (for example, just the\n\t\t * component related to color). Use the `addUpdateRange()` function to add ranges to this array.\n\t\t *\n\t\t * @type {Array<Object>}\n\t\t */\n\t\tthis.updateRanges = [];\n\n\t\t/**\n\t\t * Configures the bound GPU type for use in shaders.\n\t\t *\n\t\t * Note: this only has an effect for integer arrays and is not configurable for float arrays.\n\t\t * For lower precision float types, use `Float16BufferAttribute`.\n\t\t *\n\t\t * @type {(FloatType|IntType)}\n\t\t * @default FloatType\n\t\t */\n\t\tthis.gpuType = FloatType;\n\n\t\t/**\n\t\t * A version number, incremented every time the `needsUpdate` is set to `true`.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.version = 0;\n\n\t}\n\n\t/**\n\t * A callback function that is executed after the renderer has transferred the attribute\n\t * array data to the GPU.\n\t */\n\tonUploadCallback() {}\n\n\t/**\n\t * Flag to indicate that this attribute has changed and should be re-sent to\n\t * the GPU. Set this to `true` when you modify the value of the array.\n\t *\n\t * @type {number}\n\t * @default false\n\t * @param {boolean} value\n\t */\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n\t/**\n\t * Sets the usage of this buffer attribute.\n\t *\n\t * @param {(StaticDrawUsage|DynamicDrawUsage|StreamDrawUsage|StaticReadUsage|DynamicReadUsage|StreamReadUsage|StaticCopyUsage|DynamicCopyUsage|StreamCopyUsage)} value - The usage to set.\n\t * @return {BufferAttribute} A reference to this buffer attribute.\n\t */\n\tsetUsage( value ) {\n\n\t\tthis.usage = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds a range of data in the data array to be updated on the GPU.\n\t *\n\t * @param {number} start - Position at which to start update.\n\t * @param {number} count - The number of components to update.\n\t */\n\taddUpdateRange( start, count ) {\n\n\t\tthis.updateRanges.push( { start, count } );\n\n\t}\n\n\t/**\n\t * Clears the update ranges.\n\t */\n\tclearUpdateRanges() {\n\n\t\tthis.updateRanges.length = 0;\n\n\t}\n\n\t/**\n\t * Copies the values of the given buffer attribute to this instance.\n\t *\n\t * @param {BufferAttribute} source - The buffer attribute to copy.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tcopy( source ) {\n\n\t\tthis.name = source.name;\n\t\tthis.array = new source.array.constructor( source.array );\n\t\tthis.itemSize = source.itemSize;\n\t\tthis.count = source.count;\n\t\tthis.normalized = source.normalized;\n\n\t\tthis.usage = source.usage;\n\t\tthis.gpuType = source.gpuType;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies a vector from the given buffer attribute to this one. The start\n\t * and destination position in the attribute buffers are represented by the\n\t * given indices.\n\t *\n\t * @param {number} index1 - The destination index into this buffer attribute.\n\t * @param {BufferAttribute} attribute - The buffer attribute to copy from.\n\t * @param {number} index2 - The source index into the given buffer attribute.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tcopyAt( index1, attribute, index2 ) {\n\n\t\tindex1 *= this.itemSize;\n\t\tindex2 *= attribute.itemSize;\n\n\t\tfor ( let i = 0, l = this.itemSize; i < l; i ++ ) {\n\n\t\t\tthis.array[ index1 + i ] = attribute.array[ index2 + i ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the given array data into this buffer attribute.\n\t *\n\t * @param {(TypedArray|Array)} array - The array to copy.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tcopyArray( array ) {\n\n\t\tthis.array.set( array );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Applies the given 3x3 matrix to the given attribute. Works with\n\t * item size `2` and `3`.\n\t *\n\t * @param {Matrix3} m - The matrix to apply.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tapplyMatrix3( m ) {\n\n\t\tif ( this.itemSize === 2 ) {\n\n\t\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t\t_vector2$1.fromBufferAttribute( this, i );\n\t\t\t\t_vector2$1.applyMatrix3( m );\n\n\t\t\t\tthis.setXY( i, _vector2$1.x, _vector2$1.y );\n\n\t\t\t}\n\n\t\t} else if ( this.itemSize === 3 ) {\n\n\t\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t\t_vector$9.fromBufferAttribute( this, i );\n\t\t\t\t_vector$9.applyMatrix3( m );\n\n\t\t\t\tthis.setXYZ( i, _vector$9.x, _vector$9.y, _vector$9.z );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Applies the given 4x4 matrix to the given attribute. Only works with\n\t * item size `3`.\n\t *\n\t * @param {Matrix4} m - The matrix to apply.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tapplyMatrix4( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$9.fromBufferAttribute( this, i );\n\n\t\t\t_vector$9.applyMatrix4( m );\n\n\t\t\tthis.setXYZ( i, _vector$9.x, _vector$9.y, _vector$9.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Applies the given 3x3 normal matrix to the given attribute. Only works with\n\t * item size `3`.\n\t *\n\t * @param {Matrix3} m - The normal matrix to apply.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tapplyNormalMatrix( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$9.fromBufferAttribute( this, i );\n\n\t\t\t_vector$9.applyNormalMatrix( m );\n\n\t\t\tthis.setXYZ( i, _vector$9.x, _vector$9.y, _vector$9.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Applies the given 4x4 matrix to the given attribute. Only works with\n\t * item size `3` and with direction vectors.\n\t *\n\t * @param {Matrix4} m - The matrix to apply.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\ttransformDirection( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$9.fromBufferAttribute( this, i );\n\n\t\t\t_vector$9.transformDirection( m );\n\n\t\t\tthis.setXYZ( i, _vector$9.x, _vector$9.y, _vector$9.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given array data in the buffer attribute.\n\t *\n\t * @param {(TypedArray|Array)} value - The array data to set.\n\t * @param {number} [offset=0] - The offset in this buffer attribute's array.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tset( value, offset = 0 ) {\n\n\t\t// Matching BufferAttribute constructor, do not normalize the array.\n\t\tthis.array.set( value, offset );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the given component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} component - The component index.\n\t * @return {number} The returned value.\n\t */\n\tgetComponent( index, component ) {\n\n\t\tlet value = this.array[ index * this.itemSize + component ];\n\n\t\tif ( this.normalized ) value = denormalize( value, this.array );\n\n\t\treturn value;\n\n\t}\n\n\t/**\n\t * Sets the given value to the given component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} component - The component index.\n\t * @param {number} value - The value to set.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetComponent( index, component, value ) {\n\n\t\tif ( this.normalized ) value = normalize( value, this.array );\n\n\t\tthis.array[ index * this.itemSize + component ] = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the x component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @return {number} The x component.\n\t */\n\tgetX( index ) {\n\n\t\tlet x = this.array[ index * this.itemSize ];\n\n\t\tif ( this.normalized ) x = denormalize( x, this.array );\n\n\t\treturn x;\n\n\t}\n\n\t/**\n\t * Sets the x component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} x - The value to set.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetX( index, x ) {\n\n\t\tif ( this.normalized ) x = normalize( x, this.array );\n\n\t\tthis.array[ index * this.itemSize ] = x;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the y component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @return {number} The y component.\n\t */\n\tgetY( index ) {\n\n\t\tlet y = this.array[ index * this.itemSize + 1 ];\n\n\t\tif ( this.normalized ) y = denormalize( y, this.array );\n\n\t\treturn y;\n\n\t}\n\n\t/**\n\t * Sets the y component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} y - The value to set.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetY( index, y ) {\n\n\t\tif ( this.normalized ) y = normalize( y, this.array );\n\n\t\tthis.array[ index * this.itemSize + 1 ] = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the z component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @return {number} The z component.\n\t */\n\tgetZ( index ) {\n\n\t\tlet z = this.array[ index * this.itemSize + 2 ];\n\n\t\tif ( this.normalized ) z = denormalize( z, this.array );\n\n\t\treturn z;\n\n\t}\n\n\t/**\n\t * Sets the z component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} z - The value to set.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetZ( index, z ) {\n\n\t\tif ( this.normalized ) z = normalize( z, this.array );\n\n\t\tthis.array[ index * this.itemSize + 2 ] = z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the w component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @return {number} The w component.\n\t */\n\tgetW( index ) {\n\n\t\tlet w = this.array[ index * this.itemSize + 3 ];\n\n\t\tif ( this.normalized ) w = denormalize( w, this.array );\n\n\t\treturn w;\n\n\t}\n\n\t/**\n\t * Sets the w component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} w - The value to set.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetW( index, w ) {\n\n\t\tif ( this.normalized ) w = normalize( w, this.array );\n\n\t\tthis.array[ index * this.itemSize + 3 ] = w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the x and y component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} x - The value for the x component to set.\n\t * @param {number} y - The value for the y component to set.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetXY( index, x, y ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\n\t\t}\n\n\t\tthis.array[ index + 0 ] = x;\n\t\tthis.array[ index + 1 ] = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the x, y and z component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} x - The value for the x component to set.\n\t * @param {number} y - The value for the y component to set.\n\t * @param {number} z - The value for the z component to set.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetXYZ( index, x, y, z ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\t\t\tz = normalize( z, this.array );\n\n\t\t}\n\n\t\tthis.array[ index + 0 ] = x;\n\t\tthis.array[ index + 1 ] = y;\n\t\tthis.array[ index + 2 ] = z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the x, y, z and w component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} x - The value for the x component to set.\n\t * @param {number} y - The value for the y component to set.\n\t * @param {number} z - The value for the z component to set.\n\t * @param {number} w - The value for the w component to set.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetXYZW( index, x, y, z, w ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\t\t\tz = normalize( z, this.array );\n\t\t\tw = normalize( w, this.array );\n\n\t\t}\n\n\t\tthis.array[ index + 0 ] = x;\n\t\tthis.array[ index + 1 ] = y;\n\t\tthis.array[ index + 2 ] = z;\n\t\tthis.array[ index + 3 ] = w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given callback function that is executed after the Renderer has transferred\n\t * the attribute array data to the GPU. Can be used to perform clean-up operations after\n\t * the upload when attribute data are not needed anymore on the CPU side.\n\t *\n\t * @param {Function} callback - The `onUpload()` callback.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tonUpload( callback ) {\n\n\t\tthis.onUploadCallback = callback;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new buffer attribute with copied values from this instance.\n\t *\n\t * @return {BufferAttribute} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor( this.array, this.itemSize ).copy( this );\n\n\t}\n\n\t/**\n\t * Serializes the buffer attribute into JSON.\n\t *\n\t * @return {Object} A JSON object representing the serialized buffer attribute.\n\t */\n\ttoJSON() {\n\n\t\tconst data = {\n\t\t\titemSize: this.itemSize,\n\t\t\ttype: this.array.constructor.name,\n\t\t\tarray: Array.from( this.array ),\n\t\t\tnormalized: this.normalized\n\t\t};\n\n\t\tif ( this.name !== '' ) data.name = this.name;\n\t\tif ( this.usage !== StaticDrawUsage ) data.usage = this.usage;\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * Convenient class that can be used when creating a `Int8` buffer attribute with\n * a plain `Array` instance.\n *\n * @augments BufferAttribute\n */\nclass Int8BufferAttribute extends BufferAttribute {\n\n\t/**\n\t * Constructs a new buffer attribute.\n\t *\n\t * @param {(Array<number>|Int8Array)} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Int8Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\n/**\n * Convenient class that can be used when creating a `UInt8` buffer attribute with\n * a plain `Array` instance.\n *\n * @augments BufferAttribute\n */\nclass Uint8BufferAttribute extends BufferAttribute {\n\n\t/**\n\t * Constructs a new buffer attribute.\n\t *\n\t * @param {(Array<number>|Uint8Array)} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint8Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\n/**\n * Convenient class that can be used when creating a `UInt8Clamped` buffer attribute with\n * a plain `Array` instance.\n *\n * @augments BufferAttribute\n */\nclass Uint8ClampedBufferAttribute extends BufferAttribute {\n\n\t/**\n\t * Constructs a new buffer attribute.\n\t *\n\t * @param {(Array<number>|Uint8ClampedArray)} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint8ClampedArray( array ), itemSize, normalized );\n\n\t}\n\n}\n\n/**\n * Convenient class that can be used when creating a `Int16` buffer attribute with\n * a plain `Array` instance.\n *\n * @augments BufferAttribute\n */\nclass Int16BufferAttribute extends BufferAttribute {\n\n\t/**\n\t * Constructs a new buffer attribute.\n\t *\n\t * @param {(Array<number>|Int16Array)} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Int16Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\n/**\n * Convenient class that can be used when creating a `UInt16` buffer attribute with\n * a plain `Array` instance.\n *\n * @augments BufferAttribute\n */\nclass Uint16BufferAttribute extends BufferAttribute {\n\n\t/**\n\t * Constructs a new buffer attribute.\n\t *\n\t * @param {(Array<number>|Uint16Array)} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint16Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\n/**\n * Convenient class that can be used when creating a `Int32` buffer attribute with\n * a plain `Array` instance.\n *\n * @augments BufferAttribute\n */\nclass Int32BufferAttribute extends BufferAttribute {\n\n\t/**\n\t * Constructs a new buffer attribute.\n\t *\n\t * @param {(Array<number>|Int32Array)} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Int32Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\n/**\n * Convenient class that can be used when creating a `UInt32` buffer attribute with\n * a plain `Array` instance.\n *\n * @augments BufferAttribute\n */\nclass Uint32BufferAttribute extends BufferAttribute {\n\n\t/**\n\t * Constructs a new buffer attribute.\n\t *\n\t * @param {(Array<number>|Uint32Array)} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint32Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\n/**\n * Convenient class that can be used when creating a `Float16` buffer attribute with\n * a plain `Array` instance.\n *\n * This class automatically converts to and from FP16 via `Uint16Array` since `Float16Array`\n * browser support is still problematic.\n *\n * @augments BufferAttribute\n */\nclass Float16BufferAttribute extends BufferAttribute {\n\n\t/**\n\t * Constructs a new buffer attribute.\n\t *\n\t * @param {(Array<number>|Uint16Array)} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint16Array( array ), itemSize, normalized );\n\n\t\tthis.isFloat16BufferAttribute = true;\n\n\t}\n\n\tgetX( index ) {\n\n\t\tlet x = fromHalfFloat( this.array[ index * this.itemSize ] );\n\n\t\tif ( this.normalized ) x = denormalize( x, this.array );\n\n\t\treturn x;\n\n\t}\n\n\tsetX( index, x ) {\n\n\t\tif ( this.normalized ) x = normalize( x, this.array );\n\n\t\tthis.array[ index * this.itemSize ] = toHalfFloat( x );\n\n\t\treturn this;\n\n\t}\n\n\tgetY( index ) {\n\n\t\tlet y = fromHalfFloat( this.array[ index * this.itemSize + 1 ] );\n\n\t\tif ( this.normalized ) y = denormalize( y, this.array );\n\n\t\treturn y;\n\n\t}\n\n\tsetY( index, y ) {\n\n\t\tif ( this.normalized ) y = normalize( y, this.array );\n\n\t\tthis.array[ index * this.itemSize + 1 ] = toHalfFloat( y );\n\n\t\treturn this;\n\n\t}\n\n\tgetZ( index ) {\n\n\t\tlet z = fromHalfFloat( this.array[ index * this.itemSize + 2 ] );\n\n\t\tif ( this.normalized ) z = denormalize( z, this.array );\n\n\t\treturn z;\n\n\t}\n\n\tsetZ( index, z ) {\n\n\t\tif ( this.normalized ) z = normalize( z, this.array );\n\n\t\tthis.array[ index * this.itemSize + 2 ] = toHalfFloat( z );\n\n\t\treturn this;\n\n\t}\n\n\tgetW( index ) {\n\n\t\tlet w = fromHalfFloat( this.array[ index * this.itemSize + 3 ] );\n\n\t\tif ( this.normalized ) w = denormalize( w, this.array );\n\n\t\treturn w;\n\n\t}\n\n\tsetW( index, w ) {\n\n\t\tif ( this.normalized ) w = normalize( w, this.array );\n\n\t\tthis.array[ index * this.itemSize + 3 ] = toHalfFloat( w );\n\n\t\treturn this;\n\n\t}\n\n\tsetXY( index, x, y ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\n\t\t}\n\n\t\tthis.array[ index + 0 ] = toHalfFloat( x );\n\t\tthis.array[ index + 1 ] = toHalfFloat( y );\n\n\t\treturn this;\n\n\t}\n\n\tsetXYZ( index, x, y, z ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\t\t\tz = normalize( z, this.array );\n\n\t\t}\n\n\t\tthis.array[ index + 0 ] = toHalfFloat( x );\n\t\tthis.array[ index + 1 ] = toHalfFloat( y );\n\t\tthis.array[ index + 2 ] = toHalfFloat( z );\n\n\t\treturn this;\n\n\t}\n\n\tsetXYZW( index, x, y, z, w ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\t\t\tz = normalize( z, this.array );\n\t\t\tw = normalize( w, this.array );\n\n\t\t}\n\n\t\tthis.array[ index + 0 ] = toHalfFloat( x );\n\t\tthis.array[ index + 1 ] = toHalfFloat( y );\n\t\tthis.array[ index + 2 ] = toHalfFloat( z );\n\t\tthis.array[ index + 3 ] = toHalfFloat( w );\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * Convenient class that can be used when creating a `Float32` buffer attribute with\n * a plain `Array` instance.\n *\n * @augments BufferAttribute\n */\nclass Float32BufferAttribute extends BufferAttribute {\n\n\t/**\n\t * Constructs a new buffer attribute.\n\t *\n\t * @param {(Array<number>|Float32Array)} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Float32Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nlet _id$2 = 0;\n\nconst _m1$2 = /*@__PURE__*/ new Matrix4();\nconst _obj = /*@__PURE__*/ new Object3D();\nconst _offset = /*@__PURE__*/ new Vector3();\nconst _box$2 = /*@__PURE__*/ new Box3();\nconst _boxMorphTargets = /*@__PURE__*/ new Box3();\nconst _vector$8 = /*@__PURE__*/ new Vector3();\n\n/**\n * A representation of mesh, line, or point geometry. Includes vertex\n * positions, face indices, normals, colors, UVs, and custom attributes\n * within buffers, reducing the cost of passing all this data to the GPU.\n *\n * ```js\n * const geometry = new THREE.BufferGeometry();\n * // create a simple square shape. We duplicate the top left and bottom right\n * // vertices because each vertex needs to appear once per triangle.\n * const vertices = new Float32Array( [\n * \t-1.0, -1.0,  1.0, // v0\n * \t 1.0, -1.0,  1.0, // v1\n * \t 1.0,  1.0,  1.0, // v2\n *\n * \t 1.0,  1.0,  1.0, // v3\n * \t-1.0,  1.0,  1.0, // v4\n * \t-1.0, -1.0,  1.0  // v5\n * ] );\n * // itemSize = 3 because there are 3 values (components) per vertex\n * geometry.setAttribute( 'position', new THREE.BufferAttribute( vertices, 3 ) );\n * const material = new THREE.MeshBasicMaterial( { color: 0xff0000 } );\n * const mesh = new THREE.Mesh( geometry, material );\n * ```\n *\n * @augments EventDispatcher\n */\nclass BufferGeometry extends EventDispatcher {\n\n\t/**\n\t * Constructs a new geometry.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isBufferGeometry = true;\n\n\t\t/**\n\t\t * The ID of the geometry.\n\t\t *\n\t\t * @name BufferGeometry#id\n\t\t * @type {number}\n\t\t * @readonly\n\t\t */\n\t\tObject.defineProperty( this, 'id', { value: _id$2 ++ } );\n\n\t\t/**\n\t\t * The UUID of the geometry.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.uuid = generateUUID();\n\n\t\t/**\n\t\t * The name of the geometry.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\t\tthis.type = 'BufferGeometry';\n\n\t\t/**\n\t\t * Allows for vertices to be re-used across multiple triangles; this is\n\t\t * called using \"indexed triangles\". Each triangle is associated with the\n\t\t * indices of three vertices. This attribute therefore stores the index of\n\t\t * each vertex for each triangular face. If this attribute is not set, the\n\t\t * renderer assumes that each three contiguous positions represent a single triangle.\n\t\t *\n\t\t * @type {?BufferAttribute}\n\t\t * @default null\n\t\t */\n\t\tthis.index = null;\n\n\t\t/**\n\t\t * A (storage) buffer attribute which was generated with a compute shader and\n\t\t * now defines indirect draw calls.\n\t\t *\n\t\t * Can only be used with {@link WebGPURenderer} and a WebGPU backend.\n\t\t *\n\t\t * @type {?BufferAttribute}\n\t\t * @default null\n\t\t */\n\t\tthis.indirect = null;\n\n\t\t/**\n\t\t * This dictionary has as id the name of the attribute to be set and as value\n\t\t * the buffer attribute to set it to. Rather than accessing this property directly,\n\t\t * use `setAttribute()` and `getAttribute()` to access attributes of this geometry.\n\t\t *\n\t\t * @type {Object<string,(BufferAttribute|InterleavedBufferAttribute)>}\n\t\t */\n\t\tthis.attributes = {};\n\n\t\t/**\n\t\t * This dictionary holds the morph targets of the geometry.\n\t\t *\n\t\t * Note: Once the geometry has been rendered, the morph attribute data cannot\n\t\t * be changed. You will have to call `dispose()?, and create a new geometry instance.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.morphAttributes = {};\n\n\t\t/**\n\t\t * Used to control the morph target behavior; when set to `true`, the morph\n\t\t * target data is treated as relative offsets, rather than as absolute\n\t\t * positions/normals.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.morphTargetsRelative = false;\n\n\t\t/**\n\t\t * Split the geometry into groups, each of which will be rendered in a\n\t\t * separate draw call. This allows an array of materials to be used with the geometry.\n\t\t *\n\t\t * Use `addGroup()` and `clearGroups()` to edit groups, rather than modifying this array directly.\n\t\t *\n\t\t * Every vertex and index must belong to exactly one group — groups must not share vertices or\n\t\t * indices, and must not leave vertices or indices unused.\n\t\t *\n\t\t * @type {Array<Object>}\n\t\t */\n\t\tthis.groups = [];\n\n\t\t/**\n\t\t * Bounding box for the geometry which can be calculated with `computeBoundingBox()`.\n\t\t *\n\t\t * @type {?Box3}\n\t\t * @default null\n\t\t */\n\t\tthis.boundingBox = null;\n\n\t\t/**\n\t\t * Bounding sphere for the geometry which can be calculated with `computeBoundingSphere()`.\n\t\t *\n\t\t * @type {?Sphere}\n\t\t * @default null\n\t\t */\n\t\tthis.boundingSphere = null;\n\n\t\t/**\n\t\t * Determines the part of the geometry to render. This should not be set directly,\n\t\t * instead use `setDrawRange()`.\n\t\t *\n\t\t * @type {{start:number,count:number}}\n\t\t */\n\t\tthis.drawRange = { start: 0, count: Infinity };\n\n\t\t/**\n\t\t * An object that can be used to store custom data about the geometry.\n\t\t * It should not hold references to functions as these will not be cloned.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.userData = {};\n\n\t}\n\n\t/**\n\t * Returns the index of this geometry.\n\t *\n\t * @return {?BufferAttribute} The index. Returns `null` if no index is defined.\n\t */\n\tgetIndex() {\n\n\t\treturn this.index;\n\n\t}\n\n\t/**\n\t * Sets the given index to this geometry.\n\t *\n\t * @param {Array<number>|BufferAttribute} index - The index to set.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tsetIndex( index ) {\n\n\t\tif ( Array.isArray( index ) ) {\n\n\t\t\tthis.index = new ( arrayNeedsUint32( index ) ? Uint32BufferAttribute : Uint16BufferAttribute )( index, 1 );\n\n\t\t} else {\n\n\t\t\tthis.index = index;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given indirect attribute to this geometry.\n\t *\n\t * @param {BufferAttribute} indirect - The attribute holding indirect draw calls.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tsetIndirect( indirect ) {\n\n\t\tthis.indirect = indirect;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the indirect attribute of this geometry.\n\t *\n\t * @return {?BufferAttribute} The indirect attribute. Returns `null` if no indirect attribute is defined.\n\t */\n\tgetIndirect() {\n\n\t\treturn this.indirect;\n\n\t}\n\n\t/**\n\t * Returns the buffer attribute for the given name.\n\t *\n\t * @param {string} name - The attribute name.\n\t * @return {BufferAttribute|InterleavedBufferAttribute|undefined} The buffer attribute.\n\t * Returns `undefined` if not attribute has been found.\n\t */\n\tgetAttribute( name ) {\n\n\t\treturn this.attributes[ name ];\n\n\t}\n\n\t/**\n\t * Sets the given attribute for the given name.\n\t *\n\t * @param {string} name - The attribute name.\n\t * @param {BufferAttribute|InterleavedBufferAttribute} attribute - The attribute to set.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tsetAttribute( name, attribute ) {\n\n\t\tthis.attributes[ name ] = attribute;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Deletes the attribute for the given name.\n\t *\n\t * @param {string} name - The attribute name to delete.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tdeleteAttribute( name ) {\n\n\t\tdelete this.attributes[ name ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this geometry has an attribute for the given name.\n\t *\n\t * @param {string} name - The attribute name.\n\t * @return {boolean} Whether this geometry has an attribute for the given name or not.\n\t */\n\thasAttribute( name ) {\n\n\t\treturn this.attributes[ name ] !== undefined;\n\n\t}\n\n\t/**\n\t * Adds a group to this geometry.\n\t *\n\t * @param {number} start - The first element in this draw call. That is the first\n\t * vertex for non-indexed geometry, otherwise the first triangle index.\n\t * @param {number} count - Specifies how many vertices (or indices) are part of this group.\n\t * @param {number} [materialIndex=0] - The material array index to use.\n\t */\n\taddGroup( start, count, materialIndex = 0 ) {\n\n\t\tthis.groups.push( {\n\n\t\t\tstart: start,\n\t\t\tcount: count,\n\t\t\tmaterialIndex: materialIndex\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Clears all groups.\n\t */\n\tclearGroups() {\n\n\t\tthis.groups = [];\n\n\t}\n\n\t/**\n\t * Sets the draw range for this geometry.\n\t *\n\t * @param {number} start - The first vertex for non-indexed geometry, otherwise the first triangle index.\n\t * @param {number} count - For non-indexed BufferGeometry, `count` is the number of vertices to render.\n\t * For indexed BufferGeometry, `count` is the number of indices to render.\n\t */\n\tsetDrawRange( start, count ) {\n\n\t\tthis.drawRange.start = start;\n\t\tthis.drawRange.count = count;\n\n\t}\n\n\t/**\n\t * Applies the given 4x4 transformation matrix to the geometry.\n\t *\n\t * @param {Matrix4} matrix - The matrix to apply.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tapplyMatrix4( matrix ) {\n\n\t\tconst position = this.attributes.position;\n\n\t\tif ( position !== undefined ) {\n\n\t\t\tposition.applyMatrix4( matrix );\n\n\t\t\tposition.needsUpdate = true;\n\n\t\t}\n\n\t\tconst normal = this.attributes.normal;\n\n\t\tif ( normal !== undefined ) {\n\n\t\t\tconst normalMatrix = new Matrix3().getNormalMatrix( matrix );\n\n\t\t\tnormal.applyNormalMatrix( normalMatrix );\n\n\t\t\tnormal.needsUpdate = true;\n\n\t\t}\n\n\t\tconst tangent = this.attributes.tangent;\n\n\t\tif ( tangent !== undefined ) {\n\n\t\t\ttangent.transformDirection( matrix );\n\n\t\t\ttangent.needsUpdate = true;\n\n\t\t}\n\n\t\tif ( this.boundingBox !== null ) {\n\n\t\t\tthis.computeBoundingBox();\n\n\t\t}\n\n\t\tif ( this.boundingSphere !== null ) {\n\n\t\t\tthis.computeBoundingSphere();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Applies the rotation represented by the Quaternion to the geometry.\n\t *\n\t * @param {Quaternion} q - The Quaternion to apply.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tapplyQuaternion( q ) {\n\n\t\t_m1$2.makeRotationFromQuaternion( q );\n\n\t\tthis.applyMatrix4( _m1$2 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Rotates the geometry about the X axis. This is typically done as a one time\n\t * operation, and not during a loop. Use {@link Object3D#rotation} for typical\n\t * real-time mesh rotation.\n\t *\n\t * @param {number} angle - The angle in radians.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\trotateX( angle ) {\n\n\t\t// rotate geometry around world x-axis\n\n\t\t_m1$2.makeRotationX( angle );\n\n\t\tthis.applyMatrix4( _m1$2 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Rotates the geometry about the Y axis. This is typically done as a one time\n\t * operation, and not during a loop. Use {@link Object3D#rotation} for typical\n\t * real-time mesh rotation.\n\t *\n\t * @param {number} angle - The angle in radians.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\trotateY( angle ) {\n\n\t\t// rotate geometry around world y-axis\n\n\t\t_m1$2.makeRotationY( angle );\n\n\t\tthis.applyMatrix4( _m1$2 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Rotates the geometry about the Z axis. This is typically done as a one time\n\t * operation, and not during a loop. Use {@link Object3D#rotation} for typical\n\t * real-time mesh rotation.\n\t *\n\t * @param {number} angle - The angle in radians.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\trotateZ( angle ) {\n\n\t\t// rotate geometry around world z-axis\n\n\t\t_m1$2.makeRotationZ( angle );\n\n\t\tthis.applyMatrix4( _m1$2 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Translates the geometry. This is typically done as a one time\n\t * operation, and not during a loop. Use {@link Object3D#position} for typical\n\t * real-time mesh rotation.\n\t *\n\t * @param {number} x - The x offset.\n\t * @param {number} y - The y offset.\n\t * @param {number} z - The z offset.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\ttranslate( x, y, z ) {\n\n\t\t// translate geometry\n\n\t\t_m1$2.makeTranslation( x, y, z );\n\n\t\tthis.applyMatrix4( _m1$2 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Scales the geometry. This is typically done as a one time\n\t * operation, and not during a loop. Use {@link Object3D#scale} for typical\n\t * real-time mesh rotation.\n\t *\n\t * @param {number} x - The x scale.\n\t * @param {number} y - The y scale.\n\t * @param {number} z - The z scale.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tscale( x, y, z ) {\n\n\t\t// scale geometry\n\n\t\t_m1$2.makeScale( x, y, z );\n\n\t\tthis.applyMatrix4( _m1$2 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Rotates the geometry to face a point in 3D space. This is typically done as a one time\n\t * operation, and not during a loop. Use {@link Object3D#lookAt} for typical\n\t * real-time mesh rotation.\n\t *\n\t * @param {Vector3} vector - The target point.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tlookAt( vector ) {\n\n\t\t_obj.lookAt( vector );\n\n\t\t_obj.updateMatrix();\n\n\t\tthis.applyMatrix4( _obj.matrix );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Center the geometry based on its bounding box.\n\t *\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tcenter() {\n\n\t\tthis.computeBoundingBox();\n\n\t\tthis.boundingBox.getCenter( _offset ).negate();\n\n\t\tthis.translate( _offset.x, _offset.y, _offset.z );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Defines a geometry by creating a `position` attribute based on the given array of points. The array\n\t * can hold 2D or 3D vectors. When using two-dimensional data, the `z` coordinate for all vertices is\n\t * set to `0`.\n\t *\n\t * If the method is used with an existing `position` attribute, the vertex data are overwritten with the\n\t * data from the array. The length of the array must match the vertex count.\n\t *\n\t * @param {Array<Vector2>|Array<Vector3>} points - The points.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tsetFromPoints( points ) {\n\n\t\tconst positionAttribute = this.getAttribute( 'position' );\n\n\t\tif ( positionAttribute === undefined ) {\n\n\t\t\tconst position = [];\n\n\t\t\tfor ( let i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\t\tconst point = points[ i ];\n\t\t\t\tposition.push( point.x, point.y, point.z || 0 );\n\n\t\t\t}\n\n\t\t\tthis.setAttribute( 'position', new Float32BufferAttribute( position, 3 ) );\n\n\t\t} else {\n\n\t\t\tconst l = Math.min( points.length, positionAttribute.count ); // make sure data do not exceed buffer size\n\n\t\t\tfor ( let i = 0; i < l; i ++ ) {\n\n\t\t\t\tconst point = points[ i ];\n\t\t\t\tpositionAttribute.setXYZ( i, point.x, point.y, point.z || 0 );\n\n\t\t\t}\n\n\t\t\tif ( points.length > positionAttribute.count ) {\n\n\t\t\t\twarn( 'BufferGeometry: Buffer size too small for points data. Use .dispose() and create a new geometry.' );\n\n\t\t\t}\n\n\t\t\tpositionAttribute.needsUpdate = true;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes the bounding box of the geometry, and updates the `boundingBox` member.\n\t * The bounding box is not computed by the engine; it must be computed by your app.\n\t * You may need to recompute the bounding box if the geometry vertices are modified.\n\t */\n\tcomputeBoundingBox() {\n\n\t\tif ( this.boundingBox === null ) {\n\n\t\t\tthis.boundingBox = new Box3();\n\n\t\t}\n\n\t\tconst position = this.attributes.position;\n\t\tconst morphAttributesPosition = this.morphAttributes.position;\n\n\t\tif ( position && position.isGLBufferAttribute ) {\n\n\t\t\terror( 'BufferGeometry.computeBoundingBox(): GLBufferAttribute requires a manual bounding box.', this );\n\n\t\t\tthis.boundingBox.set(\n\t\t\t\tnew Vector3( - Infinity, - Infinity, - Infinity ),\n\t\t\t\tnew Vector3( + Infinity, + Infinity, + Infinity )\n\t\t\t);\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( position !== undefined ) {\n\n\t\t\tthis.boundingBox.setFromBufferAttribute( position );\n\n\t\t\t// process morph attributes if present\n\n\t\t\tif ( morphAttributesPosition ) {\n\n\t\t\t\tfor ( let i = 0, il = morphAttributesPosition.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst morphAttribute = morphAttributesPosition[ i ];\n\t\t\t\t\t_box$2.setFromBufferAttribute( morphAttribute );\n\n\t\t\t\t\tif ( this.morphTargetsRelative ) {\n\n\t\t\t\t\t\t_vector$8.addVectors( this.boundingBox.min, _box$2.min );\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _vector$8 );\n\n\t\t\t\t\t\t_vector$8.addVectors( this.boundingBox.max, _box$2.max );\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _vector$8 );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _box$2.min );\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _box$2.max );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tthis.boundingBox.makeEmpty();\n\n\t\t}\n\n\t\tif ( isNaN( this.boundingBox.min.x ) || isNaN( this.boundingBox.min.y ) || isNaN( this.boundingBox.min.z ) ) {\n\n\t\t\terror( 'BufferGeometry.computeBoundingBox(): Computed min/max have NaN values. The \"position\" attribute is likely to have NaN values.', this );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Computes the bounding sphere of the geometry, and updates the `boundingSphere` member.\n\t * The engine automatically computes the bounding sphere when it is needed, e.g., for ray casting or view frustum culling.\n\t * You may need to recompute the bounding sphere if the geometry vertices are modified.\n\t */\n\tcomputeBoundingSphere() {\n\n\t\tif ( this.boundingSphere === null ) {\n\n\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t}\n\n\t\tconst position = this.attributes.position;\n\t\tconst morphAttributesPosition = this.morphAttributes.position;\n\n\t\tif ( position && position.isGLBufferAttribute ) {\n\n\t\t\terror( 'BufferGeometry.computeBoundingSphere(): GLBufferAttribute requires a manual bounding sphere.', this );\n\n\t\t\tthis.boundingSphere.set( new Vector3(), Infinity );\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( position ) {\n\n\t\t\t// first, find the center of the bounding sphere\n\n\t\t\tconst center = this.boundingSphere.center;\n\n\t\t\t_box$2.setFromBufferAttribute( position );\n\n\t\t\t// process morph attributes if present\n\n\t\t\tif ( morphAttributesPosition ) {\n\n\t\t\t\tfor ( let i = 0, il = morphAttributesPosition.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst morphAttribute = morphAttributesPosition[ i ];\n\t\t\t\t\t_boxMorphTargets.setFromBufferAttribute( morphAttribute );\n\n\t\t\t\t\tif ( this.morphTargetsRelative ) {\n\n\t\t\t\t\t\t_vector$8.addVectors( _box$2.min, _boxMorphTargets.min );\n\t\t\t\t\t\t_box$2.expandByPoint( _vector$8 );\n\n\t\t\t\t\t\t_vector$8.addVectors( _box$2.max, _boxMorphTargets.max );\n\t\t\t\t\t\t_box$2.expandByPoint( _vector$8 );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_box$2.expandByPoint( _boxMorphTargets.min );\n\t\t\t\t\t\t_box$2.expandByPoint( _boxMorphTargets.max );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_box$2.getCenter( center );\n\n\t\t\t// second, try to find a boundingSphere with a radius smaller than the\n\t\t\t// boundingSphere of the boundingBox: sqrt(3) smaller in the best case\n\n\t\t\tlet maxRadiusSq = 0;\n\n\t\t\tfor ( let i = 0, il = position.count; i < il; i ++ ) {\n\n\t\t\t\t_vector$8.fromBufferAttribute( position, i );\n\n\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( _vector$8 ) );\n\n\t\t\t}\n\n\t\t\t// process morph attributes if present\n\n\t\t\tif ( morphAttributesPosition ) {\n\n\t\t\t\tfor ( let i = 0, il = morphAttributesPosition.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst morphAttribute = morphAttributesPosition[ i ];\n\t\t\t\t\tconst morphTargetsRelative = this.morphTargetsRelative;\n\n\t\t\t\t\tfor ( let j = 0, jl = morphAttribute.count; j < jl; j ++ ) {\n\n\t\t\t\t\t\t_vector$8.fromBufferAttribute( morphAttribute, j );\n\n\t\t\t\t\t\tif ( morphTargetsRelative ) {\n\n\t\t\t\t\t\t\t_offset.fromBufferAttribute( position, j );\n\t\t\t\t\t\t\t_vector$8.add( _offset );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( _vector$8 ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.boundingSphere.radius = Math.sqrt( maxRadiusSq );\n\n\t\t\tif ( isNaN( this.boundingSphere.radius ) ) {\n\n\t\t\t\terror( 'BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The \"position\" attribute is likely to have NaN values.', this );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Calculates and adds a tangent attribute to this geometry.\n\t *\n\t * The computation is only supported for indexed geometries and if position, normal, and uv attributes\n\t * are defined. When using a tangent space normal map, prefer the MikkTSpace algorithm provided by\n\t * {@link BufferGeometryUtils#computeMikkTSpaceTangents} instead.\n\t */\n\tcomputeTangents() {\n\n\t\tconst index = this.index;\n\t\tconst attributes = this.attributes;\n\n\t\t// based on http://www.terathon.com/code/tangent.html\n\t\t// (per vertex tangents)\n\n\t\tif ( index === null ||\n\t\t\t attributes.position === undefined ||\n\t\t\t attributes.normal === undefined ||\n\t\t\t attributes.uv === undefined ) {\n\n\t\t\terror( 'BufferGeometry: .computeTangents() failed. Missing required attributes (index, position, normal or uv)' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst positionAttribute = attributes.position;\n\t\tconst normalAttribute = attributes.normal;\n\t\tconst uvAttribute = attributes.uv;\n\n\t\tif ( this.hasAttribute( 'tangent' ) === false ) {\n\n\t\t\tthis.setAttribute( 'tangent', new BufferAttribute( new Float32Array( 4 * positionAttribute.count ), 4 ) );\n\n\t\t}\n\n\t\tconst tangentAttribute = this.getAttribute( 'tangent' );\n\n\t\tconst tan1 = [], tan2 = [];\n\n\t\tfor ( let i = 0; i < positionAttribute.count; i ++ ) {\n\n\t\t\ttan1[ i ] = new Vector3();\n\t\t\ttan2[ i ] = new Vector3();\n\n\t\t}\n\n\t\tconst vA = new Vector3(),\n\t\t\tvB = new Vector3(),\n\t\t\tvC = new Vector3(),\n\n\t\t\tuvA = new Vector2(),\n\t\t\tuvB = new Vector2(),\n\t\t\tuvC = new Vector2(),\n\n\t\t\tsdir = new Vector3(),\n\t\t\ttdir = new Vector3();\n\n\t\tfunction handleTriangle( a, b, c ) {\n\n\t\t\tvA.fromBufferAttribute( positionAttribute, a );\n\t\t\tvB.fromBufferAttribute( positionAttribute, b );\n\t\t\tvC.fromBufferAttribute( positionAttribute, c );\n\n\t\t\tuvA.fromBufferAttribute( uvAttribute, a );\n\t\t\tuvB.fromBufferAttribute( uvAttribute, b );\n\t\t\tuvC.fromBufferAttribute( uvAttribute, c );\n\n\t\t\tvB.sub( vA );\n\t\t\tvC.sub( vA );\n\n\t\t\tuvB.sub( uvA );\n\t\t\tuvC.sub( uvA );\n\n\t\t\tconst r = 1.0 / ( uvB.x * uvC.y - uvC.x * uvB.y );\n\n\t\t\t// silently ignore degenerate uv triangles having coincident or colinear vertices\n\n\t\t\tif ( ! isFinite( r ) ) return;\n\n\t\t\tsdir.copy( vB ).multiplyScalar( uvC.y ).addScaledVector( vC, - uvB.y ).multiplyScalar( r );\n\t\t\ttdir.copy( vC ).multiplyScalar( uvB.x ).addScaledVector( vB, - uvC.x ).multiplyScalar( r );\n\n\t\t\ttan1[ a ].add( sdir );\n\t\t\ttan1[ b ].add( sdir );\n\t\t\ttan1[ c ].add( sdir );\n\n\t\t\ttan2[ a ].add( tdir );\n\t\t\ttan2[ b ].add( tdir );\n\t\t\ttan2[ c ].add( tdir );\n\n\t\t}\n\n\t\tlet groups = this.groups;\n\n\t\tif ( groups.length === 0 ) {\n\n\t\t\tgroups = [ {\n\t\t\t\tstart: 0,\n\t\t\t\tcount: index.count\n\t\t\t} ];\n\n\t\t}\n\n\t\tfor ( let i = 0, il = groups.length; i < il; ++ i ) {\n\n\t\t\tconst group = groups[ i ];\n\n\t\t\tconst start = group.start;\n\t\t\tconst count = group.count;\n\n\t\t\tfor ( let j = start, jl = start + count; j < jl; j += 3 ) {\n\n\t\t\t\thandleTriangle(\n\t\t\t\t\tindex.getX( j + 0 ),\n\t\t\t\t\tindex.getX( j + 1 ),\n\t\t\t\t\tindex.getX( j + 2 )\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst tmp = new Vector3(), tmp2 = new Vector3();\n\t\tconst n = new Vector3(), n2 = new Vector3();\n\n\t\tfunction handleVertex( v ) {\n\n\t\t\tn.fromBufferAttribute( normalAttribute, v );\n\t\t\tn2.copy( n );\n\n\t\t\tconst t = tan1[ v ];\n\n\t\t\t// Gram-Schmidt orthogonalize\n\n\t\t\ttmp.copy( t );\n\t\t\ttmp.sub( n.multiplyScalar( n.dot( t ) ) ).normalize();\n\n\t\t\t// Calculate handedness\n\n\t\t\ttmp2.crossVectors( n2, t );\n\t\t\tconst test = tmp2.dot( tan2[ v ] );\n\t\t\tconst w = ( test < 0.0 ) ? -1 : 1.0;\n\n\t\t\ttangentAttribute.setXYZW( v, tmp.x, tmp.y, tmp.z, w );\n\n\t\t}\n\n\t\tfor ( let i = 0, il = groups.length; i < il; ++ i ) {\n\n\t\t\tconst group = groups[ i ];\n\n\t\t\tconst start = group.start;\n\t\t\tconst count = group.count;\n\n\t\t\tfor ( let j = start, jl = start + count; j < jl; j += 3 ) {\n\n\t\t\t\thandleVertex( index.getX( j + 0 ) );\n\t\t\t\thandleVertex( index.getX( j + 1 ) );\n\t\t\t\thandleVertex( index.getX( j + 2 ) );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Computes vertex normals for the given vertex data. For indexed geometries, the method sets\n\t * each vertex normal to be the average of the face normals of the faces that share that vertex.\n\t * For non-indexed geometries, vertices are not shared, and the method sets each vertex normal\n\t * to be the same as the face normal.\n\t */\n\tcomputeVertexNormals() {\n\n\t\tconst index = this.index;\n\t\tconst positionAttribute = this.getAttribute( 'position' );\n\n\t\tif ( positionAttribute !== undefined ) {\n\n\t\t\tlet normalAttribute = this.getAttribute( 'normal' );\n\n\t\t\tif ( normalAttribute === undefined ) {\n\n\t\t\t\tnormalAttribute = new BufferAttribute( new Float32Array( positionAttribute.count * 3 ), 3 );\n\t\t\t\tthis.setAttribute( 'normal', normalAttribute );\n\n\t\t\t} else {\n\n\t\t\t\t// reset existing normals to zero\n\n\t\t\t\tfor ( let i = 0, il = normalAttribute.count; i < il; i ++ ) {\n\n\t\t\t\t\tnormalAttribute.setXYZ( i, 0, 0, 0 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst pA = new Vector3(), pB = new Vector3(), pC = new Vector3();\n\t\t\tconst nA = new Vector3(), nB = new Vector3(), nC = new Vector3();\n\t\t\tconst cb = new Vector3(), ab = new Vector3();\n\n\t\t\t// indexed elements\n\n\t\t\tif ( index ) {\n\n\t\t\t\tfor ( let i = 0, il = index.count; i < il; i += 3 ) {\n\n\t\t\t\t\tconst vA = index.getX( i + 0 );\n\t\t\t\t\tconst vB = index.getX( i + 1 );\n\t\t\t\t\tconst vC = index.getX( i + 2 );\n\n\t\t\t\t\tpA.fromBufferAttribute( positionAttribute, vA );\n\t\t\t\t\tpB.fromBufferAttribute( positionAttribute, vB );\n\t\t\t\t\tpC.fromBufferAttribute( positionAttribute, vC );\n\n\t\t\t\t\tcb.subVectors( pC, pB );\n\t\t\t\t\tab.subVectors( pA, pB );\n\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\tnA.fromBufferAttribute( normalAttribute, vA );\n\t\t\t\t\tnB.fromBufferAttribute( normalAttribute, vB );\n\t\t\t\t\tnC.fromBufferAttribute( normalAttribute, vC );\n\n\t\t\t\t\tnA.add( cb );\n\t\t\t\t\tnB.add( cb );\n\t\t\t\t\tnC.add( cb );\n\n\t\t\t\t\tnormalAttribute.setXYZ( vA, nA.x, nA.y, nA.z );\n\t\t\t\t\tnormalAttribute.setXYZ( vB, nB.x, nB.y, nB.z );\n\t\t\t\t\tnormalAttribute.setXYZ( vC, nC.x, nC.y, nC.z );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// non-indexed elements (unconnected triangle soup)\n\n\t\t\t\tfor ( let i = 0, il = positionAttribute.count; i < il; i += 3 ) {\n\n\t\t\t\t\tpA.fromBufferAttribute( positionAttribute, i + 0 );\n\t\t\t\t\tpB.fromBufferAttribute( positionAttribute, i + 1 );\n\t\t\t\t\tpC.fromBufferAttribute( positionAttribute, i + 2 );\n\n\t\t\t\t\tcb.subVectors( pC, pB );\n\t\t\t\t\tab.subVectors( pA, pB );\n\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\tnormalAttribute.setXYZ( i + 0, cb.x, cb.y, cb.z );\n\t\t\t\t\tnormalAttribute.setXYZ( i + 1, cb.x, cb.y, cb.z );\n\t\t\t\t\tnormalAttribute.setXYZ( i + 2, cb.x, cb.y, cb.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.normalizeNormals();\n\n\t\t\tnormalAttribute.needsUpdate = true;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Ensures every normal vector in a geometry will have a magnitude of `1`. This will\n\t * correct lighting on the geometry surfaces.\n\t */\n\tnormalizeNormals() {\n\n\t\tconst normals = this.attributes.normal;\n\n\t\tfor ( let i = 0, il = normals.count; i < il; i ++ ) {\n\n\t\t\t_vector$8.fromBufferAttribute( normals, i );\n\n\t\t\t_vector$8.normalize();\n\n\t\t\tnormals.setXYZ( i, _vector$8.x, _vector$8.y, _vector$8.z );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Return a new non-index version of this indexed geometry. If the geometry\n\t * is already non-indexed, the method is a NOOP.\n\t *\n\t * @return {BufferGeometry} The non-indexed version of this indexed geometry.\n\t */\n\ttoNonIndexed() {\n\n\t\tfunction convertBufferAttribute( attribute, indices ) {\n\n\t\t\tconst array = attribute.array;\n\t\t\tconst itemSize = attribute.itemSize;\n\t\t\tconst normalized = attribute.normalized;\n\n\t\t\tconst array2 = new array.constructor( indices.length * itemSize );\n\n\t\t\tlet index = 0, index2 = 0;\n\n\t\t\tfor ( let i = 0, l = indices.length; i < l; i ++ ) {\n\n\t\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\t\tindex = indices[ i ] * attribute.data.stride + attribute.offset;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tindex = indices[ i ] * itemSize;\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let j = 0; j < itemSize; j ++ ) {\n\n\t\t\t\t\tarray2[ index2 ++ ] = array[ index ++ ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new BufferAttribute( array2, itemSize, normalized );\n\n\t\t}\n\n\t\t//\n\n\t\tif ( this.index === null ) {\n\n\t\t\twarn( 'BufferGeometry.toNonIndexed(): BufferGeometry is already non-indexed.' );\n\t\t\treturn this;\n\n\t\t}\n\n\t\tconst geometry2 = new BufferGeometry();\n\n\t\tconst indices = this.index.array;\n\t\tconst attributes = this.attributes;\n\n\t\t// attributes\n\n\t\tfor ( const name in attributes ) {\n\n\t\t\tconst attribute = attributes[ name ];\n\n\t\t\tconst newAttribute = convertBufferAttribute( attribute, indices );\n\n\t\t\tgeometry2.setAttribute( name, newAttribute );\n\n\t\t}\n\n\t\t// morph attributes\n\n\t\tconst morphAttributes = this.morphAttributes;\n\n\t\tfor ( const name in morphAttributes ) {\n\n\t\t\tconst morphArray = [];\n\t\t\tconst morphAttribute = morphAttributes[ name ]; // morphAttribute: array of Float32BufferAttributes\n\n\t\t\tfor ( let i = 0, il = morphAttribute.length; i < il; i ++ ) {\n\n\t\t\t\tconst attribute = morphAttribute[ i ];\n\n\t\t\t\tconst newAttribute = convertBufferAttribute( attribute, indices );\n\n\t\t\t\tmorphArray.push( newAttribute );\n\n\t\t\t}\n\n\t\t\tgeometry2.morphAttributes[ name ] = morphArray;\n\n\t\t}\n\n\t\tgeometry2.morphTargetsRelative = this.morphTargetsRelative;\n\n\t\t// groups\n\n\t\tconst groups = this.groups;\n\n\t\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\tconst group = groups[ i ];\n\t\t\tgeometry2.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t}\n\n\t\treturn geometry2;\n\n\t}\n\n\t/**\n\t * Serializes the geometry into JSON.\n\t *\n\t * @return {Object} A JSON object representing the serialized geometry.\n\t */\n\ttoJSON() {\n\n\t\tconst data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.7,\n\t\t\t\ttype: 'BufferGeometry',\n\t\t\t\tgenerator: 'BufferGeometry.toJSON'\n\t\t\t}\n\t\t};\n\n\t\t// standard BufferGeometry serialization\n\n\t\tdata.uuid = this.uuid;\n\t\tdata.type = this.type;\n\t\tif ( this.name !== '' ) data.name = this.name;\n\t\tif ( Object.keys( this.userData ).length > 0 ) data.userData = this.userData;\n\n\t\tif ( this.parameters !== undefined ) {\n\n\t\t\tconst parameters = this.parameters;\n\n\t\t\tfor ( const key in parameters ) {\n\n\t\t\t\tif ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ];\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\t// for simplicity the code assumes attributes are not shared across geometries, see #15811\n\n\t\tdata.data = { attributes: {} };\n\n\t\tconst index = this.index;\n\n\t\tif ( index !== null ) {\n\n\t\t\tdata.data.index = {\n\t\t\t\ttype: index.array.constructor.name,\n\t\t\t\tarray: Array.prototype.slice.call( index.array )\n\t\t\t};\n\n\t\t}\n\n\t\tconst attributes = this.attributes;\n\n\t\tfor ( const key in attributes ) {\n\n\t\t\tconst attribute = attributes[ key ];\n\n\t\t\tdata.data.attributes[ key ] = attribute.toJSON( data.data );\n\n\t\t}\n\n\t\tconst morphAttributes = {};\n\t\tlet hasMorphAttributes = false;\n\n\t\tfor ( const key in this.morphAttributes ) {\n\n\t\t\tconst attributeArray = this.morphAttributes[ key ];\n\n\t\t\tconst array = [];\n\n\t\t\tfor ( let i = 0, il = attributeArray.length; i < il; i ++ ) {\n\n\t\t\t\tconst attribute = attributeArray[ i ];\n\n\t\t\t\tarray.push( attribute.toJSON( data.data ) );\n\n\t\t\t}\n\n\t\t\tif ( array.length > 0 ) {\n\n\t\t\t\tmorphAttributes[ key ] = array;\n\n\t\t\t\thasMorphAttributes = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( hasMorphAttributes ) {\n\n\t\t\tdata.data.morphAttributes = morphAttributes;\n\t\t\tdata.data.morphTargetsRelative = this.morphTargetsRelative;\n\n\t\t}\n\n\t\tconst groups = this.groups;\n\n\t\tif ( groups.length > 0 ) {\n\n\t\t\tdata.data.groups = JSON.parse( JSON.stringify( groups ) );\n\n\t\t}\n\n\t\tconst boundingSphere = this.boundingSphere;\n\n\t\tif ( boundingSphere !== null ) {\n\n\t\t\tdata.data.boundingSphere = boundingSphere.toJSON();\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\t/**\n\t * Returns a new geometry with copied values from this instance.\n\t *\n\t * @return {BufferGeometry} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Copies the values of the given geometry to this instance.\n\t *\n\t * @param {BufferGeometry} source - The geometry to copy.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tcopy( source ) {\n\n\t\t// reset\n\n\t\tthis.index = null;\n\t\tthis.attributes = {};\n\t\tthis.morphAttributes = {};\n\t\tthis.groups = [];\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\n\t\t// used for storing cloned, shared data\n\n\t\tconst data = {};\n\n\t\t// name\n\n\t\tthis.name = source.name;\n\n\t\t// index\n\n\t\tconst index = source.index;\n\n\t\tif ( index !== null ) {\n\n\t\t\tthis.setIndex( index.clone() );\n\n\t\t}\n\n\t\t// attributes\n\n\t\tconst attributes = source.attributes;\n\n\t\tfor ( const name in attributes ) {\n\n\t\t\tconst attribute = attributes[ name ];\n\t\t\tthis.setAttribute( name, attribute.clone( data ) );\n\n\t\t}\n\n\t\t// morph attributes\n\n\t\tconst morphAttributes = source.morphAttributes;\n\n\t\tfor ( const name in morphAttributes ) {\n\n\t\t\tconst array = [];\n\t\t\tconst morphAttribute = morphAttributes[ name ]; // morphAttribute: array of Float32BufferAttributes\n\n\t\t\tfor ( let i = 0, l = morphAttribute.length; i < l; i ++ ) {\n\n\t\t\t\tarray.push( morphAttribute[ i ].clone( data ) );\n\n\t\t\t}\n\n\t\t\tthis.morphAttributes[ name ] = array;\n\n\t\t}\n\n\t\tthis.morphTargetsRelative = source.morphTargetsRelative;\n\n\t\t// groups\n\n\t\tconst groups = source.groups;\n\n\t\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\tconst group = groups[ i ];\n\t\t\tthis.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t}\n\n\t\t// bounding box\n\n\t\tconst boundingBox = source.boundingBox;\n\n\t\tif ( boundingBox !== null ) {\n\n\t\t\tthis.boundingBox = boundingBox.clone();\n\n\t\t}\n\n\t\t// bounding sphere\n\n\t\tconst boundingSphere = source.boundingSphere;\n\n\t\tif ( boundingSphere !== null ) {\n\n\t\t\tthis.boundingSphere = boundingSphere.clone();\n\n\t\t}\n\n\t\t// draw range\n\n\t\tthis.drawRange.start = source.drawRange.start;\n\t\tthis.drawRange.count = source.drawRange.count;\n\n\t\t// user data\n\n\t\tthis.userData = source.userData;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t *\n\t * @fires BufferGeometry#dispose\n\t */\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n}\n\nconst _inverseMatrix$3 = /*@__PURE__*/ new Matrix4();\nconst _ray$3 = /*@__PURE__*/ new Ray();\nconst _sphere$6 = /*@__PURE__*/ new Sphere();\nconst _sphereHitAt = /*@__PURE__*/ new Vector3();\n\nconst _vA$1 = /*@__PURE__*/ new Vector3();\nconst _vB$1 = /*@__PURE__*/ new Vector3();\nconst _vC$1 = /*@__PURE__*/ new Vector3();\n\nconst _tempA = /*@__PURE__*/ new Vector3();\nconst _morphA = /*@__PURE__*/ new Vector3();\n\nconst _intersectionPoint = /*@__PURE__*/ new Vector3();\nconst _intersectionPointWorld = /*@__PURE__*/ new Vector3();\n\n/**\n * Class representing triangular polygon mesh based objects.\n *\n * ```js\n * const geometry = new THREE.BoxGeometry( 1, 1, 1 );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const mesh = new THREE.Mesh( geometry, material );\n * scene.add( mesh );\n * ```\n *\n * @augments Object3D\n */\nclass Mesh extends Object3D {\n\n\t/**\n\t * Constructs a new mesh.\n\t *\n\t * @param {BufferGeometry} [geometry] - The mesh geometry.\n\t * @param {Material|Array<Material>} [material] - The mesh material.\n\t */\n\tconstructor( geometry = new BufferGeometry(), material = new MeshBasicMaterial() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMesh = true;\n\n\t\tthis.type = 'Mesh';\n\n\t\t/**\n\t\t * The mesh geometry.\n\t\t *\n\t\t * @type {BufferGeometry}\n\t\t */\n\t\tthis.geometry = geometry;\n\n\t\t/**\n\t\t * The mesh material.\n\t\t *\n\t\t * @type {Material|Array<Material>}\n\t\t * @default MeshBasicMaterial\n\t\t */\n\t\tthis.material = material;\n\n\t\t/**\n\t\t * A dictionary representing the morph targets in the geometry. The key is the\n\t\t * morph targets name, the value its attribute index. This member is `undefined`\n\t\t * by default and only set when morph targets are detected in the geometry.\n\t\t *\n\t\t * @type {Object<String,number>|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.morphTargetDictionary = undefined;\n\n\t\t/**\n\t\t * An array of weights typically in the range `[0,1]` that specify how much of the morph\n\t\t * is applied. This member is `undefined` by default and only set when morph targets are\n\t\t * detected in the geometry.\n\t\t *\n\t\t * @type {Array<number>|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.morphTargetInfluences = undefined;\n\n\t\t/**\n\t\t * The number of instances of this mesh.\n\t\t * Can only be used with {@link WebGPURenderer}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.count = 1;\n\n\t\tthis.updateMorphTargets();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tif ( source.morphTargetInfluences !== undefined ) {\n\n\t\t\tthis.morphTargetInfluences = source.morphTargetInfluences.slice();\n\n\t\t}\n\n\t\tif ( source.morphTargetDictionary !== undefined ) {\n\n\t\t\tthis.morphTargetDictionary = Object.assign( {}, source.morphTargetDictionary );\n\n\t\t}\n\n\t\tthis.material = Array.isArray( source.material ) ? source.material.slice() : source.material;\n\t\tthis.geometry = source.geometry;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the values of {@link Mesh#morphTargetDictionary} and {@link Mesh#morphTargetInfluences}\n\t * to make sure existing morph targets can influence this 3D object.\n\t */\n\tupdateMorphTargets() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tconst morphAttributes = geometry.morphAttributes;\n\t\tconst keys = Object.keys( morphAttributes );\n\n\t\tif ( keys.length > 0 ) {\n\n\t\t\tconst morphAttribute = morphAttributes[ keys[ 0 ] ];\n\n\t\t\tif ( morphAttribute !== undefined ) {\n\n\t\t\t\tthis.morphTargetInfluences = [];\n\t\t\t\tthis.morphTargetDictionary = {};\n\n\t\t\t\tfor ( let m = 0, ml = morphAttribute.length; m < ml; m ++ ) {\n\n\t\t\t\t\tconst name = morphAttribute[ m ].name || String( m );\n\n\t\t\t\t\tthis.morphTargetInfluences.push( 0 );\n\t\t\t\t\tthis.morphTargetDictionary[ name ] = m;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns the local-space position of the vertex at the given index, taking into\n\t * account the current animation state of both morph targets and skinning.\n\t *\n\t * @param {number} index - The vertex index.\n\t * @param {Vector3} target - The target object that is used to store the method's result.\n\t * @return {Vector3} The vertex position in local space.\n\t */\n\tgetVertexPosition( index, target ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst position = geometry.attributes.position;\n\t\tconst morphPosition = geometry.morphAttributes.position;\n\t\tconst morphTargetsRelative = geometry.morphTargetsRelative;\n\n\t\ttarget.fromBufferAttribute( position, index );\n\n\t\tconst morphInfluences = this.morphTargetInfluences;\n\n\t\tif ( morphPosition && morphInfluences ) {\n\n\t\t\t_morphA.set( 0, 0, 0 );\n\n\t\t\tfor ( let i = 0, il = morphPosition.length; i < il; i ++ ) {\n\n\t\t\t\tconst influence = morphInfluences[ i ];\n\t\t\t\tconst morphAttribute = morphPosition[ i ];\n\n\t\t\t\tif ( influence === 0 ) continue;\n\n\t\t\t\t_tempA.fromBufferAttribute( morphAttribute, index );\n\n\t\t\t\tif ( morphTargetsRelative ) {\n\n\t\t\t\t\t_morphA.addScaledVector( _tempA, influence );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_morphA.addScaledVector( _tempA.sub( target ), influence );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\ttarget.add( _morphA );\n\n\t\t}\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Computes intersection points between a casted ray and this line.\n\t *\n\t * @param {Raycaster} raycaster - The raycaster.\n\t * @param {Array<Object>} intersects - The target array that holds the intersection points.\n\t */\n\traycast( raycaster, intersects ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst material = this.material;\n\t\tconst matrixWorld = this.matrixWorld;\n\n\t\tif ( material === undefined ) return;\n\n\t\t// test with bounding sphere in world space\n\n\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t_sphere$6.copy( geometry.boundingSphere );\n\t\t_sphere$6.applyMatrix4( matrixWorld );\n\n\t\t// check distance from ray origin to bounding sphere\n\n\t\t_ray$3.copy( raycaster.ray ).recast( raycaster.near );\n\n\t\tif ( _sphere$6.containsPoint( _ray$3.origin ) === false ) {\n\n\t\t\tif ( _ray$3.intersectSphere( _sphere$6, _sphereHitAt ) === null ) return;\n\n\t\t\tif ( _ray$3.origin.distanceToSquared( _sphereHitAt ) > ( raycaster.far - raycaster.near ) ** 2 ) return;\n\n\t\t}\n\n\t\t// convert ray to local space of mesh\n\n\t\t_inverseMatrix$3.copy( matrixWorld ).invert();\n\t\t_ray$3.copy( raycaster.ray ).applyMatrix4( _inverseMatrix$3 );\n\n\t\t// test with bounding box in local space\n\n\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\tif ( _ray$3.intersectsBox( geometry.boundingBox ) === false ) return;\n\n\t\t}\n\n\t\t// test for intersections with geometry\n\n\t\tthis._computeIntersections( raycaster, intersects, _ray$3 );\n\n\t}\n\n\t_computeIntersections( raycaster, intersects, rayLocalSpace ) {\n\n\t\tlet intersection;\n\n\t\tconst geometry = this.geometry;\n\t\tconst material = this.material;\n\n\t\tconst index = geometry.index;\n\t\tconst position = geometry.attributes.position;\n\t\tconst uv = geometry.attributes.uv;\n\t\tconst uv1 = geometry.attributes.uv1;\n\t\tconst normal = geometry.attributes.normal;\n\t\tconst groups = geometry.groups;\n\t\tconst drawRange = geometry.drawRange;\n\n\t\tif ( index !== null ) {\n\n\t\t\t// indexed buffer geometry\n\n\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\tfor ( let i = 0, il = groups.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst group = groups[ i ];\n\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\tconst start = Math.max( group.start, drawRange.start );\n\t\t\t\t\tconst end = Math.min( index.count, Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) ) );\n\n\t\t\t\t\tfor ( let j = start, jl = end; j < jl; j += 3 ) {\n\n\t\t\t\t\t\tconst a = index.getX( j );\n\t\t\t\t\t\tconst b = index.getX( j + 1 );\n\t\t\t\t\t\tconst c = index.getX( j + 2 );\n\n\t\t\t\t\t\tintersection = checkGeometryIntersection( this, groupMaterial, raycaster, rayLocalSpace, uv, uv1, normal, a, b, c );\n\n\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\tintersection.faceIndex = Math.floor( j / 3 ); // triangle number in indexed buffer semantics\n\t\t\t\t\t\t\tintersection.face.materialIndex = group.materialIndex;\n\t\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\t\tconst end = Math.min( index.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\t\tfor ( let i = start, il = end; i < il; i += 3 ) {\n\n\t\t\t\t\tconst a = index.getX( i );\n\t\t\t\t\tconst b = index.getX( i + 1 );\n\t\t\t\t\tconst c = index.getX( i + 2 );\n\n\t\t\t\t\tintersection = checkGeometryIntersection( this, material, raycaster, rayLocalSpace, uv, uv1, normal, a, b, c );\n\n\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\tintersection.faceIndex = Math.floor( i / 3 ); // triangle number in indexed buffer semantics\n\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else if ( position !== undefined ) {\n\n\t\t\t// non-indexed buffer geometry\n\n\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\tfor ( let i = 0, il = groups.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst group = groups[ i ];\n\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\tconst start = Math.max( group.start, drawRange.start );\n\t\t\t\t\tconst end = Math.min( position.count, Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) ) );\n\n\t\t\t\t\tfor ( let j = start, jl = end; j < jl; j += 3 ) {\n\n\t\t\t\t\t\tconst a = j;\n\t\t\t\t\t\tconst b = j + 1;\n\t\t\t\t\t\tconst c = j + 2;\n\n\t\t\t\t\t\tintersection = checkGeometryIntersection( this, groupMaterial, raycaster, rayLocalSpace, uv, uv1, normal, a, b, c );\n\n\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\tintersection.faceIndex = Math.floor( j / 3 ); // triangle number in non-indexed buffer semantics\n\t\t\t\t\t\t\tintersection.face.materialIndex = group.materialIndex;\n\t\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\t\tconst end = Math.min( position.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\t\tfor ( let i = start, il = end; i < il; i += 3 ) {\n\n\t\t\t\t\tconst a = i;\n\t\t\t\t\tconst b = i + 1;\n\t\t\t\t\tconst c = i + 2;\n\n\t\t\t\t\tintersection = checkGeometryIntersection( this, material, raycaster, rayLocalSpace, uv, uv1, normal, a, b, c );\n\n\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\tintersection.faceIndex = Math.floor( i / 3 ); // triangle number in non-indexed buffer semantics\n\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nfunction checkIntersection$1( object, material, raycaster, ray, pA, pB, pC, point ) {\n\n\tlet intersect;\n\n\tif ( material.side === BackSide ) {\n\n\t\tintersect = ray.intersectTriangle( pC, pB, pA, true, point );\n\n\t} else {\n\n\t\tintersect = ray.intersectTriangle( pA, pB, pC, ( material.side === FrontSide ), point );\n\n\t}\n\n\tif ( intersect === null ) return null;\n\n\t_intersectionPointWorld.copy( point );\n\t_intersectionPointWorld.applyMatrix4( object.matrixWorld );\n\n\tconst distance = raycaster.ray.origin.distanceTo( _intersectionPointWorld );\n\n\tif ( distance < raycaster.near || distance > raycaster.far ) return null;\n\n\treturn {\n\t\tdistance: distance,\n\t\tpoint: _intersectionPointWorld.clone(),\n\t\tobject: object\n\t};\n\n}\n\nfunction checkGeometryIntersection( object, material, raycaster, ray, uv, uv1, normal, a, b, c ) {\n\n\tobject.getVertexPosition( a, _vA$1 );\n\tobject.getVertexPosition( b, _vB$1 );\n\tobject.getVertexPosition( c, _vC$1 );\n\n\tconst intersection = checkIntersection$1( object, material, raycaster, ray, _vA$1, _vB$1, _vC$1, _intersectionPoint );\n\n\tif ( intersection ) {\n\n\t\tconst barycoord = new Vector3();\n\t\tTriangle.getBarycoord( _intersectionPoint, _vA$1, _vB$1, _vC$1, barycoord );\n\n\t\tif ( uv ) {\n\n\t\t\tintersection.uv = Triangle.getInterpolatedAttribute( uv, a, b, c, barycoord, new Vector2() );\n\n\t\t}\n\n\t\tif ( uv1 ) {\n\n\t\t\tintersection.uv1 = Triangle.getInterpolatedAttribute( uv1, a, b, c, barycoord, new Vector2() );\n\n\t\t}\n\n\t\tif ( normal ) {\n\n\t\t\tintersection.normal = Triangle.getInterpolatedAttribute( normal, a, b, c, barycoord, new Vector3() );\n\n\t\t\tif ( intersection.normal.dot( ray.direction ) > 0 ) {\n\n\t\t\t\tintersection.normal.multiplyScalar( -1 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst face = {\n\t\t\ta: a,\n\t\t\tb: b,\n\t\t\tc: c,\n\t\t\tnormal: new Vector3(),\n\t\t\tmaterialIndex: 0\n\t\t};\n\n\t\tTriangle.getNormal( _vA$1, _vB$1, _vC$1, face.normal );\n\n\t\tintersection.face = face;\n\t\tintersection.barycoord = barycoord;\n\n\t}\n\n\treturn intersection;\n\n}\n\n/**\n * A geometry class for a rectangular cuboid with a given width, height, and depth.\n * On creation, the cuboid is centred on the origin, with each edge parallel to one\n * of the axes.\n *\n * ```js\n * const geometry = new THREE.BoxGeometry( 1, 1, 1 );\n * const material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );\n * const cube = new THREE.Mesh( geometry, material );\n * scene.add( cube );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#BoxGeometry\n */\nclass BoxGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new box geometry.\n\t *\n\t * @param {number} [width=1] - The width. That is, the length of the edges parallel to the X axis.\n\t * @param {number} [height=1] - The height. That is, the length of the edges parallel to the Y axis.\n\t * @param {number} [depth=1] - The depth. That is, the length of the edges parallel to the Z axis.\n\t * @param {number} [widthSegments=1] - Number of segmented rectangular faces along the width of the sides.\n\t * @param {number} [heightSegments=1] - Number of segmented rectangular faces along the height of the sides.\n\t * @param {number} [depthSegments=1] - Number of segmented rectangular faces along the depth of the sides.\n\t */\n\tconstructor( width = 1, height = 1, depth = 1, widthSegments = 1, heightSegments = 1, depthSegments = 1 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'BoxGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\tdepth: depth,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\tdepthSegments: depthSegments\n\t\t};\n\n\t\tconst scope = this;\n\n\t\t// segments\n\n\t\twidthSegments = Math.floor( widthSegments );\n\t\theightSegments = Math.floor( heightSegments );\n\t\tdepthSegments = Math.floor( depthSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tlet numberOfVertices = 0;\n\t\tlet groupStart = 0;\n\n\t\t// build each side of the box geometry\n\n\t\tbuildPlane( 'z', 'y', 'x', -1, -1, depth, height, width, depthSegments, heightSegments, 0 ); // px\n\t\tbuildPlane( 'z', 'y', 'x', 1, -1, depth, height, - width, depthSegments, heightSegments, 1 ); // nx\n\t\tbuildPlane( 'x', 'z', 'y', 1, 1, width, depth, height, widthSegments, depthSegments, 2 ); // py\n\t\tbuildPlane( 'x', 'z', 'y', 1, -1, width, depth, - height, widthSegments, depthSegments, 3 ); // ny\n\t\tbuildPlane( 'x', 'y', 'z', 1, -1, width, height, depth, widthSegments, heightSegments, 4 ); // pz\n\t\tbuildPlane( 'x', 'y', 'z', -1, -1, width, height, - depth, widthSegments, heightSegments, 5 ); // nz\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\tfunction buildPlane( u, v, w, udir, vdir, width, height, depth, gridX, gridY, materialIndex ) {\n\n\t\t\tconst segmentWidth = width / gridX;\n\t\t\tconst segmentHeight = height / gridY;\n\n\t\t\tconst widthHalf = width / 2;\n\t\t\tconst heightHalf = height / 2;\n\t\t\tconst depthHalf = depth / 2;\n\n\t\t\tconst gridX1 = gridX + 1;\n\t\t\tconst gridY1 = gridY + 1;\n\n\t\t\tlet vertexCounter = 0;\n\t\t\tlet groupCount = 0;\n\n\t\t\tconst vector = new Vector3();\n\n\t\t\t// generate vertices, normals and uvs\n\n\t\t\tfor ( let iy = 0; iy < gridY1; iy ++ ) {\n\n\t\t\t\tconst y = iy * segmentHeight - heightHalf;\n\n\t\t\t\tfor ( let ix = 0; ix < gridX1; ix ++ ) {\n\n\t\t\t\t\tconst x = ix * segmentWidth - widthHalf;\n\n\t\t\t\t\t// set values to correct vector component\n\n\t\t\t\t\tvector[ u ] = x * udir;\n\t\t\t\t\tvector[ v ] = y * vdir;\n\t\t\t\t\tvector[ w ] = depthHalf;\n\n\t\t\t\t\t// now apply vector to vertex buffer\n\n\t\t\t\t\tvertices.push( vector.x, vector.y, vector.z );\n\n\t\t\t\t\t// set values to correct vector component\n\n\t\t\t\t\tvector[ u ] = 0;\n\t\t\t\t\tvector[ v ] = 0;\n\t\t\t\t\tvector[ w ] = depth > 0 ? 1 : -1;\n\n\t\t\t\t\t// now apply vector to normal buffer\n\n\t\t\t\t\tnormals.push( vector.x, vector.y, vector.z );\n\n\t\t\t\t\t// uvs\n\n\t\t\t\t\tuvs.push( ix / gridX );\n\t\t\t\t\tuvs.push( 1 - ( iy / gridY ) );\n\n\t\t\t\t\t// counters\n\n\t\t\t\t\tvertexCounter += 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// indices\n\n\t\t\t// 1. you need three indices to draw a single face\n\t\t\t// 2. a single segment consists of two faces\n\t\t\t// 3. so we need to generate six (2*3) indices per segment\n\n\t\t\tfor ( let iy = 0; iy < gridY; iy ++ ) {\n\n\t\t\t\tfor ( let ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\t\t\tconst a = numberOfVertices + ix + gridX1 * iy;\n\t\t\t\t\tconst b = numberOfVertices + ix + gridX1 * ( iy + 1 );\n\t\t\t\t\tconst c = numberOfVertices + ( ix + 1 ) + gridX1 * ( iy + 1 );\n\t\t\t\t\tconst d = numberOfVertices + ( ix + 1 ) + gridX1 * iy;\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tindices.push( a, b, d );\n\t\t\t\t\tindices.push( b, c, d );\n\n\t\t\t\t\t// increase counter\n\n\t\t\t\t\tgroupCount += 6;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup( groupStart, groupCount, materialIndex );\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\n\t\t\t// update total number of vertices\n\n\t\t\tnumberOfVertices += vertexCounter;\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {BoxGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new BoxGeometry( data.width, data.height, data.depth, data.widthSegments, data.heightSegments, data.depthSegments );\n\n\t}\n\n}\n\n/**\n * Provides utility functions for managing uniforms.\n *\n * @module UniformsUtils\n */\n\n/**\n * Clones the given uniform definitions by performing a deep-copy. That means\n * if the value of a uniform refers to an object like a Vector3 or Texture,\n * the cloned uniform will refer to a new object reference.\n *\n * @param {Object} src - An object representing uniform definitions.\n * @return {Object} The cloned uniforms.\n */\nfunction cloneUniforms( src ) {\n\n\tconst dst = {};\n\n\tfor ( const u in src ) {\n\n\t\tdst[ u ] = {};\n\n\t\tfor ( const p in src[ u ] ) {\n\n\t\t\tconst property = src[ u ][ p ];\n\n\t\t\tif ( property && ( property.isColor ||\n\t\t\t\tproperty.isMatrix3 || property.isMatrix4 ||\n\t\t\t\tproperty.isVector2 || property.isVector3 || property.isVector4 ||\n\t\t\t\tproperty.isTexture || property.isQuaternion ) ) {\n\n\t\t\t\tif ( property.isRenderTargetTexture ) {\n\n\t\t\t\t\twarn( 'UniformsUtils: Textures of render targets cannot be cloned via cloneUniforms() or mergeUniforms().' );\n\t\t\t\t\tdst[ u ][ p ] = null;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tdst[ u ][ p ] = property.clone();\n\n\t\t\t\t}\n\n\t\t\t} else if ( Array.isArray( property ) ) {\n\n\t\t\t\tdst[ u ][ p ] = property.slice();\n\n\t\t\t} else {\n\n\t\t\t\tdst[ u ][ p ] = property;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn dst;\n\n}\n\n/**\n * Merges the given uniform definitions into a single object. Since the\n * method internally uses cloneUniforms(), it performs a deep-copy when\n * producing the merged uniform definitions.\n *\n * @param {Array} uniforms - An array of objects containing uniform definitions.\n * @return {Object} The merged uniforms.\n */\nfunction mergeUniforms( uniforms ) {\n\n\tconst merged = {};\n\n\tfor ( let u = 0; u < uniforms.length; u ++ ) {\n\n\t\tconst tmp = cloneUniforms( uniforms[ u ] );\n\n\t\tfor ( const p in tmp ) {\n\n\t\t\tmerged[ p ] = tmp[ p ];\n\n\t\t}\n\n\t}\n\n\treturn merged;\n\n}\n\nfunction cloneUniformsGroups( src ) {\n\n\tconst dst = [];\n\n\tfor ( let u = 0; u < src.length; u ++ ) {\n\n\t\tdst.push( src[ u ].clone() );\n\n\t}\n\n\treturn dst;\n\n}\n\nfunction getUnlitUniformColorSpace( renderer ) {\n\n\tconst currentRenderTarget = renderer.getRenderTarget();\n\n\tif ( currentRenderTarget === null ) {\n\n\t\t// https://github.com/mrdoob/three.js/pull/23937#issuecomment-1111067398\n\t\treturn renderer.outputColorSpace;\n\n\t}\n\n\t// https://github.com/mrdoob/three.js/issues/27868\n\tif ( currentRenderTarget.isXRRenderTarget === true ) {\n\n\t\treturn currentRenderTarget.texture.colorSpace;\n\n\t}\n\n\treturn ColorManagement.workingColorSpace;\n\n}\n\n// Legacy\n\nconst UniformsUtils = { clone: cloneUniforms, merge: mergeUniforms };\n\nvar default_vertex = \"void main() {\\n\\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\\n}\";\n\nvar default_fragment = \"void main() {\\n\\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\\n}\";\n\n/**\n * A material rendered with custom shaders. A shader is a small program written in GLSL.\n * that runs on the GPU. You may want to use a custom shader if you need to implement an\n * effect not included with any of the built-in materials.\n *\n * There are the following notes to bear in mind when using a `ShaderMaterial`:\n *\n * - `ShaderMaterial` can only be used with {@link WebGLRenderer}.\n * - Built in attributes and uniforms are passed to the shaders along with your code. If\n * you don't want that, use {@link RawShaderMaterial} instead.\n * - You can use the directive `#pragma unroll_loop_start` and `#pragma unroll_loop_end`\n * in order to unroll a `for` loop in GLSL by the shader preprocessor. The directive has\n * to be placed right above the loop. The loop formatting has to correspond to a defined standard.\n *   - The loop has to be [normalized](https://en.wikipedia.org/wiki/Normalized_loop).\n *   - The loop variable has to be *i*.\n *   - The value `UNROLLED_LOOP_INDEX` will be replaced with the explicitly\n * value of *i* for the given iteration and can be used in preprocessor\n * statements.\n *\n * ```js\n * const material = new THREE.ShaderMaterial( {\n * \tuniforms: {\n * \t\ttime: { value: 1.0 },\n * \t\tresolution: { value: new THREE.Vector2() }\n * \t},\n * \tvertexShader: document.getElementById( 'vertexShader' ).textContent,\n * \tfragmentShader: document.getElementById( 'fragmentShader' ).textContent\n * } );\n * ```\n *\n * @augments Material\n */\nclass ShaderMaterial extends Material {\n\n\t/**\n\t * Constructs a new shader material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isShaderMaterial = true;\n\n\t\tthis.type = 'ShaderMaterial';\n\n\t\t/**\n\t\t * Defines custom constants using `#define` directives within the GLSL code\n\t\t * for both the vertex shader and the fragment shader; each key/value pair\n\t\t * yields another directive.\n\t\t * ```js\n\t\t * defines: {\n\t\t * \tFOO: 15,\n\t\t * \tBAR: true\n\t\t * }\n\t\t * ```\n\t\t * Yields the lines:\n\t\t * ```\n\t\t * #define FOO 15\n\t\t * #define BAR true\n\t\t * ```\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.defines = {};\n\n\t\t/**\n\t\t * An object of the form:\n\t\t * ```js\n\t\t * {\n\t\t * \t\"uniform1\": { value: 1.0 },\n\t\t * \t\"uniform2\": { value: 2 }\n\t\t * }\n\t\t * ```\n\t\t * specifying the uniforms to be passed to the shader code; keys are uniform\n\t\t * names, values are definitions of the form\n\t\t * ```\n\t\t * {\n\t\t * \tvalue: 1.0\n\t\t * }\n\t\t * ```\n\t\t * where `value` is the value of the uniform. Names must match the name of\n\t\t * the uniform, as defined in the GLSL code. Note that uniforms are refreshed\n\t\t * on every frame, so updating the value of the uniform will immediately\n\t\t * update the value available to the GLSL code.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.uniforms = {};\n\n\t\t/**\n\t\t * An array holding uniforms groups for configuring UBOs.\n\t\t *\n\t\t * @type {Array<UniformsGroup>}\n\t\t */\n\t\tthis.uniformsGroups = [];\n\n\t\t/**\n\t\t * Vertex shader GLSL code. This is the actual code for the shader.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.vertexShader = default_vertex;\n\n\t\t/**\n\t\t * Fragment shader GLSL code. This is the actual code for the shader.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.fragmentShader = default_fragment;\n\n\t\t/**\n\t\t * Controls line thickness or lines.\n\t\t *\n\t\t * WebGL and WebGPU ignore this setting and always render line primitives with a\n\t\t * width of one pixel.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.linewidth = 1;\n\n\t\t/**\n\t\t * Renders the geometry as a wireframe.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.wireframe = false;\n\n\t\t/**\n\t\t * Controls the thickness of the wireframe.\n\t\t *\n\t\t * WebGL and WebGPU ignore this property and always render\n\t\t * 1 pixel wide lines.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.wireframeLinewidth = 1;\n\n\t\t/**\n\t\t * Define whether the material color is affected by global fog settings; `true`\n\t\t * to pass fog uniforms to the shader.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.fog = false;\n\n\t\t/**\n\t\t * Defines whether this material uses lighting; `true` to pass uniform data\n\t\t * related to lighting to this shader.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.lights = false;\n\n\t\t/**\n\t\t * Defines whether this material supports clipping; `true` to let the renderer\n\t\t * pass the clippingPlanes uniform.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.clipping = false;\n\n\t\t/**\n\t\t * Overwritten and set to `true` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.forceSinglePass = true;\n\n\t\t/**\n\t\t * This object allows to enable certain WebGL 2 extensions.\n\t\t *\n\t\t * - clipCullDistance: set to `true` to use vertex shader clipping\n\t\t * - multiDraw: set to `true` to use vertex shader multi_draw / enable gl_DrawID\n\t\t *\n\t\t * @type {{clipCullDistance:false,multiDraw:false}}\n\t\t */\n\t\tthis.extensions = {\n\t\t\tclipCullDistance: false, // set to use vertex shader clipping\n\t\t\tmultiDraw: false // set to use vertex shader multi_draw / enable gl_DrawID\n\t\t};\n\n\t\t/**\n\t\t * When the rendered geometry doesn't include these attributes but the\n\t\t * material does, these default values will be passed to the shaders. This\n\t\t * avoids errors when buffer data is missing.\n\t\t *\n\t\t * - color: [ 1, 1, 1 ]\n\t\t * - uv: [ 0, 0 ]\n\t\t * - uv1: [ 0, 0 ]\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.defaultAttributeValues = {\n\t\t\t'color': [ 1, 1, 1 ],\n\t\t\t'uv': [ 0, 0 ],\n\t\t\t'uv1': [ 0, 0 ]\n\t\t};\n\n\t\t/**\n\t\t * If set, this calls [gl.bindAttribLocation](https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/bindAttribLocation)\n\t\t * to bind a generic vertex index to an attribute variable.\n\t\t *\n\t\t * @type {string|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.index0AttributeName = undefined;\n\n\t\t/**\n\t\t * Can be used to force a uniform update while changing uniforms in\n\t\t * {@link Object3D#onBeforeRender}.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.uniformsNeedUpdate = false;\n\n\t\t/**\n\t\t * Defines the GLSL version of custom shader code.\n\t\t *\n\t\t * @type {?(GLSL1|GLSL3)}\n\t\t * @default null\n\t\t */\n\t\tthis.glslVersion = null;\n\n\t\tif ( parameters !== undefined ) {\n\n\t\t\tthis.setValues( parameters );\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.fragmentShader = source.fragmentShader;\n\t\tthis.vertexShader = source.vertexShader;\n\n\t\tthis.uniforms = cloneUniforms( source.uniforms );\n\t\tthis.uniformsGroups = cloneUniformsGroups( source.uniformsGroups );\n\n\t\tthis.defines = Object.assign( {}, source.defines );\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\tthis.fog = source.fog;\n\t\tthis.lights = source.lights;\n\t\tthis.clipping = source.clipping;\n\n\t\tthis.extensions = Object.assign( {}, source.extensions );\n\n\t\tthis.glslVersion = source.glslVersion;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.glslVersion = this.glslVersion;\n\t\tdata.uniforms = {};\n\n\t\tfor ( const name in this.uniforms ) {\n\n\t\t\tconst uniform = this.uniforms[ name ];\n\t\t\tconst value = uniform.value;\n\n\t\t\tif ( value && value.isTexture ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 't',\n\t\t\t\t\tvalue: value.toJSON( meta ).uuid\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isColor ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'c',\n\t\t\t\t\tvalue: value.getHex()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isVector2 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'v2',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isVector3 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'v3',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isVector4 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'v4',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isMatrix3 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'm3',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isMatrix4 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'm4',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\tvalue: value\n\t\t\t\t};\n\n\t\t\t\t// note: the array variants v2v, v3v, v4v, m4v and tv are not supported so far\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( Object.keys( this.defines ).length > 0 ) data.defines = this.defines;\n\n\t\tdata.vertexShader = this.vertexShader;\n\t\tdata.fragmentShader = this.fragmentShader;\n\n\t\tdata.lights = this.lights;\n\t\tdata.clipping = this.clipping;\n\n\t\tconst extensions = {};\n\n\t\tfor ( const key in this.extensions ) {\n\n\t\t\tif ( this.extensions[ key ] === true ) extensions[ key ] = true;\n\n\t\t}\n\n\t\tif ( Object.keys( extensions ).length > 0 ) data.extensions = extensions;\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * Abstract base class for cameras. This class should always be inherited\n * when you build a new camera.\n *\n * @abstract\n * @augments Object3D\n */\nclass Camera extends Object3D {\n\n\t/**\n\t * Constructs a new camera.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCamera = true;\n\n\t\tthis.type = 'Camera';\n\n\t\t/**\n\t\t * The inverse of the camera's world matrix.\n\t\t *\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.matrixWorldInverse = new Matrix4();\n\n\t\t/**\n\t\t * The camera's projection matrix.\n\t\t *\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.projectionMatrix = new Matrix4();\n\n\t\t/**\n\t\t * The inverse of the camera's projection matrix.\n\t\t *\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.projectionMatrixInverse = new Matrix4();\n\n\t\t/**\n\t\t * The coordinate system in which the camera is used.\n\t\t *\n\t\t * @type {(WebGLCoordinateSystem|WebGPUCoordinateSystem)}\n\t\t */\n\t\tthis.coordinateSystem = WebGLCoordinateSystem;\n\n\t\tthis._reversedDepth = false;\n\n\t}\n\n\t/**\n\t * The flag that indicates whether the camera uses a reversed depth buffer.\n\t *\n\t * @type {boolean}\n\t * @default false\n\t */\n\tget reversedDepth() {\n\n\t\treturn this._reversedDepth;\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.matrixWorldInverse.copy( source.matrixWorldInverse );\n\n\t\tthis.projectionMatrix.copy( source.projectionMatrix );\n\t\tthis.projectionMatrixInverse.copy( source.projectionMatrixInverse );\n\n\t\tthis.coordinateSystem = source.coordinateSystem;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a vector representing the (\"look\") direction of the 3D object in world space.\n\t *\n\t * This method is overwritten since cameras have a different forward vector compared to other\n\t * 3D objects. A camera looks down its local, negative z-axis by default.\n\t *\n\t * @param {Vector3} target - The target vector the result is stored to.\n\t * @return {Vector3} The 3D object's direction in world space.\n\t */\n\tgetWorldDirection( target ) {\n\n\t\treturn super.getWorldDirection( target ).negate();\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t\tthis.matrixWorldInverse.copy( this.matrixWorld ).invert();\n\n\t}\n\n\tupdateWorldMatrix( updateParents, updateChildren ) {\n\n\t\tsuper.updateWorldMatrix( updateParents, updateChildren );\n\n\t\tthis.matrixWorldInverse.copy( this.matrixWorld ).invert();\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nconst _v3$1 = /*@__PURE__*/ new Vector3();\nconst _minTarget = /*@__PURE__*/ new Vector2();\nconst _maxTarget = /*@__PURE__*/ new Vector2();\n\n/**\n * Camera that uses [perspective projection](https://en.wikipedia.org/wiki/Perspective_(graphical)).\n *\n * This projection mode is designed to mimic the way the human eye sees. It\n * is the most common projection mode used for rendering a 3D scene.\n *\n * ```js\n * const camera = new THREE.PerspectiveCamera( 45, width / height, 1, 1000 );\n * scene.add( camera );\n * ```\n *\n * @augments Camera\n */\nclass PerspectiveCamera extends Camera {\n\n\t/**\n\t * Constructs a new perspective camera.\n\t *\n\t * @param {number} [fov=50] - The vertical field of view.\n\t * @param {number} [aspect=1] - The aspect ratio.\n\t * @param {number} [near=0.1] - The camera's near plane.\n\t * @param {number} [far=2000] - The camera's far plane.\n\t */\n\tconstructor( fov = 50, aspect = 1, near = 0.1, far = 2000 ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isPerspectiveCamera = true;\n\n\t\tthis.type = 'PerspectiveCamera';\n\n\t\t/**\n\t\t * The vertical field of view, from bottom to top of view,\n\t\t * in degrees.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 50\n\t\t */\n\t\tthis.fov = fov;\n\n\t\t/**\n\t\t * The zoom factor of the camera.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.zoom = 1;\n\n\t\t/**\n\t\t * The camera's near plane. The valid range is greater than `0`\n\t\t * and less than the current value of {@link PerspectiveCamera#far}.\n\t\t *\n\t\t * Note that, unlike for the {@link OrthographicCamera}, `0` is <em>not</em> a\n\t\t * valid value for a perspective camera's near plane.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.1\n\t\t */\n\t\tthis.near = near;\n\n\t\t/**\n\t\t * The camera's far plane. Must be greater than the\n\t\t * current value of {@link PerspectiveCamera#near}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 2000\n\t\t */\n\t\tthis.far = far;\n\n\t\t/**\n\t\t * Object distance used for stereoscopy and depth-of-field effects. This\n\t\t * parameter does not influence the projection matrix unless a\n\t\t * {@link StereoCamera} is being used.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 10\n\t\t */\n\t\tthis.focus = 10;\n\n\t\t/**\n\t\t * The aspect ratio, usually the canvas width / canvas height.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.aspect = aspect;\n\n\t\t/**\n\t\t * Represents the frustum window specification. This property should not be edited\n\t\t * directly but via {@link PerspectiveCamera#setViewOffset} and {@link PerspectiveCamera#clearViewOffset}.\n\t\t *\n\t\t * @type {?Object}\n\t\t * @default null\n\t\t */\n\t\tthis.view = null;\n\n\t\t/**\n\t\t * Film size used for the larger axis. Default is `35` (millimeters). This\n\t\t * parameter does not influence the projection matrix unless {@link PerspectiveCamera#filmOffset}\n\t\t * is set to a nonzero value.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 35\n\t\t */\n\t\tthis.filmGauge = 35;\n\n\t\t/**\n\t\t * Horizontal off-center offset in the same unit as {@link PerspectiveCamera#filmGauge}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.filmOffset = 0;\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.fov = source.fov;\n\t\tthis.zoom = source.zoom;\n\n\t\tthis.near = source.near;\n\t\tthis.far = source.far;\n\t\tthis.focus = source.focus;\n\n\t\tthis.aspect = source.aspect;\n\t\tthis.view = source.view === null ? null : Object.assign( {}, source.view );\n\n\t\tthis.filmGauge = source.filmGauge;\n\t\tthis.filmOffset = source.filmOffset;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the FOV by focal length in respect to the current {@link PerspectiveCamera#filmGauge}.\n\t *\n\t * The default film gauge is 35, so that the focal length can be specified for\n\t * a 35mm (full frame) camera.\n\t *\n\t * @param {number} focalLength - Values for focal length and film gauge must have the same unit.\n\t */\n\tsetFocalLength( focalLength ) {\n\n\t\t/** see {@link http://www.bobatkins.com/photography/technical/field_of_view.html} */\n\t\tconst vExtentSlope = 0.5 * this.getFilmHeight() / focalLength;\n\n\t\tthis.fov = RAD2DEG * 2 * Math.atan( vExtentSlope );\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\t/**\n\t * Returns the focal length from the current {@link PerspectiveCamera#fov} and\n\t * {@link PerspectiveCamera#filmGauge}.\n\t *\n\t * @return {number} The computed focal length.\n\t */\n\tgetFocalLength() {\n\n\t\tconst vExtentSlope = Math.tan( DEG2RAD * 0.5 * this.fov );\n\n\t\treturn 0.5 * this.getFilmHeight() / vExtentSlope;\n\n\t}\n\n\t/**\n\t * Returns the current vertical field of view angle in degrees considering {@link PerspectiveCamera#zoom}.\n\t *\n\t * @return {number} The effective FOV.\n\t */\n\tgetEffectiveFOV() {\n\n\t\treturn RAD2DEG * 2 * Math.atan(\n\t\t\tMath.tan( DEG2RAD * 0.5 * this.fov ) / this.zoom );\n\n\t}\n\n\t/**\n\t * Returns the width of the image on the film. If {@link PerspectiveCamera#aspect} is greater than or\n\t * equal to one (landscape format), the result equals {@link PerspectiveCamera#filmGauge}.\n\t *\n\t * @return {number} The film width.\n\t */\n\tgetFilmWidth() {\n\n\t\t// film not completely covered in portrait format (aspect < 1)\n\t\treturn this.filmGauge * Math.min( this.aspect, 1 );\n\n\t}\n\n\t/**\n\t * Returns the height of the image on the film. If {@link PerspectiveCamera#aspect} is greater than or\n\t * equal to one (landscape format), the result equals {@link PerspectiveCamera#filmGauge}.\n\t *\n\t * @return {number} The film width.\n\t */\n\tgetFilmHeight() {\n\n\t\t// film not completely covered in landscape format (aspect > 1)\n\t\treturn this.filmGauge / Math.max( this.aspect, 1 );\n\n\t}\n\n\t/**\n\t * Computes the 2D bounds of the camera's viewable rectangle at a given distance along the viewing direction.\n\t * Sets `minTarget` and `maxTarget` to the coordinates of the lower-left and upper-right corners of the view rectangle.\n\t *\n\t * @param {number} distance - The viewing distance.\n\t * @param {Vector2} minTarget - The lower-left corner of the view rectangle is written into this vector.\n\t * @param {Vector2} maxTarget - The upper-right corner of the view rectangle is written into this vector.\n\t */\n\tgetViewBounds( distance, minTarget, maxTarget ) {\n\n\t\t_v3$1.set( -1, -1, 0.5 ).applyMatrix4( this.projectionMatrixInverse );\n\n\t\tminTarget.set( _v3$1.x, _v3$1.y ).multiplyScalar( - distance / _v3$1.z );\n\n\t\t_v3$1.set( 1, 1, 0.5 ).applyMatrix4( this.projectionMatrixInverse );\n\n\t\tmaxTarget.set( _v3$1.x, _v3$1.y ).multiplyScalar( - distance / _v3$1.z );\n\n\t}\n\n\t/**\n\t * Computes the width and height of the camera's viewable rectangle at a given distance along the viewing direction.\n\t *\n\t * @param {number} distance - The viewing distance.\n\t * @param {Vector2} target - The target vector that is used to store result where x is width and y is height.\n\t * @returns {Vector2} The view size.\n\t */\n\tgetViewSize( distance, target ) {\n\n\t\tthis.getViewBounds( distance, _minTarget, _maxTarget );\n\n\t\treturn target.subVectors( _maxTarget, _minTarget );\n\n\t}\n\n\t/**\n\t * Sets an offset in a larger frustum. This is useful for multi-window or\n\t * multi-monitor/multi-machine setups.\n\t *\n\t * For example, if you have 3x2 monitors and each monitor is 1920x1080 and\n\t * the monitors are in grid like this\n\t *```\n\t *   +---+---+---+\n\t *   | A | B | C |\n\t *   +---+---+---+\n\t *   | D | E | F |\n\t *   +---+---+---+\n\t *```\n\t * then for each monitor you would call it like this:\n\t *```js\n\t * const w = 1920;\n\t * const h = 1080;\n\t * const fullWidth = w * 3;\n\t * const fullHeight = h * 2;\n\t *\n\t * // --A--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 0, h * 0, w, h );\n\t * // --B--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 1, h * 0, w, h );\n\t * // --C--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 2, h * 0, w, h );\n\t * // --D--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 0, h * 1, w, h );\n\t * // --E--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 1, h * 1, w, h );\n\t * // --F--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 2, h * 1, w, h );\n\t * ```\n\t *\n\t * Note there is no reason monitors have to be the same size or in a grid.\n\t *\n\t * @param {number} fullWidth - The full width of multiview setup.\n\t * @param {number} fullHeight - The full height of multiview setup.\n\t * @param {number} x - The horizontal offset of the subcamera.\n\t * @param {number} y - The vertical offset of the subcamera.\n\t * @param {number} width - The width of subcamera.\n\t * @param {number} height - The height of subcamera.\n\t */\n\tsetViewOffset( fullWidth, fullHeight, x, y, width, height ) {\n\n\t\tthis.aspect = fullWidth / fullHeight;\n\n\t\tif ( this.view === null ) {\n\n\t\t\tthis.view = {\n\t\t\t\tenabled: true,\n\t\t\t\tfullWidth: 1,\n\t\t\t\tfullHeight: 1,\n\t\t\t\toffsetX: 0,\n\t\t\t\toffsetY: 0,\n\t\t\t\twidth: 1,\n\t\t\t\theight: 1\n\t\t\t};\n\n\t\t}\n\n\t\tthis.view.enabled = true;\n\t\tthis.view.fullWidth = fullWidth;\n\t\tthis.view.fullHeight = fullHeight;\n\t\tthis.view.offsetX = x;\n\t\tthis.view.offsetY = y;\n\t\tthis.view.width = width;\n\t\tthis.view.height = height;\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\t/**\n\t * Removes the view offset from the projection matrix.\n\t */\n\tclearViewOffset() {\n\n\t\tif ( this.view !== null ) {\n\n\t\t\tthis.view.enabled = false;\n\n\t\t}\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\t/**\n\t * Updates the camera's projection matrix. Must be called after any change of\n\t * camera properties.\n\t */\n\tupdateProjectionMatrix() {\n\n\t\tconst near = this.near;\n\t\tlet top = near * Math.tan( DEG2RAD * 0.5 * this.fov ) / this.zoom;\n\t\tlet height = 2 * top;\n\t\tlet width = this.aspect * height;\n\t\tlet left = -0.5 * width;\n\t\tconst view = this.view;\n\n\t\tif ( this.view !== null && this.view.enabled ) {\n\n\t\t\tconst fullWidth = view.fullWidth,\n\t\t\t\tfullHeight = view.fullHeight;\n\n\t\t\tleft += view.offsetX * width / fullWidth;\n\t\t\ttop -= view.offsetY * height / fullHeight;\n\t\t\twidth *= view.width / fullWidth;\n\t\t\theight *= view.height / fullHeight;\n\n\t\t}\n\n\t\tconst skew = this.filmOffset;\n\t\tif ( skew !== 0 ) left += near * skew / this.getFilmWidth();\n\n\t\tthis.projectionMatrix.makePerspective( left, left + width, top, top - height, near, this.far, this.coordinateSystem, this.reversedDepth );\n\n\t\tthis.projectionMatrixInverse.copy( this.projectionMatrix ).invert();\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.fov = this.fov;\n\t\tdata.object.zoom = this.zoom;\n\n\t\tdata.object.near = this.near;\n\t\tdata.object.far = this.far;\n\t\tdata.object.focus = this.focus;\n\n\t\tdata.object.aspect = this.aspect;\n\n\t\tif ( this.view !== null ) data.object.view = Object.assign( {}, this.view );\n\n\t\tdata.object.filmGauge = this.filmGauge;\n\t\tdata.object.filmOffset = this.filmOffset;\n\n\t\treturn data;\n\n\t}\n\n}\n\nconst fov = -90; // negative fov is not an error\nconst aspect = 1;\n\n/**\n * A special type of camera that is positioned in 3D space to render its surroundings into a\n * cube render target. The render target can then be used as an environment map for rendering\n * realtime reflections in your scene.\n *\n * ```js\n * // Create cube render target\n * const cubeRenderTarget = new THREE.WebGLCubeRenderTarget( 256, { generateMipmaps: true, minFilter: THREE.LinearMipmapLinearFilter } );\n *\n * // Create cube camera\n * const cubeCamera = new THREE.CubeCamera( 1, 100000, cubeRenderTarget );\n * scene.add( cubeCamera );\n *\n * // Create car\n * const chromeMaterial = new THREE.MeshLambertMaterial( { color: 0xffffff, envMap: cubeRenderTarget.texture } );\n * const car = new THREE.Mesh( carGeometry, chromeMaterial );\n * scene.add( car );\n *\n * // Update the render target cube\n * car.visible = false;\n * cubeCamera.position.copy( car.position );\n * cubeCamera.update( renderer, scene );\n *\n * // Render the scene\n * car.visible = true;\n * renderer.render( scene, camera );\n * ```\n *\n * @augments Object3D\n */\nclass CubeCamera extends Object3D {\n\n\t/**\n\t * Constructs a new cube camera.\n\t *\n\t * @param {number} near - The camera's near plane.\n\t * @param {number} far - The camera's far plane.\n\t * @param {WebGLCubeRenderTarget} renderTarget - The cube render target.\n\t */\n\tconstructor( near, far, renderTarget ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'CubeCamera';\n\n\t\t/**\n\t\t * A reference to the cube render target.\n\t\t *\n\t\t * @type {WebGLCubeRenderTarget}\n\t\t */\n\t\tthis.renderTarget = renderTarget;\n\n\t\t/**\n\t\t * The current active coordinate system.\n\t\t *\n\t\t * @type {?(WebGLCoordinateSystem|WebGPUCoordinateSystem)}\n\t\t * @default null\n\t\t */\n\t\tthis.coordinateSystem = null;\n\n\t\t/**\n\t\t * The current active mipmap level\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.activeMipmapLevel = 0;\n\n\t\tconst cameraPX = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPX.layers = this.layers;\n\t\tthis.add( cameraPX );\n\n\t\tconst cameraNX = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNX.layers = this.layers;\n\t\tthis.add( cameraNX );\n\n\t\tconst cameraPY = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPY.layers = this.layers;\n\t\tthis.add( cameraPY );\n\n\t\tconst cameraNY = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNY.layers = this.layers;\n\t\tthis.add( cameraNY );\n\n\t\tconst cameraPZ = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPZ.layers = this.layers;\n\t\tthis.add( cameraPZ );\n\n\t\tconst cameraNZ = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNZ.layers = this.layers;\n\t\tthis.add( cameraNZ );\n\n\t}\n\n\t/**\n\t * Must be called when the coordinate system of the cube camera is changed.\n\t */\n\tupdateCoordinateSystem() {\n\n\t\tconst coordinateSystem = this.coordinateSystem;\n\n\t\tconst cameras = this.children.concat();\n\n\t\tconst [ cameraPX, cameraNX, cameraPY, cameraNY, cameraPZ, cameraNZ ] = cameras;\n\n\t\tfor ( const camera of cameras ) this.remove( camera );\n\n\t\tif ( coordinateSystem === WebGLCoordinateSystem ) {\n\n\t\t\tcameraPX.up.set( 0, 1, 0 );\n\t\t\tcameraPX.lookAt( 1, 0, 0 );\n\n\t\t\tcameraNX.up.set( 0, 1, 0 );\n\t\t\tcameraNX.lookAt( -1, 0, 0 );\n\n\t\t\tcameraPY.up.set( 0, 0, -1 );\n\t\t\tcameraPY.lookAt( 0, 1, 0 );\n\n\t\t\tcameraNY.up.set( 0, 0, 1 );\n\t\t\tcameraNY.lookAt( 0, -1, 0 );\n\n\t\t\tcameraPZ.up.set( 0, 1, 0 );\n\t\t\tcameraPZ.lookAt( 0, 0, 1 );\n\n\t\t\tcameraNZ.up.set( 0, 1, 0 );\n\t\t\tcameraNZ.lookAt( 0, 0, -1 );\n\n\t\t} else if ( coordinateSystem === WebGPUCoordinateSystem ) {\n\n\t\t\tcameraPX.up.set( 0, -1, 0 );\n\t\t\tcameraPX.lookAt( -1, 0, 0 );\n\n\t\t\tcameraNX.up.set( 0, -1, 0 );\n\t\t\tcameraNX.lookAt( 1, 0, 0 );\n\n\t\t\tcameraPY.up.set( 0, 0, 1 );\n\t\t\tcameraPY.lookAt( 0, 1, 0 );\n\n\t\t\tcameraNY.up.set( 0, 0, -1 );\n\t\t\tcameraNY.lookAt( 0, -1, 0 );\n\n\t\t\tcameraPZ.up.set( 0, -1, 0 );\n\t\t\tcameraPZ.lookAt( 0, 0, 1 );\n\n\t\t\tcameraNZ.up.set( 0, -1, 0 );\n\t\t\tcameraNZ.lookAt( 0, 0, -1 );\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'THREE.CubeCamera.updateCoordinateSystem(): Invalid coordinate system: ' + coordinateSystem );\n\n\t\t}\n\n\t\tfor ( const camera of cameras ) {\n\n\t\t\tthis.add( camera );\n\n\t\t\tcamera.updateMatrixWorld();\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Calling this method will render the given scene with the given renderer\n\t * into the cube render target of the camera.\n\t *\n\t * @param {(Renderer|WebGLRenderer)} renderer - The renderer.\n\t * @param {Scene} scene - The scene to render.\n\t */\n\tupdate( renderer, scene ) {\n\n\t\tif ( this.parent === null ) this.updateMatrixWorld();\n\n\t\tconst { renderTarget, activeMipmapLevel } = this;\n\n\t\tif ( this.coordinateSystem !== renderer.coordinateSystem ) {\n\n\t\t\tthis.coordinateSystem = renderer.coordinateSystem;\n\n\t\t\tthis.updateCoordinateSystem();\n\n\t\t}\n\n\t\tconst [ cameraPX, cameraNX, cameraPY, cameraNY, cameraPZ, cameraNZ ] = this.children;\n\n\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\t\tconst currentActiveCubeFace = renderer.getActiveCubeFace();\n\t\tconst currentActiveMipmapLevel = renderer.getActiveMipmapLevel();\n\n\t\tconst currentXrEnabled = renderer.xr.enabled;\n\n\t\trenderer.xr.enabled = false;\n\n\t\tconst generateMipmaps = renderTarget.texture.generateMipmaps;\n\n\t\trenderTarget.texture.generateMipmaps = false;\n\n\t\trenderer.setRenderTarget( renderTarget, 0, activeMipmapLevel );\n\t\trenderer.render( scene, cameraPX );\n\n\t\trenderer.setRenderTarget( renderTarget, 1, activeMipmapLevel );\n\t\trenderer.render( scene, cameraNX );\n\n\t\trenderer.setRenderTarget( renderTarget, 2, activeMipmapLevel );\n\t\trenderer.render( scene, cameraPY );\n\n\t\trenderer.setRenderTarget( renderTarget, 3, activeMipmapLevel );\n\t\trenderer.render( scene, cameraNY );\n\n\t\trenderer.setRenderTarget( renderTarget, 4, activeMipmapLevel );\n\t\trenderer.render( scene, cameraPZ );\n\n\t\t// mipmaps are generated during the last call of render()\n\t\t// at this point, all sides of the cube render target are defined\n\n\t\trenderTarget.texture.generateMipmaps = generateMipmaps;\n\n\t\trenderer.setRenderTarget( renderTarget, 5, activeMipmapLevel );\n\t\trenderer.render( scene, cameraNZ );\n\n\t\trenderer.setRenderTarget( currentRenderTarget, currentActiveCubeFace, currentActiveMipmapLevel );\n\n\t\trenderer.xr.enabled = currentXrEnabled;\n\n\t\trenderTarget.texture.needsPMREMUpdate = true;\n\n\t}\n\n}\n\n/**\n * Creates a cube texture made up of six images.\n *\n * ```js\n * const loader = new THREE.CubeTextureLoader();\n * loader.setPath( 'textures/cube/pisa/' );\n *\n * const textureCube = loader.load( [\n * \t'px.png', 'nx.png', 'py.png', 'ny.png', 'pz.png', 'nz.png'\n * ] );\n *\n * const material = new THREE.MeshBasicMaterial( { color: 0xffffff, envMap: textureCube } );\n * ```\n *\n * @augments Texture\n */\nclass CubeTexture extends Texture {\n\n\t/**\n\t * Constructs a new cube texture.\n\t *\n\t * @param {Array<Image>} [images=[]] - An array holding a image for each side of a cube.\n\t * @param {number} [mapping=CubeReflectionMapping] - The texture mapping.\n\t * @param {number} [wrapS=ClampToEdgeWrapping] - The wrapS value.\n\t * @param {number} [wrapT=ClampToEdgeWrapping] - The wrapT value.\n\t * @param {number} [magFilter=LinearFilter] - The mag filter value.\n\t * @param {number} [minFilter=LinearMipmapLinearFilter] - The min filter value.\n\t * @param {number} [format=RGBAFormat] - The texture format.\n\t * @param {number} [type=UnsignedByteType] - The texture type.\n\t * @param {number} [anisotropy=Texture.DEFAULT_ANISOTROPY] - The anisotropy value.\n\t * @param {string} [colorSpace=NoColorSpace] - The color space value.\n\t */\n\tconstructor( images = [], mapping = CubeReflectionMapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, colorSpace ) {\n\n\t\tsuper( images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, colorSpace );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCubeTexture = true;\n\n\t\t/**\n\t\t * If set to `true`, the texture is flipped along the vertical axis when\n\t\t * uploaded to the GPU.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.flipY = false;\n\n\t}\n\n\t/**\n\t * Alias for {@link CubeTexture#image}.\n\t *\n\t * @type {Array<Image>}\n\t */\n\tget images() {\n\n\t\treturn this.image;\n\n\t}\n\n\tset images( value ) {\n\n\t\tthis.image = value;\n\n\t}\n\n}\n\n/**\n * A cube render target used in context of {@link WebGLRenderer}.\n *\n * @augments WebGLRenderTarget\n */\nclass WebGLCubeRenderTarget extends WebGLRenderTarget {\n\n\t/**\n\t * Constructs a new cube render target.\n\t *\n\t * @param {number} [size=1] - The size of the render target.\n\t * @param {RenderTarget~Options} [options] - The configuration object.\n\t */\n\tconstructor( size = 1, options = {} ) {\n\n\t\tsuper( size, size, options );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isWebGLCubeRenderTarget = true;\n\n\t\tconst image = { width: size, height: size, depth: 1 };\n\t\tconst images = [ image, image, image, image, image, image ];\n\n\t\t/**\n\t\t * Overwritten with a different texture type.\n\t\t *\n\t\t * @type {DataArrayTexture}\n\t\t */\n\t\tthis.texture = new CubeTexture( images );\n\t\tthis._setTextureOptions( options );\n\n\t\t// By convention -- likely based on the RenderMan spec from the 1990's -- cube maps are specified by WebGL (and three.js)\n\t\t// in a coordinate system in which positive-x is to the right when looking up the positive-z axis -- in other words,\n\t\t// in a left-handed coordinate system. By continuing this convention, preexisting cube maps continued to render correctly.\n\n\t\t// three.js uses a right-handed coordinate system. So environment maps used in three.js appear to have px and nx swapped\n\t\t// and the flag isRenderTargetTexture controls this conversion. The flip is not required when using WebGLCubeRenderTarget.texture\n\t\t// as a cube texture (this is detected when isRenderTargetTexture is set to true for cube textures).\n\n\t\tthis.texture.isRenderTargetTexture = true;\n\n\t}\n\n\t/**\n\t * Converts the given equirectangular texture to a cube map.\n\t *\n\t * @param {WebGLRenderer} renderer - The renderer.\n\t * @param {Texture} texture - The equirectangular texture.\n\t * @return {WebGLCubeRenderTarget} A reference to this cube render target.\n\t */\n\tfromEquirectangularTexture( renderer, texture ) {\n\n\t\tthis.texture.type = texture.type;\n\t\tthis.texture.colorSpace = texture.colorSpace;\n\n\t\tthis.texture.generateMipmaps = texture.generateMipmaps;\n\t\tthis.texture.minFilter = texture.minFilter;\n\t\tthis.texture.magFilter = texture.magFilter;\n\n\t\tconst shader = {\n\n\t\t\tuniforms: {\n\t\t\t\ttEquirect: { value: null },\n\t\t\t},\n\n\t\t\tvertexShader: /* glsl */`\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\tvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\n\t\t\t\t\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n\n\t\t\t\t}\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvWorldDirection = transformDirection( position, modelMatrix );\n\n\t\t\t\t\t#include <begin_vertex>\n\t\t\t\t\t#include <project_vertex>\n\n\t\t\t\t}\n\t\t\t`,\n\n\t\t\tfragmentShader: /* glsl */`\n\n\t\t\t\tuniform sampler2D tEquirect;\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\t#include <common>\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvec3 direction = normalize( vWorldDirection );\n\n\t\t\t\t\tvec2 sampleUV = equirectUv( direction );\n\n\t\t\t\t\tgl_FragColor = texture2D( tEquirect, sampleUV );\n\n\t\t\t\t}\n\t\t\t`\n\t\t};\n\n\t\tconst geometry = new BoxGeometry( 5, 5, 5 );\n\n\t\tconst material = new ShaderMaterial( {\n\n\t\t\tname: 'CubemapFromEquirect',\n\n\t\t\tuniforms: cloneUniforms( shader.uniforms ),\n\t\t\tvertexShader: shader.vertexShader,\n\t\t\tfragmentShader: shader.fragmentShader,\n\t\t\tside: BackSide,\n\t\t\tblending: NoBlending\n\n\t\t} );\n\n\t\tmaterial.uniforms.tEquirect.value = texture;\n\n\t\tconst mesh = new Mesh( geometry, material );\n\n\t\tconst currentMinFilter = texture.minFilter;\n\n\t\t// Avoid blurred poles\n\t\tif ( texture.minFilter === LinearMipmapLinearFilter ) texture.minFilter = LinearFilter;\n\n\t\tconst camera = new CubeCamera( 1, 10, this );\n\t\tcamera.update( renderer, mesh );\n\n\t\ttexture.minFilter = currentMinFilter;\n\n\t\tmesh.geometry.dispose();\n\t\tmesh.material.dispose();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Clears this cube render target.\n\t *\n\t * @param {WebGLRenderer} renderer - The renderer.\n\t * @param {boolean} [color=true] - Whether the color buffer should be cleared or not.\n\t * @param {boolean} [depth=true] - Whether the depth buffer should be cleared or not.\n\t * @param {boolean} [stencil=true] - Whether the stencil buffer should be cleared or not.\n\t */\n\tclear( renderer, color = true, depth = true, stencil = true ) {\n\n\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\trenderer.setRenderTarget( this, i );\n\n\t\t\trenderer.clear( color, depth, stencil );\n\n\t\t}\n\n\t\trenderer.setRenderTarget( currentRenderTarget );\n\n\t}\n\n}\n\n/**\n * This is almost identical to an {@link Object3D}. Its purpose is to\n * make working with groups of objects syntactically clearer.\n *\n * ```js\n * // Create a group and add the two cubes.\n * // These cubes can now be rotated / scaled etc as a group.\n * const group = new THREE.Group();\n *\n * group.add( meshA );\n * group.add( meshB );\n *\n * scene.add( group );\n * ```\n *\n * @augments Object3D\n */\nclass Group extends Object3D {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isGroup = true;\n\n\t\tthis.type = 'Group';\n\n\t}\n\n}\n\nconst _moveEvent = { type: 'move' };\n\n/**\n * Class for representing a XR controller with its\n * different coordinate systems.\n *\n * @private\n */\nclass WebXRController {\n\n\t/**\n\t * Constructs a new XR controller.\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * A group representing the target ray space\n\t\t * of the XR controller.\n\t\t *\n\t\t * @private\n\t\t * @type {?Group}\n\t\t * @default null\n\t\t */\n\t\tthis._targetRay = null;\n\n\t\t/**\n\t\t * A group representing the grip space\n\t\t * of the XR controller.\n\t\t *\n\t\t * @private\n\t\t * @type {?Group}\n\t\t * @default null\n\t\t */\n\t\tthis._grip = null;\n\n\t\t/**\n\t\t * A group representing the hand space\n\t\t * of the XR controller.\n\t\t *\n\t\t * @private\n\t\t * @type {?Group}\n\t\t * @default null\n\t\t */\n\t\tthis._hand = null;\n\n\t}\n\n\t/**\n\t * Returns a group representing the hand space of the XR controller.\n\t *\n\t * @return {Group} A group representing the hand space of the XR controller.\n\t */\n\tgetHandSpace() {\n\n\t\tif ( this._hand === null ) {\n\n\t\t\tthis._hand = new Group();\n\t\t\tthis._hand.matrixAutoUpdate = false;\n\t\t\tthis._hand.visible = false;\n\n\t\t\tthis._hand.joints = {};\n\t\t\tthis._hand.inputState = { pinching: false };\n\n\t\t}\n\n\t\treturn this._hand;\n\n\t}\n\n\t/**\n\t * Returns a group representing the target ray space of the XR controller.\n\t *\n\t * @return {Group} A group representing the target ray space of the XR controller.\n\t */\n\tgetTargetRaySpace() {\n\n\t\tif ( this._targetRay === null ) {\n\n\t\t\tthis._targetRay = new Group();\n\t\t\tthis._targetRay.matrixAutoUpdate = false;\n\t\t\tthis._targetRay.visible = false;\n\t\t\tthis._targetRay.hasLinearVelocity = false;\n\t\t\tthis._targetRay.linearVelocity = new Vector3();\n\t\t\tthis._targetRay.hasAngularVelocity = false;\n\t\t\tthis._targetRay.angularVelocity = new Vector3();\n\n\t\t}\n\n\t\treturn this._targetRay;\n\n\t}\n\n\t/**\n\t * Returns a group representing the grip space of the XR controller.\n\t *\n\t * @return {Group} A group representing the grip space of the XR controller.\n\t */\n\tgetGripSpace() {\n\n\t\tif ( this._grip === null ) {\n\n\t\t\tthis._grip = new Group();\n\t\t\tthis._grip.matrixAutoUpdate = false;\n\t\t\tthis._grip.visible = false;\n\t\t\tthis._grip.hasLinearVelocity = false;\n\t\t\tthis._grip.linearVelocity = new Vector3();\n\t\t\tthis._grip.hasAngularVelocity = false;\n\t\t\tthis._grip.angularVelocity = new Vector3();\n\n\t\t}\n\n\t\treturn this._grip;\n\n\t}\n\n\t/**\n\t * Dispatches the given event to the groups representing\n\t * the different coordinate spaces of the XR controller.\n\t *\n\t * @param {Object} event - The event to dispatch.\n\t * @return {WebXRController} A reference to this instance.\n\t */\n\tdispatchEvent( event ) {\n\n\t\tif ( this._targetRay !== null ) {\n\n\t\t\tthis._targetRay.dispatchEvent( event );\n\n\t\t}\n\n\t\tif ( this._grip !== null ) {\n\n\t\t\tthis._grip.dispatchEvent( event );\n\n\t\t}\n\n\t\tif ( this._hand !== null ) {\n\n\t\t\tthis._hand.dispatchEvent( event );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Connects the controller with the given XR input source.\n\t *\n\t * @param {XRInputSource} inputSource - The input source.\n\t * @return {WebXRController} A reference to this instance.\n\t */\n\tconnect( inputSource ) {\n\n\t\tif ( inputSource && inputSource.hand ) {\n\n\t\t\tconst hand = this._hand;\n\n\t\t\tif ( hand ) {\n\n\t\t\t\tfor ( const inputjoint of inputSource.hand.values() ) {\n\n\t\t\t\t\t// Initialize hand with joints when connected\n\t\t\t\t\tthis._getHandJoint( hand, inputjoint );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.dispatchEvent( { type: 'connected', data: inputSource } );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Disconnects the controller from the given XR input source.\n\t *\n\t * @param {XRInputSource} inputSource - The input source.\n\t * @return {WebXRController} A reference to this instance.\n\t */\n\tdisconnect( inputSource ) {\n\n\t\tthis.dispatchEvent( { type: 'disconnected', data: inputSource } );\n\n\t\tif ( this._targetRay !== null ) {\n\n\t\t\tthis._targetRay.visible = false;\n\n\t\t}\n\n\t\tif ( this._grip !== null ) {\n\n\t\t\tthis._grip.visible = false;\n\n\t\t}\n\n\t\tif ( this._hand !== null ) {\n\n\t\t\tthis._hand.visible = false;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Updates the controller with the given input source, XR frame and reference space.\n\t * This updates the transformations of the groups that represent the different\n\t * coordinate systems of the controller.\n\t *\n\t * @param {XRInputSource} inputSource - The input source.\n\t * @param {XRFrame} frame - The XR frame.\n\t * @param {XRReferenceSpace} referenceSpace - The reference space.\n\t * @return {WebXRController} A reference to this instance.\n\t */\n\tupdate( inputSource, frame, referenceSpace ) {\n\n\t\tlet inputPose = null;\n\t\tlet gripPose = null;\n\t\tlet handPose = null;\n\n\t\tconst targetRay = this._targetRay;\n\t\tconst grip = this._grip;\n\t\tconst hand = this._hand;\n\n\t\tif ( inputSource && frame.session.visibilityState !== 'visible-blurred' ) {\n\n\t\t\tif ( hand && inputSource.hand ) {\n\n\t\t\t\thandPose = true;\n\n\t\t\t\tfor ( const inputjoint of inputSource.hand.values() ) {\n\n\t\t\t\t\t// Update the joints groups with the XRJoint poses\n\t\t\t\t\tconst jointPose = frame.getJointPose( inputjoint, referenceSpace );\n\n\t\t\t\t\t// The transform of this joint will be updated with the joint pose on each frame\n\t\t\t\t\tconst joint = this._getHandJoint( hand, inputjoint );\n\n\t\t\t\t\tif ( jointPose !== null ) {\n\n\t\t\t\t\t\tjoint.matrix.fromArray( jointPose.transform.matrix );\n\t\t\t\t\t\tjoint.matrix.decompose( joint.position, joint.rotation, joint.scale );\n\t\t\t\t\t\tjoint.matrixWorldNeedsUpdate = true;\n\t\t\t\t\t\tjoint.jointRadius = jointPose.radius;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tjoint.visible = jointPose !== null;\n\n\t\t\t\t}\n\n\t\t\t\t// Custom events\n\n\t\t\t\t// Check pinchz\n\t\t\t\tconst indexTip = hand.joints[ 'index-finger-tip' ];\n\t\t\t\tconst thumbTip = hand.joints[ 'thumb-tip' ];\n\t\t\t\tconst distance = indexTip.position.distanceTo( thumbTip.position );\n\n\t\t\t\tconst distanceToPinch = 0.02;\n\t\t\t\tconst threshold = 0.005;\n\n\t\t\t\tif ( hand.inputState.pinching && distance > distanceToPinch + threshold ) {\n\n\t\t\t\t\thand.inputState.pinching = false;\n\t\t\t\t\tthis.dispatchEvent( {\n\t\t\t\t\t\ttype: 'pinchend',\n\t\t\t\t\t\thandedness: inputSource.handedness,\n\t\t\t\t\t\ttarget: this\n\t\t\t\t\t} );\n\n\t\t\t\t} else if ( ! hand.inputState.pinching && distance <= distanceToPinch - threshold ) {\n\n\t\t\t\t\thand.inputState.pinching = true;\n\t\t\t\t\tthis.dispatchEvent( {\n\t\t\t\t\t\ttype: 'pinchstart',\n\t\t\t\t\t\thandedness: inputSource.handedness,\n\t\t\t\t\t\ttarget: this\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( grip !== null && inputSource.gripSpace ) {\n\n\t\t\t\t\tgripPose = frame.getPose( inputSource.gripSpace, referenceSpace );\n\n\t\t\t\t\tif ( gripPose !== null ) {\n\n\t\t\t\t\t\tgrip.matrix.fromArray( gripPose.transform.matrix );\n\t\t\t\t\t\tgrip.matrix.decompose( grip.position, grip.rotation, grip.scale );\n\t\t\t\t\t\tgrip.matrixWorldNeedsUpdate = true;\n\n\t\t\t\t\t\tif ( gripPose.linearVelocity ) {\n\n\t\t\t\t\t\t\tgrip.hasLinearVelocity = true;\n\t\t\t\t\t\t\tgrip.linearVelocity.copy( gripPose.linearVelocity );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tgrip.hasLinearVelocity = false;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( gripPose.angularVelocity ) {\n\n\t\t\t\t\t\t\tgrip.hasAngularVelocity = true;\n\t\t\t\t\t\t\tgrip.angularVelocity.copy( gripPose.angularVelocity );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tgrip.hasAngularVelocity = false;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( targetRay !== null ) {\n\n\t\t\t\tinputPose = frame.getPose( inputSource.targetRaySpace, referenceSpace );\n\n\t\t\t\t// Some runtimes (namely Vive Cosmos with Vive OpenXR Runtime) have only grip space and ray space is equal to it\n\t\t\t\tif ( inputPose === null && gripPose !== null ) {\n\n\t\t\t\t\tinputPose = gripPose;\n\n\t\t\t\t}\n\n\t\t\t\tif ( inputPose !== null ) {\n\n\t\t\t\t\ttargetRay.matrix.fromArray( inputPose.transform.matrix );\n\t\t\t\t\ttargetRay.matrix.decompose( targetRay.position, targetRay.rotation, targetRay.scale );\n\t\t\t\t\ttargetRay.matrixWorldNeedsUpdate = true;\n\n\t\t\t\t\tif ( inputPose.linearVelocity ) {\n\n\t\t\t\t\t\ttargetRay.hasLinearVelocity = true;\n\t\t\t\t\t\ttargetRay.linearVelocity.copy( inputPose.linearVelocity );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttargetRay.hasLinearVelocity = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( inputPose.angularVelocity ) {\n\n\t\t\t\t\t\ttargetRay.hasAngularVelocity = true;\n\t\t\t\t\t\ttargetRay.angularVelocity.copy( inputPose.angularVelocity );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttargetRay.hasAngularVelocity = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.dispatchEvent( _moveEvent );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t}\n\n\t\tif ( targetRay !== null ) {\n\n\t\t\ttargetRay.visible = ( inputPose !== null );\n\n\t\t}\n\n\t\tif ( grip !== null ) {\n\n\t\t\tgrip.visible = ( gripPose !== null );\n\n\t\t}\n\n\t\tif ( hand !== null ) {\n\n\t\t\thand.visible = ( handPose !== null );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a group representing the hand joint for the given input joint.\n\t *\n\t * @private\n\t * @param {Group} hand - The group representing the hand space.\n\t * @param {XRJointSpace} inputjoint - The hand joint data.\n\t * @return {Group} A group representing the hand joint for the given input joint.\n\t */\n\t_getHandJoint( hand, inputjoint ) {\n\n\t\tif ( hand.joints[ inputjoint.jointName ] === undefined ) {\n\n\t\t\tconst joint = new Group();\n\t\t\tjoint.matrixAutoUpdate = false;\n\t\t\tjoint.visible = false;\n\t\t\thand.joints[ inputjoint.jointName ] = joint;\n\n\t\t\thand.add( joint );\n\n\t\t}\n\n\t\treturn hand.joints[ inputjoint.jointName ];\n\n\t}\n\n}\n\n/**\n * This class can be used to define an exponential squared fog,\n * which gives a clear view near the camera and a faster than exponentially\n * densening fog farther from the camera.\n *\n * ```js\n * const scene = new THREE.Scene();\n * scene.fog = new THREE.FogExp2( 0xcccccc, 0.002 );\n * ```\n */\nclass FogExp2 {\n\n\t/**\n\t * Constructs a new fog.\n\t *\n\t * @param {number|Color} color - The fog's color.\n\t * @param {number} [density=0.00025] - Defines how fast the fog will grow dense.\n\t */\n\tconstructor( color, density = 0.00025 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isFogExp2 = true;\n\n\t\t/**\n\t\t * The name of the fog.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\n\t\t/**\n\t\t * The fog's color.\n\t\t *\n\t\t * @type {Color}\n\t\t */\n\t\tthis.color = new Color( color );\n\n\t\t/**\n\t\t *  Defines how fast the fog will grow dense.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.00025\n\t\t */\n\t\tthis.density = density;\n\n\t}\n\n\t/**\n\t * Returns a new fog with copied values from this instance.\n\t *\n\t * @return {FogExp2} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new FogExp2( this.color, this.density );\n\n\t}\n\n\t/**\n\t * Serializes the fog into JSON.\n\t *\n\t * @param {?(Object|string)} meta - An optional value holding meta information about the serialization.\n\t * @return {Object} A JSON object representing the serialized fog\n\t */\n\ttoJSON( /* meta */ ) {\n\n\t\treturn {\n\t\t\ttype: 'FogExp2',\n\t\t\tname: this.name,\n\t\t\tcolor: this.color.getHex(),\n\t\t\tdensity: this.density\n\t\t};\n\n\t}\n\n}\n\n/**\n * This class can be used to define a linear fog that grows linearly denser\n * with the distance.\n *\n * ```js\n * const scene = new THREE.Scene();\n * scene.fog = new THREE.Fog( 0xcccccc, 10, 15 );\n * ```\n */\nclass Fog {\n\n\t/**\n\t * Constructs a new fog.\n\t *\n\t * @param {number|Color} color - The fog's color.\n\t * @param {number} [near=1] - The minimum distance to start applying fog.\n\t * @param {number} [far=1000] - The maximum distance at which fog stops being calculated and applied.\n\t */\n\tconstructor( color, near = 1, far = 1000 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isFog = true;\n\n\t\t/**\n\t\t * The name of the fog.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\n\t\t/**\n\t\t * The fog's color.\n\t\t *\n\t\t * @type {Color}\n\t\t */\n\t\tthis.color = new Color( color );\n\n\t\t/**\n\t\t * The minimum distance to start applying fog. Objects that are less than\n\t\t * `near` units from the active camera won't be affected by fog.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.near = near;\n\n\t\t/**\n\t\t * The maximum distance at which fog stops being calculated and applied.\n\t\t * Objects that are more than `far` units away from the active camera won't\n\t\t * be affected by fog.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1000\n\t\t */\n\t\tthis.far = far;\n\n\t}\n\n\t/**\n\t * Returns a new fog with copied values from this instance.\n\t *\n\t * @return {Fog} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new Fog( this.color, this.near, this.far );\n\n\t}\n\n\t/**\n\t * Serializes the fog into JSON.\n\t *\n\t * @param {?(Object|string)} meta - An optional value holding meta information about the serialization.\n\t * @return {Object} A JSON object representing the serialized fog\n\t */\n\ttoJSON( /* meta */ ) {\n\n\t\treturn {\n\t\t\ttype: 'Fog',\n\t\t\tname: this.name,\n\t\t\tcolor: this.color.getHex(),\n\t\t\tnear: this.near,\n\t\t\tfar: this.far\n\t\t};\n\n\t}\n\n}\n\n/**\n * Scenes allow you to set up what is to be rendered and where by three.js.\n * This is where you place 3D objects like meshes, lines or lights.\n *\n * @augments Object3D\n */\nclass Scene extends Object3D {\n\n\t/**\n\t * Constructs a new scene.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isScene = true;\n\n\t\tthis.type = 'Scene';\n\n\t\t/**\n\t\t * Defines the background of the scene. Valid inputs are:\n\t\t *\n\t\t * - A color for defining a uniform colored background.\n\t\t * - A texture for defining a (flat) textured background.\n\t\t * - Cube textures or equirectangular textures for defining a skybox.\n\t\t *\n\t\t * @type {?(Color|Texture)}\n\t\t * @default null\n\t\t */\n\t\tthis.background = null;\n\n\t\t/**\n\t\t * Sets the environment map for all physical materials in the scene. However,\n\t\t * it's not possible to overwrite an existing texture assigned to the `envMap`\n\t\t * material property.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.environment = null;\n\n\t\t/**\n\t\t * A fog instance defining the type of fog that affects everything\n\t\t * rendered in the scene.\n\t\t *\n\t\t * @type {?(Fog|FogExp2)}\n\t\t * @default null\n\t\t */\n\t\tthis.fog = null;\n\n\t\t/**\n\t\t * Sets the blurriness of the background. Only influences environment maps\n\t\t * assigned to {@link Scene#background}. Valid input is a float between `0`\n\t\t * and `1`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.backgroundBlurriness = 0;\n\n\t\t/**\n\t\t * Attenuates the color of the background. Only applies to background textures.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.backgroundIntensity = 1;\n\n\t\t/**\n\t\t * The rotation of the background in radians. Only influences environment maps\n\t\t * assigned to {@link Scene#background}.\n\t\t *\n\t\t * @type {Euler}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.backgroundRotation = new Euler();\n\n\t\t/**\n\t\t * Attenuates the color of the environment. Only influences environment maps\n\t\t * assigned to {@link Scene#environment}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.environmentIntensity = 1;\n\n\t\t/**\n\t\t * The rotation of the environment map in radians. Only influences physical materials\n\t\t * in the scene when {@link Scene#environment} is used.\n\t\t *\n\t\t * @type {Euler}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.environmentRotation = new Euler();\n\n\t\t/**\n\t\t * Forces everything in the scene to be rendered with the defined material. It is possible\n\t\t * to exclude materials from override by setting {@link Material#allowOverride} to `false`.\n\t\t *\n\t\t * @type {?Material}\n\t\t * @default null\n\t\t */\n\t\tthis.overrideMaterial = null;\n\n\t\tif ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) {\n\n\t\t\t__THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'observe', { detail: this } ) );\n\n\t\t}\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tif ( source.background !== null ) this.background = source.background.clone();\n\t\tif ( source.environment !== null ) this.environment = source.environment.clone();\n\t\tif ( source.fog !== null ) this.fog = source.fog.clone();\n\n\t\tthis.backgroundBlurriness = source.backgroundBlurriness;\n\t\tthis.backgroundIntensity = source.backgroundIntensity;\n\t\tthis.backgroundRotation.copy( source.backgroundRotation );\n\n\t\tthis.environmentIntensity = source.environmentIntensity;\n\t\tthis.environmentRotation.copy( source.environmentRotation );\n\n\t\tif ( source.overrideMaterial !== null ) this.overrideMaterial = source.overrideMaterial.clone();\n\n\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tif ( this.fog !== null ) data.object.fog = this.fog.toJSON();\n\n\t\tif ( this.backgroundBlurriness > 0 ) data.object.backgroundBlurriness = this.backgroundBlurriness;\n\t\tif ( this.backgroundIntensity !== 1 ) data.object.backgroundIntensity = this.backgroundIntensity;\n\t\tdata.object.backgroundRotation = this.backgroundRotation.toArray();\n\n\t\tif ( this.environmentIntensity !== 1 ) data.object.environmentIntensity = this.environmentIntensity;\n\t\tdata.object.environmentRotation = this.environmentRotation.toArray();\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * \"Interleaved\" means that multiple attributes, possibly of different types,\n * (e.g., position, normal, uv, color) are packed into a single array buffer.\n *\n * An introduction into interleaved arrays can be found here: [Interleaved array basics](https://blog.tojicode.com/2011/05/interleaved-array-basics.html)\n */\nclass InterleavedBuffer {\n\n\t/**\n\t * Constructs a new interleaved buffer.\n\t *\n\t * @param {TypedArray} array - A typed array with a shared buffer storing attribute data.\n\t * @param {number} stride - The number of typed-array elements per vertex.\n\t */\n\tconstructor( array, stride ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isInterleavedBuffer = true;\n\n\t\t/**\n\t\t * A typed array with a shared buffer storing attribute data.\n\t\t *\n\t\t * @type {TypedArray}\n\t\t */\n\t\tthis.array = array;\n\n\t\t/**\n\t\t * The number of typed-array elements per vertex.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.stride = stride;\n\n\t\t/**\n\t\t * The total number of elements in the array\n\t\t *\n\t\t * @type {number}\n\t\t * @readonly\n\t\t */\n\t\tthis.count = array !== undefined ? array.length / stride : 0;\n\n\t\t/**\n\t\t * Defines the intended usage pattern of the data store for optimization purposes.\n\t\t *\n\t\t * Note: After the initial use of a buffer, its usage cannot be changed. Instead,\n\t\t * instantiate a new one and set the desired usage before the next render.\n\t\t *\n\t\t * @type {(StaticDrawUsage|DynamicDrawUsage|StreamDrawUsage|StaticReadUsage|DynamicReadUsage|StreamReadUsage|StaticCopyUsage|DynamicCopyUsage|StreamCopyUsage)}\n\t\t * @default StaticDrawUsage\n\t\t */\n\t\tthis.usage = StaticDrawUsage;\n\n\t\t/**\n\t\t * This can be used to only update some components of stored vectors (for example, just the\n\t\t * component related to color). Use the `addUpdateRange()` function to add ranges to this array.\n\t\t *\n\t\t * @type {Array<Object>}\n\t\t */\n\t\tthis.updateRanges = [];\n\n\t\t/**\n\t\t * A version number, incremented every time the `needsUpdate` is set to `true`.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.version = 0;\n\n\t\t/**\n\t\t * The UUID of the interleaved buffer.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.uuid = generateUUID();\n\n\t}\n\n\t/**\n\t * A callback function that is executed after the renderer has transferred the attribute array\n\t * data to the GPU.\n\t */\n\tonUploadCallback() {}\n\n\t/**\n\t * Flag to indicate that this attribute has changed and should be re-sent to\n\t * the GPU. Set this to `true` when you modify the value of the array.\n\t *\n\t * @type {number}\n\t * @default false\n\t * @param {boolean} value\n\t */\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n\t/**\n\t * Sets the usage of this interleaved buffer.\n\t *\n\t * @param {(StaticDrawUsage|DynamicDrawUsage|StreamDrawUsage|StaticReadUsage|DynamicReadUsage|StreamReadUsage|StaticCopyUsage|DynamicCopyUsage|StreamCopyUsage)} value - The usage to set.\n\t * @return {InterleavedBuffer} A reference to this interleaved buffer.\n\t */\n\tsetUsage( value ) {\n\n\t\tthis.usage = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds a range of data in the data array to be updated on the GPU.\n\t *\n\t * @param {number} start - Position at which to start update.\n\t * @param {number} count - The number of components to update.\n\t */\n\taddUpdateRange( start, count ) {\n\n\t\tthis.updateRanges.push( { start, count } );\n\n\t}\n\n\t/**\n\t * Clears the update ranges.\n\t */\n\tclearUpdateRanges() {\n\n\t\tthis.updateRanges.length = 0;\n\n\t}\n\n\t/**\n\t * Copies the values of the given interleaved buffer to this instance.\n\t *\n\t * @param {InterleavedBuffer} source - The interleaved buffer to copy.\n\t * @return {InterleavedBuffer} A reference to this instance.\n\t */\n\tcopy( source ) {\n\n\t\tthis.array = new source.array.constructor( source.array );\n\t\tthis.count = source.count;\n\t\tthis.stride = source.stride;\n\t\tthis.usage = source.usage;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies a vector from the given interleaved buffer to this one. The start\n\t * and destination position in the attribute buffers are represented by the\n\t * given indices.\n\t *\n\t * @param {number} index1 - The destination index into this interleaved buffer.\n\t * @param {InterleavedBuffer} interleavedBuffer - The interleaved buffer to copy from.\n\t * @param {number} index2 - The source index into the given interleaved buffer.\n\t * @return {InterleavedBuffer} A reference to this instance.\n\t */\n\tcopyAt( index1, interleavedBuffer, index2 ) {\n\n\t\tindex1 *= this.stride;\n\t\tindex2 *= interleavedBuffer.stride;\n\n\t\tfor ( let i = 0, l = this.stride; i < l; i ++ ) {\n\n\t\t\tthis.array[ index1 + i ] = interleavedBuffer.array[ index2 + i ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given array data in the interleaved buffer.\n\t *\n\t * @param {(TypedArray|Array)} value - The array data to set.\n\t * @param {number} [offset=0] - The offset in this interleaved buffer's array.\n\t * @return {InterleavedBuffer} A reference to this instance.\n\t */\n\tset( value, offset = 0 ) {\n\n\t\tthis.array.set( value, offset );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new interleaved buffer with copied values from this instance.\n\t *\n\t * @param {Object} [data] - An object with shared array buffers that allows to retain shared structures.\n\t * @return {InterleavedBuffer} A clone of this instance.\n\t */\n\tclone( data ) {\n\n\t\tif ( data.arrayBuffers === undefined ) {\n\n\t\t\tdata.arrayBuffers = {};\n\n\t\t}\n\n\t\tif ( this.array.buffer._uuid === undefined ) {\n\n\t\t\tthis.array.buffer._uuid = generateUUID();\n\n\t\t}\n\n\t\tif ( data.arrayBuffers[ this.array.buffer._uuid ] === undefined ) {\n\n\t\t\tdata.arrayBuffers[ this.array.buffer._uuid ] = this.array.slice( 0 ).buffer;\n\n\t\t}\n\n\t\tconst array = new this.array.constructor( data.arrayBuffers[ this.array.buffer._uuid ] );\n\n\t\tconst ib = new this.constructor( array, this.stride );\n\t\tib.setUsage( this.usage );\n\n\t\treturn ib;\n\n\t}\n\n\t/**\n\t * Sets the given callback function that is executed after the Renderer has transferred\n\t * the array data to the GPU. Can be used to perform clean-up operations after\n\t * the upload when data are not needed anymore on the CPU side.\n\t *\n\t * @param {Function} callback - The `onUpload()` callback.\n\t * @return {InterleavedBuffer} A reference to this instance.\n\t */\n\tonUpload( callback ) {\n\n\t\tthis.onUploadCallback = callback;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Serializes the interleaved buffer into JSON.\n\t *\n\t * @param {Object} [data] - An optional value holding meta information about the serialization.\n\t * @return {Object} A JSON object representing the serialized interleaved buffer.\n\t */\n\ttoJSON( data ) {\n\n\t\tif ( data.arrayBuffers === undefined ) {\n\n\t\t\tdata.arrayBuffers = {};\n\n\t\t}\n\n\t\t// generate UUID for array buffer if necessary\n\n\t\tif ( this.array.buffer._uuid === undefined ) {\n\n\t\t\tthis.array.buffer._uuid = generateUUID();\n\n\t\t}\n\n\t\tif ( data.arrayBuffers[ this.array.buffer._uuid ] === undefined ) {\n\n\t\t\tdata.arrayBuffers[ this.array.buffer._uuid ] = Array.from( new Uint32Array( this.array.buffer ) );\n\n\t\t}\n\n\t\t//\n\n\t\treturn {\n\t\t\tuuid: this.uuid,\n\t\t\tbuffer: this.array.buffer._uuid,\n\t\t\ttype: this.array.constructor.name,\n\t\t\tstride: this.stride\n\t\t};\n\n\t}\n\n}\n\nconst _vector$7 = /*@__PURE__*/ new Vector3();\n\n/**\n * An alternative version of a buffer attribute with interleaved data. Interleaved\n * attributes share a common interleaved data storage ({@link InterleavedBuffer}) and refer with\n * different offsets into the buffer.\n */\nclass InterleavedBufferAttribute {\n\n\t/**\n\t * Constructs a new interleaved buffer attribute.\n\t *\n\t * @param {InterleavedBuffer} interleavedBuffer - The buffer holding the interleaved data.\n\t * @param {number} itemSize - The item size.\n\t * @param {number} offset - The attribute offset into the buffer.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( interleavedBuffer, itemSize, offset, normalized = false ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isInterleavedBufferAttribute = true;\n\n\t\t/**\n\t\t * The name of the buffer attribute.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\n\t\t/**\n\t\t * The buffer holding the interleaved data.\n\t\t *\n\t\t * @type {InterleavedBuffer}\n\t\t */\n\t\tthis.data = interleavedBuffer;\n\n\t\t/**\n\t\t * The item size, see {@link BufferAttribute#itemSize}.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.itemSize = itemSize;\n\n\t\t/**\n\t\t * The attribute offset into the buffer.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.offset = offset;\n\n\t\t/**\n\t\t * Whether the data are normalized or not, see {@link BufferAttribute#normalized}\n\t\t *\n\t\t * @type {InterleavedBuffer}\n\t\t */\n\t\tthis.normalized = normalized;\n\n\t}\n\n\t/**\n\t * The item count of this buffer attribute.\n\t *\n\t * @type {number}\n\t * @readonly\n\t */\n\tget count() {\n\n\t\treturn this.data.count;\n\n\t}\n\n\t/**\n\t * The array holding the interleaved buffer attribute data.\n\t *\n\t * @type {TypedArray}\n\t */\n\tget array() {\n\n\t\treturn this.data.array;\n\n\t}\n\n\t/**\n\t * Flag to indicate that this attribute has changed and should be re-sent to\n\t * the GPU. Set this to `true` when you modify the value of the array.\n\t *\n\t * @type {number}\n\t * @default false\n\t * @param {boolean} value\n\t */\n\tset needsUpdate( value ) {\n\n\t\tthis.data.needsUpdate = value;\n\n\t}\n\n\t/**\n\t * Applies the given 4x4 matrix to the given attribute. Only works with\n\t * item size `3`.\n\t *\n\t * @param {Matrix4} m - The matrix to apply.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\tapplyMatrix4( m ) {\n\n\t\tfor ( let i = 0, l = this.data.count; i < l; i ++ ) {\n\n\t\t\t_vector$7.fromBufferAttribute( this, i );\n\n\t\t\t_vector$7.applyMatrix4( m );\n\n\t\t\tthis.setXYZ( i, _vector$7.x, _vector$7.y, _vector$7.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Applies the given 3x3 normal matrix to the given attribute. Only works with\n\t * item size `3`.\n\t *\n\t * @param {Matrix3} m - The normal matrix to apply.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\tapplyNormalMatrix( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$7.fromBufferAttribute( this, i );\n\n\t\t\t_vector$7.applyNormalMatrix( m );\n\n\t\t\tthis.setXYZ( i, _vector$7.x, _vector$7.y, _vector$7.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Applies the given 4x4 matrix to the given attribute. Only works with\n\t * item size `3` and with direction vectors.\n\t *\n\t * @param {Matrix4} m - The matrix to apply.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\ttransformDirection( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$7.fromBufferAttribute( this, i );\n\n\t\t\t_vector$7.transformDirection( m );\n\n\t\t\tthis.setXYZ( i, _vector$7.x, _vector$7.y, _vector$7.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the given component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} component - The component index.\n\t * @return {number} The returned value.\n\t */\n\tgetComponent( index, component ) {\n\n\t\tlet value = this.array[ index * this.data.stride + this.offset + component ];\n\n\t\tif ( this.normalized ) value = denormalize( value, this.array );\n\n\t\treturn value;\n\n\t}\n\n\t/**\n\t * Sets the given value to the given component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} component - The component index.\n\t * @param {number} value - The value to set.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\tsetComponent( index, component, value ) {\n\n\t\tif ( this.normalized ) value = normalize( value, this.array );\n\n\t\tthis.data.array[ index * this.data.stride + this.offset + component ] = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the x component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} x - The value to set.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\tsetX( index, x ) {\n\n\t\tif ( this.normalized ) x = normalize( x, this.array );\n\n\t\tthis.data.array[ index * this.data.stride + this.offset ] = x;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the y component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} y - The value to set.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\tsetY( index, y ) {\n\n\t\tif ( this.normalized ) y = normalize( y, this.array );\n\n\t\tthis.data.array[ index * this.data.stride + this.offset + 1 ] = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the z component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} z - The value to set.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\tsetZ( index, z ) {\n\n\t\tif ( this.normalized ) z = normalize( z, this.array );\n\n\t\tthis.data.array[ index * this.data.stride + this.offset + 2 ] = z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the w component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} w - The value to set.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\tsetW( index, w ) {\n\n\t\tif ( this.normalized ) w = normalize( w, this.array );\n\n\t\tthis.data.array[ index * this.data.stride + this.offset + 3 ] = w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the x component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @return {number} The x component.\n\t */\n\tgetX( index ) {\n\n\t\tlet x = this.data.array[ index * this.data.stride + this.offset ];\n\n\t\tif ( this.normalized ) x = denormalize( x, this.array );\n\n\t\treturn x;\n\n\t}\n\n\t/**\n\t * Returns the y component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @return {number} The y component.\n\t */\n\tgetY( index ) {\n\n\t\tlet y = this.data.array[ index * this.data.stride + this.offset + 1 ];\n\n\t\tif ( this.normalized ) y = denormalize( y, this.array );\n\n\t\treturn y;\n\n\t}\n\n\t/**\n\t * Returns the z component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @return {number} The z component.\n\t */\n\tgetZ( index ) {\n\n\t\tlet z = this.data.array[ index * this.data.stride + this.offset + 2 ];\n\n\t\tif ( this.normalized ) z = denormalize( z, this.array );\n\n\t\treturn z;\n\n\t}\n\n\t/**\n\t * Returns the w component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @return {number} The w component.\n\t */\n\tgetW( index ) {\n\n\t\tlet w = this.data.array[ index * this.data.stride + this.offset + 3 ];\n\n\t\tif ( this.normalized ) w = denormalize( w, this.array );\n\n\t\treturn w;\n\n\t}\n\n\t/**\n\t * Sets the x and y component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} x - The value for the x component to set.\n\t * @param {number} y - The value for the y component to set.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\tsetXY( index, x, y ) {\n\n\t\tindex = index * this.data.stride + this.offset;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\n\t\t}\n\n\t\tthis.data.array[ index + 0 ] = x;\n\t\tthis.data.array[ index + 1 ] = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the x, y and z component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} x - The value for the x component to set.\n\t * @param {number} y - The value for the y component to set.\n\t * @param {number} z - The value for the z component to set.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\tsetXYZ( index, x, y, z ) {\n\n\t\tindex = index * this.data.stride + this.offset;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\t\t\tz = normalize( z, this.array );\n\n\t\t}\n\n\t\tthis.data.array[ index + 0 ] = x;\n\t\tthis.data.array[ index + 1 ] = y;\n\t\tthis.data.array[ index + 2 ] = z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the x, y, z and w component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} x - The value for the x component to set.\n\t * @param {number} y - The value for the y component to set.\n\t * @param {number} z - The value for the z component to set.\n\t * @param {number} w - The value for the w component to set.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\tsetXYZW( index, x, y, z, w ) {\n\n\t\tindex = index * this.data.stride + this.offset;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\t\t\tz = normalize( z, this.array );\n\t\t\tw = normalize( w, this.array );\n\n\t\t}\n\n\t\tthis.data.array[ index + 0 ] = x;\n\t\tthis.data.array[ index + 1 ] = y;\n\t\tthis.data.array[ index + 2 ] = z;\n\t\tthis.data.array[ index + 3 ] = w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new buffer attribute with copied values from this instance.\n\t *\n\t * If no parameter is provided, cloning an interleaved buffer attribute will de-interleave buffer data.\n\t *\n\t * @param {Object} [data] - An object with interleaved buffers that allows to retain the interleaved property.\n\t * @return {BufferAttribute|InterleavedBufferAttribute} A clone of this instance.\n\t */\n\tclone( data ) {\n\n\t\tif ( data === undefined ) {\n\n\t\t\tlog( 'InterleavedBufferAttribute.clone(): Cloning an interleaved buffer attribute will de-interleave buffer data.' );\n\n\t\t\tconst array = [];\n\n\t\t\tfor ( let i = 0; i < this.count; i ++ ) {\n\n\t\t\t\tconst index = i * this.data.stride + this.offset;\n\n\t\t\t\tfor ( let j = 0; j < this.itemSize; j ++ ) {\n\n\t\t\t\t\tarray.push( this.data.array[ index + j ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new BufferAttribute( new this.array.constructor( array ), this.itemSize, this.normalized );\n\n\t\t} else {\n\n\t\t\tif ( data.interleavedBuffers === undefined ) {\n\n\t\t\t\tdata.interleavedBuffers = {};\n\n\t\t\t}\n\n\t\t\tif ( data.interleavedBuffers[ this.data.uuid ] === undefined ) {\n\n\t\t\t\tdata.interleavedBuffers[ this.data.uuid ] = this.data.clone( data );\n\n\t\t\t}\n\n\t\t\treturn new InterleavedBufferAttribute( data.interleavedBuffers[ this.data.uuid ], this.itemSize, this.offset, this.normalized );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Serializes the buffer attribute into JSON.\n\t *\n\t * If no parameter is provided, cloning an interleaved buffer attribute will de-interleave buffer data.\n\t *\n\t * @param {Object} [data] - An optional value holding meta information about the serialization.\n\t * @return {Object} A JSON object representing the serialized buffer attribute.\n\t */\n\ttoJSON( data ) {\n\n\t\tif ( data === undefined ) {\n\n\t\t\tlog( 'InterleavedBufferAttribute.toJSON(): Serializing an interleaved buffer attribute will de-interleave buffer data.' );\n\n\t\t\tconst array = [];\n\n\t\t\tfor ( let i = 0; i < this.count; i ++ ) {\n\n\t\t\t\tconst index = i * this.data.stride + this.offset;\n\n\t\t\t\tfor ( let j = 0; j < this.itemSize; j ++ ) {\n\n\t\t\t\t\tarray.push( this.data.array[ index + j ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// de-interleave data and save it as an ordinary buffer attribute for now\n\n\t\t\treturn {\n\t\t\t\titemSize: this.itemSize,\n\t\t\t\ttype: this.array.constructor.name,\n\t\t\t\tarray: array,\n\t\t\t\tnormalized: this.normalized\n\t\t\t};\n\n\t\t} else {\n\n\t\t\t// save as true interleaved attribute\n\n\t\t\tif ( data.interleavedBuffers === undefined ) {\n\n\t\t\t\tdata.interleavedBuffers = {};\n\n\t\t\t}\n\n\t\t\tif ( data.interleavedBuffers[ this.data.uuid ] === undefined ) {\n\n\t\t\t\tdata.interleavedBuffers[ this.data.uuid ] = this.data.toJSON( data );\n\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tisInterleavedBufferAttribute: true,\n\t\t\t\titemSize: this.itemSize,\n\t\t\t\tdata: this.data.uuid,\n\t\t\t\toffset: this.offset,\n\t\t\t\tnormalized: this.normalized\n\t\t\t};\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * A material for rendering instances of {@link Sprite}.\n *\n * ```js\n * const map = new THREE.TextureLoader().load( 'textures/sprite.png' );\n * const material = new THREE.SpriteMaterial( { map: map, color: 0xffffff } );\n *\n * const sprite = new THREE.Sprite( material );\n * sprite.scale.set(200, 200, 1)\n * scene.add( sprite );\n * ```\n *\n * @augments Material\n */\nclass SpriteMaterial extends Material {\n\n\t/**\n\t * Constructs a new sprite material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSpriteMaterial = true;\n\n\t\tthis.type = 'SpriteMaterial';\n\n\t\t/**\n\t\t * Color of the material.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.color = new Color( 0xffffff );\n\n\t\t/**\n\t\t * The color map. May optionally include an alpha channel, typically combined\n\t\t * with {@link Material#transparent} or {@link Material#alphaTest}. The texture map\n\t\t * color is modulated by the diffuse `color`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * The alpha map is a grayscale texture that controls the opacity across the\n\t\t * surface (black: fully transparent; white: fully opaque).\n\t\t *\n\t\t * Only the color of the texture is used, ignoring the alpha channel if one\n\t\t * exists. For RGB and RGBA textures, the renderer will use the green channel\n\t\t * when sampling this texture due to the extra bit of precision provided for\n\t\t * green in DXT-compressed and uncompressed RGB 565 formats. Luminance-only and\n\t\t * luminance/alpha textures will also still work as expected.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.alphaMap = null;\n\n\t\t/**\n\t\t * The rotation of the sprite in radians.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.rotation = 0;\n\n\t\t/**\n\t\t * Specifies whether size of the sprite is attenuated by the camera depth (perspective camera only).\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.sizeAttenuation = true;\n\n\t\t/**\n\t\t * Overwritten since sprite materials are transparent\n\t\t * by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.transparent = true;\n\n\t\t/**\n\t\t * Whether the material is affected by fog or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.rotation = source.rotation;\n\n\t\tthis.sizeAttenuation = source.sizeAttenuation;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nlet _geometry;\n\nconst _intersectPoint = /*@__PURE__*/ new Vector3();\nconst _worldScale = /*@__PURE__*/ new Vector3();\nconst _mvPosition = /*@__PURE__*/ new Vector3();\n\nconst _alignedPosition = /*@__PURE__*/ new Vector2();\nconst _rotatedPosition = /*@__PURE__*/ new Vector2();\nconst _viewWorldMatrix = /*@__PURE__*/ new Matrix4();\n\nconst _vA = /*@__PURE__*/ new Vector3();\nconst _vB = /*@__PURE__*/ new Vector3();\nconst _vC = /*@__PURE__*/ new Vector3();\n\nconst _uvA = /*@__PURE__*/ new Vector2();\nconst _uvB = /*@__PURE__*/ new Vector2();\nconst _uvC = /*@__PURE__*/ new Vector2();\n\n/**\n * A sprite is a plane that always faces towards the camera, generally with a\n * partially transparent texture applied.\n *\n * Sprites do not cast shadows, setting {@link Object3D#castShadow} to `true` will\n * have no effect.\n *\n * ```js\n * const map = new THREE.TextureLoader().load( 'sprite.png' );\n * const material = new THREE.SpriteMaterial( { map: map } );\n *\n * const sprite = new THREE.Sprite( material );\n * scene.add( sprite );\n * ```\n *\n * @augments Object3D\n */\nclass Sprite extends Object3D {\n\n\t/**\n\t * Constructs a new sprite.\n\t *\n\t * @param {(SpriteMaterial|SpriteNodeMaterial)} [material] - The sprite material.\n\t */\n\tconstructor( material = new SpriteMaterial() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSprite = true;\n\n\t\tthis.type = 'Sprite';\n\n\t\tif ( _geometry === undefined ) {\n\n\t\t\t_geometry = new BufferGeometry();\n\n\t\t\tconst float32Array = new Float32Array( [\n\t\t\t\t-0.5, -0.5, 0, 0, 0,\n\t\t\t\t0.5, -0.5, 0, 1, 0,\n\t\t\t\t0.5, 0.5, 0, 1, 1,\n\t\t\t\t-0.5, 0.5, 0, 0, 1\n\t\t\t] );\n\n\t\t\tconst interleavedBuffer = new InterleavedBuffer( float32Array, 5 );\n\n\t\t\t_geometry.setIndex( [ 0, 1, 2,\t0, 2, 3 ] );\n\t\t\t_geometry.setAttribute( 'position', new InterleavedBufferAttribute( interleavedBuffer, 3, 0, false ) );\n\t\t\t_geometry.setAttribute( 'uv', new InterleavedBufferAttribute( interleavedBuffer, 2, 3, false ) );\n\n\t\t}\n\n\t\t/**\n\t\t * The sprite geometry.\n\t\t *\n\t\t * @type {BufferGeometry}\n\t\t */\n\t\tthis.geometry = _geometry;\n\n\t\t/**\n\t\t * The sprite material.\n\t\t *\n\t\t * @type {(SpriteMaterial|SpriteNodeMaterial)}\n\t\t */\n\t\tthis.material = material;\n\n\t\t/**\n\t\t * The sprite's anchor point, and the point around which the sprite rotates.\n\t\t * A value of `(0.5, 0.5)` corresponds to the midpoint of the sprite. A value\n\t\t * of `(0, 0)` corresponds to the lower left corner of the sprite.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (0.5,0.5)\n\t\t */\n\t\tthis.center = new Vector2( 0.5, 0.5 );\n\n\t\t/**\n\t\t * The number of instances of this sprite.\n\t\t * Can only be used with {@link WebGPURenderer}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.count = 1;\n\n\t}\n\n\t/**\n\t * Computes intersection points between a casted ray and this sprite.\n\t *\n\t * @param {Raycaster} raycaster - The raycaster.\n\t * @param {Array<Object>} intersects - The target array that holds the intersection points.\n\t */\n\traycast( raycaster, intersects ) {\n\n\t\tif ( raycaster.camera === null ) {\n\n\t\t\terror( 'Sprite: \"Raycaster.camera\" needs to be set in order to raycast against sprites.' );\n\n\t\t}\n\n\t\t_worldScale.setFromMatrixScale( this.matrixWorld );\n\n\t\t_viewWorldMatrix.copy( raycaster.camera.matrixWorld );\n\t\tthis.modelViewMatrix.multiplyMatrices( raycaster.camera.matrixWorldInverse, this.matrixWorld );\n\n\t\t_mvPosition.setFromMatrixPosition( this.modelViewMatrix );\n\n\t\tif ( raycaster.camera.isPerspectiveCamera && this.material.sizeAttenuation === false ) {\n\n\t\t\t_worldScale.multiplyScalar( - _mvPosition.z );\n\n\t\t}\n\n\t\tconst rotation = this.material.rotation;\n\t\tlet sin, cos;\n\n\t\tif ( rotation !== 0 ) {\n\n\t\t\tcos = Math.cos( rotation );\n\t\t\tsin = Math.sin( rotation );\n\n\t\t}\n\n\t\tconst center = this.center;\n\n\t\ttransformVertex( _vA.set( -0.5, -0.5, 0 ), _mvPosition, center, _worldScale, sin, cos );\n\t\ttransformVertex( _vB.set( 0.5, -0.5, 0 ), _mvPosition, center, _worldScale, sin, cos );\n\t\ttransformVertex( _vC.set( 0.5, 0.5, 0 ), _mvPosition, center, _worldScale, sin, cos );\n\n\t\t_uvA.set( 0, 0 );\n\t\t_uvB.set( 1, 0 );\n\t\t_uvC.set( 1, 1 );\n\n\t\t// check first triangle\n\t\tlet intersect = raycaster.ray.intersectTriangle( _vA, _vB, _vC, false, _intersectPoint );\n\n\t\tif ( intersect === null ) {\n\n\t\t\t// check second triangle\n\t\t\ttransformVertex( _vB.set( -0.5, 0.5, 0 ), _mvPosition, center, _worldScale, sin, cos );\n\t\t\t_uvB.set( 0, 1 );\n\n\t\t\tintersect = raycaster.ray.intersectTriangle( _vA, _vC, _vB, false, _intersectPoint );\n\t\t\tif ( intersect === null ) {\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst distance = raycaster.ray.origin.distanceTo( _intersectPoint );\n\n\t\tif ( distance < raycaster.near || distance > raycaster.far ) return;\n\n\t\tintersects.push( {\n\n\t\t\tdistance: distance,\n\t\t\tpoint: _intersectPoint.clone(),\n\t\t\tuv: Triangle.getInterpolation( _intersectPoint, _vA, _vB, _vC, _uvA, _uvB, _uvC, new Vector2() ),\n\t\t\tface: null,\n\t\t\tobject: this\n\n\t\t} );\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tif ( source.center !== undefined ) this.center.copy( source.center );\n\n\t\tthis.material = source.material;\n\n\t\treturn this;\n\n\t}\n\n}\n\nfunction transformVertex( vertexPosition, mvPosition, center, scale, sin, cos ) {\n\n\t// compute position in camera space\n\t_alignedPosition.subVectors( vertexPosition, center ).addScalar( 0.5 ).multiply( scale );\n\n\t// to check if rotation is not zero\n\tif ( sin !== undefined ) {\n\n\t\t_rotatedPosition.x = ( cos * _alignedPosition.x ) - ( sin * _alignedPosition.y );\n\t\t_rotatedPosition.y = ( sin * _alignedPosition.x ) + ( cos * _alignedPosition.y );\n\n\t} else {\n\n\t\t_rotatedPosition.copy( _alignedPosition );\n\n\t}\n\n\n\tvertexPosition.copy( mvPosition );\n\tvertexPosition.x += _rotatedPosition.x;\n\tvertexPosition.y += _rotatedPosition.y;\n\n\t// transform to world space\n\tvertexPosition.applyMatrix4( _viewWorldMatrix );\n\n}\n\nconst _v1$2 = /*@__PURE__*/ new Vector3();\nconst _v2$1 = /*@__PURE__*/ new Vector3();\n\n/**\n * A component for providing a basic Level of Detail (LOD) mechanism.\n *\n * Every LOD level is associated with an object, and rendering can be switched\n * between them at the distances specified. Typically you would create, say,\n * three meshes, one for far away (low detail), one for mid range (medium\n * detail) and one for close up (high detail).\n *\n * ```js\n * const lod = new THREE.LOD();\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n *\n * //Create spheres with 3 levels of detail and create new LOD levels for them\n * for( let i = 0; i < 3; i++ ) {\n *\n * \tconst geometry = new THREE.IcosahedronGeometry( 10, 3 - i );\n * \tconst mesh = new THREE.Mesh( geometry, material );\n * \tlod.addLevel( mesh, i * 75 );\n *\n * }\n *\n * scene.add( lod );\n * ```\n *\n * @augments Object3D\n */\nclass LOD extends Object3D {\n\n\t/**\n\t * Constructs a new LOD.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLOD = true;\n\n\t\t/**\n\t\t * The current LOD index.\n\t\t *\n\t\t * @private\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis._currentLevel = 0;\n\n\t\tthis.type = 'LOD';\n\n\t\tObject.defineProperties( this, {\n\t\t\t/**\n\t\t\t * This array holds the LOD levels.\n\t\t\t *\n\t\t\t * @name LOD#levels\n\t\t\t * @type {Array<{object:Object3D,distance:number,hysteresis:number}>}\n\t\t\t */\n\t\t\tlevels: {\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: []\n\t\t\t}\n\t\t} );\n\n\t\t/**\n\t\t * Whether the LOD object is updated automatically by the renderer per frame\n\t\t * or not. If set to `false`, you have to call {@link LOD#update} in the\n\t\t * render loop by yourself.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.autoUpdate = true;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source, false );\n\n\t\tconst levels = source.levels;\n\n\t\tfor ( let i = 0, l = levels.length; i < l; i ++ ) {\n\n\t\t\tconst level = levels[ i ];\n\n\t\t\tthis.addLevel( level.object.clone(), level.distance, level.hysteresis );\n\n\t\t}\n\n\t\tthis.autoUpdate = source.autoUpdate;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds a mesh that will display at a certain distance and greater. Typically\n\t * the further away the distance, the lower the detail on the mesh.\n\t *\n\t * @param {Object3D} object - The 3D object to display at this level.\n\t * @param {number} [distance=0] - The distance at which to display this level of detail.\n\t * @param {number} [hysteresis=0] - Threshold used to avoid flickering at LOD boundaries, as a fraction of distance.\n\t * @return {LOD} A reference to this instance.\n\t */\n\taddLevel( object, distance = 0, hysteresis = 0 ) {\n\n\t\tdistance = Math.abs( distance );\n\n\t\tconst levels = this.levels;\n\n\t\tlet l;\n\n\t\tfor ( l = 0; l < levels.length; l ++ ) {\n\n\t\t\tif ( distance < levels[ l ].distance ) {\n\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tlevels.splice( l, 0, { distance: distance, hysteresis: hysteresis, object: object } );\n\n\t\tthis.add( object );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Removes an existing level, based on the distance from the camera.\n\t * Returns `true` when the level has been removed. Otherwise `false`.\n\t *\n\t * @param {number} distance - Distance of the level to remove.\n\t * @return {boolean} Whether the level has been removed or not.\n\t */\n\tremoveLevel( distance ) {\n\n\t\tconst levels = this.levels;\n\n\t\tfor ( let i = 0; i < levels.length; i ++ ) {\n\n\t\t\tif ( levels[ i ].distance === distance ) {\n\n\t\t\t\tconst removedElements = levels.splice( i, 1 );\n\t\t\t\tthis.remove( removedElements[ 0 ].object );\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\t/**\n\t * Returns the currently active LOD level index.\n\t *\n\t * @return {number} The current active LOD level index.\n\t */\n\tgetCurrentLevel() {\n\n\t\treturn this._currentLevel;\n\n\t}\n\n\t/**\n\t * Returns a reference to the first 3D object that is greater than\n\t * the given distance.\n\t *\n\t * @param {number} distance - The LOD distance.\n\t * @return {?Object3D} The found 3D object. `null` if no 3D object has been found.\n\t */\n\tgetObjectForDistance( distance ) {\n\n\t\tconst levels = this.levels;\n\n\t\tif ( levels.length > 0 ) {\n\n\t\t\tlet i, l;\n\n\t\t\tfor ( i = 1, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\tlet levelDistance = levels[ i ].distance;\n\n\t\t\t\tif ( levels[ i ].object.visible ) {\n\n\t\t\t\t\tlevelDistance -= levelDistance * levels[ i ].hysteresis;\n\n\t\t\t\t}\n\n\t\t\t\tif ( distance < levelDistance ) {\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn levels[ i - 1 ].object;\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\t/**\n\t * Computes intersection points between a casted ray and this LOD.\n\t *\n\t * @param {Raycaster} raycaster - The raycaster.\n\t * @param {Array<Object>} intersects - The target array that holds the intersection points.\n\t */\n\traycast( raycaster, intersects ) {\n\n\t\tconst levels = this.levels;\n\n\t\tif ( levels.length > 0 ) {\n\n\t\t\t_v1$2.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\tconst distance = raycaster.ray.origin.distanceTo( _v1$2 );\n\n\t\t\tthis.getObjectForDistance( distance ).raycast( raycaster, intersects );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Updates the LOD by computing which LOD level should be visible according\n\t * to the current distance of the given camera.\n\t *\n\t * @param {Camera} camera - The camera the scene is rendered with.\n\t */\n\tupdate( camera ) {\n\n\t\tconst levels = this.levels;\n\n\t\tif ( levels.length > 1 ) {\n\n\t\t\t_v1$2.setFromMatrixPosition( camera.matrixWorld );\n\t\t\t_v2$1.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\tconst distance = _v1$2.distanceTo( _v2$1 ) / camera.zoom;\n\n\t\t\tlevels[ 0 ].object.visible = true;\n\n\t\t\tlet i, l;\n\n\t\t\tfor ( i = 1, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\tlet levelDistance = levels[ i ].distance;\n\n\t\t\t\tif ( levels[ i ].object.visible ) {\n\n\t\t\t\t\tlevelDistance -= levelDistance * levels[ i ].hysteresis;\n\n\t\t\t\t}\n\n\t\t\t\tif ( distance >= levelDistance ) {\n\n\t\t\t\t\tlevels[ i - 1 ].object.visible = false;\n\t\t\t\t\tlevels[ i ].object.visible = true;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis._currentLevel = i - 1;\n\n\t\t\tfor ( ; i < l; i ++ ) {\n\n\t\t\t\tlevels[ i ].object.visible = false;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tif ( this.autoUpdate === false ) data.object.autoUpdate = false;\n\n\t\tdata.object.levels = [];\n\n\t\tconst levels = this.levels;\n\n\t\tfor ( let i = 0, l = levels.length; i < l; i ++ ) {\n\n\t\t\tconst level = levels[ i ];\n\n\t\t\tdata.object.levels.push( {\n\t\t\t\tobject: level.object.uuid,\n\t\t\t\tdistance: level.distance,\n\t\t\t\thysteresis: level.hysteresis\n\t\t\t} );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n}\n\nconst _basePosition = /*@__PURE__*/ new Vector3();\n\nconst _skinIndex = /*@__PURE__*/ new Vector4();\nconst _skinWeight = /*@__PURE__*/ new Vector4();\n\nconst _vector3 = /*@__PURE__*/ new Vector3();\nconst _matrix4 = /*@__PURE__*/ new Matrix4();\nconst _vertex = /*@__PURE__*/ new Vector3();\n\nconst _sphere$5 = /*@__PURE__*/ new Sphere();\nconst _inverseMatrix$2 = /*@__PURE__*/ new Matrix4();\nconst _ray$2 = /*@__PURE__*/ new Ray();\n\n/**\n * A mesh that has a {@link Skeleton} that can then be used to animate the\n * vertices of the geometry with skinning/skeleton animation.\n *\n * Next to a valid skeleton, the skinned mesh requires skin indices and weights\n * as buffer attributes in its geometry. These attribute define which bones affect a single\n * vertex to a certain extend.\n *\n * Typically skinned meshes are not created manually but loaders like {@link GLTFLoader}\n * or {@link FBXLoader } import respective models.\n *\n * @augments Mesh\n * @demo scenes/bones-browser.html\n */\nclass SkinnedMesh extends Mesh {\n\n\t/**\n\t * Constructs a new skinned mesh.\n\t *\n\t * @param {BufferGeometry} [geometry] - The mesh geometry.\n\t * @param {Material|Array<Material>} [material] - The mesh material.\n\t */\n\tconstructor( geometry, material ) {\n\n\t\tsuper( geometry, material );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSkinnedMesh = true;\n\n\t\tthis.type = 'SkinnedMesh';\n\n\t\t/**\n\t\t * `AttachedBindMode` means the skinned mesh shares the same world space as the skeleton.\n\t\t * This is not true when using `DetachedBindMode` which is useful when sharing a skeleton\n\t\t * across multiple skinned meshes.\n\t\t *\n\t\t * @type {(AttachedBindMode|DetachedBindMode)}\n\t\t * @default AttachedBindMode\n\t\t */\n\t\tthis.bindMode = AttachedBindMode;\n\n\t\t/**\n\t\t * The base matrix that is used for the bound bone transforms.\n\t\t *\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.bindMatrix = new Matrix4();\n\n\t\t/**\n\t\t * The base matrix that is used for resetting the bound bone transforms.\n\t\t *\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.bindMatrixInverse = new Matrix4();\n\n\t\t/**\n\t\t * The bounding box of the skinned mesh. Can be computed via {@link SkinnedMesh#computeBoundingBox}.\n\t\t *\n\t\t * @type {?Box3}\n\t\t * @default null\n\t\t */\n\t\tthis.boundingBox = null;\n\n\t\t/**\n\t\t * The bounding sphere of the skinned mesh. Can be computed via {@link SkinnedMesh#computeBoundingSphere}.\n\t\t *\n\t\t * @type {?Sphere}\n\t\t * @default null\n\t\t */\n\t\tthis.boundingSphere = null;\n\n\t}\n\n\t/**\n\t * Computes the bounding box of the skinned mesh, and updates {@link SkinnedMesh#boundingBox}.\n\t * The bounding box is not automatically computed by the engine; this method must be called by your app.\n\t * If the skinned mesh is animated, the bounding box should be recomputed per frame in order to reflect\n\t * the current animation state.\n\t */\n\tcomputeBoundingBox() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tif ( this.boundingBox === null ) {\n\n\t\t\tthis.boundingBox = new Box3();\n\n\t\t}\n\n\t\tthis.boundingBox.makeEmpty();\n\n\t\tconst positionAttribute = geometry.getAttribute( 'position' );\n\n\t\tfor ( let i = 0; i < positionAttribute.count; i ++ ) {\n\n\t\t\tthis.getVertexPosition( i, _vertex );\n\t\t\tthis.boundingBox.expandByPoint( _vertex );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Computes the bounding sphere of the skinned mesh, and updates {@link SkinnedMesh#boundingSphere}.\n\t * The bounding sphere is automatically computed by the engine once when it is needed, e.g., for ray casting\n\t * and view frustum culling. If the skinned mesh is animated, the bounding sphere should be recomputed\n\t * per frame in order to reflect the current animation state.\n\t */\n\tcomputeBoundingSphere() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tif ( this.boundingSphere === null ) {\n\n\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t}\n\n\t\tthis.boundingSphere.makeEmpty();\n\n\t\tconst positionAttribute = geometry.getAttribute( 'position' );\n\n\t\tfor ( let i = 0; i < positionAttribute.count; i ++ ) {\n\n\t\t\tthis.getVertexPosition( i, _vertex );\n\t\t\tthis.boundingSphere.expandByPoint( _vertex );\n\n\t\t}\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.bindMode = source.bindMode;\n\t\tthis.bindMatrix.copy( source.bindMatrix );\n\t\tthis.bindMatrixInverse.copy( source.bindMatrixInverse );\n\n\t\tthis.skeleton = source.skeleton;\n\n\t\tif ( source.boundingBox !== null ) this.boundingBox = source.boundingBox.clone();\n\t\tif ( source.boundingSphere !== null ) this.boundingSphere = source.boundingSphere.clone();\n\n\t\treturn this;\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tconst material = this.material;\n\t\tconst matrixWorld = this.matrixWorld;\n\n\t\tif ( material === undefined ) return;\n\n\t\t// test with bounding sphere in world space\n\n\t\tif ( this.boundingSphere === null ) this.computeBoundingSphere();\n\n\t\t_sphere$5.copy( this.boundingSphere );\n\t\t_sphere$5.applyMatrix4( matrixWorld );\n\n\t\tif ( raycaster.ray.intersectsSphere( _sphere$5 ) === false ) return;\n\n\t\t// convert ray to local space of skinned mesh\n\n\t\t_inverseMatrix$2.copy( matrixWorld ).invert();\n\t\t_ray$2.copy( raycaster.ray ).applyMatrix4( _inverseMatrix$2 );\n\n\t\t// test with bounding box in local space\n\n\t\tif ( this.boundingBox !== null ) {\n\n\t\t\tif ( _ray$2.intersectsBox( this.boundingBox ) === false ) return;\n\n\t\t}\n\n\t\t// test for intersections with geometry\n\n\t\tthis._computeIntersections( raycaster, intersects, _ray$2 );\n\n\t}\n\n\tgetVertexPosition( index, target ) {\n\n\t\tsuper.getVertexPosition( index, target );\n\n\t\tthis.applyBoneTransform( index, target );\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Binds the given skeleton to the skinned mesh.\n\t *\n\t * @param {Skeleton} skeleton - The skeleton to bind.\n\t * @param {Matrix4} [bindMatrix] - The bind matrix. If no bind matrix is provided,\n\t * the skinned mesh's world matrix will be used instead.\n\t */\n\tbind( skeleton, bindMatrix ) {\n\n\t\tthis.skeleton = skeleton;\n\n\t\tif ( bindMatrix === undefined ) {\n\n\t\t\tthis.updateMatrixWorld( true );\n\n\t\t\tthis.skeleton.calculateInverses();\n\n\t\t\tbindMatrix = this.matrixWorld;\n\n\t\t}\n\n\t\tthis.bindMatrix.copy( bindMatrix );\n\t\tthis.bindMatrixInverse.copy( bindMatrix ).invert();\n\n\t}\n\n\t/**\n\t * This method sets the skinned mesh in the rest pose).\n\t */\n\tpose() {\n\n\t\tthis.skeleton.pose();\n\n\t}\n\n\t/**\n\t * Normalizes the skin weights which are defined as a buffer attribute\n\t * in the skinned mesh's geometry.\n\t */\n\tnormalizeSkinWeights() {\n\n\t\tconst vector = new Vector4();\n\n\t\tconst skinWeight = this.geometry.attributes.skinWeight;\n\n\t\tfor ( let i = 0, l = skinWeight.count; i < l; i ++ ) {\n\n\t\t\tvector.fromBufferAttribute( skinWeight, i );\n\n\t\t\tconst scale = 1.0 / vector.manhattanLength();\n\n\t\t\tif ( scale !== Infinity ) {\n\n\t\t\t\tvector.multiplyScalar( scale );\n\n\t\t\t} else {\n\n\t\t\t\tvector.set( 1, 0, 0, 0 ); // do something reasonable\n\n\t\t\t}\n\n\t\t\tskinWeight.setXYZW( i, vector.x, vector.y, vector.z, vector.w );\n\n\t\t}\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t\tif ( this.bindMode === AttachedBindMode ) {\n\n\t\t\tthis.bindMatrixInverse.copy( this.matrixWorld ).invert();\n\n\t\t} else if ( this.bindMode === DetachedBindMode ) {\n\n\t\t\tthis.bindMatrixInverse.copy( this.bindMatrix ).invert();\n\n\t\t} else {\n\n\t\t\twarn( 'SkinnedMesh: Unrecognized bindMode: ' + this.bindMode );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Applies the bone transform associated with the given index to the given\n\t * vertex position. Returns the updated vector.\n\t *\n\t * @param {number} index - The vertex index.\n\t * @param {Vector3} target - The target object that is used to store the method's result.\n\t * the skinned mesh's world matrix will be used instead.\n\t * @return {Vector3} The updated vertex position.\n\t */\n\tapplyBoneTransform( index, target ) {\n\n\t\tconst skeleton = this.skeleton;\n\t\tconst geometry = this.geometry;\n\n\t\t_skinIndex.fromBufferAttribute( geometry.attributes.skinIndex, index );\n\t\t_skinWeight.fromBufferAttribute( geometry.attributes.skinWeight, index );\n\n\t\t_basePosition.copy( target ).applyMatrix4( this.bindMatrix );\n\n\t\ttarget.set( 0, 0, 0 );\n\n\t\tfor ( let i = 0; i < 4; i ++ ) {\n\n\t\t\tconst weight = _skinWeight.getComponent( i );\n\n\t\t\tif ( weight !== 0 ) {\n\n\t\t\t\tconst boneIndex = _skinIndex.getComponent( i );\n\n\t\t\t\t_matrix4.multiplyMatrices( skeleton.bones[ boneIndex ].matrixWorld, skeleton.boneInverses[ boneIndex ] );\n\n\t\t\t\ttarget.addScaledVector( _vector3.copy( _basePosition ).applyMatrix4( _matrix4 ), weight );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn target.applyMatrix4( this.bindMatrixInverse );\n\n\t}\n\n}\n\n/**\n * A bone which is part of a {@link Skeleton}. The skeleton in turn is used by\n * the {@link SkinnedMesh}.\n *\n * ```js\n * const root = new THREE.Bone();\n * const child = new THREE.Bone();\n *\n * root.add( child );\n * child.position.y = 5;\n * ```\n *\n * @augments Object3D\n */\nclass Bone extends Object3D {\n\n\t/**\n\t * Constructs a new bone.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isBone = true;\n\n\t\tthis.type = 'Bone';\n\n\t}\n\n}\n\n/**\n * Creates a texture directly from raw buffer data.\n *\n * The interpretation of the data depends on type and format: If the type is\n * `UnsignedByteType`, a `Uint8Array` will be useful for addressing the\n * texel data. If the format is `RGBAFormat`, data needs four values for\n * one texel; Red, Green, Blue and Alpha (typically the opacity).\n *\n * @augments Texture\n */\nclass DataTexture extends Texture {\n\n\t/**\n\t * Constructs a new data texture.\n\t *\n\t * @param {?TypedArray} [data=null] - The buffer data.\n\t * @param {number} [width=1] - The width of the texture.\n\t * @param {number} [height=1] - The height of the texture.\n\t * @param {number} [format=RGBAFormat] - The texture format.\n\t * @param {number} [type=UnsignedByteType] - The texture type.\n\t * @param {number} [mapping=Texture.DEFAULT_MAPPING] - The texture mapping.\n\t * @param {number} [wrapS=ClampToEdgeWrapping] - The wrapS value.\n\t * @param {number} [wrapT=ClampToEdgeWrapping] - The wrapT value.\n\t * @param {number} [magFilter=NearestFilter] - The mag filter value.\n\t * @param {number} [minFilter=NearestFilter] - The min filter value.\n\t * @param {number} [anisotropy=Texture.DEFAULT_ANISOTROPY] - The anisotropy value.\n\t * @param {string} [colorSpace=NoColorSpace] - The color space.\n\t */\n\tconstructor( data = null, width = 1, height = 1, format, type, mapping, wrapS, wrapT, magFilter = NearestFilter, minFilter = NearestFilter, anisotropy, colorSpace ) {\n\n\t\tsuper( null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, colorSpace );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isDataTexture = true;\n\n\t\t/**\n\t\t * The image definition of a data texture.\n\t\t *\n\t\t * @type {{data:TypedArray,width:number,height:number}}\n\t\t */\n\t\tthis.image = { data: data, width: width, height: height };\n\n\t\t/**\n\t\t * Whether to generate mipmaps (if possible) for a texture.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.generateMipmaps = false;\n\n\t\t/**\n\t\t * If set to `true`, the texture is flipped along the vertical axis when\n\t\t * uploaded to the GPU.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.flipY = false;\n\n\t\t/**\n\t\t * Specifies the alignment requirements for the start of each pixel row in memory.\n\t\t *\n\t\t * Overwritten and set to `1` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default 1\n\t\t */\n\t\tthis.unpackAlignment = 1;\n\n\t}\n\n}\n\nconst _offsetMatrix = /*@__PURE__*/ new Matrix4();\nconst _identityMatrix = /*@__PURE__*/ new Matrix4();\n\n/**\n * Class for representing the armatures in `three.js`. The skeleton\n * is defined by a hierarchy of bones.\n *\n * ```js\n * const bones = [];\n *\n * const shoulder = new THREE.Bone();\n * const elbow = new THREE.Bone();\n * const hand = new THREE.Bone();\n *\n * shoulder.add( elbow );\n * elbow.add( hand );\n *\n * bones.push( shoulder , elbow, hand);\n *\n * shoulder.position.y = -5;\n * elbow.position.y = 0;\n * hand.position.y = 5;\n *\n * const armSkeleton = new THREE.Skeleton( bones );\n * ```\n */\nclass Skeleton {\n\n\t/**\n\t * Constructs a new skeleton.\n\t *\n\t * @param {Array<Bone>} [bones] - An array of bones.\n\t * @param {Array<Matrix4>} [boneInverses] - An array of bone inverse matrices.\n\t * If not provided, these matrices will be computed automatically via {@link Skeleton#calculateInverses}.\n\t */\n\tconstructor( bones = [], boneInverses = [] ) {\n\n\t\tthis.uuid = generateUUID();\n\n\t\t/**\n\t\t * An array of bones defining the skeleton.\n\t\t *\n\t\t * @type {Array<Bone>}\n\t\t */\n\t\tthis.bones = bones.slice( 0 );\n\n\t\t/**\n\t\t * An array of bone inverse matrices.\n\t\t *\n\t\t * @type {Array<Matrix4>}\n\t\t */\n\t\tthis.boneInverses = boneInverses;\n\n\t\t/**\n\t\t * An array buffer holding the bone data.\n\t\t * Input data for {@link Skeleton#boneTexture}.\n\t\t *\n\t\t * @type {?Float32Array}\n\t\t * @default null\n\t\t */\n\t\tthis.boneMatrices = null;\n\n\t\t/**\n\t\t * A texture holding the bone data for use\n\t\t * in the vertex shader.\n\t\t *\n\t\t * @type {?DataTexture}\n\t\t * @default null\n\t\t */\n\t\tthis.boneTexture = null;\n\n\t\tthis.init();\n\n\t}\n\n\t/**\n\t * Initializes the skeleton. This method gets automatically called by the constructor\n\t * but depending on how the skeleton is created it might be necessary to call this method\n\t * manually.\n\t */\n\tinit() {\n\n\t\tconst bones = this.bones;\n\t\tconst boneInverses = this.boneInverses;\n\n\t\tthis.boneMatrices = new Float32Array( bones.length * 16 );\n\n\t\t// calculate inverse bone matrices if necessary\n\n\t\tif ( boneInverses.length === 0 ) {\n\n\t\t\tthis.calculateInverses();\n\n\t\t} else {\n\n\t\t\t// handle special case\n\n\t\t\tif ( bones.length !== boneInverses.length ) {\n\n\t\t\t\twarn( 'Skeleton: Number of inverse bone matrices does not match amount of bones.' );\n\n\t\t\t\tthis.boneInverses = [];\n\n\t\t\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\t\t\tthis.boneInverses.push( new Matrix4() );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Computes the bone inverse matrices. This method resets {@link Skeleton#boneInverses}\n\t * and fills it with new matrices.\n\t */\n\tcalculateInverses() {\n\n\t\tthis.boneInverses.length = 0;\n\n\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\tconst inverse = new Matrix4();\n\n\t\t\tif ( this.bones[ i ] ) {\n\n\t\t\t\tinverse.copy( this.bones[ i ].matrixWorld ).invert();\n\n\t\t\t}\n\n\t\t\tthis.boneInverses.push( inverse );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Resets the skeleton to the base pose.\n\t */\n\tpose() {\n\n\t\t// recover the bind-time world matrices\n\n\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\tconst bone = this.bones[ i ];\n\n\t\t\tif ( bone ) {\n\n\t\t\t\tbone.matrixWorld.copy( this.boneInverses[ i ] ).invert();\n\n\t\t\t}\n\n\t\t}\n\n\t\t// compute the local matrices, positions, rotations and scales\n\n\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\tconst bone = this.bones[ i ];\n\n\t\t\tif ( bone ) {\n\n\t\t\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\t\t\tbone.matrix.copy( bone.parent.matrixWorld ).invert();\n\t\t\t\t\tbone.matrix.multiply( bone.matrixWorld );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbone.matrix.copy( bone.matrixWorld );\n\n\t\t\t\t}\n\n\t\t\t\tbone.matrix.decompose( bone.position, bone.quaternion, bone.scale );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Resets the skeleton to the base pose.\n\t */\n\tupdate() {\n\n\t\tconst bones = this.bones;\n\t\tconst boneInverses = this.boneInverses;\n\t\tconst boneMatrices = this.boneMatrices;\n\t\tconst boneTexture = this.boneTexture;\n\n\t\t// flatten bone matrices to array\n\n\t\tfor ( let i = 0, il = bones.length; i < il; i ++ ) {\n\n\t\t\t// compute the offset between the current and the original transform\n\n\t\t\tconst matrix = bones[ i ] ? bones[ i ].matrixWorld : _identityMatrix;\n\n\t\t\t_offsetMatrix.multiplyMatrices( matrix, boneInverses[ i ] );\n\t\t\t_offsetMatrix.toArray( boneMatrices, i * 16 );\n\n\t\t}\n\n\t\tif ( boneTexture !== null ) {\n\n\t\t\tboneTexture.needsUpdate = true;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns a new skeleton with copied values from this instance.\n\t *\n\t * @return {Skeleton} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new Skeleton( this.bones, this.boneInverses );\n\n\t}\n\n\t/**\n\t * Computes a data texture for passing bone data to the vertex shader.\n\t *\n\t * @return {Skeleton} A reference of this instance.\n\t */\n\tcomputeBoneTexture() {\n\n\t\t// layout (1 matrix = 4 pixels)\n\t\t//      RGBA RGBA RGBA RGBA (=> column1, column2, column3, column4)\n\t\t//  with  8x8  pixel texture max   16 bones * 4 pixels =  (8 * 8)\n\t\t//       16x16 pixel texture max   64 bones * 4 pixels = (16 * 16)\n\t\t//       32x32 pixel texture max  256 bones * 4 pixels = (32 * 32)\n\t\t//       64x64 pixel texture max 1024 bones * 4 pixels = (64 * 64)\n\n\t\tlet size = Math.sqrt( this.bones.length * 4 ); // 4 pixels needed for 1 matrix\n\t\tsize = Math.ceil( size / 4 ) * 4;\n\t\tsize = Math.max( size, 4 );\n\n\t\tconst boneMatrices = new Float32Array( size * size * 4 ); // 4 floats per RGBA pixel\n\t\tboneMatrices.set( this.boneMatrices ); // copy current values\n\n\t\tconst boneTexture = new DataTexture( boneMatrices, size, size, RGBAFormat, FloatType );\n\t\tboneTexture.needsUpdate = true;\n\n\t\tthis.boneMatrices = boneMatrices;\n\t\tthis.boneTexture = boneTexture;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Searches through the skeleton's bone array and returns the first with a\n\t * matching name.\n\t *\n\t * @param {string} name - The name of the bone.\n\t * @return {Bone|undefined} The found bone. `undefined` if no bone has been found.\n\t */\n\tgetBoneByName( name ) {\n\n\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\tconst bone = this.bones[ i ];\n\n\t\t\tif ( bone.name === name ) {\n\n\t\t\t\treturn bone;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn undefined;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose( ) {\n\n\t\tif ( this.boneTexture !== null ) {\n\n\t\t\tthis.boneTexture.dispose();\n\n\t\t\tthis.boneTexture = null;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Setups the skeleton by the given JSON and bones.\n\t *\n\t * @param {Object} json - The skeleton as serialized JSON.\n\t * @param {Object<string, Bone>} bones - An array of bones.\n\t * @return {Skeleton} A reference of this instance.\n\t */\n\tfromJSON( json, bones ) {\n\n\t\tthis.uuid = json.uuid;\n\n\t\tfor ( let i = 0, l = json.bones.length; i < l; i ++ ) {\n\n\t\t\tconst uuid = json.bones[ i ];\n\t\t\tlet bone = bones[ uuid ];\n\n\t\t\tif ( bone === undefined ) {\n\n\t\t\t\twarn( 'Skeleton: No bone found with UUID:', uuid );\n\t\t\t\tbone = new Bone();\n\n\t\t\t}\n\n\t\t\tthis.bones.push( bone );\n\t\t\tthis.boneInverses.push( new Matrix4().fromArray( json.boneInverses[ i ] ) );\n\n\t\t}\n\n\t\tthis.init();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Serializes the skeleton into JSON.\n\t *\n\t * @return {Object} A JSON object representing the serialized skeleton.\n\t * @see {@link ObjectLoader#parse}\n\t */\n\ttoJSON() {\n\n\t\tconst data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.7,\n\t\t\t\ttype: 'Skeleton',\n\t\t\t\tgenerator: 'Skeleton.toJSON'\n\t\t\t},\n\t\t\tbones: [],\n\t\t\tboneInverses: []\n\t\t};\n\n\t\tdata.uuid = this.uuid;\n\n\t\tconst bones = this.bones;\n\t\tconst boneInverses = this.boneInverses;\n\n\t\tfor ( let i = 0, l = bones.length; i < l; i ++ ) {\n\n\t\t\tconst bone = bones[ i ];\n\t\t\tdata.bones.push( bone.uuid );\n\n\t\t\tconst boneInverse = boneInverses[ i ];\n\t\t\tdata.boneInverses.push( boneInverse.toArray() );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * An instanced version of a buffer attribute.\n *\n * @augments BufferAttribute\n */\nclass InstancedBufferAttribute extends BufferAttribute {\n\n\t/**\n\t * Constructs a new instanced buffer attribute.\n\t *\n\t * @param {TypedArray} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t * @param {number} [meshPerAttribute=1] - How often a value of this buffer attribute should be repeated.\n\t */\n\tconstructor( array, itemSize, normalized, meshPerAttribute = 1 ) {\n\n\t\tsuper( array, itemSize, normalized );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isInstancedBufferAttribute = true;\n\n\t\t/**\n\t\t * Defines how often a value of this buffer attribute should be repeated. A\n\t\t * value of one means that each value of the instanced attribute is used for\n\t\t * a single instance. A value of two means that each value is used for two\n\t\t * consecutive instances (and so on).\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.meshPerAttribute = meshPerAttribute;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.meshPerAttribute = source.meshPerAttribute;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.meshPerAttribute = this.meshPerAttribute;\n\n\t\tdata.isInstancedBufferAttribute = true;\n\n\t\treturn data;\n\n\t}\n\n}\n\nconst _instanceLocalMatrix = /*@__PURE__*/ new Matrix4();\nconst _instanceWorldMatrix = /*@__PURE__*/ new Matrix4();\n\nconst _instanceIntersects = [];\n\nconst _box3 = /*@__PURE__*/ new Box3();\nconst _identity = /*@__PURE__*/ new Matrix4();\nconst _mesh$1 = /*@__PURE__*/ new Mesh();\nconst _sphere$4 = /*@__PURE__*/ new Sphere();\n\n/**\n * A special version of a mesh with instanced rendering support. Use\n * this class if you have to render a large number of objects with the same\n * geometry and material(s) but with different world transformations. The usage\n * of 'InstancedMesh' will help you to reduce the number of draw calls and thus\n * improve the overall rendering performance in your application.\n *\n * @augments Mesh\n */\nclass InstancedMesh extends Mesh {\n\n\t/**\n\t * Constructs a new instanced mesh.\n\t *\n\t * @param {BufferGeometry} [geometry] - The mesh geometry.\n\t * @param {Material|Array<Material>} [material] - The mesh material.\n\t * @param {number} count - The number of instances.\n\t */\n\tconstructor( geometry, material, count ) {\n\n\t\tsuper( geometry, material );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isInstancedMesh = true;\n\n\t\t/**\n\t\t * Represents the local transformation of all instances. You have to set its\n\t\t * {@link BufferAttribute#needsUpdate} flag to true if you modify instanced data\n\t\t * via {@link InstancedMesh#setMatrixAt}.\n\t\t *\n\t\t * @type {InstancedBufferAttribute}\n\t\t */\n\t\tthis.instanceMatrix = new InstancedBufferAttribute( new Float32Array( count * 16 ), 16 );\n\n\t\t/**\n\t\t * Represents the color of all instances. You have to set its\n\t\t * {@link BufferAttribute#needsUpdate} flag to true if you modify instanced data\n\t\t * via {@link InstancedMesh#setColorAt}.\n\t\t *\n\t\t * @type {?InstancedBufferAttribute}\n\t\t * @default null\n\t\t */\n\t\tthis.instanceColor = null;\n\n\t\t/**\n\t\t * Represents the morph target weights of all instances. You have to set its\n\t\t * {@link Texture#needsUpdate} flag to true if you modify instanced data\n\t\t * via {@link InstancedMesh#setMorphAt}.\n\t\t *\n\t\t * @type {?DataTexture}\n\t\t * @default null\n\t\t */\n\t\tthis.morphTexture = null;\n\n\t\t/**\n\t\t * The number of instances.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.count = count;\n\n\t\t/**\n\t\t * The bounding box of the instanced mesh. Can be computed via {@link InstancedMesh#computeBoundingBox}.\n\t\t *\n\t\t * @type {?Box3}\n\t\t * @default null\n\t\t */\n\t\tthis.boundingBox = null;\n\n\t\t/**\n\t\t * The bounding sphere of the instanced mesh. Can be computed via {@link InstancedMesh#computeBoundingSphere}.\n\t\t *\n\t\t * @type {?Sphere}\n\t\t * @default null\n\t\t */\n\t\tthis.boundingSphere = null;\n\n\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\tthis.setMatrixAt( i, _identity );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Computes the bounding box of the instanced mesh, and updates {@link InstancedMesh#boundingBox}.\n\t * The bounding box is not automatically computed by the engine; this method must be called by your app.\n\t * You may need to recompute the bounding box if an instance is transformed via {@link InstancedMesh#setMatrixAt}.\n\t */\n\tcomputeBoundingBox() {\n\n\t\tconst geometry = this.geometry;\n\t\tconst count = this.count;\n\n\t\tif ( this.boundingBox === null ) {\n\n\t\t\tthis.boundingBox = new Box3();\n\n\t\t}\n\n\t\tif ( geometry.boundingBox === null ) {\n\n\t\t\tgeometry.computeBoundingBox();\n\n\t\t}\n\n\t\tthis.boundingBox.makeEmpty();\n\n\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\tthis.getMatrixAt( i, _instanceLocalMatrix );\n\n\t\t\t_box3.copy( geometry.boundingBox ).applyMatrix4( _instanceLocalMatrix );\n\n\t\t\tthis.boundingBox.union( _box3 );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Computes the bounding sphere of the instanced mesh, and updates {@link InstancedMesh#boundingSphere}\n\t * The engine automatically computes the bounding sphere when it is needed, e.g., for ray casting or view frustum culling.\n\t * You may need to recompute the bounding sphere if an instance is transformed via {@link InstancedMesh#setMatrixAt}.\n\t */\n\tcomputeBoundingSphere() {\n\n\t\tconst geometry = this.geometry;\n\t\tconst count = this.count;\n\n\t\tif ( this.boundingSphere === null ) {\n\n\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t}\n\n\t\tif ( geometry.boundingSphere === null ) {\n\n\t\t\tgeometry.computeBoundingSphere();\n\n\t\t}\n\n\t\tthis.boundingSphere.makeEmpty();\n\n\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\tthis.getMatrixAt( i, _instanceLocalMatrix );\n\n\t\t\t_sphere$4.copy( geometry.boundingSphere ).applyMatrix4( _instanceLocalMatrix );\n\n\t\t\tthis.boundingSphere.union( _sphere$4 );\n\n\t\t}\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.instanceMatrix.copy( source.instanceMatrix );\n\n\t\tif ( source.morphTexture !== null ) this.morphTexture = source.morphTexture.clone();\n\t\tif ( source.instanceColor !== null ) this.instanceColor = source.instanceColor.clone();\n\n\t\tthis.count = source.count;\n\n\t\tif ( source.boundingBox !== null ) this.boundingBox = source.boundingBox.clone();\n\t\tif ( source.boundingSphere !== null ) this.boundingSphere = source.boundingSphere.clone();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Gets the color of the defined instance.\n\t *\n\t * @param {number} index - The instance index.\n\t * @param {Color} color - The target object that is used to store the method's result.\n\t */\n\tgetColorAt( index, color ) {\n\n\t\tcolor.fromArray( this.instanceColor.array, index * 3 );\n\n\t}\n\n\t/**\n\t * Gets the local transformation matrix of the defined instance.\n\t *\n\t * @param {number} index - The instance index.\n\t * @param {Matrix4} matrix - The target object that is used to store the method's result.\n\t */\n\tgetMatrixAt( index, matrix ) {\n\n\t\tmatrix.fromArray( this.instanceMatrix.array, index * 16 );\n\n\t}\n\n\t/**\n\t * Gets the morph target weights of the defined instance.\n\t *\n\t * @param {number} index - The instance index.\n\t * @param {Mesh} object - The target object that is used to store the method's result.\n\t */\n\tgetMorphAt( index, object ) {\n\n\t\tconst objectInfluences = object.morphTargetInfluences;\n\n\t\tconst array = this.morphTexture.source.data.data;\n\n\t\tconst len = objectInfluences.length + 1; // All influences + the baseInfluenceSum\n\n\t\tconst dataIndex = index * len + 1; // Skip the baseInfluenceSum at the beginning\n\n\t\tfor ( let i = 0; i < objectInfluences.length; i ++ ) {\n\n\t\t\tobjectInfluences[ i ] = array[ dataIndex + i ];\n\n\t\t}\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tconst matrixWorld = this.matrixWorld;\n\t\tconst raycastTimes = this.count;\n\n\t\t_mesh$1.geometry = this.geometry;\n\t\t_mesh$1.material = this.material;\n\n\t\tif ( _mesh$1.material === undefined ) return;\n\n\t\t// test with bounding sphere first\n\n\t\tif ( this.boundingSphere === null ) this.computeBoundingSphere();\n\n\t\t_sphere$4.copy( this.boundingSphere );\n\t\t_sphere$4.applyMatrix4( matrixWorld );\n\n\t\tif ( raycaster.ray.intersectsSphere( _sphere$4 ) === false ) return;\n\n\t\t// now test each instance\n\n\t\tfor ( let instanceId = 0; instanceId < raycastTimes; instanceId ++ ) {\n\n\t\t\t// calculate the world matrix for each instance\n\n\t\t\tthis.getMatrixAt( instanceId, _instanceLocalMatrix );\n\n\t\t\t_instanceWorldMatrix.multiplyMatrices( matrixWorld, _instanceLocalMatrix );\n\n\t\t\t// the mesh represents this single instance\n\n\t\t\t_mesh$1.matrixWorld = _instanceWorldMatrix;\n\n\t\t\t_mesh$1.raycast( raycaster, _instanceIntersects );\n\n\t\t\t// process the result of raycast\n\n\t\t\tfor ( let i = 0, l = _instanceIntersects.length; i < l; i ++ ) {\n\n\t\t\t\tconst intersect = _instanceIntersects[ i ];\n\t\t\t\tintersect.instanceId = instanceId;\n\t\t\t\tintersect.object = this;\n\t\t\t\tintersects.push( intersect );\n\n\t\t\t}\n\n\t\t\t_instanceIntersects.length = 0;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the given color to the defined instance. Make sure you set the `needsUpdate` flag of\n\t * {@link InstancedMesh#instanceColor} to `true` after updating all the colors.\n\t *\n\t * @param {number} index - The instance index.\n\t * @param {Color} color - The instance color.\n\t */\n\tsetColorAt( index, color ) {\n\n\t\tif ( this.instanceColor === null ) {\n\n\t\t\tthis.instanceColor = new InstancedBufferAttribute( new Float32Array( this.instanceMatrix.count * 3 ).fill( 1 ), 3 );\n\n\t\t}\n\n\t\tcolor.toArray( this.instanceColor.array, index * 3 );\n\n\t}\n\n\t/**\n\t * Sets the given local transformation matrix to the defined instance. Make sure you set the `needsUpdate` flag of\n\t * {@link InstancedMesh#instanceMatrix} to `true` after updating all the colors.\n\t *\n\t * @param {number} index - The instance index.\n\t * @param {Matrix4} matrix - The local transformation.\n\t */\n\tsetMatrixAt( index, matrix ) {\n\n\t\tmatrix.toArray( this.instanceMatrix.array, index * 16 );\n\n\t}\n\n\t/**\n\t * Sets the morph target weights to the defined instance. Make sure you set the `needsUpdate` flag of\n\t * {@link InstancedMesh#morphTexture} to `true` after updating all the influences.\n\t *\n\t * @param {number} index - The instance index.\n\t * @param {Mesh} object -  A mesh which `morphTargetInfluences` property containing the morph target weights\n\t * of a single instance.\n\t */\n\tsetMorphAt( index, object ) {\n\n\t\tconst objectInfluences = object.morphTargetInfluences;\n\n\t\tconst len = objectInfluences.length + 1; // morphBaseInfluence + all influences\n\n\t\tif ( this.morphTexture === null ) {\n\n\t\t\tthis.morphTexture = new DataTexture( new Float32Array( len * this.count ), len, this.count, RedFormat, FloatType );\n\n\t\t}\n\n\t\tconst array = this.morphTexture.source.data.data;\n\n\t\tlet morphInfluencesSum = 0;\n\n\t\tfor ( let i = 0; i < objectInfluences.length; i ++ ) {\n\n\t\t\tmorphInfluencesSum += objectInfluences[ i ];\n\n\t\t}\n\n\t\tconst morphBaseInfluence = this.geometry.morphTargetsRelative ? 1 : 1 - morphInfluencesSum;\n\n\t\tconst dataIndex = len * index;\n\n\t\tarray[ dataIndex ] = morphBaseInfluence;\n\n\t\tarray.set( objectInfluences, dataIndex + 1 );\n\n\t}\n\n\tupdateMorphTargets() {\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\tif ( this.morphTexture !== null ) {\n\n\t\t\tthis.morphTexture.dispose();\n\t\t\tthis.morphTexture = null;\n\n\t\t}\n\n\t}\n\n}\n\nconst _vector1 = /*@__PURE__*/ new Vector3();\nconst _vector2 = /*@__PURE__*/ new Vector3();\nconst _normalMatrix = /*@__PURE__*/ new Matrix3();\n\n/**\n * A two dimensional surface that extends infinitely in 3D space, represented\n * in [Hessian normal form](http://mathworld.wolfram.com/HessianNormalForm.html)\n * by a unit length normal vector and a constant.\n */\nclass Plane {\n\n\t/**\n\t * Constructs a new plane.\n\t *\n\t * @param {Vector3} [normal=(1,0,0)] - A unit length vector defining the normal of the plane.\n\t * @param {number} [constant=0] - The signed distance from the origin to the plane.\n\t */\n\tconstructor( normal = new Vector3( 1, 0, 0 ), constant = 0 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isPlane = true;\n\n\t\t/**\n\t\t * A unit length vector defining the normal of the plane.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.normal = normal;\n\n\t\t/**\n\t\t * The signed distance from the origin to the plane.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.constant = constant;\n\n\t}\n\n\t/**\n\t * Sets the plane components by copying the given values.\n\t *\n\t * @param {Vector3} normal - The normal.\n\t * @param {number} constant - The constant.\n\t * @return {Plane} A reference to this plane.\n\t */\n\tset( normal, constant ) {\n\n\t\tthis.normal.copy( normal );\n\t\tthis.constant = constant;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the plane components by defining `x`, `y`, `z` as the\n\t * plane normal and `w` as the constant.\n\t *\n\t * @param {number} x - The value for the normal's x component.\n\t * @param {number} y - The value for the normal's y component.\n\t * @param {number} z - The value for the normal's z component.\n\t * @param {number} w - The constant value.\n\t * @return {Plane} A reference to this plane.\n\t */\n\tsetComponents( x, y, z, w ) {\n\n\t\tthis.normal.set( x, y, z );\n\t\tthis.constant = w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the plane from the given normal and coplanar point (that is a point\n\t * that lies onto the plane).\n\t *\n\t * @param {Vector3} normal - The normal.\n\t * @param {Vector3} point - A coplanar point.\n\t * @return {Plane} A reference to this plane.\n\t */\n\tsetFromNormalAndCoplanarPoint( normal, point ) {\n\n\t\tthis.normal.copy( normal );\n\t\tthis.constant = - point.dot( this.normal );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the plane from three coplanar points. The winding order is\n\t * assumed to be counter-clockwise, and determines the direction of\n\t * the plane normal.\n\t *\n\t * @param {Vector3} a - The first coplanar point.\n\t * @param {Vector3} b - The second coplanar point.\n\t * @param {Vector3} c - The third coplanar point.\n\t * @return {Plane} A reference to this plane.\n\t */\n\tsetFromCoplanarPoints( a, b, c ) {\n\n\t\tconst normal = _vector1.subVectors( c, b ).cross( _vector2.subVectors( a, b ) ).normalize();\n\n\t\t// Q: should an error be thrown if normal is zero (e.g. degenerate plane)?\n\n\t\tthis.setFromNormalAndCoplanarPoint( normal, a );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the values of the given plane to this instance.\n\t *\n\t * @param {Plane} plane - The plane to copy.\n\t * @return {Plane} A reference to this plane.\n\t */\n\tcopy( plane ) {\n\n\t\tthis.normal.copy( plane.normal );\n\t\tthis.constant = plane.constant;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Normalizes the plane normal and adjusts the constant accordingly.\n\t *\n\t * @return {Plane} A reference to this plane.\n\t */\n\tnormalize() {\n\n\t\t// Note: will lead to a divide by zero if the plane is invalid.\n\n\t\tconst inverseNormalLength = 1.0 / this.normal.length();\n\t\tthis.normal.multiplyScalar( inverseNormalLength );\n\t\tthis.constant *= inverseNormalLength;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Negates both the plane normal and the constant.\n\t *\n\t * @return {Plane} A reference to this plane.\n\t */\n\tnegate() {\n\n\t\tthis.constant *= -1;\n\t\tthis.normal.negate();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the signed distance from the given point to this plane.\n\t *\n\t * @param {Vector3} point - The point to compute the distance for.\n\t * @return {number} The signed distance.\n\t */\n\tdistanceToPoint( point ) {\n\n\t\treturn this.normal.dot( point ) + this.constant;\n\n\t}\n\n\t/**\n\t * Returns the signed distance from the given sphere to this plane.\n\t *\n\t * @param {Sphere} sphere - The sphere to compute the distance for.\n\t * @return {number} The signed distance.\n\t */\n\tdistanceToSphere( sphere ) {\n\n\t\treturn this.distanceToPoint( sphere.center ) - sphere.radius;\n\n\t}\n\n\t/**\n\t * Projects a the given point onto the plane.\n\t *\n\t * @param {Vector3} point - The point to project.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The projected point on the plane.\n\t */\n\tprojectPoint( point, target ) {\n\n\t\treturn target.copy( point ).addScaledVector( this.normal, - this.distanceToPoint( point ) );\n\n\t}\n\n\t/**\n\t * Returns the intersection point of the passed line and the plane. Returns\n\t * `null` if the line does not intersect. Returns the line's starting point if\n\t * the line is coplanar with the plane.\n\t *\n\t * @param {Line3} line - The line to compute the intersection for.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {?Vector3} The intersection point.\n\t */\n\tintersectLine( line, target ) {\n\n\t\tconst direction = line.delta( _vector1 );\n\n\t\tconst denominator = this.normal.dot( direction );\n\n\t\tif ( denominator === 0 ) {\n\n\t\t\t// line is coplanar, return origin\n\t\t\tif ( this.distanceToPoint( line.start ) === 0 ) {\n\n\t\t\t\treturn target.copy( line.start );\n\n\t\t\t}\n\n\t\t\t// Unsure if this is the correct method to handle this case.\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst t = - ( line.start.dot( this.normal ) + this.constant ) / denominator;\n\n\t\tif ( t < 0 || t > 1 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\treturn target.copy( line.start ).addScaledVector( direction, t );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given line segment intersects with (passes through) the plane.\n\t *\n\t * @param {Line3} line - The line to test.\n\t * @return {boolean} Whether the given line segment intersects with the plane or not.\n\t */\n\tintersectsLine( line ) {\n\n\t\t// Note: this tests if a line intersects the plane, not whether it (or its end-points) are coplanar with it.\n\n\t\tconst startSign = this.distanceToPoint( line.start );\n\t\tconst endSign = this.distanceToPoint( line.end );\n\n\t\treturn ( startSign < 0 && endSign > 0 ) || ( endSign < 0 && startSign > 0 );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given bounding box intersects with the plane.\n\t *\n\t * @param {Box3} box - The bounding box to test.\n\t * @return {boolean} Whether the given bounding box intersects with the plane or not.\n\t */\n\tintersectsBox( box ) {\n\n\t\treturn box.intersectsPlane( this );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given bounding sphere intersects with the plane.\n\t *\n\t * @param {Sphere} sphere - The bounding sphere to test.\n\t * @return {boolean} Whether the given bounding sphere intersects with the plane or not.\n\t */\n\tintersectsSphere( sphere ) {\n\n\t\treturn sphere.intersectsPlane( this );\n\n\t}\n\n\t/**\n\t * Returns a coplanar vector to the plane, by calculating the\n\t * projection of the normal at the origin onto the plane.\n\t *\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The coplanar point.\n\t */\n\tcoplanarPoint( target ) {\n\n\t\treturn target.copy( this.normal ).multiplyScalar( - this.constant );\n\n\t}\n\n\t/**\n\t * Apply a 4x4 matrix to the plane. The matrix must be an affine, homogeneous transform.\n\t *\n\t * The optional normal matrix can be pre-computed like so:\n\t * ```js\n\t * const optionalNormalMatrix = new THREE.Matrix3().getNormalMatrix( matrix );\n\t * ```\n\t *\n\t * @param {Matrix4} matrix - The transformation matrix.\n\t * @param {Matrix4} [optionalNormalMatrix] - A pre-computed normal matrix.\n\t * @return {Plane} A reference to this plane.\n\t */\n\tapplyMatrix4( matrix, optionalNormalMatrix ) {\n\n\t\tconst normalMatrix = optionalNormalMatrix || _normalMatrix.getNormalMatrix( matrix );\n\n\t\tconst referencePoint = this.coplanarPoint( _vector1 ).applyMatrix4( matrix );\n\n\t\tconst normal = this.normal.applyMatrix3( normalMatrix ).normalize();\n\n\t\tthis.constant = - referencePoint.dot( normal );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Translates the plane by the distance defined by the given offset vector.\n\t * Note that this only affects the plane constant and will not affect the normal vector.\n\t *\n\t * @param {Vector3} offset - The offset vector.\n\t * @return {Plane} A reference to this plane.\n\t */\n\ttranslate( offset ) {\n\n\t\tthis.constant -= offset.dot( this.normal );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this plane is equal with the given one.\n\t *\n\t * @param {Plane} plane - The plane to test for equality.\n\t * @return {boolean} Whether this plane is equal with the given one.\n\t */\n\tequals( plane ) {\n\n\t\treturn plane.normal.equals( this.normal ) && ( plane.constant === this.constant );\n\n\t}\n\n\t/**\n\t * Returns a new plane with copied values from this instance.\n\t *\n\t * @return {Plane} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nconst _sphere$3 = /*@__PURE__*/ new Sphere();\nconst _defaultSpriteCenter = /*@__PURE__*/ new Vector2( 0.5, 0.5 );\nconst _vector$6 = /*@__PURE__*/ new Vector3();\n\n/**\n * Frustums are used to determine what is inside the camera's field of view.\n * They help speed up the rendering process - objects which lie outside a camera's\n * frustum can safely be excluded from rendering.\n *\n * This class is mainly intended for use internally by a renderer.\n */\nclass Frustum {\n\n\t/**\n\t * Constructs a new frustum.\n\t *\n\t * @param {Plane} [p0] - The first plane that encloses the frustum.\n\t * @param {Plane} [p1] - The second plane that encloses the frustum.\n\t * @param {Plane} [p2] - The third plane that encloses the frustum.\n\t * @param {Plane} [p3] - The fourth plane that encloses the frustum.\n\t * @param {Plane} [p4] - The fifth plane that encloses the frustum.\n\t * @param {Plane} [p5] - The sixth plane that encloses the frustum.\n\t */\n\tconstructor( p0 = new Plane(), p1 = new Plane(), p2 = new Plane(), p3 = new Plane(), p4 = new Plane(), p5 = new Plane() ) {\n\n\t\t/**\n\t\t * This array holds the planes that enclose the frustum.\n\t\t *\n\t\t * @type {Array<Plane>}\n\t\t */\n\t\tthis.planes = [ p0, p1, p2, p3, p4, p5 ];\n\n\t}\n\n\t/**\n\t * Sets the frustum planes by copying the given planes.\n\t *\n\t * @param {Plane} [p0] - The first plane that encloses the frustum.\n\t * @param {Plane} [p1] - The second plane that encloses the frustum.\n\t * @param {Plane} [p2] - The third plane that encloses the frustum.\n\t * @param {Plane} [p3] - The fourth plane that encloses the frustum.\n\t * @param {Plane} [p4] - The fifth plane that encloses the frustum.\n\t * @param {Plane} [p5] - The sixth plane that encloses the frustum.\n\t * @return {Frustum} A reference to this frustum.\n\t */\n\tset( p0, p1, p2, p3, p4, p5 ) {\n\n\t\tconst planes = this.planes;\n\n\t\tplanes[ 0 ].copy( p0 );\n\t\tplanes[ 1 ].copy( p1 );\n\t\tplanes[ 2 ].copy( p2 );\n\t\tplanes[ 3 ].copy( p3 );\n\t\tplanes[ 4 ].copy( p4 );\n\t\tplanes[ 5 ].copy( p5 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the values of the given frustum to this instance.\n\t *\n\t * @param {Frustum} frustum - The frustum to copy.\n\t * @return {Frustum} A reference to this frustum.\n\t */\n\tcopy( frustum ) {\n\n\t\tconst planes = this.planes;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tplanes[ i ].copy( frustum.planes[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the frustum planes from the given projection matrix.\n\t *\n\t * @param {Matrix4} m - The projection matrix.\n\t * @param {(WebGLCoordinateSystem|WebGPUCoordinateSystem)} coordinateSystem - The coordinate system.\n\t * @param {boolean} [reversedDepth=false] - Whether to use a reversed depth.\n\t * @return {Frustum} A reference to this frustum.\n\t */\n\tsetFromProjectionMatrix( m, coordinateSystem = WebGLCoordinateSystem, reversedDepth = false ) {\n\n\t\tconst planes = this.planes;\n\t\tconst me = m.elements;\n\t\tconst me0 = me[ 0 ], me1 = me[ 1 ], me2 = me[ 2 ], me3 = me[ 3 ];\n\t\tconst me4 = me[ 4 ], me5 = me[ 5 ], me6 = me[ 6 ], me7 = me[ 7 ];\n\t\tconst me8 = me[ 8 ], me9 = me[ 9 ], me10 = me[ 10 ], me11 = me[ 11 ];\n\t\tconst me12 = me[ 12 ], me13 = me[ 13 ], me14 = me[ 14 ], me15 = me[ 15 ];\n\n\t\tplanes[ 0 ].setComponents( me3 - me0, me7 - me4, me11 - me8, me15 - me12 ).normalize();\n\t\tplanes[ 1 ].setComponents( me3 + me0, me7 + me4, me11 + me8, me15 + me12 ).normalize();\n\t\tplanes[ 2 ].setComponents( me3 + me1, me7 + me5, me11 + me9, me15 + me13 ).normalize();\n\t\tplanes[ 3 ].setComponents( me3 - me1, me7 - me5, me11 - me9, me15 - me13 ).normalize();\n\n\t\tif ( reversedDepth ) {\n\n\t\t\tplanes[ 4 ].setComponents( me2, me6, me10, me14 ).normalize(); // far\n\t\t\tplanes[ 5 ].setComponents( me3 - me2, me7 - me6, me11 - me10, me15 - me14 ).normalize(); // near\n\n\t\t} else {\n\n\t\t\tplanes[ 4 ].setComponents( me3 - me2, me7 - me6, me11 - me10, me15 - me14 ).normalize(); // far\n\n\t\t\tif ( coordinateSystem === WebGLCoordinateSystem ) {\n\n\t\t\t\tplanes[ 5 ].setComponents( me3 + me2, me7 + me6, me11 + me10, me15 + me14 ).normalize(); // near\n\n\t\t\t} else if ( coordinateSystem === WebGPUCoordinateSystem ) {\n\n\t\t\t\tplanes[ 5 ].setComponents( me2, me6, me10, me14 ).normalize(); // near\n\n\t\t\t} else {\n\n\t\t\t\tthrow new Error( 'THREE.Frustum.setFromProjectionMatrix(): Invalid coordinate system: ' + coordinateSystem );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if the 3D object's bounding sphere is intersecting this frustum.\n\t *\n\t * Note that the 3D object must have a geometry so that the bounding sphere can be calculated.\n\t *\n\t * @param {Object3D} object - The 3D object to test.\n\t * @return {boolean} Whether the 3D object's bounding sphere is intersecting this frustum or not.\n\t */\n\tintersectsObject( object ) {\n\n\t\tif ( object.boundingSphere !== undefined ) {\n\n\t\t\tif ( object.boundingSphere === null ) object.computeBoundingSphere();\n\n\t\t\t_sphere$3.copy( object.boundingSphere ).applyMatrix4( object.matrixWorld );\n\n\t\t} else {\n\n\t\t\tconst geometry = object.geometry;\n\n\t\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t\t_sphere$3.copy( geometry.boundingSphere ).applyMatrix4( object.matrixWorld );\n\n\t\t}\n\n\t\treturn this.intersectsSphere( _sphere$3 );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given sprite is intersecting this frustum.\n\t *\n\t * @param {Sprite} sprite - The sprite to test.\n\t * @return {boolean} Whether the sprite is intersecting this frustum or not.\n\t */\n\tintersectsSprite( sprite ) {\n\n\t\t_sphere$3.center.set( 0, 0, 0 );\n\n\t\tconst offset = _defaultSpriteCenter.distanceTo( sprite.center );\n\n\t\t_sphere$3.radius = 0.7071067811865476 + offset;\n\t\t_sphere$3.applyMatrix4( sprite.matrixWorld );\n\n\t\treturn this.intersectsSphere( _sphere$3 );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given bounding sphere is intersecting this frustum.\n\t *\n\t * @param {Sphere} sphere - The bounding sphere to test.\n\t * @return {boolean} Whether the bounding sphere is intersecting this frustum or not.\n\t */\n\tintersectsSphere( sphere ) {\n\n\t\tconst planes = this.planes;\n\t\tconst center = sphere.center;\n\t\tconst negRadius = - sphere.radius;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tconst distance = planes[ i ].distanceToPoint( center );\n\n\t\t\tif ( distance < negRadius ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\t/**\n\t * Returns `true` if the given bounding box is intersecting this frustum.\n\t *\n\t * @param {Box3} box - The bounding box to test.\n\t * @return {boolean} Whether the bounding box is intersecting this frustum or not.\n\t */\n\tintersectsBox( box ) {\n\n\t\tconst planes = this.planes;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tconst plane = planes[ i ];\n\n\t\t\t// corner at max distance\n\n\t\t\t_vector$6.x = plane.normal.x > 0 ? box.max.x : box.min.x;\n\t\t\t_vector$6.y = plane.normal.y > 0 ? box.max.y : box.min.y;\n\t\t\t_vector$6.z = plane.normal.z > 0 ? box.max.z : box.min.z;\n\n\t\t\tif ( plane.distanceToPoint( _vector$6 ) < 0 ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\t/**\n\t * Returns `true` if the given point lies within the frustum.\n\t *\n\t * @param {Vector3} point - The point to test.\n\t * @return {boolean} Whether the point lies within this frustum or not.\n\t */\n\tcontainsPoint( point ) {\n\n\t\tconst planes = this.planes;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tif ( planes[ i ].distanceToPoint( point ) < 0 ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\t/**\n\t * Returns a new frustum with copied values from this instance.\n\t *\n\t * @return {Frustum} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nconst _projScreenMatrix$2 = /*@__PURE__*/ new Matrix4();\nconst _frustum$1 = /*@__PURE__*/ new Frustum();\n\n/**\n * FrustumArray is used to determine if an object is visible in at least one camera\n * from an array of cameras. This is particularly useful for multi-view renderers.\n*/\nclass FrustumArray {\n\n\t/**\n\t * Constructs a new frustum array.\n\t *\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * The coordinate system to use.\n\t\t *\n\t\t * @type {WebGLCoordinateSystem|WebGPUCoordinateSystem}\n\t\t * @default WebGLCoordinateSystem\n\t\t */\n\t\tthis.coordinateSystem = WebGLCoordinateSystem;\n\n\t}\n\n\t/**\n\t * Returns `true` if the 3D object's bounding sphere is intersecting any frustum\n\t * from the camera array.\n\t *\n\t * @param {Object3D} object - The 3D object to test.\n\t * @param {Object} cameraArray - An object with a cameras property containing an array of cameras.\n\t * @return {boolean} Whether the 3D object is visible in any camera.\n\t */\n\tintersectsObject( object, cameraArray ) {\n\n\t\tif ( ! cameraArray.isArrayCamera || cameraArray.cameras.length === 0 ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\tfor ( let i = 0; i < cameraArray.cameras.length; i ++ ) {\n\n\t\t\tconst camera = cameraArray.cameras[ i ];\n\n\t\t\t_projScreenMatrix$2.multiplyMatrices(\n\t\t\t\tcamera.projectionMatrix,\n\t\t\t\tcamera.matrixWorldInverse\n\t\t\t);\n\n\t\t\t_frustum$1.setFromProjectionMatrix(\n\t\t\t\t_projScreenMatrix$2,\n\t\t\t\tcamera.coordinateSystem,\n\t\t\t\tcamera.reversedDepth\n\t\t\t);\n\n\t\t\tif ( _frustum$1.intersectsObject( object ) ) {\n\n\t\t\t\treturn true; // Object is visible in at least one camera\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn false; // Not visible in any camera\n\n\t}\n\n\t/**\n\t * Returns `true` if the given sprite is intersecting any frustum\n\t * from the camera array.\n\t *\n\t * @param {Sprite} sprite - The sprite to test.\n\t * @param {Object} cameraArray - An object with a cameras property containing an array of cameras.\n\t * @return {boolean} Whether the sprite is visible in any camera.\n\t */\n\tintersectsSprite( sprite, cameraArray ) {\n\n\t\tif ( ! cameraArray || ! cameraArray.cameras || cameraArray.cameras.length === 0 ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\tfor ( let i = 0; i < cameraArray.cameras.length; i ++ ) {\n\n\t\t\tconst camera = cameraArray.cameras[ i ];\n\n\t\t\t_projScreenMatrix$2.multiplyMatrices(\n\t\t\t\tcamera.projectionMatrix,\n\t\t\t\tcamera.matrixWorldInverse\n\t\t\t);\n\n\t\t\t_frustum$1.setFromProjectionMatrix(\n\t\t\t\t_projScreenMatrix$2,\n\t\t\t\tcamera.coordinateSystem,\n\t\t\t\tcamera.reversedDepth\n\t\t\t);\n\n\t\t\tif ( _frustum$1.intersectsSprite( sprite ) ) {\n\n\t\t\t\treturn true; // Sprite is visible in at least one camera\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn false; // Not visible in any camera\n\n\t}\n\n\t/**\n\t * Returns `true` if the given bounding sphere is intersecting any frustum\n\t * from the camera array.\n\t *\n\t * @param {Sphere} sphere - The bounding sphere to test.\n\t * @param {Object} cameraArray - An object with a cameras property containing an array of cameras.\n\t * @return {boolean} Whether the sphere is visible in any camera.\n\t */\n\tintersectsSphere( sphere, cameraArray ) {\n\n\t\tif ( ! cameraArray || ! cameraArray.cameras || cameraArray.cameras.length === 0 ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\tfor ( let i = 0; i < cameraArray.cameras.length; i ++ ) {\n\n\t\t\tconst camera = cameraArray.cameras[ i ];\n\n\t\t\t_projScreenMatrix$2.multiplyMatrices(\n\t\t\t\tcamera.projectionMatrix,\n\t\t\t\tcamera.matrixWorldInverse\n\t\t\t);\n\n\t\t\t_frustum$1.setFromProjectionMatrix(\n\t\t\t\t_projScreenMatrix$2,\n\t\t\t\tcamera.coordinateSystem,\n\t\t\t\tcamera.reversedDepth\n\t\t\t);\n\n\t\t\tif ( _frustum$1.intersectsSphere( sphere ) ) {\n\n\t\t\t\treturn true; // Sphere is visible in at least one camera\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn false; // Not visible in any camera\n\n\t}\n\n\t/**\n\t * Returns `true` if the given bounding box is intersecting any frustum\n\t * from the camera array.\n\t *\n\t * @param {Box3} box - The bounding box to test.\n\t * @param {Object} cameraArray - An object with a cameras property containing an array of cameras.\n\t * @return {boolean} Whether the box is visible in any camera.\n\t */\n\tintersectsBox( box, cameraArray ) {\n\n\t\tif ( ! cameraArray || ! cameraArray.cameras || cameraArray.cameras.length === 0 ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\tfor ( let i = 0; i < cameraArray.cameras.length; i ++ ) {\n\n\t\t\tconst camera = cameraArray.cameras[ i ];\n\n\t\t\t_projScreenMatrix$2.multiplyMatrices(\n\t\t\t\tcamera.projectionMatrix,\n\t\t\t\tcamera.matrixWorldInverse\n\t\t\t);\n\n\t\t\t_frustum$1.setFromProjectionMatrix(\n\t\t\t\t_projScreenMatrix$2,\n\t\t\t\tcamera.coordinateSystem,\n\t\t\t\tcamera.reversedDepth\n\t\t\t);\n\n\t\t\tif ( _frustum$1.intersectsBox( box ) ) {\n\n\t\t\t\treturn true; // Box is visible in at least one camera\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn false; // Not visible in any camera\n\n\t}\n\n\t/**\n\t * Returns `true` if the given point lies within any frustum\n\t * from the camera array.\n\t *\n\t * @param {Vector3} point - The point to test.\n\t * @param {Object} cameraArray - An object with a cameras property containing an array of cameras.\n\t * @return {boolean} Whether the point is visible in any camera.\n\t */\n\tcontainsPoint( point, cameraArray ) {\n\n\t\tif ( ! cameraArray || ! cameraArray.cameras || cameraArray.cameras.length === 0 ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\tfor ( let i = 0; i < cameraArray.cameras.length; i ++ ) {\n\n\t\t\tconst camera = cameraArray.cameras[ i ];\n\n\t\t\t_projScreenMatrix$2.multiplyMatrices(\n\t\t\t\tcamera.projectionMatrix,\n\t\t\t\tcamera.matrixWorldInverse\n\t\t\t);\n\n\t\t\t_frustum$1.setFromProjectionMatrix(\n\t\t\t\t_projScreenMatrix$2,\n\t\t\t\tcamera.coordinateSystem,\n\t\t\t\tcamera.reversedDepth\n\t\t\t);\n\n\t\t\tif ( _frustum$1.containsPoint( point ) ) {\n\n\t\t\t\treturn true; // Point is visible in at least one camera\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn false; // Not visible in any camera\n\n\t}\n\n\t/**\n\t * Returns a new frustum array with copied values from this instance.\n\t *\n\t * @return {FrustumArray} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new FrustumArray();\n\n\t}\n\n}\n\nfunction ascIdSort( a, b ) {\n\n\treturn a - b;\n\n}\n\nfunction sortOpaque( a, b ) {\n\n\treturn a.z - b.z;\n\n}\n\nfunction sortTransparent( a, b ) {\n\n\treturn b.z - a.z;\n\n}\n\nclass MultiDrawRenderList {\n\n\tconstructor() {\n\n\t\tthis.index = 0;\n\t\tthis.pool = [];\n\t\tthis.list = [];\n\n\t}\n\n\tpush( start, count, z, index ) {\n\n\t\tconst pool = this.pool;\n\t\tconst list = this.list;\n\t\tif ( this.index >= pool.length ) {\n\n\t\t\tpool.push( {\n\n\t\t\t\tstart: -1,\n\t\t\t\tcount: -1,\n\t\t\t\tz: -1,\n\t\t\t\tindex: -1,\n\n\t\t\t} );\n\n\t\t}\n\n\t\tconst item = pool[ this.index ];\n\t\tlist.push( item );\n\t\tthis.index ++;\n\n\t\titem.start = start;\n\t\titem.count = count;\n\t\titem.z = z;\n\t\titem.index = index;\n\n\t}\n\n\treset() {\n\n\t\tthis.list.length = 0;\n\t\tthis.index = 0;\n\n\t}\n\n}\n\nconst _matrix$1 = /*@__PURE__*/ new Matrix4();\nconst _whiteColor = /*@__PURE__*/ new Color( 1, 1, 1 );\nconst _frustum = /*@__PURE__*/ new Frustum();\nconst _frustumArray = /*@__PURE__*/ new FrustumArray();\nconst _box$1 = /*@__PURE__*/ new Box3();\nconst _sphere$2 = /*@__PURE__*/ new Sphere();\nconst _vector$5 = /*@__PURE__*/ new Vector3();\nconst _forward$1 = /*@__PURE__*/ new Vector3();\nconst _temp = /*@__PURE__*/ new Vector3();\nconst _renderList = /*@__PURE__*/ new MultiDrawRenderList();\nconst _mesh = /*@__PURE__*/ new Mesh();\nconst _batchIntersects = [];\n\n// copies data from attribute \"src\" into \"target\" starting at \"targetOffset\"\nfunction copyAttributeData( src, target, targetOffset = 0 ) {\n\n\tconst itemSize = target.itemSize;\n\tif ( src.isInterleavedBufferAttribute || src.array.constructor !== target.array.constructor ) {\n\n\t\t// use the component getters and setters if the array data cannot\n\t\t// be copied directly\n\t\tconst vertexCount = src.count;\n\t\tfor ( let i = 0; i < vertexCount; i ++ ) {\n\n\t\t\tfor ( let c = 0; c < itemSize; c ++ ) {\n\n\t\t\t\ttarget.setComponent( i + targetOffset, c, src.getComponent( i, c ) );\n\n\t\t\t}\n\n\t\t}\n\n\t} else {\n\n\t\t// faster copy approach using typed array set function\n\t\ttarget.array.set( src.array, targetOffset * itemSize );\n\n\t}\n\n\ttarget.needsUpdate = true;\n\n}\n\n// safely copies array contents to a potentially smaller array\nfunction copyArrayContents( src, target ) {\n\n\tif ( src.constructor !== target.constructor ) {\n\n\t\t// if arrays are of a different type (eg due to index size increasing) then data must be per-element copied\n\t\tconst len = Math.min( src.length, target.length );\n\t\tfor ( let i = 0; i < len; i ++ ) {\n\n\t\t\ttarget[ i ] = src[ i ];\n\n\t\t}\n\n\t} else {\n\n\t\t// if the arrays use the same data layout we can use a fast block copy\n\t\tconst len = Math.min( src.length, target.length );\n\t\ttarget.set( new src.constructor( src.buffer, 0, len ) );\n\n\t}\n\n}\n\n/**\n * A special version of a mesh with multi draw batch rendering support. Use\n * this class if you have to render a large number of objects with the same\n * material but with different geometries or world transformations. The usage of\n * `BatchedMesh` will help you to reduce the number of draw calls and thus improve the overall\n * rendering performance in your application.\n *\n * ```js\n * const box = new THREE.BoxGeometry( 1, 1, 1 );\n * const sphere = new THREE.SphereGeometry( 1, 12, 12 );\n * const material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );\n *\n * // initialize and add geometries into the batched mesh\n * const batchedMesh = new BatchedMesh( 10, 5000, 10000, material );\n * const boxGeometryId = batchedMesh.addGeometry( box );\n * const sphereGeometryId = batchedMesh.addGeometry( sphere );\n *\n * // create instances of those geometries\n * const boxInstancedId1 = batchedMesh.addInstance( boxGeometryId );\n * const boxInstancedId2 = batchedMesh.addInstance( boxGeometryId );\n *\n * const sphereInstancedId1 = batchedMesh.addInstance( sphereGeometryId );\n * const sphereInstancedId2 = batchedMesh.addInstance( sphereGeometryId );\n *\n * // position the geometries\n * batchedMesh.setMatrixAt( boxInstancedId1, boxMatrix1 );\n * batchedMesh.setMatrixAt( boxInstancedId2, boxMatrix2 );\n *\n * batchedMesh.setMatrixAt( sphereInstancedId1, sphereMatrix1 );\n * batchedMesh.setMatrixAt( sphereInstancedId2, sphereMatrix2 );\n *\n * scene.add( batchedMesh );\n * ```\n *\n * @augments Mesh\n */\nclass BatchedMesh extends Mesh {\n\n\t/**\n\t * Constructs a new batched mesh.\n\t *\n\t * @param {number} maxInstanceCount - The maximum number of individual instances planned to be added and rendered.\n\t * @param {number} maxVertexCount - The maximum number of vertices to be used by all unique geometries.\n\t * @param {number} [maxIndexCount=maxVertexCount*2] - The maximum number of indices to be used by all unique geometries\n\t * @param {Material|Array<Material>} [material] - The mesh material.\n\t */\n\tconstructor( maxInstanceCount, maxVertexCount, maxIndexCount = maxVertexCount * 2, material ) {\n\n\t\tsuper( new BufferGeometry(), material );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isBatchedMesh = true;\n\n\t\t/**\n\t\t * When set ot `true`, the individual objects of a batch are frustum culled.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.perObjectFrustumCulled = true;\n\n\t\t/**\n\t\t * When set to `true`, the individual objects of a batch are sorted to improve overdraw-related artifacts.\n\t\t * If the material is marked as \"transparent\" objects are rendered back to front and if not then they are\n\t\t * rendered front to back.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.sortObjects = true;\n\n\t\t/**\n\t\t * The bounding box of the batched mesh. Can be computed via {@link BatchedMesh#computeBoundingBox}.\n\t\t *\n\t\t * @type {?Box3}\n\t\t * @default null\n\t\t */\n\t\tthis.boundingBox = null;\n\n\t\t/**\n\t\t * The bounding sphere of the batched mesh. Can be computed via {@link BatchedMesh#computeBoundingSphere}.\n\t\t *\n\t\t * @type {?Sphere}\n\t\t * @default null\n\t\t */\n\t\tthis.boundingSphere = null;\n\n\t\t/**\n\t\t * Takes a sort a function that is run before render. The function takes a list of instances to\n\t\t * sort and a camera. The objects in the list include a \"z\" field to perform a depth-ordered\n\t\t * sort with.\n\t\t *\n\t\t * @type {?Function}\n\t\t * @default null\n\t\t */\n\t\tthis.customSort = null;\n\n\t\t// stores visible, active, and geometry id per instance and reserved buffer ranges for geometries\n\t\tthis._instanceInfo = [];\n\t\tthis._geometryInfo = [];\n\n\t\t// instance, geometry ids that have been set as inactive, and are available to be overwritten\n\t\tthis._availableInstanceIds = [];\n\t\tthis._availableGeometryIds = [];\n\n\t\t// used to track where the next point is that geometry should be inserted\n\t\tthis._nextIndexStart = 0;\n\t\tthis._nextVertexStart = 0;\n\t\tthis._geometryCount = 0;\n\n\t\t// flags\n\t\tthis._visibilityChanged = true;\n\t\tthis._geometryInitialized = false;\n\n\t\t// cached user options\n\t\tthis._maxInstanceCount = maxInstanceCount;\n\t\tthis._maxVertexCount = maxVertexCount;\n\t\tthis._maxIndexCount = maxIndexCount;\n\n\t\t// buffers for multi draw\n\t\tthis._multiDrawCounts = new Int32Array( maxInstanceCount );\n\t\tthis._multiDrawStarts = new Int32Array( maxInstanceCount );\n\t\tthis._multiDrawCount = 0;\n\t\tthis._multiDrawInstances = null;\n\n\t\t// Local matrix per geometry by using data texture\n\t\tthis._matricesTexture = null;\n\t\tthis._indirectTexture = null;\n\t\tthis._colorsTexture = null;\n\n\t\tthis._initMatricesTexture();\n\t\tthis._initIndirectTexture();\n\n\t}\n\n\t/**\n\t * The maximum number of individual instances that can be stored in the batch.\n\t *\n\t * @type {number}\n\t * @readonly\n\t */\n\tget maxInstanceCount() {\n\n\t\treturn this._maxInstanceCount;\n\n\t}\n\n\t/**\n\t * The instance count.\n\t *\n\t * @type {number}\n\t * @readonly\n\t */\n\tget instanceCount() {\n\n\t\treturn this._instanceInfo.length - this._availableInstanceIds.length;\n\n\t}\n\n\t/**\n\t * The number of unused vertices.\n\t *\n\t * @type {number}\n\t * @readonly\n\t */\n\tget unusedVertexCount() {\n\n\t\treturn this._maxVertexCount - this._nextVertexStart;\n\n\t}\n\n\t/**\n\t * The number of unused indices.\n\t *\n\t * @type {number}\n\t * @readonly\n\t */\n\tget unusedIndexCount() {\n\n\t\treturn this._maxIndexCount - this._nextIndexStart;\n\n\t}\n\n\t_initMatricesTexture() {\n\n\t\t// layout (1 matrix = 4 pixels)\n\t\t//      RGBA RGBA RGBA RGBA (=> column1, column2, column3, column4)\n\t\t//  with  8x8  pixel texture max   16 matrices * 4 pixels =  (8 * 8)\n\t\t//       16x16 pixel texture max   64 matrices * 4 pixels = (16 * 16)\n\t\t//       32x32 pixel texture max  256 matrices * 4 pixels = (32 * 32)\n\t\t//       64x64 pixel texture max 1024 matrices * 4 pixels = (64 * 64)\n\n\t\tlet size = Math.sqrt( this._maxInstanceCount * 4 ); // 4 pixels needed for 1 matrix\n\t\tsize = Math.ceil( size / 4 ) * 4;\n\t\tsize = Math.max( size, 4 );\n\n\t\tconst matricesArray = new Float32Array( size * size * 4 ); // 4 floats per RGBA pixel\n\t\tconst matricesTexture = new DataTexture( matricesArray, size, size, RGBAFormat, FloatType );\n\n\t\tthis._matricesTexture = matricesTexture;\n\n\t}\n\n\t_initIndirectTexture() {\n\n\t\tlet size = Math.sqrt( this._maxInstanceCount );\n\t\tsize = Math.ceil( size );\n\n\t\tconst indirectArray = new Uint32Array( size * size );\n\t\tconst indirectTexture = new DataTexture( indirectArray, size, size, RedIntegerFormat, UnsignedIntType );\n\n\t\tthis._indirectTexture = indirectTexture;\n\n\t}\n\n\t_initColorsTexture() {\n\n\t\tlet size = Math.sqrt( this._maxInstanceCount );\n\t\tsize = Math.ceil( size );\n\n\t\t// 4 floats per RGBA pixel initialized to white\n\t\tconst colorsArray = new Float32Array( size * size * 4 ).fill( 1 );\n\t\tconst colorsTexture = new DataTexture( colorsArray, size, size, RGBAFormat, FloatType );\n\t\tcolorsTexture.colorSpace = ColorManagement.workingColorSpace;\n\n\t\tthis._colorsTexture = colorsTexture;\n\n\t}\n\n\t_initializeGeometry( reference ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst maxVertexCount = this._maxVertexCount;\n\t\tconst maxIndexCount = this._maxIndexCount;\n\t\tif ( this._geometryInitialized === false ) {\n\n\t\t\tfor ( const attributeName in reference.attributes ) {\n\n\t\t\t\tconst srcAttribute = reference.getAttribute( attributeName );\n\t\t\t\tconst { array, itemSize, normalized } = srcAttribute;\n\n\t\t\t\tconst dstArray = new array.constructor( maxVertexCount * itemSize );\n\t\t\t\tconst dstAttribute = new BufferAttribute( dstArray, itemSize, normalized );\n\n\t\t\t\tgeometry.setAttribute( attributeName, dstAttribute );\n\n\t\t\t}\n\n\t\t\tif ( reference.getIndex() !== null ) {\n\n\t\t\t\t// Reserve last u16 index for primitive restart.\n\t\t\t\tconst indexArray = maxVertexCount > 65535\n\t\t\t\t\t? new Uint32Array( maxIndexCount )\n\t\t\t\t\t: new Uint16Array( maxIndexCount );\n\n\t\t\t\tgeometry.setIndex( new BufferAttribute( indexArray, 1 ) );\n\n\t\t\t}\n\n\t\t\tthis._geometryInitialized = true;\n\n\t\t}\n\n\t}\n\n\t// Make sure the geometry is compatible with the existing combined geometry attributes\n\t_validateGeometry( geometry ) {\n\n\t\t// check to ensure the geometries are using consistent attributes and indices\n\t\tconst batchGeometry = this.geometry;\n\t\tif ( Boolean( geometry.getIndex() ) !== Boolean( batchGeometry.getIndex() ) ) {\n\n\t\t\tthrow new Error( 'THREE.BatchedMesh: All geometries must consistently have \"index\".' );\n\n\t\t}\n\n\t\tfor ( const attributeName in batchGeometry.attributes ) {\n\n\t\t\tif ( ! geometry.hasAttribute( attributeName ) ) {\n\n\t\t\t\tthrow new Error( `THREE.BatchedMesh: Added geometry missing \"${ attributeName }\". All geometries must have consistent attributes.` );\n\n\t\t\t}\n\n\t\t\tconst srcAttribute = geometry.getAttribute( attributeName );\n\t\t\tconst dstAttribute = batchGeometry.getAttribute( attributeName );\n\t\t\tif ( srcAttribute.itemSize !== dstAttribute.itemSize || srcAttribute.normalized !== dstAttribute.normalized ) {\n\n\t\t\t\tthrow new Error( 'THREE.BatchedMesh: All attributes must have a consistent itemSize and normalized value.' );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Validates the instance defined by the given ID.\n\t *\n\t * @param {number} instanceId - The instance to validate.\n\t */\n\tvalidateInstanceId( instanceId ) {\n\n\t\tconst instanceInfo = this._instanceInfo;\n\t\tif ( instanceId < 0 || instanceId >= instanceInfo.length || instanceInfo[ instanceId ].active === false ) {\n\n\t\t\tthrow new Error( `THREE.BatchedMesh: Invalid instanceId ${instanceId}. Instance is either out of range or has been deleted.` );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Validates the geometry defined by the given ID.\n\t *\n\t * @param {number} geometryId - The geometry to validate.\n\t */\n\tvalidateGeometryId( geometryId ) {\n\n\t\tconst geometryInfoList = this._geometryInfo;\n\t\tif ( geometryId < 0 || geometryId >= geometryInfoList.length || geometryInfoList[ geometryId ].active === false ) {\n\n\t\t\tthrow new Error( `THREE.BatchedMesh: Invalid geometryId ${geometryId}. Geometry is either out of range or has been deleted.` );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Takes a sort a function that is run before render. The function takes a list of instances to\n\t * sort and a camera. The objects in the list include a \"z\" field to perform a depth-ordered sort with.\n\t *\n\t * @param {Function} func - The custom sort function.\n\t * @return {BatchedMesh} A reference to this batched mesh.\n\t */\n\tsetCustomSort( func ) {\n\n\t\tthis.customSort = func;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes the bounding box, updating {@link BatchedMesh#boundingBox}.\n\t * Bounding boxes aren't computed by default. They need to be explicitly computed,\n\t * otherwise they are `null`.\n\t */\n\tcomputeBoundingBox() {\n\n\t\tif ( this.boundingBox === null ) {\n\n\t\t\tthis.boundingBox = new Box3();\n\n\t\t}\n\n\t\tconst boundingBox = this.boundingBox;\n\t\tconst instanceInfo = this._instanceInfo;\n\n\t\tboundingBox.makeEmpty();\n\t\tfor ( let i = 0, l = instanceInfo.length; i < l; i ++ ) {\n\n\t\t\tif ( instanceInfo[ i ].active === false ) continue;\n\n\t\t\tconst geometryId = instanceInfo[ i ].geometryIndex;\n\t\t\tthis.getMatrixAt( i, _matrix$1 );\n\t\t\tthis.getBoundingBoxAt( geometryId, _box$1 ).applyMatrix4( _matrix$1 );\n\t\t\tboundingBox.union( _box$1 );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Computes the bounding sphere, updating {@link BatchedMesh#boundingSphere}.\n\t * Bounding spheres aren't computed by default. They need to be explicitly computed,\n\t * otherwise they are `null`.\n\t */\n\tcomputeBoundingSphere() {\n\n\t\tif ( this.boundingSphere === null ) {\n\n\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t}\n\n\t\tconst boundingSphere = this.boundingSphere;\n\t\tconst instanceInfo = this._instanceInfo;\n\n\t\tboundingSphere.makeEmpty();\n\t\tfor ( let i = 0, l = instanceInfo.length; i < l; i ++ ) {\n\n\t\t\tif ( instanceInfo[ i ].active === false ) continue;\n\n\t\t\tconst geometryId = instanceInfo[ i ].geometryIndex;\n\t\t\tthis.getMatrixAt( i, _matrix$1 );\n\t\t\tthis.getBoundingSphereAt( geometryId, _sphere$2 ).applyMatrix4( _matrix$1 );\n\t\t\tboundingSphere.union( _sphere$2 );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Adds a new instance to the batch using the geometry of the given ID and returns\n\t * a new id referring to the new instance to be used by other functions.\n\t *\n\t * @param {number} geometryId - The ID of a previously added geometry via {@link BatchedMesh#addGeometry}.\n\t * @return {number} The instance ID.\n\t */\n\taddInstance( geometryId ) {\n\n\t\tconst atCapacity = this._instanceInfo.length >= this.maxInstanceCount;\n\n\t\t// ensure we're not over geometry\n\t\tif ( atCapacity && this._availableInstanceIds.length === 0 ) {\n\n\t\t\tthrow new Error( 'THREE.BatchedMesh: Maximum item count reached.' );\n\n\t\t}\n\n\t\tconst instanceInfo = {\n\t\t\tvisible: true,\n\t\t\tactive: true,\n\t\t\tgeometryIndex: geometryId,\n\t\t};\n\n\t\tlet drawId = null;\n\n\t\t// Prioritize using previously freed instance ids\n\t\tif ( this._availableInstanceIds.length > 0 ) {\n\n\t\t\tthis._availableInstanceIds.sort( ascIdSort );\n\n\t\t\tdrawId = this._availableInstanceIds.shift();\n\t\t\tthis._instanceInfo[ drawId ] = instanceInfo;\n\n\t\t} else {\n\n\t\t\tdrawId = this._instanceInfo.length;\n\t\t\tthis._instanceInfo.push( instanceInfo );\n\n\t\t}\n\n\t\tconst matricesTexture = this._matricesTexture;\n\t\t_matrix$1.identity().toArray( matricesTexture.image.data, drawId * 16 );\n\t\tmatricesTexture.needsUpdate = true;\n\n\t\tconst colorsTexture = this._colorsTexture;\n\t\tif ( colorsTexture ) {\n\n\t\t\t_whiteColor.toArray( colorsTexture.image.data, drawId * 4 );\n\t\t\tcolorsTexture.needsUpdate = true;\n\n\t\t}\n\n\t\tthis._visibilityChanged = true;\n\t\treturn drawId;\n\n\t}\n\n\t/**\n\t * Adds the given geometry to the batch and returns the associated\n\t * geometry id referring to it to be used in other functions.\n\t *\n\t * @param {BufferGeometry} geometry - The geometry to add.\n\t * @param {number} [reservedVertexCount=-1] - Optional parameter specifying the amount of\n\t * vertex buffer space to reserve for the added geometry. This is necessary if it is planned\n\t * to set a new geometry at this index at a later time that is larger than the original geometry.\n\t * Defaults to the length of the given geometry vertex buffer.\n\t * @param {number} [reservedIndexCount=-1] - Optional parameter specifying the amount of index\n\t * buffer space to reserve for the added geometry. This is necessary if it is planned to set a\n\t * new geometry at this index at a later time that is larger than the original geometry. Defaults to\n\t * the length of the given geometry index buffer.\n\t * @return {number} The geometry ID.\n\t */\n\taddGeometry( geometry, reservedVertexCount = -1, reservedIndexCount = -1 ) {\n\n\t\tthis._initializeGeometry( geometry );\n\n\t\tthis._validateGeometry( geometry );\n\n\t\tconst geometryInfo = {\n\t\t\t// geometry information\n\t\t\tvertexStart: -1,\n\t\t\tvertexCount: -1,\n\t\t\treservedVertexCount: -1,\n\n\t\t\tindexStart: -1,\n\t\t\tindexCount: -1,\n\t\t\treservedIndexCount: -1,\n\n\t\t\t// draw range information\n\t\t\tstart: -1,\n\t\t\tcount: -1,\n\n\t\t\t// state\n\t\t\tboundingBox: null,\n\t\t\tboundingSphere: null,\n\t\t\tactive: true,\n\t\t};\n\n\t\tconst geometryInfoList = this._geometryInfo;\n\t\tgeometryInfo.vertexStart = this._nextVertexStart;\n\t\tgeometryInfo.reservedVertexCount = reservedVertexCount === -1 ? geometry.getAttribute( 'position' ).count : reservedVertexCount;\n\n\t\tconst index = geometry.getIndex();\n\t\tconst hasIndex = index !== null;\n\t\tif ( hasIndex ) {\n\n\t\t\tgeometryInfo.indexStart = this._nextIndexStart;\n\t\t\tgeometryInfo.reservedIndexCount = reservedIndexCount === -1 ? index.count : reservedIndexCount;\n\n\t\t}\n\n\t\tif (\n\t\t\tgeometryInfo.indexStart !== -1 &&\n\t\t\tgeometryInfo.indexStart + geometryInfo.reservedIndexCount > this._maxIndexCount ||\n\t\t\tgeometryInfo.vertexStart + geometryInfo.reservedVertexCount > this._maxVertexCount\n\t\t) {\n\n\t\t\tthrow new Error( 'THREE.BatchedMesh: Reserved space request exceeds the maximum buffer size.' );\n\n\t\t}\n\n\t\t// update id\n\t\tlet geometryId;\n\t\tif ( this._availableGeometryIds.length > 0 ) {\n\n\t\t\tthis._availableGeometryIds.sort( ascIdSort );\n\n\t\t\tgeometryId = this._availableGeometryIds.shift();\n\t\t\tgeometryInfoList[ geometryId ] = geometryInfo;\n\n\n\t\t} else {\n\n\t\t\tgeometryId = this._geometryCount;\n\t\t\tthis._geometryCount ++;\n\t\t\tgeometryInfoList.push( geometryInfo );\n\n\t\t}\n\n\t\t// update the geometry\n\t\tthis.setGeometryAt( geometryId, geometry );\n\n\t\t// increment the next geometry position\n\t\tthis._nextIndexStart = geometryInfo.indexStart + geometryInfo.reservedIndexCount;\n\t\tthis._nextVertexStart = geometryInfo.vertexStart + geometryInfo.reservedVertexCount;\n\n\t\treturn geometryId;\n\n\t}\n\n\t/**\n\t * Replaces the geometry at the given ID with the provided geometry. Throws an error if there\n\t * is not enough space reserved for geometry. Calling this will change all instances that are\n\t * rendering that geometry.\n\t *\n\t * @param {number} geometryId - The ID of the geometry that should be replaced with the given geometry.\n\t * @param {BufferGeometry} geometry - The new geometry.\n\t * @return {number} The geometry ID.\n\t */\n\tsetGeometryAt( geometryId, geometry ) {\n\n\t\tif ( geometryId >= this._geometryCount ) {\n\n\t\t\tthrow new Error( 'THREE.BatchedMesh: Maximum geometry count reached.' );\n\n\t\t}\n\n\t\tthis._validateGeometry( geometry );\n\n\t\tconst batchGeometry = this.geometry;\n\t\tconst hasIndex = batchGeometry.getIndex() !== null;\n\t\tconst dstIndex = batchGeometry.getIndex();\n\t\tconst srcIndex = geometry.getIndex();\n\t\tconst geometryInfo = this._geometryInfo[ geometryId ];\n\t\tif (\n\t\t\thasIndex &&\n\t\t\tsrcIndex.count > geometryInfo.reservedIndexCount ||\n\t\t\tgeometry.attributes.position.count > geometryInfo.reservedVertexCount\n\t\t) {\n\n\t\t\tthrow new Error( 'THREE.BatchedMesh: Reserved space not large enough for provided geometry.' );\n\n\t\t}\n\n\t\t// copy geometry buffer data over\n\t\tconst vertexStart = geometryInfo.vertexStart;\n\t\tconst reservedVertexCount = geometryInfo.reservedVertexCount;\n\t\tgeometryInfo.vertexCount = geometry.getAttribute( 'position' ).count;\n\n\t\tfor ( const attributeName in batchGeometry.attributes ) {\n\n\t\t\t// copy attribute data\n\t\t\tconst srcAttribute = geometry.getAttribute( attributeName );\n\t\t\tconst dstAttribute = batchGeometry.getAttribute( attributeName );\n\t\t\tcopyAttributeData( srcAttribute, dstAttribute, vertexStart );\n\n\t\t\t// fill the rest in with zeroes\n\t\t\tconst itemSize = srcAttribute.itemSize;\n\t\t\tfor ( let i = srcAttribute.count, l = reservedVertexCount; i < l; i ++ ) {\n\n\t\t\t\tconst index = vertexStart + i;\n\t\t\t\tfor ( let c = 0; c < itemSize; c ++ ) {\n\n\t\t\t\t\tdstAttribute.setComponent( index, c, 0 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tdstAttribute.needsUpdate = true;\n\t\t\tdstAttribute.addUpdateRange( vertexStart * itemSize, reservedVertexCount * itemSize );\n\n\t\t}\n\n\t\t// copy index\n\t\tif ( hasIndex ) {\n\n\t\t\tconst indexStart = geometryInfo.indexStart;\n\t\t\tconst reservedIndexCount = geometryInfo.reservedIndexCount;\n\t\t\tgeometryInfo.indexCount = geometry.getIndex().count;\n\n\t\t\t// copy index data over\n\t\t\tfor ( let i = 0; i < srcIndex.count; i ++ ) {\n\n\t\t\t\tdstIndex.setX( indexStart + i, vertexStart + srcIndex.getX( i ) );\n\n\t\t\t}\n\n\t\t\t// fill the rest in with zeroes\n\t\t\tfor ( let i = srcIndex.count, l = reservedIndexCount; i < l; i ++ ) {\n\n\t\t\t\tdstIndex.setX( indexStart + i, vertexStart );\n\n\t\t\t}\n\n\t\t\tdstIndex.needsUpdate = true;\n\t\t\tdstIndex.addUpdateRange( indexStart, geometryInfo.reservedIndexCount );\n\n\t\t}\n\n\t\t// update the draw range\n\t\tgeometryInfo.start = hasIndex ? geometryInfo.indexStart : geometryInfo.vertexStart;\n\t\tgeometryInfo.count = hasIndex ? geometryInfo.indexCount : geometryInfo.vertexCount;\n\n\t\t// store the bounding boxes\n\t\tgeometryInfo.boundingBox = null;\n\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\tgeometryInfo.boundingBox = geometry.boundingBox.clone();\n\n\t\t}\n\n\t\tgeometryInfo.boundingSphere = null;\n\t\tif ( geometry.boundingSphere !== null ) {\n\n\t\t\tgeometryInfo.boundingSphere = geometry.boundingSphere.clone();\n\n\t\t}\n\n\t\tthis._visibilityChanged = true;\n\t\treturn geometryId;\n\n\t}\n\n\t/**\n\t * Deletes the geometry defined by the given ID from this batch. Any instances referencing\n\t * this geometry will also be removed as a side effect.\n\t *\n\t * @param {number} geometryId - The ID of the geometry to remove from the batch.\n\t * @return {BatchedMesh} A reference to this batched mesh.\n\t */\n\tdeleteGeometry( geometryId ) {\n\n\t\tconst geometryInfoList = this._geometryInfo;\n\t\tif ( geometryId >= geometryInfoList.length || geometryInfoList[ geometryId ].active === false ) {\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\t// delete any instances associated with this geometry\n\t\tconst instanceInfo = this._instanceInfo;\n\t\tfor ( let i = 0, l = instanceInfo.length; i < l; i ++ ) {\n\n\t\t\tif ( instanceInfo[ i ].active && instanceInfo[ i ].geometryIndex === geometryId ) {\n\n\t\t\t\tthis.deleteInstance( i );\n\n\t\t\t}\n\n\t\t}\n\n\t\tgeometryInfoList[ geometryId ].active = false;\n\t\tthis._availableGeometryIds.push( geometryId );\n\t\tthis._visibilityChanged = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Deletes an existing instance from the batch using the given ID.\n\t *\n\t * @param {number} instanceId - The ID of the instance to remove from the batch.\n\t * @return {BatchedMesh} A reference to this batched mesh.\n\t */\n\tdeleteInstance( instanceId ) {\n\n\t\tthis.validateInstanceId( instanceId );\n\n\t\tthis._instanceInfo[ instanceId ].active = false;\n\t\tthis._availableInstanceIds.push( instanceId );\n\t\tthis._visibilityChanged = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Repacks the sub geometries in [name] to remove any unused space remaining from\n\t * previously deleted geometry, freeing up space to add new geometry.\n\t *\n\t * @param {number} instanceId - The ID of the instance to remove from the batch.\n\t * @return {BatchedMesh} A reference to this batched mesh.\n\t */\n\toptimize() {\n\n\t\t// track the next indices to copy data to\n\t\tlet nextVertexStart = 0;\n\t\tlet nextIndexStart = 0;\n\n\t\t// Iterate over all geometry ranges in order sorted from earliest in the geometry buffer to latest\n\t\t// in the geometry buffer. Because draw range objects can be reused there is no guarantee of their order.\n\t\tconst geometryInfoList = this._geometryInfo;\n\t\tconst indices = geometryInfoList\n\t\t\t.map( ( e, i ) => i )\n\t\t\t.sort( ( a, b ) => {\n\n\t\t\t\treturn geometryInfoList[ a ].vertexStart - geometryInfoList[ b ].vertexStart;\n\n\t\t\t} );\n\n\t\tconst geometry = this.geometry;\n\t\tfor ( let i = 0, l = geometryInfoList.length; i < l; i ++ ) {\n\n\t\t\t// if a geometry range is inactive then don't copy anything\n\t\t\tconst index = indices[ i ];\n\t\t\tconst geometryInfo = geometryInfoList[ index ];\n\t\t\tif ( geometryInfo.active === false ) {\n\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\t// if a geometry contains an index buffer then shift it, as well\n\t\t\tif ( geometry.index !== null ) {\n\n\t\t\t\tif ( geometryInfo.indexStart !== nextIndexStart ) {\n\n\t\t\t\t\tconst { indexStart, vertexStart, reservedIndexCount } = geometryInfo;\n\t\t\t\t\tconst index = geometry.index;\n\t\t\t\t\tconst array = index.array;\n\n\t\t\t\t\t// shift the index pointers based on how the vertex data will shift\n\t\t\t\t\t// adjusting the index must happen first so the original vertex start value is available\n\t\t\t\t\tconst elementDelta = nextVertexStart - vertexStart;\n\t\t\t\t\tfor ( let j = indexStart; j < indexStart + reservedIndexCount; j ++ ) {\n\n\t\t\t\t\t\tarray[ j ] = array[ j ] + elementDelta;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tindex.array.copyWithin( nextIndexStart, indexStart, indexStart + reservedIndexCount );\n\t\t\t\t\tindex.addUpdateRange( nextIndexStart, reservedIndexCount );\n\n\t\t\t\t\tgeometryInfo.indexStart = nextIndexStart;\n\n\t\t\t\t}\n\n\t\t\t\tnextIndexStart += geometryInfo.reservedIndexCount;\n\n\t\t\t}\n\n\t\t\t// if a geometry needs to be moved then copy attribute data to overwrite unused space\n\t\t\tif ( geometryInfo.vertexStart !== nextVertexStart ) {\n\n\t\t\t\tconst { vertexStart, reservedVertexCount } = geometryInfo;\n\t\t\t\tconst attributes = geometry.attributes;\n\t\t\t\tfor ( const key in attributes ) {\n\n\t\t\t\t\tconst attribute = attributes[ key ];\n\t\t\t\t\tconst { array, itemSize } = attribute;\n\t\t\t\t\tarray.copyWithin( nextVertexStart * itemSize, vertexStart * itemSize, ( vertexStart + reservedVertexCount ) * itemSize );\n\t\t\t\t\tattribute.addUpdateRange( nextVertexStart * itemSize, reservedVertexCount * itemSize );\n\n\t\t\t\t}\n\n\t\t\t\tgeometryInfo.vertexStart = nextVertexStart;\n\n\t\t\t}\n\n\t\t\tnextVertexStart += geometryInfo.reservedVertexCount;\n\t\t\tgeometryInfo.start = geometry.index ? geometryInfo.indexStart : geometryInfo.vertexStart;\n\n\t\t\t// step the next geometry points to the shifted position\n\t\t\tthis._nextIndexStart = geometry.index ? geometryInfo.indexStart + geometryInfo.reservedIndexCount : 0;\n\t\t\tthis._nextVertexStart = geometryInfo.vertexStart + geometryInfo.reservedVertexCount;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the bounding box for the given geometry.\n\t *\n\t * @param {number} geometryId - The ID of the geometry to return the bounding box for.\n\t * @param {Box3} target - The target object that is used to store the method's result.\n\t * @return {?Box3} The geometry's bounding box. Returns `null` if no geometry has been found for the given ID.\n\t */\n\tgetBoundingBoxAt( geometryId, target ) {\n\n\t\tif ( geometryId >= this._geometryCount ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// compute bounding box\n\t\tconst geometry = this.geometry;\n\t\tconst geometryInfo = this._geometryInfo[ geometryId ];\n\t\tif ( geometryInfo.boundingBox === null ) {\n\n\t\t\tconst box = new Box3();\n\t\t\tconst index = geometry.index;\n\t\t\tconst position = geometry.attributes.position;\n\t\t\tfor ( let i = geometryInfo.start, l = geometryInfo.start + geometryInfo.count; i < l; i ++ ) {\n\n\t\t\t\tlet iv = i;\n\t\t\t\tif ( index ) {\n\n\t\t\t\t\tiv = index.getX( iv );\n\n\t\t\t\t}\n\n\t\t\t\tbox.expandByPoint( _vector$5.fromBufferAttribute( position, iv ) );\n\n\t\t\t}\n\n\t\t\tgeometryInfo.boundingBox = box;\n\n\t\t}\n\n\t\ttarget.copy( geometryInfo.boundingBox );\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Returns the bounding sphere for the given geometry.\n\t *\n\t * @param {number} geometryId - The ID of the geometry to return the bounding sphere for.\n\t * @param {Sphere} target - The target object that is used to store the method's result.\n\t * @return {?Sphere} The geometry's bounding sphere. Returns `null` if no geometry has been found for the given ID.\n\t */\n\tgetBoundingSphereAt( geometryId, target ) {\n\n\t\tif ( geometryId >= this._geometryCount ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// compute bounding sphere\n\t\tconst geometry = this.geometry;\n\t\tconst geometryInfo = this._geometryInfo[ geometryId ];\n\t\tif ( geometryInfo.boundingSphere === null ) {\n\n\t\t\tconst sphere = new Sphere();\n\t\t\tthis.getBoundingBoxAt( geometryId, _box$1 );\n\t\t\t_box$1.getCenter( sphere.center );\n\n\t\t\tconst index = geometry.index;\n\t\t\tconst position = geometry.attributes.position;\n\n\t\t\tlet maxRadiusSq = 0;\n\t\t\tfor ( let i = geometryInfo.start, l = geometryInfo.start + geometryInfo.count; i < l; i ++ ) {\n\n\t\t\t\tlet iv = i;\n\t\t\t\tif ( index ) {\n\n\t\t\t\t\tiv = index.getX( iv );\n\n\t\t\t\t}\n\n\t\t\t\t_vector$5.fromBufferAttribute( position, iv );\n\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, sphere.center.distanceToSquared( _vector$5 ) );\n\n\t\t\t}\n\n\t\t\tsphere.radius = Math.sqrt( maxRadiusSq );\n\t\t\tgeometryInfo.boundingSphere = sphere;\n\n\t\t}\n\n\t\ttarget.copy( geometryInfo.boundingSphere );\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Sets the given local transformation matrix to the defined instance.\n\t * Negatively scaled matrices are not supported.\n\t *\n\t * @param {number} instanceId - The ID of an instance to set the matrix of.\n\t * @param {Matrix4} matrix - A 4x4 matrix representing the local transformation of a single instance.\n\t * @return {BatchedMesh} A reference to this batched mesh.\n\t */\n\tsetMatrixAt( instanceId, matrix ) {\n\n\t\tthis.validateInstanceId( instanceId );\n\n\t\tconst matricesTexture = this._matricesTexture;\n\t\tconst matricesArray = this._matricesTexture.image.data;\n\t\tmatrix.toArray( matricesArray, instanceId * 16 );\n\t\tmatricesTexture.needsUpdate = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the local transformation matrix of the defined instance.\n\t *\n\t * @param {number} instanceId - The ID of an instance to get the matrix of.\n\t * @param {Matrix4} matrix - The target object that is used to store the method's result.\n\t * @return {Matrix4} The instance's local transformation matrix.\n\t */\n\tgetMatrixAt( instanceId, matrix ) {\n\n\t\tthis.validateInstanceId( instanceId );\n\t\treturn matrix.fromArray( this._matricesTexture.image.data, instanceId * 16 );\n\n\t}\n\n\t/**\n\t * Sets the given color to the defined instance.\n\t *\n\t * @param {number} instanceId - The ID of an instance to set the color of.\n\t * @param {Color} color - The color to set the instance to.\n\t * @return {BatchedMesh} A reference to this batched mesh.\n\t */\n\tsetColorAt( instanceId, color ) {\n\n\t\tthis.validateInstanceId( instanceId );\n\n\t\tif ( this._colorsTexture === null ) {\n\n\t\t\tthis._initColorsTexture();\n\n\t\t}\n\n\t\tcolor.toArray( this._colorsTexture.image.data, instanceId * 4 );\n\t\tthis._colorsTexture.needsUpdate = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the color of the defined instance.\n\t *\n\t * @param {number} instanceId - The ID of an instance to get the color of.\n\t * @param {Color} color - The target object that is used to store the method's result.\n\t * @return {Color} The instance's color.\n\t */\n\tgetColorAt( instanceId, color ) {\n\n\t\tthis.validateInstanceId( instanceId );\n\t\treturn color.fromArray( this._colorsTexture.image.data, instanceId * 4 );\n\n\t}\n\n\t/**\n\t * Sets the visibility of the instance.\n\t *\n\t * @param {number} instanceId - The id of the instance to set the visibility of.\n\t * @param {boolean} visible - Whether the instance is visible or not.\n\t * @return {BatchedMesh} A reference to this batched mesh.\n\t */\n\tsetVisibleAt( instanceId, visible ) {\n\n\t\tthis.validateInstanceId( instanceId );\n\n\t\tif ( this._instanceInfo[ instanceId ].visible === visible ) {\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tthis._instanceInfo[ instanceId ].visible = visible;\n\t\tthis._visibilityChanged = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the visibility state of the defined instance.\n\t *\n\t * @param {number} instanceId - The ID of an instance to get the visibility state of.\n\t * @return {boolean} Whether the instance is visible or not.\n\t */\n\tgetVisibleAt( instanceId ) {\n\n\t\tthis.validateInstanceId( instanceId );\n\n\t\treturn this._instanceInfo[ instanceId ].visible;\n\n\t}\n\n\t/**\n\t * Sets the geometry ID of the instance at the given index.\n\t *\n\t * @param {number} instanceId - The ID of the instance to set the geometry ID of.\n\t * @param {number} geometryId - The geometry ID to be use by the instance.\n\t * @return {BatchedMesh} A reference to this batched mesh.\n\t */\n\tsetGeometryIdAt( instanceId, geometryId ) {\n\n\t\tthis.validateInstanceId( instanceId );\n\t\tthis.validateGeometryId( geometryId );\n\n\t\tthis._instanceInfo[ instanceId ].geometryIndex = geometryId;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the geometry ID of the defined instance.\n\t *\n\t * @param {number} instanceId - The ID of an instance to get the geometry ID of.\n\t * @return {number} The instance's geometry ID.\n\t */\n\tgetGeometryIdAt( instanceId ) {\n\n\t\tthis.validateInstanceId( instanceId );\n\n\t\treturn this._instanceInfo[ instanceId ].geometryIndex;\n\n\t}\n\n\t/**\n\t * Get the range representing the subset of triangles related to the attached geometry,\n\t * indicating the starting offset and count, or `null` if invalid.\n\t *\n\t * @param {number} geometryId - The id of the geometry to get the range of.\n\t * @param {Object} [target] - The target object that is used to store the method's result.\n\t * @return {{\n\t * \tvertexStart:number,vertexCount:number,reservedVertexCount:number,\n\t * \tindexStart:number,indexCount:number,reservedIndexCount:number,\n\t * \tstart:number,count:number\n\t * }} The result object with range data.\n\t */\n\tgetGeometryRangeAt( geometryId, target = {} ) {\n\n\t\tthis.validateGeometryId( geometryId );\n\n\t\tconst geometryInfo = this._geometryInfo[ geometryId ];\n\t\ttarget.vertexStart = geometryInfo.vertexStart;\n\t\ttarget.vertexCount = geometryInfo.vertexCount;\n\t\ttarget.reservedVertexCount = geometryInfo.reservedVertexCount;\n\n\t\ttarget.indexStart = geometryInfo.indexStart;\n\t\ttarget.indexCount = geometryInfo.indexCount;\n\t\ttarget.reservedIndexCount = geometryInfo.reservedIndexCount;\n\n\t\ttarget.start = geometryInfo.start;\n\t\ttarget.count = geometryInfo.count;\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Resizes the necessary buffers to support the provided number of instances.\n\t * If the provided arguments shrink the number of instances but there are not enough\n\t * unused Ids at the end of the list then an error is thrown.\n\t *\n\t * @param {number} maxInstanceCount - The max number of individual instances that can be added and rendered by the batch.\n\t*/\n\tsetInstanceCount( maxInstanceCount ) {\n\n\t\t// shrink the available instances as much as possible\n\t\tconst availableInstanceIds = this._availableInstanceIds;\n\t\tconst instanceInfo = this._instanceInfo;\n\t\tavailableInstanceIds.sort( ascIdSort );\n\t\twhile ( availableInstanceIds[ availableInstanceIds.length - 1 ] === instanceInfo.length - 1 ) {\n\n\t\t\tinstanceInfo.pop();\n\t\t\tavailableInstanceIds.pop();\n\n\t\t}\n\n\t\t// throw an error if it can't be shrunk to the desired size\n\t\tif ( maxInstanceCount < instanceInfo.length ) {\n\n\t\t\tthrow new Error( `BatchedMesh: Instance ids outside the range ${ maxInstanceCount } are being used. Cannot shrink instance count.` );\n\n\t\t}\n\n\t\t// copy the multi draw counts\n\t\tconst multiDrawCounts = new Int32Array( maxInstanceCount );\n\t\tconst multiDrawStarts = new Int32Array( maxInstanceCount );\n\t\tcopyArrayContents( this._multiDrawCounts, multiDrawCounts );\n\t\tcopyArrayContents( this._multiDrawStarts, multiDrawStarts );\n\n\t\tthis._multiDrawCounts = multiDrawCounts;\n\t\tthis._multiDrawStarts = multiDrawStarts;\n\t\tthis._maxInstanceCount = maxInstanceCount;\n\n\t\t// update texture data for instance sampling\n\t\tconst indirectTexture = this._indirectTexture;\n\t\tconst matricesTexture = this._matricesTexture;\n\t\tconst colorsTexture = this._colorsTexture;\n\n\t\tindirectTexture.dispose();\n\t\tthis._initIndirectTexture();\n\t\tcopyArrayContents( indirectTexture.image.data, this._indirectTexture.image.data );\n\n\t\tmatricesTexture.dispose();\n\t\tthis._initMatricesTexture();\n\t\tcopyArrayContents( matricesTexture.image.data, this._matricesTexture.image.data );\n\n\t\tif ( colorsTexture ) {\n\n\t\t\tcolorsTexture.dispose();\n\t\t\tthis._initColorsTexture();\n\t\t\tcopyArrayContents( colorsTexture.image.data, this._colorsTexture.image.data );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Resizes the available space in the batch's vertex and index buffer attributes to the provided sizes.\n\t * If the provided arguments shrink the geometry buffers but there is not enough unused space at the\n\t * end of the geometry attributes then an error is thrown.\n\t *\n\t * @param {number} maxVertexCount - The maximum number of vertices to be used by all unique geometries to resize to.\n\t * @param {number} maxIndexCount - The maximum number of indices to be used by all unique geometries to resize to.\n\t*/\n\tsetGeometrySize( maxVertexCount, maxIndexCount ) {\n\n\t\t// Check if we can shrink to the requested vertex attribute size\n\t\tconst validRanges = [ ...this._geometryInfo ].filter( info => info.active );\n\t\tconst requiredVertexLength = Math.max( ...validRanges.map( range => range.vertexStart + range.reservedVertexCount ) );\n\t\tif ( requiredVertexLength > maxVertexCount ) {\n\n\t\t\tthrow new Error( `BatchedMesh: Geometry vertex values are being used outside the range ${ maxIndexCount }. Cannot shrink further.` );\n\n\t\t}\n\n\t\t// Check if we can shrink to the requested index attribute size\n\t\tif ( this.geometry.index ) {\n\n\t\t\tconst requiredIndexLength = Math.max( ...validRanges.map( range => range.indexStart + range.reservedIndexCount ) );\n\t\t\tif ( requiredIndexLength > maxIndexCount ) {\n\n\t\t\t\tthrow new Error( `BatchedMesh: Geometry index values are being used outside the range ${ maxIndexCount }. Cannot shrink further.` );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\t// dispose of the previous geometry\n\t\tconst oldGeometry = this.geometry;\n\t\toldGeometry.dispose();\n\n\t\t// recreate the geometry needed based on the previous variant\n\t\tthis._maxVertexCount = maxVertexCount;\n\t\tthis._maxIndexCount = maxIndexCount;\n\n\t\tif ( this._geometryInitialized ) {\n\n\t\t\tthis._geometryInitialized = false;\n\t\t\tthis.geometry = new BufferGeometry();\n\t\t\tthis._initializeGeometry( oldGeometry );\n\n\t\t}\n\n\t\t// copy data from the previous geometry\n\t\tconst geometry = this.geometry;\n\t\tif ( oldGeometry.index ) {\n\n\t\t\tcopyArrayContents( oldGeometry.index.array, geometry.index.array );\n\n\t\t}\n\n\t\tfor ( const key in oldGeometry.attributes ) {\n\n\t\t\tcopyArrayContents( oldGeometry.attributes[ key ].array, geometry.attributes[ key ].array );\n\n\t\t}\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tconst instanceInfo = this._instanceInfo;\n\t\tconst geometryInfoList = this._geometryInfo;\n\t\tconst matrixWorld = this.matrixWorld;\n\t\tconst batchGeometry = this.geometry;\n\n\t\t// iterate over each geometry\n\t\t_mesh.material = this.material;\n\t\t_mesh.geometry.index = batchGeometry.index;\n\t\t_mesh.geometry.attributes = batchGeometry.attributes;\n\t\tif ( _mesh.geometry.boundingBox === null ) {\n\n\t\t\t_mesh.geometry.boundingBox = new Box3();\n\n\t\t}\n\n\t\tif ( _mesh.geometry.boundingSphere === null ) {\n\n\t\t\t_mesh.geometry.boundingSphere = new Sphere();\n\n\t\t}\n\n\t\tfor ( let i = 0, l = instanceInfo.length; i < l; i ++ ) {\n\n\t\t\tif ( ! instanceInfo[ i ].visible || ! instanceInfo[ i ].active ) {\n\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tconst geometryId = instanceInfo[ i ].geometryIndex;\n\t\t\tconst geometryInfo = geometryInfoList[ geometryId ];\n\t\t\t_mesh.geometry.setDrawRange( geometryInfo.start, geometryInfo.count );\n\n\t\t\t// get the intersects\n\t\t\tthis.getMatrixAt( i, _mesh.matrixWorld ).premultiply( matrixWorld );\n\t\t\tthis.getBoundingBoxAt( geometryId, _mesh.geometry.boundingBox );\n\t\t\tthis.getBoundingSphereAt( geometryId, _mesh.geometry.boundingSphere );\n\t\t\t_mesh.raycast( raycaster, _batchIntersects );\n\n\t\t\t// add batch id to the intersects\n\t\t\tfor ( let j = 0, l = _batchIntersects.length; j < l; j ++ ) {\n\n\t\t\t\tconst intersect = _batchIntersects[ j ];\n\t\t\t\tintersect.object = this;\n\t\t\t\tintersect.batchId = i;\n\t\t\t\tintersects.push( intersect );\n\n\t\t\t}\n\n\t\t\t_batchIntersects.length = 0;\n\n\t\t}\n\n\t\t_mesh.material = null;\n\t\t_mesh.geometry.index = null;\n\t\t_mesh.geometry.attributes = {};\n\t\t_mesh.geometry.setDrawRange( 0, Infinity );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.geometry = source.geometry.clone();\n\t\tthis.perObjectFrustumCulled = source.perObjectFrustumCulled;\n\t\tthis.sortObjects = source.sortObjects;\n\t\tthis.boundingBox = source.boundingBox !== null ? source.boundingBox.clone() : null;\n\t\tthis.boundingSphere = source.boundingSphere !== null ? source.boundingSphere.clone() : null;\n\n\t\tthis._geometryInfo = source._geometryInfo.map( info => ( {\n\t\t\t...info,\n\n\t\t\tboundingBox: info.boundingBox !== null ? info.boundingBox.clone() : null,\n\t\t\tboundingSphere: info.boundingSphere !== null ? info.boundingSphere.clone() : null,\n\t\t} ) );\n\t\tthis._instanceInfo = source._instanceInfo.map( info => ( { ...info } ) );\n\n\t\tthis._availableInstanceIds = source._availableInstanceIds.slice();\n\t\tthis._availableGeometryIds = source._availableGeometryIds.slice();\n\n\t\tthis._nextIndexStart = source._nextIndexStart;\n\t\tthis._nextVertexStart = source._nextVertexStart;\n\t\tthis._geometryCount = source._geometryCount;\n\n\t\tthis._maxInstanceCount = source._maxInstanceCount;\n\t\tthis._maxVertexCount = source._maxVertexCount;\n\t\tthis._maxIndexCount = source._maxIndexCount;\n\n\t\tthis._geometryInitialized = source._geometryInitialized;\n\t\tthis._multiDrawCounts = source._multiDrawCounts.slice();\n\t\tthis._multiDrawStarts = source._multiDrawStarts.slice();\n\n\t\tthis._indirectTexture = source._indirectTexture.clone();\n\t\tthis._indirectTexture.image.data = this._indirectTexture.image.data.slice();\n\n\t\tthis._matricesTexture = source._matricesTexture.clone();\n\t\tthis._matricesTexture.image.data = this._matricesTexture.image.data.slice();\n\n\t\tif ( this._colorsTexture !== null ) {\n\n\t\t\tthis._colorsTexture = source._colorsTexture.clone();\n\t\t\tthis._colorsTexture.image.data = this._colorsTexture.image.data.slice();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\t// Assuming the geometry is not shared with other meshes\n\t\tthis.geometry.dispose();\n\n\t\tthis._matricesTexture.dispose();\n\t\tthis._matricesTexture = null;\n\n\t\tthis._indirectTexture.dispose();\n\t\tthis._indirectTexture = null;\n\n\t\tif ( this._colorsTexture !== null ) {\n\n\t\t\tthis._colorsTexture.dispose();\n\t\t\tthis._colorsTexture = null;\n\n\t\t}\n\n\t}\n\n\tonBeforeRender( renderer, scene, camera, geometry, material/*, _group*/ ) {\n\n\t\t// if visibility has not changed and frustum culling and object sorting is not required\n\t\t// then skip iterating over all items\n\t\tif ( ! this._visibilityChanged && ! this.perObjectFrustumCulled && ! this.sortObjects ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t// the indexed version of the multi draw function requires specifying the start\n\t\t// offset in bytes.\n\t\tconst index = geometry.getIndex();\n\t\tconst bytesPerElement = index === null ? 1 : index.array.BYTES_PER_ELEMENT;\n\n\t\tconst instanceInfo = this._instanceInfo;\n\t\tconst multiDrawStarts = this._multiDrawStarts;\n\t\tconst multiDrawCounts = this._multiDrawCounts;\n\t\tconst geometryInfoList = this._geometryInfo;\n\t\tconst perObjectFrustumCulled = this.perObjectFrustumCulled;\n\t\tconst indirectTexture = this._indirectTexture;\n\t\tconst indirectArray = indirectTexture.image.data;\n\n\t\tconst frustum = camera.isArrayCamera ? _frustumArray : _frustum;\n\t\t// prepare the frustum in the local frame\n\t\tif ( perObjectFrustumCulled && ! camera.isArrayCamera ) {\n\n\t\t\t_matrix$1\n\t\t\t\t.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse )\n\t\t\t\t.multiply( this.matrixWorld );\n\n\t\t\t_frustum.setFromProjectionMatrix(\n\t\t\t\t_matrix$1,\n\t\t\t\tcamera.coordinateSystem,\n\t\t\t\tcamera.reversedDepth\n\t\t\t);\n\n\t\t}\n\n\t\tlet multiDrawCount = 0;\n\t\tif ( this.sortObjects ) {\n\n\t\t\t// get the camera position in the local frame\n\t\t\t_matrix$1.copy( this.matrixWorld ).invert();\n\t\t\t_vector$5.setFromMatrixPosition( camera.matrixWorld ).applyMatrix4( _matrix$1 );\n\t\t\t_forward$1.set( 0, 0, -1 ).transformDirection( camera.matrixWorld ).transformDirection( _matrix$1 );\n\n\t\t\tfor ( let i = 0, l = instanceInfo.length; i < l; i ++ ) {\n\n\t\t\t\tif ( instanceInfo[ i ].visible && instanceInfo[ i ].active ) {\n\n\t\t\t\t\tconst geometryId = instanceInfo[ i ].geometryIndex;\n\n\t\t\t\t\t// get the bounds in world space\n\t\t\t\t\tthis.getMatrixAt( i, _matrix$1 );\n\t\t\t\t\tthis.getBoundingSphereAt( geometryId, _sphere$2 ).applyMatrix4( _matrix$1 );\n\n\t\t\t\t\t// determine whether the batched geometry is within the frustum\n\t\t\t\t\tlet culled = false;\n\t\t\t\t\tif ( perObjectFrustumCulled ) {\n\n\t\t\t\t\t\tculled = ! frustum.intersectsSphere( _sphere$2, camera );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! culled ) {\n\n\t\t\t\t\t\t// get the distance from camera used for sorting\n\t\t\t\t\t\tconst geometryInfo = geometryInfoList[ geometryId ];\n\t\t\t\t\t\tconst z = _temp.subVectors( _sphere$2.center, _vector$5 ).dot( _forward$1 );\n\t\t\t\t\t\t_renderList.push( geometryInfo.start, geometryInfo.count, z, i );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Sort the draw ranges and prep for rendering\n\t\t\tconst list = _renderList.list;\n\t\t\tconst customSort = this.customSort;\n\t\t\tif ( customSort === null ) {\n\n\t\t\t\tlist.sort( material.transparent ? sortTransparent : sortOpaque );\n\n\t\t\t} else {\n\n\t\t\t\tcustomSort.call( this, list, camera );\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0, l = list.length; i < l; i ++ ) {\n\n\t\t\t\tconst item = list[ i ];\n\t\t\t\tmultiDrawStarts[ multiDrawCount ] = item.start * bytesPerElement;\n\t\t\t\tmultiDrawCounts[ multiDrawCount ] = item.count;\n\t\t\t\tindirectArray[ multiDrawCount ] = item.index;\n\t\t\t\tmultiDrawCount ++;\n\n\t\t\t}\n\n\t\t\t_renderList.reset();\n\n\t\t} else {\n\n\t\t\tfor ( let i = 0, l = instanceInfo.length; i < l; i ++ ) {\n\n\t\t\t\tif ( instanceInfo[ i ].visible && instanceInfo[ i ].active ) {\n\n\t\t\t\t\tconst geometryId = instanceInfo[ i ].geometryIndex;\n\n\t\t\t\t\t// determine whether the batched geometry is within the frustum\n\t\t\t\t\tlet culled = false;\n\t\t\t\t\tif ( perObjectFrustumCulled ) {\n\n\t\t\t\t\t\t// get the bounds in world space\n\t\t\t\t\t\tthis.getMatrixAt( i, _matrix$1 );\n\t\t\t\t\t\tthis.getBoundingSphereAt( geometryId, _sphere$2 ).applyMatrix4( _matrix$1 );\n\t\t\t\t\t\tculled = ! frustum.intersectsSphere( _sphere$2, camera );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! culled ) {\n\n\t\t\t\t\t\tconst geometryInfo = geometryInfoList[ geometryId ];\n\t\t\t\t\t\tmultiDrawStarts[ multiDrawCount ] = geometryInfo.start * bytesPerElement;\n\t\t\t\t\t\tmultiDrawCounts[ multiDrawCount ] = geometryInfo.count;\n\t\t\t\t\t\tindirectArray[ multiDrawCount ] = i;\n\t\t\t\t\t\tmultiDrawCount ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tindirectTexture.needsUpdate = true;\n\t\tthis._multiDrawCount = multiDrawCount;\n\t\tthis._visibilityChanged = false;\n\n\t}\n\n\tonBeforeShadow( renderer, object, camera, shadowCamera, geometry, depthMaterial/* , group */ ) {\n\n\t\tthis.onBeforeRender( renderer, null, shadowCamera, geometry, depthMaterial );\n\n\t}\n\n}\n\n/**\n * A material for rendering line primitives.\n *\n * Materials define the appearance of renderable 3D objects.\n *\n * ```js\n * const material = new THREE.LineBasicMaterial( { color: 0xffffff } );\n * ```\n *\n * @augments Material\n */\nclass LineBasicMaterial extends Material {\n\n\t/**\n\t * Constructs a new line basic material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLineBasicMaterial = true;\n\n\t\tthis.type = 'LineBasicMaterial';\n\n\t\t/**\n\t\t * Color of the material.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.color = new Color( 0xffffff );\n\n\t\t/**\n\t\t * Sets the color of the lines using data from a texture. The texture map\n\t\t * color is modulated by the diffuse `color`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * Controls line thickness or lines.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}. WebGL and WebGPU\n\t\t * ignore this setting and always render line primitives with a\n\t\t * width of one pixel.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.linewidth = 1;\n\n\t\t/**\n\t\t * Defines appearance of line ends.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('butt'|'round'|'square')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.linecap = 'round';\n\n\t\t/**\n\t\t * Defines appearance of line joints.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.linejoin = 'round';\n\n\t\t/**\n\t\t * Whether the material is affected by fog or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.linewidth = source.linewidth;\n\t\tthis.linecap = source.linecap;\n\t\tthis.linejoin = source.linejoin;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _vStart = /*@__PURE__*/ new Vector3();\nconst _vEnd = /*@__PURE__*/ new Vector3();\n\nconst _inverseMatrix$1 = /*@__PURE__*/ new Matrix4();\nconst _ray$1 = /*@__PURE__*/ new Ray();\nconst _sphere$1 = /*@__PURE__*/ new Sphere();\n\nconst _intersectPointOnRay = /*@__PURE__*/ new Vector3();\nconst _intersectPointOnSegment = /*@__PURE__*/ new Vector3();\n\n/**\n * A continuous line. The line are rendered by connecting consecutive\n * vertices with straight lines.\n *\n * ```js\n * const material = new THREE.LineBasicMaterial( { color: 0x0000ff } );\n *\n * const points = [];\n * points.push( new THREE.Vector3( - 10, 0, 0 ) );\n * points.push( new THREE.Vector3( 0, 10, 0 ) );\n * points.push( new THREE.Vector3( 10, 0, 0 ) );\n *\n * const geometry = new THREE.BufferGeometry().setFromPoints( points );\n *\n * const line = new THREE.Line( geometry, material );\n * scene.add( line );\n * ```\n *\n * @augments Object3D\n */\nclass Line extends Object3D {\n\n\t/**\n\t * Constructs a new line.\n\t *\n\t * @param {BufferGeometry} [geometry] - The line geometry.\n\t * @param {Material|Array<Material>} [material] - The line material.\n\t */\n\tconstructor( geometry = new BufferGeometry(), material = new LineBasicMaterial() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLine = true;\n\n\t\tthis.type = 'Line';\n\n\t\t/**\n\t\t * The line geometry.\n\t\t *\n\t\t * @type {BufferGeometry}\n\t\t */\n\t\tthis.geometry = geometry;\n\n\t\t/**\n\t\t * The line material.\n\t\t *\n\t\t * @type {Material|Array<Material>}\n\t\t * @default LineBasicMaterial\n\t\t */\n\t\tthis.material = material;\n\n\t\t/**\n\t\t * A dictionary representing the morph targets in the geometry. The key is the\n\t\t * morph targets name, the value its attribute index. This member is `undefined`\n\t\t * by default and only set when morph targets are detected in the geometry.\n\t\t *\n\t\t * @type {Object<String,number>|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.morphTargetDictionary = undefined;\n\n\t\t/**\n\t\t * An array of weights typically in the range `[0,1]` that specify how much of the morph\n\t\t * is applied. This member is `undefined` by default and only set when morph targets are\n\t\t * detected in the geometry.\n\t\t *\n\t\t * @type {Array<number>|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.morphTargetInfluences = undefined;\n\n\t\tthis.updateMorphTargets();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.material = Array.isArray( source.material ) ? source.material.slice() : source.material;\n\t\tthis.geometry = source.geometry;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes an array of distance values which are necessary for rendering dashed lines.\n\t * For each vertex in the geometry, the method calculates the cumulative length from the\n\t * current point to the very beginning of the line.\n\t *\n\t * @return {Line} A reference to this line.\n\t */\n\tcomputeLineDistances() {\n\n\t\tconst geometry = this.geometry;\n\n\t\t// we assume non-indexed geometry\n\n\t\tif ( geometry.index === null ) {\n\n\t\t\tconst positionAttribute = geometry.attributes.position;\n\t\t\tconst lineDistances = [ 0 ];\n\n\t\t\tfor ( let i = 1, l = positionAttribute.count; i < l; i ++ ) {\n\n\t\t\t\t_vStart.fromBufferAttribute( positionAttribute, i - 1 );\n\t\t\t\t_vEnd.fromBufferAttribute( positionAttribute, i );\n\n\t\t\t\tlineDistances[ i ] = lineDistances[ i - 1 ];\n\t\t\t\tlineDistances[ i ] += _vStart.distanceTo( _vEnd );\n\n\t\t\t}\n\n\t\t\tgeometry.setAttribute( 'lineDistance', new Float32BufferAttribute( lineDistances, 1 ) );\n\n\t\t} else {\n\n\t\t\twarn( 'Line.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.' );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes intersection points between a casted ray and this line.\n\t *\n\t * @param {Raycaster} raycaster - The raycaster.\n\t * @param {Array<Object>} intersects - The target array that holds the intersection points.\n\t */\n\traycast( raycaster, intersects ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst matrixWorld = this.matrixWorld;\n\t\tconst threshold = raycaster.params.Line.threshold;\n\t\tconst drawRange = geometry.drawRange;\n\n\t\t// Checking boundingSphere distance to ray\n\n\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t_sphere$1.copy( geometry.boundingSphere );\n\t\t_sphere$1.applyMatrix4( matrixWorld );\n\t\t_sphere$1.radius += threshold;\n\n\t\tif ( raycaster.ray.intersectsSphere( _sphere$1 ) === false ) return;\n\n\t\t//\n\n\t\t_inverseMatrix$1.copy( matrixWorld ).invert();\n\t\t_ray$1.copy( raycaster.ray ).applyMatrix4( _inverseMatrix$1 );\n\n\t\tconst localThreshold = threshold / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 );\n\t\tconst localThresholdSq = localThreshold * localThreshold;\n\n\t\tconst step = this.isLineSegments ? 2 : 1;\n\n\t\tconst index = geometry.index;\n\t\tconst attributes = geometry.attributes;\n\t\tconst positionAttribute = attributes.position;\n\n\t\tif ( index !== null ) {\n\n\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\tconst end = Math.min( index.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( let i = start, l = end - 1; i < l; i += step ) {\n\n\t\t\t\tconst a = index.getX( i );\n\t\t\t\tconst b = index.getX( i + 1 );\n\n\t\t\t\tconst intersect = checkIntersection( this, raycaster, _ray$1, localThresholdSq, a, b, i );\n\n\t\t\t\tif ( intersect ) {\n\n\t\t\t\t\tintersects.push( intersect );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.isLineLoop ) {\n\n\t\t\t\tconst a = index.getX( end - 1 );\n\t\t\t\tconst b = index.getX( start );\n\n\t\t\t\tconst intersect = checkIntersection( this, raycaster, _ray$1, localThresholdSq, a, b, end - 1 );\n\n\t\t\t\tif ( intersect ) {\n\n\t\t\t\t\tintersects.push( intersect );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\tconst end = Math.min( positionAttribute.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( let i = start, l = end - 1; i < l; i += step ) {\n\n\t\t\t\tconst intersect = checkIntersection( this, raycaster, _ray$1, localThresholdSq, i, i + 1, i );\n\n\t\t\t\tif ( intersect ) {\n\n\t\t\t\t\tintersects.push( intersect );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.isLineLoop ) {\n\n\t\t\t\tconst intersect = checkIntersection( this, raycaster, _ray$1, localThresholdSq, end - 1, start, end - 1 );\n\n\t\t\t\tif ( intersect ) {\n\n\t\t\t\t\tintersects.push( intersect );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the values of {@link Line#morphTargetDictionary} and {@link Line#morphTargetInfluences}\n\t * to make sure existing morph targets can influence this 3D object.\n\t */\n\tupdateMorphTargets() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tconst morphAttributes = geometry.morphAttributes;\n\t\tconst keys = Object.keys( morphAttributes );\n\n\t\tif ( keys.length > 0 ) {\n\n\t\t\tconst morphAttribute = morphAttributes[ keys[ 0 ] ];\n\n\t\t\tif ( morphAttribute !== undefined ) {\n\n\t\t\t\tthis.morphTargetInfluences = [];\n\t\t\t\tthis.morphTargetDictionary = {};\n\n\t\t\t\tfor ( let m = 0, ml = morphAttribute.length; m < ml; m ++ ) {\n\n\t\t\t\t\tconst name = morphAttribute[ m ].name || String( m );\n\n\t\t\t\t\tthis.morphTargetInfluences.push( 0 );\n\t\t\t\t\tthis.morphTargetDictionary[ name ] = m;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nfunction checkIntersection( object, raycaster, ray, thresholdSq, a, b, i ) {\n\n\tconst positionAttribute = object.geometry.attributes.position;\n\n\t_vStart.fromBufferAttribute( positionAttribute, a );\n\t_vEnd.fromBufferAttribute( positionAttribute, b );\n\n\tconst distSq = ray.distanceSqToSegment( _vStart, _vEnd, _intersectPointOnRay, _intersectPointOnSegment );\n\n\tif ( distSq > thresholdSq ) return;\n\n\t_intersectPointOnRay.applyMatrix4( object.matrixWorld ); // Move back to world space for distance calculation\n\n\tconst distance = raycaster.ray.origin.distanceTo( _intersectPointOnRay );\n\n\tif ( distance < raycaster.near || distance > raycaster.far ) return;\n\n\treturn {\n\n\t\tdistance: distance,\n\t\t// What do we want? intersection point on the ray or on the segment??\n\t\t// point: raycaster.ray.at( distance ),\n\t\tpoint: _intersectPointOnSegment.clone().applyMatrix4( object.matrixWorld ),\n\t\tindex: i,\n\t\tface: null,\n\t\tfaceIndex: null,\n\t\tbarycoord: null,\n\t\tobject: object\n\n\t};\n\n}\n\nconst _start = /*@__PURE__*/ new Vector3();\nconst _end = /*@__PURE__*/ new Vector3();\n\n/**\n * A series of lines drawn between pairs of vertices.\n *\n * @augments Line\n */\nclass LineSegments extends Line {\n\n\t/**\n\t * Constructs a new line segments.\n\t *\n\t * @param {BufferGeometry} [geometry] - The line geometry.\n\t * @param {Material|Array<Material>} [material] - The line material.\n\t */\n\tconstructor( geometry, material ) {\n\n\t\tsuper( geometry, material );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLineSegments = true;\n\n\t\tthis.type = 'LineSegments';\n\n\t}\n\n\tcomputeLineDistances() {\n\n\t\tconst geometry = this.geometry;\n\n\t\t// we assume non-indexed geometry\n\n\t\tif ( geometry.index === null ) {\n\n\t\t\tconst positionAttribute = geometry.attributes.position;\n\t\t\tconst lineDistances = [];\n\n\t\t\tfor ( let i = 0, l = positionAttribute.count; i < l; i += 2 ) {\n\n\t\t\t\t_start.fromBufferAttribute( positionAttribute, i );\n\t\t\t\t_end.fromBufferAttribute( positionAttribute, i + 1 );\n\n\t\t\t\tlineDistances[ i ] = ( i === 0 ) ? 0 : lineDistances[ i - 1 ];\n\t\t\t\tlineDistances[ i + 1 ] = lineDistances[ i ] + _start.distanceTo( _end );\n\n\t\t\t}\n\n\t\t\tgeometry.setAttribute( 'lineDistance', new Float32BufferAttribute( lineDistances, 1 ) );\n\n\t\t} else {\n\n\t\t\twarn( 'LineSegments.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.' );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A continuous line. This is nearly the same as {@link Line} the only difference\n * is that the last vertex is connected with the first vertex in order to close\n * the line to form a loop.\n *\n * @augments Line\n */\nclass LineLoop extends Line {\n\n\t/**\n\t * Constructs a new line loop.\n\t *\n\t * @param {BufferGeometry} [geometry] - The line geometry.\n\t * @param {Material|Array<Material>} [material] - The line material.\n\t */\n\tconstructor( geometry, material ) {\n\n\t\tsuper( geometry, material );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLineLoop = true;\n\n\t\tthis.type = 'LineLoop';\n\n\t}\n\n}\n\n/**\n * A material for rendering point primitives.\n *\n * Materials define the appearance of renderable 3D objects.\n *\n * ```js\n * const vertices = [];\n *\n * for ( let i = 0; i < 10000; i ++ ) {\n * \tconst x = THREE.MathUtils.randFloatSpread( 2000 );\n * \tconst y = THREE.MathUtils.randFloatSpread( 2000 );\n * \tconst z = THREE.MathUtils.randFloatSpread( 2000 );\n *\n * \tvertices.push( x, y, z );\n * }\n *\n * const geometry = new THREE.BufferGeometry();\n * geometry.setAttribute( 'position', new THREE.Float32BufferAttribute( vertices, 3 ) );\n * const material = new THREE.PointsMaterial( { color: 0x888888 } );\n * const points = new THREE.Points( geometry, material );\n * scene.add( points );\n * ```\n *\n * @augments Material\n */\nclass PointsMaterial extends Material {\n\n\t/**\n\t * Constructs a new points material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isPointsMaterial = true;\n\n\t\tthis.type = 'PointsMaterial';\n\n\t\t/**\n\t\t * Color of the material.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.color = new Color( 0xffffff );\n\n\t\t/**\n\t\t * The color map. May optionally include an alpha channel, typically combined\n\t\t * with {@link Material#transparent} or {@link Material#alphaTest}. The texture map\n\t\t * color is modulated by the diffuse `color`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * The alpha map is a grayscale texture that controls the opacity across the\n\t\t * surface (black: fully transparent; white: fully opaque).\n\t\t *\n\t\t * Only the color of the texture is used, ignoring the alpha channel if one\n\t\t * exists. For RGB and RGBA textures, the renderer will use the green channel\n\t\t * when sampling this texture due to the extra bit of precision provided for\n\t\t * green in DXT-compressed and uncompressed RGB 565 formats. Luminance-only and\n\t\t * luminance/alpha textures will also still work as expected.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.alphaMap = null;\n\n\t\t/**\n\t\t * Defines the size of the points in pixels.\n\t\t *\n\t\t * Might be capped if the value exceeds hardware dependent parameters like [gl.ALIASED_POINT_SIZE_RANGE](https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getParamete).\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.size = 1;\n\n\t\t/**\n\t\t * Specifies whether size of individual points is attenuated by the camera depth (perspective camera only).\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.sizeAttenuation = true;\n\n\t\t/**\n\t\t * Whether the material is affected by fog or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.size = source.size;\n\t\tthis.sizeAttenuation = source.sizeAttenuation;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _inverseMatrix = /*@__PURE__*/ new Matrix4();\nconst _ray = /*@__PURE__*/ new Ray();\nconst _sphere = /*@__PURE__*/ new Sphere();\nconst _position$2 = /*@__PURE__*/ new Vector3();\n\n/**\n * A class for displaying points or point clouds.\n *\n * @augments Object3D\n */\nclass Points extends Object3D {\n\n\t/**\n\t * Constructs a new point cloud.\n\t *\n\t * @param {BufferGeometry} [geometry] - The points geometry.\n\t * @param {Material|Array<Material>} [material] - The points material.\n\t */\n\tconstructor( geometry = new BufferGeometry(), material = new PointsMaterial() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isPoints = true;\n\n\t\tthis.type = 'Points';\n\n\t\t/**\n\t\t * The points geometry.\n\t\t *\n\t\t * @type {BufferGeometry}\n\t\t */\n\t\tthis.geometry = geometry;\n\n\t\t/**\n\t\t * The line material.\n\t\t *\n\t\t * @type {Material|Array<Material>}\n\t\t * @default PointsMaterial\n\t\t */\n\t\tthis.material = material;\n\n\t\t/**\n\t\t * A dictionary representing the morph targets in the geometry. The key is the\n\t\t * morph targets name, the value its attribute index. This member is `undefined`\n\t\t * by default and only set when morph targets are detected in the geometry.\n\t\t *\n\t\t * @type {Object<String,number>|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.morphTargetDictionary = undefined;\n\n\t\t/**\n\t\t * An array of weights typically in the range `[0,1]` that specify how much of the morph\n\t\t * is applied. This member is `undefined` by default and only set when morph targets are\n\t\t * detected in the geometry.\n\t\t *\n\t\t * @type {Array<number>|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.morphTargetInfluences = undefined;\n\n\t\tthis.updateMorphTargets();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.material = Array.isArray( source.material ) ? source.material.slice() : source.material;\n\t\tthis.geometry = source.geometry;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes intersection points between a casted ray and this point cloud.\n\t *\n\t * @param {Raycaster} raycaster - The raycaster.\n\t * @param {Array<Object>} intersects - The target array that holds the intersection points.\n\t */\n\traycast( raycaster, intersects ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst matrixWorld = this.matrixWorld;\n\t\tconst threshold = raycaster.params.Points.threshold;\n\t\tconst drawRange = geometry.drawRange;\n\n\t\t// Checking boundingSphere distance to ray\n\n\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t_sphere.copy( geometry.boundingSphere );\n\t\t_sphere.applyMatrix4( matrixWorld );\n\t\t_sphere.radius += threshold;\n\n\t\tif ( raycaster.ray.intersectsSphere( _sphere ) === false ) return;\n\n\t\t//\n\n\t\t_inverseMatrix.copy( matrixWorld ).invert();\n\t\t_ray.copy( raycaster.ray ).applyMatrix4( _inverseMatrix );\n\n\t\tconst localThreshold = threshold / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 );\n\t\tconst localThresholdSq = localThreshold * localThreshold;\n\n\t\tconst index = geometry.index;\n\t\tconst attributes = geometry.attributes;\n\t\tconst positionAttribute = attributes.position;\n\n\t\tif ( index !== null ) {\n\n\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\tconst end = Math.min( index.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( let i = start, il = end; i < il; i ++ ) {\n\n\t\t\t\tconst a = index.getX( i );\n\n\t\t\t\t_position$2.fromBufferAttribute( positionAttribute, a );\n\n\t\t\t\ttestPoint( _position$2, a, localThresholdSq, matrixWorld, raycaster, intersects, this );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\tconst end = Math.min( positionAttribute.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( let i = start, l = end; i < l; i ++ ) {\n\n\t\t\t\t_position$2.fromBufferAttribute( positionAttribute, i );\n\n\t\t\t\ttestPoint( _position$2, i, localThresholdSq, matrixWorld, raycaster, intersects, this );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the values of {@link Points#morphTargetDictionary} and {@link Points#morphTargetInfluences}\n\t * to make sure existing morph targets can influence this 3D object.\n\t */\n\tupdateMorphTargets() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tconst morphAttributes = geometry.morphAttributes;\n\t\tconst keys = Object.keys( morphAttributes );\n\n\t\tif ( keys.length > 0 ) {\n\n\t\t\tconst morphAttribute = morphAttributes[ keys[ 0 ] ];\n\n\t\t\tif ( morphAttribute !== undefined ) {\n\n\t\t\t\tthis.morphTargetInfluences = [];\n\t\t\t\tthis.morphTargetDictionary = {};\n\n\t\t\t\tfor ( let m = 0, ml = morphAttribute.length; m < ml; m ++ ) {\n\n\t\t\t\t\tconst name = morphAttribute[ m ].name || String( m );\n\n\t\t\t\t\tthis.morphTargetInfluences.push( 0 );\n\t\t\t\t\tthis.morphTargetDictionary[ name ] = m;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nfunction testPoint( point, index, localThresholdSq, matrixWorld, raycaster, intersects, object ) {\n\n\tconst rayPointDistanceSq = _ray.distanceSqToPoint( point );\n\n\tif ( rayPointDistanceSq < localThresholdSq ) {\n\n\t\tconst intersectPoint = new Vector3();\n\n\t\t_ray.closestPointToPoint( point, intersectPoint );\n\t\tintersectPoint.applyMatrix4( matrixWorld );\n\n\t\tconst distance = raycaster.ray.origin.distanceTo( intersectPoint );\n\n\t\tif ( distance < raycaster.near || distance > raycaster.far ) return;\n\n\t\tintersects.push( {\n\n\t\t\tdistance: distance,\n\t\t\tdistanceToRay: Math.sqrt( rayPointDistanceSq ),\n\t\t\tpoint: intersectPoint,\n\t\t\tindex: index,\n\t\t\tface: null,\n\t\t\tfaceIndex: null,\n\t\t\tbarycoord: null,\n\t\t\tobject: object\n\n\t\t} );\n\n\t}\n\n}\n\n/**\n * A texture for use with a video.\n *\n * ```js\n * // assuming you have created a HTML video element with id=\"video\"\n * const video = document.getElementById( 'video' );\n * const texture = new THREE.VideoTexture( video );\n * ```\n *\n * Note: When using video textures with {@link WebGPURenderer}, {@link Texture#colorSpace} must be\n * set to THREE.SRGBColorSpace.\n *\n * Note: After the initial use of a texture, its dimensions, format, and type\n * cannot be changed. Instead, call {@link Texture#dispose} on the texture and instantiate a new one.\n *\n * @augments Texture\n */\nclass VideoTexture extends Texture {\n\n\t/**\n\t * Constructs a new video texture.\n\t *\n\t * @param {HTMLVideoElement} video - The video element to use as a data source for the texture.\n\t * @param {number} [mapping=Texture.DEFAULT_MAPPING] - The texture mapping.\n\t * @param {number} [wrapS=ClampToEdgeWrapping] - The wrapS value.\n\t * @param {number} [wrapT=ClampToEdgeWrapping] - The wrapT value.\n\t * @param {number} [magFilter=LinearFilter] - The mag filter value.\n\t * @param {number} [minFilter=LinearFilter] - The min filter value.\n\t * @param {number} [format=RGBAFormat] - The texture format.\n\t * @param {number} [type=UnsignedByteType] - The texture type.\n\t * @param {number} [anisotropy=Texture.DEFAULT_ANISOTROPY] - The anisotropy value.\n\t */\n\tconstructor( video, mapping, wrapS, wrapT, magFilter = LinearFilter, minFilter = LinearFilter, format, type, anisotropy ) {\n\n\t\tsuper( video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isVideoTexture = true;\n\n\t\t/**\n\t\t * Whether to generate mipmaps (if possible) for a texture.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.generateMipmaps = false;\n\n\t\t/**\n\t\t * The video frame request callback identifier, which is a positive integer.\n\t\t *\n\t\t * Value of 0 represents no scheduled rVFC.\n\t\t *\n\t\t * @private\n\t\t * @type {number}\n\t\t */\n\t\tthis._requestVideoFrameCallbackId = 0;\n\n\t\tconst scope = this;\n\n\t\tfunction updateVideo() {\n\n\t\t\tscope.needsUpdate = true;\n\t\t\tscope._requestVideoFrameCallbackId = video.requestVideoFrameCallback( updateVideo );\n\n\t\t}\n\n\t\tif ( 'requestVideoFrameCallback' in video ) {\n\n\t\t\tthis._requestVideoFrameCallbackId = video.requestVideoFrameCallback( updateVideo );\n\n\t\t}\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this.image ).copy( this );\n\n\t}\n\n\t/**\n\t * This method is called automatically by the renderer and sets {@link Texture#needsUpdate}\n\t * to `true` every time a new frame is available.\n\t *\n\t * Only relevant if `requestVideoFrameCallback` is not supported in the browser.\n\t */\n\tupdate() {\n\n\t\tconst video = this.image;\n\t\tconst hasVideoFrameCallback = 'requestVideoFrameCallback' in video;\n\n\t\tif ( hasVideoFrameCallback === false && video.readyState >= video.HAVE_CURRENT_DATA ) {\n\n\t\t\tthis.needsUpdate = true;\n\n\t\t}\n\n\t}\n\n\tdispose() {\n\n\t\tif ( this._requestVideoFrameCallbackId !== 0 ) {\n\n\t\t\tthis.source.data.cancelVideoFrameCallback( this._requestVideoFrameCallbackId );\n\n\t\t\tthis._requestVideoFrameCallbackId = 0;\n\n\t\t}\n\n\t\tsuper.dispose();\n\n\t}\n\n}\n\n/**\n * This class can be used as an alternative way to define video data. Instead of using\n * an instance of `HTMLVideoElement` like with `VideoTexture`, `VideoFrameTexture` expects each frame is\n * defined manually via {@link VideoFrameTexture#setFrame}. A typical use case for this module is when\n * video frames are decoded with the WebCodecs API.\n *\n * ```js\n * const texture = new THREE.VideoFrameTexture();\n * texture.setFrame( frame );\n * ```\n *\n * @augments VideoTexture\n */\nclass VideoFrameTexture extends VideoTexture {\n\n\t/**\n\t * Constructs a new video frame texture.\n\t *\n\t * @param {number} [mapping=Texture.DEFAULT_MAPPING] - The texture mapping.\n\t * @param {number} [wrapS=ClampToEdgeWrapping] - The wrapS value.\n\t * @param {number} [wrapT=ClampToEdgeWrapping] - The wrapT value.\n\t * @param {number} [magFilter=LinearFilter] - The mag filter value.\n\t * @param {number} [minFilter=LinearFilter] - The min filter value.\n\t * @param {number} [format=RGBAFormat] - The texture format.\n\t * @param {number} [type=UnsignedByteType] - The texture type.\n\t * @param {number} [anisotropy=Texture.DEFAULT_ANISOTROPY] - The anisotropy value.\n\t */\n\tconstructor( mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) {\n\n\t\tsuper( {}, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isVideoFrameTexture = true;\n\n\t}\n\n\t/**\n\t * This method overwritten with an empty implementation since\n\t * this type of texture is updated via `setFrame()`.\n\t */\n\tupdate() {}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this ); // restoring Texture.clone()\n\n\t}\n\n\t/**\n\t * Sets the current frame of the video. This will automatically update the texture\n\t * so the data can be used for rendering.\n\t *\n\t * @param {VideoFrame} frame - The video frame.\n\t */\n\tsetFrame( frame ) {\n\n\t\tthis.image = frame;\n\t\tthis.needsUpdate = true;\n\n\t}\n\n}\n\n/**\n * This class can only be used in combination with `copyFramebufferToTexture()` methods\n * of renderers. It extracts the contents of the current bound framebuffer and provides it\n * as a texture for further usage.\n *\n * ```js\n * const pixelRatio = window.devicePixelRatio;\n * const textureSize = 128 * pixelRatio;\n *\n * const frameTexture = new FramebufferTexture( textureSize, textureSize );\n *\n * // calculate start position for copying part of the frame data\n * const vector = new Vector2();\n * vector.x = ( window.innerWidth * pixelRatio / 2 ) - ( textureSize / 2 );\n * vector.y = ( window.innerHeight * pixelRatio / 2 ) - ( textureSize / 2 );\n *\n * renderer.render( scene, camera );\n *\n * // copy part of the rendered frame into the framebuffer texture\n * renderer.copyFramebufferToTexture( frameTexture, vector );\n * ```\n *\n * @augments Texture\n */\nclass FramebufferTexture extends Texture {\n\n\t/**\n\t * Constructs a new framebuffer texture.\n\t *\n\t * @param {number} [width] - The width of the texture.\n\t * @param {number} [height] - The height of the texture.\n\t */\n\tconstructor( width, height ) {\n\n\t\tsuper( { width, height } );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isFramebufferTexture = true;\n\n\t\t/**\n\t\t * How the texture is sampled when a texel covers more than one pixel.\n\t\t *\n\t\t * Overwritten and set to `NearestFilter` by default to disable filtering.\n\t\t *\n\t\t * @type {(NearestFilter|NearestMipmapNearestFilter|NearestMipmapLinearFilter|LinearFilter|LinearMipmapNearestFilter|LinearMipmapLinearFilter)}\n\t\t * @default NearestFilter\n\t\t */\n\t\tthis.magFilter = NearestFilter;\n\n\t\t/**\n\t\t * How the texture is sampled when a texel covers less than one pixel.\n\t\t *\n\t\t * Overwritten and set to `NearestFilter` by default to disable filtering.\n\t\t *\n\t\t * @type {(NearestFilter|NearestMipmapNearestFilter|NearestMipmapLinearFilter|LinearFilter|LinearMipmapNearestFilter|LinearMipmapLinearFilter)}\n\t\t * @default NearestFilter\n\t\t */\n\t\tthis.minFilter = NearestFilter;\n\n\t\t/**\n\t\t * Whether to generate mipmaps (if possible) for a texture.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.generateMipmaps = false;\n\n\t\tthis.needsUpdate = true;\n\n\t}\n\n}\n\n/**\n * Creates a texture based on data in compressed form.\n *\n * These texture are usually loaded with {@link CompressedTextureLoader}.\n *\n * @augments Texture\n */\nclass CompressedTexture extends Texture {\n\n\t/**\n\t * Constructs a new compressed texture.\n\t *\n\t * @param {Array<Object>} mipmaps - This array holds for all mipmaps (including the bases mip)\n\t * the data and dimensions.\n\t * @param {number} width - The width of the texture.\n\t * @param {number} height - The height of the texture.\n\t * @param {number} [format=RGBAFormat] - The texture format.\n\t * @param {number} [type=UnsignedByteType] - The texture type.\n\t * @param {number} [mapping=Texture.DEFAULT_MAPPING] - The texture mapping.\n\t * @param {number} [wrapS=ClampToEdgeWrapping] - The wrapS value.\n\t * @param {number} [wrapT=ClampToEdgeWrapping] - The wrapT value.\n\t * @param {number} [magFilter=LinearFilter] - The mag filter value.\n\t * @param {number} [minFilter=LinearMipmapLinearFilter] - The min filter value.\n\t * @param {number} [anisotropy=Texture.DEFAULT_ANISOTROPY] - The anisotropy value.\n\t * @param {string} [colorSpace=NoColorSpace] - The color space.\n\t */\n\tconstructor( mipmaps, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, colorSpace ) {\n\n\t\tsuper( null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, colorSpace );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCompressedTexture = true;\n\n\t\t/**\n\t\t * The image property of a compressed texture just defines its dimensions.\n\t\t *\n\t\t * @type {{width:number,height:number}}\n\t\t */\n\t\tthis.image = { width: width, height: height };\n\n\t\t/**\n\t\t * This array holds for all mipmaps (including the bases mip) the data and dimensions.\n\t\t *\n\t\t * @type {Array<Object>}\n\t\t */\n\t\tthis.mipmaps = mipmaps;\n\n\t\t/**\n\t\t * If set to `true`, the texture is flipped along the vertical axis when\n\t\t * uploaded to the GPU.\n\t\t *\n\t\t * Overwritten and set to `false` by default since it is not possible to\n\t\t * flip compressed textures.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t * @readonly\n\t\t */\n\t\tthis.flipY = false;\n\n\t\t/**\n\t\t * Whether to generate mipmaps (if possible) for a texture.\n\t\t *\n\t\t * Overwritten and set to `false` by default since it is not\n\t\t * possible to generate mipmaps for compressed data. Mipmaps\n\t\t * must be embedded in the compressed texture file.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t * @readonly\n\t\t */\n\t\tthis.generateMipmaps = false;\n\n\t}\n\n}\n\n/**\n * Creates a texture 2D array based on data in compressed form.\n *\n * These texture are usually loaded with {@link CompressedTextureLoader}.\n *\n * @augments CompressedTexture\n */\nclass CompressedArrayTexture extends CompressedTexture {\n\n\t/**\n\t * Constructs a new compressed array texture.\n\t *\n\t * @param {Array<Object>} mipmaps - This array holds for all mipmaps (including the bases mip)\n\t * the data and dimensions.\n\t * @param {number} width - The width of the texture.\n\t * @param {number} height - The height of the texture.\n\t * @param {number} depth - The depth of the texture.\n\t * @param {number} [format=RGBAFormat] - The min filter value.\n\t * @param {number} [type=UnsignedByteType] - The min filter value.\n\t */\n\tconstructor( mipmaps, width, height, depth, format, type ) {\n\n\t\tsuper( mipmaps, width, height, format, type );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCompressedArrayTexture = true;\n\n\t\t/**\n\t\t * The image property of a compressed texture just defines its dimensions.\n\t\t *\n\t\t * @name CompressedArrayTexture#image\n\t\t * @type {{width:number,height:number,depth:number}}\n\t\t */\n\t\tthis.image.depth = depth;\n\n\t\t/**\n\t\t * This defines how the texture is wrapped in the depth and corresponds to\n\t\t * *W* in UVW mapping.\n\t\t *\n\t\t * @type {(RepeatWrapping|ClampToEdgeWrapping|MirroredRepeatWrapping)}\n\t\t * @default ClampToEdgeWrapping\n\t\t */\n\t\tthis.wrapR = ClampToEdgeWrapping;\n\n\t\t/**\n\t\t * A set of all layers which need to be updated in the texture.\n\t\t *\n\t\t * @type {Set<number>}\n\t\t */\n\t\tthis.layerUpdates = new Set();\n\n\t}\n\n\t/**\n\t * Describes that a specific layer of the texture needs to be updated.\n\t * Normally when {@link Texture#needsUpdate} is set to `true`, the\n\t * entire compressed texture array is sent to the GPU. Marking specific\n\t * layers will only transmit subsets of all mipmaps associated with a\n\t * specific depth in the array which is often much more performant.\n\t *\n\t * @param {number} layerIndex - The layer index that should be updated.\n\t */\n\taddLayerUpdate( layerIndex ) {\n\n\t\tthis.layerUpdates.add( layerIndex );\n\n\t}\n\n\t/**\n\t * Resets the layer updates registry.\n\t */\n\tclearLayerUpdates() {\n\n\t\tthis.layerUpdates.clear();\n\n\t}\n\n}\n\n/**\n * Creates a cube texture based on data in compressed form.\n *\n * These texture are usually loaded with {@link CompressedTextureLoader}.\n *\n * @augments CompressedTexture\n */\nclass CompressedCubeTexture extends CompressedTexture {\n\n\t/**\n\t * Constructs a new compressed texture.\n\t *\n\t * @param {Array<CompressedTexture>} images - An array of compressed textures.\n\t * @param {number} [format=RGBAFormat] - The texture format.\n\t * @param {number} [type=UnsignedByteType] - The texture type.\n\t */\n\tconstructor( images, format, type ) {\n\n\t\tsuper( undefined, images[ 0 ].width, images[ 0 ].height, format, type, CubeReflectionMapping );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCompressedCubeTexture = true;\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCubeTexture = true;\n\n\t\tthis.image = images;\n\n\t}\n\n}\n\n/**\n * Creates a texture from a canvas element.\n *\n * This is almost the same as the base texture class, except that it sets {@link Texture#needsUpdate}\n * to `true` immediately since a canvas can directly be used for rendering.\n *\n * @augments Texture\n */\nclass CanvasTexture extends Texture {\n\n\t/**\n\t * Constructs a new texture.\n\t *\n\t * @param {HTMLCanvasElement} [canvas] - The HTML canvas element.\n\t * @param {number} [mapping=Texture.DEFAULT_MAPPING] - The texture mapping.\n\t * @param {number} [wrapS=ClampToEdgeWrapping] - The wrapS value.\n\t * @param {number} [wrapT=ClampToEdgeWrapping] - The wrapT value.\n\t * @param {number} [magFilter=LinearFilter] - The mag filter value.\n\t * @param {number} [minFilter=LinearMipmapLinearFilter] - The min filter value.\n\t * @param {number} [format=RGBAFormat] - The texture format.\n\t * @param {number} [type=UnsignedByteType] - The texture type.\n\t * @param {number} [anisotropy=Texture.DEFAULT_ANISOTROPY] - The anisotropy value.\n\t */\n\tconstructor( canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) {\n\n\t\tsuper( canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCanvasTexture = true;\n\n\t\tthis.needsUpdate = true;\n\n\t}\n\n}\n\n/**\n * This class can be used to automatically save the depth information of a\n * rendering into a texture.\n *\n * @augments Texture\n */\nclass DepthTexture extends Texture {\n\n\t/**\n\t * Constructs a new depth texture.\n\t *\n\t * @param {number} width - The width of the texture.\n\t * @param {number} height - The height of the texture.\n\t * @param {number} [type=UnsignedIntType] - The texture type.\n\t * @param {number} [mapping=Texture.DEFAULT_MAPPING] - The texture mapping.\n\t * @param {number} [wrapS=ClampToEdgeWrapping] - The wrapS value.\n\t * @param {number} [wrapT=ClampToEdgeWrapping] - The wrapT value.\n\t * @param {number} [magFilter=LinearFilter] - The mag filter value.\n\t * @param {number} [minFilter=LinearFilter] - The min filter value.\n\t * @param {number} [anisotropy=Texture.DEFAULT_ANISOTROPY] - The anisotropy value.\n\t * @param {number} [format=DepthFormat] - The texture format.\n\t * @param {number} [depth=1] - The depth of the texture.\n\t */\n\tconstructor( width, height, type = UnsignedIntType, mapping, wrapS, wrapT, magFilter = NearestFilter, minFilter = NearestFilter, anisotropy, format = DepthFormat, depth = 1 ) {\n\n\t\tif ( format !== DepthFormat && format !== DepthStencilFormat ) {\n\n\t\t\tthrow new Error( 'DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat' );\n\n\t\t}\n\n\t\tconst image = { width: width, height: height, depth: depth };\n\n\t\tsuper( image, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isDepthTexture = true;\n\n\t\t/**\n\t\t * If set to `true`, the texture is flipped along the vertical axis when\n\t\t * uploaded to the GPU.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.flipY = false;\n\n\t\t/**\n\t\t * Whether to generate mipmaps (if possible) for a texture.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.generateMipmaps = false;\n\n\t\t/**\n\t\t * Code corresponding to the depth compare function.\n\t\t *\n\t\t * @type {?(NeverCompare|LessCompare|EqualCompare|LessEqualCompare|GreaterCompare|NotEqualCompare|GreaterEqualCompare|AlwaysCompare)}\n\t\t * @default null\n\t\t */\n\t\tthis.compareFunction = null;\n\n\t}\n\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.source = new Source( Object.assign( {}, source.image ) ); // see #30540\n\t\tthis.compareFunction = source.compareFunction;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tif ( this.compareFunction !== null ) data.compareFunction = this.compareFunction;\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * Represents a texture created externally with the same renderer context.\n *\n * This may be a texture from a protected media stream, device camera feed,\n * or other data feeds like a depth sensor.\n *\n * Note that this class is only supported in {@link WebGLRenderer}, and in\n * the {@link WebGPURenderer} WebGPU backend.\n *\n * @augments Texture\n */\nclass ExternalTexture extends Texture {\n\n\t/**\n\t * Creates a new raw texture.\n\t *\n\t * @param {?(WebGLTexture|GPUTexture)} [sourceTexture=null] - The external texture.\n\t */\n\tconstructor( sourceTexture = null ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The external source texture.\n\t\t *\n\t\t * @type {?(WebGLTexture|GPUTexture)}\n\t\t * @default null\n\t\t */\n\t\tthis.sourceTexture = sourceTexture;\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isExternalTexture = true;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.sourceTexture = source.sourceTexture;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A geometry class for representing a capsule.\n *\n * ```js\n * const geometry = new THREE.CapsuleGeometry( 1, 1, 4, 8, 1 );\n * const material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );\n * const capsule = new THREE.Mesh( geometry, material );\n * scene.add( capsule );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#CapsuleGeometry\n */\nclass CapsuleGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new capsule geometry.\n\t *\n\t * @param {number} [radius=1] - Radius of the capsule.\n\t * @param {number} [height=1] - Height of the middle section.\n\t * @param {number} [capSegments=4] - Number of curve segments used to build each cap.\n\t * @param {number} [radialSegments=8] - Number of segmented faces around the circumference of the capsule. Must be an integer >= 3.\n\t * @param {number} [heightSegments=1] - Number of rows of faces along the height of the middle section. Must be an integer >= 1.\n\t */\n\tconstructor( radius = 1, height = 1, capSegments = 4, radialSegments = 8, heightSegments = 1 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'CapsuleGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\theight: height,\n\t\t\tcapSegments: capSegments,\n\t\t\tradialSegments: radialSegments,\n\t\t\theightSegments: heightSegments,\n\t\t};\n\n\t\theight = Math.max( 0, height );\n\t\tcapSegments = Math.max( 1, Math.floor( capSegments ) );\n\t\tradialSegments = Math.max( 3, Math.floor( radialSegments ) );\n\t\theightSegments = Math.max( 1, Math.floor( heightSegments ) );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tconst halfHeight = height / 2;\n\t\tconst capArcLength = ( Math.PI / 2 ) * radius;\n\t\tconst cylinderPartLength = height;\n\t\tconst totalArcLength = 2 * capArcLength + cylinderPartLength;\n\n\t\tconst numVerticalSegments = capSegments * 2 + heightSegments;\n\t\tconst verticesPerRow = radialSegments + 1;\n\n\t\tconst normal = new Vector3();\n\t\tconst vertex = new Vector3();\n\n\t\t// generate vertices, normals, and uvs\n\n\t\tfor ( let iy = 0; iy <= numVerticalSegments; iy ++ ) {\n\n\t\t\tlet currentArcLength = 0;\n\t\t\tlet profileY = 0;\n\t\t\tlet profileRadius = 0;\n\t\t\tlet normalYComponent = 0;\n\n\t\t\tif ( iy <= capSegments ) {\n\n\t\t\t\t// bottom cap\n\t\t\t\tconst segmentProgress = iy / capSegments;\n\t\t\t\tconst angle = ( segmentProgress * Math.PI ) / 2;\n\t\t\t\tprofileY = - halfHeight - radius * Math.cos( angle );\n\t\t\t\tprofileRadius = radius * Math.sin( angle );\n\t\t\t\tnormalYComponent = - radius * Math.cos( angle );\n\t\t\t\tcurrentArcLength = segmentProgress * capArcLength;\n\n\t\t\t} else if ( iy <= capSegments + heightSegments ) {\n\n\t\t\t\t// middle section\n\t\t\t\tconst segmentProgress = ( iy - capSegments ) / heightSegments;\n\t\t\t\tprofileY = - halfHeight + segmentProgress * height;\n\t\t\t\tprofileRadius = radius;\n\t\t\t\tnormalYComponent = 0;\n\t\t\t\tcurrentArcLength = capArcLength + segmentProgress * cylinderPartLength;\n\n\t\t\t} else {\n\n\t\t\t\t// top cap\n\t\t\t\tconst segmentProgress =\n\t\t\t\t\t( iy - capSegments - heightSegments ) / capSegments;\n\t\t\t\tconst angle = ( segmentProgress * Math.PI ) / 2;\n\t\t\t\tprofileY = halfHeight + radius * Math.sin( angle );\n\t\t\t\tprofileRadius = radius * Math.cos( angle );\n\t\t\t\tnormalYComponent = radius * Math.sin( angle );\n\t\t\t\tcurrentArcLength =\n\t\t\t\t\tcapArcLength + cylinderPartLength + segmentProgress * capArcLength;\n\n\t\t\t}\n\n\t\t\tconst v = Math.max( 0, Math.min( 1, currentArcLength / totalArcLength ) );\n\n\n\t\t\t// special case for the poles\n\n\t\t\tlet uOffset = 0;\n\n\t\t\tif ( iy === 0 ) {\n\n\t\t\t\tuOffset = 0.5 / radialSegments;\n\n\t\t\t} else if ( iy === numVerticalSegments ) {\n\n\t\t\t\tuOffset = -0.5 / radialSegments;\n\n\t\t\t}\n\n\t\t\tfor ( let ix = 0; ix <= radialSegments; ix ++ ) {\n\n\t\t\t\tconst u = ix / radialSegments;\n\t\t\t\tconst theta = u * Math.PI * 2;\n\n\t\t\t\tconst sinTheta = Math.sin( theta );\n\t\t\t\tconst cosTheta = Math.cos( theta );\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = - profileRadius * cosTheta;\n\t\t\t\tvertex.y = profileY;\n\t\t\t\tvertex.z = profileRadius * sinTheta;\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormal.set(\n\t\t\t\t\t- profileRadius * cosTheta,\n\t\t\t\t\tnormalYComponent,\n\t\t\t\t\tprofileRadius * sinTheta\n\t\t\t\t);\n\t\t\t\tnormal.normalize();\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( u + uOffset, v );\n\n\t\t\t}\n\n\t\t\tif ( iy > 0 ) {\n\n\t\t\t\tconst prevIndexRow = ( iy - 1 ) * verticesPerRow;\n\t\t\t\tfor ( let ix = 0; ix < radialSegments; ix ++ ) {\n\n\t\t\t\t\tconst i1 = prevIndexRow + ix;\n\t\t\t\t\tconst i2 = prevIndexRow + ix + 1;\n\t\t\t\t\tconst i3 = iy * verticesPerRow + ix;\n\t\t\t\t\tconst i4 = iy * verticesPerRow + ix + 1;\n\n\t\t\t\t\tindices.push( i1, i2, i3 );\n\t\t\t\t\tindices.push( i2, i4, i3 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {CapsuleGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new CapsuleGeometry( data.radius, data.height, data.capSegments, data.radialSegments, data.heightSegments );\n\n\t}\n\n}\n\n/**\n * A simple shape of Euclidean geometry. It is constructed from a\n * number of triangular segments that are oriented around a central point and\n * extend as far out as a given radius. It is built counter-clockwise from a\n * start angle and a given central angle. It can also be used to create\n * regular polygons, where the number of segments determines the number of\n * sides.\n *\n * ```js\n * const geometry = new THREE.CircleGeometry( 5, 32 );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const circle = new THREE.Mesh( geometry, material );\n * scene.add( circle )\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#CircleGeometry\n */\nclass CircleGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new circle geometry.\n\t *\n\t * @param {number} [radius=1] - Radius of the circle.\n\t * @param {number} [segments=32] - Number of segments (triangles), minimum = `3`.\n\t * @param {number} [thetaStart=0] - Start angle for first segment in radians.\n\t * @param {number} [thetaLength=Math.PI*2] - The central angle, often called theta,\n\t * of the circular sector in radians. The default value results in a complete circle.\n\t */\n\tconstructor( radius = 1, segments = 32, thetaStart = 0, thetaLength = Math.PI * 2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'CircleGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tsegments: segments,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tsegments = Math.max( 3, segments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tconst vertex = new Vector3();\n\t\tconst uv = new Vector2();\n\n\t\t// center point\n\n\t\tvertices.push( 0, 0, 0 );\n\t\tnormals.push( 0, 0, 1 );\n\t\tuvs.push( 0.5, 0.5 );\n\n\t\tfor ( let s = 0, i = 3; s <= segments; s ++, i += 3 ) {\n\n\t\t\tconst segment = thetaStart + s / segments * thetaLength;\n\n\t\t\t// vertex\n\n\t\t\tvertex.x = radius * Math.cos( segment );\n\t\t\tvertex.y = radius * Math.sin( segment );\n\n\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t// normal\n\n\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\t// uvs\n\n\t\t\tuv.x = ( vertices[ i ] / radius + 1 ) / 2;\n\t\t\tuv.y = ( vertices[ i + 1 ] / radius + 1 ) / 2;\n\n\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( let i = 1; i <= segments; i ++ ) {\n\n\t\t\tindices.push( i, i + 1, 0 );\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {CircleGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new CircleGeometry( data.radius, data.segments, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\n/**\n * A geometry class for representing a cylinder.\n *\n * ```js\n * const geometry = new THREE.CylinderGeometry( 5, 5, 20, 32 );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const cylinder = new THREE.Mesh( geometry, material );\n * scene.add( cylinder );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#CylinderGeometry\n */\nclass CylinderGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new cylinder geometry.\n\t *\n\t * @param {number} [radiusTop=1] - Radius of the cylinder at the top.\n\t * @param {number} [radiusBottom=1] - Radius of the cylinder at the bottom.\n\t * @param {number} [height=1] - Height of the cylinder.\n\t * @param {number} [radialSegments=32] - Number of segmented faces around the circumference of the cylinder.\n\t * @param {number} [heightSegments=1] - Number of rows of faces along the height of the cylinder.\n\t * @param {boolean} [openEnded=false] - Whether the base of the cylinder is open or capped.\n\t * @param {number} [thetaStart=0] - Start angle for first segment, in radians.\n\t * @param {number} [thetaLength=Math.PI*2] - The central angle, often called theta, of the circular sector, in radians.\n\t * The default value results in a complete cylinder.\n\t */\n\tconstructor( radiusTop = 1, radiusBottom = 1, height = 1, radialSegments = 32, heightSegments = 1, openEnded = false, thetaStart = 0, thetaLength = Math.PI * 2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'CylinderGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradiusTop: radiusTop,\n\t\t\tradiusBottom: radiusBottom,\n\t\t\theight: height,\n\t\t\tradialSegments: radialSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\topenEnded: openEnded,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tconst scope = this;\n\n\t\tradialSegments = Math.floor( radialSegments );\n\t\theightSegments = Math.floor( heightSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tlet index = 0;\n\t\tconst indexArray = [];\n\t\tconst halfHeight = height / 2;\n\t\tlet groupStart = 0;\n\n\t\t// generate geometry\n\n\t\tgenerateTorso();\n\n\t\tif ( openEnded === false ) {\n\n\t\t\tif ( radiusTop > 0 ) generateCap( true );\n\t\t\tif ( radiusBottom > 0 ) generateCap( false );\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\tfunction generateTorso() {\n\n\t\t\tconst normal = new Vector3();\n\t\t\tconst vertex = new Vector3();\n\n\t\t\tlet groupCount = 0;\n\n\t\t\t// this will be used to calculate the normal\n\t\t\tconst slope = ( radiusBottom - radiusTop ) / height;\n\n\t\t\t// generate vertices, normals and uvs\n\n\t\t\tfor ( let y = 0; y <= heightSegments; y ++ ) {\n\n\t\t\t\tconst indexRow = [];\n\n\t\t\t\tconst v = y / heightSegments;\n\n\t\t\t\t// calculate the radius of the current row\n\n\t\t\t\tconst radius = v * ( radiusBottom - radiusTop ) + radiusTop;\n\n\t\t\t\tfor ( let x = 0; x <= radialSegments; x ++ ) {\n\n\t\t\t\t\tconst u = x / radialSegments;\n\n\t\t\t\t\tconst theta = u * thetaLength + thetaStart;\n\n\t\t\t\t\tconst sinTheta = Math.sin( theta );\n\t\t\t\t\tconst cosTheta = Math.cos( theta );\n\n\t\t\t\t\t// vertex\n\n\t\t\t\t\tvertex.x = radius * sinTheta;\n\t\t\t\t\tvertex.y = - v * height + halfHeight;\n\t\t\t\t\tvertex.z = radius * cosTheta;\n\t\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t\t// normal\n\n\t\t\t\t\tnormal.set( sinTheta, slope, cosTheta ).normalize();\n\t\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t\t// uv\n\n\t\t\t\t\tuvs.push( u, 1 - v );\n\n\t\t\t\t\t// save index of vertex in respective row\n\n\t\t\t\t\tindexRow.push( index ++ );\n\n\t\t\t\t}\n\n\t\t\t\t// now save vertices of the row in our index array\n\n\t\t\t\tindexArray.push( indexRow );\n\n\t\t\t}\n\n\t\t\t// generate indices\n\n\t\t\tfor ( let x = 0; x < radialSegments; x ++ ) {\n\n\t\t\t\tfor ( let y = 0; y < heightSegments; y ++ ) {\n\n\t\t\t\t\t// we use the index array to access the correct indices\n\n\t\t\t\t\tconst a = indexArray[ y ][ x ];\n\t\t\t\t\tconst b = indexArray[ y + 1 ][ x ];\n\t\t\t\t\tconst c = indexArray[ y + 1 ][ x + 1 ];\n\t\t\t\t\tconst d = indexArray[ y ][ x + 1 ];\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tif ( radiusTop > 0 || y !== 0 ) {\n\n\t\t\t\t\t\tindices.push( a, b, d );\n\t\t\t\t\t\tgroupCount += 3;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( radiusBottom > 0 || y !== heightSegments - 1 ) {\n\n\t\t\t\t\t\tindices.push( b, c, d );\n\t\t\t\t\t\tgroupCount += 3;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup( groupStart, groupCount, 0 );\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\n\t\t}\n\n\t\tfunction generateCap( top ) {\n\n\t\t\t// save the index of the first center vertex\n\t\t\tconst centerIndexStart = index;\n\n\t\t\tconst uv = new Vector2();\n\t\t\tconst vertex = new Vector3();\n\n\t\t\tlet groupCount = 0;\n\n\t\t\tconst radius = ( top === true ) ? radiusTop : radiusBottom;\n\t\t\tconst sign = ( top === true ) ? 1 : -1;\n\n\t\t\t// first we generate the center vertex data of the cap.\n\t\t\t// because the geometry needs one set of uvs per face,\n\t\t\t// we must generate a center vertex per face/segment\n\n\t\t\tfor ( let x = 1; x <= radialSegments; x ++ ) {\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertices.push( 0, halfHeight * sign, 0 );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormals.push( 0, sign, 0 );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( 0.5, 0.5 );\n\n\t\t\t\t// increase index\n\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t\t// save the index of the last center vertex\n\t\t\tconst centerIndexEnd = index;\n\n\t\t\t// now we generate the surrounding vertices, normals and uvs\n\n\t\t\tfor ( let x = 0; x <= radialSegments; x ++ ) {\n\n\t\t\t\tconst u = x / radialSegments;\n\t\t\t\tconst theta = u * thetaLength + thetaStart;\n\n\t\t\t\tconst cosTheta = Math.cos( theta );\n\t\t\t\tconst sinTheta = Math.sin( theta );\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = radius * sinTheta;\n\t\t\t\tvertex.y = halfHeight * sign;\n\t\t\t\tvertex.z = radius * cosTheta;\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormals.push( 0, sign, 0 );\n\n\t\t\t\t// uv\n\n\t\t\t\tuv.x = ( cosTheta * 0.5 ) + 0.5;\n\t\t\t\tuv.y = ( sinTheta * 0.5 * sign ) + 0.5;\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t\t// increase index\n\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t\t// generate indices\n\n\t\t\tfor ( let x = 0; x < radialSegments; x ++ ) {\n\n\t\t\t\tconst c = centerIndexStart + x;\n\t\t\t\tconst i = centerIndexEnd + x;\n\n\t\t\t\tif ( top === true ) {\n\n\t\t\t\t\t// face top\n\n\t\t\t\t\tindices.push( i, i + 1, c );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// face bottom\n\n\t\t\t\t\tindices.push( i + 1, i, c );\n\n\t\t\t\t}\n\n\t\t\t\tgroupCount += 3;\n\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup( groupStart, groupCount, top === true ? 1 : 2 );\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {CylinderGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new CylinderGeometry( data.radiusTop, data.radiusBottom, data.height, data.radialSegments, data.heightSegments, data.openEnded, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\n/**\n * A geometry class for representing a cone.\n *\n * ```js\n * const geometry = new THREE.ConeGeometry( 5, 20, 32 );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const cone = new THREE.Mesh(geometry, material );\n * scene.add( cone );\n * ```\n *\n * @augments CylinderGeometry\n * @demo scenes/geometry-browser.html#ConeGeometry\n */\nclass ConeGeometry extends CylinderGeometry {\n\n\t/**\n\t * Constructs a new cone geometry.\n\t *\n\t * @param {number} [radius=1] - Radius of the cone base.\n\t * @param {number} [height=1] - Height of the cone.\n\t * @param {number} [radialSegments=32] - Number of segmented faces around the circumference of the cone.\n\t * @param {number} [heightSegments=1] - Number of rows of faces along the height of the cone.\n\t * @param {boolean} [openEnded=false] - Whether the base of the cone is open or capped.\n\t * @param {number} [thetaStart=0] - Start angle for first segment, in radians.\n\t * @param {number} [thetaLength=Math.PI*2] - The central angle, often called theta, of the circular sector, in radians.\n\t * The default value results in a complete cone.\n\t */\n\tconstructor( radius = 1, height = 1, radialSegments = 32, heightSegments = 1, openEnded = false, thetaStart = 0, thetaLength = Math.PI * 2 ) {\n\n\t\tsuper( 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength );\n\n\t\tthis.type = 'ConeGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\theight: height,\n\t\t\tradialSegments: radialSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\topenEnded: openEnded,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {ConeGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new ConeGeometry( data.radius, data.height, data.radialSegments, data.heightSegments, data.openEnded, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\n/**\n * A polyhedron is a solid in three dimensions with flat faces. This class\n * will take an array of vertices, project them onto a sphere, and then\n * divide them up to the desired level of detail.\n *\n * @augments BufferGeometry\n */\nclass PolyhedronGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new polyhedron geometry.\n\t *\n\t * @param {Array<number>} [vertices] - A flat array of vertices describing the base shape.\n\t * @param {Array<number>} [indices] - A flat array of indices describing the base shape.\n\t * @param {number} [radius=1] - The radius of the shape.\n\t * @param {number} [detail=0] - How many levels to subdivide the geometry. The more detail, the smoother the shape.\n\t */\n\tconstructor( vertices = [], indices = [], radius = 1, detail = 0 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'PolyhedronGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tvertices: vertices,\n\t\t\tindices: indices,\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t\t// default buffer data\n\n\t\tconst vertexBuffer = [];\n\t\tconst uvBuffer = [];\n\n\t\t// the subdivision creates the vertex buffer data\n\n\t\tsubdivide( detail );\n\n\t\t// all vertices should lie on a conceptual sphere with a given radius\n\n\t\tapplyRadius( radius );\n\n\t\t// finally, create the uv data\n\n\t\tgenerateUVs();\n\n\t\t// build non-indexed geometry\n\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertexBuffer, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( vertexBuffer.slice(), 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvBuffer, 2 ) );\n\n\t\tif ( detail === 0 ) {\n\n\t\t\tthis.computeVertexNormals(); // flat normals\n\n\t\t} else {\n\n\t\t\tthis.normalizeNormals(); // smooth normals\n\n\t\t}\n\n\t\t// helper functions\n\n\t\tfunction subdivide( detail ) {\n\n\t\t\tconst a = new Vector3();\n\t\t\tconst b = new Vector3();\n\t\t\tconst c = new Vector3();\n\n\t\t\t// iterate over all faces and apply a subdivision with the given detail value\n\n\t\t\tfor ( let i = 0; i < indices.length; i += 3 ) {\n\n\t\t\t\t// get the vertices of the face\n\n\t\t\t\tgetVertexByIndex( indices[ i + 0 ], a );\n\t\t\t\tgetVertexByIndex( indices[ i + 1 ], b );\n\t\t\t\tgetVertexByIndex( indices[ i + 2 ], c );\n\n\t\t\t\t// perform subdivision\n\n\t\t\t\tsubdivideFace( a, b, c, detail );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction subdivideFace( a, b, c, detail ) {\n\n\t\t\tconst cols = detail + 1;\n\n\t\t\t// we use this multidimensional array as a data structure for creating the subdivision\n\n\t\t\tconst v = [];\n\n\t\t\t// construct all of the vertices for this subdivision\n\n\t\t\tfor ( let i = 0; i <= cols; i ++ ) {\n\n\t\t\t\tv[ i ] = [];\n\n\t\t\t\tconst aj = a.clone().lerp( c, i / cols );\n\t\t\t\tconst bj = b.clone().lerp( c, i / cols );\n\n\t\t\t\tconst rows = cols - i;\n\n\t\t\t\tfor ( let j = 0; j <= rows; j ++ ) {\n\n\t\t\t\t\tif ( j === 0 && i === cols ) {\n\n\t\t\t\t\t\tv[ i ][ j ] = aj;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tv[ i ][ j ] = aj.clone().lerp( bj, j / rows );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// construct all of the faces\n\n\t\t\tfor ( let i = 0; i < cols; i ++ ) {\n\n\t\t\t\tfor ( let j = 0; j < 2 * ( cols - i ) - 1; j ++ ) {\n\n\t\t\t\t\tconst k = Math.floor( j / 2 );\n\n\t\t\t\t\tif ( j % 2 === 0 ) {\n\n\t\t\t\t\t\tpushVertex( v[ i ][ k + 1 ] );\n\t\t\t\t\t\tpushVertex( v[ i + 1 ][ k ] );\n\t\t\t\t\t\tpushVertex( v[ i ][ k ] );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tpushVertex( v[ i ][ k + 1 ] );\n\t\t\t\t\t\tpushVertex( v[ i + 1 ][ k + 1 ] );\n\t\t\t\t\t\tpushVertex( v[ i + 1 ][ k ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction applyRadius( radius ) {\n\n\t\t\tconst vertex = new Vector3();\n\n\t\t\t// iterate over the entire buffer and apply the radius to each vertex\n\n\t\t\tfor ( let i = 0; i < vertexBuffer.length; i += 3 ) {\n\n\t\t\t\tvertex.x = vertexBuffer[ i + 0 ];\n\t\t\t\tvertex.y = vertexBuffer[ i + 1 ];\n\t\t\t\tvertex.z = vertexBuffer[ i + 2 ];\n\n\t\t\t\tvertex.normalize().multiplyScalar( radius );\n\n\t\t\t\tvertexBuffer[ i + 0 ] = vertex.x;\n\t\t\t\tvertexBuffer[ i + 1 ] = vertex.y;\n\t\t\t\tvertexBuffer[ i + 2 ] = vertex.z;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction generateUVs() {\n\n\t\t\tconst vertex = new Vector3();\n\n\t\t\tfor ( let i = 0; i < vertexBuffer.length; i += 3 ) {\n\n\t\t\t\tvertex.x = vertexBuffer[ i + 0 ];\n\t\t\t\tvertex.y = vertexBuffer[ i + 1 ];\n\t\t\t\tvertex.z = vertexBuffer[ i + 2 ];\n\n\t\t\t\tconst u = azimuth( vertex ) / 2 / Math.PI + 0.5;\n\t\t\t\tconst v = inclination( vertex ) / Math.PI + 0.5;\n\t\t\t\tuvBuffer.push( u, 1 - v );\n\n\t\t\t}\n\n\t\t\tcorrectUVs();\n\n\t\t\tcorrectSeam();\n\n\t\t}\n\n\t\tfunction correctSeam() {\n\n\t\t\t// handle case when face straddles the seam, see #3269\n\n\t\t\tfor ( let i = 0; i < uvBuffer.length; i += 6 ) {\n\n\t\t\t\t// uv data of a single face\n\n\t\t\t\tconst x0 = uvBuffer[ i + 0 ];\n\t\t\t\tconst x1 = uvBuffer[ i + 2 ];\n\t\t\t\tconst x2 = uvBuffer[ i + 4 ];\n\n\t\t\t\tconst max = Math.max( x0, x1, x2 );\n\t\t\t\tconst min = Math.min( x0, x1, x2 );\n\n\t\t\t\t// 0.9 is somewhat arbitrary\n\n\t\t\t\tif ( max > 0.9 && min < 0.1 ) {\n\n\t\t\t\t\tif ( x0 < 0.2 ) uvBuffer[ i + 0 ] += 1;\n\t\t\t\t\tif ( x1 < 0.2 ) uvBuffer[ i + 2 ] += 1;\n\t\t\t\t\tif ( x2 < 0.2 ) uvBuffer[ i + 4 ] += 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction pushVertex( vertex ) {\n\n\t\t\tvertexBuffer.push( vertex.x, vertex.y, vertex.z );\n\n\t\t}\n\n\t\tfunction getVertexByIndex( index, vertex ) {\n\n\t\t\tconst stride = index * 3;\n\n\t\t\tvertex.x = vertices[ stride + 0 ];\n\t\t\tvertex.y = vertices[ stride + 1 ];\n\t\t\tvertex.z = vertices[ stride + 2 ];\n\n\t\t}\n\n\t\tfunction correctUVs() {\n\n\t\t\tconst a = new Vector3();\n\t\t\tconst b = new Vector3();\n\t\t\tconst c = new Vector3();\n\n\t\t\tconst centroid = new Vector3();\n\n\t\t\tconst uvA = new Vector2();\n\t\t\tconst uvB = new Vector2();\n\t\t\tconst uvC = new Vector2();\n\n\t\t\tfor ( let i = 0, j = 0; i < vertexBuffer.length; i += 9, j += 6 ) {\n\n\t\t\t\ta.set( vertexBuffer[ i + 0 ], vertexBuffer[ i + 1 ], vertexBuffer[ i + 2 ] );\n\t\t\t\tb.set( vertexBuffer[ i + 3 ], vertexBuffer[ i + 4 ], vertexBuffer[ i + 5 ] );\n\t\t\t\tc.set( vertexBuffer[ i + 6 ], vertexBuffer[ i + 7 ], vertexBuffer[ i + 8 ] );\n\n\t\t\t\tuvA.set( uvBuffer[ j + 0 ], uvBuffer[ j + 1 ] );\n\t\t\t\tuvB.set( uvBuffer[ j + 2 ], uvBuffer[ j + 3 ] );\n\t\t\t\tuvC.set( uvBuffer[ j + 4 ], uvBuffer[ j + 5 ] );\n\n\t\t\t\tcentroid.copy( a ).add( b ).add( c ).divideScalar( 3 );\n\n\t\t\t\tconst azi = azimuth( centroid );\n\n\t\t\t\tcorrectUV( uvA, j + 0, a, azi );\n\t\t\t\tcorrectUV( uvB, j + 2, b, azi );\n\t\t\t\tcorrectUV( uvC, j + 4, c, azi );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction correctUV( uv, stride, vector, azimuth ) {\n\n\t\t\tif ( ( azimuth < 0 ) && ( uv.x === 1 ) ) {\n\n\t\t\t\tuvBuffer[ stride ] = uv.x - 1;\n\n\t\t\t}\n\n\t\t\tif ( ( vector.x === 0 ) && ( vector.z === 0 ) ) {\n\n\t\t\t\tuvBuffer[ stride ] = azimuth / 2 / Math.PI + 0.5;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Angle around the Y axis, counter-clockwise when looking from above.\n\n\t\tfunction azimuth( vector ) {\n\n\t\t\treturn Math.atan2( vector.z, - vector.x );\n\n\t\t}\n\n\n\t\t// Angle above the XZ plane.\n\n\t\tfunction inclination( vector ) {\n\n\t\t\treturn Math.atan2( - vector.y, Math.sqrt( ( vector.x * vector.x ) + ( vector.z * vector.z ) ) );\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {PolyhedronGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new PolyhedronGeometry( data.vertices, data.indices, data.radius, data.details );\n\n\t}\n\n}\n\n/**\n * A geometry class for representing a dodecahedron.\n *\n * ```js\n * const geometry = new THREE.DodecahedronGeometry();\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const dodecahedron = new THREE.Mesh( geometry, material );\n * scene.add( dodecahedron );\n * ```\n *\n * @augments PolyhedronGeometry\n * @demo scenes/geometry-browser.html#DodecahedronGeometry\n */\nclass DodecahedronGeometry extends PolyhedronGeometry {\n\n\t/**\n\t * Constructs a new dodecahedron geometry.\n\t *\n\t * @param {number} [radius=1] - Radius of the dodecahedron.\n\t * @param {number} [detail=0] - Setting this to a value greater than `0` adds vertices making it no longer a dodecahedron.\n\t */\n\tconstructor( radius = 1, detail = 0 ) {\n\n\t\tconst t = ( 1 + Math.sqrt( 5 ) ) / 2;\n\t\tconst r = 1 / t;\n\n\t\tconst vertices = [\n\n\t\t\t// (±1, ±1, ±1)\n\t\t\t-1, -1, -1,\t-1, -1, 1,\n\t\t\t-1, 1, -1, -1, 1, 1,\n\t\t\t1, -1, -1, 1, -1, 1,\n\t\t\t1, 1, -1, 1, 1, 1,\n\n\t\t\t// (0, ±1/φ, ±φ)\n\t\t\t0, - r, - t, 0, - r, t,\n\t\t\t0, r, - t, 0, r, t,\n\n\t\t\t// (±1/φ, ±φ, 0)\n\t\t\t- r, - t, 0, - r, t, 0,\n\t\t\tr, - t, 0, r, t, 0,\n\n\t\t\t// (±φ, 0, ±1/φ)\n\t\t\t- t, 0, - r, t, 0, - r,\n\t\t\t- t, 0, r, t, 0, r\n\t\t];\n\n\t\tconst indices = [\n\t\t\t3, 11, 7, \t3, 7, 15, \t3, 15, 13,\n\t\t\t7, 19, 17, \t7, 17, 6, \t7, 6, 15,\n\t\t\t17, 4, 8, \t17, 8, 10, \t17, 10, 6,\n\t\t\t8, 0, 16, \t8, 16, 2, \t8, 2, 10,\n\t\t\t0, 12, 1, \t0, 1, 18, \t0, 18, 16,\n\t\t\t6, 10, 2, \t6, 2, 13, \t6, 13, 15,\n\t\t\t2, 16, 18, \t2, 18, 3, \t2, 3, 13,\n\t\t\t18, 1, 9, \t18, 9, 11, \t18, 11, 3,\n\t\t\t4, 14, 12, \t4, 12, 0, \t4, 0, 8,\n\t\t\t11, 9, 5, \t11, 5, 19, \t11, 19, 7,\n\t\t\t19, 5, 14, \t19, 14, 4, \t19, 4, 17,\n\t\t\t1, 12, 14, \t1, 14, 5, \t1, 5, 9\n\t\t];\n\n\t\tsuper( vertices, indices, radius, detail );\n\n\t\tthis.type = 'DodecahedronGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {DodecahedronGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new DodecahedronGeometry( data.radius, data.detail );\n\n\t}\n\n}\n\nconst _v0$1 = /*@__PURE__*/ new Vector3();\nconst _v1$1 = /*@__PURE__*/ new Vector3();\nconst _normal = /*@__PURE__*/ new Vector3();\nconst _triangle = /*@__PURE__*/ new Triangle();\n\n/**\n * Can be used as a helper object to view the edges of a geometry.\n *\n * ```js\n * const geometry = new THREE.BoxGeometry();\n * const edges = new THREE.EdgesGeometry( geometry );\n * const line = new THREE.LineSegments( edges );\n * scene.add( line );\n * ```\n *\n * Note: It is not yet possible to serialize/deserialize instances of this class.\n *\n * @augments BufferGeometry\n */\nclass EdgesGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new edges geometry.\n\t *\n\t * @param {?BufferGeometry} [geometry=null] - The geometry.\n\t * @param {number} [thresholdAngle=1] - An edge is only rendered if the angle (in degrees)\n\t * between the face normals of the adjoining faces exceeds this value.\n\t */\n\tconstructor( geometry = null, thresholdAngle = 1 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'EdgesGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tgeometry: geometry,\n\t\t\tthresholdAngle: thresholdAngle\n\t\t};\n\n\t\tif ( geometry !== null ) {\n\n\t\t\tconst precisionPoints = 4;\n\t\t\tconst precision = Math.pow( 10, precisionPoints );\n\t\t\tconst thresholdDot = Math.cos( DEG2RAD * thresholdAngle );\n\n\t\t\tconst indexAttr = geometry.getIndex();\n\t\t\tconst positionAttr = geometry.getAttribute( 'position' );\n\t\t\tconst indexCount = indexAttr ? indexAttr.count : positionAttr.count;\n\n\t\t\tconst indexArr = [ 0, 0, 0 ];\n\t\t\tconst vertKeys = [ 'a', 'b', 'c' ];\n\t\t\tconst hashes = new Array( 3 );\n\n\t\t\tconst edgeData = {};\n\t\t\tconst vertices = [];\n\t\t\tfor ( let i = 0; i < indexCount; i += 3 ) {\n\n\t\t\t\tif ( indexAttr ) {\n\n\t\t\t\t\tindexArr[ 0 ] = indexAttr.getX( i );\n\t\t\t\t\tindexArr[ 1 ] = indexAttr.getX( i + 1 );\n\t\t\t\t\tindexArr[ 2 ] = indexAttr.getX( i + 2 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tindexArr[ 0 ] = i;\n\t\t\t\t\tindexArr[ 1 ] = i + 1;\n\t\t\t\t\tindexArr[ 2 ] = i + 2;\n\n\t\t\t\t}\n\n\t\t\t\tconst { a, b, c } = _triangle;\n\t\t\t\ta.fromBufferAttribute( positionAttr, indexArr[ 0 ] );\n\t\t\t\tb.fromBufferAttribute( positionAttr, indexArr[ 1 ] );\n\t\t\t\tc.fromBufferAttribute( positionAttr, indexArr[ 2 ] );\n\t\t\t\t_triangle.getNormal( _normal );\n\n\t\t\t\t// create hashes for the edge from the vertices\n\t\t\t\thashes[ 0 ] = `${ Math.round( a.x * precision ) },${ Math.round( a.y * precision ) },${ Math.round( a.z * precision ) }`;\n\t\t\t\thashes[ 1 ] = `${ Math.round( b.x * precision ) },${ Math.round( b.y * precision ) },${ Math.round( b.z * precision ) }`;\n\t\t\t\thashes[ 2 ] = `${ Math.round( c.x * precision ) },${ Math.round( c.y * precision ) },${ Math.round( c.z * precision ) }`;\n\n\t\t\t\t// skip degenerate triangles\n\t\t\t\tif ( hashes[ 0 ] === hashes[ 1 ] || hashes[ 1 ] === hashes[ 2 ] || hashes[ 2 ] === hashes[ 0 ] ) {\n\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\t// iterate over every edge\n\t\t\t\tfor ( let j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t// get the first and next vertex making up the edge\n\t\t\t\t\tconst jNext = ( j + 1 ) % 3;\n\t\t\t\t\tconst vecHash0 = hashes[ j ];\n\t\t\t\t\tconst vecHash1 = hashes[ jNext ];\n\t\t\t\t\tconst v0 = _triangle[ vertKeys[ j ] ];\n\t\t\t\t\tconst v1 = _triangle[ vertKeys[ jNext ] ];\n\n\t\t\t\t\tconst hash = `${ vecHash0 }_${ vecHash1 }`;\n\t\t\t\t\tconst reverseHash = `${ vecHash1 }_${ vecHash0 }`;\n\n\t\t\t\t\tif ( reverseHash in edgeData && edgeData[ reverseHash ] ) {\n\n\t\t\t\t\t\t// if we found a sibling edge add it into the vertex array if\n\t\t\t\t\t\t// it meets the angle threshold and delete the edge from the map.\n\t\t\t\t\t\tif ( _normal.dot( edgeData[ reverseHash ].normal ) <= thresholdDot ) {\n\n\t\t\t\t\t\t\tvertices.push( v0.x, v0.y, v0.z );\n\t\t\t\t\t\t\tvertices.push( v1.x, v1.y, v1.z );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tedgeData[ reverseHash ] = null;\n\n\t\t\t\t\t} else if ( ! ( hash in edgeData ) ) {\n\n\t\t\t\t\t\t// if we've already got an edge here then skip adding a new one\n\t\t\t\t\t\tedgeData[ hash ] = {\n\n\t\t\t\t\t\t\tindex0: indexArr[ j ],\n\t\t\t\t\t\t\tindex1: indexArr[ jNext ],\n\t\t\t\t\t\t\tnormal: _normal.clone(),\n\n\t\t\t\t\t\t};\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// iterate over all remaining, unmatched edges and add them to the vertex array\n\t\t\tfor ( const key in edgeData ) {\n\n\t\t\t\tif ( edgeData[ key ] ) {\n\n\t\t\t\t\tconst { index0, index1 } = edgeData[ key ];\n\t\t\t\t\t_v0$1.fromBufferAttribute( positionAttr, index0 );\n\t\t\t\t\t_v1$1.fromBufferAttribute( positionAttr, index1 );\n\n\t\t\t\t\tvertices.push( _v0$1.x, _v0$1.y, _v0$1.z );\n\t\t\t\t\tvertices.push( _v1$1.x, _v1$1.y, _v1$1.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * An abstract base class for creating an analytic curve object that contains methods\n * for interpolation.\n *\n * @abstract\n */\nclass Curve {\n\n\t/**\n\t * Constructs a new curve.\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * The type property is used for detecting the object type\n\t\t * in context of serialization/deserialization.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.type = 'Curve';\n\n\t\t/**\n\t\t * This value determines the amount of divisions when calculating the\n\t\t * cumulative segment lengths of a curve via {@link Curve#getLengths}. To ensure\n\t\t * precision when using methods like {@link Curve#getSpacedPoints}, it is\n\t\t * recommended to increase the value of this property if the curve is very large.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 200\n\t\t */\n\t\tthis.arcLengthDivisions = 200;\n\n\t\t/**\n\t\t * Must be set to `true` if the curve parameters have changed.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.needsUpdate = false;\n\n\t\t/**\n\t\t * An internal cache that holds precomputed curve length values.\n\t\t *\n\t\t * @private\n\t\t * @type {?Array<number>}\n\t\t * @default null\n\t\t */\n\t\tthis.cacheArcLengths = null;\n\n\t}\n\n\t/**\n\t * This method returns a vector in 2D or 3D space (depending on the curve definition)\n\t * for the given interpolation factor.\n\t *\n\t * @abstract\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {(Vector2|Vector3)} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {(Vector2|Vector3)} The position on the curve. It can be a 2D or 3D vector depending on the curve definition.\n\t */\n\tgetPoint( /* t, optionalTarget */ ) {\n\n\t\twarn( 'Curve: .getPoint() not implemented.' );\n\n\t}\n\n\t/**\n\t * This method returns a vector in 2D or 3D space (depending on the curve definition)\n\t * for the given interpolation factor. Unlike {@link Curve#getPoint}, this method honors the length\n\t * of the curve which equidistant samples.\n\t *\n\t * @param {number} u - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {(Vector2|Vector3)} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {(Vector2|Vector3)} The position on the curve. It can be a 2D or 3D vector depending on the curve definition.\n\t */\n\tgetPointAt( u, optionalTarget ) {\n\n\t\tconst t = this.getUtoTmapping( u );\n\t\treturn this.getPoint( t, optionalTarget );\n\n\t}\n\n\t/**\n\t * This method samples the curve via {@link Curve#getPoint} and returns an array of points representing\n\t * the curve shape.\n\t *\n\t * @param {number} [divisions=5] - The number of divisions.\n\t * @return {Array<(Vector2|Vector3)>} An array holding the sampled curve values. The number of points is `divisions + 1`.\n\t */\n\tgetPoints( divisions = 5 ) {\n\n\t\tconst points = [];\n\n\t\tfor ( let d = 0; d <= divisions; d ++ ) {\n\n\t\t\tpoints.push( this.getPoint( d / divisions ) );\n\n\t\t}\n\n\t\treturn points;\n\n\t}\n\n\t// Get sequence of points using getPointAt( u )\n\n\t/**\n\t * This method samples the curve via {@link Curve#getPointAt} and returns an array of points representing\n\t * the curve shape. Unlike {@link Curve#getPoints}, this method returns equi-spaced points across the entire\n\t * curve.\n\t *\n\t * @param {number} [divisions=5] - The number of divisions.\n\t * @return {Array<(Vector2|Vector3)>} An array holding the sampled curve values. The number of points is `divisions + 1`.\n\t */\n\tgetSpacedPoints( divisions = 5 ) {\n\n\t\tconst points = [];\n\n\t\tfor ( let d = 0; d <= divisions; d ++ ) {\n\n\t\t\tpoints.push( this.getPointAt( d / divisions ) );\n\n\t\t}\n\n\t\treturn points;\n\n\t}\n\n\t/**\n\t * Returns the total arc length of the curve.\n\t *\n\t * @return {number} The length of the curve.\n\t */\n\tgetLength() {\n\n\t\tconst lengths = this.getLengths();\n\t\treturn lengths[ lengths.length - 1 ];\n\n\t}\n\n\t/**\n\t * Returns an array of cumulative segment lengths of the curve.\n\t *\n\t * @param {number} [divisions=this.arcLengthDivisions] - The number of divisions.\n\t * @return {Array<number>} An array holding the cumulative segment lengths.\n\t */\n\tgetLengths( divisions = this.arcLengthDivisions ) {\n\n\t\tif ( this.cacheArcLengths &&\n\t\t\t( this.cacheArcLengths.length === divisions + 1 ) &&\n\t\t\t! this.needsUpdate ) {\n\n\t\t\treturn this.cacheArcLengths;\n\n\t\t}\n\n\t\tthis.needsUpdate = false;\n\n\t\tconst cache = [];\n\t\tlet current, last = this.getPoint( 0 );\n\t\tlet sum = 0;\n\n\t\tcache.push( 0 );\n\n\t\tfor ( let p = 1; p <= divisions; p ++ ) {\n\n\t\t\tcurrent = this.getPoint( p / divisions );\n\t\t\tsum += current.distanceTo( last );\n\t\t\tcache.push( sum );\n\t\t\tlast = current;\n\n\t\t}\n\n\t\tthis.cacheArcLengths = cache;\n\n\t\treturn cache; // { sums: cache, sum: sum }; Sum is in the last element.\n\n\t}\n\n\t/**\n\t * Update the cumulative segment distance cache. The method must be called\n\t * every time curve parameters are changed. If an updated curve is part of a\n\t * composed curve like {@link CurvePath}, this method must be called on the\n\t * composed curve, too.\n\t */\n\tupdateArcLengths() {\n\n\t\tthis.needsUpdate = true;\n\t\tthis.getLengths();\n\n\t}\n\n\t/**\n\t * Given an interpolation factor in the range `[0,1]`, this method returns an updated\n\t * interpolation factor in the same range that can be ued to sample equidistant points\n\t * from a curve.\n\t *\n\t * @param {number} u - The interpolation factor.\n\t * @param {?number} distance - An optional distance on the curve.\n\t * @return {number} The updated interpolation factor.\n\t */\n\tgetUtoTmapping( u, distance = null ) {\n\n\t\tconst arcLengths = this.getLengths();\n\n\t\tlet i = 0;\n\t\tconst il = arcLengths.length;\n\n\t\tlet targetArcLength; // The targeted u distance value to get\n\n\t\tif ( distance ) {\n\n\t\t\ttargetArcLength = distance;\n\n\t\t} else {\n\n\t\t\ttargetArcLength = u * arcLengths[ il - 1 ];\n\n\t\t}\n\n\t\t// binary search for the index with largest value smaller than target u distance\n\n\t\tlet low = 0, high = il - 1, comparison;\n\n\t\twhile ( low <= high ) {\n\n\t\t\ti = Math.floor( low + ( high - low ) / 2 ); // less likely to overflow, though probably not issue here, JS doesn't really have integers, all numbers are floats\n\n\t\t\tcomparison = arcLengths[ i ] - targetArcLength;\n\n\t\t\tif ( comparison < 0 ) {\n\n\t\t\t\tlow = i + 1;\n\n\t\t\t} else if ( comparison > 0 ) {\n\n\t\t\t\thigh = i - 1;\n\n\t\t\t} else {\n\n\t\t\t\thigh = i;\n\t\t\t\tbreak;\n\n\t\t\t\t// DONE\n\n\t\t\t}\n\n\t\t}\n\n\t\ti = high;\n\n\t\tif ( arcLengths[ i ] === targetArcLength ) {\n\n\t\t\treturn i / ( il - 1 );\n\n\t\t}\n\n\t\t// we could get finer grain at lengths, or use simple interpolation between two points\n\n\t\tconst lengthBefore = arcLengths[ i ];\n\t\tconst lengthAfter = arcLengths[ i + 1 ];\n\n\t\tconst segmentLength = lengthAfter - lengthBefore;\n\n\t\t// determine where we are between the 'before' and 'after' points\n\n\t\tconst segmentFraction = ( targetArcLength - lengthBefore ) / segmentLength;\n\n\t\t// add that fractional amount to t\n\n\t\tconst t = ( i + segmentFraction ) / ( il - 1 );\n\n\t\treturn t;\n\n\t}\n\n\t/**\n\t * Returns a unit vector tangent for the given interpolation factor.\n\t * If the derived curve does not implement its tangent derivation,\n\t * two points a small delta apart will be used to find its gradient\n\t * which seems to give a reasonable approximation.\n\t *\n\t * @param {number} t - The interpolation factor.\n\t * @param {(Vector2|Vector3)} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {(Vector2|Vector3)} The tangent vector.\n\t */\n\tgetTangent( t, optionalTarget ) {\n\n\t\tconst delta = 0.0001;\n\t\tlet t1 = t - delta;\n\t\tlet t2 = t + delta;\n\n\t\t// Capping in case of danger\n\n\t\tif ( t1 < 0 ) t1 = 0;\n\t\tif ( t2 > 1 ) t2 = 1;\n\n\t\tconst pt1 = this.getPoint( t1 );\n\t\tconst pt2 = this.getPoint( t2 );\n\n\t\tconst tangent = optionalTarget || ( ( pt1.isVector2 ) ? new Vector2() : new Vector3() );\n\n\t\ttangent.copy( pt2 ).sub( pt1 ).normalize();\n\n\t\treturn tangent;\n\n\t}\n\n\t/**\n\t * Same as {@link Curve#getTangent} but with equidistant samples.\n\t *\n\t * @param {number} u - The interpolation factor.\n\t * @param {(Vector2|Vector3)} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {(Vector2|Vector3)} The tangent vector.\n\t * @see {@link Curve#getPointAt}\n\t */\n\tgetTangentAt( u, optionalTarget ) {\n\n\t\tconst t = this.getUtoTmapping( u );\n\t\treturn this.getTangent( t, optionalTarget );\n\n\t}\n\n\t/**\n\t * Generates the Frenet Frames. Requires a curve definition in 3D space. Used\n\t * in geometries like {@link TubeGeometry} or {@link ExtrudeGeometry}.\n\t *\n\t * @param {number} segments - The number of segments.\n\t * @param {boolean} [closed=false] - Whether the curve is closed or not.\n\t * @return {{tangents: Array<Vector3>, normals: Array<Vector3>, binormals: Array<Vector3>}} The Frenet Frames.\n\t */\n\tcomputeFrenetFrames( segments, closed = false ) {\n\n\t\t// see http://www.cs.indiana.edu/pub/techreports/TR425.pdf\n\n\t\tconst normal = new Vector3();\n\n\t\tconst tangents = [];\n\t\tconst normals = [];\n\t\tconst binormals = [];\n\n\t\tconst vec = new Vector3();\n\t\tconst mat = new Matrix4();\n\n\t\t// compute the tangent vectors for each segment on the curve\n\n\t\tfor ( let i = 0; i <= segments; i ++ ) {\n\n\t\t\tconst u = i / segments;\n\n\t\t\ttangents[ i ] = this.getTangentAt( u, new Vector3() );\n\n\t\t}\n\n\t\t// select an initial normal vector perpendicular to the first tangent vector,\n\t\t// and in the direction of the minimum tangent xyz component\n\n\t\tnormals[ 0 ] = new Vector3();\n\t\tbinormals[ 0 ] = new Vector3();\n\t\tlet min = Number.MAX_VALUE;\n\t\tconst tx = Math.abs( tangents[ 0 ].x );\n\t\tconst ty = Math.abs( tangents[ 0 ].y );\n\t\tconst tz = Math.abs( tangents[ 0 ].z );\n\n\t\tif ( tx <= min ) {\n\n\t\t\tmin = tx;\n\t\t\tnormal.set( 1, 0, 0 );\n\n\t\t}\n\n\t\tif ( ty <= min ) {\n\n\t\t\tmin = ty;\n\t\t\tnormal.set( 0, 1, 0 );\n\n\t\t}\n\n\t\tif ( tz <= min ) {\n\n\t\t\tnormal.set( 0, 0, 1 );\n\n\t\t}\n\n\t\tvec.crossVectors( tangents[ 0 ], normal ).normalize();\n\n\t\tnormals[ 0 ].crossVectors( tangents[ 0 ], vec );\n\t\tbinormals[ 0 ].crossVectors( tangents[ 0 ], normals[ 0 ] );\n\n\n\t\t// compute the slowly-varying normal and binormal vectors for each segment on the curve\n\n\t\tfor ( let i = 1; i <= segments; i ++ ) {\n\n\t\t\tnormals[ i ] = normals[ i - 1 ].clone();\n\n\t\t\tbinormals[ i ] = binormals[ i - 1 ].clone();\n\n\t\t\tvec.crossVectors( tangents[ i - 1 ], tangents[ i ] );\n\n\t\t\tif ( vec.length() > Number.EPSILON ) {\n\n\t\t\t\tvec.normalize();\n\n\t\t\t\tconst theta = Math.acos( clamp( tangents[ i - 1 ].dot( tangents[ i ] ), -1, 1 ) ); // clamp for floating pt errors\n\n\t\t\t\tnormals[ i ].applyMatrix4( mat.makeRotationAxis( vec, theta ) );\n\n\t\t\t}\n\n\t\t\tbinormals[ i ].crossVectors( tangents[ i ], normals[ i ] );\n\n\t\t}\n\n\t\t// if the curve is closed, postprocess the vectors so the first and last normal vectors are the same\n\n\t\tif ( closed === true ) {\n\n\t\t\tlet theta = Math.acos( clamp( normals[ 0 ].dot( normals[ segments ] ), -1, 1 ) );\n\t\t\ttheta /= segments;\n\n\t\t\tif ( tangents[ 0 ].dot( vec.crossVectors( normals[ 0 ], normals[ segments ] ) ) > 0 ) {\n\n\t\t\t\ttheta = - theta;\n\n\t\t\t}\n\n\t\t\tfor ( let i = 1; i <= segments; i ++ ) {\n\n\t\t\t\t// twist a little...\n\t\t\t\tnormals[ i ].applyMatrix4( mat.makeRotationAxis( tangents[ i ], theta * i ) );\n\t\t\t\tbinormals[ i ].crossVectors( tangents[ i ], normals[ i ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn {\n\t\t\ttangents: tangents,\n\t\t\tnormals: normals,\n\t\t\tbinormals: binormals\n\t\t};\n\n\t}\n\n\t/**\n\t * Returns a new curve with copied values from this instance.\n\t *\n\t * @return {Curve} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Copies the values of the given curve to this instance.\n\t *\n\t * @param {Curve} source - The curve to copy.\n\t * @return {Curve} A reference to this curve.\n\t */\n\tcopy( source ) {\n\n\t\tthis.arcLengthDivisions = source.arcLengthDivisions;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Serializes the curve into JSON.\n\t *\n\t * @return {Object} A JSON object representing the serialized curve.\n\t * @see {@link ObjectLoader#parse}\n\t */\n\ttoJSON() {\n\n\t\tconst data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.7,\n\t\t\t\ttype: 'Curve',\n\t\t\t\tgenerator: 'Curve.toJSON'\n\t\t\t}\n\t\t};\n\n\t\tdata.arcLengthDivisions = this.arcLengthDivisions;\n\t\tdata.type = this.type;\n\n\t\treturn data;\n\n\t}\n\n\t/**\n\t * Deserializes the curve from the given JSON.\n\t *\n\t * @param {Object} json - The JSON holding the serialized curve.\n\t * @return {Curve} A reference to this curve.\n\t */\n\tfromJSON( json ) {\n\n\t\tthis.arcLengthDivisions = json.arcLengthDivisions;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A curve representing an ellipse.\n *\n * ```js\n * const curve = new THREE.EllipseCurve(\n * \t0, 0,\n * \t10, 10,\n * \t0, 2 * Math.PI,\n * \tfalse,\n * \t0\n * );\n *\n * const points = curve.getPoints( 50 );\n * const geometry = new THREE.BufferGeometry().setFromPoints( points );\n *\n * const material = new THREE.LineBasicMaterial( { color: 0xff0000 } );\n *\n * // Create the final object to add to the scene\n * const ellipse = new THREE.Line( geometry, material );\n * ```\n *\n * @augments Curve\n */\nclass EllipseCurve extends Curve {\n\n\t/**\n\t * Constructs a new ellipse curve.\n\t *\n\t * @param {number} [aX=0] - The X center of the ellipse.\n\t * @param {number} [aY=0] - The Y center of the ellipse.\n\t * @param {number} [xRadius=1] - The radius of the ellipse in the x direction.\n\t * @param {number} [yRadius=1] - The radius of the ellipse in the y direction.\n\t * @param {number} [aStartAngle=0] - The start angle of the curve in radians starting from the positive X axis.\n\t * @param {number} [aEndAngle=Math.PI*2] - The end angle of the curve in radians starting from the positive X axis.\n\t * @param {boolean} [aClockwise=false] - Whether the ellipse is drawn clockwise or not.\n\t * @param {number} [aRotation=0] - The rotation angle of the ellipse in radians, counterclockwise from the positive X axis.\n\t */\n\tconstructor( aX = 0, aY = 0, xRadius = 1, yRadius = 1, aStartAngle = 0, aEndAngle = Math.PI * 2, aClockwise = false, aRotation = 0 ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isEllipseCurve = true;\n\n\t\tthis.type = 'EllipseCurve';\n\n\t\t/**\n\t\t * The X center of the ellipse.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.aX = aX;\n\n\t\t/**\n\t\t * The Y center of the ellipse.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.aY = aY;\n\n\t\t/**\n\t\t * The radius of the ellipse in the x direction.\n\t\t * Setting the this value equal to the {@link EllipseCurve#yRadius} will result in a circle.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.xRadius = xRadius;\n\n\t\t/**\n\t\t * The radius of the ellipse in the y direction.\n\t\t * Setting the this value equal to the {@link EllipseCurve#xRadius} will result in a circle.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.yRadius = yRadius;\n\n\t\t/**\n\t\t * The start angle of the curve in radians starting from the positive X axis.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.aStartAngle = aStartAngle;\n\n\t\t/**\n\t\t * The end angle of the curve in radians starting from the positive X axis.\n\t\t *\n\t\t * @type {number}\n\t\t * @default Math.PI*2\n\t\t */\n\t\tthis.aEndAngle = aEndAngle;\n\n\t\t/**\n\t\t * Whether the ellipse is drawn clockwise or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.aClockwise = aClockwise;\n\n\t\t/**\n\t\t * The rotation angle of the ellipse in radians, counterclockwise from the positive X axis.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.aRotation = aRotation;\n\n\t}\n\n\t/**\n\t * Returns a point on the curve.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {Vector2} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector2} The position on the curve.\n\t */\n\tgetPoint( t, optionalTarget = new Vector2() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst twoPi = Math.PI * 2;\n\t\tlet deltaAngle = this.aEndAngle - this.aStartAngle;\n\t\tconst samePoints = Math.abs( deltaAngle ) < Number.EPSILON;\n\n\t\t// ensures that deltaAngle is 0 .. 2 PI\n\t\twhile ( deltaAngle < 0 ) deltaAngle += twoPi;\n\t\twhile ( deltaAngle > twoPi ) deltaAngle -= twoPi;\n\n\t\tif ( deltaAngle < Number.EPSILON ) {\n\n\t\t\tif ( samePoints ) {\n\n\t\t\t\tdeltaAngle = 0;\n\n\t\t\t} else {\n\n\t\t\t\tdeltaAngle = twoPi;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.aClockwise === true && ! samePoints ) {\n\n\t\t\tif ( deltaAngle === twoPi ) {\n\n\t\t\t\tdeltaAngle = - twoPi;\n\n\t\t\t} else {\n\n\t\t\t\tdeltaAngle = deltaAngle - twoPi;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst angle = this.aStartAngle + t * deltaAngle;\n\t\tlet x = this.aX + this.xRadius * Math.cos( angle );\n\t\tlet y = this.aY + this.yRadius * Math.sin( angle );\n\n\t\tif ( this.aRotation !== 0 ) {\n\n\t\t\tconst cos = Math.cos( this.aRotation );\n\t\t\tconst sin = Math.sin( this.aRotation );\n\n\t\t\tconst tx = x - this.aX;\n\t\t\tconst ty = y - this.aY;\n\n\t\t\t// Rotate the point about the center of the ellipse.\n\t\t\tx = tx * cos - ty * sin + this.aX;\n\t\t\ty = tx * sin + ty * cos + this.aY;\n\n\t\t}\n\n\t\treturn point.set( x, y );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.aX = source.aX;\n\t\tthis.aY = source.aY;\n\n\t\tthis.xRadius = source.xRadius;\n\t\tthis.yRadius = source.yRadius;\n\n\t\tthis.aStartAngle = source.aStartAngle;\n\t\tthis.aEndAngle = source.aEndAngle;\n\n\t\tthis.aClockwise = source.aClockwise;\n\n\t\tthis.aRotation = source.aRotation;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.aX = this.aX;\n\t\tdata.aY = this.aY;\n\n\t\tdata.xRadius = this.xRadius;\n\t\tdata.yRadius = this.yRadius;\n\n\t\tdata.aStartAngle = this.aStartAngle;\n\t\tdata.aEndAngle = this.aEndAngle;\n\n\t\tdata.aClockwise = this.aClockwise;\n\n\t\tdata.aRotation = this.aRotation;\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.aX = json.aX;\n\t\tthis.aY = json.aY;\n\n\t\tthis.xRadius = json.xRadius;\n\t\tthis.yRadius = json.yRadius;\n\n\t\tthis.aStartAngle = json.aStartAngle;\n\t\tthis.aEndAngle = json.aEndAngle;\n\n\t\tthis.aClockwise = json.aClockwise;\n\n\t\tthis.aRotation = json.aRotation;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A curve representing an arc.\n *\n * @augments EllipseCurve\n */\nclass ArcCurve extends EllipseCurve {\n\n\t/**\n\t * Constructs a new arc curve.\n\t *\n\t * @param {number} [aX=0] - The X center of the ellipse.\n\t * @param {number} [aY=0] - The Y center of the ellipse.\n\t * @param {number} [aRadius=1] - The radius of the ellipse in the x direction.\n\t * @param {number} [aStartAngle=0] - The start angle of the curve in radians starting from the positive X axis.\n\t * @param {number} [aEndAngle=Math.PI*2] - The end angle of the curve in radians starting from the positive X axis.\n\t * @param {boolean} [aClockwise=false] - Whether the ellipse is drawn clockwise or not.\n\t */\n\tconstructor( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\tsuper( aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isArcCurve = true;\n\n\t\tthis.type = 'ArcCurve';\n\n\t}\n\n}\n\nfunction CubicPoly() {\n\n\t/**\n\t * Centripetal CatmullRom Curve - which is useful for avoiding\n\t* cusps and self-intersections in non-uniform catmull rom curves.\n\t* http://www.cemyuksel.com/research/catmullrom_param/catmullrom.pdf\n\t*\n\t* curve.type accepts centripetal(default), chordal and catmullrom\n\t* curve.tension is used for catmullrom which defaults to 0.5\n\t*/\n\n\t/*\n\tBased on an optimized c++ solution in\n\t- http://stackoverflow.com/questions/9489736/catmull-rom-curve-with-no-cusps-and-no-self-intersections/\n\t- http://ideone.com/NoEbVM\n\n\tThis CubicPoly class could be used for reusing some variables and calculations,\n\tbut for three.js curve use, it could be possible inlined and flatten into a single function call\n\twhich can be placed in CurveUtils.\n\t*/\n\n\tlet c0 = 0, c1 = 0, c2 = 0, c3 = 0;\n\n\t/*\n\t * Compute coefficients for a cubic polynomial\n\t *   p(s) = c0 + c1*s + c2*s^2 + c3*s^3\n\t * such that\n\t *   p(0) = x0, p(1) = x1\n\t *  and\n\t *   p'(0) = t0, p'(1) = t1.\n\t */\n\tfunction init( x0, x1, t0, t1 ) {\n\n\t\tc0 = x0;\n\t\tc1 = t0;\n\t\tc2 = -3 * x0 + 3 * x1 - 2 * t0 - t1;\n\t\tc3 = 2 * x0 - 2 * x1 + t0 + t1;\n\n\t}\n\n\treturn {\n\n\t\tinitCatmullRom: function ( x0, x1, x2, x3, tension ) {\n\n\t\t\tinit( x1, x2, tension * ( x2 - x0 ), tension * ( x3 - x1 ) );\n\n\t\t},\n\n\t\tinitNonuniformCatmullRom: function ( x0, x1, x2, x3, dt0, dt1, dt2 ) {\n\n\t\t\t// compute tangents when parameterized in [t1,t2]\n\t\t\tlet t1 = ( x1 - x0 ) / dt0 - ( x2 - x0 ) / ( dt0 + dt1 ) + ( x2 - x1 ) / dt1;\n\t\t\tlet t2 = ( x2 - x1 ) / dt1 - ( x3 - x1 ) / ( dt1 + dt2 ) + ( x3 - x2 ) / dt2;\n\n\t\t\t// rescale tangents for parametrization in [0,1]\n\t\t\tt1 *= dt1;\n\t\t\tt2 *= dt1;\n\n\t\t\tinit( x1, x2, t1, t2 );\n\n\t\t},\n\n\t\tcalc: function ( t ) {\n\n\t\t\tconst t2 = t * t;\n\t\t\tconst t3 = t2 * t;\n\t\t\treturn c0 + c1 * t + c2 * t2 + c3 * t3;\n\n\t\t}\n\n\t};\n\n}\n\n//\n\nconst tmp = /*@__PURE__*/ new Vector3();\nconst px = /*@__PURE__*/ new CubicPoly();\nconst py = /*@__PURE__*/ new CubicPoly();\nconst pz = /*@__PURE__*/ new CubicPoly();\n\n/**\n * A curve representing a Catmull-Rom spline.\n *\n * ```js\n * //Create a closed wavey loop\n * const curve = new THREE.CatmullRomCurve3( [\n * \tnew THREE.Vector3( -10, 0, 10 ),\n * \tnew THREE.Vector3( -5, 5, 5 ),\n * \tnew THREE.Vector3( 0, 0, 0 ),\n * \tnew THREE.Vector3( 5, -5, 5 ),\n * \tnew THREE.Vector3( 10, 0, 10 )\n * ] );\n *\n * const points = curve.getPoints( 50 );\n * const geometry = new THREE.BufferGeometry().setFromPoints( points );\n *\n * const material = new THREE.LineBasicMaterial( { color: 0xff0000 } );\n *\n * // Create the final object to add to the scene\n * const curveObject = new THREE.Line( geometry, material );\n * ```\n *\n * @augments Curve\n */\nclass CatmullRomCurve3 extends Curve {\n\n\t/**\n\t * Constructs a new Catmull-Rom curve.\n\t *\n\t * @param {Array<Vector3>} [points] - An array of 3D points defining the curve.\n\t * @param {boolean} [closed=false] - Whether the curve is closed or not.\n\t * @param {('centripetal'|'chordal'|'catmullrom')} [curveType='centripetal'] - The curve type.\n\t * @param {number} [tension=0.5] - Tension of the curve.\n\t */\n\tconstructor( points = [], closed = false, curveType = 'centripetal', tension = 0.5 ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCatmullRomCurve3 = true;\n\n\t\tthis.type = 'CatmullRomCurve3';\n\n\t\t/**\n\t\t * An array of 3D points defining the curve.\n\t\t *\n\t\t * @type {Array<Vector3>}\n\t\t */\n\t\tthis.points = points;\n\n\t\t/**\n\t\t * Whether the curve is closed or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.closed = closed;\n\n\t\t/**\n\t\t * The curve type.\n\t\t *\n\t\t * @type {('centripetal'|'chordal'|'catmullrom')}\n\t\t * @default 'centripetal'\n\t\t */\n\t\tthis.curveType = curveType;\n\n\t\t/**\n\t\t * Tension of the curve.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.5\n\t\t */\n\t\tthis.tension = tension;\n\n\t}\n\n\t/**\n\t * Returns a point on the curve.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {Vector3} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector3} The position on the curve.\n\t */\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst points = this.points;\n\t\tconst l = points.length;\n\n\t\tconst p = ( l - ( this.closed ? 0 : 1 ) ) * t;\n\t\tlet intPoint = Math.floor( p );\n\t\tlet weight = p - intPoint;\n\n\t\tif ( this.closed ) {\n\n\t\t\tintPoint += intPoint > 0 ? 0 : ( Math.floor( Math.abs( intPoint ) / l ) + 1 ) * l;\n\n\t\t} else if ( weight === 0 && intPoint === l - 1 ) {\n\n\t\t\tintPoint = l - 2;\n\t\t\tweight = 1;\n\n\t\t}\n\n\t\tlet p0, p3; // 4 points (p1 & p2 defined below)\n\n\t\tif ( this.closed || intPoint > 0 ) {\n\n\t\t\tp0 = points[ ( intPoint - 1 ) % l ];\n\n\t\t} else {\n\n\t\t\t// extrapolate first point\n\t\t\ttmp.subVectors( points[ 0 ], points[ 1 ] ).add( points[ 0 ] );\n\t\t\tp0 = tmp;\n\n\t\t}\n\n\t\tconst p1 = points[ intPoint % l ];\n\t\tconst p2 = points[ ( intPoint + 1 ) % l ];\n\n\t\tif ( this.closed || intPoint + 2 < l ) {\n\n\t\t\tp3 = points[ ( intPoint + 2 ) % l ];\n\n\t\t} else {\n\n\t\t\t// extrapolate last point\n\t\t\ttmp.subVectors( points[ l - 1 ], points[ l - 2 ] ).add( points[ l - 1 ] );\n\t\t\tp3 = tmp;\n\n\t\t}\n\n\t\tif ( this.curveType === 'centripetal' || this.curveType === 'chordal' ) {\n\n\t\t\t// init Centripetal / Chordal Catmull-Rom\n\t\t\tconst pow = this.curveType === 'chordal' ? 0.5 : 0.25;\n\t\t\tlet dt0 = Math.pow( p0.distanceToSquared( p1 ), pow );\n\t\t\tlet dt1 = Math.pow( p1.distanceToSquared( p2 ), pow );\n\t\t\tlet dt2 = Math.pow( p2.distanceToSquared( p3 ), pow );\n\n\t\t\t// safety check for repeated points\n\t\t\tif ( dt1 < 1e-4 ) dt1 = 1.0;\n\t\t\tif ( dt0 < 1e-4 ) dt0 = dt1;\n\t\t\tif ( dt2 < 1e-4 ) dt2 = dt1;\n\n\t\t\tpx.initNonuniformCatmullRom( p0.x, p1.x, p2.x, p3.x, dt0, dt1, dt2 );\n\t\t\tpy.initNonuniformCatmullRom( p0.y, p1.y, p2.y, p3.y, dt0, dt1, dt2 );\n\t\t\tpz.initNonuniformCatmullRom( p0.z, p1.z, p2.z, p3.z, dt0, dt1, dt2 );\n\n\t\t} else if ( this.curveType === 'catmullrom' ) {\n\n\t\t\tpx.initCatmullRom( p0.x, p1.x, p2.x, p3.x, this.tension );\n\t\t\tpy.initCatmullRom( p0.y, p1.y, p2.y, p3.y, this.tension );\n\t\t\tpz.initCatmullRom( p0.z, p1.z, p2.z, p3.z, this.tension );\n\n\t\t}\n\n\t\tpoint.set(\n\t\t\tpx.calc( weight ),\n\t\t\tpy.calc( weight ),\n\t\t\tpz.calc( weight )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.points = [];\n\n\t\tfor ( let i = 0, l = source.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = source.points[ i ];\n\n\t\t\tthis.points.push( point.clone() );\n\n\t\t}\n\n\t\tthis.closed = source.closed;\n\t\tthis.curveType = source.curveType;\n\t\tthis.tension = source.tension;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.points = [];\n\n\t\tfor ( let i = 0, l = this.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = this.points[ i ];\n\t\t\tdata.points.push( point.toArray() );\n\n\t\t}\n\n\t\tdata.closed = this.closed;\n\t\tdata.curveType = this.curveType;\n\t\tdata.tension = this.tension;\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.points = [];\n\n\t\tfor ( let i = 0, l = json.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = json.points[ i ];\n\t\t\tthis.points.push( new Vector3().fromArray( point ) );\n\n\t\t}\n\n\t\tthis.closed = json.closed;\n\t\tthis.curveType = json.curveType;\n\t\tthis.tension = json.tension;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * Interpolations contains spline and Bézier functions internally used by concrete curve classes.\n *\n * Bezier Curves formulas obtained from: https://en.wikipedia.org/wiki/B%C3%A9zier_curve\n *\n * @module Interpolations\n */\n\n/**\n * Computes a point on a Catmull-Rom spline.\n *\n * @param {number} t - The interpolation factor.\n * @param {number} p0 - The first control point.\n * @param {number} p1 - The second control point.\n * @param {number} p2 - The third control point.\n * @param {number} p3 - The fourth control point.\n * @return {number} The calculated point on a Catmull-Rom spline.\n */\nfunction CatmullRom( t, p0, p1, p2, p3 ) {\n\n\tconst v0 = ( p2 - p0 ) * 0.5;\n\tconst v1 = ( p3 - p1 ) * 0.5;\n\tconst t2 = t * t;\n\tconst t3 = t * t2;\n\treturn ( 2 * p1 - 2 * p2 + v0 + v1 ) * t3 + ( -3 * p1 + 3 * p2 - 2 * v0 - v1 ) * t2 + v0 * t + p1;\n\n}\n\n//\n\nfunction QuadraticBezierP0( t, p ) {\n\n\tconst k = 1 - t;\n\treturn k * k * p;\n\n}\n\nfunction QuadraticBezierP1( t, p ) {\n\n\treturn 2 * ( 1 - t ) * t * p;\n\n}\n\nfunction QuadraticBezierP2( t, p ) {\n\n\treturn t * t * p;\n\n}\n\n/**\n * Computes a point on a Quadratic Bezier curve.\n *\n * @param {number} t - The interpolation factor.\n * @param {number} p0 - The first control point.\n * @param {number} p1 - The second control point.\n * @param {number} p2 - The third control point.\n * @return {number} The calculated point on a Quadratic Bezier curve.\n */\nfunction QuadraticBezier( t, p0, p1, p2 ) {\n\n\treturn QuadraticBezierP0( t, p0 ) + QuadraticBezierP1( t, p1 ) +\n\t\tQuadraticBezierP2( t, p2 );\n\n}\n\n//\n\nfunction CubicBezierP0( t, p ) {\n\n\tconst k = 1 - t;\n\treturn k * k * k * p;\n\n}\n\nfunction CubicBezierP1( t, p ) {\n\n\tconst k = 1 - t;\n\treturn 3 * k * k * t * p;\n\n}\n\nfunction CubicBezierP2( t, p ) {\n\n\treturn 3 * ( 1 - t ) * t * t * p;\n\n}\n\nfunction CubicBezierP3( t, p ) {\n\n\treturn t * t * t * p;\n\n}\n\n/**\n * Computes a point on a Cubic Bezier curve.\n *\n * @param {number} t - The interpolation factor.\n * @param {number} p0 - The first control point.\n * @param {number} p1 - The second control point.\n * @param {number} p2 - The third control point.\n * @param {number} p3 - The fourth control point.\n * @return {number} The calculated point on a Cubic Bezier curve.\n */\nfunction CubicBezier( t, p0, p1, p2, p3 ) {\n\n\treturn CubicBezierP0( t, p0 ) + CubicBezierP1( t, p1 ) + CubicBezierP2( t, p2 ) +\n\t\tCubicBezierP3( t, p3 );\n\n}\n\n/**\n * A curve representing a 2D Cubic Bezier curve.\n *\n * ```js\n * const curve = new THREE.CubicBezierCurve(\n * \tnew THREE.Vector2( - 0, 0 ),\n * \tnew THREE.Vector2( - 5, 15 ),\n * \tnew THREE.Vector2( 20, 15 ),\n * \tnew THREE.Vector2( 10, 0 )\n * );\n *\n * const points = curve.getPoints( 50 );\n * const geometry = new THREE.BufferGeometry().setFromPoints( points );\n *\n * const material = new THREE.LineBasicMaterial( { color: 0xff0000 } );\n *\n * // Create the final object to add to the scene\n * const curveObject = new THREE.Line( geometry, material );\n * ```\n *\n * @augments Curve\n */\nclass CubicBezierCurve extends Curve {\n\n\t/**\n\t * Constructs a new Cubic Bezier curve.\n\t *\n\t * @param {Vector2} [v0] - The start point.\n\t * @param {Vector2} [v1] - The first control point.\n\t * @param {Vector2} [v2] - The second control point.\n\t * @param {Vector2} [v3] - The end point.\n\t */\n\tconstructor( v0 = new Vector2(), v1 = new Vector2(), v2 = new Vector2(), v3 = new Vector2() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCubicBezierCurve = true;\n\n\t\tthis.type = 'CubicBezierCurve';\n\n\t\t/**\n\t\t * The start point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v0 = v0;\n\n\t\t/**\n\t\t * The first control point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v1 = v1;\n\n\t\t/**\n\t\t * The second control point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v2 = v2;\n\n\t\t/**\n\t\t * The end point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v3 = v3;\n\n\t}\n\n\t/**\n\t * Returns a point on the curve.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {Vector2} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector2} The position on the curve.\n\t */\n\tgetPoint( t, optionalTarget = new Vector2() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3;\n\n\t\tpoint.set(\n\t\t\tCubicBezier( t, v0.x, v1.x, v2.x, v3.x ),\n\t\t\tCubicBezier( t, v0.y, v1.y, v2.y, v3.y )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v0.copy( source.v0 );\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\t\tthis.v3.copy( source.v3 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v0 = this.v0.toArray();\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\t\tdata.v3 = this.v3.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v0.fromArray( json.v0 );\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\t\tthis.v3.fromArray( json.v3 );\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A curve representing a 3D Cubic Bezier curve.\n *\n * @augments Curve\n */\nclass CubicBezierCurve3 extends Curve {\n\n\t/**\n\t * Constructs a new Cubic Bezier curve.\n\t *\n\t * @param {Vector3} [v0] - The start point.\n\t * @param {Vector3} [v1] - The first control point.\n\t * @param {Vector3} [v2] - The second control point.\n\t * @param {Vector3} [v3] - The end point.\n\t */\n\tconstructor( v0 = new Vector3(), v1 = new Vector3(), v2 = new Vector3(), v3 = new Vector3() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCubicBezierCurve3 = true;\n\n\t\tthis.type = 'CubicBezierCurve3';\n\n\t\t/**\n\t\t * The start point.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.v0 = v0;\n\n\t\t/**\n\t\t * The first control point.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.v1 = v1;\n\n\t\t/**\n\t\t * The second control point.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.v2 = v2;\n\n\t\t/**\n\t\t * The end point.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.v3 = v3;\n\n\t}\n\n\t/**\n\t * Returns a point on the curve.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {Vector3} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector3} The position on the curve.\n\t */\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3;\n\n\t\tpoint.set(\n\t\t\tCubicBezier( t, v0.x, v1.x, v2.x, v3.x ),\n\t\t\tCubicBezier( t, v0.y, v1.y, v2.y, v3.y ),\n\t\t\tCubicBezier( t, v0.z, v1.z, v2.z, v3.z )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v0.copy( source.v0 );\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\t\tthis.v3.copy( source.v3 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v0 = this.v0.toArray();\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\t\tdata.v3 = this.v3.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v0.fromArray( json.v0 );\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\t\tthis.v3.fromArray( json.v3 );\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A curve representing a 2D line segment.\n *\n * @augments Curve\n */\nclass LineCurve extends Curve {\n\n\t/**\n\t * Constructs a new line curve.\n\t *\n\t * @param {Vector2} [v1] - The start point.\n\t * @param {Vector2} [v2] - The end point.\n\t */\n\tconstructor( v1 = new Vector2(), v2 = new Vector2() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLineCurve = true;\n\n\t\tthis.type = 'LineCurve';\n\n\t\t/**\n\t\t * The start point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v1 = v1;\n\n\t\t/**\n\t\t * The end point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v2 = v2;\n\n\t}\n\n\t/**\n\t * Returns a point on the line.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the line. Must be in the range `[0,1]`.\n\t * @param {Vector2} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector2} The position on the line.\n\t */\n\tgetPoint( t, optionalTarget = new Vector2() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tif ( t === 1 ) {\n\n\t\t\tpoint.copy( this.v2 );\n\n\t\t} else {\n\n\t\t\tpoint.copy( this.v2 ).sub( this.v1 );\n\t\t\tpoint.multiplyScalar( t ).add( this.v1 );\n\n\t\t}\n\n\t\treturn point;\n\n\t}\n\n\t// Line curve is linear, so we can overwrite default getPointAt\n\tgetPointAt( u, optionalTarget ) {\n\n\t\treturn this.getPoint( u, optionalTarget );\n\n\t}\n\n\tgetTangent( t, optionalTarget = new Vector2() ) {\n\n\t\treturn optionalTarget.subVectors( this.v2, this.v1 ).normalize();\n\n\t}\n\n\tgetTangentAt( u, optionalTarget ) {\n\n\t\treturn this.getTangent( u, optionalTarget );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A curve representing a 3D line segment.\n *\n * @augments Curve\n */\nclass LineCurve3 extends Curve {\n\n\t/**\n\t * Constructs a new line curve.\n\t *\n\t * @param {Vector3} [v1] - The start point.\n\t * @param {Vector3} [v2] - The end point.\n\t */\n\tconstructor( v1 = new Vector3(), v2 = new Vector3() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLineCurve3 = true;\n\n\t\tthis.type = 'LineCurve3';\n\n\t\t/**\n\t\t * The start point.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.v1 = v1;\n\n\t\t/**\n\t\t * The end point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v2 = v2;\n\n\t}\n\n\t/**\n\t * Returns a point on the line.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the line. Must be in the range `[0,1]`.\n\t * @param {Vector3} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector3} The position on the line.\n\t */\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tif ( t === 1 ) {\n\n\t\t\tpoint.copy( this.v2 );\n\n\t\t} else {\n\n\t\t\tpoint.copy( this.v2 ).sub( this.v1 );\n\t\t\tpoint.multiplyScalar( t ).add( this.v1 );\n\n\t\t}\n\n\t\treturn point;\n\n\t}\n\n\t// Line curve is linear, so we can overwrite default getPointAt\n\tgetPointAt( u, optionalTarget ) {\n\n\t\treturn this.getPoint( u, optionalTarget );\n\n\t}\n\n\tgetTangent( t, optionalTarget = new Vector3() ) {\n\n\t\treturn optionalTarget.subVectors( this.v2, this.v1 ).normalize();\n\n\t}\n\n\tgetTangentAt( u, optionalTarget ) {\n\n\t\treturn this.getTangent( u, optionalTarget );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A curve representing a 2D Quadratic Bezier curve.\n *\n * ```js\n * const curve = new THREE.QuadraticBezierCurve(\n * \tnew THREE.Vector2( - 10, 0 ),\n * \tnew THREE.Vector2( 20, 15 ),\n * \tnew THREE.Vector2( 10, 0 )\n * )\n *\n * const points = curve.getPoints( 50 );\n * const geometry = new THREE.BufferGeometry().setFromPoints( points );\n *\n * const material = new THREE.LineBasicMaterial( { color: 0xff0000 } );\n *\n * // Create the final object to add to the scene\n * const curveObject = new THREE.Line( geometry, material );\n * ```\n *\n * @augments Curve\n */\nclass QuadraticBezierCurve extends Curve {\n\n\t/**\n\t * Constructs a new Quadratic Bezier curve.\n\t *\n\t * @param {Vector2} [v0] - The start point.\n\t * @param {Vector2} [v1] - The control point.\n\t * @param {Vector2} [v2] - The end point.\n\t */\n\tconstructor( v0 = new Vector2(), v1 = new Vector2(), v2 = new Vector2() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isQuadraticBezierCurve = true;\n\n\t\tthis.type = 'QuadraticBezierCurve';\n\n\t\t/**\n\t\t * The start point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v0 = v0;\n\n\t\t/**\n\t\t * The control point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v1 = v1;\n\n\t\t/**\n\t\t * The end point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v2 = v2;\n\n\t}\n\n\t/**\n\t * Returns a point on the curve.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {Vector2} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector2} The position on the curve.\n\t */\n\tgetPoint( t, optionalTarget = new Vector2() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst v0 = this.v0, v1 = this.v1, v2 = this.v2;\n\n\t\tpoint.set(\n\t\t\tQuadraticBezier( t, v0.x, v1.x, v2.x ),\n\t\t\tQuadraticBezier( t, v0.y, v1.y, v2.y )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v0.copy( source.v0 );\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v0 = this.v0.toArray();\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v0.fromArray( json.v0 );\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A curve representing a 3D Quadratic Bezier curve.\n *\n * @augments Curve\n */\nclass QuadraticBezierCurve3 extends Curve {\n\n\t/**\n\t * Constructs a new Quadratic Bezier curve.\n\t *\n\t * @param {Vector3} [v0] - The start point.\n\t * @param {Vector3} [v1] - The control point.\n\t * @param {Vector3} [v2] - The end point.\n\t */\n\tconstructor( v0 = new Vector3(), v1 = new Vector3(), v2 = new Vector3() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isQuadraticBezierCurve3 = true;\n\n\t\tthis.type = 'QuadraticBezierCurve3';\n\n\t\t/**\n\t\t * The start point.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.v0 = v0;\n\n\t\t/**\n\t\t * The control point.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.v1 = v1;\n\n\t\t/**\n\t\t * The end point.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.v2 = v2;\n\n\t}\n\n\t/**\n\t * Returns a point on the curve.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {Vector3} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector3} The position on the curve.\n\t */\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst v0 = this.v0, v1 = this.v1, v2 = this.v2;\n\n\t\tpoint.set(\n\t\t\tQuadraticBezier( t, v0.x, v1.x, v2.x ),\n\t\t\tQuadraticBezier( t, v0.y, v1.y, v2.y ),\n\t\t\tQuadraticBezier( t, v0.z, v1.z, v2.z )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v0.copy( source.v0 );\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v0 = this.v0.toArray();\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v0.fromArray( json.v0 );\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A curve representing a 2D spline curve.\n *\n * ```js\n * // Create a sine-like wave\n * const curve = new THREE.SplineCurve( [\n * \tnew THREE.Vector2( -10, 0 ),\n * \tnew THREE.Vector2( -5, 5 ),\n * \tnew THREE.Vector2( 0, 0 ),\n * \tnew THREE.Vector2( 5, -5 ),\n * \tnew THREE.Vector2( 10, 0 )\n * ] );\n *\n * const points = curve.getPoints( 50 );\n * const geometry = new THREE.BufferGeometry().setFromPoints( points );\n *\n * const material = new THREE.LineBasicMaterial( { color: 0xff0000 } );\n *\n * // Create the final object to add to the scene\n * const splineObject = new THREE.Line( geometry, material );\n * ```\n *\n * @augments Curve\n */\nclass SplineCurve extends Curve {\n\n\t/**\n\t * Constructs a new 2D spline curve.\n\t *\n\t * @param {Array<Vector2>} [points] -  An array of 2D points defining the curve.\n\t */\n\tconstructor( points = [] ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSplineCurve = true;\n\n\t\tthis.type = 'SplineCurve';\n\n\t\t/**\n\t\t * An array of 2D points defining the curve.\n\t\t *\n\t\t * @type {Array<Vector2>}\n\t\t */\n\t\tthis.points = points;\n\n\t}\n\n\t/**\n\t * Returns a point on the curve.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {Vector2} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector2} The position on the curve.\n\t */\n\tgetPoint( t, optionalTarget = new Vector2() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst points = this.points;\n\t\tconst p = ( points.length - 1 ) * t;\n\n\t\tconst intPoint = Math.floor( p );\n\t\tconst weight = p - intPoint;\n\n\t\tconst p0 = points[ intPoint === 0 ? intPoint : intPoint - 1 ];\n\t\tconst p1 = points[ intPoint ];\n\t\tconst p2 = points[ intPoint > points.length - 2 ? points.length - 1 : intPoint + 1 ];\n\t\tconst p3 = points[ intPoint > points.length - 3 ? points.length - 1 : intPoint + 2 ];\n\n\t\tpoint.set(\n\t\t\tCatmullRom( weight, p0.x, p1.x, p2.x, p3.x ),\n\t\t\tCatmullRom( weight, p0.y, p1.y, p2.y, p3.y )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.points = [];\n\n\t\tfor ( let i = 0, l = source.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = source.points[ i ];\n\n\t\t\tthis.points.push( point.clone() );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.points = [];\n\n\t\tfor ( let i = 0, l = this.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = this.points[ i ];\n\t\t\tdata.points.push( point.toArray() );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.points = [];\n\n\t\tfor ( let i = 0, l = json.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = json.points[ i ];\n\t\t\tthis.points.push( new Vector2().fromArray( point ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\nvar Curves = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\tArcCurve: ArcCurve,\n\tCatmullRomCurve3: CatmullRomCurve3,\n\tCubicBezierCurve: CubicBezierCurve,\n\tCubicBezierCurve3: CubicBezierCurve3,\n\tEllipseCurve: EllipseCurve,\n\tLineCurve: LineCurve,\n\tLineCurve3: LineCurve3,\n\tQuadraticBezierCurve: QuadraticBezierCurve,\n\tQuadraticBezierCurve3: QuadraticBezierCurve3,\n\tSplineCurve: SplineCurve\n});\n\n/**\n * A base class extending {@link Curve}. `CurvePath` is simply an\n * array of connected curves, but retains the API of a curve.\n *\n * @augments Curve\n */\nclass CurvePath extends Curve {\n\n\t/**\n\t * Constructs a new curve path.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.type = 'CurvePath';\n\n\t\t/**\n\t\t * An array of curves defining the\n\t\t * path.\n\t\t *\n\t\t * @type {Array<Curve>}\n\t\t */\n\t\tthis.curves = [];\n\n\t\t/**\n\t\t * Whether the path should automatically be closed\n\t\t * by a line curve.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.autoClose = false;\n\n\t}\n\n\t/**\n\t * Adds a curve to this curve path.\n\t *\n\t * @param {Curve} curve - The curve to add.\n\t */\n\tadd( curve ) {\n\n\t\tthis.curves.push( curve );\n\n\t}\n\n\t/**\n\t * Adds a line curve to close the path.\n\t *\n\t * @return {CurvePath} A reference to this curve path.\n\t */\n\tclosePath() {\n\n\t\t// Add a line curve if start and end of lines are not connected\n\t\tconst startPoint = this.curves[ 0 ].getPoint( 0 );\n\t\tconst endPoint = this.curves[ this.curves.length - 1 ].getPoint( 1 );\n\n\t\tif ( ! startPoint.equals( endPoint ) ) {\n\n\t\t\tconst lineType = ( startPoint.isVector2 === true ) ? 'LineCurve' : 'LineCurve3';\n\t\t\tthis.curves.push( new Curves[ lineType ]( endPoint, startPoint ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * This method returns a vector in 2D or 3D space (depending on the curve definitions)\n\t * for the given interpolation factor.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {(Vector2|Vector3)} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {?(Vector2|Vector3)} The position on the curve. It can be a 2D or 3D vector depending on the curve definition.\n\t */\n\tgetPoint( t, optionalTarget ) {\n\n\t\t// To get accurate point with reference to\n\t\t// entire path distance at time t,\n\t\t// following has to be done:\n\n\t\t// 1. Length of each sub path have to be known\n\t\t// 2. Locate and identify type of curve\n\t\t// 3. Get t for the curve\n\t\t// 4. Return curve.getPointAt(t')\n\n\t\tconst d = t * this.getLength();\n\t\tconst curveLengths = this.getCurveLengths();\n\t\tlet i = 0;\n\n\t\t// To think about boundaries points.\n\n\t\twhile ( i < curveLengths.length ) {\n\n\t\t\tif ( curveLengths[ i ] >= d ) {\n\n\t\t\t\tconst diff = curveLengths[ i ] - d;\n\t\t\t\tconst curve = this.curves[ i ];\n\n\t\t\t\tconst segmentLength = curve.getLength();\n\t\t\t\tconst u = segmentLength === 0 ? 0 : 1 - diff / segmentLength;\n\n\t\t\t\treturn curve.getPointAt( u, optionalTarget );\n\n\t\t\t}\n\n\t\t\ti ++;\n\n\t\t}\n\n\t\treturn null;\n\n\t\t// loop where sum != 0, sum > d , sum+1 <d\n\n\t}\n\n\tgetLength() {\n\n\t\t// We cannot use the default THREE.Curve getPoint() with getLength() because in\n\t\t// THREE.Curve, getLength() depends on getPoint() but in THREE.CurvePath\n\t\t// getPoint() depends on getLength\n\n\t\tconst lens = this.getCurveLengths();\n\t\treturn lens[ lens.length - 1 ];\n\n\t}\n\n\tupdateArcLengths() {\n\n\t\t// cacheLengths must be recalculated.\n\n\t\tthis.needsUpdate = true;\n\t\tthis.cacheLengths = null;\n\t\tthis.getCurveLengths();\n\n\t}\n\n\t/**\n\t * Returns list of cumulative curve lengths of the defined curves.\n\t *\n\t * @return {Array<number>} The curve lengths.\n\t */\n\tgetCurveLengths() {\n\n\t\t// Compute lengths and cache them\n\t\t// We cannot overwrite getLengths() because UtoT mapping uses it.\n\t\t// We use cache values if curves and cache array are same length\n\n\t\tif ( this.cacheLengths && this.cacheLengths.length === this.curves.length ) {\n\n\t\t\treturn this.cacheLengths;\n\n\t\t}\n\n\t\t// Get length of sub-curve\n\t\t// Push sums into cached array\n\n\t\tconst lengths = [];\n\t\tlet sums = 0;\n\n\t\tfor ( let i = 0, l = this.curves.length; i < l; i ++ ) {\n\n\t\t\tsums += this.curves[ i ].getLength();\n\t\t\tlengths.push( sums );\n\n\t\t}\n\n\t\tthis.cacheLengths = lengths;\n\n\t\treturn lengths;\n\n\t}\n\n\tgetSpacedPoints( divisions = 40 ) {\n\n\t\tconst points = [];\n\n\t\tfor ( let i = 0; i <= divisions; i ++ ) {\n\n\t\t\tpoints.push( this.getPoint( i / divisions ) );\n\n\t\t}\n\n\t\tif ( this.autoClose ) {\n\n\t\t\tpoints.push( points[ 0 ] );\n\n\t\t}\n\n\t\treturn points;\n\n\t}\n\n\tgetPoints( divisions = 12 ) {\n\n\t\tconst points = [];\n\t\tlet last;\n\n\t\tfor ( let i = 0, curves = this.curves; i < curves.length; i ++ ) {\n\n\t\t\tconst curve = curves[ i ];\n\t\t\tconst resolution = curve.isEllipseCurve ? divisions * 2\n\t\t\t\t: ( curve.isLineCurve || curve.isLineCurve3 ) ? 1\n\t\t\t\t\t: curve.isSplineCurve ? divisions * curve.points.length\n\t\t\t\t\t\t: divisions;\n\n\t\t\tconst pts = curve.getPoints( resolution );\n\n\t\t\tfor ( let j = 0; j < pts.length; j ++ ) {\n\n\t\t\t\tconst point = pts[ j ];\n\n\t\t\t\tif ( last && last.equals( point ) ) continue; // ensures no consecutive points are duplicates\n\n\t\t\t\tpoints.push( point );\n\t\t\t\tlast = point;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.autoClose && points.length > 1 && ! points[ points.length - 1 ].equals( points[ 0 ] ) ) {\n\n\t\t\tpoints.push( points[ 0 ] );\n\n\t\t}\n\n\t\treturn points;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.curves = [];\n\n\t\tfor ( let i = 0, l = source.curves.length; i < l; i ++ ) {\n\n\t\t\tconst curve = source.curves[ i ];\n\n\t\t\tthis.curves.push( curve.clone() );\n\n\t\t}\n\n\t\tthis.autoClose = source.autoClose;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.autoClose = this.autoClose;\n\t\tdata.curves = [];\n\n\t\tfor ( let i = 0, l = this.curves.length; i < l; i ++ ) {\n\n\t\t\tconst curve = this.curves[ i ];\n\t\t\tdata.curves.push( curve.toJSON() );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.autoClose = json.autoClose;\n\t\tthis.curves = [];\n\n\t\tfor ( let i = 0, l = json.curves.length; i < l; i ++ ) {\n\n\t\t\tconst curve = json.curves[ i ];\n\t\t\tthis.curves.push( new Curves[ curve.type ]().fromJSON( curve ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A 2D path representation. The class provides methods for creating paths\n * and contours of 2D shapes similar to the 2D Canvas API.\n *\n * ```js\n * const path = new THREE.Path();\n *\n * path.lineTo( 0, 0.8 );\n * path.quadraticCurveTo( 0, 1, 0.2, 1 );\n * path.lineTo( 1, 1 );\n *\n * const points = path.getPoints();\n *\n * const geometry = new THREE.BufferGeometry().setFromPoints( points );\n * const material = new THREE.LineBasicMaterial( { color: 0xffffff } );\n *\n * const line = new THREE.Line( geometry, material );\n * scene.add( line );\n * ```\n *\n * @augments CurvePath\n */\nclass Path extends CurvePath {\n\n\t/**\n\t * Constructs a new path.\n\t *\n\t * @param {Array<Vector2>} [points] - An array of 2D points defining the path.\n\t */\n\tconstructor( points ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'Path';\n\n\t\t/**\n\t\t * The current offset of the path. Any new curve added will start here.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.currentPoint = new Vector2();\n\n\t\tif ( points ) {\n\n\t\t\tthis.setFromPoints( points );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Creates a path from the given list of points. The points are added\n\t * to the path as instances of {@link LineCurve}.\n\t *\n\t * @param {Array<Vector2>} points - An array of 2D points.\n\t * @return {Path} A reference to this path.\n\t */\n\tsetFromPoints( points ) {\n\n\t\tthis.moveTo( points[ 0 ].x, points[ 0 ].y );\n\n\t\tfor ( let i = 1, l = points.length; i < l; i ++ ) {\n\n\t\t\tthis.lineTo( points[ i ].x, points[ i ].y );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Moves {@link Path#currentPoint} to the given point.\n\t *\n\t * @param {number} x - The x coordinate.\n\t * @param {number} y - The y coordinate.\n\t * @return {Path} A reference to this path.\n\t */\n\tmoveTo( x, y ) {\n\n\t\tthis.currentPoint.set( x, y ); // TODO consider referencing vectors instead of copying?\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an instance of {@link LineCurve} to the path by connecting\n\t * the current point with the given one.\n\t *\n\t * @param {number} x - The x coordinate of the end point.\n\t * @param {number} y - The y coordinate of the end point.\n\t * @return {Path} A reference to this path.\n\t */\n\tlineTo( x, y ) {\n\n\t\tconst curve = new LineCurve( this.currentPoint.clone(), new Vector2( x, y ) );\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.set( x, y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an instance of {@link QuadraticBezierCurve} to the path by connecting\n\t * the current point with the given one.\n\t *\n\t * @param {number} aCPx - The x coordinate of the control point.\n\t * @param {number} aCPy - The y coordinate of the control point.\n\t * @param {number} aX - The x coordinate of the end point.\n\t * @param {number} aY - The y coordinate of the end point.\n\t * @return {Path} A reference to this path.\n\t */\n\tquadraticCurveTo( aCPx, aCPy, aX, aY ) {\n\n\t\tconst curve = new QuadraticBezierCurve(\n\t\t\tthis.currentPoint.clone(),\n\t\t\tnew Vector2( aCPx, aCPy ),\n\t\t\tnew Vector2( aX, aY )\n\t\t);\n\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.set( aX, aY );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an instance of {@link CubicBezierCurve} to the path by connecting\n\t * the current point with the given one.\n\t *\n\t * @param {number} aCP1x - The x coordinate of the first control point.\n\t * @param {number} aCP1y - The y coordinate of the first control point.\n\t * @param {number} aCP2x - The x coordinate of the second control point.\n\t * @param {number} aCP2y - The y coordinate of the second control point.\n\t * @param {number} aX - The x coordinate of the end point.\n\t * @param {number} aY - The y coordinate of the end point.\n\t * @return {Path} A reference to this path.\n\t */\n\tbezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) {\n\n\t\tconst curve = new CubicBezierCurve(\n\t\t\tthis.currentPoint.clone(),\n\t\t\tnew Vector2( aCP1x, aCP1y ),\n\t\t\tnew Vector2( aCP2x, aCP2y ),\n\t\t\tnew Vector2( aX, aY )\n\t\t);\n\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.set( aX, aY );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an instance of {@link SplineCurve} to the path by connecting\n\t * the current point with the given list of points.\n\t *\n\t * @param {Array<Vector2>} pts - An array of points in 2D space.\n\t * @return {Path} A reference to this path.\n\t */\n\tsplineThru( pts ) {\n\n\t\tconst npts = [ this.currentPoint.clone() ].concat( pts );\n\n\t\tconst curve = new SplineCurve( npts );\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.copy( pts[ pts.length - 1 ] );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an arc as an instance of {@link EllipseCurve} to the path, positioned relative\n\t * to the current point.\n\t *\n\t * @param {number} [aX=0] - The x coordinate of the center of the arc offsetted from the previous curve.\n\t * @param {number} [aY=0] - The y coordinate of the center of the arc offsetted from the previous curve.\n\t * @param {number} [aRadius=1] - The radius of the arc.\n\t * @param {number} [aStartAngle=0] - The start angle in radians.\n\t * @param {number} [aEndAngle=Math.PI*2] - The end angle in radians.\n\t * @param {boolean} [aClockwise=false] - Whether to sweep the arc clockwise or not.\n\t * @return {Path} A reference to this path.\n\t */\n\tarc( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\tconst x0 = this.currentPoint.x;\n\t\tconst y0 = this.currentPoint.y;\n\n\t\tthis.absarc( aX + x0, aY + y0, aRadius,\n\t\t\taStartAngle, aEndAngle, aClockwise );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an absolutely positioned arc as an instance of {@link EllipseCurve} to the path.\n\t *\n\t * @param {number} [aX=0] - The x coordinate of the center of the arc.\n\t * @param {number} [aY=0] - The y coordinate of the center of the arc.\n\t * @param {number} [aRadius=1] - The radius of the arc.\n\t * @param {number} [aStartAngle=0] - The start angle in radians.\n\t * @param {number} [aEndAngle=Math.PI*2] - The end angle in radians.\n\t * @param {boolean} [aClockwise=false] - Whether to sweep the arc clockwise or not.\n\t * @return {Path} A reference to this path.\n\t */\n\tabsarc( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\tthis.absellipse( aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an ellipse as an instance of {@link EllipseCurve} to the path, positioned relative\n\t * to the current point\n\t *\n\t * @param {number} [aX=0] - The x coordinate of the center of the ellipse offsetted from the previous curve.\n\t * @param {number} [aY=0] - The y coordinate of the center of the ellipse offsetted from the previous curve.\n\t * @param {number} [xRadius=1] - The radius of the ellipse in the x axis.\n\t * @param {number} [yRadius=1] - The radius of the ellipse in the y axis.\n\t * @param {number} [aStartAngle=0] - The start angle in radians.\n\t * @param {number} [aEndAngle=Math.PI*2] - The end angle in radians.\n\t * @param {boolean} [aClockwise=false] - Whether to sweep the ellipse clockwise or not.\n\t * @param {number} [aRotation=0] - The rotation angle of the ellipse in radians, counterclockwise from the positive X axis.\n\t * @return {Path} A reference to this path.\n\t */\n\tellipse( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\t\tconst x0 = this.currentPoint.x;\n\t\tconst y0 = this.currentPoint.y;\n\n\t\tthis.absellipse( aX + x0, aY + y0, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an absolutely positioned ellipse as an instance of {@link EllipseCurve} to the path.\n\t *\n\t * @param {number} [aX=0] - The x coordinate of the absolute center of the ellipse.\n\t * @param {number} [aY=0] - The y coordinate of the absolute center of the ellipse.\n\t * @param {number} [xRadius=1] - The radius of the ellipse in the x axis.\n\t * @param {number} [yRadius=1] - The radius of the ellipse in the y axis.\n\t * @param {number} [aStartAngle=0] - The start angle in radians.\n\t * @param {number} [aEndAngle=Math.PI*2] - The end angle in radians.\n\t * @param {boolean} [aClockwise=false] - Whether to sweep the ellipse clockwise or not.\n\t * @param {number} [aRotation=0] - The rotation angle of the ellipse in radians, counterclockwise from the positive X axis.\n\t * @return {Path} A reference to this path.\n\t */\n\tabsellipse( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\t\tconst curve = new EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation );\n\n\t\tif ( this.curves.length > 0 ) {\n\n\t\t\t// if a previous curve is present, attempt to join\n\t\t\tconst firstPoint = curve.getPoint( 0 );\n\n\t\t\tif ( ! firstPoint.equals( this.currentPoint ) ) {\n\n\t\t\t\tthis.lineTo( firstPoint.x, firstPoint.y );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.curves.push( curve );\n\n\t\tconst lastPoint = curve.getPoint( 1 );\n\t\tthis.currentPoint.copy( lastPoint );\n\n\t\treturn this;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.currentPoint.copy( source.currentPoint );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.currentPoint = this.currentPoint.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.currentPoint.fromArray( json.currentPoint );\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * Defines an arbitrary 2d shape plane using paths with optional holes. It\n * can be used with {@link ExtrudeGeometry}, {@link ShapeGeometry}, to get\n * points, or to get triangulated faces.\n *\n * ```js\n * const heartShape = new THREE.Shape();\n *\n * heartShape.moveTo( 25, 25 );\n * heartShape.bezierCurveTo( 25, 25, 20, 0, 0, 0 );\n * heartShape.bezierCurveTo( - 30, 0, - 30, 35, - 30, 35 );\n * heartShape.bezierCurveTo( - 30, 55, - 10, 77, 25, 95 );\n * heartShape.bezierCurveTo( 60, 77, 80, 55, 80, 35 );\n * heartShape.bezierCurveTo( 80, 35, 80, 0, 50, 0 );\n * heartShape.bezierCurveTo( 35, 0, 25, 25, 25, 25 );\n *\n * const extrudeSettings = {\n * \tdepth: 8,\n * \tbevelEnabled: true,\n * \tbevelSegments: 2,\n * \tsteps: 2,\n * \tbevelSize: 1,\n * \tbevelThickness: 1\n * };\n *\n * const geometry = new THREE.ExtrudeGeometry( heartShape, extrudeSettings );\n * const mesh = new THREE.Mesh( geometry, new THREE.MeshBasicMaterial() );\n * ```\n *\n * @augments Path\n */\nclass Shape extends Path {\n\n\t/**\n\t * Constructs a new shape.\n\t *\n\t * @param {Array<Vector2>} [points] - An array of 2D points defining the shape.\n\t */\n\tconstructor( points ) {\n\n\t\tsuper( points );\n\n\t\t/**\n\t\t * The UUID of the shape.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.uuid = generateUUID();\n\n\t\tthis.type = 'Shape';\n\n\t\t/**\n\t\t * Defines the holes in the shape. Hole definitions must use the\n\t\t * opposite winding order (CW/CCW) than the outer shape.\n\t\t *\n\t\t * @type {Array<Path>}\n\t\t * @readonly\n\t\t */\n\t\tthis.holes = [];\n\n\t}\n\n\t/**\n\t * Returns an array representing each contour of the holes\n\t * as a list of 2D points.\n\t *\n\t * @param {number} divisions - The fineness of the result.\n\t * @return {Array<Array<Vector2>>} The holes as a series of 2D points.\n\t */\n\tgetPointsHoles( divisions ) {\n\n\t\tconst holesPts = [];\n\n\t\tfor ( let i = 0, l = this.holes.length; i < l; i ++ ) {\n\n\t\t\tholesPts[ i ] = this.holes[ i ].getPoints( divisions );\n\n\t\t}\n\n\t\treturn holesPts;\n\n\t}\n\n\t// get points of shape and holes (keypoints based on segments parameter)\n\n\t/**\n\t * Returns an object that holds contour data for the shape and its holes as\n\t * arrays of 2D points.\n\t *\n\t * @param {number} divisions - The fineness of the result.\n\t * @return {{shape:Array<Vector2>,holes:Array<Array<Vector2>>}} An object with contour data.\n\t */\n\textractPoints( divisions ) {\n\n\t\treturn {\n\n\t\t\tshape: this.getPoints( divisions ),\n\t\t\tholes: this.getPointsHoles( divisions )\n\n\t\t};\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.holes = [];\n\n\t\tfor ( let i = 0, l = source.holes.length; i < l; i ++ ) {\n\n\t\t\tconst hole = source.holes[ i ];\n\n\t\t\tthis.holes.push( hole.clone() );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.uuid = this.uuid;\n\t\tdata.holes = [];\n\n\t\tfor ( let i = 0, l = this.holes.length; i < l; i ++ ) {\n\n\t\t\tconst hole = this.holes[ i ];\n\t\t\tdata.holes.push( hole.toJSON() );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.uuid = json.uuid;\n\t\tthis.holes = [];\n\n\t\tfor ( let i = 0, l = json.holes.length; i < l; i ++ ) {\n\n\t\t\tconst hole = json.holes[ i ];\n\t\t\tthis.holes.push( new Path().fromJSON( hole ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\n/* eslint-disable */\n// copy of mapbox/earcut version 3.0.2\n// https://github.com/mapbox/earcut/tree/v3.0.2\n\nfunction earcut(data, holeIndices, dim = 2) {\n\n    const hasHoles = holeIndices && holeIndices.length;\n    const outerLen = hasHoles ? holeIndices[0] * dim : data.length;\n    let outerNode = linkedList(data, 0, outerLen, dim, true);\n    const triangles = [];\n\n    if (!outerNode || outerNode.next === outerNode.prev) return triangles;\n\n    let minX, minY, invSize;\n\n    if (hasHoles) outerNode = eliminateHoles(data, holeIndices, outerNode, dim);\n\n    // if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox\n    if (data.length > 80 * dim) {\n        minX = data[0];\n        minY = data[1];\n        let maxX = minX;\n        let maxY = minY;\n\n        for (let i = dim; i < outerLen; i += dim) {\n            const x = data[i];\n            const y = data[i + 1];\n            if (x < minX) minX = x;\n            if (y < minY) minY = y;\n            if (x > maxX) maxX = x;\n            if (y > maxY) maxY = y;\n        }\n\n        // minX, minY and invSize are later used to transform coords into integers for z-order calculation\n        invSize = Math.max(maxX - minX, maxY - minY);\n        invSize = invSize !== 0 ? 32767 / invSize : 0;\n    }\n\n    earcutLinked(outerNode, triangles, dim, minX, minY, invSize, 0);\n\n    return triangles;\n}\n\n// create a circular doubly linked list from polygon points in the specified winding order\nfunction linkedList(data, start, end, dim, clockwise) {\n    let last;\n\n    if (clockwise === (signedArea(data, start, end, dim) > 0)) {\n        for (let i = start; i < end; i += dim) last = insertNode(i / dim | 0, data[i], data[i + 1], last);\n    } else {\n        for (let i = end - dim; i >= start; i -= dim) last = insertNode(i / dim | 0, data[i], data[i + 1], last);\n    }\n\n    if (last && equals(last, last.next)) {\n        removeNode(last);\n        last = last.next;\n    }\n\n    return last;\n}\n\n// eliminate colinear or duplicate points\nfunction filterPoints(start, end) {\n    if (!start) return start;\n    if (!end) end = start;\n\n    let p = start,\n        again;\n    do {\n        again = false;\n\n        if (!p.steiner && (equals(p, p.next) || area(p.prev, p, p.next) === 0)) {\n            removeNode(p);\n            p = end = p.prev;\n            if (p === p.next) break;\n            again = true;\n\n        } else {\n            p = p.next;\n        }\n    } while (again || p !== end);\n\n    return end;\n}\n\n// main ear slicing loop which triangulates a polygon (given as a linked list)\nfunction earcutLinked(ear, triangles, dim, minX, minY, invSize, pass) {\n    if (!ear) return;\n\n    // interlink polygon nodes in z-order\n    if (!pass && invSize) indexCurve(ear, minX, minY, invSize);\n\n    let stop = ear;\n\n    // iterate through ears, slicing them one by one\n    while (ear.prev !== ear.next) {\n        const prev = ear.prev;\n        const next = ear.next;\n\n        if (invSize ? isEarHashed(ear, minX, minY, invSize) : isEar(ear)) {\n            triangles.push(prev.i, ear.i, next.i); // cut off the triangle\n\n            removeNode(ear);\n\n            // skipping the next vertex leads to less sliver triangles\n            ear = next.next;\n            stop = next.next;\n\n            continue;\n        }\n\n        ear = next;\n\n        // if we looped through the whole remaining polygon and can't find any more ears\n        if (ear === stop) {\n            // try filtering points and slicing again\n            if (!pass) {\n                earcutLinked(filterPoints(ear), triangles, dim, minX, minY, invSize, 1);\n\n            // if this didn't work, try curing all small self-intersections locally\n            } else if (pass === 1) {\n                ear = cureLocalIntersections(filterPoints(ear), triangles);\n                earcutLinked(ear, triangles, dim, minX, minY, invSize, 2);\n\n            // as a last resort, try splitting the remaining polygon into two\n            } else if (pass === 2) {\n                splitEarcut(ear, triangles, dim, minX, minY, invSize);\n            }\n\n            break;\n        }\n    }\n}\n\n// check whether a polygon node forms a valid ear with adjacent nodes\nfunction isEar(ear) {\n    const a = ear.prev,\n        b = ear,\n        c = ear.next;\n\n    if (area(a, b, c) >= 0) return false; // reflex, can't be an ear\n\n    // now make sure we don't have other points inside the potential ear\n    const ax = a.x, bx = b.x, cx = c.x, ay = a.y, by = b.y, cy = c.y;\n\n    // triangle bbox\n    const x0 = Math.min(ax, bx, cx),\n        y0 = Math.min(ay, by, cy),\n        x1 = Math.max(ax, bx, cx),\n        y1 = Math.max(ay, by, cy);\n\n    let p = c.next;\n    while (p !== a) {\n        if (p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 &&\n            pointInTriangleExceptFirst(ax, ay, bx, by, cx, cy, p.x, p.y) &&\n            area(p.prev, p, p.next) >= 0) return false;\n        p = p.next;\n    }\n\n    return true;\n}\n\nfunction isEarHashed(ear, minX, minY, invSize) {\n    const a = ear.prev,\n        b = ear,\n        c = ear.next;\n\n    if (area(a, b, c) >= 0) return false; // reflex, can't be an ear\n\n    const ax = a.x, bx = b.x, cx = c.x, ay = a.y, by = b.y, cy = c.y;\n\n    // triangle bbox\n    const x0 = Math.min(ax, bx, cx),\n        y0 = Math.min(ay, by, cy),\n        x1 = Math.max(ax, bx, cx),\n        y1 = Math.max(ay, by, cy);\n\n    // z-order range for the current triangle bbox;\n    const minZ = zOrder(x0, y0, minX, minY, invSize),\n        maxZ = zOrder(x1, y1, minX, minY, invSize);\n\n    let p = ear.prevZ,\n        n = ear.nextZ;\n\n    // look for points inside the triangle in both directions\n    while (p && p.z >= minZ && n && n.z <= maxZ) {\n        if (p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 && p !== a && p !== c &&\n            pointInTriangleExceptFirst(ax, ay, bx, by, cx, cy, p.x, p.y) && area(p.prev, p, p.next) >= 0) return false;\n        p = p.prevZ;\n\n        if (n.x >= x0 && n.x <= x1 && n.y >= y0 && n.y <= y1 && n !== a && n !== c &&\n            pointInTriangleExceptFirst(ax, ay, bx, by, cx, cy, n.x, n.y) && area(n.prev, n, n.next) >= 0) return false;\n        n = n.nextZ;\n    }\n\n    // look for remaining points in decreasing z-order\n    while (p && p.z >= minZ) {\n        if (p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 && p !== a && p !== c &&\n            pointInTriangleExceptFirst(ax, ay, bx, by, cx, cy, p.x, p.y) && area(p.prev, p, p.next) >= 0) return false;\n        p = p.prevZ;\n    }\n\n    // look for remaining points in increasing z-order\n    while (n && n.z <= maxZ) {\n        if (n.x >= x0 && n.x <= x1 && n.y >= y0 && n.y <= y1 && n !== a && n !== c &&\n            pointInTriangleExceptFirst(ax, ay, bx, by, cx, cy, n.x, n.y) && area(n.prev, n, n.next) >= 0) return false;\n        n = n.nextZ;\n    }\n\n    return true;\n}\n\n// go through all polygon nodes and cure small local self-intersections\nfunction cureLocalIntersections(start, triangles) {\n    let p = start;\n    do {\n        const a = p.prev,\n            b = p.next.next;\n\n        if (!equals(a, b) && intersects(a, p, p.next, b) && locallyInside(a, b) && locallyInside(b, a)) {\n\n            triangles.push(a.i, p.i, b.i);\n\n            // remove two nodes involved\n            removeNode(p);\n            removeNode(p.next);\n\n            p = start = b;\n        }\n        p = p.next;\n    } while (p !== start);\n\n    return filterPoints(p);\n}\n\n// try splitting polygon into two and triangulate them independently\nfunction splitEarcut(start, triangles, dim, minX, minY, invSize) {\n    // look for a valid diagonal that divides the polygon into two\n    let a = start;\n    do {\n        let b = a.next.next;\n        while (b !== a.prev) {\n            if (a.i !== b.i && isValidDiagonal(a, b)) {\n                // split the polygon in two by the diagonal\n                let c = splitPolygon(a, b);\n\n                // filter colinear points around the cuts\n                a = filterPoints(a, a.next);\n                c = filterPoints(c, c.next);\n\n                // run earcut on each half\n                earcutLinked(a, triangles, dim, minX, minY, invSize, 0);\n                earcutLinked(c, triangles, dim, minX, minY, invSize, 0);\n                return;\n            }\n            b = b.next;\n        }\n        a = a.next;\n    } while (a !== start);\n}\n\n// link every hole into the outer loop, producing a single-ring polygon without holes\nfunction eliminateHoles(data, holeIndices, outerNode, dim) {\n    const queue = [];\n\n    for (let i = 0, len = holeIndices.length; i < len; i++) {\n        const start = holeIndices[i] * dim;\n        const end = i < len - 1 ? holeIndices[i + 1] * dim : data.length;\n        const list = linkedList(data, start, end, dim, false);\n        if (list === list.next) list.steiner = true;\n        queue.push(getLeftmost(list));\n    }\n\n    queue.sort(compareXYSlope);\n\n    // process holes from left to right\n    for (let i = 0; i < queue.length; i++) {\n        outerNode = eliminateHole(queue[i], outerNode);\n    }\n\n    return outerNode;\n}\n\nfunction compareXYSlope(a, b) {\n    let result = a.x - b.x;\n    // when the left-most point of 2 holes meet at a vertex, sort the holes counterclockwise so that when we find\n    // the bridge to the outer shell is always the point that they meet at.\n    if (result === 0) {\n        result = a.y - b.y;\n        if (result === 0) {\n            const aSlope = (a.next.y - a.y) / (a.next.x - a.x);\n            const bSlope = (b.next.y - b.y) / (b.next.x - b.x);\n            result = aSlope - bSlope;\n        }\n    }\n    return result;\n}\n\n// find a bridge between vertices that connects hole with an outer ring and link it\nfunction eliminateHole(hole, outerNode) {\n    const bridge = findHoleBridge(hole, outerNode);\n    if (!bridge) {\n        return outerNode;\n    }\n\n    const bridgeReverse = splitPolygon(bridge, hole);\n\n    // filter collinear points around the cuts\n    filterPoints(bridgeReverse, bridgeReverse.next);\n    return filterPoints(bridge, bridge.next);\n}\n\n// David Eberly's algorithm for finding a bridge between hole and outer polygon\nfunction findHoleBridge(hole, outerNode) {\n    let p = outerNode;\n    const hx = hole.x;\n    const hy = hole.y;\n    let qx = -Infinity;\n    let m;\n\n    // find a segment intersected by a ray from the hole's leftmost point to the left;\n    // segment's endpoint with lesser x will be potential connection point\n    // unless they intersect at a vertex, then choose the vertex\n    if (equals(hole, p)) return p;\n    do {\n        if (equals(hole, p.next)) return p.next;\n        else if (hy <= p.y && hy >= p.next.y && p.next.y !== p.y) {\n            const x = p.x + (hy - p.y) * (p.next.x - p.x) / (p.next.y - p.y);\n            if (x <= hx && x > qx) {\n                qx = x;\n                m = p.x < p.next.x ? p : p.next;\n                if (x === hx) return m; // hole touches outer segment; pick leftmost endpoint\n            }\n        }\n        p = p.next;\n    } while (p !== outerNode);\n\n    if (!m) return null;\n\n    // look for points inside the triangle of hole point, segment intersection and endpoint;\n    // if there are no points found, we have a valid connection;\n    // otherwise choose the point of the minimum angle with the ray as connection point\n\n    const stop = m;\n    const mx = m.x;\n    const my = m.y;\n    let tanMin = Infinity;\n\n    p = m;\n\n    do {\n        if (hx >= p.x && p.x >= mx && hx !== p.x &&\n                pointInTriangle(hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y)) {\n\n            const tan = Math.abs(hy - p.y) / (hx - p.x); // tangential\n\n            if (locallyInside(p, hole) &&\n                (tan < tanMin || (tan === tanMin && (p.x > m.x || (p.x === m.x && sectorContainsSector(m, p)))))) {\n                m = p;\n                tanMin = tan;\n            }\n        }\n\n        p = p.next;\n    } while (p !== stop);\n\n    return m;\n}\n\n// whether sector in vertex m contains sector in vertex p in the same coordinates\nfunction sectorContainsSector(m, p) {\n    return area(m.prev, m, p.prev) < 0 && area(p.next, m, m.next) < 0;\n}\n\n// interlink polygon nodes in z-order\nfunction indexCurve(start, minX, minY, invSize) {\n    let p = start;\n    do {\n        if (p.z === 0) p.z = zOrder(p.x, p.y, minX, minY, invSize);\n        p.prevZ = p.prev;\n        p.nextZ = p.next;\n        p = p.next;\n    } while (p !== start);\n\n    p.prevZ.nextZ = null;\n    p.prevZ = null;\n\n    sortLinked(p);\n}\n\n// Simon Tatham's linked list merge sort algorithm\n// http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html\nfunction sortLinked(list) {\n    let numMerges;\n    let inSize = 1;\n\n    do {\n        let p = list;\n        let e;\n        list = null;\n        let tail = null;\n        numMerges = 0;\n\n        while (p) {\n            numMerges++;\n            let q = p;\n            let pSize = 0;\n            for (let i = 0; i < inSize; i++) {\n                pSize++;\n                q = q.nextZ;\n                if (!q) break;\n            }\n            let qSize = inSize;\n\n            while (pSize > 0 || (qSize > 0 && q)) {\n\n                if (pSize !== 0 && (qSize === 0 || !q || p.z <= q.z)) {\n                    e = p;\n                    p = p.nextZ;\n                    pSize--;\n                } else {\n                    e = q;\n                    q = q.nextZ;\n                    qSize--;\n                }\n\n                if (tail) tail.nextZ = e;\n                else list = e;\n\n                e.prevZ = tail;\n                tail = e;\n            }\n\n            p = q;\n        }\n\n        tail.nextZ = null;\n        inSize *= 2;\n\n    } while (numMerges > 1);\n\n    return list;\n}\n\n// z-order of a point given coords and inverse of the longer side of data bbox\nfunction zOrder(x, y, minX, minY, invSize) {\n    // coords are transformed into non-negative 15-bit integer range\n    x = (x - minX) * invSize | 0;\n    y = (y - minY) * invSize | 0;\n\n    x = (x | (x << 8)) & 0x00FF00FF;\n    x = (x | (x << 4)) & 0x0F0F0F0F;\n    x = (x | (x << 2)) & 0x33333333;\n    x = (x | (x << 1)) & 0x55555555;\n\n    y = (y | (y << 8)) & 0x00FF00FF;\n    y = (y | (y << 4)) & 0x0F0F0F0F;\n    y = (y | (y << 2)) & 0x33333333;\n    y = (y | (y << 1)) & 0x55555555;\n\n    return x | (y << 1);\n}\n\n// find the leftmost node of a polygon ring\nfunction getLeftmost(start) {\n    let p = start,\n        leftmost = start;\n    do {\n        if (p.x < leftmost.x || (p.x === leftmost.x && p.y < leftmost.y)) leftmost = p;\n        p = p.next;\n    } while (p !== start);\n\n    return leftmost;\n}\n\n// check if a point lies within a convex triangle\nfunction pointInTriangle(ax, ay, bx, by, cx, cy, px, py) {\n    return (cx - px) * (ay - py) >= (ax - px) * (cy - py) &&\n           (ax - px) * (by - py) >= (bx - px) * (ay - py) &&\n           (bx - px) * (cy - py) >= (cx - px) * (by - py);\n}\n\n// check if a point lies within a convex triangle but false if its equal to the first point of the triangle\nfunction pointInTriangleExceptFirst(ax, ay, bx, by, cx, cy, px, py) {\n    return !(ax === px && ay === py) && pointInTriangle(ax, ay, bx, by, cx, cy, px, py);\n}\n\n// check if a diagonal between two polygon nodes is valid (lies in polygon interior)\nfunction isValidDiagonal(a, b) {\n    return a.next.i !== b.i && a.prev.i !== b.i && !intersectsPolygon(a, b) && // doesn't intersect other edges\n           (locallyInside(a, b) && locallyInside(b, a) && middleInside(a, b) && // locally visible\n            (area(a.prev, a, b.prev) || area(a, b.prev, b)) || // does not create opposite-facing sectors\n            equals(a, b) && area(a.prev, a, a.next) > 0 && area(b.prev, b, b.next) > 0); // special zero-length case\n}\n\n// signed area of a triangle\nfunction area(p, q, r) {\n    return (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y);\n}\n\n// check if two points are equal\nfunction equals(p1, p2) {\n    return p1.x === p2.x && p1.y === p2.y;\n}\n\n// check if two segments intersect\nfunction intersects(p1, q1, p2, q2) {\n    const o1 = sign(area(p1, q1, p2));\n    const o2 = sign(area(p1, q1, q2));\n    const o3 = sign(area(p2, q2, p1));\n    const o4 = sign(area(p2, q2, q1));\n\n    if (o1 !== o2 && o3 !== o4) return true; // general case\n\n    if (o1 === 0 && onSegment(p1, p2, q1)) return true; // p1, q1 and p2 are collinear and p2 lies on p1q1\n    if (o2 === 0 && onSegment(p1, q2, q1)) return true; // p1, q1 and q2 are collinear and q2 lies on p1q1\n    if (o3 === 0 && onSegment(p2, p1, q2)) return true; // p2, q2 and p1 are collinear and p1 lies on p2q2\n    if (o4 === 0 && onSegment(p2, q1, q2)) return true; // p2, q2 and q1 are collinear and q1 lies on p2q2\n\n    return false;\n}\n\n// for collinear points p, q, r, check if point q lies on segment pr\nfunction onSegment(p, q, r) {\n    return q.x <= Math.max(p.x, r.x) && q.x >= Math.min(p.x, r.x) && q.y <= Math.max(p.y, r.y) && q.y >= Math.min(p.y, r.y);\n}\n\nfunction sign(num) {\n    return num > 0 ? 1 : num < 0 ? -1 : 0;\n}\n\n// check if a polygon diagonal intersects any polygon segments\nfunction intersectsPolygon(a, b) {\n    let p = a;\n    do {\n        if (p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i &&\n                intersects(p, p.next, a, b)) return true;\n        p = p.next;\n    } while (p !== a);\n\n    return false;\n}\n\n// check if a polygon diagonal is locally inside the polygon\nfunction locallyInside(a, b) {\n    return area(a.prev, a, a.next) < 0 ?\n        area(a, b, a.next) >= 0 && area(a, a.prev, b) >= 0 :\n        area(a, b, a.prev) < 0 || area(a, a.next, b) < 0;\n}\n\n// check if the middle point of a polygon diagonal is inside the polygon\nfunction middleInside(a, b) {\n    let p = a;\n    let inside = false;\n    const px = (a.x + b.x) / 2;\n    const py = (a.y + b.y) / 2;\n    do {\n        if (((p.y > py) !== (p.next.y > py)) && p.next.y !== p.y &&\n                (px < (p.next.x - p.x) * (py - p.y) / (p.next.y - p.y) + p.x))\n            inside = !inside;\n        p = p.next;\n    } while (p !== a);\n\n    return inside;\n}\n\n// link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two;\n// if one belongs to the outer ring and another to a hole, it merges it into a single ring\nfunction splitPolygon(a, b) {\n    const a2 = createNode(a.i, a.x, a.y),\n        b2 = createNode(b.i, b.x, b.y),\n        an = a.next,\n        bp = b.prev;\n\n    a.next = b;\n    b.prev = a;\n\n    a2.next = an;\n    an.prev = a2;\n\n    b2.next = a2;\n    a2.prev = b2;\n\n    bp.next = b2;\n    b2.prev = bp;\n\n    return b2;\n}\n\n// create a node and optionally link it with previous one (in a circular doubly linked list)\nfunction insertNode(i, x, y, last) {\n    const p = createNode(i, x, y);\n\n    if (!last) {\n        p.prev = p;\n        p.next = p;\n\n    } else {\n        p.next = last.next;\n        p.prev = last;\n        last.next.prev = p;\n        last.next = p;\n    }\n    return p;\n}\n\nfunction removeNode(p) {\n    p.next.prev = p.prev;\n    p.prev.next = p.next;\n\n    if (p.prevZ) p.prevZ.nextZ = p.nextZ;\n    if (p.nextZ) p.nextZ.prevZ = p.prevZ;\n}\n\nfunction createNode(i, x, y) {\n    return {\n        i, // vertex index in coordinates array\n        x, y, // vertex coordinates\n        prev: null, // previous and next vertex nodes in a polygon ring\n        next: null,\n        z: 0, // z-order curve value\n        prevZ: null, // previous and next nodes in z-order\n        nextZ: null,\n        steiner: false // indicates whether this is a steiner point\n    };\n}\n\nfunction signedArea(data, start, end, dim) {\n    let sum = 0;\n    for (let i = start, j = end - dim; i < end; i += dim) {\n        sum += (data[j] - data[i]) * (data[i + 1] + data[j + 1]);\n        j = i;\n    }\n    return sum;\n}\n\n/**\n * An implementation of the earcut polygon triangulation algorithm.\n * The code is a port of [mapbox/earcut](https://github.com/mapbox/earcut).\n *\n * @see https://github.com/mapbox/earcut\n */\nclass Earcut {\n\n\t/**\n\t * Triangulates the given shape definition by returning an array of triangles.\n\t *\n\t * @param {Array<number>} data - An array with 2D points.\n\t * @param {Array<number>} holeIndices - An array with indices defining holes.\n\t * @param {number} [dim=2] - The number of coordinates per vertex in the input array.\n\t * @return {Array<number>} An array representing the triangulated faces. Each face is defined by three consecutive numbers\n\t * representing vertex indices.\n\t */\n\tstatic triangulate( data, holeIndices, dim = 2 ) {\n\n\t\treturn earcut( data, holeIndices, dim );\n\n\t}\n\n}\n\n/**\n * A class containing utility functions for shapes.\n *\n * @hideconstructor\n */\nclass ShapeUtils {\n\n\t/**\n\t * Calculate area of a ( 2D ) contour polygon.\n\t *\n\t * @param {Array<Vector2>} contour - An array of 2D points.\n\t * @return {number} The area.\n\t */\n\tstatic area( contour ) {\n\n\t\tconst n = contour.length;\n\t\tlet a = 0.0;\n\n\t\tfor ( let p = n - 1, q = 0; q < n; p = q ++ ) {\n\n\t\t\ta += contour[ p ].x * contour[ q ].y - contour[ q ].x * contour[ p ].y;\n\n\t\t}\n\n\t\treturn a * 0.5;\n\n\t}\n\n\t/**\n\t * Returns `true` if the given contour uses a clockwise winding order.\n\t *\n\t * @param {Array<Vector2>} pts - An array of 2D points defining a polygon.\n\t * @return {boolean} Whether the given contour uses a clockwise winding order or not.\n\t */\n\tstatic isClockWise( pts ) {\n\n\t\treturn ShapeUtils.area( pts ) < 0;\n\n\t}\n\n\t/**\n\t * Triangulates the given shape definition.\n\t *\n\t * @param {Array<Vector2>} contour - An array of 2D points defining the contour.\n\t * @param {Array<Array<Vector2>>} holes - An array that holds arrays of 2D points defining the holes.\n\t * @return {Array<Array<number>>} An array that holds for each face definition an array with three indices.\n\t */\n\tstatic triangulateShape( contour, holes ) {\n\n\t\tconst vertices = []; // flat array of vertices like [ x0,y0, x1,y1, x2,y2, ... ]\n\t\tconst holeIndices = []; // array of hole indices\n\t\tconst faces = []; // final array of vertex indices like [ [ a,b,d ], [ b,c,d ] ]\n\n\t\tremoveDupEndPts( contour );\n\t\taddContour( vertices, contour );\n\n\t\t//\n\n\t\tlet holeIndex = contour.length;\n\n\t\tholes.forEach( removeDupEndPts );\n\n\t\tfor ( let i = 0; i < holes.length; i ++ ) {\n\n\t\t\tholeIndices.push( holeIndex );\n\t\t\tholeIndex += holes[ i ].length;\n\t\t\taddContour( vertices, holes[ i ] );\n\n\t\t}\n\n\t\t//\n\n\t\tconst triangles = Earcut.triangulate( vertices, holeIndices );\n\n\t\t//\n\n\t\tfor ( let i = 0; i < triangles.length; i += 3 ) {\n\n\t\t\tfaces.push( triangles.slice( i, i + 3 ) );\n\n\t\t}\n\n\t\treturn faces;\n\n\t}\n\n}\n\nfunction removeDupEndPts( points ) {\n\n\tconst l = points.length;\n\n\tif ( l > 2 && points[ l - 1 ].equals( points[ 0 ] ) ) {\n\n\t\tpoints.pop();\n\n\t}\n\n}\n\nfunction addContour( vertices, contour ) {\n\n\tfor ( let i = 0; i < contour.length; i ++ ) {\n\n\t\tvertices.push( contour[ i ].x );\n\t\tvertices.push( contour[ i ].y );\n\n\t}\n\n}\n\n/**\n * Creates extruded geometry from a path shape.\n *\n * ```js\n * const length = 12, width = 8;\n *\n * const shape = new THREE.Shape();\n * shape.moveTo( 0,0 );\n * shape.lineTo( 0, width );\n * shape.lineTo( length, width );\n * shape.lineTo( length, 0 );\n * shape.lineTo( 0, 0 );\n *\n * const geometry = new THREE.ExtrudeGeometry( shape );\n * const material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );\n * const mesh = new THREE.Mesh( geometry, material ) ;\n * scene.add( mesh );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#ExtrudeGeometry\n */\nclass ExtrudeGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new extrude geometry.\n\t *\n\t * @param {Shape|Array<Shape>} [shapes] - A shape or an array of shapes.\n\t * @param {ExtrudeGeometry~Options} [options] - The extrude settings.\n\t */\n\tconstructor( shapes = new Shape( [ new Vector2( 0.5, 0.5 ), new Vector2( -0.5, 0.5 ), new Vector2( -0.5, -0.5 ), new Vector2( 0.5, -0.5 ) ] ), options = {} ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'ExtrudeGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tshapes: shapes,\n\t\t\toptions: options\n\t\t};\n\n\t\tshapes = Array.isArray( shapes ) ? shapes : [ shapes ];\n\n\t\tconst scope = this;\n\n\t\tconst verticesArray = [];\n\t\tconst uvArray = [];\n\n\t\tfor ( let i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\tconst shape = shapes[ i ];\n\t\t\taddShape( shape );\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( verticesArray, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvArray, 2 ) );\n\n\t\tthis.computeVertexNormals();\n\n\t\t// functions\n\n\t\tfunction addShape( shape ) {\n\n\t\t\tconst placeholder = [];\n\n\t\t\t// options\n\n\t\t\tconst curveSegments = options.curveSegments !== undefined ? options.curveSegments : 12;\n\t\t\tconst steps = options.steps !== undefined ? options.steps : 1;\n\t\t\tconst depth = options.depth !== undefined ? options.depth : 1;\n\n\t\t\tlet bevelEnabled = options.bevelEnabled !== undefined ? options.bevelEnabled : true;\n\t\t\tlet bevelThickness = options.bevelThickness !== undefined ? options.bevelThickness : 0.2;\n\t\t\tlet bevelSize = options.bevelSize !== undefined ? options.bevelSize : bevelThickness - 0.1;\n\t\t\tlet bevelOffset = options.bevelOffset !== undefined ? options.bevelOffset : 0;\n\t\t\tlet bevelSegments = options.bevelSegments !== undefined ? options.bevelSegments : 3;\n\n\t\t\tconst extrudePath = options.extrudePath;\n\n\t\t\tconst uvgen = options.UVGenerator !== undefined ? options.UVGenerator : WorldUVGenerator;\n\n\t\t\t//\n\n\t\t\tlet extrudePts, extrudeByPath = false;\n\t\t\tlet splineTube, binormal, normal, position2;\n\n\t\t\tif ( extrudePath ) {\n\n\t\t\t\textrudePts = extrudePath.getSpacedPoints( steps );\n\n\t\t\t\textrudeByPath = true;\n\t\t\t\tbevelEnabled = false; // bevels not supported for path extrusion\n\n\t\t\t\t// SETUP TNB variables\n\n\t\t\t\t// TODO1 - have a .isClosed in spline?\n\n\t\t\t\tsplineTube = extrudePath.computeFrenetFrames( steps, false );\n\n\t\t\t\t// log(splineTube, 'splineTube', splineTube.normals.length, 'steps', steps, 'extrudePts', extrudePts.length);\n\n\t\t\t\tbinormal = new Vector3();\n\t\t\t\tnormal = new Vector3();\n\t\t\t\tposition2 = new Vector3();\n\n\t\t\t}\n\n\t\t\t// Safeguards if bevels are not enabled\n\n\t\t\tif ( ! bevelEnabled ) {\n\n\t\t\t\tbevelSegments = 0;\n\t\t\t\tbevelThickness = 0;\n\t\t\t\tbevelSize = 0;\n\t\t\t\tbevelOffset = 0;\n\n\t\t\t}\n\n\t\t\t// Variables initialization\n\n\t\t\tconst shapePoints = shape.extractPoints( curveSegments );\n\n\t\t\tlet vertices = shapePoints.shape;\n\t\t\tconst holes = shapePoints.holes;\n\n\t\t\tconst reverse = ! ShapeUtils.isClockWise( vertices );\n\n\t\t\tif ( reverse ) {\n\n\t\t\t\tvertices = vertices.reverse();\n\n\t\t\t\t// Maybe we should also check if holes are in the opposite direction, just to be safe ...\n\n\t\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\t\tconst ahole = holes[ h ];\n\n\t\t\t\t\tif ( ShapeUtils.isClockWise( ahole ) ) {\n\n\t\t\t\t\t\tholes[ h ] = ahole.reverse();\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t/**Merges index-adjacent points that are within a threshold distance of each other. Array is modified in-place. Threshold distance is empirical, and scaled based on the magnitude of point coordinates.\n\t\t\t * @param {Array<Vector2>} points\n\t\t\t*/\n\t\t\tfunction mergeOverlappingPoints( points ) {\n\n\t\t\t\tconst THRESHOLD = 1e-10;\n\t\t\t\tconst THRESHOLD_SQ = THRESHOLD * THRESHOLD;\n\t\t\t\tlet prevPos = points[ 0 ];\n\t\t\t\tfor ( let i = 1; i <= points.length; i ++ ) {\n\n\t\t\t\t\tconst currentIndex = i % points.length;\n\t\t\t\t\tconst currentPos = points[ currentIndex ];\n\t\t\t\t\tconst dx = currentPos.x - prevPos.x;\n\t\t\t\t\tconst dy = currentPos.y - prevPos.y;\n\t\t\t\t\tconst distSq = dx * dx + dy * dy;\n\n\t\t\t\t\tconst scalingFactorSqrt = Math.max(\n\t\t\t\t\t\tMath.abs( currentPos.x ),\n\t\t\t\t\t\tMath.abs( currentPos.y ),\n\t\t\t\t\t\tMath.abs( prevPos.x ),\n\t\t\t\t\t\tMath.abs( prevPos.y )\n\t\t\t\t\t);\n\t\t\t\t\tconst thresholdSqScaled = THRESHOLD_SQ * scalingFactorSqrt * scalingFactorSqrt;\n\t\t\t\t\tif ( distSq <= thresholdSqScaled ) {\n\n\t\t\t\t\t\tpoints.splice( currentIndex, 1 );\n\t\t\t\t\t\ti --;\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tprevPos = currentPos;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tmergeOverlappingPoints( vertices );\n\t\t\tholes.forEach( mergeOverlappingPoints );\n\n\t\t\tconst numHoles = holes.length;\n\n\t\t\t/* Vertices */\n\n\t\t\tconst contour = vertices; // vertices has all points but contour has only points of circumference\n\n\t\t\tfor ( let h = 0; h < numHoles; h ++ ) {\n\n\t\t\t\tconst ahole = holes[ h ];\n\n\t\t\t\tvertices = vertices.concat( ahole );\n\n\t\t\t}\n\n\n\t\t\tfunction scalePt2( pt, vec, size ) {\n\n\t\t\t\tif ( ! vec ) error( 'ExtrudeGeometry: vec does not exist' );\n\n\t\t\t\treturn pt.clone().addScaledVector( vec, size );\n\n\t\t\t}\n\n\t\t\tconst vlen = vertices.length;\n\n\n\t\t\t// Find directions for point movement\n\n\n\t\t\tfunction getBevelVec( inPt, inPrev, inNext ) {\n\n\t\t\t\t// computes for inPt the corresponding point inPt' on a new contour\n\t\t\t\t//   shifted by 1 unit (length of normalized vector) to the left\n\t\t\t\t// if we walk along contour clockwise, this new contour is outside the old one\n\t\t\t\t//\n\t\t\t\t// inPt' is the intersection of the two lines parallel to the two\n\t\t\t\t//  adjacent edges of inPt at a distance of 1 unit on the left side.\n\n\t\t\t\tlet v_trans_x, v_trans_y, shrink_by; // resulting translation vector for inPt\n\n\t\t\t\t// good reading for geometry algorithms (here: line-line intersection)\n\t\t\t\t// http://geomalgorithms.com/a05-_intersect-1.html\n\n\t\t\t\tconst v_prev_x = inPt.x - inPrev.x,\n\t\t\t\t\tv_prev_y = inPt.y - inPrev.y;\n\t\t\t\tconst v_next_x = inNext.x - inPt.x,\n\t\t\t\t\tv_next_y = inNext.y - inPt.y;\n\n\t\t\t\tconst v_prev_lensq = ( v_prev_x * v_prev_x + v_prev_y * v_prev_y );\n\n\t\t\t\t// check for collinear edges\n\t\t\t\tconst collinear0 = ( v_prev_x * v_next_y - v_prev_y * v_next_x );\n\n\t\t\t\tif ( Math.abs( collinear0 ) > Number.EPSILON ) {\n\n\t\t\t\t\t// not collinear\n\n\t\t\t\t\t// length of vectors for normalizing\n\n\t\t\t\t\tconst v_prev_len = Math.sqrt( v_prev_lensq );\n\t\t\t\t\tconst v_next_len = Math.sqrt( v_next_x * v_next_x + v_next_y * v_next_y );\n\n\t\t\t\t\t// shift adjacent points by unit vectors to the left\n\n\t\t\t\t\tconst ptPrevShift_x = ( inPrev.x - v_prev_y / v_prev_len );\n\t\t\t\t\tconst ptPrevShift_y = ( inPrev.y + v_prev_x / v_prev_len );\n\n\t\t\t\t\tconst ptNextShift_x = ( inNext.x - v_next_y / v_next_len );\n\t\t\t\t\tconst ptNextShift_y = ( inNext.y + v_next_x / v_next_len );\n\n\t\t\t\t\t// scaling factor for v_prev to intersection point\n\n\t\t\t\t\tconst sf = ( ( ptNextShift_x - ptPrevShift_x ) * v_next_y -\n\t\t\t\t\t\t\t( ptNextShift_y - ptPrevShift_y ) * v_next_x ) /\n\t\t\t\t\t\t( v_prev_x * v_next_y - v_prev_y * v_next_x );\n\n\t\t\t\t\t// vector from inPt to intersection point\n\n\t\t\t\t\tv_trans_x = ( ptPrevShift_x + v_prev_x * sf - inPt.x );\n\t\t\t\t\tv_trans_y = ( ptPrevShift_y + v_prev_y * sf - inPt.y );\n\n\t\t\t\t\t// Don't normalize!, otherwise sharp corners become ugly\n\t\t\t\t\t//  but prevent crazy spikes\n\t\t\t\t\tconst v_trans_lensq = ( v_trans_x * v_trans_x + v_trans_y * v_trans_y );\n\t\t\t\t\tif ( v_trans_lensq <= 2 ) {\n\n\t\t\t\t\t\treturn new Vector2( v_trans_x, v_trans_y );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tshrink_by = Math.sqrt( v_trans_lensq / 2 );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// handle special case of collinear edges\n\n\t\t\t\t\tlet direction_eq = false; // assumes: opposite\n\n\t\t\t\t\tif ( v_prev_x > Number.EPSILON ) {\n\n\t\t\t\t\t\tif ( v_next_x > Number.EPSILON ) {\n\n\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( v_prev_x < - Number.EPSILON ) {\n\n\t\t\t\t\t\t\tif ( v_next_x < - Number.EPSILON ) {\n\n\t\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tif ( Math.sign( v_prev_y ) === Math.sign( v_next_y ) ) {\n\n\t\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( direction_eq ) {\n\n\t\t\t\t\t\t// log(\"Warning: lines are a straight sequence\");\n\t\t\t\t\t\tv_trans_x = - v_prev_y;\n\t\t\t\t\t\tv_trans_y = v_prev_x;\n\t\t\t\t\t\tshrink_by = Math.sqrt( v_prev_lensq );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// log(\"Warning: lines are a straight spike\");\n\t\t\t\t\t\tv_trans_x = v_prev_x;\n\t\t\t\t\t\tv_trans_y = v_prev_y;\n\t\t\t\t\t\tshrink_by = Math.sqrt( v_prev_lensq / 2 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn new Vector2( v_trans_x / shrink_by, v_trans_y / shrink_by );\n\n\t\t\t}\n\n\n\t\t\tconst contourMovements = [];\n\n\t\t\tfor ( let i = 0, il = contour.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {\n\n\t\t\t\tif ( j === il ) j = 0;\n\t\t\t\tif ( k === il ) k = 0;\n\n\t\t\t\t//  (j)---(i)---(k)\n\t\t\t\t// log('i,j,k', i, j , k)\n\n\t\t\t\tcontourMovements[ i ] = getBevelVec( contour[ i ], contour[ j ], contour[ k ] );\n\n\t\t\t}\n\n\t\t\tconst holesMovements = [];\n\t\t\tlet oneHoleMovements, verticesMovements = contourMovements.concat();\n\n\t\t\tfor ( let h = 0, hl = numHoles; h < hl; h ++ ) {\n\n\t\t\t\tconst ahole = holes[ h ];\n\n\t\t\t\toneHoleMovements = [];\n\n\t\t\t\tfor ( let i = 0, il = ahole.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {\n\n\t\t\t\t\tif ( j === il ) j = 0;\n\t\t\t\t\tif ( k === il ) k = 0;\n\n\t\t\t\t\t//  (j)---(i)---(k)\n\t\t\t\t\toneHoleMovements[ i ] = getBevelVec( ahole[ i ], ahole[ j ], ahole[ k ] );\n\n\t\t\t\t}\n\n\t\t\t\tholesMovements.push( oneHoleMovements );\n\t\t\t\tverticesMovements = verticesMovements.concat( oneHoleMovements );\n\n\t\t\t}\n\n\t\t\tlet faces;\n\n\t\t\tif ( bevelSegments === 0 ) {\n\n\t\t\t\tfaces = ShapeUtils.triangulateShape( contour, holes );\n\n\t\t\t} else {\n\n\t\t\t\tconst contractedContourVertices = [];\n\t\t\t\tconst expandedHoleVertices = [];\n\n\t\t\t\t// Loop bevelSegments, 1 for the front, 1 for the back\n\n\t\t\t\tfor ( let b = 0; b < bevelSegments; b ++ ) {\n\n\t\t\t\t\t//for ( b = bevelSegments; b > 0; b -- ) {\n\n\t\t\t\t\tconst t = b / bevelSegments;\n\t\t\t\t\tconst z = bevelThickness * Math.cos( t * Math.PI / 2 );\n\t\t\t\t\tconst bs = bevelSize * Math.sin( t * Math.PI / 2 ) + bevelOffset;\n\n\t\t\t\t\t// contract shape\n\n\t\t\t\t\tfor ( let i = 0, il = contour.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tconst vert = scalePt2( contour[ i ], contourMovements[ i ], bs );\n\n\t\t\t\t\t\tv( vert.x, vert.y, - z );\n\t\t\t\t\t\tif ( t === 0 ) contractedContourVertices.push( vert );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// expand holes\n\n\t\t\t\t\tfor ( let h = 0, hl = numHoles; h < hl; h ++ ) {\n\n\t\t\t\t\t\tconst ahole = holes[ h ];\n\t\t\t\t\t\toneHoleMovements = holesMovements[ h ];\n\t\t\t\t\t\tconst oneHoleVertices = [];\n\t\t\t\t\t\tfor ( let i = 0, il = ahole.length; i < il; i ++ ) {\n\n\t\t\t\t\t\t\tconst vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );\n\n\t\t\t\t\t\t\tv( vert.x, vert.y, - z );\n\t\t\t\t\t\t\tif ( t === 0 ) oneHoleVertices.push( vert );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( t === 0 ) expandedHoleVertices.push( oneHoleVertices );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tfaces = ShapeUtils.triangulateShape( contractedContourVertices, expandedHoleVertices );\n\n\t\t\t}\n\n\t\t\tconst flen = faces.length;\n\n\t\t\tconst bs = bevelSize + bevelOffset;\n\n\t\t\t// Back facing vertices\n\n\t\t\tfor ( let i = 0; i < vlen; i ++ ) {\n\n\t\t\t\tconst vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ];\n\n\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\tv( vert.x, vert.y, 0 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// v( vert.x, vert.y + extrudePts[ 0 ].y, extrudePts[ 0 ].x );\n\n\t\t\t\t\tnormal.copy( splineTube.normals[ 0 ] ).multiplyScalar( vert.x );\n\t\t\t\t\tbinormal.copy( splineTube.binormals[ 0 ] ).multiplyScalar( vert.y );\n\n\t\t\t\t\tposition2.copy( extrudePts[ 0 ] ).add( normal ).add( binormal );\n\n\t\t\t\t\tv( position2.x, position2.y, position2.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Add stepped vertices...\n\t\t\t// Including front facing vertices\n\n\t\t\tfor ( let s = 1; s <= steps; s ++ ) {\n\n\t\t\t\tfor ( let i = 0; i < vlen; i ++ ) {\n\n\t\t\t\t\tconst vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ];\n\n\t\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\t\tv( vert.x, vert.y, depth / steps * s );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// v( vert.x, vert.y + extrudePts[ s - 1 ].y, extrudePts[ s - 1 ].x );\n\n\t\t\t\t\t\tnormal.copy( splineTube.normals[ s ] ).multiplyScalar( vert.x );\n\t\t\t\t\t\tbinormal.copy( splineTube.binormals[ s ] ).multiplyScalar( vert.y );\n\n\t\t\t\t\t\tposition2.copy( extrudePts[ s ] ).add( normal ).add( binormal );\n\n\t\t\t\t\t\tv( position2.x, position2.y, position2.z );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t\t// Add bevel segments planes\n\n\t\t\t//for ( b = 1; b <= bevelSegments; b ++ ) {\n\t\t\tfor ( let b = bevelSegments - 1; b >= 0; b -- ) {\n\n\t\t\t\tconst t = b / bevelSegments;\n\t\t\t\tconst z = bevelThickness * Math.cos( t * Math.PI / 2 );\n\t\t\t\tconst bs = bevelSize * Math.sin( t * Math.PI / 2 ) + bevelOffset;\n\n\t\t\t\t// contract shape\n\n\t\t\t\tfor ( let i = 0, il = contour.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst vert = scalePt2( contour[ i ], contourMovements[ i ], bs );\n\t\t\t\t\tv( vert.x, vert.y, depth + z );\n\n\t\t\t\t}\n\n\t\t\t\t// expand holes\n\n\t\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\t\tconst ahole = holes[ h ];\n\t\t\t\t\toneHoleMovements = holesMovements[ h ];\n\n\t\t\t\t\tfor ( let i = 0, il = ahole.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tconst vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );\n\n\t\t\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\t\t\tv( vert.x, vert.y, depth + z );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tv( vert.x, vert.y + extrudePts[ steps - 1 ].y, extrudePts[ steps - 1 ].x + z );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t/* Faces */\n\n\t\t\t// Top and bottom faces\n\n\t\t\tbuildLidFaces();\n\n\t\t\t// Sides faces\n\n\t\t\tbuildSideFaces();\n\n\n\t\t\t/////  Internal functions\n\n\t\t\tfunction buildLidFaces() {\n\n\t\t\t\tconst start = verticesArray.length / 3;\n\n\t\t\t\tif ( bevelEnabled ) {\n\n\t\t\t\t\tlet layer = 0; // steps + 1\n\t\t\t\t\tlet offset = vlen * layer;\n\n\t\t\t\t\t// Bottom faces\n\n\t\t\t\t\tfor ( let i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\t\tconst face = faces[ i ];\n\t\t\t\t\t\tf3( face[ 2 ] + offset, face[ 1 ] + offset, face[ 0 ] + offset );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tlayer = steps + bevelSegments * 2;\n\t\t\t\t\toffset = vlen * layer;\n\n\t\t\t\t\t// Top faces\n\n\t\t\t\t\tfor ( let i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\t\tconst face = faces[ i ];\n\t\t\t\t\t\tf3( face[ 0 ] + offset, face[ 1 ] + offset, face[ 2 ] + offset );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Bottom faces\n\n\t\t\t\t\tfor ( let i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\t\tconst face = faces[ i ];\n\t\t\t\t\t\tf3( face[ 2 ], face[ 1 ], face[ 0 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Top faces\n\n\t\t\t\t\tfor ( let i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\t\tconst face = faces[ i ];\n\t\t\t\t\t\tf3( face[ 0 ] + vlen * steps, face[ 1 ] + vlen * steps, face[ 2 ] + vlen * steps );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tscope.addGroup( start, verticesArray.length / 3 - start, 0 );\n\n\t\t\t}\n\n\t\t\t// Create faces for the z-sides of the shape\n\n\t\t\tfunction buildSideFaces() {\n\n\t\t\t\tconst start = verticesArray.length / 3;\n\t\t\t\tlet layeroffset = 0;\n\t\t\t\tsidewalls( contour, layeroffset );\n\t\t\t\tlayeroffset += contour.length;\n\n\t\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\t\tconst ahole = holes[ h ];\n\t\t\t\t\tsidewalls( ahole, layeroffset );\n\n\t\t\t\t\t//, true\n\t\t\t\t\tlayeroffset += ahole.length;\n\n\t\t\t\t}\n\n\n\t\t\t\tscope.addGroup( start, verticesArray.length / 3 - start, 1 );\n\n\n\t\t\t}\n\n\t\t\tfunction sidewalls( contour, layeroffset ) {\n\n\t\t\t\tlet i = contour.length;\n\n\t\t\t\twhile ( -- i >= 0 ) {\n\n\t\t\t\t\tconst j = i;\n\t\t\t\t\tlet k = i - 1;\n\t\t\t\t\tif ( k < 0 ) k = contour.length - 1;\n\n\t\t\t\t\t//log('b', i,j, i-1, k,vertices.length);\n\n\t\t\t\t\tfor ( let s = 0, sl = ( steps + bevelSegments * 2 ); s < sl; s ++ ) {\n\n\t\t\t\t\t\tconst slen1 = vlen * s;\n\t\t\t\t\t\tconst slen2 = vlen * ( s + 1 );\n\n\t\t\t\t\t\tconst a = layeroffset + j + slen1,\n\t\t\t\t\t\t\tb = layeroffset + k + slen1,\n\t\t\t\t\t\t\tc = layeroffset + k + slen2,\n\t\t\t\t\t\t\td = layeroffset + j + slen2;\n\n\t\t\t\t\t\tf4( a, b, c, d );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction v( x, y, z ) {\n\n\t\t\t\tplaceholder.push( x );\n\t\t\t\tplaceholder.push( y );\n\t\t\t\tplaceholder.push( z );\n\n\t\t\t}\n\n\n\t\t\tfunction f3( a, b, c ) {\n\n\t\t\t\taddVertex( a );\n\t\t\t\taddVertex( b );\n\t\t\t\taddVertex( c );\n\n\t\t\t\tconst nextIndex = verticesArray.length / 3;\n\t\t\t\tconst uvs = uvgen.generateTopUV( scope, verticesArray, nextIndex - 3, nextIndex - 2, nextIndex - 1 );\n\n\t\t\t\taddUV( uvs[ 0 ] );\n\t\t\t\taddUV( uvs[ 1 ] );\n\t\t\t\taddUV( uvs[ 2 ] );\n\n\t\t\t}\n\n\t\t\tfunction f4( a, b, c, d ) {\n\n\t\t\t\taddVertex( a );\n\t\t\t\taddVertex( b );\n\t\t\t\taddVertex( d );\n\n\t\t\t\taddVertex( b );\n\t\t\t\taddVertex( c );\n\t\t\t\taddVertex( d );\n\n\n\t\t\t\tconst nextIndex = verticesArray.length / 3;\n\t\t\t\tconst uvs = uvgen.generateSideWallUV( scope, verticesArray, nextIndex - 6, nextIndex - 3, nextIndex - 2, nextIndex - 1 );\n\n\t\t\t\taddUV( uvs[ 0 ] );\n\t\t\t\taddUV( uvs[ 1 ] );\n\t\t\t\taddUV( uvs[ 3 ] );\n\n\t\t\t\taddUV( uvs[ 1 ] );\n\t\t\t\taddUV( uvs[ 2 ] );\n\t\t\t\taddUV( uvs[ 3 ] );\n\n\t\t\t}\n\n\t\t\tfunction addVertex( index ) {\n\n\t\t\t\tverticesArray.push( placeholder[ index * 3 + 0 ] );\n\t\t\t\tverticesArray.push( placeholder[ index * 3 + 1 ] );\n\t\t\t\tverticesArray.push( placeholder[ index * 3 + 2 ] );\n\n\t\t\t}\n\n\n\t\t\tfunction addUV( vector2 ) {\n\n\t\t\t\tuvArray.push( vector2.x );\n\t\t\t\tuvArray.push( vector2.y );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tconst shapes = this.parameters.shapes;\n\t\tconst options = this.parameters.options;\n\n\t\treturn toJSON$1( shapes, options, data );\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @param {Array<Shape>} shapes - An array of shapes.\n\t * @return {ExtrudeGeometry} A new instance.\n\t */\n\tstatic fromJSON( data, shapes ) {\n\n\t\tconst geometryShapes = [];\n\n\t\tfor ( let j = 0, jl = data.shapes.length; j < jl; j ++ ) {\n\n\t\t\tconst shape = shapes[ data.shapes[ j ] ];\n\n\t\t\tgeometryShapes.push( shape );\n\n\t\t}\n\n\t\tconst extrudePath = data.options.extrudePath;\n\n\t\tif ( extrudePath !== undefined ) {\n\n\t\t\tdata.options.extrudePath = new Curves[ extrudePath.type ]().fromJSON( extrudePath );\n\n\t\t}\n\n\t\treturn new ExtrudeGeometry( geometryShapes, data.options );\n\n\t}\n\n}\n\nconst WorldUVGenerator = {\n\n\tgenerateTopUV: function ( geometry, vertices, indexA, indexB, indexC ) {\n\n\t\tconst a_x = vertices[ indexA * 3 ];\n\t\tconst a_y = vertices[ indexA * 3 + 1 ];\n\t\tconst b_x = vertices[ indexB * 3 ];\n\t\tconst b_y = vertices[ indexB * 3 + 1 ];\n\t\tconst c_x = vertices[ indexC * 3 ];\n\t\tconst c_y = vertices[ indexC * 3 + 1 ];\n\n\t\treturn [\n\t\t\tnew Vector2( a_x, a_y ),\n\t\t\tnew Vector2( b_x, b_y ),\n\t\t\tnew Vector2( c_x, c_y )\n\t\t];\n\n\t},\n\n\tgenerateSideWallUV: function ( geometry, vertices, indexA, indexB, indexC, indexD ) {\n\n\t\tconst a_x = vertices[ indexA * 3 ];\n\t\tconst a_y = vertices[ indexA * 3 + 1 ];\n\t\tconst a_z = vertices[ indexA * 3 + 2 ];\n\t\tconst b_x = vertices[ indexB * 3 ];\n\t\tconst b_y = vertices[ indexB * 3 + 1 ];\n\t\tconst b_z = vertices[ indexB * 3 + 2 ];\n\t\tconst c_x = vertices[ indexC * 3 ];\n\t\tconst c_y = vertices[ indexC * 3 + 1 ];\n\t\tconst c_z = vertices[ indexC * 3 + 2 ];\n\t\tconst d_x = vertices[ indexD * 3 ];\n\t\tconst d_y = vertices[ indexD * 3 + 1 ];\n\t\tconst d_z = vertices[ indexD * 3 + 2 ];\n\n\t\tif ( Math.abs( a_y - b_y ) < Math.abs( a_x - b_x ) ) {\n\n\t\t\treturn [\n\t\t\t\tnew Vector2( a_x, 1 - a_z ),\n\t\t\t\tnew Vector2( b_x, 1 - b_z ),\n\t\t\t\tnew Vector2( c_x, 1 - c_z ),\n\t\t\t\tnew Vector2( d_x, 1 - d_z )\n\t\t\t];\n\n\t\t} else {\n\n\t\t\treturn [\n\t\t\t\tnew Vector2( a_y, 1 - a_z ),\n\t\t\t\tnew Vector2( b_y, 1 - b_z ),\n\t\t\t\tnew Vector2( c_y, 1 - c_z ),\n\t\t\t\tnew Vector2( d_y, 1 - d_z )\n\t\t\t];\n\n\t\t}\n\n\t}\n\n};\n\nfunction toJSON$1( shapes, options, data ) {\n\n\tdata.shapes = [];\n\n\tif ( Array.isArray( shapes ) ) {\n\n\t\tfor ( let i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\tconst shape = shapes[ i ];\n\n\t\t\tdata.shapes.push( shape.uuid );\n\n\t\t}\n\n\t} else {\n\n\t\tdata.shapes.push( shapes.uuid );\n\n\t}\n\n\tdata.options = Object.assign( {}, options );\n\n\tif ( options.extrudePath !== undefined ) data.options.extrudePath = options.extrudePath.toJSON();\n\n\treturn data;\n\n}\n\n/**\n * A geometry class for representing an icosahedron.\n *\n * ```js\n * const geometry = new THREE.IcosahedronGeometry();\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const icosahedron = new THREE.Mesh( geometry, material );\n * scene.add( icosahedron );\n * ```\n *\n * @augments PolyhedronGeometry\n * @demo scenes/geometry-browser.html#IcosahedronGeometry\n */\nclass IcosahedronGeometry extends PolyhedronGeometry {\n\n\t/**\n\t * Constructs a new icosahedron geometry.\n\t *\n\t * @param {number} [radius=1] - Radius of the icosahedron.\n\t * @param {number} [detail=0] - Setting this to a value greater than `0` adds vertices making it no longer a icosahedron.\n\t */\n\tconstructor( radius = 1, detail = 0 ) {\n\n\t\tconst t = ( 1 + Math.sqrt( 5 ) ) / 2;\n\n\t\tconst vertices = [\n\t\t\t-1, t, 0, \t1, t, 0, \t-1, - t, 0, \t1, - t, 0,\n\t\t\t0, -1, t, \t0, 1, t,\t0, -1, - t, \t0, 1, - t,\n\t\t\tt, 0, -1, \tt, 0, 1, \t- t, 0, -1, \t- t, 0, 1\n\t\t];\n\n\t\tconst indices = [\n\t\t\t0, 11, 5, \t0, 5, 1, \t0, 1, 7, \t0, 7, 10, \t0, 10, 11,\n\t\t\t1, 5, 9, \t5, 11, 4,\t11, 10, 2,\t10, 7, 6,\t7, 1, 8,\n\t\t\t3, 9, 4, \t3, 4, 2,\t3, 2, 6,\t3, 6, 8,\t3, 8, 9,\n\t\t\t4, 9, 5, \t2, 4, 11,\t6, 2, 10,\t8, 6, 7,\t9, 8, 1\n\t\t];\n\n\t\tsuper( vertices, indices, radius, detail );\n\n\t\tthis.type = 'IcosahedronGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {IcosahedronGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new IcosahedronGeometry( data.radius, data.detail );\n\n\t}\n\n}\n\n/**\n * Creates meshes with axial symmetry like vases. The lathe rotates around the Y axis.\n *\n * ```js\n * const points = [];\n * for ( let i = 0; i < 10; i ++ ) {\n * \tpoints.push( new THREE.Vector2( Math.sin( i * 0.2 ) * 10 + 5, ( i - 5 ) * 2 ) );\n * }\n * const geometry = new THREE.LatheGeometry( points );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const lathe = new THREE.Mesh( geometry, material );\n * scene.add( lathe );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#LatheGeometry\n */\nclass LatheGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new lathe geometry.\n\t *\n\t * @param {Array<Vector2|Vector3>} [points] - An array of points in 2D space. The x-coordinate of each point\n\t * must be greater than zero.\n\t * @param {number} [segments=12] - The number of circumference segments to generate.\n\t * @param {number} [phiStart=0] - The starting angle in radians.\n\t * @param {number} [phiLength=Math.PI*2] - The radian (0 to 2PI) range of the lathed section 2PI is a\n\t * closed lathe, less than 2PI is a portion.\n\t */\n\tconstructor( points = [ new Vector2( 0, -0.5 ), new Vector2( 0.5, 0 ), new Vector2( 0, 0.5 ) ], segments = 12, phiStart = 0, phiLength = Math.PI * 2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'LatheGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tpoints: points,\n\t\t\tsegments: segments,\n\t\t\tphiStart: phiStart,\n\t\t\tphiLength: phiLength\n\t\t};\n\n\t\tsegments = Math.floor( segments );\n\n\t\t// clamp phiLength so it's in range of [ 0, 2PI ]\n\n\t\tphiLength = clamp( phiLength, 0, Math.PI * 2 );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst uvs = [];\n\t\tconst initNormals = [];\n\t\tconst normals = [];\n\n\t\t// helper variables\n\n\t\tconst inverseSegments = 1.0 / segments;\n\t\tconst vertex = new Vector3();\n\t\tconst uv = new Vector2();\n\t\tconst normal = new Vector3();\n\t\tconst curNormal = new Vector3();\n\t\tconst prevNormal = new Vector3();\n\t\tlet dx = 0;\n\t\tlet dy = 0;\n\n\t\t// pre-compute normals for initial \"meridian\"\n\n\t\tfor ( let j = 0; j <= ( points.length - 1 ); j ++ ) {\n\n\t\t\tswitch ( j ) {\n\n\t\t\t\tcase 0:\t\t\t\t// special handling for 1st vertex on path\n\n\t\t\t\t\tdx = points[ j + 1 ].x - points[ j ].x;\n\t\t\t\t\tdy = points[ j + 1 ].y - points[ j ].y;\n\n\t\t\t\t\tnormal.x = dy * 1.0;\n\t\t\t\t\tnormal.y = - dx;\n\t\t\t\t\tnormal.z = dy * 0.0;\n\n\t\t\t\t\tprevNormal.copy( normal );\n\n\t\t\t\t\tnormal.normalize();\n\n\t\t\t\t\tinitNormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase ( points.length - 1 ):\t// special handling for last Vertex on path\n\n\t\t\t\t\tinitNormals.push( prevNormal.x, prevNormal.y, prevNormal.z );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\t\t\t// default handling for all vertices in between\n\n\t\t\t\t\tdx = points[ j + 1 ].x - points[ j ].x;\n\t\t\t\t\tdy = points[ j + 1 ].y - points[ j ].y;\n\n\t\t\t\t\tnormal.x = dy * 1.0;\n\t\t\t\t\tnormal.y = - dx;\n\t\t\t\t\tnormal.z = dy * 0.0;\n\n\t\t\t\t\tcurNormal.copy( normal );\n\n\t\t\t\t\tnormal.x += prevNormal.x;\n\t\t\t\t\tnormal.y += prevNormal.y;\n\t\t\t\t\tnormal.z += prevNormal.z;\n\n\t\t\t\t\tnormal.normalize();\n\n\t\t\t\t\tinitNormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t\tprevNormal.copy( curNormal );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate vertices, uvs and normals\n\n\t\tfor ( let i = 0; i <= segments; i ++ ) {\n\n\t\t\tconst phi = phiStart + i * inverseSegments * phiLength;\n\n\t\t\tconst sin = Math.sin( phi );\n\t\t\tconst cos = Math.cos( phi );\n\n\t\t\tfor ( let j = 0; j <= ( points.length - 1 ); j ++ ) {\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = points[ j ].x * sin;\n\t\t\t\tvertex.y = points[ j ].y;\n\t\t\t\tvertex.z = points[ j ].x * cos;\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuv.x = i / segments;\n\t\t\t\tuv.y = j / ( points.length - 1 );\n\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t\t// normal\n\n\t\t\t\tconst x = initNormals[ 3 * j + 0 ] * sin;\n\t\t\t\tconst y = initNormals[ 3 * j + 1 ];\n\t\t\t\tconst z = initNormals[ 3 * j + 0 ] * cos;\n\n\t\t\t\tnormals.push( x, y, z );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( let i = 0; i < segments; i ++ ) {\n\n\t\t\tfor ( let j = 0; j < ( points.length - 1 ); j ++ ) {\n\n\t\t\t\tconst base = j + i * points.length;\n\n\t\t\t\tconst a = base;\n\t\t\t\tconst b = base + points.length;\n\t\t\t\tconst c = base + points.length + 1;\n\t\t\t\tconst d = base + 1;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( c, d, b );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {LatheGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new LatheGeometry( data.points, data.segments, data.phiStart, data.phiLength );\n\n\t}\n\n}\n\n/**\n * A geometry class for representing an octahedron.\n *\n * ```js\n * const geometry = new THREE.OctahedronGeometry();\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const octahedron = new THREE.Mesh( geometry, material );\n * scene.add( octahedron );\n * ```\n *\n * @augments PolyhedronGeometry\n * @demo scenes/geometry-browser.html#OctahedronGeometry\n */\nclass OctahedronGeometry extends PolyhedronGeometry {\n\n\t/**\n\t * Constructs a new octahedron geometry.\n\t *\n\t * @param {number} [radius=1] - Radius of the octahedron.\n\t * @param {number} [detail=0] - Setting this to a value greater than `0` adds vertices making it no longer a octahedron.\n\t */\n\tconstructor( radius = 1, detail = 0 ) {\n\n\t\tconst vertices = [\n\t\t\t1, 0, 0, \t-1, 0, 0,\t0, 1, 0,\n\t\t\t0, -1, 0, \t0, 0, 1,\t0, 0, -1\n\t\t];\n\n\t\tconst indices = [\n\t\t\t0, 2, 4,\t0, 4, 3,\t0, 3, 5,\n\t\t\t0, 5, 2,\t1, 2, 5,\t1, 5, 3,\n\t\t\t1, 3, 4,\t1, 4, 2\n\t\t];\n\n\t\tsuper( vertices, indices, radius, detail );\n\n\t\tthis.type = 'OctahedronGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {OctahedronGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new OctahedronGeometry( data.radius, data.detail );\n\n\t}\n\n}\n\n/**\n * A geometry class for representing a plane.\n *\n * ```js\n * const geometry = new THREE.PlaneGeometry( 1, 1 );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00, side: THREE.DoubleSide } );\n * const plane = new THREE.Mesh( geometry, material );\n * scene.add( plane );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#PlaneGeometry\n */\nclass PlaneGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new plane geometry.\n\t *\n\t * @param {number} [width=1] - The width along the X axis.\n\t * @param {number} [height=1] - The height along the Y axis\n\t * @param {number} [widthSegments=1] - The number of segments along the X axis.\n\t * @param {number} [heightSegments=1] - The number of segments along the Y axis.\n\t */\n\tconstructor( width = 1, height = 1, widthSegments = 1, heightSegments = 1 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'PlaneGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments\n\t\t};\n\n\t\tconst width_half = width / 2;\n\t\tconst height_half = height / 2;\n\n\t\tconst gridX = Math.floor( widthSegments );\n\t\tconst gridY = Math.floor( heightSegments );\n\n\t\tconst gridX1 = gridX + 1;\n\t\tconst gridY1 = gridY + 1;\n\n\t\tconst segment_width = width / gridX;\n\t\tconst segment_height = height / gridY;\n\n\t\t//\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\tfor ( let iy = 0; iy < gridY1; iy ++ ) {\n\n\t\t\tconst y = iy * segment_height - height_half;\n\n\t\t\tfor ( let ix = 0; ix < gridX1; ix ++ ) {\n\n\t\t\t\tconst x = ix * segment_width - width_half;\n\n\t\t\t\tvertices.push( x, - y, 0 );\n\n\t\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\t\tuvs.push( ix / gridX );\n\t\t\t\tuvs.push( 1 - ( iy / gridY ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( let iy = 0; iy < gridY; iy ++ ) {\n\n\t\t\tfor ( let ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\t\tconst a = ix + gridX1 * iy;\n\t\t\t\tconst b = ix + gridX1 * ( iy + 1 );\n\t\t\t\tconst c = ( ix + 1 ) + gridX1 * ( iy + 1 );\n\t\t\t\tconst d = ( ix + 1 ) + gridX1 * iy;\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {PlaneGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new PlaneGeometry( data.width, data.height, data.widthSegments, data.heightSegments );\n\n\t}\n\n}\n\n/**\n * A class for generating a two-dimensional ring geometry.\n *\n * ```js\n * const geometry = new THREE.RingGeometry( 1, 5, 32 );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00, side: THREE.DoubleSide } );\n * const mesh = new THREE.Mesh( geometry, material );\n * scene.add( mesh );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#RingGeometry\n */\nclass RingGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new ring geometry.\n\t *\n\t * @param {number} [innerRadius=0.5] - The inner radius of the ring.\n\t * @param {number} [outerRadius=1] - The outer radius of the ring.\n\t * @param {number} [thetaSegments=32] - Number of segments. A higher number means the ring will be more round. Minimum is `3`.\n\t * @param {number} [phiSegments=1] - Number of segments per ring segment. Minimum is `1`.\n\t * @param {number} [thetaStart=0] - Starting angle in radians.\n\t * @param {number} [thetaLength=Math.PI*2] - Central angle in radians.\n\t */\n\tconstructor( innerRadius = 0.5, outerRadius = 1, thetaSegments = 32, phiSegments = 1, thetaStart = 0, thetaLength = Math.PI * 2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'RingGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tinnerRadius: innerRadius,\n\t\t\touterRadius: outerRadius,\n\t\t\tthetaSegments: thetaSegments,\n\t\t\tphiSegments: phiSegments,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tthetaSegments = Math.max( 3, thetaSegments );\n\t\tphiSegments = Math.max( 1, phiSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// some helper variables\n\n\t\tlet radius = innerRadius;\n\t\tconst radiusStep = ( ( outerRadius - innerRadius ) / phiSegments );\n\t\tconst vertex = new Vector3();\n\t\tconst uv = new Vector2();\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( let j = 0; j <= phiSegments; j ++ ) {\n\n\t\t\tfor ( let i = 0; i <= thetaSegments; i ++ ) {\n\n\t\t\t\t// values are generate from the inside of the ring to the outside\n\n\t\t\t\tconst segment = thetaStart + i / thetaSegments * thetaLength;\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = radius * Math.cos( segment );\n\t\t\t\tvertex.y = radius * Math.sin( segment );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\t\t// uv\n\n\t\t\t\tuv.x = ( vertex.x / outerRadius + 1 ) / 2;\n\t\t\t\tuv.y = ( vertex.y / outerRadius + 1 ) / 2;\n\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t}\n\n\t\t\t// increase the radius for next row of vertices\n\n\t\t\tradius += radiusStep;\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( let j = 0; j < phiSegments; j ++ ) {\n\n\t\t\tconst thetaSegmentLevel = j * ( thetaSegments + 1 );\n\n\t\t\tfor ( let i = 0; i < thetaSegments; i ++ ) {\n\n\t\t\t\tconst segment = i + thetaSegmentLevel;\n\n\t\t\t\tconst a = segment;\n\t\t\t\tconst b = segment + thetaSegments + 1;\n\t\t\t\tconst c = segment + thetaSegments + 2;\n\t\t\t\tconst d = segment + 1;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {RingGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new RingGeometry( data.innerRadius, data.outerRadius, data.thetaSegments, data.phiSegments, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\n/**\n * Creates an one-sided polygonal geometry from one or more path shapes.\n *\n * ```js\n * const arcShape = new THREE.Shape()\n *\t.moveTo( 5, 1 )\n *\t.absarc( 1, 1, 4, 0, Math.PI * 2, false );\n *\n * const geometry = new THREE.ShapeGeometry( arcShape );\n * const material = new THREE.MeshBasicMaterial( { color: 0x00ff00, side: THREE.DoubleSide } );\n * const mesh = new THREE.Mesh( geometry, material ) ;\n * scene.add( mesh );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#ShapeGeometry\n */\nclass ShapeGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new shape geometry.\n\t *\n\t * @param {Shape|Array<Shape>} [shapes] - A shape or an array of shapes.\n\t * @param {number} [curveSegments=12] - Number of segments per shape.\n\t */\n\tconstructor( shapes = new Shape( [ new Vector2( 0, 0.5 ), new Vector2( -0.5, -0.5 ), new Vector2( 0.5, -0.5 ) ] ), curveSegments = 12 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'ShapeGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tshapes: shapes,\n\t\t\tcurveSegments: curveSegments\n\t\t};\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tlet groupStart = 0;\n\t\tlet groupCount = 0;\n\n\t\t// allow single and array values for \"shapes\" parameter\n\n\t\tif ( Array.isArray( shapes ) === false ) {\n\n\t\t\taddShape( shapes );\n\n\t\t} else {\n\n\t\t\tfor ( let i = 0; i < shapes.length; i ++ ) {\n\n\t\t\t\taddShape( shapes[ i ] );\n\n\t\t\t\tthis.addGroup( groupStart, groupCount, i ); // enables MultiMaterial support\n\n\t\t\t\tgroupStart += groupCount;\n\t\t\t\tgroupCount = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\n\t\t// helper functions\n\n\t\tfunction addShape( shape ) {\n\n\t\t\tconst indexOffset = vertices.length / 3;\n\t\t\tconst points = shape.extractPoints( curveSegments );\n\n\t\t\tlet shapeVertices = points.shape;\n\t\t\tconst shapeHoles = points.holes;\n\n\t\t\t// check direction of vertices\n\n\t\t\tif ( ShapeUtils.isClockWise( shapeVertices ) === false ) {\n\n\t\t\t\tshapeVertices = shapeVertices.reverse();\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0, l = shapeHoles.length; i < l; i ++ ) {\n\n\t\t\t\tconst shapeHole = shapeHoles[ i ];\n\n\t\t\t\tif ( ShapeUtils.isClockWise( shapeHole ) === true ) {\n\n\t\t\t\t\tshapeHoles[ i ] = shapeHole.reverse();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst faces = ShapeUtils.triangulateShape( shapeVertices, shapeHoles );\n\n\t\t\t// join vertices of inner and outer paths to a single array\n\n\t\t\tfor ( let i = 0, l = shapeHoles.length; i < l; i ++ ) {\n\n\t\t\t\tconst shapeHole = shapeHoles[ i ];\n\t\t\t\tshapeVertices = shapeVertices.concat( shapeHole );\n\n\t\t\t}\n\n\t\t\t// vertices, normals, uvs\n\n\t\t\tfor ( let i = 0, l = shapeVertices.length; i < l; i ++ ) {\n\n\t\t\t\tconst vertex = shapeVertices[ i ];\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, 0 );\n\t\t\t\tnormals.push( 0, 0, 1 );\n\t\t\t\tuvs.push( vertex.x, vertex.y ); // world uvs\n\n\t\t\t}\n\n\t\t\t// indices\n\n\t\t\tfor ( let i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\tconst face = faces[ i ];\n\n\t\t\t\tconst a = face[ 0 ] + indexOffset;\n\t\t\t\tconst b = face[ 1 ] + indexOffset;\n\t\t\t\tconst c = face[ 2 ] + indexOffset;\n\n\t\t\t\tindices.push( a, b, c );\n\t\t\t\tgroupCount += 3;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tconst shapes = this.parameters.shapes;\n\n\t\treturn toJSON( shapes, data );\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @param {Array<Shape>} shapes - An array of shapes.\n\t * @return {ShapeGeometry} A new instance.\n\t */\n\tstatic fromJSON( data, shapes ) {\n\n\t\tconst geometryShapes = [];\n\n\t\tfor ( let j = 0, jl = data.shapes.length; j < jl; j ++ ) {\n\n\t\t\tconst shape = shapes[ data.shapes[ j ] ];\n\n\t\t\tgeometryShapes.push( shape );\n\n\t\t}\n\n\t\treturn new ShapeGeometry( geometryShapes, data.curveSegments );\n\n\t}\n\n}\n\nfunction toJSON( shapes, data ) {\n\n\tdata.shapes = [];\n\n\tif ( Array.isArray( shapes ) ) {\n\n\t\tfor ( let i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\tconst shape = shapes[ i ];\n\n\t\t\tdata.shapes.push( shape.uuid );\n\n\t\t}\n\n\t} else {\n\n\t\tdata.shapes.push( shapes.uuid );\n\n\t}\n\n\treturn data;\n\n}\n\n/**\n * A class for generating a sphere geometry.\n *\n * ```js\n * const geometry = new THREE.SphereGeometry( 15, 32, 16 );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const sphere = new THREE.Mesh( geometry, material );\n * scene.add( sphere );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#SphereGeometry\n */\nclass SphereGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new sphere geometry.\n\t *\n\t * @param {number} [radius=1] - The sphere radius.\n\t * @param {number} [widthSegments=32] - The number of horizontal segments. Minimum value is `3`.\n\t * @param {number} [heightSegments=16] - The number of vertical segments. Minimum value is `2`.\n\t * @param {number} [phiStart=0] - The horizontal starting angle in radians.\n\t * @param {number} [phiLength=Math.PI*2] - The horizontal sweep angle size.\n\t * @param {number} [thetaStart=0] - The vertical starting angle in radians.\n\t * @param {number} [thetaLength=Math.PI] - The vertical sweep angle size.\n\t */\n\tconstructor( radius = 1, widthSegments = 32, heightSegments = 16, phiStart = 0, phiLength = Math.PI * 2, thetaStart = 0, thetaLength = Math.PI ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'SphereGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\tphiStart: phiStart,\n\t\t\tphiLength: phiLength,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\twidthSegments = Math.max( 3, Math.floor( widthSegments ) );\n\t\theightSegments = Math.max( 2, Math.floor( heightSegments ) );\n\n\t\tconst thetaEnd = Math.min( thetaStart + thetaLength, Math.PI );\n\n\t\tlet index = 0;\n\t\tconst grid = [];\n\n\t\tconst vertex = new Vector3();\n\t\tconst normal = new Vector3();\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( let iy = 0; iy <= heightSegments; iy ++ ) {\n\n\t\t\tconst verticesRow = [];\n\n\t\t\tconst v = iy / heightSegments;\n\n\t\t\t// special case for the poles\n\n\t\t\tlet uOffset = 0;\n\n\t\t\tif ( iy === 0 && thetaStart === 0 ) {\n\n\t\t\t\tuOffset = 0.5 / widthSegments;\n\n\t\t\t} else if ( iy === heightSegments && thetaEnd === Math.PI ) {\n\n\t\t\t\tuOffset = -0.5 / widthSegments;\n\n\t\t\t}\n\n\t\t\tfor ( let ix = 0; ix <= widthSegments; ix ++ ) {\n\n\t\t\t\tconst u = ix / widthSegments;\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = - radius * Math.cos( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );\n\t\t\t\tvertex.y = radius * Math.cos( thetaStart + v * thetaLength );\n\t\t\t\tvertex.z = radius * Math.sin( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormal.copy( vertex ).normalize();\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( u + uOffset, 1 - v );\n\n\t\t\t\tverticesRow.push( index ++ );\n\n\t\t\t}\n\n\t\t\tgrid.push( verticesRow );\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( let iy = 0; iy < heightSegments; iy ++ ) {\n\n\t\t\tfor ( let ix = 0; ix < widthSegments; ix ++ ) {\n\n\t\t\t\tconst a = grid[ iy ][ ix + 1 ];\n\t\t\t\tconst b = grid[ iy ][ ix ];\n\t\t\t\tconst c = grid[ iy + 1 ][ ix ];\n\t\t\t\tconst d = grid[ iy + 1 ][ ix + 1 ];\n\n\t\t\t\tif ( iy !== 0 || thetaStart > 0 ) indices.push( a, b, d );\n\t\t\t\tif ( iy !== heightSegments - 1 || thetaEnd < Math.PI ) indices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {SphereGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new SphereGeometry( data.radius, data.widthSegments, data.heightSegments, data.phiStart, data.phiLength, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\n/**\n * A geometry class for representing an tetrahedron.\n *\n * ```js\n * const geometry = new THREE.TetrahedronGeometry();\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const tetrahedron = new THREE.Mesh( geometry, material );\n * scene.add( tetrahedron );\n * ```\n *\n * @augments PolyhedronGeometry\n * @demo scenes/geometry-browser.html#TetrahedronGeometry\n */\nclass TetrahedronGeometry extends PolyhedronGeometry {\n\n\t/**\n\t * Constructs a new tetrahedron geometry.\n\t *\n\t * @param {number} [radius=1] - Radius of the tetrahedron.\n\t * @param {number} [detail=0] - Setting this to a value greater than `0` adds vertices making it no longer a tetrahedron.\n\t */\n\tconstructor( radius = 1, detail = 0 ) {\n\n\t\tconst vertices = [\n\t\t\t1, 1, 1, \t-1, -1, 1, \t-1, 1, -1, \t1, -1, -1\n\t\t];\n\n\t\tconst indices = [\n\t\t\t2, 1, 0, \t0, 3, 2,\t1, 3, 0,\t2, 3, 1\n\t\t];\n\n\t\tsuper( vertices, indices, radius, detail );\n\n\t\tthis.type = 'TetrahedronGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {TetrahedronGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new TetrahedronGeometry( data.radius, data.detail );\n\n\t}\n\n}\n\n/**\n * A geometry class for representing an torus.\n *\n * ```js\n * const geometry = new THREE.TorusGeometry( 10, 3, 16, 100 );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const torus = new THREE.Mesh( geometry, material );\n * scene.add( torus );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#TorusGeometry\n */\nclass TorusGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new torus geometry.\n\t *\n\t * @param {number} [radius=1] - Radius of the torus, from the center of the torus to the center of the tube.\n\t * @param {number} [tube=0.4] - Radius of the tube. Must be smaller than `radius`.\n\t * @param {number} [radialSegments=12] - The number of radial segments.\n\t * @param {number} [tubularSegments=48] - The number of tubular segments.\n\t * @param {number} [arc=Math.PI*2] - Central angle in radians.\n\t */\n\tconstructor( radius = 1, tube = 0.4, radialSegments = 12, tubularSegments = 48, arc = Math.PI * 2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'TorusGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\ttube: tube,\n\t\t\tradialSegments: radialSegments,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tarc: arc\n\t\t};\n\n\t\tradialSegments = Math.floor( radialSegments );\n\t\ttubularSegments = Math.floor( tubularSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tconst center = new Vector3();\n\t\tconst vertex = new Vector3();\n\t\tconst normal = new Vector3();\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( let j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\tfor ( let i = 0; i <= tubularSegments; i ++ ) {\n\n\t\t\t\tconst u = i / tubularSegments * arc;\n\t\t\t\tconst v = j / radialSegments * Math.PI * 2;\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = ( radius + tube * Math.cos( v ) ) * Math.cos( u );\n\t\t\t\tvertex.y = ( radius + tube * Math.cos( v ) ) * Math.sin( u );\n\t\t\t\tvertex.z = tube * Math.sin( v );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tcenter.x = radius * Math.cos( u );\n\t\t\t\tcenter.y = radius * Math.sin( u );\n\t\t\t\tnormal.subVectors( vertex, center ).normalize();\n\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( i / tubularSegments );\n\t\t\t\tuvs.push( j / radialSegments );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( let j = 1; j <= radialSegments; j ++ ) {\n\n\t\t\tfor ( let i = 1; i <= tubularSegments; i ++ ) {\n\n\t\t\t\t// indices\n\n\t\t\t\tconst a = ( tubularSegments + 1 ) * j + i - 1;\n\t\t\t\tconst b = ( tubularSegments + 1 ) * ( j - 1 ) + i - 1;\n\t\t\t\tconst c = ( tubularSegments + 1 ) * ( j - 1 ) + i;\n\t\t\t\tconst d = ( tubularSegments + 1 ) * j + i;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {TorusGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new TorusGeometry( data.radius, data.tube, data.radialSegments, data.tubularSegments, data.arc );\n\n\t}\n\n}\n\n/**\n * Creates a torus knot, the particular shape of which is defined by a pair\n * of coprime integers, p and q. If p and q are not coprime, the result will\n * be a torus link.\n *\n * ```js\n * const geometry = new THREE.TorusKnotGeometry( 10, 3, 100, 16 );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const torusKnot = new THREE.Mesh( geometry, material );\n * scene.add( torusKnot );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#TorusKnotGeometry\n */\nclass TorusKnotGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new torus knot geometry.\n\t *\n\t * @param {number} [radius=1] - Radius of the torus knot.\n\t * @param {number} [tube=0.4] - Radius of the tube.\n\t * @param {number} [tubularSegments=64] - The number of tubular segments.\n\t * @param {number} [radialSegments=8] - The number of radial segments.\n\t * @param {number} [p=2] - This value determines, how many times the geometry winds around its axis of rotational symmetry.\n\t * @param {number} [q=3] - This value determines, how many times the geometry winds around a circle in the interior of the torus.\n\t */\n\tconstructor( radius = 1, tube = 0.4, tubularSegments = 64, radialSegments = 8, p = 2, q = 3 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'TorusKnotGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\ttube: tube,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tradialSegments: radialSegments,\n\t\t\tp: p,\n\t\t\tq: q\n\t\t};\n\n\t\ttubularSegments = Math.floor( tubularSegments );\n\t\tradialSegments = Math.floor( radialSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tconst vertex = new Vector3();\n\t\tconst normal = new Vector3();\n\n\t\tconst P1 = new Vector3();\n\t\tconst P2 = new Vector3();\n\n\t\tconst B = new Vector3();\n\t\tconst T = new Vector3();\n\t\tconst N = new Vector3();\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( let i = 0; i <= tubularSegments; ++ i ) {\n\n\t\t\t// the radian \"u\" is used to calculate the position on the torus curve of the current tubular segment\n\n\t\t\tconst u = i / tubularSegments * p * Math.PI * 2;\n\n\t\t\t// now we calculate two points. P1 is our current position on the curve, P2 is a little farther ahead.\n\t\t\t// these points are used to create a special \"coordinate space\", which is necessary to calculate the correct vertex positions\n\n\t\t\tcalculatePositionOnCurve( u, p, q, radius, P1 );\n\t\t\tcalculatePositionOnCurve( u + 0.01, p, q, radius, P2 );\n\n\t\t\t// calculate orthonormal basis\n\n\t\t\tT.subVectors( P2, P1 );\n\t\t\tN.addVectors( P2, P1 );\n\t\t\tB.crossVectors( T, N );\n\t\t\tN.crossVectors( B, T );\n\n\t\t\t// normalize B, N. T can be ignored, we don't use it\n\n\t\t\tB.normalize();\n\t\t\tN.normalize();\n\n\t\t\tfor ( let j = 0; j <= radialSegments; ++ j ) {\n\n\t\t\t\t// now calculate the vertices. they are nothing more than an extrusion of the torus curve.\n\t\t\t\t// because we extrude a shape in the xy-plane, there is no need to calculate a z-value.\n\n\t\t\t\tconst v = j / radialSegments * Math.PI * 2;\n\t\t\t\tconst cx = - tube * Math.cos( v );\n\t\t\t\tconst cy = tube * Math.sin( v );\n\n\t\t\t\t// now calculate the final vertex position.\n\t\t\t\t// first we orient the extrusion with our basis vectors, then we add it to the current position on the curve\n\n\t\t\t\tvertex.x = P1.x + ( cx * N.x + cy * B.x );\n\t\t\t\tvertex.y = P1.y + ( cx * N.y + cy * B.y );\n\t\t\t\tvertex.z = P1.z + ( cx * N.z + cy * B.z );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal (P1 is always the center/origin of the extrusion, thus we can use it to calculate the normal)\n\n\t\t\t\tnormal.subVectors( vertex, P1 ).normalize();\n\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( i / tubularSegments );\n\t\t\t\tuvs.push( j / radialSegments );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( let j = 1; j <= tubularSegments; j ++ ) {\n\n\t\t\tfor ( let i = 1; i <= radialSegments; i ++ ) {\n\n\t\t\t\t// indices\n\n\t\t\t\tconst a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 );\n\t\t\t\tconst b = ( radialSegments + 1 ) * j + ( i - 1 );\n\t\t\t\tconst c = ( radialSegments + 1 ) * j + i;\n\t\t\t\tconst d = ( radialSegments + 1 ) * ( j - 1 ) + i;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\t// this function calculates the current position on the torus curve\n\n\t\tfunction calculatePositionOnCurve( u, p, q, radius, position ) {\n\n\t\t\tconst cu = Math.cos( u );\n\t\t\tconst su = Math.sin( u );\n\t\t\tconst quOverP = q / p * u;\n\t\t\tconst cs = Math.cos( quOverP );\n\n\t\t\tposition.x = radius * ( 2 + cs ) * 0.5 * cu;\n\t\t\tposition.y = radius * ( 2 + cs ) * su * 0.5;\n\t\t\tposition.z = radius * Math.sin( quOverP ) * 0.5;\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {TorusKnotGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new TorusKnotGeometry( data.radius, data.tube, data.tubularSegments, data.radialSegments, data.p, data.q );\n\n\t}\n\n}\n\n/**\n * Creates a tube that extrudes along a 3D curve.\n *\n * ```js\n * class CustomSinCurve extends THREE.Curve {\n *\n * \tgetPoint( t, optionalTarget = new THREE.Vector3() ) {\n *\n * \t\tconst tx = t * 3 - 1.5;\n * \t\tconst ty = Math.sin( 2 * Math.PI * t );\n * \t\tconst tz = 0;\n *\n * \t\treturn optionalTarget.set( tx, ty, tz );\n * \t}\n *\n * }\n *\n * const path = new CustomSinCurve( 10 );\n * const geometry = new THREE.TubeGeometry( path, 20, 2, 8, false );\n * const material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );\n * const mesh = new THREE.Mesh( geometry, material );\n * scene.add( mesh );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#TubeGeometry\n */\nclass TubeGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new tube geometry.\n\t *\n\t * @param {Curve} [path=QuadraticBezierCurve3] - A 3D curve defining the path of the tube.\n\t * @param {number} [tubularSegments=64] - The number of segments that make up the tube.\n\t * @param {number} [radius=1] -The radius of the tube.\n\t * @param {number} [radialSegments=8] - The number of segments that make up the cross-section.\n\t * @param {boolean} [closed=false] - Whether the tube is closed or not.\n\t */\n\tconstructor( path = new QuadraticBezierCurve3( new Vector3( -1, -1, 0 ), new Vector3( -1, 1, 0 ), new Vector3( 1, 1, 0 ) ), tubularSegments = 64, radius = 1, radialSegments = 8, closed = false ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'TubeGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tpath: path,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tradius: radius,\n\t\t\tradialSegments: radialSegments,\n\t\t\tclosed: closed\n\t\t};\n\n\t\tconst frames = path.computeFrenetFrames( tubularSegments, closed );\n\n\t\t// expose internals\n\n\t\tthis.tangents = frames.tangents;\n\t\tthis.normals = frames.normals;\n\t\tthis.binormals = frames.binormals;\n\n\t\t// helper variables\n\n\t\tconst vertex = new Vector3();\n\t\tconst normal = new Vector3();\n\t\tconst uv = new Vector2();\n\t\tlet P = new Vector3();\n\n\t\t// buffer\n\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\t\tconst indices = [];\n\n\t\t// create buffer data\n\n\t\tgenerateBufferData();\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\t// functions\n\n\t\tfunction generateBufferData() {\n\n\t\t\tfor ( let i = 0; i < tubularSegments; i ++ ) {\n\n\t\t\t\tgenerateSegment( i );\n\n\t\t\t}\n\n\t\t\t// if the geometry is not closed, generate the last row of vertices and normals\n\t\t\t// at the regular position on the given path\n\t\t\t//\n\t\t\t// if the geometry is closed, duplicate the first row of vertices and normals (uvs will differ)\n\n\t\t\tgenerateSegment( ( closed === false ) ? tubularSegments : 0 );\n\n\t\t\t// uvs are generated in a separate function.\n\t\t\t// this makes it easy compute correct values for closed geometries\n\n\t\t\tgenerateUVs();\n\n\t\t\t// finally create faces\n\n\t\t\tgenerateIndices();\n\n\t\t}\n\n\t\tfunction generateSegment( i ) {\n\n\t\t\t// we use getPointAt to sample evenly distributed points from the given path\n\n\t\t\tP = path.getPointAt( i / tubularSegments, P );\n\n\t\t\t// retrieve corresponding normal and binormal\n\n\t\t\tconst N = frames.normals[ i ];\n\t\t\tconst B = frames.binormals[ i ];\n\n\t\t\t// generate normals and vertices for the current segment\n\n\t\t\tfor ( let j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\t\tconst v = j / radialSegments * Math.PI * 2;\n\n\t\t\t\tconst sin = Math.sin( v );\n\t\t\t\tconst cos = - Math.cos( v );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormal.x = ( cos * N.x + sin * B.x );\n\t\t\t\tnormal.y = ( cos * N.y + sin * B.y );\n\t\t\t\tnormal.z = ( cos * N.z + sin * B.z );\n\t\t\t\tnormal.normalize();\n\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = P.x + radius * normal.x;\n\t\t\t\tvertex.y = P.y + radius * normal.y;\n\t\t\t\tvertex.z = P.z + radius * normal.z;\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction generateIndices() {\n\n\t\t\tfor ( let j = 1; j <= tubularSegments; j ++ ) {\n\n\t\t\t\tfor ( let i = 1; i <= radialSegments; i ++ ) {\n\n\t\t\t\t\tconst a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 );\n\t\t\t\t\tconst b = ( radialSegments + 1 ) * j + ( i - 1 );\n\t\t\t\t\tconst c = ( radialSegments + 1 ) * j + i;\n\t\t\t\t\tconst d = ( radialSegments + 1 ) * ( j - 1 ) + i;\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tindices.push( a, b, d );\n\t\t\t\t\tindices.push( b, c, d );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction generateUVs() {\n\n\t\t\tfor ( let i = 0; i <= tubularSegments; i ++ ) {\n\n\t\t\t\tfor ( let j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\t\t\tuv.x = i / tubularSegments;\n\t\t\t\t\tuv.y = j / radialSegments;\n\n\t\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.path = this.parameters.path.toJSON();\n\n\t\treturn data;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {TubeGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\t// This only works for built-in curves (e.g. CatmullRomCurve3).\n\t\t// User defined curves or instances of CurvePath will not be deserialized.\n\t\treturn new TubeGeometry(\n\t\t\tnew Curves[ data.path.type ]().fromJSON( data.path ),\n\t\t\tdata.tubularSegments,\n\t\t\tdata.radius,\n\t\t\tdata.radialSegments,\n\t\t\tdata.closed\n\t\t);\n\n\t}\n\n}\n\n/**\n * Can be used as a helper object to visualize a geometry as a wireframe.\n *\n * ```js\n * const geometry = new THREE.SphereGeometry();\n *\n * const wireframe = new THREE.WireframeGeometry( geometry );\n *\n * const line = new THREE.LineSegments( wireframe );\n * line.material.depthWrite = false;\n * line.material.opacity = 0.25;\n * line.material.transparent = true;\n *\n * scene.add( line );\n * ```\n *\n * Note: It is not yet possible to serialize/deserialize instances of this class.\n *\n * @augments BufferGeometry\n */\nclass WireframeGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new wireframe geometry.\n\t *\n\t * @param {?BufferGeometry} [geometry=null] - The geometry.\n\t */\n\tconstructor( geometry = null ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'WireframeGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tgeometry: geometry\n\t\t};\n\n\t\tif ( geometry !== null ) {\n\n\t\t\t// buffer\n\n\t\t\tconst vertices = [];\n\t\t\tconst edges = new Set();\n\n\t\t\t// helper variables\n\n\t\t\tconst start = new Vector3();\n\t\t\tconst end = new Vector3();\n\n\t\t\tif ( geometry.index !== null ) {\n\n\t\t\t\t// indexed BufferGeometry\n\n\t\t\t\tconst position = geometry.attributes.position;\n\t\t\t\tconst indices = geometry.index;\n\t\t\t\tlet groups = geometry.groups;\n\n\t\t\t\tif ( groups.length === 0 ) {\n\n\t\t\t\t\tgroups = [ { start: 0, count: indices.count, materialIndex: 0 } ];\n\n\t\t\t\t}\n\n\t\t\t\t// create a data structure that contains all edges without duplicates\n\n\t\t\t\tfor ( let o = 0, ol = groups.length; o < ol; ++ o ) {\n\n\t\t\t\t\tconst group = groups[ o ];\n\n\t\t\t\t\tconst groupStart = group.start;\n\t\t\t\t\tconst groupCount = group.count;\n\n\t\t\t\t\tfor ( let i = groupStart, l = ( groupStart + groupCount ); i < l; i += 3 ) {\n\n\t\t\t\t\t\tfor ( let j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\t\tconst index1 = indices.getX( i + j );\n\t\t\t\t\t\t\tconst index2 = indices.getX( i + ( j + 1 ) % 3 );\n\n\t\t\t\t\t\t\tstart.fromBufferAttribute( position, index1 );\n\t\t\t\t\t\t\tend.fromBufferAttribute( position, index2 );\n\n\t\t\t\t\t\t\tif ( isUniqueEdge( start, end, edges ) === true ) {\n\n\t\t\t\t\t\t\t\tvertices.push( start.x, start.y, start.z );\n\t\t\t\t\t\t\t\tvertices.push( end.x, end.y, end.z );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// non-indexed BufferGeometry\n\n\t\t\t\tconst position = geometry.attributes.position;\n\n\t\t\t\tfor ( let i = 0, l = ( position.count / 3 ); i < l; i ++ ) {\n\n\t\t\t\t\tfor ( let j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\t// three edges per triangle, an edge is represented as (index1, index2)\n\t\t\t\t\t\t// e.g. the first triangle has the following edges: (0,1),(1,2),(2,0)\n\n\t\t\t\t\t\tconst index1 = 3 * i + j;\n\t\t\t\t\t\tconst index2 = 3 * i + ( ( j + 1 ) % 3 );\n\n\t\t\t\t\t\tstart.fromBufferAttribute( position, index1 );\n\t\t\t\t\t\tend.fromBufferAttribute( position, index2 );\n\n\t\t\t\t\t\tif ( isUniqueEdge( start, end, edges ) === true ) {\n\n\t\t\t\t\t\t\tvertices.push( start.x, start.y, start.z );\n\t\t\t\t\t\t\tvertices.push( end.x, end.y, end.z );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// build geometry\n\n\t\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n}\n\nfunction isUniqueEdge( start, end, edges ) {\n\n\tconst hash1 = `${start.x},${start.y},${start.z}-${end.x},${end.y},${end.z}`;\n\tconst hash2 = `${end.x},${end.y},${end.z}-${start.x},${start.y},${start.z}`; // coincident edge\n\n\tif ( edges.has( hash1 ) === true || edges.has( hash2 ) === true ) {\n\n\t\treturn false;\n\n\t} else {\n\n\t\tedges.add( hash1 );\n\t\tedges.add( hash2 );\n\t\treturn true;\n\n\t}\n\n}\n\nvar Geometries = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\tBoxGeometry: BoxGeometry,\n\tCapsuleGeometry: CapsuleGeometry,\n\tCircleGeometry: CircleGeometry,\n\tConeGeometry: ConeGeometry,\n\tCylinderGeometry: CylinderGeometry,\n\tDodecahedronGeometry: DodecahedronGeometry,\n\tEdgesGeometry: EdgesGeometry,\n\tExtrudeGeometry: ExtrudeGeometry,\n\tIcosahedronGeometry: IcosahedronGeometry,\n\tLatheGeometry: LatheGeometry,\n\tOctahedronGeometry: OctahedronGeometry,\n\tPlaneGeometry: PlaneGeometry,\n\tPolyhedronGeometry: PolyhedronGeometry,\n\tRingGeometry: RingGeometry,\n\tShapeGeometry: ShapeGeometry,\n\tSphereGeometry: SphereGeometry,\n\tTetrahedronGeometry: TetrahedronGeometry,\n\tTorusGeometry: TorusGeometry,\n\tTorusKnotGeometry: TorusKnotGeometry,\n\tTubeGeometry: TubeGeometry,\n\tWireframeGeometry: WireframeGeometry\n});\n\n/**\n * This material can receive shadows, but otherwise is completely transparent.\n *\n * ```js\n * const geometry = new THREE.PlaneGeometry( 2000, 2000 );\n * geometry.rotateX( - Math.PI / 2 );\n *\n * const material = new THREE.ShadowMaterial();\n * material.opacity = 0.2;\n *\n * const plane = new THREE.Mesh( geometry, material );\n * plane.position.y = -200;\n * plane.receiveShadow = true;\n * scene.add( plane );\n * ```\n *\n * @augments Material\n */\nclass ShadowMaterial extends Material {\n\n\t/**\n\t * Constructs a new shadow material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isShadowMaterial = true;\n\n\t\tthis.type = 'ShadowMaterial';\n\n\t\t/**\n\t\t * Color of the material.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.color = new Color( 0x000000 );\n\n\t\t/**\n\t\t * Overwritten since shadow materials are transparent\n\t\t * by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.transparent = true;\n\n\t\t/**\n\t\t * Whether the material is affected by fog or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * This class works just like {@link ShaderMaterial}, except that definitions\n * of built-in uniforms and attributes are not automatically prepended to the\n * GLSL shader code.\n *\n * `RawShaderMaterial` can only be used with {@link WebGLRenderer}.\n *\n * @augments ShaderMaterial\n */\nclass RawShaderMaterial extends ShaderMaterial {\n\n\t/**\n\t * Constructs a new raw shader material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper( parameters );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isRawShaderMaterial = true;\n\n\t\tthis.type = 'RawShaderMaterial';\n\n\t}\n\n}\n\n/**\n * A standard physically based material, using Metallic-Roughness workflow.\n *\n * Physically based rendering (PBR) has recently become the standard in many\n * 3D applications, such as [Unity](https://blogs.unity3d.com/2014/10/29/physically-based-shading-in-unity-5-a-primer/),\n * [Unreal](https://docs.unrealengine.com/latest/INT/Engine/Rendering/Materials/PhysicallyBased/) and\n * [3D Studio Max](http://area.autodesk.com/blogs/the-3ds-max-blog/what039s-new-for-rendering-in-3ds-max-2017).\n *\n * This approach differs from older approaches in that instead of using\n * approximations for the way in which light interacts with a surface, a\n * physically correct model is used. The idea is that, instead of tweaking\n * materials to look good under specific lighting, a material can be created\n * that will react 'correctly' under all lighting scenarios.\n *\n * In practice this gives a more accurate and realistic looking result than\n * the {@link MeshLambertMaterial} or {@link MeshPhongMaterial}, at the cost of\n * being somewhat more computationally expensive. `MeshStandardMaterial` uses per-fragment\n * shading.\n *\n * Note that for best results you should always specify an environment map when using this material.\n *\n * For a non-technical introduction to the concept of PBR and how to set up a\n * PBR material, check out these articles by the people at [marmoset](https://www.marmoset.co):\n *\n * - [Basic Theory of Physically Based Rendering](https://www.marmoset.co/posts/basic-theory-of-physically-based-rendering/)\n * - [Physically Based Rendering and You Can Too](https://www.marmoset.co/posts/physically-based-rendering-and-you-can-too/)\n *\n * Technical details of the approach used in three.js (and most other PBR systems) can be found is this\n * [paper from Disney](https://media.disneyanimation.com/uploads/production/publication_asset/48/asset/s2012_pbs_disney_brdf_notes_v3.pdf)\n * (pdf), by Brent Burley.\n *\n * @augments Material\n * @demo scenes/material-browser.html#MeshStandardMaterial\n */\nclass MeshStandardMaterial extends Material {\n\n\t/**\n\t * Constructs a new mesh standard material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshStandardMaterial = true;\n\n\t\tthis.type = 'MeshStandardMaterial';\n\n\t\tthis.defines = { 'STANDARD': '' };\n\n\t\t/**\n\t\t * Color of the material.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\n\t\t/**\n\t\t * How rough the material appears. `0.0` means a smooth mirror reflection, `1.0`\n\t\t * means fully diffuse. If `roughnessMap` is also provided,\n\t\t * both values are multiplied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.roughness = 1.0;\n\n\t\t/**\n\t\t * How much the material is like a metal. Non-metallic materials such as wood\n\t\t * or stone use `0.0`, metallic use `1.0`, with nothing (usually) in between.\n\t\t * A value between `0.0` and `1.0` could be used for a rusty metal look.\n\t\t * If `metalnessMap` is also provided, both values are multiplied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.metalness = 0.0;\n\n\t\t/**\n\t\t * The color map. May optionally include an alpha channel, typically combined\n\t\t * with {@link Material#transparent} or {@link Material#alphaTest}. The texture map\n\t\t * color is modulated by the diffuse `color`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * The light map. Requires a second set of UVs.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.lightMap = null;\n\n\t\t/**\n\t\t * Intensity of the baked light.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\t/**\n\t\t * The red channel of this texture is used as the ambient occlusion map.\n\t\t * Requires a second set of UVs.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.aoMap = null;\n\n\t\t/**\n\t\t * Intensity of the ambient occlusion effect. Range is `[0,1]`, where `0`\n\t\t * disables ambient occlusion. Where intensity is `1` and the AO map's\n\t\t * red channel is also `1`, ambient light is fully occluded on a surface.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\t/**\n\t\t * Emissive (light) color of the material, essentially a solid color\n\t\t * unaffected by other lighting.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.emissive = new Color( 0x000000 );\n\n\t\t/**\n\t\t * Intensity of the emissive light. Modulates the emissive color.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.emissiveIntensity = 1.0;\n\n\t\t/**\n\t\t * Set emissive (glow) map. The emissive map color is modulated by the\n\t\t * emissive color and the emissive intensity. If you have an emissive map,\n\t\t * be sure to set the emissive color to something other than black.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.emissiveMap = null;\n\n\t\t/**\n\t\t * The texture to create a bump map. The black and white values map to the\n\t\t * perceived depth in relation to the lights. Bump doesn't actually affect\n\t\t * the geometry of the object, only the lighting. If a normal map is defined\n\t\t * this will be ignored.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.bumpMap = null;\n\n\t\t/**\n\t\t * How much the bump map affects the material. Typical range is `[0,1]`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.bumpScale = 1;\n\n\t\t/**\n\t\t * The texture to create a normal map. The RGB values affect the surface\n\t\t * normal for each pixel fragment and change the way the color is lit. Normal\n\t\t * maps do not change the actual shape of the surface, only the lighting. In\n\t\t * case the material has a normal map authored using the left handed\n\t\t * convention, the `y` component of `normalScale` should be negated to compensate\n\t\t * for the different handedness.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.normalMap = null;\n\n\t\t/**\n\t\t * The type of normal map.\n\t\t *\n\t\t * @type {(TangentSpaceNormalMap|ObjectSpaceNormalMap)}\n\t\t * @default TangentSpaceNormalMap\n\t\t */\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\n\t\t/**\n\t\t * How much the normal map affects the material. Typical value range is `[0,1]`.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (1,1)\n\t\t */\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\t/**\n\t\t * The displacement map affects the position of the mesh's vertices. Unlike\n\t\t * other maps which only affect the light and shade of the material the\n\t\t * displaced vertices can cast shadows, block other objects, and otherwise\n\t\t * act as real geometry. The displacement texture is an image where the value\n\t\t * of each pixel (white being the highest) is mapped against, and\n\t\t * repositions, the vertices of the mesh.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.displacementMap = null;\n\n\t\t/**\n\t\t * How much the displacement map affects the mesh (where black is no\n\t\t * displacement, and white is maximum displacement). Without a displacement\n\t\t * map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementScale = 1;\n\n\t\t/**\n\t\t * The offset of the displacement map's values on the mesh's vertices.\n\t\t * The bias is added to the scaled sample of the displacement map.\n\t\t * Without a displacement map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementBias = 0;\n\n\t\t/**\n\t\t * The green channel of this texture is used to alter the roughness of the\n\t\t * material.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.roughnessMap = null;\n\n\t\t/**\n\t\t * The blue channel of this texture is used to alter the metalness of the\n\t\t * material.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.metalnessMap = null;\n\n\t\t/**\n\t\t * The alpha map is a grayscale texture that controls the opacity across the\n\t\t * surface (black: fully transparent; white: fully opaque).\n\t\t *\n\t\t * Only the color of the texture is used, ignoring the alpha channel if one\n\t\t * exists. For RGB and RGBA textures, the renderer will use the green channel\n\t\t * when sampling this texture due to the extra bit of precision provided for\n\t\t * green in DXT-compressed and uncompressed RGB 565 formats. Luminance-only and\n\t\t * luminance/alpha textures will also still work as expected.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.alphaMap = null;\n\n\t\t/**\n\t\t * The environment map. To ensure a physically correct rendering, environment maps\n\t\t * are internally pre-processed with {@link PMREMGenerator}.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.envMap = null;\n\n\t\t/**\n\t\t * The rotation of the environment map in radians.\n\t\t *\n\t\t * @type {Euler}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.envMapRotation = new Euler();\n\n\t\t/**\n\t\t * Scales the effect of the environment map by multiplying its color.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.envMapIntensity = 1.0;\n\n\t\t/**\n\t\t * Renders the geometry as a wireframe.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.wireframe = false;\n\n\t\t/**\n\t\t * Controls the thickness of the wireframe.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.wireframeLinewidth = 1;\n\n\t\t/**\n\t\t * Defines appearance of wireframe ends.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.wireframeLinecap = 'round';\n\n\t\t/**\n\t\t * Defines appearance of wireframe joints.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\t/**\n\t\t * Whether the material is rendered with flat shading or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.flatShading = false;\n\n\t\t/**\n\t\t * Whether the material is affected by fog or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.defines = { 'STANDARD': '' };\n\n\t\tthis.color.copy( source.color );\n\t\tthis.roughness = source.roughness;\n\t\tthis.metalness = source.metalness;\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.roughnessMap = source.roughnessMap;\n\n\t\tthis.metalnessMap = source.metalnessMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.envMapRotation.copy( source.envMapRotation );\n\t\tthis.envMapIntensity = source.envMapIntensity;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.flatShading = source.flatShading;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * An extension of the {@link MeshStandardMaterial}, providing more advanced\n * physically-based rendering properties:\n *\n * - Anisotropy: Ability to represent the anisotropic property of materials\n * as observable with brushed metals.\n * - Clearcoat: Some materials — like car paints, carbon fiber, and wet surfaces — require\n * a clear, reflective layer on top of another layer that may be irregular or rough.\n * Clearcoat approximates this effect, without the need for a separate transparent surface.\n * - Iridescence: Allows to render the effect where hue varies  depending on the viewing\n * angle and illumination angle. This can be seen on soap bubbles, oil films, or on the\n * wings of many insects.\n * - Physically-based transparency: One limitation of {@link Material#opacity} is that highly\n * transparent materials are less reflective. Physically-based transmission provides a more\n * realistic option for thin, transparent surfaces like glass.\n * - Advanced reflectivity: More flexible reflectivity for non-metallic materials.\n * - Sheen: Can be used for representing cloth and fabric materials.\n *\n * As a result of these complex shading features, `MeshPhysicalMaterial` has a\n * higher performance cost, per pixel, than other three.js materials. Most\n * effects are disabled by default, and add cost as they are enabled. For\n * best results, always specify an environment map when using this material.\n *\n * @augments MeshStandardMaterial\n * @demo scenes/material-browser.html#MeshPhysicalMaterial\n */\nclass MeshPhysicalMaterial extends MeshStandardMaterial {\n\n\t/**\n\t * Constructs a new mesh physical material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshPhysicalMaterial = true;\n\n\t\tthis.defines = {\n\n\t\t\t'STANDARD': '',\n\t\t\t'PHYSICAL': ''\n\n\t\t};\n\n\t\tthis.type = 'MeshPhysicalMaterial';\n\n\t\t/**\n\t\t * The rotation of the anisotropy in tangent, bitangent space, measured in radians\n\t\t * counter-clockwise from the tangent. When `anisotropyMap` is present, this\n\t\t * property provides additional rotation to the vectors in the texture.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.anisotropyRotation = 0;\n\n\t\t/**\n\t\t * Red and green channels represent the anisotropy direction in `[-1, 1]` tangent,\n\t\t * bitangent space, to be rotated by `anisotropyRotation`. The blue channel\n\t\t * contains strength as `[0, 1]` to be multiplied by `anisotropy`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.anisotropyMap = null;\n\n\t\t/**\n\t\t * The red channel of this texture is multiplied against `clearcoat`,\n\t\t * for per-pixel control over a coating's intensity.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.clearcoatMap = null;\n\n\t\t/**\n\t\t * Roughness of the clear coat layer, from `0.0` to `1.0`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.clearcoatRoughness = 0.0;\n\n\t\t/**\n\t\t * The green channel of this texture is multiplied against\n\t\t * `clearcoatRoughness`, for per-pixel control over a coating's roughness.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.clearcoatRoughnessMap = null;\n\n\t\t/**\n\t\t * How much `clearcoatNormalMap` affects the clear coat layer, from\n\t\t * `(0,0)` to `(1,1)`.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (1,1)\n\t\t */\n\t\tthis.clearcoatNormalScale = new Vector2( 1, 1 );\n\n\t\t/**\n\t\t * Can be used to enable independent normals for the clear coat layer.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.clearcoatNormalMap = null;\n\n\t\t/**\n\t\t * Index-of-refraction for non-metallic materials, from `1.0` to `2.333`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1.5\n\t\t */\n\t\tthis.ior = 1.5;\n\n\t\t/**\n\t\t * Degree of reflectivity, from `0.0` to `1.0`. Default is `0.5`, which\n\t\t * corresponds to an index-of-refraction of `1.5`.\n\t\t *\n\t\t * This models the reflectivity of non-metallic materials. It has no effect\n\t\t * when `metalness` is `1.0`\n\t\t *\n\t\t * @name MeshPhysicalMaterial#reflectivity\n\t\t * @type {number}\n\t\t * @default 0.5\n\t\t */\n\t\tObject.defineProperty( this, 'reflectivity', {\n\t\t\tget: function () {\n\n\t\t\t\treturn ( clamp( 2.5 * ( this.ior - 1 ) / ( this.ior + 1 ), 0, 1 ) );\n\n\t\t\t},\n\t\t\tset: function ( reflectivity ) {\n\n\t\t\t\tthis.ior = ( 1 + 0.4 * reflectivity ) / ( 1 - 0.4 * reflectivity );\n\n\t\t\t}\n\t\t} );\n\n\t\t/**\n\t\t * The red channel of this texture is multiplied against `iridescence`, for per-pixel\n\t\t * control over iridescence.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.iridescenceMap = null;\n\n\t\t/**\n\t\t * Strength of the iridescence RGB color shift effect, represented by an index-of-refraction.\n\t\t * Between `1.0` to `2.333`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1.3\n\t\t */\n\t\tthis.iridescenceIOR = 1.3;\n\n\t\t/**\n\t\t *Array of exactly 2 elements, specifying minimum and maximum thickness of the iridescence layer.\n\t\t Thickness of iridescence layer has an equivalent effect of the one `thickness` has on `ior`.\n\t\t *\n\t\t * @type {Array<number,number>}\n\t\t * @default [100,400]\n\t\t */\n\t\tthis.iridescenceThicknessRange = [ 100, 400 ];\n\n\t\t/**\n\t\t * A texture that defines the thickness of the iridescence layer, stored in the green channel.\n\t\t * Minimum and maximum values of thickness are defined by `iridescenceThicknessRange` array:\n\t\t * - `0.0` in the green channel will result in thickness equal to first element of the array.\n\t\t * - `1.0` in the green channel will result in thickness equal to second element of the array.\n\t\t * - Values in-between will linearly interpolate between the elements of the array.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.iridescenceThicknessMap = null;\n\n\t\t/**\n\t\t * The sheen tint.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.sheenColor = new Color( 0x000000 );\n\n\t\t/**\n\t\t * The RGB channels of this texture are multiplied against  `sheenColor`, for per-pixel control\n\t\t * over sheen tint.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.sheenColorMap = null;\n\n\t\t/**\n\t\t * Roughness of the sheen layer, from `0.0` to `1.0`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.sheenRoughness = 1.0;\n\n\t\t/**\n\t\t * The alpha channel of this texture is multiplied against `sheenRoughness`, for per-pixel control\n\t\t * over sheen roughness.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.sheenRoughnessMap = null;\n\n\t\t/**\n\t\t * The red channel of this texture is multiplied against `transmission`, for per-pixel control over\n\t\t * optical transparency.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.transmissionMap = null;\n\n\t\t/**\n\t\t * The thickness of the volume beneath the surface. The value is given in the\n\t\t * coordinate space of the mesh. If the value is `0` the material is\n\t\t * thin-walled. Otherwise the material is a volume boundary.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.thickness = 0;\n\n\t\t/**\n\t\t * A texture that defines the thickness, stored in the green channel. This will\n\t\t * be multiplied by `thickness`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.thicknessMap = null;\n\n\t\t/**\n\t\t * Density of the medium given as the average distance that light travels in\n\t\t * the medium before interacting with a particle. The value is given in world\n\t\t * space units, and must be greater than zero.\n\t\t *\n\t\t * @type {number}\n\t\t * @default Infinity\n\t\t */\n\t\tthis.attenuationDistance = Infinity;\n\n\t\t/**\n\t\t * The color that white light turns into due to absorption when reaching the\n\t\t * attenuation distance.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.attenuationColor = new Color( 1, 1, 1 );\n\n\t\t/**\n\t\t * A float that scales the amount of specular reflection for non-metals only.\n\t\t * When set to zero, the model is effectively Lambertian. From `0.0` to `1.0`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.specularIntensity = 1.0;\n\n\t\t/**\n\t\t * The alpha channel of this texture is multiplied against `specularIntensity`,\n\t\t * for per-pixel control over specular intensity.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.specularIntensityMap = null;\n\n\t\t/**\n\t\t * Tints the specular reflection at normal incidence for non-metals only.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.specularColor = new Color( 1, 1, 1 );\n\n\t\t/**\n\t\t * The RGB channels of this texture are multiplied against `specularColor`,\n\t\t * for per-pixel control over specular color.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.specularColorMap = null;\n\n\t\tthis._anisotropy = 0;\n\t\tthis._clearcoat = 0;\n\t\tthis._dispersion = 0;\n\t\tthis._iridescence = 0;\n\t\tthis._sheen = 0.0;\n\t\tthis._transmission = 0;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\t/**\n\t * The anisotropy strength, from `0.0` to `1.0`.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget anisotropy() {\n\n\t\treturn this._anisotropy;\n\n\t}\n\n\tset anisotropy( value ) {\n\n\t\tif ( this._anisotropy > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._anisotropy = value;\n\n\t}\n\n\t/**\n\t * Represents the intensity of the clear coat layer, from `0.0` to `1.0`. Use\n\t * clear coat related properties to enable multilayer materials that have a\n\t * thin translucent layer over the base layer.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget clearcoat() {\n\n\t\treturn this._clearcoat;\n\n\t}\n\n\tset clearcoat( value ) {\n\n\t\tif ( this._clearcoat > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._clearcoat = value;\n\n\t}\n\t/**\n\t * The intensity of the iridescence layer, simulating RGB color shift based on the angle between\n\t * the surface and the viewer, from `0.0` to `1.0`.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget iridescence() {\n\n\t\treturn this._iridescence;\n\n\t}\n\n\tset iridescence( value ) {\n\n\t\tif ( this._iridescence > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._iridescence = value;\n\n\t}\n\n\t/**\n\t * Defines the strength of the angular separation of colors (chromatic aberration) transmitting\n\t * through a relatively clear volume. Any value zero or larger is valid, the typical range of\n\t * realistic values is `[0, 1]`. This property can be only be used with transmissive objects.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget dispersion() {\n\n\t\treturn this._dispersion;\n\n\t}\n\n\tset dispersion( value ) {\n\n\t\tif ( this._dispersion > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._dispersion = value;\n\n\t}\n\n\t/**\n\t * The intensity of the sheen layer, from `0.0` to `1.0`.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget sheen() {\n\n\t\treturn this._sheen;\n\n\t}\n\n\tset sheen( value ) {\n\n\t\tif ( this._sheen > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._sheen = value;\n\n\t}\n\n\t/**\n\t * Degree of transmission (or optical transparency), from `0.0` to `1.0`.\n\t *\n\t * Thin, transparent or semitransparent, plastic or glass materials remain\n\t * largely reflective even if they are fully transmissive. The transmission\n\t * property can be used to model these materials.\n\t *\n\t * When transmission is non-zero, `opacity` should be  set to `1`.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget transmission() {\n\n\t\treturn this._transmission;\n\n\t}\n\n\tset transmission( value ) {\n\n\t\tif ( this._transmission > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._transmission = value;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.defines = {\n\n\t\t\t'STANDARD': '',\n\t\t\t'PHYSICAL': ''\n\n\t\t};\n\n\t\tthis.anisotropy = source.anisotropy;\n\t\tthis.anisotropyRotation = source.anisotropyRotation;\n\t\tthis.anisotropyMap = source.anisotropyMap;\n\n\t\tthis.clearcoat = source.clearcoat;\n\t\tthis.clearcoatMap = source.clearcoatMap;\n\t\tthis.clearcoatRoughness = source.clearcoatRoughness;\n\t\tthis.clearcoatRoughnessMap = source.clearcoatRoughnessMap;\n\t\tthis.clearcoatNormalMap = source.clearcoatNormalMap;\n\t\tthis.clearcoatNormalScale.copy( source.clearcoatNormalScale );\n\n\t\tthis.dispersion = source.dispersion;\n\t\tthis.ior = source.ior;\n\n\t\tthis.iridescence = source.iridescence;\n\t\tthis.iridescenceMap = source.iridescenceMap;\n\t\tthis.iridescenceIOR = source.iridescenceIOR;\n\t\tthis.iridescenceThicknessRange = [ ...source.iridescenceThicknessRange ];\n\t\tthis.iridescenceThicknessMap = source.iridescenceThicknessMap;\n\n\t\tthis.sheen = source.sheen;\n\t\tthis.sheenColor.copy( source.sheenColor );\n\t\tthis.sheenColorMap = source.sheenColorMap;\n\t\tthis.sheenRoughness = source.sheenRoughness;\n\t\tthis.sheenRoughnessMap = source.sheenRoughnessMap;\n\n\t\tthis.transmission = source.transmission;\n\t\tthis.transmissionMap = source.transmissionMap;\n\n\t\tthis.thickness = source.thickness;\n\t\tthis.thicknessMap = source.thicknessMap;\n\t\tthis.attenuationDistance = source.attenuationDistance;\n\t\tthis.attenuationColor.copy( source.attenuationColor );\n\n\t\tthis.specularIntensity = source.specularIntensity;\n\t\tthis.specularIntensityMap = source.specularIntensityMap;\n\t\tthis.specularColor.copy( source.specularColor );\n\t\tthis.specularColorMap = source.specularColorMap;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A material for shiny surfaces with specular highlights.\n *\n * The material uses a non-physically based [Blinn-Phong](https://en.wikipedia.org/wiki/Blinn-Phong_shading_model)\n * model for calculating reflectance. Unlike the Lambertian model used in the\n * {@link MeshLambertMaterial} this can simulate shiny surfaces with specular\n * highlights (such as varnished wood). `MeshPhongMaterial` uses per-fragment shading.\n *\n * Performance will generally be greater when using this material over the\n * {@link MeshStandardMaterial} or {@link MeshPhysicalMaterial}, at the cost of\n * some graphical accuracy.\n *\n * @augments Material\n * @demo scenes/material-browser.html#MeshPhongMaterial\n */\nclass MeshPhongMaterial extends Material {\n\n\t/**\n\t * Constructs a new mesh phong material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshPhongMaterial = true;\n\n\t\tthis.type = 'MeshPhongMaterial';\n\n\t\t/**\n\t\t * Color of the material.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\n\t\t/**\n\t\t * Specular color of the material. The default color is set to `0x111111` (very dark grey)\n\t\t *\n\t\t * This defines how shiny the material is and the color of its shine.\n\t\t *\n\t\t * @type {Color}\n\t\t */\n\t\tthis.specular = new Color( 0x111111 );\n\n\t\t/**\n\t\t * How shiny the specular highlight is; a higher value gives a sharper highlight.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 30\n\t\t */\n\t\tthis.shininess = 30;\n\n\t\t/**\n\t\t * The color map. May optionally include an alpha channel, typically combined\n\t\t * with {@link Material#transparent} or {@link Material#alphaTest}. The texture map\n\t\t * color is modulated by the diffuse `color`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * The light map. Requires a second set of UVs.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.lightMap = null;\n\n\t\t/**\n\t\t * Intensity of the baked light.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\t/**\n\t\t * The red channel of this texture is used as the ambient occlusion map.\n\t\t * Requires a second set of UVs.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.aoMap = null;\n\n\t\t/**\n\t\t * Intensity of the ambient occlusion effect. Range is `[0,1]`, where `0`\n\t\t * disables ambient occlusion. Where intensity is `1` and the AO map's\n\t\t * red channel is also `1`, ambient light is fully occluded on a surface.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\t/**\n\t\t * Emissive (light) color of the material, essentially a solid color\n\t\t * unaffected by other lighting.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.emissive = new Color( 0x000000 );\n\n\t\t/**\n\t\t * Intensity of the emissive light. Modulates the emissive color.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.emissiveIntensity = 1.0;\n\n\t\t/**\n\t\t * Set emissive (glow) map. The emissive map color is modulated by the\n\t\t * emissive color and the emissive intensity. If you have an emissive map,\n\t\t * be sure to set the emissive color to something other than black.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.emissiveMap = null;\n\n\t\t/**\n\t\t * The texture to create a bump map. The black and white values map to the\n\t\t * perceived depth in relation to the lights. Bump doesn't actually affect\n\t\t * the geometry of the object, only the lighting. If a normal map is defined\n\t\t * this will be ignored.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.bumpMap = null;\n\n\t\t/**\n\t\t * How much the bump map affects the material. Typical range is `[0,1]`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.bumpScale = 1;\n\n\t\t/**\n\t\t * The texture to create a normal map. The RGB values affect the surface\n\t\t * normal for each pixel fragment and change the way the color is lit. Normal\n\t\t * maps do not change the actual shape of the surface, only the lighting. In\n\t\t * case the material has a normal map authored using the left handed\n\t\t * convention, the `y` component of `normalScale` should be negated to compensate\n\t\t * for the different handedness.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.normalMap = null;\n\n\t\t/**\n\t\t * The type of normal map.\n\t\t *\n\t\t * @type {(TangentSpaceNormalMap|ObjectSpaceNormalMap)}\n\t\t * @default TangentSpaceNormalMap\n\t\t */\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\n\t\t/**\n\t\t * How much the normal map affects the material. Typical value range is `[0,1]`.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (1,1)\n\t\t */\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\t/**\n\t\t * The displacement map affects the position of the mesh's vertices. Unlike\n\t\t * other maps which only affect the light and shade of the material the\n\t\t * displaced vertices can cast shadows, block other objects, and otherwise\n\t\t * act as real geometry. The displacement texture is an image where the value\n\t\t * of each pixel (white being the highest) is mapped against, and\n\t\t * repositions, the vertices of the mesh.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.displacementMap = null;\n\n\t\t/**\n\t\t * How much the displacement map affects the mesh (where black is no\n\t\t * displacement, and white is maximum displacement). Without a displacement\n\t\t * map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementScale = 1;\n\n\t\t/**\n\t\t * The offset of the displacement map's values on the mesh's vertices.\n\t\t * The bias is added to the scaled sample of the displacement map.\n\t\t * Without a displacement map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementBias = 0;\n\n\t\t/**\n\t\t * The specular map value affects both how much the specular surface\n\t\t * highlight contributes and how much of the environment map affects the\n\t\t * surface.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.specularMap = null;\n\n\t\t/**\n\t\t * The alpha map is a grayscale texture that controls the opacity across the\n\t\t * surface (black: fully transparent; white: fully opaque).\n\t\t *\n\t\t * Only the color of the texture is used, ignoring the alpha channel if one\n\t\t * exists. For RGB and RGBA textures, the renderer will use the green channel\n\t\t * when sampling this texture due to the extra bit of precision provided for\n\t\t * green in DXT-compressed and uncompressed RGB 565 formats. Luminance-only and\n\t\t * luminance/alpha textures will also still work as expected.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.alphaMap = null;\n\n\t\t/**\n\t\t * The environment map.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.envMap = null;\n\n\t\t/**\n\t\t * The rotation of the environment map in radians.\n\t\t *\n\t\t * @type {Euler}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.envMapRotation = new Euler();\n\n\t\t/**\n\t\t * How to combine the result of the surface's color with the environment map, if any.\n\t\t *\n\t\t * When set to `MixOperation`, the {@link MeshBasicMaterial#reflectivity} is used to\n\t\t * blend between the two colors.\n\t\t *\n\t\t * @type {(MultiplyOperation|MixOperation|AddOperation)}\n\t\t * @default MultiplyOperation\n\t\t */\n\t\tthis.combine = MultiplyOperation;\n\n\t\t/**\n\t\t * How much the environment map affects the surface.\n\t\t * The valid range is between `0` (no reflections) and `1` (full reflections).\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.reflectivity = 1;\n\n\t\t/**\n\t\t * The index of refraction (IOR) of air (approximately 1) divided by the\n\t\t * index of refraction of the material. It is used with environment mapping\n\t\t * modes {@link CubeRefractionMapping} and {@link EquirectangularRefractionMapping}.\n\t\t * The refraction ratio should not exceed `1`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.98\n\t\t */\n\t\tthis.refractionRatio = 0.98;\n\n\t\t/**\n\t\t * Renders the geometry as a wireframe.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.wireframe = false;\n\n\t\t/**\n\t\t * Controls the thickness of the wireframe.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.wireframeLinewidth = 1;\n\n\t\t/**\n\t\t * Defines appearance of wireframe ends.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.wireframeLinecap = 'round';\n\n\t\t/**\n\t\t * Defines appearance of wireframe joints.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\t/**\n\t\t * Whether the material is rendered with flat shading or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.flatShading = false;\n\n\t\t/**\n\t\t * Whether the material is affected by fog or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\t\tthis.specular.copy( source.specular );\n\t\tthis.shininess = source.shininess;\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.specularMap = source.specularMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.envMapRotation.copy( source.envMapRotation );\n\t\tthis.combine = source.combine;\n\t\tthis.reflectivity = source.reflectivity;\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.flatShading = source.flatShading;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A material implementing toon shading.\n *\n * @augments Material\n * @demo scenes/material-browser.html#MeshToonMaterial\n */\nclass MeshToonMaterial extends Material {\n\n\t/**\n\t * Constructs a new mesh toon material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshToonMaterial = true;\n\n\t\tthis.defines = { 'TOON': '' };\n\n\t\tthis.type = 'MeshToonMaterial';\n\n\t\t/**\n\t\t * Color of the material.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.color = new Color( 0xffffff );\n\n\t\t/**\n\t\t * The color map. May optionally include an alpha channel, typically combined\n\t\t * with {@link Material#transparent} or {@link Material#alphaTest}. The texture map\n\t\t * color is modulated by the diffuse `color`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * Gradient map for toon shading. It's required to set\n\t\t * {@link Texture#minFilter} and {@link Texture#magFilter} to {@linkNearestFilter}\n\t\t * when using this type of texture.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.gradientMap = null;\n\n\t\t/**\n\t\t * The light map. Requires a second set of UVs.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.lightMap = null;\n\n\t\t/**\n\t\t * Intensity of the baked light.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\t/**\n\t\t * The red channel of this texture is used as the ambient occlusion map.\n\t\t * Requires a second set of UVs.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.aoMap = null;\n\n\t\t/**\n\t\t * Intensity of the ambient occlusion effect. Range is `[0,1]`, where `0`\n\t\t * disables ambient occlusion. Where intensity is `1` and the AO map's\n\t\t * red channel is also `1`, ambient light is fully occluded on a surface.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\t/**\n\t\t * Emissive (light) color of the material, essentially a solid color\n\t\t * unaffected by other lighting.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.emissive = new Color( 0x000000 );\n\n\t\t/**\n\t\t * Intensity of the emissive light. Modulates the emissive color.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.emissiveIntensity = 1.0;\n\n\t\t/**\n\t\t * Set emissive (glow) map. The emissive map color is modulated by the\n\t\t * emissive color and the emissive intensity. If you have an emissive map,\n\t\t * be sure to set the emissive color to something other than black.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.emissiveMap = null;\n\n\t\t/**\n\t\t * The texture to create a bump map. The black and white values map to the\n\t\t * perceived depth in relation to the lights. Bump doesn't actually affect\n\t\t * the geometry of the object, only the lighting. If a normal map is defined\n\t\t * this will be ignored.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.bumpMap = null;\n\n\t\t/**\n\t\t * How much the bump map affects the material. Typical range is `[0,1]`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.bumpScale = 1;\n\n\t\t/**\n\t\t * The texture to create a normal map. The RGB values affect the surface\n\t\t * normal for each pixel fragment and change the way the color is lit. Normal\n\t\t * maps do not change the actual shape of the surface, only the lighting. In\n\t\t * case the material has a normal map authored using the left handed\n\t\t * convention, the `y` component of `normalScale` should be negated to compensate\n\t\t * for the different handedness.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.normalMap = null;\n\n\t\t/**\n\t\t * The type of normal map.\n\t\t *\n\t\t * @type {(TangentSpaceNormalMap|ObjectSpaceNormalMap)}\n\t\t * @default TangentSpaceNormalMap\n\t\t */\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\n\t\t/**\n\t\t * How much the normal map affects the material. Typical value range is `[0,1]`.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (1,1)\n\t\t */\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\t/**\n\t\t * The displacement map affects the position of the mesh's vertices. Unlike\n\t\t * other maps which only affect the light and shade of the material the\n\t\t * displaced vertices can cast shadows, block other objects, and otherwise\n\t\t * act as real geometry. The displacement texture is an image where the value\n\t\t * of each pixel (white being the highest) is mapped against, and\n\t\t * repositions, the vertices of the mesh.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.displacementMap = null;\n\n\t\t/**\n\t\t * How much the displacement map affects the mesh (where black is no\n\t\t * displacement, and white is maximum displacement). Without a displacement\n\t\t * map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementScale = 1;\n\n\t\t/**\n\t\t * The offset of the displacement map's values on the mesh's vertices.\n\t\t * The bias is added to the scaled sample of the displacement map.\n\t\t * Without a displacement map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementBias = 0;\n\n\t\t/**\n\t\t * The alpha map is a grayscale texture that controls the opacity across the\n\t\t * surface (black: fully transparent; white: fully opaque).\n\t\t *\n\t\t * Only the color of the texture is used, ignoring the alpha channel if one\n\t\t * exists. For RGB and RGBA textures, the renderer will use the green channel\n\t\t * when sampling this texture due to the extra bit of precision provided for\n\t\t * green in DXT-compressed and uncompressed RGB 565 formats. Luminance-only and\n\t\t * luminance/alpha textures will also still work as expected.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.alphaMap = null;\n\n\t\t/**\n\t\t * Renders the geometry as a wireframe.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.wireframe = false;\n\n\t\t/**\n\t\t * Controls the thickness of the wireframe.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.wireframeLinewidth = 1;\n\n\t\t/**\n\t\t * Defines appearance of wireframe ends.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.wireframeLinecap = 'round';\n\n\t\t/**\n\t\t * Defines appearance of wireframe joints.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\t/**\n\t\t * Whether the material is affected by fog or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\t\tthis.gradientMap = source.gradientMap;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A material that maps the normal vectors to RGB colors.\n *\n * @augments Material\n * @demo scenes/material-browser.html#MeshNormalMaterial\n */\nclass MeshNormalMaterial extends Material {\n\n\t/**\n\t * Constructs a new mesh normal material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshNormalMaterial = true;\n\n\t\tthis.type = 'MeshNormalMaterial';\n\n\t\t/**\n\t\t * The texture to create a bump map. The black and white values map to the\n\t\t * perceived depth in relation to the lights. Bump doesn't actually affect\n\t\t * the geometry of the object, only the lighting. If a normal map is defined\n\t\t * this will be ignored.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.bumpMap = null;\n\n\t\t/**\n\t\t * How much the bump map affects the material. Typical range is `[0,1]`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.bumpScale = 1;\n\n\t\t/**\n\t\t * The texture to create a normal map. The RGB values affect the surface\n\t\t * normal for each pixel fragment and change the way the color is lit. Normal\n\t\t * maps do not change the actual shape of the surface, only the lighting. In\n\t\t * case the material has a normal map authored using the left handed\n\t\t * convention, the `y` component of `normalScale` should be negated to compensate\n\t\t * for the different handedness.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.normalMap = null;\n\n\t\t/**\n\t\t * The type of normal map.\n\t\t *\n\t\t * @type {(TangentSpaceNormalMap|ObjectSpaceNormalMap)}\n\t\t * @default TangentSpaceNormalMap\n\t\t */\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\n\t\t/**\n\t\t * How much the normal map affects the material. Typical value range is `[0,1]`.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (1,1)\n\t\t */\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\t/**\n\t\t * The displacement map affects the position of the mesh's vertices. Unlike\n\t\t * other maps which only affect the light and shade of the material the\n\t\t * displaced vertices can cast shadows, block other objects, and otherwise\n\t\t * act as real geometry. The displacement texture is an image where the value\n\t\t * of each pixel (white being the highest) is mapped against, and\n\t\t * repositions, the vertices of the mesh.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.displacementMap = null;\n\n\t\t/**\n\t\t * How much the displacement map affects the mesh (where black is no\n\t\t * displacement, and white is maximum displacement). Without a displacement\n\t\t * map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementScale = 1;\n\n\t\t/**\n\t\t * The offset of the displacement map's values on the mesh's vertices.\n\t\t * The bias is added to the scaled sample of the displacement map.\n\t\t * Without a displacement map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementBias = 0;\n\n\t\t/**\n\t\t * Renders the geometry as a wireframe.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.wireframe = false;\n\n\t\t/**\n\t\t * Controls the thickness of the wireframe.\n\t\t *\n\t\t * WebGL and WebGPU ignore this property and always render\n\t\t * 1 pixel wide lines.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.wireframeLinewidth = 1;\n\n\t\t/**\n\t\t * Whether the material is rendered with flat shading or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.flatShading = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\tthis.flatShading = source.flatShading;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A material for non-shiny surfaces, without specular highlights.\n *\n * The material uses a non-physically based [Lambertian](https://en.wikipedia.org/wiki/Lambertian_reflectance)\n * model for calculating reflectance. This can simulate some surfaces (such\n * as untreated wood or stone) well, but cannot simulate shiny surfaces with\n * specular highlights (such as varnished wood). `MeshLambertMaterial` uses per-fragment\n * shading.\n *\n * Due to the simplicity of the reflectance and illumination models,\n * performance will be greater when using this material over the\n * {@link MeshPhongMaterial}, {@link MeshStandardMaterial} or\n * {@link MeshPhysicalMaterial}, at the cost of some graphical accuracy.\n *\n * @augments Material\n * @demo scenes/material-browser.html#MeshLambertMaterial\n */\nclass MeshLambertMaterial extends Material {\n\n\t/**\n\t * Constructs a new mesh lambert material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshLambertMaterial = true;\n\n\t\tthis.type = 'MeshLambertMaterial';\n\n\t\t/**\n\t\t * Color of the material.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\n\t\t/**\n\t\t * The color map. May optionally include an alpha channel, typically combined\n\t\t * with {@link Material#transparent} or {@link Material#alphaTest}. The texture map\n\t\t * color is modulated by the diffuse `color`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * The light map. Requires a second set of UVs.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.lightMap = null;\n\n\t\t/**\n\t\t * Intensity of the baked light.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\t/**\n\t\t * The red channel of this texture is used as the ambient occlusion map.\n\t\t * Requires a second set of UVs.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.aoMap = null;\n\n\t\t/**\n\t\t * Intensity of the ambient occlusion effect. Range is `[0,1]`, where `0`\n\t\t * disables ambient occlusion. Where intensity is `1` and the AO map's\n\t\t * red channel is also `1`, ambient light is fully occluded on a surface.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\t/**\n\t\t * Emissive (light) color of the material, essentially a solid color\n\t\t * unaffected by other lighting.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.emissive = new Color( 0x000000 );\n\n\t\t/**\n\t\t * Intensity of the emissive light. Modulates the emissive color.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.emissiveIntensity = 1.0;\n\n\t\t/**\n\t\t * Set emissive (glow) map. The emissive map color is modulated by the\n\t\t * emissive color and the emissive intensity. If you have an emissive map,\n\t\t * be sure to set the emissive color to something other than black.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.emissiveMap = null;\n\n\t\t/**\n\t\t * The texture to create a bump map. The black and white values map to the\n\t\t * perceived depth in relation to the lights. Bump doesn't actually affect\n\t\t * the geometry of the object, only the lighting. If a normal map is defined\n\t\t * this will be ignored.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.bumpMap = null;\n\n\t\t/**\n\t\t * How much the bump map affects the material. Typical range is `[0,1]`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.bumpScale = 1;\n\n\t\t/**\n\t\t * The texture to create a normal map. The RGB values affect the surface\n\t\t * normal for each pixel fragment and change the way the color is lit. Normal\n\t\t * maps do not change the actual shape of the surface, only the lighting. In\n\t\t * case the material has a normal map authored using the left handed\n\t\t * convention, the `y` component of `normalScale` should be negated to compensate\n\t\t * for the different handedness.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.normalMap = null;\n\n\t\t/**\n\t\t * The type of normal map.\n\t\t *\n\t\t * @type {(TangentSpaceNormalMap|ObjectSpaceNormalMap)}\n\t\t * @default TangentSpaceNormalMap\n\t\t */\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\n\t\t/**\n\t\t * How much the normal map affects the material. Typical value range is `[0,1]`.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (1,1)\n\t\t */\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\t/**\n\t\t * The displacement map affects the position of the mesh's vertices. Unlike\n\t\t * other maps which only affect the light and shade of the material the\n\t\t * displaced vertices can cast shadows, block other objects, and otherwise\n\t\t * act as real geometry. The displacement texture is an image where the value\n\t\t * of each pixel (white being the highest) is mapped against, and\n\t\t * repositions, the vertices of the mesh.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.displacementMap = null;\n\n\t\t/**\n\t\t * How much the displacement map affects the mesh (where black is no\n\t\t * displacement, and white is maximum displacement). Without a displacement\n\t\t * map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementScale = 1;\n\n\t\t/**\n\t\t * The offset of the displacement map's values on the mesh's vertices.\n\t\t * The bias is added to the scaled sample of the displacement map.\n\t\t * Without a displacement map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementBias = 0;\n\n\t\t/**\n\t\t * Specular map used by the material.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.specularMap = null;\n\n\t\t/**\n\t\t * The alpha map is a grayscale texture that controls the opacity across the\n\t\t * surface (black: fully transparent; white: fully opaque).\n\t\t *\n\t\t * Only the color of the texture is used, ignoring the alpha channel if one\n\t\t * exists. For RGB and RGBA textures, the renderer will use the green channel\n\t\t * when sampling this texture due to the extra bit of precision provided for\n\t\t * green in DXT-compressed and uncompressed RGB 565 formats. Luminance-only and\n\t\t * luminance/alpha textures will also still work as expected.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.alphaMap = null;\n\n\t\t/**\n\t\t * The environment map.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.envMap = null;\n\n\t\t/**\n\t\t * The rotation of the environment map in radians.\n\t\t *\n\t\t * @type {Euler}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.envMapRotation = new Euler();\n\n\t\t/**\n\t\t * How to combine the result of the surface's color with the environment map, if any.\n\t\t *\n\t\t * When set to `MixOperation`, the {@link MeshBasicMaterial#reflectivity} is used to\n\t\t * blend between the two colors.\n\t\t *\n\t\t * @type {(MultiplyOperation|MixOperation|AddOperation)}\n\t\t * @default MultiplyOperation\n\t\t */\n\t\tthis.combine = MultiplyOperation;\n\n\t\t/**\n\t\t * How much the environment map affects the surface.\n\t\t * The valid range is between `0` (no reflections) and `1` (full reflections).\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.reflectivity = 1;\n\n\t\t/**\n\t\t * The index of refraction (IOR) of air (approximately 1) divided by the\n\t\t * index of refraction of the material. It is used with environment mapping\n\t\t * modes {@link CubeRefractionMapping} and {@link EquirectangularRefractionMapping}.\n\t\t * The refraction ratio should not exceed `1`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.98\n\t\t */\n\t\tthis.refractionRatio = 0.98;\n\n\t\t/**\n\t\t * Renders the geometry as a wireframe.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.wireframe = false;\n\n\t\t/**\n\t\t * Controls the thickness of the wireframe.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.wireframeLinewidth = 1;\n\n\t\t/**\n\t\t * Defines appearance of wireframe ends.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.wireframeLinecap = 'round';\n\n\t\t/**\n\t\t * Defines appearance of wireframe joints.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\t/**\n\t\t * Whether the material is rendered with flat shading or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.flatShading = false;\n\n\t\t/**\n\t\t * Whether the material is affected by fog or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.specularMap = source.specularMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.envMapRotation.copy( source.envMapRotation );\n\t\tthis.combine = source.combine;\n\t\tthis.reflectivity = source.reflectivity;\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.flatShading = source.flatShading;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A material for drawing geometry by depth. Depth is based off of the camera\n * near and far plane. White is nearest, black is farthest.\n *\n * @augments Material\n * @demo scenes/material-browser.html#MeshDepthMaterial\n */\nclass MeshDepthMaterial extends Material {\n\n\t/**\n\t * Constructs a new mesh depth material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshDepthMaterial = true;\n\n\t\tthis.type = 'MeshDepthMaterial';\n\n\t\t/**\n\t\t * Type for depth packing.\n\t\t *\n\t\t * @type {(BasicDepthPacking|RGBADepthPacking|RGBDepthPacking|RGDepthPacking)}\n\t\t * @default BasicDepthPacking\n\t\t */\n\t\tthis.depthPacking = BasicDepthPacking;\n\n\t\t/**\n\t\t * The color map. May optionally include an alpha channel, typically combined\n\t\t * with {@link Material#transparent} or {@link Material#alphaTest}.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * The alpha map is a grayscale texture that controls the opacity across the\n\t\t * surface (black: fully transparent; white: fully opaque).\n\t\t *\n\t\t * Only the color of the texture is used, ignoring the alpha channel if one\n\t\t * exists. For RGB and RGBA textures, the renderer will use the green channel\n\t\t * when sampling this texture due to the extra bit of precision provided for\n\t\t * green in DXT-compressed and uncompressed RGB 565 formats. Luminance-only and\n\t\t * luminance/alpha textures will also still work as expected.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.alphaMap = null;\n\n\t\t/**\n\t\t * The displacement map affects the position of the mesh's vertices. Unlike\n\t\t * other maps which only affect the light and shade of the material the\n\t\t * displaced vertices can cast shadows, block other objects, and otherwise\n\t\t * act as real geometry. The displacement texture is an image where the value\n\t\t * of each pixel (white being the highest) is mapped against, and\n\t\t * repositions, the vertices of the mesh.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.displacementMap = null;\n\n\t\t/**\n\t\t * How much the displacement map affects the mesh (where black is no\n\t\t * displacement, and white is maximum displacement). Without a displacement\n\t\t * map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementScale = 1;\n\n\t\t/**\n\t\t * The offset of the displacement map's values on the mesh's vertices.\n\t\t * The bias is added to the scaled sample of the displacement map.\n\t\t * Without a displacement map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementBias = 0;\n\n\t\t/**\n\t\t * Renders the geometry as a wireframe.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.wireframe = false;\n\n\t\t/**\n\t\t * Controls the thickness of the wireframe.\n\t\t *\n\t\t * WebGL and WebGPU ignore this property and always render\n\t\t * 1 pixel wide lines.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.wireframeLinewidth = 1;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.depthPacking = source.depthPacking;\n\n\t\tthis.map = source.map;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A material used internally for implementing shadow mapping with\n * point lights.\n *\n * Can also be used to customize the shadow casting of an object by assigning\n * an instance of `MeshDistanceMaterial` to {@link Object3D#customDistanceMaterial}.\n * The following examples demonstrates this approach in order to ensure\n * transparent parts of objects do not cast shadows.\n *\n * @augments Material\n */\nclass MeshDistanceMaterial extends Material {\n\n\t/**\n\t * Constructs a new mesh distance material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshDistanceMaterial = true;\n\n\t\tthis.type = 'MeshDistanceMaterial';\n\n\t\t/**\n\t\t * The color map. May optionally include an alpha channel, typically combined\n\t\t * with {@link Material#transparent} or {@link Material#alphaTest}.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * The alpha map is a grayscale texture that controls the opacity across the\n\t\t * surface (black: fully transparent; white: fully opaque).\n\t\t *\n\t\t * Only the color of the texture is used, ignoring the alpha channel if one\n\t\t * exists. For RGB and RGBA textures, the renderer will use the green channel\n\t\t * when sampling this texture due to the extra bit of precision provided for\n\t\t * green in DXT-compressed and uncompressed RGB 565 formats. Luminance-only and\n\t\t * luminance/alpha textures will also still work as expected.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.alphaMap = null;\n\n\t\t/**\n\t\t * The displacement map affects the position of the mesh's vertices. Unlike\n\t\t * other maps which only affect the light and shade of the material the\n\t\t * displaced vertices can cast shadows, block other objects, and otherwise\n\t\t * act as real geometry. The displacement texture is an image where the value\n\t\t * of each pixel (white being the highest) is mapped against, and\n\t\t * repositions, the vertices of the mesh.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.displacementMap = null;\n\n\t\t/**\n\t\t * How much the displacement map affects the mesh (where black is no\n\t\t * displacement, and white is maximum displacement). Without a displacement\n\t\t * map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementScale = 1;\n\n\t\t/**\n\t\t * The offset of the displacement map's values on the mesh's vertices.\n\t\t * The bias is added to the scaled sample of the displacement map.\n\t\t * Without a displacement map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementBias = 0;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.map = source.map;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * This material is defined by a MatCap (or Lit Sphere) texture, which encodes the\n * material color and shading.\n *\n * `MeshMatcapMaterial` does not respond to lights since the matcap image file encodes\n * baked lighting. It will cast a shadow onto an object that receives shadows\n * (and shadow clipping works), but it will not self-shadow or receive\n * shadows.\n *\n * @augments Material\n * @demo scenes/material-browser.html#MeshMatcapMaterial\n */\nclass MeshMatcapMaterial extends Material {\n\n\t/**\n\t * Constructs a new mesh matcap material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshMatcapMaterial = true;\n\n\t\tthis.defines = { 'MATCAP': '' };\n\n\t\tthis.type = 'MeshMatcapMaterial';\n\n\t\t/**\n\t\t * Color of the material.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\n\t\t/**\n\t\t * The matcap map.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.matcap = null;\n\n\t\t/**\n\t\t * The color map. May optionally include an alpha channel, typically combined\n\t\t * with {@link Material#transparent} or {@link Material#alphaTest}. The texture map\n\t\t * color is modulated by the diffuse `color`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * The texture to create a bump map. The black and white values map to the\n\t\t * perceived depth in relation to the lights. Bump doesn't actually affect\n\t\t * the geometry of the object, only the lighting. If a normal map is defined\n\t\t * this will be ignored.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.bumpMap = null;\n\n\t\t/**\n\t\t * How much the bump map affects the material. Typical range is `[0,1]`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.bumpScale = 1;\n\n\t\t/**\n\t\t * The texture to create a normal map. The RGB values affect the surface\n\t\t * normal for each pixel fragment and change the way the color is lit. Normal\n\t\t * maps do not change the actual shape of the surface, only the lighting. In\n\t\t * case the material has a normal map authored using the left handed\n\t\t * convention, the `y` component of `normalScale` should be negated to compensate\n\t\t * for the different handedness.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.normalMap = null;\n\n\t\t/**\n\t\t * The type of normal map.\n\t\t *\n\t\t * @type {(TangentSpaceNormalMap|ObjectSpaceNormalMap)}\n\t\t * @default TangentSpaceNormalMap\n\t\t */\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\n\t\t/**\n\t\t * How much the normal map affects the material. Typical value range is `[0,1]`.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (1,1)\n\t\t */\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\t/**\n\t\t * The displacement map affects the position of the mesh's vertices. Unlike\n\t\t * other maps which only affect the light and shade of the material the\n\t\t * displaced vertices can cast shadows, block other objects, and otherwise\n\t\t * act as real geometry. The displacement texture is an image where the value\n\t\t * of each pixel (white being the highest) is mapped against, and\n\t\t * repositions, the vertices of the mesh.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.displacementMap = null;\n\n\t\t/**\n\t\t * How much the displacement map affects the mesh (where black is no\n\t\t * displacement, and white is maximum displacement). Without a displacement\n\t\t * map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementScale = 1;\n\n\t\t/**\n\t\t * The offset of the displacement map's values on the mesh's vertices.\n\t\t * The bias is added to the scaled sample of the displacement map.\n\t\t * Without a displacement map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementBias = 0;\n\n\t\t/**\n\t\t * The alpha map is a grayscale texture that controls the opacity across the\n\t\t * surface (black: fully transparent; white: fully opaque).\n\t\t *\n\t\t * Only the color of the texture is used, ignoring the alpha channel if one\n\t\t * exists. For RGB and RGBA textures, the renderer will use the green channel\n\t\t * when sampling this texture due to the extra bit of precision provided for\n\t\t * green in DXT-compressed and uncompressed RGB 565 formats. Luminance-only and\n\t\t * luminance/alpha textures will also still work as expected.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.alphaMap = null;\n\n\t\t/**\n\t\t * Renders the geometry as a wireframe.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.wireframe = false;\n\n\t\t/**\n\t\t * Controls the thickness of the wireframe.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.wireframeLinewidth = 1;\n\n\t\t/**\n\t\t * Whether the material is rendered with flat shading or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.flatShading = false;\n\n\t\t/**\n\t\t * Whether the material is affected by fog or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.defines = { 'MATCAP': '' };\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.matcap = source.matcap;\n\n\t\tthis.map = source.map;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\tthis.flatShading = source.flatShading;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A material for rendering line primitives.\n *\n * Materials define the appearance of renderable 3D objects.\n *\n * ```js\n * const material = new THREE.LineDashedMaterial( {\n * \tcolor: 0xffffff,\n * \tscale: 1,\n * \tdashSize: 3,\n * \tgapSize: 1,\n * } );\n * ```\n *\n * @augments LineBasicMaterial\n */\nclass LineDashedMaterial extends LineBasicMaterial {\n\n\t/**\n\t * Constructs a new line dashed material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLineDashedMaterial = true;\n\t\tthis.type = 'LineDashedMaterial';\n\n\t\t/**\n\t\t * The scale of the dashed part of a line.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.scale = 1;\n\n\t\t/**\n\t\t * The size of the dash. This is both the gap with the stroke.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 3\n\t\t */\n\t\tthis.dashSize = 3;\n\n\t\t/**\n\t\t * The size of the gap.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.gapSize = 1;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.scale = source.scale;\n\t\tthis.dashSize = source.dashSize;\n\t\tthis.gapSize = source.gapSize;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * Converts an array to a specific type.\n *\n * @param {TypedArray|Array} array - The array to convert.\n * @param {TypedArray.constructor} type - The constructor of a typed array that defines the new type.\n * @return {TypedArray} The converted array.\n */\nfunction convertArray( array, type ) {\n\n\tif ( ! array || array.constructor === type ) return array;\n\n\tif ( typeof type.BYTES_PER_ELEMENT === 'number' ) {\n\n\t\treturn new type( array ); // create typed array\n\n\t}\n\n\treturn Array.prototype.slice.call( array ); // create Array\n\n}\n\n/**\n * Returns `true` if the given object is a typed array.\n *\n * @param {any} object - The object to check.\n * @return {boolean} Whether the given object is a typed array.\n */\nfunction isTypedArray( object ) {\n\n\treturn ArrayBuffer.isView( object ) && ! ( object instanceof DataView );\n\n}\n\n/**\n * Returns an array by which times and values can be sorted.\n *\n * @param {Array<number>} times - The keyframe time values.\n * @return {Array<number>} The array.\n */\nfunction getKeyframeOrder( times ) {\n\n\tfunction compareTime( i, j ) {\n\n\t\treturn times[ i ] - times[ j ];\n\n\t}\n\n\tconst n = times.length;\n\tconst result = new Array( n );\n\tfor ( let i = 0; i !== n; ++ i ) result[ i ] = i;\n\n\tresult.sort( compareTime );\n\n\treturn result;\n\n}\n\n/**\n * Sorts the given array by the previously computed order via `getKeyframeOrder()`.\n *\n * @param {Array<number>} values - The values to sort.\n * @param {number} stride - The stride.\n * @param {Array<number>} order - The sort order.\n * @return {Array<number>} The sorted values.\n */\nfunction sortedArray( values, stride, order ) {\n\n\tconst nValues = values.length;\n\tconst result = new values.constructor( nValues );\n\n\tfor ( let i = 0, dstOffset = 0; dstOffset !== nValues; ++ i ) {\n\n\t\tconst srcOffset = order[ i ] * stride;\n\n\t\tfor ( let j = 0; j !== stride; ++ j ) {\n\n\t\t\tresult[ dstOffset ++ ] = values[ srcOffset + j ];\n\n\t\t}\n\n\t}\n\n\treturn result;\n\n}\n\n/**\n * Used for parsing AOS keyframe formats.\n *\n * @param {Array<number>} jsonKeys - A list of JSON keyframes.\n * @param {Array<number>} times - This array will be filled with keyframe times by this function.\n * @param {Array<number>} values - This array will be filled with keyframe values by this function.\n * @param {string} valuePropertyName - The name of the property to use.\n */\nfunction flattenJSON( jsonKeys, times, values, valuePropertyName ) {\n\n\tlet i = 1, key = jsonKeys[ 0 ];\n\n\twhile ( key !== undefined && key[ valuePropertyName ] === undefined ) {\n\n\t\tkey = jsonKeys[ i ++ ];\n\n\t}\n\n\tif ( key === undefined ) return; // no data\n\n\tlet value = key[ valuePropertyName ];\n\tif ( value === undefined ) return; // no data\n\n\tif ( Array.isArray( value ) ) {\n\n\t\tdo {\n\n\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\tif ( value !== undefined ) {\n\n\t\t\t\ttimes.push( key.time );\n\t\t\t\tvalues.push( ...value ); // push all elements\n\n\t\t\t}\n\n\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t} while ( key !== undefined );\n\n\t} else if ( value.toArray !== undefined ) {\n\n\t\t// ...assume THREE.Math-ish\n\n\t\tdo {\n\n\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\tif ( value !== undefined ) {\n\n\t\t\t\ttimes.push( key.time );\n\t\t\t\tvalue.toArray( values, values.length );\n\n\t\t\t}\n\n\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t} while ( key !== undefined );\n\n\t} else {\n\n\t\t// otherwise push as-is\n\n\t\tdo {\n\n\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\tif ( value !== undefined ) {\n\n\t\t\t\ttimes.push( key.time );\n\t\t\t\tvalues.push( value );\n\n\t\t\t}\n\n\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t} while ( key !== undefined );\n\n\t}\n\n}\n\n/**\n * Creates a new clip, containing only the segment of the original clip between the given frames.\n *\n * @param {AnimationClip} sourceClip - The values to sort.\n * @param {string} name - The name of the clip.\n * @param {number} startFrame - The start frame.\n * @param {number} endFrame - The end frame.\n * @param {number} [fps=30] - The FPS.\n * @return {AnimationClip} The new sub clip.\n */\nfunction subclip( sourceClip, name, startFrame, endFrame, fps = 30 ) {\n\n\tconst clip = sourceClip.clone();\n\n\tclip.name = name;\n\n\tconst tracks = [];\n\n\tfor ( let i = 0; i < clip.tracks.length; ++ i ) {\n\n\t\tconst track = clip.tracks[ i ];\n\t\tconst valueSize = track.getValueSize();\n\n\t\tconst times = [];\n\t\tconst values = [];\n\n\t\tfor ( let j = 0; j < track.times.length; ++ j ) {\n\n\t\t\tconst frame = track.times[ j ] * fps;\n\n\t\t\tif ( frame < startFrame || frame >= endFrame ) continue;\n\n\t\t\ttimes.push( track.times[ j ] );\n\n\t\t\tfor ( let k = 0; k < valueSize; ++ k ) {\n\n\t\t\t\tvalues.push( track.values[ j * valueSize + k ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( times.length === 0 ) continue;\n\n\t\ttrack.times = convertArray( times, track.times.constructor );\n\t\ttrack.values = convertArray( values, track.values.constructor );\n\n\t\ttracks.push( track );\n\n\t}\n\n\tclip.tracks = tracks;\n\n\t// find minimum .times value across all tracks in the trimmed clip\n\n\tlet minStartTime = Infinity;\n\n\tfor ( let i = 0; i < clip.tracks.length; ++ i ) {\n\n\t\tif ( minStartTime > clip.tracks[ i ].times[ 0 ] ) {\n\n\t\t\tminStartTime = clip.tracks[ i ].times[ 0 ];\n\n\t\t}\n\n\t}\n\n\t// shift all tracks such that clip begins at t=0\n\n\tfor ( let i = 0; i < clip.tracks.length; ++ i ) {\n\n\t\tclip.tracks[ i ].shift( -1 * minStartTime );\n\n\t}\n\n\tclip.resetDuration();\n\n\treturn clip;\n\n}\n\n/**\n * Converts the keyframes of the given animation clip to an additive format.\n *\n * @param {AnimationClip} targetClip - The clip to make additive.\n * @param {number} [referenceFrame=0] - The reference frame.\n * @param {AnimationClip} [referenceClip=targetClip] - The reference clip.\n * @param {number} [fps=30] - The FPS.\n * @return {AnimationClip} The updated clip which is now additive.\n */\nfunction makeClipAdditive( targetClip, referenceFrame = 0, referenceClip = targetClip, fps = 30 ) {\n\n\tif ( fps <= 0 ) fps = 30;\n\n\tconst numTracks = referenceClip.tracks.length;\n\tconst referenceTime = referenceFrame / fps;\n\n\t// Make each track's values relative to the values at the reference frame\n\tfor ( let i = 0; i < numTracks; ++ i ) {\n\n\t\tconst referenceTrack = referenceClip.tracks[ i ];\n\t\tconst referenceTrackType = referenceTrack.ValueTypeName;\n\n\t\t// Skip this track if it's non-numeric\n\t\tif ( referenceTrackType === 'bool' || referenceTrackType === 'string' ) continue;\n\n\t\t// Find the track in the target clip whose name and type matches the reference track\n\t\tconst targetTrack = targetClip.tracks.find( function ( track ) {\n\n\t\t\treturn track.name === referenceTrack.name\n\t\t\t\t&& track.ValueTypeName === referenceTrackType;\n\n\t\t} );\n\n\t\tif ( targetTrack === undefined ) continue;\n\n\t\tlet referenceOffset = 0;\n\t\tconst referenceValueSize = referenceTrack.getValueSize();\n\n\t\tif ( referenceTrack.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline ) {\n\n\t\t\treferenceOffset = referenceValueSize / 3;\n\n\t\t}\n\n\t\tlet targetOffset = 0;\n\t\tconst targetValueSize = targetTrack.getValueSize();\n\n\t\tif ( targetTrack.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline ) {\n\n\t\t\ttargetOffset = targetValueSize / 3;\n\n\t\t}\n\n\t\tconst lastIndex = referenceTrack.times.length - 1;\n\t\tlet referenceValue;\n\n\t\t// Find the value to subtract out of the track\n\t\tif ( referenceTime <= referenceTrack.times[ 0 ] ) {\n\n\t\t\t// Reference frame is earlier than the first keyframe, so just use the first keyframe\n\t\t\tconst startIndex = referenceOffset;\n\t\t\tconst endIndex = referenceValueSize - referenceOffset;\n\t\t\treferenceValue = referenceTrack.values.slice( startIndex, endIndex );\n\n\t\t} else if ( referenceTime >= referenceTrack.times[ lastIndex ] ) {\n\n\t\t\t// Reference frame is after the last keyframe, so just use the last keyframe\n\t\t\tconst startIndex = lastIndex * referenceValueSize + referenceOffset;\n\t\t\tconst endIndex = startIndex + referenceValueSize - referenceOffset;\n\t\t\treferenceValue = referenceTrack.values.slice( startIndex, endIndex );\n\n\t\t} else {\n\n\t\t\t// Interpolate to the reference value\n\t\t\tconst interpolant = referenceTrack.createInterpolant();\n\t\t\tconst startIndex = referenceOffset;\n\t\t\tconst endIndex = referenceValueSize - referenceOffset;\n\t\t\tinterpolant.evaluate( referenceTime );\n\t\t\treferenceValue = interpolant.resultBuffer.slice( startIndex, endIndex );\n\n\t\t}\n\n\t\t// Conjugate the quaternion\n\t\tif ( referenceTrackType === 'quaternion' ) {\n\n\t\t\tconst referenceQuat = new Quaternion().fromArray( referenceValue ).normalize().conjugate();\n\t\t\treferenceQuat.toArray( referenceValue );\n\n\t\t}\n\n\t\t// Subtract the reference value from all of the track values\n\n\t\tconst numTimes = targetTrack.times.length;\n\t\tfor ( let j = 0; j < numTimes; ++ j ) {\n\n\t\t\tconst valueStart = j * targetValueSize + targetOffset;\n\n\t\t\tif ( referenceTrackType === 'quaternion' ) {\n\n\t\t\t\t// Multiply the conjugate for quaternion track types\n\t\t\t\tQuaternion.multiplyQuaternionsFlat(\n\t\t\t\t\ttargetTrack.values,\n\t\t\t\t\tvalueStart,\n\t\t\t\t\treferenceValue,\n\t\t\t\t\t0,\n\t\t\t\t\ttargetTrack.values,\n\t\t\t\t\tvalueStart\n\t\t\t\t);\n\n\t\t\t} else {\n\n\t\t\t\tconst valueEnd = targetValueSize - targetOffset * 2;\n\n\t\t\t\t// Subtract each value for all other numeric track types\n\t\t\t\tfor ( let k = 0; k < valueEnd; ++ k ) {\n\n\t\t\t\t\ttargetTrack.values[ valueStart + k ] -= referenceValue[ k ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\ttargetClip.blendMode = AdditiveAnimationBlendMode;\n\n\treturn targetClip;\n\n}\n\n/**\n * A class with various methods to assist with animations.\n *\n * @hideconstructor\n */\nclass AnimationUtils {\n\n\t/**\n\t * Converts an array to a specific type\n\t *\n\t * @static\n\t * @param {TypedArray|Array} array - The array to convert.\n\t * @param {TypedArray.constructor} type - The constructor of a type array.\n\t * @return {TypedArray} The converted array\n\t */\n\tstatic convertArray( array, type ) {\n\n\t\treturn convertArray( array, type );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given object is a typed array.\n\t *\n\t * @static\n\t * @param {any} object - The object to check.\n\t * @return {boolean} Whether the given object is a typed array.\n\t */\n\tstatic isTypedArray( object ) {\n\n\t\treturn isTypedArray( object );\n\n\t}\n\n\t/**\n\t * Returns an array by which times and values can be sorted.\n\t *\n\t * @static\n\t * @param {Array<number>} times - The keyframe time values.\n\t * @return {Array<number>} The array.\n\t */\n\tstatic getKeyframeOrder( times ) {\n\n\t\treturn getKeyframeOrder( times );\n\n\t}\n\n\t/**\n\t * Sorts the given array by the previously computed order via `getKeyframeOrder()`.\n\t *\n\t * @static\n\t * @param {Array<number>} values - The values to sort.\n\t * @param {number} stride - The stride.\n\t * @param {Array<number>} order - The sort order.\n\t * @return {Array<number>} The sorted values.\n\t */\n\tstatic sortedArray( values, stride, order ) {\n\n\t\treturn sortedArray( values, stride, order );\n\n\t}\n\n\t/**\n\t * Used for parsing AOS keyframe formats.\n\t *\n\t * @static\n\t * @param {Array<number>} jsonKeys - A list of JSON keyframes.\n\t * @param {Array<number>} times - This array will be filled with keyframe times by this method.\n\t * @param {Array<number>} values - This array will be filled with keyframe values by this method.\n\t * @param {string} valuePropertyName - The name of the property to use.\n\t */\n\tstatic flattenJSON( jsonKeys, times, values, valuePropertyName ) {\n\n\t\tflattenJSON( jsonKeys, times, values, valuePropertyName );\n\n\t}\n\n\t/**\n\t * Creates a new clip, containing only the segment of the original clip between the given frames.\n\t *\n\t * @static\n\t * @param {AnimationClip} sourceClip - The values to sort.\n\t * @param {string} name - The name of the clip.\n\t * @param {number} startFrame - The start frame.\n\t * @param {number} endFrame - The end frame.\n\t * @param {number} [fps=30] - The FPS.\n\t * @return {AnimationClip} The new sub clip.\n\t */\n\tstatic subclip( sourceClip, name, startFrame, endFrame, fps = 30 ) {\n\n\t\treturn subclip( sourceClip, name, startFrame, endFrame, fps );\n\n\t}\n\n\t/**\n\t * Converts the keyframes of the given animation clip to an additive format.\n\t *\n\t * @static\n\t * @param {AnimationClip} targetClip - The clip to make additive.\n\t * @param {number} [referenceFrame=0] - The reference frame.\n\t * @param {AnimationClip} [referenceClip=targetClip] - The reference clip.\n\t * @param {number} [fps=30] - The FPS.\n\t * @return {AnimationClip} The updated clip which is now additive.\n\t */\n\tstatic makeClipAdditive( targetClip, referenceFrame = 0, referenceClip = targetClip, fps = 30 ) {\n\n\t\treturn makeClipAdditive( targetClip, referenceFrame, referenceClip, fps );\n\n\t}\n\n}\n\n/**\n * Abstract base class of interpolants over parametric samples.\n *\n * The parameter domain is one dimensional, typically the time or a path\n * along a curve defined by the data.\n *\n * The sample values can have any dimensionality and derived classes may\n * apply special interpretations to the data.\n *\n * This class provides the interval seek in a Template Method, deferring\n * the actual interpolation to derived classes.\n *\n * Time complexity is O(1) for linear access crossing at most two points\n * and O(log N) for random access, where N is the number of positions.\n *\n * References: {@link http://www.oodesign.com/template-method-pattern.html}\n *\n * @abstract\n */\nclass Interpolant {\n\n\t/**\n\t * Constructs a new interpolant.\n\t *\n\t * @param {TypedArray} parameterPositions - The parameter positions hold the interpolation factors.\n\t * @param {TypedArray} sampleValues - The sample values.\n\t * @param {number} sampleSize - The sample size\n\t * @param {TypedArray} [resultBuffer] - The result buffer.\n\t */\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\t/**\n\t\t * The parameter positions.\n\t\t *\n\t\t * @type {TypedArray}\n\t\t */\n\t\tthis.parameterPositions = parameterPositions;\n\n\t\t/**\n\t\t * A cache index.\n\t\t *\n\t\t * @private\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis._cachedIndex = 0;\n\n\t\t/**\n\t\t * The result buffer.\n\t\t *\n\t\t * @type {TypedArray}\n\t\t */\n\t\tthis.resultBuffer = resultBuffer !== undefined ? resultBuffer : new sampleValues.constructor( sampleSize );\n\n\t\t/**\n\t\t * The sample values.\n\t\t *\n\t\t * @type {TypedArray}\n\t\t */\n\t\tthis.sampleValues = sampleValues;\n\n\t\t/**\n\t\t * The value size.\n\t\t *\n\t\t * @type {TypedArray}\n\t\t */\n\t\tthis.valueSize = sampleSize;\n\n\t\t/**\n\t\t * The interpolation settings.\n\t\t *\n\t\t * @type {?Object}\n\t\t * @default null\n\t\t */\n\t\tthis.settings = null;\n\n\t\t/**\n\t\t * The default settings object.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.DefaultSettings_ = {};\n\n\t}\n\n\t/**\n\t * Evaluate the interpolant at position `t`.\n\t *\n\t * @param {number} t - The interpolation factor.\n\t * @return {TypedArray} The result buffer.\n\t */\n\tevaluate( t ) {\n\n\t\tconst pp = this.parameterPositions;\n\t\tlet i1 = this._cachedIndex,\n\t\t\tt1 = pp[ i1 ],\n\t\t\tt0 = pp[ i1 - 1 ];\n\n\t\tvalidate_interval: {\n\n\t\t\tseek: {\n\n\t\t\t\tlet right;\n\n\t\t\t\tlinear_scan: {\n\n\t\t\t\t\t//- See http://jsperf.com/comparison-to-undefined/3\n\t\t\t\t\t//- slower code:\n\t\t\t\t\t//-\n\t\t\t\t\t//- \t\t\t\tif ( t >= t1 || t1 === undefined ) {\n\t\t\t\t\tforward_scan: if ( ! ( t < t1 ) ) {\n\n\t\t\t\t\t\tfor ( let giveUpAt = i1 + 2; ; ) {\n\n\t\t\t\t\t\t\tif ( t1 === undefined ) {\n\n\t\t\t\t\t\t\t\tif ( t < t0 ) break forward_scan;\n\n\t\t\t\t\t\t\t\t// after end\n\n\t\t\t\t\t\t\t\ti1 = pp.length;\n\t\t\t\t\t\t\t\tthis._cachedIndex = i1;\n\t\t\t\t\t\t\t\treturn this.copySampleValue_( i1 - 1 );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( i1 === giveUpAt ) break; // this loop\n\n\t\t\t\t\t\t\tt0 = t1;\n\t\t\t\t\t\t\tt1 = pp[ ++ i1 ];\n\n\t\t\t\t\t\t\tif ( t < t1 ) {\n\n\t\t\t\t\t\t\t\t// we have arrived at the sought interval\n\t\t\t\t\t\t\t\tbreak seek;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// prepare binary search on the right side of the index\n\t\t\t\t\t\tright = pp.length;\n\t\t\t\t\t\tbreak linear_scan;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t//- slower code:\n\t\t\t\t\t//-\t\t\t\t\tif ( t < t0 || t0 === undefined ) {\n\t\t\t\t\tif ( ! ( t >= t0 ) ) {\n\n\t\t\t\t\t\t// looping?\n\n\t\t\t\t\t\tconst t1global = pp[ 1 ];\n\n\t\t\t\t\t\tif ( t < t1global ) {\n\n\t\t\t\t\t\t\ti1 = 2; // + 1, using the scan for the details\n\t\t\t\t\t\t\tt0 = t1global;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// linear reverse scan\n\n\t\t\t\t\t\tfor ( let giveUpAt = i1 - 2; ; ) {\n\n\t\t\t\t\t\t\tif ( t0 === undefined ) {\n\n\t\t\t\t\t\t\t\t// before start\n\n\t\t\t\t\t\t\t\tthis._cachedIndex = 0;\n\t\t\t\t\t\t\t\treturn this.copySampleValue_( 0 );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( i1 === giveUpAt ) break; // this loop\n\n\t\t\t\t\t\t\tt1 = t0;\n\t\t\t\t\t\t\tt0 = pp[ -- i1 - 1 ];\n\n\t\t\t\t\t\t\tif ( t >= t0 ) {\n\n\t\t\t\t\t\t\t\t// we have arrived at the sought interval\n\t\t\t\t\t\t\t\tbreak seek;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// prepare binary search on the left side of the index\n\t\t\t\t\t\tright = i1;\n\t\t\t\t\t\ti1 = 0;\n\t\t\t\t\t\tbreak linear_scan;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// the interval is valid\n\n\t\t\t\t\tbreak validate_interval;\n\n\t\t\t\t} // linear scan\n\n\t\t\t\t// binary search\n\n\t\t\t\twhile ( i1 < right ) {\n\n\t\t\t\t\tconst mid = ( i1 + right ) >>> 1;\n\n\t\t\t\t\tif ( t < pp[ mid ] ) {\n\n\t\t\t\t\t\tright = mid;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ti1 = mid + 1;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tt1 = pp[ i1 ];\n\t\t\t\tt0 = pp[ i1 - 1 ];\n\n\t\t\t\t// check boundary cases, again\n\n\t\t\t\tif ( t0 === undefined ) {\n\n\t\t\t\t\tthis._cachedIndex = 0;\n\t\t\t\t\treturn this.copySampleValue_( 0 );\n\n\t\t\t\t}\n\n\t\t\t\tif ( t1 === undefined ) {\n\n\t\t\t\t\ti1 = pp.length;\n\t\t\t\t\tthis._cachedIndex = i1;\n\t\t\t\t\treturn this.copySampleValue_( i1 - 1 );\n\n\t\t\t\t}\n\n\t\t\t} // seek\n\n\t\t\tthis._cachedIndex = i1;\n\n\t\t\tthis.intervalChanged_( i1, t0, t1 );\n\n\t\t} // validate_interval\n\n\t\treturn this.interpolate_( i1, t0, t, t1 );\n\n\t}\n\n\t/**\n\t * Returns the interpolation settings.\n\t *\n\t * @return {Object} The interpolation settings.\n\t */\n\tgetSettings_() {\n\n\t\treturn this.settings || this.DefaultSettings_;\n\n\t}\n\n\t/**\n\t * Copies a sample value to the result buffer.\n\t *\n\t * @param {number} index - An index into the sample value buffer.\n\t * @return {TypedArray} The result buffer.\n\t */\n\tcopySampleValue_( index ) {\n\n\t\t// copies a sample value to the result buffer\n\n\t\tconst result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tstride = this.valueSize,\n\t\t\toffset = index * stride;\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tresult[ i ] = values[ offset + i ];\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\t/**\n\t * Copies a sample value to the result buffer.\n\t *\n\t * @abstract\n\t * @param {number} i1 - An index into the sample value buffer.\n\t * @param {number} t0 - The previous interpolation factor.\n\t * @param {number} t - The current interpolation factor.\n\t * @param {number} t1 - The next interpolation factor.\n\t * @return {TypedArray} The result buffer.\n\t */\n\tinterpolate_( /* i1, t0, t, t1 */ ) {\n\n\t\tthrow new Error( 'call to abstract method' );\n\t\t// implementations shall return this.resultBuffer\n\n\t}\n\n\t/**\n\t * Optional method that is executed when the interval has changed.\n\t *\n\t * @param {number} i1 - An index into the sample value buffer.\n\t * @param {number} t0 - The previous interpolation factor.\n\t * @param {number} t - The current interpolation factor.\n\t */\n\tintervalChanged_( /* i1, t0, t1 */ ) {\n\n\t\t// empty\n\n\t}\n\n}\n\n/**\n * Fast and simple cubic spline interpolant.\n *\n * It was derived from a Hermitian construction setting the first derivative\n * at each sample position to the linear slope between neighboring positions\n * over their parameter interval.\n *\n * @augments Interpolant\n */\nclass CubicInterpolant extends Interpolant {\n\n\t/**\n\t * Constructs a new cubic interpolant.\n\t *\n\t * @param {TypedArray} parameterPositions - The parameter positions hold the interpolation factors.\n\t * @param {TypedArray} sampleValues - The sample values.\n\t * @param {number} sampleSize - The sample size\n\t * @param {TypedArray} [resultBuffer] - The result buffer.\n\t */\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tsuper( parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t\tthis._weightPrev = -0;\n\t\tthis._offsetPrev = -0;\n\t\tthis._weightNext = -0;\n\t\tthis._offsetNext = -0;\n\n\t\tthis.DefaultSettings_ = {\n\n\t\t\tendingStart: ZeroCurvatureEnding,\n\t\t\tendingEnd: ZeroCurvatureEnding\n\n\t\t};\n\n\t}\n\n\tintervalChanged_( i1, t0, t1 ) {\n\n\t\tconst pp = this.parameterPositions;\n\t\tlet iPrev = i1 - 2,\n\t\t\tiNext = i1 + 1,\n\n\t\t\ttPrev = pp[ iPrev ],\n\t\t\ttNext = pp[ iNext ];\n\n\t\tif ( tPrev === undefined ) {\n\n\t\t\tswitch ( this.getSettings_().endingStart ) {\n\n\t\t\t\tcase ZeroSlopeEnding:\n\n\t\t\t\t\t// f'(t0) = 0\n\t\t\t\t\tiPrev = i1;\n\t\t\t\t\ttPrev = 2 * t0 - t1;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase WrapAroundEnding:\n\n\t\t\t\t\t// use the other end of the curve\n\t\t\t\t\tiPrev = pp.length - 2;\n\t\t\t\t\ttPrev = t0 + pp[ iPrev ] - pp[ iPrev + 1 ];\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault: // ZeroCurvatureEnding\n\n\t\t\t\t\t// f''(t0) = 0 a.k.a. Natural Spline\n\t\t\t\t\tiPrev = i1;\n\t\t\t\t\ttPrev = t1;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( tNext === undefined ) {\n\n\t\t\tswitch ( this.getSettings_().endingEnd ) {\n\n\t\t\t\tcase ZeroSlopeEnding:\n\n\t\t\t\t\t// f'(tN) = 0\n\t\t\t\t\tiNext = i1;\n\t\t\t\t\ttNext = 2 * t1 - t0;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase WrapAroundEnding:\n\n\t\t\t\t\t// use the other end of the curve\n\t\t\t\t\tiNext = 1;\n\t\t\t\t\ttNext = t1 + pp[ 1 ] - pp[ 0 ];\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault: // ZeroCurvatureEnding\n\n\t\t\t\t\t// f''(tN) = 0, a.k.a. Natural Spline\n\t\t\t\t\tiNext = i1 - 1;\n\t\t\t\t\ttNext = t0;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst halfDt = ( t1 - t0 ) * 0.5,\n\t\t\tstride = this.valueSize;\n\n\t\tthis._weightPrev = halfDt / ( t0 - tPrev );\n\t\tthis._weightNext = halfDt / ( tNext - t1 );\n\t\tthis._offsetPrev = iPrev * stride;\n\t\tthis._offsetNext = iNext * stride;\n\n\t}\n\n\tinterpolate_( i1, t0, t, t1 ) {\n\n\t\tconst result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tstride = this.valueSize,\n\n\t\t\to1 = i1 * stride,\t\to0 = o1 - stride,\n\t\t\toP = this._offsetPrev, \toN = this._offsetNext,\n\t\t\twP = this._weightPrev,\twN = this._weightNext,\n\n\t\t\tp = ( t - t0 ) / ( t1 - t0 ),\n\t\t\tpp = p * p,\n\t\t\tppp = pp * p;\n\n\t\t// evaluate polynomials\n\n\t\tconst sP = - wP * ppp + 2 * wP * pp - wP * p;\n\t\tconst s0 = ( 1 + wP ) * ppp + ( -1.5 - 2 * wP ) * pp + ( -0.5 + wP ) * p + 1;\n\t\tconst s1 = ( -1 - wN ) * ppp + ( 1.5 + wN ) * pp + 0.5 * p;\n\t\tconst sN = wN * ppp - wN * pp;\n\n\t\t// combine data linearly\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tresult[ i ] =\n\t\t\t\t\tsP * values[ oP + i ] +\n\t\t\t\t\ts0 * values[ o0 + i ] +\n\t\t\t\t\ts1 * values[ o1 + i ] +\n\t\t\t\t\tsN * values[ oN + i ];\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n}\n\n/**\n * A basic linear interpolant.\n *\n * @augments Interpolant\n */\nclass LinearInterpolant extends Interpolant {\n\n\t/**\n\t * Constructs a new linear interpolant.\n\t *\n\t * @param {TypedArray} parameterPositions - The parameter positions hold the interpolation factors.\n\t * @param {TypedArray} sampleValues - The sample values.\n\t * @param {number} sampleSize - The sample size\n\t * @param {TypedArray} [resultBuffer] - The result buffer.\n\t */\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tsuper( parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tinterpolate_( i1, t0, t, t1 ) {\n\n\t\tconst result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tstride = this.valueSize,\n\n\t\t\toffset1 = i1 * stride,\n\t\t\toffset0 = offset1 - stride,\n\n\t\t\tweight1 = ( t - t0 ) / ( t1 - t0 ),\n\t\t\tweight0 = 1 - weight1;\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tresult[ i ] =\n\t\t\t\t\tvalues[ offset0 + i ] * weight0 +\n\t\t\t\t\tvalues[ offset1 + i ] * weight1;\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n}\n\n/**\n * Interpolant that evaluates to the sample value at the position preceding\n * the parameter.\n *\n * @augments Interpolant\n */\nclass DiscreteInterpolant extends Interpolant {\n\n\t/**\n\t * Constructs a new discrete interpolant.\n\t *\n\t * @param {TypedArray} parameterPositions - The parameter positions hold the interpolation factors.\n\t * @param {TypedArray} sampleValues - The sample values.\n\t * @param {number} sampleSize - The sample size\n\t * @param {TypedArray} [resultBuffer] - The result buffer.\n\t */\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tsuper( parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tinterpolate_( i1 /*, t0, t, t1 */ ) {\n\n\t\treturn this.copySampleValue_( i1 - 1 );\n\n\t}\n\n}\n\n/**\n * Represents s a timed sequence of keyframes, which are composed of lists of\n * times and related values, and which are used to animate a specific property\n * of an object.\n */\nclass KeyframeTrack {\n\n\t/**\n\t * Constructs a new keyframe track.\n\t *\n\t * @param {string} name - The keyframe track's name.\n\t * @param {Array<number>} times - A list of keyframe times.\n\t * @param {Array<number|string|boolean>} values - A list of keyframe values.\n\t * @param {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)} [interpolation] - The interpolation type.\n\t */\n\tconstructor( name, times, values, interpolation ) {\n\n\t\tif ( name === undefined ) throw new Error( 'THREE.KeyframeTrack: track name is undefined' );\n\t\tif ( times === undefined || times.length === 0 ) throw new Error( 'THREE.KeyframeTrack: no keyframes in track named ' + name );\n\n\t\t/**\n\t\t * The track's name can refer to morph targets or bones or\n\t\t * possibly other values within an animated object. See {@link PropertyBinding#parseTrackName}\n\t\t * for the forms of strings that can be parsed for property binding.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = name;\n\n\t\t/**\n\t\t * The keyframe times.\n\t\t *\n\t\t * @type {Float32Array}\n\t\t */\n\t\tthis.times = convertArray( times, this.TimeBufferType );\n\n\t\t/**\n\t\t * The keyframe values.\n\t\t *\n\t\t * @type {Float32Array}\n\t\t */\n\t\tthis.values = convertArray( values, this.ValueBufferType );\n\n\t\tthis.setInterpolation( interpolation || this.DefaultInterpolation );\n\n\t}\n\n\t/**\n\t * Converts the keyframe track to JSON.\n\t *\n\t * @static\n\t * @param {KeyframeTrack} track - The keyframe track to serialize.\n\t * @return {Object} The serialized keyframe track as JSON.\n\t */\n\tstatic toJSON( track ) {\n\n\t\tconst trackType = track.constructor;\n\n\t\tlet json;\n\n\t\t// derived classes can define a static toJSON method\n\t\tif ( trackType.toJSON !== this.toJSON ) {\n\n\t\t\tjson = trackType.toJSON( track );\n\n\t\t} else {\n\n\t\t\t// by default, we assume the data can be serialized as-is\n\t\t\tjson = {\n\n\t\t\t\t'name': track.name,\n\t\t\t\t'times': convertArray( track.times, Array ),\n\t\t\t\t'values': convertArray( track.values, Array )\n\n\t\t\t};\n\n\t\t\tconst interpolation = track.getInterpolation();\n\n\t\t\tif ( interpolation !== track.DefaultInterpolation ) {\n\n\t\t\t\tjson.interpolation = interpolation;\n\n\t\t\t}\n\n\t\t}\n\n\t\tjson.type = track.ValueTypeName; // mandatory\n\n\t\treturn json;\n\n\t}\n\n\t/**\n\t * Factory method for creating a new discrete interpolant.\n\t *\n\t * @static\n\t * @param {TypedArray} [result] - The result buffer.\n\t * @return {DiscreteInterpolant} The new interpolant.\n\t */\n\tInterpolantFactoryMethodDiscrete( result ) {\n\n\t\treturn new DiscreteInterpolant( this.times, this.values, this.getValueSize(), result );\n\n\t}\n\n\t/**\n\t * Factory method for creating a new linear interpolant.\n\t *\n\t * @static\n\t * @param {TypedArray} [result] - The result buffer.\n\t * @return {LinearInterpolant} The new interpolant.\n\t */\n\tInterpolantFactoryMethodLinear( result ) {\n\n\t\treturn new LinearInterpolant( this.times, this.values, this.getValueSize(), result );\n\n\t}\n\n\t/**\n\t * Factory method for creating a new smooth interpolant.\n\t *\n\t * @static\n\t * @param {TypedArray} [result] - The result buffer.\n\t * @return {CubicInterpolant} The new interpolant.\n\t */\n\tInterpolantFactoryMethodSmooth( result ) {\n\n\t\treturn new CubicInterpolant( this.times, this.values, this.getValueSize(), result );\n\n\t}\n\n\t/**\n\t * Defines the interpolation factor method for this keyframe track.\n\t *\n\t * @param {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)} interpolation - The interpolation type.\n\t * @return {KeyframeTrack} A reference to this keyframe track.\n\t */\n\tsetInterpolation( interpolation ) {\n\n\t\tlet factoryMethod;\n\n\t\tswitch ( interpolation ) {\n\n\t\t\tcase InterpolateDiscrete:\n\n\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodDiscrete;\n\n\t\t\t\tbreak;\n\n\t\t\tcase InterpolateLinear:\n\n\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodLinear;\n\n\t\t\t\tbreak;\n\n\t\t\tcase InterpolateSmooth:\n\n\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodSmooth;\n\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\tif ( factoryMethod === undefined ) {\n\n\t\t\tconst message = 'unsupported interpolation for ' +\n\t\t\t\tthis.ValueTypeName + ' keyframe track named ' + this.name;\n\n\t\t\tif ( this.createInterpolant === undefined ) {\n\n\t\t\t\t// fall back to default, unless the default itself is messed up\n\t\t\t\tif ( interpolation !== this.DefaultInterpolation ) {\n\n\t\t\t\t\tthis.setInterpolation( this.DefaultInterpolation );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new Error( message ); // fatal, in this case\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\twarn( 'KeyframeTrack:', message );\n\t\t\treturn this;\n\n\t\t}\n\n\t\tthis.createInterpolant = factoryMethod;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the current interpolation type.\n\t *\n\t * @return {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)} The interpolation type.\n\t */\n\tgetInterpolation() {\n\n\t\tswitch ( this.createInterpolant ) {\n\n\t\t\tcase this.InterpolantFactoryMethodDiscrete:\n\n\t\t\t\treturn InterpolateDiscrete;\n\n\t\t\tcase this.InterpolantFactoryMethodLinear:\n\n\t\t\t\treturn InterpolateLinear;\n\n\t\t\tcase this.InterpolantFactoryMethodSmooth:\n\n\t\t\t\treturn InterpolateSmooth;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns the value size.\n\t *\n\t * @return {number} The value size.\n\t */\n\tgetValueSize() {\n\n\t\treturn this.values.length / this.times.length;\n\n\t}\n\n\t/**\n\t * Moves all keyframes either forward or backward in time.\n\t *\n\t * @param {number} timeOffset - The offset to move the time values.\n\t * @return {KeyframeTrack} A reference to this keyframe track.\n\t */\n\tshift( timeOffset ) {\n\n\t\tif ( timeOffset !== 0.0 ) {\n\n\t\t\tconst times = this.times;\n\n\t\t\tfor ( let i = 0, n = times.length; i !== n; ++ i ) {\n\n\t\t\t\ttimes[ i ] += timeOffset;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Scale all keyframe times by a factor (useful for frame - seconds conversions).\n\t *\n\t * @param {number} timeScale - The time scale.\n\t * @return {KeyframeTrack} A reference to this keyframe track.\n\t */\n\tscale( timeScale ) {\n\n\t\tif ( timeScale !== 1.0 ) {\n\n\t\t\tconst times = this.times;\n\n\t\t\tfor ( let i = 0, n = times.length; i !== n; ++ i ) {\n\n\t\t\t\ttimes[ i ] *= timeScale;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Removes keyframes before and after animation without changing any values within the defined time range.\n\t *\n\t * Note: The method does not shift around keys to the start of the track time, because for interpolated\n\t * keys this will change their values\n\t *\n\t * @param {number} startTime - The start time.\n\t * @param {number} endTime - The end time.\n\t * @return {KeyframeTrack} A reference to this keyframe track.\n\t */\n\ttrim( startTime, endTime ) {\n\n\t\tconst times = this.times,\n\t\t\tnKeys = times.length;\n\n\t\tlet from = 0,\n\t\t\tto = nKeys - 1;\n\n\t\twhile ( from !== nKeys && times[ from ] < startTime ) {\n\n\t\t\t++ from;\n\n\t\t}\n\n\t\twhile ( to !== -1 && times[ to ] > endTime ) {\n\n\t\t\t-- to;\n\n\t\t}\n\n\t\t++ to; // inclusive -> exclusive bound\n\n\t\tif ( from !== 0 || to !== nKeys ) {\n\n\t\t\t// empty tracks are forbidden, so keep at least one keyframe\n\t\t\tif ( from >= to ) {\n\n\t\t\t\tto = Math.max( to, 1 );\n\t\t\t\tfrom = to - 1;\n\n\t\t\t}\n\n\t\t\tconst stride = this.getValueSize();\n\t\t\tthis.times = times.slice( from, to );\n\t\t\tthis.values = this.values.slice( from * stride, to * stride );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Performs minimal validation on the keyframe track. Returns `true` if the values\n\t * are valid.\n\t *\n\t * @return {boolean} Whether the keyframes are valid or not.\n\t */\n\tvalidate() {\n\n\t\tlet valid = true;\n\n\t\tconst valueSize = this.getValueSize();\n\t\tif ( valueSize - Math.floor( valueSize ) !== 0 ) {\n\n\t\t\terror( 'KeyframeTrack: Invalid value size in track.', this );\n\t\t\tvalid = false;\n\n\t\t}\n\n\t\tconst times = this.times,\n\t\t\tvalues = this.values,\n\n\t\t\tnKeys = times.length;\n\n\t\tif ( nKeys === 0 ) {\n\n\t\t\terror( 'KeyframeTrack: Track is empty.', this );\n\t\t\tvalid = false;\n\n\t\t}\n\n\t\tlet prevTime = null;\n\n\t\tfor ( let i = 0; i !== nKeys; i ++ ) {\n\n\t\t\tconst currTime = times[ i ];\n\n\t\t\tif ( typeof currTime === 'number' && isNaN( currTime ) ) {\n\n\t\t\t\terror( 'KeyframeTrack: Time is not a valid number.', this, i, currTime );\n\t\t\t\tvalid = false;\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tif ( prevTime !== null && prevTime > currTime ) {\n\n\t\t\t\terror( 'KeyframeTrack: Out of order keys.', this, i, currTime, prevTime );\n\t\t\t\tvalid = false;\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tprevTime = currTime;\n\n\t\t}\n\n\t\tif ( values !== undefined ) {\n\n\t\t\tif ( isTypedArray( values ) ) {\n\n\t\t\t\tfor ( let i = 0, n = values.length; i !== n; ++ i ) {\n\n\t\t\t\t\tconst value = values[ i ];\n\n\t\t\t\t\tif ( isNaN( value ) ) {\n\n\t\t\t\t\t\terror( 'KeyframeTrack: Value is not a valid number.', this, i, value );\n\t\t\t\t\t\tvalid = false;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn valid;\n\n\t}\n\n\t/**\n\t * Optimizes this keyframe track by removing equivalent sequential keys (which are\n\t * common in morph target sequences).\n\t *\n\t * @return {AnimationClip} A reference to this animation clip.\n\t */\n\toptimize() {\n\n\t\t// (0,0,0,0,1,1,1,0,0,0,0,0,0,0) --> (0,0,1,1,0,0)\n\n\t\t// times or values may be shared with other tracks, so overwriting is unsafe\n\t\tconst times = this.times.slice(),\n\t\t\tvalues = this.values.slice(),\n\t\t\tstride = this.getValueSize(),\n\n\t\t\tsmoothInterpolation = this.getInterpolation() === InterpolateSmooth,\n\n\t\t\tlastIndex = times.length - 1;\n\n\t\tlet writeIndex = 1;\n\n\t\tfor ( let i = 1; i < lastIndex; ++ i ) {\n\n\t\t\tlet keep = false;\n\n\t\t\tconst time = times[ i ];\n\t\t\tconst timeNext = times[ i + 1 ];\n\n\t\t\t// remove adjacent keyframes scheduled at the same time\n\n\t\t\tif ( time !== timeNext && ( i !== 1 || time !== times[ 0 ] ) ) {\n\n\t\t\t\tif ( ! smoothInterpolation ) {\n\n\t\t\t\t\t// remove unnecessary keyframes same as their neighbors\n\n\t\t\t\t\tconst offset = i * stride,\n\t\t\t\t\t\toffsetP = offset - stride,\n\t\t\t\t\t\toffsetN = offset + stride;\n\n\t\t\t\t\tfor ( let j = 0; j !== stride; ++ j ) {\n\n\t\t\t\t\t\tconst value = values[ offset + j ];\n\n\t\t\t\t\t\tif ( value !== values[ offsetP + j ] ||\n\t\t\t\t\t\t\tvalue !== values[ offsetN + j ] ) {\n\n\t\t\t\t\t\t\tkeep = true;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tkeep = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// in-place compaction\n\n\t\t\tif ( keep ) {\n\n\t\t\t\tif ( i !== writeIndex ) {\n\n\t\t\t\t\ttimes[ writeIndex ] = times[ i ];\n\n\t\t\t\t\tconst readOffset = i * stride,\n\t\t\t\t\t\twriteOffset = writeIndex * stride;\n\n\t\t\t\t\tfor ( let j = 0; j !== stride; ++ j ) {\n\n\t\t\t\t\t\tvalues[ writeOffset + j ] = values[ readOffset + j ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t++ writeIndex;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// flush last keyframe (compaction looks ahead)\n\n\t\tif ( lastIndex > 0 ) {\n\n\t\t\ttimes[ writeIndex ] = times[ lastIndex ];\n\n\t\t\tfor ( let readOffset = lastIndex * stride, writeOffset = writeIndex * stride, j = 0; j !== stride; ++ j ) {\n\n\t\t\t\tvalues[ writeOffset + j ] = values[ readOffset + j ];\n\n\t\t\t}\n\n\t\t\t++ writeIndex;\n\n\t\t}\n\n\t\tif ( writeIndex !== times.length ) {\n\n\t\t\tthis.times = times.slice( 0, writeIndex );\n\t\t\tthis.values = values.slice( 0, writeIndex * stride );\n\n\t\t} else {\n\n\t\t\tthis.times = times;\n\t\t\tthis.values = values;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new keyframe track with copied values from this instance.\n\t *\n\t * @return {KeyframeTrack} A clone of this instance.\n\t */\n\tclone() {\n\n\t\tconst times = this.times.slice();\n\t\tconst values = this.values.slice();\n\n\t\tconst TypedKeyframeTrack = this.constructor;\n\t\tconst track = new TypedKeyframeTrack( this.name, times, values );\n\n\t\t// Interpolant argument to constructor is not saved, so copy the factory method directly.\n\t\ttrack.createInterpolant = this.createInterpolant;\n\n\t\treturn track;\n\n\t}\n\n}\n\n/**\n * The value type name.\n *\n * @type {String}\n * @default ''\n */\nKeyframeTrack.prototype.ValueTypeName = '';\n\n/**\n * The time buffer type of this keyframe track.\n *\n * @type {TypedArray|Array}\n * @default Float32Array.constructor\n */\nKeyframeTrack.prototype.TimeBufferType = Float32Array;\n\n/**\n * The value buffer type of this keyframe track.\n *\n * @type {TypedArray|Array}\n * @default Float32Array.constructor\n */\nKeyframeTrack.prototype.ValueBufferType = Float32Array;\n\n/**\n * The default interpolation type of this keyframe track.\n *\n * @type {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)}\n * @default InterpolateLinear\n */\nKeyframeTrack.prototype.DefaultInterpolation = InterpolateLinear;\n\n/**\n * A track for boolean keyframe values.\n *\n * @augments KeyframeTrack\n */\nclass BooleanKeyframeTrack extends KeyframeTrack {\n\n\t/**\n\t * Constructs a new boolean keyframe track.\n\t *\n\t * This keyframe track type has no `interpolation` parameter because the\n\t * interpolation is always discrete.\n\t *\n\t * @param {string} name - The keyframe track's name.\n\t * @param {Array<number>} times - A list of keyframe times.\n\t * @param {Array<boolean>} values - A list of keyframe values.\n\t */\n\tconstructor( name, times, values ) {\n\n\t\tsuper( name, times, values );\n\n\t}\n\n}\n\n/**\n * The value type name.\n *\n * @type {String}\n * @default 'bool'\n */\nBooleanKeyframeTrack.prototype.ValueTypeName = 'bool';\n\n/**\n * The value buffer type of this keyframe track.\n *\n * @type {TypedArray|Array}\n * @default Array.constructor\n */\nBooleanKeyframeTrack.prototype.ValueBufferType = Array;\n\n/**\n * The default interpolation type of this keyframe track.\n *\n * @type {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)}\n * @default InterpolateDiscrete\n */\nBooleanKeyframeTrack.prototype.DefaultInterpolation = InterpolateDiscrete;\nBooleanKeyframeTrack.prototype.InterpolantFactoryMethodLinear = undefined;\nBooleanKeyframeTrack.prototype.InterpolantFactoryMethodSmooth = undefined;\n\n/**\n * A track for color keyframe values.\n *\n * @augments KeyframeTrack\n */\nclass ColorKeyframeTrack extends KeyframeTrack {\n\n\t/**\n\t * Constructs a new color keyframe track.\n\t *\n\t * @param {string} name - The keyframe track's name.\n\t * @param {Array<number>} times - A list of keyframe times.\n\t * @param {Array<number>} values - A list of keyframe values.\n\t * @param {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)} [interpolation] - The interpolation type.\n\t */\n\tconstructor( name, times, values, interpolation ) {\n\n\t\tsuper( name, times, values, interpolation );\n\n\t}\n\n}\n\n/**\n * The value type name.\n *\n * @type {String}\n * @default 'color'\n */\nColorKeyframeTrack.prototype.ValueTypeName = 'color';\n\n/**\n * A track for numeric keyframe values.\n *\n * @augments KeyframeTrack\n */\nclass NumberKeyframeTrack extends KeyframeTrack {\n\n\t/**\n\t * Constructs a new number keyframe track.\n\t *\n\t * @param {string} name - The keyframe track's name.\n\t * @param {Array<number>} times - A list of keyframe times.\n\t * @param {Array<number>} values - A list of keyframe values.\n\t * @param {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)} [interpolation] - The interpolation type.\n\t */\n\tconstructor( name, times, values, interpolation ) {\n\n\t\tsuper( name, times, values, interpolation );\n\n\t}\n\n}\n\n/**\n * The value type name.\n *\n * @type {String}\n * @default 'number'\n */\nNumberKeyframeTrack.prototype.ValueTypeName = 'number';\n\n/**\n * Spherical linear unit quaternion interpolant.\n *\n * @augments Interpolant\n */\nclass QuaternionLinearInterpolant extends Interpolant {\n\n\t/**\n\t * Constructs a new SLERP interpolant.\n\t *\n\t * @param {TypedArray} parameterPositions - The parameter positions hold the interpolation factors.\n\t * @param {TypedArray} sampleValues - The sample values.\n\t * @param {number} sampleSize - The sample size\n\t * @param {TypedArray} [resultBuffer] - The result buffer.\n\t */\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tsuper( parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tinterpolate_( i1, t0, t, t1 ) {\n\n\t\tconst result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tstride = this.valueSize,\n\n\t\t\talpha = ( t - t0 ) / ( t1 - t0 );\n\n\t\tlet offset = i1 * stride;\n\n\t\tfor ( let end = offset + stride; offset !== end; offset += 4 ) {\n\n\t\t\tQuaternion.slerpFlat( result, 0, values, offset - stride, values, offset, alpha );\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n}\n\n/**\n * A track for Quaternion keyframe values.\n *\n * @augments KeyframeTrack\n */\nclass QuaternionKeyframeTrack extends KeyframeTrack {\n\n\t/**\n\t * Constructs a new Quaternion keyframe track.\n\t *\n\t * @param {string} name - The keyframe track's name.\n\t * @param {Array<number>} times - A list of keyframe times.\n\t * @param {Array<number>} values - A list of keyframe values.\n\t * @param {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)} [interpolation] - The interpolation type.\n\t */\n\tconstructor( name, times, values, interpolation ) {\n\n\t\tsuper( name, times, values, interpolation );\n\n\t}\n\n\t/**\n\t * Overwritten so the method returns Quaternion based interpolant.\n\t *\n\t * @static\n\t * @param {TypedArray} [result] - The result buffer.\n\t * @return {QuaternionLinearInterpolant} The new interpolant.\n\t */\n\tInterpolantFactoryMethodLinear( result ) {\n\n\t\treturn new QuaternionLinearInterpolant( this.times, this.values, this.getValueSize(), result );\n\n\t}\n\n}\n\n/**\n * The value type name.\n *\n * @type {String}\n * @default 'quaternion'\n */\nQuaternionKeyframeTrack.prototype.ValueTypeName = 'quaternion';\n// ValueBufferType is inherited\n// DefaultInterpolation is inherited;\nQuaternionKeyframeTrack.prototype.InterpolantFactoryMethodSmooth = undefined;\n\n/**\n * A track for string keyframe values.\n *\n * @augments KeyframeTrack\n */\nclass StringKeyframeTrack extends KeyframeTrack {\n\n\t/**\n\t * Constructs a new string keyframe track.\n\t *\n\t * This keyframe track type has no `interpolation` parameter because the\n\t * interpolation is always discrete.\n\t *\n\t * @param {string} name - The keyframe track's name.\n\t * @param {Array<number>} times - A list of keyframe times.\n\t * @param {Array<string>} values - A list of keyframe values.\n\t */\n\tconstructor( name, times, values ) {\n\n\t\tsuper( name, times, values );\n\n\t}\n\n}\n\n/**\n * The value type name.\n *\n * @type {String}\n * @default 'string'\n */\nStringKeyframeTrack.prototype.ValueTypeName = 'string';\n\n/**\n * The value buffer type of this keyframe track.\n *\n * @type {TypedArray|Array}\n * @default Array.constructor\n */\nStringKeyframeTrack.prototype.ValueBufferType = Array;\n\n/**\n * The default interpolation type of this keyframe track.\n *\n * @type {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)}\n * @default InterpolateDiscrete\n */\nStringKeyframeTrack.prototype.DefaultInterpolation = InterpolateDiscrete;\nStringKeyframeTrack.prototype.InterpolantFactoryMethodLinear = undefined;\nStringKeyframeTrack.prototype.InterpolantFactoryMethodSmooth = undefined;\n\n/**\n * A track for vector keyframe values.\n *\n * @augments KeyframeTrack\n */\nclass VectorKeyframeTrack extends KeyframeTrack {\n\n\t/**\n\t * Constructs a new vector keyframe track.\n\t *\n\t * @param {string} name - The keyframe track's name.\n\t * @param {Array<number>} times - A list of keyframe times.\n\t * @param {Array<number>} values - A list of keyframe values.\n\t * @param {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)} [interpolation] - The interpolation type.\n\t */\n\tconstructor( name, times, values, interpolation ) {\n\n\t\tsuper( name, times, values, interpolation );\n\n\t}\n\n}\n\n/**\n * The value type name.\n *\n * @type {String}\n * @default 'vector'\n */\nVectorKeyframeTrack.prototype.ValueTypeName = 'vector';\n\n/**\n * A reusable set of keyframe tracks which represent an animation.\n */\nclass AnimationClip {\n\n\t/**\n\t * Constructs a new animation clip.\n\t *\n\t * Note: Instead of instantiating an AnimationClip directly with the constructor, you can\n\t * use the static interface of this class for creating clips. In most cases though, animation clips\n\t * will automatically be created by loaders when importing animated 3D assets.\n\t *\n\t * @param {string} [name=''] - The clip's name.\n\t * @param {number} [duration=-1] - The clip's duration in seconds. If a negative value is passed,\n\t * the duration will be calculated from the passed keyframes.\n\t * @param {Array<KeyframeTrack>} tracks - An array of keyframe tracks.\n\t * @param {(NormalAnimationBlendMode|AdditiveAnimationBlendMode)} [blendMode=NormalAnimationBlendMode] - Defines how the animation\n\t * is blended/combined when two or more animations are simultaneously played.\n\t */\n\tconstructor( name = '', duration = -1, tracks = [], blendMode = NormalAnimationBlendMode ) {\n\n\t\t/**\n\t\t * The clip's name.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = name;\n\n\t\t/**\n\t\t *  An array of keyframe tracks.\n\t\t *\n\t\t * @type {Array<KeyframeTrack>}\n\t\t */\n\t\tthis.tracks = tracks;\n\n\t\t/**\n\t\t * The clip's duration in seconds.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.duration = duration;\n\n\t\t/**\n\t\t * Defines how the animation is blended/combined when two or more animations\n\t\t * are simultaneously played.\n\t\t *\n\t\t * @type {(NormalAnimationBlendMode|AdditiveAnimationBlendMode)}\n\t\t */\n\t\tthis.blendMode = blendMode;\n\n\t\t/**\n\t\t * The UUID of the animation clip.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.uuid = generateUUID();\n\n\t\t/**\n\t\t * An object that can be used to store custom data about the animation clip.\n\t\t * It should not hold references to functions as these will not be cloned.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.userData = {};\n\n\t\t// this means it should figure out its duration by scanning the tracks\n\t\tif ( this.duration < 0 ) {\n\n\t\t\tthis.resetDuration();\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Factory method for creating an animation clip from the given JSON.\n\t *\n\t * @static\n\t * @param {Object} json - The serialized animation clip.\n\t * @return {AnimationClip} The new animation clip.\n\t */\n\tstatic parse( json ) {\n\n\t\tconst tracks = [],\n\t\t\tjsonTracks = json.tracks,\n\t\t\tframeTime = 1.0 / ( json.fps || 1.0 );\n\n\t\tfor ( let i = 0, n = jsonTracks.length; i !== n; ++ i ) {\n\n\t\t\ttracks.push( parseKeyframeTrack( jsonTracks[ i ] ).scale( frameTime ) );\n\n\t\t}\n\n\t\tconst clip = new this( json.name, json.duration, tracks, json.blendMode );\n\t\tclip.uuid = json.uuid;\n\n\t\tclip.userData = JSON.parse( json.userData || '{}' );\n\n\t\treturn clip;\n\n\t}\n\n\t/**\n\t * Serializes the given animation clip into JSON.\n\t *\n\t * @static\n\t * @param {AnimationClip} clip - The animation clip to serialize.\n\t * @return {Object} The JSON object.\n\t */\n\tstatic toJSON( clip ) {\n\n\t\tconst tracks = [],\n\t\t\tclipTracks = clip.tracks;\n\n\t\tconst json = {\n\n\t\t\t'name': clip.name,\n\t\t\t'duration': clip.duration,\n\t\t\t'tracks': tracks,\n\t\t\t'uuid': clip.uuid,\n\t\t\t'blendMode': clip.blendMode,\n\t\t\t'userData': JSON.stringify( clip.userData ),\n\n\t\t};\n\n\t\tfor ( let i = 0, n = clipTracks.length; i !== n; ++ i ) {\n\n\t\t\ttracks.push( KeyframeTrack.toJSON( clipTracks[ i ] ) );\n\n\t\t}\n\n\t\treturn json;\n\n\t}\n\n\t/**\n\t * Returns a new animation clip from the passed morph targets array of a\n\t * geometry, taking a name and the number of frames per second.\n\t *\n\t * Note: The fps parameter is required, but the animation speed can be\n\t * overridden via {@link AnimationAction#setDuration}.\n\t *\n\t * @static\n\t * @param {string} name - The name of the animation clip.\n\t * @param {Array<Object>} morphTargetSequence - A sequence of morph targets.\n\t * @param {number} fps - The Frames-Per-Second value.\n\t * @param {boolean} noLoop - Whether the clip should be no loop or not.\n\t * @return {AnimationClip} The new animation clip.\n\t */\n\tstatic CreateFromMorphTargetSequence( name, morphTargetSequence, fps, noLoop ) {\n\n\t\tconst numMorphTargets = morphTargetSequence.length;\n\t\tconst tracks = [];\n\n\t\tfor ( let i = 0; i < numMorphTargets; i ++ ) {\n\n\t\t\tlet times = [];\n\t\t\tlet values = [];\n\n\t\t\ttimes.push(\n\t\t\t\t( i + numMorphTargets - 1 ) % numMorphTargets,\n\t\t\t\ti,\n\t\t\t\t( i + 1 ) % numMorphTargets );\n\n\t\t\tvalues.push( 0, 1, 0 );\n\n\t\t\tconst order = getKeyframeOrder( times );\n\t\t\ttimes = sortedArray( times, 1, order );\n\t\t\tvalues = sortedArray( values, 1, order );\n\n\t\t\t// if there is a key at the first frame, duplicate it as the\n\t\t\t// last frame as well for perfect loop.\n\t\t\tif ( ! noLoop && times[ 0 ] === 0 ) {\n\n\t\t\t\ttimes.push( numMorphTargets );\n\t\t\t\tvalues.push( values[ 0 ] );\n\n\t\t\t}\n\n\t\t\ttracks.push(\n\t\t\t\tnew NumberKeyframeTrack(\n\t\t\t\t\t'.morphTargetInfluences[' + morphTargetSequence[ i ].name + ']',\n\t\t\t\t\ttimes, values\n\t\t\t\t).scale( 1.0 / fps ) );\n\n\t\t}\n\n\t\treturn new this( name, -1, tracks );\n\n\t}\n\n\t/**\n\t * Searches for an animation clip by name, taking as its first parameter\n\t * either an array of clips, or a mesh or geometry that contains an\n\t * array named \"animations\" property.\n\t *\n\t * @static\n\t * @param {(Array<AnimationClip>|Object3D)} objectOrClipArray - The array or object to search through.\n\t * @param {string} name - The name to search for.\n\t * @return {?AnimationClip} The found animation clip. Returns `null` if no clip has been found.\n\t */\n\tstatic findByName( objectOrClipArray, name ) {\n\n\t\tlet clipArray = objectOrClipArray;\n\n\t\tif ( ! Array.isArray( objectOrClipArray ) ) {\n\n\t\t\tconst o = objectOrClipArray;\n\t\t\tclipArray = o.geometry && o.geometry.animations || o.animations;\n\n\t\t}\n\n\t\tfor ( let i = 0; i < clipArray.length; i ++ ) {\n\n\t\t\tif ( clipArray[ i ].name === name ) {\n\n\t\t\t\treturn clipArray[ i ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\t/**\n\t * Returns an array of new AnimationClips created from the morph target\n\t * sequences of a geometry, trying to sort morph target names into\n\t * animation-group-based patterns like \"Walk_001, Walk_002, Run_001, Run_002...\".\n\t *\n\t * See {@link MD2Loader#parse} as an example for how the method should be used.\n\t *\n\t * @static\n\t * @param {Array<Object>} morphTargets - A sequence of morph targets.\n\t * @param {number} fps - The Frames-Per-Second value.\n\t * @param {boolean} noLoop - Whether the clip should be no loop or not.\n\t * @return {Array<AnimationClip>} An array of new animation clips.\n\t */\n\tstatic CreateClipsFromMorphTargetSequences( morphTargets, fps, noLoop ) {\n\n\t\tconst animationToMorphTargets = {};\n\n\t\t// tested with https://regex101.com/ on trick sequences\n\t\t// such flamingo_flyA_003, flamingo_run1_003, crdeath0059\n\t\tconst pattern = /^([\\w-]*?)([\\d]+)$/;\n\n\t\t// sort morph target names into animation groups based\n\t\t// patterns like Walk_001, Walk_002, Run_001, Run_002\n\t\tfor ( let i = 0, il = morphTargets.length; i < il; i ++ ) {\n\n\t\t\tconst morphTarget = morphTargets[ i ];\n\t\t\tconst parts = morphTarget.name.match( pattern );\n\n\t\t\tif ( parts && parts.length > 1 ) {\n\n\t\t\t\tconst name = parts[ 1 ];\n\n\t\t\t\tlet animationMorphTargets = animationToMorphTargets[ name ];\n\n\t\t\t\tif ( ! animationMorphTargets ) {\n\n\t\t\t\t\tanimationToMorphTargets[ name ] = animationMorphTargets = [];\n\n\t\t\t\t}\n\n\t\t\t\tanimationMorphTargets.push( morphTarget );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst clips = [];\n\n\t\tfor ( const name in animationToMorphTargets ) {\n\n\t\t\tclips.push( this.CreateFromMorphTargetSequence( name, animationToMorphTargets[ name ], fps, noLoop ) );\n\n\t\t}\n\n\t\treturn clips;\n\n\t}\n\n\t/**\n\t * Parses the `animation.hierarchy` format and returns a new animation clip.\n\t *\n\t * @static\n\t * @deprecated since r175.\n\t * @param {Object} animation - A serialized animation clip as JSON.\n\t * @param {Array<Bones>} bones - An array of bones.\n\t * @return {?AnimationClip} The new animation clip.\n\t */\n\tstatic parseAnimation( animation, bones ) {\n\n\t\twarn( 'AnimationClip: parseAnimation() is deprecated and will be removed with r185' );\n\n\t\tif ( ! animation ) {\n\n\t\t\terror( 'AnimationClip: No animation in JSONLoader data.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst addNonemptyTrack = function ( trackType, trackName, animationKeys, propertyName, destTracks ) {\n\n\t\t\t// only return track if there are actually keys.\n\t\t\tif ( animationKeys.length !== 0 ) {\n\n\t\t\t\tconst times = [];\n\t\t\t\tconst values = [];\n\n\t\t\t\tflattenJSON( animationKeys, times, values, propertyName );\n\n\t\t\t\t// empty keys are filtered out, so check again\n\t\t\t\tif ( times.length !== 0 ) {\n\n\t\t\t\t\tdestTracks.push( new trackType( trackName, times, values ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\tconst tracks = [];\n\n\t\tconst clipName = animation.name || 'default';\n\t\tconst fps = animation.fps || 30;\n\t\tconst blendMode = animation.blendMode;\n\n\t\t// automatic length determination in AnimationClip.\n\t\tlet duration = animation.length || -1;\n\n\t\tconst hierarchyTracks = animation.hierarchy || [];\n\n\t\tfor ( let h = 0; h < hierarchyTracks.length; h ++ ) {\n\n\t\t\tconst animationKeys = hierarchyTracks[ h ].keys;\n\n\t\t\t// skip empty tracks\n\t\t\tif ( ! animationKeys || animationKeys.length === 0 ) continue;\n\n\t\t\t// process morph targets\n\t\t\tif ( animationKeys[ 0 ].morphTargets ) {\n\n\t\t\t\t// figure out all morph targets used in this track\n\t\t\t\tconst morphTargetNames = {};\n\n\t\t\t\tlet k;\n\n\t\t\t\tfor ( k = 0; k < animationKeys.length; k ++ ) {\n\n\t\t\t\t\tif ( animationKeys[ k ].morphTargets ) {\n\n\t\t\t\t\t\tfor ( let m = 0; m < animationKeys[ k ].morphTargets.length; m ++ ) {\n\n\t\t\t\t\t\t\tmorphTargetNames[ animationKeys[ k ].morphTargets[ m ] ] = -1;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// create a track for each morph target with all zero\n\t\t\t\t// morphTargetInfluences except for the keys in which\n\t\t\t\t// the morphTarget is named.\n\t\t\t\tfor ( const morphTargetName in morphTargetNames ) {\n\n\t\t\t\t\tconst times = [];\n\t\t\t\t\tconst values = [];\n\n\t\t\t\t\tfor ( let m = 0; m !== animationKeys[ k ].morphTargets.length; ++ m ) {\n\n\t\t\t\t\t\tconst animationKey = animationKeys[ k ];\n\n\t\t\t\t\t\ttimes.push( animationKey.time );\n\t\t\t\t\t\tvalues.push( ( animationKey.morphTarget === morphTargetName ) ? 1 : 0 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttracks.push( new NumberKeyframeTrack( '.morphTargetInfluence[' + morphTargetName + ']', times, values ) );\n\n\t\t\t\t}\n\n\t\t\t\tduration = morphTargetNames.length * fps;\n\n\t\t\t} else {\n\n\t\t\t\t// ...assume skeletal animation\n\n\t\t\t\tconst boneName = '.bones[' + bones[ h ].name + ']';\n\n\t\t\t\taddNonemptyTrack(\n\t\t\t\t\tVectorKeyframeTrack, boneName + '.position',\n\t\t\t\t\tanimationKeys, 'pos', tracks );\n\n\t\t\t\taddNonemptyTrack(\n\t\t\t\t\tQuaternionKeyframeTrack, boneName + '.quaternion',\n\t\t\t\t\tanimationKeys, 'rot', tracks );\n\n\t\t\t\taddNonemptyTrack(\n\t\t\t\t\tVectorKeyframeTrack, boneName + '.scale',\n\t\t\t\t\tanimationKeys, 'scl', tracks );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( tracks.length === 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst clip = new this( clipName, duration, tracks, blendMode );\n\n\t\treturn clip;\n\n\t}\n\n\t/**\n\t * Sets the duration of this clip to the duration of its longest keyframe track.\n\t *\n\t * @return {AnimationClip} A reference to this animation clip.\n\t */\n\tresetDuration() {\n\n\t\tconst tracks = this.tracks;\n\t\tlet duration = 0;\n\n\t\tfor ( let i = 0, n = tracks.length; i !== n; ++ i ) {\n\n\t\t\tconst track = this.tracks[ i ];\n\n\t\t\tduration = Math.max( duration, track.times[ track.times.length - 1 ] );\n\n\t\t}\n\n\t\tthis.duration = duration;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Trims all tracks to the clip's duration.\n\t *\n\t * @return {AnimationClip} A reference to this animation clip.\n\t */\n\ttrim() {\n\n\t\tfor ( let i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\tthis.tracks[ i ].trim( 0, this.duration );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Performs minimal validation on each track in the clip. Returns `true` if all\n\t * tracks are valid.\n\t *\n\t * @return {boolean} Whether the clip's keyframes are valid or not.\n\t */\n\tvalidate() {\n\n\t\tlet valid = true;\n\n\t\tfor ( let i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\tvalid = valid && this.tracks[ i ].validate();\n\n\t\t}\n\n\t\treturn valid;\n\n\t}\n\n\t/**\n\t * Optimizes each track by removing equivalent sequential keys (which are\n\t * common in morph target sequences).\n\t *\n\t * @return {AnimationClip} A reference to this animation clip.\n\t */\n\toptimize() {\n\n\t\tfor ( let i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\tthis.tracks[ i ].optimize();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new animation clip with copied values from this instance.\n\t *\n\t * @return {AnimationClip} A clone of this instance.\n\t */\n\tclone() {\n\n\t\tconst tracks = [];\n\n\t\tfor ( let i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\ttracks.push( this.tracks[ i ].clone() );\n\n\t\t}\n\n\t\tconst clip = new this.constructor( this.name, this.duration, tracks, this.blendMode );\n\n\t\tclip.userData = JSON.parse( JSON.stringify( this.userData ) );\n\n\t\treturn clip;\n\n\t}\n\n\t/**\n\t * Serializes this animation clip into JSON.\n\t *\n\t * @return {Object} The JSON object.\n\t */\n\ttoJSON() {\n\n\t\treturn this.constructor.toJSON( this );\n\n\t}\n\n}\n\nfunction getTrackTypeForValueTypeName( typeName ) {\n\n\tswitch ( typeName.toLowerCase() ) {\n\n\t\tcase 'scalar':\n\t\tcase 'double':\n\t\tcase 'float':\n\t\tcase 'number':\n\t\tcase 'integer':\n\n\t\t\treturn NumberKeyframeTrack;\n\n\t\tcase 'vector':\n\t\tcase 'vector2':\n\t\tcase 'vector3':\n\t\tcase 'vector4':\n\n\t\t\treturn VectorKeyframeTrack;\n\n\t\tcase 'color':\n\n\t\t\treturn ColorKeyframeTrack;\n\n\t\tcase 'quaternion':\n\n\t\t\treturn QuaternionKeyframeTrack;\n\n\t\tcase 'bool':\n\t\tcase 'boolean':\n\n\t\t\treturn BooleanKeyframeTrack;\n\n\t\tcase 'string':\n\n\t\t\treturn StringKeyframeTrack;\n\n\t}\n\n\tthrow new Error( 'THREE.KeyframeTrack: Unsupported typeName: ' + typeName );\n\n}\n\nfunction parseKeyframeTrack( json ) {\n\n\tif ( json.type === undefined ) {\n\n\t\tthrow new Error( 'THREE.KeyframeTrack: track type undefined, can not parse' );\n\n\t}\n\n\tconst trackType = getTrackTypeForValueTypeName( json.type );\n\n\tif ( json.times === undefined ) {\n\n\t\tconst times = [], values = [];\n\n\t\tflattenJSON( json.keys, times, values, 'value' );\n\n\t\tjson.times = times;\n\t\tjson.values = values;\n\n\t}\n\n\t// derived classes can define a static parse method\n\tif ( trackType.parse !== undefined ) {\n\n\t\treturn trackType.parse( json );\n\n\t} else {\n\n\t\t// by default, we assume a constructor compatible with the base\n\t\treturn new trackType( json.name, json.times, json.values, json.interpolation );\n\n\t}\n\n}\n\n/**\n * @class\n * @classdesc A simple caching system, used internally by {@link FileLoader}.\n * To enable caching across all loaders that use {@link FileLoader}, add `THREE.Cache.enabled = true.` once in your app.\n * @hideconstructor\n */\nconst Cache = {\n\n\t/**\n\t * Whether caching is enabled or not.\n\t *\n\t * @static\n\t * @type {boolean}\n\t * @default false\n\t */\n\tenabled: false,\n\n\t/**\n\t * A dictionary that holds cached files.\n\t *\n\t * @static\n\t * @type {Object<string,Object>}\n\t */\n\tfiles: {},\n\n\t/**\n\t * Adds a cache entry with a key to reference the file. If this key already\n\t * holds a file, it is overwritten.\n\t *\n\t * @static\n\t * @param {string} key - The key to reference the cached file.\n\t * @param {Object} file -  The file to be cached.\n\t */\n\tadd: function ( key, file ) {\n\n\t\tif ( this.enabled === false ) return;\n\n\t\t// log( 'Cache', 'Adding key:', key );\n\n\t\tthis.files[ key ] = file;\n\n\t},\n\n\t/**\n\t * Gets the cached value for the given key.\n\t *\n\t * @static\n\t * @param {string} key - The key to reference the cached file.\n\t * @return {Object|undefined} The cached file. If the key does not exist `undefined` is returned.\n\t */\n\tget: function ( key ) {\n\n\t\tif ( this.enabled === false ) return;\n\n\t\t// log( 'Cache', 'Checking key:', key );\n\n\t\treturn this.files[ key ];\n\n\t},\n\n\t/**\n\t * Removes the cached file associated with the given key.\n\t *\n\t * @static\n\t * @param {string} key - The key to reference the cached file.\n\t */\n\tremove: function ( key ) {\n\n\t\tdelete this.files[ key ];\n\n\t},\n\n\t/**\n\t * Remove all values from the cache.\n\t *\n\t * @static\n\t */\n\tclear: function () {\n\n\t\tthis.files = {};\n\n\t}\n\n};\n\n/**\n * Handles and keeps track of loaded and pending data. A default global\n * instance of this class is created and used by loaders if not supplied\n * manually.\n *\n * In general that should be sufficient, however there are times when it can\n * be useful to have separate loaders - for example if you want to show\n * separate loading bars for objects and textures.\n *\n * ```js\n * const manager = new THREE.LoadingManager();\n * manager.onLoad = () => console.log( 'Loading complete!' );\n *\n * const loader1 = new OBJLoader( manager );\n * const loader2 = new ColladaLoader( manager );\n * ```\n */\nclass LoadingManager {\n\n\t/**\n\t * Constructs a new loading manager.\n\t *\n\t * @param {Function} [onLoad] - Executes when all items have been loaded.\n\t * @param {Function} [onProgress] - Executes when single items have been loaded.\n\t * @param {Function} [onError] - Executes when an error occurs.\n\t */\n\tconstructor( onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tlet isLoading = false;\n\t\tlet itemsLoaded = 0;\n\t\tlet itemsTotal = 0;\n\t\tlet urlModifier = undefined;\n\t\tconst handlers = [];\n\n\t\t// Refer to #5689 for the reason why we don't set .onStart\n\t\t// in the constructor\n\n\t\t/**\n\t\t * Executes when an item starts loading.\n\t\t *\n\t\t * @type {Function|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.onStart = undefined;\n\n\t\t/**\n\t\t * Executes when all items have been loaded.\n\t\t *\n\t\t * @type {Function|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.onLoad = onLoad;\n\n\t\t/**\n\t\t * Executes when single items have been loaded.\n\t\t *\n\t\t * @type {Function|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.onProgress = onProgress;\n\n\t\t/**\n\t\t * Executes when an error occurs.\n\t\t *\n\t\t * @type {Function|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.onError = onError;\n\n\t\t/**\n\t\t * Used for aborting ongoing requests in loaders using this manager.\n\t\t *\n\t\t * @private\n\t\t * @type {AbortController | null}\n\t\t */\n\t\tthis._abortController = null;\n\n\t\t/**\n\t\t * This should be called by any loader using the manager when the loader\n\t\t * starts loading an item.\n\t\t *\n\t\t * @param {string} url - The URL to load.\n\t\t */\n\t\tthis.itemStart = function ( url ) {\n\n\t\t\titemsTotal ++;\n\n\t\t\tif ( isLoading === false ) {\n\n\t\t\t\tif ( scope.onStart !== undefined ) {\n\n\t\t\t\t\tscope.onStart( url, itemsLoaded, itemsTotal );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tisLoading = true;\n\n\t\t};\n\n\t\t/**\n\t\t * This should be called by any loader using the manager when the loader\n\t\t * ended loading an item.\n\t\t *\n\t\t * @param {string} url - The URL of the loaded item.\n\t\t */\n\t\tthis.itemEnd = function ( url ) {\n\n\t\t\titemsLoaded ++;\n\n\t\t\tif ( scope.onProgress !== undefined ) {\n\n\t\t\t\tscope.onProgress( url, itemsLoaded, itemsTotal );\n\n\t\t\t}\n\n\t\t\tif ( itemsLoaded === itemsTotal ) {\n\n\t\t\t\tisLoading = false;\n\n\t\t\t\tif ( scope.onLoad !== undefined ) {\n\n\t\t\t\t\tscope.onLoad();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * This should be called by any loader using the manager when the loader\n\t\t * encounters an error when loading an item.\n\t\t *\n\t\t * @param {string} url - The URL of the item that produces an error.\n\t\t */\n\t\tthis.itemError = function ( url ) {\n\n\t\t\tif ( scope.onError !== undefined ) {\n\n\t\t\t\tscope.onError( url );\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Given a URL, uses the URL modifier callback (if any) and returns a\n\t\t * resolved URL. If no URL modifier is set, returns the original URL.\n\t\t *\n\t\t * @param {string} url - The URL to load.\n\t\t * @return {string} The resolved URL.\n\t\t */\n\t\tthis.resolveURL = function ( url ) {\n\n\t\t\tif ( urlModifier ) {\n\n\t\t\t\treturn urlModifier( url );\n\n\t\t\t}\n\n\t\t\treturn url;\n\n\t\t};\n\n\t\t/**\n\t\t * If provided, the callback will be passed each resource URL before a\n\t\t * request is sent. The callback may return the original URL, or a new URL to\n\t\t * override loading behavior. This behavior can be used to load assets from\n\t\t * .ZIP files, drag-and-drop APIs, and Data URIs.\n\t\t *\n\t\t * ```js\n\t\t * const blobs = {'fish.gltf': blob1, 'diffuse.png': blob2, 'normal.png': blob3};\n\t\t *\n\t\t * const manager = new THREE.LoadingManager();\n\t\t *\n\t\t * // Initialize loading manager with URL callback.\n\t\t * const objectURLs = [];\n\t\t * manager.setURLModifier( ( url ) => {\n\t\t *\n\t\t * \turl = URL.createObjectURL( blobs[ url ] );\n\t\t * \tobjectURLs.push( url );\n\t\t * \treturn url;\n\t\t *\n\t\t * } );\n\t\t *\n\t\t * // Load as usual, then revoke the blob URLs.\n\t\t * const loader = new GLTFLoader( manager );\n\t\t * loader.load( 'fish.gltf', (gltf) => {\n\t\t *\n\t\t * \tscene.add( gltf.scene );\n\t\t * \tobjectURLs.forEach( ( url ) => URL.revokeObjectURL( url ) );\n\t\t *\n\t\t * } );\n\t\t * ```\n\t\t *\n\t\t * @param {function(string):string} transform - URL modifier callback. Called with an URL and must return a resolved URL.\n\t\t * @return {LoadingManager} A reference to this loading manager.\n\t\t */\n\t\tthis.setURLModifier = function ( transform ) {\n\n\t\t\turlModifier = transform;\n\n\t\t\treturn this;\n\n\t\t};\n\n\t\t/**\n\t\t * Registers a loader with the given regular expression. Can be used to\n\t\t * define what loader should be used in order to load specific files. A\n\t\t * typical use case is to overwrite the default loader for textures.\n\t\t *\n\t\t * ```js\n\t\t * // add handler for TGA textures\n\t\t * manager.addHandler( /\\.tga$/i, new TGALoader() );\n\t\t * ```\n\t\t *\n\t\t * @param {string} regex - A regular expression.\n\t\t * @param {Loader} loader - A loader that should handle matched cases.\n\t\t * @return {LoadingManager} A reference to this loading manager.\n\t\t */\n\t\tthis.addHandler = function ( regex, loader ) {\n\n\t\t\thandlers.push( regex, loader );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t\t/**\n\t\t * Removes the loader for the given regular expression.\n\t\t *\n\t\t * @param {string} regex - A regular expression.\n\t\t * @return {LoadingManager} A reference to this loading manager.\n\t\t */\n\t\tthis.removeHandler = function ( regex ) {\n\n\t\t\tconst index = handlers.indexOf( regex );\n\n\t\t\tif ( index !== -1 ) {\n\n\t\t\t\thandlers.splice( index, 2 );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t};\n\n\t\t/**\n\t\t * Can be used to retrieve the registered loader for the given file path.\n\t\t *\n\t\t * @param {string} file - The file path.\n\t\t * @return {?Loader} The registered loader. Returns `null` if no loader was found.\n\t\t */\n\t\tthis.getHandler = function ( file ) {\n\n\t\t\tfor ( let i = 0, l = handlers.length; i < l; i += 2 ) {\n\n\t\t\t\tconst regex = handlers[ i ];\n\t\t\t\tconst loader = handlers[ i + 1 ];\n\n\t\t\t\tif ( regex.global ) regex.lastIndex = 0; // see #17920\n\n\t\t\t\tif ( regex.test( file ) ) {\n\n\t\t\t\t\treturn loader;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn null;\n\n\t\t};\n\n\t\t/**\n\t\t * Can be used to abort ongoing loading requests in loaders using this manager.\n\t\t * The abort only works if the loaders implement {@link Loader#abort} and `AbortSignal.any()`\n\t\t * is supported in the browser.\n\t\t *\n\t\t * @return {LoadingManager} A reference to this loading manager.\n\t\t */\n\t\tthis.abort = function () {\n\n\n\t\t\tthis.abortController.abort();\n\t\t\tthis._abortController = null;\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}\n\n\t// TODO: Revert this back to a single member variable once this issue has been fixed\n\t// https://github.com/cloudflare/workerd/issues/3657\n\n\t/**\n\t * Used for aborting ongoing requests in loaders using this manager.\n\t *\n\t * @type {AbortController}\n\t */\n\tget abortController() {\n\n\t\tif ( ! this._abortController ) {\n\n\t\t\tthis._abortController = new AbortController();\n\n\t\t}\n\n\t\treturn this._abortController;\n\n\t}\n\n}\n\n/**\n * The global default loading manager.\n *\n * @constant\n * @type {LoadingManager}\n */\nconst DefaultLoadingManager = /*@__PURE__*/ new LoadingManager();\n\n/**\n * Abstract base class for loaders.\n *\n * @abstract\n */\nclass Loader {\n\n\t/**\n\t * Constructs a new loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\t/**\n\t\t * The loading manager.\n\t\t *\n\t\t * @type {LoadingManager}\n\t\t * @default DefaultLoadingManager\n\t\t */\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t\t/**\n\t\t * The crossOrigin string to implement CORS for loading the url from a\n\t\t * different domain that allows CORS.\n\t\t *\n\t\t * @type {string}\n\t\t * @default 'anonymous'\n\t\t */\n\t\tthis.crossOrigin = 'anonymous';\n\n\t\t/**\n\t\t * Whether the XMLHttpRequest uses credentials.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.withCredentials = false;\n\n\t\t/**\n\t\t * The base path from which the asset will be loaded.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.path = '';\n\n\t\t/**\n\t\t * The base path from which additional resources like textures will be loaded.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.resourcePath = '';\n\n\t\t/**\n\t\t * The [request header](https://developer.mozilla.org/en-US/docs/Glossary/Request_header)\n\t\t * used in HTTP request.\n\t\t *\n\t\t * @type {Object<string, any>}\n\t\t */\n\t\tthis.requestHeader = {};\n\n\t}\n\n\t/**\n\t * This method needs to be implemented by all concrete loaders. It holds the\n\t * logic for loading assets from the backend.\n\t *\n\t * @abstract\n\t * @param {string} url - The path/URL of the file to be loaded.\n\t * @param {Function} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} [onProgress] - Executed while the loading is in progress.\n\t * @param {onErrorCallback} [onError] - Executed when errors occur.\n\t */\n\tload( /* url, onLoad, onProgress, onError */ ) {}\n\n\t/**\n\t * A async version of {@link Loader#load}.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded.\n\t * @param {onProgressCallback} [onProgress] - Executed while the loading is in progress.\n\t * @return {Promise} A Promise that resolves when the asset has been loaded.\n\t */\n\tloadAsync( url, onProgress ) {\n\n\t\tconst scope = this;\n\n\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\tscope.load( url, resolve, onProgress, reject );\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * This method needs to be implemented by all concrete loaders. It holds the\n\t * logic for parsing the asset into three.js entities.\n\t *\n\t * @abstract\n\t * @param {any} data - The data to parse.\n\t */\n\tparse( /* data */ ) {}\n\n\t/**\n\t * Sets the `crossOrigin` String to implement CORS for loading the URL\n\t * from a different domain that allows CORS.\n\t *\n\t * @param {string} crossOrigin - The `crossOrigin` value.\n\t * @return {Loader} A reference to this instance.\n\t */\n\tsetCrossOrigin( crossOrigin ) {\n\n\t\tthis.crossOrigin = crossOrigin;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Whether the XMLHttpRequest uses credentials such as cookies, authorization\n\t * headers or TLS client certificates, see [XMLHttpRequest.withCredentials](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/withCredentials).\n\t *\n\t * Note: This setting has no effect if you are loading files locally or from the same domain.\n\t *\n\t * @param {boolean} value - The `withCredentials` value.\n\t * @return {Loader} A reference to this instance.\n\t */\n\tsetWithCredentials( value ) {\n\n\t\tthis.withCredentials = value;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the base path for the asset.\n\t *\n\t * @param {string} path - The base path.\n\t * @return {Loader} A reference to this instance.\n\t */\n\tsetPath( path ) {\n\n\t\tthis.path = path;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the base path for dependent resources like textures.\n\t *\n\t * @param {string} resourcePath - The resource path.\n\t * @return {Loader} A reference to this instance.\n\t */\n\tsetResourcePath( resourcePath ) {\n\n\t\tthis.resourcePath = resourcePath;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given request header.\n\t *\n\t * @param {Object} requestHeader - A [request header](https://developer.mozilla.org/en-US/docs/Glossary/Request_header)\n\t * for configuring the HTTP request.\n\t * @return {Loader} A reference to this instance.\n\t */\n\tsetRequestHeader( requestHeader ) {\n\n\t\tthis.requestHeader = requestHeader;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * This method can be implemented in loaders for aborting ongoing requests.\n\t *\n\t * @abstract\n\t * @return {Loader} A reference to this instance.\n\t */\n\tabort() {\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * Callback for onProgress in loaders.\n *\n * @callback onProgressCallback\n * @param {ProgressEvent} event - An instance of `ProgressEvent` that represents the current loading status.\n */\n\n/**\n * Callback for onError in loaders.\n *\n * @callback onErrorCallback\n * @param {Error} error - The error which occurred during the loading process.\n */\n\n/**\n * The default material name that is used by loaders\n * when creating materials for loaded 3D objects.\n *\n * Note: Not all loaders might honor this setting.\n *\n * @static\n * @type {string}\n * @default '__DEFAULT'\n */\nLoader.DEFAULT_MATERIAL_NAME = '__DEFAULT';\n\nconst loading = {};\n\nclass HttpError extends Error {\n\n\tconstructor( message, response ) {\n\n\t\tsuper( message );\n\t\tthis.response = response;\n\n\t}\n\n}\n\n/**\n * A low level class for loading resources with the Fetch API, used internally by\n * most loaders. It can also be used directly to load any file type that does\n * not have a loader.\n *\n * This loader supports caching. If you want to use it, add `THREE.Cache.enabled = true;`\n * once to your application.\n *\n * ```js\n * const loader = new THREE.FileLoader();\n * const data = await loader.loadAsync( 'example.txt' );\n * ```\n *\n * @augments Loader\n */\nclass FileLoader extends Loader {\n\n\t/**\n\t * Constructs a new file loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\t/**\n\t\t * The expected mime type. Valid values can be found\n\t\t * [here](hhttps://developer.mozilla.org/en-US/docs/Web/API/DOMParser/parseFromString#mimetype)\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.mimeType = '';\n\n\t\t/**\n\t\t * The expected response type.\n\t\t *\n\t\t * @type {('arraybuffer'|'blob'|'document'|'json'|'')}\n\t\t * @default ''\n\t\t */\n\t\tthis.responseType = '';\n\n\t\t/**\n\t\t * Used for aborting requests.\n\t\t *\n\t\t * @private\n\t\t * @type {AbortController}\n\t\t */\n\t\tthis._abortController = new AbortController();\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and pass the loaded response to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(any)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} [onProgress] - Executed while the loading is in progress.\n\t * @param {onErrorCallback} [onError] - Executed when errors occur.\n\t * @return {any|undefined} The cached resource if available.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tif ( url === undefined ) url = '';\n\n\t\tif ( this.path !== undefined ) url = this.path + url;\n\n\t\turl = this.manager.resolveURL( url );\n\n\t\tconst cached = Cache.get( `file:${url}` );\n\n\t\tif ( cached !== undefined ) {\n\n\t\t\tthis.manager.itemStart( url );\n\n\t\t\tsetTimeout( () => {\n\n\t\t\t\tif ( onLoad ) onLoad( cached );\n\n\t\t\t\tthis.manager.itemEnd( url );\n\n\t\t\t}, 0 );\n\n\t\t\treturn cached;\n\n\t\t}\n\n\t\t// Check if request is duplicate\n\n\t\tif ( loading[ url ] !== undefined ) {\n\n\t\t\tloading[ url ].push( {\n\n\t\t\t\tonLoad: onLoad,\n\t\t\t\tonProgress: onProgress,\n\t\t\t\tonError: onError\n\n\t\t\t} );\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t// Initialise array for duplicate requests\n\t\tloading[ url ] = [];\n\n\t\tloading[ url ].push( {\n\t\t\tonLoad: onLoad,\n\t\t\tonProgress: onProgress,\n\t\t\tonError: onError,\n\t\t} );\n\n\t\t// create request\n\t\tconst req = new Request( url, {\n\t\t\theaders: new Headers( this.requestHeader ),\n\t\t\tcredentials: this.withCredentials ? 'include' : 'same-origin',\n\t\t\tsignal: ( typeof AbortSignal.any === 'function' ) ? AbortSignal.any( [ this._abortController.signal, this.manager.abortController.signal ] ) : this._abortController.signal\n\t\t} );\n\n\t\t// record states ( avoid data race )\n\t\tconst mimeType = this.mimeType;\n\t\tconst responseType = this.responseType;\n\n\t\t// start the fetch\n\t\tfetch( req )\n\t\t\t.then( response => {\n\n\t\t\t\tif ( response.status === 200 || response.status === 0 ) {\n\n\t\t\t\t\t// Some browsers return HTTP Status 0 when using non-http protocol\n\t\t\t\t\t// e.g. 'file://' or 'data://'. Handle as success.\n\n\t\t\t\t\tif ( response.status === 0 ) {\n\n\t\t\t\t\t\twarn( 'FileLoader: HTTP Status 0 received.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Workaround: Checking if response.body === undefined for Alipay browser #23548\n\n\t\t\t\t\tif ( typeof ReadableStream === 'undefined' || response.body === undefined || response.body.getReader === undefined ) {\n\n\t\t\t\t\t\treturn response;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst callbacks = loading[ url ];\n\t\t\t\t\tconst reader = response.body.getReader();\n\n\t\t\t\t\t// Nginx needs X-File-Size check\n\t\t\t\t\t// https://serverfault.com/questions/482875/why-does-nginx-remove-content-length-header-for-chunked-content\n\t\t\t\t\tconst contentLength = response.headers.get( 'X-File-Size' ) || response.headers.get( 'Content-Length' );\n\t\t\t\t\tconst total = contentLength ? parseInt( contentLength ) : 0;\n\t\t\t\t\tconst lengthComputable = total !== 0;\n\t\t\t\t\tlet loaded = 0;\n\n\t\t\t\t\t// periodically read data into the new stream tracking while download progress\n\t\t\t\t\tconst stream = new ReadableStream( {\n\t\t\t\t\t\tstart( controller ) {\n\n\t\t\t\t\t\t\treadData();\n\n\t\t\t\t\t\t\tfunction readData() {\n\n\t\t\t\t\t\t\t\treader.read().then( ( { done, value } ) => {\n\n\t\t\t\t\t\t\t\t\tif ( done ) {\n\n\t\t\t\t\t\t\t\t\t\tcontroller.close();\n\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\tloaded += value.byteLength;\n\n\t\t\t\t\t\t\t\t\t\tconst event = new ProgressEvent( 'progress', { lengthComputable, loaded, total } );\n\t\t\t\t\t\t\t\t\t\tfor ( let i = 0, il = callbacks.length; i < il; i ++ ) {\n\n\t\t\t\t\t\t\t\t\t\t\tconst callback = callbacks[ i ];\n\t\t\t\t\t\t\t\t\t\t\tif ( callback.onProgress ) callback.onProgress( event );\n\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tcontroller.enqueue( value );\n\t\t\t\t\t\t\t\t\t\treadData();\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t}, ( e ) => {\n\n\t\t\t\t\t\t\t\t\tcontroller.error( e );\n\n\t\t\t\t\t\t\t\t} );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} );\n\n\t\t\t\t\treturn new Response( stream );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new HttpError( `fetch for \"${response.url}\" responded with ${response.status}: ${response.statusText}`, response );\n\n\t\t\t\t}\n\n\t\t\t} )\n\t\t\t.then( response => {\n\n\t\t\t\tswitch ( responseType ) {\n\n\t\t\t\t\tcase 'arraybuffer':\n\n\t\t\t\t\t\treturn response.arrayBuffer();\n\n\t\t\t\t\tcase 'blob':\n\n\t\t\t\t\t\treturn response.blob();\n\n\t\t\t\t\tcase 'document':\n\n\t\t\t\t\t\treturn response.text()\n\t\t\t\t\t\t\t.then( text => {\n\n\t\t\t\t\t\t\t\tconst parser = new DOMParser();\n\t\t\t\t\t\t\t\treturn parser.parseFromString( text, mimeType );\n\n\t\t\t\t\t\t\t} );\n\n\t\t\t\t\tcase 'json':\n\n\t\t\t\t\t\treturn response.json();\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tif ( mimeType === '' ) {\n\n\t\t\t\t\t\t\treturn response.text();\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// sniff encoding\n\t\t\t\t\t\t\tconst re = /charset=\"?([^;\"\\s]*)\"?/i;\n\t\t\t\t\t\t\tconst exec = re.exec( mimeType );\n\t\t\t\t\t\t\tconst label = exec && exec[ 1 ] ? exec[ 1 ].toLowerCase() : undefined;\n\t\t\t\t\t\t\tconst decoder = new TextDecoder( label );\n\t\t\t\t\t\t\treturn response.arrayBuffer().then( ab => decoder.decode( ab ) );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} )\n\t\t\t.then( data => {\n\n\t\t\t\t// Add to cache only on HTTP success, so that we do not cache\n\t\t\t\t// error response bodies as proper responses to requests.\n\t\t\t\tCache.add( `file:${url}`, data );\n\n\t\t\t\tconst callbacks = loading[ url ];\n\t\t\t\tdelete loading[ url ];\n\n\t\t\t\tfor ( let i = 0, il = callbacks.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst callback = callbacks[ i ];\n\t\t\t\t\tif ( callback.onLoad ) callback.onLoad( data );\n\n\t\t\t\t}\n\n\t\t\t} )\n\t\t\t.catch( err => {\n\n\t\t\t\t// Abort errors and other errors are handled the same\n\n\t\t\t\tconst callbacks = loading[ url ];\n\n\t\t\t\tif ( callbacks === undefined ) {\n\n\t\t\t\t\t// When onLoad was called and url was deleted in `loading`\n\t\t\t\t\tthis.manager.itemError( url );\n\t\t\t\t\tthrow err;\n\n\t\t\t\t}\n\n\t\t\t\tdelete loading[ url ];\n\n\t\t\t\tfor ( let i = 0, il = callbacks.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst callback = callbacks[ i ];\n\t\t\t\t\tif ( callback.onError ) callback.onError( err );\n\n\t\t\t\t}\n\n\t\t\t\tthis.manager.itemError( url );\n\n\t\t\t} )\n\t\t\t.finally( () => {\n\n\t\t\t\tthis.manager.itemEnd( url );\n\n\t\t\t} );\n\n\t\tthis.manager.itemStart( url );\n\n\t}\n\n\t/**\n\t * Sets the expected response type.\n\t *\n\t * @param {('arraybuffer'|'blob'|'document'|'json'|'')} value - The response type.\n\t * @return {FileLoader} A reference to this file loader.\n\t */\n\tsetResponseType( value ) {\n\n\t\tthis.responseType = value;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the expected mime type of the loaded file.\n\t *\n\t * @param {string} value - The mime type.\n\t * @return {FileLoader} A reference to this file loader.\n\t */\n\tsetMimeType( value ) {\n\n\t\tthis.mimeType = value;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Aborts ongoing fetch requests.\n\t *\n\t * @return {FileLoader} A reference to this instance.\n\t */\n\tabort() {\n\n\t\tthis._abortController.abort();\n\t\tthis._abortController = new AbortController();\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * Class for loading animation clips in the JSON format. The files are internally\n * loaded via {@link FileLoader}.\n *\n * ```js\n * const loader = new THREE.AnimationLoader();\n * const animations = await loader.loadAsync( 'animations/animation.js' );\n * ```\n *\n * @augments Loader\n */\nclass AnimationLoader extends Loader {\n\n\t/**\n\t * Constructs a new animation loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and pass the loaded animations as an array\n\t * holding instances of {@link AnimationClip} to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(Array<AnimationClip>)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\terror( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\t/**\n\t * Parses the given JSON object and returns an array of animation clips.\n\t *\n\t * @param {Object} json - The serialized animation clips.\n\t * @return {Array<AnimationClip>} The parsed animation clips.\n\t */\n\tparse( json ) {\n\n\t\tconst animations = [];\n\n\t\tfor ( let i = 0; i < json.length; i ++ ) {\n\n\t\t\tconst clip = AnimationClip.parse( json[ i ] );\n\n\t\t\tanimations.push( clip );\n\n\t\t}\n\n\t\treturn animations;\n\n\t}\n\n}\n\n/**\n * Abstract base class for loading compressed texture formats S3TC, ASTC or ETC.\n * Textures are internally loaded via {@link FileLoader}.\n *\n * Derived classes have to implement the `parse()` method which holds the parsing\n * for the respective format.\n *\n * @abstract\n * @augments Loader\n */\nclass CompressedTextureLoader extends Loader {\n\n\t/**\n\t * Constructs a new compressed texture loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and passes the loaded compressed texture\n\t * to the `onLoad()` callback. The method also returns a new texture object which can\n\t * directly be used for material creation. If you do it this way, the texture\n\t * may pop up in your scene once the respective loading process is finished.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(CompressedTexture)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t * @return {CompressedTexture} The compressed texture.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst images = [];\n\n\t\tconst texture = new CompressedTexture();\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\n\t\tlet loaded = 0;\n\n\t\tfunction loadTexture( i ) {\n\n\t\t\tloader.load( url[ i ], function ( buffer ) {\n\n\t\t\t\tconst texDatas = scope.parse( buffer, true );\n\n\t\t\t\timages[ i ] = {\n\t\t\t\t\twidth: texDatas.width,\n\t\t\t\t\theight: texDatas.height,\n\t\t\t\t\tformat: texDatas.format,\n\t\t\t\t\tmipmaps: texDatas.mipmaps\n\t\t\t\t};\n\n\t\t\t\tloaded += 1;\n\n\t\t\t\tif ( loaded === 6 ) {\n\n\t\t\t\t\tif ( texDatas.mipmapCount === 1 ) texture.minFilter = LinearFilter;\n\n\t\t\t\t\ttexture.image = images;\n\t\t\t\t\ttexture.format = texDatas.format;\n\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t\t}\n\n\t\t\t}, onProgress, onError );\n\n\t\t}\n\n\t\tif ( Array.isArray( url ) ) {\n\n\t\t\tfor ( let i = 0, il = url.length; i < il; ++ i ) {\n\n\t\t\t\tloadTexture( i );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// compressed cubemap texture stored in a single DDS file\n\n\t\t\tloader.load( url, function ( buffer ) {\n\n\t\t\t\tconst texDatas = scope.parse( buffer, true );\n\n\t\t\t\tif ( texDatas.isCubemap ) {\n\n\t\t\t\t\tconst faces = texDatas.mipmaps.length / texDatas.mipmapCount;\n\n\t\t\t\t\tfor ( let f = 0; f < faces; f ++ ) {\n\n\t\t\t\t\t\timages[ f ] = { mipmaps: [] };\n\n\t\t\t\t\t\tfor ( let i = 0; i < texDatas.mipmapCount; i ++ ) {\n\n\t\t\t\t\t\t\timages[ f ].mipmaps.push( texDatas.mipmaps[ f * texDatas.mipmapCount + i ] );\n\t\t\t\t\t\t\timages[ f ].format = texDatas.format;\n\t\t\t\t\t\t\timages[ f ].width = texDatas.width;\n\t\t\t\t\t\t\timages[ f ].height = texDatas.height;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.image = images;\n\n\t\t\t\t} else {\n\n\t\t\t\t\ttexture.image.width = texDatas.width;\n\t\t\t\t\ttexture.image.height = texDatas.height;\n\t\t\t\t\ttexture.mipmaps = texDatas.mipmaps;\n\n\t\t\t\t}\n\n\t\t\t\tif ( texDatas.mipmapCount === 1 ) {\n\n\t\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t\t}\n\n\t\t\t\ttexture.format = texDatas.format;\n\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t}, onProgress, onError );\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n}\n\nconst _loading = new WeakMap();\n\n/**\n * A loader for loading images. The class loads images with the HTML `Image` API.\n *\n * ```js\n * const loader = new THREE.ImageLoader();\n * const image = await loader.loadAsync( 'image.png' );\n * ```\n * Please note that `ImageLoader` has dropped support for progress\n * events in `r84`. For an `ImageLoader` that supports progress events, see\n * [this thread](https://github.com/mrdoob/three.js/issues/10439#issuecomment-275785639).\n *\n * @augments Loader\n */\nclass ImageLoader extends Loader {\n\n\t/**\n\t * Constructs a new image loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and passes the loaded image\n\t * to the `onLoad()` callback. The method also returns a new `Image` object which can\n\t * directly be used for texture creation. If you do it this way, the texture\n\t * may pop up in your scene once the respective loading process is finished.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(Image)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Unsupported in this loader.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t * @return {Image} The image.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tif ( this.path !== undefined ) url = this.path + url;\n\n\t\turl = this.manager.resolveURL( url );\n\n\t\tconst scope = this;\n\n\t\tconst cached = Cache.get( `image:${url}` );\n\n\t\tif ( cached !== undefined ) {\n\n\t\t\tif ( cached.complete === true ) {\n\n\t\t\t\tscope.manager.itemStart( url );\n\n\t\t\t\tsetTimeout( function () {\n\n\t\t\t\t\tif ( onLoad ) onLoad( cached );\n\n\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t}, 0 );\n\n\t\t\t} else {\n\n\t\t\t\tlet arr = _loading.get( cached );\n\n\t\t\t\tif ( arr === undefined ) {\n\n\t\t\t\t\tarr = [];\n\t\t\t\t\t_loading.set( cached, arr );\n\n\t\t\t\t}\n\n\t\t\t\tarr.push( { onLoad, onError } );\n\n\t\t\t}\n\n\t\t\treturn cached;\n\n\t\t}\n\n\t\tconst image = createElementNS( 'img' );\n\n\t\tfunction onImageLoad() {\n\n\t\t\tremoveEventListeners();\n\n\t\t\tif ( onLoad ) onLoad( this );\n\n\t\t\t//\n\n\t\t\tconst callbacks = _loading.get( this ) || [];\n\n\t\t\tfor ( let i = 0; i < callbacks.length; i ++ ) {\n\n\t\t\t\tconst callback = callbacks[ i ];\n\t\t\t\tif ( callback.onLoad ) callback.onLoad( this );\n\n\t\t\t}\n\n\t\t\t_loading.delete( this );\n\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t}\n\n\t\tfunction onImageError( event ) {\n\n\t\t\tremoveEventListeners();\n\n\t\t\tif ( onError ) onError( event );\n\n\t\t\tCache.remove( `image:${url}` );\n\n\t\t\t//\n\n\t\t\tconst callbacks = _loading.get( this ) || [];\n\n\t\t\tfor ( let i = 0; i < callbacks.length; i ++ ) {\n\n\t\t\t\tconst callback = callbacks[ i ];\n\t\t\t\tif ( callback.onError ) callback.onError( event );\n\n\t\t\t}\n\n\t\t\t_loading.delete( this );\n\n\n\t\t\tscope.manager.itemError( url );\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t}\n\n\t\tfunction removeEventListeners() {\n\n\t\t\timage.removeEventListener( 'load', onImageLoad, false );\n\t\t\timage.removeEventListener( 'error', onImageError, false );\n\n\t\t}\n\n\t\timage.addEventListener( 'load', onImageLoad, false );\n\t\timage.addEventListener( 'error', onImageError, false );\n\n\t\tif ( url.slice( 0, 5 ) !== 'data:' ) {\n\n\t\t\tif ( this.crossOrigin !== undefined ) image.crossOrigin = this.crossOrigin;\n\n\t\t}\n\n\t\tCache.add( `image:${url}`, image );\n\t\tscope.manager.itemStart( url );\n\n\t\timage.src = url;\n\n\t\treturn image;\n\n\t}\n\n}\n\n/**\n * Class for loading cube textures. Images are internally loaded via {@link ImageLoader}.\n *\n * The loader returns an instance of {@link CubeTexture} and expects the cube map to\n * be defined as six separate images representing the sides of a cube. Other cube map definitions\n * like vertical and horizontal cross, column and row layouts are not supported.\n *\n * Note that, by convention, cube maps are specified in a coordinate system\n * in which positive-x is to the right when looking up the positive-z axis --\n * in other words, using a left-handed coordinate system. Since three.js uses\n * a right-handed coordinate system, environment maps used in three.js will\n * have pos-x and neg-x swapped.\n *\n * The loaded cube texture is in sRGB color space. Meaning {@link Texture#colorSpace}\n * is set to `SRGBColorSpace` by default.\n *\n * ```js\n * const loader = new THREE.CubeTextureLoader().setPath( 'textures/cubeMaps/' );\n * const cubeTexture = await loader.loadAsync( [\n * \t'px.png', 'nx.png', 'py.png', 'ny.png', 'pz.png', 'nz.png'\n * ] );\n * scene.background = cubeTexture;\n * ```\n *\n * @augments Loader\n */\nclass CubeTextureLoader extends Loader {\n\n\t/**\n\t * Constructs a new cube texture loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and pass the fully loaded cube texture\n\t * to the `onLoad()` callback. The method also returns a new cube texture object which can\n\t * directly be used for material creation. If you do it this way, the cube texture\n\t * may pop up in your scene once the respective loading process is finished.\n\t *\n\t * @param {Array<string>} urls - Array of 6 URLs to images, one for each side of the\n\t * cube texture. The urls should be specified in the following order: pos-x,\n\t * neg-x, pos-y, neg-y, pos-z, neg-z. An array of data URIs are allowed as well.\n\t * @param {function(CubeTexture)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Unsupported in this loader.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t * @return {CubeTexture} The cube texture.\n\t */\n\tload( urls, onLoad, onProgress, onError ) {\n\n\t\tconst texture = new CubeTexture();\n\t\ttexture.colorSpace = SRGBColorSpace;\n\n\t\tconst loader = new ImageLoader( this.manager );\n\t\tloader.setCrossOrigin( this.crossOrigin );\n\t\tloader.setPath( this.path );\n\n\t\tlet loaded = 0;\n\n\t\tfunction loadTexture( i ) {\n\n\t\t\tloader.load( urls[ i ], function ( image ) {\n\n\t\t\t\ttexture.images[ i ] = image;\n\n\t\t\t\tloaded ++;\n\n\t\t\t\tif ( loaded === 6 ) {\n\n\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t\t}\n\n\t\t\t}, undefined, onError );\n\n\t\t}\n\n\t\tfor ( let i = 0; i < urls.length; ++ i ) {\n\n\t\t\tloadTexture( i );\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n}\n\n/**\n * Abstract base class for loading binary texture formats RGBE, EXR or TGA.\n * Textures are internally loaded via {@link FileLoader}.\n *\n * Derived classes have to implement the `parse()` method which holds the parsing\n * for the respective format.\n *\n * @abstract\n * @augments Loader\n */\nclass DataTextureLoader extends Loader {\n\n\t/**\n\t * Constructs a new data texture loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and passes the loaded data texture\n\t * to the `onLoad()` callback. The method also returns a new texture object which can\n\t * directly be used for material creation. If you do it this way, the texture\n\t * may pop up in your scene once the respective loading process is finished.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(DataTexture)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t * @return {DataTexture} The data texture.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst texture = new DataTexture();\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setPath( this.path );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\t\tloader.load( url, function ( buffer ) {\n\n\t\t\tlet texData;\n\n\t\t\ttry {\n\n\t\t\t\ttexData = scope.parse( buffer );\n\n\t\t\t} catch ( error ) {\n\n\t\t\t\tif ( onError !== undefined ) {\n\n\t\t\t\t\tonError( error );\n\n\t\t\t\t} else {\n\n\t\t\t\t\terror( error );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( texData.image !== undefined ) {\n\n\t\t\t\ttexture.image = texData.image;\n\n\t\t\t} else if ( texData.data !== undefined ) {\n\n\t\t\t\ttexture.image.width = texData.width;\n\t\t\t\ttexture.image.height = texData.height;\n\t\t\t\ttexture.image.data = texData.data;\n\n\t\t\t}\n\n\t\t\ttexture.wrapS = texData.wrapS !== undefined ? texData.wrapS : ClampToEdgeWrapping;\n\t\t\ttexture.wrapT = texData.wrapT !== undefined ? texData.wrapT : ClampToEdgeWrapping;\n\n\t\t\ttexture.magFilter = texData.magFilter !== undefined ? texData.magFilter : LinearFilter;\n\t\t\ttexture.minFilter = texData.minFilter !== undefined ? texData.minFilter : LinearFilter;\n\n\t\t\ttexture.anisotropy = texData.anisotropy !== undefined ? texData.anisotropy : 1;\n\n\t\t\tif ( texData.colorSpace !== undefined ) {\n\n\t\t\t\ttexture.colorSpace = texData.colorSpace;\n\n\t\t\t}\n\n\t\t\tif ( texData.flipY !== undefined ) {\n\n\t\t\t\ttexture.flipY = texData.flipY;\n\n\t\t\t}\n\n\t\t\tif ( texData.format !== undefined ) {\n\n\t\t\t\ttexture.format = texData.format;\n\n\t\t\t}\n\n\t\t\tif ( texData.type !== undefined ) {\n\n\t\t\t\ttexture.type = texData.type;\n\n\t\t\t}\n\n\t\t\tif ( texData.mipmaps !== undefined ) {\n\n\t\t\t\ttexture.mipmaps = texData.mipmaps;\n\t\t\t\ttexture.minFilter = LinearMipmapLinearFilter; // presumably...\n\n\t\t\t}\n\n\t\t\tif ( texData.mipmapCount === 1 ) {\n\n\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t}\n\n\t\t\tif ( texData.generateMipmaps !== undefined ) {\n\n\t\t\t\ttexture.generateMipmaps = texData.generateMipmaps;\n\n\t\t\t}\n\n\t\t\ttexture.needsUpdate = true;\n\n\t\t\tif ( onLoad ) onLoad( texture, texData );\n\n\t\t}, onProgress, onError );\n\n\n\t\treturn texture;\n\n\t}\n\n}\n\n/**\n * Class for loading textures. Images are internally\n * loaded via {@link ImageLoader}.\n *\n * ```js\n * const loader = new THREE.TextureLoader();\n * const texture = await loader.loadAsync( 'textures/land_ocean_ice_cloud_2048.jpg' );\n *\n * const material = new THREE.MeshBasicMaterial( { map:texture } );\n * ```\n * Please note that `TextureLoader` has dropped support for progress\n * events in `r84`. For a `TextureLoader` that supports progress events, see\n * [this thread](https://github.com/mrdoob/three.js/issues/10439#issuecomment-293260145).\n *\n * @augments Loader\n */\nclass TextureLoader extends Loader {\n\n\t/**\n\t * Constructs a new texture loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and pass the fully loaded texture\n\t * to the `onLoad()` callback. The method also returns a new texture object which can\n\t * directly be used for material creation. If you do it this way, the texture\n\t * may pop up in your scene once the respective loading process is finished.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(Texture)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Unsupported in this loader.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t * @return {Texture} The texture.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst texture = new Texture();\n\n\t\tconst loader = new ImageLoader( this.manager );\n\t\tloader.setCrossOrigin( this.crossOrigin );\n\t\tloader.setPath( this.path );\n\n\t\tloader.load( url, function ( image ) {\n\n\t\t\ttexture.image = image;\n\t\t\ttexture.needsUpdate = true;\n\n\t\t\tif ( onLoad !== undefined ) {\n\n\t\t\t\tonLoad( texture );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t\treturn texture;\n\n\t}\n\n}\n\n/**\n * Abstract base class for lights - all other light types inherit the\n * properties and methods described here.\n *\n * @abstract\n * @augments Object3D\n */\nclass Light extends Object3D {\n\n\t/**\n\t * Constructs a new light.\n\t *\n\t * @param {(number|Color|string)} [color=0xffffff] - The light's color.\n\t * @param {number} [intensity=1] - The light's strength/intensity.\n\t */\n\tconstructor( color, intensity = 1 ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLight = true;\n\n\t\tthis.type = 'Light';\n\n\t\t/**\n\t\t * The light's color.\n\t\t *\n\t\t * @type {Color}\n\t\t */\n\t\tthis.color = new Color( color );\n\n\t\t/**\n\t\t * The light's intensity.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.intensity = intensity;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\t// Empty here in base class; some subclasses override.\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.color.copy( source.color );\n\t\tthis.intensity = source.intensity;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.color = this.color.getHex();\n\t\tdata.object.intensity = this.intensity;\n\n\t\tif ( this.groundColor !== undefined ) data.object.groundColor = this.groundColor.getHex();\n\n\t\tif ( this.distance !== undefined ) data.object.distance = this.distance;\n\t\tif ( this.angle !== undefined ) data.object.angle = this.angle;\n\t\tif ( this.decay !== undefined ) data.object.decay = this.decay;\n\t\tif ( this.penumbra !== undefined ) data.object.penumbra = this.penumbra;\n\n\t\tif ( this.shadow !== undefined ) data.object.shadow = this.shadow.toJSON();\n\t\tif ( this.target !== undefined ) data.object.target = this.target.uuid;\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * A light source positioned directly above the scene, with color fading from\n * the sky color to the ground color.\n *\n * This light cannot be used to cast shadows.\n *\n * ```js\n * const light = new THREE.HemisphereLight( 0xffffbb, 0x080820, 1 );\n * scene.add( light );\n * ```\n *\n * @augments Light\n */\nclass HemisphereLight extends Light {\n\n\t/**\n\t * Constructs a new hemisphere light.\n\t *\n\t * @param {(number|Color|string)} [skyColor=0xffffff] - The light's sky color.\n\t * @param {(number|Color|string)} [groundColor=0xffffff] - The light's ground color.\n\t * @param {number} [intensity=1] - The light's strength/intensity.\n\t */\n\tconstructor( skyColor, groundColor, intensity ) {\n\n\t\tsuper( skyColor, intensity );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isHemisphereLight = true;\n\n\t\tthis.type = 'HemisphereLight';\n\n\t\tthis.position.copy( Object3D.DEFAULT_UP );\n\t\tthis.updateMatrix();\n\n\t\t/**\n\t\t * The light's ground color.\n\t\t *\n\t\t * @type {Color}\n\t\t */\n\t\tthis.groundColor = new Color( groundColor );\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.groundColor.copy( source.groundColor );\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _projScreenMatrix$1 = /*@__PURE__*/ new Matrix4();\nconst _lightPositionWorld$1 = /*@__PURE__*/ new Vector3();\nconst _lookTarget$1 = /*@__PURE__*/ new Vector3();\n\n/**\n * Abstract base class for light shadow classes. These classes\n * represent the shadow configuration for different light types.\n *\n * @abstract\n */\nclass LightShadow {\n\n\t/**\n\t * Constructs a new light shadow.\n\t *\n\t * @param {Camera} camera - The light's view of the world.\n\t */\n\tconstructor( camera ) {\n\n\t\t/**\n\t\t * The light's view of the world.\n\t\t *\n\t\t * @type {Camera}\n\t\t */\n\t\tthis.camera = camera;\n\n\t\t/**\n\t\t * The intensity of the shadow. The default is `1`.\n\t\t * Valid values are in the range `[0, 1]`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.intensity = 1;\n\n\t\t/**\n\t\t * Shadow map bias, how much to add or subtract from the normalized depth\n\t\t * when deciding whether a surface is in shadow.\n\t\t *\n\t\t * The default is `0`. Very tiny adjustments here (in the order of `0.0001`)\n\t\t * may help reduce artifacts in shadows.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.bias = 0;\n\n\t\t/**\n\t\t * Defines how much the position used to query the shadow map is offset along\n\t\t * the object normal. The default is `0`. Increasing this value can be used to\n\t\t * reduce shadow acne especially in large scenes where light shines onto\n\t\t * geometry at a shallow angle. The cost is that shadows may appear distorted.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.normalBias = 0;\n\n\t\t/**\n\t\t * Setting this to values greater than 1 will blur the edges of the shadow.\n\t\t * High values will cause unwanted banding effects in the shadows - a greater\n\t\t * map size will allow for a higher value to be used here before these effects\n\t\t * become visible.\n\t\t *\n\t\t * The property has no effect when the shadow map type is `PCFSoftShadowMap` and\n\t\t * and it is recommended to increase softness by decreasing the shadow map size instead.\n\t\t *\n\t\t * The property has no effect when the shadow map type is `BasicShadowMap`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.radius = 1;\n\n\t\t/**\n\t\t * The amount of samples to use when blurring a VSM shadow map.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 8\n\t\t */\n\t\tthis.blurSamples = 8;\n\n\t\t/**\n\t\t * Defines the width and height of the shadow map. Higher values give better quality\n\t\t * shadows at the cost of computation time. Values must be powers of two.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (512,512)\n\t\t */\n\t\tthis.mapSize = new Vector2( 512, 512 );\n\n\t\t/**\n\t\t * The type of shadow texture. The default is `UnsignedByteType`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default UnsignedByteType\n\t\t */\n\t\tthis.mapType = UnsignedByteType;\n\n\t\t/**\n\t\t * The depth map generated using the internal camera; a location beyond a\n\t\t * pixel's depth is in shadow. Computed internally during rendering.\n\t\t *\n\t\t * @type {?RenderTarget}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * The distribution map generated using the internal camera; an occlusion is\n\t\t * calculated based on the distribution of depths. Computed internally during\n\t\t * rendering.\n\t\t *\n\t\t * @type {?RenderTarget}\n\t\t * @default null\n\t\t */\n\t\tthis.mapPass = null;\n\n\t\t/**\n\t\t * Model to shadow camera space, to compute location and depth in shadow map.\n\t\t * This is computed internally during rendering.\n\t\t *\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.matrix = new Matrix4();\n\n\t\t/**\n\t\t * Enables automatic updates of the light's shadow. If you do not require dynamic\n\t\t * lighting / shadows, you may set this to `false`.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.autoUpdate = true;\n\n\t\t/**\n\t\t * When set to `true`, shadow maps will be updated in the next `render` call.\n\t\t * If you have set {@link LightShadow#autoUpdate} to `false`, you will need to\n\t\t * set this property to `true` and then make a render call to update the light's shadow.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.needsUpdate = false;\n\n\t\tthis._frustum = new Frustum();\n\t\tthis._frameExtents = new Vector2( 1, 1 );\n\n\t\tthis._viewportCount = 1;\n\n\t\tthis._viewports = [\n\n\t\t\tnew Vector4( 0, 0, 1, 1 )\n\n\t\t];\n\n\t}\n\n\t/**\n\t * Used internally by the renderer to get the number of viewports that need\n\t * to be rendered for this shadow.\n\t *\n\t * @return {number} The viewport count.\n\t */\n\tgetViewportCount() {\n\n\t\treturn this._viewportCount;\n\n\t}\n\n\t/**\n\t * Gets the shadow cameras frustum. Used internally by the renderer to cull objects.\n\t *\n\t * @return {Frustum} The shadow camera frustum.\n\t */\n\tgetFrustum() {\n\n\t\treturn this._frustum;\n\n\t}\n\n\t/**\n\t * Update the matrices for the camera and shadow, used internally by the renderer.\n\t *\n\t * @param {Light} light - The light for which the shadow is being rendered.\n\t */\n\tupdateMatrices( light ) {\n\n\t\tconst shadowCamera = this.camera;\n\t\tconst shadowMatrix = this.matrix;\n\n\t\t_lightPositionWorld$1.setFromMatrixPosition( light.matrixWorld );\n\t\tshadowCamera.position.copy( _lightPositionWorld$1 );\n\n\t\t_lookTarget$1.setFromMatrixPosition( light.target.matrixWorld );\n\t\tshadowCamera.lookAt( _lookTarget$1 );\n\t\tshadowCamera.updateMatrixWorld();\n\n\t\t_projScreenMatrix$1.multiplyMatrices( shadowCamera.projectionMatrix, shadowCamera.matrixWorldInverse );\n\t\tthis._frustum.setFromProjectionMatrix( _projScreenMatrix$1, shadowCamera.coordinateSystem, shadowCamera.reversedDepth );\n\n\t\tif ( shadowCamera.reversedDepth ) {\n\n\t\t\tshadowMatrix.set(\n\t\t\t\t0.5, 0.0, 0.0, 0.5,\n\t\t\t\t0.0, 0.5, 0.0, 0.5,\n\t\t\t\t0.0, 0.0, 1.0, 0.0,\n\t\t\t\t0.0, 0.0, 0.0, 1.0\n\t\t\t);\n\n\t\t} else {\n\n\t\t\tshadowMatrix.set(\n\t\t\t\t0.5, 0.0, 0.0, 0.5,\n\t\t\t\t0.0, 0.5, 0.0, 0.5,\n\t\t\t\t0.0, 0.0, 0.5, 0.5,\n\t\t\t\t0.0, 0.0, 0.0, 1.0\n\t\t\t);\n\n\t\t}\n\n\t\tshadowMatrix.multiply( _projScreenMatrix$1 );\n\n\t}\n\n\t/**\n\t * Returns a viewport definition for the given viewport index.\n\t *\n\t * @param {number} viewportIndex - The viewport index.\n\t * @return {Vector4} The viewport.\n\t */\n\tgetViewport( viewportIndex ) {\n\n\t\treturn this._viewports[ viewportIndex ];\n\n\t}\n\n\t/**\n\t * Returns the frame extends.\n\t *\n\t * @return {Vector2} The frame extends.\n\t */\n\tgetFrameExtents() {\n\n\t\treturn this._frameExtents;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tif ( this.map ) {\n\n\t\t\tthis.map.dispose();\n\n\t\t}\n\n\t\tif ( this.mapPass ) {\n\n\t\t\tthis.mapPass.dispose();\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Copies the values of the given light shadow instance to this instance.\n\t *\n\t * @param {LightShadow} source - The light shadow to copy.\n\t * @return {LightShadow} A reference to this light shadow instance.\n\t */\n\tcopy( source ) {\n\n\t\tthis.camera = source.camera.clone();\n\n\t\tthis.intensity = source.intensity;\n\n\t\tthis.bias = source.bias;\n\t\tthis.radius = source.radius;\n\n\t\tthis.autoUpdate = source.autoUpdate;\n\t\tthis.needsUpdate = source.needsUpdate;\n\t\tthis.normalBias = source.normalBias;\n\t\tthis.blurSamples = source.blurSamples;\n\n\t\tthis.mapSize.copy( source.mapSize );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new light shadow instance with copied values from this instance.\n\t *\n\t * @return {LightShadow} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Serializes the light shadow into JSON.\n\t *\n\t * @return {Object} A JSON object representing the serialized light shadow.\n\t * @see {@link ObjectLoader#parse}\n\t */\n\ttoJSON() {\n\n\t\tconst object = {};\n\n\t\tif ( this.intensity !== 1 ) object.intensity = this.intensity;\n\t\tif ( this.bias !== 0 ) object.bias = this.bias;\n\t\tif ( this.normalBias !== 0 ) object.normalBias = this.normalBias;\n\t\tif ( this.radius !== 1 ) object.radius = this.radius;\n\t\tif ( this.mapSize.x !== 512 || this.mapSize.y !== 512 ) object.mapSize = this.mapSize.toArray();\n\n\t\tobject.camera = this.camera.toJSON( false ).object;\n\t\tdelete object.camera.matrix;\n\n\t\treturn object;\n\n\t}\n\n}\n\n/**\n * Represents the shadow configuration of directional lights.\n *\n * @augments LightShadow\n */\nclass SpotLightShadow extends LightShadow {\n\n\t/**\n\t * Constructs a new spot light shadow.\n\t */\n\tconstructor() {\n\n\t\tsuper( new PerspectiveCamera( 50, 1, 0.5, 500 ) );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSpotLightShadow = true;\n\n\t\t/**\n\t\t * Used to focus the shadow camera. The camera's field of view is set as a\n\t\t * percentage of the spotlight's field-of-view. Range is `[0, 1]`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.focus = 1;\n\n\t\t/**\n\t\t * Texture aspect ratio.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.aspect = 1;\n\n\t}\n\n\tupdateMatrices( light ) {\n\n\t\tconst camera = this.camera;\n\n\t\tconst fov = RAD2DEG * 2 * light.angle * this.focus;\n\t\tconst aspect = ( this.mapSize.width / this.mapSize.height ) * this.aspect;\n\t\tconst far = light.distance || camera.far;\n\n\t\tif ( fov !== camera.fov || aspect !== camera.aspect || far !== camera.far ) {\n\n\t\t\tcamera.fov = fov;\n\t\t\tcamera.aspect = aspect;\n\t\t\tcamera.far = far;\n\t\t\tcamera.updateProjectionMatrix();\n\n\t\t}\n\n\t\tsuper.updateMatrices( light );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.focus = source.focus;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * This light gets emitted from a single point in one direction, along a cone\n * that increases in size the further from the light it gets.\n *\n * This light can cast shadows - see the {@link SpotLightShadow} for details.\n *\n * ```js\n * // white spotlight shining from the side, modulated by a texture\n * const spotLight = new THREE.SpotLight( 0xffffff );\n * spotLight.position.set( 100, 1000, 100 );\n * spotLight.map = new THREE.TextureLoader().load( url );\n *\n * spotLight.castShadow = true;\n * spotLight.shadow.mapSize.width = 1024;\n * spotLight.shadow.mapSize.height = 1024;\n * spotLight.shadow.camera.near = 500;\n * spotLight.shadow.camera.far = 4000;\n * spotLight.shadow.camera.fov = 30;s\n * ```\n *\n * @augments Light\n */\nclass SpotLight extends Light {\n\n\t/**\n\t * Constructs a new spot light.\n\t *\n\t * @param {(number|Color|string)} [color=0xffffff] - The light's color.\n\t * @param {number} [intensity=1] - The light's strength/intensity measured in candela (cd).\n\t * @param {number} [distance=0] - Maximum range of the light. `0` means no limit.\n\t * @param {number} [angle=Math.PI/3] - Maximum angle of light dispersion from its direction whose upper bound is `Math.PI/2`.\n\t * @param {number} [penumbra=0] - Percent of the spotlight cone that is attenuated due to penumbra. Value range is `[0,1]`.\n\t * @param {number} [decay=2] - The amount the light dims along the distance of the light.\n\t */\n\tconstructor( color, intensity, distance = 0, angle = Math.PI / 3, penumbra = 0, decay = 2 ) {\n\n\t\tsuper( color, intensity );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSpotLight = true;\n\n\t\tthis.type = 'SpotLight';\n\n\t\tthis.position.copy( Object3D.DEFAULT_UP );\n\t\tthis.updateMatrix();\n\n\t\t/**\n\t\t * The spot light points from its position to the\n\t\t * target's position.\n\t\t *\n\t\t * For the target's position to be changed to anything other\n\t\t * than the default, it must be added to the scene.\n\t\t *\n\t\t * It is also possible to set the target to be another 3D object\n\t\t * in the scene. The light will now track the target object.\n\t\t *\n\t\t * @type {Object3D}\n\t\t */\n\t\tthis.target = new Object3D();\n\n\t\t/**\n\t\t * Maximum range of the light. `0` means no limit.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.distance = distance;\n\n\t\t/**\n\t\t * Maximum angle of light dispersion from its direction whose upper bound is `Math.PI/2`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default Math.PI/3\n\t\t */\n\t\tthis.angle = angle;\n\n\t\t/**\n\t\t * Percent of the spotlight cone that is attenuated due to penumbra.\n\t\t * Value range is `[0,1]`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.penumbra = penumbra;\n\n\t\t/**\n\t\t * The amount the light dims along the distance of the light. In context of\n\t\t * physically-correct rendering the default value should not be changed.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 2\n\t\t */\n\t\tthis.decay = decay;\n\n\t\t/**\n\t\t * A texture used to modulate the color of the light. The spot light\n\t\t * color is mixed with the RGB value of this texture, with a ratio\n\t\t * corresponding to its alpha value. The cookie-like masking effect is\n\t\t * reproduced using pixel values (0, 0, 0, 1-cookie_value).\n\t\t *\n\t\t * *Warning*: This property is disabled if {@link Object3D#castShadow} is set to `false`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * This property holds the light's shadow configuration.\n\t\t *\n\t\t * @type {SpotLightShadow}\n\t\t */\n\t\tthis.shadow = new SpotLightShadow();\n\n\t}\n\n\t/**\n\t * The light's power. Power is the luminous power of the light measured in lumens (lm).\n\t *  Changing the power will also change the light's intensity.\n\t *\n\t * @type {number}\n\t */\n\tget power() {\n\n\t\t// compute the light's luminous power (in lumens) from its intensity (in candela)\n\t\t// by convention for a spotlight, luminous power (lm) = π * luminous intensity (cd)\n\t\treturn this.intensity * Math.PI;\n\n\t}\n\n\tset power( power ) {\n\n\t\t// set the light's intensity (in candela) from the desired luminous power (in lumens)\n\t\tthis.intensity = power / Math.PI;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.shadow.dispose();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.distance = source.distance;\n\t\tthis.angle = source.angle;\n\t\tthis.penumbra = source.penumbra;\n\t\tthis.decay = source.decay;\n\n\t\tthis.target = source.target.clone();\n\n\t\tthis.shadow = source.shadow.clone();\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _projScreenMatrix = /*@__PURE__*/ new Matrix4();\nconst _lightPositionWorld = /*@__PURE__*/ new Vector3();\nconst _lookTarget = /*@__PURE__*/ new Vector3();\n\n/**\n * Represents the shadow configuration of point lights.\n *\n * @augments LightShadow\n */\nclass PointLightShadow extends LightShadow {\n\n\t/**\n\t * Constructs a new point light shadow.\n\t */\n\tconstructor() {\n\n\t\tsuper( new PerspectiveCamera( 90, 1, 0.5, 500 ) );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isPointLightShadow = true;\n\n\t\tthis._frameExtents = new Vector2( 4, 2 );\n\n\t\tthis._viewportCount = 6;\n\n\t\tthis._viewports = [\n\t\t\t// These viewports map a cube-map onto a 2D texture with the\n\t\t\t// following orientation:\n\t\t\t//\n\t\t\t//  xzXZ\n\t\t\t//   y Y\n\t\t\t//\n\t\t\t// X - Positive x direction\n\t\t\t// x - Negative x direction\n\t\t\t// Y - Positive y direction\n\t\t\t// y - Negative y direction\n\t\t\t// Z - Positive z direction\n\t\t\t// z - Negative z direction\n\n\t\t\t// positive X\n\t\t\tnew Vector4( 2, 1, 1, 1 ),\n\t\t\t// negative X\n\t\t\tnew Vector4( 0, 1, 1, 1 ),\n\t\t\t// positive Z\n\t\t\tnew Vector4( 3, 1, 1, 1 ),\n\t\t\t// negative Z\n\t\t\tnew Vector4( 1, 1, 1, 1 ),\n\t\t\t// positive Y\n\t\t\tnew Vector4( 3, 0, 1, 1 ),\n\t\t\t// negative Y\n\t\t\tnew Vector4( 1, 0, 1, 1 )\n\t\t];\n\n\t\tthis._cubeDirections = [\n\t\t\tnew Vector3( 1, 0, 0 ), new Vector3( -1, 0, 0 ), new Vector3( 0, 0, 1 ),\n\t\t\tnew Vector3( 0, 0, -1 ), new Vector3( 0, 1, 0 ), new Vector3( 0, -1, 0 )\n\t\t];\n\n\t\tthis._cubeUps = [\n\t\t\tnew Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ),\n\t\t\tnew Vector3( 0, 1, 0 ), new Vector3( 0, 0, 1 ),\tnew Vector3( 0, 0, -1 )\n\t\t];\n\n\t}\n\n\t/**\n\t * Update the matrices for the camera and shadow, used internally by the renderer.\n\t *\n\t * @param {Light} light - The light for which the shadow is being rendered.\n\t * @param {number} [viewportIndex=0] - The viewport index.\n\t */\n\tupdateMatrices( light, viewportIndex = 0 ) {\n\n\t\tconst camera = this.camera;\n\t\tconst shadowMatrix = this.matrix;\n\n\t\tconst far = light.distance || camera.far;\n\n\t\tif ( far !== camera.far ) {\n\n\t\t\tcamera.far = far;\n\t\t\tcamera.updateProjectionMatrix();\n\n\t\t}\n\n\t\t_lightPositionWorld.setFromMatrixPosition( light.matrixWorld );\n\t\tcamera.position.copy( _lightPositionWorld );\n\n\t\t_lookTarget.copy( camera.position );\n\t\t_lookTarget.add( this._cubeDirections[ viewportIndex ] );\n\t\tcamera.up.copy( this._cubeUps[ viewportIndex ] );\n\t\tcamera.lookAt( _lookTarget );\n\t\tcamera.updateMatrixWorld();\n\n\t\tshadowMatrix.makeTranslation( - _lightPositionWorld.x, - _lightPositionWorld.y, - _lightPositionWorld.z );\n\n\t\t_projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );\n\t\tthis._frustum.setFromProjectionMatrix( _projScreenMatrix, camera.coordinateSystem, camera.reversedDepth );\n\n\t}\n\n}\n\n/**\n * A light that gets emitted from a single point in all directions. A common\n * use case for this is to replicate the light emitted from a bare\n * lightbulb.\n *\n * This light can cast shadows - see the {@link PointLightShadow} for details.\n *\n * ```js\n * const light = new THREE.PointLight( 0xff0000, 1, 100 );\n * light.position.set( 50, 50, 50 );\n * scene.add( light );\n * ```\n *\n * @augments Light\n */\nclass PointLight extends Light {\n\n\t/**\n\t * Constructs a new point light.\n\t *\n\t * @param {(number|Color|string)} [color=0xffffff] - The light's color.\n\t * @param {number} [intensity=1] - The light's strength/intensity measured in candela (cd).\n\t * @param {number} [distance=0] - Maximum range of the light. `0` means no limit.\n\t * @param {number} [decay=2] - The amount the light dims along the distance of the light.\n\t */\n\tconstructor( color, intensity, distance = 0, decay = 2 ) {\n\n\t\tsuper( color, intensity );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isPointLight = true;\n\n\t\tthis.type = 'PointLight';\n\n\t\t/**\n\t\t * When distance is zero, light will attenuate according to inverse-square\n\t\t * law to infinite distance. When distance is non-zero, light will attenuate\n\t\t * according to inverse-square law until near the distance cutoff, where it\n\t\t * will then attenuate quickly and smoothly to 0. Inherently, cutoffs are not\n\t\t * physically correct.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.distance = distance;\n\n\t\t/**\n\t\t * The amount the light dims along the distance of the light. In context of\n\t\t * physically-correct rendering the default value should not be changed.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 2\n\t\t */\n\t\tthis.decay = decay;\n\n\t\t/**\n\t\t * This property holds the light's shadow configuration.\n\t\t *\n\t\t * @type {PointLightShadow}\n\t\t */\n\t\tthis.shadow = new PointLightShadow();\n\n\t}\n\n\t/**\n\t * The light's power. Power is the luminous power of the light measured in lumens (lm).\n\t * Changing the power will also change the light's intensity.\n\t *\n\t * @type {number}\n\t */\n\tget power() {\n\n\t\t// compute the light's luminous power (in lumens) from its intensity (in candela)\n\t\t// for an isotropic light source, luminous power (lm) = 4 π luminous intensity (cd)\n\t\treturn this.intensity * 4 * Math.PI;\n\n\t}\n\n\tset power( power ) {\n\n\t\t// set the light's intensity (in candela) from the desired luminous power (in lumens)\n\t\tthis.intensity = power / ( 4 * Math.PI );\n\n\t}\n\n\tdispose() {\n\n\t\tthis.shadow.dispose();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.distance = source.distance;\n\t\tthis.decay = source.decay;\n\n\t\tthis.shadow = source.shadow.clone();\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * Camera that uses [orthographic projection](https://en.wikipedia.org/wiki/Orthographic_projection).\n *\n * In this projection mode, an object's size in the rendered image stays\n * constant regardless of its distance from the camera. This can be useful\n * for rendering 2D scenes and UI elements, amongst other things.\n *\n * ```js\n * const camera = new THREE.OrthographicCamera( width / - 2, width / 2, height / 2, height / - 2, 1, 1000 );\n * scene.add( camera );\n * ```\n *\n * @augments Camera\n */\nclass OrthographicCamera extends Camera {\n\n\t/**\n\t * Constructs a new orthographic camera.\n\t *\n\t * @param {number} [left=-1] - The left plane of the camera's frustum.\n\t * @param {number} [right=1] - The right plane of the camera's frustum.\n\t * @param {number} [top=1] - The top plane of the camera's frustum.\n\t * @param {number} [bottom=-1] - The bottom plane of the camera's frustum.\n\t * @param {number} [near=0.1] - The camera's near plane.\n\t * @param {number} [far=2000] - The camera's far plane.\n\t */\n\tconstructor( left = -1, right = 1, top = 1, bottom = -1, near = 0.1, far = 2000 ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isOrthographicCamera = true;\n\n\t\tthis.type = 'OrthographicCamera';\n\n\t\t/**\n\t\t * The zoom factor of the camera.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.zoom = 1;\n\n\t\t/**\n\t\t * Represents the frustum window specification. This property should not be edited\n\t\t * directly but via {@link PerspectiveCamera#setViewOffset} and {@link PerspectiveCamera#clearViewOffset}.\n\t\t *\n\t\t * @type {?Object}\n\t\t * @default null\n\t\t */\n\t\tthis.view = null;\n\n\t\t/**\n\t\t * The left plane of the camera's frustum.\n\t\t *\n\t\t * @type {number}\n\t\t * @default -1\n\t\t */\n\t\tthis.left = left;\n\n\t\t/**\n\t\t * The right plane of the camera's frustum.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.right = right;\n\n\t\t/**\n\t\t * The top plane of the camera's frustum.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.top = top;\n\n\t\t/**\n\t\t * The bottom plane of the camera's frustum.\n\t\t *\n\t\t * @type {number}\n\t\t * @default -1\n\t\t */\n\t\tthis.bottom = bottom;\n\n\t\t/**\n\t\t * The camera's near plane. The valid range is greater than `0`\n\t\t * and less than the current value of {@link OrthographicCamera#far}.\n\t\t *\n\t\t * Note that, unlike for the {@link PerspectiveCamera}, `0` is a\n\t\t * valid value for an orthographic camera's near plane.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.1\n\t\t */\n\t\tthis.near = near;\n\n\t\t/**\n\t\t * The camera's far plane. Must be greater than the\n\t\t * current value of {@link OrthographicCamera#near}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 2000\n\t\t */\n\t\tthis.far = far;\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.left = source.left;\n\t\tthis.right = source.right;\n\t\tthis.top = source.top;\n\t\tthis.bottom = source.bottom;\n\t\tthis.near = source.near;\n\t\tthis.far = source.far;\n\n\t\tthis.zoom = source.zoom;\n\t\tthis.view = source.view === null ? null : Object.assign( {}, source.view );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets an offset in a larger frustum. This is useful for multi-window or\n\t * multi-monitor/multi-machine setups.\n\t *\n\t * @param {number} fullWidth - The full width of multiview setup.\n\t * @param {number} fullHeight - The full height of multiview setup.\n\t * @param {number} x - The horizontal offset of the subcamera.\n\t * @param {number} y - The vertical offset of the subcamera.\n\t * @param {number} width - The width of subcamera.\n\t * @param {number} height - The height of subcamera.\n\t * @see {@link PerspectiveCamera#setViewOffset}\n\t */\n\tsetViewOffset( fullWidth, fullHeight, x, y, width, height ) {\n\n\t\tif ( this.view === null ) {\n\n\t\t\tthis.view = {\n\t\t\t\tenabled: true,\n\t\t\t\tfullWidth: 1,\n\t\t\t\tfullHeight: 1,\n\t\t\t\toffsetX: 0,\n\t\t\t\toffsetY: 0,\n\t\t\t\twidth: 1,\n\t\t\t\theight: 1\n\t\t\t};\n\n\t\t}\n\n\t\tthis.view.enabled = true;\n\t\tthis.view.fullWidth = fullWidth;\n\t\tthis.view.fullHeight = fullHeight;\n\t\tthis.view.offsetX = x;\n\t\tthis.view.offsetY = y;\n\t\tthis.view.width = width;\n\t\tthis.view.height = height;\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\t/**\n\t * Removes the view offset from the projection matrix.\n\t */\n\tclearViewOffset() {\n\n\t\tif ( this.view !== null ) {\n\n\t\t\tthis.view.enabled = false;\n\n\t\t}\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\t/**\n\t * Updates the camera's projection matrix. Must be called after any change of\n\t * camera properties.\n\t */\n\tupdateProjectionMatrix() {\n\n\t\tconst dx = ( this.right - this.left ) / ( 2 * this.zoom );\n\t\tconst dy = ( this.top - this.bottom ) / ( 2 * this.zoom );\n\t\tconst cx = ( this.right + this.left ) / 2;\n\t\tconst cy = ( this.top + this.bottom ) / 2;\n\n\t\tlet left = cx - dx;\n\t\tlet right = cx + dx;\n\t\tlet top = cy + dy;\n\t\tlet bottom = cy - dy;\n\n\t\tif ( this.view !== null && this.view.enabled ) {\n\n\t\t\tconst scaleW = ( this.right - this.left ) / this.view.fullWidth / this.zoom;\n\t\t\tconst scaleH = ( this.top - this.bottom ) / this.view.fullHeight / this.zoom;\n\n\t\t\tleft += scaleW * this.view.offsetX;\n\t\t\tright = left + scaleW * this.view.width;\n\t\t\ttop -= scaleH * this.view.offsetY;\n\t\t\tbottom = top - scaleH * this.view.height;\n\n\t\t}\n\n\t\tthis.projectionMatrix.makeOrthographic( left, right, top, bottom, this.near, this.far, this.coordinateSystem, this.reversedDepth );\n\n\t\tthis.projectionMatrixInverse.copy( this.projectionMatrix ).invert();\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.zoom = this.zoom;\n\t\tdata.object.left = this.left;\n\t\tdata.object.right = this.right;\n\t\tdata.object.top = this.top;\n\t\tdata.object.bottom = this.bottom;\n\t\tdata.object.near = this.near;\n\t\tdata.object.far = this.far;\n\n\t\tif ( this.view !== null ) data.object.view = Object.assign( {}, this.view );\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * Represents the shadow configuration of directional lights.\n *\n * @augments LightShadow\n */\nclass DirectionalLightShadow extends LightShadow {\n\n\t/**\n\t * Constructs a new directional light shadow.\n\t */\n\tconstructor() {\n\n\t\tsuper( new OrthographicCamera( -5, 5, 5, -5, 0.5, 500 ) );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isDirectionalLightShadow = true;\n\n\t}\n\n}\n\n/**\n * A light that gets emitted in a specific direction. This light will behave\n * as though it is infinitely far away and the rays produced from it are all\n * parallel. The common use case for this is to simulate daylight; the sun is\n * far enough away that its position can be considered to be infinite, and\n * all light rays coming from it are parallel.\n *\n * A common point of confusion for directional lights is that setting the\n * rotation has no effect. This is because three.js's DirectionalLight is the\n * equivalent to what is often called a 'Target Direct Light' in other\n * applications.\n *\n * This means that its direction is calculated as pointing from the light's\n * {@link Object3D#position} to the {@link DirectionalLight#target} position\n * (as opposed to a 'Free Direct Light' that just has a rotation\n * component).\n *\n * This light can cast shadows - see the {@link DirectionalLightShadow} for details.\n *\n * ```js\n * // White directional light at half intensity shining from the top.\n * const directionalLight = new THREE.DirectionalLight( 0xffffff, 0.5 );\n * scene.add( directionalLight );\n * ```\n *\n * @augments Light\n */\nclass DirectionalLight extends Light {\n\n\t/**\n\t * Constructs a new directional light.\n\t *\n\t * @param {(number|Color|string)} [color=0xffffff] - The light's color.\n\t * @param {number} [intensity=1] - The light's strength/intensity.\n\t */\n\tconstructor( color, intensity ) {\n\n\t\tsuper( color, intensity );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isDirectionalLight = true;\n\n\t\tthis.type = 'DirectionalLight';\n\n\t\tthis.position.copy( Object3D.DEFAULT_UP );\n\t\tthis.updateMatrix();\n\n\t\t/**\n\t\t * The directional light points from its position to the\n\t\t * target's position.\n\t\t *\n\t\t * For the target's position to be changed to anything other\n\t\t * than the default, it must be added to the scene.\n\t\t *\n\t\t * It is also possible to set the target to be another 3D object\n\t\t * in the scene. The light will now track the target object.\n\t\t *\n\t\t * @type {Object3D}\n\t\t */\n\t\tthis.target = new Object3D();\n\n\t\t/**\n\t\t * This property holds the light's shadow configuration.\n\t\t *\n\t\t * @type {DirectionalLightShadow}\n\t\t */\n\t\tthis.shadow = new DirectionalLightShadow();\n\n\t}\n\n\tdispose() {\n\n\t\tthis.shadow.dispose();\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.target = source.target.clone();\n\t\tthis.shadow = source.shadow.clone();\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * This light globally illuminates all objects in the scene equally.\n *\n * It cannot be used to cast shadows as it does not have a direction.\n *\n * ```js\n * const light = new THREE.AmbientLight( 0x404040 ); // soft white light\n * scene.add( light );\n * ```\n *\n * @augments Light\n */\nclass AmbientLight extends Light {\n\n\t/**\n\t * Constructs a new ambient light.\n\t *\n\t * @param {(number|Color|string)} [color=0xffffff] - The light's color.\n\t * @param {number} [intensity=1] - The light's strength/intensity.\n\t */\n\tconstructor( color, intensity ) {\n\n\t\tsuper( color, intensity );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isAmbientLight = true;\n\n\t\tthis.type = 'AmbientLight';\n\n\t}\n\n}\n\n/**\n * This class emits light uniformly across the face a rectangular plane.\n * This light type can be used to simulate light sources such as bright\n * windows or strip lighting.\n *\n * Important Notes:\n *\n * - There is no shadow support.\n * - Only PBR materials are supported.\n * - You have to include `RectAreaLightUniformsLib` (`WebGLRenderer`) or `RectAreaLightTexturesLib` (`WebGPURenderer`)\n * into your app and init the uniforms/textures.\n *\n * ```js\n * RectAreaLightUniformsLib.init(); // only relevant for WebGLRenderer\n * THREE.RectAreaLightNode.setLTC( RectAreaLightTexturesLib.init() ); //  only relevant for WebGPURenderer\n *\n * const intensity = 1; const width = 10; const height = 10;\n * const rectLight = new THREE.RectAreaLight( 0xffffff, intensity, width, height );\n * rectLight.position.set( 5, 5, 0 );\n * rectLight.lookAt( 0, 0, 0 );\n * scene.add( rectLight )\n * ```\n *\n * @augments Light\n */\nclass RectAreaLight extends Light {\n\n\t/**\n\t * Constructs a new area light.\n\t *\n\t * @param {(number|Color|string)} [color=0xffffff] - The light's color.\n\t * @param {number} [intensity=1] - The light's strength/intensity.\n\t * @param {number} [width=10] - The width of the light.\n\t * @param {number} [height=10] - The height of the light.\n\t */\n\tconstructor( color, intensity, width = 10, height = 10 ) {\n\n\t\tsuper( color, intensity );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isRectAreaLight = true;\n\n\t\tthis.type = 'RectAreaLight';\n\n\t\t/**\n\t\t * The width of the light.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 10\n\t\t */\n\t\tthis.width = width;\n\n\t\t/**\n\t\t * The height of the light.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 10\n\t\t */\n\t\tthis.height = height;\n\n\t}\n\n\t/**\n\t * The light's power. Power is the luminous power of the light measured in lumens (lm).\n\t * Changing the power will also change the light's intensity.\n\t *\n\t * @type {number}\n\t */\n\tget power() {\n\n\t\t// compute the light's luminous power (in lumens) from its intensity (in nits)\n\t\treturn this.intensity * this.width * this.height * Math.PI;\n\n\t}\n\n\tset power( power ) {\n\n\t\t// set the light's intensity (in nits) from the desired luminous power (in lumens)\n\t\tthis.intensity = power / ( this.width * this.height * Math.PI );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.width = source.width;\n\t\tthis.height = source.height;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.width = this.width;\n\t\tdata.object.height = this.height;\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * Represents a third-order spherical harmonics (SH). Light probes use this class\n * to encode lighting information.\n *\n * - Primary reference: {@link https://graphics.stanford.edu/papers/envmap/envmap.pdf}\n * - Secondary reference: {@link https://www.ppsloan.org/publications/StupidSH36.pdf}\n */\nclass SphericalHarmonics3 {\n\n\t/**\n\t * Constructs a new spherical harmonics.\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSphericalHarmonics3 = true;\n\n\t\t/**\n\t\t * An array holding the (9) SH coefficients.\n\t\t *\n\t\t * @type {Array<Vector3>}\n\t\t */\n\t\tthis.coefficients = [];\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients.push( new Vector3() );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the given SH coefficients to this instance by copying\n\t * the values.\n\t *\n\t * @param {Array<Vector3>} coefficients - The SH coefficients.\n\t * @return {SphericalHarmonics3} A reference to this spherical harmonics.\n\t */\n\tset( coefficients ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].copy( coefficients[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets all SH coefficients to `0`.\n\t *\n\t * @return {SphericalHarmonics3} A reference to this spherical harmonics.\n\t */\n\tzero() {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].set( 0, 0, 0 );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the radiance in the direction of the given normal.\n\t *\n\t * @param {Vector3} normal - The normal vector (assumed to be unit length)\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The radiance.\n\t */\n\tgetAt( normal, target ) {\n\n\t\t// normal is assumed to be unit length\n\n\t\tconst x = normal.x, y = normal.y, z = normal.z;\n\n\t\tconst coeff = this.coefficients;\n\n\t\t// band 0\n\t\ttarget.copy( coeff[ 0 ] ).multiplyScalar( 0.282095 );\n\n\t\t// band 1\n\t\ttarget.addScaledVector( coeff[ 1 ], 0.488603 * y );\n\t\ttarget.addScaledVector( coeff[ 2 ], 0.488603 * z );\n\t\ttarget.addScaledVector( coeff[ 3 ], 0.488603 * x );\n\n\t\t// band 2\n\t\ttarget.addScaledVector( coeff[ 4 ], 1.092548 * ( x * y ) );\n\t\ttarget.addScaledVector( coeff[ 5 ], 1.092548 * ( y * z ) );\n\t\ttarget.addScaledVector( coeff[ 6 ], 0.315392 * ( 3.0 * z * z - 1.0 ) );\n\t\ttarget.addScaledVector( coeff[ 7 ], 1.092548 * ( x * z ) );\n\t\ttarget.addScaledVector( coeff[ 8 ], 0.546274 * ( x * x - y * y ) );\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Returns the irradiance (radiance convolved with cosine lobe) in the\n\t * direction of the given normal.\n\t *\n\t * @param {Vector3} normal - The normal vector (assumed to be unit length)\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The irradiance.\n\t */\n\tgetIrradianceAt( normal, target ) {\n\n\t\t// normal is assumed to be unit length\n\n\t\tconst x = normal.x, y = normal.y, z = normal.z;\n\n\t\tconst coeff = this.coefficients;\n\n\t\t// band 0\n\t\ttarget.copy( coeff[ 0 ] ).multiplyScalar( 0.886227 ); // π * 0.282095\n\n\t\t// band 1\n\t\ttarget.addScaledVector( coeff[ 1 ], 2.0 * 0.511664 * y ); // ( 2 * π / 3 ) * 0.488603\n\t\ttarget.addScaledVector( coeff[ 2 ], 2.0 * 0.511664 * z );\n\t\ttarget.addScaledVector( coeff[ 3 ], 2.0 * 0.511664 * x );\n\n\t\t// band 2\n\t\ttarget.addScaledVector( coeff[ 4 ], 2.0 * 0.429043 * x * y ); // ( π / 4 ) * 1.092548\n\t\ttarget.addScaledVector( coeff[ 5 ], 2.0 * 0.429043 * y * z );\n\t\ttarget.addScaledVector( coeff[ 6 ], 0.743125 * z * z - 0.247708 ); // ( π / 4 ) * 0.315392 * 3\n\t\ttarget.addScaledVector( coeff[ 7 ], 2.0 * 0.429043 * x * z );\n\t\ttarget.addScaledVector( coeff[ 8 ], 0.429043 * ( x * x - y * y ) ); // ( π / 4 ) * 0.546274\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Adds the given SH to this instance.\n\t *\n\t * @param {SphericalHarmonics3} sh - The SH to add.\n\t * @return {SphericalHarmonics3} A reference to this spherical harmonics.\n\t */\n\tadd( sh ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].add( sh.coefficients[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * A convenience method for performing {@link SphericalHarmonics3#add} and\n\t * {@link SphericalHarmonics3#scale} at once.\n\t *\n\t * @param {SphericalHarmonics3} sh - The SH to add.\n\t * @param {number} s - The scale factor.\n\t * @return {SphericalHarmonics3} A reference to this spherical harmonics.\n\t */\n\taddScaledSH( sh, s ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].addScaledVector( sh.coefficients[ i ], s );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Scales this SH by the given scale factor.\n\t *\n\t * @param {number} s - The scale factor.\n\t * @return {SphericalHarmonics3} A reference to this spherical harmonics.\n\t */\n\tscale( s ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].multiplyScalar( s );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Linear interpolates between the given SH and this instance by the given\n\t * alpha factor.\n\t *\n\t * @param {SphericalHarmonics3} sh - The SH to interpolate with.\n\t * @param {number} alpha - The alpha factor.\n\t * @return {SphericalHarmonics3} A reference to this spherical harmonics.\n\t */\n\tlerp( sh, alpha ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].lerp( sh.coefficients[ i ], alpha );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this spherical harmonics is equal with the given one.\n\t *\n\t * @param {SphericalHarmonics3} sh - The spherical harmonics to test for equality.\n\t * @return {boolean} Whether this spherical harmonics is equal with the given one.\n\t */\n\tequals( sh ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tif ( ! this.coefficients[ i ].equals( sh.coefficients[ i ] ) ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\t/**\n\t * Copies the values of the given spherical harmonics to this instance.\n\t *\n\t * @param {SphericalHarmonics3} sh - The spherical harmonics to copy.\n\t * @return {SphericalHarmonics3} A reference to this spherical harmonics.\n\t */\n\tcopy( sh ) {\n\n\t\treturn this.set( sh.coefficients );\n\n\t}\n\n\t/**\n\t * Returns a new spherical harmonics with copied values from this instance.\n\t *\n\t * @return {SphericalHarmonics3} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Sets the SH coefficients of this instance from the given array.\n\t *\n\t * @param {Array<number>} array - An array holding the SH coefficients.\n\t * @param {number} [offset=0] - The array offset where to start copying.\n\t * @return {SphericalHarmonics3} A clone of this instance.\n\t */\n\tfromArray( array, offset = 0 ) {\n\n\t\tconst coefficients = this.coefficients;\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tcoefficients[ i ].fromArray( array, offset + ( i * 3 ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns an array with the SH coefficients, or copies them into the provided\n\t * array. The coefficients are represented as numbers.\n\t *\n\t * @param {Array<number>} [array=[]] - The target array.\n\t * @param {number} [offset=0] - The array offset where to start copying.\n\t * @return {Array<number>} An array with flat SH coefficients.\n\t */\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tconst coefficients = this.coefficients;\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tcoefficients[ i ].toArray( array, offset + ( i * 3 ) );\n\n\t\t}\n\n\t\treturn array;\n\n\t}\n\n\t/**\n\t * Computes the SH basis for the given normal vector.\n\t *\n\t * @param {Vector3} normal - The normal.\n\t * @param {Array<number>} shBasis - The target array holding the SH basis.\n\t */\n\tstatic getBasisAt( normal, shBasis ) {\n\n\t\t// normal is assumed to be unit length\n\n\t\tconst x = normal.x, y = normal.y, z = normal.z;\n\n\t\t// band 0\n\t\tshBasis[ 0 ] = 0.282095;\n\n\t\t// band 1\n\t\tshBasis[ 1 ] = 0.488603 * y;\n\t\tshBasis[ 2 ] = 0.488603 * z;\n\t\tshBasis[ 3 ] = 0.488603 * x;\n\n\t\t// band 2\n\t\tshBasis[ 4 ] = 1.092548 * x * y;\n\t\tshBasis[ 5 ] = 1.092548 * y * z;\n\t\tshBasis[ 6 ] = 0.315392 * ( 3 * z * z - 1 );\n\t\tshBasis[ 7 ] = 1.092548 * x * z;\n\t\tshBasis[ 8 ] = 0.546274 * ( x * x - y * y );\n\n\t}\n\n}\n\n/**\n * Light probes are an alternative way of adding light to a 3D scene. Unlike\n * classical light sources (e.g. directional, point or spot lights), light\n * probes do not emit light. Instead they store information about light\n * passing through 3D space. During rendering, the light that hits a 3D\n * object is approximated by using the data from the light probe.\n *\n * Light probes are usually created from (radiance) environment maps. The\n * class {@link LightProbeGenerator} can be used to create light probes from\n * cube textures or render targets. However, light estimation data could also\n * be provided in other forms e.g. by WebXR. This enables the rendering of\n * augmented reality content that reacts to real world lighting.\n *\n * The current probe implementation in three.js supports so-called diffuse\n * light probes. This type of light probe is functionally equivalent to an\n * irradiance environment map.\n *\n * @augments Light\n */\nclass LightProbe extends Light {\n\n\t/**\n\t * Constructs a new light probe.\n\t *\n\t * @param {SphericalHarmonics3} sh - The spherical harmonics which represents encoded lighting information.\n\t * @param {number} [intensity=1] - The light's strength/intensity.\n\t */\n\tconstructor( sh = new SphericalHarmonics3(), intensity = 1 ) {\n\n\t\tsuper( undefined, intensity );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLightProbe = true;\n\n\t\t/**\n\t\t * A light probe uses spherical harmonics to encode lighting information.\n\t\t *\n\t\t * @type {SphericalHarmonics3}\n\t\t */\n\t\tthis.sh = sh;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.sh.copy( source.sh );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Deserializes the light prove from the given JSON.\n\t *\n\t * @param {Object} json - The JSON holding the serialized light probe.\n\t * @return {LightProbe} A reference to this light probe.\n\t */\n\tfromJSON( json ) {\n\n\t\tthis.intensity = json.intensity; // TODO: Move this bit to Light.fromJSON();\n\t\tthis.sh.fromArray( json.sh );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.sh = this.sh.toArray();\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * Class for loading geometries. The files are internally\n * loaded via {@link FileLoader}.\n *\n * ```js\n * const loader = new THREE.MaterialLoader();\n * const material = await loader.loadAsync( 'material.json' );\n * ```\n * This loader does not support node materials. Use {@link NodeMaterialLoader} instead.\n *\n * @augments Loader\n */\nclass MaterialLoader extends Loader {\n\n\t/**\n\t * Constructs a new material loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\t/**\n\t\t * A dictionary holding textures used by the material.\n\t\t *\n\t\t * @type {Object<string,Texture>}\n\t\t */\n\t\tthis.textures = {};\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and pass the loaded material to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(Material)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( scope.manager );\n\t\tloader.setPath( scope.path );\n\t\tloader.setRequestHeader( scope.requestHeader );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\terror( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\t/**\n\t * Parses the given JSON object and returns a material.\n\t *\n\t * @param {Object} json - The serialized material.\n\t * @return {Material} The parsed material.\n\t */\n\tparse( json ) {\n\n\t\tconst textures = this.textures;\n\n\t\tfunction getTexture( name ) {\n\n\t\t\tif ( textures[ name ] === undefined ) {\n\n\t\t\t\twarn( 'MaterialLoader: Undefined texture', name );\n\n\t\t\t}\n\n\t\t\treturn textures[ name ];\n\n\t\t}\n\n\t\tconst material = this.createMaterialFromType( json.type );\n\n\t\tif ( json.uuid !== undefined ) material.uuid = json.uuid;\n\t\tif ( json.name !== undefined ) material.name = json.name;\n\t\tif ( json.color !== undefined && material.color !== undefined ) material.color.setHex( json.color );\n\t\tif ( json.roughness !== undefined ) material.roughness = json.roughness;\n\t\tif ( json.metalness !== undefined ) material.metalness = json.metalness;\n\t\tif ( json.sheen !== undefined ) material.sheen = json.sheen;\n\t\tif ( json.sheenColor !== undefined ) material.sheenColor = new Color().setHex( json.sheenColor );\n\t\tif ( json.sheenRoughness !== undefined ) material.sheenRoughness = json.sheenRoughness;\n\t\tif ( json.emissive !== undefined && material.emissive !== undefined ) material.emissive.setHex( json.emissive );\n\t\tif ( json.specular !== undefined && material.specular !== undefined ) material.specular.setHex( json.specular );\n\t\tif ( json.specularIntensity !== undefined ) material.specularIntensity = json.specularIntensity;\n\t\tif ( json.specularColor !== undefined && material.specularColor !== undefined ) material.specularColor.setHex( json.specularColor );\n\t\tif ( json.shininess !== undefined ) material.shininess = json.shininess;\n\t\tif ( json.clearcoat !== undefined ) material.clearcoat = json.clearcoat;\n\t\tif ( json.clearcoatRoughness !== undefined ) material.clearcoatRoughness = json.clearcoatRoughness;\n\t\tif ( json.dispersion !== undefined ) material.dispersion = json.dispersion;\n\t\tif ( json.iridescence !== undefined ) material.iridescence = json.iridescence;\n\t\tif ( json.iridescenceIOR !== undefined ) material.iridescenceIOR = json.iridescenceIOR;\n\t\tif ( json.iridescenceThicknessRange !== undefined ) material.iridescenceThicknessRange = json.iridescenceThicknessRange;\n\t\tif ( json.transmission !== undefined ) material.transmission = json.transmission;\n\t\tif ( json.thickness !== undefined ) material.thickness = json.thickness;\n\t\tif ( json.attenuationDistance !== undefined ) material.attenuationDistance = json.attenuationDistance;\n\t\tif ( json.attenuationColor !== undefined && material.attenuationColor !== undefined ) material.attenuationColor.setHex( json.attenuationColor );\n\t\tif ( json.anisotropy !== undefined ) material.anisotropy = json.anisotropy;\n\t\tif ( json.anisotropyRotation !== undefined ) material.anisotropyRotation = json.anisotropyRotation;\n\t\tif ( json.fog !== undefined ) material.fog = json.fog;\n\t\tif ( json.flatShading !== undefined ) material.flatShading = json.flatShading;\n\t\tif ( json.blending !== undefined ) material.blending = json.blending;\n\t\tif ( json.combine !== undefined ) material.combine = json.combine;\n\t\tif ( json.side !== undefined ) material.side = json.side;\n\t\tif ( json.shadowSide !== undefined ) material.shadowSide = json.shadowSide;\n\t\tif ( json.opacity !== undefined ) material.opacity = json.opacity;\n\t\tif ( json.transparent !== undefined ) material.transparent = json.transparent;\n\t\tif ( json.alphaTest !== undefined ) material.alphaTest = json.alphaTest;\n\t\tif ( json.alphaHash !== undefined ) material.alphaHash = json.alphaHash;\n\t\tif ( json.depthFunc !== undefined ) material.depthFunc = json.depthFunc;\n\t\tif ( json.depthTest !== undefined ) material.depthTest = json.depthTest;\n\t\tif ( json.depthWrite !== undefined ) material.depthWrite = json.depthWrite;\n\t\tif ( json.colorWrite !== undefined ) material.colorWrite = json.colorWrite;\n\t\tif ( json.blendSrc !== undefined ) material.blendSrc = json.blendSrc;\n\t\tif ( json.blendDst !== undefined ) material.blendDst = json.blendDst;\n\t\tif ( json.blendEquation !== undefined ) material.blendEquation = json.blendEquation;\n\t\tif ( json.blendSrcAlpha !== undefined ) material.blendSrcAlpha = json.blendSrcAlpha;\n\t\tif ( json.blendDstAlpha !== undefined ) material.blendDstAlpha = json.blendDstAlpha;\n\t\tif ( json.blendEquationAlpha !== undefined ) material.blendEquationAlpha = json.blendEquationAlpha;\n\t\tif ( json.blendColor !== undefined && material.blendColor !== undefined ) material.blendColor.setHex( json.blendColor );\n\t\tif ( json.blendAlpha !== undefined ) material.blendAlpha = json.blendAlpha;\n\t\tif ( json.stencilWriteMask !== undefined ) material.stencilWriteMask = json.stencilWriteMask;\n\t\tif ( json.stencilFunc !== undefined ) material.stencilFunc = json.stencilFunc;\n\t\tif ( json.stencilRef !== undefined ) material.stencilRef = json.stencilRef;\n\t\tif ( json.stencilFuncMask !== undefined ) material.stencilFuncMask = json.stencilFuncMask;\n\t\tif ( json.stencilFail !== undefined ) material.stencilFail = json.stencilFail;\n\t\tif ( json.stencilZFail !== undefined ) material.stencilZFail = json.stencilZFail;\n\t\tif ( json.stencilZPass !== undefined ) material.stencilZPass = json.stencilZPass;\n\t\tif ( json.stencilWrite !== undefined ) material.stencilWrite = json.stencilWrite;\n\n\t\tif ( json.wireframe !== undefined ) material.wireframe = json.wireframe;\n\t\tif ( json.wireframeLinewidth !== undefined ) material.wireframeLinewidth = json.wireframeLinewidth;\n\t\tif ( json.wireframeLinecap !== undefined ) material.wireframeLinecap = json.wireframeLinecap;\n\t\tif ( json.wireframeLinejoin !== undefined ) material.wireframeLinejoin = json.wireframeLinejoin;\n\n\t\tif ( json.rotation !== undefined ) material.rotation = json.rotation;\n\n\t\tif ( json.linewidth !== undefined ) material.linewidth = json.linewidth;\n\t\tif ( json.dashSize !== undefined ) material.dashSize = json.dashSize;\n\t\tif ( json.gapSize !== undefined ) material.gapSize = json.gapSize;\n\t\tif ( json.scale !== undefined ) material.scale = json.scale;\n\n\t\tif ( json.polygonOffset !== undefined ) material.polygonOffset = json.polygonOffset;\n\t\tif ( json.polygonOffsetFactor !== undefined ) material.polygonOffsetFactor = json.polygonOffsetFactor;\n\t\tif ( json.polygonOffsetUnits !== undefined ) material.polygonOffsetUnits = json.polygonOffsetUnits;\n\n\t\tif ( json.dithering !== undefined ) material.dithering = json.dithering;\n\n\t\tif ( json.alphaToCoverage !== undefined ) material.alphaToCoverage = json.alphaToCoverage;\n\t\tif ( json.premultipliedAlpha !== undefined ) material.premultipliedAlpha = json.premultipliedAlpha;\n\t\tif ( json.forceSinglePass !== undefined ) material.forceSinglePass = json.forceSinglePass;\n\n\t\tif ( json.visible !== undefined ) material.visible = json.visible;\n\n\t\tif ( json.toneMapped !== undefined ) material.toneMapped = json.toneMapped;\n\n\t\tif ( json.userData !== undefined ) material.userData = json.userData;\n\n\t\tif ( json.vertexColors !== undefined ) {\n\n\t\t\tif ( typeof json.vertexColors === 'number' ) {\n\n\t\t\t\tmaterial.vertexColors = ( json.vertexColors > 0 ) ? true : false;\n\n\t\t\t} else {\n\n\t\t\t\tmaterial.vertexColors = json.vertexColors;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Shader Material\n\n\t\tif ( json.uniforms !== undefined ) {\n\n\t\t\tfor ( const name in json.uniforms ) {\n\n\t\t\t\tconst uniform = json.uniforms[ name ];\n\n\t\t\t\tmaterial.uniforms[ name ] = {};\n\n\t\t\t\tswitch ( uniform.type ) {\n\n\t\t\t\t\tcase 't':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = getTexture( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'c':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Color().setHex( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'v2':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Vector2().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'v3':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Vector3().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'v4':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Vector4().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'm3':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Matrix3().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'm4':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Matrix4().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = uniform.value;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( json.defines !== undefined ) material.defines = json.defines;\n\t\tif ( json.vertexShader !== undefined ) material.vertexShader = json.vertexShader;\n\t\tif ( json.fragmentShader !== undefined ) material.fragmentShader = json.fragmentShader;\n\t\tif ( json.glslVersion !== undefined ) material.glslVersion = json.glslVersion;\n\n\t\tif ( json.extensions !== undefined ) {\n\n\t\t\tfor ( const key in json.extensions ) {\n\n\t\t\t\tmaterial.extensions[ key ] = json.extensions[ key ];\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( json.lights !== undefined ) material.lights = json.lights;\n\t\tif ( json.clipping !== undefined ) material.clipping = json.clipping;\n\n\t\t// for PointsMaterial\n\n\t\tif ( json.size !== undefined ) material.size = json.size;\n\t\tif ( json.sizeAttenuation !== undefined ) material.sizeAttenuation = json.sizeAttenuation;\n\n\t\t// maps\n\n\t\tif ( json.map !== undefined ) material.map = getTexture( json.map );\n\t\tif ( json.matcap !== undefined ) material.matcap = getTexture( json.matcap );\n\n\t\tif ( json.alphaMap !== undefined ) material.alphaMap = getTexture( json.alphaMap );\n\n\t\tif ( json.bumpMap !== undefined ) material.bumpMap = getTexture( json.bumpMap );\n\t\tif ( json.bumpScale !== undefined ) material.bumpScale = json.bumpScale;\n\n\t\tif ( json.normalMap !== undefined ) material.normalMap = getTexture( json.normalMap );\n\t\tif ( json.normalMapType !== undefined ) material.normalMapType = json.normalMapType;\n\t\tif ( json.normalScale !== undefined ) {\n\n\t\t\tlet normalScale = json.normalScale;\n\n\t\t\tif ( Array.isArray( normalScale ) === false ) {\n\n\t\t\t\t// Blender exporter used to export a scalar. See #7459\n\n\t\t\t\tnormalScale = [ normalScale, normalScale ];\n\n\t\t\t}\n\n\t\t\tmaterial.normalScale = new Vector2().fromArray( normalScale );\n\n\t\t}\n\n\t\tif ( json.displacementMap !== undefined ) material.displacementMap = getTexture( json.displacementMap );\n\t\tif ( json.displacementScale !== undefined ) material.displacementScale = json.displacementScale;\n\t\tif ( json.displacementBias !== undefined ) material.displacementBias = json.displacementBias;\n\n\t\tif ( json.roughnessMap !== undefined ) material.roughnessMap = getTexture( json.roughnessMap );\n\t\tif ( json.metalnessMap !== undefined ) material.metalnessMap = getTexture( json.metalnessMap );\n\n\t\tif ( json.emissiveMap !== undefined ) material.emissiveMap = getTexture( json.emissiveMap );\n\t\tif ( json.emissiveIntensity !== undefined ) material.emissiveIntensity = json.emissiveIntensity;\n\n\t\tif ( json.specularMap !== undefined ) material.specularMap = getTexture( json.specularMap );\n\t\tif ( json.specularIntensityMap !== undefined ) material.specularIntensityMap = getTexture( json.specularIntensityMap );\n\t\tif ( json.specularColorMap !== undefined ) material.specularColorMap = getTexture( json.specularColorMap );\n\n\t\tif ( json.envMap !== undefined ) material.envMap = getTexture( json.envMap );\n\t\tif ( json.envMapRotation !== undefined ) material.envMapRotation.fromArray( json.envMapRotation );\n\t\tif ( json.envMapIntensity !== undefined ) material.envMapIntensity = json.envMapIntensity;\n\n\t\tif ( json.reflectivity !== undefined ) material.reflectivity = json.reflectivity;\n\t\tif ( json.refractionRatio !== undefined ) material.refractionRatio = json.refractionRatio;\n\n\t\tif ( json.lightMap !== undefined ) material.lightMap = getTexture( json.lightMap );\n\t\tif ( json.lightMapIntensity !== undefined ) material.lightMapIntensity = json.lightMapIntensity;\n\n\t\tif ( json.aoMap !== undefined ) material.aoMap = getTexture( json.aoMap );\n\t\tif ( json.aoMapIntensity !== undefined ) material.aoMapIntensity = json.aoMapIntensity;\n\n\t\tif ( json.gradientMap !== undefined ) material.gradientMap = getTexture( json.gradientMap );\n\n\t\tif ( json.clearcoatMap !== undefined ) material.clearcoatMap = getTexture( json.clearcoatMap );\n\t\tif ( json.clearcoatRoughnessMap !== undefined ) material.clearcoatRoughnessMap = getTexture( json.clearcoatRoughnessMap );\n\t\tif ( json.clearcoatNormalMap !== undefined ) material.clearcoatNormalMap = getTexture( json.clearcoatNormalMap );\n\t\tif ( json.clearcoatNormalScale !== undefined ) material.clearcoatNormalScale = new Vector2().fromArray( json.clearcoatNormalScale );\n\n\t\tif ( json.iridescenceMap !== undefined ) material.iridescenceMap = getTexture( json.iridescenceMap );\n\t\tif ( json.iridescenceThicknessMap !== undefined ) material.iridescenceThicknessMap = getTexture( json.iridescenceThicknessMap );\n\n\t\tif ( json.transmissionMap !== undefined ) material.transmissionMap = getTexture( json.transmissionMap );\n\t\tif ( json.thicknessMap !== undefined ) material.thicknessMap = getTexture( json.thicknessMap );\n\n\t\tif ( json.anisotropyMap !== undefined ) material.anisotropyMap = getTexture( json.anisotropyMap );\n\n\t\tif ( json.sheenColorMap !== undefined ) material.sheenColorMap = getTexture( json.sheenColorMap );\n\t\tif ( json.sheenRoughnessMap !== undefined ) material.sheenRoughnessMap = getTexture( json.sheenRoughnessMap );\n\n\t\treturn material;\n\n\t}\n\n\t/**\n\t * Textures are not embedded in the material JSON so they have\n\t * to be injected before the loading process starts.\n\t *\n\t * @param {Object} value - A dictionary holding textures for material properties.\n\t * @return {MaterialLoader} A reference to this material loader.\n\t */\n\tsetTextures( value ) {\n\n\t\tthis.textures = value;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Creates a material for the given type.\n\t *\n\t * @param {string} type - The material type.\n\t * @return {Material} The new material.\n\t */\n\tcreateMaterialFromType( type ) {\n\n\t\treturn MaterialLoader.createMaterialFromType( type );\n\n\t}\n\n\t/**\n\t * Creates a material for the given type.\n\t *\n\t * @static\n\t * @param {string} type - The material type.\n\t * @return {Material} The new material.\n\t */\n\tstatic createMaterialFromType( type ) {\n\n\t\tconst materialLib = {\n\t\t\tShadowMaterial,\n\t\t\tSpriteMaterial,\n\t\t\tRawShaderMaterial,\n\t\t\tShaderMaterial,\n\t\t\tPointsMaterial,\n\t\t\tMeshPhysicalMaterial,\n\t\t\tMeshStandardMaterial,\n\t\t\tMeshPhongMaterial,\n\t\t\tMeshToonMaterial,\n\t\t\tMeshNormalMaterial,\n\t\t\tMeshLambertMaterial,\n\t\t\tMeshDepthMaterial,\n\t\t\tMeshDistanceMaterial,\n\t\t\tMeshBasicMaterial,\n\t\t\tMeshMatcapMaterial,\n\t\t\tLineDashedMaterial,\n\t\t\tLineBasicMaterial,\n\t\t\tMaterial\n\t\t};\n\n\t\treturn new materialLib[ type ]();\n\n\t}\n\n}\n\n/**\n * A class with loader utility functions.\n */\nclass LoaderUtils {\n\n\t/**\n\t * Extracts the base URL from the given URL.\n\t *\n\t * @param {string} url -The URL to extract the base URL from.\n\t * @return {string} The extracted base URL.\n\t */\n\tstatic extractUrlBase( url ) {\n\n\t\tconst index = url.lastIndexOf( '/' );\n\n\t\tif ( index === -1 ) return './';\n\n\t\treturn url.slice( 0, index + 1 );\n\n\t}\n\n\t/**\n\t * Resolves relative URLs against the given path. Absolute paths, data urls,\n\t * and blob URLs will be returned as is. Invalid URLs will return an empty\n\t * string.\n\t *\n\t * @param {string} url -The URL to resolve.\n\t * @param {string} path - The base path for relative URLs to be resolved against.\n\t * @return {string} The resolved URL.\n\t */\n\tstatic resolveURL( url, path ) {\n\n\t\t// Invalid URL\n\t\tif ( typeof url !== 'string' || url === '' ) return '';\n\n\t\t// Host Relative URL\n\t\tif ( /^https?:\\/\\//i.test( path ) && /^\\//.test( url ) ) {\n\n\t\t\tpath = path.replace( /(^https?:\\/\\/[^\\/]+).*/i, '$1' );\n\n\t\t}\n\n\t\t// Absolute URL http://,https://,//\n\t\tif ( /^(https?:)?\\/\\//i.test( url ) ) return url;\n\n\t\t// Data URI\n\t\tif ( /^data:.*,.*$/i.test( url ) ) return url;\n\n\t\t// Blob URL\n\t\tif ( /^blob:.*$/i.test( url ) ) return url;\n\n\t\t// Relative URL\n\t\treturn path + url;\n\n\t}\n\n}\n\n/**\n * An instanced version of a geometry.\n */\nclass InstancedBufferGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new instanced buffer geometry.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isInstancedBufferGeometry = true;\n\n\t\tthis.type = 'InstancedBufferGeometry';\n\n\t\t/**\n\t\t * The instance count.\n\t\t *\n\t\t * @type {number}\n\t\t * @default Infinity\n\t\t */\n\t\tthis.instanceCount = Infinity;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.instanceCount = source.instanceCount;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.instanceCount = this.instanceCount;\n\n\t\tdata.isInstancedBufferGeometry = true;\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * Class for loading geometries. The files are internally\n * loaded via {@link FileLoader}.\n *\n * ```js\n * const loader = new THREE.BufferGeometryLoader();\n * const geometry = await loader.loadAsync( 'models/json/pressure.json' );\n *\n * const material = new THREE.MeshBasicMaterial( { color: 0xF5F5F5 } );\n * const object = new THREE.Mesh( geometry, material );\n * scene.add( object );\n * ```\n *\n * @augments Loader\n */\nclass BufferGeometryLoader extends Loader {\n\n\t/**\n\t * Constructs a new geometry loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and pass the loaded geometry to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(BufferGeometry)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( scope.manager );\n\t\tloader.setPath( scope.path );\n\t\tloader.setRequestHeader( scope.requestHeader );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\terror( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\t/**\n\t * Parses the given JSON object and returns a geometry.\n\t *\n\t * @param {Object} json - The serialized geometry.\n\t * @return {BufferGeometry} The parsed geometry.\n\t */\n\tparse( json ) {\n\n\t\tconst interleavedBufferMap = {};\n\t\tconst arrayBufferMap = {};\n\n\t\tfunction getInterleavedBuffer( json, uuid ) {\n\n\t\t\tif ( interleavedBufferMap[ uuid ] !== undefined ) return interleavedBufferMap[ uuid ];\n\n\t\t\tconst interleavedBuffers = json.interleavedBuffers;\n\t\t\tconst interleavedBuffer = interleavedBuffers[ uuid ];\n\n\t\t\tconst buffer = getArrayBuffer( json, interleavedBuffer.buffer );\n\n\t\t\tconst array = getTypedArray( interleavedBuffer.type, buffer );\n\t\t\tconst ib = new InterleavedBuffer( array, interleavedBuffer.stride );\n\t\t\tib.uuid = interleavedBuffer.uuid;\n\n\t\t\tinterleavedBufferMap[ uuid ] = ib;\n\n\t\t\treturn ib;\n\n\t\t}\n\n\t\tfunction getArrayBuffer( json, uuid ) {\n\n\t\t\tif ( arrayBufferMap[ uuid ] !== undefined ) return arrayBufferMap[ uuid ];\n\n\t\t\tconst arrayBuffers = json.arrayBuffers;\n\t\t\tconst arrayBuffer = arrayBuffers[ uuid ];\n\n\t\t\tconst ab = new Uint32Array( arrayBuffer ).buffer;\n\n\t\t\tarrayBufferMap[ uuid ] = ab;\n\n\t\t\treturn ab;\n\n\t\t}\n\n\t\tconst geometry = json.isInstancedBufferGeometry ? new InstancedBufferGeometry() : new BufferGeometry();\n\n\t\tconst index = json.data.index;\n\n\t\tif ( index !== undefined ) {\n\n\t\t\tconst typedArray = getTypedArray( index.type, index.array );\n\t\t\tgeometry.setIndex( new BufferAttribute( typedArray, 1 ) );\n\n\t\t}\n\n\t\tconst attributes = json.data.attributes;\n\n\t\tfor ( const key in attributes ) {\n\n\t\t\tconst attribute = attributes[ key ];\n\t\t\tlet bufferAttribute;\n\n\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\tconst interleavedBuffer = getInterleavedBuffer( json.data, attribute.data );\n\t\t\t\tbufferAttribute = new InterleavedBufferAttribute( interleavedBuffer, attribute.itemSize, attribute.offset, attribute.normalized );\n\n\t\t\t} else {\n\n\t\t\t\tconst typedArray = getTypedArray( attribute.type, attribute.array );\n\t\t\t\tconst bufferAttributeConstr = attribute.isInstancedBufferAttribute ? InstancedBufferAttribute : BufferAttribute;\n\t\t\t\tbufferAttribute = new bufferAttributeConstr( typedArray, attribute.itemSize, attribute.normalized );\n\n\t\t\t}\n\n\t\t\tif ( attribute.name !== undefined ) bufferAttribute.name = attribute.name;\n\t\t\tif ( attribute.usage !== undefined ) bufferAttribute.setUsage( attribute.usage );\n\n\t\t\tgeometry.setAttribute( key, bufferAttribute );\n\n\t\t}\n\n\t\tconst morphAttributes = json.data.morphAttributes;\n\n\t\tif ( morphAttributes ) {\n\n\t\t\tfor ( const key in morphAttributes ) {\n\n\t\t\t\tconst attributeArray = morphAttributes[ key ];\n\n\t\t\t\tconst array = [];\n\n\t\t\t\tfor ( let i = 0, il = attributeArray.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst attribute = attributeArray[ i ];\n\t\t\t\t\tlet bufferAttribute;\n\n\t\t\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\t\t\tconst interleavedBuffer = getInterleavedBuffer( json.data, attribute.data );\n\t\t\t\t\t\tbufferAttribute = new InterleavedBufferAttribute( interleavedBuffer, attribute.itemSize, attribute.offset, attribute.normalized );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconst typedArray = getTypedArray( attribute.type, attribute.array );\n\t\t\t\t\t\tbufferAttribute = new BufferAttribute( typedArray, attribute.itemSize, attribute.normalized );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( attribute.name !== undefined ) bufferAttribute.name = attribute.name;\n\t\t\t\t\tarray.push( bufferAttribute );\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.morphAttributes[ key ] = array;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst morphTargetsRelative = json.data.morphTargetsRelative;\n\n\t\tif ( morphTargetsRelative ) {\n\n\t\t\tgeometry.morphTargetsRelative = true;\n\n\t\t}\n\n\t\tconst groups = json.data.groups || json.data.drawcalls || json.data.offsets;\n\n\t\tif ( groups !== undefined ) {\n\n\t\t\tfor ( let i = 0, n = groups.length; i !== n; ++ i ) {\n\n\t\t\t\tconst group = groups[ i ];\n\n\t\t\t\tgeometry.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst boundingSphere = json.data.boundingSphere;\n\n\t\tif ( boundingSphere !== undefined ) {\n\n\t\t\tgeometry.boundingSphere = new Sphere().fromJSON( boundingSphere );\n\n\t\t}\n\n\t\tif ( json.name ) geometry.name = json.name;\n\t\tif ( json.userData ) geometry.userData = json.userData;\n\n\t\treturn geometry;\n\n\t}\n\n}\n\n/**\n * A loader for loading a JSON resource in the [JSON Object/Scene format](https://github.com/mrdoob/three.js/wiki/JSON-Object-Scene-format-4).\n * The files are internally loaded via {@link FileLoader}.\n *\n * ```js\n * const loader = new THREE.ObjectLoader();\n * const obj = await loader.loadAsync( 'models/json/example.json' );\n * scene.add( obj );\n *\n * // Alternatively, to parse a previously loaded JSON structure\n * const object = await loader.parseAsync( a_json_object );\n * scene.add( object );\n * ```\n *\n * @augments Loader\n */\nclass ObjectLoader extends Loader {\n\n\t/**\n\t * Constructs a new object loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and pass the loaded 3D object to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(Object3D)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst path = ( this.path === '' ) ? LoaderUtils.extractUrlBase( url ) : this.path;\n\t\tthis.resourcePath = this.resourcePath || path;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\tlet json = null;\n\n\t\t\ttry {\n\n\t\t\t\tjson = JSON.parse( text );\n\n\t\t\t} catch ( error ) {\n\n\t\t\t\tif ( onError !== undefined ) onError( error );\n\n\t\t\t\terror( 'ObjectLoader: Can\\'t parse ' + url + '.', error.message );\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tconst metadata = json.metadata;\n\n\t\t\tif ( metadata === undefined || metadata.type === undefined || metadata.type.toLowerCase() === 'geometry' ) {\n\n\t\t\t\tif ( onError !== undefined ) onError( new Error( 'THREE.ObjectLoader: Can\\'t load ' + url ) );\n\n\t\t\t\terror( 'ObjectLoader: Can\\'t load ' + url );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tscope.parse( json, onLoad );\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\t/**\n\t * Async version of {@link ObjectLoader#load}.\n\t *\n\t * @async\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @return {Promise<Object3D>} A Promise that resolves with the loaded 3D object.\n\t */\n\tasync loadAsync( url, onProgress ) {\n\n\t\tconst scope = this;\n\n\t\tconst path = ( this.path === '' ) ? LoaderUtils.extractUrlBase( url ) : this.path;\n\t\tthis.resourcePath = this.resourcePath || path;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\n\t\tconst text = await loader.loadAsync( url, onProgress );\n\n\t\tconst json = JSON.parse( text );\n\n\t\tconst metadata = json.metadata;\n\n\t\tif ( metadata === undefined || metadata.type === undefined || metadata.type.toLowerCase() === 'geometry' ) {\n\n\t\t\tthrow new Error( 'THREE.ObjectLoader: Can\\'t load ' + url );\n\n\t\t}\n\n\t\treturn await scope.parseAsync( json );\n\n\t}\n\n\t/**\n\t * Parses the given JSON. This is used internally by {@link ObjectLoader#load}\n\t * but can also be used directly to parse a previously loaded JSON structure.\n\t *\n\t * @param {Object} json - The serialized 3D object.\n\t * @param {onLoad} onLoad - Executed when all resources (e.g. textures) have been fully loaded.\n\t * @return {Object3D} The parsed 3D object.\n\t */\n\tparse( json, onLoad ) {\n\n\t\tconst animations = this.parseAnimations( json.animations );\n\t\tconst shapes = this.parseShapes( json.shapes );\n\t\tconst geometries = this.parseGeometries( json.geometries, shapes );\n\n\t\tconst images = this.parseImages( json.images, function () {\n\n\t\t\tif ( onLoad !== undefined ) onLoad( object );\n\n\t\t} );\n\n\t\tconst textures = this.parseTextures( json.textures, images );\n\t\tconst materials = this.parseMaterials( json.materials, textures );\n\n\t\tconst object = this.parseObject( json.object, geometries, materials, textures, animations );\n\t\tconst skeletons = this.parseSkeletons( json.skeletons, object );\n\n\t\tthis.bindSkeletons( object, skeletons );\n\t\tthis.bindLightTargets( object );\n\n\t\t//\n\n\t\tif ( onLoad !== undefined ) {\n\n\t\t\tlet hasImages = false;\n\n\t\t\tfor ( const uuid in images ) {\n\n\t\t\t\tif ( images[ uuid ].data instanceof HTMLImageElement ) {\n\n\t\t\t\t\thasImages = true;\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( hasImages === false ) onLoad( object );\n\n\t\t}\n\n\t\treturn object;\n\n\t}\n\n\t/**\n\t * Async version of {@link ObjectLoader#parse}.\n\t *\n\t * @param {Object} json - The serialized 3D object.\n\t * @return {Promise<Object3D>} A Promise that resolves with the parsed 3D object.\n\t */\n\tasync parseAsync( json ) {\n\n\t\tconst animations = this.parseAnimations( json.animations );\n\t\tconst shapes = this.parseShapes( json.shapes );\n\t\tconst geometries = this.parseGeometries( json.geometries, shapes );\n\n\t\tconst images = await this.parseImagesAsync( json.images );\n\n\t\tconst textures = this.parseTextures( json.textures, images );\n\t\tconst materials = this.parseMaterials( json.materials, textures );\n\n\t\tconst object = this.parseObject( json.object, geometries, materials, textures, animations );\n\t\tconst skeletons = this.parseSkeletons( json.skeletons, object );\n\n\t\tthis.bindSkeletons( object, skeletons );\n\t\tthis.bindLightTargets( object );\n\n\t\treturn object;\n\n\t}\n\n\t// internals\n\n\tparseShapes( json ) {\n\n\t\tconst shapes = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tconst shape = new Shape().fromJSON( json[ i ] );\n\n\t\t\t\tshapes[ shape.uuid ] = shape;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn shapes;\n\n\t}\n\n\tparseSkeletons( json, object ) {\n\n\t\tconst skeletons = {};\n\t\tconst bones = {};\n\n\t\t// generate bone lookup table\n\n\t\tobject.traverse( function ( child ) {\n\n\t\t\tif ( child.isBone ) bones[ child.uuid ] = child;\n\n\t\t} );\n\n\t\t// create skeletons\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tconst skeleton = new Skeleton().fromJSON( json[ i ], bones );\n\n\t\t\t\tskeletons[ skeleton.uuid ] = skeleton;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn skeletons;\n\n\t}\n\n\tparseGeometries( json, shapes ) {\n\n\t\tconst geometries = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tconst bufferGeometryLoader = new BufferGeometryLoader();\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tlet geometry;\n\t\t\t\tconst data = json[ i ];\n\n\t\t\t\tswitch ( data.type ) {\n\n\t\t\t\t\tcase 'BufferGeometry':\n\t\t\t\t\tcase 'InstancedBufferGeometry':\n\n\t\t\t\t\t\tgeometry = bufferGeometryLoader.parse( data );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tif ( data.type in Geometries ) {\n\n\t\t\t\t\t\t\tgeometry = Geometries[ data.type ].fromJSON( data, shapes );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\twarn( `ObjectLoader: Unsupported geometry type \"${ data.type }\"` );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.uuid = data.uuid;\n\n\t\t\t\tif ( data.name !== undefined ) geometry.name = data.name;\n\t\t\t\tif ( data.userData !== undefined ) geometry.userData = data.userData;\n\n\t\t\t\tgeometries[ data.uuid ] = geometry;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn geometries;\n\n\t}\n\n\tparseMaterials( json, textures ) {\n\n\t\tconst cache = {}; // MultiMaterial\n\t\tconst materials = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tconst loader = new MaterialLoader();\n\t\t\tloader.setTextures( textures );\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tconst data = json[ i ];\n\n\t\t\t\tif ( cache[ data.uuid ] === undefined ) {\n\n\t\t\t\t\tcache[ data.uuid ] = loader.parse( data );\n\n\t\t\t\t}\n\n\t\t\t\tmaterials[ data.uuid ] = cache[ data.uuid ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn materials;\n\n\t}\n\n\tparseAnimations( json ) {\n\n\t\tconst animations = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tfor ( let i = 0; i < json.length; i ++ ) {\n\n\t\t\t\tconst data = json[ i ];\n\n\t\t\t\tconst clip = AnimationClip.parse( data );\n\n\t\t\t\tanimations[ clip.uuid ] = clip;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn animations;\n\n\t}\n\n\tparseImages( json, onLoad ) {\n\n\t\tconst scope = this;\n\t\tconst images = {};\n\n\t\tlet loader;\n\n\t\tfunction loadImage( url ) {\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\treturn loader.load( url, function () {\n\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t}, undefined, function () {\n\n\t\t\t\tscope.manager.itemError( url );\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t} );\n\n\t\t}\n\n\t\tfunction deserializeImage( image ) {\n\n\t\t\tif ( typeof image === 'string' ) {\n\n\t\t\t\tconst url = image;\n\n\t\t\t\tconst path = /^(\\/\\/)|([a-z]+:(\\/\\/)?)/i.test( url ) ? url : scope.resourcePath + url;\n\n\t\t\t\treturn loadImage( path );\n\n\t\t\t} else {\n\n\t\t\t\tif ( image.data ) {\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tdata: getTypedArray( image.type, image.data ),\n\t\t\t\t\t\twidth: image.width,\n\t\t\t\t\t\theight: image.height\n\t\t\t\t\t};\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( json !== undefined && json.length > 0 ) {\n\n\t\t\tconst manager = new LoadingManager( onLoad );\n\n\t\t\tloader = new ImageLoader( manager );\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\n\t\t\tfor ( let i = 0, il = json.length; i < il; i ++ ) {\n\n\t\t\t\tconst image = json[ i ];\n\t\t\t\tconst url = image.url;\n\n\t\t\t\tif ( Array.isArray( url ) ) {\n\n\t\t\t\t\t// load array of images e.g CubeTexture\n\n\t\t\t\t\tconst imageArray = [];\n\n\t\t\t\t\tfor ( let j = 0, jl = url.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tconst currentUrl = url[ j ];\n\n\t\t\t\t\t\tconst deserializedImage = deserializeImage( currentUrl );\n\n\t\t\t\t\t\tif ( deserializedImage !== null ) {\n\n\t\t\t\t\t\t\tif ( deserializedImage instanceof HTMLImageElement ) {\n\n\t\t\t\t\t\t\t\timageArray.push( deserializedImage );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// special case: handle array of data textures for cube textures\n\n\t\t\t\t\t\t\t\timageArray.push( new DataTexture( deserializedImage.data, deserializedImage.width, deserializedImage.height ) );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\timages[ image.uuid ] = new Source( imageArray );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// load single image\n\n\t\t\t\t\tconst deserializedImage = deserializeImage( image.url );\n\t\t\t\t\timages[ image.uuid ] = new Source( deserializedImage );\n\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn images;\n\n\t}\n\n\tasync parseImagesAsync( json ) {\n\n\t\tconst scope = this;\n\t\tconst images = {};\n\n\t\tlet loader;\n\n\t\tasync function deserializeImage( image ) {\n\n\t\t\tif ( typeof image === 'string' ) {\n\n\t\t\t\tconst url = image;\n\n\t\t\t\tconst path = /^(\\/\\/)|([a-z]+:(\\/\\/)?)/i.test( url ) ? url : scope.resourcePath + url;\n\n\t\t\t\treturn await loader.loadAsync( path );\n\n\t\t\t} else {\n\n\t\t\t\tif ( image.data ) {\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tdata: getTypedArray( image.type, image.data ),\n\t\t\t\t\t\twidth: image.width,\n\t\t\t\t\t\theight: image.height\n\t\t\t\t\t};\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( json !== undefined && json.length > 0 ) {\n\n\t\t\tloader = new ImageLoader( this.manager );\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\n\t\t\tfor ( let i = 0, il = json.length; i < il; i ++ ) {\n\n\t\t\t\tconst image = json[ i ];\n\t\t\t\tconst url = image.url;\n\n\t\t\t\tif ( Array.isArray( url ) ) {\n\n\t\t\t\t\t// load array of images e.g CubeTexture\n\n\t\t\t\t\tconst imageArray = [];\n\n\t\t\t\t\tfor ( let j = 0, jl = url.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tconst currentUrl = url[ j ];\n\n\t\t\t\t\t\tconst deserializedImage = await deserializeImage( currentUrl );\n\n\t\t\t\t\t\tif ( deserializedImage !== null ) {\n\n\t\t\t\t\t\t\tif ( deserializedImage instanceof HTMLImageElement ) {\n\n\t\t\t\t\t\t\t\timageArray.push( deserializedImage );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// special case: handle array of data textures for cube textures\n\n\t\t\t\t\t\t\t\timageArray.push( new DataTexture( deserializedImage.data, deserializedImage.width, deserializedImage.height ) );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\timages[ image.uuid ] = new Source( imageArray );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// load single image\n\n\t\t\t\t\tconst deserializedImage = await deserializeImage( image.url );\n\t\t\t\t\timages[ image.uuid ] = new Source( deserializedImage );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn images;\n\n\t}\n\n\tparseTextures( json, images ) {\n\n\t\tfunction parseConstant( value, type ) {\n\n\t\t\tif ( typeof value === 'number' ) return value;\n\n\t\t\twarn( 'ObjectLoader.parseTexture: Constant should be in numeric form.', value );\n\n\t\t\treturn type[ value ];\n\n\t\t}\n\n\t\tconst textures = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tconst data = json[ i ];\n\n\t\t\t\tif ( data.image === undefined ) {\n\n\t\t\t\t\twarn( 'ObjectLoader: No \"image\" specified for', data.uuid );\n\n\t\t\t\t}\n\n\t\t\t\tif ( images[ data.image ] === undefined ) {\n\n\t\t\t\t\twarn( 'ObjectLoader: Undefined image', data.image );\n\n\t\t\t\t}\n\n\t\t\t\tconst source = images[ data.image ];\n\t\t\t\tconst image = source.data;\n\n\t\t\t\tlet texture;\n\n\t\t\t\tif ( Array.isArray( image ) ) {\n\n\t\t\t\t\ttexture = new CubeTexture();\n\n\t\t\t\t\tif ( image.length === 6 ) texture.needsUpdate = true;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( image && image.data ) {\n\n\t\t\t\t\t\ttexture = new DataTexture();\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttexture = new Texture();\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( image ) texture.needsUpdate = true; // textures can have undefined image data\n\n\t\t\t\t}\n\n\t\t\t\ttexture.source = source;\n\n\t\t\t\ttexture.uuid = data.uuid;\n\n\t\t\t\tif ( data.name !== undefined ) texture.name = data.name;\n\n\t\t\t\tif ( data.mapping !== undefined ) texture.mapping = parseConstant( data.mapping, TEXTURE_MAPPING );\n\t\t\t\tif ( data.channel !== undefined ) texture.channel = data.channel;\n\n\t\t\t\tif ( data.offset !== undefined ) texture.offset.fromArray( data.offset );\n\t\t\t\tif ( data.repeat !== undefined ) texture.repeat.fromArray( data.repeat );\n\t\t\t\tif ( data.center !== undefined ) texture.center.fromArray( data.center );\n\t\t\t\tif ( data.rotation !== undefined ) texture.rotation = data.rotation;\n\n\t\t\t\tif ( data.wrap !== undefined ) {\n\n\t\t\t\t\ttexture.wrapS = parseConstant( data.wrap[ 0 ], TEXTURE_WRAPPING );\n\t\t\t\t\ttexture.wrapT = parseConstant( data.wrap[ 1 ], TEXTURE_WRAPPING );\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.format !== undefined ) texture.format = data.format;\n\t\t\t\tif ( data.internalFormat !== undefined ) texture.internalFormat = data.internalFormat;\n\t\t\t\tif ( data.type !== undefined ) texture.type = data.type;\n\t\t\t\tif ( data.colorSpace !== undefined ) texture.colorSpace = data.colorSpace;\n\n\t\t\t\tif ( data.minFilter !== undefined ) texture.minFilter = parseConstant( data.minFilter, TEXTURE_FILTER );\n\t\t\t\tif ( data.magFilter !== undefined ) texture.magFilter = parseConstant( data.magFilter, TEXTURE_FILTER );\n\t\t\t\tif ( data.anisotropy !== undefined ) texture.anisotropy = data.anisotropy;\n\n\t\t\t\tif ( data.flipY !== undefined ) texture.flipY = data.flipY;\n\n\t\t\t\tif ( data.generateMipmaps !== undefined ) texture.generateMipmaps = data.generateMipmaps;\n\t\t\t\tif ( data.premultiplyAlpha !== undefined ) texture.premultiplyAlpha = data.premultiplyAlpha;\n\t\t\t\tif ( data.unpackAlignment !== undefined ) texture.unpackAlignment = data.unpackAlignment;\n\t\t\t\tif ( data.compareFunction !== undefined ) texture.compareFunction = data.compareFunction;\n\n\t\t\t\tif ( data.userData !== undefined ) texture.userData = data.userData;\n\n\t\t\t\ttextures[ data.uuid ] = texture;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn textures;\n\n\t}\n\n\tparseObject( data, geometries, materials, textures, animations ) {\n\n\t\tlet object;\n\n\t\tfunction getGeometry( name ) {\n\n\t\t\tif ( geometries[ name ] === undefined ) {\n\n\t\t\t\twarn( 'ObjectLoader: Undefined geometry', name );\n\n\t\t\t}\n\n\t\t\treturn geometries[ name ];\n\n\t\t}\n\n\t\tfunction getMaterial( name ) {\n\n\t\t\tif ( name === undefined ) return undefined;\n\n\t\t\tif ( Array.isArray( name ) ) {\n\n\t\t\t\tconst array = [];\n\n\t\t\t\tfor ( let i = 0, l = name.length; i < l; i ++ ) {\n\n\t\t\t\t\tconst uuid = name[ i ];\n\n\t\t\t\t\tif ( materials[ uuid ] === undefined ) {\n\n\t\t\t\t\t\twarn( 'ObjectLoader: Undefined material', uuid );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tarray.push( materials[ uuid ] );\n\n\t\t\t\t}\n\n\t\t\t\treturn array;\n\n\t\t\t}\n\n\t\t\tif ( materials[ name ] === undefined ) {\n\n\t\t\t\twarn( 'ObjectLoader: Undefined material', name );\n\n\t\t\t}\n\n\t\t\treturn materials[ name ];\n\n\t\t}\n\n\t\tfunction getTexture( uuid ) {\n\n\t\t\tif ( textures[ uuid ] === undefined ) {\n\n\t\t\t\twarn( 'ObjectLoader: Undefined texture', uuid );\n\n\t\t\t}\n\n\t\t\treturn textures[ uuid ];\n\n\t\t}\n\n\t\tlet geometry, material;\n\n\t\tswitch ( data.type ) {\n\n\t\t\tcase 'Scene':\n\n\t\t\t\tobject = new Scene();\n\n\t\t\t\tif ( data.background !== undefined ) {\n\n\t\t\t\t\tif ( Number.isInteger( data.background ) ) {\n\n\t\t\t\t\t\tobject.background = new Color( data.background );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tobject.background = getTexture( data.background );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.environment !== undefined ) {\n\n\t\t\t\t\tobject.environment = getTexture( data.environment );\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.fog !== undefined ) {\n\n\t\t\t\t\tif ( data.fog.type === 'Fog' ) {\n\n\t\t\t\t\t\tobject.fog = new Fog( data.fog.color, data.fog.near, data.fog.far );\n\n\t\t\t\t\t} else if ( data.fog.type === 'FogExp2' ) {\n\n\t\t\t\t\t\tobject.fog = new FogExp2( data.fog.color, data.fog.density );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( data.fog.name !== '' ) {\n\n\t\t\t\t\t\tobject.fog.name = data.fog.name;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.backgroundBlurriness !== undefined ) object.backgroundBlurriness = data.backgroundBlurriness;\n\t\t\t\tif ( data.backgroundIntensity !== undefined ) object.backgroundIntensity = data.backgroundIntensity;\n\t\t\t\tif ( data.backgroundRotation !== undefined ) object.backgroundRotation.fromArray( data.backgroundRotation );\n\n\t\t\t\tif ( data.environmentIntensity !== undefined ) object.environmentIntensity = data.environmentIntensity;\n\t\t\t\tif ( data.environmentRotation !== undefined ) object.environmentRotation.fromArray( data.environmentRotation );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'PerspectiveCamera':\n\n\t\t\t\tobject = new PerspectiveCamera( data.fov, data.aspect, data.near, data.far );\n\n\t\t\t\tif ( data.focus !== undefined ) object.focus = data.focus;\n\t\t\t\tif ( data.zoom !== undefined ) object.zoom = data.zoom;\n\t\t\t\tif ( data.filmGauge !== undefined ) object.filmGauge = data.filmGauge;\n\t\t\t\tif ( data.filmOffset !== undefined ) object.filmOffset = data.filmOffset;\n\t\t\t\tif ( data.view !== undefined ) object.view = Object.assign( {}, data.view );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'OrthographicCamera':\n\n\t\t\t\tobject = new OrthographicCamera( data.left, data.right, data.top, data.bottom, data.near, data.far );\n\n\t\t\t\tif ( data.zoom !== undefined ) object.zoom = data.zoom;\n\t\t\t\tif ( data.view !== undefined ) object.view = Object.assign( {}, data.view );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'AmbientLight':\n\n\t\t\t\tobject = new AmbientLight( data.color, data.intensity );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'DirectionalLight':\n\n\t\t\t\tobject = new DirectionalLight( data.color, data.intensity );\n\t\t\t\tobject.target = data.target || '';\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'PointLight':\n\n\t\t\t\tobject = new PointLight( data.color, data.intensity, data.distance, data.decay );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'RectAreaLight':\n\n\t\t\t\tobject = new RectAreaLight( data.color, data.intensity, data.width, data.height );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'SpotLight':\n\n\t\t\t\tobject = new SpotLight( data.color, data.intensity, data.distance, data.angle, data.penumbra, data.decay );\n\t\t\t\tobject.target = data.target || '';\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'HemisphereLight':\n\n\t\t\t\tobject = new HemisphereLight( data.color, data.groundColor, data.intensity );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'LightProbe':\n\n\t\t\t\tobject = new LightProbe().fromJSON( data );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'SkinnedMesh':\n\n\t\t\t\tgeometry = getGeometry( data.geometry );\n\t\t\t \tmaterial = getMaterial( data.material );\n\n\t\t\t\tobject = new SkinnedMesh( geometry, material );\n\n\t\t\t\tif ( data.bindMode !== undefined ) object.bindMode = data.bindMode;\n\t\t\t\tif ( data.bindMatrix !== undefined ) object.bindMatrix.fromArray( data.bindMatrix );\n\t\t\t\tif ( data.skeleton !== undefined ) object.skeleton = data.skeleton;\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Mesh':\n\n\t\t\t\tgeometry = getGeometry( data.geometry );\n\t\t\t\tmaterial = getMaterial( data.material );\n\n\t\t\t\tobject = new Mesh( geometry, material );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'InstancedMesh':\n\n\t\t\t\tgeometry = getGeometry( data.geometry );\n\t\t\t\tmaterial = getMaterial( data.material );\n\t\t\t\tconst count = data.count;\n\t\t\t\tconst instanceMatrix = data.instanceMatrix;\n\t\t\t\tconst instanceColor = data.instanceColor;\n\n\t\t\t\tobject = new InstancedMesh( geometry, material, count );\n\t\t\t\tobject.instanceMatrix = new InstancedBufferAttribute( new Float32Array( instanceMatrix.array ), 16 );\n\t\t\t\tif ( instanceColor !== undefined ) object.instanceColor = new InstancedBufferAttribute( new Float32Array( instanceColor.array ), instanceColor.itemSize );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'BatchedMesh':\n\n\t\t\t\tgeometry = getGeometry( data.geometry );\n\t\t\t\tmaterial = getMaterial( data.material );\n\n\t\t\t\tobject = new BatchedMesh( data.maxInstanceCount, data.maxVertexCount, data.maxIndexCount, material );\n\t\t\t\tobject.geometry = geometry;\n\t\t\t\tobject.perObjectFrustumCulled = data.perObjectFrustumCulled;\n\t\t\t\tobject.sortObjects = data.sortObjects;\n\n\t\t\t\tobject._drawRanges = data.drawRanges;\n\t\t\t\tobject._reservedRanges = data.reservedRanges;\n\n\t\t\t\tobject._geometryInfo = data.geometryInfo.map( info => {\n\n\t\t\t\t\tlet box = null;\n\t\t\t\t\tlet sphere = null;\n\t\t\t\t\tif ( info.boundingBox !== undefined ) {\n\n\t\t\t\t\t\tbox = new Box3().fromJSON( info.boundingBox );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( info.boundingSphere !== undefined ) {\n\n\t\t\t\t\t\tsphere = new Sphere().fromJSON( info.boundingSphere );\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...info,\n\t\t\t\t\t\tboundingBox: box,\n\t\t\t\t\t\tboundingSphere: sphere\n\t\t\t\t\t};\n\n\t\t\t\t} );\n\t\t\t\tobject._instanceInfo = data.instanceInfo;\n\n\t\t\t\tobject._availableInstanceIds = data._availableInstanceIds;\n\t\t\t\tobject._availableGeometryIds = data._availableGeometryIds;\n\n\t\t\t\tobject._nextIndexStart = data.nextIndexStart;\n\t\t\t\tobject._nextVertexStart = data.nextVertexStart;\n\t\t\t\tobject._geometryCount = data.geometryCount;\n\n\t\t\t\tobject._maxInstanceCount = data.maxInstanceCount;\n\t\t\t\tobject._maxVertexCount = data.maxVertexCount;\n\t\t\t\tobject._maxIndexCount = data.maxIndexCount;\n\n\t\t\t\tobject._geometryInitialized = data.geometryInitialized;\n\n\t\t\t\tobject._matricesTexture = getTexture( data.matricesTexture.uuid );\n\n\t\t\t\tobject._indirectTexture = getTexture( data.indirectTexture.uuid );\n\n\t\t\t\tif ( data.colorsTexture !== undefined ) {\n\n\t\t\t\t\tobject._colorsTexture = getTexture( data.colorsTexture.uuid );\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.boundingSphere !== undefined ) {\n\n\t\t\t\t\tobject.boundingSphere = new Sphere().fromJSON( data.boundingSphere );\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.boundingBox !== undefined ) {\n\n\t\t\t\t\tobject.boundingBox = new Box3().fromJSON( data.boundingBox );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'LOD':\n\n\t\t\t\tobject = new LOD();\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Line':\n\n\t\t\t\tobject = new Line( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'LineLoop':\n\n\t\t\t\tobject = new LineLoop( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'LineSegments':\n\n\t\t\t\tobject = new LineSegments( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'PointCloud':\n\t\t\tcase 'Points':\n\n\t\t\t\tobject = new Points( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Sprite':\n\n\t\t\t\tobject = new Sprite( getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Group':\n\n\t\t\t\tobject = new Group();\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Bone':\n\n\t\t\t\tobject = new Bone();\n\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tobject = new Object3D();\n\n\t\t}\n\n\t\tobject.uuid = data.uuid;\n\n\t\tif ( data.name !== undefined ) object.name = data.name;\n\n\t\tif ( data.matrix !== undefined ) {\n\n\t\t\tobject.matrix.fromArray( data.matrix );\n\n\t\t\tif ( data.matrixAutoUpdate !== undefined ) object.matrixAutoUpdate = data.matrixAutoUpdate;\n\t\t\tif ( object.matrixAutoUpdate ) object.matrix.decompose( object.position, object.quaternion, object.scale );\n\n\t\t} else {\n\n\t\t\tif ( data.position !== undefined ) object.position.fromArray( data.position );\n\t\t\tif ( data.rotation !== undefined ) object.rotation.fromArray( data.rotation );\n\t\t\tif ( data.quaternion !== undefined ) object.quaternion.fromArray( data.quaternion );\n\t\t\tif ( data.scale !== undefined ) object.scale.fromArray( data.scale );\n\n\t\t}\n\n\t\tif ( data.up !== undefined ) object.up.fromArray( data.up );\n\n\t\tif ( data.castShadow !== undefined ) object.castShadow = data.castShadow;\n\t\tif ( data.receiveShadow !== undefined ) object.receiveShadow = data.receiveShadow;\n\n\t\tif ( data.shadow ) {\n\n\t\t\tif ( data.shadow.intensity !== undefined ) object.shadow.intensity = data.shadow.intensity;\n\t\t\tif ( data.shadow.bias !== undefined ) object.shadow.bias = data.shadow.bias;\n\t\t\tif ( data.shadow.normalBias !== undefined ) object.shadow.normalBias = data.shadow.normalBias;\n\t\t\tif ( data.shadow.radius !== undefined ) object.shadow.radius = data.shadow.radius;\n\t\t\tif ( data.shadow.mapSize !== undefined ) object.shadow.mapSize.fromArray( data.shadow.mapSize );\n\t\t\tif ( data.shadow.camera !== undefined ) object.shadow.camera = this.parseObject( data.shadow.camera );\n\n\t\t}\n\n\t\tif ( data.visible !== undefined ) object.visible = data.visible;\n\t\tif ( data.frustumCulled !== undefined ) object.frustumCulled = data.frustumCulled;\n\t\tif ( data.renderOrder !== undefined ) object.renderOrder = data.renderOrder;\n\t\tif ( data.userData !== undefined ) object.userData = data.userData;\n\t\tif ( data.layers !== undefined ) object.layers.mask = data.layers;\n\n\t\tif ( data.children !== undefined ) {\n\n\t\t\tconst children = data.children;\n\n\t\t\tfor ( let i = 0; i < children.length; i ++ ) {\n\n\t\t\t\tobject.add( this.parseObject( children[ i ], geometries, materials, textures, animations ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( data.animations !== undefined ) {\n\n\t\t\tconst objectAnimations = data.animations;\n\n\t\t\tfor ( let i = 0; i < objectAnimations.length; i ++ ) {\n\n\t\t\t\tconst uuid = objectAnimations[ i ];\n\n\t\t\t\tobject.animations.push( animations[ uuid ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( data.type === 'LOD' ) {\n\n\t\t\tif ( data.autoUpdate !== undefined ) object.autoUpdate = data.autoUpdate;\n\n\t\t\tconst levels = data.levels;\n\n\t\t\tfor ( let l = 0; l < levels.length; l ++ ) {\n\n\t\t\t\tconst level = levels[ l ];\n\t\t\t\tconst child = object.getObjectByProperty( 'uuid', level.object );\n\n\t\t\t\tif ( child !== undefined ) {\n\n\t\t\t\t\tobject.addLevel( child, level.distance, level.hysteresis );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn object;\n\n\t}\n\n\tbindSkeletons( object, skeletons ) {\n\n\t\tif ( Object.keys( skeletons ).length === 0 ) return;\n\n\t\tobject.traverse( function ( child ) {\n\n\t\t\tif ( child.isSkinnedMesh === true && child.skeleton !== undefined ) {\n\n\t\t\t\tconst skeleton = skeletons[ child.skeleton ];\n\n\t\t\t\tif ( skeleton === undefined ) {\n\n\t\t\t\t\twarn( 'ObjectLoader: No skeleton found with UUID:', child.skeleton );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tchild.bind( skeleton, child.bindMatrix );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n\tbindLightTargets( object ) {\n\n\t\tobject.traverse( function ( child ) {\n\n\t\t\tif ( child.isDirectionalLight || child.isSpotLight ) {\n\n\t\t\t\tconst uuid = child.target;\n\n\t\t\t\tconst target = object.getObjectByProperty( 'uuid', uuid );\n\n\t\t\t\tif ( target !== undefined ) {\n\n\t\t\t\t\tchild.target = target;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tchild.target = new Object3D();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n}\n\nconst TEXTURE_MAPPING = {\n\tUVMapping: UVMapping,\n\tCubeReflectionMapping: CubeReflectionMapping,\n\tCubeRefractionMapping: CubeRefractionMapping,\n\tEquirectangularReflectionMapping: EquirectangularReflectionMapping,\n\tEquirectangularRefractionMapping: EquirectangularRefractionMapping,\n\tCubeUVReflectionMapping: CubeUVReflectionMapping\n};\n\nconst TEXTURE_WRAPPING = {\n\tRepeatWrapping: RepeatWrapping,\n\tClampToEdgeWrapping: ClampToEdgeWrapping,\n\tMirroredRepeatWrapping: MirroredRepeatWrapping\n};\n\nconst TEXTURE_FILTER = {\n\tNearestFilter: NearestFilter,\n\tNearestMipmapNearestFilter: NearestMipmapNearestFilter,\n\tNearestMipmapLinearFilter: NearestMipmapLinearFilter,\n\tLinearFilter: LinearFilter,\n\tLinearMipmapNearestFilter: LinearMipmapNearestFilter,\n\tLinearMipmapLinearFilter: LinearMipmapLinearFilter\n};\n\nconst _errorMap = new WeakMap();\n\n/**\n * A loader for loading images as an [ImageBitmap](https://developer.mozilla.org/en-US/docs/Web/API/ImageBitmap).\n * An `ImageBitmap` provides an asynchronous and resource efficient pathway to prepare\n * textures for rendering.\n *\n * Note that {@link Texture#flipY} and {@link Texture#premultiplyAlpha} are ignored with image bitmaps.\n * They needs these configuration on bitmap creation unlike regular images need them on uploading to GPU.\n *\n * You need to set the equivalent options via {@link ImageBitmapLoader#setOptions} instead.\n *\n * Also note that unlike {@link FileLoader}, this loader avoids multiple concurrent requests to the same URL only if `Cache` is enabled.\n *\n * ```js\n * const loader = new THREE.ImageBitmapLoader();\n * loader.setOptions( { imageOrientation: 'flipY' } ); // set options if needed\n * const imageBitmap = await loader.loadAsync( 'image.png' );\n *\n * const texture = new THREE.Texture( imageBitmap );\n * texture.needsUpdate = true;\n * ```\n *\n * @augments Loader\n */\nclass ImageBitmapLoader extends Loader {\n\n\t/**\n\t * Constructs a new image bitmap loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isImageBitmapLoader = true;\n\n\t\tif ( typeof createImageBitmap === 'undefined' ) {\n\n\t\t\twarn( 'ImageBitmapLoader: createImageBitmap() not supported.' );\n\n\t\t}\n\n\t\tif ( typeof fetch === 'undefined' ) {\n\n\t\t\twarn( 'ImageBitmapLoader: fetch() not supported.' );\n\n\t\t}\n\n\t\t/**\n\t\t * Represents the loader options.\n\t\t *\n\t\t * @type {Object}\n\t\t * @default {premultiplyAlpha:'none'}\n\t\t */\n\t\tthis.options = { premultiplyAlpha: 'none' };\n\n\t\t/**\n\t\t * Used for aborting requests.\n\t\t *\n\t\t * @private\n\t\t * @type {AbortController}\n\t\t */\n\t\tthis._abortController = new AbortController();\n\n\t}\n\n\t/**\n\t * Sets the given loader options. The structure of the object must match the `options` parameter of\n\t * [createImageBitmap](https://developer.mozilla.org/en-US/docs/Web/API/Window/createImageBitmap).\n\t *\n\t * @param {Object} options - The loader options to set.\n\t * @return {ImageBitmapLoader} A reference to this image bitmap loader.\n\t */\n\tsetOptions( options ) {\n\n\t\tthis.options = options;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and pass the loaded image bitmap to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(ImageBitmap)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Unsupported in this loader.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t * @return {ImageBitmap|undefined} The image bitmap.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tif ( url === undefined ) url = '';\n\n\t\tif ( this.path !== undefined ) url = this.path + url;\n\n\t\turl = this.manager.resolveURL( url );\n\n\t\tconst scope = this;\n\n\t\tconst cached = Cache.get( `image-bitmap:${url}` );\n\n\t\tif ( cached !== undefined ) {\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\t// If cached is a promise, wait for it to resolve\n\t\t\tif ( cached.then ) {\n\n\t\t\t\tcached.then( imageBitmap => {\n\n\t\t\t\t\t// check if there is an error for the cached promise\n\n\t\t\t\t\tif ( _errorMap.has( cached ) === true ) {\n\n\t\t\t\t\t\tif ( onError ) onError( _errorMap.get( cached ) );\n\n\t\t\t\t\t\tscope.manager.itemError( url );\n\t\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( onLoad ) onLoad( imageBitmap );\n\n\t\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t\t\treturn imageBitmap;\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\t// If cached is not a promise (i.e., it's already an imageBitmap)\n\t\t\tsetTimeout( function () {\n\n\t\t\t\tif ( onLoad ) onLoad( cached );\n\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t}, 0 );\n\n\t\t\treturn cached;\n\n\t\t}\n\n\t\tconst fetchOptions = {};\n\t\tfetchOptions.credentials = ( this.crossOrigin === 'anonymous' ) ? 'same-origin' : 'include';\n\t\tfetchOptions.headers = this.requestHeader;\n\t\tfetchOptions.signal = ( typeof AbortSignal.any === 'function' ) ? AbortSignal.any( [ this._abortController.signal, this.manager.abortController.signal ] ) : this._abortController.signal;\n\n\t\tconst promise = fetch( url, fetchOptions ).then( function ( res ) {\n\n\t\t\treturn res.blob();\n\n\t\t} ).then( function ( blob ) {\n\n\t\t\treturn createImageBitmap( blob, Object.assign( scope.options, { colorSpaceConversion: 'none' } ) );\n\n\t\t} ).then( function ( imageBitmap ) {\n\n\t\t\tCache.add( `image-bitmap:${url}`, imageBitmap );\n\n\t\t\tif ( onLoad ) onLoad( imageBitmap );\n\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t\treturn imageBitmap;\n\n\t\t} ).catch( function ( e ) {\n\n\t\t\tif ( onError ) onError( e );\n\n\t\t\t_errorMap.set( promise, e );\n\n\t\t\tCache.remove( `image-bitmap:${url}` );\n\n\t\t\tscope.manager.itemError( url );\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t} );\n\n\t\tCache.add( `image-bitmap:${url}`, promise );\n\t\tscope.manager.itemStart( url );\n\n\t}\n\n\t/**\n\t * Aborts ongoing fetch requests.\n\t *\n\t * @return {ImageBitmapLoader} A reference to this instance.\n\t */\n\tabort() {\n\n\t\tthis._abortController.abort();\n\t\tthis._abortController = new AbortController();\n\n\t\treturn this;\n\n\t}\n\n}\n\nlet _context;\n\n/**\n * Manages the global audio context in the engine.\n *\n * @hideconstructor\n */\nclass AudioContext {\n\n\t/**\n\t * Returns the global native audio context.\n\t *\n\t * @return {AudioContext} The native audio context.\n\t */\n\tstatic getContext() {\n\n\t\tif ( _context === undefined ) {\n\n\t\t\t_context = new ( window.AudioContext || window.webkitAudioContext )();\n\n\t\t}\n\n\t\treturn _context;\n\n\t}\n\n\t/**\n\t * Allows to set the global native audio context from outside.\n\t *\n\t * @param {AudioContext} value - The native context to set.\n\t */\n\tstatic setContext( value ) {\n\n\t\t_context = value;\n\n\t}\n\n}\n\n/**\n * Class for loading audio buffers. Audios are internally\n * loaded via {@link FileLoader}.\n *\n * ```js\n * const audioListener = new THREE.AudioListener();\n * const ambientSound = new THREE.Audio( audioListener );\n *\n * const loader = new THREE.AudioLoader();\n * const audioBuffer = await loader.loadAsync( 'audio/ambient_ocean.ogg' );\n *\n * ambientSound.setBuffer( audioBuffer );\n * ambientSound.play();\n * ```\n *\n * @augments Loader\n */\nclass AudioLoader extends Loader {\n\n\t/**\n\t * Constructs a new audio loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and passes the loaded audio buffer\n\t * to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(AudioBuffer)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setPath( this.path );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\t\tloader.load( url, function ( buffer ) {\n\n\t\t\ttry {\n\n\t\t\t\t// Create a copy of the buffer. The `decodeAudioData` method\n\t\t\t\t// detaches the buffer when complete, preventing reuse.\n\t\t\t\tconst bufferCopy = buffer.slice( 0 );\n\n\t\t\t\tconst context = AudioContext.getContext();\n\t\t\t\tcontext.decodeAudioData( bufferCopy, function ( audioBuffer ) {\n\n\t\t\t\t\tonLoad( audioBuffer );\n\n\t\t\t\t} ).catch( handleError );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\thandleError( e );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t\tfunction handleError( e ) {\n\n\t\t\tif ( onError ) {\n\n\t\t\t\tonError( e );\n\n\t\t\t} else {\n\n\t\t\t\terror( e );\n\n\t\t\t}\n\n\t\t\tscope.manager.itemError( url );\n\n\t\t}\n\n\t}\n\n}\n\nconst _eyeRight = /*@__PURE__*/ new Matrix4();\nconst _eyeLeft = /*@__PURE__*/ new Matrix4();\nconst _projectionMatrix = /*@__PURE__*/ new Matrix4();\n\n/**\n * A special type of camera that uses two perspective cameras with\n * stereoscopic projection. Can be used for rendering stereo effects\n * like [3D Anaglyph](https://en.wikipedia.org/wiki/Anaglyph_3D) or\n * [Parallax Barrier](https://en.wikipedia.org/wiki/parallax_barrier).\n */\nclass StereoCamera {\n\n\t/**\n\t * Constructs a new stereo camera.\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * The type property is used for detecting the object type\n\t\t * in context of serialization/deserialization.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.type = 'StereoCamera';\n\n\t\t/**\n\t\t * The aspect.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.aspect = 1;\n\n\t\t/**\n\t\t * The eye separation which represents the distance\n\t\t * between the left and right camera.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.064\n\t\t */\n\t\tthis.eyeSep = 0.064;\n\n\t\t/**\n\t\t * The camera representing the left eye. This is added to layer `1` so objects to be\n\t\t * rendered by the left camera must also be added to this layer.\n\t\t *\n\t\t * @type {PerspectiveCamera}\n\t\t */\n\t\tthis.cameraL = new PerspectiveCamera();\n\t\tthis.cameraL.layers.enable( 1 );\n\t\tthis.cameraL.matrixAutoUpdate = false;\n\n\t\t/**\n\t\t * The camera representing the right eye. This is added to layer `2` so objects to be\n\t\t * rendered by the right camera must also be added to this layer.\n\t\t *\n\t\t * @type {PerspectiveCamera}\n\t\t */\n\t\tthis.cameraR = new PerspectiveCamera();\n\t\tthis.cameraR.layers.enable( 2 );\n\t\tthis.cameraR.matrixAutoUpdate = false;\n\n\t\tthis._cache = {\n\t\t\tfocus: null,\n\t\t\tfov: null,\n\t\t\taspect: null,\n\t\t\tnear: null,\n\t\t\tfar: null,\n\t\t\tzoom: null,\n\t\t\teyeSep: null\n\t\t};\n\n\t}\n\n\t/**\n\t * Updates the stereo camera based on the given perspective camera.\n\t *\n\t * @param {PerspectiveCamera} camera - The perspective camera.\n\t */\n\tupdate( camera ) {\n\n\t\tconst cache = this._cache;\n\n\t\tconst needsUpdate = cache.focus !== camera.focus || cache.fov !== camera.fov ||\n\t\t\tcache.aspect !== camera.aspect * this.aspect || cache.near !== camera.near ||\n\t\t\tcache.far !== camera.far || cache.zoom !== camera.zoom || cache.eyeSep !== this.eyeSep;\n\n\t\tif ( needsUpdate ) {\n\n\t\t\tcache.focus = camera.focus;\n\t\t\tcache.fov = camera.fov;\n\t\t\tcache.aspect = camera.aspect * this.aspect;\n\t\t\tcache.near = camera.near;\n\t\t\tcache.far = camera.far;\n\t\t\tcache.zoom = camera.zoom;\n\t\t\tcache.eyeSep = this.eyeSep;\n\n\t\t\t// Off-axis stereoscopic effect based on\n\t\t\t// http://paulbourke.net/stereographics/stereorender/\n\n\t\t\t_projectionMatrix.copy( camera.projectionMatrix );\n\t\t\tconst eyeSepHalf = cache.eyeSep / 2;\n\t\t\tconst eyeSepOnProjection = eyeSepHalf * cache.near / cache.focus;\n\t\t\tconst ymax = ( cache.near * Math.tan( DEG2RAD * cache.fov * 0.5 ) ) / cache.zoom;\n\t\t\tlet xmin, xmax;\n\n\t\t\t// translate xOffset\n\n\t\t\t_eyeLeft.elements[ 12 ] = - eyeSepHalf;\n\t\t\t_eyeRight.elements[ 12 ] = eyeSepHalf;\n\n\t\t\t// for left eye\n\n\t\t\txmin = - ymax * cache.aspect + eyeSepOnProjection;\n\t\t\txmax = ymax * cache.aspect + eyeSepOnProjection;\n\n\t\t\t_projectionMatrix.elements[ 0 ] = 2 * cache.near / ( xmax - xmin );\n\t\t\t_projectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );\n\n\t\t\tthis.cameraL.projectionMatrix.copy( _projectionMatrix );\n\n\t\t\t// for right eye\n\n\t\t\txmin = - ymax * cache.aspect - eyeSepOnProjection;\n\t\t\txmax = ymax * cache.aspect - eyeSepOnProjection;\n\n\t\t\t_projectionMatrix.elements[ 0 ] = 2 * cache.near / ( xmax - xmin );\n\t\t\t_projectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );\n\n\t\t\tthis.cameraR.projectionMatrix.copy( _projectionMatrix );\n\n\t\t}\n\n\t\tthis.cameraL.matrixWorld.copy( camera.matrixWorld ).multiply( _eyeLeft );\n\t\tthis.cameraR.matrixWorld.copy( camera.matrixWorld ).multiply( _eyeRight );\n\n\t}\n\n}\n\n/**\n * This type of camera can be used in order to efficiently render a scene with a\n * predefined set of cameras. This is an important performance aspect for\n * rendering VR scenes.\n *\n * An instance of `ArrayCamera` always has an array of sub cameras. It's mandatory\n * to define for each sub camera the `viewport` property which determines the\n * part of the viewport that is rendered with this camera.\n *\n * @augments PerspectiveCamera\n */\nclass ArrayCamera extends PerspectiveCamera {\n\n\t/**\n\t * Constructs a new array camera.\n\t *\n\t * @param {Array<PerspectiveCamera>} [array=[]] - An array of perspective sub cameras.\n\t */\n\tconstructor( array = [] ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isArrayCamera = true;\n\n\t\t/**\n\t\t * Whether this camera is used with multiview rendering or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default false\n\t\t */\n\t\tthis.isMultiViewCamera = false;\n\n\t\t/**\n\t\t * An array of perspective sub cameras.\n\t\t *\n\t\t * @type {Array<PerspectiveCamera>}\n\t\t */\n\t\tthis.cameras = array;\n\n\t}\n\n}\n\n/**\n * Class for keeping track of time.\n */\nclass Clock {\n\n\t/**\n\t * Constructs a new clock.\n\t *\n\t * @param {boolean} [autoStart=true] - Whether to automatically start the clock when\n\t * `getDelta()` is called for the first time.\n\t */\n\tconstructor( autoStart = true ) {\n\n\t\t/**\n\t\t * If set to `true`, the clock starts automatically when `getDelta()` is called\n\t\t * for the first time.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.autoStart = autoStart;\n\n\t\t/**\n\t\t * Holds the time at which the clock's `start()` method was last called.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.startTime = 0;\n\n\t\t/**\n\t\t * Holds the time at which the clock's `start()`, `getElapsedTime()` or\n\t\t * `getDelta()` methods were last called.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.oldTime = 0;\n\n\t\t/**\n\t\t * Keeps track of the total time that the clock has been running.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.elapsedTime = 0;\n\n\t\t/**\n\t\t * Whether the clock is running or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.running = false;\n\n\t}\n\n\t/**\n\t * Starts the clock. When `autoStart` is set to `true`, the method is automatically\n\t * called by the class.\n\t */\n\tstart() {\n\n\t\tthis.startTime = performance.now();\n\n\t\tthis.oldTime = this.startTime;\n\t\tthis.elapsedTime = 0;\n\t\tthis.running = true;\n\n\t}\n\n\t/**\n\t * Stops the clock.\n\t */\n\tstop() {\n\n\t\tthis.getElapsedTime();\n\t\tthis.running = false;\n\t\tthis.autoStart = false;\n\n\t}\n\n\t/**\n\t * Returns the elapsed time in seconds.\n\t *\n\t * @return {number} The elapsed time.\n\t */\n\tgetElapsedTime() {\n\n\t\tthis.getDelta();\n\t\treturn this.elapsedTime;\n\n\t}\n\n\t/**\n\t * Returns the delta time in seconds.\n\t *\n\t * @return {number} The delta time.\n\t */\n\tgetDelta() {\n\n\t\tlet diff = 0;\n\n\t\tif ( this.autoStart && ! this.running ) {\n\n\t\t\tthis.start();\n\t\t\treturn 0;\n\n\t\t}\n\n\t\tif ( this.running ) {\n\n\t\t\tconst newTime = performance.now();\n\n\t\t\tdiff = ( newTime - this.oldTime ) / 1000;\n\t\t\tthis.oldTime = newTime;\n\n\t\t\tthis.elapsedTime += diff;\n\n\t\t}\n\n\t\treturn diff;\n\n\t}\n\n}\n\nconst _position$1 = /*@__PURE__*/ new Vector3();\nconst _quaternion$1 = /*@__PURE__*/ new Quaternion();\nconst _scale$1 = /*@__PURE__*/ new Vector3();\n\nconst _forward = /*@__PURE__*/ new Vector3();\nconst _up = /*@__PURE__*/ new Vector3();\n\n/**\n * The class represents a virtual listener of the all positional and non-positional audio effects\n * in the scene. A three.js application usually creates a single listener. It is a mandatory\n * constructor parameter for audios entities like {@link Audio} and {@link PositionalAudio}.\n *\n * In most cases, the listener object is a child of the camera. So the 3D transformation of the\n * camera represents the 3D transformation of the listener.\n *\n * @augments Object3D\n */\nclass AudioListener extends Object3D {\n\n\t/**\n\t * Constructs a new audio listener.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.type = 'AudioListener';\n\n\t\t/**\n\t\t * The native audio context.\n\t\t *\n\t\t * @type {AudioContext}\n\t\t * @readonly\n\t\t */\n\t\tthis.context = AudioContext.getContext();\n\n\t\t/**\n\t\t * The gain node used for volume control.\n\t\t *\n\t\t * @type {GainNode}\n\t\t * @readonly\n\t\t */\n\t\tthis.gain = this.context.createGain();\n\t\tthis.gain.connect( this.context.destination );\n\n\t\t/**\n\t\t * An optional filter.\n\t\t *\n\t\t * Defined via {@link AudioListener#setFilter}.\n\t\t *\n\t\t * @type {?AudioNode}\n\t\t * @default null\n\t\t * @readonly\n\t\t */\n\t\tthis.filter = null;\n\n\t\t/**\n\t\t * Time delta values required for `linearRampToValueAtTime()` usage.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t * @readonly\n\t\t */\n\t\tthis.timeDelta = 0;\n\n\t\t// private\n\n\t\tthis._clock = new Clock();\n\n\t}\n\n\t/**\n\t * Returns the listener's input node.\n\t *\n\t * This method is used by other audio nodes to connect to this listener.\n\t *\n\t * @return {GainNode} The input node.\n\t */\n\tgetInput() {\n\n\t\treturn this.gain;\n\n\t}\n\n\t/**\n\t * Removes the current filter from this listener.\n\t *\n\t * @return {AudioListener} A reference to this listener.\n\t */\n\tremoveFilter() {\n\n\t\tif ( this.filter !== null ) {\n\n\t\t\tthis.gain.disconnect( this.filter );\n\t\t\tthis.filter.disconnect( this.context.destination );\n\t\t\tthis.gain.connect( this.context.destination );\n\t\t\tthis.filter = null;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the current set filter.\n\t *\n\t * @return {?AudioNode} The filter.\n\t */\n\tgetFilter() {\n\n\t\treturn this.filter;\n\n\t}\n\n\t/**\n\t * Sets the given filter to this listener.\n\t *\n\t * @param {AudioNode} value - The filter to set.\n\t * @return {AudioListener} A reference to this listener.\n\t */\n\tsetFilter( value ) {\n\n\t\tif ( this.filter !== null ) {\n\n\t\t\tthis.gain.disconnect( this.filter );\n\t\t\tthis.filter.disconnect( this.context.destination );\n\n\t\t} else {\n\n\t\t\tthis.gain.disconnect( this.context.destination );\n\n\t\t}\n\n\t\tthis.filter = value;\n\t\tthis.gain.connect( this.filter );\n\t\tthis.filter.connect( this.context.destination );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the applications master volume.\n\t *\n\t * @return {number} The master volume.\n\t */\n\tgetMasterVolume() {\n\n\t\treturn this.gain.gain.value;\n\n\t}\n\n\t/**\n\t * Sets the applications master volume. This volume setting affects\n\t * all audio nodes in the scene.\n\t *\n\t * @param {number} value - The master volume to set.\n\t * @return {AudioListener} A reference to this listener.\n\t */\n\tsetMasterVolume( value ) {\n\n\t\tthis.gain.gain.setTargetAtTime( value, this.context.currentTime, 0.01 );\n\n\t\treturn this;\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t\tconst listener = this.context.listener;\n\n\t\tthis.timeDelta = this._clock.getDelta();\n\n\t\tthis.matrixWorld.decompose( _position$1, _quaternion$1, _scale$1 );\n\n\t\t// the initial forward and up directions must be orthogonal\n\t\t_forward.set( 0, 0, -1 ).applyQuaternion( _quaternion$1 );\n\t\t_up.set( 0, 1, 0 ).applyQuaternion( _quaternion$1 );\n\n\t\tif ( listener.positionX ) {\n\n\t\t\t// code path for Chrome (see #14393)\n\n\t\t\tconst endTime = this.context.currentTime + this.timeDelta;\n\n\t\t\tlistener.positionX.linearRampToValueAtTime( _position$1.x, endTime );\n\t\t\tlistener.positionY.linearRampToValueAtTime( _position$1.y, endTime );\n\t\t\tlistener.positionZ.linearRampToValueAtTime( _position$1.z, endTime );\n\t\t\tlistener.forwardX.linearRampToValueAtTime( _forward.x, endTime );\n\t\t\tlistener.forwardY.linearRampToValueAtTime( _forward.y, endTime );\n\t\t\tlistener.forwardZ.linearRampToValueAtTime( _forward.z, endTime );\n\t\t\tlistener.upX.linearRampToValueAtTime( _up.x, endTime );\n\t\t\tlistener.upY.linearRampToValueAtTime( _up.y, endTime );\n\t\t\tlistener.upZ.linearRampToValueAtTime( _up.z, endTime );\n\n\t\t} else {\n\n\t\t\tlistener.setPosition( _position$1.x, _position$1.y, _position$1.z );\n\t\t\tlistener.setOrientation( _forward.x, _forward.y, _forward.z, _up.x, _up.y, _up.z );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * Represents a non-positional ( global ) audio object.\n *\n * This and related audio modules make use of the [Web Audio API](https://www.w3.org/TR/webaudio-1.1/).\n *\n * ```js\n * // create an AudioListener and add it to the camera\n * const listener = new THREE.AudioListener();\n * camera.add( listener );\n *\n * // create a global audio source\n * const sound = new THREE.Audio( listener );\n *\n * // load a sound and set it as the Audio object's buffer\n * const audioLoader = new THREE.AudioLoader();\n * audioLoader.load( 'sounds/ambient.ogg', function( buffer ) {\n * \tsound.setBuffer( buffer );\n * \tsound.setLoop( true );\n * \tsound.setVolume( 0.5 );\n * \tsound.play();\n * });\n * ```\n *\n * @augments Object3D\n */\nclass Audio extends Object3D {\n\n\t/**\n\t * Constructs a new audio.\n\t *\n\t * @param {AudioListener} listener - The global audio listener.\n\t */\n\tconstructor( listener ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'Audio';\n\n\t\t/**\n\t\t * The global audio listener.\n\t\t *\n\t\t * @type {AudioListener}\n\t\t * @readonly\n\t\t */\n\t\tthis.listener = listener;\n\n\t\t/**\n\t\t * The audio context.\n\t\t *\n\t\t * @type {AudioContext}\n\t\t * @readonly\n\t\t */\n\t\tthis.context = listener.context;\n\n\t\t/**\n\t\t * The gain node used for volume control.\n\t\t *\n\t\t * @type {GainNode}\n\t\t * @readonly\n\t\t */\n\t\tthis.gain = this.context.createGain();\n\t\tthis.gain.connect( listener.getInput() );\n\n\t\t/**\n\t\t * Whether to start playback automatically or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.autoplay = false;\n\n\t\t/**\n\t\t * A reference to an audio buffer.\n\t\t *\n\t\t * Defined via {@link Audio#setBuffer}.\n\t\t *\n\t\t * @type {?AudioBuffer}\n\t\t * @default null\n\t\t * @readonly\n\t\t */\n\t\tthis.buffer = null;\n\n\t\t/**\n\t\t * Modify pitch, measured in cents. +/- 100 is a semitone.\n\t\t * +/- 1200 is an octave.\n\t\t *\n\t\t * Defined via {@link Audio#setDetune}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t * @readonly\n\t\t */\n\t\tthis.detune = 0;\n\n\t\t/**\n\t\t * Whether the audio should loop or not.\n\t\t *\n\t\t * Defined via {@link Audio#setLoop}.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t * @readonly\n\t\t */\n\t\tthis.loop = false;\n\n\t\t/**\n\t\t * Defines where in the audio buffer the replay should\n\t\t * start, in seconds.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.loopStart = 0;\n\n\t\t/**\n\t\t * Defines where in the audio buffer the replay should\n\t\t * stop, in seconds.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.loopEnd = 0;\n\n\t\t/**\n\t\t * An offset to the time within the audio buffer the playback\n\t\t * should begin, in seconds.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.offset = 0;\n\n\t\t/**\n\t\t * Overrides the default duration of the audio.\n\t\t *\n\t\t * @type {undefined|number}\n\t\t * @default undefined\n\t\t */\n\t\tthis.duration = undefined;\n\n\t\t/**\n\t\t * The playback speed.\n\t\t *\n\t\t * Defined via {@link Audio#setPlaybackRate}.\n\t\t *\n\t\t * @type {number}\n\t\t * @readonly\n\t\t * @default 1\n\t\t */\n\t\tthis.playbackRate = 1;\n\n\t\t/**\n\t\t * Indicates whether the audio is playing or not.\n\t\t *\n\t\t * This flag will be automatically set when using {@link Audio#play},\n\t\t * {@link Audio#pause}, {@link Audio#stop}.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default false\n\t\t */\n\t\tthis.isPlaying = false;\n\n\t\t/**\n\t\t * Indicates whether the audio playback can be controlled\n\t\t * with method like {@link Audio#play} or {@link Audio#pause}.\n\t\t *\n\t\t * This flag will be automatically set when audio sources are\n\t\t * defined.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.hasPlaybackControl = true;\n\n\t\t/**\n\t\t * Holds a reference to the current audio source.\n\t\t *\n\t\t * The property is automatically by one of the `set*()` methods.\n\t\t *\n\t\t * @type {?AudioNode}\n\t\t * @readonly\n\t\t * @default null\n\t\t */\n\t\tthis.source = null;\n\n\t\t/**\n\t\t * Defines the source type.\n\t\t *\n\t\t * The property is automatically by one of the `set*()` methods.\n\t\t *\n\t\t * @type {('empty'|'audioNode'|'mediaNode'|'mediaStreamNode'|'buffer')}\n\t\t * @readonly\n\t\t * @default 'empty'\n\t\t */\n\t\tthis.sourceType = 'empty';\n\n\t\tthis._startedAt = 0;\n\t\tthis._progress = 0;\n\t\tthis._connected = false;\n\n\t\t/**\n\t\t * Can be used to apply a variety of low-order filters to create\n\t\t * more complex sound effects e.g. via `BiquadFilterNode`.\n\t\t *\n\t\t * The property is automatically set by {@link Audio#setFilters}.\n\t\t *\n\t\t * @type {Array<AudioNode>}\n\t\t * @readonly\n\t\t */\n\t\tthis.filters = [];\n\n\t}\n\n\t/**\n\t * Returns the output audio node.\n\t *\n\t * @return {GainNode} The output node.\n\t */\n\tgetOutput() {\n\n\t\treturn this.gain;\n\n\t}\n\n\t/**\n\t * Sets the given audio node as the source of this instance.\n\t *\n\t * {@link Audio#sourceType} is set to `audioNode` and {@link Audio#hasPlaybackControl} to `false`.\n\t *\n\t * @param {AudioNode} audioNode - The audio node like an instance of `OscillatorNode`.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetNodeSource( audioNode ) {\n\n\t\tthis.hasPlaybackControl = false;\n\t\tthis.sourceType = 'audioNode';\n\t\tthis.source = audioNode;\n\t\tthis.connect();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given media element as the source of this instance.\n\t *\n\t * {@link Audio#sourceType} is set to `mediaNode` and {@link Audio#hasPlaybackControl} to `false`.\n\t *\n\t * @param {HTMLMediaElement} mediaElement - The media element.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetMediaElementSource( mediaElement ) {\n\n\t\tthis.hasPlaybackControl = false;\n\t\tthis.sourceType = 'mediaNode';\n\t\tthis.source = this.context.createMediaElementSource( mediaElement );\n\t\tthis.connect();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given media stream as the source of this instance.\n\t *\n\t * {@link Audio#sourceType} is set to `mediaStreamNode` and {@link Audio#hasPlaybackControl} to `false`.\n\t *\n\t * @param {MediaStream} mediaStream - The media stream.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetMediaStreamSource( mediaStream ) {\n\n\t\tthis.hasPlaybackControl = false;\n\t\tthis.sourceType = 'mediaStreamNode';\n\t\tthis.source = this.context.createMediaStreamSource( mediaStream );\n\t\tthis.connect();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given audio buffer as the source of this instance.\n\t *\n\t * {@link Audio#sourceType} is set to `buffer` and {@link Audio#hasPlaybackControl} to `true`.\n\t *\n\t * @param {AudioBuffer} audioBuffer - The audio buffer.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetBuffer( audioBuffer ) {\n\n\t\tthis.buffer = audioBuffer;\n\t\tthis.sourceType = 'buffer';\n\n\t\tif ( this.autoplay ) this.play();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Starts the playback of the audio.\n\t *\n\t * Can only be used with compatible audio sources that allow playback control.\n\t *\n\t * @param {number} [delay=0] - The delay, in seconds, at which the audio should start playing.\n\t * @return {Audio|undefined} A reference to this instance.\n\t */\n\tplay( delay = 0 ) {\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\twarn( 'Audio: Audio is already playing.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\twarn( 'Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis._startedAt = this.context.currentTime + delay;\n\n\t\tconst source = this.context.createBufferSource();\n\t\tsource.buffer = this.buffer;\n\t\tsource.loop = this.loop;\n\t\tsource.loopStart = this.loopStart;\n\t\tsource.loopEnd = this.loopEnd;\n\t\tsource.onended = this.onEnded.bind( this );\n\t\tsource.start( this._startedAt, this._progress + this.offset, this.duration );\n\n\t\tthis.isPlaying = true;\n\n\t\tthis.source = source;\n\n\t\tthis.setDetune( this.detune );\n\t\tthis.setPlaybackRate( this.playbackRate );\n\n\t\treturn this.connect();\n\n\t}\n\n\t/**\n\t * Pauses the playback of the audio.\n\t *\n\t * Can only be used with compatible audio sources that allow playback control.\n\t *\n\t * @return {Audio|undefined} A reference to this instance.\n\t */\n\tpause() {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\twarn( 'Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\t// update current progress\n\n\t\t\tthis._progress += Math.max( this.context.currentTime - this._startedAt, 0 ) * this.playbackRate;\n\n\t\t\tif ( this.loop === true ) {\n\n\t\t\t\t// ensure _progress does not exceed duration with looped audios\n\n\t\t\t\tthis._progress = this._progress % ( this.duration || this.buffer.duration );\n\n\t\t\t}\n\n\t\t\tthis.source.stop();\n\t\t\tthis.source.onended = null;\n\n\t\t\tthis.isPlaying = false;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Stops the playback of the audio.\n\t *\n\t * Can only be used with compatible audio sources that allow playback control.\n\t *\n\t * @param {number} [delay=0] - The delay, in seconds, at which the audio should stop playing.\n\t * @return {Audio|undefined} A reference to this instance.\n\t */\n\tstop( delay = 0 ) {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\twarn( 'Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis._progress = 0;\n\n\t\tif ( this.source !== null ) {\n\n\t\t\tthis.source.stop( this.context.currentTime + delay );\n\t\t\tthis.source.onended = null;\n\n\t\t}\n\n\t\tthis.isPlaying = false;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Connects to the audio source. This is used internally on\n\t * initialisation and when setting / removing filters.\n\t *\n\t * @return {Audio} A reference to this instance.\n\t */\n\tconnect() {\n\n\t\tif ( this.filters.length > 0 ) {\n\n\t\t\tthis.source.connect( this.filters[ 0 ] );\n\n\t\t\tfor ( let i = 1, l = this.filters.length; i < l; i ++ ) {\n\n\t\t\t\tthis.filters[ i - 1 ].connect( this.filters[ i ] );\n\n\t\t\t}\n\n\t\t\tthis.filters[ this.filters.length - 1 ].connect( this.getOutput() );\n\n\t\t} else {\n\n\t\t\tthis.source.connect( this.getOutput() );\n\n\t\t}\n\n\t\tthis._connected = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Disconnects to the audio source. This is used internally on\n\t * initialisation and when setting / removing filters.\n\t *\n\t * @return {Audio|undefined} A reference to this instance.\n\t */\n\tdisconnect() {\n\n\t\tif ( this._connected === false ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( this.filters.length > 0 ) {\n\n\t\t\tthis.source.disconnect( this.filters[ 0 ] );\n\n\t\t\tfor ( let i = 1, l = this.filters.length; i < l; i ++ ) {\n\n\t\t\t\tthis.filters[ i - 1 ].disconnect( this.filters[ i ] );\n\n\t\t\t}\n\n\t\t\tthis.filters[ this.filters.length - 1 ].disconnect( this.getOutput() );\n\n\t\t} else {\n\n\t\t\tthis.source.disconnect( this.getOutput() );\n\n\t\t}\n\n\t\tthis._connected = false;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the current set filters.\n\t *\n\t * @return {Array<AudioNode>} The list of filters.\n\t */\n\tgetFilters() {\n\n\t\treturn this.filters;\n\n\t}\n\n\t/**\n\t * Sets an array of filters and connects them with the audio source.\n\t *\n\t * @param {Array<AudioNode>} [value] - A list of filters.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetFilters( value ) {\n\n\t\tif ( ! value ) value = [];\n\n\t\tif ( this._connected === true ) {\n\n\t\t\tthis.disconnect();\n\t\t\tthis.filters = value.slice();\n\t\t\tthis.connect();\n\n\t\t} else {\n\n\t\t\tthis.filters = value.slice();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Defines the detuning of oscillation in cents.\n\t *\n\t * @param {number} value - The detuning of oscillation in cents.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetDetune( value ) {\n\n\t\tthis.detune = value;\n\n\t\tif ( this.isPlaying === true && this.source.detune !== undefined ) {\n\n\t\t\tthis.source.detune.setTargetAtTime( this.detune, this.context.currentTime, 0.01 );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the detuning of oscillation in cents.\n\t *\n\t * @return {number} The detuning of oscillation in cents.\n\t */\n\tgetDetune() {\n\n\t\treturn this.detune;\n\n\t}\n\n\t/**\n\t * Returns the first filter in the list of filters.\n\t *\n\t * @return {AudioNode|undefined} The first filter in the list of filters.\n\t */\n\tgetFilter() {\n\n\t\treturn this.getFilters()[ 0 ];\n\n\t}\n\n\t/**\n\t * Applies a single filter node to the audio.\n\t *\n\t * @param {AudioNode} [filter] - The filter to set.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetFilter( filter ) {\n\n\t\treturn this.setFilters( filter ? [ filter ] : [] );\n\n\t}\n\n\t/**\n\t * Sets the playback rate.\n\t *\n\t * Can only be used with compatible audio sources that allow playback control.\n\t *\n\t * @param {number} [value] - The playback rate to set.\n\t * @return {Audio|undefined} A reference to this instance.\n\t */\n\tsetPlaybackRate( value ) {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\twarn( 'Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis.playbackRate = value;\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\tthis.source.playbackRate.setTargetAtTime( this.playbackRate, this.context.currentTime, 0.01 );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the current playback rate.\n\n\t * @return {number} The playback rate.\n\t */\n\tgetPlaybackRate() {\n\n\t\treturn this.playbackRate;\n\n\t}\n\n\t/**\n\t * Automatically called when playback finished.\n\t */\n\tonEnded() {\n\n\t\tthis.isPlaying = false;\n\t\tthis._progress = 0;\n\n\t}\n\n\t/**\n\t * Returns the loop flag.\n\t *\n\t * Can only be used with compatible audio sources that allow playback control.\n\t *\n\t * @return {boolean} Whether the audio should loop or not.\n\t */\n\tgetLoop() {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\twarn( 'Audio: this Audio has no playback control.' );\n\t\t\treturn false;\n\n\t\t}\n\n\t\treturn this.loop;\n\n\t}\n\n\t/**\n\t * Sets the loop flag.\n\t *\n\t * Can only be used with compatible audio sources that allow playback control.\n\t *\n\t * @param {boolean} value - Whether the audio should loop or not.\n\t * @return {Audio|undefined} A reference to this instance.\n\t */\n\tsetLoop( value ) {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\twarn( 'Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis.loop = value;\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\tthis.source.loop = this.loop;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the loop start value which defines where in the audio buffer the replay should\n\t * start, in seconds.\n\t *\n\t * @param {number} value - The loop start value.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetLoopStart( value ) {\n\n\t\tthis.loopStart = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the loop end value which defines where in the audio buffer the replay should\n\t * stop, in seconds.\n\t *\n\t * @param {number} value - The loop end value.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetLoopEnd( value ) {\n\n\t\tthis.loopEnd = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the volume.\n\t *\n\t * @return {number} The volume.\n\t */\n\tgetVolume() {\n\n\t\treturn this.gain.gain.value;\n\n\t}\n\n\t/**\n\t * Sets the volume.\n\t *\n\t * @param {number} value - The volume to set.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetVolume( value ) {\n\n\t\tthis.gain.gain.setTargetAtTime( value, this.context.currentTime, 0.01 );\n\n\t\treturn this;\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tif ( source.sourceType !== 'buffer' ) {\n\n\t\t\twarn( 'Audio: Audio source type cannot be copied.' );\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tthis.autoplay = source.autoplay;\n\n\t\tthis.buffer = source.buffer;\n\t\tthis.detune = source.detune;\n\t\tthis.loop = source.loop;\n\t\tthis.loopStart = source.loopStart;\n\t\tthis.loopEnd = source.loopEnd;\n\t\tthis.offset = source.offset;\n\t\tthis.duration = source.duration;\n\t\tthis.playbackRate = source.playbackRate;\n\t\tthis.hasPlaybackControl = source.hasPlaybackControl;\n\t\tthis.sourceType = source.sourceType;\n\n\t\tthis.filters = source.filters.slice();\n\n\t\treturn this;\n\n\t}\n\n\tclone( recursive ) {\n\n\t\treturn new this.constructor( this.listener ).copy( this, recursive );\n\n\t}\n\n}\n\nconst _position = /*@__PURE__*/ new Vector3();\nconst _quaternion = /*@__PURE__*/ new Quaternion();\nconst _scale = /*@__PURE__*/ new Vector3();\nconst _orientation = /*@__PURE__*/ new Vector3();\n\n/**\n * Represents a positional audio object.\n *\n * ```js\n * // create an AudioListener and add it to the camera\n * const listener = new THREE.AudioListener();\n * camera.add( listener );\n *\n * // create the PositionalAudio object (passing in the listener)\n * const sound = new THREE.PositionalAudio( listener );\n *\n * // load a sound and set it as the PositionalAudio object's buffer\n * const audioLoader = new THREE.AudioLoader();\n * audioLoader.load( 'sounds/song.ogg', function( buffer ) {\n * \tsound.setBuffer( buffer );\n * \tsound.setRefDistance( 20 );\n * \tsound.play();\n * });\n *\n * // create an object for the sound to play from\n * const sphere = new THREE.SphereGeometry( 20, 32, 16 );\n * const material = new THREE.MeshPhongMaterial( { color: 0xff2200 } );\n * const mesh = new THREE.Mesh( sphere, material );\n * scene.add( mesh );\n *\n * // finally add the sound to the mesh\n * mesh.add( sound );\n *\n * @augments Audio\n */\nclass PositionalAudio extends Audio {\n\n\t/**\n\t * Constructs a positional audio.\n\t *\n\t * @param {AudioListener} listener - The global audio listener.\n\t */\n\tconstructor( listener ) {\n\n\t\tsuper( listener );\n\n\t\t/**\n\t\t * The panner node represents the location, direction, and behavior of an audio\n\t\t * source in 3D space.\n\t\t *\n\t\t * @type {PannerNode}\n\t\t * @readonly\n\t\t */\n\t\tthis.panner = this.context.createPanner();\n\t\tthis.panner.panningModel = 'HRTF';\n\t\tthis.panner.connect( this.gain );\n\n\t}\n\n\tconnect() {\n\n\t\tsuper.connect();\n\n\t\tthis.panner.connect( this.gain );\n\n\t\treturn this;\n\n\t}\n\n\tdisconnect() {\n\n\t\tsuper.disconnect();\n\n\t\tthis.panner.disconnect( this.gain );\n\n\t\treturn this;\n\n\t}\n\n\tgetOutput() {\n\n\t\treturn this.panner;\n\n\t}\n\n\t/**\n\t * Returns the current reference distance.\n\t *\n\t * @return {number} The reference distance.\n\t */\n\tgetRefDistance() {\n\n\t\treturn this.panner.refDistance;\n\n\t}\n\n\t/**\n\t * Defines the reference distance for reducing volume as the audio source moves\n\t * further from the listener – i.e. the distance at which the volume reduction\n\t * starts taking effect.\n\t *\n\t * @param {number} value - The reference distance to set.\n\t * @return {PositionalAudio} A reference to this instance.\n\t */\n\tsetRefDistance( value ) {\n\n\t\tthis.panner.refDistance = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the current rolloff factor.\n\t *\n\t * @return {number} The rolloff factor.\n\t */\n\tgetRolloffFactor() {\n\n\t\treturn this.panner.rolloffFactor;\n\n\t}\n\n\t/**\n\t * Defines how quickly the volume is reduced as the source moves away from the listener.\n\t *\n\t * @param {number} value - The rolloff factor.\n\t * @return {PositionalAudio} A reference to this instance.\n\t */\n\tsetRolloffFactor( value ) {\n\n\t\tthis.panner.rolloffFactor = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the current distance model.\n\t *\n\t * @return {('linear'|'inverse'|'exponential')} The distance model.\n\t */\n\tgetDistanceModel() {\n\n\t\treturn this.panner.distanceModel;\n\n\t}\n\n\t/**\n\t * Defines which algorithm to use to reduce the volume of the audio source\n\t * as it moves away from the listener.\n\t *\n\t * Read [the spec](https://www.w3.org/TR/webaudio-1.1/#enumdef-distancemodeltype)\n\t * for more details.\n\t *\n\t * @param {('linear'|'inverse'|'exponential')} value - The distance model to set.\n\t * @return {PositionalAudio} A reference to this instance.\n\t */\n\tsetDistanceModel( value ) {\n\n\t\tthis.panner.distanceModel = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the current max distance.\n\t *\n\t * @return {number} The max distance.\n\t */\n\tgetMaxDistance() {\n\n\t\treturn this.panner.maxDistance;\n\n\t}\n\n\t/**\n\t * Defines the maximum distance between the audio source and the listener,\n\t * after which the volume is not reduced any further.\n\t *\n\t * This value is used only by the `linear` distance model.\n\t *\n\t * @param {number} value - The max distance.\n\t * @return {PositionalAudio} A reference to this instance.\n\t */\n\tsetMaxDistance( value ) {\n\n\t\tthis.panner.maxDistance = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the directional cone in which the audio can be listened.\n\t *\n\t * @param {number} coneInnerAngle - An angle, in degrees, of a cone inside of which there will be no volume reduction.\n\t * @param {number} coneOuterAngle - An angle, in degrees, of a cone outside of which the volume will be reduced by a constant value, defined by the `coneOuterGain` parameter.\n\t * @param {number} coneOuterGain - The amount of volume reduction outside the cone defined by the `coneOuterAngle`. When set to `0`, no sound can be heard.\n\t * @return {PositionalAudio} A reference to this instance.\n\t */\n\tsetDirectionalCone( coneInnerAngle, coneOuterAngle, coneOuterGain ) {\n\n\t\tthis.panner.coneInnerAngle = coneInnerAngle;\n\t\tthis.panner.coneOuterAngle = coneOuterAngle;\n\t\tthis.panner.coneOuterGain = coneOuterGain;\n\n\t\treturn this;\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t\tif ( this.hasPlaybackControl === true && this.isPlaying === false ) return;\n\n\t\tthis.matrixWorld.decompose( _position, _quaternion, _scale );\n\n\t\t_orientation.set( 0, 0, 1 ).applyQuaternion( _quaternion );\n\n\t\tconst panner = this.panner;\n\n\t\tif ( panner.positionX ) {\n\n\t\t\t// code path for Chrome and Firefox (see #14393)\n\n\t\t\tconst endTime = this.context.currentTime + this.listener.timeDelta;\n\n\t\t\tpanner.positionX.linearRampToValueAtTime( _position.x, endTime );\n\t\t\tpanner.positionY.linearRampToValueAtTime( _position.y, endTime );\n\t\t\tpanner.positionZ.linearRampToValueAtTime( _position.z, endTime );\n\t\t\tpanner.orientationX.linearRampToValueAtTime( _orientation.x, endTime );\n\t\t\tpanner.orientationY.linearRampToValueAtTime( _orientation.y, endTime );\n\t\t\tpanner.orientationZ.linearRampToValueAtTime( _orientation.z, endTime );\n\n\t\t} else {\n\n\t\t\tpanner.setPosition( _position.x, _position.y, _position.z );\n\t\t\tpanner.setOrientation( _orientation.x, _orientation.y, _orientation.z );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * This class can be used to analyse audio data.\n *\n * ```js\n * // create an AudioListener and add it to the camera\n * const listener = new THREE.AudioListener();\n * camera.add( listener );\n *\n * // create an Audio source\n * const sound = new THREE.Audio( listener );\n *\n * // load a sound and set it as the Audio object's buffer\n * const audioLoader = new THREE.AudioLoader();\n * audioLoader.load( 'sounds/ambient.ogg', function( buffer ) {\n * \tsound.setBuffer( buffer );\n * \tsound.setLoop(true);\n * \tsound.setVolume(0.5);\n * \tsound.play();\n * });\n *\n * // create an AudioAnalyser, passing in the sound and desired fftSize\n * const analyser = new THREE.AudioAnalyser( sound, 32 );\n *\n * // get the average frequency of the sound\n * const data = analyser.getAverageFrequency();\n * ```\n */\nclass AudioAnalyser {\n\n\t/**\n\t * Constructs a new audio analyzer.\n\t *\n\t * @param {Audio} audio - The audio to analyze.\n\t * @param {number} [fftSize=2048] - The window size in samples that is used when performing a Fast Fourier Transform (FFT) to get frequency domain data.\n\t */\n\tconstructor( audio, fftSize = 2048 ) {\n\n\t\t/**\n\t\t * The global audio listener.\n\t\t *\n\t\t * @type {AnalyserNode}\n\t\t */\n\t\tthis.analyser = audio.context.createAnalyser();\n\t\tthis.analyser.fftSize = fftSize;\n\n\t\t/**\n\t\t * Holds the analyzed data.\n\t\t *\n\t\t * @type {Uint8Array}\n\t\t */\n\t\tthis.data = new Uint8Array( this.analyser.frequencyBinCount );\n\n\t\taudio.getOutput().connect( this.analyser );\n\n\t}\n\n\t/**\n\t * Returns an array with frequency data of the audio.\n\t *\n\t * Each item in the array represents the decibel value for a specific frequency.\n\t * The frequencies are spread linearly from 0 to 1/2 of the sample rate.\n\t * For example, for 48000 sample rate, the last item of the array will represent\n\t * the decibel value for 24000 Hz.\n\t *\n\t * @return {Uint8Array} The frequency data.\n\t */\n\tgetFrequencyData() {\n\n\t\tthis.analyser.getByteFrequencyData( this.data );\n\n\t\treturn this.data;\n\n\t}\n\n\t/**\n\t * Returns the average of the frequencies returned by {@link AudioAnalyser#getFrequencyData}.\n\t *\n\t * @return {number} The average frequency.\n\t */\n\tgetAverageFrequency() {\n\n\t\tlet value = 0;\n\t\tconst data = this.getFrequencyData();\n\n\t\tfor ( let i = 0; i < data.length; i ++ ) {\n\n\t\t\tvalue += data[ i ];\n\n\t\t}\n\n\t\treturn value / data.length;\n\n\t}\n\n}\n\n/**\n * Buffered scene graph property that allows weighted accumulation; used internally.\n */\nclass PropertyMixer {\n\n\t/**\n\t * Constructs a new property mixer.\n\t *\n\t * @param {PropertyBinding} binding - The property binding.\n\t * @param {string} typeName - The keyframe track type name.\n\t * @param {number} valueSize - The keyframe track value size.\n\t */\n\tconstructor( binding, typeName, valueSize ) {\n\n\t\t/**\n\t\t * The property binding.\n\t\t *\n\t\t * @type {PropertyBinding}\n\t\t */\n\t\tthis.binding = binding;\n\n\t\t/**\n\t\t * The keyframe track value size.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.valueSize = valueSize;\n\n\t\tlet mixFunction,\n\t\t\tmixFunctionAdditive,\n\t\t\tsetIdentity;\n\n\t\t// buffer layout: [ incoming | accu0 | accu1 | orig | addAccu | (optional work) ]\n\t\t//\n\t\t// interpolators can use .buffer as their .result\n\t\t// the data then goes to 'incoming'\n\t\t//\n\t\t// 'accu0' and 'accu1' are used frame-interleaved for\n\t\t// the cumulative result and are compared to detect\n\t\t// changes\n\t\t//\n\t\t// 'orig' stores the original state of the property\n\t\t//\n\t\t// 'add' is used for additive cumulative results\n\t\t//\n\t\t// 'work' is optional and is only present for quaternion types. It is used\n\t\t// to store intermediate quaternion multiplication results\n\n\t\tswitch ( typeName ) {\n\n\t\t\tcase 'quaternion':\n\t\t\t\tmixFunction = this._slerp;\n\t\t\t\tmixFunctionAdditive = this._slerpAdditive;\n\t\t\t\tsetIdentity = this._setAdditiveIdentityQuaternion;\n\n\t\t\t\tthis.buffer = new Float64Array( valueSize * 6 );\n\t\t\t\tthis._workIndex = 5;\n\t\t\t\tbreak;\n\n\t\t\tcase 'string':\n\t\t\tcase 'bool':\n\t\t\t\tmixFunction = this._select;\n\n\t\t\t\t// Use the regular mix function and for additive on these types,\n\t\t\t\t// additive is not relevant for non-numeric types\n\t\t\t\tmixFunctionAdditive = this._select;\n\n\t\t\t\tsetIdentity = this._setAdditiveIdentityOther;\n\n\t\t\t\tthis.buffer = new Array( valueSize * 5 );\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tmixFunction = this._lerp;\n\t\t\t\tmixFunctionAdditive = this._lerpAdditive;\n\t\t\t\tsetIdentity = this._setAdditiveIdentityNumeric;\n\n\t\t\t\tthis.buffer = new Float64Array( valueSize * 5 );\n\n\t\t}\n\n\t\tthis._mixBufferRegion = mixFunction;\n\t\tthis._mixBufferRegionAdditive = mixFunctionAdditive;\n\t\tthis._setIdentity = setIdentity;\n\t\tthis._origIndex = 3;\n\t\tthis._addIndex = 4;\n\n\t\t/**\n\t\t * TODO\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.cumulativeWeight = 0;\n\n\t\t/**\n\t\t * TODO\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.cumulativeWeightAdditive = 0;\n\n\t\t/**\n\t\t * TODO\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.useCount = 0;\n\n\t\t/**\n\t\t * TODO\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.referenceCount = 0;\n\n\t}\n\n\t/**\n\t * Accumulates data in the `incoming` region into `accu<i>`.\n\t *\n\t * @param {number} accuIndex - The accumulation index.\n\t * @param {number} weight - The weight.\n\t */\n\taccumulate( accuIndex, weight ) {\n\n\t\t// note: happily accumulating nothing when weight = 0, the caller knows\n\t\t// the weight and shouldn't have made the call in the first place\n\n\t\tconst buffer = this.buffer,\n\t\t\tstride = this.valueSize,\n\t\t\toffset = accuIndex * stride + stride;\n\n\t\tlet currentWeight = this.cumulativeWeight;\n\n\t\tif ( currentWeight === 0 ) {\n\n\t\t\t// accuN := incoming * weight\n\n\t\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tbuffer[ offset + i ] = buffer[ i ];\n\n\t\t\t}\n\n\t\t\tcurrentWeight = weight;\n\n\t\t} else {\n\n\t\t\t// accuN := accuN + incoming * weight\n\n\t\t\tcurrentWeight += weight;\n\t\t\tconst mix = weight / currentWeight;\n\t\t\tthis._mixBufferRegion( buffer, offset, 0, mix, stride );\n\n\t\t}\n\n\t\tthis.cumulativeWeight = currentWeight;\n\n\t}\n\n\t/**\n\t * Accumulates data in the `incoming` region into `add`.\n\t *\n\t * @param {number} weight - The weight.\n\t */\n\taccumulateAdditive( weight ) {\n\n\t\tconst buffer = this.buffer,\n\t\t\tstride = this.valueSize,\n\t\t\toffset = stride * this._addIndex;\n\n\t\tif ( this.cumulativeWeightAdditive === 0 ) {\n\n\t\t\t// add = identity\n\n\t\t\tthis._setIdentity();\n\n\t\t}\n\n\t\t// add := add + incoming * weight\n\n\t\tthis._mixBufferRegionAdditive( buffer, offset, 0, weight, stride );\n\t\tthis.cumulativeWeightAdditive += weight;\n\n\t}\n\n\t/**\n\t * Applies the state of `accu<i>` to the binding when accus differ.\n\t *\n\t * @param {number} accuIndex - The accumulation index.\n\t */\n\tapply( accuIndex ) {\n\n\t\tconst stride = this.valueSize,\n\t\t\tbuffer = this.buffer,\n\t\t\toffset = accuIndex * stride + stride,\n\n\t\t\tweight = this.cumulativeWeight,\n\t\t\tweightAdditive = this.cumulativeWeightAdditive,\n\n\t\t\tbinding = this.binding;\n\n\t\tthis.cumulativeWeight = 0;\n\t\tthis.cumulativeWeightAdditive = 0;\n\n\t\tif ( weight < 1 ) {\n\n\t\t\t// accuN := accuN + original * ( 1 - cumulativeWeight )\n\n\t\t\tconst originalValueOffset = stride * this._origIndex;\n\n\t\t\tthis._mixBufferRegion(\n\t\t\t\tbuffer, offset, originalValueOffset, 1 - weight, stride );\n\n\t\t}\n\n\t\tif ( weightAdditive > 0 ) {\n\n\t\t\t// accuN := accuN + additive accuN\n\n\t\t\tthis._mixBufferRegionAdditive( buffer, offset, this._addIndex * stride, 1, stride );\n\n\t\t}\n\n\t\tfor ( let i = stride, e = stride + stride; i !== e; ++ i ) {\n\n\t\t\tif ( buffer[ i ] !== buffer[ i + stride ] ) {\n\n\t\t\t\t// value has changed -> update scene graph\n\n\t\t\t\tbinding.setValue( buffer, offset );\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\n\t/**\n\t * Remembers the state of the bound property and copy it to both accus.\n\t */\n\tsaveOriginalState() {\n\n\t\tconst binding = this.binding;\n\n\t\tconst buffer = this.buffer,\n\t\t\tstride = this.valueSize,\n\n\t\t\toriginalValueOffset = stride * this._origIndex;\n\n\t\tbinding.getValue( buffer, originalValueOffset );\n\n\t\t// accu[0..1] := orig -- initially detect changes against the original\n\t\tfor ( let i = stride, e = originalValueOffset; i !== e; ++ i ) {\n\n\t\t\tbuffer[ i ] = buffer[ originalValueOffset + ( i % stride ) ];\n\n\t\t}\n\n\t\t// Add to identity for additive\n\t\tthis._setIdentity();\n\n\t\tthis.cumulativeWeight = 0;\n\t\tthis.cumulativeWeightAdditive = 0;\n\n\t}\n\n\t/**\n\t * Applies the state previously taken via {@link PropertyMixer#saveOriginalState} to the binding.\n\t */\n\trestoreOriginalState() {\n\n\t\tconst originalValueOffset = this.valueSize * 3;\n\t\tthis.binding.setValue( this.buffer, originalValueOffset );\n\n\t}\n\n\t// internals\n\n\t_setAdditiveIdentityNumeric() {\n\n\t\tconst startIndex = this._addIndex * this.valueSize;\n\t\tconst endIndex = startIndex + this.valueSize;\n\n\t\tfor ( let i = startIndex; i < endIndex; i ++ ) {\n\n\t\t\tthis.buffer[ i ] = 0;\n\n\t\t}\n\n\t}\n\n\t_setAdditiveIdentityQuaternion() {\n\n\t\tthis._setAdditiveIdentityNumeric();\n\t\tthis.buffer[ this._addIndex * this.valueSize + 3 ] = 1;\n\n\t}\n\n\t_setAdditiveIdentityOther() {\n\n\t\tconst startIndex = this._origIndex * this.valueSize;\n\t\tconst targetIndex = this._addIndex * this.valueSize;\n\n\t\tfor ( let i = 0; i < this.valueSize; i ++ ) {\n\n\t\t\tthis.buffer[ targetIndex + i ] = this.buffer[ startIndex + i ];\n\n\t\t}\n\n\t}\n\n\n\t// mix functions\n\n\t_select( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\tif ( t >= 0.5 ) {\n\n\t\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tbuffer[ dstOffset + i ] = buffer[ srcOffset + i ];\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_slerp( buffer, dstOffset, srcOffset, t ) {\n\n\t\tQuaternion.slerpFlat( buffer, dstOffset, buffer, dstOffset, buffer, srcOffset, t );\n\n\t}\n\n\t_slerpAdditive( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\tconst workOffset = this._workIndex * stride;\n\n\t\t// Store result in intermediate buffer offset\n\t\tQuaternion.multiplyQuaternionsFlat( buffer, workOffset, buffer, dstOffset, buffer, srcOffset );\n\n\t\t// Slerp to the intermediate result\n\t\tQuaternion.slerpFlat( buffer, dstOffset, buffer, dstOffset, buffer, workOffset, t );\n\n\t}\n\n\t_lerp( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\tconst s = 1 - t;\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tconst j = dstOffset + i;\n\n\t\t\tbuffer[ j ] = buffer[ j ] * s + buffer[ srcOffset + i ] * t;\n\n\t\t}\n\n\t}\n\n\t_lerpAdditive( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tconst j = dstOffset + i;\n\n\t\t\tbuffer[ j ] = buffer[ j ] + buffer[ srcOffset + i ] * t;\n\n\t\t}\n\n\t}\n\n}\n\n// Characters [].:/ are reserved for track binding syntax.\nconst _RESERVED_CHARS_RE = '\\\\[\\\\]\\\\.:\\\\/';\nconst _reservedRe = new RegExp( '[' + _RESERVED_CHARS_RE + ']', 'g' );\n\n// Attempts to allow node names from any language. ES5's `\\w` regexp matches\n// only latin characters, and the unicode \\p{L} is not yet supported. So\n// instead, we exclude reserved characters and match everything else.\nconst _wordChar = '[^' + _RESERVED_CHARS_RE + ']';\nconst _wordCharOrDot = '[^' + _RESERVED_CHARS_RE.replace( '\\\\.', '' ) + ']';\n\n// Parent directories, delimited by '/' or ':'. Currently unused, but must\n// be matched to parse the rest of the track name.\nconst _directoryRe = /*@__PURE__*/ /((?:WC+[\\/:])*)/.source.replace( 'WC', _wordChar );\n\n// Target node. May contain word characters (a-zA-Z0-9_) and '.' or '-'.\nconst _nodeRe = /*@__PURE__*/ /(WCOD+)?/.source.replace( 'WCOD', _wordCharOrDot );\n\n// Object on target node, and accessor. May not contain reserved\n// characters. Accessor may contain any character except closing bracket.\nconst _objectRe = /*@__PURE__*/ /(?:\\.(WC+)(?:\\[(.+)\\])?)?/.source.replace( 'WC', _wordChar );\n\n// Property and accessor. May not contain reserved characters. Accessor may\n// contain any non-bracket characters.\nconst _propertyRe = /*@__PURE__*/ /\\.(WC+)(?:\\[(.+)\\])?/.source.replace( 'WC', _wordChar );\n\nconst _trackRe = new RegExp( ''\n\t+ '^'\n\t+ _directoryRe\n\t+ _nodeRe\n\t+ _objectRe\n\t+ _propertyRe\n\t+ '$'\n);\n\nconst _supportedObjectNames = [ 'material', 'materials', 'bones', 'map' ];\n\nclass Composite {\n\n\tconstructor( targetGroup, path, optionalParsedPath ) {\n\n\t\tconst parsedPath = optionalParsedPath || PropertyBinding.parseTrackName( path );\n\n\t\tthis._targetGroup = targetGroup;\n\t\tthis._bindings = targetGroup.subscribe_( path, parsedPath );\n\n\t}\n\n\tgetValue( array, offset ) {\n\n\t\tthis.bind(); // bind all binding\n\n\t\tconst firstValidIndex = this._targetGroup.nCachedObjects_,\n\t\t\tbinding = this._bindings[ firstValidIndex ];\n\n\t\t// and only call .getValue on the first\n\t\tif ( binding !== undefined ) binding.getValue( array, offset );\n\n\t}\n\n\tsetValue( array, offset ) {\n\n\t\tconst bindings = this._bindings;\n\n\t\tfor ( let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\tbindings[ i ].setValue( array, offset );\n\n\t\t}\n\n\t}\n\n\tbind() {\n\n\t\tconst bindings = this._bindings;\n\n\t\tfor ( let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\tbindings[ i ].bind();\n\n\t\t}\n\n\t}\n\n\tunbind() {\n\n\t\tconst bindings = this._bindings;\n\n\t\tfor ( let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\tbindings[ i ].unbind();\n\n\t\t}\n\n\t}\n\n}\n\n// Note: This class uses a State pattern on a per-method basis:\n// 'bind' sets 'this.getValue' / 'setValue' and shadows the\n// prototype version of these methods with one that represents\n// the bound state. When the property is not found, the methods\n// become no-ops.\n\n\n/**\n * This holds a reference to a real property in the scene graph; used internally.\n */\nclass PropertyBinding {\n\n\t/**\n\t * Constructs a new property binding.\n\t *\n\t * @param {Object} rootNode - The root node.\n\t * @param {string} path - The path.\n\t * @param {?Object} [parsedPath] - The parsed path.\n\t */\n\tconstructor( rootNode, path, parsedPath ) {\n\n\t\t/**\n\t\t * The object path to the animated property.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.path = path;\n\n\t\t/**\n\t\t * An object holding information about the path.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parsedPath = parsedPath || PropertyBinding.parseTrackName( path );\n\n\t\t/**\n\t\t * The object owns the animated property.\n\t\t *\n\t\t * @type {?Object}\n\t\t */\n\t\tthis.node = PropertyBinding.findNode( rootNode, this.parsedPath.nodeName );\n\n\t\t/**\n\t\t * The root node.\n\t\t *\n\t\t * @type {Object3D|Skeleton}\n\t\t */\n\t\tthis.rootNode = rootNode;\n\n\t\t// initial state of these methods that calls 'bind'\n\t\tthis.getValue = this._getValue_unbound;\n\t\tthis.setValue = this._setValue_unbound;\n\n\t}\n\n\n\t/**\n\t * Factory method for creating a property binding from the given parameters.\n\t *\n\t * @static\n\t * @param {Object} root - The root node.\n\t * @param {string} path - The path.\n\t * @param {?Object} [parsedPath] - The parsed path.\n\t * @return {PropertyBinding|Composite} The created property binding or composite.\n\t */\n\tstatic create( root, path, parsedPath ) {\n\n\t\tif ( ! ( root && root.isAnimationObjectGroup ) ) {\n\n\t\t\treturn new PropertyBinding( root, path, parsedPath );\n\n\t\t} else {\n\n\t\t\treturn new PropertyBinding.Composite( root, path, parsedPath );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Replaces spaces with underscores and removes unsupported characters from\n\t * node names, to ensure compatibility with parseTrackName().\n\t *\n\t * @param {string} name - Node name to be sanitized.\n\t * @return {string} The sanitized node name.\n\t */\n\tstatic sanitizeNodeName( name ) {\n\n\t\treturn name.replace( /\\s/g, '_' ).replace( _reservedRe, '' );\n\n\t}\n\n\t/**\n\t * Parses the given track name (an object path to an animated property) and\n\t * returns an object with information about the path. Matches strings in the following forms:\n\t *\n\t * - nodeName.property\n\t * - nodeName.property[accessor]\n\t * - nodeName.material.property[accessor]\n\t * - uuid.property[accessor]\n\t * - uuid.objectName[objectIndex].propertyName[propertyIndex]\n\t * - parentName/nodeName.property\n\t * - parentName/parentName/nodeName.property[index]\n\t * - .bone[Armature.DEF_cog].position\n\t * - scene:helium_balloon_model:helium_balloon_model.position\n\t *\n\t * @static\n\t * @param {string} trackName - The track name to parse.\n\t * @return {Object} The parsed track name as an object.\n\t */\n\tstatic parseTrackName( trackName ) {\n\n\t\tconst matches = _trackRe.exec( trackName );\n\n\t\tif ( matches === null ) {\n\n\t\t\tthrow new Error( 'PropertyBinding: Cannot parse trackName: ' + trackName );\n\n\t\t}\n\n\t\tconst results = {\n\t\t\t// directoryName: matches[ 1 ], // (tschw) currently unused\n\t\t\tnodeName: matches[ 2 ],\n\t\t\tobjectName: matches[ 3 ],\n\t\t\tobjectIndex: matches[ 4 ],\n\t\t\tpropertyName: matches[ 5 ], // required\n\t\t\tpropertyIndex: matches[ 6 ]\n\t\t};\n\n\t\tconst lastDot = results.nodeName && results.nodeName.lastIndexOf( '.' );\n\n\t\tif ( lastDot !== undefined && lastDot !== -1 ) {\n\n\t\t\tconst objectName = results.nodeName.substring( lastDot + 1 );\n\n\t\t\t// Object names must be checked against an allowlist. Otherwise, there\n\t\t\t// is no way to parse 'foo.bar.baz': 'baz' must be a property, but\n\t\t\t// 'bar' could be the objectName, or part of a nodeName (which can\n\t\t\t// include '.' characters).\n\t\t\tif ( _supportedObjectNames.indexOf( objectName ) !== -1 ) {\n\n\t\t\t\tresults.nodeName = results.nodeName.substring( 0, lastDot );\n\t\t\t\tresults.objectName = objectName;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( results.propertyName === null || results.propertyName.length === 0 ) {\n\n\t\t\tthrow new Error( 'PropertyBinding: can not parse propertyName from trackName: ' + trackName );\n\n\t\t}\n\n\t\treturn results;\n\n\t}\n\n\t/**\n\t * Searches for a node in the hierarchy of the given root object by the given\n\t * node name.\n\t *\n\t * @static\n\t * @param {Object} root - The root object.\n\t * @param {string|number} nodeName - The name of the node.\n\t * @return {?Object} The found node. Returns `null` if no object was found.\n\t */\n\tstatic findNode( root, nodeName ) {\n\n\t\tif ( nodeName === undefined || nodeName === '' || nodeName === '.' || nodeName === -1 || nodeName === root.name || nodeName === root.uuid ) {\n\n\t\t\treturn root;\n\n\t\t}\n\n\t\t// search into skeleton bones.\n\t\tif ( root.skeleton ) {\n\n\t\t\tconst bone = root.skeleton.getBoneByName( nodeName );\n\n\t\t\tif ( bone !== undefined ) {\n\n\t\t\t\treturn bone;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// search into node subtree.\n\t\tif ( root.children ) {\n\n\t\t\tconst searchNodeSubtree = function ( children ) {\n\n\t\t\t\tfor ( let i = 0; i < children.length; i ++ ) {\n\n\t\t\t\t\tconst childNode = children[ i ];\n\n\t\t\t\t\tif ( childNode.name === nodeName || childNode.uuid === nodeName ) {\n\n\t\t\t\t\t\treturn childNode;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst result = searchNodeSubtree( childNode.children );\n\n\t\t\t\t\tif ( result ) return result;\n\n\t\t\t\t}\n\n\t\t\t\treturn null;\n\n\t\t\t};\n\n\t\t\tconst subTreeNode = searchNodeSubtree( root.children );\n\n\t\t\tif ( subTreeNode ) {\n\n\t\t\t\treturn subTreeNode;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\t// these are used to \"bind\" a nonexistent property\n\t_getValue_unavailable() {}\n\t_setValue_unavailable() {}\n\n\t// Getters\n\n\t_getValue_direct( buffer, offset ) {\n\n\t\tbuffer[ offset ] = this.targetObject[ this.propertyName ];\n\n\t}\n\n\t_getValue_array( buffer, offset ) {\n\n\t\tconst source = this.resolvedProperty;\n\n\t\tfor ( let i = 0, n = source.length; i !== n; ++ i ) {\n\n\t\t\tbuffer[ offset ++ ] = source[ i ];\n\n\t\t}\n\n\t}\n\n\t_getValue_arrayElement( buffer, offset ) {\n\n\t\tbuffer[ offset ] = this.resolvedProperty[ this.propertyIndex ];\n\n\t}\n\n\t_getValue_toArray( buffer, offset ) {\n\n\t\tthis.resolvedProperty.toArray( buffer, offset );\n\n\t}\n\n\t// Direct\n\n\t_setValue_direct( buffer, offset ) {\n\n\t\tthis.targetObject[ this.propertyName ] = buffer[ offset ];\n\n\t}\n\n\t_setValue_direct_setNeedsUpdate( buffer, offset ) {\n\n\t\tthis.targetObject[ this.propertyName ] = buffer[ offset ];\n\t\tthis.targetObject.needsUpdate = true;\n\n\t}\n\n\t_setValue_direct_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\tthis.targetObject[ this.propertyName ] = buffer[ offset ];\n\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t}\n\n\t// EntireArray\n\n\t_setValue_array( buffer, offset ) {\n\n\t\tconst dest = this.resolvedProperty;\n\n\t\tfor ( let i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t}\n\n\t}\n\n\t_setValue_array_setNeedsUpdate( buffer, offset ) {\n\n\t\tconst dest = this.resolvedProperty;\n\n\t\tfor ( let i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t}\n\n\t\tthis.targetObject.needsUpdate = true;\n\n\t}\n\n\t_setValue_array_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\tconst dest = this.resolvedProperty;\n\n\t\tfor ( let i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t}\n\n\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t}\n\n\t// ArrayElement\n\n\t_setValue_arrayElement( buffer, offset ) {\n\n\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\n\t}\n\n\t_setValue_arrayElement_setNeedsUpdate( buffer, offset ) {\n\n\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\t\tthis.targetObject.needsUpdate = true;\n\n\t}\n\n\t_setValue_arrayElement_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t}\n\n\t// HasToFromArray\n\n\t_setValue_fromArray( buffer, offset ) {\n\n\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\n\t}\n\n\t_setValue_fromArray_setNeedsUpdate( buffer, offset ) {\n\n\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\t\tthis.targetObject.needsUpdate = true;\n\n\t}\n\n\t_setValue_fromArray_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t}\n\n\t_getValue_unbound( targetArray, offset ) {\n\n\t\tthis.bind();\n\t\tthis.getValue( targetArray, offset );\n\n\t}\n\n\t_setValue_unbound( sourceArray, offset ) {\n\n\t\tthis.bind();\n\t\tthis.setValue( sourceArray, offset );\n\n\t}\n\n\t/**\n\t * Creates a getter / setter pair for the property tracked by this binding.\n\t */\n\tbind() {\n\n\t\tlet targetObject = this.node;\n\t\tconst parsedPath = this.parsedPath;\n\n\t\tconst objectName = parsedPath.objectName;\n\t\tconst propertyName = parsedPath.propertyName;\n\t\tlet propertyIndex = parsedPath.propertyIndex;\n\n\t\tif ( ! targetObject ) {\n\n\t\t\ttargetObject = PropertyBinding.findNode( this.rootNode, parsedPath.nodeName );\n\n\t\t\tthis.node = targetObject;\n\n\t\t}\n\n\t\t// set fail state so we can just 'return' on error\n\t\tthis.getValue = this._getValue_unavailable;\n\t\tthis.setValue = this._setValue_unavailable;\n\n\t\t// ensure there is a value node\n\t\tif ( ! targetObject ) {\n\n\t\t\twarn( 'PropertyBinding: No target node found for track: ' + this.path + '.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( objectName ) {\n\n\t\t\tlet objectIndex = parsedPath.objectIndex;\n\n\t\t\t// special cases were we need to reach deeper into the hierarchy to get the face materials....\n\t\t\tswitch ( objectName ) {\n\n\t\t\t\tcase 'materials':\n\n\t\t\t\t\tif ( ! targetObject.material ) {\n\n\t\t\t\t\t\terror( 'PropertyBinding: Can not bind to material as node does not have a material.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! targetObject.material.materials ) {\n\n\t\t\t\t\t\terror( 'PropertyBinding: Can not bind to material.materials as node.material does not have a materials array.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttargetObject = targetObject.material.materials;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'bones':\n\n\t\t\t\t\tif ( ! targetObject.skeleton ) {\n\n\t\t\t\t\t\terror( 'PropertyBinding: Can not bind to bones as node does not have a skeleton.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// potential future optimization: skip this if propertyIndex is already an integer\n\t\t\t\t\t// and convert the integer string to a true integer.\n\n\t\t\t\t\ttargetObject = targetObject.skeleton.bones;\n\n\t\t\t\t\t// support resolving morphTarget names into indices.\n\t\t\t\t\tfor ( let i = 0; i < targetObject.length; i ++ ) {\n\n\t\t\t\t\t\tif ( targetObject[ i ].name === objectIndex ) {\n\n\t\t\t\t\t\t\tobjectIndex = i;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'map':\n\n\t\t\t\t\tif ( 'map' in targetObject ) {\n\n\t\t\t\t\t\ttargetObject = targetObject.map;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! targetObject.material ) {\n\n\t\t\t\t\t\terror( 'PropertyBinding: Can not bind to material as node does not have a material.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! targetObject.material.map ) {\n\n\t\t\t\t\t\terror( 'PropertyBinding: Can not bind to material.map as node.material does not have a map.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttargetObject = targetObject.material.map;\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tif ( targetObject[ objectName ] === undefined ) {\n\n\t\t\t\t\t\terror( 'PropertyBinding: Can not bind to objectName of node undefined.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttargetObject = targetObject[ objectName ];\n\n\t\t\t}\n\n\n\t\t\tif ( objectIndex !== undefined ) {\n\n\t\t\t\tif ( targetObject[ objectIndex ] === undefined ) {\n\n\t\t\t\t\terror( 'PropertyBinding: Trying to bind to objectIndex of objectName, but is undefined.', this, targetObject );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\ttargetObject = targetObject[ objectIndex ];\n\n\t\t\t}\n\n\t\t}\n\n\t\t// resolve property\n\t\tconst nodeProperty = targetObject[ propertyName ];\n\n\t\tif ( nodeProperty === undefined ) {\n\n\t\t\tconst nodeName = parsedPath.nodeName;\n\n\t\t\terror( 'PropertyBinding: Trying to update property for track: ' + nodeName +\n\t\t\t\t'.' + propertyName + ' but it wasn\\'t found.', targetObject );\n\t\t\treturn;\n\n\t\t}\n\n\t\t// determine versioning scheme\n\t\tlet versioning = this.Versioning.None;\n\n\t\tthis.targetObject = targetObject;\n\n\t\tif ( targetObject.isMaterial === true ) {\n\n\t\t\tversioning = this.Versioning.NeedsUpdate;\n\n\t\t} else if ( targetObject.isObject3D === true ) {\n\n\t\t\tversioning = this.Versioning.MatrixWorldNeedsUpdate;\n\n\t\t}\n\n\t\t// determine how the property gets bound\n\t\tlet bindingType = this.BindingType.Direct;\n\n\t\tif ( propertyIndex !== undefined ) {\n\n\t\t\t// access a sub element of the property array (only primitives are supported right now)\n\n\t\t\tif ( propertyName === 'morphTargetInfluences' ) {\n\n\t\t\t\t// potential optimization, skip this if propertyIndex is already an integer, and convert the integer string to a true integer.\n\n\t\t\t\t// support resolving morphTarget names into indices.\n\t\t\t\tif ( ! targetObject.geometry ) {\n\n\t\t\t\t\terror( 'PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.', this );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tif ( ! targetObject.geometry.morphAttributes ) {\n\n\t\t\t\t\terror( 'PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphAttributes.', this );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tif ( targetObject.morphTargetDictionary[ propertyIndex ] !== undefined ) {\n\n\t\t\t\t\tpropertyIndex = targetObject.morphTargetDictionary[ propertyIndex ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tbindingType = this.BindingType.ArrayElement;\n\n\t\t\tthis.resolvedProperty = nodeProperty;\n\t\t\tthis.propertyIndex = propertyIndex;\n\n\t\t} else if ( nodeProperty.fromArray !== undefined && nodeProperty.toArray !== undefined ) {\n\n\t\t\t// must use copy for Object3D.Euler/Quaternion\n\n\t\t\tbindingType = this.BindingType.HasFromToArray;\n\n\t\t\tthis.resolvedProperty = nodeProperty;\n\n\t\t} else if ( Array.isArray( nodeProperty ) ) {\n\n\t\t\tbindingType = this.BindingType.EntireArray;\n\n\t\t\tthis.resolvedProperty = nodeProperty;\n\n\t\t} else {\n\n\t\t\tthis.propertyName = propertyName;\n\n\t\t}\n\n\t\t// select getter / setter\n\t\tthis.getValue = this.GetterByBindingType[ bindingType ];\n\t\tthis.setValue = this.SetterByBindingTypeAndVersioning[ bindingType ][ versioning ];\n\n\t}\n\n\t/**\n\t * Unbinds the property.\n\t */\n\tunbind() {\n\n\t\tthis.node = null;\n\n\t\t// back to the prototype version of getValue / setValue\n\t\t// note: avoiding to mutate the shape of 'this' via 'delete'\n\t\tthis.getValue = this._getValue_unbound;\n\t\tthis.setValue = this._setValue_unbound;\n\n\t}\n\n}\n\nPropertyBinding.Composite = Composite;\n\nPropertyBinding.prototype.BindingType = {\n\tDirect: 0,\n\tEntireArray: 1,\n\tArrayElement: 2,\n\tHasFromToArray: 3\n};\n\nPropertyBinding.prototype.Versioning = {\n\tNone: 0,\n\tNeedsUpdate: 1,\n\tMatrixWorldNeedsUpdate: 2\n};\n\nPropertyBinding.prototype.GetterByBindingType = [\n\n\tPropertyBinding.prototype._getValue_direct,\n\tPropertyBinding.prototype._getValue_array,\n\tPropertyBinding.prototype._getValue_arrayElement,\n\tPropertyBinding.prototype._getValue_toArray,\n\n];\n\nPropertyBinding.prototype.SetterByBindingTypeAndVersioning = [\n\n\t[\n\t\t// Direct\n\t\tPropertyBinding.prototype._setValue_direct,\n\t\tPropertyBinding.prototype._setValue_direct_setNeedsUpdate,\n\t\tPropertyBinding.prototype._setValue_direct_setMatrixWorldNeedsUpdate,\n\n\t], [\n\n\t\t// EntireArray\n\n\t\tPropertyBinding.prototype._setValue_array,\n\t\tPropertyBinding.prototype._setValue_array_setNeedsUpdate,\n\t\tPropertyBinding.prototype._setValue_array_setMatrixWorldNeedsUpdate,\n\n\t], [\n\n\t\t// ArrayElement\n\t\tPropertyBinding.prototype._setValue_arrayElement,\n\t\tPropertyBinding.prototype._setValue_arrayElement_setNeedsUpdate,\n\t\tPropertyBinding.prototype._setValue_arrayElement_setMatrixWorldNeedsUpdate,\n\n\t], [\n\n\t\t// HasToFromArray\n\t\tPropertyBinding.prototype._setValue_fromArray,\n\t\tPropertyBinding.prototype._setValue_fromArray_setNeedsUpdate,\n\t\tPropertyBinding.prototype._setValue_fromArray_setMatrixWorldNeedsUpdate,\n\n\t]\n\n];\n\n/**\n * A group of objects that receives a shared animation state.\n *\n * Usage:\n *\n * - Add objects you would otherwise pass as 'root' to the\n * constructor or the .clipAction method of AnimationMixer.\n * - Instead pass this object as 'root'.\n * - You can also add and remove objects later when the mixer is running.\n *\n * Note:\n *\n * - Objects of this class appear as one object to the mixer,\n * so cache control of the individual objects must be done on the group.\n *\n * Limitation:\n *\n * - The animated properties must be compatible among the all objects in the group.\n * - A single property can either be controlled through a target group or directly, but not both.\n */\nclass AnimationObjectGroup {\n\n\t/**\n\t * Constructs a new animation group.\n\t *\n\t * @param {...Object3D} arguments - An arbitrary number of 3D objects that share the same animation state.\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isAnimationObjectGroup = true;\n\n\t\t/**\n\t\t * The UUID of the 3D object.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.uuid = generateUUID();\n\n\t\t// cached objects followed by the active ones\n\t\tthis._objects = Array.prototype.slice.call( arguments );\n\n\t\tthis.nCachedObjects_ = 0; // threshold\n\t\t// note: read by PropertyBinding.Composite\n\n\t\tconst indices = {};\n\t\tthis._indicesByUUID = indices; // for bookkeeping\n\n\t\tfor ( let i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tindices[ arguments[ i ].uuid ] = i;\n\n\t\t}\n\n\t\tthis._paths = []; // inside: string\n\t\tthis._parsedPaths = []; // inside: { we don't care, here }\n\t\tthis._bindings = []; // inside: Array< PropertyBinding >\n\t\tthis._bindingsIndicesByPath = {}; // inside: indices in these arrays\n\n\t\tconst scope = this;\n\n\t\tthis.stats = {\n\n\t\t\tobjects: {\n\t\t\t\tget total() {\n\n\t\t\t\t\treturn scope._objects.length;\n\n\t\t\t\t},\n\t\t\t\tget inUse() {\n\n\t\t\t\t\treturn this.total - scope.nCachedObjects_;\n\n\t\t\t\t}\n\t\t\t},\n\t\t\tget bindingsPerObject() {\n\n\t\t\t\treturn scope._bindings.length;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t/**\n\t * Adds an arbitrary number of objects to this animation group.\n\t *\n\t * @param {...Object3D} arguments - The 3D objects to add.\n\t */\n\tadd() {\n\n\t\tconst objects = this._objects,\n\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\tpaths = this._paths,\n\t\t\tparsedPaths = this._parsedPaths,\n\t\t\tbindings = this._bindings,\n\t\t\tnBindings = bindings.length;\n\n\t\tlet knownObject = undefined,\n\t\t\tnObjects = objects.length,\n\t\t\tnCachedObjects = this.nCachedObjects_;\n\n\t\tfor ( let i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tconst object = arguments[ i ],\n\t\t\t\tuuid = object.uuid;\n\t\t\tlet index = indicesByUUID[ uuid ];\n\n\t\t\tif ( index === undefined ) {\n\n\t\t\t\t// unknown object -> add it to the ACTIVE region\n\n\t\t\t\tindex = nObjects ++;\n\t\t\t\tindicesByUUID[ uuid ] = index;\n\t\t\t\tobjects.push( object );\n\n\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\tbindings[ j ].push( new PropertyBinding( object, paths[ j ], parsedPaths[ j ] ) );\n\n\t\t\t\t}\n\n\t\t\t} else if ( index < nCachedObjects ) {\n\n\t\t\t\tknownObject = objects[ index ];\n\n\t\t\t\t// move existing object to the ACTIVE region\n\n\t\t\t\tconst firstActiveIndex = -- nCachedObjects,\n\t\t\t\t\tlastCachedObject = objects[ firstActiveIndex ];\n\n\t\t\t\tindicesByUUID[ lastCachedObject.uuid ] = index;\n\t\t\t\tobjects[ index ] = lastCachedObject;\n\n\t\t\t\tindicesByUUID[ uuid ] = firstActiveIndex;\n\t\t\t\tobjects[ firstActiveIndex ] = object;\n\n\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\tconst bindingsForPath = bindings[ j ],\n\t\t\t\t\t\tlastCached = bindingsForPath[ firstActiveIndex ];\n\n\t\t\t\t\tlet binding = bindingsForPath[ index ];\n\n\t\t\t\t\tbindingsForPath[ index ] = lastCached;\n\n\t\t\t\t\tif ( binding === undefined ) {\n\n\t\t\t\t\t\t// since we do not bother to create new bindings\n\t\t\t\t\t\t// for objects that are cached, the binding may\n\t\t\t\t\t\t// or may not exist\n\n\t\t\t\t\t\tbinding = new PropertyBinding( object, paths[ j ], parsedPaths[ j ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbindingsForPath[ firstActiveIndex ] = binding;\n\n\t\t\t\t}\n\n\t\t\t} else if ( objects[ index ] !== knownObject ) {\n\n\t\t\t\terror( 'AnimationObjectGroup: Different objects with the same UUID ' +\n\t\t\t\t\t'detected. Clean the caches or recreate your infrastructure when reloading scenes.' );\n\n\t\t\t} // else the object is already where we want it to be\n\n\t\t} // for arguments\n\n\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t}\n\n\t/**\n\t * Removes an arbitrary number of objects to this animation group\n\t *\n\t * @param {...Object3D} arguments - The 3D objects to remove.\n\t */\n\tremove() {\n\n\t\tconst objects = this._objects,\n\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\tbindings = this._bindings,\n\t\t\tnBindings = bindings.length;\n\n\t\tlet nCachedObjects = this.nCachedObjects_;\n\n\t\tfor ( let i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tconst object = arguments[ i ],\n\t\t\t\tuuid = object.uuid,\n\t\t\t\tindex = indicesByUUID[ uuid ];\n\n\t\t\tif ( index !== undefined && index >= nCachedObjects ) {\n\n\t\t\t\t// move existing object into the CACHED region\n\n\t\t\t\tconst lastCachedIndex = nCachedObjects ++,\n\t\t\t\t\tfirstActiveObject = objects[ lastCachedIndex ];\n\n\t\t\t\tindicesByUUID[ firstActiveObject.uuid ] = index;\n\t\t\t\tobjects[ index ] = firstActiveObject;\n\n\t\t\t\tindicesByUUID[ uuid ] = lastCachedIndex;\n\t\t\t\tobjects[ lastCachedIndex ] = object;\n\n\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\tconst bindingsForPath = bindings[ j ],\n\t\t\t\t\t\tfirstActive = bindingsForPath[ lastCachedIndex ],\n\t\t\t\t\t\tbinding = bindingsForPath[ index ];\n\n\t\t\t\t\tbindingsForPath[ index ] = firstActive;\n\t\t\t\t\tbindingsForPath[ lastCachedIndex ] = binding;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} // for arguments\n\n\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t}\n\n\t/**\n\t * Deallocates all memory resources for the passed 3D objects of this animation group.\n\t *\n\t * @param {...Object3D} arguments - The 3D objects to uncache.\n\t */\n\tuncache() {\n\n\t\tconst objects = this._objects,\n\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\tbindings = this._bindings,\n\t\t\tnBindings = bindings.length;\n\n\t\tlet nCachedObjects = this.nCachedObjects_,\n\t\t\tnObjects = objects.length;\n\n\t\tfor ( let i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tconst object = arguments[ i ],\n\t\t\t\tuuid = object.uuid,\n\t\t\t\tindex = indicesByUUID[ uuid ];\n\n\t\t\tif ( index !== undefined ) {\n\n\t\t\t\tdelete indicesByUUID[ uuid ];\n\n\t\t\t\tif ( index < nCachedObjects ) {\n\n\t\t\t\t\t// object is cached, shrink the CACHED region\n\n\t\t\t\t\tconst firstActiveIndex = -- nCachedObjects,\n\t\t\t\t\t\tlastCachedObject = objects[ firstActiveIndex ],\n\t\t\t\t\t\tlastIndex = -- nObjects,\n\t\t\t\t\t\tlastObject = objects[ lastIndex ];\n\n\t\t\t\t\t// last cached object takes this object's place\n\t\t\t\t\tindicesByUUID[ lastCachedObject.uuid ] = index;\n\t\t\t\t\tobjects[ index ] = lastCachedObject;\n\n\t\t\t\t\t// last object goes to the activated slot and pop\n\t\t\t\t\tindicesByUUID[ lastObject.uuid ] = firstActiveIndex;\n\t\t\t\t\tobjects[ firstActiveIndex ] = lastObject;\n\t\t\t\t\tobjects.pop();\n\n\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\tconst bindingsForPath = bindings[ j ],\n\t\t\t\t\t\t\tlastCached = bindingsForPath[ firstActiveIndex ],\n\t\t\t\t\t\t\tlast = bindingsForPath[ lastIndex ];\n\n\t\t\t\t\t\tbindingsForPath[ index ] = lastCached;\n\t\t\t\t\t\tbindingsForPath[ firstActiveIndex ] = last;\n\t\t\t\t\t\tbindingsForPath.pop();\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// object is active, just swap with the last and pop\n\n\t\t\t\t\tconst lastIndex = -- nObjects,\n\t\t\t\t\t\tlastObject = objects[ lastIndex ];\n\n\t\t\t\t\tif ( lastIndex > 0 ) {\n\n\t\t\t\t\t\tindicesByUUID[ lastObject.uuid ] = index;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tobjects[ index ] = lastObject;\n\t\t\t\t\tobjects.pop();\n\n\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\tconst bindingsForPath = bindings[ j ];\n\n\t\t\t\t\t\tbindingsForPath[ index ] = bindingsForPath[ lastIndex ];\n\t\t\t\t\t\tbindingsForPath.pop();\n\n\t\t\t\t\t}\n\n\t\t\t\t} // cached or active\n\n\t\t\t} // if object is known\n\n\t\t} // for arguments\n\n\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t}\n\n\t// Internal interface used by befriended PropertyBinding.Composite:\n\n\tsubscribe_( path, parsedPath ) {\n\n\t\t// returns an array of bindings for the given path that is changed\n\t\t// according to the contained objects in the group\n\n\t\tconst indicesByPath = this._bindingsIndicesByPath;\n\t\tlet index = indicesByPath[ path ];\n\t\tconst bindings = this._bindings;\n\n\t\tif ( index !== undefined ) return bindings[ index ];\n\n\t\tconst paths = this._paths,\n\t\t\tparsedPaths = this._parsedPaths,\n\t\t\tobjects = this._objects,\n\t\t\tnObjects = objects.length,\n\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\tbindingsForPath = new Array( nObjects );\n\n\t\tindex = bindings.length;\n\n\t\tindicesByPath[ path ] = index;\n\n\t\tpaths.push( path );\n\t\tparsedPaths.push( parsedPath );\n\t\tbindings.push( bindingsForPath );\n\n\t\tfor ( let i = nCachedObjects, n = objects.length; i !== n; ++ i ) {\n\n\t\t\tconst object = objects[ i ];\n\t\t\tbindingsForPath[ i ] = new PropertyBinding( object, path, parsedPath );\n\n\t\t}\n\n\t\treturn bindingsForPath;\n\n\t}\n\n\tunsubscribe_( path ) {\n\n\t\t// tells the group to forget about a property path and no longer\n\t\t// update the array previously obtained with 'subscribe_'\n\n\t\tconst indicesByPath = this._bindingsIndicesByPath,\n\t\t\tindex = indicesByPath[ path ];\n\n\t\tif ( index !== undefined ) {\n\n\t\t\tconst paths = this._paths,\n\t\t\t\tparsedPaths = this._parsedPaths,\n\t\t\t\tbindings = this._bindings,\n\t\t\t\tlastBindingsIndex = bindings.length - 1,\n\t\t\t\tlastBindings = bindings[ lastBindingsIndex ],\n\t\t\t\tlastBindingsPath = path[ lastBindingsIndex ];\n\n\t\t\tindicesByPath[ lastBindingsPath ] = index;\n\n\t\t\tbindings[ index ] = lastBindings;\n\t\t\tbindings.pop();\n\n\t\t\tparsedPaths[ index ] = parsedPaths[ lastBindingsIndex ];\n\t\t\tparsedPaths.pop();\n\n\t\t\tpaths[ index ] = paths[ lastBindingsIndex ];\n\t\t\tpaths.pop();\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * An instance of `AnimationAction` schedules the playback of an animation which is\n * stored in {@link AnimationClip}.\n */\nclass AnimationAction {\n\n\t/**\n\t * Constructs a new animation action.\n\t *\n\t * @param {AnimationMixer} mixer - The mixer that is controlled by this action.\n\t * @param {AnimationClip} clip - The animation clip that holds the actual keyframes.\n\t * @param {?Object3D} [localRoot=null] - The root object on which this action is performed.\n\t * @param {(NormalAnimationBlendMode|AdditiveAnimationBlendMode)} [blendMode] - The blend mode.\n\t */\n\tconstructor( mixer, clip, localRoot = null, blendMode = clip.blendMode ) {\n\n\t\tthis._mixer = mixer;\n\t\tthis._clip = clip;\n\t\tthis._localRoot = localRoot;\n\n\t\t/**\n\t\t * Defines how the animation is blended/combined when two or more animations\n\t\t * are simultaneously played.\n\t\t *\n\t\t * @type {(NormalAnimationBlendMode|AdditiveAnimationBlendMode)}\n\t\t */\n\t\tthis.blendMode = blendMode;\n\n\t\tconst tracks = clip.tracks,\n\t\t\tnTracks = tracks.length,\n\t\t\tinterpolants = new Array( nTracks );\n\n\t\tconst interpolantSettings = {\n\t\t\tendingStart: ZeroCurvatureEnding,\n\t\t\tendingEnd: ZeroCurvatureEnding\n\t\t};\n\n\t\tfor ( let i = 0; i !== nTracks; ++ i ) {\n\n\t\t\tconst interpolant = tracks[ i ].createInterpolant( null );\n\t\t\tinterpolants[ i ] = interpolant;\n\t\t\tinterpolant.settings = interpolantSettings;\n\n\t\t}\n\n\t\tthis._interpolantSettings = interpolantSettings;\n\n\t\tthis._interpolants = interpolants; // bound by the mixer\n\n\t\t// inside: PropertyMixer (managed by the mixer)\n\t\tthis._propertyBindings = new Array( nTracks );\n\n\t\tthis._cacheIndex = null; // for the memory manager\n\t\tthis._byClipCacheIndex = null; // for the memory manager\n\n\t\tthis._timeScaleInterpolant = null;\n\t\tthis._weightInterpolant = null;\n\n\t\t/**\n\t\t * The loop mode, set via {@link AnimationAction#setLoop}.\n\t\t *\n\t\t * @type {(LoopRepeat|LoopOnce|LoopPingPong)}\n\t\t * @default LoopRepeat\n\t\t */\n\t\tthis.loop = LoopRepeat;\n\t\tthis._loopCount = -1;\n\n\t\t// global mixer time when the action is to be started\n\t\t// it's set back to 'null' upon start of the action\n\t\tthis._startTime = null;\n\n\t\t/**\n\t\t * The local time of this action (in seconds, starting with `0`).\n\t\t *\n\t\t * The value gets clamped or wrapped to `[0,clip.duration]` (according to the\n\t\t * loop state).\n\t\t *\n\t\t * @type {number}\n\t\t * @default Infinity\n\t\t */\n\t\tthis.time = 0;\n\n\t\t/**\n\t\t * Scaling factor for the {@link AnimationAction#time}. A value of `0` causes the\n\t\t * animation to pause. Negative values cause the animation to play backwards.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.timeScale = 1;\n\t\tthis._effectiveTimeScale = 1;\n\n\t\t/**\n\t\t * The degree of influence of this action (in the interval `[0, 1]`). Values\n\t\t * between `0` (no impact) and `1` (full impact) can be used to blend between\n\t\t * several actions.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.weight = 1;\n\t\tthis._effectiveWeight = 1;\n\n\t\t/**\n\t\t * The number of repetitions of the performed clip over the course of this action.\n\t\t * Can be set via {@link AnimationAction#setLoop}.\n\t\t *\n\t\t * Setting this number has no effect if {@link AnimationAction#loop} is set to\n\t\t * `THREE:LoopOnce`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default Infinity\n\t\t */\n\t\tthis.repetitions = Infinity;\n\n\t\t/**\n\t\t * If set to `true`, the playback of the action is paused.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.paused = false;\n\n\t\t/**\n\t\t * If set to `false`, the action is disabled so it has no impact.\n\t\t *\n\t\t * When the action is re-enabled, the animation continues from its current\n\t\t * time (setting `enabled` to `false` doesn't reset the action).\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.enabled = true;\n\n\t\t/**\n\t\t * If set to true the animation will automatically be paused on its last frame.\n\t\t *\n\t\t * If set to false, {@link AnimationAction#enabled} will automatically be switched\n\t\t * to `false` when the last loop of the action has finished, so that this action has\n\t\t * no further impact.\n\t\t *\n\t\t * Note: This member has no impact if the action is interrupted (it\n\t\t * has only an effect if its last loop has really finished).\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.clampWhenFinished = false;\n\n\t\t/**\n\t\t * Enables smooth interpolation without separate clips for start, loop and end.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.zeroSlopeAtStart = true;\n\n\t\t/**\n\t\t * Enables smooth interpolation without separate clips for start, loop and end.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.zeroSlopeAtEnd = true;\n\n\t}\n\n\t/**\n\t * Starts the playback of the animation.\n\t *\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tplay() {\n\n\t\tthis._mixer._activateAction( this );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Stops the playback of the animation.\n\t *\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tstop() {\n\n\t\tthis._mixer._deactivateAction( this );\n\n\t\treturn this.reset();\n\n\t}\n\n\t/**\n\t * Resets the playback of the animation.\n\t *\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\treset() {\n\n\t\tthis.paused = false;\n\t\tthis.enabled = true;\n\n\t\tthis.time = 0; // restart clip\n\t\tthis._loopCount = -1;// forget previous loops\n\t\tthis._startTime = null;// forget scheduling\n\n\t\treturn this.stopFading().stopWarping();\n\n\t}\n\n\t/**\n\t * Returns `true` if the animation is running.\n\t *\n\t * @return {boolean} Whether the animation is running or not.\n\t */\n\tisRunning() {\n\n\t\treturn this.enabled && ! this.paused && this.timeScale !== 0 &&\n\t\t\tthis._startTime === null && this._mixer._isActiveAction( this );\n\n\t}\n\n\t/**\n\t * Returns `true` when {@link AnimationAction#play} has been called.\n\t *\n\t * @return {boolean} Whether the animation is scheduled or not.\n\t */\n\tisScheduled() {\n\n\t\treturn this._mixer._isActiveAction( this );\n\n\t}\n\n\t/**\n\t * Defines the time when the animation should start.\n\t *\n\t * @param {number} time - The start time in seconds.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tstartAt( time ) {\n\n\t\tthis._startTime = time;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Configures the loop settings for this action.\n\t *\n\t * @param {(LoopRepeat|LoopOnce|LoopPingPong)} mode - The loop mode.\n\t * @param {number} repetitions - The number of repetitions.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tsetLoop( mode, repetitions ) {\n\n\t\tthis.loop = mode;\n\t\tthis.repetitions = repetitions;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the effective weight of this action.\n\t *\n\t * An action has no effect and thus an effective weight of zero when the\n\t * action is disabled.\n\t *\n\t * @param {number} weight - The weight to set.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tsetEffectiveWeight( weight ) {\n\n\t\tthis.weight = weight;\n\n\t\t// note: same logic as when updated at runtime\n\t\tthis._effectiveWeight = this.enabled ? weight : 0;\n\n\t\treturn this.stopFading();\n\n\t}\n\n\t/**\n\t * Returns the effective weight of this action.\n\t *\n\t * @return {number} The effective weight.\n\t */\n\tgetEffectiveWeight() {\n\n\t\treturn this._effectiveWeight;\n\n\t}\n\n\t/**\n\t * Fades the animation in by increasing its weight gradually from `0` to `1`,\n\t * within the passed time interval.\n\t *\n\t * @param {number} duration - The duration of the fade.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tfadeIn( duration ) {\n\n\t\treturn this._scheduleFading( duration, 0, 1 );\n\n\t}\n\n\t/**\n\t * Fades the animation out by decreasing its weight gradually from `1` to `0`,\n\t * within the passed time interval.\n\t *\n\t * @param {number} duration - The duration of the fade.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tfadeOut( duration ) {\n\n\t\treturn this._scheduleFading( duration, 1, 0 );\n\n\t}\n\n\t/**\n\t * Causes this action to fade in and the given action to fade out,\n\t * within the passed time interval.\n\t *\n\t * @param {AnimationAction} fadeOutAction - The animation action to fade out.\n\t * @param {number} duration - The duration of the fade.\n\t * @param {boolean} [warp=false] - Whether warping should be used or not.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tcrossFadeFrom( fadeOutAction, duration, warp = false ) {\n\n\t\tfadeOutAction.fadeOut( duration );\n\t\tthis.fadeIn( duration );\n\n\t\tif ( warp === true ) {\n\n\t\t\tconst fadeInDuration = this._clip.duration,\n\t\t\t\tfadeOutDuration = fadeOutAction._clip.duration,\n\n\t\t\t\tstartEndRatio = fadeOutDuration / fadeInDuration,\n\t\t\t\tendStartRatio = fadeInDuration / fadeOutDuration;\n\n\t\t\tfadeOutAction.warp( 1.0, startEndRatio, duration );\n\t\t\tthis.warp( endStartRatio, 1.0, duration );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Causes this action to fade out and the given action to fade in,\n\t * within the passed time interval.\n\t *\n\t * @param {AnimationAction} fadeInAction - The animation action to fade in.\n\t * @param {number} duration - The duration of the fade.\n\t * @param {boolean} [warp=false] - Whether warping should be used or not.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tcrossFadeTo( fadeInAction, duration, warp = false ) {\n\n\t\treturn fadeInAction.crossFadeFrom( this, duration, warp );\n\n\t}\n\n\t/**\n\t * Stops any fading which is applied to this action.\n\t *\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tstopFading() {\n\n\t\tconst weightInterpolant = this._weightInterpolant;\n\n\t\tif ( weightInterpolant !== null ) {\n\n\t\t\tthis._weightInterpolant = null;\n\t\t\tthis._mixer._takeBackControlInterpolant( weightInterpolant );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the effective time scale of this action.\n\t *\n\t * An action has no effect and thus an effective time scale of zero when the\n\t * action is paused.\n\t *\n\t * @param {number} timeScale - The time scale to set.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tsetEffectiveTimeScale( timeScale ) {\n\n\t\tthis.timeScale = timeScale;\n\t\tthis._effectiveTimeScale = this.paused ? 0 : timeScale;\n\n\t\treturn this.stopWarping();\n\n\t}\n\n\t/**\n\t * Returns the effective time scale of this action.\n\t *\n\t * @return {number} The effective time scale.\n\t */\n\tgetEffectiveTimeScale() {\n\n\t\treturn this._effectiveTimeScale;\n\n\t}\n\n\t/**\n\t * Sets the duration for a single loop of this action.\n\t *\n\t * @param {number} duration - The duration to set.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tsetDuration( duration ) {\n\n\t\tthis.timeScale = this._clip.duration / duration;\n\n\t\treturn this.stopWarping();\n\n\t}\n\n\t/**\n\t * Synchronizes this action with the passed other action.\n\t *\n\t * @param {AnimationAction} action - The action to sync with.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tsyncWith( action ) {\n\n\t\tthis.time = action.time;\n\t\tthis.timeScale = action.timeScale;\n\n\t\treturn this.stopWarping();\n\n\t}\n\n\t/**\n\t * Decelerates this animation's speed to `0` within the passed time interval.\n\t *\n\t * @param {number} duration - The duration.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\thalt( duration ) {\n\n\t\treturn this.warp( this._effectiveTimeScale, 0, duration );\n\n\t}\n\n\t/**\n\t * Changes the playback speed, within the passed time interval, by modifying\n\t * {@link AnimationAction#timeScale} gradually from `startTimeScale` to\n\t * `endTimeScale`.\n\t *\n\t * @param {number} startTimeScale - The start time scale.\n\t * @param {number} endTimeScale - The end time scale.\n\t * @param {number} duration - The duration.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\twarp( startTimeScale, endTimeScale, duration ) {\n\n\t\tconst mixer = this._mixer,\n\t\t\tnow = mixer.time,\n\t\t\ttimeScale = this.timeScale;\n\n\t\tlet interpolant = this._timeScaleInterpolant;\n\n\t\tif ( interpolant === null ) {\n\n\t\t\tinterpolant = mixer._lendControlInterpolant();\n\t\t\tthis._timeScaleInterpolant = interpolant;\n\n\t\t}\n\n\t\tconst times = interpolant.parameterPositions,\n\t\t\tvalues = interpolant.sampleValues;\n\n\t\ttimes[ 0 ] = now;\n\t\ttimes[ 1 ] = now + duration;\n\n\t\tvalues[ 0 ] = startTimeScale / timeScale;\n\t\tvalues[ 1 ] = endTimeScale / timeScale;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Stops any scheduled warping which is applied to this action.\n\t *\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tstopWarping() {\n\n\t\tconst timeScaleInterpolant = this._timeScaleInterpolant;\n\n\t\tif ( timeScaleInterpolant !== null ) {\n\n\t\t\tthis._timeScaleInterpolant = null;\n\t\t\tthis._mixer._takeBackControlInterpolant( timeScaleInterpolant );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the animation mixer of this animation action.\n\t *\n\t * @return {AnimationMixer} The animation mixer.\n\t */\n\tgetMixer() {\n\n\t\treturn this._mixer;\n\n\t}\n\n\t/**\n\t * Returns the animation clip of this animation action.\n\t *\n\t * @return {AnimationClip} The animation clip.\n\t */\n\tgetClip() {\n\n\t\treturn this._clip;\n\n\t}\n\n\t/**\n\t * Returns the root object of this animation action.\n\t *\n\t * @return {Object3D} The root object.\n\t */\n\tgetRoot() {\n\n\t\treturn this._localRoot || this._mixer._root;\n\n\t}\n\n\t// Interna\n\n\t_update( time, deltaTime, timeDirection, accuIndex ) {\n\n\t\t// called by the mixer\n\n\t\tif ( ! this.enabled ) {\n\n\t\t\t// call ._updateWeight() to update ._effectiveWeight\n\n\t\t\tthis._updateWeight( time );\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst startTime = this._startTime;\n\n\t\tif ( startTime !== null ) {\n\n\t\t\t// check for scheduled start of action\n\n\t\t\tconst timeRunning = ( time - startTime ) * timeDirection;\n\t\t\tif ( timeRunning < 0 || timeDirection === 0 ) {\n\n\t\t\t\tdeltaTime = 0;\n\n\t\t\t} else {\n\n\n\t\t\t\tthis._startTime = null; // unschedule\n\t\t\t\tdeltaTime = timeDirection * timeRunning;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// apply time scale and advance time\n\n\t\tdeltaTime *= this._updateTimeScale( time );\n\t\tconst clipTime = this._updateTime( deltaTime );\n\n\t\t// note: _updateTime may disable the action resulting in\n\t\t// an effective weight of 0\n\n\t\tconst weight = this._updateWeight( time );\n\n\t\tif ( weight > 0 ) {\n\n\t\t\tconst interpolants = this._interpolants;\n\t\t\tconst propertyMixers = this._propertyBindings;\n\n\t\t\tswitch ( this.blendMode ) {\n\n\t\t\t\tcase AdditiveAnimationBlendMode:\n\n\t\t\t\t\tfor ( let j = 0, m = interpolants.length; j !== m; ++ j ) {\n\n\t\t\t\t\t\tinterpolants[ j ].evaluate( clipTime );\n\t\t\t\t\t\tpropertyMixers[ j ].accumulateAdditive( weight );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase NormalAnimationBlendMode:\n\t\t\t\tdefault:\n\n\t\t\t\t\tfor ( let j = 0, m = interpolants.length; j !== m; ++ j ) {\n\n\t\t\t\t\t\tinterpolants[ j ].evaluate( clipTime );\n\t\t\t\t\t\tpropertyMixers[ j ].accumulate( accuIndex, weight );\n\n\t\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_updateWeight( time ) {\n\n\t\tlet weight = 0;\n\n\t\tif ( this.enabled ) {\n\n\t\t\tweight = this.weight;\n\t\t\tconst interpolant = this._weightInterpolant;\n\n\t\t\tif ( interpolant !== null ) {\n\n\t\t\t\tconst interpolantValue = interpolant.evaluate( time )[ 0 ];\n\n\t\t\t\tweight *= interpolantValue;\n\n\t\t\t\tif ( time > interpolant.parameterPositions[ 1 ] ) {\n\n\t\t\t\t\tthis.stopFading();\n\n\t\t\t\t\tif ( interpolantValue === 0 ) {\n\n\t\t\t\t\t\t// faded out, disable\n\t\t\t\t\t\tthis.enabled = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis._effectiveWeight = weight;\n\t\treturn weight;\n\n\t}\n\n\t_updateTimeScale( time ) {\n\n\t\tlet timeScale = 0;\n\n\t\tif ( ! this.paused ) {\n\n\t\t\ttimeScale = this.timeScale;\n\n\t\t\tconst interpolant = this._timeScaleInterpolant;\n\n\t\t\tif ( interpolant !== null ) {\n\n\t\t\t\tconst interpolantValue = interpolant.evaluate( time )[ 0 ];\n\n\t\t\t\ttimeScale *= interpolantValue;\n\n\t\t\t\tif ( time > interpolant.parameterPositions[ 1 ] ) {\n\n\t\t\t\t\tthis.stopWarping();\n\n\t\t\t\t\tif ( timeScale === 0 ) {\n\n\t\t\t\t\t\t// motion has halted, pause\n\t\t\t\t\t\tthis.paused = true;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// warp done - apply final time scale\n\t\t\t\t\t\tthis.timeScale = timeScale;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis._effectiveTimeScale = timeScale;\n\t\treturn timeScale;\n\n\t}\n\n\t_updateTime( deltaTime ) {\n\n\t\tconst duration = this._clip.duration;\n\t\tconst loop = this.loop;\n\n\t\tlet time = this.time + deltaTime;\n\t\tlet loopCount = this._loopCount;\n\n\t\tconst pingPong = ( loop === LoopPingPong );\n\n\t\tif ( deltaTime === 0 ) {\n\n\t\t\tif ( loopCount === -1 ) return time;\n\n\t\t\treturn ( pingPong && ( loopCount & 1 ) === 1 ) ? duration - time : time;\n\n\t\t}\n\n\t\tif ( loop === LoopOnce ) {\n\n\t\t\tif ( loopCount === -1 ) {\n\n\t\t\t\t// just started\n\n\t\t\t\tthis._loopCount = 0;\n\t\t\t\tthis._setEndings( true, true, false );\n\n\t\t\t}\n\n\t\t\thandle_stop: {\n\n\t\t\t\tif ( time >= duration ) {\n\n\t\t\t\t\ttime = duration;\n\n\t\t\t\t} else if ( time < 0 ) {\n\n\t\t\t\t\ttime = 0;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis.time = time;\n\n\t\t\t\t\tbreak handle_stop;\n\n\t\t\t\t}\n\n\t\t\t\tif ( this.clampWhenFinished ) this.paused = true;\n\t\t\t\telse this.enabled = false;\n\n\t\t\t\tthis.time = time;\n\n\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\ttype: 'finished', action: this,\n\t\t\t\t\tdirection: deltaTime < 0 ? -1 : 1\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t} else { // repetitive Repeat or PingPong\n\n\t\t\tif ( loopCount === -1 ) {\n\n\t\t\t\t// just started\n\n\t\t\t\tif ( deltaTime >= 0 ) {\n\n\t\t\t\t\tloopCount = 0;\n\n\t\t\t\t\tthis._setEndings( true, this.repetitions === 0, pingPong );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// when looping in reverse direction, the initial\n\t\t\t\t\t// transition through zero counts as a repetition,\n\t\t\t\t\t// so leave loopCount at -1\n\n\t\t\t\t\tthis._setEndings( this.repetitions === 0, true, pingPong );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( time >= duration || time < 0 ) {\n\n\t\t\t\t// wrap around\n\n\t\t\t\tconst loopDelta = Math.floor( time / duration ); // signed\n\t\t\t\ttime -= duration * loopDelta;\n\n\t\t\t\tloopCount += Math.abs( loopDelta );\n\n\t\t\t\tconst pending = this.repetitions - loopCount;\n\n\t\t\t\tif ( pending <= 0 ) {\n\n\t\t\t\t\t// have to stop (switch state, clamp time, fire event)\n\n\t\t\t\t\tif ( this.clampWhenFinished ) this.paused = true;\n\t\t\t\t\telse this.enabled = false;\n\n\t\t\t\t\ttime = deltaTime > 0 ? duration : 0;\n\n\t\t\t\t\tthis.time = time;\n\n\t\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\t\ttype: 'finished', action: this,\n\t\t\t\t\t\tdirection: deltaTime > 0 ? 1 : -1\n\t\t\t\t\t} );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// keep running\n\n\t\t\t\t\tif ( pending === 1 ) {\n\n\t\t\t\t\t\t// entering the last round\n\n\t\t\t\t\t\tconst atStart = deltaTime < 0;\n\t\t\t\t\t\tthis._setEndings( atStart, ! atStart, pingPong );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tthis._setEndings( false, false, pingPong );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis._loopCount = loopCount;\n\n\t\t\t\t\tthis.time = time;\n\n\t\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\t\ttype: 'loop', action: this, loopDelta: loopDelta\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tthis.time = time;\n\n\t\t\t}\n\n\t\t\tif ( pingPong && ( loopCount & 1 ) === 1 ) {\n\n\t\t\t\t// invert time for the \"pong round\"\n\n\t\t\t\treturn duration - time;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn time;\n\n\t}\n\n\t_setEndings( atStart, atEnd, pingPong ) {\n\n\t\tconst settings = this._interpolantSettings;\n\n\t\tif ( pingPong ) {\n\n\t\t\tsettings.endingStart = ZeroSlopeEnding;\n\t\t\tsettings.endingEnd = ZeroSlopeEnding;\n\n\t\t} else {\n\n\t\t\t// assuming for LoopOnce atStart == atEnd == true\n\n\t\t\tif ( atStart ) {\n\n\t\t\t\tsettings.endingStart = this.zeroSlopeAtStart ? ZeroSlopeEnding : ZeroCurvatureEnding;\n\n\t\t\t} else {\n\n\t\t\t\tsettings.endingStart = WrapAroundEnding;\n\n\t\t\t}\n\n\t\t\tif ( atEnd ) {\n\n\t\t\t\tsettings.endingEnd = this.zeroSlopeAtEnd ? ZeroSlopeEnding : ZeroCurvatureEnding;\n\n\t\t\t} else {\n\n\t\t\t\tsettings.endingEnd \t = WrapAroundEnding;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_scheduleFading( duration, weightNow, weightThen ) {\n\n\t\tconst mixer = this._mixer, now = mixer.time;\n\t\tlet interpolant = this._weightInterpolant;\n\n\t\tif ( interpolant === null ) {\n\n\t\t\tinterpolant = mixer._lendControlInterpolant();\n\t\t\tthis._weightInterpolant = interpolant;\n\n\t\t}\n\n\t\tconst times = interpolant.parameterPositions,\n\t\t\tvalues = interpolant.sampleValues;\n\n\t\ttimes[ 0 ] = now;\n\t\tvalues[ 0 ] = weightNow;\n\t\ttimes[ 1 ] = now + duration;\n\t\tvalues[ 1 ] = weightThen;\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _controlInterpolantsResultBuffer = new Float32Array( 1 );\n\n/**\n * `AnimationMixer` is a player for animations on a particular object in\n * the scene. When multiple objects in the scene are animated independently,\n * one `AnimationMixer` may be used for each object.\n */\nclass AnimationMixer extends EventDispatcher {\n\n\t/**\n\t * Constructs a new animation mixer.\n\t *\n\t * @param {Object3D} root - The object whose animations shall be played by this mixer.\n\t */\n\tconstructor( root ) {\n\n\t\tsuper();\n\n\t\tthis._root = root;\n\t\tthis._initMemoryManager();\n\t\tthis._accuIndex = 0;\n\n\t\t/**\n\t\t * The global mixer time (in seconds; starting with `0` on the mixer's creation).\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.time = 0;\n\n\t\t/**\n\t\t * A scaling factor for the global time.\n\t\t *\n\t\t * Note: Setting this member to `0` and later back to `1` is a\n\t\t * possibility to pause/unpause all actions that are controlled by this\n\t\t * mixer.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.timeScale = 1.0;\n\n\t}\n\n\t_bindAction( action, prototypeAction ) {\n\n\t\tconst root = action._localRoot || this._root,\n\t\t\ttracks = action._clip.tracks,\n\t\t\tnTracks = tracks.length,\n\t\t\tbindings = action._propertyBindings,\n\t\t\tinterpolants = action._interpolants,\n\t\t\trootUuid = root.uuid,\n\t\t\tbindingsByRoot = this._bindingsByRootAndName;\n\n\t\tlet bindingsByName = bindingsByRoot[ rootUuid ];\n\n\t\tif ( bindingsByName === undefined ) {\n\n\t\t\tbindingsByName = {};\n\t\t\tbindingsByRoot[ rootUuid ] = bindingsByName;\n\n\t\t}\n\n\t\tfor ( let i = 0; i !== nTracks; ++ i ) {\n\n\t\t\tconst track = tracks[ i ],\n\t\t\t\ttrackName = track.name;\n\n\t\t\tlet binding = bindingsByName[ trackName ];\n\n\t\t\tif ( binding !== undefined ) {\n\n\t\t\t\t++ binding.referenceCount;\n\t\t\t\tbindings[ i ] = binding;\n\n\t\t\t} else {\n\n\t\t\t\tbinding = bindings[ i ];\n\n\t\t\t\tif ( binding !== undefined ) {\n\n\t\t\t\t\t// existing binding, make sure the cache knows\n\n\t\t\t\t\tif ( binding._cacheIndex === null ) {\n\n\t\t\t\t\t\t++ binding.referenceCount;\n\t\t\t\t\t\tthis._addInactiveBinding( binding, rootUuid, trackName );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tconst path = prototypeAction && prototypeAction.\n\t\t\t\t\t_propertyBindings[ i ].binding.parsedPath;\n\n\t\t\t\tbinding = new PropertyMixer(\n\t\t\t\t\tPropertyBinding.create( root, trackName, path ),\n\t\t\t\t\ttrack.ValueTypeName, track.getValueSize() );\n\n\t\t\t\t++ binding.referenceCount;\n\t\t\t\tthis._addInactiveBinding( binding, rootUuid, trackName );\n\n\t\t\t\tbindings[ i ] = binding;\n\n\t\t\t}\n\n\t\t\tinterpolants[ i ].resultBuffer = binding.buffer;\n\n\t\t}\n\n\t}\n\n\t_activateAction( action ) {\n\n\t\tif ( ! this._isActiveAction( action ) ) {\n\n\t\t\tif ( action._cacheIndex === null ) {\n\n\t\t\t\t// this action has been forgotten by the cache, but the user\n\t\t\t\t// appears to be still using it -> rebind\n\n\t\t\t\tconst rootUuid = ( action._localRoot || this._root ).uuid,\n\t\t\t\t\tclipUuid = action._clip.uuid,\n\t\t\t\t\tactionsForClip = this._actionsByClip[ clipUuid ];\n\n\t\t\t\tthis._bindAction( action,\n\t\t\t\t\tactionsForClip && actionsForClip.knownActions[ 0 ] );\n\n\t\t\t\tthis._addInactiveAction( action, clipUuid, rootUuid );\n\n\t\t\t}\n\n\t\t\tconst bindings = action._propertyBindings;\n\n\t\t\t// increment reference counts / sort out state\n\t\t\tfor ( let i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tconst binding = bindings[ i ];\n\n\t\t\t\tif ( binding.useCount ++ === 0 ) {\n\n\t\t\t\t\tthis._lendBinding( binding );\n\t\t\t\t\tbinding.saveOriginalState();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis._lendAction( action );\n\n\t\t}\n\n\t}\n\n\t_deactivateAction( action ) {\n\n\t\tif ( this._isActiveAction( action ) ) {\n\n\t\t\tconst bindings = action._propertyBindings;\n\n\t\t\t// decrement reference counts / sort out state\n\t\t\tfor ( let i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tconst binding = bindings[ i ];\n\n\t\t\t\tif ( -- binding.useCount === 0 ) {\n\n\t\t\t\t\tbinding.restoreOriginalState();\n\t\t\t\t\tthis._takeBackBinding( binding );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis._takeBackAction( action );\n\n\t\t}\n\n\t}\n\n\t// Memory manager\n\n\t_initMemoryManager() {\n\n\t\tthis._actions = []; // 'nActiveActions' followed by inactive ones\n\t\tthis._nActiveActions = 0;\n\n\t\tthis._actionsByClip = {};\n\t\t// inside:\n\t\t// {\n\t\t// \tknownActions: Array< AnimationAction > - used as prototypes\n\t\t// \tactionByRoot: AnimationAction - lookup\n\t\t// }\n\n\n\t\tthis._bindings = []; // 'nActiveBindings' followed by inactive ones\n\t\tthis._nActiveBindings = 0;\n\n\t\tthis._bindingsByRootAndName = {}; // inside: Map< name, PropertyMixer >\n\n\n\t\tthis._controlInterpolants = []; // same game as above\n\t\tthis._nActiveControlInterpolants = 0;\n\n\t\tconst scope = this;\n\n\t\tthis.stats = {\n\n\t\t\tactions: {\n\t\t\t\tget total() {\n\n\t\t\t\t\treturn scope._actions.length;\n\n\t\t\t\t},\n\t\t\t\tget inUse() {\n\n\t\t\t\t\treturn scope._nActiveActions;\n\n\t\t\t\t}\n\t\t\t},\n\t\t\tbindings: {\n\t\t\t\tget total() {\n\n\t\t\t\t\treturn scope._bindings.length;\n\n\t\t\t\t},\n\t\t\t\tget inUse() {\n\n\t\t\t\t\treturn scope._nActiveBindings;\n\n\t\t\t\t}\n\t\t\t},\n\t\t\tcontrolInterpolants: {\n\t\t\t\tget total() {\n\n\t\t\t\t\treturn scope._controlInterpolants.length;\n\n\t\t\t\t},\n\t\t\t\tget inUse() {\n\n\t\t\t\t\treturn scope._nActiveControlInterpolants;\n\n\t\t\t\t}\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t// Memory management for AnimationAction objects\n\n\t_isActiveAction( action ) {\n\n\t\tconst index = action._cacheIndex;\n\t\treturn index !== null && index < this._nActiveActions;\n\n\t}\n\n\t_addInactiveAction( action, clipUuid, rootUuid ) {\n\n\t\tconst actions = this._actions,\n\t\t\tactionsByClip = this._actionsByClip;\n\n\t\tlet actionsForClip = actionsByClip[ clipUuid ];\n\n\t\tif ( actionsForClip === undefined ) {\n\n\t\t\tactionsForClip = {\n\n\t\t\t\tknownActions: [ action ],\n\t\t\t\tactionByRoot: {}\n\n\t\t\t};\n\n\t\t\taction._byClipCacheIndex = 0;\n\n\t\t\tactionsByClip[ clipUuid ] = actionsForClip;\n\n\t\t} else {\n\n\t\t\tconst knownActions = actionsForClip.knownActions;\n\n\t\t\taction._byClipCacheIndex = knownActions.length;\n\t\t\tknownActions.push( action );\n\n\t\t}\n\n\t\taction._cacheIndex = actions.length;\n\t\tactions.push( action );\n\n\t\tactionsForClip.actionByRoot[ rootUuid ] = action;\n\n\t}\n\n\t_removeInactiveAction( action ) {\n\n\t\tconst actions = this._actions,\n\t\t\tlastInactiveAction = actions[ actions.length - 1 ],\n\t\t\tcacheIndex = action._cacheIndex;\n\n\t\tlastInactiveAction._cacheIndex = cacheIndex;\n\t\tactions[ cacheIndex ] = lastInactiveAction;\n\t\tactions.pop();\n\n\t\taction._cacheIndex = null;\n\n\n\t\tconst clipUuid = action._clip.uuid,\n\t\t\tactionsByClip = this._actionsByClip,\n\t\t\tactionsForClip = actionsByClip[ clipUuid ],\n\t\t\tknownActionsForClip = actionsForClip.knownActions,\n\n\t\t\tlastKnownAction =\n\t\t\t\tknownActionsForClip[ knownActionsForClip.length - 1 ],\n\n\t\t\tbyClipCacheIndex = action._byClipCacheIndex;\n\n\t\tlastKnownAction._byClipCacheIndex = byClipCacheIndex;\n\t\tknownActionsForClip[ byClipCacheIndex ] = lastKnownAction;\n\t\tknownActionsForClip.pop();\n\n\t\taction._byClipCacheIndex = null;\n\n\n\t\tconst actionByRoot = actionsForClip.actionByRoot,\n\t\t\trootUuid = ( action._localRoot || this._root ).uuid;\n\n\t\tdelete actionByRoot[ rootUuid ];\n\n\t\tif ( knownActionsForClip.length === 0 ) {\n\n\t\t\tdelete actionsByClip[ clipUuid ];\n\n\t\t}\n\n\t\tthis._removeInactiveBindingsForAction( action );\n\n\t}\n\n\t_removeInactiveBindingsForAction( action ) {\n\n\t\tconst bindings = action._propertyBindings;\n\n\t\tfor ( let i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\tconst binding = bindings[ i ];\n\n\t\t\tif ( -- binding.referenceCount === 0 ) {\n\n\t\t\t\tthis._removeInactiveBinding( binding );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_lendAction( action ) {\n\n\t\t// [ active actions |  inactive actions  ]\n\t\t// [  active actions >| inactive actions ]\n\t\t//                 s        a\n\t\t//                  <-swap->\n\t\t//                 a        s\n\n\t\tconst actions = this._actions,\n\t\t\tprevIndex = action._cacheIndex,\n\n\t\t\tlastActiveIndex = this._nActiveActions ++,\n\n\t\t\tfirstInactiveAction = actions[ lastActiveIndex ];\n\n\t\taction._cacheIndex = lastActiveIndex;\n\t\tactions[ lastActiveIndex ] = action;\n\n\t\tfirstInactiveAction._cacheIndex = prevIndex;\n\t\tactions[ prevIndex ] = firstInactiveAction;\n\n\t}\n\n\t_takeBackAction( action ) {\n\n\t\t// [  active actions  | inactive actions ]\n\t\t// [ active actions |< inactive actions  ]\n\t\t//        a        s\n\t\t//         <-swap->\n\t\t//        s        a\n\n\t\tconst actions = this._actions,\n\t\t\tprevIndex = action._cacheIndex,\n\n\t\t\tfirstInactiveIndex = -- this._nActiveActions,\n\n\t\t\tlastActiveAction = actions[ firstInactiveIndex ];\n\n\t\taction._cacheIndex = firstInactiveIndex;\n\t\tactions[ firstInactiveIndex ] = action;\n\n\t\tlastActiveAction._cacheIndex = prevIndex;\n\t\tactions[ prevIndex ] = lastActiveAction;\n\n\t}\n\n\t// Memory management for PropertyMixer objects\n\n\t_addInactiveBinding( binding, rootUuid, trackName ) {\n\n\t\tconst bindingsByRoot = this._bindingsByRootAndName,\n\t\t\tbindings = this._bindings;\n\n\t\tlet bindingByName = bindingsByRoot[ rootUuid ];\n\n\t\tif ( bindingByName === undefined ) {\n\n\t\t\tbindingByName = {};\n\t\t\tbindingsByRoot[ rootUuid ] = bindingByName;\n\n\t\t}\n\n\t\tbindingByName[ trackName ] = binding;\n\n\t\tbinding._cacheIndex = bindings.length;\n\t\tbindings.push( binding );\n\n\t}\n\n\t_removeInactiveBinding( binding ) {\n\n\t\tconst bindings = this._bindings,\n\t\t\tpropBinding = binding.binding,\n\t\t\trootUuid = propBinding.rootNode.uuid,\n\t\t\ttrackName = propBinding.path,\n\t\t\tbindingsByRoot = this._bindingsByRootAndName,\n\t\t\tbindingByName = bindingsByRoot[ rootUuid ],\n\n\t\t\tlastInactiveBinding = bindings[ bindings.length - 1 ],\n\t\t\tcacheIndex = binding._cacheIndex;\n\n\t\tlastInactiveBinding._cacheIndex = cacheIndex;\n\t\tbindings[ cacheIndex ] = lastInactiveBinding;\n\t\tbindings.pop();\n\n\t\tdelete bindingByName[ trackName ];\n\n\t\tif ( Object.keys( bindingByName ).length === 0 ) {\n\n\t\t\tdelete bindingsByRoot[ rootUuid ];\n\n\t\t}\n\n\t}\n\n\t_lendBinding( binding ) {\n\n\t\tconst bindings = this._bindings,\n\t\t\tprevIndex = binding._cacheIndex,\n\n\t\t\tlastActiveIndex = this._nActiveBindings ++,\n\n\t\t\tfirstInactiveBinding = bindings[ lastActiveIndex ];\n\n\t\tbinding._cacheIndex = lastActiveIndex;\n\t\tbindings[ lastActiveIndex ] = binding;\n\n\t\tfirstInactiveBinding._cacheIndex = prevIndex;\n\t\tbindings[ prevIndex ] = firstInactiveBinding;\n\n\t}\n\n\t_takeBackBinding( binding ) {\n\n\t\tconst bindings = this._bindings,\n\t\t\tprevIndex = binding._cacheIndex,\n\n\t\t\tfirstInactiveIndex = -- this._nActiveBindings,\n\n\t\t\tlastActiveBinding = bindings[ firstInactiveIndex ];\n\n\t\tbinding._cacheIndex = firstInactiveIndex;\n\t\tbindings[ firstInactiveIndex ] = binding;\n\n\t\tlastActiveBinding._cacheIndex = prevIndex;\n\t\tbindings[ prevIndex ] = lastActiveBinding;\n\n\t}\n\n\n\t// Memory management of Interpolants for weight and time scale\n\n\t_lendControlInterpolant() {\n\n\t\tconst interpolants = this._controlInterpolants,\n\t\t\tlastActiveIndex = this._nActiveControlInterpolants ++;\n\n\t\tlet interpolant = interpolants[ lastActiveIndex ];\n\n\t\tif ( interpolant === undefined ) {\n\n\t\t\tinterpolant = new LinearInterpolant(\n\t\t\t\tnew Float32Array( 2 ), new Float32Array( 2 ),\n\t\t\t\t1, _controlInterpolantsResultBuffer );\n\n\t\t\tinterpolant.__cacheIndex = lastActiveIndex;\n\t\t\tinterpolants[ lastActiveIndex ] = interpolant;\n\n\t\t}\n\n\t\treturn interpolant;\n\n\t}\n\n\t_takeBackControlInterpolant( interpolant ) {\n\n\t\tconst interpolants = this._controlInterpolants,\n\t\t\tprevIndex = interpolant.__cacheIndex,\n\n\t\t\tfirstInactiveIndex = -- this._nActiveControlInterpolants,\n\n\t\t\tlastActiveInterpolant = interpolants[ firstInactiveIndex ];\n\n\t\tinterpolant.__cacheIndex = firstInactiveIndex;\n\t\tinterpolants[ firstInactiveIndex ] = interpolant;\n\n\t\tlastActiveInterpolant.__cacheIndex = prevIndex;\n\t\tinterpolants[ prevIndex ] = lastActiveInterpolant;\n\n\t}\n\n\t/**\n\t * Returns an instance of {@link AnimationAction} for the passed clip.\n\t *\n\t * If an action fitting the clip and root parameters doesn't yet exist, it\n\t * will be created by this method. Calling this method several times with the\n\t * same clip and root parameters always returns the same action.\n\t *\n\t * @param {AnimationClip|string} clip - An animation clip or alternatively the name of the animation clip.\n\t * @param {Object3D} [optionalRoot] - An alternative root object.\n\t * @param {(NormalAnimationBlendMode|AdditiveAnimationBlendMode)} [blendMode] - The blend mode.\n\t * @return {?AnimationAction} The animation action.\n\t */\n\tclipAction( clip, optionalRoot, blendMode ) {\n\n\t\tconst root = optionalRoot || this._root,\n\t\t\trootUuid = root.uuid;\n\n\t\tlet clipObject = typeof clip === 'string' ? AnimationClip.findByName( root, clip ) : clip;\n\n\t\tconst clipUuid = clipObject !== null ? clipObject.uuid : clip;\n\n\t\tconst actionsForClip = this._actionsByClip[ clipUuid ];\n\t\tlet prototypeAction = null;\n\n\t\tif ( blendMode === undefined ) {\n\n\t\t\tif ( clipObject !== null ) {\n\n\t\t\t\tblendMode = clipObject.blendMode;\n\n\t\t\t} else {\n\n\t\t\t\tblendMode = NormalAnimationBlendMode;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\tconst existingAction = actionsForClip.actionByRoot[ rootUuid ];\n\n\t\t\tif ( existingAction !== undefined && existingAction.blendMode === blendMode ) {\n\n\t\t\t\treturn existingAction;\n\n\t\t\t}\n\n\t\t\t// we know the clip, so we don't have to parse all\n\t\t\t// the bindings again but can just copy\n\t\t\tprototypeAction = actionsForClip.knownActions[ 0 ];\n\n\t\t\t// also, take the clip from the prototype action\n\t\t\tif ( clipObject === null )\n\t\t\t\tclipObject = prototypeAction._clip;\n\n\t\t}\n\n\t\t// clip must be known when specified via string\n\t\tif ( clipObject === null ) return null;\n\n\t\t// allocate all resources required to run it\n\t\tconst newAction = new AnimationAction( this, clipObject, optionalRoot, blendMode );\n\n\t\tthis._bindAction( newAction, prototypeAction );\n\n\t\t// and make the action known to the memory manager\n\t\tthis._addInactiveAction( newAction, clipUuid, rootUuid );\n\n\t\treturn newAction;\n\n\t}\n\n\t/**\n\t * Returns an existing animation action for the passed clip.\n\t *\n\t * @param {AnimationClip|string} clip - An animation clip or alternatively the name of the animation clip.\n\t * @param {Object3D} [optionalRoot] - An alternative root object.\n\t * @return {?AnimationAction} The animation action. Returns `null` if no action was found.\n\t */\n\texistingAction( clip, optionalRoot ) {\n\n\t\tconst root = optionalRoot || this._root,\n\t\t\trootUuid = root.uuid,\n\n\t\t\tclipObject = typeof clip === 'string' ?\n\t\t\t\tAnimationClip.findByName( root, clip ) : clip,\n\n\t\t\tclipUuid = clipObject ? clipObject.uuid : clip,\n\n\t\t\tactionsForClip = this._actionsByClip[ clipUuid ];\n\n\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\treturn actionsForClip.actionByRoot[ rootUuid ] || null;\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\t/**\n\t * Deactivates all previously scheduled actions on this mixer.\n\t *\n\t * @return {AnimationMixer} A reference to this animation mixer.\n\t */\n\tstopAllAction() {\n\n\t\tconst actions = this._actions,\n\t\t\tnActions = this._nActiveActions;\n\n\t\tfor ( let i = nActions - 1; i >= 0; -- i ) {\n\n\t\t\tactions[ i ].stop();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Advances the global mixer time and updates the animation.\n\t *\n\t * This is usually done in the render loop by passing the delta\n\t * time from {@link Clock} or {@link Timer}.\n\t *\n\t * @param {number} deltaTime - The delta time in seconds.\n\t * @return {AnimationMixer} A reference to this animation mixer.\n\t */\n\tupdate( deltaTime ) {\n\n\t\tdeltaTime *= this.timeScale;\n\n\t\tconst actions = this._actions,\n\t\t\tnActions = this._nActiveActions,\n\n\t\t\ttime = this.time += deltaTime,\n\t\t\ttimeDirection = Math.sign( deltaTime ),\n\n\t\t\taccuIndex = this._accuIndex ^= 1;\n\n\t\t// run active actions\n\n\t\tfor ( let i = 0; i !== nActions; ++ i ) {\n\n\t\t\tconst action = actions[ i ];\n\n\t\t\taction._update( time, deltaTime, timeDirection, accuIndex );\n\n\t\t}\n\n\t\t// update scene graph\n\n\t\tconst bindings = this._bindings,\n\t\t\tnBindings = this._nActiveBindings;\n\n\t\tfor ( let i = 0; i !== nBindings; ++ i ) {\n\n\t\t\tbindings[ i ].apply( accuIndex );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the global mixer to a specific time and updates the animation accordingly.\n\t *\n\t * This is useful when you need to jump to an exact time in an animation. The\n\t * input parameter will be scaled by {@link AnimationMixer#timeScale}\n\t *\n\t * @param {number} time - The time to set in seconds.\n\t * @return {AnimationMixer} A reference to this animation mixer.\n\t */\n\tsetTime( time ) {\n\n\t\tthis.time = 0; // Zero out time attribute for AnimationMixer object;\n\t\tfor ( let i = 0; i < this._actions.length; i ++ ) {\n\n\t\t\tthis._actions[ i ].time = 0; // Zero out time attribute for all associated AnimationAction objects.\n\n\t\t}\n\n\t\treturn this.update( time ); // Update used to set exact time. Returns \"this\" AnimationMixer object.\n\n\t}\n\n\t/**\n\t * Returns this mixer's root object.\n\t *\n\t * @return {Object3D} The mixer's root object.\n\t */\n\tgetRoot() {\n\n\t\treturn this._root;\n\n\t}\n\n\t/**\n\t * Deallocates all memory resources for a clip. Before using this method make\n\t * sure to call {@link AnimationAction#stop} for all related actions.\n\t *\n\t * @param {AnimationClip} clip - The clip to uncache.\n\t */\n\tuncacheClip( clip ) {\n\n\t\tconst actions = this._actions,\n\t\t\tclipUuid = clip.uuid,\n\t\t\tactionsByClip = this._actionsByClip,\n\t\t\tactionsForClip = actionsByClip[ clipUuid ];\n\n\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\t// note: just calling _removeInactiveAction would mess up the\n\t\t\t// iteration state and also require updating the state we can\n\t\t\t// just throw away\n\n\t\t\tconst actionsToRemove = actionsForClip.knownActions;\n\n\t\t\tfor ( let i = 0, n = actionsToRemove.length; i !== n; ++ i ) {\n\n\t\t\t\tconst action = actionsToRemove[ i ];\n\n\t\t\t\tthis._deactivateAction( action );\n\n\t\t\t\tconst cacheIndex = action._cacheIndex,\n\t\t\t\t\tlastInactiveAction = actions[ actions.length - 1 ];\n\n\t\t\t\taction._cacheIndex = null;\n\t\t\t\taction._byClipCacheIndex = null;\n\n\t\t\t\tlastInactiveAction._cacheIndex = cacheIndex;\n\t\t\t\tactions[ cacheIndex ] = lastInactiveAction;\n\t\t\t\tactions.pop();\n\n\t\t\t\tthis._removeInactiveBindingsForAction( action );\n\n\t\t\t}\n\n\t\t\tdelete actionsByClip[ clipUuid ];\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Deallocates all memory resources for a root object. Before using this\n\t * method make sure to call {@link AnimationAction#stop} for all related\n\t * actions or alternatively {@link AnimationMixer#stopAllAction} when the\n\t * mixer operates on a single root.\n\t *\n\t * @param {Object3D} root - The root object to uncache.\n\t */\n\tuncacheRoot( root ) {\n\n\t\tconst rootUuid = root.uuid,\n\t\t\tactionsByClip = this._actionsByClip;\n\n\t\tfor ( const clipUuid in actionsByClip ) {\n\n\t\t\tconst actionByRoot = actionsByClip[ clipUuid ].actionByRoot,\n\t\t\t\taction = actionByRoot[ rootUuid ];\n\n\t\t\tif ( action !== undefined ) {\n\n\t\t\t\tthis._deactivateAction( action );\n\t\t\t\tthis._removeInactiveAction( action );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst bindingsByRoot = this._bindingsByRootAndName,\n\t\t\tbindingByName = bindingsByRoot[ rootUuid ];\n\n\t\tif ( bindingByName !== undefined ) {\n\n\t\t\tfor ( const trackName in bindingByName ) {\n\n\t\t\t\tconst binding = bindingByName[ trackName ];\n\t\t\t\tbinding.restoreOriginalState();\n\t\t\t\tthis._removeInactiveBinding( binding );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Deallocates all memory resources for an action. The action is identified by the\n\t * given clip and an optional root object. Before using this method make\n\t * sure to call {@link AnimationAction#stop} to deactivate the action.\n\t *\n\t * @param {AnimationClip|string} clip - An animation clip or alternatively the name of the animation clip.\n\t * @param {Object3D} [optionalRoot] - An alternative root object.\n\t */\n\tuncacheAction( clip, optionalRoot ) {\n\n\t\tconst action = this.existingAction( clip, optionalRoot );\n\n\t\tif ( action !== null ) {\n\n\t\t\tthis._deactivateAction( action );\n\t\t\tthis._removeInactiveAction( action );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * Represents a 3D render target.\n *\n * @augments RenderTarget\n */\nclass RenderTarget3D extends RenderTarget {\n\n\t/**\n\t * Constructs a new 3D render target.\n\t *\n\t * @param {number} [width=1] - The width of the render target.\n\t * @param {number} [height=1] - The height of the render target.\n\t * @param {number} [depth=1] - The height of the render target.\n\t * @param {RenderTarget~Options} [options] - The configuration object.\n\t */\n\tconstructor( width = 1, height = 1, depth = 1, options = {} ) {\n\n\t\tsuper( width, height, options );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isRenderTarget3D = true;\n\n\t\tthis.depth = depth;\n\n\t\t/**\n\t\t * Overwritten with a different texture type.\n\t\t *\n\t\t * @type {Data3DTexture}\n\t\t */\n\t\tthis.texture = new Data3DTexture( null, width, height, depth );\n\t\tthis._setTextureOptions( options );\n\n\t\tthis.texture.isRenderTargetTexture = true;\n\n\t}\n\n}\n\n/**\n * Represents a uniform which is a global shader variable. They are passed to shader programs.\n *\n * When declaring a uniform of a {@link ShaderMaterial}, it is declared by value or by object.\n * ```js\n * uniforms: {\n * \ttime: { value: 1.0 },\n * \tresolution: new Uniform( new Vector2() )\n * };\n * ```\n * Since this class can only be used in context of {@link ShaderMaterial}, it is only supported\n * in {@link WebGLRenderer}.\n */\nclass Uniform {\n\n\t/**\n\t * Constructs a new uniform.\n\t *\n\t * @param {any} value - The uniform value.\n\t */\n\tconstructor( value ) {\n\n\t\t/**\n\t\t * The uniform value.\n\t\t *\n\t\t * @type {any}\n\t\t */\n\t\tthis.value = value;\n\n\t}\n\n\t/**\n\t * Returns a new uniform with copied values from this instance.\n\t * If the value has a `clone()` method, the value is cloned as well.\n\t *\n\t * @return {Uniform} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new Uniform( this.value.clone === undefined ? this.value : this.value.clone() );\n\n\t}\n\n}\n\nlet _id$1 = 0;\n\n/**\n * A class for managing multiple uniforms in a single group. The renderer will process\n * such a definition as a single UBO.\n *\n * Since this class can only be used in context of {@link ShaderMaterial}, it is only supported\n * in {@link WebGLRenderer}.\n *\n * @augments EventDispatcher\n */\nclass UniformsGroup extends EventDispatcher {\n\n\t/**\n\t * Constructs a new uniforms group.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isUniformsGroup = true;\n\n\t\t/**\n\t\t * The ID of the 3D object.\n\t\t *\n\t\t * @name UniformsGroup#id\n\t\t * @type {number}\n\t\t * @readonly\n\t\t */\n\t\tObject.defineProperty( this, 'id', { value: _id$1 ++ } );\n\n\t\t/**\n\t\t * The name of the uniforms group.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\n\t\t/**\n\t\t * The buffer usage.\n\t\t *\n\t\t * @type {(StaticDrawUsage|DynamicDrawUsage|StreamDrawUsage|StaticReadUsage|DynamicReadUsage|StreamReadUsage|StaticCopyUsage|DynamicCopyUsage|StreamCopyUsage)}\n\t\t * @default StaticDrawUsage\n\t\t */\n\t\tthis.usage = StaticDrawUsage;\n\n\t\t/**\n\t\t * An array holding the uniforms.\n\t\t *\n\t\t * @type {Array<Uniform>}\n\t\t */\n\t\tthis.uniforms = [];\n\n\t}\n\n\t/**\n\t * Adds the given uniform to this uniforms group.\n\t *\n\t * @param {Uniform} uniform - The uniform to add.\n\t * @return {UniformsGroup} A reference to this uniforms group.\n\t */\n\tadd( uniform ) {\n\n\t\tthis.uniforms.push( uniform );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Removes the given uniform from this uniforms group.\n\t *\n\t * @param {Uniform} uniform - The uniform to remove.\n\t * @return {UniformsGroup} A reference to this uniforms group.\n\t */\n\tremove( uniform ) {\n\n\t\tconst index = this.uniforms.indexOf( uniform );\n\n\t\tif ( index !== -1 ) this.uniforms.splice( index, 1 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the name of this uniforms group.\n\t *\n\t * @param {string} name - The name to set.\n\t * @return {UniformsGroup} A reference to this uniforms group.\n\t */\n\tsetName( name ) {\n\n\t\tthis.name = name;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the usage of this uniforms group.\n\t *\n\t * @param {(StaticDrawUsage|DynamicDrawUsage|StreamDrawUsage|StaticReadUsage|DynamicReadUsage|StreamReadUsage|StaticCopyUsage|DynamicCopyUsage|StreamCopyUsage)} value - The usage to set.\n\t * @return {UniformsGroup} A reference to this uniforms group.\n\t */\n\tsetUsage( value ) {\n\n\t\tthis.usage = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t *\n\t * @fires Texture#dispose\n\t */\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n\t/**\n\t * Copies the values of the given uniforms group to this instance.\n\t *\n\t * @param {UniformsGroup} source - The uniforms group to copy.\n\t * @return {UniformsGroup} A reference to this uniforms group.\n\t */\n\tcopy( source ) {\n\n\t\tthis.name = source.name;\n\t\tthis.usage = source.usage;\n\n\t\tconst uniformsSource = source.uniforms;\n\n\t\tthis.uniforms.length = 0;\n\n\t\tfor ( let i = 0, l = uniformsSource.length; i < l; i ++ ) {\n\n\t\t\tconst uniforms = Array.isArray( uniformsSource[ i ] ) ? uniformsSource[ i ] : [ uniformsSource[ i ] ];\n\n\t\t\tfor ( let j = 0; j < uniforms.length; j ++ ) {\n\n\t\t\t\tthis.uniforms.push( uniforms[ j ].clone() );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new uniforms group with copied values from this instance.\n\t *\n\t * @return {UniformsGroup} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\n/**\n * An instanced version of an interleaved buffer.\n *\n * @augments InterleavedBuffer\n */\nclass InstancedInterleavedBuffer extends InterleavedBuffer {\n\n\t/**\n\t * Constructs a new instanced interleaved buffer.\n\t *\n\t * @param {TypedArray} array - A typed array with a shared buffer storing attribute data.\n\t * @param {number} stride - The number of typed-array elements per vertex.\n\t * @param {number} [meshPerAttribute=1] - Defines how often a value of this interleaved buffer should be repeated.\n\t */\n\tconstructor( array, stride, meshPerAttribute = 1 ) {\n\n\t\tsuper( array, stride );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isInstancedInterleavedBuffer = true;\n\n\t\t/**\n\t\t * Defines how often a value of this buffer attribute should be repeated,\n\t\t * see {@link InstancedBufferAttribute#meshPerAttribute}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.meshPerAttribute = meshPerAttribute;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.meshPerAttribute = source.meshPerAttribute;\n\n\t\treturn this;\n\n\t}\n\n\tclone( data ) {\n\n\t\tconst ib = super.clone( data );\n\n\t\tib.meshPerAttribute = this.meshPerAttribute;\n\n\t\treturn ib;\n\n\t}\n\n\ttoJSON( data ) {\n\n\t\tconst json = super.toJSON( data );\n\n\t\tjson.isInstancedInterleavedBuffer = true;\n\t\tjson.meshPerAttribute = this.meshPerAttribute;\n\n\t\treturn json;\n\n\t}\n\n}\n\n/**\n * An alternative version of a buffer attribute with more control over the VBO.\n *\n * The renderer does not construct a VBO for this kind of attribute. Instead, it uses\n * whatever VBO is passed in constructor and can later be altered via the `buffer` property.\n *\n * The most common use case for this class is when some kind of GPGPU calculation interferes\n * or even produces the VBOs in question.\n *\n * Notice that this class can only be used with {@link WebGLRenderer}.\n */\nclass GLBufferAttribute {\n\n\t/**\n\t * Constructs a new GL buffer attribute.\n\t *\n\t * @param {WebGLBuffer} buffer - The native WebGL buffer.\n\t * @param {number} type - The native data type (e.g. `gl.FLOAT`).\n\t * @param {number} itemSize - The item size.\n\t * @param {number} elementSize - The corresponding size (in bytes) for the given `type` parameter.\n\t * @param {number} count - The expected number of vertices in VBO.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( buffer, type, itemSize, elementSize, count, normalized = false ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isGLBufferAttribute = true;\n\n\t\t/**\n\t\t * The name of the buffer attribute.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\n\t\t/**\n\t\t * The native WebGL buffer.\n\t\t *\n\t\t * @type {WebGLBuffer}\n\t\t */\n\t\tthis.buffer = buffer;\n\n\t\t/**\n\t\t * The native data type.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.type = type;\n\n\t\t/**\n\t\t * The item size, see {@link BufferAttribute#itemSize}.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.itemSize = itemSize;\n\n\t\t/**\n\t\t * The corresponding size (in bytes) for the given `type` parameter.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.elementSize = elementSize;\n\n\t\t/**\n\t\t * The expected number of vertices in VBO.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.count = count;\n\n\t\t/**\n\t\t * Applies to integer data only. Indicates how the underlying data in the buffer maps to\n\t\t * the values in the GLSL code. For instance, if `buffer` contains data of `gl.UNSIGNED_SHORT`,\n\t\t * and `normalized` is `true`, the values `0 - +65535` in the buffer data will be mapped to\n\t\t * `0.0f - +1.0f` in the GLSL attribute. If `normalized` is `false`, the values will be converted\n\t\t * to floats unmodified, i.e. `65535` becomes `65535.0f`.\n\t\t *\n\t\t * @type {boolean}\n\t\t */\n\t\tthis.normalized = normalized;\n\n\t\t/**\n\t\t * A version number, incremented every time the `needsUpdate` is set to `true`.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.version = 0;\n\n\t}\n\n\t/**\n\t * Flag to indicate that this attribute has changed and should be re-sent to\n\t * the GPU. Set this to `true` when you modify the value of the array.\n\t *\n\t * @type {number}\n\t * @default false\n\t * @param {boolean} value\n\t */\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n\t/**\n\t * Sets the given native WebGL buffer.\n\t *\n\t * @param {WebGLBuffer} buffer - The buffer to set.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetBuffer( buffer ) {\n\n\t\tthis.buffer = buffer;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given native data type and element size.\n\t *\n\t * @param {number} type - The native data type (e.g. `gl.FLOAT`).\n\t * @param {number} elementSize - The corresponding size (in bytes) for the given `type` parameter.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetType( type, elementSize ) {\n\n\t\tthis.type = type;\n\t\tthis.elementSize = elementSize;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the item size.\n\t *\n\t * @param {number} itemSize - The item size.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetItemSize( itemSize ) {\n\n\t\tthis.itemSize = itemSize;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the count (the expected number of vertices in VBO).\n\t *\n\t * @param {number} count - The count.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetCount( count ) {\n\n\t\tthis.count = count;\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _matrix = /*@__PURE__*/ new Matrix4();\n\n/**\n * This class is designed to assist with raycasting. Raycasting is used for\n * mouse picking (working out what objects in the 3d space the mouse is over)\n * amongst other things.\n */\nclass Raycaster {\n\n\t/**\n\t * Constructs a new raycaster.\n\t *\n\t * @param {Vector3} origin - The origin vector where the ray casts from.\n\t * @param {Vector3} direction - The (normalized) direction vector that gives direction to the ray.\n\t * @param {number} [near=0] - All results returned are further away than near. Near can't be negative.\n\t * @param {number} [far=Infinity] - All results returned are closer than far. Far can't be lower than near.\n\t */\n\tconstructor( origin, direction, near = 0, far = Infinity ) {\n\n\t\t/**\n\t\t * The ray used for raycasting.\n\t\t *\n\t\t * @type {Ray}\n\t\t */\n\t\tthis.ray = new Ray( origin, direction );\n\n\t\t/**\n\t\t * All results returned are further away than near. Near can't be negative.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.near = near;\n\n\t\t/**\n\t\t * All results returned are further away than near. Near can't be negative.\n\t\t *\n\t\t * @type {number}\n\t\t * @default Infinity\n\t\t */\n\t\tthis.far = far;\n\n\t\t/**\n\t\t * The camera to use when raycasting against view-dependent objects such as\n\t\t * billboarded objects like sprites. This field can be set manually or\n\t\t * is set when calling `setFromCamera()`.\n\t\t *\n\t\t * @type {?Camera}\n\t\t * @default null\n\t\t */\n\t\tthis.camera = null;\n\n\t\t/**\n\t\t * Allows to selectively ignore 3D objects when performing intersection tests.\n\t\t * The following code example ensures that only 3D objects on layer `1` will be\n\t\t * honored by raycaster.\n\t\t * ```js\n\t\t * raycaster.layers.set( 1 );\n\t\t * object.layers.enable( 1 );\n\t\t * ```\n\t\t *\n\t\t * @type {Layers}\n\t\t */\n\t\tthis.layers = new Layers();\n\n\n\t\t/**\n\t\t * A parameter object that configures the raycasting. It has the structure:\n\t\t *\n\t\t * ```\n\t\t * {\n\t\t * \tMesh: {},\n\t\t * \tLine: { threshold: 1 },\n\t\t * \tLOD: {},\n\t\t * \tPoints: { threshold: 1 },\n\t\t * \tSprite: {}\n\t\t * }\n\t\t * ```\n\t\t * Where `threshold` is the precision of the raycaster when intersecting objects, in world units.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.params = {\n\t\t\tMesh: {},\n\t\t\tLine: { threshold: 1 },\n\t\t\tLOD: {},\n\t\t\tPoints: { threshold: 1 },\n\t\t\tSprite: {}\n\t\t};\n\n\t}\n\n\t/**\n\t * Updates the ray with a new origin and direction by copying the values from the arguments.\n\t *\n\t * @param {Vector3} origin - The origin vector where the ray casts from.\n\t * @param {Vector3} direction - The (normalized) direction vector that gives direction to the ray.\n\t */\n\tset( origin, direction ) {\n\n\t\t// direction is assumed to be normalized (for accurate distance calculations)\n\n\t\tthis.ray.set( origin, direction );\n\n\t}\n\n\t/**\n\t * Uses the given coordinates and camera to compute a new origin and direction for the internal ray.\n\t *\n\t * @param {Vector2} coords - 2D coordinates of the mouse, in normalized device coordinates (NDC).\n\t * X and Y components should be between `-1` and `1`.\n\t * @param {Camera} camera - The camera from which the ray should originate.\n\t */\n\tsetFromCamera( coords, camera ) {\n\n\t\tif ( camera.isPerspectiveCamera ) {\n\n\t\t\tthis.ray.origin.setFromMatrixPosition( camera.matrixWorld );\n\t\t\tthis.ray.direction.set( coords.x, coords.y, 0.5 ).unproject( camera ).sub( this.ray.origin ).normalize();\n\t\t\tthis.camera = camera;\n\n\t\t} else if ( camera.isOrthographicCamera ) {\n\n\t\t\tthis.ray.origin.set( coords.x, coords.y, ( camera.near + camera.far ) / ( camera.near - camera.far ) ).unproject( camera ); // set origin in plane of camera\n\t\t\tthis.ray.direction.set( 0, 0, -1 ).transformDirection( camera.matrixWorld );\n\t\t\tthis.camera = camera;\n\n\t\t} else {\n\n\t\t\terror( 'Raycaster: Unsupported camera type: ' + camera.type );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Uses the given WebXR controller to compute a new origin and direction for the internal ray.\n\t *\n\t * @param {WebXRController} controller - The controller to copy the position and direction from.\n\t * @return {Raycaster} A reference to this raycaster.\n\t */\n\tsetFromXRController( controller ) {\n\n\t\t_matrix.identity().extractRotation( controller.matrixWorld );\n\n\t\tthis.ray.origin.setFromMatrixPosition( controller.matrixWorld );\n\t\tthis.ray.direction.set( 0, 0, -1 ).applyMatrix4( _matrix );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The intersection point of a raycaster intersection test.\n\t * @typedef {Object} Raycaster~Intersection\n\t * @property {number} distance - The distance from the ray's origin to the intersection point.\n\t * @property {number} distanceToRay -  Some 3D objects e.g. {@link Points} provide the distance of the\n\t * intersection to the nearest point on the ray. For other objects it will be `undefined`.\n\t * @property {Vector3} point - The intersection point, in world coordinates.\n\t * @property {Object} face - The face that has been intersected.\n\t * @property {number} faceIndex - The face index.\n\t * @property {Object3D} object - The 3D object that has been intersected.\n\t * @property {Vector2} uv - U,V coordinates at point of intersection.\n\t * @property {Vector2} uv1 - Second set of U,V coordinates at point of intersection.\n\t * @property {Vector3} uv1 - Interpolated normal vector at point of intersection.\n\t * @property {number} instanceId - The index number of the instance where the ray\n\t * intersects the {@link InstancedMesh}.\n\t */\n\n\t/**\n\t * Checks all intersection between the ray and the object with or without the\n\t * descendants. Intersections are returned sorted by distance, closest first.\n\t *\n\t * `Raycaster` delegates to the `raycast()` method of the passed 3D object, when\n\t * evaluating whether the ray intersects the object or not. This allows meshes to respond\n\t * differently to ray casting than lines or points.\n\t *\n\t * Note that for meshes, faces must be pointed towards the origin of the ray in order\n\t * to be detected; intersections of the ray passing through the back of a face will not\n\t * be detected. To raycast against both faces of an object, you'll want to set  {@link Material#side}\n\t * to `THREE.DoubleSide`.\n\t *\n\t * @param {Object3D} object - The 3D object to check for intersection with the ray.\n\t * @param {boolean} [recursive=true] - If set to `true`, it also checks all descendants.\n\t * Otherwise it only checks intersection with the object.\n\t * @param {Array<Raycaster~Intersection>} [intersects=[]] The target array that holds the result of the method.\n\t * @return {Array<Raycaster~Intersection>} An array holding the intersection points.\n\t */\n\tintersectObject( object, recursive = true, intersects = [] ) {\n\n\t\tintersect( object, this, intersects, recursive );\n\n\t\tintersects.sort( ascSort );\n\n\t\treturn intersects;\n\n\t}\n\n\t/**\n\t * Checks all intersection between the ray and the objects with or without\n\t * the descendants. Intersections are returned sorted by distance, closest first.\n\t *\n\t * @param {Array<Object3D>} objects - The 3D objects to check for intersection with the ray.\n\t * @param {boolean} [recursive=true] - If set to `true`, it also checks all descendants.\n\t * Otherwise it only checks intersection with the object.\n\t * @param {Array<Raycaster~Intersection>} [intersects=[]] The target array that holds the result of the method.\n\t * @return {Array<Raycaster~Intersection>} An array holding the intersection points.\n\t */\n\tintersectObjects( objects, recursive = true, intersects = [] ) {\n\n\t\tfor ( let i = 0, l = objects.length; i < l; i ++ ) {\n\n\t\t\tintersect( objects[ i ], this, intersects, recursive );\n\n\t\t}\n\n\t\tintersects.sort( ascSort );\n\n\t\treturn intersects;\n\n\t}\n\n}\n\nfunction ascSort( a, b ) {\n\n\treturn a.distance - b.distance;\n\n}\n\nfunction intersect( object, raycaster, intersects, recursive ) {\n\n\tlet propagate = true;\n\n\tif ( object.layers.test( raycaster.layers ) ) {\n\n\t\tconst result = object.raycast( raycaster, intersects );\n\n\t\tif ( result === false ) propagate = false;\n\n\t}\n\n\tif ( propagate === true && recursive === true ) {\n\n\t\tconst children = object.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tintersect( children[ i ], raycaster, intersects, true );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * This class is an alternative to {@link Clock} with a different API design and behavior.\n * The goal is to avoid the conceptual flaws that became apparent in `Clock` over time.\n *\n * - `Timer` has an `update()` method that updates its internal state. That makes it possible to\n * call `getDelta()` and `getElapsed()` multiple times per simulation step without getting different values.\n * - The class can make use of the Page Visibility API to avoid large time delta values when the app\n * is inactive (e.g. tab switched or browser hidden).\n *\n * ```js\n * const timer = new Timer();\n * timer.connect( document ); // use Page Visibility API\n * ```\n */\nclass Timer {\n\n\t/**\n\t * Constructs a new timer.\n\t */\n\tconstructor() {\n\n\t\tthis._previousTime = 0;\n\t\tthis._currentTime = 0;\n\t\tthis._startTime = performance.now();\n\n\t\tthis._delta = 0;\n\t\tthis._elapsed = 0;\n\n\t\tthis._timescale = 1;\n\n\t\tthis._document = null;\n\t\tthis._pageVisibilityHandler = null;\n\n\t}\n\n\t/**\n\t * Connect the timer to the given document.Calling this method is not mandatory to\n\t * use the timer but enables the usage of the Page Visibility API to avoid large time\n\t * delta values.\n\t *\n\t * @param {Document} document - The document.\n\t */\n\tconnect( document ) {\n\n\t\tthis._document = document;\n\n\t\t// use Page Visibility API to avoid large time delta values\n\n\t\tif ( document.hidden !== undefined ) {\n\n\t\t\tthis._pageVisibilityHandler = handleVisibilityChange.bind( this );\n\n\t\t\tdocument.addEventListener( 'visibilitychange', this._pageVisibilityHandler, false );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Disconnects the timer from the DOM and also disables the usage of the Page Visibility API.\n\t */\n\tdisconnect() {\n\n\t\tif ( this._pageVisibilityHandler !== null ) {\n\n\t\t\tthis._document.removeEventListener( 'visibilitychange', this._pageVisibilityHandler );\n\t\t\tthis._pageVisibilityHandler = null;\n\n\t\t}\n\n\t\tthis._document = null;\n\n\t}\n\n\t/**\n\t * Returns the time delta in seconds.\n\t *\n\t * @return {number} The time delta in second.\n\t */\n\tgetDelta() {\n\n\t\treturn this._delta / 1000;\n\n\t}\n\n\t/**\n\t * Returns the elapsed time in seconds.\n\t *\n\t * @return {number} The elapsed time in second.\n\t */\n\tgetElapsed() {\n\n\t\treturn this._elapsed / 1000;\n\n\t}\n\n\t/**\n\t * Returns the timescale.\n\t *\n\t * @return {number} The timescale.\n\t */\n\tgetTimescale() {\n\n\t\treturn this._timescale;\n\n\t}\n\n\t/**\n\t * Sets the given timescale which scale the time delta computation\n\t * in `update()`.\n\t *\n\t * @param {number} timescale - The timescale to set.\n\t * @return {Timer} A reference to this timer.\n\t */\n\tsetTimescale( timescale ) {\n\n\t\tthis._timescale = timescale;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Resets the time computation for the current simulation step.\n\t *\n\t * @return {Timer} A reference to this timer.\n\t */\n\treset() {\n\n\t\tthis._currentTime = performance.now() - this._startTime;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Can be used to free all internal resources. Usually called when\n\t * the timer instance isn't required anymore.\n\t */\n\tdispose() {\n\n\t\tthis.disconnect();\n\n\t}\n\n\t/**\n\t * Updates the internal state of the timer. This method should be called\n\t * once per simulation step and before you perform queries against the timer\n\t * (e.g. via `getDelta()`).\n\t *\n\t * @param {number} timestamp - The current time in milliseconds. Can be obtained\n\t * from the `requestAnimationFrame` callback argument. If not provided, the current\n\t * time will be determined with `performance.now`.\n\t * @return {Timer} A reference to this timer.\n\t */\n\tupdate( timestamp ) {\n\n\t\tif ( this._pageVisibilityHandler !== null && this._document.hidden === true ) {\n\n\t\t\tthis._delta = 0;\n\n\t\t} else {\n\n\t\t\tthis._previousTime = this._currentTime;\n\t\t\tthis._currentTime = ( timestamp !== undefined ? timestamp : performance.now() ) - this._startTime;\n\n\t\t\tthis._delta = ( this._currentTime - this._previousTime ) * this._timescale;\n\t\t\tthis._elapsed += this._delta; // _elapsed is the accumulation of all previous deltas\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\nfunction handleVisibilityChange() {\n\n\tif ( this._document.hidden === false ) this.reset();\n\n}\n\n/**\n * This class can be used to represent points in 3D space as\n * [Spherical coordinates](https://en.wikipedia.org/wiki/Spherical_coordinate_system).\n */\nclass Spherical {\n\n\t/**\n\t * Constructs a new spherical.\n\t *\n\t * @param {number} [radius=1] - The radius, or the Euclidean distance (straight-line distance) from the point to the origin.\n\t * @param {number} [phi=0] - The polar angle in radians from the y (up) axis.\n\t * @param {number} [theta=0] - The equator/azimuthal angle in radians around the y (up) axis.\n\t */\n\tconstructor( radius = 1, phi = 0, theta = 0 ) {\n\n\t\t/**\n\t\t * The radius, or the Euclidean distance (straight-line distance) from the point to the origin.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.radius = radius;\n\n\t\t/**\n\t\t * The polar angle in radians from the y (up) axis.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.phi = phi;\n\n\t\t/**\n\t\t * The equator/azimuthal angle in radians around the y (up) axis.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.theta = theta;\n\n\t}\n\n\t/**\n\t * Sets the spherical components by copying the given values.\n\t *\n\t * @param {number} radius - The radius.\n\t * @param {number} phi - The polar angle.\n\t * @param {number} theta - The azimuthal angle.\n\t * @return {Spherical} A reference to this spherical.\n\t */\n\tset( radius, phi, theta ) {\n\n\t\tthis.radius = radius;\n\t\tthis.phi = phi;\n\t\tthis.theta = theta;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the values of the given spherical to this instance.\n\t *\n\t * @param {Spherical} other - The spherical to copy.\n\t * @return {Spherical} A reference to this spherical.\n\t */\n\tcopy( other ) {\n\n\t\tthis.radius = other.radius;\n\t\tthis.phi = other.phi;\n\t\tthis.theta = other.theta;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Restricts the polar angle [page:.phi phi] to be between `0.000001` and pi -\n\t * `0.000001`.\n\t *\n\t * @return {Spherical} A reference to this spherical.\n\t */\n\tmakeSafe() {\n\n\t\tconst EPS = 0.000001;\n\t\tthis.phi = clamp( this.phi, EPS, Math.PI - EPS );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the spherical components from the given vector which is assumed to hold\n\t * Cartesian coordinates.\n\t *\n\t * @param {Vector3} v - The vector to set.\n\t * @return {Spherical} A reference to this spherical.\n\t */\n\tsetFromVector3( v ) {\n\n\t\treturn this.setFromCartesianCoords( v.x, v.y, v.z );\n\n\t}\n\n\t/**\n\t * Sets the spherical components from the given Cartesian coordinates.\n\t *\n\t * @param {number} x - The x value.\n\t * @param {number} y - The y value.\n\t * @param {number} z - The z value.\n\t * @return {Spherical} A reference to this spherical.\n\t */\n\tsetFromCartesianCoords( x, y, z ) {\n\n\t\tthis.radius = Math.sqrt( x * x + y * y + z * z );\n\n\t\tif ( this.radius === 0 ) {\n\n\t\t\tthis.theta = 0;\n\t\t\tthis.phi = 0;\n\n\t\t} else {\n\n\t\t\tthis.theta = Math.atan2( x, z );\n\t\t\tthis.phi = Math.acos( clamp( y / this.radius, -1, 1 ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new spherical with copied values from this instance.\n\t *\n\t * @return {Spherical} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\n/**\n * This class can be used to represent points in 3D space as\n * [Cylindrical coordinates](https://en.wikipedia.org/wiki/Cylindrical_coordinate_system).\n */\nclass Cylindrical {\n\n\t/**\n\t * Constructs a new cylindrical.\n\t *\n\t * @param {number} [radius=1] - The distance from the origin to a point in the x-z plane.\n\t * @param {number} [theta=0] - A counterclockwise angle in the x-z plane measured in radians from the positive z-axis.\n\t * @param {number} [y=0] - The height above the x-z plane.\n\t */\n\tconstructor( radius = 1, theta = 0, y = 0 ) {\n\n\t\t/**\n\t\t * The distance from the origin to a point in the x-z plane.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.radius = radius;\n\n\t\t/**\n\t\t * A counterclockwise angle in the x-z plane measured in radians from the positive z-axis.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.theta = theta;\n\n\t\t/**\n\t\t * The height above the x-z plane.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.y = y;\n\n\t}\n\n\t/**\n\t * Sets the cylindrical components by copying the given values.\n\t *\n\t * @param {number} radius - The radius.\n\t * @param {number} theta - The theta angle.\n\t * @param {number} y - The height value.\n\t * @return {Cylindrical} A reference to this cylindrical.\n\t */\n\tset( radius, theta, y ) {\n\n\t\tthis.radius = radius;\n\t\tthis.theta = theta;\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the values of the given cylindrical to this instance.\n\t *\n\t * @param {Cylindrical} other - The cylindrical to copy.\n\t * @return {Cylindrical} A reference to this cylindrical.\n\t */\n\tcopy( other ) {\n\n\t\tthis.radius = other.radius;\n\t\tthis.theta = other.theta;\n\t\tthis.y = other.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the cylindrical components from the given vector which is assumed to hold\n\t * Cartesian coordinates.\n\t *\n\t * @param {Vector3} v - The vector to set.\n\t * @return {Cylindrical} A reference to this cylindrical.\n\t */\n\tsetFromVector3( v ) {\n\n\t\treturn this.setFromCartesianCoords( v.x, v.y, v.z );\n\n\t}\n\n\t/**\n\t * Sets the cylindrical components from the given Cartesian coordinates.\n\t *\n\t * @param {number} x - The x value.\n\t * @param {number} y - The x value.\n\t * @param {number} z - The x value.\n\t * @return {Cylindrical} A reference to this cylindrical.\n\t */\n\tsetFromCartesianCoords( x, y, z ) {\n\n\t\tthis.radius = Math.sqrt( x * x + z * z );\n\t\tthis.theta = Math.atan2( x, z );\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new cylindrical with copied values from this instance.\n\t *\n\t * @return {Cylindrical} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\n/**\n * Represents a 2x2 matrix.\n *\n * A Note on Row-Major and Column-Major Ordering:\n *\n * The constructor and {@link Matrix2#set} method take arguments in\n * [row-major](https://en.wikipedia.org/wiki/Row-_and_column-major_order#Column-major_order)\n * order, while internally they are stored in the {@link Matrix2#elements} array in column-major order.\n * This means that calling:\n * ```js\n * const m = new THREE.Matrix2();\n * m.set( 11, 12,\n *        21, 22 );\n * ```\n * will result in the elements array containing:\n * ```js\n * m.elements = [ 11, 21,\n *                12, 22 ];\n * ```\n * and internally all calculations are performed using column-major ordering.\n * However, as the actual ordering makes no difference mathematically and\n * most people are used to thinking about matrices in row-major order, the\n * three.js documentation shows matrices in row-major order. Just bear in\n * mind that if you are reading the source code, you'll have to take the\n * transpose of any matrices outlined here to make sense of the calculations.\n */\nclass Matrix2 {\n\n\t/**\n\t * Constructs a new 2x2 matrix. The arguments are supposed to be\n\t * in row-major order. If no arguments are provided, the constructor\n\t * initializes the matrix as an identity matrix.\n\t *\n\t * @param {number} [n11] - 1-1 matrix element.\n\t * @param {number} [n12] - 1-2 matrix element.\n\t * @param {number} [n21] - 2-1 matrix element.\n\t * @param {number} [n22] - 2-2 matrix element.\n\t */\n\tconstructor( n11, n12, n21, n22 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tMatrix2.prototype.isMatrix2 = true;\n\n\t\t/**\n\t\t * A column-major list of matrix values.\n\t\t *\n\t\t * @type {Array<number>}\n\t\t */\n\t\tthis.elements = [\n\t\t\t1, 0,\n\t\t\t0, 1,\n\t\t];\n\n\t\tif ( n11 !== undefined ) {\n\n\t\t\tthis.set( n11, n12, n21, n22 );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets this matrix to the 2x2 identity matrix.\n\t *\n\t * @return {Matrix2} A reference to this matrix.\n\t */\n\tidentity() {\n\n\t\tthis.set(\n\t\t\t1, 0,\n\t\t\t0, 1,\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the elements of the matrix from the given array.\n\t *\n\t * @param {Array<number>} array - The matrix elements in column-major order.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Matrix2} A reference to this matrix.\n\t */\n\tfromArray( array, offset = 0 ) {\n\n\t\tfor ( let i = 0; i < 4; i ++ ) {\n\n\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the elements of the matrix.The arguments are supposed to be\n\t * in row-major order.\n\t *\n\t * @param {number} n11 - 1-1 matrix element.\n\t * @param {number} n12 - 1-2 matrix element.\n\t * @param {number} n21 - 2-1 matrix element.\n\t * @param {number} n22 - 2-2 matrix element.\n\t * @return {Matrix2} A reference to this matrix.\n\t */\n\tset( n11, n12, n21, n22 ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] = n11; te[ 2 ] = n12;\n\t\tte[ 1 ] = n21; te[ 3 ] = n22;\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _vector$4 = /*@__PURE__*/ new Vector2();\n\n/**\n * Represents an axis-aligned bounding box (AABB) in 2D space.\n */\nclass Box2 {\n\n\t/**\n\t * Constructs a new bounding box.\n\t *\n\t * @param {Vector2} [min=(Infinity,Infinity)] - A vector representing the lower boundary of the box.\n\t * @param {Vector2} [max=(-Infinity,-Infinity)] - A vector representing the upper boundary of the box.\n\t */\n\tconstructor( min = new Vector2( + Infinity, + Infinity ), max = new Vector2( - Infinity, - Infinity ) ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isBox2 = true;\n\n\t\t/**\n\t\t * The lower boundary of the box.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.min = min;\n\n\t\t/**\n\t\t * The upper boundary of the box.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.max = max;\n\n\t}\n\n\t/**\n\t * Sets the lower and upper boundaries of this box.\n\t * Please note that this method only copies the values from the given objects.\n\t *\n\t * @param {Vector2} min - The lower boundary of the box.\n\t * @param {Vector2} max - The upper boundary of the box.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\tset( min, max ) {\n\n\t\tthis.min.copy( min );\n\t\tthis.max.copy( max );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the upper and lower bounds of this box so it encloses the position data\n\t * in the given array.\n\t *\n\t * @param {Array<Vector2>} points - An array holding 2D position data as instances of {@link Vector2}.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\tsetFromPoints( points ) {\n\n\t\tthis.makeEmpty();\n\n\t\tfor ( let i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\tthis.expandByPoint( points[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Centers this box on the given center vector and sets this box's width, height and\n\t * depth to the given size values.\n\t *\n\t * @param {Vector2} center - The center of the box.\n\t * @param {Vector2} size - The x and y dimensions of the box.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\tsetFromCenterAndSize( center, size ) {\n\n\t\tconst halfSize = _vector$4.copy( size ).multiplyScalar( 0.5 );\n\t\tthis.min.copy( center ).sub( halfSize );\n\t\tthis.max.copy( center ).add( halfSize );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new box with copied values from this instance.\n\t *\n\t * @return {Box2} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Copies the values of the given box to this instance.\n\t *\n\t * @param {Box2} box - The box to copy.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\tcopy( box ) {\n\n\t\tthis.min.copy( box.min );\n\t\tthis.max.copy( box.max );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Makes this box empty which means in encloses a zero space in 2D.\n\t *\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\tmakeEmpty() {\n\n\t\tthis.min.x = this.min.y = + Infinity;\n\t\tthis.max.x = this.max.y = - Infinity;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns true if this box includes zero points within its bounds.\n\t * Note that a box with equal lower and upper bounds still includes one\n\t * point, the one both bounds share.\n\t *\n\t * @return {boolean} Whether this box is empty or not.\n\t */\n\tisEmpty() {\n\n\t\t// this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes\n\n\t\treturn ( this.max.x < this.min.x ) || ( this.max.y < this.min.y );\n\n\t}\n\n\t/**\n\t * Returns the center point of this box.\n\t *\n\t * @param {Vector2} target - The target vector that is used to store the method's result.\n\t * @return {Vector2} The center point.\n\t */\n\tgetCenter( target ) {\n\n\t\treturn this.isEmpty() ? target.set( 0, 0 ) : target.addVectors( this.min, this.max ).multiplyScalar( 0.5 );\n\n\t}\n\n\t/**\n\t * Returns the dimensions of this box.\n\t *\n\t * @param {Vector2} target - The target vector that is used to store the method's result.\n\t * @return {Vector2} The size.\n\t */\n\tgetSize( target ) {\n\n\t\treturn this.isEmpty() ? target.set( 0, 0 ) : target.subVectors( this.max, this.min );\n\n\t}\n\n\t/**\n\t * Expands the boundaries of this box to include the given point.\n\t *\n\t * @param {Vector2} point - The point that should be included by the bounding box.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\texpandByPoint( point ) {\n\n\t\tthis.min.min( point );\n\t\tthis.max.max( point );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Expands this box equilaterally by the given vector. The width of this\n\t * box will be expanded by the x component of the vector in both\n\t * directions. The height of this box will be expanded by the y component of\n\t * the vector in both directions.\n\t *\n\t * @param {Vector2} vector - The vector that should expand the bounding box.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\texpandByVector( vector ) {\n\n\t\tthis.min.sub( vector );\n\t\tthis.max.add( vector );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Expands each dimension of the box by the given scalar. If negative, the\n\t * dimensions of the box will be contracted.\n\t *\n\t * @param {number} scalar - The scalar value that should expand the bounding box.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\texpandByScalar( scalar ) {\n\n\t\tthis.min.addScalar( - scalar );\n\t\tthis.max.addScalar( scalar );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if the given point lies within or on the boundaries of this box.\n\t *\n\t * @param {Vector2} point - The point to test.\n\t * @return {boolean} Whether the bounding box contains the given point or not.\n\t */\n\tcontainsPoint( point ) {\n\n\t\treturn point.x >= this.min.x && point.x <= this.max.x &&\n\t\t\tpoint.y >= this.min.y && point.y <= this.max.y;\n\n\t}\n\n\t/**\n\t * Returns `true` if this bounding box includes the entirety of the given bounding box.\n\t * If this box and the given one are identical, this function also returns `true`.\n\t *\n\t * @param {Box2} box - The bounding box to test.\n\t * @return {boolean} Whether the bounding box contains the given bounding box or not.\n\t */\n\tcontainsBox( box ) {\n\n\t\treturn this.min.x <= box.min.x && box.max.x <= this.max.x &&\n\t\t\tthis.min.y <= box.min.y && box.max.y <= this.max.y;\n\n\t}\n\n\t/**\n\t * Returns a point as a proportion of this box's width and height.\n\t *\n\t * @param {Vector2} point - A point in 2D space.\n\t * @param {Vector2} target - The target vector that is used to store the method's result.\n\t * @return {Vector2} A point as a proportion of this box's width and height.\n\t */\n\tgetParameter( point, target ) {\n\n\t\t// This can potentially have a divide by zero if the box\n\t\t// has a size dimension of 0.\n\n\t\treturn target.set(\n\t\t\t( point.x - this.min.x ) / ( this.max.x - this.min.x ),\n\t\t\t( point.y - this.min.y ) / ( this.max.y - this.min.y )\n\t\t);\n\n\t}\n\n\t/**\n\t * Returns `true` if the given bounding box intersects with this bounding box.\n\t *\n\t * @param {Box2} box - The bounding box to test.\n\t * @return {boolean} Whether the given bounding box intersects with this bounding box.\n\t */\n\tintersectsBox( box ) {\n\n\t\t// using 4 splitting planes to rule out intersections\n\n\t\treturn box.max.x >= this.min.x && box.min.x <= this.max.x &&\n\t\t\tbox.max.y >= this.min.y && box.min.y <= this.max.y;\n\n\t}\n\n\t/**\n\t * Clamps the given point within the bounds of this box.\n\t *\n\t * @param {Vector2} point - The point to clamp.\n\t * @param {Vector2} target - The target vector that is used to store the method's result.\n\t * @return {Vector2} The clamped point.\n\t */\n\tclampPoint( point, target ) {\n\n\t\treturn target.copy( point ).clamp( this.min, this.max );\n\n\t}\n\n\t/**\n\t * Returns the euclidean distance from any edge of this box to the specified point. If\n\t * the given point lies inside of this box, the distance will be `0`.\n\t *\n\t * @param {Vector2} point - The point to compute the distance to.\n\t * @return {number} The euclidean distance.\n\t */\n\tdistanceToPoint( point ) {\n\n\t\treturn this.clampPoint( point, _vector$4 ).distanceTo( point );\n\n\t}\n\n\t/**\n\t * Computes the intersection of this bounding box and the given one, setting the upper\n\t * bound of this box to the lesser of the two boxes' upper bounds and the\n\t * lower bound of this box to the greater of the two boxes' lower bounds. If\n\t * there's no overlap, makes this box empty.\n\t *\n\t * @param {Box2} box - The bounding box to intersect with.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\tintersect( box ) {\n\n\t\tthis.min.max( box.min );\n\t\tthis.max.min( box.max );\n\n\t\tif ( this.isEmpty() ) this.makeEmpty();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes the union of this box and another and the given one, setting the upper\n\t * bound of this box to the greater of the two boxes' upper bounds and the\n\t * lower bound of this box to the lesser of the two boxes' lower bounds.\n\t *\n\t * @param {Box2} box - The bounding box that will be unioned with this instance.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\tunion( box ) {\n\n\t\tthis.min.min( box.min );\n\t\tthis.max.max( box.max );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given offset to both the upper and lower bounds of this bounding box,\n\t * effectively moving it in 2D space.\n\t *\n\t * @param {Vector2} offset - The offset that should be used to translate the bounding box.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\ttranslate( offset ) {\n\n\t\tthis.min.add( offset );\n\t\tthis.max.add( offset );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this bounding box is equal with the given one.\n\t *\n\t * @param {Box2} box - The box to test for equality.\n\t * @return {boolean} Whether this bounding box is equal with the given one.\n\t */\n\tequals( box ) {\n\n\t\treturn box.min.equals( this.min ) && box.max.equals( this.max );\n\n\t}\n\n}\n\nconst _startP = /*@__PURE__*/ new Vector3();\nconst _startEnd = /*@__PURE__*/ new Vector3();\n\nconst _d1 = /*@__PURE__*/ new Vector3();\nconst _d2 = /*@__PURE__*/ new Vector3();\nconst _r = /*@__PURE__*/ new Vector3();\nconst _c1 = /*@__PURE__*/ new Vector3();\nconst _c2 = /*@__PURE__*/ new Vector3();\n\n/**\n * An analytical line segment in 3D space represented by a start and end point.\n */\nclass Line3 {\n\n\t/**\n\t * Constructs a new line segment.\n\t *\n\t * @param {Vector3} [start=(0,0,0)] - Start of the line segment.\n\t * @param {Vector3} [end=(0,0,0)] - End of the line segment.\n\t */\n\tconstructor( start = new Vector3(), end = new Vector3() ) {\n\n\t\t/**\n\t\t * Start of the line segment.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.start = start;\n\n\t\t/**\n\t\t * End of the line segment.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.end = end;\n\n\t}\n\n\t/**\n\t * Sets the start and end values by copying the given vectors.\n\t *\n\t * @param {Vector3} start - The start point.\n\t * @param {Vector3} end - The end point.\n\t * @return {Line3} A reference to this line segment.\n\t */\n\tset( start, end ) {\n\n\t\tthis.start.copy( start );\n\t\tthis.end.copy( end );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the values of the given line segment to this instance.\n\t *\n\t * @param {Line3} line - The line segment to copy.\n\t * @return {Line3} A reference to this line segment.\n\t */\n\tcopy( line ) {\n\n\t\tthis.start.copy( line.start );\n\t\tthis.end.copy( line.end );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the center of the line segment.\n\t *\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The center point.\n\t */\n\tgetCenter( target ) {\n\n\t\treturn target.addVectors( this.start, this.end ).multiplyScalar( 0.5 );\n\n\t}\n\n\t/**\n\t * Returns the delta vector of the line segment's start and end point.\n\t *\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The delta vector.\n\t */\n\tdelta( target ) {\n\n\t\treturn target.subVectors( this.end, this.start );\n\n\t}\n\n\t/**\n\t * Returns the squared Euclidean distance between the line' start and end point.\n\t *\n\t * @return {number} The squared Euclidean distance.\n\t */\n\tdistanceSq() {\n\n\t\treturn this.start.distanceToSquared( this.end );\n\n\t}\n\n\t/**\n\t * Returns the Euclidean distance between the line' start and end point.\n\t *\n\t * @return {number} The Euclidean distance.\n\t */\n\tdistance() {\n\n\t\treturn this.start.distanceTo( this.end );\n\n\t}\n\n\t/**\n\t * Returns a vector at a certain position along the line segment.\n\t *\n\t * @param {number} t - A value between `[0,1]` to represent a position along the line segment.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The delta vector.\n\t */\n\tat( t, target ) {\n\n\t\treturn this.delta( target ).multiplyScalar( t ).add( this.start );\n\n\t}\n\n\t/**\n\t * Returns a point parameter based on the closest point as projected on the line segment.\n\t *\n\t * @param {Vector3} point - The point for which to return a point parameter.\n\t * @param {boolean} clampToLine - Whether to clamp the result to the range `[0,1]` or not.\n\t * @return {number} The point parameter.\n\t */\n\tclosestPointToPointParameter( point, clampToLine ) {\n\n\t\t_startP.subVectors( point, this.start );\n\t\t_startEnd.subVectors( this.end, this.start );\n\n\t\tconst startEnd2 = _startEnd.dot( _startEnd );\n\t\tconst startEnd_startP = _startEnd.dot( _startP );\n\n\t\tlet t = startEnd_startP / startEnd2;\n\n\t\tif ( clampToLine ) {\n\n\t\t\tt = clamp( t, 0, 1 );\n\n\t\t}\n\n\t\treturn t;\n\n\t}\n\n\t/**\n\t * Returns the closest point on the line for a given point.\n\t *\n\t * @param {Vector3} point - The point to compute the closest point on the line for.\n\t * @param {boolean} clampToLine - Whether to clamp the result to the range `[0,1]` or not.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The closest point on the line.\n\t */\n\tclosestPointToPoint( point, clampToLine, target ) {\n\n\t\tconst t = this.closestPointToPointParameter( point, clampToLine );\n\n\t\treturn this.delta( target ).multiplyScalar( t ).add( this.start );\n\n\t}\n\n\t/**\n\t * Returns the closest squared distance between this line segment and the given one.\n\t *\n\t * @param {Line3} line - The line segment to compute the closest squared distance to.\n\t * @param {Vector3} [c1] - The closest point on this line segment.\n\t * @param {Vector3} [c2] - The closest point on the given line segment.\n\t * @return {number} The squared distance between this line segment and the given one.\n\t */\n\tdistanceSqToLine3( line, c1 = _c1, c2 = _c2 ) {\n\n\t\t// from Real-Time Collision Detection by Christer Ericson, chapter 5.1.9\n\n\t\t// Computes closest points C1 and C2 of S1(s)=P1+s*(Q1-P1) and\n\t\t// S2(t)=P2+t*(Q2-P2), returning s and t. Function result is squared\n\t\t// distance between between S1(s) and S2(t)\n\n\t\tconst EPSILON = 1e-8 * 1e-8; // must be squared since we compare squared length\n\t\tlet s, t;\n\n\t\tconst p1 = this.start;\n\t\tconst p2 = line.start;\n\t\tconst q1 = this.end;\n\t\tconst q2 = line.end;\n\n\t\t_d1.subVectors( q1, p1 ); // Direction vector of segment S1\n\t\t_d2.subVectors( q2, p2 ); // Direction vector of segment S2\n\t\t_r.subVectors( p1, p2 );\n\n\t\tconst a = _d1.dot( _d1 ); // Squared length of segment S1, always nonnegative\n\t\tconst e = _d2.dot( _d2 ); // Squared length of segment S2, always nonnegative\n\t\tconst f = _d2.dot( _r );\n\n\t\t// Check if either or both segments degenerate into points\n\n\t\tif ( a <= EPSILON && e <= EPSILON ) {\n\n\t\t\t// Both segments degenerate into points\n\n\t\t\tc1.copy( p1 );\n\t\t\tc2.copy( p2 );\n\n\t\t\tc1.sub( c2 );\n\n\t\t\treturn c1.dot( c1 );\n\n\t\t}\n\n\t\tif ( a <= EPSILON ) {\n\n\t\t\t// First segment degenerates into a point\n\n\t\t\ts = 0;\n\t\t\tt = f / e; // s = 0 => t = (b*s + f) / e = f / e\n\t\t\tt = clamp( t, 0, 1 );\n\n\n\t\t} else {\n\n\t\t\tconst c = _d1.dot( _r );\n\n\t\t\tif ( e <= EPSILON ) {\n\n\t\t\t\t// Second segment degenerates into a point\n\n\t\t\t\tt = 0;\n\t\t\t\ts = clamp( - c / a, 0, 1 ); // t = 0 => s = (b*t - c) / a = -c / a\n\n\t\t\t} else {\n\n\t\t\t\t// The general nondegenerate case starts here\n\n\t\t\t\tconst b = _d1.dot( _d2 );\n\t\t\t\tconst denom = a * e - b * b; // Always nonnegative\n\n\t\t\t\t// If segments not parallel, compute closest point on L1 to L2 and\n\t\t\t\t// clamp to segment S1. Else pick arbitrary s (here 0)\n\n\t\t\t\tif ( denom !== 0 ) {\n\n\t\t\t\t\ts = clamp( ( b * f - c * e ) / denom, 0, 1 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\ts = 0;\n\n\t\t\t\t}\n\n\t\t\t\t// Compute point on L2 closest to S1(s) using\n\t\t\t\t// t = Dot((P1 + D1*s) - P2,D2) / Dot(D2,D2) = (b*s + f) / e\n\n\t\t\t\tt = ( b * s + f ) / e;\n\n\t\t\t\t// If t in [0,1] done. Else clamp t, recompute s for the new value\n\t\t\t\t// of t using s = Dot((P2 + D2*t) - P1,D1) / Dot(D1,D1)= (t*b - c) / a\n\t\t\t\t// and clamp s to [0, 1]\n\n\t\t\t\tif ( t < 0 ) {\n\n\t\t\t\t\tt = 0.;\n\t\t\t\t\ts = clamp( - c / a, 0, 1 );\n\n\t\t\t\t} else if ( t > 1 ) {\n\n\t\t\t\t\tt = 1;\n\t\t\t\t\ts = clamp( ( b - c ) / a, 0, 1 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tc1.copy( p1 ).add( _d1.multiplyScalar( s ) );\n\t\tc2.copy( p2 ).add( _d2.multiplyScalar( t ) );\n\n\t\tc1.sub( c2 );\n\n\t\treturn c1.dot( c1 );\n\n\t}\n\n\t/**\n\t * Applies a 4x4 transformation matrix to this line segment.\n\t *\n\t * @param {Matrix4} matrix - The transformation matrix.\n\t * @return {Line3} A reference to this line segment.\n\t */\n\tapplyMatrix4( matrix ) {\n\n\t\tthis.start.applyMatrix4( matrix );\n\t\tthis.end.applyMatrix4( matrix );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this line segment is equal with the given one.\n\t *\n\t * @param {Line3} line - The line segment to test for equality.\n\t * @return {boolean} Whether this line segment is equal with the given one.\n\t */\n\tequals( line ) {\n\n\t\treturn line.start.equals( this.start ) && line.end.equals( this.end );\n\n\t}\n\n\t/**\n\t * Returns a new line segment with copied values from this instance.\n\t *\n\t * @return {Line3} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nconst _vector$3 = /*@__PURE__*/ new Vector3();\n\n/**\n * This displays a cone shaped helper object for a {@link SpotLight}.\n *\n * ```js\n * const spotLight = new THREE.SpotLight( 0xffffff );\n * spotLight.position.set( 10, 10, 10 );\n * scene.add( spotLight );\n *\n * const spotLightHelper = new THREE.SpotLightHelper( spotLight );\n * scene.add( spotLightHelper );\n * ```\n *\n * @augments Object3D\n */\nclass SpotLightHelper extends Object3D {\n\n\t/**\n\t * Constructs a new spot light helper.\n\t *\n\t * @param {HemisphereLight} light - The light to be visualized.\n\t * @param {number|Color|string} [color] - The helper's color. If not set, the helper will take\n\t * the color of the light.\n\t */\n\tconstructor( light, color ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The light being visualized.\n\t\t *\n\t\t * @type {SpotLight}\n\t\t */\n\t\tthis.light = light;\n\n\t\tthis.matrixAutoUpdate = false;\n\n\t\t/**\n\t\t * The color parameter passed in the constructor.\n\t\t * If not set, the helper will take the color of the light.\n\t\t *\n\t\t * @type {number|Color|string}\n\t\t */\n\t\tthis.color = color;\n\n\t\tthis.type = 'SpotLightHelper';\n\n\t\tconst geometry = new BufferGeometry();\n\n\t\tconst positions = [\n\t\t\t0, 0, 0, \t0, 0, 1,\n\t\t\t0, 0, 0, \t1, 0, 1,\n\t\t\t0, 0, 0,\t-1, 0, 1,\n\t\t\t0, 0, 0, \t0, 1, 1,\n\t\t\t0, 0, 0, \t0, -1, 1\n\t\t];\n\n\t\tfor ( let i = 0, j = 1, l = 32; i < l; i ++, j ++ ) {\n\n\t\t\tconst p1 = ( i / l ) * Math.PI * 2;\n\t\t\tconst p2 = ( j / l ) * Math.PI * 2;\n\n\t\t\tpositions.push(\n\t\t\t\tMath.cos( p1 ), Math.sin( p1 ), 1,\n\t\t\t\tMath.cos( p2 ), Math.sin( p2 ), 1\n\t\t\t);\n\n\t\t}\n\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { fog: false, toneMapped: false } );\n\n\t\tthis.cone = new LineSegments( geometry, material );\n\t\tthis.add( this.cone );\n\n\t\tthis.update();\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.cone.geometry.dispose();\n\t\tthis.cone.material.dispose();\n\n\t}\n\n\t/**\n\t * Updates the helper to match the position and direction of the\n\t * light being visualized.\n\t */\n\tupdate() {\n\n\t\tthis.light.updateWorldMatrix( true, false );\n\t\tthis.light.target.updateWorldMatrix( true, false );\n\n\t\t// update the local matrix based on the parent and light target transforms\n\t\tif ( this.parent ) {\n\n\t\t\tthis.parent.updateWorldMatrix( true );\n\n\t\t\tthis.matrix\n\t\t\t\t.copy( this.parent.matrixWorld )\n\t\t\t\t.invert()\n\t\t\t\t.multiply( this.light.matrixWorld );\n\n\t\t} else {\n\n\t\t\tthis.matrix.copy( this.light.matrixWorld );\n\n\t\t}\n\n\t\tthis.matrixWorld.copy( this.light.matrixWorld );\n\n\t\tconst coneLength = this.light.distance ? this.light.distance : 1000;\n\t\tconst coneWidth = coneLength * Math.tan( this.light.angle );\n\n\t\tthis.cone.scale.set( coneWidth, coneWidth, coneLength );\n\n\t\t_vector$3.setFromMatrixPosition( this.light.target.matrixWorld );\n\n\t\tthis.cone.lookAt( _vector$3 );\n\n\t\tif ( this.color !== undefined ) {\n\n\t\t\tthis.cone.material.color.set( this.color );\n\n\t\t} else {\n\n\t\t\tthis.cone.material.color.copy( this.light.color );\n\n\t\t}\n\n\t}\n\n}\n\nconst _vector$2 = /*@__PURE__*/ new Vector3();\nconst _boneMatrix = /*@__PURE__*/ new Matrix4();\nconst _matrixWorldInv = /*@__PURE__*/ new Matrix4();\n\n/**\n * A helper object to assist with visualizing a {@link Skeleton}.\n *\n * ```js\n * const helper = new THREE.SkeletonHelper( skinnedMesh );\n * scene.add( helper );\n * ```\n *\n * @augments LineSegments\n */\nclass SkeletonHelper extends LineSegments {\n\n\t/**\n\t * Constructs a new skeleton helper.\n\t *\n\t * @param {Object3D} object -  Usually an instance of {@link SkinnedMesh}. However, any 3D object\n\t * can be used if it represents a hierarchy of bones (see {@link Bone}).\n\t */\n\tconstructor( object ) {\n\n\t\tconst bones = getBoneList( object );\n\n\t\tconst geometry = new BufferGeometry();\n\n\t\tconst vertices = [];\n\t\tconst colors = [];\n\n\t\tfor ( let i = 0; i < bones.length; i ++ ) {\n\n\t\t\tconst bone = bones[ i ];\n\n\t\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\t\tvertices.push( 0, 0, 0 );\n\t\t\t\tvertices.push( 0, 0, 0 );\n\t\t\t\tcolors.push( 0, 0, 0 );\n\t\t\t\tcolors.push( 0, 0, 0 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { vertexColors: true, depthTest: false, depthWrite: false, toneMapped: false, transparent: true } );\n\n\t\tsuper( geometry, material );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSkeletonHelper = true;\n\n\t\tthis.type = 'SkeletonHelper';\n\n\t\t/**\n\t\t * The object being visualized.\n\t\t *\n\t\t * @type {Object3D}\n\t\t */\n\t\tthis.root = object;\n\n\t\t/**\n\t\t * The list of bones that the helper visualizes.\n\t\t *\n\t\t * @type {Array<Bone>}\n\t\t */\n\t\tthis.bones = bones;\n\n\t\tthis.matrix = object.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\t// colors\n\n\t\tconst color1 = new Color( 0x0000ff );\n\t\tconst color2 = new Color( 0x00ff00 );\n\n\t\tthis.setColors( color1, color2 );\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tconst bones = this.bones;\n\n\t\tconst geometry = this.geometry;\n\t\tconst position = geometry.getAttribute( 'position' );\n\n\t\t_matrixWorldInv.copy( this.root.matrixWorld ).invert();\n\n\t\tfor ( let i = 0, j = 0; i < bones.length; i ++ ) {\n\n\t\t\tconst bone = bones[ i ];\n\n\t\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\t\t_boneMatrix.multiplyMatrices( _matrixWorldInv, bone.matrixWorld );\n\t\t\t\t_vector$2.setFromMatrixPosition( _boneMatrix );\n\t\t\t\tposition.setXYZ( j, _vector$2.x, _vector$2.y, _vector$2.z );\n\n\t\t\t\t_boneMatrix.multiplyMatrices( _matrixWorldInv, bone.parent.matrixWorld );\n\t\t\t\t_vector$2.setFromMatrixPosition( _boneMatrix );\n\t\t\t\tposition.setXYZ( j + 1, _vector$2.x, _vector$2.y, _vector$2.z );\n\n\t\t\t\tj += 2;\n\n\t\t\t}\n\n\t\t}\n\n\t\tgeometry.getAttribute( 'position' ).needsUpdate = true;\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t}\n\n\t/**\n\t * Defines the colors of the helper.\n\t *\n\t * @param {Color} color1 - The first line color for each bone.\n\t * @param {Color} color2 - The second line color for each bone.\n\t * @return {SkeletonHelper} A reference to this helper.\n\t */\n\tsetColors( color1, color2 ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst colorAttribute = geometry.getAttribute( 'color' );\n\n\t\tfor ( let i = 0; i < colorAttribute.count; i += 2 ) {\n\n\t\t\tcolorAttribute.setXYZ( i, color1.r, color1.g, color1.b );\n\t\t\tcolorAttribute.setXYZ( i + 1, color2.r, color2.g, color2.b );\n\n\t\t}\n\n\t\tcolorAttribute.needsUpdate = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\n\nfunction getBoneList( object ) {\n\n\tconst boneList = [];\n\n\tif ( object.isBone === true ) {\n\n\t\tboneList.push( object );\n\n\t}\n\n\tfor ( let i = 0; i < object.children.length; i ++ ) {\n\n\t\tboneList.push( ...getBoneList( object.children[ i ] ) );\n\n\t}\n\n\treturn boneList;\n\n}\n\n/**\n * This displays a helper object consisting of a spherical mesh for\n * visualizing an instance of {@link PointLight}.\n *\n * ```js\n * const pointLight = new THREE.PointLight( 0xff0000, 1, 100 );\n * pointLight.position.set( 10, 10, 10 );\n * scene.add( pointLight );\n *\n * const sphereSize = 1;\n * const pointLightHelper = new THREE.PointLightHelper( pointLight, sphereSize );\n * scene.add( pointLightHelper );\n * ```\n *\n * @augments Mesh\n */\nclass PointLightHelper extends Mesh {\n\n\t/**\n\t * Constructs a new point light helper.\n\t *\n\t * @param {PointLight} light - The light to be visualized.\n\t * @param {number} [sphereSize=1] - The size of the sphere helper.\n\t * @param {number|Color|string} [color] - The helper's color. If not set, the helper will take\n\t * the color of the light.\n\t */\n\tconstructor( light, sphereSize, color ) {\n\n\t\tconst geometry = new SphereGeometry( sphereSize, 4, 2 );\n\t\tconst material = new MeshBasicMaterial( { wireframe: true, fog: false, toneMapped: false } );\n\n\t\tsuper( geometry, material );\n\n\t\t/**\n\t\t * The light being visualized.\n\t\t *\n\t\t * @type {HemisphereLight}\n\t\t */\n\t\tthis.light = light;\n\n\t\t/**\n\t\t * The color parameter passed in the constructor.\n\t\t * If not set, the helper will take the color of the light.\n\t\t *\n\t\t * @type {number|Color|string}\n\t\t */\n\t\tthis.color = color;\n\n\t\tthis.type = 'PointLightHelper';\n\n\t\tthis.matrix = this.light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.update();\n\n\n\t\t/*\n\t// TODO: delete this comment?\n\tconst distanceGeometry = new THREE.IcosahedronGeometry( 1, 2 );\n\tconst distanceMaterial = new THREE.MeshBasicMaterial( { color: hexColor, fog: false, wireframe: true, opacity: 0.1, transparent: true } );\n\n\tthis.lightSphere = new THREE.Mesh( bulbGeometry, bulbMaterial );\n\tthis.lightDistance = new THREE.Mesh( distanceGeometry, distanceMaterial );\n\n\tconst d = light.distance;\n\n\tif ( d === 0.0 ) {\n\n\t\tthis.lightDistance.visible = false;\n\n\t} else {\n\n\t\tthis.lightDistance.scale.set( d, d, d );\n\n\t}\n\n\tthis.add( this.lightDistance );\n\t*/\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n\t/**\n\t * Updates the helper to match the position of the\n\t * light being visualized.\n\t */\n\tupdate() {\n\n\t\tthis.light.updateWorldMatrix( true, false );\n\n\t\tif ( this.color !== undefined ) {\n\n\t\t\tthis.material.color.set( this.color );\n\n\t\t} else {\n\n\t\t\tthis.material.color.copy( this.light.color );\n\n\t\t}\n\n\t\t/*\n\t\tconst d = this.light.distance;\n\n\t\tif ( d === 0.0 ) {\n\n\t\t\tthis.lightDistance.visible = false;\n\n\t\t} else {\n\n\t\t\tthis.lightDistance.visible = true;\n\t\t\tthis.lightDistance.scale.set( d, d, d );\n\n\t\t}\n\t\t*/\n\n\t}\n\n}\n\nconst _vector$1 = /*@__PURE__*/ new Vector3();\nconst _color1 = /*@__PURE__*/ new Color();\nconst _color2 = /*@__PURE__*/ new Color();\n\n/**\n * Creates a visual aid consisting of a spherical mesh for a\n * given {@link HemisphereLight}.\n *\n * ```js\n * const light = new THREE.HemisphereLight( 0xffffbb, 0x080820, 1 );\n * const helper = new THREE.HemisphereLightHelper( light, 5 );\n * scene.add( helper );\n * ```\n *\n * @augments Object3D\n */\nclass HemisphereLightHelper extends Object3D {\n\n\t/**\n\t * Constructs a new hemisphere light helper.\n\t *\n\t * @param {HemisphereLight} light - The light to be visualized.\n\t * @param {number} [size=1] - The size of the mesh used to visualize the light.\n\t * @param {number|Color|string} [color] - The helper's color. If not set, the helper will take\n\t * the color of the light.\n\t */\n\tconstructor( light, size, color ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The light being visualized.\n\t\t *\n\t\t * @type {HemisphereLight}\n\t\t */\n\t\tthis.light = light;\n\n\t\tthis.matrix = light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\t/**\n\t\t * The color parameter passed in the constructor.\n\t\t * If not set, the helper will take the color of the light.\n\t\t *\n\t\t * @type {number|Color|string}\n\t\t */\n\t\tthis.color = color;\n\n\t\tthis.type = 'HemisphereLightHelper';\n\n\t\tconst geometry = new OctahedronGeometry( size );\n\t\tgeometry.rotateY( Math.PI * 0.5 );\n\n\t\tthis.material = new MeshBasicMaterial( { wireframe: true, fog: false, toneMapped: false } );\n\t\tif ( this.color === undefined ) this.material.vertexColors = true;\n\n\t\tconst position = geometry.getAttribute( 'position' );\n\t\tconst colors = new Float32Array( position.count * 3 );\n\n\t\tgeometry.setAttribute( 'color', new BufferAttribute( colors, 3 ) );\n\n\t\tthis.add( new Mesh( geometry, this.material ) );\n\n\t\tthis.update();\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.children[ 0 ].geometry.dispose();\n\t\tthis.children[ 0 ].material.dispose();\n\n\t}\n\n\t/**\n\t * Updates the helper to match the position and direction of the\n\t * light being visualized.\n\t */\n\tupdate() {\n\n\t\tconst mesh = this.children[ 0 ];\n\n\t\tif ( this.color !== undefined ) {\n\n\t\t\tthis.material.color.set( this.color );\n\n\t\t} else {\n\n\t\t\tconst colors = mesh.geometry.getAttribute( 'color' );\n\n\t\t\t_color1.copy( this.light.color );\n\t\t\t_color2.copy( this.light.groundColor );\n\n\t\t\tfor ( let i = 0, l = colors.count; i < l; i ++ ) {\n\n\t\t\t\tconst color = ( i < ( l / 2 ) ) ? _color1 : _color2;\n\n\t\t\t\tcolors.setXYZ( i, color.r, color.g, color.b );\n\n\t\t\t}\n\n\t\t\tcolors.needsUpdate = true;\n\n\t\t}\n\n\t\tthis.light.updateWorldMatrix( true, false );\n\n\t\tmesh.lookAt( _vector$1.setFromMatrixPosition( this.light.matrixWorld ).negate() );\n\n\t}\n\n}\n\n/**\n * The helper is an object to define grids. Grids are two-dimensional\n * arrays of lines.\n *\n * ```js\n * const size = 10;\n * const divisions = 10;\n *\n * const gridHelper = new THREE.GridHelper( size, divisions );\n * scene.add( gridHelper );\n * ```\n *\n * @augments LineSegments\n */\nclass GridHelper extends LineSegments {\n\n\t/**\n\t * Constructs a new grid helper.\n\t *\n\t * @param {number} [size=10] - The size of the grid.\n\t * @param {number} [divisions=10] - The number of divisions across the grid.\n\t * @param {number|Color|string} [color1=0x444444] - The color of the center line.\n\t * @param {number|Color|string} [color2=0x888888] - The color of the lines of the grid.\n\t */\n\tconstructor( size = 10, divisions = 10, color1 = 0x444444, color2 = 0x888888 ) {\n\n\t\tcolor1 = new Color( color1 );\n\t\tcolor2 = new Color( color2 );\n\n\t\tconst center = divisions / 2;\n\t\tconst step = size / divisions;\n\t\tconst halfSize = size / 2;\n\n\t\tconst vertices = [], colors = [];\n\n\t\tfor ( let i = 0, j = 0, k = - halfSize; i <= divisions; i ++, k += step ) {\n\n\t\t\tvertices.push( - halfSize, 0, k, halfSize, 0, k );\n\t\t\tvertices.push( k, 0, - halfSize, k, 0, halfSize );\n\n\t\t\tconst color = i === center ? color1 : color2;\n\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\n\t\t}\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { vertexColors: true, toneMapped: false } );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.type = 'GridHelper';\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\n/**\n * This helper is an object to define polar grids. Grids are\n * two-dimensional arrays of lines.\n *\n * ```js\n * const radius = 10;\n * const sectors = 16;\n * const rings = 8;\n * const divisions = 64;\n *\n * const helper = new THREE.PolarGridHelper( radius, sectors, rings, divisions );\n * scene.add( helper );\n * ```\n *\n * @augments LineSegments\n */\nclass PolarGridHelper extends LineSegments {\n\n\t/**\n\t * Constructs a new polar grid helper.\n\t *\n\t * @param {number} [radius=10] - The radius of the polar grid. This can be any positive number.\n\t * @param {number} [sectors=16] - The number of sectors the grid will be divided into. This can be any positive integer.\n\t * @param {number} [rings=16] - The number of rings. This can be any positive integer.\n\t * @param {number} [divisions=64] - The number of line segments used for each circle. This can be any positive integer.\n\t * @param {number|Color|string} [color1=0x444444] - The first color used for grid elements.\n\t * @param {number|Color|string} [color2=0x888888] -  The second color used for grid elements.\n\t */\n\tconstructor( radius = 10, sectors = 16, rings = 8, divisions = 64, color1 = 0x444444, color2 = 0x888888 ) {\n\n\t\tcolor1 = new Color( color1 );\n\t\tcolor2 = new Color( color2 );\n\n\t\tconst vertices = [];\n\t\tconst colors = [];\n\n\t\t// create the sectors\n\n\t\tif ( sectors > 1 ) {\n\n\t\t\tfor ( let i = 0; i < sectors; i ++ ) {\n\n\t\t\t\tconst v = ( i / sectors ) * ( Math.PI * 2 );\n\n\t\t\t\tconst x = Math.sin( v ) * radius;\n\t\t\t\tconst z = Math.cos( v ) * radius;\n\n\t\t\t\tvertices.push( 0, 0, 0 );\n\t\t\t\tvertices.push( x, 0, z );\n\n\t\t\t\tconst color = ( i & 1 ) ? color1 : color2;\n\n\t\t\t\tcolors.push( color.r, color.g, color.b );\n\t\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// create the rings\n\n\t\tfor ( let i = 0; i < rings; i ++ ) {\n\n\t\t\tconst color = ( i & 1 ) ? color1 : color2;\n\n\t\t\tconst r = radius - ( radius / rings * i );\n\n\t\t\tfor ( let j = 0; j < divisions; j ++ ) {\n\n\t\t\t\t// first vertex\n\n\t\t\t\tlet v = ( j / divisions ) * ( Math.PI * 2 );\n\n\t\t\t\tlet x = Math.sin( v ) * r;\n\t\t\t\tlet z = Math.cos( v ) * r;\n\n\t\t\t\tvertices.push( x, 0, z );\n\t\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t\t\t// second vertex\n\n\t\t\t\tv = ( ( j + 1 ) / divisions ) * ( Math.PI * 2 );\n\n\t\t\t\tx = Math.sin( v ) * r;\n\t\t\t\tz = Math.cos( v ) * r;\n\n\t\t\t\tvertices.push( x, 0, z );\n\t\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { vertexColors: true, toneMapped: false } );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.type = 'PolarGridHelper';\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\nconst _v1 = /*@__PURE__*/ new Vector3();\nconst _v2 = /*@__PURE__*/ new Vector3();\nconst _v3 = /*@__PURE__*/ new Vector3();\n\n/**\n * Helper object to assist with visualizing a {@link DirectionalLight}'s\n * effect on the scene. This consists of plane and a line representing the\n * light's position and direction.\n *\n * ```js\n * const light = new THREE.DirectionalLight( 0xFFFFFF );\n * scene.add( light );\n *\n * const helper = new THREE.DirectionalLightHelper( light, 5 );\n * scene.add( helper );\n * ```\n *\n * @augments Object3D\n */\nclass DirectionalLightHelper extends Object3D {\n\n\t/**\n\t * Constructs a new directional light helper.\n\t *\n\t * @param {DirectionalLight} light - The light to be visualized.\n\t * @param {number} [size=1] - The dimensions of the plane.\n\t * @param {number|Color|string} [color] - The helper's color. If not set, the helper will take\n\t * the color of the light.\n\t */\n\tconstructor( light, size, color ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The light being visualized.\n\t\t *\n\t\t * @type {DirectionalLight}\n\t\t */\n\t\tthis.light = light;\n\n\t\tthis.matrix = light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\t/**\n\t\t * The color parameter passed in the constructor.\n\t\t * If not set, the helper will take the color of the light.\n\t\t *\n\t\t * @type {number|Color|string}\n\t\t */\n\t\tthis.color = color;\n\n\t\tthis.type = 'DirectionalLightHelper';\n\n\t\tif ( size === undefined ) size = 1;\n\n\t\tlet geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( [\n\t\t\t- size, size, 0,\n\t\t\tsize, size, 0,\n\t\t\tsize, - size, 0,\n\t\t\t- size, - size, 0,\n\t\t\t- size, size, 0\n\t\t], 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { fog: false, toneMapped: false } );\n\n\t\t/**\n\t\t * Contains the line showing the location of the directional light.\n\t\t *\n\t\t * @type {Line}\n\t\t */\n\t\tthis.lightPlane = new Line( geometry, material );\n\t\tthis.add( this.lightPlane );\n\n\t\tgeometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 0, 1 ], 3 ) );\n\n\t\t/**\n\t\t * Represents the target line of the directional light.\n\t\t *\n\t\t * @type {Line}\n\t\t */\n\t\tthis.targetLine = new Line( geometry, material );\n\t\tthis.add( this.targetLine );\n\n\t\tthis.update();\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.lightPlane.geometry.dispose();\n\t\tthis.lightPlane.material.dispose();\n\t\tthis.targetLine.geometry.dispose();\n\t\tthis.targetLine.material.dispose();\n\n\t}\n\n\t/**\n\t * Updates the helper to match the position and direction of the\n\t * light being visualized.\n\t */\n\tupdate() {\n\n\t\tthis.light.updateWorldMatrix( true, false );\n\t\tthis.light.target.updateWorldMatrix( true, false );\n\n\t\t_v1.setFromMatrixPosition( this.light.matrixWorld );\n\t\t_v2.setFromMatrixPosition( this.light.target.matrixWorld );\n\t\t_v3.subVectors( _v2, _v1 );\n\n\t\tthis.lightPlane.lookAt( _v2 );\n\n\t\tif ( this.color !== undefined ) {\n\n\t\t\tthis.lightPlane.material.color.set( this.color );\n\t\t\tthis.targetLine.material.color.set( this.color );\n\n\t\t} else {\n\n\t\t\tthis.lightPlane.material.color.copy( this.light.color );\n\t\t\tthis.targetLine.material.color.copy( this.light.color );\n\n\t\t}\n\n\t\tthis.targetLine.lookAt( _v2 );\n\t\tthis.targetLine.scale.z = _v3.length();\n\n\t}\n\n}\n\nconst _vector = /*@__PURE__*/ new Vector3();\nconst _camera = /*@__PURE__*/ new Camera();\n\n/**\n * This helps with visualizing what a camera contains in its frustum. It\n * visualizes the frustum of a camera using a line segments.\n *\n * Based on frustum visualization in [lightgl.js shadowmap example](https://github.com/evanw/lightgl.js/blob/master/tests/shadowmap.html).\n *\n * `CameraHelper` must be a child of the scene.\n *\n * ```js\n * const camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 1000 );\n * const helper = new THREE.CameraHelper( camera );\n * scene.add( helper );\n * ```\n *\n * @augments LineSegments\n */\nclass CameraHelper extends LineSegments {\n\n\t/**\n\t * Constructs a new arrow helper.\n\t *\n\t * @param {Camera} camera - The camera to visualize.\n\t */\n\tconstructor( camera ) {\n\n\t\tconst geometry = new BufferGeometry();\n\t\tconst material = new LineBasicMaterial( { color: 0xffffff, vertexColors: true, toneMapped: false } );\n\n\t\tconst vertices = [];\n\t\tconst colors = [];\n\n\t\tconst pointMap = {};\n\n\t\t// near\n\n\t\taddLine( 'n1', 'n2' );\n\t\taddLine( 'n2', 'n4' );\n\t\taddLine( 'n4', 'n3' );\n\t\taddLine( 'n3', 'n1' );\n\n\t\t// far\n\n\t\taddLine( 'f1', 'f2' );\n\t\taddLine( 'f2', 'f4' );\n\t\taddLine( 'f4', 'f3' );\n\t\taddLine( 'f3', 'f1' );\n\n\t\t// sides\n\n\t\taddLine( 'n1', 'f1' );\n\t\taddLine( 'n2', 'f2' );\n\t\taddLine( 'n3', 'f3' );\n\t\taddLine( 'n4', 'f4' );\n\n\t\t// cone\n\n\t\taddLine( 'p', 'n1' );\n\t\taddLine( 'p', 'n2' );\n\t\taddLine( 'p', 'n3' );\n\t\taddLine( 'p', 'n4' );\n\n\t\t// up\n\n\t\taddLine( 'u1', 'u2' );\n\t\taddLine( 'u2', 'u3' );\n\t\taddLine( 'u3', 'u1' );\n\n\t\t// target\n\n\t\taddLine( 'c', 't' );\n\t\taddLine( 'p', 'c' );\n\n\t\t// cross\n\n\t\taddLine( 'cn1', 'cn2' );\n\t\taddLine( 'cn3', 'cn4' );\n\n\t\taddLine( 'cf1', 'cf2' );\n\t\taddLine( 'cf3', 'cf4' );\n\n\t\tfunction addLine( a, b ) {\n\n\t\t\taddPoint( a );\n\t\t\taddPoint( b );\n\n\t\t}\n\n\t\tfunction addPoint( id ) {\n\n\t\t\tvertices.push( 0, 0, 0 );\n\t\t\tcolors.push( 0, 0, 0 );\n\n\t\t\tif ( pointMap[ id ] === undefined ) {\n\n\t\t\t\tpointMap[ id ] = [];\n\n\t\t\t}\n\n\t\t\tpointMap[ id ].push( ( vertices.length / 3 ) - 1 );\n\n\t\t}\n\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.type = 'CameraHelper';\n\n\t\t/**\n\t\t * The camera being visualized.\n\t\t *\n\t\t * @type {Camera}\n\t\t */\n\t\tthis.camera = camera;\n\t\tif ( this.camera.updateProjectionMatrix ) this.camera.updateProjectionMatrix();\n\n\t\tthis.matrix = camera.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\t/**\n\t\t * This contains the points used to visualize the camera.\n\t\t *\n\t\t * @type {Object<string,Array<number>>}\n\t\t */\n\t\tthis.pointMap = pointMap;\n\n\t\tthis.update();\n\n\t\t// colors\n\n\t\tconst colorFrustum = new Color( 0xffaa00 );\n\t\tconst colorCone = new Color( 0xff0000 );\n\t\tconst colorUp = new Color( 0x00aaff );\n\t\tconst colorTarget = new Color( 0xffffff );\n\t\tconst colorCross = new Color( 0x333333 );\n\n\t\tthis.setColors( colorFrustum, colorCone, colorUp, colorTarget, colorCross );\n\n\t}\n\n\t/**\n\t * Defines the colors of the helper.\n\t *\n\t * @param {Color} frustum - The frustum line color.\n\t * @param {Color} cone - The cone line color.\n\t * @param {Color} up - The up line color.\n\t * @param {Color} target - The target line color.\n\t * @param {Color} cross - The cross line color.\n\t * @return {CameraHelper} A reference to this helper.\n\t */\n\tsetColors( frustum, cone, up, target, cross ) {\n\n\t\tconst geometry = this.geometry;\n\n\t\tconst colorAttribute = geometry.getAttribute( 'color' );\n\n\t\t// near\n\n\t\tcolorAttribute.setXYZ( 0, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 1, frustum.r, frustum.g, frustum.b ); // n1, n2\n\t\tcolorAttribute.setXYZ( 2, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 3, frustum.r, frustum.g, frustum.b ); // n2, n4\n\t\tcolorAttribute.setXYZ( 4, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 5, frustum.r, frustum.g, frustum.b ); // n4, n3\n\t\tcolorAttribute.setXYZ( 6, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 7, frustum.r, frustum.g, frustum.b ); // n3, n1\n\n\t\t// far\n\n\t\tcolorAttribute.setXYZ( 8, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 9, frustum.r, frustum.g, frustum.b ); // f1, f2\n\t\tcolorAttribute.setXYZ( 10, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 11, frustum.r, frustum.g, frustum.b ); // f2, f4\n\t\tcolorAttribute.setXYZ( 12, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 13, frustum.r, frustum.g, frustum.b ); // f4, f3\n\t\tcolorAttribute.setXYZ( 14, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 15, frustum.r, frustum.g, frustum.b ); // f3, f1\n\n\t\t// sides\n\n\t\tcolorAttribute.setXYZ( 16, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 17, frustum.r, frustum.g, frustum.b ); // n1, f1\n\t\tcolorAttribute.setXYZ( 18, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 19, frustum.r, frustum.g, frustum.b ); // n2, f2\n\t\tcolorAttribute.setXYZ( 20, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 21, frustum.r, frustum.g, frustum.b ); // n3, f3\n\t\tcolorAttribute.setXYZ( 22, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 23, frustum.r, frustum.g, frustum.b ); // n4, f4\n\n\t\t// cone\n\n\t\tcolorAttribute.setXYZ( 24, cone.r, cone.g, cone.b ); colorAttribute.setXYZ( 25, cone.r, cone.g, cone.b ); // p, n1\n\t\tcolorAttribute.setXYZ( 26, cone.r, cone.g, cone.b ); colorAttribute.setXYZ( 27, cone.r, cone.g, cone.b ); // p, n2\n\t\tcolorAttribute.setXYZ( 28, cone.r, cone.g, cone.b ); colorAttribute.setXYZ( 29, cone.r, cone.g, cone.b ); // p, n3\n\t\tcolorAttribute.setXYZ( 30, cone.r, cone.g, cone.b ); colorAttribute.setXYZ( 31, cone.r, cone.g, cone.b ); // p, n4\n\n\t\t// up\n\n\t\tcolorAttribute.setXYZ( 32, up.r, up.g, up.b ); colorAttribute.setXYZ( 33, up.r, up.g, up.b ); // u1, u2\n\t\tcolorAttribute.setXYZ( 34, up.r, up.g, up.b ); colorAttribute.setXYZ( 35, up.r, up.g, up.b ); // u2, u3\n\t\tcolorAttribute.setXYZ( 36, up.r, up.g, up.b ); colorAttribute.setXYZ( 37, up.r, up.g, up.b ); // u3, u1\n\n\t\t// target\n\n\t\tcolorAttribute.setXYZ( 38, target.r, target.g, target.b ); colorAttribute.setXYZ( 39, target.r, target.g, target.b ); // c, t\n\t\tcolorAttribute.setXYZ( 40, cross.r, cross.g, cross.b ); colorAttribute.setXYZ( 41, cross.r, cross.g, cross.b ); // p, c\n\n\t\t// cross\n\n\t\tcolorAttribute.setXYZ( 42, cross.r, cross.g, cross.b ); colorAttribute.setXYZ( 43, cross.r, cross.g, cross.b ); // cn1, cn2\n\t\tcolorAttribute.setXYZ( 44, cross.r, cross.g, cross.b ); colorAttribute.setXYZ( 45, cross.r, cross.g, cross.b ); // cn3, cn4\n\n\t\tcolorAttribute.setXYZ( 46, cross.r, cross.g, cross.b ); colorAttribute.setXYZ( 47, cross.r, cross.g, cross.b ); // cf1, cf2\n\t\tcolorAttribute.setXYZ( 48, cross.r, cross.g, cross.b ); colorAttribute.setXYZ( 49, cross.r, cross.g, cross.b ); // cf3, cf4\n\n\t\tcolorAttribute.needsUpdate = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Updates the helper based on the projection matrix of the camera.\n\t */\n\tupdate() {\n\n\t\tconst geometry = this.geometry;\n\t\tconst pointMap = this.pointMap;\n\n\t\tconst w = 1, h = 1;\n\n\t\tlet nearZ, farZ;\n\n\t\t// we need just camera projection matrix inverse\n\t\t// world matrix must be identity\n\n\t\t_camera.projectionMatrixInverse.copy( this.camera.projectionMatrixInverse );\n\n\t\t// Adjust z values based on coordinate system\n\n\t\tif ( this.camera.reversedDepth === true ) {\n\n\t\t\tnearZ = 1;\n\t\t\tfarZ = 0;\n\n\t\t} else {\n\n\t\t\tif ( this.camera.coordinateSystem === WebGLCoordinateSystem ) {\n\n\t\t\t\tnearZ = -1;\n\t\t\t\tfarZ = 1;\n\n\t\t\t} else if ( this.camera.coordinateSystem === WebGPUCoordinateSystem ) {\n\n\t\t\t\tnearZ = 0;\n\t\t\t\tfarZ = 1;\n\n\t\t\t} else {\n\n\t\t\t\tthrow new Error( 'THREE.CameraHelper.update(): Invalid coordinate system: ' + this.camera.coordinateSystem );\n\n\t\t\t}\n\n\t\t}\n\n\n\t\t// center / target\n\t\tsetPoint( 'c', pointMap, geometry, _camera, 0, 0, nearZ );\n\t\tsetPoint( 't', pointMap, geometry, _camera, 0, 0, farZ );\n\n\t\t// near\n\n\t\tsetPoint( 'n1', pointMap, geometry, _camera, - w, - h, nearZ );\n\t\tsetPoint( 'n2', pointMap, geometry, _camera, w, - h, nearZ );\n\t\tsetPoint( 'n3', pointMap, geometry, _camera, - w, h, nearZ );\n\t\tsetPoint( 'n4', pointMap, geometry, _camera, w, h, nearZ );\n\n\t\t// far\n\n\t\tsetPoint( 'f1', pointMap, geometry, _camera, - w, - h, farZ );\n\t\tsetPoint( 'f2', pointMap, geometry, _camera, w, - h, farZ );\n\t\tsetPoint( 'f3', pointMap, geometry, _camera, - w, h, farZ );\n\t\tsetPoint( 'f4', pointMap, geometry, _camera, w, h, farZ );\n\n\t\t// up\n\n\t\tsetPoint( 'u1', pointMap, geometry, _camera, w * 0.7, h * 1.1, nearZ );\n\t\tsetPoint( 'u2', pointMap, geometry, _camera, - w * 0.7, h * 1.1, nearZ );\n\t\tsetPoint( 'u3', pointMap, geometry, _camera, 0, h * 2, nearZ );\n\n\t\t// cross\n\n\t\tsetPoint( 'cf1', pointMap, geometry, _camera, - w, 0, farZ );\n\t\tsetPoint( 'cf2', pointMap, geometry, _camera, w, 0, farZ );\n\t\tsetPoint( 'cf3', pointMap, geometry, _camera, 0, - h, farZ );\n\t\tsetPoint( 'cf4', pointMap, geometry, _camera, 0, h, farZ );\n\n\t\tsetPoint( 'cn1', pointMap, geometry, _camera, - w, 0, nearZ );\n\t\tsetPoint( 'cn2', pointMap, geometry, _camera, w, 0, nearZ );\n\t\tsetPoint( 'cn3', pointMap, geometry, _camera, 0, - h, nearZ );\n\t\tsetPoint( 'cn4', pointMap, geometry, _camera, 0, h, nearZ );\n\n\t\tgeometry.getAttribute( 'position' ).needsUpdate = true;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\n\nfunction setPoint( point, pointMap, geometry, camera, x, y, z ) {\n\n\t_vector.set( x, y, z ).unproject( camera );\n\n\tconst points = pointMap[ point ];\n\n\tif ( points !== undefined ) {\n\n\t\tconst position = geometry.getAttribute( 'position' );\n\n\t\tfor ( let i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\tposition.setXYZ( points[ i ], _vector.x, _vector.y, _vector.z );\n\n\t\t}\n\n\t}\n\n}\n\nconst _box = /*@__PURE__*/ new Box3();\n\n/**\n * Helper object to graphically show the world-axis-aligned bounding box\n * around an object. The actual bounding box is handled with {@link Box3},\n * this is just a visual helper for debugging. It can be automatically\n * resized with {@link BoxHelper#update} when the object it's created from\n * is transformed. Note that the object must have a geometry for this to work,\n * so it won't work with sprites.\n *\n * ```js\n * const sphere = new THREE.SphereGeometry();\n * const object = new THREE.Mesh( sphere, new THREE.MeshBasicMaterial( 0xff0000 ) );\n * const box = new THREE.BoxHelper( object, 0xffff00 );\n * scene.add( box );\n * ```\n *\n * @augments LineSegments\n */\nclass BoxHelper extends LineSegments {\n\n\t/**\n\t * Constructs a new box helper.\n\t *\n\t * @param {Object3D} [object] - The 3D object to show the world-axis-aligned bounding box.\n\t * @param {number|Color|string} [color=0xffff00] - The box's color.\n\t */\n\tconstructor( object, color = 0xffff00 ) {\n\n\t\tconst indices = new Uint16Array( [ 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 ] );\n\t\tconst positions = new Float32Array( 8 * 3 );\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setIndex( new BufferAttribute( indices, 1 ) );\n\t\tgeometry.setAttribute( 'position', new BufferAttribute( positions, 3 ) );\n\n\t\tsuper( geometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );\n\n\t\t/**\n\t\t * The 3D object being visualized.\n\t\t *\n\t\t * @type {Object3D}\n\t\t */\n\t\tthis.object = object;\n\t\tthis.type = 'BoxHelper';\n\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.update();\n\n\t}\n\n\t/**\n\t * Updates the helper's geometry to match the dimensions of the object,\n\t * including any children.\n\t */\n\tupdate() {\n\n\t\tif ( this.object !== undefined ) {\n\n\t\t\t_box.setFromObject( this.object );\n\n\t\t}\n\n\t\tif ( _box.isEmpty() ) return;\n\n\t\tconst min = _box.min;\n\t\tconst max = _box.max;\n\n\t\t/*\n\t\t\t5____4\n\t\t1/___0/|\n\t\t| 6__|_7\n\t\t2/___3/\n\n\t\t0: max.x, max.y, max.z\n\t\t1: min.x, max.y, max.z\n\t\t2: min.x, min.y, max.z\n\t\t3: max.x, min.y, max.z\n\t\t4: max.x, max.y, min.z\n\t\t5: min.x, max.y, min.z\n\t\t6: min.x, min.y, min.z\n\t\t7: max.x, min.y, min.z\n\t\t*/\n\n\t\tconst position = this.geometry.attributes.position;\n\t\tconst array = position.array;\n\n\t\tarray[ 0 ] = max.x; array[ 1 ] = max.y; array[ 2 ] = max.z;\n\t\tarray[ 3 ] = min.x; array[ 4 ] = max.y; array[ 5 ] = max.z;\n\t\tarray[ 6 ] = min.x; array[ 7 ] = min.y; array[ 8 ] = max.z;\n\t\tarray[ 9 ] = max.x; array[ 10 ] = min.y; array[ 11 ] = max.z;\n\t\tarray[ 12 ] = max.x; array[ 13 ] = max.y; array[ 14 ] = min.z;\n\t\tarray[ 15 ] = min.x; array[ 16 ] = max.y; array[ 17 ] = min.z;\n\t\tarray[ 18 ] = min.x; array[ 19 ] = min.y; array[ 20 ] = min.z;\n\t\tarray[ 21 ] = max.x; array[ 22 ] = min.y; array[ 23 ] = min.z;\n\n\t\tposition.needsUpdate = true;\n\n\t\tthis.geometry.computeBoundingSphere();\n\n\t}\n\n\t/**\n\t * Updates the wireframe box for the passed object.\n\t *\n\t * @param {Object3D} object - The 3D object to create the helper for.\n\t * @return {BoxHelper} A reference to this instance.\n\t */\n\tsetFromObject( object ) {\n\n\t\tthis.object = object;\n\t\tthis.update();\n\n\t\treturn this;\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.object = source.object;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\n/**\n * A helper object to visualize an instance of {@link Box3}.\n *\n * ```js\n * const box = new THREE.Box3();\n * box.setFromCenterAndSize( new THREE.Vector3( 1, 1, 1 ), new THREE.Vector3( 2, 1, 3 ) );\n *\n * const helper = new THREE.Box3Helper( box, 0xffff00 );\n * scene.add( helper )\n * ```\n *\n * @augments LineSegments\n */\nclass Box3Helper extends LineSegments {\n\n\t/**\n\t * Constructs a new box3 helper.\n\t *\n\t * @param {Box3} box - The box to visualize.\n\t * @param {number|Color|string} [color=0xffff00] - The box's color.\n\t */\n\tconstructor( box, color = 0xffff00 ) {\n\n\t\tconst indices = new Uint16Array( [ 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 ] );\n\n\t\tconst positions = [ 1, 1, 1, -1, 1, 1, -1, -1, 1, 1, -1, 1, 1, 1, -1, -1, 1, -1, -1, -1, -1, 1, -1, -1 ];\n\n\t\tconst geometry = new BufferGeometry();\n\n\t\tgeometry.setIndex( new BufferAttribute( indices, 1 ) );\n\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\n\t\tsuper( geometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );\n\n\t\t/**\n\t\t * The box being visualized.\n\t\t *\n\t\t * @type {Box3}\n\t\t */\n\t\tthis.box = box;\n\n\t\tthis.type = 'Box3Helper';\n\n\t\tthis.geometry.computeBoundingSphere();\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tconst box = this.box;\n\n\t\tif ( box.isEmpty() ) return;\n\n\t\tbox.getCenter( this.position );\n\n\t\tbox.getSize( this.scale );\n\n\t\tthis.scale.multiplyScalar( 0.5 );\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\n/**\n * A helper object to visualize an instance of {@link Plane}.\n *\n * ```js\n * const plane = new THREE.Plane( new THREE.Vector3( 1, 1, 0.2 ), 3 );\n * const helper = new THREE.PlaneHelper( plane, 1, 0xffff00 );\n * scene.add( helper );\n * ```\n *\n * @augments Line\n */\nclass PlaneHelper extends Line {\n\n\t/**\n\t * Constructs a new plane helper.\n\t *\n\t * @param {Plane} plane - The plane to be visualized.\n\t * @param {number} [size=1] - The side length of plane helper.\n\t * @param {number|Color|string} [hex=0xffff00] - The helper's color.\n\t */\n\tconstructor( plane, size = 1, hex = 0xffff00 ) {\n\n\t\tconst color = hex;\n\n\t\tconst positions = [ 1, -1, 0, -1, 1, 0, -1, -1, 0, 1, 1, 0, -1, 1, 0, -1, -1, 0, 1, -1, 0, 1, 1, 0 ];\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\t\tgeometry.computeBoundingSphere();\n\n\t\tsuper( geometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );\n\n\t\tthis.type = 'PlaneHelper';\n\n\t\t/**\n\t\t * The plane being visualized.\n\t\t *\n\t\t * @type {Plane}\n\t\t */\n\t\tthis.plane = plane;\n\n\t\t/**\n\t\t * The side length of plane helper.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.size = size;\n\n\t\tconst positions2 = [ 1, 1, 0, -1, 1, 0, -1, -1, 0, 1, 1, 0, -1, -1, 0, 1, -1, 0 ];\n\n\t\tconst geometry2 = new BufferGeometry();\n\t\tgeometry2.setAttribute( 'position', new Float32BufferAttribute( positions2, 3 ) );\n\t\tgeometry2.computeBoundingSphere();\n\n\t\tthis.add( new Mesh( geometry2, new MeshBasicMaterial( { color: color, opacity: 0.2, transparent: true, depthWrite: false, toneMapped: false } ) ) );\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tthis.position.set( 0, 0, 0 );\n\n\t\tthis.scale.set( 0.5 * this.size, 0.5 * this.size, 1 );\n\n\t\tthis.lookAt( this.plane.normal );\n\n\t\tthis.translateZ( - this.plane.constant );\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t}\n\n\t/**\n\t * Updates the helper to match the position and direction of the\n\t * light being visualized.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\t\tthis.children[ 0 ].geometry.dispose();\n\t\tthis.children[ 0 ].material.dispose();\n\n\t}\n\n}\n\nconst _axis = /*@__PURE__*/ new Vector3();\nlet _lineGeometry, _coneGeometry;\n\n/**\n * An 3D arrow object for visualizing directions.\n *\n * ```js\n * const dir = new THREE.Vector3( 1, 2, 0 );\n *\n * //normalize the direction vector (convert to vector of length 1)\n * dir.normalize();\n *\n * const origin = new THREE.Vector3( 0, 0, 0 );\n * const length = 1;\n * const hex = 0xffff00;\n *\n * const arrowHelper = new THREE.ArrowHelper( dir, origin, length, hex );\n * scene.add( arrowHelper );\n * ```\n *\n * @augments Object3D\n */\nclass ArrowHelper extends Object3D {\n\n\t/**\n\t * Constructs a new arrow helper.\n\t *\n\t * @param {Vector3} [dir=(0, 0, 1)] - The (normalized) direction vector.\n\t * @param {Vector3} [origin=(0, 0, 0)] - Point at which the arrow starts.\n\t * @param {number} [length=1] - Length of the arrow in world units.\n\t * @param {(number|Color|string)} [color=0xffff00] - Color of the arrow.\n\t * @param {number} [headLength=length*0.2] - The length of the head of the arrow.\n\t * @param {number} [headWidth=headLength*0.2] - The width of the head of the arrow.\n\t */\n\tconstructor( dir = new Vector3( 0, 0, 1 ), origin = new Vector3( 0, 0, 0 ), length = 1, color = 0xffff00, headLength = length * 0.2, headWidth = headLength * 0.2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'ArrowHelper';\n\n\t\tif ( _lineGeometry === undefined ) {\n\n\t\t\t_lineGeometry = new BufferGeometry();\n\t\t\t_lineGeometry.setAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 1, 0 ], 3 ) );\n\n\t\t\t_coneGeometry = new ConeGeometry( 0.5, 1, 5, 1 );\n\t\t\t_coneGeometry.translate( 0, -0.5, 0 );\n\n\t\t}\n\n\t\tthis.position.copy( origin );\n\n\t\t/**\n\t\t * The line part of the arrow helper.\n\t\t *\n\t\t * @type {Line}\n\t\t */\n\t\tthis.line = new Line( _lineGeometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );\n\t\tthis.line.matrixAutoUpdate = false;\n\t\tthis.add( this.line );\n\n\t\t/**\n\t\t * The cone part of the arrow helper.\n\t\t *\n\t\t * @type {Mesh}\n\t\t */\n\t\tthis.cone = new Mesh( _coneGeometry, new MeshBasicMaterial( { color: color, toneMapped: false } ) );\n\t\tthis.cone.matrixAutoUpdate = false;\n\t\tthis.add( this.cone );\n\n\t\tthis.setDirection( dir );\n\t\tthis.setLength( length, headLength, headWidth );\n\n\t}\n\n\t/**\n\t * Sets the direction of the helper.\n\t *\n\t * @param {Vector3} dir - The normalized direction vector.\n\t */\n\tsetDirection( dir ) {\n\n\t\t// dir is assumed to be normalized\n\n\t\tif ( dir.y > 0.99999 ) {\n\n\t\t\tthis.quaternion.set( 0, 0, 0, 1 );\n\n\t\t} else if ( dir.y < -0.99999 ) {\n\n\t\t\tthis.quaternion.set( 1, 0, 0, 0 );\n\n\t\t} else {\n\n\t\t\t_axis.set( dir.z, 0, - dir.x ).normalize();\n\n\t\t\tconst radians = Math.acos( dir.y );\n\n\t\t\tthis.quaternion.setFromAxisAngle( _axis, radians );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the length of the helper.\n\t *\n\t * @param {number} length - Length of the arrow in world units.\n\t * @param {number} [headLength=length*0.2] - The length of the head of the arrow.\n\t * @param {number} [headWidth=headLength*0.2] - The width of the head of the arrow.\n\t */\n\tsetLength( length, headLength = length * 0.2, headWidth = headLength * 0.2 ) {\n\n\t\tthis.line.scale.set( 1, Math.max( 0.0001, length - headLength ), 1 ); // see #17458\n\t\tthis.line.updateMatrix();\n\n\t\tthis.cone.scale.set( headWidth, headLength, headWidth );\n\t\tthis.cone.position.y = length;\n\t\tthis.cone.updateMatrix();\n\n\t}\n\n\t/**\n\t * Sets the color of the helper.\n\t *\n\t * @param {number|Color|string} color - The color to set.\n\t */\n\tsetColor( color ) {\n\n\t\tthis.line.material.color.set( color );\n\t\tthis.cone.material.color.set( color );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source, false );\n\n\t\tthis.line.copy( source.line );\n\t\tthis.cone.copy( source.cone );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.line.geometry.dispose();\n\t\tthis.line.material.dispose();\n\t\tthis.cone.geometry.dispose();\n\t\tthis.cone.material.dispose();\n\n\t}\n\n}\n\n/**\n * An axis object to visualize the 3 axes in a simple way.\n * The X axis is red. The Y axis is green. The Z axis is blue.\n *\n * ```js\n * const axesHelper = new THREE.AxesHelper( 5 );\n * scene.add( axesHelper );\n * ```\n *\n * @augments LineSegments\n */\nclass AxesHelper extends LineSegments {\n\n\t/**\n\t * Constructs a new axes helper.\n\t *\n\t * @param {number} [size=1] - Size of the lines representing the axes.\n\t */\n\tconstructor( size = 1 ) {\n\n\t\tconst vertices = [\n\t\t\t0, 0, 0,\tsize, 0, 0,\n\t\t\t0, 0, 0,\t0, size, 0,\n\t\t\t0, 0, 0,\t0, 0, size\n\t\t];\n\n\t\tconst colors = [\n\t\t\t1, 0, 0,\t1, 0.6, 0,\n\t\t\t0, 1, 0,\t0.6, 1, 0,\n\t\t\t0, 0, 1,\t0, 0.6, 1\n\t\t];\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { vertexColors: true, toneMapped: false } );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.type = 'AxesHelper';\n\n\t}\n\n\t/**\n\t * Defines the colors of the axes helper.\n\t *\n\t * @param {number|Color|string} xAxisColor - The color for the x axis.\n\t * @param {number|Color|string} yAxisColor - The color for the y axis.\n\t * @param {number|Color|string} zAxisColor - The color for the z axis.\n\t * @return {AxesHelper} A reference to this axes helper.\n\t */\n\tsetColors( xAxisColor, yAxisColor, zAxisColor ) {\n\n\t\tconst color = new Color();\n\t\tconst array = this.geometry.attributes.color.array;\n\n\t\tcolor.set( xAxisColor );\n\t\tcolor.toArray( array, 0 );\n\t\tcolor.toArray( array, 3 );\n\n\t\tcolor.set( yAxisColor );\n\t\tcolor.toArray( array, 6 );\n\t\tcolor.toArray( array, 9 );\n\n\t\tcolor.set( zAxisColor );\n\t\tcolor.toArray( array, 12 );\n\t\tcolor.toArray( array, 15 );\n\n\t\tthis.geometry.attributes.color.needsUpdate = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\n/**\n * This class is used to convert a series of paths to an array of\n * shapes. It is specifically used in context of fonts and SVG.\n */\nclass ShapePath {\n\n\t/**\n\t * Constructs a new shape path.\n\t */\n\tconstructor() {\n\n\t\tthis.type = 'ShapePath';\n\n\t\t/**\n\t\t * The color of the shape.\n\t\t *\n\t\t * @type {Color}\n\t\t */\n\t\tthis.color = new Color();\n\n\t\t/**\n\t\t * The paths that have been generated for this shape.\n\t\t *\n\t\t * @type {Array<Path>}\n\t\t * @default null\n\t\t */\n\t\tthis.subPaths = [];\n\n\t\t/**\n\t\t * The current path that is being generated.\n\t\t *\n\t\t * @type {?Path}\n\t\t * @default null\n\t\t */\n\t\tthis.currentPath = null;\n\n\t}\n\n\t/**\n\t * Creates a new path and moves it current point to the given one.\n\t *\n\t * @param {number} x - The x coordinate.\n\t * @param {number} y - The y coordinate.\n\t * @return {ShapePath} A reference to this shape path.\n\t */\n\tmoveTo( x, y ) {\n\n\t\tthis.currentPath = new Path();\n\t\tthis.subPaths.push( this.currentPath );\n\t\tthis.currentPath.moveTo( x, y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an instance of {@link LineCurve} to the path by connecting\n\t * the current point with the given one.\n\t *\n\t * @param {number} x - The x coordinate of the end point.\n\t * @param {number} y - The y coordinate of the end point.\n\t * @return {ShapePath} A reference to this shape path.\n\t */\n\tlineTo( x, y ) {\n\n\t\tthis.currentPath.lineTo( x, y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an instance of {@link QuadraticBezierCurve} to the path by connecting\n\t * the current point with the given one.\n\t *\n\t * @param {number} aCPx - The x coordinate of the control point.\n\t * @param {number} aCPy - The y coordinate of the control point.\n\t * @param {number} aX - The x coordinate of the end point.\n\t * @param {number} aY - The y coordinate of the end point.\n\t * @return {ShapePath} A reference to this shape path.\n\t */\n\tquadraticCurveTo( aCPx, aCPy, aX, aY ) {\n\n\t\tthis.currentPath.quadraticCurveTo( aCPx, aCPy, aX, aY );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an instance of {@link CubicBezierCurve} to the path by connecting\n\t * the current point with the given one.\n\t *\n\t * @param {number} aCP1x - The x coordinate of the first control point.\n\t * @param {number} aCP1y - The y coordinate of the first control point.\n\t * @param {number} aCP2x - The x coordinate of the second control point.\n\t * @param {number} aCP2y - The y coordinate of the second control point.\n\t * @param {number} aX - The x coordinate of the end point.\n\t * @param {number} aY - The y coordinate of the end point.\n\t * @return {ShapePath} A reference to this shape path.\n\t */\n\tbezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) {\n\n\t\tthis.currentPath.bezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an instance of {@link SplineCurve} to the path by connecting\n\t * the current point with the given list of points.\n\t *\n\t * @param {Array<Vector2>} pts - An array of points in 2D space.\n\t * @return {ShapePath} A reference to this shape path.\n\t */\n\tsplineThru( pts ) {\n\n\t\tthis.currentPath.splineThru( pts );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Converts the paths into an array of shapes.\n\t *\n\t * @param {boolean} isCCW - By default solid shapes are  defined clockwise (CW) and holes are defined counterclockwise (CCW).\n\t * If this flag is set to `true`, then those are flipped.\n\t * @return {Array<Shape>} An array of shapes.\n\t */\n\ttoShapes( isCCW ) {\n\n\t\tfunction toShapesNoHoles( inSubpaths ) {\n\n\t\t\tconst shapes = [];\n\n\t\t\tfor ( let i = 0, l = inSubpaths.length; i < l; i ++ ) {\n\n\t\t\t\tconst tmpPath = inSubpaths[ i ];\n\n\t\t\t\tconst tmpShape = new Shape();\n\t\t\t\ttmpShape.curves = tmpPath.curves;\n\n\t\t\t\tshapes.push( tmpShape );\n\n\t\t\t}\n\n\t\t\treturn shapes;\n\n\t\t}\n\n\t\tfunction isPointInsidePolygon( inPt, inPolygon ) {\n\n\t\t\tconst polyLen = inPolygon.length;\n\n\t\t\t// inPt on polygon contour => immediate success    or\n\t\t\t// toggling of inside/outside at every single! intersection point of an edge\n\t\t\t//  with the horizontal line through inPt, left of inPt\n\t\t\t//  not counting lowerY endpoints of edges and whole edges on that line\n\t\t\tlet inside = false;\n\t\t\tfor ( let p = polyLen - 1, q = 0; q < polyLen; p = q ++ ) {\n\n\t\t\t\tlet edgeLowPt = inPolygon[ p ];\n\t\t\t\tlet edgeHighPt = inPolygon[ q ];\n\n\t\t\t\tlet edgeDx = edgeHighPt.x - edgeLowPt.x;\n\t\t\t\tlet edgeDy = edgeHighPt.y - edgeLowPt.y;\n\n\t\t\t\tif ( Math.abs( edgeDy ) > Number.EPSILON ) {\n\n\t\t\t\t\t// not parallel\n\t\t\t\t\tif ( edgeDy < 0 ) {\n\n\t\t\t\t\t\tedgeLowPt = inPolygon[ q ]; edgeDx = - edgeDx;\n\t\t\t\t\t\tedgeHighPt = inPolygon[ p ]; edgeDy = - edgeDy;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ( inPt.y < edgeLowPt.y ) || ( inPt.y > edgeHighPt.y ) ) \t\tcontinue;\n\n\t\t\t\t\tif ( inPt.y === edgeLowPt.y ) {\n\n\t\t\t\t\t\tif ( inPt.x === edgeLowPt.x )\t\treturn\ttrue;\t\t// inPt is on contour ?\n\t\t\t\t\t\t// continue;\t\t\t\t// no intersection or edgeLowPt => doesn't count !!!\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconst perpEdge = edgeDy * ( inPt.x - edgeLowPt.x ) - edgeDx * ( inPt.y - edgeLowPt.y );\n\t\t\t\t\t\tif ( perpEdge === 0 )\t\t\t\treturn\ttrue;\t\t// inPt is on contour ?\n\t\t\t\t\t\tif ( perpEdge < 0 ) \t\t\t\tcontinue;\n\t\t\t\t\t\tinside = ! inside;\t\t// true intersection left of inPt\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// parallel or collinear\n\t\t\t\t\tif ( inPt.y !== edgeLowPt.y ) \t\tcontinue;\t\t\t// parallel\n\t\t\t\t\t// edge lies on the same horizontal line as inPt\n\t\t\t\t\tif ( ( ( edgeHighPt.x <= inPt.x ) && ( inPt.x <= edgeLowPt.x ) ) ||\n\t\t\t\t\t\t ( ( edgeLowPt.x <= inPt.x ) && ( inPt.x <= edgeHighPt.x ) ) )\t\treturn\ttrue;\t// inPt: Point on contour !\n\t\t\t\t\t// continue;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn\tinside;\n\n\t\t}\n\n\t\tconst isClockWise = ShapeUtils.isClockWise;\n\n\t\tconst subPaths = this.subPaths;\n\t\tif ( subPaths.length === 0 ) return [];\n\n\t\tlet solid, tmpPath, tmpShape;\n\t\tconst shapes = [];\n\n\t\tif ( subPaths.length === 1 ) {\n\n\t\t\ttmpPath = subPaths[ 0 ];\n\t\t\ttmpShape = new Shape();\n\t\t\ttmpShape.curves = tmpPath.curves;\n\t\t\tshapes.push( tmpShape );\n\t\t\treturn shapes;\n\n\t\t}\n\n\t\tlet holesFirst = ! isClockWise( subPaths[ 0 ].getPoints() );\n\t\tholesFirst = isCCW ? ! holesFirst : holesFirst;\n\n\t\t// log(\"Holes first\", holesFirst);\n\n\t\tconst betterShapeHoles = [];\n\t\tconst newShapes = [];\n\t\tlet newShapeHoles = [];\n\t\tlet mainIdx = 0;\n\t\tlet tmpPoints;\n\n\t\tnewShapes[ mainIdx ] = undefined;\n\t\tnewShapeHoles[ mainIdx ] = [];\n\n\t\tfor ( let i = 0, l = subPaths.length; i < l; i ++ ) {\n\n\t\t\ttmpPath = subPaths[ i ];\n\t\t\ttmpPoints = tmpPath.getPoints();\n\t\t\tsolid = isClockWise( tmpPoints );\n\t\t\tsolid = isCCW ? ! solid : solid;\n\n\t\t\tif ( solid ) {\n\n\t\t\t\tif ( ( ! holesFirst ) && ( newShapes[ mainIdx ] ) )\tmainIdx ++;\n\n\t\t\t\tnewShapes[ mainIdx ] = { s: new Shape(), p: tmpPoints };\n\t\t\t\tnewShapes[ mainIdx ].s.curves = tmpPath.curves;\n\n\t\t\t\tif ( holesFirst )\tmainIdx ++;\n\t\t\t\tnewShapeHoles[ mainIdx ] = [];\n\n\t\t\t\t//log('cw', i);\n\n\t\t\t} else {\n\n\t\t\t\tnewShapeHoles[ mainIdx ].push( { h: tmpPath, p: tmpPoints[ 0 ] } );\n\n\t\t\t\t//log('ccw', i);\n\n\t\t\t}\n\n\t\t}\n\n\t\t// only Holes? -> probably all Shapes with wrong orientation\n\t\tif ( ! newShapes[ 0 ] )\treturn\ttoShapesNoHoles( subPaths );\n\n\n\t\tif ( newShapes.length > 1 ) {\n\n\t\t\tlet ambiguous = false;\n\t\t\tlet toChange = 0;\n\n\t\t\tfor ( let sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) {\n\n\t\t\t\tbetterShapeHoles[ sIdx ] = [];\n\n\t\t\t}\n\n\t\t\tfor ( let sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) {\n\n\t\t\t\tconst sho = newShapeHoles[ sIdx ];\n\n\t\t\t\tfor ( let hIdx = 0; hIdx < sho.length; hIdx ++ ) {\n\n\t\t\t\t\tconst ho = sho[ hIdx ];\n\t\t\t\t\tlet hole_unassigned = true;\n\n\t\t\t\t\tfor ( let s2Idx = 0; s2Idx < newShapes.length; s2Idx ++ ) {\n\n\t\t\t\t\t\tif ( isPointInsidePolygon( ho.p, newShapes[ s2Idx ].p ) ) {\n\n\t\t\t\t\t\t\tif ( sIdx !== s2Idx )\ttoChange ++;\n\n\t\t\t\t\t\t\tif ( hole_unassigned ) {\n\n\t\t\t\t\t\t\t\thole_unassigned = false;\n\t\t\t\t\t\t\t\tbetterShapeHoles[ s2Idx ].push( ho );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tambiguous = true;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( hole_unassigned ) {\n\n\t\t\t\t\t\tbetterShapeHoles[ sIdx ].push( ho );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( toChange > 0 && ambiguous === false ) {\n\n\t\t\t\tnewShapeHoles = betterShapeHoles;\n\n\t\t\t}\n\n\t\t}\n\n\t\tlet tmpHoles;\n\n\t\tfor ( let i = 0, il = newShapes.length; i < il; i ++ ) {\n\n\t\t\ttmpShape = newShapes[ i ].s;\n\t\t\tshapes.push( tmpShape );\n\t\t\ttmpHoles = newShapeHoles[ i ];\n\n\t\t\tfor ( let j = 0, jl = tmpHoles.length; j < jl; j ++ ) {\n\n\t\t\t\ttmpShape.holes.push( tmpHoles[ j ].h );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//log(\"shape\", shapes);\n\n\t\treturn shapes;\n\n\t}\n\n}\n\n/**\n * Abstract base class for controls.\n *\n * @abstract\n * @augments EventDispatcher\n */\nclass Controls extends EventDispatcher {\n\n\t/**\n\t * Constructs a new controls instance.\n\t *\n\t * @param {Object3D} object - The object that is managed by the controls.\n\t * @param {?HTMLElement} domElement - The HTML element used for event listeners.\n\t */\n\tconstructor( object, domElement = null ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The object that is managed by the controls.\n\t\t *\n\t\t * @type {Object3D}\n\t\t */\n\t\tthis.object = object;\n\n\t\t/**\n\t\t * The HTML element used for event listeners.\n\t\t *\n\t\t * @type {?HTMLElement}\n\t\t * @default null\n\t\t */\n\t\tthis.domElement = domElement;\n\n\t\t/**\n\t\t * Whether the controls responds to user input or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.enabled = true;\n\n\t\t/**\n\t\t * The internal state of the controls.\n\t\t *\n\t\t * @type {number}\n\t\t * @default -1\n\t\t */\n\t\tthis.state = -1;\n\n\t\t/**\n\t\t * This object defines the keyboard input of the controls.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.keys = {};\n\n\t\t/**\n\t\t * This object defines what type of actions are assigned to the available mouse buttons.\n\t\t * It depends on the control implementation what kind of mouse buttons and actions are supported.\n\t\t *\n\t\t * @type {{LEFT: ?number, MIDDLE: ?number, RIGHT: ?number}}\n\t\t */\n\t\tthis.mouseButtons = { LEFT: null, MIDDLE: null, RIGHT: null };\n\n\t\t/**\n\t\t * This object defines what type of actions are assigned to what kind of touch interaction.\n\t\t * It depends on the control implementation what kind of touch interaction and actions are supported.\n\t\t *\n\t\t * @type {{ONE: ?number, TWO: ?number}}\n\t\t */\n\t\tthis.touches = { ONE: null, TWO: null };\n\n\t}\n\n\t/**\n\t * Connects the controls to the DOM. This method has so called \"side effects\" since\n\t * it adds the module's event listeners to the DOM.\n\t *\n\t * @param {HTMLElement} element - The DOM element to connect to.\n\t */\n\tconnect( element ) {\n\n\t\tif ( element === undefined ) {\n\n\t\t\twarn( 'Controls: connect() now requires an element.' ); // @deprecated, the warning can be removed with r185\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( this.domElement !== null ) this.disconnect();\n\n\t\tthis.domElement = element;\n\n\t}\n\n\t/**\n\t * Disconnects the controls from the DOM.\n\t */\n\tdisconnect() {}\n\n\t/**\n\t * Call this method if you no longer want use to the controls. It frees all internal\n\t * resources and removes all event listeners.\n\t */\n\tdispose() {}\n\n\t/**\n\t * Controls should implement this method if they have to update their internal state\n\t * per simulation step.\n\t *\n\t * @param {number} [delta] - The time delta in seconds.\n\t */\n\tupdate( /* delta */ ) {}\n\n}\n\n/**\n * Scales the texture as large as possible within its surface without cropping\n * or stretching the texture. The method preserves the original aspect ratio of\n * the texture. Akin to CSS `object-fit: contain`\n *\n * @param {Texture} texture - The texture.\n * @param {number} aspect - The texture's aspect ratio.\n * @return {Texture} The updated texture.\n */\nfunction contain( texture, aspect ) {\n\n\tconst imageAspect = ( texture.image && texture.image.width ) ? texture.image.width / texture.image.height : 1;\n\n\tif ( imageAspect > aspect ) {\n\n\t\ttexture.repeat.x = 1;\n\t\ttexture.repeat.y = imageAspect / aspect;\n\n\t\ttexture.offset.x = 0;\n\t\ttexture.offset.y = ( 1 - texture.repeat.y ) / 2;\n\n\t} else {\n\n\t\ttexture.repeat.x = aspect / imageAspect;\n\t\ttexture.repeat.y = 1;\n\n\t\ttexture.offset.x = ( 1 - texture.repeat.x ) / 2;\n\t\ttexture.offset.y = 0;\n\n\t}\n\n\treturn texture;\n\n}\n\n/**\n * Scales the texture to the smallest possible size to fill the surface, leaving\n * no empty space. The method preserves the original aspect ratio of the texture.\n * Akin to CSS `object-fit: cover`.\n *\n * @param {Texture} texture - The texture.\n * @param {number} aspect - The texture's aspect ratio.\n * @return {Texture} The updated texture.\n */\nfunction cover( texture, aspect ) {\n\n\tconst imageAspect = ( texture.image && texture.image.width ) ? texture.image.width / texture.image.height : 1;\n\n\tif ( imageAspect > aspect ) {\n\n\t\ttexture.repeat.x = aspect / imageAspect;\n\t\ttexture.repeat.y = 1;\n\n\t\ttexture.offset.x = ( 1 - texture.repeat.x ) / 2;\n\t\ttexture.offset.y = 0;\n\n\t} else {\n\n\t\ttexture.repeat.x = 1;\n\t\ttexture.repeat.y = imageAspect / aspect;\n\n\t\ttexture.offset.x = 0;\n\t\ttexture.offset.y = ( 1 - texture.repeat.y ) / 2;\n\n\t}\n\n\treturn texture;\n\n}\n\n/**\n * Configures the texture to the default transformation. Akin to CSS `object-fit: fill`.\n *\n * @param {Texture} texture - The texture.\n * @return {Texture} The updated texture.\n */\nfunction fill( texture ) {\n\n\ttexture.repeat.x = 1;\n\ttexture.repeat.y = 1;\n\n\ttexture.offset.x = 0;\n\ttexture.offset.y = 0;\n\n\treturn texture;\n\n}\n\n/**\n * Determines how many bytes must be used to represent the texture.\n *\n * @param {number} width - The width of the texture.\n * @param {number} height - The height of the texture.\n * @param {number} format - The texture's format.\n * @param {number} type - The texture's type.\n * @return {number} The byte length.\n */\nfunction getByteLength( width, height, format, type ) {\n\n\tconst typeByteLength = getTextureTypeByteLength( type );\n\n\tswitch ( format ) {\n\n\t\t// https://registry.khronos.org/OpenGL-Refpages/es3.0/html/glTexImage2D.xhtml\n\t\tcase AlphaFormat:\n\t\t\treturn width * height;\n\t\tcase RedFormat:\n\t\t\treturn ( ( width * height ) / typeByteLength.components ) * typeByteLength.byteLength;\n\t\tcase RedIntegerFormat:\n\t\t\treturn ( ( width * height ) / typeByteLength.components ) * typeByteLength.byteLength;\n\t\tcase RGFormat:\n\t\t\treturn ( ( width * height * 2 ) / typeByteLength.components ) * typeByteLength.byteLength;\n\t\tcase RGIntegerFormat:\n\t\t\treturn ( ( width * height * 2 ) / typeByteLength.components ) * typeByteLength.byteLength;\n\t\tcase RGBFormat:\n\t\t\treturn ( ( width * height * 3 ) / typeByteLength.components ) * typeByteLength.byteLength;\n\t\tcase RGBAFormat:\n\t\t\treturn ( ( width * height * 4 ) / typeByteLength.components ) * typeByteLength.byteLength;\n\t\tcase RGBAIntegerFormat:\n\t\t\treturn ( ( width * height * 4 ) / typeByteLength.components ) * typeByteLength.byteLength;\n\n\t\t// https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_s3tc_srgb/\n\t\tcase RGB_S3TC_DXT1_Format:\n\t\tcase RGBA_S3TC_DXT1_Format:\n\t\t\treturn Math.floor( ( width + 3 ) / 4 ) * Math.floor( ( height + 3 ) / 4 ) * 8;\n\t\tcase RGBA_S3TC_DXT3_Format:\n\t\tcase RGBA_S3TC_DXT5_Format:\n\t\t\treturn Math.floor( ( width + 3 ) / 4 ) * Math.floor( ( height + 3 ) / 4 ) * 16;\n\n\t\t// https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_pvrtc/\n\t\tcase RGB_PVRTC_2BPPV1_Format:\n\t\tcase RGBA_PVRTC_2BPPV1_Format:\n\t\t\treturn ( Math.max( width, 16 ) * Math.max( height, 8 ) ) / 4;\n\t\tcase RGB_PVRTC_4BPPV1_Format:\n\t\tcase RGBA_PVRTC_4BPPV1_Format:\n\t\t\treturn ( Math.max( width, 8 ) * Math.max( height, 8 ) ) / 2;\n\n\t\t// https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_etc/\n\t\tcase RGB_ETC1_Format:\n\t\tcase RGB_ETC2_Format:\n\t\t\treturn Math.floor( ( width + 3 ) / 4 ) * Math.floor( ( height + 3 ) / 4 ) * 8;\n\t\tcase RGBA_ETC2_EAC_Format:\n\t\t\treturn Math.floor( ( width + 3 ) / 4 ) * Math.floor( ( height + 3 ) / 4 ) * 16;\n\n\t\t// https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_astc/\n\t\tcase RGBA_ASTC_4x4_Format:\n\t\t\treturn Math.floor( ( width + 3 ) / 4 ) * Math.floor( ( height + 3 ) / 4 ) * 16;\n\t\tcase RGBA_ASTC_5x4_Format:\n\t\t\treturn Math.floor( ( width + 4 ) / 5 ) * Math.floor( ( height + 3 ) / 4 ) * 16;\n\t\tcase RGBA_ASTC_5x5_Format:\n\t\t\treturn Math.floor( ( width + 4 ) / 5 ) * Math.floor( ( height + 4 ) / 5 ) * 16;\n\t\tcase RGBA_ASTC_6x5_Format:\n\t\t\treturn Math.floor( ( width + 5 ) / 6 ) * Math.floor( ( height + 4 ) / 5 ) * 16;\n\t\tcase RGBA_ASTC_6x6_Format:\n\t\t\treturn Math.floor( ( width + 5 ) / 6 ) * Math.floor( ( height + 5 ) / 6 ) * 16;\n\t\tcase RGBA_ASTC_8x5_Format:\n\t\t\treturn Math.floor( ( width + 7 ) / 8 ) * Math.floor( ( height + 4 ) / 5 ) * 16;\n\t\tcase RGBA_ASTC_8x6_Format:\n\t\t\treturn Math.floor( ( width + 7 ) / 8 ) * Math.floor( ( height + 5 ) / 6 ) * 16;\n\t\tcase RGBA_ASTC_8x8_Format:\n\t\t\treturn Math.floor( ( width + 7 ) / 8 ) * Math.floor( ( height + 7 ) / 8 ) * 16;\n\t\tcase RGBA_ASTC_10x5_Format:\n\t\t\treturn Math.floor( ( width + 9 ) / 10 ) * Math.floor( ( height + 4 ) / 5 ) * 16;\n\t\tcase RGBA_ASTC_10x6_Format:\n\t\t\treturn Math.floor( ( width + 9 ) / 10 ) * Math.floor( ( height + 5 ) / 6 ) * 16;\n\t\tcase RGBA_ASTC_10x8_Format:\n\t\t\treturn Math.floor( ( width + 9 ) / 10 ) * Math.floor( ( height + 7 ) / 8 ) * 16;\n\t\tcase RGBA_ASTC_10x10_Format:\n\t\t\treturn Math.floor( ( width + 9 ) / 10 ) * Math.floor( ( height + 9 ) / 10 ) * 16;\n\t\tcase RGBA_ASTC_12x10_Format:\n\t\t\treturn Math.floor( ( width + 11 ) / 12 ) * Math.floor( ( height + 9 ) / 10 ) * 16;\n\t\tcase RGBA_ASTC_12x12_Format:\n\t\t\treturn Math.floor( ( width + 11 ) / 12 ) * Math.floor( ( height + 11 ) / 12 ) * 16;\n\n\t\t// https://registry.khronos.org/webgl/extensions/EXT_texture_compression_bptc/\n\t\tcase RGBA_BPTC_Format:\n\t\tcase RGB_BPTC_SIGNED_Format:\n\t\tcase RGB_BPTC_UNSIGNED_Format:\n\t\t\treturn Math.ceil( width / 4 ) * Math.ceil( height / 4 ) * 16;\n\n\t\t// https://registry.khronos.org/webgl/extensions/EXT_texture_compression_rgtc/\n\t\tcase RED_RGTC1_Format:\n\t\tcase SIGNED_RED_RGTC1_Format:\n\t\t\treturn Math.ceil( width / 4 ) * Math.ceil( height / 4 ) * 8;\n\t\tcase RED_GREEN_RGTC2_Format:\n\t\tcase SIGNED_RED_GREEN_RGTC2_Format:\n\t\t\treturn Math.ceil( width / 4 ) * Math.ceil( height / 4 ) * 16;\n\n\t}\n\n\tthrow new Error(\n\t\t`Unable to determine texture byte length for ${format} format.`,\n\t);\n\n}\n\nfunction getTextureTypeByteLength( type ) {\n\n\tswitch ( type ) {\n\n\t\tcase UnsignedByteType:\n\t\tcase ByteType:\n\t\t\treturn { byteLength: 1, components: 1 };\n\t\tcase UnsignedShortType:\n\t\tcase ShortType:\n\t\tcase HalfFloatType:\n\t\t\treturn { byteLength: 2, components: 1 };\n\t\tcase UnsignedShort4444Type:\n\t\tcase UnsignedShort5551Type:\n\t\t\treturn { byteLength: 2, components: 4 };\n\t\tcase UnsignedIntType:\n\t\tcase IntType:\n\t\tcase FloatType:\n\t\t\treturn { byteLength: 4, components: 1 };\n\t\tcase UnsignedInt5999Type:\n\t\tcase UnsignedInt101111Type:\n\t\t\treturn { byteLength: 4, components: 3 };\n\n\t}\n\n\tthrow new Error( `Unknown texture type ${type}.` );\n\n}\n\n/**\n * A class containing utility functions for textures.\n *\n * @hideconstructor\n */\nclass TextureUtils {\n\n\t/**\n\t * Scales the texture as large as possible within its surface without cropping\n\t * or stretching the texture. The method preserves the original aspect ratio of\n\t * the texture. Akin to CSS `object-fit: contain`\n\t *\n\t * @param {Texture} texture - The texture.\n\t * @param {number} aspect - The texture's aspect ratio.\n\t * @return {Texture} The updated texture.\n\t */\n\tstatic contain( texture, aspect ) {\n\n\t\treturn contain( texture, aspect );\n\n\t}\n\n\t/**\n\t * Scales the texture to the smallest possible size to fill the surface, leaving\n\t * no empty space. The method preserves the original aspect ratio of the texture.\n\t * Akin to CSS `object-fit: cover`.\n\t *\n\t * @param {Texture} texture - The texture.\n\t * @param {number} aspect - The texture's aspect ratio.\n\t * @return {Texture} The updated texture.\n\t */\n\tstatic cover( texture, aspect ) {\n\n\t\treturn cover( texture, aspect );\n\n\t}\n\n\t/**\n\t * Configures the texture to the default transformation. Akin to CSS `object-fit: fill`.\n\t *\n\t * @param {Texture} texture - The texture.\n\t * @return {Texture} The updated texture.\n\t */\n\tstatic fill( texture ) {\n\n\t\treturn fill( texture );\n\n\t}\n\n\t/**\n\t * Determines how many bytes must be used to represent the texture.\n\t *\n\t * @param {number} width - The width of the texture.\n\t * @param {number} height - The height of the texture.\n\t * @param {number} format - The texture's format.\n\t * @param {number} type - The texture's type.\n\t * @return {number} The byte length.\n\t */\n\tstatic getByteLength( width, height, format, type ) {\n\n\t\treturn getByteLength( width, height, format, type );\n\n\t}\n\n}\n\nif ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) {\n\n\t__THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'register', { detail: {\n\t\trevision: REVISION,\n\t} } ) );\n\n}\n\nif ( typeof window !== 'undefined' ) {\n\n\tif ( window.__THREE__ ) {\n\n\t\twarn( 'WARNING: Multiple instances of Three.js being imported.' );\n\n\t} else {\n\n\t\twindow.__THREE__ = REVISION;\n\n\t}\n\n}\n\nfunction WebGLAnimation() {\n\n\tlet context = null;\n\tlet isAnimating = false;\n\tlet animationLoop = null;\n\tlet requestId = null;\n\n\tfunction onAnimationFrame( time, frame ) {\n\n\t\tanimationLoop( time, frame );\n\n\t\trequestId = context.requestAnimationFrame( onAnimationFrame );\n\n\t}\n\n\treturn {\n\n\t\tstart: function () {\n\n\t\t\tif ( isAnimating === true ) return;\n\t\t\tif ( animationLoop === null ) return;\n\n\t\t\trequestId = context.requestAnimationFrame( onAnimationFrame );\n\n\t\t\tisAnimating = true;\n\n\t\t},\n\n\t\tstop: function () {\n\n\t\t\tcontext.cancelAnimationFrame( requestId );\n\n\t\t\tisAnimating = false;\n\n\t\t},\n\n\t\tsetAnimationLoop: function ( callback ) {\n\n\t\t\tanimationLoop = callback;\n\n\t\t},\n\n\t\tsetContext: function ( value ) {\n\n\t\t\tcontext = value;\n\n\t\t}\n\n\t};\n\n}\n\nfunction WebGLAttributes( gl ) {\n\n\tconst buffers = new WeakMap();\n\n\tfunction createBuffer( attribute, bufferType ) {\n\n\t\tconst array = attribute.array;\n\t\tconst usage = attribute.usage;\n\t\tconst size = array.byteLength;\n\n\t\tconst buffer = gl.createBuffer();\n\n\t\tgl.bindBuffer( bufferType, buffer );\n\t\tgl.bufferData( bufferType, array, usage );\n\n\t\tattribute.onUploadCallback();\n\n\t\tlet type;\n\n\t\tif ( array instanceof Float32Array ) {\n\n\t\t\ttype = gl.FLOAT;\n\n\t\t} else if ( typeof Float16Array !== 'undefined' && array instanceof Float16Array ) {\n\n\t\t\ttype = gl.HALF_FLOAT;\n\n\t\t} else if ( array instanceof Uint16Array ) {\n\n\t\t\tif ( attribute.isFloat16BufferAttribute ) {\n\n\t\t\t\ttype = gl.HALF_FLOAT;\n\n\t\t\t} else {\n\n\t\t\t\ttype = gl.UNSIGNED_SHORT;\n\n\t\t\t}\n\n\t\t} else if ( array instanceof Int16Array ) {\n\n\t\t\ttype = gl.SHORT;\n\n\t\t} else if ( array instanceof Uint32Array ) {\n\n\t\t\ttype = gl.UNSIGNED_INT;\n\n\t\t} else if ( array instanceof Int32Array ) {\n\n\t\t\ttype = gl.INT;\n\n\t\t} else if ( array instanceof Int8Array ) {\n\n\t\t\ttype = gl.BYTE;\n\n\t\t} else if ( array instanceof Uint8Array ) {\n\n\t\t\ttype = gl.UNSIGNED_BYTE;\n\n\t\t} else if ( array instanceof Uint8ClampedArray ) {\n\n\t\t\ttype = gl.UNSIGNED_BYTE;\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'THREE.WebGLAttributes: Unsupported buffer data format: ' + array );\n\n\t\t}\n\n\t\treturn {\n\t\t\tbuffer: buffer,\n\t\t\ttype: type,\n\t\t\tbytesPerElement: array.BYTES_PER_ELEMENT,\n\t\t\tversion: attribute.version,\n\t\t\tsize: size\n\t\t};\n\n\t}\n\n\tfunction updateBuffer( buffer, attribute, bufferType ) {\n\n\t\tconst array = attribute.array;\n\t\tconst updateRanges = attribute.updateRanges;\n\n\t\tgl.bindBuffer( bufferType, buffer );\n\n\t\tif ( updateRanges.length === 0 ) {\n\n\t\t\t// Not using update ranges\n\t\t\tgl.bufferSubData( bufferType, 0, array );\n\n\t\t} else {\n\n\t\t\t// Before applying update ranges, we merge any adjacent / overlapping\n\t\t\t// ranges to reduce load on `gl.bufferSubData`. Empirically, this has led\n\t\t\t// to performance improvements for applications which make heavy use of\n\t\t\t// update ranges. Likely due to GPU command overhead.\n\t\t\t//\n\t\t\t// Note that to reduce garbage collection between frames, we merge the\n\t\t\t// update ranges in-place. This is safe because this method will clear the\n\t\t\t// update ranges once updated.\n\n\t\t\tupdateRanges.sort( ( a, b ) => a.start - b.start );\n\n\t\t\t// To merge the update ranges in-place, we work from left to right in the\n\t\t\t// existing updateRanges array, merging ranges. This may result in a final\n\t\t\t// array which is smaller than the original. This index tracks the last\n\t\t\t// index representing a merged range, any data after this index can be\n\t\t\t// trimmed once the merge algorithm is completed.\n\t\t\tlet mergeIndex = 0;\n\n\t\t\tfor ( let i = 1; i < updateRanges.length; i ++ ) {\n\n\t\t\t\tconst previousRange = updateRanges[ mergeIndex ];\n\t\t\t\tconst range = updateRanges[ i ];\n\n\t\t\t\t// We add one here to merge adjacent ranges. This is safe because ranges\n\t\t\t\t// operate over positive integers.\n\t\t\t\tif ( range.start <= previousRange.start + previousRange.count + 1 ) {\n\n\t\t\t\t\tpreviousRange.count = Math.max(\n\t\t\t\t\t\tpreviousRange.count,\n\t\t\t\t\t\trange.start + range.count - previousRange.start\n\t\t\t\t\t);\n\n\t\t\t\t} else {\n\n\t\t\t\t\t++ mergeIndex;\n\t\t\t\t\tupdateRanges[ mergeIndex ] = range;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Trim the array to only contain the merged ranges.\n\t\t\tupdateRanges.length = mergeIndex + 1;\n\n\t\t\tfor ( let i = 0, l = updateRanges.length; i < l; i ++ ) {\n\n\t\t\t\tconst range = updateRanges[ i ];\n\n\t\t\t\tgl.bufferSubData( bufferType, range.start * array.BYTES_PER_ELEMENT,\n\t\t\t\t\tarray, range.start, range.count );\n\n\t\t\t}\n\n\t\t\tattribute.clearUpdateRanges();\n\n\t\t}\n\n\t\tattribute.onUploadCallback();\n\n\t}\n\n\t//\n\n\tfunction get( attribute ) {\n\n\t\tif ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;\n\n\t\treturn buffers.get( attribute );\n\n\t}\n\n\tfunction remove( attribute ) {\n\n\t\tif ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;\n\n\t\tconst data = buffers.get( attribute );\n\n\t\tif ( data ) {\n\n\t\t\tgl.deleteBuffer( data.buffer );\n\n\t\t\tbuffers.delete( attribute );\n\n\t\t}\n\n\t}\n\n\tfunction update( attribute, bufferType ) {\n\n\t\tif ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;\n\n\t\tif ( attribute.isGLBufferAttribute ) {\n\n\t\t\tconst cached = buffers.get( attribute );\n\n\t\t\tif ( ! cached || cached.version < attribute.version ) {\n\n\t\t\t\tbuffers.set( attribute, {\n\t\t\t\t\tbuffer: attribute.buffer,\n\t\t\t\t\ttype: attribute.type,\n\t\t\t\t\tbytesPerElement: attribute.elementSize,\n\t\t\t\t\tversion: attribute.version\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst data = buffers.get( attribute );\n\n\t\tif ( data === undefined ) {\n\n\t\t\tbuffers.set( attribute, createBuffer( attribute, bufferType ) );\n\n\t\t} else if ( data.version < attribute.version ) {\n\n\t\t\tif ( data.size !== attribute.array.byteLength ) {\n\n\t\t\t\tthrow new Error( 'THREE.WebGLAttributes: The size of the buffer attribute\\'s array buffer does not match the original size. Resizing buffer attributes is not supported.' );\n\n\t\t\t}\n\n\t\t\tupdateBuffer( data.buffer, attribute, bufferType );\n\n\t\t\tdata.version = attribute.version;\n\n\t\t}\n\n\t}\n\n\treturn {\n\n\t\tget: get,\n\t\tremove: remove,\n\t\tupdate: update\n\n\t};\n\n}\n\nvar alphahash_fragment = \"#ifdef USE_ALPHAHASH\\n\\tif ( diffuseColor.a < getAlphaHashThreshold( vPosition ) ) discard;\\n#endif\";\n\nvar alphahash_pars_fragment = \"#ifdef USE_ALPHAHASH\\n\\tconst float ALPHA_HASH_SCALE = 0.05;\\n\\tfloat hash2D( vec2 value ) {\\n\\t\\treturn fract( 1.0e4 * sin( 17.0 * value.x + 0.1 * value.y ) * ( 0.1 + abs( sin( 13.0 * value.y + value.x ) ) ) );\\n\\t}\\n\\tfloat hash3D( vec3 value ) {\\n\\t\\treturn hash2D( vec2( hash2D( value.xy ), value.z ) );\\n\\t}\\n\\tfloat getAlphaHashThreshold( vec3 position ) {\\n\\t\\tfloat maxDeriv = max(\\n\\t\\t\\tlength( dFdx( position.xyz ) ),\\n\\t\\t\\tlength( dFdy( position.xyz ) )\\n\\t\\t);\\n\\t\\tfloat pixScale = 1.0 / ( ALPHA_HASH_SCALE * maxDeriv );\\n\\t\\tvec2 pixScales = vec2(\\n\\t\\t\\texp2( floor( log2( pixScale ) ) ),\\n\\t\\t\\texp2( ceil( log2( pixScale ) ) )\\n\\t\\t);\\n\\t\\tvec2 alpha = vec2(\\n\\t\\t\\thash3D( floor( pixScales.x * position.xyz ) ),\\n\\t\\t\\thash3D( floor( pixScales.y * position.xyz ) )\\n\\t\\t);\\n\\t\\tfloat lerpFactor = fract( log2( pixScale ) );\\n\\t\\tfloat x = ( 1.0 - lerpFactor ) * alpha.x + lerpFactor * alpha.y;\\n\\t\\tfloat a = min( lerpFactor, 1.0 - lerpFactor );\\n\\t\\tvec3 cases = vec3(\\n\\t\\t\\tx * x / ( 2.0 * a * ( 1.0 - a ) ),\\n\\t\\t\\t( x - 0.5 * a ) / ( 1.0 - a ),\\n\\t\\t\\t1.0 - ( ( 1.0 - x ) * ( 1.0 - x ) / ( 2.0 * a * ( 1.0 - a ) ) )\\n\\t\\t);\\n\\t\\tfloat threshold = ( x < ( 1.0 - a ) )\\n\\t\\t\\t? ( ( x < a ) ? cases.x : cases.y )\\n\\t\\t\\t: cases.z;\\n\\t\\treturn clamp( threshold , 1.0e-6, 1.0 );\\n\\t}\\n#endif\";\n\nvar alphamap_fragment = \"#ifdef USE_ALPHAMAP\\n\\tdiffuseColor.a *= texture2D( alphaMap, vAlphaMapUv ).g;\\n#endif\";\n\nvar alphamap_pars_fragment = \"#ifdef USE_ALPHAMAP\\n\\tuniform sampler2D alphaMap;\\n#endif\";\n\nvar alphatest_fragment = \"#ifdef USE_ALPHATEST\\n\\t#ifdef ALPHA_TO_COVERAGE\\n\\tdiffuseColor.a = smoothstep( alphaTest, alphaTest + fwidth( diffuseColor.a ), diffuseColor.a );\\n\\tif ( diffuseColor.a == 0.0 ) discard;\\n\\t#else\\n\\tif ( diffuseColor.a < alphaTest ) discard;\\n\\t#endif\\n#endif\";\n\nvar alphatest_pars_fragment = \"#ifdef USE_ALPHATEST\\n\\tuniform float alphaTest;\\n#endif\";\n\nvar aomap_fragment = \"#ifdef USE_AOMAP\\n\\tfloat ambientOcclusion = ( texture2D( aoMap, vAoMapUv ).r - 1.0 ) * aoMapIntensity + 1.0;\\n\\treflectedLight.indirectDiffuse *= ambientOcclusion;\\n\\t#if defined( USE_CLEARCOAT ) \\n\\t\\tclearcoatSpecularIndirect *= ambientOcclusion;\\n\\t#endif\\n\\t#if defined( USE_SHEEN ) \\n\\t\\tsheenSpecularIndirect *= ambientOcclusion;\\n\\t#endif\\n\\t#if defined( USE_ENVMAP ) && defined( STANDARD )\\n\\t\\tfloat dotNV = saturate( dot( geometryNormal, geometryViewDir ) );\\n\\t\\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.roughness );\\n\\t#endif\\n#endif\";\n\nvar aomap_pars_fragment = \"#ifdef USE_AOMAP\\n\\tuniform sampler2D aoMap;\\n\\tuniform float aoMapIntensity;\\n#endif\";\n\nvar batching_pars_vertex = \"#ifdef USE_BATCHING\\n\\t#if ! defined( GL_ANGLE_multi_draw )\\n\\t#define gl_DrawID _gl_DrawID\\n\\tuniform int _gl_DrawID;\\n\\t#endif\\n\\tuniform highp sampler2D batchingTexture;\\n\\tuniform highp usampler2D batchingIdTexture;\\n\\tmat4 getBatchingMatrix( const in float i ) {\\n\\t\\tint size = textureSize( batchingTexture, 0 ).x;\\n\\t\\tint j = int( i ) * 4;\\n\\t\\tint x = j % size;\\n\\t\\tint y = j / size;\\n\\t\\tvec4 v1 = texelFetch( batchingTexture, ivec2( x, y ), 0 );\\n\\t\\tvec4 v2 = texelFetch( batchingTexture, ivec2( x + 1, y ), 0 );\\n\\t\\tvec4 v3 = texelFetch( batchingTexture, ivec2( x + 2, y ), 0 );\\n\\t\\tvec4 v4 = texelFetch( batchingTexture, ivec2( x + 3, y ), 0 );\\n\\t\\treturn mat4( v1, v2, v3, v4 );\\n\\t}\\n\\tfloat getIndirectIndex( const in int i ) {\\n\\t\\tint size = textureSize( batchingIdTexture, 0 ).x;\\n\\t\\tint x = i % size;\\n\\t\\tint y = i / size;\\n\\t\\treturn float( texelFetch( batchingIdTexture, ivec2( x, y ), 0 ).r );\\n\\t}\\n#endif\\n#ifdef USE_BATCHING_COLOR\\n\\tuniform sampler2D batchingColorTexture;\\n\\tvec3 getBatchingColor( const in float i ) {\\n\\t\\tint size = textureSize( batchingColorTexture, 0 ).x;\\n\\t\\tint j = int( i );\\n\\t\\tint x = j % size;\\n\\t\\tint y = j / size;\\n\\t\\treturn texelFetch( batchingColorTexture, ivec2( x, y ), 0 ).rgb;\\n\\t}\\n#endif\";\n\nvar batching_vertex = \"#ifdef USE_BATCHING\\n\\tmat4 batchingMatrix = getBatchingMatrix( getIndirectIndex( gl_DrawID ) );\\n#endif\";\n\nvar begin_vertex = \"vec3 transformed = vec3( position );\\n#ifdef USE_ALPHAHASH\\n\\tvPosition = vec3( position );\\n#endif\";\n\nvar beginnormal_vertex = \"vec3 objectNormal = vec3( normal );\\n#ifdef USE_TANGENT\\n\\tvec3 objectTangent = vec3( tangent.xyz );\\n#endif\";\n\nvar bsdfs = \"float G_BlinnPhong_Implicit( ) {\\n\\treturn 0.25;\\n}\\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\\n\\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\\n}\\nvec3 BRDF_BlinnPhong( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in vec3 specularColor, const in float shininess ) {\\n\\tvec3 halfDir = normalize( lightDir + viewDir );\\n\\tfloat dotNH = saturate( dot( normal, halfDir ) );\\n\\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\\n\\tvec3 F = F_Schlick( specularColor, 1.0, dotVH );\\n\\tfloat G = G_BlinnPhong_Implicit( );\\n\\tfloat D = D_BlinnPhong( shininess, dotNH );\\n\\treturn F * ( G * D );\\n} // validated\";\n\nvar iridescence_fragment = \"#ifdef USE_IRIDESCENCE\\n\\tconst mat3 XYZ_TO_REC709 = mat3(\\n\\t\\t 3.2404542, -0.9692660,  0.0556434,\\n\\t\\t-1.5371385,  1.8760108, -0.2040259,\\n\\t\\t-0.4985314,  0.0415560,  1.0572252\\n\\t);\\n\\tvec3 Fresnel0ToIor( vec3 fresnel0 ) {\\n\\t\\tvec3 sqrtF0 = sqrt( fresnel0 );\\n\\t\\treturn ( vec3( 1.0 ) + sqrtF0 ) / ( vec3( 1.0 ) - sqrtF0 );\\n\\t}\\n\\tvec3 IorToFresnel0( vec3 transmittedIor, float incidentIor ) {\\n\\t\\treturn pow2( ( transmittedIor - vec3( incidentIor ) ) / ( transmittedIor + vec3( incidentIor ) ) );\\n\\t}\\n\\tfloat IorToFresnel0( float transmittedIor, float incidentIor ) {\\n\\t\\treturn pow2( ( transmittedIor - incidentIor ) / ( transmittedIor + incidentIor ));\\n\\t}\\n\\tvec3 evalSensitivity( float OPD, vec3 shift ) {\\n\\t\\tfloat phase = 2.0 * PI * OPD * 1.0e-9;\\n\\t\\tvec3 val = vec3( 5.4856e-13, 4.4201e-13, 5.2481e-13 );\\n\\t\\tvec3 pos = vec3( 1.6810e+06, 1.7953e+06, 2.2084e+06 );\\n\\t\\tvec3 var = vec3( 4.3278e+09, 9.3046e+09, 6.6121e+09 );\\n\\t\\tvec3 xyz = val * sqrt( 2.0 * PI * var ) * cos( pos * phase + shift ) * exp( - pow2( phase ) * var );\\n\\t\\txyz.x += 9.7470e-14 * sqrt( 2.0 * PI * 4.5282e+09 ) * cos( 2.2399e+06 * phase + shift[ 0 ] ) * exp( - 4.5282e+09 * pow2( phase ) );\\n\\t\\txyz /= 1.0685e-7;\\n\\t\\tvec3 rgb = XYZ_TO_REC709 * xyz;\\n\\t\\treturn rgb;\\n\\t}\\n\\tvec3 evalIridescence( float outsideIOR, float eta2, float cosTheta1, float thinFilmThickness, vec3 baseF0 ) {\\n\\t\\tvec3 I;\\n\\t\\tfloat iridescenceIOR = mix( outsideIOR, eta2, smoothstep( 0.0, 0.03, thinFilmThickness ) );\\n\\t\\tfloat sinTheta2Sq = pow2( outsideIOR / iridescenceIOR ) * ( 1.0 - pow2( cosTheta1 ) );\\n\\t\\tfloat cosTheta2Sq = 1.0 - sinTheta2Sq;\\n\\t\\tif ( cosTheta2Sq < 0.0 ) {\\n\\t\\t\\treturn vec3( 1.0 );\\n\\t\\t}\\n\\t\\tfloat cosTheta2 = sqrt( cosTheta2Sq );\\n\\t\\tfloat R0 = IorToFresnel0( iridescenceIOR, outsideIOR );\\n\\t\\tfloat R12 = F_Schlick( R0, 1.0, cosTheta1 );\\n\\t\\tfloat T121 = 1.0 - R12;\\n\\t\\tfloat phi12 = 0.0;\\n\\t\\tif ( iridescenceIOR < outsideIOR ) phi12 = PI;\\n\\t\\tfloat phi21 = PI - phi12;\\n\\t\\tvec3 baseIOR = Fresnel0ToIor( clamp( baseF0, 0.0, 0.9999 ) );\\t\\tvec3 R1 = IorToFresnel0( baseIOR, iridescenceIOR );\\n\\t\\tvec3 R23 = F_Schlick( R1, 1.0, cosTheta2 );\\n\\t\\tvec3 phi23 = vec3( 0.0 );\\n\\t\\tif ( baseIOR[ 0 ] < iridescenceIOR ) phi23[ 0 ] = PI;\\n\\t\\tif ( baseIOR[ 1 ] < iridescenceIOR ) phi23[ 1 ] = PI;\\n\\t\\tif ( baseIOR[ 2 ] < iridescenceIOR ) phi23[ 2 ] = PI;\\n\\t\\tfloat OPD = 2.0 * iridescenceIOR * thinFilmThickness * cosTheta2;\\n\\t\\tvec3 phi = vec3( phi21 ) + phi23;\\n\\t\\tvec3 R123 = clamp( R12 * R23, 1e-5, 0.9999 );\\n\\t\\tvec3 r123 = sqrt( R123 );\\n\\t\\tvec3 Rs = pow2( T121 ) * R23 / ( vec3( 1.0 ) - R123 );\\n\\t\\tvec3 C0 = R12 + Rs;\\n\\t\\tI = C0;\\n\\t\\tvec3 Cm = Rs - T121;\\n\\t\\tfor ( int m = 1; m <= 2; ++ m ) {\\n\\t\\t\\tCm *= r123;\\n\\t\\t\\tvec3 Sm = 2.0 * evalSensitivity( float( m ) * OPD, float( m ) * phi );\\n\\t\\t\\tI += Cm * Sm;\\n\\t\\t}\\n\\t\\treturn max( I, vec3( 0.0 ) );\\n\\t}\\n#endif\";\n\nvar bumpmap_pars_fragment = \"#ifdef USE_BUMPMAP\\n\\tuniform sampler2D bumpMap;\\n\\tuniform float bumpScale;\\n\\tvec2 dHdxy_fwd() {\\n\\t\\tvec2 dSTdx = dFdx( vBumpMapUv );\\n\\t\\tvec2 dSTdy = dFdy( vBumpMapUv );\\n\\t\\tfloat Hll = bumpScale * texture2D( bumpMap, vBumpMapUv ).x;\\n\\t\\tfloat dBx = bumpScale * texture2D( bumpMap, vBumpMapUv + dSTdx ).x - Hll;\\n\\t\\tfloat dBy = bumpScale * texture2D( bumpMap, vBumpMapUv + dSTdy ).x - Hll;\\n\\t\\treturn vec2( dBx, dBy );\\n\\t}\\n\\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy, float faceDirection ) {\\n\\t\\tvec3 vSigmaX = normalize( dFdx( surf_pos.xyz ) );\\n\\t\\tvec3 vSigmaY = normalize( dFdy( surf_pos.xyz ) );\\n\\t\\tvec3 vN = surf_norm;\\n\\t\\tvec3 R1 = cross( vSigmaY, vN );\\n\\t\\tvec3 R2 = cross( vN, vSigmaX );\\n\\t\\tfloat fDet = dot( vSigmaX, R1 ) * faceDirection;\\n\\t\\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\\n\\t\\treturn normalize( abs( fDet ) * surf_norm - vGrad );\\n\\t}\\n#endif\";\n\nvar clipping_planes_fragment = \"#if NUM_CLIPPING_PLANES > 0\\n\\tvec4 plane;\\n\\t#ifdef ALPHA_TO_COVERAGE\\n\\t\\tfloat distanceToPlane, distanceGradient;\\n\\t\\tfloat clipOpacity = 1.0;\\n\\t\\t#pragma unroll_loop_start\\n\\t\\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\\n\\t\\t\\tplane = clippingPlanes[ i ];\\n\\t\\t\\tdistanceToPlane = - dot( vClipPosition, plane.xyz ) + plane.w;\\n\\t\\t\\tdistanceGradient = fwidth( distanceToPlane ) / 2.0;\\n\\t\\t\\tclipOpacity *= smoothstep( - distanceGradient, distanceGradient, distanceToPlane );\\n\\t\\t\\tif ( clipOpacity == 0.0 ) discard;\\n\\t\\t}\\n\\t\\t#pragma unroll_loop_end\\n\\t\\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\\n\\t\\t\\tfloat unionClipOpacity = 1.0;\\n\\t\\t\\t#pragma unroll_loop_start\\n\\t\\t\\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\\n\\t\\t\\t\\tplane = clippingPlanes[ i ];\\n\\t\\t\\t\\tdistanceToPlane = - dot( vClipPosition, plane.xyz ) + plane.w;\\n\\t\\t\\t\\tdistanceGradient = fwidth( distanceToPlane ) / 2.0;\\n\\t\\t\\t\\tunionClipOpacity *= 1.0 - smoothstep( - distanceGradient, distanceGradient, distanceToPlane );\\n\\t\\t\\t}\\n\\t\\t\\t#pragma unroll_loop_end\\n\\t\\t\\tclipOpacity *= 1.0 - unionClipOpacity;\\n\\t\\t#endif\\n\\t\\tdiffuseColor.a *= clipOpacity;\\n\\t\\tif ( diffuseColor.a == 0.0 ) discard;\\n\\t#else\\n\\t\\t#pragma unroll_loop_start\\n\\t\\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\\n\\t\\t\\tplane = clippingPlanes[ i ];\\n\\t\\t\\tif ( dot( vClipPosition, plane.xyz ) > plane.w ) discard;\\n\\t\\t}\\n\\t\\t#pragma unroll_loop_end\\n\\t\\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\\n\\t\\t\\tbool clipped = true;\\n\\t\\t\\t#pragma unroll_loop_start\\n\\t\\t\\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\\n\\t\\t\\t\\tplane = clippingPlanes[ i ];\\n\\t\\t\\t\\tclipped = ( dot( vClipPosition, plane.xyz ) > plane.w ) && clipped;\\n\\t\\t\\t}\\n\\t\\t\\t#pragma unroll_loop_end\\n\\t\\t\\tif ( clipped ) discard;\\n\\t\\t#endif\\n\\t#endif\\n#endif\";\n\nvar clipping_planes_pars_fragment = \"#if NUM_CLIPPING_PLANES > 0\\n\\tvarying vec3 vClipPosition;\\n\\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\\n#endif\";\n\nvar clipping_planes_pars_vertex = \"#if NUM_CLIPPING_PLANES > 0\\n\\tvarying vec3 vClipPosition;\\n#endif\";\n\nvar clipping_planes_vertex = \"#if NUM_CLIPPING_PLANES > 0\\n\\tvClipPosition = - mvPosition.xyz;\\n#endif\";\n\nvar color_fragment = \"#if defined( USE_COLOR_ALPHA )\\n\\tdiffuseColor *= vColor;\\n#elif defined( USE_COLOR )\\n\\tdiffuseColor.rgb *= vColor;\\n#endif\";\n\nvar color_pars_fragment = \"#if defined( USE_COLOR_ALPHA )\\n\\tvarying vec4 vColor;\\n#elif defined( USE_COLOR )\\n\\tvarying vec3 vColor;\\n#endif\";\n\nvar color_pars_vertex = \"#if defined( USE_COLOR_ALPHA )\\n\\tvarying vec4 vColor;\\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR )\\n\\tvarying vec3 vColor;\\n#endif\";\n\nvar color_vertex = \"#if defined( USE_COLOR_ALPHA )\\n\\tvColor = vec4( 1.0 );\\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR )\\n\\tvColor = vec3( 1.0 );\\n#endif\\n#ifdef USE_COLOR\\n\\tvColor *= color;\\n#endif\\n#ifdef USE_INSTANCING_COLOR\\n\\tvColor.xyz *= instanceColor.xyz;\\n#endif\\n#ifdef USE_BATCHING_COLOR\\n\\tvec3 batchingColor = getBatchingColor( getIndirectIndex( gl_DrawID ) );\\n\\tvColor.xyz *= batchingColor.xyz;\\n#endif\";\n\nvar common = \"#define PI 3.141592653589793\\n#define PI2 6.283185307179586\\n#define PI_HALF 1.5707963267948966\\n#define RECIPROCAL_PI 0.3183098861837907\\n#define RECIPROCAL_PI2 0.15915494309189535\\n#define EPSILON 1e-6\\n#ifndef saturate\\n#define saturate( a ) clamp( a, 0.0, 1.0 )\\n#endif\\n#define whiteComplement( a ) ( 1.0 - saturate( a ) )\\nfloat pow2( const in float x ) { return x*x; }\\nvec3 pow2( const in vec3 x ) { return x*x; }\\nfloat pow3( const in float x ) { return x*x*x; }\\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\\nfloat max3( const in vec3 v ) { return max( max( v.x, v.y ), v.z ); }\\nfloat average( const in vec3 v ) { return dot( v, vec3( 0.3333333 ) ); }\\nhighp float rand( const in vec2 uv ) {\\n\\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\\n\\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\\n\\treturn fract( sin( sn ) * c );\\n}\\n#ifdef HIGH_PRECISION\\n\\tfloat precisionSafeLength( vec3 v ) { return length( v ); }\\n#else\\n\\tfloat precisionSafeLength( vec3 v ) {\\n\\t\\tfloat maxComponent = max3( abs( v ) );\\n\\t\\treturn length( v / maxComponent ) * maxComponent;\\n\\t}\\n#endif\\nstruct IncidentLight {\\n\\tvec3 color;\\n\\tvec3 direction;\\n\\tbool visible;\\n};\\nstruct ReflectedLight {\\n\\tvec3 directDiffuse;\\n\\tvec3 directSpecular;\\n\\tvec3 indirectDiffuse;\\n\\tvec3 indirectSpecular;\\n};\\n#ifdef USE_ALPHAHASH\\n\\tvarying vec3 vPosition;\\n#endif\\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\\n\\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\\n}\\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\\n\\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\\n}\\nbool isPerspectiveMatrix( mat4 m ) {\\n\\treturn m[ 2 ][ 3 ] == - 1.0;\\n}\\nvec2 equirectUv( in vec3 dir ) {\\n\\tfloat u = atan( dir.z, dir.x ) * RECIPROCAL_PI2 + 0.5;\\n\\tfloat v = asin( clamp( dir.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\\n\\treturn vec2( u, v );\\n}\\nvec3 BRDF_Lambert( const in vec3 diffuseColor ) {\\n\\treturn RECIPROCAL_PI * diffuseColor;\\n}\\nvec3 F_Schlick( const in vec3 f0, const in float f90, const in float dotVH ) {\\n\\tfloat fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH );\\n\\treturn f0 * ( 1.0 - fresnel ) + ( f90 * fresnel );\\n}\\nfloat F_Schlick( const in float f0, const in float f90, const in float dotVH ) {\\n\\tfloat fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH );\\n\\treturn f0 * ( 1.0 - fresnel ) + ( f90 * fresnel );\\n} // validated\";\n\nvar cube_uv_reflection_fragment = \"#ifdef ENVMAP_TYPE_CUBE_UV\\n\\t#define cubeUV_minMipLevel 4.0\\n\\t#define cubeUV_minTileSize 16.0\\n\\tfloat getFace( vec3 direction ) {\\n\\t\\tvec3 absDirection = abs( direction );\\n\\t\\tfloat face = - 1.0;\\n\\t\\tif ( absDirection.x > absDirection.z ) {\\n\\t\\t\\tif ( absDirection.x > absDirection.y )\\n\\t\\t\\t\\tface = direction.x > 0.0 ? 0.0 : 3.0;\\n\\t\\t\\telse\\n\\t\\t\\t\\tface = direction.y > 0.0 ? 1.0 : 4.0;\\n\\t\\t} else {\\n\\t\\t\\tif ( absDirection.z > absDirection.y )\\n\\t\\t\\t\\tface = direction.z > 0.0 ? 2.0 : 5.0;\\n\\t\\t\\telse\\n\\t\\t\\t\\tface = direction.y > 0.0 ? 1.0 : 4.0;\\n\\t\\t}\\n\\t\\treturn face;\\n\\t}\\n\\tvec2 getUV( vec3 direction, float face ) {\\n\\t\\tvec2 uv;\\n\\t\\tif ( face == 0.0 ) {\\n\\t\\t\\tuv = vec2( direction.z, direction.y ) / abs( direction.x );\\n\\t\\t} else if ( face == 1.0 ) {\\n\\t\\t\\tuv = vec2( - direction.x, - direction.z ) / abs( direction.y );\\n\\t\\t} else if ( face == 2.0 ) {\\n\\t\\t\\tuv = vec2( - direction.x, direction.y ) / abs( direction.z );\\n\\t\\t} else if ( face == 3.0 ) {\\n\\t\\t\\tuv = vec2( - direction.z, direction.y ) / abs( direction.x );\\n\\t\\t} else if ( face == 4.0 ) {\\n\\t\\t\\tuv = vec2( - direction.x, direction.z ) / abs( direction.y );\\n\\t\\t} else {\\n\\t\\t\\tuv = vec2( direction.x, direction.y ) / abs( direction.z );\\n\\t\\t}\\n\\t\\treturn 0.5 * ( uv + 1.0 );\\n\\t}\\n\\tvec3 bilinearCubeUV( sampler2D envMap, vec3 direction, float mipInt ) {\\n\\t\\tfloat face = getFace( direction );\\n\\t\\tfloat filterInt = max( cubeUV_minMipLevel - mipInt, 0.0 );\\n\\t\\tmipInt = max( mipInt, cubeUV_minMipLevel );\\n\\t\\tfloat faceSize = exp2( mipInt );\\n\\t\\thighp vec2 uv = getUV( direction, face ) * ( faceSize - 2.0 ) + 1.0;\\n\\t\\tif ( face > 2.0 ) {\\n\\t\\t\\tuv.y += faceSize;\\n\\t\\t\\tface -= 3.0;\\n\\t\\t}\\n\\t\\tuv.x += face * faceSize;\\n\\t\\tuv.x += filterInt * 3.0 * cubeUV_minTileSize;\\n\\t\\tuv.y += 4.0 * ( exp2( CUBEUV_MAX_MIP ) - faceSize );\\n\\t\\tuv.x *= CUBEUV_TEXEL_WIDTH;\\n\\t\\tuv.y *= CUBEUV_TEXEL_HEIGHT;\\n\\t\\t#ifdef texture2DGradEXT\\n\\t\\t\\treturn texture2DGradEXT( envMap, uv, vec2( 0.0 ), vec2( 0.0 ) ).rgb;\\n\\t\\t#else\\n\\t\\t\\treturn texture2D( envMap, uv ).rgb;\\n\\t\\t#endif\\n\\t}\\n\\t#define cubeUV_r0 1.0\\n\\t#define cubeUV_m0 - 2.0\\n\\t#define cubeUV_r1 0.8\\n\\t#define cubeUV_m1 - 1.0\\n\\t#define cubeUV_r4 0.4\\n\\t#define cubeUV_m4 2.0\\n\\t#define cubeUV_r5 0.305\\n\\t#define cubeUV_m5 3.0\\n\\t#define cubeUV_r6 0.21\\n\\t#define cubeUV_m6 4.0\\n\\tfloat roughnessToMip( float roughness ) {\\n\\t\\tfloat mip = 0.0;\\n\\t\\tif ( roughness >= cubeUV_r1 ) {\\n\\t\\t\\tmip = ( cubeUV_r0 - roughness ) * ( cubeUV_m1 - cubeUV_m0 ) / ( cubeUV_r0 - cubeUV_r1 ) + cubeUV_m0;\\n\\t\\t} else if ( roughness >= cubeUV_r4 ) {\\n\\t\\t\\tmip = ( cubeUV_r1 - roughness ) * ( cubeUV_m4 - cubeUV_m1 ) / ( cubeUV_r1 - cubeUV_r4 ) + cubeUV_m1;\\n\\t\\t} else if ( roughness >= cubeUV_r5 ) {\\n\\t\\t\\tmip = ( cubeUV_r4 - roughness ) * ( cubeUV_m5 - cubeUV_m4 ) / ( cubeUV_r4 - cubeUV_r5 ) + cubeUV_m4;\\n\\t\\t} else if ( roughness >= cubeUV_r6 ) {\\n\\t\\t\\tmip = ( cubeUV_r5 - roughness ) * ( cubeUV_m6 - cubeUV_m5 ) / ( cubeUV_r5 - cubeUV_r6 ) + cubeUV_m5;\\n\\t\\t} else {\\n\\t\\t\\tmip = - 2.0 * log2( 1.16 * roughness );\\t\\t}\\n\\t\\treturn mip;\\n\\t}\\n\\tvec4 textureCubeUV( sampler2D envMap, vec3 sampleDir, float roughness ) {\\n\\t\\tfloat mip = clamp( roughnessToMip( roughness ), cubeUV_m0, CUBEUV_MAX_MIP );\\n\\t\\tfloat mipF = fract( mip );\\n\\t\\tfloat mipInt = floor( mip );\\n\\t\\tvec3 color0 = bilinearCubeUV( envMap, sampleDir, mipInt );\\n\\t\\tif ( mipF == 0.0 ) {\\n\\t\\t\\treturn vec4( color0, 1.0 );\\n\\t\\t} else {\\n\\t\\t\\tvec3 color1 = bilinearCubeUV( envMap, sampleDir, mipInt + 1.0 );\\n\\t\\t\\treturn vec4( mix( color0, color1, mipF ), 1.0 );\\n\\t\\t}\\n\\t}\\n#endif\";\n\nvar defaultnormal_vertex = \"vec3 transformedNormal = objectNormal;\\n#ifdef USE_TANGENT\\n\\tvec3 transformedTangent = objectTangent;\\n#endif\\n#ifdef USE_BATCHING\\n\\tmat3 bm = mat3( batchingMatrix );\\n\\ttransformedNormal /= vec3( dot( bm[ 0 ], bm[ 0 ] ), dot( bm[ 1 ], bm[ 1 ] ), dot( bm[ 2 ], bm[ 2 ] ) );\\n\\ttransformedNormal = bm * transformedNormal;\\n\\t#ifdef USE_TANGENT\\n\\t\\ttransformedTangent = bm * transformedTangent;\\n\\t#endif\\n#endif\\n#ifdef USE_INSTANCING\\n\\tmat3 im = mat3( instanceMatrix );\\n\\ttransformedNormal /= vec3( dot( im[ 0 ], im[ 0 ] ), dot( im[ 1 ], im[ 1 ] ), dot( im[ 2 ], im[ 2 ] ) );\\n\\ttransformedNormal = im * transformedNormal;\\n\\t#ifdef USE_TANGENT\\n\\t\\ttransformedTangent = im * transformedTangent;\\n\\t#endif\\n#endif\\ntransformedNormal = normalMatrix * transformedNormal;\\n#ifdef FLIP_SIDED\\n\\ttransformedNormal = - transformedNormal;\\n#endif\\n#ifdef USE_TANGENT\\n\\ttransformedTangent = ( modelViewMatrix * vec4( transformedTangent, 0.0 ) ).xyz;\\n\\t#ifdef FLIP_SIDED\\n\\t\\ttransformedTangent = - transformedTangent;\\n\\t#endif\\n#endif\";\n\nvar displacementmap_pars_vertex = \"#ifdef USE_DISPLACEMENTMAP\\n\\tuniform sampler2D displacementMap;\\n\\tuniform float displacementScale;\\n\\tuniform float displacementBias;\\n#endif\";\n\nvar displacementmap_vertex = \"#ifdef USE_DISPLACEMENTMAP\\n\\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, vDisplacementMapUv ).x * displacementScale + displacementBias );\\n#endif\";\n\nvar emissivemap_fragment = \"#ifdef USE_EMISSIVEMAP\\n\\tvec4 emissiveColor = texture2D( emissiveMap, vEmissiveMapUv );\\n\\t#ifdef DECODE_VIDEO_TEXTURE_EMISSIVE\\n\\t\\temissiveColor = sRGBTransferEOTF( emissiveColor );\\n\\t#endif\\n\\ttotalEmissiveRadiance *= emissiveColor.rgb;\\n#endif\";\n\nvar emissivemap_pars_fragment = \"#ifdef USE_EMISSIVEMAP\\n\\tuniform sampler2D emissiveMap;\\n#endif\";\n\nvar colorspace_fragment = \"gl_FragColor = linearToOutputTexel( gl_FragColor );\";\n\nvar colorspace_pars_fragment = \"vec4 LinearTransferOETF( in vec4 value ) {\\n\\treturn value;\\n}\\nvec4 sRGBTransferEOTF( in vec4 value ) {\\n\\treturn vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.a );\\n}\\nvec4 sRGBTransferOETF( in vec4 value ) {\\n\\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.a );\\n}\";\n\nvar envmap_fragment = \"#ifdef USE_ENVMAP\\n\\t#ifdef ENV_WORLDPOS\\n\\t\\tvec3 cameraToFrag;\\n\\t\\tif ( isOrthographic ) {\\n\\t\\t\\tcameraToFrag = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\\n\\t\\t} else {\\n\\t\\t\\tcameraToFrag = normalize( vWorldPosition - cameraPosition );\\n\\t\\t}\\n\\t\\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\\n\\t\\t#ifdef ENVMAP_MODE_REFLECTION\\n\\t\\t\\tvec3 reflectVec = reflect( cameraToFrag, worldNormal );\\n\\t\\t#else\\n\\t\\t\\tvec3 reflectVec = refract( cameraToFrag, worldNormal, refractionRatio );\\n\\t\\t#endif\\n\\t#else\\n\\t\\tvec3 reflectVec = vReflect;\\n\\t#endif\\n\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\tvec4 envColor = textureCube( envMap, envMapRotation * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\\n\\t#else\\n\\t\\tvec4 envColor = vec4( 0.0 );\\n\\t#endif\\n\\t#ifdef ENVMAP_BLENDING_MULTIPLY\\n\\t\\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\\n\\t#elif defined( ENVMAP_BLENDING_MIX )\\n\\t\\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\\n\\t#elif defined( ENVMAP_BLENDING_ADD )\\n\\t\\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\\n\\t#endif\\n#endif\";\n\nvar envmap_common_pars_fragment = \"#ifdef USE_ENVMAP\\n\\tuniform float envMapIntensity;\\n\\tuniform float flipEnvMap;\\n\\tuniform mat3 envMapRotation;\\n\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\tuniform samplerCube envMap;\\n\\t#else\\n\\t\\tuniform sampler2D envMap;\\n\\t#endif\\n#endif\";\n\nvar envmap_pars_fragment = \"#ifdef USE_ENVMAP\\n\\tuniform float reflectivity;\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT )\\n\\t\\t#define ENV_WORLDPOS\\n\\t#endif\\n\\t#ifdef ENV_WORLDPOS\\n\\t\\tvarying vec3 vWorldPosition;\\n\\t\\tuniform float refractionRatio;\\n\\t#else\\n\\t\\tvarying vec3 vReflect;\\n\\t#endif\\n#endif\";\n\nvar envmap_pars_vertex = \"#ifdef USE_ENVMAP\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT )\\n\\t\\t#define ENV_WORLDPOS\\n\\t#endif\\n\\t#ifdef ENV_WORLDPOS\\n\\t\\t\\n\\t\\tvarying vec3 vWorldPosition;\\n\\t#else\\n\\t\\tvarying vec3 vReflect;\\n\\t\\tuniform float refractionRatio;\\n\\t#endif\\n#endif\";\n\nvar envmap_vertex = \"#ifdef USE_ENVMAP\\n\\t#ifdef ENV_WORLDPOS\\n\\t\\tvWorldPosition = worldPosition.xyz;\\n\\t#else\\n\\t\\tvec3 cameraToVertex;\\n\\t\\tif ( isOrthographic ) {\\n\\t\\t\\tcameraToVertex = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\\n\\t\\t} else {\\n\\t\\t\\tcameraToVertex = normalize( worldPosition.xyz - cameraPosition );\\n\\t\\t}\\n\\t\\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\\n\\t\\t#ifdef ENVMAP_MODE_REFLECTION\\n\\t\\t\\tvReflect = reflect( cameraToVertex, worldNormal );\\n\\t\\t#else\\n\\t\\t\\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\\n\\t\\t#endif\\n\\t#endif\\n#endif\";\n\nvar fog_vertex = \"#ifdef USE_FOG\\n\\tvFogDepth = - mvPosition.z;\\n#endif\";\n\nvar fog_pars_vertex = \"#ifdef USE_FOG\\n\\tvarying float vFogDepth;\\n#endif\";\n\nvar fog_fragment = \"#ifdef USE_FOG\\n\\t#ifdef FOG_EXP2\\n\\t\\tfloat fogFactor = 1.0 - exp( - fogDensity * fogDensity * vFogDepth * vFogDepth );\\n\\t#else\\n\\t\\tfloat fogFactor = smoothstep( fogNear, fogFar, vFogDepth );\\n\\t#endif\\n\\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\\n#endif\";\n\nvar fog_pars_fragment = \"#ifdef USE_FOG\\n\\tuniform vec3 fogColor;\\n\\tvarying float vFogDepth;\\n\\t#ifdef FOG_EXP2\\n\\t\\tuniform float fogDensity;\\n\\t#else\\n\\t\\tuniform float fogNear;\\n\\t\\tuniform float fogFar;\\n\\t#endif\\n#endif\";\n\nvar gradientmap_pars_fragment = \"#ifdef USE_GRADIENTMAP\\n\\tuniform sampler2D gradientMap;\\n#endif\\nvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\\n\\tfloat dotNL = dot( normal, lightDirection );\\n\\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\\n\\t#ifdef USE_GRADIENTMAP\\n\\t\\treturn vec3( texture2D( gradientMap, coord ).r );\\n\\t#else\\n\\t\\tvec2 fw = fwidth( coord ) * 0.5;\\n\\t\\treturn mix( vec3( 0.7 ), vec3( 1.0 ), smoothstep( 0.7 - fw.x, 0.7 + fw.x, coord.x ) );\\n\\t#endif\\n}\";\n\nvar lightmap_pars_fragment = \"#ifdef USE_LIGHTMAP\\n\\tuniform sampler2D lightMap;\\n\\tuniform float lightMapIntensity;\\n#endif\";\n\nvar lights_lambert_fragment = \"LambertMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb;\\nmaterial.specularStrength = specularStrength;\";\n\nvar lights_lambert_pars_fragment = \"varying vec3 vViewPosition;\\nstruct LambertMaterial {\\n\\tvec3 diffuseColor;\\n\\tfloat specularStrength;\\n};\\nvoid RE_Direct_Lambert( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in LambertMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\\n\\tvec3 irradiance = dotNL * directLight.color;\\n\\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\nvoid RE_IndirectDiffuse_Lambert( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in LambertMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_Lambert\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_Lambert\";\n\nvar lights_pars_begin = \"uniform bool receiveShadow;\\nuniform vec3 ambientLightColor;\\n#if defined( USE_LIGHT_PROBES )\\n\\tuniform vec3 lightProbe[ 9 ];\\n#endif\\nvec3 shGetIrradianceAt( in vec3 normal, in vec3 shCoefficients[ 9 ] ) {\\n\\tfloat x = normal.x, y = normal.y, z = normal.z;\\n\\tvec3 result = shCoefficients[ 0 ] * 0.886227;\\n\\tresult += shCoefficients[ 1 ] * 2.0 * 0.511664 * y;\\n\\tresult += shCoefficients[ 2 ] * 2.0 * 0.511664 * z;\\n\\tresult += shCoefficients[ 3 ] * 2.0 * 0.511664 * x;\\n\\tresult += shCoefficients[ 4 ] * 2.0 * 0.429043 * x * y;\\n\\tresult += shCoefficients[ 5 ] * 2.0 * 0.429043 * y * z;\\n\\tresult += shCoefficients[ 6 ] * ( 0.743125 * z * z - 0.247708 );\\n\\tresult += shCoefficients[ 7 ] * 2.0 * 0.429043 * x * z;\\n\\tresult += shCoefficients[ 8 ] * 0.429043 * ( x * x - y * y );\\n\\treturn result;\\n}\\nvec3 getLightProbeIrradiance( const in vec3 lightProbe[ 9 ], const in vec3 normal ) {\\n\\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\\n\\tvec3 irradiance = shGetIrradianceAt( worldNormal, lightProbe );\\n\\treturn irradiance;\\n}\\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\\n\\tvec3 irradiance = ambientLightColor;\\n\\treturn irradiance;\\n}\\nfloat getDistanceAttenuation( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\\n\\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\\n\\tif ( cutoffDistance > 0.0 ) {\\n\\t\\tdistanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\\n\\t}\\n\\treturn distanceFalloff;\\n}\\nfloat getSpotAttenuation( const in float coneCosine, const in float penumbraCosine, const in float angleCosine ) {\\n\\treturn smoothstep( coneCosine, penumbraCosine, angleCosine );\\n}\\n#if NUM_DIR_LIGHTS > 0\\n\\tstruct DirectionalLight {\\n\\t\\tvec3 direction;\\n\\t\\tvec3 color;\\n\\t};\\n\\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\\n\\tvoid getDirectionalLightInfo( const in DirectionalLight directionalLight, out IncidentLight light ) {\\n\\t\\tlight.color = directionalLight.color;\\n\\t\\tlight.direction = directionalLight.direction;\\n\\t\\tlight.visible = true;\\n\\t}\\n#endif\\n#if NUM_POINT_LIGHTS > 0\\n\\tstruct PointLight {\\n\\t\\tvec3 position;\\n\\t\\tvec3 color;\\n\\t\\tfloat distance;\\n\\t\\tfloat decay;\\n\\t};\\n\\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\\n\\tvoid getPointLightInfo( const in PointLight pointLight, const in vec3 geometryPosition, out IncidentLight light ) {\\n\\t\\tvec3 lVector = pointLight.position - geometryPosition;\\n\\t\\tlight.direction = normalize( lVector );\\n\\t\\tfloat lightDistance = length( lVector );\\n\\t\\tlight.color = pointLight.color;\\n\\t\\tlight.color *= getDistanceAttenuation( lightDistance, pointLight.distance, pointLight.decay );\\n\\t\\tlight.visible = ( light.color != vec3( 0.0 ) );\\n\\t}\\n#endif\\n#if NUM_SPOT_LIGHTS > 0\\n\\tstruct SpotLight {\\n\\t\\tvec3 position;\\n\\t\\tvec3 direction;\\n\\t\\tvec3 color;\\n\\t\\tfloat distance;\\n\\t\\tfloat decay;\\n\\t\\tfloat coneCos;\\n\\t\\tfloat penumbraCos;\\n\\t};\\n\\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\\n\\tvoid getSpotLightInfo( const in SpotLight spotLight, const in vec3 geometryPosition, out IncidentLight light ) {\\n\\t\\tvec3 lVector = spotLight.position - geometryPosition;\\n\\t\\tlight.direction = normalize( lVector );\\n\\t\\tfloat angleCos = dot( light.direction, spotLight.direction );\\n\\t\\tfloat spotAttenuation = getSpotAttenuation( spotLight.coneCos, spotLight.penumbraCos, angleCos );\\n\\t\\tif ( spotAttenuation > 0.0 ) {\\n\\t\\t\\tfloat lightDistance = length( lVector );\\n\\t\\t\\tlight.color = spotLight.color * spotAttenuation;\\n\\t\\t\\tlight.color *= getDistanceAttenuation( lightDistance, spotLight.distance, spotLight.decay );\\n\\t\\t\\tlight.visible = ( light.color != vec3( 0.0 ) );\\n\\t\\t} else {\\n\\t\\t\\tlight.color = vec3( 0.0 );\\n\\t\\t\\tlight.visible = false;\\n\\t\\t}\\n\\t}\\n#endif\\n#if NUM_RECT_AREA_LIGHTS > 0\\n\\tstruct RectAreaLight {\\n\\t\\tvec3 color;\\n\\t\\tvec3 position;\\n\\t\\tvec3 halfWidth;\\n\\t\\tvec3 halfHeight;\\n\\t};\\n\\tuniform sampler2D ltc_1;\\tuniform sampler2D ltc_2;\\n\\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\\n#endif\\n#if NUM_HEMI_LIGHTS > 0\\n\\tstruct HemisphereLight {\\n\\t\\tvec3 direction;\\n\\t\\tvec3 skyColor;\\n\\t\\tvec3 groundColor;\\n\\t};\\n\\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\\n\\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in vec3 normal ) {\\n\\t\\tfloat dotNL = dot( normal, hemiLight.direction );\\n\\t\\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\\n\\t\\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\\n\\t\\treturn irradiance;\\n\\t}\\n#endif\";\n\nvar envmap_physical_pars_fragment = \"#ifdef USE_ENVMAP\\n\\tvec3 getIBLIrradiance( const in vec3 normal ) {\\n\\t\\t#ifdef ENVMAP_TYPE_CUBE_UV\\n\\t\\t\\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\\n\\t\\t\\tvec4 envMapColor = textureCubeUV( envMap, envMapRotation * worldNormal, 1.0 );\\n\\t\\t\\treturn PI * envMapColor.rgb * envMapIntensity;\\n\\t\\t#else\\n\\t\\t\\treturn vec3( 0.0 );\\n\\t\\t#endif\\n\\t}\\n\\tvec3 getIBLRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness ) {\\n\\t\\t#ifdef ENVMAP_TYPE_CUBE_UV\\n\\t\\t\\tvec3 reflectVec = reflect( - viewDir, normal );\\n\\t\\t\\treflectVec = normalize( mix( reflectVec, normal, pow4( roughness ) ) );\\n\\t\\t\\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\\n\\t\\t\\tvec4 envMapColor = textureCubeUV( envMap, envMapRotation * reflectVec, roughness );\\n\\t\\t\\treturn envMapColor.rgb * envMapIntensity;\\n\\t\\t#else\\n\\t\\t\\treturn vec3( 0.0 );\\n\\t\\t#endif\\n\\t}\\n\\t#ifdef USE_ANISOTROPY\\n\\t\\tvec3 getIBLAnisotropyRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness, const in vec3 bitangent, const in float anisotropy ) {\\n\\t\\t\\t#ifdef ENVMAP_TYPE_CUBE_UV\\n\\t\\t\\t\\tvec3 bentNormal = cross( bitangent, viewDir );\\n\\t\\t\\t\\tbentNormal = normalize( cross( bentNormal, bitangent ) );\\n\\t\\t\\t\\tbentNormal = normalize( mix( bentNormal, normal, pow2( pow2( 1.0 - anisotropy * ( 1.0 - roughness ) ) ) ) );\\n\\t\\t\\t\\treturn getIBLRadiance( viewDir, bentNormal, roughness );\\n\\t\\t\\t#else\\n\\t\\t\\t\\treturn vec3( 0.0 );\\n\\t\\t\\t#endif\\n\\t\\t}\\n\\t#endif\\n#endif\";\n\nvar lights_toon_fragment = \"ToonMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb;\";\n\nvar lights_toon_pars_fragment = \"varying vec3 vViewPosition;\\nstruct ToonMaterial {\\n\\tvec3 diffuseColor;\\n};\\nvoid RE_Direct_Toon( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tvec3 irradiance = getGradientIrradiance( geometryNormal, directLight.direction ) * directLight.color;\\n\\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\nvoid RE_IndirectDiffuse_Toon( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_Toon\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_Toon\";\n\nvar lights_phong_fragment = \"BlinnPhongMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb;\\nmaterial.specularColor = specular;\\nmaterial.specularShininess = shininess;\\nmaterial.specularStrength = specularStrength;\";\n\nvar lights_phong_pars_fragment = \"varying vec3 vViewPosition;\\nstruct BlinnPhongMaterial {\\n\\tvec3 diffuseColor;\\n\\tvec3 specularColor;\\n\\tfloat specularShininess;\\n\\tfloat specularStrength;\\n};\\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\\n\\tvec3 irradiance = dotNL * directLight.color;\\n\\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n\\treflectedLight.directSpecular += irradiance * BRDF_BlinnPhong( directLight.direction, geometryViewDir, geometryNormal, material.specularColor, material.specularShininess ) * material.specularStrength;\\n}\\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_BlinnPhong\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_BlinnPhong\";\n\nvar lights_physical_fragment = \"PhysicalMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\\nvec3 dxy = max( abs( dFdx( nonPerturbedNormal ) ), abs( dFdy( nonPerturbedNormal ) ) );\\nfloat geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );\\nmaterial.roughness = max( roughnessFactor, 0.0525 );material.roughness += geometryRoughness;\\nmaterial.roughness = min( material.roughness, 1.0 );\\n#ifdef IOR\\n\\tmaterial.ior = ior;\\n\\t#ifdef USE_SPECULAR\\n\\t\\tfloat specularIntensityFactor = specularIntensity;\\n\\t\\tvec3 specularColorFactor = specularColor;\\n\\t\\t#ifdef USE_SPECULAR_COLORMAP\\n\\t\\t\\tspecularColorFactor *= texture2D( specularColorMap, vSpecularColorMapUv ).rgb;\\n\\t\\t#endif\\n\\t\\t#ifdef USE_SPECULAR_INTENSITYMAP\\n\\t\\t\\tspecularIntensityFactor *= texture2D( specularIntensityMap, vSpecularIntensityMapUv ).a;\\n\\t\\t#endif\\n\\t\\tmaterial.specularF90 = mix( specularIntensityFactor, 1.0, metalnessFactor );\\n\\t#else\\n\\t\\tfloat specularIntensityFactor = 1.0;\\n\\t\\tvec3 specularColorFactor = vec3( 1.0 );\\n\\t\\tmaterial.specularF90 = 1.0;\\n\\t#endif\\n\\tmaterial.specularColor = mix( min( pow2( ( material.ior - 1.0 ) / ( material.ior + 1.0 ) ) * specularColorFactor, vec3( 1.0 ) ) * specularIntensityFactor, diffuseColor.rgb, metalnessFactor );\\n#else\\n\\tmaterial.specularColor = mix( vec3( 0.04 ), diffuseColor.rgb, metalnessFactor );\\n\\tmaterial.specularF90 = 1.0;\\n#endif\\n#ifdef USE_CLEARCOAT\\n\\tmaterial.clearcoat = clearcoat;\\n\\tmaterial.clearcoatRoughness = clearcoatRoughness;\\n\\tmaterial.clearcoatF0 = vec3( 0.04 );\\n\\tmaterial.clearcoatF90 = 1.0;\\n\\t#ifdef USE_CLEARCOATMAP\\n\\t\\tmaterial.clearcoat *= texture2D( clearcoatMap, vClearcoatMapUv ).x;\\n\\t#endif\\n\\t#ifdef USE_CLEARCOAT_ROUGHNESSMAP\\n\\t\\tmaterial.clearcoatRoughness *= texture2D( clearcoatRoughnessMap, vClearcoatRoughnessMapUv ).y;\\n\\t#endif\\n\\tmaterial.clearcoat = saturate( material.clearcoat );\\tmaterial.clearcoatRoughness = max( material.clearcoatRoughness, 0.0525 );\\n\\tmaterial.clearcoatRoughness += geometryRoughness;\\n\\tmaterial.clearcoatRoughness = min( material.clearcoatRoughness, 1.0 );\\n#endif\\n#ifdef USE_DISPERSION\\n\\tmaterial.dispersion = dispersion;\\n#endif\\n#ifdef USE_IRIDESCENCE\\n\\tmaterial.iridescence = iridescence;\\n\\tmaterial.iridescenceIOR = iridescenceIOR;\\n\\t#ifdef USE_IRIDESCENCEMAP\\n\\t\\tmaterial.iridescence *= texture2D( iridescenceMap, vIridescenceMapUv ).r;\\n\\t#endif\\n\\t#ifdef USE_IRIDESCENCE_THICKNESSMAP\\n\\t\\tmaterial.iridescenceThickness = (iridescenceThicknessMaximum - iridescenceThicknessMinimum) * texture2D( iridescenceThicknessMap, vIridescenceThicknessMapUv ).g + iridescenceThicknessMinimum;\\n\\t#else\\n\\t\\tmaterial.iridescenceThickness = iridescenceThicknessMaximum;\\n\\t#endif\\n#endif\\n#ifdef USE_SHEEN\\n\\tmaterial.sheenColor = sheenColor;\\n\\t#ifdef USE_SHEEN_COLORMAP\\n\\t\\tmaterial.sheenColor *= texture2D( sheenColorMap, vSheenColorMapUv ).rgb;\\n\\t#endif\\n\\tmaterial.sheenRoughness = clamp( sheenRoughness, 0.07, 1.0 );\\n\\t#ifdef USE_SHEEN_ROUGHNESSMAP\\n\\t\\tmaterial.sheenRoughness *= texture2D( sheenRoughnessMap, vSheenRoughnessMapUv ).a;\\n\\t#endif\\n#endif\\n#ifdef USE_ANISOTROPY\\n\\t#ifdef USE_ANISOTROPYMAP\\n\\t\\tmat2 anisotropyMat = mat2( anisotropyVector.x, anisotropyVector.y, - anisotropyVector.y, anisotropyVector.x );\\n\\t\\tvec3 anisotropyPolar = texture2D( anisotropyMap, vAnisotropyMapUv ).rgb;\\n\\t\\tvec2 anisotropyV = anisotropyMat * normalize( 2.0 * anisotropyPolar.rg - vec2( 1.0 ) ) * anisotropyPolar.b;\\n\\t#else\\n\\t\\tvec2 anisotropyV = anisotropyVector;\\n\\t#endif\\n\\tmaterial.anisotropy = length( anisotropyV );\\n\\tif( material.anisotropy == 0.0 ) {\\n\\t\\tanisotropyV = vec2( 1.0, 0.0 );\\n\\t} else {\\n\\t\\tanisotropyV /= material.anisotropy;\\n\\t\\tmaterial.anisotropy = saturate( material.anisotropy );\\n\\t}\\n\\tmaterial.alphaT = mix( pow2( material.roughness ), 1.0, pow2( material.anisotropy ) );\\n\\tmaterial.anisotropyT = tbn[ 0 ] * anisotropyV.x + tbn[ 1 ] * anisotropyV.y;\\n\\tmaterial.anisotropyB = tbn[ 1 ] * anisotropyV.x - tbn[ 0 ] * anisotropyV.y;\\n#endif\";\n\nvar lights_physical_pars_fragment = \"uniform sampler2D dfgLUT;\\nstruct PhysicalMaterial {\\n\\tvec3 diffuseColor;\\n\\tfloat roughness;\\n\\tvec3 specularColor;\\n\\tfloat specularF90;\\n\\tfloat dispersion;\\n\\t#ifdef USE_CLEARCOAT\\n\\t\\tfloat clearcoat;\\n\\t\\tfloat clearcoatRoughness;\\n\\t\\tvec3 clearcoatF0;\\n\\t\\tfloat clearcoatF90;\\n\\t#endif\\n\\t#ifdef USE_IRIDESCENCE\\n\\t\\tfloat iridescence;\\n\\t\\tfloat iridescenceIOR;\\n\\t\\tfloat iridescenceThickness;\\n\\t\\tvec3 iridescenceFresnel;\\n\\t\\tvec3 iridescenceF0;\\n\\t#endif\\n\\t#ifdef USE_SHEEN\\n\\t\\tvec3 sheenColor;\\n\\t\\tfloat sheenRoughness;\\n\\t#endif\\n\\t#ifdef IOR\\n\\t\\tfloat ior;\\n\\t#endif\\n\\t#ifdef USE_TRANSMISSION\\n\\t\\tfloat transmission;\\n\\t\\tfloat transmissionAlpha;\\n\\t\\tfloat thickness;\\n\\t\\tfloat attenuationDistance;\\n\\t\\tvec3 attenuationColor;\\n\\t#endif\\n\\t#ifdef USE_ANISOTROPY\\n\\t\\tfloat anisotropy;\\n\\t\\tfloat alphaT;\\n\\t\\tvec3 anisotropyT;\\n\\t\\tvec3 anisotropyB;\\n\\t#endif\\n};\\nvec3 clearcoatSpecularDirect = vec3( 0.0 );\\nvec3 clearcoatSpecularIndirect = vec3( 0.0 );\\nvec3 sheenSpecularDirect = vec3( 0.0 );\\nvec3 sheenSpecularIndirect = vec3(0.0 );\\nvec3 Schlick_to_F0( const in vec3 f, const in float f90, const in float dotVH ) {\\n    float x = clamp( 1.0 - dotVH, 0.0, 1.0 );\\n    float x2 = x * x;\\n    float x5 = clamp( x * x2 * x2, 0.0, 0.9999 );\\n    return ( f - vec3( f90 ) * x5 ) / ( 1.0 - x5 );\\n}\\nfloat V_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\\n\\tfloat a2 = pow2( alpha );\\n\\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\\n\\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\\n\\treturn 0.5 / max( gv + gl, EPSILON );\\n}\\nfloat D_GGX( const in float alpha, const in float dotNH ) {\\n\\tfloat a2 = pow2( alpha );\\n\\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\\n\\treturn RECIPROCAL_PI * a2 / pow2( denom );\\n}\\n#ifdef USE_ANISOTROPY\\n\\tfloat V_GGX_SmithCorrelated_Anisotropic( const in float alphaT, const in float alphaB, const in float dotTV, const in float dotBV, const in float dotTL, const in float dotBL, const in float dotNV, const in float dotNL ) {\\n\\t\\tfloat gv = dotNL * length( vec3( alphaT * dotTV, alphaB * dotBV, dotNV ) );\\n\\t\\tfloat gl = dotNV * length( vec3( alphaT * dotTL, alphaB * dotBL, dotNL ) );\\n\\t\\tfloat v = 0.5 / ( gv + gl );\\n\\t\\treturn saturate(v);\\n\\t}\\n\\tfloat D_GGX_Anisotropic( const in float alphaT, const in float alphaB, const in float dotNH, const in float dotTH, const in float dotBH ) {\\n\\t\\tfloat a2 = alphaT * alphaB;\\n\\t\\thighp vec3 v = vec3( alphaB * dotTH, alphaT * dotBH, a2 * dotNH );\\n\\t\\thighp float v2 = dot( v, v );\\n\\t\\tfloat w2 = a2 / v2;\\n\\t\\treturn RECIPROCAL_PI * a2 * pow2 ( w2 );\\n\\t}\\n#endif\\n#ifdef USE_CLEARCOAT\\n\\tvec3 BRDF_GGX_Clearcoat( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material) {\\n\\t\\tvec3 f0 = material.clearcoatF0;\\n\\t\\tfloat f90 = material.clearcoatF90;\\n\\t\\tfloat roughness = material.clearcoatRoughness;\\n\\t\\tfloat alpha = pow2( roughness );\\n\\t\\tvec3 halfDir = normalize( lightDir + viewDir );\\n\\t\\tfloat dotNL = saturate( dot( normal, lightDir ) );\\n\\t\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\t\\tfloat dotNH = saturate( dot( normal, halfDir ) );\\n\\t\\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\\n\\t\\tvec3 F = F_Schlick( f0, f90, dotVH );\\n\\t\\tfloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\\n\\t\\tfloat D = D_GGX( alpha, dotNH );\\n\\t\\treturn F * ( V * D );\\n\\t}\\n#endif\\nvec3 BRDF_GGX( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material ) {\\n\\tvec3 f0 = material.specularColor;\\n\\tfloat f90 = material.specularF90;\\n\\tfloat roughness = material.roughness;\\n\\tfloat alpha = pow2( roughness );\\n\\tvec3 halfDir = normalize( lightDir + viewDir );\\n\\tfloat dotNL = saturate( dot( normal, lightDir ) );\\n\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\tfloat dotNH = saturate( dot( normal, halfDir ) );\\n\\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\\n\\tvec3 F = F_Schlick( f0, f90, dotVH );\\n\\t#ifdef USE_IRIDESCENCE\\n\\t\\tF = mix( F, material.iridescenceFresnel, material.iridescence );\\n\\t#endif\\n\\t#ifdef USE_ANISOTROPY\\n\\t\\tfloat dotTL = dot( material.anisotropyT, lightDir );\\n\\t\\tfloat dotTV = dot( material.anisotropyT, viewDir );\\n\\t\\tfloat dotTH = dot( material.anisotropyT, halfDir );\\n\\t\\tfloat dotBL = dot( material.anisotropyB, lightDir );\\n\\t\\tfloat dotBV = dot( material.anisotropyB, viewDir );\\n\\t\\tfloat dotBH = dot( material.anisotropyB, halfDir );\\n\\t\\tfloat V = V_GGX_SmithCorrelated_Anisotropic( material.alphaT, alpha, dotTV, dotBV, dotTL, dotBL, dotNV, dotNL );\\n\\t\\tfloat D = D_GGX_Anisotropic( material.alphaT, alpha, dotNH, dotTH, dotBH );\\n\\t#else\\n\\t\\tfloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\\n\\t\\tfloat D = D_GGX( alpha, dotNH );\\n\\t#endif\\n\\treturn F * ( V * D );\\n}\\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\\n\\tconst float LUT_SIZE = 64.0;\\n\\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\\n\\tconst float LUT_BIAS = 0.5 / LUT_SIZE;\\n\\tfloat dotNV = saturate( dot( N, V ) );\\n\\tvec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) );\\n\\tuv = uv * LUT_SCALE + LUT_BIAS;\\n\\treturn uv;\\n}\\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\\n\\tfloat l = length( f );\\n\\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\\n}\\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\\n\\tfloat x = dot( v1, v2 );\\n\\tfloat y = abs( x );\\n\\tfloat a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y;\\n\\tfloat b = 3.4175940 + ( 4.1616724 + y ) * y;\\n\\tfloat v = a / b;\\n\\tfloat theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\\n\\treturn cross( v1, v2 ) * theta_sintheta;\\n}\\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\\n\\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\\n\\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\\n\\tvec3 lightNormal = cross( v1, v2 );\\n\\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\\n\\tvec3 T1, T2;\\n\\tT1 = normalize( V - N * dot( V, N ) );\\n\\tT2 = - cross( N, T1 );\\n\\tmat3 mat = mInv * transpose( mat3( T1, T2, N ) );\\n\\tvec3 coords[ 4 ];\\n\\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\\n\\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\\n\\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\\n\\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\\n\\tcoords[ 0 ] = normalize( coords[ 0 ] );\\n\\tcoords[ 1 ] = normalize( coords[ 1 ] );\\n\\tcoords[ 2 ] = normalize( coords[ 2 ] );\\n\\tcoords[ 3 ] = normalize( coords[ 3 ] );\\n\\tvec3 vectorFormFactor = vec3( 0.0 );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\\n\\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\\n\\treturn vec3( result );\\n}\\n#if defined( USE_SHEEN )\\nfloat D_Charlie( float roughness, float dotNH ) {\\n\\tfloat alpha = pow2( roughness );\\n\\tfloat invAlpha = 1.0 / alpha;\\n\\tfloat cos2h = dotNH * dotNH;\\n\\tfloat sin2h = max( 1.0 - cos2h, 0.0078125 );\\n\\treturn ( 2.0 + invAlpha ) * pow( sin2h, invAlpha * 0.5 ) / ( 2.0 * PI );\\n}\\nfloat V_Neubelt( float dotNV, float dotNL ) {\\n\\treturn saturate( 1.0 / ( 4.0 * ( dotNL + dotNV - dotNL * dotNV ) ) );\\n}\\nvec3 BRDF_Sheen( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, vec3 sheenColor, const in float sheenRoughness ) {\\n\\tvec3 halfDir = normalize( lightDir + viewDir );\\n\\tfloat dotNL = saturate( dot( normal, lightDir ) );\\n\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\tfloat dotNH = saturate( dot( normal, halfDir ) );\\n\\tfloat D = D_Charlie( sheenRoughness, dotNH );\\n\\tfloat V = V_Neubelt( dotNV, dotNL );\\n\\treturn sheenColor * ( D * V );\\n}\\n#endif\\nfloat IBLSheenBRDF( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\\n\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\tfloat r2 = roughness * roughness;\\n\\tfloat a = roughness < 0.25 ? -339.2 * r2 + 161.4 * roughness - 25.9 : -8.48 * r2 + 14.3 * roughness - 9.95;\\n\\tfloat b = roughness < 0.25 ? 44.0 * r2 - 23.7 * roughness + 3.26 : 1.97 * r2 - 3.27 * roughness + 0.72;\\n\\tfloat DG = exp( a * dotNV + b ) + ( roughness < 0.25 ? 0.0 : 0.1 * ( roughness - 0.25 ) );\\n\\treturn saturate( DG * RECIPROCAL_PI );\\n}\\nvec2 DFGApprox( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\\n\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\tvec2 uv = vec2( roughness, dotNV );\\n\\treturn texture2D( dfgLUT, uv ).rg;\\n}\\nvec3 EnvironmentBRDF( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness ) {\\n\\tvec2 fab = DFGApprox( normal, viewDir, roughness );\\n\\treturn specularColor * fab.x + specularF90 * fab.y;\\n}\\n#ifdef USE_IRIDESCENCE\\nvoid computeMultiscatteringIridescence( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float iridescence, const in vec3 iridescenceF0, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\\n#else\\nvoid computeMultiscattering( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\\n#endif\\n\\tvec2 fab = DFGApprox( normal, viewDir, roughness );\\n\\t#ifdef USE_IRIDESCENCE\\n\\t\\tvec3 Fr = mix( specularColor, iridescenceF0, iridescence );\\n\\t#else\\n\\t\\tvec3 Fr = specularColor;\\n\\t#endif\\n\\tvec3 FssEss = Fr * fab.x + specularF90 * fab.y;\\n\\tfloat Ess = fab.x + fab.y;\\n\\tfloat Ems = 1.0 - Ess;\\n\\tvec3 Favg = Fr + ( 1.0 - Fr ) * 0.047619;\\tvec3 Fms = FssEss * Favg / ( 1.0 - Ems * Favg );\\n\\tsingleScatter += FssEss;\\n\\tmultiScatter += Fms * Ems;\\n}\\nvec3 BRDF_GGX_Multiscatter( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material ) {\\n\\tvec3 singleScatter = BRDF_GGX( lightDir, viewDir, normal, material );\\n\\tfloat dotNL = saturate( dot( normal, lightDir ) );\\n\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\tvec2 dfgV = DFGApprox( vec3(0.0, 0.0, 1.0), vec3(sqrt(1.0 - dotNV * dotNV), 0.0, dotNV), material.roughness );\\n\\tvec2 dfgL = DFGApprox( vec3(0.0, 0.0, 1.0), vec3(sqrt(1.0 - dotNL * dotNL), 0.0, dotNL), material.roughness );\\n\\tvec3 FssEss_V = material.specularColor * dfgV.x + material.specularF90 * dfgV.y;\\n\\tvec3 FssEss_L = material.specularColor * dfgL.x + material.specularF90 * dfgL.y;\\n\\tfloat Ess_V = dfgV.x + dfgV.y;\\n\\tfloat Ess_L = dfgL.x + dfgL.y;\\n\\tfloat Ems_V = 1.0 - Ess_V;\\n\\tfloat Ems_L = 1.0 - Ess_L;\\n\\tvec3 Favg = material.specularColor + ( 1.0 - material.specularColor ) * 0.047619;\\n\\tvec3 Fms = FssEss_V * FssEss_L * Favg / ( 1.0 - Ems_V * Ems_L * Favg * Favg + EPSILON );\\n\\tfloat compensationFactor = Ems_V * Ems_L;\\n\\tvec3 multiScatter = Fms * compensationFactor;\\n\\treturn singleScatter + multiScatter;\\n}\\n#if NUM_RECT_AREA_LIGHTS > 0\\n\\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\t\\tvec3 normal = geometryNormal;\\n\\t\\tvec3 viewDir = geometryViewDir;\\n\\t\\tvec3 position = geometryPosition;\\n\\t\\tvec3 lightPos = rectAreaLight.position;\\n\\t\\tvec3 halfWidth = rectAreaLight.halfWidth;\\n\\t\\tvec3 halfHeight = rectAreaLight.halfHeight;\\n\\t\\tvec3 lightColor = rectAreaLight.color;\\n\\t\\tfloat roughness = material.roughness;\\n\\t\\tvec3 rectCoords[ 4 ];\\n\\t\\trectCoords[ 0 ] = lightPos + halfWidth - halfHeight;\\t\\trectCoords[ 1 ] = lightPos - halfWidth - halfHeight;\\n\\t\\trectCoords[ 2 ] = lightPos - halfWidth + halfHeight;\\n\\t\\trectCoords[ 3 ] = lightPos + halfWidth + halfHeight;\\n\\t\\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\\n\\t\\tvec4 t1 = texture2D( ltc_1, uv );\\n\\t\\tvec4 t2 = texture2D( ltc_2, uv );\\n\\t\\tmat3 mInv = mat3(\\n\\t\\t\\tvec3( t1.x, 0, t1.y ),\\n\\t\\t\\tvec3(    0, 1,    0 ),\\n\\t\\t\\tvec3( t1.z, 0, t1.w )\\n\\t\\t);\\n\\t\\tvec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );\\n\\t\\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\\n\\t\\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\\n\\t}\\n#endif\\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\\n\\tvec3 irradiance = dotNL * directLight.color;\\n\\t#ifdef USE_CLEARCOAT\\n\\t\\tfloat dotNLcc = saturate( dot( geometryClearcoatNormal, directLight.direction ) );\\n\\t\\tvec3 ccIrradiance = dotNLcc * directLight.color;\\n\\t\\tclearcoatSpecularDirect += ccIrradiance * BRDF_GGX_Clearcoat( directLight.direction, geometryViewDir, geometryClearcoatNormal, material );\\n\\t#endif\\n\\t#ifdef USE_SHEEN\\n\\t\\tsheenSpecularDirect += irradiance * BRDF_Sheen( directLight.direction, geometryViewDir, geometryNormal, material.sheenColor, material.sheenRoughness );\\n\\t#endif\\n\\treflectedLight.directSpecular += irradiance * BRDF_GGX_Multiscatter( directLight.direction, geometryViewDir, geometryNormal, material );\\n\\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradiance, const in vec3 clearcoatRadiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) {\\n\\t#ifdef USE_CLEARCOAT\\n\\t\\tclearcoatSpecularIndirect += clearcoatRadiance * EnvironmentBRDF( geometryClearcoatNormal, geometryViewDir, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );\\n\\t#endif\\n\\t#ifdef USE_SHEEN\\n\\t\\tsheenSpecularIndirect += irradiance * material.sheenColor * IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness );\\n\\t#endif\\n\\tvec3 singleScattering = vec3( 0.0 );\\n\\tvec3 multiScattering = vec3( 0.0 );\\n\\tvec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\\n\\t#ifdef USE_IRIDESCENCE\\n\\t\\tcomputeMultiscatteringIridescence( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.iridescence, material.iridescenceFresnel, material.roughness, singleScattering, multiScattering );\\n\\t#else\\n\\t\\tcomputeMultiscattering( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.roughness, singleScattering, multiScattering );\\n\\t#endif\\n\\tvec3 totalScattering = singleScattering + multiScattering;\\n\\tvec3 diffuse = material.diffuseColor * ( 1.0 - max( max( totalScattering.r, totalScattering.g ), totalScattering.b ) );\\n\\treflectedLight.indirectSpecular += radiance * singleScattering;\\n\\treflectedLight.indirectSpecular += multiScattering * cosineWeightedIrradiance;\\n\\treflectedLight.indirectDiffuse += diffuse * cosineWeightedIrradiance;\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_Physical\\n#define RE_Direct_RectArea\\t\\tRE_Direct_RectArea_Physical\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_Physical\\n#define RE_IndirectSpecular\\t\\tRE_IndirectSpecular_Physical\\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\\n\\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\\n}\";\n\nvar lights_fragment_begin = \"\\nvec3 geometryPosition = - vViewPosition;\\nvec3 geometryNormal = normal;\\nvec3 geometryViewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\\nvec3 geometryClearcoatNormal = vec3( 0.0 );\\n#ifdef USE_CLEARCOAT\\n\\tgeometryClearcoatNormal = clearcoatNormal;\\n#endif\\n#ifdef USE_IRIDESCENCE\\n\\tfloat dotNVi = saturate( dot( normal, geometryViewDir ) );\\n\\tif ( material.iridescenceThickness == 0.0 ) {\\n\\t\\tmaterial.iridescence = 0.0;\\n\\t} else {\\n\\t\\tmaterial.iridescence = saturate( material.iridescence );\\n\\t}\\n\\tif ( material.iridescence > 0.0 ) {\\n\\t\\tmaterial.iridescenceFresnel = evalIridescence( 1.0, material.iridescenceIOR, dotNVi, material.iridescenceThickness, material.specularColor );\\n\\t\\tmaterial.iridescenceF0 = Schlick_to_F0( material.iridescenceFresnel, 1.0, dotNVi );\\n\\t}\\n#endif\\nIncidentLight directLight;\\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tPointLight pointLight;\\n\\t#if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\\n\\tPointLightShadow pointLightShadow;\\n\\t#endif\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\\n\\t\\tpointLight = pointLights[ i ];\\n\\t\\tgetPointLightInfo( pointLight, geometryPosition, directLight );\\n\\t\\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS )\\n\\t\\tpointLightShadow = pointLightShadows[ i ];\\n\\t\\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowIntensity, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tSpotLight spotLight;\\n\\tvec4 spotColor;\\n\\tvec3 spotLightCoord;\\n\\tbool inSpotLightMap;\\n\\t#if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\\n\\tSpotLightShadow spotLightShadow;\\n\\t#endif\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\\n\\t\\tspotLight = spotLights[ i ];\\n\\t\\tgetSpotLightInfo( spotLight, geometryPosition, directLight );\\n\\t\\t#if ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\\n\\t\\t#define SPOT_LIGHT_MAP_INDEX UNROLLED_LOOP_INDEX\\n\\t\\t#elif ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\\n\\t\\t#define SPOT_LIGHT_MAP_INDEX NUM_SPOT_LIGHT_MAPS\\n\\t\\t#else\\n\\t\\t#define SPOT_LIGHT_MAP_INDEX ( UNROLLED_LOOP_INDEX - NUM_SPOT_LIGHT_SHADOWS + NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\\n\\t\\t#endif\\n\\t\\t#if ( SPOT_LIGHT_MAP_INDEX < NUM_SPOT_LIGHT_MAPS )\\n\\t\\t\\tspotLightCoord = vSpotLightCoord[ i ].xyz / vSpotLightCoord[ i ].w;\\n\\t\\t\\tinSpotLightMap = all( lessThan( abs( spotLightCoord * 2. - 1. ), vec3( 1.0 ) ) );\\n\\t\\t\\tspotColor = texture2D( spotLightMap[ SPOT_LIGHT_MAP_INDEX ], spotLightCoord.xy );\\n\\t\\t\\tdirectLight.color = inSpotLightMap ? directLight.color * spotColor.rgb : directLight.color;\\n\\t\\t#endif\\n\\t\\t#undef SPOT_LIGHT_MAP_INDEX\\n\\t\\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\\n\\t\\tspotLightShadow = spotLightShadows[ i ];\\n\\t\\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowIntensity, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tDirectionalLight directionalLight;\\n\\t#if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\\n\\tDirectionalLightShadow directionalLightShadow;\\n\\t#endif\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\\n\\t\\tdirectionalLight = directionalLights[ i ];\\n\\t\\tgetDirectionalLightInfo( directionalLight, directLight );\\n\\t\\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\\n\\t\\tdirectionalLightShadow = directionalLightShadows[ i ];\\n\\t\\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowIntensity, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\\n\\tRectAreaLight rectAreaLight;\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\\n\\t\\trectAreaLight = rectAreaLights[ i ];\\n\\t\\tRE_Direct_RectArea( rectAreaLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\\n#if defined( RE_IndirectDiffuse )\\n\\tvec3 iblIrradiance = vec3( 0.0 );\\n\\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\\n\\t#if defined( USE_LIGHT_PROBES )\\n\\t\\tirradiance += getLightProbeIrradiance( lightProbe, geometryNormal );\\n\\t#endif\\n\\t#if ( NUM_HEMI_LIGHTS > 0 )\\n\\t\\t#pragma unroll_loop_start\\n\\t\\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\\n\\t\\t\\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometryNormal );\\n\\t\\t}\\n\\t\\t#pragma unroll_loop_end\\n\\t#endif\\n#endif\\n#if defined( RE_IndirectSpecular )\\n\\tvec3 radiance = vec3( 0.0 );\\n\\tvec3 clearcoatRadiance = vec3( 0.0 );\\n#endif\";\n\nvar lights_fragment_maps = \"#if defined( RE_IndirectDiffuse )\\n\\t#ifdef USE_LIGHTMAP\\n\\t\\tvec4 lightMapTexel = texture2D( lightMap, vLightMapUv );\\n\\t\\tvec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity;\\n\\t\\tirradiance += lightMapIrradiance;\\n\\t#endif\\n\\t#if defined( USE_ENVMAP ) && defined( STANDARD ) && defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\tiblIrradiance += getIBLIrradiance( geometryNormal );\\n\\t#endif\\n#endif\\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\\n\\t#ifdef USE_ANISOTROPY\\n\\t\\tradiance += getIBLAnisotropyRadiance( geometryViewDir, geometryNormal, material.roughness, material.anisotropyB, material.anisotropy );\\n\\t#else\\n\\t\\tradiance += getIBLRadiance( geometryViewDir, geometryNormal, material.roughness );\\n\\t#endif\\n\\t#ifdef USE_CLEARCOAT\\n\\t\\tclearcoatRadiance += getIBLRadiance( geometryViewDir, geometryClearcoatNormal, material.clearcoatRoughness );\\n\\t#endif\\n#endif\";\n\nvar lights_fragment_end = \"#if defined( RE_IndirectDiffuse )\\n\\tRE_IndirectDiffuse( irradiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\\n#endif\\n#if defined( RE_IndirectSpecular )\\n\\tRE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\\n#endif\";\n\nvar logdepthbuf_fragment = \"#if defined( USE_LOGARITHMIC_DEPTH_BUFFER )\\n\\tgl_FragDepth = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;\\n#endif\";\n\nvar logdepthbuf_pars_fragment = \"#if defined( USE_LOGARITHMIC_DEPTH_BUFFER )\\n\\tuniform float logDepthBufFC;\\n\\tvarying float vFragDepth;\\n\\tvarying float vIsPerspective;\\n#endif\";\n\nvar logdepthbuf_pars_vertex = \"#ifdef USE_LOGARITHMIC_DEPTH_BUFFER\\n\\tvarying float vFragDepth;\\n\\tvarying float vIsPerspective;\\n#endif\";\n\nvar logdepthbuf_vertex = \"#ifdef USE_LOGARITHMIC_DEPTH_BUFFER\\n\\tvFragDepth = 1.0 + gl_Position.w;\\n\\tvIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) );\\n#endif\";\n\nvar map_fragment = \"#ifdef USE_MAP\\n\\tvec4 sampledDiffuseColor = texture2D( map, vMapUv );\\n\\t#ifdef DECODE_VIDEO_TEXTURE\\n\\t\\tsampledDiffuseColor = sRGBTransferEOTF( sampledDiffuseColor );\\n\\t#endif\\n\\tdiffuseColor *= sampledDiffuseColor;\\n#endif\";\n\nvar map_pars_fragment = \"#ifdef USE_MAP\\n\\tuniform sampler2D map;\\n#endif\";\n\nvar map_particle_fragment = \"#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\\n\\t#if defined( USE_POINTS_UV )\\n\\t\\tvec2 uv = vUv;\\n\\t#else\\n\\t\\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\\n\\t#endif\\n#endif\\n#ifdef USE_MAP\\n\\tdiffuseColor *= texture2D( map, uv );\\n#endif\\n#ifdef USE_ALPHAMAP\\n\\tdiffuseColor.a *= texture2D( alphaMap, uv ).g;\\n#endif\";\n\nvar map_particle_pars_fragment = \"#if defined( USE_POINTS_UV )\\n\\tvarying vec2 vUv;\\n#else\\n\\t#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\\n\\t\\tuniform mat3 uvTransform;\\n\\t#endif\\n#endif\\n#ifdef USE_MAP\\n\\tuniform sampler2D map;\\n#endif\\n#ifdef USE_ALPHAMAP\\n\\tuniform sampler2D alphaMap;\\n#endif\";\n\nvar metalnessmap_fragment = \"float metalnessFactor = metalness;\\n#ifdef USE_METALNESSMAP\\n\\tvec4 texelMetalness = texture2D( metalnessMap, vMetalnessMapUv );\\n\\tmetalnessFactor *= texelMetalness.b;\\n#endif\";\n\nvar metalnessmap_pars_fragment = \"#ifdef USE_METALNESSMAP\\n\\tuniform sampler2D metalnessMap;\\n#endif\";\n\nvar morphinstance_vertex = \"#ifdef USE_INSTANCING_MORPH\\n\\tfloat morphTargetInfluences[ MORPHTARGETS_COUNT ];\\n\\tfloat morphTargetBaseInfluence = texelFetch( morphTexture, ivec2( 0, gl_InstanceID ), 0 ).r;\\n\\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\\n\\t\\tmorphTargetInfluences[i] =  texelFetch( morphTexture, ivec2( i + 1, gl_InstanceID ), 0 ).r;\\n\\t}\\n#endif\";\n\nvar morphcolor_vertex = \"#if defined( USE_MORPHCOLORS )\\n\\tvColor *= morphTargetBaseInfluence;\\n\\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\\n\\t\\t#if defined( USE_COLOR_ALPHA )\\n\\t\\t\\tif ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ) * morphTargetInfluences[ i ];\\n\\t\\t#elif defined( USE_COLOR )\\n\\t\\t\\tif ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ).rgb * morphTargetInfluences[ i ];\\n\\t\\t#endif\\n\\t}\\n#endif\";\n\nvar morphnormal_vertex = \"#ifdef USE_MORPHNORMALS\\n\\tobjectNormal *= morphTargetBaseInfluence;\\n\\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\\n\\t\\tif ( morphTargetInfluences[ i ] != 0.0 ) objectNormal += getMorph( gl_VertexID, i, 1 ).xyz * morphTargetInfluences[ i ];\\n\\t}\\n#endif\";\n\nvar morphtarget_pars_vertex = \"#ifdef USE_MORPHTARGETS\\n\\t#ifndef USE_INSTANCING_MORPH\\n\\t\\tuniform float morphTargetBaseInfluence;\\n\\t\\tuniform float morphTargetInfluences[ MORPHTARGETS_COUNT ];\\n\\t#endif\\n\\tuniform sampler2DArray morphTargetsTexture;\\n\\tuniform ivec2 morphTargetsTextureSize;\\n\\tvec4 getMorph( const in int vertexIndex, const in int morphTargetIndex, const in int offset ) {\\n\\t\\tint texelIndex = vertexIndex * MORPHTARGETS_TEXTURE_STRIDE + offset;\\n\\t\\tint y = texelIndex / morphTargetsTextureSize.x;\\n\\t\\tint x = texelIndex - y * morphTargetsTextureSize.x;\\n\\t\\tivec3 morphUV = ivec3( x, y, morphTargetIndex );\\n\\t\\treturn texelFetch( morphTargetsTexture, morphUV, 0 );\\n\\t}\\n#endif\";\n\nvar morphtarget_vertex = \"#ifdef USE_MORPHTARGETS\\n\\ttransformed *= morphTargetBaseInfluence;\\n\\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\\n\\t\\tif ( morphTargetInfluences[ i ] != 0.0 ) transformed += getMorph( gl_VertexID, i, 0 ).xyz * morphTargetInfluences[ i ];\\n\\t}\\n#endif\";\n\nvar normal_fragment_begin = \"float faceDirection = gl_FrontFacing ? 1.0 : - 1.0;\\n#ifdef FLAT_SHADED\\n\\tvec3 fdx = dFdx( vViewPosition );\\n\\tvec3 fdy = dFdy( vViewPosition );\\n\\tvec3 normal = normalize( cross( fdx, fdy ) );\\n#else\\n\\tvec3 normal = normalize( vNormal );\\n\\t#ifdef DOUBLE_SIDED\\n\\t\\tnormal *= faceDirection;\\n\\t#endif\\n#endif\\n#if defined( USE_NORMALMAP_TANGENTSPACE ) || defined( USE_CLEARCOAT_NORMALMAP ) || defined( USE_ANISOTROPY )\\n\\t#ifdef USE_TANGENT\\n\\t\\tmat3 tbn = mat3( normalize( vTangent ), normalize( vBitangent ), normal );\\n\\t#else\\n\\t\\tmat3 tbn = getTangentFrame( - vViewPosition, normal,\\n\\t\\t#if defined( USE_NORMALMAP )\\n\\t\\t\\tvNormalMapUv\\n\\t\\t#elif defined( USE_CLEARCOAT_NORMALMAP )\\n\\t\\t\\tvClearcoatNormalMapUv\\n\\t\\t#else\\n\\t\\t\\tvUv\\n\\t\\t#endif\\n\\t\\t);\\n\\t#endif\\n\\t#if defined( DOUBLE_SIDED ) && ! defined( FLAT_SHADED )\\n\\t\\ttbn[0] *= faceDirection;\\n\\t\\ttbn[1] *= faceDirection;\\n\\t#endif\\n#endif\\n#ifdef USE_CLEARCOAT_NORMALMAP\\n\\t#ifdef USE_TANGENT\\n\\t\\tmat3 tbn2 = mat3( normalize( vTangent ), normalize( vBitangent ), normal );\\n\\t#else\\n\\t\\tmat3 tbn2 = getTangentFrame( - vViewPosition, normal, vClearcoatNormalMapUv );\\n\\t#endif\\n\\t#if defined( DOUBLE_SIDED ) && ! defined( FLAT_SHADED )\\n\\t\\ttbn2[0] *= faceDirection;\\n\\t\\ttbn2[1] *= faceDirection;\\n\\t#endif\\n#endif\\nvec3 nonPerturbedNormal = normal;\";\n\nvar normal_fragment_maps = \"#ifdef USE_NORMALMAP_OBJECTSPACE\\n\\tnormal = texture2D( normalMap, vNormalMapUv ).xyz * 2.0 - 1.0;\\n\\t#ifdef FLIP_SIDED\\n\\t\\tnormal = - normal;\\n\\t#endif\\n\\t#ifdef DOUBLE_SIDED\\n\\t\\tnormal = normal * faceDirection;\\n\\t#endif\\n\\tnormal = normalize( normalMatrix * normal );\\n#elif defined( USE_NORMALMAP_TANGENTSPACE )\\n\\tvec3 mapN = texture2D( normalMap, vNormalMapUv ).xyz * 2.0 - 1.0;\\n\\tmapN.xy *= normalScale;\\n\\tnormal = normalize( tbn * mapN );\\n#elif defined( USE_BUMPMAP )\\n\\tnormal = perturbNormalArb( - vViewPosition, normal, dHdxy_fwd(), faceDirection );\\n#endif\";\n\nvar normal_pars_fragment = \"#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n\\t#ifdef USE_TANGENT\\n\\t\\tvarying vec3 vTangent;\\n\\t\\tvarying vec3 vBitangent;\\n\\t#endif\\n#endif\";\n\nvar normal_pars_vertex = \"#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n\\t#ifdef USE_TANGENT\\n\\t\\tvarying vec3 vTangent;\\n\\t\\tvarying vec3 vBitangent;\\n\\t#endif\\n#endif\";\n\nvar normal_vertex = \"#ifndef FLAT_SHADED\\n\\tvNormal = normalize( transformedNormal );\\n\\t#ifdef USE_TANGENT\\n\\t\\tvTangent = normalize( transformedTangent );\\n\\t\\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\\n\\t#endif\\n#endif\";\n\nvar normalmap_pars_fragment = \"#ifdef USE_NORMALMAP\\n\\tuniform sampler2D normalMap;\\n\\tuniform vec2 normalScale;\\n#endif\\n#ifdef USE_NORMALMAP_OBJECTSPACE\\n\\tuniform mat3 normalMatrix;\\n#endif\\n#if ! defined ( USE_TANGENT ) && ( defined ( USE_NORMALMAP_TANGENTSPACE ) || defined ( USE_CLEARCOAT_NORMALMAP ) || defined( USE_ANISOTROPY ) )\\n\\tmat3 getTangentFrame( vec3 eye_pos, vec3 surf_norm, vec2 uv ) {\\n\\t\\tvec3 q0 = dFdx( eye_pos.xyz );\\n\\t\\tvec3 q1 = dFdy( eye_pos.xyz );\\n\\t\\tvec2 st0 = dFdx( uv.st );\\n\\t\\tvec2 st1 = dFdy( uv.st );\\n\\t\\tvec3 N = surf_norm;\\n\\t\\tvec3 q1perp = cross( q1, N );\\n\\t\\tvec3 q0perp = cross( N, q0 );\\n\\t\\tvec3 T = q1perp * st0.x + q0perp * st1.x;\\n\\t\\tvec3 B = q1perp * st0.y + q0perp * st1.y;\\n\\t\\tfloat det = max( dot( T, T ), dot( B, B ) );\\n\\t\\tfloat scale = ( det == 0.0 ) ? 0.0 : inversesqrt( det );\\n\\t\\treturn mat3( T * scale, B * scale, N );\\n\\t}\\n#endif\";\n\nvar clearcoat_normal_fragment_begin = \"#ifdef USE_CLEARCOAT\\n\\tvec3 clearcoatNormal = nonPerturbedNormal;\\n#endif\";\n\nvar clearcoat_normal_fragment_maps = \"#ifdef USE_CLEARCOAT_NORMALMAP\\n\\tvec3 clearcoatMapN = texture2D( clearcoatNormalMap, vClearcoatNormalMapUv ).xyz * 2.0 - 1.0;\\n\\tclearcoatMapN.xy *= clearcoatNormalScale;\\n\\tclearcoatNormal = normalize( tbn2 * clearcoatMapN );\\n#endif\";\n\nvar clearcoat_pars_fragment = \"#ifdef USE_CLEARCOATMAP\\n\\tuniform sampler2D clearcoatMap;\\n#endif\\n#ifdef USE_CLEARCOAT_NORMALMAP\\n\\tuniform sampler2D clearcoatNormalMap;\\n\\tuniform vec2 clearcoatNormalScale;\\n#endif\\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\\n\\tuniform sampler2D clearcoatRoughnessMap;\\n#endif\";\n\nvar iridescence_pars_fragment = \"#ifdef USE_IRIDESCENCEMAP\\n\\tuniform sampler2D iridescenceMap;\\n#endif\\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\\n\\tuniform sampler2D iridescenceThicknessMap;\\n#endif\";\n\nvar opaque_fragment = \"#ifdef OPAQUE\\ndiffuseColor.a = 1.0;\\n#endif\\n#ifdef USE_TRANSMISSION\\ndiffuseColor.a *= material.transmissionAlpha;\\n#endif\\ngl_FragColor = vec4( outgoingLight, diffuseColor.a );\";\n\nvar packing = \"vec3 packNormalToRGB( const in vec3 normal ) {\\n\\treturn normalize( normal ) * 0.5 + 0.5;\\n}\\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\\n\\treturn 2.0 * rgb.xyz - 1.0;\\n}\\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;const float ShiftRight8 = 1. / 256.;\\nconst float Inv255 = 1. / 255.;\\nconst vec4 PackFactors = vec4( 1.0, 256.0, 256.0 * 256.0, 256.0 * 256.0 * 256.0 );\\nconst vec2 UnpackFactors2 = vec2( UnpackDownscale, 1.0 / PackFactors.g );\\nconst vec3 UnpackFactors3 = vec3( UnpackDownscale / PackFactors.rg, 1.0 / PackFactors.b );\\nconst vec4 UnpackFactors4 = vec4( UnpackDownscale / PackFactors.rgb, 1.0 / PackFactors.a );\\nvec4 packDepthToRGBA( const in float v ) {\\n\\tif( v <= 0.0 )\\n\\t\\treturn vec4( 0., 0., 0., 0. );\\n\\tif( v >= 1.0 )\\n\\t\\treturn vec4( 1., 1., 1., 1. );\\n\\tfloat vuf;\\n\\tfloat af = modf( v * PackFactors.a, vuf );\\n\\tfloat bf = modf( vuf * ShiftRight8, vuf );\\n\\tfloat gf = modf( vuf * ShiftRight8, vuf );\\n\\treturn vec4( vuf * Inv255, gf * PackUpscale, bf * PackUpscale, af );\\n}\\nvec3 packDepthToRGB( const in float v ) {\\n\\tif( v <= 0.0 )\\n\\t\\treturn vec3( 0., 0., 0. );\\n\\tif( v >= 1.0 )\\n\\t\\treturn vec3( 1., 1., 1. );\\n\\tfloat vuf;\\n\\tfloat bf = modf( v * PackFactors.b, vuf );\\n\\tfloat gf = modf( vuf * ShiftRight8, vuf );\\n\\treturn vec3( vuf * Inv255, gf * PackUpscale, bf );\\n}\\nvec2 packDepthToRG( const in float v ) {\\n\\tif( v <= 0.0 )\\n\\t\\treturn vec2( 0., 0. );\\n\\tif( v >= 1.0 )\\n\\t\\treturn vec2( 1., 1. );\\n\\tfloat vuf;\\n\\tfloat gf = modf( v * 256., vuf );\\n\\treturn vec2( vuf * Inv255, gf );\\n}\\nfloat unpackRGBAToDepth( const in vec4 v ) {\\n\\treturn dot( v, UnpackFactors4 );\\n}\\nfloat unpackRGBToDepth( const in vec3 v ) {\\n\\treturn dot( v, UnpackFactors3 );\\n}\\nfloat unpackRGToDepth( const in vec2 v ) {\\n\\treturn v.r * UnpackFactors2.r + v.g * UnpackFactors2.g;\\n}\\nvec4 pack2HalfToRGBA( const in vec2 v ) {\\n\\tvec4 r = vec4( v.x, fract( v.x * 255.0 ), v.y, fract( v.y * 255.0 ) );\\n\\treturn vec4( r.x - r.y / 255.0, r.y, r.z - r.w / 255.0, r.w );\\n}\\nvec2 unpackRGBATo2Half( const in vec4 v ) {\\n\\treturn vec2( v.x + ( v.y / 255.0 ), v.z + ( v.w / 255.0 ) );\\n}\\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\\n\\treturn ( viewZ + near ) / ( near - far );\\n}\\nfloat orthographicDepthToViewZ( const in float depth, const in float near, const in float far ) {\\n\\treturn depth * ( near - far ) - near;\\n}\\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\\n\\treturn ( ( near + viewZ ) * far ) / ( ( far - near ) * viewZ );\\n}\\nfloat perspectiveDepthToViewZ( const in float depth, const in float near, const in float far ) {\\n\\treturn ( near * far ) / ( ( far - near ) * depth - far );\\n}\";\n\nvar premultiplied_alpha_fragment = \"#ifdef PREMULTIPLIED_ALPHA\\n\\tgl_FragColor.rgb *= gl_FragColor.a;\\n#endif\";\n\nvar project_vertex = \"vec4 mvPosition = vec4( transformed, 1.0 );\\n#ifdef USE_BATCHING\\n\\tmvPosition = batchingMatrix * mvPosition;\\n#endif\\n#ifdef USE_INSTANCING\\n\\tmvPosition = instanceMatrix * mvPosition;\\n#endif\\nmvPosition = modelViewMatrix * mvPosition;\\ngl_Position = projectionMatrix * mvPosition;\";\n\nvar dithering_fragment = \"#ifdef DITHERING\\n\\tgl_FragColor.rgb = dithering( gl_FragColor.rgb );\\n#endif\";\n\nvar dithering_pars_fragment = \"#ifdef DITHERING\\n\\tvec3 dithering( vec3 color ) {\\n\\t\\tfloat grid_position = rand( gl_FragCoord.xy );\\n\\t\\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\\n\\t\\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\\n\\t\\treturn color + dither_shift_RGB;\\n\\t}\\n#endif\";\n\nvar roughnessmap_fragment = \"float roughnessFactor = roughness;\\n#ifdef USE_ROUGHNESSMAP\\n\\tvec4 texelRoughness = texture2D( roughnessMap, vRoughnessMapUv );\\n\\troughnessFactor *= texelRoughness.g;\\n#endif\";\n\nvar roughnessmap_pars_fragment = \"#ifdef USE_ROUGHNESSMAP\\n\\tuniform sampler2D roughnessMap;\\n#endif\";\n\nvar shadowmap_pars_fragment = \"#if NUM_SPOT_LIGHT_COORDS > 0\\n\\tvarying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\\n#endif\\n#if NUM_SPOT_LIGHT_MAPS > 0\\n\\tuniform sampler2D spotLightMap[ NUM_SPOT_LIGHT_MAPS ];\\n#endif\\n#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHT_SHADOWS > 0\\n\\t\\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t\\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t\\tstruct DirectionalLightShadow {\\n\\t\\t\\tfloat shadowIntensity;\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t};\\n\\t\\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHT_SHADOWS > 0\\n\\t\\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\\n\\t\\tstruct SpotLightShadow {\\n\\t\\t\\tfloat shadowIntensity;\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t};\\n\\t\\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\\n\\t#endif\\n\\t#if NUM_POINT_LIGHT_SHADOWS > 0\\n\\t\\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t\\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t\\tstruct PointLightShadow {\\n\\t\\t\\tfloat shadowIntensity;\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t\\tfloat shadowCameraNear;\\n\\t\\t\\tfloat shadowCameraFar;\\n\\t\\t};\\n\\t\\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t#endif\\n\\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\\n\\t\\tfloat depth = unpackRGBAToDepth( texture2D( depths, uv ) );\\n\\t\\t#ifdef USE_REVERSED_DEPTH_BUFFER\\n\\t\\t\\treturn step( depth, compare );\\n\\t\\t#else\\n\\t\\t\\treturn step( compare, depth );\\n\\t\\t#endif\\n\\t}\\n\\tvec2 texture2DDistribution( sampler2D shadow, vec2 uv ) {\\n\\t\\treturn unpackRGBATo2Half( texture2D( shadow, uv ) );\\n\\t}\\n\\tfloat VSMShadow( sampler2D shadow, vec2 uv, float compare ) {\\n\\t\\tfloat occlusion = 1.0;\\n\\t\\tvec2 distribution = texture2DDistribution( shadow, uv );\\n\\t\\t#ifdef USE_REVERSED_DEPTH_BUFFER\\n\\t\\t\\tfloat hard_shadow = step( distribution.x, compare );\\n\\t\\t#else\\n\\t\\t\\tfloat hard_shadow = step( compare, distribution.x );\\n\\t\\t#endif\\n\\t\\tif ( hard_shadow != 1.0 ) {\\n\\t\\t\\tfloat distance = compare - distribution.x;\\n\\t\\t\\tfloat variance = max( 0.00000, distribution.y * distribution.y );\\n\\t\\t\\tfloat softness_probability = variance / (variance + distance * distance );\\t\\t\\tsoftness_probability = clamp( ( softness_probability - 0.3 ) / ( 0.95 - 0.3 ), 0.0, 1.0 );\\t\\t\\tocclusion = clamp( max( hard_shadow, softness_probability ), 0.0, 1.0 );\\n\\t\\t}\\n\\t\\treturn occlusion;\\n\\t}\\n\\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\\n\\t\\tfloat shadow = 1.0;\\n\\t\\tshadowCoord.xyz /= shadowCoord.w;\\n\\t\\tshadowCoord.z += shadowBias;\\n\\t\\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\\n\\t\\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\\n\\t\\tif ( frustumTest ) {\\n\\t\\t#if defined( SHADOWMAP_TYPE_PCF )\\n\\t\\t\\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\\n\\t\\t\\tfloat dx0 = - texelSize.x * shadowRadius;\\n\\t\\t\\tfloat dy0 = - texelSize.y * shadowRadius;\\n\\t\\t\\tfloat dx1 = + texelSize.x * shadowRadius;\\n\\t\\t\\tfloat dy1 = + texelSize.y * shadowRadius;\\n\\t\\t\\tfloat dx2 = dx0 / 2.0;\\n\\t\\t\\tfloat dy2 = dy0 / 2.0;\\n\\t\\t\\tfloat dx3 = dx1 / 2.0;\\n\\t\\t\\tfloat dy3 = dy1 / 2.0;\\n\\t\\t\\tshadow = (\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy2 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy2 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy2 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy3 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy3 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy3 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\\n\\t\\t\\t) * ( 1.0 / 17.0 );\\n\\t\\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\\n\\t\\t\\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\\n\\t\\t\\tfloat dx = texelSize.x;\\n\\t\\t\\tfloat dy = texelSize.y;\\n\\t\\t\\tvec2 uv = shadowCoord.xy;\\n\\t\\t\\tvec2 f = fract( uv * shadowMapSize + 0.5 );\\n\\t\\t\\tuv -= f * texelSize;\\n\\t\\t\\tshadow = (\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, uv, shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, uv + vec2( dx, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, uv + vec2( 0.0, dy ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, uv + texelSize, shadowCoord.z ) +\\n\\t\\t\\t\\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, 0.0 ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 0.0 ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t f.x ) +\\n\\t\\t\\t\\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t f.x ) +\\n\\t\\t\\t\\tmix( texture2DCompare( shadowMap, uv + vec2( 0.0, -dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( 0.0, 2.0 * dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t f.y ) +\\n\\t\\t\\t\\tmix( texture2DCompare( shadowMap, uv + vec2( dx, -dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( dx, 2.0 * dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t f.y ) +\\n\\t\\t\\t\\tmix( mix( texture2DCompare( shadowMap, uv + vec2( -dx, -dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t\\t  texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, -dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t\\t  f.x ),\\n\\t\\t\\t\\t\\t mix( texture2DCompare( shadowMap, uv + vec2( -dx, 2.0 * dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t\\t  texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 2.0 * dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t\\t  f.x ),\\n\\t\\t\\t\\t\\t f.y )\\n\\t\\t\\t) * ( 1.0 / 9.0 );\\n\\t\\t#elif defined( SHADOWMAP_TYPE_VSM )\\n\\t\\t\\tshadow = VSMShadow( shadowMap, shadowCoord.xy, shadowCoord.z );\\n\\t\\t#else\\n\\t\\t\\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\\n\\t\\t#endif\\n\\t\\t}\\n\\t\\treturn mix( 1.0, shadow, shadowIntensity );\\n\\t}\\n\\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\\n\\t\\tvec3 absV = abs( v );\\n\\t\\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\\n\\t\\tabsV *= scaleToCube;\\n\\t\\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\\n\\t\\tvec2 planar = v.xy;\\n\\t\\tfloat almostATexel = 1.5 * texelSizeY;\\n\\t\\tfloat almostOne = 1.0 - almostATexel;\\n\\t\\tif ( absV.z >= almostOne ) {\\n\\t\\t\\tif ( v.z > 0.0 )\\n\\t\\t\\t\\tplanar.x = 4.0 - v.x;\\n\\t\\t} else if ( absV.x >= almostOne ) {\\n\\t\\t\\tfloat signX = sign( v.x );\\n\\t\\t\\tplanar.x = v.z * signX + 2.0 * signX;\\n\\t\\t} else if ( absV.y >= almostOne ) {\\n\\t\\t\\tfloat signY = sign( v.y );\\n\\t\\t\\tplanar.x = v.x + 2.0 * signY + 2.0;\\n\\t\\t\\tplanar.y = v.z * signY - 2.0;\\n\\t\\t}\\n\\t\\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\\n\\t}\\n\\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\\n\\t\\tfloat shadow = 1.0;\\n\\t\\tvec3 lightToPosition = shadowCoord.xyz;\\n\\t\\t\\n\\t\\tfloat lightToPositionLength = length( lightToPosition );\\n\\t\\tif ( lightToPositionLength - shadowCameraFar <= 0.0 && lightToPositionLength - shadowCameraNear >= 0.0 ) {\\n\\t\\t\\tfloat dp = ( lightToPositionLength - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear );\\t\\t\\tdp += shadowBias;\\n\\t\\t\\tvec3 bd3D = normalize( lightToPosition );\\n\\t\\t\\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\\n\\t\\t\\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT ) || defined( SHADOWMAP_TYPE_VSM )\\n\\t\\t\\t\\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\\n\\t\\t\\t\\tshadow = (\\n\\t\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\\n\\t\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\\n\\t\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\\n\\t\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\\n\\t\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\\n\\t\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\\n\\t\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\\n\\t\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\\n\\t\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\\n\\t\\t\\t\\t) * ( 1.0 / 9.0 );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tshadow = texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\\n\\t\\t\\t#endif\\n\\t\\t}\\n\\t\\treturn mix( 1.0, shadow, shadowIntensity );\\n\\t}\\n#endif\";\n\nvar shadowmap_pars_vertex = \"#if NUM_SPOT_LIGHT_COORDS > 0\\n\\tuniform mat4 spotLightMatrix[ NUM_SPOT_LIGHT_COORDS ];\\n\\tvarying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\\n#endif\\n#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHT_SHADOWS > 0\\n\\t\\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t\\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t\\tstruct DirectionalLightShadow {\\n\\t\\t\\tfloat shadowIntensity;\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t};\\n\\t\\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHT_SHADOWS > 0\\n\\t\\tstruct SpotLightShadow {\\n\\t\\t\\tfloat shadowIntensity;\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t};\\n\\t\\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\\n\\t#endif\\n\\t#if NUM_POINT_LIGHT_SHADOWS > 0\\n\\t\\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t\\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t\\tstruct PointLightShadow {\\n\\t\\t\\tfloat shadowIntensity;\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t\\tfloat shadowCameraNear;\\n\\t\\t\\tfloat shadowCameraFar;\\n\\t\\t};\\n\\t\\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t#endif\\n#endif\";\n\nvar shadowmap_vertex = \"#if ( defined( USE_SHADOWMAP ) && ( NUM_DIR_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0 ) ) || ( NUM_SPOT_LIGHT_COORDS > 0 )\\n\\tvec3 shadowWorldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\\n\\tvec4 shadowWorldPosition;\\n#endif\\n#if defined( USE_SHADOWMAP )\\n\\t#if NUM_DIR_LIGHT_SHADOWS > 0\\n\\t\\t#pragma unroll_loop_start\\n\\t\\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\\n\\t\\t\\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * directionalLightShadows[ i ].shadowNormalBias, 0 );\\n\\t\\t\\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * shadowWorldPosition;\\n\\t\\t}\\n\\t\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#if NUM_POINT_LIGHT_SHADOWS > 0\\n\\t\\t#pragma unroll_loop_start\\n\\t\\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\\n\\t\\t\\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * pointLightShadows[ i ].shadowNormalBias, 0 );\\n\\t\\t\\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * shadowWorldPosition;\\n\\t\\t}\\n\\t\\t#pragma unroll_loop_end\\n\\t#endif\\n#endif\\n#if NUM_SPOT_LIGHT_COORDS > 0\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHT_COORDS; i ++ ) {\\n\\t\\tshadowWorldPosition = worldPosition;\\n\\t\\t#if ( defined( USE_SHADOWMAP ) && UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\\n\\t\\t\\tshadowWorldPosition.xyz += shadowWorldNormal * spotLightShadows[ i ].shadowNormalBias;\\n\\t\\t#endif\\n\\t\\tvSpotLightCoord[ i ] = spotLightMatrix[ i ] * shadowWorldPosition;\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\";\n\nvar shadowmask_pars_fragment = \"float getShadowMask() {\\n\\tfloat shadow = 1.0;\\n\\t#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHT_SHADOWS > 0\\n\\tDirectionalLightShadow directionalLight;\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\\n\\t\\tdirectionalLight = directionalLightShadows[ i ];\\n\\t\\tshadow *= receiveShadow ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowIntensity, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\\n\\t}\\n\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHT_SHADOWS > 0\\n\\tSpotLightShadow spotLight;\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\\n\\t\\tspotLight = spotLightShadows[ i ];\\n\\t\\tshadow *= receiveShadow ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowIntensity, spotLight.shadowBias, spotLight.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\\n\\t}\\n\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#if NUM_POINT_LIGHT_SHADOWS > 0\\n\\tPointLightShadow pointLight;\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\\n\\t\\tpointLight = pointLightShadows[ i ];\\n\\t\\tshadow *= receiveShadow ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowIntensity, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\\n\\t}\\n\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#endif\\n\\treturn shadow;\\n}\";\n\nvar skinbase_vertex = \"#ifdef USE_SKINNING\\n\\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\\n\\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\\n\\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\\n\\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\\n#endif\";\n\nvar skinning_pars_vertex = \"#ifdef USE_SKINNING\\n\\tuniform mat4 bindMatrix;\\n\\tuniform mat4 bindMatrixInverse;\\n\\tuniform highp sampler2D boneTexture;\\n\\tmat4 getBoneMatrix( const in float i ) {\\n\\t\\tint size = textureSize( boneTexture, 0 ).x;\\n\\t\\tint j = int( i ) * 4;\\n\\t\\tint x = j % size;\\n\\t\\tint y = j / size;\\n\\t\\tvec4 v1 = texelFetch( boneTexture, ivec2( x, y ), 0 );\\n\\t\\tvec4 v2 = texelFetch( boneTexture, ivec2( x + 1, y ), 0 );\\n\\t\\tvec4 v3 = texelFetch( boneTexture, ivec2( x + 2, y ), 0 );\\n\\t\\tvec4 v4 = texelFetch( boneTexture, ivec2( x + 3, y ), 0 );\\n\\t\\treturn mat4( v1, v2, v3, v4 );\\n\\t}\\n#endif\";\n\nvar skinning_vertex = \"#ifdef USE_SKINNING\\n\\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\\n\\tvec4 skinned = vec4( 0.0 );\\n\\tskinned += boneMatX * skinVertex * skinWeight.x;\\n\\tskinned += boneMatY * skinVertex * skinWeight.y;\\n\\tskinned += boneMatZ * skinVertex * skinWeight.z;\\n\\tskinned += boneMatW * skinVertex * skinWeight.w;\\n\\ttransformed = ( bindMatrixInverse * skinned ).xyz;\\n#endif\";\n\nvar skinnormal_vertex = \"#ifdef USE_SKINNING\\n\\tmat4 skinMatrix = mat4( 0.0 );\\n\\tskinMatrix += skinWeight.x * boneMatX;\\n\\tskinMatrix += skinWeight.y * boneMatY;\\n\\tskinMatrix += skinWeight.z * boneMatZ;\\n\\tskinMatrix += skinWeight.w * boneMatW;\\n\\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\\n\\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\\n\\t#ifdef USE_TANGENT\\n\\t\\tobjectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz;\\n\\t#endif\\n#endif\";\n\nvar specularmap_fragment = \"float specularStrength;\\n#ifdef USE_SPECULARMAP\\n\\tvec4 texelSpecular = texture2D( specularMap, vSpecularMapUv );\\n\\tspecularStrength = texelSpecular.r;\\n#else\\n\\tspecularStrength = 1.0;\\n#endif\";\n\nvar specularmap_pars_fragment = \"#ifdef USE_SPECULARMAP\\n\\tuniform sampler2D specularMap;\\n#endif\";\n\nvar tonemapping_fragment = \"#if defined( TONE_MAPPING )\\n\\tgl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\\n#endif\";\n\nvar tonemapping_pars_fragment = \"#ifndef saturate\\n#define saturate( a ) clamp( a, 0.0, 1.0 )\\n#endif\\nuniform float toneMappingExposure;\\nvec3 LinearToneMapping( vec3 color ) {\\n\\treturn saturate( toneMappingExposure * color );\\n}\\nvec3 ReinhardToneMapping( vec3 color ) {\\n\\tcolor *= toneMappingExposure;\\n\\treturn saturate( color / ( vec3( 1.0 ) + color ) );\\n}\\nvec3 CineonToneMapping( vec3 color ) {\\n\\tcolor *= toneMappingExposure;\\n\\tcolor = max( vec3( 0.0 ), color - 0.004 );\\n\\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\\n}\\nvec3 RRTAndODTFit( vec3 v ) {\\n\\tvec3 a = v * ( v + 0.0245786 ) - 0.000090537;\\n\\tvec3 b = v * ( 0.983729 * v + 0.4329510 ) + 0.238081;\\n\\treturn a / b;\\n}\\nvec3 ACESFilmicToneMapping( vec3 color ) {\\n\\tconst mat3 ACESInputMat = mat3(\\n\\t\\tvec3( 0.59719, 0.07600, 0.02840 ),\\t\\tvec3( 0.35458, 0.90834, 0.13383 ),\\n\\t\\tvec3( 0.04823, 0.01566, 0.83777 )\\n\\t);\\n\\tconst mat3 ACESOutputMat = mat3(\\n\\t\\tvec3(  1.60475, -0.10208, -0.00327 ),\\t\\tvec3( -0.53108,  1.10813, -0.07276 ),\\n\\t\\tvec3( -0.07367, -0.00605,  1.07602 )\\n\\t);\\n\\tcolor *= toneMappingExposure / 0.6;\\n\\tcolor = ACESInputMat * color;\\n\\tcolor = RRTAndODTFit( color );\\n\\tcolor = ACESOutputMat * color;\\n\\treturn saturate( color );\\n}\\nconst mat3 LINEAR_REC2020_TO_LINEAR_SRGB = mat3(\\n\\tvec3( 1.6605, - 0.1246, - 0.0182 ),\\n\\tvec3( - 0.5876, 1.1329, - 0.1006 ),\\n\\tvec3( - 0.0728, - 0.0083, 1.1187 )\\n);\\nconst mat3 LINEAR_SRGB_TO_LINEAR_REC2020 = mat3(\\n\\tvec3( 0.6274, 0.0691, 0.0164 ),\\n\\tvec3( 0.3293, 0.9195, 0.0880 ),\\n\\tvec3( 0.0433, 0.0113, 0.8956 )\\n);\\nvec3 agxDefaultContrastApprox( vec3 x ) {\\n\\tvec3 x2 = x * x;\\n\\tvec3 x4 = x2 * x2;\\n\\treturn + 15.5 * x4 * x2\\n\\t\\t- 40.14 * x4 * x\\n\\t\\t+ 31.96 * x4\\n\\t\\t- 6.868 * x2 * x\\n\\t\\t+ 0.4298 * x2\\n\\t\\t+ 0.1191 * x\\n\\t\\t- 0.00232;\\n}\\nvec3 AgXToneMapping( vec3 color ) {\\n\\tconst mat3 AgXInsetMatrix = mat3(\\n\\t\\tvec3( 0.856627153315983, 0.137318972929847, 0.11189821299995 ),\\n\\t\\tvec3( 0.0951212405381588, 0.761241990602591, 0.0767994186031903 ),\\n\\t\\tvec3( 0.0482516061458583, 0.101439036467562, 0.811302368396859 )\\n\\t);\\n\\tconst mat3 AgXOutsetMatrix = mat3(\\n\\t\\tvec3( 1.1271005818144368, - 0.1413297634984383, - 0.14132976349843826 ),\\n\\t\\tvec3( - 0.11060664309660323, 1.157823702216272, - 0.11060664309660294 ),\\n\\t\\tvec3( - 0.016493938717834573, - 0.016493938717834257, 1.2519364065950405 )\\n\\t);\\n\\tconst float AgxMinEv = - 12.47393;\\tconst float AgxMaxEv = 4.026069;\\n\\tcolor *= toneMappingExposure;\\n\\tcolor = LINEAR_SRGB_TO_LINEAR_REC2020 * color;\\n\\tcolor = AgXInsetMatrix * color;\\n\\tcolor = max( color, 1e-10 );\\tcolor = log2( color );\\n\\tcolor = ( color - AgxMinEv ) / ( AgxMaxEv - AgxMinEv );\\n\\tcolor = clamp( color, 0.0, 1.0 );\\n\\tcolor = agxDefaultContrastApprox( color );\\n\\tcolor = AgXOutsetMatrix * color;\\n\\tcolor = pow( max( vec3( 0.0 ), color ), vec3( 2.2 ) );\\n\\tcolor = LINEAR_REC2020_TO_LINEAR_SRGB * color;\\n\\tcolor = clamp( color, 0.0, 1.0 );\\n\\treturn color;\\n}\\nvec3 NeutralToneMapping( vec3 color ) {\\n\\tconst float StartCompression = 0.8 - 0.04;\\n\\tconst float Desaturation = 0.15;\\n\\tcolor *= toneMappingExposure;\\n\\tfloat x = min( color.r, min( color.g, color.b ) );\\n\\tfloat offset = x < 0.08 ? x - 6.25 * x * x : 0.04;\\n\\tcolor -= offset;\\n\\tfloat peak = max( color.r, max( color.g, color.b ) );\\n\\tif ( peak < StartCompression ) return color;\\n\\tfloat d = 1. - StartCompression;\\n\\tfloat newPeak = 1. - d * d / ( peak + d - StartCompression );\\n\\tcolor *= newPeak / peak;\\n\\tfloat g = 1. - 1. / ( Desaturation * ( peak - newPeak ) + 1. );\\n\\treturn mix( color, vec3( newPeak ), g );\\n}\\nvec3 CustomToneMapping( vec3 color ) { return color; }\";\n\nvar transmission_fragment = \"#ifdef USE_TRANSMISSION\\n\\tmaterial.transmission = transmission;\\n\\tmaterial.transmissionAlpha = 1.0;\\n\\tmaterial.thickness = thickness;\\n\\tmaterial.attenuationDistance = attenuationDistance;\\n\\tmaterial.attenuationColor = attenuationColor;\\n\\t#ifdef USE_TRANSMISSIONMAP\\n\\t\\tmaterial.transmission *= texture2D( transmissionMap, vTransmissionMapUv ).r;\\n\\t#endif\\n\\t#ifdef USE_THICKNESSMAP\\n\\t\\tmaterial.thickness *= texture2D( thicknessMap, vThicknessMapUv ).g;\\n\\t#endif\\n\\tvec3 pos = vWorldPosition;\\n\\tvec3 v = normalize( cameraPosition - pos );\\n\\tvec3 n = inverseTransformDirection( normal, viewMatrix );\\n\\tvec4 transmitted = getIBLVolumeRefraction(\\n\\t\\tn, v, material.roughness, material.diffuseColor, material.specularColor, material.specularF90,\\n\\t\\tpos, modelMatrix, viewMatrix, projectionMatrix, material.dispersion, material.ior, material.thickness,\\n\\t\\tmaterial.attenuationColor, material.attenuationDistance );\\n\\tmaterial.transmissionAlpha = mix( material.transmissionAlpha, transmitted.a, material.transmission );\\n\\ttotalDiffuse = mix( totalDiffuse, transmitted.rgb, material.transmission );\\n#endif\";\n\nvar transmission_pars_fragment = \"#ifdef USE_TRANSMISSION\\n\\tuniform float transmission;\\n\\tuniform float thickness;\\n\\tuniform float attenuationDistance;\\n\\tuniform vec3 attenuationColor;\\n\\t#ifdef USE_TRANSMISSIONMAP\\n\\t\\tuniform sampler2D transmissionMap;\\n\\t#endif\\n\\t#ifdef USE_THICKNESSMAP\\n\\t\\tuniform sampler2D thicknessMap;\\n\\t#endif\\n\\tuniform vec2 transmissionSamplerSize;\\n\\tuniform sampler2D transmissionSamplerMap;\\n\\tuniform mat4 modelMatrix;\\n\\tuniform mat4 projectionMatrix;\\n\\tvarying vec3 vWorldPosition;\\n\\tfloat w0( float a ) {\\n\\t\\treturn ( 1.0 / 6.0 ) * ( a * ( a * ( - a + 3.0 ) - 3.0 ) + 1.0 );\\n\\t}\\n\\tfloat w1( float a ) {\\n\\t\\treturn ( 1.0 / 6.0 ) * ( a *  a * ( 3.0 * a - 6.0 ) + 4.0 );\\n\\t}\\n\\tfloat w2( float a ){\\n\\t\\treturn ( 1.0 / 6.0 ) * ( a * ( a * ( - 3.0 * a + 3.0 ) + 3.0 ) + 1.0 );\\n\\t}\\n\\tfloat w3( float a ) {\\n\\t\\treturn ( 1.0 / 6.0 ) * ( a * a * a );\\n\\t}\\n\\tfloat g0( float a ) {\\n\\t\\treturn w0( a ) + w1( a );\\n\\t}\\n\\tfloat g1( float a ) {\\n\\t\\treturn w2( a ) + w3( a );\\n\\t}\\n\\tfloat h0( float a ) {\\n\\t\\treturn - 1.0 + w1( a ) / ( w0( a ) + w1( a ) );\\n\\t}\\n\\tfloat h1( float a ) {\\n\\t\\treturn 1.0 + w3( a ) / ( w2( a ) + w3( a ) );\\n\\t}\\n\\tvec4 bicubic( sampler2D tex, vec2 uv, vec4 texelSize, float lod ) {\\n\\t\\tuv = uv * texelSize.zw + 0.5;\\n\\t\\tvec2 iuv = floor( uv );\\n\\t\\tvec2 fuv = fract( uv );\\n\\t\\tfloat g0x = g0( fuv.x );\\n\\t\\tfloat g1x = g1( fuv.x );\\n\\t\\tfloat h0x = h0( fuv.x );\\n\\t\\tfloat h1x = h1( fuv.x );\\n\\t\\tfloat h0y = h0( fuv.y );\\n\\t\\tfloat h1y = h1( fuv.y );\\n\\t\\tvec2 p0 = ( vec2( iuv.x + h0x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\\n\\t\\tvec2 p1 = ( vec2( iuv.x + h1x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\\n\\t\\tvec2 p2 = ( vec2( iuv.x + h0x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\\n\\t\\tvec2 p3 = ( vec2( iuv.x + h1x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\\n\\t\\treturn g0( fuv.y ) * ( g0x * textureLod( tex, p0, lod ) + g1x * textureLod( tex, p1, lod ) ) +\\n\\t\\t\\tg1( fuv.y ) * ( g0x * textureLod( tex, p2, lod ) + g1x * textureLod( tex, p3, lod ) );\\n\\t}\\n\\tvec4 textureBicubic( sampler2D sampler, vec2 uv, float lod ) {\\n\\t\\tvec2 fLodSize = vec2( textureSize( sampler, int( lod ) ) );\\n\\t\\tvec2 cLodSize = vec2( textureSize( sampler, int( lod + 1.0 ) ) );\\n\\t\\tvec2 fLodSizeInv = 1.0 / fLodSize;\\n\\t\\tvec2 cLodSizeInv = 1.0 / cLodSize;\\n\\t\\tvec4 fSample = bicubic( sampler, uv, vec4( fLodSizeInv, fLodSize ), floor( lod ) );\\n\\t\\tvec4 cSample = bicubic( sampler, uv, vec4( cLodSizeInv, cLodSize ), ceil( lod ) );\\n\\t\\treturn mix( fSample, cSample, fract( lod ) );\\n\\t}\\n\\tvec3 getVolumeTransmissionRay( const in vec3 n, const in vec3 v, const in float thickness, const in float ior, const in mat4 modelMatrix ) {\\n\\t\\tvec3 refractionVector = refract( - v, normalize( n ), 1.0 / ior );\\n\\t\\tvec3 modelScale;\\n\\t\\tmodelScale.x = length( vec3( modelMatrix[ 0 ].xyz ) );\\n\\t\\tmodelScale.y = length( vec3( modelMatrix[ 1 ].xyz ) );\\n\\t\\tmodelScale.z = length( vec3( modelMatrix[ 2 ].xyz ) );\\n\\t\\treturn normalize( refractionVector ) * thickness * modelScale;\\n\\t}\\n\\tfloat applyIorToRoughness( const in float roughness, const in float ior ) {\\n\\t\\treturn roughness * clamp( ior * 2.0 - 2.0, 0.0, 1.0 );\\n\\t}\\n\\tvec4 getTransmissionSample( const in vec2 fragCoord, const in float roughness, const in float ior ) {\\n\\t\\tfloat lod = log2( transmissionSamplerSize.x ) * applyIorToRoughness( roughness, ior );\\n\\t\\treturn textureBicubic( transmissionSamplerMap, fragCoord.xy, lod );\\n\\t}\\n\\tvec3 volumeAttenuation( const in float transmissionDistance, const in vec3 attenuationColor, const in float attenuationDistance ) {\\n\\t\\tif ( isinf( attenuationDistance ) ) {\\n\\t\\t\\treturn vec3( 1.0 );\\n\\t\\t} else {\\n\\t\\t\\tvec3 attenuationCoefficient = -log( attenuationColor ) / attenuationDistance;\\n\\t\\t\\tvec3 transmittance = exp( - attenuationCoefficient * transmissionDistance );\\t\\t\\treturn transmittance;\\n\\t\\t}\\n\\t}\\n\\tvec4 getIBLVolumeRefraction( const in vec3 n, const in vec3 v, const in float roughness, const in vec3 diffuseColor,\\n\\t\\tconst in vec3 specularColor, const in float specularF90, const in vec3 position, const in mat4 modelMatrix,\\n\\t\\tconst in mat4 viewMatrix, const in mat4 projMatrix, const in float dispersion, const in float ior, const in float thickness,\\n\\t\\tconst in vec3 attenuationColor, const in float attenuationDistance ) {\\n\\t\\tvec4 transmittedLight;\\n\\t\\tvec3 transmittance;\\n\\t\\t#ifdef USE_DISPERSION\\n\\t\\t\\tfloat halfSpread = ( ior - 1.0 ) * 0.025 * dispersion;\\n\\t\\t\\tvec3 iors = vec3( ior - halfSpread, ior, ior + halfSpread );\\n\\t\\t\\tfor ( int i = 0; i < 3; i ++ ) {\\n\\t\\t\\t\\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, iors[ i ], modelMatrix );\\n\\t\\t\\t\\tvec3 refractedRayExit = position + transmissionRay;\\n\\t\\t\\t\\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\\n\\t\\t\\t\\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\\n\\t\\t\\t\\trefractionCoords += 1.0;\\n\\t\\t\\t\\trefractionCoords /= 2.0;\\n\\t\\t\\t\\tvec4 transmissionSample = getTransmissionSample( refractionCoords, roughness, iors[ i ] );\\n\\t\\t\\t\\ttransmittedLight[ i ] = transmissionSample[ i ];\\n\\t\\t\\t\\ttransmittedLight.a += transmissionSample.a;\\n\\t\\t\\t\\ttransmittance[ i ] = diffuseColor[ i ] * volumeAttenuation( length( transmissionRay ), attenuationColor, attenuationDistance )[ i ];\\n\\t\\t\\t}\\n\\t\\t\\ttransmittedLight.a /= 3.0;\\n\\t\\t#else\\n\\t\\t\\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, ior, modelMatrix );\\n\\t\\t\\tvec3 refractedRayExit = position + transmissionRay;\\n\\t\\t\\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\\n\\t\\t\\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\\n\\t\\t\\trefractionCoords += 1.0;\\n\\t\\t\\trefractionCoords /= 2.0;\\n\\t\\t\\ttransmittedLight = getTransmissionSample( refractionCoords, roughness, ior );\\n\\t\\t\\ttransmittance = diffuseColor * volumeAttenuation( length( transmissionRay ), attenuationColor, attenuationDistance );\\n\\t\\t#endif\\n\\t\\tvec3 attenuatedColor = transmittance * transmittedLight.rgb;\\n\\t\\tvec3 F = EnvironmentBRDF( n, v, specularColor, specularF90, roughness );\\n\\t\\tfloat transmittanceFactor = ( transmittance.r + transmittance.g + transmittance.b ) / 3.0;\\n\\t\\treturn vec4( ( 1.0 - F ) * attenuatedColor, 1.0 - ( 1.0 - transmittedLight.a ) * transmittanceFactor );\\n\\t}\\n#endif\";\n\nvar uv_pars_fragment = \"#if defined( USE_UV ) || defined( USE_ANISOTROPY )\\n\\tvarying vec2 vUv;\\n#endif\\n#ifdef USE_MAP\\n\\tvarying vec2 vMapUv;\\n#endif\\n#ifdef USE_ALPHAMAP\\n\\tvarying vec2 vAlphaMapUv;\\n#endif\\n#ifdef USE_LIGHTMAP\\n\\tvarying vec2 vLightMapUv;\\n#endif\\n#ifdef USE_AOMAP\\n\\tvarying vec2 vAoMapUv;\\n#endif\\n#ifdef USE_BUMPMAP\\n\\tvarying vec2 vBumpMapUv;\\n#endif\\n#ifdef USE_NORMALMAP\\n\\tvarying vec2 vNormalMapUv;\\n#endif\\n#ifdef USE_EMISSIVEMAP\\n\\tvarying vec2 vEmissiveMapUv;\\n#endif\\n#ifdef USE_METALNESSMAP\\n\\tvarying vec2 vMetalnessMapUv;\\n#endif\\n#ifdef USE_ROUGHNESSMAP\\n\\tvarying vec2 vRoughnessMapUv;\\n#endif\\n#ifdef USE_ANISOTROPYMAP\\n\\tvarying vec2 vAnisotropyMapUv;\\n#endif\\n#ifdef USE_CLEARCOATMAP\\n\\tvarying vec2 vClearcoatMapUv;\\n#endif\\n#ifdef USE_CLEARCOAT_NORMALMAP\\n\\tvarying vec2 vClearcoatNormalMapUv;\\n#endif\\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\\n\\tvarying vec2 vClearcoatRoughnessMapUv;\\n#endif\\n#ifdef USE_IRIDESCENCEMAP\\n\\tvarying vec2 vIridescenceMapUv;\\n#endif\\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\\n\\tvarying vec2 vIridescenceThicknessMapUv;\\n#endif\\n#ifdef USE_SHEEN_COLORMAP\\n\\tvarying vec2 vSheenColorMapUv;\\n#endif\\n#ifdef USE_SHEEN_ROUGHNESSMAP\\n\\tvarying vec2 vSheenRoughnessMapUv;\\n#endif\\n#ifdef USE_SPECULARMAP\\n\\tvarying vec2 vSpecularMapUv;\\n#endif\\n#ifdef USE_SPECULAR_COLORMAP\\n\\tvarying vec2 vSpecularColorMapUv;\\n#endif\\n#ifdef USE_SPECULAR_INTENSITYMAP\\n\\tvarying vec2 vSpecularIntensityMapUv;\\n#endif\\n#ifdef USE_TRANSMISSIONMAP\\n\\tuniform mat3 transmissionMapTransform;\\n\\tvarying vec2 vTransmissionMapUv;\\n#endif\\n#ifdef USE_THICKNESSMAP\\n\\tuniform mat3 thicknessMapTransform;\\n\\tvarying vec2 vThicknessMapUv;\\n#endif\";\n\nvar uv_pars_vertex = \"#if defined( USE_UV ) || defined( USE_ANISOTROPY )\\n\\tvarying vec2 vUv;\\n#endif\\n#ifdef USE_MAP\\n\\tuniform mat3 mapTransform;\\n\\tvarying vec2 vMapUv;\\n#endif\\n#ifdef USE_ALPHAMAP\\n\\tuniform mat3 alphaMapTransform;\\n\\tvarying vec2 vAlphaMapUv;\\n#endif\\n#ifdef USE_LIGHTMAP\\n\\tuniform mat3 lightMapTransform;\\n\\tvarying vec2 vLightMapUv;\\n#endif\\n#ifdef USE_AOMAP\\n\\tuniform mat3 aoMapTransform;\\n\\tvarying vec2 vAoMapUv;\\n#endif\\n#ifdef USE_BUMPMAP\\n\\tuniform mat3 bumpMapTransform;\\n\\tvarying vec2 vBumpMapUv;\\n#endif\\n#ifdef USE_NORMALMAP\\n\\tuniform mat3 normalMapTransform;\\n\\tvarying vec2 vNormalMapUv;\\n#endif\\n#ifdef USE_DISPLACEMENTMAP\\n\\tuniform mat3 displacementMapTransform;\\n\\tvarying vec2 vDisplacementMapUv;\\n#endif\\n#ifdef USE_EMISSIVEMAP\\n\\tuniform mat3 emissiveMapTransform;\\n\\tvarying vec2 vEmissiveMapUv;\\n#endif\\n#ifdef USE_METALNESSMAP\\n\\tuniform mat3 metalnessMapTransform;\\n\\tvarying vec2 vMetalnessMapUv;\\n#endif\\n#ifdef USE_ROUGHNESSMAP\\n\\tuniform mat3 roughnessMapTransform;\\n\\tvarying vec2 vRoughnessMapUv;\\n#endif\\n#ifdef USE_ANISOTROPYMAP\\n\\tuniform mat3 anisotropyMapTransform;\\n\\tvarying vec2 vAnisotropyMapUv;\\n#endif\\n#ifdef USE_CLEARCOATMAP\\n\\tuniform mat3 clearcoatMapTransform;\\n\\tvarying vec2 vClearcoatMapUv;\\n#endif\\n#ifdef USE_CLEARCOAT_NORMALMAP\\n\\tuniform mat3 clearcoatNormalMapTransform;\\n\\tvarying vec2 vClearcoatNormalMapUv;\\n#endif\\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\\n\\tuniform mat3 clearcoatRoughnessMapTransform;\\n\\tvarying vec2 vClearcoatRoughnessMapUv;\\n#endif\\n#ifdef USE_SHEEN_COLORMAP\\n\\tuniform mat3 sheenColorMapTransform;\\n\\tvarying vec2 vSheenColorMapUv;\\n#endif\\n#ifdef USE_SHEEN_ROUGHNESSMAP\\n\\tuniform mat3 sheenRoughnessMapTransform;\\n\\tvarying vec2 vSheenRoughnessMapUv;\\n#endif\\n#ifdef USE_IRIDESCENCEMAP\\n\\tuniform mat3 iridescenceMapTransform;\\n\\tvarying vec2 vIridescenceMapUv;\\n#endif\\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\\n\\tuniform mat3 iridescenceThicknessMapTransform;\\n\\tvarying vec2 vIridescenceThicknessMapUv;\\n#endif\\n#ifdef USE_SPECULARMAP\\n\\tuniform mat3 specularMapTransform;\\n\\tvarying vec2 vSpecularMapUv;\\n#endif\\n#ifdef USE_SPECULAR_COLORMAP\\n\\tuniform mat3 specularColorMapTransform;\\n\\tvarying vec2 vSpecularColorMapUv;\\n#endif\\n#ifdef USE_SPECULAR_INTENSITYMAP\\n\\tuniform mat3 specularIntensityMapTransform;\\n\\tvarying vec2 vSpecularIntensityMapUv;\\n#endif\\n#ifdef USE_TRANSMISSIONMAP\\n\\tuniform mat3 transmissionMapTransform;\\n\\tvarying vec2 vTransmissionMapUv;\\n#endif\\n#ifdef USE_THICKNESSMAP\\n\\tuniform mat3 thicknessMapTransform;\\n\\tvarying vec2 vThicknessMapUv;\\n#endif\";\n\nvar uv_vertex = \"#if defined( USE_UV ) || defined( USE_ANISOTROPY )\\n\\tvUv = vec3( uv, 1 ).xy;\\n#endif\\n#ifdef USE_MAP\\n\\tvMapUv = ( mapTransform * vec3( MAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_ALPHAMAP\\n\\tvAlphaMapUv = ( alphaMapTransform * vec3( ALPHAMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_LIGHTMAP\\n\\tvLightMapUv = ( lightMapTransform * vec3( LIGHTMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_AOMAP\\n\\tvAoMapUv = ( aoMapTransform * vec3( AOMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_BUMPMAP\\n\\tvBumpMapUv = ( bumpMapTransform * vec3( BUMPMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_NORMALMAP\\n\\tvNormalMapUv = ( normalMapTransform * vec3( NORMALMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_DISPLACEMENTMAP\\n\\tvDisplacementMapUv = ( displacementMapTransform * vec3( DISPLACEMENTMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_EMISSIVEMAP\\n\\tvEmissiveMapUv = ( emissiveMapTransform * vec3( EMISSIVEMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_METALNESSMAP\\n\\tvMetalnessMapUv = ( metalnessMapTransform * vec3( METALNESSMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_ROUGHNESSMAP\\n\\tvRoughnessMapUv = ( roughnessMapTransform * vec3( ROUGHNESSMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_ANISOTROPYMAP\\n\\tvAnisotropyMapUv = ( anisotropyMapTransform * vec3( ANISOTROPYMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_CLEARCOATMAP\\n\\tvClearcoatMapUv = ( clearcoatMapTransform * vec3( CLEARCOATMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_CLEARCOAT_NORMALMAP\\n\\tvClearcoatNormalMapUv = ( clearcoatNormalMapTransform * vec3( CLEARCOAT_NORMALMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\\n\\tvClearcoatRoughnessMapUv = ( clearcoatRoughnessMapTransform * vec3( CLEARCOAT_ROUGHNESSMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_IRIDESCENCEMAP\\n\\tvIridescenceMapUv = ( iridescenceMapTransform * vec3( IRIDESCENCEMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\\n\\tvIridescenceThicknessMapUv = ( iridescenceThicknessMapTransform * vec3( IRIDESCENCE_THICKNESSMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_SHEEN_COLORMAP\\n\\tvSheenColorMapUv = ( sheenColorMapTransform * vec3( SHEEN_COLORMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_SHEEN_ROUGHNESSMAP\\n\\tvSheenRoughnessMapUv = ( sheenRoughnessMapTransform * vec3( SHEEN_ROUGHNESSMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_SPECULARMAP\\n\\tvSpecularMapUv = ( specularMapTransform * vec3( SPECULARMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_SPECULAR_COLORMAP\\n\\tvSpecularColorMapUv = ( specularColorMapTransform * vec3( SPECULAR_COLORMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_SPECULAR_INTENSITYMAP\\n\\tvSpecularIntensityMapUv = ( specularIntensityMapTransform * vec3( SPECULAR_INTENSITYMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_TRANSMISSIONMAP\\n\\tvTransmissionMapUv = ( transmissionMapTransform * vec3( TRANSMISSIONMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_THICKNESSMAP\\n\\tvThicknessMapUv = ( thicknessMapTransform * vec3( THICKNESSMAP_UV, 1 ) ).xy;\\n#endif\";\n\nvar worldpos_vertex = \"#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP ) || defined ( USE_TRANSMISSION ) || NUM_SPOT_LIGHT_COORDS > 0\\n\\tvec4 worldPosition = vec4( transformed, 1.0 );\\n\\t#ifdef USE_BATCHING\\n\\t\\tworldPosition = batchingMatrix * worldPosition;\\n\\t#endif\\n\\t#ifdef USE_INSTANCING\\n\\t\\tworldPosition = instanceMatrix * worldPosition;\\n\\t#endif\\n\\tworldPosition = modelMatrix * worldPosition;\\n#endif\";\n\nconst vertex$h = \"varying vec2 vUv;\\nuniform mat3 uvTransform;\\nvoid main() {\\n\\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\\n\\tgl_Position = vec4( position.xy, 1.0, 1.0 );\\n}\";\n\nconst fragment$h = \"uniform sampler2D t2D;\\nuniform float backgroundIntensity;\\nvarying vec2 vUv;\\nvoid main() {\\n\\tvec4 texColor = texture2D( t2D, vUv );\\n\\t#ifdef DECODE_VIDEO_TEXTURE\\n\\t\\ttexColor = vec4( mix( pow( texColor.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), texColor.rgb * 0.0773993808, vec3( lessThanEqual( texColor.rgb, vec3( 0.04045 ) ) ) ), texColor.w );\\n\\t#endif\\n\\ttexColor.rgb *= backgroundIntensity;\\n\\tgl_FragColor = texColor;\\n\\t#include <tonemapping_fragment>\\n\\t#include <colorspace_fragment>\\n}\";\n\nconst vertex$g = \"varying vec3 vWorldDirection;\\n#include <common>\\nvoid main() {\\n\\tvWorldDirection = transformDirection( position, modelMatrix );\\n\\t#include <begin_vertex>\\n\\t#include <project_vertex>\\n\\tgl_Position.z = gl_Position.w;\\n}\";\n\nconst fragment$g = \"#ifdef ENVMAP_TYPE_CUBE\\n\\tuniform samplerCube envMap;\\n#elif defined( ENVMAP_TYPE_CUBE_UV )\\n\\tuniform sampler2D envMap;\\n#endif\\nuniform float flipEnvMap;\\nuniform float backgroundBlurriness;\\nuniform float backgroundIntensity;\\nuniform mat3 backgroundRotation;\\nvarying vec3 vWorldDirection;\\n#include <cube_uv_reflection_fragment>\\nvoid main() {\\n\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\tvec4 texColor = textureCube( envMap, backgroundRotation * vec3( flipEnvMap * vWorldDirection.x, vWorldDirection.yz ) );\\n\\t#elif defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\tvec4 texColor = textureCubeUV( envMap, backgroundRotation * vWorldDirection, backgroundBlurriness );\\n\\t#else\\n\\t\\tvec4 texColor = vec4( 0.0, 0.0, 0.0, 1.0 );\\n\\t#endif\\n\\ttexColor.rgb *= backgroundIntensity;\\n\\tgl_FragColor = texColor;\\n\\t#include <tonemapping_fragment>\\n\\t#include <colorspace_fragment>\\n}\";\n\nconst vertex$f = \"varying vec3 vWorldDirection;\\n#include <common>\\nvoid main() {\\n\\tvWorldDirection = transformDirection( position, modelMatrix );\\n\\t#include <begin_vertex>\\n\\t#include <project_vertex>\\n\\tgl_Position.z = gl_Position.w;\\n}\";\n\nconst fragment$f = \"uniform samplerCube tCube;\\nuniform float tFlip;\\nuniform float opacity;\\nvarying vec3 vWorldDirection;\\nvoid main() {\\n\\tvec4 texColor = textureCube( tCube, vec3( tFlip * vWorldDirection.x, vWorldDirection.yz ) );\\n\\tgl_FragColor = texColor;\\n\\tgl_FragColor.a *= opacity;\\n\\t#include <tonemapping_fragment>\\n\\t#include <colorspace_fragment>\\n}\";\n\nconst vertex$e = \"#include <common>\\n#include <batching_pars_vertex>\\n#include <uv_pars_vertex>\\n#include <displacementmap_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvarying vec2 vHighPrecisionZW;\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <batching_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#include <morphinstance_vertex>\\n\\t#ifdef USE_DISPLACEMENTMAP\\n\\t\\t#include <beginnormal_vertex>\\n\\t\\t#include <morphnormal_vertex>\\n\\t\\t#include <skinnormal_vertex>\\n\\t#endif\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <displacementmap_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\tvHighPrecisionZW = gl_Position.zw;\\n}\";\n\nconst fragment$e = \"#if DEPTH_PACKING == 3200\\n\\tuniform float opacity;\\n#endif\\n#include <common>\\n#include <packing>\\n#include <uv_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <alphatest_pars_fragment>\\n#include <alphahash_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvarying vec2 vHighPrecisionZW;\\nvoid main() {\\n\\tvec4 diffuseColor = vec4( 1.0 );\\n\\t#include <clipping_planes_fragment>\\n\\t#if DEPTH_PACKING == 3200\\n\\t\\tdiffuseColor.a = opacity;\\n\\t#endif\\n\\t#include <map_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <alphahash_fragment>\\n\\t#include <logdepthbuf_fragment>\\n\\t#ifdef USE_REVERSED_DEPTH_BUFFER\\n\\t\\tfloat fragCoordZ = vHighPrecisionZW[ 0 ] / vHighPrecisionZW[ 1 ];\\n\\t#else\\n\\t\\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[ 0 ] / vHighPrecisionZW[ 1 ] + 0.5;\\n\\t#endif\\n\\t#if DEPTH_PACKING == 3200\\n\\t\\tgl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );\\n\\t#elif DEPTH_PACKING == 3201\\n\\t\\tgl_FragColor = packDepthToRGBA( fragCoordZ );\\n\\t#elif DEPTH_PACKING == 3202\\n\\t\\tgl_FragColor = vec4( packDepthToRGB( fragCoordZ ), 1.0 );\\n\\t#elif DEPTH_PACKING == 3203\\n\\t\\tgl_FragColor = vec4( packDepthToRG( fragCoordZ ), 0.0, 1.0 );\\n\\t#endif\\n}\";\n\nconst vertex$d = \"#define DISTANCE\\nvarying vec3 vWorldPosition;\\n#include <common>\\n#include <batching_pars_vertex>\\n#include <uv_pars_vertex>\\n#include <displacementmap_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <batching_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#include <morphinstance_vertex>\\n\\t#ifdef USE_DISPLACEMENTMAP\\n\\t\\t#include <beginnormal_vertex>\\n\\t\\t#include <morphnormal_vertex>\\n\\t\\t#include <skinnormal_vertex>\\n\\t#endif\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <displacementmap_vertex>\\n\\t#include <project_vertex>\\n\\t#include <worldpos_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\tvWorldPosition = worldPosition.xyz;\\n}\";\n\nconst fragment$d = \"#define DISTANCE\\nuniform vec3 referencePosition;\\nuniform float nearDistance;\\nuniform float farDistance;\\nvarying vec3 vWorldPosition;\\n#include <common>\\n#include <packing>\\n#include <uv_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <alphatest_pars_fragment>\\n#include <alphahash_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main () {\\n\\tvec4 diffuseColor = vec4( 1.0 );\\n\\t#include <clipping_planes_fragment>\\n\\t#include <map_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <alphahash_fragment>\\n\\tfloat dist = length( vWorldPosition - referencePosition );\\n\\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\\n\\tdist = saturate( dist );\\n\\tgl_FragColor = packDepthToRGBA( dist );\\n}\";\n\nconst vertex$c = \"varying vec3 vWorldDirection;\\n#include <common>\\nvoid main() {\\n\\tvWorldDirection = transformDirection( position, modelMatrix );\\n\\t#include <begin_vertex>\\n\\t#include <project_vertex>\\n}\";\n\nconst fragment$c = \"uniform sampler2D tEquirect;\\nvarying vec3 vWorldDirection;\\n#include <common>\\nvoid main() {\\n\\tvec3 direction = normalize( vWorldDirection );\\n\\tvec2 sampleUV = equirectUv( direction );\\n\\tgl_FragColor = texture2D( tEquirect, sampleUV );\\n\\t#include <tonemapping_fragment>\\n\\t#include <colorspace_fragment>\\n}\";\n\nconst vertex$b = \"uniform float scale;\\nattribute float lineDistance;\\nvarying float vLineDistance;\\n#include <common>\\n#include <uv_pars_vertex>\\n#include <color_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\tvLineDistance = scale * lineDistance;\\n\\t#include <uv_vertex>\\n\\t#include <color_vertex>\\n\\t#include <morphinstance_vertex>\\n\\t#include <morphcolor_vertex>\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\t#include <fog_vertex>\\n}\";\n\nconst fragment$b = \"uniform vec3 diffuse;\\nuniform float opacity;\\nuniform float dashSize;\\nuniform float totalSize;\\nvarying float vLineDistance;\\n#include <common>\\n#include <color_pars_fragment>\\n#include <uv_pars_fragment>\\n#include <map_pars_fragment>\\n#include <fog_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include <clipping_planes_fragment>\\n\\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\\n\\t\\tdiscard;\\n\\t}\\n\\tvec3 outgoingLight = vec3( 0.0 );\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <map_fragment>\\n\\t#include <color_fragment>\\n\\toutgoingLight = diffuseColor.rgb;\\n\\t#include <opaque_fragment>\\n\\t#include <tonemapping_fragment>\\n\\t#include <colorspace_fragment>\\n\\t#include <fog_fragment>\\n\\t#include <premultiplied_alpha_fragment>\\n}\";\n\nconst vertex$a = \"#include <common>\\n#include <batching_pars_vertex>\\n#include <uv_pars_vertex>\\n#include <envmap_pars_vertex>\\n#include <color_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <color_vertex>\\n\\t#include <morphinstance_vertex>\\n\\t#include <morphcolor_vertex>\\n\\t#include <batching_vertex>\\n\\t#if defined ( USE_ENVMAP ) || defined ( USE_SKINNING )\\n\\t\\t#include <beginnormal_vertex>\\n\\t\\t#include <morphnormal_vertex>\\n\\t\\t#include <skinbase_vertex>\\n\\t\\t#include <skinnormal_vertex>\\n\\t\\t#include <defaultnormal_vertex>\\n\\t#endif\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\t#include <worldpos_vertex>\\n\\t#include <envmap_vertex>\\n\\t#include <fog_vertex>\\n}\";\n\nconst fragment$a = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include <common>\\n#include <dithering_pars_fragment>\\n#include <color_pars_fragment>\\n#include <uv_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <alphatest_pars_fragment>\\n#include <alphahash_pars_fragment>\\n#include <aomap_pars_fragment>\\n#include <lightmap_pars_fragment>\\n#include <envmap_common_pars_fragment>\\n#include <envmap_pars_fragment>\\n#include <fog_pars_fragment>\\n#include <specularmap_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include <clipping_planes_fragment>\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <map_fragment>\\n\\t#include <color_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <alphahash_fragment>\\n\\t#include <specularmap_fragment>\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\t#ifdef USE_LIGHTMAP\\n\\t\\tvec4 lightMapTexel = texture2D( lightMap, vLightMapUv );\\n\\t\\treflectedLight.indirectDiffuse += lightMapTexel.rgb * lightMapIntensity * RECIPROCAL_PI;\\n\\t#else\\n\\t\\treflectedLight.indirectDiffuse += vec3( 1.0 );\\n\\t#endif\\n\\t#include <aomap_fragment>\\n\\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\\n\\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\\n\\t#include <envmap_fragment>\\n\\t#include <opaque_fragment>\\n\\t#include <tonemapping_fragment>\\n\\t#include <colorspace_fragment>\\n\\t#include <fog_fragment>\\n\\t#include <premultiplied_alpha_fragment>\\n\\t#include <dithering_fragment>\\n}\";\n\nconst vertex$9 = \"#define LAMBERT\\nvarying vec3 vViewPosition;\\n#include <common>\\n#include <batching_pars_vertex>\\n#include <uv_pars_vertex>\\n#include <displacementmap_pars_vertex>\\n#include <envmap_pars_vertex>\\n#include <color_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <normal_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <shadowmap_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <color_vertex>\\n\\t#include <morphinstance_vertex>\\n\\t#include <morphcolor_vertex>\\n\\t#include <batching_vertex>\\n\\t#include <beginnormal_vertex>\\n\\t#include <morphnormal_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#include <skinnormal_vertex>\\n\\t#include <defaultnormal_vertex>\\n\\t#include <normal_vertex>\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <displacementmap_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include <worldpos_vertex>\\n\\t#include <envmap_vertex>\\n\\t#include <shadowmap_vertex>\\n\\t#include <fog_vertex>\\n}\";\n\nconst fragment$9 = \"#define LAMBERT\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float opacity;\\n#include <common>\\n#include <packing>\\n#include <dithering_pars_fragment>\\n#include <color_pars_fragment>\\n#include <uv_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <alphatest_pars_fragment>\\n#include <alphahash_pars_fragment>\\n#include <aomap_pars_fragment>\\n#include <lightmap_pars_fragment>\\n#include <emissivemap_pars_fragment>\\n#include <envmap_common_pars_fragment>\\n#include <envmap_pars_fragment>\\n#include <fog_pars_fragment>\\n#include <bsdfs>\\n#include <lights_pars_begin>\\n#include <normal_pars_fragment>\\n#include <lights_lambert_pars_fragment>\\n#include <shadowmap_pars_fragment>\\n#include <bumpmap_pars_fragment>\\n#include <normalmap_pars_fragment>\\n#include <specularmap_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include <clipping_planes_fragment>\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <map_fragment>\\n\\t#include <color_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <alphahash_fragment>\\n\\t#include <specularmap_fragment>\\n\\t#include <normal_fragment_begin>\\n\\t#include <normal_fragment_maps>\\n\\t#include <emissivemap_fragment>\\n\\t#include <lights_lambert_fragment>\\n\\t#include <lights_fragment_begin>\\n\\t#include <lights_fragment_maps>\\n\\t#include <lights_fragment_end>\\n\\t#include <aomap_fragment>\\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\\n\\t#include <envmap_fragment>\\n\\t#include <opaque_fragment>\\n\\t#include <tonemapping_fragment>\\n\\t#include <colorspace_fragment>\\n\\t#include <fog_fragment>\\n\\t#include <premultiplied_alpha_fragment>\\n\\t#include <dithering_fragment>\\n}\";\n\nconst vertex$8 = \"#define MATCAP\\nvarying vec3 vViewPosition;\\n#include <common>\\n#include <batching_pars_vertex>\\n#include <uv_pars_vertex>\\n#include <color_pars_vertex>\\n#include <displacementmap_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <normal_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <color_vertex>\\n\\t#include <morphinstance_vertex>\\n\\t#include <morphcolor_vertex>\\n\\t#include <batching_vertex>\\n\\t#include <beginnormal_vertex>\\n\\t#include <morphnormal_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#include <skinnormal_vertex>\\n\\t#include <defaultnormal_vertex>\\n\\t#include <normal_vertex>\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <displacementmap_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\t#include <fog_vertex>\\n\\tvViewPosition = - mvPosition.xyz;\\n}\";\n\nconst fragment$8 = \"#define MATCAP\\nuniform vec3 diffuse;\\nuniform float opacity;\\nuniform sampler2D matcap;\\nvarying vec3 vViewPosition;\\n#include <common>\\n#include <dithering_pars_fragment>\\n#include <color_pars_fragment>\\n#include <uv_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <alphatest_pars_fragment>\\n#include <alphahash_pars_fragment>\\n#include <fog_pars_fragment>\\n#include <normal_pars_fragment>\\n#include <bumpmap_pars_fragment>\\n#include <normalmap_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include <clipping_planes_fragment>\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <map_fragment>\\n\\t#include <color_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <alphahash_fragment>\\n\\t#include <normal_fragment_begin>\\n\\t#include <normal_fragment_maps>\\n\\tvec3 viewDir = normalize( vViewPosition );\\n\\tvec3 x = normalize( vec3( viewDir.z, 0.0, - viewDir.x ) );\\n\\tvec3 y = cross( viewDir, x );\\n\\tvec2 uv = vec2( dot( x, normal ), dot( y, normal ) ) * 0.495 + 0.5;\\n\\t#ifdef USE_MATCAP\\n\\t\\tvec4 matcapColor = texture2D( matcap, uv );\\n\\t#else\\n\\t\\tvec4 matcapColor = vec4( vec3( mix( 0.2, 0.8, uv.y ) ), 1.0 );\\n\\t#endif\\n\\tvec3 outgoingLight = diffuseColor.rgb * matcapColor.rgb;\\n\\t#include <opaque_fragment>\\n\\t#include <tonemapping_fragment>\\n\\t#include <colorspace_fragment>\\n\\t#include <fog_fragment>\\n\\t#include <premultiplied_alpha_fragment>\\n\\t#include <dithering_fragment>\\n}\";\n\nconst vertex$7 = \"#define NORMAL\\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\\n\\tvarying vec3 vViewPosition;\\n#endif\\n#include <common>\\n#include <batching_pars_vertex>\\n#include <uv_pars_vertex>\\n#include <displacementmap_pars_vertex>\\n#include <normal_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <batching_vertex>\\n\\t#include <beginnormal_vertex>\\n\\t#include <morphinstance_vertex>\\n\\t#include <morphnormal_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#include <skinnormal_vertex>\\n\\t#include <defaultnormal_vertex>\\n\\t#include <normal_vertex>\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <displacementmap_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\\n\\tvViewPosition = - mvPosition.xyz;\\n#endif\\n}\";\n\nconst fragment$7 = \"#define NORMAL\\nuniform float opacity;\\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\\n\\tvarying vec3 vViewPosition;\\n#endif\\n#include <packing>\\n#include <uv_pars_fragment>\\n#include <normal_pars_fragment>\\n#include <bumpmap_pars_fragment>\\n#include <normalmap_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\tvec4 diffuseColor = vec4( 0.0, 0.0, 0.0, opacity );\\n\\t#include <clipping_planes_fragment>\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <normal_fragment_begin>\\n\\t#include <normal_fragment_maps>\\n\\tgl_FragColor = vec4( packNormalToRGB( normal ), diffuseColor.a );\\n\\t#ifdef OPAQUE\\n\\t\\tgl_FragColor.a = 1.0;\\n\\t#endif\\n}\";\n\nconst vertex$6 = \"#define PHONG\\nvarying vec3 vViewPosition;\\n#include <common>\\n#include <batching_pars_vertex>\\n#include <uv_pars_vertex>\\n#include <displacementmap_pars_vertex>\\n#include <envmap_pars_vertex>\\n#include <color_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <normal_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <shadowmap_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <color_vertex>\\n\\t#include <morphcolor_vertex>\\n\\t#include <batching_vertex>\\n\\t#include <beginnormal_vertex>\\n\\t#include <morphinstance_vertex>\\n\\t#include <morphnormal_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#include <skinnormal_vertex>\\n\\t#include <defaultnormal_vertex>\\n\\t#include <normal_vertex>\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <displacementmap_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include <worldpos_vertex>\\n\\t#include <envmap_vertex>\\n\\t#include <shadowmap_vertex>\\n\\t#include <fog_vertex>\\n}\";\n\nconst fragment$6 = \"#define PHONG\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform vec3 specular;\\nuniform float shininess;\\nuniform float opacity;\\n#include <common>\\n#include <packing>\\n#include <dithering_pars_fragment>\\n#include <color_pars_fragment>\\n#include <uv_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <alphatest_pars_fragment>\\n#include <alphahash_pars_fragment>\\n#include <aomap_pars_fragment>\\n#include <lightmap_pars_fragment>\\n#include <emissivemap_pars_fragment>\\n#include <envmap_common_pars_fragment>\\n#include <envmap_pars_fragment>\\n#include <fog_pars_fragment>\\n#include <bsdfs>\\n#include <lights_pars_begin>\\n#include <normal_pars_fragment>\\n#include <lights_phong_pars_fragment>\\n#include <shadowmap_pars_fragment>\\n#include <bumpmap_pars_fragment>\\n#include <normalmap_pars_fragment>\\n#include <specularmap_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include <clipping_planes_fragment>\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <map_fragment>\\n\\t#include <color_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <alphahash_fragment>\\n\\t#include <specularmap_fragment>\\n\\t#include <normal_fragment_begin>\\n\\t#include <normal_fragment_maps>\\n\\t#include <emissivemap_fragment>\\n\\t#include <lights_phong_fragment>\\n\\t#include <lights_fragment_begin>\\n\\t#include <lights_fragment_maps>\\n\\t#include <lights_fragment_end>\\n\\t#include <aomap_fragment>\\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\\n\\t#include <envmap_fragment>\\n\\t#include <opaque_fragment>\\n\\t#include <tonemapping_fragment>\\n\\t#include <colorspace_fragment>\\n\\t#include <fog_fragment>\\n\\t#include <premultiplied_alpha_fragment>\\n\\t#include <dithering_fragment>\\n}\";\n\nconst vertex$5 = \"#define STANDARD\\nvarying vec3 vViewPosition;\\n#ifdef USE_TRANSMISSION\\n\\tvarying vec3 vWorldPosition;\\n#endif\\n#include <common>\\n#include <batching_pars_vertex>\\n#include <uv_pars_vertex>\\n#include <displacementmap_pars_vertex>\\n#include <color_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <normal_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <shadowmap_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <color_vertex>\\n\\t#include <morphinstance_vertex>\\n\\t#include <morphcolor_vertex>\\n\\t#include <batching_vertex>\\n\\t#include <beginnormal_vertex>\\n\\t#include <morphnormal_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#include <skinnormal_vertex>\\n\\t#include <defaultnormal_vertex>\\n\\t#include <normal_vertex>\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <displacementmap_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include <worldpos_vertex>\\n\\t#include <shadowmap_vertex>\\n\\t#include <fog_vertex>\\n#ifdef USE_TRANSMISSION\\n\\tvWorldPosition = worldPosition.xyz;\\n#endif\\n}\";\n\nconst fragment$5 = \"#define STANDARD\\n#ifdef PHYSICAL\\n\\t#define IOR\\n\\t#define USE_SPECULAR\\n#endif\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float roughness;\\nuniform float metalness;\\nuniform float opacity;\\n#ifdef IOR\\n\\tuniform float ior;\\n#endif\\n#ifdef USE_SPECULAR\\n\\tuniform float specularIntensity;\\n\\tuniform vec3 specularColor;\\n\\t#ifdef USE_SPECULAR_COLORMAP\\n\\t\\tuniform sampler2D specularColorMap;\\n\\t#endif\\n\\t#ifdef USE_SPECULAR_INTENSITYMAP\\n\\t\\tuniform sampler2D specularIntensityMap;\\n\\t#endif\\n#endif\\n#ifdef USE_CLEARCOAT\\n\\tuniform float clearcoat;\\n\\tuniform float clearcoatRoughness;\\n#endif\\n#ifdef USE_DISPERSION\\n\\tuniform float dispersion;\\n#endif\\n#ifdef USE_IRIDESCENCE\\n\\tuniform float iridescence;\\n\\tuniform float iridescenceIOR;\\n\\tuniform float iridescenceThicknessMinimum;\\n\\tuniform float iridescenceThicknessMaximum;\\n#endif\\n#ifdef USE_SHEEN\\n\\tuniform vec3 sheenColor;\\n\\tuniform float sheenRoughness;\\n\\t#ifdef USE_SHEEN_COLORMAP\\n\\t\\tuniform sampler2D sheenColorMap;\\n\\t#endif\\n\\t#ifdef USE_SHEEN_ROUGHNESSMAP\\n\\t\\tuniform sampler2D sheenRoughnessMap;\\n\\t#endif\\n#endif\\n#ifdef USE_ANISOTROPY\\n\\tuniform vec2 anisotropyVector;\\n\\t#ifdef USE_ANISOTROPYMAP\\n\\t\\tuniform sampler2D anisotropyMap;\\n\\t#endif\\n#endif\\nvarying vec3 vViewPosition;\\n#include <common>\\n#include <packing>\\n#include <dithering_pars_fragment>\\n#include <color_pars_fragment>\\n#include <uv_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <alphatest_pars_fragment>\\n#include <alphahash_pars_fragment>\\n#include <aomap_pars_fragment>\\n#include <lightmap_pars_fragment>\\n#include <emissivemap_pars_fragment>\\n#include <iridescence_fragment>\\n#include <cube_uv_reflection_fragment>\\n#include <envmap_common_pars_fragment>\\n#include <envmap_physical_pars_fragment>\\n#include <fog_pars_fragment>\\n#include <lights_pars_begin>\\n#include <normal_pars_fragment>\\n#include <lights_physical_pars_fragment>\\n#include <transmission_pars_fragment>\\n#include <shadowmap_pars_fragment>\\n#include <bumpmap_pars_fragment>\\n#include <normalmap_pars_fragment>\\n#include <clearcoat_pars_fragment>\\n#include <iridescence_pars_fragment>\\n#include <roughnessmap_pars_fragment>\\n#include <metalnessmap_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include <clipping_planes_fragment>\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <map_fragment>\\n\\t#include <color_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <alphahash_fragment>\\n\\t#include <roughnessmap_fragment>\\n\\t#include <metalnessmap_fragment>\\n\\t#include <normal_fragment_begin>\\n\\t#include <normal_fragment_maps>\\n\\t#include <clearcoat_normal_fragment_begin>\\n\\t#include <clearcoat_normal_fragment_maps>\\n\\t#include <emissivemap_fragment>\\n\\t#include <lights_physical_fragment>\\n\\t#include <lights_fragment_begin>\\n\\t#include <lights_fragment_maps>\\n\\t#include <lights_fragment_end>\\n\\t#include <aomap_fragment>\\n\\tvec3 totalDiffuse = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse;\\n\\tvec3 totalSpecular = reflectedLight.directSpecular + reflectedLight.indirectSpecular;\\n\\t#include <transmission_fragment>\\n\\tvec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance;\\n\\t#ifdef USE_SHEEN\\n\\t\\tfloat sheenEnergyComp = 1.0 - 0.157 * max3( material.sheenColor );\\n\\t\\toutgoingLight = outgoingLight * sheenEnergyComp + sheenSpecularDirect + sheenSpecularIndirect;\\n\\t#endif\\n\\t#ifdef USE_CLEARCOAT\\n\\t\\tfloat dotNVcc = saturate( dot( geometryClearcoatNormal, geometryViewDir ) );\\n\\t\\tvec3 Fcc = F_Schlick( material.clearcoatF0, material.clearcoatF90, dotNVcc );\\n\\t\\toutgoingLight = outgoingLight * ( 1.0 - material.clearcoat * Fcc ) + ( clearcoatSpecularDirect + clearcoatSpecularIndirect ) * material.clearcoat;\\n\\t#endif\\n\\t#include <opaque_fragment>\\n\\t#include <tonemapping_fragment>\\n\\t#include <colorspace_fragment>\\n\\t#include <fog_fragment>\\n\\t#include <premultiplied_alpha_fragment>\\n\\t#include <dithering_fragment>\\n}\";\n\nconst vertex$4 = \"#define TOON\\nvarying vec3 vViewPosition;\\n#include <common>\\n#include <batching_pars_vertex>\\n#include <uv_pars_vertex>\\n#include <displacementmap_pars_vertex>\\n#include <color_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <normal_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <shadowmap_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <color_vertex>\\n\\t#include <morphinstance_vertex>\\n\\t#include <morphcolor_vertex>\\n\\t#include <batching_vertex>\\n\\t#include <beginnormal_vertex>\\n\\t#include <morphnormal_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#include <skinnormal_vertex>\\n\\t#include <defaultnormal_vertex>\\n\\t#include <normal_vertex>\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <displacementmap_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include <worldpos_vertex>\\n\\t#include <shadowmap_vertex>\\n\\t#include <fog_vertex>\\n}\";\n\nconst fragment$4 = \"#define TOON\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float opacity;\\n#include <common>\\n#include <packing>\\n#include <dithering_pars_fragment>\\n#include <color_pars_fragment>\\n#include <uv_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <alphatest_pars_fragment>\\n#include <alphahash_pars_fragment>\\n#include <aomap_pars_fragment>\\n#include <lightmap_pars_fragment>\\n#include <emissivemap_pars_fragment>\\n#include <gradientmap_pars_fragment>\\n#include <fog_pars_fragment>\\n#include <bsdfs>\\n#include <lights_pars_begin>\\n#include <normal_pars_fragment>\\n#include <lights_toon_pars_fragment>\\n#include <shadowmap_pars_fragment>\\n#include <bumpmap_pars_fragment>\\n#include <normalmap_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include <clipping_planes_fragment>\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <map_fragment>\\n\\t#include <color_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <alphahash_fragment>\\n\\t#include <normal_fragment_begin>\\n\\t#include <normal_fragment_maps>\\n\\t#include <emissivemap_fragment>\\n\\t#include <lights_toon_fragment>\\n\\t#include <lights_fragment_begin>\\n\\t#include <lights_fragment_maps>\\n\\t#include <lights_fragment_end>\\n\\t#include <aomap_fragment>\\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\\n\\t#include <opaque_fragment>\\n\\t#include <tonemapping_fragment>\\n\\t#include <colorspace_fragment>\\n\\t#include <fog_fragment>\\n\\t#include <premultiplied_alpha_fragment>\\n\\t#include <dithering_fragment>\\n}\";\n\nconst vertex$3 = \"uniform float size;\\nuniform float scale;\\n#include <common>\\n#include <color_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\n#ifdef USE_POINTS_UV\\n\\tvarying vec2 vUv;\\n\\tuniform mat3 uvTransform;\\n#endif\\nvoid main() {\\n\\t#ifdef USE_POINTS_UV\\n\\t\\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\\n\\t#endif\\n\\t#include <color_vertex>\\n\\t#include <morphinstance_vertex>\\n\\t#include <morphcolor_vertex>\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <project_vertex>\\n\\tgl_PointSize = size;\\n\\t#ifdef USE_SIZEATTENUATION\\n\\t\\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\\n\\t\\tif ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\\n\\t#endif\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\t#include <worldpos_vertex>\\n\\t#include <fog_vertex>\\n}\";\n\nconst fragment$3 = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#include <common>\\n#include <color_pars_fragment>\\n#include <map_particle_pars_fragment>\\n#include <alphatest_pars_fragment>\\n#include <alphahash_pars_fragment>\\n#include <fog_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include <clipping_planes_fragment>\\n\\tvec3 outgoingLight = vec3( 0.0 );\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <map_particle_fragment>\\n\\t#include <color_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <alphahash_fragment>\\n\\toutgoingLight = diffuseColor.rgb;\\n\\t#include <opaque_fragment>\\n\\t#include <tonemapping_fragment>\\n\\t#include <colorspace_fragment>\\n\\t#include <fog_fragment>\\n\\t#include <premultiplied_alpha_fragment>\\n}\";\n\nconst vertex$2 = \"#include <common>\\n#include <batching_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <shadowmap_pars_vertex>\\nvoid main() {\\n\\t#include <batching_vertex>\\n\\t#include <beginnormal_vertex>\\n\\t#include <morphinstance_vertex>\\n\\t#include <morphnormal_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#include <skinnormal_vertex>\\n\\t#include <defaultnormal_vertex>\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <worldpos_vertex>\\n\\t#include <shadowmap_vertex>\\n\\t#include <fog_vertex>\\n}\";\n\nconst fragment$2 = \"uniform vec3 color;\\nuniform float opacity;\\n#include <common>\\n#include <packing>\\n#include <fog_pars_fragment>\\n#include <bsdfs>\\n#include <lights_pars_begin>\\n#include <logdepthbuf_pars_fragment>\\n#include <shadowmap_pars_fragment>\\n#include <shadowmask_pars_fragment>\\nvoid main() {\\n\\t#include <logdepthbuf_fragment>\\n\\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\\n\\t#include <tonemapping_fragment>\\n\\t#include <colorspace_fragment>\\n\\t#include <fog_fragment>\\n}\";\n\nconst vertex$1 = \"uniform float rotation;\\nuniform vec2 center;\\n#include <common>\\n#include <uv_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\tvec4 mvPosition = modelViewMatrix[ 3 ];\\n\\tvec2 scale = vec2( length( modelMatrix[ 0 ].xyz ), length( modelMatrix[ 1 ].xyz ) );\\n\\t#ifndef USE_SIZEATTENUATION\\n\\t\\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\\n\\t\\tif ( isPerspective ) scale *= - mvPosition.z;\\n\\t#endif\\n\\tvec2 alignedPosition = ( position.xy - ( center - vec2( 0.5 ) ) ) * scale;\\n\\tvec2 rotatedPosition;\\n\\trotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\\n\\trotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\\n\\tmvPosition.xy += rotatedPosition;\\n\\tgl_Position = projectionMatrix * mvPosition;\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\t#include <fog_vertex>\\n}\";\n\nconst fragment$1 = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#include <common>\\n#include <uv_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <alphatest_pars_fragment>\\n#include <alphahash_pars_fragment>\\n#include <fog_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include <clipping_planes_fragment>\\n\\tvec3 outgoingLight = vec3( 0.0 );\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <map_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <alphahash_fragment>\\n\\toutgoingLight = diffuseColor.rgb;\\n\\t#include <opaque_fragment>\\n\\t#include <tonemapping_fragment>\\n\\t#include <colorspace_fragment>\\n\\t#include <fog_fragment>\\n}\";\n\nconst ShaderChunk = {\n\talphahash_fragment: alphahash_fragment,\n\talphahash_pars_fragment: alphahash_pars_fragment,\n\talphamap_fragment: alphamap_fragment,\n\talphamap_pars_fragment: alphamap_pars_fragment,\n\talphatest_fragment: alphatest_fragment,\n\talphatest_pars_fragment: alphatest_pars_fragment,\n\taomap_fragment: aomap_fragment,\n\taomap_pars_fragment: aomap_pars_fragment,\n\tbatching_pars_vertex: batching_pars_vertex,\n\tbatching_vertex: batching_vertex,\n\tbegin_vertex: begin_vertex,\n\tbeginnormal_vertex: beginnormal_vertex,\n\tbsdfs: bsdfs,\n\tiridescence_fragment: iridescence_fragment,\n\tbumpmap_pars_fragment: bumpmap_pars_fragment,\n\tclipping_planes_fragment: clipping_planes_fragment,\n\tclipping_planes_pars_fragment: clipping_planes_pars_fragment,\n\tclipping_planes_pars_vertex: clipping_planes_pars_vertex,\n\tclipping_planes_vertex: clipping_planes_vertex,\n\tcolor_fragment: color_fragment,\n\tcolor_pars_fragment: color_pars_fragment,\n\tcolor_pars_vertex: color_pars_vertex,\n\tcolor_vertex: color_vertex,\n\tcommon: common,\n\tcube_uv_reflection_fragment: cube_uv_reflection_fragment,\n\tdefaultnormal_vertex: defaultnormal_vertex,\n\tdisplacementmap_pars_vertex: displacementmap_pars_vertex,\n\tdisplacementmap_vertex: displacementmap_vertex,\n\temissivemap_fragment: emissivemap_fragment,\n\temissivemap_pars_fragment: emissivemap_pars_fragment,\n\tcolorspace_fragment: colorspace_fragment,\n\tcolorspace_pars_fragment: colorspace_pars_fragment,\n\tenvmap_fragment: envmap_fragment,\n\tenvmap_common_pars_fragment: envmap_common_pars_fragment,\n\tenvmap_pars_fragment: envmap_pars_fragment,\n\tenvmap_pars_vertex: envmap_pars_vertex,\n\tenvmap_physical_pars_fragment: envmap_physical_pars_fragment,\n\tenvmap_vertex: envmap_vertex,\n\tfog_vertex: fog_vertex,\n\tfog_pars_vertex: fog_pars_vertex,\n\tfog_fragment: fog_fragment,\n\tfog_pars_fragment: fog_pars_fragment,\n\tgradientmap_pars_fragment: gradientmap_pars_fragment,\n\tlightmap_pars_fragment: lightmap_pars_fragment,\n\tlights_lambert_fragment: lights_lambert_fragment,\n\tlights_lambert_pars_fragment: lights_lambert_pars_fragment,\n\tlights_pars_begin: lights_pars_begin,\n\tlights_toon_fragment: lights_toon_fragment,\n\tlights_toon_pars_fragment: lights_toon_pars_fragment,\n\tlights_phong_fragment: lights_phong_fragment,\n\tlights_phong_pars_fragment: lights_phong_pars_fragment,\n\tlights_physical_fragment: lights_physical_fragment,\n\tlights_physical_pars_fragment: lights_physical_pars_fragment,\n\tlights_fragment_begin: lights_fragment_begin,\n\tlights_fragment_maps: lights_fragment_maps,\n\tlights_fragment_end: lights_fragment_end,\n\tlogdepthbuf_fragment: logdepthbuf_fragment,\n\tlogdepthbuf_pars_fragment: logdepthbuf_pars_fragment,\n\tlogdepthbuf_pars_vertex: logdepthbuf_pars_vertex,\n\tlogdepthbuf_vertex: logdepthbuf_vertex,\n\tmap_fragment: map_fragment,\n\tmap_pars_fragment: map_pars_fragment,\n\tmap_particle_fragment: map_particle_fragment,\n\tmap_particle_pars_fragment: map_particle_pars_fragment,\n\tmetalnessmap_fragment: metalnessmap_fragment,\n\tmetalnessmap_pars_fragment: metalnessmap_pars_fragment,\n\tmorphinstance_vertex: morphinstance_vertex,\n\tmorphcolor_vertex: morphcolor_vertex,\n\tmorphnormal_vertex: morphnormal_vertex,\n\tmorphtarget_pars_vertex: morphtarget_pars_vertex,\n\tmorphtarget_vertex: morphtarget_vertex,\n\tnormal_fragment_begin: normal_fragment_begin,\n\tnormal_fragment_maps: normal_fragment_maps,\n\tnormal_pars_fragment: normal_pars_fragment,\n\tnormal_pars_vertex: normal_pars_vertex,\n\tnormal_vertex: normal_vertex,\n\tnormalmap_pars_fragment: normalmap_pars_fragment,\n\tclearcoat_normal_fragment_begin: clearcoat_normal_fragment_begin,\n\tclearcoat_normal_fragment_maps: clearcoat_normal_fragment_maps,\n\tclearcoat_pars_fragment: clearcoat_pars_fragment,\n\tiridescence_pars_fragment: iridescence_pars_fragment,\n\topaque_fragment: opaque_fragment,\n\tpacking: packing,\n\tpremultiplied_alpha_fragment: premultiplied_alpha_fragment,\n\tproject_vertex: project_vertex,\n\tdithering_fragment: dithering_fragment,\n\tdithering_pars_fragment: dithering_pars_fragment,\n\troughnessmap_fragment: roughnessmap_fragment,\n\troughnessmap_pars_fragment: roughnessmap_pars_fragment,\n\tshadowmap_pars_fragment: shadowmap_pars_fragment,\n\tshadowmap_pars_vertex: shadowmap_pars_vertex,\n\tshadowmap_vertex: shadowmap_vertex,\n\tshadowmask_pars_fragment: shadowmask_pars_fragment,\n\tskinbase_vertex: skinbase_vertex,\n\tskinning_pars_vertex: skinning_pars_vertex,\n\tskinning_vertex: skinning_vertex,\n\tskinnormal_vertex: skinnormal_vertex,\n\tspecularmap_fragment: specularmap_fragment,\n\tspecularmap_pars_fragment: specularmap_pars_fragment,\n\ttonemapping_fragment: tonemapping_fragment,\n\ttonemapping_pars_fragment: tonemapping_pars_fragment,\n\ttransmission_fragment: transmission_fragment,\n\ttransmission_pars_fragment: transmission_pars_fragment,\n\tuv_pars_fragment: uv_pars_fragment,\n\tuv_pars_vertex: uv_pars_vertex,\n\tuv_vertex: uv_vertex,\n\tworldpos_vertex: worldpos_vertex,\n\n\tbackground_vert: vertex$h,\n\tbackground_frag: fragment$h,\n\tbackgroundCube_vert: vertex$g,\n\tbackgroundCube_frag: fragment$g,\n\tcube_vert: vertex$f,\n\tcube_frag: fragment$f,\n\tdepth_vert: vertex$e,\n\tdepth_frag: fragment$e,\n\tdistanceRGBA_vert: vertex$d,\n\tdistanceRGBA_frag: fragment$d,\n\tequirect_vert: vertex$c,\n\tequirect_frag: fragment$c,\n\tlinedashed_vert: vertex$b,\n\tlinedashed_frag: fragment$b,\n\tmeshbasic_vert: vertex$a,\n\tmeshbasic_frag: fragment$a,\n\tmeshlambert_vert: vertex$9,\n\tmeshlambert_frag: fragment$9,\n\tmeshmatcap_vert: vertex$8,\n\tmeshmatcap_frag: fragment$8,\n\tmeshnormal_vert: vertex$7,\n\tmeshnormal_frag: fragment$7,\n\tmeshphong_vert: vertex$6,\n\tmeshphong_frag: fragment$6,\n\tmeshphysical_vert: vertex$5,\n\tmeshphysical_frag: fragment$5,\n\tmeshtoon_vert: vertex$4,\n\tmeshtoon_frag: fragment$4,\n\tpoints_vert: vertex$3,\n\tpoints_frag: fragment$3,\n\tshadow_vert: vertex$2,\n\tshadow_frag: fragment$2,\n\tsprite_vert: vertex$1,\n\tsprite_frag: fragment$1\n};\n\n// Uniforms library for shared webgl shaders\nconst UniformsLib = {\n\n\tcommon: {\n\n\t\tdiffuse: { value: /*@__PURE__*/ new Color( 0xffffff ) },\n\t\topacity: { value: 1.0 },\n\n\t\tmap: { value: null },\n\t\tmapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\n\t\talphaMap: { value: null },\n\t\talphaMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\n\t\talphaTest: { value: 0 }\n\n\t},\n\n\tspecularmap: {\n\n\t\tspecularMap: { value: null },\n\t\tspecularMapTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\tenvmap: {\n\n\t\tenvMap: { value: null },\n\t\tenvMapRotation: { value: /*@__PURE__*/ new Matrix3() },\n\t\tflipEnvMap: { value: -1 },\n\t\treflectivity: { value: 1.0 }, // basic, lambert, phong\n\t\tior: { value: 1.5 }, // physical\n\t\trefractionRatio: { value: 0.98 }, // basic, lambert, phong\n\t\tdfgLUT: { value: null } // DFG LUT for physically-based rendering\n\n\t},\n\n\taomap: {\n\n\t\taoMap: { value: null },\n\t\taoMapIntensity: { value: 1 },\n\t\taoMapTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\tlightmap: {\n\n\t\tlightMap: { value: null },\n\t\tlightMapIntensity: { value: 1 },\n\t\tlightMapTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\tbumpmap: {\n\n\t\tbumpMap: { value: null },\n\t\tbumpMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\tbumpScale: { value: 1 }\n\n\t},\n\n\tnormalmap: {\n\n\t\tnormalMap: { value: null },\n\t\tnormalMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\tnormalScale: { value: /*@__PURE__*/ new Vector2( 1, 1 ) }\n\n\t},\n\n\tdisplacementmap: {\n\n\t\tdisplacementMap: { value: null },\n\t\tdisplacementMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\tdisplacementScale: { value: 1 },\n\t\tdisplacementBias: { value: 0 }\n\n\t},\n\n\temissivemap: {\n\n\t\temissiveMap: { value: null },\n\t\temissiveMapTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\tmetalnessmap: {\n\n\t\tmetalnessMap: { value: null },\n\t\tmetalnessMapTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\troughnessmap: {\n\n\t\troughnessMap: { value: null },\n\t\troughnessMapTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\tgradientmap: {\n\n\t\tgradientMap: { value: null }\n\n\t},\n\n\tfog: {\n\n\t\tfogDensity: { value: 0.00025 },\n\t\tfogNear: { value: 1 },\n\t\tfogFar: { value: 2000 },\n\t\tfogColor: { value: /*@__PURE__*/ new Color( 0xffffff ) }\n\n\t},\n\n\tlights: {\n\n\t\tambientLightColor: { value: [] },\n\n\t\tlightProbe: { value: [] },\n\n\t\tdirectionalLights: { value: [], properties: {\n\t\t\tdirection: {},\n\t\t\tcolor: {}\n\t\t} },\n\n\t\tdirectionalLightShadows: { value: [], properties: {\n\t\t\tshadowIntensity: 1,\n\t\t\tshadowBias: {},\n\t\t\tshadowNormalBias: {},\n\t\t\tshadowRadius: {},\n\t\t\tshadowMapSize: {}\n\t\t} },\n\n\t\tdirectionalShadowMap: { value: [] },\n\t\tdirectionalShadowMatrix: { value: [] },\n\n\t\tspotLights: { value: [], properties: {\n\t\t\tcolor: {},\n\t\t\tposition: {},\n\t\t\tdirection: {},\n\t\t\tdistance: {},\n\t\t\tconeCos: {},\n\t\t\tpenumbraCos: {},\n\t\t\tdecay: {}\n\t\t} },\n\n\t\tspotLightShadows: { value: [], properties: {\n\t\t\tshadowIntensity: 1,\n\t\t\tshadowBias: {},\n\t\t\tshadowNormalBias: {},\n\t\t\tshadowRadius: {},\n\t\t\tshadowMapSize: {}\n\t\t} },\n\n\t\tspotLightMap: { value: [] },\n\t\tspotShadowMap: { value: [] },\n\t\tspotLightMatrix: { value: [] },\n\n\t\tpointLights: { value: [], properties: {\n\t\t\tcolor: {},\n\t\t\tposition: {},\n\t\t\tdecay: {},\n\t\t\tdistance: {}\n\t\t} },\n\n\t\tpointLightShadows: { value: [], properties: {\n\t\t\tshadowIntensity: 1,\n\t\t\tshadowBias: {},\n\t\t\tshadowNormalBias: {},\n\t\t\tshadowRadius: {},\n\t\t\tshadowMapSize: {},\n\t\t\tshadowCameraNear: {},\n\t\t\tshadowCameraFar: {}\n\t\t} },\n\n\t\tpointShadowMap: { value: [] },\n\t\tpointShadowMatrix: { value: [] },\n\n\t\themisphereLights: { value: [], properties: {\n\t\t\tdirection: {},\n\t\t\tskyColor: {},\n\t\t\tgroundColor: {}\n\t\t} },\n\n\t\t// TODO (abelnation): RectAreaLight BRDF data needs to be moved from example to main src\n\t\trectAreaLights: { value: [], properties: {\n\t\t\tcolor: {},\n\t\t\tposition: {},\n\t\t\twidth: {},\n\t\t\theight: {}\n\t\t} },\n\n\t\tltc_1: { value: null },\n\t\tltc_2: { value: null }\n\n\t},\n\n\tpoints: {\n\n\t\tdiffuse: { value: /*@__PURE__*/ new Color( 0xffffff ) },\n\t\topacity: { value: 1.0 },\n\t\tsize: { value: 1.0 },\n\t\tscale: { value: 1.0 },\n\t\tmap: { value: null },\n\t\talphaMap: { value: null },\n\t\talphaMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\talphaTest: { value: 0 },\n\t\tuvTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\tsprite: {\n\n\t\tdiffuse: { value: /*@__PURE__*/ new Color( 0xffffff ) },\n\t\topacity: { value: 1.0 },\n\t\tcenter: { value: /*@__PURE__*/ new Vector2( 0.5, 0.5 ) },\n\t\trotation: { value: 0.0 },\n\t\tmap: { value: null },\n\t\tmapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\talphaMap: { value: null },\n\t\talphaMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\talphaTest: { value: 0 }\n\n\t}\n\n};\n\nconst ShaderLib = {\n\n\tbasic: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.specularmap,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.fog\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshbasic_vert,\n\t\tfragmentShader: ShaderChunk.meshbasic_frag\n\n\t},\n\n\tlambert: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.specularmap,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: /*@__PURE__*/ new Color( 0x000000 ) }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshlambert_vert,\n\t\tfragmentShader: ShaderChunk.meshlambert_frag\n\n\t},\n\n\tphong: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.specularmap,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: /*@__PURE__*/ new Color( 0x000000 ) },\n\t\t\t\tspecular: { value: /*@__PURE__*/ new Color( 0x111111 ) },\n\t\t\t\tshininess: { value: 30 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshphong_vert,\n\t\tfragmentShader: ShaderChunk.meshphong_frag\n\n\t},\n\n\tstandard: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.roughnessmap,\n\t\t\tUniformsLib.metalnessmap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: /*@__PURE__*/ new Color( 0x000000 ) },\n\t\t\t\troughness: { value: 1.0 },\n\t\t\t\tmetalness: { value: 0.0 },\n\t\t\t\tenvMapIntensity: { value: 1 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshphysical_vert,\n\t\tfragmentShader: ShaderChunk.meshphysical_frag\n\n\t},\n\n\ttoon: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.gradientmap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: /*@__PURE__*/ new Color( 0x000000 ) }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshtoon_vert,\n\t\tfragmentShader: ShaderChunk.meshtoon_frag\n\n\t},\n\n\tmatcap: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.fog,\n\t\t\t{\n\t\t\t\tmatcap: { value: null }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshmatcap_vert,\n\t\tfragmentShader: ShaderChunk.meshmatcap_frag\n\n\t},\n\n\tpoints: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.points,\n\t\t\tUniformsLib.fog\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.points_vert,\n\t\tfragmentShader: ShaderChunk.points_frag\n\n\t},\n\n\tdashed: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.fog,\n\t\t\t{\n\t\t\t\tscale: { value: 1 },\n\t\t\t\tdashSize: { value: 1 },\n\t\t\t\ttotalSize: { value: 2 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.linedashed_vert,\n\t\tfragmentShader: ShaderChunk.linedashed_frag\n\n\t},\n\n\tdepth: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.displacementmap\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.depth_vert,\n\t\tfragmentShader: ShaderChunk.depth_frag\n\n\t},\n\n\tnormal: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\t{\n\t\t\t\topacity: { value: 1.0 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshnormal_vert,\n\t\tfragmentShader: ShaderChunk.meshnormal_frag\n\n\t},\n\n\tsprite: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.sprite,\n\t\t\tUniformsLib.fog\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.sprite_vert,\n\t\tfragmentShader: ShaderChunk.sprite_frag\n\n\t},\n\n\tbackground: {\n\n\t\tuniforms: {\n\t\t\tuvTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tt2D: { value: null },\n\t\t\tbackgroundIntensity: { value: 1 }\n\t\t},\n\n\t\tvertexShader: ShaderChunk.background_vert,\n\t\tfragmentShader: ShaderChunk.background_frag\n\n\t},\n\n\tbackgroundCube: {\n\n\t\tuniforms: {\n\t\t\tenvMap: { value: null },\n\t\t\tflipEnvMap: { value: -1 },\n\t\t\tbackgroundBlurriness: { value: 0 },\n\t\t\tbackgroundIntensity: { value: 1 },\n\t\t\tbackgroundRotation: { value: /*@__PURE__*/ new Matrix3() }\n\t\t},\n\n\t\tvertexShader: ShaderChunk.backgroundCube_vert,\n\t\tfragmentShader: ShaderChunk.backgroundCube_frag\n\n\t},\n\n\tcube: {\n\n\t\tuniforms: {\n\t\t\ttCube: { value: null },\n\t\t\ttFlip: { value: -1 },\n\t\t\topacity: { value: 1.0 }\n\t\t},\n\n\t\tvertexShader: ShaderChunk.cube_vert,\n\t\tfragmentShader: ShaderChunk.cube_frag\n\n\t},\n\n\tequirect: {\n\n\t\tuniforms: {\n\t\t\ttEquirect: { value: null },\n\t\t},\n\n\t\tvertexShader: ShaderChunk.equirect_vert,\n\t\tfragmentShader: ShaderChunk.equirect_frag\n\n\t},\n\n\tdistanceRGBA: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.displacementmap,\n\t\t\t{\n\t\t\t\treferencePosition: { value: /*@__PURE__*/ new Vector3() },\n\t\t\t\tnearDistance: { value: 1 },\n\t\t\t\tfarDistance: { value: 1000 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.distanceRGBA_vert,\n\t\tfragmentShader: ShaderChunk.distanceRGBA_frag\n\n\t},\n\n\tshadow: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.lights,\n\t\t\tUniformsLib.fog,\n\t\t\t{\n\t\t\t\tcolor: { value: /*@__PURE__*/ new Color( 0x00000 ) },\n\t\t\t\topacity: { value: 1.0 }\n\t\t\t},\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.shadow_vert,\n\t\tfragmentShader: ShaderChunk.shadow_frag\n\n\t}\n\n};\n\nShaderLib.physical = {\n\n\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\tShaderLib.standard.uniforms,\n\t\t{\n\t\t\tclearcoat: { value: 0 },\n\t\t\tclearcoatMap: { value: null },\n\t\t\tclearcoatMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tclearcoatNormalMap: { value: null },\n\t\t\tclearcoatNormalMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tclearcoatNormalScale: { value: /*@__PURE__*/ new Vector2( 1, 1 ) },\n\t\t\tclearcoatRoughness: { value: 0 },\n\t\t\tclearcoatRoughnessMap: { value: null },\n\t\t\tclearcoatRoughnessMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tdispersion: { value: 0 },\n\t\t\tiridescence: { value: 0 },\n\t\t\tiridescenceMap: { value: null },\n\t\t\tiridescenceMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tiridescenceIOR: { value: 1.3 },\n\t\t\tiridescenceThicknessMinimum: { value: 100 },\n\t\t\tiridescenceThicknessMaximum: { value: 400 },\n\t\t\tiridescenceThicknessMap: { value: null },\n\t\t\tiridescenceThicknessMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tsheen: { value: 0 },\n\t\t\tsheenColor: { value: /*@__PURE__*/ new Color( 0x000000 ) },\n\t\t\tsheenColorMap: { value: null },\n\t\t\tsheenColorMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tsheenRoughness: { value: 1 },\n\t\t\tsheenRoughnessMap: { value: null },\n\t\t\tsheenRoughnessMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\ttransmission: { value: 0 },\n\t\t\ttransmissionMap: { value: null },\n\t\t\ttransmissionMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\ttransmissionSamplerSize: { value: /*@__PURE__*/ new Vector2() },\n\t\t\ttransmissionSamplerMap: { value: null },\n\t\t\tthickness: { value: 0 },\n\t\t\tthicknessMap: { value: null },\n\t\t\tthicknessMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tattenuationDistance: { value: 0 },\n\t\t\tattenuationColor: { value: /*@__PURE__*/ new Color( 0x000000 ) },\n\t\t\tspecularColor: { value: /*@__PURE__*/ new Color( 1, 1, 1 ) },\n\t\t\tspecularColorMap: { value: null },\n\t\t\tspecularColorMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tspecularIntensity: { value: 1 },\n\t\t\tspecularIntensityMap: { value: null },\n\t\t\tspecularIntensityMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tanisotropyVector: { value: /*@__PURE__*/ new Vector2() },\n\t\t\tanisotropyMap: { value: null },\n\t\t\tanisotropyMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t}\n\t] ),\n\n\tvertexShader: ShaderChunk.meshphysical_vert,\n\tfragmentShader: ShaderChunk.meshphysical_frag\n\n};\n\nconst _rgb = { r: 0, b: 0, g: 0 };\nconst _e1$1 = /*@__PURE__*/ new Euler();\nconst _m1$1 = /*@__PURE__*/ new Matrix4();\n\nfunction WebGLBackground( renderer, cubemaps, cubeuvmaps, state, objects, alpha, premultipliedAlpha ) {\n\n\tconst clearColor = new Color( 0x000000 );\n\tlet clearAlpha = alpha === true ? 0 : 1;\n\n\tlet planeMesh;\n\tlet boxMesh;\n\n\tlet currentBackground = null;\n\tlet currentBackgroundVersion = 0;\n\tlet currentTonemapping = null;\n\n\tfunction getBackground( scene ) {\n\n\t\tlet background = scene.isScene === true ? scene.background : null;\n\n\t\tif ( background && background.isTexture ) {\n\n\t\t\tconst usePMREM = scene.backgroundBlurriness > 0; // use PMREM if the user wants to blur the background\n\t\t\tbackground = ( usePMREM ? cubeuvmaps : cubemaps ).get( background );\n\n\t\t}\n\n\t\treturn background;\n\n\t}\n\n\tfunction render( scene ) {\n\n\t\tlet forceClear = false;\n\t\tconst background = getBackground( scene );\n\n\t\tif ( background === null ) {\n\n\t\t\tsetClear( clearColor, clearAlpha );\n\n\t\t} else if ( background && background.isColor ) {\n\n\t\t\tsetClear( background, 1 );\n\t\t\tforceClear = true;\n\n\t\t}\n\n\t\tconst environmentBlendMode = renderer.xr.getEnvironmentBlendMode();\n\n\t\tif ( environmentBlendMode === 'additive' ) {\n\n\t\t\tstate.buffers.color.setClear( 0, 0, 0, 1, premultipliedAlpha );\n\n\t\t} else if ( environmentBlendMode === 'alpha-blend' ) {\n\n\t\t\tstate.buffers.color.setClear( 0, 0, 0, 0, premultipliedAlpha );\n\n\t\t}\n\n\t\tif ( renderer.autoClear || forceClear ) {\n\n\t\t\t// buffers might not be writable which is required to ensure a correct clear\n\n\t\t\tstate.buffers.depth.setTest( true );\n\t\t\tstate.buffers.depth.setMask( true );\n\t\t\tstate.buffers.color.setMask( true );\n\n\t\t\trenderer.clear( renderer.autoClearColor, renderer.autoClearDepth, renderer.autoClearStencil );\n\n\t\t}\n\n\t}\n\n\tfunction addToRenderList( renderList, scene ) {\n\n\t\tconst background = getBackground( scene );\n\n\t\tif ( background && ( background.isCubeTexture || background.mapping === CubeUVReflectionMapping ) ) {\n\n\t\t\tif ( boxMesh === undefined ) {\n\n\t\t\t\tboxMesh = new Mesh(\n\t\t\t\t\tnew BoxGeometry( 1, 1, 1 ),\n\t\t\t\t\tnew ShaderMaterial( {\n\t\t\t\t\t\tname: 'BackgroundCubeMaterial',\n\t\t\t\t\t\tuniforms: cloneUniforms( ShaderLib.backgroundCube.uniforms ),\n\t\t\t\t\t\tvertexShader: ShaderLib.backgroundCube.vertexShader,\n\t\t\t\t\t\tfragmentShader: ShaderLib.backgroundCube.fragmentShader,\n\t\t\t\t\t\tside: BackSide,\n\t\t\t\t\t\tdepthTest: false,\n\t\t\t\t\t\tdepthWrite: false,\n\t\t\t\t\t\tfog: false,\n\t\t\t\t\t\tallowOverride: false\n\t\t\t\t\t} )\n\t\t\t\t);\n\n\t\t\t\tboxMesh.geometry.deleteAttribute( 'normal' );\n\t\t\t\tboxMesh.geometry.deleteAttribute( 'uv' );\n\n\t\t\t\tboxMesh.onBeforeRender = function ( renderer, scene, camera ) {\n\n\t\t\t\t\tthis.matrixWorld.copyPosition( camera.matrixWorld );\n\n\t\t\t\t};\n\n\t\t\t\t// add \"envMap\" material property so the renderer can evaluate it like for built-in materials\n\t\t\t\tObject.defineProperty( boxMesh.material, 'envMap', {\n\n\t\t\t\t\tget: function () {\n\n\t\t\t\t\t\treturn this.uniforms.envMap.value;\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\tobjects.update( boxMesh );\n\n\t\t\t}\n\n\t\t\t_e1$1.copy( scene.backgroundRotation );\n\n\t\t\t// accommodate left-handed frame\n\t\t\t_e1$1.x *= -1; _e1$1.y *= -1; _e1$1.z *= -1;\n\n\t\t\tif ( background.isCubeTexture && background.isRenderTargetTexture === false ) {\n\n\t\t\t\t// environment maps which are not cube render targets or PMREMs follow a different convention\n\t\t\t\t_e1$1.y *= -1;\n\t\t\t\t_e1$1.z *= -1;\n\n\t\t\t}\n\n\t\t\tboxMesh.material.uniforms.envMap.value = background;\n\t\t\tboxMesh.material.uniforms.flipEnvMap.value = ( background.isCubeTexture && background.isRenderTargetTexture === false ) ? -1 : 1;\n\t\t\tboxMesh.material.uniforms.backgroundBlurriness.value = scene.backgroundBlurriness;\n\t\t\tboxMesh.material.uniforms.backgroundIntensity.value = scene.backgroundIntensity;\n\t\t\tboxMesh.material.uniforms.backgroundRotation.value.setFromMatrix4( _m1$1.makeRotationFromEuler( _e1$1 ) );\n\t\t\tboxMesh.material.toneMapped = ColorManagement.getTransfer( background.colorSpace ) !== SRGBTransfer;\n\n\t\t\tif ( currentBackground !== background ||\n\t\t\t\tcurrentBackgroundVersion !== background.version ||\n\t\t\t\tcurrentTonemapping !== renderer.toneMapping ) {\n\n\t\t\t\tboxMesh.material.needsUpdate = true;\n\n\t\t\t\tcurrentBackground = background;\n\t\t\t\tcurrentBackgroundVersion = background.version;\n\t\t\t\tcurrentTonemapping = renderer.toneMapping;\n\n\t\t\t}\n\n\t\t\tboxMesh.layers.enableAll();\n\n\t\t\t// push to the pre-sorted opaque render list\n\t\t\trenderList.unshift( boxMesh, boxMesh.geometry, boxMesh.material, 0, 0, null );\n\n\t\t} else if ( background && background.isTexture ) {\n\n\t\t\tif ( planeMesh === undefined ) {\n\n\t\t\t\tplaneMesh = new Mesh(\n\t\t\t\t\tnew PlaneGeometry( 2, 2 ),\n\t\t\t\t\tnew ShaderMaterial( {\n\t\t\t\t\t\tname: 'BackgroundMaterial',\n\t\t\t\t\t\tuniforms: cloneUniforms( ShaderLib.background.uniforms ),\n\t\t\t\t\t\tvertexShader: ShaderLib.background.vertexShader,\n\t\t\t\t\t\tfragmentShader: ShaderLib.background.fragmentShader,\n\t\t\t\t\t\tside: FrontSide,\n\t\t\t\t\t\tdepthTest: false,\n\t\t\t\t\t\tdepthWrite: false,\n\t\t\t\t\t\tfog: false,\n\t\t\t\t\t\tallowOverride: false\n\t\t\t\t\t} )\n\t\t\t\t);\n\n\t\t\t\tplaneMesh.geometry.deleteAttribute( 'normal' );\n\n\t\t\t\t// add \"map\" material property so the renderer can evaluate it like for built-in materials\n\t\t\t\tObject.defineProperty( planeMesh.material, 'map', {\n\n\t\t\t\t\tget: function () {\n\n\t\t\t\t\t\treturn this.uniforms.t2D.value;\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\tobjects.update( planeMesh );\n\n\t\t\t}\n\n\t\t\tplaneMesh.material.uniforms.t2D.value = background;\n\t\t\tplaneMesh.material.uniforms.backgroundIntensity.value = scene.backgroundIntensity;\n\t\t\tplaneMesh.material.toneMapped = ColorManagement.getTransfer( background.colorSpace ) !== SRGBTransfer;\n\n\t\t\tif ( background.matrixAutoUpdate === true ) {\n\n\t\t\t\tbackground.updateMatrix();\n\n\t\t\t}\n\n\t\t\tplaneMesh.material.uniforms.uvTransform.value.copy( background.matrix );\n\n\t\t\tif ( currentBackground !== background ||\n\t\t\t\tcurrentBackgroundVersion !== background.version ||\n\t\t\t\tcurrentTonemapping !== renderer.toneMapping ) {\n\n\t\t\t\tplaneMesh.material.needsUpdate = true;\n\n\t\t\t\tcurrentBackground = background;\n\t\t\t\tcurrentBackgroundVersion = background.version;\n\t\t\t\tcurrentTonemapping = renderer.toneMapping;\n\n\t\t\t}\n\n\t\t\tplaneMesh.layers.enableAll();\n\n\t\t\t// push to the pre-sorted opaque render list\n\t\t\trenderList.unshift( planeMesh, planeMesh.geometry, planeMesh.material, 0, 0, null );\n\n\t\t}\n\n\t}\n\n\tfunction setClear( color, alpha ) {\n\n\t\tcolor.getRGB( _rgb, getUnlitUniformColorSpace( renderer ) );\n\n\t\tstate.buffers.color.setClear( _rgb.r, _rgb.g, _rgb.b, alpha, premultipliedAlpha );\n\n\t}\n\n\tfunction dispose() {\n\n\t\tif ( boxMesh !== undefined ) {\n\n\t\t\tboxMesh.geometry.dispose();\n\t\t\tboxMesh.material.dispose();\n\n\t\t\tboxMesh = undefined;\n\n\t\t}\n\n\t\tif ( planeMesh !== undefined ) {\n\n\t\t\tplaneMesh.geometry.dispose();\n\t\t\tplaneMesh.material.dispose();\n\n\t\t\tplaneMesh = undefined;\n\n\t\t}\n\n\t}\n\n\treturn {\n\n\t\tgetClearColor: function () {\n\n\t\t\treturn clearColor;\n\n\t\t},\n\t\tsetClearColor: function ( color, alpha = 1 ) {\n\n\t\t\tclearColor.set( color );\n\t\t\tclearAlpha = alpha;\n\t\t\tsetClear( clearColor, clearAlpha );\n\n\t\t},\n\t\tgetClearAlpha: function () {\n\n\t\t\treturn clearAlpha;\n\n\t\t},\n\t\tsetClearAlpha: function ( alpha ) {\n\n\t\t\tclearAlpha = alpha;\n\t\t\tsetClear( clearColor, clearAlpha );\n\n\t\t},\n\t\trender: render,\n\t\taddToRenderList: addToRenderList,\n\t\tdispose: dispose\n\n\t};\n\n}\n\nfunction WebGLBindingStates( gl, attributes ) {\n\n\tconst maxVertexAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS );\n\n\tconst bindingStates = {};\n\n\tconst defaultState = createBindingState( null );\n\tlet currentState = defaultState;\n\tlet forceUpdate = false;\n\n\tfunction setup( object, material, program, geometry, index ) {\n\n\t\tlet updateBuffers = false;\n\n\t\tconst state = getBindingState( geometry, program, material );\n\n\t\tif ( currentState !== state ) {\n\n\t\t\tcurrentState = state;\n\t\t\tbindVertexArrayObject( currentState.object );\n\n\t\t}\n\n\t\tupdateBuffers = needsUpdate( object, geometry, program, index );\n\n\t\tif ( updateBuffers ) saveCache( object, geometry, program, index );\n\n\t\tif ( index !== null ) {\n\n\t\t\tattributes.update( index, gl.ELEMENT_ARRAY_BUFFER );\n\n\t\t}\n\n\t\tif ( updateBuffers || forceUpdate ) {\n\n\t\t\tforceUpdate = false;\n\n\t\t\tsetupVertexAttributes( object, material, program, geometry );\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tgl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, attributes.get( index ).buffer );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction createVertexArrayObject() {\n\n\t\treturn gl.createVertexArray();\n\n\t}\n\n\tfunction bindVertexArrayObject( vao ) {\n\n\t\treturn gl.bindVertexArray( vao );\n\n\t}\n\n\tfunction deleteVertexArrayObject( vao ) {\n\n\t\treturn gl.deleteVertexArray( vao );\n\n\t}\n\n\tfunction getBindingState( geometry, program, material ) {\n\n\t\tconst wireframe = ( material.wireframe === true );\n\n\t\tlet programMap = bindingStates[ geometry.id ];\n\n\t\tif ( programMap === undefined ) {\n\n\t\t\tprogramMap = {};\n\t\t\tbindingStates[ geometry.id ] = programMap;\n\n\t\t}\n\n\t\tlet stateMap = programMap[ program.id ];\n\n\t\tif ( stateMap === undefined ) {\n\n\t\t\tstateMap = {};\n\t\t\tprogramMap[ program.id ] = stateMap;\n\n\t\t}\n\n\t\tlet state = stateMap[ wireframe ];\n\n\t\tif ( state === undefined ) {\n\n\t\t\tstate = createBindingState( createVertexArrayObject() );\n\t\t\tstateMap[ wireframe ] = state;\n\n\t\t}\n\n\t\treturn state;\n\n\t}\n\n\tfunction createBindingState( vao ) {\n\n\t\tconst newAttributes = [];\n\t\tconst enabledAttributes = [];\n\t\tconst attributeDivisors = [];\n\n\t\tfor ( let i = 0; i < maxVertexAttributes; i ++ ) {\n\n\t\t\tnewAttributes[ i ] = 0;\n\t\t\tenabledAttributes[ i ] = 0;\n\t\t\tattributeDivisors[ i ] = 0;\n\n\t\t}\n\n\t\treturn {\n\n\t\t\t// for backward compatibility on non-VAO support browser\n\t\t\tgeometry: null,\n\t\t\tprogram: null,\n\t\t\twireframe: false,\n\n\t\t\tnewAttributes: newAttributes,\n\t\t\tenabledAttributes: enabledAttributes,\n\t\t\tattributeDivisors: attributeDivisors,\n\t\t\tobject: vao,\n\t\t\tattributes: {},\n\t\t\tindex: null\n\n\t\t};\n\n\t}\n\n\tfunction needsUpdate( object, geometry, program, index ) {\n\n\t\tconst cachedAttributes = currentState.attributes;\n\t\tconst geometryAttributes = geometry.attributes;\n\n\t\tlet attributesNum = 0;\n\n\t\tconst programAttributes = program.getAttributes();\n\n\t\tfor ( const name in programAttributes ) {\n\n\t\t\tconst programAttribute = programAttributes[ name ];\n\n\t\t\tif ( programAttribute.location >= 0 ) {\n\n\t\t\t\tconst cachedAttribute = cachedAttributes[ name ];\n\t\t\t\tlet geometryAttribute = geometryAttributes[ name ];\n\n\t\t\t\tif ( geometryAttribute === undefined ) {\n\n\t\t\t\t\tif ( name === 'instanceMatrix' && object.instanceMatrix ) geometryAttribute = object.instanceMatrix;\n\t\t\t\t\tif ( name === 'instanceColor' && object.instanceColor ) geometryAttribute = object.instanceColor;\n\n\t\t\t\t}\n\n\t\t\t\tif ( cachedAttribute === undefined ) return true;\n\n\t\t\t\tif ( cachedAttribute.attribute !== geometryAttribute ) return true;\n\n\t\t\t\tif ( geometryAttribute && cachedAttribute.data !== geometryAttribute.data ) return true;\n\n\t\t\t\tattributesNum ++;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( currentState.attributesNum !== attributesNum ) return true;\n\n\t\tif ( currentState.index !== index ) return true;\n\n\t\treturn false;\n\n\t}\n\n\tfunction saveCache( object, geometry, program, index ) {\n\n\t\tconst cache = {};\n\t\tconst attributes = geometry.attributes;\n\t\tlet attributesNum = 0;\n\n\t\tconst programAttributes = program.getAttributes();\n\n\t\tfor ( const name in programAttributes ) {\n\n\t\t\tconst programAttribute = programAttributes[ name ];\n\n\t\t\tif ( programAttribute.location >= 0 ) {\n\n\t\t\t\tlet attribute = attributes[ name ];\n\n\t\t\t\tif ( attribute === undefined ) {\n\n\t\t\t\t\tif ( name === 'instanceMatrix' && object.instanceMatrix ) attribute = object.instanceMatrix;\n\t\t\t\t\tif ( name === 'instanceColor' && object.instanceColor ) attribute = object.instanceColor;\n\n\t\t\t\t}\n\n\t\t\t\tconst data = {};\n\t\t\t\tdata.attribute = attribute;\n\n\t\t\t\tif ( attribute && attribute.data ) {\n\n\t\t\t\t\tdata.data = attribute.data;\n\n\t\t\t\t}\n\n\t\t\t\tcache[ name ] = data;\n\n\t\t\t\tattributesNum ++;\n\n\t\t\t}\n\n\t\t}\n\n\t\tcurrentState.attributes = cache;\n\t\tcurrentState.attributesNum = attributesNum;\n\n\t\tcurrentState.index = index;\n\n\t}\n\n\tfunction initAttributes() {\n\n\t\tconst newAttributes = currentState.newAttributes;\n\n\t\tfor ( let i = 0, il = newAttributes.length; i < il; i ++ ) {\n\n\t\t\tnewAttributes[ i ] = 0;\n\n\t\t}\n\n\t}\n\n\tfunction enableAttribute( attribute ) {\n\n\t\tenableAttributeAndDivisor( attribute, 0 );\n\n\t}\n\n\tfunction enableAttributeAndDivisor( attribute, meshPerAttribute ) {\n\n\t\tconst newAttributes = currentState.newAttributes;\n\t\tconst enabledAttributes = currentState.enabledAttributes;\n\t\tconst attributeDivisors = currentState.attributeDivisors;\n\n\t\tnewAttributes[ attribute ] = 1;\n\n\t\tif ( enabledAttributes[ attribute ] === 0 ) {\n\n\t\t\tgl.enableVertexAttribArray( attribute );\n\t\t\tenabledAttributes[ attribute ] = 1;\n\n\t\t}\n\n\t\tif ( attributeDivisors[ attribute ] !== meshPerAttribute ) {\n\n\t\t\tgl.vertexAttribDivisor( attribute, meshPerAttribute );\n\t\t\tattributeDivisors[ attribute ] = meshPerAttribute;\n\n\t\t}\n\n\t}\n\n\tfunction disableUnusedAttributes() {\n\n\t\tconst newAttributes = currentState.newAttributes;\n\t\tconst enabledAttributes = currentState.enabledAttributes;\n\n\t\tfor ( let i = 0, il = enabledAttributes.length; i < il; i ++ ) {\n\n\t\t\tif ( enabledAttributes[ i ] !== newAttributes[ i ] ) {\n\n\t\t\t\tgl.disableVertexAttribArray( i );\n\t\t\t\tenabledAttributes[ i ] = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction vertexAttribPointer( index, size, type, normalized, stride, offset, integer ) {\n\n\t\tif ( integer === true ) {\n\n\t\t\tgl.vertexAttribIPointer( index, size, type, stride, offset );\n\n\t\t} else {\n\n\t\t\tgl.vertexAttribPointer( index, size, type, normalized, stride, offset );\n\n\t\t}\n\n\t}\n\n\tfunction setupVertexAttributes( object, material, program, geometry ) {\n\n\t\tinitAttributes();\n\n\t\tconst geometryAttributes = geometry.attributes;\n\n\t\tconst programAttributes = program.getAttributes();\n\n\t\tconst materialDefaultAttributeValues = material.defaultAttributeValues;\n\n\t\tfor ( const name in programAttributes ) {\n\n\t\t\tconst programAttribute = programAttributes[ name ];\n\n\t\t\tif ( programAttribute.location >= 0 ) {\n\n\t\t\t\tlet geometryAttribute = geometryAttributes[ name ];\n\n\t\t\t\tif ( geometryAttribute === undefined ) {\n\n\t\t\t\t\tif ( name === 'instanceMatrix' && object.instanceMatrix ) geometryAttribute = object.instanceMatrix;\n\t\t\t\t\tif ( name === 'instanceColor' && object.instanceColor ) geometryAttribute = object.instanceColor;\n\n\t\t\t\t}\n\n\t\t\t\tif ( geometryAttribute !== undefined ) {\n\n\t\t\t\t\tconst normalized = geometryAttribute.normalized;\n\t\t\t\t\tconst size = geometryAttribute.itemSize;\n\n\t\t\t\t\tconst attribute = attributes.get( geometryAttribute );\n\n\t\t\t\t\t// TODO Attribute may not be available on context restore\n\n\t\t\t\t\tif ( attribute === undefined ) continue;\n\n\t\t\t\t\tconst buffer = attribute.buffer;\n\t\t\t\t\tconst type = attribute.type;\n\t\t\t\t\tconst bytesPerElement = attribute.bytesPerElement;\n\n\t\t\t\t\t// check for integer attributes\n\n\t\t\t\t\tconst integer = ( type === gl.INT || type === gl.UNSIGNED_INT || geometryAttribute.gpuType === IntType );\n\n\t\t\t\t\tif ( geometryAttribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\t\t\tconst data = geometryAttribute.data;\n\t\t\t\t\t\tconst stride = data.stride;\n\t\t\t\t\t\tconst offset = geometryAttribute.offset;\n\n\t\t\t\t\t\tif ( data.isInstancedInterleavedBuffer ) {\n\n\t\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\t\tenableAttributeAndDivisor( programAttribute.location + i, data.meshPerAttribute );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( object.isInstancedMesh !== true && geometry._maxInstanceCount === undefined ) {\n\n\t\t\t\t\t\t\t\tgeometry._maxInstanceCount = data.meshPerAttribute * data.count;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\t\tenableAttribute( programAttribute.location + i );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, buffer );\n\n\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\tvertexAttribPointer(\n\t\t\t\t\t\t\t\tprogramAttribute.location + i,\n\t\t\t\t\t\t\t\tsize / programAttribute.locationSize,\n\t\t\t\t\t\t\t\ttype,\n\t\t\t\t\t\t\t\tnormalized,\n\t\t\t\t\t\t\t\tstride * bytesPerElement,\n\t\t\t\t\t\t\t\t( offset + ( size / programAttribute.locationSize ) * i ) * bytesPerElement,\n\t\t\t\t\t\t\t\tinteger\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( geometryAttribute.isInstancedBufferAttribute ) {\n\n\t\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\t\tenableAttributeAndDivisor( programAttribute.location + i, geometryAttribute.meshPerAttribute );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( object.isInstancedMesh !== true && geometry._maxInstanceCount === undefined ) {\n\n\t\t\t\t\t\t\t\tgeometry._maxInstanceCount = geometryAttribute.meshPerAttribute * geometryAttribute.count;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\t\tenableAttribute( programAttribute.location + i );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, buffer );\n\n\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\tvertexAttribPointer(\n\t\t\t\t\t\t\t\tprogramAttribute.location + i,\n\t\t\t\t\t\t\t\tsize / programAttribute.locationSize,\n\t\t\t\t\t\t\t\ttype,\n\t\t\t\t\t\t\t\tnormalized,\n\t\t\t\t\t\t\t\tsize * bytesPerElement,\n\t\t\t\t\t\t\t\t( size / programAttribute.locationSize ) * i * bytesPerElement,\n\t\t\t\t\t\t\t\tinteger\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( materialDefaultAttributeValues !== undefined ) {\n\n\t\t\t\t\tconst value = materialDefaultAttributeValues[ name ];\n\n\t\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\t\tswitch ( value.length ) {\n\n\t\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\t\tgl.vertexAttrib2fv( programAttribute.location, value );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\t\tgl.vertexAttrib3fv( programAttribute.location, value );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 4:\n\t\t\t\t\t\t\t\tgl.vertexAttrib4fv( programAttribute.location, value );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\tgl.vertexAttrib1fv( programAttribute.location, value );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tdisableUnusedAttributes();\n\n\t}\n\n\tfunction dispose() {\n\n\t\treset();\n\n\t\tfor ( const geometryId in bindingStates ) {\n\n\t\t\tconst programMap = bindingStates[ geometryId ];\n\n\t\t\tfor ( const programId in programMap ) {\n\n\t\t\t\tconst stateMap = programMap[ programId ];\n\n\t\t\t\tfor ( const wireframe in stateMap ) {\n\n\t\t\t\t\tdeleteVertexArrayObject( stateMap[ wireframe ].object );\n\n\t\t\t\t\tdelete stateMap[ wireframe ];\n\n\t\t\t\t}\n\n\t\t\t\tdelete programMap[ programId ];\n\n\t\t\t}\n\n\t\t\tdelete bindingStates[ geometryId ];\n\n\t\t}\n\n\t}\n\n\tfunction releaseStatesOfGeometry( geometry ) {\n\n\t\tif ( bindingStates[ geometry.id ] === undefined ) return;\n\n\t\tconst programMap = bindingStates[ geometry.id ];\n\n\t\tfor ( const programId in programMap ) {\n\n\t\t\tconst stateMap = programMap[ programId ];\n\n\t\t\tfor ( const wireframe in stateMap ) {\n\n\t\t\t\tdeleteVertexArrayObject( stateMap[ wireframe ].object );\n\n\t\t\t\tdelete stateMap[ wireframe ];\n\n\t\t\t}\n\n\t\t\tdelete programMap[ programId ];\n\n\t\t}\n\n\t\tdelete bindingStates[ geometry.id ];\n\n\t}\n\n\tfunction releaseStatesOfProgram( program ) {\n\n\t\tfor ( const geometryId in bindingStates ) {\n\n\t\t\tconst programMap = bindingStates[ geometryId ];\n\n\t\t\tif ( programMap[ program.id ] === undefined ) continue;\n\n\t\t\tconst stateMap = programMap[ program.id ];\n\n\t\t\tfor ( const wireframe in stateMap ) {\n\n\t\t\t\tdeleteVertexArrayObject( stateMap[ wireframe ].object );\n\n\t\t\t\tdelete stateMap[ wireframe ];\n\n\t\t\t}\n\n\t\t\tdelete programMap[ program.id ];\n\n\t\t}\n\n\t}\n\n\tfunction reset() {\n\n\t\tresetDefaultState();\n\t\tforceUpdate = true;\n\n\t\tif ( currentState === defaultState ) return;\n\n\t\tcurrentState = defaultState;\n\t\tbindVertexArrayObject( currentState.object );\n\n\t}\n\n\t// for backward-compatibility\n\n\tfunction resetDefaultState() {\n\n\t\tdefaultState.geometry = null;\n\t\tdefaultState.program = null;\n\t\tdefaultState.wireframe = false;\n\n\t}\n\n\treturn {\n\n\t\tsetup: setup,\n\t\treset: reset,\n\t\tresetDefaultState: resetDefaultState,\n\t\tdispose: dispose,\n\t\treleaseStatesOfGeometry: releaseStatesOfGeometry,\n\t\treleaseStatesOfProgram: releaseStatesOfProgram,\n\n\t\tinitAttributes: initAttributes,\n\t\tenableAttribute: enableAttribute,\n\t\tdisableUnusedAttributes: disableUnusedAttributes\n\n\t};\n\n}\n\nfunction WebGLBufferRenderer( gl, extensions, info ) {\n\n\tlet mode;\n\n\tfunction setMode( value ) {\n\n\t\tmode = value;\n\n\t}\n\n\tfunction render( start, count ) {\n\n\t\tgl.drawArrays( mode, start, count );\n\n\t\tinfo.update( count, mode, 1 );\n\n\t}\n\n\tfunction renderInstances( start, count, primcount ) {\n\n\t\tif ( primcount === 0 ) return;\n\n\t\tgl.drawArraysInstanced( mode, start, count, primcount );\n\n\t\tinfo.update( count, mode, primcount );\n\n\t}\n\n\tfunction renderMultiDraw( starts, counts, drawCount ) {\n\n\t\tif ( drawCount === 0 ) return;\n\n\t\tconst extension = extensions.get( 'WEBGL_multi_draw' );\n\t\textension.multiDrawArraysWEBGL( mode, starts, 0, counts, 0, drawCount );\n\n\t\tlet elementCount = 0;\n\t\tfor ( let i = 0; i < drawCount; i ++ ) {\n\n\t\t\telementCount += counts[ i ];\n\n\t\t}\n\n\t\tinfo.update( elementCount, mode, 1 );\n\n\t}\n\n\tfunction renderMultiDrawInstances( starts, counts, drawCount, primcount ) {\n\n\t\tif ( drawCount === 0 ) return;\n\n\t\tconst extension = extensions.get( 'WEBGL_multi_draw' );\n\n\t\tif ( extension === null ) {\n\n\t\t\tfor ( let i = 0; i < starts.length; i ++ ) {\n\n\t\t\t\trenderInstances( starts[ i ], counts[ i ], primcount[ i ] );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\textension.multiDrawArraysInstancedWEBGL( mode, starts, 0, counts, 0, primcount, 0, drawCount );\n\n\t\t\tlet elementCount = 0;\n\t\t\tfor ( let i = 0; i < drawCount; i ++ ) {\n\n\t\t\t\telementCount += counts[ i ] * primcount[ i ];\n\n\t\t\t}\n\n\t\t\tinfo.update( elementCount, mode, 1 );\n\n\t\t}\n\n\t}\n\n\t//\n\n\tthis.setMode = setMode;\n\tthis.render = render;\n\tthis.renderInstances = renderInstances;\n\tthis.renderMultiDraw = renderMultiDraw;\n\tthis.renderMultiDrawInstances = renderMultiDrawInstances;\n\n}\n\nfunction WebGLCapabilities( gl, extensions, parameters, utils ) {\n\n\tlet maxAnisotropy;\n\n\tfunction getMaxAnisotropy() {\n\n\t\tif ( maxAnisotropy !== undefined ) return maxAnisotropy;\n\n\t\tif ( extensions.has( 'EXT_texture_filter_anisotropic' ) === true ) {\n\n\t\t\tconst extension = extensions.get( 'EXT_texture_filter_anisotropic' );\n\n\t\t\tmaxAnisotropy = gl.getParameter( extension.MAX_TEXTURE_MAX_ANISOTROPY_EXT );\n\n\t\t} else {\n\n\t\t\tmaxAnisotropy = 0;\n\n\t\t}\n\n\t\treturn maxAnisotropy;\n\n\t}\n\n\tfunction textureFormatReadable( textureFormat ) {\n\n\t\tif ( textureFormat !== RGBAFormat && utils.convert( textureFormat ) !== gl.getParameter( gl.IMPLEMENTATION_COLOR_READ_FORMAT ) ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tfunction textureTypeReadable( textureType ) {\n\n\t\tconst halfFloatSupportedByExt = ( textureType === HalfFloatType ) && ( extensions.has( 'EXT_color_buffer_half_float' ) || extensions.has( 'EXT_color_buffer_float' ) );\n\n\t\tif ( textureType !== UnsignedByteType && utils.convert( textureType ) !== gl.getParameter( gl.IMPLEMENTATION_COLOR_READ_TYPE ) && // Edge and Chrome Mac < 52 (#9513)\n\t\t\ttextureType !== FloatType && ! halfFloatSupportedByExt ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tfunction getMaxPrecision( precision ) {\n\n\t\tif ( precision === 'highp' ) {\n\n\t\t\tif ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.HIGH_FLOAT ).precision > 0 &&\n\t\t\t\tgl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.HIGH_FLOAT ).precision > 0 ) {\n\n\t\t\t\treturn 'highp';\n\n\t\t\t}\n\n\t\t\tprecision = 'mediump';\n\n\t\t}\n\n\t\tif ( precision === 'mediump' ) {\n\n\t\t\tif ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.MEDIUM_FLOAT ).precision > 0 &&\n\t\t\t\tgl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT ).precision > 0 ) {\n\n\t\t\t\treturn 'mediump';\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn 'lowp';\n\n\t}\n\n\tlet precision = parameters.precision !== undefined ? parameters.precision : 'highp';\n\tconst maxPrecision = getMaxPrecision( precision );\n\n\tif ( maxPrecision !== precision ) {\n\n\t\twarn( 'WebGLRenderer:', precision, 'not supported, using', maxPrecision, 'instead.' );\n\t\tprecision = maxPrecision;\n\n\t}\n\n\tconst logarithmicDepthBuffer = parameters.logarithmicDepthBuffer === true;\n\tconst reversedDepthBuffer = parameters.reversedDepthBuffer === true && extensions.has( 'EXT_clip_control' );\n\n\tconst maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS );\n\tconst maxVertexTextures = gl.getParameter( gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS );\n\tconst maxTextureSize = gl.getParameter( gl.MAX_TEXTURE_SIZE );\n\tconst maxCubemapSize = gl.getParameter( gl.MAX_CUBE_MAP_TEXTURE_SIZE );\n\n\tconst maxAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS );\n\tconst maxVertexUniforms = gl.getParameter( gl.MAX_VERTEX_UNIFORM_VECTORS );\n\tconst maxVaryings = gl.getParameter( gl.MAX_VARYING_VECTORS );\n\tconst maxFragmentUniforms = gl.getParameter( gl.MAX_FRAGMENT_UNIFORM_VECTORS );\n\n\tconst vertexTextures = maxVertexTextures > 0;\n\n\tconst maxSamples = gl.getParameter( gl.MAX_SAMPLES );\n\n\treturn {\n\n\t\tisWebGL2: true, // keeping this for backwards compatibility\n\n\t\tgetMaxAnisotropy: getMaxAnisotropy,\n\t\tgetMaxPrecision: getMaxPrecision,\n\n\t\ttextureFormatReadable: textureFormatReadable,\n\t\ttextureTypeReadable: textureTypeReadable,\n\n\t\tprecision: precision,\n\t\tlogarithmicDepthBuffer: logarithmicDepthBuffer,\n\t\treversedDepthBuffer: reversedDepthBuffer,\n\n\t\tmaxTextures: maxTextures,\n\t\tmaxVertexTextures: maxVertexTextures,\n\t\tmaxTextureSize: maxTextureSize,\n\t\tmaxCubemapSize: maxCubemapSize,\n\n\t\tmaxAttributes: maxAttributes,\n\t\tmaxVertexUniforms: maxVertexUniforms,\n\t\tmaxVaryings: maxVaryings,\n\t\tmaxFragmentUniforms: maxFragmentUniforms,\n\n\t\tvertexTextures: vertexTextures,\n\n\t\tmaxSamples: maxSamples\n\n\t};\n\n}\n\nfunction WebGLClipping( properties ) {\n\n\tconst scope = this;\n\n\tlet globalState = null,\n\t\tnumGlobalPlanes = 0,\n\t\tlocalClippingEnabled = false,\n\t\trenderingShadows = false;\n\n\tconst plane = new Plane(),\n\t\tviewNormalMatrix = new Matrix3(),\n\n\t\tuniform = { value: null, needsUpdate: false };\n\n\tthis.uniform = uniform;\n\tthis.numPlanes = 0;\n\tthis.numIntersection = 0;\n\n\tthis.init = function ( planes, enableLocalClipping ) {\n\n\t\tconst enabled =\n\t\t\tplanes.length !== 0 ||\n\t\t\tenableLocalClipping ||\n\t\t\t// enable state of previous frame - the clipping code has to\n\t\t\t// run another frame in order to reset the state:\n\t\t\tnumGlobalPlanes !== 0 ||\n\t\t\tlocalClippingEnabled;\n\n\t\tlocalClippingEnabled = enableLocalClipping;\n\n\t\tnumGlobalPlanes = planes.length;\n\n\t\treturn enabled;\n\n\t};\n\n\tthis.beginShadows = function () {\n\n\t\trenderingShadows = true;\n\t\tprojectPlanes( null );\n\n\t};\n\n\tthis.endShadows = function () {\n\n\t\trenderingShadows = false;\n\n\t};\n\n\tthis.setGlobalState = function ( planes, camera ) {\n\n\t\tglobalState = projectPlanes( planes, camera, 0 );\n\n\t};\n\n\tthis.setState = function ( material, camera, useCache ) {\n\n\t\tconst planes = material.clippingPlanes,\n\t\t\tclipIntersection = material.clipIntersection,\n\t\t\tclipShadows = material.clipShadows;\n\n\t\tconst materialProperties = properties.get( material );\n\n\t\tif ( ! localClippingEnabled || planes === null || planes.length === 0 || renderingShadows && ! clipShadows ) {\n\n\t\t\t// there's no local clipping\n\n\t\t\tif ( renderingShadows ) {\n\n\t\t\t\t// there's no global clipping\n\n\t\t\t\tprojectPlanes( null );\n\n\t\t\t} else {\n\n\t\t\t\tresetGlobalState();\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst nGlobal = renderingShadows ? 0 : numGlobalPlanes,\n\t\t\t\tlGlobal = nGlobal * 4;\n\n\t\t\tlet dstArray = materialProperties.clippingState || null;\n\n\t\t\tuniform.value = dstArray; // ensure unique state\n\n\t\t\tdstArray = projectPlanes( planes, camera, lGlobal, useCache );\n\n\t\t\tfor ( let i = 0; i !== lGlobal; ++ i ) {\n\n\t\t\t\tdstArray[ i ] = globalState[ i ];\n\n\t\t\t}\n\n\t\t\tmaterialProperties.clippingState = dstArray;\n\t\t\tthis.numIntersection = clipIntersection ? this.numPlanes : 0;\n\t\t\tthis.numPlanes += nGlobal;\n\n\t\t}\n\n\n\t};\n\n\tfunction resetGlobalState() {\n\n\t\tif ( uniform.value !== globalState ) {\n\n\t\t\tuniform.value = globalState;\n\t\t\tuniform.needsUpdate = numGlobalPlanes > 0;\n\n\t\t}\n\n\t\tscope.numPlanes = numGlobalPlanes;\n\t\tscope.numIntersection = 0;\n\n\t}\n\n\tfunction projectPlanes( planes, camera, dstOffset, skipTransform ) {\n\n\t\tconst nPlanes = planes !== null ? planes.length : 0;\n\t\tlet dstArray = null;\n\n\t\tif ( nPlanes !== 0 ) {\n\n\t\t\tdstArray = uniform.value;\n\n\t\t\tif ( skipTransform !== true || dstArray === null ) {\n\n\t\t\t\tconst flatSize = dstOffset + nPlanes * 4,\n\t\t\t\t\tviewMatrix = camera.matrixWorldInverse;\n\n\t\t\t\tviewNormalMatrix.getNormalMatrix( viewMatrix );\n\n\t\t\t\tif ( dstArray === null || dstArray.length < flatSize ) {\n\n\t\t\t\t\tdstArray = new Float32Array( flatSize );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0, i4 = dstOffset; i !== nPlanes; ++ i, i4 += 4 ) {\n\n\t\t\t\t\tplane.copy( planes[ i ] ).applyMatrix4( viewMatrix, viewNormalMatrix );\n\n\t\t\t\t\tplane.normal.toArray( dstArray, i4 );\n\t\t\t\t\tdstArray[ i4 + 3 ] = plane.constant;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tuniform.value = dstArray;\n\t\t\tuniform.needsUpdate = true;\n\n\t\t}\n\n\t\tscope.numPlanes = nPlanes;\n\t\tscope.numIntersection = 0;\n\n\t\treturn dstArray;\n\n\t}\n\n}\n\nfunction WebGLCubeMaps( renderer ) {\n\n\tlet cubemaps = new WeakMap();\n\n\tfunction mapTextureMapping( texture, mapping ) {\n\n\t\tif ( mapping === EquirectangularReflectionMapping ) {\n\n\t\t\ttexture.mapping = CubeReflectionMapping;\n\n\t\t} else if ( mapping === EquirectangularRefractionMapping ) {\n\n\t\t\ttexture.mapping = CubeRefractionMapping;\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\tfunction get( texture ) {\n\n\t\tif ( texture && texture.isTexture ) {\n\n\t\t\tconst mapping = texture.mapping;\n\n\t\t\tif ( mapping === EquirectangularReflectionMapping || mapping === EquirectangularRefractionMapping ) {\n\n\t\t\t\tif ( cubemaps.has( texture ) ) {\n\n\t\t\t\t\tconst cubemap = cubemaps.get( texture ).texture;\n\t\t\t\t\treturn mapTextureMapping( cubemap, texture.mapping );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconst image = texture.image;\n\n\t\t\t\t\tif ( image && image.height > 0 ) {\n\n\t\t\t\t\t\tconst renderTarget = new WebGLCubeRenderTarget( image.height );\n\t\t\t\t\t\trenderTarget.fromEquirectangularTexture( renderer, texture );\n\t\t\t\t\t\tcubemaps.set( texture, renderTarget );\n\n\t\t\t\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t\t\t\t\treturn mapTextureMapping( renderTarget.texture, texture.mapping );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// image not yet ready. try the conversion next frame\n\n\t\t\t\t\t\treturn null;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\tfunction onTextureDispose( event ) {\n\n\t\tconst texture = event.target;\n\n\t\ttexture.removeEventListener( 'dispose', onTextureDispose );\n\n\t\tconst cubemap = cubemaps.get( texture );\n\n\t\tif ( cubemap !== undefined ) {\n\n\t\t\tcubemaps.delete( texture );\n\t\t\tcubemap.dispose();\n\n\t\t}\n\n\t}\n\n\tfunction dispose() {\n\n\t\tcubemaps = new WeakMap();\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\nconst LOD_MIN = 4;\n\n// The standard deviations (radians) associated with the extra mips.\n// Used for scene blur in fromScene() method.\nconst EXTRA_LOD_SIGMA = [ 0.125, 0.215, 0.35, 0.446, 0.526, 0.582 ];\n\n// The maximum length of the blur for loop. Smaller sigmas will use fewer\n// samples and exit early, but not recompile the shader.\n// Used for scene blur in fromScene() method.\nconst MAX_SAMPLES = 20;\n\n// GGX VNDF importance sampling configuration\nconst GGX_SAMPLES = 256;\n\nconst _flatCamera = /*@__PURE__*/ new OrthographicCamera();\nconst _clearColor = /*@__PURE__*/ new Color();\nlet _oldTarget = null;\nlet _oldActiveCubeFace = 0;\nlet _oldActiveMipmapLevel = 0;\nlet _oldXrEnabled = false;\n\nconst _origin = /*@__PURE__*/ new Vector3();\n\n/**\n * This class generates a Prefiltered, Mipmapped Radiance Environment Map\n * (PMREM) from a cubeMap environment texture. This allows different levels of\n * blur to be quickly accessed based on material roughness. It is packed into a\n * special CubeUV format that allows us to perform custom interpolation so that\n * we can support nonlinear formats such as RGBE. Unlike a traditional mipmap\n * chain, it only goes down to the LOD_MIN level (above), and then creates extra\n * even more filtered 'mips' at the same LOD_MIN resolution, associated with\n * higher roughness levels. In this way we maintain resolution to smoothly\n * interpolate diffuse lighting while limiting sampling computation.\n *\n * The prefiltering uses GGX VNDF (Visible Normal Distribution Function)\n * importance sampling based on \"Sampling the GGX Distribution of Visible Normals\"\n * (Heitz, 2018) to generate environment maps that accurately match the GGX BRDF\n * used in material rendering for physically-based image-based lighting.\n */\nclass PMREMGenerator {\n\n\t/**\n\t * Constructs a new PMREM generator.\n\t *\n\t * @param {WebGLRenderer} renderer - The renderer.\n\t */\n\tconstructor( renderer ) {\n\n\t\tthis._renderer = renderer;\n\t\tthis._pingPongRenderTarget = null;\n\n\t\tthis._lodMax = 0;\n\t\tthis._cubeSize = 0;\n\t\tthis._sizeLods = [];\n\t\tthis._sigmas = [];\n\t\tthis._lodMeshes = [];\n\n\t\tthis._backgroundBox = null;\n\n\t\tthis._cubemapMaterial = null;\n\t\tthis._equirectMaterial = null;\n\n\t\tthis._blurMaterial = null;\n\t\tthis._ggxMaterial = null;\n\n\t}\n\n\t/**\n\t * Generates a PMREM from a supplied Scene, which can be faster than using an\n\t * image if networking bandwidth is low. Optional sigma specifies a blur radius\n\t * in radians to be applied to the scene before PMREM generation. Optional near\n\t * and far planes ensure the scene is rendered in its entirety.\n\t *\n\t * @param {Scene} scene - The scene to be captured.\n\t * @param {number} [sigma=0] - The blur radius in radians.\n\t * @param {number} [near=0.1] - The near plane distance.\n\t * @param {number} [far=100] - The far plane distance.\n\t * @param {Object} [options={}] - The configuration options.\n\t * @param {number} [options.size=256] - The texture size of the PMREM.\n\t * @param {Vector3} [options.renderTarget=origin] - The position of the internal cube camera that renders the scene.\n\t * @return {WebGLRenderTarget} The resulting PMREM.\n\t */\n\tfromScene( scene, sigma = 0, near = 0.1, far = 100, options = {} ) {\n\n\t\tconst {\n\t\t\tsize = 256,\n\t\t\tposition = _origin,\n\t\t} = options;\n\n\t\t_oldTarget = this._renderer.getRenderTarget();\n\t\t_oldActiveCubeFace = this._renderer.getActiveCubeFace();\n\t\t_oldActiveMipmapLevel = this._renderer.getActiveMipmapLevel();\n\t\t_oldXrEnabled = this._renderer.xr.enabled;\n\n\t\tthis._renderer.xr.enabled = false;\n\n\t\tthis._setSize( size );\n\n\t\tconst cubeUVRenderTarget = this._allocateTargets();\n\t\tcubeUVRenderTarget.depthBuffer = true;\n\n\t\tthis._sceneToCubeUV( scene, near, far, cubeUVRenderTarget, position );\n\n\t\tif ( sigma > 0 ) {\n\n\t\t\tthis._blur( cubeUVRenderTarget, 0, 0, sigma );\n\n\t\t}\n\n\t\tthis._applyPMREM( cubeUVRenderTarget );\n\t\tthis._cleanup( cubeUVRenderTarget );\n\n\t\treturn cubeUVRenderTarget;\n\n\t}\n\n\t/**\n\t * Generates a PMREM from an equirectangular texture, which can be either LDR\n\t * or HDR. The ideal input image size is 1k (1024 x 512),\n\t * as this matches best with the 256 x 256 cubemap output.\n\t *\n\t * @param {Texture} equirectangular - The equirectangular texture to be converted.\n\t * @param {?WebGLRenderTarget} [renderTarget=null] - The render target to use.\n\t * @return {WebGLRenderTarget} The resulting PMREM.\n\t */\n\tfromEquirectangular( equirectangular, renderTarget = null ) {\n\n\t\treturn this._fromTexture( equirectangular, renderTarget );\n\n\t}\n\n\t/**\n\t * Generates a PMREM from an cubemap texture, which can be either LDR\n\t * or HDR. The ideal input cube size is 256 x 256,\n\t * as this matches best with the 256 x 256 cubemap output.\n\t *\n\t * @param {Texture} cubemap - The cubemap texture to be converted.\n\t * @param {?WebGLRenderTarget} [renderTarget=null] - The render target to use.\n\t * @return {WebGLRenderTarget} The resulting PMREM.\n\t */\n\tfromCubemap( cubemap, renderTarget = null ) {\n\n\t\treturn this._fromTexture( cubemap, renderTarget );\n\n\t}\n\n\t/**\n\t * Pre-compiles the cubemap shader. You can get faster start-up by invoking this method during\n\t * your texture's network fetch for increased concurrency.\n\t */\n\tcompileCubemapShader() {\n\n\t\tif ( this._cubemapMaterial === null ) {\n\n\t\t\tthis._cubemapMaterial = _getCubemapMaterial();\n\t\t\tthis._compileMaterial( this._cubemapMaterial );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Pre-compiles the equirectangular shader. You can get faster start-up by invoking this method during\n\t * your texture's network fetch for increased concurrency.\n\t */\n\tcompileEquirectangularShader() {\n\n\t\tif ( this._equirectMaterial === null ) {\n\n\t\t\tthis._equirectMaterial = _getEquirectMaterial();\n\t\t\tthis._compileMaterial( this._equirectMaterial );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Disposes of the PMREMGenerator's internal memory. Note that PMREMGenerator is a static class,\n\t * so you should not need more than one PMREMGenerator object. If you do, calling dispose() on\n\t * one of them will cause any others to also become unusable.\n\t */\n\tdispose() {\n\n\t\tthis._dispose();\n\n\t\tif ( this._cubemapMaterial !== null ) this._cubemapMaterial.dispose();\n\t\tif ( this._equirectMaterial !== null ) this._equirectMaterial.dispose();\n\n\t\tif ( this._backgroundBox !== null ) {\n\n\t\t\tthis._backgroundBox.geometry.dispose();\n\t\t\tthis._backgroundBox.material.dispose();\n\n\t\t}\n\n\t}\n\n\t// private interface\n\n\t_setSize( cubeSize ) {\n\n\t\tthis._lodMax = Math.floor( Math.log2( cubeSize ) );\n\t\tthis._cubeSize = Math.pow( 2, this._lodMax );\n\n\t}\n\n\t_dispose() {\n\n\t\tif ( this._blurMaterial !== null ) this._blurMaterial.dispose();\n\t\tif ( this._ggxMaterial !== null ) this._ggxMaterial.dispose();\n\n\t\tif ( this._pingPongRenderTarget !== null ) this._pingPongRenderTarget.dispose();\n\n\t\tfor ( let i = 0; i < this._lodMeshes.length; i ++ ) {\n\n\t\t\tthis._lodMeshes[ i ].geometry.dispose();\n\n\t\t}\n\n\t}\n\n\t_cleanup( outputTarget ) {\n\n\t\tthis._renderer.setRenderTarget( _oldTarget, _oldActiveCubeFace, _oldActiveMipmapLevel );\n\t\tthis._renderer.xr.enabled = _oldXrEnabled;\n\n\t\toutputTarget.scissorTest = false;\n\t\t_setViewport( outputTarget, 0, 0, outputTarget.width, outputTarget.height );\n\n\t}\n\n\t_fromTexture( texture, renderTarget ) {\n\n\t\tif ( texture.mapping === CubeReflectionMapping || texture.mapping === CubeRefractionMapping ) {\n\n\t\t\tthis._setSize( texture.image.length === 0 ? 16 : ( texture.image[ 0 ].width || texture.image[ 0 ].image.width ) );\n\n\t\t} else { // Equirectangular\n\n\t\t\tthis._setSize( texture.image.width / 4 );\n\n\t\t}\n\n\t\t_oldTarget = this._renderer.getRenderTarget();\n\t\t_oldActiveCubeFace = this._renderer.getActiveCubeFace();\n\t\t_oldActiveMipmapLevel = this._renderer.getActiveMipmapLevel();\n\t\t_oldXrEnabled = this._renderer.xr.enabled;\n\n\t\tthis._renderer.xr.enabled = false;\n\n\t\tconst cubeUVRenderTarget = renderTarget || this._allocateTargets();\n\t\tthis._textureToCubeUV( texture, cubeUVRenderTarget );\n\t\tthis._applyPMREM( cubeUVRenderTarget );\n\t\tthis._cleanup( cubeUVRenderTarget );\n\n\t\treturn cubeUVRenderTarget;\n\n\t}\n\n\t_allocateTargets() {\n\n\t\tconst width = 3 * Math.max( this._cubeSize, 16 * 7 );\n\t\tconst height = 4 * this._cubeSize;\n\n\t\tconst params = {\n\t\t\tmagFilter: LinearFilter,\n\t\t\tminFilter: LinearFilter,\n\t\t\tgenerateMipmaps: false,\n\t\t\ttype: HalfFloatType,\n\t\t\tformat: RGBAFormat,\n\t\t\tcolorSpace: LinearSRGBColorSpace,\n\t\t\tdepthBuffer: false\n\t\t};\n\n\t\tconst cubeUVRenderTarget = _createRenderTarget( width, height, params );\n\n\t\tif ( this._pingPongRenderTarget === null || this._pingPongRenderTarget.width !== width || this._pingPongRenderTarget.height !== height ) {\n\n\t\t\tif ( this._pingPongRenderTarget !== null ) {\n\n\t\t\t\tthis._dispose();\n\n\t\t\t}\n\n\t\t\tthis._pingPongRenderTarget = _createRenderTarget( width, height, params );\n\n\t\t\tconst { _lodMax } = this;\n\t\t\t( { lodMeshes: this._lodMeshes, sizeLods: this._sizeLods, sigmas: this._sigmas } = _createPlanes( _lodMax ) );\n\n\t\t\tthis._blurMaterial = _getBlurShader( _lodMax, width, height );\n\t\t\tthis._ggxMaterial = _getGGXShader( _lodMax, width, height );\n\n\t\t}\n\n\t\treturn cubeUVRenderTarget;\n\n\t}\n\n\t_compileMaterial( material ) {\n\n\t\tconst mesh = new Mesh( new BufferGeometry(), material );\n\t\tthis._renderer.compile( mesh, _flatCamera );\n\n\t}\n\n\t_sceneToCubeUV( scene, near, far, cubeUVRenderTarget, position ) {\n\n\t\tconst fov = 90;\n\t\tconst aspect = 1;\n\t\tconst cubeCamera = new PerspectiveCamera( fov, aspect, near, far );\n\t\tconst upSign = [ 1, -1, 1, 1, 1, 1 ];\n\t\tconst forwardSign = [ 1, 1, 1, -1, -1, -1 ];\n\t\tconst renderer = this._renderer;\n\n\t\tconst originalAutoClear = renderer.autoClear;\n\t\tconst toneMapping = renderer.toneMapping;\n\t\trenderer.getClearColor( _clearColor );\n\n\t\trenderer.toneMapping = NoToneMapping;\n\t\trenderer.autoClear = false;\n\n\t\t// https://github.com/mrdoob/three.js/issues/31413#issuecomment-3095966812\n\t\tconst reversedDepthBuffer = renderer.state.buffers.depth.getReversed();\n\n\t\tif ( reversedDepthBuffer ) {\n\n\t\t\trenderer.setRenderTarget( cubeUVRenderTarget );\n\t\t\trenderer.clearDepth();\n\t\t\trenderer.setRenderTarget( null );\n\n\t\t}\n\n\t\tif ( this._backgroundBox === null ) {\n\n\t\t\tthis._backgroundBox = new Mesh(\n\t\t\t\tnew BoxGeometry(),\n\t\t\t\tnew MeshBasicMaterial( {\n\t\t\t\t\tname: 'PMREM.Background',\n\t\t\t\t\tside: BackSide,\n\t\t\t\t\tdepthWrite: false,\n\t\t\t\t\tdepthTest: false,\n\t\t\t\t} )\n\t\t\t);\n\n\t\t}\n\n\t\tconst backgroundBox = this._backgroundBox;\n\t\tconst backgroundMaterial = backgroundBox.material;\n\n\t\tlet useSolidColor = false;\n\n\t\tconst background = scene.background;\n\n\t\tif ( background ) {\n\n\t\t\tif ( background.isColor ) {\n\n\t\t\t\tbackgroundMaterial.color.copy( background );\n\t\t\t\tscene.background = null;\n\t\t\t\tuseSolidColor = true;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tbackgroundMaterial.color.copy( _clearColor );\n\t\t\tuseSolidColor = true;\n\n\t\t}\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tconst col = i % 3;\n\n\t\t\tif ( col === 0 ) {\n\n\t\t\t\tcubeCamera.up.set( 0, upSign[ i ], 0 );\n\t\t\t\tcubeCamera.position.set( position.x, position.y, position.z );\n\t\t\t\tcubeCamera.lookAt( position.x + forwardSign[ i ], position.y, position.z );\n\n\t\t\t} else if ( col === 1 ) {\n\n\t\t\t\tcubeCamera.up.set( 0, 0, upSign[ i ] );\n\t\t\t\tcubeCamera.position.set( position.x, position.y, position.z );\n\t\t\t\tcubeCamera.lookAt( position.x, position.y + forwardSign[ i ], position.z );\n\n\n\t\t\t} else {\n\n\t\t\t\tcubeCamera.up.set( 0, upSign[ i ], 0 );\n\t\t\t\tcubeCamera.position.set( position.x, position.y, position.z );\n\t\t\t\tcubeCamera.lookAt( position.x, position.y, position.z + forwardSign[ i ] );\n\n\t\t\t}\n\n\t\t\tconst size = this._cubeSize;\n\n\t\t\t_setViewport( cubeUVRenderTarget, col * size, i > 2 ? size : 0, size, size );\n\n\t\t\trenderer.setRenderTarget( cubeUVRenderTarget );\n\n\t\t\tif ( useSolidColor ) {\n\n\t\t\t\trenderer.render( backgroundBox, cubeCamera );\n\n\t\t\t}\n\n\t\t\trenderer.render( scene, cubeCamera );\n\n\t\t}\n\n\t\trenderer.toneMapping = toneMapping;\n\t\trenderer.autoClear = originalAutoClear;\n\t\tscene.background = background;\n\n\t}\n\n\t_textureToCubeUV( texture, cubeUVRenderTarget ) {\n\n\t\tconst renderer = this._renderer;\n\n\t\tconst isCubeTexture = ( texture.mapping === CubeReflectionMapping || texture.mapping === CubeRefractionMapping );\n\n\t\tif ( isCubeTexture ) {\n\n\t\t\tif ( this._cubemapMaterial === null ) {\n\n\t\t\t\tthis._cubemapMaterial = _getCubemapMaterial();\n\n\t\t\t}\n\n\t\t\tthis._cubemapMaterial.uniforms.flipEnvMap.value = ( texture.isRenderTargetTexture === false ) ? -1 : 1;\n\n\t\t} else {\n\n\t\t\tif ( this._equirectMaterial === null ) {\n\n\t\t\t\tthis._equirectMaterial = _getEquirectMaterial();\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst material = isCubeTexture ? this._cubemapMaterial : this._equirectMaterial;\n\n\t\tconst mesh = this._lodMeshes[ 0 ];\n\t\tmesh.material = material;\n\n\t\tconst uniforms = material.uniforms;\n\n\t\tuniforms[ 'envMap' ].value = texture;\n\n\t\tconst size = this._cubeSize;\n\n\t\t_setViewport( cubeUVRenderTarget, 0, 0, 3 * size, 2 * size );\n\n\t\trenderer.setRenderTarget( cubeUVRenderTarget );\n\t\trenderer.render( mesh, _flatCamera );\n\n\t}\n\n\t_applyPMREM( cubeUVRenderTarget ) {\n\n\t\tconst renderer = this._renderer;\n\t\tconst autoClear = renderer.autoClear;\n\t\trenderer.autoClear = false;\n\n\t\tconst n = this._lodMeshes.length;\n\n\t\t// Use GGX VNDF importance sampling\n\t\tfor ( let i = 1; i < n; i ++ ) {\n\n\t\t\tthis._applyGGXFilter( cubeUVRenderTarget, i - 1, i );\n\n\t\t}\n\n\t\trenderer.autoClear = autoClear;\n\n\t}\n\n\t/**\n\t * Applies GGX VNDF importance sampling filter to generate a prefiltered environment map.\n\t * Uses Monte Carlo integration with VNDF importance sampling to accurately represent the\n\t * GGX BRDF for physically-based rendering. Reads from the previous LOD level and\n\t * applies incremental roughness filtering to avoid over-blurring.\n\t *\n\t * @private\n\t * @param {WebGLRenderTarget} cubeUVRenderTarget\n\t * @param {number} lodIn - Source LOD level to read from\n\t * @param {number} lodOut - Target LOD level to write to\n\t */\n\t_applyGGXFilter( cubeUVRenderTarget, lodIn, lodOut ) {\n\n\t\tconst renderer = this._renderer;\n\t\tconst pingPongRenderTarget = this._pingPongRenderTarget;\n\n\t\tconst ggxMaterial = this._ggxMaterial;\n\t\tconst ggxMesh = this._lodMeshes[ lodOut ];\n\t\tggxMesh.material = ggxMaterial;\n\n\t\tconst ggxUniforms = ggxMaterial.uniforms;\n\n\t\t// Calculate incremental roughness between LOD levels\n\t\tconst targetRoughness = lodOut / ( this._lodMeshes.length - 1 );\n\t\tconst sourceRoughness = lodIn / ( this._lodMeshes.length - 1 );\n\t\tconst incrementalRoughness = Math.sqrt( targetRoughness * targetRoughness - sourceRoughness * sourceRoughness );\n\n\t\t// Apply blur strength mapping for better quality across the roughness range\n\t\tconst blurStrength = 0.05 + targetRoughness * 0.95;\n\t\tconst adjustedRoughness = incrementalRoughness * blurStrength;\n\n\t\t// Calculate viewport position based on output LOD level\n\t\tconst { _lodMax } = this;\n\t\tconst outputSize = this._sizeLods[ lodOut ];\n\t\tconst x = 3 * outputSize * ( lodOut > _lodMax - LOD_MIN ? lodOut - _lodMax + LOD_MIN : 0 );\n\t\tconst y = 4 * ( this._cubeSize - outputSize );\n\n\t\t// Read from previous LOD with incremental roughness\n\t\tggxUniforms[ 'envMap' ].value = cubeUVRenderTarget.texture;\n\t\tggxUniforms[ 'roughness' ].value = adjustedRoughness;\n\t\tggxUniforms[ 'mipInt' ].value = _lodMax - lodIn; // Sample from input LOD\n\n\t\t_setViewport( pingPongRenderTarget, x, y, 3 * outputSize, 2 * outputSize );\n\t\trenderer.setRenderTarget( pingPongRenderTarget );\n\t\trenderer.render( ggxMesh, _flatCamera );\n\n\t\t// Copy from pingPong back to cubeUV (simple direct copy)\n\t\tggxUniforms[ 'envMap' ].value = pingPongRenderTarget.texture;\n\t\tggxUniforms[ 'roughness' ].value = 0.0; // Direct copy\n\t\tggxUniforms[ 'mipInt' ].value = _lodMax - lodOut; // Read from the level we just wrote\n\n\t\t_setViewport( cubeUVRenderTarget, x, y, 3 * outputSize, 2 * outputSize );\n\t\trenderer.setRenderTarget( cubeUVRenderTarget );\n\t\trenderer.render( ggxMesh, _flatCamera );\n\n\t}\n\n\t/**\n\t * This is a two-pass Gaussian blur for a cubemap. Normally this is done\n\t * vertically and horizontally, but this breaks down on a cube. Here we apply\n\t * the blur latitudinally (around the poles), and then longitudinally (towards\n\t * the poles) to approximate the orthogonally-separable blur. It is least\n\t * accurate at the poles, but still does a decent job.\n\t *\n\t * Used for initial scene blur in fromScene() method when sigma > 0.\n\t *\n\t * @private\n\t * @param {WebGLRenderTarget} cubeUVRenderTarget\n\t * @param {number} lodIn\n\t * @param {number} lodOut\n\t * @param {number} sigma\n\t * @param {Vector3} [poleAxis]\n\t */\n\t_blur( cubeUVRenderTarget, lodIn, lodOut, sigma, poleAxis ) {\n\n\t\tconst pingPongRenderTarget = this._pingPongRenderTarget;\n\n\t\tthis._halfBlur(\n\t\t\tcubeUVRenderTarget,\n\t\t\tpingPongRenderTarget,\n\t\t\tlodIn,\n\t\t\tlodOut,\n\t\t\tsigma,\n\t\t\t'latitudinal',\n\t\t\tpoleAxis );\n\n\t\tthis._halfBlur(\n\t\t\tpingPongRenderTarget,\n\t\t\tcubeUVRenderTarget,\n\t\t\tlodOut,\n\t\t\tlodOut,\n\t\t\tsigma,\n\t\t\t'longitudinal',\n\t\t\tpoleAxis );\n\n\t}\n\n\t_halfBlur( targetIn, targetOut, lodIn, lodOut, sigmaRadians, direction, poleAxis ) {\n\n\t\tconst renderer = this._renderer;\n\t\tconst blurMaterial = this._blurMaterial;\n\n\t\tif ( direction !== 'latitudinal' && direction !== 'longitudinal' ) {\n\n\t\t\terror(\n\t\t\t\t'blur direction must be either latitudinal or longitudinal!' );\n\n\t\t}\n\n\t\t// Number of standard deviations at which to cut off the discrete approximation.\n\t\tconst STANDARD_DEVIATIONS = 3;\n\n\t\tconst blurMesh = this._lodMeshes[ lodOut ];\n\t\tblurMesh.material = blurMaterial;\n\n\t\tconst blurUniforms = blurMaterial.uniforms;\n\n\t\tconst pixels = this._sizeLods[ lodIn ] - 1;\n\t\tconst radiansPerPixel = isFinite( sigmaRadians ) ? Math.PI / ( 2 * pixels ) : 2 * Math.PI / ( 2 * MAX_SAMPLES - 1 );\n\t\tconst sigmaPixels = sigmaRadians / radiansPerPixel;\n\t\tconst samples = isFinite( sigmaRadians ) ? 1 + Math.floor( STANDARD_DEVIATIONS * sigmaPixels ) : MAX_SAMPLES;\n\n\t\tif ( samples > MAX_SAMPLES ) {\n\n\t\t\twarn( `sigmaRadians, ${\n\t\t\t\tsigmaRadians}, is too large and will clip, as it requested ${\n\t\t\t\tsamples} samples when the maximum is set to ${MAX_SAMPLES}` );\n\n\t\t}\n\n\t\tconst weights = [];\n\t\tlet sum = 0;\n\n\t\tfor ( let i = 0; i < MAX_SAMPLES; ++ i ) {\n\n\t\t\tconst x = i / sigmaPixels;\n\t\t\tconst weight = Math.exp( - x * x / 2 );\n\t\t\tweights.push( weight );\n\n\t\t\tif ( i === 0 ) {\n\n\t\t\t\tsum += weight;\n\n\t\t\t} else if ( i < samples ) {\n\n\t\t\t\tsum += 2 * weight;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( let i = 0; i < weights.length; i ++ ) {\n\n\t\t\tweights[ i ] = weights[ i ] / sum;\n\n\t\t}\n\n\t\tblurUniforms[ 'envMap' ].value = targetIn.texture;\n\t\tblurUniforms[ 'samples' ].value = samples;\n\t\tblurUniforms[ 'weights' ].value = weights;\n\t\tblurUniforms[ 'latitudinal' ].value = direction === 'latitudinal';\n\n\t\tif ( poleAxis ) {\n\n\t\t\tblurUniforms[ 'poleAxis' ].value = poleAxis;\n\n\t\t}\n\n\t\tconst { _lodMax } = this;\n\t\tblurUniforms[ 'dTheta' ].value = radiansPerPixel;\n\t\tblurUniforms[ 'mipInt' ].value = _lodMax - lodIn;\n\n\t\tconst outputSize = this._sizeLods[ lodOut ];\n\t\tconst x = 3 * outputSize * ( lodOut > _lodMax - LOD_MIN ? lodOut - _lodMax + LOD_MIN : 0 );\n\t\tconst y = 4 * ( this._cubeSize - outputSize );\n\n\t\t_setViewport( targetOut, x, y, 3 * outputSize, 2 * outputSize );\n\t\trenderer.setRenderTarget( targetOut );\n\t\trenderer.render( blurMesh, _flatCamera );\n\n\t}\n\n}\n\n\n\nfunction _createPlanes( lodMax ) {\n\n\tconst sizeLods = [];\n\tconst sigmas = [];\n\tconst lodMeshes = [];\n\n\tlet lod = lodMax;\n\n\tconst totalLods = lodMax - LOD_MIN + 1 + EXTRA_LOD_SIGMA.length;\n\n\tfor ( let i = 0; i < totalLods; i ++ ) {\n\n\t\tconst sizeLod = Math.pow( 2, lod );\n\t\tsizeLods.push( sizeLod );\n\t\tlet sigma = 1.0 / sizeLod;\n\n\t\tif ( i > lodMax - LOD_MIN ) {\n\n\t\t\tsigma = EXTRA_LOD_SIGMA[ i - lodMax + LOD_MIN - 1 ];\n\n\t\t} else if ( i === 0 ) {\n\n\t\t\tsigma = 0;\n\n\t\t}\n\n\t\tsigmas.push( sigma );\n\n\t\tconst texelSize = 1.0 / ( sizeLod - 2 );\n\t\tconst min = - texelSize;\n\t\tconst max = 1 + texelSize;\n\t\tconst uv1 = [ min, min, max, min, max, max, min, min, max, max, min, max ];\n\n\t\tconst cubeFaces = 6;\n\t\tconst vertices = 6;\n\t\tconst positionSize = 3;\n\t\tconst uvSize = 2;\n\t\tconst faceIndexSize = 1;\n\n\t\tconst position = new Float32Array( positionSize * vertices * cubeFaces );\n\t\tconst uv = new Float32Array( uvSize * vertices * cubeFaces );\n\t\tconst faceIndex = new Float32Array( faceIndexSize * vertices * cubeFaces );\n\n\t\tfor ( let face = 0; face < cubeFaces; face ++ ) {\n\n\t\t\tconst x = ( face % 3 ) * 2 / 3 - 1;\n\t\t\tconst y = face > 2 ? 0 : -1;\n\t\t\tconst coordinates = [\n\t\t\t\tx, y, 0,\n\t\t\t\tx + 2 / 3, y, 0,\n\t\t\t\tx + 2 / 3, y + 1, 0,\n\t\t\t\tx, y, 0,\n\t\t\t\tx + 2 / 3, y + 1, 0,\n\t\t\t\tx, y + 1, 0\n\t\t\t];\n\t\t\tposition.set( coordinates, positionSize * vertices * face );\n\t\t\tuv.set( uv1, uvSize * vertices * face );\n\t\t\tconst fill = [ face, face, face, face, face, face ];\n\t\t\tfaceIndex.set( fill, faceIndexSize * vertices * face );\n\n\t\t}\n\n\t\tconst planes = new BufferGeometry();\n\t\tplanes.setAttribute( 'position', new BufferAttribute( position, positionSize ) );\n\t\tplanes.setAttribute( 'uv', new BufferAttribute( uv, uvSize ) );\n\t\tplanes.setAttribute( 'faceIndex', new BufferAttribute( faceIndex, faceIndexSize ) );\n\t\tlodMeshes.push( new Mesh( planes, null ) );\n\n\t\tif ( lod > LOD_MIN ) {\n\n\t\t\tlod --;\n\n\t\t}\n\n\t}\n\n\treturn { lodMeshes, sizeLods, sigmas };\n\n}\n\nfunction _createRenderTarget( width, height, params ) {\n\n\tconst cubeUVRenderTarget = new WebGLRenderTarget( width, height, params );\n\tcubeUVRenderTarget.texture.mapping = CubeUVReflectionMapping;\n\tcubeUVRenderTarget.texture.name = 'PMREM.cubeUv';\n\tcubeUVRenderTarget.scissorTest = true;\n\treturn cubeUVRenderTarget;\n\n}\n\nfunction _setViewport( target, x, y, width, height ) {\n\n\ttarget.viewport.set( x, y, width, height );\n\ttarget.scissor.set( x, y, width, height );\n\n}\n\nfunction _getGGXShader( lodMax, width, height ) {\n\n\tconst shaderMaterial = new ShaderMaterial( {\n\n\t\tname: 'PMREMGGXConvolution',\n\n\t\tdefines: {\n\t\t\t'GGX_SAMPLES': GGX_SAMPLES,\n\t\t\t'CUBEUV_TEXEL_WIDTH': 1.0 / width,\n\t\t\t'CUBEUV_TEXEL_HEIGHT': 1.0 / height,\n\t\t\t'CUBEUV_MAX_MIP': `${lodMax}.0`,\n\t\t},\n\n\t\tuniforms: {\n\t\t\t'envMap': { value: null },\n\t\t\t'roughness': { value: 0.0 },\n\t\t\t'mipInt': { value: 0 }\n\t\t},\n\n\t\tvertexShader: _getCommonVertexShader(),\n\n\t\tfragmentShader: /* glsl */`\n\n\t\t\tprecision highp float;\n\t\t\tprecision highp int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\t\t\tuniform float roughness;\n\t\t\tuniform float mipInt;\n\n\t\t\t#define ENVMAP_TYPE_CUBE_UV\n\t\t\t#include <cube_uv_reflection_fragment>\n\n\t\t\t#define PI 3.14159265359\n\n\t\t\t// Van der Corput radical inverse\n\t\t\tfloat radicalInverse_VdC(uint bits) {\n\t\t\t\tbits = (bits << 16u) | (bits >> 16u);\n\t\t\t\tbits = ((bits & 0x55555555u) << 1u) | ((bits & 0xAAAAAAAAu) >> 1u);\n\t\t\t\tbits = ((bits & 0x33333333u) << 2u) | ((bits & 0xCCCCCCCCu) >> 2u);\n\t\t\t\tbits = ((bits & 0x0F0F0F0Fu) << 4u) | ((bits & 0xF0F0F0F0u) >> 4u);\n\t\t\t\tbits = ((bits & 0x00FF00FFu) << 8u) | ((bits & 0xFF00FF00u) >> 8u);\n\t\t\t\treturn float(bits) * 2.3283064365386963e-10; // / 0x100000000\n\t\t\t}\n\n\t\t\t// Hammersley sequence\n\t\t\tvec2 hammersley(uint i, uint N) {\n\t\t\t\treturn vec2(float(i) / float(N), radicalInverse_VdC(i));\n\t\t\t}\n\n\t\t\t// GGX VNDF importance sampling (Eric Heitz 2018)\n\t\t\t// \"Sampling the GGX Distribution of Visible Normals\"\n\t\t\t// https://jcgt.org/published/0007/04/01/\n\t\t\tvec3 importanceSampleGGX_VNDF(vec2 Xi, vec3 V, float roughness) {\n\t\t\t\tfloat alpha = roughness * roughness;\n\n\t\t\t\t// Section 3.2: Transform view direction to hemisphere configuration\n\t\t\t\tvec3 Vh = normalize(vec3(alpha * V.x, alpha * V.y, V.z));\n\n\t\t\t\t// Section 4.1: Orthonormal basis\n\t\t\t\tfloat lensq = Vh.x * Vh.x + Vh.y * Vh.y;\n\t\t\t\tvec3 T1 = lensq > 0.0 ? vec3(-Vh.y, Vh.x, 0.0) / sqrt(lensq) : vec3(1.0, 0.0, 0.0);\n\t\t\t\tvec3 T2 = cross(Vh, T1);\n\n\t\t\t\t// Section 4.2: Parameterization of projected area\n\t\t\t\tfloat r = sqrt(Xi.x);\n\t\t\t\tfloat phi = 2.0 * PI * Xi.y;\n\t\t\t\tfloat t1 = r * cos(phi);\n\t\t\t\tfloat t2 = r * sin(phi);\n\t\t\t\tfloat s = 0.5 * (1.0 + Vh.z);\n\t\t\t\tt2 = (1.0 - s) * sqrt(1.0 - t1 * t1) + s * t2;\n\n\t\t\t\t// Section 4.3: Reprojection onto hemisphere\n\t\t\t\tvec3 Nh = t1 * T1 + t2 * T2 + sqrt(max(0.0, 1.0 - t1 * t1 - t2 * t2)) * Vh;\n\n\t\t\t\t// Section 3.4: Transform back to ellipsoid configuration\n\t\t\t\treturn normalize(vec3(alpha * Nh.x, alpha * Nh.y, max(0.0, Nh.z)));\n\t\t\t}\n\n\t\t\tvoid main() {\n\t\t\t\tvec3 N = normalize(vOutputDirection);\n\t\t\t\tvec3 V = N; // Assume view direction equals normal for pre-filtering\n\n\t\t\t\tvec3 prefilteredColor = vec3(0.0);\n\t\t\t\tfloat totalWeight = 0.0;\n\n\t\t\t\t// For very low roughness, just sample the environment directly\n\t\t\t\tif (roughness < 0.001) {\n\t\t\t\t\tgl_FragColor = vec4(bilinearCubeUV(envMap, N, mipInt), 1.0);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Tangent space basis for VNDF sampling\n\t\t\t\tvec3 up = abs(N.z) < 0.999 ? vec3(0.0, 0.0, 1.0) : vec3(1.0, 0.0, 0.0);\n\t\t\t\tvec3 tangent = normalize(cross(up, N));\n\t\t\t\tvec3 bitangent = cross(N, tangent);\n\n\t\t\t\tfor(uint i = 0u; i < uint(GGX_SAMPLES); i++) {\n\t\t\t\t\tvec2 Xi = hammersley(i, uint(GGX_SAMPLES));\n\n\t\t\t\t\t// For PMREM, V = N, so in tangent space V is always (0, 0, 1)\n\t\t\t\t\tvec3 H_tangent = importanceSampleGGX_VNDF(Xi, vec3(0.0, 0.0, 1.0), roughness);\n\n\t\t\t\t\t// Transform H back to world space\n\t\t\t\t\tvec3 H = normalize(tangent * H_tangent.x + bitangent * H_tangent.y + N * H_tangent.z);\n\t\t\t\t\tvec3 L = normalize(2.0 * dot(V, H) * H - V);\n\n\t\t\t\t\tfloat NdotL = max(dot(N, L), 0.0);\n\n\t\t\t\t\tif(NdotL > 0.0) {\n\t\t\t\t\t\t// Sample environment at fixed mip level\n\t\t\t\t\t\t// VNDF importance sampling handles the distribution filtering\n\t\t\t\t\t\tvec3 sampleColor = bilinearCubeUV(envMap, L, mipInt);\n\n\t\t\t\t\t\t// Weight by NdotL for the split-sum approximation\n\t\t\t\t\t\t// VNDF PDF naturally accounts for the visible microfacet distribution\n\t\t\t\t\t\tprefilteredColor += sampleColor * NdotL;\n\t\t\t\t\t\ttotalWeight += NdotL;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (totalWeight > 0.0) {\n\t\t\t\t\tprefilteredColor = prefilteredColor / totalWeight;\n\t\t\t\t}\n\n\t\t\t\tgl_FragColor = vec4(prefilteredColor, 1.0);\n\t\t\t}\n\t\t`,\n\n\t\tblending: NoBlending,\n\t\tdepthTest: false,\n\t\tdepthWrite: false\n\n\t} );\n\n\treturn shaderMaterial;\n\n}\n\nfunction _getBlurShader( lodMax, width, height ) {\n\n\tconst weights = new Float32Array( MAX_SAMPLES );\n\tconst poleAxis = new Vector3( 0, 1, 0 );\n\tconst shaderMaterial = new ShaderMaterial( {\n\n\t\tname: 'SphericalGaussianBlur',\n\n\t\tdefines: {\n\t\t\t'n': MAX_SAMPLES,\n\t\t\t'CUBEUV_TEXEL_WIDTH': 1.0 / width,\n\t\t\t'CUBEUV_TEXEL_HEIGHT': 1.0 / height,\n\t\t\t'CUBEUV_MAX_MIP': `${lodMax}.0`,\n\t\t},\n\n\t\tuniforms: {\n\t\t\t'envMap': { value: null },\n\t\t\t'samples': { value: 1 },\n\t\t\t'weights': { value: weights },\n\t\t\t'latitudinal': { value: false },\n\t\t\t'dTheta': { value: 0 },\n\t\t\t'mipInt': { value: 0 },\n\t\t\t'poleAxis': { value: poleAxis }\n\t\t},\n\n\t\tvertexShader: _getCommonVertexShader(),\n\n\t\tfragmentShader: /* glsl */`\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\t\t\tuniform int samples;\n\t\t\tuniform float weights[ n ];\n\t\t\tuniform bool latitudinal;\n\t\t\tuniform float dTheta;\n\t\t\tuniform float mipInt;\n\t\t\tuniform vec3 poleAxis;\n\n\t\t\t#define ENVMAP_TYPE_CUBE_UV\n\t\t\t#include <cube_uv_reflection_fragment>\n\n\t\t\tvec3 getSample( float theta, vec3 axis ) {\n\n\t\t\t\tfloat cosTheta = cos( theta );\n\t\t\t\t// Rodrigues' axis-angle rotation\n\t\t\t\tvec3 sampleDirection = vOutputDirection * cosTheta\n\t\t\t\t\t+ cross( axis, vOutputDirection ) * sin( theta )\n\t\t\t\t\t+ axis * dot( axis, vOutputDirection ) * ( 1.0 - cosTheta );\n\n\t\t\t\treturn bilinearCubeUV( envMap, sampleDirection, mipInt );\n\n\t\t\t}\n\n\t\t\tvoid main() {\n\n\t\t\t\tvec3 axis = latitudinal ? poleAxis : cross( poleAxis, vOutputDirection );\n\n\t\t\t\tif ( all( equal( axis, vec3( 0.0 ) ) ) ) {\n\n\t\t\t\t\taxis = vec3( vOutputDirection.z, 0.0, - vOutputDirection.x );\n\n\t\t\t\t}\n\n\t\t\t\taxis = normalize( axis );\n\n\t\t\t\tgl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\t\t\t\tgl_FragColor.rgb += weights[ 0 ] * getSample( 0.0, axis );\n\n\t\t\t\tfor ( int i = 1; i < n; i++ ) {\n\n\t\t\t\t\tif ( i >= samples ) {\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfloat theta = dTheta * float( i );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( -1.0 * theta, axis );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( theta, axis );\n\n\t\t\t\t}\n\n\t\t\t}\n\t\t`,\n\n\t\tblending: NoBlending,\n\t\tdepthTest: false,\n\t\tdepthWrite: false\n\n\t} );\n\n\treturn shaderMaterial;\n\n}\n\nfunction _getEquirectMaterial() {\n\n\treturn new ShaderMaterial( {\n\n\t\tname: 'EquirectangularToCubeUV',\n\n\t\tuniforms: {\n\t\t\t'envMap': { value: null }\n\t\t},\n\n\t\tvertexShader: _getCommonVertexShader(),\n\n\t\tfragmentShader: /* glsl */`\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\n\t\t\t#include <common>\n\n\t\t\tvoid main() {\n\n\t\t\t\tvec3 outputDirection = normalize( vOutputDirection );\n\t\t\t\tvec2 uv = equirectUv( outputDirection );\n\n\t\t\t\tgl_FragColor = vec4( texture2D ( envMap, uv ).rgb, 1.0 );\n\n\t\t\t}\n\t\t`,\n\n\t\tblending: NoBlending,\n\t\tdepthTest: false,\n\t\tdepthWrite: false\n\n\t} );\n\n}\n\nfunction _getCubemapMaterial() {\n\n\treturn new ShaderMaterial( {\n\n\t\tname: 'CubemapToCubeUV',\n\n\t\tuniforms: {\n\t\t\t'envMap': { value: null },\n\t\t\t'flipEnvMap': { value: -1 }\n\t\t},\n\n\t\tvertexShader: _getCommonVertexShader(),\n\n\t\tfragmentShader: /* glsl */`\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tuniform float flipEnvMap;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform samplerCube envMap;\n\n\t\t\tvoid main() {\n\n\t\t\t\tgl_FragColor = textureCube( envMap, vec3( flipEnvMap * vOutputDirection.x, vOutputDirection.yz ) );\n\n\t\t\t}\n\t\t`,\n\n\t\tblending: NoBlending,\n\t\tdepthTest: false,\n\t\tdepthWrite: false\n\n\t} );\n\n}\n\nfunction _getCommonVertexShader() {\n\n\treturn /* glsl */`\n\n\t\tprecision mediump float;\n\t\tprecision mediump int;\n\n\t\tattribute float faceIndex;\n\n\t\tvarying vec3 vOutputDirection;\n\n\t\t// RH coordinate system; PMREM face-indexing convention\n\t\tvec3 getDirection( vec2 uv, float face ) {\n\n\t\t\tuv = 2.0 * uv - 1.0;\n\n\t\t\tvec3 direction = vec3( uv, 1.0 );\n\n\t\t\tif ( face == 0.0 ) {\n\n\t\t\t\tdirection = direction.zyx; // ( 1, v, u ) pos x\n\n\t\t\t} else if ( face == 1.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xz *= -1.0; // ( -u, 1, -v ) pos y\n\n\t\t\t} else if ( face == 2.0 ) {\n\n\t\t\t\tdirection.x *= -1.0; // ( -u, v, 1 ) pos z\n\n\t\t\t} else if ( face == 3.0 ) {\n\n\t\t\t\tdirection = direction.zyx;\n\t\t\t\tdirection.xz *= -1.0; // ( -1, v, -u ) neg x\n\n\t\t\t} else if ( face == 4.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xy *= -1.0; // ( -u, -1, v ) neg y\n\n\t\t\t} else if ( face == 5.0 ) {\n\n\t\t\t\tdirection.z *= -1.0; // ( u, v, -1 ) neg z\n\n\t\t\t}\n\n\t\t\treturn direction;\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tvOutputDirection = getDirection( uv, faceIndex );\n\t\t\tgl_Position = vec4( position, 1.0 );\n\n\t\t}\n\t`;\n\n}\n\nfunction WebGLCubeUVMaps( renderer ) {\n\n\tlet cubeUVmaps = new WeakMap();\n\n\tlet pmremGenerator = null;\n\n\tfunction get( texture ) {\n\n\t\tif ( texture && texture.isTexture ) {\n\n\t\t\tconst mapping = texture.mapping;\n\n\t\t\tconst isEquirectMap = ( mapping === EquirectangularReflectionMapping || mapping === EquirectangularRefractionMapping );\n\t\t\tconst isCubeMap = ( mapping === CubeReflectionMapping || mapping === CubeRefractionMapping );\n\n\t\t\t// equirect/cube map to cubeUV conversion\n\n\t\t\tif ( isEquirectMap || isCubeMap ) {\n\n\t\t\t\tlet renderTarget = cubeUVmaps.get( texture );\n\n\t\t\t\tconst currentPMREMVersion = renderTarget !== undefined ? renderTarget.texture.pmremVersion : 0;\n\n\t\t\t\tif ( texture.isRenderTargetTexture && texture.pmremVersion !== currentPMREMVersion ) {\n\n\t\t\t\t\tif ( pmremGenerator === null ) pmremGenerator = new PMREMGenerator( renderer );\n\n\t\t\t\t\trenderTarget = isEquirectMap ? pmremGenerator.fromEquirectangular( texture, renderTarget ) : pmremGenerator.fromCubemap( texture, renderTarget );\n\t\t\t\t\trenderTarget.texture.pmremVersion = texture.pmremVersion;\n\n\t\t\t\t\tcubeUVmaps.set( texture, renderTarget );\n\n\t\t\t\t\treturn renderTarget.texture;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( renderTarget !== undefined ) {\n\n\t\t\t\t\t\treturn renderTarget.texture;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconst image = texture.image;\n\n\t\t\t\t\t\tif ( ( isEquirectMap && image && image.height > 0 ) || ( isCubeMap && image && isCubeTextureComplete( image ) ) ) {\n\n\t\t\t\t\t\t\tif ( pmremGenerator === null ) pmremGenerator = new PMREMGenerator( renderer );\n\n\t\t\t\t\t\t\trenderTarget = isEquirectMap ? pmremGenerator.fromEquirectangular( texture ) : pmremGenerator.fromCubemap( texture );\n\t\t\t\t\t\t\trenderTarget.texture.pmremVersion = texture.pmremVersion;\n\n\t\t\t\t\t\t\tcubeUVmaps.set( texture, renderTarget );\n\n\t\t\t\t\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t\t\t\t\t\treturn renderTarget.texture;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// image not yet ready. try the conversion next frame\n\n\t\t\t\t\t\t\treturn null;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\tfunction isCubeTextureComplete( image ) {\n\n\t\tlet count = 0;\n\t\tconst length = 6;\n\n\t\tfor ( let i = 0; i < length; i ++ ) {\n\n\t\t\tif ( image[ i ] !== undefined ) count ++;\n\n\t\t}\n\n\t\treturn count === length;\n\n\n\t}\n\n\tfunction onTextureDispose( event ) {\n\n\t\tconst texture = event.target;\n\n\t\ttexture.removeEventListener( 'dispose', onTextureDispose );\n\n\t\tconst cubemapUV = cubeUVmaps.get( texture );\n\n\t\tif ( cubemapUV !== undefined ) {\n\n\t\t\tcubeUVmaps.delete( texture );\n\t\t\tcubemapUV.dispose();\n\n\t\t}\n\n\t}\n\n\tfunction dispose() {\n\n\t\tcubeUVmaps = new WeakMap();\n\n\t\tif ( pmremGenerator !== null ) {\n\n\t\t\tpmremGenerator.dispose();\n\t\t\tpmremGenerator = null;\n\n\t\t}\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\nfunction WebGLExtensions( gl ) {\n\n\tconst extensions = {};\n\n\tfunction getExtension( name ) {\n\n\t\tif ( extensions[ name ] !== undefined ) {\n\n\t\t\treturn extensions[ name ];\n\n\t\t}\n\n\t\tconst extension = gl.getExtension( name );\n\n\t\textensions[ name ] = extension;\n\n\t\treturn extension;\n\n\t}\n\n\treturn {\n\n\t\thas: function ( name ) {\n\n\t\t\treturn getExtension( name ) !== null;\n\n\t\t},\n\n\t\tinit: function () {\n\n\t\t\tgetExtension( 'EXT_color_buffer_float' );\n\t\t\tgetExtension( 'WEBGL_clip_cull_distance' );\n\t\t\tgetExtension( 'OES_texture_float_linear' );\n\t\t\tgetExtension( 'EXT_color_buffer_half_float' );\n\t\t\tgetExtension( 'WEBGL_multisampled_render_to_texture' );\n\t\t\tgetExtension( 'WEBGL_render_shared_exponent' );\n\n\t\t},\n\n\t\tget: function ( name ) {\n\n\t\t\tconst extension = getExtension( name );\n\n\t\t\tif ( extension === null ) {\n\n\t\t\t\twarnOnce( 'WebGLRenderer: ' + name + ' extension not supported.' );\n\n\t\t\t}\n\n\t\t\treturn extension;\n\n\t\t}\n\n\t};\n\n}\n\nfunction WebGLGeometries( gl, attributes, info, bindingStates ) {\n\n\tconst geometries = {};\n\tconst wireframeAttributes = new WeakMap();\n\n\tfunction onGeometryDispose( event ) {\n\n\t\tconst geometry = event.target;\n\n\t\tif ( geometry.index !== null ) {\n\n\t\t\tattributes.remove( geometry.index );\n\n\t\t}\n\n\t\tfor ( const name in geometry.attributes ) {\n\n\t\t\tattributes.remove( geometry.attributes[ name ] );\n\n\t\t}\n\n\t\tgeometry.removeEventListener( 'dispose', onGeometryDispose );\n\n\t\tdelete geometries[ geometry.id ];\n\n\t\tconst attribute = wireframeAttributes.get( geometry );\n\n\t\tif ( attribute ) {\n\n\t\t\tattributes.remove( attribute );\n\t\t\twireframeAttributes.delete( geometry );\n\n\t\t}\n\n\t\tbindingStates.releaseStatesOfGeometry( geometry );\n\n\t\tif ( geometry.isInstancedBufferGeometry === true ) {\n\n\t\t\tdelete geometry._maxInstanceCount;\n\n\t\t}\n\n\t\t//\n\n\t\tinfo.memory.geometries --;\n\n\t}\n\n\tfunction get( object, geometry ) {\n\n\t\tif ( geometries[ geometry.id ] === true ) return geometry;\n\n\t\tgeometry.addEventListener( 'dispose', onGeometryDispose );\n\n\t\tgeometries[ geometry.id ] = true;\n\n\t\tinfo.memory.geometries ++;\n\n\t\treturn geometry;\n\n\t}\n\n\tfunction update( geometry ) {\n\n\t\tconst geometryAttributes = geometry.attributes;\n\n\t\t// Updating index buffer in VAO now. See WebGLBindingStates.\n\n\t\tfor ( const name in geometryAttributes ) {\n\n\t\t\tattributes.update( geometryAttributes[ name ], gl.ARRAY_BUFFER );\n\n\t\t}\n\n\t}\n\n\tfunction updateWireframeAttribute( geometry ) {\n\n\t\tconst indices = [];\n\n\t\tconst geometryIndex = geometry.index;\n\t\tconst geometryPosition = geometry.attributes.position;\n\t\tlet version = 0;\n\n\t\tif ( geometryIndex !== null ) {\n\n\t\t\tconst array = geometryIndex.array;\n\t\t\tversion = geometryIndex.version;\n\n\t\t\tfor ( let i = 0, l = array.length; i < l; i += 3 ) {\n\n\t\t\t\tconst a = array[ i + 0 ];\n\t\t\t\tconst b = array[ i + 1 ];\n\t\t\t\tconst c = array[ i + 2 ];\n\n\t\t\t\tindices.push( a, b, b, c, c, a );\n\n\t\t\t}\n\n\t\t} else if ( geometryPosition !== undefined ) {\n\n\t\t\tconst array = geometryPosition.array;\n\t\t\tversion = geometryPosition.version;\n\n\t\t\tfor ( let i = 0, l = ( array.length / 3 ) - 1; i < l; i += 3 ) {\n\n\t\t\t\tconst a = i + 0;\n\t\t\t\tconst b = i + 1;\n\t\t\t\tconst c = i + 2;\n\n\t\t\t\tindices.push( a, b, b, c, c, a );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst attribute = new ( arrayNeedsUint32( indices ) ? Uint32BufferAttribute : Uint16BufferAttribute )( indices, 1 );\n\t\tattribute.version = version;\n\n\t\t// Updating index buffer in VAO now. See WebGLBindingStates\n\n\t\t//\n\n\t\tconst previousAttribute = wireframeAttributes.get( geometry );\n\n\t\tif ( previousAttribute ) attributes.remove( previousAttribute );\n\n\t\t//\n\n\t\twireframeAttributes.set( geometry, attribute );\n\n\t}\n\n\tfunction getWireframeAttribute( geometry ) {\n\n\t\tconst currentAttribute = wireframeAttributes.get( geometry );\n\n\t\tif ( currentAttribute ) {\n\n\t\t\tconst geometryIndex = geometry.index;\n\n\t\t\tif ( geometryIndex !== null ) {\n\n\t\t\t\t// if the attribute is obsolete, create a new one\n\n\t\t\t\tif ( currentAttribute.version < geometryIndex.version ) {\n\n\t\t\t\t\tupdateWireframeAttribute( geometry );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tupdateWireframeAttribute( geometry );\n\n\t\t}\n\n\t\treturn wireframeAttributes.get( geometry );\n\n\t}\n\n\treturn {\n\n\t\tget: get,\n\t\tupdate: update,\n\n\t\tgetWireframeAttribute: getWireframeAttribute\n\n\t};\n\n}\n\nfunction WebGLIndexedBufferRenderer( gl, extensions, info ) {\n\n\tlet mode;\n\n\tfunction setMode( value ) {\n\n\t\tmode = value;\n\n\t}\n\n\tlet type, bytesPerElement;\n\n\tfunction setIndex( value ) {\n\n\t\ttype = value.type;\n\t\tbytesPerElement = value.bytesPerElement;\n\n\t}\n\n\tfunction render( start, count ) {\n\n\t\tgl.drawElements( mode, count, type, start * bytesPerElement );\n\n\t\tinfo.update( count, mode, 1 );\n\n\t}\n\n\tfunction renderInstances( start, count, primcount ) {\n\n\t\tif ( primcount === 0 ) return;\n\n\t\tgl.drawElementsInstanced( mode, count, type, start * bytesPerElement, primcount );\n\n\t\tinfo.update( count, mode, primcount );\n\n\t}\n\n\tfunction renderMultiDraw( starts, counts, drawCount ) {\n\n\t\tif ( drawCount === 0 ) return;\n\n\t\tconst extension = extensions.get( 'WEBGL_multi_draw' );\n\t\textension.multiDrawElementsWEBGL( mode, counts, 0, type, starts, 0, drawCount );\n\n\t\tlet elementCount = 0;\n\t\tfor ( let i = 0; i < drawCount; i ++ ) {\n\n\t\t\telementCount += counts[ i ];\n\n\t\t}\n\n\t\tinfo.update( elementCount, mode, 1 );\n\n\n\t}\n\n\tfunction renderMultiDrawInstances( starts, counts, drawCount, primcount ) {\n\n\t\tif ( drawCount === 0 ) return;\n\n\t\tconst extension = extensions.get( 'WEBGL_multi_draw' );\n\n\t\tif ( extension === null ) {\n\n\t\t\tfor ( let i = 0; i < starts.length; i ++ ) {\n\n\t\t\t\trenderInstances( starts[ i ] / bytesPerElement, counts[ i ], primcount[ i ] );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\textension.multiDrawElementsInstancedWEBGL( mode, counts, 0, type, starts, 0, primcount, 0, drawCount );\n\n\t\t\tlet elementCount = 0;\n\t\t\tfor ( let i = 0; i < drawCount; i ++ ) {\n\n\t\t\t\telementCount += counts[ i ] * primcount[ i ];\n\n\t\t\t}\n\n\t\t\tinfo.update( elementCount, mode, 1 );\n\n\t\t}\n\n\t}\n\n\t//\n\n\tthis.setMode = setMode;\n\tthis.setIndex = setIndex;\n\tthis.render = render;\n\tthis.renderInstances = renderInstances;\n\tthis.renderMultiDraw = renderMultiDraw;\n\tthis.renderMultiDrawInstances = renderMultiDrawInstances;\n\n}\n\nfunction WebGLInfo( gl ) {\n\n\tconst memory = {\n\t\tgeometries: 0,\n\t\ttextures: 0\n\t};\n\n\tconst render = {\n\t\tframe: 0,\n\t\tcalls: 0,\n\t\ttriangles: 0,\n\t\tpoints: 0,\n\t\tlines: 0\n\t};\n\n\tfunction update( count, mode, instanceCount ) {\n\n\t\trender.calls ++;\n\n\t\tswitch ( mode ) {\n\n\t\t\tcase gl.TRIANGLES:\n\t\t\t\trender.triangles += instanceCount * ( count / 3 );\n\t\t\t\tbreak;\n\n\t\t\tcase gl.LINES:\n\t\t\t\trender.lines += instanceCount * ( count / 2 );\n\t\t\t\tbreak;\n\n\t\t\tcase gl.LINE_STRIP:\n\t\t\t\trender.lines += instanceCount * ( count - 1 );\n\t\t\t\tbreak;\n\n\t\t\tcase gl.LINE_LOOP:\n\t\t\t\trender.lines += instanceCount * count;\n\t\t\t\tbreak;\n\n\t\t\tcase gl.POINTS:\n\t\t\t\trender.points += instanceCount * count;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\terror( 'WebGLInfo: Unknown draw mode:', mode );\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\tfunction reset() {\n\n\t\trender.calls = 0;\n\t\trender.triangles = 0;\n\t\trender.points = 0;\n\t\trender.lines = 0;\n\n\t}\n\n\treturn {\n\t\tmemory: memory,\n\t\trender: render,\n\t\tprograms: null,\n\t\tautoReset: true,\n\t\treset: reset,\n\t\tupdate: update\n\t};\n\n}\n\nfunction WebGLMorphtargets( gl, capabilities, textures ) {\n\n\tconst morphTextures = new WeakMap();\n\tconst morph = new Vector4();\n\n\tfunction update( object, geometry, program ) {\n\n\t\tconst objectInfluences = object.morphTargetInfluences;\n\n\t\t// the following encodes morph targets into an array of data textures. Each layer represents a single morph target.\n\n\t\tconst morphAttribute = geometry.morphAttributes.position || geometry.morphAttributes.normal || geometry.morphAttributes.color;\n\t\tconst morphTargetsCount = ( morphAttribute !== undefined ) ? morphAttribute.length : 0;\n\n\t\tlet entry = morphTextures.get( geometry );\n\n\t\tif ( entry === undefined || entry.count !== morphTargetsCount ) {\n\n\t\t\tif ( entry !== undefined ) entry.texture.dispose();\n\n\t\t\tconst hasMorphPosition = geometry.morphAttributes.position !== undefined;\n\t\t\tconst hasMorphNormals = geometry.morphAttributes.normal !== undefined;\n\t\t\tconst hasMorphColors = geometry.morphAttributes.color !== undefined;\n\n\t\t\tconst morphTargets = geometry.morphAttributes.position || [];\n\t\t\tconst morphNormals = geometry.morphAttributes.normal || [];\n\t\t\tconst morphColors = geometry.morphAttributes.color || [];\n\n\t\t\tlet vertexDataCount = 0;\n\n\t\t\tif ( hasMorphPosition === true ) vertexDataCount = 1;\n\t\t\tif ( hasMorphNormals === true ) vertexDataCount = 2;\n\t\t\tif ( hasMorphColors === true ) vertexDataCount = 3;\n\n\t\t\tlet width = geometry.attributes.position.count * vertexDataCount;\n\t\t\tlet height = 1;\n\n\t\t\tif ( width > capabilities.maxTextureSize ) {\n\n\t\t\t\theight = Math.ceil( width / capabilities.maxTextureSize );\n\t\t\t\twidth = capabilities.maxTextureSize;\n\n\t\t\t}\n\n\t\t\tconst buffer = new Float32Array( width * height * 4 * morphTargetsCount );\n\n\t\t\tconst texture = new DataArrayTexture( buffer, width, height, morphTargetsCount );\n\t\t\ttexture.type = FloatType;\n\t\t\ttexture.needsUpdate = true;\n\n\t\t\t// fill buffer\n\n\t\t\tconst vertexDataStride = vertexDataCount * 4;\n\n\t\t\tfor ( let i = 0; i < morphTargetsCount; i ++ ) {\n\n\t\t\t\tconst morphTarget = morphTargets[ i ];\n\t\t\t\tconst morphNormal = morphNormals[ i ];\n\t\t\t\tconst morphColor = morphColors[ i ];\n\n\t\t\t\tconst offset = width * height * 4 * i;\n\n\t\t\t\tfor ( let j = 0; j < morphTarget.count; j ++ ) {\n\n\t\t\t\t\tconst stride = j * vertexDataStride;\n\n\t\t\t\t\tif ( hasMorphPosition === true ) {\n\n\t\t\t\t\t\tmorph.fromBufferAttribute( morphTarget, j );\n\n\t\t\t\t\t\tbuffer[ offset + stride + 0 ] = morph.x;\n\t\t\t\t\t\tbuffer[ offset + stride + 1 ] = morph.y;\n\t\t\t\t\t\tbuffer[ offset + stride + 2 ] = morph.z;\n\t\t\t\t\t\tbuffer[ offset + stride + 3 ] = 0;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( hasMorphNormals === true ) {\n\n\t\t\t\t\t\tmorph.fromBufferAttribute( morphNormal, j );\n\n\t\t\t\t\t\tbuffer[ offset + stride + 4 ] = morph.x;\n\t\t\t\t\t\tbuffer[ offset + stride + 5 ] = morph.y;\n\t\t\t\t\t\tbuffer[ offset + stride + 6 ] = morph.z;\n\t\t\t\t\t\tbuffer[ offset + stride + 7 ] = 0;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( hasMorphColors === true ) {\n\n\t\t\t\t\t\tmorph.fromBufferAttribute( morphColor, j );\n\n\t\t\t\t\t\tbuffer[ offset + stride + 8 ] = morph.x;\n\t\t\t\t\t\tbuffer[ offset + stride + 9 ] = morph.y;\n\t\t\t\t\t\tbuffer[ offset + stride + 10 ] = morph.z;\n\t\t\t\t\t\tbuffer[ offset + stride + 11 ] = ( morphColor.itemSize === 4 ) ? morph.w : 1;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tentry = {\n\t\t\t\tcount: morphTargetsCount,\n\t\t\t\ttexture: texture,\n\t\t\t\tsize: new Vector2( width, height )\n\t\t\t};\n\n\t\t\tmorphTextures.set( geometry, entry );\n\n\t\t\tfunction disposeTexture() {\n\n\t\t\t\ttexture.dispose();\n\n\t\t\t\tmorphTextures.delete( geometry );\n\n\t\t\t\tgeometry.removeEventListener( 'dispose', disposeTexture );\n\n\t\t\t}\n\n\t\t\tgeometry.addEventListener( 'dispose', disposeTexture );\n\n\t\t}\n\n\t\t//\n\t\tif ( object.isInstancedMesh === true && object.morphTexture !== null ) {\n\n\t\t\tprogram.getUniforms().setValue( gl, 'morphTexture', object.morphTexture, textures );\n\n\t\t} else {\n\n\t\t\tlet morphInfluencesSum = 0;\n\n\t\t\tfor ( let i = 0; i < objectInfluences.length; i ++ ) {\n\n\t\t\t\tmorphInfluencesSum += objectInfluences[ i ];\n\n\t\t\t}\n\n\t\t\tconst morphBaseInfluence = geometry.morphTargetsRelative ? 1 : 1 - morphInfluencesSum;\n\n\n\t\t\tprogram.getUniforms().setValue( gl, 'morphTargetBaseInfluence', morphBaseInfluence );\n\t\t\tprogram.getUniforms().setValue( gl, 'morphTargetInfluences', objectInfluences );\n\n\t\t}\n\n\t\tprogram.getUniforms().setValue( gl, 'morphTargetsTexture', entry.texture, textures );\n\t\tprogram.getUniforms().setValue( gl, 'morphTargetsTextureSize', entry.size );\n\n\t}\n\n\treturn {\n\n\t\tupdate: update\n\n\t};\n\n}\n\nfunction WebGLObjects( gl, geometries, attributes, info ) {\n\n\tlet updateMap = new WeakMap();\n\n\tfunction update( object ) {\n\n\t\tconst frame = info.render.frame;\n\n\t\tconst geometry = object.geometry;\n\t\tconst buffergeometry = geometries.get( object, geometry );\n\n\t\t// Update once per frame\n\n\t\tif ( updateMap.get( buffergeometry ) !== frame ) {\n\n\t\t\tgeometries.update( buffergeometry );\n\n\t\t\tupdateMap.set( buffergeometry, frame );\n\n\t\t}\n\n\t\tif ( object.isInstancedMesh ) {\n\n\t\t\tif ( object.hasEventListener( 'dispose', onInstancedMeshDispose ) === false ) {\n\n\t\t\t\tobject.addEventListener( 'dispose', onInstancedMeshDispose );\n\n\t\t\t}\n\n\t\t\tif ( updateMap.get( object ) !== frame ) {\n\n\t\t\t\tattributes.update( object.instanceMatrix, gl.ARRAY_BUFFER );\n\n\t\t\t\tif ( object.instanceColor !== null ) {\n\n\t\t\t\t\tattributes.update( object.instanceColor, gl.ARRAY_BUFFER );\n\n\t\t\t\t}\n\n\t\t\t\tupdateMap.set( object, frame );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( object.isSkinnedMesh ) {\n\n\t\t\tconst skeleton = object.skeleton;\n\n\t\t\tif ( updateMap.get( skeleton ) !== frame ) {\n\n\t\t\t\tskeleton.update();\n\n\t\t\t\tupdateMap.set( skeleton, frame );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn buffergeometry;\n\n\t}\n\n\tfunction dispose() {\n\n\t\tupdateMap = new WeakMap();\n\n\t}\n\n\tfunction onInstancedMeshDispose( event ) {\n\n\t\tconst instancedMesh = event.target;\n\n\t\tinstancedMesh.removeEventListener( 'dispose', onInstancedMeshDispose );\n\n\t\tattributes.remove( instancedMesh.instanceMatrix );\n\n\t\tif ( instancedMesh.instanceColor !== null ) attributes.remove( instancedMesh.instanceColor );\n\n\t}\n\n\treturn {\n\n\t\tupdate: update,\n\t\tdispose: dispose\n\n\t};\n\n}\n\n/**\n * Uniforms of a program.\n * Those form a tree structure with a special top-level container for the root,\n * which you get by calling 'new WebGLUniforms( gl, program )'.\n *\n *\n * Properties of inner nodes including the top-level container:\n *\n * .seq - array of nested uniforms\n * .map - nested uniforms by name\n *\n *\n * Methods of all nodes except the top-level container:\n *\n * .setValue( gl, value, [textures] )\n *\n * \t\tuploads a uniform value(s)\n *  \tthe 'textures' parameter is needed for sampler uniforms\n *\n *\n * Static methods of the top-level container (textures factorizations):\n *\n * .upload( gl, seq, values, textures )\n *\n * \t\tsets uniforms in 'seq' to 'values[id].value'\n *\n * .seqWithValue( seq, values ) : filteredSeq\n *\n * \t\tfilters 'seq' entries with corresponding entry in values\n *\n *\n * Methods of the top-level container (textures factorizations):\n *\n * .setValue( gl, name, value, textures )\n *\n * \t\tsets uniform with  name 'name' to 'value'\n *\n * .setOptional( gl, obj, prop )\n *\n * \t\tlike .set for an optional property of the object\n *\n */\n\n\nconst emptyTexture = /*@__PURE__*/ new Texture();\n\nconst emptyShadowTexture = /*@__PURE__*/ new DepthTexture( 1, 1 );\n\nconst emptyArrayTexture = /*@__PURE__*/ new DataArrayTexture();\nconst empty3dTexture = /*@__PURE__*/ new Data3DTexture();\nconst emptyCubeTexture = /*@__PURE__*/ new CubeTexture();\n\n// --- Utilities ---\n\n// Array Caches (provide typed arrays for temporary by size)\n\nconst arrayCacheF32 = [];\nconst arrayCacheI32 = [];\n\n// Float32Array caches used for uploading Matrix uniforms\n\nconst mat4array = new Float32Array( 16 );\nconst mat3array = new Float32Array( 9 );\nconst mat2array = new Float32Array( 4 );\n\n// Flattening for arrays of vectors and matrices\n\nfunction flatten( array, nBlocks, blockSize ) {\n\n\tconst firstElem = array[ 0 ];\n\n\tif ( firstElem <= 0 || firstElem > 0 ) return array;\n\t// unoptimized: ! isNaN( firstElem )\n\t// see http://jacksondunstan.com/articles/983\n\n\tconst n = nBlocks * blockSize;\n\tlet r = arrayCacheF32[ n ];\n\n\tif ( r === undefined ) {\n\n\t\tr = new Float32Array( n );\n\t\tarrayCacheF32[ n ] = r;\n\n\t}\n\n\tif ( nBlocks !== 0 ) {\n\n\t\tfirstElem.toArray( r, 0 );\n\n\t\tfor ( let i = 1, offset = 0; i !== nBlocks; ++ i ) {\n\n\t\t\toffset += blockSize;\n\t\t\tarray[ i ].toArray( r, offset );\n\n\t\t}\n\n\t}\n\n\treturn r;\n\n}\n\nfunction arraysEqual( a, b ) {\n\n\tif ( a.length !== b.length ) return false;\n\n\tfor ( let i = 0, l = a.length; i < l; i ++ ) {\n\n\t\tif ( a[ i ] !== b[ i ] ) return false;\n\n\t}\n\n\treturn true;\n\n}\n\nfunction copyArray( a, b ) {\n\n\tfor ( let i = 0, l = b.length; i < l; i ++ ) {\n\n\t\ta[ i ] = b[ i ];\n\n\t}\n\n}\n\n// Texture unit allocation\n\nfunction allocTexUnits( textures, n ) {\n\n\tlet r = arrayCacheI32[ n ];\n\n\tif ( r === undefined ) {\n\n\t\tr = new Int32Array( n );\n\t\tarrayCacheI32[ n ] = r;\n\n\t}\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\tr[ i ] = textures.allocateTextureUnit();\n\n\t}\n\n\treturn r;\n\n}\n\n// --- Setters ---\n\n// Note: Defining these methods externally, because they come in a bunch\n// and this way their names minify.\n\n// Single scalar\n\nfunction setValueV1f( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( cache[ 0 ] === v ) return;\n\n\tgl.uniform1f( this.addr, v );\n\n\tcache[ 0 ] = v;\n\n}\n\n// Single float vector (from flat array or THREE.VectorN)\n\nfunction setValueV2f( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y ) {\n\n\t\t\tgl.uniform2f( this.addr, v.x, v.y );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform2fv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV3f( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z ) {\n\n\t\t\tgl.uniform3f( this.addr, v.x, v.y, v.z );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\n\t\t}\n\n\t} else if ( v.r !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.r || cache[ 1 ] !== v.g || cache[ 2 ] !== v.b ) {\n\n\t\t\tgl.uniform3f( this.addr, v.r, v.g, v.b );\n\n\t\t\tcache[ 0 ] = v.r;\n\t\t\tcache[ 1 ] = v.g;\n\t\t\tcache[ 2 ] = v.b;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform3fv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV4f( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z || cache[ 3 ] !== v.w ) {\n\n\t\t\tgl.uniform4f( this.addr, v.x, v.y, v.z, v.w );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\t\t\tcache[ 3 ] = v.w;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform4fv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\n// Single matrix (from flat array or THREE.MatrixN)\n\nfunction setValueM2( gl, v ) {\n\n\tconst cache = this.cache;\n\tconst elements = v.elements;\n\n\tif ( elements === undefined ) {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniformMatrix2fv( this.addr, false, v );\n\n\t\tcopyArray( cache, v );\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, elements ) ) return;\n\n\t\tmat2array.set( elements );\n\n\t\tgl.uniformMatrix2fv( this.addr, false, mat2array );\n\n\t\tcopyArray( cache, elements );\n\n\t}\n\n}\n\nfunction setValueM3( gl, v ) {\n\n\tconst cache = this.cache;\n\tconst elements = v.elements;\n\n\tif ( elements === undefined ) {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniformMatrix3fv( this.addr, false, v );\n\n\t\tcopyArray( cache, v );\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, elements ) ) return;\n\n\t\tmat3array.set( elements );\n\n\t\tgl.uniformMatrix3fv( this.addr, false, mat3array );\n\n\t\tcopyArray( cache, elements );\n\n\t}\n\n}\n\nfunction setValueM4( gl, v ) {\n\n\tconst cache = this.cache;\n\tconst elements = v.elements;\n\n\tif ( elements === undefined ) {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniformMatrix4fv( this.addr, false, v );\n\n\t\tcopyArray( cache, v );\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, elements ) ) return;\n\n\t\tmat4array.set( elements );\n\n\t\tgl.uniformMatrix4fv( this.addr, false, mat4array );\n\n\t\tcopyArray( cache, elements );\n\n\t}\n\n}\n\n// Single integer / boolean\n\nfunction setValueV1i( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( cache[ 0 ] === v ) return;\n\n\tgl.uniform1i( this.addr, v );\n\n\tcache[ 0 ] = v;\n\n}\n\n// Single integer / boolean vector (from flat array or THREE.VectorN)\n\nfunction setValueV2i( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y ) {\n\n\t\t\tgl.uniform2i( this.addr, v.x, v.y );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform2iv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV3i( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z ) {\n\n\t\t\tgl.uniform3i( this.addr, v.x, v.y, v.z );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform3iv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV4i( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z || cache[ 3 ] !== v.w ) {\n\n\t\t\tgl.uniform4i( this.addr, v.x, v.y, v.z, v.w );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\t\t\tcache[ 3 ] = v.w;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform4iv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\n// Single unsigned integer\n\nfunction setValueV1ui( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( cache[ 0 ] === v ) return;\n\n\tgl.uniform1ui( this.addr, v );\n\n\tcache[ 0 ] = v;\n\n}\n\n// Single unsigned integer vector (from flat array or THREE.VectorN)\n\nfunction setValueV2ui( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y ) {\n\n\t\t\tgl.uniform2ui( this.addr, v.x, v.y );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform2uiv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV3ui( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z ) {\n\n\t\t\tgl.uniform3ui( this.addr, v.x, v.y, v.z );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform3uiv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV4ui( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z || cache[ 3 ] !== v.w ) {\n\n\t\t\tgl.uniform4ui( this.addr, v.x, v.y, v.z, v.w );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\t\t\tcache[ 3 ] = v.w;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform4uiv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\n\n// Single texture (2D / Cube)\n\nfunction setValueT1( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\tconst unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\tlet emptyTexture2D;\n\n\tif ( this.type === gl.SAMPLER_2D_SHADOW ) {\n\n\t\temptyShadowTexture.compareFunction = LessEqualCompare; // #28670\n\t\temptyTexture2D = emptyShadowTexture;\n\n\t} else {\n\n\t\temptyTexture2D = emptyTexture;\n\n\t}\n\n\ttextures.setTexture2D( v || emptyTexture2D, unit );\n\n}\n\nfunction setValueT3D1( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\tconst unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\ttextures.setTexture3D( v || empty3dTexture, unit );\n\n}\n\nfunction setValueT6( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\tconst unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\ttextures.setTextureCube( v || emptyCubeTexture, unit );\n\n}\n\nfunction setValueT2DArray1( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\tconst unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\ttextures.setTexture2DArray( v || emptyArrayTexture, unit );\n\n}\n\n// Helper to pick the right setter for the singular case\n\nfunction getSingularSetter( type ) {\n\n\tswitch ( type ) {\n\n\t\tcase 0x1406: return setValueV1f; // FLOAT\n\t\tcase 0x8b50: return setValueV2f; // _VEC2\n\t\tcase 0x8b51: return setValueV3f; // _VEC3\n\t\tcase 0x8b52: return setValueV4f; // _VEC4\n\n\t\tcase 0x8b5a: return setValueM2; // _MAT2\n\t\tcase 0x8b5b: return setValueM3; // _MAT3\n\t\tcase 0x8b5c: return setValueM4; // _MAT4\n\n\t\tcase 0x1404: case 0x8b56: return setValueV1i; // INT, BOOL\n\t\tcase 0x8b53: case 0x8b57: return setValueV2i; // _VEC2\n\t\tcase 0x8b54: case 0x8b58: return setValueV3i; // _VEC3\n\t\tcase 0x8b55: case 0x8b59: return setValueV4i; // _VEC4\n\n\t\tcase 0x1405: return setValueV1ui; // UINT\n\t\tcase 0x8dc6: return setValueV2ui; // _VEC2\n\t\tcase 0x8dc7: return setValueV3ui; // _VEC3\n\t\tcase 0x8dc8: return setValueV4ui; // _VEC4\n\n\t\tcase 0x8b5e: // SAMPLER_2D\n\t\tcase 0x8d66: // SAMPLER_EXTERNAL_OES\n\t\tcase 0x8dca: // INT_SAMPLER_2D\n\t\tcase 0x8dd2: // UNSIGNED_INT_SAMPLER_2D\n\t\tcase 0x8b62: // SAMPLER_2D_SHADOW\n\t\t\treturn setValueT1;\n\n\t\tcase 0x8b5f: // SAMPLER_3D\n\t\tcase 0x8dcb: // INT_SAMPLER_3D\n\t\tcase 0x8dd3: // UNSIGNED_INT_SAMPLER_3D\n\t\t\treturn setValueT3D1;\n\n\t\tcase 0x8b60: // SAMPLER_CUBE\n\t\tcase 0x8dcc: // INT_SAMPLER_CUBE\n\t\tcase 0x8dd4: // UNSIGNED_INT_SAMPLER_CUBE\n\t\tcase 0x8dc5: // SAMPLER_CUBE_SHADOW\n\t\t\treturn setValueT6;\n\n\t\tcase 0x8dc1: // SAMPLER_2D_ARRAY\n\t\tcase 0x8dcf: // INT_SAMPLER_2D_ARRAY\n\t\tcase 0x8dd7: // UNSIGNED_INT_SAMPLER_2D_ARRAY\n\t\tcase 0x8dc4: // SAMPLER_2D_ARRAY_SHADOW\n\t\t\treturn setValueT2DArray1;\n\n\t}\n\n}\n\n\n// Array of scalars\n\nfunction setValueV1fArray( gl, v ) {\n\n\tgl.uniform1fv( this.addr, v );\n\n}\n\n// Array of vectors (from flat array or array of THREE.VectorN)\n\nfunction setValueV2fArray( gl, v ) {\n\n\tconst data = flatten( v, this.size, 2 );\n\n\tgl.uniform2fv( this.addr, data );\n\n}\n\nfunction setValueV3fArray( gl, v ) {\n\n\tconst data = flatten( v, this.size, 3 );\n\n\tgl.uniform3fv( this.addr, data );\n\n}\n\nfunction setValueV4fArray( gl, v ) {\n\n\tconst data = flatten( v, this.size, 4 );\n\n\tgl.uniform4fv( this.addr, data );\n\n}\n\n// Array of matrices (from flat array or array of THREE.MatrixN)\n\nfunction setValueM2Array( gl, v ) {\n\n\tconst data = flatten( v, this.size, 4 );\n\n\tgl.uniformMatrix2fv( this.addr, false, data );\n\n}\n\nfunction setValueM3Array( gl, v ) {\n\n\tconst data = flatten( v, this.size, 9 );\n\n\tgl.uniformMatrix3fv( this.addr, false, data );\n\n}\n\nfunction setValueM4Array( gl, v ) {\n\n\tconst data = flatten( v, this.size, 16 );\n\n\tgl.uniformMatrix4fv( this.addr, false, data );\n\n}\n\n// Array of integer / boolean\n\nfunction setValueV1iArray( gl, v ) {\n\n\tgl.uniform1iv( this.addr, v );\n\n}\n\n// Array of integer / boolean vectors (from flat array)\n\nfunction setValueV2iArray( gl, v ) {\n\n\tgl.uniform2iv( this.addr, v );\n\n}\n\nfunction setValueV3iArray( gl, v ) {\n\n\tgl.uniform3iv( this.addr, v );\n\n}\n\nfunction setValueV4iArray( gl, v ) {\n\n\tgl.uniform4iv( this.addr, v );\n\n}\n\n// Array of unsigned integer\n\nfunction setValueV1uiArray( gl, v ) {\n\n\tgl.uniform1uiv( this.addr, v );\n\n}\n\n// Array of unsigned integer vectors (from flat array)\n\nfunction setValueV2uiArray( gl, v ) {\n\n\tgl.uniform2uiv( this.addr, v );\n\n}\n\nfunction setValueV3uiArray( gl, v ) {\n\n\tgl.uniform3uiv( this.addr, v );\n\n}\n\nfunction setValueV4uiArray( gl, v ) {\n\n\tgl.uniform4uiv( this.addr, v );\n\n}\n\n\n// Array of textures (2D / 3D / Cube / 2DArray)\n\nfunction setValueT1Array( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\n\tconst n = v.length;\n\n\tconst units = allocTexUnits( textures, n );\n\n\tif ( ! arraysEqual( cache, units ) ) {\n\n\t\tgl.uniform1iv( this.addr, units );\n\n\t\tcopyArray( cache, units );\n\n\t}\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\ttextures.setTexture2D( v[ i ] || emptyTexture, units[ i ] );\n\n\t}\n\n}\n\nfunction setValueT3DArray( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\n\tconst n = v.length;\n\n\tconst units = allocTexUnits( textures, n );\n\n\tif ( ! arraysEqual( cache, units ) ) {\n\n\t\tgl.uniform1iv( this.addr, units );\n\n\t\tcopyArray( cache, units );\n\n\t}\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\ttextures.setTexture3D( v[ i ] || empty3dTexture, units[ i ] );\n\n\t}\n\n}\n\nfunction setValueT6Array( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\n\tconst n = v.length;\n\n\tconst units = allocTexUnits( textures, n );\n\n\tif ( ! arraysEqual( cache, units ) ) {\n\n\t\tgl.uniform1iv( this.addr, units );\n\n\t\tcopyArray( cache, units );\n\n\t}\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\ttextures.setTextureCube( v[ i ] || emptyCubeTexture, units[ i ] );\n\n\t}\n\n}\n\nfunction setValueT2DArrayArray( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\n\tconst n = v.length;\n\n\tconst units = allocTexUnits( textures, n );\n\n\tif ( ! arraysEqual( cache, units ) ) {\n\n\t\tgl.uniform1iv( this.addr, units );\n\n\t\tcopyArray( cache, units );\n\n\t}\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\ttextures.setTexture2DArray( v[ i ] || emptyArrayTexture, units[ i ] );\n\n\t}\n\n}\n\n\n// Helper to pick the right setter for a pure (bottom-level) array\n\nfunction getPureArraySetter( type ) {\n\n\tswitch ( type ) {\n\n\t\tcase 0x1406: return setValueV1fArray; // FLOAT\n\t\tcase 0x8b50: return setValueV2fArray; // _VEC2\n\t\tcase 0x8b51: return setValueV3fArray; // _VEC3\n\t\tcase 0x8b52: return setValueV4fArray; // _VEC4\n\n\t\tcase 0x8b5a: return setValueM2Array; // _MAT2\n\t\tcase 0x8b5b: return setValueM3Array; // _MAT3\n\t\tcase 0x8b5c: return setValueM4Array; // _MAT4\n\n\t\tcase 0x1404: case 0x8b56: return setValueV1iArray; // INT, BOOL\n\t\tcase 0x8b53: case 0x8b57: return setValueV2iArray; // _VEC2\n\t\tcase 0x8b54: case 0x8b58: return setValueV3iArray; // _VEC3\n\t\tcase 0x8b55: case 0x8b59: return setValueV4iArray; // _VEC4\n\n\t\tcase 0x1405: return setValueV1uiArray; // UINT\n\t\tcase 0x8dc6: return setValueV2uiArray; // _VEC2\n\t\tcase 0x8dc7: return setValueV3uiArray; // _VEC3\n\t\tcase 0x8dc8: return setValueV4uiArray; // _VEC4\n\n\t\tcase 0x8b5e: // SAMPLER_2D\n\t\tcase 0x8d66: // SAMPLER_EXTERNAL_OES\n\t\tcase 0x8dca: // INT_SAMPLER_2D\n\t\tcase 0x8dd2: // UNSIGNED_INT_SAMPLER_2D\n\t\tcase 0x8b62: // SAMPLER_2D_SHADOW\n\t\t\treturn setValueT1Array;\n\n\t\tcase 0x8b5f: // SAMPLER_3D\n\t\tcase 0x8dcb: // INT_SAMPLER_3D\n\t\tcase 0x8dd3: // UNSIGNED_INT_SAMPLER_3D\n\t\t\treturn setValueT3DArray;\n\n\t\tcase 0x8b60: // SAMPLER_CUBE\n\t\tcase 0x8dcc: // INT_SAMPLER_CUBE\n\t\tcase 0x8dd4: // UNSIGNED_INT_SAMPLER_CUBE\n\t\tcase 0x8dc5: // SAMPLER_CUBE_SHADOW\n\t\t\treturn setValueT6Array;\n\n\t\tcase 0x8dc1: // SAMPLER_2D_ARRAY\n\t\tcase 0x8dcf: // INT_SAMPLER_2D_ARRAY\n\t\tcase 0x8dd7: // UNSIGNED_INT_SAMPLER_2D_ARRAY\n\t\tcase 0x8dc4: // SAMPLER_2D_ARRAY_SHADOW\n\t\t\treturn setValueT2DArrayArray;\n\n\t}\n\n}\n\n// --- Uniform Classes ---\n\nclass SingleUniform {\n\n\tconstructor( id, activeInfo, addr ) {\n\n\t\tthis.id = id;\n\t\tthis.addr = addr;\n\t\tthis.cache = [];\n\t\tthis.type = activeInfo.type;\n\t\tthis.setValue = getSingularSetter( activeInfo.type );\n\n\t\t// this.path = activeInfo.name; // DEBUG\n\n\t}\n\n}\n\nclass PureArrayUniform {\n\n\tconstructor( id, activeInfo, addr ) {\n\n\t\tthis.id = id;\n\t\tthis.addr = addr;\n\t\tthis.cache = [];\n\t\tthis.type = activeInfo.type;\n\t\tthis.size = activeInfo.size;\n\t\tthis.setValue = getPureArraySetter( activeInfo.type );\n\n\t\t// this.path = activeInfo.name; // DEBUG\n\n\t}\n\n}\n\nclass StructuredUniform {\n\n\tconstructor( id ) {\n\n\t\tthis.id = id;\n\n\t\tthis.seq = [];\n\t\tthis.map = {};\n\n\t}\n\n\tsetValue( gl, value, textures ) {\n\n\t\tconst seq = this.seq;\n\n\t\tfor ( let i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\t\tconst u = seq[ i ];\n\t\t\tu.setValue( gl, value[ u.id ], textures );\n\n\t\t}\n\n\t}\n\n}\n\n// --- Top-level ---\n\n// Parser - builds up the property tree from the path strings\n\nconst RePathPart = /(\\w+)(\\])?(\\[|\\.)?/g;\n\n// extracts\n// \t- the identifier (member name or array index)\n//  - followed by an optional right bracket (found when array index)\n//  - followed by an optional left bracket or dot (type of subscript)\n//\n// Note: These portions can be read in a non-overlapping fashion and\n// allow straightforward parsing of the hierarchy that WebGL encodes\n// in the uniform names.\n\nfunction addUniform( container, uniformObject ) {\n\n\tcontainer.seq.push( uniformObject );\n\tcontainer.map[ uniformObject.id ] = uniformObject;\n\n}\n\nfunction parseUniform( activeInfo, addr, container ) {\n\n\tconst path = activeInfo.name,\n\t\tpathLength = path.length;\n\n\t// reset RegExp object, because of the early exit of a previous run\n\tRePathPart.lastIndex = 0;\n\n\twhile ( true ) {\n\n\t\tconst match = RePathPart.exec( path ),\n\t\t\tmatchEnd = RePathPart.lastIndex;\n\n\t\tlet id = match[ 1 ];\n\t\tconst idIsIndex = match[ 2 ] === ']',\n\t\t\tsubscript = match[ 3 ];\n\n\t\tif ( idIsIndex ) id = id | 0; // convert to integer\n\n\t\tif ( subscript === undefined || subscript === '[' && matchEnd + 2 === pathLength ) {\n\n\t\t\t// bare name or \"pure\" bottom-level array \"[0]\" suffix\n\n\t\t\taddUniform( container, subscript === undefined ?\n\t\t\t\tnew SingleUniform( id, activeInfo, addr ) :\n\t\t\t\tnew PureArrayUniform( id, activeInfo, addr ) );\n\n\t\t\tbreak;\n\n\t\t} else {\n\n\t\t\t// step into inner node / create it in case it doesn't exist\n\n\t\t\tconst map = container.map;\n\t\t\tlet next = map[ id ];\n\n\t\t\tif ( next === undefined ) {\n\n\t\t\t\tnext = new StructuredUniform( id );\n\t\t\t\taddUniform( container, next );\n\n\t\t\t}\n\n\t\t\tcontainer = next;\n\n\t\t}\n\n\t}\n\n}\n\n// Root Container\n\nclass WebGLUniforms {\n\n\tconstructor( gl, program ) {\n\n\t\tthis.seq = [];\n\t\tthis.map = {};\n\n\t\tconst n = gl.getProgramParameter( program, gl.ACTIVE_UNIFORMS );\n\n\t\tfor ( let i = 0; i < n; ++ i ) {\n\n\t\t\tconst info = gl.getActiveUniform( program, i ),\n\t\t\t\taddr = gl.getUniformLocation( program, info.name );\n\n\t\t\tparseUniform( info, addr, this );\n\n\t\t}\n\n\t}\n\n\tsetValue( gl, name, value, textures ) {\n\n\t\tconst u = this.map[ name ];\n\n\t\tif ( u !== undefined ) u.setValue( gl, value, textures );\n\n\t}\n\n\tsetOptional( gl, object, name ) {\n\n\t\tconst v = object[ name ];\n\n\t\tif ( v !== undefined ) this.setValue( gl, name, v );\n\n\t}\n\n\tstatic upload( gl, seq, values, textures ) {\n\n\t\tfor ( let i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\t\tconst u = seq[ i ],\n\t\t\t\tv = values[ u.id ];\n\n\t\t\tif ( v.needsUpdate !== false ) {\n\n\t\t\t\t// note: always updating when .needsUpdate is undefined\n\t\t\t\tu.setValue( gl, v.value, textures );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tstatic seqWithValue( seq, values ) {\n\n\t\tconst r = [];\n\n\t\tfor ( let i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\t\tconst u = seq[ i ];\n\t\t\tif ( u.id in values ) r.push( u );\n\n\t\t}\n\n\t\treturn r;\n\n\t}\n\n}\n\nfunction WebGLShader( gl, type, string ) {\n\n\tconst shader = gl.createShader( type );\n\n\tgl.shaderSource( shader, string );\n\tgl.compileShader( shader );\n\n\treturn shader;\n\n}\n\n// From https://www.khronos.org/registry/webgl/extensions/KHR_parallel_shader_compile/\nconst COMPLETION_STATUS_KHR = 0x91B1;\n\nlet programIdCount = 0;\n\nfunction handleSource( string, errorLine ) {\n\n\tconst lines = string.split( '\\n' );\n\tconst lines2 = [];\n\n\tconst from = Math.max( errorLine - 6, 0 );\n\tconst to = Math.min( errorLine + 6, lines.length );\n\n\tfor ( let i = from; i < to; i ++ ) {\n\n\t\tconst line = i + 1;\n\t\tlines2.push( `${line === errorLine ? '>' : ' '} ${line}: ${lines[ i ]}` );\n\n\t}\n\n\treturn lines2.join( '\\n' );\n\n}\n\nconst _m0 = /*@__PURE__*/ new Matrix3();\n\nfunction getEncodingComponents( colorSpace ) {\n\n\tColorManagement._getMatrix( _m0, ColorManagement.workingColorSpace, colorSpace );\n\n\tconst encodingMatrix = `mat3( ${ _m0.elements.map( ( v ) => v.toFixed( 4 ) ) } )`;\n\n\tswitch ( ColorManagement.getTransfer( colorSpace ) ) {\n\n\t\tcase LinearTransfer:\n\t\t\treturn [ encodingMatrix, 'LinearTransferOETF' ];\n\n\t\tcase SRGBTransfer:\n\t\t\treturn [ encodingMatrix, 'sRGBTransferOETF' ];\n\n\t\tdefault:\n\t\t\twarn( 'WebGLProgram: Unsupported color space: ', colorSpace );\n\t\t\treturn [ encodingMatrix, 'LinearTransferOETF' ];\n\n\t}\n\n}\n\nfunction getShaderErrors( gl, shader, type ) {\n\n\tconst status = gl.getShaderParameter( shader, gl.COMPILE_STATUS );\n\n\tconst shaderInfoLog = gl.getShaderInfoLog( shader ) || '';\n\tconst errors = shaderInfoLog.trim();\n\n\tif ( status && errors === '' ) return '';\n\n\tconst errorMatches = /ERROR: 0:(\\d+)/.exec( errors );\n\tif ( errorMatches ) {\n\n\t\t// --enable-privileged-webgl-extension\n\t\t// log( '**' + type + '**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( shader ) );\n\n\t\tconst errorLine = parseInt( errorMatches[ 1 ] );\n\t\treturn type.toUpperCase() + '\\n\\n' + errors + '\\n\\n' + handleSource( gl.getShaderSource( shader ), errorLine );\n\n\t} else {\n\n\t\treturn errors;\n\n\t}\n\n}\n\nfunction getTexelEncodingFunction( functionName, colorSpace ) {\n\n\tconst components = getEncodingComponents( colorSpace );\n\n\treturn [\n\n\t\t`vec4 ${functionName}( vec4 value ) {`,\n\n\t\t`\treturn ${components[ 1 ]}( vec4( value.rgb * ${components[ 0 ]}, value.a ) );`,\n\n\t\t'}',\n\n\t].join( '\\n' );\n\n}\n\nfunction getToneMappingFunction( functionName, toneMapping ) {\n\n\tlet toneMappingName;\n\n\tswitch ( toneMapping ) {\n\n\t\tcase LinearToneMapping:\n\t\t\ttoneMappingName = 'Linear';\n\t\t\tbreak;\n\n\t\tcase ReinhardToneMapping:\n\t\t\ttoneMappingName = 'Reinhard';\n\t\t\tbreak;\n\n\t\tcase CineonToneMapping:\n\t\t\ttoneMappingName = 'Cineon';\n\t\t\tbreak;\n\n\t\tcase ACESFilmicToneMapping:\n\t\t\ttoneMappingName = 'ACESFilmic';\n\t\t\tbreak;\n\n\t\tcase AgXToneMapping:\n\t\t\ttoneMappingName = 'AgX';\n\t\t\tbreak;\n\n\t\tcase NeutralToneMapping:\n\t\t\ttoneMappingName = 'Neutral';\n\t\t\tbreak;\n\n\t\tcase CustomToneMapping:\n\t\t\ttoneMappingName = 'Custom';\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\twarn( 'WebGLProgram: Unsupported toneMapping:', toneMapping );\n\t\t\ttoneMappingName = 'Linear';\n\n\t}\n\n\treturn 'vec3 ' + functionName + '( vec3 color ) { return ' + toneMappingName + 'ToneMapping( color ); }';\n\n}\n\nconst _v0 = /*@__PURE__*/ new Vector3();\n\nfunction getLuminanceFunction() {\n\n\tColorManagement.getLuminanceCoefficients( _v0 );\n\n\tconst r = _v0.x.toFixed( 4 );\n\tconst g = _v0.y.toFixed( 4 );\n\tconst b = _v0.z.toFixed( 4 );\n\n\treturn [\n\n\t\t'float luminance( const in vec3 rgb ) {',\n\n\t\t`\tconst vec3 weights = vec3( ${ r }, ${ g }, ${ b } );`,\n\n\t\t'\treturn dot( weights, rgb );',\n\n\t\t'}'\n\n\t].join( '\\n' );\n\n}\n\nfunction generateVertexExtensions( parameters ) {\n\n\tconst chunks = [\n\t\tparameters.extensionClipCullDistance ? '#extension GL_ANGLE_clip_cull_distance : require' : '',\n\t\tparameters.extensionMultiDraw ? '#extension GL_ANGLE_multi_draw : require' : '',\n\t];\n\n\treturn chunks.filter( filterEmptyLine ).join( '\\n' );\n\n}\n\nfunction generateDefines( defines ) {\n\n\tconst chunks = [];\n\n\tfor ( const name in defines ) {\n\n\t\tconst value = defines[ name ];\n\n\t\tif ( value === false ) continue;\n\n\t\tchunks.push( '#define ' + name + ' ' + value );\n\n\t}\n\n\treturn chunks.join( '\\n' );\n\n}\n\nfunction fetchAttributeLocations( gl, program ) {\n\n\tconst attributes = {};\n\n\tconst n = gl.getProgramParameter( program, gl.ACTIVE_ATTRIBUTES );\n\n\tfor ( let i = 0; i < n; i ++ ) {\n\n\t\tconst info = gl.getActiveAttrib( program, i );\n\t\tconst name = info.name;\n\n\t\tlet locationSize = 1;\n\t\tif ( info.type === gl.FLOAT_MAT2 ) locationSize = 2;\n\t\tif ( info.type === gl.FLOAT_MAT3 ) locationSize = 3;\n\t\tif ( info.type === gl.FLOAT_MAT4 ) locationSize = 4;\n\n\t\t// log( 'WebGLProgram: ACTIVE VERTEX ATTRIBUTE:', name, i );\n\n\t\tattributes[ name ] = {\n\t\t\ttype: info.type,\n\t\t\tlocation: gl.getAttribLocation( program, name ),\n\t\t\tlocationSize: locationSize\n\t\t};\n\n\t}\n\n\treturn attributes;\n\n}\n\nfunction filterEmptyLine( string ) {\n\n\treturn string !== '';\n\n}\n\nfunction replaceLightNums( string, parameters ) {\n\n\tconst numSpotLightCoords = parameters.numSpotLightShadows + parameters.numSpotLightMaps - parameters.numSpotLightShadowsWithMaps;\n\n\treturn string\n\t\t.replace( /NUM_DIR_LIGHTS/g, parameters.numDirLights )\n\t\t.replace( /NUM_SPOT_LIGHTS/g, parameters.numSpotLights )\n\t\t.replace( /NUM_SPOT_LIGHT_MAPS/g, parameters.numSpotLightMaps )\n\t\t.replace( /NUM_SPOT_LIGHT_COORDS/g, numSpotLightCoords )\n\t\t.replace( /NUM_RECT_AREA_LIGHTS/g, parameters.numRectAreaLights )\n\t\t.replace( /NUM_POINT_LIGHTS/g, parameters.numPointLights )\n\t\t.replace( /NUM_HEMI_LIGHTS/g, parameters.numHemiLights )\n\t\t.replace( /NUM_DIR_LIGHT_SHADOWS/g, parameters.numDirLightShadows )\n\t\t.replace( /NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS/g, parameters.numSpotLightShadowsWithMaps )\n\t\t.replace( /NUM_SPOT_LIGHT_SHADOWS/g, parameters.numSpotLightShadows )\n\t\t.replace( /NUM_POINT_LIGHT_SHADOWS/g, parameters.numPointLightShadows );\n\n}\n\nfunction replaceClippingPlaneNums( string, parameters ) {\n\n\treturn string\n\t\t.replace( /NUM_CLIPPING_PLANES/g, parameters.numClippingPlanes )\n\t\t.replace( /UNION_CLIPPING_PLANES/g, ( parameters.numClippingPlanes - parameters.numClipIntersection ) );\n\n}\n\n// Resolve Includes\n\nconst includePattern = /^[ \\t]*#include +<([\\w\\d./]+)>/gm;\n\nfunction resolveIncludes( string ) {\n\n\treturn string.replace( includePattern, includeReplacer );\n\n}\n\nconst shaderChunkMap = new Map();\n\nfunction includeReplacer( match, include ) {\n\n\tlet string = ShaderChunk[ include ];\n\n\tif ( string === undefined ) {\n\n\t\tconst newInclude = shaderChunkMap.get( include );\n\n\t\tif ( newInclude !== undefined ) {\n\n\t\t\tstring = ShaderChunk[ newInclude ];\n\t\t\twarn( 'WebGLRenderer: Shader chunk \"%s\" has been deprecated. Use \"%s\" instead.', include, newInclude );\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'Can not resolve #include <' + include + '>' );\n\n\t\t}\n\n\t}\n\n\treturn resolveIncludes( string );\n\n}\n\n// Unroll Loops\n\nconst unrollLoopPattern = /#pragma unroll_loop_start\\s+for\\s*\\(\\s*int\\s+i\\s*=\\s*(\\d+)\\s*;\\s*i\\s*<\\s*(\\d+)\\s*;\\s*i\\s*\\+\\+\\s*\\)\\s*{([\\s\\S]+?)}\\s+#pragma unroll_loop_end/g;\n\nfunction unrollLoops( string ) {\n\n\treturn string.replace( unrollLoopPattern, loopReplacer );\n\n}\n\nfunction loopReplacer( match, start, end, snippet ) {\n\n\tlet string = '';\n\n\tfor ( let i = parseInt( start ); i < parseInt( end ); i ++ ) {\n\n\t\tstring += snippet\n\t\t\t.replace( /\\[\\s*i\\s*\\]/g, '[ ' + i + ' ]' )\n\t\t\t.replace( /UNROLLED_LOOP_INDEX/g, i );\n\n\t}\n\n\treturn string;\n\n}\n\n//\n\nfunction generatePrecision( parameters ) {\n\n\tlet precisionstring = `precision ${parameters.precision} float;\n\tprecision ${parameters.precision} int;\n\tprecision ${parameters.precision} sampler2D;\n\tprecision ${parameters.precision} samplerCube;\n\tprecision ${parameters.precision} sampler3D;\n\tprecision ${parameters.precision} sampler2DArray;\n\tprecision ${parameters.precision} sampler2DShadow;\n\tprecision ${parameters.precision} samplerCubeShadow;\n\tprecision ${parameters.precision} sampler2DArrayShadow;\n\tprecision ${parameters.precision} isampler2D;\n\tprecision ${parameters.precision} isampler3D;\n\tprecision ${parameters.precision} isamplerCube;\n\tprecision ${parameters.precision} isampler2DArray;\n\tprecision ${parameters.precision} usampler2D;\n\tprecision ${parameters.precision} usampler3D;\n\tprecision ${parameters.precision} usamplerCube;\n\tprecision ${parameters.precision} usampler2DArray;\n\t`;\n\n\tif ( parameters.precision === 'highp' ) {\n\n\t\tprecisionstring += '\\n#define HIGH_PRECISION';\n\n\t} else if ( parameters.precision === 'mediump' ) {\n\n\t\tprecisionstring += '\\n#define MEDIUM_PRECISION';\n\n\t} else if ( parameters.precision === 'lowp' ) {\n\n\t\tprecisionstring += '\\n#define LOW_PRECISION';\n\n\t}\n\n\treturn precisionstring;\n\n}\n\nfunction generateShadowMapTypeDefine( parameters ) {\n\n\tlet shadowMapTypeDefine = 'SHADOWMAP_TYPE_BASIC';\n\n\tif ( parameters.shadowMapType === PCFShadowMap ) {\n\n\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF';\n\n\t} else if ( parameters.shadowMapType === PCFSoftShadowMap ) {\n\n\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF_SOFT';\n\n\t} else if ( parameters.shadowMapType === VSMShadowMap ) {\n\n\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_VSM';\n\n\t}\n\n\treturn shadowMapTypeDefine;\n\n}\n\nfunction generateEnvMapTypeDefine( parameters ) {\n\n\tlet envMapTypeDefine = 'ENVMAP_TYPE_CUBE';\n\n\tif ( parameters.envMap ) {\n\n\t\tswitch ( parameters.envMapMode ) {\n\n\t\t\tcase CubeReflectionMapping:\n\t\t\tcase CubeRefractionMapping:\n\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_CUBE';\n\t\t\t\tbreak;\n\n\t\t\tcase CubeUVReflectionMapping:\n\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_CUBE_UV';\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\treturn envMapTypeDefine;\n\n}\n\nfunction generateEnvMapModeDefine( parameters ) {\n\n\tlet envMapModeDefine = 'ENVMAP_MODE_REFLECTION';\n\n\tif ( parameters.envMap ) {\n\n\t\tswitch ( parameters.envMapMode ) {\n\n\t\t\tcase CubeRefractionMapping:\n\n\t\t\t\tenvMapModeDefine = 'ENVMAP_MODE_REFRACTION';\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\treturn envMapModeDefine;\n\n}\n\nfunction generateEnvMapBlendingDefine( parameters ) {\n\n\tlet envMapBlendingDefine = 'ENVMAP_BLENDING_NONE';\n\n\tif ( parameters.envMap ) {\n\n\t\tswitch ( parameters.combine ) {\n\n\t\t\tcase MultiplyOperation:\n\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY';\n\t\t\t\tbreak;\n\n\t\t\tcase MixOperation:\n\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_MIX';\n\t\t\t\tbreak;\n\n\t\t\tcase AddOperation:\n\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_ADD';\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\treturn envMapBlendingDefine;\n\n}\n\nfunction generateCubeUVSize( parameters ) {\n\n\tconst imageHeight = parameters.envMapCubeUVHeight;\n\n\tif ( imageHeight === null ) return null;\n\n\tconst maxMip = Math.log2( imageHeight ) - 2;\n\n\tconst texelHeight = 1.0 / imageHeight;\n\n\tconst texelWidth = 1.0 / ( 3 * Math.max( Math.pow( 2, maxMip ), 7 * 16 ) );\n\n\treturn { texelWidth, texelHeight, maxMip };\n\n}\n\nfunction WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {\n\n\t// TODO Send this event to Three.js DevTools\n\t// log( 'WebGLProgram', cacheKey );\n\n\tconst gl = renderer.getContext();\n\n\tconst defines = parameters.defines;\n\n\tlet vertexShader = parameters.vertexShader;\n\tlet fragmentShader = parameters.fragmentShader;\n\n\tconst shadowMapTypeDefine = generateShadowMapTypeDefine( parameters );\n\tconst envMapTypeDefine = generateEnvMapTypeDefine( parameters );\n\tconst envMapModeDefine = generateEnvMapModeDefine( parameters );\n\tconst envMapBlendingDefine = generateEnvMapBlendingDefine( parameters );\n\tconst envMapCubeUVSize = generateCubeUVSize( parameters );\n\n\tconst customVertexExtensions = generateVertexExtensions( parameters );\n\n\tconst customDefines = generateDefines( defines );\n\n\tconst program = gl.createProgram();\n\n\tlet prefixVertex, prefixFragment;\n\tlet versionString = parameters.glslVersion ? '#version ' + parameters.glslVersion + '\\n' : '';\n\n\tif ( parameters.isRawShaderMaterial ) {\n\n\t\tprefixVertex = [\n\n\t\t\t'#define SHADER_TYPE ' + parameters.shaderType,\n\t\t\t'#define SHADER_NAME ' + parameters.shaderName,\n\n\t\t\tcustomDefines\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\tif ( prefixVertex.length > 0 ) {\n\n\t\t\tprefixVertex += '\\n';\n\n\t\t}\n\n\t\tprefixFragment = [\n\n\t\t\t'#define SHADER_TYPE ' + parameters.shaderType,\n\t\t\t'#define SHADER_NAME ' + parameters.shaderName,\n\n\t\t\tcustomDefines\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\tif ( prefixFragment.length > 0 ) {\n\n\t\t\tprefixFragment += '\\n';\n\n\t\t}\n\n\t} else {\n\n\t\tprefixVertex = [\n\n\t\t\tgeneratePrecision( parameters ),\n\n\t\t\t'#define SHADER_TYPE ' + parameters.shaderType,\n\t\t\t'#define SHADER_NAME ' + parameters.shaderName,\n\n\t\t\tcustomDefines,\n\n\t\t\tparameters.extensionClipCullDistance ? '#define USE_CLIP_DISTANCE' : '',\n\t\t\tparameters.batching ? '#define USE_BATCHING' : '',\n\t\t\tparameters.batchingColor ? '#define USE_BATCHING_COLOR' : '',\n\t\t\tparameters.instancing ? '#define USE_INSTANCING' : '',\n\t\t\tparameters.instancingColor ? '#define USE_INSTANCING_COLOR' : '',\n\t\t\tparameters.instancingMorph ? '#define USE_INSTANCING_MORPH' : '',\n\n\t\t\tparameters.useFog && parameters.fog ? '#define USE_FOG' : '',\n\t\t\tparameters.useFog && parameters.fogExp2 ? '#define FOG_EXP2' : '',\n\n\t\t\tparameters.map ? '#define USE_MAP' : '',\n\t\t\tparameters.envMap ? '#define USE_ENVMAP' : '',\n\t\t\tparameters.envMap ? '#define ' + envMapModeDefine : '',\n\t\t\tparameters.lightMap ? '#define USE_LIGHTMAP' : '',\n\t\t\tparameters.aoMap ? '#define USE_AOMAP' : '',\n\t\t\tparameters.bumpMap ? '#define USE_BUMPMAP' : '',\n\t\t\tparameters.normalMap ? '#define USE_NORMALMAP' : '',\n\t\t\tparameters.normalMapObjectSpace ? '#define USE_NORMALMAP_OBJECTSPACE' : '',\n\t\t\tparameters.normalMapTangentSpace ? '#define USE_NORMALMAP_TANGENTSPACE' : '',\n\t\t\tparameters.displacementMap ? '#define USE_DISPLACEMENTMAP' : '',\n\t\t\tparameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',\n\n\t\t\tparameters.anisotropy ? '#define USE_ANISOTROPY' : '',\n\t\t\tparameters.anisotropyMap ? '#define USE_ANISOTROPYMAP' : '',\n\n\t\t\tparameters.clearcoatMap ? '#define USE_CLEARCOATMAP' : '',\n\t\t\tparameters.clearcoatRoughnessMap ? '#define USE_CLEARCOAT_ROUGHNESSMAP' : '',\n\t\t\tparameters.clearcoatNormalMap ? '#define USE_CLEARCOAT_NORMALMAP' : '',\n\n\t\t\tparameters.iridescenceMap ? '#define USE_IRIDESCENCEMAP' : '',\n\t\t\tparameters.iridescenceThicknessMap ? '#define USE_IRIDESCENCE_THICKNESSMAP' : '',\n\n\t\t\tparameters.specularMap ? '#define USE_SPECULARMAP' : '',\n\t\t\tparameters.specularColorMap ? '#define USE_SPECULAR_COLORMAP' : '',\n\t\t\tparameters.specularIntensityMap ? '#define USE_SPECULAR_INTENSITYMAP' : '',\n\n\t\t\tparameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',\n\t\t\tparameters.metalnessMap ? '#define USE_METALNESSMAP' : '',\n\t\t\tparameters.alphaMap ? '#define USE_ALPHAMAP' : '',\n\t\t\tparameters.alphaHash ? '#define USE_ALPHAHASH' : '',\n\n\t\t\tparameters.transmission ? '#define USE_TRANSMISSION' : '',\n\t\t\tparameters.transmissionMap ? '#define USE_TRANSMISSIONMAP' : '',\n\t\t\tparameters.thicknessMap ? '#define USE_THICKNESSMAP' : '',\n\n\t\t\tparameters.sheenColorMap ? '#define USE_SHEEN_COLORMAP' : '',\n\t\t\tparameters.sheenRoughnessMap ? '#define USE_SHEEN_ROUGHNESSMAP' : '',\n\n\t\t\t//\n\n\t\t\tparameters.mapUv ? '#define MAP_UV ' + parameters.mapUv : '',\n\t\t\tparameters.alphaMapUv ? '#define ALPHAMAP_UV ' + parameters.alphaMapUv : '',\n\t\t\tparameters.lightMapUv ? '#define LIGHTMAP_UV ' + parameters.lightMapUv : '',\n\t\t\tparameters.aoMapUv ? '#define AOMAP_UV ' + parameters.aoMapUv : '',\n\t\t\tparameters.emissiveMapUv ? '#define EMISSIVEMAP_UV ' + parameters.emissiveMapUv : '',\n\t\t\tparameters.bumpMapUv ? '#define BUMPMAP_UV ' + parameters.bumpMapUv : '',\n\t\t\tparameters.normalMapUv ? '#define NORMALMAP_UV ' + parameters.normalMapUv : '',\n\t\t\tparameters.displacementMapUv ? '#define DISPLACEMENTMAP_UV ' + parameters.displacementMapUv : '',\n\n\t\t\tparameters.metalnessMapUv ? '#define METALNESSMAP_UV ' + parameters.metalnessMapUv : '',\n\t\t\tparameters.roughnessMapUv ? '#define ROUGHNESSMAP_UV ' + parameters.roughnessMapUv : '',\n\n\t\t\tparameters.anisotropyMapUv ? '#define ANISOTROPYMAP_UV ' + parameters.anisotropyMapUv : '',\n\n\t\t\tparameters.clearcoatMapUv ? '#define CLEARCOATMAP_UV ' + parameters.clearcoatMapUv : '',\n\t\t\tparameters.clearcoatNormalMapUv ? '#define CLEARCOAT_NORMALMAP_UV ' + parameters.clearcoatNormalMapUv : '',\n\t\t\tparameters.clearcoatRoughnessMapUv ? '#define CLEARCOAT_ROUGHNESSMAP_UV ' + parameters.clearcoatRoughnessMapUv : '',\n\n\t\t\tparameters.iridescenceMapUv ? '#define IRIDESCENCEMAP_UV ' + parameters.iridescenceMapUv : '',\n\t\t\tparameters.iridescenceThicknessMapUv ? '#define IRIDESCENCE_THICKNESSMAP_UV ' + parameters.iridescenceThicknessMapUv : '',\n\n\t\t\tparameters.sheenColorMapUv ? '#define SHEEN_COLORMAP_UV ' + parameters.sheenColorMapUv : '',\n\t\t\tparameters.sheenRoughnessMapUv ? '#define SHEEN_ROUGHNESSMAP_UV ' + parameters.sheenRoughnessMapUv : '',\n\n\t\t\tparameters.specularMapUv ? '#define SPECULARMAP_UV ' + parameters.specularMapUv : '',\n\t\t\tparameters.specularColorMapUv ? '#define SPECULAR_COLORMAP_UV ' + parameters.specularColorMapUv : '',\n\t\t\tparameters.specularIntensityMapUv ? '#define SPECULAR_INTENSITYMAP_UV ' + parameters.specularIntensityMapUv : '',\n\n\t\t\tparameters.transmissionMapUv ? '#define TRANSMISSIONMAP_UV ' + parameters.transmissionMapUv : '',\n\t\t\tparameters.thicknessMapUv ? '#define THICKNESSMAP_UV ' + parameters.thicknessMapUv : '',\n\n\t\t\t//\n\n\t\t\tparameters.vertexTangents && parameters.flatShading === false ? '#define USE_TANGENT' : '',\n\t\t\tparameters.vertexColors ? '#define USE_COLOR' : '',\n\t\t\tparameters.vertexAlphas ? '#define USE_COLOR_ALPHA' : '',\n\t\t\tparameters.vertexUv1s ? '#define USE_UV1' : '',\n\t\t\tparameters.vertexUv2s ? '#define USE_UV2' : '',\n\t\t\tparameters.vertexUv3s ? '#define USE_UV3' : '',\n\n\t\t\tparameters.pointsUvs ? '#define USE_POINTS_UV' : '',\n\n\t\t\tparameters.flatShading ? '#define FLAT_SHADED' : '',\n\n\t\t\tparameters.skinning ? '#define USE_SKINNING' : '',\n\n\t\t\tparameters.morphTargets ? '#define USE_MORPHTARGETS' : '',\n\t\t\tparameters.morphNormals && parameters.flatShading === false ? '#define USE_MORPHNORMALS' : '',\n\t\t\t( parameters.morphColors ) ? '#define USE_MORPHCOLORS' : '',\n\t\t\t( parameters.morphTargetsCount > 0 ) ? '#define MORPHTARGETS_TEXTURE_STRIDE ' + parameters.morphTextureStride : '',\n\t\t\t( parameters.morphTargetsCount > 0 ) ? '#define MORPHTARGETS_COUNT ' + parameters.morphTargetsCount : '',\n\t\t\tparameters.doubleSided ? '#define DOUBLE_SIDED' : '',\n\t\t\tparameters.flipSided ? '#define FLIP_SIDED' : '',\n\n\t\t\tparameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',\n\t\t\tparameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',\n\n\t\t\tparameters.sizeAttenuation ? '#define USE_SIZEATTENUATION' : '',\n\n\t\t\tparameters.numLightProbes > 0 ? '#define USE_LIGHT_PROBES' : '',\n\n\t\t\tparameters.logarithmicDepthBuffer ? '#define USE_LOGARITHMIC_DEPTH_BUFFER' : '',\n\t\t\tparameters.reversedDepthBuffer ? '#define USE_REVERSED_DEPTH_BUFFER' : '',\n\n\t\t\t'uniform mat4 modelMatrix;',\n\t\t\t'uniform mat4 modelViewMatrix;',\n\t\t\t'uniform mat4 projectionMatrix;',\n\t\t\t'uniform mat4 viewMatrix;',\n\t\t\t'uniform mat3 normalMatrix;',\n\t\t\t'uniform vec3 cameraPosition;',\n\t\t\t'uniform bool isOrthographic;',\n\n\t\t\t'#ifdef USE_INSTANCING',\n\n\t\t\t'\tattribute mat4 instanceMatrix;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_INSTANCING_COLOR',\n\n\t\t\t'\tattribute vec3 instanceColor;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_INSTANCING_MORPH',\n\n\t\t\t'\tuniform sampler2D morphTexture;',\n\n\t\t\t'#endif',\n\n\t\t\t'attribute vec3 position;',\n\t\t\t'attribute vec3 normal;',\n\t\t\t'attribute vec2 uv;',\n\n\t\t\t'#ifdef USE_UV1',\n\n\t\t\t'\tattribute vec2 uv1;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_UV2',\n\n\t\t\t'\tattribute vec2 uv2;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_UV3',\n\n\t\t\t'\tattribute vec2 uv3;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_TANGENT',\n\n\t\t\t'\tattribute vec4 tangent;',\n\n\t\t\t'#endif',\n\n\t\t\t'#if defined( USE_COLOR_ALPHA )',\n\n\t\t\t'\tattribute vec4 color;',\n\n\t\t\t'#elif defined( USE_COLOR )',\n\n\t\t\t'\tattribute vec3 color;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_SKINNING',\n\n\t\t\t'\tattribute vec4 skinIndex;',\n\t\t\t'\tattribute vec4 skinWeight;',\n\n\t\t\t'#endif',\n\n\t\t\t'\\n'\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\tprefixFragment = [\n\n\t\t\tgeneratePrecision( parameters ),\n\n\t\t\t'#define SHADER_TYPE ' + parameters.shaderType,\n\t\t\t'#define SHADER_NAME ' + parameters.shaderName,\n\n\t\t\tcustomDefines,\n\n\t\t\tparameters.useFog && parameters.fog ? '#define USE_FOG' : '',\n\t\t\tparameters.useFog && parameters.fogExp2 ? '#define FOG_EXP2' : '',\n\n\t\t\tparameters.alphaToCoverage ? '#define ALPHA_TO_COVERAGE' : '',\n\t\t\tparameters.map ? '#define USE_MAP' : '',\n\t\t\tparameters.matcap ? '#define USE_MATCAP' : '',\n\t\t\tparameters.envMap ? '#define USE_ENVMAP' : '',\n\t\t\tparameters.envMap ? '#define ' + envMapTypeDefine : '',\n\t\t\tparameters.envMap ? '#define ' + envMapModeDefine : '',\n\t\t\tparameters.envMap ? '#define ' + envMapBlendingDefine : '',\n\t\t\tenvMapCubeUVSize ? '#define CUBEUV_TEXEL_WIDTH ' + envMapCubeUVSize.texelWidth : '',\n\t\t\tenvMapCubeUVSize ? '#define CUBEUV_TEXEL_HEIGHT ' + envMapCubeUVSize.texelHeight : '',\n\t\t\tenvMapCubeUVSize ? '#define CUBEUV_MAX_MIP ' + envMapCubeUVSize.maxMip + '.0' : '',\n\t\t\tparameters.lightMap ? '#define USE_LIGHTMAP' : '',\n\t\t\tparameters.aoMap ? '#define USE_AOMAP' : '',\n\t\t\tparameters.bumpMap ? '#define USE_BUMPMAP' : '',\n\t\t\tparameters.normalMap ? '#define USE_NORMALMAP' : '',\n\t\t\tparameters.normalMapObjectSpace ? '#define USE_NORMALMAP_OBJECTSPACE' : '',\n\t\t\tparameters.normalMapTangentSpace ? '#define USE_NORMALMAP_TANGENTSPACE' : '',\n\t\t\tparameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',\n\n\t\t\tparameters.anisotropy ? '#define USE_ANISOTROPY' : '',\n\t\t\tparameters.anisotropyMap ? '#define USE_ANISOTROPYMAP' : '',\n\n\t\t\tparameters.clearcoat ? '#define USE_CLEARCOAT' : '',\n\t\t\tparameters.clearcoatMap ? '#define USE_CLEARCOATMAP' : '',\n\t\t\tparameters.clearcoatRoughnessMap ? '#define USE_CLEARCOAT_ROUGHNESSMAP' : '',\n\t\t\tparameters.clearcoatNormalMap ? '#define USE_CLEARCOAT_NORMALMAP' : '',\n\n\t\t\tparameters.dispersion ? '#define USE_DISPERSION' : '',\n\n\t\t\tparameters.iridescence ? '#define USE_IRIDESCENCE' : '',\n\t\t\tparameters.iridescenceMap ? '#define USE_IRIDESCENCEMAP' : '',\n\t\t\tparameters.iridescenceThicknessMap ? '#define USE_IRIDESCENCE_THICKNESSMAP' : '',\n\n\t\t\tparameters.specularMap ? '#define USE_SPECULARMAP' : '',\n\t\t\tparameters.specularColorMap ? '#define USE_SPECULAR_COLORMAP' : '',\n\t\t\tparameters.specularIntensityMap ? '#define USE_SPECULAR_INTENSITYMAP' : '',\n\n\t\t\tparameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',\n\t\t\tparameters.metalnessMap ? '#define USE_METALNESSMAP' : '',\n\n\t\t\tparameters.alphaMap ? '#define USE_ALPHAMAP' : '',\n\t\t\tparameters.alphaTest ? '#define USE_ALPHATEST' : '',\n\t\t\tparameters.alphaHash ? '#define USE_ALPHAHASH' : '',\n\n\t\t\tparameters.sheen ? '#define USE_SHEEN' : '',\n\t\t\tparameters.sheenColorMap ? '#define USE_SHEEN_COLORMAP' : '',\n\t\t\tparameters.sheenRoughnessMap ? '#define USE_SHEEN_ROUGHNESSMAP' : '',\n\n\t\t\tparameters.transmission ? '#define USE_TRANSMISSION' : '',\n\t\t\tparameters.transmissionMap ? '#define USE_TRANSMISSIONMAP' : '',\n\t\t\tparameters.thicknessMap ? '#define USE_THICKNESSMAP' : '',\n\n\t\t\tparameters.vertexTangents && parameters.flatShading === false ? '#define USE_TANGENT' : '',\n\t\t\tparameters.vertexColors || parameters.instancingColor || parameters.batchingColor ? '#define USE_COLOR' : '',\n\t\t\tparameters.vertexAlphas ? '#define USE_COLOR_ALPHA' : '',\n\t\t\tparameters.vertexUv1s ? '#define USE_UV1' : '',\n\t\t\tparameters.vertexUv2s ? '#define USE_UV2' : '',\n\t\t\tparameters.vertexUv3s ? '#define USE_UV3' : '',\n\n\t\t\tparameters.pointsUvs ? '#define USE_POINTS_UV' : '',\n\n\t\t\tparameters.gradientMap ? '#define USE_GRADIENTMAP' : '',\n\n\t\t\tparameters.flatShading ? '#define FLAT_SHADED' : '',\n\n\t\t\tparameters.doubleSided ? '#define DOUBLE_SIDED' : '',\n\t\t\tparameters.flipSided ? '#define FLIP_SIDED' : '',\n\n\t\t\tparameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',\n\t\t\tparameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',\n\n\t\t\tparameters.premultipliedAlpha ? '#define PREMULTIPLIED_ALPHA' : '',\n\n\t\t\tparameters.numLightProbes > 0 ? '#define USE_LIGHT_PROBES' : '',\n\n\t\t\tparameters.decodeVideoTexture ? '#define DECODE_VIDEO_TEXTURE' : '',\n\t\t\tparameters.decodeVideoTextureEmissive ? '#define DECODE_VIDEO_TEXTURE_EMISSIVE' : '',\n\n\t\t\tparameters.logarithmicDepthBuffer ? '#define USE_LOGARITHMIC_DEPTH_BUFFER' : '',\n\t\t\tparameters.reversedDepthBuffer ? '#define USE_REVERSED_DEPTH_BUFFER' : '',\n\n\t\t\t'uniform mat4 viewMatrix;',\n\t\t\t'uniform vec3 cameraPosition;',\n\t\t\t'uniform bool isOrthographic;',\n\n\t\t\t( parameters.toneMapping !== NoToneMapping ) ? '#define TONE_MAPPING' : '',\n\t\t\t( parameters.toneMapping !== NoToneMapping ) ? ShaderChunk[ 'tonemapping_pars_fragment' ] : '', // this code is required here because it is used by the toneMapping() function defined below\n\t\t\t( parameters.toneMapping !== NoToneMapping ) ? getToneMappingFunction( 'toneMapping', parameters.toneMapping ) : '',\n\n\t\t\tparameters.dithering ? '#define DITHERING' : '',\n\t\t\tparameters.opaque ? '#define OPAQUE' : '',\n\n\t\t\tShaderChunk[ 'colorspace_pars_fragment' ], // this code is required here because it is used by the various encoding/decoding function defined below\n\t\t\tgetTexelEncodingFunction( 'linearToOutputTexel', parameters.outputColorSpace ),\n\t\t\tgetLuminanceFunction(),\n\n\t\t\tparameters.useDepthPacking ? '#define DEPTH_PACKING ' + parameters.depthPacking : '',\n\n\t\t\t'\\n'\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t}\n\n\tvertexShader = resolveIncludes( vertexShader );\n\tvertexShader = replaceLightNums( vertexShader, parameters );\n\tvertexShader = replaceClippingPlaneNums( vertexShader, parameters );\n\n\tfragmentShader = resolveIncludes( fragmentShader );\n\tfragmentShader = replaceLightNums( fragmentShader, parameters );\n\tfragmentShader = replaceClippingPlaneNums( fragmentShader, parameters );\n\n\tvertexShader = unrollLoops( vertexShader );\n\tfragmentShader = unrollLoops( fragmentShader );\n\n\tif ( parameters.isRawShaderMaterial !== true ) {\n\n\t\t// GLSL 3.0 conversion for built-in materials and ShaderMaterial\n\n\t\tversionString = '#version 300 es\\n';\n\n\t\tprefixVertex = [\n\t\t\tcustomVertexExtensions,\n\t\t\t'#define attribute in',\n\t\t\t'#define varying out',\n\t\t\t'#define texture2D texture'\n\t\t].join( '\\n' ) + '\\n' + prefixVertex;\n\n\t\tprefixFragment = [\n\t\t\t'#define varying in',\n\t\t\t( parameters.glslVersion === GLSL3 ) ? '' : 'layout(location = 0) out highp vec4 pc_fragColor;',\n\t\t\t( parameters.glslVersion === GLSL3 ) ? '' : '#define gl_FragColor pc_fragColor',\n\t\t\t'#define gl_FragDepthEXT gl_FragDepth',\n\t\t\t'#define texture2D texture',\n\t\t\t'#define textureCube texture',\n\t\t\t'#define texture2DProj textureProj',\n\t\t\t'#define texture2DLodEXT textureLod',\n\t\t\t'#define texture2DProjLodEXT textureProjLod',\n\t\t\t'#define textureCubeLodEXT textureLod',\n\t\t\t'#define texture2DGradEXT textureGrad',\n\t\t\t'#define texture2DProjGradEXT textureProjGrad',\n\t\t\t'#define textureCubeGradEXT textureGrad'\n\t\t].join( '\\n' ) + '\\n' + prefixFragment;\n\n\t}\n\n\tconst vertexGlsl = versionString + prefixVertex + vertexShader;\n\tconst fragmentGlsl = versionString + prefixFragment + fragmentShader;\n\n\t// log( '*VERTEX*', vertexGlsl );\n\t// log( '*FRAGMENT*', fragmentGlsl );\n\n\tconst glVertexShader = WebGLShader( gl, gl.VERTEX_SHADER, vertexGlsl );\n\tconst glFragmentShader = WebGLShader( gl, gl.FRAGMENT_SHADER, fragmentGlsl );\n\n\tgl.attachShader( program, glVertexShader );\n\tgl.attachShader( program, glFragmentShader );\n\n\t// Force a particular attribute to index 0.\n\n\tif ( parameters.index0AttributeName !== undefined ) {\n\n\t\tgl.bindAttribLocation( program, 0, parameters.index0AttributeName );\n\n\t} else if ( parameters.morphTargets === true ) {\n\n\t\t// programs with morphTargets displace position out of attribute 0\n\t\tgl.bindAttribLocation( program, 0, 'position' );\n\n\t}\n\n\tgl.linkProgram( program );\n\n\tfunction onFirstUse( self ) {\n\n\t\t// check for link errors\n\t\tif ( renderer.debug.checkShaderErrors ) {\n\n\t\t\tconst programInfoLog = gl.getProgramInfoLog( program ) || '';\n\t\t\tconst vertexShaderInfoLog = gl.getShaderInfoLog( glVertexShader ) || '';\n\t\t\tconst fragmentShaderInfoLog = gl.getShaderInfoLog( glFragmentShader ) || '';\n\n\t\t\tconst programLog = programInfoLog.trim();\n\t\t\tconst vertexLog = vertexShaderInfoLog.trim();\n\t\t\tconst fragmentLog = fragmentShaderInfoLog.trim();\n\n\t\t\tlet runnable = true;\n\t\t\tlet haveDiagnostics = true;\n\n\t\t\tif ( gl.getProgramParameter( program, gl.LINK_STATUS ) === false ) {\n\n\t\t\t\trunnable = false;\n\n\t\t\t\tif ( typeof renderer.debug.onShaderError === 'function' ) {\n\n\t\t\t\t\trenderer.debug.onShaderError( gl, program, glVertexShader, glFragmentShader );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// default error reporting\n\n\t\t\t\t\tconst vertexErrors = getShaderErrors( gl, glVertexShader, 'vertex' );\n\t\t\t\t\tconst fragmentErrors = getShaderErrors( gl, glFragmentShader, 'fragment' );\n\n\t\t\t\t\terror(\n\t\t\t\t\t\t'THREE.WebGLProgram: Shader Error ' + gl.getError() + ' - ' +\n\t\t\t\t\t\t'VALIDATE_STATUS ' + gl.getProgramParameter( program, gl.VALIDATE_STATUS ) + '\\n\\n' +\n\t\t\t\t\t\t'Material Name: ' + self.name + '\\n' +\n\t\t\t\t\t\t'Material Type: ' + self.type + '\\n\\n' +\n\t\t\t\t\t\t'Program Info Log: ' + programLog + '\\n' +\n\t\t\t\t\t\tvertexErrors + '\\n' +\n\t\t\t\t\t\tfragmentErrors\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t} else if ( programLog !== '' ) {\n\n\t\t\t\twarn( 'WebGLProgram: Program Info Log:', programLog );\n\n\t\t\t} else if ( vertexLog === '' || fragmentLog === '' ) {\n\n\t\t\t\thaveDiagnostics = false;\n\n\t\t\t}\n\n\t\t\tif ( haveDiagnostics ) {\n\n\t\t\t\tself.diagnostics = {\n\n\t\t\t\t\trunnable: runnable,\n\n\t\t\t\t\tprogramLog: programLog,\n\n\t\t\t\t\tvertexShader: {\n\n\t\t\t\t\t\tlog: vertexLog,\n\t\t\t\t\t\tprefix: prefixVertex\n\n\t\t\t\t\t},\n\n\t\t\t\t\tfragmentShader: {\n\n\t\t\t\t\t\tlog: fragmentLog,\n\t\t\t\t\t\tprefix: prefixFragment\n\n\t\t\t\t\t}\n\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Clean up\n\n\t\t// Crashes in iOS9 and iOS10. #18402\n\t\t// gl.detachShader( program, glVertexShader );\n\t\t// gl.detachShader( program, glFragmentShader );\n\n\t\tgl.deleteShader( glVertexShader );\n\t\tgl.deleteShader( glFragmentShader );\n\n\t\tcachedUniforms = new WebGLUniforms( gl, program );\n\t\tcachedAttributes = fetchAttributeLocations( gl, program );\n\n\t}\n\n\t// set up caching for uniform locations\n\n\tlet cachedUniforms;\n\n\tthis.getUniforms = function () {\n\n\t\tif ( cachedUniforms === undefined ) {\n\n\t\t\t// Populates cachedUniforms and cachedAttributes\n\t\t\tonFirstUse( this );\n\n\t\t}\n\n\t\treturn cachedUniforms;\n\n\t};\n\n\t// set up caching for attribute locations\n\n\tlet cachedAttributes;\n\n\tthis.getAttributes = function () {\n\n\t\tif ( cachedAttributes === undefined ) {\n\n\t\t\t// Populates cachedAttributes and cachedUniforms\n\t\t\tonFirstUse( this );\n\n\t\t}\n\n\t\treturn cachedAttributes;\n\n\t};\n\n\t// indicate when the program is ready to be used. if the KHR_parallel_shader_compile extension isn't supported,\n\t// flag the program as ready immediately. It may cause a stall when it's first used.\n\n\tlet programReady = ( parameters.rendererExtensionParallelShaderCompile === false );\n\n\tthis.isReady = function () {\n\n\t\tif ( programReady === false ) {\n\n\t\t\tprogramReady = gl.getProgramParameter( program, COMPLETION_STATUS_KHR );\n\n\t\t}\n\n\t\treturn programReady;\n\n\t};\n\n\t// free resource\n\n\tthis.destroy = function () {\n\n\t\tbindingStates.releaseStatesOfProgram( this );\n\n\t\tgl.deleteProgram( program );\n\t\tthis.program = undefined;\n\n\t};\n\n\t//\n\n\tthis.type = parameters.shaderType;\n\tthis.name = parameters.shaderName;\n\tthis.id = programIdCount ++;\n\tthis.cacheKey = cacheKey;\n\tthis.usedTimes = 1;\n\tthis.program = program;\n\tthis.vertexShader = glVertexShader;\n\tthis.fragmentShader = glFragmentShader;\n\n\treturn this;\n\n}\n\nlet _id = 0;\n\nclass WebGLShaderCache {\n\n\tconstructor() {\n\n\t\tthis.shaderCache = new Map();\n\t\tthis.materialCache = new Map();\n\n\t}\n\n\tupdate( material ) {\n\n\t\tconst vertexShader = material.vertexShader;\n\t\tconst fragmentShader = material.fragmentShader;\n\n\t\tconst vertexShaderStage = this._getShaderStage( vertexShader );\n\t\tconst fragmentShaderStage = this._getShaderStage( fragmentShader );\n\n\t\tconst materialShaders = this._getShaderCacheForMaterial( material );\n\n\t\tif ( materialShaders.has( vertexShaderStage ) === false ) {\n\n\t\t\tmaterialShaders.add( vertexShaderStage );\n\t\t\tvertexShaderStage.usedTimes ++;\n\n\t\t}\n\n\t\tif ( materialShaders.has( fragmentShaderStage ) === false ) {\n\n\t\t\tmaterialShaders.add( fragmentShaderStage );\n\t\t\tfragmentShaderStage.usedTimes ++;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tremove( material ) {\n\n\t\tconst materialShaders = this.materialCache.get( material );\n\n\t\tfor ( const shaderStage of materialShaders ) {\n\n\t\t\tshaderStage.usedTimes --;\n\n\t\t\tif ( shaderStage.usedTimes === 0 ) this.shaderCache.delete( shaderStage.code );\n\n\t\t}\n\n\t\tthis.materialCache.delete( material );\n\n\t\treturn this;\n\n\t}\n\n\tgetVertexShaderID( material ) {\n\n\t\treturn this._getShaderStage( material.vertexShader ).id;\n\n\t}\n\n\tgetFragmentShaderID( material ) {\n\n\t\treturn this._getShaderStage( material.fragmentShader ).id;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.shaderCache.clear();\n\t\tthis.materialCache.clear();\n\n\t}\n\n\t_getShaderCacheForMaterial( material ) {\n\n\t\tconst cache = this.materialCache;\n\t\tlet set = cache.get( material );\n\n\t\tif ( set === undefined ) {\n\n\t\t\tset = new Set();\n\t\t\tcache.set( material, set );\n\n\t\t}\n\n\t\treturn set;\n\n\t}\n\n\t_getShaderStage( code ) {\n\n\t\tconst cache = this.shaderCache;\n\t\tlet stage = cache.get( code );\n\n\t\tif ( stage === undefined ) {\n\n\t\t\tstage = new WebGLShaderStage( code );\n\t\t\tcache.set( code, stage );\n\n\t\t}\n\n\t\treturn stage;\n\n\t}\n\n}\n\nclass WebGLShaderStage {\n\n\tconstructor( code ) {\n\n\t\tthis.id = _id ++;\n\n\t\tthis.code = code;\n\t\tthis.usedTimes = 0;\n\n\t}\n\n}\n\nfunction WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities, bindingStates, clipping ) {\n\n\tconst _programLayers = new Layers();\n\tconst _customShaders = new WebGLShaderCache();\n\tconst _activeChannels = new Set();\n\tconst programs = [];\n\n\tconst logarithmicDepthBuffer = capabilities.logarithmicDepthBuffer;\n\tconst SUPPORTS_VERTEX_TEXTURES = capabilities.vertexTextures;\n\n\tlet precision = capabilities.precision;\n\n\tconst shaderIDs = {\n\t\tMeshDepthMaterial: 'depth',\n\t\tMeshDistanceMaterial: 'distanceRGBA',\n\t\tMeshNormalMaterial: 'normal',\n\t\tMeshBasicMaterial: 'basic',\n\t\tMeshLambertMaterial: 'lambert',\n\t\tMeshPhongMaterial: 'phong',\n\t\tMeshToonMaterial: 'toon',\n\t\tMeshStandardMaterial: 'physical',\n\t\tMeshPhysicalMaterial: 'physical',\n\t\tMeshMatcapMaterial: 'matcap',\n\t\tLineBasicMaterial: 'basic',\n\t\tLineDashedMaterial: 'dashed',\n\t\tPointsMaterial: 'points',\n\t\tShadowMaterial: 'shadow',\n\t\tSpriteMaterial: 'sprite'\n\t};\n\n\tfunction getChannel( value ) {\n\n\t\t_activeChannels.add( value );\n\n\t\tif ( value === 0 ) return 'uv';\n\n\t\treturn `uv${ value }`;\n\n\t}\n\n\tfunction getParameters( material, lights, shadows, scene, object ) {\n\n\t\tconst fog = scene.fog;\n\t\tconst geometry = object.geometry;\n\t\tconst environment = material.isMeshStandardMaterial ? scene.environment : null;\n\n\t\tconst envMap = ( material.isMeshStandardMaterial ? cubeuvmaps : cubemaps ).get( material.envMap || environment );\n\t\tconst envMapCubeUVHeight = ( !! envMap ) && ( envMap.mapping === CubeUVReflectionMapping ) ? envMap.image.height : null;\n\n\t\tconst shaderID = shaderIDs[ material.type ];\n\n\t\t// heuristics to create shader parameters according to lights in the scene\n\t\t// (not to blow over maxLights budget)\n\n\t\tif ( material.precision !== null ) {\n\n\t\t\tprecision = capabilities.getMaxPrecision( material.precision );\n\n\t\t\tif ( precision !== material.precision ) {\n\n\t\t\t\twarn( 'WebGLProgram.getParameters:', material.precision, 'not supported, using', precision, 'instead.' );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tconst morphAttribute = geometry.morphAttributes.position || geometry.morphAttributes.normal || geometry.morphAttributes.color;\n\t\tconst morphTargetsCount = ( morphAttribute !== undefined ) ? morphAttribute.length : 0;\n\n\t\tlet morphTextureStride = 0;\n\n\t\tif ( geometry.morphAttributes.position !== undefined ) morphTextureStride = 1;\n\t\tif ( geometry.morphAttributes.normal !== undefined ) morphTextureStride = 2;\n\t\tif ( geometry.morphAttributes.color !== undefined ) morphTextureStride = 3;\n\n\t\t//\n\n\t\tlet vertexShader, fragmentShader;\n\t\tlet customVertexShaderID, customFragmentShaderID;\n\n\t\tif ( shaderID ) {\n\n\t\t\tconst shader = ShaderLib[ shaderID ];\n\n\t\t\tvertexShader = shader.vertexShader;\n\t\t\tfragmentShader = shader.fragmentShader;\n\n\t\t} else {\n\n\t\t\tvertexShader = material.vertexShader;\n\t\t\tfragmentShader = material.fragmentShader;\n\n\t\t\t_customShaders.update( material );\n\n\t\t\tcustomVertexShaderID = _customShaders.getVertexShaderID( material );\n\t\t\tcustomFragmentShaderID = _customShaders.getFragmentShaderID( material );\n\n\t\t}\n\n\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\t\tconst reversedDepthBuffer = renderer.state.buffers.depth.getReversed();\n\n\t\tconst IS_INSTANCEDMESH = object.isInstancedMesh === true;\n\t\tconst IS_BATCHEDMESH = object.isBatchedMesh === true;\n\n\t\tconst HAS_MAP = !! material.map;\n\t\tconst HAS_MATCAP = !! material.matcap;\n\t\tconst HAS_ENVMAP = !! envMap;\n\t\tconst HAS_AOMAP = !! material.aoMap;\n\t\tconst HAS_LIGHTMAP = !! material.lightMap;\n\t\tconst HAS_BUMPMAP = !! material.bumpMap;\n\t\tconst HAS_NORMALMAP = !! material.normalMap;\n\t\tconst HAS_DISPLACEMENTMAP = !! material.displacementMap;\n\t\tconst HAS_EMISSIVEMAP = !! material.emissiveMap;\n\n\t\tconst HAS_METALNESSMAP = !! material.metalnessMap;\n\t\tconst HAS_ROUGHNESSMAP = !! material.roughnessMap;\n\n\t\tconst HAS_ANISOTROPY = material.anisotropy > 0;\n\t\tconst HAS_CLEARCOAT = material.clearcoat > 0;\n\t\tconst HAS_DISPERSION = material.dispersion > 0;\n\t\tconst HAS_IRIDESCENCE = material.iridescence > 0;\n\t\tconst HAS_SHEEN = material.sheen > 0;\n\t\tconst HAS_TRANSMISSION = material.transmission > 0;\n\n\t\tconst HAS_ANISOTROPYMAP = HAS_ANISOTROPY && !! material.anisotropyMap;\n\n\t\tconst HAS_CLEARCOATMAP = HAS_CLEARCOAT && !! material.clearcoatMap;\n\t\tconst HAS_CLEARCOAT_NORMALMAP = HAS_CLEARCOAT && !! material.clearcoatNormalMap;\n\t\tconst HAS_CLEARCOAT_ROUGHNESSMAP = HAS_CLEARCOAT && !! material.clearcoatRoughnessMap;\n\n\t\tconst HAS_IRIDESCENCEMAP = HAS_IRIDESCENCE && !! material.iridescenceMap;\n\t\tconst HAS_IRIDESCENCE_THICKNESSMAP = HAS_IRIDESCENCE && !! material.iridescenceThicknessMap;\n\n\t\tconst HAS_SHEEN_COLORMAP = HAS_SHEEN && !! material.sheenColorMap;\n\t\tconst HAS_SHEEN_ROUGHNESSMAP = HAS_SHEEN && !! material.sheenRoughnessMap;\n\n\t\tconst HAS_SPECULARMAP = !! material.specularMap;\n\t\tconst HAS_SPECULAR_COLORMAP = !! material.specularColorMap;\n\t\tconst HAS_SPECULAR_INTENSITYMAP = !! material.specularIntensityMap;\n\n\t\tconst HAS_TRANSMISSIONMAP = HAS_TRANSMISSION && !! material.transmissionMap;\n\t\tconst HAS_THICKNESSMAP = HAS_TRANSMISSION && !! material.thicknessMap;\n\n\t\tconst HAS_GRADIENTMAP = !! material.gradientMap;\n\n\t\tconst HAS_ALPHAMAP = !! material.alphaMap;\n\n\t\tconst HAS_ALPHATEST = material.alphaTest > 0;\n\n\t\tconst HAS_ALPHAHASH = !! material.alphaHash;\n\n\t\tconst HAS_EXTENSIONS = !! material.extensions;\n\n\t\tlet toneMapping = NoToneMapping;\n\n\t\tif ( material.toneMapped ) {\n\n\t\t\tif ( currentRenderTarget === null || currentRenderTarget.isXRRenderTarget === true ) {\n\n\t\t\t\ttoneMapping = renderer.toneMapping;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst parameters = {\n\n\t\t\tshaderID: shaderID,\n\t\t\tshaderType: material.type,\n\t\t\tshaderName: material.name,\n\n\t\t\tvertexShader: vertexShader,\n\t\t\tfragmentShader: fragmentShader,\n\t\t\tdefines: material.defines,\n\n\t\t\tcustomVertexShaderID: customVertexShaderID,\n\t\t\tcustomFragmentShaderID: customFragmentShaderID,\n\n\t\t\tisRawShaderMaterial: material.isRawShaderMaterial === true,\n\t\t\tglslVersion: material.glslVersion,\n\n\t\t\tprecision: precision,\n\n\t\t\tbatching: IS_BATCHEDMESH,\n\t\t\tbatchingColor: IS_BATCHEDMESH && object._colorsTexture !== null,\n\t\t\tinstancing: IS_INSTANCEDMESH,\n\t\t\tinstancingColor: IS_INSTANCEDMESH && object.instanceColor !== null,\n\t\t\tinstancingMorph: IS_INSTANCEDMESH && object.morphTexture !== null,\n\n\t\t\tsupportsVertexTextures: SUPPORTS_VERTEX_TEXTURES,\n\t\t\toutputColorSpace: ( currentRenderTarget === null ) ? renderer.outputColorSpace : ( currentRenderTarget.isXRRenderTarget === true ? currentRenderTarget.texture.colorSpace : LinearSRGBColorSpace ),\n\t\t\talphaToCoverage: !! material.alphaToCoverage,\n\n\t\t\tmap: HAS_MAP,\n\t\t\tmatcap: HAS_MATCAP,\n\t\t\tenvMap: HAS_ENVMAP,\n\t\t\tenvMapMode: HAS_ENVMAP && envMap.mapping,\n\t\t\tenvMapCubeUVHeight: envMapCubeUVHeight,\n\t\t\taoMap: HAS_AOMAP,\n\t\t\tlightMap: HAS_LIGHTMAP,\n\t\t\tbumpMap: HAS_BUMPMAP,\n\t\t\tnormalMap: HAS_NORMALMAP,\n\t\t\tdisplacementMap: SUPPORTS_VERTEX_TEXTURES && HAS_DISPLACEMENTMAP,\n\t\t\temissiveMap: HAS_EMISSIVEMAP,\n\n\t\t\tnormalMapObjectSpace: HAS_NORMALMAP && material.normalMapType === ObjectSpaceNormalMap,\n\t\t\tnormalMapTangentSpace: HAS_NORMALMAP && material.normalMapType === TangentSpaceNormalMap,\n\n\t\t\tmetalnessMap: HAS_METALNESSMAP,\n\t\t\troughnessMap: HAS_ROUGHNESSMAP,\n\n\t\t\tanisotropy: HAS_ANISOTROPY,\n\t\t\tanisotropyMap: HAS_ANISOTROPYMAP,\n\n\t\t\tclearcoat: HAS_CLEARCOAT,\n\t\t\tclearcoatMap: HAS_CLEARCOATMAP,\n\t\t\tclearcoatNormalMap: HAS_CLEARCOAT_NORMALMAP,\n\t\t\tclearcoatRoughnessMap: HAS_CLEARCOAT_ROUGHNESSMAP,\n\n\t\t\tdispersion: HAS_DISPERSION,\n\n\t\t\tiridescence: HAS_IRIDESCENCE,\n\t\t\tiridescenceMap: HAS_IRIDESCENCEMAP,\n\t\t\tiridescenceThicknessMap: HAS_IRIDESCENCE_THICKNESSMAP,\n\n\t\t\tsheen: HAS_SHEEN,\n\t\t\tsheenColorMap: HAS_SHEEN_COLORMAP,\n\t\t\tsheenRoughnessMap: HAS_SHEEN_ROUGHNESSMAP,\n\n\t\t\tspecularMap: HAS_SPECULARMAP,\n\t\t\tspecularColorMap: HAS_SPECULAR_COLORMAP,\n\t\t\tspecularIntensityMap: HAS_SPECULAR_INTENSITYMAP,\n\n\t\t\ttransmission: HAS_TRANSMISSION,\n\t\t\ttransmissionMap: HAS_TRANSMISSIONMAP,\n\t\t\tthicknessMap: HAS_THICKNESSMAP,\n\n\t\t\tgradientMap: HAS_GRADIENTMAP,\n\n\t\t\topaque: material.transparent === false && material.blending === NormalBlending && material.alphaToCoverage === false,\n\n\t\t\talphaMap: HAS_ALPHAMAP,\n\t\t\talphaTest: HAS_ALPHATEST,\n\t\t\talphaHash: HAS_ALPHAHASH,\n\n\t\t\tcombine: material.combine,\n\n\t\t\t//\n\n\t\t\tmapUv: HAS_MAP && getChannel( material.map.channel ),\n\t\t\taoMapUv: HAS_AOMAP && getChannel( material.aoMap.channel ),\n\t\t\tlightMapUv: HAS_LIGHTMAP && getChannel( material.lightMap.channel ),\n\t\t\tbumpMapUv: HAS_BUMPMAP && getChannel( material.bumpMap.channel ),\n\t\t\tnormalMapUv: HAS_NORMALMAP && getChannel( material.normalMap.channel ),\n\t\t\tdisplacementMapUv: HAS_DISPLACEMENTMAP && getChannel( material.displacementMap.channel ),\n\t\t\temissiveMapUv: HAS_EMISSIVEMAP && getChannel( material.emissiveMap.channel ),\n\n\t\t\tmetalnessMapUv: HAS_METALNESSMAP && getChannel( material.metalnessMap.channel ),\n\t\t\troughnessMapUv: HAS_ROUGHNESSMAP && getChannel( material.roughnessMap.channel ),\n\n\t\t\tanisotropyMapUv: HAS_ANISOTROPYMAP && getChannel( material.anisotropyMap.channel ),\n\n\t\t\tclearcoatMapUv: HAS_CLEARCOATMAP && getChannel( material.clearcoatMap.channel ),\n\t\t\tclearcoatNormalMapUv: HAS_CLEARCOAT_NORMALMAP && getChannel( material.clearcoatNormalMap.channel ),\n\t\t\tclearcoatRoughnessMapUv: HAS_CLEARCOAT_ROUGHNESSMAP && getChannel( material.clearcoatRoughnessMap.channel ),\n\n\t\t\tiridescenceMapUv: HAS_IRIDESCENCEMAP && getChannel( material.iridescenceMap.channel ),\n\t\t\tiridescenceThicknessMapUv: HAS_IRIDESCENCE_THICKNESSMAP && getChannel( material.iridescenceThicknessMap.channel ),\n\n\t\t\tsheenColorMapUv: HAS_SHEEN_COLORMAP && getChannel( material.sheenColorMap.channel ),\n\t\t\tsheenRoughnessMapUv: HAS_SHEEN_ROUGHNESSMAP && getChannel( material.sheenRoughnessMap.channel ),\n\n\t\t\tspecularMapUv: HAS_SPECULARMAP && getChannel( material.specularMap.channel ),\n\t\t\tspecularColorMapUv: HAS_SPECULAR_COLORMAP && getChannel( material.specularColorMap.channel ),\n\t\t\tspecularIntensityMapUv: HAS_SPECULAR_INTENSITYMAP && getChannel( material.specularIntensityMap.channel ),\n\n\t\t\ttransmissionMapUv: HAS_TRANSMISSIONMAP && getChannel( material.transmissionMap.channel ),\n\t\t\tthicknessMapUv: HAS_THICKNESSMAP && getChannel( material.thicknessMap.channel ),\n\n\t\t\talphaMapUv: HAS_ALPHAMAP && getChannel( material.alphaMap.channel ),\n\n\t\t\t//\n\n\t\t\tvertexTangents: !! geometry.attributes.tangent && ( HAS_NORMALMAP || HAS_ANISOTROPY ),\n\t\t\tvertexColors: material.vertexColors,\n\t\t\tvertexAlphas: material.vertexColors === true && !! geometry.attributes.color && geometry.attributes.color.itemSize === 4,\n\n\t\t\tpointsUvs: object.isPoints === true && !! geometry.attributes.uv && ( HAS_MAP || HAS_ALPHAMAP ),\n\n\t\t\tfog: !! fog,\n\t\t\tuseFog: material.fog === true,\n\t\t\tfogExp2: ( !! fog && fog.isFogExp2 ),\n\n\t\t\tflatShading: ( material.flatShading === true && material.wireframe === false ),\n\n\t\t\tsizeAttenuation: material.sizeAttenuation === true,\n\t\t\tlogarithmicDepthBuffer: logarithmicDepthBuffer,\n\t\t\treversedDepthBuffer: reversedDepthBuffer,\n\n\t\t\tskinning: object.isSkinnedMesh === true,\n\n\t\t\tmorphTargets: geometry.morphAttributes.position !== undefined,\n\t\t\tmorphNormals: geometry.morphAttributes.normal !== undefined,\n\t\t\tmorphColors: geometry.morphAttributes.color !== undefined,\n\t\t\tmorphTargetsCount: morphTargetsCount,\n\t\t\tmorphTextureStride: morphTextureStride,\n\n\t\t\tnumDirLights: lights.directional.length,\n\t\t\tnumPointLights: lights.point.length,\n\t\t\tnumSpotLights: lights.spot.length,\n\t\t\tnumSpotLightMaps: lights.spotLightMap.length,\n\t\t\tnumRectAreaLights: lights.rectArea.length,\n\t\t\tnumHemiLights: lights.hemi.length,\n\n\t\t\tnumDirLightShadows: lights.directionalShadowMap.length,\n\t\t\tnumPointLightShadows: lights.pointShadowMap.length,\n\t\t\tnumSpotLightShadows: lights.spotShadowMap.length,\n\t\t\tnumSpotLightShadowsWithMaps: lights.numSpotLightShadowsWithMaps,\n\n\t\t\tnumLightProbes: lights.numLightProbes,\n\n\t\t\tnumClippingPlanes: clipping.numPlanes,\n\t\t\tnumClipIntersection: clipping.numIntersection,\n\n\t\t\tdithering: material.dithering,\n\n\t\t\tshadowMapEnabled: renderer.shadowMap.enabled && shadows.length > 0,\n\t\t\tshadowMapType: renderer.shadowMap.type,\n\n\t\t\ttoneMapping: toneMapping,\n\n\t\t\tdecodeVideoTexture: HAS_MAP && ( material.map.isVideoTexture === true ) && ( ColorManagement.getTransfer( material.map.colorSpace ) === SRGBTransfer ),\n\t\t\tdecodeVideoTextureEmissive: HAS_EMISSIVEMAP && ( material.emissiveMap.isVideoTexture === true ) && ( ColorManagement.getTransfer( material.emissiveMap.colorSpace ) === SRGBTransfer ),\n\n\t\t\tpremultipliedAlpha: material.premultipliedAlpha,\n\n\t\t\tdoubleSided: material.side === DoubleSide,\n\t\t\tflipSided: material.side === BackSide,\n\n\t\t\tuseDepthPacking: material.depthPacking >= 0,\n\t\t\tdepthPacking: material.depthPacking || 0,\n\n\t\t\tindex0AttributeName: material.index0AttributeName,\n\n\t\t\textensionClipCullDistance: HAS_EXTENSIONS && material.extensions.clipCullDistance === true && extensions.has( 'WEBGL_clip_cull_distance' ),\n\t\t\textensionMultiDraw: ( HAS_EXTENSIONS && material.extensions.multiDraw === true || IS_BATCHEDMESH ) && extensions.has( 'WEBGL_multi_draw' ),\n\n\t\t\trendererExtensionParallelShaderCompile: extensions.has( 'KHR_parallel_shader_compile' ),\n\n\t\t\tcustomProgramCacheKey: material.customProgramCacheKey()\n\n\t\t};\n\n\t\t// the usage of getChannel() determines the active texture channels for this shader\n\n\t\tparameters.vertexUv1s = _activeChannels.has( 1 );\n\t\tparameters.vertexUv2s = _activeChannels.has( 2 );\n\t\tparameters.vertexUv3s = _activeChannels.has( 3 );\n\n\t\t_activeChannels.clear();\n\n\t\treturn parameters;\n\n\t}\n\n\tfunction getProgramCacheKey( parameters ) {\n\n\t\tconst array = [];\n\n\t\tif ( parameters.shaderID ) {\n\n\t\t\tarray.push( parameters.shaderID );\n\n\t\t} else {\n\n\t\t\tarray.push( parameters.customVertexShaderID );\n\t\t\tarray.push( parameters.customFragmentShaderID );\n\n\t\t}\n\n\t\tif ( parameters.defines !== undefined ) {\n\n\t\t\tfor ( const name in parameters.defines ) {\n\n\t\t\t\tarray.push( name );\n\t\t\t\tarray.push( parameters.defines[ name ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( parameters.isRawShaderMaterial === false ) {\n\n\t\t\tgetProgramCacheKeyParameters( array, parameters );\n\t\t\tgetProgramCacheKeyBooleans( array, parameters );\n\t\t\tarray.push( renderer.outputColorSpace );\n\n\t\t}\n\n\t\tarray.push( parameters.customProgramCacheKey );\n\n\t\treturn array.join();\n\n\t}\n\n\tfunction getProgramCacheKeyParameters( array, parameters ) {\n\n\t\tarray.push( parameters.precision );\n\t\tarray.push( parameters.outputColorSpace );\n\t\tarray.push( parameters.envMapMode );\n\t\tarray.push( parameters.envMapCubeUVHeight );\n\t\tarray.push( parameters.mapUv );\n\t\tarray.push( parameters.alphaMapUv );\n\t\tarray.push( parameters.lightMapUv );\n\t\tarray.push( parameters.aoMapUv );\n\t\tarray.push( parameters.bumpMapUv );\n\t\tarray.push( parameters.normalMapUv );\n\t\tarray.push( parameters.displacementMapUv );\n\t\tarray.push( parameters.emissiveMapUv );\n\t\tarray.push( parameters.metalnessMapUv );\n\t\tarray.push( parameters.roughnessMapUv );\n\t\tarray.push( parameters.anisotropyMapUv );\n\t\tarray.push( parameters.clearcoatMapUv );\n\t\tarray.push( parameters.clearcoatNormalMapUv );\n\t\tarray.push( parameters.clearcoatRoughnessMapUv );\n\t\tarray.push( parameters.iridescenceMapUv );\n\t\tarray.push( parameters.iridescenceThicknessMapUv );\n\t\tarray.push( parameters.sheenColorMapUv );\n\t\tarray.push( parameters.sheenRoughnessMapUv );\n\t\tarray.push( parameters.specularMapUv );\n\t\tarray.push( parameters.specularColorMapUv );\n\t\tarray.push( parameters.specularIntensityMapUv );\n\t\tarray.push( parameters.transmissionMapUv );\n\t\tarray.push( parameters.thicknessMapUv );\n\t\tarray.push( parameters.combine );\n\t\tarray.push( parameters.fogExp2 );\n\t\tarray.push( parameters.sizeAttenuation );\n\t\tarray.push( parameters.morphTargetsCount );\n\t\tarray.push( parameters.morphAttributeCount );\n\t\tarray.push( parameters.numDirLights );\n\t\tarray.push( parameters.numPointLights );\n\t\tarray.push( parameters.numSpotLights );\n\t\tarray.push( parameters.numSpotLightMaps );\n\t\tarray.push( parameters.numHemiLights );\n\t\tarray.push( parameters.numRectAreaLights );\n\t\tarray.push( parameters.numDirLightShadows );\n\t\tarray.push( parameters.numPointLightShadows );\n\t\tarray.push( parameters.numSpotLightShadows );\n\t\tarray.push( parameters.numSpotLightShadowsWithMaps );\n\t\tarray.push( parameters.numLightProbes );\n\t\tarray.push( parameters.shadowMapType );\n\t\tarray.push( parameters.toneMapping );\n\t\tarray.push( parameters.numClippingPlanes );\n\t\tarray.push( parameters.numClipIntersection );\n\t\tarray.push( parameters.depthPacking );\n\n\t}\n\n\tfunction getProgramCacheKeyBooleans( array, parameters ) {\n\n\t\t_programLayers.disableAll();\n\n\t\tif ( parameters.supportsVertexTextures )\n\t\t\t_programLayers.enable( 0 );\n\t\tif ( parameters.instancing )\n\t\t\t_programLayers.enable( 1 );\n\t\tif ( parameters.instancingColor )\n\t\t\t_programLayers.enable( 2 );\n\t\tif ( parameters.instancingMorph )\n\t\t\t_programLayers.enable( 3 );\n\t\tif ( parameters.matcap )\n\t\t\t_programLayers.enable( 4 );\n\t\tif ( parameters.envMap )\n\t\t\t_programLayers.enable( 5 );\n\t\tif ( parameters.normalMapObjectSpace )\n\t\t\t_programLayers.enable( 6 );\n\t\tif ( parameters.normalMapTangentSpace )\n\t\t\t_programLayers.enable( 7 );\n\t\tif ( parameters.clearcoat )\n\t\t\t_programLayers.enable( 8 );\n\t\tif ( parameters.iridescence )\n\t\t\t_programLayers.enable( 9 );\n\t\tif ( parameters.alphaTest )\n\t\t\t_programLayers.enable( 10 );\n\t\tif ( parameters.vertexColors )\n\t\t\t_programLayers.enable( 11 );\n\t\tif ( parameters.vertexAlphas )\n\t\t\t_programLayers.enable( 12 );\n\t\tif ( parameters.vertexUv1s )\n\t\t\t_programLayers.enable( 13 );\n\t\tif ( parameters.vertexUv2s )\n\t\t\t_programLayers.enable( 14 );\n\t\tif ( parameters.vertexUv3s )\n\t\t\t_programLayers.enable( 15 );\n\t\tif ( parameters.vertexTangents )\n\t\t\t_programLayers.enable( 16 );\n\t\tif ( parameters.anisotropy )\n\t\t\t_programLayers.enable( 17 );\n\t\tif ( parameters.alphaHash )\n\t\t\t_programLayers.enable( 18 );\n\t\tif ( parameters.batching )\n\t\t\t_programLayers.enable( 19 );\n\t\tif ( parameters.dispersion )\n\t\t\t_programLayers.enable( 20 );\n\t\tif ( parameters.batchingColor )\n\t\t\t_programLayers.enable( 21 );\n\t\tif ( parameters.gradientMap )\n\t\t\t_programLayers.enable( 22 );\n\n\t\tarray.push( _programLayers.mask );\n\t\t_programLayers.disableAll();\n\n\t\tif ( parameters.fog )\n\t\t\t_programLayers.enable( 0 );\n\t\tif ( parameters.useFog )\n\t\t\t_programLayers.enable( 1 );\n\t\tif ( parameters.flatShading )\n\t\t\t_programLayers.enable( 2 );\n\t\tif ( parameters.logarithmicDepthBuffer )\n\t\t\t_programLayers.enable( 3 );\n\t\tif ( parameters.reversedDepthBuffer )\n\t\t\t_programLayers.enable( 4 );\n\t\tif ( parameters.skinning )\n\t\t\t_programLayers.enable( 5 );\n\t\tif ( parameters.morphTargets )\n\t\t\t_programLayers.enable( 6 );\n\t\tif ( parameters.morphNormals )\n\t\t\t_programLayers.enable( 7 );\n\t\tif ( parameters.morphColors )\n\t\t\t_programLayers.enable( 8 );\n\t\tif ( parameters.premultipliedAlpha )\n\t\t\t_programLayers.enable( 9 );\n\t\tif ( parameters.shadowMapEnabled )\n\t\t\t_programLayers.enable( 10 );\n\t\tif ( parameters.doubleSided )\n\t\t\t_programLayers.enable( 11 );\n\t\tif ( parameters.flipSided )\n\t\t\t_programLayers.enable( 12 );\n\t\tif ( parameters.useDepthPacking )\n\t\t\t_programLayers.enable( 13 );\n\t\tif ( parameters.dithering )\n\t\t\t_programLayers.enable( 14 );\n\t\tif ( parameters.transmission )\n\t\t\t_programLayers.enable( 15 );\n\t\tif ( parameters.sheen )\n\t\t\t_programLayers.enable( 16 );\n\t\tif ( parameters.opaque )\n\t\t\t_programLayers.enable( 17 );\n\t\tif ( parameters.pointsUvs )\n\t\t\t_programLayers.enable( 18 );\n\t\tif ( parameters.decodeVideoTexture )\n\t\t\t_programLayers.enable( 19 );\n\t\tif ( parameters.decodeVideoTextureEmissive )\n\t\t\t_programLayers.enable( 20 );\n\t\tif ( parameters.alphaToCoverage )\n\t\t\t_programLayers.enable( 21 );\n\n\t\tarray.push( _programLayers.mask );\n\n\t}\n\n\tfunction getUniforms( material ) {\n\n\t\tconst shaderID = shaderIDs[ material.type ];\n\t\tlet uniforms;\n\n\t\tif ( shaderID ) {\n\n\t\t\tconst shader = ShaderLib[ shaderID ];\n\t\t\tuniforms = UniformsUtils.clone( shader.uniforms );\n\n\t\t} else {\n\n\t\t\tuniforms = material.uniforms;\n\n\t\t}\n\n\t\treturn uniforms;\n\n\t}\n\n\tfunction acquireProgram( parameters, cacheKey ) {\n\n\t\tlet program;\n\n\t\t// Check if code has been already compiled\n\t\tfor ( let p = 0, pl = programs.length; p < pl; p ++ ) {\n\n\t\t\tconst preexistingProgram = programs[ p ];\n\n\t\t\tif ( preexistingProgram.cacheKey === cacheKey ) {\n\n\t\t\t\tprogram = preexistingProgram;\n\t\t\t\t++ program.usedTimes;\n\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( program === undefined ) {\n\n\t\t\tprogram = new WebGLProgram( renderer, cacheKey, parameters, bindingStates );\n\t\t\tprograms.push( program );\n\n\t\t}\n\n\t\treturn program;\n\n\t}\n\n\tfunction releaseProgram( program ) {\n\n\t\tif ( -- program.usedTimes === 0 ) {\n\n\t\t\t// Remove from unordered set\n\t\t\tconst i = programs.indexOf( program );\n\t\t\tprograms[ i ] = programs[ programs.length - 1 ];\n\t\t\tprograms.pop();\n\n\t\t\t// Free WebGL resources\n\t\t\tprogram.destroy();\n\n\t\t}\n\n\t}\n\n\tfunction releaseShaderCache( material ) {\n\n\t\t_customShaders.remove( material );\n\n\t}\n\n\tfunction dispose() {\n\n\t\t_customShaders.dispose();\n\n\t}\n\n\treturn {\n\t\tgetParameters: getParameters,\n\t\tgetProgramCacheKey: getProgramCacheKey,\n\t\tgetUniforms: getUniforms,\n\t\tacquireProgram: acquireProgram,\n\t\treleaseProgram: releaseProgram,\n\t\treleaseShaderCache: releaseShaderCache,\n\t\t// Exposed for resource monitoring & error feedback via renderer.info:\n\t\tprograms: programs,\n\t\tdispose: dispose\n\t};\n\n}\n\nfunction WebGLProperties() {\n\n\tlet properties = new WeakMap();\n\n\tfunction has( object ) {\n\n\t\treturn properties.has( object );\n\n\t}\n\n\tfunction get( object ) {\n\n\t\tlet map = properties.get( object );\n\n\t\tif ( map === undefined ) {\n\n\t\t\tmap = {};\n\t\t\tproperties.set( object, map );\n\n\t\t}\n\n\t\treturn map;\n\n\t}\n\n\tfunction remove( object ) {\n\n\t\tproperties.delete( object );\n\n\t}\n\n\tfunction update( object, key, value ) {\n\n\t\tproperties.get( object )[ key ] = value;\n\n\t}\n\n\tfunction dispose() {\n\n\t\tproperties = new WeakMap();\n\n\t}\n\n\treturn {\n\t\thas: has,\n\t\tget: get,\n\t\tremove: remove,\n\t\tupdate: update,\n\t\tdispose: dispose\n\t};\n\n}\n\nfunction painterSortStable( a, b ) {\n\n\tif ( a.groupOrder !== b.groupOrder ) {\n\n\t\treturn a.groupOrder - b.groupOrder;\n\n\t} else if ( a.renderOrder !== b.renderOrder ) {\n\n\t\treturn a.renderOrder - b.renderOrder;\n\n\t} else if ( a.material.id !== b.material.id ) {\n\n\t\treturn a.material.id - b.material.id;\n\n\t} else if ( a.z !== b.z ) {\n\n\t\treturn a.z - b.z;\n\n\t} else {\n\n\t\treturn a.id - b.id;\n\n\t}\n\n}\n\nfunction reversePainterSortStable( a, b ) {\n\n\tif ( a.groupOrder !== b.groupOrder ) {\n\n\t\treturn a.groupOrder - b.groupOrder;\n\n\t} else if ( a.renderOrder !== b.renderOrder ) {\n\n\t\treturn a.renderOrder - b.renderOrder;\n\n\t} else if ( a.z !== b.z ) {\n\n\t\treturn b.z - a.z;\n\n\t} else {\n\n\t\treturn a.id - b.id;\n\n\t}\n\n}\n\n\nfunction WebGLRenderList() {\n\n\tconst renderItems = [];\n\tlet renderItemsIndex = 0;\n\n\tconst opaque = [];\n\tconst transmissive = [];\n\tconst transparent = [];\n\n\tfunction init() {\n\n\t\trenderItemsIndex = 0;\n\n\t\topaque.length = 0;\n\t\ttransmissive.length = 0;\n\t\ttransparent.length = 0;\n\n\t}\n\n\tfunction getNextRenderItem( object, geometry, material, groupOrder, z, group ) {\n\n\t\tlet renderItem = renderItems[ renderItemsIndex ];\n\n\t\tif ( renderItem === undefined ) {\n\n\t\t\trenderItem = {\n\t\t\t\tid: object.id,\n\t\t\t\tobject: object,\n\t\t\t\tgeometry: geometry,\n\t\t\t\tmaterial: material,\n\t\t\t\tgroupOrder: groupOrder,\n\t\t\t\trenderOrder: object.renderOrder,\n\t\t\t\tz: z,\n\t\t\t\tgroup: group\n\t\t\t};\n\n\t\t\trenderItems[ renderItemsIndex ] = renderItem;\n\n\t\t} else {\n\n\t\t\trenderItem.id = object.id;\n\t\t\trenderItem.object = object;\n\t\t\trenderItem.geometry = geometry;\n\t\t\trenderItem.material = material;\n\t\t\trenderItem.groupOrder = groupOrder;\n\t\t\trenderItem.renderOrder = object.renderOrder;\n\t\t\trenderItem.z = z;\n\t\t\trenderItem.group = group;\n\n\t\t}\n\n\t\trenderItemsIndex ++;\n\n\t\treturn renderItem;\n\n\t}\n\n\tfunction push( object, geometry, material, groupOrder, z, group ) {\n\n\t\tconst renderItem = getNextRenderItem( object, geometry, material, groupOrder, z, group );\n\n\t\tif ( material.transmission > 0.0 ) {\n\n\t\t\ttransmissive.push( renderItem );\n\n\t\t} else if ( material.transparent === true ) {\n\n\t\t\ttransparent.push( renderItem );\n\n\t\t} else {\n\n\t\t\topaque.push( renderItem );\n\n\t\t}\n\n\t}\n\n\tfunction unshift( object, geometry, material, groupOrder, z, group ) {\n\n\t\tconst renderItem = getNextRenderItem( object, geometry, material, groupOrder, z, group );\n\n\t\tif ( material.transmission > 0.0 ) {\n\n\t\t\ttransmissive.unshift( renderItem );\n\n\t\t} else if ( material.transparent === true ) {\n\n\t\t\ttransparent.unshift( renderItem );\n\n\t\t} else {\n\n\t\t\topaque.unshift( renderItem );\n\n\t\t}\n\n\t}\n\n\tfunction sort( customOpaqueSort, customTransparentSort ) {\n\n\t\tif ( opaque.length > 1 ) opaque.sort( customOpaqueSort || painterSortStable );\n\t\tif ( transmissive.length > 1 ) transmissive.sort( customTransparentSort || reversePainterSortStable );\n\t\tif ( transparent.length > 1 ) transparent.sort( customTransparentSort || reversePainterSortStable );\n\n\t}\n\n\tfunction finish() {\n\n\t\t// Clear references from inactive renderItems in the list\n\n\t\tfor ( let i = renderItemsIndex, il = renderItems.length; i < il; i ++ ) {\n\n\t\t\tconst renderItem = renderItems[ i ];\n\n\t\t\tif ( renderItem.id === null ) break;\n\n\t\t\trenderItem.id = null;\n\t\t\trenderItem.object = null;\n\t\t\trenderItem.geometry = null;\n\t\t\trenderItem.material = null;\n\t\t\trenderItem.group = null;\n\n\t\t}\n\n\t}\n\n\treturn {\n\n\t\topaque: opaque,\n\t\ttransmissive: transmissive,\n\t\ttransparent: transparent,\n\n\t\tinit: init,\n\t\tpush: push,\n\t\tunshift: unshift,\n\t\tfinish: finish,\n\n\t\tsort: sort\n\t};\n\n}\n\nfunction WebGLRenderLists() {\n\n\tlet lists = new WeakMap();\n\n\tfunction get( scene, renderCallDepth ) {\n\n\t\tconst listArray = lists.get( scene );\n\t\tlet list;\n\n\t\tif ( listArray === undefined ) {\n\n\t\t\tlist = new WebGLRenderList();\n\t\t\tlists.set( scene, [ list ] );\n\n\t\t} else {\n\n\t\t\tif ( renderCallDepth >= listArray.length ) {\n\n\t\t\t\tlist = new WebGLRenderList();\n\t\t\t\tlistArray.push( list );\n\n\t\t\t} else {\n\n\t\t\t\tlist = listArray[ renderCallDepth ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn list;\n\n\t}\n\n\tfunction dispose() {\n\n\t\tlists = new WeakMap();\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\nfunction UniformsCache() {\n\n\tconst lights = {};\n\n\treturn {\n\n\t\tget: function ( light ) {\n\n\t\t\tif ( lights[ light.id ] !== undefined ) {\n\n\t\t\t\treturn lights[ light.id ];\n\n\t\t\t}\n\n\t\t\tlet uniforms;\n\n\t\t\tswitch ( light.type ) {\n\n\t\t\t\tcase 'DirectionalLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\tcolor: new Color()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'SpotLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\tdistance: 0,\n\t\t\t\t\t\tconeCos: 0,\n\t\t\t\t\t\tpenumbraCos: 0,\n\t\t\t\t\t\tdecay: 0\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'PointLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\tdistance: 0,\n\t\t\t\t\t\tdecay: 0\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'HemisphereLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\tskyColor: new Color(),\n\t\t\t\t\t\tgroundColor: new Color()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'RectAreaLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\thalfWidth: new Vector3(),\n\t\t\t\t\t\thalfHeight: new Vector3()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tlights[ light.id ] = uniforms;\n\n\t\t\treturn uniforms;\n\n\t\t}\n\n\t};\n\n}\n\nfunction ShadowUniformsCache() {\n\n\tconst lights = {};\n\n\treturn {\n\n\t\tget: function ( light ) {\n\n\t\t\tif ( lights[ light.id ] !== undefined ) {\n\n\t\t\t\treturn lights[ light.id ];\n\n\t\t\t}\n\n\t\t\tlet uniforms;\n\n\t\t\tswitch ( light.type ) {\n\n\t\t\t\tcase 'DirectionalLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tshadowIntensity: 1,\n\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\tshadowNormalBias: 0,\n\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'SpotLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tshadowIntensity: 1,\n\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\tshadowNormalBias: 0,\n\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'PointLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tshadowIntensity: 1,\n\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\tshadowNormalBias: 0,\n\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\tshadowMapSize: new Vector2(),\n\t\t\t\t\t\tshadowCameraNear: 1,\n\t\t\t\t\t\tshadowCameraFar: 1000\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\t// TODO (abelnation): set RectAreaLight shadow uniforms\n\n\t\t\t}\n\n\t\t\tlights[ light.id ] = uniforms;\n\n\t\t\treturn uniforms;\n\n\t\t}\n\n\t};\n\n}\n\n\n\nlet nextVersion = 0;\n\nfunction shadowCastingAndTexturingLightsFirst( lightA, lightB ) {\n\n\treturn ( lightB.castShadow ? 2 : 0 ) - ( lightA.castShadow ? 2 : 0 ) + ( lightB.map ? 1 : 0 ) - ( lightA.map ? 1 : 0 );\n\n}\n\nfunction WebGLLights( extensions ) {\n\n\tconst cache = new UniformsCache();\n\n\tconst shadowCache = ShadowUniformsCache();\n\n\tconst state = {\n\n\t\tversion: 0,\n\n\t\thash: {\n\t\t\tdirectionalLength: -1,\n\t\t\tpointLength: -1,\n\t\t\tspotLength: -1,\n\t\t\trectAreaLength: -1,\n\t\t\themiLength: -1,\n\n\t\t\tnumDirectionalShadows: -1,\n\t\t\tnumPointShadows: -1,\n\t\t\tnumSpotShadows: -1,\n\t\t\tnumSpotMaps: -1,\n\n\t\t\tnumLightProbes: -1\n\t\t},\n\n\t\tambient: [ 0, 0, 0 ],\n\t\tprobe: [],\n\t\tdirectional: [],\n\t\tdirectionalShadow: [],\n\t\tdirectionalShadowMap: [],\n\t\tdirectionalShadowMatrix: [],\n\t\tspot: [],\n\t\tspotLightMap: [],\n\t\tspotShadow: [],\n\t\tspotShadowMap: [],\n\t\tspotLightMatrix: [],\n\t\trectArea: [],\n\t\trectAreaLTC1: null,\n\t\trectAreaLTC2: null,\n\t\tpoint: [],\n\t\tpointShadow: [],\n\t\tpointShadowMap: [],\n\t\tpointShadowMatrix: [],\n\t\themi: [],\n\t\tnumSpotLightShadowsWithMaps: 0,\n\t\tnumLightProbes: 0\n\n\t};\n\n\tfor ( let i = 0; i < 9; i ++ ) state.probe.push( new Vector3() );\n\n\tconst vector3 = new Vector3();\n\tconst matrix4 = new Matrix4();\n\tconst matrix42 = new Matrix4();\n\n\tfunction setup( lights ) {\n\n\t\tlet r = 0, g = 0, b = 0;\n\n\t\tfor ( let i = 0; i < 9; i ++ ) state.probe[ i ].set( 0, 0, 0 );\n\n\t\tlet directionalLength = 0;\n\t\tlet pointLength = 0;\n\t\tlet spotLength = 0;\n\t\tlet rectAreaLength = 0;\n\t\tlet hemiLength = 0;\n\n\t\tlet numDirectionalShadows = 0;\n\t\tlet numPointShadows = 0;\n\t\tlet numSpotShadows = 0;\n\t\tlet numSpotMaps = 0;\n\t\tlet numSpotShadowsWithMaps = 0;\n\n\t\tlet numLightProbes = 0;\n\n\t\t// ordering : [shadow casting + map texturing, map texturing, shadow casting, none ]\n\t\tlights.sort( shadowCastingAndTexturingLightsFirst );\n\n\t\tfor ( let i = 0, l = lights.length; i < l; i ++ ) {\n\n\t\t\tconst light = lights[ i ];\n\n\t\t\tconst color = light.color;\n\t\t\tconst intensity = light.intensity;\n\t\t\tconst distance = light.distance;\n\n\t\t\tconst shadowMap = ( light.shadow && light.shadow.map ) ? light.shadow.map.texture : null;\n\n\t\t\tif ( light.isAmbientLight ) {\n\n\t\t\t\tr += color.r * intensity;\n\t\t\t\tg += color.g * intensity;\n\t\t\t\tb += color.b * intensity;\n\n\t\t\t} else if ( light.isLightProbe ) {\n\n\t\t\t\tfor ( let j = 0; j < 9; j ++ ) {\n\n\t\t\t\t\tstate.probe[ j ].addScaledVector( light.sh.coefficients[ j ], intensity );\n\n\t\t\t\t}\n\n\t\t\t\tnumLightProbes ++;\n\n\t\t\t} else if ( light.isDirectionalLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.color.copy( light.color ).multiplyScalar( light.intensity );\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\tconst shadow = light.shadow;\n\n\t\t\t\t\tconst shadowUniforms = shadowCache.get( light );\n\n\t\t\t\t\tshadowUniforms.shadowIntensity = shadow.intensity;\n\t\t\t\t\tshadowUniforms.shadowBias = shadow.bias;\n\t\t\t\t\tshadowUniforms.shadowNormalBias = shadow.normalBias;\n\t\t\t\t\tshadowUniforms.shadowRadius = shadow.radius;\n\t\t\t\t\tshadowUniforms.shadowMapSize = shadow.mapSize;\n\n\t\t\t\t\tstate.directionalShadow[ directionalLength ] = shadowUniforms;\n\t\t\t\t\tstate.directionalShadowMap[ directionalLength ] = shadowMap;\n\t\t\t\t\tstate.directionalShadowMatrix[ directionalLength ] = light.shadow.matrix;\n\n\t\t\t\t\tnumDirectionalShadows ++;\n\n\t\t\t\t}\n\n\t\t\t\tstate.directional[ directionalLength ] = uniforms;\n\n\t\t\t\tdirectionalLength ++;\n\n\t\t\t} else if ( light.isSpotLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\n\t\t\t\tuniforms.color.copy( color ).multiplyScalar( intensity );\n\t\t\t\tuniforms.distance = distance;\n\n\t\t\t\tuniforms.coneCos = Math.cos( light.angle );\n\t\t\t\tuniforms.penumbraCos = Math.cos( light.angle * ( 1 - light.penumbra ) );\n\t\t\t\tuniforms.decay = light.decay;\n\n\t\t\t\tstate.spot[ spotLength ] = uniforms;\n\n\t\t\t\tconst shadow = light.shadow;\n\n\t\t\t\tif ( light.map ) {\n\n\t\t\t\t\tstate.spotLightMap[ numSpotMaps ] = light.map;\n\t\t\t\t\tnumSpotMaps ++;\n\n\t\t\t\t\t// make sure the lightMatrix is up to date\n\t\t\t\t\t// TODO : do it if required only\n\t\t\t\t\tshadow.updateMatrices( light );\n\n\t\t\t\t\tif ( light.castShadow ) numSpotShadowsWithMaps ++;\n\n\t\t\t\t}\n\n\t\t\t\tstate.spotLightMatrix[ spotLength ] = shadow.matrix;\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\tconst shadowUniforms = shadowCache.get( light );\n\n\t\t\t\t\tshadowUniforms.shadowIntensity = shadow.intensity;\n\t\t\t\t\tshadowUniforms.shadowBias = shadow.bias;\n\t\t\t\t\tshadowUniforms.shadowNormalBias = shadow.normalBias;\n\t\t\t\t\tshadowUniforms.shadowRadius = shadow.radius;\n\t\t\t\t\tshadowUniforms.shadowMapSize = shadow.mapSize;\n\n\t\t\t\t\tstate.spotShadow[ spotLength ] = shadowUniforms;\n\t\t\t\t\tstate.spotShadowMap[ spotLength ] = shadowMap;\n\n\t\t\t\t\tnumSpotShadows ++;\n\n\t\t\t\t}\n\n\t\t\t\tspotLength ++;\n\n\t\t\t} else if ( light.isRectAreaLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.color.copy( color ).multiplyScalar( intensity );\n\n\t\t\t\tuniforms.halfWidth.set( light.width * 0.5, 0.0, 0.0 );\n\t\t\t\tuniforms.halfHeight.set( 0.0, light.height * 0.5, 0.0 );\n\n\t\t\t\tstate.rectArea[ rectAreaLength ] = uniforms;\n\n\t\t\t\trectAreaLength ++;\n\n\t\t\t} else if ( light.isPointLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.color.copy( light.color ).multiplyScalar( light.intensity );\n\t\t\t\tuniforms.distance = light.distance;\n\t\t\t\tuniforms.decay = light.decay;\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\tconst shadow = light.shadow;\n\n\t\t\t\t\tconst shadowUniforms = shadowCache.get( light );\n\n\t\t\t\t\tshadowUniforms.shadowIntensity = shadow.intensity;\n\t\t\t\t\tshadowUniforms.shadowBias = shadow.bias;\n\t\t\t\t\tshadowUniforms.shadowNormalBias = shadow.normalBias;\n\t\t\t\t\tshadowUniforms.shadowRadius = shadow.radius;\n\t\t\t\t\tshadowUniforms.shadowMapSize = shadow.mapSize;\n\t\t\t\t\tshadowUniforms.shadowCameraNear = shadow.camera.near;\n\t\t\t\t\tshadowUniforms.shadowCameraFar = shadow.camera.far;\n\n\t\t\t\t\tstate.pointShadow[ pointLength ] = shadowUniforms;\n\t\t\t\t\tstate.pointShadowMap[ pointLength ] = shadowMap;\n\t\t\t\t\tstate.pointShadowMatrix[ pointLength ] = light.shadow.matrix;\n\n\t\t\t\t\tnumPointShadows ++;\n\n\t\t\t\t}\n\n\t\t\t\tstate.point[ pointLength ] = uniforms;\n\n\t\t\t\tpointLength ++;\n\n\t\t\t} else if ( light.isHemisphereLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.skyColor.copy( light.color ).multiplyScalar( intensity );\n\t\t\t\tuniforms.groundColor.copy( light.groundColor ).multiplyScalar( intensity );\n\n\t\t\t\tstate.hemi[ hemiLength ] = uniforms;\n\n\t\t\t\themiLength ++;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( rectAreaLength > 0 ) {\n\n\t\t\tif ( extensions.has( 'OES_texture_float_linear' ) === true ) {\n\n\t\t\t\tstate.rectAreaLTC1 = UniformsLib.LTC_FLOAT_1;\n\t\t\t\tstate.rectAreaLTC2 = UniformsLib.LTC_FLOAT_2;\n\n\t\t\t} else {\n\n\t\t\t\tstate.rectAreaLTC1 = UniformsLib.LTC_HALF_1;\n\t\t\t\tstate.rectAreaLTC2 = UniformsLib.LTC_HALF_2;\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.ambient[ 0 ] = r;\n\t\tstate.ambient[ 1 ] = g;\n\t\tstate.ambient[ 2 ] = b;\n\n\t\tconst hash = state.hash;\n\n\t\tif ( hash.directionalLength !== directionalLength ||\n\t\t\thash.pointLength !== pointLength ||\n\t\t\thash.spotLength !== spotLength ||\n\t\t\thash.rectAreaLength !== rectAreaLength ||\n\t\t\thash.hemiLength !== hemiLength ||\n\t\t\thash.numDirectionalShadows !== numDirectionalShadows ||\n\t\t\thash.numPointShadows !== numPointShadows ||\n\t\t\thash.numSpotShadows !== numSpotShadows ||\n\t\t\thash.numSpotMaps !== numSpotMaps ||\n\t\t\thash.numLightProbes !== numLightProbes ) {\n\n\t\t\tstate.directional.length = directionalLength;\n\t\t\tstate.spot.length = spotLength;\n\t\t\tstate.rectArea.length = rectAreaLength;\n\t\t\tstate.point.length = pointLength;\n\t\t\tstate.hemi.length = hemiLength;\n\n\t\t\tstate.directionalShadow.length = numDirectionalShadows;\n\t\t\tstate.directionalShadowMap.length = numDirectionalShadows;\n\t\t\tstate.pointShadow.length = numPointShadows;\n\t\t\tstate.pointShadowMap.length = numPointShadows;\n\t\t\tstate.spotShadow.length = numSpotShadows;\n\t\t\tstate.spotShadowMap.length = numSpotShadows;\n\t\t\tstate.directionalShadowMatrix.length = numDirectionalShadows;\n\t\t\tstate.pointShadowMatrix.length = numPointShadows;\n\t\t\tstate.spotLightMatrix.length = numSpotShadows + numSpotMaps - numSpotShadowsWithMaps;\n\t\t\tstate.spotLightMap.length = numSpotMaps;\n\t\t\tstate.numSpotLightShadowsWithMaps = numSpotShadowsWithMaps;\n\t\t\tstate.numLightProbes = numLightProbes;\n\n\t\t\thash.directionalLength = directionalLength;\n\t\t\thash.pointLength = pointLength;\n\t\t\thash.spotLength = spotLength;\n\t\t\thash.rectAreaLength = rectAreaLength;\n\t\t\thash.hemiLength = hemiLength;\n\n\t\t\thash.numDirectionalShadows = numDirectionalShadows;\n\t\t\thash.numPointShadows = numPointShadows;\n\t\t\thash.numSpotShadows = numSpotShadows;\n\t\t\thash.numSpotMaps = numSpotMaps;\n\n\t\t\thash.numLightProbes = numLightProbes;\n\n\t\t\tstate.version = nextVersion ++;\n\n\t\t}\n\n\t}\n\n\tfunction setupView( lights, camera ) {\n\n\t\tlet directionalLength = 0;\n\t\tlet pointLength = 0;\n\t\tlet spotLength = 0;\n\t\tlet rectAreaLength = 0;\n\t\tlet hemiLength = 0;\n\n\t\tconst viewMatrix = camera.matrixWorldInverse;\n\n\t\tfor ( let i = 0, l = lights.length; i < l; i ++ ) {\n\n\t\t\tconst light = lights[ i ];\n\n\t\t\tif ( light.isDirectionalLight ) {\n\n\t\t\t\tconst uniforms = state.directional[ directionalLength ];\n\n\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tvector3.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\tuniforms.direction.sub( vector3 );\n\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\tdirectionalLength ++;\n\n\t\t\t} else if ( light.isSpotLight ) {\n\n\t\t\t\tconst uniforms = state.spot[ spotLength ];\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tvector3.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\tuniforms.direction.sub( vector3 );\n\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\tspotLength ++;\n\n\t\t\t} else if ( light.isRectAreaLight ) {\n\n\t\t\t\tconst uniforms = state.rectArea[ rectAreaLength ];\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\t// extract local rotation of light to derive width/height half vectors\n\t\t\t\tmatrix42.identity();\n\t\t\t\tmatrix4.copy( light.matrixWorld );\n\t\t\t\tmatrix4.premultiply( viewMatrix );\n\t\t\t\tmatrix42.extractRotation( matrix4 );\n\n\t\t\t\tuniforms.halfWidth.set( light.width * 0.5, 0.0, 0.0 );\n\t\t\t\tuniforms.halfHeight.set( 0.0, light.height * 0.5, 0.0 );\n\n\t\t\t\tuniforms.halfWidth.applyMatrix4( matrix42 );\n\t\t\t\tuniforms.halfHeight.applyMatrix4( matrix42 );\n\n\t\t\t\trectAreaLength ++;\n\n\t\t\t} else if ( light.isPointLight ) {\n\n\t\t\t\tconst uniforms = state.point[ pointLength ];\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\tpointLength ++;\n\n\t\t\t} else if ( light.isHemisphereLight ) {\n\n\t\t\t\tconst uniforms = state.hemi[ hemiLength ];\n\n\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\themiLength ++;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn {\n\t\tsetup: setup,\n\t\tsetupView: setupView,\n\t\tstate: state\n\t};\n\n}\n\nfunction WebGLRenderState( extensions ) {\n\n\tconst lights = new WebGLLights( extensions );\n\n\tconst lightsArray = [];\n\tconst shadowsArray = [];\n\n\tfunction init( camera ) {\n\n\t\tstate.camera = camera;\n\n\t\tlightsArray.length = 0;\n\t\tshadowsArray.length = 0;\n\n\t}\n\n\tfunction pushLight( light ) {\n\n\t\tlightsArray.push( light );\n\n\t}\n\n\tfunction pushShadow( shadowLight ) {\n\n\t\tshadowsArray.push( shadowLight );\n\n\t}\n\n\tfunction setupLights() {\n\n\t\tlights.setup( lightsArray );\n\n\t}\n\n\tfunction setupLightsView( camera ) {\n\n\t\tlights.setupView( lightsArray, camera );\n\n\t}\n\n\tconst state = {\n\t\tlightsArray: lightsArray,\n\t\tshadowsArray: shadowsArray,\n\n\t\tcamera: null,\n\n\t\tlights: lights,\n\n\t\ttransmissionRenderTarget: {}\n\t};\n\n\treturn {\n\t\tinit: init,\n\t\tstate: state,\n\t\tsetupLights: setupLights,\n\t\tsetupLightsView: setupLightsView,\n\n\t\tpushLight: pushLight,\n\t\tpushShadow: pushShadow\n\t};\n\n}\n\nfunction WebGLRenderStates( extensions ) {\n\n\tlet renderStates = new WeakMap();\n\n\tfunction get( scene, renderCallDepth = 0 ) {\n\n\t\tconst renderStateArray = renderStates.get( scene );\n\t\tlet renderState;\n\n\t\tif ( renderStateArray === undefined ) {\n\n\t\t\trenderState = new WebGLRenderState( extensions );\n\t\t\trenderStates.set( scene, [ renderState ] );\n\n\t\t} else {\n\n\t\t\tif ( renderCallDepth >= renderStateArray.length ) {\n\n\t\t\t\trenderState = new WebGLRenderState( extensions );\n\t\t\t\trenderStateArray.push( renderState );\n\n\t\t\t} else {\n\n\t\t\t\trenderState = renderStateArray[ renderCallDepth ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn renderState;\n\n\t}\n\n\tfunction dispose() {\n\n\t\trenderStates = new WeakMap();\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\nconst vertex = \"void main() {\\n\\tgl_Position = vec4( position, 1.0 );\\n}\";\n\nconst fragment = \"uniform sampler2D shadow_pass;\\nuniform vec2 resolution;\\nuniform float radius;\\n#include <packing>\\nvoid main() {\\n\\tconst float samples = float( VSM_SAMPLES );\\n\\tfloat mean = 0.0;\\n\\tfloat squared_mean = 0.0;\\n\\tfloat uvStride = samples <= 1.0 ? 0.0 : 2.0 / ( samples - 1.0 );\\n\\tfloat uvStart = samples <= 1.0 ? 0.0 : - 1.0;\\n\\tfor ( float i = 0.0; i < samples; i ++ ) {\\n\\t\\tfloat uvOffset = uvStart + i * uvStride;\\n\\t\\t#ifdef HORIZONTAL_PASS\\n\\t\\t\\tvec2 distribution = unpackRGBATo2Half( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( uvOffset, 0.0 ) * radius ) / resolution ) );\\n\\t\\t\\tmean += distribution.x;\\n\\t\\t\\tsquared_mean += distribution.y * distribution.y + distribution.x * distribution.x;\\n\\t\\t#else\\n\\t\\t\\tfloat depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0, uvOffset ) * radius ) / resolution ) );\\n\\t\\t\\tmean += depth;\\n\\t\\t\\tsquared_mean += depth * depth;\\n\\t\\t#endif\\n\\t}\\n\\tmean = mean / samples;\\n\\tsquared_mean = squared_mean / samples;\\n\\tfloat std_dev = sqrt( squared_mean - mean * mean );\\n\\tgl_FragColor = pack2HalfToRGBA( vec2( mean, std_dev ) );\\n}\";\n\nfunction WebGLShadowMap( renderer, objects, capabilities ) {\n\n\tlet _frustum = new Frustum();\n\n\tconst _shadowMapSize = new Vector2(),\n\t\t_viewportSize = new Vector2(),\n\n\t\t_viewport = new Vector4(),\n\n\t\t_depthMaterial = new MeshDepthMaterial( { depthPacking: RGBADepthPacking } ),\n\t\t_distanceMaterial = new MeshDistanceMaterial(),\n\n\t\t_materialCache = {},\n\n\t\t_maxTextureSize = capabilities.maxTextureSize;\n\n\tconst shadowSide = { [ FrontSide ]: BackSide, [ BackSide ]: FrontSide, [ DoubleSide ]: DoubleSide };\n\n\tconst shadowMaterialVertical = new ShaderMaterial( {\n\t\tdefines: {\n\t\t\tVSM_SAMPLES: 8\n\t\t},\n\t\tuniforms: {\n\t\t\tshadow_pass: { value: null },\n\t\t\tresolution: { value: new Vector2() },\n\t\t\tradius: { value: 4.0 }\n\t\t},\n\n\t\tvertexShader: vertex,\n\t\tfragmentShader: fragment\n\n\t} );\n\n\tconst shadowMaterialHorizontal = shadowMaterialVertical.clone();\n\tshadowMaterialHorizontal.defines.HORIZONTAL_PASS = 1;\n\n\tconst fullScreenTri = new BufferGeometry();\n\tfullScreenTri.setAttribute(\n\t\t'position',\n\t\tnew BufferAttribute(\n\t\t\tnew Float32Array( [ -1, -1, 0.5, 3, -1, 0.5, -1, 3, 0.5 ] ),\n\t\t\t3\n\t\t)\n\t);\n\n\tconst fullScreenMesh = new Mesh( fullScreenTri, shadowMaterialVertical );\n\n\tconst scope = this;\n\n\tthis.enabled = false;\n\n\tthis.autoUpdate = true;\n\tthis.needsUpdate = false;\n\n\tthis.type = PCFShadowMap;\n\tlet _previousType = this.type;\n\n\tthis.render = function ( lights, scene, camera ) {\n\n\t\tif ( scope.enabled === false ) return;\n\t\tif ( scope.autoUpdate === false && scope.needsUpdate === false ) return;\n\n\t\tif ( lights.length === 0 ) return;\n\n\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\t\tconst activeCubeFace = renderer.getActiveCubeFace();\n\t\tconst activeMipmapLevel = renderer.getActiveMipmapLevel();\n\n\t\tconst _state = renderer.state;\n\n\t\t// Set GL state for depth map.\n\t\t_state.setBlending( NoBlending );\n\n\t\tif ( _state.buffers.depth.getReversed() === true ) {\n\n\t\t\t_state.buffers.color.setClear( 0, 0, 0, 0 );\n\n\t\t} else {\n\n\t\t\t_state.buffers.color.setClear( 1, 1, 1, 1 );\n\n\t\t}\n\n\t\t_state.buffers.depth.setTest( true );\n\t\t_state.setScissorTest( false );\n\n\t\t// check for shadow map type changes\n\n\t\tconst toVSM = ( _previousType !== VSMShadowMap && this.type === VSMShadowMap );\n\t\tconst fromVSM = ( _previousType === VSMShadowMap && this.type !== VSMShadowMap );\n\n\t\t// render depth map\n\n\t\tfor ( let i = 0, il = lights.length; i < il; i ++ ) {\n\n\t\t\tconst light = lights[ i ];\n\t\t\tconst shadow = light.shadow;\n\n\t\t\tif ( shadow === undefined ) {\n\n\t\t\t\twarn( 'WebGLShadowMap:', light, 'has no shadow.' );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tif ( shadow.autoUpdate === false && shadow.needsUpdate === false ) continue;\n\n\t\t\t_shadowMapSize.copy( shadow.mapSize );\n\n\t\t\tconst shadowFrameExtents = shadow.getFrameExtents();\n\n\t\t\t_shadowMapSize.multiply( shadowFrameExtents );\n\n\t\t\t_viewportSize.copy( shadow.mapSize );\n\n\t\t\tif ( _shadowMapSize.x > _maxTextureSize || _shadowMapSize.y > _maxTextureSize ) {\n\n\t\t\t\tif ( _shadowMapSize.x > _maxTextureSize ) {\n\n\t\t\t\t\t_viewportSize.x = Math.floor( _maxTextureSize / shadowFrameExtents.x );\n\t\t\t\t\t_shadowMapSize.x = _viewportSize.x * shadowFrameExtents.x;\n\t\t\t\t\tshadow.mapSize.x = _viewportSize.x;\n\n\t\t\t\t}\n\n\t\t\t\tif ( _shadowMapSize.y > _maxTextureSize ) {\n\n\t\t\t\t\t_viewportSize.y = Math.floor( _maxTextureSize / shadowFrameExtents.y );\n\t\t\t\t\t_shadowMapSize.y = _viewportSize.y * shadowFrameExtents.y;\n\t\t\t\t\tshadow.mapSize.y = _viewportSize.y;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( shadow.map === null || toVSM === true || fromVSM === true ) {\n\n\t\t\t\tconst pars = ( this.type !== VSMShadowMap ) ? { minFilter: NearestFilter, magFilter: NearestFilter } : {};\n\n\t\t\t\tif ( shadow.map !== null ) {\n\n\t\t\t\t\tshadow.map.dispose();\n\n\t\t\t\t}\n\n\t\t\t\tshadow.map = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y, pars );\n\t\t\t\tshadow.map.texture.name = light.name + '.shadowMap';\n\n\t\t\t\tshadow.camera.updateProjectionMatrix();\n\n\t\t\t}\n\n\t\t\trenderer.setRenderTarget( shadow.map );\n\t\t\trenderer.clear();\n\n\t\t\tconst viewportCount = shadow.getViewportCount();\n\n\t\t\tfor ( let vp = 0; vp < viewportCount; vp ++ ) {\n\n\t\t\t\tconst viewport = shadow.getViewport( vp );\n\n\t\t\t\t_viewport.set(\n\t\t\t\t\t_viewportSize.x * viewport.x,\n\t\t\t\t\t_viewportSize.y * viewport.y,\n\t\t\t\t\t_viewportSize.x * viewport.z,\n\t\t\t\t\t_viewportSize.y * viewport.w\n\t\t\t\t);\n\n\t\t\t\t_state.viewport( _viewport );\n\n\t\t\t\tshadow.updateMatrices( light, vp );\n\n\t\t\t\t_frustum = shadow.getFrustum();\n\n\t\t\t\trenderObject( scene, camera, shadow.camera, light, this.type );\n\n\t\t\t}\n\n\t\t\t// do blur pass for VSM\n\n\t\t\tif ( shadow.isPointLightShadow !== true && this.type === VSMShadowMap ) {\n\n\t\t\t\tVSMPass( shadow, camera );\n\n\t\t\t}\n\n\t\t\tshadow.needsUpdate = false;\n\n\t\t}\n\n\t\t_previousType = this.type;\n\n\t\tscope.needsUpdate = false;\n\n\t\trenderer.setRenderTarget( currentRenderTarget, activeCubeFace, activeMipmapLevel );\n\n\t};\n\n\tfunction VSMPass( shadow, camera ) {\n\n\t\tconst geometry = objects.update( fullScreenMesh );\n\n\t\tif ( shadowMaterialVertical.defines.VSM_SAMPLES !== shadow.blurSamples ) {\n\n\t\t\tshadowMaterialVertical.defines.VSM_SAMPLES = shadow.blurSamples;\n\t\t\tshadowMaterialHorizontal.defines.VSM_SAMPLES = shadow.blurSamples;\n\n\t\t\tshadowMaterialVertical.needsUpdate = true;\n\t\t\tshadowMaterialHorizontal.needsUpdate = true;\n\n\t\t}\n\n\t\tif ( shadow.mapPass === null ) {\n\n\t\t\tshadow.mapPass = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y );\n\n\t\t}\n\n\t\t// vertical pass\n\n\t\tshadowMaterialVertical.uniforms.shadow_pass.value = shadow.map.texture;\n\t\tshadowMaterialVertical.uniforms.resolution.value = shadow.mapSize;\n\t\tshadowMaterialVertical.uniforms.radius.value = shadow.radius;\n\t\trenderer.setRenderTarget( shadow.mapPass );\n\t\trenderer.clear();\n\t\trenderer.renderBufferDirect( camera, null, geometry, shadowMaterialVertical, fullScreenMesh, null );\n\n\t\t// horizontal pass\n\n\t\tshadowMaterialHorizontal.uniforms.shadow_pass.value = shadow.mapPass.texture;\n\t\tshadowMaterialHorizontal.uniforms.resolution.value = shadow.mapSize;\n\t\tshadowMaterialHorizontal.uniforms.radius.value = shadow.radius;\n\t\trenderer.setRenderTarget( shadow.map );\n\t\trenderer.clear();\n\t\trenderer.renderBufferDirect( camera, null, geometry, shadowMaterialHorizontal, fullScreenMesh, null );\n\n\t}\n\n\tfunction getDepthMaterial( object, material, light, type ) {\n\n\t\tlet result = null;\n\n\t\tconst customMaterial = ( light.isPointLight === true ) ? object.customDistanceMaterial : object.customDepthMaterial;\n\n\t\tif ( customMaterial !== undefined ) {\n\n\t\t\tresult = customMaterial;\n\n\t\t} else {\n\n\t\t\tresult = ( light.isPointLight === true ) ? _distanceMaterial : _depthMaterial;\n\n\t\t\tif ( ( renderer.localClippingEnabled && material.clipShadows === true && Array.isArray( material.clippingPlanes ) && material.clippingPlanes.length !== 0 ) ||\n\t\t\t\t( material.displacementMap && material.displacementScale !== 0 ) ||\n\t\t\t\t( material.alphaMap && material.alphaTest > 0 ) ||\n\t\t\t\t( material.map && material.alphaTest > 0 ) ||\n\t\t\t\t( material.alphaToCoverage === true ) ) {\n\n\t\t\t\t// in this case we need a unique material instance reflecting the\n\t\t\t\t// appropriate state\n\n\t\t\t\tconst keyA = result.uuid, keyB = material.uuid;\n\n\t\t\t\tlet materialsForVariant = _materialCache[ keyA ];\n\n\t\t\t\tif ( materialsForVariant === undefined ) {\n\n\t\t\t\t\tmaterialsForVariant = {};\n\t\t\t\t\t_materialCache[ keyA ] = materialsForVariant;\n\n\t\t\t\t}\n\n\t\t\t\tlet cachedMaterial = materialsForVariant[ keyB ];\n\n\t\t\t\tif ( cachedMaterial === undefined ) {\n\n\t\t\t\t\tcachedMaterial = result.clone();\n\t\t\t\t\tmaterialsForVariant[ keyB ] = cachedMaterial;\n\t\t\t\t\tmaterial.addEventListener( 'dispose', onMaterialDispose );\n\n\t\t\t\t}\n\n\t\t\t\tresult = cachedMaterial;\n\n\t\t\t}\n\n\t\t}\n\n\t\tresult.visible = material.visible;\n\t\tresult.wireframe = material.wireframe;\n\n\t\tif ( type === VSMShadowMap ) {\n\n\t\t\tresult.side = ( material.shadowSide !== null ) ? material.shadowSide : material.side;\n\n\t\t} else {\n\n\t\t\tresult.side = ( material.shadowSide !== null ) ? material.shadowSide : shadowSide[ material.side ];\n\n\t\t}\n\n\t\tresult.alphaMap = material.alphaMap;\n\t\tresult.alphaTest = ( material.alphaToCoverage === true ) ? 0.5 : material.alphaTest; // approximate alphaToCoverage by using a fixed alphaTest value\n\t\tresult.map = material.map;\n\n\t\tresult.clipShadows = material.clipShadows;\n\t\tresult.clippingPlanes = material.clippingPlanes;\n\t\tresult.clipIntersection = material.clipIntersection;\n\n\t\tresult.displacementMap = material.displacementMap;\n\t\tresult.displacementScale = material.displacementScale;\n\t\tresult.displacementBias = material.displacementBias;\n\n\t\tresult.wireframeLinewidth = material.wireframeLinewidth;\n\t\tresult.linewidth = material.linewidth;\n\n\t\tif ( light.isPointLight === true && result.isMeshDistanceMaterial === true ) {\n\n\t\t\tconst materialProperties = renderer.properties.get( result );\n\t\t\tmaterialProperties.light = light;\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\tfunction renderObject( object, camera, shadowCamera, light, type ) {\n\n\t\tif ( object.visible === false ) return;\n\n\t\tconst visible = object.layers.test( camera.layers );\n\n\t\tif ( visible && ( object.isMesh || object.isLine || object.isPoints ) ) {\n\n\t\t\tif ( ( object.castShadow || ( object.receiveShadow && type === VSMShadowMap ) ) && ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) ) {\n\n\t\t\t\tobject.modelViewMatrix.multiplyMatrices( shadowCamera.matrixWorldInverse, object.matrixWorld );\n\n\t\t\t\tconst geometry = objects.update( object );\n\t\t\t\tconst material = object.material;\n\n\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\tconst groups = geometry.groups;\n\n\t\t\t\t\tfor ( let k = 0, kl = groups.length; k < kl; k ++ ) {\n\n\t\t\t\t\t\tconst group = groups[ k ];\n\t\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\t\tif ( groupMaterial && groupMaterial.visible ) {\n\n\t\t\t\t\t\t\tconst depthMaterial = getDepthMaterial( object, groupMaterial, light, type );\n\n\t\t\t\t\t\t\tobject.onBeforeShadow( renderer, object, camera, shadowCamera, geometry, depthMaterial, group );\n\n\t\t\t\t\t\t\trenderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, group );\n\n\t\t\t\t\t\t\tobject.onAfterShadow( renderer, object, camera, shadowCamera, geometry, depthMaterial, group );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( material.visible ) {\n\n\t\t\t\t\tconst depthMaterial = getDepthMaterial( object, material, light, type );\n\n\t\t\t\t\tobject.onBeforeShadow( renderer, object, camera, shadowCamera, geometry, depthMaterial, null );\n\n\t\t\t\t\trenderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, null );\n\n\t\t\t\t\tobject.onAfterShadow( renderer, object, camera, shadowCamera, geometry, depthMaterial, null );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst children = object.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\trenderObject( children[ i ], camera, shadowCamera, light, type );\n\n\t\t}\n\n\t}\n\n\tfunction onMaterialDispose( event ) {\n\n\t\tconst material = event.target;\n\n\t\tmaterial.removeEventListener( 'dispose', onMaterialDispose );\n\n\t\t// make sure to remove the unique distance/depth materials used for shadow map rendering\n\n\t\tfor ( const id in _materialCache ) {\n\n\t\t\tconst cache = _materialCache[ id ];\n\n\t\t\tconst uuid = event.target.uuid;\n\n\t\t\tif ( uuid in cache ) {\n\n\t\t\t\tconst shadowMaterial = cache[ uuid ];\n\t\t\t\tshadowMaterial.dispose();\n\t\t\t\tdelete cache[ uuid ];\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nconst reversedFuncs = {\n\t[ NeverDepth ]: AlwaysDepth,\n\t[ LessDepth ]: GreaterDepth,\n\t[ EqualDepth ]: NotEqualDepth,\n\t[ LessEqualDepth ]: GreaterEqualDepth,\n\n\t[ AlwaysDepth ]: NeverDepth,\n\t[ GreaterDepth ]: LessDepth,\n\t[ NotEqualDepth ]: EqualDepth,\n\t[ GreaterEqualDepth ]: LessEqualDepth,\n};\n\nfunction WebGLState( gl, extensions ) {\n\n\tfunction ColorBuffer() {\n\n\t\tlet locked = false;\n\n\t\tconst color = new Vector4();\n\t\tlet currentColorMask = null;\n\t\tconst currentColorClear = new Vector4( 0, 0, 0, 0 );\n\n\t\treturn {\n\n\t\t\tsetMask: function ( colorMask ) {\n\n\t\t\t\tif ( currentColorMask !== colorMask && ! locked ) {\n\n\t\t\t\t\tgl.colorMask( colorMask, colorMask, colorMask, colorMask );\n\t\t\t\t\tcurrentColorMask = colorMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\tlocked = lock;\n\n\t\t\t},\n\n\t\t\tsetClear: function ( r, g, b, a, premultipliedAlpha ) {\n\n\t\t\t\tif ( premultipliedAlpha === true ) {\n\n\t\t\t\t\tr *= a; g *= a; b *= a;\n\n\t\t\t\t}\n\n\t\t\t\tcolor.set( r, g, b, a );\n\n\t\t\t\tif ( currentColorClear.equals( color ) === false ) {\n\n\t\t\t\t\tgl.clearColor( r, g, b, a );\n\t\t\t\t\tcurrentColorClear.copy( color );\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\treset: function () {\n\n\t\t\t\tlocked = false;\n\n\t\t\t\tcurrentColorMask = null;\n\t\t\t\tcurrentColorClear.set( -1, 0, 0, 0 ); // set to invalid state\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\tfunction DepthBuffer() {\n\n\t\tlet locked = false;\n\n\t\tlet currentReversed = false;\n\t\tlet currentDepthMask = null;\n\t\tlet currentDepthFunc = null;\n\t\tlet currentDepthClear = null;\n\n\t\treturn {\n\n\t\t\tsetReversed: function ( reversed ) {\n\n\t\t\t\tif ( currentReversed !== reversed ) {\n\n\t\t\t\t\tconst ext = extensions.get( 'EXT_clip_control' );\n\n\t\t\t\t\tif ( reversed ) {\n\n\t\t\t\t\t\text.clipControlEXT( ext.LOWER_LEFT_EXT, ext.ZERO_TO_ONE_EXT );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\text.clipControlEXT( ext.LOWER_LEFT_EXT, ext.NEGATIVE_ONE_TO_ONE_EXT );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcurrentReversed = reversed;\n\n\t\t\t\t\tconst oldDepth = currentDepthClear;\n\t\t\t\t\tcurrentDepthClear = null;\n\t\t\t\t\tthis.setClear( oldDepth );\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tgetReversed: function () {\n\n\t\t\t\treturn currentReversed;\n\n\t\t\t},\n\n\t\t\tsetTest: function ( depthTest ) {\n\n\t\t\t\tif ( depthTest ) {\n\n\t\t\t\t\tenable( gl.DEPTH_TEST );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tdisable( gl.DEPTH_TEST );\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetMask: function ( depthMask ) {\n\n\t\t\t\tif ( currentDepthMask !== depthMask && ! locked ) {\n\n\t\t\t\t\tgl.depthMask( depthMask );\n\t\t\t\t\tcurrentDepthMask = depthMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetFunc: function ( depthFunc ) {\n\n\t\t\t\tif ( currentReversed ) depthFunc = reversedFuncs[ depthFunc ];\n\n\t\t\t\tif ( currentDepthFunc !== depthFunc ) {\n\n\t\t\t\t\tswitch ( depthFunc ) {\n\n\t\t\t\t\t\tcase NeverDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.NEVER );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase AlwaysDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.ALWAYS );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase LessDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.LESS );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase LessEqualDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.LEQUAL );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase EqualDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.EQUAL );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase GreaterEqualDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.GEQUAL );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase GreaterDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.GREATER );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase NotEqualDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.NOTEQUAL );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.LEQUAL );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcurrentDepthFunc = depthFunc;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\tlocked = lock;\n\n\t\t\t},\n\n\t\t\tsetClear: function ( depth ) {\n\n\t\t\t\tif ( currentDepthClear !== depth ) {\n\n\t\t\t\t\tif ( currentReversed ) {\n\n\t\t\t\t\t\tdepth = 1 - depth;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tgl.clearDepth( depth );\n\t\t\t\t\tcurrentDepthClear = depth;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\treset: function () {\n\n\t\t\t\tlocked = false;\n\n\t\t\t\tcurrentDepthMask = null;\n\t\t\t\tcurrentDepthFunc = null;\n\t\t\t\tcurrentDepthClear = null;\n\t\t\t\tcurrentReversed = false;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\tfunction StencilBuffer() {\n\n\t\tlet locked = false;\n\n\t\tlet currentStencilMask = null;\n\t\tlet currentStencilFunc = null;\n\t\tlet currentStencilRef = null;\n\t\tlet currentStencilFuncMask = null;\n\t\tlet currentStencilFail = null;\n\t\tlet currentStencilZFail = null;\n\t\tlet currentStencilZPass = null;\n\t\tlet currentStencilClear = null;\n\n\t\treturn {\n\n\t\t\tsetTest: function ( stencilTest ) {\n\n\t\t\t\tif ( ! locked ) {\n\n\t\t\t\t\tif ( stencilTest ) {\n\n\t\t\t\t\t\tenable( gl.STENCIL_TEST );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tdisable( gl.STENCIL_TEST );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetMask: function ( stencilMask ) {\n\n\t\t\t\tif ( currentStencilMask !== stencilMask && ! locked ) {\n\n\t\t\t\t\tgl.stencilMask( stencilMask );\n\t\t\t\t\tcurrentStencilMask = stencilMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetFunc: function ( stencilFunc, stencilRef, stencilMask ) {\n\n\t\t\t\tif ( currentStencilFunc !== stencilFunc ||\n\t\t\t\t     currentStencilRef !== stencilRef ||\n\t\t\t\t     currentStencilFuncMask !== stencilMask ) {\n\n\t\t\t\t\tgl.stencilFunc( stencilFunc, stencilRef, stencilMask );\n\n\t\t\t\t\tcurrentStencilFunc = stencilFunc;\n\t\t\t\t\tcurrentStencilRef = stencilRef;\n\t\t\t\t\tcurrentStencilFuncMask = stencilMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetOp: function ( stencilFail, stencilZFail, stencilZPass ) {\n\n\t\t\t\tif ( currentStencilFail !== stencilFail ||\n\t\t\t\t     currentStencilZFail !== stencilZFail ||\n\t\t\t\t     currentStencilZPass !== stencilZPass ) {\n\n\t\t\t\t\tgl.stencilOp( stencilFail, stencilZFail, stencilZPass );\n\n\t\t\t\t\tcurrentStencilFail = stencilFail;\n\t\t\t\t\tcurrentStencilZFail = stencilZFail;\n\t\t\t\t\tcurrentStencilZPass = stencilZPass;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\tlocked = lock;\n\n\t\t\t},\n\n\t\t\tsetClear: function ( stencil ) {\n\n\t\t\t\tif ( currentStencilClear !== stencil ) {\n\n\t\t\t\t\tgl.clearStencil( stencil );\n\t\t\t\t\tcurrentStencilClear = stencil;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\treset: function () {\n\n\t\t\t\tlocked = false;\n\n\t\t\t\tcurrentStencilMask = null;\n\t\t\t\tcurrentStencilFunc = null;\n\t\t\t\tcurrentStencilRef = null;\n\t\t\t\tcurrentStencilFuncMask = null;\n\t\t\t\tcurrentStencilFail = null;\n\t\t\t\tcurrentStencilZFail = null;\n\t\t\t\tcurrentStencilZPass = null;\n\t\t\t\tcurrentStencilClear = null;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t//\n\n\tconst colorBuffer = new ColorBuffer();\n\tconst depthBuffer = new DepthBuffer();\n\tconst stencilBuffer = new StencilBuffer();\n\n\tconst uboBindings = new WeakMap();\n\tconst uboProgramMap = new WeakMap();\n\n\tlet enabledCapabilities = {};\n\n\tlet currentBoundFramebuffers = {};\n\tlet currentDrawbuffers = new WeakMap();\n\tlet defaultDrawbuffers = [];\n\n\tlet currentProgram = null;\n\n\tlet currentBlendingEnabled = false;\n\tlet currentBlending = null;\n\tlet currentBlendEquation = null;\n\tlet currentBlendSrc = null;\n\tlet currentBlendDst = null;\n\tlet currentBlendEquationAlpha = null;\n\tlet currentBlendSrcAlpha = null;\n\tlet currentBlendDstAlpha = null;\n\tlet currentBlendColor = new Color( 0, 0, 0 );\n\tlet currentBlendAlpha = 0;\n\tlet currentPremultipledAlpha = false;\n\n\tlet currentFlipSided = null;\n\tlet currentCullFace = null;\n\n\tlet currentLineWidth = null;\n\n\tlet currentPolygonOffsetFactor = null;\n\tlet currentPolygonOffsetUnits = null;\n\n\tconst maxTextures = gl.getParameter( gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS );\n\n\tlet lineWidthAvailable = false;\n\tlet version = 0;\n\tconst glVersion = gl.getParameter( gl.VERSION );\n\n\tif ( glVersion.indexOf( 'WebGL' ) !== -1 ) {\n\n\t\tversion = parseFloat( /^WebGL (\\d)/.exec( glVersion )[ 1 ] );\n\t\tlineWidthAvailable = ( version >= 1.0 );\n\n\t} else if ( glVersion.indexOf( 'OpenGL ES' ) !== -1 ) {\n\n\t\tversion = parseFloat( /^OpenGL ES (\\d)/.exec( glVersion )[ 1 ] );\n\t\tlineWidthAvailable = ( version >= 2.0 );\n\n\t}\n\n\tlet currentTextureSlot = null;\n\tlet currentBoundTextures = {};\n\n\tconst scissorParam = gl.getParameter( gl.SCISSOR_BOX );\n\tconst viewportParam = gl.getParameter( gl.VIEWPORT );\n\n\tconst currentScissor = new Vector4().fromArray( scissorParam );\n\tconst currentViewport = new Vector4().fromArray( viewportParam );\n\n\tfunction createTexture( type, target, count, dimensions ) {\n\n\t\tconst data = new Uint8Array( 4 ); // 4 is required to match default unpack alignment of 4.\n\t\tconst texture = gl.createTexture();\n\n\t\tgl.bindTexture( type, texture );\n\t\tgl.texParameteri( type, gl.TEXTURE_MIN_FILTER, gl.NEAREST );\n\t\tgl.texParameteri( type, gl.TEXTURE_MAG_FILTER, gl.NEAREST );\n\n\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\tif ( type === gl.TEXTURE_3D || type === gl.TEXTURE_2D_ARRAY ) {\n\n\t\t\t\tgl.texImage3D( target, 0, gl.RGBA, 1, 1, dimensions, 0, gl.RGBA, gl.UNSIGNED_BYTE, data );\n\n\t\t\t} else {\n\n\t\t\t\tgl.texImage2D( target + i, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, data );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\tconst emptyTextures = {};\n\temptyTextures[ gl.TEXTURE_2D ] = createTexture( gl.TEXTURE_2D, gl.TEXTURE_2D, 1 );\n\temptyTextures[ gl.TEXTURE_CUBE_MAP ] = createTexture( gl.TEXTURE_CUBE_MAP, gl.TEXTURE_CUBE_MAP_POSITIVE_X, 6 );\n\temptyTextures[ gl.TEXTURE_2D_ARRAY ] = createTexture( gl.TEXTURE_2D_ARRAY, gl.TEXTURE_2D_ARRAY, 1, 1 );\n\temptyTextures[ gl.TEXTURE_3D ] = createTexture( gl.TEXTURE_3D, gl.TEXTURE_3D, 1, 1 );\n\n\t// init\n\n\tcolorBuffer.setClear( 0, 0, 0, 1 );\n\tdepthBuffer.setClear( 1 );\n\tstencilBuffer.setClear( 0 );\n\n\tenable( gl.DEPTH_TEST );\n\tdepthBuffer.setFunc( LessEqualDepth );\n\n\tsetFlipSided( false );\n\tsetCullFace( CullFaceBack );\n\tenable( gl.CULL_FACE );\n\n\tsetBlending( NoBlending );\n\n\t//\n\n\tfunction enable( id ) {\n\n\t\tif ( enabledCapabilities[ id ] !== true ) {\n\n\t\t\tgl.enable( id );\n\t\t\tenabledCapabilities[ id ] = true;\n\n\t\t}\n\n\t}\n\n\tfunction disable( id ) {\n\n\t\tif ( enabledCapabilities[ id ] !== false ) {\n\n\t\t\tgl.disable( id );\n\t\t\tenabledCapabilities[ id ] = false;\n\n\t\t}\n\n\t}\n\n\tfunction bindFramebuffer( target, framebuffer ) {\n\n\t\tif ( currentBoundFramebuffers[ target ] !== framebuffer ) {\n\n\t\t\tgl.bindFramebuffer( target, framebuffer );\n\n\t\t\tcurrentBoundFramebuffers[ target ] = framebuffer;\n\n\t\t\t// gl.DRAW_FRAMEBUFFER is equivalent to gl.FRAMEBUFFER\n\n\t\t\tif ( target === gl.DRAW_FRAMEBUFFER ) {\n\n\t\t\t\tcurrentBoundFramebuffers[ gl.FRAMEBUFFER ] = framebuffer;\n\n\t\t\t}\n\n\t\t\tif ( target === gl.FRAMEBUFFER ) {\n\n\t\t\t\tcurrentBoundFramebuffers[ gl.DRAW_FRAMEBUFFER ] = framebuffer;\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\tfunction drawBuffers( renderTarget, framebuffer ) {\n\n\t\tlet drawBuffers = defaultDrawbuffers;\n\n\t\tlet needsUpdate = false;\n\n\t\tif ( renderTarget ) {\n\n\t\t\tdrawBuffers = currentDrawbuffers.get( framebuffer );\n\n\t\t\tif ( drawBuffers === undefined ) {\n\n\t\t\t\tdrawBuffers = [];\n\t\t\t\tcurrentDrawbuffers.set( framebuffer, drawBuffers );\n\n\t\t\t}\n\n\t\t\tconst textures = renderTarget.textures;\n\n\t\t\tif ( drawBuffers.length !== textures.length || drawBuffers[ 0 ] !== gl.COLOR_ATTACHMENT0 ) {\n\n\t\t\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\t\t\tdrawBuffers[ i ] = gl.COLOR_ATTACHMENT0 + i;\n\n\t\t\t\t}\n\n\t\t\t\tdrawBuffers.length = textures.length;\n\n\t\t\t\tneedsUpdate = true;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( drawBuffers[ 0 ] !== gl.BACK ) {\n\n\t\t\t\tdrawBuffers[ 0 ] = gl.BACK;\n\n\t\t\t\tneedsUpdate = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( needsUpdate ) {\n\n\t\t\tgl.drawBuffers( drawBuffers );\n\n\t\t}\n\n\t}\n\n\tfunction useProgram( program ) {\n\n\t\tif ( currentProgram !== program ) {\n\n\t\t\tgl.useProgram( program );\n\n\t\t\tcurrentProgram = program;\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\tconst equationToGL = {\n\t\t[ AddEquation ]: gl.FUNC_ADD,\n\t\t[ SubtractEquation ]: gl.FUNC_SUBTRACT,\n\t\t[ ReverseSubtractEquation ]: gl.FUNC_REVERSE_SUBTRACT\n\t};\n\n\tequationToGL[ MinEquation ] = gl.MIN;\n\tequationToGL[ MaxEquation ] = gl.MAX;\n\n\tconst factorToGL = {\n\t\t[ ZeroFactor ]: gl.ZERO,\n\t\t[ OneFactor ]: gl.ONE,\n\t\t[ SrcColorFactor ]: gl.SRC_COLOR,\n\t\t[ SrcAlphaFactor ]: gl.SRC_ALPHA,\n\t\t[ SrcAlphaSaturateFactor ]: gl.SRC_ALPHA_SATURATE,\n\t\t[ DstColorFactor ]: gl.DST_COLOR,\n\t\t[ DstAlphaFactor ]: gl.DST_ALPHA,\n\t\t[ OneMinusSrcColorFactor ]: gl.ONE_MINUS_SRC_COLOR,\n\t\t[ OneMinusSrcAlphaFactor ]: gl.ONE_MINUS_SRC_ALPHA,\n\t\t[ OneMinusDstColorFactor ]: gl.ONE_MINUS_DST_COLOR,\n\t\t[ OneMinusDstAlphaFactor ]: gl.ONE_MINUS_DST_ALPHA,\n\t\t[ ConstantColorFactor ]: gl.CONSTANT_COLOR,\n\t\t[ OneMinusConstantColorFactor ]: gl.ONE_MINUS_CONSTANT_COLOR,\n\t\t[ ConstantAlphaFactor ]: gl.CONSTANT_ALPHA,\n\t\t[ OneMinusConstantAlphaFactor ]: gl.ONE_MINUS_CONSTANT_ALPHA\n\t};\n\n\tfunction setBlending( blending, blendEquation, blendSrc, blendDst, blendEquationAlpha, blendSrcAlpha, blendDstAlpha, blendColor, blendAlpha, premultipliedAlpha ) {\n\n\t\tif ( blending === NoBlending ) {\n\n\t\t\tif ( currentBlendingEnabled === true ) {\n\n\t\t\t\tdisable( gl.BLEND );\n\t\t\t\tcurrentBlendingEnabled = false;\n\n\t\t\t}\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( currentBlendingEnabled === false ) {\n\n\t\t\tenable( gl.BLEND );\n\t\t\tcurrentBlendingEnabled = true;\n\n\t\t}\n\n\t\tif ( blending !== CustomBlending ) {\n\n\t\t\tif ( blending !== currentBlending || premultipliedAlpha !== currentPremultipledAlpha ) {\n\n\t\t\t\tif ( currentBlendEquation !== AddEquation || currentBlendEquationAlpha !== AddEquation ) {\n\n\t\t\t\t\tgl.blendEquation( gl.FUNC_ADD );\n\n\t\t\t\t\tcurrentBlendEquation = AddEquation;\n\t\t\t\t\tcurrentBlendEquationAlpha = AddEquation;\n\n\t\t\t\t}\n\n\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\tswitch ( blending ) {\n\n\t\t\t\t\t\tcase NormalBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.ONE, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase AdditiveBlending:\n\t\t\t\t\t\t\tgl.blendFunc( gl.ONE, gl.ONE );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase SubtractiveBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.ZERO, gl.ONE_MINUS_SRC_COLOR, gl.ZERO, gl.ONE );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase MultiplyBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.DST_COLOR, gl.ONE_MINUS_SRC_ALPHA, gl.ZERO, gl.ONE );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\terror( 'WebGLState: Invalid blending: ', blending );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tswitch ( blending ) {\n\n\t\t\t\t\t\tcase NormalBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase AdditiveBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.SRC_ALPHA, gl.ONE, gl.ONE, gl.ONE );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase SubtractiveBlending:\n\t\t\t\t\t\t\terror( 'WebGLState: SubtractiveBlending requires material.premultipliedAlpha = true' );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase MultiplyBlending:\n\t\t\t\t\t\t\terror( 'WebGLState: MultiplyBlending requires material.premultipliedAlpha = true' );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\terror( 'WebGLState: Invalid blending: ', blending );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tcurrentBlendSrc = null;\n\t\t\t\tcurrentBlendDst = null;\n\t\t\t\tcurrentBlendSrcAlpha = null;\n\t\t\t\tcurrentBlendDstAlpha = null;\n\t\t\t\tcurrentBlendColor.set( 0, 0, 0 );\n\t\t\t\tcurrentBlendAlpha = 0;\n\n\t\t\t\tcurrentBlending = blending;\n\t\t\t\tcurrentPremultipledAlpha = premultipliedAlpha;\n\n\t\t\t}\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t// custom blending\n\n\t\tblendEquationAlpha = blendEquationAlpha || blendEquation;\n\t\tblendSrcAlpha = blendSrcAlpha || blendSrc;\n\t\tblendDstAlpha = blendDstAlpha || blendDst;\n\n\t\tif ( blendEquation !== currentBlendEquation || blendEquationAlpha !== currentBlendEquationAlpha ) {\n\n\t\t\tgl.blendEquationSeparate( equationToGL[ blendEquation ], equationToGL[ blendEquationAlpha ] );\n\n\t\t\tcurrentBlendEquation = blendEquation;\n\t\t\tcurrentBlendEquationAlpha = blendEquationAlpha;\n\n\t\t}\n\n\t\tif ( blendSrc !== currentBlendSrc || blendDst !== currentBlendDst || blendSrcAlpha !== currentBlendSrcAlpha || blendDstAlpha !== currentBlendDstAlpha ) {\n\n\t\t\tgl.blendFuncSeparate( factorToGL[ blendSrc ], factorToGL[ blendDst ], factorToGL[ blendSrcAlpha ], factorToGL[ blendDstAlpha ] );\n\n\t\t\tcurrentBlendSrc = blendSrc;\n\t\t\tcurrentBlendDst = blendDst;\n\t\t\tcurrentBlendSrcAlpha = blendSrcAlpha;\n\t\t\tcurrentBlendDstAlpha = blendDstAlpha;\n\n\t\t}\n\n\t\tif ( blendColor.equals( currentBlendColor ) === false || blendAlpha !== currentBlendAlpha ) {\n\n\t\t\tgl.blendColor( blendColor.r, blendColor.g, blendColor.b, blendAlpha );\n\n\t\t\tcurrentBlendColor.copy( blendColor );\n\t\t\tcurrentBlendAlpha = blendAlpha;\n\n\t\t}\n\n\t\tcurrentBlending = blending;\n\t\tcurrentPremultipledAlpha = false;\n\n\t}\n\n\tfunction setMaterial( material, frontFaceCW ) {\n\n\t\tmaterial.side === DoubleSide\n\t\t\t? disable( gl.CULL_FACE )\n\t\t\t: enable( gl.CULL_FACE );\n\n\t\tlet flipSided = ( material.side === BackSide );\n\t\tif ( frontFaceCW ) flipSided = ! flipSided;\n\n\t\tsetFlipSided( flipSided );\n\n\t\t( material.blending === NormalBlending && material.transparent === false )\n\t\t\t? setBlending( NoBlending )\n\t\t\t: setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.blendColor, material.blendAlpha, material.premultipliedAlpha );\n\n\t\tdepthBuffer.setFunc( material.depthFunc );\n\t\tdepthBuffer.setTest( material.depthTest );\n\t\tdepthBuffer.setMask( material.depthWrite );\n\t\tcolorBuffer.setMask( material.colorWrite );\n\n\t\tconst stencilWrite = material.stencilWrite;\n\t\tstencilBuffer.setTest( stencilWrite );\n\t\tif ( stencilWrite ) {\n\n\t\t\tstencilBuffer.setMask( material.stencilWriteMask );\n\t\t\tstencilBuffer.setFunc( material.stencilFunc, material.stencilRef, material.stencilFuncMask );\n\t\t\tstencilBuffer.setOp( material.stencilFail, material.stencilZFail, material.stencilZPass );\n\n\t\t}\n\n\t\tsetPolygonOffset( material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits );\n\n\t\tmaterial.alphaToCoverage === true\n\t\t\t? enable( gl.SAMPLE_ALPHA_TO_COVERAGE )\n\t\t\t: disable( gl.SAMPLE_ALPHA_TO_COVERAGE );\n\n\t}\n\n\t//\n\n\tfunction setFlipSided( flipSided ) {\n\n\t\tif ( currentFlipSided !== flipSided ) {\n\n\t\t\tif ( flipSided ) {\n\n\t\t\t\tgl.frontFace( gl.CW );\n\n\t\t\t} else {\n\n\t\t\t\tgl.frontFace( gl.CCW );\n\n\t\t\t}\n\n\t\t\tcurrentFlipSided = flipSided;\n\n\t\t}\n\n\t}\n\n\tfunction setCullFace( cullFace ) {\n\n\t\tif ( cullFace !== CullFaceNone ) {\n\n\t\t\tenable( gl.CULL_FACE );\n\n\t\t\tif ( cullFace !== currentCullFace ) {\n\n\t\t\t\tif ( cullFace === CullFaceBack ) {\n\n\t\t\t\t\tgl.cullFace( gl.BACK );\n\n\t\t\t\t} else if ( cullFace === CullFaceFront ) {\n\n\t\t\t\t\tgl.cullFace( gl.FRONT );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tgl.cullFace( gl.FRONT_AND_BACK );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tdisable( gl.CULL_FACE );\n\n\t\t}\n\n\t\tcurrentCullFace = cullFace;\n\n\t}\n\n\tfunction setLineWidth( width ) {\n\n\t\tif ( width !== currentLineWidth ) {\n\n\t\t\tif ( lineWidthAvailable ) gl.lineWidth( width );\n\n\t\t\tcurrentLineWidth = width;\n\n\t\t}\n\n\t}\n\n\tfunction setPolygonOffset( polygonOffset, factor, units ) {\n\n\t\tif ( polygonOffset ) {\n\n\t\t\tenable( gl.POLYGON_OFFSET_FILL );\n\n\t\t\tif ( currentPolygonOffsetFactor !== factor || currentPolygonOffsetUnits !== units ) {\n\n\t\t\t\tgl.polygonOffset( factor, units );\n\n\t\t\t\tcurrentPolygonOffsetFactor = factor;\n\t\t\t\tcurrentPolygonOffsetUnits = units;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tdisable( gl.POLYGON_OFFSET_FILL );\n\n\t\t}\n\n\t}\n\n\tfunction setScissorTest( scissorTest ) {\n\n\t\tif ( scissorTest ) {\n\n\t\t\tenable( gl.SCISSOR_TEST );\n\n\t\t} else {\n\n\t\t\tdisable( gl.SCISSOR_TEST );\n\n\t\t}\n\n\t}\n\n\t// texture\n\n\tfunction activeTexture( webglSlot ) {\n\n\t\tif ( webglSlot === undefined ) webglSlot = gl.TEXTURE0 + maxTextures - 1;\n\n\t\tif ( currentTextureSlot !== webglSlot ) {\n\n\t\t\tgl.activeTexture( webglSlot );\n\t\t\tcurrentTextureSlot = webglSlot;\n\n\t\t}\n\n\t}\n\n\tfunction bindTexture( webglType, webglTexture, webglSlot ) {\n\n\t\tif ( webglSlot === undefined ) {\n\n\t\t\tif ( currentTextureSlot === null ) {\n\n\t\t\t\twebglSlot = gl.TEXTURE0 + maxTextures - 1;\n\n\t\t\t} else {\n\n\t\t\t\twebglSlot = currentTextureSlot;\n\n\t\t\t}\n\n\t\t}\n\n\t\tlet boundTexture = currentBoundTextures[ webglSlot ];\n\n\t\tif ( boundTexture === undefined ) {\n\n\t\t\tboundTexture = { type: undefined, texture: undefined };\n\t\t\tcurrentBoundTextures[ webglSlot ] = boundTexture;\n\n\t\t}\n\n\t\tif ( boundTexture.type !== webglType || boundTexture.texture !== webglTexture ) {\n\n\t\t\tif ( currentTextureSlot !== webglSlot ) {\n\n\t\t\t\tgl.activeTexture( webglSlot );\n\t\t\t\tcurrentTextureSlot = webglSlot;\n\n\t\t\t}\n\n\t\t\tgl.bindTexture( webglType, webglTexture || emptyTextures[ webglType ] );\n\n\t\t\tboundTexture.type = webglType;\n\t\t\tboundTexture.texture = webglTexture;\n\n\t\t}\n\n\t}\n\n\tfunction unbindTexture() {\n\n\t\tconst boundTexture = currentBoundTextures[ currentTextureSlot ];\n\n\t\tif ( boundTexture !== undefined && boundTexture.type !== undefined ) {\n\n\t\t\tgl.bindTexture( boundTexture.type, null );\n\n\t\t\tboundTexture.type = undefined;\n\t\t\tboundTexture.texture = undefined;\n\n\t\t}\n\n\t}\n\n\tfunction compressedTexImage2D() {\n\n\t\ttry {\n\n\t\t\tgl.compressedTexImage2D( ...arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\terror( 'WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction compressedTexImage3D() {\n\n\t\ttry {\n\n\t\t\tgl.compressedTexImage3D( ...arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\terror( 'WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texSubImage2D() {\n\n\t\ttry {\n\n\t\t\tgl.texSubImage2D( ...arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\terror( 'WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texSubImage3D() {\n\n\t\ttry {\n\n\t\t\tgl.texSubImage3D( ...arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\terror( 'WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction compressedTexSubImage2D() {\n\n\t\ttry {\n\n\t\t\tgl.compressedTexSubImage2D( ...arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\terror( 'WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction compressedTexSubImage3D() {\n\n\t\ttry {\n\n\t\t\tgl.compressedTexSubImage3D( ...arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\terror( 'WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texStorage2D() {\n\n\t\ttry {\n\n\t\t\tgl.texStorage2D( ...arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\terror( 'WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texStorage3D() {\n\n\t\ttry {\n\n\t\t\tgl.texStorage3D( ...arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\terror( 'WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texImage2D() {\n\n\t\ttry {\n\n\t\t\tgl.texImage2D( ...arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\terror( 'WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texImage3D() {\n\n\t\ttry {\n\n\t\t\tgl.texImage3D( ...arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\terror( 'WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\t//\n\n\tfunction scissor( scissor ) {\n\n\t\tif ( currentScissor.equals( scissor ) === false ) {\n\n\t\t\tgl.scissor( scissor.x, scissor.y, scissor.z, scissor.w );\n\t\t\tcurrentScissor.copy( scissor );\n\n\t\t}\n\n\t}\n\n\tfunction viewport( viewport ) {\n\n\t\tif ( currentViewport.equals( viewport ) === false ) {\n\n\t\t\tgl.viewport( viewport.x, viewport.y, viewport.z, viewport.w );\n\t\t\tcurrentViewport.copy( viewport );\n\n\t\t}\n\n\t}\n\n\tfunction updateUBOMapping( uniformsGroup, program ) {\n\n\t\tlet mapping = uboProgramMap.get( program );\n\n\t\tif ( mapping === undefined ) {\n\n\t\t\tmapping = new WeakMap();\n\n\t\t\tuboProgramMap.set( program, mapping );\n\n\t\t}\n\n\t\tlet blockIndex = mapping.get( uniformsGroup );\n\n\t\tif ( blockIndex === undefined ) {\n\n\t\t\tblockIndex = gl.getUniformBlockIndex( program, uniformsGroup.name );\n\n\t\t\tmapping.set( uniformsGroup, blockIndex );\n\n\t\t}\n\n\t}\n\n\tfunction uniformBlockBinding( uniformsGroup, program ) {\n\n\t\tconst mapping = uboProgramMap.get( program );\n\t\tconst blockIndex = mapping.get( uniformsGroup );\n\n\t\tif ( uboBindings.get( program ) !== blockIndex ) {\n\n\t\t\t// bind shader specific block index to global block point\n\t\t\tgl.uniformBlockBinding( program, blockIndex, uniformsGroup.__bindingPointIndex );\n\n\t\t\tuboBindings.set( program, blockIndex );\n\n\t\t}\n\n\t}\n\n\t//\n\n\tfunction reset() {\n\n\t\t// reset state\n\n\t\tgl.disable( gl.BLEND );\n\t\tgl.disable( gl.CULL_FACE );\n\t\tgl.disable( gl.DEPTH_TEST );\n\t\tgl.disable( gl.POLYGON_OFFSET_FILL );\n\t\tgl.disable( gl.SCISSOR_TEST );\n\t\tgl.disable( gl.STENCIL_TEST );\n\t\tgl.disable( gl.SAMPLE_ALPHA_TO_COVERAGE );\n\n\t\tgl.blendEquation( gl.FUNC_ADD );\n\t\tgl.blendFunc( gl.ONE, gl.ZERO );\n\t\tgl.blendFuncSeparate( gl.ONE, gl.ZERO, gl.ONE, gl.ZERO );\n\t\tgl.blendColor( 0, 0, 0, 0 );\n\n\t\tgl.colorMask( true, true, true, true );\n\t\tgl.clearColor( 0, 0, 0, 0 );\n\n\t\tgl.depthMask( true );\n\t\tgl.depthFunc( gl.LESS );\n\n\t\tdepthBuffer.setReversed( false );\n\n\t\tgl.clearDepth( 1 );\n\n\t\tgl.stencilMask( 0xffffffff );\n\t\tgl.stencilFunc( gl.ALWAYS, 0, 0xffffffff );\n\t\tgl.stencilOp( gl.KEEP, gl.KEEP, gl.KEEP );\n\t\tgl.clearStencil( 0 );\n\n\t\tgl.cullFace( gl.BACK );\n\t\tgl.frontFace( gl.CCW );\n\n\t\tgl.polygonOffset( 0, 0 );\n\n\t\tgl.activeTexture( gl.TEXTURE0 );\n\n\t\tgl.bindFramebuffer( gl.FRAMEBUFFER, null );\n\t\tgl.bindFramebuffer( gl.DRAW_FRAMEBUFFER, null );\n\t\tgl.bindFramebuffer( gl.READ_FRAMEBUFFER, null );\n\n\t\tgl.useProgram( null );\n\n\t\tgl.lineWidth( 1 );\n\n\t\tgl.scissor( 0, 0, gl.canvas.width, gl.canvas.height );\n\t\tgl.viewport( 0, 0, gl.canvas.width, gl.canvas.height );\n\n\t\t// reset internals\n\n\t\tenabledCapabilities = {};\n\n\t\tcurrentTextureSlot = null;\n\t\tcurrentBoundTextures = {};\n\n\t\tcurrentBoundFramebuffers = {};\n\t\tcurrentDrawbuffers = new WeakMap();\n\t\tdefaultDrawbuffers = [];\n\n\t\tcurrentProgram = null;\n\n\t\tcurrentBlendingEnabled = false;\n\t\tcurrentBlending = null;\n\t\tcurrentBlendEquation = null;\n\t\tcurrentBlendSrc = null;\n\t\tcurrentBlendDst = null;\n\t\tcurrentBlendEquationAlpha = null;\n\t\tcurrentBlendSrcAlpha = null;\n\t\tcurrentBlendDstAlpha = null;\n\t\tcurrentBlendColor = new Color( 0, 0, 0 );\n\t\tcurrentBlendAlpha = 0;\n\t\tcurrentPremultipledAlpha = false;\n\n\t\tcurrentFlipSided = null;\n\t\tcurrentCullFace = null;\n\n\t\tcurrentLineWidth = null;\n\n\t\tcurrentPolygonOffsetFactor = null;\n\t\tcurrentPolygonOffsetUnits = null;\n\n\t\tcurrentScissor.set( 0, 0, gl.canvas.width, gl.canvas.height );\n\t\tcurrentViewport.set( 0, 0, gl.canvas.width, gl.canvas.height );\n\n\t\tcolorBuffer.reset();\n\t\tdepthBuffer.reset();\n\t\tstencilBuffer.reset();\n\n\t}\n\n\treturn {\n\n\t\tbuffers: {\n\t\t\tcolor: colorBuffer,\n\t\t\tdepth: depthBuffer,\n\t\t\tstencil: stencilBuffer\n\t\t},\n\n\t\tenable: enable,\n\t\tdisable: disable,\n\n\t\tbindFramebuffer: bindFramebuffer,\n\t\tdrawBuffers: drawBuffers,\n\n\t\tuseProgram: useProgram,\n\n\t\tsetBlending: setBlending,\n\t\tsetMaterial: setMaterial,\n\n\t\tsetFlipSided: setFlipSided,\n\t\tsetCullFace: setCullFace,\n\n\t\tsetLineWidth: setLineWidth,\n\t\tsetPolygonOffset: setPolygonOffset,\n\n\t\tsetScissorTest: setScissorTest,\n\n\t\tactiveTexture: activeTexture,\n\t\tbindTexture: bindTexture,\n\t\tunbindTexture: unbindTexture,\n\t\tcompressedTexImage2D: compressedTexImage2D,\n\t\tcompressedTexImage3D: compressedTexImage3D,\n\t\ttexImage2D: texImage2D,\n\t\ttexImage3D: texImage3D,\n\n\t\tupdateUBOMapping: updateUBOMapping,\n\t\tuniformBlockBinding: uniformBlockBinding,\n\n\t\ttexStorage2D: texStorage2D,\n\t\ttexStorage3D: texStorage3D,\n\t\ttexSubImage2D: texSubImage2D,\n\t\ttexSubImage3D: texSubImage3D,\n\t\tcompressedTexSubImage2D: compressedTexSubImage2D,\n\t\tcompressedTexSubImage3D: compressedTexSubImage3D,\n\n\t\tscissor: scissor,\n\t\tviewport: viewport,\n\n\t\treset: reset\n\n\t};\n\n}\n\nfunction WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info ) {\n\n\tconst multisampledRTTExt = extensions.has( 'WEBGL_multisampled_render_to_texture' ) ? extensions.get( 'WEBGL_multisampled_render_to_texture' ) : null;\n\tconst supportsInvalidateFramebuffer = typeof navigator === 'undefined' ? false : /OculusBrowser/g.test( navigator.userAgent );\n\n\tconst _imageDimensions = new Vector2();\n\tconst _videoTextures = new WeakMap();\n\tlet _canvas;\n\n\tconst _sources = new WeakMap(); // maps WebglTexture objects to instances of Source\n\n\t// cordova iOS (as of 5.0) still uses UIWebView, which provides OffscreenCanvas,\n\t// also OffscreenCanvas.getContext(\"webgl\"), but not OffscreenCanvas.getContext(\"2d\")!\n\t// Some implementations may only implement OffscreenCanvas partially (e.g. lacking 2d).\n\n\tlet useOffscreenCanvas = false;\n\n\ttry {\n\n\t\tuseOffscreenCanvas = typeof OffscreenCanvas !== 'undefined'\n\t\t\t// eslint-disable-next-line compat/compat\n\t\t\t&& ( new OffscreenCanvas( 1, 1 ).getContext( '2d' ) ) !== null;\n\n\t} catch ( err ) {\n\n\t\t// Ignore any errors\n\n\t}\n\n\tfunction createCanvas( width, height ) {\n\n\t\t// Use OffscreenCanvas when available. Specially needed in web workers\n\n\t\treturn useOffscreenCanvas ?\n\t\t\t// eslint-disable-next-line compat/compat\n\t\t\tnew OffscreenCanvas( width, height ) : createElementNS( 'canvas' );\n\n\t}\n\n\tfunction resizeImage( image, needsNewCanvas, maxSize ) {\n\n\t\tlet scale = 1;\n\n\t\tconst dimensions = getDimensions( image );\n\n\t\t// handle case if texture exceeds max size\n\n\t\tif ( dimensions.width > maxSize || dimensions.height > maxSize ) {\n\n\t\t\tscale = maxSize / Math.max( dimensions.width, dimensions.height );\n\n\t\t}\n\n\t\t// only perform resize if necessary\n\n\t\tif ( scale < 1 ) {\n\n\t\t\t// only perform resize for certain image types\n\n\t\t\tif ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) ||\n\t\t\t\t( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) ||\n\t\t\t\t( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ||\n\t\t\t\t( typeof VideoFrame !== 'undefined' && image instanceof VideoFrame ) ) {\n\n\t\t\t\tconst width = Math.floor( scale * dimensions.width );\n\t\t\t\tconst height = Math.floor( scale * dimensions.height );\n\n\t\t\t\tif ( _canvas === undefined ) _canvas = createCanvas( width, height );\n\n\t\t\t\t// cube textures can't reuse the same canvas\n\n\t\t\t\tconst canvas = needsNewCanvas ? createCanvas( width, height ) : _canvas;\n\n\t\t\t\tcanvas.width = width;\n\t\t\t\tcanvas.height = height;\n\n\t\t\t\tconst context = canvas.getContext( '2d' );\n\t\t\t\tcontext.drawImage( image, 0, 0, width, height );\n\n\t\t\t\twarn( 'WebGLRenderer: Texture has been resized from (' + dimensions.width + 'x' + dimensions.height + ') to (' + width + 'x' + height + ').' );\n\n\t\t\t\treturn canvas;\n\n\t\t\t} else {\n\n\t\t\t\tif ( 'data' in image ) {\n\n\t\t\t\t\twarn( 'WebGLRenderer: Image in DataTexture is too big (' + dimensions.width + 'x' + dimensions.height + ').' );\n\n\t\t\t\t}\n\n\t\t\t\treturn image;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn image;\n\n\t}\n\n\tfunction textureNeedsGenerateMipmaps( texture ) {\n\n\t\treturn texture.generateMipmaps;\n\n\t}\n\n\tfunction generateMipmap( target ) {\n\n\t\t_gl.generateMipmap( target );\n\n\t}\n\n\tfunction getTargetType( texture ) {\n\n\t\tif ( texture.isWebGLCubeRenderTarget ) return _gl.TEXTURE_CUBE_MAP;\n\t\tif ( texture.isWebGL3DRenderTarget ) return _gl.TEXTURE_3D;\n\t\tif ( texture.isWebGLArrayRenderTarget || texture.isCompressedArrayTexture ) return _gl.TEXTURE_2D_ARRAY;\n\t\treturn _gl.TEXTURE_2D;\n\n\t}\n\n\tfunction getInternalFormat( internalFormatName, glFormat, glType, colorSpace, forceLinearTransfer = false ) {\n\n\t\tif ( internalFormatName !== null ) {\n\n\t\t\tif ( _gl[ internalFormatName ] !== undefined ) return _gl[ internalFormatName ];\n\n\t\t\twarn( 'WebGLRenderer: Attempt to use non-existing WebGL internal format \\'' + internalFormatName + '\\'' );\n\n\t\t}\n\n\t\tlet internalFormat = glFormat;\n\n\t\tif ( glFormat === _gl.RED ) {\n\n\t\t\tif ( glType === _gl.FLOAT ) internalFormat = _gl.R32F;\n\t\t\tif ( glType === _gl.HALF_FLOAT ) internalFormat = _gl.R16F;\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.R8;\n\n\t\t}\n\n\t\tif ( glFormat === _gl.RED_INTEGER ) {\n\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.R8UI;\n\t\t\tif ( glType === _gl.UNSIGNED_SHORT ) internalFormat = _gl.R16UI;\n\t\t\tif ( glType === _gl.UNSIGNED_INT ) internalFormat = _gl.R32UI;\n\t\t\tif ( glType === _gl.BYTE ) internalFormat = _gl.R8I;\n\t\t\tif ( glType === _gl.SHORT ) internalFormat = _gl.R16I;\n\t\t\tif ( glType === _gl.INT ) internalFormat = _gl.R32I;\n\n\t\t}\n\n\t\tif ( glFormat === _gl.RG ) {\n\n\t\t\tif ( glType === _gl.FLOAT ) internalFormat = _gl.RG32F;\n\t\t\tif ( glType === _gl.HALF_FLOAT ) internalFormat = _gl.RG16F;\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.RG8;\n\n\t\t}\n\n\t\tif ( glFormat === _gl.RG_INTEGER ) {\n\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.RG8UI;\n\t\t\tif ( glType === _gl.UNSIGNED_SHORT ) internalFormat = _gl.RG16UI;\n\t\t\tif ( glType === _gl.UNSIGNED_INT ) internalFormat = _gl.RG32UI;\n\t\t\tif ( glType === _gl.BYTE ) internalFormat = _gl.RG8I;\n\t\t\tif ( glType === _gl.SHORT ) internalFormat = _gl.RG16I;\n\t\t\tif ( glType === _gl.INT ) internalFormat = _gl.RG32I;\n\n\t\t}\n\n\t\tif ( glFormat === _gl.RGB_INTEGER ) {\n\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.RGB8UI;\n\t\t\tif ( glType === _gl.UNSIGNED_SHORT ) internalFormat = _gl.RGB16UI;\n\t\t\tif ( glType === _gl.UNSIGNED_INT ) internalFormat = _gl.RGB32UI;\n\t\t\tif ( glType === _gl.BYTE ) internalFormat = _gl.RGB8I;\n\t\t\tif ( glType === _gl.SHORT ) internalFormat = _gl.RGB16I;\n\t\t\tif ( glType === _gl.INT ) internalFormat = _gl.RGB32I;\n\n\t\t}\n\n\t\tif ( glFormat === _gl.RGBA_INTEGER ) {\n\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.RGBA8UI;\n\t\t\tif ( glType === _gl.UNSIGNED_SHORT ) internalFormat = _gl.RGBA16UI;\n\t\t\tif ( glType === _gl.UNSIGNED_INT ) internalFormat = _gl.RGBA32UI;\n\t\t\tif ( glType === _gl.BYTE ) internalFormat = _gl.RGBA8I;\n\t\t\tif ( glType === _gl.SHORT ) internalFormat = _gl.RGBA16I;\n\t\t\tif ( glType === _gl.INT ) internalFormat = _gl.RGBA32I;\n\n\t\t}\n\n\t\tif ( glFormat === _gl.RGB ) {\n\n\t\t\tif ( glType === _gl.UNSIGNED_INT_5_9_9_9_REV ) internalFormat = _gl.RGB9_E5;\n\t\t\tif ( glType === _gl.UNSIGNED_INT_10F_11F_11F_REV ) internalFormat = _gl.R11F_G11F_B10F;\n\n\t\t}\n\n\t\tif ( glFormat === _gl.RGBA ) {\n\n\t\t\tconst transfer = forceLinearTransfer ? LinearTransfer : ColorManagement.getTransfer( colorSpace );\n\n\t\t\tif ( glType === _gl.FLOAT ) internalFormat = _gl.RGBA32F;\n\t\t\tif ( glType === _gl.HALF_FLOAT ) internalFormat = _gl.RGBA16F;\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = ( transfer === SRGBTransfer ) ? _gl.SRGB8_ALPHA8 : _gl.RGBA8;\n\t\t\tif ( glType === _gl.UNSIGNED_SHORT_4_4_4_4 ) internalFormat = _gl.RGBA4;\n\t\t\tif ( glType === _gl.UNSIGNED_SHORT_5_5_5_1 ) internalFormat = _gl.RGB5_A1;\n\n\t\t}\n\n\t\tif ( internalFormat === _gl.R16F || internalFormat === _gl.R32F ||\n\t\t\tinternalFormat === _gl.RG16F || internalFormat === _gl.RG32F ||\n\t\t\tinternalFormat === _gl.RGBA16F || internalFormat === _gl.RGBA32F ) {\n\n\t\t\textensions.get( 'EXT_color_buffer_float' );\n\n\t\t}\n\n\t\treturn internalFormat;\n\n\t}\n\n\tfunction getInternalDepthFormat( useStencil, depthType ) {\n\n\t\tlet glInternalFormat;\n\t\tif ( useStencil ) {\n\n\t\t\tif ( depthType === null || depthType === UnsignedIntType || depthType === UnsignedInt248Type ) {\n\n\t\t\t\tglInternalFormat = _gl.DEPTH24_STENCIL8;\n\n\t\t\t} else if ( depthType === FloatType ) {\n\n\t\t\t\tglInternalFormat = _gl.DEPTH32F_STENCIL8;\n\n\t\t\t} else if ( depthType === UnsignedShortType ) {\n\n\t\t\t\tglInternalFormat = _gl.DEPTH24_STENCIL8;\n\t\t\t\twarn( 'DepthTexture: 16 bit depth attachment is not supported with stencil. Using 24-bit attachment.' );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( depthType === null || depthType === UnsignedIntType || depthType === UnsignedInt248Type ) {\n\n\t\t\t\tglInternalFormat = _gl.DEPTH_COMPONENT24;\n\n\t\t\t} else if ( depthType === FloatType ) {\n\n\t\t\t\tglInternalFormat = _gl.DEPTH_COMPONENT32F;\n\n\t\t\t} else if ( depthType === UnsignedShortType ) {\n\n\t\t\t\tglInternalFormat = _gl.DEPTH_COMPONENT16;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn glInternalFormat;\n\n\t}\n\n\tfunction getMipLevels( texture, image ) {\n\n\t\tif ( textureNeedsGenerateMipmaps( texture ) === true || ( texture.isFramebufferTexture && texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ) ) {\n\n\t\t\treturn Math.log2( Math.max( image.width, image.height ) ) + 1;\n\n\t\t} else if ( texture.mipmaps !== undefined && texture.mipmaps.length > 0 ) {\n\n\t\t\t// user-defined mipmaps\n\n\t\t\treturn texture.mipmaps.length;\n\n\t\t} else if ( texture.isCompressedTexture && Array.isArray( texture.image ) ) {\n\n\t\t\treturn image.mipmaps.length;\n\n\t\t} else {\n\n\t\t\t// texture without mipmaps (only base level)\n\n\t\t\treturn 1;\n\n\t\t}\n\n\t}\n\n\t//\n\n\tfunction onTextureDispose( event ) {\n\n\t\tconst texture = event.target;\n\n\t\ttexture.removeEventListener( 'dispose', onTextureDispose );\n\n\t\tdeallocateTexture( texture );\n\n\t\tif ( texture.isVideoTexture ) {\n\n\t\t\t_videoTextures.delete( texture );\n\n\t\t}\n\n\t}\n\n\tfunction onRenderTargetDispose( event ) {\n\n\t\tconst renderTarget = event.target;\n\n\t\trenderTarget.removeEventListener( 'dispose', onRenderTargetDispose );\n\n\t\tdeallocateRenderTarget( renderTarget );\n\n\t}\n\n\t//\n\n\tfunction deallocateTexture( texture ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( textureProperties.__webglInit === undefined ) return;\n\n\t\t// check if it's necessary to remove the WebGLTexture object\n\n\t\tconst source = texture.source;\n\t\tconst webglTextures = _sources.get( source );\n\n\t\tif ( webglTextures ) {\n\n\t\t\tconst webglTexture = webglTextures[ textureProperties.__cacheKey ];\n\t\t\twebglTexture.usedTimes --;\n\n\t\t\t// the WebGLTexture object is not used anymore, remove it\n\n\t\t\tif ( webglTexture.usedTimes === 0 ) {\n\n\t\t\t\tdeleteTexture( texture );\n\n\t\t\t}\n\n\t\t\t// remove the weak map entry if no WebGLTexture uses the source anymore\n\n\t\t\tif ( Object.keys( webglTextures ).length === 0 ) {\n\n\t\t\t\t_sources.delete( source );\n\n\t\t\t}\n\n\t\t}\n\n\t\tproperties.remove( texture );\n\n\t}\n\n\tfunction deleteTexture( texture ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\t\t_gl.deleteTexture( textureProperties.__webglTexture );\n\n\t\tconst source = texture.source;\n\t\tconst webglTextures = _sources.get( source );\n\t\tdelete webglTextures[ textureProperties.__cacheKey ];\n\n\t\tinfo.memory.textures --;\n\n\t}\n\n\tfunction deallocateRenderTarget( renderTarget ) {\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\tif ( renderTarget.depthTexture ) {\n\n\t\t\trenderTarget.depthTexture.dispose();\n\n\t\t\tproperties.remove( renderTarget.depthTexture );\n\n\t\t}\n\n\t\tif ( renderTarget.isWebGLCubeRenderTarget ) {\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\tif ( Array.isArray( renderTargetProperties.__webglFramebuffer[ i ] ) ) {\n\n\t\t\t\t\tfor ( let level = 0; level < renderTargetProperties.__webglFramebuffer[ i ].length; level ++ ) _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ][ level ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ] );\n\n\t\t\t\t}\n\n\t\t\t\tif ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer[ i ] );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( Array.isArray( renderTargetProperties.__webglFramebuffer ) ) {\n\n\t\t\t\tfor ( let level = 0; level < renderTargetProperties.__webglFramebuffer.length; level ++ ) _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ level ] );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer );\n\n\t\t\t}\n\n\t\t\tif ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer );\n\t\t\tif ( renderTargetProperties.__webglMultisampledFramebuffer ) _gl.deleteFramebuffer( renderTargetProperties.__webglMultisampledFramebuffer );\n\n\t\t\tif ( renderTargetProperties.__webglColorRenderbuffer ) {\n\n\t\t\t\tfor ( let i = 0; i < renderTargetProperties.__webglColorRenderbuffer.length; i ++ ) {\n\n\t\t\t\t\tif ( renderTargetProperties.__webglColorRenderbuffer[ i ] ) _gl.deleteRenderbuffer( renderTargetProperties.__webglColorRenderbuffer[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( renderTargetProperties.__webglDepthRenderbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthRenderbuffer );\n\n\t\t}\n\n\t\tconst textures = renderTarget.textures;\n\n\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\tconst attachmentProperties = properties.get( textures[ i ] );\n\n\t\t\tif ( attachmentProperties.__webglTexture ) {\n\n\t\t\t\t_gl.deleteTexture( attachmentProperties.__webglTexture );\n\n\t\t\t\tinfo.memory.textures --;\n\n\t\t\t}\n\n\t\t\tproperties.remove( textures[ i ] );\n\n\t\t}\n\n\t\tproperties.remove( renderTarget );\n\n\t}\n\n\t//\n\n\tlet textureUnits = 0;\n\n\tfunction resetTextureUnits() {\n\n\t\ttextureUnits = 0;\n\n\t}\n\n\tfunction allocateTextureUnit() {\n\n\t\tconst textureUnit = textureUnits;\n\n\t\tif ( textureUnit >= capabilities.maxTextures ) {\n\n\t\t\twarn( 'WebGLTextures: Trying to use ' + textureUnit + ' texture units while this GPU supports only ' + capabilities.maxTextures );\n\n\t\t}\n\n\t\ttextureUnits += 1;\n\n\t\treturn textureUnit;\n\n\t}\n\n\tfunction getTextureCacheKey( texture ) {\n\n\t\tconst array = [];\n\n\t\tarray.push( texture.wrapS );\n\t\tarray.push( texture.wrapT );\n\t\tarray.push( texture.wrapR || 0 );\n\t\tarray.push( texture.magFilter );\n\t\tarray.push( texture.minFilter );\n\t\tarray.push( texture.anisotropy );\n\t\tarray.push( texture.internalFormat );\n\t\tarray.push( texture.format );\n\t\tarray.push( texture.type );\n\t\tarray.push( texture.generateMipmaps );\n\t\tarray.push( texture.premultiplyAlpha );\n\t\tarray.push( texture.flipY );\n\t\tarray.push( texture.unpackAlignment );\n\t\tarray.push( texture.colorSpace );\n\n\t\treturn array.join();\n\n\t}\n\n\t//\n\n\tfunction setTexture2D( texture, slot ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( texture.isVideoTexture ) updateVideoTexture( texture );\n\n\t\tif ( texture.isRenderTargetTexture === false && texture.isExternalTexture !== true && texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tconst image = texture.image;\n\n\t\t\tif ( image === null ) {\n\n\t\t\t\twarn( 'WebGLRenderer: Texture marked for update but no image data found.' );\n\n\t\t\t} else if ( image.complete === false ) {\n\n\t\t\t\twarn( 'WebGLRenderer: Texture marked for update but image is incomplete' );\n\n\t\t\t} else {\n\n\t\t\t\tuploadTexture( textureProperties, texture, slot );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t} else if ( texture.isExternalTexture ) {\n\n\t\t\ttextureProperties.__webglTexture = texture.sourceTexture ? texture.sourceTexture : null;\n\n\t\t}\n\n\t\tstate.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture, _gl.TEXTURE0 + slot );\n\n\t}\n\n\tfunction setTexture2DArray( texture, slot ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( texture.isRenderTargetTexture === false && texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tuploadTexture( textureProperties, texture, slot );\n\t\t\treturn;\n\n\t\t} else if ( texture.isExternalTexture ) {\n\n\t\t\ttextureProperties.__webglTexture = texture.sourceTexture ? texture.sourceTexture : null;\n\n\t\t}\n\n\t\tstate.bindTexture( _gl.TEXTURE_2D_ARRAY, textureProperties.__webglTexture, _gl.TEXTURE0 + slot );\n\n\t}\n\n\tfunction setTexture3D( texture, slot ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( texture.isRenderTargetTexture === false && texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tuploadTexture( textureProperties, texture, slot );\n\t\t\treturn;\n\n\t\t}\n\n\t\tstate.bindTexture( _gl.TEXTURE_3D, textureProperties.__webglTexture, _gl.TEXTURE0 + slot );\n\n\t}\n\n\tfunction setTextureCube( texture, slot ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tuploadCubeTexture( textureProperties, texture, slot );\n\t\t\treturn;\n\n\t\t}\n\n\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture, _gl.TEXTURE0 + slot );\n\n\t}\n\n\tconst wrappingToGL = {\n\t\t[ RepeatWrapping ]: _gl.REPEAT,\n\t\t[ ClampToEdgeWrapping ]: _gl.CLAMP_TO_EDGE,\n\t\t[ MirroredRepeatWrapping ]: _gl.MIRRORED_REPEAT\n\t};\n\n\tconst filterToGL = {\n\t\t[ NearestFilter ]: _gl.NEAREST,\n\t\t[ NearestMipmapNearestFilter ]: _gl.NEAREST_MIPMAP_NEAREST,\n\t\t[ NearestMipmapLinearFilter ]: _gl.NEAREST_MIPMAP_LINEAR,\n\n\t\t[ LinearFilter ]: _gl.LINEAR,\n\t\t[ LinearMipmapNearestFilter ]: _gl.LINEAR_MIPMAP_NEAREST,\n\t\t[ LinearMipmapLinearFilter ]: _gl.LINEAR_MIPMAP_LINEAR\n\t};\n\n\tconst compareToGL = {\n\t\t[ NeverCompare ]: _gl.NEVER,\n\t\t[ AlwaysCompare ]: _gl.ALWAYS,\n\t\t[ LessCompare ]: _gl.LESS,\n\t\t[ LessEqualCompare ]: _gl.LEQUAL,\n\t\t[ EqualCompare ]: _gl.EQUAL,\n\t\t[ GreaterEqualCompare ]: _gl.GEQUAL,\n\t\t[ GreaterCompare ]: _gl.GREATER,\n\t\t[ NotEqualCompare ]: _gl.NOTEQUAL\n\t};\n\n\tfunction setTextureParameters( textureType, texture ) {\n\n\t\tif ( texture.type === FloatType && extensions.has( 'OES_texture_float_linear' ) === false &&\n\t\t\t( texture.magFilter === LinearFilter || texture.magFilter === LinearMipmapNearestFilter || texture.magFilter === NearestMipmapLinearFilter || texture.magFilter === LinearMipmapLinearFilter ||\n\t\t\ttexture.minFilter === LinearFilter || texture.minFilter === LinearMipmapNearestFilter || texture.minFilter === NearestMipmapLinearFilter || texture.minFilter === LinearMipmapLinearFilter ) ) {\n\n\t\t\twarn( 'WebGLRenderer: Unable to use linear filtering with floating point textures. OES_texture_float_linear not supported on this device.' );\n\n\t\t}\n\n\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, wrappingToGL[ texture.wrapS ] );\n\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, wrappingToGL[ texture.wrapT ] );\n\n\t\tif ( textureType === _gl.TEXTURE_3D || textureType === _gl.TEXTURE_2D_ARRAY ) {\n\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_R, wrappingToGL[ texture.wrapR ] );\n\n\t\t}\n\n\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, filterToGL[ texture.magFilter ] );\n\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, filterToGL[ texture.minFilter ] );\n\n\t\tif ( texture.compareFunction ) {\n\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_COMPARE_MODE, _gl.COMPARE_REF_TO_TEXTURE );\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_COMPARE_FUNC, compareToGL[ texture.compareFunction ] );\n\n\t\t}\n\n\t\tif ( extensions.has( 'EXT_texture_filter_anisotropic' ) === true ) {\n\n\t\t\tif ( texture.magFilter === NearestFilter ) return;\n\t\t\tif ( texture.minFilter !== NearestMipmapLinearFilter && texture.minFilter !== LinearMipmapLinearFilter ) return;\n\t\t\tif ( texture.type === FloatType && extensions.has( 'OES_texture_float_linear' ) === false ) return; // verify extension\n\n\t\t\tif ( texture.anisotropy > 1 || properties.get( texture ).__currentAnisotropy ) {\n\n\t\t\t\tconst extension = extensions.get( 'EXT_texture_filter_anisotropic' );\n\t\t\t\t_gl.texParameterf( textureType, extension.TEXTURE_MAX_ANISOTROPY_EXT, Math.min( texture.anisotropy, capabilities.getMaxAnisotropy() ) );\n\t\t\t\tproperties.get( texture ).__currentAnisotropy = texture.anisotropy;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction initTexture( textureProperties, texture ) {\n\n\t\tlet forceUpload = false;\n\n\t\tif ( textureProperties.__webglInit === undefined ) {\n\n\t\t\ttextureProperties.__webglInit = true;\n\n\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t}\n\n\t\t// create Source <-> WebGLTextures mapping if necessary\n\n\t\tconst source = texture.source;\n\t\tlet webglTextures = _sources.get( source );\n\n\t\tif ( webglTextures === undefined ) {\n\n\t\t\twebglTextures = {};\n\t\t\t_sources.set( source, webglTextures );\n\n\t\t}\n\n\t\t// check if there is already a WebGLTexture object for the given texture parameters\n\n\t\tconst textureCacheKey = getTextureCacheKey( texture );\n\n\t\tif ( textureCacheKey !== textureProperties.__cacheKey ) {\n\n\t\t\t// if not, create a new instance of WebGLTexture\n\n\t\t\tif ( webglTextures[ textureCacheKey ] === undefined ) {\n\n\t\t\t\t// create new entry\n\n\t\t\t\twebglTextures[ textureCacheKey ] = {\n\t\t\t\t\ttexture: _gl.createTexture(),\n\t\t\t\t\tusedTimes: 0\n\t\t\t\t};\n\n\t\t\t\tinfo.memory.textures ++;\n\n\t\t\t\t// when a new instance of WebGLTexture was created, a texture upload is required\n\t\t\t\t// even if the image contents are identical\n\n\t\t\t\tforceUpload = true;\n\n\t\t\t}\n\n\t\t\twebglTextures[ textureCacheKey ].usedTimes ++;\n\n\t\t\t// every time the texture cache key changes, it's necessary to check if an instance of\n\t\t\t// WebGLTexture can be deleted in order to avoid a memory leak.\n\n\t\t\tconst webglTexture = webglTextures[ textureProperties.__cacheKey ];\n\n\t\t\tif ( webglTexture !== undefined ) {\n\n\t\t\t\twebglTextures[ textureProperties.__cacheKey ].usedTimes --;\n\n\t\t\t\tif ( webglTexture.usedTimes === 0 ) {\n\n\t\t\t\t\tdeleteTexture( texture );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// store references to cache key and WebGLTexture object\n\n\t\t\ttextureProperties.__cacheKey = textureCacheKey;\n\t\t\ttextureProperties.__webglTexture = webglTextures[ textureCacheKey ].texture;\n\n\t\t}\n\n\t\treturn forceUpload;\n\n\t}\n\n\tfunction getRow( index, rowLength, componentStride ) {\n\n\t\treturn Math.floor( Math.floor( index / componentStride ) / rowLength );\n\n\t}\n\n\tfunction updateTexture( texture, image, glFormat, glType ) {\n\n\t\tconst componentStride = 4; // only RGBA supported\n\n\t\tconst updateRanges = texture.updateRanges;\n\n\t\tif ( updateRanges.length === 0 ) {\n\n\t\t\tstate.texSubImage2D( _gl.TEXTURE_2D, 0, 0, 0, image.width, image.height, glFormat, glType, image.data );\n\n\t\t} else {\n\n\t\t\t// Before applying update ranges, we merge any adjacent / overlapping\n\t\t\t// ranges to reduce load on `gl.texSubImage2D`. Empirically, this has led\n\t\t\t// to performance improvements for applications which make heavy use of\n\t\t\t// update ranges. Likely due to GPU command overhead.\n\t\t\t//\n\t\t\t// Note that to reduce garbage collection between frames, we merge the\n\t\t\t// update ranges in-place. This is safe because this method will clear the\n\t\t\t// update ranges once updated.\n\n\t\t\tupdateRanges.sort( ( a, b ) => a.start - b.start );\n\n\t\t\t// To merge the update ranges in-place, we work from left to right in the\n\t\t\t// existing updateRanges array, merging ranges. This may result in a final\n\t\t\t// array which is smaller than the original. This index tracks the last\n\t\t\t// index representing a merged range, any data after this index can be\n\t\t\t// trimmed once the merge algorithm is completed.\n\t\t\tlet mergeIndex = 0;\n\n\t\t\tfor ( let i = 1; i < updateRanges.length; i ++ ) {\n\n\t\t\t\tconst previousRange = updateRanges[ mergeIndex ];\n\t\t\t\tconst range = updateRanges[ i ];\n\n\t\t\t\t// Only merge if in the same row and overlapping/adjacent\n\t\t\t\tconst previousEnd = previousRange.start + previousRange.count;\n\t\t\t\tconst currentRow = getRow( range.start, image.width, componentStride );\n\t\t\t\tconst previousRow = getRow( previousRange.start, image.width, componentStride );\n\n\t\t\t\t// We add one here to merge adjacent ranges. This is safe because ranges\n\t\t\t\t// operate over positive integers.\n\t\t\t\tif (\n\t\t\t\t\trange.start <= previousEnd + 1 &&\n\t\t\t\t\tcurrentRow === previousRow &&\n\t\t\t\t\tgetRow( range.start + range.count - 1, image.width, componentStride ) === currentRow // ensure range doesn't spill\n\t\t\t\t) {\n\n\t\t\t\t\tpreviousRange.count = Math.max(\n\t\t\t\t\t\tpreviousRange.count,\n\t\t\t\t\t\trange.start + range.count - previousRange.start\n\t\t\t\t\t);\n\n\t\t\t\t} else {\n\n\t\t\t\t\t++ mergeIndex;\n\t\t\t\t\tupdateRanges[ mergeIndex ] = range;\n\n\t\t\t\t}\n\n\n\t\t\t}\n\n\t\t\t// Trim the array to only contain the merged ranges.\n\t\t\tupdateRanges.length = mergeIndex + 1;\n\n\t\t\tconst currentUnpackRowLen = _gl.getParameter( _gl.UNPACK_ROW_LENGTH );\n\t\t\tconst currentUnpackSkipPixels = _gl.getParameter( _gl.UNPACK_SKIP_PIXELS );\n\t\t\tconst currentUnpackSkipRows = _gl.getParameter( _gl.UNPACK_SKIP_ROWS );\n\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ROW_LENGTH, image.width );\n\n\t\t\tfor ( let i = 0, l = updateRanges.length; i < l; i ++ ) {\n\n\t\t\t\tconst range = updateRanges[ i ];\n\n\t\t\t\tconst pixelStart = Math.floor( range.start / componentStride );\n\t\t\t\tconst pixelCount = Math.ceil( range.count / componentStride );\n\n\t\t\t\tconst x = pixelStart % image.width;\n\t\t\t\tconst y = Math.floor( pixelStart / image.width );\n\n\t\t\t\t// Assumes update ranges refer to contiguous memory\n\t\t\t\tconst width = pixelCount;\n\t\t\t\tconst height = 1;\n\n\t\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_PIXELS, x );\n\t\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_ROWS, y );\n\n\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_2D, 0, x, y, width, height, glFormat, glType, image.data );\n\n\t\t\t}\n\n\t\t\ttexture.clearUpdateRanges();\n\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ROW_LENGTH, currentUnpackRowLen );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_PIXELS, currentUnpackSkipPixels );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_ROWS, currentUnpackSkipRows );\n\n\t\t}\n\n\t}\n\n\tfunction uploadTexture( textureProperties, texture, slot ) {\n\n\t\tlet textureType = _gl.TEXTURE_2D;\n\n\t\tif ( texture.isDataArrayTexture || texture.isCompressedArrayTexture ) textureType = _gl.TEXTURE_2D_ARRAY;\n\t\tif ( texture.isData3DTexture ) textureType = _gl.TEXTURE_3D;\n\n\t\tconst forceUpload = initTexture( textureProperties, texture );\n\t\tconst source = texture.source;\n\n\t\tstate.bindTexture( textureType, textureProperties.__webglTexture, _gl.TEXTURE0 + slot );\n\n\t\tconst sourceProperties = properties.get( source );\n\n\t\tif ( source.version !== sourceProperties.__version || forceUpload === true ) {\n\n\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\n\t\t\tconst workingPrimaries = ColorManagement.getPrimaries( ColorManagement.workingColorSpace );\n\t\t\tconst texturePrimaries = texture.colorSpace === NoColorSpace ? null : ColorManagement.getPrimaries( texture.colorSpace );\n\t\t\tconst unpackConversion = texture.colorSpace === NoColorSpace || workingPrimaries === texturePrimaries ? _gl.NONE : _gl.BROWSER_DEFAULT_WEBGL;\n\n\t\t\t_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ALIGNMENT, texture.unpackAlignment );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, unpackConversion );\n\n\t\t\tlet image = resizeImage( texture.image, false, capabilities.maxTextureSize );\n\t\t\timage = verifyColorSpace( texture, image );\n\n\t\t\tconst glFormat = utils.convert( texture.format, texture.colorSpace );\n\n\t\t\tconst glType = utils.convert( texture.type );\n\t\t\tlet glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.colorSpace, texture.isVideoTexture );\n\n\t\t\tsetTextureParameters( textureType, texture );\n\n\t\t\tlet mipmap;\n\t\t\tconst mipmaps = texture.mipmaps;\n\n\t\t\tconst useTexStorage = ( texture.isVideoTexture !== true );\n\t\t\tconst allocateMemory = ( sourceProperties.__version === undefined ) || ( forceUpload === true );\n\t\t\tconst dataReady = source.dataReady;\n\t\t\tconst levels = getMipLevels( texture, image );\n\n\t\t\tif ( texture.isDepthTexture ) {\n\n\t\t\t\tglInternalFormat = getInternalDepthFormat( texture.format === DepthStencilFormat, texture.type );\n\n\t\t\t\t//\n\n\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, 1, glInternalFormat, image.width, image.height );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, null );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( texture.isDataTexture ) {\n\n\t\t\t\t// use manually created mipmaps if available\n\t\t\t\t// if there are no manual mipmaps\n\t\t\t\t// set 0 level mipmap and then use GL to generate other mipmap levels\n\n\t\t\t\tif ( mipmaps.length > 0 ) {\n\n\t\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, mipmaps[ 0 ].width, mipmaps[ 0 ].height );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_2D, i, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.generateMipmaps = false;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, image.width, image.height );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\tupdateTexture( texture, image, glFormat, glType );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, image.data );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( texture.isCompressedTexture ) {\n\n\t\t\t\tif ( texture.isCompressedArrayTexture ) {\n\n\t\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage3D( _gl.TEXTURE_2D_ARRAY, levels, glInternalFormat, mipmaps[ 0 ].width, mipmaps[ 0 ].height, image.depth );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\t\t\tif ( texture.format !== RGBAFormat ) {\n\n\t\t\t\t\t\t\tif ( glFormat !== null ) {\n\n\t\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\t\tif ( texture.layerUpdates.size > 0 ) {\n\n\t\t\t\t\t\t\t\t\t\t\tconst layerByteLength = getByteLength( mipmap.width, mipmap.height, texture.format, texture.type );\n\n\t\t\t\t\t\t\t\t\t\t\tfor ( const layerIndex of texture.layerUpdates ) {\n\n\t\t\t\t\t\t\t\t\t\t\t\tconst layerData = mipmap.data.subarray(\n\t\t\t\t\t\t\t\t\t\t\t\t\tlayerIndex * layerByteLength / mipmap.data.BYTES_PER_ELEMENT,\n\t\t\t\t\t\t\t\t\t\t\t\t\t( layerIndex + 1 ) * layerByteLength / mipmap.data.BYTES_PER_ELEMENT\n\t\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t\t\tstate.compressedTexSubImage3D( _gl.TEXTURE_2D_ARRAY, i, 0, 0, layerIndex, mipmap.width, mipmap.height, 1, glFormat, layerData );\n\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\ttexture.clearLayerUpdates();\n\n\t\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t\tstate.compressedTexSubImage3D( _gl.TEXTURE_2D_ARRAY, i, 0, 0, 0, mipmap.width, mipmap.height, image.depth, glFormat, mipmap.data );\n\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\tstate.compressedTexImage3D( _gl.TEXTURE_2D_ARRAY, i, glInternalFormat, mipmap.width, mipmap.height, image.depth, 0, mipmap.data, 0, 0 );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\twarn( 'WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()' );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\tstate.texSubImage3D( _gl.TEXTURE_2D_ARRAY, i, 0, 0, 0, mipmap.width, mipmap.height, image.depth, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage3D( _gl.TEXTURE_2D_ARRAY, i, glInternalFormat, mipmap.width, mipmap.height, image.depth, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, mipmaps[ 0 ].width, mipmaps[ 0 ].height );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\t\t\tif ( texture.format !== RGBAFormat ) {\n\n\t\t\t\t\t\t\tif ( glFormat !== null ) {\n\n\t\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\t\tstate.compressedTexSubImage2D( _gl.TEXTURE_2D, i, 0, 0, mipmap.width, mipmap.height, glFormat, mipmap.data );\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\tstate.compressedTexImage2D( _gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\twarn( 'WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()' );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_2D, i, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( texture.isDataArrayTexture ) {\n\n\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage3D( _gl.TEXTURE_2D_ARRAY, levels, glInternalFormat, image.width, image.height, image.depth );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\tif ( texture.layerUpdates.size > 0 ) {\n\n\t\t\t\t\t\t\tconst layerByteLength = getByteLength( image.width, image.height, texture.format, texture.type );\n\n\t\t\t\t\t\t\tfor ( const layerIndex of texture.layerUpdates ) {\n\n\t\t\t\t\t\t\t\tconst layerData = image.data.subarray(\n\t\t\t\t\t\t\t\t\tlayerIndex * layerByteLength / image.data.BYTES_PER_ELEMENT,\n\t\t\t\t\t\t\t\t\t( layerIndex + 1 ) * layerByteLength / image.data.BYTES_PER_ELEMENT\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tstate.texSubImage3D( _gl.TEXTURE_2D_ARRAY, 0, 0, 0, layerIndex, image.width, image.height, 1, glFormat, glType, layerData );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\ttexture.clearLayerUpdates();\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texSubImage3D( _gl.TEXTURE_2D_ARRAY, 0, 0, 0, 0, image.width, image.height, image.depth, glFormat, glType, image.data );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.texImage3D( _gl.TEXTURE_2D_ARRAY, 0, glInternalFormat, image.width, image.height, image.depth, 0, glFormat, glType, image.data );\n\n\t\t\t\t}\n\n\t\t\t} else if ( texture.isData3DTexture ) {\n\n\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage3D( _gl.TEXTURE_3D, levels, glInternalFormat, image.width, image.height, image.depth );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\tstate.texSubImage3D( _gl.TEXTURE_3D, 0, 0, 0, 0, image.width, image.height, image.depth, glFormat, glType, image.data );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.texImage3D( _gl.TEXTURE_3D, 0, glInternalFormat, image.width, image.height, image.depth, 0, glFormat, glType, image.data );\n\n\t\t\t\t}\n\n\t\t\t} else if ( texture.isFramebufferTexture ) {\n\n\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, image.width, image.height );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tlet width = image.width, height = image.height;\n\n\t\t\t\t\t\tfor ( let i = 0; i < levels; i ++ ) {\n\n\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, width, height, 0, glFormat, glType, null );\n\n\t\t\t\t\t\t\twidth >>= 1;\n\t\t\t\t\t\t\theight >>= 1;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// regular Texture (image, video, canvas)\n\n\t\t\t\t// use manually created mipmaps if available\n\t\t\t\t// if there are no manual mipmaps\n\t\t\t\t// set 0 level mipmap and then use GL to generate other mipmap levels\n\n\t\t\t\tif ( mipmaps.length > 0 ) {\n\n\t\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\t\tconst dimensions = getDimensions( mipmaps[ 0 ] );\n\n\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, dimensions.width, dimensions.height );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_2D, i, 0, 0, glFormat, glType, mipmap );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, glFormat, glType, mipmap );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.generateMipmaps = false;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\t\t\tconst dimensions = getDimensions( image );\n\n\t\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, dimensions.width, dimensions.height );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_2D, 0, 0, 0, glFormat, glType, image );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, glFormat, glType, image );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture ) ) {\n\n\t\t\t\tgenerateMipmap( textureType );\n\n\t\t\t}\n\n\t\t\tsourceProperties.__version = source.version;\n\n\t\t\tif ( texture.onUpdate ) texture.onUpdate( texture );\n\n\t\t}\n\n\t\ttextureProperties.__version = texture.version;\n\n\t}\n\n\tfunction uploadCubeTexture( textureProperties, texture, slot ) {\n\n\t\tif ( texture.image.length !== 6 ) return;\n\n\t\tconst forceUpload = initTexture( textureProperties, texture );\n\t\tconst source = texture.source;\n\n\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture, _gl.TEXTURE0 + slot );\n\n\t\tconst sourceProperties = properties.get( source );\n\n\t\tif ( source.version !== sourceProperties.__version || forceUpload === true ) {\n\n\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\n\t\t\tconst workingPrimaries = ColorManagement.getPrimaries( ColorManagement.workingColorSpace );\n\t\t\tconst texturePrimaries = texture.colorSpace === NoColorSpace ? null : ColorManagement.getPrimaries( texture.colorSpace );\n\t\t\tconst unpackConversion = texture.colorSpace === NoColorSpace || workingPrimaries === texturePrimaries ? _gl.NONE : _gl.BROWSER_DEFAULT_WEBGL;\n\n\t\t\t_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ALIGNMENT, texture.unpackAlignment );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, unpackConversion );\n\n\t\t\tconst isCompressed = ( texture.isCompressedTexture || texture.image[ 0 ].isCompressedTexture );\n\t\t\tconst isDataTexture = ( texture.image[ 0 ] && texture.image[ 0 ].isDataTexture );\n\n\t\t\tconst cubeImage = [];\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\tif ( ! isCompressed && ! isDataTexture ) {\n\n\t\t\t\t\tcubeImage[ i ] = resizeImage( texture.image[ i ], true, capabilities.maxCubemapSize );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tcubeImage[ i ] = isDataTexture ? texture.image[ i ].image : texture.image[ i ];\n\n\t\t\t\t}\n\n\t\t\t\tcubeImage[ i ] = verifyColorSpace( texture, cubeImage[ i ] );\n\n\t\t\t}\n\n\t\t\tconst image = cubeImage[ 0 ],\n\t\t\t\tglFormat = utils.convert( texture.format, texture.colorSpace ),\n\t\t\t\tglType = utils.convert( texture.type ),\n\t\t\t\tglInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.colorSpace );\n\n\t\t\tconst useTexStorage = ( texture.isVideoTexture !== true );\n\t\t\tconst allocateMemory = ( sourceProperties.__version === undefined ) || ( forceUpload === true );\n\t\t\tconst dataReady = source.dataReady;\n\t\t\tlet levels = getMipLevels( texture, image );\n\n\t\t\tsetTextureParameters( _gl.TEXTURE_CUBE_MAP, texture );\n\n\t\t\tlet mipmaps;\n\n\t\t\tif ( isCompressed ) {\n\n\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_CUBE_MAP, levels, glInternalFormat, image.width, image.height );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\tmipmaps = cubeImage[ i ].mipmaps;\n\n\t\t\t\t\tfor ( let j = 0; j < mipmaps.length; j ++ ) {\n\n\t\t\t\t\t\tconst mipmap = mipmaps[ j ];\n\n\t\t\t\t\t\tif ( texture.format !== RGBAFormat ) {\n\n\t\t\t\t\t\t\tif ( glFormat !== null ) {\n\n\t\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\t\tstate.compressedTexSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, 0, 0, mipmap.width, mipmap.height, glFormat, mipmap.data );\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\tstate.compressedTexImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\twarn( 'WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()' );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tmipmaps = texture.mipmaps;\n\n\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\t// TODO: Uniformly handle mipmap definitions\n\t\t\t\t\t// Normal textures and compressed cube textures define base level + mips with their mipmap array\n\t\t\t\t\t// Uncompressed cube textures use their mipmap array only for mips (no base level)\n\n\t\t\t\t\tif ( mipmaps.length > 0 ) levels ++;\n\n\t\t\t\t\tconst dimensions = getDimensions( cubeImage[ 0 ] );\n\n\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_CUBE_MAP, levels, glInternalFormat, dimensions.width, dimensions.height );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\tif ( isDataTexture ) {\n\n\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, 0, 0, cubeImage[ i ].width, cubeImage[ i ].height, glFormat, glType, cubeImage[ i ].data );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glInternalFormat, cubeImage[ i ].width, cubeImage[ i ].height, 0, glFormat, glType, cubeImage[ i ].data );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfor ( let j = 0; j < mipmaps.length; j ++ ) {\n\n\t\t\t\t\t\t\tconst mipmap = mipmaps[ j ];\n\t\t\t\t\t\t\tconst mipmapImage = mipmap.image[ i ].image;\n\n\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, 0, 0, mipmapImage.width, mipmapImage.height, glFormat, glType, mipmapImage.data );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, glInternalFormat, mipmapImage.width, mipmapImage.height, 0, glFormat, glType, mipmapImage.data );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, 0, 0, glFormat, glType, cubeImage[ i ] );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glInternalFormat, glFormat, glType, cubeImage[ i ] );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfor ( let j = 0; j < mipmaps.length; j ++ ) {\n\n\t\t\t\t\t\t\tconst mipmap = mipmaps[ j ];\n\n\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, 0, 0, glFormat, glType, mipmap.image[ i ] );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, glInternalFormat, glFormat, glType, mipmap.image[ i ] );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture ) ) {\n\n\t\t\t\t// We assume images for cube map have the same size.\n\t\t\t\tgenerateMipmap( _gl.TEXTURE_CUBE_MAP );\n\n\t\t\t}\n\n\t\t\tsourceProperties.__version = source.version;\n\n\t\t\tif ( texture.onUpdate ) texture.onUpdate( texture );\n\n\t\t}\n\n\t\ttextureProperties.__version = texture.version;\n\n\t}\n\n\t// Render targets\n\n\t// Setup storage for target texture and bind it to correct framebuffer\n\tfunction setupFrameBufferTexture( framebuffer, renderTarget, texture, attachment, textureTarget, level ) {\n\n\t\tconst glFormat = utils.convert( texture.format, texture.colorSpace );\n\t\tconst glType = utils.convert( texture.type );\n\t\tconst glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.colorSpace );\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\tconst textureProperties = properties.get( texture );\n\n\t\ttextureProperties.__renderTarget = renderTarget;\n\n\t\tif ( ! renderTargetProperties.__hasExternalTextures ) {\n\n\t\t\tconst width = Math.max( 1, renderTarget.width >> level );\n\t\t\tconst height = Math.max( 1, renderTarget.height >> level );\n\n\t\t\tif ( textureTarget === _gl.TEXTURE_3D || textureTarget === _gl.TEXTURE_2D_ARRAY ) {\n\n\t\t\t\tstate.texImage3D( textureTarget, level, glInternalFormat, width, height, renderTarget.depth, 0, glFormat, glType, null );\n\n\t\t\t} else {\n\n\t\t\t\tstate.texImage2D( textureTarget, level, glInternalFormat, width, height, 0, glFormat, glType, null );\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\tif ( useMultisampledRTT( renderTarget ) ) {\n\n\t\t\tmultisampledRTTExt.framebufferTexture2DMultisampleEXT( _gl.FRAMEBUFFER, attachment, textureTarget, textureProperties.__webglTexture, 0, getRenderTargetSamples( renderTarget ) );\n\n\t\t} else if ( textureTarget === _gl.TEXTURE_2D || ( textureTarget >= _gl.TEXTURE_CUBE_MAP_POSITIVE_X && textureTarget <= _gl.TEXTURE_CUBE_MAP_NEGATIVE_Z ) ) { // see #24753\n\n\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, attachment, textureTarget, textureProperties.__webglTexture, level );\n\n\t\t}\n\n\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\n\t}\n\n\t// Setup storage for internal depth/stencil buffers and bind to correct framebuffer\n\tfunction setupRenderBufferStorage( renderbuffer, renderTarget, isMultisample ) {\n\n\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, renderbuffer );\n\n\t\tif ( renderTarget.depthBuffer ) {\n\n\t\t\t// retrieve the depth attachment types\n\t\t\tconst depthTexture = renderTarget.depthTexture;\n\t\t\tconst depthType = depthTexture && depthTexture.isDepthTexture ? depthTexture.type : null;\n\t\t\tconst glInternalFormat = getInternalDepthFormat( renderTarget.stencilBuffer, depthType );\n\t\t\tconst glAttachmentType = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT;\n\n\t\t\t// set up the attachment\n\t\t\tconst samples = getRenderTargetSamples( renderTarget );\n\t\t\tconst isUseMultisampledRTT = useMultisampledRTT( renderTarget );\n\t\t\tif ( isUseMultisampledRTT ) {\n\n\t\t\t\tmultisampledRTTExt.renderbufferStorageMultisampleEXT( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t} else if ( isMultisample ) {\n\n\t\t\t\t_gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t}\n\n\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, glAttachmentType, _gl.RENDERBUFFER, renderbuffer );\n\n\t\t} else {\n\n\t\t\tconst textures = renderTarget.textures;\n\n\t\t\tfor ( let i = 0; i < textures.length; i ++ ) {\n\n\t\t\t\tconst texture = textures[ i ];\n\n\t\t\t\tconst glFormat = utils.convert( texture.format, texture.colorSpace );\n\t\t\t\tconst glType = utils.convert( texture.type );\n\t\t\t\tconst glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.colorSpace );\n\t\t\t\tconst samples = getRenderTargetSamples( renderTarget );\n\n\t\t\t\tif ( isMultisample && useMultisampledRTT( renderTarget ) === false ) {\n\n\t\t\t\t\t_gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t\t} else if ( useMultisampledRTT( renderTarget ) ) {\n\n\t\t\t\t\tmultisampledRTTExt.renderbufferStorageMultisampleEXT( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, null );\n\n\t}\n\n\t// Setup resources for a Depth Texture for a FBO (needs an extension)\n\tfunction setupDepthTexture( framebuffer, renderTarget ) {\n\n\t\tconst isCube = ( renderTarget && renderTarget.isWebGLCubeRenderTarget );\n\t\tif ( isCube ) throw new Error( 'Depth Texture with cube render targets is not supported' );\n\n\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\tif ( ! ( renderTarget.depthTexture && renderTarget.depthTexture.isDepthTexture ) ) {\n\n\t\t\tthrow new Error( 'renderTarget.depthTexture must be an instance of THREE.DepthTexture' );\n\n\t\t}\n\n\t\tconst textureProperties = properties.get( renderTarget.depthTexture );\n\t\ttextureProperties.__renderTarget = renderTarget;\n\n\t\t// upload an empty depth texture with framebuffer size\n\t\tif ( ! textureProperties.__webglTexture ||\n\t\t\t\trenderTarget.depthTexture.image.width !== renderTarget.width ||\n\t\t\t\trenderTarget.depthTexture.image.height !== renderTarget.height ) {\n\n\t\t\trenderTarget.depthTexture.image.width = renderTarget.width;\n\t\t\trenderTarget.depthTexture.image.height = renderTarget.height;\n\t\t\trenderTarget.depthTexture.needsUpdate = true;\n\n\t\t}\n\n\t\tsetTexture2D( renderTarget.depthTexture, 0 );\n\n\t\tconst webglDepthTexture = textureProperties.__webglTexture;\n\t\tconst samples = getRenderTargetSamples( renderTarget );\n\n\t\tif ( renderTarget.depthTexture.format === DepthFormat ) {\n\n\t\t\tif ( useMultisampledRTT( renderTarget ) ) {\n\n\t\t\t\tmultisampledRTTExt.framebufferTexture2DMultisampleEXT( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0, samples );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 );\n\n\t\t\t}\n\n\t\t} else if ( renderTarget.depthTexture.format === DepthStencilFormat ) {\n\n\t\t\tif ( useMultisampledRTT( renderTarget ) ) {\n\n\t\t\t\tmultisampledRTTExt.framebufferTexture2DMultisampleEXT( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0, samples );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'Unknown depthTexture format' );\n\n\t\t}\n\n\t}\n\n\t// Setup GL resources for a non-texture depth buffer\n\tfunction setupDepthRenderbuffer( renderTarget ) {\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\tconst isCube = ( renderTarget.isWebGLCubeRenderTarget === true );\n\n\t\t// if the bound depth texture has changed\n\t\tif ( renderTargetProperties.__boundDepthTexture !== renderTarget.depthTexture ) {\n\n\t\t\t// fire the dispose event to get rid of stored state associated with the previously bound depth buffer\n\t\t\tconst depthTexture = renderTarget.depthTexture;\n\t\t\tif ( renderTargetProperties.__depthDisposeCallback ) {\n\n\t\t\t\trenderTargetProperties.__depthDisposeCallback();\n\n\t\t\t}\n\n\t\t\t// set up dispose listeners to track when the currently attached buffer is implicitly unbound\n\t\t\tif ( depthTexture ) {\n\n\t\t\t\tconst disposeEvent = () => {\n\n\t\t\t\t\tdelete renderTargetProperties.__boundDepthTexture;\n\t\t\t\t\tdelete renderTargetProperties.__depthDisposeCallback;\n\t\t\t\t\tdepthTexture.removeEventListener( 'dispose', disposeEvent );\n\n\t\t\t\t};\n\n\t\t\t\tdepthTexture.addEventListener( 'dispose', disposeEvent );\n\t\t\t\trenderTargetProperties.__depthDisposeCallback = disposeEvent;\n\n\t\t\t}\n\n\t\t\trenderTargetProperties.__boundDepthTexture = depthTexture;\n\n\t\t}\n\n\t\tif ( renderTarget.depthTexture && ! renderTargetProperties.__autoAllocateDepthBuffer ) {\n\n\t\t\tif ( isCube ) throw new Error( 'target.depthTexture not supported in Cube render targets' );\n\n\t\t\tconst mipmaps = renderTarget.texture.mipmaps;\n\n\t\t\tif ( mipmaps && mipmaps.length > 0 ) {\n\n\t\t\t\tsetupDepthTexture( renderTargetProperties.__webglFramebuffer[ 0 ], renderTarget );\n\n\t\t\t} else {\n\n\t\t\t\tsetupDepthTexture( renderTargetProperties.__webglFramebuffer, renderTarget );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( isCube ) {\n\n\t\t\t\trenderTargetProperties.__webglDepthbuffer = [];\n\n\t\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer[ i ] );\n\n\t\t\t\t\tif ( renderTargetProperties.__webglDepthbuffer[ i ] === undefined ) {\n\n\t\t\t\t\t\trenderTargetProperties.__webglDepthbuffer[ i ] = _gl.createRenderbuffer();\n\t\t\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer[ i ], renderTarget, false );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// attach buffer if it's been created already\n\t\t\t\t\t\tconst glAttachmentType = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT;\n\t\t\t\t\t\tconst renderbuffer = renderTargetProperties.__webglDepthbuffer[ i ];\n\t\t\t\t\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, renderbuffer );\n\t\t\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, glAttachmentType, _gl.RENDERBUFFER, renderbuffer );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tconst mipmaps = renderTarget.texture.mipmaps;\n\n\t\t\t\tif ( mipmaps && mipmaps.length > 0 ) {\n\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer[ 0 ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );\n\n\t\t\t\t}\n\n\t\t\t\tif ( renderTargetProperties.__webglDepthbuffer === undefined ) {\n\n\t\t\t\t\trenderTargetProperties.__webglDepthbuffer = _gl.createRenderbuffer();\n\t\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer, renderTarget, false );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// attach buffer if it's been created already\n\t\t\t\t\tconst glAttachmentType = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT;\n\t\t\t\t\tconst renderbuffer = renderTargetProperties.__webglDepthbuffer;\n\t\t\t\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, renderbuffer );\n\t\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, glAttachmentType, _gl.RENDERBUFFER, renderbuffer );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\n\t}\n\n\t// rebind framebuffer with external textures\n\tfunction rebindTextures( renderTarget, colorTexture, depthTexture ) {\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\tif ( colorTexture !== undefined ) {\n\n\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, renderTarget.texture, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, 0 );\n\n\t\t}\n\n\t\tif ( depthTexture !== undefined ) {\n\n\t\t\tsetupDepthRenderbuffer( renderTarget );\n\n\t\t}\n\n\t}\n\n\t// Set up GL resources for the render target\n\tfunction setupRenderTarget( renderTarget ) {\n\n\t\tconst texture = renderTarget.texture;\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\tconst textureProperties = properties.get( texture );\n\n\t\trenderTarget.addEventListener( 'dispose', onRenderTargetDispose );\n\n\t\tconst textures = renderTarget.textures;\n\n\t\tconst isCube = ( renderTarget.isWebGLCubeRenderTarget === true );\n\t\tconst isMultipleRenderTargets = ( textures.length > 1 );\n\n\t\tif ( ! isMultipleRenderTargets ) {\n\n\t\t\tif ( textureProperties.__webglTexture === undefined ) {\n\n\t\t\t\ttextureProperties.__webglTexture = _gl.createTexture();\n\n\t\t\t}\n\n\t\t\ttextureProperties.__version = texture.version;\n\t\t\tinfo.memory.textures ++;\n\n\t\t}\n\n\t\t// Setup framebuffer\n\n\t\tif ( isCube ) {\n\n\t\t\trenderTargetProperties.__webglFramebuffer = [];\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\tif ( texture.mipmaps && texture.mipmaps.length > 0 ) {\n\n\t\t\t\t\trenderTargetProperties.__webglFramebuffer[ i ] = [];\n\n\t\t\t\t\tfor ( let level = 0; level < texture.mipmaps.length; level ++ ) {\n\n\t\t\t\t\t\trenderTargetProperties.__webglFramebuffer[ i ][ level ] = _gl.createFramebuffer();\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\trenderTargetProperties.__webglFramebuffer[ i ] = _gl.createFramebuffer();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( texture.mipmaps && texture.mipmaps.length > 0 ) {\n\n\t\t\t\trenderTargetProperties.__webglFramebuffer = [];\n\n\t\t\t\tfor ( let level = 0; level < texture.mipmaps.length; level ++ ) {\n\n\t\t\t\t\trenderTargetProperties.__webglFramebuffer[ level ] = _gl.createFramebuffer();\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\trenderTargetProperties.__webglFramebuffer = _gl.createFramebuffer();\n\n\t\t\t}\n\n\t\t\tif ( isMultipleRenderTargets ) {\n\n\t\t\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst attachmentProperties = properties.get( textures[ i ] );\n\n\t\t\t\t\tif ( attachmentProperties.__webglTexture === undefined ) {\n\n\t\t\t\t\t\tattachmentProperties.__webglTexture = _gl.createTexture();\n\n\t\t\t\t\t\tinfo.memory.textures ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( ( renderTarget.samples > 0 ) && useMultisampledRTT( renderTarget ) === false ) {\n\n\t\t\t\trenderTargetProperties.__webglMultisampledFramebuffer = _gl.createFramebuffer();\n\t\t\t\trenderTargetProperties.__webglColorRenderbuffer = [];\n\n\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );\n\n\t\t\t\tfor ( let i = 0; i < textures.length; i ++ ) {\n\n\t\t\t\t\tconst texture = textures[ i ];\n\t\t\t\t\trenderTargetProperties.__webglColorRenderbuffer[ i ] = _gl.createRenderbuffer();\n\n\t\t\t\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[ i ] );\n\n\t\t\t\t\tconst glFormat = utils.convert( texture.format, texture.colorSpace );\n\t\t\t\t\tconst glType = utils.convert( texture.type );\n\t\t\t\t\tconst glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.colorSpace, renderTarget.isXRRenderTarget === true );\n\t\t\t\t\tconst samples = getRenderTargetSamples( renderTarget );\n\t\t\t\t\t_gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[ i ] );\n\n\t\t\t\t}\n\n\t\t\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, null );\n\n\t\t\t\tif ( renderTarget.depthBuffer ) {\n\n\t\t\t\t\trenderTargetProperties.__webglDepthRenderbuffer = _gl.createRenderbuffer();\n\t\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthRenderbuffer, renderTarget, true );\n\n\t\t\t\t}\n\n\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Setup color buffer\n\n\t\tif ( isCube ) {\n\n\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture );\n\t\t\tsetTextureParameters( _gl.TEXTURE_CUBE_MAP, texture );\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\tif ( texture.mipmaps && texture.mipmaps.length > 0 ) {\n\n\t\t\t\t\tfor ( let level = 0; level < texture.mipmaps.length; level ++ ) {\n\n\t\t\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ i ][ level ], renderTarget, texture, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, level );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ i ], renderTarget, texture, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture ) ) {\n\n\t\t\t\tgenerateMipmap( _gl.TEXTURE_CUBE_MAP );\n\n\t\t\t}\n\n\t\t\tstate.unbindTexture();\n\n\t\t} else if ( isMultipleRenderTargets ) {\n\n\t\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\t\tconst attachment = textures[ i ];\n\t\t\t\tconst attachmentProperties = properties.get( attachment );\n\n\t\t\t\tlet glTextureType = _gl.TEXTURE_2D;\n\n\t\t\t\tif ( renderTarget.isWebGL3DRenderTarget || renderTarget.isWebGLArrayRenderTarget ) {\n\n\t\t\t\t\tglTextureType = renderTarget.isWebGL3DRenderTarget ? _gl.TEXTURE_3D : _gl.TEXTURE_2D_ARRAY;\n\n\t\t\t\t}\n\n\t\t\t\tstate.bindTexture( glTextureType, attachmentProperties.__webglTexture );\n\t\t\t\tsetTextureParameters( glTextureType, attachment );\n\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, attachment, _gl.COLOR_ATTACHMENT0 + i, glTextureType, 0 );\n\n\t\t\t\tif ( textureNeedsGenerateMipmaps( attachment ) ) {\n\n\t\t\t\t\tgenerateMipmap( glTextureType );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tstate.unbindTexture();\n\n\t\t} else {\n\n\t\t\tlet glTextureType = _gl.TEXTURE_2D;\n\n\t\t\tif ( renderTarget.isWebGL3DRenderTarget || renderTarget.isWebGLArrayRenderTarget ) {\n\n\t\t\t\tglTextureType = renderTarget.isWebGL3DRenderTarget ? _gl.TEXTURE_3D : _gl.TEXTURE_2D_ARRAY;\n\n\t\t\t}\n\n\t\t\tstate.bindTexture( glTextureType, textureProperties.__webglTexture );\n\t\t\tsetTextureParameters( glTextureType, texture );\n\n\t\t\tif ( texture.mipmaps && texture.mipmaps.length > 0 ) {\n\n\t\t\t\tfor ( let level = 0; level < texture.mipmaps.length; level ++ ) {\n\n\t\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ level ], renderTarget, texture, _gl.COLOR_ATTACHMENT0, glTextureType, level );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, texture, _gl.COLOR_ATTACHMENT0, glTextureType, 0 );\n\n\t\t\t}\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture ) ) {\n\n\t\t\t\tgenerateMipmap( glTextureType );\n\n\t\t\t}\n\n\t\t\tstate.unbindTexture();\n\n\t\t}\n\n\t\t// Setup depth and stencil buffers\n\n\t\tif ( renderTarget.depthBuffer ) {\n\n\t\t\tsetupDepthRenderbuffer( renderTarget );\n\n\t\t}\n\n\t}\n\n\tfunction updateRenderTargetMipmap( renderTarget ) {\n\n\t\tconst textures = renderTarget.textures;\n\n\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\tconst texture = textures[ i ];\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture ) ) {\n\n\t\t\t\tconst targetType = getTargetType( renderTarget );\n\t\t\t\tconst webglTexture = properties.get( texture ).__webglTexture;\n\n\t\t\t\tstate.bindTexture( targetType, webglTexture );\n\t\t\t\tgenerateMipmap( targetType );\n\t\t\t\tstate.unbindTexture();\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tconst invalidationArrayRead = [];\n\tconst invalidationArrayDraw = [];\n\n\tfunction updateMultisampleRenderTarget( renderTarget ) {\n\n\t\tif ( renderTarget.samples > 0 ) {\n\n\t\t\tif ( useMultisampledRTT( renderTarget ) === false ) {\n\n\t\t\t\tconst textures = renderTarget.textures;\n\t\t\t\tconst width = renderTarget.width;\n\t\t\t\tconst height = renderTarget.height;\n\t\t\t\tlet mask = _gl.COLOR_BUFFER_BIT;\n\t\t\t\tconst depthStyle = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT;\n\t\t\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\t\t\tconst isMultipleRenderTargets = ( textures.length > 1 );\n\n\t\t\t\t// If MRT we need to remove FBO attachments\n\t\t\t\tif ( isMultipleRenderTargets ) {\n\n\t\t\t\t\tfor ( let i = 0; i < textures.length; i ++ ) {\n\n\t\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );\n\t\t\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.RENDERBUFFER, null );\n\n\t\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );\n\t\t\t\t\t\t_gl.framebufferTexture2D( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.TEXTURE_2D, null, 0 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tstate.bindFramebuffer( _gl.READ_FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );\n\n\t\t\t\tconst mipmaps = renderTarget.texture.mipmaps;\n\n\t\t\t\tif ( mipmaps && mipmaps.length > 0 ) {\n\n\t\t\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, renderTargetProperties.__webglFramebuffer[ 0 ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0; i < textures.length; i ++ ) {\n\n\t\t\t\t\tif ( renderTarget.resolveDepthBuffer ) {\n\n\t\t\t\t\t\tif ( renderTarget.depthBuffer ) mask |= _gl.DEPTH_BUFFER_BIT;\n\n\t\t\t\t\t\t// resolving stencil is slow with a D3D backend. disable it for all transmission render targets (see #27799)\n\n\t\t\t\t\t\tif ( renderTarget.stencilBuffer && renderTarget.resolveStencilBuffer ) mask |= _gl.STENCIL_BUFFER_BIT;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( isMultipleRenderTargets ) {\n\n\t\t\t\t\t\t_gl.framebufferRenderbuffer( _gl.READ_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[ i ] );\n\n\t\t\t\t\t\tconst webglTexture = properties.get( textures[ i ] ).__webglTexture;\n\t\t\t\t\t\t_gl.framebufferTexture2D( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, webglTexture, 0 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_gl.blitFramebuffer( 0, 0, width, height, 0, 0, width, height, mask, _gl.NEAREST );\n\n\t\t\t\t\tif ( supportsInvalidateFramebuffer === true ) {\n\n\t\t\t\t\t\tinvalidationArrayRead.length = 0;\n\t\t\t\t\t\tinvalidationArrayDraw.length = 0;\n\n\t\t\t\t\t\tinvalidationArrayRead.push( _gl.COLOR_ATTACHMENT0 + i );\n\n\t\t\t\t\t\tif ( renderTarget.depthBuffer && renderTarget.resolveDepthBuffer === false ) {\n\n\t\t\t\t\t\t\tinvalidationArrayRead.push( depthStyle );\n\t\t\t\t\t\t\tinvalidationArrayDraw.push( depthStyle );\n\n\t\t\t\t\t\t\t_gl.invalidateFramebuffer( _gl.DRAW_FRAMEBUFFER, invalidationArrayDraw );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t_gl.invalidateFramebuffer( _gl.READ_FRAMEBUFFER, invalidationArrayRead );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tstate.bindFramebuffer( _gl.READ_FRAMEBUFFER, null );\n\t\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, null );\n\n\t\t\t\t// If MRT since pre-blit we removed the FBO we need to reconstruct the attachments\n\t\t\t\tif ( isMultipleRenderTargets ) {\n\n\t\t\t\t\tfor ( let i = 0; i < textures.length; i ++ ) {\n\n\t\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );\n\t\t\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[ i ] );\n\n\t\t\t\t\t\tconst webglTexture = properties.get( textures[ i ] ).__webglTexture;\n\n\t\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );\n\t\t\t\t\t\t_gl.framebufferTexture2D( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.TEXTURE_2D, webglTexture, 0 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );\n\n\t\t\t} else {\n\n\t\t\t\tif ( renderTarget.depthBuffer && renderTarget.resolveDepthBuffer === false && supportsInvalidateFramebuffer ) {\n\n\t\t\t\t\tconst depthStyle = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT;\n\n\t\t\t\t\t_gl.invalidateFramebuffer( _gl.DRAW_FRAMEBUFFER, [ depthStyle ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction getRenderTargetSamples( renderTarget ) {\n\n\t\treturn Math.min( capabilities.maxSamples, renderTarget.samples );\n\n\t}\n\n\tfunction useMultisampledRTT( renderTarget ) {\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\treturn renderTarget.samples > 0 && extensions.has( 'WEBGL_multisampled_render_to_texture' ) === true && renderTargetProperties.__useRenderToTexture !== false;\n\n\t}\n\n\tfunction updateVideoTexture( texture ) {\n\n\t\tconst frame = info.render.frame;\n\n\t\t// Check the last frame we updated the VideoTexture\n\n\t\tif ( _videoTextures.get( texture ) !== frame ) {\n\n\t\t\t_videoTextures.set( texture, frame );\n\t\t\ttexture.update();\n\n\t\t}\n\n\t}\n\n\tfunction verifyColorSpace( texture, image ) {\n\n\t\tconst colorSpace = texture.colorSpace;\n\t\tconst format = texture.format;\n\t\tconst type = texture.type;\n\n\t\tif ( texture.isCompressedTexture === true || texture.isVideoTexture === true ) return image;\n\n\t\tif ( colorSpace !== LinearSRGBColorSpace && colorSpace !== NoColorSpace ) {\n\n\t\t\t// sRGB\n\n\t\t\tif ( ColorManagement.getTransfer( colorSpace ) === SRGBTransfer ) {\n\n\t\t\t\t// in WebGL 2 uncompressed textures can only be sRGB encoded if they have the RGBA8 format\n\n\t\t\t\tif ( format !== RGBAFormat || type !== UnsignedByteType ) {\n\n\t\t\t\t\twarn( 'WebGLTextures: sRGB encoded textures have to use RGBAFormat and UnsignedByteType.' );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\terror( 'WebGLTextures: Unsupported texture color space:', colorSpace );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn image;\n\n\t}\n\n\tfunction getDimensions( image ) {\n\n\t\tif ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) {\n\n\t\t\t// if intrinsic data are not available, fallback to width/height\n\n\t\t\t_imageDimensions.width = image.naturalWidth || image.width;\n\t\t\t_imageDimensions.height = image.naturalHeight || image.height;\n\n\t\t} else if ( typeof VideoFrame !== 'undefined' && image instanceof VideoFrame ) {\n\n\t\t\t_imageDimensions.width = image.displayWidth;\n\t\t\t_imageDimensions.height = image.displayHeight;\n\n\t\t} else {\n\n\t\t\t_imageDimensions.width = image.width;\n\t\t\t_imageDimensions.height = image.height;\n\n\t\t}\n\n\t\treturn _imageDimensions;\n\n\t}\n\n\t//\n\n\tthis.allocateTextureUnit = allocateTextureUnit;\n\tthis.resetTextureUnits = resetTextureUnits;\n\n\tthis.setTexture2D = setTexture2D;\n\tthis.setTexture2DArray = setTexture2DArray;\n\tthis.setTexture3D = setTexture3D;\n\tthis.setTextureCube = setTextureCube;\n\tthis.rebindTextures = rebindTextures;\n\tthis.setupRenderTarget = setupRenderTarget;\n\tthis.updateRenderTargetMipmap = updateRenderTargetMipmap;\n\tthis.updateMultisampleRenderTarget = updateMultisampleRenderTarget;\n\tthis.setupDepthRenderbuffer = setupDepthRenderbuffer;\n\tthis.setupFrameBufferTexture = setupFrameBufferTexture;\n\tthis.useMultisampledRTT = useMultisampledRTT;\n\n}\n\nfunction WebGLUtils( gl, extensions ) {\n\n\tfunction convert( p, colorSpace = NoColorSpace ) {\n\n\t\tlet extension;\n\n\t\tconst transfer = ColorManagement.getTransfer( colorSpace );\n\n\t\tif ( p === UnsignedByteType ) return gl.UNSIGNED_BYTE;\n\t\tif ( p === UnsignedShort4444Type ) return gl.UNSIGNED_SHORT_4_4_4_4;\n\t\tif ( p === UnsignedShort5551Type ) return gl.UNSIGNED_SHORT_5_5_5_1;\n\t\tif ( p === UnsignedInt5999Type ) return gl.UNSIGNED_INT_5_9_9_9_REV;\n\t\tif ( p === UnsignedInt101111Type ) return gl.UNSIGNED_INT_10F_11F_11F_REV;\n\n\t\tif ( p === ByteType ) return gl.BYTE;\n\t\tif ( p === ShortType ) return gl.SHORT;\n\t\tif ( p === UnsignedShortType ) return gl.UNSIGNED_SHORT;\n\t\tif ( p === IntType ) return gl.INT;\n\t\tif ( p === UnsignedIntType ) return gl.UNSIGNED_INT;\n\t\tif ( p === FloatType ) return gl.FLOAT;\n\t\tif ( p === HalfFloatType ) return gl.HALF_FLOAT;\n\n\t\tif ( p === AlphaFormat ) return gl.ALPHA;\n\t\tif ( p === RGBFormat ) return gl.RGB;\n\t\tif ( p === RGBAFormat ) return gl.RGBA;\n\t\tif ( p === DepthFormat ) return gl.DEPTH_COMPONENT;\n\t\tif ( p === DepthStencilFormat ) return gl.DEPTH_STENCIL;\n\n\t\t// WebGL2 formats.\n\n\t\tif ( p === RedFormat ) return gl.RED;\n\t\tif ( p === RedIntegerFormat ) return gl.RED_INTEGER;\n\t\tif ( p === RGFormat ) return gl.RG;\n\t\tif ( p === RGIntegerFormat ) return gl.RG_INTEGER;\n\t\tif ( p === RGBAIntegerFormat ) return gl.RGBA_INTEGER;\n\n\t\t// S3TC\n\n\t\tif ( p === RGB_S3TC_DXT1_Format || p === RGBA_S3TC_DXT1_Format || p === RGBA_S3TC_DXT3_Format || p === RGBA_S3TC_DXT5_Format ) {\n\n\t\t\tif ( transfer === SRGBTransfer ) {\n\n\t\t\t\textension = extensions.get( 'WEBGL_compressed_texture_s3tc_srgb' );\n\n\t\t\t\tif ( extension !== null ) {\n\n\t\t\t\t\tif ( p === RGB_S3TC_DXT1_Format ) return extension.COMPRESSED_SRGB_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT1_Format ) return extension.COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT3_Format ) return extension.COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT5_Format ) return extension.COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT;\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\textension = extensions.get( 'WEBGL_compressed_texture_s3tc' );\n\n\t\t\t\tif ( extension !== null ) {\n\n\t\t\t\t\tif ( p === RGB_S3TC_DXT1_Format ) return extension.COMPRESSED_RGB_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT1_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT3_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT3_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT5_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT5_EXT;\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// PVRTC\n\n\t\tif ( p === RGB_PVRTC_4BPPV1_Format || p === RGB_PVRTC_2BPPV1_Format || p === RGBA_PVRTC_4BPPV1_Format || p === RGBA_PVRTC_2BPPV1_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_pvrtc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGB_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;\n\t\t\t\tif ( p === RGB_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;\n\t\t\t\tif ( p === RGBA_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;\n\t\t\t\tif ( p === RGBA_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// ETC\n\n\t\tif ( p === RGB_ETC1_Format || p === RGB_ETC2_Format || p === RGBA_ETC2_EAC_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_etc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGB_ETC1_Format || p === RGB_ETC2_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ETC2 : extension.COMPRESSED_RGB8_ETC2;\n\t\t\t\tif ( p === RGBA_ETC2_EAC_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC : extension.COMPRESSED_RGBA8_ETC2_EAC;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// ASTC\n\n\t\tif ( p === RGBA_ASTC_4x4_Format || p === RGBA_ASTC_5x4_Format || p === RGBA_ASTC_5x5_Format ||\n\t\t\tp === RGBA_ASTC_6x5_Format || p === RGBA_ASTC_6x6_Format || p === RGBA_ASTC_8x5_Format ||\n\t\t\tp === RGBA_ASTC_8x6_Format || p === RGBA_ASTC_8x8_Format || p === RGBA_ASTC_10x5_Format ||\n\t\t\tp === RGBA_ASTC_10x6_Format || p === RGBA_ASTC_10x8_Format || p === RGBA_ASTC_10x10_Format ||\n\t\t\tp === RGBA_ASTC_12x10_Format || p === RGBA_ASTC_12x12_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_astc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGBA_ASTC_4x4_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR : extension.COMPRESSED_RGBA_ASTC_4x4_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_5x4_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR : extension.COMPRESSED_RGBA_ASTC_5x4_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_5x5_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR : extension.COMPRESSED_RGBA_ASTC_5x5_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_6x5_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR : extension.COMPRESSED_RGBA_ASTC_6x5_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_6x6_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR : extension.COMPRESSED_RGBA_ASTC_6x6_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_8x5_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR : extension.COMPRESSED_RGBA_ASTC_8x5_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_8x6_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR : extension.COMPRESSED_RGBA_ASTC_8x6_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_8x8_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR : extension.COMPRESSED_RGBA_ASTC_8x8_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_10x5_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR : extension.COMPRESSED_RGBA_ASTC_10x5_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_10x6_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR : extension.COMPRESSED_RGBA_ASTC_10x6_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_10x8_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR : extension.COMPRESSED_RGBA_ASTC_10x8_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_10x10_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR : extension.COMPRESSED_RGBA_ASTC_10x10_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_12x10_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR : extension.COMPRESSED_RGBA_ASTC_12x10_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_12x12_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR : extension.COMPRESSED_RGBA_ASTC_12x12_KHR;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// BPTC\n\n\t\tif ( p === RGBA_BPTC_Format || p === RGB_BPTC_SIGNED_Format || p === RGB_BPTC_UNSIGNED_Format ) {\n\n\t\t\textension = extensions.get( 'EXT_texture_compression_bptc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGBA_BPTC_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT : extension.COMPRESSED_RGBA_BPTC_UNORM_EXT;\n\t\t\t\tif ( p === RGB_BPTC_SIGNED_Format ) return extension.COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT;\n\t\t\t\tif ( p === RGB_BPTC_UNSIGNED_Format ) return extension.COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// RGTC\n\n\t\tif ( p === RED_RGTC1_Format || p === SIGNED_RED_RGTC1_Format || p === RED_GREEN_RGTC2_Format || p === SIGNED_RED_GREEN_RGTC2_Format ) {\n\n\t\t\textension = extensions.get( 'EXT_texture_compression_rgtc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RED_RGTC1_Format ) return extension.COMPRESSED_RED_RGTC1_EXT;\n\t\t\t\tif ( p === SIGNED_RED_RGTC1_Format ) return extension.COMPRESSED_SIGNED_RED_RGTC1_EXT;\n\t\t\t\tif ( p === RED_GREEN_RGTC2_Format ) return extension.COMPRESSED_RED_GREEN_RGTC2_EXT;\n\t\t\t\tif ( p === SIGNED_RED_GREEN_RGTC2_Format ) return extension.COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tif ( p === UnsignedInt248Type ) return gl.UNSIGNED_INT_24_8;\n\n\t\t// if \"p\" can't be resolved, assume the user defines a WebGL constant as a string (fallback/workaround for packed RGB formats)\n\n\t\treturn ( gl[ p ] !== undefined ) ? gl[ p ] : null;\n\n\t}\n\n\treturn { convert: convert };\n\n}\n\nconst _occlusion_vertex = `\nvoid main() {\n\n\tgl_Position = vec4( position, 1.0 );\n\n}`;\n\nconst _occlusion_fragment = `\nuniform sampler2DArray depthColor;\nuniform float depthWidth;\nuniform float depthHeight;\n\nvoid main() {\n\n\tvec2 coord = vec2( gl_FragCoord.x / depthWidth, gl_FragCoord.y / depthHeight );\n\n\tif ( coord.x >= 1.0 ) {\n\n\t\tgl_FragDepth = texture( depthColor, vec3( coord.x - 1.0, coord.y, 1 ) ).r;\n\n\t} else {\n\n\t\tgl_FragDepth = texture( depthColor, vec3( coord.x, coord.y, 0 ) ).r;\n\n\t}\n\n}`;\n\n/**\n * A XR module that manages the access to the Depth Sensing API.\n */\nclass WebXRDepthSensing {\n\n\t/**\n\t * Constructs a new depth sensing module.\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * An opaque texture representing the depth of the user's environment.\n\t\t *\n\t\t * @type {?ExternalTexture}\n\t\t */\n\t\tthis.texture = null;\n\n\t\t/**\n\t\t * A plane mesh for visualizing the depth texture.\n\t\t *\n\t\t * @type {?Mesh}\n\t\t */\n\t\tthis.mesh = null;\n\n\t\t/**\n\t\t * The depth near value.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.depthNear = 0;\n\n\t\t/**\n\t\t * The depth near far.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.depthFar = 0;\n\n\t}\n\n\t/**\n\t * Inits the depth sensing module\n\t *\n\t * @param {XRWebGLDepthInformation} depthData - The XR depth data.\n\t * @param {XRRenderState} renderState - The XR render state.\n\t */\n\tinit( depthData, renderState ) {\n\n\t\tif ( this.texture === null ) {\n\n\t\t\tconst texture = new ExternalTexture( depthData.texture );\n\n\t\t\tif ( ( depthData.depthNear !== renderState.depthNear ) || ( depthData.depthFar !== renderState.depthFar ) ) {\n\n\t\t\t\tthis.depthNear = depthData.depthNear;\n\t\t\t\tthis.depthFar = depthData.depthFar;\n\n\t\t\t}\n\n\t\t\tthis.texture = texture;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns a plane mesh that visualizes the depth texture.\n\t *\n\t * @param {ArrayCamera} cameraXR - The XR camera.\n\t * @return {?Mesh} The plane mesh.\n\t */\n\tgetMesh( cameraXR ) {\n\n\t\tif ( this.texture !== null ) {\n\n\t\t\tif ( this.mesh === null ) {\n\n\t\t\t\tconst viewport = cameraXR.cameras[ 0 ].viewport;\n\t\t\t\tconst material = new ShaderMaterial( {\n\t\t\t\t\tvertexShader: _occlusion_vertex,\n\t\t\t\t\tfragmentShader: _occlusion_fragment,\n\t\t\t\t\tuniforms: {\n\t\t\t\t\t\tdepthColor: { value: this.texture },\n\t\t\t\t\t\tdepthWidth: { value: viewport.z },\n\t\t\t\t\t\tdepthHeight: { value: viewport.w }\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\tthis.mesh = new Mesh( new PlaneGeometry( 20, 20 ), material );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this.mesh;\n\n\t}\n\n\t/**\n\t * Resets the module\n\t */\n\treset() {\n\n\t\tthis.texture = null;\n\t\tthis.mesh = null;\n\n\t}\n\n\t/**\n\t * Returns a texture representing the depth of the user's environment.\n\t *\n\t * @return {?ExternalTexture} The depth texture.\n\t */\n\tgetDepthTexture() {\n\n\t\treturn this.texture;\n\n\t}\n\n}\n\n/**\n * This class represents an abstraction of the WebXR Device API and is\n * internally used by {@link WebGLRenderer}. `WebXRManager` also provides a public\n * interface that allows users to enable/disable XR and perform XR related\n * tasks like for instance retrieving controllers.\n *\n * @augments EventDispatcher\n * @hideconstructor\n */\nclass WebXRManager extends EventDispatcher {\n\n\t/**\n\t * Constructs a new WebGL renderer.\n\t *\n\t * @param {WebGLRenderer} renderer - The renderer.\n\t * @param {WebGL2RenderingContext} gl - The rendering context.\n\t */\n\tconstructor( renderer, gl ) {\n\n\t\tsuper();\n\n\t\tconst scope = this;\n\n\t\tlet session = null;\n\n\t\tlet framebufferScaleFactor = 1.0;\n\n\t\tlet referenceSpace = null;\n\t\tlet referenceSpaceType = 'local-floor';\n\t\t// Set default foveation to maximum.\n\t\tlet foveation = 1.0;\n\t\tlet customReferenceSpace = null;\n\n\t\tlet pose = null;\n\t\tlet glBinding = null;\n\t\tlet glProjLayer = null;\n\t\tlet glBaseLayer = null;\n\t\tlet xrFrame = null;\n\n\t\tconst supportsGlBinding = typeof XRWebGLBinding !== 'undefined';\n\n\t\tconst depthSensing = new WebXRDepthSensing();\n\t\tconst cameraAccessTextures = {};\n\t\tconst attributes = gl.getContextAttributes();\n\n\t\tlet initialRenderTarget = null;\n\t\tlet newRenderTarget = null;\n\n\t\tconst controllers = [];\n\t\tconst controllerInputSources = [];\n\n\t\tconst currentSize = new Vector2();\n\t\tlet currentPixelRatio = null;\n\n\t\t//\n\n\t\tconst cameraL = new PerspectiveCamera();\n\t\tcameraL.viewport = new Vector4();\n\n\t\tconst cameraR = new PerspectiveCamera();\n\t\tcameraR.viewport = new Vector4();\n\n\t\tconst cameras = [ cameraL, cameraR ];\n\n\t\tconst cameraXR = new ArrayCamera();\n\n\t\tlet _currentDepthNear = null;\n\t\tlet _currentDepthFar = null;\n\n\t\t//\n\n\t\t/**\n\t\t * Whether the manager's XR camera should be automatically updated or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.cameraAutoUpdate = true;\n\n\t\t/**\n\t\t * This flag notifies the renderer to be ready for XR rendering. Set it to `true`\n\t\t * if you are going to use XR in your app.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.enabled = false;\n\n\t\t/**\n\t\t * Whether XR presentation is active or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default false\n\t\t */\n\t\tthis.isPresenting = false;\n\n\t\t/**\n\t\t * Returns a group representing the `target ray` space of the XR controller.\n\t\t * Use this space for visualizing 3D objects that support the user in pointing\n\t\t * tasks like UI interaction.\n\t\t *\n\t\t * @param {number} index - The index of the controller.\n\t\t * @return {Group} A group representing the `target ray` space.\n\t\t */\n\t\tthis.getController = function ( index ) {\n\n\t\t\tlet controller = controllers[ index ];\n\n\t\t\tif ( controller === undefined ) {\n\n\t\t\t\tcontroller = new WebXRController();\n\t\t\t\tcontrollers[ index ] = controller;\n\n\t\t\t}\n\n\t\t\treturn controller.getTargetRaySpace();\n\n\t\t};\n\n\t\t/**\n\t\t * Returns a group representing the `grip` space of the XR controller.\n\t\t * Use this space for visualizing 3D objects that support the user in pointing\n\t\t * tasks like UI interaction.\n\t\t *\n\t\t * Note: If you want to show something in the user's hand AND offer a\n\t\t * pointing ray at the same time, you'll want to attached the handheld object\n\t\t * to the group returned by `getControllerGrip()` and the ray to the\n\t\t * group returned by `getController()`. The idea is to have two\n\t\t * different groups in two different coordinate spaces for the same WebXR\n\t\t * controller.\n\t\t *\n\t\t * @param {number} index - The index of the controller.\n\t\t * @return {Group} A group representing the `grip` space.\n\t\t */\n\t\tthis.getControllerGrip = function ( index ) {\n\n\t\t\tlet controller = controllers[ index ];\n\n\t\t\tif ( controller === undefined ) {\n\n\t\t\t\tcontroller = new WebXRController();\n\t\t\t\tcontrollers[ index ] = controller;\n\n\t\t\t}\n\n\t\t\treturn controller.getGripSpace();\n\n\t\t};\n\n\t\t/**\n\t\t * Returns a group representing the `hand` space of the XR controller.\n\t\t * Use this space for visualizing 3D objects that support the user in pointing\n\t\t * tasks like UI interaction.\n\t\t *\n\t\t * @param {number} index - The index of the controller.\n\t\t * @return {Group} A group representing the `hand` space.\n\t\t */\n\t\tthis.getHand = function ( index ) {\n\n\t\t\tlet controller = controllers[ index ];\n\n\t\t\tif ( controller === undefined ) {\n\n\t\t\t\tcontroller = new WebXRController();\n\t\t\t\tcontrollers[ index ] = controller;\n\n\t\t\t}\n\n\t\t\treturn controller.getHandSpace();\n\n\t\t};\n\n\t\t//\n\n\t\tfunction onSessionEvent( event ) {\n\n\t\t\tconst controllerIndex = controllerInputSources.indexOf( event.inputSource );\n\n\t\t\tif ( controllerIndex === -1 ) {\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tconst controller = controllers[ controllerIndex ];\n\n\t\t\tif ( controller !== undefined ) {\n\n\t\t\t\tcontroller.update( event.inputSource, event.frame, customReferenceSpace || referenceSpace );\n\t\t\t\tcontroller.dispatchEvent( { type: event.type, data: event.inputSource } );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onSessionEnd() {\n\n\t\t\tsession.removeEventListener( 'select', onSessionEvent );\n\t\t\tsession.removeEventListener( 'selectstart', onSessionEvent );\n\t\t\tsession.removeEventListener( 'selectend', onSessionEvent );\n\t\t\tsession.removeEventListener( 'squeeze', onSessionEvent );\n\t\t\tsession.removeEventListener( 'squeezestart', onSessionEvent );\n\t\t\tsession.removeEventListener( 'squeezeend', onSessionEvent );\n\t\t\tsession.removeEventListener( 'end', onSessionEnd );\n\t\t\tsession.removeEventListener( 'inputsourceschange', onInputSourcesChange );\n\n\t\t\tfor ( let i = 0; i < controllers.length; i ++ ) {\n\n\t\t\t\tconst inputSource = controllerInputSources[ i ];\n\n\t\t\t\tif ( inputSource === null ) continue;\n\n\t\t\t\tcontrollerInputSources[ i ] = null;\n\n\t\t\t\tcontrollers[ i ].disconnect( inputSource );\n\n\t\t\t}\n\n\t\t\t_currentDepthNear = null;\n\t\t\t_currentDepthFar = null;\n\n\t\t\tdepthSensing.reset();\n\t\t\tfor ( const key in cameraAccessTextures ) {\n\n\t\t\t\tdelete cameraAccessTextures[ key ];\n\n\t\t\t}\n\n\t\t\t// restore framebuffer/rendering state\n\n\t\t\trenderer.setRenderTarget( initialRenderTarget );\n\n\t\t\tglBaseLayer = null;\n\t\t\tglProjLayer = null;\n\t\t\tglBinding = null;\n\t\t\tsession = null;\n\t\t\tnewRenderTarget = null;\n\n\t\t\t//\n\n\t\t\tanimation.stop();\n\n\t\t\tscope.isPresenting = false;\n\n\t\t\trenderer.setPixelRatio( currentPixelRatio );\n\t\t\trenderer.setSize( currentSize.width, currentSize.height, false );\n\n\t\t\tscope.dispatchEvent( { type: 'sessionend' } );\n\n\t\t}\n\n\t\t/**\n\t\t * Sets the framebuffer scale factor.\n\t\t *\n\t\t * This method can not be used during a XR session.\n\t\t *\n\t\t * @param {number} value - The framebuffer scale factor.\n\t\t */\n\t\tthis.setFramebufferScaleFactor = function ( value ) {\n\n\t\t\tframebufferScaleFactor = value;\n\n\t\t\tif ( scope.isPresenting === true ) {\n\n\t\t\t\twarn( 'WebXRManager: Cannot change framebuffer scale while presenting.' );\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Sets the reference space type. Can be used to configure a spatial relationship with the user's physical\n\t\t * environment. Depending on how the user moves in 3D space, setting an appropriate reference space can\n\t\t * improve tracking. Default is `local-floor`. Valid values can be found here\n\t\t * https://developer.mozilla.org/en-US/docs/Web/API/XRReferenceSpace#reference_space_types.\n\t\t *\n\t\t * This method can not be used during a XR session.\n\t\t *\n\t\t * @param {string} value - The reference space type.\n\t\t */\n\t\tthis.setReferenceSpaceType = function ( value ) {\n\n\t\t\treferenceSpaceType = value;\n\n\t\t\tif ( scope.isPresenting === true ) {\n\n\t\t\t\twarn( 'WebXRManager: Cannot change reference space type while presenting.' );\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the XR reference space.\n\t\t *\n\t\t * @return {XRReferenceSpace} The XR reference space.\n\t\t */\n\t\tthis.getReferenceSpace = function () {\n\n\t\t\treturn customReferenceSpace || referenceSpace;\n\n\t\t};\n\n\t\t/**\n\t\t * Sets a custom XR reference space.\n\t\t *\n\t\t * @param {XRReferenceSpace} space - The XR reference space.\n\t\t */\n\t\tthis.setReferenceSpace = function ( space ) {\n\n\t\t\tcustomReferenceSpace = space;\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the current base layer.\n\t\t *\n\t\t * This is an `XRProjectionLayer` when the targeted XR device supports the\n\t\t * WebXR Layers API, or an `XRWebGLLayer` otherwise.\n\t\t *\n\t\t * @return {?(XRWebGLLayer|XRProjectionLayer)} The XR base layer.\n\t\t */\n\t\tthis.getBaseLayer = function () {\n\n\t\t\treturn glProjLayer !== null ? glProjLayer : glBaseLayer;\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the current XR binding.\n\t\t *\n\t\t * Creates a new binding if needed and the browser is\n\t\t * capable of doing so.\n\t\t *\n\t\t * @return {?XRWebGLBinding} The XR binding. Returns `null` if one cannot be created.\n\t\t */\n\t\tthis.getBinding = function () {\n\n\t\t\tif ( glBinding === null && supportsGlBinding ) {\n\n\t\t\t\tglBinding = new XRWebGLBinding( session, gl );\n\n\t\t\t}\n\n\t\t\treturn glBinding;\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the current XR frame.\n\t\t *\n\t\t * @return {?XRFrame} The XR frame. Returns `null` when used outside a XR session.\n\t\t */\n\t\tthis.getFrame = function () {\n\n\t\t\treturn xrFrame;\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the current XR session.\n\t\t *\n\t\t * @return {?XRSession} The XR session. Returns `null` when used outside a XR session.\n\t\t */\n\t\tthis.getSession = function () {\n\n\t\t\treturn session;\n\n\t\t};\n\n\t\t/**\n\t\t * After a XR session has been requested usually with one of the `*Button` modules, it\n\t\t * is injected into the renderer with this method. This method triggers the start of\n\t\t * the actual XR rendering.\n\t\t *\n\t\t * @async\n\t\t * @param {XRSession} value - The XR session to set.\n\t\t * @return {Promise} A Promise that resolves when the session has been set.\n\t\t */\n\t\tthis.setSession = async function ( value ) {\n\n\t\t\tsession = value;\n\n\t\t\tif ( session !== null ) {\n\n\t\t\t\tinitialRenderTarget = renderer.getRenderTarget();\n\n\t\t\t\tsession.addEventListener( 'select', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'selectstart', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'selectend', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'squeeze', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'squeezestart', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'squeezeend', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'end', onSessionEnd );\n\t\t\t\tsession.addEventListener( 'inputsourceschange', onInputSourcesChange );\n\n\t\t\t\tif ( attributes.xrCompatible !== true ) {\n\n\t\t\t\t\tawait gl.makeXRCompatible();\n\n\t\t\t\t}\n\n\t\t\t\tcurrentPixelRatio = renderer.getPixelRatio();\n\t\t\t\trenderer.getSize( currentSize );\n\n\n\t\t\t\t// Check that the browser implements the necessary APIs to use an\n\t\t\t\t// XRProjectionLayer rather than an XRWebGLLayer\n\t\t\t\tconst supportsLayers = supportsGlBinding && 'createProjectionLayer' in XRWebGLBinding.prototype;\n\n\t\t\t\tif ( ! supportsLayers ) {\n\n\t\t\t\t\tconst layerInit = {\n\t\t\t\t\t\tantialias: attributes.antialias,\n\t\t\t\t\t\talpha: true,\n\t\t\t\t\t\tdepth: attributes.depth,\n\t\t\t\t\t\tstencil: attributes.stencil,\n\t\t\t\t\t\tframebufferScaleFactor: framebufferScaleFactor\n\t\t\t\t\t};\n\n\t\t\t\t\tglBaseLayer = new XRWebGLLayer( session, gl, layerInit );\n\n\t\t\t\t\tsession.updateRenderState( { baseLayer: glBaseLayer } );\n\n\t\t\t\t\trenderer.setPixelRatio( 1 );\n\t\t\t\t\trenderer.setSize( glBaseLayer.framebufferWidth, glBaseLayer.framebufferHeight, false );\n\n\t\t\t\t\tnewRenderTarget = new WebGLRenderTarget(\n\t\t\t\t\t\tglBaseLayer.framebufferWidth,\n\t\t\t\t\t\tglBaseLayer.framebufferHeight,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tformat: RGBAFormat,\n\t\t\t\t\t\t\ttype: UnsignedByteType,\n\t\t\t\t\t\t\tcolorSpace: renderer.outputColorSpace,\n\t\t\t\t\t\t\tstencilBuffer: attributes.stencil,\n\t\t\t\t\t\t\tresolveDepthBuffer: ( glBaseLayer.ignoreDepthValues === false ),\n\t\t\t\t\t\t\tresolveStencilBuffer: ( glBaseLayer.ignoreDepthValues === false )\n\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\n\t\t\t\t} else {\n\n\t\t\t\t\tlet depthFormat = null;\n\t\t\t\t\tlet depthType = null;\n\t\t\t\t\tlet glDepthFormat = null;\n\n\t\t\t\t\tif ( attributes.depth ) {\n\n\t\t\t\t\t\tglDepthFormat = attributes.stencil ? gl.DEPTH24_STENCIL8 : gl.DEPTH_COMPONENT24;\n\t\t\t\t\t\tdepthFormat = attributes.stencil ? DepthStencilFormat : DepthFormat;\n\t\t\t\t\t\tdepthType = attributes.stencil ? UnsignedInt248Type : UnsignedIntType;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst projectionlayerInit = {\n\t\t\t\t\t\tcolorFormat: gl.RGBA8,\n\t\t\t\t\t\tdepthFormat: glDepthFormat,\n\t\t\t\t\t\tscaleFactor: framebufferScaleFactor\n\t\t\t\t\t};\n\n\t\t\t\t\tglBinding = this.getBinding();\n\n\t\t\t\t\tglProjLayer = glBinding.createProjectionLayer( projectionlayerInit );\n\n\t\t\t\t\tsession.updateRenderState( { layers: [ glProjLayer ] } );\n\n\t\t\t\t\trenderer.setPixelRatio( 1 );\n\t\t\t\t\trenderer.setSize( glProjLayer.textureWidth, glProjLayer.textureHeight, false );\n\n\t\t\t\t\tnewRenderTarget = new WebGLRenderTarget(\n\t\t\t\t\t\tglProjLayer.textureWidth,\n\t\t\t\t\t\tglProjLayer.textureHeight,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tformat: RGBAFormat,\n\t\t\t\t\t\t\ttype: UnsignedByteType,\n\t\t\t\t\t\t\tdepthTexture: new DepthTexture( glProjLayer.textureWidth, glProjLayer.textureHeight, depthType, undefined, undefined, undefined, undefined, undefined, undefined, depthFormat ),\n\t\t\t\t\t\t\tstencilBuffer: attributes.stencil,\n\t\t\t\t\t\t\tcolorSpace: renderer.outputColorSpace,\n\t\t\t\t\t\t\tsamples: attributes.antialias ? 4 : 0,\n\t\t\t\t\t\t\tresolveDepthBuffer: ( glProjLayer.ignoreDepthValues === false ),\n\t\t\t\t\t\t\tresolveStencilBuffer: ( glProjLayer.ignoreDepthValues === false )\n\t\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t\tnewRenderTarget.isXRRenderTarget = true; // TODO Remove this when possible, see #23278\n\n\t\t\t\tthis.setFoveation( foveation );\n\n\t\t\t\tcustomReferenceSpace = null;\n\t\t\t\treferenceSpace = await session.requestReferenceSpace( referenceSpaceType );\n\n\t\t\t\tanimation.setContext( session );\n\t\t\t\tanimation.start();\n\n\t\t\t\tscope.isPresenting = true;\n\n\t\t\t\tscope.dispatchEvent( { type: 'sessionstart' } );\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the environment blend mode from the current XR session.\n\t\t *\n\t\t * @return {'opaque'|'additive'|'alpha-blend'|undefined} The environment blend mode. Returns `undefined` when used outside of a XR session.\n\t\t */\n\t\tthis.getEnvironmentBlendMode = function () {\n\n\t\t\tif ( session !== null ) {\n\n\t\t\t\treturn session.environmentBlendMode;\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the current depth texture computed via depth sensing.\n\t\t *\n\t\t * See {@link WebXRDepthSensing#getDepthTexture}.\n\t\t *\n\t\t * @return {?Texture} The depth texture.\n\t\t */\n\t\tthis.getDepthTexture = function () {\n\n\t\t\treturn depthSensing.getDepthTexture();\n\n\t\t};\n\n\t\tfunction onInputSourcesChange( event ) {\n\n\t\t\t// Notify disconnected\n\n\t\t\tfor ( let i = 0; i < event.removed.length; i ++ ) {\n\n\t\t\t\tconst inputSource = event.removed[ i ];\n\t\t\t\tconst index = controllerInputSources.indexOf( inputSource );\n\n\t\t\t\tif ( index >= 0 ) {\n\n\t\t\t\t\tcontrollerInputSources[ index ] = null;\n\t\t\t\t\tcontrollers[ index ].disconnect( inputSource );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Notify connected\n\n\t\t\tfor ( let i = 0; i < event.added.length; i ++ ) {\n\n\t\t\t\tconst inputSource = event.added[ i ];\n\n\t\t\t\tlet controllerIndex = controllerInputSources.indexOf( inputSource );\n\n\t\t\t\tif ( controllerIndex === -1 ) {\n\n\t\t\t\t\t// Assign input source a controller that currently has no input source\n\n\t\t\t\t\tfor ( let i = 0; i < controllers.length; i ++ ) {\n\n\t\t\t\t\t\tif ( i >= controllerInputSources.length ) {\n\n\t\t\t\t\t\t\tcontrollerInputSources.push( inputSource );\n\t\t\t\t\t\t\tcontrollerIndex = i;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t} else if ( controllerInputSources[ i ] === null ) {\n\n\t\t\t\t\t\t\tcontrollerInputSources[ i ] = inputSource;\n\t\t\t\t\t\t\tcontrollerIndex = i;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// If all controllers do currently receive input we ignore new ones\n\n\t\t\t\t\tif ( controllerIndex === -1 ) break;\n\n\t\t\t\t}\n\n\t\t\t\tconst controller = controllers[ controllerIndex ];\n\n\t\t\t\tif ( controller ) {\n\n\t\t\t\t\tcontroller.connect( inputSource );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tconst cameraLPos = new Vector3();\n\t\tconst cameraRPos = new Vector3();\n\n\t\t/**\n\t\t * Assumes 2 cameras that are parallel and share an X-axis, and that\n\t\t * the cameras' projection and world matrices have already been set.\n\t\t * And that near and far planes are identical for both cameras.\n\t\t * Visualization of this technique: https://computergraphics.stackexchange.com/a/4765\n\t\t *\n\t\t * @param {ArrayCamera} camera - The camera to update.\n\t\t * @param {PerspectiveCamera} cameraL - The left camera.\n\t\t * @param {PerspectiveCamera} cameraR - The right camera.\n\t\t */\n\t\tfunction setProjectionFromUnion( camera, cameraL, cameraR ) {\n\n\t\t\tcameraLPos.setFromMatrixPosition( cameraL.matrixWorld );\n\t\t\tcameraRPos.setFromMatrixPosition( cameraR.matrixWorld );\n\n\t\t\tconst ipd = cameraLPos.distanceTo( cameraRPos );\n\n\t\t\tconst projL = cameraL.projectionMatrix.elements;\n\t\t\tconst projR = cameraR.projectionMatrix.elements;\n\n\t\t\t// VR systems will have identical far and near planes, and\n\t\t\t// most likely identical top and bottom frustum extents.\n\t\t\t// Use the left camera for these values.\n\t\t\tconst near = projL[ 14 ] / ( projL[ 10 ] - 1 );\n\t\t\tconst far = projL[ 14 ] / ( projL[ 10 ] + 1 );\n\t\t\tconst topFov = ( projL[ 9 ] + 1 ) / projL[ 5 ];\n\t\t\tconst bottomFov = ( projL[ 9 ] - 1 ) / projL[ 5 ];\n\n\t\t\tconst leftFov = ( projL[ 8 ] - 1 ) / projL[ 0 ];\n\t\t\tconst rightFov = ( projR[ 8 ] + 1 ) / projR[ 0 ];\n\t\t\tconst left = near * leftFov;\n\t\t\tconst right = near * rightFov;\n\n\t\t\t// Calculate the new camera's position offset from the\n\t\t\t// left camera. xOffset should be roughly half `ipd`.\n\t\t\tconst zOffset = ipd / ( - leftFov + rightFov );\n\t\t\tconst xOffset = zOffset * - leftFov;\n\n\t\t\t// TODO: Better way to apply this offset?\n\t\t\tcameraL.matrixWorld.decompose( camera.position, camera.quaternion, camera.scale );\n\t\t\tcamera.translateX( xOffset );\n\t\t\tcamera.translateZ( zOffset );\n\t\t\tcamera.matrixWorld.compose( camera.position, camera.quaternion, camera.scale );\n\t\t\tcamera.matrixWorldInverse.copy( camera.matrixWorld ).invert();\n\n\t\t\t// Check if the projection uses an infinite far plane.\n\t\t\tif ( projL[ 10 ] === -1 ) {\n\n\t\t\t\t// Use the projection matrix from the left eye.\n\t\t\t\t// The camera offset is sufficient to include the view volumes\n\t\t\t\t// of both eyes (assuming symmetric projections).\n\t\t\t\tcamera.projectionMatrix.copy( cameraL.projectionMatrix );\n\t\t\t\tcamera.projectionMatrixInverse.copy( cameraL.projectionMatrixInverse );\n\n\t\t\t} else {\n\n\t\t\t\t// Find the union of the frustum values of the cameras and scale\n\t\t\t\t// the values so that the near plane's position does not change in world space,\n\t\t\t\t// although must now be relative to the new union camera.\n\t\t\t\tconst near2 = near + zOffset;\n\t\t\t\tconst far2 = far + zOffset;\n\t\t\t\tconst left2 = left - xOffset;\n\t\t\t\tconst right2 = right + ( ipd - xOffset );\n\t\t\t\tconst top2 = topFov * far / far2 * near2;\n\t\t\t\tconst bottom2 = bottomFov * far / far2 * near2;\n\n\t\t\t\tcamera.projectionMatrix.makePerspective( left2, right2, top2, bottom2, near2, far2 );\n\t\t\t\tcamera.projectionMatrixInverse.copy( camera.projectionMatrix ).invert();\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction updateCamera( camera, parent ) {\n\n\t\t\tif ( parent === null ) {\n\n\t\t\t\tcamera.matrixWorld.copy( camera.matrix );\n\n\t\t\t} else {\n\n\t\t\t\tcamera.matrixWorld.multiplyMatrices( parent.matrixWorld, camera.matrix );\n\n\t\t\t}\n\n\t\t\tcamera.matrixWorldInverse.copy( camera.matrixWorld ).invert();\n\n\t\t}\n\n\t\t/**\n\t\t * Updates the state of the XR camera. Use this method on app level if you\n\t\t * set `cameraAutoUpdate` to `false`. The method requires the non-XR\n\t\t * camera of the scene as a parameter. The passed in camera's transformation\n\t\t * is automatically adjusted to the position of the XR camera when calling\n\t\t * this method.\n\t\t *\n\t\t * @param {Camera} camera - The camera.\n\t\t */\n\t\tthis.updateCamera = function ( camera ) {\n\n\t\t\tif ( session === null ) return;\n\n\t\t\tlet depthNear = camera.near;\n\t\t\tlet depthFar = camera.far;\n\n\t\t\tif ( depthSensing.texture !== null ) {\n\n\t\t\t\tif ( depthSensing.depthNear > 0 ) depthNear = depthSensing.depthNear;\n\t\t\t\tif ( depthSensing.depthFar > 0 ) depthFar = depthSensing.depthFar;\n\n\t\t\t}\n\n\t\t\tcameraXR.near = cameraR.near = cameraL.near = depthNear;\n\t\t\tcameraXR.far = cameraR.far = cameraL.far = depthFar;\n\n\t\t\tif ( _currentDepthNear !== cameraXR.near || _currentDepthFar !== cameraXR.far ) {\n\n\t\t\t\t// Note that the new renderState won't apply until the next frame. See #18320\n\n\t\t\t\tsession.updateRenderState( {\n\t\t\t\t\tdepthNear: cameraXR.near,\n\t\t\t\t\tdepthFar: cameraXR.far\n\t\t\t\t} );\n\n\t\t\t\t_currentDepthNear = cameraXR.near;\n\t\t\t\t_currentDepthFar = cameraXR.far;\n\n\t\t\t}\n\n\t\t\t// inherit camera layers and enable eye layers (1 = left, 2 = right)\n\t\t\tcameraXR.layers.mask = camera.layers.mask | 0b110;\n\t\t\tcameraL.layers.mask = cameraXR.layers.mask & 0b011;\n\t\t\tcameraR.layers.mask = cameraXR.layers.mask & 0b101;\n\n\t\t\tconst parent = camera.parent;\n\t\t\tconst cameras = cameraXR.cameras;\n\n\t\t\tupdateCamera( cameraXR, parent );\n\n\t\t\tfor ( let i = 0; i < cameras.length; i ++ ) {\n\n\t\t\t\tupdateCamera( cameras[ i ], parent );\n\n\t\t\t}\n\n\t\t\t// update projection matrix for proper view frustum culling\n\n\t\t\tif ( cameras.length === 2 ) {\n\n\t\t\t\tsetProjectionFromUnion( cameraXR, cameraL, cameraR );\n\n\t\t\t} else {\n\n\t\t\t\t// assume single camera setup (AR)\n\n\t\t\t\tcameraXR.projectionMatrix.copy( cameraL.projectionMatrix );\n\n\t\t\t}\n\n\t\t\t// update user camera and its children\n\n\t\t\tupdateUserCamera( camera, cameraXR, parent );\n\n\t\t};\n\n\t\tfunction updateUserCamera( camera, cameraXR, parent ) {\n\n\t\t\tif ( parent === null ) {\n\n\t\t\t\tcamera.matrix.copy( cameraXR.matrixWorld );\n\n\t\t\t} else {\n\n\t\t\t\tcamera.matrix.copy( parent.matrixWorld );\n\t\t\t\tcamera.matrix.invert();\n\t\t\t\tcamera.matrix.multiply( cameraXR.matrixWorld );\n\n\t\t\t}\n\n\t\t\tcamera.matrix.decompose( camera.position, camera.quaternion, camera.scale );\n\t\t\tcamera.updateMatrixWorld( true );\n\n\t\t\tcamera.projectionMatrix.copy( cameraXR.projectionMatrix );\n\t\t\tcamera.projectionMatrixInverse.copy( cameraXR.projectionMatrixInverse );\n\n\t\t\tif ( camera.isPerspectiveCamera ) {\n\n\t\t\t\tcamera.fov = RAD2DEG * 2 * Math.atan( 1 / camera.projectionMatrix.elements[ 5 ] );\n\t\t\t\tcamera.zoom = 1;\n\n\t\t\t}\n\n\t\t}\n\n\t\t/**\n\t\t * Returns an instance of {@link ArrayCamera} which represents the XR camera\n\t\t * of the active XR session. For each view it holds a separate camera object.\n\t\t *\n\t\t * The camera's `fov` is currently not used and does not reflect the fov of\n\t\t * the XR camera. If you need the fov on app level, you have to compute in\n\t\t * manually from the XR camera's projection matrices.\n\t\t *\n\t\t * @return {ArrayCamera} The XR camera.\n\t\t */\n\t\tthis.getCamera = function () {\n\n\t\t\treturn cameraXR;\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the amount of foveation used by the XR compositor for the projection layer.\n\t\t *\n\t\t * @return {number|undefined} The amount of foveation.\n\t\t */\n\t\tthis.getFoveation = function () {\n\n\t\t\tif ( glProjLayer === null && glBaseLayer === null ) {\n\n\t\t\t\treturn undefined;\n\n\t\t\t}\n\n\t\t\treturn foveation;\n\n\t\t};\n\n\t\t/**\n\t\t * Sets the foveation value.\n\t\t *\n\t\t * @param {number} value - A number in the range `[0,1]` where `0` means no foveation (full resolution)\n\t\t * and `1` means maximum foveation (the edges render at lower resolution).\n\t\t */\n\t\tthis.setFoveation = function ( value ) {\n\n\t\t\t// 0 = no foveation = full resolution\n\t\t\t// 1 = maximum foveation = the edges render at lower resolution\n\n\t\t\tfoveation = value;\n\n\t\t\tif ( glProjLayer !== null ) {\n\n\t\t\t\tglProjLayer.fixedFoveation = value;\n\n\t\t\t}\n\n\t\t\tif ( glBaseLayer !== null && glBaseLayer.fixedFoveation !== undefined ) {\n\n\t\t\t\tglBaseLayer.fixedFoveation = value;\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Returns `true` if depth sensing is supported.\n\t\t *\n\t\t * @return {boolean} Whether depth sensing is supported or not.\n\t\t */\n\t\tthis.hasDepthSensing = function () {\n\n\t\t\treturn depthSensing.texture !== null;\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the depth sensing mesh.\n\t\t *\n\t\t * See {@link WebXRDepthSensing#getMesh}.\n\t\t *\n\t\t * @return {Mesh} The depth sensing mesh.\n\t\t */\n\t\tthis.getDepthSensingMesh = function () {\n\n\t\t\treturn depthSensing.getMesh( cameraXR );\n\n\t\t};\n\n\t\t/**\n\t\t * Retrieves an opaque texture from the view-aligned {@link XRCamera}.\n\t\t * Only available during the current animation loop.\n\t\t *\n\t\t * @param {XRCamera} xrCamera - The camera to query.\n\t\t * @return {?Texture} An opaque texture representing the current raw camera frame.\n\t\t */\n\t\tthis.getCameraTexture = function ( xrCamera ) {\n\n\t\t\treturn cameraAccessTextures[ xrCamera ];\n\n\t\t};\n\n\t\t// Animation Loop\n\n\t\tlet onAnimationFrameCallback = null;\n\n\t\tfunction onAnimationFrame( time, frame ) {\n\n\t\t\tpose = frame.getViewerPose( customReferenceSpace || referenceSpace );\n\t\t\txrFrame = frame;\n\n\t\t\tif ( pose !== null ) {\n\n\t\t\t\tconst views = pose.views;\n\n\t\t\t\tif ( glBaseLayer !== null ) {\n\n\t\t\t\t\trenderer.setRenderTargetFramebuffer( newRenderTarget, glBaseLayer.framebuffer );\n\t\t\t\t\trenderer.setRenderTarget( newRenderTarget );\n\n\t\t\t\t}\n\n\t\t\t\tlet cameraXRNeedsUpdate = false;\n\n\t\t\t\t// check if it's necessary to rebuild cameraXR's camera list\n\n\t\t\t\tif ( views.length !== cameraXR.cameras.length ) {\n\n\t\t\t\t\tcameraXR.cameras.length = 0;\n\t\t\t\t\tcameraXRNeedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0; i < views.length; i ++ ) {\n\n\t\t\t\t\tconst view = views[ i ];\n\n\t\t\t\t\tlet viewport = null;\n\n\t\t\t\t\tif ( glBaseLayer !== null ) {\n\n\t\t\t\t\t\tviewport = glBaseLayer.getViewport( view );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconst glSubImage = glBinding.getViewSubImage( glProjLayer, view );\n\t\t\t\t\t\tviewport = glSubImage.viewport;\n\n\t\t\t\t\t\t// For side-by-side projection, we only produce a single texture for both eyes.\n\t\t\t\t\t\tif ( i === 0 ) {\n\n\t\t\t\t\t\t\trenderer.setRenderTargetTextures(\n\t\t\t\t\t\t\t\tnewRenderTarget,\n\t\t\t\t\t\t\t\tglSubImage.colorTexture,\n\t\t\t\t\t\t\t\tglSubImage.depthStencilTexture );\n\n\t\t\t\t\t\t\trenderer.setRenderTarget( newRenderTarget );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tlet camera = cameras[ i ];\n\n\t\t\t\t\tif ( camera === undefined ) {\n\n\t\t\t\t\t\tcamera = new PerspectiveCamera();\n\t\t\t\t\t\tcamera.layers.enable( i );\n\t\t\t\t\t\tcamera.viewport = new Vector4();\n\t\t\t\t\t\tcameras[ i ] = camera;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcamera.matrix.fromArray( view.transform.matrix );\n\t\t\t\t\tcamera.matrix.decompose( camera.position, camera.quaternion, camera.scale );\n\t\t\t\t\tcamera.projectionMatrix.fromArray( view.projectionMatrix );\n\t\t\t\t\tcamera.projectionMatrixInverse.copy( camera.projectionMatrix ).invert();\n\t\t\t\t\tcamera.viewport.set( viewport.x, viewport.y, viewport.width, viewport.height );\n\n\t\t\t\t\tif ( i === 0 ) {\n\n\t\t\t\t\t\tcameraXR.matrix.copy( camera.matrix );\n\t\t\t\t\t\tcameraXR.matrix.decompose( cameraXR.position, cameraXR.quaternion, cameraXR.scale );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( cameraXRNeedsUpdate === true ) {\n\n\t\t\t\t\t\tcameraXR.cameras.push( camera );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t//\n\n\t\t\t\tconst enabledFeatures = session.enabledFeatures;\n\t\t\t\tconst gpuDepthSensingEnabled = enabledFeatures &&\n\t\t\t\t\tenabledFeatures.includes( 'depth-sensing' ) &&\n\t\t\t\t\tsession.depthUsage == 'gpu-optimized';\n\n\t\t\t\tif ( gpuDepthSensingEnabled && supportsGlBinding ) {\n\n\t\t\t\t\tglBinding = scope.getBinding();\n\n\t\t\t\t\tconst depthData = glBinding.getDepthInformation( views[ 0 ] );\n\n\t\t\t\t\tif ( depthData && depthData.isValid && depthData.texture ) {\n\n\t\t\t\t\t\tdepthSensing.init( depthData, session.renderState );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tconst cameraAccessEnabled = enabledFeatures &&\n\t\t\t\t    enabledFeatures.includes( 'camera-access' );\n\n\t\t\t\tif ( cameraAccessEnabled && supportsGlBinding ) {\n\n\t\t\t\t\trenderer.state.unbindTexture();\n\n\t\t\t\t\tglBinding = scope.getBinding();\n\n\t\t\t\t\tfor ( let i = 0; i < views.length; i ++ ) {\n\n\t\t\t\t\t\tconst camera = views[ i ].camera;\n\n\t\t\t\t\t\tif ( camera ) {\n\n\t\t\t\t\t\t\tlet cameraTex = cameraAccessTextures[ camera ];\n\n\t\t\t\t\t\t\tif ( ! cameraTex ) {\n\n\t\t\t\t\t\t\t\tcameraTex = new ExternalTexture();\n\t\t\t\t\t\t\t\tcameraAccessTextures[ camera ] = cameraTex;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconst glTexture = glBinding.getCameraImage( camera );\n\t\t\t\t\t\t\tcameraTex.sourceTexture = glTexture;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tfor ( let i = 0; i < controllers.length; i ++ ) {\n\n\t\t\t\tconst inputSource = controllerInputSources[ i ];\n\t\t\t\tconst controller = controllers[ i ];\n\n\t\t\t\tif ( inputSource !== null && controller !== undefined ) {\n\n\t\t\t\t\tcontroller.update( inputSource, frame, customReferenceSpace || referenceSpace );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( onAnimationFrameCallback ) onAnimationFrameCallback( time, frame );\n\n\t\t\tif ( frame.detectedPlanes ) {\n\n\t\t\t\tscope.dispatchEvent( { type: 'planesdetected', data: frame } );\n\n\t\t\t}\n\n\t\t\txrFrame = null;\n\n\t\t}\n\n\t\tconst animation = new WebGLAnimation();\n\n\t\tanimation.setAnimationLoop( onAnimationFrame );\n\n\t\tthis.setAnimationLoop = function ( callback ) {\n\n\t\t\tonAnimationFrameCallback = callback;\n\n\t\t};\n\n\t\tthis.dispose = function () {};\n\n\t}\n\n}\n\nconst _e1 = /*@__PURE__*/ new Euler();\nconst _m1 = /*@__PURE__*/ new Matrix4();\n\nfunction WebGLMaterials( renderer, properties ) {\n\n\tfunction refreshTransformUniform( map, uniform ) {\n\n\t\tif ( map.matrixAutoUpdate === true ) {\n\n\t\t\tmap.updateMatrix();\n\n\t\t}\n\n\t\tuniform.value.copy( map.matrix );\n\n\t}\n\n\tfunction refreshFogUniforms( uniforms, fog ) {\n\n\t\tfog.color.getRGB( uniforms.fogColor.value, getUnlitUniformColorSpace( renderer ) );\n\n\t\tif ( fog.isFog ) {\n\n\t\t\tuniforms.fogNear.value = fog.near;\n\t\t\tuniforms.fogFar.value = fog.far;\n\n\t\t} else if ( fog.isFogExp2 ) {\n\n\t\t\tuniforms.fogDensity.value = fog.density;\n\n\t\t}\n\n\t}\n\n\tfunction refreshMaterialUniforms( uniforms, material, pixelRatio, height, transmissionRenderTarget ) {\n\n\t\tif ( material.isMeshBasicMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\n\t\t} else if ( material.isMeshLambertMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\n\t\t} else if ( material.isMeshToonMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsToon( uniforms, material );\n\n\t\t} else if ( material.isMeshPhongMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsPhong( uniforms, material );\n\n\t\t} else if ( material.isMeshStandardMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsStandard( uniforms, material );\n\n\t\t\tif ( material.isMeshPhysicalMaterial ) {\n\n\t\t\t\trefreshUniformsPhysical( uniforms, material, transmissionRenderTarget );\n\n\t\t\t}\n\n\t\t} else if ( material.isMeshMatcapMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsMatcap( uniforms, material );\n\n\t\t} else if ( material.isMeshDepthMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\n\t\t} else if ( material.isMeshDistanceMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsDistance( uniforms, material );\n\n\t\t} else if ( material.isMeshNormalMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\n\t\t} else if ( material.isLineBasicMaterial ) {\n\n\t\t\trefreshUniformsLine( uniforms, material );\n\n\t\t\tif ( material.isLineDashedMaterial ) {\n\n\t\t\t\trefreshUniformsDash( uniforms, material );\n\n\t\t\t}\n\n\t\t} else if ( material.isPointsMaterial ) {\n\n\t\t\trefreshUniformsPoints( uniforms, material, pixelRatio, height );\n\n\t\t} else if ( material.isSpriteMaterial ) {\n\n\t\t\trefreshUniformsSprites( uniforms, material );\n\n\t\t} else if ( material.isShadowMaterial ) {\n\n\t\t\tuniforms.color.value.copy( material.color );\n\t\t\tuniforms.opacity.value = material.opacity;\n\n\t\t} else if ( material.isShaderMaterial ) {\n\n\t\t\tmaterial.uniformsNeedUpdate = false; // #15581\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsCommon( uniforms, material ) {\n\n\t\tuniforms.opacity.value = material.opacity;\n\n\t\tif ( material.color ) {\n\n\t\t\tuniforms.diffuse.value.copy( material.color );\n\n\t\t}\n\n\t\tif ( material.emissive ) {\n\n\t\t\tuniforms.emissive.value.copy( material.emissive ).multiplyScalar( material.emissiveIntensity );\n\n\t\t}\n\n\t\tif ( material.map ) {\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t\trefreshTransformUniform( material.map, uniforms.mapTransform );\n\n\t\t}\n\n\t\tif ( material.alphaMap ) {\n\n\t\t\tuniforms.alphaMap.value = material.alphaMap;\n\n\t\t\trefreshTransformUniform( material.alphaMap, uniforms.alphaMapTransform );\n\n\t\t}\n\n\t\tif ( material.bumpMap ) {\n\n\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\n\t\t\trefreshTransformUniform( material.bumpMap, uniforms.bumpMapTransform );\n\n\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\n\t\t\tif ( material.side === BackSide ) {\n\n\t\t\t\tuniforms.bumpScale.value *= -1;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.normalMap ) {\n\n\t\t\tuniforms.normalMap.value = material.normalMap;\n\n\t\t\trefreshTransformUniform( material.normalMap, uniforms.normalMapTransform );\n\n\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\n\t\t\tif ( material.side === BackSide ) {\n\n\t\t\t\tuniforms.normalScale.value.negate();\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.displacementMap ) {\n\n\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\n\t\t\trefreshTransformUniform( material.displacementMap, uniforms.displacementMapTransform );\n\n\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t}\n\n\t\tif ( material.emissiveMap ) {\n\n\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t\trefreshTransformUniform( material.emissiveMap, uniforms.emissiveMapTransform );\n\n\t\t}\n\n\t\tif ( material.specularMap ) {\n\n\t\t\tuniforms.specularMap.value = material.specularMap;\n\n\t\t\trefreshTransformUniform( material.specularMap, uniforms.specularMapTransform );\n\n\t\t}\n\n\t\tif ( material.alphaTest > 0 ) {\n\n\t\t\tuniforms.alphaTest.value = material.alphaTest;\n\n\t\t}\n\n\t\tconst materialProperties = properties.get( material );\n\n\t\tconst envMap = materialProperties.envMap;\n\t\tconst envMapRotation = materialProperties.envMapRotation;\n\n\t\tif ( envMap ) {\n\n\t\t\tuniforms.envMap.value = envMap;\n\n\t\t\t_e1.copy( envMapRotation );\n\n\t\t\t// accommodate left-handed frame\n\t\t\t_e1.x *= -1; _e1.y *= -1; _e1.z *= -1;\n\n\t\t\tif ( envMap.isCubeTexture && envMap.isRenderTargetTexture === false ) {\n\n\t\t\t\t// environment maps which are not cube render targets or PMREMs follow a different convention\n\t\t\t\t_e1.y *= -1;\n\t\t\t\t_e1.z *= -1;\n\n\t\t\t}\n\n\t\t\tuniforms.envMapRotation.value.setFromMatrix4( _m1.makeRotationFromEuler( _e1 ) );\n\n\t\t\tuniforms.flipEnvMap.value = ( envMap.isCubeTexture && envMap.isRenderTargetTexture === false ) ? -1 : 1;\n\n\t\t\tuniforms.reflectivity.value = material.reflectivity;\n\t\t\tuniforms.ior.value = material.ior;\n\t\t\tuniforms.refractionRatio.value = material.refractionRatio;\n\n\t\t}\n\n\t\tif ( material.lightMap ) {\n\n\t\t\tuniforms.lightMap.value = material.lightMap;\n\t\t\tuniforms.lightMapIntensity.value = material.lightMapIntensity;\n\n\t\t\trefreshTransformUniform( material.lightMap, uniforms.lightMapTransform );\n\n\t\t}\n\n\t\tif ( material.aoMap ) {\n\n\t\t\tuniforms.aoMap.value = material.aoMap;\n\t\t\tuniforms.aoMapIntensity.value = material.aoMapIntensity;\n\n\t\t\trefreshTransformUniform( material.aoMap, uniforms.aoMapTransform );\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsLine( uniforms, material ) {\n\n\t\tuniforms.diffuse.value.copy( material.color );\n\t\tuniforms.opacity.value = material.opacity;\n\n\t\tif ( material.map ) {\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t\trefreshTransformUniform( material.map, uniforms.mapTransform );\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsDash( uniforms, material ) {\n\n\t\tuniforms.dashSize.value = material.dashSize;\n\t\tuniforms.totalSize.value = material.dashSize + material.gapSize;\n\t\tuniforms.scale.value = material.scale;\n\n\t}\n\n\tfunction refreshUniformsPoints( uniforms, material, pixelRatio, height ) {\n\n\t\tuniforms.diffuse.value.copy( material.color );\n\t\tuniforms.opacity.value = material.opacity;\n\t\tuniforms.size.value = material.size * pixelRatio;\n\t\tuniforms.scale.value = height * 0.5;\n\n\t\tif ( material.map ) {\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t\trefreshTransformUniform( material.map, uniforms.uvTransform );\n\n\t\t}\n\n\t\tif ( material.alphaMap ) {\n\n\t\t\tuniforms.alphaMap.value = material.alphaMap;\n\n\t\t\trefreshTransformUniform( material.alphaMap, uniforms.alphaMapTransform );\n\n\t\t}\n\n\t\tif ( material.alphaTest > 0 ) {\n\n\t\t\tuniforms.alphaTest.value = material.alphaTest;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsSprites( uniforms, material ) {\n\n\t\tuniforms.diffuse.value.copy( material.color );\n\t\tuniforms.opacity.value = material.opacity;\n\t\tuniforms.rotation.value = material.rotation;\n\n\t\tif ( material.map ) {\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t\trefreshTransformUniform( material.map, uniforms.mapTransform );\n\n\t\t}\n\n\t\tif ( material.alphaMap ) {\n\n\t\t\tuniforms.alphaMap.value = material.alphaMap;\n\n\t\t\trefreshTransformUniform( material.alphaMap, uniforms.alphaMapTransform );\n\n\t\t}\n\n\t\tif ( material.alphaTest > 0 ) {\n\n\t\t\tuniforms.alphaTest.value = material.alphaTest;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsPhong( uniforms, material ) {\n\n\t\tuniforms.specular.value.copy( material.specular );\n\t\tuniforms.shininess.value = Math.max( material.shininess, 1e-4 ); // to prevent pow( 0.0, 0.0 )\n\n\t}\n\n\tfunction refreshUniformsToon( uniforms, material ) {\n\n\t\tif ( material.gradientMap ) {\n\n\t\t\tuniforms.gradientMap.value = material.gradientMap;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsStandard( uniforms, material ) {\n\n\t\tuniforms.metalness.value = material.metalness;\n\n\t\tif ( material.metalnessMap ) {\n\n\t\t\tuniforms.metalnessMap.value = material.metalnessMap;\n\n\t\t\trefreshTransformUniform( material.metalnessMap, uniforms.metalnessMapTransform );\n\n\t\t}\n\n\t\tuniforms.roughness.value = material.roughness;\n\n\t\tif ( material.roughnessMap ) {\n\n\t\t\tuniforms.roughnessMap.value = material.roughnessMap;\n\n\t\t\trefreshTransformUniform( material.roughnessMap, uniforms.roughnessMapTransform );\n\n\t\t}\n\n\t\tif ( material.envMap ) {\n\n\t\t\t//uniforms.envMap.value = material.envMap; // part of uniforms common\n\n\t\t\tuniforms.envMapIntensity.value = material.envMapIntensity;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsPhysical( uniforms, material, transmissionRenderTarget ) {\n\n\t\tuniforms.ior.value = material.ior; // also part of uniforms common\n\n\t\tif ( material.sheen > 0 ) {\n\n\t\t\tuniforms.sheenColor.value.copy( material.sheenColor ).multiplyScalar( material.sheen );\n\n\t\t\tuniforms.sheenRoughness.value = material.sheenRoughness;\n\n\t\t\tif ( material.sheenColorMap ) {\n\n\t\t\t\tuniforms.sheenColorMap.value = material.sheenColorMap;\n\n\t\t\t\trefreshTransformUniform( material.sheenColorMap, uniforms.sheenColorMapTransform );\n\n\t\t\t}\n\n\t\t\tif ( material.sheenRoughnessMap ) {\n\n\t\t\t\tuniforms.sheenRoughnessMap.value = material.sheenRoughnessMap;\n\n\t\t\t\trefreshTransformUniform( material.sheenRoughnessMap, uniforms.sheenRoughnessMapTransform );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.clearcoat > 0 ) {\n\n\t\t\tuniforms.clearcoat.value = material.clearcoat;\n\t\t\tuniforms.clearcoatRoughness.value = material.clearcoatRoughness;\n\n\t\t\tif ( material.clearcoatMap ) {\n\n\t\t\t\tuniforms.clearcoatMap.value = material.clearcoatMap;\n\n\t\t\t\trefreshTransformUniform( material.clearcoatMap, uniforms.clearcoatMapTransform );\n\n\t\t\t}\n\n\t\t\tif ( material.clearcoatRoughnessMap ) {\n\n\t\t\t\tuniforms.clearcoatRoughnessMap.value = material.clearcoatRoughnessMap;\n\n\t\t\t\trefreshTransformUniform( material.clearcoatRoughnessMap, uniforms.clearcoatRoughnessMapTransform );\n\n\t\t\t}\n\n\t\t\tif ( material.clearcoatNormalMap ) {\n\n\t\t\t\tuniforms.clearcoatNormalMap.value = material.clearcoatNormalMap;\n\n\t\t\t\trefreshTransformUniform( material.clearcoatNormalMap, uniforms.clearcoatNormalMapTransform );\n\n\t\t\t\tuniforms.clearcoatNormalScale.value.copy( material.clearcoatNormalScale );\n\n\t\t\t\tif ( material.side === BackSide ) {\n\n\t\t\t\t\tuniforms.clearcoatNormalScale.value.negate();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.dispersion > 0 ) {\n\n\t\t\tuniforms.dispersion.value = material.dispersion;\n\n\t\t}\n\n\t\tif ( material.iridescence > 0 ) {\n\n\t\t\tuniforms.iridescence.value = material.iridescence;\n\t\t\tuniforms.iridescenceIOR.value = material.iridescenceIOR;\n\t\t\tuniforms.iridescenceThicknessMinimum.value = material.iridescenceThicknessRange[ 0 ];\n\t\t\tuniforms.iridescenceThicknessMaximum.value = material.iridescenceThicknessRange[ 1 ];\n\n\t\t\tif ( material.iridescenceMap ) {\n\n\t\t\t\tuniforms.iridescenceMap.value = material.iridescenceMap;\n\n\t\t\t\trefreshTransformUniform( material.iridescenceMap, uniforms.iridescenceMapTransform );\n\n\t\t\t}\n\n\t\t\tif ( material.iridescenceThicknessMap ) {\n\n\t\t\t\tuniforms.iridescenceThicknessMap.value = material.iridescenceThicknessMap;\n\n\t\t\t\trefreshTransformUniform( material.iridescenceThicknessMap, uniforms.iridescenceThicknessMapTransform );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.transmission > 0 ) {\n\n\t\t\tuniforms.transmission.value = material.transmission;\n\t\t\tuniforms.transmissionSamplerMap.value = transmissionRenderTarget.texture;\n\t\t\tuniforms.transmissionSamplerSize.value.set( transmissionRenderTarget.width, transmissionRenderTarget.height );\n\n\t\t\tif ( material.transmissionMap ) {\n\n\t\t\t\tuniforms.transmissionMap.value = material.transmissionMap;\n\n\t\t\t\trefreshTransformUniform( material.transmissionMap, uniforms.transmissionMapTransform );\n\n\t\t\t}\n\n\t\t\tuniforms.thickness.value = material.thickness;\n\n\t\t\tif ( material.thicknessMap ) {\n\n\t\t\t\tuniforms.thicknessMap.value = material.thicknessMap;\n\n\t\t\t\trefreshTransformUniform( material.thicknessMap, uniforms.thicknessMapTransform );\n\n\t\t\t}\n\n\t\t\tuniforms.attenuationDistance.value = material.attenuationDistance;\n\t\t\tuniforms.attenuationColor.value.copy( material.attenuationColor );\n\n\t\t}\n\n\t\tif ( material.anisotropy > 0 ) {\n\n\t\t\tuniforms.anisotropyVector.value.set( material.anisotropy * Math.cos( material.anisotropyRotation ), material.anisotropy * Math.sin( material.anisotropyRotation ) );\n\n\t\t\tif ( material.anisotropyMap ) {\n\n\t\t\t\tuniforms.anisotropyMap.value = material.anisotropyMap;\n\n\t\t\t\trefreshTransformUniform( material.anisotropyMap, uniforms.anisotropyMapTransform );\n\n\t\t\t}\n\n\t\t}\n\n\t\tuniforms.specularIntensity.value = material.specularIntensity;\n\t\tuniforms.specularColor.value.copy( material.specularColor );\n\n\t\tif ( material.specularColorMap ) {\n\n\t\t\tuniforms.specularColorMap.value = material.specularColorMap;\n\n\t\t\trefreshTransformUniform( material.specularColorMap, uniforms.specularColorMapTransform );\n\n\t\t}\n\n\t\tif ( material.specularIntensityMap ) {\n\n\t\t\tuniforms.specularIntensityMap.value = material.specularIntensityMap;\n\n\t\t\trefreshTransformUniform( material.specularIntensityMap, uniforms.specularIntensityMapTransform );\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsMatcap( uniforms, material ) {\n\n\t\tif ( material.matcap ) {\n\n\t\t\tuniforms.matcap.value = material.matcap;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsDistance( uniforms, material ) {\n\n\t\tconst light = properties.get( material ).light;\n\n\t\tuniforms.referencePosition.value.setFromMatrixPosition( light.matrixWorld );\n\t\tuniforms.nearDistance.value = light.shadow.camera.near;\n\t\tuniforms.farDistance.value = light.shadow.camera.far;\n\n\t}\n\n\treturn {\n\t\trefreshFogUniforms: refreshFogUniforms,\n\t\trefreshMaterialUniforms: refreshMaterialUniforms\n\t};\n\n}\n\nfunction WebGLUniformsGroups( gl, info, capabilities, state ) {\n\n\tlet buffers = {};\n\tlet updateList = {};\n\tlet allocatedBindingPoints = [];\n\n\tconst maxBindingPoints = gl.getParameter( gl.MAX_UNIFORM_BUFFER_BINDINGS ); // binding points are global whereas block indices are per shader program\n\n\tfunction bind( uniformsGroup, program ) {\n\n\t\tconst webglProgram = program.program;\n\t\tstate.uniformBlockBinding( uniformsGroup, webglProgram );\n\n\t}\n\n\tfunction update( uniformsGroup, program ) {\n\n\t\tlet buffer = buffers[ uniformsGroup.id ];\n\n\t\tif ( buffer === undefined ) {\n\n\t\t\tprepareUniformsGroup( uniformsGroup );\n\n\t\t\tbuffer = createBuffer( uniformsGroup );\n\t\t\tbuffers[ uniformsGroup.id ] = buffer;\n\n\t\t\tuniformsGroup.addEventListener( 'dispose', onUniformsGroupsDispose );\n\n\t\t}\n\n\t\t// ensure to update the binding points/block indices mapping for this program\n\n\t\tconst webglProgram = program.program;\n\t\tstate.updateUBOMapping( uniformsGroup, webglProgram );\n\n\t\t// update UBO once per frame\n\n\t\tconst frame = info.render.frame;\n\n\t\tif ( updateList[ uniformsGroup.id ] !== frame ) {\n\n\t\t\tupdateBufferData( uniformsGroup );\n\n\t\t\tupdateList[ uniformsGroup.id ] = frame;\n\n\t\t}\n\n\t}\n\n\tfunction createBuffer( uniformsGroup ) {\n\n\t\t// the setup of an UBO is independent of a particular shader program but global\n\n\t\tconst bindingPointIndex = allocateBindingPointIndex();\n\t\tuniformsGroup.__bindingPointIndex = bindingPointIndex;\n\n\t\tconst buffer = gl.createBuffer();\n\t\tconst size = uniformsGroup.__size;\n\t\tconst usage = uniformsGroup.usage;\n\n\t\tgl.bindBuffer( gl.UNIFORM_BUFFER, buffer );\n\t\tgl.bufferData( gl.UNIFORM_BUFFER, size, usage );\n\t\tgl.bindBuffer( gl.UNIFORM_BUFFER, null );\n\t\tgl.bindBufferBase( gl.UNIFORM_BUFFER, bindingPointIndex, buffer );\n\n\t\treturn buffer;\n\n\t}\n\n\tfunction allocateBindingPointIndex() {\n\n\t\tfor ( let i = 0; i < maxBindingPoints; i ++ ) {\n\n\t\t\tif ( allocatedBindingPoints.indexOf( i ) === -1 ) {\n\n\t\t\t\tallocatedBindingPoints.push( i );\n\t\t\t\treturn i;\n\n\t\t\t}\n\n\t\t}\n\n\t\terror( 'WebGLRenderer: Maximum number of simultaneously usable uniforms groups reached.' );\n\n\t\treturn 0;\n\n\t}\n\n\tfunction updateBufferData( uniformsGroup ) {\n\n\t\tconst buffer = buffers[ uniformsGroup.id ];\n\t\tconst uniforms = uniformsGroup.uniforms;\n\t\tconst cache = uniformsGroup.__cache;\n\n\t\tgl.bindBuffer( gl.UNIFORM_BUFFER, buffer );\n\n\t\tfor ( let i = 0, il = uniforms.length; i < il; i ++ ) {\n\n\t\t\tconst uniformArray = Array.isArray( uniforms[ i ] ) ? uniforms[ i ] : [ uniforms[ i ] ];\n\n\t\t\tfor ( let j = 0, jl = uniformArray.length; j < jl; j ++ ) {\n\n\t\t\t\tconst uniform = uniformArray[ j ];\n\n\t\t\t\tif ( hasUniformChanged( uniform, i, j, cache ) === true ) {\n\n\t\t\t\t\tconst offset = uniform.__offset;\n\n\t\t\t\t\tconst values = Array.isArray( uniform.value ) ? uniform.value : [ uniform.value ];\n\n\t\t\t\t\tlet arrayOffset = 0;\n\n\t\t\t\t\tfor ( let k = 0; k < values.length; k ++ ) {\n\n\t\t\t\t\t\tconst value = values[ k ];\n\n\t\t\t\t\t\tconst info = getUniformSize( value );\n\n\t\t\t\t\t\t// TODO add integer and struct support\n\t\t\t\t\t\tif ( typeof value === 'number' || typeof value === 'boolean' ) {\n\n\t\t\t\t\t\t\tuniform.__data[ 0 ] = value;\n\t\t\t\t\t\t\tgl.bufferSubData( gl.UNIFORM_BUFFER, offset + arrayOffset, uniform.__data );\n\n\t\t\t\t\t\t} else if ( value.isMatrix3 ) {\n\n\t\t\t\t\t\t\t// manually converting 3x3 to 3x4\n\n\t\t\t\t\t\t\tuniform.__data[ 0 ] = value.elements[ 0 ];\n\t\t\t\t\t\t\tuniform.__data[ 1 ] = value.elements[ 1 ];\n\t\t\t\t\t\t\tuniform.__data[ 2 ] = value.elements[ 2 ];\n\t\t\t\t\t\t\tuniform.__data[ 3 ] = 0;\n\t\t\t\t\t\t\tuniform.__data[ 4 ] = value.elements[ 3 ];\n\t\t\t\t\t\t\tuniform.__data[ 5 ] = value.elements[ 4 ];\n\t\t\t\t\t\t\tuniform.__data[ 6 ] = value.elements[ 5 ];\n\t\t\t\t\t\t\tuniform.__data[ 7 ] = 0;\n\t\t\t\t\t\t\tuniform.__data[ 8 ] = value.elements[ 6 ];\n\t\t\t\t\t\t\tuniform.__data[ 9 ] = value.elements[ 7 ];\n\t\t\t\t\t\t\tuniform.__data[ 10 ] = value.elements[ 8 ];\n\t\t\t\t\t\t\tuniform.__data[ 11 ] = 0;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tvalue.toArray( uniform.__data, arrayOffset );\n\n\t\t\t\t\t\t\tarrayOffset += info.storage / Float32Array.BYTES_PER_ELEMENT;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tgl.bufferSubData( gl.UNIFORM_BUFFER, offset, uniform.__data );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tgl.bindBuffer( gl.UNIFORM_BUFFER, null );\n\n\t}\n\n\tfunction hasUniformChanged( uniform, index, indexArray, cache ) {\n\n\t\tconst value = uniform.value;\n\t\tconst indexString = index + '_' + indexArray;\n\n\t\tif ( cache[ indexString ] === undefined ) {\n\n\t\t\t// cache entry does not exist so far\n\n\t\t\tif ( typeof value === 'number' || typeof value === 'boolean' ) {\n\n\t\t\t\tcache[ indexString ] = value;\n\n\t\t\t} else {\n\n\t\t\t\tcache[ indexString ] = value.clone();\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t} else {\n\n\t\t\tconst cachedObject = cache[ indexString ];\n\n\t\t\t// compare current value with cached entry\n\n\t\t\tif ( typeof value === 'number' || typeof value === 'boolean' ) {\n\n\t\t\t\tif ( cachedObject !== value ) {\n\n\t\t\t\t\tcache[ indexString ] = value;\n\t\t\t\t\treturn true;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( cachedObject.equals( value ) === false ) {\n\n\t\t\t\t\tcachedObject.copy( value );\n\t\t\t\t\treturn true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\tfunction prepareUniformsGroup( uniformsGroup ) {\n\n\t\t// determine total buffer size according to the STD140 layout\n\t\t// Hint: STD140 is the only supported layout in WebGL 2\n\n\t\tconst uniforms = uniformsGroup.uniforms;\n\n\t\tlet offset = 0; // global buffer offset in bytes\n\t\tconst chunkSize = 16; // size of a chunk in bytes\n\n\t\tfor ( let i = 0, l = uniforms.length; i < l; i ++ ) {\n\n\t\t\tconst uniformArray = Array.isArray( uniforms[ i ] ) ? uniforms[ i ] : [ uniforms[ i ] ];\n\n\t\t\tfor ( let j = 0, jl = uniformArray.length; j < jl; j ++ ) {\n\n\t\t\t\tconst uniform = uniformArray[ j ];\n\n\t\t\t\tconst values = Array.isArray( uniform.value ) ? uniform.value : [ uniform.value ];\n\n\t\t\t\tfor ( let k = 0, kl = values.length; k < kl; k ++ ) {\n\n\t\t\t\t\tconst value = values[ k ];\n\n\t\t\t\t\tconst info = getUniformSize( value );\n\n\t\t\t\t\tconst chunkOffset = offset % chunkSize; // offset in the current chunk\n\t\t\t\t\tconst chunkPadding = chunkOffset % info.boundary; // required padding to match boundary\n\t\t\t\t\tconst chunkStart = chunkOffset + chunkPadding; // the start position in the current chunk for the data\n\n\t\t\t\t\toffset += chunkPadding;\n\n\t\t\t\t\t// Check for chunk overflow\n\t\t\t\t\tif ( chunkStart !== 0 && ( chunkSize - chunkStart ) < info.storage ) {\n\n\t\t\t\t\t\t// Add padding and adjust offset\n\t\t\t\t\t\toffset += ( chunkSize - chunkStart );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// the following two properties will be used for partial buffer updates\n\t\t\t\t\tuniform.__data = new Float32Array( info.storage / Float32Array.BYTES_PER_ELEMENT );\n\t\t\t\t\tuniform.__offset = offset;\n\n\t\t\t\t\t// Update the global offset\n\t\t\t\t\toffset += info.storage;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// ensure correct final padding\n\n\t\tconst chunkOffset = offset % chunkSize;\n\n\t\tif ( chunkOffset > 0 ) offset += ( chunkSize - chunkOffset );\n\n\t\t//\n\n\t\tuniformsGroup.__size = offset;\n\t\tuniformsGroup.__cache = {};\n\n\t\treturn this;\n\n\t}\n\n\tfunction getUniformSize( value ) {\n\n\t\tconst info = {\n\t\t\tboundary: 0, // bytes\n\t\t\tstorage: 0 // bytes\n\t\t};\n\n\t\t// determine sizes according to STD140\n\n\t\tif ( typeof value === 'number' || typeof value === 'boolean' ) {\n\n\t\t\t// float/int/bool\n\n\t\t\tinfo.boundary = 4;\n\t\t\tinfo.storage = 4;\n\n\t\t} else if ( value.isVector2 ) {\n\n\t\t\t// vec2\n\n\t\t\tinfo.boundary = 8;\n\t\t\tinfo.storage = 8;\n\n\t\t} else if ( value.isVector3 || value.isColor ) {\n\n\t\t\t// vec3\n\n\t\t\tinfo.boundary = 16;\n\t\t\tinfo.storage = 12; // evil: vec3 must start on a 16-byte boundary but it only consumes 12 bytes\n\n\t\t} else if ( value.isVector4 ) {\n\n\t\t\t// vec4\n\n\t\t\tinfo.boundary = 16;\n\t\t\tinfo.storage = 16;\n\n\t\t} else if ( value.isMatrix3 ) {\n\n\t\t\t// mat3 (in STD140 a 3x3 matrix is represented as 3x4)\n\n\t\t\tinfo.boundary = 48;\n\t\t\tinfo.storage = 48;\n\n\t\t} else if ( value.isMatrix4 ) {\n\n\t\t\t// mat4\n\n\t\t\tinfo.boundary = 64;\n\t\t\tinfo.storage = 64;\n\n\t\t} else if ( value.isTexture ) {\n\n\t\t\twarn( 'WebGLRenderer: Texture samplers can not be part of an uniforms group.' );\n\n\t\t} else {\n\n\t\t\twarn( 'WebGLRenderer: Unsupported uniform value type.', value );\n\n\t\t}\n\n\t\treturn info;\n\n\t}\n\n\tfunction onUniformsGroupsDispose( event ) {\n\n\t\tconst uniformsGroup = event.target;\n\n\t\tuniformsGroup.removeEventListener( 'dispose', onUniformsGroupsDispose );\n\n\t\tconst index = allocatedBindingPoints.indexOf( uniformsGroup.__bindingPointIndex );\n\t\tallocatedBindingPoints.splice( index, 1 );\n\n\t\tgl.deleteBuffer( buffers[ uniformsGroup.id ] );\n\n\t\tdelete buffers[ uniformsGroup.id ];\n\t\tdelete updateList[ uniformsGroup.id ];\n\n\t}\n\n\tfunction dispose() {\n\n\t\tfor ( const id in buffers ) {\n\n\t\t\tgl.deleteBuffer( buffers[ id ] );\n\n\t\t}\n\n\t\tallocatedBindingPoints = [];\n\t\tbuffers = {};\n\t\tupdateList = {};\n\n\t}\n\n\treturn {\n\n\t\tbind: bind,\n\t\tupdate: update,\n\n\t\tdispose: dispose\n\n\t};\n\n}\n\n/**\n * Precomputed DFG LUT for Image-Based Lighting\n * Resolution: 32x32\n * Samples: 4096 per texel\n * Format: RG16F (2 half floats per texel: scale, bias)\n */\n\n\nconst DATA = new Uint16Array( [\n\t0x2cd9, 0x3b64, 0x2d0e, 0x3b43, 0x2e20, 0x3aa7, 0x3061, 0x39fb, 0x325e, 0x397c, 0x3454, 0x3908, 0x357d, 0x3893, 0x3698, 0x381e, 0x379d, 0x375b, 0x3845, 0x3689, 0x38af, 0x35ca, 0x390d, 0x351e, 0x395f, 0x3484, 0x39a8, 0x33f9, 0x39e6, 0x330a, 0x3a1c, 0x3239, 0x3a4b, 0x3183, 0x3a73, 0x30e5, 0x3a95, 0x305b, 0x3ab1, 0x2fc6, 0x3ac9, 0x2ef7, 0x3ade, 0x2e43, 0x3aee, 0x2da7, 0x3afc, 0x2d1f, 0x3b07, 0x2ca9, 0x3b10, 0x2c42, 0x3b17, 0x2bd1, 0x3b1c, 0x2b34, 0x3b1f, 0x2aaa, 0x3b22, 0x2a31, 0x3b23, 0x29c7, 0x3b23, 0x2968,\n\t0x32d4, 0x3a4b, 0x32dc, 0x3a45, 0x3308, 0x3a26, 0x3378, 0x39d0, 0x3425, 0x394a, 0x34c9, 0x38be, 0x359c, 0x383e, 0x3688, 0x3796, 0x3778, 0x36c4, 0x382f, 0x3603, 0x3898, 0x3553, 0x38f7, 0x34b3, 0x394b, 0x3424, 0x3994, 0x334c, 0x39d3, 0x326c, 0x3a08, 0x31a9, 0x3a35, 0x30fe, 0x3a5a, 0x306a, 0x3a78, 0x2fd1, 0x3a90, 0x2ef1, 0x3aa2, 0x2e2e, 0x3ab0, 0x2d86, 0x3aba, 0x2cf3, 0x3ac1, 0x2c74, 0x3ac4, 0x2c05, 0x3ac4, 0x2b49, 0x3ac2, 0x2aa1, 0x3abd, 0x2a0c, 0x3ab7, 0x298b, 0x3aaf, 0x2918, 0x3aa6, 0x28b3, 0x3a9b, 0x285a,\n\t0x3559, 0x3954, 0x355a, 0x3951, 0x3566, 0x3944, 0x3582, 0x391e, 0x35b6, 0x38d3, 0x360a, 0x386a, 0x3684, 0x37ed, 0x3720, 0x370d, 0x37d3, 0x3641, 0x3847, 0x3588, 0x38a3, 0x34e2, 0x38fa, 0x344d, 0x3948, 0x3391, 0x398d, 0x32a6, 0x39c8, 0x31d6, 0x39fa, 0x3121, 0x3a22, 0x3082, 0x3a43, 0x2ff0, 0x3a5c, 0x2f01, 0x3a6f, 0x2e32, 0x3a7c, 0x2d7e, 0x3a84, 0x2ce2, 0x3a87, 0x2c5b, 0x3a87, 0x2bcc, 0x3a83, 0x2b00, 0x3a7b, 0x2a4e, 0x3a71, 0x29b3, 0x3a66, 0x292c, 0x3a58, 0x28b4, 0x3a4b, 0x284b, 0x3a3d, 0x27dc, 0x3a2e, 0x2739,\n\t0x3709, 0x387c, 0x370a, 0x387b, 0x3710, 0x3874, 0x3720, 0x385f, 0x373d, 0x3834, 0x376a, 0x37e1, 0x37ac, 0x3732, 0x3805, 0x3675, 0x383f, 0x35bc, 0x3883, 0x3511, 0x38cb, 0x3476, 0x3912, 0x33d8, 0x3955, 0x32e2, 0x3991, 0x3208, 0x39c6, 0x3149, 0x39f1, 0x30a1, 0x3a15, 0x300f, 0x3a30, 0x2f21, 0x3a44, 0x2e45, 0x3a51, 0x2d87, 0x3a59, 0x2ce2, 0x3a5b, 0x2c53, 0x3a58, 0x2bb0, 0x3a52, 0x2ada, 0x3a49, 0x2a1f, 0x3a40, 0x297d, 0x3a34, 0x28f0, 0x3a25, 0x2874, 0x3a13, 0x2807, 0x3a00, 0x274e, 0x39eb, 0x26a6, 0x39d5, 0x2611,\n\t0x3840, 0x3780, 0x3840, 0x377e, 0x3842, 0x3776, 0x3846, 0x375e, 0x384f, 0x372a, 0x385b, 0x36d3, 0x386c, 0x3659, 0x3885, 0x35c7, 0x38a8, 0x352d, 0x38d4, 0x3497, 0x3906, 0x340c, 0x393b, 0x331a, 0x3970, 0x323a, 0x39a0, 0x3172, 0x39cb, 0x30c3, 0x39ef, 0x302a, 0x3a0c, 0x2f4a, 0x3a21, 0x2e63, 0x3a2f, 0x2d9b, 0x3a37, 0x2ced, 0x3a39, 0x2c57, 0x3a37, 0x2baa, 0x3a34, 0x2ac9, 0x3a2c, 0x2a05, 0x3a20, 0x295d, 0x3a11, 0x28ca, 0x39ff, 0x2849, 0x39eb, 0x27b2, 0x39d5, 0x26ed, 0x39be, 0x2640, 0x39a5, 0x25aa, 0x398b, 0x2523,\n\t0x38e2, 0x363b, 0x38e2, 0x363b, 0x38e3, 0x3635, 0x38e6, 0x3626, 0x38ea, 0x3606, 0x38f0, 0x35cd, 0x38f8, 0x3579, 0x3903, 0x350e, 0x3915, 0x3495, 0x392d, 0x3418, 0x394c, 0x3340, 0x3970, 0x3261, 0x3995, 0x3197, 0x39b8, 0x30e4, 0x39d8, 0x3046, 0x39f3, 0x2f76, 0x3a08, 0x2e86, 0x3a16, 0x2db5, 0x3a1e, 0x2cff, 0x3a22, 0x2c61, 0x3a24, 0x2bb3, 0x3a20, 0x2ac7, 0x3a17, 0x29fc, 0x3a0a, 0x294c, 0x39fa, 0x28b2, 0x39e7, 0x282e, 0x39d1, 0x2773, 0x39b9, 0x26a9, 0x399f, 0x25fa, 0x3985, 0x255f, 0x3968, 0x24d6, 0x394a, 0x245d,\n\t0x396e, 0x3524, 0x396e, 0x3524, 0x396e, 0x3520, 0x396f, 0x3517, 0x3971, 0x3502, 0x3973, 0x34dd, 0x3975, 0x34a5, 0x3978, 0x3458, 0x397e, 0x33f9, 0x3987, 0x3332, 0x3997, 0x326b, 0x39aa, 0x31ac, 0x39c0, 0x30fb, 0x39d7, 0x305c, 0x39eb, 0x2f9e, 0x39fc, 0x2ea7, 0x3a07, 0x2dcf, 0x3a0f, 0x2d13, 0x3a16, 0x2c70, 0x3a17, 0x2bc4, 0x3a14, 0x2ad0, 0x3a0a, 0x29fc, 0x39fd, 0x2945, 0x39ed, 0x28a6, 0x39d9, 0x281d, 0x39c2, 0x274a, 0x39a9, 0x267c, 0x398e, 0x25c7, 0x3971, 0x2528, 0x3952, 0x249e, 0x3931, 0x2425, 0x3910, 0x2374,\n\t0x39e5, 0x3436, 0x39e5, 0x3435, 0x39e5, 0x3434, 0x39e5, 0x342e, 0x39e5, 0x3420, 0x39e5, 0x3408, 0x39e3, 0x33c4, 0x39e1, 0x3359, 0x39df, 0x32d3, 0x39de, 0x323a, 0x39e1, 0x319a, 0x39e7, 0x30fb, 0x39f0, 0x3065, 0x39f9, 0x2fb6, 0x3a02, 0x2ec0, 0x3a08, 0x2de6, 0x3a0d, 0x2d26, 0x3a12, 0x2c7e, 0x3a13, 0x2bda, 0x3a0e, 0x2adc, 0x3a05, 0x2a02, 0x39f8, 0x2945, 0x39e7, 0x28a1, 0x39d3, 0x2813, 0x39bc, 0x2730, 0x39a2, 0x265c, 0x3985, 0x25a3, 0x3966, 0x2501, 0x3945, 0x2475, 0x3923, 0x23f3, 0x3901, 0x231c, 0x38dd, 0x225e,\n\t0x3a4b, 0x32d6, 0x3a4a, 0x32d6, 0x3a4a, 0x32d4, 0x3a4a, 0x32cc, 0x3a48, 0x32bb, 0x3a47, 0x329d, 0x3a43, 0x326b, 0x3a3d, 0x3222, 0x3a36, 0x31c2, 0x3a2e, 0x314f, 0x3a28, 0x30d2, 0x3a23, 0x3052, 0x3a20, 0x2fab, 0x3a1e, 0x2ec2, 0x3a1b, 0x2def, 0x3a19, 0x2d31, 0x3a1a, 0x2c89, 0x3a18, 0x2beb, 0x3a11, 0x2aea, 0x3a07, 0x2a0a, 0x39fa, 0x2948, 0x39e9, 0x28a1, 0x39d4, 0x280f, 0x39bd, 0x2721, 0x39a2, 0x2647, 0x3985, 0x258b, 0x3964, 0x24e5, 0x3942, 0x2455, 0x391f, 0x23b3, 0x38fb, 0x22d8, 0x38d4, 0x2219, 0x38ad, 0x2172,\n\t0x3aa0, 0x3180, 0x3aa0, 0x3180, 0x3aa0, 0x317f, 0x3a9f, 0x317b, 0x3a9d, 0x3170, 0x3a99, 0x315d, 0x3a95, 0x313d, 0x3a8d, 0x310c, 0x3a82, 0x30ca, 0x3a76, 0x3077, 0x3a69, 0x3019, 0x3a5c, 0x2f68, 0x3a4f, 0x2e9e, 0x3a42, 0x2dde, 0x3a37, 0x2d2b, 0x3a30, 0x2c89, 0x3a29, 0x2bef, 0x3a1f, 0x2af0, 0x3a12, 0x2a0f, 0x3a03, 0x294a, 0x39f1, 0x28a0, 0x39dc, 0x280c, 0x39c5, 0x2717, 0x39a9, 0x2638, 0x398b, 0x2578, 0x396a, 0x24d0, 0x3947, 0x243f, 0x3923, 0x2380, 0x38fc, 0x22a4, 0x38d4, 0x21e4, 0x38ac, 0x213c, 0x3883, 0x20a8,\n\t0x3ae8, 0x3062, 0x3ae8, 0x3062, 0x3ae7, 0x3061, 0x3ae6, 0x305f, 0x3ae4, 0x305a, 0x3ae0, 0x304f, 0x3ada, 0x303b, 0x3ad1, 0x301b, 0x3ac5, 0x2fdd, 0x3ab6, 0x2f6a, 0x3aa4, 0x2ede, 0x3a91, 0x2e45, 0x3a7c, 0x2da5, 0x3a67, 0x2d0a, 0x3a57, 0x2c77, 0x3a48, 0x2bdc, 0x3a38, 0x2ae5, 0x3a27, 0x2a0a, 0x3a16, 0x2947, 0x3a02, 0x289d, 0x39eb, 0x2808, 0x39d3, 0x270d, 0x39b6, 0x262b, 0x3997, 0x256a, 0x3976, 0x24bf, 0x3952, 0x242b, 0x392d, 0x2358, 0x3904, 0x227a, 0x38db, 0x21b8, 0x38b2, 0x2110, 0x3887, 0x207d, 0x385b, 0x1ff6,\n\t0x3b23, 0x2ee8, 0x3b23, 0x2ee8, 0x3b22, 0x2ee8, 0x3b21, 0x2ee7, 0x3b1f, 0x2ee3, 0x3b1a, 0x2ed6, 0x3b14, 0x2ec1, 0x3b0b, 0x2e99, 0x3afe, 0x2e60, 0x3aee, 0x2e12, 0x3ad8, 0x2dad, 0x3ac1, 0x2d3d, 0x3aa5, 0x2cc3, 0x3a8b, 0x2c48, 0x3a76, 0x2ba2, 0x3a60, 0x2ac0, 0x3a49, 0x29f2, 0x3a32, 0x2938, 0x3a1b, 0x2893, 0x3a02, 0x27ff, 0x39e8, 0x26ff, 0x39ca, 0x261e, 0x39aa, 0x255b, 0x3988, 0x24b0, 0x3964, 0x241c, 0x393d, 0x2336, 0x3913, 0x2257, 0x38e9, 0x2195, 0x38be, 0x20eb, 0x3891, 0x2059, 0x3864, 0x1fae, 0x3837, 0x1ecd,\n\t0x3b54, 0x2d61, 0x3b54, 0x2d61, 0x3b53, 0x2d61, 0x3b52, 0x2d62, 0x3b4f, 0x2d61, 0x3b4b, 0x2d5c, 0x3b45, 0x2d51, 0x3b3b, 0x2d3d, 0x3b2e, 0x2d1a, 0x3b1d, 0x2ce7, 0x3b06, 0x2ca3, 0x3aeb, 0x2c52, 0x3acb, 0x2bee, 0x3ab0, 0x2b31, 0x3a94, 0x2a74, 0x3a77, 0x29bf, 0x3a5a, 0x2915, 0x3a3f, 0x287a, 0x3a22, 0x27de, 0x3a05, 0x26e4, 0x39e5, 0x2609, 0x39c3, 0x2547, 0x39a0, 0x249f, 0x397b, 0x240c, 0x3953, 0x2314, 0x3928, 0x2238, 0x38fd, 0x2175, 0x38d0, 0x20cb, 0x38a2, 0x2038, 0x3873, 0x1f71, 0x3844, 0x1e90, 0x3815, 0x1dce,\n\t0x3b7c, 0x2c22, 0x3b7c, 0x2c22, 0x3b7b, 0x2c23, 0x3b7a, 0x2c25, 0x3b77, 0x2c27, 0x3b73, 0x2c26, 0x3b6d, 0x2c23, 0x3b64, 0x2c1a, 0x3b57, 0x2c07, 0x3b46, 0x2bd1, 0x3b2e, 0x2b79, 0x3b0f, 0x2b07, 0x3aef, 0x2a86, 0x3ad1, 0x29f8, 0x3ab0, 0x2967, 0x3a8e, 0x28d7, 0x3a6d, 0x284e, 0x3a4c, 0x279f, 0x3a2b, 0x26b7, 0x3a08, 0x25e5, 0x39e4, 0x252c, 0x39be, 0x2488, 0x3998, 0x23f0, 0x396f, 0x22f2, 0x3943, 0x2215, 0x3917, 0x2155, 0x38e8, 0x20ae, 0x38b9, 0x201c, 0x3888, 0x1f38, 0x3857, 0x1e5a, 0x3826, 0x1d9a, 0x37eb, 0x1cf0,\n\t0x3b9c, 0x2a43, 0x3b9c, 0x2a43, 0x3b9b, 0x2a46, 0x3b9a, 0x2a4a, 0x3b98, 0x2a50, 0x3b93, 0x2a54, 0x3b8e, 0x2a59, 0x3b85, 0x2a56, 0x3b79, 0x2a45, 0x3b67, 0x2a24, 0x3b4f, 0x29ee, 0x3b2f, 0x29a4, 0x3b10, 0x294b, 0x3aef, 0x28e5, 0x3ac9, 0x2877, 0x3aa4, 0x2809, 0x3a7e, 0x2739, 0x3a59, 0x266d, 0x3a34, 0x25af, 0x3a0c, 0x2503, 0x39e4, 0x2468, 0x39bb, 0x23bb, 0x3990, 0x22c6, 0x3963, 0x21f0, 0x3936, 0x2133, 0x3906, 0x208f, 0x38d5, 0x1ffd, 0x38a3, 0x1f04, 0x3870, 0x1e28, 0x383d, 0x1d69, 0x380b, 0x1cc3, 0x37b0, 0x1c32,\n\t0x3bb5, 0x28aa, 0x3bb5, 0x28ab, 0x3bb5, 0x28ad, 0x3bb4, 0x28b2, 0x3bb2, 0x28b9, 0x3bae, 0x28c2, 0x3ba8, 0x28ca, 0x3ba0, 0x28d1, 0x3b94, 0x28cd, 0x3b83, 0x28c1, 0x3b6a, 0x28a3, 0x3b4b, 0x2876, 0x3b2d, 0x283d, 0x3b09, 0x27ea, 0x3ae1, 0x274b, 0x3ab9, 0x26a6, 0x3a8f, 0x25fe, 0x3a67, 0x255d, 0x3a3d, 0x24c5, 0x3a11, 0x2439, 0x39e6, 0x2371, 0x39b9, 0x228d, 0x398a, 0x21c1, 0x395a, 0x210b, 0x3929, 0x206c, 0x38f7, 0x1fc1, 0x38c3, 0x1ecb, 0x388f, 0x1df6, 0x385a, 0x1d3a, 0x3825, 0x1c99, 0x37e1, 0x1c08, 0x3779, 0x1b1b,\n\t0x3bc9, 0x26d3, 0x3bc9, 0x26d4, 0x3bc9, 0x26d9, 0x3bc8, 0x26e3, 0x3bc6, 0x26ef, 0x3bc2, 0x2705, 0x3bbd, 0x271a, 0x3bb6, 0x2731, 0x3baa, 0x273c, 0x3b9a, 0x273d, 0x3b81, 0x2726, 0x3b65, 0x26f7, 0x3b46, 0x26af, 0x3b20, 0x2650, 0x3af7, 0x25e1, 0x3acd, 0x256a, 0x3aa1, 0x24eb, 0x3a75, 0x246f, 0x3a46, 0x23ee, 0x3a17, 0x230d, 0x39e9, 0x223e, 0x39b7, 0x2183, 0x3985, 0x20d8, 0x3953, 0x2043, 0x391e, 0x1f7a, 0x38e9, 0x1e8d, 0x38b3, 0x1dbf, 0x387c, 0x1d0b, 0x3845, 0x1c6c, 0x380e, 0x1bc4, 0x37b0, 0x1ad2, 0x3745, 0x19fd,\n\t0x3bd9, 0x24e4, 0x3bd9, 0x24e5, 0x3bd9, 0x24e8, 0x3bd8, 0x24f2, 0x3bd5, 0x24fe, 0x3bd2, 0x2512, 0x3bce, 0x252b, 0x3bc6, 0x2544, 0x3bbc, 0x255a, 0x3bac, 0x256b, 0x3b93, 0x2569, 0x3b7a, 0x2557, 0x3b5b, 0x252f, 0x3b34, 0x24f7, 0x3b0c, 0x24ad, 0x3adf, 0x2458, 0x3ab1, 0x23f8, 0x3a82, 0x233f, 0x3a4f, 0x2286, 0x3a1e, 0x21d5, 0x39eb, 0x2130, 0x39b6, 0x2098, 0x3982, 0x200e, 0x394b, 0x1f25, 0x3914, 0x1e45, 0x38dc, 0x1d83, 0x38a3, 0x1cd6, 0x386b, 0x1c3d, 0x3831, 0x1b71, 0x37f2, 0x1a87, 0x3782, 0x19bc, 0x3714, 0x1909,\n\t0x3be5, 0x22d8, 0x3be5, 0x22d9, 0x3be4, 0x22df, 0x3be4, 0x22ef, 0x3be1, 0x2305, 0x3bde, 0x232a, 0x3bda, 0x2358, 0x3bd4, 0x2392, 0x3bcb, 0x23ca, 0x3bbb, 0x23f4, 0x3ba3, 0x2405, 0x3b8c, 0x2405, 0x3b6c, 0x23ec, 0x3b47, 0x23ae, 0x3b1d, 0x2353, 0x3af0, 0x22e2, 0x3ac0, 0x2261, 0x3a8e, 0x21d9, 0x3a5a, 0x214e, 0x3a26, 0x20c7, 0x39ee, 0x2045, 0x39b7, 0x1f97, 0x397f, 0x1eba, 0x3945, 0x1df0, 0x390b, 0x1d3a, 0x38d0, 0x1c9a, 0x3895, 0x1c0a, 0x385a, 0x1b18, 0x381f, 0x1a39, 0x37c9, 0x1975, 0x3756, 0x18cc, 0x36e6, 0x1836,\n\t0x3bed, 0x20a8, 0x3bed, 0x20a9, 0x3bed, 0x20ae, 0x3bed, 0x20bb, 0x3beb, 0x20cf, 0x3be8, 0x20ef, 0x3be4, 0x2119, 0x3bde, 0x214f, 0x3bd6, 0x2189, 0x3bc6, 0x21b8, 0x3bb1, 0x21de, 0x3b9a, 0x21f2, 0x3b7b, 0x21f2, 0x3b57, 0x21d8, 0x3b2d, 0x21a4, 0x3b00, 0x215f, 0x3acf, 0x2108, 0x3a99, 0x20a8, 0x3a64, 0x2043, 0x3a2c, 0x1fba, 0x39f2, 0x1ef3, 0x39b8, 0x1e36, 0x397c, 0x1d86, 0x3940, 0x1ce5, 0x3903, 0x1c52, 0x38c6, 0x1b9e, 0x3888, 0x1ab3, 0x384a, 0x19e4, 0x380e, 0x192b, 0x37a3, 0x188b, 0x372d, 0x17f7, 0x36ba, 0x1701,\n\t0x3bf4, 0x1e23, 0x3bf4, 0x1e25, 0x3bf4, 0x1e2d, 0x3bf3, 0x1e41, 0x3bf1, 0x1e64, 0x3bef, 0x1e9c, 0x3beb, 0x1ee1, 0x3be6, 0x1f40, 0x3bde, 0x1fa7, 0x3bce, 0x2001, 0x3bbd, 0x202f, 0x3ba6, 0x204e, 0x3b88, 0x205f, 0x3b64, 0x205b, 0x3b3b, 0x2044, 0x3b0e, 0x201f, 0x3adb, 0x1fcf, 0x3aa6, 0x1f4e, 0x3a6e, 0x1ec1, 0x3a33, 0x1e2b, 0x39f7, 0x1d95, 0x39ba, 0x1d06, 0x397b, 0x1c7d, 0x393c, 0x1bfc, 0x38fc, 0x1b13, 0x38bc, 0x1a40, 0x387c, 0x1983, 0x383c, 0x18da, 0x37fa, 0x1842, 0x377f, 0x177f, 0x3706, 0x1695, 0x3691, 0x15c8,\n\t0x3bf8, 0x1bca, 0x3bf8, 0x1bcc, 0x3bf8, 0x1bd8, 0x3bf8, 0x1bf7, 0x3bf6, 0x1c1b, 0x3bf4, 0x1c45, 0x3bf1, 0x1c83, 0x3bec, 0x1cce, 0x3be4, 0x1d21, 0x3bd5, 0x1d78, 0x3bc5, 0x1dd1, 0x3bb0, 0x1e17, 0x3b93, 0x1e4a, 0x3b70, 0x1e5f, 0x3b48, 0x1e57, 0x3b1b, 0x1e35, 0x3ae7, 0x1df6, 0x3ab2, 0x1da4, 0x3a77, 0x1d44, 0x3a3a, 0x1cdb, 0x39fc, 0x1c6e, 0x39bb, 0x1c03, 0x397a, 0x1b35, 0x3938, 0x1a72, 0x38f5, 0x19bb, 0x38b3, 0x1914, 0x3870, 0x187d, 0x382e, 0x17eb, 0x37db, 0x16f9, 0x375c, 0x1621, 0x36e1, 0x1565, 0x3669, 0x14be,\n\t0x3bfb, 0x18b9, 0x3bfb, 0x18ba, 0x3bfb, 0x18c3, 0x3bfb, 0x18da, 0x3bf9, 0x190a, 0x3bf7, 0x1948, 0x3bf5, 0x19ac, 0x3bf0, 0x1a20, 0x3be9, 0x1ab3, 0x3bdb, 0x1b49, 0x3bcd, 0x1be6, 0x3bb7, 0x1c34, 0x3b9c, 0x1c6d, 0x3b7a, 0x1c8e, 0x3b54, 0x1c9e, 0x3b26, 0x1c96, 0x3af2, 0x1c75, 0x3abc, 0x1c47, 0x3a80, 0x1c09, 0x3a42, 0x1b85, 0x3a01, 0x1aec, 0x39be, 0x1a50, 0x397a, 0x19b5, 0x3935, 0x1921, 0x38f0, 0x1895, 0x38aa, 0x1814, 0x3866, 0x173a, 0x3821, 0x1665, 0x37be, 0x15a4, 0x373c, 0x14f9, 0x36be, 0x1460, 0x3644, 0x13b3,\n\t0x3bfd, 0x156b, 0x3bfd, 0x156c, 0x3bfd, 0x1578, 0x3bfd, 0x1598, 0x3bfc, 0x15dd, 0x3bfa, 0x163c, 0x3bf7, 0x16cb, 0x3bf3, 0x177b, 0x3beb, 0x1833, 0x3be0, 0x18ad, 0x3bd2, 0x192e, 0x3bbd, 0x19a6, 0x3ba4, 0x1a0c, 0x3b83, 0x1a5a, 0x3b5d, 0x1a8c, 0x3b30, 0x1a9b, 0x3afd, 0x1a86, 0x3ac6, 0x1a5c, 0x3a89, 0x1a11, 0x3a49, 0x19b7, 0x3a06, 0x194f, 0x39c1, 0x18e3, 0x397a, 0x1873, 0x3933, 0x1805, 0x38eb, 0x173a, 0x38a3, 0x1676, 0x385c, 0x15bf, 0x3816, 0x1519, 0x37a2, 0x1482, 0x371d, 0x13f7, 0x369c, 0x1306, 0x3620, 0x1231,\n\t0x3bff, 0x11cb, 0x3bff, 0x11cd, 0x3bfe, 0x11dd, 0x3bfe, 0x1219, 0x3bfd, 0x126b, 0x3bfb, 0x12e9, 0x3bf9, 0x13c5, 0x3bf5, 0x1460, 0x3bee, 0x150f, 0x3be3, 0x15c9, 0x3bd6, 0x168a, 0x3bc3, 0x174f, 0x3baa, 0x1806, 0x3b8b, 0x184f, 0x3b66, 0x1888, 0x3b39, 0x18a6, 0x3b07, 0x18ad, 0x3acf, 0x189c, 0x3a92, 0x1876, 0x3a50, 0x1840, 0x3a0c, 0x17fd, 0x39c4, 0x176a, 0x397b, 0x16ce, 0x3931, 0x1634, 0x38e6, 0x1599, 0x389c, 0x1508, 0x3852, 0x147f, 0x380a, 0x1401, 0x3788, 0x131c, 0x36ff, 0x124a, 0x367c, 0x1190, 0x35fe, 0x10ea,\n\t0x3bff, 0x0daa, 0x3bff, 0x0dad, 0x3bff, 0x0dc0, 0x3bff, 0x0e0e, 0x3bfe, 0x0e87, 0x3bfc, 0x0f14, 0x3bfb, 0x1029, 0x3bf7, 0x10d1, 0x3bf0, 0x11d3, 0x3be6, 0x12c9, 0x3bd9, 0x13fc, 0x3bc7, 0x1499, 0x3bb0, 0x152a, 0x3b92, 0x15ab, 0x3b6e, 0x1615, 0x3b42, 0x165a, 0x3b10, 0x1681, 0x3ad8, 0x1683, 0x3a9a, 0x1665, 0x3a57, 0x1629, 0x3a11, 0x15dd, 0x39c8, 0x1580, 0x397c, 0x1518, 0x3930, 0x14ae, 0x38e3, 0x1441, 0x3896, 0x13b1, 0x384a, 0x12e9, 0x37ff, 0x122f, 0x376f, 0x1182, 0x36e3, 0x10e5, 0x365e, 0x1057, 0x35de, 0x0fac,\n\t0x3c00, 0x08ea, 0x3c00, 0x08ed, 0x3c00, 0x0902, 0x3c00, 0x0961, 0x3bff, 0x09f3, 0x3bfd, 0x0abc, 0x3bfb, 0x0c1f, 0x3bf8, 0x0d15, 0x3bf1, 0x0e5b, 0x3be8, 0x0fb4, 0x3bdc, 0x10b0, 0x3bcb, 0x1190, 0x3bb5, 0x126c, 0x3b97, 0x132c, 0x3b74, 0x13de, 0x3b4a, 0x1432, 0x3b18, 0x145e, 0x3ae0, 0x1472, 0x3aa2, 0x146f, 0x3a5f, 0x1456, 0x3a17, 0x142e, 0x39cc, 0x13ee, 0x397e, 0x136b, 0x392f, 0x12e1, 0x38df, 0x124f, 0x3890, 0x11bd, 0x3842, 0x1131, 0x37eb, 0x10ac, 0x3757, 0x102e, 0x36c9, 0x0f76, 0x3640, 0x0ea3, 0x35bf, 0x0de4,\n\t0x3c00, 0x039b, 0x3c00, 0x039d, 0x3c00, 0x03b2, 0x3c00, 0x041c, 0x3bff, 0x04be, 0x3bfd, 0x05d6, 0x3bfc, 0x0764, 0x3bf8, 0x08e2, 0x3bf2, 0x0a67, 0x3bea, 0x0c1b, 0x3bde, 0x0d41, 0x3bcd, 0x0e5f, 0x3bb8, 0x0f8c, 0x3b9c, 0x1057, 0x3b7a, 0x10e5, 0x3b51, 0x1155, 0x3b20, 0x11a5, 0x3ae8, 0x11da, 0x3aaa, 0x11ef, 0x3a66, 0x11e5, 0x3a1d, 0x11c1, 0x39d0, 0x1185, 0x3980, 0x113b, 0x392e, 0x10e5, 0x38dc, 0x1087, 0x388b, 0x1028, 0x383b, 0x0f94, 0x37d9, 0x0edb, 0x3741, 0x0e2c, 0x36af, 0x0d89, 0x3625, 0x0cf2, 0x35a1, 0x0c69,\n\t0x3c00, 0x0107, 0x3c00, 0x0108, 0x3c00, 0x0110, 0x3c00, 0x0145, 0x3bff, 0x0197, 0x3bfe, 0x0224, 0x3bfc, 0x030c, 0x3bf8, 0x0478, 0x3bf3, 0x062c, 0x3beb, 0x0833, 0x3be0, 0x0979, 0x3bd0, 0x0aeb, 0x3bbc, 0x0c3d, 0x3ba0, 0x0d01, 0x3b80, 0x0dbd, 0x3b57, 0x0e69, 0x3b27, 0x0eeb, 0x3af0, 0x0f53, 0x3ab1, 0x0f8a, 0x3a6c, 0x0f9f, 0x3a22, 0x0f8b, 0x39d4, 0x0f5b, 0x3982, 0x0f0f, 0x392f, 0x0eac, 0x38da, 0x0e3d, 0x3886, 0x0dc9, 0x3834, 0x0d51, 0x37c7, 0x0cd9, 0x372c, 0x0c65, 0x3697, 0x0bef, 0x360a, 0x0b20, 0x3585, 0x0a62,\n\t0x3c00, 0x0031, 0x3c00, 0x0031, 0x3c00, 0x0034, 0x3c00, 0x004b, 0x3bff, 0x006f, 0x3bfe, 0x00c9, 0x3bfc, 0x011b, 0x3bf9, 0x0207, 0x3bf4, 0x02d6, 0x3bec, 0x0415, 0x3be1, 0x0587, 0x3bd2, 0x0703, 0x3bbf, 0x087d, 0x3ba5, 0x096a, 0x3b85, 0x0a59, 0x3b5d, 0x0b32, 0x3b2e, 0x0bee, 0x3af7, 0x0c44, 0x3ab8, 0x0c7c, 0x3a73, 0x0c9c, 0x3a28, 0x0ca4, 0x39d8, 0x0c98, 0x3985, 0x0c77, 0x392f, 0x0c4a, 0x38d9, 0x0c10, 0x3882, 0x0ba0, 0x382e, 0x0b14, 0x37b6, 0x0a84, 0x3717, 0x09f5, 0x3680, 0x0969, 0x35f0, 0x08e6, 0x356a, 0x086a,\n\t0x3c00, 0x0004, 0x3c00, 0x0004, 0x3c00, 0x0004, 0x3c00, 0x000d, 0x3bff, 0x0021, 0x3bfe, 0x003b, 0x3bfd, 0x0070, 0x3bf9, 0x00c7, 0x3bf4, 0x012e, 0x3bed, 0x01c8, 0x3be3, 0x0274, 0x3bd4, 0x033b, 0x3bc1, 0x043a, 0x3ba8, 0x0534, 0x3b89, 0x0641, 0x3b62, 0x073b, 0x3b34, 0x0815, 0x3afd, 0x087c, 0x3abf, 0x08d0, 0x3a7a, 0x090a, 0x3a2e, 0x092c, 0x39dd, 0x0936, 0x3988, 0x0928, 0x3930, 0x0907, 0x38d7, 0x08d7, 0x387f, 0x089b, 0x3828, 0x0855, 0x37a7, 0x080b, 0x3704, 0x077b, 0x366a, 0x06e1, 0x35d8, 0x0649, 0x3550, 0x05b8,\n\t0x3c00, 0x0000, 0x3c00, 0x0000, 0x3c00, 0x0000, 0x3c00, 0x0003, 0x3bff, 0x0012, 0x3bfe, 0x001a, 0x3bfd, 0x0035, 0x3bfa, 0x0050, 0x3bf4, 0x0061, 0x3bed, 0x00a5, 0x3be4, 0x00ee, 0x3bd6, 0x0146, 0x3bc3, 0x01ab, 0x3bab, 0x0211, 0x3b8d, 0x028e, 0x3b67, 0x0303, 0x3b39, 0x0375, 0x3b04, 0x03e2, 0x3ac6, 0x0441, 0x3a80, 0x0492, 0x3a34, 0x04cd, 0x39e1, 0x04f2, 0x398b, 0x0504, 0x3931, 0x0502, 0x38d6, 0x04ec, 0x387c, 0x04c7, 0x3822, 0x0496, 0x3798, 0x045c, 0x36f2, 0x041a, 0x3655, 0x03d5, 0x35c1, 0x038e, 0x3537, 0x0347\n] );\n\nlet lut = null;\n\nfunction getDFGLUT() {\n\n\tif ( lut === null ) {\n\n\t\tlut = new DataTexture( DATA, 32, 32, RGFormat, HalfFloatType );\n\t\tlut.minFilter = LinearFilter;\n\t\tlut.magFilter = LinearFilter;\n\t\tlut.wrapS = ClampToEdgeWrapping;\n\t\tlut.wrapT = ClampToEdgeWrapping;\n\t\tlut.generateMipmaps = false;\n\t\tlut.needsUpdate = true;\n\n\t}\n\n\treturn lut;\n\n}\n\n/**\n * This renderer uses WebGL 2 to display scenes.\n *\n * WebGL 1 is not supported since `r163`.\n */\nclass WebGLRenderer {\n\n\t/**\n\t * Constructs a new WebGL renderer.\n\t *\n\t * @param {WebGLRenderer~Options} [parameters] - The configuration parameter.\n\t */\n\tconstructor( parameters = {} ) {\n\n\t\tconst {\n\t\t\tcanvas = createCanvasElement(),\n\t\t\tcontext = null,\n\t\t\tdepth = true,\n\t\t\tstencil = false,\n\t\t\talpha = false,\n\t\t\tantialias = false,\n\t\t\tpremultipliedAlpha = true,\n\t\t\tpreserveDrawingBuffer = false,\n\t\t\tpowerPreference = 'default',\n\t\t\tfailIfMajorPerformanceCaveat = false,\n\t\t\treversedDepthBuffer = false,\n\t\t} = parameters;\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isWebGLRenderer = true;\n\n\t\tlet _alpha;\n\n\t\tif ( context !== null ) {\n\n\t\t\tif ( typeof WebGLRenderingContext !== 'undefined' && context instanceof WebGLRenderingContext ) {\n\n\t\t\t\tthrow new Error( 'THREE.WebGLRenderer: WebGL 1 is not supported since r163.' );\n\n\t\t\t}\n\n\t\t\t_alpha = context.getContextAttributes().alpha;\n\n\t\t} else {\n\n\t\t\t_alpha = alpha;\n\n\t\t}\n\n\t\tconst INTEGER_FORMATS = new Set( [\n\t\t\tRGBAIntegerFormat,\n\t\t\tRGIntegerFormat,\n\t\t\tRedIntegerFormat\n\t\t] );\n\n\t\tconst UNSIGNED_TYPES = new Set( [\n\t\t\tUnsignedByteType,\n\t\t\tUnsignedIntType,\n\t\t\tUnsignedShortType,\n\t\t\tUnsignedInt248Type,\n\t\t\tUnsignedShort4444Type,\n\t\t\tUnsignedShort5551Type\n\t\t] );\n\n\t\tconst uintClearColor = new Uint32Array( 4 );\n\t\tconst intClearColor = new Int32Array( 4 );\n\n\t\tlet currentRenderList = null;\n\t\tlet currentRenderState = null;\n\n\t\t// render() can be called from within a callback triggered by another render.\n\t\t// We track this so that the nested render call gets its list and state isolated from the parent render call.\n\n\t\tconst renderListStack = [];\n\t\tconst renderStateStack = [];\n\n\t\t// public properties\n\n\t\t/**\n\t\t * A canvas where the renderer draws its output.This is automatically created by the renderer\n\t\t * in the constructor (if not provided already); you just need to add it to your page like so:\n\t\t * ```js\n\t\t * document.body.appendChild( renderer.domElement );\n\t\t * ```\n\t\t *\n\t\t * @type {HTMLCanvasElement|OffscreenCanvas}\n\t\t */\n\t\tthis.domElement = canvas;\n\n\t\t/**\n\t\t * A object with debug configuration settings.\n\t\t *\n\t\t * - `checkShaderErrors`: If it is `true`, defines whether material shader programs are\n\t\t * checked for errors during compilation and linkage process. It may be useful to disable\n\t\t * this check in production for performance gain. It is strongly recommended to keep these\n\t\t * checks enabled during development. If the shader does not compile and link - it will not\n\t\t * work and associated material will not render.\n\t\t * - `onShaderError(gl, program, glVertexShader,glFragmentShader)`: A callback function that\n\t\t * can be used for custom error reporting. The callback receives the WebGL context, an instance\n\t\t * of WebGLProgram as well two instances of WebGLShader representing the vertex and fragment shader.\n\t\t * Assigning a custom function disables the default error reporting.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.debug = {\n\n\t\t\t/**\n\t\t\t * Enables error checking and reporting when shader programs are being compiled.\n\t\t\t * @type {boolean}\n\t\t\t */\n\t\t\tcheckShaderErrors: true,\n\t\t\t/**\n\t\t\t * Callback for custom error reporting.\n\t\t\t * @type {?Function}\n\t\t\t */\n\t\t\tonShaderError: null\n\t\t};\n\n\t\t// clearing\n\n\t\t/**\n\t\t * Whether the renderer should automatically clear its output before rendering a frame or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.autoClear = true;\n\n\t\t/**\n\t\t * If {@link WebGLRenderer#autoClear} set to `true`, whether the renderer should clear\n\t\t * the color buffer or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.autoClearColor = true;\n\n\t\t/**\n\t\t * If {@link WebGLRenderer#autoClear} set to `true`, whether the renderer should clear\n\t\t * the depth buffer or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.autoClearDepth = true;\n\n\t\t/**\n\t\t * If {@link WebGLRenderer#autoClear} set to `true`, whether the renderer should clear\n\t\t * the stencil buffer or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.autoClearStencil = true;\n\n\t\t// scene graph\n\n\t\t/**\n\t\t * Whether the renderer should sort objects or not.\n\t\t *\n\t\t * Note: Sorting is used to attempt to properly render objects that have some\n\t\t * degree of transparency. By definition, sorting objects may not work in all\n\t\t * cases. Depending on the needs of application, it may be necessary to turn\n\t\t * off sorting and use other methods to deal with transparency rendering e.g.\n\t\t * manually determining each object's rendering order.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.sortObjects = true;\n\n\t\t// user-defined clipping\n\n\t\t/**\n\t\t * User-defined clipping planes specified in world space. These planes apply globally.\n\t\t * Points in space whose dot product with the plane is negative are cut away.\n\t\t *\n\t\t * @type {Array<Plane>}\n\t\t */\n\t\tthis.clippingPlanes = [];\n\n\t\t/**\n\t\t * Whether the renderer respects object-level clipping planes or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.localClippingEnabled = false;\n\n\t\t// tone mapping\n\n\t\t/**\n\t\t * The tone mapping technique of the renderer.\n\t\t *\n\t\t * @type {(NoToneMapping|LinearToneMapping|ReinhardToneMapping|CineonToneMapping|ACESFilmicToneMapping|CustomToneMapping|AgXToneMapping|NeutralToneMapping)}\n\t\t * @default NoToneMapping\n\t\t */\n\t\tthis.toneMapping = NoToneMapping;\n\n\t\t/**\n\t\t * Exposure level of tone mapping.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.toneMappingExposure = 1.0;\n\n\t\t// transmission\n\n\t\t/**\n\t\t * The normalized resolution scale for the transmission render target, measured in percentage\n\t\t * of viewport dimensions. Lowering this value can result in significant performance improvements\n\t\t * when using {@link MeshPhysicalMaterial#transmission}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.transmissionResolutionScale = 1.0;\n\n\t\t// internal properties\n\n\t\tconst _this = this;\n\n\t\tlet _isContextLost = false;\n\n\t\t// internal state cache\n\n\t\tthis._outputColorSpace = SRGBColorSpace;\n\n\t\tlet _currentActiveCubeFace = 0;\n\t\tlet _currentActiveMipmapLevel = 0;\n\t\tlet _currentRenderTarget = null;\n\t\tlet _currentMaterialId = -1;\n\n\t\tlet _currentCamera = null;\n\n\t\tconst _currentViewport = new Vector4();\n\t\tconst _currentScissor = new Vector4();\n\t\tlet _currentScissorTest = null;\n\n\t\tconst _currentClearColor = new Color( 0x000000 );\n\t\tlet _currentClearAlpha = 0;\n\n\t\t//\n\n\t\tlet _width = canvas.width;\n\t\tlet _height = canvas.height;\n\n\t\tlet _pixelRatio = 1;\n\t\tlet _opaqueSort = null;\n\t\tlet _transparentSort = null;\n\n\t\tconst _viewport = new Vector4( 0, 0, _width, _height );\n\t\tconst _scissor = new Vector4( 0, 0, _width, _height );\n\t\tlet _scissorTest = false;\n\n\t\t// frustum\n\n\t\tconst _frustum = new Frustum();\n\n\t\t// clipping\n\n\t\tlet _clippingEnabled = false;\n\t\tlet _localClippingEnabled = false;\n\n\t\t// camera matrices cache\n\n\t\tconst _projScreenMatrix = new Matrix4();\n\n\t\tconst _vector3 = new Vector3();\n\n\t\tconst _vector4 = new Vector4();\n\n\t\tconst _emptyScene = { background: null, fog: null, environment: null, overrideMaterial: null, isScene: true };\n\n\t\tlet _renderBackground = false;\n\n\t\tfunction getTargetPixelRatio() {\n\n\t\t\treturn _currentRenderTarget === null ? _pixelRatio : 1;\n\n\t\t}\n\n\t\t// initialize\n\n\t\tlet _gl = context;\n\n\t\tfunction getContext( contextName, contextAttributes ) {\n\n\t\t\treturn canvas.getContext( contextName, contextAttributes );\n\n\t\t}\n\n\t\ttry {\n\n\t\t\tconst contextAttributes = {\n\t\t\t\talpha: true,\n\t\t\t\tdepth,\n\t\t\t\tstencil,\n\t\t\t\tantialias,\n\t\t\t\tpremultipliedAlpha,\n\t\t\t\tpreserveDrawingBuffer,\n\t\t\t\tpowerPreference,\n\t\t\t\tfailIfMajorPerformanceCaveat,\n\t\t\t};\n\n\t\t\t// OffscreenCanvas does not have setAttribute, see #22811\n\t\t\tif ( 'setAttribute' in canvas ) canvas.setAttribute( 'data-engine', `three.js r${REVISION}` );\n\n\t\t\t// event listeners must be registered before WebGL context is created, see #12753\n\t\t\tcanvas.addEventListener( 'webglcontextlost', onContextLost, false );\n\t\t\tcanvas.addEventListener( 'webglcontextrestored', onContextRestore, false );\n\t\t\tcanvas.addEventListener( 'webglcontextcreationerror', onContextCreationError, false );\n\n\t\t\tif ( _gl === null ) {\n\n\t\t\t\tconst contextName = 'webgl2';\n\n\t\t\t\t_gl = getContext( contextName, contextAttributes );\n\n\t\t\t\tif ( _gl === null ) {\n\n\t\t\t\t\tif ( getContext( contextName ) ) {\n\n\t\t\t\t\t\tthrow new Error( 'Error creating WebGL context with your selected attributes.' );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tthrow new Error( 'Error creating WebGL context.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} catch ( error ) {\n\n\t\t\terror( 'WebGLRenderer: ' + error.message );\n\t\t\tthrow error;\n\n\t\t}\n\n\t\tlet extensions, capabilities, state, info;\n\t\tlet properties, textures, cubemaps, cubeuvmaps, attributes, geometries, objects;\n\t\tlet programCache, materials, renderLists, renderStates, clipping, shadowMap;\n\n\t\tlet background, morphtargets, bufferRenderer, indexedBufferRenderer;\n\n\t\tlet utils, bindingStates, uniformsGroups;\n\n\t\tfunction initGLContext() {\n\n\t\t\textensions = new WebGLExtensions( _gl );\n\t\t\textensions.init();\n\n\t\t\tutils = new WebGLUtils( _gl, extensions );\n\n\t\t\tcapabilities = new WebGLCapabilities( _gl, extensions, parameters, utils );\n\n\t\t\tstate = new WebGLState( _gl, extensions );\n\n\t\t\tif ( capabilities.reversedDepthBuffer && reversedDepthBuffer ) {\n\n\t\t\t\tstate.buffers.depth.setReversed( true );\n\n\t\t\t}\n\n\t\t\tinfo = new WebGLInfo( _gl );\n\t\t\tproperties = new WebGLProperties();\n\t\t\ttextures = new WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info );\n\t\t\tcubemaps = new WebGLCubeMaps( _this );\n\t\t\tcubeuvmaps = new WebGLCubeUVMaps( _this );\n\t\t\tattributes = new WebGLAttributes( _gl );\n\t\t\tbindingStates = new WebGLBindingStates( _gl, attributes );\n\t\t\tgeometries = new WebGLGeometries( _gl, attributes, info, bindingStates );\n\t\t\tobjects = new WebGLObjects( _gl, geometries, attributes, info );\n\t\t\tmorphtargets = new WebGLMorphtargets( _gl, capabilities, textures );\n\t\t\tclipping = new WebGLClipping( properties );\n\t\t\tprogramCache = new WebGLPrograms( _this, cubemaps, cubeuvmaps, extensions, capabilities, bindingStates, clipping );\n\t\t\tmaterials = new WebGLMaterials( _this, properties );\n\t\t\trenderLists = new WebGLRenderLists();\n\t\t\trenderStates = new WebGLRenderStates( extensions );\n\t\t\tbackground = new WebGLBackground( _this, cubemaps, cubeuvmaps, state, objects, _alpha, premultipliedAlpha );\n\t\t\tshadowMap = new WebGLShadowMap( _this, objects, capabilities );\n\t\t\tuniformsGroups = new WebGLUniformsGroups( _gl, info, capabilities, state );\n\n\t\t\tbufferRenderer = new WebGLBufferRenderer( _gl, extensions, info );\n\t\t\tindexedBufferRenderer = new WebGLIndexedBufferRenderer( _gl, extensions, info );\n\n\t\t\tinfo.programs = programCache.programs;\n\n\t\t\t/**\n\t\t\t * Holds details about the capabilities of the current rendering context.\n\t\t\t *\n\t\t\t * @name WebGLRenderer#capabilities\n\t\t\t * @type {WebGLRenderer~Capabilities}\n\t\t\t */\n\t\t\t_this.capabilities = capabilities;\n\n\t\t\t/**\n\t\t\t * Provides methods for retrieving and testing WebGL extensions.\n\t\t\t *\n\t\t\t * - `get(extensionName:string)`: Used to check whether a WebGL extension is supported\n\t\t\t * and return the extension object if available.\n\t\t\t * - `has(extensionName:string)`: returns `true` if the extension is supported.\n\t\t\t *\n\t\t\t * @name WebGLRenderer#extensions\n\t\t\t * @type {Object}\n\t\t\t */\n\t\t\t_this.extensions = extensions;\n\n\t\t\t/**\n\t\t\t * Used to track properties of other objects like native WebGL objects.\n\t\t\t *\n\t\t\t * @name WebGLRenderer#properties\n\t\t\t * @type {Object}\n\t\t\t */\n\t\t\t_this.properties = properties;\n\n\t\t\t/**\n\t\t\t * Manages the render lists of the renderer.\n\t\t\t *\n\t\t\t * @name WebGLRenderer#renderLists\n\t\t\t * @type {Object}\n\t\t\t */\n\t\t\t_this.renderLists = renderLists;\n\n\n\n\t\t\t/**\n\t\t\t * Interface for managing shadows.\n\t\t\t *\n\t\t\t * @name WebGLRenderer#shadowMap\n\t\t\t * @type {WebGLRenderer~ShadowMap}\n\t\t\t */\n\t\t\t_this.shadowMap = shadowMap;\n\n\t\t\t/**\n\t\t\t * Interface for managing the WebGL state.\n\t\t\t *\n\t\t\t * @name WebGLRenderer#state\n\t\t\t * @type {Object}\n\t\t\t */\n\t\t\t_this.state = state;\n\n\t\t\t/**\n\t\t\t * Holds a series of statistical information about the GPU memory\n\t\t\t * and the rendering process. Useful for debugging and monitoring.\n\t\t\t *\n\t\t\t * By default these data are reset at each render call but when having\n\t\t\t * multiple render passes per frame (e.g. when using post processing) it can\n\t\t\t * be preferred to reset with a custom pattern. First, set `autoReset` to\n\t\t\t * `false`.\n\t\t\t * ```js\n\t\t\t * renderer.info.autoReset = false;\n\t\t\t * ```\n\t\t\t * Call `reset()` whenever you have finished to render a single frame.\n\t\t\t * ```js\n\t\t\t * renderer.info.reset();\n\t\t\t * ```\n\t\t\t *\n\t\t\t * @name WebGLRenderer#info\n\t\t\t * @type {WebGLRenderer~Info}\n\t\t\t */\n\t\t\t_this.info = info;\n\n\t\t}\n\n\t\tinitGLContext();\n\n\t\t// xr\n\n\t\tconst xr = new WebXRManager( _this, _gl );\n\n\t\t/**\n\t\t * A reference to the XR manager.\n\t\t *\n\t\t * @type {WebXRManager}\n\t\t */\n\t\tthis.xr = xr;\n\n\t\t/**\n\t\t * Returns the rendering context.\n\t\t *\n\t\t * @return {WebGL2RenderingContext} The rendering context.\n\t\t */\n\t\tthis.getContext = function () {\n\n\t\t\treturn _gl;\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the rendering context attributes.\n\t\t *\n\t\t * @return {WebGLContextAttributes} The rendering context attributes.\n\t\t */\n\t\tthis.getContextAttributes = function () {\n\n\t\t\treturn _gl.getContextAttributes();\n\n\t\t};\n\n\t\t/**\n\t\t * Simulates a loss of the WebGL context. This requires support for the `WEBGL_lose_context` extension.\n\t\t */\n\t\tthis.forceContextLoss = function () {\n\n\t\t\tconst extension = extensions.get( 'WEBGL_lose_context' );\n\t\t\tif ( extension ) extension.loseContext();\n\n\t\t};\n\n\t\t/**\n\t\t * Simulates a restore of the WebGL context. This requires support for the `WEBGL_lose_context` extension.\n\t\t */\n\t\tthis.forceContextRestore = function () {\n\n\t\t\tconst extension = extensions.get( 'WEBGL_lose_context' );\n\t\t\tif ( extension ) extension.restoreContext();\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the pixel ratio.\n\t\t *\n\t\t * @return {number} The pixel ratio.\n\t\t */\n\t\tthis.getPixelRatio = function () {\n\n\t\t\treturn _pixelRatio;\n\n\t\t};\n\n\t\t/**\n\t\t * Sets the given pixel ratio and resizes the canvas if necessary.\n\t\t *\n\t\t * @param {number} value - The pixel ratio.\n\t\t */\n\t\tthis.setPixelRatio = function ( value ) {\n\n\t\t\tif ( value === undefined ) return;\n\n\t\t\t_pixelRatio = value;\n\n\t\t\tthis.setSize( _width, _height, false );\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the renderer's size in logical pixels. This method does not honor the pixel ratio.\n\t\t *\n\t\t * @param {Vector2} target - The method writes the result in this target object.\n\t\t * @return {Vector2} The renderer's size in logical pixels.\n\t\t */\n\t\tthis.getSize = function ( target ) {\n\n\t\t\treturn target.set( _width, _height );\n\n\t\t};\n\n\t\t/**\n\t\t * Resizes the output canvas to (width, height) with device pixel ratio taken\n\t\t * into account, and also sets the viewport to fit that size, starting in (0,\n\t\t * 0). Setting `updateStyle` to false prevents any style changes to the output canvas.\n\t\t *\n\t\t * @param {number} width - The width in logical pixels.\n\t\t * @param {number} height - The height in logical pixels.\n\t\t * @param {boolean} [updateStyle=true] - Whether to update the `style` attribute of the canvas or not.\n\t\t */\n\t\tthis.setSize = function ( width, height, updateStyle = true ) {\n\n\t\t\tif ( xr.isPresenting ) {\n\n\t\t\t\twarn( 'WebGLRenderer: Can\\'t change size while VR device is presenting.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\t_width = width;\n\t\t\t_height = height;\n\n\t\t\tcanvas.width = Math.floor( width * _pixelRatio );\n\t\t\tcanvas.height = Math.floor( height * _pixelRatio );\n\n\t\t\tif ( updateStyle === true ) {\n\n\t\t\t\tcanvas.style.width = width + 'px';\n\t\t\t\tcanvas.style.height = height + 'px';\n\n\t\t\t}\n\n\t\t\tthis.setViewport( 0, 0, width, height );\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the drawing buffer size in physical pixels. This method honors the pixel ratio.\n\t\t *\n\t\t * @param {Vector2} target - The method writes the result in this target object.\n\t\t * @return {Vector2} The drawing buffer size.\n\t\t */\n\t\tthis.getDrawingBufferSize = function ( target ) {\n\n\t\t\treturn target.set( _width * _pixelRatio, _height * _pixelRatio ).floor();\n\n\t\t};\n\n\t\t/**\n\t\t * This method allows to define the drawing buffer size by specifying\n\t\t * width, height and pixel ratio all at once. The size of the drawing\n\t\t * buffer is computed with this formula:\n\t\t * ```js\n\t\t * size.x = width * pixelRatio;\n\t\t * size.y = height * pixelRatio;\n\t\t * ```\n\t\t *\n\t\t * @param {number} width - The width in logical pixels.\n\t\t * @param {number} height - The height in logical pixels.\n\t\t * @param {number} pixelRatio - The pixel ratio.\n\t\t */\n\t\tthis.setDrawingBufferSize = function ( width, height, pixelRatio ) {\n\n\t\t\t_width = width;\n\t\t\t_height = height;\n\n\t\t\t_pixelRatio = pixelRatio;\n\n\t\t\tcanvas.width = Math.floor( width * pixelRatio );\n\t\t\tcanvas.height = Math.floor( height * pixelRatio );\n\n\t\t\tthis.setViewport( 0, 0, width, height );\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the current viewport definition.\n\t\t *\n\t\t * @param {Vector2} target - The method writes the result in this target object.\n\t\t * @return {Vector2} The current viewport definition.\n\t\t */\n\t\tthis.getCurrentViewport = function ( target ) {\n\n\t\t\treturn target.copy( _currentViewport );\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the viewport definition.\n\t\t *\n\t\t * @param {Vector4} target - The method writes the result in this target object.\n\t\t * @return {Vector4} The viewport definition.\n\t\t */\n\t\tthis.getViewport = function ( target ) {\n\n\t\t\treturn target.copy( _viewport );\n\n\t\t};\n\n\t\t/**\n\t\t * Sets the viewport to render from `(x, y)` to `(x + width, y + height)`.\n\t\t *\n\t\t * @param {number | Vector4} x - The horizontal coordinate for the lower left corner of the viewport origin in logical pixel unit.\n\t\t * Or alternatively a four-component vector specifying all the parameters of the viewport.\n\t\t * @param {number} y - The vertical coordinate for the lower left corner of the viewport origin  in logical pixel unit.\n\t\t * @param {number} width - The width of the viewport in logical pixel unit.\n\t\t * @param {number} height - The height of the viewport in logical pixel unit.\n\t\t */\n\t\tthis.setViewport = function ( x, y, width, height ) {\n\n\t\t\tif ( x.isVector4 ) {\n\n\t\t\t\t_viewport.set( x.x, x.y, x.z, x.w );\n\n\t\t\t} else {\n\n\t\t\t\t_viewport.set( x, y, width, height );\n\n\t\t\t}\n\n\t\t\tstate.viewport( _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ).round() );\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the scissor region.\n\t\t *\n\t\t * @param {Vector4} target - The method writes the result in this target object.\n\t\t * @return {Vector4} The scissor region.\n\t\t */\n\t\tthis.getScissor = function ( target ) {\n\n\t\t\treturn target.copy( _scissor );\n\n\t\t};\n\n\t\t/**\n\t\t * Sets the scissor region to render from `(x, y)` to `(x + width, y + height)`.\n\t\t *\n\t\t * @param {number | Vector4} x - The horizontal coordinate for the lower left corner of the scissor region origin in logical pixel unit.\n\t\t * Or alternatively a four-component vector specifying all the parameters of the scissor region.\n\t\t * @param {number} y - The vertical coordinate for the lower left corner of the scissor region origin  in logical pixel unit.\n\t\t * @param {number} width - The width of the scissor region in logical pixel unit.\n\t\t * @param {number} height - The height of the scissor region in logical pixel unit.\n\t\t */\n\t\tthis.setScissor = function ( x, y, width, height ) {\n\n\t\t\tif ( x.isVector4 ) {\n\n\t\t\t\t_scissor.set( x.x, x.y, x.z, x.w );\n\n\t\t\t} else {\n\n\t\t\t\t_scissor.set( x, y, width, height );\n\n\t\t\t}\n\n\t\t\tstate.scissor( _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ).round() );\n\n\t\t};\n\n\t\t/**\n\t\t * Returns `true` if the scissor test is enabled.\n\t\t *\n\t\t * @return {boolean} Whether the scissor test is enabled or not.\n\t\t */\n\t\tthis.getScissorTest = function () {\n\n\t\t\treturn _scissorTest;\n\n\t\t};\n\n\t\t/**\n\t\t * Enable or disable the scissor test. When this is enabled, only the pixels\n\t\t * within the defined scissor area will be affected by further renderer\n\t\t * actions.\n\t\t *\n\t\t * @param {boolean} boolean - Whether the scissor test is enabled or not.\n\t\t */\n\t\tthis.setScissorTest = function ( boolean ) {\n\n\t\t\tstate.setScissorTest( _scissorTest = boolean );\n\n\t\t};\n\n\t\t/**\n\t\t * Sets a custom opaque sort function for the render lists. Pass `null`\n\t\t * to use the default `painterSortStable` function.\n\t\t *\n\t\t * @param {?Function} method - The opaque sort function.\n\t\t */\n\t\tthis.setOpaqueSort = function ( method ) {\n\n\t\t\t_opaqueSort = method;\n\n\t\t};\n\n\t\t/**\n\t\t * Sets a custom transparent sort function for the render lists. Pass `null`\n\t\t * to use the default `reversePainterSortStable` function.\n\t\t *\n\t\t * @param {?Function} method - The opaque sort function.\n\t\t */\n\t\tthis.setTransparentSort = function ( method ) {\n\n\t\t\t_transparentSort = method;\n\n\t\t};\n\n\t\t// Clearing\n\n\t\t/**\n\t\t * Returns the clear color.\n\t\t *\n\t\t * @param {Color} target - The method writes the result in this target object.\n\t\t * @return {Color} The clear color.\n\t\t */\n\t\tthis.getClearColor = function ( target ) {\n\n\t\t\treturn target.copy( background.getClearColor() );\n\n\t\t};\n\n\t\t/**\n\t\t * Sets the clear color and alpha.\n\t\t *\n\t\t * @param {Color} color - The clear color.\n\t\t * @param {number} [alpha=1] - The clear alpha.\n\t\t */\n\t\tthis.setClearColor = function () {\n\n\t\t\tbackground.setClearColor( ...arguments );\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the clear alpha. Ranges within `[0,1]`.\n\t\t *\n\t\t * @return {number} The clear alpha.\n\t\t */\n\t\tthis.getClearAlpha = function () {\n\n\t\t\treturn background.getClearAlpha();\n\n\t\t};\n\n\t\t/**\n\t\t * Sets the clear alpha.\n\t\t *\n\t\t * @param {number} alpha - The clear alpha.\n\t\t */\n\t\tthis.setClearAlpha = function () {\n\n\t\t\tbackground.setClearAlpha( ...arguments );\n\n\t\t};\n\n\t\t/**\n\t\t * Tells the renderer to clear its color, depth or stencil drawing buffer(s).\n\t\t * This method initializes the buffers to the current clear color values.\n\t\t *\n\t\t * @param {boolean} [color=true] - Whether the color buffer should be cleared or not.\n\t\t * @param {boolean} [depth=true] - Whether the depth buffer should be cleared or not.\n\t\t * @param {boolean} [stencil=true] - Whether the stencil buffer should be cleared or not.\n\t\t */\n\t\tthis.clear = function ( color = true, depth = true, stencil = true ) {\n\n\t\t\tlet bits = 0;\n\n\t\t\tif ( color ) {\n\n\t\t\t\t// check if we're trying to clear an integer target\n\t\t\t\tlet isIntegerFormat = false;\n\t\t\t\tif ( _currentRenderTarget !== null ) {\n\n\t\t\t\t\tconst targetFormat = _currentRenderTarget.texture.format;\n\t\t\t\t\tisIntegerFormat = INTEGER_FORMATS.has( targetFormat );\n\n\t\t\t\t}\n\n\t\t\t\t// use the appropriate clear functions to clear the target if it's a signed\n\t\t\t\t// or unsigned integer target\n\t\t\t\tif ( isIntegerFormat ) {\n\n\t\t\t\t\tconst targetType = _currentRenderTarget.texture.type;\n\t\t\t\t\tconst isUnsignedType = UNSIGNED_TYPES.has( targetType );\n\n\t\t\t\t\tconst clearColor = background.getClearColor();\n\t\t\t\t\tconst a = background.getClearAlpha();\n\t\t\t\t\tconst r = clearColor.r;\n\t\t\t\t\tconst g = clearColor.g;\n\t\t\t\t\tconst b = clearColor.b;\n\n\t\t\t\t\tif ( isUnsignedType ) {\n\n\t\t\t\t\t\tuintClearColor[ 0 ] = r;\n\t\t\t\t\t\tuintClearColor[ 1 ] = g;\n\t\t\t\t\t\tuintClearColor[ 2 ] = b;\n\t\t\t\t\t\tuintClearColor[ 3 ] = a;\n\t\t\t\t\t\t_gl.clearBufferuiv( _gl.COLOR, 0, uintClearColor );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tintClearColor[ 0 ] = r;\n\t\t\t\t\t\tintClearColor[ 1 ] = g;\n\t\t\t\t\t\tintClearColor[ 2 ] = b;\n\t\t\t\t\t\tintClearColor[ 3 ] = a;\n\t\t\t\t\t\t_gl.clearBufferiv( _gl.COLOR, 0, intClearColor );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbits |= _gl.COLOR_BUFFER_BIT;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( depth ) {\n\n\t\t\t\tbits |= _gl.DEPTH_BUFFER_BIT;\n\n\t\t\t}\n\n\t\t\tif ( stencil ) {\n\n\t\t\t\tbits |= _gl.STENCIL_BUFFER_BIT;\n\t\t\t\tthis.state.buffers.stencil.setMask( 0xffffffff );\n\n\t\t\t}\n\n\t\t\t_gl.clear( bits );\n\n\t\t};\n\n\t\t/**\n\t\t * Clears the color buffer. Equivalent to calling `renderer.clear( true, false, false )`.\n\t\t */\n\t\tthis.clearColor = function () {\n\n\t\t\tthis.clear( true, false, false );\n\n\t\t};\n\n\t\t/**\n\t\t * Clears the depth buffer. Equivalent to calling `renderer.clear( false, true, false )`.\n\t\t */\n\t\tthis.clearDepth = function () {\n\n\t\t\tthis.clear( false, true, false );\n\n\t\t};\n\n\t\t/**\n\t\t * Clears the stencil buffer. Equivalent to calling `renderer.clear( false, false, true )`.\n\t\t */\n\t\tthis.clearStencil = function () {\n\n\t\t\tthis.clear( false, false, true );\n\n\t\t};\n\n\t\t/**\n\t\t * Frees the GPU-related resources allocated by this instance. Call this\n\t\t * method whenever this instance is no longer used in your app.\n\t\t */\n\t\tthis.dispose = function () {\n\n\t\t\tcanvas.removeEventListener( 'webglcontextlost', onContextLost, false );\n\t\t\tcanvas.removeEventListener( 'webglcontextrestored', onContextRestore, false );\n\t\t\tcanvas.removeEventListener( 'webglcontextcreationerror', onContextCreationError, false );\n\n\t\t\tbackground.dispose();\n\t\t\trenderLists.dispose();\n\t\t\trenderStates.dispose();\n\t\t\tproperties.dispose();\n\t\t\tcubemaps.dispose();\n\t\t\tcubeuvmaps.dispose();\n\t\t\tobjects.dispose();\n\t\t\tbindingStates.dispose();\n\t\t\tuniformsGroups.dispose();\n\t\t\tprogramCache.dispose();\n\n\t\t\txr.dispose();\n\n\t\t\txr.removeEventListener( 'sessionstart', onXRSessionStart );\n\t\t\txr.removeEventListener( 'sessionend', onXRSessionEnd );\n\n\t\t\tanimation.stop();\n\n\t\t};\n\n\t\t// Events\n\n\t\tfunction onContextLost( event ) {\n\n\t\t\tevent.preventDefault();\n\n\t\t\tlog( 'WebGLRenderer: Context Lost.' );\n\n\t\t\t_isContextLost = true;\n\n\t\t}\n\n\t\tfunction onContextRestore( /* event */ ) {\n\n\t\t\tlog( 'WebGLRenderer: Context Restored.' );\n\n\t\t\t_isContextLost = false;\n\n\t\t\tconst infoAutoReset = info.autoReset;\n\t\t\tconst shadowMapEnabled = shadowMap.enabled;\n\t\t\tconst shadowMapAutoUpdate = shadowMap.autoUpdate;\n\t\t\tconst shadowMapNeedsUpdate = shadowMap.needsUpdate;\n\t\t\tconst shadowMapType = shadowMap.type;\n\n\t\t\tinitGLContext();\n\n\t\t\tinfo.autoReset = infoAutoReset;\n\t\t\tshadowMap.enabled = shadowMapEnabled;\n\t\t\tshadowMap.autoUpdate = shadowMapAutoUpdate;\n\t\t\tshadowMap.needsUpdate = shadowMapNeedsUpdate;\n\t\t\tshadowMap.type = shadowMapType;\n\n\t\t}\n\n\t\tfunction onContextCreationError( event ) {\n\n\t\t\terror( 'WebGLRenderer: A WebGL context could not be created. Reason: ', event.statusMessage );\n\n\t\t}\n\n\t\tfunction onMaterialDispose( event ) {\n\n\t\t\tconst material = event.target;\n\n\t\t\tmaterial.removeEventListener( 'dispose', onMaterialDispose );\n\n\t\t\tdeallocateMaterial( material );\n\n\t\t}\n\n\t\t// Buffer deallocation\n\n\t\tfunction deallocateMaterial( material ) {\n\n\t\t\treleaseMaterialProgramReferences( material );\n\n\t\t\tproperties.remove( material );\n\n\t\t}\n\n\n\t\tfunction releaseMaterialProgramReferences( material ) {\n\n\t\t\tconst programs = properties.get( material ).programs;\n\n\t\t\tif ( programs !== undefined ) {\n\n\t\t\t\tprograms.forEach( function ( program ) {\n\n\t\t\t\t\tprogramCache.releaseProgram( program );\n\n\t\t\t\t} );\n\n\t\t\t\tif ( material.isShaderMaterial ) {\n\n\t\t\t\t\tprogramCache.releaseShaderCache( material );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Buffer rendering\n\n\t\tthis.renderBufferDirect = function ( camera, scene, geometry, material, object, group ) {\n\n\t\t\tif ( scene === null ) scene = _emptyScene; // renderBufferDirect second parameter used to be fog (could be null)\n\n\t\t\tconst frontFaceCW = ( object.isMesh && object.matrixWorld.determinant() < 0 );\n\n\t\t\tconst program = setProgram( camera, scene, geometry, material, object );\n\n\t\t\tstate.setMaterial( material, frontFaceCW );\n\n\t\t\t//\n\n\t\t\tlet index = geometry.index;\n\t\t\tlet rangeFactor = 1;\n\n\t\t\tif ( material.wireframe === true ) {\n\n\t\t\t\tindex = geometries.getWireframeAttribute( geometry );\n\n\t\t\t\tif ( index === undefined ) return;\n\n\t\t\t\trangeFactor = 2;\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tconst drawRange = geometry.drawRange;\n\t\t\tconst position = geometry.attributes.position;\n\n\t\t\tlet drawStart = drawRange.start * rangeFactor;\n\t\t\tlet drawEnd = ( drawRange.start + drawRange.count ) * rangeFactor;\n\n\t\t\tif ( group !== null ) {\n\n\t\t\t\tdrawStart = Math.max( drawStart, group.start * rangeFactor );\n\t\t\t\tdrawEnd = Math.min( drawEnd, ( group.start + group.count ) * rangeFactor );\n\n\t\t\t}\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tdrawStart = Math.max( drawStart, 0 );\n\t\t\t\tdrawEnd = Math.min( drawEnd, index.count );\n\n\t\t\t} else if ( position !== undefined && position !== null ) {\n\n\t\t\t\tdrawStart = Math.max( drawStart, 0 );\n\t\t\t\tdrawEnd = Math.min( drawEnd, position.count );\n\n\t\t\t}\n\n\t\t\tconst drawCount = drawEnd - drawStart;\n\n\t\t\tif ( drawCount < 0 || drawCount === Infinity ) return;\n\n\t\t\t//\n\n\t\t\tbindingStates.setup( object, material, program, geometry, index );\n\n\t\t\tlet attribute;\n\t\t\tlet renderer = bufferRenderer;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tattribute = attributes.get( index );\n\n\t\t\t\trenderer = indexedBufferRenderer;\n\t\t\t\trenderer.setIndex( attribute );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( object.isMesh ) {\n\n\t\t\t\tif ( material.wireframe === true ) {\n\n\t\t\t\t\tstate.setLineWidth( material.wireframeLinewidth * getTargetPixelRatio() );\n\t\t\t\t\trenderer.setMode( _gl.LINES );\n\n\t\t\t\t} else {\n\n\t\t\t\t\trenderer.setMode( _gl.TRIANGLES );\n\n\t\t\t\t}\n\n\t\t\t} else if ( object.isLine ) {\n\n\t\t\t\tlet lineWidth = material.linewidth;\n\n\t\t\t\tif ( lineWidth === undefined ) lineWidth = 1; // Not using Line*Material\n\n\t\t\t\tstate.setLineWidth( lineWidth * getTargetPixelRatio() );\n\n\t\t\t\tif ( object.isLineSegments ) {\n\n\t\t\t\t\trenderer.setMode( _gl.LINES );\n\n\t\t\t\t} else if ( object.isLineLoop ) {\n\n\t\t\t\t\trenderer.setMode( _gl.LINE_LOOP );\n\n\t\t\t\t} else {\n\n\t\t\t\t\trenderer.setMode( _gl.LINE_STRIP );\n\n\t\t\t\t}\n\n\t\t\t} else if ( object.isPoints ) {\n\n\t\t\t\trenderer.setMode( _gl.POINTS );\n\n\t\t\t} else if ( object.isSprite ) {\n\n\t\t\t\trenderer.setMode( _gl.TRIANGLES );\n\n\t\t\t}\n\n\t\t\tif ( object.isBatchedMesh ) {\n\n\t\t\t\tif ( object._multiDrawInstances !== null ) {\n\n\t\t\t\t\t// @deprecated, r174\n\t\t\t\t\twarnOnce( 'WebGLRenderer: renderMultiDrawInstances has been deprecated and will be removed in r184. Append to renderMultiDraw arguments and use indirection.' );\n\t\t\t\t\trenderer.renderMultiDrawInstances( object._multiDrawStarts, object._multiDrawCounts, object._multiDrawCount, object._multiDrawInstances );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( ! extensions.get( 'WEBGL_multi_draw' ) ) {\n\n\t\t\t\t\t\tconst starts = object._multiDrawStarts;\n\t\t\t\t\t\tconst counts = object._multiDrawCounts;\n\t\t\t\t\t\tconst drawCount = object._multiDrawCount;\n\t\t\t\t\t\tconst bytesPerElement = index ? attributes.get( index ).bytesPerElement : 1;\n\t\t\t\t\t\tconst uniforms = properties.get( material ).currentProgram.getUniforms();\n\t\t\t\t\t\tfor ( let i = 0; i < drawCount; i ++ ) {\n\n\t\t\t\t\t\t\tuniforms.setValue( _gl, '_gl_DrawID', i );\n\t\t\t\t\t\t\trenderer.render( starts[ i ] / bytesPerElement, counts[ i ] );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\trenderer.renderMultiDraw( object._multiDrawStarts, object._multiDrawCounts, object._multiDrawCount );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( object.isInstancedMesh ) {\n\n\t\t\t\trenderer.renderInstances( drawStart, drawCount, object.count );\n\n\t\t\t} else if ( geometry.isInstancedBufferGeometry ) {\n\n\t\t\t\tconst maxInstanceCount = geometry._maxInstanceCount !== undefined ? geometry._maxInstanceCount : Infinity;\n\t\t\t\tconst instanceCount = Math.min( geometry.instanceCount, maxInstanceCount );\n\n\t\t\t\trenderer.renderInstances( drawStart, drawCount, instanceCount );\n\n\t\t\t} else {\n\n\t\t\t\trenderer.render( drawStart, drawCount );\n\n\t\t\t}\n\n\t\t};\n\n\t\t// Compile\n\n\t\tfunction prepareMaterial( material, scene, object ) {\n\n\t\t\tif ( material.transparent === true && material.side === DoubleSide && material.forceSinglePass === false ) {\n\n\t\t\t\tmaterial.side = BackSide;\n\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t\tgetProgram( material, scene, object );\n\n\t\t\t\tmaterial.side = FrontSide;\n\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t\tgetProgram( material, scene, object );\n\n\t\t\t\tmaterial.side = DoubleSide;\n\n\t\t\t} else {\n\n\t\t\t\tgetProgram( material, scene, object );\n\n\t\t\t}\n\n\t\t}\n\n\t\t/**\n\t\t * Compiles all materials in the scene with the camera. This is useful to precompile shaders\n\t\t * before the first rendering. If you want to add a 3D object to an existing scene, use the third\n\t\t * optional parameter for applying the target scene.\n\t\t *\n\t\t * Note that the (target) scene's lighting and environment must be configured before calling this method.\n\t\t *\n\t\t * @param {Object3D} scene - The scene or another type of 3D object to precompile.\n\t\t * @param {Camera} camera - The camera.\n\t\t * @param {?Scene} [targetScene=null] - The target scene.\n\t\t * @return {Set<Material>} The precompiled materials.\n\t\t */\n\t\tthis.compile = function ( scene, camera, targetScene = null ) {\n\n\t\t\tif ( targetScene === null ) targetScene = scene;\n\n\t\t\tcurrentRenderState = renderStates.get( targetScene );\n\t\t\tcurrentRenderState.init( camera );\n\n\t\t\trenderStateStack.push( currentRenderState );\n\n\t\t\t// gather lights from both the target scene and the new object that will be added to the scene.\n\n\t\t\ttargetScene.traverseVisible( function ( object ) {\n\n\t\t\t\tif ( object.isLight && object.layers.test( camera.layers ) ) {\n\n\t\t\t\t\tcurrentRenderState.pushLight( object );\n\n\t\t\t\t\tif ( object.castShadow ) {\n\n\t\t\t\t\t\tcurrentRenderState.pushShadow( object );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t\tif ( scene !== targetScene ) {\n\n\t\t\t\tscene.traverseVisible( function ( object ) {\n\n\t\t\t\t\tif ( object.isLight && object.layers.test( camera.layers ) ) {\n\n\t\t\t\t\t\tcurrentRenderState.pushLight( object );\n\n\t\t\t\t\t\tif ( object.castShadow ) {\n\n\t\t\t\t\t\t\tcurrentRenderState.pushShadow( object );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tcurrentRenderState.setupLights();\n\n\t\t\t// Only initialize materials in the new scene, not the targetScene.\n\n\t\t\tconst materials = new Set();\n\n\t\t\tscene.traverse( function ( object ) {\n\n\t\t\t\tif ( ! ( object.isMesh || object.isPoints || object.isLine || object.isSprite ) ) {\n\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tconst material = object.material;\n\n\t\t\t\tif ( material ) {\n\n\t\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\t\tfor ( let i = 0; i < material.length; i ++ ) {\n\n\t\t\t\t\t\t\tconst material2 = material[ i ];\n\n\t\t\t\t\t\t\tprepareMaterial( material2, targetScene, object );\n\t\t\t\t\t\t\tmaterials.add( material2 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tprepareMaterial( material, targetScene, object );\n\t\t\t\t\t\tmaterials.add( material );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t\tcurrentRenderState = renderStateStack.pop();\n\n\t\t\treturn materials;\n\n\t\t};\n\n\t\t// compileAsync\n\n\t\t/**\n\t\t * Asynchronous version of {@link WebGLRenderer#compile}.\n\t\t *\n\t\t * This method makes use of the `KHR_parallel_shader_compile` WebGL extension. Hence,\n\t\t * it is recommended to use this version of `compile()` whenever possible.\n\t\t *\n\t\t * @async\n\t\t * @param {Object3D} scene - The scene or another type of 3D object to precompile.\n\t\t * @param {Camera} camera - The camera.\n\t\t * @param {?Scene} [targetScene=null] - The target scene.\n\t\t * @return {Promise} A Promise that resolves when the given scene can be rendered without unnecessary stalling due to shader compilation.\n\t\t */\n\t\tthis.compileAsync = function ( scene, camera, targetScene = null ) {\n\n\t\t\tconst materials = this.compile( scene, camera, targetScene );\n\n\t\t\t// Wait for all the materials in the new object to indicate that they're\n\t\t\t// ready to be used before resolving the promise.\n\n\t\t\treturn new Promise( ( resolve ) => {\n\n\t\t\t\tfunction checkMaterialsReady() {\n\n\t\t\t\t\tmaterials.forEach( function ( material ) {\n\n\t\t\t\t\t\tconst materialProperties = properties.get( material );\n\t\t\t\t\t\tconst program = materialProperties.currentProgram;\n\n\t\t\t\t\t\tif ( program.isReady() ) {\n\n\t\t\t\t\t\t\t// remove any programs that report they're ready to use from the list\n\t\t\t\t\t\t\tmaterials.delete( material );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} );\n\n\t\t\t\t\t// once the list of compiling materials is empty, call the callback\n\n\t\t\t\t\tif ( materials.size === 0 ) {\n\n\t\t\t\t\t\tresolve( scene );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// if some materials are still not ready, wait a bit and check again\n\n\t\t\t\t\tsetTimeout( checkMaterialsReady, 10 );\n\n\t\t\t\t}\n\n\t\t\t\tif ( extensions.get( 'KHR_parallel_shader_compile' ) !== null ) {\n\n\t\t\t\t\t// If we can check the compilation status of the materials without\n\t\t\t\t\t// blocking then do so right away.\n\n\t\t\t\t\tcheckMaterialsReady();\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Otherwise start by waiting a bit to give the materials we just\n\t\t\t\t\t// initialized a chance to finish.\n\n\t\t\t\t\tsetTimeout( checkMaterialsReady, 10 );\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t};\n\n\t\t// Animation Loop\n\n\t\tlet onAnimationFrameCallback = null;\n\n\t\tfunction onAnimationFrame( time ) {\n\n\t\t\tif ( onAnimationFrameCallback ) onAnimationFrameCallback( time );\n\n\t\t}\n\n\t\tfunction onXRSessionStart() {\n\n\t\t\tanimation.stop();\n\n\t\t}\n\n\t\tfunction onXRSessionEnd() {\n\n\t\t\tanimation.start();\n\n\t\t}\n\n\t\tconst animation = new WebGLAnimation();\n\t\tanimation.setAnimationLoop( onAnimationFrame );\n\n\t\tif ( typeof self !== 'undefined' ) animation.setContext( self );\n\n\t\t/**\n\t\t * Applications are advised to always define the animation loop\n\t\t * with this method and not manually with `requestAnimationFrame()`\n\t\t * for best compatibility.\n\t\t *\n\t\t * @param {?onAnimationCallback} callback - The application's animation loop.\n\t\t */\n\t\tthis.setAnimationLoop = function ( callback ) {\n\n\t\t\tonAnimationFrameCallback = callback;\n\t\t\txr.setAnimationLoop( callback );\n\n\t\t\t( callback === null ) ? animation.stop() : animation.start();\n\n\t\t};\n\n\t\txr.addEventListener( 'sessionstart', onXRSessionStart );\n\t\txr.addEventListener( 'sessionend', onXRSessionEnd );\n\n\t\t// Rendering\n\n\t\t/**\n\t\t * Renders the given scene (or other type of 3D object) using the given camera.\n\t\t *\n\t\t * The render is done to a previously specified render target set by calling {@link WebGLRenderer#setRenderTarget}\n\t\t * or to the canvas as usual.\n\t\t *\n\t\t * By default render buffers are cleared before rendering but you can prevent\n\t\t * this by setting the property `autoClear` to `false`. If you want to prevent\n\t\t * only certain buffers being cleared you can `autoClearColor`, `autoClearDepth`\n\t\t * or `autoClearStencil` to `false`. To force a clear, use {@link WebGLRenderer#clear}.\n\t\t *\n\t\t * @param {Object3D} scene - The scene to render.\n\t\t * @param {Camera} camera - The camera.\n\t\t */\n\t\tthis.render = function ( scene, camera ) {\n\n\t\t\tif ( camera !== undefined && camera.isCamera !== true ) {\n\n\t\t\t\terror( 'WebGLRenderer.render: camera is not an instance of THREE.Camera.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( _isContextLost === true ) return;\n\n\t\t\t// update scene graph\n\n\t\t\tif ( scene.matrixWorldAutoUpdate === true ) scene.updateMatrixWorld();\n\n\t\t\t// update camera matrices and frustum\n\n\t\t\tif ( camera.parent === null && camera.matrixWorldAutoUpdate === true ) camera.updateMatrixWorld();\n\n\t\t\tif ( xr.enabled === true && xr.isPresenting === true ) {\n\n\t\t\t\tif ( xr.cameraAutoUpdate === true ) xr.updateCamera( camera );\n\n\t\t\t\tcamera = xr.getCamera(); // use XR camera for rendering\n\n\t\t\t}\n\n\t\t\t//\n\t\t\tif ( scene.isScene === true ) scene.onBeforeRender( _this, scene, camera, _currentRenderTarget );\n\n\t\t\tcurrentRenderState = renderStates.get( scene, renderStateStack.length );\n\t\t\tcurrentRenderState.init( camera );\n\n\t\t\trenderStateStack.push( currentRenderState );\n\n\t\t\t_projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );\n\t\t\t_frustum.setFromProjectionMatrix( _projScreenMatrix, WebGLCoordinateSystem, camera.reversedDepth );\n\n\t\t\t_localClippingEnabled = this.localClippingEnabled;\n\t\t\t_clippingEnabled = clipping.init( this.clippingPlanes, _localClippingEnabled );\n\n\t\t\tcurrentRenderList = renderLists.get( scene, renderListStack.length );\n\t\t\tcurrentRenderList.init();\n\n\t\t\trenderListStack.push( currentRenderList );\n\n\t\t\tif ( xr.enabled === true && xr.isPresenting === true ) {\n\n\t\t\t\tconst depthSensingMesh = _this.xr.getDepthSensingMesh();\n\n\t\t\t\tif ( depthSensingMesh !== null ) {\n\n\t\t\t\t\tprojectObject( depthSensingMesh, camera, - Infinity, _this.sortObjects );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tprojectObject( scene, camera, 0, _this.sortObjects );\n\n\t\t\tcurrentRenderList.finish();\n\n\t\t\tif ( _this.sortObjects === true ) {\n\n\t\t\t\tcurrentRenderList.sort( _opaqueSort, _transparentSort );\n\n\t\t\t}\n\n\t\t\t_renderBackground = xr.enabled === false || xr.isPresenting === false || xr.hasDepthSensing() === false;\n\t\t\tif ( _renderBackground ) {\n\n\t\t\t\tbackground.addToRenderList( currentRenderList, scene );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tthis.info.render.frame ++;\n\n\t\t\tif ( _clippingEnabled === true ) clipping.beginShadows();\n\n\t\t\tconst shadowsArray = currentRenderState.state.shadowsArray;\n\n\t\t\tshadowMap.render( shadowsArray, scene, camera );\n\n\t\t\tif ( _clippingEnabled === true ) clipping.endShadows();\n\n\t\t\t//\n\n\t\t\tif ( this.info.autoReset === true ) this.info.reset();\n\n\t\t\t// render scene\n\n\t\t\tconst opaqueObjects = currentRenderList.opaque;\n\t\t\tconst transmissiveObjects = currentRenderList.transmissive;\n\n\t\t\tcurrentRenderState.setupLights();\n\n\t\t\tif ( camera.isArrayCamera ) {\n\n\t\t\t\tconst cameras = camera.cameras;\n\n\t\t\t\tif ( transmissiveObjects.length > 0 ) {\n\n\t\t\t\t\tfor ( let i = 0, l = cameras.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tconst camera2 = cameras[ i ];\n\n\t\t\t\t\t\trenderTransmissionPass( opaqueObjects, transmissiveObjects, scene, camera2 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( _renderBackground ) background.render( scene );\n\n\t\t\t\tfor ( let i = 0, l = cameras.length; i < l; i ++ ) {\n\n\t\t\t\t\tconst camera2 = cameras[ i ];\n\n\t\t\t\t\trenderScene( currentRenderList, scene, camera2, camera2.viewport );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( transmissiveObjects.length > 0 ) renderTransmissionPass( opaqueObjects, transmissiveObjects, scene, camera );\n\n\t\t\t\tif ( _renderBackground ) background.render( scene );\n\n\t\t\t\trenderScene( currentRenderList, scene, camera );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( _currentRenderTarget !== null && _currentActiveMipmapLevel === 0 ) {\n\n\t\t\t\t// resolve multisample renderbuffers to a single-sample texture if necessary\n\n\t\t\t\ttextures.updateMultisampleRenderTarget( _currentRenderTarget );\n\n\t\t\t\t// Generate mipmap if we're using any kind of mipmap filtering\n\n\t\t\t\ttextures.updateRenderTargetMipmap( _currentRenderTarget );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( scene.isScene === true ) scene.onAfterRender( _this, scene, camera );\n\n\t\t\t// _gl.finish();\n\n\t\t\tbindingStates.resetDefaultState();\n\t\t\t_currentMaterialId = -1;\n\t\t\t_currentCamera = null;\n\n\t\t\trenderStateStack.pop();\n\n\t\t\tif ( renderStateStack.length > 0 ) {\n\n\t\t\t\tcurrentRenderState = renderStateStack[ renderStateStack.length - 1 ];\n\n\t\t\t\tif ( _clippingEnabled === true ) clipping.setGlobalState( _this.clippingPlanes, currentRenderState.state.camera );\n\n\t\t\t} else {\n\n\t\t\t\tcurrentRenderState = null;\n\n\t\t\t}\n\n\t\t\trenderListStack.pop();\n\n\t\t\tif ( renderListStack.length > 0 ) {\n\n\t\t\t\tcurrentRenderList = renderListStack[ renderListStack.length - 1 ];\n\n\t\t\t} else {\n\n\t\t\t\tcurrentRenderList = null;\n\n\t\t\t}\n\n\t\t};\n\n\t\tfunction projectObject( object, camera, groupOrder, sortObjects ) {\n\n\t\t\tif ( object.visible === false ) return;\n\n\t\t\tconst visible = object.layers.test( camera.layers );\n\n\t\t\tif ( visible ) {\n\n\t\t\t\tif ( object.isGroup ) {\n\n\t\t\t\t\tgroupOrder = object.renderOrder;\n\n\t\t\t\t} else if ( object.isLOD ) {\n\n\t\t\t\t\tif ( object.autoUpdate === true ) object.update( camera );\n\n\t\t\t\t} else if ( object.isLight ) {\n\n\t\t\t\t\tcurrentRenderState.pushLight( object );\n\n\t\t\t\t\tif ( object.castShadow ) {\n\n\t\t\t\t\t\tcurrentRenderState.pushShadow( object );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( object.isSprite ) {\n\n\t\t\t\t\tif ( ! object.frustumCulled || _frustum.intersectsSprite( object ) ) {\n\n\t\t\t\t\t\tif ( sortObjects ) {\n\n\t\t\t\t\t\t\t_vector4.setFromMatrixPosition( object.matrixWorld )\n\t\t\t\t\t\t\t\t.applyMatrix4( _projScreenMatrix );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst geometry = objects.update( object );\n\t\t\t\t\t\tconst material = object.material;\n\n\t\t\t\t\t\tif ( material.visible ) {\n\n\t\t\t\t\t\t\tcurrentRenderList.push( object, geometry, material, groupOrder, _vector4.z, null );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( object.isMesh || object.isLine || object.isPoints ) {\n\n\t\t\t\t\tif ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) {\n\n\t\t\t\t\t\tconst geometry = objects.update( object );\n\t\t\t\t\t\tconst material = object.material;\n\n\t\t\t\t\t\tif ( sortObjects ) {\n\n\t\t\t\t\t\t\tif ( object.boundingSphere !== undefined ) {\n\n\t\t\t\t\t\t\t\tif ( object.boundingSphere === null ) object.computeBoundingSphere();\n\t\t\t\t\t\t\t\t_vector4.copy( object.boundingSphere.center );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\t\t\t\t\t\t\t\t_vector4.copy( geometry.boundingSphere.center );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t_vector4\n\t\t\t\t\t\t\t\t.applyMatrix4( object.matrixWorld )\n\t\t\t\t\t\t\t\t.applyMatrix4( _projScreenMatrix );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\t\t\tconst groups = geometry.groups;\n\n\t\t\t\t\t\t\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\t\t\t\t\t\tconst group = groups[ i ];\n\t\t\t\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\t\t\t\tif ( groupMaterial && groupMaterial.visible ) {\n\n\t\t\t\t\t\t\t\t\tcurrentRenderList.push( object, geometry, groupMaterial, groupOrder, _vector4.z, group );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else if ( material.visible ) {\n\n\t\t\t\t\t\t\tcurrentRenderList.push( object, geometry, material, groupOrder, _vector4.z, null );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst children = object.children;\n\n\t\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tprojectObject( children[ i ], camera, groupOrder, sortObjects );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction renderScene( currentRenderList, scene, camera, viewport ) {\n\n\t\t\tconst { opaque: opaqueObjects, transmissive: transmissiveObjects, transparent: transparentObjects } = currentRenderList;\n\n\t\t\tcurrentRenderState.setupLightsView( camera );\n\n\t\t\tif ( _clippingEnabled === true ) clipping.setGlobalState( _this.clippingPlanes, camera );\n\n\t\t\tif ( viewport ) state.viewport( _currentViewport.copy( viewport ) );\n\n\t\t\tif ( opaqueObjects.length > 0 ) renderObjects( opaqueObjects, scene, camera );\n\t\t\tif ( transmissiveObjects.length > 0 ) renderObjects( transmissiveObjects, scene, camera );\n\t\t\tif ( transparentObjects.length > 0 ) renderObjects( transparentObjects, scene, camera );\n\n\t\t\t// Ensure depth buffer writing is enabled so it can be cleared on next render\n\n\t\t\tstate.buffers.depth.setTest( true );\n\t\t\tstate.buffers.depth.setMask( true );\n\t\t\tstate.buffers.color.setMask( true );\n\n\t\t\tstate.setPolygonOffset( false );\n\n\t\t}\n\n\t\tfunction renderTransmissionPass( opaqueObjects, transmissiveObjects, scene, camera ) {\n\n\t\t\tconst overrideMaterial = scene.isScene === true ? scene.overrideMaterial : null;\n\n\t\t\tif ( overrideMaterial !== null ) {\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( currentRenderState.state.transmissionRenderTarget[ camera.id ] === undefined ) {\n\n\t\t\t\tcurrentRenderState.state.transmissionRenderTarget[ camera.id ] = new WebGLRenderTarget( 1, 1, {\n\t\t\t\t\tgenerateMipmaps: true,\n\t\t\t\t\ttype: ( extensions.has( 'EXT_color_buffer_half_float' ) || extensions.has( 'EXT_color_buffer_float' ) ) ? HalfFloatType : UnsignedByteType,\n\t\t\t\t\tminFilter: LinearMipmapLinearFilter,\n\t\t\t\t\tsamples: 4,\n\t\t\t\t\tstencilBuffer: stencil,\n\t\t\t\t\tresolveDepthBuffer: false,\n\t\t\t\t\tresolveStencilBuffer: false,\n\t\t\t\t\tcolorSpace: ColorManagement.workingColorSpace,\n\t\t\t\t} );\n\n\t\t\t\t// debug\n\n\t\t\t\t/*\n\t\t\t\tconst geometry = new PlaneGeometry();\n\t\t\t\tconst material = new MeshBasicMaterial( { map: _transmissionRenderTarget.texture } );\n\n\t\t\t\tconst mesh = new Mesh( geometry, material );\n\t\t\t\tscene.add( mesh );\n\t\t\t\t*/\n\n\t\t\t}\n\n\t\t\tconst transmissionRenderTarget = currentRenderState.state.transmissionRenderTarget[ camera.id ];\n\n\t\t\tconst activeViewport = camera.viewport || _currentViewport;\n\t\t\ttransmissionRenderTarget.setSize( activeViewport.z * _this.transmissionResolutionScale, activeViewport.w * _this.transmissionResolutionScale );\n\n\t\t\t//\n\n\t\t\tconst currentRenderTarget = _this.getRenderTarget();\n\t\t\tconst currentActiveCubeFace = _this.getActiveCubeFace();\n\t\t\tconst currentActiveMipmapLevel = _this.getActiveMipmapLevel();\n\n\t\t\t_this.setRenderTarget( transmissionRenderTarget );\n\n\t\t\t_this.getClearColor( _currentClearColor );\n\t\t\t_currentClearAlpha = _this.getClearAlpha();\n\t\t\tif ( _currentClearAlpha < 1 ) _this.setClearColor( 0xffffff, 0.5 );\n\n\t\t\t_this.clear();\n\n\t\t\tif ( _renderBackground ) background.render( scene );\n\n\t\t\t// Turn off the features which can affect the frag color for opaque objects pass.\n\t\t\t// Otherwise they are applied twice in opaque objects pass and transmission objects pass.\n\t\t\tconst currentToneMapping = _this.toneMapping;\n\t\t\t_this.toneMapping = NoToneMapping;\n\n\t\t\t// Remove viewport from camera to avoid nested render calls resetting viewport to it (e.g Reflector).\n\t\t\t// Transmission render pass requires viewport to match the transmissionRenderTarget.\n\t\t\tconst currentCameraViewport = camera.viewport;\n\t\t\tif ( camera.viewport !== undefined ) camera.viewport = undefined;\n\n\t\t\tcurrentRenderState.setupLightsView( camera );\n\n\t\t\tif ( _clippingEnabled === true ) clipping.setGlobalState( _this.clippingPlanes, camera );\n\n\t\t\trenderObjects( opaqueObjects, scene, camera );\n\n\t\t\ttextures.updateMultisampleRenderTarget( transmissionRenderTarget );\n\t\t\ttextures.updateRenderTargetMipmap( transmissionRenderTarget );\n\n\t\t\tif ( extensions.has( 'WEBGL_multisampled_render_to_texture' ) === false ) { // see #28131\n\n\t\t\t\tlet renderTargetNeedsUpdate = false;\n\n\t\t\t\tfor ( let i = 0, l = transmissiveObjects.length; i < l; i ++ ) {\n\n\t\t\t\t\tconst renderItem = transmissiveObjects[ i ];\n\n\t\t\t\t\tconst { object, geometry, material, group } = renderItem;\n\n\t\t\t\t\tif ( material.side === DoubleSide && object.layers.test( camera.layers ) ) {\n\n\t\t\t\t\t\tconst currentSide = material.side;\n\n\t\t\t\t\t\tmaterial.side = BackSide;\n\t\t\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t\t\t\trenderObject( object, scene, camera, geometry, material, group );\n\n\t\t\t\t\t\tmaterial.side = currentSide;\n\t\t\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t\t\t\trenderTargetNeedsUpdate = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( renderTargetNeedsUpdate === true ) {\n\n\t\t\t\t\ttextures.updateMultisampleRenderTarget( transmissionRenderTarget );\n\t\t\t\t\ttextures.updateRenderTargetMipmap( transmissionRenderTarget );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_this.setRenderTarget( currentRenderTarget, currentActiveCubeFace, currentActiveMipmapLevel );\n\n\t\t\t_this.setClearColor( _currentClearColor, _currentClearAlpha );\n\n\t\t\tif ( currentCameraViewport !== undefined ) camera.viewport = currentCameraViewport;\n\n\t\t\t_this.toneMapping = currentToneMapping;\n\n\t\t}\n\n\t\tfunction renderObjects( renderList, scene, camera ) {\n\n\t\t\tconst overrideMaterial = scene.isScene === true ? scene.overrideMaterial : null;\n\n\t\t\tfor ( let i = 0, l = renderList.length; i < l; i ++ ) {\n\n\t\t\t\tconst renderItem = renderList[ i ];\n\n\t\t\t\tconst { object, geometry, group } = renderItem;\n\t\t\t\tlet material = renderItem.material;\n\n\t\t\t\tif ( material.allowOverride === true && overrideMaterial !== null ) {\n\n\t\t\t\t\tmaterial = overrideMaterial;\n\n\t\t\t\t}\n\n\t\t\t\tif ( object.layers.test( camera.layers ) ) {\n\n\t\t\t\t\trenderObject( object, scene, camera, geometry, material, group );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction renderObject( object, scene, camera, geometry, material, group ) {\n\n\t\t\tobject.onBeforeRender( _this, scene, camera, geometry, material, group );\n\n\t\t\tobject.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );\n\t\t\tobject.normalMatrix.getNormalMatrix( object.modelViewMatrix );\n\n\t\t\tmaterial.onBeforeRender( _this, scene, camera, geometry, object, group );\n\n\t\t\tif ( material.transparent === true && material.side === DoubleSide && material.forceSinglePass === false ) {\n\n\t\t\t\tmaterial.side = BackSide;\n\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t\t_this.renderBufferDirect( camera, scene, geometry, material, object, group );\n\n\t\t\t\tmaterial.side = FrontSide;\n\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t\t_this.renderBufferDirect( camera, scene, geometry, material, object, group );\n\n\t\t\t\tmaterial.side = DoubleSide;\n\n\t\t\t} else {\n\n\t\t\t\t_this.renderBufferDirect( camera, scene, geometry, material, object, group );\n\n\t\t\t}\n\n\t\t\tobject.onAfterRender( _this, scene, camera, geometry, material, group );\n\n\t\t}\n\n\t\tfunction getProgram( material, scene, object ) {\n\n\t\t\tif ( scene.isScene !== true ) scene = _emptyScene; // scene could be a Mesh, Line, Points, ...\n\n\t\t\tconst materialProperties = properties.get( material );\n\n\t\t\tconst lights = currentRenderState.state.lights;\n\t\t\tconst shadowsArray = currentRenderState.state.shadowsArray;\n\n\t\t\tconst lightsStateVersion = lights.state.version;\n\n\t\t\tconst parameters = programCache.getParameters( material, lights.state, shadowsArray, scene, object );\n\t\t\tconst programCacheKey = programCache.getProgramCacheKey( parameters );\n\n\t\t\tlet programs = materialProperties.programs;\n\n\t\t\t// always update environment and fog - changing these trigger an getProgram call, but it's possible that the program doesn't change\n\n\t\t\tmaterialProperties.environment = material.isMeshStandardMaterial ? scene.environment : null;\n\t\t\tmaterialProperties.fog = scene.fog;\n\t\t\tmaterialProperties.envMap = ( material.isMeshStandardMaterial ? cubeuvmaps : cubemaps ).get( material.envMap || materialProperties.environment );\n\t\t\tmaterialProperties.envMapRotation = ( materialProperties.environment !== null && material.envMap === null ) ? scene.environmentRotation : material.envMapRotation;\n\n\t\t\tif ( programs === undefined ) {\n\n\t\t\t\t// new material\n\n\t\t\t\tmaterial.addEventListener( 'dispose', onMaterialDispose );\n\n\t\t\t\tprograms = new Map();\n\t\t\t\tmaterialProperties.programs = programs;\n\n\t\t\t}\n\n\t\t\tlet program = programs.get( programCacheKey );\n\n\t\t\tif ( program !== undefined ) {\n\n\t\t\t\t// early out if program and light state is identical\n\n\t\t\t\tif ( materialProperties.currentProgram === program && materialProperties.lightsStateVersion === lightsStateVersion ) {\n\n\t\t\t\t\tupdateCommonMaterialProperties( material, parameters );\n\n\t\t\t\t\treturn program;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tparameters.uniforms = programCache.getUniforms( material );\n\n\t\t\t\tmaterial.onBeforeCompile( parameters, _this );\n\n\t\t\t\tprogram = programCache.acquireProgram( parameters, programCacheKey );\n\t\t\t\tprograms.set( programCacheKey, program );\n\n\t\t\t\tmaterialProperties.uniforms = parameters.uniforms;\n\n\t\t\t}\n\n\t\t\tconst uniforms = materialProperties.uniforms;\n\n\t\t\tif ( ( ! material.isShaderMaterial && ! material.isRawShaderMaterial ) || material.clipping === true ) {\n\n\t\t\t\tuniforms.clippingPlanes = clipping.uniform;\n\n\t\t\t}\n\n\t\t\tupdateCommonMaterialProperties( material, parameters );\n\n\t\t\t// store the light setup it was created for\n\n\t\t\tmaterialProperties.needsLights = materialNeedsLights( material );\n\t\t\tmaterialProperties.lightsStateVersion = lightsStateVersion;\n\n\t\t\tif ( materialProperties.needsLights ) {\n\n\t\t\t\t// wire up the material to this renderer's lighting state\n\n\t\t\t\tuniforms.ambientLightColor.value = lights.state.ambient;\n\t\t\t\tuniforms.lightProbe.value = lights.state.probe;\n\t\t\t\tuniforms.directionalLights.value = lights.state.directional;\n\t\t\t\tuniforms.directionalLightShadows.value = lights.state.directionalShadow;\n\t\t\t\tuniforms.spotLights.value = lights.state.spot;\n\t\t\t\tuniforms.spotLightShadows.value = lights.state.spotShadow;\n\t\t\t\tuniforms.rectAreaLights.value = lights.state.rectArea;\n\t\t\t\tuniforms.ltc_1.value = lights.state.rectAreaLTC1;\n\t\t\t\tuniforms.ltc_2.value = lights.state.rectAreaLTC2;\n\t\t\t\tuniforms.pointLights.value = lights.state.point;\n\t\t\t\tuniforms.pointLightShadows.value = lights.state.pointShadow;\n\t\t\t\tuniforms.hemisphereLights.value = lights.state.hemi;\n\n\t\t\t\tuniforms.directionalShadowMap.value = lights.state.directionalShadowMap;\n\t\t\t\tuniforms.directionalShadowMatrix.value = lights.state.directionalShadowMatrix;\n\t\t\t\tuniforms.spotShadowMap.value = lights.state.spotShadowMap;\n\t\t\t\tuniforms.spotLightMatrix.value = lights.state.spotLightMatrix;\n\t\t\t\tuniforms.spotLightMap.value = lights.state.spotLightMap;\n\t\t\t\tuniforms.pointShadowMap.value = lights.state.pointShadowMap;\n\t\t\t\tuniforms.pointShadowMatrix.value = lights.state.pointShadowMatrix;\n\t\t\t\t// TODO (abelnation): add area lights shadow info to uniforms\n\n\t\t\t}\n\n\t\t\tmaterialProperties.currentProgram = program;\n\t\t\tmaterialProperties.uniformsList = null;\n\n\t\t\treturn program;\n\n\t\t}\n\n\t\tfunction getUniformList( materialProperties ) {\n\n\t\t\tif ( materialProperties.uniformsList === null ) {\n\n\t\t\t\tconst progUniforms = materialProperties.currentProgram.getUniforms();\n\t\t\t\tmaterialProperties.uniformsList = WebGLUniforms.seqWithValue( progUniforms.seq, materialProperties.uniforms );\n\n\t\t\t}\n\n\t\t\treturn materialProperties.uniformsList;\n\n\t\t}\n\n\t\tfunction updateCommonMaterialProperties( material, parameters ) {\n\n\t\t\tconst materialProperties = properties.get( material );\n\n\t\t\tmaterialProperties.outputColorSpace = parameters.outputColorSpace;\n\t\t\tmaterialProperties.batching = parameters.batching;\n\t\t\tmaterialProperties.batchingColor = parameters.batchingColor;\n\t\t\tmaterialProperties.instancing = parameters.instancing;\n\t\t\tmaterialProperties.instancingColor = parameters.instancingColor;\n\t\t\tmaterialProperties.instancingMorph = parameters.instancingMorph;\n\t\t\tmaterialProperties.skinning = parameters.skinning;\n\t\t\tmaterialProperties.morphTargets = parameters.morphTargets;\n\t\t\tmaterialProperties.morphNormals = parameters.morphNormals;\n\t\t\tmaterialProperties.morphColors = parameters.morphColors;\n\t\t\tmaterialProperties.morphTargetsCount = parameters.morphTargetsCount;\n\t\t\tmaterialProperties.numClippingPlanes = parameters.numClippingPlanes;\n\t\t\tmaterialProperties.numIntersection = parameters.numClipIntersection;\n\t\t\tmaterialProperties.vertexAlphas = parameters.vertexAlphas;\n\t\t\tmaterialProperties.vertexTangents = parameters.vertexTangents;\n\t\t\tmaterialProperties.toneMapping = parameters.toneMapping;\n\n\t\t}\n\n\t\tfunction setProgram( camera, scene, geometry, material, object ) {\n\n\t\t\tif ( scene.isScene !== true ) scene = _emptyScene; // scene could be a Mesh, Line, Points, ...\n\n\t\t\ttextures.resetTextureUnits();\n\n\t\t\tconst fog = scene.fog;\n\t\t\tconst environment = material.isMeshStandardMaterial ? scene.environment : null;\n\t\t\tconst colorSpace = ( _currentRenderTarget === null ) ? _this.outputColorSpace : ( _currentRenderTarget.isXRRenderTarget === true ? _currentRenderTarget.texture.colorSpace : LinearSRGBColorSpace );\n\t\t\tconst envMap = ( material.isMeshStandardMaterial ? cubeuvmaps : cubemaps ).get( material.envMap || environment );\n\t\t\tconst vertexAlphas = material.vertexColors === true && !! geometry.attributes.color && geometry.attributes.color.itemSize === 4;\n\t\t\tconst vertexTangents = !! geometry.attributes.tangent && ( !! material.normalMap || material.anisotropy > 0 );\n\t\t\tconst morphTargets = !! geometry.morphAttributes.position;\n\t\t\tconst morphNormals = !! geometry.morphAttributes.normal;\n\t\t\tconst morphColors = !! geometry.morphAttributes.color;\n\n\t\t\tlet toneMapping = NoToneMapping;\n\n\t\t\tif ( material.toneMapped ) {\n\n\t\t\t\tif ( _currentRenderTarget === null || _currentRenderTarget.isXRRenderTarget === true ) {\n\n\t\t\t\t\ttoneMapping = _this.toneMapping;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst morphAttribute = geometry.morphAttributes.position || geometry.morphAttributes.normal || geometry.morphAttributes.color;\n\t\t\tconst morphTargetsCount = ( morphAttribute !== undefined ) ? morphAttribute.length : 0;\n\n\t\t\tconst materialProperties = properties.get( material );\n\t\t\tconst lights = currentRenderState.state.lights;\n\n\t\t\tif ( _clippingEnabled === true ) {\n\n\t\t\t\tif ( _localClippingEnabled === true || camera !== _currentCamera ) {\n\n\t\t\t\t\tconst useCache =\n\t\t\t\t\t\tcamera === _currentCamera &&\n\t\t\t\t\t\tmaterial.id === _currentMaterialId;\n\n\t\t\t\t\t// we might want to call this function with some ClippingGroup\n\t\t\t\t\t// object instead of the material, once it becomes feasible\n\t\t\t\t\t// (#8465, #8379)\n\t\t\t\t\tclipping.setState( material, camera, useCache );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tlet needsProgramChange = false;\n\n\t\t\tif ( material.version === materialProperties.__version ) {\n\n\t\t\t\tif ( materialProperties.needsLights && ( materialProperties.lightsStateVersion !== lights.state.version ) ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.outputColorSpace !== colorSpace ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isBatchedMesh && materialProperties.batching === false ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( ! object.isBatchedMesh && materialProperties.batching === true ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isBatchedMesh && materialProperties.batchingColor === true && object.colorTexture === null ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isBatchedMesh && materialProperties.batchingColor === false && object.colorTexture !== null ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isInstancedMesh && materialProperties.instancing === false ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( ! object.isInstancedMesh && materialProperties.instancing === true ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isSkinnedMesh && materialProperties.skinning === false ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( ! object.isSkinnedMesh && materialProperties.skinning === true ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isInstancedMesh && materialProperties.instancingColor === true && object.instanceColor === null ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isInstancedMesh && materialProperties.instancingColor === false && object.instanceColor !== null ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isInstancedMesh && materialProperties.instancingMorph === true && object.morphTexture === null ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isInstancedMesh && materialProperties.instancingMorph === false && object.morphTexture !== null ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.envMap !== envMap ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( material.fog === true && materialProperties.fog !== fog ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.numClippingPlanes !== undefined &&\n\t\t\t\t\t( materialProperties.numClippingPlanes !== clipping.numPlanes ||\n\t\t\t\t\tmaterialProperties.numIntersection !== clipping.numIntersection ) ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.vertexAlphas !== vertexAlphas ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.vertexTangents !== vertexTangents ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.morphTargets !== morphTargets ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.morphNormals !== morphNormals ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.morphColors !== morphColors ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.toneMapping !== toneMapping ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.morphTargetsCount !== morphTargetsCount ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tneedsProgramChange = true;\n\t\t\t\tmaterialProperties.__version = material.version;\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tlet program = materialProperties.currentProgram;\n\n\t\t\tif ( needsProgramChange === true ) {\n\n\t\t\t\tprogram = getProgram( material, scene, object );\n\n\t\t\t}\n\n\t\t\tlet refreshProgram = false;\n\t\t\tlet refreshMaterial = false;\n\t\t\tlet refreshLights = false;\n\n\t\t\tconst p_uniforms = program.getUniforms(),\n\t\t\t\tm_uniforms = materialProperties.uniforms;\n\n\t\t\tif ( state.useProgram( program.program ) ) {\n\n\t\t\t\trefreshProgram = true;\n\t\t\t\trefreshMaterial = true;\n\t\t\t\trefreshLights = true;\n\n\t\t\t}\n\n\t\t\tif ( material.id !== _currentMaterialId ) {\n\n\t\t\t\t_currentMaterialId = material.id;\n\n\t\t\t\trefreshMaterial = true;\n\n\t\t\t}\n\n\t\t\tif ( refreshProgram || _currentCamera !== camera ) {\n\n\t\t\t\t// common camera uniforms\n\n\t\t\t\tconst reversedDepthBuffer = state.buffers.depth.getReversed();\n\n\t\t\t\tif ( reversedDepthBuffer && camera.reversedDepth !== true ) {\n\n\t\t\t\t\tcamera._reversedDepth = true;\n\t\t\t\t\tcamera.updateProjectionMatrix();\n\n\t\t\t\t}\n\n\t\t\t\tp_uniforms.setValue( _gl, 'projectionMatrix', camera.projectionMatrix );\n\n\t\t\t\tp_uniforms.setValue( _gl, 'viewMatrix', camera.matrixWorldInverse );\n\n\t\t\t\tconst uCamPos = p_uniforms.map.cameraPosition;\n\n\t\t\t\tif ( uCamPos !== undefined ) {\n\n\t\t\t\t\tuCamPos.setValue( _gl, _vector3.setFromMatrixPosition( camera.matrixWorld ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( capabilities.logarithmicDepthBuffer ) {\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'logDepthBufFC',\n\t\t\t\t\t\t2.0 / ( Math.log( camera.far + 1.0 ) / Math.LN2 ) );\n\n\t\t\t\t}\n\n\t\t\t\t// consider moving isOrthographic to UniformLib and WebGLMaterials, see https://github.com/mrdoob/three.js/pull/26467#issuecomment-1645185067\n\n\t\t\t\tif ( material.isMeshPhongMaterial ||\n\t\t\t\t\tmaterial.isMeshToonMaterial ||\n\t\t\t\t\tmaterial.isMeshLambertMaterial ||\n\t\t\t\t\tmaterial.isMeshBasicMaterial ||\n\t\t\t\t\tmaterial.isMeshStandardMaterial ||\n\t\t\t\t\tmaterial.isShaderMaterial ) {\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'isOrthographic', camera.isOrthographicCamera === true );\n\n\t\t\t\t}\n\n\t\t\t\tif ( _currentCamera !== camera ) {\n\n\t\t\t\t\t_currentCamera = camera;\n\n\t\t\t\t\t// lighting uniforms depend on the camera so enforce an update\n\t\t\t\t\t// now, in case this material supports lights - or later, when\n\t\t\t\t\t// the next material that does gets activated:\n\n\t\t\t\t\trefreshMaterial = true;\t\t// set to true on material change\n\t\t\t\t\trefreshLights = true;\t\t// remains set until update done\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// skinning and morph target uniforms must be set even if material didn't change\n\t\t\t// auto-setting of texture unit for bone and morph texture must go before other textures\n\t\t\t// otherwise textures used for skinning and morphing can take over texture units reserved for other material textures\n\n\t\t\tif ( object.isSkinnedMesh ) {\n\n\t\t\t\tp_uniforms.setOptional( _gl, object, 'bindMatrix' );\n\t\t\t\tp_uniforms.setOptional( _gl, object, 'bindMatrixInverse' );\n\n\t\t\t\tconst skeleton = object.skeleton;\n\n\t\t\t\tif ( skeleton ) {\n\n\t\t\t\t\tif ( skeleton.boneTexture === null ) skeleton.computeBoneTexture();\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'boneTexture', skeleton.boneTexture, textures );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( object.isBatchedMesh ) {\n\n\t\t\t\tp_uniforms.setOptional( _gl, object, 'batchingTexture' );\n\t\t\t\tp_uniforms.setValue( _gl, 'batchingTexture', object._matricesTexture, textures );\n\n\t\t\t\tp_uniforms.setOptional( _gl, object, 'batchingIdTexture' );\n\t\t\t\tp_uniforms.setValue( _gl, 'batchingIdTexture', object._indirectTexture, textures );\n\n\t\t\t\tp_uniforms.setOptional( _gl, object, 'batchingColorTexture' );\n\t\t\t\tif ( object._colorsTexture !== null ) {\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'batchingColorTexture', object._colorsTexture, textures );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst morphAttributes = geometry.morphAttributes;\n\n\t\t\tif ( morphAttributes.position !== undefined || morphAttributes.normal !== undefined || ( morphAttributes.color !== undefined ) ) {\n\n\t\t\t\tmorphtargets.update( object, geometry, program );\n\n\t\t\t}\n\n\t\t\tif ( refreshMaterial || materialProperties.receiveShadow !== object.receiveShadow ) {\n\n\t\t\t\tmaterialProperties.receiveShadow = object.receiveShadow;\n\t\t\t\tp_uniforms.setValue( _gl, 'receiveShadow', object.receiveShadow );\n\n\t\t\t}\n\n\t\t\t// https://github.com/mrdoob/three.js/pull/24467#issuecomment-1209031512\n\n\t\t\tif ( material.isMeshGouraudMaterial && material.envMap !== null ) {\n\n\t\t\t\tm_uniforms.envMap.value = envMap;\n\n\t\t\t\tm_uniforms.flipEnvMap.value = ( envMap.isCubeTexture && envMap.isRenderTargetTexture === false ) ? -1 : 1;\n\n\t\t\t}\n\n\t\t\tif ( material.isMeshStandardMaterial && material.envMap === null && scene.environment !== null ) {\n\n\t\t\t\tm_uniforms.envMapIntensity.value = scene.environmentIntensity;\n\n\t\t\t}\n\n\t\t\t// Set DFG LUT for physically-based materials\n\t\t\tif ( m_uniforms.dfgLUT !== undefined ) {\n\n\t\t\t\tm_uniforms.dfgLUT.value = getDFGLUT();\n\n\t\t\t}\n\n\t\t\tif ( refreshMaterial ) {\n\n\t\t\t\tp_uniforms.setValue( _gl, 'toneMappingExposure', _this.toneMappingExposure );\n\n\t\t\t\tif ( materialProperties.needsLights ) {\n\n\t\t\t\t\t// the current material requires lighting info\n\n\t\t\t\t\t// note: all lighting uniforms are always set correctly\n\t\t\t\t\t// they simply reference the renderer's state for their\n\t\t\t\t\t// values\n\t\t\t\t\t//\n\t\t\t\t\t// use the current material's .needsUpdate flags to set\n\t\t\t\t\t// the GL state when required\n\n\t\t\t\t\tmarkUniformsLightsNeedsUpdate( m_uniforms, refreshLights );\n\n\t\t\t\t}\n\n\t\t\t\t// refresh uniforms common to several materials\n\n\t\t\t\tif ( fog && material.fog === true ) {\n\n\t\t\t\t\tmaterials.refreshFogUniforms( m_uniforms, fog );\n\n\t\t\t\t}\n\n\t\t\t\tmaterials.refreshMaterialUniforms( m_uniforms, material, _pixelRatio, _height, currentRenderState.state.transmissionRenderTarget[ camera.id ] );\n\n\t\t\t\tWebGLUniforms.upload( _gl, getUniformList( materialProperties ), m_uniforms, textures );\n\n\t\t\t}\n\n\t\t\tif ( material.isShaderMaterial && material.uniformsNeedUpdate === true ) {\n\n\t\t\t\tWebGLUniforms.upload( _gl, getUniformList( materialProperties ), m_uniforms, textures );\n\t\t\t\tmaterial.uniformsNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( material.isSpriteMaterial ) {\n\n\t\t\t\tp_uniforms.setValue( _gl, 'center', object.center );\n\n\t\t\t}\n\n\t\t\t// common matrices\n\n\t\t\tp_uniforms.setValue( _gl, 'modelViewMatrix', object.modelViewMatrix );\n\t\t\tp_uniforms.setValue( _gl, 'normalMatrix', object.normalMatrix );\n\t\t\tp_uniforms.setValue( _gl, 'modelMatrix', object.matrixWorld );\n\n\t\t\t// UBOs\n\n\t\t\tif ( material.isShaderMaterial || material.isRawShaderMaterial ) {\n\n\t\t\t\tconst groups = material.uniformsGroups;\n\n\t\t\t\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\t\t\tconst group = groups[ i ];\n\n\t\t\t\t\tuniformsGroups.update( group, program );\n\t\t\t\t\tuniformsGroups.bind( group, program );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn program;\n\n\t\t}\n\n\t\t// If uniforms are marked as clean, they don't need to be loaded to the GPU.\n\n\t\tfunction markUniformsLightsNeedsUpdate( uniforms, value ) {\n\n\t\t\tuniforms.ambientLightColor.needsUpdate = value;\n\t\t\tuniforms.lightProbe.needsUpdate = value;\n\n\t\t\tuniforms.directionalLights.needsUpdate = value;\n\t\t\tuniforms.directionalLightShadows.needsUpdate = value;\n\t\t\tuniforms.pointLights.needsUpdate = value;\n\t\t\tuniforms.pointLightShadows.needsUpdate = value;\n\t\t\tuniforms.spotLights.needsUpdate = value;\n\t\t\tuniforms.spotLightShadows.needsUpdate = value;\n\t\t\tuniforms.rectAreaLights.needsUpdate = value;\n\t\t\tuniforms.hemisphereLights.needsUpdate = value;\n\n\t\t}\n\n\t\tfunction materialNeedsLights( material ) {\n\n\t\t\treturn material.isMeshLambertMaterial || material.isMeshToonMaterial || material.isMeshPhongMaterial ||\n\t\t\t\tmaterial.isMeshStandardMaterial || material.isShadowMaterial ||\n\t\t\t\t( material.isShaderMaterial && material.lights === true );\n\n\t\t}\n\n\t\t/**\n\t\t * Returns the active cube face.\n\t\t *\n\t\t * @return {number} The active cube face.\n\t\t */\n\t\tthis.getActiveCubeFace = function () {\n\n\t\t\treturn _currentActiveCubeFace;\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the active mipmap level.\n\t\t *\n\t\t * @return {number} The active mipmap level.\n\t\t */\n\t\tthis.getActiveMipmapLevel = function () {\n\n\t\t\treturn _currentActiveMipmapLevel;\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the active render target.\n\t\t *\n\t\t * @return {?WebGLRenderTarget} The active render target. Returns `null` if no render target\n\t\t * is currently set.\n\t\t */\n\t\tthis.getRenderTarget = function () {\n\n\t\t\treturn _currentRenderTarget;\n\n\t\t};\n\n\t\tthis.setRenderTargetTextures = function ( renderTarget, colorTexture, depthTexture ) {\n\n\t\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\t\trenderTargetProperties.__autoAllocateDepthBuffer = renderTarget.resolveDepthBuffer === false;\n\t\t\tif ( renderTargetProperties.__autoAllocateDepthBuffer === false ) {\n\n\t\t\t\t// The multisample_render_to_texture extension doesn't work properly if there\n\t\t\t\t// are midframe flushes and an external depth buffer. Disable use of the extension.\n\t\t\t\trenderTargetProperties.__useRenderToTexture = false;\n\n\t\t\t}\n\n\t\t\tproperties.get( renderTarget.texture ).__webglTexture = colorTexture;\n\t\t\tproperties.get( renderTarget.depthTexture ).__webglTexture = renderTargetProperties.__autoAllocateDepthBuffer ? undefined : depthTexture;\n\n\t\t\trenderTargetProperties.__hasExternalTextures = true;\n\n\t\t};\n\n\t\tthis.setRenderTargetFramebuffer = function ( renderTarget, defaultFramebuffer ) {\n\n\t\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\t\trenderTargetProperties.__webglFramebuffer = defaultFramebuffer;\n\t\t\trenderTargetProperties.__useDefaultFramebuffer = defaultFramebuffer === undefined;\n\n\t\t};\n\n\t\tconst _scratchFrameBuffer = _gl.createFramebuffer();\n\n\t\t/**\n\t\t * Sets the active rendertarget.\n\t\t *\n\t\t * @param {?WebGLRenderTarget} renderTarget - The render target to set. When `null` is given,\n\t\t * the canvas is set as the active render target instead.\n\t\t * @param {number} [activeCubeFace=0] - The active cube face when using a cube render target.\n\t\t * Indicates the z layer to render in to when using 3D or array render targets.\n\t\t * @param {number} [activeMipmapLevel=0] - The active mipmap level.\n\t\t */\n\t\tthis.setRenderTarget = function ( renderTarget, activeCubeFace = 0, activeMipmapLevel = 0 ) {\n\n\t\t\t_currentRenderTarget = renderTarget;\n\t\t\t_currentActiveCubeFace = activeCubeFace;\n\t\t\t_currentActiveMipmapLevel = activeMipmapLevel;\n\n\t\t\tlet useDefaultFramebuffer = true;\n\t\t\tlet framebuffer = null;\n\t\t\tlet isCube = false;\n\t\t\tlet isRenderTarget3D = false;\n\n\t\t\tif ( renderTarget ) {\n\n\t\t\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\t\t\tif ( renderTargetProperties.__useDefaultFramebuffer !== undefined ) {\n\n\t\t\t\t\t// We need to make sure to rebind the framebuffer.\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\t\t\t\t\tuseDefaultFramebuffer = false;\n\n\t\t\t\t} else if ( renderTargetProperties.__webglFramebuffer === undefined ) {\n\n\t\t\t\t\ttextures.setupRenderTarget( renderTarget );\n\n\t\t\t\t} else if ( renderTargetProperties.__hasExternalTextures ) {\n\n\t\t\t\t\t// Color and depth texture must be rebound in order for the swapchain to update.\n\t\t\t\t\ttextures.rebindTextures( renderTarget, properties.get( renderTarget.texture ).__webglTexture, properties.get( renderTarget.depthTexture ).__webglTexture );\n\n\t\t\t\t} else if ( renderTarget.depthBuffer ) {\n\n\t\t\t\t\t// check if the depth texture is already bound to the frame buffer and that it's been initialized\n\t\t\t\t\tconst depthTexture = renderTarget.depthTexture;\n\t\t\t\t\tif ( renderTargetProperties.__boundDepthTexture !== depthTexture ) {\n\n\t\t\t\t\t\t// check if the depth texture is compatible\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tdepthTexture !== null &&\n\t\t\t\t\t\t\tproperties.has( depthTexture ) &&\n\t\t\t\t\t\t\t( renderTarget.width !== depthTexture.image.width || renderTarget.height !== depthTexture.image.height )\n\t\t\t\t\t\t) {\n\n\t\t\t\t\t\t\tthrow new Error( 'WebGLRenderTarget: Attached DepthTexture is initialized to the incorrect size.' );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Swap the depth buffer to the currently attached one\n\t\t\t\t\t\ttextures.setupDepthRenderbuffer( renderTarget );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tconst texture = renderTarget.texture;\n\n\t\t\t\tif ( texture.isData3DTexture || texture.isDataArrayTexture || texture.isCompressedArrayTexture ) {\n\n\t\t\t\t\tisRenderTarget3D = true;\n\n\t\t\t\t}\n\n\t\t\t\tconst __webglFramebuffer = properties.get( renderTarget ).__webglFramebuffer;\n\n\t\t\t\tif ( renderTarget.isWebGLCubeRenderTarget ) {\n\n\t\t\t\t\tif ( Array.isArray( __webglFramebuffer[ activeCubeFace ] ) ) {\n\n\t\t\t\t\t\tframebuffer = __webglFramebuffer[ activeCubeFace ][ activeMipmapLevel ];\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tframebuffer = __webglFramebuffer[ activeCubeFace ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\tisCube = true;\n\n\t\t\t\t} else if ( ( renderTarget.samples > 0 ) && textures.useMultisampledRTT( renderTarget ) === false ) {\n\n\t\t\t\t\tframebuffer = properties.get( renderTarget ).__webglMultisampledFramebuffer;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( Array.isArray( __webglFramebuffer ) ) {\n\n\t\t\t\t\t\tframebuffer = __webglFramebuffer[ activeMipmapLevel ];\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tframebuffer = __webglFramebuffer;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t_currentViewport.copy( renderTarget.viewport );\n\t\t\t\t_currentScissor.copy( renderTarget.scissor );\n\t\t\t\t_currentScissorTest = renderTarget.scissorTest;\n\n\t\t\t} else {\n\n\t\t\t\t_currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ).floor();\n\t\t\t\t_currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ).floor();\n\t\t\t\t_currentScissorTest = _scissorTest;\n\n\t\t\t}\n\n\t\t\t// Use a scratch frame buffer if rendering to a mip level to avoid depth buffers\n\t\t\t// being bound that are different sizes.\n\t\t\tif ( activeMipmapLevel !== 0 ) {\n\n\t\t\t\tframebuffer = _scratchFrameBuffer;\n\n\t\t\t}\n\n\t\t\tconst framebufferBound = state.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\t\tif ( framebufferBound && useDefaultFramebuffer ) {\n\n\t\t\t\tstate.drawBuffers( renderTarget, framebuffer );\n\n\t\t\t}\n\n\t\t\tstate.viewport( _currentViewport );\n\t\t\tstate.scissor( _currentScissor );\n\t\t\tstate.setScissorTest( _currentScissorTest );\n\n\t\t\tif ( isCube ) {\n\n\t\t\t\tconst textureProperties = properties.get( renderTarget.texture );\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + activeCubeFace, textureProperties.__webglTexture, activeMipmapLevel );\n\n\t\t\t} else if ( isRenderTarget3D ) {\n\n\t\t\t\tconst layer = activeCubeFace;\n\n\t\t\t\tfor ( let i = 0; i < renderTarget.textures.length; i ++ ) {\n\n\t\t\t\t\tconst textureProperties = properties.get( renderTarget.textures[ i ] );\n\n\t\t\t\t\t_gl.framebufferTextureLayer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, textureProperties.__webglTexture, activeMipmapLevel, layer );\n\n\t\t\t\t}\n\n\t\t\t} else if ( renderTarget !== null && activeMipmapLevel !== 0 ) {\n\n\t\t\t\t// Only bind the frame buffer if we are using a scratch frame buffer to render to a mipmap.\n\t\t\t\t// If we rebind the texture when using a multi sample buffer then an error about inconsistent samples will be thrown.\n\t\t\t\tconst textureProperties = properties.get( renderTarget.texture );\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, textureProperties.__webglTexture, activeMipmapLevel );\n\n\t\t\t}\n\n\t\t\t_currentMaterialId = -1; // reset current material to ensure correct uniform bindings\n\n\t\t};\n\n\t\t/**\n\t\t * Reads the pixel data from the given render target into the given buffer.\n\t\t *\n\t\t * @param {WebGLRenderTarget} renderTarget - The render target to read from.\n\t\t * @param {number} x - The `x` coordinate of the copy region's origin.\n\t\t * @param {number} y - The `y` coordinate of the copy region's origin.\n\t\t * @param {number} width - The width of the copy region.\n\t\t * @param {number} height - The height of the copy region.\n\t\t * @param {TypedArray} buffer - The result buffer.\n\t\t * @param {number} [activeCubeFaceIndex] - The active cube face index.\n\t\t * @param {number} [textureIndex=0] - The texture index of an MRT render target.\n\t\t */\n\t\tthis.readRenderTargetPixels = function ( renderTarget, x, y, width, height, buffer, activeCubeFaceIndex, textureIndex = 0 ) {\n\n\t\t\tif ( ! ( renderTarget && renderTarget.isWebGLRenderTarget ) ) {\n\n\t\t\t\terror( 'WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tlet framebuffer = properties.get( renderTarget ).__webglFramebuffer;\n\n\t\t\tif ( renderTarget.isWebGLCubeRenderTarget && activeCubeFaceIndex !== undefined ) {\n\n\t\t\t\tframebuffer = framebuffer[ activeCubeFaceIndex ];\n\n\t\t\t}\n\n\t\t\tif ( framebuffer ) {\n\n\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\t\t\ttry {\n\n\t\t\t\t\tconst texture = renderTarget.textures[ textureIndex ];\n\t\t\t\t\tconst textureFormat = texture.format;\n\t\t\t\t\tconst textureType = texture.type;\n\n\t\t\t\t\tif ( ! capabilities.textureFormatReadable( textureFormat ) ) {\n\n\t\t\t\t\t\terror( 'WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.' );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! capabilities.textureTypeReadable( textureType ) ) {\n\n\t\t\t\t\t\terror( 'WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.' );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// the following if statement ensures valid read requests (no out-of-bounds pixels, see #8604)\n\n\t\t\t\t\tif ( ( x >= 0 && x <= ( renderTarget.width - width ) ) && ( y >= 0 && y <= ( renderTarget.height - height ) ) ) {\n\n\t\t\t\t\t\t// when using MRT, select the correct color buffer for the subsequent read command\n\n\t\t\t\t\t\tif ( renderTarget.textures.length > 1 ) _gl.readBuffer( _gl.COLOR_ATTACHMENT0 + textureIndex );\n\n\t\t\t\t\t\t_gl.readPixels( x, y, width, height, utils.convert( textureFormat ), utils.convert( textureType ), buffer );\n\n\t\t\t\t\t}\n\n\t\t\t\t} finally {\n\n\t\t\t\t\t// restore framebuffer of current render target if necessary\n\n\t\t\t\t\tconst framebuffer = ( _currentRenderTarget !== null ) ? properties.get( _currentRenderTarget ).__webglFramebuffer : null;\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Asynchronous, non-blocking version of {@link WebGLRenderer#readRenderTargetPixels}.\n\t\t *\n\t\t * It is recommended to use this version of `readRenderTargetPixels()` whenever possible.\n\t\t *\n\t\t * @async\n\t\t * @param {WebGLRenderTarget} renderTarget - The render target to read from.\n\t\t * @param {number} x - The `x` coordinate of the copy region's origin.\n\t\t * @param {number} y - The `y` coordinate of the copy region's origin.\n\t\t * @param {number} width - The width of the copy region.\n\t\t * @param {number} height - The height of the copy region.\n\t\t * @param {TypedArray} buffer - The result buffer.\n\t\t * @param {number} [activeCubeFaceIndex] - The active cube face index.\n\t\t * @param {number} [textureIndex=0] - The texture index of an MRT render target.\n\t\t * @return {Promise<TypedArray>} A Promise that resolves when the read has been finished. The resolve provides the read data as a typed array.\n\t\t */\n\t\tthis.readRenderTargetPixelsAsync = async function ( renderTarget, x, y, width, height, buffer, activeCubeFaceIndex, textureIndex = 0 ) {\n\n\t\t\tif ( ! ( renderTarget && renderTarget.isWebGLRenderTarget ) ) {\n\n\t\t\t\tthrow new Error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.' );\n\n\t\t\t}\n\n\t\t\tlet framebuffer = properties.get( renderTarget ).__webglFramebuffer;\n\t\t\tif ( renderTarget.isWebGLCubeRenderTarget && activeCubeFaceIndex !== undefined ) {\n\n\t\t\t\tframebuffer = framebuffer[ activeCubeFaceIndex ];\n\n\t\t\t}\n\n\t\t\tif ( framebuffer ) {\n\n\t\t\t\t// the following if statement ensures valid read requests (no out-of-bounds pixels, see #8604)\n\t\t\t\tif ( ( x >= 0 && x <= ( renderTarget.width - width ) ) && ( y >= 0 && y <= ( renderTarget.height - height ) ) ) {\n\n\t\t\t\t\t// set the active frame buffer to the one we want to read\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\t\t\t\tconst texture = renderTarget.textures[ textureIndex ];\n\t\t\t\t\tconst textureFormat = texture.format;\n\t\t\t\t\tconst textureType = texture.type;\n\n\t\t\t\t\tif ( ! capabilities.textureFormatReadable( textureFormat ) ) {\n\n\t\t\t\t\t\tthrow new Error( 'THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in RGBA or implementation defined format.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! capabilities.textureTypeReadable( textureType ) ) {\n\n\t\t\t\t\t\tthrow new Error( 'THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in UnsignedByteType or implementation defined type.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst glBuffer = _gl.createBuffer();\n\t\t\t\t\t_gl.bindBuffer( _gl.PIXEL_PACK_BUFFER, glBuffer );\n\t\t\t\t\t_gl.bufferData( _gl.PIXEL_PACK_BUFFER, buffer.byteLength, _gl.STREAM_READ );\n\n\t\t\t\t\t// when using MRT, select the correct color buffer for the subsequent read command\n\n\t\t\t\t\tif ( renderTarget.textures.length > 1 ) _gl.readBuffer( _gl.COLOR_ATTACHMENT0 + textureIndex );\n\n\t\t\t\t\t_gl.readPixels( x, y, width, height, utils.convert( textureFormat ), utils.convert( textureType ), 0 );\n\n\t\t\t\t\t// reset the frame buffer to the currently set buffer before waiting\n\t\t\t\t\tconst currFramebuffer = _currentRenderTarget !== null ? properties.get( _currentRenderTarget ).__webglFramebuffer : null;\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, currFramebuffer );\n\n\t\t\t\t\t// check if the commands have finished every 8 ms\n\t\t\t\t\tconst sync = _gl.fenceSync( _gl.SYNC_GPU_COMMANDS_COMPLETE, 0 );\n\n\t\t\t\t\t_gl.flush();\n\n\t\t\t\t\tawait probeAsync( _gl, sync, 4 );\n\n\t\t\t\t\t// read the data and delete the buffer\n\t\t\t\t\t_gl.bindBuffer( _gl.PIXEL_PACK_BUFFER, glBuffer );\n\t\t\t\t\t_gl.getBufferSubData( _gl.PIXEL_PACK_BUFFER, 0, buffer );\n\t\t\t\t\t_gl.deleteBuffer( glBuffer );\n\t\t\t\t\t_gl.deleteSync( sync );\n\n\t\t\t\t\treturn buffer;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new Error( 'THREE.WebGLRenderer.readRenderTargetPixelsAsync: requested read bounds are out of range.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Copies pixels from the current bound framebuffer into the given texture.\n\t\t *\n\t\t * @param {FramebufferTexture} texture - The texture.\n\t\t * @param {?Vector2} [position=null] - The start position of the copy operation.\n\t\t * @param {number} [level=0] - The mip level. The default represents the base mip.\n\t\t */\n\t\tthis.copyFramebufferToTexture = function ( texture, position = null, level = 0 ) {\n\n\t\t\tconst levelScale = Math.pow( 2, - level );\n\t\t\tconst width = Math.floor( texture.image.width * levelScale );\n\t\t\tconst height = Math.floor( texture.image.height * levelScale );\n\n\t\t\tconst x = position !== null ? position.x : 0;\n\t\t\tconst y = position !== null ? position.y : 0;\n\n\t\t\ttextures.setTexture2D( texture, 0 );\n\n\t\t\t_gl.copyTexSubImage2D( _gl.TEXTURE_2D, level, 0, 0, x, y, width, height );\n\n\t\t\tstate.unbindTexture();\n\n\t\t};\n\n\t\tconst _srcFramebuffer = _gl.createFramebuffer();\n\t\tconst _dstFramebuffer = _gl.createFramebuffer();\n\n\t\t/**\n\t\t * Copies data of the given source texture into a destination texture.\n\t\t *\n\t\t * When using render target textures as `srcTexture` and `dstTexture`, you must make sure both render targets are initialized\n\t\t * {@link WebGLRenderer#initRenderTarget}.\n\t\t *\n\t\t * @param {Texture} srcTexture - The source texture.\n\t\t * @param {Texture} dstTexture - The destination texture.\n\t\t * @param {?(Box2|Box3)} [srcRegion=null] - A bounding box which describes the source region. Can be two or three-dimensional.\n\t\t * @param {?(Vector2|Vector3)} [dstPosition=null] - A vector that represents the origin of the destination region. Can be two or three-dimensional.\n\t\t * @param {number} [srcLevel=0] - The source mipmap level to copy.\n\t\t * @param {?number} [dstLevel=null] - The destination mipmap level.\n\t\t */\n\t\tthis.copyTextureToTexture = function ( srcTexture, dstTexture, srcRegion = null, dstPosition = null, srcLevel = 0, dstLevel = null ) {\n\n\t\t\t// support the previous signature with just a single dst mipmap level\n\t\t\tif ( dstLevel === null ) {\n\n\t\t\t\tif ( srcLevel !== 0 ) {\n\n\t\t\t\t\t// @deprecated, r171\n\t\t\t\t\twarnOnce( 'WebGLRenderer: copyTextureToTexture function signature has changed to support src and dst mipmap levels.' );\n\t\t\t\t\tdstLevel = srcLevel;\n\t\t\t\t\tsrcLevel = 0;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tdstLevel = 0;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// gather the necessary dimensions to copy\n\t\t\tlet width, height, depth, minX, minY, minZ;\n\t\t\tlet dstX, dstY, dstZ;\n\t\t\tconst image = srcTexture.isCompressedTexture ? srcTexture.mipmaps[ dstLevel ] : srcTexture.image;\n\t\t\tif ( srcRegion !== null ) {\n\n\t\t\t\twidth = srcRegion.max.x - srcRegion.min.x;\n\t\t\t\theight = srcRegion.max.y - srcRegion.min.y;\n\t\t\t\tdepth = srcRegion.isBox3 ? srcRegion.max.z - srcRegion.min.z : 1;\n\t\t\t\tminX = srcRegion.min.x;\n\t\t\t\tminY = srcRegion.min.y;\n\t\t\t\tminZ = srcRegion.isBox3 ? srcRegion.min.z : 0;\n\n\t\t\t} else {\n\n\t\t\t\tconst levelScale = Math.pow( 2, - srcLevel );\n\t\t\t\twidth = Math.floor( image.width * levelScale );\n\t\t\t\theight = Math.floor( image.height * levelScale );\n\t\t\t\tif ( srcTexture.isDataArrayTexture ) {\n\n\t\t\t\t\tdepth = image.depth;\n\n\t\t\t\t} else if ( srcTexture.isData3DTexture ) {\n\n\t\t\t\t\tdepth = Math.floor( image.depth * levelScale );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tdepth = 1;\n\n\t\t\t\t}\n\n\t\t\t\tminX = 0;\n\t\t\t\tminY = 0;\n\t\t\t\tminZ = 0;\n\n\t\t\t}\n\n\t\t\tif ( dstPosition !== null ) {\n\n\t\t\t\tdstX = dstPosition.x;\n\t\t\t\tdstY = dstPosition.y;\n\t\t\t\tdstZ = dstPosition.z;\n\n\t\t\t} else {\n\n\t\t\t\tdstX = 0;\n\t\t\t\tdstY = 0;\n\t\t\t\tdstZ = 0;\n\n\t\t\t}\n\n\t\t\t// Set up the destination target\n\t\t\tconst glFormat = utils.convert( dstTexture.format );\n\t\t\tconst glType = utils.convert( dstTexture.type );\n\t\t\tlet glTarget;\n\n\t\t\tif ( dstTexture.isData3DTexture ) {\n\n\t\t\t\ttextures.setTexture3D( dstTexture, 0 );\n\t\t\t\tglTarget = _gl.TEXTURE_3D;\n\n\t\t\t} else if ( dstTexture.isDataArrayTexture || dstTexture.isCompressedArrayTexture ) {\n\n\t\t\t\ttextures.setTexture2DArray( dstTexture, 0 );\n\t\t\t\tglTarget = _gl.TEXTURE_2D_ARRAY;\n\n\t\t\t} else {\n\n\t\t\t\ttextures.setTexture2D( dstTexture, 0 );\n\t\t\t\tglTarget = _gl.TEXTURE_2D;\n\n\t\t\t}\n\n\t\t\t_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, dstTexture.flipY );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, dstTexture.premultiplyAlpha );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ALIGNMENT, dstTexture.unpackAlignment );\n\n\t\t\t// used for copying data from cpu\n\t\t\tconst currentUnpackRowLen = _gl.getParameter( _gl.UNPACK_ROW_LENGTH );\n\t\t\tconst currentUnpackImageHeight = _gl.getParameter( _gl.UNPACK_IMAGE_HEIGHT );\n\t\t\tconst currentUnpackSkipPixels = _gl.getParameter( _gl.UNPACK_SKIP_PIXELS );\n\t\t\tconst currentUnpackSkipRows = _gl.getParameter( _gl.UNPACK_SKIP_ROWS );\n\t\t\tconst currentUnpackSkipImages = _gl.getParameter( _gl.UNPACK_SKIP_IMAGES );\n\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ROW_LENGTH, image.width );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_IMAGE_HEIGHT, image.height );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_PIXELS, minX );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_ROWS, minY );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_IMAGES, minZ );\n\n\t\t\t// set up the src texture\n\t\t\tconst isSrc3D = srcTexture.isDataArrayTexture || srcTexture.isData3DTexture;\n\t\t\tconst isDst3D = dstTexture.isDataArrayTexture || dstTexture.isData3DTexture;\n\t\t\tif ( srcTexture.isDepthTexture ) {\n\n\t\t\t\tconst srcTextureProperties = properties.get( srcTexture );\n\t\t\t\tconst dstTextureProperties = properties.get( dstTexture );\n\t\t\t\tconst srcRenderTargetProperties = properties.get( srcTextureProperties.__renderTarget );\n\t\t\t\tconst dstRenderTargetProperties = properties.get( dstTextureProperties.__renderTarget );\n\t\t\t\tstate.bindFramebuffer( _gl.READ_FRAMEBUFFER, srcRenderTargetProperties.__webglFramebuffer );\n\t\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, dstRenderTargetProperties.__webglFramebuffer );\n\n\t\t\t\tfor ( let i = 0; i < depth; i ++ ) {\n\n\t\t\t\t\t// if the source or destination are a 3d target then a layer needs to be bound\n\t\t\t\t\tif ( isSrc3D ) {\n\n\t\t\t\t\t\t_gl.framebufferTextureLayer( _gl.READ_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, properties.get( srcTexture ).__webglTexture, srcLevel, minZ + i );\n\t\t\t\t\t\t_gl.framebufferTextureLayer( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, properties.get( dstTexture ).__webglTexture, dstLevel, dstZ + i );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_gl.blitFramebuffer( minX, minY, width, height, dstX, dstY, width, height, _gl.DEPTH_BUFFER_BIT, _gl.NEAREST );\n\n\t\t\t\t}\n\n\t\t\t\tstate.bindFramebuffer( _gl.READ_FRAMEBUFFER, null );\n\t\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, null );\n\n\t\t\t} else if ( srcLevel !== 0 || srcTexture.isRenderTargetTexture || properties.has( srcTexture ) ) {\n\n\t\t\t\t// get the appropriate frame buffers\n\t\t\t\tconst srcTextureProperties = properties.get( srcTexture );\n\t\t\t\tconst dstTextureProperties = properties.get( dstTexture );\n\n\t\t\t\t// bind the frame buffer targets\n\t\t\t\tstate.bindFramebuffer( _gl.READ_FRAMEBUFFER, _srcFramebuffer );\n\t\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, _dstFramebuffer );\n\n\t\t\t\tfor ( let i = 0; i < depth; i ++ ) {\n\n\t\t\t\t\t// assign the correct layers and mip maps to the frame buffers\n\t\t\t\t\tif ( isSrc3D ) {\n\n\t\t\t\t\t\t_gl.framebufferTextureLayer( _gl.READ_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, srcTextureProperties.__webglTexture, srcLevel, minZ + i );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_gl.framebufferTexture2D( _gl.READ_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, srcTextureProperties.__webglTexture, srcLevel );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( isDst3D ) {\n\n\t\t\t\t\t\t_gl.framebufferTextureLayer( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, dstTextureProperties.__webglTexture, dstLevel, dstZ + i );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_gl.framebufferTexture2D( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, dstTextureProperties.__webglTexture, dstLevel );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// copy the data using the fastest function that can achieve the copy\n\t\t\t\t\tif ( srcLevel !== 0 ) {\n\n\t\t\t\t\t\t_gl.blitFramebuffer( minX, minY, width, height, dstX, dstY, width, height, _gl.COLOR_BUFFER_BIT, _gl.NEAREST );\n\n\t\t\t\t\t} else if ( isDst3D ) {\n\n\t\t\t\t\t\t_gl.copyTexSubImage3D( glTarget, dstLevel, dstX, dstY, dstZ + i, minX, minY, width, height );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_gl.copyTexSubImage2D( glTarget, dstLevel, dstX, dstY, minX, minY, width, height );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// unbind read, draw buffers\n\t\t\t\tstate.bindFramebuffer( _gl.READ_FRAMEBUFFER, null );\n\t\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, null );\n\n\t\t\t} else {\n\n\t\t\t\tif ( isDst3D ) {\n\n\t\t\t\t\t// copy data into the 3d texture\n\t\t\t\t\tif ( srcTexture.isDataTexture || srcTexture.isData3DTexture ) {\n\n\t\t\t\t\t\t_gl.texSubImage3D( glTarget, dstLevel, dstX, dstY, dstZ, width, height, depth, glFormat, glType, image.data );\n\n\t\t\t\t\t} else if ( dstTexture.isCompressedArrayTexture ) {\n\n\t\t\t\t\t\t_gl.compressedTexSubImage3D( glTarget, dstLevel, dstX, dstY, dstZ, width, height, depth, glFormat, image.data );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_gl.texSubImage3D( glTarget, dstLevel, dstX, dstY, dstZ, width, height, depth, glFormat, glType, image );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// copy data into the 2d texture\n\t\t\t\t\tif ( srcTexture.isDataTexture ) {\n\n\t\t\t\t\t\t_gl.texSubImage2D( _gl.TEXTURE_2D, dstLevel, dstX, dstY, width, height, glFormat, glType, image.data );\n\n\t\t\t\t\t} else if ( srcTexture.isCompressedTexture ) {\n\n\t\t\t\t\t\t_gl.compressedTexSubImage2D( _gl.TEXTURE_2D, dstLevel, dstX, dstY, image.width, image.height, glFormat, image.data );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_gl.texSubImage2D( _gl.TEXTURE_2D, dstLevel, dstX, dstY, width, height, glFormat, glType, image );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// reset values\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ROW_LENGTH, currentUnpackRowLen );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_IMAGE_HEIGHT, currentUnpackImageHeight );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_PIXELS, currentUnpackSkipPixels );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_ROWS, currentUnpackSkipRows );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_IMAGES, currentUnpackSkipImages );\n\n\t\t\t// Generate mipmaps only when copying level 0\n\t\t\tif ( dstLevel === 0 && dstTexture.generateMipmaps ) {\n\n\t\t\t\t_gl.generateMipmap( glTarget );\n\n\t\t\t}\n\n\t\t\tstate.unbindTexture();\n\n\t\t};\n\n\t\t/**\n\t\t * Initializes the given WebGLRenderTarget memory. Useful for initializing a render target so data\n\t\t * can be copied into it using {@link WebGLRenderer#copyTextureToTexture} before it has been\n\t\t * rendered to.\n\t\t *\n\t\t * @param {WebGLRenderTarget} target - The render target.\n\t\t */\n\t\tthis.initRenderTarget = function ( target ) {\n\n\t\t\tif ( properties.get( target ).__webglFramebuffer === undefined ) {\n\n\t\t\t\ttextures.setupRenderTarget( target );\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Initializes the given texture. Useful for preloading a texture rather than waiting until first\n\t\t * render (which can cause noticeable lags due to decode and GPU upload overhead).\n\t\t *\n\t\t * @param {Texture} texture - The texture.\n\t\t */\n\t\tthis.initTexture = function ( texture ) {\n\n\t\t\tif ( texture.isCubeTexture ) {\n\n\t\t\t\ttextures.setTextureCube( texture, 0 );\n\n\t\t\t} else if ( texture.isData3DTexture ) {\n\n\t\t\t\ttextures.setTexture3D( texture, 0 );\n\n\t\t\t} else if ( texture.isDataArrayTexture || texture.isCompressedArrayTexture ) {\n\n\t\t\t\ttextures.setTexture2DArray( texture, 0 );\n\n\t\t\t} else {\n\n\t\t\t\ttextures.setTexture2D( texture, 0 );\n\n\t\t\t}\n\n\t\t\tstate.unbindTexture();\n\n\t\t};\n\n\t\t/**\n\t\t * Can be used to reset the internal WebGL state. This method is mostly\n\t\t * relevant for applications which share a single WebGL context across\n\t\t * multiple WebGL libraries.\n\t\t */\n\t\tthis.resetState = function () {\n\n\t\t\t_currentActiveCubeFace = 0;\n\t\t\t_currentActiveMipmapLevel = 0;\n\t\t\t_currentRenderTarget = null;\n\n\t\t\tstate.reset();\n\t\t\tbindingStates.reset();\n\n\t\t};\n\n\t\tif ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) {\n\n\t\t\t__THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'observe', { detail: this } ) );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Defines the coordinate system of the renderer.\n\t *\n\t * In `WebGLRenderer`, the value is always `WebGLCoordinateSystem`.\n\t *\n\t * @type {WebGLCoordinateSystem|WebGPUCoordinateSystem}\n\t * @default WebGLCoordinateSystem\n\t * @readonly\n\t */\n\tget coordinateSystem() {\n\n\t\treturn WebGLCoordinateSystem;\n\n\t}\n\n\t/**\n\t * Defines the output color space of the renderer.\n\t *\n\t * @type {SRGBColorSpace|LinearSRGBColorSpace}\n\t * @default SRGBColorSpace\n\t */\n\tget outputColorSpace() {\n\n\t\treturn this._outputColorSpace;\n\n\t}\n\n\tset outputColorSpace( colorSpace ) {\n\n\t\tthis._outputColorSpace = colorSpace;\n\n\t\tconst gl = this.getContext();\n\t\tgl.drawingBufferColorSpace = ColorManagement._getDrawingBufferColorSpace( colorSpace );\n\t\tgl.unpackColorSpace = ColorManagement._getUnpackColorSpace();\n\n\t}\n\n}\n\nexports.ACESFilmicToneMapping = ACESFilmicToneMapping;\nexports.AddEquation = AddEquation;\nexports.AddOperation = AddOperation;\nexports.AdditiveAnimationBlendMode = AdditiveAnimationBlendMode;\nexports.AdditiveBlending = AdditiveBlending;\nexports.AgXToneMapping = AgXToneMapping;\nexports.AlphaFormat = AlphaFormat;\nexports.AlwaysCompare = AlwaysCompare;\nexports.AlwaysDepth = AlwaysDepth;\nexports.AlwaysStencilFunc = AlwaysStencilFunc;\nexports.AmbientLight = AmbientLight;\nexports.AnimationAction = AnimationAction;\nexports.AnimationClip = AnimationClip;\nexports.AnimationLoader = AnimationLoader;\nexports.AnimationMixer = AnimationMixer;\nexports.AnimationObjectGroup = AnimationObjectGroup;\nexports.AnimationUtils = AnimationUtils;\nexports.ArcCurve = ArcCurve;\nexports.ArrayCamera = ArrayCamera;\nexports.ArrowHelper = ArrowHelper;\nexports.AttachedBindMode = AttachedBindMode;\nexports.Audio = Audio;\nexports.AudioAnalyser = AudioAnalyser;\nexports.AudioContext = AudioContext;\nexports.AudioListener = AudioListener;\nexports.AudioLoader = AudioLoader;\nexports.AxesHelper = AxesHelper;\nexports.BackSide = BackSide;\nexports.BasicDepthPacking = BasicDepthPacking;\nexports.BasicShadowMap = BasicShadowMap;\nexports.BatchedMesh = BatchedMesh;\nexports.Bone = Bone;\nexports.BooleanKeyframeTrack = BooleanKeyframeTrack;\nexports.Box2 = Box2;\nexports.Box3 = Box3;\nexports.Box3Helper = Box3Helper;\nexports.BoxGeometry = BoxGeometry;\nexports.BoxHelper = BoxHelper;\nexports.BufferAttribute = BufferAttribute;\nexports.BufferGeometry = BufferGeometry;\nexports.BufferGeometryLoader = BufferGeometryLoader;\nexports.ByteType = ByteType;\nexports.Cache = Cache;\nexports.Camera = Camera;\nexports.CameraHelper = CameraHelper;\nexports.CanvasTexture = CanvasTexture;\nexports.CapsuleGeometry = CapsuleGeometry;\nexports.CatmullRomCurve3 = CatmullRomCurve3;\nexports.CineonToneMapping = CineonToneMapping;\nexports.CircleGeometry = CircleGeometry;\nexports.ClampToEdgeWrapping = ClampToEdgeWrapping;\nexports.Clock = Clock;\nexports.Color = Color;\nexports.ColorKeyframeTrack = ColorKeyframeTrack;\nexports.ColorManagement = ColorManagement;\nexports.CompressedArrayTexture = CompressedArrayTexture;\nexports.CompressedCubeTexture = CompressedCubeTexture;\nexports.CompressedTexture = CompressedTexture;\nexports.CompressedTextureLoader = CompressedTextureLoader;\nexports.ConeGeometry = ConeGeometry;\nexports.ConstantAlphaFactor = ConstantAlphaFactor;\nexports.ConstantColorFactor = ConstantColorFactor;\nexports.Controls = Controls;\nexports.CubeCamera = CubeCamera;\nexports.CubeReflectionMapping = CubeReflectionMapping;\nexports.CubeRefractionMapping = CubeRefractionMapping;\nexports.CubeTexture = CubeTexture;\nexports.CubeTextureLoader = CubeTextureLoader;\nexports.CubeUVReflectionMapping = CubeUVReflectionMapping;\nexports.CubicBezierCurve = CubicBezierCurve;\nexports.CubicBezierCurve3 = CubicBezierCurve3;\nexports.CubicInterpolant = CubicInterpolant;\nexports.CullFaceBack = CullFaceBack;\nexports.CullFaceFront = CullFaceFront;\nexports.CullFaceFrontBack = CullFaceFrontBack;\nexports.CullFaceNone = CullFaceNone;\nexports.Curve = Curve;\nexports.CurvePath = CurvePath;\nexports.CustomBlending = CustomBlending;\nexports.CustomToneMapping = CustomToneMapping;\nexports.CylinderGeometry = CylinderGeometry;\nexports.Cylindrical = Cylindrical;\nexports.Data3DTexture = Data3DTexture;\nexports.DataArrayTexture = DataArrayTexture;\nexports.DataTexture = DataTexture;\nexports.DataTextureLoader = DataTextureLoader;\nexports.DataUtils = DataUtils;\nexports.DecrementStencilOp = DecrementStencilOp;\nexports.DecrementWrapStencilOp = DecrementWrapStencilOp;\nexports.DefaultLoadingManager = DefaultLoadingManager;\nexports.DepthFormat = DepthFormat;\nexports.DepthStencilFormat = DepthStencilFormat;\nexports.DepthTexture = DepthTexture;\nexports.DetachedBindMode = DetachedBindMode;\nexports.DirectionalLight = DirectionalLight;\nexports.DirectionalLightHelper = DirectionalLightHelper;\nexports.DiscreteInterpolant = DiscreteInterpolant;\nexports.DodecahedronGeometry = DodecahedronGeometry;\nexports.DoubleSide = DoubleSide;\nexports.DstAlphaFactor = DstAlphaFactor;\nexports.DstColorFactor = DstColorFactor;\nexports.DynamicCopyUsage = DynamicCopyUsage;\nexports.DynamicDrawUsage = DynamicDrawUsage;\nexports.DynamicReadUsage = DynamicReadUsage;\nexports.EdgesGeometry = EdgesGeometry;\nexports.EllipseCurve = EllipseCurve;\nexports.EqualCompare = EqualCompare;\nexports.EqualDepth = EqualDepth;\nexports.EqualStencilFunc = EqualStencilFunc;\nexports.EquirectangularReflectionMapping = EquirectangularReflectionMapping;\nexports.EquirectangularRefractionMapping = EquirectangularRefractionMapping;\nexports.Euler = Euler;\nexports.EventDispatcher = EventDispatcher;\nexports.ExternalTexture = ExternalTexture;\nexports.ExtrudeGeometry = ExtrudeGeometry;\nexports.FileLoader = FileLoader;\nexports.Float16BufferAttribute = Float16BufferAttribute;\nexports.Float32BufferAttribute = Float32BufferAttribute;\nexports.FloatType = FloatType;\nexports.Fog = Fog;\nexports.FogExp2 = FogExp2;\nexports.FramebufferTexture = FramebufferTexture;\nexports.FrontSide = FrontSide;\nexports.Frustum = Frustum;\nexports.FrustumArray = FrustumArray;\nexports.GLBufferAttribute = GLBufferAttribute;\nexports.GLSL1 = GLSL1;\nexports.GLSL3 = GLSL3;\nexports.GreaterCompare = GreaterCompare;\nexports.GreaterDepth = GreaterDepth;\nexports.GreaterEqualCompare = GreaterEqualCompare;\nexports.GreaterEqualDepth = GreaterEqualDepth;\nexports.GreaterEqualStencilFunc = GreaterEqualStencilFunc;\nexports.GreaterStencilFunc = GreaterStencilFunc;\nexports.GridHelper = GridHelper;\nexports.Group = Group;\nexports.HalfFloatType = HalfFloatType;\nexports.HemisphereLight = HemisphereLight;\nexports.HemisphereLightHelper = HemisphereLightHelper;\nexports.IcosahedronGeometry = IcosahedronGeometry;\nexports.ImageBitmapLoader = ImageBitmapLoader;\nexports.ImageLoader = ImageLoader;\nexports.ImageUtils = ImageUtils;\nexports.IncrementStencilOp = IncrementStencilOp;\nexports.IncrementWrapStencilOp = IncrementWrapStencilOp;\nexports.InstancedBufferAttribute = InstancedBufferAttribute;\nexports.InstancedBufferGeometry = InstancedBufferGeometry;\nexports.InstancedInterleavedBuffer = InstancedInterleavedBuffer;\nexports.InstancedMesh = InstancedMesh;\nexports.Int16BufferAttribute = Int16BufferAttribute;\nexports.Int32BufferAttribute = Int32BufferAttribute;\nexports.Int8BufferAttribute = Int8BufferAttribute;\nexports.IntType = IntType;\nexports.InterleavedBuffer = InterleavedBuffer;\nexports.InterleavedBufferAttribute = InterleavedBufferAttribute;\nexports.Interpolant = Interpolant;\nexports.InterpolateDiscrete = InterpolateDiscrete;\nexports.InterpolateLinear = InterpolateLinear;\nexports.InterpolateSmooth = InterpolateSmooth;\nexports.InterpolationSamplingMode = InterpolationSamplingMode;\nexports.InterpolationSamplingType = InterpolationSamplingType;\nexports.InvertStencilOp = InvertStencilOp;\nexports.KeepStencilOp = KeepStencilOp;\nexports.KeyframeTrack = KeyframeTrack;\nexports.LOD = LOD;\nexports.LatheGeometry = LatheGeometry;\nexports.Layers = Layers;\nexports.LessCompare = LessCompare;\nexports.LessDepth = LessDepth;\nexports.LessEqualCompare = LessEqualCompare;\nexports.LessEqualDepth = LessEqualDepth;\nexports.LessEqualStencilFunc = LessEqualStencilFunc;\nexports.LessStencilFunc = LessStencilFunc;\nexports.Light = Light;\nexports.LightProbe = LightProbe;\nexports.Line = Line;\nexports.Line3 = Line3;\nexports.LineBasicMaterial = LineBasicMaterial;\nexports.LineCurve = LineCurve;\nexports.LineCurve3 = LineCurve3;\nexports.LineDashedMaterial = LineDashedMaterial;\nexports.LineLoop = LineLoop;\nexports.LineSegments = LineSegments;\nexports.LinearFilter = LinearFilter;\nexports.LinearInterpolant = LinearInterpolant;\nexports.LinearMipMapLinearFilter = LinearMipMapLinearFilter;\nexports.LinearMipMapNearestFilter = LinearMipMapNearestFilter;\nexports.LinearMipmapLinearFilter = LinearMipmapLinearFilter;\nexports.LinearMipmapNearestFilter = LinearMipmapNearestFilter;\nexports.LinearSRGBColorSpace = LinearSRGBColorSpace;\nexports.LinearToneMapping = LinearToneMapping;\nexports.LinearTransfer = LinearTransfer;\nexports.Loader = Loader;\nexports.LoaderUtils = LoaderUtils;\nexports.LoadingManager = LoadingManager;\nexports.LoopOnce = LoopOnce;\nexports.LoopPingPong = LoopPingPong;\nexports.LoopRepeat = LoopRepeat;\nexports.MOUSE = MOUSE;\nexports.Material = Material;\nexports.MaterialLoader = MaterialLoader;\nexports.MathUtils = MathUtils;\nexports.Matrix2 = Matrix2;\nexports.Matrix3 = Matrix3;\nexports.Matrix4 = Matrix4;\nexports.MaxEquation = MaxEquation;\nexports.Mesh = Mesh;\nexports.MeshBasicMaterial = MeshBasicMaterial;\nexports.MeshDepthMaterial = MeshDepthMaterial;\nexports.MeshDistanceMaterial = MeshDistanceMaterial;\nexports.MeshLambertMaterial = MeshLambertMaterial;\nexports.MeshMatcapMaterial = MeshMatcapMaterial;\nexports.MeshNormalMaterial = MeshNormalMaterial;\nexports.MeshPhongMaterial = MeshPhongMaterial;\nexports.MeshPhysicalMaterial = MeshPhysicalMaterial;\nexports.MeshStandardMaterial = MeshStandardMaterial;\nexports.MeshToonMaterial = MeshToonMaterial;\nexports.MinEquation = MinEquation;\nexports.MirroredRepeatWrapping = MirroredRepeatWrapping;\nexports.MixOperation = MixOperation;\nexports.MultiplyBlending = MultiplyBlending;\nexports.MultiplyOperation = MultiplyOperation;\nexports.NearestFilter = NearestFilter;\nexports.NearestMipMapLinearFilter = NearestMipMapLinearFilter;\nexports.NearestMipMapNearestFilter = NearestMipMapNearestFilter;\nexports.NearestMipmapLinearFilter = NearestMipmapLinearFilter;\nexports.NearestMipmapNearestFilter = NearestMipmapNearestFilter;\nexports.NeutralToneMapping = NeutralToneMapping;\nexports.NeverCompare = NeverCompare;\nexports.NeverDepth = NeverDepth;\nexports.NeverStencilFunc = NeverStencilFunc;\nexports.NoBlending = NoBlending;\nexports.NoColorSpace = NoColorSpace;\nexports.NoToneMapping = NoToneMapping;\nexports.NormalAnimationBlendMode = NormalAnimationBlendMode;\nexports.NormalBlending = NormalBlending;\nexports.NotEqualCompare = NotEqualCompare;\nexports.NotEqualDepth = NotEqualDepth;\nexports.NotEqualStencilFunc = NotEqualStencilFunc;\nexports.NumberKeyframeTrack = NumberKeyframeTrack;\nexports.Object3D = Object3D;\nexports.ObjectLoader = ObjectLoader;\nexports.ObjectSpaceNormalMap = ObjectSpaceNormalMap;\nexports.OctahedronGeometry = OctahedronGeometry;\nexports.OneFactor = OneFactor;\nexports.OneMinusConstantAlphaFactor = OneMinusConstantAlphaFactor;\nexports.OneMinusConstantColorFactor = OneMinusConstantColorFactor;\nexports.OneMinusDstAlphaFactor = OneMinusDstAlphaFactor;\nexports.OneMinusDstColorFactor = OneMinusDstColorFactor;\nexports.OneMinusSrcAlphaFactor = OneMinusSrcAlphaFactor;\nexports.OneMinusSrcColorFactor = OneMinusSrcColorFactor;\nexports.OrthographicCamera = OrthographicCamera;\nexports.PCFShadowMap = PCFShadowMap;\nexports.PCFSoftShadowMap = PCFSoftShadowMap;\nexports.PMREMGenerator = PMREMGenerator;\nexports.Path = Path;\nexports.PerspectiveCamera = PerspectiveCamera;\nexports.Plane = Plane;\nexports.PlaneGeometry = PlaneGeometry;\nexports.PlaneHelper = PlaneHelper;\nexports.PointLight = PointLight;\nexports.PointLightHelper = PointLightHelper;\nexports.Points = Points;\nexports.PointsMaterial = PointsMaterial;\nexports.PolarGridHelper = PolarGridHelper;\nexports.PolyhedronGeometry = PolyhedronGeometry;\nexports.PositionalAudio = PositionalAudio;\nexports.PropertyBinding = PropertyBinding;\nexports.PropertyMixer = PropertyMixer;\nexports.QuadraticBezierCurve = QuadraticBezierCurve;\nexports.QuadraticBezierCurve3 = QuadraticBezierCurve3;\nexports.Quaternion = Quaternion;\nexports.QuaternionKeyframeTrack = QuaternionKeyframeTrack;\nexports.QuaternionLinearInterpolant = QuaternionLinearInterpolant;\nexports.RED_GREEN_RGTC2_Format = RED_GREEN_RGTC2_Format;\nexports.RED_RGTC1_Format = RED_RGTC1_Format;\nexports.REVISION = REVISION;\nexports.RGBADepthPacking = RGBADepthPacking;\nexports.RGBAFormat = RGBAFormat;\nexports.RGBAIntegerFormat = RGBAIntegerFormat;\nexports.RGBA_ASTC_10x10_Format = RGBA_ASTC_10x10_Format;\nexports.RGBA_ASTC_10x5_Format = RGBA_ASTC_10x5_Format;\nexports.RGBA_ASTC_10x6_Format = RGBA_ASTC_10x6_Format;\nexports.RGBA_ASTC_10x8_Format = RGBA_ASTC_10x8_Format;\nexports.RGBA_ASTC_12x10_Format = RGBA_ASTC_12x10_Format;\nexports.RGBA_ASTC_12x12_Format = RGBA_ASTC_12x12_Format;\nexports.RGBA_ASTC_4x4_Format = RGBA_ASTC_4x4_Format;\nexports.RGBA_ASTC_5x4_Format = RGBA_ASTC_5x4_Format;\nexports.RGBA_ASTC_5x5_Format = RGBA_ASTC_5x5_Format;\nexports.RGBA_ASTC_6x5_Format = RGBA_ASTC_6x5_Format;\nexports.RGBA_ASTC_6x6_Format = RGBA_ASTC_6x6_Format;\nexports.RGBA_ASTC_8x5_Format = RGBA_ASTC_8x5_Format;\nexports.RGBA_ASTC_8x6_Format = RGBA_ASTC_8x6_Format;\nexports.RGBA_ASTC_8x8_Format = RGBA_ASTC_8x8_Format;\nexports.RGBA_BPTC_Format = RGBA_BPTC_Format;\nexports.RGBA_ETC2_EAC_Format = RGBA_ETC2_EAC_Format;\nexports.RGBA_PVRTC_2BPPV1_Format = RGBA_PVRTC_2BPPV1_Format;\nexports.RGBA_PVRTC_4BPPV1_Format = RGBA_PVRTC_4BPPV1_Format;\nexports.RGBA_S3TC_DXT1_Format = RGBA_S3TC_DXT1_Format;\nexports.RGBA_S3TC_DXT3_Format = RGBA_S3TC_DXT3_Format;\nexports.RGBA_S3TC_DXT5_Format = RGBA_S3TC_DXT5_Format;\nexports.RGBDepthPacking = RGBDepthPacking;\nexports.RGBFormat = RGBFormat;\nexports.RGBIntegerFormat = RGBIntegerFormat;\nexports.RGB_BPTC_SIGNED_Format = RGB_BPTC_SIGNED_Format;\nexports.RGB_BPTC_UNSIGNED_Format = RGB_BPTC_UNSIGNED_Format;\nexports.RGB_ETC1_Format = RGB_ETC1_Format;\nexports.RGB_ETC2_Format = RGB_ETC2_Format;\nexports.RGB_PVRTC_2BPPV1_Format = RGB_PVRTC_2BPPV1_Format;\nexports.RGB_PVRTC_4BPPV1_Format = RGB_PVRTC_4BPPV1_Format;\nexports.RGB_S3TC_DXT1_Format = RGB_S3TC_DXT1_Format;\nexports.RGDepthPacking = RGDepthPacking;\nexports.RGFormat = RGFormat;\nexports.RGIntegerFormat = RGIntegerFormat;\nexports.RawShaderMaterial = RawShaderMaterial;\nexports.Ray = Ray;\nexports.Raycaster = Raycaster;\nexports.RectAreaLight = RectAreaLight;\nexports.RedFormat = RedFormat;\nexports.RedIntegerFormat = RedIntegerFormat;\nexports.ReinhardToneMapping = ReinhardToneMapping;\nexports.RenderTarget = RenderTarget;\nexports.RenderTarget3D = RenderTarget3D;\nexports.RepeatWrapping = RepeatWrapping;\nexports.ReplaceStencilOp = ReplaceStencilOp;\nexports.ReverseSubtractEquation = ReverseSubtractEquation;\nexports.RingGeometry = RingGeometry;\nexports.SIGNED_RED_GREEN_RGTC2_Format = SIGNED_RED_GREEN_RGTC2_Format;\nexports.SIGNED_RED_RGTC1_Format = SIGNED_RED_RGTC1_Format;\nexports.SRGBColorSpace = SRGBColorSpace;\nexports.SRGBTransfer = SRGBTransfer;\nexports.Scene = Scene;\nexports.ShaderChunk = ShaderChunk;\nexports.ShaderLib = ShaderLib;\nexports.ShaderMaterial = ShaderMaterial;\nexports.ShadowMaterial = ShadowMaterial;\nexports.Shape = Shape;\nexports.ShapeGeometry = ShapeGeometry;\nexports.ShapePath = ShapePath;\nexports.ShapeUtils = ShapeUtils;\nexports.ShortType = ShortType;\nexports.Skeleton = Skeleton;\nexports.SkeletonHelper = SkeletonHelper;\nexports.SkinnedMesh = SkinnedMesh;\nexports.Source = Source;\nexports.Sphere = Sphere;\nexports.SphereGeometry = SphereGeometry;\nexports.Spherical = Spherical;\nexports.SphericalHarmonics3 = SphericalHarmonics3;\nexports.SplineCurve = SplineCurve;\nexports.SpotLight = SpotLight;\nexports.SpotLightHelper = SpotLightHelper;\nexports.Sprite = Sprite;\nexports.SpriteMaterial = SpriteMaterial;\nexports.SrcAlphaFactor = SrcAlphaFactor;\nexports.SrcAlphaSaturateFactor = SrcAlphaSaturateFactor;\nexports.SrcColorFactor = SrcColorFactor;\nexports.StaticCopyUsage = StaticCopyUsage;\nexports.StaticDrawUsage = StaticDrawUsage;\nexports.StaticReadUsage = StaticReadUsage;\nexports.StereoCamera = StereoCamera;\nexports.StreamCopyUsage = StreamCopyUsage;\nexports.StreamDrawUsage = StreamDrawUsage;\nexports.StreamReadUsage = StreamReadUsage;\nexports.StringKeyframeTrack = StringKeyframeTrack;\nexports.SubtractEquation = SubtractEquation;\nexports.SubtractiveBlending = SubtractiveBlending;\nexports.TOUCH = TOUCH;\nexports.TangentSpaceNormalMap = TangentSpaceNormalMap;\nexports.TetrahedronGeometry = TetrahedronGeometry;\nexports.Texture = Texture;\nexports.TextureLoader = TextureLoader;\nexports.TextureUtils = TextureUtils;\nexports.Timer = Timer;\nexports.TimestampQuery = TimestampQuery;\nexports.TorusGeometry = TorusGeometry;\nexports.TorusKnotGeometry = TorusKnotGeometry;\nexports.Triangle = Triangle;\nexports.TriangleFanDrawMode = TriangleFanDrawMode;\nexports.TriangleStripDrawMode = TriangleStripDrawMode;\nexports.TrianglesDrawMode = TrianglesDrawMode;\nexports.TubeGeometry = TubeGeometry;\nexports.UVMapping = UVMapping;\nexports.Uint16BufferAttribute = Uint16BufferAttribute;\nexports.Uint32BufferAttribute = Uint32BufferAttribute;\nexports.Uint8BufferAttribute = Uint8BufferAttribute;\nexports.Uint8ClampedBufferAttribute = Uint8ClampedBufferAttribute;\nexports.Uniform = Uniform;\nexports.UniformsGroup = UniformsGroup;\nexports.UniformsLib = UniformsLib;\nexports.UniformsUtils = UniformsUtils;\nexports.UnsignedByteType = UnsignedByteType;\nexports.UnsignedInt101111Type = UnsignedInt101111Type;\nexports.UnsignedInt248Type = UnsignedInt248Type;\nexports.UnsignedInt5999Type = UnsignedInt5999Type;\nexports.UnsignedIntType = UnsignedIntType;\nexports.UnsignedShort4444Type = UnsignedShort4444Type;\nexports.UnsignedShort5551Type = UnsignedShort5551Type;\nexports.UnsignedShortType = UnsignedShortType;\nexports.VSMShadowMap = VSMShadowMap;\nexports.Vector2 = Vector2;\nexports.Vector3 = Vector3;\nexports.Vector4 = Vector4;\nexports.VectorKeyframeTrack = VectorKeyframeTrack;\nexports.VideoFrameTexture = VideoFrameTexture;\nexports.VideoTexture = VideoTexture;\nexports.WebGL3DRenderTarget = WebGL3DRenderTarget;\nexports.WebGLArrayRenderTarget = WebGLArrayRenderTarget;\nexports.WebGLCoordinateSystem = WebGLCoordinateSystem;\nexports.WebGLCubeRenderTarget = WebGLCubeRenderTarget;\nexports.WebGLRenderTarget = WebGLRenderTarget;\nexports.WebGLRenderer = WebGLRenderer;\nexports.WebGLUtils = WebGLUtils;\nexports.WebGPUCoordinateSystem = WebGPUCoordinateSystem;\nexports.WebXRController = WebXRController;\nexports.WireframeGeometry = WireframeGeometry;\nexports.WrapAroundEnding = WrapAroundEnding;\nexports.ZeroCurvatureEnding = ZeroCurvatureEnding;\nexports.ZeroFactor = ZeroFactor;\nexports.ZeroSlopeEnding = ZeroSlopeEnding;\nexports.ZeroStencilOp = ZeroStencilOp;\nexports.createCanvasElement = createCanvasElement;\nexports.error = error;\nexports.getConsoleFunction = getConsoleFunction;\nexports.log = log;\nexports.setConsoleFunction = setConsoleFunction;\nexports.warn = warn;\nexports.warnOnce = warnOnce;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nObject.defineProperty(exports, \"defaults\", {\n    enumerable: true,\n    get: function() {\n        return defaults;\n    }\n});\nfunction defaults(target, ...sources) {\n    for (let source of sources){\n        for(let k in source){\n            var _target_hasOwnProperty;\n            if (!(target === null || target === void 0 ? void 0 : (_target_hasOwnProperty = target.hasOwnProperty) === null || _target_hasOwnProperty === void 0 ? void 0 : _target_hasOwnProperty.call(target, k))) {\n                target[k] = source[k];\n            }\n        }\n        for (let k of Object.getOwnPropertySymbols(source)){\n            var _target_hasOwnProperty1;\n            if (!(target === null || target === void 0 ? void 0 : (_target_hasOwnProperty1 = target.hasOwnProperty) === null || _target_hasOwnProperty1 === void 0 ? void 0 : _target_hasOwnProperty1.call(target, k))) {\n                target[k] = source[k];\n            }\n        }\n    }\n    return target;\n}\n","'use strict';\n/* eslint-disable regexp/no-empty-capturing-group, regexp/no-empty-group, regexp/no-lazy-ends -- testing */\n/* eslint-disable regexp/no-useless-quantifier -- testing */\nvar call = require('../internals/function-call');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar toString = require('../internals/to-string');\nvar regexpFlags = require('../internals/regexp-flags');\nvar stickyHelpers = require('../internals/regexp-sticky-helpers');\nvar shared = require('../internals/shared');\nvar create = require('../internals/object-create');\nvar getInternalState = require('../internals/internal-state').get;\nvar UNSUPPORTED_DOT_ALL = require('../internals/regexp-unsupported-dot-all');\nvar UNSUPPORTED_NCG = require('../internals/regexp-unsupported-ncg');\n\nvar nativeReplace = shared('native-string-replace', String.prototype.replace);\nvar nativeExec = RegExp.prototype.exec;\nvar patchedExec = nativeExec;\nvar charAt = uncurryThis(''.charAt);\nvar indexOf = uncurryThis(''.indexOf);\nvar replace = uncurryThis(''.replace);\nvar stringSlice = uncurryThis(''.slice);\n\nvar UPDATES_LAST_INDEX_WRONG = (function () {\n  var re1 = /a/;\n  var re2 = /b*/g;\n  call(nativeExec, re1, 'a');\n  call(nativeExec, re2, 'a');\n  return re1.lastIndex !== 0 || re2.lastIndex !== 0;\n})();\n\nvar UNSUPPORTED_Y = stickyHelpers.BROKEN_CARET;\n\n// nonparticipating capturing group, copied from es5-shim's String#split patch.\nvar NPCG_INCLUDED = /()??/.exec('')[1] !== undefined;\n\nvar PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED || UNSUPPORTED_Y || UNSUPPORTED_DOT_ALL || UNSUPPORTED_NCG;\n\nif (PATCH) {\n  patchedExec = function exec(string) {\n    var re = this;\n    var state = getInternalState(re);\n    var str = toString(string);\n    var raw = state.raw;\n    var result, reCopy, lastIndex, match, i, object, group;\n\n    if (raw) {\n      raw.lastIndex = re.lastIndex;\n      result = call(patchedExec, raw, str);\n      re.lastIndex = raw.lastIndex;\n      return result;\n    }\n\n    var groups = state.groups;\n    var sticky = UNSUPPORTED_Y && re.sticky;\n    var flags = call(regexpFlags, re);\n    var source = re.source;\n    var charsAdded = 0;\n    var strCopy = str;\n\n    if (sticky) {\n      flags = replace(flags, 'y', '');\n      if (indexOf(flags, 'g') === -1) {\n        flags += 'g';\n      }\n\n      strCopy = stringSlice(str, re.lastIndex);\n      // Support anchored sticky behavior.\n      if (re.lastIndex > 0 && (!re.multiline || re.multiline && charAt(str, re.lastIndex - 1) !== '\\n')) {\n        source = '(?: ' + source + ')';\n        strCopy = ' ' + strCopy;\n        charsAdded++;\n      }\n      // ^(? + rx + ) is needed, in combination with some str slicing, to\n      // simulate the 'y' flag.\n      reCopy = new RegExp('^(?:' + source + ')', flags);\n    }\n\n    if (NPCG_INCLUDED) {\n      reCopy = new RegExp('^' + source + '$(?!\\\\s)', flags);\n    }\n    if (UPDATES_LAST_INDEX_WRONG) lastIndex = re.lastIndex;\n\n    match = call(nativeExec, sticky ? reCopy : re, strCopy);\n\n    if (sticky) {\n      if (match) {\n        match.input = stringSlice(match.input, charsAdded);\n        match[0] = stringSlice(match[0], charsAdded);\n        match.index = re.lastIndex;\n        re.lastIndex += match[0].length;\n      } else re.lastIndex = 0;\n    } else if (UPDATES_LAST_INDEX_WRONG && match) {\n      re.lastIndex = re.global ? match.index + match[0].length : lastIndex;\n    }\n    if (NPCG_INCLUDED && match && match.length > 1) {\n      // Fix browsers whose `exec` methods don't consistently return `undefined`\n      // for NPCG, like IE8. NOTE: This doesn't work for /(.?)?/\n      call(nativeReplace, match[0], reCopy, function () {\n        for (i = 1; i < arguments.length - 2; i++) {\n          if (arguments[i] === undefined) match[i] = undefined;\n        }\n      });\n    }\n\n    if (match && groups) {\n      match.groups = object = create(null);\n      for (i = 0; i < groups.length; i++) {\n        group = groups[i];\n        object[group[0]] = match[group[1]];\n      }\n    }\n\n    return match;\n  };\n}\n\nmodule.exports = patchedExec;\n","'use strict';\nvar $ = require('../internals/export');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar toAbsoluteIndex = require('../internals/to-absolute-index');\n\nvar $RangeError = RangeError;\nvar fromCharCode = String.fromCharCode;\n// eslint-disable-next-line es/no-string-fromcodepoint -- required for testing\nvar $fromCodePoint = String.fromCodePoint;\nvar join = uncurryThis([].join);\n\n// length should be 1, old FF problem\nvar INCORRECT_LENGTH = !!$fromCodePoint && $fromCodePoint.length !== 1;\n\n// `String.fromCodePoint` method\n// https://tc39.es/ecma262/#sec-string.fromcodepoint\n$({ target: 'String', stat: true, arity: 1, forced: INCORRECT_LENGTH }, {\n  // eslint-disable-next-line no-unused-vars -- required for `.length`\n  fromCodePoint: function fromCodePoint(x) {\n    var elements = [];\n    var length = arguments.length;\n    var i = 0;\n    var code;\n    while (length > i) {\n      code = +arguments[i++];\n      if (toAbsoluteIndex(code, 0x10FFFF) !== code) throw new $RangeError(code + ' is not a valid code point');\n      elements[i] = code < 0x10000\n        ? fromCharCode(code)\n        : fromCharCode(((code -= 0x10000) >> 10) + 0xD800, code % 0x400 + 0xDC00);\n    } return join(elements, '');\n  }\n});\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar call = require('../internals/function-call');\nvar propertyIsEnumerableModule = require('../internals/object-property-is-enumerable');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar toPropertyKey = require('../internals/to-property-key');\nvar hasOwn = require('../internals/has-own-property');\nvar IE8_DOM_DEFINE = require('../internals/ie8-dom-define');\n\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// `Object.getOwnPropertyDescriptor` method\n// https://tc39.es/ecma262/#sec-object.getownpropertydescriptor\nexports.f = DESCRIPTORS ? $getOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) {\n  O = toIndexedObject(O);\n  P = toPropertyKey(P);\n  if (IE8_DOM_DEFINE) try {\n    return $getOwnPropertyDescriptor(O, P);\n  } catch (error) { /* empty */ }\n  if (hasOwn(O, P)) return createPropertyDescriptor(!call(propertyIsEnumerableModule.f, O, P), O[P]);\n};\n","'use strict';\n// iterable DOM collections\n// flag - `iterable` interface - 'entries', 'keys', 'values', 'forEach' methods\nmodule.exports = {\n  CSSRuleList: 0,\n  CSSStyleDeclaration: 0,\n  CSSValueList: 0,\n  ClientRectList: 0,\n  DOMRectList: 0,\n  DOMStringList: 0,\n  DOMTokenList: 1,\n  DataTransferItemList: 0,\n  FileList: 0,\n  HTMLAllCollection: 0,\n  HTMLCollection: 0,\n  HTMLFormElement: 0,\n  HTMLSelectElement: 0,\n  MediaList: 0,\n  MimeTypeArray: 0,\n  NamedNodeMap: 0,\n  NodeList: 1,\n  PaintRequestList: 0,\n  Plugin: 0,\n  PluginArray: 0,\n  SVGLengthList: 0,\n  SVGNumberList: 0,\n  SVGPathSegList: 0,\n  SVGPointList: 0,\n  SVGStringList: 0,\n  SVGTransformList: 0,\n  SourceBufferList: 0,\n  StyleSheetList: 0,\n  TextTrackCueList: 0,\n  TextTrackList: 0,\n  TouchList: 0\n};\n","'use strict';\nvar fails = require('../internals/fails');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar IS_PURE = require('../internals/is-pure');\n\nvar ITERATOR = wellKnownSymbol('iterator');\n\nmodule.exports = !fails(function () {\n  // eslint-disable-next-line unicorn/relative-url-style -- required for testing\n  var url = new URL('b?a=1&b=2&c=3', 'https://a');\n  var params = url.searchParams;\n  var params2 = new URLSearchParams('a=1&a=2&b=3');\n  var result = '';\n  url.pathname = 'c%20d';\n  params.forEach(function (value, key) {\n    params['delete']('b');\n    result += key + value;\n  });\n  params2['delete']('a', 2);\n  // `undefined` case is a Chromium 117 bug\n  // https://bugs.chromium.org/p/v8/issues/detail?id=14222\n  params2['delete']('b', undefined);\n  return (IS_PURE && (!url.toJSON || !params2.has('a', 1) || params2.has('a', 2) || !params2.has('a', undefined) || params2.has('b')))\n    || (!params.size && (IS_PURE || !DESCRIPTORS))\n    || !params.sort\n    || url.href !== 'https://a/c%20d?a=1&c=3'\n    || params.get('c') !== '3'\n    || String(new URLSearchParams('?a=1')) !== 'a=1'\n    || !params[ITERATOR]\n    // throws in Edge\n    || new URL('https://a@b').username !== 'a'\n    || new URLSearchParams(new URLSearchParams('a=b')).get('a') !== 'b'\n    // not punycoded in Edge\n    || new URL('https://тест').host !== 'xn--e1aybc'\n    // not escaped in Chrome 62-\n    || new URL('https://a#б').hash !== '#%D0%B1'\n    // fails in Chrome 66-\n    || result !== 'a1c3'\n    // throws in Safari\n    || new URL('https://x', undefined).host !== 'x';\n});\n","'use strict';\nvar isArray = require('../internals/is-array');\nvar isConstructor = require('../internals/is-constructor');\nvar isObject = require('../internals/is-object');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar SPECIES = wellKnownSymbol('species');\nvar $Array = Array;\n\n// a part of `ArraySpeciesCreate` abstract operation\n// https://tc39.es/ecma262/#sec-arrayspeciescreate\nmodule.exports = function (originalArray) {\n  var C;\n  if (isArray(originalArray)) {\n    C = originalArray.constructor;\n    // cross-realm fallback\n    if (isConstructor(C) && (C === $Array || isArray(C.prototype))) C = undefined;\n    else if (isObject(C)) {\n      C = C[SPECIES];\n      if (C === null) C = undefined;\n    }\n  } return C === undefined ? $Array : C;\n};\n","'use strict';\nrequire('../../modules/es.string.iterator');\nrequire('../../modules/es.array.from');\nvar path = require('../../internals/path');\n\nmodule.exports = path.Array.from;\n","'use strict';\n// a string of all valid unicode whitespaces\nmodule.exports = '\\u0009\\u000A\\u000B\\u000C\\u000D\\u0020\\u00A0\\u1680\\u2000\\u2001\\u2002' +\n  '\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\\u2029\\uFEFF';\n","'use strict';\nvar classofRaw = require('../internals/classof-raw');\nvar uncurryThis = require('../internals/function-uncurry-this');\n\nmodule.exports = function (fn) {\n  // Nashorn bug:\n  //   https://github.com/zloirock/core-js/issues/1128\n  //   https://github.com/zloirock/core-js/issues/1130\n  if (classofRaw(fn) === 'Function') return uncurryThis(fn);\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar exec = require('../internals/regexp-exec');\n\n// `RegExp.prototype.exec` method\n// https://tc39.es/ecma262/#sec-regexp.prototype.exec\n$({ target: 'RegExp', proto: true, forced: /./.exec !== exec }, {\n  exec: exec\n});\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nObject.defineProperty(exports, \"default\", {\n    enumerable: true,\n    get: function() {\n        return escapeCommas;\n    }\n});\nfunction escapeCommas(className) {\n    return className.replace(/\\\\,/g, \"\\\\2c \");\n}\n","'use strict';\nvar IS_PURE = require('../internals/is-pure');\nvar globalThis = require('../internals/global-this');\nvar defineGlobalProperty = require('../internals/define-global-property');\n\nvar SHARED = '__core-js_shared__';\nvar store = module.exports = globalThis[SHARED] || defineGlobalProperty(SHARED, {});\n\n(store.versions || (store.versions = [])).push({\n  version: '3.47.0',\n  mode: IS_PURE ? 'pure' : 'global',\n  copyright: '© 2014-2025 Denis Pushkarev (zloirock.ru), 2025 CoreJS Company (core-js.io)',\n  license: 'https://github.com/zloirock/core-js/blob/v3.47.0/LICENSE',\n  source: 'https://github.com/zloirock/core-js'\n});\n","'use strict';\nvar getBuiltIn = require('../internals/get-built-in');\nvar defineBuiltInAccessor = require('../internals/define-built-in-accessor');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar DESCRIPTORS = require('../internals/descriptors');\n\nvar SPECIES = wellKnownSymbol('species');\n\nmodule.exports = function (CONSTRUCTOR_NAME) {\n  var Constructor = getBuiltIn(CONSTRUCTOR_NAME);\n\n  if (DESCRIPTORS && Constructor && !Constructor[SPECIES]) {\n    defineBuiltInAccessor(Constructor, SPECIES, {\n      configurable: true,\n      get: function () { return this; }\n    });\n  }\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar difference = require('../internals/set-difference');\nvar fails = require('../internals/fails');\nvar setMethodAcceptSetLike = require('../internals/set-method-accept-set-like');\n\nvar SET_LIKE_INCORRECT_BEHAVIOR = !setMethodAcceptSetLike('difference', function (result) {\n  return result.size === 0;\n});\n\nvar FORCED = SET_LIKE_INCORRECT_BEHAVIOR || fails(function () {\n  // https://bugs.webkit.org/show_bug.cgi?id=288595\n  var setLike = {\n    size: 1,\n    has: function () { return true; },\n    keys: function () {\n      var index = 0;\n      return {\n        next: function () {\n          var done = index++ > 1;\n          if (baseSet.has(1)) baseSet.clear();\n          return { done: done, value: 2 };\n        }\n      };\n    }\n  };\n  // eslint-disable-next-line es/no-set -- testing\n  var baseSet = new Set([1, 2, 3, 4]);\n  // eslint-disable-next-line es/no-set-prototype-difference -- testing\n  return baseSet.difference(setLike).size !== 3;\n});\n\n// `Set.prototype.difference` method\n// https://tc39.es/ecma262/#sec-set.prototype.difference\n$({ target: 'Set', proto: true, real: true, forced: FORCED }, {\n  difference: difference\n});\n","'use strict';\nrequire('../../modules/es.array.iterator');\nrequire('../../modules/es.object.to-string');\nrequire('../../modules/es.set');\nrequire('../../modules/es.set.difference.v2');\nrequire('../../modules/es.set.intersection.v2');\nrequire('../../modules/es.set.is-disjoint-from.v2');\nrequire('../../modules/es.set.is-subset-of.v2');\nrequire('../../modules/es.set.is-superset-of.v2');\nrequire('../../modules/es.set.symmetric-difference.v2');\nrequire('../../modules/es.set.union.v2');\nrequire('../../modules/es.string.iterator');\nvar path = require('../../internals/path');\n\nmodule.exports = path.Set;\n","'use strict';\nvar fails = require('../internals/fails');\nvar isCallable = require('../internals/is-callable');\nvar isObject = require('../internals/is-object');\nvar create = require('../internals/object-create');\nvar getPrototypeOf = require('../internals/object-get-prototype-of');\nvar defineBuiltIn = require('../internals/define-built-in');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar IS_PURE = require('../internals/is-pure');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar BUGGY_SAFARI_ITERATORS = false;\n\n// `%IteratorPrototype%` object\n// https://tc39.es/ecma262/#sec-%iteratorprototype%-object\nvar IteratorPrototype, PrototypeOfArrayIteratorPrototype, arrayIterator;\n\n/* eslint-disable es/no-array-prototype-keys -- safe */\nif ([].keys) {\n  arrayIterator = [].keys();\n  // Safari 8 has buggy iterators w/o `next`\n  if (!('next' in arrayIterator)) BUGGY_SAFARI_ITERATORS = true;\n  else {\n    PrototypeOfArrayIteratorPrototype = getPrototypeOf(getPrototypeOf(arrayIterator));\n    if (PrototypeOfArrayIteratorPrototype !== Object.prototype) IteratorPrototype = PrototypeOfArrayIteratorPrototype;\n  }\n}\n\nvar NEW_ITERATOR_PROTOTYPE = !isObject(IteratorPrototype) || fails(function () {\n  var test = {};\n  // FF44- legacy iterators case\n  return IteratorPrototype[ITERATOR].call(test) !== test;\n});\n\nif (NEW_ITERATOR_PROTOTYPE) IteratorPrototype = {};\nelse if (IS_PURE) IteratorPrototype = create(IteratorPrototype);\n\n// `%IteratorPrototype%[@@iterator]()` method\n// https://tc39.es/ecma262/#sec-%iteratorprototype%-@@iterator\nif (!isCallable(IteratorPrototype[ITERATOR])) {\n  defineBuiltIn(IteratorPrototype, ITERATOR, function () {\n    return this;\n  });\n}\n\nmodule.exports = {\n  IteratorPrototype: IteratorPrototype,\n  BUGGY_SAFARI_ITERATORS: BUGGY_SAFARI_ITERATORS\n};\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\n\nmodule.exports = uncurryThis([].slice);\n","'use strict';\nvar hasOwn = require('../internals/has-own-property');\nvar ownKeys = require('../internals/own-keys');\nvar getOwnPropertyDescriptorModule = require('../internals/object-get-own-property-descriptor');\nvar definePropertyModule = require('../internals/object-define-property');\n\nmodule.exports = function (target, source, exceptions) {\n  var keys = ownKeys(source);\n  var defineProperty = definePropertyModule.f;\n  var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;\n  for (var i = 0; i < keys.length; i++) {\n    var key = keys[i];\n    if (!hasOwn(target, key) && !(exceptions && hasOwn(exceptions, key))) {\n      defineProperty(target, key, getOwnPropertyDescriptor(source, key));\n    }\n  }\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar call = require('../internals/function-call');\nvar aCallable = require('../internals/a-callable');\nvar newPromiseCapabilityModule = require('../internals/new-promise-capability');\nvar perform = require('../internals/perform');\nvar iterate = require('../internals/iterate');\nvar PROMISE_STATICS_INCORRECT_ITERATION = require('../internals/promise-statics-incorrect-iteration');\n\n// `Promise.race` method\n// https://tc39.es/ecma262/#sec-promise.race\n$({ target: 'Promise', stat: true, forced: PROMISE_STATICS_INCORRECT_ITERATION }, {\n  race: function race(iterable) {\n    var C = this;\n    var capability = newPromiseCapabilityModule.f(C);\n    var reject = capability.reject;\n    var result = perform(function () {\n      var $promiseResolve = aCallable(C.resolve);\n      iterate(iterable, function (promise) {\n        call($promiseResolve, C, promise).then(capability.resolve, reject);\n      });\n    });\n    if (result.error) reject(result.value);\n    return capability.promise;\n  }\n});\n","'use strict';\nvar isNullOrUndefined = require('../internals/is-null-or-undefined');\n\nvar $TypeError = TypeError;\n\n// `RequireObjectCoercible` abstract operation\n// https://tc39.es/ecma262/#sec-requireobjectcoercible\nmodule.exports = function (it) {\n  if (isNullOrUndefined(it)) throw new $TypeError(\"Can't call method on \" + it);\n  return it;\n};\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar isCallable = require('../internals/is-callable');\n\nvar aFunction = function (argument) {\n  return isCallable(argument) ? argument : undefined;\n};\n\nmodule.exports = function (namespace, method) {\n  return arguments.length < 2 ? aFunction(globalThis[namespace]) : globalThis[namespace] && globalThis[namespace][method];\n};\n","'use strict';\nvar charAt = require('../internals/string-multibyte').charAt;\nvar toString = require('../internals/to-string');\nvar InternalStateModule = require('../internals/internal-state');\nvar defineIterator = require('../internals/iterator-define');\nvar createIterResultObject = require('../internals/create-iter-result-object');\n\nvar STRING_ITERATOR = 'String Iterator';\nvar setInternalState = InternalStateModule.set;\nvar getInternalState = InternalStateModule.getterFor(STRING_ITERATOR);\n\n// `String.prototype[@@iterator]` method\n// https://tc39.es/ecma262/#sec-string.prototype-@@iterator\ndefineIterator(String, 'String', function (iterated) {\n  setInternalState(this, {\n    type: STRING_ITERATOR,\n    string: toString(iterated),\n    index: 0\n  });\n// `%StringIteratorPrototype%.next` method\n// https://tc39.es/ecma262/#sec-%stringiteratorprototype%.next\n}, function next() {\n  var state = getInternalState(this);\n  var string = state.string;\n  var index = state.index;\n  var point;\n  if (index >= string.length) return createIterResultObject(undefined, true);\n  point = charAt(string, index);\n  state.index += point.length;\n  return createIterResultObject(point, false);\n});\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nObject.defineProperty(exports, \"default\", {\n    enumerable: true,\n    get: function() {\n        return _default;\n    }\n});\nfunction _default(pluginConfig, plugins) {\n    if (pluginConfig === undefined) {\n        return plugins;\n    }\n    const pluginNames = Array.isArray(pluginConfig) ? pluginConfig : [\n        ...new Set(plugins.filter((pluginName)=>{\n            return pluginConfig !== false && pluginConfig[pluginName] !== false;\n        }).concat(Object.keys(pluginConfig).filter((pluginName)=>{\n            return pluginConfig[pluginName] !== false;\n        })))\n    ];\n    return pluginNames;\n}\n","'use strict';\nvar $ = require('../internals/export');\nvar hasOwn = require('../internals/has-own-property');\nvar isSymbol = require('../internals/is-symbol');\nvar tryToString = require('../internals/try-to-string');\nvar shared = require('../internals/shared');\nvar NATIVE_SYMBOL_REGISTRY = require('../internals/symbol-registry-detection');\n\nvar SymbolToStringRegistry = shared('symbol-to-string-registry');\n\n// `Symbol.keyFor` method\n// https://tc39.es/ecma262/#sec-symbol.keyfor\n$({ target: 'Symbol', stat: true, forced: !NATIVE_SYMBOL_REGISTRY }, {\n  keyFor: function keyFor(sym) {\n    if (!isSymbol(sym)) throw new TypeError(tryToString(sym) + ' is not a symbol');\n    if (hasOwn(SymbolToStringRegistry, sym)) return SymbolToStringRegistry[sym];\n  }\n});\n","'use strict';\n/* eslint-disable es/no-json -- safe */\nvar fails = require('../internals/fails');\n\nmodule.exports = !fails(function () {\n  var unsafeInt = '9007199254740993';\n  // eslint-disable-next-line es/no-nonstandard-json-properties -- feature detection\n  var raw = JSON.rawJSON(unsafeInt);\n  // eslint-disable-next-line es/no-nonstandard-json-properties -- feature detection\n  return !JSON.isRawJSON(raw) || JSON.stringify(raw) !== unsafeInt;\n});\n","'use strict';\nvar charAt = require('../internals/string-multibyte').charAt;\n\n// `AdvanceStringIndex` abstract operation\n// https://tc39.es/ecma262/#sec-advancestringindex\nmodule.exports = function (S, index, unicode) {\n  return index + (unicode ? charAt(S, index).length : 1);\n};\n","\"use strict\";\n\nexports.__esModule = true;\nexports[\"default\"] = void 0;\n\nvar _container = _interopRequireDefault(require(\"./container\"));\n\nvar _types = require(\"./types\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nvar Root = /*#__PURE__*/function (_Container) {\n  _inheritsLoose(Root, _Container);\n\n  function Root(opts) {\n    var _this;\n\n    _this = _Container.call(this, opts) || this;\n    _this.type = _types.ROOT;\n    return _this;\n  }\n\n  var _proto = Root.prototype;\n\n  _proto.toString = function toString() {\n    var str = this.reduce(function (memo, selector) {\n      memo.push(String(selector));\n      return memo;\n    }, []).join(',');\n    return this.trailingComma ? str + ',' : str;\n  };\n\n  _proto.error = function error(message, options) {\n    if (this._error) {\n      return this._error(message, options);\n    } else {\n      return new Error(message);\n    }\n  };\n\n  _createClass(Root, [{\n    key: \"errorGenerator\",\n    set: function set(handler) {\n      this._error = handler;\n    }\n  }]);\n\n  return Root;\n}(_container[\"default\"]);\n\nexports[\"default\"] = Root;\nmodule.exports = exports.default;","'use strict';\nvar userAgent = require('../internals/environment-user-agent');\n\nmodule.exports = /web0s(?!.*chrome)/i.test(userAgent);\n","'use strict';\nvar bind = require('../internals/function-bind-context');\nvar call = require('../internals/function-call');\nvar toObject = require('../internals/to-object');\nvar callWithSafeIterationClosing = require('../internals/call-with-safe-iteration-closing');\nvar isArrayIteratorMethod = require('../internals/is-array-iterator-method');\nvar isConstructor = require('../internals/is-constructor');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\nvar createProperty = require('../internals/create-property');\nvar getIterator = require('../internals/get-iterator');\nvar getIteratorMethod = require('../internals/get-iterator-method');\n\nvar $Array = Array;\n\n// `Array.from` method implementation\n// https://tc39.es/ecma262/#sec-array.from\nmodule.exports = function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) {\n  var O = toObject(arrayLike);\n  var IS_CONSTRUCTOR = isConstructor(this);\n  var argumentsLength = arguments.length;\n  var mapfn = argumentsLength > 1 ? arguments[1] : undefined;\n  var mapping = mapfn !== undefined;\n  if (mapping) mapfn = bind(mapfn, argumentsLength > 2 ? arguments[2] : undefined);\n  var iteratorMethod = getIteratorMethod(O);\n  var index = 0;\n  var length, result, step, iterator, next, value;\n  // if the target is not iterable or it's an array with the default iterator - use a simple case\n  if (iteratorMethod && !(this === $Array && isArrayIteratorMethod(iteratorMethod))) {\n    result = IS_CONSTRUCTOR ? new this() : [];\n    iterator = getIterator(O, iteratorMethod);\n    next = iterator.next;\n    for (;!(step = call(next, iterator)).done; index++) {\n      value = mapping ? callWithSafeIterationClosing(iterator, mapfn, [step.value, index], true) : step.value;\n      createProperty(result, index, value);\n    }\n  } else {\n    length = lengthOfArrayLike(O);\n    result = IS_CONSTRUCTOR ? new this(length) : $Array(length);\n    for (;length > index; index++) {\n      value = mapping ? mapfn(O[index], index) : O[index];\n      createProperty(result, index, value);\n    }\n  }\n  result.length = index;\n  return result;\n};\n","/*!\n * imagesLoaded v5.0.0\n * JavaScript is all like \"You images are done yet or what?\"\n * MIT License\n */\n\n( function( window, factory ) {\n  // universal module definition\n  if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory( window, require('ev-emitter') );\n  } else {\n    // browser global\n    window.imagesLoaded = factory( window, window.EvEmitter );\n  }\n\n} )( typeof window !== 'undefined' ? window : this,\n    function factory( window, EvEmitter ) {\n\nlet $ = window.jQuery;\nlet console = window.console;\n\n// -------------------------- helpers -------------------------- //\n\n// turn element or nodeList into an array\nfunction makeArray( obj ) {\n  // use object if already an array\n  if ( Array.isArray( obj ) ) return obj;\n\n  let isArrayLike = typeof obj == 'object' && typeof obj.length == 'number';\n  // convert nodeList to array\n  if ( isArrayLike ) return [ ...obj ];\n\n  // array of single index\n  return [ obj ];\n}\n\n// -------------------------- imagesLoaded -------------------------- //\n\n/**\n * @param {[Array, Element, NodeList, String]} elem\n * @param {[Object, Function]} options - if function, use as callback\n * @param {Function} onAlways - callback function\n * @returns {ImagesLoaded}\n */\nfunction ImagesLoaded( elem, options, onAlways ) {\n  // coerce ImagesLoaded() without new, to be new ImagesLoaded()\n  if ( !( this instanceof ImagesLoaded ) ) {\n    return new ImagesLoaded( elem, options, onAlways );\n  }\n  // use elem as selector string\n  let queryElem = elem;\n  if ( typeof elem == 'string' ) {\n    queryElem = document.querySelectorAll( elem );\n  }\n  // bail if bad element\n  if ( !queryElem ) {\n    console.error(`Bad element for imagesLoaded ${queryElem || elem}`);\n    return;\n  }\n\n  this.elements = makeArray( queryElem );\n  this.options = {};\n  // shift arguments if no options set\n  if ( typeof options == 'function' ) {\n    onAlways = options;\n  } else {\n    Object.assign( this.options, options );\n  }\n\n  if ( onAlways ) this.on( 'always', onAlways );\n\n  this.getImages();\n  // add jQuery Deferred object\n  if ( $ ) this.jqDeferred = new $.Deferred();\n\n  // HACK check async to allow time to bind listeners\n  setTimeout( this.check.bind( this ) );\n}\n\nImagesLoaded.prototype = Object.create( EvEmitter.prototype );\n\nImagesLoaded.prototype.getImages = function() {\n  this.images = [];\n\n  // filter & find items if we have an item selector\n  this.elements.forEach( this.addElementImages, this );\n};\n\nconst elementNodeTypes = [ 1, 9, 11 ];\n\n/**\n * @param {Node} elem\n */\nImagesLoaded.prototype.addElementImages = function( elem ) {\n  // filter siblings\n  if ( elem.nodeName === 'IMG' ) {\n    this.addImage( elem );\n  }\n  // get background image on element\n  if ( this.options.background === true ) {\n    this.addElementBackgroundImages( elem );\n  }\n\n  // find children\n  // no non-element nodes, #143\n  let { nodeType } = elem;\n  if ( !nodeType || !elementNodeTypes.includes( nodeType ) ) return;\n\n  let childImgs = elem.querySelectorAll('img');\n  // concat childElems to filterFound array\n  for ( let img of childImgs ) {\n    this.addImage( img );\n  }\n\n  // get child background images\n  if ( typeof this.options.background == 'string' ) {\n    let children = elem.querySelectorAll( this.options.background );\n    for ( let child of children ) {\n      this.addElementBackgroundImages( child );\n    }\n  }\n};\n\nconst reURL = /url\\((['\"])?(.*?)\\1\\)/gi;\n\nImagesLoaded.prototype.addElementBackgroundImages = function( elem ) {\n  let style = getComputedStyle( elem );\n  // Firefox returns null if in a hidden iframe https://bugzil.la/548397\n  if ( !style ) return;\n\n  // get url inside url(\"...\")\n  let matches = reURL.exec( style.backgroundImage );\n  while ( matches !== null ) {\n    let url = matches && matches[2];\n    if ( url ) {\n      this.addBackground( url, elem );\n    }\n    matches = reURL.exec( style.backgroundImage );\n  }\n};\n\n/**\n * @param {Image} img\n */\nImagesLoaded.prototype.addImage = function( img ) {\n  let loadingImage = new LoadingImage( img );\n  this.images.push( loadingImage );\n};\n\nImagesLoaded.prototype.addBackground = function( url, elem ) {\n  let background = new Background( url, elem );\n  this.images.push( background );\n};\n\nImagesLoaded.prototype.check = function() {\n  this.progressedCount = 0;\n  this.hasAnyBroken = false;\n  // complete if no images\n  if ( !this.images.length ) {\n    this.complete();\n    return;\n  }\n\n  /* eslint-disable-next-line func-style */\n  let onProgress = ( image, elem, message ) => {\n    // HACK - Chrome triggers event before object properties have changed. #83\n    setTimeout( () => {\n      this.progress( image, elem, message );\n    } );\n  };\n\n  this.images.forEach( function( loadingImage ) {\n    loadingImage.once( 'progress', onProgress );\n    loadingImage.check();\n  } );\n};\n\nImagesLoaded.prototype.progress = function( image, elem, message ) {\n  this.progressedCount++;\n  this.hasAnyBroken = this.hasAnyBroken || !image.isLoaded;\n  // progress event\n  this.emitEvent( 'progress', [ this, image, elem ] );\n  if ( this.jqDeferred && this.jqDeferred.notify ) {\n    this.jqDeferred.notify( this, image );\n  }\n  // check if completed\n  if ( this.progressedCount === this.images.length ) {\n    this.complete();\n  }\n\n  if ( this.options.debug && console ) {\n    console.log( `progress: ${message}`, image, elem );\n  }\n};\n\nImagesLoaded.prototype.complete = function() {\n  let eventName = this.hasAnyBroken ? 'fail' : 'done';\n  this.isComplete = true;\n  this.emitEvent( eventName, [ this ] );\n  this.emitEvent( 'always', [ this ] );\n  if ( this.jqDeferred ) {\n    let jqMethod = this.hasAnyBroken ? 'reject' : 'resolve';\n    this.jqDeferred[ jqMethod ]( this );\n  }\n};\n\n// --------------------------  -------------------------- //\n\nfunction LoadingImage( img ) {\n  this.img = img;\n}\n\nLoadingImage.prototype = Object.create( EvEmitter.prototype );\n\nLoadingImage.prototype.check = function() {\n  // If complete is true and browser supports natural sizes,\n  // try to check for image status manually.\n  let isComplete = this.getIsImageComplete();\n  if ( isComplete ) {\n    // report based on naturalWidth\n    this.confirm( this.img.naturalWidth !== 0, 'naturalWidth' );\n    return;\n  }\n\n  // If none of the checks above matched, simulate loading on detached element.\n  this.proxyImage = new Image();\n  // add crossOrigin attribute. #204\n  if ( this.img.crossOrigin ) {\n    this.proxyImage.crossOrigin = this.img.crossOrigin;\n  }\n  this.proxyImage.addEventListener( 'load', this );\n  this.proxyImage.addEventListener( 'error', this );\n  // bind to image as well for Firefox. #191\n  this.img.addEventListener( 'load', this );\n  this.img.addEventListener( 'error', this );\n  this.proxyImage.src = this.img.currentSrc || this.img.src;\n};\n\nLoadingImage.prototype.getIsImageComplete = function() {\n  // check for non-zero, non-undefined naturalWidth\n  // fixes Safari+InfiniteScroll+Masonry bug infinite-scroll#671\n  return this.img.complete && this.img.naturalWidth;\n};\n\nLoadingImage.prototype.confirm = function( isLoaded, message ) {\n  this.isLoaded = isLoaded;\n  let { parentNode } = this.img;\n  // emit progress with parent <picture> or self <img>\n  let elem = parentNode.nodeName === 'PICTURE' ? parentNode : this.img;\n  this.emitEvent( 'progress', [ this, elem, message ] );\n};\n\n// ----- events ----- //\n\n// trigger specified handler for event type\nLoadingImage.prototype.handleEvent = function( event ) {\n  let method = 'on' + event.type;\n  if ( this[ method ] ) {\n    this[ method ]( event );\n  }\n};\n\nLoadingImage.prototype.onload = function() {\n  this.confirm( true, 'onload' );\n  this.unbindEvents();\n};\n\nLoadingImage.prototype.onerror = function() {\n  this.confirm( false, 'onerror' );\n  this.unbindEvents();\n};\n\nLoadingImage.prototype.unbindEvents = function() {\n  this.proxyImage.removeEventListener( 'load', this );\n  this.proxyImage.removeEventListener( 'error', this );\n  this.img.removeEventListener( 'load', this );\n  this.img.removeEventListener( 'error', this );\n};\n\n// -------------------------- Background -------------------------- //\n\nfunction Background( url, element ) {\n  this.url = url;\n  this.element = element;\n  this.img = new Image();\n}\n\n// inherit LoadingImage prototype\nBackground.prototype = Object.create( LoadingImage.prototype );\n\nBackground.prototype.check = function() {\n  this.img.addEventListener( 'load', this );\n  this.img.addEventListener( 'error', this );\n  this.img.src = this.url;\n  // check if image is already complete\n  let isComplete = this.getIsImageComplete();\n  if ( isComplete ) {\n    this.confirm( this.img.naturalWidth !== 0, 'naturalWidth' );\n    this.unbindEvents();\n  }\n};\n\nBackground.prototype.unbindEvents = function() {\n  this.img.removeEventListener( 'load', this );\n  this.img.removeEventListener( 'error', this );\n};\n\nBackground.prototype.confirm = function( isLoaded, message ) {\n  this.isLoaded = isLoaded;\n  this.emitEvent( 'progress', [ this, this.element, message ] );\n};\n\n// -------------------------- jQuery -------------------------- //\n\nImagesLoaded.makeJQueryPlugin = function( jQuery ) {\n  jQuery = jQuery || window.jQuery;\n  if ( !jQuery ) return;\n\n  // set local variable\n  $ = jQuery;\n  // $().imagesLoaded()\n  $.fn.imagesLoaded = function( options, onAlways ) {\n    let instance = new ImagesLoaded( this, options, onAlways );\n    return instance.jqDeferred.promise( $( this ) );\n  };\n};\n// try making plugin\nImagesLoaded.makeJQueryPlugin();\n\n// --------------------------  -------------------------- //\n\nreturn ImagesLoaded;\n\n} );\n","'use strict';\nvar $ = require('../internals/export');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar defineProperties = require('../internals/object-define-properties').f;\n\n// `Object.defineProperties` method\n// https://tc39.es/ecma262/#sec-object.defineproperties\n// eslint-disable-next-line es/no-object-defineproperties -- safe\n$({ target: 'Object', stat: true, forced: Object.defineProperties !== defineProperties, sham: !DESCRIPTORS }, {\n  defineProperties: defineProperties\n});\n","'use strict';\nvar anObject = require('../internals/an-object');\n\n// `RegExp.prototype.flags` getter implementation\n// https://tc39.es/ecma262/#sec-get-regexp.prototype.flags\nmodule.exports = function () {\n  var that = anObject(this);\n  var result = '';\n  if (that.hasIndices) result += 'd';\n  if (that.global) result += 'g';\n  if (that.ignoreCase) result += 'i';\n  if (that.multiline) result += 'm';\n  if (that.dotAll) result += 's';\n  if (that.unicode) result += 'u';\n  if (that.unicodeSets) result += 'v';\n  if (that.sticky) result += 'y';\n  return result;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar fails = require('../internals/fails');\nvar intersection = require('../internals/set-intersection');\nvar setMethodAcceptSetLike = require('../internals/set-method-accept-set-like');\n\nvar INCORRECT = !setMethodAcceptSetLike('intersection', function (result) {\n  return result.size === 2 && result.has(1) && result.has(2);\n}) || fails(function () {\n  // eslint-disable-next-line es/no-array-from, es/no-set, es/no-set-prototype-intersection -- testing\n  return String(Array.from(new Set([1, 2, 3]).intersection(new Set([3, 2])))) !== '3,2';\n});\n\n// `Set.prototype.intersection` method\n// https://tc39.es/ecma262/#sec-set.prototype.intersection\n$({ target: 'Set', proto: true, real: true, forced: INCORRECT }, {\n  intersection: intersection\n});\n","'use strict';\nvar toIntegerOrInfinity = require('../internals/to-integer-or-infinity');\n\nvar min = Math.min;\n\n// `ToLength` abstract operation\n// https://tc39.es/ecma262/#sec-tolength\nmodule.exports = function (argument) {\n  var len = toIntegerOrInfinity(argument);\n  return len > 0 ? min(len, 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991\n};\n","let createPlugin = require('./lib/public/create-plugin')\nmodule.exports = (createPlugin.__esModule ? createPlugin : { default: createPlugin }).default\n","'use strict';\nvar $ = require('../internals/export');\nvar $padStart = require('../internals/string-pad').start;\nvar WEBKIT_BUG = require('../internals/string-pad-webkit-bug');\n\n// `String.prototype.padStart` method\n// https://tc39.es/ecma262/#sec-string.prototype.padstart\n$({ target: 'String', proto: true, forced: WEBKIT_BUG }, {\n  padStart: function padStart(maxLength /* , fillString = ' ' */) {\n    return $padStart(this, maxLength, arguments.length > 1 ? arguments[1] : undefined);\n  }\n});\n","\"use strict\";\n\nexports.__esModule = true;\nexports[\"default\"] = void 0;\n\nvar _processor = _interopRequireDefault(require(\"./processor\"));\n\nvar selectors = _interopRequireWildcard(require(\"./selectors\"));\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { \"default\": obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj[\"default\"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nvar parser = function parser(processor) {\n  return new _processor[\"default\"](processor);\n};\n\nObject.assign(parser, selectors);\ndelete parser.__esModule;\nvar _default = parser;\nexports[\"default\"] = _default;\nmodule.exports = exports.default;","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar toIntegerOrInfinity = require('../internals/to-integer-or-infinity');\nvar toString = require('../internals/to-string');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n\nvar charAt = uncurryThis(''.charAt);\nvar charCodeAt = uncurryThis(''.charCodeAt);\nvar stringSlice = uncurryThis(''.slice);\n\nvar createMethod = function (CONVERT_TO_STRING) {\n  return function ($this, pos) {\n    var S = toString(requireObjectCoercible($this));\n    var position = toIntegerOrInfinity(pos);\n    var size = S.length;\n    var first, second;\n    if (position < 0 || position >= size) return CONVERT_TO_STRING ? '' : undefined;\n    first = charCodeAt(S, position);\n    return first < 0xD800 || first > 0xDBFF || position + 1 === size\n      || (second = charCodeAt(S, position + 1)) < 0xDC00 || second > 0xDFFF\n        ? CONVERT_TO_STRING\n          ? charAt(S, position)\n          : first\n        : CONVERT_TO_STRING\n          ? stringSlice(S, position, position + 2)\n          : (first - 0xD800 << 10) + (second - 0xDC00) + 0x10000;\n  };\n};\n\nmodule.exports = {\n  // `String.prototype.codePointAt` method\n  // https://tc39.es/ecma262/#sec-string.prototype.codepointat\n  codeAt: createMethod(false),\n  // `String.prototype.at` method\n  // https://github.com/mathiasbynens/String.prototype.at\n  charAt: createMethod(true)\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nObject.defineProperty(exports, \"default\", {\n    enumerable: true,\n    get: function() {\n        return _default;\n    }\n});\nconst _default = [\n    \"preflight\",\n    \"container\",\n    \"accessibility\",\n    \"pointerEvents\",\n    \"visibility\",\n    \"position\",\n    \"inset\",\n    \"isolation\",\n    \"zIndex\",\n    \"order\",\n    \"gridColumn\",\n    \"gridColumnStart\",\n    \"gridColumnEnd\",\n    \"gridRow\",\n    \"gridRowStart\",\n    \"gridRowEnd\",\n    \"float\",\n    \"clear\",\n    \"margin\",\n    \"boxSizing\",\n    \"lineClamp\",\n    \"display\",\n    \"aspectRatio\",\n    \"size\",\n    \"height\",\n    \"maxHeight\",\n    \"minHeight\",\n    \"width\",\n    \"minWidth\",\n    \"maxWidth\",\n    \"flex\",\n    \"flexShrink\",\n    \"flexGrow\",\n    \"flexBasis\",\n    \"tableLayout\",\n    \"captionSide\",\n    \"borderCollapse\",\n    \"borderSpacing\",\n    \"transformOrigin\",\n    \"translate\",\n    \"rotate\",\n    \"skew\",\n    \"scale\",\n    \"transform\",\n    \"animation\",\n    \"cursor\",\n    \"touchAction\",\n    \"userSelect\",\n    \"resize\",\n    \"scrollSnapType\",\n    \"scrollSnapAlign\",\n    \"scrollSnapStop\",\n    \"scrollMargin\",\n    \"scrollPadding\",\n    \"listStylePosition\",\n    \"listStyleType\",\n    \"listStyleImage\",\n    \"appearance\",\n    \"columns\",\n    \"breakBefore\",\n    \"breakInside\",\n    \"breakAfter\",\n    \"gridAutoColumns\",\n    \"gridAutoFlow\",\n    \"gridAutoRows\",\n    \"gridTemplateColumns\",\n    \"gridTemplateRows\",\n    \"flexDirection\",\n    \"flexWrap\",\n    \"placeContent\",\n    \"placeItems\",\n    \"alignContent\",\n    \"alignItems\",\n    \"justifyContent\",\n    \"justifyItems\",\n    \"gap\",\n    \"space\",\n    \"divideWidth\",\n    \"divideStyle\",\n    \"divideColor\",\n    \"divideOpacity\",\n    \"placeSelf\",\n    \"alignSelf\",\n    \"justifySelf\",\n    \"overflow\",\n    \"overscrollBehavior\",\n    \"scrollBehavior\",\n    \"textOverflow\",\n    \"hyphens\",\n    \"whitespace\",\n    \"textWrap\",\n    \"wordBreak\",\n    \"borderRadius\",\n    \"borderWidth\",\n    \"borderStyle\",\n    \"borderColor\",\n    \"borderOpacity\",\n    \"backgroundColor\",\n    \"backgroundOpacity\",\n    \"backgroundImage\",\n    \"gradientColorStops\",\n    \"boxDecorationBreak\",\n    \"backgroundSize\",\n    \"backgroundAttachment\",\n    \"backgroundClip\",\n    \"backgroundPosition\",\n    \"backgroundRepeat\",\n    \"backgroundOrigin\",\n    \"fill\",\n    \"stroke\",\n    \"strokeWidth\",\n    \"objectFit\",\n    \"objectPosition\",\n    \"padding\",\n    \"textAlign\",\n    \"textIndent\",\n    \"verticalAlign\",\n    \"fontFamily\",\n    \"fontSize\",\n    \"fontWeight\",\n    \"textTransform\",\n    \"fontStyle\",\n    \"fontVariantNumeric\",\n    \"lineHeight\",\n    \"letterSpacing\",\n    \"textColor\",\n    \"textOpacity\",\n    \"textDecoration\",\n    \"textDecorationColor\",\n    \"textDecorationStyle\",\n    \"textDecorationThickness\",\n    \"textUnderlineOffset\",\n    \"fontSmoothing\",\n    \"placeholderColor\",\n    \"placeholderOpacity\",\n    \"caretColor\",\n    \"accentColor\",\n    \"opacity\",\n    \"backgroundBlendMode\",\n    \"mixBlendMode\",\n    \"boxShadow\",\n    \"boxShadowColor\",\n    \"outlineStyle\",\n    \"outlineWidth\",\n    \"outlineOffset\",\n    \"outlineColor\",\n    \"ringWidth\",\n    \"ringColor\",\n    \"ringOpacity\",\n    \"ringOffsetWidth\",\n    \"ringOffsetColor\",\n    \"blur\",\n    \"brightness\",\n    \"contrast\",\n    \"dropShadow\",\n    \"grayscale\",\n    \"hueRotate\",\n    \"invert\",\n    \"saturate\",\n    \"sepia\",\n    \"filter\",\n    \"backdropBlur\",\n    \"backdropBrightness\",\n    \"backdropContrast\",\n    \"backdropGrayscale\",\n    \"backdropHueRotate\",\n    \"backdropInvert\",\n    \"backdropOpacity\",\n    \"backdropSaturate\",\n    \"backdropSepia\",\n    \"backdropFilter\",\n    \"transitionProperty\",\n    \"transitionDelay\",\n    \"transitionDuration\",\n    \"transitionTimingFunction\",\n    \"willChange\",\n    \"contain\",\n    \"content\",\n    \"forcedColorAdjust\"\n];\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nObject.defineProperty(exports, \"default\", {\n    enumerable: true,\n    get: function() {\n        return resolveConfig;\n    }\n});\nconst _negateValue = /*#__PURE__*/ _interop_require_default(require(\"./negateValue\"));\nconst _corePluginList = /*#__PURE__*/ _interop_require_default(require(\"../corePluginList\"));\nconst _configurePlugins = /*#__PURE__*/ _interop_require_default(require(\"./configurePlugins\"));\nconst _colors = /*#__PURE__*/ _interop_require_default(require(\"../public/colors\"));\nconst _defaults = require(\"./defaults\");\nconst _toPath = require(\"./toPath\");\nconst _normalizeConfig = require(\"./normalizeConfig\");\nconst _isPlainObject = /*#__PURE__*/ _interop_require_default(require(\"./isPlainObject\"));\nconst _cloneDeep = require(\"./cloneDeep\");\nconst _pluginUtils = require(\"./pluginUtils\");\nconst _withAlphaVariable = require(\"./withAlphaVariable\");\nconst _toColorValue = /*#__PURE__*/ _interop_require_default(require(\"./toColorValue\"));\nfunction _interop_require_default(obj) {\n    return obj && obj.__esModule ? obj : {\n        default: obj\n    };\n}\nfunction isFunction(input) {\n    return typeof input === \"function\";\n}\nfunction mergeWith(target, ...sources) {\n    let customizer = sources.pop();\n    for (let source of sources){\n        for(let k in source){\n            let merged = customizer(target[k], source[k]);\n            if (merged === undefined) {\n                if ((0, _isPlainObject.default)(target[k]) && (0, _isPlainObject.default)(source[k])) {\n                    target[k] = mergeWith({}, target[k], source[k], customizer);\n                } else {\n                    target[k] = source[k];\n                }\n            } else {\n                target[k] = merged;\n            }\n        }\n    }\n    return target;\n}\nconst configUtils = {\n    colors: _colors.default,\n    negative (scale) {\n        // TODO: Log that this function isn't really needed anymore?\n        return Object.keys(scale).filter((key)=>scale[key] !== \"0\").reduce((negativeScale, key)=>{\n            let negativeValue = (0, _negateValue.default)(scale[key]);\n            if (negativeValue !== undefined) {\n                negativeScale[`-${key}`] = negativeValue;\n            }\n            return negativeScale;\n        }, {});\n    },\n    breakpoints (screens) {\n        return Object.keys(screens).filter((key)=>typeof screens[key] === \"string\").reduce((breakpoints, key)=>({\n                ...breakpoints,\n                [`screen-${key}`]: screens[key]\n            }), {});\n    }\n};\nfunction value(valueToResolve, ...args) {\n    return isFunction(valueToResolve) ? valueToResolve(...args) : valueToResolve;\n}\nfunction collectExtends(items) {\n    return items.reduce((merged, { extend  })=>{\n        return mergeWith(merged, extend, (mergedValue, extendValue)=>{\n            if (mergedValue === undefined) {\n                return [\n                    extendValue\n                ];\n            }\n            if (Array.isArray(mergedValue)) {\n                return [\n                    extendValue,\n                    ...mergedValue\n                ];\n            }\n            return [\n                extendValue,\n                mergedValue\n            ];\n        });\n    }, {});\n}\nfunction mergeThemes(themes) {\n    return {\n        ...themes.reduce((merged, theme)=>(0, _defaults.defaults)(merged, theme), {}),\n        // In order to resolve n config objects, we combine all of their `extend` properties\n        // into arrays instead of objects so they aren't overridden.\n        extend: collectExtends(themes)\n    };\n}\nfunction mergeExtensionCustomizer(merged, value) {\n    // When we have an array of objects, we do want to merge it\n    if (Array.isArray(merged) && (0, _isPlainObject.default)(merged[0])) {\n        return merged.concat(value);\n    }\n    // When the incoming value is an array, and the existing config is an object, prepend the existing object\n    if (Array.isArray(value) && (0, _isPlainObject.default)(value[0]) && (0, _isPlainObject.default)(merged)) {\n        return [\n            merged,\n            ...value\n        ];\n    }\n    // Override arrays (for example for font-families, box-shadows, ...)\n    if (Array.isArray(value)) {\n        return value;\n    }\n    // Execute default behaviour\n    return undefined;\n}\nfunction mergeExtensions({ extend , ...theme }) {\n    return mergeWith(theme, extend, (themeValue, extensions)=>{\n        // The `extend` property is an array, so we need to check if it contains any functions\n        if (!isFunction(themeValue) && !extensions.some(isFunction)) {\n            return mergeWith({}, themeValue, ...extensions, mergeExtensionCustomizer);\n        }\n        return (resolveThemePath, utils)=>mergeWith({}, ...[\n                themeValue,\n                ...extensions\n            ].map((e)=>value(e, resolveThemePath, utils)), mergeExtensionCustomizer);\n    });\n}\n/**\n *\n * @param {string} key\n * @return {Iterable<string[] & {alpha: string | undefined}>}\n */ function* toPaths(key) {\n    let path = (0, _toPath.toPath)(key);\n    if (path.length === 0) {\n        return;\n    }\n    yield path;\n    if (Array.isArray(key)) {\n        return;\n    }\n    let pattern = /^(.*?)\\s*\\/\\s*([^/]+)$/;\n    let matches = key.match(pattern);\n    if (matches !== null) {\n        let [, prefix, alpha] = matches;\n        let newPath = (0, _toPath.toPath)(prefix);\n        newPath.alpha = alpha;\n        yield newPath;\n    }\n}\nfunction resolveFunctionKeys(object) {\n    // theme('colors.red.500 / 0.5') -> ['colors', 'red', '500 / 0', '5]\n    const resolvePath = (key, defaultValue)=>{\n        for (const path of toPaths(key)){\n            let index = 0;\n            let val = object;\n            while(val !== undefined && val !== null && index < path.length){\n                val = val[path[index++]];\n                let shouldResolveAsFn = isFunction(val) && (path.alpha === undefined || index <= path.length - 1);\n                val = shouldResolveAsFn ? val(resolvePath, configUtils) : val;\n            }\n            if (val !== undefined) {\n                if (path.alpha !== undefined) {\n                    let normalized = (0, _pluginUtils.parseColorFormat)(val);\n                    return (0, _withAlphaVariable.withAlphaValue)(normalized, path.alpha, (0, _toColorValue.default)(normalized));\n                }\n                if ((0, _isPlainObject.default)(val)) {\n                    return (0, _cloneDeep.cloneDeep)(val);\n                }\n                return val;\n            }\n        }\n        return defaultValue;\n    };\n    Object.assign(resolvePath, {\n        theme: resolvePath,\n        ...configUtils\n    });\n    return Object.keys(object).reduce((resolved, key)=>{\n        resolved[key] = isFunction(object[key]) ? object[key](resolvePath, configUtils) : object[key];\n        return resolved;\n    }, {});\n}\nfunction extractPluginConfigs(configs) {\n    let allConfigs = [];\n    configs.forEach((config)=>{\n        allConfigs = [\n            ...allConfigs,\n            config\n        ];\n        var _config_plugins;\n        const plugins = (_config_plugins = config === null || config === void 0 ? void 0 : config.plugins) !== null && _config_plugins !== void 0 ? _config_plugins : [];\n        if (plugins.length === 0) {\n            return;\n        }\n        plugins.forEach((plugin)=>{\n            if (plugin.__isOptionsFunction) {\n                plugin = plugin();\n            }\n            var _plugin_config;\n            allConfigs = [\n                ...allConfigs,\n                ...extractPluginConfigs([\n                    (_plugin_config = plugin === null || plugin === void 0 ? void 0 : plugin.config) !== null && _plugin_config !== void 0 ? _plugin_config : {}\n                ])\n            ];\n        });\n    });\n    return allConfigs;\n}\nfunction resolveCorePlugins(corePluginConfigs) {\n    const result = [\n        ...corePluginConfigs\n    ].reduceRight((resolved, corePluginConfig)=>{\n        if (isFunction(corePluginConfig)) {\n            return corePluginConfig({\n                corePlugins: resolved\n            });\n        }\n        return (0, _configurePlugins.default)(corePluginConfig, resolved);\n    }, _corePluginList.default);\n    return result;\n}\nfunction resolvePluginLists(pluginLists) {\n    const result = [\n        ...pluginLists\n    ].reduceRight((resolved, pluginList)=>{\n        return [\n            ...resolved,\n            ...pluginList\n        ];\n    }, []);\n    return result;\n}\nfunction resolveConfig(configs) {\n    let allConfigs = [\n        ...extractPluginConfigs(configs),\n        {\n            prefix: \"\",\n            important: false,\n            separator: \":\"\n        }\n    ];\n    var _t_theme, _c_plugins;\n    return (0, _normalizeConfig.normalizeConfig)((0, _defaults.defaults)({\n        theme: resolveFunctionKeys(mergeExtensions(mergeThemes(allConfigs.map((t)=>{\n            return (_t_theme = t === null || t === void 0 ? void 0 : t.theme) !== null && _t_theme !== void 0 ? _t_theme : {};\n        })))),\n        corePlugins: resolveCorePlugins(allConfigs.map((c)=>c.corePlugins)),\n        plugins: resolvePluginLists(configs.map((c)=>{\n            return (_c_plugins = c === null || c === void 0 ? void 0 : c.plugins) !== null && _c_plugins !== void 0 ? _c_plugins : [];\n        }))\n    }, ...allConfigs));\n}\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar shared = require('../internals/shared');\nvar hasOwn = require('../internals/has-own-property');\nvar uid = require('../internals/uid');\nvar NATIVE_SYMBOL = require('../internals/symbol-constructor-detection');\nvar USE_SYMBOL_AS_UID = require('../internals/use-symbol-as-uid');\n\nvar Symbol = globalThis.Symbol;\nvar WellKnownSymbolsStore = shared('wks');\nvar createWellKnownSymbol = USE_SYMBOL_AS_UID ? Symbol['for'] || Symbol : Symbol && Symbol.withoutSetter || uid;\n\nmodule.exports = function (name) {\n  if (!hasOwn(WellKnownSymbolsStore, name)) {\n    WellKnownSymbolsStore[name] = NATIVE_SYMBOL && hasOwn(Symbol, name)\n      ? Symbol[name]\n      : createWellKnownSymbol('Symbol.' + name);\n  } return WellKnownSymbolsStore[name];\n};\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar hasOwn = require('../internals/has-own-property');\n\nvar $SyntaxError = SyntaxError;\nvar $parseInt = parseInt;\nvar fromCharCode = String.fromCharCode;\nvar at = uncurryThis(''.charAt);\nvar slice = uncurryThis(''.slice);\nvar exec = uncurryThis(/./.exec);\n\nvar codePoints = {\n  '\\\\\"': '\"',\n  '\\\\\\\\': '\\\\',\n  '\\\\/': '/',\n  '\\\\b': '\\b',\n  '\\\\f': '\\f',\n  '\\\\n': '\\n',\n  '\\\\r': '\\r',\n  '\\\\t': '\\t'\n};\n\nvar IS_4_HEX_DIGITS = /^[\\da-f]{4}$/i;\n// eslint-disable-next-line regexp/no-control-character -- safe\nvar IS_C0_CONTROL_CODE = /^[\\u0000-\\u001F]$/;\n\nmodule.exports = function (source, i) {\n  var unterminated = true;\n  var value = '';\n  while (i < source.length) {\n    var chr = at(source, i);\n    if (chr === '\\\\') {\n      var twoChars = slice(source, i, i + 2);\n      if (hasOwn(codePoints, twoChars)) {\n        value += codePoints[twoChars];\n        i += 2;\n      } else if (twoChars === '\\\\u') {\n        i += 2;\n        var fourHexDigits = slice(source, i, i + 4);\n        if (!exec(IS_4_HEX_DIGITS, fourHexDigits)) throw new $SyntaxError('Bad Unicode escape at: ' + i);\n        value += fromCharCode($parseInt(fourHexDigits, 16));\n        i += 4;\n      } else throw new $SyntaxError('Unknown escape sequence: \"' + twoChars + '\"');\n    } else if (chr === '\"') {\n      unterminated = false;\n      i++;\n      break;\n    } else {\n      if (exec(IS_C0_CONTROL_CODE, chr)) throw new $SyntaxError('Bad control character in string literal at: ' + i);\n      value += chr;\n      i++;\n    }\n  }\n  if (unterminated) throw new $SyntaxError('Unterminated string at: ' + i);\n  return { value: value, end: i };\n};\n","'use strict';\nvar call = require('../internals/function-call');\nvar getBuiltIn = require('../internals/get-built-in');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar defineBuiltIn = require('../internals/define-built-in');\n\nmodule.exports = function () {\n  var Symbol = getBuiltIn('Symbol');\n  var SymbolPrototype = Symbol && Symbol.prototype;\n  var valueOf = SymbolPrototype && SymbolPrototype.valueOf;\n  var TO_PRIMITIVE = wellKnownSymbol('toPrimitive');\n\n  if (SymbolPrototype && !SymbolPrototype[TO_PRIMITIVE]) {\n    // `Symbol.prototype[@@toPrimitive]` method\n    // https://tc39.es/ecma262/#sec-symbol.prototype-@@toprimitive\n    // eslint-disable-next-line no-unused-vars -- required for .length\n    defineBuiltIn(SymbolPrototype, TO_PRIMITIVE, function (hint) {\n      return call(valueOf, this);\n    }, { arity: 1 });\n  }\n};\n","'use strict';\nvar Queue = function () {\n  this.head = null;\n  this.tail = null;\n};\n\nQueue.prototype = {\n  add: function (item) {\n    var entry = { item: item, next: null };\n    var tail = this.tail;\n    if (tail) tail.next = entry;\n    else this.head = entry;\n    this.tail = entry;\n  },\n  get: function () {\n    var entry = this.head;\n    if (entry) {\n      var next = this.head = entry.next;\n      if (next === null) this.tail = null;\n      return entry.item;\n    }\n  }\n};\n\nmodule.exports = Queue;\n","\"use strict\";\n\nexports.__esModule = true;\nexports[\"default\"] = void 0;\n\nvar _namespace = _interopRequireDefault(require(\"./namespace\"));\n\nvar _types = require(\"./types\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nfunction _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nvar Universal = /*#__PURE__*/function (_Namespace) {\n  _inheritsLoose(Universal, _Namespace);\n\n  function Universal(opts) {\n    var _this;\n\n    _this = _Namespace.call(this, opts) || this;\n    _this.type = _types.UNIVERSAL;\n    _this.value = '*';\n    return _this;\n  }\n\n  return Universal;\n}(_namespace[\"default\"]);\n\nexports[\"default\"] = Universal;\nmodule.exports = exports.default;","'use strict';\n// TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env`\nrequire('../modules/es.array.iterator');\nrequire('../modules/es.string.from-code-point');\nvar $ = require('../internals/export');\nvar globalThis = require('../internals/global-this');\nvar safeGetBuiltIn = require('../internals/safe-get-built-in');\nvar getBuiltIn = require('../internals/get-built-in');\nvar call = require('../internals/function-call');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar USE_NATIVE_URL = require('../internals/url-constructor-detection');\nvar defineBuiltIn = require('../internals/define-built-in');\nvar defineBuiltInAccessor = require('../internals/define-built-in-accessor');\nvar defineBuiltIns = require('../internals/define-built-ins');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar createIteratorConstructor = require('../internals/iterator-create-constructor');\nvar InternalStateModule = require('../internals/internal-state');\nvar anInstance = require('../internals/an-instance');\nvar isCallable = require('../internals/is-callable');\nvar hasOwn = require('../internals/has-own-property');\nvar bind = require('../internals/function-bind-context');\nvar classof = require('../internals/classof');\nvar anObject = require('../internals/an-object');\nvar isObject = require('../internals/is-object');\nvar $toString = require('../internals/to-string');\nvar create = require('../internals/object-create');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar getIterator = require('../internals/get-iterator');\nvar getIteratorMethod = require('../internals/get-iterator-method');\nvar createIterResultObject = require('../internals/create-iter-result-object');\nvar validateArgumentsLength = require('../internals/validate-arguments-length');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar arraySort = require('../internals/array-sort');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar URL_SEARCH_PARAMS = 'URLSearchParams';\nvar URL_SEARCH_PARAMS_ITERATOR = URL_SEARCH_PARAMS + 'Iterator';\nvar setInternalState = InternalStateModule.set;\nvar getInternalParamsState = InternalStateModule.getterFor(URL_SEARCH_PARAMS);\nvar getInternalIteratorState = InternalStateModule.getterFor(URL_SEARCH_PARAMS_ITERATOR);\n\nvar nativeFetch = safeGetBuiltIn('fetch');\nvar NativeRequest = safeGetBuiltIn('Request');\nvar Headers = safeGetBuiltIn('Headers');\nvar RequestPrototype = NativeRequest && NativeRequest.prototype;\nvar HeadersPrototype = Headers && Headers.prototype;\nvar TypeError = globalThis.TypeError;\nvar encodeURIComponent = globalThis.encodeURIComponent;\nvar fromCharCode = String.fromCharCode;\nvar fromCodePoint = getBuiltIn('String', 'fromCodePoint');\nvar $parseInt = parseInt;\nvar charAt = uncurryThis(''.charAt);\nvar join = uncurryThis([].join);\nvar push = uncurryThis([].push);\nvar replace = uncurryThis(''.replace);\nvar shift = uncurryThis([].shift);\nvar splice = uncurryThis([].splice);\nvar split = uncurryThis(''.split);\nvar stringSlice = uncurryThis(''.slice);\nvar exec = uncurryThis(/./.exec);\n\nvar plus = /\\+/g;\nvar FALLBACK_REPLACER = '\\uFFFD';\nvar VALID_HEX = /^[0-9a-f]+$/i;\n\nvar parseHexOctet = function (string, start) {\n  var substr = stringSlice(string, start, start + 2);\n  if (!exec(VALID_HEX, substr)) return NaN;\n\n  return $parseInt(substr, 16);\n};\n\nvar getLeadingOnes = function (octet) {\n  var count = 0;\n  for (var mask = 0x80; mask > 0 && (octet & mask) !== 0; mask >>= 1) {\n    count++;\n  }\n  return count;\n};\n\nvar utf8Decode = function (octets) {\n  var codePoint = null;\n\n  switch (octets.length) {\n    case 1:\n      codePoint = octets[0];\n      break;\n    case 2:\n      codePoint = (octets[0] & 0x1F) << 6 | (octets[1] & 0x3F);\n      break;\n    case 3:\n      codePoint = (octets[0] & 0x0F) << 12 | (octets[1] & 0x3F) << 6 | (octets[2] & 0x3F);\n      break;\n    case 4:\n      codePoint = (octets[0] & 0x07) << 18 | (octets[1] & 0x3F) << 12 | (octets[2] & 0x3F) << 6 | (octets[3] & 0x3F);\n      break;\n  }\n\n  return codePoint > 0x10FFFF ? null : codePoint;\n};\n\nvar decode = function (input) {\n  input = replace(input, plus, ' ');\n  var length = input.length;\n  var result = '';\n  var i = 0;\n\n  while (i < length) {\n    var decodedChar = charAt(input, i);\n\n    if (decodedChar === '%') {\n      if (charAt(input, i + 1) === '%' || i + 3 > length) {\n        result += '%';\n        i++;\n        continue;\n      }\n\n      var octet = parseHexOctet(input, i + 1);\n\n      // eslint-disable-next-line no-self-compare -- NaN check\n      if (octet !== octet) {\n        result += decodedChar;\n        i++;\n        continue;\n      }\n\n      i += 2;\n      var byteSequenceLength = getLeadingOnes(octet);\n\n      if (byteSequenceLength === 0) {\n        decodedChar = fromCharCode(octet);\n      } else {\n        if (byteSequenceLength === 1 || byteSequenceLength > 4) {\n          result += FALLBACK_REPLACER;\n          i++;\n          continue;\n        }\n\n        var octets = [octet];\n        var sequenceIndex = 1;\n\n        while (sequenceIndex < byteSequenceLength) {\n          i++;\n          if (i + 3 > length || charAt(input, i) !== '%') break;\n\n          var nextByte = parseHexOctet(input, i + 1);\n\n          // eslint-disable-next-line no-self-compare -- NaN check\n          if (nextByte !== nextByte) {\n            i += 3;\n            break;\n          }\n          if (nextByte > 191 || nextByte < 128) break;\n\n          push(octets, nextByte);\n          i += 2;\n          sequenceIndex++;\n        }\n\n        if (octets.length !== byteSequenceLength) {\n          result += FALLBACK_REPLACER;\n          continue;\n        }\n\n        var codePoint = utf8Decode(octets);\n        if (codePoint === null) {\n          result += FALLBACK_REPLACER;\n        } else {\n          decodedChar = fromCodePoint(codePoint);\n        }\n      }\n    }\n\n    result += decodedChar;\n    i++;\n  }\n\n  return result;\n};\n\nvar find = /[!'()~]|%20/g;\n\nvar replacements = {\n  '!': '%21',\n  \"'\": '%27',\n  '(': '%28',\n  ')': '%29',\n  '~': '%7E',\n  '%20': '+'\n};\n\nvar replacer = function (match) {\n  return replacements[match];\n};\n\nvar serialize = function (it) {\n  return replace(encodeURIComponent(it), find, replacer);\n};\n\nvar URLSearchParamsIterator = createIteratorConstructor(function Iterator(params, kind) {\n  setInternalState(this, {\n    type: URL_SEARCH_PARAMS_ITERATOR,\n    target: getInternalParamsState(params).entries,\n    index: 0,\n    kind: kind\n  });\n}, URL_SEARCH_PARAMS, function next() {\n  var state = getInternalIteratorState(this);\n  var target = state.target;\n  var index = state.index++;\n  if (!target || index >= target.length) {\n    state.target = null;\n    return createIterResultObject(undefined, true);\n  }\n  var entry = target[index];\n  switch (state.kind) {\n    case 'keys': return createIterResultObject(entry.key, false);\n    case 'values': return createIterResultObject(entry.value, false);\n  } return createIterResultObject([entry.key, entry.value], false);\n}, true);\n\nvar URLSearchParamsState = function (init) {\n  this.entries = [];\n  this.url = null;\n\n  if (init !== undefined) {\n    if (isObject(init)) this.parseObject(init);\n    else this.parseQuery(typeof init == 'string' ? charAt(init, 0) === '?' ? stringSlice(init, 1) : init : $toString(init));\n  }\n};\n\nURLSearchParamsState.prototype = {\n  type: URL_SEARCH_PARAMS,\n  bindURL: function (url) {\n    this.url = url;\n    this.update();\n  },\n  parseObject: function (object) {\n    var entries = this.entries;\n    var iteratorMethod = getIteratorMethod(object);\n    var iterator, next, step, entryIterator, entryNext, first, second;\n\n    if (iteratorMethod) {\n      iterator = getIterator(object, iteratorMethod);\n      next = iterator.next;\n      while (!(step = call(next, iterator)).done) {\n        entryIterator = getIterator(anObject(step.value));\n        entryNext = entryIterator.next;\n        if (\n          (first = call(entryNext, entryIterator)).done ||\n          (second = call(entryNext, entryIterator)).done ||\n          !call(entryNext, entryIterator).done\n        ) throw new TypeError('Expected sequence with length 2');\n        push(entries, { key: $toString(first.value), value: $toString(second.value) });\n      }\n    } else for (var key in object) if (hasOwn(object, key)) {\n      push(entries, { key: key, value: $toString(object[key]) });\n    }\n  },\n  parseQuery: function (query) {\n    if (query) {\n      var entries = this.entries;\n      var attributes = split(query, '&');\n      var index = 0;\n      var attribute, entry;\n      while (index < attributes.length) {\n        attribute = attributes[index++];\n        if (attribute.length) {\n          entry = split(attribute, '=');\n          push(entries, {\n            key: decode(shift(entry)),\n            value: decode(join(entry, '='))\n          });\n        }\n      }\n    }\n  },\n  serialize: function () {\n    var entries = this.entries;\n    var result = [];\n    var index = 0;\n    var entry;\n    while (index < entries.length) {\n      entry = entries[index++];\n      push(result, serialize(entry.key) + '=' + serialize(entry.value));\n    } return join(result, '&');\n  },\n  update: function () {\n    this.entries.length = 0;\n    this.parseQuery(this.url.query);\n  },\n  updateURL: function () {\n    if (this.url) this.url.update();\n  }\n};\n\n// `URLSearchParams` constructor\n// https://url.spec.whatwg.org/#interface-urlsearchparams\nvar URLSearchParamsConstructor = function URLSearchParams(/* init */) {\n  anInstance(this, URLSearchParamsPrototype);\n  var init = arguments.length > 0 ? arguments[0] : undefined;\n  var state = setInternalState(this, new URLSearchParamsState(init));\n  if (!DESCRIPTORS) this.size = state.entries.length;\n};\n\nvar URLSearchParamsPrototype = URLSearchParamsConstructor.prototype;\n\ndefineBuiltIns(URLSearchParamsPrototype, {\n  // `URLSearchParams.prototype.append` method\n  // https://url.spec.whatwg.org/#dom-urlsearchparams-append\n  append: function append(name, value) {\n    var state = getInternalParamsState(this);\n    validateArgumentsLength(arguments.length, 2);\n    push(state.entries, { key: $toString(name), value: $toString(value) });\n    if (!DESCRIPTORS) this.size++;\n    state.updateURL();\n  },\n  // `URLSearchParams.prototype.delete` method\n  // https://url.spec.whatwg.org/#dom-urlsearchparams-delete\n  'delete': function (name /* , value */) {\n    var state = getInternalParamsState(this);\n    var length = validateArgumentsLength(arguments.length, 1);\n    var entries = state.entries;\n    var key = $toString(name);\n    var $value = length < 2 ? undefined : arguments[1];\n    var value = $value === undefined ? $value : $toString($value);\n    var index = 0;\n    while (index < entries.length) {\n      var entry = entries[index];\n      if (entry.key === key && (value === undefined || entry.value === value)) {\n        splice(entries, index, 1);\n        if (value !== undefined) break;\n      } else index++;\n    }\n    if (!DESCRIPTORS) this.size = entries.length;\n    state.updateURL();\n  },\n  // `URLSearchParams.prototype.get` method\n  // https://url.spec.whatwg.org/#dom-urlsearchparams-get\n  get: function get(name) {\n    var entries = getInternalParamsState(this).entries;\n    validateArgumentsLength(arguments.length, 1);\n    var key = $toString(name);\n    var index = 0;\n    for (; index < entries.length; index++) {\n      if (entries[index].key === key) return entries[index].value;\n    }\n    return null;\n  },\n  // `URLSearchParams.prototype.getAll` method\n  // https://url.spec.whatwg.org/#dom-urlsearchparams-getall\n  getAll: function getAll(name) {\n    var entries = getInternalParamsState(this).entries;\n    validateArgumentsLength(arguments.length, 1);\n    var key = $toString(name);\n    var result = [];\n    var index = 0;\n    for (; index < entries.length; index++) {\n      if (entries[index].key === key) push(result, entries[index].value);\n    }\n    return result;\n  },\n  // `URLSearchParams.prototype.has` method\n  // https://url.spec.whatwg.org/#dom-urlsearchparams-has\n  has: function has(name /* , value */) {\n    var entries = getInternalParamsState(this).entries;\n    var length = validateArgumentsLength(arguments.length, 1);\n    var key = $toString(name);\n    var $value = length < 2 ? undefined : arguments[1];\n    var value = $value === undefined ? $value : $toString($value);\n    var index = 0;\n    while (index < entries.length) {\n      var entry = entries[index++];\n      if (entry.key === key && (value === undefined || entry.value === value)) return true;\n    }\n    return false;\n  },\n  // `URLSearchParams.prototype.set` method\n  // https://url.spec.whatwg.org/#dom-urlsearchparams-set\n  set: function set(name, value) {\n    var state = getInternalParamsState(this);\n    validateArgumentsLength(arguments.length, 1);\n    var entries = state.entries;\n    var found = false;\n    var key = $toString(name);\n    var val = $toString(value);\n    var index = 0;\n    var entry;\n    for (; index < entries.length; index++) {\n      entry = entries[index];\n      if (entry.key === key) {\n        if (found) splice(entries, index--, 1);\n        else {\n          found = true;\n          entry.value = val;\n        }\n      }\n    }\n    if (!found) push(entries, { key: key, value: val });\n    if (!DESCRIPTORS) this.size = entries.length;\n    state.updateURL();\n  },\n  // `URLSearchParams.prototype.sort` method\n  // https://url.spec.whatwg.org/#dom-urlsearchparams-sort\n  sort: function sort() {\n    var state = getInternalParamsState(this);\n    arraySort(state.entries, function (a, b) {\n      return a.key > b.key ? 1 : -1;\n    });\n    state.updateURL();\n  },\n  // `URLSearchParams.prototype.forEach` method\n  forEach: function forEach(callback /* , thisArg */) {\n    var entries = getInternalParamsState(this).entries;\n    var boundFunction = bind(callback, arguments.length > 1 ? arguments[1] : undefined);\n    var index = 0;\n    var entry;\n    while (index < entries.length) {\n      entry = entries[index++];\n      boundFunction(entry.value, entry.key, this);\n    }\n  },\n  // `URLSearchParams.prototype.keys` method\n  keys: function keys() {\n    return new URLSearchParamsIterator(this, 'keys');\n  },\n  // `URLSearchParams.prototype.values` method\n  values: function values() {\n    return new URLSearchParamsIterator(this, 'values');\n  },\n  // `URLSearchParams.prototype.entries` method\n  entries: function entries() {\n    return new URLSearchParamsIterator(this, 'entries');\n  }\n}, { enumerable: true });\n\n// `URLSearchParams.prototype[@@iterator]` method\ndefineBuiltIn(URLSearchParamsPrototype, ITERATOR, URLSearchParamsPrototype.entries, { name: 'entries' });\n\n// `URLSearchParams.prototype.toString` method\n// https://url.spec.whatwg.org/#urlsearchparams-stringification-behavior\ndefineBuiltIn(URLSearchParamsPrototype, 'toString', function toString() {\n  return getInternalParamsState(this).serialize();\n}, { enumerable: true });\n\n// `URLSearchParams.prototype.size` getter\n// https://github.com/whatwg/url/pull/734\nif (DESCRIPTORS) defineBuiltInAccessor(URLSearchParamsPrototype, 'size', {\n  get: function size() {\n    return getInternalParamsState(this).entries.length;\n  },\n  configurable: true,\n  enumerable: true\n});\n\nsetToStringTag(URLSearchParamsConstructor, URL_SEARCH_PARAMS);\n\n$({ global: true, constructor: true, forced: !USE_NATIVE_URL }, {\n  URLSearchParams: URLSearchParamsConstructor\n});\n\n// Wrap `fetch` and `Request` for correct work with polyfilled `URLSearchParams`\nif (!USE_NATIVE_URL && isCallable(Headers)) {\n  var headersHas = uncurryThis(HeadersPrototype.has);\n  var headersSet = uncurryThis(HeadersPrototype.set);\n\n  var wrapRequestOptions = function (init) {\n    if (isObject(init)) {\n      var body = init.body;\n      var headers;\n      if (classof(body) === URL_SEARCH_PARAMS) {\n        headers = init.headers ? new Headers(init.headers) : new Headers();\n        if (!headersHas(headers, 'content-type')) {\n          headersSet(headers, 'content-type', 'application/x-www-form-urlencoded;charset=UTF-8');\n        }\n        return create(init, {\n          body: createPropertyDescriptor(0, $toString(body)),\n          headers: createPropertyDescriptor(0, headers)\n        });\n      }\n    } return init;\n  };\n\n  if (isCallable(nativeFetch)) {\n    $({ global: true, enumerable: true, dontCallGetSet: true, forced: true }, {\n      fetch: function fetch(input /* , init */) {\n        return nativeFetch(input, arguments.length > 1 ? wrapRequestOptions(arguments[1]) : {});\n      }\n    });\n  }\n\n  if (isCallable(NativeRequest)) {\n    var RequestConstructor = function Request(input /* , init */) {\n      anInstance(this, RequestPrototype);\n      return new NativeRequest(input, arguments.length > 1 ? wrapRequestOptions(arguments[1]) : {});\n    };\n\n    RequestPrototype.constructor = RequestConstructor;\n    RequestConstructor.prototype = RequestPrototype;\n\n    $({ global: true, constructor: true, dontCallGetSet: true, forced: true }, {\n      Request: RequestConstructor\n    });\n  }\n}\n\nmodule.exports = {\n  URLSearchParams: URLSearchParamsConstructor,\n  getState: getInternalParamsState\n};\n","'use strict';\n// TODO: Remove this module from `core-js@4` since it's replaced to module below\nrequire('../modules/web.url-search-params.constructor');\n","'use strict';\nvar fails = require('../internals/fails');\nvar globalThis = require('../internals/global-this');\n\n// babel-minify and Closure Compiler transpiles RegExp('a', 'y') -> /a/y and it causes SyntaxError\nvar $RegExp = globalThis.RegExp;\n\nvar UNSUPPORTED_Y = fails(function () {\n  var re = $RegExp('a', 'y');\n  re.lastIndex = 2;\n  return re.exec('abcd') !== null;\n});\n\n// UC Browser bug\n// https://github.com/zloirock/core-js/issues/1008\nvar MISSED_STICKY = UNSUPPORTED_Y || fails(function () {\n  return !$RegExp('a', 'y').sticky;\n});\n\nvar BROKEN_CARET = UNSUPPORTED_Y || fails(function () {\n  // https://bugzilla.mozilla.org/show_bug.cgi?id=773687\n  var re = $RegExp('^r', 'gy');\n  re.lastIndex = 2;\n  return re.exec('str') !== null;\n});\n\nmodule.exports = {\n  BROKEN_CARET: BROKEN_CARET,\n  MISSED_STICKY: MISSED_STICKY,\n  UNSUPPORTED_Y: UNSUPPORTED_Y\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar $every = require('../internals/array-iteration').every;\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\n\nvar STRICT_METHOD = arrayMethodIsStrict('every');\n\n// `Array.prototype.every` method\n// https://tc39.es/ecma262/#sec-array.prototype.every\n$({ target: 'Array', proto: true, forced: !STRICT_METHOD }, {\n  every: function every(callbackfn /* , thisArg */) {\n    return $every(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n  }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar $parseFloat = require('../internals/number-parse-float');\n\n// `parseFloat` method\n// https://tc39.es/ecma262/#sec-parsefloat-string\n$({ global: true, forced: parseFloat !== $parseFloat }, {\n  parseFloat: $parseFloat\n});\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar iterateSimple = require('../internals/iterate-simple');\nvar SetHelpers = require('../internals/set-helpers');\n\nvar Set = SetHelpers.Set;\nvar SetPrototype = SetHelpers.proto;\nvar forEach = uncurryThis(SetPrototype.forEach);\nvar keys = uncurryThis(SetPrototype.keys);\nvar next = keys(new Set()).next;\n\nmodule.exports = function (set, fn, interruptible) {\n  return interruptible ? iterateSimple({ iterator: keys(set), next: next }, fn) : forEach(set, fn);\n};\n","'use strict';\nrequire('../../modules/es.object.assign');\nvar path = require('../../internals/path');\n\nmodule.exports = path.Object.assign;\n","'use strict';\nvar internalObjectKeys = require('../internals/object-keys-internal');\nvar enumBugKeys = require('../internals/enum-bug-keys');\n\nvar hiddenKeys = enumBugKeys.concat('length', 'prototype');\n\n// `Object.getOwnPropertyNames` method\n// https://tc39.es/ecma262/#sec-object.getownpropertynames\n// eslint-disable-next-line es/no-object-getownpropertynames -- safe\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n  return internalObjectKeys(O, hiddenKeys);\n};\n","'use strict';\nvar collection = require('../internals/collection');\nvar collectionStrong = require('../internals/collection-strong');\n\n// `Map` constructor\n// https://tc39.es/ecma262/#sec-map-objects\ncollection('Map', function (init) {\n  return function Map() { return init(this, arguments.length ? arguments[0] : undefined); };\n}, collectionStrong);\n","'use strict';\nvar aSet = require('../internals/a-set');\nvar has = require('../internals/set-helpers').has;\nvar size = require('../internals/set-size');\nvar getSetRecord = require('../internals/get-set-record');\nvar iterateSimple = require('../internals/iterate-simple');\nvar iteratorClose = require('../internals/iterator-close');\n\n// `Set.prototype.isSupersetOf` method\n// https://tc39.es/ecma262/#sec-set.prototype.issupersetof\nmodule.exports = function isSupersetOf(other) {\n  var O = aSet(this);\n  var otherRec = getSetRecord(other);\n  if (size(O) < otherRec.size) return false;\n  var iterator = otherRec.getIterator();\n  return iterateSimple(iterator, function (e) {\n    if (!has(O, e)) return iteratorClose(iterator, 'normal', false);\n  }) !== false;\n};\n","'use strict';\nvar isObject = require('../internals/is-object');\n\nvar $String = String;\nvar $TypeError = TypeError;\n\n// `Assert: Type(argument) is Object`\nmodule.exports = function (argument) {\n  if (isObject(argument)) return argument;\n  throw new $TypeError($String(argument) + ' is not an object');\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nObject.defineProperty(exports, \"default\", {\n    enumerable: true,\n    get: function() {\n        return toColorValue;\n    }\n});\nfunction toColorValue(maybeFunction) {\n    return typeof maybeFunction === \"function\" ? maybeFunction({}) : maybeFunction;\n}\n","'use strict';\nvar $ = require('../internals/export');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar IndexedObject = require('../internals/indexed-object');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\n\nvar nativeJoin = uncurryThis([].join);\n\nvar ES3_STRINGS = IndexedObject !== Object;\nvar FORCED = ES3_STRINGS || !arrayMethodIsStrict('join', ',');\n\n// `Array.prototype.join` method\n// https://tc39.es/ecma262/#sec-array.prototype.join\n$({ target: 'Array', proto: true, forced: FORCED }, {\n  join: function join(separator) {\n    return nativeJoin(toIndexedObject(this), separator === undefined ? ',' : separator);\n  }\n});\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nObject.defineProperty(exports, \"backgroundSize\", {\n    enumerable: true,\n    get: function() {\n        return backgroundSize;\n    }\n});\nconst _dataTypes = require(\"./dataTypes\");\nconst _splitAtTopLevelOnly = require(\"./splitAtTopLevelOnly\");\nfunction backgroundSize(value) {\n    let keywordValues = [\n        \"cover\",\n        \"contain\"\n    ];\n    // the <length-percentage> type will probably be a css function\n    // so we have to use `splitAtTopLevelOnly`\n    return (0, _splitAtTopLevelOnly.splitAtTopLevelOnly)(value, \",\").every((part)=>{\n        let sizes = (0, _splitAtTopLevelOnly.splitAtTopLevelOnly)(part, \"_\").filter(Boolean);\n        if (sizes.length === 1 && keywordValues.includes(sizes[0])) return true;\n        if (sizes.length !== 1 && sizes.length !== 2) return false;\n        return sizes.every((size)=>(0, _dataTypes.length)(size) || (0, _dataTypes.percentage)(size) || size === \"auto\");\n    });\n}\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar isCallable = require('../internals/is-callable');\n\nvar WeakMap = globalThis.WeakMap;\n\nmodule.exports = isCallable(WeakMap) && /native code/.test(String(WeakMap));\n","var x=String;\nvar create=function() {return {isColorSupported:false,reset:x,bold:x,dim:x,italic:x,underline:x,inverse:x,hidden:x,strikethrough:x,black:x,red:x,green:x,yellow:x,blue:x,magenta:x,cyan:x,white:x,gray:x,bgBlack:x,bgRed:x,bgGreen:x,bgYellow:x,bgBlue:x,bgMagenta:x,bgCyan:x,bgWhite:x,blackBright:x,redBright:x,greenBright:x,yellowBright:x,blueBright:x,magentaBright:x,cyanBright:x,whiteBright:x,bgBlackBright:x,bgRedBright:x,bgGreenBright:x,bgYellowBright:x,bgBlueBright:x,bgMagentaBright:x,bgCyanBright:x,bgWhiteBright:x}};\nmodule.exports=create();\nmodule.exports.createColors = create;\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar fails = require('../internals/fails');\n\n// V8 ~ Chrome 36-\n// https://bugs.chromium.org/p/v8/issues/detail?id=3334\nmodule.exports = DESCRIPTORS && fails(function () {\n  // eslint-disable-next-line es/no-object-defineproperty -- required for testing\n  return Object.defineProperty(function () { /* empty */ }, 'prototype', {\n    value: 42,\n    writable: false\n  }).prototype !== 42;\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar fails = require('../internals/fails');\nvar isArray = require('../internals/is-array');\nvar isObject = require('../internals/is-object');\nvar toObject = require('../internals/to-object');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\nvar doesNotExceedSafeInteger = require('../internals/does-not-exceed-safe-integer');\nvar createProperty = require('../internals/create-property');\nvar arraySpeciesCreate = require('../internals/array-species-create');\nvar arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar V8_VERSION = require('../internals/environment-v8-version');\n\nvar IS_CONCAT_SPREADABLE = wellKnownSymbol('isConcatSpreadable');\n\n// We can't use this feature detection in V8 since it causes\n// deoptimization and serious performance degradation\n// https://github.com/zloirock/core-js/issues/679\nvar IS_CONCAT_SPREADABLE_SUPPORT = V8_VERSION >= 51 || !fails(function () {\n  var array = [];\n  array[IS_CONCAT_SPREADABLE] = false;\n  return array.concat()[0] !== array;\n});\n\nvar isConcatSpreadable = function (O) {\n  if (!isObject(O)) return false;\n  var spreadable = O[IS_CONCAT_SPREADABLE];\n  return spreadable !== undefined ? !!spreadable : isArray(O);\n};\n\nvar FORCED = !IS_CONCAT_SPREADABLE_SUPPORT || !arrayMethodHasSpeciesSupport('concat');\n\n// `Array.prototype.concat` method\n// https://tc39.es/ecma262/#sec-array.prototype.concat\n// with adding support of @@isConcatSpreadable and @@species\n$({ target: 'Array', proto: true, arity: 1, forced: FORCED }, {\n  // eslint-disable-next-line no-unused-vars -- required for `.length`\n  concat: function concat(arg) {\n    var O = toObject(this);\n    var A = arraySpeciesCreate(O, 0);\n    var n = 0;\n    var i, k, length, len, E;\n    for (i = -1, length = arguments.length; i < length; i++) {\n      E = i === -1 ? O : arguments[i];\n      if (isConcatSpreadable(E)) {\n        len = lengthOfArrayLike(E);\n        doesNotExceedSafeInteger(n + len);\n        for (k = 0; k < len; k++, n++) if (k in E) createProperty(A, n, E[k]);\n      } else {\n        doesNotExceedSafeInteger(n + 1);\n        createProperty(A, n++, E);\n      }\n    }\n    A.length = n;\n    return A;\n  }\n});\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nfunction _export(target, all) {\n    for(var name in all)Object.defineProperty(target, name, {\n        enumerable: true,\n        get: all[name]\n    });\n}\n_export(exports, {\n    normalize: function() {\n        return normalize;\n    },\n    normalizeAttributeSelectors: function() {\n        return normalizeAttributeSelectors;\n    },\n    url: function() {\n        return url;\n    },\n    number: function() {\n        return number;\n    },\n    percentage: function() {\n        return percentage;\n    },\n    length: function() {\n        return length;\n    },\n    lineWidth: function() {\n        return lineWidth;\n    },\n    shadow: function() {\n        return shadow;\n    },\n    color: function() {\n        return color;\n    },\n    image: function() {\n        return image;\n    },\n    gradient: function() {\n        return gradient;\n    },\n    position: function() {\n        return position;\n    },\n    familyName: function() {\n        return familyName;\n    },\n    genericName: function() {\n        return genericName;\n    },\n    absoluteSize: function() {\n        return absoluteSize;\n    },\n    relativeSize: function() {\n        return relativeSize;\n    }\n});\nconst _color = require(\"./color\");\nconst _parseBoxShadowValue = require(\"./parseBoxShadowValue\");\nconst _splitAtTopLevelOnly = require(\"./splitAtTopLevelOnly\");\nlet cssFunctions = [\n    \"min\",\n    \"max\",\n    \"clamp\",\n    \"calc\"\n];\n// Ref: https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Types\nfunction isCSSFunction(value) {\n    return cssFunctions.some((fn)=>new RegExp(`^${fn}\\\\(.*\\\\)`).test(value));\n}\n// These properties accept a `<dashed-ident>` as one of the values. This means that you can use them\n// as: `timeline-scope: --tl;`\n//\n// Without the `var(--tl)`, in these cases we don't want to normalize the value, and you should add\n// the `var()` yourself.\n//\n// More info:\n// - https://drafts.csswg.org/scroll-animations/#propdef-timeline-scope\n// - https://developer.mozilla.org/en-US/docs/Web/CSS/timeline-scope#dashed-ident\n// - https://www.w3.org/TR/css-anchor-position-1\n//\nconst AUTO_VAR_INJECTION_EXCEPTIONS = new Set([\n    // Concrete properties\n    \"scroll-timeline-name\",\n    \"timeline-scope\",\n    \"view-timeline-name\",\n    \"font-palette\",\n    \"anchor-name\",\n    \"anchor-scope\",\n    \"position-anchor\",\n    \"position-try-options\",\n    // Shorthand properties\n    \"scroll-timeline\",\n    \"animation-timeline\",\n    \"view-timeline\",\n    \"position-try\"\n]);\nfunction normalize(value, context = null, isRoot = true) {\n    let isVarException = context && AUTO_VAR_INJECTION_EXCEPTIONS.has(context.property);\n    if (value.startsWith(\"--\") && !isVarException) {\n        return `var(${value})`;\n    }\n    // Keep raw strings if it starts with `url(`\n    if (value.includes(\"url(\")) {\n        return value.split(/(url\\(.*?\\))/g).filter(Boolean).map((part)=>{\n            if (/^url\\(.*?\\)$/.test(part)) {\n                return part;\n            }\n            return normalize(part, context, false);\n        }).join(\"\");\n    }\n    // Convert `_` to ` `, except for escaped underscores `\\_`\n    value = value.replace(/([^\\\\])_+/g, (fullMatch, characterBefore)=>characterBefore + \" \".repeat(fullMatch.length - 1)).replace(/^_/g, \" \").replace(/\\\\_/g, \"_\");\n    // Remove leftover whitespace\n    if (isRoot) {\n        value = value.trim();\n    }\n    value = normalizeMathOperatorSpacing(value);\n    return value;\n}\nfunction normalizeAttributeSelectors(value) {\n    // Wrap values in attribute selectors with quotes\n    if (value.includes(\"=\")) {\n        value = value.replace(/(=.*)/g, (_fullMatch, match)=>{\n            if (match[1] === \"'\" || match[1] === '\"') {\n                return match;\n            }\n            // Handle regex flags on unescaped values\n            if (match.length > 2) {\n                let trailingCharacter = match[match.length - 1];\n                if (match[match.length - 2] === \" \" && (trailingCharacter === \"i\" || trailingCharacter === \"I\" || trailingCharacter === \"s\" || trailingCharacter === \"S\")) {\n                    return `=\"${match.slice(1, -2)}\" ${match[match.length - 1]}`;\n                }\n            }\n            return `=\"${match.slice(1)}\"`;\n        });\n    }\n    return value;\n}\n/**\n * Add spaces around operators inside math functions\n * like calc() that do not follow an operator, '(', or `,`.\n *\n * @param {string} value\n * @returns {string}\n */ function normalizeMathOperatorSpacing(value) {\n    let preventFormattingInFunctions = [\n        \"theme\"\n    ];\n    let preventFormattingKeywords = [\n        \"min-content\",\n        \"max-content\",\n        \"fit-content\",\n        // Env\n        \"safe-area-inset-top\",\n        \"safe-area-inset-right\",\n        \"safe-area-inset-bottom\",\n        \"safe-area-inset-left\",\n        \"titlebar-area-x\",\n        \"titlebar-area-y\",\n        \"titlebar-area-width\",\n        \"titlebar-area-height\",\n        \"keyboard-inset-top\",\n        \"keyboard-inset-right\",\n        \"keyboard-inset-bottom\",\n        \"keyboard-inset-left\",\n        \"keyboard-inset-width\",\n        \"keyboard-inset-height\",\n        \"radial-gradient\",\n        \"linear-gradient\",\n        \"conic-gradient\",\n        \"repeating-radial-gradient\",\n        \"repeating-linear-gradient\",\n        \"repeating-conic-gradient\",\n        \"anchor-size\"\n    ];\n    return value.replace(/(calc|min|max|clamp)\\(.+\\)/g, (match)=>{\n        let result = \"\";\n        function lastChar() {\n            let char = result.trimEnd();\n            return char[char.length - 1];\n        }\n        for(let i = 0; i < match.length; i++){\n            function peek(word) {\n                return word.split(\"\").every((char, j)=>match[i + j] === char);\n            }\n            function consumeUntil(chars) {\n                let minIndex = Infinity;\n                for (let char of chars){\n                    let index = match.indexOf(char, i);\n                    if (index !== -1 && index < minIndex) {\n                        minIndex = index;\n                    }\n                }\n                let result = match.slice(i, minIndex);\n                i += result.length - 1;\n                return result;\n            }\n            let char = match[i];\n            // Handle `var(--variable)`\n            if (peek(\"var\")) {\n                // When we consume until `)`, then we are dealing with this scenario:\n                //   `var(--example)`\n                //\n                // When we consume until `,`, then we are dealing with this scenario:\n                //   `var(--example, 1rem)`\n                //\n                //   In this case we do want to \"format\", the default value as well\n                result += consumeUntil([\n                    \")\",\n                    \",\"\n                ]);\n            } else if (preventFormattingKeywords.some((keyword)=>peek(keyword))) {\n                let keyword = preventFormattingKeywords.find((keyword)=>peek(keyword));\n                result += keyword;\n                i += keyword.length - 1;\n            } else if (preventFormattingInFunctions.some((fn)=>peek(fn))) {\n                result += consumeUntil([\n                    \")\"\n                ]);\n            } else if (peek(\"[\")) {\n                result += consumeUntil([\n                    \"]\"\n                ]);\n            } else if ([\n                \"+\",\n                \"-\",\n                \"*\",\n                \"/\"\n            ].includes(char) && ![\n                \"(\",\n                \"+\",\n                \"-\",\n                \"*\",\n                \"/\",\n                \",\"\n            ].includes(lastChar())) {\n                result += ` ${char} `;\n            } else {\n                result += char;\n            }\n        }\n        // Simplify multiple spaces\n        return result.replace(/\\s+/g, \" \");\n    });\n}\nfunction url(value) {\n    return value.startsWith(\"url(\");\n}\nfunction number(value) {\n    return !isNaN(Number(value)) || isCSSFunction(value);\n}\nfunction percentage(value) {\n    return value.endsWith(\"%\") && number(value.slice(0, -1)) || isCSSFunction(value);\n}\n// Please refer to MDN when updating this list:\n// https://developer.mozilla.org/en-US/docs/Learn/CSS/Building_blocks/Values_and_units\n// https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Container_Queries#container_query_length_units\nlet lengthUnits = [\n    \"cm\",\n    \"mm\",\n    \"Q\",\n    \"in\",\n    \"pc\",\n    \"pt\",\n    \"px\",\n    \"em\",\n    \"ex\",\n    \"ch\",\n    \"rem\",\n    \"lh\",\n    \"rlh\",\n    \"vw\",\n    \"vh\",\n    \"vmin\",\n    \"vmax\",\n    \"vb\",\n    \"vi\",\n    \"svw\",\n    \"svh\",\n    \"lvw\",\n    \"lvh\",\n    \"dvw\",\n    \"dvh\",\n    \"cqw\",\n    \"cqh\",\n    \"cqi\",\n    \"cqb\",\n    \"cqmin\",\n    \"cqmax\"\n];\nlet lengthUnitsPattern = `(?:${lengthUnits.join(\"|\")})`;\nfunction length(value) {\n    return value === \"0\" || new RegExp(`^[+-]?[0-9]*\\.?[0-9]+(?:[eE][+-]?[0-9]+)?${lengthUnitsPattern}$`).test(value) || isCSSFunction(value);\n}\nlet lineWidths = new Set([\n    \"thin\",\n    \"medium\",\n    \"thick\"\n]);\nfunction lineWidth(value) {\n    return lineWidths.has(value);\n}\nfunction shadow(value) {\n    let parsedShadows = (0, _parseBoxShadowValue.parseBoxShadowValue)(normalize(value));\n    for (let parsedShadow of parsedShadows){\n        if (!parsedShadow.valid) {\n            return false;\n        }\n    }\n    return true;\n}\nfunction color(value) {\n    let colors = 0;\n    let result = (0, _splitAtTopLevelOnly.splitAtTopLevelOnly)(value, \"_\").every((part)=>{\n        part = normalize(part);\n        if (part.startsWith(\"var(\")) return true;\n        if ((0, _color.parseColor)(part, {\n            loose: true\n        }) !== null) return colors++, true;\n        return false;\n    });\n    if (!result) return false;\n    return colors > 0;\n}\nfunction image(value) {\n    let images = 0;\n    let result = (0, _splitAtTopLevelOnly.splitAtTopLevelOnly)(value, \",\").every((part)=>{\n        part = normalize(part);\n        if (part.startsWith(\"var(\")) return true;\n        if (url(part) || gradient(part) || [\n            \"element(\",\n            \"image(\",\n            \"cross-fade(\",\n            \"image-set(\"\n        ].some((fn)=>part.startsWith(fn))) {\n            images++;\n            return true;\n        }\n        return false;\n    });\n    if (!result) return false;\n    return images > 0;\n}\nlet gradientTypes = new Set([\n    \"conic-gradient\",\n    \"linear-gradient\",\n    \"radial-gradient\",\n    \"repeating-conic-gradient\",\n    \"repeating-linear-gradient\",\n    \"repeating-radial-gradient\"\n]);\nfunction gradient(value) {\n    value = normalize(value);\n    for (let type of gradientTypes){\n        if (value.startsWith(`${type}(`)) {\n            return true;\n        }\n    }\n    return false;\n}\nlet validPositions = new Set([\n    \"center\",\n    \"top\",\n    \"right\",\n    \"bottom\",\n    \"left\"\n]);\nfunction position(value) {\n    let positions = 0;\n    let result = (0, _splitAtTopLevelOnly.splitAtTopLevelOnly)(value, \"_\").every((part)=>{\n        part = normalize(part);\n        if (part.startsWith(\"var(\")) return true;\n        if (validPositions.has(part) || length(part) || percentage(part)) {\n            positions++;\n            return true;\n        }\n        return false;\n    });\n    if (!result) return false;\n    return positions > 0;\n}\nfunction familyName(value) {\n    let fonts = 0;\n    let result = (0, _splitAtTopLevelOnly.splitAtTopLevelOnly)(value, \",\").every((part)=>{\n        part = normalize(part);\n        if (part.startsWith(\"var(\")) return true;\n        // If it contains spaces, then it should be quoted\n        if (part.includes(\" \")) {\n            if (!/(['\"])([^\"']+)\\1/g.test(part)) {\n                return false;\n            }\n        }\n        // If it starts with a number, it's invalid\n        if (/^\\d/g.test(part)) {\n            return false;\n        }\n        fonts++;\n        return true;\n    });\n    if (!result) return false;\n    return fonts > 0;\n}\nlet genericNames = new Set([\n    \"serif\",\n    \"sans-serif\",\n    \"monospace\",\n    \"cursive\",\n    \"fantasy\",\n    \"system-ui\",\n    \"ui-serif\",\n    \"ui-sans-serif\",\n    \"ui-monospace\",\n    \"ui-rounded\",\n    \"math\",\n    \"emoji\",\n    \"fangsong\"\n]);\nfunction genericName(value) {\n    return genericNames.has(value);\n}\nlet absoluteSizes = new Set([\n    \"xx-small\",\n    \"x-small\",\n    \"small\",\n    \"medium\",\n    \"large\",\n    \"x-large\",\n    \"xx-large\",\n    \"xxx-large\"\n]);\nfunction absoluteSize(value) {\n    return absoluteSizes.has(value);\n}\nlet relativeSizes = new Set([\n    \"larger\",\n    \"smaller\"\n]);\nfunction relativeSize(value) {\n    return relativeSizes.has(value);\n}\n","'use strict';\n// IE8- don't enum bug keys\nmodule.exports = [\n  'constructor',\n  'hasOwnProperty',\n  'isPrototypeOf',\n  'propertyIsEnumerable',\n  'toLocaleString',\n  'toString',\n  'valueOf'\n];\n","'use strict';\nvar NATIVE_BIND = require('../internals/function-bind-native');\n\nvar FunctionPrototype = Function.prototype;\nvar apply = FunctionPrototype.apply;\nvar call = FunctionPrototype.call;\n\n// eslint-disable-next-line es/no-function-prototype-bind, es/no-reflect -- safe\nmodule.exports = typeof Reflect == 'object' && Reflect.apply || (NATIVE_BIND ? call.bind(apply) : function () {\n  return call.apply(apply, arguments);\n});\n","'use strict';\nvar aSet = require('../internals/a-set');\nvar SetHelpers = require('../internals/set-helpers');\nvar size = require('../internals/set-size');\nvar getSetRecord = require('../internals/get-set-record');\nvar iterateSet = require('../internals/set-iterate');\nvar iterateSimple = require('../internals/iterate-simple');\n\nvar Set = SetHelpers.Set;\nvar add = SetHelpers.add;\nvar has = SetHelpers.has;\n\n// `Set.prototype.intersection` method\n// https://tc39.es/ecma262/#sec-set.prototype.intersection\nmodule.exports = function intersection(other) {\n  var O = aSet(this);\n  var otherRec = getSetRecord(other);\n  var result = new Set();\n\n  if (size(O) > otherRec.size) {\n    iterateSimple(otherRec.getIterator(), function (e) {\n      if (has(O, e)) add(result, e);\n    });\n  } else {\n    iterateSet(O, function (e) {\n      if (otherRec.includes(e)) add(result, e);\n    });\n  }\n\n  return result;\n};\n","'use strict';\nvar $propertyIsEnumerable = {}.propertyIsEnumerable;\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// Nashorn ~ JDK8 bug\nvar NASHORN_BUG = getOwnPropertyDescriptor && !$propertyIsEnumerable.call({ 1: 2 }, 1);\n\n// `Object.prototype.propertyIsEnumerable` method implementation\n// https://tc39.es/ecma262/#sec-object.prototype.propertyisenumerable\nexports.f = NASHORN_BUG ? function propertyIsEnumerable(V) {\n  var descriptor = getOwnPropertyDescriptor(this, V);\n  return !!descriptor && descriptor.enumerable;\n} : $propertyIsEnumerable;\n","'use strict';\nvar PROPER_FUNCTION_NAME = require('../internals/function-name').PROPER;\nvar defineBuiltIn = require('../internals/define-built-in');\nvar anObject = require('../internals/an-object');\nvar $toString = require('../internals/to-string');\nvar fails = require('../internals/fails');\nvar getRegExpFlags = require('../internals/regexp-get-flags');\n\nvar TO_STRING = 'toString';\nvar RegExpPrototype = RegExp.prototype;\nvar nativeToString = RegExpPrototype[TO_STRING];\n\nvar NOT_GENERIC = fails(function () { return nativeToString.call({ source: 'a', flags: 'b' }) !== '/a/b'; });\n// FF44- RegExp#toString has a wrong name\nvar INCORRECT_NAME = PROPER_FUNCTION_NAME && nativeToString.name !== TO_STRING;\n\n// `RegExp.prototype.toString` method\n// https://tc39.es/ecma262/#sec-regexp.prototype.tostring\nif (NOT_GENERIC || INCORRECT_NAME) {\n  defineBuiltIn(RegExpPrototype, TO_STRING, function toString() {\n    var R = anObject(this);\n    var pattern = $toString(R.source);\n    var flags = $toString(getRegExpFlags(R));\n    return '/' + pattern + '/' + flags;\n  }, { unsafe: true });\n}\n","'use strict';\nvar fails = require('../internals/fails');\nvar globalThis = require('../internals/global-this');\n\n// babel-minify and Closure Compiler transpiles RegExp('(?<a>b)', 'g') -> /(?<a>b)/g and it causes SyntaxError\nvar $RegExp = globalThis.RegExp;\n\nmodule.exports = fails(function () {\n  var re = $RegExp('(?<a>b)', 'g');\n  return re.exec('b').groups.a !== 'b' ||\n    'b'.replace(re, '$<a>c') !== 'bc';\n});\n","/*! https://mths.be/cssesc v3.0.0 by @mathias */\n'use strict';\n\nvar object = {};\nvar hasOwnProperty = object.hasOwnProperty;\nvar merge = function merge(options, defaults) {\n\tif (!options) {\n\t\treturn defaults;\n\t}\n\tvar result = {};\n\tfor (var key in defaults) {\n\t\t// `if (defaults.hasOwnProperty(key) { … }` is not needed here, since\n\t\t// only recognized option names are used.\n\t\tresult[key] = hasOwnProperty.call(options, key) ? options[key] : defaults[key];\n\t}\n\treturn result;\n};\n\nvar regexAnySingleEscape = /[ -,\\.\\/:-@\\[-\\^`\\{-~]/;\nvar regexSingleEscape = /[ -,\\.\\/:-@\\[\\]\\^`\\{-~]/;\nvar regexAlwaysEscape = /['\"\\\\]/;\nvar regexExcessiveSpaces = /(^|\\\\+)?(\\\\[A-F0-9]{1,6})\\x20(?![a-fA-F0-9\\x20])/g;\n\n// https://mathiasbynens.be/notes/css-escapes#css\nvar cssesc = function cssesc(string, options) {\n\toptions = merge(options, cssesc.options);\n\tif (options.quotes != 'single' && options.quotes != 'double') {\n\t\toptions.quotes = 'single';\n\t}\n\tvar quote = options.quotes == 'double' ? '\"' : '\\'';\n\tvar isIdentifier = options.isIdentifier;\n\n\tvar firstChar = string.charAt(0);\n\tvar output = '';\n\tvar counter = 0;\n\tvar length = string.length;\n\twhile (counter < length) {\n\t\tvar character = string.charAt(counter++);\n\t\tvar codePoint = character.charCodeAt();\n\t\tvar value = void 0;\n\t\t// If it’s not a printable ASCII character…\n\t\tif (codePoint < 0x20 || codePoint > 0x7E) {\n\t\t\tif (codePoint >= 0xD800 && codePoint <= 0xDBFF && counter < length) {\n\t\t\t\t// It’s a high surrogate, and there is a next character.\n\t\t\t\tvar extra = string.charCodeAt(counter++);\n\t\t\t\tif ((extra & 0xFC00) == 0xDC00) {\n\t\t\t\t\t// next character is low surrogate\n\t\t\t\t\tcodePoint = ((codePoint & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000;\n\t\t\t\t} else {\n\t\t\t\t\t// It’s an unmatched surrogate; only append this code unit, in case\n\t\t\t\t\t// the next code unit is the high surrogate of a surrogate pair.\n\t\t\t\t\tcounter--;\n\t\t\t\t}\n\t\t\t}\n\t\t\tvalue = '\\\\' + codePoint.toString(16).toUpperCase() + ' ';\n\t\t} else {\n\t\t\tif (options.escapeEverything) {\n\t\t\t\tif (regexAnySingleEscape.test(character)) {\n\t\t\t\t\tvalue = '\\\\' + character;\n\t\t\t\t} else {\n\t\t\t\t\tvalue = '\\\\' + codePoint.toString(16).toUpperCase() + ' ';\n\t\t\t\t}\n\t\t\t} else if (/[\\t\\n\\f\\r\\x0B]/.test(character)) {\n\t\t\t\tvalue = '\\\\' + codePoint.toString(16).toUpperCase() + ' ';\n\t\t\t} else if (character == '\\\\' || !isIdentifier && (character == '\"' && quote == character || character == '\\'' && quote == character) || isIdentifier && regexSingleEscape.test(character)) {\n\t\t\t\tvalue = '\\\\' + character;\n\t\t\t} else {\n\t\t\t\tvalue = character;\n\t\t\t}\n\t\t}\n\t\toutput += value;\n\t}\n\n\tif (isIdentifier) {\n\t\tif (/^-[-\\d]/.test(output)) {\n\t\t\toutput = '\\\\-' + output.slice(1);\n\t\t} else if (/\\d/.test(firstChar)) {\n\t\t\toutput = '\\\\3' + firstChar + ' ' + output.slice(1);\n\t\t}\n\t}\n\n\t// Remove spaces after `\\HEX` escapes that are not followed by a hex digit,\n\t// since they’re redundant. Note that this is only possible if the escape\n\t// sequence isn’t preceded by an odd number of backslashes.\n\toutput = output.replace(regexExcessiveSpaces, function ($0, $1, $2) {\n\t\tif ($1 && $1.length % 2) {\n\t\t\t// It’s not safe to remove the space, so don’t.\n\t\t\treturn $0;\n\t\t}\n\t\t// Strip the space.\n\t\treturn ($1 || '') + $2;\n\t});\n\n\tif (!isIdentifier && options.wrap) {\n\t\treturn quote + output + quote;\n\t}\n\treturn output;\n};\n\n// Expose default options (so they can be overridden globally).\ncssesc.options = {\n\t'escapeEverything': false,\n\t'isIdentifier': false,\n\t'quotes': 'single',\n\t'wrap': false\n};\n\ncssesc.version = '3.0.0';\n\nmodule.exports = cssesc;\n","'use strict';\nvar $ = require('../internals/export');\nvar $parseInt = require('../internals/number-parse-int');\n\n// `parseInt` method\n// https://tc39.es/ecma262/#sec-parseint-string-radix\n$({ global: true, forced: parseInt !== $parseInt }, {\n  parseInt: $parseInt\n});\n","function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n/*!\n * Observer 3.14.2\n * https://gsap.com\n *\n * @license Copyright 2008-2025, GreenSock. All rights reserved.\n * Subject to the terms at https://gsap.com/standard-license\n * @author: Jack Doyle, jack@greensock.com\n*/\n\n/* eslint-disable */\nvar gsap,\n    _coreInitted,\n    _clamp,\n    _win,\n    _doc,\n    _docEl,\n    _body,\n    _isTouch,\n    _pointerType,\n    ScrollTrigger,\n    _root,\n    _normalizer,\n    _eventTypes,\n    _context,\n    _getGSAP = function _getGSAP() {\n  return gsap || typeof window !== \"undefined\" && (gsap = window.gsap) && gsap.registerPlugin && gsap;\n},\n    _startup = 1,\n    _observers = [],\n    _scrollers = [],\n    _proxies = [],\n    _getTime = Date.now,\n    _bridge = function _bridge(name, value) {\n  return value;\n},\n    _integrate = function _integrate() {\n  var core = ScrollTrigger.core,\n      data = core.bridge || {},\n      scrollers = core._scrollers,\n      proxies = core._proxies;\n  scrollers.push.apply(scrollers, _scrollers);\n  proxies.push.apply(proxies, _proxies);\n  _scrollers = scrollers;\n  _proxies = proxies;\n\n  _bridge = function _bridge(name, value) {\n    return data[name](value);\n  };\n},\n    _getProxyProp = function _getProxyProp(element, property) {\n  return ~_proxies.indexOf(element) && _proxies[_proxies.indexOf(element) + 1][property];\n},\n    _isViewport = function _isViewport(el) {\n  return !!~_root.indexOf(el);\n},\n    _addListener = function _addListener(element, type, func, passive, capture) {\n  return element.addEventListener(type, func, {\n    passive: passive !== false,\n    capture: !!capture\n  });\n},\n    _removeListener = function _removeListener(element, type, func, capture) {\n  return element.removeEventListener(type, func, !!capture);\n},\n    _scrollLeft = \"scrollLeft\",\n    _scrollTop = \"scrollTop\",\n    _onScroll = function _onScroll() {\n  return _normalizer && _normalizer.isPressed || _scrollers.cache++;\n},\n    _scrollCacheFunc = function _scrollCacheFunc(f, doNotCache) {\n  var cachingFunc = function cachingFunc(value) {\n    // since reading the scrollTop/scrollLeft/pageOffsetY/pageOffsetX can trigger a layout, this function allows us to cache the value so it only gets read fresh after a \"scroll\" event fires (or while we're refreshing because that can lengthen the page and alter the scroll position). when \"soft\" is true, that means don't actually set the scroll, but cache the new value instead (useful in ScrollSmoother)\n    if (value || value === 0) {\n      _startup && (_win.history.scrollRestoration = \"manual\"); // otherwise the new position will get overwritten by the browser onload.\n\n      var isNormalizing = _normalizer && _normalizer.isPressed;\n      value = cachingFunc.v = Math.round(value) || (_normalizer && _normalizer.iOS ? 1 : 0); //TODO: iOS Bug: if you allow it to go to 0, Safari can start to report super strange (wildly inaccurate) touch positions!\n\n      f(value);\n      cachingFunc.cacheID = _scrollers.cache;\n      isNormalizing && _bridge(\"ss\", value); // set scroll (notify ScrollTrigger so it can dispatch a \"scrollStart\" event if necessary\n    } else if (doNotCache || _scrollers.cache !== cachingFunc.cacheID || _bridge(\"ref\")) {\n      cachingFunc.cacheID = _scrollers.cache;\n      cachingFunc.v = f();\n    }\n\n    return cachingFunc.v + cachingFunc.offset;\n  };\n\n  cachingFunc.offset = 0;\n  return f && cachingFunc;\n},\n    _horizontal = {\n  s: _scrollLeft,\n  p: \"left\",\n  p2: \"Left\",\n  os: \"right\",\n  os2: \"Right\",\n  d: \"width\",\n  d2: \"Width\",\n  a: \"x\",\n  sc: _scrollCacheFunc(function (value) {\n    return arguments.length ? _win.scrollTo(value, _vertical.sc()) : _win.pageXOffset || _doc[_scrollLeft] || _docEl[_scrollLeft] || _body[_scrollLeft] || 0;\n  })\n},\n    _vertical = {\n  s: _scrollTop,\n  p: \"top\",\n  p2: \"Top\",\n  os: \"bottom\",\n  os2: \"Bottom\",\n  d: \"height\",\n  d2: \"Height\",\n  a: \"y\",\n  op: _horizontal,\n  sc: _scrollCacheFunc(function (value) {\n    return arguments.length ? _win.scrollTo(_horizontal.sc(), value) : _win.pageYOffset || _doc[_scrollTop] || _docEl[_scrollTop] || _body[_scrollTop] || 0;\n  })\n},\n    _getTarget = function _getTarget(t, self) {\n  return (self && self._ctx && self._ctx.selector || gsap.utils.toArray)(t)[0] || (typeof t === \"string\" && gsap.config().nullTargetWarn !== false ? console.warn(\"Element not found:\", t) : null);\n},\n    _isWithin = function _isWithin(element, list) {\n  // check if the element is in the list or is a descendant of an element in the list.\n  var i = list.length;\n\n  while (i--) {\n    if (list[i] === element || list[i].contains(element)) {\n      return true;\n    }\n  }\n\n  return false;\n},\n    _getScrollFunc = function _getScrollFunc(element, _ref) {\n  var s = _ref.s,\n      sc = _ref.sc;\n  // we store the scroller functions in an alternating sequenced Array like [element, verticalScrollFunc, horizontalScrollFunc, ...] so that we can minimize memory, maximize performance, and we also record the last position as a \".rec\" property in order to revert to that after refreshing to ensure things don't shift around.\n  _isViewport(element) && (element = _doc.scrollingElement || _docEl);\n\n  var i = _scrollers.indexOf(element),\n      offset = sc === _vertical.sc ? 1 : 2;\n\n  !~i && (i = _scrollers.push(element) - 1);\n  _scrollers[i + offset] || _addListener(element, \"scroll\", _onScroll); // clear the cache when a scroll occurs\n\n  var prev = _scrollers[i + offset],\n      func = prev || (_scrollers[i + offset] = _scrollCacheFunc(_getProxyProp(element, s), true) || (_isViewport(element) ? sc : _scrollCacheFunc(function (value) {\n    return arguments.length ? element[s] = value : element[s];\n  })));\n  func.target = element;\n  prev || (func.smooth = gsap.getProperty(element, \"scrollBehavior\") === \"smooth\"); // only set it the first time (don't reset every time a scrollFunc is requested because perhaps it happens during a refresh() when it's disabled in ScrollTrigger.\n\n  return func;\n},\n    _getVelocityProp = function _getVelocityProp(value, minTimeRefresh, useDelta) {\n  var v1 = value,\n      v2 = value,\n      t1 = _getTime(),\n      t2 = t1,\n      min = minTimeRefresh || 50,\n      dropToZeroTime = Math.max(500, min * 3),\n      update = function update(value, force) {\n    var t = _getTime();\n\n    if (force || t - t1 > min) {\n      v2 = v1;\n      v1 = value;\n      t2 = t1;\n      t1 = t;\n    } else if (useDelta) {\n      v1 += value;\n    } else {\n      // not totally necessary, but makes it a bit more accurate by adjusting the v1 value according to the new slope. This way we're not just ignoring the incoming data. Removing for now because it doesn't seem to make much practical difference and it's probably not worth the kb.\n      v1 = v2 + (value - v2) / (t - t2) * (t1 - t2);\n    }\n  },\n      reset = function reset() {\n    v2 = v1 = useDelta ? 0 : v1;\n    t2 = t1 = 0;\n  },\n      getVelocity = function getVelocity(latestValue) {\n    var tOld = t2,\n        vOld = v2,\n        t = _getTime();\n\n    (latestValue || latestValue === 0) && latestValue !== v1 && update(latestValue);\n    return t1 === t2 || t - t2 > dropToZeroTime ? 0 : (v1 + (useDelta ? vOld : -vOld)) / ((useDelta ? t : t1) - tOld) * 1000;\n  };\n\n  return {\n    update: update,\n    reset: reset,\n    getVelocity: getVelocity\n  };\n},\n    _getEvent = function _getEvent(e, preventDefault) {\n  preventDefault && !e._gsapAllow && e.preventDefault();\n  return e.changedTouches ? e.changedTouches[0] : e;\n},\n    _getAbsoluteMax = function _getAbsoluteMax(a) {\n  var max = Math.max.apply(Math, a),\n      min = Math.min.apply(Math, a);\n  return Math.abs(max) >= Math.abs(min) ? max : min;\n},\n    _setScrollTrigger = function _setScrollTrigger() {\n  ScrollTrigger = gsap.core.globals().ScrollTrigger;\n  ScrollTrigger && ScrollTrigger.core && _integrate();\n},\n    _initCore = function _initCore(core) {\n  gsap = core || _getGSAP();\n\n  if (!_coreInitted && gsap && typeof document !== \"undefined\" && document.body) {\n    _win = window;\n    _doc = document;\n    _docEl = _doc.documentElement;\n    _body = _doc.body;\n    _root = [_win, _doc, _docEl, _body];\n    _clamp = gsap.utils.clamp;\n\n    _context = gsap.core.context || function () {};\n\n    _pointerType = \"onpointerenter\" in _body ? \"pointer\" : \"mouse\"; // isTouch is 0 if no touch, 1 if ONLY touch, and 2 if it can accommodate touch but also other types like mouse/pointer.\n\n    _isTouch = Observer.isTouch = _win.matchMedia && _win.matchMedia(\"(hover: none), (pointer: coarse)\").matches ? 1 : \"ontouchstart\" in _win || navigator.maxTouchPoints > 0 || navigator.msMaxTouchPoints > 0 ? 2 : 0;\n    _eventTypes = Observer.eventTypes = (\"ontouchstart\" in _docEl ? \"touchstart,touchmove,touchcancel,touchend\" : !(\"onpointerdown\" in _docEl) ? \"mousedown,mousemove,mouseup,mouseup\" : \"pointerdown,pointermove,pointercancel,pointerup\").split(\",\");\n    setTimeout(function () {\n      return _startup = 0;\n    }, 500);\n\n    _setScrollTrigger();\n\n    _coreInitted = 1;\n  }\n\n  return _coreInitted;\n};\n\n_horizontal.op = _vertical;\n_scrollers.cache = 0;\nexport var Observer = /*#__PURE__*/function () {\n  function Observer(vars) {\n    this.init(vars);\n  }\n\n  var _proto = Observer.prototype;\n\n  _proto.init = function init(vars) {\n    _coreInitted || _initCore(gsap) || console.warn(\"Please gsap.registerPlugin(Observer)\");\n    ScrollTrigger || _setScrollTrigger();\n    var tolerance = vars.tolerance,\n        dragMinimum = vars.dragMinimum,\n        type = vars.type,\n        target = vars.target,\n        lineHeight = vars.lineHeight,\n        debounce = vars.debounce,\n        preventDefault = vars.preventDefault,\n        onStop = vars.onStop,\n        onStopDelay = vars.onStopDelay,\n        ignore = vars.ignore,\n        wheelSpeed = vars.wheelSpeed,\n        event = vars.event,\n        onDragStart = vars.onDragStart,\n        onDragEnd = vars.onDragEnd,\n        onDrag = vars.onDrag,\n        onPress = vars.onPress,\n        onRelease = vars.onRelease,\n        onRight = vars.onRight,\n        onLeft = vars.onLeft,\n        onUp = vars.onUp,\n        onDown = vars.onDown,\n        onChangeX = vars.onChangeX,\n        onChangeY = vars.onChangeY,\n        onChange = vars.onChange,\n        onToggleX = vars.onToggleX,\n        onToggleY = vars.onToggleY,\n        onHover = vars.onHover,\n        onHoverEnd = vars.onHoverEnd,\n        onMove = vars.onMove,\n        ignoreCheck = vars.ignoreCheck,\n        isNormalizer = vars.isNormalizer,\n        onGestureStart = vars.onGestureStart,\n        onGestureEnd = vars.onGestureEnd,\n        onWheel = vars.onWheel,\n        onEnable = vars.onEnable,\n        onDisable = vars.onDisable,\n        onClick = vars.onClick,\n        scrollSpeed = vars.scrollSpeed,\n        capture = vars.capture,\n        allowClicks = vars.allowClicks,\n        lockAxis = vars.lockAxis,\n        onLockAxis = vars.onLockAxis;\n    this.target = target = _getTarget(target) || _docEl;\n    this.vars = vars;\n    ignore && (ignore = gsap.utils.toArray(ignore));\n    tolerance = tolerance || 1e-9;\n    dragMinimum = dragMinimum || 0;\n    wheelSpeed = wheelSpeed || 1;\n    scrollSpeed = scrollSpeed || 1;\n    type = type || \"wheel,touch,pointer\";\n    debounce = debounce !== false;\n    lineHeight || (lineHeight = parseFloat(_win.getComputedStyle(_body).lineHeight) || 22); // note: browser may report \"normal\", so default to 22.\n\n    var id,\n        onStopDelayedCall,\n        dragged,\n        moved,\n        wheeled,\n        locked,\n        axis,\n        self = this,\n        prevDeltaX = 0,\n        prevDeltaY = 0,\n        passive = vars.passive || !preventDefault && vars.passive !== false,\n        scrollFuncX = _getScrollFunc(target, _horizontal),\n        scrollFuncY = _getScrollFunc(target, _vertical),\n        scrollX = scrollFuncX(),\n        scrollY = scrollFuncY(),\n        limitToTouch = ~type.indexOf(\"touch\") && !~type.indexOf(\"pointer\") && _eventTypes[0] === \"pointerdown\",\n        // for devices that accommodate mouse events and touch events, we need to distinguish.\n    isViewport = _isViewport(target),\n        ownerDoc = target.ownerDocument || _doc,\n        deltaX = [0, 0, 0],\n        // wheel, scroll, pointer/touch\n    deltaY = [0, 0, 0],\n        onClickTime = 0,\n        clickCapture = function clickCapture() {\n      return onClickTime = _getTime();\n    },\n        _ignoreCheck = function _ignoreCheck(e, isPointerOrTouch) {\n      return (self.event = e) && ignore && _isWithin(e.target, ignore) || isPointerOrTouch && limitToTouch && e.pointerType !== \"touch\" || ignoreCheck && ignoreCheck(e, isPointerOrTouch);\n    },\n        onStopFunc = function onStopFunc() {\n      self._vx.reset();\n\n      self._vy.reset();\n\n      onStopDelayedCall.pause();\n      onStop && onStop(self);\n    },\n        update = function update() {\n      var dx = self.deltaX = _getAbsoluteMax(deltaX),\n          dy = self.deltaY = _getAbsoluteMax(deltaY),\n          changedX = Math.abs(dx) >= tolerance,\n          changedY = Math.abs(dy) >= tolerance;\n\n      onChange && (changedX || changedY) && onChange(self, dx, dy, deltaX, deltaY); // in ScrollTrigger.normalizeScroll(), we need to know if it was touch/pointer so we need access to the deltaX/deltaY Arrays before we clear them out.\n\n      if (changedX) {\n        onRight && self.deltaX > 0 && onRight(self);\n        onLeft && self.deltaX < 0 && onLeft(self);\n        onChangeX && onChangeX(self);\n        onToggleX && self.deltaX < 0 !== prevDeltaX < 0 && onToggleX(self);\n        prevDeltaX = self.deltaX;\n        deltaX[0] = deltaX[1] = deltaX[2] = 0;\n      }\n\n      if (changedY) {\n        onDown && self.deltaY > 0 && onDown(self);\n        onUp && self.deltaY < 0 && onUp(self);\n        onChangeY && onChangeY(self);\n        onToggleY && self.deltaY < 0 !== prevDeltaY < 0 && onToggleY(self);\n        prevDeltaY = self.deltaY;\n        deltaY[0] = deltaY[1] = deltaY[2] = 0;\n      }\n\n      if (moved || dragged) {\n        onMove && onMove(self);\n\n        if (dragged) {\n          onDragStart && dragged === 1 && onDragStart(self);\n          onDrag && onDrag(self);\n          dragged = 0;\n        }\n\n        moved = false;\n      }\n\n      locked && !(locked = false) && onLockAxis && onLockAxis(self);\n\n      if (wheeled) {\n        onWheel(self);\n        wheeled = false;\n      }\n\n      id = 0;\n    },\n        onDelta = function onDelta(x, y, index) {\n      deltaX[index] += x;\n      deltaY[index] += y;\n\n      self._vx.update(x);\n\n      self._vy.update(y);\n\n      debounce ? id || (id = requestAnimationFrame(update)) : update();\n    },\n        onTouchOrPointerDelta = function onTouchOrPointerDelta(x, y) {\n      if (lockAxis && !axis) {\n        self.axis = axis = Math.abs(x) > Math.abs(y) ? \"x\" : \"y\";\n        locked = true;\n      }\n\n      if (axis !== \"y\") {\n        deltaX[2] += x;\n\n        self._vx.update(x, true); // update the velocity as frequently as possible instead of in the debounced function so that very quick touch-scrolls (flicks) feel natural. If it's the mouse/touch/pointer, force it so that we get snappy/accurate momentum scroll.\n\n      }\n\n      if (axis !== \"x\") {\n        deltaY[2] += y;\n\n        self._vy.update(y, true);\n      }\n\n      debounce ? id || (id = requestAnimationFrame(update)) : update();\n    },\n        _onDrag = function _onDrag(e) {\n      if (_ignoreCheck(e, 1)) {\n        return;\n      }\n\n      e = _getEvent(e, preventDefault);\n      var x = e.clientX,\n          y = e.clientY,\n          dx = x - self.x,\n          dy = y - self.y,\n          isDragging = self.isDragging;\n      self.x = x;\n      self.y = y;\n\n      if (isDragging || (dx || dy) && (Math.abs(self.startX - x) >= dragMinimum || Math.abs(self.startY - y) >= dragMinimum)) {\n        dragged || (dragged = isDragging ? 2 : 1); // dragged: 0 = not dragging, 1 = first drag, 2 = normal drag\n\n        isDragging || (self.isDragging = true);\n        onTouchOrPointerDelta(dx, dy);\n      }\n    },\n        _onPress = self.onPress = function (e) {\n      if (_ignoreCheck(e, 1) || e && e.button) {\n        return;\n      }\n\n      self.axis = axis = null;\n      onStopDelayedCall.pause();\n      self.isPressed = true;\n      e = _getEvent(e); // note: may need to preventDefault(?) Won't side-scroll on iOS Safari if we do, though.\n\n      prevDeltaX = prevDeltaY = 0;\n      self.startX = self.x = e.clientX;\n      self.startY = self.y = e.clientY;\n\n      self._vx.reset(); // otherwise the t2 may be stale if the user touches and flicks super fast and releases in less than 2 requestAnimationFrame ticks, causing velocity to be 0.\n\n\n      self._vy.reset();\n\n      _addListener(isNormalizer ? target : ownerDoc, _eventTypes[1], _onDrag, passive, true);\n\n      self.deltaX = self.deltaY = 0;\n      onPress && onPress(self);\n    },\n        _onRelease = self.onRelease = function (e) {\n      if (_ignoreCheck(e, 1)) {\n        return;\n      }\n\n      _removeListener(isNormalizer ? target : ownerDoc, _eventTypes[1], _onDrag, true);\n\n      var isTrackingDrag = !isNaN(self.y - self.startY),\n          wasDragging = self.isDragging,\n          isDragNotClick = wasDragging && (Math.abs(self.x - self.startX) > 3 || Math.abs(self.y - self.startY) > 3),\n          // some touch devices need some wiggle room in terms of sensing clicks - the finger may move a few pixels.\n      eventData = _getEvent(e);\n\n      if (!isDragNotClick && isTrackingDrag) {\n        self._vx.reset();\n\n        self._vy.reset(); //if (preventDefault && allowClicks && self.isPressed) { // check isPressed because in a rare edge case, the inputObserver in ScrollTrigger may stopPropagation() on the press/drag, so the onRelease may get fired without the onPress/onDrag ever getting called, thus it could trigger a click to occur on a link after scroll-dragging it.\n\n\n        if (preventDefault && allowClicks) {\n          gsap.delayedCall(0.08, function () {\n            // some browsers (like Firefox) won't trust script-generated clicks, so if the user tries to click on a video to play it, for example, it simply won't work. Since a regular \"click\" event will most likely be generated anyway (one that has its isTrusted flag set to true), we must slightly delay our script-generated click so that the \"real\"/trusted one is prioritized. Remember, when there are duplicate events in quick succession, we suppress all but the first one. Some browsers don't even trigger the \"real\" one at all, so our synthetic one is a safety valve that ensures that no matter what, a click event does get dispatched.\n            if (_getTime() - onClickTime > 300 && !e.defaultPrevented) {\n              if (e.target.click) {\n                //some browsers (like mobile Safari) don't properly trigger the click event\n                e.target.click();\n              } else if (ownerDoc.createEvent) {\n                var syntheticEvent = ownerDoc.createEvent(\"MouseEvents\");\n                syntheticEvent.initMouseEvent(\"click\", true, true, _win, 1, eventData.screenX, eventData.screenY, eventData.clientX, eventData.clientY, false, false, false, false, 0, null);\n                e.target.dispatchEvent(syntheticEvent);\n              }\n            }\n          });\n        }\n      }\n\n      self.isDragging = self.isGesturing = self.isPressed = false;\n      onStop && wasDragging && !isNormalizer && onStopDelayedCall.restart(true);\n      dragged && update(); // in case debouncing, we don't want onDrag to fire AFTER onDragEnd().\n\n      onDragEnd && wasDragging && onDragEnd(self);\n      onRelease && onRelease(self, isDragNotClick);\n    },\n        _onGestureStart = function _onGestureStart(e) {\n      return e.touches && e.touches.length > 1 && (self.isGesturing = true) && onGestureStart(e, self.isDragging);\n    },\n        _onGestureEnd = function _onGestureEnd() {\n      return (self.isGesturing = false) || onGestureEnd(self);\n    },\n        onScroll = function onScroll(e) {\n      if (_ignoreCheck(e)) {\n        return;\n      }\n\n      var x = scrollFuncX(),\n          y = scrollFuncY();\n      onDelta((x - scrollX) * scrollSpeed, (y - scrollY) * scrollSpeed, 1);\n      scrollX = x;\n      scrollY = y;\n      onStop && onStopDelayedCall.restart(true);\n    },\n        _onWheel = function _onWheel(e) {\n      if (_ignoreCheck(e)) {\n        return;\n      }\n\n      e = _getEvent(e, preventDefault);\n      onWheel && (wheeled = true);\n      var multiplier = (e.deltaMode === 1 ? lineHeight : e.deltaMode === 2 ? _win.innerHeight : 1) * wheelSpeed;\n      onDelta(e.deltaX * multiplier, e.deltaY * multiplier, 0);\n      onStop && !isNormalizer && onStopDelayedCall.restart(true);\n    },\n        _onMove = function _onMove(e) {\n      if (_ignoreCheck(e)) {\n        return;\n      }\n\n      var x = e.clientX,\n          y = e.clientY,\n          dx = x - self.x,\n          dy = y - self.y;\n      self.x = x;\n      self.y = y;\n      moved = true;\n      onStop && onStopDelayedCall.restart(true);\n      (dx || dy) && onTouchOrPointerDelta(dx, dy);\n    },\n        _onHover = function _onHover(e) {\n      self.event = e;\n      onHover(self);\n    },\n        _onHoverEnd = function _onHoverEnd(e) {\n      self.event = e;\n      onHoverEnd(self);\n    },\n        _onClick = function _onClick(e) {\n      return _ignoreCheck(e) || _getEvent(e, preventDefault) && onClick(self);\n    };\n\n    onStopDelayedCall = self._dc = gsap.delayedCall(onStopDelay || 0.25, onStopFunc).pause();\n    self.deltaX = self.deltaY = 0;\n    self._vx = _getVelocityProp(0, 50, true);\n    self._vy = _getVelocityProp(0, 50, true);\n    self.scrollX = scrollFuncX;\n    self.scrollY = scrollFuncY;\n    self.isDragging = self.isGesturing = self.isPressed = false;\n\n    _context(this);\n\n    self.enable = function (e) {\n      if (!self.isEnabled) {\n        _addListener(isViewport ? ownerDoc : target, \"scroll\", _onScroll);\n\n        type.indexOf(\"scroll\") >= 0 && _addListener(isViewport ? ownerDoc : target, \"scroll\", onScroll, passive, capture);\n        type.indexOf(\"wheel\") >= 0 && _addListener(target, \"wheel\", _onWheel, passive, capture);\n\n        if (type.indexOf(\"touch\") >= 0 && _isTouch || type.indexOf(\"pointer\") >= 0) {\n          _addListener(target, _eventTypes[0], _onPress, passive, capture);\n\n          _addListener(ownerDoc, _eventTypes[2], _onRelease);\n\n          _addListener(ownerDoc, _eventTypes[3], _onRelease);\n\n          allowClicks && _addListener(target, \"click\", clickCapture, true, true);\n          onClick && _addListener(target, \"click\", _onClick);\n          onGestureStart && _addListener(ownerDoc, \"gesturestart\", _onGestureStart);\n          onGestureEnd && _addListener(ownerDoc, \"gestureend\", _onGestureEnd);\n          onHover && _addListener(target, _pointerType + \"enter\", _onHover);\n          onHoverEnd && _addListener(target, _pointerType + \"leave\", _onHoverEnd);\n          onMove && _addListener(target, _pointerType + \"move\", _onMove);\n        }\n\n        self.isEnabled = true;\n        self.isDragging = self.isGesturing = self.isPressed = moved = dragged = false;\n\n        self._vx.reset();\n\n        self._vy.reset();\n\n        scrollX = scrollFuncX();\n        scrollY = scrollFuncY();\n        e && e.type && _onPress(e);\n        onEnable && onEnable(self);\n      }\n\n      return self;\n    };\n\n    self.disable = function () {\n      if (self.isEnabled) {\n        // only remove the _onScroll listener if there aren't any others that rely on the functionality.\n        _observers.filter(function (o) {\n          return o !== self && _isViewport(o.target);\n        }).length || _removeListener(isViewport ? ownerDoc : target, \"scroll\", _onScroll);\n\n        if (self.isPressed) {\n          self._vx.reset();\n\n          self._vy.reset();\n\n          _removeListener(isNormalizer ? target : ownerDoc, _eventTypes[1], _onDrag, true);\n        }\n\n        _removeListener(isViewport ? ownerDoc : target, \"scroll\", onScroll, capture);\n\n        _removeListener(target, \"wheel\", _onWheel, capture);\n\n        _removeListener(target, _eventTypes[0], _onPress, capture);\n\n        _removeListener(ownerDoc, _eventTypes[2], _onRelease);\n\n        _removeListener(ownerDoc, _eventTypes[3], _onRelease);\n\n        _removeListener(target, \"click\", clickCapture, true);\n\n        _removeListener(target, \"click\", _onClick);\n\n        _removeListener(ownerDoc, \"gesturestart\", _onGestureStart);\n\n        _removeListener(ownerDoc, \"gestureend\", _onGestureEnd);\n\n        _removeListener(target, _pointerType + \"enter\", _onHover);\n\n        _removeListener(target, _pointerType + \"leave\", _onHoverEnd);\n\n        _removeListener(target, _pointerType + \"move\", _onMove);\n\n        self.isEnabled = self.isPressed = self.isDragging = false;\n        onDisable && onDisable(self);\n      }\n    };\n\n    self.kill = self.revert = function () {\n      self.disable();\n\n      var i = _observers.indexOf(self);\n\n      i >= 0 && _observers.splice(i, 1);\n      _normalizer === self && (_normalizer = 0);\n    };\n\n    _observers.push(self);\n\n    isNormalizer && _isViewport(target) && (_normalizer = self);\n    self.enable(event);\n  };\n\n  _createClass(Observer, [{\n    key: \"velocityX\",\n    get: function get() {\n      return this._vx.getVelocity();\n    }\n  }, {\n    key: \"velocityY\",\n    get: function get() {\n      return this._vy.getVelocity();\n    }\n  }]);\n\n  return Observer;\n}();\nObserver.version = \"3.14.2\";\n\nObserver.create = function (vars) {\n  return new Observer(vars);\n};\n\nObserver.register = _initCore;\n\nObserver.getAll = function () {\n  return _observers.slice();\n};\n\nObserver.getById = function (id) {\n  return _observers.filter(function (o) {\n    return o.vars.id === id;\n  })[0];\n};\n\n_getGSAP() && gsap.registerPlugin(Observer);\nexport { Observer as default, _isViewport, _scrollers, _getScrollFunc, _getProxyProp, _proxies, _getVelocityProp, _vertical, _horizontal, _getTarget };","/*!\n * ScrollTrigger 3.14.2\n * https://gsap.com\n *\n * @license Copyright 2008-2025, GreenSock. All rights reserved.\n * Subject to the terms at https://gsap.com/standard-license\n * @author: Jack Doyle, jack@greensock.com\n*/\n\n/* eslint-disable */\nimport { Observer, _getTarget, _vertical, _horizontal, _scrollers, _proxies, _getScrollFunc, _getProxyProp, _getVelocityProp } from \"./Observer.js\";\n\nvar gsap,\n    _coreInitted,\n    _win,\n    _doc,\n    _docEl,\n    _body,\n    _root,\n    _resizeDelay,\n    _toArray,\n    _clamp,\n    _time2,\n    _syncInterval,\n    _refreshing,\n    _pointerIsDown,\n    _transformProp,\n    _i,\n    _prevWidth,\n    _prevHeight,\n    _autoRefresh,\n    _sort,\n    _suppressOverwrites,\n    _ignoreResize,\n    _normalizer,\n    _ignoreMobileResize,\n    _baseScreenHeight,\n    _baseScreenWidth,\n    _fixIOSBug,\n    _context,\n    _scrollRestoration,\n    _div100vh,\n    _100vh,\n    _isReverted,\n    _clampingMax,\n    _limitCallbacks,\n    // if true, we'll only trigger callbacks if the active state toggles, so if you scroll immediately past both the start and end positions of a ScrollTrigger (thus inactive to inactive), neither its onEnter nor onLeave will be called. This is useful during startup.\n_startup = 1,\n    _getTime = Date.now,\n    _time1 = _getTime(),\n    _lastScrollTime = 0,\n    _enabled = 0,\n    _parseClamp = function _parseClamp(value, type, self) {\n  var clamp = _isString(value) && (value.substr(0, 6) === \"clamp(\" || value.indexOf(\"max\") > -1);\n  self[\"_\" + type + \"Clamp\"] = clamp;\n  return clamp ? value.substr(6, value.length - 7) : value;\n},\n    _keepClamp = function _keepClamp(value, clamp) {\n  return clamp && (!_isString(value) || value.substr(0, 6) !== \"clamp(\") ? \"clamp(\" + value + \")\" : value;\n},\n    _rafBugFix = function _rafBugFix() {\n  return _enabled && requestAnimationFrame(_rafBugFix);\n},\n    // in some browsers (like Firefox), screen repaints weren't consistent unless we had SOMETHING queued up in requestAnimationFrame()! So this just creates a super simple loop to keep it alive and smooth out repaints.\n_pointerDownHandler = function _pointerDownHandler() {\n  return _pointerIsDown = 1;\n},\n    _pointerUpHandler = function _pointerUpHandler() {\n  return _pointerIsDown = 0;\n},\n    _passThrough = function _passThrough(v) {\n  return v;\n},\n    _round = function _round(value) {\n  return Math.round(value * 100000) / 100000 || 0;\n},\n    _windowExists = function _windowExists() {\n  return typeof window !== \"undefined\";\n},\n    _getGSAP = function _getGSAP() {\n  return gsap || _windowExists() && (gsap = window.gsap) && gsap.registerPlugin && gsap;\n},\n    _isViewport = function _isViewport(e) {\n  return !!~_root.indexOf(e);\n},\n    _getViewportDimension = function _getViewportDimension(dimensionProperty) {\n  return (dimensionProperty === \"Height\" ? _100vh : _win[\"inner\" + dimensionProperty]) || _docEl[\"client\" + dimensionProperty] || _body[\"client\" + dimensionProperty];\n},\n    _getBoundsFunc = function _getBoundsFunc(element) {\n  return _getProxyProp(element, \"getBoundingClientRect\") || (_isViewport(element) ? function () {\n    _winOffsets.width = _win.innerWidth;\n    _winOffsets.height = _100vh;\n    return _winOffsets;\n  } : function () {\n    return _getBounds(element);\n  });\n},\n    _getSizeFunc = function _getSizeFunc(scroller, isViewport, _ref) {\n  var d = _ref.d,\n      d2 = _ref.d2,\n      a = _ref.a;\n  return (a = _getProxyProp(scroller, \"getBoundingClientRect\")) ? function () {\n    return a()[d];\n  } : function () {\n    return (isViewport ? _getViewportDimension(d2) : scroller[\"client\" + d2]) || 0;\n  };\n},\n    _getOffsetsFunc = function _getOffsetsFunc(element, isViewport) {\n  return !isViewport || ~_proxies.indexOf(element) ? _getBoundsFunc(element) : function () {\n    return _winOffsets;\n  };\n},\n    _maxScroll = function _maxScroll(element, _ref2) {\n  var s = _ref2.s,\n      d2 = _ref2.d2,\n      d = _ref2.d,\n      a = _ref2.a;\n  return Math.max(0, (s = \"scroll\" + d2) && (a = _getProxyProp(element, s)) ? a() - _getBoundsFunc(element)()[d] : _isViewport(element) ? (_docEl[s] || _body[s]) - _getViewportDimension(d2) : element[s] - element[\"offset\" + d2]);\n},\n    _iterateAutoRefresh = function _iterateAutoRefresh(func, events) {\n  for (var i = 0; i < _autoRefresh.length; i += 3) {\n    (!events || ~events.indexOf(_autoRefresh[i + 1])) && func(_autoRefresh[i], _autoRefresh[i + 1], _autoRefresh[i + 2]);\n  }\n},\n    _isString = function _isString(value) {\n  return typeof value === \"string\";\n},\n    _isFunction = function _isFunction(value) {\n  return typeof value === \"function\";\n},\n    _isNumber = function _isNumber(value) {\n  return typeof value === \"number\";\n},\n    _isObject = function _isObject(value) {\n  return typeof value === \"object\";\n},\n    _endAnimation = function _endAnimation(animation, reversed, pause) {\n  return animation && animation.progress(reversed ? 0 : 1) && pause && animation.pause();\n},\n    _callback = function _callback(self, func) {\n  if (self.enabled) {\n    var result = self._ctx ? self._ctx.add(function () {\n      return func(self);\n    }) : func(self);\n    result && result.totalTime && (self.callbackAnimation = result);\n  }\n},\n    _abs = Math.abs,\n    _left = \"left\",\n    _top = \"top\",\n    _right = \"right\",\n    _bottom = \"bottom\",\n    _width = \"width\",\n    _height = \"height\",\n    _Right = \"Right\",\n    _Left = \"Left\",\n    _Top = \"Top\",\n    _Bottom = \"Bottom\",\n    _padding = \"padding\",\n    _margin = \"margin\",\n    _Width = \"Width\",\n    _Height = \"Height\",\n    _px = \"px\",\n    _getComputedStyle = function _getComputedStyle(element) {\n  return _win.getComputedStyle(element);\n},\n    _makePositionable = function _makePositionable(element) {\n  // if the element already has position: absolute or fixed, leave that, otherwise make it position: relative\n  var position = _getComputedStyle(element).position;\n\n  element.style.position = position === \"absolute\" || position === \"fixed\" ? position : \"relative\";\n},\n    _setDefaults = function _setDefaults(obj, defaults) {\n  for (var p in defaults) {\n    p in obj || (obj[p] = defaults[p]);\n  }\n\n  return obj;\n},\n    _getBounds = function _getBounds(element, withoutTransforms) {\n  var tween = withoutTransforms && _getComputedStyle(element)[_transformProp] !== \"matrix(1, 0, 0, 1, 0, 0)\" && gsap.to(element, {\n    x: 0,\n    y: 0,\n    xPercent: 0,\n    yPercent: 0,\n    rotation: 0,\n    rotationX: 0,\n    rotationY: 0,\n    scale: 1,\n    skewX: 0,\n    skewY: 0\n  }).progress(1),\n      bounds = element.getBoundingClientRect();\n  tween && tween.progress(0).kill();\n  return bounds;\n},\n    _getSize = function _getSize(element, _ref3) {\n  var d2 = _ref3.d2;\n  return element[\"offset\" + d2] || element[\"client\" + d2] || 0;\n},\n    _getLabelRatioArray = function _getLabelRatioArray(timeline) {\n  var a = [],\n      labels = timeline.labels,\n      duration = timeline.duration(),\n      p;\n\n  for (p in labels) {\n    a.push(labels[p] / duration);\n  }\n\n  return a;\n},\n    _getClosestLabel = function _getClosestLabel(animation) {\n  return function (value) {\n    return gsap.utils.snap(_getLabelRatioArray(animation), value);\n  };\n},\n    _snapDirectional = function _snapDirectional(snapIncrementOrArray) {\n  var snap = gsap.utils.snap(snapIncrementOrArray),\n      a = Array.isArray(snapIncrementOrArray) && snapIncrementOrArray.slice(0).sort(function (a, b) {\n    return a - b;\n  });\n  return a ? function (value, direction, threshold) {\n    if (threshold === void 0) {\n      threshold = 1e-3;\n    }\n\n    var i;\n\n    if (!direction) {\n      return snap(value);\n    }\n\n    if (direction > 0) {\n      value -= threshold; // to avoid rounding errors. If we're too strict, it might snap forward, then immediately again, and again.\n\n      for (i = 0; i < a.length; i++) {\n        if (a[i] >= value) {\n          return a[i];\n        }\n      }\n\n      return a[i - 1];\n    } else {\n      i = a.length;\n      value += threshold;\n\n      while (i--) {\n        if (a[i] <= value) {\n          return a[i];\n        }\n      }\n    }\n\n    return a[0];\n  } : function (value, direction, threshold) {\n    if (threshold === void 0) {\n      threshold = 1e-3;\n    }\n\n    var snapped = snap(value);\n    return !direction || Math.abs(snapped - value) < threshold || snapped - value < 0 === direction < 0 ? snapped : snap(direction < 0 ? value - snapIncrementOrArray : value + snapIncrementOrArray);\n  };\n},\n    _getLabelAtDirection = function _getLabelAtDirection(timeline) {\n  return function (value, st) {\n    return _snapDirectional(_getLabelRatioArray(timeline))(value, st.direction);\n  };\n},\n    _multiListener = function _multiListener(func, element, types, callback) {\n  return types.split(\",\").forEach(function (type) {\n    return func(element, type, callback);\n  });\n},\n    _addListener = function _addListener(element, type, func, nonPassive, capture) {\n  return element.addEventListener(type, func, {\n    passive: !nonPassive,\n    capture: !!capture\n  });\n},\n    _removeListener = function _removeListener(element, type, func, capture) {\n  return element.removeEventListener(type, func, !!capture);\n},\n    _wheelListener = function _wheelListener(func, el, scrollFunc) {\n  scrollFunc = scrollFunc && scrollFunc.wheelHandler;\n\n  if (scrollFunc) {\n    func(el, \"wheel\", scrollFunc);\n    func(el, \"touchmove\", scrollFunc);\n  }\n},\n    _markerDefaults = {\n  startColor: \"green\",\n  endColor: \"red\",\n  indent: 0,\n  fontSize: \"16px\",\n  fontWeight: \"normal\"\n},\n    _defaults = {\n  toggleActions: \"play\",\n  anticipatePin: 0\n},\n    _keywords = {\n  top: 0,\n  left: 0,\n  center: 0.5,\n  bottom: 1,\n  right: 1\n},\n    _offsetToPx = function _offsetToPx(value, size) {\n  if (_isString(value)) {\n    var eqIndex = value.indexOf(\"=\"),\n        relative = ~eqIndex ? +(value.charAt(eqIndex - 1) + 1) * parseFloat(value.substr(eqIndex + 1)) : 0;\n\n    if (~eqIndex) {\n      value.indexOf(\"%\") > eqIndex && (relative *= size / 100);\n      value = value.substr(0, eqIndex - 1);\n    }\n\n    value = relative + (value in _keywords ? _keywords[value] * size : ~value.indexOf(\"%\") ? parseFloat(value) * size / 100 : parseFloat(value) || 0);\n  }\n\n  return value;\n},\n    _createMarker = function _createMarker(type, name, container, direction, _ref4, offset, matchWidthEl, containerAnimation) {\n  var startColor = _ref4.startColor,\n      endColor = _ref4.endColor,\n      fontSize = _ref4.fontSize,\n      indent = _ref4.indent,\n      fontWeight = _ref4.fontWeight;\n\n  var e = _doc.createElement(\"div\"),\n      useFixedPosition = _isViewport(container) || _getProxyProp(container, \"pinType\") === \"fixed\",\n      isScroller = type.indexOf(\"scroller\") !== -1,\n      parent = useFixedPosition ? _body : container,\n      isStart = type.indexOf(\"start\") !== -1,\n      color = isStart ? startColor : endColor,\n      css = \"border-color:\" + color + \";font-size:\" + fontSize + \";color:\" + color + \";font-weight:\" + fontWeight + \";pointer-events:none;white-space:nowrap;font-family:sans-serif,Arial;z-index:1000;padding:4px 8px;border-width:0;border-style:solid;\";\n\n  css += \"position:\" + ((isScroller || containerAnimation) && useFixedPosition ? \"fixed;\" : \"absolute;\");\n  (isScroller || containerAnimation || !useFixedPosition) && (css += (direction === _vertical ? _right : _bottom) + \":\" + (offset + parseFloat(indent)) + \"px;\");\n  matchWidthEl && (css += \"box-sizing:border-box;text-align:left;width:\" + matchWidthEl.offsetWidth + \"px;\");\n  e._isStart = isStart;\n  e.setAttribute(\"class\", \"gsap-marker-\" + type + (name ? \" marker-\" + name : \"\"));\n  e.style.cssText = css;\n  e.innerText = name || name === 0 ? type + \"-\" + name : type;\n  parent.children[0] ? parent.insertBefore(e, parent.children[0]) : parent.appendChild(e);\n  e._offset = e[\"offset\" + direction.op.d2];\n\n  _positionMarker(e, 0, direction, isStart);\n\n  return e;\n},\n    _positionMarker = function _positionMarker(marker, start, direction, flipped) {\n  var vars = {\n    display: \"block\"\n  },\n      side = direction[flipped ? \"os2\" : \"p2\"],\n      oppositeSide = direction[flipped ? \"p2\" : \"os2\"];\n  marker._isFlipped = flipped;\n  vars[direction.a + \"Percent\"] = flipped ? -100 : 0;\n  vars[direction.a] = flipped ? \"1px\" : 0;\n  vars[\"border\" + side + _Width] = 1;\n  vars[\"border\" + oppositeSide + _Width] = 0;\n  vars[direction.p] = start + \"px\";\n  gsap.set(marker, vars);\n},\n    _triggers = [],\n    _ids = {},\n    _rafID,\n    _sync = function _sync() {\n  return _getTime() - _lastScrollTime > 34 && (_rafID || (_rafID = requestAnimationFrame(_updateAll)));\n},\n    _onScroll = function _onScroll() {\n  // previously, we tried to optimize performance by batching/deferring to the next requestAnimationFrame(), but discovered that Safari has a few bugs that make this unworkable (especially on iOS). See https://codepen.io/GreenSock/pen/16c435b12ef09c38125204818e7b45fc?editors=0010 and https://codepen.io/GreenSock/pen/JjOxYpQ/3dd65ccec5a60f1d862c355d84d14562?editors=0010 and https://codepen.io/GreenSock/pen/ExbrPNa/087cef197dc35445a0951e8935c41503?editors=0010\n  if (!_normalizer || !_normalizer.isPressed || _normalizer.startX > _body.clientWidth) {\n    // if the user is dragging the scrollbar, allow it.\n    _scrollers.cache++;\n\n    if (_normalizer) {\n      _rafID || (_rafID = requestAnimationFrame(_updateAll));\n    } else {\n      _updateAll(); // Safari in particular (on desktop) NEEDS the immediate update rather than waiting for a requestAnimationFrame() whereas iOS seems to benefit from waiting for the requestAnimationFrame() tick, at least when normalizing. See https://codepen.io/GreenSock/pen/qBYozqO?editors=0110\n\n    }\n\n    _lastScrollTime || _dispatch(\"scrollStart\");\n    _lastScrollTime = _getTime();\n  }\n},\n    _setBaseDimensions = function _setBaseDimensions() {\n  _baseScreenWidth = _win.innerWidth;\n  _baseScreenHeight = _win.innerHeight;\n},\n    _onResize = function _onResize(force) {\n  _scrollers.cache++;\n  (force === true || !_refreshing && !_ignoreResize && !_doc.fullscreenElement && !_doc.webkitFullscreenElement && (!_ignoreMobileResize || _baseScreenWidth !== _win.innerWidth || Math.abs(_win.innerHeight - _baseScreenHeight) > _win.innerHeight * 0.25)) && _resizeDelay.restart(true);\n},\n    // ignore resizes triggered by refresh()\n_listeners = {},\n    _emptyArray = [],\n    _softRefresh = function _softRefresh() {\n  return _removeListener(ScrollTrigger, \"scrollEnd\", _softRefresh) || _refreshAll(true);\n},\n    _dispatch = function _dispatch(type) {\n  return _listeners[type] && _listeners[type].map(function (f) {\n    return f();\n  }) || _emptyArray;\n},\n    _savedStyles = [],\n    // when ScrollTrigger.saveStyles() is called, the inline styles are recorded in this Array in a sequential format like [element, cssText, gsCache, media]. This keeps it very memory-efficient and fast to iterate through.\n_revertRecorded = function _revertRecorded(media) {\n  for (var i = 0; i < _savedStyles.length; i += 5) {\n    if (!media || _savedStyles[i + 4] && _savedStyles[i + 4].query === media) {\n      _savedStyles[i].style.cssText = _savedStyles[i + 1];\n      _savedStyles[i].getBBox && _savedStyles[i].setAttribute(\"transform\", _savedStyles[i + 2] || \"\");\n      _savedStyles[i + 3].uncache = 1;\n    }\n  }\n},\n    _recordScrollPositions = function _recordScrollPositions() {\n  return _scrollers.forEach(function (obj) {\n    return _isFunction(obj) && ++obj.cacheID && (obj.rec = obj());\n  });\n},\n    // record the current scroll position. Also force the clearing of the cache because some browsers take a little while to dispatch the \"scroll\" event and the user may have changed the scroll position and then called ScrollTrigger.refresh() right away\n_revertAll = function _revertAll(kill, media) {\n  var trigger;\n\n  for (_i = 0; _i < _triggers.length; _i++) {\n    trigger = _triggers[_i];\n\n    if (trigger && (!media || trigger._ctx === media)) {\n      if (kill) {\n        trigger.kill(1);\n      } else {\n        trigger.revert(true, true);\n      }\n    }\n  }\n\n  _isReverted = true;\n  media && _revertRecorded(media);\n  media || _dispatch(\"revert\");\n},\n    _clearScrollMemory = function _clearScrollMemory(scrollRestoration, force) {\n  // zero-out all the recorded scroll positions. Don't use _triggers because if, for example, .matchMedia() is used to create some ScrollTriggers and then the user resizes and it removes ALL ScrollTriggers, and then go back to a size where there are ScrollTriggers, it would have kept the position(s) saved from the initial state.\n  _scrollers.cache++;\n  (force || !_refreshingAll) && _scrollers.forEach(function (obj) {\n    return _isFunction(obj) && obj.cacheID++ && (obj.rec = 0);\n  });\n  _isString(scrollRestoration) && (_win.history.scrollRestoration = _scrollRestoration = scrollRestoration);\n},\n    _refreshingAll,\n    _refreshID = 0,\n    _queueRefreshID,\n    _queueRefreshAll = function _queueRefreshAll() {\n  // we don't want to call _refreshAll() every time we create a new ScrollTrigger (for performance reasons) - it's better to batch them. Some frameworks dynamically load content and we can't rely on the window's \"load\" or \"DOMContentLoaded\" events to trigger it.\n  if (_queueRefreshID !== _refreshID) {\n    var id = _queueRefreshID = _refreshID;\n    requestAnimationFrame(function () {\n      return id === _refreshID && _refreshAll(true);\n    });\n  }\n},\n    _refresh100vh = function _refresh100vh() {\n  _body.appendChild(_div100vh);\n\n  _100vh = !_normalizer && _div100vh.offsetHeight || _win.innerHeight;\n\n  _body.removeChild(_div100vh);\n},\n    _hideAllMarkers = function _hideAllMarkers(hide) {\n  return _toArray(\".gsap-marker-start, .gsap-marker-end, .gsap-marker-scroller-start, .gsap-marker-scroller-end\").forEach(function (el) {\n    return el.style.display = hide ? \"none\" : \"block\";\n  });\n},\n    _refreshAll = function _refreshAll(force, skipRevert) {\n  _docEl = _doc.documentElement; // some frameworks like Astro may cache the <body> and replace it during routing, so we'll just re-record the _docEl and _body for safety (otherwise, the markers may not get added properly).\n\n  _body = _doc.body;\n  _root = [_win, _doc, _docEl, _body];\n\n  if (_lastScrollTime && !force && !_isReverted) {\n    _addListener(ScrollTrigger, \"scrollEnd\", _softRefresh);\n\n    return;\n  }\n\n  _refresh100vh();\n\n  _refreshingAll = ScrollTrigger.isRefreshing = true;\n  _isReverted || _recordScrollPositions();\n\n  var refreshInits = _dispatch(\"refreshInit\");\n\n  _sort && ScrollTrigger.sort();\n  skipRevert || _revertAll();\n\n  _scrollers.forEach(function (obj) {\n    if (_isFunction(obj)) {\n      obj.smooth && (obj.target.style.scrollBehavior = \"auto\"); // smooth scrolling interferes\n\n      obj(0);\n    }\n  });\n\n  _triggers.slice(0).forEach(function (t) {\n    return t.refresh();\n  }); // don't loop with _i because during a refresh() someone could call ScrollTrigger.update() which would iterate through _i resulting in a skip.\n\n\n  _isReverted = false;\n\n  _triggers.forEach(function (t) {\n    // nested pins (pinnedContainer) with pinSpacing may expand the container, so we must accommodate that here.\n    if (t._subPinOffset && t.pin) {\n      var prop = t.vars.horizontal ? \"offsetWidth\" : \"offsetHeight\",\n          original = t.pin[prop];\n      t.revert(true, 1);\n      t.adjustPinSpacing(t.pin[prop] - original);\n      t.refresh();\n    }\n  });\n\n  _clampingMax = 1; // pinSpacing might be propping a page open, thus when we .setPositions() to clamp a ScrollTrigger's end we should leave the pinSpacing alone. That's what this flag is for.\n\n  _hideAllMarkers(true);\n\n  _triggers.forEach(function (t) {\n    // the scroller's max scroll position may change after all the ScrollTriggers refreshed (like pinning could push it down), so we need to loop back and correct any with end: \"max\". Same for anything with a clamped end\n    var max = _maxScroll(t.scroller, t._dir),\n        endClamp = t.vars.end === \"max\" || t._endClamp && t.end > max,\n        startClamp = t._startClamp && t.start >= max;\n\n    (endClamp || startClamp) && t.setPositions(startClamp ? max - 1 : t.start, endClamp ? Math.max(startClamp ? max : t.start + 1, max) : t.end, true);\n  });\n\n  _hideAllMarkers(false);\n\n  _clampingMax = 0;\n  refreshInits.forEach(function (result) {\n    return result && result.render && result.render(-1);\n  }); // if the onRefreshInit() returns an animation (typically a gsap.set()), revert it. This makes it easy to put things in a certain spot before refreshing for measurement purposes, and then put things back.\n\n  _scrollers.forEach(function (obj) {\n    if (_isFunction(obj)) {\n      obj.smooth && requestAnimationFrame(function () {\n        return obj.target.style.scrollBehavior = \"smooth\";\n      });\n      obj.rec && obj(obj.rec);\n    }\n  });\n\n  _clearScrollMemory(_scrollRestoration, 1);\n\n  _resizeDelay.pause();\n\n  _refreshID++;\n  _refreshingAll = 2;\n\n  _updateAll(2);\n\n  _triggers.forEach(function (t) {\n    return _isFunction(t.vars.onRefresh) && t.vars.onRefresh(t);\n  });\n\n  _refreshingAll = ScrollTrigger.isRefreshing = false;\n\n  _dispatch(\"refresh\");\n},\n    _lastScroll = 0,\n    _direction = 1,\n    _primary,\n    _updateAll = function _updateAll(force) {\n  if (force === 2 || !_refreshingAll && !_isReverted) {\n    // _isReverted could be true if, for example, a matchMedia() is in the process of executing. We don't want to update during the time everything is reverted.\n    ScrollTrigger.isUpdating = true;\n    _primary && _primary.update(0); // ScrollSmoother uses refreshPriority -9999 to become the primary that gets updated before all others because it affects the scroll position.\n\n    var l = _triggers.length,\n        time = _getTime(),\n        recordVelocity = time - _time1 >= 50,\n        scroll = l && _triggers[0].scroll();\n\n    _direction = _lastScroll > scroll ? -1 : 1;\n    _refreshingAll || (_lastScroll = scroll);\n\n    if (recordVelocity) {\n      if (_lastScrollTime && !_pointerIsDown && time - _lastScrollTime > 200) {\n        _lastScrollTime = 0;\n\n        _dispatch(\"scrollEnd\");\n      }\n\n      _time2 = _time1;\n      _time1 = time;\n    }\n\n    if (_direction < 0) {\n      _i = l;\n\n      while (_i-- > 0) {\n        _triggers[_i] && _triggers[_i].update(0, recordVelocity);\n      }\n\n      _direction = 1;\n    } else {\n      for (_i = 0; _i < l; _i++) {\n        _triggers[_i] && _triggers[_i].update(0, recordVelocity);\n      }\n    }\n\n    ScrollTrigger.isUpdating = false;\n  }\n\n  _rafID = 0;\n},\n    _propNamesToCopy = [_left, _top, _bottom, _right, _margin + _Bottom, _margin + _Right, _margin + _Top, _margin + _Left, \"display\", \"flexShrink\", \"float\", \"zIndex\", \"gridColumnStart\", \"gridColumnEnd\", \"gridRowStart\", \"gridRowEnd\", \"gridArea\", \"justifySelf\", \"alignSelf\", \"placeSelf\", \"order\"],\n    _stateProps = _propNamesToCopy.concat([_width, _height, \"boxSizing\", \"max\" + _Width, \"max\" + _Height, \"position\", _margin, _padding, _padding + _Top, _padding + _Right, _padding + _Bottom, _padding + _Left]),\n    _swapPinOut = function _swapPinOut(pin, spacer, state) {\n  _setState(state);\n\n  var cache = pin._gsap;\n\n  if (cache.spacerIsNative) {\n    _setState(cache.spacerState);\n  } else if (pin._gsap.swappedIn) {\n    var parent = spacer.parentNode;\n\n    if (parent) {\n      parent.insertBefore(pin, spacer);\n      parent.removeChild(spacer);\n    }\n  }\n\n  pin._gsap.swappedIn = false;\n},\n    _swapPinIn = function _swapPinIn(pin, spacer, cs, spacerState) {\n  if (!pin._gsap.swappedIn) {\n    var i = _propNamesToCopy.length,\n        spacerStyle = spacer.style,\n        pinStyle = pin.style,\n        p;\n\n    while (i--) {\n      p = _propNamesToCopy[i];\n      spacerStyle[p] = cs[p];\n    }\n\n    spacerStyle.position = cs.position === \"absolute\" ? \"absolute\" : \"relative\";\n    cs.display === \"inline\" && (spacerStyle.display = \"inline-block\");\n    pinStyle[_bottom] = pinStyle[_right] = \"auto\";\n    spacerStyle.flexBasis = cs.flexBasis || \"auto\";\n    spacerStyle.overflow = \"visible\";\n    spacerStyle.boxSizing = \"border-box\";\n    spacerStyle[_width] = _getSize(pin, _horizontal) + _px;\n    spacerStyle[_height] = _getSize(pin, _vertical) + _px;\n    spacerStyle[_padding] = pinStyle[_margin] = pinStyle[_top] = pinStyle[_left] = \"0\";\n\n    _setState(spacerState);\n\n    pinStyle[_width] = pinStyle[\"max\" + _Width] = cs[_width];\n    pinStyle[_height] = pinStyle[\"max\" + _Height] = cs[_height];\n    pinStyle[_padding] = cs[_padding];\n\n    if (pin.parentNode !== spacer) {\n      pin.parentNode.insertBefore(spacer, pin);\n      spacer.appendChild(pin);\n    }\n\n    pin._gsap.swappedIn = true;\n  }\n},\n    _capsExp = /([A-Z])/g,\n    _setState = function _setState(state) {\n  if (state) {\n    var style = state.t.style,\n        l = state.length,\n        i = 0,\n        p,\n        value;\n    (state.t._gsap || gsap.core.getCache(state.t)).uncache = 1; // otherwise transforms may be off\n\n    for (; i < l; i += 2) {\n      value = state[i + 1];\n      p = state[i];\n\n      if (value) {\n        style[p] = value;\n      } else if (style[p]) {\n        style.removeProperty(p.replace(_capsExp, \"-$1\").toLowerCase());\n      }\n    }\n  }\n},\n    _getState = function _getState(element) {\n  // returns an Array with alternating values like [property, value, property, value] and a \"t\" property pointing to the target (element). Makes it fast and cheap.\n  var l = _stateProps.length,\n      style = element.style,\n      state = [],\n      i = 0;\n\n  for (; i < l; i++) {\n    state.push(_stateProps[i], style[_stateProps[i]]);\n  }\n\n  state.t = element;\n  return state;\n},\n    _copyState = function _copyState(state, override, omitOffsets) {\n  var result = [],\n      l = state.length,\n      i = omitOffsets ? 8 : 0,\n      // skip top, left, right, bottom if omitOffsets is true\n  p;\n\n  for (; i < l; i += 2) {\n    p = state[i];\n    result.push(p, p in override ? override[p] : state[i + 1]);\n  }\n\n  result.t = state.t;\n  return result;\n},\n    _winOffsets = {\n  left: 0,\n  top: 0\n},\n    // // potential future feature (?) Allow users to calculate where a trigger hits (scroll position) like getScrollPosition(\"#id\", \"top bottom\")\n// _getScrollPosition = (trigger, position, {scroller, containerAnimation, horizontal}) => {\n// \tscroller = _getTarget(scroller || _win);\n// \tlet direction = horizontal ? _horizontal : _vertical,\n// \t\tisViewport = _isViewport(scroller);\n// \t_getSizeFunc(scroller, isViewport, direction);\n// \treturn _parsePosition(position, _getTarget(trigger), _getSizeFunc(scroller, isViewport, direction)(), direction, _getScrollFunc(scroller, direction)(), 0, 0, 0, _getOffsetsFunc(scroller, isViewport)(), isViewport ? 0 : parseFloat(_getComputedStyle(scroller)[\"border\" + direction.p2 + _Width]) || 0, 0, containerAnimation ? containerAnimation.duration() : _maxScroll(scroller), containerAnimation);\n// },\n_parsePosition = function _parsePosition(value, trigger, scrollerSize, direction, scroll, marker, markerScroller, self, scrollerBounds, borderWidth, useFixedPosition, scrollerMax, containerAnimation, clampZeroProp) {\n  _isFunction(value) && (value = value(self));\n\n  if (_isString(value) && value.substr(0, 3) === \"max\") {\n    value = scrollerMax + (value.charAt(4) === \"=\" ? _offsetToPx(\"0\" + value.substr(3), scrollerSize) : 0);\n  }\n\n  var time = containerAnimation ? containerAnimation.time() : 0,\n      p1,\n      p2,\n      element;\n  containerAnimation && containerAnimation.seek(0);\n  isNaN(value) || (value = +value); // convert a string number like \"45\" to an actual number\n\n  if (!_isNumber(value)) {\n    _isFunction(trigger) && (trigger = trigger(self));\n    var offsets = (value || \"0\").split(\" \"),\n        bounds,\n        localOffset,\n        globalOffset,\n        display;\n    element = _getTarget(trigger, self) || _body;\n    bounds = _getBounds(element) || {};\n\n    if ((!bounds || !bounds.left && !bounds.top) && _getComputedStyle(element).display === \"none\") {\n      // if display is \"none\", it won't report getBoundingClientRect() properly\n      display = element.style.display;\n      element.style.display = \"block\";\n      bounds = _getBounds(element);\n      display ? element.style.display = display : element.style.removeProperty(\"display\");\n    }\n\n    localOffset = _offsetToPx(offsets[0], bounds[direction.d]);\n    globalOffset = _offsetToPx(offsets[1] || \"0\", scrollerSize);\n    value = bounds[direction.p] - scrollerBounds[direction.p] - borderWidth + localOffset + scroll - globalOffset;\n    markerScroller && _positionMarker(markerScroller, globalOffset, direction, scrollerSize - globalOffset < 20 || markerScroller._isStart && globalOffset > 20);\n    scrollerSize -= scrollerSize - globalOffset; // adjust for the marker\n  } else {\n    containerAnimation && (value = gsap.utils.mapRange(containerAnimation.scrollTrigger.start, containerAnimation.scrollTrigger.end, 0, scrollerMax, value));\n    markerScroller && _positionMarker(markerScroller, scrollerSize, direction, true);\n  }\n\n  if (clampZeroProp) {\n    self[clampZeroProp] = value || -0.001;\n    value < 0 && (value = 0);\n  }\n\n  if (marker) {\n    var position = value + scrollerSize,\n        isStart = marker._isStart;\n    p1 = \"scroll\" + direction.d2;\n\n    _positionMarker(marker, position, direction, isStart && position > 20 || !isStart && (useFixedPosition ? Math.max(_body[p1], _docEl[p1]) : marker.parentNode[p1]) <= position + 1);\n\n    if (useFixedPosition) {\n      scrollerBounds = _getBounds(markerScroller);\n      useFixedPosition && (marker.style[direction.op.p] = scrollerBounds[direction.op.p] - direction.op.m - marker._offset + _px);\n    }\n  }\n\n  if (containerAnimation && element) {\n    p1 = _getBounds(element);\n    containerAnimation.seek(scrollerMax);\n    p2 = _getBounds(element);\n    containerAnimation._caScrollDist = p1[direction.p] - p2[direction.p];\n    value = value / containerAnimation._caScrollDist * scrollerMax;\n  }\n\n  containerAnimation && containerAnimation.seek(time);\n  return containerAnimation ? value : Math.round(value);\n},\n    _prefixExp = /(webkit|moz|length|cssText|inset)/i,\n    _reparent = function _reparent(element, parent, top, left) {\n  if (element.parentNode !== parent) {\n    var style = element.style,\n        p,\n        cs;\n\n    if (parent === _body) {\n      element._stOrig = style.cssText; // record original inline styles so we can revert them later\n\n      cs = _getComputedStyle(element);\n\n      for (p in cs) {\n        // must copy all relevant styles to ensure that nothing changes visually when we reparent to the <body>. Skip the vendor prefixed ones.\n        if (!+p && !_prefixExp.test(p) && cs[p] && typeof style[p] === \"string\" && p !== \"0\") {\n          style[p] = cs[p];\n        }\n      }\n\n      style.top = top;\n      style.left = left;\n    } else {\n      style.cssText = element._stOrig;\n    }\n\n    gsap.core.getCache(element).uncache = 1;\n    parent.appendChild(element);\n  }\n},\n    _interruptionTracker = function _interruptionTracker(getValueFunc, initialValue, onInterrupt) {\n  var last1 = initialValue,\n      last2 = last1;\n  return function (value) {\n    var current = Math.round(getValueFunc()); // round because in some [very uncommon] Windows environments, scroll can get reported with decimals even though it was set without.\n\n    if (current !== last1 && current !== last2 && Math.abs(current - last1) > 3 && Math.abs(current - last2) > 3) {\n      // if the user scrolls, kill the tween. iOS Safari intermittently misreports the scroll position, it may be the most recently-set one or the one before that! When Safari is zoomed (CMD-+), it often misreports as 1 pixel off too! So if we set the scroll position to 125, for example, it'll actually report it as 124.\n      value = current;\n      onInterrupt && onInterrupt();\n    }\n\n    last2 = last1;\n    last1 = Math.round(value);\n    return last1;\n  };\n},\n    _shiftMarker = function _shiftMarker(marker, direction, value) {\n  var vars = {};\n  vars[direction.p] = \"+=\" + value;\n  gsap.set(marker, vars);\n},\n    // _mergeAnimations = animations => {\n// \tlet tl = gsap.timeline({smoothChildTiming: true}).startTime(Math.min(...animations.map(a => a.globalTime(0))));\n// \tanimations.forEach(a => {let time = a.totalTime(); tl.add(a); a.totalTime(time); });\n// \ttl.smoothChildTiming = false;\n// \treturn tl;\n// },\n// returns a function that can be used to tween the scroll position in the direction provided, and when doing so it'll add a .tween property to the FUNCTION itself, and remove it when the tween completes or gets killed. This gives us a way to have multiple ScrollTriggers use a central function for any given scroller and see if there's a scroll tween running (which would affect if/how things get updated)\n_getTweenCreator = function _getTweenCreator(scroller, direction) {\n  var getScroll = _getScrollFunc(scroller, direction),\n      prop = \"_scroll\" + direction.p2,\n      // add a tweenable property to the scroller that's a getter/setter function, like _scrollTop or _scrollLeft. This way, if someone does gsap.killTweensOf(scroller) it'll kill the scroll tween.\n  getTween = function getTween(scrollTo, vars, initialValue, change1, change2) {\n    var tween = getTween.tween,\n        onComplete = vars.onComplete,\n        modifiers = {};\n    initialValue = initialValue || getScroll();\n\n    var checkForInterruption = _interruptionTracker(getScroll, initialValue, function () {\n      tween.kill();\n      getTween.tween = 0;\n    });\n\n    change2 = change1 && change2 || 0; // if change1 is 0, we set that to the difference and ignore change2. Otherwise, there would be a compound effect.\n\n    change1 = change1 || scrollTo - initialValue;\n    tween && tween.kill();\n    vars[prop] = scrollTo;\n    vars.inherit = false;\n    vars.modifiers = modifiers;\n\n    modifiers[prop] = function () {\n      return checkForInterruption(initialValue + change1 * tween.ratio + change2 * tween.ratio * tween.ratio);\n    };\n\n    vars.onUpdate = function () {\n      _scrollers.cache++;\n      getTween.tween && _updateAll(); // if it was interrupted/killed, like in a context.revert(), don't force an updateAll()\n    };\n\n    vars.onComplete = function () {\n      getTween.tween = 0;\n      onComplete && onComplete.call(tween);\n    };\n\n    tween = getTween.tween = gsap.to(scroller, vars);\n    return tween;\n  };\n\n  scroller[prop] = getScroll;\n\n  getScroll.wheelHandler = function () {\n    return getTween.tween && getTween.tween.kill() && (getTween.tween = 0);\n  };\n\n  _addListener(scroller, \"wheel\", getScroll.wheelHandler); // Windows machines handle mousewheel scrolling in chunks (like \"3 lines per scroll\") meaning the typical strategy for cancelling the scroll isn't as sensitive. It's much more likely to match one of the previous 2 scroll event positions. So we kill any snapping as soon as there's a wheel event.\n\n\n  ScrollTrigger.isTouch && _addListener(scroller, \"touchmove\", getScroll.wheelHandler);\n  return getTween;\n};\n\nexport var ScrollTrigger = /*#__PURE__*/function () {\n  function ScrollTrigger(vars, animation) {\n    _coreInitted || ScrollTrigger.register(gsap) || console.warn(\"Please gsap.registerPlugin(ScrollTrigger)\");\n\n    _context(this);\n\n    this.init(vars, animation);\n  }\n\n  var _proto = ScrollTrigger.prototype;\n\n  _proto.init = function init(vars, animation) {\n    this.progress = this.start = 0;\n    this.vars && this.kill(true, true); // in case it's being initted again\n\n    if (!_enabled) {\n      this.update = this.refresh = this.kill = _passThrough;\n      return;\n    }\n\n    vars = _setDefaults(_isString(vars) || _isNumber(vars) || vars.nodeType ? {\n      trigger: vars\n    } : vars, _defaults);\n\n    var _vars = vars,\n        onUpdate = _vars.onUpdate,\n        toggleClass = _vars.toggleClass,\n        id = _vars.id,\n        onToggle = _vars.onToggle,\n        onRefresh = _vars.onRefresh,\n        scrub = _vars.scrub,\n        trigger = _vars.trigger,\n        pin = _vars.pin,\n        pinSpacing = _vars.pinSpacing,\n        invalidateOnRefresh = _vars.invalidateOnRefresh,\n        anticipatePin = _vars.anticipatePin,\n        onScrubComplete = _vars.onScrubComplete,\n        onSnapComplete = _vars.onSnapComplete,\n        once = _vars.once,\n        snap = _vars.snap,\n        pinReparent = _vars.pinReparent,\n        pinSpacer = _vars.pinSpacer,\n        containerAnimation = _vars.containerAnimation,\n        fastScrollEnd = _vars.fastScrollEnd,\n        preventOverlaps = _vars.preventOverlaps,\n        direction = vars.horizontal || vars.containerAnimation && vars.horizontal !== false ? _horizontal : _vertical,\n        isToggle = !scrub && scrub !== 0,\n        scroller = _getTarget(vars.scroller || _win),\n        scrollerCache = gsap.core.getCache(scroller),\n        isViewport = _isViewport(scroller),\n        useFixedPosition = (\"pinType\" in vars ? vars.pinType : _getProxyProp(scroller, \"pinType\") || isViewport && \"fixed\") === \"fixed\",\n        callbacks = [vars.onEnter, vars.onLeave, vars.onEnterBack, vars.onLeaveBack],\n        toggleActions = isToggle && vars.toggleActions.split(\" \"),\n        markers = \"markers\" in vars ? vars.markers : _defaults.markers,\n        borderWidth = isViewport ? 0 : parseFloat(_getComputedStyle(scroller)[\"border\" + direction.p2 + _Width]) || 0,\n        self = this,\n        onRefreshInit = vars.onRefreshInit && function () {\n      return vars.onRefreshInit(self);\n    },\n        getScrollerSize = _getSizeFunc(scroller, isViewport, direction),\n        getScrollerOffsets = _getOffsetsFunc(scroller, isViewport),\n        lastSnap = 0,\n        lastRefresh = 0,\n        prevProgress = 0,\n        scrollFunc = _getScrollFunc(scroller, direction),\n        tweenTo,\n        pinCache,\n        snapFunc,\n        scroll1,\n        scroll2,\n        start,\n        end,\n        markerStart,\n        markerEnd,\n        markerStartTrigger,\n        markerEndTrigger,\n        markerVars,\n        executingOnRefresh,\n        change,\n        pinOriginalState,\n        pinActiveState,\n        pinState,\n        spacer,\n        offset,\n        pinGetter,\n        pinSetter,\n        pinStart,\n        pinChange,\n        spacingStart,\n        spacerState,\n        markerStartSetter,\n        pinMoves,\n        markerEndSetter,\n        cs,\n        snap1,\n        snap2,\n        scrubTween,\n        scrubSmooth,\n        snapDurClamp,\n        snapDelayedCall,\n        prevScroll,\n        prevAnimProgress,\n        caMarkerSetter,\n        customRevertReturn; // for the sake of efficiency, _startClamp/_endClamp serve like a truthy value indicating that clamping was enabled on the start/end, and ALSO store the actual pre-clamped numeric value. We tap into that in ScrollSmoother for speed effects. So for example, if start=\"clamp(top bottom)\" results in a start of -100 naturally, it would get clamped to 0 but -100 would be stored in _startClamp.\n\n\n    self._startClamp = self._endClamp = false;\n    self._dir = direction;\n    anticipatePin *= 45;\n    self.scroller = scroller;\n    self.scroll = containerAnimation ? containerAnimation.time.bind(containerAnimation) : scrollFunc;\n    scroll1 = scrollFunc();\n    self.vars = vars;\n    animation = animation || vars.animation;\n\n    if (\"refreshPriority\" in vars) {\n      _sort = 1;\n      vars.refreshPriority === -9999 && (_primary = self); // used by ScrollSmoother\n    }\n\n    scrollerCache.tweenScroll = scrollerCache.tweenScroll || {\n      top: _getTweenCreator(scroller, _vertical),\n      left: _getTweenCreator(scroller, _horizontal)\n    };\n    self.tweenTo = tweenTo = scrollerCache.tweenScroll[direction.p];\n\n    self.scrubDuration = function (value) {\n      scrubSmooth = _isNumber(value) && value;\n\n      if (!scrubSmooth) {\n        scrubTween && scrubTween.progress(1).kill();\n        scrubTween = 0;\n      } else {\n        scrubTween ? scrubTween.duration(value) : scrubTween = gsap.to(animation, {\n          ease: \"expo\",\n          totalProgress: \"+=0\",\n          inherit: false,\n          duration: scrubSmooth,\n          paused: true,\n          onComplete: function onComplete() {\n            return onScrubComplete && onScrubComplete(self);\n          }\n        });\n      }\n    };\n\n    if (animation) {\n      animation.vars.lazy = false;\n      animation._initted && !self.isReverted || animation.vars.immediateRender !== false && vars.immediateRender !== false && animation.duration() && animation.render(0, true, true); // special case: if this ScrollTrigger gets re-initted, a from() tween with a stagger could get initted initially and then reverted on the re-init which means it'll need to get rendered again here to properly display things. Otherwise, See https://gsap.com/forums/topic/36777-scrollsmoother-splittext-nextjs/ and https://codepen.io/GreenSock/pen/eYPyPpd?editors=0010\n\n      self.animation = animation.pause();\n      animation.scrollTrigger = self;\n      self.scrubDuration(scrub);\n      snap1 = 0;\n      id || (id = animation.vars.id);\n    }\n\n    if (snap) {\n      // TODO: potential idea: use legitimate CSS scroll snapping by pushing invisible elements into the DOM that serve as snap positions, and toggle the document.scrollingElement.style.scrollSnapType onToggle. See https://codepen.io/GreenSock/pen/JjLrgWM for a quick proof of concept.\n      if (!_isObject(snap) || snap.push) {\n        snap = {\n          snapTo: snap\n        };\n      }\n\n      \"scrollBehavior\" in _body.style && gsap.set(isViewport ? [_body, _docEl] : scroller, {\n        scrollBehavior: \"auto\"\n      }); // smooth scrolling doesn't work with snap.\n\n      _scrollers.forEach(function (o) {\n        return _isFunction(o) && o.target === (isViewport ? _doc.scrollingElement || _docEl : scroller) && (o.smooth = false);\n      }); // note: set smooth to false on both the vertical and horizontal scroll getters/setters\n\n\n      snapFunc = _isFunction(snap.snapTo) ? snap.snapTo : snap.snapTo === \"labels\" ? _getClosestLabel(animation) : snap.snapTo === \"labelsDirectional\" ? _getLabelAtDirection(animation) : snap.directional !== false ? function (value, st) {\n        return _snapDirectional(snap.snapTo)(value, _getTime() - lastRefresh < 500 ? 0 : st.direction);\n      } : gsap.utils.snap(snap.snapTo);\n      snapDurClamp = snap.duration || {\n        min: 0.1,\n        max: 2\n      };\n      snapDurClamp = _isObject(snapDurClamp) ? _clamp(snapDurClamp.min, snapDurClamp.max) : _clamp(snapDurClamp, snapDurClamp);\n      snapDelayedCall = gsap.delayedCall(snap.delay || scrubSmooth / 2 || 0.1, function () {\n        var scroll = scrollFunc(),\n            refreshedRecently = _getTime() - lastRefresh < 500,\n            tween = tweenTo.tween;\n\n        if ((refreshedRecently || Math.abs(self.getVelocity()) < 10) && !tween && !_pointerIsDown && lastSnap !== scroll) {\n          var progress = (scroll - start) / change,\n              totalProgress = animation && !isToggle ? animation.totalProgress() : progress,\n              velocity = refreshedRecently ? 0 : (totalProgress - snap2) / (_getTime() - _time2) * 1000 || 0,\n              change1 = gsap.utils.clamp(-progress, 1 - progress, _abs(velocity / 2) * velocity / 0.185),\n              naturalEnd = progress + (snap.inertia === false ? 0 : change1),\n              endValue,\n              endScroll,\n              _snap = snap,\n              onStart = _snap.onStart,\n              _onInterrupt = _snap.onInterrupt,\n              _onComplete = _snap.onComplete;\n          endValue = snapFunc(naturalEnd, self);\n          _isNumber(endValue) || (endValue = naturalEnd); // in case the function didn't return a number, fall back to using the naturalEnd\n\n          endScroll = Math.max(0, Math.round(start + endValue * change));\n\n          if (scroll <= end && scroll >= start && endScroll !== scroll) {\n            if (tween && !tween._initted && tween.data <= _abs(endScroll - scroll)) {\n              // there's an overlapping snap! So we must figure out which one is closer and let that tween live.\n              return;\n            }\n\n            if (snap.inertia === false) {\n              change1 = endValue - progress;\n            }\n\n            tweenTo(endScroll, {\n              duration: snapDurClamp(_abs(Math.max(_abs(naturalEnd - totalProgress), _abs(endValue - totalProgress)) * 0.185 / velocity / 0.05 || 0)),\n              ease: snap.ease || \"power3\",\n              data: _abs(endScroll - scroll),\n              // record the distance so that if another snap tween occurs (conflict) we can prioritize the closest snap.\n              onInterrupt: function onInterrupt() {\n                return snapDelayedCall.restart(true) && _onInterrupt && _onInterrupt(self);\n              },\n              onComplete: function onComplete() {\n                self.update();\n                lastSnap = scrollFunc();\n\n                if (animation && !isToggle) {\n                  // the resolution of the scrollbar is limited, so we should correct the scrubbed animation's playhead at the end to match EXACTLY where it was supposed to snap\n                  scrubTween ? scrubTween.resetTo(\"totalProgress\", endValue, animation._tTime / animation._tDur) : animation.progress(endValue);\n                }\n\n                snap1 = snap2 = animation && !isToggle ? animation.totalProgress() : self.progress;\n                onSnapComplete && onSnapComplete(self);\n                _onComplete && _onComplete(self);\n              }\n            }, scroll, change1 * change, endScroll - scroll - change1 * change);\n            onStart && onStart(self, tweenTo.tween);\n          }\n        } else if (self.isActive && lastSnap !== scroll) {\n          snapDelayedCall.restart(true);\n        }\n      }).pause();\n    }\n\n    id && (_ids[id] = self);\n    trigger = self.trigger = _getTarget(trigger || pin !== true && pin); // if a trigger has some kind of scroll-related effect applied that could contaminate the \"y\" or \"x\" position (like a ScrollSmoother effect), we needed a way to temporarily revert it, so we use the stRevert property of the gsCache. It can return another function that we'll call at the end so it can return to its normal state.\n\n    customRevertReturn = trigger && trigger._gsap && trigger._gsap.stRevert;\n    customRevertReturn && (customRevertReturn = customRevertReturn(self));\n    pin = pin === true ? trigger : _getTarget(pin);\n    _isString(toggleClass) && (toggleClass = {\n      targets: trigger,\n      className: toggleClass\n    });\n\n    if (pin) {\n      pinSpacing === false || pinSpacing === _margin || (pinSpacing = !pinSpacing && pin.parentNode && pin.parentNode.style && _getComputedStyle(pin.parentNode).display === \"flex\" ? false : _padding); // if the parent is display: flex, don't apply pinSpacing by default. We should check that pin.parentNode is an element (not shadow dom window)\n\n      self.pin = pin;\n      pinCache = gsap.core.getCache(pin);\n\n      if (!pinCache.spacer) {\n        // record the spacer and pinOriginalState on the cache in case someone tries pinning the same element with MULTIPLE ScrollTriggers - we don't want to have multiple spacers or record the \"original\" pin state after it has already been affected by another ScrollTrigger.\n        if (pinSpacer) {\n          pinSpacer = _getTarget(pinSpacer);\n          pinSpacer && !pinSpacer.nodeType && (pinSpacer = pinSpacer.current || pinSpacer.nativeElement); // for React & Angular\n\n          pinCache.spacerIsNative = !!pinSpacer;\n          pinSpacer && (pinCache.spacerState = _getState(pinSpacer));\n        }\n\n        pinCache.spacer = spacer = pinSpacer || _doc.createElement(\"div\");\n        spacer.classList.add(\"pin-spacer\");\n        id && spacer.classList.add(\"pin-spacer-\" + id);\n        pinCache.pinState = pinOriginalState = _getState(pin);\n      } else {\n        pinOriginalState = pinCache.pinState;\n      }\n\n      vars.force3D !== false && gsap.set(pin, {\n        force3D: true\n      });\n      self.spacer = spacer = pinCache.spacer;\n      cs = _getComputedStyle(pin);\n      spacingStart = cs[pinSpacing + direction.os2];\n      pinGetter = gsap.getProperty(pin);\n      pinSetter = gsap.quickSetter(pin, direction.a, _px); // pin.firstChild && !_maxScroll(pin, direction) && (pin.style.overflow = \"hidden\"); // protects from collapsing margins, but can have unintended consequences as demonstrated here: https://codepen.io/GreenSock/pen/1e42c7a73bfa409d2cf1e184e7a4248d so it was removed in favor of just telling people to set up their CSS to avoid the collapsing margins (overflow: hidden | auto is just one option. Another is border-top: 1px solid transparent).\n\n      _swapPinIn(pin, spacer, cs);\n\n      pinState = _getState(pin);\n    }\n\n    if (markers) {\n      markerVars = _isObject(markers) ? _setDefaults(markers, _markerDefaults) : _markerDefaults;\n      markerStartTrigger = _createMarker(\"scroller-start\", id, scroller, direction, markerVars, 0);\n      markerEndTrigger = _createMarker(\"scroller-end\", id, scroller, direction, markerVars, 0, markerStartTrigger);\n      offset = markerStartTrigger[\"offset\" + direction.op.d2];\n\n      var content = _getTarget(_getProxyProp(scroller, \"content\") || scroller);\n\n      markerStart = this.markerStart = _createMarker(\"start\", id, content, direction, markerVars, offset, 0, containerAnimation);\n      markerEnd = this.markerEnd = _createMarker(\"end\", id, content, direction, markerVars, offset, 0, containerAnimation);\n      containerAnimation && (caMarkerSetter = gsap.quickSetter([markerStart, markerEnd], direction.a, _px));\n\n      if (!useFixedPosition && !(_proxies.length && _getProxyProp(scroller, \"fixedMarkers\") === true)) {\n        _makePositionable(isViewport ? _body : scroller);\n\n        gsap.set([markerStartTrigger, markerEndTrigger], {\n          force3D: true\n        });\n        markerStartSetter = gsap.quickSetter(markerStartTrigger, direction.a, _px);\n        markerEndSetter = gsap.quickSetter(markerEndTrigger, direction.a, _px);\n      }\n    }\n\n    if (containerAnimation) {\n      var oldOnUpdate = containerAnimation.vars.onUpdate,\n          oldParams = containerAnimation.vars.onUpdateParams;\n      containerAnimation.eventCallback(\"onUpdate\", function () {\n        self.update(0, 0, 1);\n        oldOnUpdate && oldOnUpdate.apply(containerAnimation, oldParams || []);\n      });\n    }\n\n    self.previous = function () {\n      return _triggers[_triggers.indexOf(self) - 1];\n    };\n\n    self.next = function () {\n      return _triggers[_triggers.indexOf(self) + 1];\n    };\n\n    self.revert = function (revert, temp) {\n      if (!temp) {\n        return self.kill(true);\n      } // for compatibility with gsap.context() and gsap.matchMedia() which call revert()\n\n\n      var r = revert !== false || !self.enabled,\n          prevRefreshing = _refreshing;\n\n      if (r !== self.isReverted) {\n        if (r) {\n          prevScroll = Math.max(scrollFunc(), self.scroll.rec || 0); // record the scroll so we can revert later (repositioning/pinning things can affect scroll position). In the static refresh() method, we first record all the scroll positions as a reference.\n\n          prevProgress = self.progress;\n          prevAnimProgress = animation && animation.progress();\n        }\n\n        markerStart && [markerStart, markerEnd, markerStartTrigger, markerEndTrigger].forEach(function (m) {\n          return m.style.display = r ? \"none\" : \"block\";\n        });\n\n        if (r) {\n          _refreshing = self;\n          self.update(r); // make sure the pin is back in its original position so that all the measurements are correct. do this BEFORE swapping the pin out\n        }\n\n        if (pin && (!pinReparent || !self.isActive)) {\n          if (r) {\n            _swapPinOut(pin, spacer, pinOriginalState);\n          } else {\n            _swapPinIn(pin, spacer, _getComputedStyle(pin), spacerState);\n          }\n        }\n\n        r || self.update(r); // when we're restoring, the update should run AFTER swapping the pin into its pin-spacer.\n\n        _refreshing = prevRefreshing; // restore. We set it to true during the update() so that things fire properly in there.\n\n        self.isReverted = r;\n      }\n    };\n\n    self.refresh = function (soft, force, position, pinOffset) {\n      // position is typically only defined if it's coming from setPositions() - it's a way to skip the normal parsing. pinOffset is also only from setPositions() and is mostly related to fancy stuff we need to do in ScrollSmoother with effects\n      if ((_refreshing || !self.enabled) && !force) {\n        return;\n      }\n\n      if (pin && soft && _lastScrollTime) {\n        _addListener(ScrollTrigger, \"scrollEnd\", _softRefresh);\n\n        return;\n      }\n\n      !_refreshingAll && onRefreshInit && onRefreshInit(self);\n      _refreshing = self;\n\n      if (tweenTo.tween && !position) {\n        // we skip this if a position is passed in because typically that's from .setPositions() and it's best to allow in-progress snapping to continue.\n        tweenTo.tween.kill();\n        tweenTo.tween = 0;\n      }\n\n      scrubTween && scrubTween.pause();\n\n      if (invalidateOnRefresh && animation) {\n        animation.revert({\n          kill: false\n        }).invalidate();\n        animation.getChildren ? animation.getChildren(true, true, false).forEach(function (t) {\n          return t.vars.immediateRender && t.render(0, true, true);\n        }) : animation.vars.immediateRender && animation.render(0, true, true); // any from() or fromTo() tweens should render immediately (well, unless they have immediateRender: false)\n      }\n\n      self.isReverted || self.revert(true, true);\n      self._subPinOffset = false; // we'll set this to true in the sub-pins if we find any\n\n      var size = getScrollerSize(),\n          scrollerBounds = getScrollerOffsets(),\n          max = containerAnimation ? containerAnimation.duration() : _maxScroll(scroller, direction),\n          isFirstRefresh = change <= 0.01 || !change,\n          offset = 0,\n          otherPinOffset = pinOffset || 0,\n          parsedEnd = _isObject(position) ? position.end : vars.end,\n          parsedEndTrigger = vars.endTrigger || trigger,\n          parsedStart = _isObject(position) ? position.start : vars.start || (vars.start === 0 || !trigger ? 0 : pin ? \"0 0\" : \"0 100%\"),\n          pinnedContainer = self.pinnedContainer = vars.pinnedContainer && _getTarget(vars.pinnedContainer, self),\n          triggerIndex = trigger && Math.max(0, _triggers.indexOf(self)) || 0,\n          i = triggerIndex,\n          cs,\n          bounds,\n          scroll,\n          isVertical,\n          override,\n          curTrigger,\n          curPin,\n          oppositeScroll,\n          initted,\n          revertedPins,\n          forcedOverflow,\n          markerStartOffset,\n          markerEndOffset;\n\n      if (markers && _isObject(position)) {\n        // if we alter the start/end positions with .setPositions(), it generally feeds in absolute NUMBERS which don't convey information about where to line up the markers, so to keep it intuitive, we record how far the trigger positions shift after applying the new numbers and then offset by that much in the opposite direction. We do the same to the associated trigger markers too of course.\n        markerStartOffset = gsap.getProperty(markerStartTrigger, direction.p);\n        markerEndOffset = gsap.getProperty(markerEndTrigger, direction.p);\n      }\n\n      while (i-- > 0) {\n        // user might try to pin the same element more than once, so we must find any prior triggers with the same pin, revert them, and determine how long they're pinning so that we can offset things appropriately. Make sure we revert from last to first so that things \"rewind\" properly.\n        curTrigger = _triggers[i];\n        curTrigger.end || curTrigger.refresh(0, 1) || (_refreshing = self); // if it's a timeline-based trigger that hasn't been fully initialized yet because it's waiting for 1 tick, just force the refresh() here, otherwise if it contains a pin that's supposed to affect other ScrollTriggers further down the page, they won't be adjusted properly.\n\n        curPin = curTrigger.pin;\n\n        if (curPin && (curPin === trigger || curPin === pin || curPin === pinnedContainer) && !curTrigger.isReverted) {\n          revertedPins || (revertedPins = []);\n          revertedPins.unshift(curTrigger); // we'll revert from first to last to make sure things reach their end state properly\n\n          curTrigger.revert(true, true);\n        }\n\n        if (curTrigger !== _triggers[i]) {\n          // in case it got removed.\n          triggerIndex--;\n          i--;\n        }\n      }\n\n      _isFunction(parsedStart) && (parsedStart = parsedStart(self));\n      parsedStart = _parseClamp(parsedStart, \"start\", self);\n      start = _parsePosition(parsedStart, trigger, size, direction, scrollFunc(), markerStart, markerStartTrigger, self, scrollerBounds, borderWidth, useFixedPosition, max, containerAnimation, self._startClamp && \"_startClamp\") || (pin ? -0.001 : 0);\n      _isFunction(parsedEnd) && (parsedEnd = parsedEnd(self));\n\n      if (_isString(parsedEnd) && !parsedEnd.indexOf(\"+=\")) {\n        if (~parsedEnd.indexOf(\" \")) {\n          parsedEnd = (_isString(parsedStart) ? parsedStart.split(\" \")[0] : \"\") + parsedEnd;\n        } else {\n          offset = _offsetToPx(parsedEnd.substr(2), size);\n          parsedEnd = _isString(parsedStart) ? parsedStart : (containerAnimation ? gsap.utils.mapRange(0, containerAnimation.duration(), containerAnimation.scrollTrigger.start, containerAnimation.scrollTrigger.end, start) : start) + offset; // _parsePosition won't factor in the offset if the start is a number, so do it here.\n\n          parsedEndTrigger = trigger;\n        }\n      }\n\n      parsedEnd = _parseClamp(parsedEnd, \"end\", self);\n      end = Math.max(start, _parsePosition(parsedEnd || (parsedEndTrigger ? \"100% 0\" : max), parsedEndTrigger, size, direction, scrollFunc() + offset, markerEnd, markerEndTrigger, self, scrollerBounds, borderWidth, useFixedPosition, max, containerAnimation, self._endClamp && \"_endClamp\")) || -0.001;\n      offset = 0;\n      i = triggerIndex;\n\n      while (i--) {\n        curTrigger = _triggers[i] || {};\n        curPin = curTrigger.pin;\n\n        if (curPin && curTrigger.start - curTrigger._pinPush <= start && !containerAnimation && curTrigger.end > 0) {\n          cs = curTrigger.end - (self._startClamp ? Math.max(0, curTrigger.start) : curTrigger.start);\n\n          if ((curPin === trigger && curTrigger.start - curTrigger._pinPush < start || curPin === pinnedContainer) && isNaN(parsedStart)) {\n            // numeric start values shouldn't be offset at all - treat them as absolute\n            offset += cs * (1 - curTrigger.progress);\n          }\n\n          curPin === pin && (otherPinOffset += cs);\n        }\n      }\n\n      start += offset;\n      end += offset;\n      self._startClamp && (self._startClamp += offset);\n\n      if (self._endClamp && !_refreshingAll) {\n        self._endClamp = end || -0.001;\n        end = Math.min(end, _maxScroll(scroller, direction));\n      }\n\n      change = end - start || (start -= 0.01) && 0.001;\n\n      if (isFirstRefresh) {\n        // on the very first refresh(), the prevProgress couldn't have been accurate yet because the start/end were never calculated, so we set it here. Before 3.11.5, it could lead to an inaccurate scroll position restoration with snapping.\n        prevProgress = gsap.utils.clamp(0, 1, gsap.utils.normalize(start, end, prevScroll));\n      }\n\n      self._pinPush = otherPinOffset;\n\n      if (markerStart && offset) {\n        // offset the markers if necessary\n        cs = {};\n        cs[direction.a] = \"+=\" + offset;\n        pinnedContainer && (cs[direction.p] = \"-=\" + scrollFunc());\n        gsap.set([markerStart, markerEnd], cs);\n      }\n\n      if (pin && !(_clampingMax && self.end >= _maxScroll(scroller, direction))) {\n        cs = _getComputedStyle(pin);\n        isVertical = direction === _vertical;\n        scroll = scrollFunc(); // recalculate because the triggers can affect the scroll\n\n        pinStart = parseFloat(pinGetter(direction.a)) + otherPinOffset;\n\n        if (!max && end > 1) {\n          // makes sure the scroller has a scrollbar, otherwise if something has width: 100%, for example, it would be too big (exclude the scrollbar). See https://gsap.com/forums/topic/25182-scrolltrigger-width-of-page-increase-where-markers-are-set-to-false/\n          forcedOverflow = (isViewport ? _doc.scrollingElement || _docEl : scroller).style;\n          forcedOverflow = {\n            style: forcedOverflow,\n            value: forcedOverflow[\"overflow\" + direction.a.toUpperCase()]\n          };\n\n          if (isViewport && _getComputedStyle(_body)[\"overflow\" + direction.a.toUpperCase()] !== \"scroll\") {\n            // avoid an extra scrollbar if BOTH <html> and <body> have overflow set to \"scroll\"\n            forcedOverflow.style[\"overflow\" + direction.a.toUpperCase()] = \"scroll\";\n          }\n        }\n\n        _swapPinIn(pin, spacer, cs);\n\n        pinState = _getState(pin); // transforms will interfere with the top/left/right/bottom placement, so remove them temporarily. getBoundingClientRect() factors in transforms.\n\n        bounds = _getBounds(pin, true);\n        oppositeScroll = useFixedPosition && _getScrollFunc(scroller, isVertical ? _horizontal : _vertical)();\n\n        if (pinSpacing) {\n          spacerState = [pinSpacing + direction.os2, change + otherPinOffset + _px];\n          spacerState.t = spacer;\n          i = pinSpacing === _padding ? _getSize(pin, direction) + change + otherPinOffset : 0;\n\n          if (i) {\n            spacerState.push(direction.d, i + _px); // for box-sizing: border-box (must include padding).\n\n            spacer.style.flexBasis !== \"auto\" && (spacer.style.flexBasis = i + _px);\n          }\n\n          _setState(spacerState);\n\n          if (pinnedContainer) {\n            // in ScrollTrigger.refresh(), we need to re-evaluate the pinContainer's size because this pinSpacing may stretch it out, but we can't just add the exact distance because depending on layout, it may not push things down or it may only do so partially.\n            _triggers.forEach(function (t) {\n              if (t.pin === pinnedContainer && t.vars.pinSpacing !== false) {\n                t._subPinOffset = true;\n              }\n            });\n          }\n\n          useFixedPosition && scrollFunc(prevScroll);\n        } else {\n          i = _getSize(pin, direction);\n          i && spacer.style.flexBasis !== \"auto\" && (spacer.style.flexBasis = i + _px);\n        }\n\n        if (useFixedPosition) {\n          override = {\n            top: bounds.top + (isVertical ? scroll - start : oppositeScroll) + _px,\n            left: bounds.left + (isVertical ? oppositeScroll : scroll - start) + _px,\n            boxSizing: \"border-box\",\n            position: \"fixed\"\n          };\n          override[_width] = override[\"max\" + _Width] = Math.ceil(bounds.width) + _px;\n          override[_height] = override[\"max\" + _Height] = Math.ceil(bounds.height) + _px;\n          override[_margin] = override[_margin + _Top] = override[_margin + _Right] = override[_margin + _Bottom] = override[_margin + _Left] = \"0\";\n          override[_padding] = cs[_padding];\n          override[_padding + _Top] = cs[_padding + _Top];\n          override[_padding + _Right] = cs[_padding + _Right];\n          override[_padding + _Bottom] = cs[_padding + _Bottom];\n          override[_padding + _Left] = cs[_padding + _Left];\n          pinActiveState = _copyState(pinOriginalState, override, pinReparent);\n          _refreshingAll && scrollFunc(0);\n        }\n\n        if (animation) {\n          // the animation might be affecting the transform, so we must jump to the end, check the value, and compensate accordingly. Otherwise, when it becomes unpinned, the pinSetter() will get set to a value that doesn't include whatever the animation did.\n          initted = animation._initted; // if not, we must invalidate() after this step, otherwise it could lock in starting values prematurely.\n\n          _suppressOverwrites(1);\n\n          animation.render(animation.duration(), true, true);\n          pinChange = pinGetter(direction.a) - pinStart + change + otherPinOffset;\n          pinMoves = Math.abs(change - pinChange) > 1;\n          useFixedPosition && pinMoves && pinActiveState.splice(pinActiveState.length - 2, 2); // transform is the last property/value set in the state Array. Since the animation is controlling that, we should omit it.\n\n          animation.render(0, true, true);\n          initted || animation.invalidate(true);\n          animation.parent || animation.totalTime(animation.totalTime()); // if, for example, a toggleAction called play() and then refresh() happens and when we render(1) above, it would cause the animation to complete and get removed from its parent, so this makes sure it gets put back in.\n\n          _suppressOverwrites(0);\n        } else {\n          pinChange = change;\n        }\n\n        forcedOverflow && (forcedOverflow.value ? forcedOverflow.style[\"overflow\" + direction.a.toUpperCase()] = forcedOverflow.value : forcedOverflow.style.removeProperty(\"overflow-\" + direction.a));\n      } else if (trigger && scrollFunc() && !containerAnimation) {\n        // it may be INSIDE a pinned element, so walk up the tree and look for any elements with _pinOffset to compensate because anything with pinSpacing that's already scrolled would throw off the measurements in getBoundingClientRect()\n        bounds = trigger.parentNode;\n\n        while (bounds && bounds !== _body) {\n          if (bounds._pinOffset) {\n            start -= bounds._pinOffset;\n            end -= bounds._pinOffset;\n          }\n\n          bounds = bounds.parentNode;\n        }\n      }\n\n      revertedPins && revertedPins.forEach(function (t) {\n        return t.revert(false, true);\n      });\n      self.start = start;\n      self.end = end;\n      scroll1 = scroll2 = _refreshingAll ? prevScroll : scrollFunc(); // reset velocity\n\n      if (!containerAnimation && !_refreshingAll) {\n        scroll1 < prevScroll && scrollFunc(prevScroll);\n        self.scroll.rec = 0;\n      }\n\n      self.revert(false, true);\n      lastRefresh = _getTime();\n\n      if (snapDelayedCall) {\n        lastSnap = -1; // just so snapping gets re-enabled, clear out any recorded last value\n        // self.isActive && scrollFunc(start + change * prevProgress); // previously this line was here to ensure that when snapping kicks in, it's from the previous progress but in some cases that's not desirable, like an all-page ScrollTrigger when new content gets added to the page, that'd totally change the progress.\n\n        snapDelayedCall.restart(true);\n      }\n\n      _refreshing = 0;\n      animation && isToggle && (animation._initted || prevAnimProgress) && animation.progress() !== prevAnimProgress && animation.progress(prevAnimProgress || 0, true).render(animation.time(), true, true); // must force a re-render because if saveStyles() was used on the target(s), the styles could have been wiped out during the refresh().\n\n      if (isFirstRefresh || prevProgress !== self.progress || containerAnimation || invalidateOnRefresh || animation && !animation._initted) {\n        // ensures that the direction is set properly (when refreshing, progress is set back to 0 initially, then back again to wherever it needs to be) and that callbacks are triggered.\n        animation && !isToggle && (animation._initted || prevProgress || animation.vars.immediateRender !== false) && animation.totalProgress(containerAnimation && start < -0.001 && !prevProgress ? gsap.utils.normalize(start, end, 0) : prevProgress, true); // to avoid issues where animation callbacks like onStart aren't triggered.\n\n        self.progress = isFirstRefresh || (scroll1 - start) / change === prevProgress ? 0 : prevProgress;\n      }\n\n      pin && pinSpacing && (spacer._pinOffset = Math.round(self.progress * pinChange));\n      scrubTween && scrubTween.invalidate();\n\n      if (!isNaN(markerStartOffset)) {\n        // numbers were passed in for the position which are absolute, so instead of just putting the markers at the very bottom of the viewport, we figure out how far they shifted down (it's safe to assume they were originally positioned in closer relation to the trigger element with values like \"top\", \"center\", a percentage or whatever, so we offset that much in the opposite direction to basically revert them to the relative position thy were at previously.\n        markerStartOffset -= gsap.getProperty(markerStartTrigger, direction.p);\n        markerEndOffset -= gsap.getProperty(markerEndTrigger, direction.p);\n\n        _shiftMarker(markerStartTrigger, direction, markerStartOffset);\n\n        _shiftMarker(markerStart, direction, markerStartOffset - (pinOffset || 0));\n\n        _shiftMarker(markerEndTrigger, direction, markerEndOffset);\n\n        _shiftMarker(markerEnd, direction, markerEndOffset - (pinOffset || 0));\n      }\n\n      isFirstRefresh && !_refreshingAll && self.update(); // edge case - when you reload a page when it's already scrolled down, some browsers fire a \"scroll\" event before DOMContentLoaded, triggering an updateAll(). If we don't update the self.progress as part of refresh(), then when it happens next, it may record prevProgress as 0 when it really shouldn't, potentially causing a callback in an animation to fire again.\n\n      if (onRefresh && !_refreshingAll && !executingOnRefresh) {\n        // when refreshing all, we do extra work to correct pinnedContainer sizes and ensure things don't exceed the maxScroll, so we should do all the refreshes at the end after all that work so that the start/end values are corrected.\n        executingOnRefresh = true;\n        onRefresh(self);\n        executingOnRefresh = false;\n      }\n    };\n\n    self.getVelocity = function () {\n      return (scrollFunc() - scroll2) / (_getTime() - _time2) * 1000 || 0;\n    };\n\n    self.endAnimation = function () {\n      _endAnimation(self.callbackAnimation);\n\n      if (animation) {\n        scrubTween ? scrubTween.progress(1) : !animation.paused() ? _endAnimation(animation, animation.reversed()) : isToggle || _endAnimation(animation, self.direction < 0, 1);\n      }\n    };\n\n    self.labelToScroll = function (label) {\n      return animation && animation.labels && (start || self.refresh() || start) + animation.labels[label] / animation.duration() * change || 0;\n    };\n\n    self.getTrailing = function (name) {\n      var i = _triggers.indexOf(self),\n          a = self.direction > 0 ? _triggers.slice(0, i).reverse() : _triggers.slice(i + 1);\n\n      return (_isString(name) ? a.filter(function (t) {\n        return t.vars.preventOverlaps === name;\n      }) : a).filter(function (t) {\n        return self.direction > 0 ? t.end <= start : t.start >= end;\n      });\n    };\n\n    self.update = function (reset, recordVelocity, forceFake) {\n      if (containerAnimation && !forceFake && !reset) {\n        return;\n      }\n\n      var scroll = _refreshingAll === true ? prevScroll : self.scroll(),\n          p = reset ? 0 : (scroll - start) / change,\n          clipped = p < 0 ? 0 : p > 1 ? 1 : p || 0,\n          prevProgress = self.progress,\n          isActive,\n          wasActive,\n          toggleState,\n          action,\n          stateChanged,\n          toggled,\n          isAtMax,\n          isTakingAction;\n\n      if (recordVelocity) {\n        scroll2 = scroll1;\n        scroll1 = containerAnimation ? scrollFunc() : scroll;\n\n        if (snap) {\n          snap2 = snap1;\n          snap1 = animation && !isToggle ? animation.totalProgress() : clipped;\n        }\n      } // anticipate the pinning a few ticks ahead of time based on velocity to avoid a visual glitch due to the fact that most browsers do scrolling on a separate thread (not synced with requestAnimationFrame).\n\n\n      if (anticipatePin && pin && !_refreshing && !_startup && _lastScrollTime) {\n        if (!clipped && start < scroll + (scroll - scroll2) / (_getTime() - _time2) * anticipatePin) {\n          clipped = 0.0001;\n        } else if (clipped === 1 && end > scroll + (scroll - scroll2) / (_getTime() - _time2) * anticipatePin) {\n          clipped = 0.9999;\n        }\n      }\n\n      if (clipped !== prevProgress && self.enabled) {\n        isActive = self.isActive = !!clipped && clipped < 1;\n        wasActive = !!prevProgress && prevProgress < 1;\n        toggled = isActive !== wasActive;\n        stateChanged = toggled || !!clipped !== !!prevProgress; // could go from start all the way to end, thus it didn't toggle but it did change state in a sense (may need to fire a callback)\n\n        self.direction = clipped > prevProgress ? 1 : -1;\n        self.progress = clipped;\n\n        if (stateChanged && !_refreshing) {\n          toggleState = clipped && !prevProgress ? 0 : clipped === 1 ? 1 : prevProgress === 1 ? 2 : 3; // 0 = enter, 1 = leave, 2 = enterBack, 3 = leaveBack (we prioritize the FIRST encounter, thus if you scroll really fast past the onEnter and onLeave in one tick, it'd prioritize onEnter.\n\n          if (isToggle) {\n            action = !toggled && toggleActions[toggleState + 1] !== \"none\" && toggleActions[toggleState + 1] || toggleActions[toggleState]; // if it didn't toggle, that means it shot right past and since we prioritize the \"enter\" action, we should switch to the \"leave\" in this case (but only if one is defined)\n\n            isTakingAction = animation && (action === \"complete\" || action === \"reset\" || action in animation);\n          }\n        }\n\n        preventOverlaps && (toggled || isTakingAction) && (isTakingAction || scrub || !animation) && (_isFunction(preventOverlaps) ? preventOverlaps(self) : self.getTrailing(preventOverlaps).forEach(function (t) {\n          return t.endAnimation();\n        }));\n\n        if (!isToggle) {\n          if (scrubTween && !_refreshing && !_startup) {\n            scrubTween._dp._time - scrubTween._start !== scrubTween._time && scrubTween.render(scrubTween._dp._time - scrubTween._start); // if there's a scrub on both the container animation and this one (or a ScrollSmoother), the update order would cause this one not to have rendered yet, so it wouldn't make any progress before we .restart() it heading toward the new progress so it'd appear stuck thus we force a render here.\n\n            if (scrubTween.resetTo) {\n              scrubTween.resetTo(\"totalProgress\", clipped, animation._tTime / animation._tDur);\n            } else {\n              // legacy support (courtesy), before 3.10.0\n              scrubTween.vars.totalProgress = clipped;\n              scrubTween.invalidate().restart();\n            }\n          } else if (animation) {\n            animation.totalProgress(clipped, !!(_refreshing && (lastRefresh || reset)));\n          }\n        }\n\n        if (pin) {\n          reset && pinSpacing && (spacer.style[pinSpacing + direction.os2] = spacingStart);\n\n          if (!useFixedPosition) {\n            pinSetter(_round(pinStart + pinChange * clipped));\n          } else if (stateChanged) {\n            isAtMax = !reset && clipped > prevProgress && end + 1 > scroll && scroll + 1 >= _maxScroll(scroller, direction); // if it's at the VERY end of the page, don't switch away from position: fixed because it's pointless and it could cause a brief flash when the user scrolls back up (when it gets pinned again)\n\n            if (pinReparent) {\n              if (!reset && (isActive || isAtMax)) {\n                var bounds = _getBounds(pin, true),\n                    _offset = scroll - start;\n\n                _reparent(pin, _body, bounds.top + (direction === _vertical ? _offset : 0) + _px, bounds.left + (direction === _vertical ? 0 : _offset) + _px);\n              } else {\n                _reparent(pin, spacer);\n              }\n            }\n\n            _setState(isActive || isAtMax ? pinActiveState : pinState);\n\n            pinMoves && clipped < 1 && isActive || pinSetter(pinStart + (clipped === 1 && !isAtMax ? pinChange : 0));\n          }\n        }\n\n        snap && !tweenTo.tween && !_refreshing && !_startup && snapDelayedCall.restart(true);\n        toggleClass && (toggled || once && clipped && (clipped < 1 || !_limitCallbacks)) && _toArray(toggleClass.targets).forEach(function (el) {\n          return el.classList[isActive || once ? \"add\" : \"remove\"](toggleClass.className);\n        }); // classes could affect positioning, so do it even if reset or refreshing is true.\n\n        onUpdate && !isToggle && !reset && onUpdate(self);\n\n        if (stateChanged && !_refreshing) {\n          if (isToggle) {\n            if (isTakingAction) {\n              if (action === \"complete\") {\n                animation.pause().totalProgress(1);\n              } else if (action === \"reset\") {\n                animation.restart(true).pause();\n              } else if (action === \"restart\") {\n                animation.restart(true);\n              } else {\n                animation[action]();\n              }\n            }\n\n            onUpdate && onUpdate(self);\n          }\n\n          if (toggled || !_limitCallbacks) {\n            // on startup, the page could be scrolled and we don't want to fire callbacks that didn't toggle. For example onEnter shouldn't fire if the ScrollTrigger isn't actually entered.\n            onToggle && toggled && _callback(self, onToggle);\n            callbacks[toggleState] && _callback(self, callbacks[toggleState]);\n            once && (clipped === 1 ? self.kill(false, 1) : callbacks[toggleState] = 0); // a callback shouldn't be called again if once is true.\n\n            if (!toggled) {\n              // it's possible to go completely past, like from before the start to after the end (or vice-versa) in which case BOTH callbacks should be fired in that order\n              toggleState = clipped === 1 ? 1 : 3;\n              callbacks[toggleState] && _callback(self, callbacks[toggleState]);\n            }\n          }\n\n          if (fastScrollEnd && !isActive && Math.abs(self.getVelocity()) > (_isNumber(fastScrollEnd) ? fastScrollEnd : 2500)) {\n            _endAnimation(self.callbackAnimation);\n\n            scrubTween ? scrubTween.progress(1) : _endAnimation(animation, action === \"reverse\" ? 1 : !clipped, 1);\n          }\n        } else if (isToggle && onUpdate && !_refreshing) {\n          onUpdate(self);\n        }\n      } // update absolutely-positioned markers (only if the scroller isn't the viewport)\n\n\n      if (markerEndSetter) {\n        var n = containerAnimation ? scroll / containerAnimation.duration() * (containerAnimation._caScrollDist || 0) : scroll;\n        markerStartSetter(n + (markerStartTrigger._isFlipped ? 1 : 0));\n        markerEndSetter(n);\n      }\n\n      caMarkerSetter && caMarkerSetter(-scroll / containerAnimation.duration() * (containerAnimation._caScrollDist || 0));\n    };\n\n    self.enable = function (reset, refresh) {\n      if (!self.enabled) {\n        self.enabled = true;\n\n        _addListener(scroller, \"resize\", _onResize);\n\n        isViewport || _addListener(scroller, \"scroll\", _onScroll);\n        onRefreshInit && _addListener(ScrollTrigger, \"refreshInit\", onRefreshInit);\n\n        if (reset !== false) {\n          self.progress = prevProgress = 0;\n          scroll1 = scroll2 = lastSnap = scrollFunc();\n        }\n\n        refresh !== false && self.refresh();\n      }\n    };\n\n    self.getTween = function (snap) {\n      return snap && tweenTo ? tweenTo.tween : scrubTween;\n    };\n\n    self.setPositions = function (newStart, newEnd, keepClamp, pinOffset) {\n      // doesn't persist after refresh()! Intended to be a way to override values that were set during refresh(), like you could set it in onRefresh()\n      if (containerAnimation) {\n        // convert ratios into scroll positions. Remember, start/end values on ScrollTriggers that have a containerAnimation refer to the time (in seconds), NOT scroll positions.\n        var st = containerAnimation.scrollTrigger,\n            duration = containerAnimation.duration(),\n            _change = st.end - st.start;\n\n        newStart = st.start + _change * newStart / duration;\n        newEnd = st.start + _change * newEnd / duration;\n      }\n\n      self.refresh(false, false, {\n        start: _keepClamp(newStart, keepClamp && !!self._startClamp),\n        end: _keepClamp(newEnd, keepClamp && !!self._endClamp)\n      }, pinOffset);\n      self.update();\n    };\n\n    self.adjustPinSpacing = function (amount) {\n      if (spacerState && amount) {\n        var i = spacerState.indexOf(direction.d) + 1;\n        spacerState[i] = parseFloat(spacerState[i]) + amount + _px;\n        spacerState[1] = parseFloat(spacerState[1]) + amount + _px;\n\n        _setState(spacerState);\n      }\n    };\n\n    self.disable = function (reset, allowAnimation) {\n      reset !== false && self.revert(true, true);\n\n      if (self.enabled) {\n        self.enabled = self.isActive = false;\n        allowAnimation || scrubTween && scrubTween.pause();\n        prevScroll = 0;\n        pinCache && (pinCache.uncache = 1);\n        onRefreshInit && _removeListener(ScrollTrigger, \"refreshInit\", onRefreshInit);\n\n        if (snapDelayedCall) {\n          snapDelayedCall.pause();\n          tweenTo.tween && tweenTo.tween.kill() && (tweenTo.tween = 0);\n        }\n\n        if (!isViewport) {\n          var i = _triggers.length;\n\n          while (i--) {\n            if (_triggers[i].scroller === scroller && _triggers[i] !== self) {\n              return; //don't remove the listeners if there are still other triggers referencing it.\n            }\n          }\n\n          _removeListener(scroller, \"resize\", _onResize);\n\n          isViewport || _removeListener(scroller, \"scroll\", _onScroll);\n        }\n      }\n    };\n\n    self.kill = function (revert, allowAnimation) {\n      self.disable(revert, allowAnimation);\n      scrubTween && !allowAnimation && scrubTween.kill();\n      id && delete _ids[id];\n\n      var i = _triggers.indexOf(self);\n\n      i >= 0 && _triggers.splice(i, 1);\n      i === _i && _direction > 0 && _i--; // if we're in the middle of a refresh() or update(), splicing would cause skips in the index, so adjust...\n      // if no other ScrollTrigger instances of the same scroller are found, wipe out any recorded scroll position. Otherwise, in a single page application, for example, it could maintain scroll position when it really shouldn't.\n\n      i = 0;\n\n      _triggers.forEach(function (t) {\n        return t.scroller === self.scroller && (i = 1);\n      });\n\n      i || _refreshingAll || (self.scroll.rec = 0);\n\n      if (animation) {\n        animation.scrollTrigger = null;\n        revert && animation.revert({\n          kill: false\n        });\n        allowAnimation || animation.kill();\n      }\n\n      markerStart && [markerStart, markerEnd, markerStartTrigger, markerEndTrigger].forEach(function (m) {\n        return m.parentNode && m.parentNode.removeChild(m);\n      });\n      _primary === self && (_primary = 0);\n\n      if (pin) {\n        pinCache && (pinCache.uncache = 1);\n        i = 0;\n\n        _triggers.forEach(function (t) {\n          return t.pin === pin && i++;\n        });\n\n        i || (pinCache.spacer = 0); // if there aren't any more ScrollTriggers with the same pin, remove the spacer, otherwise it could be contaminated with old/stale values if the user re-creates a ScrollTrigger for the same element.\n      }\n\n      vars.onKill && vars.onKill(self);\n    };\n\n    _triggers.push(self);\n\n    self.enable(false, false);\n    customRevertReturn && customRevertReturn(self);\n\n    if (animation && animation.add && !change) {\n      // if the animation is a timeline, it may not have been populated yet, so it wouldn't render at the proper place on the first refresh(), thus we should schedule one for the next tick. If \"change\" is defined, we know it must be re-enabling, thus we can refresh() right away.\n      var updateFunc = self.update; // some browsers may fire a scroll event BEFORE a tick elapses and/or the DOMContentLoaded fires. So there's a chance update() will be called BEFORE a refresh() has happened on a Timeline-attached ScrollTrigger which means the start/end won't be calculated yet. We don't want to add conditional logic inside the update() method (like check to see if end is defined and if not, force a refresh()) because that's a function that gets hit a LOT (performance). So we swap out the real update() method for this one that'll re-attach it the first time it gets called and of course forces a refresh().\n\n      self.update = function () {\n        self.update = updateFunc;\n        _scrollers.cache++; // otherwise a cached scroll position may get used in the refresh() in a very rare scenario, like if ScrollTriggers are created inside a DOMContentLoaded event and the queued requestAnimationFrame() fires beforehand. See https://gsap.com/community/forums/topic/41267-scrolltrigger-breaks-on-refresh-when-using-domcontentloaded/\n\n        start || end || self.refresh();\n      };\n\n      gsap.delayedCall(0.01, self.update);\n      change = 0.01;\n      start = end = 0;\n    } else {\n      self.refresh();\n    }\n\n    pin && _queueRefreshAll(); // pinning could affect the positions of other things, so make sure we queue a full refresh()\n  };\n\n  ScrollTrigger.register = function register(core) {\n    if (!_coreInitted) {\n      gsap = core || _getGSAP();\n      _windowExists() && window.document && ScrollTrigger.enable();\n      _coreInitted = _enabled;\n    }\n\n    return _coreInitted;\n  };\n\n  ScrollTrigger.defaults = function defaults(config) {\n    if (config) {\n      for (var p in config) {\n        _defaults[p] = config[p];\n      }\n    }\n\n    return _defaults;\n  };\n\n  ScrollTrigger.disable = function disable(reset, kill) {\n    _enabled = 0;\n\n    _triggers.forEach(function (trigger) {\n      return trigger[kill ? \"kill\" : \"disable\"](reset);\n    });\n\n    _removeListener(_win, \"wheel\", _onScroll);\n\n    _removeListener(_doc, \"scroll\", _onScroll);\n\n    clearInterval(_syncInterval);\n\n    _removeListener(_doc, \"touchcancel\", _passThrough);\n\n    _removeListener(_body, \"touchstart\", _passThrough);\n\n    _multiListener(_removeListener, _doc, \"pointerdown,touchstart,mousedown\", _pointerDownHandler);\n\n    _multiListener(_removeListener, _doc, \"pointerup,touchend,mouseup\", _pointerUpHandler);\n\n    _resizeDelay.kill();\n\n    _iterateAutoRefresh(_removeListener);\n\n    for (var i = 0; i < _scrollers.length; i += 3) {\n      _wheelListener(_removeListener, _scrollers[i], _scrollers[i + 1]);\n\n      _wheelListener(_removeListener, _scrollers[i], _scrollers[i + 2]);\n    }\n  };\n\n  ScrollTrigger.enable = function enable() {\n    _win = window;\n    _doc = document;\n    _docEl = _doc.documentElement;\n    _body = _doc.body;\n\n    if (gsap) {\n      _toArray = gsap.utils.toArray;\n      _clamp = gsap.utils.clamp;\n      _context = gsap.core.context || _passThrough;\n      _suppressOverwrites = gsap.core.suppressOverwrites || _passThrough;\n      _scrollRestoration = _win.history.scrollRestoration || \"auto\";\n      _lastScroll = _win.pageYOffset || 0;\n      gsap.core.globals(\"ScrollTrigger\", ScrollTrigger); // must register the global manually because in Internet Explorer, functions (classes) don't have a \"name\" property.\n\n      if (_body) {\n        _enabled = 1;\n        _div100vh = document.createElement(\"div\"); // to solve mobile browser address bar show/hide resizing, we shouldn't rely on window.innerHeight. Instead, use a <div> with its height set to 100vh and measure that since that's what the scrolling is based on anyway and it's not affected by address bar showing/hiding.\n\n        _div100vh.style.height = \"100vh\";\n        _div100vh.style.position = \"absolute\";\n\n        _refresh100vh();\n\n        _rafBugFix();\n\n        Observer.register(gsap); // isTouch is 0 if no touch, 1 if ONLY touch, and 2 if it can accommodate touch but also other types like mouse/pointer.\n\n        ScrollTrigger.isTouch = Observer.isTouch;\n        _fixIOSBug = Observer.isTouch && /(iPad|iPhone|iPod|Mac)/g.test(navigator.userAgent); // since 2017, iOS has had a bug that causes event.clientX/Y to be inaccurate when a scroll occurs, thus we must alternate ignoring every other touchmove event to work around it. See https://bugs.webkit.org/show_bug.cgi?id=181954 and https://codepen.io/GreenSock/pen/ExbrPNa/087cef197dc35445a0951e8935c41503\n\n        _ignoreMobileResize = Observer.isTouch === 1;\n\n        _addListener(_win, \"wheel\", _onScroll); // mostly for 3rd party smooth scrolling libraries.\n\n\n        _root = [_win, _doc, _docEl, _body];\n\n        if (gsap.matchMedia) {\n          ScrollTrigger.matchMedia = function (vars) {\n            var mm = gsap.matchMedia(),\n                p;\n\n            for (p in vars) {\n              mm.add(p, vars[p]);\n            }\n\n            return mm;\n          };\n\n          gsap.addEventListener(\"matchMediaInit\", function () {\n            _recordScrollPositions();\n\n            _revertAll();\n          });\n          gsap.addEventListener(\"matchMediaRevert\", function () {\n            return _revertRecorded();\n          });\n          gsap.addEventListener(\"matchMedia\", function () {\n            _refreshAll(0, 1);\n\n            _dispatch(\"matchMedia\");\n          });\n          gsap.matchMedia().add(\"(orientation: portrait)\", function () {\n            // when orientation changes, we should take new base measurements for the ignoreMobileResize feature.\n            _setBaseDimensions();\n\n            return _setBaseDimensions;\n          });\n        } else {\n          console.warn(\"Requires GSAP 3.11.0 or later\");\n        }\n\n        _setBaseDimensions();\n\n        _addListener(_doc, \"scroll\", _onScroll); // some browsers (like Chrome), the window stops dispatching scroll events on the window if you scroll really fast, but it's consistent on the document!\n\n\n        var bodyHasStyle = _body.hasAttribute(\"style\"),\n            bodyStyle = _body.style,\n            border = bodyStyle.borderTopStyle,\n            AnimationProto = gsap.core.Animation.prototype,\n            bounds,\n            i;\n\n        AnimationProto.revert || Object.defineProperty(AnimationProto, \"revert\", {\n          value: function value() {\n            return this.time(-0.01, true);\n          }\n        }); // only for backwards compatibility (Animation.revert() was added after 3.10.4)\n\n        bodyStyle.borderTopStyle = \"solid\"; // works around an issue where a margin of a child element could throw off the bounds of the _body, making it seem like there's a margin when there actually isn't. The border ensures that the bounds are accurate.\n\n        bounds = _getBounds(_body);\n        _vertical.m = Math.round(bounds.top + _vertical.sc()) || 0; // accommodate the offset of the <body> caused by margins and/or padding\n\n        _horizontal.m = Math.round(bounds.left + _horizontal.sc()) || 0;\n        border ? bodyStyle.borderTopStyle = border : bodyStyle.removeProperty(\"border-top-style\");\n\n        if (!bodyHasStyle) {\n          // SSR frameworks like Next.js complain if this attribute gets added.\n          _body.setAttribute(\"style\", \"\"); // it's not enough to just removeAttribute() - we must first set it to empty, otherwise Next.js complains.\n\n\n          _body.removeAttribute(\"style\");\n        } // TODO: (?) maybe move to leveraging the velocity mechanism in Observer and skip intervals.\n\n\n        _syncInterval = setInterval(_sync, 250);\n        gsap.delayedCall(0.5, function () {\n          return _startup = 0;\n        });\n\n        _addListener(_doc, \"touchcancel\", _passThrough); // some older Android devices intermittently stop dispatching \"touchmove\" events if we don't listen for \"touchcancel\" on the document.\n\n\n        _addListener(_body, \"touchstart\", _passThrough); //works around Safari bug: https://gsap.com/forums/topic/21450-draggable-in-iframe-on-mobile-is-buggy/\n\n\n        _multiListener(_addListener, _doc, \"pointerdown,touchstart,mousedown\", _pointerDownHandler);\n\n        _multiListener(_addListener, _doc, \"pointerup,touchend,mouseup\", _pointerUpHandler);\n\n        _transformProp = gsap.utils.checkPrefix(\"transform\");\n\n        _stateProps.push(_transformProp);\n\n        _coreInitted = _getTime();\n        _resizeDelay = gsap.delayedCall(0.2, _refreshAll).pause();\n        _autoRefresh = [_doc, \"visibilitychange\", function () {\n          var w = _win.innerWidth,\n              h = _win.innerHeight;\n\n          if (_doc.hidden) {\n            _prevWidth = w;\n            _prevHeight = h;\n          } else if (_prevWidth !== w || _prevHeight !== h) {\n            _onResize();\n          }\n        }, _doc, \"DOMContentLoaded\", _refreshAll, _win, \"load\", _refreshAll, _win, \"resize\", _onResize];\n\n        _iterateAutoRefresh(_addListener);\n\n        _triggers.forEach(function (trigger) {\n          return trigger.enable(0, 1);\n        });\n\n        for (i = 0; i < _scrollers.length; i += 3) {\n          _wheelListener(_removeListener, _scrollers[i], _scrollers[i + 1]);\n\n          _wheelListener(_removeListener, _scrollers[i], _scrollers[i + 2]);\n        }\n      }\n    }\n  };\n\n  ScrollTrigger.config = function config(vars) {\n    \"limitCallbacks\" in vars && (_limitCallbacks = !!vars.limitCallbacks);\n    var ms = vars.syncInterval;\n    ms && clearInterval(_syncInterval) || (_syncInterval = ms) && setInterval(_sync, ms);\n    \"ignoreMobileResize\" in vars && (_ignoreMobileResize = ScrollTrigger.isTouch === 1 && vars.ignoreMobileResize);\n\n    if (\"autoRefreshEvents\" in vars) {\n      _iterateAutoRefresh(_removeListener) || _iterateAutoRefresh(_addListener, vars.autoRefreshEvents || \"none\");\n      _ignoreResize = (vars.autoRefreshEvents + \"\").indexOf(\"resize\") === -1;\n    }\n  };\n\n  ScrollTrigger.scrollerProxy = function scrollerProxy(target, vars) {\n    var t = _getTarget(target),\n        i = _scrollers.indexOf(t),\n        isViewport = _isViewport(t);\n\n    if (~i) {\n      _scrollers.splice(i, isViewport ? 6 : 2);\n    }\n\n    if (vars) {\n      isViewport ? _proxies.unshift(_win, vars, _body, vars, _docEl, vars) : _proxies.unshift(t, vars);\n    }\n  };\n\n  ScrollTrigger.clearMatchMedia = function clearMatchMedia(query) {\n    _triggers.forEach(function (t) {\n      return t._ctx && t._ctx.query === query && t._ctx.kill(true, true);\n    });\n  };\n\n  ScrollTrigger.isInViewport = function isInViewport(element, ratio, horizontal) {\n    var bounds = (_isString(element) ? _getTarget(element) : element).getBoundingClientRect(),\n        offset = bounds[horizontal ? _width : _height] * ratio || 0;\n    return horizontal ? bounds.right - offset > 0 && bounds.left + offset < _win.innerWidth : bounds.bottom - offset > 0 && bounds.top + offset < _win.innerHeight;\n  };\n\n  ScrollTrigger.positionInViewport = function positionInViewport(element, referencePoint, horizontal) {\n    _isString(element) && (element = _getTarget(element));\n    var bounds = element.getBoundingClientRect(),\n        size = bounds[horizontal ? _width : _height],\n        offset = referencePoint == null ? size / 2 : referencePoint in _keywords ? _keywords[referencePoint] * size : ~referencePoint.indexOf(\"%\") ? parseFloat(referencePoint) * size / 100 : parseFloat(referencePoint) || 0;\n    return horizontal ? (bounds.left + offset) / _win.innerWidth : (bounds.top + offset) / _win.innerHeight;\n  };\n\n  ScrollTrigger.killAll = function killAll(allowListeners) {\n    _triggers.slice(0).forEach(function (t) {\n      return t.vars.id !== \"ScrollSmoother\" && t.kill();\n    });\n\n    if (allowListeners !== true) {\n      var listeners = _listeners.killAll || [];\n      _listeners = {};\n      listeners.forEach(function (f) {\n        return f();\n      });\n    }\n  };\n\n  return ScrollTrigger;\n}();\nScrollTrigger.version = \"3.14.2\";\n\nScrollTrigger.saveStyles = function (targets) {\n  return targets ? _toArray(targets).forEach(function (target) {\n    // saved styles are recorded in a consecutive alternating Array, like [element, cssText, transform attribute, cache, matchMedia, ...]\n    if (target && target.style) {\n      var i = _savedStyles.indexOf(target);\n\n      i >= 0 && _savedStyles.splice(i, 5);\n\n      _savedStyles.push(target, target.style.cssText, target.getBBox && target.getAttribute(\"transform\"), gsap.core.getCache(target), _context());\n    }\n  }) : _savedStyles;\n};\n\nScrollTrigger.revert = function (soft, media) {\n  return _revertAll(!soft, media);\n};\n\nScrollTrigger.create = function (vars, animation) {\n  return new ScrollTrigger(vars, animation);\n};\n\nScrollTrigger.refresh = function (safe) {\n  return safe ? _onResize(true) : (_coreInitted || ScrollTrigger.register()) && _refreshAll(true);\n};\n\nScrollTrigger.update = function (force) {\n  return ++_scrollers.cache && _updateAll(force === true ? 2 : 0);\n};\n\nScrollTrigger.clearScrollMemory = _clearScrollMemory;\n\nScrollTrigger.maxScroll = function (element, horizontal) {\n  return _maxScroll(element, horizontal ? _horizontal : _vertical);\n};\n\nScrollTrigger.getScrollFunc = function (element, horizontal) {\n  return _getScrollFunc(_getTarget(element), horizontal ? _horizontal : _vertical);\n};\n\nScrollTrigger.getById = function (id) {\n  return _ids[id];\n};\n\nScrollTrigger.getAll = function () {\n  return _triggers.filter(function (t) {\n    return t.vars.id !== \"ScrollSmoother\";\n  });\n}; // it's common for people to ScrollTrigger.getAll(t => t.kill()) on page routes, for example, and we don't want it to ruin smooth scrolling by killing the main ScrollSmoother one.\n\n\nScrollTrigger.isScrolling = function () {\n  return !!_lastScrollTime;\n};\n\nScrollTrigger.snapDirectional = _snapDirectional;\n\nScrollTrigger.addEventListener = function (type, callback) {\n  var a = _listeners[type] || (_listeners[type] = []);\n  ~a.indexOf(callback) || a.push(callback);\n};\n\nScrollTrigger.removeEventListener = function (type, callback) {\n  var a = _listeners[type],\n      i = a && a.indexOf(callback);\n  i >= 0 && a.splice(i, 1);\n};\n\nScrollTrigger.batch = function (targets, vars) {\n  var result = [],\n      varsCopy = {},\n      interval = vars.interval || 0.016,\n      batchMax = vars.batchMax || 1e9,\n      proxyCallback = function proxyCallback(type, callback) {\n    var elements = [],\n        triggers = [],\n        delay = gsap.delayedCall(interval, function () {\n      callback(elements, triggers);\n      elements = [];\n      triggers = [];\n    }).pause();\n    return function (self) {\n      elements.length || delay.restart(true);\n      elements.push(self.trigger);\n      triggers.push(self);\n      batchMax <= elements.length && delay.progress(1);\n    };\n  },\n      p;\n\n  for (p in vars) {\n    varsCopy[p] = p.substr(0, 2) === \"on\" && _isFunction(vars[p]) && p !== \"onRefreshInit\" ? proxyCallback(p, vars[p]) : vars[p];\n  }\n\n  if (_isFunction(batchMax)) {\n    batchMax = batchMax();\n\n    _addListener(ScrollTrigger, \"refresh\", function () {\n      return batchMax = vars.batchMax();\n    });\n  }\n\n  _toArray(targets).forEach(function (target) {\n    var config = {};\n\n    for (p in varsCopy) {\n      config[p] = varsCopy[p];\n    }\n\n    config.trigger = target;\n    result.push(ScrollTrigger.create(config));\n  });\n\n  return result;\n}; // to reduce file size. clamps the scroll and also returns a duration multiplier so that if the scroll gets chopped shorter, the duration gets curtailed as well (otherwise if you're very close to the top of the page, for example, and swipe up really fast, it'll suddenly slow down and take a long time to reach the top).\n\n\nvar _clampScrollAndGetDurationMultiplier = function _clampScrollAndGetDurationMultiplier(scrollFunc, current, end, max) {\n  current > max ? scrollFunc(max) : current < 0 && scrollFunc(0);\n  return end > max ? (max - current) / (end - current) : end < 0 ? current / (current - end) : 1;\n},\n    _allowNativePanning = function _allowNativePanning(target, direction) {\n  if (direction === true) {\n    target.style.removeProperty(\"touch-action\");\n  } else {\n    target.style.touchAction = direction === true ? \"auto\" : direction ? \"pan-\" + direction + (Observer.isTouch ? \" pinch-zoom\" : \"\") : \"none\"; // note: Firefox doesn't support it pinch-zoom properly, at least in addition to a pan-x or pan-y.\n  }\n\n  target === _docEl && _allowNativePanning(_body, direction);\n},\n    _overflow = {\n  auto: 1,\n  scroll: 1\n},\n    _nestedScroll = function _nestedScroll(_ref5) {\n  var event = _ref5.event,\n      target = _ref5.target,\n      axis = _ref5.axis;\n\n  var node = (event.changedTouches ? event.changedTouches[0] : event).target,\n      cache = node._gsap || gsap.core.getCache(node),\n      time = _getTime(),\n      cs;\n\n  if (!cache._isScrollT || time - cache._isScrollT > 2000) {\n    // cache for 2 seconds to improve performance.\n    while (node && node !== _body && (node.scrollHeight <= node.clientHeight && node.scrollWidth <= node.clientWidth || !(_overflow[(cs = _getComputedStyle(node)).overflowY] || _overflow[cs.overflowX]))) {\n      node = node.parentNode;\n    }\n\n    cache._isScroll = node && node !== target && !_isViewport(node) && (_overflow[(cs = _getComputedStyle(node)).overflowY] || _overflow[cs.overflowX]);\n    cache._isScrollT = time;\n  }\n\n  if (cache._isScroll || axis === \"x\") {\n    event.stopPropagation();\n    event._gsapAllow = true;\n  }\n},\n    // capture events on scrollable elements INSIDE the <body> and allow those by calling stopPropagation() when we find a scrollable ancestor\n_inputObserver = function _inputObserver(target, type, inputs, nested) {\n  return Observer.create({\n    target: target,\n    capture: true,\n    debounce: false,\n    lockAxis: true,\n    type: type,\n    onWheel: nested = nested && _nestedScroll,\n    onPress: nested,\n    onDrag: nested,\n    onScroll: nested,\n    onEnable: function onEnable() {\n      return inputs && _addListener(_doc, Observer.eventTypes[0], _captureInputs, false, true);\n    },\n    onDisable: function onDisable() {\n      return _removeListener(_doc, Observer.eventTypes[0], _captureInputs, true);\n    }\n  });\n},\n    _inputExp = /(input|label|select|textarea)/i,\n    _inputIsFocused,\n    _captureInputs = function _captureInputs(e) {\n  var isInput = _inputExp.test(e.target.tagName);\n\n  if (isInput || _inputIsFocused) {\n    e._gsapAllow = true;\n    _inputIsFocused = isInput;\n  }\n},\n    _getScrollNormalizer = function _getScrollNormalizer(vars) {\n  _isObject(vars) || (vars = {});\n  vars.preventDefault = vars.isNormalizer = vars.allowClicks = true;\n  vars.type || (vars.type = \"wheel,touch\");\n  vars.debounce = !!vars.debounce;\n  vars.id = vars.id || \"normalizer\";\n\n  var _vars2 = vars,\n      normalizeScrollX = _vars2.normalizeScrollX,\n      momentum = _vars2.momentum,\n      allowNestedScroll = _vars2.allowNestedScroll,\n      onRelease = _vars2.onRelease,\n      self,\n      maxY,\n      target = _getTarget(vars.target) || _docEl,\n      smoother = gsap.core.globals().ScrollSmoother,\n      smootherInstance = smoother && smoother.get(),\n      content = _fixIOSBug && (vars.content && _getTarget(vars.content) || smootherInstance && vars.content !== false && !smootherInstance.smooth() && smootherInstance.content()),\n      scrollFuncY = _getScrollFunc(target, _vertical),\n      scrollFuncX = _getScrollFunc(target, _horizontal),\n      scale = 1,\n      initialScale = (Observer.isTouch && _win.visualViewport ? _win.visualViewport.scale * _win.visualViewport.width : _win.outerWidth) / _win.innerWidth,\n      wheelRefresh = 0,\n      resolveMomentumDuration = _isFunction(momentum) ? function () {\n    return momentum(self);\n  } : function () {\n    return momentum || 2.8;\n  },\n      lastRefreshID,\n      skipTouchMove,\n      inputObserver = _inputObserver(target, vars.type, true, allowNestedScroll),\n      resumeTouchMove = function resumeTouchMove() {\n    return skipTouchMove = false;\n  },\n      scrollClampX = _passThrough,\n      scrollClampY = _passThrough,\n      updateClamps = function updateClamps() {\n    maxY = _maxScroll(target, _vertical);\n    scrollClampY = _clamp(_fixIOSBug ? 1 : 0, maxY);\n    normalizeScrollX && (scrollClampX = _clamp(0, _maxScroll(target, _horizontal)));\n    lastRefreshID = _refreshID;\n  },\n      removeContentOffset = function removeContentOffset() {\n    content._gsap.y = _round(parseFloat(content._gsap.y) + scrollFuncY.offset) + \"px\";\n    content.style.transform = \"matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, \" + parseFloat(content._gsap.y) + \", 0, 1)\";\n    scrollFuncY.offset = scrollFuncY.cacheID = 0;\n  },\n      ignoreDrag = function ignoreDrag() {\n    if (skipTouchMove) {\n      requestAnimationFrame(resumeTouchMove);\n\n      var offset = _round(self.deltaY / 2),\n          scroll = scrollClampY(scrollFuncY.v - offset);\n\n      if (content && scroll !== scrollFuncY.v + scrollFuncY.offset) {\n        scrollFuncY.offset = scroll - scrollFuncY.v;\n\n        var y = _round((parseFloat(content && content._gsap.y) || 0) - scrollFuncY.offset);\n\n        content.style.transform = \"matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, \" + y + \", 0, 1)\";\n        content._gsap.y = y + \"px\";\n        scrollFuncY.cacheID = _scrollers.cache;\n\n        _updateAll();\n      }\n\n      return true;\n    }\n\n    scrollFuncY.offset && removeContentOffset();\n    skipTouchMove = true;\n  },\n      tween,\n      startScrollX,\n      startScrollY,\n      onStopDelayedCall,\n      onResize = function onResize() {\n    // if the window resizes, like on an iPhone which Apple FORCES the address bar to show/hide even if we event.preventDefault(), it may be scrolling too far now that the address bar is showing, so we must dynamically adjust the momentum tween.\n    updateClamps();\n\n    if (tween.isActive() && tween.vars.scrollY > maxY) {\n      scrollFuncY() > maxY ? tween.progress(1) && scrollFuncY(maxY) : tween.resetTo(\"scrollY\", maxY);\n    }\n  };\n\n  content && gsap.set(content, {\n    y: \"+=0\"\n  }); // to ensure there's a cache (element._gsap)\n\n  vars.ignoreCheck = function (e) {\n    return _fixIOSBug && e.type === \"touchmove\" && ignoreDrag(e) || scale > 1.05 && e.type !== \"touchstart\" || self.isGesturing || e.touches && e.touches.length > 1;\n  };\n\n  vars.onPress = function () {\n    skipTouchMove = false;\n    var prevScale = scale;\n    scale = _round((_win.visualViewport && _win.visualViewport.scale || 1) / initialScale);\n    tween.pause();\n    prevScale !== scale && _allowNativePanning(target, scale > 1.01 ? true : normalizeScrollX ? false : \"x\");\n    startScrollX = scrollFuncX();\n    startScrollY = scrollFuncY();\n    updateClamps();\n    lastRefreshID = _refreshID;\n  };\n\n  vars.onRelease = vars.onGestureStart = function (self, wasDragging) {\n    scrollFuncY.offset && removeContentOffset();\n\n    if (!wasDragging) {\n      onStopDelayedCall.restart(true);\n    } else {\n      _scrollers.cache++; // make sure we're pulling the non-cached value\n      // alternate algorithm: durX = Math.min(6, Math.abs(self.velocityX / 800)),\tdur = Math.max(durX, Math.min(6, Math.abs(self.velocityY / 800))); dur = dur * (0.4 + (1 - _power4In(dur / 6)) * 0.6)) * (momentumSpeed || 1)\n\n      var dur = resolveMomentumDuration(),\n          currentScroll,\n          endScroll;\n\n      if (normalizeScrollX) {\n        currentScroll = scrollFuncX();\n        endScroll = currentScroll + dur * 0.05 * -self.velocityX / 0.227; // the constant .227 is from power4(0.05). velocity is inverted because scrolling goes in the opposite direction.\n\n        dur *= _clampScrollAndGetDurationMultiplier(scrollFuncX, currentScroll, endScroll, _maxScroll(target, _horizontal));\n        tween.vars.scrollX = scrollClampX(endScroll);\n      }\n\n      currentScroll = scrollFuncY();\n      endScroll = currentScroll + dur * 0.05 * -self.velocityY / 0.227; // the constant .227 is from power4(0.05)\n\n      dur *= _clampScrollAndGetDurationMultiplier(scrollFuncY, currentScroll, endScroll, _maxScroll(target, _vertical));\n      tween.vars.scrollY = scrollClampY(endScroll);\n      tween.invalidate().duration(dur).play(0.01);\n\n      if (_fixIOSBug && tween.vars.scrollY >= maxY || currentScroll >= maxY - 1) {\n        // iOS bug: it'll show the address bar but NOT fire the window \"resize\" event until the animation is done but we must protect against overshoot so we leverage an onUpdate to do so.\n        gsap.to({}, {\n          onUpdate: onResize,\n          duration: dur\n        });\n      }\n    }\n\n    onRelease && onRelease(self);\n  };\n\n  vars.onWheel = function () {\n    tween._ts && tween.pause();\n\n    if (_getTime() - wheelRefresh > 1000) {\n      // after 1 second, refresh the clamps otherwise that'll only happen when ScrollTrigger.refresh() is called or for touch-scrolling.\n      lastRefreshID = 0;\n      wheelRefresh = _getTime();\n    }\n  };\n\n  vars.onChange = function (self, dx, dy, xArray, yArray) {\n    _refreshID !== lastRefreshID && updateClamps();\n    dx && normalizeScrollX && scrollFuncX(scrollClampX(xArray[2] === dx ? startScrollX + (self.startX - self.x) : scrollFuncX() + dx - xArray[1])); // for more precision, we track pointer/touch movement from the start, otherwise it'll drift.\n\n    if (dy) {\n      scrollFuncY.offset && removeContentOffset();\n      var isTouch = yArray[2] === dy,\n          y = isTouch ? startScrollY + self.startY - self.y : scrollFuncY() + dy - yArray[1],\n          yClamped = scrollClampY(y);\n      isTouch && y !== yClamped && (startScrollY += yClamped - y);\n      scrollFuncY(yClamped);\n    }\n\n    (dy || dx) && _updateAll();\n  };\n\n  vars.onEnable = function () {\n    _allowNativePanning(target, normalizeScrollX ? false : \"x\");\n\n    ScrollTrigger.addEventListener(\"refresh\", onResize);\n\n    _addListener(_win, \"resize\", onResize);\n\n    if (scrollFuncY.smooth) {\n      scrollFuncY.target.style.scrollBehavior = \"auto\";\n      scrollFuncY.smooth = scrollFuncX.smooth = false;\n    }\n\n    inputObserver.enable();\n  };\n\n  vars.onDisable = function () {\n    _allowNativePanning(target, true);\n\n    _removeListener(_win, \"resize\", onResize);\n\n    ScrollTrigger.removeEventListener(\"refresh\", onResize);\n    inputObserver.kill();\n  };\n\n  vars.lockAxis = vars.lockAxis !== false;\n  self = new Observer(vars);\n  self.iOS = _fixIOSBug; // used in the Observer getCachedScroll() function to work around an iOS bug that wreaks havoc with TouchEvent.clientY if we allow scroll to go all the way back to 0.\n\n  _fixIOSBug && !scrollFuncY() && scrollFuncY(1); // iOS bug causes event.clientY values to freak out (wildly inaccurate) if the scroll position is exactly 0.\n\n  _fixIOSBug && gsap.ticker.add(_passThrough); // prevent the ticker from sleeping\n\n  onStopDelayedCall = self._dc;\n  tween = gsap.to(self, {\n    ease: \"power4\",\n    paused: true,\n    inherit: false,\n    scrollX: normalizeScrollX ? \"+=0.1\" : \"+=0\",\n    scrollY: \"+=0.1\",\n    modifiers: {\n      scrollY: _interruptionTracker(scrollFuncY, scrollFuncY(), function () {\n        return tween.pause();\n      })\n    },\n    onUpdate: _updateAll,\n    onComplete: onStopDelayedCall.vars.onComplete\n  }); // we need the modifier to sense if the scroll position is altered outside of the momentum tween (like with a scrollTo tween) so we can pause() it to prevent conflicts.\n\n  return self;\n};\n\nScrollTrigger.sort = function (func) {\n  if (_isFunction(func)) {\n    return _triggers.sort(func);\n  }\n\n  var scroll = _win.pageYOffset || 0;\n  ScrollTrigger.getAll().forEach(function (t) {\n    return t._sortY = t.trigger ? scroll + t.trigger.getBoundingClientRect().top : t.start + _win.innerHeight;\n  });\n  return _triggers.sort(func || function (a, b) {\n    return (a.vars.refreshPriority || 0) * -1e6 + (a.vars.containerAnimation ? 1e6 : a._sortY) - ((b.vars.containerAnimation ? 1e6 : b._sortY) + (b.vars.refreshPriority || 0) * -1e6);\n  }); // anything with a containerAnimation should refresh last.\n};\n\nScrollTrigger.observe = function (vars) {\n  return new Observer(vars);\n};\n\nScrollTrigger.normalizeScroll = function (vars) {\n  if (typeof vars === \"undefined\") {\n    return _normalizer;\n  }\n\n  if (vars === true && _normalizer) {\n    return _normalizer.enable();\n  }\n\n  if (vars === false) {\n    _normalizer && _normalizer.kill();\n    _normalizer = vars;\n    return;\n  }\n\n  var normalizer = vars instanceof Observer ? vars : _getScrollNormalizer(vars);\n  _normalizer && _normalizer.target === normalizer.target && _normalizer.kill();\n  _isViewport(normalizer.target) && (_normalizer = normalizer);\n  return normalizer;\n};\n\nScrollTrigger.core = {\n  // smaller file size way to leverage in ScrollSmoother and Observer\n  _getVelocityProp: _getVelocityProp,\n  _inputObserver: _inputObserver,\n  _scrollers: _scrollers,\n  _proxies: _proxies,\n  bridge: {\n    // when normalizeScroll sets the scroll position (ss = setScroll)\n    ss: function ss() {\n      _lastScrollTime || _dispatch(\"scrollStart\");\n      _lastScrollTime = _getTime();\n    },\n    // a way to get the _refreshing value in Observer\n    ref: function ref() {\n      return _refreshing;\n    }\n  }\n};\n_getGSAP() && gsap.registerPlugin(ScrollTrigger);\nexport { ScrollTrigger as default };","'use strict';\nvar $ = require('../internals/export');\nvar $findIndex = require('../internals/array-iteration').findIndex;\nvar addToUnscopables = require('../internals/add-to-unscopables');\n\nvar FIND_INDEX = 'findIndex';\nvar SKIPS_HOLES = true;\n\n// Shouldn't skip holes\n// eslint-disable-next-line es/no-array-prototype-findindex -- testing\nif (FIND_INDEX in []) Array(1)[FIND_INDEX](function () { SKIPS_HOLES = false; });\n\n// `Array.prototype.findIndex` method\n// https://tc39.es/ecma262/#sec-array.prototype.findindex\n$({ target: 'Array', proto: true, forced: SKIPS_HOLES }, {\n  findIndex: function findIndex(callbackfn /* , that = undefined */) {\n    return $findIndex(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n  }\n});\n\n// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables(FIND_INDEX);\n","'use strict';\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n\nvar $Object = Object;\n\n// `ToObject` abstract operation\n// https://tc39.es/ecma262/#sec-toobject\nmodule.exports = function (argument) {\n  return $Object(requireObjectCoercible(argument));\n};\n","\"use strict\";\n\nexports.__esModule = true;\nexports[\"default\"] = unesc;\n\n// Many thanks for this post which made this migration much easier.\n// https://mathiasbynens.be/notes/css-escapes\n\n/**\n * \n * @param {string} str \n * @returns {[string, number]|undefined}\n */\nfunction gobbleHex(str) {\n  var lower = str.toLowerCase();\n  var hex = '';\n  var spaceTerminated = false;\n\n  for (var i = 0; i < 6 && lower[i] !== undefined; i++) {\n    var code = lower.charCodeAt(i); // check to see if we are dealing with a valid hex char [a-f|0-9]\n\n    var valid = code >= 97 && code <= 102 || code >= 48 && code <= 57; // https://drafts.csswg.org/css-syntax/#consume-escaped-code-point\n\n    spaceTerminated = code === 32;\n\n    if (!valid) {\n      break;\n    }\n\n    hex += lower[i];\n  }\n\n  if (hex.length === 0) {\n    return undefined;\n  }\n\n  var codePoint = parseInt(hex, 16);\n  var isSurrogate = codePoint >= 0xD800 && codePoint <= 0xDFFF; // Add special case for\n  // \"If this number is zero, or is for a surrogate, or is greater than the maximum allowed code point\"\n  // https://drafts.csswg.org/css-syntax/#maximum-allowed-code-point\n\n  if (isSurrogate || codePoint === 0x0000 || codePoint > 0x10FFFF) {\n    return [\"\\uFFFD\", hex.length + (spaceTerminated ? 1 : 0)];\n  }\n\n  return [String.fromCodePoint(codePoint), hex.length + (spaceTerminated ? 1 : 0)];\n}\n\nvar CONTAINS_ESCAPE = /\\\\/;\n\nfunction unesc(str) {\n  var needToProcess = CONTAINS_ESCAPE.test(str);\n\n  if (!needToProcess) {\n    return str;\n  }\n\n  var ret = \"\";\n\n  for (var i = 0; i < str.length; i++) {\n    if (str[i] === \"\\\\\") {\n      var gobbled = gobbleHex(str.slice(i + 1, i + 7));\n\n      if (gobbled !== undefined) {\n        ret += gobbled[0];\n        i += gobbled[1];\n        continue;\n      } // Retain a pair of \\\\ if double escaped `\\\\\\\\`\n      // https://github.com/postcss/postcss-selector-parser/commit/268c9a7656fb53f543dc620aa5b73a30ec3ff20e\n\n\n      if (str[i + 1] === \"\\\\\") {\n        ret += \"\\\\\";\n        i++;\n        continue;\n      } // if \\\\ is at the end of the string retain it\n      // https://github.com/postcss/postcss-selector-parser/commit/01a6b346e3612ce1ab20219acc26abdc259ccefb\n\n\n      if (str.length === i + 1) {\n        ret += str[i];\n      }\n\n      continue;\n    }\n\n    ret += str[i];\n  }\n\n  return ret;\n}\n\nmodule.exports = exports.default;","/**\n * lodash (Custom Build) <https://lodash.com/>\n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright jQuery Foundation and other contributors <https://jquery.org/>\n * Released under MIT license <https://lodash.com/license>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** `Object#toString` result references. */\nvar objectTag = '[object Object]';\n\n/**\n * Checks if `value` is a host object in IE < 9.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a host object, else `false`.\n */\nfunction isHostObject(value) {\n  // Many host objects are `Object` objects that can coerce to strings\n  // despite having improperly defined `toString` methods.\n  var result = false;\n  if (value != null && typeof value.toString != 'function') {\n    try {\n      result = !!(value + '');\n    } catch (e) {}\n  }\n  return result;\n}\n\n/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n  return function(arg) {\n    return func(transform(arg));\n  };\n}\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n    objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to infer the `Object` constructor. */\nvar objectCtorString = funcToString.call(Object);\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar getPrototype = overArg(Object.getPrototypeOf, Object);\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n  return !!value && typeof value == 'object';\n}\n\n/**\n * Checks if `value` is a plain object, that is, an object created by the\n * `Object` constructor or one with a `[[Prototype]]` of `null`.\n *\n * @static\n * @memberOf _\n * @since 0.8.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n * @example\n *\n * function Foo() {\n *   this.a = 1;\n * }\n *\n * _.isPlainObject(new Foo);\n * // => false\n *\n * _.isPlainObject([1, 2, 3]);\n * // => false\n *\n * _.isPlainObject({ 'x': 0, 'y': 0 });\n * // => true\n *\n * _.isPlainObject(Object.create(null));\n * // => true\n */\nfunction isPlainObject(value) {\n  if (!isObjectLike(value) ||\n      objectToString.call(value) != objectTag || isHostObject(value)) {\n    return false;\n  }\n  var proto = getPrototype(value);\n  if (proto === null) {\n    return true;\n  }\n  var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;\n  return (typeof Ctor == 'function' &&\n    Ctor instanceof Ctor && funcToString.call(Ctor) == objectCtorString);\n}\n\nmodule.exports = isPlainObject;\n","'use strict';\nmodule.exports = function (exec) {\n  try {\n    return !!exec();\n  } catch (error) {\n    return true;\n  }\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar assign = require('../internals/object-assign');\n\n// `Object.assign` method\n// https://tc39.es/ecma262/#sec-object.assign\n// eslint-disable-next-line es/no-object-assign -- required for testing\n$({ target: 'Object', stat: true, arity: 2, forced: Object.assign !== assign }, {\n  assign: assign\n});\n","'use strict';\nvar globalThis = require('../internals/global-this');\n\nmodule.exports = globalThis;\n","'use strict';\nvar bind = require('../internals/function-bind-context');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar IndexedObject = require('../internals/indexed-object');\nvar toObject = require('../internals/to-object');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\nvar arraySpeciesCreate = require('../internals/array-species-create');\n\nvar push = uncurryThis([].push);\n\n// `Array.prototype.{ forEach, map, filter, some, every, find, findIndex, filterReject }` methods implementation\nvar createMethod = function (TYPE) {\n  var IS_MAP = TYPE === 1;\n  var IS_FILTER = TYPE === 2;\n  var IS_SOME = TYPE === 3;\n  var IS_EVERY = TYPE === 4;\n  var IS_FIND_INDEX = TYPE === 6;\n  var IS_FILTER_REJECT = TYPE === 7;\n  var NO_HOLES = TYPE === 5 || IS_FIND_INDEX;\n  return function ($this, callbackfn, that, specificCreate) {\n    var O = toObject($this);\n    var self = IndexedObject(O);\n    var length = lengthOfArrayLike(self);\n    var boundFunction = bind(callbackfn, that);\n    var index = 0;\n    var create = specificCreate || arraySpeciesCreate;\n    var target = IS_MAP ? create($this, length) : IS_FILTER || IS_FILTER_REJECT ? create($this, 0) : undefined;\n    var value, result;\n    for (;length > index; index++) if (NO_HOLES || index in self) {\n      value = self[index];\n      result = boundFunction(value, index, O);\n      if (TYPE) {\n        if (IS_MAP) target[index] = result; // map\n        else if (result) switch (TYPE) {\n          case 3: return true;              // some\n          case 5: return value;             // find\n          case 6: return index;             // findIndex\n          case 2: push(target, value);      // filter\n        } else switch (TYPE) {\n          case 4: return false;             // every\n          case 7: push(target, value);      // filterReject\n        }\n      }\n    }\n    return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : target;\n  };\n};\n\nmodule.exports = {\n  // `Array.prototype.forEach` method\n  // https://tc39.es/ecma262/#sec-array.prototype.foreach\n  forEach: createMethod(0),\n  // `Array.prototype.map` method\n  // https://tc39.es/ecma262/#sec-array.prototype.map\n  map: createMethod(1),\n  // `Array.prototype.filter` method\n  // https://tc39.es/ecma262/#sec-array.prototype.filter\n  filter: createMethod(2),\n  // `Array.prototype.some` method\n  // https://tc39.es/ecma262/#sec-array.prototype.some\n  some: createMethod(3),\n  // `Array.prototype.every` method\n  // https://tc39.es/ecma262/#sec-array.prototype.every\n  every: createMethod(4),\n  // `Array.prototype.find` method\n  // https://tc39.es/ecma262/#sec-array.prototype.find\n  find: createMethod(5),\n  // `Array.prototype.findIndex` method\n  // https://tc39.es/ecma262/#sec-array.prototype.findIndex\n  findIndex: createMethod(6),\n  // `Array.prototype.filterReject` method\n  // https://github.com/tc39/proposal-array-filtering\n  filterReject: createMethod(7)\n};\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar apply = require('../internals/function-apply');\nvar bind = require('../internals/function-bind-context');\nvar isCallable = require('../internals/is-callable');\nvar hasOwn = require('../internals/has-own-property');\nvar fails = require('../internals/fails');\nvar html = require('../internals/html');\nvar arraySlice = require('../internals/array-slice');\nvar createElement = require('../internals/document-create-element');\nvar validateArgumentsLength = require('../internals/validate-arguments-length');\nvar IS_IOS = require('../internals/environment-is-ios');\nvar IS_NODE = require('../internals/environment-is-node');\n\nvar set = globalThis.setImmediate;\nvar clear = globalThis.clearImmediate;\nvar process = globalThis.process;\nvar Dispatch = globalThis.Dispatch;\nvar Function = globalThis.Function;\nvar MessageChannel = globalThis.MessageChannel;\nvar String = globalThis.String;\nvar counter = 0;\nvar queue = {};\nvar ONREADYSTATECHANGE = 'onreadystatechange';\nvar $location, defer, channel, port;\n\nfails(function () {\n  // Deno throws a ReferenceError on `location` access without `--location` flag\n  $location = globalThis.location;\n});\n\nvar run = function (id) {\n  if (hasOwn(queue, id)) {\n    var fn = queue[id];\n    delete queue[id];\n    fn();\n  }\n};\n\nvar runner = function (id) {\n  return function () {\n    run(id);\n  };\n};\n\nvar eventListener = function (event) {\n  run(event.data);\n};\n\nvar globalPostMessageDefer = function (id) {\n  // old engines have not location.origin\n  globalThis.postMessage(String(id), $location.protocol + '//' + $location.host);\n};\n\n// Node.js 0.9+ & IE10+ has setImmediate, otherwise:\nif (!set || !clear) {\n  set = function setImmediate(handler) {\n    validateArgumentsLength(arguments.length, 1);\n    var fn = isCallable(handler) ? handler : Function(handler);\n    var args = arraySlice(arguments, 1);\n    queue[++counter] = function () {\n      apply(fn, undefined, args);\n    };\n    defer(counter);\n    return counter;\n  };\n  clear = function clearImmediate(id) {\n    delete queue[id];\n  };\n  // Node.js 0.8-\n  if (IS_NODE) {\n    defer = function (id) {\n      process.nextTick(runner(id));\n    };\n  // Sphere (JS game engine) Dispatch API\n  } else if (Dispatch && Dispatch.now) {\n    defer = function (id) {\n      Dispatch.now(runner(id));\n    };\n  // Browsers with MessageChannel, includes WebWorkers\n  // except iOS - https://github.com/zloirock/core-js/issues/624\n  } else if (MessageChannel && !IS_IOS) {\n    channel = new MessageChannel();\n    port = channel.port2;\n    channel.port1.onmessage = eventListener;\n    defer = bind(port.postMessage, port);\n  // Browsers with postMessage, skip WebWorkers\n  // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'\n  } else if (\n    globalThis.addEventListener &&\n    isCallable(globalThis.postMessage) &&\n    !globalThis.importScripts &&\n    $location && $location.protocol !== 'file:' &&\n    !fails(globalPostMessageDefer)\n  ) {\n    defer = globalPostMessageDefer;\n    globalThis.addEventListener('message', eventListener, false);\n  // IE8-\n  } else if (ONREADYSTATECHANGE in createElement('script')) {\n    defer = function (id) {\n      html.appendChild(createElement('script'))[ONREADYSTATECHANGE] = function () {\n        html.removeChild(this);\n        run(id);\n      };\n    };\n  // Rest old browsers\n  } else {\n    defer = function (id) {\n      setTimeout(runner(id), 0);\n    };\n  }\n}\n\nmodule.exports = {\n  set: set,\n  clear: clear\n};\n","'use strict';\n// TODO: Remove from `core-js@4` since it's moved to entry points\nrequire('../modules/es.regexp.exec');\nvar call = require('../internals/function-call');\nvar defineBuiltIn = require('../internals/define-built-in');\nvar regexpExec = require('../internals/regexp-exec');\nvar fails = require('../internals/fails');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\n\nvar SPECIES = wellKnownSymbol('species');\nvar RegExpPrototype = RegExp.prototype;\n\nmodule.exports = function (KEY, exec, FORCED, SHAM) {\n  var SYMBOL = wellKnownSymbol(KEY);\n\n  var DELEGATES_TO_SYMBOL = !fails(function () {\n    // String methods call symbol-named RegExp methods\n    var O = {};\n    // eslint-disable-next-line unicorn/no-immediate-mutation -- ES3 syntax limitation\n    O[SYMBOL] = function () { return 7; };\n    return ''[KEY](O) !== 7;\n  });\n\n  var DELEGATES_TO_EXEC = DELEGATES_TO_SYMBOL && !fails(function () {\n    // Symbol-named RegExp methods call .exec\n    var execCalled = false;\n    var re = /a/;\n\n    if (KEY === 'split') {\n      // We can't use real regex here since it causes deoptimization\n      // and serious performance degradation in V8\n      // https://github.com/zloirock/core-js/issues/306\n      // RegExp[@@split] doesn't call the regex's exec method, but first creates\n      // a new one. We need to return the patched regex when creating the new one.\n      var constructor = {};\n      // eslint-disable-next-line unicorn/no-immediate-mutation -- ES3 syntax limitation\n      constructor[SPECIES] = function () { return re; };\n      re = { constructor: constructor, flags: '' };\n      // eslint-disable-next-line unicorn/no-immediate-mutation -- ES3 syntax limitation\n      re[SYMBOL] = /./[SYMBOL];\n    }\n\n    re.exec = function () {\n      execCalled = true;\n      return null;\n    };\n\n    re[SYMBOL]('');\n    return !execCalled;\n  });\n\n  if (\n    !DELEGATES_TO_SYMBOL ||\n    !DELEGATES_TO_EXEC ||\n    FORCED\n  ) {\n    var nativeRegExpMethod = /./[SYMBOL];\n    var methods = exec(SYMBOL, ''[KEY], function (nativeMethod, regexp, str, arg2, forceStringMethod) {\n      var $exec = regexp.exec;\n      if ($exec === regexpExec || $exec === RegExpPrototype.exec) {\n        if (DELEGATES_TO_SYMBOL && !forceStringMethod) {\n          // The native String method already delegates to @@method (this\n          // polyfilled function), leasing to infinite recursion.\n          // We avoid it by directly calling the native @@method method.\n          return { done: true, value: call(nativeRegExpMethod, regexp, str, arg2) };\n        }\n        return { done: true, value: call(nativeMethod, str, regexp, arg2) };\n      }\n      return { done: false };\n    });\n\n    defineBuiltIn(String.prototype, KEY, methods[0]);\n    defineBuiltIn(RegExpPrototype, SYMBOL, methods[1]);\n  }\n\n  if (SHAM) createNonEnumerableProperty(RegExpPrototype[SYMBOL], 'sham', true);\n};\n","\"use strict\";\n\nexports.__esModule = true;\nexports[\"default\"] = void 0;\n\nvar _container = _interopRequireDefault(require(\"./container\"));\n\nvar _types = require(\"./types\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nfunction _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nvar Selector = /*#__PURE__*/function (_Container) {\n  _inheritsLoose(Selector, _Container);\n\n  function Selector(opts) {\n    var _this;\n\n    _this = _Container.call(this, opts) || this;\n    _this.type = _types.SELECTOR;\n    return _this;\n  }\n\n  return Selector;\n}(_container[\"default\"]);\n\nexports[\"default\"] = Selector;\nmodule.exports = exports.default;","export default function getWindow(node) {\n  if (node == null) {\n    return window;\n  }\n\n  if (node.toString() !== '[object Window]') {\n    var ownerDocument = node.ownerDocument;\n    return ownerDocument ? ownerDocument.defaultView || window : window;\n  }\n\n  return node;\n}","import getWindow from \"./getWindow.js\";\n\nfunction isElement(node) {\n  var OwnElement = getWindow(node).Element;\n  return node instanceof OwnElement || node instanceof Element;\n}\n\nfunction isHTMLElement(node) {\n  var OwnElement = getWindow(node).HTMLElement;\n  return node instanceof OwnElement || node instanceof HTMLElement;\n}\n\nfunction isShadowRoot(node) {\n  // IE 11 has no ShadowRoot\n  if (typeof ShadowRoot === 'undefined') {\n    return false;\n  }\n\n  var OwnElement = getWindow(node).ShadowRoot;\n  return node instanceof OwnElement || node instanceof ShadowRoot;\n}\n\nexport { isElement, isHTMLElement, isShadowRoot };","export var max = Math.max;\nexport var min = Math.min;\nexport var round = Math.round;","export default function getUAString() {\n  var uaData = navigator.userAgentData;\n\n  if (uaData != null && uaData.brands && Array.isArray(uaData.brands)) {\n    return uaData.brands.map(function (item) {\n      return item.brand + \"/\" + item.version;\n    }).join(' ');\n  }\n\n  return navigator.userAgent;\n}","import getUAString from \"../utils/userAgent.js\";\nexport default function isLayoutViewport() {\n  return !/^((?!chrome|android).)*safari/i.test(getUAString());\n}","import { isElement, isHTMLElement } from \"./instanceOf.js\";\nimport { round } from \"../utils/math.js\";\nimport getWindow from \"./getWindow.js\";\nimport isLayoutViewport from \"./isLayoutViewport.js\";\nexport default function getBoundingClientRect(element, includeScale, isFixedStrategy) {\n  if (includeScale === void 0) {\n    includeScale = false;\n  }\n\n  if (isFixedStrategy === void 0) {\n    isFixedStrategy = false;\n  }\n\n  var clientRect = element.getBoundingClientRect();\n  var scaleX = 1;\n  var scaleY = 1;\n\n  if (includeScale && isHTMLElement(element)) {\n    scaleX = element.offsetWidth > 0 ? round(clientRect.width) / element.offsetWidth || 1 : 1;\n    scaleY = element.offsetHeight > 0 ? round(clientRect.height) / element.offsetHeight || 1 : 1;\n  }\n\n  var _ref = isElement(element) ? getWindow(element) : window,\n      visualViewport = _ref.visualViewport;\n\n  var addVisualOffsets = !isLayoutViewport() && isFixedStrategy;\n  var x = (clientRect.left + (addVisualOffsets && visualViewport ? visualViewport.offsetLeft : 0)) / scaleX;\n  var y = (clientRect.top + (addVisualOffsets && visualViewport ? visualViewport.offsetTop : 0)) / scaleY;\n  var width = clientRect.width / scaleX;\n  var height = clientRect.height / scaleY;\n  return {\n    width: width,\n    height: height,\n    top: y,\n    right: x + width,\n    bottom: y + height,\n    left: x,\n    x: x,\n    y: y\n  };\n}","import getWindow from \"./getWindow.js\";\nexport default function getWindowScroll(node) {\n  var win = getWindow(node);\n  var scrollLeft = win.pageXOffset;\n  var scrollTop = win.pageYOffset;\n  return {\n    scrollLeft: scrollLeft,\n    scrollTop: scrollTop\n  };\n}","export default function getNodeName(element) {\n  return element ? (element.nodeName || '').toLowerCase() : null;\n}","import { isElement } from \"./instanceOf.js\";\nexport default function getDocumentElement(element) {\n  // $FlowFixMe[incompatible-return]: assume body is always available\n  return ((isElement(element) ? element.ownerDocument : // $FlowFixMe[prop-missing]\n  element.document) || window.document).documentElement;\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nexport default function getWindowScrollBarX(element) {\n  // If <html> has a CSS width greater than the viewport, then this will be\n  // incorrect for RTL.\n  // Popper 1 is broken in this case and never had a bug report so let's assume\n  // it's not an issue. I don't think anyone ever specifies width on <html>\n  // anyway.\n  // Browsers where the left scrollbar doesn't cause an issue report `0` for\n  // this (e.g. Edge 2019, IE11, Safari)\n  return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft;\n}","import getWindow from \"./getWindow.js\";\nexport default function getComputedStyle(element) {\n  return getWindow(element).getComputedStyle(element);\n}","import getComputedStyle from \"./getComputedStyle.js\";\nexport default function isScrollParent(element) {\n  // Firefox wants us to check `-x` and `-y` variations as well\n  var _getComputedStyle = getComputedStyle(element),\n      overflow = _getComputedStyle.overflow,\n      overflowX = _getComputedStyle.overflowX,\n      overflowY = _getComputedStyle.overflowY;\n\n  return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX);\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getNodeScroll from \"./getNodeScroll.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport { round } from \"../utils/math.js\";\n\nfunction isElementScaled(element) {\n  var rect = element.getBoundingClientRect();\n  var scaleX = round(rect.width) / element.offsetWidth || 1;\n  var scaleY = round(rect.height) / element.offsetHeight || 1;\n  return scaleX !== 1 || scaleY !== 1;\n} // Returns the composite rect of an element relative to its offsetParent.\n// Composite means it takes into account transforms as well as layout.\n\n\nexport default function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) {\n  if (isFixed === void 0) {\n    isFixed = false;\n  }\n\n  var isOffsetParentAnElement = isHTMLElement(offsetParent);\n  var offsetParentIsScaled = isHTMLElement(offsetParent) && isElementScaled(offsetParent);\n  var documentElement = getDocumentElement(offsetParent);\n  var rect = getBoundingClientRect(elementOrVirtualElement, offsetParentIsScaled, isFixed);\n  var scroll = {\n    scrollLeft: 0,\n    scrollTop: 0\n  };\n  var offsets = {\n    x: 0,\n    y: 0\n  };\n\n  if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n    if (getNodeName(offsetParent) !== 'body' || // https://github.com/popperjs/popper-core/issues/1078\n    isScrollParent(documentElement)) {\n      scroll = getNodeScroll(offsetParent);\n    }\n\n    if (isHTMLElement(offsetParent)) {\n      offsets = getBoundingClientRect(offsetParent, true);\n      offsets.x += offsetParent.clientLeft;\n      offsets.y += offsetParent.clientTop;\n    } else if (documentElement) {\n      offsets.x = getWindowScrollBarX(documentElement);\n    }\n  }\n\n  return {\n    x: rect.left + scroll.scrollLeft - offsets.x,\n    y: rect.top + scroll.scrollTop - offsets.y,\n    width: rect.width,\n    height: rect.height\n  };\n}","import getWindowScroll from \"./getWindowScroll.js\";\nimport getWindow from \"./getWindow.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getHTMLElementScroll from \"./getHTMLElementScroll.js\";\nexport default function getNodeScroll(node) {\n  if (node === getWindow(node) || !isHTMLElement(node)) {\n    return getWindowScroll(node);\n  } else {\n    return getHTMLElementScroll(node);\n  }\n}","export default function getHTMLElementScroll(element) {\n  return {\n    scrollLeft: element.scrollLeft,\n    scrollTop: element.scrollTop\n  };\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\"; // Returns the layout rect of an element relative to its offsetParent. Layout\n// means it doesn't take into account transforms.\n\nexport default function getLayoutRect(element) {\n  var clientRect = getBoundingClientRect(element); // Use the clientRect sizes if it's not been transformed.\n  // Fixes https://github.com/popperjs/popper-core/issues/1223\n\n  var width = element.offsetWidth;\n  var height = element.offsetHeight;\n\n  if (Math.abs(clientRect.width - width) <= 1) {\n    width = clientRect.width;\n  }\n\n  if (Math.abs(clientRect.height - height) <= 1) {\n    height = clientRect.height;\n  }\n\n  return {\n    x: element.offsetLeft,\n    y: element.offsetTop,\n    width: width,\n    height: height\n  };\n}","import getNodeName from \"./getNodeName.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport { isShadowRoot } from \"./instanceOf.js\";\nexport default function getParentNode(element) {\n  if (getNodeName(element) === 'html') {\n    return element;\n  }\n\n  return (// this is a quicker (but less type safe) way to save quite some bytes from the bundle\n    // $FlowFixMe[incompatible-return]\n    // $FlowFixMe[prop-missing]\n    element.assignedSlot || // step into the shadow DOM of the parent of a slotted node\n    element.parentNode || ( // DOM Element detected\n    isShadowRoot(element) ? element.host : null) || // ShadowRoot detected\n    // $FlowFixMe[incompatible-call]: HTMLElement is a Node\n    getDocumentElement(element) // fallback\n\n  );\n}","import getParentNode from \"./getParentNode.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nexport default function getScrollParent(node) {\n  if (['html', 'body', '#document'].indexOf(getNodeName(node)) >= 0) {\n    // $FlowFixMe[incompatible-return]: assume body is always available\n    return node.ownerDocument.body;\n  }\n\n  if (isHTMLElement(node) && isScrollParent(node)) {\n    return node;\n  }\n\n  return getScrollParent(getParentNode(node));\n}","import getScrollParent from \"./getScrollParent.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getWindow from \"./getWindow.js\";\nimport isScrollParent from \"./isScrollParent.js\";\n/*\ngiven a DOM element, return the list of all scroll parents, up the list of ancesors\nuntil we get to the top window object. This list is what we attach scroll listeners\nto, because if any of these parent elements scroll, we'll need to re-calculate the\nreference element's position.\n*/\n\nexport default function listScrollParents(element, list) {\n  var _element$ownerDocumen;\n\n  if (list === void 0) {\n    list = [];\n  }\n\n  var scrollParent = getScrollParent(element);\n  var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body);\n  var win = getWindow(scrollParent);\n  var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent;\n  var updatedList = list.concat(target);\n  return isBody ? updatedList : // $FlowFixMe[incompatible-call]: isBody tells us target will be an HTMLElement here\n  updatedList.concat(listScrollParents(getParentNode(target)));\n}","import getNodeName from \"./getNodeName.js\";\nexport default function isTableElement(element) {\n  return ['table', 'td', 'th'].indexOf(getNodeName(element)) >= 0;\n}","import getWindow from \"./getWindow.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isHTMLElement, isShadowRoot } from \"./instanceOf.js\";\nimport isTableElement from \"./isTableElement.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getUAString from \"../utils/userAgent.js\";\n\nfunction getTrueOffsetParent(element) {\n  if (!isHTMLElement(element) || // https://github.com/popperjs/popper-core/issues/837\n  getComputedStyle(element).position === 'fixed') {\n    return null;\n  }\n\n  return element.offsetParent;\n} // `.offsetParent` reports `null` for fixed elements, while absolute elements\n// return the containing block\n\n\nfunction getContainingBlock(element) {\n  var isFirefox = /firefox/i.test(getUAString());\n  var isIE = /Trident/i.test(getUAString());\n\n  if (isIE && isHTMLElement(element)) {\n    // In IE 9, 10 and 11 fixed elements containing block is always established by the viewport\n    var elementCss = getComputedStyle(element);\n\n    if (elementCss.position === 'fixed') {\n      return null;\n    }\n  }\n\n  var currentNode = getParentNode(element);\n\n  if (isShadowRoot(currentNode)) {\n    currentNode = currentNode.host;\n  }\n\n  while (isHTMLElement(currentNode) && ['html', 'body'].indexOf(getNodeName(currentNode)) < 0) {\n    var css = getComputedStyle(currentNode); // This is non-exhaustive but covers the most common CSS properties that\n    // create a containing block.\n    // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n\n    if (css.transform !== 'none' || css.perspective !== 'none' || css.contain === 'paint' || ['transform', 'perspective'].indexOf(css.willChange) !== -1 || isFirefox && css.willChange === 'filter' || isFirefox && css.filter && css.filter !== 'none') {\n      return currentNode;\n    } else {\n      currentNode = currentNode.parentNode;\n    }\n  }\n\n  return null;\n} // Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\n\n\nexport default function getOffsetParent(element) {\n  var window = getWindow(element);\n  var offsetParent = getTrueOffsetParent(element);\n\n  while (offsetParent && isTableElement(offsetParent) && getComputedStyle(offsetParent).position === 'static') {\n    offsetParent = getTrueOffsetParent(offsetParent);\n  }\n\n  if (offsetParent && (getNodeName(offsetParent) === 'html' || getNodeName(offsetParent) === 'body' && getComputedStyle(offsetParent).position === 'static')) {\n    return window;\n  }\n\n  return offsetParent || getContainingBlock(element) || window;\n}","export var top = 'top';\nexport var bottom = 'bottom';\nexport var right = 'right';\nexport var left = 'left';\nexport var auto = 'auto';\nexport var basePlacements = [top, bottom, right, left];\nexport var start = 'start';\nexport var end = 'end';\nexport var clippingParents = 'clippingParents';\nexport var viewport = 'viewport';\nexport var popper = 'popper';\nexport var reference = 'reference';\nexport var variationPlacements = /*#__PURE__*/basePlacements.reduce(function (acc, placement) {\n  return acc.concat([placement + \"-\" + start, placement + \"-\" + end]);\n}, []);\nexport var placements = /*#__PURE__*/[].concat(basePlacements, [auto]).reduce(function (acc, placement) {\n  return acc.concat([placement, placement + \"-\" + start, placement + \"-\" + end]);\n}, []); // modifiers that need to read the DOM\n\nexport var beforeRead = 'beforeRead';\nexport var read = 'read';\nexport var afterRead = 'afterRead'; // pure-logic modifiers\n\nexport var beforeMain = 'beforeMain';\nexport var main = 'main';\nexport var afterMain = 'afterMain'; // modifier with the purpose to write to the DOM (or write into a framework state)\n\nexport var beforeWrite = 'beforeWrite';\nexport var write = 'write';\nexport var afterWrite = 'afterWrite';\nexport var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite];","import { modifierPhases } from \"../enums.js\"; // source: https://stackoverflow.com/questions/49875255\n\nfunction order(modifiers) {\n  var map = new Map();\n  var visited = new Set();\n  var result = [];\n  modifiers.forEach(function (modifier) {\n    map.set(modifier.name, modifier);\n  }); // On visiting object, check for its dependencies and visit them recursively\n\n  function sort(modifier) {\n    visited.add(modifier.name);\n    var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []);\n    requires.forEach(function (dep) {\n      if (!visited.has(dep)) {\n        var depModifier = map.get(dep);\n\n        if (depModifier) {\n          sort(depModifier);\n        }\n      }\n    });\n    result.push(modifier);\n  }\n\n  modifiers.forEach(function (modifier) {\n    if (!visited.has(modifier.name)) {\n      // check for visited object\n      sort(modifier);\n    }\n  });\n  return result;\n}\n\nexport default function orderModifiers(modifiers) {\n  // order based on dependencies\n  var orderedModifiers = order(modifiers); // order based on phase\n\n  return modifierPhases.reduce(function (acc, phase) {\n    return acc.concat(orderedModifiers.filter(function (modifier) {\n      return modifier.phase === phase;\n    }));\n  }, []);\n}","import getCompositeRect from \"./dom-utils/getCompositeRect.js\";\nimport getLayoutRect from \"./dom-utils/getLayoutRect.js\";\nimport listScrollParents from \"./dom-utils/listScrollParents.js\";\nimport getOffsetParent from \"./dom-utils/getOffsetParent.js\";\nimport orderModifiers from \"./utils/orderModifiers.js\";\nimport debounce from \"./utils/debounce.js\";\nimport mergeByName from \"./utils/mergeByName.js\";\nimport detectOverflow from \"./utils/detectOverflow.js\";\nimport { isElement } from \"./dom-utils/instanceOf.js\";\nvar DEFAULT_OPTIONS = {\n  placement: 'bottom',\n  modifiers: [],\n  strategy: 'absolute'\n};\n\nfunction areValidElements() {\n  for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n    args[_key] = arguments[_key];\n  }\n\n  return !args.some(function (element) {\n    return !(element && typeof element.getBoundingClientRect === 'function');\n  });\n}\n\nexport function popperGenerator(generatorOptions) {\n  if (generatorOptions === void 0) {\n    generatorOptions = {};\n  }\n\n  var _generatorOptions = generatorOptions,\n      _generatorOptions$def = _generatorOptions.defaultModifiers,\n      defaultModifiers = _generatorOptions$def === void 0 ? [] : _generatorOptions$def,\n      _generatorOptions$def2 = _generatorOptions.defaultOptions,\n      defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2;\n  return function createPopper(reference, popper, options) {\n    if (options === void 0) {\n      options = defaultOptions;\n    }\n\n    var state = {\n      placement: 'bottom',\n      orderedModifiers: [],\n      options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions),\n      modifiersData: {},\n      elements: {\n        reference: reference,\n        popper: popper\n      },\n      attributes: {},\n      styles: {}\n    };\n    var effectCleanupFns = [];\n    var isDestroyed = false;\n    var instance = {\n      state: state,\n      setOptions: function setOptions(setOptionsAction) {\n        var options = typeof setOptionsAction === 'function' ? setOptionsAction(state.options) : setOptionsAction;\n        cleanupModifierEffects();\n        state.options = Object.assign({}, defaultOptions, state.options, options);\n        state.scrollParents = {\n          reference: isElement(reference) ? listScrollParents(reference) : reference.contextElement ? listScrollParents(reference.contextElement) : [],\n          popper: listScrollParents(popper)\n        }; // Orders the modifiers based on their dependencies and `phase`\n        // properties\n\n        var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers, state.options.modifiers))); // Strip out disabled modifiers\n\n        state.orderedModifiers = orderedModifiers.filter(function (m) {\n          return m.enabled;\n        });\n        runModifierEffects();\n        return instance.update();\n      },\n      // Sync update – it will always be executed, even if not necessary. This\n      // is useful for low frequency updates where sync behavior simplifies the\n      // logic.\n      // For high frequency updates (e.g. `resize` and `scroll` events), always\n      // prefer the async Popper#update method\n      forceUpdate: function forceUpdate() {\n        if (isDestroyed) {\n          return;\n        }\n\n        var _state$elements = state.elements,\n            reference = _state$elements.reference,\n            popper = _state$elements.popper; // Don't proceed if `reference` or `popper` are not valid elements\n        // anymore\n\n        if (!areValidElements(reference, popper)) {\n          return;\n        } // Store the reference and popper rects to be read by modifiers\n\n\n        state.rects = {\n          reference: getCompositeRect(reference, getOffsetParent(popper), state.options.strategy === 'fixed'),\n          popper: getLayoutRect(popper)\n        }; // Modifiers have the ability to reset the current update cycle. The\n        // most common use case for this is the `flip` modifier changing the\n        // placement, which then needs to re-run all the modifiers, because the\n        // logic was previously ran for the previous placement and is therefore\n        // stale/incorrect\n\n        state.reset = false;\n        state.placement = state.options.placement; // On each update cycle, the `modifiersData` property for each modifier\n        // is filled with the initial data specified by the modifier. This means\n        // it doesn't persist and is fresh on each update.\n        // To ensure persistent data, use `${name}#persistent`\n\n        state.orderedModifiers.forEach(function (modifier) {\n          return state.modifiersData[modifier.name] = Object.assign({}, modifier.data);\n        });\n\n        for (var index = 0; index < state.orderedModifiers.length; index++) {\n          if (state.reset === true) {\n            state.reset = false;\n            index = -1;\n            continue;\n          }\n\n          var _state$orderedModifie = state.orderedModifiers[index],\n              fn = _state$orderedModifie.fn,\n              _state$orderedModifie2 = _state$orderedModifie.options,\n              _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2,\n              name = _state$orderedModifie.name;\n\n          if (typeof fn === 'function') {\n            state = fn({\n              state: state,\n              options: _options,\n              name: name,\n              instance: instance\n            }) || state;\n          }\n        }\n      },\n      // Async and optimistically optimized update – it will not be executed if\n      // not necessary (debounced to run at most once-per-tick)\n      update: debounce(function () {\n        return new Promise(function (resolve) {\n          instance.forceUpdate();\n          resolve(state);\n        });\n      }),\n      destroy: function destroy() {\n        cleanupModifierEffects();\n        isDestroyed = true;\n      }\n    };\n\n    if (!areValidElements(reference, popper)) {\n      return instance;\n    }\n\n    instance.setOptions(options).then(function (state) {\n      if (!isDestroyed && options.onFirstUpdate) {\n        options.onFirstUpdate(state);\n      }\n    }); // Modifiers have the ability to execute arbitrary code before the first\n    // update cycle runs. They will be executed in the same order as the update\n    // cycle. This is useful when a modifier adds some persistent data that\n    // other modifiers need to use, but the modifier is run after the dependent\n    // one.\n\n    function runModifierEffects() {\n      state.orderedModifiers.forEach(function (_ref) {\n        var name = _ref.name,\n            _ref$options = _ref.options,\n            options = _ref$options === void 0 ? {} : _ref$options,\n            effect = _ref.effect;\n\n        if (typeof effect === 'function') {\n          var cleanupFn = effect({\n            state: state,\n            name: name,\n            instance: instance,\n            options: options\n          });\n\n          var noopFn = function noopFn() {};\n\n          effectCleanupFns.push(cleanupFn || noopFn);\n        }\n      });\n    }\n\n    function cleanupModifierEffects() {\n      effectCleanupFns.forEach(function (fn) {\n        return fn();\n      });\n      effectCleanupFns = [];\n    }\n\n    return instance;\n  };\n}\nexport var createPopper = /*#__PURE__*/popperGenerator(); // eslint-disable-next-line import/no-unused-modules\n\nexport { detectOverflow };","export default function debounce(fn) {\n  var pending;\n  return function () {\n    if (!pending) {\n      pending = new Promise(function (resolve) {\n        Promise.resolve().then(function () {\n          pending = undefined;\n          resolve(fn());\n        });\n      });\n    }\n\n    return pending;\n  };\n}","export default function mergeByName(modifiers) {\n  var merged = modifiers.reduce(function (merged, current) {\n    var existing = merged[current.name];\n    merged[current.name] = existing ? Object.assign({}, existing, current, {\n      options: Object.assign({}, existing.options, current.options),\n      data: Object.assign({}, existing.data, current.data)\n    }) : current;\n    return merged;\n  }, {}); // IE11 does not support Object.values\n\n  return Object.keys(merged).map(function (key) {\n    return merged[key];\n  });\n}","import getWindow from \"../dom-utils/getWindow.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar passive = {\n  passive: true\n};\n\nfunction effect(_ref) {\n  var state = _ref.state,\n      instance = _ref.instance,\n      options = _ref.options;\n  var _options$scroll = options.scroll,\n      scroll = _options$scroll === void 0 ? true : _options$scroll,\n      _options$resize = options.resize,\n      resize = _options$resize === void 0 ? true : _options$resize;\n  var window = getWindow(state.elements.popper);\n  var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper);\n\n  if (scroll) {\n    scrollParents.forEach(function (scrollParent) {\n      scrollParent.addEventListener('scroll', instance.update, passive);\n    });\n  }\n\n  if (resize) {\n    window.addEventListener('resize', instance.update, passive);\n  }\n\n  return function () {\n    if (scroll) {\n      scrollParents.forEach(function (scrollParent) {\n        scrollParent.removeEventListener('scroll', instance.update, passive);\n      });\n    }\n\n    if (resize) {\n      window.removeEventListener('resize', instance.update, passive);\n    }\n  };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n  name: 'eventListeners',\n  enabled: true,\n  phase: 'write',\n  fn: function fn() {},\n  effect: effect,\n  data: {}\n};","import { auto } from \"../enums.js\";\nexport default function getBasePlacement(placement) {\n  return placement.split('-')[0];\n}","export default function getVariation(placement) {\n  return placement.split('-')[1];\n}","export default function getMainAxisFromPlacement(placement) {\n  return ['top', 'bottom'].indexOf(placement) >= 0 ? 'x' : 'y';\n}","import getBasePlacement from \"./getBasePlacement.js\";\nimport getVariation from \"./getVariation.js\";\nimport getMainAxisFromPlacement from \"./getMainAxisFromPlacement.js\";\nimport { top, right, bottom, left, start, end } from \"../enums.js\";\nexport default function computeOffsets(_ref) {\n  var reference = _ref.reference,\n      element = _ref.element,\n      placement = _ref.placement;\n  var basePlacement = placement ? getBasePlacement(placement) : null;\n  var variation = placement ? getVariation(placement) : null;\n  var commonX = reference.x + reference.width / 2 - element.width / 2;\n  var commonY = reference.y + reference.height / 2 - element.height / 2;\n  var offsets;\n\n  switch (basePlacement) {\n    case top:\n      offsets = {\n        x: commonX,\n        y: reference.y - element.height\n      };\n      break;\n\n    case bottom:\n      offsets = {\n        x: commonX,\n        y: reference.y + reference.height\n      };\n      break;\n\n    case right:\n      offsets = {\n        x: reference.x + reference.width,\n        y: commonY\n      };\n      break;\n\n    case left:\n      offsets = {\n        x: reference.x - element.width,\n        y: commonY\n      };\n      break;\n\n    default:\n      offsets = {\n        x: reference.x,\n        y: reference.y\n      };\n  }\n\n  var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null;\n\n  if (mainAxis != null) {\n    var len = mainAxis === 'y' ? 'height' : 'width';\n\n    switch (variation) {\n      case start:\n        offsets[mainAxis] = offsets[mainAxis] - (reference[len] / 2 - element[len] / 2);\n        break;\n\n      case end:\n        offsets[mainAxis] = offsets[mainAxis] + (reference[len] / 2 - element[len] / 2);\n        break;\n\n      default:\n    }\n  }\n\n  return offsets;\n}","import { top, left, right, bottom, end } from \"../enums.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getWindow from \"../dom-utils/getWindow.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getComputedStyle from \"../dom-utils/getComputedStyle.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport { round } from \"../utils/math.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar unsetSides = {\n  top: 'auto',\n  right: 'auto',\n  bottom: 'auto',\n  left: 'auto'\n}; // Round the offsets to the nearest suitable subpixel based on the DPR.\n// Zooming can change the DPR, but it seems to report a value that will\n// cleanly divide the values into the appropriate subpixels.\n\nfunction roundOffsetsByDPR(_ref, win) {\n  var x = _ref.x,\n      y = _ref.y;\n  var dpr = win.devicePixelRatio || 1;\n  return {\n    x: round(x * dpr) / dpr || 0,\n    y: round(y * dpr) / dpr || 0\n  };\n}\n\nexport function mapToStyles(_ref2) {\n  var _Object$assign2;\n\n  var popper = _ref2.popper,\n      popperRect = _ref2.popperRect,\n      placement = _ref2.placement,\n      variation = _ref2.variation,\n      offsets = _ref2.offsets,\n      position = _ref2.position,\n      gpuAcceleration = _ref2.gpuAcceleration,\n      adaptive = _ref2.adaptive,\n      roundOffsets = _ref2.roundOffsets,\n      isFixed = _ref2.isFixed;\n  var _offsets$x = offsets.x,\n      x = _offsets$x === void 0 ? 0 : _offsets$x,\n      _offsets$y = offsets.y,\n      y = _offsets$y === void 0 ? 0 : _offsets$y;\n\n  var _ref3 = typeof roundOffsets === 'function' ? roundOffsets({\n    x: x,\n    y: y\n  }) : {\n    x: x,\n    y: y\n  };\n\n  x = _ref3.x;\n  y = _ref3.y;\n  var hasX = offsets.hasOwnProperty('x');\n  var hasY = offsets.hasOwnProperty('y');\n  var sideX = left;\n  var sideY = top;\n  var win = window;\n\n  if (adaptive) {\n    var offsetParent = getOffsetParent(popper);\n    var heightProp = 'clientHeight';\n    var widthProp = 'clientWidth';\n\n    if (offsetParent === getWindow(popper)) {\n      offsetParent = getDocumentElement(popper);\n\n      if (getComputedStyle(offsetParent).position !== 'static' && position === 'absolute') {\n        heightProp = 'scrollHeight';\n        widthProp = 'scrollWidth';\n      }\n    } // $FlowFixMe[incompatible-cast]: force type refinement, we compare offsetParent with window above, but Flow doesn't detect it\n\n\n    offsetParent = offsetParent;\n\n    if (placement === top || (placement === left || placement === right) && variation === end) {\n      sideY = bottom;\n      var offsetY = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.height : // $FlowFixMe[prop-missing]\n      offsetParent[heightProp];\n      y -= offsetY - popperRect.height;\n      y *= gpuAcceleration ? 1 : -1;\n    }\n\n    if (placement === left || (placement === top || placement === bottom) && variation === end) {\n      sideX = right;\n      var offsetX = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.width : // $FlowFixMe[prop-missing]\n      offsetParent[widthProp];\n      x -= offsetX - popperRect.width;\n      x *= gpuAcceleration ? 1 : -1;\n    }\n  }\n\n  var commonStyles = Object.assign({\n    position: position\n  }, adaptive && unsetSides);\n\n  var _ref4 = roundOffsets === true ? roundOffsetsByDPR({\n    x: x,\n    y: y\n  }, getWindow(popper)) : {\n    x: x,\n    y: y\n  };\n\n  x = _ref4.x;\n  y = _ref4.y;\n\n  if (gpuAcceleration) {\n    var _Object$assign;\n\n    return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? '0' : '', _Object$assign[sideX] = hasX ? '0' : '', _Object$assign.transform = (win.devicePixelRatio || 1) <= 1 ? \"translate(\" + x + \"px, \" + y + \"px)\" : \"translate3d(\" + x + \"px, \" + y + \"px, 0)\", _Object$assign));\n  }\n\n  return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + \"px\" : '', _Object$assign2[sideX] = hasX ? x + \"px\" : '', _Object$assign2.transform = '', _Object$assign2));\n}\n\nfunction computeStyles(_ref5) {\n  var state = _ref5.state,\n      options = _ref5.options;\n  var _options$gpuAccelerat = options.gpuAcceleration,\n      gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat,\n      _options$adaptive = options.adaptive,\n      adaptive = _options$adaptive === void 0 ? true : _options$adaptive,\n      _options$roundOffsets = options.roundOffsets,\n      roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets;\n  var commonStyles = {\n    placement: getBasePlacement(state.placement),\n    variation: getVariation(state.placement),\n    popper: state.elements.popper,\n    popperRect: state.rects.popper,\n    gpuAcceleration: gpuAcceleration,\n    isFixed: state.options.strategy === 'fixed'\n  };\n\n  if (state.modifiersData.popperOffsets != null) {\n    state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, {\n      offsets: state.modifiersData.popperOffsets,\n      position: state.options.strategy,\n      adaptive: adaptive,\n      roundOffsets: roundOffsets\n    })));\n  }\n\n  if (state.modifiersData.arrow != null) {\n    state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, {\n      offsets: state.modifiersData.arrow,\n      position: 'absolute',\n      adaptive: false,\n      roundOffsets: roundOffsets\n    })));\n  }\n\n  state.attributes.popper = Object.assign({}, state.attributes.popper, {\n    'data-popper-placement': state.placement\n  });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n  name: 'computeStyles',\n  enabled: true,\n  phase: 'beforeWrite',\n  fn: computeStyles,\n  data: {}\n};","import getNodeName from \"../dom-utils/getNodeName.js\";\nimport { isHTMLElement } from \"../dom-utils/instanceOf.js\"; // This modifier takes the styles prepared by the `computeStyles` modifier\n// and applies them to the HTMLElements such as popper and arrow\n\nfunction applyStyles(_ref) {\n  var state = _ref.state;\n  Object.keys(state.elements).forEach(function (name) {\n    var style = state.styles[name] || {};\n    var attributes = state.attributes[name] || {};\n    var element = state.elements[name]; // arrow is optional + virtual elements\n\n    if (!isHTMLElement(element) || !getNodeName(element)) {\n      return;\n    } // Flow doesn't support to extend this property, but it's the most\n    // effective way to apply styles to an HTMLElement\n    // $FlowFixMe[cannot-write]\n\n\n    Object.assign(element.style, style);\n    Object.keys(attributes).forEach(function (name) {\n      var value = attributes[name];\n\n      if (value === false) {\n        element.removeAttribute(name);\n      } else {\n        element.setAttribute(name, value === true ? '' : value);\n      }\n    });\n  });\n}\n\nfunction effect(_ref2) {\n  var state = _ref2.state;\n  var initialStyles = {\n    popper: {\n      position: state.options.strategy,\n      left: '0',\n      top: '0',\n      margin: '0'\n    },\n    arrow: {\n      position: 'absolute'\n    },\n    reference: {}\n  };\n  Object.assign(state.elements.popper.style, initialStyles.popper);\n  state.styles = initialStyles;\n\n  if (state.elements.arrow) {\n    Object.assign(state.elements.arrow.style, initialStyles.arrow);\n  }\n\n  return function () {\n    Object.keys(state.elements).forEach(function (name) {\n      var element = state.elements[name];\n      var attributes = state.attributes[name] || {};\n      var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]); // Set all values to an empty string to unset them\n\n      var style = styleProperties.reduce(function (style, property) {\n        style[property] = '';\n        return style;\n      }, {}); // arrow is optional + virtual elements\n\n      if (!isHTMLElement(element) || !getNodeName(element)) {\n        return;\n      }\n\n      Object.assign(element.style, style);\n      Object.keys(attributes).forEach(function (attribute) {\n        element.removeAttribute(attribute);\n      });\n    });\n  };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n  name: 'applyStyles',\n  enabled: true,\n  phase: 'write',\n  fn: applyStyles,\n  effect: effect,\n  requires: ['computeStyles']\n};","var hash = {\n  left: 'right',\n  right: 'left',\n  bottom: 'top',\n  top: 'bottom'\n};\nexport default function getOppositePlacement(placement) {\n  return placement.replace(/left|right|bottom|top/g, function (matched) {\n    return hash[matched];\n  });\n}","var hash = {\n  start: 'end',\n  end: 'start'\n};\nexport default function getOppositeVariationPlacement(placement) {\n  return placement.replace(/start|end/g, function (matched) {\n    return hash[matched];\n  });\n}","import { isShadowRoot } from \"./instanceOf.js\";\nexport default function contains(parent, child) {\n  var rootNode = child.getRootNode && child.getRootNode(); // First, attempt with faster native method\n\n  if (parent.contains(child)) {\n    return true;\n  } // then fallback to custom implementation with Shadow DOM support\n  else if (rootNode && isShadowRoot(rootNode)) {\n      var next = child;\n\n      do {\n        if (next && parent.isSameNode(next)) {\n          return true;\n        } // $FlowFixMe[prop-missing]: need a better way to handle this...\n\n\n        next = next.parentNode || next.host;\n      } while (next);\n    } // Give up, the result is false\n\n\n  return false;\n}","export default function rectToClientRect(rect) {\n  return Object.assign({}, rect, {\n    left: rect.x,\n    top: rect.y,\n    right: rect.x + rect.width,\n    bottom: rect.y + rect.height\n  });\n}","import { viewport } from \"../enums.js\";\nimport getViewportRect from \"./getViewportRect.js\";\nimport getDocumentRect from \"./getDocumentRect.js\";\nimport listScrollParents from \"./listScrollParents.js\";\nimport getOffsetParent from \"./getOffsetParent.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isElement, isHTMLElement } from \"./instanceOf.js\";\nimport getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport contains from \"./contains.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport rectToClientRect from \"../utils/rectToClientRect.js\";\nimport { max, min } from \"../utils/math.js\";\n\nfunction getInnerBoundingClientRect(element, strategy) {\n  var rect = getBoundingClientRect(element, false, strategy === 'fixed');\n  rect.top = rect.top + element.clientTop;\n  rect.left = rect.left + element.clientLeft;\n  rect.bottom = rect.top + element.clientHeight;\n  rect.right = rect.left + element.clientWidth;\n  rect.width = element.clientWidth;\n  rect.height = element.clientHeight;\n  rect.x = rect.left;\n  rect.y = rect.top;\n  return rect;\n}\n\nfunction getClientRectFromMixedType(element, clippingParent, strategy) {\n  return clippingParent === viewport ? rectToClientRect(getViewportRect(element, strategy)) : isElement(clippingParent) ? getInnerBoundingClientRect(clippingParent, strategy) : rectToClientRect(getDocumentRect(getDocumentElement(element)));\n} // A \"clipping parent\" is an overflowable container with the characteristic of\n// clipping (or hiding) overflowing elements with a position different from\n// `initial`\n\n\nfunction getClippingParents(element) {\n  var clippingParents = listScrollParents(getParentNode(element));\n  var canEscapeClipping = ['absolute', 'fixed'].indexOf(getComputedStyle(element).position) >= 0;\n  var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element;\n\n  if (!isElement(clipperElement)) {\n    return [];\n  } // $FlowFixMe[incompatible-return]: https://github.com/facebook/flow/issues/1414\n\n\n  return clippingParents.filter(function (clippingParent) {\n    return isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== 'body';\n  });\n} // Gets the maximum area that the element is visible in due to any number of\n// clipping parents\n\n\nexport default function getClippingRect(element, boundary, rootBoundary, strategy) {\n  var mainClippingParents = boundary === 'clippingParents' ? getClippingParents(element) : [].concat(boundary);\n  var clippingParents = [].concat(mainClippingParents, [rootBoundary]);\n  var firstClippingParent = clippingParents[0];\n  var clippingRect = clippingParents.reduce(function (accRect, clippingParent) {\n    var rect = getClientRectFromMixedType(element, clippingParent, strategy);\n    accRect.top = max(rect.top, accRect.top);\n    accRect.right = min(rect.right, accRect.right);\n    accRect.bottom = min(rect.bottom, accRect.bottom);\n    accRect.left = max(rect.left, accRect.left);\n    return accRect;\n  }, getClientRectFromMixedType(element, firstClippingParent, strategy));\n  clippingRect.width = clippingRect.right - clippingRect.left;\n  clippingRect.height = clippingRect.bottom - clippingRect.top;\n  clippingRect.x = clippingRect.left;\n  clippingRect.y = clippingRect.top;\n  return clippingRect;\n}","import getWindow from \"./getWindow.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport isLayoutViewport from \"./isLayoutViewport.js\";\nexport default function getViewportRect(element, strategy) {\n  var win = getWindow(element);\n  var html = getDocumentElement(element);\n  var visualViewport = win.visualViewport;\n  var width = html.clientWidth;\n  var height = html.clientHeight;\n  var x = 0;\n  var y = 0;\n\n  if (visualViewport) {\n    width = visualViewport.width;\n    height = visualViewport.height;\n    var layoutViewport = isLayoutViewport();\n\n    if (layoutViewport || !layoutViewport && strategy === 'fixed') {\n      x = visualViewport.offsetLeft;\n      y = visualViewport.offsetTop;\n    }\n  }\n\n  return {\n    width: width,\n    height: height,\n    x: x + getWindowScrollBarX(element),\n    y: y\n  };\n}","import getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nimport { max } from \"../utils/math.js\"; // Gets the entire size of the scrollable document area, even extending outside\n// of the `<html>` and `<body>` rect bounds if horizontally scrollable\n\nexport default function getDocumentRect(element) {\n  var _element$ownerDocumen;\n\n  var html = getDocumentElement(element);\n  var winScroll = getWindowScroll(element);\n  var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body;\n  var width = max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0);\n  var height = max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0);\n  var x = -winScroll.scrollLeft + getWindowScrollBarX(element);\n  var y = -winScroll.scrollTop;\n\n  if (getComputedStyle(body || html).direction === 'rtl') {\n    x += max(html.clientWidth, body ? body.clientWidth : 0) - width;\n  }\n\n  return {\n    width: width,\n    height: height,\n    x: x,\n    y: y\n  };\n}","import getFreshSideObject from \"./getFreshSideObject.js\";\nexport default function mergePaddingObject(paddingObject) {\n  return Object.assign({}, getFreshSideObject(), paddingObject);\n}","export default function getFreshSideObject() {\n  return {\n    top: 0,\n    right: 0,\n    bottom: 0,\n    left: 0\n  };\n}","export default function expandToHashMap(value, keys) {\n  return keys.reduce(function (hashMap, key) {\n    hashMap[key] = value;\n    return hashMap;\n  }, {});\n}","import getClippingRect from \"../dom-utils/getClippingRect.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getBoundingClientRect from \"../dom-utils/getBoundingClientRect.js\";\nimport computeOffsets from \"./computeOffsets.js\";\nimport rectToClientRect from \"./rectToClientRect.js\";\nimport { clippingParents, reference, popper, bottom, top, right, basePlacements, viewport } from \"../enums.js\";\nimport { isElement } from \"../dom-utils/instanceOf.js\";\nimport mergePaddingObject from \"./mergePaddingObject.js\";\nimport expandToHashMap from \"./expandToHashMap.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport default function detectOverflow(state, options) {\n  if (options === void 0) {\n    options = {};\n  }\n\n  var _options = options,\n      _options$placement = _options.placement,\n      placement = _options$placement === void 0 ? state.placement : _options$placement,\n      _options$strategy = _options.strategy,\n      strategy = _options$strategy === void 0 ? state.strategy : _options$strategy,\n      _options$boundary = _options.boundary,\n      boundary = _options$boundary === void 0 ? clippingParents : _options$boundary,\n      _options$rootBoundary = _options.rootBoundary,\n      rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary,\n      _options$elementConte = _options.elementContext,\n      elementContext = _options$elementConte === void 0 ? popper : _options$elementConte,\n      _options$altBoundary = _options.altBoundary,\n      altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary,\n      _options$padding = _options.padding,\n      padding = _options$padding === void 0 ? 0 : _options$padding;\n  var paddingObject = mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n  var altContext = elementContext === popper ? reference : popper;\n  var popperRect = state.rects.popper;\n  var element = state.elements[altBoundary ? altContext : elementContext];\n  var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary, strategy);\n  var referenceClientRect = getBoundingClientRect(state.elements.reference);\n  var popperOffsets = computeOffsets({\n    reference: referenceClientRect,\n    element: popperRect,\n    strategy: 'absolute',\n    placement: placement\n  });\n  var popperClientRect = rectToClientRect(Object.assign({}, popperRect, popperOffsets));\n  var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect; // positive = overflowing the clipping rect\n  // 0 or negative = within the clipping rect\n\n  var overflowOffsets = {\n    top: clippingClientRect.top - elementClientRect.top + paddingObject.top,\n    bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom,\n    left: clippingClientRect.left - elementClientRect.left + paddingObject.left,\n    right: elementClientRect.right - clippingClientRect.right + paddingObject.right\n  };\n  var offsetData = state.modifiersData.offset; // Offsets can be applied only to the popper element\n\n  if (elementContext === popper && offsetData) {\n    var offset = offsetData[placement];\n    Object.keys(overflowOffsets).forEach(function (key) {\n      var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1;\n      var axis = [top, bottom].indexOf(key) >= 0 ? 'y' : 'x';\n      overflowOffsets[key] += offset[axis] * multiply;\n    });\n  }\n\n  return overflowOffsets;\n}","import { max as mathMax, min as mathMin } from \"./math.js\";\nexport function within(min, value, max) {\n  return mathMax(min, mathMin(value, max));\n}\nexport function withinMaxClamp(min, value, max) {\n  var v = within(min, value, max);\n  return v > max ? max : v;\n}","import { top, bottom, left, right } from \"../enums.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\n\nfunction getSideOffsets(overflow, rect, preventedOffsets) {\n  if (preventedOffsets === void 0) {\n    preventedOffsets = {\n      x: 0,\n      y: 0\n    };\n  }\n\n  return {\n    top: overflow.top - rect.height - preventedOffsets.y,\n    right: overflow.right - rect.width + preventedOffsets.x,\n    bottom: overflow.bottom - rect.height + preventedOffsets.y,\n    left: overflow.left - rect.width - preventedOffsets.x\n  };\n}\n\nfunction isAnySideFullyClipped(overflow) {\n  return [top, right, bottom, left].some(function (side) {\n    return overflow[side] >= 0;\n  });\n}\n\nfunction hide(_ref) {\n  var state = _ref.state,\n      name = _ref.name;\n  var referenceRect = state.rects.reference;\n  var popperRect = state.rects.popper;\n  var preventedOffsets = state.modifiersData.preventOverflow;\n  var referenceOverflow = detectOverflow(state, {\n    elementContext: 'reference'\n  });\n  var popperAltOverflow = detectOverflow(state, {\n    altBoundary: true\n  });\n  var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect);\n  var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets);\n  var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets);\n  var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets);\n  state.modifiersData[name] = {\n    referenceClippingOffsets: referenceClippingOffsets,\n    popperEscapeOffsets: popperEscapeOffsets,\n    isReferenceHidden: isReferenceHidden,\n    hasPopperEscaped: hasPopperEscaped\n  };\n  state.attributes.popper = Object.assign({}, state.attributes.popper, {\n    'data-popper-reference-hidden': isReferenceHidden,\n    'data-popper-escaped': hasPopperEscaped\n  });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n  name: 'hide',\n  enabled: true,\n  phase: 'main',\n  requiresIfExists: ['preventOverflow'],\n  fn: hide\n};","import { popperGenerator, detectOverflow } from \"./createPopper.js\";\nimport eventListeners from \"./modifiers/eventListeners.js\";\nimport popperOffsets from \"./modifiers/popperOffsets.js\";\nimport computeStyles from \"./modifiers/computeStyles.js\";\nimport applyStyles from \"./modifiers/applyStyles.js\";\nimport offset from \"./modifiers/offset.js\";\nimport flip from \"./modifiers/flip.js\";\nimport preventOverflow from \"./modifiers/preventOverflow.js\";\nimport arrow from \"./modifiers/arrow.js\";\nimport hide from \"./modifiers/hide.js\";\nvar defaultModifiers = [eventListeners, popperOffsets, computeStyles, applyStyles, offset, flip, preventOverflow, arrow, hide];\nvar createPopper = /*#__PURE__*/popperGenerator({\n  defaultModifiers: defaultModifiers\n}); // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper, popperGenerator, defaultModifiers, detectOverflow }; // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper as createPopperLite } from \"./popper-lite.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport * from \"./modifiers/index.js\";","import computeOffsets from \"../utils/computeOffsets.js\";\n\nfunction popperOffsets(_ref) {\n  var state = _ref.state,\n      name = _ref.name;\n  // Offsets are the actual position the popper needs to have to be\n  // properly positioned near its reference element\n  // This is the most basic placement, and will be adjusted by\n  // the modifiers in the next step\n  state.modifiersData[name] = computeOffsets({\n    reference: state.rects.reference,\n    element: state.rects.popper,\n    strategy: 'absolute',\n    placement: state.placement\n  });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n  name: 'popperOffsets',\n  enabled: true,\n  phase: 'read',\n  fn: popperOffsets,\n  data: {}\n};","import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport { top, left, right, placements } from \"../enums.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport function distanceAndSkiddingToXY(placement, rects, offset) {\n  var basePlacement = getBasePlacement(placement);\n  var invertDistance = [left, top].indexOf(basePlacement) >= 0 ? -1 : 1;\n\n  var _ref = typeof offset === 'function' ? offset(Object.assign({}, rects, {\n    placement: placement\n  })) : offset,\n      skidding = _ref[0],\n      distance = _ref[1];\n\n  skidding = skidding || 0;\n  distance = (distance || 0) * invertDistance;\n  return [left, right].indexOf(basePlacement) >= 0 ? {\n    x: distance,\n    y: skidding\n  } : {\n    x: skidding,\n    y: distance\n  };\n}\n\nfunction offset(_ref2) {\n  var state = _ref2.state,\n      options = _ref2.options,\n      name = _ref2.name;\n  var _options$offset = options.offset,\n      offset = _options$offset === void 0 ? [0, 0] : _options$offset;\n  var data = placements.reduce(function (acc, placement) {\n    acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset);\n    return acc;\n  }, {});\n  var _data$state$placement = data[state.placement],\n      x = _data$state$placement.x,\n      y = _data$state$placement.y;\n\n  if (state.modifiersData.popperOffsets != null) {\n    state.modifiersData.popperOffsets.x += x;\n    state.modifiersData.popperOffsets.y += y;\n  }\n\n  state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n  name: 'offset',\n  enabled: true,\n  phase: 'main',\n  requires: ['popperOffsets'],\n  fn: offset\n};","import getOppositePlacement from \"../utils/getOppositePlacement.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getOppositeVariationPlacement from \"../utils/getOppositeVariationPlacement.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport computeAutoPlacement from \"../utils/computeAutoPlacement.js\";\nimport { bottom, top, start, right, left, auto } from \"../enums.js\";\nimport getVariation from \"../utils/getVariation.js\"; // eslint-disable-next-line import/no-unused-modules\n\nfunction getExpandedFallbackPlacements(placement) {\n  if (getBasePlacement(placement) === auto) {\n    return [];\n  }\n\n  var oppositePlacement = getOppositePlacement(placement);\n  return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)];\n}\n\nfunction flip(_ref) {\n  var state = _ref.state,\n      options = _ref.options,\n      name = _ref.name;\n\n  if (state.modifiersData[name]._skip) {\n    return;\n  }\n\n  var _options$mainAxis = options.mainAxis,\n      checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n      _options$altAxis = options.altAxis,\n      checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis,\n      specifiedFallbackPlacements = options.fallbackPlacements,\n      padding = options.padding,\n      boundary = options.boundary,\n      rootBoundary = options.rootBoundary,\n      altBoundary = options.altBoundary,\n      _options$flipVariatio = options.flipVariations,\n      flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio,\n      allowedAutoPlacements = options.allowedAutoPlacements;\n  var preferredPlacement = state.options.placement;\n  var basePlacement = getBasePlacement(preferredPlacement);\n  var isBasePlacement = basePlacement === preferredPlacement;\n  var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement));\n  var placements = [preferredPlacement].concat(fallbackPlacements).reduce(function (acc, placement) {\n    return acc.concat(getBasePlacement(placement) === auto ? computeAutoPlacement(state, {\n      placement: placement,\n      boundary: boundary,\n      rootBoundary: rootBoundary,\n      padding: padding,\n      flipVariations: flipVariations,\n      allowedAutoPlacements: allowedAutoPlacements\n    }) : placement);\n  }, []);\n  var referenceRect = state.rects.reference;\n  var popperRect = state.rects.popper;\n  var checksMap = new Map();\n  var makeFallbackChecks = true;\n  var firstFittingPlacement = placements[0];\n\n  for (var i = 0; i < placements.length; i++) {\n    var placement = placements[i];\n\n    var _basePlacement = getBasePlacement(placement);\n\n    var isStartVariation = getVariation(placement) === start;\n    var isVertical = [top, bottom].indexOf(_basePlacement) >= 0;\n    var len = isVertical ? 'width' : 'height';\n    var overflow = detectOverflow(state, {\n      placement: placement,\n      boundary: boundary,\n      rootBoundary: rootBoundary,\n      altBoundary: altBoundary,\n      padding: padding\n    });\n    var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : top;\n\n    if (referenceRect[len] > popperRect[len]) {\n      mainVariationSide = getOppositePlacement(mainVariationSide);\n    }\n\n    var altVariationSide = getOppositePlacement(mainVariationSide);\n    var checks = [];\n\n    if (checkMainAxis) {\n      checks.push(overflow[_basePlacement] <= 0);\n    }\n\n    if (checkAltAxis) {\n      checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0);\n    }\n\n    if (checks.every(function (check) {\n      return check;\n    })) {\n      firstFittingPlacement = placement;\n      makeFallbackChecks = false;\n      break;\n    }\n\n    checksMap.set(placement, checks);\n  }\n\n  if (makeFallbackChecks) {\n    // `2` may be desired in some cases – research later\n    var numberOfChecks = flipVariations ? 3 : 1;\n\n    var _loop = function _loop(_i) {\n      var fittingPlacement = placements.find(function (placement) {\n        var checks = checksMap.get(placement);\n\n        if (checks) {\n          return checks.slice(0, _i).every(function (check) {\n            return check;\n          });\n        }\n      });\n\n      if (fittingPlacement) {\n        firstFittingPlacement = fittingPlacement;\n        return \"break\";\n      }\n    };\n\n    for (var _i = numberOfChecks; _i > 0; _i--) {\n      var _ret = _loop(_i);\n\n      if (_ret === \"break\") break;\n    }\n  }\n\n  if (state.placement !== firstFittingPlacement) {\n    state.modifiersData[name]._skip = true;\n    state.placement = firstFittingPlacement;\n    state.reset = true;\n  }\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n  name: 'flip',\n  enabled: true,\n  phase: 'main',\n  fn: flip,\n  requiresIfExists: ['offset'],\n  data: {\n    _skip: false\n  }\n};","import getVariation from \"./getVariation.js\";\nimport { variationPlacements, basePlacements, placements as allPlacements } from \"../enums.js\";\nimport detectOverflow from \"./detectOverflow.js\";\nimport getBasePlacement from \"./getBasePlacement.js\";\nexport default function computeAutoPlacement(state, options) {\n  if (options === void 0) {\n    options = {};\n  }\n\n  var _options = options,\n      placement = _options.placement,\n      boundary = _options.boundary,\n      rootBoundary = _options.rootBoundary,\n      padding = _options.padding,\n      flipVariations = _options.flipVariations,\n      _options$allowedAutoP = _options.allowedAutoPlacements,\n      allowedAutoPlacements = _options$allowedAutoP === void 0 ? allPlacements : _options$allowedAutoP;\n  var variation = getVariation(placement);\n  var placements = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function (placement) {\n    return getVariation(placement) === variation;\n  }) : basePlacements;\n  var allowedPlacements = placements.filter(function (placement) {\n    return allowedAutoPlacements.indexOf(placement) >= 0;\n  });\n\n  if (allowedPlacements.length === 0) {\n    allowedPlacements = placements;\n  } // $FlowFixMe[incompatible-type]: Flow seems to have problems with two array unions...\n\n\n  var overflows = allowedPlacements.reduce(function (acc, placement) {\n    acc[placement] = detectOverflow(state, {\n      placement: placement,\n      boundary: boundary,\n      rootBoundary: rootBoundary,\n      padding: padding\n    })[getBasePlacement(placement)];\n    return acc;\n  }, {});\n  return Object.keys(overflows).sort(function (a, b) {\n    return overflows[a] - overflows[b];\n  });\n}","import { top, left, right, bottom, start } from \"../enums.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport getAltAxis from \"../utils/getAltAxis.js\";\nimport { within, withinMaxClamp } from \"../utils/within.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport getFreshSideObject from \"../utils/getFreshSideObject.js\";\nimport { min as mathMin, max as mathMax } from \"../utils/math.js\";\n\nfunction preventOverflow(_ref) {\n  var state = _ref.state,\n      options = _ref.options,\n      name = _ref.name;\n  var _options$mainAxis = options.mainAxis,\n      checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n      _options$altAxis = options.altAxis,\n      checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis,\n      boundary = options.boundary,\n      rootBoundary = options.rootBoundary,\n      altBoundary = options.altBoundary,\n      padding = options.padding,\n      _options$tether = options.tether,\n      tether = _options$tether === void 0 ? true : _options$tether,\n      _options$tetherOffset = options.tetherOffset,\n      tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset;\n  var overflow = detectOverflow(state, {\n    boundary: boundary,\n    rootBoundary: rootBoundary,\n    padding: padding,\n    altBoundary: altBoundary\n  });\n  var basePlacement = getBasePlacement(state.placement);\n  var variation = getVariation(state.placement);\n  var isBasePlacement = !variation;\n  var mainAxis = getMainAxisFromPlacement(basePlacement);\n  var altAxis = getAltAxis(mainAxis);\n  var popperOffsets = state.modifiersData.popperOffsets;\n  var referenceRect = state.rects.reference;\n  var popperRect = state.rects.popper;\n  var tetherOffsetValue = typeof tetherOffset === 'function' ? tetherOffset(Object.assign({}, state.rects, {\n    placement: state.placement\n  })) : tetherOffset;\n  var normalizedTetherOffsetValue = typeof tetherOffsetValue === 'number' ? {\n    mainAxis: tetherOffsetValue,\n    altAxis: tetherOffsetValue\n  } : Object.assign({\n    mainAxis: 0,\n    altAxis: 0\n  }, tetherOffsetValue);\n  var offsetModifierState = state.modifiersData.offset ? state.modifiersData.offset[state.placement] : null;\n  var data = {\n    x: 0,\n    y: 0\n  };\n\n  if (!popperOffsets) {\n    return;\n  }\n\n  if (checkMainAxis) {\n    var _offsetModifierState$;\n\n    var mainSide = mainAxis === 'y' ? top : left;\n    var altSide = mainAxis === 'y' ? bottom : right;\n    var len = mainAxis === 'y' ? 'height' : 'width';\n    var offset = popperOffsets[mainAxis];\n    var min = offset + overflow[mainSide];\n    var max = offset - overflow[altSide];\n    var additive = tether ? -popperRect[len] / 2 : 0;\n    var minLen = variation === start ? referenceRect[len] : popperRect[len];\n    var maxLen = variation === start ? -popperRect[len] : -referenceRect[len]; // We need to include the arrow in the calculation so the arrow doesn't go\n    // outside the reference bounds\n\n    var arrowElement = state.elements.arrow;\n    var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : {\n      width: 0,\n      height: 0\n    };\n    var arrowPaddingObject = state.modifiersData['arrow#persistent'] ? state.modifiersData['arrow#persistent'].padding : getFreshSideObject();\n    var arrowPaddingMin = arrowPaddingObject[mainSide];\n    var arrowPaddingMax = arrowPaddingObject[altSide]; // If the reference length is smaller than the arrow length, we don't want\n    // to include its full size in the calculation. If the reference is small\n    // and near the edge of a boundary, the popper can overflow even if the\n    // reference is not overflowing as well (e.g. virtual elements with no\n    // width or height)\n\n    var arrowLen = within(0, referenceRect[len], arrowRect[len]);\n    var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis : minLen - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis;\n    var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis : maxLen + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis;\n    var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow);\n    var clientOffset = arrowOffsetParent ? mainAxis === 'y' ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0;\n    var offsetModifierValue = (_offsetModifierState$ = offsetModifierState == null ? void 0 : offsetModifierState[mainAxis]) != null ? _offsetModifierState$ : 0;\n    var tetherMin = offset + minOffset - offsetModifierValue - clientOffset;\n    var tetherMax = offset + maxOffset - offsetModifierValue;\n    var preventedOffset = within(tether ? mathMin(min, tetherMin) : min, offset, tether ? mathMax(max, tetherMax) : max);\n    popperOffsets[mainAxis] = preventedOffset;\n    data[mainAxis] = preventedOffset - offset;\n  }\n\n  if (checkAltAxis) {\n    var _offsetModifierState$2;\n\n    var _mainSide = mainAxis === 'x' ? top : left;\n\n    var _altSide = mainAxis === 'x' ? bottom : right;\n\n    var _offset = popperOffsets[altAxis];\n\n    var _len = altAxis === 'y' ? 'height' : 'width';\n\n    var _min = _offset + overflow[_mainSide];\n\n    var _max = _offset - overflow[_altSide];\n\n    var isOriginSide = [top, left].indexOf(basePlacement) !== -1;\n\n    var _offsetModifierValue = (_offsetModifierState$2 = offsetModifierState == null ? void 0 : offsetModifierState[altAxis]) != null ? _offsetModifierState$2 : 0;\n\n    var _tetherMin = isOriginSide ? _min : _offset - referenceRect[_len] - popperRect[_len] - _offsetModifierValue + normalizedTetherOffsetValue.altAxis;\n\n    var _tetherMax = isOriginSide ? _offset + referenceRect[_len] + popperRect[_len] - _offsetModifierValue - normalizedTetherOffsetValue.altAxis : _max;\n\n    var _preventedOffset = tether && isOriginSide ? withinMaxClamp(_tetherMin, _offset, _tetherMax) : within(tether ? _tetherMin : _min, _offset, tether ? _tetherMax : _max);\n\n    popperOffsets[altAxis] = _preventedOffset;\n    data[altAxis] = _preventedOffset - _offset;\n  }\n\n  state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n  name: 'preventOverflow',\n  enabled: true,\n  phase: 'main',\n  fn: preventOverflow,\n  requiresIfExists: ['offset']\n};","export default function getAltAxis(axis) {\n  return axis === 'x' ? 'y' : 'x';\n}","import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport contains from \"../dom-utils/contains.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport { within } from \"../utils/within.js\";\nimport mergePaddingObject from \"../utils/mergePaddingObject.js\";\nimport expandToHashMap from \"../utils/expandToHashMap.js\";\nimport { left, right, basePlacements, top, bottom } from \"../enums.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar toPaddingObject = function toPaddingObject(padding, state) {\n  padding = typeof padding === 'function' ? padding(Object.assign({}, state.rects, {\n    placement: state.placement\n  })) : padding;\n  return mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n};\n\nfunction arrow(_ref) {\n  var _state$modifiersData$;\n\n  var state = _ref.state,\n      name = _ref.name,\n      options = _ref.options;\n  var arrowElement = state.elements.arrow;\n  var popperOffsets = state.modifiersData.popperOffsets;\n  var basePlacement = getBasePlacement(state.placement);\n  var axis = getMainAxisFromPlacement(basePlacement);\n  var isVertical = [left, right].indexOf(basePlacement) >= 0;\n  var len = isVertical ? 'height' : 'width';\n\n  if (!arrowElement || !popperOffsets) {\n    return;\n  }\n\n  var paddingObject = toPaddingObject(options.padding, state);\n  var arrowRect = getLayoutRect(arrowElement);\n  var minProp = axis === 'y' ? top : left;\n  var maxProp = axis === 'y' ? bottom : right;\n  var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets[axis] - state.rects.popper[len];\n  var startDiff = popperOffsets[axis] - state.rects.reference[axis];\n  var arrowOffsetParent = getOffsetParent(arrowElement);\n  var clientSize = arrowOffsetParent ? axis === 'y' ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0;\n  var centerToReference = endDiff / 2 - startDiff / 2; // Make sure the arrow doesn't overflow the popper if the center point is\n  // outside of the popper bounds\n\n  var min = paddingObject[minProp];\n  var max = clientSize - arrowRect[len] - paddingObject[maxProp];\n  var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference;\n  var offset = within(min, center, max); // Prevents breaking syntax highlighting...\n\n  var axisProp = axis;\n  state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset, _state$modifiersData$.centerOffset = offset - center, _state$modifiersData$);\n}\n\nfunction effect(_ref2) {\n  var state = _ref2.state,\n      options = _ref2.options;\n  var _options$element = options.element,\n      arrowElement = _options$element === void 0 ? '[data-popper-arrow]' : _options$element;\n\n  if (arrowElement == null) {\n    return;\n  } // CSS selector\n\n\n  if (typeof arrowElement === 'string') {\n    arrowElement = state.elements.popper.querySelector(arrowElement);\n\n    if (!arrowElement) {\n      return;\n    }\n  }\n\n  if (!contains(state.elements.popper, arrowElement)) {\n    return;\n  }\n\n  state.elements.arrow = arrowElement;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n  name: 'arrow',\n  enabled: true,\n  phase: 'main',\n  fn: arrow,\n  effect: effect,\n  requires: ['popperOffsets'],\n  requiresIfExists: ['preventOverflow']\n};","/**!\n* tippy.js v6.3.7\n* (c) 2017-2021 atomiks\n* MIT License\n*/\nimport { createPopper, applyStyles } from '@popperjs/core';\n\nvar ROUND_ARROW = '<svg width=\"16\" height=\"6\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M0 6s1.796-.013 4.67-3.615C5.851.9 6.93.006 8 0c1.07-.006 2.148.887 3.343 2.385C14.233 6.005 16 6 16 6H0z\"></svg>';\nvar BOX_CLASS = \"tippy-box\";\nvar CONTENT_CLASS = \"tippy-content\";\nvar BACKDROP_CLASS = \"tippy-backdrop\";\nvar ARROW_CLASS = \"tippy-arrow\";\nvar SVG_ARROW_CLASS = \"tippy-svg-arrow\";\nvar TOUCH_OPTIONS = {\n  passive: true,\n  capture: true\n};\nvar TIPPY_DEFAULT_APPEND_TO = function TIPPY_DEFAULT_APPEND_TO() {\n  return document.body;\n};\n\nfunction hasOwnProperty(obj, key) {\n  return {}.hasOwnProperty.call(obj, key);\n}\nfunction getValueAtIndexOrReturn(value, index, defaultValue) {\n  if (Array.isArray(value)) {\n    var v = value[index];\n    return v == null ? Array.isArray(defaultValue) ? defaultValue[index] : defaultValue : v;\n  }\n\n  return value;\n}\nfunction isType(value, type) {\n  var str = {}.toString.call(value);\n  return str.indexOf('[object') === 0 && str.indexOf(type + \"]\") > -1;\n}\nfunction invokeWithArgsOrReturn(value, args) {\n  return typeof value === 'function' ? value.apply(void 0, args) : value;\n}\nfunction debounce(fn, ms) {\n  // Avoid wrapping in `setTimeout` if ms is 0 anyway\n  if (ms === 0) {\n    return fn;\n  }\n\n  var timeout;\n  return function (arg) {\n    clearTimeout(timeout);\n    timeout = setTimeout(function () {\n      fn(arg);\n    }, ms);\n  };\n}\nfunction removeProperties(obj, keys) {\n  var clone = Object.assign({}, obj);\n  keys.forEach(function (key) {\n    delete clone[key];\n  });\n  return clone;\n}\nfunction splitBySpaces(value) {\n  return value.split(/\\s+/).filter(Boolean);\n}\nfunction normalizeToArray(value) {\n  return [].concat(value);\n}\nfunction pushIfUnique(arr, value) {\n  if (arr.indexOf(value) === -1) {\n    arr.push(value);\n  }\n}\nfunction unique(arr) {\n  return arr.filter(function (item, index) {\n    return arr.indexOf(item) === index;\n  });\n}\nfunction getBasePlacement(placement) {\n  return placement.split('-')[0];\n}\nfunction arrayFrom(value) {\n  return [].slice.call(value);\n}\nfunction removeUndefinedProps(obj) {\n  return Object.keys(obj).reduce(function (acc, key) {\n    if (obj[key] !== undefined) {\n      acc[key] = obj[key];\n    }\n\n    return acc;\n  }, {});\n}\n\nfunction div() {\n  return document.createElement('div');\n}\nfunction isElement(value) {\n  return ['Element', 'Fragment'].some(function (type) {\n    return isType(value, type);\n  });\n}\nfunction isNodeList(value) {\n  return isType(value, 'NodeList');\n}\nfunction isMouseEvent(value) {\n  return isType(value, 'MouseEvent');\n}\nfunction isReferenceElement(value) {\n  return !!(value && value._tippy && value._tippy.reference === value);\n}\nfunction getArrayOfElements(value) {\n  if (isElement(value)) {\n    return [value];\n  }\n\n  if (isNodeList(value)) {\n    return arrayFrom(value);\n  }\n\n  if (Array.isArray(value)) {\n    return value;\n  }\n\n  return arrayFrom(document.querySelectorAll(value));\n}\nfunction setTransitionDuration(els, value) {\n  els.forEach(function (el) {\n    if (el) {\n      el.style.transitionDuration = value + \"ms\";\n    }\n  });\n}\nfunction setVisibilityState(els, state) {\n  els.forEach(function (el) {\n    if (el) {\n      el.setAttribute('data-state', state);\n    }\n  });\n}\nfunction getOwnerDocument(elementOrElements) {\n  var _element$ownerDocumen;\n\n  var _normalizeToArray = normalizeToArray(elementOrElements),\n      element = _normalizeToArray[0]; // Elements created via a <template> have an ownerDocument with no reference to the body\n\n\n  return element != null && (_element$ownerDocumen = element.ownerDocument) != null && _element$ownerDocumen.body ? element.ownerDocument : document;\n}\nfunction isCursorOutsideInteractiveBorder(popperTreeData, event) {\n  var clientX = event.clientX,\n      clientY = event.clientY;\n  return popperTreeData.every(function (_ref) {\n    var popperRect = _ref.popperRect,\n        popperState = _ref.popperState,\n        props = _ref.props;\n    var interactiveBorder = props.interactiveBorder;\n    var basePlacement = getBasePlacement(popperState.placement);\n    var offsetData = popperState.modifiersData.offset;\n\n    if (!offsetData) {\n      return true;\n    }\n\n    var topDistance = basePlacement === 'bottom' ? offsetData.top.y : 0;\n    var bottomDistance = basePlacement === 'top' ? offsetData.bottom.y : 0;\n    var leftDistance = basePlacement === 'right' ? offsetData.left.x : 0;\n    var rightDistance = basePlacement === 'left' ? offsetData.right.x : 0;\n    var exceedsTop = popperRect.top - clientY + topDistance > interactiveBorder;\n    var exceedsBottom = clientY - popperRect.bottom - bottomDistance > interactiveBorder;\n    var exceedsLeft = popperRect.left - clientX + leftDistance > interactiveBorder;\n    var exceedsRight = clientX - popperRect.right - rightDistance > interactiveBorder;\n    return exceedsTop || exceedsBottom || exceedsLeft || exceedsRight;\n  });\n}\nfunction updateTransitionEndListener(box, action, listener) {\n  var method = action + \"EventListener\"; // some browsers apparently support `transition` (unprefixed) but only fire\n  // `webkitTransitionEnd`...\n\n  ['transitionend', 'webkitTransitionEnd'].forEach(function (event) {\n    box[method](event, listener);\n  });\n}\n/**\n * Compared to xxx.contains, this function works for dom structures with shadow\n * dom\n */\n\nfunction actualContains(parent, child) {\n  var target = child;\n\n  while (target) {\n    var _target$getRootNode;\n\n    if (parent.contains(target)) {\n      return true;\n    }\n\n    target = target.getRootNode == null ? void 0 : (_target$getRootNode = target.getRootNode()) == null ? void 0 : _target$getRootNode.host;\n  }\n\n  return false;\n}\n\nvar currentInput = {\n  isTouch: false\n};\nvar lastMouseMoveTime = 0;\n/**\n * When a `touchstart` event is fired, it's assumed the user is using touch\n * input. We'll bind a `mousemove` event listener to listen for mouse input in\n * the future. This way, the `isTouch` property is fully dynamic and will handle\n * hybrid devices that use a mix of touch + mouse input.\n */\n\nfunction onDocumentTouchStart() {\n  if (currentInput.isTouch) {\n    return;\n  }\n\n  currentInput.isTouch = true;\n\n  if (window.performance) {\n    document.addEventListener('mousemove', onDocumentMouseMove);\n  }\n}\n/**\n * When two `mousemove` event are fired consecutively within 20ms, it's assumed\n * the user is using mouse input again. `mousemove` can fire on touch devices as\n * well, but very rarely that quickly.\n */\n\nfunction onDocumentMouseMove() {\n  var now = performance.now();\n\n  if (now - lastMouseMoveTime < 20) {\n    currentInput.isTouch = false;\n    document.removeEventListener('mousemove', onDocumentMouseMove);\n  }\n\n  lastMouseMoveTime = now;\n}\n/**\n * When an element is in focus and has a tippy, leaving the tab/window and\n * returning causes it to show again. For mouse users this is unexpected, but\n * for keyboard use it makes sense.\n * TODO: find a better technique to solve this problem\n */\n\nfunction onWindowBlur() {\n  var activeElement = document.activeElement;\n\n  if (isReferenceElement(activeElement)) {\n    var instance = activeElement._tippy;\n\n    if (activeElement.blur && !instance.state.isVisible) {\n      activeElement.blur();\n    }\n  }\n}\nfunction bindGlobalEventListeners() {\n  document.addEventListener('touchstart', onDocumentTouchStart, TOUCH_OPTIONS);\n  window.addEventListener('blur', onWindowBlur);\n}\n\nvar isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined';\nvar isIE11 = isBrowser ? // @ts-ignore\n!!window.msCrypto : false;\n\nfunction createMemoryLeakWarning(method) {\n  var txt = method === 'destroy' ? 'n already-' : ' ';\n  return [method + \"() was called on a\" + txt + \"destroyed instance. This is a no-op but\", 'indicates a potential memory leak.'].join(' ');\n}\nfunction clean(value) {\n  var spacesAndTabs = /[ \\t]{2,}/g;\n  var lineStartWithSpaces = /^[ \\t]*/gm;\n  return value.replace(spacesAndTabs, ' ').replace(lineStartWithSpaces, '').trim();\n}\n\nfunction getDevMessage(message) {\n  return clean(\"\\n  %ctippy.js\\n\\n  %c\" + clean(message) + \"\\n\\n  %c\\uD83D\\uDC77\\u200D This is a development-only message. It will be removed in production.\\n  \");\n}\n\nfunction getFormattedMessage(message) {\n  return [getDevMessage(message), // title\n  'color: #00C584; font-size: 1.3em; font-weight: bold;', // message\n  'line-height: 1.5', // footer\n  'color: #a6a095;'];\n} // Assume warnings and errors never have the same message\n\nvar visitedMessages;\n\nif (process.env.NODE_ENV !== \"production\") {\n  resetVisitedMessages();\n}\n\nfunction resetVisitedMessages() {\n  visitedMessages = new Set();\n}\nfunction warnWhen(condition, message) {\n  if (condition && !visitedMessages.has(message)) {\n    var _console;\n\n    visitedMessages.add(message);\n\n    (_console = console).warn.apply(_console, getFormattedMessage(message));\n  }\n}\nfunction errorWhen(condition, message) {\n  if (condition && !visitedMessages.has(message)) {\n    var _console2;\n\n    visitedMessages.add(message);\n\n    (_console2 = console).error.apply(_console2, getFormattedMessage(message));\n  }\n}\nfunction validateTargets(targets) {\n  var didPassFalsyValue = !targets;\n  var didPassPlainObject = Object.prototype.toString.call(targets) === '[object Object]' && !targets.addEventListener;\n  errorWhen(didPassFalsyValue, ['tippy() was passed', '`' + String(targets) + '`', 'as its targets (first) argument. Valid types are: String, Element,', 'Element[], or NodeList.'].join(' '));\n  errorWhen(didPassPlainObject, ['tippy() was passed a plain object which is not supported as an argument', 'for virtual positioning. Use props.getReferenceClientRect instead.'].join(' '));\n}\n\nvar pluginProps = {\n  animateFill: false,\n  followCursor: false,\n  inlinePositioning: false,\n  sticky: false\n};\nvar renderProps = {\n  allowHTML: false,\n  animation: 'fade',\n  arrow: true,\n  content: '',\n  inertia: false,\n  maxWidth: 350,\n  role: 'tooltip',\n  theme: '',\n  zIndex: 9999\n};\nvar defaultProps = Object.assign({\n  appendTo: TIPPY_DEFAULT_APPEND_TO,\n  aria: {\n    content: 'auto',\n    expanded: 'auto'\n  },\n  delay: 0,\n  duration: [300, 250],\n  getReferenceClientRect: null,\n  hideOnClick: true,\n  ignoreAttributes: false,\n  interactive: false,\n  interactiveBorder: 2,\n  interactiveDebounce: 0,\n  moveTransition: '',\n  offset: [0, 10],\n  onAfterUpdate: function onAfterUpdate() {},\n  onBeforeUpdate: function onBeforeUpdate() {},\n  onCreate: function onCreate() {},\n  onDestroy: function onDestroy() {},\n  onHidden: function onHidden() {},\n  onHide: function onHide() {},\n  onMount: function onMount() {},\n  onShow: function onShow() {},\n  onShown: function onShown() {},\n  onTrigger: function onTrigger() {},\n  onUntrigger: function onUntrigger() {},\n  onClickOutside: function onClickOutside() {},\n  placement: 'top',\n  plugins: [],\n  popperOptions: {},\n  render: null,\n  showOnCreate: false,\n  touch: true,\n  trigger: 'mouseenter focus',\n  triggerTarget: null\n}, pluginProps, renderProps);\nvar defaultKeys = Object.keys(defaultProps);\nvar setDefaultProps = function setDefaultProps(partialProps) {\n  /* istanbul ignore else */\n  if (process.env.NODE_ENV !== \"production\") {\n    validateProps(partialProps, []);\n  }\n\n  var keys = Object.keys(partialProps);\n  keys.forEach(function (key) {\n    defaultProps[key] = partialProps[key];\n  });\n};\nfunction getExtendedPassedProps(passedProps) {\n  var plugins = passedProps.plugins || [];\n  var pluginProps = plugins.reduce(function (acc, plugin) {\n    var name = plugin.name,\n        defaultValue = plugin.defaultValue;\n\n    if (name) {\n      var _name;\n\n      acc[name] = passedProps[name] !== undefined ? passedProps[name] : (_name = defaultProps[name]) != null ? _name : defaultValue;\n    }\n\n    return acc;\n  }, {});\n  return Object.assign({}, passedProps, pluginProps);\n}\nfunction getDataAttributeProps(reference, plugins) {\n  var propKeys = plugins ? Object.keys(getExtendedPassedProps(Object.assign({}, defaultProps, {\n    plugins: plugins\n  }))) : defaultKeys;\n  var props = propKeys.reduce(function (acc, key) {\n    var valueAsString = (reference.getAttribute(\"data-tippy-\" + key) || '').trim();\n\n    if (!valueAsString) {\n      return acc;\n    }\n\n    if (key === 'content') {\n      acc[key] = valueAsString;\n    } else {\n      try {\n        acc[key] = JSON.parse(valueAsString);\n      } catch (e) {\n        acc[key] = valueAsString;\n      }\n    }\n\n    return acc;\n  }, {});\n  return props;\n}\nfunction evaluateProps(reference, props) {\n  var out = Object.assign({}, props, {\n    content: invokeWithArgsOrReturn(props.content, [reference])\n  }, props.ignoreAttributes ? {} : getDataAttributeProps(reference, props.plugins));\n  out.aria = Object.assign({}, defaultProps.aria, out.aria);\n  out.aria = {\n    expanded: out.aria.expanded === 'auto' ? props.interactive : out.aria.expanded,\n    content: out.aria.content === 'auto' ? props.interactive ? null : 'describedby' : out.aria.content\n  };\n  return out;\n}\nfunction validateProps(partialProps, plugins) {\n  if (partialProps === void 0) {\n    partialProps = {};\n  }\n\n  if (plugins === void 0) {\n    plugins = [];\n  }\n\n  var keys = Object.keys(partialProps);\n  keys.forEach(function (prop) {\n    var nonPluginProps = removeProperties(defaultProps, Object.keys(pluginProps));\n    var didPassUnknownProp = !hasOwnProperty(nonPluginProps, prop); // Check if the prop exists in `plugins`\n\n    if (didPassUnknownProp) {\n      didPassUnknownProp = plugins.filter(function (plugin) {\n        return plugin.name === prop;\n      }).length === 0;\n    }\n\n    warnWhen(didPassUnknownProp, [\"`\" + prop + \"`\", \"is not a valid prop. You may have spelled it incorrectly, or if it's\", 'a plugin, forgot to pass it in an array as props.plugins.', '\\n\\n', 'All props: https://atomiks.github.io/tippyjs/v6/all-props/\\n', 'Plugins: https://atomiks.github.io/tippyjs/v6/plugins/'].join(' '));\n  });\n}\n\nvar innerHTML = function innerHTML() {\n  return 'innerHTML';\n};\n\nfunction dangerouslySetInnerHTML(element, html) {\n  element[innerHTML()] = html;\n}\n\nfunction createArrowElement(value) {\n  var arrow = div();\n\n  if (value === true) {\n    arrow.className = ARROW_CLASS;\n  } else {\n    arrow.className = SVG_ARROW_CLASS;\n\n    if (isElement(value)) {\n      arrow.appendChild(value);\n    } else {\n      dangerouslySetInnerHTML(arrow, value);\n    }\n  }\n\n  return arrow;\n}\n\nfunction setContent(content, props) {\n  if (isElement(props.content)) {\n    dangerouslySetInnerHTML(content, '');\n    content.appendChild(props.content);\n  } else if (typeof props.content !== 'function') {\n    if (props.allowHTML) {\n      dangerouslySetInnerHTML(content, props.content);\n    } else {\n      content.textContent = props.content;\n    }\n  }\n}\nfunction getChildren(popper) {\n  var box = popper.firstElementChild;\n  var boxChildren = arrayFrom(box.children);\n  return {\n    box: box,\n    content: boxChildren.find(function (node) {\n      return node.classList.contains(CONTENT_CLASS);\n    }),\n    arrow: boxChildren.find(function (node) {\n      return node.classList.contains(ARROW_CLASS) || node.classList.contains(SVG_ARROW_CLASS);\n    }),\n    backdrop: boxChildren.find(function (node) {\n      return node.classList.contains(BACKDROP_CLASS);\n    })\n  };\n}\nfunction render(instance) {\n  var popper = div();\n  var box = div();\n  box.className = BOX_CLASS;\n  box.setAttribute('data-state', 'hidden');\n  box.setAttribute('tabindex', '-1');\n  var content = div();\n  content.className = CONTENT_CLASS;\n  content.setAttribute('data-state', 'hidden');\n  setContent(content, instance.props);\n  popper.appendChild(box);\n  box.appendChild(content);\n  onUpdate(instance.props, instance.props);\n\n  function onUpdate(prevProps, nextProps) {\n    var _getChildren = getChildren(popper),\n        box = _getChildren.box,\n        content = _getChildren.content,\n        arrow = _getChildren.arrow;\n\n    if (nextProps.theme) {\n      box.setAttribute('data-theme', nextProps.theme);\n    } else {\n      box.removeAttribute('data-theme');\n    }\n\n    if (typeof nextProps.animation === 'string') {\n      box.setAttribute('data-animation', nextProps.animation);\n    } else {\n      box.removeAttribute('data-animation');\n    }\n\n    if (nextProps.inertia) {\n      box.setAttribute('data-inertia', '');\n    } else {\n      box.removeAttribute('data-inertia');\n    }\n\n    box.style.maxWidth = typeof nextProps.maxWidth === 'number' ? nextProps.maxWidth + \"px\" : nextProps.maxWidth;\n\n    if (nextProps.role) {\n      box.setAttribute('role', nextProps.role);\n    } else {\n      box.removeAttribute('role');\n    }\n\n    if (prevProps.content !== nextProps.content || prevProps.allowHTML !== nextProps.allowHTML) {\n      setContent(content, instance.props);\n    }\n\n    if (nextProps.arrow) {\n      if (!arrow) {\n        box.appendChild(createArrowElement(nextProps.arrow));\n      } else if (prevProps.arrow !== nextProps.arrow) {\n        box.removeChild(arrow);\n        box.appendChild(createArrowElement(nextProps.arrow));\n      }\n    } else if (arrow) {\n      box.removeChild(arrow);\n    }\n  }\n\n  return {\n    popper: popper,\n    onUpdate: onUpdate\n  };\n} // Runtime check to identify if the render function is the default one; this\n// way we can apply default CSS transitions logic and it can be tree-shaken away\n\nrender.$$tippy = true;\n\nvar idCounter = 1;\nvar mouseMoveListeners = []; // Used by `hideAll()`\n\nvar mountedInstances = [];\nfunction createTippy(reference, passedProps) {\n  var props = evaluateProps(reference, Object.assign({}, defaultProps, getExtendedPassedProps(removeUndefinedProps(passedProps)))); // ===========================================================================\n  // 🔒 Private members\n  // ===========================================================================\n\n  var showTimeout;\n  var hideTimeout;\n  var scheduleHideAnimationFrame;\n  var isVisibleFromClick = false;\n  var didHideDueToDocumentMouseDown = false;\n  var didTouchMove = false;\n  var ignoreOnFirstUpdate = false;\n  var lastTriggerEvent;\n  var currentTransitionEndListener;\n  var onFirstUpdate;\n  var listeners = [];\n  var debouncedOnMouseMove = debounce(onMouseMove, props.interactiveDebounce);\n  var currentTarget; // ===========================================================================\n  // 🔑 Public members\n  // ===========================================================================\n\n  var id = idCounter++;\n  var popperInstance = null;\n  var plugins = unique(props.plugins);\n  var state = {\n    // Is the instance currently enabled?\n    isEnabled: true,\n    // Is the tippy currently showing and not transitioning out?\n    isVisible: false,\n    // Has the instance been destroyed?\n    isDestroyed: false,\n    // Is the tippy currently mounted to the DOM?\n    isMounted: false,\n    // Has the tippy finished transitioning in?\n    isShown: false\n  };\n  var instance = {\n    // properties\n    id: id,\n    reference: reference,\n    popper: div(),\n    popperInstance: popperInstance,\n    props: props,\n    state: state,\n    plugins: plugins,\n    // methods\n    clearDelayTimeouts: clearDelayTimeouts,\n    setProps: setProps,\n    setContent: setContent,\n    show: show,\n    hide: hide,\n    hideWithInteractivity: hideWithInteractivity,\n    enable: enable,\n    disable: disable,\n    unmount: unmount,\n    destroy: destroy\n  }; // TODO: Investigate why this early return causes a TDZ error in the tests —\n  // it doesn't seem to happen in the browser\n\n  /* istanbul ignore if */\n\n  if (!props.render) {\n    if (process.env.NODE_ENV !== \"production\") {\n      errorWhen(true, 'render() function has not been supplied.');\n    }\n\n    return instance;\n  } // ===========================================================================\n  // Initial mutations\n  // ===========================================================================\n\n\n  var _props$render = props.render(instance),\n      popper = _props$render.popper,\n      onUpdate = _props$render.onUpdate;\n\n  popper.setAttribute('data-tippy-root', '');\n  popper.id = \"tippy-\" + instance.id;\n  instance.popper = popper;\n  reference._tippy = instance;\n  popper._tippy = instance;\n  var pluginsHooks = plugins.map(function (plugin) {\n    return plugin.fn(instance);\n  });\n  var hasAriaExpanded = reference.hasAttribute('aria-expanded');\n  addListeners();\n  handleAriaExpandedAttribute();\n  handleStyles();\n  invokeHook('onCreate', [instance]);\n\n  if (props.showOnCreate) {\n    scheduleShow();\n  } // Prevent a tippy with a delay from hiding if the cursor left then returned\n  // before it started hiding\n\n\n  popper.addEventListener('mouseenter', function () {\n    if (instance.props.interactive && instance.state.isVisible) {\n      instance.clearDelayTimeouts();\n    }\n  });\n  popper.addEventListener('mouseleave', function () {\n    if (instance.props.interactive && instance.props.trigger.indexOf('mouseenter') >= 0) {\n      getDocument().addEventListener('mousemove', debouncedOnMouseMove);\n    }\n  });\n  return instance; // ===========================================================================\n  // 🔒 Private methods\n  // ===========================================================================\n\n  function getNormalizedTouchSettings() {\n    var touch = instance.props.touch;\n    return Array.isArray(touch) ? touch : [touch, 0];\n  }\n\n  function getIsCustomTouchBehavior() {\n    return getNormalizedTouchSettings()[0] === 'hold';\n  }\n\n  function getIsDefaultRenderFn() {\n    var _instance$props$rende;\n\n    // @ts-ignore\n    return !!((_instance$props$rende = instance.props.render) != null && _instance$props$rende.$$tippy);\n  }\n\n  function getCurrentTarget() {\n    return currentTarget || reference;\n  }\n\n  function getDocument() {\n    var parent = getCurrentTarget().parentNode;\n    return parent ? getOwnerDocument(parent) : document;\n  }\n\n  function getDefaultTemplateChildren() {\n    return getChildren(popper);\n  }\n\n  function getDelay(isShow) {\n    // For touch or keyboard input, force `0` delay for UX reasons\n    // Also if the instance is mounted but not visible (transitioning out),\n    // ignore delay\n    if (instance.state.isMounted && !instance.state.isVisible || currentInput.isTouch || lastTriggerEvent && lastTriggerEvent.type === 'focus') {\n      return 0;\n    }\n\n    return getValueAtIndexOrReturn(instance.props.delay, isShow ? 0 : 1, defaultProps.delay);\n  }\n\n  function handleStyles(fromHide) {\n    if (fromHide === void 0) {\n      fromHide = false;\n    }\n\n    popper.style.pointerEvents = instance.props.interactive && !fromHide ? '' : 'none';\n    popper.style.zIndex = \"\" + instance.props.zIndex;\n  }\n\n  function invokeHook(hook, args, shouldInvokePropsHook) {\n    if (shouldInvokePropsHook === void 0) {\n      shouldInvokePropsHook = true;\n    }\n\n    pluginsHooks.forEach(function (pluginHooks) {\n      if (pluginHooks[hook]) {\n        pluginHooks[hook].apply(pluginHooks, args);\n      }\n    });\n\n    if (shouldInvokePropsHook) {\n      var _instance$props;\n\n      (_instance$props = instance.props)[hook].apply(_instance$props, args);\n    }\n  }\n\n  function handleAriaContentAttribute() {\n    var aria = instance.props.aria;\n\n    if (!aria.content) {\n      return;\n    }\n\n    var attr = \"aria-\" + aria.content;\n    var id = popper.id;\n    var nodes = normalizeToArray(instance.props.triggerTarget || reference);\n    nodes.forEach(function (node) {\n      var currentValue = node.getAttribute(attr);\n\n      if (instance.state.isVisible) {\n        node.setAttribute(attr, currentValue ? currentValue + \" \" + id : id);\n      } else {\n        var nextValue = currentValue && currentValue.replace(id, '').trim();\n\n        if (nextValue) {\n          node.setAttribute(attr, nextValue);\n        } else {\n          node.removeAttribute(attr);\n        }\n      }\n    });\n  }\n\n  function handleAriaExpandedAttribute() {\n    if (hasAriaExpanded || !instance.props.aria.expanded) {\n      return;\n    }\n\n    var nodes = normalizeToArray(instance.props.triggerTarget || reference);\n    nodes.forEach(function (node) {\n      if (instance.props.interactive) {\n        node.setAttribute('aria-expanded', instance.state.isVisible && node === getCurrentTarget() ? 'true' : 'false');\n      } else {\n        node.removeAttribute('aria-expanded');\n      }\n    });\n  }\n\n  function cleanupInteractiveMouseListeners() {\n    getDocument().removeEventListener('mousemove', debouncedOnMouseMove);\n    mouseMoveListeners = mouseMoveListeners.filter(function (listener) {\n      return listener !== debouncedOnMouseMove;\n    });\n  }\n\n  function onDocumentPress(event) {\n    // Moved finger to scroll instead of an intentional tap outside\n    if (currentInput.isTouch) {\n      if (didTouchMove || event.type === 'mousedown') {\n        return;\n      }\n    }\n\n    var actualTarget = event.composedPath && event.composedPath()[0] || event.target; // Clicked on interactive popper\n\n    if (instance.props.interactive && actualContains(popper, actualTarget)) {\n      return;\n    } // Clicked on the event listeners target\n\n\n    if (normalizeToArray(instance.props.triggerTarget || reference).some(function (el) {\n      return actualContains(el, actualTarget);\n    })) {\n      if (currentInput.isTouch) {\n        return;\n      }\n\n      if (instance.state.isVisible && instance.props.trigger.indexOf('click') >= 0) {\n        return;\n      }\n    } else {\n      invokeHook('onClickOutside', [instance, event]);\n    }\n\n    if (instance.props.hideOnClick === true) {\n      instance.clearDelayTimeouts();\n      instance.hide(); // `mousedown` event is fired right before `focus` if pressing the\n      // currentTarget. This lets a tippy with `focus` trigger know that it\n      // should not show\n\n      didHideDueToDocumentMouseDown = true;\n      setTimeout(function () {\n        didHideDueToDocumentMouseDown = false;\n      }); // The listener gets added in `scheduleShow()`, but this may be hiding it\n      // before it shows, and hide()'s early bail-out behavior can prevent it\n      // from being cleaned up\n\n      if (!instance.state.isMounted) {\n        removeDocumentPress();\n      }\n    }\n  }\n\n  function onTouchMove() {\n    didTouchMove = true;\n  }\n\n  function onTouchStart() {\n    didTouchMove = false;\n  }\n\n  function addDocumentPress() {\n    var doc = getDocument();\n    doc.addEventListener('mousedown', onDocumentPress, true);\n    doc.addEventListener('touchend', onDocumentPress, TOUCH_OPTIONS);\n    doc.addEventListener('touchstart', onTouchStart, TOUCH_OPTIONS);\n    doc.addEventListener('touchmove', onTouchMove, TOUCH_OPTIONS);\n  }\n\n  function removeDocumentPress() {\n    var doc = getDocument();\n    doc.removeEventListener('mousedown', onDocumentPress, true);\n    doc.removeEventListener('touchend', onDocumentPress, TOUCH_OPTIONS);\n    doc.removeEventListener('touchstart', onTouchStart, TOUCH_OPTIONS);\n    doc.removeEventListener('touchmove', onTouchMove, TOUCH_OPTIONS);\n  }\n\n  function onTransitionedOut(duration, callback) {\n    onTransitionEnd(duration, function () {\n      if (!instance.state.isVisible && popper.parentNode && popper.parentNode.contains(popper)) {\n        callback();\n      }\n    });\n  }\n\n  function onTransitionedIn(duration, callback) {\n    onTransitionEnd(duration, callback);\n  }\n\n  function onTransitionEnd(duration, callback) {\n    var box = getDefaultTemplateChildren().box;\n\n    function listener(event) {\n      if (event.target === box) {\n        updateTransitionEndListener(box, 'remove', listener);\n        callback();\n      }\n    } // Make callback synchronous if duration is 0\n    // `transitionend` won't fire otherwise\n\n\n    if (duration === 0) {\n      return callback();\n    }\n\n    updateTransitionEndListener(box, 'remove', currentTransitionEndListener);\n    updateTransitionEndListener(box, 'add', listener);\n    currentTransitionEndListener = listener;\n  }\n\n  function on(eventType, handler, options) {\n    if (options === void 0) {\n      options = false;\n    }\n\n    var nodes = normalizeToArray(instance.props.triggerTarget || reference);\n    nodes.forEach(function (node) {\n      node.addEventListener(eventType, handler, options);\n      listeners.push({\n        node: node,\n        eventType: eventType,\n        handler: handler,\n        options: options\n      });\n    });\n  }\n\n  function addListeners() {\n    if (getIsCustomTouchBehavior()) {\n      on('touchstart', onTrigger, {\n        passive: true\n      });\n      on('touchend', onMouseLeave, {\n        passive: true\n      });\n    }\n\n    splitBySpaces(instance.props.trigger).forEach(function (eventType) {\n      if (eventType === 'manual') {\n        return;\n      }\n\n      on(eventType, onTrigger);\n\n      switch (eventType) {\n        case 'mouseenter':\n          on('mouseleave', onMouseLeave);\n          break;\n\n        case 'focus':\n          on(isIE11 ? 'focusout' : 'blur', onBlurOrFocusOut);\n          break;\n\n        case 'focusin':\n          on('focusout', onBlurOrFocusOut);\n          break;\n      }\n    });\n  }\n\n  function removeListeners() {\n    listeners.forEach(function (_ref) {\n      var node = _ref.node,\n          eventType = _ref.eventType,\n          handler = _ref.handler,\n          options = _ref.options;\n      node.removeEventListener(eventType, handler, options);\n    });\n    listeners = [];\n  }\n\n  function onTrigger(event) {\n    var _lastTriggerEvent;\n\n    var shouldScheduleClickHide = false;\n\n    if (!instance.state.isEnabled || isEventListenerStopped(event) || didHideDueToDocumentMouseDown) {\n      return;\n    }\n\n    var wasFocused = ((_lastTriggerEvent = lastTriggerEvent) == null ? void 0 : _lastTriggerEvent.type) === 'focus';\n    lastTriggerEvent = event;\n    currentTarget = event.currentTarget;\n    handleAriaExpandedAttribute();\n\n    if (!instance.state.isVisible && isMouseEvent(event)) {\n      // If scrolling, `mouseenter` events can be fired if the cursor lands\n      // over a new target, but `mousemove` events don't get fired. This\n      // causes interactive tooltips to get stuck open until the cursor is\n      // moved\n      mouseMoveListeners.forEach(function (listener) {\n        return listener(event);\n      });\n    } // Toggle show/hide when clicking click-triggered tooltips\n\n\n    if (event.type === 'click' && (instance.props.trigger.indexOf('mouseenter') < 0 || isVisibleFromClick) && instance.props.hideOnClick !== false && instance.state.isVisible) {\n      shouldScheduleClickHide = true;\n    } else {\n      scheduleShow(event);\n    }\n\n    if (event.type === 'click') {\n      isVisibleFromClick = !shouldScheduleClickHide;\n    }\n\n    if (shouldScheduleClickHide && !wasFocused) {\n      scheduleHide(event);\n    }\n  }\n\n  function onMouseMove(event) {\n    var target = event.target;\n    var isCursorOverReferenceOrPopper = getCurrentTarget().contains(target) || popper.contains(target);\n\n    if (event.type === 'mousemove' && isCursorOverReferenceOrPopper) {\n      return;\n    }\n\n    var popperTreeData = getNestedPopperTree().concat(popper).map(function (popper) {\n      var _instance$popperInsta;\n\n      var instance = popper._tippy;\n      var state = (_instance$popperInsta = instance.popperInstance) == null ? void 0 : _instance$popperInsta.state;\n\n      if (state) {\n        return {\n          popperRect: popper.getBoundingClientRect(),\n          popperState: state,\n          props: props\n        };\n      }\n\n      return null;\n    }).filter(Boolean);\n\n    if (isCursorOutsideInteractiveBorder(popperTreeData, event)) {\n      cleanupInteractiveMouseListeners();\n      scheduleHide(event);\n    }\n  }\n\n  function onMouseLeave(event) {\n    var shouldBail = isEventListenerStopped(event) || instance.props.trigger.indexOf('click') >= 0 && isVisibleFromClick;\n\n    if (shouldBail) {\n      return;\n    }\n\n    if (instance.props.interactive) {\n      instance.hideWithInteractivity(event);\n      return;\n    }\n\n    scheduleHide(event);\n  }\n\n  function onBlurOrFocusOut(event) {\n    if (instance.props.trigger.indexOf('focusin') < 0 && event.target !== getCurrentTarget()) {\n      return;\n    } // If focus was moved to within the popper\n\n\n    if (instance.props.interactive && event.relatedTarget && popper.contains(event.relatedTarget)) {\n      return;\n    }\n\n    scheduleHide(event);\n  }\n\n  function isEventListenerStopped(event) {\n    return currentInput.isTouch ? getIsCustomTouchBehavior() !== event.type.indexOf('touch') >= 0 : false;\n  }\n\n  function createPopperInstance() {\n    destroyPopperInstance();\n    var _instance$props2 = instance.props,\n        popperOptions = _instance$props2.popperOptions,\n        placement = _instance$props2.placement,\n        offset = _instance$props2.offset,\n        getReferenceClientRect = _instance$props2.getReferenceClientRect,\n        moveTransition = _instance$props2.moveTransition;\n    var arrow = getIsDefaultRenderFn() ? getChildren(popper).arrow : null;\n    var computedReference = getReferenceClientRect ? {\n      getBoundingClientRect: getReferenceClientRect,\n      contextElement: getReferenceClientRect.contextElement || getCurrentTarget()\n    } : reference;\n    var tippyModifier = {\n      name: '$$tippy',\n      enabled: true,\n      phase: 'beforeWrite',\n      requires: ['computeStyles'],\n      fn: function fn(_ref2) {\n        var state = _ref2.state;\n\n        if (getIsDefaultRenderFn()) {\n          var _getDefaultTemplateCh = getDefaultTemplateChildren(),\n              box = _getDefaultTemplateCh.box;\n\n          ['placement', 'reference-hidden', 'escaped'].forEach(function (attr) {\n            if (attr === 'placement') {\n              box.setAttribute('data-placement', state.placement);\n            } else {\n              if (state.attributes.popper[\"data-popper-\" + attr]) {\n                box.setAttribute(\"data-\" + attr, '');\n              } else {\n                box.removeAttribute(\"data-\" + attr);\n              }\n            }\n          });\n          state.attributes.popper = {};\n        }\n      }\n    };\n    var modifiers = [{\n      name: 'offset',\n      options: {\n        offset: offset\n      }\n    }, {\n      name: 'preventOverflow',\n      options: {\n        padding: {\n          top: 2,\n          bottom: 2,\n          left: 5,\n          right: 5\n        }\n      }\n    }, {\n      name: 'flip',\n      options: {\n        padding: 5\n      }\n    }, {\n      name: 'computeStyles',\n      options: {\n        adaptive: !moveTransition\n      }\n    }, tippyModifier];\n\n    if (getIsDefaultRenderFn() && arrow) {\n      modifiers.push({\n        name: 'arrow',\n        options: {\n          element: arrow,\n          padding: 3\n        }\n      });\n    }\n\n    modifiers.push.apply(modifiers, (popperOptions == null ? void 0 : popperOptions.modifiers) || []);\n    instance.popperInstance = createPopper(computedReference, popper, Object.assign({}, popperOptions, {\n      placement: placement,\n      onFirstUpdate: onFirstUpdate,\n      modifiers: modifiers\n    }));\n  }\n\n  function destroyPopperInstance() {\n    if (instance.popperInstance) {\n      instance.popperInstance.destroy();\n      instance.popperInstance = null;\n    }\n  }\n\n  function mount() {\n    var appendTo = instance.props.appendTo;\n    var parentNode; // By default, we'll append the popper to the triggerTargets's parentNode so\n    // it's directly after the reference element so the elements inside the\n    // tippy can be tabbed to\n    // If there are clipping issues, the user can specify a different appendTo\n    // and ensure focus management is handled correctly manually\n\n    var node = getCurrentTarget();\n\n    if (instance.props.interactive && appendTo === TIPPY_DEFAULT_APPEND_TO || appendTo === 'parent') {\n      parentNode = node.parentNode;\n    } else {\n      parentNode = invokeWithArgsOrReturn(appendTo, [node]);\n    } // The popper element needs to exist on the DOM before its position can be\n    // updated as Popper needs to read its dimensions\n\n\n    if (!parentNode.contains(popper)) {\n      parentNode.appendChild(popper);\n    }\n\n    instance.state.isMounted = true;\n    createPopperInstance();\n    /* istanbul ignore else */\n\n    if (process.env.NODE_ENV !== \"production\") {\n      // Accessibility check\n      warnWhen(instance.props.interactive && appendTo === defaultProps.appendTo && node.nextElementSibling !== popper, ['Interactive tippy element may not be accessible via keyboard', 'navigation because it is not directly after the reference element', 'in the DOM source order.', '\\n\\n', 'Using a wrapper <div> or <span> tag around the reference element', 'solves this by creating a new parentNode context.', '\\n\\n', 'Specifying `appendTo: document.body` silences this warning, but it', 'assumes you are using a focus management solution to handle', 'keyboard navigation.', '\\n\\n', 'See: https://atomiks.github.io/tippyjs/v6/accessibility/#interactivity'].join(' '));\n    }\n  }\n\n  function getNestedPopperTree() {\n    return arrayFrom(popper.querySelectorAll('[data-tippy-root]'));\n  }\n\n  function scheduleShow(event) {\n    instance.clearDelayTimeouts();\n\n    if (event) {\n      invokeHook('onTrigger', [instance, event]);\n    }\n\n    addDocumentPress();\n    var delay = getDelay(true);\n\n    var _getNormalizedTouchSe = getNormalizedTouchSettings(),\n        touchValue = _getNormalizedTouchSe[0],\n        touchDelay = _getNormalizedTouchSe[1];\n\n    if (currentInput.isTouch && touchValue === 'hold' && touchDelay) {\n      delay = touchDelay;\n    }\n\n    if (delay) {\n      showTimeout = setTimeout(function () {\n        instance.show();\n      }, delay);\n    } else {\n      instance.show();\n    }\n  }\n\n  function scheduleHide(event) {\n    instance.clearDelayTimeouts();\n    invokeHook('onUntrigger', [instance, event]);\n\n    if (!instance.state.isVisible) {\n      removeDocumentPress();\n      return;\n    } // For interactive tippies, scheduleHide is added to a document.body handler\n    // from onMouseLeave so must intercept scheduled hides from mousemove/leave\n    // events when trigger contains mouseenter and click, and the tip is\n    // currently shown as a result of a click.\n\n\n    if (instance.props.trigger.indexOf('mouseenter') >= 0 && instance.props.trigger.indexOf('click') >= 0 && ['mouseleave', 'mousemove'].indexOf(event.type) >= 0 && isVisibleFromClick) {\n      return;\n    }\n\n    var delay = getDelay(false);\n\n    if (delay) {\n      hideTimeout = setTimeout(function () {\n        if (instance.state.isVisible) {\n          instance.hide();\n        }\n      }, delay);\n    } else {\n      // Fixes a `transitionend` problem when it fires 1 frame too\n      // late sometimes, we don't want hide() to be called.\n      scheduleHideAnimationFrame = requestAnimationFrame(function () {\n        instance.hide();\n      });\n    }\n  } // ===========================================================================\n  // 🔑 Public methods\n  // ===========================================================================\n\n\n  function enable() {\n    instance.state.isEnabled = true;\n  }\n\n  function disable() {\n    // Disabling the instance should also hide it\n    // https://github.com/atomiks/tippy.js-react/issues/106\n    instance.hide();\n    instance.state.isEnabled = false;\n  }\n\n  function clearDelayTimeouts() {\n    clearTimeout(showTimeout);\n    clearTimeout(hideTimeout);\n    cancelAnimationFrame(scheduleHideAnimationFrame);\n  }\n\n  function setProps(partialProps) {\n    /* istanbul ignore else */\n    if (process.env.NODE_ENV !== \"production\") {\n      warnWhen(instance.state.isDestroyed, createMemoryLeakWarning('setProps'));\n    }\n\n    if (instance.state.isDestroyed) {\n      return;\n    }\n\n    invokeHook('onBeforeUpdate', [instance, partialProps]);\n    removeListeners();\n    var prevProps = instance.props;\n    var nextProps = evaluateProps(reference, Object.assign({}, prevProps, removeUndefinedProps(partialProps), {\n      ignoreAttributes: true\n    }));\n    instance.props = nextProps;\n    addListeners();\n\n    if (prevProps.interactiveDebounce !== nextProps.interactiveDebounce) {\n      cleanupInteractiveMouseListeners();\n      debouncedOnMouseMove = debounce(onMouseMove, nextProps.interactiveDebounce);\n    } // Ensure stale aria-expanded attributes are removed\n\n\n    if (prevProps.triggerTarget && !nextProps.triggerTarget) {\n      normalizeToArray(prevProps.triggerTarget).forEach(function (node) {\n        node.removeAttribute('aria-expanded');\n      });\n    } else if (nextProps.triggerTarget) {\n      reference.removeAttribute('aria-expanded');\n    }\n\n    handleAriaExpandedAttribute();\n    handleStyles();\n\n    if (onUpdate) {\n      onUpdate(prevProps, nextProps);\n    }\n\n    if (instance.popperInstance) {\n      createPopperInstance(); // Fixes an issue with nested tippies if they are all getting re-rendered,\n      // and the nested ones get re-rendered first.\n      // https://github.com/atomiks/tippyjs-react/issues/177\n      // TODO: find a cleaner / more efficient solution(!)\n\n      getNestedPopperTree().forEach(function (nestedPopper) {\n        // React (and other UI libs likely) requires a rAF wrapper as it flushes\n        // its work in one\n        requestAnimationFrame(nestedPopper._tippy.popperInstance.forceUpdate);\n      });\n    }\n\n    invokeHook('onAfterUpdate', [instance, partialProps]);\n  }\n\n  function setContent(content) {\n    instance.setProps({\n      content: content\n    });\n  }\n\n  function show() {\n    /* istanbul ignore else */\n    if (process.env.NODE_ENV !== \"production\") {\n      warnWhen(instance.state.isDestroyed, createMemoryLeakWarning('show'));\n    } // Early bail-out\n\n\n    var isAlreadyVisible = instance.state.isVisible;\n    var isDestroyed = instance.state.isDestroyed;\n    var isDisabled = !instance.state.isEnabled;\n    var isTouchAndTouchDisabled = currentInput.isTouch && !instance.props.touch;\n    var duration = getValueAtIndexOrReturn(instance.props.duration, 0, defaultProps.duration);\n\n    if (isAlreadyVisible || isDestroyed || isDisabled || isTouchAndTouchDisabled) {\n      return;\n    } // Normalize `disabled` behavior across browsers.\n    // Firefox allows events on disabled elements, but Chrome doesn't.\n    // Using a wrapper element (i.e. <span>) is recommended.\n\n\n    if (getCurrentTarget().hasAttribute('disabled')) {\n      return;\n    }\n\n    invokeHook('onShow', [instance], false);\n\n    if (instance.props.onShow(instance) === false) {\n      return;\n    }\n\n    instance.state.isVisible = true;\n\n    if (getIsDefaultRenderFn()) {\n      popper.style.visibility = 'visible';\n    }\n\n    handleStyles();\n    addDocumentPress();\n\n    if (!instance.state.isMounted) {\n      popper.style.transition = 'none';\n    } // If flipping to the opposite side after hiding at least once, the\n    // animation will use the wrong placement without resetting the duration\n\n\n    if (getIsDefaultRenderFn()) {\n      var _getDefaultTemplateCh2 = getDefaultTemplateChildren(),\n          box = _getDefaultTemplateCh2.box,\n          content = _getDefaultTemplateCh2.content;\n\n      setTransitionDuration([box, content], 0);\n    }\n\n    onFirstUpdate = function onFirstUpdate() {\n      var _instance$popperInsta2;\n\n      if (!instance.state.isVisible || ignoreOnFirstUpdate) {\n        return;\n      }\n\n      ignoreOnFirstUpdate = true; // reflow\n\n      void popper.offsetHeight;\n      popper.style.transition = instance.props.moveTransition;\n\n      if (getIsDefaultRenderFn() && instance.props.animation) {\n        var _getDefaultTemplateCh3 = getDefaultTemplateChildren(),\n            _box = _getDefaultTemplateCh3.box,\n            _content = _getDefaultTemplateCh3.content;\n\n        setTransitionDuration([_box, _content], duration);\n        setVisibilityState([_box, _content], 'visible');\n      }\n\n      handleAriaContentAttribute();\n      handleAriaExpandedAttribute();\n      pushIfUnique(mountedInstances, instance); // certain modifiers (e.g. `maxSize`) require a second update after the\n      // popper has been positioned for the first time\n\n      (_instance$popperInsta2 = instance.popperInstance) == null ? void 0 : _instance$popperInsta2.forceUpdate();\n      invokeHook('onMount', [instance]);\n\n      if (instance.props.animation && getIsDefaultRenderFn()) {\n        onTransitionedIn(duration, function () {\n          instance.state.isShown = true;\n          invokeHook('onShown', [instance]);\n        });\n      }\n    };\n\n    mount();\n  }\n\n  function hide() {\n    /* istanbul ignore else */\n    if (process.env.NODE_ENV !== \"production\") {\n      warnWhen(instance.state.isDestroyed, createMemoryLeakWarning('hide'));\n    } // Early bail-out\n\n\n    var isAlreadyHidden = !instance.state.isVisible;\n    var isDestroyed = instance.state.isDestroyed;\n    var isDisabled = !instance.state.isEnabled;\n    var duration = getValueAtIndexOrReturn(instance.props.duration, 1, defaultProps.duration);\n\n    if (isAlreadyHidden || isDestroyed || isDisabled) {\n      return;\n    }\n\n    invokeHook('onHide', [instance], false);\n\n    if (instance.props.onHide(instance) === false) {\n      return;\n    }\n\n    instance.state.isVisible = false;\n    instance.state.isShown = false;\n    ignoreOnFirstUpdate = false;\n    isVisibleFromClick = false;\n\n    if (getIsDefaultRenderFn()) {\n      popper.style.visibility = 'hidden';\n    }\n\n    cleanupInteractiveMouseListeners();\n    removeDocumentPress();\n    handleStyles(true);\n\n    if (getIsDefaultRenderFn()) {\n      var _getDefaultTemplateCh4 = getDefaultTemplateChildren(),\n          box = _getDefaultTemplateCh4.box,\n          content = _getDefaultTemplateCh4.content;\n\n      if (instance.props.animation) {\n        setTransitionDuration([box, content], duration);\n        setVisibilityState([box, content], 'hidden');\n      }\n    }\n\n    handleAriaContentAttribute();\n    handleAriaExpandedAttribute();\n\n    if (instance.props.animation) {\n      if (getIsDefaultRenderFn()) {\n        onTransitionedOut(duration, instance.unmount);\n      }\n    } else {\n      instance.unmount();\n    }\n  }\n\n  function hideWithInteractivity(event) {\n    /* istanbul ignore else */\n    if (process.env.NODE_ENV !== \"production\") {\n      warnWhen(instance.state.isDestroyed, createMemoryLeakWarning('hideWithInteractivity'));\n    }\n\n    getDocument().addEventListener('mousemove', debouncedOnMouseMove);\n    pushIfUnique(mouseMoveListeners, debouncedOnMouseMove);\n    debouncedOnMouseMove(event);\n  }\n\n  function unmount() {\n    /* istanbul ignore else */\n    if (process.env.NODE_ENV !== \"production\") {\n      warnWhen(instance.state.isDestroyed, createMemoryLeakWarning('unmount'));\n    }\n\n    if (instance.state.isVisible) {\n      instance.hide();\n    }\n\n    if (!instance.state.isMounted) {\n      return;\n    }\n\n    destroyPopperInstance(); // If a popper is not interactive, it will be appended outside the popper\n    // tree by default. This seems mainly for interactive tippies, but we should\n    // find a workaround if possible\n\n    getNestedPopperTree().forEach(function (nestedPopper) {\n      nestedPopper._tippy.unmount();\n    });\n\n    if (popper.parentNode) {\n      popper.parentNode.removeChild(popper);\n    }\n\n    mountedInstances = mountedInstances.filter(function (i) {\n      return i !== instance;\n    });\n    instance.state.isMounted = false;\n    invokeHook('onHidden', [instance]);\n  }\n\n  function destroy() {\n    /* istanbul ignore else */\n    if (process.env.NODE_ENV !== \"production\") {\n      warnWhen(instance.state.isDestroyed, createMemoryLeakWarning('destroy'));\n    }\n\n    if (instance.state.isDestroyed) {\n      return;\n    }\n\n    instance.clearDelayTimeouts();\n    instance.unmount();\n    removeListeners();\n    delete reference._tippy;\n    instance.state.isDestroyed = true;\n    invokeHook('onDestroy', [instance]);\n  }\n}\n\nfunction tippy(targets, optionalProps) {\n  if (optionalProps === void 0) {\n    optionalProps = {};\n  }\n\n  var plugins = defaultProps.plugins.concat(optionalProps.plugins || []);\n  /* istanbul ignore else */\n\n  if (process.env.NODE_ENV !== \"production\") {\n    validateTargets(targets);\n    validateProps(optionalProps, plugins);\n  }\n\n  bindGlobalEventListeners();\n  var passedProps = Object.assign({}, optionalProps, {\n    plugins: plugins\n  });\n  var elements = getArrayOfElements(targets);\n  /* istanbul ignore else */\n\n  if (process.env.NODE_ENV !== \"production\") {\n    var isSingleContentElement = isElement(passedProps.content);\n    var isMoreThanOneReferenceElement = elements.length > 1;\n    warnWhen(isSingleContentElement && isMoreThanOneReferenceElement, ['tippy() was passed an Element as the `content` prop, but more than', 'one tippy instance was created by this invocation. This means the', 'content element will only be appended to the last tippy instance.', '\\n\\n', 'Instead, pass the .innerHTML of the element, or use a function that', 'returns a cloned version of the element instead.', '\\n\\n', '1) content: element.innerHTML\\n', '2) content: () => element.cloneNode(true)'].join(' '));\n  }\n\n  var instances = elements.reduce(function (acc, reference) {\n    var instance = reference && createTippy(reference, passedProps);\n\n    if (instance) {\n      acc.push(instance);\n    }\n\n    return acc;\n  }, []);\n  return isElement(targets) ? instances[0] : instances;\n}\n\ntippy.defaultProps = defaultProps;\ntippy.setDefaultProps = setDefaultProps;\ntippy.currentInput = currentInput;\nvar hideAll = function hideAll(_temp) {\n  var _ref = _temp === void 0 ? {} : _temp,\n      excludedReferenceOrInstance = _ref.exclude,\n      duration = _ref.duration;\n\n  mountedInstances.forEach(function (instance) {\n    var isExcluded = false;\n\n    if (excludedReferenceOrInstance) {\n      isExcluded = isReferenceElement(excludedReferenceOrInstance) ? instance.reference === excludedReferenceOrInstance : instance.popper === excludedReferenceOrInstance.popper;\n    }\n\n    if (!isExcluded) {\n      var originalDuration = instance.props.duration;\n      instance.setProps({\n        duration: duration\n      });\n      instance.hide();\n\n      if (!instance.state.isDestroyed) {\n        instance.setProps({\n          duration: originalDuration\n        });\n      }\n    }\n  });\n};\n\n// every time the popper is destroyed (i.e. a new target), removing the styles\n// and causing transitions to break for singletons when the console is open, but\n// most notably for non-transform styles being used, `gpuAcceleration: false`.\n\nvar applyStylesModifier = Object.assign({}, applyStyles, {\n  effect: function effect(_ref) {\n    var state = _ref.state;\n    var initialStyles = {\n      popper: {\n        position: state.options.strategy,\n        left: '0',\n        top: '0',\n        margin: '0'\n      },\n      arrow: {\n        position: 'absolute'\n      },\n      reference: {}\n    };\n    Object.assign(state.elements.popper.style, initialStyles.popper);\n    state.styles = initialStyles;\n\n    if (state.elements.arrow) {\n      Object.assign(state.elements.arrow.style, initialStyles.arrow);\n    } // intentionally return no cleanup function\n    // return () => { ... }\n\n  }\n});\n\nvar createSingleton = function createSingleton(tippyInstances, optionalProps) {\n  var _optionalProps$popper;\n\n  if (optionalProps === void 0) {\n    optionalProps = {};\n  }\n\n  /* istanbul ignore else */\n  if (process.env.NODE_ENV !== \"production\") {\n    errorWhen(!Array.isArray(tippyInstances), ['The first argument passed to createSingleton() must be an array of', 'tippy instances. The passed value was', String(tippyInstances)].join(' '));\n  }\n\n  var individualInstances = tippyInstances;\n  var references = [];\n  var triggerTargets = [];\n  var currentTarget;\n  var overrides = optionalProps.overrides;\n  var interceptSetPropsCleanups = [];\n  var shownOnCreate = false;\n\n  function setTriggerTargets() {\n    triggerTargets = individualInstances.map(function (instance) {\n      return normalizeToArray(instance.props.triggerTarget || instance.reference);\n    }).reduce(function (acc, item) {\n      return acc.concat(item);\n    }, []);\n  }\n\n  function setReferences() {\n    references = individualInstances.map(function (instance) {\n      return instance.reference;\n    });\n  }\n\n  function enableInstances(isEnabled) {\n    individualInstances.forEach(function (instance) {\n      if (isEnabled) {\n        instance.enable();\n      } else {\n        instance.disable();\n      }\n    });\n  }\n\n  function interceptSetProps(singleton) {\n    return individualInstances.map(function (instance) {\n      var originalSetProps = instance.setProps;\n\n      instance.setProps = function (props) {\n        originalSetProps(props);\n\n        if (instance.reference === currentTarget) {\n          singleton.setProps(props);\n        }\n      };\n\n      return function () {\n        instance.setProps = originalSetProps;\n      };\n    });\n  } // have to pass singleton, as it maybe undefined on first call\n\n\n  function prepareInstance(singleton, target) {\n    var index = triggerTargets.indexOf(target); // bail-out\n\n    if (target === currentTarget) {\n      return;\n    }\n\n    currentTarget = target;\n    var overrideProps = (overrides || []).concat('content').reduce(function (acc, prop) {\n      acc[prop] = individualInstances[index].props[prop];\n      return acc;\n    }, {});\n    singleton.setProps(Object.assign({}, overrideProps, {\n      getReferenceClientRect: typeof overrideProps.getReferenceClientRect === 'function' ? overrideProps.getReferenceClientRect : function () {\n        var _references$index;\n\n        return (_references$index = references[index]) == null ? void 0 : _references$index.getBoundingClientRect();\n      }\n    }));\n  }\n\n  enableInstances(false);\n  setReferences();\n  setTriggerTargets();\n  var plugin = {\n    fn: function fn() {\n      return {\n        onDestroy: function onDestroy() {\n          enableInstances(true);\n        },\n        onHidden: function onHidden() {\n          currentTarget = null;\n        },\n        onClickOutside: function onClickOutside(instance) {\n          if (instance.props.showOnCreate && !shownOnCreate) {\n            shownOnCreate = true;\n            currentTarget = null;\n          }\n        },\n        onShow: function onShow(instance) {\n          if (instance.props.showOnCreate && !shownOnCreate) {\n            shownOnCreate = true;\n            prepareInstance(instance, references[0]);\n          }\n        },\n        onTrigger: function onTrigger(instance, event) {\n          prepareInstance(instance, event.currentTarget);\n        }\n      };\n    }\n  };\n  var singleton = tippy(div(), Object.assign({}, removeProperties(optionalProps, ['overrides']), {\n    plugins: [plugin].concat(optionalProps.plugins || []),\n    triggerTarget: triggerTargets,\n    popperOptions: Object.assign({}, optionalProps.popperOptions, {\n      modifiers: [].concat(((_optionalProps$popper = optionalProps.popperOptions) == null ? void 0 : _optionalProps$popper.modifiers) || [], [applyStylesModifier])\n    })\n  }));\n  var originalShow = singleton.show;\n\n  singleton.show = function (target) {\n    originalShow(); // first time, showOnCreate or programmatic call with no params\n    // default to showing first instance\n\n    if (!currentTarget && target == null) {\n      return prepareInstance(singleton, references[0]);\n    } // triggered from event (do nothing as prepareInstance already called by onTrigger)\n    // programmatic call with no params when already visible (do nothing again)\n\n\n    if (currentTarget && target == null) {\n      return;\n    } // target is index of instance\n\n\n    if (typeof target === 'number') {\n      return references[target] && prepareInstance(singleton, references[target]);\n    } // target is a child tippy instance\n\n\n    if (individualInstances.indexOf(target) >= 0) {\n      var ref = target.reference;\n      return prepareInstance(singleton, ref);\n    } // target is a ReferenceElement\n\n\n    if (references.indexOf(target) >= 0) {\n      return prepareInstance(singleton, target);\n    }\n  };\n\n  singleton.showNext = function () {\n    var first = references[0];\n\n    if (!currentTarget) {\n      return singleton.show(0);\n    }\n\n    var index = references.indexOf(currentTarget);\n    singleton.show(references[index + 1] || first);\n  };\n\n  singleton.showPrevious = function () {\n    var last = references[references.length - 1];\n\n    if (!currentTarget) {\n      return singleton.show(last);\n    }\n\n    var index = references.indexOf(currentTarget);\n    var target = references[index - 1] || last;\n    singleton.show(target);\n  };\n\n  var originalSetProps = singleton.setProps;\n\n  singleton.setProps = function (props) {\n    overrides = props.overrides || overrides;\n    originalSetProps(props);\n  };\n\n  singleton.setInstances = function (nextInstances) {\n    enableInstances(true);\n    interceptSetPropsCleanups.forEach(function (fn) {\n      return fn();\n    });\n    individualInstances = nextInstances;\n    enableInstances(false);\n    setReferences();\n    setTriggerTargets();\n    interceptSetPropsCleanups = interceptSetProps(singleton);\n    singleton.setProps({\n      triggerTarget: triggerTargets\n    });\n  };\n\n  interceptSetPropsCleanups = interceptSetProps(singleton);\n  return singleton;\n};\n\nvar BUBBLING_EVENTS_MAP = {\n  mouseover: 'mouseenter',\n  focusin: 'focus',\n  click: 'click'\n};\n/**\n * Creates a delegate instance that controls the creation of tippy instances\n * for child elements (`target` CSS selector).\n */\n\nfunction delegate(targets, props) {\n  /* istanbul ignore else */\n  if (process.env.NODE_ENV !== \"production\") {\n    errorWhen(!(props && props.target), ['You must specity a `target` prop indicating a CSS selector string matching', 'the target elements that should receive a tippy.'].join(' '));\n  }\n\n  var listeners = [];\n  var childTippyInstances = [];\n  var disabled = false;\n  var target = props.target;\n  var nativeProps = removeProperties(props, ['target']);\n  var parentProps = Object.assign({}, nativeProps, {\n    trigger: 'manual',\n    touch: false\n  });\n  var childProps = Object.assign({\n    touch: defaultProps.touch\n  }, nativeProps, {\n    showOnCreate: true\n  });\n  var returnValue = tippy(targets, parentProps);\n  var normalizedReturnValue = normalizeToArray(returnValue);\n\n  function onTrigger(event) {\n    if (!event.target || disabled) {\n      return;\n    }\n\n    var targetNode = event.target.closest(target);\n\n    if (!targetNode) {\n      return;\n    } // Get relevant trigger with fallbacks:\n    // 1. Check `data-tippy-trigger` attribute on target node\n    // 2. Fallback to `trigger` passed to `delegate()`\n    // 3. Fallback to `defaultProps.trigger`\n\n\n    var trigger = targetNode.getAttribute('data-tippy-trigger') || props.trigger || defaultProps.trigger; // @ts-ignore\n\n    if (targetNode._tippy) {\n      return;\n    }\n\n    if (event.type === 'touchstart' && typeof childProps.touch === 'boolean') {\n      return;\n    }\n\n    if (event.type !== 'touchstart' && trigger.indexOf(BUBBLING_EVENTS_MAP[event.type]) < 0) {\n      return;\n    }\n\n    var instance = tippy(targetNode, childProps);\n\n    if (instance) {\n      childTippyInstances = childTippyInstances.concat(instance);\n    }\n  }\n\n  function on(node, eventType, handler, options) {\n    if (options === void 0) {\n      options = false;\n    }\n\n    node.addEventListener(eventType, handler, options);\n    listeners.push({\n      node: node,\n      eventType: eventType,\n      handler: handler,\n      options: options\n    });\n  }\n\n  function addEventListeners(instance) {\n    var reference = instance.reference;\n    on(reference, 'touchstart', onTrigger, TOUCH_OPTIONS);\n    on(reference, 'mouseover', onTrigger);\n    on(reference, 'focusin', onTrigger);\n    on(reference, 'click', onTrigger);\n  }\n\n  function removeEventListeners() {\n    listeners.forEach(function (_ref) {\n      var node = _ref.node,\n          eventType = _ref.eventType,\n          handler = _ref.handler,\n          options = _ref.options;\n      node.removeEventListener(eventType, handler, options);\n    });\n    listeners = [];\n  }\n\n  function applyMutations(instance) {\n    var originalDestroy = instance.destroy;\n    var originalEnable = instance.enable;\n    var originalDisable = instance.disable;\n\n    instance.destroy = function (shouldDestroyChildInstances) {\n      if (shouldDestroyChildInstances === void 0) {\n        shouldDestroyChildInstances = true;\n      }\n\n      if (shouldDestroyChildInstances) {\n        childTippyInstances.forEach(function (instance) {\n          instance.destroy();\n        });\n      }\n\n      childTippyInstances = [];\n      removeEventListeners();\n      originalDestroy();\n    };\n\n    instance.enable = function () {\n      originalEnable();\n      childTippyInstances.forEach(function (instance) {\n        return instance.enable();\n      });\n      disabled = false;\n    };\n\n    instance.disable = function () {\n      originalDisable();\n      childTippyInstances.forEach(function (instance) {\n        return instance.disable();\n      });\n      disabled = true;\n    };\n\n    addEventListeners(instance);\n  }\n\n  normalizedReturnValue.forEach(applyMutations);\n  return returnValue;\n}\n\nvar animateFill = {\n  name: 'animateFill',\n  defaultValue: false,\n  fn: function fn(instance) {\n    var _instance$props$rende;\n\n    // @ts-ignore\n    if (!((_instance$props$rende = instance.props.render) != null && _instance$props$rende.$$tippy)) {\n      if (process.env.NODE_ENV !== \"production\") {\n        errorWhen(instance.props.animateFill, 'The `animateFill` plugin requires the default render function.');\n      }\n\n      return {};\n    }\n\n    var _getChildren = getChildren(instance.popper),\n        box = _getChildren.box,\n        content = _getChildren.content;\n\n    var backdrop = instance.props.animateFill ? createBackdropElement() : null;\n    return {\n      onCreate: function onCreate() {\n        if (backdrop) {\n          box.insertBefore(backdrop, box.firstElementChild);\n          box.setAttribute('data-animatefill', '');\n          box.style.overflow = 'hidden';\n          instance.setProps({\n            arrow: false,\n            animation: 'shift-away'\n          });\n        }\n      },\n      onMount: function onMount() {\n        if (backdrop) {\n          var transitionDuration = box.style.transitionDuration;\n          var duration = Number(transitionDuration.replace('ms', '')); // The content should fade in after the backdrop has mostly filled the\n          // tooltip element. `clip-path` is the other alternative but is not\n          // well-supported and is buggy on some devices.\n\n          content.style.transitionDelay = Math.round(duration / 10) + \"ms\";\n          backdrop.style.transitionDuration = transitionDuration;\n          setVisibilityState([backdrop], 'visible');\n        }\n      },\n      onShow: function onShow() {\n        if (backdrop) {\n          backdrop.style.transitionDuration = '0ms';\n        }\n      },\n      onHide: function onHide() {\n        if (backdrop) {\n          setVisibilityState([backdrop], 'hidden');\n        }\n      }\n    };\n  }\n};\n\nfunction createBackdropElement() {\n  var backdrop = div();\n  backdrop.className = BACKDROP_CLASS;\n  setVisibilityState([backdrop], 'hidden');\n  return backdrop;\n}\n\nvar mouseCoords = {\n  clientX: 0,\n  clientY: 0\n};\nvar activeInstances = [];\n\nfunction storeMouseCoords(_ref) {\n  var clientX = _ref.clientX,\n      clientY = _ref.clientY;\n  mouseCoords = {\n    clientX: clientX,\n    clientY: clientY\n  };\n}\n\nfunction addMouseCoordsListener(doc) {\n  doc.addEventListener('mousemove', storeMouseCoords);\n}\n\nfunction removeMouseCoordsListener(doc) {\n  doc.removeEventListener('mousemove', storeMouseCoords);\n}\n\nvar followCursor = {\n  name: 'followCursor',\n  defaultValue: false,\n  fn: function fn(instance) {\n    var reference = instance.reference;\n    var doc = getOwnerDocument(instance.props.triggerTarget || reference);\n    var isInternalUpdate = false;\n    var wasFocusEvent = false;\n    var isUnmounted = true;\n    var prevProps = instance.props;\n\n    function getIsInitialBehavior() {\n      return instance.props.followCursor === 'initial' && instance.state.isVisible;\n    }\n\n    function addListener() {\n      doc.addEventListener('mousemove', onMouseMove);\n    }\n\n    function removeListener() {\n      doc.removeEventListener('mousemove', onMouseMove);\n    }\n\n    function unsetGetReferenceClientRect() {\n      isInternalUpdate = true;\n      instance.setProps({\n        getReferenceClientRect: null\n      });\n      isInternalUpdate = false;\n    }\n\n    function onMouseMove(event) {\n      // If the instance is interactive, avoid updating the position unless it's\n      // over the reference element\n      var isCursorOverReference = event.target ? reference.contains(event.target) : true;\n      var followCursor = instance.props.followCursor;\n      var clientX = event.clientX,\n          clientY = event.clientY;\n      var rect = reference.getBoundingClientRect();\n      var relativeX = clientX - rect.left;\n      var relativeY = clientY - rect.top;\n\n      if (isCursorOverReference || !instance.props.interactive) {\n        instance.setProps({\n          // @ts-ignore - unneeded DOMRect properties\n          getReferenceClientRect: function getReferenceClientRect() {\n            var rect = reference.getBoundingClientRect();\n            var x = clientX;\n            var y = clientY;\n\n            if (followCursor === 'initial') {\n              x = rect.left + relativeX;\n              y = rect.top + relativeY;\n            }\n\n            var top = followCursor === 'horizontal' ? rect.top : y;\n            var right = followCursor === 'vertical' ? rect.right : x;\n            var bottom = followCursor === 'horizontal' ? rect.bottom : y;\n            var left = followCursor === 'vertical' ? rect.left : x;\n            return {\n              width: right - left,\n              height: bottom - top,\n              top: top,\n              right: right,\n              bottom: bottom,\n              left: left\n            };\n          }\n        });\n      }\n    }\n\n    function create() {\n      if (instance.props.followCursor) {\n        activeInstances.push({\n          instance: instance,\n          doc: doc\n        });\n        addMouseCoordsListener(doc);\n      }\n    }\n\n    function destroy() {\n      activeInstances = activeInstances.filter(function (data) {\n        return data.instance !== instance;\n      });\n\n      if (activeInstances.filter(function (data) {\n        return data.doc === doc;\n      }).length === 0) {\n        removeMouseCoordsListener(doc);\n      }\n    }\n\n    return {\n      onCreate: create,\n      onDestroy: destroy,\n      onBeforeUpdate: function onBeforeUpdate() {\n        prevProps = instance.props;\n      },\n      onAfterUpdate: function onAfterUpdate(_, _ref2) {\n        var followCursor = _ref2.followCursor;\n\n        if (isInternalUpdate) {\n          return;\n        }\n\n        if (followCursor !== undefined && prevProps.followCursor !== followCursor) {\n          destroy();\n\n          if (followCursor) {\n            create();\n\n            if (instance.state.isMounted && !wasFocusEvent && !getIsInitialBehavior()) {\n              addListener();\n            }\n          } else {\n            removeListener();\n            unsetGetReferenceClientRect();\n          }\n        }\n      },\n      onMount: function onMount() {\n        if (instance.props.followCursor && !wasFocusEvent) {\n          if (isUnmounted) {\n            onMouseMove(mouseCoords);\n            isUnmounted = false;\n          }\n\n          if (!getIsInitialBehavior()) {\n            addListener();\n          }\n        }\n      },\n      onTrigger: function onTrigger(_, event) {\n        if (isMouseEvent(event)) {\n          mouseCoords = {\n            clientX: event.clientX,\n            clientY: event.clientY\n          };\n        }\n\n        wasFocusEvent = event.type === 'focus';\n      },\n      onHidden: function onHidden() {\n        if (instance.props.followCursor) {\n          unsetGetReferenceClientRect();\n          removeListener();\n          isUnmounted = true;\n        }\n      }\n    };\n  }\n};\n\nfunction getProps(props, modifier) {\n  var _props$popperOptions;\n\n  return {\n    popperOptions: Object.assign({}, props.popperOptions, {\n      modifiers: [].concat((((_props$popperOptions = props.popperOptions) == null ? void 0 : _props$popperOptions.modifiers) || []).filter(function (_ref) {\n        var name = _ref.name;\n        return name !== modifier.name;\n      }), [modifier])\n    })\n  };\n}\n\nvar inlinePositioning = {\n  name: 'inlinePositioning',\n  defaultValue: false,\n  fn: function fn(instance) {\n    var reference = instance.reference;\n\n    function isEnabled() {\n      return !!instance.props.inlinePositioning;\n    }\n\n    var placement;\n    var cursorRectIndex = -1;\n    var isInternalUpdate = false;\n    var triedPlacements = [];\n    var modifier = {\n      name: 'tippyInlinePositioning',\n      enabled: true,\n      phase: 'afterWrite',\n      fn: function fn(_ref2) {\n        var state = _ref2.state;\n\n        if (isEnabled()) {\n          if (triedPlacements.indexOf(state.placement) !== -1) {\n            triedPlacements = [];\n          }\n\n          if (placement !== state.placement && triedPlacements.indexOf(state.placement) === -1) {\n            triedPlacements.push(state.placement);\n            instance.setProps({\n              // @ts-ignore - unneeded DOMRect properties\n              getReferenceClientRect: function getReferenceClientRect() {\n                return _getReferenceClientRect(state.placement);\n              }\n            });\n          }\n\n          placement = state.placement;\n        }\n      }\n    };\n\n    function _getReferenceClientRect(placement) {\n      return getInlineBoundingClientRect(getBasePlacement(placement), reference.getBoundingClientRect(), arrayFrom(reference.getClientRects()), cursorRectIndex);\n    }\n\n    function setInternalProps(partialProps) {\n      isInternalUpdate = true;\n      instance.setProps(partialProps);\n      isInternalUpdate = false;\n    }\n\n    function addModifier() {\n      if (!isInternalUpdate) {\n        setInternalProps(getProps(instance.props, modifier));\n      }\n    }\n\n    return {\n      onCreate: addModifier,\n      onAfterUpdate: addModifier,\n      onTrigger: function onTrigger(_, event) {\n        if (isMouseEvent(event)) {\n          var rects = arrayFrom(instance.reference.getClientRects());\n          var cursorRect = rects.find(function (rect) {\n            return rect.left - 2 <= event.clientX && rect.right + 2 >= event.clientX && rect.top - 2 <= event.clientY && rect.bottom + 2 >= event.clientY;\n          });\n          var index = rects.indexOf(cursorRect);\n          cursorRectIndex = index > -1 ? index : cursorRectIndex;\n        }\n      },\n      onHidden: function onHidden() {\n        cursorRectIndex = -1;\n      }\n    };\n  }\n};\nfunction getInlineBoundingClientRect(currentBasePlacement, boundingRect, clientRects, cursorRectIndex) {\n  // Not an inline element, or placement is not yet known\n  if (clientRects.length < 2 || currentBasePlacement === null) {\n    return boundingRect;\n  } // There are two rects and they are disjoined\n\n\n  if (clientRects.length === 2 && cursorRectIndex >= 0 && clientRects[0].left > clientRects[1].right) {\n    return clientRects[cursorRectIndex] || boundingRect;\n  }\n\n  switch (currentBasePlacement) {\n    case 'top':\n    case 'bottom':\n      {\n        var firstRect = clientRects[0];\n        var lastRect = clientRects[clientRects.length - 1];\n        var isTop = currentBasePlacement === 'top';\n        var top = firstRect.top;\n        var bottom = lastRect.bottom;\n        var left = isTop ? firstRect.left : lastRect.left;\n        var right = isTop ? firstRect.right : lastRect.right;\n        var width = right - left;\n        var height = bottom - top;\n        return {\n          top: top,\n          bottom: bottom,\n          left: left,\n          right: right,\n          width: width,\n          height: height\n        };\n      }\n\n    case 'left':\n    case 'right':\n      {\n        var minLeft = Math.min.apply(Math, clientRects.map(function (rects) {\n          return rects.left;\n        }));\n        var maxRight = Math.max.apply(Math, clientRects.map(function (rects) {\n          return rects.right;\n        }));\n        var measureRects = clientRects.filter(function (rect) {\n          return currentBasePlacement === 'left' ? rect.left === minLeft : rect.right === maxRight;\n        });\n        var _top = measureRects[0].top;\n        var _bottom = measureRects[measureRects.length - 1].bottom;\n        var _left = minLeft;\n        var _right = maxRight;\n\n        var _width = _right - _left;\n\n        var _height = _bottom - _top;\n\n        return {\n          top: _top,\n          bottom: _bottom,\n          left: _left,\n          right: _right,\n          width: _width,\n          height: _height\n        };\n      }\n\n    default:\n      {\n        return boundingRect;\n      }\n  }\n}\n\nvar sticky = {\n  name: 'sticky',\n  defaultValue: false,\n  fn: function fn(instance) {\n    var reference = instance.reference,\n        popper = instance.popper;\n\n    function getReference() {\n      return instance.popperInstance ? instance.popperInstance.state.elements.reference : reference;\n    }\n\n    function shouldCheck(value) {\n      return instance.props.sticky === true || instance.props.sticky === value;\n    }\n\n    var prevRefRect = null;\n    var prevPopRect = null;\n\n    function updatePosition() {\n      var currentRefRect = shouldCheck('reference') ? getReference().getBoundingClientRect() : null;\n      var currentPopRect = shouldCheck('popper') ? popper.getBoundingClientRect() : null;\n\n      if (currentRefRect && areRectsDifferent(prevRefRect, currentRefRect) || currentPopRect && areRectsDifferent(prevPopRect, currentPopRect)) {\n        if (instance.popperInstance) {\n          instance.popperInstance.update();\n        }\n      }\n\n      prevRefRect = currentRefRect;\n      prevPopRect = currentPopRect;\n\n      if (instance.state.isMounted) {\n        requestAnimationFrame(updatePosition);\n      }\n    }\n\n    return {\n      onMount: function onMount() {\n        if (instance.props.sticky) {\n          updatePosition();\n        }\n      }\n    };\n  }\n};\n\nfunction areRectsDifferent(rectA, rectB) {\n  if (rectA && rectB) {\n    return rectA.top !== rectB.top || rectA.right !== rectB.right || rectA.bottom !== rectB.bottom || rectA.left !== rectB.left;\n  }\n\n  return true;\n}\n\ntippy.setDefaultProps({\n  render: render\n});\n\nexport default tippy;\nexport { animateFill, createSingleton, delegate, followCursor, hideAll, inlinePositioning, ROUND_ARROW as roundArrow, sticky };\n//# sourceMappingURL=tippy.esm.js.map\n","'use strict';\nvar SetHelpers = require('../internals/set-helpers');\nvar iterate = require('../internals/set-iterate');\n\nvar Set = SetHelpers.Set;\nvar add = SetHelpers.add;\n\nmodule.exports = function (set) {\n  var result = new Set();\n  iterate(set, function (it) {\n    add(result, it);\n  });\n  return result;\n};\n","'use strict';\n// in old WebKit versions, `element.classList` is not an instance of global `DOMTokenList`\nvar documentCreateElement = require('../internals/document-create-element');\n\nvar classList = documentCreateElement('span').classList;\nvar DOMTokenListPrototype = classList && classList.constructor && classList.constructor.prototype;\n\nmodule.exports = DOMTokenListPrototype === Object.prototype ? undefined : DOMTokenListPrototype;\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar toObject = require('../internals/to-object');\n\nvar hasOwnProperty = uncurryThis({}.hasOwnProperty);\n\n// `HasOwnProperty` abstract operation\n// https://tc39.es/ecma262/#sec-hasownproperty\n// eslint-disable-next-line es/no-object-hasown -- safe\nmodule.exports = Object.hasOwn || function hasOwn(it, key) {\n  return hasOwnProperty(toObject(it), key);\n};\n","'use strict';\nvar isCallable = require('../internals/is-callable');\nvar tryToString = require('../internals/try-to-string');\n\nvar $TypeError = TypeError;\n\n// `Assert: IsCallable(argument) is true`\nmodule.exports = function (argument) {\n  if (isCallable(argument)) return argument;\n  throw new $TypeError(tryToString(argument) + ' is not a function');\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar IS_PURE = require('../internals/is-pure');\nvar NativePromiseConstructor = require('../internals/promise-native-constructor');\nvar fails = require('../internals/fails');\nvar getBuiltIn = require('../internals/get-built-in');\nvar isCallable = require('../internals/is-callable');\nvar speciesConstructor = require('../internals/species-constructor');\nvar promiseResolve = require('../internals/promise-resolve');\nvar defineBuiltIn = require('../internals/define-built-in');\n\nvar NativePromisePrototype = NativePromiseConstructor && NativePromiseConstructor.prototype;\n\n// Safari bug https://bugs.webkit.org/show_bug.cgi?id=200829\nvar NON_GENERIC = !!NativePromiseConstructor && fails(function () {\n  // eslint-disable-next-line unicorn/no-thenable -- required for testing\n  NativePromisePrototype['finally'].call({ then: function () { /* empty */ } }, function () { /* empty */ });\n});\n\n// `Promise.prototype.finally` method\n// https://tc39.es/ecma262/#sec-promise.prototype.finally\n$({ target: 'Promise', proto: true, real: true, forced: NON_GENERIC }, {\n  'finally': function (onFinally) {\n    var C = speciesConstructor(this, getBuiltIn('Promise'));\n    var isFunction = isCallable(onFinally);\n    return this.then(\n      isFunction ? function (x) {\n        return promiseResolve(C, onFinally()).then(function () { return x; });\n      } : onFinally,\n      isFunction ? function (e) {\n        return promiseResolve(C, onFinally()).then(function () { throw e; });\n      } : onFinally\n    );\n  }\n});\n\n// makes sure that native promise-based APIs `Promise#finally` properly works with patched `Promise#then`\nif (!IS_PURE && isCallable(NativePromiseConstructor)) {\n  var method = getBuiltIn('Promise').prototype['finally'];\n  if (NativePromisePrototype['finally'] !== method) {\n    defineBuiltIn(NativePromisePrototype, 'finally', method, { unsafe: true });\n  }\n}\n","'use strict';\nvar $ = require('../internals/export');\nvar toObject = require('../internals/to-object');\nvar nativeKeys = require('../internals/object-keys');\nvar fails = require('../internals/fails');\n\nvar FAILS_ON_PRIMITIVES = fails(function () { nativeKeys(1); });\n\n// `Object.keys` method\n// https://tc39.es/ecma262/#sec-object.keys\n$({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES }, {\n  keys: function keys(it) {\n    return nativeKeys(toObject(it));\n  }\n});\n","'use strict';\nvar globalThis = require('../internals/global-this');\n\n// eslint-disable-next-line es/no-object-defineproperty -- safe\nvar defineProperty = Object.defineProperty;\n\nmodule.exports = function (key, value) {\n  try {\n    defineProperty(globalThis, key, { value: value, configurable: true, writable: true });\n  } catch (error) {\n    globalThis[key] = value;\n  } return value;\n};\n","/**\n * @license\n * Copyright 2010-2025 Three.js Authors\n * SPDX-License-Identifier: MIT\n */\nimport { Matrix3, Vector2, Color, mergeUniforms, Vector3, CubeUVReflectionMapping, Mesh, BoxGeometry, ShaderMaterial, BackSide, cloneUniforms, Euler, Matrix4, ColorManagement, SRGBTransfer, PlaneGeometry, FrontSide, getUnlitUniformColorSpace, IntType, warn, HalfFloatType, UnsignedByteType, FloatType, RGBAFormat, Plane, EquirectangularReflectionMapping, EquirectangularRefractionMapping, WebGLCubeRenderTarget, CubeReflectionMapping, CubeRefractionMapping, BufferGeometry, OrthographicCamera, PerspectiveCamera, NoToneMapping, MeshBasicMaterial, error, NoBlending, WebGLRenderTarget, BufferAttribute, LinearSRGBColorSpace, LinearFilter, warnOnce, Uint32BufferAttribute, Uint16BufferAttribute, arrayNeedsUint32, Vector4, DataArrayTexture, CubeTexture, Data3DTexture, LessEqualCompare, DepthTexture, Texture, GLSL3, PCFShadowMap, PCFSoftShadowMap, VSMShadowMap, CustomToneMapping, NeutralToneMapping, AgXToneMapping, ACESFilmicToneMapping, CineonToneMapping, ReinhardToneMapping, LinearToneMapping, LinearTransfer, AddOperation, MixOperation, MultiplyOperation, UniformsUtils, DoubleSide, NormalBlending, TangentSpaceNormalMap, ObjectSpaceNormalMap, Layers, Frustum, MeshDepthMaterial, RGBADepthPacking, MeshDistanceMaterial, NearestFilter, LessEqualDepth, ReverseSubtractEquation, SubtractEquation, AddEquation, OneMinusConstantAlphaFactor, ConstantAlphaFactor, OneMinusConstantColorFactor, ConstantColorFactor, OneMinusDstAlphaFactor, OneMinusDstColorFactor, OneMinusSrcAlphaFactor, OneMinusSrcColorFactor, DstAlphaFactor, DstColorFactor, SrcAlphaSaturateFactor, SrcAlphaFactor, SrcColorFactor, OneFactor, ZeroFactor, NotEqualDepth, GreaterDepth, GreaterEqualDepth, EqualDepth, LessDepth, AlwaysDepth, NeverDepth, CullFaceNone, CullFaceBack, CullFaceFront, CustomBlending, MultiplyBlending, SubtractiveBlending, AdditiveBlending, MinEquation, MaxEquation, MirroredRepeatWrapping, ClampToEdgeWrapping, RepeatWrapping, LinearMipmapLinearFilter, LinearMipmapNearestFilter, NearestMipmapLinearFilter, NearestMipmapNearestFilter, NotEqualCompare, GreaterCompare, GreaterEqualCompare, EqualCompare, LessCompare, AlwaysCompare, NeverCompare, NoColorSpace, DepthStencilFormat, getByteLength, DepthFormat, UnsignedIntType, UnsignedInt248Type, UnsignedShortType, createElementNS, UnsignedShort4444Type, UnsignedShort5551Type, UnsignedInt5999Type, UnsignedInt101111Type, ByteType, ShortType, AlphaFormat, RGBFormat, RedFormat, RedIntegerFormat, RGFormat, RGIntegerFormat, RGBAIntegerFormat, RGB_S3TC_DXT1_Format, RGBA_S3TC_DXT1_Format, RGBA_S3TC_DXT3_Format, RGBA_S3TC_DXT5_Format, RGB_PVRTC_4BPPV1_Format, RGB_PVRTC_2BPPV1_Format, RGBA_PVRTC_4BPPV1_Format, RGBA_PVRTC_2BPPV1_Format, RGB_ETC1_Format, RGB_ETC2_Format, RGBA_ETC2_EAC_Format, RGBA_ASTC_4x4_Format, RGBA_ASTC_5x4_Format, RGBA_ASTC_5x5_Format, RGBA_ASTC_6x5_Format, RGBA_ASTC_6x6_Format, RGBA_ASTC_8x5_Format, RGBA_ASTC_8x6_Format, RGBA_ASTC_8x8_Format, RGBA_ASTC_10x5_Format, RGBA_ASTC_10x6_Format, RGBA_ASTC_10x8_Format, RGBA_ASTC_10x10_Format, RGBA_ASTC_12x10_Format, RGBA_ASTC_12x12_Format, RGBA_BPTC_Format, RGB_BPTC_SIGNED_Format, RGB_BPTC_UNSIGNED_Format, RED_RGTC1_Format, SIGNED_RED_RGTC1_Format, RED_GREEN_RGTC2_Format, SIGNED_RED_GREEN_RGTC2_Format, ExternalTexture, EventDispatcher, ArrayCamera, WebXRController, RAD2DEG, DataTexture, createCanvasElement, SRGBColorSpace, REVISION, log, WebGLCoordinateSystem, probeAsync } from './three.core.js';\nexport { AdditiveAnimationBlendMode, AlwaysStencilFunc, AmbientLight, AnimationAction, AnimationClip, AnimationLoader, AnimationMixer, AnimationObjectGroup, AnimationUtils, ArcCurve, ArrowHelper, AttachedBindMode, Audio, AudioAnalyser, AudioContext, AudioListener, AudioLoader, AxesHelper, BasicDepthPacking, BasicShadowMap, BatchedMesh, Bone, BooleanKeyframeTrack, Box2, Box3, Box3Helper, BoxHelper, BufferGeometryLoader, Cache, Camera, CameraHelper, CanvasTexture, CapsuleGeometry, CatmullRomCurve3, CircleGeometry, Clock, ColorKeyframeTrack, CompressedArrayTexture, CompressedCubeTexture, CompressedTexture, CompressedTextureLoader, ConeGeometry, Controls, CubeCamera, CubeTextureLoader, CubicBezierCurve, CubicBezierCurve3, CubicInterpolant, CullFaceFrontBack, Curve, CurvePath, CylinderGeometry, Cylindrical, DataTextureLoader, DataUtils, DecrementStencilOp, DecrementWrapStencilOp, DefaultLoadingManager, DetachedBindMode, DirectionalLight, DirectionalLightHelper, DiscreteInterpolant, DodecahedronGeometry, DynamicCopyUsage, DynamicDrawUsage, DynamicReadUsage, EdgesGeometry, EllipseCurve, EqualStencilFunc, ExtrudeGeometry, FileLoader, Float16BufferAttribute, Float32BufferAttribute, Fog, FogExp2, FramebufferTexture, FrustumArray, GLBufferAttribute, GLSL1, GreaterEqualStencilFunc, GreaterStencilFunc, GridHelper, Group, HemisphereLight, HemisphereLightHelper, IcosahedronGeometry, ImageBitmapLoader, ImageLoader, ImageUtils, IncrementStencilOp, IncrementWrapStencilOp, InstancedBufferAttribute, InstancedBufferGeometry, InstancedInterleavedBuffer, InstancedMesh, Int16BufferAttribute, Int32BufferAttribute, Int8BufferAttribute, InterleavedBuffer, InterleavedBufferAttribute, Interpolant, InterpolateDiscrete, InterpolateLinear, InterpolateSmooth, InterpolationSamplingMode, InterpolationSamplingType, InvertStencilOp, KeepStencilOp, KeyframeTrack, LOD, LatheGeometry, LessEqualStencilFunc, LessStencilFunc, Light, LightProbe, Line, Line3, LineBasicMaterial, LineCurve, LineCurve3, LineDashedMaterial, LineLoop, LineSegments, LinearInterpolant, LinearMipMapLinearFilter, LinearMipMapNearestFilter, Loader, LoaderUtils, LoadingManager, LoopOnce, LoopPingPong, LoopRepeat, MOUSE, Material, MaterialLoader, MathUtils, Matrix2, MeshLambertMaterial, MeshMatcapMaterial, MeshNormalMaterial, MeshPhongMaterial, MeshPhysicalMaterial, MeshStandardMaterial, MeshToonMaterial, NearestMipMapLinearFilter, NearestMipMapNearestFilter, NeverStencilFunc, NormalAnimationBlendMode, NotEqualStencilFunc, NumberKeyframeTrack, Object3D, ObjectLoader, OctahedronGeometry, Path, PlaneHelper, PointLight, PointLightHelper, Points, PointsMaterial, PolarGridHelper, PolyhedronGeometry, PositionalAudio, PropertyBinding, PropertyMixer, QuadraticBezierCurve, QuadraticBezierCurve3, Quaternion, QuaternionKeyframeTrack, QuaternionLinearInterpolant, RGBDepthPacking, RGBIntegerFormat, RGDepthPacking, RawShaderMaterial, Ray, Raycaster, RectAreaLight, RenderTarget, RenderTarget3D, ReplaceStencilOp, RingGeometry, Scene, ShadowMaterial, Shape, ShapeGeometry, ShapePath, ShapeUtils, Skeleton, SkeletonHelper, SkinnedMesh, Source, Sphere, SphereGeometry, Spherical, SphericalHarmonics3, SplineCurve, SpotLight, SpotLightHelper, Sprite, SpriteMaterial, StaticCopyUsage, StaticDrawUsage, StaticReadUsage, StereoCamera, StreamCopyUsage, StreamDrawUsage, StreamReadUsage, StringKeyframeTrack, TOUCH, TetrahedronGeometry, TextureLoader, TextureUtils, Timer, TimestampQuery, TorusGeometry, TorusKnotGeometry, Triangle, TriangleFanDrawMode, TriangleStripDrawMode, TrianglesDrawMode, TubeGeometry, UVMapping, Uint8BufferAttribute, Uint8ClampedBufferAttribute, Uniform, UniformsGroup, VectorKeyframeTrack, VideoFrameTexture, VideoTexture, WebGL3DRenderTarget, WebGLArrayRenderTarget, WebGPUCoordinateSystem, WireframeGeometry, WrapAroundEnding, ZeroCurvatureEnding, ZeroSlopeEnding, ZeroStencilOp, getConsoleFunction, setConsoleFunction } from './three.core.js';\n\nfunction WebGLAnimation() {\n\n\tlet context = null;\n\tlet isAnimating = false;\n\tlet animationLoop = null;\n\tlet requestId = null;\n\n\tfunction onAnimationFrame( time, frame ) {\n\n\t\tanimationLoop( time, frame );\n\n\t\trequestId = context.requestAnimationFrame( onAnimationFrame );\n\n\t}\n\n\treturn {\n\n\t\tstart: function () {\n\n\t\t\tif ( isAnimating === true ) return;\n\t\t\tif ( animationLoop === null ) return;\n\n\t\t\trequestId = context.requestAnimationFrame( onAnimationFrame );\n\n\t\t\tisAnimating = true;\n\n\t\t},\n\n\t\tstop: function () {\n\n\t\t\tcontext.cancelAnimationFrame( requestId );\n\n\t\t\tisAnimating = false;\n\n\t\t},\n\n\t\tsetAnimationLoop: function ( callback ) {\n\n\t\t\tanimationLoop = callback;\n\n\t\t},\n\n\t\tsetContext: function ( value ) {\n\n\t\t\tcontext = value;\n\n\t\t}\n\n\t};\n\n}\n\nfunction WebGLAttributes( gl ) {\n\n\tconst buffers = new WeakMap();\n\n\tfunction createBuffer( attribute, bufferType ) {\n\n\t\tconst array = attribute.array;\n\t\tconst usage = attribute.usage;\n\t\tconst size = array.byteLength;\n\n\t\tconst buffer = gl.createBuffer();\n\n\t\tgl.bindBuffer( bufferType, buffer );\n\t\tgl.bufferData( bufferType, array, usage );\n\n\t\tattribute.onUploadCallback();\n\n\t\tlet type;\n\n\t\tif ( array instanceof Float32Array ) {\n\n\t\t\ttype = gl.FLOAT;\n\n\t\t} else if ( typeof Float16Array !== 'undefined' && array instanceof Float16Array ) {\n\n\t\t\ttype = gl.HALF_FLOAT;\n\n\t\t} else if ( array instanceof Uint16Array ) {\n\n\t\t\tif ( attribute.isFloat16BufferAttribute ) {\n\n\t\t\t\ttype = gl.HALF_FLOAT;\n\n\t\t\t} else {\n\n\t\t\t\ttype = gl.UNSIGNED_SHORT;\n\n\t\t\t}\n\n\t\t} else if ( array instanceof Int16Array ) {\n\n\t\t\ttype = gl.SHORT;\n\n\t\t} else if ( array instanceof Uint32Array ) {\n\n\t\t\ttype = gl.UNSIGNED_INT;\n\n\t\t} else if ( array instanceof Int32Array ) {\n\n\t\t\ttype = gl.INT;\n\n\t\t} else if ( array instanceof Int8Array ) {\n\n\t\t\ttype = gl.BYTE;\n\n\t\t} else if ( array instanceof Uint8Array ) {\n\n\t\t\ttype = gl.UNSIGNED_BYTE;\n\n\t\t} else if ( array instanceof Uint8ClampedArray ) {\n\n\t\t\ttype = gl.UNSIGNED_BYTE;\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'THREE.WebGLAttributes: Unsupported buffer data format: ' + array );\n\n\t\t}\n\n\t\treturn {\n\t\t\tbuffer: buffer,\n\t\t\ttype: type,\n\t\t\tbytesPerElement: array.BYTES_PER_ELEMENT,\n\t\t\tversion: attribute.version,\n\t\t\tsize: size\n\t\t};\n\n\t}\n\n\tfunction updateBuffer( buffer, attribute, bufferType ) {\n\n\t\tconst array = attribute.array;\n\t\tconst updateRanges = attribute.updateRanges;\n\n\t\tgl.bindBuffer( bufferType, buffer );\n\n\t\tif ( updateRanges.length === 0 ) {\n\n\t\t\t// Not using update ranges\n\t\t\tgl.bufferSubData( bufferType, 0, array );\n\n\t\t} else {\n\n\t\t\t// Before applying update ranges, we merge any adjacent / overlapping\n\t\t\t// ranges to reduce load on `gl.bufferSubData`. Empirically, this has led\n\t\t\t// to performance improvements for applications which make heavy use of\n\t\t\t// update ranges. Likely due to GPU command overhead.\n\t\t\t//\n\t\t\t// Note that to reduce garbage collection between frames, we merge the\n\t\t\t// update ranges in-place. This is safe because this method will clear the\n\t\t\t// update ranges once updated.\n\n\t\t\tupdateRanges.sort( ( a, b ) => a.start - b.start );\n\n\t\t\t// To merge the update ranges in-place, we work from left to right in the\n\t\t\t// existing updateRanges array, merging ranges. This may result in a final\n\t\t\t// array which is smaller than the original. This index tracks the last\n\t\t\t// index representing a merged range, any data after this index can be\n\t\t\t// trimmed once the merge algorithm is completed.\n\t\t\tlet mergeIndex = 0;\n\n\t\t\tfor ( let i = 1; i < updateRanges.length; i ++ ) {\n\n\t\t\t\tconst previousRange = updateRanges[ mergeIndex ];\n\t\t\t\tconst range = updateRanges[ i ];\n\n\t\t\t\t// We add one here to merge adjacent ranges. This is safe because ranges\n\t\t\t\t// operate over positive integers.\n\t\t\t\tif ( range.start <= previousRange.start + previousRange.count + 1 ) {\n\n\t\t\t\t\tpreviousRange.count = Math.max(\n\t\t\t\t\t\tpreviousRange.count,\n\t\t\t\t\t\trange.start + range.count - previousRange.start\n\t\t\t\t\t);\n\n\t\t\t\t} else {\n\n\t\t\t\t\t++ mergeIndex;\n\t\t\t\t\tupdateRanges[ mergeIndex ] = range;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Trim the array to only contain the merged ranges.\n\t\t\tupdateRanges.length = mergeIndex + 1;\n\n\t\t\tfor ( let i = 0, l = updateRanges.length; i < l; i ++ ) {\n\n\t\t\t\tconst range = updateRanges[ i ];\n\n\t\t\t\tgl.bufferSubData( bufferType, range.start * array.BYTES_PER_ELEMENT,\n\t\t\t\t\tarray, range.start, range.count );\n\n\t\t\t}\n\n\t\t\tattribute.clearUpdateRanges();\n\n\t\t}\n\n\t\tattribute.onUploadCallback();\n\n\t}\n\n\t//\n\n\tfunction get( attribute ) {\n\n\t\tif ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;\n\n\t\treturn buffers.get( attribute );\n\n\t}\n\n\tfunction remove( attribute ) {\n\n\t\tif ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;\n\n\t\tconst data = buffers.get( attribute );\n\n\t\tif ( data ) {\n\n\t\t\tgl.deleteBuffer( data.buffer );\n\n\t\t\tbuffers.delete( attribute );\n\n\t\t}\n\n\t}\n\n\tfunction update( attribute, bufferType ) {\n\n\t\tif ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;\n\n\t\tif ( attribute.isGLBufferAttribute ) {\n\n\t\t\tconst cached = buffers.get( attribute );\n\n\t\t\tif ( ! cached || cached.version < attribute.version ) {\n\n\t\t\t\tbuffers.set( attribute, {\n\t\t\t\t\tbuffer: attribute.buffer,\n\t\t\t\t\ttype: attribute.type,\n\t\t\t\t\tbytesPerElement: attribute.elementSize,\n\t\t\t\t\tversion: attribute.version\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst data = buffers.get( attribute );\n\n\t\tif ( data === undefined ) {\n\n\t\t\tbuffers.set( attribute, createBuffer( attribute, bufferType ) );\n\n\t\t} else if ( data.version < attribute.version ) {\n\n\t\t\tif ( data.size !== attribute.array.byteLength ) {\n\n\t\t\t\tthrow new Error( 'THREE.WebGLAttributes: The size of the buffer attribute\\'s array buffer does not match the original size. Resizing buffer attributes is not supported.' );\n\n\t\t\t}\n\n\t\t\tupdateBuffer( data.buffer, attribute, bufferType );\n\n\t\t\tdata.version = attribute.version;\n\n\t\t}\n\n\t}\n\n\treturn {\n\n\t\tget: get,\n\t\tremove: remove,\n\t\tupdate: update\n\n\t};\n\n}\n\nvar alphahash_fragment = \"#ifdef USE_ALPHAHASH\\n\\tif ( diffuseColor.a < getAlphaHashThreshold( vPosition ) ) discard;\\n#endif\";\n\nvar alphahash_pars_fragment = \"#ifdef USE_ALPHAHASH\\n\\tconst float ALPHA_HASH_SCALE = 0.05;\\n\\tfloat hash2D( vec2 value ) {\\n\\t\\treturn fract( 1.0e4 * sin( 17.0 * value.x + 0.1 * value.y ) * ( 0.1 + abs( sin( 13.0 * value.y + value.x ) ) ) );\\n\\t}\\n\\tfloat hash3D( vec3 value ) {\\n\\t\\treturn hash2D( vec2( hash2D( value.xy ), value.z ) );\\n\\t}\\n\\tfloat getAlphaHashThreshold( vec3 position ) {\\n\\t\\tfloat maxDeriv = max(\\n\\t\\t\\tlength( dFdx( position.xyz ) ),\\n\\t\\t\\tlength( dFdy( position.xyz ) )\\n\\t\\t);\\n\\t\\tfloat pixScale = 1.0 / ( ALPHA_HASH_SCALE * maxDeriv );\\n\\t\\tvec2 pixScales = vec2(\\n\\t\\t\\texp2( floor( log2( pixScale ) ) ),\\n\\t\\t\\texp2( ceil( log2( pixScale ) ) )\\n\\t\\t);\\n\\t\\tvec2 alpha = vec2(\\n\\t\\t\\thash3D( floor( pixScales.x * position.xyz ) ),\\n\\t\\t\\thash3D( floor( pixScales.y * position.xyz ) )\\n\\t\\t);\\n\\t\\tfloat lerpFactor = fract( log2( pixScale ) );\\n\\t\\tfloat x = ( 1.0 - lerpFactor ) * alpha.x + lerpFactor * alpha.y;\\n\\t\\tfloat a = min( lerpFactor, 1.0 - lerpFactor );\\n\\t\\tvec3 cases = vec3(\\n\\t\\t\\tx * x / ( 2.0 * a * ( 1.0 - a ) ),\\n\\t\\t\\t( x - 0.5 * a ) / ( 1.0 - a ),\\n\\t\\t\\t1.0 - ( ( 1.0 - x ) * ( 1.0 - x ) / ( 2.0 * a * ( 1.0 - a ) ) )\\n\\t\\t);\\n\\t\\tfloat threshold = ( x < ( 1.0 - a ) )\\n\\t\\t\\t? ( ( x < a ) ? cases.x : cases.y )\\n\\t\\t\\t: cases.z;\\n\\t\\treturn clamp( threshold , 1.0e-6, 1.0 );\\n\\t}\\n#endif\";\n\nvar alphamap_fragment = \"#ifdef USE_ALPHAMAP\\n\\tdiffuseColor.a *= texture2D( alphaMap, vAlphaMapUv ).g;\\n#endif\";\n\nvar alphamap_pars_fragment = \"#ifdef USE_ALPHAMAP\\n\\tuniform sampler2D alphaMap;\\n#endif\";\n\nvar alphatest_fragment = \"#ifdef USE_ALPHATEST\\n\\t#ifdef ALPHA_TO_COVERAGE\\n\\tdiffuseColor.a = smoothstep( alphaTest, alphaTest + fwidth( diffuseColor.a ), diffuseColor.a );\\n\\tif ( diffuseColor.a == 0.0 ) discard;\\n\\t#else\\n\\tif ( diffuseColor.a < alphaTest ) discard;\\n\\t#endif\\n#endif\";\n\nvar alphatest_pars_fragment = \"#ifdef USE_ALPHATEST\\n\\tuniform float alphaTest;\\n#endif\";\n\nvar aomap_fragment = \"#ifdef USE_AOMAP\\n\\tfloat ambientOcclusion = ( texture2D( aoMap, vAoMapUv ).r - 1.0 ) * aoMapIntensity + 1.0;\\n\\treflectedLight.indirectDiffuse *= ambientOcclusion;\\n\\t#if defined( USE_CLEARCOAT ) \\n\\t\\tclearcoatSpecularIndirect *= ambientOcclusion;\\n\\t#endif\\n\\t#if defined( USE_SHEEN ) \\n\\t\\tsheenSpecularIndirect *= ambientOcclusion;\\n\\t#endif\\n\\t#if defined( USE_ENVMAP ) && defined( STANDARD )\\n\\t\\tfloat dotNV = saturate( dot( geometryNormal, geometryViewDir ) );\\n\\t\\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.roughness );\\n\\t#endif\\n#endif\";\n\nvar aomap_pars_fragment = \"#ifdef USE_AOMAP\\n\\tuniform sampler2D aoMap;\\n\\tuniform float aoMapIntensity;\\n#endif\";\n\nvar batching_pars_vertex = \"#ifdef USE_BATCHING\\n\\t#if ! defined( GL_ANGLE_multi_draw )\\n\\t#define gl_DrawID _gl_DrawID\\n\\tuniform int _gl_DrawID;\\n\\t#endif\\n\\tuniform highp sampler2D batchingTexture;\\n\\tuniform highp usampler2D batchingIdTexture;\\n\\tmat4 getBatchingMatrix( const in float i ) {\\n\\t\\tint size = textureSize( batchingTexture, 0 ).x;\\n\\t\\tint j = int( i ) * 4;\\n\\t\\tint x = j % size;\\n\\t\\tint y = j / size;\\n\\t\\tvec4 v1 = texelFetch( batchingTexture, ivec2( x, y ), 0 );\\n\\t\\tvec4 v2 = texelFetch( batchingTexture, ivec2( x + 1, y ), 0 );\\n\\t\\tvec4 v3 = texelFetch( batchingTexture, ivec2( x + 2, y ), 0 );\\n\\t\\tvec4 v4 = texelFetch( batchingTexture, ivec2( x + 3, y ), 0 );\\n\\t\\treturn mat4( v1, v2, v3, v4 );\\n\\t}\\n\\tfloat getIndirectIndex( const in int i ) {\\n\\t\\tint size = textureSize( batchingIdTexture, 0 ).x;\\n\\t\\tint x = i % size;\\n\\t\\tint y = i / size;\\n\\t\\treturn float( texelFetch( batchingIdTexture, ivec2( x, y ), 0 ).r );\\n\\t}\\n#endif\\n#ifdef USE_BATCHING_COLOR\\n\\tuniform sampler2D batchingColorTexture;\\n\\tvec3 getBatchingColor( const in float i ) {\\n\\t\\tint size = textureSize( batchingColorTexture, 0 ).x;\\n\\t\\tint j = int( i );\\n\\t\\tint x = j % size;\\n\\t\\tint y = j / size;\\n\\t\\treturn texelFetch( batchingColorTexture, ivec2( x, y ), 0 ).rgb;\\n\\t}\\n#endif\";\n\nvar batching_vertex = \"#ifdef USE_BATCHING\\n\\tmat4 batchingMatrix = getBatchingMatrix( getIndirectIndex( gl_DrawID ) );\\n#endif\";\n\nvar begin_vertex = \"vec3 transformed = vec3( position );\\n#ifdef USE_ALPHAHASH\\n\\tvPosition = vec3( position );\\n#endif\";\n\nvar beginnormal_vertex = \"vec3 objectNormal = vec3( normal );\\n#ifdef USE_TANGENT\\n\\tvec3 objectTangent = vec3( tangent.xyz );\\n#endif\";\n\nvar bsdfs = \"float G_BlinnPhong_Implicit( ) {\\n\\treturn 0.25;\\n}\\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\\n\\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\\n}\\nvec3 BRDF_BlinnPhong( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in vec3 specularColor, const in float shininess ) {\\n\\tvec3 halfDir = normalize( lightDir + viewDir );\\n\\tfloat dotNH = saturate( dot( normal, halfDir ) );\\n\\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\\n\\tvec3 F = F_Schlick( specularColor, 1.0, dotVH );\\n\\tfloat G = G_BlinnPhong_Implicit( );\\n\\tfloat D = D_BlinnPhong( shininess, dotNH );\\n\\treturn F * ( G * D );\\n} // validated\";\n\nvar iridescence_fragment = \"#ifdef USE_IRIDESCENCE\\n\\tconst mat3 XYZ_TO_REC709 = mat3(\\n\\t\\t 3.2404542, -0.9692660,  0.0556434,\\n\\t\\t-1.5371385,  1.8760108, -0.2040259,\\n\\t\\t-0.4985314,  0.0415560,  1.0572252\\n\\t);\\n\\tvec3 Fresnel0ToIor( vec3 fresnel0 ) {\\n\\t\\tvec3 sqrtF0 = sqrt( fresnel0 );\\n\\t\\treturn ( vec3( 1.0 ) + sqrtF0 ) / ( vec3( 1.0 ) - sqrtF0 );\\n\\t}\\n\\tvec3 IorToFresnel0( vec3 transmittedIor, float incidentIor ) {\\n\\t\\treturn pow2( ( transmittedIor - vec3( incidentIor ) ) / ( transmittedIor + vec3( incidentIor ) ) );\\n\\t}\\n\\tfloat IorToFresnel0( float transmittedIor, float incidentIor ) {\\n\\t\\treturn pow2( ( transmittedIor - incidentIor ) / ( transmittedIor + incidentIor ));\\n\\t}\\n\\tvec3 evalSensitivity( float OPD, vec3 shift ) {\\n\\t\\tfloat phase = 2.0 * PI * OPD * 1.0e-9;\\n\\t\\tvec3 val = vec3( 5.4856e-13, 4.4201e-13, 5.2481e-13 );\\n\\t\\tvec3 pos = vec3( 1.6810e+06, 1.7953e+06, 2.2084e+06 );\\n\\t\\tvec3 var = vec3( 4.3278e+09, 9.3046e+09, 6.6121e+09 );\\n\\t\\tvec3 xyz = val * sqrt( 2.0 * PI * var ) * cos( pos * phase + shift ) * exp( - pow2( phase ) * var );\\n\\t\\txyz.x += 9.7470e-14 * sqrt( 2.0 * PI * 4.5282e+09 ) * cos( 2.2399e+06 * phase + shift[ 0 ] ) * exp( - 4.5282e+09 * pow2( phase ) );\\n\\t\\txyz /= 1.0685e-7;\\n\\t\\tvec3 rgb = XYZ_TO_REC709 * xyz;\\n\\t\\treturn rgb;\\n\\t}\\n\\tvec3 evalIridescence( float outsideIOR, float eta2, float cosTheta1, float thinFilmThickness, vec3 baseF0 ) {\\n\\t\\tvec3 I;\\n\\t\\tfloat iridescenceIOR = mix( outsideIOR, eta2, smoothstep( 0.0, 0.03, thinFilmThickness ) );\\n\\t\\tfloat sinTheta2Sq = pow2( outsideIOR / iridescenceIOR ) * ( 1.0 - pow2( cosTheta1 ) );\\n\\t\\tfloat cosTheta2Sq = 1.0 - sinTheta2Sq;\\n\\t\\tif ( cosTheta2Sq < 0.0 ) {\\n\\t\\t\\treturn vec3( 1.0 );\\n\\t\\t}\\n\\t\\tfloat cosTheta2 = sqrt( cosTheta2Sq );\\n\\t\\tfloat R0 = IorToFresnel0( iridescenceIOR, outsideIOR );\\n\\t\\tfloat R12 = F_Schlick( R0, 1.0, cosTheta1 );\\n\\t\\tfloat T121 = 1.0 - R12;\\n\\t\\tfloat phi12 = 0.0;\\n\\t\\tif ( iridescenceIOR < outsideIOR ) phi12 = PI;\\n\\t\\tfloat phi21 = PI - phi12;\\n\\t\\tvec3 baseIOR = Fresnel0ToIor( clamp( baseF0, 0.0, 0.9999 ) );\\t\\tvec3 R1 = IorToFresnel0( baseIOR, iridescenceIOR );\\n\\t\\tvec3 R23 = F_Schlick( R1, 1.0, cosTheta2 );\\n\\t\\tvec3 phi23 = vec3( 0.0 );\\n\\t\\tif ( baseIOR[ 0 ] < iridescenceIOR ) phi23[ 0 ] = PI;\\n\\t\\tif ( baseIOR[ 1 ] < iridescenceIOR ) phi23[ 1 ] = PI;\\n\\t\\tif ( baseIOR[ 2 ] < iridescenceIOR ) phi23[ 2 ] = PI;\\n\\t\\tfloat OPD = 2.0 * iridescenceIOR * thinFilmThickness * cosTheta2;\\n\\t\\tvec3 phi = vec3( phi21 ) + phi23;\\n\\t\\tvec3 R123 = clamp( R12 * R23, 1e-5, 0.9999 );\\n\\t\\tvec3 r123 = sqrt( R123 );\\n\\t\\tvec3 Rs = pow2( T121 ) * R23 / ( vec3( 1.0 ) - R123 );\\n\\t\\tvec3 C0 = R12 + Rs;\\n\\t\\tI = C0;\\n\\t\\tvec3 Cm = Rs - T121;\\n\\t\\tfor ( int m = 1; m <= 2; ++ m ) {\\n\\t\\t\\tCm *= r123;\\n\\t\\t\\tvec3 Sm = 2.0 * evalSensitivity( float( m ) * OPD, float( m ) * phi );\\n\\t\\t\\tI += Cm * Sm;\\n\\t\\t}\\n\\t\\treturn max( I, vec3( 0.0 ) );\\n\\t}\\n#endif\";\n\nvar bumpmap_pars_fragment = \"#ifdef USE_BUMPMAP\\n\\tuniform sampler2D bumpMap;\\n\\tuniform float bumpScale;\\n\\tvec2 dHdxy_fwd() {\\n\\t\\tvec2 dSTdx = dFdx( vBumpMapUv );\\n\\t\\tvec2 dSTdy = dFdy( vBumpMapUv );\\n\\t\\tfloat Hll = bumpScale * texture2D( bumpMap, vBumpMapUv ).x;\\n\\t\\tfloat dBx = bumpScale * texture2D( bumpMap, vBumpMapUv + dSTdx ).x - Hll;\\n\\t\\tfloat dBy = bumpScale * texture2D( bumpMap, vBumpMapUv + dSTdy ).x - Hll;\\n\\t\\treturn vec2( dBx, dBy );\\n\\t}\\n\\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy, float faceDirection ) {\\n\\t\\tvec3 vSigmaX = normalize( dFdx( surf_pos.xyz ) );\\n\\t\\tvec3 vSigmaY = normalize( dFdy( surf_pos.xyz ) );\\n\\t\\tvec3 vN = surf_norm;\\n\\t\\tvec3 R1 = cross( vSigmaY, vN );\\n\\t\\tvec3 R2 = cross( vN, vSigmaX );\\n\\t\\tfloat fDet = dot( vSigmaX, R1 ) * faceDirection;\\n\\t\\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\\n\\t\\treturn normalize( abs( fDet ) * surf_norm - vGrad );\\n\\t}\\n#endif\";\n\nvar clipping_planes_fragment = \"#if NUM_CLIPPING_PLANES > 0\\n\\tvec4 plane;\\n\\t#ifdef ALPHA_TO_COVERAGE\\n\\t\\tfloat distanceToPlane, distanceGradient;\\n\\t\\tfloat clipOpacity = 1.0;\\n\\t\\t#pragma unroll_loop_start\\n\\t\\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\\n\\t\\t\\tplane = clippingPlanes[ i ];\\n\\t\\t\\tdistanceToPlane = - dot( vClipPosition, plane.xyz ) + plane.w;\\n\\t\\t\\tdistanceGradient = fwidth( distanceToPlane ) / 2.0;\\n\\t\\t\\tclipOpacity *= smoothstep( - distanceGradient, distanceGradient, distanceToPlane );\\n\\t\\t\\tif ( clipOpacity == 0.0 ) discard;\\n\\t\\t}\\n\\t\\t#pragma unroll_loop_end\\n\\t\\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\\n\\t\\t\\tfloat unionClipOpacity = 1.0;\\n\\t\\t\\t#pragma unroll_loop_start\\n\\t\\t\\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\\n\\t\\t\\t\\tplane = clippingPlanes[ i ];\\n\\t\\t\\t\\tdistanceToPlane = - dot( vClipPosition, plane.xyz ) + plane.w;\\n\\t\\t\\t\\tdistanceGradient = fwidth( distanceToPlane ) / 2.0;\\n\\t\\t\\t\\tunionClipOpacity *= 1.0 - smoothstep( - distanceGradient, distanceGradient, distanceToPlane );\\n\\t\\t\\t}\\n\\t\\t\\t#pragma unroll_loop_end\\n\\t\\t\\tclipOpacity *= 1.0 - unionClipOpacity;\\n\\t\\t#endif\\n\\t\\tdiffuseColor.a *= clipOpacity;\\n\\t\\tif ( diffuseColor.a == 0.0 ) discard;\\n\\t#else\\n\\t\\t#pragma unroll_loop_start\\n\\t\\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\\n\\t\\t\\tplane = clippingPlanes[ i ];\\n\\t\\t\\tif ( dot( vClipPosition, plane.xyz ) > plane.w ) discard;\\n\\t\\t}\\n\\t\\t#pragma unroll_loop_end\\n\\t\\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\\n\\t\\t\\tbool clipped = true;\\n\\t\\t\\t#pragma unroll_loop_start\\n\\t\\t\\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\\n\\t\\t\\t\\tplane = clippingPlanes[ i ];\\n\\t\\t\\t\\tclipped = ( dot( vClipPosition, plane.xyz ) > plane.w ) && clipped;\\n\\t\\t\\t}\\n\\t\\t\\t#pragma unroll_loop_end\\n\\t\\t\\tif ( clipped ) discard;\\n\\t\\t#endif\\n\\t#endif\\n#endif\";\n\nvar clipping_planes_pars_fragment = \"#if NUM_CLIPPING_PLANES > 0\\n\\tvarying vec3 vClipPosition;\\n\\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\\n#endif\";\n\nvar clipping_planes_pars_vertex = \"#if NUM_CLIPPING_PLANES > 0\\n\\tvarying vec3 vClipPosition;\\n#endif\";\n\nvar clipping_planes_vertex = \"#if NUM_CLIPPING_PLANES > 0\\n\\tvClipPosition = - mvPosition.xyz;\\n#endif\";\n\nvar color_fragment = \"#if defined( USE_COLOR_ALPHA )\\n\\tdiffuseColor *= vColor;\\n#elif defined( USE_COLOR )\\n\\tdiffuseColor.rgb *= vColor;\\n#endif\";\n\nvar color_pars_fragment = \"#if defined( USE_COLOR_ALPHA )\\n\\tvarying vec4 vColor;\\n#elif defined( USE_COLOR )\\n\\tvarying vec3 vColor;\\n#endif\";\n\nvar color_pars_vertex = \"#if defined( USE_COLOR_ALPHA )\\n\\tvarying vec4 vColor;\\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR )\\n\\tvarying vec3 vColor;\\n#endif\";\n\nvar color_vertex = \"#if defined( USE_COLOR_ALPHA )\\n\\tvColor = vec4( 1.0 );\\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR )\\n\\tvColor = vec3( 1.0 );\\n#endif\\n#ifdef USE_COLOR\\n\\tvColor *= color;\\n#endif\\n#ifdef USE_INSTANCING_COLOR\\n\\tvColor.xyz *= instanceColor.xyz;\\n#endif\\n#ifdef USE_BATCHING_COLOR\\n\\tvec3 batchingColor = getBatchingColor( getIndirectIndex( gl_DrawID ) );\\n\\tvColor.xyz *= batchingColor.xyz;\\n#endif\";\n\nvar common = \"#define PI 3.141592653589793\\n#define PI2 6.283185307179586\\n#define PI_HALF 1.5707963267948966\\n#define RECIPROCAL_PI 0.3183098861837907\\n#define RECIPROCAL_PI2 0.15915494309189535\\n#define EPSILON 1e-6\\n#ifndef saturate\\n#define saturate( a ) clamp( a, 0.0, 1.0 )\\n#endif\\n#define whiteComplement( a ) ( 1.0 - saturate( a ) )\\nfloat pow2( const in float x ) { return x*x; }\\nvec3 pow2( const in vec3 x ) { return x*x; }\\nfloat pow3( const in float x ) { return x*x*x; }\\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\\nfloat max3( const in vec3 v ) { return max( max( v.x, v.y ), v.z ); }\\nfloat average( const in vec3 v ) { return dot( v, vec3( 0.3333333 ) ); }\\nhighp float rand( const in vec2 uv ) {\\n\\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\\n\\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\\n\\treturn fract( sin( sn ) * c );\\n}\\n#ifdef HIGH_PRECISION\\n\\tfloat precisionSafeLength( vec3 v ) { return length( v ); }\\n#else\\n\\tfloat precisionSafeLength( vec3 v ) {\\n\\t\\tfloat maxComponent = max3( abs( v ) );\\n\\t\\treturn length( v / maxComponent ) * maxComponent;\\n\\t}\\n#endif\\nstruct IncidentLight {\\n\\tvec3 color;\\n\\tvec3 direction;\\n\\tbool visible;\\n};\\nstruct ReflectedLight {\\n\\tvec3 directDiffuse;\\n\\tvec3 directSpecular;\\n\\tvec3 indirectDiffuse;\\n\\tvec3 indirectSpecular;\\n};\\n#ifdef USE_ALPHAHASH\\n\\tvarying vec3 vPosition;\\n#endif\\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\\n\\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\\n}\\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\\n\\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\\n}\\nbool isPerspectiveMatrix( mat4 m ) {\\n\\treturn m[ 2 ][ 3 ] == - 1.0;\\n}\\nvec2 equirectUv( in vec3 dir ) {\\n\\tfloat u = atan( dir.z, dir.x ) * RECIPROCAL_PI2 + 0.5;\\n\\tfloat v = asin( clamp( dir.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\\n\\treturn vec2( u, v );\\n}\\nvec3 BRDF_Lambert( const in vec3 diffuseColor ) {\\n\\treturn RECIPROCAL_PI * diffuseColor;\\n}\\nvec3 F_Schlick( const in vec3 f0, const in float f90, const in float dotVH ) {\\n\\tfloat fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH );\\n\\treturn f0 * ( 1.0 - fresnel ) + ( f90 * fresnel );\\n}\\nfloat F_Schlick( const in float f0, const in float f90, const in float dotVH ) {\\n\\tfloat fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH );\\n\\treturn f0 * ( 1.0 - fresnel ) + ( f90 * fresnel );\\n} // validated\";\n\nvar cube_uv_reflection_fragment = \"#ifdef ENVMAP_TYPE_CUBE_UV\\n\\t#define cubeUV_minMipLevel 4.0\\n\\t#define cubeUV_minTileSize 16.0\\n\\tfloat getFace( vec3 direction ) {\\n\\t\\tvec3 absDirection = abs( direction );\\n\\t\\tfloat face = - 1.0;\\n\\t\\tif ( absDirection.x > absDirection.z ) {\\n\\t\\t\\tif ( absDirection.x > absDirection.y )\\n\\t\\t\\t\\tface = direction.x > 0.0 ? 0.0 : 3.0;\\n\\t\\t\\telse\\n\\t\\t\\t\\tface = direction.y > 0.0 ? 1.0 : 4.0;\\n\\t\\t} else {\\n\\t\\t\\tif ( absDirection.z > absDirection.y )\\n\\t\\t\\t\\tface = direction.z > 0.0 ? 2.0 : 5.0;\\n\\t\\t\\telse\\n\\t\\t\\t\\tface = direction.y > 0.0 ? 1.0 : 4.0;\\n\\t\\t}\\n\\t\\treturn face;\\n\\t}\\n\\tvec2 getUV( vec3 direction, float face ) {\\n\\t\\tvec2 uv;\\n\\t\\tif ( face == 0.0 ) {\\n\\t\\t\\tuv = vec2( direction.z, direction.y ) / abs( direction.x );\\n\\t\\t} else if ( face == 1.0 ) {\\n\\t\\t\\tuv = vec2( - direction.x, - direction.z ) / abs( direction.y );\\n\\t\\t} else if ( face == 2.0 ) {\\n\\t\\t\\tuv = vec2( - direction.x, direction.y ) / abs( direction.z );\\n\\t\\t} else if ( face == 3.0 ) {\\n\\t\\t\\tuv = vec2( - direction.z, direction.y ) / abs( direction.x );\\n\\t\\t} else if ( face == 4.0 ) {\\n\\t\\t\\tuv = vec2( - direction.x, direction.z ) / abs( direction.y );\\n\\t\\t} else {\\n\\t\\t\\tuv = vec2( direction.x, direction.y ) / abs( direction.z );\\n\\t\\t}\\n\\t\\treturn 0.5 * ( uv + 1.0 );\\n\\t}\\n\\tvec3 bilinearCubeUV( sampler2D envMap, vec3 direction, float mipInt ) {\\n\\t\\tfloat face = getFace( direction );\\n\\t\\tfloat filterInt = max( cubeUV_minMipLevel - mipInt, 0.0 );\\n\\t\\tmipInt = max( mipInt, cubeUV_minMipLevel );\\n\\t\\tfloat faceSize = exp2( mipInt );\\n\\t\\thighp vec2 uv = getUV( direction, face ) * ( faceSize - 2.0 ) + 1.0;\\n\\t\\tif ( face > 2.0 ) {\\n\\t\\t\\tuv.y += faceSize;\\n\\t\\t\\tface -= 3.0;\\n\\t\\t}\\n\\t\\tuv.x += face * faceSize;\\n\\t\\tuv.x += filterInt * 3.0 * cubeUV_minTileSize;\\n\\t\\tuv.y += 4.0 * ( exp2( CUBEUV_MAX_MIP ) - faceSize );\\n\\t\\tuv.x *= CUBEUV_TEXEL_WIDTH;\\n\\t\\tuv.y *= CUBEUV_TEXEL_HEIGHT;\\n\\t\\t#ifdef texture2DGradEXT\\n\\t\\t\\treturn texture2DGradEXT( envMap, uv, vec2( 0.0 ), vec2( 0.0 ) ).rgb;\\n\\t\\t#else\\n\\t\\t\\treturn texture2D( envMap, uv ).rgb;\\n\\t\\t#endif\\n\\t}\\n\\t#define cubeUV_r0 1.0\\n\\t#define cubeUV_m0 - 2.0\\n\\t#define cubeUV_r1 0.8\\n\\t#define cubeUV_m1 - 1.0\\n\\t#define cubeUV_r4 0.4\\n\\t#define cubeUV_m4 2.0\\n\\t#define cubeUV_r5 0.305\\n\\t#define cubeUV_m5 3.0\\n\\t#define cubeUV_r6 0.21\\n\\t#define cubeUV_m6 4.0\\n\\tfloat roughnessToMip( float roughness ) {\\n\\t\\tfloat mip = 0.0;\\n\\t\\tif ( roughness >= cubeUV_r1 ) {\\n\\t\\t\\tmip = ( cubeUV_r0 - roughness ) * ( cubeUV_m1 - cubeUV_m0 ) / ( cubeUV_r0 - cubeUV_r1 ) + cubeUV_m0;\\n\\t\\t} else if ( roughness >= cubeUV_r4 ) {\\n\\t\\t\\tmip = ( cubeUV_r1 - roughness ) * ( cubeUV_m4 - cubeUV_m1 ) / ( cubeUV_r1 - cubeUV_r4 ) + cubeUV_m1;\\n\\t\\t} else if ( roughness >= cubeUV_r5 ) {\\n\\t\\t\\tmip = ( cubeUV_r4 - roughness ) * ( cubeUV_m5 - cubeUV_m4 ) / ( cubeUV_r4 - cubeUV_r5 ) + cubeUV_m4;\\n\\t\\t} else if ( roughness >= cubeUV_r6 ) {\\n\\t\\t\\tmip = ( cubeUV_r5 - roughness ) * ( cubeUV_m6 - cubeUV_m5 ) / ( cubeUV_r5 - cubeUV_r6 ) + cubeUV_m5;\\n\\t\\t} else {\\n\\t\\t\\tmip = - 2.0 * log2( 1.16 * roughness );\\t\\t}\\n\\t\\treturn mip;\\n\\t}\\n\\tvec4 textureCubeUV( sampler2D envMap, vec3 sampleDir, float roughness ) {\\n\\t\\tfloat mip = clamp( roughnessToMip( roughness ), cubeUV_m0, CUBEUV_MAX_MIP );\\n\\t\\tfloat mipF = fract( mip );\\n\\t\\tfloat mipInt = floor( mip );\\n\\t\\tvec3 color0 = bilinearCubeUV( envMap, sampleDir, mipInt );\\n\\t\\tif ( mipF == 0.0 ) {\\n\\t\\t\\treturn vec4( color0, 1.0 );\\n\\t\\t} else {\\n\\t\\t\\tvec3 color1 = bilinearCubeUV( envMap, sampleDir, mipInt + 1.0 );\\n\\t\\t\\treturn vec4( mix( color0, color1, mipF ), 1.0 );\\n\\t\\t}\\n\\t}\\n#endif\";\n\nvar defaultnormal_vertex = \"vec3 transformedNormal = objectNormal;\\n#ifdef USE_TANGENT\\n\\tvec3 transformedTangent = objectTangent;\\n#endif\\n#ifdef USE_BATCHING\\n\\tmat3 bm = mat3( batchingMatrix );\\n\\ttransformedNormal /= vec3( dot( bm[ 0 ], bm[ 0 ] ), dot( bm[ 1 ], bm[ 1 ] ), dot( bm[ 2 ], bm[ 2 ] ) );\\n\\ttransformedNormal = bm * transformedNormal;\\n\\t#ifdef USE_TANGENT\\n\\t\\ttransformedTangent = bm * transformedTangent;\\n\\t#endif\\n#endif\\n#ifdef USE_INSTANCING\\n\\tmat3 im = mat3( instanceMatrix );\\n\\ttransformedNormal /= vec3( dot( im[ 0 ], im[ 0 ] ), dot( im[ 1 ], im[ 1 ] ), dot( im[ 2 ], im[ 2 ] ) );\\n\\ttransformedNormal = im * transformedNormal;\\n\\t#ifdef USE_TANGENT\\n\\t\\ttransformedTangent = im * transformedTangent;\\n\\t#endif\\n#endif\\ntransformedNormal = normalMatrix * transformedNormal;\\n#ifdef FLIP_SIDED\\n\\ttransformedNormal = - transformedNormal;\\n#endif\\n#ifdef USE_TANGENT\\n\\ttransformedTangent = ( modelViewMatrix * vec4( transformedTangent, 0.0 ) ).xyz;\\n\\t#ifdef FLIP_SIDED\\n\\t\\ttransformedTangent = - transformedTangent;\\n\\t#endif\\n#endif\";\n\nvar displacementmap_pars_vertex = \"#ifdef USE_DISPLACEMENTMAP\\n\\tuniform sampler2D displacementMap;\\n\\tuniform float displacementScale;\\n\\tuniform float displacementBias;\\n#endif\";\n\nvar displacementmap_vertex = \"#ifdef USE_DISPLACEMENTMAP\\n\\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, vDisplacementMapUv ).x * displacementScale + displacementBias );\\n#endif\";\n\nvar emissivemap_fragment = \"#ifdef USE_EMISSIVEMAP\\n\\tvec4 emissiveColor = texture2D( emissiveMap, vEmissiveMapUv );\\n\\t#ifdef DECODE_VIDEO_TEXTURE_EMISSIVE\\n\\t\\temissiveColor = sRGBTransferEOTF( emissiveColor );\\n\\t#endif\\n\\ttotalEmissiveRadiance *= emissiveColor.rgb;\\n#endif\";\n\nvar emissivemap_pars_fragment = \"#ifdef USE_EMISSIVEMAP\\n\\tuniform sampler2D emissiveMap;\\n#endif\";\n\nvar colorspace_fragment = \"gl_FragColor = linearToOutputTexel( gl_FragColor );\";\n\nvar colorspace_pars_fragment = \"vec4 LinearTransferOETF( in vec4 value ) {\\n\\treturn value;\\n}\\nvec4 sRGBTransferEOTF( in vec4 value ) {\\n\\treturn vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.a );\\n}\\nvec4 sRGBTransferOETF( in vec4 value ) {\\n\\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.a );\\n}\";\n\nvar envmap_fragment = \"#ifdef USE_ENVMAP\\n\\t#ifdef ENV_WORLDPOS\\n\\t\\tvec3 cameraToFrag;\\n\\t\\tif ( isOrthographic ) {\\n\\t\\t\\tcameraToFrag = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\\n\\t\\t} else {\\n\\t\\t\\tcameraToFrag = normalize( vWorldPosition - cameraPosition );\\n\\t\\t}\\n\\t\\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\\n\\t\\t#ifdef ENVMAP_MODE_REFLECTION\\n\\t\\t\\tvec3 reflectVec = reflect( cameraToFrag, worldNormal );\\n\\t\\t#else\\n\\t\\t\\tvec3 reflectVec = refract( cameraToFrag, worldNormal, refractionRatio );\\n\\t\\t#endif\\n\\t#else\\n\\t\\tvec3 reflectVec = vReflect;\\n\\t#endif\\n\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\tvec4 envColor = textureCube( envMap, envMapRotation * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\\n\\t#else\\n\\t\\tvec4 envColor = vec4( 0.0 );\\n\\t#endif\\n\\t#ifdef ENVMAP_BLENDING_MULTIPLY\\n\\t\\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\\n\\t#elif defined( ENVMAP_BLENDING_MIX )\\n\\t\\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\\n\\t#elif defined( ENVMAP_BLENDING_ADD )\\n\\t\\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\\n\\t#endif\\n#endif\";\n\nvar envmap_common_pars_fragment = \"#ifdef USE_ENVMAP\\n\\tuniform float envMapIntensity;\\n\\tuniform float flipEnvMap;\\n\\tuniform mat3 envMapRotation;\\n\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\tuniform samplerCube envMap;\\n\\t#else\\n\\t\\tuniform sampler2D envMap;\\n\\t#endif\\n#endif\";\n\nvar envmap_pars_fragment = \"#ifdef USE_ENVMAP\\n\\tuniform float reflectivity;\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT )\\n\\t\\t#define ENV_WORLDPOS\\n\\t#endif\\n\\t#ifdef ENV_WORLDPOS\\n\\t\\tvarying vec3 vWorldPosition;\\n\\t\\tuniform float refractionRatio;\\n\\t#else\\n\\t\\tvarying vec3 vReflect;\\n\\t#endif\\n#endif\";\n\nvar envmap_pars_vertex = \"#ifdef USE_ENVMAP\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT )\\n\\t\\t#define ENV_WORLDPOS\\n\\t#endif\\n\\t#ifdef ENV_WORLDPOS\\n\\t\\t\\n\\t\\tvarying vec3 vWorldPosition;\\n\\t#else\\n\\t\\tvarying vec3 vReflect;\\n\\t\\tuniform float refractionRatio;\\n\\t#endif\\n#endif\";\n\nvar envmap_vertex = \"#ifdef USE_ENVMAP\\n\\t#ifdef ENV_WORLDPOS\\n\\t\\tvWorldPosition = worldPosition.xyz;\\n\\t#else\\n\\t\\tvec3 cameraToVertex;\\n\\t\\tif ( isOrthographic ) {\\n\\t\\t\\tcameraToVertex = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\\n\\t\\t} else {\\n\\t\\t\\tcameraToVertex = normalize( worldPosition.xyz - cameraPosition );\\n\\t\\t}\\n\\t\\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\\n\\t\\t#ifdef ENVMAP_MODE_REFLECTION\\n\\t\\t\\tvReflect = reflect( cameraToVertex, worldNormal );\\n\\t\\t#else\\n\\t\\t\\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\\n\\t\\t#endif\\n\\t#endif\\n#endif\";\n\nvar fog_vertex = \"#ifdef USE_FOG\\n\\tvFogDepth = - mvPosition.z;\\n#endif\";\n\nvar fog_pars_vertex = \"#ifdef USE_FOG\\n\\tvarying float vFogDepth;\\n#endif\";\n\nvar fog_fragment = \"#ifdef USE_FOG\\n\\t#ifdef FOG_EXP2\\n\\t\\tfloat fogFactor = 1.0 - exp( - fogDensity * fogDensity * vFogDepth * vFogDepth );\\n\\t#else\\n\\t\\tfloat fogFactor = smoothstep( fogNear, fogFar, vFogDepth );\\n\\t#endif\\n\\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\\n#endif\";\n\nvar fog_pars_fragment = \"#ifdef USE_FOG\\n\\tuniform vec3 fogColor;\\n\\tvarying float vFogDepth;\\n\\t#ifdef FOG_EXP2\\n\\t\\tuniform float fogDensity;\\n\\t#else\\n\\t\\tuniform float fogNear;\\n\\t\\tuniform float fogFar;\\n\\t#endif\\n#endif\";\n\nvar gradientmap_pars_fragment = \"#ifdef USE_GRADIENTMAP\\n\\tuniform sampler2D gradientMap;\\n#endif\\nvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\\n\\tfloat dotNL = dot( normal, lightDirection );\\n\\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\\n\\t#ifdef USE_GRADIENTMAP\\n\\t\\treturn vec3( texture2D( gradientMap, coord ).r );\\n\\t#else\\n\\t\\tvec2 fw = fwidth( coord ) * 0.5;\\n\\t\\treturn mix( vec3( 0.7 ), vec3( 1.0 ), smoothstep( 0.7 - fw.x, 0.7 + fw.x, coord.x ) );\\n\\t#endif\\n}\";\n\nvar lightmap_pars_fragment = \"#ifdef USE_LIGHTMAP\\n\\tuniform sampler2D lightMap;\\n\\tuniform float lightMapIntensity;\\n#endif\";\n\nvar lights_lambert_fragment = \"LambertMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb;\\nmaterial.specularStrength = specularStrength;\";\n\nvar lights_lambert_pars_fragment = \"varying vec3 vViewPosition;\\nstruct LambertMaterial {\\n\\tvec3 diffuseColor;\\n\\tfloat specularStrength;\\n};\\nvoid RE_Direct_Lambert( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in LambertMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\\n\\tvec3 irradiance = dotNL * directLight.color;\\n\\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\nvoid RE_IndirectDiffuse_Lambert( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in LambertMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_Lambert\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_Lambert\";\n\nvar lights_pars_begin = \"uniform bool receiveShadow;\\nuniform vec3 ambientLightColor;\\n#if defined( USE_LIGHT_PROBES )\\n\\tuniform vec3 lightProbe[ 9 ];\\n#endif\\nvec3 shGetIrradianceAt( in vec3 normal, in vec3 shCoefficients[ 9 ] ) {\\n\\tfloat x = normal.x, y = normal.y, z = normal.z;\\n\\tvec3 result = shCoefficients[ 0 ] * 0.886227;\\n\\tresult += shCoefficients[ 1 ] * 2.0 * 0.511664 * y;\\n\\tresult += shCoefficients[ 2 ] * 2.0 * 0.511664 * z;\\n\\tresult += shCoefficients[ 3 ] * 2.0 * 0.511664 * x;\\n\\tresult += shCoefficients[ 4 ] * 2.0 * 0.429043 * x * y;\\n\\tresult += shCoefficients[ 5 ] * 2.0 * 0.429043 * y * z;\\n\\tresult += shCoefficients[ 6 ] * ( 0.743125 * z * z - 0.247708 );\\n\\tresult += shCoefficients[ 7 ] * 2.0 * 0.429043 * x * z;\\n\\tresult += shCoefficients[ 8 ] * 0.429043 * ( x * x - y * y );\\n\\treturn result;\\n}\\nvec3 getLightProbeIrradiance( const in vec3 lightProbe[ 9 ], const in vec3 normal ) {\\n\\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\\n\\tvec3 irradiance = shGetIrradianceAt( worldNormal, lightProbe );\\n\\treturn irradiance;\\n}\\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\\n\\tvec3 irradiance = ambientLightColor;\\n\\treturn irradiance;\\n}\\nfloat getDistanceAttenuation( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\\n\\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\\n\\tif ( cutoffDistance > 0.0 ) {\\n\\t\\tdistanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\\n\\t}\\n\\treturn distanceFalloff;\\n}\\nfloat getSpotAttenuation( const in float coneCosine, const in float penumbraCosine, const in float angleCosine ) {\\n\\treturn smoothstep( coneCosine, penumbraCosine, angleCosine );\\n}\\n#if NUM_DIR_LIGHTS > 0\\n\\tstruct DirectionalLight {\\n\\t\\tvec3 direction;\\n\\t\\tvec3 color;\\n\\t};\\n\\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\\n\\tvoid getDirectionalLightInfo( const in DirectionalLight directionalLight, out IncidentLight light ) {\\n\\t\\tlight.color = directionalLight.color;\\n\\t\\tlight.direction = directionalLight.direction;\\n\\t\\tlight.visible = true;\\n\\t}\\n#endif\\n#if NUM_POINT_LIGHTS > 0\\n\\tstruct PointLight {\\n\\t\\tvec3 position;\\n\\t\\tvec3 color;\\n\\t\\tfloat distance;\\n\\t\\tfloat decay;\\n\\t};\\n\\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\\n\\tvoid getPointLightInfo( const in PointLight pointLight, const in vec3 geometryPosition, out IncidentLight light ) {\\n\\t\\tvec3 lVector = pointLight.position - geometryPosition;\\n\\t\\tlight.direction = normalize( lVector );\\n\\t\\tfloat lightDistance = length( lVector );\\n\\t\\tlight.color = pointLight.color;\\n\\t\\tlight.color *= getDistanceAttenuation( lightDistance, pointLight.distance, pointLight.decay );\\n\\t\\tlight.visible = ( light.color != vec3( 0.0 ) );\\n\\t}\\n#endif\\n#if NUM_SPOT_LIGHTS > 0\\n\\tstruct SpotLight {\\n\\t\\tvec3 position;\\n\\t\\tvec3 direction;\\n\\t\\tvec3 color;\\n\\t\\tfloat distance;\\n\\t\\tfloat decay;\\n\\t\\tfloat coneCos;\\n\\t\\tfloat penumbraCos;\\n\\t};\\n\\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\\n\\tvoid getSpotLightInfo( const in SpotLight spotLight, const in vec3 geometryPosition, out IncidentLight light ) {\\n\\t\\tvec3 lVector = spotLight.position - geometryPosition;\\n\\t\\tlight.direction = normalize( lVector );\\n\\t\\tfloat angleCos = dot( light.direction, spotLight.direction );\\n\\t\\tfloat spotAttenuation = getSpotAttenuation( spotLight.coneCos, spotLight.penumbraCos, angleCos );\\n\\t\\tif ( spotAttenuation > 0.0 ) {\\n\\t\\t\\tfloat lightDistance = length( lVector );\\n\\t\\t\\tlight.color = spotLight.color * spotAttenuation;\\n\\t\\t\\tlight.color *= getDistanceAttenuation( lightDistance, spotLight.distance, spotLight.decay );\\n\\t\\t\\tlight.visible = ( light.color != vec3( 0.0 ) );\\n\\t\\t} else {\\n\\t\\t\\tlight.color = vec3( 0.0 );\\n\\t\\t\\tlight.visible = false;\\n\\t\\t}\\n\\t}\\n#endif\\n#if NUM_RECT_AREA_LIGHTS > 0\\n\\tstruct RectAreaLight {\\n\\t\\tvec3 color;\\n\\t\\tvec3 position;\\n\\t\\tvec3 halfWidth;\\n\\t\\tvec3 halfHeight;\\n\\t};\\n\\tuniform sampler2D ltc_1;\\tuniform sampler2D ltc_2;\\n\\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\\n#endif\\n#if NUM_HEMI_LIGHTS > 0\\n\\tstruct HemisphereLight {\\n\\t\\tvec3 direction;\\n\\t\\tvec3 skyColor;\\n\\t\\tvec3 groundColor;\\n\\t};\\n\\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\\n\\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in vec3 normal ) {\\n\\t\\tfloat dotNL = dot( normal, hemiLight.direction );\\n\\t\\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\\n\\t\\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\\n\\t\\treturn irradiance;\\n\\t}\\n#endif\";\n\nvar envmap_physical_pars_fragment = \"#ifdef USE_ENVMAP\\n\\tvec3 getIBLIrradiance( const in vec3 normal ) {\\n\\t\\t#ifdef ENVMAP_TYPE_CUBE_UV\\n\\t\\t\\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\\n\\t\\t\\tvec4 envMapColor = textureCubeUV( envMap, envMapRotation * worldNormal, 1.0 );\\n\\t\\t\\treturn PI * envMapColor.rgb * envMapIntensity;\\n\\t\\t#else\\n\\t\\t\\treturn vec3( 0.0 );\\n\\t\\t#endif\\n\\t}\\n\\tvec3 getIBLRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness ) {\\n\\t\\t#ifdef ENVMAP_TYPE_CUBE_UV\\n\\t\\t\\tvec3 reflectVec = reflect( - viewDir, normal );\\n\\t\\t\\treflectVec = normalize( mix( reflectVec, normal, pow4( roughness ) ) );\\n\\t\\t\\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\\n\\t\\t\\tvec4 envMapColor = textureCubeUV( envMap, envMapRotation * reflectVec, roughness );\\n\\t\\t\\treturn envMapColor.rgb * envMapIntensity;\\n\\t\\t#else\\n\\t\\t\\treturn vec3( 0.0 );\\n\\t\\t#endif\\n\\t}\\n\\t#ifdef USE_ANISOTROPY\\n\\t\\tvec3 getIBLAnisotropyRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness, const in vec3 bitangent, const in float anisotropy ) {\\n\\t\\t\\t#ifdef ENVMAP_TYPE_CUBE_UV\\n\\t\\t\\t\\tvec3 bentNormal = cross( bitangent, viewDir );\\n\\t\\t\\t\\tbentNormal = normalize( cross( bentNormal, bitangent ) );\\n\\t\\t\\t\\tbentNormal = normalize( mix( bentNormal, normal, pow2( pow2( 1.0 - anisotropy * ( 1.0 - roughness ) ) ) ) );\\n\\t\\t\\t\\treturn getIBLRadiance( viewDir, bentNormal, roughness );\\n\\t\\t\\t#else\\n\\t\\t\\t\\treturn vec3( 0.0 );\\n\\t\\t\\t#endif\\n\\t\\t}\\n\\t#endif\\n#endif\";\n\nvar lights_toon_fragment = \"ToonMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb;\";\n\nvar lights_toon_pars_fragment = \"varying vec3 vViewPosition;\\nstruct ToonMaterial {\\n\\tvec3 diffuseColor;\\n};\\nvoid RE_Direct_Toon( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tvec3 irradiance = getGradientIrradiance( geometryNormal, directLight.direction ) * directLight.color;\\n\\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\nvoid RE_IndirectDiffuse_Toon( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_Toon\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_Toon\";\n\nvar lights_phong_fragment = \"BlinnPhongMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb;\\nmaterial.specularColor = specular;\\nmaterial.specularShininess = shininess;\\nmaterial.specularStrength = specularStrength;\";\n\nvar lights_phong_pars_fragment = \"varying vec3 vViewPosition;\\nstruct BlinnPhongMaterial {\\n\\tvec3 diffuseColor;\\n\\tvec3 specularColor;\\n\\tfloat specularShininess;\\n\\tfloat specularStrength;\\n};\\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\\n\\tvec3 irradiance = dotNL * directLight.color;\\n\\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n\\treflectedLight.directSpecular += irradiance * BRDF_BlinnPhong( directLight.direction, geometryViewDir, geometryNormal, material.specularColor, material.specularShininess ) * material.specularStrength;\\n}\\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_BlinnPhong\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_BlinnPhong\";\n\nvar lights_physical_fragment = \"PhysicalMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\\nvec3 dxy = max( abs( dFdx( nonPerturbedNormal ) ), abs( dFdy( nonPerturbedNormal ) ) );\\nfloat geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );\\nmaterial.roughness = max( roughnessFactor, 0.0525 );material.roughness += geometryRoughness;\\nmaterial.roughness = min( material.roughness, 1.0 );\\n#ifdef IOR\\n\\tmaterial.ior = ior;\\n\\t#ifdef USE_SPECULAR\\n\\t\\tfloat specularIntensityFactor = specularIntensity;\\n\\t\\tvec3 specularColorFactor = specularColor;\\n\\t\\t#ifdef USE_SPECULAR_COLORMAP\\n\\t\\t\\tspecularColorFactor *= texture2D( specularColorMap, vSpecularColorMapUv ).rgb;\\n\\t\\t#endif\\n\\t\\t#ifdef USE_SPECULAR_INTENSITYMAP\\n\\t\\t\\tspecularIntensityFactor *= texture2D( specularIntensityMap, vSpecularIntensityMapUv ).a;\\n\\t\\t#endif\\n\\t\\tmaterial.specularF90 = mix( specularIntensityFactor, 1.0, metalnessFactor );\\n\\t#else\\n\\t\\tfloat specularIntensityFactor = 1.0;\\n\\t\\tvec3 specularColorFactor = vec3( 1.0 );\\n\\t\\tmaterial.specularF90 = 1.0;\\n\\t#endif\\n\\tmaterial.specularColor = mix( min( pow2( ( material.ior - 1.0 ) / ( material.ior + 1.0 ) ) * specularColorFactor, vec3( 1.0 ) ) * specularIntensityFactor, diffuseColor.rgb, metalnessFactor );\\n#else\\n\\tmaterial.specularColor = mix( vec3( 0.04 ), diffuseColor.rgb, metalnessFactor );\\n\\tmaterial.specularF90 = 1.0;\\n#endif\\n#ifdef USE_CLEARCOAT\\n\\tmaterial.clearcoat = clearcoat;\\n\\tmaterial.clearcoatRoughness = clearcoatRoughness;\\n\\tmaterial.clearcoatF0 = vec3( 0.04 );\\n\\tmaterial.clearcoatF90 = 1.0;\\n\\t#ifdef USE_CLEARCOATMAP\\n\\t\\tmaterial.clearcoat *= texture2D( clearcoatMap, vClearcoatMapUv ).x;\\n\\t#endif\\n\\t#ifdef USE_CLEARCOAT_ROUGHNESSMAP\\n\\t\\tmaterial.clearcoatRoughness *= texture2D( clearcoatRoughnessMap, vClearcoatRoughnessMapUv ).y;\\n\\t#endif\\n\\tmaterial.clearcoat = saturate( material.clearcoat );\\tmaterial.clearcoatRoughness = max( material.clearcoatRoughness, 0.0525 );\\n\\tmaterial.clearcoatRoughness += geometryRoughness;\\n\\tmaterial.clearcoatRoughness = min( material.clearcoatRoughness, 1.0 );\\n#endif\\n#ifdef USE_DISPERSION\\n\\tmaterial.dispersion = dispersion;\\n#endif\\n#ifdef USE_IRIDESCENCE\\n\\tmaterial.iridescence = iridescence;\\n\\tmaterial.iridescenceIOR = iridescenceIOR;\\n\\t#ifdef USE_IRIDESCENCEMAP\\n\\t\\tmaterial.iridescence *= texture2D( iridescenceMap, vIridescenceMapUv ).r;\\n\\t#endif\\n\\t#ifdef USE_IRIDESCENCE_THICKNESSMAP\\n\\t\\tmaterial.iridescenceThickness = (iridescenceThicknessMaximum - iridescenceThicknessMinimum) * texture2D( iridescenceThicknessMap, vIridescenceThicknessMapUv ).g + iridescenceThicknessMinimum;\\n\\t#else\\n\\t\\tmaterial.iridescenceThickness = iridescenceThicknessMaximum;\\n\\t#endif\\n#endif\\n#ifdef USE_SHEEN\\n\\tmaterial.sheenColor = sheenColor;\\n\\t#ifdef USE_SHEEN_COLORMAP\\n\\t\\tmaterial.sheenColor *= texture2D( sheenColorMap, vSheenColorMapUv ).rgb;\\n\\t#endif\\n\\tmaterial.sheenRoughness = clamp( sheenRoughness, 0.07, 1.0 );\\n\\t#ifdef USE_SHEEN_ROUGHNESSMAP\\n\\t\\tmaterial.sheenRoughness *= texture2D( sheenRoughnessMap, vSheenRoughnessMapUv ).a;\\n\\t#endif\\n#endif\\n#ifdef USE_ANISOTROPY\\n\\t#ifdef USE_ANISOTROPYMAP\\n\\t\\tmat2 anisotropyMat = mat2( anisotropyVector.x, anisotropyVector.y, - anisotropyVector.y, anisotropyVector.x );\\n\\t\\tvec3 anisotropyPolar = texture2D( anisotropyMap, vAnisotropyMapUv ).rgb;\\n\\t\\tvec2 anisotropyV = anisotropyMat * normalize( 2.0 * anisotropyPolar.rg - vec2( 1.0 ) ) * anisotropyPolar.b;\\n\\t#else\\n\\t\\tvec2 anisotropyV = anisotropyVector;\\n\\t#endif\\n\\tmaterial.anisotropy = length( anisotropyV );\\n\\tif( material.anisotropy == 0.0 ) {\\n\\t\\tanisotropyV = vec2( 1.0, 0.0 );\\n\\t} else {\\n\\t\\tanisotropyV /= material.anisotropy;\\n\\t\\tmaterial.anisotropy = saturate( material.anisotropy );\\n\\t}\\n\\tmaterial.alphaT = mix( pow2( material.roughness ), 1.0, pow2( material.anisotropy ) );\\n\\tmaterial.anisotropyT = tbn[ 0 ] * anisotropyV.x + tbn[ 1 ] * anisotropyV.y;\\n\\tmaterial.anisotropyB = tbn[ 1 ] * anisotropyV.x - tbn[ 0 ] * anisotropyV.y;\\n#endif\";\n\nvar lights_physical_pars_fragment = \"uniform sampler2D dfgLUT;\\nstruct PhysicalMaterial {\\n\\tvec3 diffuseColor;\\n\\tfloat roughness;\\n\\tvec3 specularColor;\\n\\tfloat specularF90;\\n\\tfloat dispersion;\\n\\t#ifdef USE_CLEARCOAT\\n\\t\\tfloat clearcoat;\\n\\t\\tfloat clearcoatRoughness;\\n\\t\\tvec3 clearcoatF0;\\n\\t\\tfloat clearcoatF90;\\n\\t#endif\\n\\t#ifdef USE_IRIDESCENCE\\n\\t\\tfloat iridescence;\\n\\t\\tfloat iridescenceIOR;\\n\\t\\tfloat iridescenceThickness;\\n\\t\\tvec3 iridescenceFresnel;\\n\\t\\tvec3 iridescenceF0;\\n\\t#endif\\n\\t#ifdef USE_SHEEN\\n\\t\\tvec3 sheenColor;\\n\\t\\tfloat sheenRoughness;\\n\\t#endif\\n\\t#ifdef IOR\\n\\t\\tfloat ior;\\n\\t#endif\\n\\t#ifdef USE_TRANSMISSION\\n\\t\\tfloat transmission;\\n\\t\\tfloat transmissionAlpha;\\n\\t\\tfloat thickness;\\n\\t\\tfloat attenuationDistance;\\n\\t\\tvec3 attenuationColor;\\n\\t#endif\\n\\t#ifdef USE_ANISOTROPY\\n\\t\\tfloat anisotropy;\\n\\t\\tfloat alphaT;\\n\\t\\tvec3 anisotropyT;\\n\\t\\tvec3 anisotropyB;\\n\\t#endif\\n};\\nvec3 clearcoatSpecularDirect = vec3( 0.0 );\\nvec3 clearcoatSpecularIndirect = vec3( 0.0 );\\nvec3 sheenSpecularDirect = vec3( 0.0 );\\nvec3 sheenSpecularIndirect = vec3(0.0 );\\nvec3 Schlick_to_F0( const in vec3 f, const in float f90, const in float dotVH ) {\\n    float x = clamp( 1.0 - dotVH, 0.0, 1.0 );\\n    float x2 = x * x;\\n    float x5 = clamp( x * x2 * x2, 0.0, 0.9999 );\\n    return ( f - vec3( f90 ) * x5 ) / ( 1.0 - x5 );\\n}\\nfloat V_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\\n\\tfloat a2 = pow2( alpha );\\n\\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\\n\\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\\n\\treturn 0.5 / max( gv + gl, EPSILON );\\n}\\nfloat D_GGX( const in float alpha, const in float dotNH ) {\\n\\tfloat a2 = pow2( alpha );\\n\\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\\n\\treturn RECIPROCAL_PI * a2 / pow2( denom );\\n}\\n#ifdef USE_ANISOTROPY\\n\\tfloat V_GGX_SmithCorrelated_Anisotropic( const in float alphaT, const in float alphaB, const in float dotTV, const in float dotBV, const in float dotTL, const in float dotBL, const in float dotNV, const in float dotNL ) {\\n\\t\\tfloat gv = dotNL * length( vec3( alphaT * dotTV, alphaB * dotBV, dotNV ) );\\n\\t\\tfloat gl = dotNV * length( vec3( alphaT * dotTL, alphaB * dotBL, dotNL ) );\\n\\t\\tfloat v = 0.5 / ( gv + gl );\\n\\t\\treturn saturate(v);\\n\\t}\\n\\tfloat D_GGX_Anisotropic( const in float alphaT, const in float alphaB, const in float dotNH, const in float dotTH, const in float dotBH ) {\\n\\t\\tfloat a2 = alphaT * alphaB;\\n\\t\\thighp vec3 v = vec3( alphaB * dotTH, alphaT * dotBH, a2 * dotNH );\\n\\t\\thighp float v2 = dot( v, v );\\n\\t\\tfloat w2 = a2 / v2;\\n\\t\\treturn RECIPROCAL_PI * a2 * pow2 ( w2 );\\n\\t}\\n#endif\\n#ifdef USE_CLEARCOAT\\n\\tvec3 BRDF_GGX_Clearcoat( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material) {\\n\\t\\tvec3 f0 = material.clearcoatF0;\\n\\t\\tfloat f90 = material.clearcoatF90;\\n\\t\\tfloat roughness = material.clearcoatRoughness;\\n\\t\\tfloat alpha = pow2( roughness );\\n\\t\\tvec3 halfDir = normalize( lightDir + viewDir );\\n\\t\\tfloat dotNL = saturate( dot( normal, lightDir ) );\\n\\t\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\t\\tfloat dotNH = saturate( dot( normal, halfDir ) );\\n\\t\\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\\n\\t\\tvec3 F = F_Schlick( f0, f90, dotVH );\\n\\t\\tfloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\\n\\t\\tfloat D = D_GGX( alpha, dotNH );\\n\\t\\treturn F * ( V * D );\\n\\t}\\n#endif\\nvec3 BRDF_GGX( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material ) {\\n\\tvec3 f0 = material.specularColor;\\n\\tfloat f90 = material.specularF90;\\n\\tfloat roughness = material.roughness;\\n\\tfloat alpha = pow2( roughness );\\n\\tvec3 halfDir = normalize( lightDir + viewDir );\\n\\tfloat dotNL = saturate( dot( normal, lightDir ) );\\n\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\tfloat dotNH = saturate( dot( normal, halfDir ) );\\n\\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\\n\\tvec3 F = F_Schlick( f0, f90, dotVH );\\n\\t#ifdef USE_IRIDESCENCE\\n\\t\\tF = mix( F, material.iridescenceFresnel, material.iridescence );\\n\\t#endif\\n\\t#ifdef USE_ANISOTROPY\\n\\t\\tfloat dotTL = dot( material.anisotropyT, lightDir );\\n\\t\\tfloat dotTV = dot( material.anisotropyT, viewDir );\\n\\t\\tfloat dotTH = dot( material.anisotropyT, halfDir );\\n\\t\\tfloat dotBL = dot( material.anisotropyB, lightDir );\\n\\t\\tfloat dotBV = dot( material.anisotropyB, viewDir );\\n\\t\\tfloat dotBH = dot( material.anisotropyB, halfDir );\\n\\t\\tfloat V = V_GGX_SmithCorrelated_Anisotropic( material.alphaT, alpha, dotTV, dotBV, dotTL, dotBL, dotNV, dotNL );\\n\\t\\tfloat D = D_GGX_Anisotropic( material.alphaT, alpha, dotNH, dotTH, dotBH );\\n\\t#else\\n\\t\\tfloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\\n\\t\\tfloat D = D_GGX( alpha, dotNH );\\n\\t#endif\\n\\treturn F * ( V * D );\\n}\\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\\n\\tconst float LUT_SIZE = 64.0;\\n\\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\\n\\tconst float LUT_BIAS = 0.5 / LUT_SIZE;\\n\\tfloat dotNV = saturate( dot( N, V ) );\\n\\tvec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) );\\n\\tuv = uv * LUT_SCALE + LUT_BIAS;\\n\\treturn uv;\\n}\\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\\n\\tfloat l = length( f );\\n\\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\\n}\\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\\n\\tfloat x = dot( v1, v2 );\\n\\tfloat y = abs( x );\\n\\tfloat a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y;\\n\\tfloat b = 3.4175940 + ( 4.1616724 + y ) * y;\\n\\tfloat v = a / b;\\n\\tfloat theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\\n\\treturn cross( v1, v2 ) * theta_sintheta;\\n}\\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\\n\\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\\n\\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\\n\\tvec3 lightNormal = cross( v1, v2 );\\n\\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\\n\\tvec3 T1, T2;\\n\\tT1 = normalize( V - N * dot( V, N ) );\\n\\tT2 = - cross( N, T1 );\\n\\tmat3 mat = mInv * transpose( mat3( T1, T2, N ) );\\n\\tvec3 coords[ 4 ];\\n\\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\\n\\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\\n\\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\\n\\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\\n\\tcoords[ 0 ] = normalize( coords[ 0 ] );\\n\\tcoords[ 1 ] = normalize( coords[ 1 ] );\\n\\tcoords[ 2 ] = normalize( coords[ 2 ] );\\n\\tcoords[ 3 ] = normalize( coords[ 3 ] );\\n\\tvec3 vectorFormFactor = vec3( 0.0 );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\\n\\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\\n\\treturn vec3( result );\\n}\\n#if defined( USE_SHEEN )\\nfloat D_Charlie( float roughness, float dotNH ) {\\n\\tfloat alpha = pow2( roughness );\\n\\tfloat invAlpha = 1.0 / alpha;\\n\\tfloat cos2h = dotNH * dotNH;\\n\\tfloat sin2h = max( 1.0 - cos2h, 0.0078125 );\\n\\treturn ( 2.0 + invAlpha ) * pow( sin2h, invAlpha * 0.5 ) / ( 2.0 * PI );\\n}\\nfloat V_Neubelt( float dotNV, float dotNL ) {\\n\\treturn saturate( 1.0 / ( 4.0 * ( dotNL + dotNV - dotNL * dotNV ) ) );\\n}\\nvec3 BRDF_Sheen( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, vec3 sheenColor, const in float sheenRoughness ) {\\n\\tvec3 halfDir = normalize( lightDir + viewDir );\\n\\tfloat dotNL = saturate( dot( normal, lightDir ) );\\n\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\tfloat dotNH = saturate( dot( normal, halfDir ) );\\n\\tfloat D = D_Charlie( sheenRoughness, dotNH );\\n\\tfloat V = V_Neubelt( dotNV, dotNL );\\n\\treturn sheenColor * ( D * V );\\n}\\n#endif\\nfloat IBLSheenBRDF( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\\n\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\tfloat r2 = roughness * roughness;\\n\\tfloat a = roughness < 0.25 ? -339.2 * r2 + 161.4 * roughness - 25.9 : -8.48 * r2 + 14.3 * roughness - 9.95;\\n\\tfloat b = roughness < 0.25 ? 44.0 * r2 - 23.7 * roughness + 3.26 : 1.97 * r2 - 3.27 * roughness + 0.72;\\n\\tfloat DG = exp( a * dotNV + b ) + ( roughness < 0.25 ? 0.0 : 0.1 * ( roughness - 0.25 ) );\\n\\treturn saturate( DG * RECIPROCAL_PI );\\n}\\nvec2 DFGApprox( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\\n\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\tvec2 uv = vec2( roughness, dotNV );\\n\\treturn texture2D( dfgLUT, uv ).rg;\\n}\\nvec3 EnvironmentBRDF( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness ) {\\n\\tvec2 fab = DFGApprox( normal, viewDir, roughness );\\n\\treturn specularColor * fab.x + specularF90 * fab.y;\\n}\\n#ifdef USE_IRIDESCENCE\\nvoid computeMultiscatteringIridescence( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float iridescence, const in vec3 iridescenceF0, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\\n#else\\nvoid computeMultiscattering( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\\n#endif\\n\\tvec2 fab = DFGApprox( normal, viewDir, roughness );\\n\\t#ifdef USE_IRIDESCENCE\\n\\t\\tvec3 Fr = mix( specularColor, iridescenceF0, iridescence );\\n\\t#else\\n\\t\\tvec3 Fr = specularColor;\\n\\t#endif\\n\\tvec3 FssEss = Fr * fab.x + specularF90 * fab.y;\\n\\tfloat Ess = fab.x + fab.y;\\n\\tfloat Ems = 1.0 - Ess;\\n\\tvec3 Favg = Fr + ( 1.0 - Fr ) * 0.047619;\\tvec3 Fms = FssEss * Favg / ( 1.0 - Ems * Favg );\\n\\tsingleScatter += FssEss;\\n\\tmultiScatter += Fms * Ems;\\n}\\nvec3 BRDF_GGX_Multiscatter( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material ) {\\n\\tvec3 singleScatter = BRDF_GGX( lightDir, viewDir, normal, material );\\n\\tfloat dotNL = saturate( dot( normal, lightDir ) );\\n\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\tvec2 dfgV = DFGApprox( vec3(0.0, 0.0, 1.0), vec3(sqrt(1.0 - dotNV * dotNV), 0.0, dotNV), material.roughness );\\n\\tvec2 dfgL = DFGApprox( vec3(0.0, 0.0, 1.0), vec3(sqrt(1.0 - dotNL * dotNL), 0.0, dotNL), material.roughness );\\n\\tvec3 FssEss_V = material.specularColor * dfgV.x + material.specularF90 * dfgV.y;\\n\\tvec3 FssEss_L = material.specularColor * dfgL.x + material.specularF90 * dfgL.y;\\n\\tfloat Ess_V = dfgV.x + dfgV.y;\\n\\tfloat Ess_L = dfgL.x + dfgL.y;\\n\\tfloat Ems_V = 1.0 - Ess_V;\\n\\tfloat Ems_L = 1.0 - Ess_L;\\n\\tvec3 Favg = material.specularColor + ( 1.0 - material.specularColor ) * 0.047619;\\n\\tvec3 Fms = FssEss_V * FssEss_L * Favg / ( 1.0 - Ems_V * Ems_L * Favg * Favg + EPSILON );\\n\\tfloat compensationFactor = Ems_V * Ems_L;\\n\\tvec3 multiScatter = Fms * compensationFactor;\\n\\treturn singleScatter + multiScatter;\\n}\\n#if NUM_RECT_AREA_LIGHTS > 0\\n\\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\t\\tvec3 normal = geometryNormal;\\n\\t\\tvec3 viewDir = geometryViewDir;\\n\\t\\tvec3 position = geometryPosition;\\n\\t\\tvec3 lightPos = rectAreaLight.position;\\n\\t\\tvec3 halfWidth = rectAreaLight.halfWidth;\\n\\t\\tvec3 halfHeight = rectAreaLight.halfHeight;\\n\\t\\tvec3 lightColor = rectAreaLight.color;\\n\\t\\tfloat roughness = material.roughness;\\n\\t\\tvec3 rectCoords[ 4 ];\\n\\t\\trectCoords[ 0 ] = lightPos + halfWidth - halfHeight;\\t\\trectCoords[ 1 ] = lightPos - halfWidth - halfHeight;\\n\\t\\trectCoords[ 2 ] = lightPos - halfWidth + halfHeight;\\n\\t\\trectCoords[ 3 ] = lightPos + halfWidth + halfHeight;\\n\\t\\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\\n\\t\\tvec4 t1 = texture2D( ltc_1, uv );\\n\\t\\tvec4 t2 = texture2D( ltc_2, uv );\\n\\t\\tmat3 mInv = mat3(\\n\\t\\t\\tvec3( t1.x, 0, t1.y ),\\n\\t\\t\\tvec3(    0, 1,    0 ),\\n\\t\\t\\tvec3( t1.z, 0, t1.w )\\n\\t\\t);\\n\\t\\tvec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );\\n\\t\\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\\n\\t\\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\\n\\t}\\n#endif\\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\\n\\tvec3 irradiance = dotNL * directLight.color;\\n\\t#ifdef USE_CLEARCOAT\\n\\t\\tfloat dotNLcc = saturate( dot( geometryClearcoatNormal, directLight.direction ) );\\n\\t\\tvec3 ccIrradiance = dotNLcc * directLight.color;\\n\\t\\tclearcoatSpecularDirect += ccIrradiance * BRDF_GGX_Clearcoat( directLight.direction, geometryViewDir, geometryClearcoatNormal, material );\\n\\t#endif\\n\\t#ifdef USE_SHEEN\\n\\t\\tsheenSpecularDirect += irradiance * BRDF_Sheen( directLight.direction, geometryViewDir, geometryNormal, material.sheenColor, material.sheenRoughness );\\n\\t#endif\\n\\treflectedLight.directSpecular += irradiance * BRDF_GGX_Multiscatter( directLight.direction, geometryViewDir, geometryNormal, material );\\n\\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradiance, const in vec3 clearcoatRadiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) {\\n\\t#ifdef USE_CLEARCOAT\\n\\t\\tclearcoatSpecularIndirect += clearcoatRadiance * EnvironmentBRDF( geometryClearcoatNormal, geometryViewDir, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );\\n\\t#endif\\n\\t#ifdef USE_SHEEN\\n\\t\\tsheenSpecularIndirect += irradiance * material.sheenColor * IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness );\\n\\t#endif\\n\\tvec3 singleScattering = vec3( 0.0 );\\n\\tvec3 multiScattering = vec3( 0.0 );\\n\\tvec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\\n\\t#ifdef USE_IRIDESCENCE\\n\\t\\tcomputeMultiscatteringIridescence( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.iridescence, material.iridescenceFresnel, material.roughness, singleScattering, multiScattering );\\n\\t#else\\n\\t\\tcomputeMultiscattering( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.roughness, singleScattering, multiScattering );\\n\\t#endif\\n\\tvec3 totalScattering = singleScattering + multiScattering;\\n\\tvec3 diffuse = material.diffuseColor * ( 1.0 - max( max( totalScattering.r, totalScattering.g ), totalScattering.b ) );\\n\\treflectedLight.indirectSpecular += radiance * singleScattering;\\n\\treflectedLight.indirectSpecular += multiScattering * cosineWeightedIrradiance;\\n\\treflectedLight.indirectDiffuse += diffuse * cosineWeightedIrradiance;\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_Physical\\n#define RE_Direct_RectArea\\t\\tRE_Direct_RectArea_Physical\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_Physical\\n#define RE_IndirectSpecular\\t\\tRE_IndirectSpecular_Physical\\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\\n\\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\\n}\";\n\nvar lights_fragment_begin = \"\\nvec3 geometryPosition = - vViewPosition;\\nvec3 geometryNormal = normal;\\nvec3 geometryViewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\\nvec3 geometryClearcoatNormal = vec3( 0.0 );\\n#ifdef USE_CLEARCOAT\\n\\tgeometryClearcoatNormal = clearcoatNormal;\\n#endif\\n#ifdef USE_IRIDESCENCE\\n\\tfloat dotNVi = saturate( dot( normal, geometryViewDir ) );\\n\\tif ( material.iridescenceThickness == 0.0 ) {\\n\\t\\tmaterial.iridescence = 0.0;\\n\\t} else {\\n\\t\\tmaterial.iridescence = saturate( material.iridescence );\\n\\t}\\n\\tif ( material.iridescence > 0.0 ) {\\n\\t\\tmaterial.iridescenceFresnel = evalIridescence( 1.0, material.iridescenceIOR, dotNVi, material.iridescenceThickness, material.specularColor );\\n\\t\\tmaterial.iridescenceF0 = Schlick_to_F0( material.iridescenceFresnel, 1.0, dotNVi );\\n\\t}\\n#endif\\nIncidentLight directLight;\\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tPointLight pointLight;\\n\\t#if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\\n\\tPointLightShadow pointLightShadow;\\n\\t#endif\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\\n\\t\\tpointLight = pointLights[ i ];\\n\\t\\tgetPointLightInfo( pointLight, geometryPosition, directLight );\\n\\t\\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS )\\n\\t\\tpointLightShadow = pointLightShadows[ i ];\\n\\t\\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowIntensity, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tSpotLight spotLight;\\n\\tvec4 spotColor;\\n\\tvec3 spotLightCoord;\\n\\tbool inSpotLightMap;\\n\\t#if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\\n\\tSpotLightShadow spotLightShadow;\\n\\t#endif\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\\n\\t\\tspotLight = spotLights[ i ];\\n\\t\\tgetSpotLightInfo( spotLight, geometryPosition, directLight );\\n\\t\\t#if ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\\n\\t\\t#define SPOT_LIGHT_MAP_INDEX UNROLLED_LOOP_INDEX\\n\\t\\t#elif ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\\n\\t\\t#define SPOT_LIGHT_MAP_INDEX NUM_SPOT_LIGHT_MAPS\\n\\t\\t#else\\n\\t\\t#define SPOT_LIGHT_MAP_INDEX ( UNROLLED_LOOP_INDEX - NUM_SPOT_LIGHT_SHADOWS + NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\\n\\t\\t#endif\\n\\t\\t#if ( SPOT_LIGHT_MAP_INDEX < NUM_SPOT_LIGHT_MAPS )\\n\\t\\t\\tspotLightCoord = vSpotLightCoord[ i ].xyz / vSpotLightCoord[ i ].w;\\n\\t\\t\\tinSpotLightMap = all( lessThan( abs( spotLightCoord * 2. - 1. ), vec3( 1.0 ) ) );\\n\\t\\t\\tspotColor = texture2D( spotLightMap[ SPOT_LIGHT_MAP_INDEX ], spotLightCoord.xy );\\n\\t\\t\\tdirectLight.color = inSpotLightMap ? directLight.color * spotColor.rgb : directLight.color;\\n\\t\\t#endif\\n\\t\\t#undef SPOT_LIGHT_MAP_INDEX\\n\\t\\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\\n\\t\\tspotLightShadow = spotLightShadows[ i ];\\n\\t\\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowIntensity, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tDirectionalLight directionalLight;\\n\\t#if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\\n\\tDirectionalLightShadow directionalLightShadow;\\n\\t#endif\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\\n\\t\\tdirectionalLight = directionalLights[ i ];\\n\\t\\tgetDirectionalLightInfo( directionalLight, directLight );\\n\\t\\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\\n\\t\\tdirectionalLightShadow = directionalLightShadows[ i ];\\n\\t\\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowIntensity, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\\n\\tRectAreaLight rectAreaLight;\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\\n\\t\\trectAreaLight = rectAreaLights[ i ];\\n\\t\\tRE_Direct_RectArea( rectAreaLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\\n#if defined( RE_IndirectDiffuse )\\n\\tvec3 iblIrradiance = vec3( 0.0 );\\n\\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\\n\\t#if defined( USE_LIGHT_PROBES )\\n\\t\\tirradiance += getLightProbeIrradiance( lightProbe, geometryNormal );\\n\\t#endif\\n\\t#if ( NUM_HEMI_LIGHTS > 0 )\\n\\t\\t#pragma unroll_loop_start\\n\\t\\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\\n\\t\\t\\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometryNormal );\\n\\t\\t}\\n\\t\\t#pragma unroll_loop_end\\n\\t#endif\\n#endif\\n#if defined( RE_IndirectSpecular )\\n\\tvec3 radiance = vec3( 0.0 );\\n\\tvec3 clearcoatRadiance = vec3( 0.0 );\\n#endif\";\n\nvar lights_fragment_maps = \"#if defined( RE_IndirectDiffuse )\\n\\t#ifdef USE_LIGHTMAP\\n\\t\\tvec4 lightMapTexel = texture2D( lightMap, vLightMapUv );\\n\\t\\tvec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity;\\n\\t\\tirradiance += lightMapIrradiance;\\n\\t#endif\\n\\t#if defined( USE_ENVMAP ) && defined( STANDARD ) && defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\tiblIrradiance += getIBLIrradiance( geometryNormal );\\n\\t#endif\\n#endif\\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\\n\\t#ifdef USE_ANISOTROPY\\n\\t\\tradiance += getIBLAnisotropyRadiance( geometryViewDir, geometryNormal, material.roughness, material.anisotropyB, material.anisotropy );\\n\\t#else\\n\\t\\tradiance += getIBLRadiance( geometryViewDir, geometryNormal, material.roughness );\\n\\t#endif\\n\\t#ifdef USE_CLEARCOAT\\n\\t\\tclearcoatRadiance += getIBLRadiance( geometryViewDir, geometryClearcoatNormal, material.clearcoatRoughness );\\n\\t#endif\\n#endif\";\n\nvar lights_fragment_end = \"#if defined( RE_IndirectDiffuse )\\n\\tRE_IndirectDiffuse( irradiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\\n#endif\\n#if defined( RE_IndirectSpecular )\\n\\tRE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\\n#endif\";\n\nvar logdepthbuf_fragment = \"#if defined( USE_LOGARITHMIC_DEPTH_BUFFER )\\n\\tgl_FragDepth = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;\\n#endif\";\n\nvar logdepthbuf_pars_fragment = \"#if defined( USE_LOGARITHMIC_DEPTH_BUFFER )\\n\\tuniform float logDepthBufFC;\\n\\tvarying float vFragDepth;\\n\\tvarying float vIsPerspective;\\n#endif\";\n\nvar logdepthbuf_pars_vertex = \"#ifdef USE_LOGARITHMIC_DEPTH_BUFFER\\n\\tvarying float vFragDepth;\\n\\tvarying float vIsPerspective;\\n#endif\";\n\nvar logdepthbuf_vertex = \"#ifdef USE_LOGARITHMIC_DEPTH_BUFFER\\n\\tvFragDepth = 1.0 + gl_Position.w;\\n\\tvIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) );\\n#endif\";\n\nvar map_fragment = \"#ifdef USE_MAP\\n\\tvec4 sampledDiffuseColor = texture2D( map, vMapUv );\\n\\t#ifdef DECODE_VIDEO_TEXTURE\\n\\t\\tsampledDiffuseColor = sRGBTransferEOTF( sampledDiffuseColor );\\n\\t#endif\\n\\tdiffuseColor *= sampledDiffuseColor;\\n#endif\";\n\nvar map_pars_fragment = \"#ifdef USE_MAP\\n\\tuniform sampler2D map;\\n#endif\";\n\nvar map_particle_fragment = \"#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\\n\\t#if defined( USE_POINTS_UV )\\n\\t\\tvec2 uv = vUv;\\n\\t#else\\n\\t\\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\\n\\t#endif\\n#endif\\n#ifdef USE_MAP\\n\\tdiffuseColor *= texture2D( map, uv );\\n#endif\\n#ifdef USE_ALPHAMAP\\n\\tdiffuseColor.a *= texture2D( alphaMap, uv ).g;\\n#endif\";\n\nvar map_particle_pars_fragment = \"#if defined( USE_POINTS_UV )\\n\\tvarying vec2 vUv;\\n#else\\n\\t#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\\n\\t\\tuniform mat3 uvTransform;\\n\\t#endif\\n#endif\\n#ifdef USE_MAP\\n\\tuniform sampler2D map;\\n#endif\\n#ifdef USE_ALPHAMAP\\n\\tuniform sampler2D alphaMap;\\n#endif\";\n\nvar metalnessmap_fragment = \"float metalnessFactor = metalness;\\n#ifdef USE_METALNESSMAP\\n\\tvec4 texelMetalness = texture2D( metalnessMap, vMetalnessMapUv );\\n\\tmetalnessFactor *= texelMetalness.b;\\n#endif\";\n\nvar metalnessmap_pars_fragment = \"#ifdef USE_METALNESSMAP\\n\\tuniform sampler2D metalnessMap;\\n#endif\";\n\nvar morphinstance_vertex = \"#ifdef USE_INSTANCING_MORPH\\n\\tfloat morphTargetInfluences[ MORPHTARGETS_COUNT ];\\n\\tfloat morphTargetBaseInfluence = texelFetch( morphTexture, ivec2( 0, gl_InstanceID ), 0 ).r;\\n\\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\\n\\t\\tmorphTargetInfluences[i] =  texelFetch( morphTexture, ivec2( i + 1, gl_InstanceID ), 0 ).r;\\n\\t}\\n#endif\";\n\nvar morphcolor_vertex = \"#if defined( USE_MORPHCOLORS )\\n\\tvColor *= morphTargetBaseInfluence;\\n\\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\\n\\t\\t#if defined( USE_COLOR_ALPHA )\\n\\t\\t\\tif ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ) * morphTargetInfluences[ i ];\\n\\t\\t#elif defined( USE_COLOR )\\n\\t\\t\\tif ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ).rgb * morphTargetInfluences[ i ];\\n\\t\\t#endif\\n\\t}\\n#endif\";\n\nvar morphnormal_vertex = \"#ifdef USE_MORPHNORMALS\\n\\tobjectNormal *= morphTargetBaseInfluence;\\n\\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\\n\\t\\tif ( morphTargetInfluences[ i ] != 0.0 ) objectNormal += getMorph( gl_VertexID, i, 1 ).xyz * morphTargetInfluences[ i ];\\n\\t}\\n#endif\";\n\nvar morphtarget_pars_vertex = \"#ifdef USE_MORPHTARGETS\\n\\t#ifndef USE_INSTANCING_MORPH\\n\\t\\tuniform float morphTargetBaseInfluence;\\n\\t\\tuniform float morphTargetInfluences[ MORPHTARGETS_COUNT ];\\n\\t#endif\\n\\tuniform sampler2DArray morphTargetsTexture;\\n\\tuniform ivec2 morphTargetsTextureSize;\\n\\tvec4 getMorph( const in int vertexIndex, const in int morphTargetIndex, const in int offset ) {\\n\\t\\tint texelIndex = vertexIndex * MORPHTARGETS_TEXTURE_STRIDE + offset;\\n\\t\\tint y = texelIndex / morphTargetsTextureSize.x;\\n\\t\\tint x = texelIndex - y * morphTargetsTextureSize.x;\\n\\t\\tivec3 morphUV = ivec3( x, y, morphTargetIndex );\\n\\t\\treturn texelFetch( morphTargetsTexture, morphUV, 0 );\\n\\t}\\n#endif\";\n\nvar morphtarget_vertex = \"#ifdef USE_MORPHTARGETS\\n\\ttransformed *= morphTargetBaseInfluence;\\n\\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\\n\\t\\tif ( morphTargetInfluences[ i ] != 0.0 ) transformed += getMorph( gl_VertexID, i, 0 ).xyz * morphTargetInfluences[ i ];\\n\\t}\\n#endif\";\n\nvar normal_fragment_begin = \"float faceDirection = gl_FrontFacing ? 1.0 : - 1.0;\\n#ifdef FLAT_SHADED\\n\\tvec3 fdx = dFdx( vViewPosition );\\n\\tvec3 fdy = dFdy( vViewPosition );\\n\\tvec3 normal = normalize( cross( fdx, fdy ) );\\n#else\\n\\tvec3 normal = normalize( vNormal );\\n\\t#ifdef DOUBLE_SIDED\\n\\t\\tnormal *= faceDirection;\\n\\t#endif\\n#endif\\n#if defined( USE_NORMALMAP_TANGENTSPACE ) || defined( USE_CLEARCOAT_NORMALMAP ) || defined( USE_ANISOTROPY )\\n\\t#ifdef USE_TANGENT\\n\\t\\tmat3 tbn = mat3( normalize( vTangent ), normalize( vBitangent ), normal );\\n\\t#else\\n\\t\\tmat3 tbn = getTangentFrame( - vViewPosition, normal,\\n\\t\\t#if defined( USE_NORMALMAP )\\n\\t\\t\\tvNormalMapUv\\n\\t\\t#elif defined( USE_CLEARCOAT_NORMALMAP )\\n\\t\\t\\tvClearcoatNormalMapUv\\n\\t\\t#else\\n\\t\\t\\tvUv\\n\\t\\t#endif\\n\\t\\t);\\n\\t#endif\\n\\t#if defined( DOUBLE_SIDED ) && ! defined( FLAT_SHADED )\\n\\t\\ttbn[0] *= faceDirection;\\n\\t\\ttbn[1] *= faceDirection;\\n\\t#endif\\n#endif\\n#ifdef USE_CLEARCOAT_NORMALMAP\\n\\t#ifdef USE_TANGENT\\n\\t\\tmat3 tbn2 = mat3( normalize( vTangent ), normalize( vBitangent ), normal );\\n\\t#else\\n\\t\\tmat3 tbn2 = getTangentFrame( - vViewPosition, normal, vClearcoatNormalMapUv );\\n\\t#endif\\n\\t#if defined( DOUBLE_SIDED ) && ! defined( FLAT_SHADED )\\n\\t\\ttbn2[0] *= faceDirection;\\n\\t\\ttbn2[1] *= faceDirection;\\n\\t#endif\\n#endif\\nvec3 nonPerturbedNormal = normal;\";\n\nvar normal_fragment_maps = \"#ifdef USE_NORMALMAP_OBJECTSPACE\\n\\tnormal = texture2D( normalMap, vNormalMapUv ).xyz * 2.0 - 1.0;\\n\\t#ifdef FLIP_SIDED\\n\\t\\tnormal = - normal;\\n\\t#endif\\n\\t#ifdef DOUBLE_SIDED\\n\\t\\tnormal = normal * faceDirection;\\n\\t#endif\\n\\tnormal = normalize( normalMatrix * normal );\\n#elif defined( USE_NORMALMAP_TANGENTSPACE )\\n\\tvec3 mapN = texture2D( normalMap, vNormalMapUv ).xyz * 2.0 - 1.0;\\n\\tmapN.xy *= normalScale;\\n\\tnormal = normalize( tbn * mapN );\\n#elif defined( USE_BUMPMAP )\\n\\tnormal = perturbNormalArb( - vViewPosition, normal, dHdxy_fwd(), faceDirection );\\n#endif\";\n\nvar normal_pars_fragment = \"#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n\\t#ifdef USE_TANGENT\\n\\t\\tvarying vec3 vTangent;\\n\\t\\tvarying vec3 vBitangent;\\n\\t#endif\\n#endif\";\n\nvar normal_pars_vertex = \"#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n\\t#ifdef USE_TANGENT\\n\\t\\tvarying vec3 vTangent;\\n\\t\\tvarying vec3 vBitangent;\\n\\t#endif\\n#endif\";\n\nvar normal_vertex = \"#ifndef FLAT_SHADED\\n\\tvNormal = normalize( transformedNormal );\\n\\t#ifdef USE_TANGENT\\n\\t\\tvTangent = normalize( transformedTangent );\\n\\t\\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\\n\\t#endif\\n#endif\";\n\nvar normalmap_pars_fragment = \"#ifdef USE_NORMALMAP\\n\\tuniform sampler2D normalMap;\\n\\tuniform vec2 normalScale;\\n#endif\\n#ifdef USE_NORMALMAP_OBJECTSPACE\\n\\tuniform mat3 normalMatrix;\\n#endif\\n#if ! defined ( USE_TANGENT ) && ( defined ( USE_NORMALMAP_TANGENTSPACE ) || defined ( USE_CLEARCOAT_NORMALMAP ) || defined( USE_ANISOTROPY ) )\\n\\tmat3 getTangentFrame( vec3 eye_pos, vec3 surf_norm, vec2 uv ) {\\n\\t\\tvec3 q0 = dFdx( eye_pos.xyz );\\n\\t\\tvec3 q1 = dFdy( eye_pos.xyz );\\n\\t\\tvec2 st0 = dFdx( uv.st );\\n\\t\\tvec2 st1 = dFdy( uv.st );\\n\\t\\tvec3 N = surf_norm;\\n\\t\\tvec3 q1perp = cross( q1, N );\\n\\t\\tvec3 q0perp = cross( N, q0 );\\n\\t\\tvec3 T = q1perp * st0.x + q0perp * st1.x;\\n\\t\\tvec3 B = q1perp * st0.y + q0perp * st1.y;\\n\\t\\tfloat det = max( dot( T, T ), dot( B, B ) );\\n\\t\\tfloat scale = ( det == 0.0 ) ? 0.0 : inversesqrt( det );\\n\\t\\treturn mat3( T * scale, B * scale, N );\\n\\t}\\n#endif\";\n\nvar clearcoat_normal_fragment_begin = \"#ifdef USE_CLEARCOAT\\n\\tvec3 clearcoatNormal = nonPerturbedNormal;\\n#endif\";\n\nvar clearcoat_normal_fragment_maps = \"#ifdef USE_CLEARCOAT_NORMALMAP\\n\\tvec3 clearcoatMapN = texture2D( clearcoatNormalMap, vClearcoatNormalMapUv ).xyz * 2.0 - 1.0;\\n\\tclearcoatMapN.xy *= clearcoatNormalScale;\\n\\tclearcoatNormal = normalize( tbn2 * clearcoatMapN );\\n#endif\";\n\nvar clearcoat_pars_fragment = \"#ifdef USE_CLEARCOATMAP\\n\\tuniform sampler2D clearcoatMap;\\n#endif\\n#ifdef USE_CLEARCOAT_NORMALMAP\\n\\tuniform sampler2D clearcoatNormalMap;\\n\\tuniform vec2 clearcoatNormalScale;\\n#endif\\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\\n\\tuniform sampler2D clearcoatRoughnessMap;\\n#endif\";\n\nvar iridescence_pars_fragment = \"#ifdef USE_IRIDESCENCEMAP\\n\\tuniform sampler2D iridescenceMap;\\n#endif\\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\\n\\tuniform sampler2D iridescenceThicknessMap;\\n#endif\";\n\nvar opaque_fragment = \"#ifdef OPAQUE\\ndiffuseColor.a = 1.0;\\n#endif\\n#ifdef USE_TRANSMISSION\\ndiffuseColor.a *= material.transmissionAlpha;\\n#endif\\ngl_FragColor = vec4( outgoingLight, diffuseColor.a );\";\n\nvar packing = \"vec3 packNormalToRGB( const in vec3 normal ) {\\n\\treturn normalize( normal ) * 0.5 + 0.5;\\n}\\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\\n\\treturn 2.0 * rgb.xyz - 1.0;\\n}\\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;const float ShiftRight8 = 1. / 256.;\\nconst float Inv255 = 1. / 255.;\\nconst vec4 PackFactors = vec4( 1.0, 256.0, 256.0 * 256.0, 256.0 * 256.0 * 256.0 );\\nconst vec2 UnpackFactors2 = vec2( UnpackDownscale, 1.0 / PackFactors.g );\\nconst vec3 UnpackFactors3 = vec3( UnpackDownscale / PackFactors.rg, 1.0 / PackFactors.b );\\nconst vec4 UnpackFactors4 = vec4( UnpackDownscale / PackFactors.rgb, 1.0 / PackFactors.a );\\nvec4 packDepthToRGBA( const in float v ) {\\n\\tif( v <= 0.0 )\\n\\t\\treturn vec4( 0., 0., 0., 0. );\\n\\tif( v >= 1.0 )\\n\\t\\treturn vec4( 1., 1., 1., 1. );\\n\\tfloat vuf;\\n\\tfloat af = modf( v * PackFactors.a, vuf );\\n\\tfloat bf = modf( vuf * ShiftRight8, vuf );\\n\\tfloat gf = modf( vuf * ShiftRight8, vuf );\\n\\treturn vec4( vuf * Inv255, gf * PackUpscale, bf * PackUpscale, af );\\n}\\nvec3 packDepthToRGB( const in float v ) {\\n\\tif( v <= 0.0 )\\n\\t\\treturn vec3( 0., 0., 0. );\\n\\tif( v >= 1.0 )\\n\\t\\treturn vec3( 1., 1., 1. );\\n\\tfloat vuf;\\n\\tfloat bf = modf( v * PackFactors.b, vuf );\\n\\tfloat gf = modf( vuf * ShiftRight8, vuf );\\n\\treturn vec3( vuf * Inv255, gf * PackUpscale, bf );\\n}\\nvec2 packDepthToRG( const in float v ) {\\n\\tif( v <= 0.0 )\\n\\t\\treturn vec2( 0., 0. );\\n\\tif( v >= 1.0 )\\n\\t\\treturn vec2( 1., 1. );\\n\\tfloat vuf;\\n\\tfloat gf = modf( v * 256., vuf );\\n\\treturn vec2( vuf * Inv255, gf );\\n}\\nfloat unpackRGBAToDepth( const in vec4 v ) {\\n\\treturn dot( v, UnpackFactors4 );\\n}\\nfloat unpackRGBToDepth( const in vec3 v ) {\\n\\treturn dot( v, UnpackFactors3 );\\n}\\nfloat unpackRGToDepth( const in vec2 v ) {\\n\\treturn v.r * UnpackFactors2.r + v.g * UnpackFactors2.g;\\n}\\nvec4 pack2HalfToRGBA( const in vec2 v ) {\\n\\tvec4 r = vec4( v.x, fract( v.x * 255.0 ), v.y, fract( v.y * 255.0 ) );\\n\\treturn vec4( r.x - r.y / 255.0, r.y, r.z - r.w / 255.0, r.w );\\n}\\nvec2 unpackRGBATo2Half( const in vec4 v ) {\\n\\treturn vec2( v.x + ( v.y / 255.0 ), v.z + ( v.w / 255.0 ) );\\n}\\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\\n\\treturn ( viewZ + near ) / ( near - far );\\n}\\nfloat orthographicDepthToViewZ( const in float depth, const in float near, const in float far ) {\\n\\treturn depth * ( near - far ) - near;\\n}\\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\\n\\treturn ( ( near + viewZ ) * far ) / ( ( far - near ) * viewZ );\\n}\\nfloat perspectiveDepthToViewZ( const in float depth, const in float near, const in float far ) {\\n\\treturn ( near * far ) / ( ( far - near ) * depth - far );\\n}\";\n\nvar premultiplied_alpha_fragment = \"#ifdef PREMULTIPLIED_ALPHA\\n\\tgl_FragColor.rgb *= gl_FragColor.a;\\n#endif\";\n\nvar project_vertex = \"vec4 mvPosition = vec4( transformed, 1.0 );\\n#ifdef USE_BATCHING\\n\\tmvPosition = batchingMatrix * mvPosition;\\n#endif\\n#ifdef USE_INSTANCING\\n\\tmvPosition = instanceMatrix * mvPosition;\\n#endif\\nmvPosition = modelViewMatrix * mvPosition;\\ngl_Position = projectionMatrix * mvPosition;\";\n\nvar dithering_fragment = \"#ifdef DITHERING\\n\\tgl_FragColor.rgb = dithering( gl_FragColor.rgb );\\n#endif\";\n\nvar dithering_pars_fragment = \"#ifdef DITHERING\\n\\tvec3 dithering( vec3 color ) {\\n\\t\\tfloat grid_position = rand( gl_FragCoord.xy );\\n\\t\\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\\n\\t\\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\\n\\t\\treturn color + dither_shift_RGB;\\n\\t}\\n#endif\";\n\nvar roughnessmap_fragment = \"float roughnessFactor = roughness;\\n#ifdef USE_ROUGHNESSMAP\\n\\tvec4 texelRoughness = texture2D( roughnessMap, vRoughnessMapUv );\\n\\troughnessFactor *= texelRoughness.g;\\n#endif\";\n\nvar roughnessmap_pars_fragment = \"#ifdef USE_ROUGHNESSMAP\\n\\tuniform sampler2D roughnessMap;\\n#endif\";\n\nvar shadowmap_pars_fragment = \"#if NUM_SPOT_LIGHT_COORDS > 0\\n\\tvarying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\\n#endif\\n#if NUM_SPOT_LIGHT_MAPS > 0\\n\\tuniform sampler2D spotLightMap[ NUM_SPOT_LIGHT_MAPS ];\\n#endif\\n#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHT_SHADOWS > 0\\n\\t\\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t\\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t\\tstruct DirectionalLightShadow {\\n\\t\\t\\tfloat shadowIntensity;\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t};\\n\\t\\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHT_SHADOWS > 0\\n\\t\\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\\n\\t\\tstruct SpotLightShadow {\\n\\t\\t\\tfloat shadowIntensity;\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t};\\n\\t\\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\\n\\t#endif\\n\\t#if NUM_POINT_LIGHT_SHADOWS > 0\\n\\t\\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t\\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t\\tstruct PointLightShadow {\\n\\t\\t\\tfloat shadowIntensity;\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t\\tfloat shadowCameraNear;\\n\\t\\t\\tfloat shadowCameraFar;\\n\\t\\t};\\n\\t\\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t#endif\\n\\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\\n\\t\\tfloat depth = unpackRGBAToDepth( texture2D( depths, uv ) );\\n\\t\\t#ifdef USE_REVERSED_DEPTH_BUFFER\\n\\t\\t\\treturn step( depth, compare );\\n\\t\\t#else\\n\\t\\t\\treturn step( compare, depth );\\n\\t\\t#endif\\n\\t}\\n\\tvec2 texture2DDistribution( sampler2D shadow, vec2 uv ) {\\n\\t\\treturn unpackRGBATo2Half( texture2D( shadow, uv ) );\\n\\t}\\n\\tfloat VSMShadow( sampler2D shadow, vec2 uv, float compare ) {\\n\\t\\tfloat occlusion = 1.0;\\n\\t\\tvec2 distribution = texture2DDistribution( shadow, uv );\\n\\t\\t#ifdef USE_REVERSED_DEPTH_BUFFER\\n\\t\\t\\tfloat hard_shadow = step( distribution.x, compare );\\n\\t\\t#else\\n\\t\\t\\tfloat hard_shadow = step( compare, distribution.x );\\n\\t\\t#endif\\n\\t\\tif ( hard_shadow != 1.0 ) {\\n\\t\\t\\tfloat distance = compare - distribution.x;\\n\\t\\t\\tfloat variance = max( 0.00000, distribution.y * distribution.y );\\n\\t\\t\\tfloat softness_probability = variance / (variance + distance * distance );\\t\\t\\tsoftness_probability = clamp( ( softness_probability - 0.3 ) / ( 0.95 - 0.3 ), 0.0, 1.0 );\\t\\t\\tocclusion = clamp( max( hard_shadow, softness_probability ), 0.0, 1.0 );\\n\\t\\t}\\n\\t\\treturn occlusion;\\n\\t}\\n\\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\\n\\t\\tfloat shadow = 1.0;\\n\\t\\tshadowCoord.xyz /= shadowCoord.w;\\n\\t\\tshadowCoord.z += shadowBias;\\n\\t\\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\\n\\t\\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\\n\\t\\tif ( frustumTest ) {\\n\\t\\t#if defined( SHADOWMAP_TYPE_PCF )\\n\\t\\t\\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\\n\\t\\t\\tfloat dx0 = - texelSize.x * shadowRadius;\\n\\t\\t\\tfloat dy0 = - texelSize.y * shadowRadius;\\n\\t\\t\\tfloat dx1 = + texelSize.x * shadowRadius;\\n\\t\\t\\tfloat dy1 = + texelSize.y * shadowRadius;\\n\\t\\t\\tfloat dx2 = dx0 / 2.0;\\n\\t\\t\\tfloat dy2 = dy0 / 2.0;\\n\\t\\t\\tfloat dx3 = dx1 / 2.0;\\n\\t\\t\\tfloat dy3 = dy1 / 2.0;\\n\\t\\t\\tshadow = (\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy2 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy2 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy2 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy3 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy3 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy3 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\\n\\t\\t\\t) * ( 1.0 / 17.0 );\\n\\t\\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\\n\\t\\t\\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\\n\\t\\t\\tfloat dx = texelSize.x;\\n\\t\\t\\tfloat dy = texelSize.y;\\n\\t\\t\\tvec2 uv = shadowCoord.xy;\\n\\t\\t\\tvec2 f = fract( uv * shadowMapSize + 0.5 );\\n\\t\\t\\tuv -= f * texelSize;\\n\\t\\t\\tshadow = (\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, uv, shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, uv + vec2( dx, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, uv + vec2( 0.0, dy ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, uv + texelSize, shadowCoord.z ) +\\n\\t\\t\\t\\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, 0.0 ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 0.0 ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t f.x ) +\\n\\t\\t\\t\\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t f.x ) +\\n\\t\\t\\t\\tmix( texture2DCompare( shadowMap, uv + vec2( 0.0, -dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( 0.0, 2.0 * dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t f.y ) +\\n\\t\\t\\t\\tmix( texture2DCompare( shadowMap, uv + vec2( dx, -dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( dx, 2.0 * dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t f.y ) +\\n\\t\\t\\t\\tmix( mix( texture2DCompare( shadowMap, uv + vec2( -dx, -dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t\\t  texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, -dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t\\t  f.x ),\\n\\t\\t\\t\\t\\t mix( texture2DCompare( shadowMap, uv + vec2( -dx, 2.0 * dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t\\t  texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 2.0 * dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t\\t  f.x ),\\n\\t\\t\\t\\t\\t f.y )\\n\\t\\t\\t) * ( 1.0 / 9.0 );\\n\\t\\t#elif defined( SHADOWMAP_TYPE_VSM )\\n\\t\\t\\tshadow = VSMShadow( shadowMap, shadowCoord.xy, shadowCoord.z );\\n\\t\\t#else\\n\\t\\t\\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\\n\\t\\t#endif\\n\\t\\t}\\n\\t\\treturn mix( 1.0, shadow, shadowIntensity );\\n\\t}\\n\\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\\n\\t\\tvec3 absV = abs( v );\\n\\t\\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\\n\\t\\tabsV *= scaleToCube;\\n\\t\\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\\n\\t\\tvec2 planar = v.xy;\\n\\t\\tfloat almostATexel = 1.5 * texelSizeY;\\n\\t\\tfloat almostOne = 1.0 - almostATexel;\\n\\t\\tif ( absV.z >= almostOne ) {\\n\\t\\t\\tif ( v.z > 0.0 )\\n\\t\\t\\t\\tplanar.x = 4.0 - v.x;\\n\\t\\t} else if ( absV.x >= almostOne ) {\\n\\t\\t\\tfloat signX = sign( v.x );\\n\\t\\t\\tplanar.x = v.z * signX + 2.0 * signX;\\n\\t\\t} else if ( absV.y >= almostOne ) {\\n\\t\\t\\tfloat signY = sign( v.y );\\n\\t\\t\\tplanar.x = v.x + 2.0 * signY + 2.0;\\n\\t\\t\\tplanar.y = v.z * signY - 2.0;\\n\\t\\t}\\n\\t\\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\\n\\t}\\n\\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\\n\\t\\tfloat shadow = 1.0;\\n\\t\\tvec3 lightToPosition = shadowCoord.xyz;\\n\\t\\t\\n\\t\\tfloat lightToPositionLength = length( lightToPosition );\\n\\t\\tif ( lightToPositionLength - shadowCameraFar <= 0.0 && lightToPositionLength - shadowCameraNear >= 0.0 ) {\\n\\t\\t\\tfloat dp = ( lightToPositionLength - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear );\\t\\t\\tdp += shadowBias;\\n\\t\\t\\tvec3 bd3D = normalize( lightToPosition );\\n\\t\\t\\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\\n\\t\\t\\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT ) || defined( SHADOWMAP_TYPE_VSM )\\n\\t\\t\\t\\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\\n\\t\\t\\t\\tshadow = (\\n\\t\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\\n\\t\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\\n\\t\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\\n\\t\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\\n\\t\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\\n\\t\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\\n\\t\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\\n\\t\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\\n\\t\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\\n\\t\\t\\t\\t) * ( 1.0 / 9.0 );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tshadow = texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\\n\\t\\t\\t#endif\\n\\t\\t}\\n\\t\\treturn mix( 1.0, shadow, shadowIntensity );\\n\\t}\\n#endif\";\n\nvar shadowmap_pars_vertex = \"#if NUM_SPOT_LIGHT_COORDS > 0\\n\\tuniform mat4 spotLightMatrix[ NUM_SPOT_LIGHT_COORDS ];\\n\\tvarying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\\n#endif\\n#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHT_SHADOWS > 0\\n\\t\\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t\\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t\\tstruct DirectionalLightShadow {\\n\\t\\t\\tfloat shadowIntensity;\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t};\\n\\t\\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHT_SHADOWS > 0\\n\\t\\tstruct SpotLightShadow {\\n\\t\\t\\tfloat shadowIntensity;\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t};\\n\\t\\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\\n\\t#endif\\n\\t#if NUM_POINT_LIGHT_SHADOWS > 0\\n\\t\\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t\\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t\\tstruct PointLightShadow {\\n\\t\\t\\tfloat shadowIntensity;\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t\\tfloat shadowCameraNear;\\n\\t\\t\\tfloat shadowCameraFar;\\n\\t\\t};\\n\\t\\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t#endif\\n#endif\";\n\nvar shadowmap_vertex = \"#if ( defined( USE_SHADOWMAP ) && ( NUM_DIR_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0 ) ) || ( NUM_SPOT_LIGHT_COORDS > 0 )\\n\\tvec3 shadowWorldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\\n\\tvec4 shadowWorldPosition;\\n#endif\\n#if defined( USE_SHADOWMAP )\\n\\t#if NUM_DIR_LIGHT_SHADOWS > 0\\n\\t\\t#pragma unroll_loop_start\\n\\t\\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\\n\\t\\t\\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * directionalLightShadows[ i ].shadowNormalBias, 0 );\\n\\t\\t\\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * shadowWorldPosition;\\n\\t\\t}\\n\\t\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#if NUM_POINT_LIGHT_SHADOWS > 0\\n\\t\\t#pragma unroll_loop_start\\n\\t\\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\\n\\t\\t\\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * pointLightShadows[ i ].shadowNormalBias, 0 );\\n\\t\\t\\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * shadowWorldPosition;\\n\\t\\t}\\n\\t\\t#pragma unroll_loop_end\\n\\t#endif\\n#endif\\n#if NUM_SPOT_LIGHT_COORDS > 0\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHT_COORDS; i ++ ) {\\n\\t\\tshadowWorldPosition = worldPosition;\\n\\t\\t#if ( defined( USE_SHADOWMAP ) && UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\\n\\t\\t\\tshadowWorldPosition.xyz += shadowWorldNormal * spotLightShadows[ i ].shadowNormalBias;\\n\\t\\t#endif\\n\\t\\tvSpotLightCoord[ i ] = spotLightMatrix[ i ] * shadowWorldPosition;\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\";\n\nvar shadowmask_pars_fragment = \"float getShadowMask() {\\n\\tfloat shadow = 1.0;\\n\\t#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHT_SHADOWS > 0\\n\\tDirectionalLightShadow directionalLight;\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\\n\\t\\tdirectionalLight = directionalLightShadows[ i ];\\n\\t\\tshadow *= receiveShadow ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowIntensity, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\\n\\t}\\n\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHT_SHADOWS > 0\\n\\tSpotLightShadow spotLight;\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\\n\\t\\tspotLight = spotLightShadows[ i ];\\n\\t\\tshadow *= receiveShadow ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowIntensity, spotLight.shadowBias, spotLight.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\\n\\t}\\n\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#if NUM_POINT_LIGHT_SHADOWS > 0\\n\\tPointLightShadow pointLight;\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\\n\\t\\tpointLight = pointLightShadows[ i ];\\n\\t\\tshadow *= receiveShadow ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowIntensity, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\\n\\t}\\n\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#endif\\n\\treturn shadow;\\n}\";\n\nvar skinbase_vertex = \"#ifdef USE_SKINNING\\n\\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\\n\\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\\n\\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\\n\\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\\n#endif\";\n\nvar skinning_pars_vertex = \"#ifdef USE_SKINNING\\n\\tuniform mat4 bindMatrix;\\n\\tuniform mat4 bindMatrixInverse;\\n\\tuniform highp sampler2D boneTexture;\\n\\tmat4 getBoneMatrix( const in float i ) {\\n\\t\\tint size = textureSize( boneTexture, 0 ).x;\\n\\t\\tint j = int( i ) * 4;\\n\\t\\tint x = j % size;\\n\\t\\tint y = j / size;\\n\\t\\tvec4 v1 = texelFetch( boneTexture, ivec2( x, y ), 0 );\\n\\t\\tvec4 v2 = texelFetch( boneTexture, ivec2( x + 1, y ), 0 );\\n\\t\\tvec4 v3 = texelFetch( boneTexture, ivec2( x + 2, y ), 0 );\\n\\t\\tvec4 v4 = texelFetch( boneTexture, ivec2( x + 3, y ), 0 );\\n\\t\\treturn mat4( v1, v2, v3, v4 );\\n\\t}\\n#endif\";\n\nvar skinning_vertex = \"#ifdef USE_SKINNING\\n\\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\\n\\tvec4 skinned = vec4( 0.0 );\\n\\tskinned += boneMatX * skinVertex * skinWeight.x;\\n\\tskinned += boneMatY * skinVertex * skinWeight.y;\\n\\tskinned += boneMatZ * skinVertex * skinWeight.z;\\n\\tskinned += boneMatW * skinVertex * skinWeight.w;\\n\\ttransformed = ( bindMatrixInverse * skinned ).xyz;\\n#endif\";\n\nvar skinnormal_vertex = \"#ifdef USE_SKINNING\\n\\tmat4 skinMatrix = mat4( 0.0 );\\n\\tskinMatrix += skinWeight.x * boneMatX;\\n\\tskinMatrix += skinWeight.y * boneMatY;\\n\\tskinMatrix += skinWeight.z * boneMatZ;\\n\\tskinMatrix += skinWeight.w * boneMatW;\\n\\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\\n\\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\\n\\t#ifdef USE_TANGENT\\n\\t\\tobjectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz;\\n\\t#endif\\n#endif\";\n\nvar specularmap_fragment = \"float specularStrength;\\n#ifdef USE_SPECULARMAP\\n\\tvec4 texelSpecular = texture2D( specularMap, vSpecularMapUv );\\n\\tspecularStrength = texelSpecular.r;\\n#else\\n\\tspecularStrength = 1.0;\\n#endif\";\n\nvar specularmap_pars_fragment = \"#ifdef USE_SPECULARMAP\\n\\tuniform sampler2D specularMap;\\n#endif\";\n\nvar tonemapping_fragment = \"#if defined( TONE_MAPPING )\\n\\tgl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\\n#endif\";\n\nvar tonemapping_pars_fragment = \"#ifndef saturate\\n#define saturate( a ) clamp( a, 0.0, 1.0 )\\n#endif\\nuniform float toneMappingExposure;\\nvec3 LinearToneMapping( vec3 color ) {\\n\\treturn saturate( toneMappingExposure * color );\\n}\\nvec3 ReinhardToneMapping( vec3 color ) {\\n\\tcolor *= toneMappingExposure;\\n\\treturn saturate( color / ( vec3( 1.0 ) + color ) );\\n}\\nvec3 CineonToneMapping( vec3 color ) {\\n\\tcolor *= toneMappingExposure;\\n\\tcolor = max( vec3( 0.0 ), color - 0.004 );\\n\\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\\n}\\nvec3 RRTAndODTFit( vec3 v ) {\\n\\tvec3 a = v * ( v + 0.0245786 ) - 0.000090537;\\n\\tvec3 b = v * ( 0.983729 * v + 0.4329510 ) + 0.238081;\\n\\treturn a / b;\\n}\\nvec3 ACESFilmicToneMapping( vec3 color ) {\\n\\tconst mat3 ACESInputMat = mat3(\\n\\t\\tvec3( 0.59719, 0.07600, 0.02840 ),\\t\\tvec3( 0.35458, 0.90834, 0.13383 ),\\n\\t\\tvec3( 0.04823, 0.01566, 0.83777 )\\n\\t);\\n\\tconst mat3 ACESOutputMat = mat3(\\n\\t\\tvec3(  1.60475, -0.10208, -0.00327 ),\\t\\tvec3( -0.53108,  1.10813, -0.07276 ),\\n\\t\\tvec3( -0.07367, -0.00605,  1.07602 )\\n\\t);\\n\\tcolor *= toneMappingExposure / 0.6;\\n\\tcolor = ACESInputMat * color;\\n\\tcolor = RRTAndODTFit( color );\\n\\tcolor = ACESOutputMat * color;\\n\\treturn saturate( color );\\n}\\nconst mat3 LINEAR_REC2020_TO_LINEAR_SRGB = mat3(\\n\\tvec3( 1.6605, - 0.1246, - 0.0182 ),\\n\\tvec3( - 0.5876, 1.1329, - 0.1006 ),\\n\\tvec3( - 0.0728, - 0.0083, 1.1187 )\\n);\\nconst mat3 LINEAR_SRGB_TO_LINEAR_REC2020 = mat3(\\n\\tvec3( 0.6274, 0.0691, 0.0164 ),\\n\\tvec3( 0.3293, 0.9195, 0.0880 ),\\n\\tvec3( 0.0433, 0.0113, 0.8956 )\\n);\\nvec3 agxDefaultContrastApprox( vec3 x ) {\\n\\tvec3 x2 = x * x;\\n\\tvec3 x4 = x2 * x2;\\n\\treturn + 15.5 * x4 * x2\\n\\t\\t- 40.14 * x4 * x\\n\\t\\t+ 31.96 * x4\\n\\t\\t- 6.868 * x2 * x\\n\\t\\t+ 0.4298 * x2\\n\\t\\t+ 0.1191 * x\\n\\t\\t- 0.00232;\\n}\\nvec3 AgXToneMapping( vec3 color ) {\\n\\tconst mat3 AgXInsetMatrix = mat3(\\n\\t\\tvec3( 0.856627153315983, 0.137318972929847, 0.11189821299995 ),\\n\\t\\tvec3( 0.0951212405381588, 0.761241990602591, 0.0767994186031903 ),\\n\\t\\tvec3( 0.0482516061458583, 0.101439036467562, 0.811302368396859 )\\n\\t);\\n\\tconst mat3 AgXOutsetMatrix = mat3(\\n\\t\\tvec3( 1.1271005818144368, - 0.1413297634984383, - 0.14132976349843826 ),\\n\\t\\tvec3( - 0.11060664309660323, 1.157823702216272, - 0.11060664309660294 ),\\n\\t\\tvec3( - 0.016493938717834573, - 0.016493938717834257, 1.2519364065950405 )\\n\\t);\\n\\tconst float AgxMinEv = - 12.47393;\\tconst float AgxMaxEv = 4.026069;\\n\\tcolor *= toneMappingExposure;\\n\\tcolor = LINEAR_SRGB_TO_LINEAR_REC2020 * color;\\n\\tcolor = AgXInsetMatrix * color;\\n\\tcolor = max( color, 1e-10 );\\tcolor = log2( color );\\n\\tcolor = ( color - AgxMinEv ) / ( AgxMaxEv - AgxMinEv );\\n\\tcolor = clamp( color, 0.0, 1.0 );\\n\\tcolor = agxDefaultContrastApprox( color );\\n\\tcolor = AgXOutsetMatrix * color;\\n\\tcolor = pow( max( vec3( 0.0 ), color ), vec3( 2.2 ) );\\n\\tcolor = LINEAR_REC2020_TO_LINEAR_SRGB * color;\\n\\tcolor = clamp( color, 0.0, 1.0 );\\n\\treturn color;\\n}\\nvec3 NeutralToneMapping( vec3 color ) {\\n\\tconst float StartCompression = 0.8 - 0.04;\\n\\tconst float Desaturation = 0.15;\\n\\tcolor *= toneMappingExposure;\\n\\tfloat x = min( color.r, min( color.g, color.b ) );\\n\\tfloat offset = x < 0.08 ? x - 6.25 * x * x : 0.04;\\n\\tcolor -= offset;\\n\\tfloat peak = max( color.r, max( color.g, color.b ) );\\n\\tif ( peak < StartCompression ) return color;\\n\\tfloat d = 1. - StartCompression;\\n\\tfloat newPeak = 1. - d * d / ( peak + d - StartCompression );\\n\\tcolor *= newPeak / peak;\\n\\tfloat g = 1. - 1. / ( Desaturation * ( peak - newPeak ) + 1. );\\n\\treturn mix( color, vec3( newPeak ), g );\\n}\\nvec3 CustomToneMapping( vec3 color ) { return color; }\";\n\nvar transmission_fragment = \"#ifdef USE_TRANSMISSION\\n\\tmaterial.transmission = transmission;\\n\\tmaterial.transmissionAlpha = 1.0;\\n\\tmaterial.thickness = thickness;\\n\\tmaterial.attenuationDistance = attenuationDistance;\\n\\tmaterial.attenuationColor = attenuationColor;\\n\\t#ifdef USE_TRANSMISSIONMAP\\n\\t\\tmaterial.transmission *= texture2D( transmissionMap, vTransmissionMapUv ).r;\\n\\t#endif\\n\\t#ifdef USE_THICKNESSMAP\\n\\t\\tmaterial.thickness *= texture2D( thicknessMap, vThicknessMapUv ).g;\\n\\t#endif\\n\\tvec3 pos = vWorldPosition;\\n\\tvec3 v = normalize( cameraPosition - pos );\\n\\tvec3 n = inverseTransformDirection( normal, viewMatrix );\\n\\tvec4 transmitted = getIBLVolumeRefraction(\\n\\t\\tn, v, material.roughness, material.diffuseColor, material.specularColor, material.specularF90,\\n\\t\\tpos, modelMatrix, viewMatrix, projectionMatrix, material.dispersion, material.ior, material.thickness,\\n\\t\\tmaterial.attenuationColor, material.attenuationDistance );\\n\\tmaterial.transmissionAlpha = mix( material.transmissionAlpha, transmitted.a, material.transmission );\\n\\ttotalDiffuse = mix( totalDiffuse, transmitted.rgb, material.transmission );\\n#endif\";\n\nvar transmission_pars_fragment = \"#ifdef USE_TRANSMISSION\\n\\tuniform float transmission;\\n\\tuniform float thickness;\\n\\tuniform float attenuationDistance;\\n\\tuniform vec3 attenuationColor;\\n\\t#ifdef USE_TRANSMISSIONMAP\\n\\t\\tuniform sampler2D transmissionMap;\\n\\t#endif\\n\\t#ifdef USE_THICKNESSMAP\\n\\t\\tuniform sampler2D thicknessMap;\\n\\t#endif\\n\\tuniform vec2 transmissionSamplerSize;\\n\\tuniform sampler2D transmissionSamplerMap;\\n\\tuniform mat4 modelMatrix;\\n\\tuniform mat4 projectionMatrix;\\n\\tvarying vec3 vWorldPosition;\\n\\tfloat w0( float a ) {\\n\\t\\treturn ( 1.0 / 6.0 ) * ( a * ( a * ( - a + 3.0 ) - 3.0 ) + 1.0 );\\n\\t}\\n\\tfloat w1( float a ) {\\n\\t\\treturn ( 1.0 / 6.0 ) * ( a *  a * ( 3.0 * a - 6.0 ) + 4.0 );\\n\\t}\\n\\tfloat w2( float a ){\\n\\t\\treturn ( 1.0 / 6.0 ) * ( a * ( a * ( - 3.0 * a + 3.0 ) + 3.0 ) + 1.0 );\\n\\t}\\n\\tfloat w3( float a ) {\\n\\t\\treturn ( 1.0 / 6.0 ) * ( a * a * a );\\n\\t}\\n\\tfloat g0( float a ) {\\n\\t\\treturn w0( a ) + w1( a );\\n\\t}\\n\\tfloat g1( float a ) {\\n\\t\\treturn w2( a ) + w3( a );\\n\\t}\\n\\tfloat h0( float a ) {\\n\\t\\treturn - 1.0 + w1( a ) / ( w0( a ) + w1( a ) );\\n\\t}\\n\\tfloat h1( float a ) {\\n\\t\\treturn 1.0 + w3( a ) / ( w2( a ) + w3( a ) );\\n\\t}\\n\\tvec4 bicubic( sampler2D tex, vec2 uv, vec4 texelSize, float lod ) {\\n\\t\\tuv = uv * texelSize.zw + 0.5;\\n\\t\\tvec2 iuv = floor( uv );\\n\\t\\tvec2 fuv = fract( uv );\\n\\t\\tfloat g0x = g0( fuv.x );\\n\\t\\tfloat g1x = g1( fuv.x );\\n\\t\\tfloat h0x = h0( fuv.x );\\n\\t\\tfloat h1x = h1( fuv.x );\\n\\t\\tfloat h0y = h0( fuv.y );\\n\\t\\tfloat h1y = h1( fuv.y );\\n\\t\\tvec2 p0 = ( vec2( iuv.x + h0x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\\n\\t\\tvec2 p1 = ( vec2( iuv.x + h1x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\\n\\t\\tvec2 p2 = ( vec2( iuv.x + h0x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\\n\\t\\tvec2 p3 = ( vec2( iuv.x + h1x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\\n\\t\\treturn g0( fuv.y ) * ( g0x * textureLod( tex, p0, lod ) + g1x * textureLod( tex, p1, lod ) ) +\\n\\t\\t\\tg1( fuv.y ) * ( g0x * textureLod( tex, p2, lod ) + g1x * textureLod( tex, p3, lod ) );\\n\\t}\\n\\tvec4 textureBicubic( sampler2D sampler, vec2 uv, float lod ) {\\n\\t\\tvec2 fLodSize = vec2( textureSize( sampler, int( lod ) ) );\\n\\t\\tvec2 cLodSize = vec2( textureSize( sampler, int( lod + 1.0 ) ) );\\n\\t\\tvec2 fLodSizeInv = 1.0 / fLodSize;\\n\\t\\tvec2 cLodSizeInv = 1.0 / cLodSize;\\n\\t\\tvec4 fSample = bicubic( sampler, uv, vec4( fLodSizeInv, fLodSize ), floor( lod ) );\\n\\t\\tvec4 cSample = bicubic( sampler, uv, vec4( cLodSizeInv, cLodSize ), ceil( lod ) );\\n\\t\\treturn mix( fSample, cSample, fract( lod ) );\\n\\t}\\n\\tvec3 getVolumeTransmissionRay( const in vec3 n, const in vec3 v, const in float thickness, const in float ior, const in mat4 modelMatrix ) {\\n\\t\\tvec3 refractionVector = refract( - v, normalize( n ), 1.0 / ior );\\n\\t\\tvec3 modelScale;\\n\\t\\tmodelScale.x = length( vec3( modelMatrix[ 0 ].xyz ) );\\n\\t\\tmodelScale.y = length( vec3( modelMatrix[ 1 ].xyz ) );\\n\\t\\tmodelScale.z = length( vec3( modelMatrix[ 2 ].xyz ) );\\n\\t\\treturn normalize( refractionVector ) * thickness * modelScale;\\n\\t}\\n\\tfloat applyIorToRoughness( const in float roughness, const in float ior ) {\\n\\t\\treturn roughness * clamp( ior * 2.0 - 2.0, 0.0, 1.0 );\\n\\t}\\n\\tvec4 getTransmissionSample( const in vec2 fragCoord, const in float roughness, const in float ior ) {\\n\\t\\tfloat lod = log2( transmissionSamplerSize.x ) * applyIorToRoughness( roughness, ior );\\n\\t\\treturn textureBicubic( transmissionSamplerMap, fragCoord.xy, lod );\\n\\t}\\n\\tvec3 volumeAttenuation( const in float transmissionDistance, const in vec3 attenuationColor, const in float attenuationDistance ) {\\n\\t\\tif ( isinf( attenuationDistance ) ) {\\n\\t\\t\\treturn vec3( 1.0 );\\n\\t\\t} else {\\n\\t\\t\\tvec3 attenuationCoefficient = -log( attenuationColor ) / attenuationDistance;\\n\\t\\t\\tvec3 transmittance = exp( - attenuationCoefficient * transmissionDistance );\\t\\t\\treturn transmittance;\\n\\t\\t}\\n\\t}\\n\\tvec4 getIBLVolumeRefraction( const in vec3 n, const in vec3 v, const in float roughness, const in vec3 diffuseColor,\\n\\t\\tconst in vec3 specularColor, const in float specularF90, const in vec3 position, const in mat4 modelMatrix,\\n\\t\\tconst in mat4 viewMatrix, const in mat4 projMatrix, const in float dispersion, const in float ior, const in float thickness,\\n\\t\\tconst in vec3 attenuationColor, const in float attenuationDistance ) {\\n\\t\\tvec4 transmittedLight;\\n\\t\\tvec3 transmittance;\\n\\t\\t#ifdef USE_DISPERSION\\n\\t\\t\\tfloat halfSpread = ( ior - 1.0 ) * 0.025 * dispersion;\\n\\t\\t\\tvec3 iors = vec3( ior - halfSpread, ior, ior + halfSpread );\\n\\t\\t\\tfor ( int i = 0; i < 3; i ++ ) {\\n\\t\\t\\t\\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, iors[ i ], modelMatrix );\\n\\t\\t\\t\\tvec3 refractedRayExit = position + transmissionRay;\\n\\t\\t\\t\\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\\n\\t\\t\\t\\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\\n\\t\\t\\t\\trefractionCoords += 1.0;\\n\\t\\t\\t\\trefractionCoords /= 2.0;\\n\\t\\t\\t\\tvec4 transmissionSample = getTransmissionSample( refractionCoords, roughness, iors[ i ] );\\n\\t\\t\\t\\ttransmittedLight[ i ] = transmissionSample[ i ];\\n\\t\\t\\t\\ttransmittedLight.a += transmissionSample.a;\\n\\t\\t\\t\\ttransmittance[ i ] = diffuseColor[ i ] * volumeAttenuation( length( transmissionRay ), attenuationColor, attenuationDistance )[ i ];\\n\\t\\t\\t}\\n\\t\\t\\ttransmittedLight.a /= 3.0;\\n\\t\\t#else\\n\\t\\t\\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, ior, modelMatrix );\\n\\t\\t\\tvec3 refractedRayExit = position + transmissionRay;\\n\\t\\t\\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\\n\\t\\t\\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\\n\\t\\t\\trefractionCoords += 1.0;\\n\\t\\t\\trefractionCoords /= 2.0;\\n\\t\\t\\ttransmittedLight = getTransmissionSample( refractionCoords, roughness, ior );\\n\\t\\t\\ttransmittance = diffuseColor * volumeAttenuation( length( transmissionRay ), attenuationColor, attenuationDistance );\\n\\t\\t#endif\\n\\t\\tvec3 attenuatedColor = transmittance * transmittedLight.rgb;\\n\\t\\tvec3 F = EnvironmentBRDF( n, v, specularColor, specularF90, roughness );\\n\\t\\tfloat transmittanceFactor = ( transmittance.r + transmittance.g + transmittance.b ) / 3.0;\\n\\t\\treturn vec4( ( 1.0 - F ) * attenuatedColor, 1.0 - ( 1.0 - transmittedLight.a ) * transmittanceFactor );\\n\\t}\\n#endif\";\n\nvar uv_pars_fragment = \"#if defined( USE_UV ) || defined( USE_ANISOTROPY )\\n\\tvarying vec2 vUv;\\n#endif\\n#ifdef USE_MAP\\n\\tvarying vec2 vMapUv;\\n#endif\\n#ifdef USE_ALPHAMAP\\n\\tvarying vec2 vAlphaMapUv;\\n#endif\\n#ifdef USE_LIGHTMAP\\n\\tvarying vec2 vLightMapUv;\\n#endif\\n#ifdef USE_AOMAP\\n\\tvarying vec2 vAoMapUv;\\n#endif\\n#ifdef USE_BUMPMAP\\n\\tvarying vec2 vBumpMapUv;\\n#endif\\n#ifdef USE_NORMALMAP\\n\\tvarying vec2 vNormalMapUv;\\n#endif\\n#ifdef USE_EMISSIVEMAP\\n\\tvarying vec2 vEmissiveMapUv;\\n#endif\\n#ifdef USE_METALNESSMAP\\n\\tvarying vec2 vMetalnessMapUv;\\n#endif\\n#ifdef USE_ROUGHNESSMAP\\n\\tvarying vec2 vRoughnessMapUv;\\n#endif\\n#ifdef USE_ANISOTROPYMAP\\n\\tvarying vec2 vAnisotropyMapUv;\\n#endif\\n#ifdef USE_CLEARCOATMAP\\n\\tvarying vec2 vClearcoatMapUv;\\n#endif\\n#ifdef USE_CLEARCOAT_NORMALMAP\\n\\tvarying vec2 vClearcoatNormalMapUv;\\n#endif\\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\\n\\tvarying vec2 vClearcoatRoughnessMapUv;\\n#endif\\n#ifdef USE_IRIDESCENCEMAP\\n\\tvarying vec2 vIridescenceMapUv;\\n#endif\\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\\n\\tvarying vec2 vIridescenceThicknessMapUv;\\n#endif\\n#ifdef USE_SHEEN_COLORMAP\\n\\tvarying vec2 vSheenColorMapUv;\\n#endif\\n#ifdef USE_SHEEN_ROUGHNESSMAP\\n\\tvarying vec2 vSheenRoughnessMapUv;\\n#endif\\n#ifdef USE_SPECULARMAP\\n\\tvarying vec2 vSpecularMapUv;\\n#endif\\n#ifdef USE_SPECULAR_COLORMAP\\n\\tvarying vec2 vSpecularColorMapUv;\\n#endif\\n#ifdef USE_SPECULAR_INTENSITYMAP\\n\\tvarying vec2 vSpecularIntensityMapUv;\\n#endif\\n#ifdef USE_TRANSMISSIONMAP\\n\\tuniform mat3 transmissionMapTransform;\\n\\tvarying vec2 vTransmissionMapUv;\\n#endif\\n#ifdef USE_THICKNESSMAP\\n\\tuniform mat3 thicknessMapTransform;\\n\\tvarying vec2 vThicknessMapUv;\\n#endif\";\n\nvar uv_pars_vertex = \"#if defined( USE_UV ) || defined( USE_ANISOTROPY )\\n\\tvarying vec2 vUv;\\n#endif\\n#ifdef USE_MAP\\n\\tuniform mat3 mapTransform;\\n\\tvarying vec2 vMapUv;\\n#endif\\n#ifdef USE_ALPHAMAP\\n\\tuniform mat3 alphaMapTransform;\\n\\tvarying vec2 vAlphaMapUv;\\n#endif\\n#ifdef USE_LIGHTMAP\\n\\tuniform mat3 lightMapTransform;\\n\\tvarying vec2 vLightMapUv;\\n#endif\\n#ifdef USE_AOMAP\\n\\tuniform mat3 aoMapTransform;\\n\\tvarying vec2 vAoMapUv;\\n#endif\\n#ifdef USE_BUMPMAP\\n\\tuniform mat3 bumpMapTransform;\\n\\tvarying vec2 vBumpMapUv;\\n#endif\\n#ifdef USE_NORMALMAP\\n\\tuniform mat3 normalMapTransform;\\n\\tvarying vec2 vNormalMapUv;\\n#endif\\n#ifdef USE_DISPLACEMENTMAP\\n\\tuniform mat3 displacementMapTransform;\\n\\tvarying vec2 vDisplacementMapUv;\\n#endif\\n#ifdef USE_EMISSIVEMAP\\n\\tuniform mat3 emissiveMapTransform;\\n\\tvarying vec2 vEmissiveMapUv;\\n#endif\\n#ifdef USE_METALNESSMAP\\n\\tuniform mat3 metalnessMapTransform;\\n\\tvarying vec2 vMetalnessMapUv;\\n#endif\\n#ifdef USE_ROUGHNESSMAP\\n\\tuniform mat3 roughnessMapTransform;\\n\\tvarying vec2 vRoughnessMapUv;\\n#endif\\n#ifdef USE_ANISOTROPYMAP\\n\\tuniform mat3 anisotropyMapTransform;\\n\\tvarying vec2 vAnisotropyMapUv;\\n#endif\\n#ifdef USE_CLEARCOATMAP\\n\\tuniform mat3 clearcoatMapTransform;\\n\\tvarying vec2 vClearcoatMapUv;\\n#endif\\n#ifdef USE_CLEARCOAT_NORMALMAP\\n\\tuniform mat3 clearcoatNormalMapTransform;\\n\\tvarying vec2 vClearcoatNormalMapUv;\\n#endif\\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\\n\\tuniform mat3 clearcoatRoughnessMapTransform;\\n\\tvarying vec2 vClearcoatRoughnessMapUv;\\n#endif\\n#ifdef USE_SHEEN_COLORMAP\\n\\tuniform mat3 sheenColorMapTransform;\\n\\tvarying vec2 vSheenColorMapUv;\\n#endif\\n#ifdef USE_SHEEN_ROUGHNESSMAP\\n\\tuniform mat3 sheenRoughnessMapTransform;\\n\\tvarying vec2 vSheenRoughnessMapUv;\\n#endif\\n#ifdef USE_IRIDESCENCEMAP\\n\\tuniform mat3 iridescenceMapTransform;\\n\\tvarying vec2 vIridescenceMapUv;\\n#endif\\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\\n\\tuniform mat3 iridescenceThicknessMapTransform;\\n\\tvarying vec2 vIridescenceThicknessMapUv;\\n#endif\\n#ifdef USE_SPECULARMAP\\n\\tuniform mat3 specularMapTransform;\\n\\tvarying vec2 vSpecularMapUv;\\n#endif\\n#ifdef USE_SPECULAR_COLORMAP\\n\\tuniform mat3 specularColorMapTransform;\\n\\tvarying vec2 vSpecularColorMapUv;\\n#endif\\n#ifdef USE_SPECULAR_INTENSITYMAP\\n\\tuniform mat3 specularIntensityMapTransform;\\n\\tvarying vec2 vSpecularIntensityMapUv;\\n#endif\\n#ifdef USE_TRANSMISSIONMAP\\n\\tuniform mat3 transmissionMapTransform;\\n\\tvarying vec2 vTransmissionMapUv;\\n#endif\\n#ifdef USE_THICKNESSMAP\\n\\tuniform mat3 thicknessMapTransform;\\n\\tvarying vec2 vThicknessMapUv;\\n#endif\";\n\nvar uv_vertex = \"#if defined( USE_UV ) || defined( USE_ANISOTROPY )\\n\\tvUv = vec3( uv, 1 ).xy;\\n#endif\\n#ifdef USE_MAP\\n\\tvMapUv = ( mapTransform * vec3( MAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_ALPHAMAP\\n\\tvAlphaMapUv = ( alphaMapTransform * vec3( ALPHAMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_LIGHTMAP\\n\\tvLightMapUv = ( lightMapTransform * vec3( LIGHTMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_AOMAP\\n\\tvAoMapUv = ( aoMapTransform * vec3( AOMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_BUMPMAP\\n\\tvBumpMapUv = ( bumpMapTransform * vec3( BUMPMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_NORMALMAP\\n\\tvNormalMapUv = ( normalMapTransform * vec3( NORMALMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_DISPLACEMENTMAP\\n\\tvDisplacementMapUv = ( displacementMapTransform * vec3( DISPLACEMENTMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_EMISSIVEMAP\\n\\tvEmissiveMapUv = ( emissiveMapTransform * vec3( EMISSIVEMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_METALNESSMAP\\n\\tvMetalnessMapUv = ( metalnessMapTransform * vec3( METALNESSMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_ROUGHNESSMAP\\n\\tvRoughnessMapUv = ( roughnessMapTransform * vec3( ROUGHNESSMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_ANISOTROPYMAP\\n\\tvAnisotropyMapUv = ( anisotropyMapTransform * vec3( ANISOTROPYMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_CLEARCOATMAP\\n\\tvClearcoatMapUv = ( clearcoatMapTransform * vec3( CLEARCOATMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_CLEARCOAT_NORMALMAP\\n\\tvClearcoatNormalMapUv = ( clearcoatNormalMapTransform * vec3( CLEARCOAT_NORMALMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\\n\\tvClearcoatRoughnessMapUv = ( clearcoatRoughnessMapTransform * vec3( CLEARCOAT_ROUGHNESSMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_IRIDESCENCEMAP\\n\\tvIridescenceMapUv = ( iridescenceMapTransform * vec3( IRIDESCENCEMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\\n\\tvIridescenceThicknessMapUv = ( iridescenceThicknessMapTransform * vec3( IRIDESCENCE_THICKNESSMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_SHEEN_COLORMAP\\n\\tvSheenColorMapUv = ( sheenColorMapTransform * vec3( SHEEN_COLORMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_SHEEN_ROUGHNESSMAP\\n\\tvSheenRoughnessMapUv = ( sheenRoughnessMapTransform * vec3( SHEEN_ROUGHNESSMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_SPECULARMAP\\n\\tvSpecularMapUv = ( specularMapTransform * vec3( SPECULARMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_SPECULAR_COLORMAP\\n\\tvSpecularColorMapUv = ( specularColorMapTransform * vec3( SPECULAR_COLORMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_SPECULAR_INTENSITYMAP\\n\\tvSpecularIntensityMapUv = ( specularIntensityMapTransform * vec3( SPECULAR_INTENSITYMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_TRANSMISSIONMAP\\n\\tvTransmissionMapUv = ( transmissionMapTransform * vec3( TRANSMISSIONMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_THICKNESSMAP\\n\\tvThicknessMapUv = ( thicknessMapTransform * vec3( THICKNESSMAP_UV, 1 ) ).xy;\\n#endif\";\n\nvar worldpos_vertex = \"#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP ) || defined ( USE_TRANSMISSION ) || NUM_SPOT_LIGHT_COORDS > 0\\n\\tvec4 worldPosition = vec4( transformed, 1.0 );\\n\\t#ifdef USE_BATCHING\\n\\t\\tworldPosition = batchingMatrix * worldPosition;\\n\\t#endif\\n\\t#ifdef USE_INSTANCING\\n\\t\\tworldPosition = instanceMatrix * worldPosition;\\n\\t#endif\\n\\tworldPosition = modelMatrix * worldPosition;\\n#endif\";\n\nconst vertex$h = \"varying vec2 vUv;\\nuniform mat3 uvTransform;\\nvoid main() {\\n\\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\\n\\tgl_Position = vec4( position.xy, 1.0, 1.0 );\\n}\";\n\nconst fragment$h = \"uniform sampler2D t2D;\\nuniform float backgroundIntensity;\\nvarying vec2 vUv;\\nvoid main() {\\n\\tvec4 texColor = texture2D( t2D, vUv );\\n\\t#ifdef DECODE_VIDEO_TEXTURE\\n\\t\\ttexColor = vec4( mix( pow( texColor.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), texColor.rgb * 0.0773993808, vec3( lessThanEqual( texColor.rgb, vec3( 0.04045 ) ) ) ), texColor.w );\\n\\t#endif\\n\\ttexColor.rgb *= backgroundIntensity;\\n\\tgl_FragColor = texColor;\\n\\t#include <tonemapping_fragment>\\n\\t#include <colorspace_fragment>\\n}\";\n\nconst vertex$g = \"varying vec3 vWorldDirection;\\n#include <common>\\nvoid main() {\\n\\tvWorldDirection = transformDirection( position, modelMatrix );\\n\\t#include <begin_vertex>\\n\\t#include <project_vertex>\\n\\tgl_Position.z = gl_Position.w;\\n}\";\n\nconst fragment$g = \"#ifdef ENVMAP_TYPE_CUBE\\n\\tuniform samplerCube envMap;\\n#elif defined( ENVMAP_TYPE_CUBE_UV )\\n\\tuniform sampler2D envMap;\\n#endif\\nuniform float flipEnvMap;\\nuniform float backgroundBlurriness;\\nuniform float backgroundIntensity;\\nuniform mat3 backgroundRotation;\\nvarying vec3 vWorldDirection;\\n#include <cube_uv_reflection_fragment>\\nvoid main() {\\n\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\tvec4 texColor = textureCube( envMap, backgroundRotation * vec3( flipEnvMap * vWorldDirection.x, vWorldDirection.yz ) );\\n\\t#elif defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\tvec4 texColor = textureCubeUV( envMap, backgroundRotation * vWorldDirection, backgroundBlurriness );\\n\\t#else\\n\\t\\tvec4 texColor = vec4( 0.0, 0.0, 0.0, 1.0 );\\n\\t#endif\\n\\ttexColor.rgb *= backgroundIntensity;\\n\\tgl_FragColor = texColor;\\n\\t#include <tonemapping_fragment>\\n\\t#include <colorspace_fragment>\\n}\";\n\nconst vertex$f = \"varying vec3 vWorldDirection;\\n#include <common>\\nvoid main() {\\n\\tvWorldDirection = transformDirection( position, modelMatrix );\\n\\t#include <begin_vertex>\\n\\t#include <project_vertex>\\n\\tgl_Position.z = gl_Position.w;\\n}\";\n\nconst fragment$f = \"uniform samplerCube tCube;\\nuniform float tFlip;\\nuniform float opacity;\\nvarying vec3 vWorldDirection;\\nvoid main() {\\n\\tvec4 texColor = textureCube( tCube, vec3( tFlip * vWorldDirection.x, vWorldDirection.yz ) );\\n\\tgl_FragColor = texColor;\\n\\tgl_FragColor.a *= opacity;\\n\\t#include <tonemapping_fragment>\\n\\t#include <colorspace_fragment>\\n}\";\n\nconst vertex$e = \"#include <common>\\n#include <batching_pars_vertex>\\n#include <uv_pars_vertex>\\n#include <displacementmap_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvarying vec2 vHighPrecisionZW;\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <batching_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#include <morphinstance_vertex>\\n\\t#ifdef USE_DISPLACEMENTMAP\\n\\t\\t#include <beginnormal_vertex>\\n\\t\\t#include <morphnormal_vertex>\\n\\t\\t#include <skinnormal_vertex>\\n\\t#endif\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <displacementmap_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\tvHighPrecisionZW = gl_Position.zw;\\n}\";\n\nconst fragment$e = \"#if DEPTH_PACKING == 3200\\n\\tuniform float opacity;\\n#endif\\n#include <common>\\n#include <packing>\\n#include <uv_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <alphatest_pars_fragment>\\n#include <alphahash_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvarying vec2 vHighPrecisionZW;\\nvoid main() {\\n\\tvec4 diffuseColor = vec4( 1.0 );\\n\\t#include <clipping_planes_fragment>\\n\\t#if DEPTH_PACKING == 3200\\n\\t\\tdiffuseColor.a = opacity;\\n\\t#endif\\n\\t#include <map_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <alphahash_fragment>\\n\\t#include <logdepthbuf_fragment>\\n\\t#ifdef USE_REVERSED_DEPTH_BUFFER\\n\\t\\tfloat fragCoordZ = vHighPrecisionZW[ 0 ] / vHighPrecisionZW[ 1 ];\\n\\t#else\\n\\t\\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[ 0 ] / vHighPrecisionZW[ 1 ] + 0.5;\\n\\t#endif\\n\\t#if DEPTH_PACKING == 3200\\n\\t\\tgl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );\\n\\t#elif DEPTH_PACKING == 3201\\n\\t\\tgl_FragColor = packDepthToRGBA( fragCoordZ );\\n\\t#elif DEPTH_PACKING == 3202\\n\\t\\tgl_FragColor = vec4( packDepthToRGB( fragCoordZ ), 1.0 );\\n\\t#elif DEPTH_PACKING == 3203\\n\\t\\tgl_FragColor = vec4( packDepthToRG( fragCoordZ ), 0.0, 1.0 );\\n\\t#endif\\n}\";\n\nconst vertex$d = \"#define DISTANCE\\nvarying vec3 vWorldPosition;\\n#include <common>\\n#include <batching_pars_vertex>\\n#include <uv_pars_vertex>\\n#include <displacementmap_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <batching_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#include <morphinstance_vertex>\\n\\t#ifdef USE_DISPLACEMENTMAP\\n\\t\\t#include <beginnormal_vertex>\\n\\t\\t#include <morphnormal_vertex>\\n\\t\\t#include <skinnormal_vertex>\\n\\t#endif\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <displacementmap_vertex>\\n\\t#include <project_vertex>\\n\\t#include <worldpos_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\tvWorldPosition = worldPosition.xyz;\\n}\";\n\nconst fragment$d = \"#define DISTANCE\\nuniform vec3 referencePosition;\\nuniform float nearDistance;\\nuniform float farDistance;\\nvarying vec3 vWorldPosition;\\n#include <common>\\n#include <packing>\\n#include <uv_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <alphatest_pars_fragment>\\n#include <alphahash_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main () {\\n\\tvec4 diffuseColor = vec4( 1.0 );\\n\\t#include <clipping_planes_fragment>\\n\\t#include <map_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <alphahash_fragment>\\n\\tfloat dist = length( vWorldPosition - referencePosition );\\n\\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\\n\\tdist = saturate( dist );\\n\\tgl_FragColor = packDepthToRGBA( dist );\\n}\";\n\nconst vertex$c = \"varying vec3 vWorldDirection;\\n#include <common>\\nvoid main() {\\n\\tvWorldDirection = transformDirection( position, modelMatrix );\\n\\t#include <begin_vertex>\\n\\t#include <project_vertex>\\n}\";\n\nconst fragment$c = \"uniform sampler2D tEquirect;\\nvarying vec3 vWorldDirection;\\n#include <common>\\nvoid main() {\\n\\tvec3 direction = normalize( vWorldDirection );\\n\\tvec2 sampleUV = equirectUv( direction );\\n\\tgl_FragColor = texture2D( tEquirect, sampleUV );\\n\\t#include <tonemapping_fragment>\\n\\t#include <colorspace_fragment>\\n}\";\n\nconst vertex$b = \"uniform float scale;\\nattribute float lineDistance;\\nvarying float vLineDistance;\\n#include <common>\\n#include <uv_pars_vertex>\\n#include <color_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\tvLineDistance = scale * lineDistance;\\n\\t#include <uv_vertex>\\n\\t#include <color_vertex>\\n\\t#include <morphinstance_vertex>\\n\\t#include <morphcolor_vertex>\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\t#include <fog_vertex>\\n}\";\n\nconst fragment$b = \"uniform vec3 diffuse;\\nuniform float opacity;\\nuniform float dashSize;\\nuniform float totalSize;\\nvarying float vLineDistance;\\n#include <common>\\n#include <color_pars_fragment>\\n#include <uv_pars_fragment>\\n#include <map_pars_fragment>\\n#include <fog_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include <clipping_planes_fragment>\\n\\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\\n\\t\\tdiscard;\\n\\t}\\n\\tvec3 outgoingLight = vec3( 0.0 );\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <map_fragment>\\n\\t#include <color_fragment>\\n\\toutgoingLight = diffuseColor.rgb;\\n\\t#include <opaque_fragment>\\n\\t#include <tonemapping_fragment>\\n\\t#include <colorspace_fragment>\\n\\t#include <fog_fragment>\\n\\t#include <premultiplied_alpha_fragment>\\n}\";\n\nconst vertex$a = \"#include <common>\\n#include <batching_pars_vertex>\\n#include <uv_pars_vertex>\\n#include <envmap_pars_vertex>\\n#include <color_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <color_vertex>\\n\\t#include <morphinstance_vertex>\\n\\t#include <morphcolor_vertex>\\n\\t#include <batching_vertex>\\n\\t#if defined ( USE_ENVMAP ) || defined ( USE_SKINNING )\\n\\t\\t#include <beginnormal_vertex>\\n\\t\\t#include <morphnormal_vertex>\\n\\t\\t#include <skinbase_vertex>\\n\\t\\t#include <skinnormal_vertex>\\n\\t\\t#include <defaultnormal_vertex>\\n\\t#endif\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\t#include <worldpos_vertex>\\n\\t#include <envmap_vertex>\\n\\t#include <fog_vertex>\\n}\";\n\nconst fragment$a = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include <common>\\n#include <dithering_pars_fragment>\\n#include <color_pars_fragment>\\n#include <uv_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <alphatest_pars_fragment>\\n#include <alphahash_pars_fragment>\\n#include <aomap_pars_fragment>\\n#include <lightmap_pars_fragment>\\n#include <envmap_common_pars_fragment>\\n#include <envmap_pars_fragment>\\n#include <fog_pars_fragment>\\n#include <specularmap_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include <clipping_planes_fragment>\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <map_fragment>\\n\\t#include <color_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <alphahash_fragment>\\n\\t#include <specularmap_fragment>\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\t#ifdef USE_LIGHTMAP\\n\\t\\tvec4 lightMapTexel = texture2D( lightMap, vLightMapUv );\\n\\t\\treflectedLight.indirectDiffuse += lightMapTexel.rgb * lightMapIntensity * RECIPROCAL_PI;\\n\\t#else\\n\\t\\treflectedLight.indirectDiffuse += vec3( 1.0 );\\n\\t#endif\\n\\t#include <aomap_fragment>\\n\\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\\n\\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\\n\\t#include <envmap_fragment>\\n\\t#include <opaque_fragment>\\n\\t#include <tonemapping_fragment>\\n\\t#include <colorspace_fragment>\\n\\t#include <fog_fragment>\\n\\t#include <premultiplied_alpha_fragment>\\n\\t#include <dithering_fragment>\\n}\";\n\nconst vertex$9 = \"#define LAMBERT\\nvarying vec3 vViewPosition;\\n#include <common>\\n#include <batching_pars_vertex>\\n#include <uv_pars_vertex>\\n#include <displacementmap_pars_vertex>\\n#include <envmap_pars_vertex>\\n#include <color_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <normal_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <shadowmap_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <color_vertex>\\n\\t#include <morphinstance_vertex>\\n\\t#include <morphcolor_vertex>\\n\\t#include <batching_vertex>\\n\\t#include <beginnormal_vertex>\\n\\t#include <morphnormal_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#include <skinnormal_vertex>\\n\\t#include <defaultnormal_vertex>\\n\\t#include <normal_vertex>\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <displacementmap_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include <worldpos_vertex>\\n\\t#include <envmap_vertex>\\n\\t#include <shadowmap_vertex>\\n\\t#include <fog_vertex>\\n}\";\n\nconst fragment$9 = \"#define LAMBERT\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float opacity;\\n#include <common>\\n#include <packing>\\n#include <dithering_pars_fragment>\\n#include <color_pars_fragment>\\n#include <uv_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <alphatest_pars_fragment>\\n#include <alphahash_pars_fragment>\\n#include <aomap_pars_fragment>\\n#include <lightmap_pars_fragment>\\n#include <emissivemap_pars_fragment>\\n#include <envmap_common_pars_fragment>\\n#include <envmap_pars_fragment>\\n#include <fog_pars_fragment>\\n#include <bsdfs>\\n#include <lights_pars_begin>\\n#include <normal_pars_fragment>\\n#include <lights_lambert_pars_fragment>\\n#include <shadowmap_pars_fragment>\\n#include <bumpmap_pars_fragment>\\n#include <normalmap_pars_fragment>\\n#include <specularmap_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include <clipping_planes_fragment>\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <map_fragment>\\n\\t#include <color_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <alphahash_fragment>\\n\\t#include <specularmap_fragment>\\n\\t#include <normal_fragment_begin>\\n\\t#include <normal_fragment_maps>\\n\\t#include <emissivemap_fragment>\\n\\t#include <lights_lambert_fragment>\\n\\t#include <lights_fragment_begin>\\n\\t#include <lights_fragment_maps>\\n\\t#include <lights_fragment_end>\\n\\t#include <aomap_fragment>\\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\\n\\t#include <envmap_fragment>\\n\\t#include <opaque_fragment>\\n\\t#include <tonemapping_fragment>\\n\\t#include <colorspace_fragment>\\n\\t#include <fog_fragment>\\n\\t#include <premultiplied_alpha_fragment>\\n\\t#include <dithering_fragment>\\n}\";\n\nconst vertex$8 = \"#define MATCAP\\nvarying vec3 vViewPosition;\\n#include <common>\\n#include <batching_pars_vertex>\\n#include <uv_pars_vertex>\\n#include <color_pars_vertex>\\n#include <displacementmap_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <normal_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <color_vertex>\\n\\t#include <morphinstance_vertex>\\n\\t#include <morphcolor_vertex>\\n\\t#include <batching_vertex>\\n\\t#include <beginnormal_vertex>\\n\\t#include <morphnormal_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#include <skinnormal_vertex>\\n\\t#include <defaultnormal_vertex>\\n\\t#include <normal_vertex>\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <displacementmap_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\t#include <fog_vertex>\\n\\tvViewPosition = - mvPosition.xyz;\\n}\";\n\nconst fragment$8 = \"#define MATCAP\\nuniform vec3 diffuse;\\nuniform float opacity;\\nuniform sampler2D matcap;\\nvarying vec3 vViewPosition;\\n#include <common>\\n#include <dithering_pars_fragment>\\n#include <color_pars_fragment>\\n#include <uv_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <alphatest_pars_fragment>\\n#include <alphahash_pars_fragment>\\n#include <fog_pars_fragment>\\n#include <normal_pars_fragment>\\n#include <bumpmap_pars_fragment>\\n#include <normalmap_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include <clipping_planes_fragment>\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <map_fragment>\\n\\t#include <color_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <alphahash_fragment>\\n\\t#include <normal_fragment_begin>\\n\\t#include <normal_fragment_maps>\\n\\tvec3 viewDir = normalize( vViewPosition );\\n\\tvec3 x = normalize( vec3( viewDir.z, 0.0, - viewDir.x ) );\\n\\tvec3 y = cross( viewDir, x );\\n\\tvec2 uv = vec2( dot( x, normal ), dot( y, normal ) ) * 0.495 + 0.5;\\n\\t#ifdef USE_MATCAP\\n\\t\\tvec4 matcapColor = texture2D( matcap, uv );\\n\\t#else\\n\\t\\tvec4 matcapColor = vec4( vec3( mix( 0.2, 0.8, uv.y ) ), 1.0 );\\n\\t#endif\\n\\tvec3 outgoingLight = diffuseColor.rgb * matcapColor.rgb;\\n\\t#include <opaque_fragment>\\n\\t#include <tonemapping_fragment>\\n\\t#include <colorspace_fragment>\\n\\t#include <fog_fragment>\\n\\t#include <premultiplied_alpha_fragment>\\n\\t#include <dithering_fragment>\\n}\";\n\nconst vertex$7 = \"#define NORMAL\\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\\n\\tvarying vec3 vViewPosition;\\n#endif\\n#include <common>\\n#include <batching_pars_vertex>\\n#include <uv_pars_vertex>\\n#include <displacementmap_pars_vertex>\\n#include <normal_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <batching_vertex>\\n\\t#include <beginnormal_vertex>\\n\\t#include <morphinstance_vertex>\\n\\t#include <morphnormal_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#include <skinnormal_vertex>\\n\\t#include <defaultnormal_vertex>\\n\\t#include <normal_vertex>\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <displacementmap_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\\n\\tvViewPosition = - mvPosition.xyz;\\n#endif\\n}\";\n\nconst fragment$7 = \"#define NORMAL\\nuniform float opacity;\\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\\n\\tvarying vec3 vViewPosition;\\n#endif\\n#include <packing>\\n#include <uv_pars_fragment>\\n#include <normal_pars_fragment>\\n#include <bumpmap_pars_fragment>\\n#include <normalmap_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\tvec4 diffuseColor = vec4( 0.0, 0.0, 0.0, opacity );\\n\\t#include <clipping_planes_fragment>\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <normal_fragment_begin>\\n\\t#include <normal_fragment_maps>\\n\\tgl_FragColor = vec4( packNormalToRGB( normal ), diffuseColor.a );\\n\\t#ifdef OPAQUE\\n\\t\\tgl_FragColor.a = 1.0;\\n\\t#endif\\n}\";\n\nconst vertex$6 = \"#define PHONG\\nvarying vec3 vViewPosition;\\n#include <common>\\n#include <batching_pars_vertex>\\n#include <uv_pars_vertex>\\n#include <displacementmap_pars_vertex>\\n#include <envmap_pars_vertex>\\n#include <color_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <normal_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <shadowmap_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <color_vertex>\\n\\t#include <morphcolor_vertex>\\n\\t#include <batching_vertex>\\n\\t#include <beginnormal_vertex>\\n\\t#include <morphinstance_vertex>\\n\\t#include <morphnormal_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#include <skinnormal_vertex>\\n\\t#include <defaultnormal_vertex>\\n\\t#include <normal_vertex>\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <displacementmap_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include <worldpos_vertex>\\n\\t#include <envmap_vertex>\\n\\t#include <shadowmap_vertex>\\n\\t#include <fog_vertex>\\n}\";\n\nconst fragment$6 = \"#define PHONG\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform vec3 specular;\\nuniform float shininess;\\nuniform float opacity;\\n#include <common>\\n#include <packing>\\n#include <dithering_pars_fragment>\\n#include <color_pars_fragment>\\n#include <uv_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <alphatest_pars_fragment>\\n#include <alphahash_pars_fragment>\\n#include <aomap_pars_fragment>\\n#include <lightmap_pars_fragment>\\n#include <emissivemap_pars_fragment>\\n#include <envmap_common_pars_fragment>\\n#include <envmap_pars_fragment>\\n#include <fog_pars_fragment>\\n#include <bsdfs>\\n#include <lights_pars_begin>\\n#include <normal_pars_fragment>\\n#include <lights_phong_pars_fragment>\\n#include <shadowmap_pars_fragment>\\n#include <bumpmap_pars_fragment>\\n#include <normalmap_pars_fragment>\\n#include <specularmap_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include <clipping_planes_fragment>\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <map_fragment>\\n\\t#include <color_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <alphahash_fragment>\\n\\t#include <specularmap_fragment>\\n\\t#include <normal_fragment_begin>\\n\\t#include <normal_fragment_maps>\\n\\t#include <emissivemap_fragment>\\n\\t#include <lights_phong_fragment>\\n\\t#include <lights_fragment_begin>\\n\\t#include <lights_fragment_maps>\\n\\t#include <lights_fragment_end>\\n\\t#include <aomap_fragment>\\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\\n\\t#include <envmap_fragment>\\n\\t#include <opaque_fragment>\\n\\t#include <tonemapping_fragment>\\n\\t#include <colorspace_fragment>\\n\\t#include <fog_fragment>\\n\\t#include <premultiplied_alpha_fragment>\\n\\t#include <dithering_fragment>\\n}\";\n\nconst vertex$5 = \"#define STANDARD\\nvarying vec3 vViewPosition;\\n#ifdef USE_TRANSMISSION\\n\\tvarying vec3 vWorldPosition;\\n#endif\\n#include <common>\\n#include <batching_pars_vertex>\\n#include <uv_pars_vertex>\\n#include <displacementmap_pars_vertex>\\n#include <color_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <normal_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <shadowmap_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <color_vertex>\\n\\t#include <morphinstance_vertex>\\n\\t#include <morphcolor_vertex>\\n\\t#include <batching_vertex>\\n\\t#include <beginnormal_vertex>\\n\\t#include <morphnormal_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#include <skinnormal_vertex>\\n\\t#include <defaultnormal_vertex>\\n\\t#include <normal_vertex>\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <displacementmap_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include <worldpos_vertex>\\n\\t#include <shadowmap_vertex>\\n\\t#include <fog_vertex>\\n#ifdef USE_TRANSMISSION\\n\\tvWorldPosition = worldPosition.xyz;\\n#endif\\n}\";\n\nconst fragment$5 = \"#define STANDARD\\n#ifdef PHYSICAL\\n\\t#define IOR\\n\\t#define USE_SPECULAR\\n#endif\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float roughness;\\nuniform float metalness;\\nuniform float opacity;\\n#ifdef IOR\\n\\tuniform float ior;\\n#endif\\n#ifdef USE_SPECULAR\\n\\tuniform float specularIntensity;\\n\\tuniform vec3 specularColor;\\n\\t#ifdef USE_SPECULAR_COLORMAP\\n\\t\\tuniform sampler2D specularColorMap;\\n\\t#endif\\n\\t#ifdef USE_SPECULAR_INTENSITYMAP\\n\\t\\tuniform sampler2D specularIntensityMap;\\n\\t#endif\\n#endif\\n#ifdef USE_CLEARCOAT\\n\\tuniform float clearcoat;\\n\\tuniform float clearcoatRoughness;\\n#endif\\n#ifdef USE_DISPERSION\\n\\tuniform float dispersion;\\n#endif\\n#ifdef USE_IRIDESCENCE\\n\\tuniform float iridescence;\\n\\tuniform float iridescenceIOR;\\n\\tuniform float iridescenceThicknessMinimum;\\n\\tuniform float iridescenceThicknessMaximum;\\n#endif\\n#ifdef USE_SHEEN\\n\\tuniform vec3 sheenColor;\\n\\tuniform float sheenRoughness;\\n\\t#ifdef USE_SHEEN_COLORMAP\\n\\t\\tuniform sampler2D sheenColorMap;\\n\\t#endif\\n\\t#ifdef USE_SHEEN_ROUGHNESSMAP\\n\\t\\tuniform sampler2D sheenRoughnessMap;\\n\\t#endif\\n#endif\\n#ifdef USE_ANISOTROPY\\n\\tuniform vec2 anisotropyVector;\\n\\t#ifdef USE_ANISOTROPYMAP\\n\\t\\tuniform sampler2D anisotropyMap;\\n\\t#endif\\n#endif\\nvarying vec3 vViewPosition;\\n#include <common>\\n#include <packing>\\n#include <dithering_pars_fragment>\\n#include <color_pars_fragment>\\n#include <uv_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <alphatest_pars_fragment>\\n#include <alphahash_pars_fragment>\\n#include <aomap_pars_fragment>\\n#include <lightmap_pars_fragment>\\n#include <emissivemap_pars_fragment>\\n#include <iridescence_fragment>\\n#include <cube_uv_reflection_fragment>\\n#include <envmap_common_pars_fragment>\\n#include <envmap_physical_pars_fragment>\\n#include <fog_pars_fragment>\\n#include <lights_pars_begin>\\n#include <normal_pars_fragment>\\n#include <lights_physical_pars_fragment>\\n#include <transmission_pars_fragment>\\n#include <shadowmap_pars_fragment>\\n#include <bumpmap_pars_fragment>\\n#include <normalmap_pars_fragment>\\n#include <clearcoat_pars_fragment>\\n#include <iridescence_pars_fragment>\\n#include <roughnessmap_pars_fragment>\\n#include <metalnessmap_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include <clipping_planes_fragment>\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <map_fragment>\\n\\t#include <color_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <alphahash_fragment>\\n\\t#include <roughnessmap_fragment>\\n\\t#include <metalnessmap_fragment>\\n\\t#include <normal_fragment_begin>\\n\\t#include <normal_fragment_maps>\\n\\t#include <clearcoat_normal_fragment_begin>\\n\\t#include <clearcoat_normal_fragment_maps>\\n\\t#include <emissivemap_fragment>\\n\\t#include <lights_physical_fragment>\\n\\t#include <lights_fragment_begin>\\n\\t#include <lights_fragment_maps>\\n\\t#include <lights_fragment_end>\\n\\t#include <aomap_fragment>\\n\\tvec3 totalDiffuse = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse;\\n\\tvec3 totalSpecular = reflectedLight.directSpecular + reflectedLight.indirectSpecular;\\n\\t#include <transmission_fragment>\\n\\tvec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance;\\n\\t#ifdef USE_SHEEN\\n\\t\\tfloat sheenEnergyComp = 1.0 - 0.157 * max3( material.sheenColor );\\n\\t\\toutgoingLight = outgoingLight * sheenEnergyComp + sheenSpecularDirect + sheenSpecularIndirect;\\n\\t#endif\\n\\t#ifdef USE_CLEARCOAT\\n\\t\\tfloat dotNVcc = saturate( dot( geometryClearcoatNormal, geometryViewDir ) );\\n\\t\\tvec3 Fcc = F_Schlick( material.clearcoatF0, material.clearcoatF90, dotNVcc );\\n\\t\\toutgoingLight = outgoingLight * ( 1.0 - material.clearcoat * Fcc ) + ( clearcoatSpecularDirect + clearcoatSpecularIndirect ) * material.clearcoat;\\n\\t#endif\\n\\t#include <opaque_fragment>\\n\\t#include <tonemapping_fragment>\\n\\t#include <colorspace_fragment>\\n\\t#include <fog_fragment>\\n\\t#include <premultiplied_alpha_fragment>\\n\\t#include <dithering_fragment>\\n}\";\n\nconst vertex$4 = \"#define TOON\\nvarying vec3 vViewPosition;\\n#include <common>\\n#include <batching_pars_vertex>\\n#include <uv_pars_vertex>\\n#include <displacementmap_pars_vertex>\\n#include <color_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <normal_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <shadowmap_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <color_vertex>\\n\\t#include <morphinstance_vertex>\\n\\t#include <morphcolor_vertex>\\n\\t#include <batching_vertex>\\n\\t#include <beginnormal_vertex>\\n\\t#include <morphnormal_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#include <skinnormal_vertex>\\n\\t#include <defaultnormal_vertex>\\n\\t#include <normal_vertex>\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <displacementmap_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include <worldpos_vertex>\\n\\t#include <shadowmap_vertex>\\n\\t#include <fog_vertex>\\n}\";\n\nconst fragment$4 = \"#define TOON\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float opacity;\\n#include <common>\\n#include <packing>\\n#include <dithering_pars_fragment>\\n#include <color_pars_fragment>\\n#include <uv_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <alphatest_pars_fragment>\\n#include <alphahash_pars_fragment>\\n#include <aomap_pars_fragment>\\n#include <lightmap_pars_fragment>\\n#include <emissivemap_pars_fragment>\\n#include <gradientmap_pars_fragment>\\n#include <fog_pars_fragment>\\n#include <bsdfs>\\n#include <lights_pars_begin>\\n#include <normal_pars_fragment>\\n#include <lights_toon_pars_fragment>\\n#include <shadowmap_pars_fragment>\\n#include <bumpmap_pars_fragment>\\n#include <normalmap_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include <clipping_planes_fragment>\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <map_fragment>\\n\\t#include <color_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <alphahash_fragment>\\n\\t#include <normal_fragment_begin>\\n\\t#include <normal_fragment_maps>\\n\\t#include <emissivemap_fragment>\\n\\t#include <lights_toon_fragment>\\n\\t#include <lights_fragment_begin>\\n\\t#include <lights_fragment_maps>\\n\\t#include <lights_fragment_end>\\n\\t#include <aomap_fragment>\\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\\n\\t#include <opaque_fragment>\\n\\t#include <tonemapping_fragment>\\n\\t#include <colorspace_fragment>\\n\\t#include <fog_fragment>\\n\\t#include <premultiplied_alpha_fragment>\\n\\t#include <dithering_fragment>\\n}\";\n\nconst vertex$3 = \"uniform float size;\\nuniform float scale;\\n#include <common>\\n#include <color_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\n#ifdef USE_POINTS_UV\\n\\tvarying vec2 vUv;\\n\\tuniform mat3 uvTransform;\\n#endif\\nvoid main() {\\n\\t#ifdef USE_POINTS_UV\\n\\t\\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\\n\\t#endif\\n\\t#include <color_vertex>\\n\\t#include <morphinstance_vertex>\\n\\t#include <morphcolor_vertex>\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <project_vertex>\\n\\tgl_PointSize = size;\\n\\t#ifdef USE_SIZEATTENUATION\\n\\t\\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\\n\\t\\tif ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\\n\\t#endif\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\t#include <worldpos_vertex>\\n\\t#include <fog_vertex>\\n}\";\n\nconst fragment$3 = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#include <common>\\n#include <color_pars_fragment>\\n#include <map_particle_pars_fragment>\\n#include <alphatest_pars_fragment>\\n#include <alphahash_pars_fragment>\\n#include <fog_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include <clipping_planes_fragment>\\n\\tvec3 outgoingLight = vec3( 0.0 );\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <map_particle_fragment>\\n\\t#include <color_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <alphahash_fragment>\\n\\toutgoingLight = diffuseColor.rgb;\\n\\t#include <opaque_fragment>\\n\\t#include <tonemapping_fragment>\\n\\t#include <colorspace_fragment>\\n\\t#include <fog_fragment>\\n\\t#include <premultiplied_alpha_fragment>\\n}\";\n\nconst vertex$2 = \"#include <common>\\n#include <batching_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <shadowmap_pars_vertex>\\nvoid main() {\\n\\t#include <batching_vertex>\\n\\t#include <beginnormal_vertex>\\n\\t#include <morphinstance_vertex>\\n\\t#include <morphnormal_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#include <skinnormal_vertex>\\n\\t#include <defaultnormal_vertex>\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <worldpos_vertex>\\n\\t#include <shadowmap_vertex>\\n\\t#include <fog_vertex>\\n}\";\n\nconst fragment$2 = \"uniform vec3 color;\\nuniform float opacity;\\n#include <common>\\n#include <packing>\\n#include <fog_pars_fragment>\\n#include <bsdfs>\\n#include <lights_pars_begin>\\n#include <logdepthbuf_pars_fragment>\\n#include <shadowmap_pars_fragment>\\n#include <shadowmask_pars_fragment>\\nvoid main() {\\n\\t#include <logdepthbuf_fragment>\\n\\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\\n\\t#include <tonemapping_fragment>\\n\\t#include <colorspace_fragment>\\n\\t#include <fog_fragment>\\n}\";\n\nconst vertex$1 = \"uniform float rotation;\\nuniform vec2 center;\\n#include <common>\\n#include <uv_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\tvec4 mvPosition = modelViewMatrix[ 3 ];\\n\\tvec2 scale = vec2( length( modelMatrix[ 0 ].xyz ), length( modelMatrix[ 1 ].xyz ) );\\n\\t#ifndef USE_SIZEATTENUATION\\n\\t\\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\\n\\t\\tif ( isPerspective ) scale *= - mvPosition.z;\\n\\t#endif\\n\\tvec2 alignedPosition = ( position.xy - ( center - vec2( 0.5 ) ) ) * scale;\\n\\tvec2 rotatedPosition;\\n\\trotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\\n\\trotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\\n\\tmvPosition.xy += rotatedPosition;\\n\\tgl_Position = projectionMatrix * mvPosition;\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\t#include <fog_vertex>\\n}\";\n\nconst fragment$1 = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#include <common>\\n#include <uv_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <alphatest_pars_fragment>\\n#include <alphahash_pars_fragment>\\n#include <fog_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include <clipping_planes_fragment>\\n\\tvec3 outgoingLight = vec3( 0.0 );\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <map_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <alphahash_fragment>\\n\\toutgoingLight = diffuseColor.rgb;\\n\\t#include <opaque_fragment>\\n\\t#include <tonemapping_fragment>\\n\\t#include <colorspace_fragment>\\n\\t#include <fog_fragment>\\n}\";\n\nconst ShaderChunk = {\n\talphahash_fragment: alphahash_fragment,\n\talphahash_pars_fragment: alphahash_pars_fragment,\n\talphamap_fragment: alphamap_fragment,\n\talphamap_pars_fragment: alphamap_pars_fragment,\n\talphatest_fragment: alphatest_fragment,\n\talphatest_pars_fragment: alphatest_pars_fragment,\n\taomap_fragment: aomap_fragment,\n\taomap_pars_fragment: aomap_pars_fragment,\n\tbatching_pars_vertex: batching_pars_vertex,\n\tbatching_vertex: batching_vertex,\n\tbegin_vertex: begin_vertex,\n\tbeginnormal_vertex: beginnormal_vertex,\n\tbsdfs: bsdfs,\n\tiridescence_fragment: iridescence_fragment,\n\tbumpmap_pars_fragment: bumpmap_pars_fragment,\n\tclipping_planes_fragment: clipping_planes_fragment,\n\tclipping_planes_pars_fragment: clipping_planes_pars_fragment,\n\tclipping_planes_pars_vertex: clipping_planes_pars_vertex,\n\tclipping_planes_vertex: clipping_planes_vertex,\n\tcolor_fragment: color_fragment,\n\tcolor_pars_fragment: color_pars_fragment,\n\tcolor_pars_vertex: color_pars_vertex,\n\tcolor_vertex: color_vertex,\n\tcommon: common,\n\tcube_uv_reflection_fragment: cube_uv_reflection_fragment,\n\tdefaultnormal_vertex: defaultnormal_vertex,\n\tdisplacementmap_pars_vertex: displacementmap_pars_vertex,\n\tdisplacementmap_vertex: displacementmap_vertex,\n\temissivemap_fragment: emissivemap_fragment,\n\temissivemap_pars_fragment: emissivemap_pars_fragment,\n\tcolorspace_fragment: colorspace_fragment,\n\tcolorspace_pars_fragment: colorspace_pars_fragment,\n\tenvmap_fragment: envmap_fragment,\n\tenvmap_common_pars_fragment: envmap_common_pars_fragment,\n\tenvmap_pars_fragment: envmap_pars_fragment,\n\tenvmap_pars_vertex: envmap_pars_vertex,\n\tenvmap_physical_pars_fragment: envmap_physical_pars_fragment,\n\tenvmap_vertex: envmap_vertex,\n\tfog_vertex: fog_vertex,\n\tfog_pars_vertex: fog_pars_vertex,\n\tfog_fragment: fog_fragment,\n\tfog_pars_fragment: fog_pars_fragment,\n\tgradientmap_pars_fragment: gradientmap_pars_fragment,\n\tlightmap_pars_fragment: lightmap_pars_fragment,\n\tlights_lambert_fragment: lights_lambert_fragment,\n\tlights_lambert_pars_fragment: lights_lambert_pars_fragment,\n\tlights_pars_begin: lights_pars_begin,\n\tlights_toon_fragment: lights_toon_fragment,\n\tlights_toon_pars_fragment: lights_toon_pars_fragment,\n\tlights_phong_fragment: lights_phong_fragment,\n\tlights_phong_pars_fragment: lights_phong_pars_fragment,\n\tlights_physical_fragment: lights_physical_fragment,\n\tlights_physical_pars_fragment: lights_physical_pars_fragment,\n\tlights_fragment_begin: lights_fragment_begin,\n\tlights_fragment_maps: lights_fragment_maps,\n\tlights_fragment_end: lights_fragment_end,\n\tlogdepthbuf_fragment: logdepthbuf_fragment,\n\tlogdepthbuf_pars_fragment: logdepthbuf_pars_fragment,\n\tlogdepthbuf_pars_vertex: logdepthbuf_pars_vertex,\n\tlogdepthbuf_vertex: logdepthbuf_vertex,\n\tmap_fragment: map_fragment,\n\tmap_pars_fragment: map_pars_fragment,\n\tmap_particle_fragment: map_particle_fragment,\n\tmap_particle_pars_fragment: map_particle_pars_fragment,\n\tmetalnessmap_fragment: metalnessmap_fragment,\n\tmetalnessmap_pars_fragment: metalnessmap_pars_fragment,\n\tmorphinstance_vertex: morphinstance_vertex,\n\tmorphcolor_vertex: morphcolor_vertex,\n\tmorphnormal_vertex: morphnormal_vertex,\n\tmorphtarget_pars_vertex: morphtarget_pars_vertex,\n\tmorphtarget_vertex: morphtarget_vertex,\n\tnormal_fragment_begin: normal_fragment_begin,\n\tnormal_fragment_maps: normal_fragment_maps,\n\tnormal_pars_fragment: normal_pars_fragment,\n\tnormal_pars_vertex: normal_pars_vertex,\n\tnormal_vertex: normal_vertex,\n\tnormalmap_pars_fragment: normalmap_pars_fragment,\n\tclearcoat_normal_fragment_begin: clearcoat_normal_fragment_begin,\n\tclearcoat_normal_fragment_maps: clearcoat_normal_fragment_maps,\n\tclearcoat_pars_fragment: clearcoat_pars_fragment,\n\tiridescence_pars_fragment: iridescence_pars_fragment,\n\topaque_fragment: opaque_fragment,\n\tpacking: packing,\n\tpremultiplied_alpha_fragment: premultiplied_alpha_fragment,\n\tproject_vertex: project_vertex,\n\tdithering_fragment: dithering_fragment,\n\tdithering_pars_fragment: dithering_pars_fragment,\n\troughnessmap_fragment: roughnessmap_fragment,\n\troughnessmap_pars_fragment: roughnessmap_pars_fragment,\n\tshadowmap_pars_fragment: shadowmap_pars_fragment,\n\tshadowmap_pars_vertex: shadowmap_pars_vertex,\n\tshadowmap_vertex: shadowmap_vertex,\n\tshadowmask_pars_fragment: shadowmask_pars_fragment,\n\tskinbase_vertex: skinbase_vertex,\n\tskinning_pars_vertex: skinning_pars_vertex,\n\tskinning_vertex: skinning_vertex,\n\tskinnormal_vertex: skinnormal_vertex,\n\tspecularmap_fragment: specularmap_fragment,\n\tspecularmap_pars_fragment: specularmap_pars_fragment,\n\ttonemapping_fragment: tonemapping_fragment,\n\ttonemapping_pars_fragment: tonemapping_pars_fragment,\n\ttransmission_fragment: transmission_fragment,\n\ttransmission_pars_fragment: transmission_pars_fragment,\n\tuv_pars_fragment: uv_pars_fragment,\n\tuv_pars_vertex: uv_pars_vertex,\n\tuv_vertex: uv_vertex,\n\tworldpos_vertex: worldpos_vertex,\n\n\tbackground_vert: vertex$h,\n\tbackground_frag: fragment$h,\n\tbackgroundCube_vert: vertex$g,\n\tbackgroundCube_frag: fragment$g,\n\tcube_vert: vertex$f,\n\tcube_frag: fragment$f,\n\tdepth_vert: vertex$e,\n\tdepth_frag: fragment$e,\n\tdistanceRGBA_vert: vertex$d,\n\tdistanceRGBA_frag: fragment$d,\n\tequirect_vert: vertex$c,\n\tequirect_frag: fragment$c,\n\tlinedashed_vert: vertex$b,\n\tlinedashed_frag: fragment$b,\n\tmeshbasic_vert: vertex$a,\n\tmeshbasic_frag: fragment$a,\n\tmeshlambert_vert: vertex$9,\n\tmeshlambert_frag: fragment$9,\n\tmeshmatcap_vert: vertex$8,\n\tmeshmatcap_frag: fragment$8,\n\tmeshnormal_vert: vertex$7,\n\tmeshnormal_frag: fragment$7,\n\tmeshphong_vert: vertex$6,\n\tmeshphong_frag: fragment$6,\n\tmeshphysical_vert: vertex$5,\n\tmeshphysical_frag: fragment$5,\n\tmeshtoon_vert: vertex$4,\n\tmeshtoon_frag: fragment$4,\n\tpoints_vert: vertex$3,\n\tpoints_frag: fragment$3,\n\tshadow_vert: vertex$2,\n\tshadow_frag: fragment$2,\n\tsprite_vert: vertex$1,\n\tsprite_frag: fragment$1\n};\n\n// Uniforms library for shared webgl shaders\nconst UniformsLib = {\n\n\tcommon: {\n\n\t\tdiffuse: { value: /*@__PURE__*/ new Color( 0xffffff ) },\n\t\topacity: { value: 1.0 },\n\n\t\tmap: { value: null },\n\t\tmapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\n\t\talphaMap: { value: null },\n\t\talphaMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\n\t\talphaTest: { value: 0 }\n\n\t},\n\n\tspecularmap: {\n\n\t\tspecularMap: { value: null },\n\t\tspecularMapTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\tenvmap: {\n\n\t\tenvMap: { value: null },\n\t\tenvMapRotation: { value: /*@__PURE__*/ new Matrix3() },\n\t\tflipEnvMap: { value: -1 },\n\t\treflectivity: { value: 1.0 }, // basic, lambert, phong\n\t\tior: { value: 1.5 }, // physical\n\t\trefractionRatio: { value: 0.98 }, // basic, lambert, phong\n\t\tdfgLUT: { value: null } // DFG LUT for physically-based rendering\n\n\t},\n\n\taomap: {\n\n\t\taoMap: { value: null },\n\t\taoMapIntensity: { value: 1 },\n\t\taoMapTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\tlightmap: {\n\n\t\tlightMap: { value: null },\n\t\tlightMapIntensity: { value: 1 },\n\t\tlightMapTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\tbumpmap: {\n\n\t\tbumpMap: { value: null },\n\t\tbumpMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\tbumpScale: { value: 1 }\n\n\t},\n\n\tnormalmap: {\n\n\t\tnormalMap: { value: null },\n\t\tnormalMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\tnormalScale: { value: /*@__PURE__*/ new Vector2( 1, 1 ) }\n\n\t},\n\n\tdisplacementmap: {\n\n\t\tdisplacementMap: { value: null },\n\t\tdisplacementMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\tdisplacementScale: { value: 1 },\n\t\tdisplacementBias: { value: 0 }\n\n\t},\n\n\temissivemap: {\n\n\t\temissiveMap: { value: null },\n\t\temissiveMapTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\tmetalnessmap: {\n\n\t\tmetalnessMap: { value: null },\n\t\tmetalnessMapTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\troughnessmap: {\n\n\t\troughnessMap: { value: null },\n\t\troughnessMapTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\tgradientmap: {\n\n\t\tgradientMap: { value: null }\n\n\t},\n\n\tfog: {\n\n\t\tfogDensity: { value: 0.00025 },\n\t\tfogNear: { value: 1 },\n\t\tfogFar: { value: 2000 },\n\t\tfogColor: { value: /*@__PURE__*/ new Color( 0xffffff ) }\n\n\t},\n\n\tlights: {\n\n\t\tambientLightColor: { value: [] },\n\n\t\tlightProbe: { value: [] },\n\n\t\tdirectionalLights: { value: [], properties: {\n\t\t\tdirection: {},\n\t\t\tcolor: {}\n\t\t} },\n\n\t\tdirectionalLightShadows: { value: [], properties: {\n\t\t\tshadowIntensity: 1,\n\t\t\tshadowBias: {},\n\t\t\tshadowNormalBias: {},\n\t\t\tshadowRadius: {},\n\t\t\tshadowMapSize: {}\n\t\t} },\n\n\t\tdirectionalShadowMap: { value: [] },\n\t\tdirectionalShadowMatrix: { value: [] },\n\n\t\tspotLights: { value: [], properties: {\n\t\t\tcolor: {},\n\t\t\tposition: {},\n\t\t\tdirection: {},\n\t\t\tdistance: {},\n\t\t\tconeCos: {},\n\t\t\tpenumbraCos: {},\n\t\t\tdecay: {}\n\t\t} },\n\n\t\tspotLightShadows: { value: [], properties: {\n\t\t\tshadowIntensity: 1,\n\t\t\tshadowBias: {},\n\t\t\tshadowNormalBias: {},\n\t\t\tshadowRadius: {},\n\t\t\tshadowMapSize: {}\n\t\t} },\n\n\t\tspotLightMap: { value: [] },\n\t\tspotShadowMap: { value: [] },\n\t\tspotLightMatrix: { value: [] },\n\n\t\tpointLights: { value: [], properties: {\n\t\t\tcolor: {},\n\t\t\tposition: {},\n\t\t\tdecay: {},\n\t\t\tdistance: {}\n\t\t} },\n\n\t\tpointLightShadows: { value: [], properties: {\n\t\t\tshadowIntensity: 1,\n\t\t\tshadowBias: {},\n\t\t\tshadowNormalBias: {},\n\t\t\tshadowRadius: {},\n\t\t\tshadowMapSize: {},\n\t\t\tshadowCameraNear: {},\n\t\t\tshadowCameraFar: {}\n\t\t} },\n\n\t\tpointShadowMap: { value: [] },\n\t\tpointShadowMatrix: { value: [] },\n\n\t\themisphereLights: { value: [], properties: {\n\t\t\tdirection: {},\n\t\t\tskyColor: {},\n\t\t\tgroundColor: {}\n\t\t} },\n\n\t\t// TODO (abelnation): RectAreaLight BRDF data needs to be moved from example to main src\n\t\trectAreaLights: { value: [], properties: {\n\t\t\tcolor: {},\n\t\t\tposition: {},\n\t\t\twidth: {},\n\t\t\theight: {}\n\t\t} },\n\n\t\tltc_1: { value: null },\n\t\tltc_2: { value: null }\n\n\t},\n\n\tpoints: {\n\n\t\tdiffuse: { value: /*@__PURE__*/ new Color( 0xffffff ) },\n\t\topacity: { value: 1.0 },\n\t\tsize: { value: 1.0 },\n\t\tscale: { value: 1.0 },\n\t\tmap: { value: null },\n\t\talphaMap: { value: null },\n\t\talphaMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\talphaTest: { value: 0 },\n\t\tuvTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\tsprite: {\n\n\t\tdiffuse: { value: /*@__PURE__*/ new Color( 0xffffff ) },\n\t\topacity: { value: 1.0 },\n\t\tcenter: { value: /*@__PURE__*/ new Vector2( 0.5, 0.5 ) },\n\t\trotation: { value: 0.0 },\n\t\tmap: { value: null },\n\t\tmapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\talphaMap: { value: null },\n\t\talphaMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\talphaTest: { value: 0 }\n\n\t}\n\n};\n\nconst ShaderLib = {\n\n\tbasic: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.specularmap,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.fog\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshbasic_vert,\n\t\tfragmentShader: ShaderChunk.meshbasic_frag\n\n\t},\n\n\tlambert: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.specularmap,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: /*@__PURE__*/ new Color( 0x000000 ) }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshlambert_vert,\n\t\tfragmentShader: ShaderChunk.meshlambert_frag\n\n\t},\n\n\tphong: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.specularmap,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: /*@__PURE__*/ new Color( 0x000000 ) },\n\t\t\t\tspecular: { value: /*@__PURE__*/ new Color( 0x111111 ) },\n\t\t\t\tshininess: { value: 30 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshphong_vert,\n\t\tfragmentShader: ShaderChunk.meshphong_frag\n\n\t},\n\n\tstandard: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.roughnessmap,\n\t\t\tUniformsLib.metalnessmap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: /*@__PURE__*/ new Color( 0x000000 ) },\n\t\t\t\troughness: { value: 1.0 },\n\t\t\t\tmetalness: { value: 0.0 },\n\t\t\t\tenvMapIntensity: { value: 1 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshphysical_vert,\n\t\tfragmentShader: ShaderChunk.meshphysical_frag\n\n\t},\n\n\ttoon: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.gradientmap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: /*@__PURE__*/ new Color( 0x000000 ) }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshtoon_vert,\n\t\tfragmentShader: ShaderChunk.meshtoon_frag\n\n\t},\n\n\tmatcap: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.fog,\n\t\t\t{\n\t\t\t\tmatcap: { value: null }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshmatcap_vert,\n\t\tfragmentShader: ShaderChunk.meshmatcap_frag\n\n\t},\n\n\tpoints: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.points,\n\t\t\tUniformsLib.fog\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.points_vert,\n\t\tfragmentShader: ShaderChunk.points_frag\n\n\t},\n\n\tdashed: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.fog,\n\t\t\t{\n\t\t\t\tscale: { value: 1 },\n\t\t\t\tdashSize: { value: 1 },\n\t\t\t\ttotalSize: { value: 2 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.linedashed_vert,\n\t\tfragmentShader: ShaderChunk.linedashed_frag\n\n\t},\n\n\tdepth: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.displacementmap\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.depth_vert,\n\t\tfragmentShader: ShaderChunk.depth_frag\n\n\t},\n\n\tnormal: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\t{\n\t\t\t\topacity: { value: 1.0 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshnormal_vert,\n\t\tfragmentShader: ShaderChunk.meshnormal_frag\n\n\t},\n\n\tsprite: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.sprite,\n\t\t\tUniformsLib.fog\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.sprite_vert,\n\t\tfragmentShader: ShaderChunk.sprite_frag\n\n\t},\n\n\tbackground: {\n\n\t\tuniforms: {\n\t\t\tuvTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tt2D: { value: null },\n\t\t\tbackgroundIntensity: { value: 1 }\n\t\t},\n\n\t\tvertexShader: ShaderChunk.background_vert,\n\t\tfragmentShader: ShaderChunk.background_frag\n\n\t},\n\n\tbackgroundCube: {\n\n\t\tuniforms: {\n\t\t\tenvMap: { value: null },\n\t\t\tflipEnvMap: { value: -1 },\n\t\t\tbackgroundBlurriness: { value: 0 },\n\t\t\tbackgroundIntensity: { value: 1 },\n\t\t\tbackgroundRotation: { value: /*@__PURE__*/ new Matrix3() }\n\t\t},\n\n\t\tvertexShader: ShaderChunk.backgroundCube_vert,\n\t\tfragmentShader: ShaderChunk.backgroundCube_frag\n\n\t},\n\n\tcube: {\n\n\t\tuniforms: {\n\t\t\ttCube: { value: null },\n\t\t\ttFlip: { value: -1 },\n\t\t\topacity: { value: 1.0 }\n\t\t},\n\n\t\tvertexShader: ShaderChunk.cube_vert,\n\t\tfragmentShader: ShaderChunk.cube_frag\n\n\t},\n\n\tequirect: {\n\n\t\tuniforms: {\n\t\t\ttEquirect: { value: null },\n\t\t},\n\n\t\tvertexShader: ShaderChunk.equirect_vert,\n\t\tfragmentShader: ShaderChunk.equirect_frag\n\n\t},\n\n\tdistanceRGBA: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.displacementmap,\n\t\t\t{\n\t\t\t\treferencePosition: { value: /*@__PURE__*/ new Vector3() },\n\t\t\t\tnearDistance: { value: 1 },\n\t\t\t\tfarDistance: { value: 1000 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.distanceRGBA_vert,\n\t\tfragmentShader: ShaderChunk.distanceRGBA_frag\n\n\t},\n\n\tshadow: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.lights,\n\t\t\tUniformsLib.fog,\n\t\t\t{\n\t\t\t\tcolor: { value: /*@__PURE__*/ new Color( 0x00000 ) },\n\t\t\t\topacity: { value: 1.0 }\n\t\t\t},\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.shadow_vert,\n\t\tfragmentShader: ShaderChunk.shadow_frag\n\n\t}\n\n};\n\nShaderLib.physical = {\n\n\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\tShaderLib.standard.uniforms,\n\t\t{\n\t\t\tclearcoat: { value: 0 },\n\t\t\tclearcoatMap: { value: null },\n\t\t\tclearcoatMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tclearcoatNormalMap: { value: null },\n\t\t\tclearcoatNormalMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tclearcoatNormalScale: { value: /*@__PURE__*/ new Vector2( 1, 1 ) },\n\t\t\tclearcoatRoughness: { value: 0 },\n\t\t\tclearcoatRoughnessMap: { value: null },\n\t\t\tclearcoatRoughnessMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tdispersion: { value: 0 },\n\t\t\tiridescence: { value: 0 },\n\t\t\tiridescenceMap: { value: null },\n\t\t\tiridescenceMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tiridescenceIOR: { value: 1.3 },\n\t\t\tiridescenceThicknessMinimum: { value: 100 },\n\t\t\tiridescenceThicknessMaximum: { value: 400 },\n\t\t\tiridescenceThicknessMap: { value: null },\n\t\t\tiridescenceThicknessMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tsheen: { value: 0 },\n\t\t\tsheenColor: { value: /*@__PURE__*/ new Color( 0x000000 ) },\n\t\t\tsheenColorMap: { value: null },\n\t\t\tsheenColorMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tsheenRoughness: { value: 1 },\n\t\t\tsheenRoughnessMap: { value: null },\n\t\t\tsheenRoughnessMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\ttransmission: { value: 0 },\n\t\t\ttransmissionMap: { value: null },\n\t\t\ttransmissionMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\ttransmissionSamplerSize: { value: /*@__PURE__*/ new Vector2() },\n\t\t\ttransmissionSamplerMap: { value: null },\n\t\t\tthickness: { value: 0 },\n\t\t\tthicknessMap: { value: null },\n\t\t\tthicknessMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tattenuationDistance: { value: 0 },\n\t\t\tattenuationColor: { value: /*@__PURE__*/ new Color( 0x000000 ) },\n\t\t\tspecularColor: { value: /*@__PURE__*/ new Color( 1, 1, 1 ) },\n\t\t\tspecularColorMap: { value: null },\n\t\t\tspecularColorMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tspecularIntensity: { value: 1 },\n\t\t\tspecularIntensityMap: { value: null },\n\t\t\tspecularIntensityMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tanisotropyVector: { value: /*@__PURE__*/ new Vector2() },\n\t\t\tanisotropyMap: { value: null },\n\t\t\tanisotropyMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t}\n\t] ),\n\n\tvertexShader: ShaderChunk.meshphysical_vert,\n\tfragmentShader: ShaderChunk.meshphysical_frag\n\n};\n\nconst _rgb = { r: 0, b: 0, g: 0 };\nconst _e1$1 = /*@__PURE__*/ new Euler();\nconst _m1$1 = /*@__PURE__*/ new Matrix4();\n\nfunction WebGLBackground( renderer, cubemaps, cubeuvmaps, state, objects, alpha, premultipliedAlpha ) {\n\n\tconst clearColor = new Color( 0x000000 );\n\tlet clearAlpha = alpha === true ? 0 : 1;\n\n\tlet planeMesh;\n\tlet boxMesh;\n\n\tlet currentBackground = null;\n\tlet currentBackgroundVersion = 0;\n\tlet currentTonemapping = null;\n\n\tfunction getBackground( scene ) {\n\n\t\tlet background = scene.isScene === true ? scene.background : null;\n\n\t\tif ( background && background.isTexture ) {\n\n\t\t\tconst usePMREM = scene.backgroundBlurriness > 0; // use PMREM if the user wants to blur the background\n\t\t\tbackground = ( usePMREM ? cubeuvmaps : cubemaps ).get( background );\n\n\t\t}\n\n\t\treturn background;\n\n\t}\n\n\tfunction render( scene ) {\n\n\t\tlet forceClear = false;\n\t\tconst background = getBackground( scene );\n\n\t\tif ( background === null ) {\n\n\t\t\tsetClear( clearColor, clearAlpha );\n\n\t\t} else if ( background && background.isColor ) {\n\n\t\t\tsetClear( background, 1 );\n\t\t\tforceClear = true;\n\n\t\t}\n\n\t\tconst environmentBlendMode = renderer.xr.getEnvironmentBlendMode();\n\n\t\tif ( environmentBlendMode === 'additive' ) {\n\n\t\t\tstate.buffers.color.setClear( 0, 0, 0, 1, premultipliedAlpha );\n\n\t\t} else if ( environmentBlendMode === 'alpha-blend' ) {\n\n\t\t\tstate.buffers.color.setClear( 0, 0, 0, 0, premultipliedAlpha );\n\n\t\t}\n\n\t\tif ( renderer.autoClear || forceClear ) {\n\n\t\t\t// buffers might not be writable which is required to ensure a correct clear\n\n\t\t\tstate.buffers.depth.setTest( true );\n\t\t\tstate.buffers.depth.setMask( true );\n\t\t\tstate.buffers.color.setMask( true );\n\n\t\t\trenderer.clear( renderer.autoClearColor, renderer.autoClearDepth, renderer.autoClearStencil );\n\n\t\t}\n\n\t}\n\n\tfunction addToRenderList( renderList, scene ) {\n\n\t\tconst background = getBackground( scene );\n\n\t\tif ( background && ( background.isCubeTexture || background.mapping === CubeUVReflectionMapping ) ) {\n\n\t\t\tif ( boxMesh === undefined ) {\n\n\t\t\t\tboxMesh = new Mesh(\n\t\t\t\t\tnew BoxGeometry( 1, 1, 1 ),\n\t\t\t\t\tnew ShaderMaterial( {\n\t\t\t\t\t\tname: 'BackgroundCubeMaterial',\n\t\t\t\t\t\tuniforms: cloneUniforms( ShaderLib.backgroundCube.uniforms ),\n\t\t\t\t\t\tvertexShader: ShaderLib.backgroundCube.vertexShader,\n\t\t\t\t\t\tfragmentShader: ShaderLib.backgroundCube.fragmentShader,\n\t\t\t\t\t\tside: BackSide,\n\t\t\t\t\t\tdepthTest: false,\n\t\t\t\t\t\tdepthWrite: false,\n\t\t\t\t\t\tfog: false,\n\t\t\t\t\t\tallowOverride: false\n\t\t\t\t\t} )\n\t\t\t\t);\n\n\t\t\t\tboxMesh.geometry.deleteAttribute( 'normal' );\n\t\t\t\tboxMesh.geometry.deleteAttribute( 'uv' );\n\n\t\t\t\tboxMesh.onBeforeRender = function ( renderer, scene, camera ) {\n\n\t\t\t\t\tthis.matrixWorld.copyPosition( camera.matrixWorld );\n\n\t\t\t\t};\n\n\t\t\t\t// add \"envMap\" material property so the renderer can evaluate it like for built-in materials\n\t\t\t\tObject.defineProperty( boxMesh.material, 'envMap', {\n\n\t\t\t\t\tget: function () {\n\n\t\t\t\t\t\treturn this.uniforms.envMap.value;\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\tobjects.update( boxMesh );\n\n\t\t\t}\n\n\t\t\t_e1$1.copy( scene.backgroundRotation );\n\n\t\t\t// accommodate left-handed frame\n\t\t\t_e1$1.x *= -1; _e1$1.y *= -1; _e1$1.z *= -1;\n\n\t\t\tif ( background.isCubeTexture && background.isRenderTargetTexture === false ) {\n\n\t\t\t\t// environment maps which are not cube render targets or PMREMs follow a different convention\n\t\t\t\t_e1$1.y *= -1;\n\t\t\t\t_e1$1.z *= -1;\n\n\t\t\t}\n\n\t\t\tboxMesh.material.uniforms.envMap.value = background;\n\t\t\tboxMesh.material.uniforms.flipEnvMap.value = ( background.isCubeTexture && background.isRenderTargetTexture === false ) ? -1 : 1;\n\t\t\tboxMesh.material.uniforms.backgroundBlurriness.value = scene.backgroundBlurriness;\n\t\t\tboxMesh.material.uniforms.backgroundIntensity.value = scene.backgroundIntensity;\n\t\t\tboxMesh.material.uniforms.backgroundRotation.value.setFromMatrix4( _m1$1.makeRotationFromEuler( _e1$1 ) );\n\t\t\tboxMesh.material.toneMapped = ColorManagement.getTransfer( background.colorSpace ) !== SRGBTransfer;\n\n\t\t\tif ( currentBackground !== background ||\n\t\t\t\tcurrentBackgroundVersion !== background.version ||\n\t\t\t\tcurrentTonemapping !== renderer.toneMapping ) {\n\n\t\t\t\tboxMesh.material.needsUpdate = true;\n\n\t\t\t\tcurrentBackground = background;\n\t\t\t\tcurrentBackgroundVersion = background.version;\n\t\t\t\tcurrentTonemapping = renderer.toneMapping;\n\n\t\t\t}\n\n\t\t\tboxMesh.layers.enableAll();\n\n\t\t\t// push to the pre-sorted opaque render list\n\t\t\trenderList.unshift( boxMesh, boxMesh.geometry, boxMesh.material, 0, 0, null );\n\n\t\t} else if ( background && background.isTexture ) {\n\n\t\t\tif ( planeMesh === undefined ) {\n\n\t\t\t\tplaneMesh = new Mesh(\n\t\t\t\t\tnew PlaneGeometry( 2, 2 ),\n\t\t\t\t\tnew ShaderMaterial( {\n\t\t\t\t\t\tname: 'BackgroundMaterial',\n\t\t\t\t\t\tuniforms: cloneUniforms( ShaderLib.background.uniforms ),\n\t\t\t\t\t\tvertexShader: ShaderLib.background.vertexShader,\n\t\t\t\t\t\tfragmentShader: ShaderLib.background.fragmentShader,\n\t\t\t\t\t\tside: FrontSide,\n\t\t\t\t\t\tdepthTest: false,\n\t\t\t\t\t\tdepthWrite: false,\n\t\t\t\t\t\tfog: false,\n\t\t\t\t\t\tallowOverride: false\n\t\t\t\t\t} )\n\t\t\t\t);\n\n\t\t\t\tplaneMesh.geometry.deleteAttribute( 'normal' );\n\n\t\t\t\t// add \"map\" material property so the renderer can evaluate it like for built-in materials\n\t\t\t\tObject.defineProperty( planeMesh.material, 'map', {\n\n\t\t\t\t\tget: function () {\n\n\t\t\t\t\t\treturn this.uniforms.t2D.value;\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\tobjects.update( planeMesh );\n\n\t\t\t}\n\n\t\t\tplaneMesh.material.uniforms.t2D.value = background;\n\t\t\tplaneMesh.material.uniforms.backgroundIntensity.value = scene.backgroundIntensity;\n\t\t\tplaneMesh.material.toneMapped = ColorManagement.getTransfer( background.colorSpace ) !== SRGBTransfer;\n\n\t\t\tif ( background.matrixAutoUpdate === true ) {\n\n\t\t\t\tbackground.updateMatrix();\n\n\t\t\t}\n\n\t\t\tplaneMesh.material.uniforms.uvTransform.value.copy( background.matrix );\n\n\t\t\tif ( currentBackground !== background ||\n\t\t\t\tcurrentBackgroundVersion !== background.version ||\n\t\t\t\tcurrentTonemapping !== renderer.toneMapping ) {\n\n\t\t\t\tplaneMesh.material.needsUpdate = true;\n\n\t\t\t\tcurrentBackground = background;\n\t\t\t\tcurrentBackgroundVersion = background.version;\n\t\t\t\tcurrentTonemapping = renderer.toneMapping;\n\n\t\t\t}\n\n\t\t\tplaneMesh.layers.enableAll();\n\n\t\t\t// push to the pre-sorted opaque render list\n\t\t\trenderList.unshift( planeMesh, planeMesh.geometry, planeMesh.material, 0, 0, null );\n\n\t\t}\n\n\t}\n\n\tfunction setClear( color, alpha ) {\n\n\t\tcolor.getRGB( _rgb, getUnlitUniformColorSpace( renderer ) );\n\n\t\tstate.buffers.color.setClear( _rgb.r, _rgb.g, _rgb.b, alpha, premultipliedAlpha );\n\n\t}\n\n\tfunction dispose() {\n\n\t\tif ( boxMesh !== undefined ) {\n\n\t\t\tboxMesh.geometry.dispose();\n\t\t\tboxMesh.material.dispose();\n\n\t\t\tboxMesh = undefined;\n\n\t\t}\n\n\t\tif ( planeMesh !== undefined ) {\n\n\t\t\tplaneMesh.geometry.dispose();\n\t\t\tplaneMesh.material.dispose();\n\n\t\t\tplaneMesh = undefined;\n\n\t\t}\n\n\t}\n\n\treturn {\n\n\t\tgetClearColor: function () {\n\n\t\t\treturn clearColor;\n\n\t\t},\n\t\tsetClearColor: function ( color, alpha = 1 ) {\n\n\t\t\tclearColor.set( color );\n\t\t\tclearAlpha = alpha;\n\t\t\tsetClear( clearColor, clearAlpha );\n\n\t\t},\n\t\tgetClearAlpha: function () {\n\n\t\t\treturn clearAlpha;\n\n\t\t},\n\t\tsetClearAlpha: function ( alpha ) {\n\n\t\t\tclearAlpha = alpha;\n\t\t\tsetClear( clearColor, clearAlpha );\n\n\t\t},\n\t\trender: render,\n\t\taddToRenderList: addToRenderList,\n\t\tdispose: dispose\n\n\t};\n\n}\n\nfunction WebGLBindingStates( gl, attributes ) {\n\n\tconst maxVertexAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS );\n\n\tconst bindingStates = {};\n\n\tconst defaultState = createBindingState( null );\n\tlet currentState = defaultState;\n\tlet forceUpdate = false;\n\n\tfunction setup( object, material, program, geometry, index ) {\n\n\t\tlet updateBuffers = false;\n\n\t\tconst state = getBindingState( geometry, program, material );\n\n\t\tif ( currentState !== state ) {\n\n\t\t\tcurrentState = state;\n\t\t\tbindVertexArrayObject( currentState.object );\n\n\t\t}\n\n\t\tupdateBuffers = needsUpdate( object, geometry, program, index );\n\n\t\tif ( updateBuffers ) saveCache( object, geometry, program, index );\n\n\t\tif ( index !== null ) {\n\n\t\t\tattributes.update( index, gl.ELEMENT_ARRAY_BUFFER );\n\n\t\t}\n\n\t\tif ( updateBuffers || forceUpdate ) {\n\n\t\t\tforceUpdate = false;\n\n\t\t\tsetupVertexAttributes( object, material, program, geometry );\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tgl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, attributes.get( index ).buffer );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction createVertexArrayObject() {\n\n\t\treturn gl.createVertexArray();\n\n\t}\n\n\tfunction bindVertexArrayObject( vao ) {\n\n\t\treturn gl.bindVertexArray( vao );\n\n\t}\n\n\tfunction deleteVertexArrayObject( vao ) {\n\n\t\treturn gl.deleteVertexArray( vao );\n\n\t}\n\n\tfunction getBindingState( geometry, program, material ) {\n\n\t\tconst wireframe = ( material.wireframe === true );\n\n\t\tlet programMap = bindingStates[ geometry.id ];\n\n\t\tif ( programMap === undefined ) {\n\n\t\t\tprogramMap = {};\n\t\t\tbindingStates[ geometry.id ] = programMap;\n\n\t\t}\n\n\t\tlet stateMap = programMap[ program.id ];\n\n\t\tif ( stateMap === undefined ) {\n\n\t\t\tstateMap = {};\n\t\t\tprogramMap[ program.id ] = stateMap;\n\n\t\t}\n\n\t\tlet state = stateMap[ wireframe ];\n\n\t\tif ( state === undefined ) {\n\n\t\t\tstate = createBindingState( createVertexArrayObject() );\n\t\t\tstateMap[ wireframe ] = state;\n\n\t\t}\n\n\t\treturn state;\n\n\t}\n\n\tfunction createBindingState( vao ) {\n\n\t\tconst newAttributes = [];\n\t\tconst enabledAttributes = [];\n\t\tconst attributeDivisors = [];\n\n\t\tfor ( let i = 0; i < maxVertexAttributes; i ++ ) {\n\n\t\t\tnewAttributes[ i ] = 0;\n\t\t\tenabledAttributes[ i ] = 0;\n\t\t\tattributeDivisors[ i ] = 0;\n\n\t\t}\n\n\t\treturn {\n\n\t\t\t// for backward compatibility on non-VAO support browser\n\t\t\tgeometry: null,\n\t\t\tprogram: null,\n\t\t\twireframe: false,\n\n\t\t\tnewAttributes: newAttributes,\n\t\t\tenabledAttributes: enabledAttributes,\n\t\t\tattributeDivisors: attributeDivisors,\n\t\t\tobject: vao,\n\t\t\tattributes: {},\n\t\t\tindex: null\n\n\t\t};\n\n\t}\n\n\tfunction needsUpdate( object, geometry, program, index ) {\n\n\t\tconst cachedAttributes = currentState.attributes;\n\t\tconst geometryAttributes = geometry.attributes;\n\n\t\tlet attributesNum = 0;\n\n\t\tconst programAttributes = program.getAttributes();\n\n\t\tfor ( const name in programAttributes ) {\n\n\t\t\tconst programAttribute = programAttributes[ name ];\n\n\t\t\tif ( programAttribute.location >= 0 ) {\n\n\t\t\t\tconst cachedAttribute = cachedAttributes[ name ];\n\t\t\t\tlet geometryAttribute = geometryAttributes[ name ];\n\n\t\t\t\tif ( geometryAttribute === undefined ) {\n\n\t\t\t\t\tif ( name === 'instanceMatrix' && object.instanceMatrix ) geometryAttribute = object.instanceMatrix;\n\t\t\t\t\tif ( name === 'instanceColor' && object.instanceColor ) geometryAttribute = object.instanceColor;\n\n\t\t\t\t}\n\n\t\t\t\tif ( cachedAttribute === undefined ) return true;\n\n\t\t\t\tif ( cachedAttribute.attribute !== geometryAttribute ) return true;\n\n\t\t\t\tif ( geometryAttribute && cachedAttribute.data !== geometryAttribute.data ) return true;\n\n\t\t\t\tattributesNum ++;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( currentState.attributesNum !== attributesNum ) return true;\n\n\t\tif ( currentState.index !== index ) return true;\n\n\t\treturn false;\n\n\t}\n\n\tfunction saveCache( object, geometry, program, index ) {\n\n\t\tconst cache = {};\n\t\tconst attributes = geometry.attributes;\n\t\tlet attributesNum = 0;\n\n\t\tconst programAttributes = program.getAttributes();\n\n\t\tfor ( const name in programAttributes ) {\n\n\t\t\tconst programAttribute = programAttributes[ name ];\n\n\t\t\tif ( programAttribute.location >= 0 ) {\n\n\t\t\t\tlet attribute = attributes[ name ];\n\n\t\t\t\tif ( attribute === undefined ) {\n\n\t\t\t\t\tif ( name === 'instanceMatrix' && object.instanceMatrix ) attribute = object.instanceMatrix;\n\t\t\t\t\tif ( name === 'instanceColor' && object.instanceColor ) attribute = object.instanceColor;\n\n\t\t\t\t}\n\n\t\t\t\tconst data = {};\n\t\t\t\tdata.attribute = attribute;\n\n\t\t\t\tif ( attribute && attribute.data ) {\n\n\t\t\t\t\tdata.data = attribute.data;\n\n\t\t\t\t}\n\n\t\t\t\tcache[ name ] = data;\n\n\t\t\t\tattributesNum ++;\n\n\t\t\t}\n\n\t\t}\n\n\t\tcurrentState.attributes = cache;\n\t\tcurrentState.attributesNum = attributesNum;\n\n\t\tcurrentState.index = index;\n\n\t}\n\n\tfunction initAttributes() {\n\n\t\tconst newAttributes = currentState.newAttributes;\n\n\t\tfor ( let i = 0, il = newAttributes.length; i < il; i ++ ) {\n\n\t\t\tnewAttributes[ i ] = 0;\n\n\t\t}\n\n\t}\n\n\tfunction enableAttribute( attribute ) {\n\n\t\tenableAttributeAndDivisor( attribute, 0 );\n\n\t}\n\n\tfunction enableAttributeAndDivisor( attribute, meshPerAttribute ) {\n\n\t\tconst newAttributes = currentState.newAttributes;\n\t\tconst enabledAttributes = currentState.enabledAttributes;\n\t\tconst attributeDivisors = currentState.attributeDivisors;\n\n\t\tnewAttributes[ attribute ] = 1;\n\n\t\tif ( enabledAttributes[ attribute ] === 0 ) {\n\n\t\t\tgl.enableVertexAttribArray( attribute );\n\t\t\tenabledAttributes[ attribute ] = 1;\n\n\t\t}\n\n\t\tif ( attributeDivisors[ attribute ] !== meshPerAttribute ) {\n\n\t\t\tgl.vertexAttribDivisor( attribute, meshPerAttribute );\n\t\t\tattributeDivisors[ attribute ] = meshPerAttribute;\n\n\t\t}\n\n\t}\n\n\tfunction disableUnusedAttributes() {\n\n\t\tconst newAttributes = currentState.newAttributes;\n\t\tconst enabledAttributes = currentState.enabledAttributes;\n\n\t\tfor ( let i = 0, il = enabledAttributes.length; i < il; i ++ ) {\n\n\t\t\tif ( enabledAttributes[ i ] !== newAttributes[ i ] ) {\n\n\t\t\t\tgl.disableVertexAttribArray( i );\n\t\t\t\tenabledAttributes[ i ] = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction vertexAttribPointer( index, size, type, normalized, stride, offset, integer ) {\n\n\t\tif ( integer === true ) {\n\n\t\t\tgl.vertexAttribIPointer( index, size, type, stride, offset );\n\n\t\t} else {\n\n\t\t\tgl.vertexAttribPointer( index, size, type, normalized, stride, offset );\n\n\t\t}\n\n\t}\n\n\tfunction setupVertexAttributes( object, material, program, geometry ) {\n\n\t\tinitAttributes();\n\n\t\tconst geometryAttributes = geometry.attributes;\n\n\t\tconst programAttributes = program.getAttributes();\n\n\t\tconst materialDefaultAttributeValues = material.defaultAttributeValues;\n\n\t\tfor ( const name in programAttributes ) {\n\n\t\t\tconst programAttribute = programAttributes[ name ];\n\n\t\t\tif ( programAttribute.location >= 0 ) {\n\n\t\t\t\tlet geometryAttribute = geometryAttributes[ name ];\n\n\t\t\t\tif ( geometryAttribute === undefined ) {\n\n\t\t\t\t\tif ( name === 'instanceMatrix' && object.instanceMatrix ) geometryAttribute = object.instanceMatrix;\n\t\t\t\t\tif ( name === 'instanceColor' && object.instanceColor ) geometryAttribute = object.instanceColor;\n\n\t\t\t\t}\n\n\t\t\t\tif ( geometryAttribute !== undefined ) {\n\n\t\t\t\t\tconst normalized = geometryAttribute.normalized;\n\t\t\t\t\tconst size = geometryAttribute.itemSize;\n\n\t\t\t\t\tconst attribute = attributes.get( geometryAttribute );\n\n\t\t\t\t\t// TODO Attribute may not be available on context restore\n\n\t\t\t\t\tif ( attribute === undefined ) continue;\n\n\t\t\t\t\tconst buffer = attribute.buffer;\n\t\t\t\t\tconst type = attribute.type;\n\t\t\t\t\tconst bytesPerElement = attribute.bytesPerElement;\n\n\t\t\t\t\t// check for integer attributes\n\n\t\t\t\t\tconst integer = ( type === gl.INT || type === gl.UNSIGNED_INT || geometryAttribute.gpuType === IntType );\n\n\t\t\t\t\tif ( geometryAttribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\t\t\tconst data = geometryAttribute.data;\n\t\t\t\t\t\tconst stride = data.stride;\n\t\t\t\t\t\tconst offset = geometryAttribute.offset;\n\n\t\t\t\t\t\tif ( data.isInstancedInterleavedBuffer ) {\n\n\t\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\t\tenableAttributeAndDivisor( programAttribute.location + i, data.meshPerAttribute );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( object.isInstancedMesh !== true && geometry._maxInstanceCount === undefined ) {\n\n\t\t\t\t\t\t\t\tgeometry._maxInstanceCount = data.meshPerAttribute * data.count;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\t\tenableAttribute( programAttribute.location + i );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, buffer );\n\n\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\tvertexAttribPointer(\n\t\t\t\t\t\t\t\tprogramAttribute.location + i,\n\t\t\t\t\t\t\t\tsize / programAttribute.locationSize,\n\t\t\t\t\t\t\t\ttype,\n\t\t\t\t\t\t\t\tnormalized,\n\t\t\t\t\t\t\t\tstride * bytesPerElement,\n\t\t\t\t\t\t\t\t( offset + ( size / programAttribute.locationSize ) * i ) * bytesPerElement,\n\t\t\t\t\t\t\t\tinteger\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( geometryAttribute.isInstancedBufferAttribute ) {\n\n\t\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\t\tenableAttributeAndDivisor( programAttribute.location + i, geometryAttribute.meshPerAttribute );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( object.isInstancedMesh !== true && geometry._maxInstanceCount === undefined ) {\n\n\t\t\t\t\t\t\t\tgeometry._maxInstanceCount = geometryAttribute.meshPerAttribute * geometryAttribute.count;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\t\tenableAttribute( programAttribute.location + i );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, buffer );\n\n\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\tvertexAttribPointer(\n\t\t\t\t\t\t\t\tprogramAttribute.location + i,\n\t\t\t\t\t\t\t\tsize / programAttribute.locationSize,\n\t\t\t\t\t\t\t\ttype,\n\t\t\t\t\t\t\t\tnormalized,\n\t\t\t\t\t\t\t\tsize * bytesPerElement,\n\t\t\t\t\t\t\t\t( size / programAttribute.locationSize ) * i * bytesPerElement,\n\t\t\t\t\t\t\t\tinteger\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( materialDefaultAttributeValues !== undefined ) {\n\n\t\t\t\t\tconst value = materialDefaultAttributeValues[ name ];\n\n\t\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\t\tswitch ( value.length ) {\n\n\t\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\t\tgl.vertexAttrib2fv( programAttribute.location, value );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\t\tgl.vertexAttrib3fv( programAttribute.location, value );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 4:\n\t\t\t\t\t\t\t\tgl.vertexAttrib4fv( programAttribute.location, value );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\tgl.vertexAttrib1fv( programAttribute.location, value );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tdisableUnusedAttributes();\n\n\t}\n\n\tfunction dispose() {\n\n\t\treset();\n\n\t\tfor ( const geometryId in bindingStates ) {\n\n\t\t\tconst programMap = bindingStates[ geometryId ];\n\n\t\t\tfor ( const programId in programMap ) {\n\n\t\t\t\tconst stateMap = programMap[ programId ];\n\n\t\t\t\tfor ( const wireframe in stateMap ) {\n\n\t\t\t\t\tdeleteVertexArrayObject( stateMap[ wireframe ].object );\n\n\t\t\t\t\tdelete stateMap[ wireframe ];\n\n\t\t\t\t}\n\n\t\t\t\tdelete programMap[ programId ];\n\n\t\t\t}\n\n\t\t\tdelete bindingStates[ geometryId ];\n\n\t\t}\n\n\t}\n\n\tfunction releaseStatesOfGeometry( geometry ) {\n\n\t\tif ( bindingStates[ geometry.id ] === undefined ) return;\n\n\t\tconst programMap = bindingStates[ geometry.id ];\n\n\t\tfor ( const programId in programMap ) {\n\n\t\t\tconst stateMap = programMap[ programId ];\n\n\t\t\tfor ( const wireframe in stateMap ) {\n\n\t\t\t\tdeleteVertexArrayObject( stateMap[ wireframe ].object );\n\n\t\t\t\tdelete stateMap[ wireframe ];\n\n\t\t\t}\n\n\t\t\tdelete programMap[ programId ];\n\n\t\t}\n\n\t\tdelete bindingStates[ geometry.id ];\n\n\t}\n\n\tfunction releaseStatesOfProgram( program ) {\n\n\t\tfor ( const geometryId in bindingStates ) {\n\n\t\t\tconst programMap = bindingStates[ geometryId ];\n\n\t\t\tif ( programMap[ program.id ] === undefined ) continue;\n\n\t\t\tconst stateMap = programMap[ program.id ];\n\n\t\t\tfor ( const wireframe in stateMap ) {\n\n\t\t\t\tdeleteVertexArrayObject( stateMap[ wireframe ].object );\n\n\t\t\t\tdelete stateMap[ wireframe ];\n\n\t\t\t}\n\n\t\t\tdelete programMap[ program.id ];\n\n\t\t}\n\n\t}\n\n\tfunction reset() {\n\n\t\tresetDefaultState();\n\t\tforceUpdate = true;\n\n\t\tif ( currentState === defaultState ) return;\n\n\t\tcurrentState = defaultState;\n\t\tbindVertexArrayObject( currentState.object );\n\n\t}\n\n\t// for backward-compatibility\n\n\tfunction resetDefaultState() {\n\n\t\tdefaultState.geometry = null;\n\t\tdefaultState.program = null;\n\t\tdefaultState.wireframe = false;\n\n\t}\n\n\treturn {\n\n\t\tsetup: setup,\n\t\treset: reset,\n\t\tresetDefaultState: resetDefaultState,\n\t\tdispose: dispose,\n\t\treleaseStatesOfGeometry: releaseStatesOfGeometry,\n\t\treleaseStatesOfProgram: releaseStatesOfProgram,\n\n\t\tinitAttributes: initAttributes,\n\t\tenableAttribute: enableAttribute,\n\t\tdisableUnusedAttributes: disableUnusedAttributes\n\n\t};\n\n}\n\nfunction WebGLBufferRenderer( gl, extensions, info ) {\n\n\tlet mode;\n\n\tfunction setMode( value ) {\n\n\t\tmode = value;\n\n\t}\n\n\tfunction render( start, count ) {\n\n\t\tgl.drawArrays( mode, start, count );\n\n\t\tinfo.update( count, mode, 1 );\n\n\t}\n\n\tfunction renderInstances( start, count, primcount ) {\n\n\t\tif ( primcount === 0 ) return;\n\n\t\tgl.drawArraysInstanced( mode, start, count, primcount );\n\n\t\tinfo.update( count, mode, primcount );\n\n\t}\n\n\tfunction renderMultiDraw( starts, counts, drawCount ) {\n\n\t\tif ( drawCount === 0 ) return;\n\n\t\tconst extension = extensions.get( 'WEBGL_multi_draw' );\n\t\textension.multiDrawArraysWEBGL( mode, starts, 0, counts, 0, drawCount );\n\n\t\tlet elementCount = 0;\n\t\tfor ( let i = 0; i < drawCount; i ++ ) {\n\n\t\t\telementCount += counts[ i ];\n\n\t\t}\n\n\t\tinfo.update( elementCount, mode, 1 );\n\n\t}\n\n\tfunction renderMultiDrawInstances( starts, counts, drawCount, primcount ) {\n\n\t\tif ( drawCount === 0 ) return;\n\n\t\tconst extension = extensions.get( 'WEBGL_multi_draw' );\n\n\t\tif ( extension === null ) {\n\n\t\t\tfor ( let i = 0; i < starts.length; i ++ ) {\n\n\t\t\t\trenderInstances( starts[ i ], counts[ i ], primcount[ i ] );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\textension.multiDrawArraysInstancedWEBGL( mode, starts, 0, counts, 0, primcount, 0, drawCount );\n\n\t\t\tlet elementCount = 0;\n\t\t\tfor ( let i = 0; i < drawCount; i ++ ) {\n\n\t\t\t\telementCount += counts[ i ] * primcount[ i ];\n\n\t\t\t}\n\n\t\t\tinfo.update( elementCount, mode, 1 );\n\n\t\t}\n\n\t}\n\n\t//\n\n\tthis.setMode = setMode;\n\tthis.render = render;\n\tthis.renderInstances = renderInstances;\n\tthis.renderMultiDraw = renderMultiDraw;\n\tthis.renderMultiDrawInstances = renderMultiDrawInstances;\n\n}\n\nfunction WebGLCapabilities( gl, extensions, parameters, utils ) {\n\n\tlet maxAnisotropy;\n\n\tfunction getMaxAnisotropy() {\n\n\t\tif ( maxAnisotropy !== undefined ) return maxAnisotropy;\n\n\t\tif ( extensions.has( 'EXT_texture_filter_anisotropic' ) === true ) {\n\n\t\t\tconst extension = extensions.get( 'EXT_texture_filter_anisotropic' );\n\n\t\t\tmaxAnisotropy = gl.getParameter( extension.MAX_TEXTURE_MAX_ANISOTROPY_EXT );\n\n\t\t} else {\n\n\t\t\tmaxAnisotropy = 0;\n\n\t\t}\n\n\t\treturn maxAnisotropy;\n\n\t}\n\n\tfunction textureFormatReadable( textureFormat ) {\n\n\t\tif ( textureFormat !== RGBAFormat && utils.convert( textureFormat ) !== gl.getParameter( gl.IMPLEMENTATION_COLOR_READ_FORMAT ) ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tfunction textureTypeReadable( textureType ) {\n\n\t\tconst halfFloatSupportedByExt = ( textureType === HalfFloatType ) && ( extensions.has( 'EXT_color_buffer_half_float' ) || extensions.has( 'EXT_color_buffer_float' ) );\n\n\t\tif ( textureType !== UnsignedByteType && utils.convert( textureType ) !== gl.getParameter( gl.IMPLEMENTATION_COLOR_READ_TYPE ) && // Edge and Chrome Mac < 52 (#9513)\n\t\t\ttextureType !== FloatType && ! halfFloatSupportedByExt ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tfunction getMaxPrecision( precision ) {\n\n\t\tif ( precision === 'highp' ) {\n\n\t\t\tif ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.HIGH_FLOAT ).precision > 0 &&\n\t\t\t\tgl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.HIGH_FLOAT ).precision > 0 ) {\n\n\t\t\t\treturn 'highp';\n\n\t\t\t}\n\n\t\t\tprecision = 'mediump';\n\n\t\t}\n\n\t\tif ( precision === 'mediump' ) {\n\n\t\t\tif ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.MEDIUM_FLOAT ).precision > 0 &&\n\t\t\t\tgl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT ).precision > 0 ) {\n\n\t\t\t\treturn 'mediump';\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn 'lowp';\n\n\t}\n\n\tlet precision = parameters.precision !== undefined ? parameters.precision : 'highp';\n\tconst maxPrecision = getMaxPrecision( precision );\n\n\tif ( maxPrecision !== precision ) {\n\n\t\twarn( 'WebGLRenderer:', precision, 'not supported, using', maxPrecision, 'instead.' );\n\t\tprecision = maxPrecision;\n\n\t}\n\n\tconst logarithmicDepthBuffer = parameters.logarithmicDepthBuffer === true;\n\tconst reversedDepthBuffer = parameters.reversedDepthBuffer === true && extensions.has( 'EXT_clip_control' );\n\n\tconst maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS );\n\tconst maxVertexTextures = gl.getParameter( gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS );\n\tconst maxTextureSize = gl.getParameter( gl.MAX_TEXTURE_SIZE );\n\tconst maxCubemapSize = gl.getParameter( gl.MAX_CUBE_MAP_TEXTURE_SIZE );\n\n\tconst maxAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS );\n\tconst maxVertexUniforms = gl.getParameter( gl.MAX_VERTEX_UNIFORM_VECTORS );\n\tconst maxVaryings = gl.getParameter( gl.MAX_VARYING_VECTORS );\n\tconst maxFragmentUniforms = gl.getParameter( gl.MAX_FRAGMENT_UNIFORM_VECTORS );\n\n\tconst vertexTextures = maxVertexTextures > 0;\n\n\tconst maxSamples = gl.getParameter( gl.MAX_SAMPLES );\n\n\treturn {\n\n\t\tisWebGL2: true, // keeping this for backwards compatibility\n\n\t\tgetMaxAnisotropy: getMaxAnisotropy,\n\t\tgetMaxPrecision: getMaxPrecision,\n\n\t\ttextureFormatReadable: textureFormatReadable,\n\t\ttextureTypeReadable: textureTypeReadable,\n\n\t\tprecision: precision,\n\t\tlogarithmicDepthBuffer: logarithmicDepthBuffer,\n\t\treversedDepthBuffer: reversedDepthBuffer,\n\n\t\tmaxTextures: maxTextures,\n\t\tmaxVertexTextures: maxVertexTextures,\n\t\tmaxTextureSize: maxTextureSize,\n\t\tmaxCubemapSize: maxCubemapSize,\n\n\t\tmaxAttributes: maxAttributes,\n\t\tmaxVertexUniforms: maxVertexUniforms,\n\t\tmaxVaryings: maxVaryings,\n\t\tmaxFragmentUniforms: maxFragmentUniforms,\n\n\t\tvertexTextures: vertexTextures,\n\n\t\tmaxSamples: maxSamples\n\n\t};\n\n}\n\nfunction WebGLClipping( properties ) {\n\n\tconst scope = this;\n\n\tlet globalState = null,\n\t\tnumGlobalPlanes = 0,\n\t\tlocalClippingEnabled = false,\n\t\trenderingShadows = false;\n\n\tconst plane = new Plane(),\n\t\tviewNormalMatrix = new Matrix3(),\n\n\t\tuniform = { value: null, needsUpdate: false };\n\n\tthis.uniform = uniform;\n\tthis.numPlanes = 0;\n\tthis.numIntersection = 0;\n\n\tthis.init = function ( planes, enableLocalClipping ) {\n\n\t\tconst enabled =\n\t\t\tplanes.length !== 0 ||\n\t\t\tenableLocalClipping ||\n\t\t\t// enable state of previous frame - the clipping code has to\n\t\t\t// run another frame in order to reset the state:\n\t\t\tnumGlobalPlanes !== 0 ||\n\t\t\tlocalClippingEnabled;\n\n\t\tlocalClippingEnabled = enableLocalClipping;\n\n\t\tnumGlobalPlanes = planes.length;\n\n\t\treturn enabled;\n\n\t};\n\n\tthis.beginShadows = function () {\n\n\t\trenderingShadows = true;\n\t\tprojectPlanes( null );\n\n\t};\n\n\tthis.endShadows = function () {\n\n\t\trenderingShadows = false;\n\n\t};\n\n\tthis.setGlobalState = function ( planes, camera ) {\n\n\t\tglobalState = projectPlanes( planes, camera, 0 );\n\n\t};\n\n\tthis.setState = function ( material, camera, useCache ) {\n\n\t\tconst planes = material.clippingPlanes,\n\t\t\tclipIntersection = material.clipIntersection,\n\t\t\tclipShadows = material.clipShadows;\n\n\t\tconst materialProperties = properties.get( material );\n\n\t\tif ( ! localClippingEnabled || planes === null || planes.length === 0 || renderingShadows && ! clipShadows ) {\n\n\t\t\t// there's no local clipping\n\n\t\t\tif ( renderingShadows ) {\n\n\t\t\t\t// there's no global clipping\n\n\t\t\t\tprojectPlanes( null );\n\n\t\t\t} else {\n\n\t\t\t\tresetGlobalState();\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst nGlobal = renderingShadows ? 0 : numGlobalPlanes,\n\t\t\t\tlGlobal = nGlobal * 4;\n\n\t\t\tlet dstArray = materialProperties.clippingState || null;\n\n\t\t\tuniform.value = dstArray; // ensure unique state\n\n\t\t\tdstArray = projectPlanes( planes, camera, lGlobal, useCache );\n\n\t\t\tfor ( let i = 0; i !== lGlobal; ++ i ) {\n\n\t\t\t\tdstArray[ i ] = globalState[ i ];\n\n\t\t\t}\n\n\t\t\tmaterialProperties.clippingState = dstArray;\n\t\t\tthis.numIntersection = clipIntersection ? this.numPlanes : 0;\n\t\t\tthis.numPlanes += nGlobal;\n\n\t\t}\n\n\n\t};\n\n\tfunction resetGlobalState() {\n\n\t\tif ( uniform.value !== globalState ) {\n\n\t\t\tuniform.value = globalState;\n\t\t\tuniform.needsUpdate = numGlobalPlanes > 0;\n\n\t\t}\n\n\t\tscope.numPlanes = numGlobalPlanes;\n\t\tscope.numIntersection = 0;\n\n\t}\n\n\tfunction projectPlanes( planes, camera, dstOffset, skipTransform ) {\n\n\t\tconst nPlanes = planes !== null ? planes.length : 0;\n\t\tlet dstArray = null;\n\n\t\tif ( nPlanes !== 0 ) {\n\n\t\t\tdstArray = uniform.value;\n\n\t\t\tif ( skipTransform !== true || dstArray === null ) {\n\n\t\t\t\tconst flatSize = dstOffset + nPlanes * 4,\n\t\t\t\t\tviewMatrix = camera.matrixWorldInverse;\n\n\t\t\t\tviewNormalMatrix.getNormalMatrix( viewMatrix );\n\n\t\t\t\tif ( dstArray === null || dstArray.length < flatSize ) {\n\n\t\t\t\t\tdstArray = new Float32Array( flatSize );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0, i4 = dstOffset; i !== nPlanes; ++ i, i4 += 4 ) {\n\n\t\t\t\t\tplane.copy( planes[ i ] ).applyMatrix4( viewMatrix, viewNormalMatrix );\n\n\t\t\t\t\tplane.normal.toArray( dstArray, i4 );\n\t\t\t\t\tdstArray[ i4 + 3 ] = plane.constant;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tuniform.value = dstArray;\n\t\t\tuniform.needsUpdate = true;\n\n\t\t}\n\n\t\tscope.numPlanes = nPlanes;\n\t\tscope.numIntersection = 0;\n\n\t\treturn dstArray;\n\n\t}\n\n}\n\nfunction WebGLCubeMaps( renderer ) {\n\n\tlet cubemaps = new WeakMap();\n\n\tfunction mapTextureMapping( texture, mapping ) {\n\n\t\tif ( mapping === EquirectangularReflectionMapping ) {\n\n\t\t\ttexture.mapping = CubeReflectionMapping;\n\n\t\t} else if ( mapping === EquirectangularRefractionMapping ) {\n\n\t\t\ttexture.mapping = CubeRefractionMapping;\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\tfunction get( texture ) {\n\n\t\tif ( texture && texture.isTexture ) {\n\n\t\t\tconst mapping = texture.mapping;\n\n\t\t\tif ( mapping === EquirectangularReflectionMapping || mapping === EquirectangularRefractionMapping ) {\n\n\t\t\t\tif ( cubemaps.has( texture ) ) {\n\n\t\t\t\t\tconst cubemap = cubemaps.get( texture ).texture;\n\t\t\t\t\treturn mapTextureMapping( cubemap, texture.mapping );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconst image = texture.image;\n\n\t\t\t\t\tif ( image && image.height > 0 ) {\n\n\t\t\t\t\t\tconst renderTarget = new WebGLCubeRenderTarget( image.height );\n\t\t\t\t\t\trenderTarget.fromEquirectangularTexture( renderer, texture );\n\t\t\t\t\t\tcubemaps.set( texture, renderTarget );\n\n\t\t\t\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t\t\t\t\treturn mapTextureMapping( renderTarget.texture, texture.mapping );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// image not yet ready. try the conversion next frame\n\n\t\t\t\t\t\treturn null;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\tfunction onTextureDispose( event ) {\n\n\t\tconst texture = event.target;\n\n\t\ttexture.removeEventListener( 'dispose', onTextureDispose );\n\n\t\tconst cubemap = cubemaps.get( texture );\n\n\t\tif ( cubemap !== undefined ) {\n\n\t\t\tcubemaps.delete( texture );\n\t\t\tcubemap.dispose();\n\n\t\t}\n\n\t}\n\n\tfunction dispose() {\n\n\t\tcubemaps = new WeakMap();\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\nconst LOD_MIN = 4;\n\n// The standard deviations (radians) associated with the extra mips.\n// Used for scene blur in fromScene() method.\nconst EXTRA_LOD_SIGMA = [ 0.125, 0.215, 0.35, 0.446, 0.526, 0.582 ];\n\n// The maximum length of the blur for loop. Smaller sigmas will use fewer\n// samples and exit early, but not recompile the shader.\n// Used for scene blur in fromScene() method.\nconst MAX_SAMPLES = 20;\n\n// GGX VNDF importance sampling configuration\nconst GGX_SAMPLES = 256;\n\nconst _flatCamera = /*@__PURE__*/ new OrthographicCamera();\nconst _clearColor = /*@__PURE__*/ new Color();\nlet _oldTarget = null;\nlet _oldActiveCubeFace = 0;\nlet _oldActiveMipmapLevel = 0;\nlet _oldXrEnabled = false;\n\nconst _origin = /*@__PURE__*/ new Vector3();\n\n/**\n * This class generates a Prefiltered, Mipmapped Radiance Environment Map\n * (PMREM) from a cubeMap environment texture. This allows different levels of\n * blur to be quickly accessed based on material roughness. It is packed into a\n * special CubeUV format that allows us to perform custom interpolation so that\n * we can support nonlinear formats such as RGBE. Unlike a traditional mipmap\n * chain, it only goes down to the LOD_MIN level (above), and then creates extra\n * even more filtered 'mips' at the same LOD_MIN resolution, associated with\n * higher roughness levels. In this way we maintain resolution to smoothly\n * interpolate diffuse lighting while limiting sampling computation.\n *\n * The prefiltering uses GGX VNDF (Visible Normal Distribution Function)\n * importance sampling based on \"Sampling the GGX Distribution of Visible Normals\"\n * (Heitz, 2018) to generate environment maps that accurately match the GGX BRDF\n * used in material rendering for physically-based image-based lighting.\n */\nclass PMREMGenerator {\n\n\t/**\n\t * Constructs a new PMREM generator.\n\t *\n\t * @param {WebGLRenderer} renderer - The renderer.\n\t */\n\tconstructor( renderer ) {\n\n\t\tthis._renderer = renderer;\n\t\tthis._pingPongRenderTarget = null;\n\n\t\tthis._lodMax = 0;\n\t\tthis._cubeSize = 0;\n\t\tthis._sizeLods = [];\n\t\tthis._sigmas = [];\n\t\tthis._lodMeshes = [];\n\n\t\tthis._backgroundBox = null;\n\n\t\tthis._cubemapMaterial = null;\n\t\tthis._equirectMaterial = null;\n\n\t\tthis._blurMaterial = null;\n\t\tthis._ggxMaterial = null;\n\n\t}\n\n\t/**\n\t * Generates a PMREM from a supplied Scene, which can be faster than using an\n\t * image if networking bandwidth is low. Optional sigma specifies a blur radius\n\t * in radians to be applied to the scene before PMREM generation. Optional near\n\t * and far planes ensure the scene is rendered in its entirety.\n\t *\n\t * @param {Scene} scene - The scene to be captured.\n\t * @param {number} [sigma=0] - The blur radius in radians.\n\t * @param {number} [near=0.1] - The near plane distance.\n\t * @param {number} [far=100] - The far plane distance.\n\t * @param {Object} [options={}] - The configuration options.\n\t * @param {number} [options.size=256] - The texture size of the PMREM.\n\t * @param {Vector3} [options.renderTarget=origin] - The position of the internal cube camera that renders the scene.\n\t * @return {WebGLRenderTarget} The resulting PMREM.\n\t */\n\tfromScene( scene, sigma = 0, near = 0.1, far = 100, options = {} ) {\n\n\t\tconst {\n\t\t\tsize = 256,\n\t\t\tposition = _origin,\n\t\t} = options;\n\n\t\t_oldTarget = this._renderer.getRenderTarget();\n\t\t_oldActiveCubeFace = this._renderer.getActiveCubeFace();\n\t\t_oldActiveMipmapLevel = this._renderer.getActiveMipmapLevel();\n\t\t_oldXrEnabled = this._renderer.xr.enabled;\n\n\t\tthis._renderer.xr.enabled = false;\n\n\t\tthis._setSize( size );\n\n\t\tconst cubeUVRenderTarget = this._allocateTargets();\n\t\tcubeUVRenderTarget.depthBuffer = true;\n\n\t\tthis._sceneToCubeUV( scene, near, far, cubeUVRenderTarget, position );\n\n\t\tif ( sigma > 0 ) {\n\n\t\t\tthis._blur( cubeUVRenderTarget, 0, 0, sigma );\n\n\t\t}\n\n\t\tthis._applyPMREM( cubeUVRenderTarget );\n\t\tthis._cleanup( cubeUVRenderTarget );\n\n\t\treturn cubeUVRenderTarget;\n\n\t}\n\n\t/**\n\t * Generates a PMREM from an equirectangular texture, which can be either LDR\n\t * or HDR. The ideal input image size is 1k (1024 x 512),\n\t * as this matches best with the 256 x 256 cubemap output.\n\t *\n\t * @param {Texture} equirectangular - The equirectangular texture to be converted.\n\t * @param {?WebGLRenderTarget} [renderTarget=null] - The render target to use.\n\t * @return {WebGLRenderTarget} The resulting PMREM.\n\t */\n\tfromEquirectangular( equirectangular, renderTarget = null ) {\n\n\t\treturn this._fromTexture( equirectangular, renderTarget );\n\n\t}\n\n\t/**\n\t * Generates a PMREM from an cubemap texture, which can be either LDR\n\t * or HDR. The ideal input cube size is 256 x 256,\n\t * as this matches best with the 256 x 256 cubemap output.\n\t *\n\t * @param {Texture} cubemap - The cubemap texture to be converted.\n\t * @param {?WebGLRenderTarget} [renderTarget=null] - The render target to use.\n\t * @return {WebGLRenderTarget} The resulting PMREM.\n\t */\n\tfromCubemap( cubemap, renderTarget = null ) {\n\n\t\treturn this._fromTexture( cubemap, renderTarget );\n\n\t}\n\n\t/**\n\t * Pre-compiles the cubemap shader. You can get faster start-up by invoking this method during\n\t * your texture's network fetch for increased concurrency.\n\t */\n\tcompileCubemapShader() {\n\n\t\tif ( this._cubemapMaterial === null ) {\n\n\t\t\tthis._cubemapMaterial = _getCubemapMaterial();\n\t\t\tthis._compileMaterial( this._cubemapMaterial );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Pre-compiles the equirectangular shader. You can get faster start-up by invoking this method during\n\t * your texture's network fetch for increased concurrency.\n\t */\n\tcompileEquirectangularShader() {\n\n\t\tif ( this._equirectMaterial === null ) {\n\n\t\t\tthis._equirectMaterial = _getEquirectMaterial();\n\t\t\tthis._compileMaterial( this._equirectMaterial );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Disposes of the PMREMGenerator's internal memory. Note that PMREMGenerator is a static class,\n\t * so you should not need more than one PMREMGenerator object. If you do, calling dispose() on\n\t * one of them will cause any others to also become unusable.\n\t */\n\tdispose() {\n\n\t\tthis._dispose();\n\n\t\tif ( this._cubemapMaterial !== null ) this._cubemapMaterial.dispose();\n\t\tif ( this._equirectMaterial !== null ) this._equirectMaterial.dispose();\n\n\t\tif ( this._backgroundBox !== null ) {\n\n\t\t\tthis._backgroundBox.geometry.dispose();\n\t\t\tthis._backgroundBox.material.dispose();\n\n\t\t}\n\n\t}\n\n\t// private interface\n\n\t_setSize( cubeSize ) {\n\n\t\tthis._lodMax = Math.floor( Math.log2( cubeSize ) );\n\t\tthis._cubeSize = Math.pow( 2, this._lodMax );\n\n\t}\n\n\t_dispose() {\n\n\t\tif ( this._blurMaterial !== null ) this._blurMaterial.dispose();\n\t\tif ( this._ggxMaterial !== null ) this._ggxMaterial.dispose();\n\n\t\tif ( this._pingPongRenderTarget !== null ) this._pingPongRenderTarget.dispose();\n\n\t\tfor ( let i = 0; i < this._lodMeshes.length; i ++ ) {\n\n\t\t\tthis._lodMeshes[ i ].geometry.dispose();\n\n\t\t}\n\n\t}\n\n\t_cleanup( outputTarget ) {\n\n\t\tthis._renderer.setRenderTarget( _oldTarget, _oldActiveCubeFace, _oldActiveMipmapLevel );\n\t\tthis._renderer.xr.enabled = _oldXrEnabled;\n\n\t\toutputTarget.scissorTest = false;\n\t\t_setViewport( outputTarget, 0, 0, outputTarget.width, outputTarget.height );\n\n\t}\n\n\t_fromTexture( texture, renderTarget ) {\n\n\t\tif ( texture.mapping === CubeReflectionMapping || texture.mapping === CubeRefractionMapping ) {\n\n\t\t\tthis._setSize( texture.image.length === 0 ? 16 : ( texture.image[ 0 ].width || texture.image[ 0 ].image.width ) );\n\n\t\t} else { // Equirectangular\n\n\t\t\tthis._setSize( texture.image.width / 4 );\n\n\t\t}\n\n\t\t_oldTarget = this._renderer.getRenderTarget();\n\t\t_oldActiveCubeFace = this._renderer.getActiveCubeFace();\n\t\t_oldActiveMipmapLevel = this._renderer.getActiveMipmapLevel();\n\t\t_oldXrEnabled = this._renderer.xr.enabled;\n\n\t\tthis._renderer.xr.enabled = false;\n\n\t\tconst cubeUVRenderTarget = renderTarget || this._allocateTargets();\n\t\tthis._textureToCubeUV( texture, cubeUVRenderTarget );\n\t\tthis._applyPMREM( cubeUVRenderTarget );\n\t\tthis._cleanup( cubeUVRenderTarget );\n\n\t\treturn cubeUVRenderTarget;\n\n\t}\n\n\t_allocateTargets() {\n\n\t\tconst width = 3 * Math.max( this._cubeSize, 16 * 7 );\n\t\tconst height = 4 * this._cubeSize;\n\n\t\tconst params = {\n\t\t\tmagFilter: LinearFilter,\n\t\t\tminFilter: LinearFilter,\n\t\t\tgenerateMipmaps: false,\n\t\t\ttype: HalfFloatType,\n\t\t\tformat: RGBAFormat,\n\t\t\tcolorSpace: LinearSRGBColorSpace,\n\t\t\tdepthBuffer: false\n\t\t};\n\n\t\tconst cubeUVRenderTarget = _createRenderTarget( width, height, params );\n\n\t\tif ( this._pingPongRenderTarget === null || this._pingPongRenderTarget.width !== width || this._pingPongRenderTarget.height !== height ) {\n\n\t\t\tif ( this._pingPongRenderTarget !== null ) {\n\n\t\t\t\tthis._dispose();\n\n\t\t\t}\n\n\t\t\tthis._pingPongRenderTarget = _createRenderTarget( width, height, params );\n\n\t\t\tconst { _lodMax } = this;\n\t\t\t( { lodMeshes: this._lodMeshes, sizeLods: this._sizeLods, sigmas: this._sigmas } = _createPlanes( _lodMax ) );\n\n\t\t\tthis._blurMaterial = _getBlurShader( _lodMax, width, height );\n\t\t\tthis._ggxMaterial = _getGGXShader( _lodMax, width, height );\n\n\t\t}\n\n\t\treturn cubeUVRenderTarget;\n\n\t}\n\n\t_compileMaterial( material ) {\n\n\t\tconst mesh = new Mesh( new BufferGeometry(), material );\n\t\tthis._renderer.compile( mesh, _flatCamera );\n\n\t}\n\n\t_sceneToCubeUV( scene, near, far, cubeUVRenderTarget, position ) {\n\n\t\tconst fov = 90;\n\t\tconst aspect = 1;\n\t\tconst cubeCamera = new PerspectiveCamera( fov, aspect, near, far );\n\t\tconst upSign = [ 1, -1, 1, 1, 1, 1 ];\n\t\tconst forwardSign = [ 1, 1, 1, -1, -1, -1 ];\n\t\tconst renderer = this._renderer;\n\n\t\tconst originalAutoClear = renderer.autoClear;\n\t\tconst toneMapping = renderer.toneMapping;\n\t\trenderer.getClearColor( _clearColor );\n\n\t\trenderer.toneMapping = NoToneMapping;\n\t\trenderer.autoClear = false;\n\n\t\t// https://github.com/mrdoob/three.js/issues/31413#issuecomment-3095966812\n\t\tconst reversedDepthBuffer = renderer.state.buffers.depth.getReversed();\n\n\t\tif ( reversedDepthBuffer ) {\n\n\t\t\trenderer.setRenderTarget( cubeUVRenderTarget );\n\t\t\trenderer.clearDepth();\n\t\t\trenderer.setRenderTarget( null );\n\n\t\t}\n\n\t\tif ( this._backgroundBox === null ) {\n\n\t\t\tthis._backgroundBox = new Mesh(\n\t\t\t\tnew BoxGeometry(),\n\t\t\t\tnew MeshBasicMaterial( {\n\t\t\t\t\tname: 'PMREM.Background',\n\t\t\t\t\tside: BackSide,\n\t\t\t\t\tdepthWrite: false,\n\t\t\t\t\tdepthTest: false,\n\t\t\t\t} )\n\t\t\t);\n\n\t\t}\n\n\t\tconst backgroundBox = this._backgroundBox;\n\t\tconst backgroundMaterial = backgroundBox.material;\n\n\t\tlet useSolidColor = false;\n\n\t\tconst background = scene.background;\n\n\t\tif ( background ) {\n\n\t\t\tif ( background.isColor ) {\n\n\t\t\t\tbackgroundMaterial.color.copy( background );\n\t\t\t\tscene.background = null;\n\t\t\t\tuseSolidColor = true;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tbackgroundMaterial.color.copy( _clearColor );\n\t\t\tuseSolidColor = true;\n\n\t\t}\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tconst col = i % 3;\n\n\t\t\tif ( col === 0 ) {\n\n\t\t\t\tcubeCamera.up.set( 0, upSign[ i ], 0 );\n\t\t\t\tcubeCamera.position.set( position.x, position.y, position.z );\n\t\t\t\tcubeCamera.lookAt( position.x + forwardSign[ i ], position.y, position.z );\n\n\t\t\t} else if ( col === 1 ) {\n\n\t\t\t\tcubeCamera.up.set( 0, 0, upSign[ i ] );\n\t\t\t\tcubeCamera.position.set( position.x, position.y, position.z );\n\t\t\t\tcubeCamera.lookAt( position.x, position.y + forwardSign[ i ], position.z );\n\n\n\t\t\t} else {\n\n\t\t\t\tcubeCamera.up.set( 0, upSign[ i ], 0 );\n\t\t\t\tcubeCamera.position.set( position.x, position.y, position.z );\n\t\t\t\tcubeCamera.lookAt( position.x, position.y, position.z + forwardSign[ i ] );\n\n\t\t\t}\n\n\t\t\tconst size = this._cubeSize;\n\n\t\t\t_setViewport( cubeUVRenderTarget, col * size, i > 2 ? size : 0, size, size );\n\n\t\t\trenderer.setRenderTarget( cubeUVRenderTarget );\n\n\t\t\tif ( useSolidColor ) {\n\n\t\t\t\trenderer.render( backgroundBox, cubeCamera );\n\n\t\t\t}\n\n\t\t\trenderer.render( scene, cubeCamera );\n\n\t\t}\n\n\t\trenderer.toneMapping = toneMapping;\n\t\trenderer.autoClear = originalAutoClear;\n\t\tscene.background = background;\n\n\t}\n\n\t_textureToCubeUV( texture, cubeUVRenderTarget ) {\n\n\t\tconst renderer = this._renderer;\n\n\t\tconst isCubeTexture = ( texture.mapping === CubeReflectionMapping || texture.mapping === CubeRefractionMapping );\n\n\t\tif ( isCubeTexture ) {\n\n\t\t\tif ( this._cubemapMaterial === null ) {\n\n\t\t\t\tthis._cubemapMaterial = _getCubemapMaterial();\n\n\t\t\t}\n\n\t\t\tthis._cubemapMaterial.uniforms.flipEnvMap.value = ( texture.isRenderTargetTexture === false ) ? -1 : 1;\n\n\t\t} else {\n\n\t\t\tif ( this._equirectMaterial === null ) {\n\n\t\t\t\tthis._equirectMaterial = _getEquirectMaterial();\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst material = isCubeTexture ? this._cubemapMaterial : this._equirectMaterial;\n\n\t\tconst mesh = this._lodMeshes[ 0 ];\n\t\tmesh.material = material;\n\n\t\tconst uniforms = material.uniforms;\n\n\t\tuniforms[ 'envMap' ].value = texture;\n\n\t\tconst size = this._cubeSize;\n\n\t\t_setViewport( cubeUVRenderTarget, 0, 0, 3 * size, 2 * size );\n\n\t\trenderer.setRenderTarget( cubeUVRenderTarget );\n\t\trenderer.render( mesh, _flatCamera );\n\n\t}\n\n\t_applyPMREM( cubeUVRenderTarget ) {\n\n\t\tconst renderer = this._renderer;\n\t\tconst autoClear = renderer.autoClear;\n\t\trenderer.autoClear = false;\n\n\t\tconst n = this._lodMeshes.length;\n\n\t\t// Use GGX VNDF importance sampling\n\t\tfor ( let i = 1; i < n; i ++ ) {\n\n\t\t\tthis._applyGGXFilter( cubeUVRenderTarget, i - 1, i );\n\n\t\t}\n\n\t\trenderer.autoClear = autoClear;\n\n\t}\n\n\t/**\n\t * Applies GGX VNDF importance sampling filter to generate a prefiltered environment map.\n\t * Uses Monte Carlo integration with VNDF importance sampling to accurately represent the\n\t * GGX BRDF for physically-based rendering. Reads from the previous LOD level and\n\t * applies incremental roughness filtering to avoid over-blurring.\n\t *\n\t * @private\n\t * @param {WebGLRenderTarget} cubeUVRenderTarget\n\t * @param {number} lodIn - Source LOD level to read from\n\t * @param {number} lodOut - Target LOD level to write to\n\t */\n\t_applyGGXFilter( cubeUVRenderTarget, lodIn, lodOut ) {\n\n\t\tconst renderer = this._renderer;\n\t\tconst pingPongRenderTarget = this._pingPongRenderTarget;\n\n\t\tconst ggxMaterial = this._ggxMaterial;\n\t\tconst ggxMesh = this._lodMeshes[ lodOut ];\n\t\tggxMesh.material = ggxMaterial;\n\n\t\tconst ggxUniforms = ggxMaterial.uniforms;\n\n\t\t// Calculate incremental roughness between LOD levels\n\t\tconst targetRoughness = lodOut / ( this._lodMeshes.length - 1 );\n\t\tconst sourceRoughness = lodIn / ( this._lodMeshes.length - 1 );\n\t\tconst incrementalRoughness = Math.sqrt( targetRoughness * targetRoughness - sourceRoughness * sourceRoughness );\n\n\t\t// Apply blur strength mapping for better quality across the roughness range\n\t\tconst blurStrength = 0.05 + targetRoughness * 0.95;\n\t\tconst adjustedRoughness = incrementalRoughness * blurStrength;\n\n\t\t// Calculate viewport position based on output LOD level\n\t\tconst { _lodMax } = this;\n\t\tconst outputSize = this._sizeLods[ lodOut ];\n\t\tconst x = 3 * outputSize * ( lodOut > _lodMax - LOD_MIN ? lodOut - _lodMax + LOD_MIN : 0 );\n\t\tconst y = 4 * ( this._cubeSize - outputSize );\n\n\t\t// Read from previous LOD with incremental roughness\n\t\tggxUniforms[ 'envMap' ].value = cubeUVRenderTarget.texture;\n\t\tggxUniforms[ 'roughness' ].value = adjustedRoughness;\n\t\tggxUniforms[ 'mipInt' ].value = _lodMax - lodIn; // Sample from input LOD\n\n\t\t_setViewport( pingPongRenderTarget, x, y, 3 * outputSize, 2 * outputSize );\n\t\trenderer.setRenderTarget( pingPongRenderTarget );\n\t\trenderer.render( ggxMesh, _flatCamera );\n\n\t\t// Copy from pingPong back to cubeUV (simple direct copy)\n\t\tggxUniforms[ 'envMap' ].value = pingPongRenderTarget.texture;\n\t\tggxUniforms[ 'roughness' ].value = 0.0; // Direct copy\n\t\tggxUniforms[ 'mipInt' ].value = _lodMax - lodOut; // Read from the level we just wrote\n\n\t\t_setViewport( cubeUVRenderTarget, x, y, 3 * outputSize, 2 * outputSize );\n\t\trenderer.setRenderTarget( cubeUVRenderTarget );\n\t\trenderer.render( ggxMesh, _flatCamera );\n\n\t}\n\n\t/**\n\t * This is a two-pass Gaussian blur for a cubemap. Normally this is done\n\t * vertically and horizontally, but this breaks down on a cube. Here we apply\n\t * the blur latitudinally (around the poles), and then longitudinally (towards\n\t * the poles) to approximate the orthogonally-separable blur. It is least\n\t * accurate at the poles, but still does a decent job.\n\t *\n\t * Used for initial scene blur in fromScene() method when sigma > 0.\n\t *\n\t * @private\n\t * @param {WebGLRenderTarget} cubeUVRenderTarget\n\t * @param {number} lodIn\n\t * @param {number} lodOut\n\t * @param {number} sigma\n\t * @param {Vector3} [poleAxis]\n\t */\n\t_blur( cubeUVRenderTarget, lodIn, lodOut, sigma, poleAxis ) {\n\n\t\tconst pingPongRenderTarget = this._pingPongRenderTarget;\n\n\t\tthis._halfBlur(\n\t\t\tcubeUVRenderTarget,\n\t\t\tpingPongRenderTarget,\n\t\t\tlodIn,\n\t\t\tlodOut,\n\t\t\tsigma,\n\t\t\t'latitudinal',\n\t\t\tpoleAxis );\n\n\t\tthis._halfBlur(\n\t\t\tpingPongRenderTarget,\n\t\t\tcubeUVRenderTarget,\n\t\t\tlodOut,\n\t\t\tlodOut,\n\t\t\tsigma,\n\t\t\t'longitudinal',\n\t\t\tpoleAxis );\n\n\t}\n\n\t_halfBlur( targetIn, targetOut, lodIn, lodOut, sigmaRadians, direction, poleAxis ) {\n\n\t\tconst renderer = this._renderer;\n\t\tconst blurMaterial = this._blurMaterial;\n\n\t\tif ( direction !== 'latitudinal' && direction !== 'longitudinal' ) {\n\n\t\t\terror(\n\t\t\t\t'blur direction must be either latitudinal or longitudinal!' );\n\n\t\t}\n\n\t\t// Number of standard deviations at which to cut off the discrete approximation.\n\t\tconst STANDARD_DEVIATIONS = 3;\n\n\t\tconst blurMesh = this._lodMeshes[ lodOut ];\n\t\tblurMesh.material = blurMaterial;\n\n\t\tconst blurUniforms = blurMaterial.uniforms;\n\n\t\tconst pixels = this._sizeLods[ lodIn ] - 1;\n\t\tconst radiansPerPixel = isFinite( sigmaRadians ) ? Math.PI / ( 2 * pixels ) : 2 * Math.PI / ( 2 * MAX_SAMPLES - 1 );\n\t\tconst sigmaPixels = sigmaRadians / radiansPerPixel;\n\t\tconst samples = isFinite( sigmaRadians ) ? 1 + Math.floor( STANDARD_DEVIATIONS * sigmaPixels ) : MAX_SAMPLES;\n\n\t\tif ( samples > MAX_SAMPLES ) {\n\n\t\t\twarn( `sigmaRadians, ${\n\t\t\t\tsigmaRadians}, is too large and will clip, as it requested ${\n\t\t\t\tsamples} samples when the maximum is set to ${MAX_SAMPLES}` );\n\n\t\t}\n\n\t\tconst weights = [];\n\t\tlet sum = 0;\n\n\t\tfor ( let i = 0; i < MAX_SAMPLES; ++ i ) {\n\n\t\t\tconst x = i / sigmaPixels;\n\t\t\tconst weight = Math.exp( - x * x / 2 );\n\t\t\tweights.push( weight );\n\n\t\t\tif ( i === 0 ) {\n\n\t\t\t\tsum += weight;\n\n\t\t\t} else if ( i < samples ) {\n\n\t\t\t\tsum += 2 * weight;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( let i = 0; i < weights.length; i ++ ) {\n\n\t\t\tweights[ i ] = weights[ i ] / sum;\n\n\t\t}\n\n\t\tblurUniforms[ 'envMap' ].value = targetIn.texture;\n\t\tblurUniforms[ 'samples' ].value = samples;\n\t\tblurUniforms[ 'weights' ].value = weights;\n\t\tblurUniforms[ 'latitudinal' ].value = direction === 'latitudinal';\n\n\t\tif ( poleAxis ) {\n\n\t\t\tblurUniforms[ 'poleAxis' ].value = poleAxis;\n\n\t\t}\n\n\t\tconst { _lodMax } = this;\n\t\tblurUniforms[ 'dTheta' ].value = radiansPerPixel;\n\t\tblurUniforms[ 'mipInt' ].value = _lodMax - lodIn;\n\n\t\tconst outputSize = this._sizeLods[ lodOut ];\n\t\tconst x = 3 * outputSize * ( lodOut > _lodMax - LOD_MIN ? lodOut - _lodMax + LOD_MIN : 0 );\n\t\tconst y = 4 * ( this._cubeSize - outputSize );\n\n\t\t_setViewport( targetOut, x, y, 3 * outputSize, 2 * outputSize );\n\t\trenderer.setRenderTarget( targetOut );\n\t\trenderer.render( blurMesh, _flatCamera );\n\n\t}\n\n}\n\n\n\nfunction _createPlanes( lodMax ) {\n\n\tconst sizeLods = [];\n\tconst sigmas = [];\n\tconst lodMeshes = [];\n\n\tlet lod = lodMax;\n\n\tconst totalLods = lodMax - LOD_MIN + 1 + EXTRA_LOD_SIGMA.length;\n\n\tfor ( let i = 0; i < totalLods; i ++ ) {\n\n\t\tconst sizeLod = Math.pow( 2, lod );\n\t\tsizeLods.push( sizeLod );\n\t\tlet sigma = 1.0 / sizeLod;\n\n\t\tif ( i > lodMax - LOD_MIN ) {\n\n\t\t\tsigma = EXTRA_LOD_SIGMA[ i - lodMax + LOD_MIN - 1 ];\n\n\t\t} else if ( i === 0 ) {\n\n\t\t\tsigma = 0;\n\n\t\t}\n\n\t\tsigmas.push( sigma );\n\n\t\tconst texelSize = 1.0 / ( sizeLod - 2 );\n\t\tconst min = - texelSize;\n\t\tconst max = 1 + texelSize;\n\t\tconst uv1 = [ min, min, max, min, max, max, min, min, max, max, min, max ];\n\n\t\tconst cubeFaces = 6;\n\t\tconst vertices = 6;\n\t\tconst positionSize = 3;\n\t\tconst uvSize = 2;\n\t\tconst faceIndexSize = 1;\n\n\t\tconst position = new Float32Array( positionSize * vertices * cubeFaces );\n\t\tconst uv = new Float32Array( uvSize * vertices * cubeFaces );\n\t\tconst faceIndex = new Float32Array( faceIndexSize * vertices * cubeFaces );\n\n\t\tfor ( let face = 0; face < cubeFaces; face ++ ) {\n\n\t\t\tconst x = ( face % 3 ) * 2 / 3 - 1;\n\t\t\tconst y = face > 2 ? 0 : -1;\n\t\t\tconst coordinates = [\n\t\t\t\tx, y, 0,\n\t\t\t\tx + 2 / 3, y, 0,\n\t\t\t\tx + 2 / 3, y + 1, 0,\n\t\t\t\tx, y, 0,\n\t\t\t\tx + 2 / 3, y + 1, 0,\n\t\t\t\tx, y + 1, 0\n\t\t\t];\n\t\t\tposition.set( coordinates, positionSize * vertices * face );\n\t\t\tuv.set( uv1, uvSize * vertices * face );\n\t\t\tconst fill = [ face, face, face, face, face, face ];\n\t\t\tfaceIndex.set( fill, faceIndexSize * vertices * face );\n\n\t\t}\n\n\t\tconst planes = new BufferGeometry();\n\t\tplanes.setAttribute( 'position', new BufferAttribute( position, positionSize ) );\n\t\tplanes.setAttribute( 'uv', new BufferAttribute( uv, uvSize ) );\n\t\tplanes.setAttribute( 'faceIndex', new BufferAttribute( faceIndex, faceIndexSize ) );\n\t\tlodMeshes.push( new Mesh( planes, null ) );\n\n\t\tif ( lod > LOD_MIN ) {\n\n\t\t\tlod --;\n\n\t\t}\n\n\t}\n\n\treturn { lodMeshes, sizeLods, sigmas };\n\n}\n\nfunction _createRenderTarget( width, height, params ) {\n\n\tconst cubeUVRenderTarget = new WebGLRenderTarget( width, height, params );\n\tcubeUVRenderTarget.texture.mapping = CubeUVReflectionMapping;\n\tcubeUVRenderTarget.texture.name = 'PMREM.cubeUv';\n\tcubeUVRenderTarget.scissorTest = true;\n\treturn cubeUVRenderTarget;\n\n}\n\nfunction _setViewport( target, x, y, width, height ) {\n\n\ttarget.viewport.set( x, y, width, height );\n\ttarget.scissor.set( x, y, width, height );\n\n}\n\nfunction _getGGXShader( lodMax, width, height ) {\n\n\tconst shaderMaterial = new ShaderMaterial( {\n\n\t\tname: 'PMREMGGXConvolution',\n\n\t\tdefines: {\n\t\t\t'GGX_SAMPLES': GGX_SAMPLES,\n\t\t\t'CUBEUV_TEXEL_WIDTH': 1.0 / width,\n\t\t\t'CUBEUV_TEXEL_HEIGHT': 1.0 / height,\n\t\t\t'CUBEUV_MAX_MIP': `${lodMax}.0`,\n\t\t},\n\n\t\tuniforms: {\n\t\t\t'envMap': { value: null },\n\t\t\t'roughness': { value: 0.0 },\n\t\t\t'mipInt': { value: 0 }\n\t\t},\n\n\t\tvertexShader: _getCommonVertexShader(),\n\n\t\tfragmentShader: /* glsl */`\n\n\t\t\tprecision highp float;\n\t\t\tprecision highp int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\t\t\tuniform float roughness;\n\t\t\tuniform float mipInt;\n\n\t\t\t#define ENVMAP_TYPE_CUBE_UV\n\t\t\t#include <cube_uv_reflection_fragment>\n\n\t\t\t#define PI 3.14159265359\n\n\t\t\t// Van der Corput radical inverse\n\t\t\tfloat radicalInverse_VdC(uint bits) {\n\t\t\t\tbits = (bits << 16u) | (bits >> 16u);\n\t\t\t\tbits = ((bits & 0x55555555u) << 1u) | ((bits & 0xAAAAAAAAu) >> 1u);\n\t\t\t\tbits = ((bits & 0x33333333u) << 2u) | ((bits & 0xCCCCCCCCu) >> 2u);\n\t\t\t\tbits = ((bits & 0x0F0F0F0Fu) << 4u) | ((bits & 0xF0F0F0F0u) >> 4u);\n\t\t\t\tbits = ((bits & 0x00FF00FFu) << 8u) | ((bits & 0xFF00FF00u) >> 8u);\n\t\t\t\treturn float(bits) * 2.3283064365386963e-10; // / 0x100000000\n\t\t\t}\n\n\t\t\t// Hammersley sequence\n\t\t\tvec2 hammersley(uint i, uint N) {\n\t\t\t\treturn vec2(float(i) / float(N), radicalInverse_VdC(i));\n\t\t\t}\n\n\t\t\t// GGX VNDF importance sampling (Eric Heitz 2018)\n\t\t\t// \"Sampling the GGX Distribution of Visible Normals\"\n\t\t\t// https://jcgt.org/published/0007/04/01/\n\t\t\tvec3 importanceSampleGGX_VNDF(vec2 Xi, vec3 V, float roughness) {\n\t\t\t\tfloat alpha = roughness * roughness;\n\n\t\t\t\t// Section 3.2: Transform view direction to hemisphere configuration\n\t\t\t\tvec3 Vh = normalize(vec3(alpha * V.x, alpha * V.y, V.z));\n\n\t\t\t\t// Section 4.1: Orthonormal basis\n\t\t\t\tfloat lensq = Vh.x * Vh.x + Vh.y * Vh.y;\n\t\t\t\tvec3 T1 = lensq > 0.0 ? vec3(-Vh.y, Vh.x, 0.0) / sqrt(lensq) : vec3(1.0, 0.0, 0.0);\n\t\t\t\tvec3 T2 = cross(Vh, T1);\n\n\t\t\t\t// Section 4.2: Parameterization of projected area\n\t\t\t\tfloat r = sqrt(Xi.x);\n\t\t\t\tfloat phi = 2.0 * PI * Xi.y;\n\t\t\t\tfloat t1 = r * cos(phi);\n\t\t\t\tfloat t2 = r * sin(phi);\n\t\t\t\tfloat s = 0.5 * (1.0 + Vh.z);\n\t\t\t\tt2 = (1.0 - s) * sqrt(1.0 - t1 * t1) + s * t2;\n\n\t\t\t\t// Section 4.3: Reprojection onto hemisphere\n\t\t\t\tvec3 Nh = t1 * T1 + t2 * T2 + sqrt(max(0.0, 1.0 - t1 * t1 - t2 * t2)) * Vh;\n\n\t\t\t\t// Section 3.4: Transform back to ellipsoid configuration\n\t\t\t\treturn normalize(vec3(alpha * Nh.x, alpha * Nh.y, max(0.0, Nh.z)));\n\t\t\t}\n\n\t\t\tvoid main() {\n\t\t\t\tvec3 N = normalize(vOutputDirection);\n\t\t\t\tvec3 V = N; // Assume view direction equals normal for pre-filtering\n\n\t\t\t\tvec3 prefilteredColor = vec3(0.0);\n\t\t\t\tfloat totalWeight = 0.0;\n\n\t\t\t\t// For very low roughness, just sample the environment directly\n\t\t\t\tif (roughness < 0.001) {\n\t\t\t\t\tgl_FragColor = vec4(bilinearCubeUV(envMap, N, mipInt), 1.0);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Tangent space basis for VNDF sampling\n\t\t\t\tvec3 up = abs(N.z) < 0.999 ? vec3(0.0, 0.0, 1.0) : vec3(1.0, 0.0, 0.0);\n\t\t\t\tvec3 tangent = normalize(cross(up, N));\n\t\t\t\tvec3 bitangent = cross(N, tangent);\n\n\t\t\t\tfor(uint i = 0u; i < uint(GGX_SAMPLES); i++) {\n\t\t\t\t\tvec2 Xi = hammersley(i, uint(GGX_SAMPLES));\n\n\t\t\t\t\t// For PMREM, V = N, so in tangent space V is always (0, 0, 1)\n\t\t\t\t\tvec3 H_tangent = importanceSampleGGX_VNDF(Xi, vec3(0.0, 0.0, 1.0), roughness);\n\n\t\t\t\t\t// Transform H back to world space\n\t\t\t\t\tvec3 H = normalize(tangent * H_tangent.x + bitangent * H_tangent.y + N * H_tangent.z);\n\t\t\t\t\tvec3 L = normalize(2.0 * dot(V, H) * H - V);\n\n\t\t\t\t\tfloat NdotL = max(dot(N, L), 0.0);\n\n\t\t\t\t\tif(NdotL > 0.0) {\n\t\t\t\t\t\t// Sample environment at fixed mip level\n\t\t\t\t\t\t// VNDF importance sampling handles the distribution filtering\n\t\t\t\t\t\tvec3 sampleColor = bilinearCubeUV(envMap, L, mipInt);\n\n\t\t\t\t\t\t// Weight by NdotL for the split-sum approximation\n\t\t\t\t\t\t// VNDF PDF naturally accounts for the visible microfacet distribution\n\t\t\t\t\t\tprefilteredColor += sampleColor * NdotL;\n\t\t\t\t\t\ttotalWeight += NdotL;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (totalWeight > 0.0) {\n\t\t\t\t\tprefilteredColor = prefilteredColor / totalWeight;\n\t\t\t\t}\n\n\t\t\t\tgl_FragColor = vec4(prefilteredColor, 1.0);\n\t\t\t}\n\t\t`,\n\n\t\tblending: NoBlending,\n\t\tdepthTest: false,\n\t\tdepthWrite: false\n\n\t} );\n\n\treturn shaderMaterial;\n\n}\n\nfunction _getBlurShader( lodMax, width, height ) {\n\n\tconst weights = new Float32Array( MAX_SAMPLES );\n\tconst poleAxis = new Vector3( 0, 1, 0 );\n\tconst shaderMaterial = new ShaderMaterial( {\n\n\t\tname: 'SphericalGaussianBlur',\n\n\t\tdefines: {\n\t\t\t'n': MAX_SAMPLES,\n\t\t\t'CUBEUV_TEXEL_WIDTH': 1.0 / width,\n\t\t\t'CUBEUV_TEXEL_HEIGHT': 1.0 / height,\n\t\t\t'CUBEUV_MAX_MIP': `${lodMax}.0`,\n\t\t},\n\n\t\tuniforms: {\n\t\t\t'envMap': { value: null },\n\t\t\t'samples': { value: 1 },\n\t\t\t'weights': { value: weights },\n\t\t\t'latitudinal': { value: false },\n\t\t\t'dTheta': { value: 0 },\n\t\t\t'mipInt': { value: 0 },\n\t\t\t'poleAxis': { value: poleAxis }\n\t\t},\n\n\t\tvertexShader: _getCommonVertexShader(),\n\n\t\tfragmentShader: /* glsl */`\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\t\t\tuniform int samples;\n\t\t\tuniform float weights[ n ];\n\t\t\tuniform bool latitudinal;\n\t\t\tuniform float dTheta;\n\t\t\tuniform float mipInt;\n\t\t\tuniform vec3 poleAxis;\n\n\t\t\t#define ENVMAP_TYPE_CUBE_UV\n\t\t\t#include <cube_uv_reflection_fragment>\n\n\t\t\tvec3 getSample( float theta, vec3 axis ) {\n\n\t\t\t\tfloat cosTheta = cos( theta );\n\t\t\t\t// Rodrigues' axis-angle rotation\n\t\t\t\tvec3 sampleDirection = vOutputDirection * cosTheta\n\t\t\t\t\t+ cross( axis, vOutputDirection ) * sin( theta )\n\t\t\t\t\t+ axis * dot( axis, vOutputDirection ) * ( 1.0 - cosTheta );\n\n\t\t\t\treturn bilinearCubeUV( envMap, sampleDirection, mipInt );\n\n\t\t\t}\n\n\t\t\tvoid main() {\n\n\t\t\t\tvec3 axis = latitudinal ? poleAxis : cross( poleAxis, vOutputDirection );\n\n\t\t\t\tif ( all( equal( axis, vec3( 0.0 ) ) ) ) {\n\n\t\t\t\t\taxis = vec3( vOutputDirection.z, 0.0, - vOutputDirection.x );\n\n\t\t\t\t}\n\n\t\t\t\taxis = normalize( axis );\n\n\t\t\t\tgl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\t\t\t\tgl_FragColor.rgb += weights[ 0 ] * getSample( 0.0, axis );\n\n\t\t\t\tfor ( int i = 1; i < n; i++ ) {\n\n\t\t\t\t\tif ( i >= samples ) {\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfloat theta = dTheta * float( i );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( -1.0 * theta, axis );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( theta, axis );\n\n\t\t\t\t}\n\n\t\t\t}\n\t\t`,\n\n\t\tblending: NoBlending,\n\t\tdepthTest: false,\n\t\tdepthWrite: false\n\n\t} );\n\n\treturn shaderMaterial;\n\n}\n\nfunction _getEquirectMaterial() {\n\n\treturn new ShaderMaterial( {\n\n\t\tname: 'EquirectangularToCubeUV',\n\n\t\tuniforms: {\n\t\t\t'envMap': { value: null }\n\t\t},\n\n\t\tvertexShader: _getCommonVertexShader(),\n\n\t\tfragmentShader: /* glsl */`\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\n\t\t\t#include <common>\n\n\t\t\tvoid main() {\n\n\t\t\t\tvec3 outputDirection = normalize( vOutputDirection );\n\t\t\t\tvec2 uv = equirectUv( outputDirection );\n\n\t\t\t\tgl_FragColor = vec4( texture2D ( envMap, uv ).rgb, 1.0 );\n\n\t\t\t}\n\t\t`,\n\n\t\tblending: NoBlending,\n\t\tdepthTest: false,\n\t\tdepthWrite: false\n\n\t} );\n\n}\n\nfunction _getCubemapMaterial() {\n\n\treturn new ShaderMaterial( {\n\n\t\tname: 'CubemapToCubeUV',\n\n\t\tuniforms: {\n\t\t\t'envMap': { value: null },\n\t\t\t'flipEnvMap': { value: -1 }\n\t\t},\n\n\t\tvertexShader: _getCommonVertexShader(),\n\n\t\tfragmentShader: /* glsl */`\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tuniform float flipEnvMap;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform samplerCube envMap;\n\n\t\t\tvoid main() {\n\n\t\t\t\tgl_FragColor = textureCube( envMap, vec3( flipEnvMap * vOutputDirection.x, vOutputDirection.yz ) );\n\n\t\t\t}\n\t\t`,\n\n\t\tblending: NoBlending,\n\t\tdepthTest: false,\n\t\tdepthWrite: false\n\n\t} );\n\n}\n\nfunction _getCommonVertexShader() {\n\n\treturn /* glsl */`\n\n\t\tprecision mediump float;\n\t\tprecision mediump int;\n\n\t\tattribute float faceIndex;\n\n\t\tvarying vec3 vOutputDirection;\n\n\t\t// RH coordinate system; PMREM face-indexing convention\n\t\tvec3 getDirection( vec2 uv, float face ) {\n\n\t\t\tuv = 2.0 * uv - 1.0;\n\n\t\t\tvec3 direction = vec3( uv, 1.0 );\n\n\t\t\tif ( face == 0.0 ) {\n\n\t\t\t\tdirection = direction.zyx; // ( 1, v, u ) pos x\n\n\t\t\t} else if ( face == 1.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xz *= -1.0; // ( -u, 1, -v ) pos y\n\n\t\t\t} else if ( face == 2.0 ) {\n\n\t\t\t\tdirection.x *= -1.0; // ( -u, v, 1 ) pos z\n\n\t\t\t} else if ( face == 3.0 ) {\n\n\t\t\t\tdirection = direction.zyx;\n\t\t\t\tdirection.xz *= -1.0; // ( -1, v, -u ) neg x\n\n\t\t\t} else if ( face == 4.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xy *= -1.0; // ( -u, -1, v ) neg y\n\n\t\t\t} else if ( face == 5.0 ) {\n\n\t\t\t\tdirection.z *= -1.0; // ( u, v, -1 ) neg z\n\n\t\t\t}\n\n\t\t\treturn direction;\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tvOutputDirection = getDirection( uv, faceIndex );\n\t\t\tgl_Position = vec4( position, 1.0 );\n\n\t\t}\n\t`;\n\n}\n\nfunction WebGLCubeUVMaps( renderer ) {\n\n\tlet cubeUVmaps = new WeakMap();\n\n\tlet pmremGenerator = null;\n\n\tfunction get( texture ) {\n\n\t\tif ( texture && texture.isTexture ) {\n\n\t\t\tconst mapping = texture.mapping;\n\n\t\t\tconst isEquirectMap = ( mapping === EquirectangularReflectionMapping || mapping === EquirectangularRefractionMapping );\n\t\t\tconst isCubeMap = ( mapping === CubeReflectionMapping || mapping === CubeRefractionMapping );\n\n\t\t\t// equirect/cube map to cubeUV conversion\n\n\t\t\tif ( isEquirectMap || isCubeMap ) {\n\n\t\t\t\tlet renderTarget = cubeUVmaps.get( texture );\n\n\t\t\t\tconst currentPMREMVersion = renderTarget !== undefined ? renderTarget.texture.pmremVersion : 0;\n\n\t\t\t\tif ( texture.isRenderTargetTexture && texture.pmremVersion !== currentPMREMVersion ) {\n\n\t\t\t\t\tif ( pmremGenerator === null ) pmremGenerator = new PMREMGenerator( renderer );\n\n\t\t\t\t\trenderTarget = isEquirectMap ? pmremGenerator.fromEquirectangular( texture, renderTarget ) : pmremGenerator.fromCubemap( texture, renderTarget );\n\t\t\t\t\trenderTarget.texture.pmremVersion = texture.pmremVersion;\n\n\t\t\t\t\tcubeUVmaps.set( texture, renderTarget );\n\n\t\t\t\t\treturn renderTarget.texture;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( renderTarget !== undefined ) {\n\n\t\t\t\t\t\treturn renderTarget.texture;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconst image = texture.image;\n\n\t\t\t\t\t\tif ( ( isEquirectMap && image && image.height > 0 ) || ( isCubeMap && image && isCubeTextureComplete( image ) ) ) {\n\n\t\t\t\t\t\t\tif ( pmremGenerator === null ) pmremGenerator = new PMREMGenerator( renderer );\n\n\t\t\t\t\t\t\trenderTarget = isEquirectMap ? pmremGenerator.fromEquirectangular( texture ) : pmremGenerator.fromCubemap( texture );\n\t\t\t\t\t\t\trenderTarget.texture.pmremVersion = texture.pmremVersion;\n\n\t\t\t\t\t\t\tcubeUVmaps.set( texture, renderTarget );\n\n\t\t\t\t\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t\t\t\t\t\treturn renderTarget.texture;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// image not yet ready. try the conversion next frame\n\n\t\t\t\t\t\t\treturn null;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\tfunction isCubeTextureComplete( image ) {\n\n\t\tlet count = 0;\n\t\tconst length = 6;\n\n\t\tfor ( let i = 0; i < length; i ++ ) {\n\n\t\t\tif ( image[ i ] !== undefined ) count ++;\n\n\t\t}\n\n\t\treturn count === length;\n\n\n\t}\n\n\tfunction onTextureDispose( event ) {\n\n\t\tconst texture = event.target;\n\n\t\ttexture.removeEventListener( 'dispose', onTextureDispose );\n\n\t\tconst cubemapUV = cubeUVmaps.get( texture );\n\n\t\tif ( cubemapUV !== undefined ) {\n\n\t\t\tcubeUVmaps.delete( texture );\n\t\t\tcubemapUV.dispose();\n\n\t\t}\n\n\t}\n\n\tfunction dispose() {\n\n\t\tcubeUVmaps = new WeakMap();\n\n\t\tif ( pmremGenerator !== null ) {\n\n\t\t\tpmremGenerator.dispose();\n\t\t\tpmremGenerator = null;\n\n\t\t}\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\nfunction WebGLExtensions( gl ) {\n\n\tconst extensions = {};\n\n\tfunction getExtension( name ) {\n\n\t\tif ( extensions[ name ] !== undefined ) {\n\n\t\t\treturn extensions[ name ];\n\n\t\t}\n\n\t\tconst extension = gl.getExtension( name );\n\n\t\textensions[ name ] = extension;\n\n\t\treturn extension;\n\n\t}\n\n\treturn {\n\n\t\thas: function ( name ) {\n\n\t\t\treturn getExtension( name ) !== null;\n\n\t\t},\n\n\t\tinit: function () {\n\n\t\t\tgetExtension( 'EXT_color_buffer_float' );\n\t\t\tgetExtension( 'WEBGL_clip_cull_distance' );\n\t\t\tgetExtension( 'OES_texture_float_linear' );\n\t\t\tgetExtension( 'EXT_color_buffer_half_float' );\n\t\t\tgetExtension( 'WEBGL_multisampled_render_to_texture' );\n\t\t\tgetExtension( 'WEBGL_render_shared_exponent' );\n\n\t\t},\n\n\t\tget: function ( name ) {\n\n\t\t\tconst extension = getExtension( name );\n\n\t\t\tif ( extension === null ) {\n\n\t\t\t\twarnOnce( 'WebGLRenderer: ' + name + ' extension not supported.' );\n\n\t\t\t}\n\n\t\t\treturn extension;\n\n\t\t}\n\n\t};\n\n}\n\nfunction WebGLGeometries( gl, attributes, info, bindingStates ) {\n\n\tconst geometries = {};\n\tconst wireframeAttributes = new WeakMap();\n\n\tfunction onGeometryDispose( event ) {\n\n\t\tconst geometry = event.target;\n\n\t\tif ( geometry.index !== null ) {\n\n\t\t\tattributes.remove( geometry.index );\n\n\t\t}\n\n\t\tfor ( const name in geometry.attributes ) {\n\n\t\t\tattributes.remove( geometry.attributes[ name ] );\n\n\t\t}\n\n\t\tgeometry.removeEventListener( 'dispose', onGeometryDispose );\n\n\t\tdelete geometries[ geometry.id ];\n\n\t\tconst attribute = wireframeAttributes.get( geometry );\n\n\t\tif ( attribute ) {\n\n\t\t\tattributes.remove( attribute );\n\t\t\twireframeAttributes.delete( geometry );\n\n\t\t}\n\n\t\tbindingStates.releaseStatesOfGeometry( geometry );\n\n\t\tif ( geometry.isInstancedBufferGeometry === true ) {\n\n\t\t\tdelete geometry._maxInstanceCount;\n\n\t\t}\n\n\t\t//\n\n\t\tinfo.memory.geometries --;\n\n\t}\n\n\tfunction get( object, geometry ) {\n\n\t\tif ( geometries[ geometry.id ] === true ) return geometry;\n\n\t\tgeometry.addEventListener( 'dispose', onGeometryDispose );\n\n\t\tgeometries[ geometry.id ] = true;\n\n\t\tinfo.memory.geometries ++;\n\n\t\treturn geometry;\n\n\t}\n\n\tfunction update( geometry ) {\n\n\t\tconst geometryAttributes = geometry.attributes;\n\n\t\t// Updating index buffer in VAO now. See WebGLBindingStates.\n\n\t\tfor ( const name in geometryAttributes ) {\n\n\t\t\tattributes.update( geometryAttributes[ name ], gl.ARRAY_BUFFER );\n\n\t\t}\n\n\t}\n\n\tfunction updateWireframeAttribute( geometry ) {\n\n\t\tconst indices = [];\n\n\t\tconst geometryIndex = geometry.index;\n\t\tconst geometryPosition = geometry.attributes.position;\n\t\tlet version = 0;\n\n\t\tif ( geometryIndex !== null ) {\n\n\t\t\tconst array = geometryIndex.array;\n\t\t\tversion = geometryIndex.version;\n\n\t\t\tfor ( let i = 0, l = array.length; i < l; i += 3 ) {\n\n\t\t\t\tconst a = array[ i + 0 ];\n\t\t\t\tconst b = array[ i + 1 ];\n\t\t\t\tconst c = array[ i + 2 ];\n\n\t\t\t\tindices.push( a, b, b, c, c, a );\n\n\t\t\t}\n\n\t\t} else if ( geometryPosition !== undefined ) {\n\n\t\t\tconst array = geometryPosition.array;\n\t\t\tversion = geometryPosition.version;\n\n\t\t\tfor ( let i = 0, l = ( array.length / 3 ) - 1; i < l; i += 3 ) {\n\n\t\t\t\tconst a = i + 0;\n\t\t\t\tconst b = i + 1;\n\t\t\t\tconst c = i + 2;\n\n\t\t\t\tindices.push( a, b, b, c, c, a );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst attribute = new ( arrayNeedsUint32( indices ) ? Uint32BufferAttribute : Uint16BufferAttribute )( indices, 1 );\n\t\tattribute.version = version;\n\n\t\t// Updating index buffer in VAO now. See WebGLBindingStates\n\n\t\t//\n\n\t\tconst previousAttribute = wireframeAttributes.get( geometry );\n\n\t\tif ( previousAttribute ) attributes.remove( previousAttribute );\n\n\t\t//\n\n\t\twireframeAttributes.set( geometry, attribute );\n\n\t}\n\n\tfunction getWireframeAttribute( geometry ) {\n\n\t\tconst currentAttribute = wireframeAttributes.get( geometry );\n\n\t\tif ( currentAttribute ) {\n\n\t\t\tconst geometryIndex = geometry.index;\n\n\t\t\tif ( geometryIndex !== null ) {\n\n\t\t\t\t// if the attribute is obsolete, create a new one\n\n\t\t\t\tif ( currentAttribute.version < geometryIndex.version ) {\n\n\t\t\t\t\tupdateWireframeAttribute( geometry );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tupdateWireframeAttribute( geometry );\n\n\t\t}\n\n\t\treturn wireframeAttributes.get( geometry );\n\n\t}\n\n\treturn {\n\n\t\tget: get,\n\t\tupdate: update,\n\n\t\tgetWireframeAttribute: getWireframeAttribute\n\n\t};\n\n}\n\nfunction WebGLIndexedBufferRenderer( gl, extensions, info ) {\n\n\tlet mode;\n\n\tfunction setMode( value ) {\n\n\t\tmode = value;\n\n\t}\n\n\tlet type, bytesPerElement;\n\n\tfunction setIndex( value ) {\n\n\t\ttype = value.type;\n\t\tbytesPerElement = value.bytesPerElement;\n\n\t}\n\n\tfunction render( start, count ) {\n\n\t\tgl.drawElements( mode, count, type, start * bytesPerElement );\n\n\t\tinfo.update( count, mode, 1 );\n\n\t}\n\n\tfunction renderInstances( start, count, primcount ) {\n\n\t\tif ( primcount === 0 ) return;\n\n\t\tgl.drawElementsInstanced( mode, count, type, start * bytesPerElement, primcount );\n\n\t\tinfo.update( count, mode, primcount );\n\n\t}\n\n\tfunction renderMultiDraw( starts, counts, drawCount ) {\n\n\t\tif ( drawCount === 0 ) return;\n\n\t\tconst extension = extensions.get( 'WEBGL_multi_draw' );\n\t\textension.multiDrawElementsWEBGL( mode, counts, 0, type, starts, 0, drawCount );\n\n\t\tlet elementCount = 0;\n\t\tfor ( let i = 0; i < drawCount; i ++ ) {\n\n\t\t\telementCount += counts[ i ];\n\n\t\t}\n\n\t\tinfo.update( elementCount, mode, 1 );\n\n\n\t}\n\n\tfunction renderMultiDrawInstances( starts, counts, drawCount, primcount ) {\n\n\t\tif ( drawCount === 0 ) return;\n\n\t\tconst extension = extensions.get( 'WEBGL_multi_draw' );\n\n\t\tif ( extension === null ) {\n\n\t\t\tfor ( let i = 0; i < starts.length; i ++ ) {\n\n\t\t\t\trenderInstances( starts[ i ] / bytesPerElement, counts[ i ], primcount[ i ] );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\textension.multiDrawElementsInstancedWEBGL( mode, counts, 0, type, starts, 0, primcount, 0, drawCount );\n\n\t\t\tlet elementCount = 0;\n\t\t\tfor ( let i = 0; i < drawCount; i ++ ) {\n\n\t\t\t\telementCount += counts[ i ] * primcount[ i ];\n\n\t\t\t}\n\n\t\t\tinfo.update( elementCount, mode, 1 );\n\n\t\t}\n\n\t}\n\n\t//\n\n\tthis.setMode = setMode;\n\tthis.setIndex = setIndex;\n\tthis.render = render;\n\tthis.renderInstances = renderInstances;\n\tthis.renderMultiDraw = renderMultiDraw;\n\tthis.renderMultiDrawInstances = renderMultiDrawInstances;\n\n}\n\nfunction WebGLInfo( gl ) {\n\n\tconst memory = {\n\t\tgeometries: 0,\n\t\ttextures: 0\n\t};\n\n\tconst render = {\n\t\tframe: 0,\n\t\tcalls: 0,\n\t\ttriangles: 0,\n\t\tpoints: 0,\n\t\tlines: 0\n\t};\n\n\tfunction update( count, mode, instanceCount ) {\n\n\t\trender.calls ++;\n\n\t\tswitch ( mode ) {\n\n\t\t\tcase gl.TRIANGLES:\n\t\t\t\trender.triangles += instanceCount * ( count / 3 );\n\t\t\t\tbreak;\n\n\t\t\tcase gl.LINES:\n\t\t\t\trender.lines += instanceCount * ( count / 2 );\n\t\t\t\tbreak;\n\n\t\t\tcase gl.LINE_STRIP:\n\t\t\t\trender.lines += instanceCount * ( count - 1 );\n\t\t\t\tbreak;\n\n\t\t\tcase gl.LINE_LOOP:\n\t\t\t\trender.lines += instanceCount * count;\n\t\t\t\tbreak;\n\n\t\t\tcase gl.POINTS:\n\t\t\t\trender.points += instanceCount * count;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\terror( 'WebGLInfo: Unknown draw mode:', mode );\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\tfunction reset() {\n\n\t\trender.calls = 0;\n\t\trender.triangles = 0;\n\t\trender.points = 0;\n\t\trender.lines = 0;\n\n\t}\n\n\treturn {\n\t\tmemory: memory,\n\t\trender: render,\n\t\tprograms: null,\n\t\tautoReset: true,\n\t\treset: reset,\n\t\tupdate: update\n\t};\n\n}\n\nfunction WebGLMorphtargets( gl, capabilities, textures ) {\n\n\tconst morphTextures = new WeakMap();\n\tconst morph = new Vector4();\n\n\tfunction update( object, geometry, program ) {\n\n\t\tconst objectInfluences = object.morphTargetInfluences;\n\n\t\t// the following encodes morph targets into an array of data textures. Each layer represents a single morph target.\n\n\t\tconst morphAttribute = geometry.morphAttributes.position || geometry.morphAttributes.normal || geometry.morphAttributes.color;\n\t\tconst morphTargetsCount = ( morphAttribute !== undefined ) ? morphAttribute.length : 0;\n\n\t\tlet entry = morphTextures.get( geometry );\n\n\t\tif ( entry === undefined || entry.count !== morphTargetsCount ) {\n\n\t\t\tif ( entry !== undefined ) entry.texture.dispose();\n\n\t\t\tconst hasMorphPosition = geometry.morphAttributes.position !== undefined;\n\t\t\tconst hasMorphNormals = geometry.morphAttributes.normal !== undefined;\n\t\t\tconst hasMorphColors = geometry.morphAttributes.color !== undefined;\n\n\t\t\tconst morphTargets = geometry.morphAttributes.position || [];\n\t\t\tconst morphNormals = geometry.morphAttributes.normal || [];\n\t\t\tconst morphColors = geometry.morphAttributes.color || [];\n\n\t\t\tlet vertexDataCount = 0;\n\n\t\t\tif ( hasMorphPosition === true ) vertexDataCount = 1;\n\t\t\tif ( hasMorphNormals === true ) vertexDataCount = 2;\n\t\t\tif ( hasMorphColors === true ) vertexDataCount = 3;\n\n\t\t\tlet width = geometry.attributes.position.count * vertexDataCount;\n\t\t\tlet height = 1;\n\n\t\t\tif ( width > capabilities.maxTextureSize ) {\n\n\t\t\t\theight = Math.ceil( width / capabilities.maxTextureSize );\n\t\t\t\twidth = capabilities.maxTextureSize;\n\n\t\t\t}\n\n\t\t\tconst buffer = new Float32Array( width * height * 4 * morphTargetsCount );\n\n\t\t\tconst texture = new DataArrayTexture( buffer, width, height, morphTargetsCount );\n\t\t\ttexture.type = FloatType;\n\t\t\ttexture.needsUpdate = true;\n\n\t\t\t// fill buffer\n\n\t\t\tconst vertexDataStride = vertexDataCount * 4;\n\n\t\t\tfor ( let i = 0; i < morphTargetsCount; i ++ ) {\n\n\t\t\t\tconst morphTarget = morphTargets[ i ];\n\t\t\t\tconst morphNormal = morphNormals[ i ];\n\t\t\t\tconst morphColor = morphColors[ i ];\n\n\t\t\t\tconst offset = width * height * 4 * i;\n\n\t\t\t\tfor ( let j = 0; j < morphTarget.count; j ++ ) {\n\n\t\t\t\t\tconst stride = j * vertexDataStride;\n\n\t\t\t\t\tif ( hasMorphPosition === true ) {\n\n\t\t\t\t\t\tmorph.fromBufferAttribute( morphTarget, j );\n\n\t\t\t\t\t\tbuffer[ offset + stride + 0 ] = morph.x;\n\t\t\t\t\t\tbuffer[ offset + stride + 1 ] = morph.y;\n\t\t\t\t\t\tbuffer[ offset + stride + 2 ] = morph.z;\n\t\t\t\t\t\tbuffer[ offset + stride + 3 ] = 0;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( hasMorphNormals === true ) {\n\n\t\t\t\t\t\tmorph.fromBufferAttribute( morphNormal, j );\n\n\t\t\t\t\t\tbuffer[ offset + stride + 4 ] = morph.x;\n\t\t\t\t\t\tbuffer[ offset + stride + 5 ] = morph.y;\n\t\t\t\t\t\tbuffer[ offset + stride + 6 ] = morph.z;\n\t\t\t\t\t\tbuffer[ offset + stride + 7 ] = 0;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( hasMorphColors === true ) {\n\n\t\t\t\t\t\tmorph.fromBufferAttribute( morphColor, j );\n\n\t\t\t\t\t\tbuffer[ offset + stride + 8 ] = morph.x;\n\t\t\t\t\t\tbuffer[ offset + stride + 9 ] = morph.y;\n\t\t\t\t\t\tbuffer[ offset + stride + 10 ] = morph.z;\n\t\t\t\t\t\tbuffer[ offset + stride + 11 ] = ( morphColor.itemSize === 4 ) ? morph.w : 1;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tentry = {\n\t\t\t\tcount: morphTargetsCount,\n\t\t\t\ttexture: texture,\n\t\t\t\tsize: new Vector2( width, height )\n\t\t\t};\n\n\t\t\tmorphTextures.set( geometry, entry );\n\n\t\t\tfunction disposeTexture() {\n\n\t\t\t\ttexture.dispose();\n\n\t\t\t\tmorphTextures.delete( geometry );\n\n\t\t\t\tgeometry.removeEventListener( 'dispose', disposeTexture );\n\n\t\t\t}\n\n\t\t\tgeometry.addEventListener( 'dispose', disposeTexture );\n\n\t\t}\n\n\t\t//\n\t\tif ( object.isInstancedMesh === true && object.morphTexture !== null ) {\n\n\t\t\tprogram.getUniforms().setValue( gl, 'morphTexture', object.morphTexture, textures );\n\n\t\t} else {\n\n\t\t\tlet morphInfluencesSum = 0;\n\n\t\t\tfor ( let i = 0; i < objectInfluences.length; i ++ ) {\n\n\t\t\t\tmorphInfluencesSum += objectInfluences[ i ];\n\n\t\t\t}\n\n\t\t\tconst morphBaseInfluence = geometry.morphTargetsRelative ? 1 : 1 - morphInfluencesSum;\n\n\n\t\t\tprogram.getUniforms().setValue( gl, 'morphTargetBaseInfluence', morphBaseInfluence );\n\t\t\tprogram.getUniforms().setValue( gl, 'morphTargetInfluences', objectInfluences );\n\n\t\t}\n\n\t\tprogram.getUniforms().setValue( gl, 'morphTargetsTexture', entry.texture, textures );\n\t\tprogram.getUniforms().setValue( gl, 'morphTargetsTextureSize', entry.size );\n\n\t}\n\n\treturn {\n\n\t\tupdate: update\n\n\t};\n\n}\n\nfunction WebGLObjects( gl, geometries, attributes, info ) {\n\n\tlet updateMap = new WeakMap();\n\n\tfunction update( object ) {\n\n\t\tconst frame = info.render.frame;\n\n\t\tconst geometry = object.geometry;\n\t\tconst buffergeometry = geometries.get( object, geometry );\n\n\t\t// Update once per frame\n\n\t\tif ( updateMap.get( buffergeometry ) !== frame ) {\n\n\t\t\tgeometries.update( buffergeometry );\n\n\t\t\tupdateMap.set( buffergeometry, frame );\n\n\t\t}\n\n\t\tif ( object.isInstancedMesh ) {\n\n\t\t\tif ( object.hasEventListener( 'dispose', onInstancedMeshDispose ) === false ) {\n\n\t\t\t\tobject.addEventListener( 'dispose', onInstancedMeshDispose );\n\n\t\t\t}\n\n\t\t\tif ( updateMap.get( object ) !== frame ) {\n\n\t\t\t\tattributes.update( object.instanceMatrix, gl.ARRAY_BUFFER );\n\n\t\t\t\tif ( object.instanceColor !== null ) {\n\n\t\t\t\t\tattributes.update( object.instanceColor, gl.ARRAY_BUFFER );\n\n\t\t\t\t}\n\n\t\t\t\tupdateMap.set( object, frame );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( object.isSkinnedMesh ) {\n\n\t\t\tconst skeleton = object.skeleton;\n\n\t\t\tif ( updateMap.get( skeleton ) !== frame ) {\n\n\t\t\t\tskeleton.update();\n\n\t\t\t\tupdateMap.set( skeleton, frame );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn buffergeometry;\n\n\t}\n\n\tfunction dispose() {\n\n\t\tupdateMap = new WeakMap();\n\n\t}\n\n\tfunction onInstancedMeshDispose( event ) {\n\n\t\tconst instancedMesh = event.target;\n\n\t\tinstancedMesh.removeEventListener( 'dispose', onInstancedMeshDispose );\n\n\t\tattributes.remove( instancedMesh.instanceMatrix );\n\n\t\tif ( instancedMesh.instanceColor !== null ) attributes.remove( instancedMesh.instanceColor );\n\n\t}\n\n\treturn {\n\n\t\tupdate: update,\n\t\tdispose: dispose\n\n\t};\n\n}\n\n/**\n * Uniforms of a program.\n * Those form a tree structure with a special top-level container for the root,\n * which you get by calling 'new WebGLUniforms( gl, program )'.\n *\n *\n * Properties of inner nodes including the top-level container:\n *\n * .seq - array of nested uniforms\n * .map - nested uniforms by name\n *\n *\n * Methods of all nodes except the top-level container:\n *\n * .setValue( gl, value, [textures] )\n *\n * \t\tuploads a uniform value(s)\n *  \tthe 'textures' parameter is needed for sampler uniforms\n *\n *\n * Static methods of the top-level container (textures factorizations):\n *\n * .upload( gl, seq, values, textures )\n *\n * \t\tsets uniforms in 'seq' to 'values[id].value'\n *\n * .seqWithValue( seq, values ) : filteredSeq\n *\n * \t\tfilters 'seq' entries with corresponding entry in values\n *\n *\n * Methods of the top-level container (textures factorizations):\n *\n * .setValue( gl, name, value, textures )\n *\n * \t\tsets uniform with  name 'name' to 'value'\n *\n * .setOptional( gl, obj, prop )\n *\n * \t\tlike .set for an optional property of the object\n *\n */\n\n\nconst emptyTexture = /*@__PURE__*/ new Texture();\n\nconst emptyShadowTexture = /*@__PURE__*/ new DepthTexture( 1, 1 );\n\nconst emptyArrayTexture = /*@__PURE__*/ new DataArrayTexture();\nconst empty3dTexture = /*@__PURE__*/ new Data3DTexture();\nconst emptyCubeTexture = /*@__PURE__*/ new CubeTexture();\n\n// --- Utilities ---\n\n// Array Caches (provide typed arrays for temporary by size)\n\nconst arrayCacheF32 = [];\nconst arrayCacheI32 = [];\n\n// Float32Array caches used for uploading Matrix uniforms\n\nconst mat4array = new Float32Array( 16 );\nconst mat3array = new Float32Array( 9 );\nconst mat2array = new Float32Array( 4 );\n\n// Flattening for arrays of vectors and matrices\n\nfunction flatten( array, nBlocks, blockSize ) {\n\n\tconst firstElem = array[ 0 ];\n\n\tif ( firstElem <= 0 || firstElem > 0 ) return array;\n\t// unoptimized: ! isNaN( firstElem )\n\t// see http://jacksondunstan.com/articles/983\n\n\tconst n = nBlocks * blockSize;\n\tlet r = arrayCacheF32[ n ];\n\n\tif ( r === undefined ) {\n\n\t\tr = new Float32Array( n );\n\t\tarrayCacheF32[ n ] = r;\n\n\t}\n\n\tif ( nBlocks !== 0 ) {\n\n\t\tfirstElem.toArray( r, 0 );\n\n\t\tfor ( let i = 1, offset = 0; i !== nBlocks; ++ i ) {\n\n\t\t\toffset += blockSize;\n\t\t\tarray[ i ].toArray( r, offset );\n\n\t\t}\n\n\t}\n\n\treturn r;\n\n}\n\nfunction arraysEqual( a, b ) {\n\n\tif ( a.length !== b.length ) return false;\n\n\tfor ( let i = 0, l = a.length; i < l; i ++ ) {\n\n\t\tif ( a[ i ] !== b[ i ] ) return false;\n\n\t}\n\n\treturn true;\n\n}\n\nfunction copyArray( a, b ) {\n\n\tfor ( let i = 0, l = b.length; i < l; i ++ ) {\n\n\t\ta[ i ] = b[ i ];\n\n\t}\n\n}\n\n// Texture unit allocation\n\nfunction allocTexUnits( textures, n ) {\n\n\tlet r = arrayCacheI32[ n ];\n\n\tif ( r === undefined ) {\n\n\t\tr = new Int32Array( n );\n\t\tarrayCacheI32[ n ] = r;\n\n\t}\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\tr[ i ] = textures.allocateTextureUnit();\n\n\t}\n\n\treturn r;\n\n}\n\n// --- Setters ---\n\n// Note: Defining these methods externally, because they come in a bunch\n// and this way their names minify.\n\n// Single scalar\n\nfunction setValueV1f( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( cache[ 0 ] === v ) return;\n\n\tgl.uniform1f( this.addr, v );\n\n\tcache[ 0 ] = v;\n\n}\n\n// Single float vector (from flat array or THREE.VectorN)\n\nfunction setValueV2f( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y ) {\n\n\t\t\tgl.uniform2f( this.addr, v.x, v.y );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform2fv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV3f( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z ) {\n\n\t\t\tgl.uniform3f( this.addr, v.x, v.y, v.z );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\n\t\t}\n\n\t} else if ( v.r !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.r || cache[ 1 ] !== v.g || cache[ 2 ] !== v.b ) {\n\n\t\t\tgl.uniform3f( this.addr, v.r, v.g, v.b );\n\n\t\t\tcache[ 0 ] = v.r;\n\t\t\tcache[ 1 ] = v.g;\n\t\t\tcache[ 2 ] = v.b;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform3fv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV4f( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z || cache[ 3 ] !== v.w ) {\n\n\t\t\tgl.uniform4f( this.addr, v.x, v.y, v.z, v.w );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\t\t\tcache[ 3 ] = v.w;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform4fv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\n// Single matrix (from flat array or THREE.MatrixN)\n\nfunction setValueM2( gl, v ) {\n\n\tconst cache = this.cache;\n\tconst elements = v.elements;\n\n\tif ( elements === undefined ) {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniformMatrix2fv( this.addr, false, v );\n\n\t\tcopyArray( cache, v );\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, elements ) ) return;\n\n\t\tmat2array.set( elements );\n\n\t\tgl.uniformMatrix2fv( this.addr, false, mat2array );\n\n\t\tcopyArray( cache, elements );\n\n\t}\n\n}\n\nfunction setValueM3( gl, v ) {\n\n\tconst cache = this.cache;\n\tconst elements = v.elements;\n\n\tif ( elements === undefined ) {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniformMatrix3fv( this.addr, false, v );\n\n\t\tcopyArray( cache, v );\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, elements ) ) return;\n\n\t\tmat3array.set( elements );\n\n\t\tgl.uniformMatrix3fv( this.addr, false, mat3array );\n\n\t\tcopyArray( cache, elements );\n\n\t}\n\n}\n\nfunction setValueM4( gl, v ) {\n\n\tconst cache = this.cache;\n\tconst elements = v.elements;\n\n\tif ( elements === undefined ) {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniformMatrix4fv( this.addr, false, v );\n\n\t\tcopyArray( cache, v );\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, elements ) ) return;\n\n\t\tmat4array.set( elements );\n\n\t\tgl.uniformMatrix4fv( this.addr, false, mat4array );\n\n\t\tcopyArray( cache, elements );\n\n\t}\n\n}\n\n// Single integer / boolean\n\nfunction setValueV1i( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( cache[ 0 ] === v ) return;\n\n\tgl.uniform1i( this.addr, v );\n\n\tcache[ 0 ] = v;\n\n}\n\n// Single integer / boolean vector (from flat array or THREE.VectorN)\n\nfunction setValueV2i( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y ) {\n\n\t\t\tgl.uniform2i( this.addr, v.x, v.y );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform2iv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV3i( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z ) {\n\n\t\t\tgl.uniform3i( this.addr, v.x, v.y, v.z );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform3iv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV4i( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z || cache[ 3 ] !== v.w ) {\n\n\t\t\tgl.uniform4i( this.addr, v.x, v.y, v.z, v.w );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\t\t\tcache[ 3 ] = v.w;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform4iv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\n// Single unsigned integer\n\nfunction setValueV1ui( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( cache[ 0 ] === v ) return;\n\n\tgl.uniform1ui( this.addr, v );\n\n\tcache[ 0 ] = v;\n\n}\n\n// Single unsigned integer vector (from flat array or THREE.VectorN)\n\nfunction setValueV2ui( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y ) {\n\n\t\t\tgl.uniform2ui( this.addr, v.x, v.y );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform2uiv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV3ui( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z ) {\n\n\t\t\tgl.uniform3ui( this.addr, v.x, v.y, v.z );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform3uiv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV4ui( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z || cache[ 3 ] !== v.w ) {\n\n\t\t\tgl.uniform4ui( this.addr, v.x, v.y, v.z, v.w );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\t\t\tcache[ 3 ] = v.w;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform4uiv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\n\n// Single texture (2D / Cube)\n\nfunction setValueT1( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\tconst unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\tlet emptyTexture2D;\n\n\tif ( this.type === gl.SAMPLER_2D_SHADOW ) {\n\n\t\temptyShadowTexture.compareFunction = LessEqualCompare; // #28670\n\t\temptyTexture2D = emptyShadowTexture;\n\n\t} else {\n\n\t\temptyTexture2D = emptyTexture;\n\n\t}\n\n\ttextures.setTexture2D( v || emptyTexture2D, unit );\n\n}\n\nfunction setValueT3D1( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\tconst unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\ttextures.setTexture3D( v || empty3dTexture, unit );\n\n}\n\nfunction setValueT6( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\tconst unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\ttextures.setTextureCube( v || emptyCubeTexture, unit );\n\n}\n\nfunction setValueT2DArray1( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\tconst unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\ttextures.setTexture2DArray( v || emptyArrayTexture, unit );\n\n}\n\n// Helper to pick the right setter for the singular case\n\nfunction getSingularSetter( type ) {\n\n\tswitch ( type ) {\n\n\t\tcase 0x1406: return setValueV1f; // FLOAT\n\t\tcase 0x8b50: return setValueV2f; // _VEC2\n\t\tcase 0x8b51: return setValueV3f; // _VEC3\n\t\tcase 0x8b52: return setValueV4f; // _VEC4\n\n\t\tcase 0x8b5a: return setValueM2; // _MAT2\n\t\tcase 0x8b5b: return setValueM3; // _MAT3\n\t\tcase 0x8b5c: return setValueM4; // _MAT4\n\n\t\tcase 0x1404: case 0x8b56: return setValueV1i; // INT, BOOL\n\t\tcase 0x8b53: case 0x8b57: return setValueV2i; // _VEC2\n\t\tcase 0x8b54: case 0x8b58: return setValueV3i; // _VEC3\n\t\tcase 0x8b55: case 0x8b59: return setValueV4i; // _VEC4\n\n\t\tcase 0x1405: return setValueV1ui; // UINT\n\t\tcase 0x8dc6: return setValueV2ui; // _VEC2\n\t\tcase 0x8dc7: return setValueV3ui; // _VEC3\n\t\tcase 0x8dc8: return setValueV4ui; // _VEC4\n\n\t\tcase 0x8b5e: // SAMPLER_2D\n\t\tcase 0x8d66: // SAMPLER_EXTERNAL_OES\n\t\tcase 0x8dca: // INT_SAMPLER_2D\n\t\tcase 0x8dd2: // UNSIGNED_INT_SAMPLER_2D\n\t\tcase 0x8b62: // SAMPLER_2D_SHADOW\n\t\t\treturn setValueT1;\n\n\t\tcase 0x8b5f: // SAMPLER_3D\n\t\tcase 0x8dcb: // INT_SAMPLER_3D\n\t\tcase 0x8dd3: // UNSIGNED_INT_SAMPLER_3D\n\t\t\treturn setValueT3D1;\n\n\t\tcase 0x8b60: // SAMPLER_CUBE\n\t\tcase 0x8dcc: // INT_SAMPLER_CUBE\n\t\tcase 0x8dd4: // UNSIGNED_INT_SAMPLER_CUBE\n\t\tcase 0x8dc5: // SAMPLER_CUBE_SHADOW\n\t\t\treturn setValueT6;\n\n\t\tcase 0x8dc1: // SAMPLER_2D_ARRAY\n\t\tcase 0x8dcf: // INT_SAMPLER_2D_ARRAY\n\t\tcase 0x8dd7: // UNSIGNED_INT_SAMPLER_2D_ARRAY\n\t\tcase 0x8dc4: // SAMPLER_2D_ARRAY_SHADOW\n\t\t\treturn setValueT2DArray1;\n\n\t}\n\n}\n\n\n// Array of scalars\n\nfunction setValueV1fArray( gl, v ) {\n\n\tgl.uniform1fv( this.addr, v );\n\n}\n\n// Array of vectors (from flat array or array of THREE.VectorN)\n\nfunction setValueV2fArray( gl, v ) {\n\n\tconst data = flatten( v, this.size, 2 );\n\n\tgl.uniform2fv( this.addr, data );\n\n}\n\nfunction setValueV3fArray( gl, v ) {\n\n\tconst data = flatten( v, this.size, 3 );\n\n\tgl.uniform3fv( this.addr, data );\n\n}\n\nfunction setValueV4fArray( gl, v ) {\n\n\tconst data = flatten( v, this.size, 4 );\n\n\tgl.uniform4fv( this.addr, data );\n\n}\n\n// Array of matrices (from flat array or array of THREE.MatrixN)\n\nfunction setValueM2Array( gl, v ) {\n\n\tconst data = flatten( v, this.size, 4 );\n\n\tgl.uniformMatrix2fv( this.addr, false, data );\n\n}\n\nfunction setValueM3Array( gl, v ) {\n\n\tconst data = flatten( v, this.size, 9 );\n\n\tgl.uniformMatrix3fv( this.addr, false, data );\n\n}\n\nfunction setValueM4Array( gl, v ) {\n\n\tconst data = flatten( v, this.size, 16 );\n\n\tgl.uniformMatrix4fv( this.addr, false, data );\n\n}\n\n// Array of integer / boolean\n\nfunction setValueV1iArray( gl, v ) {\n\n\tgl.uniform1iv( this.addr, v );\n\n}\n\n// Array of integer / boolean vectors (from flat array)\n\nfunction setValueV2iArray( gl, v ) {\n\n\tgl.uniform2iv( this.addr, v );\n\n}\n\nfunction setValueV3iArray( gl, v ) {\n\n\tgl.uniform3iv( this.addr, v );\n\n}\n\nfunction setValueV4iArray( gl, v ) {\n\n\tgl.uniform4iv( this.addr, v );\n\n}\n\n// Array of unsigned integer\n\nfunction setValueV1uiArray( gl, v ) {\n\n\tgl.uniform1uiv( this.addr, v );\n\n}\n\n// Array of unsigned integer vectors (from flat array)\n\nfunction setValueV2uiArray( gl, v ) {\n\n\tgl.uniform2uiv( this.addr, v );\n\n}\n\nfunction setValueV3uiArray( gl, v ) {\n\n\tgl.uniform3uiv( this.addr, v );\n\n}\n\nfunction setValueV4uiArray( gl, v ) {\n\n\tgl.uniform4uiv( this.addr, v );\n\n}\n\n\n// Array of textures (2D / 3D / Cube / 2DArray)\n\nfunction setValueT1Array( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\n\tconst n = v.length;\n\n\tconst units = allocTexUnits( textures, n );\n\n\tif ( ! arraysEqual( cache, units ) ) {\n\n\t\tgl.uniform1iv( this.addr, units );\n\n\t\tcopyArray( cache, units );\n\n\t}\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\ttextures.setTexture2D( v[ i ] || emptyTexture, units[ i ] );\n\n\t}\n\n}\n\nfunction setValueT3DArray( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\n\tconst n = v.length;\n\n\tconst units = allocTexUnits( textures, n );\n\n\tif ( ! arraysEqual( cache, units ) ) {\n\n\t\tgl.uniform1iv( this.addr, units );\n\n\t\tcopyArray( cache, units );\n\n\t}\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\ttextures.setTexture3D( v[ i ] || empty3dTexture, units[ i ] );\n\n\t}\n\n}\n\nfunction setValueT6Array( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\n\tconst n = v.length;\n\n\tconst units = allocTexUnits( textures, n );\n\n\tif ( ! arraysEqual( cache, units ) ) {\n\n\t\tgl.uniform1iv( this.addr, units );\n\n\t\tcopyArray( cache, units );\n\n\t}\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\ttextures.setTextureCube( v[ i ] || emptyCubeTexture, units[ i ] );\n\n\t}\n\n}\n\nfunction setValueT2DArrayArray( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\n\tconst n = v.length;\n\n\tconst units = allocTexUnits( textures, n );\n\n\tif ( ! arraysEqual( cache, units ) ) {\n\n\t\tgl.uniform1iv( this.addr, units );\n\n\t\tcopyArray( cache, units );\n\n\t}\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\ttextures.setTexture2DArray( v[ i ] || emptyArrayTexture, units[ i ] );\n\n\t}\n\n}\n\n\n// Helper to pick the right setter for a pure (bottom-level) array\n\nfunction getPureArraySetter( type ) {\n\n\tswitch ( type ) {\n\n\t\tcase 0x1406: return setValueV1fArray; // FLOAT\n\t\tcase 0x8b50: return setValueV2fArray; // _VEC2\n\t\tcase 0x8b51: return setValueV3fArray; // _VEC3\n\t\tcase 0x8b52: return setValueV4fArray; // _VEC4\n\n\t\tcase 0x8b5a: return setValueM2Array; // _MAT2\n\t\tcase 0x8b5b: return setValueM3Array; // _MAT3\n\t\tcase 0x8b5c: return setValueM4Array; // _MAT4\n\n\t\tcase 0x1404: case 0x8b56: return setValueV1iArray; // INT, BOOL\n\t\tcase 0x8b53: case 0x8b57: return setValueV2iArray; // _VEC2\n\t\tcase 0x8b54: case 0x8b58: return setValueV3iArray; // _VEC3\n\t\tcase 0x8b55: case 0x8b59: return setValueV4iArray; // _VEC4\n\n\t\tcase 0x1405: return setValueV1uiArray; // UINT\n\t\tcase 0x8dc6: return setValueV2uiArray; // _VEC2\n\t\tcase 0x8dc7: return setValueV3uiArray; // _VEC3\n\t\tcase 0x8dc8: return setValueV4uiArray; // _VEC4\n\n\t\tcase 0x8b5e: // SAMPLER_2D\n\t\tcase 0x8d66: // SAMPLER_EXTERNAL_OES\n\t\tcase 0x8dca: // INT_SAMPLER_2D\n\t\tcase 0x8dd2: // UNSIGNED_INT_SAMPLER_2D\n\t\tcase 0x8b62: // SAMPLER_2D_SHADOW\n\t\t\treturn setValueT1Array;\n\n\t\tcase 0x8b5f: // SAMPLER_3D\n\t\tcase 0x8dcb: // INT_SAMPLER_3D\n\t\tcase 0x8dd3: // UNSIGNED_INT_SAMPLER_3D\n\t\t\treturn setValueT3DArray;\n\n\t\tcase 0x8b60: // SAMPLER_CUBE\n\t\tcase 0x8dcc: // INT_SAMPLER_CUBE\n\t\tcase 0x8dd4: // UNSIGNED_INT_SAMPLER_CUBE\n\t\tcase 0x8dc5: // SAMPLER_CUBE_SHADOW\n\t\t\treturn setValueT6Array;\n\n\t\tcase 0x8dc1: // SAMPLER_2D_ARRAY\n\t\tcase 0x8dcf: // INT_SAMPLER_2D_ARRAY\n\t\tcase 0x8dd7: // UNSIGNED_INT_SAMPLER_2D_ARRAY\n\t\tcase 0x8dc4: // SAMPLER_2D_ARRAY_SHADOW\n\t\t\treturn setValueT2DArrayArray;\n\n\t}\n\n}\n\n// --- Uniform Classes ---\n\nclass SingleUniform {\n\n\tconstructor( id, activeInfo, addr ) {\n\n\t\tthis.id = id;\n\t\tthis.addr = addr;\n\t\tthis.cache = [];\n\t\tthis.type = activeInfo.type;\n\t\tthis.setValue = getSingularSetter( activeInfo.type );\n\n\t\t// this.path = activeInfo.name; // DEBUG\n\n\t}\n\n}\n\nclass PureArrayUniform {\n\n\tconstructor( id, activeInfo, addr ) {\n\n\t\tthis.id = id;\n\t\tthis.addr = addr;\n\t\tthis.cache = [];\n\t\tthis.type = activeInfo.type;\n\t\tthis.size = activeInfo.size;\n\t\tthis.setValue = getPureArraySetter( activeInfo.type );\n\n\t\t// this.path = activeInfo.name; // DEBUG\n\n\t}\n\n}\n\nclass StructuredUniform {\n\n\tconstructor( id ) {\n\n\t\tthis.id = id;\n\n\t\tthis.seq = [];\n\t\tthis.map = {};\n\n\t}\n\n\tsetValue( gl, value, textures ) {\n\n\t\tconst seq = this.seq;\n\n\t\tfor ( let i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\t\tconst u = seq[ i ];\n\t\t\tu.setValue( gl, value[ u.id ], textures );\n\n\t\t}\n\n\t}\n\n}\n\n// --- Top-level ---\n\n// Parser - builds up the property tree from the path strings\n\nconst RePathPart = /(\\w+)(\\])?(\\[|\\.)?/g;\n\n// extracts\n// \t- the identifier (member name or array index)\n//  - followed by an optional right bracket (found when array index)\n//  - followed by an optional left bracket or dot (type of subscript)\n//\n// Note: These portions can be read in a non-overlapping fashion and\n// allow straightforward parsing of the hierarchy that WebGL encodes\n// in the uniform names.\n\nfunction addUniform( container, uniformObject ) {\n\n\tcontainer.seq.push( uniformObject );\n\tcontainer.map[ uniformObject.id ] = uniformObject;\n\n}\n\nfunction parseUniform( activeInfo, addr, container ) {\n\n\tconst path = activeInfo.name,\n\t\tpathLength = path.length;\n\n\t// reset RegExp object, because of the early exit of a previous run\n\tRePathPart.lastIndex = 0;\n\n\twhile ( true ) {\n\n\t\tconst match = RePathPart.exec( path ),\n\t\t\tmatchEnd = RePathPart.lastIndex;\n\n\t\tlet id = match[ 1 ];\n\t\tconst idIsIndex = match[ 2 ] === ']',\n\t\t\tsubscript = match[ 3 ];\n\n\t\tif ( idIsIndex ) id = id | 0; // convert to integer\n\n\t\tif ( subscript === undefined || subscript === '[' && matchEnd + 2 === pathLength ) {\n\n\t\t\t// bare name or \"pure\" bottom-level array \"[0]\" suffix\n\n\t\t\taddUniform( container, subscript === undefined ?\n\t\t\t\tnew SingleUniform( id, activeInfo, addr ) :\n\t\t\t\tnew PureArrayUniform( id, activeInfo, addr ) );\n\n\t\t\tbreak;\n\n\t\t} else {\n\n\t\t\t// step into inner node / create it in case it doesn't exist\n\n\t\t\tconst map = container.map;\n\t\t\tlet next = map[ id ];\n\n\t\t\tif ( next === undefined ) {\n\n\t\t\t\tnext = new StructuredUniform( id );\n\t\t\t\taddUniform( container, next );\n\n\t\t\t}\n\n\t\t\tcontainer = next;\n\n\t\t}\n\n\t}\n\n}\n\n// Root Container\n\nclass WebGLUniforms {\n\n\tconstructor( gl, program ) {\n\n\t\tthis.seq = [];\n\t\tthis.map = {};\n\n\t\tconst n = gl.getProgramParameter( program, gl.ACTIVE_UNIFORMS );\n\n\t\tfor ( let i = 0; i < n; ++ i ) {\n\n\t\t\tconst info = gl.getActiveUniform( program, i ),\n\t\t\t\taddr = gl.getUniformLocation( program, info.name );\n\n\t\t\tparseUniform( info, addr, this );\n\n\t\t}\n\n\t}\n\n\tsetValue( gl, name, value, textures ) {\n\n\t\tconst u = this.map[ name ];\n\n\t\tif ( u !== undefined ) u.setValue( gl, value, textures );\n\n\t}\n\n\tsetOptional( gl, object, name ) {\n\n\t\tconst v = object[ name ];\n\n\t\tif ( v !== undefined ) this.setValue( gl, name, v );\n\n\t}\n\n\tstatic upload( gl, seq, values, textures ) {\n\n\t\tfor ( let i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\t\tconst u = seq[ i ],\n\t\t\t\tv = values[ u.id ];\n\n\t\t\tif ( v.needsUpdate !== false ) {\n\n\t\t\t\t// note: always updating when .needsUpdate is undefined\n\t\t\t\tu.setValue( gl, v.value, textures );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tstatic seqWithValue( seq, values ) {\n\n\t\tconst r = [];\n\n\t\tfor ( let i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\t\tconst u = seq[ i ];\n\t\t\tif ( u.id in values ) r.push( u );\n\n\t\t}\n\n\t\treturn r;\n\n\t}\n\n}\n\nfunction WebGLShader( gl, type, string ) {\n\n\tconst shader = gl.createShader( type );\n\n\tgl.shaderSource( shader, string );\n\tgl.compileShader( shader );\n\n\treturn shader;\n\n}\n\n// From https://www.khronos.org/registry/webgl/extensions/KHR_parallel_shader_compile/\nconst COMPLETION_STATUS_KHR = 0x91B1;\n\nlet programIdCount = 0;\n\nfunction handleSource( string, errorLine ) {\n\n\tconst lines = string.split( '\\n' );\n\tconst lines2 = [];\n\n\tconst from = Math.max( errorLine - 6, 0 );\n\tconst to = Math.min( errorLine + 6, lines.length );\n\n\tfor ( let i = from; i < to; i ++ ) {\n\n\t\tconst line = i + 1;\n\t\tlines2.push( `${line === errorLine ? '>' : ' '} ${line}: ${lines[ i ]}` );\n\n\t}\n\n\treturn lines2.join( '\\n' );\n\n}\n\nconst _m0 = /*@__PURE__*/ new Matrix3();\n\nfunction getEncodingComponents( colorSpace ) {\n\n\tColorManagement._getMatrix( _m0, ColorManagement.workingColorSpace, colorSpace );\n\n\tconst encodingMatrix = `mat3( ${ _m0.elements.map( ( v ) => v.toFixed( 4 ) ) } )`;\n\n\tswitch ( ColorManagement.getTransfer( colorSpace ) ) {\n\n\t\tcase LinearTransfer:\n\t\t\treturn [ encodingMatrix, 'LinearTransferOETF' ];\n\n\t\tcase SRGBTransfer:\n\t\t\treturn [ encodingMatrix, 'sRGBTransferOETF' ];\n\n\t\tdefault:\n\t\t\twarn( 'WebGLProgram: Unsupported color space: ', colorSpace );\n\t\t\treturn [ encodingMatrix, 'LinearTransferOETF' ];\n\n\t}\n\n}\n\nfunction getShaderErrors( gl, shader, type ) {\n\n\tconst status = gl.getShaderParameter( shader, gl.COMPILE_STATUS );\n\n\tconst shaderInfoLog = gl.getShaderInfoLog( shader ) || '';\n\tconst errors = shaderInfoLog.trim();\n\n\tif ( status && errors === '' ) return '';\n\n\tconst errorMatches = /ERROR: 0:(\\d+)/.exec( errors );\n\tif ( errorMatches ) {\n\n\t\t// --enable-privileged-webgl-extension\n\t\t// log( '**' + type + '**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( shader ) );\n\n\t\tconst errorLine = parseInt( errorMatches[ 1 ] );\n\t\treturn type.toUpperCase() + '\\n\\n' + errors + '\\n\\n' + handleSource( gl.getShaderSource( shader ), errorLine );\n\n\t} else {\n\n\t\treturn errors;\n\n\t}\n\n}\n\nfunction getTexelEncodingFunction( functionName, colorSpace ) {\n\n\tconst components = getEncodingComponents( colorSpace );\n\n\treturn [\n\n\t\t`vec4 ${functionName}( vec4 value ) {`,\n\n\t\t`\treturn ${components[ 1 ]}( vec4( value.rgb * ${components[ 0 ]}, value.a ) );`,\n\n\t\t'}',\n\n\t].join( '\\n' );\n\n}\n\nfunction getToneMappingFunction( functionName, toneMapping ) {\n\n\tlet toneMappingName;\n\n\tswitch ( toneMapping ) {\n\n\t\tcase LinearToneMapping:\n\t\t\ttoneMappingName = 'Linear';\n\t\t\tbreak;\n\n\t\tcase ReinhardToneMapping:\n\t\t\ttoneMappingName = 'Reinhard';\n\t\t\tbreak;\n\n\t\tcase CineonToneMapping:\n\t\t\ttoneMappingName = 'Cineon';\n\t\t\tbreak;\n\n\t\tcase ACESFilmicToneMapping:\n\t\t\ttoneMappingName = 'ACESFilmic';\n\t\t\tbreak;\n\n\t\tcase AgXToneMapping:\n\t\t\ttoneMappingName = 'AgX';\n\t\t\tbreak;\n\n\t\tcase NeutralToneMapping:\n\t\t\ttoneMappingName = 'Neutral';\n\t\t\tbreak;\n\n\t\tcase CustomToneMapping:\n\t\t\ttoneMappingName = 'Custom';\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\twarn( 'WebGLProgram: Unsupported toneMapping:', toneMapping );\n\t\t\ttoneMappingName = 'Linear';\n\n\t}\n\n\treturn 'vec3 ' + functionName + '( vec3 color ) { return ' + toneMappingName + 'ToneMapping( color ); }';\n\n}\n\nconst _v0 = /*@__PURE__*/ new Vector3();\n\nfunction getLuminanceFunction() {\n\n\tColorManagement.getLuminanceCoefficients( _v0 );\n\n\tconst r = _v0.x.toFixed( 4 );\n\tconst g = _v0.y.toFixed( 4 );\n\tconst b = _v0.z.toFixed( 4 );\n\n\treturn [\n\n\t\t'float luminance( const in vec3 rgb ) {',\n\n\t\t`\tconst vec3 weights = vec3( ${ r }, ${ g }, ${ b } );`,\n\n\t\t'\treturn dot( weights, rgb );',\n\n\t\t'}'\n\n\t].join( '\\n' );\n\n}\n\nfunction generateVertexExtensions( parameters ) {\n\n\tconst chunks = [\n\t\tparameters.extensionClipCullDistance ? '#extension GL_ANGLE_clip_cull_distance : require' : '',\n\t\tparameters.extensionMultiDraw ? '#extension GL_ANGLE_multi_draw : require' : '',\n\t];\n\n\treturn chunks.filter( filterEmptyLine ).join( '\\n' );\n\n}\n\nfunction generateDefines( defines ) {\n\n\tconst chunks = [];\n\n\tfor ( const name in defines ) {\n\n\t\tconst value = defines[ name ];\n\n\t\tif ( value === false ) continue;\n\n\t\tchunks.push( '#define ' + name + ' ' + value );\n\n\t}\n\n\treturn chunks.join( '\\n' );\n\n}\n\nfunction fetchAttributeLocations( gl, program ) {\n\n\tconst attributes = {};\n\n\tconst n = gl.getProgramParameter( program, gl.ACTIVE_ATTRIBUTES );\n\n\tfor ( let i = 0; i < n; i ++ ) {\n\n\t\tconst info = gl.getActiveAttrib( program, i );\n\t\tconst name = info.name;\n\n\t\tlet locationSize = 1;\n\t\tif ( info.type === gl.FLOAT_MAT2 ) locationSize = 2;\n\t\tif ( info.type === gl.FLOAT_MAT3 ) locationSize = 3;\n\t\tif ( info.type === gl.FLOAT_MAT4 ) locationSize = 4;\n\n\t\t// log( 'WebGLProgram: ACTIVE VERTEX ATTRIBUTE:', name, i );\n\n\t\tattributes[ name ] = {\n\t\t\ttype: info.type,\n\t\t\tlocation: gl.getAttribLocation( program, name ),\n\t\t\tlocationSize: locationSize\n\t\t};\n\n\t}\n\n\treturn attributes;\n\n}\n\nfunction filterEmptyLine( string ) {\n\n\treturn string !== '';\n\n}\n\nfunction replaceLightNums( string, parameters ) {\n\n\tconst numSpotLightCoords = parameters.numSpotLightShadows + parameters.numSpotLightMaps - parameters.numSpotLightShadowsWithMaps;\n\n\treturn string\n\t\t.replace( /NUM_DIR_LIGHTS/g, parameters.numDirLights )\n\t\t.replace( /NUM_SPOT_LIGHTS/g, parameters.numSpotLights )\n\t\t.replace( /NUM_SPOT_LIGHT_MAPS/g, parameters.numSpotLightMaps )\n\t\t.replace( /NUM_SPOT_LIGHT_COORDS/g, numSpotLightCoords )\n\t\t.replace( /NUM_RECT_AREA_LIGHTS/g, parameters.numRectAreaLights )\n\t\t.replace( /NUM_POINT_LIGHTS/g, parameters.numPointLights )\n\t\t.replace( /NUM_HEMI_LIGHTS/g, parameters.numHemiLights )\n\t\t.replace( /NUM_DIR_LIGHT_SHADOWS/g, parameters.numDirLightShadows )\n\t\t.replace( /NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS/g, parameters.numSpotLightShadowsWithMaps )\n\t\t.replace( /NUM_SPOT_LIGHT_SHADOWS/g, parameters.numSpotLightShadows )\n\t\t.replace( /NUM_POINT_LIGHT_SHADOWS/g, parameters.numPointLightShadows );\n\n}\n\nfunction replaceClippingPlaneNums( string, parameters ) {\n\n\treturn string\n\t\t.replace( /NUM_CLIPPING_PLANES/g, parameters.numClippingPlanes )\n\t\t.replace( /UNION_CLIPPING_PLANES/g, ( parameters.numClippingPlanes - parameters.numClipIntersection ) );\n\n}\n\n// Resolve Includes\n\nconst includePattern = /^[ \\t]*#include +<([\\w\\d./]+)>/gm;\n\nfunction resolveIncludes( string ) {\n\n\treturn string.replace( includePattern, includeReplacer );\n\n}\n\nconst shaderChunkMap = new Map();\n\nfunction includeReplacer( match, include ) {\n\n\tlet string = ShaderChunk[ include ];\n\n\tif ( string === undefined ) {\n\n\t\tconst newInclude = shaderChunkMap.get( include );\n\n\t\tif ( newInclude !== undefined ) {\n\n\t\t\tstring = ShaderChunk[ newInclude ];\n\t\t\twarn( 'WebGLRenderer: Shader chunk \"%s\" has been deprecated. Use \"%s\" instead.', include, newInclude );\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'Can not resolve #include <' + include + '>' );\n\n\t\t}\n\n\t}\n\n\treturn resolveIncludes( string );\n\n}\n\n// Unroll Loops\n\nconst unrollLoopPattern = /#pragma unroll_loop_start\\s+for\\s*\\(\\s*int\\s+i\\s*=\\s*(\\d+)\\s*;\\s*i\\s*<\\s*(\\d+)\\s*;\\s*i\\s*\\+\\+\\s*\\)\\s*{([\\s\\S]+?)}\\s+#pragma unroll_loop_end/g;\n\nfunction unrollLoops( string ) {\n\n\treturn string.replace( unrollLoopPattern, loopReplacer );\n\n}\n\nfunction loopReplacer( match, start, end, snippet ) {\n\n\tlet string = '';\n\n\tfor ( let i = parseInt( start ); i < parseInt( end ); i ++ ) {\n\n\t\tstring += snippet\n\t\t\t.replace( /\\[\\s*i\\s*\\]/g, '[ ' + i + ' ]' )\n\t\t\t.replace( /UNROLLED_LOOP_INDEX/g, i );\n\n\t}\n\n\treturn string;\n\n}\n\n//\n\nfunction generatePrecision( parameters ) {\n\n\tlet precisionstring = `precision ${parameters.precision} float;\n\tprecision ${parameters.precision} int;\n\tprecision ${parameters.precision} sampler2D;\n\tprecision ${parameters.precision} samplerCube;\n\tprecision ${parameters.precision} sampler3D;\n\tprecision ${parameters.precision} sampler2DArray;\n\tprecision ${parameters.precision} sampler2DShadow;\n\tprecision ${parameters.precision} samplerCubeShadow;\n\tprecision ${parameters.precision} sampler2DArrayShadow;\n\tprecision ${parameters.precision} isampler2D;\n\tprecision ${parameters.precision} isampler3D;\n\tprecision ${parameters.precision} isamplerCube;\n\tprecision ${parameters.precision} isampler2DArray;\n\tprecision ${parameters.precision} usampler2D;\n\tprecision ${parameters.precision} usampler3D;\n\tprecision ${parameters.precision} usamplerCube;\n\tprecision ${parameters.precision} usampler2DArray;\n\t`;\n\n\tif ( parameters.precision === 'highp' ) {\n\n\t\tprecisionstring += '\\n#define HIGH_PRECISION';\n\n\t} else if ( parameters.precision === 'mediump' ) {\n\n\t\tprecisionstring += '\\n#define MEDIUM_PRECISION';\n\n\t} else if ( parameters.precision === 'lowp' ) {\n\n\t\tprecisionstring += '\\n#define LOW_PRECISION';\n\n\t}\n\n\treturn precisionstring;\n\n}\n\nfunction generateShadowMapTypeDefine( parameters ) {\n\n\tlet shadowMapTypeDefine = 'SHADOWMAP_TYPE_BASIC';\n\n\tif ( parameters.shadowMapType === PCFShadowMap ) {\n\n\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF';\n\n\t} else if ( parameters.shadowMapType === PCFSoftShadowMap ) {\n\n\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF_SOFT';\n\n\t} else if ( parameters.shadowMapType === VSMShadowMap ) {\n\n\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_VSM';\n\n\t}\n\n\treturn shadowMapTypeDefine;\n\n}\n\nfunction generateEnvMapTypeDefine( parameters ) {\n\n\tlet envMapTypeDefine = 'ENVMAP_TYPE_CUBE';\n\n\tif ( parameters.envMap ) {\n\n\t\tswitch ( parameters.envMapMode ) {\n\n\t\t\tcase CubeReflectionMapping:\n\t\t\tcase CubeRefractionMapping:\n\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_CUBE';\n\t\t\t\tbreak;\n\n\t\t\tcase CubeUVReflectionMapping:\n\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_CUBE_UV';\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\treturn envMapTypeDefine;\n\n}\n\nfunction generateEnvMapModeDefine( parameters ) {\n\n\tlet envMapModeDefine = 'ENVMAP_MODE_REFLECTION';\n\n\tif ( parameters.envMap ) {\n\n\t\tswitch ( parameters.envMapMode ) {\n\n\t\t\tcase CubeRefractionMapping:\n\n\t\t\t\tenvMapModeDefine = 'ENVMAP_MODE_REFRACTION';\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\treturn envMapModeDefine;\n\n}\n\nfunction generateEnvMapBlendingDefine( parameters ) {\n\n\tlet envMapBlendingDefine = 'ENVMAP_BLENDING_NONE';\n\n\tif ( parameters.envMap ) {\n\n\t\tswitch ( parameters.combine ) {\n\n\t\t\tcase MultiplyOperation:\n\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY';\n\t\t\t\tbreak;\n\n\t\t\tcase MixOperation:\n\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_MIX';\n\t\t\t\tbreak;\n\n\t\t\tcase AddOperation:\n\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_ADD';\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\treturn envMapBlendingDefine;\n\n}\n\nfunction generateCubeUVSize( parameters ) {\n\n\tconst imageHeight = parameters.envMapCubeUVHeight;\n\n\tif ( imageHeight === null ) return null;\n\n\tconst maxMip = Math.log2( imageHeight ) - 2;\n\n\tconst texelHeight = 1.0 / imageHeight;\n\n\tconst texelWidth = 1.0 / ( 3 * Math.max( Math.pow( 2, maxMip ), 7 * 16 ) );\n\n\treturn { texelWidth, texelHeight, maxMip };\n\n}\n\nfunction WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {\n\n\t// TODO Send this event to Three.js DevTools\n\t// log( 'WebGLProgram', cacheKey );\n\n\tconst gl = renderer.getContext();\n\n\tconst defines = parameters.defines;\n\n\tlet vertexShader = parameters.vertexShader;\n\tlet fragmentShader = parameters.fragmentShader;\n\n\tconst shadowMapTypeDefine = generateShadowMapTypeDefine( parameters );\n\tconst envMapTypeDefine = generateEnvMapTypeDefine( parameters );\n\tconst envMapModeDefine = generateEnvMapModeDefine( parameters );\n\tconst envMapBlendingDefine = generateEnvMapBlendingDefine( parameters );\n\tconst envMapCubeUVSize = generateCubeUVSize( parameters );\n\n\tconst customVertexExtensions = generateVertexExtensions( parameters );\n\n\tconst customDefines = generateDefines( defines );\n\n\tconst program = gl.createProgram();\n\n\tlet prefixVertex, prefixFragment;\n\tlet versionString = parameters.glslVersion ? '#version ' + parameters.glslVersion + '\\n' : '';\n\n\tif ( parameters.isRawShaderMaterial ) {\n\n\t\tprefixVertex = [\n\n\t\t\t'#define SHADER_TYPE ' + parameters.shaderType,\n\t\t\t'#define SHADER_NAME ' + parameters.shaderName,\n\n\t\t\tcustomDefines\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\tif ( prefixVertex.length > 0 ) {\n\n\t\t\tprefixVertex += '\\n';\n\n\t\t}\n\n\t\tprefixFragment = [\n\n\t\t\t'#define SHADER_TYPE ' + parameters.shaderType,\n\t\t\t'#define SHADER_NAME ' + parameters.shaderName,\n\n\t\t\tcustomDefines\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\tif ( prefixFragment.length > 0 ) {\n\n\t\t\tprefixFragment += '\\n';\n\n\t\t}\n\n\t} else {\n\n\t\tprefixVertex = [\n\n\t\t\tgeneratePrecision( parameters ),\n\n\t\t\t'#define SHADER_TYPE ' + parameters.shaderType,\n\t\t\t'#define SHADER_NAME ' + parameters.shaderName,\n\n\t\t\tcustomDefines,\n\n\t\t\tparameters.extensionClipCullDistance ? '#define USE_CLIP_DISTANCE' : '',\n\t\t\tparameters.batching ? '#define USE_BATCHING' : '',\n\t\t\tparameters.batchingColor ? '#define USE_BATCHING_COLOR' : '',\n\t\t\tparameters.instancing ? '#define USE_INSTANCING' : '',\n\t\t\tparameters.instancingColor ? '#define USE_INSTANCING_COLOR' : '',\n\t\t\tparameters.instancingMorph ? '#define USE_INSTANCING_MORPH' : '',\n\n\t\t\tparameters.useFog && parameters.fog ? '#define USE_FOG' : '',\n\t\t\tparameters.useFog && parameters.fogExp2 ? '#define FOG_EXP2' : '',\n\n\t\t\tparameters.map ? '#define USE_MAP' : '',\n\t\t\tparameters.envMap ? '#define USE_ENVMAP' : '',\n\t\t\tparameters.envMap ? '#define ' + envMapModeDefine : '',\n\t\t\tparameters.lightMap ? '#define USE_LIGHTMAP' : '',\n\t\t\tparameters.aoMap ? '#define USE_AOMAP' : '',\n\t\t\tparameters.bumpMap ? '#define USE_BUMPMAP' : '',\n\t\t\tparameters.normalMap ? '#define USE_NORMALMAP' : '',\n\t\t\tparameters.normalMapObjectSpace ? '#define USE_NORMALMAP_OBJECTSPACE' : '',\n\t\t\tparameters.normalMapTangentSpace ? '#define USE_NORMALMAP_TANGENTSPACE' : '',\n\t\t\tparameters.displacementMap ? '#define USE_DISPLACEMENTMAP' : '',\n\t\t\tparameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',\n\n\t\t\tparameters.anisotropy ? '#define USE_ANISOTROPY' : '',\n\t\t\tparameters.anisotropyMap ? '#define USE_ANISOTROPYMAP' : '',\n\n\t\t\tparameters.clearcoatMap ? '#define USE_CLEARCOATMAP' : '',\n\t\t\tparameters.clearcoatRoughnessMap ? '#define USE_CLEARCOAT_ROUGHNESSMAP' : '',\n\t\t\tparameters.clearcoatNormalMap ? '#define USE_CLEARCOAT_NORMALMAP' : '',\n\n\t\t\tparameters.iridescenceMap ? '#define USE_IRIDESCENCEMAP' : '',\n\t\t\tparameters.iridescenceThicknessMap ? '#define USE_IRIDESCENCE_THICKNESSMAP' : '',\n\n\t\t\tparameters.specularMap ? '#define USE_SPECULARMAP' : '',\n\t\t\tparameters.specularColorMap ? '#define USE_SPECULAR_COLORMAP' : '',\n\t\t\tparameters.specularIntensityMap ? '#define USE_SPECULAR_INTENSITYMAP' : '',\n\n\t\t\tparameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',\n\t\t\tparameters.metalnessMap ? '#define USE_METALNESSMAP' : '',\n\t\t\tparameters.alphaMap ? '#define USE_ALPHAMAP' : '',\n\t\t\tparameters.alphaHash ? '#define USE_ALPHAHASH' : '',\n\n\t\t\tparameters.transmission ? '#define USE_TRANSMISSION' : '',\n\t\t\tparameters.transmissionMap ? '#define USE_TRANSMISSIONMAP' : '',\n\t\t\tparameters.thicknessMap ? '#define USE_THICKNESSMAP' : '',\n\n\t\t\tparameters.sheenColorMap ? '#define USE_SHEEN_COLORMAP' : '',\n\t\t\tparameters.sheenRoughnessMap ? '#define USE_SHEEN_ROUGHNESSMAP' : '',\n\n\t\t\t//\n\n\t\t\tparameters.mapUv ? '#define MAP_UV ' + parameters.mapUv : '',\n\t\t\tparameters.alphaMapUv ? '#define ALPHAMAP_UV ' + parameters.alphaMapUv : '',\n\t\t\tparameters.lightMapUv ? '#define LIGHTMAP_UV ' + parameters.lightMapUv : '',\n\t\t\tparameters.aoMapUv ? '#define AOMAP_UV ' + parameters.aoMapUv : '',\n\t\t\tparameters.emissiveMapUv ? '#define EMISSIVEMAP_UV ' + parameters.emissiveMapUv : '',\n\t\t\tparameters.bumpMapUv ? '#define BUMPMAP_UV ' + parameters.bumpMapUv : '',\n\t\t\tparameters.normalMapUv ? '#define NORMALMAP_UV ' + parameters.normalMapUv : '',\n\t\t\tparameters.displacementMapUv ? '#define DISPLACEMENTMAP_UV ' + parameters.displacementMapUv : '',\n\n\t\t\tparameters.metalnessMapUv ? '#define METALNESSMAP_UV ' + parameters.metalnessMapUv : '',\n\t\t\tparameters.roughnessMapUv ? '#define ROUGHNESSMAP_UV ' + parameters.roughnessMapUv : '',\n\n\t\t\tparameters.anisotropyMapUv ? '#define ANISOTROPYMAP_UV ' + parameters.anisotropyMapUv : '',\n\n\t\t\tparameters.clearcoatMapUv ? '#define CLEARCOATMAP_UV ' + parameters.clearcoatMapUv : '',\n\t\t\tparameters.clearcoatNormalMapUv ? '#define CLEARCOAT_NORMALMAP_UV ' + parameters.clearcoatNormalMapUv : '',\n\t\t\tparameters.clearcoatRoughnessMapUv ? '#define CLEARCOAT_ROUGHNESSMAP_UV ' + parameters.clearcoatRoughnessMapUv : '',\n\n\t\t\tparameters.iridescenceMapUv ? '#define IRIDESCENCEMAP_UV ' + parameters.iridescenceMapUv : '',\n\t\t\tparameters.iridescenceThicknessMapUv ? '#define IRIDESCENCE_THICKNESSMAP_UV ' + parameters.iridescenceThicknessMapUv : '',\n\n\t\t\tparameters.sheenColorMapUv ? '#define SHEEN_COLORMAP_UV ' + parameters.sheenColorMapUv : '',\n\t\t\tparameters.sheenRoughnessMapUv ? '#define SHEEN_ROUGHNESSMAP_UV ' + parameters.sheenRoughnessMapUv : '',\n\n\t\t\tparameters.specularMapUv ? '#define SPECULARMAP_UV ' + parameters.specularMapUv : '',\n\t\t\tparameters.specularColorMapUv ? '#define SPECULAR_COLORMAP_UV ' + parameters.specularColorMapUv : '',\n\t\t\tparameters.specularIntensityMapUv ? '#define SPECULAR_INTENSITYMAP_UV ' + parameters.specularIntensityMapUv : '',\n\n\t\t\tparameters.transmissionMapUv ? '#define TRANSMISSIONMAP_UV ' + parameters.transmissionMapUv : '',\n\t\t\tparameters.thicknessMapUv ? '#define THICKNESSMAP_UV ' + parameters.thicknessMapUv : '',\n\n\t\t\t//\n\n\t\t\tparameters.vertexTangents && parameters.flatShading === false ? '#define USE_TANGENT' : '',\n\t\t\tparameters.vertexColors ? '#define USE_COLOR' : '',\n\t\t\tparameters.vertexAlphas ? '#define USE_COLOR_ALPHA' : '',\n\t\t\tparameters.vertexUv1s ? '#define USE_UV1' : '',\n\t\t\tparameters.vertexUv2s ? '#define USE_UV2' : '',\n\t\t\tparameters.vertexUv3s ? '#define USE_UV3' : '',\n\n\t\t\tparameters.pointsUvs ? '#define USE_POINTS_UV' : '',\n\n\t\t\tparameters.flatShading ? '#define FLAT_SHADED' : '',\n\n\t\t\tparameters.skinning ? '#define USE_SKINNING' : '',\n\n\t\t\tparameters.morphTargets ? '#define USE_MORPHTARGETS' : '',\n\t\t\tparameters.morphNormals && parameters.flatShading === false ? '#define USE_MORPHNORMALS' : '',\n\t\t\t( parameters.morphColors ) ? '#define USE_MORPHCOLORS' : '',\n\t\t\t( parameters.morphTargetsCount > 0 ) ? '#define MORPHTARGETS_TEXTURE_STRIDE ' + parameters.morphTextureStride : '',\n\t\t\t( parameters.morphTargetsCount > 0 ) ? '#define MORPHTARGETS_COUNT ' + parameters.morphTargetsCount : '',\n\t\t\tparameters.doubleSided ? '#define DOUBLE_SIDED' : '',\n\t\t\tparameters.flipSided ? '#define FLIP_SIDED' : '',\n\n\t\t\tparameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',\n\t\t\tparameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',\n\n\t\t\tparameters.sizeAttenuation ? '#define USE_SIZEATTENUATION' : '',\n\n\t\t\tparameters.numLightProbes > 0 ? '#define USE_LIGHT_PROBES' : '',\n\n\t\t\tparameters.logarithmicDepthBuffer ? '#define USE_LOGARITHMIC_DEPTH_BUFFER' : '',\n\t\t\tparameters.reversedDepthBuffer ? '#define USE_REVERSED_DEPTH_BUFFER' : '',\n\n\t\t\t'uniform mat4 modelMatrix;',\n\t\t\t'uniform mat4 modelViewMatrix;',\n\t\t\t'uniform mat4 projectionMatrix;',\n\t\t\t'uniform mat4 viewMatrix;',\n\t\t\t'uniform mat3 normalMatrix;',\n\t\t\t'uniform vec3 cameraPosition;',\n\t\t\t'uniform bool isOrthographic;',\n\n\t\t\t'#ifdef USE_INSTANCING',\n\n\t\t\t'\tattribute mat4 instanceMatrix;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_INSTANCING_COLOR',\n\n\t\t\t'\tattribute vec3 instanceColor;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_INSTANCING_MORPH',\n\n\t\t\t'\tuniform sampler2D morphTexture;',\n\n\t\t\t'#endif',\n\n\t\t\t'attribute vec3 position;',\n\t\t\t'attribute vec3 normal;',\n\t\t\t'attribute vec2 uv;',\n\n\t\t\t'#ifdef USE_UV1',\n\n\t\t\t'\tattribute vec2 uv1;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_UV2',\n\n\t\t\t'\tattribute vec2 uv2;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_UV3',\n\n\t\t\t'\tattribute vec2 uv3;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_TANGENT',\n\n\t\t\t'\tattribute vec4 tangent;',\n\n\t\t\t'#endif',\n\n\t\t\t'#if defined( USE_COLOR_ALPHA )',\n\n\t\t\t'\tattribute vec4 color;',\n\n\t\t\t'#elif defined( USE_COLOR )',\n\n\t\t\t'\tattribute vec3 color;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_SKINNING',\n\n\t\t\t'\tattribute vec4 skinIndex;',\n\t\t\t'\tattribute vec4 skinWeight;',\n\n\t\t\t'#endif',\n\n\t\t\t'\\n'\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\tprefixFragment = [\n\n\t\t\tgeneratePrecision( parameters ),\n\n\t\t\t'#define SHADER_TYPE ' + parameters.shaderType,\n\t\t\t'#define SHADER_NAME ' + parameters.shaderName,\n\n\t\t\tcustomDefines,\n\n\t\t\tparameters.useFog && parameters.fog ? '#define USE_FOG' : '',\n\t\t\tparameters.useFog && parameters.fogExp2 ? '#define FOG_EXP2' : '',\n\n\t\t\tparameters.alphaToCoverage ? '#define ALPHA_TO_COVERAGE' : '',\n\t\t\tparameters.map ? '#define USE_MAP' : '',\n\t\t\tparameters.matcap ? '#define USE_MATCAP' : '',\n\t\t\tparameters.envMap ? '#define USE_ENVMAP' : '',\n\t\t\tparameters.envMap ? '#define ' + envMapTypeDefine : '',\n\t\t\tparameters.envMap ? '#define ' + envMapModeDefine : '',\n\t\t\tparameters.envMap ? '#define ' + envMapBlendingDefine : '',\n\t\t\tenvMapCubeUVSize ? '#define CUBEUV_TEXEL_WIDTH ' + envMapCubeUVSize.texelWidth : '',\n\t\t\tenvMapCubeUVSize ? '#define CUBEUV_TEXEL_HEIGHT ' + envMapCubeUVSize.texelHeight : '',\n\t\t\tenvMapCubeUVSize ? '#define CUBEUV_MAX_MIP ' + envMapCubeUVSize.maxMip + '.0' : '',\n\t\t\tparameters.lightMap ? '#define USE_LIGHTMAP' : '',\n\t\t\tparameters.aoMap ? '#define USE_AOMAP' : '',\n\t\t\tparameters.bumpMap ? '#define USE_BUMPMAP' : '',\n\t\t\tparameters.normalMap ? '#define USE_NORMALMAP' : '',\n\t\t\tparameters.normalMapObjectSpace ? '#define USE_NORMALMAP_OBJECTSPACE' : '',\n\t\t\tparameters.normalMapTangentSpace ? '#define USE_NORMALMAP_TANGENTSPACE' : '',\n\t\t\tparameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',\n\n\t\t\tparameters.anisotropy ? '#define USE_ANISOTROPY' : '',\n\t\t\tparameters.anisotropyMap ? '#define USE_ANISOTROPYMAP' : '',\n\n\t\t\tparameters.clearcoat ? '#define USE_CLEARCOAT' : '',\n\t\t\tparameters.clearcoatMap ? '#define USE_CLEARCOATMAP' : '',\n\t\t\tparameters.clearcoatRoughnessMap ? '#define USE_CLEARCOAT_ROUGHNESSMAP' : '',\n\t\t\tparameters.clearcoatNormalMap ? '#define USE_CLEARCOAT_NORMALMAP' : '',\n\n\t\t\tparameters.dispersion ? '#define USE_DISPERSION' : '',\n\n\t\t\tparameters.iridescence ? '#define USE_IRIDESCENCE' : '',\n\t\t\tparameters.iridescenceMap ? '#define USE_IRIDESCENCEMAP' : '',\n\t\t\tparameters.iridescenceThicknessMap ? '#define USE_IRIDESCENCE_THICKNESSMAP' : '',\n\n\t\t\tparameters.specularMap ? '#define USE_SPECULARMAP' : '',\n\t\t\tparameters.specularColorMap ? '#define USE_SPECULAR_COLORMAP' : '',\n\t\t\tparameters.specularIntensityMap ? '#define USE_SPECULAR_INTENSITYMAP' : '',\n\n\t\t\tparameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',\n\t\t\tparameters.metalnessMap ? '#define USE_METALNESSMAP' : '',\n\n\t\t\tparameters.alphaMap ? '#define USE_ALPHAMAP' : '',\n\t\t\tparameters.alphaTest ? '#define USE_ALPHATEST' : '',\n\t\t\tparameters.alphaHash ? '#define USE_ALPHAHASH' : '',\n\n\t\t\tparameters.sheen ? '#define USE_SHEEN' : '',\n\t\t\tparameters.sheenColorMap ? '#define USE_SHEEN_COLORMAP' : '',\n\t\t\tparameters.sheenRoughnessMap ? '#define USE_SHEEN_ROUGHNESSMAP' : '',\n\n\t\t\tparameters.transmission ? '#define USE_TRANSMISSION' : '',\n\t\t\tparameters.transmissionMap ? '#define USE_TRANSMISSIONMAP' : '',\n\t\t\tparameters.thicknessMap ? '#define USE_THICKNESSMAP' : '',\n\n\t\t\tparameters.vertexTangents && parameters.flatShading === false ? '#define USE_TANGENT' : '',\n\t\t\tparameters.vertexColors || parameters.instancingColor || parameters.batchingColor ? '#define USE_COLOR' : '',\n\t\t\tparameters.vertexAlphas ? '#define USE_COLOR_ALPHA' : '',\n\t\t\tparameters.vertexUv1s ? '#define USE_UV1' : '',\n\t\t\tparameters.vertexUv2s ? '#define USE_UV2' : '',\n\t\t\tparameters.vertexUv3s ? '#define USE_UV3' : '',\n\n\t\t\tparameters.pointsUvs ? '#define USE_POINTS_UV' : '',\n\n\t\t\tparameters.gradientMap ? '#define USE_GRADIENTMAP' : '',\n\n\t\t\tparameters.flatShading ? '#define FLAT_SHADED' : '',\n\n\t\t\tparameters.doubleSided ? '#define DOUBLE_SIDED' : '',\n\t\t\tparameters.flipSided ? '#define FLIP_SIDED' : '',\n\n\t\t\tparameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',\n\t\t\tparameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',\n\n\t\t\tparameters.premultipliedAlpha ? '#define PREMULTIPLIED_ALPHA' : '',\n\n\t\t\tparameters.numLightProbes > 0 ? '#define USE_LIGHT_PROBES' : '',\n\n\t\t\tparameters.decodeVideoTexture ? '#define DECODE_VIDEO_TEXTURE' : '',\n\t\t\tparameters.decodeVideoTextureEmissive ? '#define DECODE_VIDEO_TEXTURE_EMISSIVE' : '',\n\n\t\t\tparameters.logarithmicDepthBuffer ? '#define USE_LOGARITHMIC_DEPTH_BUFFER' : '',\n\t\t\tparameters.reversedDepthBuffer ? '#define USE_REVERSED_DEPTH_BUFFER' : '',\n\n\t\t\t'uniform mat4 viewMatrix;',\n\t\t\t'uniform vec3 cameraPosition;',\n\t\t\t'uniform bool isOrthographic;',\n\n\t\t\t( parameters.toneMapping !== NoToneMapping ) ? '#define TONE_MAPPING' : '',\n\t\t\t( parameters.toneMapping !== NoToneMapping ) ? ShaderChunk[ 'tonemapping_pars_fragment' ] : '', // this code is required here because it is used by the toneMapping() function defined below\n\t\t\t( parameters.toneMapping !== NoToneMapping ) ? getToneMappingFunction( 'toneMapping', parameters.toneMapping ) : '',\n\n\t\t\tparameters.dithering ? '#define DITHERING' : '',\n\t\t\tparameters.opaque ? '#define OPAQUE' : '',\n\n\t\t\tShaderChunk[ 'colorspace_pars_fragment' ], // this code is required here because it is used by the various encoding/decoding function defined below\n\t\t\tgetTexelEncodingFunction( 'linearToOutputTexel', parameters.outputColorSpace ),\n\t\t\tgetLuminanceFunction(),\n\n\t\t\tparameters.useDepthPacking ? '#define DEPTH_PACKING ' + parameters.depthPacking : '',\n\n\t\t\t'\\n'\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t}\n\n\tvertexShader = resolveIncludes( vertexShader );\n\tvertexShader = replaceLightNums( vertexShader, parameters );\n\tvertexShader = replaceClippingPlaneNums( vertexShader, parameters );\n\n\tfragmentShader = resolveIncludes( fragmentShader );\n\tfragmentShader = replaceLightNums( fragmentShader, parameters );\n\tfragmentShader = replaceClippingPlaneNums( fragmentShader, parameters );\n\n\tvertexShader = unrollLoops( vertexShader );\n\tfragmentShader = unrollLoops( fragmentShader );\n\n\tif ( parameters.isRawShaderMaterial !== true ) {\n\n\t\t// GLSL 3.0 conversion for built-in materials and ShaderMaterial\n\n\t\tversionString = '#version 300 es\\n';\n\n\t\tprefixVertex = [\n\t\t\tcustomVertexExtensions,\n\t\t\t'#define attribute in',\n\t\t\t'#define varying out',\n\t\t\t'#define texture2D texture'\n\t\t].join( '\\n' ) + '\\n' + prefixVertex;\n\n\t\tprefixFragment = [\n\t\t\t'#define varying in',\n\t\t\t( parameters.glslVersion === GLSL3 ) ? '' : 'layout(location = 0) out highp vec4 pc_fragColor;',\n\t\t\t( parameters.glslVersion === GLSL3 ) ? '' : '#define gl_FragColor pc_fragColor',\n\t\t\t'#define gl_FragDepthEXT gl_FragDepth',\n\t\t\t'#define texture2D texture',\n\t\t\t'#define textureCube texture',\n\t\t\t'#define texture2DProj textureProj',\n\t\t\t'#define texture2DLodEXT textureLod',\n\t\t\t'#define texture2DProjLodEXT textureProjLod',\n\t\t\t'#define textureCubeLodEXT textureLod',\n\t\t\t'#define texture2DGradEXT textureGrad',\n\t\t\t'#define texture2DProjGradEXT textureProjGrad',\n\t\t\t'#define textureCubeGradEXT textureGrad'\n\t\t].join( '\\n' ) + '\\n' + prefixFragment;\n\n\t}\n\n\tconst vertexGlsl = versionString + prefixVertex + vertexShader;\n\tconst fragmentGlsl = versionString + prefixFragment + fragmentShader;\n\n\t// log( '*VERTEX*', vertexGlsl );\n\t// log( '*FRAGMENT*', fragmentGlsl );\n\n\tconst glVertexShader = WebGLShader( gl, gl.VERTEX_SHADER, vertexGlsl );\n\tconst glFragmentShader = WebGLShader( gl, gl.FRAGMENT_SHADER, fragmentGlsl );\n\n\tgl.attachShader( program, glVertexShader );\n\tgl.attachShader( program, glFragmentShader );\n\n\t// Force a particular attribute to index 0.\n\n\tif ( parameters.index0AttributeName !== undefined ) {\n\n\t\tgl.bindAttribLocation( program, 0, parameters.index0AttributeName );\n\n\t} else if ( parameters.morphTargets === true ) {\n\n\t\t// programs with morphTargets displace position out of attribute 0\n\t\tgl.bindAttribLocation( program, 0, 'position' );\n\n\t}\n\n\tgl.linkProgram( program );\n\n\tfunction onFirstUse( self ) {\n\n\t\t// check for link errors\n\t\tif ( renderer.debug.checkShaderErrors ) {\n\n\t\t\tconst programInfoLog = gl.getProgramInfoLog( program ) || '';\n\t\t\tconst vertexShaderInfoLog = gl.getShaderInfoLog( glVertexShader ) || '';\n\t\t\tconst fragmentShaderInfoLog = gl.getShaderInfoLog( glFragmentShader ) || '';\n\n\t\t\tconst programLog = programInfoLog.trim();\n\t\t\tconst vertexLog = vertexShaderInfoLog.trim();\n\t\t\tconst fragmentLog = fragmentShaderInfoLog.trim();\n\n\t\t\tlet runnable = true;\n\t\t\tlet haveDiagnostics = true;\n\n\t\t\tif ( gl.getProgramParameter( program, gl.LINK_STATUS ) === false ) {\n\n\t\t\t\trunnable = false;\n\n\t\t\t\tif ( typeof renderer.debug.onShaderError === 'function' ) {\n\n\t\t\t\t\trenderer.debug.onShaderError( gl, program, glVertexShader, glFragmentShader );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// default error reporting\n\n\t\t\t\t\tconst vertexErrors = getShaderErrors( gl, glVertexShader, 'vertex' );\n\t\t\t\t\tconst fragmentErrors = getShaderErrors( gl, glFragmentShader, 'fragment' );\n\n\t\t\t\t\terror(\n\t\t\t\t\t\t'THREE.WebGLProgram: Shader Error ' + gl.getError() + ' - ' +\n\t\t\t\t\t\t'VALIDATE_STATUS ' + gl.getProgramParameter( program, gl.VALIDATE_STATUS ) + '\\n\\n' +\n\t\t\t\t\t\t'Material Name: ' + self.name + '\\n' +\n\t\t\t\t\t\t'Material Type: ' + self.type + '\\n\\n' +\n\t\t\t\t\t\t'Program Info Log: ' + programLog + '\\n' +\n\t\t\t\t\t\tvertexErrors + '\\n' +\n\t\t\t\t\t\tfragmentErrors\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t} else if ( programLog !== '' ) {\n\n\t\t\t\twarn( 'WebGLProgram: Program Info Log:', programLog );\n\n\t\t\t} else if ( vertexLog === '' || fragmentLog === '' ) {\n\n\t\t\t\thaveDiagnostics = false;\n\n\t\t\t}\n\n\t\t\tif ( haveDiagnostics ) {\n\n\t\t\t\tself.diagnostics = {\n\n\t\t\t\t\trunnable: runnable,\n\n\t\t\t\t\tprogramLog: programLog,\n\n\t\t\t\t\tvertexShader: {\n\n\t\t\t\t\t\tlog: vertexLog,\n\t\t\t\t\t\tprefix: prefixVertex\n\n\t\t\t\t\t},\n\n\t\t\t\t\tfragmentShader: {\n\n\t\t\t\t\t\tlog: fragmentLog,\n\t\t\t\t\t\tprefix: prefixFragment\n\n\t\t\t\t\t}\n\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Clean up\n\n\t\t// Crashes in iOS9 and iOS10. #18402\n\t\t// gl.detachShader( program, glVertexShader );\n\t\t// gl.detachShader( program, glFragmentShader );\n\n\t\tgl.deleteShader( glVertexShader );\n\t\tgl.deleteShader( glFragmentShader );\n\n\t\tcachedUniforms = new WebGLUniforms( gl, program );\n\t\tcachedAttributes = fetchAttributeLocations( gl, program );\n\n\t}\n\n\t// set up caching for uniform locations\n\n\tlet cachedUniforms;\n\n\tthis.getUniforms = function () {\n\n\t\tif ( cachedUniforms === undefined ) {\n\n\t\t\t// Populates cachedUniforms and cachedAttributes\n\t\t\tonFirstUse( this );\n\n\t\t}\n\n\t\treturn cachedUniforms;\n\n\t};\n\n\t// set up caching for attribute locations\n\n\tlet cachedAttributes;\n\n\tthis.getAttributes = function () {\n\n\t\tif ( cachedAttributes === undefined ) {\n\n\t\t\t// Populates cachedAttributes and cachedUniforms\n\t\t\tonFirstUse( this );\n\n\t\t}\n\n\t\treturn cachedAttributes;\n\n\t};\n\n\t// indicate when the program is ready to be used. if the KHR_parallel_shader_compile extension isn't supported,\n\t// flag the program as ready immediately. It may cause a stall when it's first used.\n\n\tlet programReady = ( parameters.rendererExtensionParallelShaderCompile === false );\n\n\tthis.isReady = function () {\n\n\t\tif ( programReady === false ) {\n\n\t\t\tprogramReady = gl.getProgramParameter( program, COMPLETION_STATUS_KHR );\n\n\t\t}\n\n\t\treturn programReady;\n\n\t};\n\n\t// free resource\n\n\tthis.destroy = function () {\n\n\t\tbindingStates.releaseStatesOfProgram( this );\n\n\t\tgl.deleteProgram( program );\n\t\tthis.program = undefined;\n\n\t};\n\n\t//\n\n\tthis.type = parameters.shaderType;\n\tthis.name = parameters.shaderName;\n\tthis.id = programIdCount ++;\n\tthis.cacheKey = cacheKey;\n\tthis.usedTimes = 1;\n\tthis.program = program;\n\tthis.vertexShader = glVertexShader;\n\tthis.fragmentShader = glFragmentShader;\n\n\treturn this;\n\n}\n\nlet _id = 0;\n\nclass WebGLShaderCache {\n\n\tconstructor() {\n\n\t\tthis.shaderCache = new Map();\n\t\tthis.materialCache = new Map();\n\n\t}\n\n\tupdate( material ) {\n\n\t\tconst vertexShader = material.vertexShader;\n\t\tconst fragmentShader = material.fragmentShader;\n\n\t\tconst vertexShaderStage = this._getShaderStage( vertexShader );\n\t\tconst fragmentShaderStage = this._getShaderStage( fragmentShader );\n\n\t\tconst materialShaders = this._getShaderCacheForMaterial( material );\n\n\t\tif ( materialShaders.has( vertexShaderStage ) === false ) {\n\n\t\t\tmaterialShaders.add( vertexShaderStage );\n\t\t\tvertexShaderStage.usedTimes ++;\n\n\t\t}\n\n\t\tif ( materialShaders.has( fragmentShaderStage ) === false ) {\n\n\t\t\tmaterialShaders.add( fragmentShaderStage );\n\t\t\tfragmentShaderStage.usedTimes ++;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tremove( material ) {\n\n\t\tconst materialShaders = this.materialCache.get( material );\n\n\t\tfor ( const shaderStage of materialShaders ) {\n\n\t\t\tshaderStage.usedTimes --;\n\n\t\t\tif ( shaderStage.usedTimes === 0 ) this.shaderCache.delete( shaderStage.code );\n\n\t\t}\n\n\t\tthis.materialCache.delete( material );\n\n\t\treturn this;\n\n\t}\n\n\tgetVertexShaderID( material ) {\n\n\t\treturn this._getShaderStage( material.vertexShader ).id;\n\n\t}\n\n\tgetFragmentShaderID( material ) {\n\n\t\treturn this._getShaderStage( material.fragmentShader ).id;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.shaderCache.clear();\n\t\tthis.materialCache.clear();\n\n\t}\n\n\t_getShaderCacheForMaterial( material ) {\n\n\t\tconst cache = this.materialCache;\n\t\tlet set = cache.get( material );\n\n\t\tif ( set === undefined ) {\n\n\t\t\tset = new Set();\n\t\t\tcache.set( material, set );\n\n\t\t}\n\n\t\treturn set;\n\n\t}\n\n\t_getShaderStage( code ) {\n\n\t\tconst cache = this.shaderCache;\n\t\tlet stage = cache.get( code );\n\n\t\tif ( stage === undefined ) {\n\n\t\t\tstage = new WebGLShaderStage( code );\n\t\t\tcache.set( code, stage );\n\n\t\t}\n\n\t\treturn stage;\n\n\t}\n\n}\n\nclass WebGLShaderStage {\n\n\tconstructor( code ) {\n\n\t\tthis.id = _id ++;\n\n\t\tthis.code = code;\n\t\tthis.usedTimes = 0;\n\n\t}\n\n}\n\nfunction WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities, bindingStates, clipping ) {\n\n\tconst _programLayers = new Layers();\n\tconst _customShaders = new WebGLShaderCache();\n\tconst _activeChannels = new Set();\n\tconst programs = [];\n\n\tconst logarithmicDepthBuffer = capabilities.logarithmicDepthBuffer;\n\tconst SUPPORTS_VERTEX_TEXTURES = capabilities.vertexTextures;\n\n\tlet precision = capabilities.precision;\n\n\tconst shaderIDs = {\n\t\tMeshDepthMaterial: 'depth',\n\t\tMeshDistanceMaterial: 'distanceRGBA',\n\t\tMeshNormalMaterial: 'normal',\n\t\tMeshBasicMaterial: 'basic',\n\t\tMeshLambertMaterial: 'lambert',\n\t\tMeshPhongMaterial: 'phong',\n\t\tMeshToonMaterial: 'toon',\n\t\tMeshStandardMaterial: 'physical',\n\t\tMeshPhysicalMaterial: 'physical',\n\t\tMeshMatcapMaterial: 'matcap',\n\t\tLineBasicMaterial: 'basic',\n\t\tLineDashedMaterial: 'dashed',\n\t\tPointsMaterial: 'points',\n\t\tShadowMaterial: 'shadow',\n\t\tSpriteMaterial: 'sprite'\n\t};\n\n\tfunction getChannel( value ) {\n\n\t\t_activeChannels.add( value );\n\n\t\tif ( value === 0 ) return 'uv';\n\n\t\treturn `uv${ value }`;\n\n\t}\n\n\tfunction getParameters( material, lights, shadows, scene, object ) {\n\n\t\tconst fog = scene.fog;\n\t\tconst geometry = object.geometry;\n\t\tconst environment = material.isMeshStandardMaterial ? scene.environment : null;\n\n\t\tconst envMap = ( material.isMeshStandardMaterial ? cubeuvmaps : cubemaps ).get( material.envMap || environment );\n\t\tconst envMapCubeUVHeight = ( !! envMap ) && ( envMap.mapping === CubeUVReflectionMapping ) ? envMap.image.height : null;\n\n\t\tconst shaderID = shaderIDs[ material.type ];\n\n\t\t// heuristics to create shader parameters according to lights in the scene\n\t\t// (not to blow over maxLights budget)\n\n\t\tif ( material.precision !== null ) {\n\n\t\t\tprecision = capabilities.getMaxPrecision( material.precision );\n\n\t\t\tif ( precision !== material.precision ) {\n\n\t\t\t\twarn( 'WebGLProgram.getParameters:', material.precision, 'not supported, using', precision, 'instead.' );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tconst morphAttribute = geometry.morphAttributes.position || geometry.morphAttributes.normal || geometry.morphAttributes.color;\n\t\tconst morphTargetsCount = ( morphAttribute !== undefined ) ? morphAttribute.length : 0;\n\n\t\tlet morphTextureStride = 0;\n\n\t\tif ( geometry.morphAttributes.position !== undefined ) morphTextureStride = 1;\n\t\tif ( geometry.morphAttributes.normal !== undefined ) morphTextureStride = 2;\n\t\tif ( geometry.morphAttributes.color !== undefined ) morphTextureStride = 3;\n\n\t\t//\n\n\t\tlet vertexShader, fragmentShader;\n\t\tlet customVertexShaderID, customFragmentShaderID;\n\n\t\tif ( shaderID ) {\n\n\t\t\tconst shader = ShaderLib[ shaderID ];\n\n\t\t\tvertexShader = shader.vertexShader;\n\t\t\tfragmentShader = shader.fragmentShader;\n\n\t\t} else {\n\n\t\t\tvertexShader = material.vertexShader;\n\t\t\tfragmentShader = material.fragmentShader;\n\n\t\t\t_customShaders.update( material );\n\n\t\t\tcustomVertexShaderID = _customShaders.getVertexShaderID( material );\n\t\t\tcustomFragmentShaderID = _customShaders.getFragmentShaderID( material );\n\n\t\t}\n\n\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\t\tconst reversedDepthBuffer = renderer.state.buffers.depth.getReversed();\n\n\t\tconst IS_INSTANCEDMESH = object.isInstancedMesh === true;\n\t\tconst IS_BATCHEDMESH = object.isBatchedMesh === true;\n\n\t\tconst HAS_MAP = !! material.map;\n\t\tconst HAS_MATCAP = !! material.matcap;\n\t\tconst HAS_ENVMAP = !! envMap;\n\t\tconst HAS_AOMAP = !! material.aoMap;\n\t\tconst HAS_LIGHTMAP = !! material.lightMap;\n\t\tconst HAS_BUMPMAP = !! material.bumpMap;\n\t\tconst HAS_NORMALMAP = !! material.normalMap;\n\t\tconst HAS_DISPLACEMENTMAP = !! material.displacementMap;\n\t\tconst HAS_EMISSIVEMAP = !! material.emissiveMap;\n\n\t\tconst HAS_METALNESSMAP = !! material.metalnessMap;\n\t\tconst HAS_ROUGHNESSMAP = !! material.roughnessMap;\n\n\t\tconst HAS_ANISOTROPY = material.anisotropy > 0;\n\t\tconst HAS_CLEARCOAT = material.clearcoat > 0;\n\t\tconst HAS_DISPERSION = material.dispersion > 0;\n\t\tconst HAS_IRIDESCENCE = material.iridescence > 0;\n\t\tconst HAS_SHEEN = material.sheen > 0;\n\t\tconst HAS_TRANSMISSION = material.transmission > 0;\n\n\t\tconst HAS_ANISOTROPYMAP = HAS_ANISOTROPY && !! material.anisotropyMap;\n\n\t\tconst HAS_CLEARCOATMAP = HAS_CLEARCOAT && !! material.clearcoatMap;\n\t\tconst HAS_CLEARCOAT_NORMALMAP = HAS_CLEARCOAT && !! material.clearcoatNormalMap;\n\t\tconst HAS_CLEARCOAT_ROUGHNESSMAP = HAS_CLEARCOAT && !! material.clearcoatRoughnessMap;\n\n\t\tconst HAS_IRIDESCENCEMAP = HAS_IRIDESCENCE && !! material.iridescenceMap;\n\t\tconst HAS_IRIDESCENCE_THICKNESSMAP = HAS_IRIDESCENCE && !! material.iridescenceThicknessMap;\n\n\t\tconst HAS_SHEEN_COLORMAP = HAS_SHEEN && !! material.sheenColorMap;\n\t\tconst HAS_SHEEN_ROUGHNESSMAP = HAS_SHEEN && !! material.sheenRoughnessMap;\n\n\t\tconst HAS_SPECULARMAP = !! material.specularMap;\n\t\tconst HAS_SPECULAR_COLORMAP = !! material.specularColorMap;\n\t\tconst HAS_SPECULAR_INTENSITYMAP = !! material.specularIntensityMap;\n\n\t\tconst HAS_TRANSMISSIONMAP = HAS_TRANSMISSION && !! material.transmissionMap;\n\t\tconst HAS_THICKNESSMAP = HAS_TRANSMISSION && !! material.thicknessMap;\n\n\t\tconst HAS_GRADIENTMAP = !! material.gradientMap;\n\n\t\tconst HAS_ALPHAMAP = !! material.alphaMap;\n\n\t\tconst HAS_ALPHATEST = material.alphaTest > 0;\n\n\t\tconst HAS_ALPHAHASH = !! material.alphaHash;\n\n\t\tconst HAS_EXTENSIONS = !! material.extensions;\n\n\t\tlet toneMapping = NoToneMapping;\n\n\t\tif ( material.toneMapped ) {\n\n\t\t\tif ( currentRenderTarget === null || currentRenderTarget.isXRRenderTarget === true ) {\n\n\t\t\t\ttoneMapping = renderer.toneMapping;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst parameters = {\n\n\t\t\tshaderID: shaderID,\n\t\t\tshaderType: material.type,\n\t\t\tshaderName: material.name,\n\n\t\t\tvertexShader: vertexShader,\n\t\t\tfragmentShader: fragmentShader,\n\t\t\tdefines: material.defines,\n\n\t\t\tcustomVertexShaderID: customVertexShaderID,\n\t\t\tcustomFragmentShaderID: customFragmentShaderID,\n\n\t\t\tisRawShaderMaterial: material.isRawShaderMaterial === true,\n\t\t\tglslVersion: material.glslVersion,\n\n\t\t\tprecision: precision,\n\n\t\t\tbatching: IS_BATCHEDMESH,\n\t\t\tbatchingColor: IS_BATCHEDMESH && object._colorsTexture !== null,\n\t\t\tinstancing: IS_INSTANCEDMESH,\n\t\t\tinstancingColor: IS_INSTANCEDMESH && object.instanceColor !== null,\n\t\t\tinstancingMorph: IS_INSTANCEDMESH && object.morphTexture !== null,\n\n\t\t\tsupportsVertexTextures: SUPPORTS_VERTEX_TEXTURES,\n\t\t\toutputColorSpace: ( currentRenderTarget === null ) ? renderer.outputColorSpace : ( currentRenderTarget.isXRRenderTarget === true ? currentRenderTarget.texture.colorSpace : LinearSRGBColorSpace ),\n\t\t\talphaToCoverage: !! material.alphaToCoverage,\n\n\t\t\tmap: HAS_MAP,\n\t\t\tmatcap: HAS_MATCAP,\n\t\t\tenvMap: HAS_ENVMAP,\n\t\t\tenvMapMode: HAS_ENVMAP && envMap.mapping,\n\t\t\tenvMapCubeUVHeight: envMapCubeUVHeight,\n\t\t\taoMap: HAS_AOMAP,\n\t\t\tlightMap: HAS_LIGHTMAP,\n\t\t\tbumpMap: HAS_BUMPMAP,\n\t\t\tnormalMap: HAS_NORMALMAP,\n\t\t\tdisplacementMap: SUPPORTS_VERTEX_TEXTURES && HAS_DISPLACEMENTMAP,\n\t\t\temissiveMap: HAS_EMISSIVEMAP,\n\n\t\t\tnormalMapObjectSpace: HAS_NORMALMAP && material.normalMapType === ObjectSpaceNormalMap,\n\t\t\tnormalMapTangentSpace: HAS_NORMALMAP && material.normalMapType === TangentSpaceNormalMap,\n\n\t\t\tmetalnessMap: HAS_METALNESSMAP,\n\t\t\troughnessMap: HAS_ROUGHNESSMAP,\n\n\t\t\tanisotropy: HAS_ANISOTROPY,\n\t\t\tanisotropyMap: HAS_ANISOTROPYMAP,\n\n\t\t\tclearcoat: HAS_CLEARCOAT,\n\t\t\tclearcoatMap: HAS_CLEARCOATMAP,\n\t\t\tclearcoatNormalMap: HAS_CLEARCOAT_NORMALMAP,\n\t\t\tclearcoatRoughnessMap: HAS_CLEARCOAT_ROUGHNESSMAP,\n\n\t\t\tdispersion: HAS_DISPERSION,\n\n\t\t\tiridescence: HAS_IRIDESCENCE,\n\t\t\tiridescenceMap: HAS_IRIDESCENCEMAP,\n\t\t\tiridescenceThicknessMap: HAS_IRIDESCENCE_THICKNESSMAP,\n\n\t\t\tsheen: HAS_SHEEN,\n\t\t\tsheenColorMap: HAS_SHEEN_COLORMAP,\n\t\t\tsheenRoughnessMap: HAS_SHEEN_ROUGHNESSMAP,\n\n\t\t\tspecularMap: HAS_SPECULARMAP,\n\t\t\tspecularColorMap: HAS_SPECULAR_COLORMAP,\n\t\t\tspecularIntensityMap: HAS_SPECULAR_INTENSITYMAP,\n\n\t\t\ttransmission: HAS_TRANSMISSION,\n\t\t\ttransmissionMap: HAS_TRANSMISSIONMAP,\n\t\t\tthicknessMap: HAS_THICKNESSMAP,\n\n\t\t\tgradientMap: HAS_GRADIENTMAP,\n\n\t\t\topaque: material.transparent === false && material.blending === NormalBlending && material.alphaToCoverage === false,\n\n\t\t\talphaMap: HAS_ALPHAMAP,\n\t\t\talphaTest: HAS_ALPHATEST,\n\t\t\talphaHash: HAS_ALPHAHASH,\n\n\t\t\tcombine: material.combine,\n\n\t\t\t//\n\n\t\t\tmapUv: HAS_MAP && getChannel( material.map.channel ),\n\t\t\taoMapUv: HAS_AOMAP && getChannel( material.aoMap.channel ),\n\t\t\tlightMapUv: HAS_LIGHTMAP && getChannel( material.lightMap.channel ),\n\t\t\tbumpMapUv: HAS_BUMPMAP && getChannel( material.bumpMap.channel ),\n\t\t\tnormalMapUv: HAS_NORMALMAP && getChannel( material.normalMap.channel ),\n\t\t\tdisplacementMapUv: HAS_DISPLACEMENTMAP && getChannel( material.displacementMap.channel ),\n\t\t\temissiveMapUv: HAS_EMISSIVEMAP && getChannel( material.emissiveMap.channel ),\n\n\t\t\tmetalnessMapUv: HAS_METALNESSMAP && getChannel( material.metalnessMap.channel ),\n\t\t\troughnessMapUv: HAS_ROUGHNESSMAP && getChannel( material.roughnessMap.channel ),\n\n\t\t\tanisotropyMapUv: HAS_ANISOTROPYMAP && getChannel( material.anisotropyMap.channel ),\n\n\t\t\tclearcoatMapUv: HAS_CLEARCOATMAP && getChannel( material.clearcoatMap.channel ),\n\t\t\tclearcoatNormalMapUv: HAS_CLEARCOAT_NORMALMAP && getChannel( material.clearcoatNormalMap.channel ),\n\t\t\tclearcoatRoughnessMapUv: HAS_CLEARCOAT_ROUGHNESSMAP && getChannel( material.clearcoatRoughnessMap.channel ),\n\n\t\t\tiridescenceMapUv: HAS_IRIDESCENCEMAP && getChannel( material.iridescenceMap.channel ),\n\t\t\tiridescenceThicknessMapUv: HAS_IRIDESCENCE_THICKNESSMAP && getChannel( material.iridescenceThicknessMap.channel ),\n\n\t\t\tsheenColorMapUv: HAS_SHEEN_COLORMAP && getChannel( material.sheenColorMap.channel ),\n\t\t\tsheenRoughnessMapUv: HAS_SHEEN_ROUGHNESSMAP && getChannel( material.sheenRoughnessMap.channel ),\n\n\t\t\tspecularMapUv: HAS_SPECULARMAP && getChannel( material.specularMap.channel ),\n\t\t\tspecularColorMapUv: HAS_SPECULAR_COLORMAP && getChannel( material.specularColorMap.channel ),\n\t\t\tspecularIntensityMapUv: HAS_SPECULAR_INTENSITYMAP && getChannel( material.specularIntensityMap.channel ),\n\n\t\t\ttransmissionMapUv: HAS_TRANSMISSIONMAP && getChannel( material.transmissionMap.channel ),\n\t\t\tthicknessMapUv: HAS_THICKNESSMAP && getChannel( material.thicknessMap.channel ),\n\n\t\t\talphaMapUv: HAS_ALPHAMAP && getChannel( material.alphaMap.channel ),\n\n\t\t\t//\n\n\t\t\tvertexTangents: !! geometry.attributes.tangent && ( HAS_NORMALMAP || HAS_ANISOTROPY ),\n\t\t\tvertexColors: material.vertexColors,\n\t\t\tvertexAlphas: material.vertexColors === true && !! geometry.attributes.color && geometry.attributes.color.itemSize === 4,\n\n\t\t\tpointsUvs: object.isPoints === true && !! geometry.attributes.uv && ( HAS_MAP || HAS_ALPHAMAP ),\n\n\t\t\tfog: !! fog,\n\t\t\tuseFog: material.fog === true,\n\t\t\tfogExp2: ( !! fog && fog.isFogExp2 ),\n\n\t\t\tflatShading: ( material.flatShading === true && material.wireframe === false ),\n\n\t\t\tsizeAttenuation: material.sizeAttenuation === true,\n\t\t\tlogarithmicDepthBuffer: logarithmicDepthBuffer,\n\t\t\treversedDepthBuffer: reversedDepthBuffer,\n\n\t\t\tskinning: object.isSkinnedMesh === true,\n\n\t\t\tmorphTargets: geometry.morphAttributes.position !== undefined,\n\t\t\tmorphNormals: geometry.morphAttributes.normal !== undefined,\n\t\t\tmorphColors: geometry.morphAttributes.color !== undefined,\n\t\t\tmorphTargetsCount: morphTargetsCount,\n\t\t\tmorphTextureStride: morphTextureStride,\n\n\t\t\tnumDirLights: lights.directional.length,\n\t\t\tnumPointLights: lights.point.length,\n\t\t\tnumSpotLights: lights.spot.length,\n\t\t\tnumSpotLightMaps: lights.spotLightMap.length,\n\t\t\tnumRectAreaLights: lights.rectArea.length,\n\t\t\tnumHemiLights: lights.hemi.length,\n\n\t\t\tnumDirLightShadows: lights.directionalShadowMap.length,\n\t\t\tnumPointLightShadows: lights.pointShadowMap.length,\n\t\t\tnumSpotLightShadows: lights.spotShadowMap.length,\n\t\t\tnumSpotLightShadowsWithMaps: lights.numSpotLightShadowsWithMaps,\n\n\t\t\tnumLightProbes: lights.numLightProbes,\n\n\t\t\tnumClippingPlanes: clipping.numPlanes,\n\t\t\tnumClipIntersection: clipping.numIntersection,\n\n\t\t\tdithering: material.dithering,\n\n\t\t\tshadowMapEnabled: renderer.shadowMap.enabled && shadows.length > 0,\n\t\t\tshadowMapType: renderer.shadowMap.type,\n\n\t\t\ttoneMapping: toneMapping,\n\n\t\t\tdecodeVideoTexture: HAS_MAP && ( material.map.isVideoTexture === true ) && ( ColorManagement.getTransfer( material.map.colorSpace ) === SRGBTransfer ),\n\t\t\tdecodeVideoTextureEmissive: HAS_EMISSIVEMAP && ( material.emissiveMap.isVideoTexture === true ) && ( ColorManagement.getTransfer( material.emissiveMap.colorSpace ) === SRGBTransfer ),\n\n\t\t\tpremultipliedAlpha: material.premultipliedAlpha,\n\n\t\t\tdoubleSided: material.side === DoubleSide,\n\t\t\tflipSided: material.side === BackSide,\n\n\t\t\tuseDepthPacking: material.depthPacking >= 0,\n\t\t\tdepthPacking: material.depthPacking || 0,\n\n\t\t\tindex0AttributeName: material.index0AttributeName,\n\n\t\t\textensionClipCullDistance: HAS_EXTENSIONS && material.extensions.clipCullDistance === true && extensions.has( 'WEBGL_clip_cull_distance' ),\n\t\t\textensionMultiDraw: ( HAS_EXTENSIONS && material.extensions.multiDraw === true || IS_BATCHEDMESH ) && extensions.has( 'WEBGL_multi_draw' ),\n\n\t\t\trendererExtensionParallelShaderCompile: extensions.has( 'KHR_parallel_shader_compile' ),\n\n\t\t\tcustomProgramCacheKey: material.customProgramCacheKey()\n\n\t\t};\n\n\t\t// the usage of getChannel() determines the active texture channels for this shader\n\n\t\tparameters.vertexUv1s = _activeChannels.has( 1 );\n\t\tparameters.vertexUv2s = _activeChannels.has( 2 );\n\t\tparameters.vertexUv3s = _activeChannels.has( 3 );\n\n\t\t_activeChannels.clear();\n\n\t\treturn parameters;\n\n\t}\n\n\tfunction getProgramCacheKey( parameters ) {\n\n\t\tconst array = [];\n\n\t\tif ( parameters.shaderID ) {\n\n\t\t\tarray.push( parameters.shaderID );\n\n\t\t} else {\n\n\t\t\tarray.push( parameters.customVertexShaderID );\n\t\t\tarray.push( parameters.customFragmentShaderID );\n\n\t\t}\n\n\t\tif ( parameters.defines !== undefined ) {\n\n\t\t\tfor ( const name in parameters.defines ) {\n\n\t\t\t\tarray.push( name );\n\t\t\t\tarray.push( parameters.defines[ name ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( parameters.isRawShaderMaterial === false ) {\n\n\t\t\tgetProgramCacheKeyParameters( array, parameters );\n\t\t\tgetProgramCacheKeyBooleans( array, parameters );\n\t\t\tarray.push( renderer.outputColorSpace );\n\n\t\t}\n\n\t\tarray.push( parameters.customProgramCacheKey );\n\n\t\treturn array.join();\n\n\t}\n\n\tfunction getProgramCacheKeyParameters( array, parameters ) {\n\n\t\tarray.push( parameters.precision );\n\t\tarray.push( parameters.outputColorSpace );\n\t\tarray.push( parameters.envMapMode );\n\t\tarray.push( parameters.envMapCubeUVHeight );\n\t\tarray.push( parameters.mapUv );\n\t\tarray.push( parameters.alphaMapUv );\n\t\tarray.push( parameters.lightMapUv );\n\t\tarray.push( parameters.aoMapUv );\n\t\tarray.push( parameters.bumpMapUv );\n\t\tarray.push( parameters.normalMapUv );\n\t\tarray.push( parameters.displacementMapUv );\n\t\tarray.push( parameters.emissiveMapUv );\n\t\tarray.push( parameters.metalnessMapUv );\n\t\tarray.push( parameters.roughnessMapUv );\n\t\tarray.push( parameters.anisotropyMapUv );\n\t\tarray.push( parameters.clearcoatMapUv );\n\t\tarray.push( parameters.clearcoatNormalMapUv );\n\t\tarray.push( parameters.clearcoatRoughnessMapUv );\n\t\tarray.push( parameters.iridescenceMapUv );\n\t\tarray.push( parameters.iridescenceThicknessMapUv );\n\t\tarray.push( parameters.sheenColorMapUv );\n\t\tarray.push( parameters.sheenRoughnessMapUv );\n\t\tarray.push( parameters.specularMapUv );\n\t\tarray.push( parameters.specularColorMapUv );\n\t\tarray.push( parameters.specularIntensityMapUv );\n\t\tarray.push( parameters.transmissionMapUv );\n\t\tarray.push( parameters.thicknessMapUv );\n\t\tarray.push( parameters.combine );\n\t\tarray.push( parameters.fogExp2 );\n\t\tarray.push( parameters.sizeAttenuation );\n\t\tarray.push( parameters.morphTargetsCount );\n\t\tarray.push( parameters.morphAttributeCount );\n\t\tarray.push( parameters.numDirLights );\n\t\tarray.push( parameters.numPointLights );\n\t\tarray.push( parameters.numSpotLights );\n\t\tarray.push( parameters.numSpotLightMaps );\n\t\tarray.push( parameters.numHemiLights );\n\t\tarray.push( parameters.numRectAreaLights );\n\t\tarray.push( parameters.numDirLightShadows );\n\t\tarray.push( parameters.numPointLightShadows );\n\t\tarray.push( parameters.numSpotLightShadows );\n\t\tarray.push( parameters.numSpotLightShadowsWithMaps );\n\t\tarray.push( parameters.numLightProbes );\n\t\tarray.push( parameters.shadowMapType );\n\t\tarray.push( parameters.toneMapping );\n\t\tarray.push( parameters.numClippingPlanes );\n\t\tarray.push( parameters.numClipIntersection );\n\t\tarray.push( parameters.depthPacking );\n\n\t}\n\n\tfunction getProgramCacheKeyBooleans( array, parameters ) {\n\n\t\t_programLayers.disableAll();\n\n\t\tif ( parameters.supportsVertexTextures )\n\t\t\t_programLayers.enable( 0 );\n\t\tif ( parameters.instancing )\n\t\t\t_programLayers.enable( 1 );\n\t\tif ( parameters.instancingColor )\n\t\t\t_programLayers.enable( 2 );\n\t\tif ( parameters.instancingMorph )\n\t\t\t_programLayers.enable( 3 );\n\t\tif ( parameters.matcap )\n\t\t\t_programLayers.enable( 4 );\n\t\tif ( parameters.envMap )\n\t\t\t_programLayers.enable( 5 );\n\t\tif ( parameters.normalMapObjectSpace )\n\t\t\t_programLayers.enable( 6 );\n\t\tif ( parameters.normalMapTangentSpace )\n\t\t\t_programLayers.enable( 7 );\n\t\tif ( parameters.clearcoat )\n\t\t\t_programLayers.enable( 8 );\n\t\tif ( parameters.iridescence )\n\t\t\t_programLayers.enable( 9 );\n\t\tif ( parameters.alphaTest )\n\t\t\t_programLayers.enable( 10 );\n\t\tif ( parameters.vertexColors )\n\t\t\t_programLayers.enable( 11 );\n\t\tif ( parameters.vertexAlphas )\n\t\t\t_programLayers.enable( 12 );\n\t\tif ( parameters.vertexUv1s )\n\t\t\t_programLayers.enable( 13 );\n\t\tif ( parameters.vertexUv2s )\n\t\t\t_programLayers.enable( 14 );\n\t\tif ( parameters.vertexUv3s )\n\t\t\t_programLayers.enable( 15 );\n\t\tif ( parameters.vertexTangents )\n\t\t\t_programLayers.enable( 16 );\n\t\tif ( parameters.anisotropy )\n\t\t\t_programLayers.enable( 17 );\n\t\tif ( parameters.alphaHash )\n\t\t\t_programLayers.enable( 18 );\n\t\tif ( parameters.batching )\n\t\t\t_programLayers.enable( 19 );\n\t\tif ( parameters.dispersion )\n\t\t\t_programLayers.enable( 20 );\n\t\tif ( parameters.batchingColor )\n\t\t\t_programLayers.enable( 21 );\n\t\tif ( parameters.gradientMap )\n\t\t\t_programLayers.enable( 22 );\n\n\t\tarray.push( _programLayers.mask );\n\t\t_programLayers.disableAll();\n\n\t\tif ( parameters.fog )\n\t\t\t_programLayers.enable( 0 );\n\t\tif ( parameters.useFog )\n\t\t\t_programLayers.enable( 1 );\n\t\tif ( parameters.flatShading )\n\t\t\t_programLayers.enable( 2 );\n\t\tif ( parameters.logarithmicDepthBuffer )\n\t\t\t_programLayers.enable( 3 );\n\t\tif ( parameters.reversedDepthBuffer )\n\t\t\t_programLayers.enable( 4 );\n\t\tif ( parameters.skinning )\n\t\t\t_programLayers.enable( 5 );\n\t\tif ( parameters.morphTargets )\n\t\t\t_programLayers.enable( 6 );\n\t\tif ( parameters.morphNormals )\n\t\t\t_programLayers.enable( 7 );\n\t\tif ( parameters.morphColors )\n\t\t\t_programLayers.enable( 8 );\n\t\tif ( parameters.premultipliedAlpha )\n\t\t\t_programLayers.enable( 9 );\n\t\tif ( parameters.shadowMapEnabled )\n\t\t\t_programLayers.enable( 10 );\n\t\tif ( parameters.doubleSided )\n\t\t\t_programLayers.enable( 11 );\n\t\tif ( parameters.flipSided )\n\t\t\t_programLayers.enable( 12 );\n\t\tif ( parameters.useDepthPacking )\n\t\t\t_programLayers.enable( 13 );\n\t\tif ( parameters.dithering )\n\t\t\t_programLayers.enable( 14 );\n\t\tif ( parameters.transmission )\n\t\t\t_programLayers.enable( 15 );\n\t\tif ( parameters.sheen )\n\t\t\t_programLayers.enable( 16 );\n\t\tif ( parameters.opaque )\n\t\t\t_programLayers.enable( 17 );\n\t\tif ( parameters.pointsUvs )\n\t\t\t_programLayers.enable( 18 );\n\t\tif ( parameters.decodeVideoTexture )\n\t\t\t_programLayers.enable( 19 );\n\t\tif ( parameters.decodeVideoTextureEmissive )\n\t\t\t_programLayers.enable( 20 );\n\t\tif ( parameters.alphaToCoverage )\n\t\t\t_programLayers.enable( 21 );\n\n\t\tarray.push( _programLayers.mask );\n\n\t}\n\n\tfunction getUniforms( material ) {\n\n\t\tconst shaderID = shaderIDs[ material.type ];\n\t\tlet uniforms;\n\n\t\tif ( shaderID ) {\n\n\t\t\tconst shader = ShaderLib[ shaderID ];\n\t\t\tuniforms = UniformsUtils.clone( shader.uniforms );\n\n\t\t} else {\n\n\t\t\tuniforms = material.uniforms;\n\n\t\t}\n\n\t\treturn uniforms;\n\n\t}\n\n\tfunction acquireProgram( parameters, cacheKey ) {\n\n\t\tlet program;\n\n\t\t// Check if code has been already compiled\n\t\tfor ( let p = 0, pl = programs.length; p < pl; p ++ ) {\n\n\t\t\tconst preexistingProgram = programs[ p ];\n\n\t\t\tif ( preexistingProgram.cacheKey === cacheKey ) {\n\n\t\t\t\tprogram = preexistingProgram;\n\t\t\t\t++ program.usedTimes;\n\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( program === undefined ) {\n\n\t\t\tprogram = new WebGLProgram( renderer, cacheKey, parameters, bindingStates );\n\t\t\tprograms.push( program );\n\n\t\t}\n\n\t\treturn program;\n\n\t}\n\n\tfunction releaseProgram( program ) {\n\n\t\tif ( -- program.usedTimes === 0 ) {\n\n\t\t\t// Remove from unordered set\n\t\t\tconst i = programs.indexOf( program );\n\t\t\tprograms[ i ] = programs[ programs.length - 1 ];\n\t\t\tprograms.pop();\n\n\t\t\t// Free WebGL resources\n\t\t\tprogram.destroy();\n\n\t\t}\n\n\t}\n\n\tfunction releaseShaderCache( material ) {\n\n\t\t_customShaders.remove( material );\n\n\t}\n\n\tfunction dispose() {\n\n\t\t_customShaders.dispose();\n\n\t}\n\n\treturn {\n\t\tgetParameters: getParameters,\n\t\tgetProgramCacheKey: getProgramCacheKey,\n\t\tgetUniforms: getUniforms,\n\t\tacquireProgram: acquireProgram,\n\t\treleaseProgram: releaseProgram,\n\t\treleaseShaderCache: releaseShaderCache,\n\t\t// Exposed for resource monitoring & error feedback via renderer.info:\n\t\tprograms: programs,\n\t\tdispose: dispose\n\t};\n\n}\n\nfunction WebGLProperties() {\n\n\tlet properties = new WeakMap();\n\n\tfunction has( object ) {\n\n\t\treturn properties.has( object );\n\n\t}\n\n\tfunction get( object ) {\n\n\t\tlet map = properties.get( object );\n\n\t\tif ( map === undefined ) {\n\n\t\t\tmap = {};\n\t\t\tproperties.set( object, map );\n\n\t\t}\n\n\t\treturn map;\n\n\t}\n\n\tfunction remove( object ) {\n\n\t\tproperties.delete( object );\n\n\t}\n\n\tfunction update( object, key, value ) {\n\n\t\tproperties.get( object )[ key ] = value;\n\n\t}\n\n\tfunction dispose() {\n\n\t\tproperties = new WeakMap();\n\n\t}\n\n\treturn {\n\t\thas: has,\n\t\tget: get,\n\t\tremove: remove,\n\t\tupdate: update,\n\t\tdispose: dispose\n\t};\n\n}\n\nfunction painterSortStable( a, b ) {\n\n\tif ( a.groupOrder !== b.groupOrder ) {\n\n\t\treturn a.groupOrder - b.groupOrder;\n\n\t} else if ( a.renderOrder !== b.renderOrder ) {\n\n\t\treturn a.renderOrder - b.renderOrder;\n\n\t} else if ( a.material.id !== b.material.id ) {\n\n\t\treturn a.material.id - b.material.id;\n\n\t} else if ( a.z !== b.z ) {\n\n\t\treturn a.z - b.z;\n\n\t} else {\n\n\t\treturn a.id - b.id;\n\n\t}\n\n}\n\nfunction reversePainterSortStable( a, b ) {\n\n\tif ( a.groupOrder !== b.groupOrder ) {\n\n\t\treturn a.groupOrder - b.groupOrder;\n\n\t} else if ( a.renderOrder !== b.renderOrder ) {\n\n\t\treturn a.renderOrder - b.renderOrder;\n\n\t} else if ( a.z !== b.z ) {\n\n\t\treturn b.z - a.z;\n\n\t} else {\n\n\t\treturn a.id - b.id;\n\n\t}\n\n}\n\n\nfunction WebGLRenderList() {\n\n\tconst renderItems = [];\n\tlet renderItemsIndex = 0;\n\n\tconst opaque = [];\n\tconst transmissive = [];\n\tconst transparent = [];\n\n\tfunction init() {\n\n\t\trenderItemsIndex = 0;\n\n\t\topaque.length = 0;\n\t\ttransmissive.length = 0;\n\t\ttransparent.length = 0;\n\n\t}\n\n\tfunction getNextRenderItem( object, geometry, material, groupOrder, z, group ) {\n\n\t\tlet renderItem = renderItems[ renderItemsIndex ];\n\n\t\tif ( renderItem === undefined ) {\n\n\t\t\trenderItem = {\n\t\t\t\tid: object.id,\n\t\t\t\tobject: object,\n\t\t\t\tgeometry: geometry,\n\t\t\t\tmaterial: material,\n\t\t\t\tgroupOrder: groupOrder,\n\t\t\t\trenderOrder: object.renderOrder,\n\t\t\t\tz: z,\n\t\t\t\tgroup: group\n\t\t\t};\n\n\t\t\trenderItems[ renderItemsIndex ] = renderItem;\n\n\t\t} else {\n\n\t\t\trenderItem.id = object.id;\n\t\t\trenderItem.object = object;\n\t\t\trenderItem.geometry = geometry;\n\t\t\trenderItem.material = material;\n\t\t\trenderItem.groupOrder = groupOrder;\n\t\t\trenderItem.renderOrder = object.renderOrder;\n\t\t\trenderItem.z = z;\n\t\t\trenderItem.group = group;\n\n\t\t}\n\n\t\trenderItemsIndex ++;\n\n\t\treturn renderItem;\n\n\t}\n\n\tfunction push( object, geometry, material, groupOrder, z, group ) {\n\n\t\tconst renderItem = getNextRenderItem( object, geometry, material, groupOrder, z, group );\n\n\t\tif ( material.transmission > 0.0 ) {\n\n\t\t\ttransmissive.push( renderItem );\n\n\t\t} else if ( material.transparent === true ) {\n\n\t\t\ttransparent.push( renderItem );\n\n\t\t} else {\n\n\t\t\topaque.push( renderItem );\n\n\t\t}\n\n\t}\n\n\tfunction unshift( object, geometry, material, groupOrder, z, group ) {\n\n\t\tconst renderItem = getNextRenderItem( object, geometry, material, groupOrder, z, group );\n\n\t\tif ( material.transmission > 0.0 ) {\n\n\t\t\ttransmissive.unshift( renderItem );\n\n\t\t} else if ( material.transparent === true ) {\n\n\t\t\ttransparent.unshift( renderItem );\n\n\t\t} else {\n\n\t\t\topaque.unshift( renderItem );\n\n\t\t}\n\n\t}\n\n\tfunction sort( customOpaqueSort, customTransparentSort ) {\n\n\t\tif ( opaque.length > 1 ) opaque.sort( customOpaqueSort || painterSortStable );\n\t\tif ( transmissive.length > 1 ) transmissive.sort( customTransparentSort || reversePainterSortStable );\n\t\tif ( transparent.length > 1 ) transparent.sort( customTransparentSort || reversePainterSortStable );\n\n\t}\n\n\tfunction finish() {\n\n\t\t// Clear references from inactive renderItems in the list\n\n\t\tfor ( let i = renderItemsIndex, il = renderItems.length; i < il; i ++ ) {\n\n\t\t\tconst renderItem = renderItems[ i ];\n\n\t\t\tif ( renderItem.id === null ) break;\n\n\t\t\trenderItem.id = null;\n\t\t\trenderItem.object = null;\n\t\t\trenderItem.geometry = null;\n\t\t\trenderItem.material = null;\n\t\t\trenderItem.group = null;\n\n\t\t}\n\n\t}\n\n\treturn {\n\n\t\topaque: opaque,\n\t\ttransmissive: transmissive,\n\t\ttransparent: transparent,\n\n\t\tinit: init,\n\t\tpush: push,\n\t\tunshift: unshift,\n\t\tfinish: finish,\n\n\t\tsort: sort\n\t};\n\n}\n\nfunction WebGLRenderLists() {\n\n\tlet lists = new WeakMap();\n\n\tfunction get( scene, renderCallDepth ) {\n\n\t\tconst listArray = lists.get( scene );\n\t\tlet list;\n\n\t\tif ( listArray === undefined ) {\n\n\t\t\tlist = new WebGLRenderList();\n\t\t\tlists.set( scene, [ list ] );\n\n\t\t} else {\n\n\t\t\tif ( renderCallDepth >= listArray.length ) {\n\n\t\t\t\tlist = new WebGLRenderList();\n\t\t\t\tlistArray.push( list );\n\n\t\t\t} else {\n\n\t\t\t\tlist = listArray[ renderCallDepth ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn list;\n\n\t}\n\n\tfunction dispose() {\n\n\t\tlists = new WeakMap();\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\nfunction UniformsCache() {\n\n\tconst lights = {};\n\n\treturn {\n\n\t\tget: function ( light ) {\n\n\t\t\tif ( lights[ light.id ] !== undefined ) {\n\n\t\t\t\treturn lights[ light.id ];\n\n\t\t\t}\n\n\t\t\tlet uniforms;\n\n\t\t\tswitch ( light.type ) {\n\n\t\t\t\tcase 'DirectionalLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\tcolor: new Color()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'SpotLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\tdistance: 0,\n\t\t\t\t\t\tconeCos: 0,\n\t\t\t\t\t\tpenumbraCos: 0,\n\t\t\t\t\t\tdecay: 0\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'PointLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\tdistance: 0,\n\t\t\t\t\t\tdecay: 0\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'HemisphereLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\tskyColor: new Color(),\n\t\t\t\t\t\tgroundColor: new Color()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'RectAreaLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\thalfWidth: new Vector3(),\n\t\t\t\t\t\thalfHeight: new Vector3()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tlights[ light.id ] = uniforms;\n\n\t\t\treturn uniforms;\n\n\t\t}\n\n\t};\n\n}\n\nfunction ShadowUniformsCache() {\n\n\tconst lights = {};\n\n\treturn {\n\n\t\tget: function ( light ) {\n\n\t\t\tif ( lights[ light.id ] !== undefined ) {\n\n\t\t\t\treturn lights[ light.id ];\n\n\t\t\t}\n\n\t\t\tlet uniforms;\n\n\t\t\tswitch ( light.type ) {\n\n\t\t\t\tcase 'DirectionalLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tshadowIntensity: 1,\n\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\tshadowNormalBias: 0,\n\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'SpotLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tshadowIntensity: 1,\n\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\tshadowNormalBias: 0,\n\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'PointLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tshadowIntensity: 1,\n\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\tshadowNormalBias: 0,\n\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\tshadowMapSize: new Vector2(),\n\t\t\t\t\t\tshadowCameraNear: 1,\n\t\t\t\t\t\tshadowCameraFar: 1000\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\t// TODO (abelnation): set RectAreaLight shadow uniforms\n\n\t\t\t}\n\n\t\t\tlights[ light.id ] = uniforms;\n\n\t\t\treturn uniforms;\n\n\t\t}\n\n\t};\n\n}\n\n\n\nlet nextVersion = 0;\n\nfunction shadowCastingAndTexturingLightsFirst( lightA, lightB ) {\n\n\treturn ( lightB.castShadow ? 2 : 0 ) - ( lightA.castShadow ? 2 : 0 ) + ( lightB.map ? 1 : 0 ) - ( lightA.map ? 1 : 0 );\n\n}\n\nfunction WebGLLights( extensions ) {\n\n\tconst cache = new UniformsCache();\n\n\tconst shadowCache = ShadowUniformsCache();\n\n\tconst state = {\n\n\t\tversion: 0,\n\n\t\thash: {\n\t\t\tdirectionalLength: -1,\n\t\t\tpointLength: -1,\n\t\t\tspotLength: -1,\n\t\t\trectAreaLength: -1,\n\t\t\themiLength: -1,\n\n\t\t\tnumDirectionalShadows: -1,\n\t\t\tnumPointShadows: -1,\n\t\t\tnumSpotShadows: -1,\n\t\t\tnumSpotMaps: -1,\n\n\t\t\tnumLightProbes: -1\n\t\t},\n\n\t\tambient: [ 0, 0, 0 ],\n\t\tprobe: [],\n\t\tdirectional: [],\n\t\tdirectionalShadow: [],\n\t\tdirectionalShadowMap: [],\n\t\tdirectionalShadowMatrix: [],\n\t\tspot: [],\n\t\tspotLightMap: [],\n\t\tspotShadow: [],\n\t\tspotShadowMap: [],\n\t\tspotLightMatrix: [],\n\t\trectArea: [],\n\t\trectAreaLTC1: null,\n\t\trectAreaLTC2: null,\n\t\tpoint: [],\n\t\tpointShadow: [],\n\t\tpointShadowMap: [],\n\t\tpointShadowMatrix: [],\n\t\themi: [],\n\t\tnumSpotLightShadowsWithMaps: 0,\n\t\tnumLightProbes: 0\n\n\t};\n\n\tfor ( let i = 0; i < 9; i ++ ) state.probe.push( new Vector3() );\n\n\tconst vector3 = new Vector3();\n\tconst matrix4 = new Matrix4();\n\tconst matrix42 = new Matrix4();\n\n\tfunction setup( lights ) {\n\n\t\tlet r = 0, g = 0, b = 0;\n\n\t\tfor ( let i = 0; i < 9; i ++ ) state.probe[ i ].set( 0, 0, 0 );\n\n\t\tlet directionalLength = 0;\n\t\tlet pointLength = 0;\n\t\tlet spotLength = 0;\n\t\tlet rectAreaLength = 0;\n\t\tlet hemiLength = 0;\n\n\t\tlet numDirectionalShadows = 0;\n\t\tlet numPointShadows = 0;\n\t\tlet numSpotShadows = 0;\n\t\tlet numSpotMaps = 0;\n\t\tlet numSpotShadowsWithMaps = 0;\n\n\t\tlet numLightProbes = 0;\n\n\t\t// ordering : [shadow casting + map texturing, map texturing, shadow casting, none ]\n\t\tlights.sort( shadowCastingAndTexturingLightsFirst );\n\n\t\tfor ( let i = 0, l = lights.length; i < l; i ++ ) {\n\n\t\t\tconst light = lights[ i ];\n\n\t\t\tconst color = light.color;\n\t\t\tconst intensity = light.intensity;\n\t\t\tconst distance = light.distance;\n\n\t\t\tconst shadowMap = ( light.shadow && light.shadow.map ) ? light.shadow.map.texture : null;\n\n\t\t\tif ( light.isAmbientLight ) {\n\n\t\t\t\tr += color.r * intensity;\n\t\t\t\tg += color.g * intensity;\n\t\t\t\tb += color.b * intensity;\n\n\t\t\t} else if ( light.isLightProbe ) {\n\n\t\t\t\tfor ( let j = 0; j < 9; j ++ ) {\n\n\t\t\t\t\tstate.probe[ j ].addScaledVector( light.sh.coefficients[ j ], intensity );\n\n\t\t\t\t}\n\n\t\t\t\tnumLightProbes ++;\n\n\t\t\t} else if ( light.isDirectionalLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.color.copy( light.color ).multiplyScalar( light.intensity );\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\tconst shadow = light.shadow;\n\n\t\t\t\t\tconst shadowUniforms = shadowCache.get( light );\n\n\t\t\t\t\tshadowUniforms.shadowIntensity = shadow.intensity;\n\t\t\t\t\tshadowUniforms.shadowBias = shadow.bias;\n\t\t\t\t\tshadowUniforms.shadowNormalBias = shadow.normalBias;\n\t\t\t\t\tshadowUniforms.shadowRadius = shadow.radius;\n\t\t\t\t\tshadowUniforms.shadowMapSize = shadow.mapSize;\n\n\t\t\t\t\tstate.directionalShadow[ directionalLength ] = shadowUniforms;\n\t\t\t\t\tstate.directionalShadowMap[ directionalLength ] = shadowMap;\n\t\t\t\t\tstate.directionalShadowMatrix[ directionalLength ] = light.shadow.matrix;\n\n\t\t\t\t\tnumDirectionalShadows ++;\n\n\t\t\t\t}\n\n\t\t\t\tstate.directional[ directionalLength ] = uniforms;\n\n\t\t\t\tdirectionalLength ++;\n\n\t\t\t} else if ( light.isSpotLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\n\t\t\t\tuniforms.color.copy( color ).multiplyScalar( intensity );\n\t\t\t\tuniforms.distance = distance;\n\n\t\t\t\tuniforms.coneCos = Math.cos( light.angle );\n\t\t\t\tuniforms.penumbraCos = Math.cos( light.angle * ( 1 - light.penumbra ) );\n\t\t\t\tuniforms.decay = light.decay;\n\n\t\t\t\tstate.spot[ spotLength ] = uniforms;\n\n\t\t\t\tconst shadow = light.shadow;\n\n\t\t\t\tif ( light.map ) {\n\n\t\t\t\t\tstate.spotLightMap[ numSpotMaps ] = light.map;\n\t\t\t\t\tnumSpotMaps ++;\n\n\t\t\t\t\t// make sure the lightMatrix is up to date\n\t\t\t\t\t// TODO : do it if required only\n\t\t\t\t\tshadow.updateMatrices( light );\n\n\t\t\t\t\tif ( light.castShadow ) numSpotShadowsWithMaps ++;\n\n\t\t\t\t}\n\n\t\t\t\tstate.spotLightMatrix[ spotLength ] = shadow.matrix;\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\tconst shadowUniforms = shadowCache.get( light );\n\n\t\t\t\t\tshadowUniforms.shadowIntensity = shadow.intensity;\n\t\t\t\t\tshadowUniforms.shadowBias = shadow.bias;\n\t\t\t\t\tshadowUniforms.shadowNormalBias = shadow.normalBias;\n\t\t\t\t\tshadowUniforms.shadowRadius = shadow.radius;\n\t\t\t\t\tshadowUniforms.shadowMapSize = shadow.mapSize;\n\n\t\t\t\t\tstate.spotShadow[ spotLength ] = shadowUniforms;\n\t\t\t\t\tstate.spotShadowMap[ spotLength ] = shadowMap;\n\n\t\t\t\t\tnumSpotShadows ++;\n\n\t\t\t\t}\n\n\t\t\t\tspotLength ++;\n\n\t\t\t} else if ( light.isRectAreaLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.color.copy( color ).multiplyScalar( intensity );\n\n\t\t\t\tuniforms.halfWidth.set( light.width * 0.5, 0.0, 0.0 );\n\t\t\t\tuniforms.halfHeight.set( 0.0, light.height * 0.5, 0.0 );\n\n\t\t\t\tstate.rectArea[ rectAreaLength ] = uniforms;\n\n\t\t\t\trectAreaLength ++;\n\n\t\t\t} else if ( light.isPointLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.color.copy( light.color ).multiplyScalar( light.intensity );\n\t\t\t\tuniforms.distance = light.distance;\n\t\t\t\tuniforms.decay = light.decay;\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\tconst shadow = light.shadow;\n\n\t\t\t\t\tconst shadowUniforms = shadowCache.get( light );\n\n\t\t\t\t\tshadowUniforms.shadowIntensity = shadow.intensity;\n\t\t\t\t\tshadowUniforms.shadowBias = shadow.bias;\n\t\t\t\t\tshadowUniforms.shadowNormalBias = shadow.normalBias;\n\t\t\t\t\tshadowUniforms.shadowRadius = shadow.radius;\n\t\t\t\t\tshadowUniforms.shadowMapSize = shadow.mapSize;\n\t\t\t\t\tshadowUniforms.shadowCameraNear = shadow.camera.near;\n\t\t\t\t\tshadowUniforms.shadowCameraFar = shadow.camera.far;\n\n\t\t\t\t\tstate.pointShadow[ pointLength ] = shadowUniforms;\n\t\t\t\t\tstate.pointShadowMap[ pointLength ] = shadowMap;\n\t\t\t\t\tstate.pointShadowMatrix[ pointLength ] = light.shadow.matrix;\n\n\t\t\t\t\tnumPointShadows ++;\n\n\t\t\t\t}\n\n\t\t\t\tstate.point[ pointLength ] = uniforms;\n\n\t\t\t\tpointLength ++;\n\n\t\t\t} else if ( light.isHemisphereLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.skyColor.copy( light.color ).multiplyScalar( intensity );\n\t\t\t\tuniforms.groundColor.copy( light.groundColor ).multiplyScalar( intensity );\n\n\t\t\t\tstate.hemi[ hemiLength ] = uniforms;\n\n\t\t\t\themiLength ++;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( rectAreaLength > 0 ) {\n\n\t\t\tif ( extensions.has( 'OES_texture_float_linear' ) === true ) {\n\n\t\t\t\tstate.rectAreaLTC1 = UniformsLib.LTC_FLOAT_1;\n\t\t\t\tstate.rectAreaLTC2 = UniformsLib.LTC_FLOAT_2;\n\n\t\t\t} else {\n\n\t\t\t\tstate.rectAreaLTC1 = UniformsLib.LTC_HALF_1;\n\t\t\t\tstate.rectAreaLTC2 = UniformsLib.LTC_HALF_2;\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.ambient[ 0 ] = r;\n\t\tstate.ambient[ 1 ] = g;\n\t\tstate.ambient[ 2 ] = b;\n\n\t\tconst hash = state.hash;\n\n\t\tif ( hash.directionalLength !== directionalLength ||\n\t\t\thash.pointLength !== pointLength ||\n\t\t\thash.spotLength !== spotLength ||\n\t\t\thash.rectAreaLength !== rectAreaLength ||\n\t\t\thash.hemiLength !== hemiLength ||\n\t\t\thash.numDirectionalShadows !== numDirectionalShadows ||\n\t\t\thash.numPointShadows !== numPointShadows ||\n\t\t\thash.numSpotShadows !== numSpotShadows ||\n\t\t\thash.numSpotMaps !== numSpotMaps ||\n\t\t\thash.numLightProbes !== numLightProbes ) {\n\n\t\t\tstate.directional.length = directionalLength;\n\t\t\tstate.spot.length = spotLength;\n\t\t\tstate.rectArea.length = rectAreaLength;\n\t\t\tstate.point.length = pointLength;\n\t\t\tstate.hemi.length = hemiLength;\n\n\t\t\tstate.directionalShadow.length = numDirectionalShadows;\n\t\t\tstate.directionalShadowMap.length = numDirectionalShadows;\n\t\t\tstate.pointShadow.length = numPointShadows;\n\t\t\tstate.pointShadowMap.length = numPointShadows;\n\t\t\tstate.spotShadow.length = numSpotShadows;\n\t\t\tstate.spotShadowMap.length = numSpotShadows;\n\t\t\tstate.directionalShadowMatrix.length = numDirectionalShadows;\n\t\t\tstate.pointShadowMatrix.length = numPointShadows;\n\t\t\tstate.spotLightMatrix.length = numSpotShadows + numSpotMaps - numSpotShadowsWithMaps;\n\t\t\tstate.spotLightMap.length = numSpotMaps;\n\t\t\tstate.numSpotLightShadowsWithMaps = numSpotShadowsWithMaps;\n\t\t\tstate.numLightProbes = numLightProbes;\n\n\t\t\thash.directionalLength = directionalLength;\n\t\t\thash.pointLength = pointLength;\n\t\t\thash.spotLength = spotLength;\n\t\t\thash.rectAreaLength = rectAreaLength;\n\t\t\thash.hemiLength = hemiLength;\n\n\t\t\thash.numDirectionalShadows = numDirectionalShadows;\n\t\t\thash.numPointShadows = numPointShadows;\n\t\t\thash.numSpotShadows = numSpotShadows;\n\t\t\thash.numSpotMaps = numSpotMaps;\n\n\t\t\thash.numLightProbes = numLightProbes;\n\n\t\t\tstate.version = nextVersion ++;\n\n\t\t}\n\n\t}\n\n\tfunction setupView( lights, camera ) {\n\n\t\tlet directionalLength = 0;\n\t\tlet pointLength = 0;\n\t\tlet spotLength = 0;\n\t\tlet rectAreaLength = 0;\n\t\tlet hemiLength = 0;\n\n\t\tconst viewMatrix = camera.matrixWorldInverse;\n\n\t\tfor ( let i = 0, l = lights.length; i < l; i ++ ) {\n\n\t\t\tconst light = lights[ i ];\n\n\t\t\tif ( light.isDirectionalLight ) {\n\n\t\t\t\tconst uniforms = state.directional[ directionalLength ];\n\n\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tvector3.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\tuniforms.direction.sub( vector3 );\n\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\tdirectionalLength ++;\n\n\t\t\t} else if ( light.isSpotLight ) {\n\n\t\t\t\tconst uniforms = state.spot[ spotLength ];\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tvector3.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\tuniforms.direction.sub( vector3 );\n\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\tspotLength ++;\n\n\t\t\t} else if ( light.isRectAreaLight ) {\n\n\t\t\t\tconst uniforms = state.rectArea[ rectAreaLength ];\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\t// extract local rotation of light to derive width/height half vectors\n\t\t\t\tmatrix42.identity();\n\t\t\t\tmatrix4.copy( light.matrixWorld );\n\t\t\t\tmatrix4.premultiply( viewMatrix );\n\t\t\t\tmatrix42.extractRotation( matrix4 );\n\n\t\t\t\tuniforms.halfWidth.set( light.width * 0.5, 0.0, 0.0 );\n\t\t\t\tuniforms.halfHeight.set( 0.0, light.height * 0.5, 0.0 );\n\n\t\t\t\tuniforms.halfWidth.applyMatrix4( matrix42 );\n\t\t\t\tuniforms.halfHeight.applyMatrix4( matrix42 );\n\n\t\t\t\trectAreaLength ++;\n\n\t\t\t} else if ( light.isPointLight ) {\n\n\t\t\t\tconst uniforms = state.point[ pointLength ];\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\tpointLength ++;\n\n\t\t\t} else if ( light.isHemisphereLight ) {\n\n\t\t\t\tconst uniforms = state.hemi[ hemiLength ];\n\n\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\themiLength ++;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn {\n\t\tsetup: setup,\n\t\tsetupView: setupView,\n\t\tstate: state\n\t};\n\n}\n\nfunction WebGLRenderState( extensions ) {\n\n\tconst lights = new WebGLLights( extensions );\n\n\tconst lightsArray = [];\n\tconst shadowsArray = [];\n\n\tfunction init( camera ) {\n\n\t\tstate.camera = camera;\n\n\t\tlightsArray.length = 0;\n\t\tshadowsArray.length = 0;\n\n\t}\n\n\tfunction pushLight( light ) {\n\n\t\tlightsArray.push( light );\n\n\t}\n\n\tfunction pushShadow( shadowLight ) {\n\n\t\tshadowsArray.push( shadowLight );\n\n\t}\n\n\tfunction setupLights() {\n\n\t\tlights.setup( lightsArray );\n\n\t}\n\n\tfunction setupLightsView( camera ) {\n\n\t\tlights.setupView( lightsArray, camera );\n\n\t}\n\n\tconst state = {\n\t\tlightsArray: lightsArray,\n\t\tshadowsArray: shadowsArray,\n\n\t\tcamera: null,\n\n\t\tlights: lights,\n\n\t\ttransmissionRenderTarget: {}\n\t};\n\n\treturn {\n\t\tinit: init,\n\t\tstate: state,\n\t\tsetupLights: setupLights,\n\t\tsetupLightsView: setupLightsView,\n\n\t\tpushLight: pushLight,\n\t\tpushShadow: pushShadow\n\t};\n\n}\n\nfunction WebGLRenderStates( extensions ) {\n\n\tlet renderStates = new WeakMap();\n\n\tfunction get( scene, renderCallDepth = 0 ) {\n\n\t\tconst renderStateArray = renderStates.get( scene );\n\t\tlet renderState;\n\n\t\tif ( renderStateArray === undefined ) {\n\n\t\t\trenderState = new WebGLRenderState( extensions );\n\t\t\trenderStates.set( scene, [ renderState ] );\n\n\t\t} else {\n\n\t\t\tif ( renderCallDepth >= renderStateArray.length ) {\n\n\t\t\t\trenderState = new WebGLRenderState( extensions );\n\t\t\t\trenderStateArray.push( renderState );\n\n\t\t\t} else {\n\n\t\t\t\trenderState = renderStateArray[ renderCallDepth ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn renderState;\n\n\t}\n\n\tfunction dispose() {\n\n\t\trenderStates = new WeakMap();\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\nconst vertex = \"void main() {\\n\\tgl_Position = vec4( position, 1.0 );\\n}\";\n\nconst fragment = \"uniform sampler2D shadow_pass;\\nuniform vec2 resolution;\\nuniform float radius;\\n#include <packing>\\nvoid main() {\\n\\tconst float samples = float( VSM_SAMPLES );\\n\\tfloat mean = 0.0;\\n\\tfloat squared_mean = 0.0;\\n\\tfloat uvStride = samples <= 1.0 ? 0.0 : 2.0 / ( samples - 1.0 );\\n\\tfloat uvStart = samples <= 1.0 ? 0.0 : - 1.0;\\n\\tfor ( float i = 0.0; i < samples; i ++ ) {\\n\\t\\tfloat uvOffset = uvStart + i * uvStride;\\n\\t\\t#ifdef HORIZONTAL_PASS\\n\\t\\t\\tvec2 distribution = unpackRGBATo2Half( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( uvOffset, 0.0 ) * radius ) / resolution ) );\\n\\t\\t\\tmean += distribution.x;\\n\\t\\t\\tsquared_mean += distribution.y * distribution.y + distribution.x * distribution.x;\\n\\t\\t#else\\n\\t\\t\\tfloat depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0, uvOffset ) * radius ) / resolution ) );\\n\\t\\t\\tmean += depth;\\n\\t\\t\\tsquared_mean += depth * depth;\\n\\t\\t#endif\\n\\t}\\n\\tmean = mean / samples;\\n\\tsquared_mean = squared_mean / samples;\\n\\tfloat std_dev = sqrt( squared_mean - mean * mean );\\n\\tgl_FragColor = pack2HalfToRGBA( vec2( mean, std_dev ) );\\n}\";\n\nfunction WebGLShadowMap( renderer, objects, capabilities ) {\n\n\tlet _frustum = new Frustum();\n\n\tconst _shadowMapSize = new Vector2(),\n\t\t_viewportSize = new Vector2(),\n\n\t\t_viewport = new Vector4(),\n\n\t\t_depthMaterial = new MeshDepthMaterial( { depthPacking: RGBADepthPacking } ),\n\t\t_distanceMaterial = new MeshDistanceMaterial(),\n\n\t\t_materialCache = {},\n\n\t\t_maxTextureSize = capabilities.maxTextureSize;\n\n\tconst shadowSide = { [ FrontSide ]: BackSide, [ BackSide ]: FrontSide, [ DoubleSide ]: DoubleSide };\n\n\tconst shadowMaterialVertical = new ShaderMaterial( {\n\t\tdefines: {\n\t\t\tVSM_SAMPLES: 8\n\t\t},\n\t\tuniforms: {\n\t\t\tshadow_pass: { value: null },\n\t\t\tresolution: { value: new Vector2() },\n\t\t\tradius: { value: 4.0 }\n\t\t},\n\n\t\tvertexShader: vertex,\n\t\tfragmentShader: fragment\n\n\t} );\n\n\tconst shadowMaterialHorizontal = shadowMaterialVertical.clone();\n\tshadowMaterialHorizontal.defines.HORIZONTAL_PASS = 1;\n\n\tconst fullScreenTri = new BufferGeometry();\n\tfullScreenTri.setAttribute(\n\t\t'position',\n\t\tnew BufferAttribute(\n\t\t\tnew Float32Array( [ -1, -1, 0.5, 3, -1, 0.5, -1, 3, 0.5 ] ),\n\t\t\t3\n\t\t)\n\t);\n\n\tconst fullScreenMesh = new Mesh( fullScreenTri, shadowMaterialVertical );\n\n\tconst scope = this;\n\n\tthis.enabled = false;\n\n\tthis.autoUpdate = true;\n\tthis.needsUpdate = false;\n\n\tthis.type = PCFShadowMap;\n\tlet _previousType = this.type;\n\n\tthis.render = function ( lights, scene, camera ) {\n\n\t\tif ( scope.enabled === false ) return;\n\t\tif ( scope.autoUpdate === false && scope.needsUpdate === false ) return;\n\n\t\tif ( lights.length === 0 ) return;\n\n\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\t\tconst activeCubeFace = renderer.getActiveCubeFace();\n\t\tconst activeMipmapLevel = renderer.getActiveMipmapLevel();\n\n\t\tconst _state = renderer.state;\n\n\t\t// Set GL state for depth map.\n\t\t_state.setBlending( NoBlending );\n\n\t\tif ( _state.buffers.depth.getReversed() === true ) {\n\n\t\t\t_state.buffers.color.setClear( 0, 0, 0, 0 );\n\n\t\t} else {\n\n\t\t\t_state.buffers.color.setClear( 1, 1, 1, 1 );\n\n\t\t}\n\n\t\t_state.buffers.depth.setTest( true );\n\t\t_state.setScissorTest( false );\n\n\t\t// check for shadow map type changes\n\n\t\tconst toVSM = ( _previousType !== VSMShadowMap && this.type === VSMShadowMap );\n\t\tconst fromVSM = ( _previousType === VSMShadowMap && this.type !== VSMShadowMap );\n\n\t\t// render depth map\n\n\t\tfor ( let i = 0, il = lights.length; i < il; i ++ ) {\n\n\t\t\tconst light = lights[ i ];\n\t\t\tconst shadow = light.shadow;\n\n\t\t\tif ( shadow === undefined ) {\n\n\t\t\t\twarn( 'WebGLShadowMap:', light, 'has no shadow.' );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tif ( shadow.autoUpdate === false && shadow.needsUpdate === false ) continue;\n\n\t\t\t_shadowMapSize.copy( shadow.mapSize );\n\n\t\t\tconst shadowFrameExtents = shadow.getFrameExtents();\n\n\t\t\t_shadowMapSize.multiply( shadowFrameExtents );\n\n\t\t\t_viewportSize.copy( shadow.mapSize );\n\n\t\t\tif ( _shadowMapSize.x > _maxTextureSize || _shadowMapSize.y > _maxTextureSize ) {\n\n\t\t\t\tif ( _shadowMapSize.x > _maxTextureSize ) {\n\n\t\t\t\t\t_viewportSize.x = Math.floor( _maxTextureSize / shadowFrameExtents.x );\n\t\t\t\t\t_shadowMapSize.x = _viewportSize.x * shadowFrameExtents.x;\n\t\t\t\t\tshadow.mapSize.x = _viewportSize.x;\n\n\t\t\t\t}\n\n\t\t\t\tif ( _shadowMapSize.y > _maxTextureSize ) {\n\n\t\t\t\t\t_viewportSize.y = Math.floor( _maxTextureSize / shadowFrameExtents.y );\n\t\t\t\t\t_shadowMapSize.y = _viewportSize.y * shadowFrameExtents.y;\n\t\t\t\t\tshadow.mapSize.y = _viewportSize.y;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( shadow.map === null || toVSM === true || fromVSM === true ) {\n\n\t\t\t\tconst pars = ( this.type !== VSMShadowMap ) ? { minFilter: NearestFilter, magFilter: NearestFilter } : {};\n\n\t\t\t\tif ( shadow.map !== null ) {\n\n\t\t\t\t\tshadow.map.dispose();\n\n\t\t\t\t}\n\n\t\t\t\tshadow.map = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y, pars );\n\t\t\t\tshadow.map.texture.name = light.name + '.shadowMap';\n\n\t\t\t\tshadow.camera.updateProjectionMatrix();\n\n\t\t\t}\n\n\t\t\trenderer.setRenderTarget( shadow.map );\n\t\t\trenderer.clear();\n\n\t\t\tconst viewportCount = shadow.getViewportCount();\n\n\t\t\tfor ( let vp = 0; vp < viewportCount; vp ++ ) {\n\n\t\t\t\tconst viewport = shadow.getViewport( vp );\n\n\t\t\t\t_viewport.set(\n\t\t\t\t\t_viewportSize.x * viewport.x,\n\t\t\t\t\t_viewportSize.y * viewport.y,\n\t\t\t\t\t_viewportSize.x * viewport.z,\n\t\t\t\t\t_viewportSize.y * viewport.w\n\t\t\t\t);\n\n\t\t\t\t_state.viewport( _viewport );\n\n\t\t\t\tshadow.updateMatrices( light, vp );\n\n\t\t\t\t_frustum = shadow.getFrustum();\n\n\t\t\t\trenderObject( scene, camera, shadow.camera, light, this.type );\n\n\t\t\t}\n\n\t\t\t// do blur pass for VSM\n\n\t\t\tif ( shadow.isPointLightShadow !== true && this.type === VSMShadowMap ) {\n\n\t\t\t\tVSMPass( shadow, camera );\n\n\t\t\t}\n\n\t\t\tshadow.needsUpdate = false;\n\n\t\t}\n\n\t\t_previousType = this.type;\n\n\t\tscope.needsUpdate = false;\n\n\t\trenderer.setRenderTarget( currentRenderTarget, activeCubeFace, activeMipmapLevel );\n\n\t};\n\n\tfunction VSMPass( shadow, camera ) {\n\n\t\tconst geometry = objects.update( fullScreenMesh );\n\n\t\tif ( shadowMaterialVertical.defines.VSM_SAMPLES !== shadow.blurSamples ) {\n\n\t\t\tshadowMaterialVertical.defines.VSM_SAMPLES = shadow.blurSamples;\n\t\t\tshadowMaterialHorizontal.defines.VSM_SAMPLES = shadow.blurSamples;\n\n\t\t\tshadowMaterialVertical.needsUpdate = true;\n\t\t\tshadowMaterialHorizontal.needsUpdate = true;\n\n\t\t}\n\n\t\tif ( shadow.mapPass === null ) {\n\n\t\t\tshadow.mapPass = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y );\n\n\t\t}\n\n\t\t// vertical pass\n\n\t\tshadowMaterialVertical.uniforms.shadow_pass.value = shadow.map.texture;\n\t\tshadowMaterialVertical.uniforms.resolution.value = shadow.mapSize;\n\t\tshadowMaterialVertical.uniforms.radius.value = shadow.radius;\n\t\trenderer.setRenderTarget( shadow.mapPass );\n\t\trenderer.clear();\n\t\trenderer.renderBufferDirect( camera, null, geometry, shadowMaterialVertical, fullScreenMesh, null );\n\n\t\t// horizontal pass\n\n\t\tshadowMaterialHorizontal.uniforms.shadow_pass.value = shadow.mapPass.texture;\n\t\tshadowMaterialHorizontal.uniforms.resolution.value = shadow.mapSize;\n\t\tshadowMaterialHorizontal.uniforms.radius.value = shadow.radius;\n\t\trenderer.setRenderTarget( shadow.map );\n\t\trenderer.clear();\n\t\trenderer.renderBufferDirect( camera, null, geometry, shadowMaterialHorizontal, fullScreenMesh, null );\n\n\t}\n\n\tfunction getDepthMaterial( object, material, light, type ) {\n\n\t\tlet result = null;\n\n\t\tconst customMaterial = ( light.isPointLight === true ) ? object.customDistanceMaterial : object.customDepthMaterial;\n\n\t\tif ( customMaterial !== undefined ) {\n\n\t\t\tresult = customMaterial;\n\n\t\t} else {\n\n\t\t\tresult = ( light.isPointLight === true ) ? _distanceMaterial : _depthMaterial;\n\n\t\t\tif ( ( renderer.localClippingEnabled && material.clipShadows === true && Array.isArray( material.clippingPlanes ) && material.clippingPlanes.length !== 0 ) ||\n\t\t\t\t( material.displacementMap && material.displacementScale !== 0 ) ||\n\t\t\t\t( material.alphaMap && material.alphaTest > 0 ) ||\n\t\t\t\t( material.map && material.alphaTest > 0 ) ||\n\t\t\t\t( material.alphaToCoverage === true ) ) {\n\n\t\t\t\t// in this case we need a unique material instance reflecting the\n\t\t\t\t// appropriate state\n\n\t\t\t\tconst keyA = result.uuid, keyB = material.uuid;\n\n\t\t\t\tlet materialsForVariant = _materialCache[ keyA ];\n\n\t\t\t\tif ( materialsForVariant === undefined ) {\n\n\t\t\t\t\tmaterialsForVariant = {};\n\t\t\t\t\t_materialCache[ keyA ] = materialsForVariant;\n\n\t\t\t\t}\n\n\t\t\t\tlet cachedMaterial = materialsForVariant[ keyB ];\n\n\t\t\t\tif ( cachedMaterial === undefined ) {\n\n\t\t\t\t\tcachedMaterial = result.clone();\n\t\t\t\t\tmaterialsForVariant[ keyB ] = cachedMaterial;\n\t\t\t\t\tmaterial.addEventListener( 'dispose', onMaterialDispose );\n\n\t\t\t\t}\n\n\t\t\t\tresult = cachedMaterial;\n\n\t\t\t}\n\n\t\t}\n\n\t\tresult.visible = material.visible;\n\t\tresult.wireframe = material.wireframe;\n\n\t\tif ( type === VSMShadowMap ) {\n\n\t\t\tresult.side = ( material.shadowSide !== null ) ? material.shadowSide : material.side;\n\n\t\t} else {\n\n\t\t\tresult.side = ( material.shadowSide !== null ) ? material.shadowSide : shadowSide[ material.side ];\n\n\t\t}\n\n\t\tresult.alphaMap = material.alphaMap;\n\t\tresult.alphaTest = ( material.alphaToCoverage === true ) ? 0.5 : material.alphaTest; // approximate alphaToCoverage by using a fixed alphaTest value\n\t\tresult.map = material.map;\n\n\t\tresult.clipShadows = material.clipShadows;\n\t\tresult.clippingPlanes = material.clippingPlanes;\n\t\tresult.clipIntersection = material.clipIntersection;\n\n\t\tresult.displacementMap = material.displacementMap;\n\t\tresult.displacementScale = material.displacementScale;\n\t\tresult.displacementBias = material.displacementBias;\n\n\t\tresult.wireframeLinewidth = material.wireframeLinewidth;\n\t\tresult.linewidth = material.linewidth;\n\n\t\tif ( light.isPointLight === true && result.isMeshDistanceMaterial === true ) {\n\n\t\t\tconst materialProperties = renderer.properties.get( result );\n\t\t\tmaterialProperties.light = light;\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\tfunction renderObject( object, camera, shadowCamera, light, type ) {\n\n\t\tif ( object.visible === false ) return;\n\n\t\tconst visible = object.layers.test( camera.layers );\n\n\t\tif ( visible && ( object.isMesh || object.isLine || object.isPoints ) ) {\n\n\t\t\tif ( ( object.castShadow || ( object.receiveShadow && type === VSMShadowMap ) ) && ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) ) {\n\n\t\t\t\tobject.modelViewMatrix.multiplyMatrices( shadowCamera.matrixWorldInverse, object.matrixWorld );\n\n\t\t\t\tconst geometry = objects.update( object );\n\t\t\t\tconst material = object.material;\n\n\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\tconst groups = geometry.groups;\n\n\t\t\t\t\tfor ( let k = 0, kl = groups.length; k < kl; k ++ ) {\n\n\t\t\t\t\t\tconst group = groups[ k ];\n\t\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\t\tif ( groupMaterial && groupMaterial.visible ) {\n\n\t\t\t\t\t\t\tconst depthMaterial = getDepthMaterial( object, groupMaterial, light, type );\n\n\t\t\t\t\t\t\tobject.onBeforeShadow( renderer, object, camera, shadowCamera, geometry, depthMaterial, group );\n\n\t\t\t\t\t\t\trenderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, group );\n\n\t\t\t\t\t\t\tobject.onAfterShadow( renderer, object, camera, shadowCamera, geometry, depthMaterial, group );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( material.visible ) {\n\n\t\t\t\t\tconst depthMaterial = getDepthMaterial( object, material, light, type );\n\n\t\t\t\t\tobject.onBeforeShadow( renderer, object, camera, shadowCamera, geometry, depthMaterial, null );\n\n\t\t\t\t\trenderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, null );\n\n\t\t\t\t\tobject.onAfterShadow( renderer, object, camera, shadowCamera, geometry, depthMaterial, null );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst children = object.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\trenderObject( children[ i ], camera, shadowCamera, light, type );\n\n\t\t}\n\n\t}\n\n\tfunction onMaterialDispose( event ) {\n\n\t\tconst material = event.target;\n\n\t\tmaterial.removeEventListener( 'dispose', onMaterialDispose );\n\n\t\t// make sure to remove the unique distance/depth materials used for shadow map rendering\n\n\t\tfor ( const id in _materialCache ) {\n\n\t\t\tconst cache = _materialCache[ id ];\n\n\t\t\tconst uuid = event.target.uuid;\n\n\t\t\tif ( uuid in cache ) {\n\n\t\t\t\tconst shadowMaterial = cache[ uuid ];\n\t\t\t\tshadowMaterial.dispose();\n\t\t\t\tdelete cache[ uuid ];\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nconst reversedFuncs = {\n\t[ NeverDepth ]: AlwaysDepth,\n\t[ LessDepth ]: GreaterDepth,\n\t[ EqualDepth ]: NotEqualDepth,\n\t[ LessEqualDepth ]: GreaterEqualDepth,\n\n\t[ AlwaysDepth ]: NeverDepth,\n\t[ GreaterDepth ]: LessDepth,\n\t[ NotEqualDepth ]: EqualDepth,\n\t[ GreaterEqualDepth ]: LessEqualDepth,\n};\n\nfunction WebGLState( gl, extensions ) {\n\n\tfunction ColorBuffer() {\n\n\t\tlet locked = false;\n\n\t\tconst color = new Vector4();\n\t\tlet currentColorMask = null;\n\t\tconst currentColorClear = new Vector4( 0, 0, 0, 0 );\n\n\t\treturn {\n\n\t\t\tsetMask: function ( colorMask ) {\n\n\t\t\t\tif ( currentColorMask !== colorMask && ! locked ) {\n\n\t\t\t\t\tgl.colorMask( colorMask, colorMask, colorMask, colorMask );\n\t\t\t\t\tcurrentColorMask = colorMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\tlocked = lock;\n\n\t\t\t},\n\n\t\t\tsetClear: function ( r, g, b, a, premultipliedAlpha ) {\n\n\t\t\t\tif ( premultipliedAlpha === true ) {\n\n\t\t\t\t\tr *= a; g *= a; b *= a;\n\n\t\t\t\t}\n\n\t\t\t\tcolor.set( r, g, b, a );\n\n\t\t\t\tif ( currentColorClear.equals( color ) === false ) {\n\n\t\t\t\t\tgl.clearColor( r, g, b, a );\n\t\t\t\t\tcurrentColorClear.copy( color );\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\treset: function () {\n\n\t\t\t\tlocked = false;\n\n\t\t\t\tcurrentColorMask = null;\n\t\t\t\tcurrentColorClear.set( -1, 0, 0, 0 ); // set to invalid state\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\tfunction DepthBuffer() {\n\n\t\tlet locked = false;\n\n\t\tlet currentReversed = false;\n\t\tlet currentDepthMask = null;\n\t\tlet currentDepthFunc = null;\n\t\tlet currentDepthClear = null;\n\n\t\treturn {\n\n\t\t\tsetReversed: function ( reversed ) {\n\n\t\t\t\tif ( currentReversed !== reversed ) {\n\n\t\t\t\t\tconst ext = extensions.get( 'EXT_clip_control' );\n\n\t\t\t\t\tif ( reversed ) {\n\n\t\t\t\t\t\text.clipControlEXT( ext.LOWER_LEFT_EXT, ext.ZERO_TO_ONE_EXT );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\text.clipControlEXT( ext.LOWER_LEFT_EXT, ext.NEGATIVE_ONE_TO_ONE_EXT );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcurrentReversed = reversed;\n\n\t\t\t\t\tconst oldDepth = currentDepthClear;\n\t\t\t\t\tcurrentDepthClear = null;\n\t\t\t\t\tthis.setClear( oldDepth );\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tgetReversed: function () {\n\n\t\t\t\treturn currentReversed;\n\n\t\t\t},\n\n\t\t\tsetTest: function ( depthTest ) {\n\n\t\t\t\tif ( depthTest ) {\n\n\t\t\t\t\tenable( gl.DEPTH_TEST );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tdisable( gl.DEPTH_TEST );\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetMask: function ( depthMask ) {\n\n\t\t\t\tif ( currentDepthMask !== depthMask && ! locked ) {\n\n\t\t\t\t\tgl.depthMask( depthMask );\n\t\t\t\t\tcurrentDepthMask = depthMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetFunc: function ( depthFunc ) {\n\n\t\t\t\tif ( currentReversed ) depthFunc = reversedFuncs[ depthFunc ];\n\n\t\t\t\tif ( currentDepthFunc !== depthFunc ) {\n\n\t\t\t\t\tswitch ( depthFunc ) {\n\n\t\t\t\t\t\tcase NeverDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.NEVER );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase AlwaysDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.ALWAYS );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase LessDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.LESS );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase LessEqualDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.LEQUAL );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase EqualDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.EQUAL );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase GreaterEqualDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.GEQUAL );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase GreaterDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.GREATER );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase NotEqualDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.NOTEQUAL );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.LEQUAL );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcurrentDepthFunc = depthFunc;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\tlocked = lock;\n\n\t\t\t},\n\n\t\t\tsetClear: function ( depth ) {\n\n\t\t\t\tif ( currentDepthClear !== depth ) {\n\n\t\t\t\t\tif ( currentReversed ) {\n\n\t\t\t\t\t\tdepth = 1 - depth;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tgl.clearDepth( depth );\n\t\t\t\t\tcurrentDepthClear = depth;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\treset: function () {\n\n\t\t\t\tlocked = false;\n\n\t\t\t\tcurrentDepthMask = null;\n\t\t\t\tcurrentDepthFunc = null;\n\t\t\t\tcurrentDepthClear = null;\n\t\t\t\tcurrentReversed = false;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\tfunction StencilBuffer() {\n\n\t\tlet locked = false;\n\n\t\tlet currentStencilMask = null;\n\t\tlet currentStencilFunc = null;\n\t\tlet currentStencilRef = null;\n\t\tlet currentStencilFuncMask = null;\n\t\tlet currentStencilFail = null;\n\t\tlet currentStencilZFail = null;\n\t\tlet currentStencilZPass = null;\n\t\tlet currentStencilClear = null;\n\n\t\treturn {\n\n\t\t\tsetTest: function ( stencilTest ) {\n\n\t\t\t\tif ( ! locked ) {\n\n\t\t\t\t\tif ( stencilTest ) {\n\n\t\t\t\t\t\tenable( gl.STENCIL_TEST );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tdisable( gl.STENCIL_TEST );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetMask: function ( stencilMask ) {\n\n\t\t\t\tif ( currentStencilMask !== stencilMask && ! locked ) {\n\n\t\t\t\t\tgl.stencilMask( stencilMask );\n\t\t\t\t\tcurrentStencilMask = stencilMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetFunc: function ( stencilFunc, stencilRef, stencilMask ) {\n\n\t\t\t\tif ( currentStencilFunc !== stencilFunc ||\n\t\t\t\t     currentStencilRef !== stencilRef ||\n\t\t\t\t     currentStencilFuncMask !== stencilMask ) {\n\n\t\t\t\t\tgl.stencilFunc( stencilFunc, stencilRef, stencilMask );\n\n\t\t\t\t\tcurrentStencilFunc = stencilFunc;\n\t\t\t\t\tcurrentStencilRef = stencilRef;\n\t\t\t\t\tcurrentStencilFuncMask = stencilMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetOp: function ( stencilFail, stencilZFail, stencilZPass ) {\n\n\t\t\t\tif ( currentStencilFail !== stencilFail ||\n\t\t\t\t     currentStencilZFail !== stencilZFail ||\n\t\t\t\t     currentStencilZPass !== stencilZPass ) {\n\n\t\t\t\t\tgl.stencilOp( stencilFail, stencilZFail, stencilZPass );\n\n\t\t\t\t\tcurrentStencilFail = stencilFail;\n\t\t\t\t\tcurrentStencilZFail = stencilZFail;\n\t\t\t\t\tcurrentStencilZPass = stencilZPass;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\tlocked = lock;\n\n\t\t\t},\n\n\t\t\tsetClear: function ( stencil ) {\n\n\t\t\t\tif ( currentStencilClear !== stencil ) {\n\n\t\t\t\t\tgl.clearStencil( stencil );\n\t\t\t\t\tcurrentStencilClear = stencil;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\treset: function () {\n\n\t\t\t\tlocked = false;\n\n\t\t\t\tcurrentStencilMask = null;\n\t\t\t\tcurrentStencilFunc = null;\n\t\t\t\tcurrentStencilRef = null;\n\t\t\t\tcurrentStencilFuncMask = null;\n\t\t\t\tcurrentStencilFail = null;\n\t\t\t\tcurrentStencilZFail = null;\n\t\t\t\tcurrentStencilZPass = null;\n\t\t\t\tcurrentStencilClear = null;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t//\n\n\tconst colorBuffer = new ColorBuffer();\n\tconst depthBuffer = new DepthBuffer();\n\tconst stencilBuffer = new StencilBuffer();\n\n\tconst uboBindings = new WeakMap();\n\tconst uboProgramMap = new WeakMap();\n\n\tlet enabledCapabilities = {};\n\n\tlet currentBoundFramebuffers = {};\n\tlet currentDrawbuffers = new WeakMap();\n\tlet defaultDrawbuffers = [];\n\n\tlet currentProgram = null;\n\n\tlet currentBlendingEnabled = false;\n\tlet currentBlending = null;\n\tlet currentBlendEquation = null;\n\tlet currentBlendSrc = null;\n\tlet currentBlendDst = null;\n\tlet currentBlendEquationAlpha = null;\n\tlet currentBlendSrcAlpha = null;\n\tlet currentBlendDstAlpha = null;\n\tlet currentBlendColor = new Color( 0, 0, 0 );\n\tlet currentBlendAlpha = 0;\n\tlet currentPremultipledAlpha = false;\n\n\tlet currentFlipSided = null;\n\tlet currentCullFace = null;\n\n\tlet currentLineWidth = null;\n\n\tlet currentPolygonOffsetFactor = null;\n\tlet currentPolygonOffsetUnits = null;\n\n\tconst maxTextures = gl.getParameter( gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS );\n\n\tlet lineWidthAvailable = false;\n\tlet version = 0;\n\tconst glVersion = gl.getParameter( gl.VERSION );\n\n\tif ( glVersion.indexOf( 'WebGL' ) !== -1 ) {\n\n\t\tversion = parseFloat( /^WebGL (\\d)/.exec( glVersion )[ 1 ] );\n\t\tlineWidthAvailable = ( version >= 1.0 );\n\n\t} else if ( glVersion.indexOf( 'OpenGL ES' ) !== -1 ) {\n\n\t\tversion = parseFloat( /^OpenGL ES (\\d)/.exec( glVersion )[ 1 ] );\n\t\tlineWidthAvailable = ( version >= 2.0 );\n\n\t}\n\n\tlet currentTextureSlot = null;\n\tlet currentBoundTextures = {};\n\n\tconst scissorParam = gl.getParameter( gl.SCISSOR_BOX );\n\tconst viewportParam = gl.getParameter( gl.VIEWPORT );\n\n\tconst currentScissor = new Vector4().fromArray( scissorParam );\n\tconst currentViewport = new Vector4().fromArray( viewportParam );\n\n\tfunction createTexture( type, target, count, dimensions ) {\n\n\t\tconst data = new Uint8Array( 4 ); // 4 is required to match default unpack alignment of 4.\n\t\tconst texture = gl.createTexture();\n\n\t\tgl.bindTexture( type, texture );\n\t\tgl.texParameteri( type, gl.TEXTURE_MIN_FILTER, gl.NEAREST );\n\t\tgl.texParameteri( type, gl.TEXTURE_MAG_FILTER, gl.NEAREST );\n\n\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\tif ( type === gl.TEXTURE_3D || type === gl.TEXTURE_2D_ARRAY ) {\n\n\t\t\t\tgl.texImage3D( target, 0, gl.RGBA, 1, 1, dimensions, 0, gl.RGBA, gl.UNSIGNED_BYTE, data );\n\n\t\t\t} else {\n\n\t\t\t\tgl.texImage2D( target + i, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, data );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\tconst emptyTextures = {};\n\temptyTextures[ gl.TEXTURE_2D ] = createTexture( gl.TEXTURE_2D, gl.TEXTURE_2D, 1 );\n\temptyTextures[ gl.TEXTURE_CUBE_MAP ] = createTexture( gl.TEXTURE_CUBE_MAP, gl.TEXTURE_CUBE_MAP_POSITIVE_X, 6 );\n\temptyTextures[ gl.TEXTURE_2D_ARRAY ] = createTexture( gl.TEXTURE_2D_ARRAY, gl.TEXTURE_2D_ARRAY, 1, 1 );\n\temptyTextures[ gl.TEXTURE_3D ] = createTexture( gl.TEXTURE_3D, gl.TEXTURE_3D, 1, 1 );\n\n\t// init\n\n\tcolorBuffer.setClear( 0, 0, 0, 1 );\n\tdepthBuffer.setClear( 1 );\n\tstencilBuffer.setClear( 0 );\n\n\tenable( gl.DEPTH_TEST );\n\tdepthBuffer.setFunc( LessEqualDepth );\n\n\tsetFlipSided( false );\n\tsetCullFace( CullFaceBack );\n\tenable( gl.CULL_FACE );\n\n\tsetBlending( NoBlending );\n\n\t//\n\n\tfunction enable( id ) {\n\n\t\tif ( enabledCapabilities[ id ] !== true ) {\n\n\t\t\tgl.enable( id );\n\t\t\tenabledCapabilities[ id ] = true;\n\n\t\t}\n\n\t}\n\n\tfunction disable( id ) {\n\n\t\tif ( enabledCapabilities[ id ] !== false ) {\n\n\t\t\tgl.disable( id );\n\t\t\tenabledCapabilities[ id ] = false;\n\n\t\t}\n\n\t}\n\n\tfunction bindFramebuffer( target, framebuffer ) {\n\n\t\tif ( currentBoundFramebuffers[ target ] !== framebuffer ) {\n\n\t\t\tgl.bindFramebuffer( target, framebuffer );\n\n\t\t\tcurrentBoundFramebuffers[ target ] = framebuffer;\n\n\t\t\t// gl.DRAW_FRAMEBUFFER is equivalent to gl.FRAMEBUFFER\n\n\t\t\tif ( target === gl.DRAW_FRAMEBUFFER ) {\n\n\t\t\t\tcurrentBoundFramebuffers[ gl.FRAMEBUFFER ] = framebuffer;\n\n\t\t\t}\n\n\t\t\tif ( target === gl.FRAMEBUFFER ) {\n\n\t\t\t\tcurrentBoundFramebuffers[ gl.DRAW_FRAMEBUFFER ] = framebuffer;\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\tfunction drawBuffers( renderTarget, framebuffer ) {\n\n\t\tlet drawBuffers = defaultDrawbuffers;\n\n\t\tlet needsUpdate = false;\n\n\t\tif ( renderTarget ) {\n\n\t\t\tdrawBuffers = currentDrawbuffers.get( framebuffer );\n\n\t\t\tif ( drawBuffers === undefined ) {\n\n\t\t\t\tdrawBuffers = [];\n\t\t\t\tcurrentDrawbuffers.set( framebuffer, drawBuffers );\n\n\t\t\t}\n\n\t\t\tconst textures = renderTarget.textures;\n\n\t\t\tif ( drawBuffers.length !== textures.length || drawBuffers[ 0 ] !== gl.COLOR_ATTACHMENT0 ) {\n\n\t\t\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\t\t\tdrawBuffers[ i ] = gl.COLOR_ATTACHMENT0 + i;\n\n\t\t\t\t}\n\n\t\t\t\tdrawBuffers.length = textures.length;\n\n\t\t\t\tneedsUpdate = true;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( drawBuffers[ 0 ] !== gl.BACK ) {\n\n\t\t\t\tdrawBuffers[ 0 ] = gl.BACK;\n\n\t\t\t\tneedsUpdate = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( needsUpdate ) {\n\n\t\t\tgl.drawBuffers( drawBuffers );\n\n\t\t}\n\n\t}\n\n\tfunction useProgram( program ) {\n\n\t\tif ( currentProgram !== program ) {\n\n\t\t\tgl.useProgram( program );\n\n\t\t\tcurrentProgram = program;\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\tconst equationToGL = {\n\t\t[ AddEquation ]: gl.FUNC_ADD,\n\t\t[ SubtractEquation ]: gl.FUNC_SUBTRACT,\n\t\t[ ReverseSubtractEquation ]: gl.FUNC_REVERSE_SUBTRACT\n\t};\n\n\tequationToGL[ MinEquation ] = gl.MIN;\n\tequationToGL[ MaxEquation ] = gl.MAX;\n\n\tconst factorToGL = {\n\t\t[ ZeroFactor ]: gl.ZERO,\n\t\t[ OneFactor ]: gl.ONE,\n\t\t[ SrcColorFactor ]: gl.SRC_COLOR,\n\t\t[ SrcAlphaFactor ]: gl.SRC_ALPHA,\n\t\t[ SrcAlphaSaturateFactor ]: gl.SRC_ALPHA_SATURATE,\n\t\t[ DstColorFactor ]: gl.DST_COLOR,\n\t\t[ DstAlphaFactor ]: gl.DST_ALPHA,\n\t\t[ OneMinusSrcColorFactor ]: gl.ONE_MINUS_SRC_COLOR,\n\t\t[ OneMinusSrcAlphaFactor ]: gl.ONE_MINUS_SRC_ALPHA,\n\t\t[ OneMinusDstColorFactor ]: gl.ONE_MINUS_DST_COLOR,\n\t\t[ OneMinusDstAlphaFactor ]: gl.ONE_MINUS_DST_ALPHA,\n\t\t[ ConstantColorFactor ]: gl.CONSTANT_COLOR,\n\t\t[ OneMinusConstantColorFactor ]: gl.ONE_MINUS_CONSTANT_COLOR,\n\t\t[ ConstantAlphaFactor ]: gl.CONSTANT_ALPHA,\n\t\t[ OneMinusConstantAlphaFactor ]: gl.ONE_MINUS_CONSTANT_ALPHA\n\t};\n\n\tfunction setBlending( blending, blendEquation, blendSrc, blendDst, blendEquationAlpha, blendSrcAlpha, blendDstAlpha, blendColor, blendAlpha, premultipliedAlpha ) {\n\n\t\tif ( blending === NoBlending ) {\n\n\t\t\tif ( currentBlendingEnabled === true ) {\n\n\t\t\t\tdisable( gl.BLEND );\n\t\t\t\tcurrentBlendingEnabled = false;\n\n\t\t\t}\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( currentBlendingEnabled === false ) {\n\n\t\t\tenable( gl.BLEND );\n\t\t\tcurrentBlendingEnabled = true;\n\n\t\t}\n\n\t\tif ( blending !== CustomBlending ) {\n\n\t\t\tif ( blending !== currentBlending || premultipliedAlpha !== currentPremultipledAlpha ) {\n\n\t\t\t\tif ( currentBlendEquation !== AddEquation || currentBlendEquationAlpha !== AddEquation ) {\n\n\t\t\t\t\tgl.blendEquation( gl.FUNC_ADD );\n\n\t\t\t\t\tcurrentBlendEquation = AddEquation;\n\t\t\t\t\tcurrentBlendEquationAlpha = AddEquation;\n\n\t\t\t\t}\n\n\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\tswitch ( blending ) {\n\n\t\t\t\t\t\tcase NormalBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.ONE, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase AdditiveBlending:\n\t\t\t\t\t\t\tgl.blendFunc( gl.ONE, gl.ONE );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase SubtractiveBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.ZERO, gl.ONE_MINUS_SRC_COLOR, gl.ZERO, gl.ONE );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase MultiplyBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.DST_COLOR, gl.ONE_MINUS_SRC_ALPHA, gl.ZERO, gl.ONE );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\terror( 'WebGLState: Invalid blending: ', blending );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tswitch ( blending ) {\n\n\t\t\t\t\t\tcase NormalBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase AdditiveBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.SRC_ALPHA, gl.ONE, gl.ONE, gl.ONE );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase SubtractiveBlending:\n\t\t\t\t\t\t\terror( 'WebGLState: SubtractiveBlending requires material.premultipliedAlpha = true' );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase MultiplyBlending:\n\t\t\t\t\t\t\terror( 'WebGLState: MultiplyBlending requires material.premultipliedAlpha = true' );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\terror( 'WebGLState: Invalid blending: ', blending );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tcurrentBlendSrc = null;\n\t\t\t\tcurrentBlendDst = null;\n\t\t\t\tcurrentBlendSrcAlpha = null;\n\t\t\t\tcurrentBlendDstAlpha = null;\n\t\t\t\tcurrentBlendColor.set( 0, 0, 0 );\n\t\t\t\tcurrentBlendAlpha = 0;\n\n\t\t\t\tcurrentBlending = blending;\n\t\t\t\tcurrentPremultipledAlpha = premultipliedAlpha;\n\n\t\t\t}\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t// custom blending\n\n\t\tblendEquationAlpha = blendEquationAlpha || blendEquation;\n\t\tblendSrcAlpha = blendSrcAlpha || blendSrc;\n\t\tblendDstAlpha = blendDstAlpha || blendDst;\n\n\t\tif ( blendEquation !== currentBlendEquation || blendEquationAlpha !== currentBlendEquationAlpha ) {\n\n\t\t\tgl.blendEquationSeparate( equationToGL[ blendEquation ], equationToGL[ blendEquationAlpha ] );\n\n\t\t\tcurrentBlendEquation = blendEquation;\n\t\t\tcurrentBlendEquationAlpha = blendEquationAlpha;\n\n\t\t}\n\n\t\tif ( blendSrc !== currentBlendSrc || blendDst !== currentBlendDst || blendSrcAlpha !== currentBlendSrcAlpha || blendDstAlpha !== currentBlendDstAlpha ) {\n\n\t\t\tgl.blendFuncSeparate( factorToGL[ blendSrc ], factorToGL[ blendDst ], factorToGL[ blendSrcAlpha ], factorToGL[ blendDstAlpha ] );\n\n\t\t\tcurrentBlendSrc = blendSrc;\n\t\t\tcurrentBlendDst = blendDst;\n\t\t\tcurrentBlendSrcAlpha = blendSrcAlpha;\n\t\t\tcurrentBlendDstAlpha = blendDstAlpha;\n\n\t\t}\n\n\t\tif ( blendColor.equals( currentBlendColor ) === false || blendAlpha !== currentBlendAlpha ) {\n\n\t\t\tgl.blendColor( blendColor.r, blendColor.g, blendColor.b, blendAlpha );\n\n\t\t\tcurrentBlendColor.copy( blendColor );\n\t\t\tcurrentBlendAlpha = blendAlpha;\n\n\t\t}\n\n\t\tcurrentBlending = blending;\n\t\tcurrentPremultipledAlpha = false;\n\n\t}\n\n\tfunction setMaterial( material, frontFaceCW ) {\n\n\t\tmaterial.side === DoubleSide\n\t\t\t? disable( gl.CULL_FACE )\n\t\t\t: enable( gl.CULL_FACE );\n\n\t\tlet flipSided = ( material.side === BackSide );\n\t\tif ( frontFaceCW ) flipSided = ! flipSided;\n\n\t\tsetFlipSided( flipSided );\n\n\t\t( material.blending === NormalBlending && material.transparent === false )\n\t\t\t? setBlending( NoBlending )\n\t\t\t: setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.blendColor, material.blendAlpha, material.premultipliedAlpha );\n\n\t\tdepthBuffer.setFunc( material.depthFunc );\n\t\tdepthBuffer.setTest( material.depthTest );\n\t\tdepthBuffer.setMask( material.depthWrite );\n\t\tcolorBuffer.setMask( material.colorWrite );\n\n\t\tconst stencilWrite = material.stencilWrite;\n\t\tstencilBuffer.setTest( stencilWrite );\n\t\tif ( stencilWrite ) {\n\n\t\t\tstencilBuffer.setMask( material.stencilWriteMask );\n\t\t\tstencilBuffer.setFunc( material.stencilFunc, material.stencilRef, material.stencilFuncMask );\n\t\t\tstencilBuffer.setOp( material.stencilFail, material.stencilZFail, material.stencilZPass );\n\n\t\t}\n\n\t\tsetPolygonOffset( material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits );\n\n\t\tmaterial.alphaToCoverage === true\n\t\t\t? enable( gl.SAMPLE_ALPHA_TO_COVERAGE )\n\t\t\t: disable( gl.SAMPLE_ALPHA_TO_COVERAGE );\n\n\t}\n\n\t//\n\n\tfunction setFlipSided( flipSided ) {\n\n\t\tif ( currentFlipSided !== flipSided ) {\n\n\t\t\tif ( flipSided ) {\n\n\t\t\t\tgl.frontFace( gl.CW );\n\n\t\t\t} else {\n\n\t\t\t\tgl.frontFace( gl.CCW );\n\n\t\t\t}\n\n\t\t\tcurrentFlipSided = flipSided;\n\n\t\t}\n\n\t}\n\n\tfunction setCullFace( cullFace ) {\n\n\t\tif ( cullFace !== CullFaceNone ) {\n\n\t\t\tenable( gl.CULL_FACE );\n\n\t\t\tif ( cullFace !== currentCullFace ) {\n\n\t\t\t\tif ( cullFace === CullFaceBack ) {\n\n\t\t\t\t\tgl.cullFace( gl.BACK );\n\n\t\t\t\t} else if ( cullFace === CullFaceFront ) {\n\n\t\t\t\t\tgl.cullFace( gl.FRONT );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tgl.cullFace( gl.FRONT_AND_BACK );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tdisable( gl.CULL_FACE );\n\n\t\t}\n\n\t\tcurrentCullFace = cullFace;\n\n\t}\n\n\tfunction setLineWidth( width ) {\n\n\t\tif ( width !== currentLineWidth ) {\n\n\t\t\tif ( lineWidthAvailable ) gl.lineWidth( width );\n\n\t\t\tcurrentLineWidth = width;\n\n\t\t}\n\n\t}\n\n\tfunction setPolygonOffset( polygonOffset, factor, units ) {\n\n\t\tif ( polygonOffset ) {\n\n\t\t\tenable( gl.POLYGON_OFFSET_FILL );\n\n\t\t\tif ( currentPolygonOffsetFactor !== factor || currentPolygonOffsetUnits !== units ) {\n\n\t\t\t\tgl.polygonOffset( factor, units );\n\n\t\t\t\tcurrentPolygonOffsetFactor = factor;\n\t\t\t\tcurrentPolygonOffsetUnits = units;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tdisable( gl.POLYGON_OFFSET_FILL );\n\n\t\t}\n\n\t}\n\n\tfunction setScissorTest( scissorTest ) {\n\n\t\tif ( scissorTest ) {\n\n\t\t\tenable( gl.SCISSOR_TEST );\n\n\t\t} else {\n\n\t\t\tdisable( gl.SCISSOR_TEST );\n\n\t\t}\n\n\t}\n\n\t// texture\n\n\tfunction activeTexture( webglSlot ) {\n\n\t\tif ( webglSlot === undefined ) webglSlot = gl.TEXTURE0 + maxTextures - 1;\n\n\t\tif ( currentTextureSlot !== webglSlot ) {\n\n\t\t\tgl.activeTexture( webglSlot );\n\t\t\tcurrentTextureSlot = webglSlot;\n\n\t\t}\n\n\t}\n\n\tfunction bindTexture( webglType, webglTexture, webglSlot ) {\n\n\t\tif ( webglSlot === undefined ) {\n\n\t\t\tif ( currentTextureSlot === null ) {\n\n\t\t\t\twebglSlot = gl.TEXTURE0 + maxTextures - 1;\n\n\t\t\t} else {\n\n\t\t\t\twebglSlot = currentTextureSlot;\n\n\t\t\t}\n\n\t\t}\n\n\t\tlet boundTexture = currentBoundTextures[ webglSlot ];\n\n\t\tif ( boundTexture === undefined ) {\n\n\t\t\tboundTexture = { type: undefined, texture: undefined };\n\t\t\tcurrentBoundTextures[ webglSlot ] = boundTexture;\n\n\t\t}\n\n\t\tif ( boundTexture.type !== webglType || boundTexture.texture !== webglTexture ) {\n\n\t\t\tif ( currentTextureSlot !== webglSlot ) {\n\n\t\t\t\tgl.activeTexture( webglSlot );\n\t\t\t\tcurrentTextureSlot = webglSlot;\n\n\t\t\t}\n\n\t\t\tgl.bindTexture( webglType, webglTexture || emptyTextures[ webglType ] );\n\n\t\t\tboundTexture.type = webglType;\n\t\t\tboundTexture.texture = webglTexture;\n\n\t\t}\n\n\t}\n\n\tfunction unbindTexture() {\n\n\t\tconst boundTexture = currentBoundTextures[ currentTextureSlot ];\n\n\t\tif ( boundTexture !== undefined && boundTexture.type !== undefined ) {\n\n\t\t\tgl.bindTexture( boundTexture.type, null );\n\n\t\t\tboundTexture.type = undefined;\n\t\t\tboundTexture.texture = undefined;\n\n\t\t}\n\n\t}\n\n\tfunction compressedTexImage2D() {\n\n\t\ttry {\n\n\t\t\tgl.compressedTexImage2D( ...arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\terror( 'WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction compressedTexImage3D() {\n\n\t\ttry {\n\n\t\t\tgl.compressedTexImage3D( ...arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\terror( 'WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texSubImage2D() {\n\n\t\ttry {\n\n\t\t\tgl.texSubImage2D( ...arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\terror( 'WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texSubImage3D() {\n\n\t\ttry {\n\n\t\t\tgl.texSubImage3D( ...arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\terror( 'WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction compressedTexSubImage2D() {\n\n\t\ttry {\n\n\t\t\tgl.compressedTexSubImage2D( ...arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\terror( 'WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction compressedTexSubImage3D() {\n\n\t\ttry {\n\n\t\t\tgl.compressedTexSubImage3D( ...arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\terror( 'WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texStorage2D() {\n\n\t\ttry {\n\n\t\t\tgl.texStorage2D( ...arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\terror( 'WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texStorage3D() {\n\n\t\ttry {\n\n\t\t\tgl.texStorage3D( ...arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\terror( 'WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texImage2D() {\n\n\t\ttry {\n\n\t\t\tgl.texImage2D( ...arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\terror( 'WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texImage3D() {\n\n\t\ttry {\n\n\t\t\tgl.texImage3D( ...arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\terror( 'WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\t//\n\n\tfunction scissor( scissor ) {\n\n\t\tif ( currentScissor.equals( scissor ) === false ) {\n\n\t\t\tgl.scissor( scissor.x, scissor.y, scissor.z, scissor.w );\n\t\t\tcurrentScissor.copy( scissor );\n\n\t\t}\n\n\t}\n\n\tfunction viewport( viewport ) {\n\n\t\tif ( currentViewport.equals( viewport ) === false ) {\n\n\t\t\tgl.viewport( viewport.x, viewport.y, viewport.z, viewport.w );\n\t\t\tcurrentViewport.copy( viewport );\n\n\t\t}\n\n\t}\n\n\tfunction updateUBOMapping( uniformsGroup, program ) {\n\n\t\tlet mapping = uboProgramMap.get( program );\n\n\t\tif ( mapping === undefined ) {\n\n\t\t\tmapping = new WeakMap();\n\n\t\t\tuboProgramMap.set( program, mapping );\n\n\t\t}\n\n\t\tlet blockIndex = mapping.get( uniformsGroup );\n\n\t\tif ( blockIndex === undefined ) {\n\n\t\t\tblockIndex = gl.getUniformBlockIndex( program, uniformsGroup.name );\n\n\t\t\tmapping.set( uniformsGroup, blockIndex );\n\n\t\t}\n\n\t}\n\n\tfunction uniformBlockBinding( uniformsGroup, program ) {\n\n\t\tconst mapping = uboProgramMap.get( program );\n\t\tconst blockIndex = mapping.get( uniformsGroup );\n\n\t\tif ( uboBindings.get( program ) !== blockIndex ) {\n\n\t\t\t// bind shader specific block index to global block point\n\t\t\tgl.uniformBlockBinding( program, blockIndex, uniformsGroup.__bindingPointIndex );\n\n\t\t\tuboBindings.set( program, blockIndex );\n\n\t\t}\n\n\t}\n\n\t//\n\n\tfunction reset() {\n\n\t\t// reset state\n\n\t\tgl.disable( gl.BLEND );\n\t\tgl.disable( gl.CULL_FACE );\n\t\tgl.disable( gl.DEPTH_TEST );\n\t\tgl.disable( gl.POLYGON_OFFSET_FILL );\n\t\tgl.disable( gl.SCISSOR_TEST );\n\t\tgl.disable( gl.STENCIL_TEST );\n\t\tgl.disable( gl.SAMPLE_ALPHA_TO_COVERAGE );\n\n\t\tgl.blendEquation( gl.FUNC_ADD );\n\t\tgl.blendFunc( gl.ONE, gl.ZERO );\n\t\tgl.blendFuncSeparate( gl.ONE, gl.ZERO, gl.ONE, gl.ZERO );\n\t\tgl.blendColor( 0, 0, 0, 0 );\n\n\t\tgl.colorMask( true, true, true, true );\n\t\tgl.clearColor( 0, 0, 0, 0 );\n\n\t\tgl.depthMask( true );\n\t\tgl.depthFunc( gl.LESS );\n\n\t\tdepthBuffer.setReversed( false );\n\n\t\tgl.clearDepth( 1 );\n\n\t\tgl.stencilMask( 0xffffffff );\n\t\tgl.stencilFunc( gl.ALWAYS, 0, 0xffffffff );\n\t\tgl.stencilOp( gl.KEEP, gl.KEEP, gl.KEEP );\n\t\tgl.clearStencil( 0 );\n\n\t\tgl.cullFace( gl.BACK );\n\t\tgl.frontFace( gl.CCW );\n\n\t\tgl.polygonOffset( 0, 0 );\n\n\t\tgl.activeTexture( gl.TEXTURE0 );\n\n\t\tgl.bindFramebuffer( gl.FRAMEBUFFER, null );\n\t\tgl.bindFramebuffer( gl.DRAW_FRAMEBUFFER, null );\n\t\tgl.bindFramebuffer( gl.READ_FRAMEBUFFER, null );\n\n\t\tgl.useProgram( null );\n\n\t\tgl.lineWidth( 1 );\n\n\t\tgl.scissor( 0, 0, gl.canvas.width, gl.canvas.height );\n\t\tgl.viewport( 0, 0, gl.canvas.width, gl.canvas.height );\n\n\t\t// reset internals\n\n\t\tenabledCapabilities = {};\n\n\t\tcurrentTextureSlot = null;\n\t\tcurrentBoundTextures = {};\n\n\t\tcurrentBoundFramebuffers = {};\n\t\tcurrentDrawbuffers = new WeakMap();\n\t\tdefaultDrawbuffers = [];\n\n\t\tcurrentProgram = null;\n\n\t\tcurrentBlendingEnabled = false;\n\t\tcurrentBlending = null;\n\t\tcurrentBlendEquation = null;\n\t\tcurrentBlendSrc = null;\n\t\tcurrentBlendDst = null;\n\t\tcurrentBlendEquationAlpha = null;\n\t\tcurrentBlendSrcAlpha = null;\n\t\tcurrentBlendDstAlpha = null;\n\t\tcurrentBlendColor = new Color( 0, 0, 0 );\n\t\tcurrentBlendAlpha = 0;\n\t\tcurrentPremultipledAlpha = false;\n\n\t\tcurrentFlipSided = null;\n\t\tcurrentCullFace = null;\n\n\t\tcurrentLineWidth = null;\n\n\t\tcurrentPolygonOffsetFactor = null;\n\t\tcurrentPolygonOffsetUnits = null;\n\n\t\tcurrentScissor.set( 0, 0, gl.canvas.width, gl.canvas.height );\n\t\tcurrentViewport.set( 0, 0, gl.canvas.width, gl.canvas.height );\n\n\t\tcolorBuffer.reset();\n\t\tdepthBuffer.reset();\n\t\tstencilBuffer.reset();\n\n\t}\n\n\treturn {\n\n\t\tbuffers: {\n\t\t\tcolor: colorBuffer,\n\t\t\tdepth: depthBuffer,\n\t\t\tstencil: stencilBuffer\n\t\t},\n\n\t\tenable: enable,\n\t\tdisable: disable,\n\n\t\tbindFramebuffer: bindFramebuffer,\n\t\tdrawBuffers: drawBuffers,\n\n\t\tuseProgram: useProgram,\n\n\t\tsetBlending: setBlending,\n\t\tsetMaterial: setMaterial,\n\n\t\tsetFlipSided: setFlipSided,\n\t\tsetCullFace: setCullFace,\n\n\t\tsetLineWidth: setLineWidth,\n\t\tsetPolygonOffset: setPolygonOffset,\n\n\t\tsetScissorTest: setScissorTest,\n\n\t\tactiveTexture: activeTexture,\n\t\tbindTexture: bindTexture,\n\t\tunbindTexture: unbindTexture,\n\t\tcompressedTexImage2D: compressedTexImage2D,\n\t\tcompressedTexImage3D: compressedTexImage3D,\n\t\ttexImage2D: texImage2D,\n\t\ttexImage3D: texImage3D,\n\n\t\tupdateUBOMapping: updateUBOMapping,\n\t\tuniformBlockBinding: uniformBlockBinding,\n\n\t\ttexStorage2D: texStorage2D,\n\t\ttexStorage3D: texStorage3D,\n\t\ttexSubImage2D: texSubImage2D,\n\t\ttexSubImage3D: texSubImage3D,\n\t\tcompressedTexSubImage2D: compressedTexSubImage2D,\n\t\tcompressedTexSubImage3D: compressedTexSubImage3D,\n\n\t\tscissor: scissor,\n\t\tviewport: viewport,\n\n\t\treset: reset\n\n\t};\n\n}\n\nfunction WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info ) {\n\n\tconst multisampledRTTExt = extensions.has( 'WEBGL_multisampled_render_to_texture' ) ? extensions.get( 'WEBGL_multisampled_render_to_texture' ) : null;\n\tconst supportsInvalidateFramebuffer = typeof navigator === 'undefined' ? false : /OculusBrowser/g.test( navigator.userAgent );\n\n\tconst _imageDimensions = new Vector2();\n\tconst _videoTextures = new WeakMap();\n\tlet _canvas;\n\n\tconst _sources = new WeakMap(); // maps WebglTexture objects to instances of Source\n\n\t// cordova iOS (as of 5.0) still uses UIWebView, which provides OffscreenCanvas,\n\t// also OffscreenCanvas.getContext(\"webgl\"), but not OffscreenCanvas.getContext(\"2d\")!\n\t// Some implementations may only implement OffscreenCanvas partially (e.g. lacking 2d).\n\n\tlet useOffscreenCanvas = false;\n\n\ttry {\n\n\t\tuseOffscreenCanvas = typeof OffscreenCanvas !== 'undefined'\n\t\t\t// eslint-disable-next-line compat/compat\n\t\t\t&& ( new OffscreenCanvas( 1, 1 ).getContext( '2d' ) ) !== null;\n\n\t} catch ( err ) {\n\n\t\t// Ignore any errors\n\n\t}\n\n\tfunction createCanvas( width, height ) {\n\n\t\t// Use OffscreenCanvas when available. Specially needed in web workers\n\n\t\treturn useOffscreenCanvas ?\n\t\t\t// eslint-disable-next-line compat/compat\n\t\t\tnew OffscreenCanvas( width, height ) : createElementNS( 'canvas' );\n\n\t}\n\n\tfunction resizeImage( image, needsNewCanvas, maxSize ) {\n\n\t\tlet scale = 1;\n\n\t\tconst dimensions = getDimensions( image );\n\n\t\t// handle case if texture exceeds max size\n\n\t\tif ( dimensions.width > maxSize || dimensions.height > maxSize ) {\n\n\t\t\tscale = maxSize / Math.max( dimensions.width, dimensions.height );\n\n\t\t}\n\n\t\t// only perform resize if necessary\n\n\t\tif ( scale < 1 ) {\n\n\t\t\t// only perform resize for certain image types\n\n\t\t\tif ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) ||\n\t\t\t\t( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) ||\n\t\t\t\t( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ||\n\t\t\t\t( typeof VideoFrame !== 'undefined' && image instanceof VideoFrame ) ) {\n\n\t\t\t\tconst width = Math.floor( scale * dimensions.width );\n\t\t\t\tconst height = Math.floor( scale * dimensions.height );\n\n\t\t\t\tif ( _canvas === undefined ) _canvas = createCanvas( width, height );\n\n\t\t\t\t// cube textures can't reuse the same canvas\n\n\t\t\t\tconst canvas = needsNewCanvas ? createCanvas( width, height ) : _canvas;\n\n\t\t\t\tcanvas.width = width;\n\t\t\t\tcanvas.height = height;\n\n\t\t\t\tconst context = canvas.getContext( '2d' );\n\t\t\t\tcontext.drawImage( image, 0, 0, width, height );\n\n\t\t\t\twarn( 'WebGLRenderer: Texture has been resized from (' + dimensions.width + 'x' + dimensions.height + ') to (' + width + 'x' + height + ').' );\n\n\t\t\t\treturn canvas;\n\n\t\t\t} else {\n\n\t\t\t\tif ( 'data' in image ) {\n\n\t\t\t\t\twarn( 'WebGLRenderer: Image in DataTexture is too big (' + dimensions.width + 'x' + dimensions.height + ').' );\n\n\t\t\t\t}\n\n\t\t\t\treturn image;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn image;\n\n\t}\n\n\tfunction textureNeedsGenerateMipmaps( texture ) {\n\n\t\treturn texture.generateMipmaps;\n\n\t}\n\n\tfunction generateMipmap( target ) {\n\n\t\t_gl.generateMipmap( target );\n\n\t}\n\n\tfunction getTargetType( texture ) {\n\n\t\tif ( texture.isWebGLCubeRenderTarget ) return _gl.TEXTURE_CUBE_MAP;\n\t\tif ( texture.isWebGL3DRenderTarget ) return _gl.TEXTURE_3D;\n\t\tif ( texture.isWebGLArrayRenderTarget || texture.isCompressedArrayTexture ) return _gl.TEXTURE_2D_ARRAY;\n\t\treturn _gl.TEXTURE_2D;\n\n\t}\n\n\tfunction getInternalFormat( internalFormatName, glFormat, glType, colorSpace, forceLinearTransfer = false ) {\n\n\t\tif ( internalFormatName !== null ) {\n\n\t\t\tif ( _gl[ internalFormatName ] !== undefined ) return _gl[ internalFormatName ];\n\n\t\t\twarn( 'WebGLRenderer: Attempt to use non-existing WebGL internal format \\'' + internalFormatName + '\\'' );\n\n\t\t}\n\n\t\tlet internalFormat = glFormat;\n\n\t\tif ( glFormat === _gl.RED ) {\n\n\t\t\tif ( glType === _gl.FLOAT ) internalFormat = _gl.R32F;\n\t\t\tif ( glType === _gl.HALF_FLOAT ) internalFormat = _gl.R16F;\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.R8;\n\n\t\t}\n\n\t\tif ( glFormat === _gl.RED_INTEGER ) {\n\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.R8UI;\n\t\t\tif ( glType === _gl.UNSIGNED_SHORT ) internalFormat = _gl.R16UI;\n\t\t\tif ( glType === _gl.UNSIGNED_INT ) internalFormat = _gl.R32UI;\n\t\t\tif ( glType === _gl.BYTE ) internalFormat = _gl.R8I;\n\t\t\tif ( glType === _gl.SHORT ) internalFormat = _gl.R16I;\n\t\t\tif ( glType === _gl.INT ) internalFormat = _gl.R32I;\n\n\t\t}\n\n\t\tif ( glFormat === _gl.RG ) {\n\n\t\t\tif ( glType === _gl.FLOAT ) internalFormat = _gl.RG32F;\n\t\t\tif ( glType === _gl.HALF_FLOAT ) internalFormat = _gl.RG16F;\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.RG8;\n\n\t\t}\n\n\t\tif ( glFormat === _gl.RG_INTEGER ) {\n\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.RG8UI;\n\t\t\tif ( glType === _gl.UNSIGNED_SHORT ) internalFormat = _gl.RG16UI;\n\t\t\tif ( glType === _gl.UNSIGNED_INT ) internalFormat = _gl.RG32UI;\n\t\t\tif ( glType === _gl.BYTE ) internalFormat = _gl.RG8I;\n\t\t\tif ( glType === _gl.SHORT ) internalFormat = _gl.RG16I;\n\t\t\tif ( glType === _gl.INT ) internalFormat = _gl.RG32I;\n\n\t\t}\n\n\t\tif ( glFormat === _gl.RGB_INTEGER ) {\n\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.RGB8UI;\n\t\t\tif ( glType === _gl.UNSIGNED_SHORT ) internalFormat = _gl.RGB16UI;\n\t\t\tif ( glType === _gl.UNSIGNED_INT ) internalFormat = _gl.RGB32UI;\n\t\t\tif ( glType === _gl.BYTE ) internalFormat = _gl.RGB8I;\n\t\t\tif ( glType === _gl.SHORT ) internalFormat = _gl.RGB16I;\n\t\t\tif ( glType === _gl.INT ) internalFormat = _gl.RGB32I;\n\n\t\t}\n\n\t\tif ( glFormat === _gl.RGBA_INTEGER ) {\n\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.RGBA8UI;\n\t\t\tif ( glType === _gl.UNSIGNED_SHORT ) internalFormat = _gl.RGBA16UI;\n\t\t\tif ( glType === _gl.UNSIGNED_INT ) internalFormat = _gl.RGBA32UI;\n\t\t\tif ( glType === _gl.BYTE ) internalFormat = _gl.RGBA8I;\n\t\t\tif ( glType === _gl.SHORT ) internalFormat = _gl.RGBA16I;\n\t\t\tif ( glType === _gl.INT ) internalFormat = _gl.RGBA32I;\n\n\t\t}\n\n\t\tif ( glFormat === _gl.RGB ) {\n\n\t\t\tif ( glType === _gl.UNSIGNED_INT_5_9_9_9_REV ) internalFormat = _gl.RGB9_E5;\n\t\t\tif ( glType === _gl.UNSIGNED_INT_10F_11F_11F_REV ) internalFormat = _gl.R11F_G11F_B10F;\n\n\t\t}\n\n\t\tif ( glFormat === _gl.RGBA ) {\n\n\t\t\tconst transfer = forceLinearTransfer ? LinearTransfer : ColorManagement.getTransfer( colorSpace );\n\n\t\t\tif ( glType === _gl.FLOAT ) internalFormat = _gl.RGBA32F;\n\t\t\tif ( glType === _gl.HALF_FLOAT ) internalFormat = _gl.RGBA16F;\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = ( transfer === SRGBTransfer ) ? _gl.SRGB8_ALPHA8 : _gl.RGBA8;\n\t\t\tif ( glType === _gl.UNSIGNED_SHORT_4_4_4_4 ) internalFormat = _gl.RGBA4;\n\t\t\tif ( glType === _gl.UNSIGNED_SHORT_5_5_5_1 ) internalFormat = _gl.RGB5_A1;\n\n\t\t}\n\n\t\tif ( internalFormat === _gl.R16F || internalFormat === _gl.R32F ||\n\t\t\tinternalFormat === _gl.RG16F || internalFormat === _gl.RG32F ||\n\t\t\tinternalFormat === _gl.RGBA16F || internalFormat === _gl.RGBA32F ) {\n\n\t\t\textensions.get( 'EXT_color_buffer_float' );\n\n\t\t}\n\n\t\treturn internalFormat;\n\n\t}\n\n\tfunction getInternalDepthFormat( useStencil, depthType ) {\n\n\t\tlet glInternalFormat;\n\t\tif ( useStencil ) {\n\n\t\t\tif ( depthType === null || depthType === UnsignedIntType || depthType === UnsignedInt248Type ) {\n\n\t\t\t\tglInternalFormat = _gl.DEPTH24_STENCIL8;\n\n\t\t\t} else if ( depthType === FloatType ) {\n\n\t\t\t\tglInternalFormat = _gl.DEPTH32F_STENCIL8;\n\n\t\t\t} else if ( depthType === UnsignedShortType ) {\n\n\t\t\t\tglInternalFormat = _gl.DEPTH24_STENCIL8;\n\t\t\t\twarn( 'DepthTexture: 16 bit depth attachment is not supported with stencil. Using 24-bit attachment.' );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( depthType === null || depthType === UnsignedIntType || depthType === UnsignedInt248Type ) {\n\n\t\t\t\tglInternalFormat = _gl.DEPTH_COMPONENT24;\n\n\t\t\t} else if ( depthType === FloatType ) {\n\n\t\t\t\tglInternalFormat = _gl.DEPTH_COMPONENT32F;\n\n\t\t\t} else if ( depthType === UnsignedShortType ) {\n\n\t\t\t\tglInternalFormat = _gl.DEPTH_COMPONENT16;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn glInternalFormat;\n\n\t}\n\n\tfunction getMipLevels( texture, image ) {\n\n\t\tif ( textureNeedsGenerateMipmaps( texture ) === true || ( texture.isFramebufferTexture && texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ) ) {\n\n\t\t\treturn Math.log2( Math.max( image.width, image.height ) ) + 1;\n\n\t\t} else if ( texture.mipmaps !== undefined && texture.mipmaps.length > 0 ) {\n\n\t\t\t// user-defined mipmaps\n\n\t\t\treturn texture.mipmaps.length;\n\n\t\t} else if ( texture.isCompressedTexture && Array.isArray( texture.image ) ) {\n\n\t\t\treturn image.mipmaps.length;\n\n\t\t} else {\n\n\t\t\t// texture without mipmaps (only base level)\n\n\t\t\treturn 1;\n\n\t\t}\n\n\t}\n\n\t//\n\n\tfunction onTextureDispose( event ) {\n\n\t\tconst texture = event.target;\n\n\t\ttexture.removeEventListener( 'dispose', onTextureDispose );\n\n\t\tdeallocateTexture( texture );\n\n\t\tif ( texture.isVideoTexture ) {\n\n\t\t\t_videoTextures.delete( texture );\n\n\t\t}\n\n\t}\n\n\tfunction onRenderTargetDispose( event ) {\n\n\t\tconst renderTarget = event.target;\n\n\t\trenderTarget.removeEventListener( 'dispose', onRenderTargetDispose );\n\n\t\tdeallocateRenderTarget( renderTarget );\n\n\t}\n\n\t//\n\n\tfunction deallocateTexture( texture ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( textureProperties.__webglInit === undefined ) return;\n\n\t\t// check if it's necessary to remove the WebGLTexture object\n\n\t\tconst source = texture.source;\n\t\tconst webglTextures = _sources.get( source );\n\n\t\tif ( webglTextures ) {\n\n\t\t\tconst webglTexture = webglTextures[ textureProperties.__cacheKey ];\n\t\t\twebglTexture.usedTimes --;\n\n\t\t\t// the WebGLTexture object is not used anymore, remove it\n\n\t\t\tif ( webglTexture.usedTimes === 0 ) {\n\n\t\t\t\tdeleteTexture( texture );\n\n\t\t\t}\n\n\t\t\t// remove the weak map entry if no WebGLTexture uses the source anymore\n\n\t\t\tif ( Object.keys( webglTextures ).length === 0 ) {\n\n\t\t\t\t_sources.delete( source );\n\n\t\t\t}\n\n\t\t}\n\n\t\tproperties.remove( texture );\n\n\t}\n\n\tfunction deleteTexture( texture ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\t\t_gl.deleteTexture( textureProperties.__webglTexture );\n\n\t\tconst source = texture.source;\n\t\tconst webglTextures = _sources.get( source );\n\t\tdelete webglTextures[ textureProperties.__cacheKey ];\n\n\t\tinfo.memory.textures --;\n\n\t}\n\n\tfunction deallocateRenderTarget( renderTarget ) {\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\tif ( renderTarget.depthTexture ) {\n\n\t\t\trenderTarget.depthTexture.dispose();\n\n\t\t\tproperties.remove( renderTarget.depthTexture );\n\n\t\t}\n\n\t\tif ( renderTarget.isWebGLCubeRenderTarget ) {\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\tif ( Array.isArray( renderTargetProperties.__webglFramebuffer[ i ] ) ) {\n\n\t\t\t\t\tfor ( let level = 0; level < renderTargetProperties.__webglFramebuffer[ i ].length; level ++ ) _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ][ level ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ] );\n\n\t\t\t\t}\n\n\t\t\t\tif ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer[ i ] );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( Array.isArray( renderTargetProperties.__webglFramebuffer ) ) {\n\n\t\t\t\tfor ( let level = 0; level < renderTargetProperties.__webglFramebuffer.length; level ++ ) _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ level ] );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer );\n\n\t\t\t}\n\n\t\t\tif ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer );\n\t\t\tif ( renderTargetProperties.__webglMultisampledFramebuffer ) _gl.deleteFramebuffer( renderTargetProperties.__webglMultisampledFramebuffer );\n\n\t\t\tif ( renderTargetProperties.__webglColorRenderbuffer ) {\n\n\t\t\t\tfor ( let i = 0; i < renderTargetProperties.__webglColorRenderbuffer.length; i ++ ) {\n\n\t\t\t\t\tif ( renderTargetProperties.__webglColorRenderbuffer[ i ] ) _gl.deleteRenderbuffer( renderTargetProperties.__webglColorRenderbuffer[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( renderTargetProperties.__webglDepthRenderbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthRenderbuffer );\n\n\t\t}\n\n\t\tconst textures = renderTarget.textures;\n\n\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\tconst attachmentProperties = properties.get( textures[ i ] );\n\n\t\t\tif ( attachmentProperties.__webglTexture ) {\n\n\t\t\t\t_gl.deleteTexture( attachmentProperties.__webglTexture );\n\n\t\t\t\tinfo.memory.textures --;\n\n\t\t\t}\n\n\t\t\tproperties.remove( textures[ i ] );\n\n\t\t}\n\n\t\tproperties.remove( renderTarget );\n\n\t}\n\n\t//\n\n\tlet textureUnits = 0;\n\n\tfunction resetTextureUnits() {\n\n\t\ttextureUnits = 0;\n\n\t}\n\n\tfunction allocateTextureUnit() {\n\n\t\tconst textureUnit = textureUnits;\n\n\t\tif ( textureUnit >= capabilities.maxTextures ) {\n\n\t\t\twarn( 'WebGLTextures: Trying to use ' + textureUnit + ' texture units while this GPU supports only ' + capabilities.maxTextures );\n\n\t\t}\n\n\t\ttextureUnits += 1;\n\n\t\treturn textureUnit;\n\n\t}\n\n\tfunction getTextureCacheKey( texture ) {\n\n\t\tconst array = [];\n\n\t\tarray.push( texture.wrapS );\n\t\tarray.push( texture.wrapT );\n\t\tarray.push( texture.wrapR || 0 );\n\t\tarray.push( texture.magFilter );\n\t\tarray.push( texture.minFilter );\n\t\tarray.push( texture.anisotropy );\n\t\tarray.push( texture.internalFormat );\n\t\tarray.push( texture.format );\n\t\tarray.push( texture.type );\n\t\tarray.push( texture.generateMipmaps );\n\t\tarray.push( texture.premultiplyAlpha );\n\t\tarray.push( texture.flipY );\n\t\tarray.push( texture.unpackAlignment );\n\t\tarray.push( texture.colorSpace );\n\n\t\treturn array.join();\n\n\t}\n\n\t//\n\n\tfunction setTexture2D( texture, slot ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( texture.isVideoTexture ) updateVideoTexture( texture );\n\n\t\tif ( texture.isRenderTargetTexture === false && texture.isExternalTexture !== true && texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tconst image = texture.image;\n\n\t\t\tif ( image === null ) {\n\n\t\t\t\twarn( 'WebGLRenderer: Texture marked for update but no image data found.' );\n\n\t\t\t} else if ( image.complete === false ) {\n\n\t\t\t\twarn( 'WebGLRenderer: Texture marked for update but image is incomplete' );\n\n\t\t\t} else {\n\n\t\t\t\tuploadTexture( textureProperties, texture, slot );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t} else if ( texture.isExternalTexture ) {\n\n\t\t\ttextureProperties.__webglTexture = texture.sourceTexture ? texture.sourceTexture : null;\n\n\t\t}\n\n\t\tstate.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture, _gl.TEXTURE0 + slot );\n\n\t}\n\n\tfunction setTexture2DArray( texture, slot ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( texture.isRenderTargetTexture === false && texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tuploadTexture( textureProperties, texture, slot );\n\t\t\treturn;\n\n\t\t} else if ( texture.isExternalTexture ) {\n\n\t\t\ttextureProperties.__webglTexture = texture.sourceTexture ? texture.sourceTexture : null;\n\n\t\t}\n\n\t\tstate.bindTexture( _gl.TEXTURE_2D_ARRAY, textureProperties.__webglTexture, _gl.TEXTURE0 + slot );\n\n\t}\n\n\tfunction setTexture3D( texture, slot ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( texture.isRenderTargetTexture === false && texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tuploadTexture( textureProperties, texture, slot );\n\t\t\treturn;\n\n\t\t}\n\n\t\tstate.bindTexture( _gl.TEXTURE_3D, textureProperties.__webglTexture, _gl.TEXTURE0 + slot );\n\n\t}\n\n\tfunction setTextureCube( texture, slot ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tuploadCubeTexture( textureProperties, texture, slot );\n\t\t\treturn;\n\n\t\t}\n\n\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture, _gl.TEXTURE0 + slot );\n\n\t}\n\n\tconst wrappingToGL = {\n\t\t[ RepeatWrapping ]: _gl.REPEAT,\n\t\t[ ClampToEdgeWrapping ]: _gl.CLAMP_TO_EDGE,\n\t\t[ MirroredRepeatWrapping ]: _gl.MIRRORED_REPEAT\n\t};\n\n\tconst filterToGL = {\n\t\t[ NearestFilter ]: _gl.NEAREST,\n\t\t[ NearestMipmapNearestFilter ]: _gl.NEAREST_MIPMAP_NEAREST,\n\t\t[ NearestMipmapLinearFilter ]: _gl.NEAREST_MIPMAP_LINEAR,\n\n\t\t[ LinearFilter ]: _gl.LINEAR,\n\t\t[ LinearMipmapNearestFilter ]: _gl.LINEAR_MIPMAP_NEAREST,\n\t\t[ LinearMipmapLinearFilter ]: _gl.LINEAR_MIPMAP_LINEAR\n\t};\n\n\tconst compareToGL = {\n\t\t[ NeverCompare ]: _gl.NEVER,\n\t\t[ AlwaysCompare ]: _gl.ALWAYS,\n\t\t[ LessCompare ]: _gl.LESS,\n\t\t[ LessEqualCompare ]: _gl.LEQUAL,\n\t\t[ EqualCompare ]: _gl.EQUAL,\n\t\t[ GreaterEqualCompare ]: _gl.GEQUAL,\n\t\t[ GreaterCompare ]: _gl.GREATER,\n\t\t[ NotEqualCompare ]: _gl.NOTEQUAL\n\t};\n\n\tfunction setTextureParameters( textureType, texture ) {\n\n\t\tif ( texture.type === FloatType && extensions.has( 'OES_texture_float_linear' ) === false &&\n\t\t\t( texture.magFilter === LinearFilter || texture.magFilter === LinearMipmapNearestFilter || texture.magFilter === NearestMipmapLinearFilter || texture.magFilter === LinearMipmapLinearFilter ||\n\t\t\ttexture.minFilter === LinearFilter || texture.minFilter === LinearMipmapNearestFilter || texture.minFilter === NearestMipmapLinearFilter || texture.minFilter === LinearMipmapLinearFilter ) ) {\n\n\t\t\twarn( 'WebGLRenderer: Unable to use linear filtering with floating point textures. OES_texture_float_linear not supported on this device.' );\n\n\t\t}\n\n\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, wrappingToGL[ texture.wrapS ] );\n\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, wrappingToGL[ texture.wrapT ] );\n\n\t\tif ( textureType === _gl.TEXTURE_3D || textureType === _gl.TEXTURE_2D_ARRAY ) {\n\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_R, wrappingToGL[ texture.wrapR ] );\n\n\t\t}\n\n\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, filterToGL[ texture.magFilter ] );\n\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, filterToGL[ texture.minFilter ] );\n\n\t\tif ( texture.compareFunction ) {\n\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_COMPARE_MODE, _gl.COMPARE_REF_TO_TEXTURE );\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_COMPARE_FUNC, compareToGL[ texture.compareFunction ] );\n\n\t\t}\n\n\t\tif ( extensions.has( 'EXT_texture_filter_anisotropic' ) === true ) {\n\n\t\t\tif ( texture.magFilter === NearestFilter ) return;\n\t\t\tif ( texture.minFilter !== NearestMipmapLinearFilter && texture.minFilter !== LinearMipmapLinearFilter ) return;\n\t\t\tif ( texture.type === FloatType && extensions.has( 'OES_texture_float_linear' ) === false ) return; // verify extension\n\n\t\t\tif ( texture.anisotropy > 1 || properties.get( texture ).__currentAnisotropy ) {\n\n\t\t\t\tconst extension = extensions.get( 'EXT_texture_filter_anisotropic' );\n\t\t\t\t_gl.texParameterf( textureType, extension.TEXTURE_MAX_ANISOTROPY_EXT, Math.min( texture.anisotropy, capabilities.getMaxAnisotropy() ) );\n\t\t\t\tproperties.get( texture ).__currentAnisotropy = texture.anisotropy;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction initTexture( textureProperties, texture ) {\n\n\t\tlet forceUpload = false;\n\n\t\tif ( textureProperties.__webglInit === undefined ) {\n\n\t\t\ttextureProperties.__webglInit = true;\n\n\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t}\n\n\t\t// create Source <-> WebGLTextures mapping if necessary\n\n\t\tconst source = texture.source;\n\t\tlet webglTextures = _sources.get( source );\n\n\t\tif ( webglTextures === undefined ) {\n\n\t\t\twebglTextures = {};\n\t\t\t_sources.set( source, webglTextures );\n\n\t\t}\n\n\t\t// check if there is already a WebGLTexture object for the given texture parameters\n\n\t\tconst textureCacheKey = getTextureCacheKey( texture );\n\n\t\tif ( textureCacheKey !== textureProperties.__cacheKey ) {\n\n\t\t\t// if not, create a new instance of WebGLTexture\n\n\t\t\tif ( webglTextures[ textureCacheKey ] === undefined ) {\n\n\t\t\t\t// create new entry\n\n\t\t\t\twebglTextures[ textureCacheKey ] = {\n\t\t\t\t\ttexture: _gl.createTexture(),\n\t\t\t\t\tusedTimes: 0\n\t\t\t\t};\n\n\t\t\t\tinfo.memory.textures ++;\n\n\t\t\t\t// when a new instance of WebGLTexture was created, a texture upload is required\n\t\t\t\t// even if the image contents are identical\n\n\t\t\t\tforceUpload = true;\n\n\t\t\t}\n\n\t\t\twebglTextures[ textureCacheKey ].usedTimes ++;\n\n\t\t\t// every time the texture cache key changes, it's necessary to check if an instance of\n\t\t\t// WebGLTexture can be deleted in order to avoid a memory leak.\n\n\t\t\tconst webglTexture = webglTextures[ textureProperties.__cacheKey ];\n\n\t\t\tif ( webglTexture !== undefined ) {\n\n\t\t\t\twebglTextures[ textureProperties.__cacheKey ].usedTimes --;\n\n\t\t\t\tif ( webglTexture.usedTimes === 0 ) {\n\n\t\t\t\t\tdeleteTexture( texture );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// store references to cache key and WebGLTexture object\n\n\t\t\ttextureProperties.__cacheKey = textureCacheKey;\n\t\t\ttextureProperties.__webglTexture = webglTextures[ textureCacheKey ].texture;\n\n\t\t}\n\n\t\treturn forceUpload;\n\n\t}\n\n\tfunction getRow( index, rowLength, componentStride ) {\n\n\t\treturn Math.floor( Math.floor( index / componentStride ) / rowLength );\n\n\t}\n\n\tfunction updateTexture( texture, image, glFormat, glType ) {\n\n\t\tconst componentStride = 4; // only RGBA supported\n\n\t\tconst updateRanges = texture.updateRanges;\n\n\t\tif ( updateRanges.length === 0 ) {\n\n\t\t\tstate.texSubImage2D( _gl.TEXTURE_2D, 0, 0, 0, image.width, image.height, glFormat, glType, image.data );\n\n\t\t} else {\n\n\t\t\t// Before applying update ranges, we merge any adjacent / overlapping\n\t\t\t// ranges to reduce load on `gl.texSubImage2D`. Empirically, this has led\n\t\t\t// to performance improvements for applications which make heavy use of\n\t\t\t// update ranges. Likely due to GPU command overhead.\n\t\t\t//\n\t\t\t// Note that to reduce garbage collection between frames, we merge the\n\t\t\t// update ranges in-place. This is safe because this method will clear the\n\t\t\t// update ranges once updated.\n\n\t\t\tupdateRanges.sort( ( a, b ) => a.start - b.start );\n\n\t\t\t// To merge the update ranges in-place, we work from left to right in the\n\t\t\t// existing updateRanges array, merging ranges. This may result in a final\n\t\t\t// array which is smaller than the original. This index tracks the last\n\t\t\t// index representing a merged range, any data after this index can be\n\t\t\t// trimmed once the merge algorithm is completed.\n\t\t\tlet mergeIndex = 0;\n\n\t\t\tfor ( let i = 1; i < updateRanges.length; i ++ ) {\n\n\t\t\t\tconst previousRange = updateRanges[ mergeIndex ];\n\t\t\t\tconst range = updateRanges[ i ];\n\n\t\t\t\t// Only merge if in the same row and overlapping/adjacent\n\t\t\t\tconst previousEnd = previousRange.start + previousRange.count;\n\t\t\t\tconst currentRow = getRow( range.start, image.width, componentStride );\n\t\t\t\tconst previousRow = getRow( previousRange.start, image.width, componentStride );\n\n\t\t\t\t// We add one here to merge adjacent ranges. This is safe because ranges\n\t\t\t\t// operate over positive integers.\n\t\t\t\tif (\n\t\t\t\t\trange.start <= previousEnd + 1 &&\n\t\t\t\t\tcurrentRow === previousRow &&\n\t\t\t\t\tgetRow( range.start + range.count - 1, image.width, componentStride ) === currentRow // ensure range doesn't spill\n\t\t\t\t) {\n\n\t\t\t\t\tpreviousRange.count = Math.max(\n\t\t\t\t\t\tpreviousRange.count,\n\t\t\t\t\t\trange.start + range.count - previousRange.start\n\t\t\t\t\t);\n\n\t\t\t\t} else {\n\n\t\t\t\t\t++ mergeIndex;\n\t\t\t\t\tupdateRanges[ mergeIndex ] = range;\n\n\t\t\t\t}\n\n\n\t\t\t}\n\n\t\t\t// Trim the array to only contain the merged ranges.\n\t\t\tupdateRanges.length = mergeIndex + 1;\n\n\t\t\tconst currentUnpackRowLen = _gl.getParameter( _gl.UNPACK_ROW_LENGTH );\n\t\t\tconst currentUnpackSkipPixels = _gl.getParameter( _gl.UNPACK_SKIP_PIXELS );\n\t\t\tconst currentUnpackSkipRows = _gl.getParameter( _gl.UNPACK_SKIP_ROWS );\n\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ROW_LENGTH, image.width );\n\n\t\t\tfor ( let i = 0, l = updateRanges.length; i < l; i ++ ) {\n\n\t\t\t\tconst range = updateRanges[ i ];\n\n\t\t\t\tconst pixelStart = Math.floor( range.start / componentStride );\n\t\t\t\tconst pixelCount = Math.ceil( range.count / componentStride );\n\n\t\t\t\tconst x = pixelStart % image.width;\n\t\t\t\tconst y = Math.floor( pixelStart / image.width );\n\n\t\t\t\t// Assumes update ranges refer to contiguous memory\n\t\t\t\tconst width = pixelCount;\n\t\t\t\tconst height = 1;\n\n\t\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_PIXELS, x );\n\t\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_ROWS, y );\n\n\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_2D, 0, x, y, width, height, glFormat, glType, image.data );\n\n\t\t\t}\n\n\t\t\ttexture.clearUpdateRanges();\n\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ROW_LENGTH, currentUnpackRowLen );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_PIXELS, currentUnpackSkipPixels );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_ROWS, currentUnpackSkipRows );\n\n\t\t}\n\n\t}\n\n\tfunction uploadTexture( textureProperties, texture, slot ) {\n\n\t\tlet textureType = _gl.TEXTURE_2D;\n\n\t\tif ( texture.isDataArrayTexture || texture.isCompressedArrayTexture ) textureType = _gl.TEXTURE_2D_ARRAY;\n\t\tif ( texture.isData3DTexture ) textureType = _gl.TEXTURE_3D;\n\n\t\tconst forceUpload = initTexture( textureProperties, texture );\n\t\tconst source = texture.source;\n\n\t\tstate.bindTexture( textureType, textureProperties.__webglTexture, _gl.TEXTURE0 + slot );\n\n\t\tconst sourceProperties = properties.get( source );\n\n\t\tif ( source.version !== sourceProperties.__version || forceUpload === true ) {\n\n\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\n\t\t\tconst workingPrimaries = ColorManagement.getPrimaries( ColorManagement.workingColorSpace );\n\t\t\tconst texturePrimaries = texture.colorSpace === NoColorSpace ? null : ColorManagement.getPrimaries( texture.colorSpace );\n\t\t\tconst unpackConversion = texture.colorSpace === NoColorSpace || workingPrimaries === texturePrimaries ? _gl.NONE : _gl.BROWSER_DEFAULT_WEBGL;\n\n\t\t\t_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ALIGNMENT, texture.unpackAlignment );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, unpackConversion );\n\n\t\t\tlet image = resizeImage( texture.image, false, capabilities.maxTextureSize );\n\t\t\timage = verifyColorSpace( texture, image );\n\n\t\t\tconst glFormat = utils.convert( texture.format, texture.colorSpace );\n\n\t\t\tconst glType = utils.convert( texture.type );\n\t\t\tlet glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.colorSpace, texture.isVideoTexture );\n\n\t\t\tsetTextureParameters( textureType, texture );\n\n\t\t\tlet mipmap;\n\t\t\tconst mipmaps = texture.mipmaps;\n\n\t\t\tconst useTexStorage = ( texture.isVideoTexture !== true );\n\t\t\tconst allocateMemory = ( sourceProperties.__version === undefined ) || ( forceUpload === true );\n\t\t\tconst dataReady = source.dataReady;\n\t\t\tconst levels = getMipLevels( texture, image );\n\n\t\t\tif ( texture.isDepthTexture ) {\n\n\t\t\t\tglInternalFormat = getInternalDepthFormat( texture.format === DepthStencilFormat, texture.type );\n\n\t\t\t\t//\n\n\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, 1, glInternalFormat, image.width, image.height );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, null );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( texture.isDataTexture ) {\n\n\t\t\t\t// use manually created mipmaps if available\n\t\t\t\t// if there are no manual mipmaps\n\t\t\t\t// set 0 level mipmap and then use GL to generate other mipmap levels\n\n\t\t\t\tif ( mipmaps.length > 0 ) {\n\n\t\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, mipmaps[ 0 ].width, mipmaps[ 0 ].height );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_2D, i, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.generateMipmaps = false;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, image.width, image.height );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\tupdateTexture( texture, image, glFormat, glType );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, image.data );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( texture.isCompressedTexture ) {\n\n\t\t\t\tif ( texture.isCompressedArrayTexture ) {\n\n\t\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage3D( _gl.TEXTURE_2D_ARRAY, levels, glInternalFormat, mipmaps[ 0 ].width, mipmaps[ 0 ].height, image.depth );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\t\t\tif ( texture.format !== RGBAFormat ) {\n\n\t\t\t\t\t\t\tif ( glFormat !== null ) {\n\n\t\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\t\tif ( texture.layerUpdates.size > 0 ) {\n\n\t\t\t\t\t\t\t\t\t\t\tconst layerByteLength = getByteLength( mipmap.width, mipmap.height, texture.format, texture.type );\n\n\t\t\t\t\t\t\t\t\t\t\tfor ( const layerIndex of texture.layerUpdates ) {\n\n\t\t\t\t\t\t\t\t\t\t\t\tconst layerData = mipmap.data.subarray(\n\t\t\t\t\t\t\t\t\t\t\t\t\tlayerIndex * layerByteLength / mipmap.data.BYTES_PER_ELEMENT,\n\t\t\t\t\t\t\t\t\t\t\t\t\t( layerIndex + 1 ) * layerByteLength / mipmap.data.BYTES_PER_ELEMENT\n\t\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t\t\tstate.compressedTexSubImage3D( _gl.TEXTURE_2D_ARRAY, i, 0, 0, layerIndex, mipmap.width, mipmap.height, 1, glFormat, layerData );\n\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\ttexture.clearLayerUpdates();\n\n\t\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t\tstate.compressedTexSubImage3D( _gl.TEXTURE_2D_ARRAY, i, 0, 0, 0, mipmap.width, mipmap.height, image.depth, glFormat, mipmap.data );\n\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\tstate.compressedTexImage3D( _gl.TEXTURE_2D_ARRAY, i, glInternalFormat, mipmap.width, mipmap.height, image.depth, 0, mipmap.data, 0, 0 );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\twarn( 'WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()' );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\tstate.texSubImage3D( _gl.TEXTURE_2D_ARRAY, i, 0, 0, 0, mipmap.width, mipmap.height, image.depth, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage3D( _gl.TEXTURE_2D_ARRAY, i, glInternalFormat, mipmap.width, mipmap.height, image.depth, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, mipmaps[ 0 ].width, mipmaps[ 0 ].height );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\t\t\tif ( texture.format !== RGBAFormat ) {\n\n\t\t\t\t\t\t\tif ( glFormat !== null ) {\n\n\t\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\t\tstate.compressedTexSubImage2D( _gl.TEXTURE_2D, i, 0, 0, mipmap.width, mipmap.height, glFormat, mipmap.data );\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\tstate.compressedTexImage2D( _gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\twarn( 'WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()' );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_2D, i, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( texture.isDataArrayTexture ) {\n\n\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage3D( _gl.TEXTURE_2D_ARRAY, levels, glInternalFormat, image.width, image.height, image.depth );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\tif ( texture.layerUpdates.size > 0 ) {\n\n\t\t\t\t\t\t\tconst layerByteLength = getByteLength( image.width, image.height, texture.format, texture.type );\n\n\t\t\t\t\t\t\tfor ( const layerIndex of texture.layerUpdates ) {\n\n\t\t\t\t\t\t\t\tconst layerData = image.data.subarray(\n\t\t\t\t\t\t\t\t\tlayerIndex * layerByteLength / image.data.BYTES_PER_ELEMENT,\n\t\t\t\t\t\t\t\t\t( layerIndex + 1 ) * layerByteLength / image.data.BYTES_PER_ELEMENT\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tstate.texSubImage3D( _gl.TEXTURE_2D_ARRAY, 0, 0, 0, layerIndex, image.width, image.height, 1, glFormat, glType, layerData );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\ttexture.clearLayerUpdates();\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texSubImage3D( _gl.TEXTURE_2D_ARRAY, 0, 0, 0, 0, image.width, image.height, image.depth, glFormat, glType, image.data );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.texImage3D( _gl.TEXTURE_2D_ARRAY, 0, glInternalFormat, image.width, image.height, image.depth, 0, glFormat, glType, image.data );\n\n\t\t\t\t}\n\n\t\t\t} else if ( texture.isData3DTexture ) {\n\n\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage3D( _gl.TEXTURE_3D, levels, glInternalFormat, image.width, image.height, image.depth );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\tstate.texSubImage3D( _gl.TEXTURE_3D, 0, 0, 0, 0, image.width, image.height, image.depth, glFormat, glType, image.data );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.texImage3D( _gl.TEXTURE_3D, 0, glInternalFormat, image.width, image.height, image.depth, 0, glFormat, glType, image.data );\n\n\t\t\t\t}\n\n\t\t\t} else if ( texture.isFramebufferTexture ) {\n\n\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, image.width, image.height );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tlet width = image.width, height = image.height;\n\n\t\t\t\t\t\tfor ( let i = 0; i < levels; i ++ ) {\n\n\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, width, height, 0, glFormat, glType, null );\n\n\t\t\t\t\t\t\twidth >>= 1;\n\t\t\t\t\t\t\theight >>= 1;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// regular Texture (image, video, canvas)\n\n\t\t\t\t// use manually created mipmaps if available\n\t\t\t\t// if there are no manual mipmaps\n\t\t\t\t// set 0 level mipmap and then use GL to generate other mipmap levels\n\n\t\t\t\tif ( mipmaps.length > 0 ) {\n\n\t\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\t\tconst dimensions = getDimensions( mipmaps[ 0 ] );\n\n\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, dimensions.width, dimensions.height );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_2D, i, 0, 0, glFormat, glType, mipmap );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, glFormat, glType, mipmap );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.generateMipmaps = false;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\t\t\tconst dimensions = getDimensions( image );\n\n\t\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, dimensions.width, dimensions.height );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_2D, 0, 0, 0, glFormat, glType, image );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, glFormat, glType, image );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture ) ) {\n\n\t\t\t\tgenerateMipmap( textureType );\n\n\t\t\t}\n\n\t\t\tsourceProperties.__version = source.version;\n\n\t\t\tif ( texture.onUpdate ) texture.onUpdate( texture );\n\n\t\t}\n\n\t\ttextureProperties.__version = texture.version;\n\n\t}\n\n\tfunction uploadCubeTexture( textureProperties, texture, slot ) {\n\n\t\tif ( texture.image.length !== 6 ) return;\n\n\t\tconst forceUpload = initTexture( textureProperties, texture );\n\t\tconst source = texture.source;\n\n\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture, _gl.TEXTURE0 + slot );\n\n\t\tconst sourceProperties = properties.get( source );\n\n\t\tif ( source.version !== sourceProperties.__version || forceUpload === true ) {\n\n\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\n\t\t\tconst workingPrimaries = ColorManagement.getPrimaries( ColorManagement.workingColorSpace );\n\t\t\tconst texturePrimaries = texture.colorSpace === NoColorSpace ? null : ColorManagement.getPrimaries( texture.colorSpace );\n\t\t\tconst unpackConversion = texture.colorSpace === NoColorSpace || workingPrimaries === texturePrimaries ? _gl.NONE : _gl.BROWSER_DEFAULT_WEBGL;\n\n\t\t\t_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ALIGNMENT, texture.unpackAlignment );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, unpackConversion );\n\n\t\t\tconst isCompressed = ( texture.isCompressedTexture || texture.image[ 0 ].isCompressedTexture );\n\t\t\tconst isDataTexture = ( texture.image[ 0 ] && texture.image[ 0 ].isDataTexture );\n\n\t\t\tconst cubeImage = [];\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\tif ( ! isCompressed && ! isDataTexture ) {\n\n\t\t\t\t\tcubeImage[ i ] = resizeImage( texture.image[ i ], true, capabilities.maxCubemapSize );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tcubeImage[ i ] = isDataTexture ? texture.image[ i ].image : texture.image[ i ];\n\n\t\t\t\t}\n\n\t\t\t\tcubeImage[ i ] = verifyColorSpace( texture, cubeImage[ i ] );\n\n\t\t\t}\n\n\t\t\tconst image = cubeImage[ 0 ],\n\t\t\t\tglFormat = utils.convert( texture.format, texture.colorSpace ),\n\t\t\t\tglType = utils.convert( texture.type ),\n\t\t\t\tglInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.colorSpace );\n\n\t\t\tconst useTexStorage = ( texture.isVideoTexture !== true );\n\t\t\tconst allocateMemory = ( sourceProperties.__version === undefined ) || ( forceUpload === true );\n\t\t\tconst dataReady = source.dataReady;\n\t\t\tlet levels = getMipLevels( texture, image );\n\n\t\t\tsetTextureParameters( _gl.TEXTURE_CUBE_MAP, texture );\n\n\t\t\tlet mipmaps;\n\n\t\t\tif ( isCompressed ) {\n\n\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_CUBE_MAP, levels, glInternalFormat, image.width, image.height );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\tmipmaps = cubeImage[ i ].mipmaps;\n\n\t\t\t\t\tfor ( let j = 0; j < mipmaps.length; j ++ ) {\n\n\t\t\t\t\t\tconst mipmap = mipmaps[ j ];\n\n\t\t\t\t\t\tif ( texture.format !== RGBAFormat ) {\n\n\t\t\t\t\t\t\tif ( glFormat !== null ) {\n\n\t\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\t\tstate.compressedTexSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, 0, 0, mipmap.width, mipmap.height, glFormat, mipmap.data );\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\tstate.compressedTexImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\twarn( 'WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()' );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tmipmaps = texture.mipmaps;\n\n\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\t// TODO: Uniformly handle mipmap definitions\n\t\t\t\t\t// Normal textures and compressed cube textures define base level + mips with their mipmap array\n\t\t\t\t\t// Uncompressed cube textures use their mipmap array only for mips (no base level)\n\n\t\t\t\t\tif ( mipmaps.length > 0 ) levels ++;\n\n\t\t\t\t\tconst dimensions = getDimensions( cubeImage[ 0 ] );\n\n\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_CUBE_MAP, levels, glInternalFormat, dimensions.width, dimensions.height );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\tif ( isDataTexture ) {\n\n\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, 0, 0, cubeImage[ i ].width, cubeImage[ i ].height, glFormat, glType, cubeImage[ i ].data );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glInternalFormat, cubeImage[ i ].width, cubeImage[ i ].height, 0, glFormat, glType, cubeImage[ i ].data );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfor ( let j = 0; j < mipmaps.length; j ++ ) {\n\n\t\t\t\t\t\t\tconst mipmap = mipmaps[ j ];\n\t\t\t\t\t\t\tconst mipmapImage = mipmap.image[ i ].image;\n\n\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, 0, 0, mipmapImage.width, mipmapImage.height, glFormat, glType, mipmapImage.data );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, glInternalFormat, mipmapImage.width, mipmapImage.height, 0, glFormat, glType, mipmapImage.data );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, 0, 0, glFormat, glType, cubeImage[ i ] );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glInternalFormat, glFormat, glType, cubeImage[ i ] );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfor ( let j = 0; j < mipmaps.length; j ++ ) {\n\n\t\t\t\t\t\t\tconst mipmap = mipmaps[ j ];\n\n\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, 0, 0, glFormat, glType, mipmap.image[ i ] );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, glInternalFormat, glFormat, glType, mipmap.image[ i ] );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture ) ) {\n\n\t\t\t\t// We assume images for cube map have the same size.\n\t\t\t\tgenerateMipmap( _gl.TEXTURE_CUBE_MAP );\n\n\t\t\t}\n\n\t\t\tsourceProperties.__version = source.version;\n\n\t\t\tif ( texture.onUpdate ) texture.onUpdate( texture );\n\n\t\t}\n\n\t\ttextureProperties.__version = texture.version;\n\n\t}\n\n\t// Render targets\n\n\t// Setup storage for target texture and bind it to correct framebuffer\n\tfunction setupFrameBufferTexture( framebuffer, renderTarget, texture, attachment, textureTarget, level ) {\n\n\t\tconst glFormat = utils.convert( texture.format, texture.colorSpace );\n\t\tconst glType = utils.convert( texture.type );\n\t\tconst glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.colorSpace );\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\tconst textureProperties = properties.get( texture );\n\n\t\ttextureProperties.__renderTarget = renderTarget;\n\n\t\tif ( ! renderTargetProperties.__hasExternalTextures ) {\n\n\t\t\tconst width = Math.max( 1, renderTarget.width >> level );\n\t\t\tconst height = Math.max( 1, renderTarget.height >> level );\n\n\t\t\tif ( textureTarget === _gl.TEXTURE_3D || textureTarget === _gl.TEXTURE_2D_ARRAY ) {\n\n\t\t\t\tstate.texImage3D( textureTarget, level, glInternalFormat, width, height, renderTarget.depth, 0, glFormat, glType, null );\n\n\t\t\t} else {\n\n\t\t\t\tstate.texImage2D( textureTarget, level, glInternalFormat, width, height, 0, glFormat, glType, null );\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\tif ( useMultisampledRTT( renderTarget ) ) {\n\n\t\t\tmultisampledRTTExt.framebufferTexture2DMultisampleEXT( _gl.FRAMEBUFFER, attachment, textureTarget, textureProperties.__webglTexture, 0, getRenderTargetSamples( renderTarget ) );\n\n\t\t} else if ( textureTarget === _gl.TEXTURE_2D || ( textureTarget >= _gl.TEXTURE_CUBE_MAP_POSITIVE_X && textureTarget <= _gl.TEXTURE_CUBE_MAP_NEGATIVE_Z ) ) { // see #24753\n\n\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, attachment, textureTarget, textureProperties.__webglTexture, level );\n\n\t\t}\n\n\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\n\t}\n\n\t// Setup storage for internal depth/stencil buffers and bind to correct framebuffer\n\tfunction setupRenderBufferStorage( renderbuffer, renderTarget, isMultisample ) {\n\n\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, renderbuffer );\n\n\t\tif ( renderTarget.depthBuffer ) {\n\n\t\t\t// retrieve the depth attachment types\n\t\t\tconst depthTexture = renderTarget.depthTexture;\n\t\t\tconst depthType = depthTexture && depthTexture.isDepthTexture ? depthTexture.type : null;\n\t\t\tconst glInternalFormat = getInternalDepthFormat( renderTarget.stencilBuffer, depthType );\n\t\t\tconst glAttachmentType = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT;\n\n\t\t\t// set up the attachment\n\t\t\tconst samples = getRenderTargetSamples( renderTarget );\n\t\t\tconst isUseMultisampledRTT = useMultisampledRTT( renderTarget );\n\t\t\tif ( isUseMultisampledRTT ) {\n\n\t\t\t\tmultisampledRTTExt.renderbufferStorageMultisampleEXT( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t} else if ( isMultisample ) {\n\n\t\t\t\t_gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t}\n\n\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, glAttachmentType, _gl.RENDERBUFFER, renderbuffer );\n\n\t\t} else {\n\n\t\t\tconst textures = renderTarget.textures;\n\n\t\t\tfor ( let i = 0; i < textures.length; i ++ ) {\n\n\t\t\t\tconst texture = textures[ i ];\n\n\t\t\t\tconst glFormat = utils.convert( texture.format, texture.colorSpace );\n\t\t\t\tconst glType = utils.convert( texture.type );\n\t\t\t\tconst glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.colorSpace );\n\t\t\t\tconst samples = getRenderTargetSamples( renderTarget );\n\n\t\t\t\tif ( isMultisample && useMultisampledRTT( renderTarget ) === false ) {\n\n\t\t\t\t\t_gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t\t} else if ( useMultisampledRTT( renderTarget ) ) {\n\n\t\t\t\t\tmultisampledRTTExt.renderbufferStorageMultisampleEXT( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, null );\n\n\t}\n\n\t// Setup resources for a Depth Texture for a FBO (needs an extension)\n\tfunction setupDepthTexture( framebuffer, renderTarget ) {\n\n\t\tconst isCube = ( renderTarget && renderTarget.isWebGLCubeRenderTarget );\n\t\tif ( isCube ) throw new Error( 'Depth Texture with cube render targets is not supported' );\n\n\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\tif ( ! ( renderTarget.depthTexture && renderTarget.depthTexture.isDepthTexture ) ) {\n\n\t\t\tthrow new Error( 'renderTarget.depthTexture must be an instance of THREE.DepthTexture' );\n\n\t\t}\n\n\t\tconst textureProperties = properties.get( renderTarget.depthTexture );\n\t\ttextureProperties.__renderTarget = renderTarget;\n\n\t\t// upload an empty depth texture with framebuffer size\n\t\tif ( ! textureProperties.__webglTexture ||\n\t\t\t\trenderTarget.depthTexture.image.width !== renderTarget.width ||\n\t\t\t\trenderTarget.depthTexture.image.height !== renderTarget.height ) {\n\n\t\t\trenderTarget.depthTexture.image.width = renderTarget.width;\n\t\t\trenderTarget.depthTexture.image.height = renderTarget.height;\n\t\t\trenderTarget.depthTexture.needsUpdate = true;\n\n\t\t}\n\n\t\tsetTexture2D( renderTarget.depthTexture, 0 );\n\n\t\tconst webglDepthTexture = textureProperties.__webglTexture;\n\t\tconst samples = getRenderTargetSamples( renderTarget );\n\n\t\tif ( renderTarget.depthTexture.format === DepthFormat ) {\n\n\t\t\tif ( useMultisampledRTT( renderTarget ) ) {\n\n\t\t\t\tmultisampledRTTExt.framebufferTexture2DMultisampleEXT( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0, samples );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 );\n\n\t\t\t}\n\n\t\t} else if ( renderTarget.depthTexture.format === DepthStencilFormat ) {\n\n\t\t\tif ( useMultisampledRTT( renderTarget ) ) {\n\n\t\t\t\tmultisampledRTTExt.framebufferTexture2DMultisampleEXT( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0, samples );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'Unknown depthTexture format' );\n\n\t\t}\n\n\t}\n\n\t// Setup GL resources for a non-texture depth buffer\n\tfunction setupDepthRenderbuffer( renderTarget ) {\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\tconst isCube = ( renderTarget.isWebGLCubeRenderTarget === true );\n\n\t\t// if the bound depth texture has changed\n\t\tif ( renderTargetProperties.__boundDepthTexture !== renderTarget.depthTexture ) {\n\n\t\t\t// fire the dispose event to get rid of stored state associated with the previously bound depth buffer\n\t\t\tconst depthTexture = renderTarget.depthTexture;\n\t\t\tif ( renderTargetProperties.__depthDisposeCallback ) {\n\n\t\t\t\trenderTargetProperties.__depthDisposeCallback();\n\n\t\t\t}\n\n\t\t\t// set up dispose listeners to track when the currently attached buffer is implicitly unbound\n\t\t\tif ( depthTexture ) {\n\n\t\t\t\tconst disposeEvent = () => {\n\n\t\t\t\t\tdelete renderTargetProperties.__boundDepthTexture;\n\t\t\t\t\tdelete renderTargetProperties.__depthDisposeCallback;\n\t\t\t\t\tdepthTexture.removeEventListener( 'dispose', disposeEvent );\n\n\t\t\t\t};\n\n\t\t\t\tdepthTexture.addEventListener( 'dispose', disposeEvent );\n\t\t\t\trenderTargetProperties.__depthDisposeCallback = disposeEvent;\n\n\t\t\t}\n\n\t\t\trenderTargetProperties.__boundDepthTexture = depthTexture;\n\n\t\t}\n\n\t\tif ( renderTarget.depthTexture && ! renderTargetProperties.__autoAllocateDepthBuffer ) {\n\n\t\t\tif ( isCube ) throw new Error( 'target.depthTexture not supported in Cube render targets' );\n\n\t\t\tconst mipmaps = renderTarget.texture.mipmaps;\n\n\t\t\tif ( mipmaps && mipmaps.length > 0 ) {\n\n\t\t\t\tsetupDepthTexture( renderTargetProperties.__webglFramebuffer[ 0 ], renderTarget );\n\n\t\t\t} else {\n\n\t\t\t\tsetupDepthTexture( renderTargetProperties.__webglFramebuffer, renderTarget );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( isCube ) {\n\n\t\t\t\trenderTargetProperties.__webglDepthbuffer = [];\n\n\t\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer[ i ] );\n\n\t\t\t\t\tif ( renderTargetProperties.__webglDepthbuffer[ i ] === undefined ) {\n\n\t\t\t\t\t\trenderTargetProperties.__webglDepthbuffer[ i ] = _gl.createRenderbuffer();\n\t\t\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer[ i ], renderTarget, false );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// attach buffer if it's been created already\n\t\t\t\t\t\tconst glAttachmentType = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT;\n\t\t\t\t\t\tconst renderbuffer = renderTargetProperties.__webglDepthbuffer[ i ];\n\t\t\t\t\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, renderbuffer );\n\t\t\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, glAttachmentType, _gl.RENDERBUFFER, renderbuffer );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tconst mipmaps = renderTarget.texture.mipmaps;\n\n\t\t\t\tif ( mipmaps && mipmaps.length > 0 ) {\n\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer[ 0 ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );\n\n\t\t\t\t}\n\n\t\t\t\tif ( renderTargetProperties.__webglDepthbuffer === undefined ) {\n\n\t\t\t\t\trenderTargetProperties.__webglDepthbuffer = _gl.createRenderbuffer();\n\t\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer, renderTarget, false );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// attach buffer if it's been created already\n\t\t\t\t\tconst glAttachmentType = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT;\n\t\t\t\t\tconst renderbuffer = renderTargetProperties.__webglDepthbuffer;\n\t\t\t\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, renderbuffer );\n\t\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, glAttachmentType, _gl.RENDERBUFFER, renderbuffer );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\n\t}\n\n\t// rebind framebuffer with external textures\n\tfunction rebindTextures( renderTarget, colorTexture, depthTexture ) {\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\tif ( colorTexture !== undefined ) {\n\n\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, renderTarget.texture, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, 0 );\n\n\t\t}\n\n\t\tif ( depthTexture !== undefined ) {\n\n\t\t\tsetupDepthRenderbuffer( renderTarget );\n\n\t\t}\n\n\t}\n\n\t// Set up GL resources for the render target\n\tfunction setupRenderTarget( renderTarget ) {\n\n\t\tconst texture = renderTarget.texture;\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\tconst textureProperties = properties.get( texture );\n\n\t\trenderTarget.addEventListener( 'dispose', onRenderTargetDispose );\n\n\t\tconst textures = renderTarget.textures;\n\n\t\tconst isCube = ( renderTarget.isWebGLCubeRenderTarget === true );\n\t\tconst isMultipleRenderTargets = ( textures.length > 1 );\n\n\t\tif ( ! isMultipleRenderTargets ) {\n\n\t\t\tif ( textureProperties.__webglTexture === undefined ) {\n\n\t\t\t\ttextureProperties.__webglTexture = _gl.createTexture();\n\n\t\t\t}\n\n\t\t\ttextureProperties.__version = texture.version;\n\t\t\tinfo.memory.textures ++;\n\n\t\t}\n\n\t\t// Setup framebuffer\n\n\t\tif ( isCube ) {\n\n\t\t\trenderTargetProperties.__webglFramebuffer = [];\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\tif ( texture.mipmaps && texture.mipmaps.length > 0 ) {\n\n\t\t\t\t\trenderTargetProperties.__webglFramebuffer[ i ] = [];\n\n\t\t\t\t\tfor ( let level = 0; level < texture.mipmaps.length; level ++ ) {\n\n\t\t\t\t\t\trenderTargetProperties.__webglFramebuffer[ i ][ level ] = _gl.createFramebuffer();\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\trenderTargetProperties.__webglFramebuffer[ i ] = _gl.createFramebuffer();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( texture.mipmaps && texture.mipmaps.length > 0 ) {\n\n\t\t\t\trenderTargetProperties.__webglFramebuffer = [];\n\n\t\t\t\tfor ( let level = 0; level < texture.mipmaps.length; level ++ ) {\n\n\t\t\t\t\trenderTargetProperties.__webglFramebuffer[ level ] = _gl.createFramebuffer();\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\trenderTargetProperties.__webglFramebuffer = _gl.createFramebuffer();\n\n\t\t\t}\n\n\t\t\tif ( isMultipleRenderTargets ) {\n\n\t\t\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst attachmentProperties = properties.get( textures[ i ] );\n\n\t\t\t\t\tif ( attachmentProperties.__webglTexture === undefined ) {\n\n\t\t\t\t\t\tattachmentProperties.__webglTexture = _gl.createTexture();\n\n\t\t\t\t\t\tinfo.memory.textures ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( ( renderTarget.samples > 0 ) && useMultisampledRTT( renderTarget ) === false ) {\n\n\t\t\t\trenderTargetProperties.__webglMultisampledFramebuffer = _gl.createFramebuffer();\n\t\t\t\trenderTargetProperties.__webglColorRenderbuffer = [];\n\n\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );\n\n\t\t\t\tfor ( let i = 0; i < textures.length; i ++ ) {\n\n\t\t\t\t\tconst texture = textures[ i ];\n\t\t\t\t\trenderTargetProperties.__webglColorRenderbuffer[ i ] = _gl.createRenderbuffer();\n\n\t\t\t\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[ i ] );\n\n\t\t\t\t\tconst glFormat = utils.convert( texture.format, texture.colorSpace );\n\t\t\t\t\tconst glType = utils.convert( texture.type );\n\t\t\t\t\tconst glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.colorSpace, renderTarget.isXRRenderTarget === true );\n\t\t\t\t\tconst samples = getRenderTargetSamples( renderTarget );\n\t\t\t\t\t_gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[ i ] );\n\n\t\t\t\t}\n\n\t\t\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, null );\n\n\t\t\t\tif ( renderTarget.depthBuffer ) {\n\n\t\t\t\t\trenderTargetProperties.__webglDepthRenderbuffer = _gl.createRenderbuffer();\n\t\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthRenderbuffer, renderTarget, true );\n\n\t\t\t\t}\n\n\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Setup color buffer\n\n\t\tif ( isCube ) {\n\n\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture );\n\t\t\tsetTextureParameters( _gl.TEXTURE_CUBE_MAP, texture );\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\tif ( texture.mipmaps && texture.mipmaps.length > 0 ) {\n\n\t\t\t\t\tfor ( let level = 0; level < texture.mipmaps.length; level ++ ) {\n\n\t\t\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ i ][ level ], renderTarget, texture, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, level );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ i ], renderTarget, texture, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture ) ) {\n\n\t\t\t\tgenerateMipmap( _gl.TEXTURE_CUBE_MAP );\n\n\t\t\t}\n\n\t\t\tstate.unbindTexture();\n\n\t\t} else if ( isMultipleRenderTargets ) {\n\n\t\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\t\tconst attachment = textures[ i ];\n\t\t\t\tconst attachmentProperties = properties.get( attachment );\n\n\t\t\t\tlet glTextureType = _gl.TEXTURE_2D;\n\n\t\t\t\tif ( renderTarget.isWebGL3DRenderTarget || renderTarget.isWebGLArrayRenderTarget ) {\n\n\t\t\t\t\tglTextureType = renderTarget.isWebGL3DRenderTarget ? _gl.TEXTURE_3D : _gl.TEXTURE_2D_ARRAY;\n\n\t\t\t\t}\n\n\t\t\t\tstate.bindTexture( glTextureType, attachmentProperties.__webglTexture );\n\t\t\t\tsetTextureParameters( glTextureType, attachment );\n\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, attachment, _gl.COLOR_ATTACHMENT0 + i, glTextureType, 0 );\n\n\t\t\t\tif ( textureNeedsGenerateMipmaps( attachment ) ) {\n\n\t\t\t\t\tgenerateMipmap( glTextureType );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tstate.unbindTexture();\n\n\t\t} else {\n\n\t\t\tlet glTextureType = _gl.TEXTURE_2D;\n\n\t\t\tif ( renderTarget.isWebGL3DRenderTarget || renderTarget.isWebGLArrayRenderTarget ) {\n\n\t\t\t\tglTextureType = renderTarget.isWebGL3DRenderTarget ? _gl.TEXTURE_3D : _gl.TEXTURE_2D_ARRAY;\n\n\t\t\t}\n\n\t\t\tstate.bindTexture( glTextureType, textureProperties.__webglTexture );\n\t\t\tsetTextureParameters( glTextureType, texture );\n\n\t\t\tif ( texture.mipmaps && texture.mipmaps.length > 0 ) {\n\n\t\t\t\tfor ( let level = 0; level < texture.mipmaps.length; level ++ ) {\n\n\t\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ level ], renderTarget, texture, _gl.COLOR_ATTACHMENT0, glTextureType, level );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, texture, _gl.COLOR_ATTACHMENT0, glTextureType, 0 );\n\n\t\t\t}\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture ) ) {\n\n\t\t\t\tgenerateMipmap( glTextureType );\n\n\t\t\t}\n\n\t\t\tstate.unbindTexture();\n\n\t\t}\n\n\t\t// Setup depth and stencil buffers\n\n\t\tif ( renderTarget.depthBuffer ) {\n\n\t\t\tsetupDepthRenderbuffer( renderTarget );\n\n\t\t}\n\n\t}\n\n\tfunction updateRenderTargetMipmap( renderTarget ) {\n\n\t\tconst textures = renderTarget.textures;\n\n\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\tconst texture = textures[ i ];\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture ) ) {\n\n\t\t\t\tconst targetType = getTargetType( renderTarget );\n\t\t\t\tconst webglTexture = properties.get( texture ).__webglTexture;\n\n\t\t\t\tstate.bindTexture( targetType, webglTexture );\n\t\t\t\tgenerateMipmap( targetType );\n\t\t\t\tstate.unbindTexture();\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tconst invalidationArrayRead = [];\n\tconst invalidationArrayDraw = [];\n\n\tfunction updateMultisampleRenderTarget( renderTarget ) {\n\n\t\tif ( renderTarget.samples > 0 ) {\n\n\t\t\tif ( useMultisampledRTT( renderTarget ) === false ) {\n\n\t\t\t\tconst textures = renderTarget.textures;\n\t\t\t\tconst width = renderTarget.width;\n\t\t\t\tconst height = renderTarget.height;\n\t\t\t\tlet mask = _gl.COLOR_BUFFER_BIT;\n\t\t\t\tconst depthStyle = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT;\n\t\t\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\t\t\tconst isMultipleRenderTargets = ( textures.length > 1 );\n\n\t\t\t\t// If MRT we need to remove FBO attachments\n\t\t\t\tif ( isMultipleRenderTargets ) {\n\n\t\t\t\t\tfor ( let i = 0; i < textures.length; i ++ ) {\n\n\t\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );\n\t\t\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.RENDERBUFFER, null );\n\n\t\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );\n\t\t\t\t\t\t_gl.framebufferTexture2D( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.TEXTURE_2D, null, 0 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tstate.bindFramebuffer( _gl.READ_FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );\n\n\t\t\t\tconst mipmaps = renderTarget.texture.mipmaps;\n\n\t\t\t\tif ( mipmaps && mipmaps.length > 0 ) {\n\n\t\t\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, renderTargetProperties.__webglFramebuffer[ 0 ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0; i < textures.length; i ++ ) {\n\n\t\t\t\t\tif ( renderTarget.resolveDepthBuffer ) {\n\n\t\t\t\t\t\tif ( renderTarget.depthBuffer ) mask |= _gl.DEPTH_BUFFER_BIT;\n\n\t\t\t\t\t\t// resolving stencil is slow with a D3D backend. disable it for all transmission render targets (see #27799)\n\n\t\t\t\t\t\tif ( renderTarget.stencilBuffer && renderTarget.resolveStencilBuffer ) mask |= _gl.STENCIL_BUFFER_BIT;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( isMultipleRenderTargets ) {\n\n\t\t\t\t\t\t_gl.framebufferRenderbuffer( _gl.READ_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[ i ] );\n\n\t\t\t\t\t\tconst webglTexture = properties.get( textures[ i ] ).__webglTexture;\n\t\t\t\t\t\t_gl.framebufferTexture2D( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, webglTexture, 0 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_gl.blitFramebuffer( 0, 0, width, height, 0, 0, width, height, mask, _gl.NEAREST );\n\n\t\t\t\t\tif ( supportsInvalidateFramebuffer === true ) {\n\n\t\t\t\t\t\tinvalidationArrayRead.length = 0;\n\t\t\t\t\t\tinvalidationArrayDraw.length = 0;\n\n\t\t\t\t\t\tinvalidationArrayRead.push( _gl.COLOR_ATTACHMENT0 + i );\n\n\t\t\t\t\t\tif ( renderTarget.depthBuffer && renderTarget.resolveDepthBuffer === false ) {\n\n\t\t\t\t\t\t\tinvalidationArrayRead.push( depthStyle );\n\t\t\t\t\t\t\tinvalidationArrayDraw.push( depthStyle );\n\n\t\t\t\t\t\t\t_gl.invalidateFramebuffer( _gl.DRAW_FRAMEBUFFER, invalidationArrayDraw );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t_gl.invalidateFramebuffer( _gl.READ_FRAMEBUFFER, invalidationArrayRead );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tstate.bindFramebuffer( _gl.READ_FRAMEBUFFER, null );\n\t\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, null );\n\n\t\t\t\t// If MRT since pre-blit we removed the FBO we need to reconstruct the attachments\n\t\t\t\tif ( isMultipleRenderTargets ) {\n\n\t\t\t\t\tfor ( let i = 0; i < textures.length; i ++ ) {\n\n\t\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );\n\t\t\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[ i ] );\n\n\t\t\t\t\t\tconst webglTexture = properties.get( textures[ i ] ).__webglTexture;\n\n\t\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );\n\t\t\t\t\t\t_gl.framebufferTexture2D( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.TEXTURE_2D, webglTexture, 0 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );\n\n\t\t\t} else {\n\n\t\t\t\tif ( renderTarget.depthBuffer && renderTarget.resolveDepthBuffer === false && supportsInvalidateFramebuffer ) {\n\n\t\t\t\t\tconst depthStyle = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT;\n\n\t\t\t\t\t_gl.invalidateFramebuffer( _gl.DRAW_FRAMEBUFFER, [ depthStyle ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction getRenderTargetSamples( renderTarget ) {\n\n\t\treturn Math.min( capabilities.maxSamples, renderTarget.samples );\n\n\t}\n\n\tfunction useMultisampledRTT( renderTarget ) {\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\treturn renderTarget.samples > 0 && extensions.has( 'WEBGL_multisampled_render_to_texture' ) === true && renderTargetProperties.__useRenderToTexture !== false;\n\n\t}\n\n\tfunction updateVideoTexture( texture ) {\n\n\t\tconst frame = info.render.frame;\n\n\t\t// Check the last frame we updated the VideoTexture\n\n\t\tif ( _videoTextures.get( texture ) !== frame ) {\n\n\t\t\t_videoTextures.set( texture, frame );\n\t\t\ttexture.update();\n\n\t\t}\n\n\t}\n\n\tfunction verifyColorSpace( texture, image ) {\n\n\t\tconst colorSpace = texture.colorSpace;\n\t\tconst format = texture.format;\n\t\tconst type = texture.type;\n\n\t\tif ( texture.isCompressedTexture === true || texture.isVideoTexture === true ) return image;\n\n\t\tif ( colorSpace !== LinearSRGBColorSpace && colorSpace !== NoColorSpace ) {\n\n\t\t\t// sRGB\n\n\t\t\tif ( ColorManagement.getTransfer( colorSpace ) === SRGBTransfer ) {\n\n\t\t\t\t// in WebGL 2 uncompressed textures can only be sRGB encoded if they have the RGBA8 format\n\n\t\t\t\tif ( format !== RGBAFormat || type !== UnsignedByteType ) {\n\n\t\t\t\t\twarn( 'WebGLTextures: sRGB encoded textures have to use RGBAFormat and UnsignedByteType.' );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\terror( 'WebGLTextures: Unsupported texture color space:', colorSpace );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn image;\n\n\t}\n\n\tfunction getDimensions( image ) {\n\n\t\tif ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) {\n\n\t\t\t// if intrinsic data are not available, fallback to width/height\n\n\t\t\t_imageDimensions.width = image.naturalWidth || image.width;\n\t\t\t_imageDimensions.height = image.naturalHeight || image.height;\n\n\t\t} else if ( typeof VideoFrame !== 'undefined' && image instanceof VideoFrame ) {\n\n\t\t\t_imageDimensions.width = image.displayWidth;\n\t\t\t_imageDimensions.height = image.displayHeight;\n\n\t\t} else {\n\n\t\t\t_imageDimensions.width = image.width;\n\t\t\t_imageDimensions.height = image.height;\n\n\t\t}\n\n\t\treturn _imageDimensions;\n\n\t}\n\n\t//\n\n\tthis.allocateTextureUnit = allocateTextureUnit;\n\tthis.resetTextureUnits = resetTextureUnits;\n\n\tthis.setTexture2D = setTexture2D;\n\tthis.setTexture2DArray = setTexture2DArray;\n\tthis.setTexture3D = setTexture3D;\n\tthis.setTextureCube = setTextureCube;\n\tthis.rebindTextures = rebindTextures;\n\tthis.setupRenderTarget = setupRenderTarget;\n\tthis.updateRenderTargetMipmap = updateRenderTargetMipmap;\n\tthis.updateMultisampleRenderTarget = updateMultisampleRenderTarget;\n\tthis.setupDepthRenderbuffer = setupDepthRenderbuffer;\n\tthis.setupFrameBufferTexture = setupFrameBufferTexture;\n\tthis.useMultisampledRTT = useMultisampledRTT;\n\n}\n\nfunction WebGLUtils( gl, extensions ) {\n\n\tfunction convert( p, colorSpace = NoColorSpace ) {\n\n\t\tlet extension;\n\n\t\tconst transfer = ColorManagement.getTransfer( colorSpace );\n\n\t\tif ( p === UnsignedByteType ) return gl.UNSIGNED_BYTE;\n\t\tif ( p === UnsignedShort4444Type ) return gl.UNSIGNED_SHORT_4_4_4_4;\n\t\tif ( p === UnsignedShort5551Type ) return gl.UNSIGNED_SHORT_5_5_5_1;\n\t\tif ( p === UnsignedInt5999Type ) return gl.UNSIGNED_INT_5_9_9_9_REV;\n\t\tif ( p === UnsignedInt101111Type ) return gl.UNSIGNED_INT_10F_11F_11F_REV;\n\n\t\tif ( p === ByteType ) return gl.BYTE;\n\t\tif ( p === ShortType ) return gl.SHORT;\n\t\tif ( p === UnsignedShortType ) return gl.UNSIGNED_SHORT;\n\t\tif ( p === IntType ) return gl.INT;\n\t\tif ( p === UnsignedIntType ) return gl.UNSIGNED_INT;\n\t\tif ( p === FloatType ) return gl.FLOAT;\n\t\tif ( p === HalfFloatType ) return gl.HALF_FLOAT;\n\n\t\tif ( p === AlphaFormat ) return gl.ALPHA;\n\t\tif ( p === RGBFormat ) return gl.RGB;\n\t\tif ( p === RGBAFormat ) return gl.RGBA;\n\t\tif ( p === DepthFormat ) return gl.DEPTH_COMPONENT;\n\t\tif ( p === DepthStencilFormat ) return gl.DEPTH_STENCIL;\n\n\t\t// WebGL2 formats.\n\n\t\tif ( p === RedFormat ) return gl.RED;\n\t\tif ( p === RedIntegerFormat ) return gl.RED_INTEGER;\n\t\tif ( p === RGFormat ) return gl.RG;\n\t\tif ( p === RGIntegerFormat ) return gl.RG_INTEGER;\n\t\tif ( p === RGBAIntegerFormat ) return gl.RGBA_INTEGER;\n\n\t\t// S3TC\n\n\t\tif ( p === RGB_S3TC_DXT1_Format || p === RGBA_S3TC_DXT1_Format || p === RGBA_S3TC_DXT3_Format || p === RGBA_S3TC_DXT5_Format ) {\n\n\t\t\tif ( transfer === SRGBTransfer ) {\n\n\t\t\t\textension = extensions.get( 'WEBGL_compressed_texture_s3tc_srgb' );\n\n\t\t\t\tif ( extension !== null ) {\n\n\t\t\t\t\tif ( p === RGB_S3TC_DXT1_Format ) return extension.COMPRESSED_SRGB_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT1_Format ) return extension.COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT3_Format ) return extension.COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT5_Format ) return extension.COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT;\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\textension = extensions.get( 'WEBGL_compressed_texture_s3tc' );\n\n\t\t\t\tif ( extension !== null ) {\n\n\t\t\t\t\tif ( p === RGB_S3TC_DXT1_Format ) return extension.COMPRESSED_RGB_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT1_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT3_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT3_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT5_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT5_EXT;\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// PVRTC\n\n\t\tif ( p === RGB_PVRTC_4BPPV1_Format || p === RGB_PVRTC_2BPPV1_Format || p === RGBA_PVRTC_4BPPV1_Format || p === RGBA_PVRTC_2BPPV1_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_pvrtc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGB_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;\n\t\t\t\tif ( p === RGB_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;\n\t\t\t\tif ( p === RGBA_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;\n\t\t\t\tif ( p === RGBA_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// ETC\n\n\t\tif ( p === RGB_ETC1_Format || p === RGB_ETC2_Format || p === RGBA_ETC2_EAC_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_etc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGB_ETC1_Format || p === RGB_ETC2_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ETC2 : extension.COMPRESSED_RGB8_ETC2;\n\t\t\t\tif ( p === RGBA_ETC2_EAC_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC : extension.COMPRESSED_RGBA8_ETC2_EAC;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// ASTC\n\n\t\tif ( p === RGBA_ASTC_4x4_Format || p === RGBA_ASTC_5x4_Format || p === RGBA_ASTC_5x5_Format ||\n\t\t\tp === RGBA_ASTC_6x5_Format || p === RGBA_ASTC_6x6_Format || p === RGBA_ASTC_8x5_Format ||\n\t\t\tp === RGBA_ASTC_8x6_Format || p === RGBA_ASTC_8x8_Format || p === RGBA_ASTC_10x5_Format ||\n\t\t\tp === RGBA_ASTC_10x6_Format || p === RGBA_ASTC_10x8_Format || p === RGBA_ASTC_10x10_Format ||\n\t\t\tp === RGBA_ASTC_12x10_Format || p === RGBA_ASTC_12x12_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_astc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGBA_ASTC_4x4_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR : extension.COMPRESSED_RGBA_ASTC_4x4_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_5x4_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR : extension.COMPRESSED_RGBA_ASTC_5x4_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_5x5_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR : extension.COMPRESSED_RGBA_ASTC_5x5_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_6x5_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR : extension.COMPRESSED_RGBA_ASTC_6x5_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_6x6_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR : extension.COMPRESSED_RGBA_ASTC_6x6_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_8x5_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR : extension.COMPRESSED_RGBA_ASTC_8x5_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_8x6_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR : extension.COMPRESSED_RGBA_ASTC_8x6_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_8x8_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR : extension.COMPRESSED_RGBA_ASTC_8x8_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_10x5_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR : extension.COMPRESSED_RGBA_ASTC_10x5_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_10x6_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR : extension.COMPRESSED_RGBA_ASTC_10x6_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_10x8_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR : extension.COMPRESSED_RGBA_ASTC_10x8_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_10x10_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR : extension.COMPRESSED_RGBA_ASTC_10x10_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_12x10_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR : extension.COMPRESSED_RGBA_ASTC_12x10_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_12x12_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR : extension.COMPRESSED_RGBA_ASTC_12x12_KHR;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// BPTC\n\n\t\tif ( p === RGBA_BPTC_Format || p === RGB_BPTC_SIGNED_Format || p === RGB_BPTC_UNSIGNED_Format ) {\n\n\t\t\textension = extensions.get( 'EXT_texture_compression_bptc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGBA_BPTC_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT : extension.COMPRESSED_RGBA_BPTC_UNORM_EXT;\n\t\t\t\tif ( p === RGB_BPTC_SIGNED_Format ) return extension.COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT;\n\t\t\t\tif ( p === RGB_BPTC_UNSIGNED_Format ) return extension.COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// RGTC\n\n\t\tif ( p === RED_RGTC1_Format || p === SIGNED_RED_RGTC1_Format || p === RED_GREEN_RGTC2_Format || p === SIGNED_RED_GREEN_RGTC2_Format ) {\n\n\t\t\textension = extensions.get( 'EXT_texture_compression_rgtc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RED_RGTC1_Format ) return extension.COMPRESSED_RED_RGTC1_EXT;\n\t\t\t\tif ( p === SIGNED_RED_RGTC1_Format ) return extension.COMPRESSED_SIGNED_RED_RGTC1_EXT;\n\t\t\t\tif ( p === RED_GREEN_RGTC2_Format ) return extension.COMPRESSED_RED_GREEN_RGTC2_EXT;\n\t\t\t\tif ( p === SIGNED_RED_GREEN_RGTC2_Format ) return extension.COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tif ( p === UnsignedInt248Type ) return gl.UNSIGNED_INT_24_8;\n\n\t\t// if \"p\" can't be resolved, assume the user defines a WebGL constant as a string (fallback/workaround for packed RGB formats)\n\n\t\treturn ( gl[ p ] !== undefined ) ? gl[ p ] : null;\n\n\t}\n\n\treturn { convert: convert };\n\n}\n\nconst _occlusion_vertex = `\nvoid main() {\n\n\tgl_Position = vec4( position, 1.0 );\n\n}`;\n\nconst _occlusion_fragment = `\nuniform sampler2DArray depthColor;\nuniform float depthWidth;\nuniform float depthHeight;\n\nvoid main() {\n\n\tvec2 coord = vec2( gl_FragCoord.x / depthWidth, gl_FragCoord.y / depthHeight );\n\n\tif ( coord.x >= 1.0 ) {\n\n\t\tgl_FragDepth = texture( depthColor, vec3( coord.x - 1.0, coord.y, 1 ) ).r;\n\n\t} else {\n\n\t\tgl_FragDepth = texture( depthColor, vec3( coord.x, coord.y, 0 ) ).r;\n\n\t}\n\n}`;\n\n/**\n * A XR module that manages the access to the Depth Sensing API.\n */\nclass WebXRDepthSensing {\n\n\t/**\n\t * Constructs a new depth sensing module.\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * An opaque texture representing the depth of the user's environment.\n\t\t *\n\t\t * @type {?ExternalTexture}\n\t\t */\n\t\tthis.texture = null;\n\n\t\t/**\n\t\t * A plane mesh for visualizing the depth texture.\n\t\t *\n\t\t * @type {?Mesh}\n\t\t */\n\t\tthis.mesh = null;\n\n\t\t/**\n\t\t * The depth near value.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.depthNear = 0;\n\n\t\t/**\n\t\t * The depth near far.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.depthFar = 0;\n\n\t}\n\n\t/**\n\t * Inits the depth sensing module\n\t *\n\t * @param {XRWebGLDepthInformation} depthData - The XR depth data.\n\t * @param {XRRenderState} renderState - The XR render state.\n\t */\n\tinit( depthData, renderState ) {\n\n\t\tif ( this.texture === null ) {\n\n\t\t\tconst texture = new ExternalTexture( depthData.texture );\n\n\t\t\tif ( ( depthData.depthNear !== renderState.depthNear ) || ( depthData.depthFar !== renderState.depthFar ) ) {\n\n\t\t\t\tthis.depthNear = depthData.depthNear;\n\t\t\t\tthis.depthFar = depthData.depthFar;\n\n\t\t\t}\n\n\t\t\tthis.texture = texture;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns a plane mesh that visualizes the depth texture.\n\t *\n\t * @param {ArrayCamera} cameraXR - The XR camera.\n\t * @return {?Mesh} The plane mesh.\n\t */\n\tgetMesh( cameraXR ) {\n\n\t\tif ( this.texture !== null ) {\n\n\t\t\tif ( this.mesh === null ) {\n\n\t\t\t\tconst viewport = cameraXR.cameras[ 0 ].viewport;\n\t\t\t\tconst material = new ShaderMaterial( {\n\t\t\t\t\tvertexShader: _occlusion_vertex,\n\t\t\t\t\tfragmentShader: _occlusion_fragment,\n\t\t\t\t\tuniforms: {\n\t\t\t\t\t\tdepthColor: { value: this.texture },\n\t\t\t\t\t\tdepthWidth: { value: viewport.z },\n\t\t\t\t\t\tdepthHeight: { value: viewport.w }\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\tthis.mesh = new Mesh( new PlaneGeometry( 20, 20 ), material );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this.mesh;\n\n\t}\n\n\t/**\n\t * Resets the module\n\t */\n\treset() {\n\n\t\tthis.texture = null;\n\t\tthis.mesh = null;\n\n\t}\n\n\t/**\n\t * Returns a texture representing the depth of the user's environment.\n\t *\n\t * @return {?ExternalTexture} The depth texture.\n\t */\n\tgetDepthTexture() {\n\n\t\treturn this.texture;\n\n\t}\n\n}\n\n/**\n * This class represents an abstraction of the WebXR Device API and is\n * internally used by {@link WebGLRenderer}. `WebXRManager` also provides a public\n * interface that allows users to enable/disable XR and perform XR related\n * tasks like for instance retrieving controllers.\n *\n * @augments EventDispatcher\n * @hideconstructor\n */\nclass WebXRManager extends EventDispatcher {\n\n\t/**\n\t * Constructs a new WebGL renderer.\n\t *\n\t * @param {WebGLRenderer} renderer - The renderer.\n\t * @param {WebGL2RenderingContext} gl - The rendering context.\n\t */\n\tconstructor( renderer, gl ) {\n\n\t\tsuper();\n\n\t\tconst scope = this;\n\n\t\tlet session = null;\n\n\t\tlet framebufferScaleFactor = 1.0;\n\n\t\tlet referenceSpace = null;\n\t\tlet referenceSpaceType = 'local-floor';\n\t\t// Set default foveation to maximum.\n\t\tlet foveation = 1.0;\n\t\tlet customReferenceSpace = null;\n\n\t\tlet pose = null;\n\t\tlet glBinding = null;\n\t\tlet glProjLayer = null;\n\t\tlet glBaseLayer = null;\n\t\tlet xrFrame = null;\n\n\t\tconst supportsGlBinding = typeof XRWebGLBinding !== 'undefined';\n\n\t\tconst depthSensing = new WebXRDepthSensing();\n\t\tconst cameraAccessTextures = {};\n\t\tconst attributes = gl.getContextAttributes();\n\n\t\tlet initialRenderTarget = null;\n\t\tlet newRenderTarget = null;\n\n\t\tconst controllers = [];\n\t\tconst controllerInputSources = [];\n\n\t\tconst currentSize = new Vector2();\n\t\tlet currentPixelRatio = null;\n\n\t\t//\n\n\t\tconst cameraL = new PerspectiveCamera();\n\t\tcameraL.viewport = new Vector4();\n\n\t\tconst cameraR = new PerspectiveCamera();\n\t\tcameraR.viewport = new Vector4();\n\n\t\tconst cameras = [ cameraL, cameraR ];\n\n\t\tconst cameraXR = new ArrayCamera();\n\n\t\tlet _currentDepthNear = null;\n\t\tlet _currentDepthFar = null;\n\n\t\t//\n\n\t\t/**\n\t\t * Whether the manager's XR camera should be automatically updated or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.cameraAutoUpdate = true;\n\n\t\t/**\n\t\t * This flag notifies the renderer to be ready for XR rendering. Set it to `true`\n\t\t * if you are going to use XR in your app.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.enabled = false;\n\n\t\t/**\n\t\t * Whether XR presentation is active or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default false\n\t\t */\n\t\tthis.isPresenting = false;\n\n\t\t/**\n\t\t * Returns a group representing the `target ray` space of the XR controller.\n\t\t * Use this space for visualizing 3D objects that support the user in pointing\n\t\t * tasks like UI interaction.\n\t\t *\n\t\t * @param {number} index - The index of the controller.\n\t\t * @return {Group} A group representing the `target ray` space.\n\t\t */\n\t\tthis.getController = function ( index ) {\n\n\t\t\tlet controller = controllers[ index ];\n\n\t\t\tif ( controller === undefined ) {\n\n\t\t\t\tcontroller = new WebXRController();\n\t\t\t\tcontrollers[ index ] = controller;\n\n\t\t\t}\n\n\t\t\treturn controller.getTargetRaySpace();\n\n\t\t};\n\n\t\t/**\n\t\t * Returns a group representing the `grip` space of the XR controller.\n\t\t * Use this space for visualizing 3D objects that support the user in pointing\n\t\t * tasks like UI interaction.\n\t\t *\n\t\t * Note: If you want to show something in the user's hand AND offer a\n\t\t * pointing ray at the same time, you'll want to attached the handheld object\n\t\t * to the group returned by `getControllerGrip()` and the ray to the\n\t\t * group returned by `getController()`. The idea is to have two\n\t\t * different groups in two different coordinate spaces for the same WebXR\n\t\t * controller.\n\t\t *\n\t\t * @param {number} index - The index of the controller.\n\t\t * @return {Group} A group representing the `grip` space.\n\t\t */\n\t\tthis.getControllerGrip = function ( index ) {\n\n\t\t\tlet controller = controllers[ index ];\n\n\t\t\tif ( controller === undefined ) {\n\n\t\t\t\tcontroller = new WebXRController();\n\t\t\t\tcontrollers[ index ] = controller;\n\n\t\t\t}\n\n\t\t\treturn controller.getGripSpace();\n\n\t\t};\n\n\t\t/**\n\t\t * Returns a group representing the `hand` space of the XR controller.\n\t\t * Use this space for visualizing 3D objects that support the user in pointing\n\t\t * tasks like UI interaction.\n\t\t *\n\t\t * @param {number} index - The index of the controller.\n\t\t * @return {Group} A group representing the `hand` space.\n\t\t */\n\t\tthis.getHand = function ( index ) {\n\n\t\t\tlet controller = controllers[ index ];\n\n\t\t\tif ( controller === undefined ) {\n\n\t\t\t\tcontroller = new WebXRController();\n\t\t\t\tcontrollers[ index ] = controller;\n\n\t\t\t}\n\n\t\t\treturn controller.getHandSpace();\n\n\t\t};\n\n\t\t//\n\n\t\tfunction onSessionEvent( event ) {\n\n\t\t\tconst controllerIndex = controllerInputSources.indexOf( event.inputSource );\n\n\t\t\tif ( controllerIndex === -1 ) {\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tconst controller = controllers[ controllerIndex ];\n\n\t\t\tif ( controller !== undefined ) {\n\n\t\t\t\tcontroller.update( event.inputSource, event.frame, customReferenceSpace || referenceSpace );\n\t\t\t\tcontroller.dispatchEvent( { type: event.type, data: event.inputSource } );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onSessionEnd() {\n\n\t\t\tsession.removeEventListener( 'select', onSessionEvent );\n\t\t\tsession.removeEventListener( 'selectstart', onSessionEvent );\n\t\t\tsession.removeEventListener( 'selectend', onSessionEvent );\n\t\t\tsession.removeEventListener( 'squeeze', onSessionEvent );\n\t\t\tsession.removeEventListener( 'squeezestart', onSessionEvent );\n\t\t\tsession.removeEventListener( 'squeezeend', onSessionEvent );\n\t\t\tsession.removeEventListener( 'end', onSessionEnd );\n\t\t\tsession.removeEventListener( 'inputsourceschange', onInputSourcesChange );\n\n\t\t\tfor ( let i = 0; i < controllers.length; i ++ ) {\n\n\t\t\t\tconst inputSource = controllerInputSources[ i ];\n\n\t\t\t\tif ( inputSource === null ) continue;\n\n\t\t\t\tcontrollerInputSources[ i ] = null;\n\n\t\t\t\tcontrollers[ i ].disconnect( inputSource );\n\n\t\t\t}\n\n\t\t\t_currentDepthNear = null;\n\t\t\t_currentDepthFar = null;\n\n\t\t\tdepthSensing.reset();\n\t\t\tfor ( const key in cameraAccessTextures ) {\n\n\t\t\t\tdelete cameraAccessTextures[ key ];\n\n\t\t\t}\n\n\t\t\t// restore framebuffer/rendering state\n\n\t\t\trenderer.setRenderTarget( initialRenderTarget );\n\n\t\t\tglBaseLayer = null;\n\t\t\tglProjLayer = null;\n\t\t\tglBinding = null;\n\t\t\tsession = null;\n\t\t\tnewRenderTarget = null;\n\n\t\t\t//\n\n\t\t\tanimation.stop();\n\n\t\t\tscope.isPresenting = false;\n\n\t\t\trenderer.setPixelRatio( currentPixelRatio );\n\t\t\trenderer.setSize( currentSize.width, currentSize.height, false );\n\n\t\t\tscope.dispatchEvent( { type: 'sessionend' } );\n\n\t\t}\n\n\t\t/**\n\t\t * Sets the framebuffer scale factor.\n\t\t *\n\t\t * This method can not be used during a XR session.\n\t\t *\n\t\t * @param {number} value - The framebuffer scale factor.\n\t\t */\n\t\tthis.setFramebufferScaleFactor = function ( value ) {\n\n\t\t\tframebufferScaleFactor = value;\n\n\t\t\tif ( scope.isPresenting === true ) {\n\n\t\t\t\twarn( 'WebXRManager: Cannot change framebuffer scale while presenting.' );\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Sets the reference space type. Can be used to configure a spatial relationship with the user's physical\n\t\t * environment. Depending on how the user moves in 3D space, setting an appropriate reference space can\n\t\t * improve tracking. Default is `local-floor`. Valid values can be found here\n\t\t * https://developer.mozilla.org/en-US/docs/Web/API/XRReferenceSpace#reference_space_types.\n\t\t *\n\t\t * This method can not be used during a XR session.\n\t\t *\n\t\t * @param {string} value - The reference space type.\n\t\t */\n\t\tthis.setReferenceSpaceType = function ( value ) {\n\n\t\t\treferenceSpaceType = value;\n\n\t\t\tif ( scope.isPresenting === true ) {\n\n\t\t\t\twarn( 'WebXRManager: Cannot change reference space type while presenting.' );\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the XR reference space.\n\t\t *\n\t\t * @return {XRReferenceSpace} The XR reference space.\n\t\t */\n\t\tthis.getReferenceSpace = function () {\n\n\t\t\treturn customReferenceSpace || referenceSpace;\n\n\t\t};\n\n\t\t/**\n\t\t * Sets a custom XR reference space.\n\t\t *\n\t\t * @param {XRReferenceSpace} space - The XR reference space.\n\t\t */\n\t\tthis.setReferenceSpace = function ( space ) {\n\n\t\t\tcustomReferenceSpace = space;\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the current base layer.\n\t\t *\n\t\t * This is an `XRProjectionLayer` when the targeted XR device supports the\n\t\t * WebXR Layers API, or an `XRWebGLLayer` otherwise.\n\t\t *\n\t\t * @return {?(XRWebGLLayer|XRProjectionLayer)} The XR base layer.\n\t\t */\n\t\tthis.getBaseLayer = function () {\n\n\t\t\treturn glProjLayer !== null ? glProjLayer : glBaseLayer;\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the current XR binding.\n\t\t *\n\t\t * Creates a new binding if needed and the browser is\n\t\t * capable of doing so.\n\t\t *\n\t\t * @return {?XRWebGLBinding} The XR binding. Returns `null` if one cannot be created.\n\t\t */\n\t\tthis.getBinding = function () {\n\n\t\t\tif ( glBinding === null && supportsGlBinding ) {\n\n\t\t\t\tglBinding = new XRWebGLBinding( session, gl );\n\n\t\t\t}\n\n\t\t\treturn glBinding;\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the current XR frame.\n\t\t *\n\t\t * @return {?XRFrame} The XR frame. Returns `null` when used outside a XR session.\n\t\t */\n\t\tthis.getFrame = function () {\n\n\t\t\treturn xrFrame;\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the current XR session.\n\t\t *\n\t\t * @return {?XRSession} The XR session. Returns `null` when used outside a XR session.\n\t\t */\n\t\tthis.getSession = function () {\n\n\t\t\treturn session;\n\n\t\t};\n\n\t\t/**\n\t\t * After a XR session has been requested usually with one of the `*Button` modules, it\n\t\t * is injected into the renderer with this method. This method triggers the start of\n\t\t * the actual XR rendering.\n\t\t *\n\t\t * @async\n\t\t * @param {XRSession} value - The XR session to set.\n\t\t * @return {Promise} A Promise that resolves when the session has been set.\n\t\t */\n\t\tthis.setSession = async function ( value ) {\n\n\t\t\tsession = value;\n\n\t\t\tif ( session !== null ) {\n\n\t\t\t\tinitialRenderTarget = renderer.getRenderTarget();\n\n\t\t\t\tsession.addEventListener( 'select', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'selectstart', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'selectend', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'squeeze', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'squeezestart', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'squeezeend', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'end', onSessionEnd );\n\t\t\t\tsession.addEventListener( 'inputsourceschange', onInputSourcesChange );\n\n\t\t\t\tif ( attributes.xrCompatible !== true ) {\n\n\t\t\t\t\tawait gl.makeXRCompatible();\n\n\t\t\t\t}\n\n\t\t\t\tcurrentPixelRatio = renderer.getPixelRatio();\n\t\t\t\trenderer.getSize( currentSize );\n\n\n\t\t\t\t// Check that the browser implements the necessary APIs to use an\n\t\t\t\t// XRProjectionLayer rather than an XRWebGLLayer\n\t\t\t\tconst supportsLayers = supportsGlBinding && 'createProjectionLayer' in XRWebGLBinding.prototype;\n\n\t\t\t\tif ( ! supportsLayers ) {\n\n\t\t\t\t\tconst layerInit = {\n\t\t\t\t\t\tantialias: attributes.antialias,\n\t\t\t\t\t\talpha: true,\n\t\t\t\t\t\tdepth: attributes.depth,\n\t\t\t\t\t\tstencil: attributes.stencil,\n\t\t\t\t\t\tframebufferScaleFactor: framebufferScaleFactor\n\t\t\t\t\t};\n\n\t\t\t\t\tglBaseLayer = new XRWebGLLayer( session, gl, layerInit );\n\n\t\t\t\t\tsession.updateRenderState( { baseLayer: glBaseLayer } );\n\n\t\t\t\t\trenderer.setPixelRatio( 1 );\n\t\t\t\t\trenderer.setSize( glBaseLayer.framebufferWidth, glBaseLayer.framebufferHeight, false );\n\n\t\t\t\t\tnewRenderTarget = new WebGLRenderTarget(\n\t\t\t\t\t\tglBaseLayer.framebufferWidth,\n\t\t\t\t\t\tglBaseLayer.framebufferHeight,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tformat: RGBAFormat,\n\t\t\t\t\t\t\ttype: UnsignedByteType,\n\t\t\t\t\t\t\tcolorSpace: renderer.outputColorSpace,\n\t\t\t\t\t\t\tstencilBuffer: attributes.stencil,\n\t\t\t\t\t\t\tresolveDepthBuffer: ( glBaseLayer.ignoreDepthValues === false ),\n\t\t\t\t\t\t\tresolveStencilBuffer: ( glBaseLayer.ignoreDepthValues === false )\n\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\n\t\t\t\t} else {\n\n\t\t\t\t\tlet depthFormat = null;\n\t\t\t\t\tlet depthType = null;\n\t\t\t\t\tlet glDepthFormat = null;\n\n\t\t\t\t\tif ( attributes.depth ) {\n\n\t\t\t\t\t\tglDepthFormat = attributes.stencil ? gl.DEPTH24_STENCIL8 : gl.DEPTH_COMPONENT24;\n\t\t\t\t\t\tdepthFormat = attributes.stencil ? DepthStencilFormat : DepthFormat;\n\t\t\t\t\t\tdepthType = attributes.stencil ? UnsignedInt248Type : UnsignedIntType;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst projectionlayerInit = {\n\t\t\t\t\t\tcolorFormat: gl.RGBA8,\n\t\t\t\t\t\tdepthFormat: glDepthFormat,\n\t\t\t\t\t\tscaleFactor: framebufferScaleFactor\n\t\t\t\t\t};\n\n\t\t\t\t\tglBinding = this.getBinding();\n\n\t\t\t\t\tglProjLayer = glBinding.createProjectionLayer( projectionlayerInit );\n\n\t\t\t\t\tsession.updateRenderState( { layers: [ glProjLayer ] } );\n\n\t\t\t\t\trenderer.setPixelRatio( 1 );\n\t\t\t\t\trenderer.setSize( glProjLayer.textureWidth, glProjLayer.textureHeight, false );\n\n\t\t\t\t\tnewRenderTarget = new WebGLRenderTarget(\n\t\t\t\t\t\tglProjLayer.textureWidth,\n\t\t\t\t\t\tglProjLayer.textureHeight,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tformat: RGBAFormat,\n\t\t\t\t\t\t\ttype: UnsignedByteType,\n\t\t\t\t\t\t\tdepthTexture: new DepthTexture( glProjLayer.textureWidth, glProjLayer.textureHeight, depthType, undefined, undefined, undefined, undefined, undefined, undefined, depthFormat ),\n\t\t\t\t\t\t\tstencilBuffer: attributes.stencil,\n\t\t\t\t\t\t\tcolorSpace: renderer.outputColorSpace,\n\t\t\t\t\t\t\tsamples: attributes.antialias ? 4 : 0,\n\t\t\t\t\t\t\tresolveDepthBuffer: ( glProjLayer.ignoreDepthValues === false ),\n\t\t\t\t\t\t\tresolveStencilBuffer: ( glProjLayer.ignoreDepthValues === false )\n\t\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t\tnewRenderTarget.isXRRenderTarget = true; // TODO Remove this when possible, see #23278\n\n\t\t\t\tthis.setFoveation( foveation );\n\n\t\t\t\tcustomReferenceSpace = null;\n\t\t\t\treferenceSpace = await session.requestReferenceSpace( referenceSpaceType );\n\n\t\t\t\tanimation.setContext( session );\n\t\t\t\tanimation.start();\n\n\t\t\t\tscope.isPresenting = true;\n\n\t\t\t\tscope.dispatchEvent( { type: 'sessionstart' } );\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the environment blend mode from the current XR session.\n\t\t *\n\t\t * @return {'opaque'|'additive'|'alpha-blend'|undefined} The environment blend mode. Returns `undefined` when used outside of a XR session.\n\t\t */\n\t\tthis.getEnvironmentBlendMode = function () {\n\n\t\t\tif ( session !== null ) {\n\n\t\t\t\treturn session.environmentBlendMode;\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the current depth texture computed via depth sensing.\n\t\t *\n\t\t * See {@link WebXRDepthSensing#getDepthTexture}.\n\t\t *\n\t\t * @return {?Texture} The depth texture.\n\t\t */\n\t\tthis.getDepthTexture = function () {\n\n\t\t\treturn depthSensing.getDepthTexture();\n\n\t\t};\n\n\t\tfunction onInputSourcesChange( event ) {\n\n\t\t\t// Notify disconnected\n\n\t\t\tfor ( let i = 0; i < event.removed.length; i ++ ) {\n\n\t\t\t\tconst inputSource = event.removed[ i ];\n\t\t\t\tconst index = controllerInputSources.indexOf( inputSource );\n\n\t\t\t\tif ( index >= 0 ) {\n\n\t\t\t\t\tcontrollerInputSources[ index ] = null;\n\t\t\t\t\tcontrollers[ index ].disconnect( inputSource );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Notify connected\n\n\t\t\tfor ( let i = 0; i < event.added.length; i ++ ) {\n\n\t\t\t\tconst inputSource = event.added[ i ];\n\n\t\t\t\tlet controllerIndex = controllerInputSources.indexOf( inputSource );\n\n\t\t\t\tif ( controllerIndex === -1 ) {\n\n\t\t\t\t\t// Assign input source a controller that currently has no input source\n\n\t\t\t\t\tfor ( let i = 0; i < controllers.length; i ++ ) {\n\n\t\t\t\t\t\tif ( i >= controllerInputSources.length ) {\n\n\t\t\t\t\t\t\tcontrollerInputSources.push( inputSource );\n\t\t\t\t\t\t\tcontrollerIndex = i;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t} else if ( controllerInputSources[ i ] === null ) {\n\n\t\t\t\t\t\t\tcontrollerInputSources[ i ] = inputSource;\n\t\t\t\t\t\t\tcontrollerIndex = i;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// If all controllers do currently receive input we ignore new ones\n\n\t\t\t\t\tif ( controllerIndex === -1 ) break;\n\n\t\t\t\t}\n\n\t\t\t\tconst controller = controllers[ controllerIndex ];\n\n\t\t\t\tif ( controller ) {\n\n\t\t\t\t\tcontroller.connect( inputSource );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tconst cameraLPos = new Vector3();\n\t\tconst cameraRPos = new Vector3();\n\n\t\t/**\n\t\t * Assumes 2 cameras that are parallel and share an X-axis, and that\n\t\t * the cameras' projection and world matrices have already been set.\n\t\t * And that near and far planes are identical for both cameras.\n\t\t * Visualization of this technique: https://computergraphics.stackexchange.com/a/4765\n\t\t *\n\t\t * @param {ArrayCamera} camera - The camera to update.\n\t\t * @param {PerspectiveCamera} cameraL - The left camera.\n\t\t * @param {PerspectiveCamera} cameraR - The right camera.\n\t\t */\n\t\tfunction setProjectionFromUnion( camera, cameraL, cameraR ) {\n\n\t\t\tcameraLPos.setFromMatrixPosition( cameraL.matrixWorld );\n\t\t\tcameraRPos.setFromMatrixPosition( cameraR.matrixWorld );\n\n\t\t\tconst ipd = cameraLPos.distanceTo( cameraRPos );\n\n\t\t\tconst projL = cameraL.projectionMatrix.elements;\n\t\t\tconst projR = cameraR.projectionMatrix.elements;\n\n\t\t\t// VR systems will have identical far and near planes, and\n\t\t\t// most likely identical top and bottom frustum extents.\n\t\t\t// Use the left camera for these values.\n\t\t\tconst near = projL[ 14 ] / ( projL[ 10 ] - 1 );\n\t\t\tconst far = projL[ 14 ] / ( projL[ 10 ] + 1 );\n\t\t\tconst topFov = ( projL[ 9 ] + 1 ) / projL[ 5 ];\n\t\t\tconst bottomFov = ( projL[ 9 ] - 1 ) / projL[ 5 ];\n\n\t\t\tconst leftFov = ( projL[ 8 ] - 1 ) / projL[ 0 ];\n\t\t\tconst rightFov = ( projR[ 8 ] + 1 ) / projR[ 0 ];\n\t\t\tconst left = near * leftFov;\n\t\t\tconst right = near * rightFov;\n\n\t\t\t// Calculate the new camera's position offset from the\n\t\t\t// left camera. xOffset should be roughly half `ipd`.\n\t\t\tconst zOffset = ipd / ( - leftFov + rightFov );\n\t\t\tconst xOffset = zOffset * - leftFov;\n\n\t\t\t// TODO: Better way to apply this offset?\n\t\t\tcameraL.matrixWorld.decompose( camera.position, camera.quaternion, camera.scale );\n\t\t\tcamera.translateX( xOffset );\n\t\t\tcamera.translateZ( zOffset );\n\t\t\tcamera.matrixWorld.compose( camera.position, camera.quaternion, camera.scale );\n\t\t\tcamera.matrixWorldInverse.copy( camera.matrixWorld ).invert();\n\n\t\t\t// Check if the projection uses an infinite far plane.\n\t\t\tif ( projL[ 10 ] === -1 ) {\n\n\t\t\t\t// Use the projection matrix from the left eye.\n\t\t\t\t// The camera offset is sufficient to include the view volumes\n\t\t\t\t// of both eyes (assuming symmetric projections).\n\t\t\t\tcamera.projectionMatrix.copy( cameraL.projectionMatrix );\n\t\t\t\tcamera.projectionMatrixInverse.copy( cameraL.projectionMatrixInverse );\n\n\t\t\t} else {\n\n\t\t\t\t// Find the union of the frustum values of the cameras and scale\n\t\t\t\t// the values so that the near plane's position does not change in world space,\n\t\t\t\t// although must now be relative to the new union camera.\n\t\t\t\tconst near2 = near + zOffset;\n\t\t\t\tconst far2 = far + zOffset;\n\t\t\t\tconst left2 = left - xOffset;\n\t\t\t\tconst right2 = right + ( ipd - xOffset );\n\t\t\t\tconst top2 = topFov * far / far2 * near2;\n\t\t\t\tconst bottom2 = bottomFov * far / far2 * near2;\n\n\t\t\t\tcamera.projectionMatrix.makePerspective( left2, right2, top2, bottom2, near2, far2 );\n\t\t\t\tcamera.projectionMatrixInverse.copy( camera.projectionMatrix ).invert();\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction updateCamera( camera, parent ) {\n\n\t\t\tif ( parent === null ) {\n\n\t\t\t\tcamera.matrixWorld.copy( camera.matrix );\n\n\t\t\t} else {\n\n\t\t\t\tcamera.matrixWorld.multiplyMatrices( parent.matrixWorld, camera.matrix );\n\n\t\t\t}\n\n\t\t\tcamera.matrixWorldInverse.copy( camera.matrixWorld ).invert();\n\n\t\t}\n\n\t\t/**\n\t\t * Updates the state of the XR camera. Use this method on app level if you\n\t\t * set `cameraAutoUpdate` to `false`. The method requires the non-XR\n\t\t * camera of the scene as a parameter. The passed in camera's transformation\n\t\t * is automatically adjusted to the position of the XR camera when calling\n\t\t * this method.\n\t\t *\n\t\t * @param {Camera} camera - The camera.\n\t\t */\n\t\tthis.updateCamera = function ( camera ) {\n\n\t\t\tif ( session === null ) return;\n\n\t\t\tlet depthNear = camera.near;\n\t\t\tlet depthFar = camera.far;\n\n\t\t\tif ( depthSensing.texture !== null ) {\n\n\t\t\t\tif ( depthSensing.depthNear > 0 ) depthNear = depthSensing.depthNear;\n\t\t\t\tif ( depthSensing.depthFar > 0 ) depthFar = depthSensing.depthFar;\n\n\t\t\t}\n\n\t\t\tcameraXR.near = cameraR.near = cameraL.near = depthNear;\n\t\t\tcameraXR.far = cameraR.far = cameraL.far = depthFar;\n\n\t\t\tif ( _currentDepthNear !== cameraXR.near || _currentDepthFar !== cameraXR.far ) {\n\n\t\t\t\t// Note that the new renderState won't apply until the next frame. See #18320\n\n\t\t\t\tsession.updateRenderState( {\n\t\t\t\t\tdepthNear: cameraXR.near,\n\t\t\t\t\tdepthFar: cameraXR.far\n\t\t\t\t} );\n\n\t\t\t\t_currentDepthNear = cameraXR.near;\n\t\t\t\t_currentDepthFar = cameraXR.far;\n\n\t\t\t}\n\n\t\t\t// inherit camera layers and enable eye layers (1 = left, 2 = right)\n\t\t\tcameraXR.layers.mask = camera.layers.mask | 0b110;\n\t\t\tcameraL.layers.mask = cameraXR.layers.mask & 0b011;\n\t\t\tcameraR.layers.mask = cameraXR.layers.mask & 0b101;\n\n\t\t\tconst parent = camera.parent;\n\t\t\tconst cameras = cameraXR.cameras;\n\n\t\t\tupdateCamera( cameraXR, parent );\n\n\t\t\tfor ( let i = 0; i < cameras.length; i ++ ) {\n\n\t\t\t\tupdateCamera( cameras[ i ], parent );\n\n\t\t\t}\n\n\t\t\t// update projection matrix for proper view frustum culling\n\n\t\t\tif ( cameras.length === 2 ) {\n\n\t\t\t\tsetProjectionFromUnion( cameraXR, cameraL, cameraR );\n\n\t\t\t} else {\n\n\t\t\t\t// assume single camera setup (AR)\n\n\t\t\t\tcameraXR.projectionMatrix.copy( cameraL.projectionMatrix );\n\n\t\t\t}\n\n\t\t\t// update user camera and its children\n\n\t\t\tupdateUserCamera( camera, cameraXR, parent );\n\n\t\t};\n\n\t\tfunction updateUserCamera( camera, cameraXR, parent ) {\n\n\t\t\tif ( parent === null ) {\n\n\t\t\t\tcamera.matrix.copy( cameraXR.matrixWorld );\n\n\t\t\t} else {\n\n\t\t\t\tcamera.matrix.copy( parent.matrixWorld );\n\t\t\t\tcamera.matrix.invert();\n\t\t\t\tcamera.matrix.multiply( cameraXR.matrixWorld );\n\n\t\t\t}\n\n\t\t\tcamera.matrix.decompose( camera.position, camera.quaternion, camera.scale );\n\t\t\tcamera.updateMatrixWorld( true );\n\n\t\t\tcamera.projectionMatrix.copy( cameraXR.projectionMatrix );\n\t\t\tcamera.projectionMatrixInverse.copy( cameraXR.projectionMatrixInverse );\n\n\t\t\tif ( camera.isPerspectiveCamera ) {\n\n\t\t\t\tcamera.fov = RAD2DEG * 2 * Math.atan( 1 / camera.projectionMatrix.elements[ 5 ] );\n\t\t\t\tcamera.zoom = 1;\n\n\t\t\t}\n\n\t\t}\n\n\t\t/**\n\t\t * Returns an instance of {@link ArrayCamera} which represents the XR camera\n\t\t * of the active XR session. For each view it holds a separate camera object.\n\t\t *\n\t\t * The camera's `fov` is currently not used and does not reflect the fov of\n\t\t * the XR camera. If you need the fov on app level, you have to compute in\n\t\t * manually from the XR camera's projection matrices.\n\t\t *\n\t\t * @return {ArrayCamera} The XR camera.\n\t\t */\n\t\tthis.getCamera = function () {\n\n\t\t\treturn cameraXR;\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the amount of foveation used by the XR compositor for the projection layer.\n\t\t *\n\t\t * @return {number|undefined} The amount of foveation.\n\t\t */\n\t\tthis.getFoveation = function () {\n\n\t\t\tif ( glProjLayer === null && glBaseLayer === null ) {\n\n\t\t\t\treturn undefined;\n\n\t\t\t}\n\n\t\t\treturn foveation;\n\n\t\t};\n\n\t\t/**\n\t\t * Sets the foveation value.\n\t\t *\n\t\t * @param {number} value - A number in the range `[0,1]` where `0` means no foveation (full resolution)\n\t\t * and `1` means maximum foveation (the edges render at lower resolution).\n\t\t */\n\t\tthis.setFoveation = function ( value ) {\n\n\t\t\t// 0 = no foveation = full resolution\n\t\t\t// 1 = maximum foveation = the edges render at lower resolution\n\n\t\t\tfoveation = value;\n\n\t\t\tif ( glProjLayer !== null ) {\n\n\t\t\t\tglProjLayer.fixedFoveation = value;\n\n\t\t\t}\n\n\t\t\tif ( glBaseLayer !== null && glBaseLayer.fixedFoveation !== undefined ) {\n\n\t\t\t\tglBaseLayer.fixedFoveation = value;\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Returns `true` if depth sensing is supported.\n\t\t *\n\t\t * @return {boolean} Whether depth sensing is supported or not.\n\t\t */\n\t\tthis.hasDepthSensing = function () {\n\n\t\t\treturn depthSensing.texture !== null;\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the depth sensing mesh.\n\t\t *\n\t\t * See {@link WebXRDepthSensing#getMesh}.\n\t\t *\n\t\t * @return {Mesh} The depth sensing mesh.\n\t\t */\n\t\tthis.getDepthSensingMesh = function () {\n\n\t\t\treturn depthSensing.getMesh( cameraXR );\n\n\t\t};\n\n\t\t/**\n\t\t * Retrieves an opaque texture from the view-aligned {@link XRCamera}.\n\t\t * Only available during the current animation loop.\n\t\t *\n\t\t * @param {XRCamera} xrCamera - The camera to query.\n\t\t * @return {?Texture} An opaque texture representing the current raw camera frame.\n\t\t */\n\t\tthis.getCameraTexture = function ( xrCamera ) {\n\n\t\t\treturn cameraAccessTextures[ xrCamera ];\n\n\t\t};\n\n\t\t// Animation Loop\n\n\t\tlet onAnimationFrameCallback = null;\n\n\t\tfunction onAnimationFrame( time, frame ) {\n\n\t\t\tpose = frame.getViewerPose( customReferenceSpace || referenceSpace );\n\t\t\txrFrame = frame;\n\n\t\t\tif ( pose !== null ) {\n\n\t\t\t\tconst views = pose.views;\n\n\t\t\t\tif ( glBaseLayer !== null ) {\n\n\t\t\t\t\trenderer.setRenderTargetFramebuffer( newRenderTarget, glBaseLayer.framebuffer );\n\t\t\t\t\trenderer.setRenderTarget( newRenderTarget );\n\n\t\t\t\t}\n\n\t\t\t\tlet cameraXRNeedsUpdate = false;\n\n\t\t\t\t// check if it's necessary to rebuild cameraXR's camera list\n\n\t\t\t\tif ( views.length !== cameraXR.cameras.length ) {\n\n\t\t\t\t\tcameraXR.cameras.length = 0;\n\t\t\t\t\tcameraXRNeedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0; i < views.length; i ++ ) {\n\n\t\t\t\t\tconst view = views[ i ];\n\n\t\t\t\t\tlet viewport = null;\n\n\t\t\t\t\tif ( glBaseLayer !== null ) {\n\n\t\t\t\t\t\tviewport = glBaseLayer.getViewport( view );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconst glSubImage = glBinding.getViewSubImage( glProjLayer, view );\n\t\t\t\t\t\tviewport = glSubImage.viewport;\n\n\t\t\t\t\t\t// For side-by-side projection, we only produce a single texture for both eyes.\n\t\t\t\t\t\tif ( i === 0 ) {\n\n\t\t\t\t\t\t\trenderer.setRenderTargetTextures(\n\t\t\t\t\t\t\t\tnewRenderTarget,\n\t\t\t\t\t\t\t\tglSubImage.colorTexture,\n\t\t\t\t\t\t\t\tglSubImage.depthStencilTexture );\n\n\t\t\t\t\t\t\trenderer.setRenderTarget( newRenderTarget );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tlet camera = cameras[ i ];\n\n\t\t\t\t\tif ( camera === undefined ) {\n\n\t\t\t\t\t\tcamera = new PerspectiveCamera();\n\t\t\t\t\t\tcamera.layers.enable( i );\n\t\t\t\t\t\tcamera.viewport = new Vector4();\n\t\t\t\t\t\tcameras[ i ] = camera;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcamera.matrix.fromArray( view.transform.matrix );\n\t\t\t\t\tcamera.matrix.decompose( camera.position, camera.quaternion, camera.scale );\n\t\t\t\t\tcamera.projectionMatrix.fromArray( view.projectionMatrix );\n\t\t\t\t\tcamera.projectionMatrixInverse.copy( camera.projectionMatrix ).invert();\n\t\t\t\t\tcamera.viewport.set( viewport.x, viewport.y, viewport.width, viewport.height );\n\n\t\t\t\t\tif ( i === 0 ) {\n\n\t\t\t\t\t\tcameraXR.matrix.copy( camera.matrix );\n\t\t\t\t\t\tcameraXR.matrix.decompose( cameraXR.position, cameraXR.quaternion, cameraXR.scale );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( cameraXRNeedsUpdate === true ) {\n\n\t\t\t\t\t\tcameraXR.cameras.push( camera );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t//\n\n\t\t\t\tconst enabledFeatures = session.enabledFeatures;\n\t\t\t\tconst gpuDepthSensingEnabled = enabledFeatures &&\n\t\t\t\t\tenabledFeatures.includes( 'depth-sensing' ) &&\n\t\t\t\t\tsession.depthUsage == 'gpu-optimized';\n\n\t\t\t\tif ( gpuDepthSensingEnabled && supportsGlBinding ) {\n\n\t\t\t\t\tglBinding = scope.getBinding();\n\n\t\t\t\t\tconst depthData = glBinding.getDepthInformation( views[ 0 ] );\n\n\t\t\t\t\tif ( depthData && depthData.isValid && depthData.texture ) {\n\n\t\t\t\t\t\tdepthSensing.init( depthData, session.renderState );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tconst cameraAccessEnabled = enabledFeatures &&\n\t\t\t\t    enabledFeatures.includes( 'camera-access' );\n\n\t\t\t\tif ( cameraAccessEnabled && supportsGlBinding ) {\n\n\t\t\t\t\trenderer.state.unbindTexture();\n\n\t\t\t\t\tglBinding = scope.getBinding();\n\n\t\t\t\t\tfor ( let i = 0; i < views.length; i ++ ) {\n\n\t\t\t\t\t\tconst camera = views[ i ].camera;\n\n\t\t\t\t\t\tif ( camera ) {\n\n\t\t\t\t\t\t\tlet cameraTex = cameraAccessTextures[ camera ];\n\n\t\t\t\t\t\t\tif ( ! cameraTex ) {\n\n\t\t\t\t\t\t\t\tcameraTex = new ExternalTexture();\n\t\t\t\t\t\t\t\tcameraAccessTextures[ camera ] = cameraTex;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconst glTexture = glBinding.getCameraImage( camera );\n\t\t\t\t\t\t\tcameraTex.sourceTexture = glTexture;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tfor ( let i = 0; i < controllers.length; i ++ ) {\n\n\t\t\t\tconst inputSource = controllerInputSources[ i ];\n\t\t\t\tconst controller = controllers[ i ];\n\n\t\t\t\tif ( inputSource !== null && controller !== undefined ) {\n\n\t\t\t\t\tcontroller.update( inputSource, frame, customReferenceSpace || referenceSpace );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( onAnimationFrameCallback ) onAnimationFrameCallback( time, frame );\n\n\t\t\tif ( frame.detectedPlanes ) {\n\n\t\t\t\tscope.dispatchEvent( { type: 'planesdetected', data: frame } );\n\n\t\t\t}\n\n\t\t\txrFrame = null;\n\n\t\t}\n\n\t\tconst animation = new WebGLAnimation();\n\n\t\tanimation.setAnimationLoop( onAnimationFrame );\n\n\t\tthis.setAnimationLoop = function ( callback ) {\n\n\t\t\tonAnimationFrameCallback = callback;\n\n\t\t};\n\n\t\tthis.dispose = function () {};\n\n\t}\n\n}\n\nconst _e1 = /*@__PURE__*/ new Euler();\nconst _m1 = /*@__PURE__*/ new Matrix4();\n\nfunction WebGLMaterials( renderer, properties ) {\n\n\tfunction refreshTransformUniform( map, uniform ) {\n\n\t\tif ( map.matrixAutoUpdate === true ) {\n\n\t\t\tmap.updateMatrix();\n\n\t\t}\n\n\t\tuniform.value.copy( map.matrix );\n\n\t}\n\n\tfunction refreshFogUniforms( uniforms, fog ) {\n\n\t\tfog.color.getRGB( uniforms.fogColor.value, getUnlitUniformColorSpace( renderer ) );\n\n\t\tif ( fog.isFog ) {\n\n\t\t\tuniforms.fogNear.value = fog.near;\n\t\t\tuniforms.fogFar.value = fog.far;\n\n\t\t} else if ( fog.isFogExp2 ) {\n\n\t\t\tuniforms.fogDensity.value = fog.density;\n\n\t\t}\n\n\t}\n\n\tfunction refreshMaterialUniforms( uniforms, material, pixelRatio, height, transmissionRenderTarget ) {\n\n\t\tif ( material.isMeshBasicMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\n\t\t} else if ( material.isMeshLambertMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\n\t\t} else if ( material.isMeshToonMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsToon( uniforms, material );\n\n\t\t} else if ( material.isMeshPhongMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsPhong( uniforms, material );\n\n\t\t} else if ( material.isMeshStandardMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsStandard( uniforms, material );\n\n\t\t\tif ( material.isMeshPhysicalMaterial ) {\n\n\t\t\t\trefreshUniformsPhysical( uniforms, material, transmissionRenderTarget );\n\n\t\t\t}\n\n\t\t} else if ( material.isMeshMatcapMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsMatcap( uniforms, material );\n\n\t\t} else if ( material.isMeshDepthMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\n\t\t} else if ( material.isMeshDistanceMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsDistance( uniforms, material );\n\n\t\t} else if ( material.isMeshNormalMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\n\t\t} else if ( material.isLineBasicMaterial ) {\n\n\t\t\trefreshUniformsLine( uniforms, material );\n\n\t\t\tif ( material.isLineDashedMaterial ) {\n\n\t\t\t\trefreshUniformsDash( uniforms, material );\n\n\t\t\t}\n\n\t\t} else if ( material.isPointsMaterial ) {\n\n\t\t\trefreshUniformsPoints( uniforms, material, pixelRatio, height );\n\n\t\t} else if ( material.isSpriteMaterial ) {\n\n\t\t\trefreshUniformsSprites( uniforms, material );\n\n\t\t} else if ( material.isShadowMaterial ) {\n\n\t\t\tuniforms.color.value.copy( material.color );\n\t\t\tuniforms.opacity.value = material.opacity;\n\n\t\t} else if ( material.isShaderMaterial ) {\n\n\t\t\tmaterial.uniformsNeedUpdate = false; // #15581\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsCommon( uniforms, material ) {\n\n\t\tuniforms.opacity.value = material.opacity;\n\n\t\tif ( material.color ) {\n\n\t\t\tuniforms.diffuse.value.copy( material.color );\n\n\t\t}\n\n\t\tif ( material.emissive ) {\n\n\t\t\tuniforms.emissive.value.copy( material.emissive ).multiplyScalar( material.emissiveIntensity );\n\n\t\t}\n\n\t\tif ( material.map ) {\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t\trefreshTransformUniform( material.map, uniforms.mapTransform );\n\n\t\t}\n\n\t\tif ( material.alphaMap ) {\n\n\t\t\tuniforms.alphaMap.value = material.alphaMap;\n\n\t\t\trefreshTransformUniform( material.alphaMap, uniforms.alphaMapTransform );\n\n\t\t}\n\n\t\tif ( material.bumpMap ) {\n\n\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\n\t\t\trefreshTransformUniform( material.bumpMap, uniforms.bumpMapTransform );\n\n\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\n\t\t\tif ( material.side === BackSide ) {\n\n\t\t\t\tuniforms.bumpScale.value *= -1;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.normalMap ) {\n\n\t\t\tuniforms.normalMap.value = material.normalMap;\n\n\t\t\trefreshTransformUniform( material.normalMap, uniforms.normalMapTransform );\n\n\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\n\t\t\tif ( material.side === BackSide ) {\n\n\t\t\t\tuniforms.normalScale.value.negate();\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.displacementMap ) {\n\n\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\n\t\t\trefreshTransformUniform( material.displacementMap, uniforms.displacementMapTransform );\n\n\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t}\n\n\t\tif ( material.emissiveMap ) {\n\n\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t\trefreshTransformUniform( material.emissiveMap, uniforms.emissiveMapTransform );\n\n\t\t}\n\n\t\tif ( material.specularMap ) {\n\n\t\t\tuniforms.specularMap.value = material.specularMap;\n\n\t\t\trefreshTransformUniform( material.specularMap, uniforms.specularMapTransform );\n\n\t\t}\n\n\t\tif ( material.alphaTest > 0 ) {\n\n\t\t\tuniforms.alphaTest.value = material.alphaTest;\n\n\t\t}\n\n\t\tconst materialProperties = properties.get( material );\n\n\t\tconst envMap = materialProperties.envMap;\n\t\tconst envMapRotation = materialProperties.envMapRotation;\n\n\t\tif ( envMap ) {\n\n\t\t\tuniforms.envMap.value = envMap;\n\n\t\t\t_e1.copy( envMapRotation );\n\n\t\t\t// accommodate left-handed frame\n\t\t\t_e1.x *= -1; _e1.y *= -1; _e1.z *= -1;\n\n\t\t\tif ( envMap.isCubeTexture && envMap.isRenderTargetTexture === false ) {\n\n\t\t\t\t// environment maps which are not cube render targets or PMREMs follow a different convention\n\t\t\t\t_e1.y *= -1;\n\t\t\t\t_e1.z *= -1;\n\n\t\t\t}\n\n\t\t\tuniforms.envMapRotation.value.setFromMatrix4( _m1.makeRotationFromEuler( _e1 ) );\n\n\t\t\tuniforms.flipEnvMap.value = ( envMap.isCubeTexture && envMap.isRenderTargetTexture === false ) ? -1 : 1;\n\n\t\t\tuniforms.reflectivity.value = material.reflectivity;\n\t\t\tuniforms.ior.value = material.ior;\n\t\t\tuniforms.refractionRatio.value = material.refractionRatio;\n\n\t\t}\n\n\t\tif ( material.lightMap ) {\n\n\t\t\tuniforms.lightMap.value = material.lightMap;\n\t\t\tuniforms.lightMapIntensity.value = material.lightMapIntensity;\n\n\t\t\trefreshTransformUniform( material.lightMap, uniforms.lightMapTransform );\n\n\t\t}\n\n\t\tif ( material.aoMap ) {\n\n\t\t\tuniforms.aoMap.value = material.aoMap;\n\t\t\tuniforms.aoMapIntensity.value = material.aoMapIntensity;\n\n\t\t\trefreshTransformUniform( material.aoMap, uniforms.aoMapTransform );\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsLine( uniforms, material ) {\n\n\t\tuniforms.diffuse.value.copy( material.color );\n\t\tuniforms.opacity.value = material.opacity;\n\n\t\tif ( material.map ) {\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t\trefreshTransformUniform( material.map, uniforms.mapTransform );\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsDash( uniforms, material ) {\n\n\t\tuniforms.dashSize.value = material.dashSize;\n\t\tuniforms.totalSize.value = material.dashSize + material.gapSize;\n\t\tuniforms.scale.value = material.scale;\n\n\t}\n\n\tfunction refreshUniformsPoints( uniforms, material, pixelRatio, height ) {\n\n\t\tuniforms.diffuse.value.copy( material.color );\n\t\tuniforms.opacity.value = material.opacity;\n\t\tuniforms.size.value = material.size * pixelRatio;\n\t\tuniforms.scale.value = height * 0.5;\n\n\t\tif ( material.map ) {\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t\trefreshTransformUniform( material.map, uniforms.uvTransform );\n\n\t\t}\n\n\t\tif ( material.alphaMap ) {\n\n\t\t\tuniforms.alphaMap.value = material.alphaMap;\n\n\t\t\trefreshTransformUniform( material.alphaMap, uniforms.alphaMapTransform );\n\n\t\t}\n\n\t\tif ( material.alphaTest > 0 ) {\n\n\t\t\tuniforms.alphaTest.value = material.alphaTest;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsSprites( uniforms, material ) {\n\n\t\tuniforms.diffuse.value.copy( material.color );\n\t\tuniforms.opacity.value = material.opacity;\n\t\tuniforms.rotation.value = material.rotation;\n\n\t\tif ( material.map ) {\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t\trefreshTransformUniform( material.map, uniforms.mapTransform );\n\n\t\t}\n\n\t\tif ( material.alphaMap ) {\n\n\t\t\tuniforms.alphaMap.value = material.alphaMap;\n\n\t\t\trefreshTransformUniform( material.alphaMap, uniforms.alphaMapTransform );\n\n\t\t}\n\n\t\tif ( material.alphaTest > 0 ) {\n\n\t\t\tuniforms.alphaTest.value = material.alphaTest;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsPhong( uniforms, material ) {\n\n\t\tuniforms.specular.value.copy( material.specular );\n\t\tuniforms.shininess.value = Math.max( material.shininess, 1e-4 ); // to prevent pow( 0.0, 0.0 )\n\n\t}\n\n\tfunction refreshUniformsToon( uniforms, material ) {\n\n\t\tif ( material.gradientMap ) {\n\n\t\t\tuniforms.gradientMap.value = material.gradientMap;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsStandard( uniforms, material ) {\n\n\t\tuniforms.metalness.value = material.metalness;\n\n\t\tif ( material.metalnessMap ) {\n\n\t\t\tuniforms.metalnessMap.value = material.metalnessMap;\n\n\t\t\trefreshTransformUniform( material.metalnessMap, uniforms.metalnessMapTransform );\n\n\t\t}\n\n\t\tuniforms.roughness.value = material.roughness;\n\n\t\tif ( material.roughnessMap ) {\n\n\t\t\tuniforms.roughnessMap.value = material.roughnessMap;\n\n\t\t\trefreshTransformUniform( material.roughnessMap, uniforms.roughnessMapTransform );\n\n\t\t}\n\n\t\tif ( material.envMap ) {\n\n\t\t\t//uniforms.envMap.value = material.envMap; // part of uniforms common\n\n\t\t\tuniforms.envMapIntensity.value = material.envMapIntensity;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsPhysical( uniforms, material, transmissionRenderTarget ) {\n\n\t\tuniforms.ior.value = material.ior; // also part of uniforms common\n\n\t\tif ( material.sheen > 0 ) {\n\n\t\t\tuniforms.sheenColor.value.copy( material.sheenColor ).multiplyScalar( material.sheen );\n\n\t\t\tuniforms.sheenRoughness.value = material.sheenRoughness;\n\n\t\t\tif ( material.sheenColorMap ) {\n\n\t\t\t\tuniforms.sheenColorMap.value = material.sheenColorMap;\n\n\t\t\t\trefreshTransformUniform( material.sheenColorMap, uniforms.sheenColorMapTransform );\n\n\t\t\t}\n\n\t\t\tif ( material.sheenRoughnessMap ) {\n\n\t\t\t\tuniforms.sheenRoughnessMap.value = material.sheenRoughnessMap;\n\n\t\t\t\trefreshTransformUniform( material.sheenRoughnessMap, uniforms.sheenRoughnessMapTransform );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.clearcoat > 0 ) {\n\n\t\t\tuniforms.clearcoat.value = material.clearcoat;\n\t\t\tuniforms.clearcoatRoughness.value = material.clearcoatRoughness;\n\n\t\t\tif ( material.clearcoatMap ) {\n\n\t\t\t\tuniforms.clearcoatMap.value = material.clearcoatMap;\n\n\t\t\t\trefreshTransformUniform( material.clearcoatMap, uniforms.clearcoatMapTransform );\n\n\t\t\t}\n\n\t\t\tif ( material.clearcoatRoughnessMap ) {\n\n\t\t\t\tuniforms.clearcoatRoughnessMap.value = material.clearcoatRoughnessMap;\n\n\t\t\t\trefreshTransformUniform( material.clearcoatRoughnessMap, uniforms.clearcoatRoughnessMapTransform );\n\n\t\t\t}\n\n\t\t\tif ( material.clearcoatNormalMap ) {\n\n\t\t\t\tuniforms.clearcoatNormalMap.value = material.clearcoatNormalMap;\n\n\t\t\t\trefreshTransformUniform( material.clearcoatNormalMap, uniforms.clearcoatNormalMapTransform );\n\n\t\t\t\tuniforms.clearcoatNormalScale.value.copy( material.clearcoatNormalScale );\n\n\t\t\t\tif ( material.side === BackSide ) {\n\n\t\t\t\t\tuniforms.clearcoatNormalScale.value.negate();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.dispersion > 0 ) {\n\n\t\t\tuniforms.dispersion.value = material.dispersion;\n\n\t\t}\n\n\t\tif ( material.iridescence > 0 ) {\n\n\t\t\tuniforms.iridescence.value = material.iridescence;\n\t\t\tuniforms.iridescenceIOR.value = material.iridescenceIOR;\n\t\t\tuniforms.iridescenceThicknessMinimum.value = material.iridescenceThicknessRange[ 0 ];\n\t\t\tuniforms.iridescenceThicknessMaximum.value = material.iridescenceThicknessRange[ 1 ];\n\n\t\t\tif ( material.iridescenceMap ) {\n\n\t\t\t\tuniforms.iridescenceMap.value = material.iridescenceMap;\n\n\t\t\t\trefreshTransformUniform( material.iridescenceMap, uniforms.iridescenceMapTransform );\n\n\t\t\t}\n\n\t\t\tif ( material.iridescenceThicknessMap ) {\n\n\t\t\t\tuniforms.iridescenceThicknessMap.value = material.iridescenceThicknessMap;\n\n\t\t\t\trefreshTransformUniform( material.iridescenceThicknessMap, uniforms.iridescenceThicknessMapTransform );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.transmission > 0 ) {\n\n\t\t\tuniforms.transmission.value = material.transmission;\n\t\t\tuniforms.transmissionSamplerMap.value = transmissionRenderTarget.texture;\n\t\t\tuniforms.transmissionSamplerSize.value.set( transmissionRenderTarget.width, transmissionRenderTarget.height );\n\n\t\t\tif ( material.transmissionMap ) {\n\n\t\t\t\tuniforms.transmissionMap.value = material.transmissionMap;\n\n\t\t\t\trefreshTransformUniform( material.transmissionMap, uniforms.transmissionMapTransform );\n\n\t\t\t}\n\n\t\t\tuniforms.thickness.value = material.thickness;\n\n\t\t\tif ( material.thicknessMap ) {\n\n\t\t\t\tuniforms.thicknessMap.value = material.thicknessMap;\n\n\t\t\t\trefreshTransformUniform( material.thicknessMap, uniforms.thicknessMapTransform );\n\n\t\t\t}\n\n\t\t\tuniforms.attenuationDistance.value = material.attenuationDistance;\n\t\t\tuniforms.attenuationColor.value.copy( material.attenuationColor );\n\n\t\t}\n\n\t\tif ( material.anisotropy > 0 ) {\n\n\t\t\tuniforms.anisotropyVector.value.set( material.anisotropy * Math.cos( material.anisotropyRotation ), material.anisotropy * Math.sin( material.anisotropyRotation ) );\n\n\t\t\tif ( material.anisotropyMap ) {\n\n\t\t\t\tuniforms.anisotropyMap.value = material.anisotropyMap;\n\n\t\t\t\trefreshTransformUniform( material.anisotropyMap, uniforms.anisotropyMapTransform );\n\n\t\t\t}\n\n\t\t}\n\n\t\tuniforms.specularIntensity.value = material.specularIntensity;\n\t\tuniforms.specularColor.value.copy( material.specularColor );\n\n\t\tif ( material.specularColorMap ) {\n\n\t\t\tuniforms.specularColorMap.value = material.specularColorMap;\n\n\t\t\trefreshTransformUniform( material.specularColorMap, uniforms.specularColorMapTransform );\n\n\t\t}\n\n\t\tif ( material.specularIntensityMap ) {\n\n\t\t\tuniforms.specularIntensityMap.value = material.specularIntensityMap;\n\n\t\t\trefreshTransformUniform( material.specularIntensityMap, uniforms.specularIntensityMapTransform );\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsMatcap( uniforms, material ) {\n\n\t\tif ( material.matcap ) {\n\n\t\t\tuniforms.matcap.value = material.matcap;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsDistance( uniforms, material ) {\n\n\t\tconst light = properties.get( material ).light;\n\n\t\tuniforms.referencePosition.value.setFromMatrixPosition( light.matrixWorld );\n\t\tuniforms.nearDistance.value = light.shadow.camera.near;\n\t\tuniforms.farDistance.value = light.shadow.camera.far;\n\n\t}\n\n\treturn {\n\t\trefreshFogUniforms: refreshFogUniforms,\n\t\trefreshMaterialUniforms: refreshMaterialUniforms\n\t};\n\n}\n\nfunction WebGLUniformsGroups( gl, info, capabilities, state ) {\n\n\tlet buffers = {};\n\tlet updateList = {};\n\tlet allocatedBindingPoints = [];\n\n\tconst maxBindingPoints = gl.getParameter( gl.MAX_UNIFORM_BUFFER_BINDINGS ); // binding points are global whereas block indices are per shader program\n\n\tfunction bind( uniformsGroup, program ) {\n\n\t\tconst webglProgram = program.program;\n\t\tstate.uniformBlockBinding( uniformsGroup, webglProgram );\n\n\t}\n\n\tfunction update( uniformsGroup, program ) {\n\n\t\tlet buffer = buffers[ uniformsGroup.id ];\n\n\t\tif ( buffer === undefined ) {\n\n\t\t\tprepareUniformsGroup( uniformsGroup );\n\n\t\t\tbuffer = createBuffer( uniformsGroup );\n\t\t\tbuffers[ uniformsGroup.id ] = buffer;\n\n\t\t\tuniformsGroup.addEventListener( 'dispose', onUniformsGroupsDispose );\n\n\t\t}\n\n\t\t// ensure to update the binding points/block indices mapping for this program\n\n\t\tconst webglProgram = program.program;\n\t\tstate.updateUBOMapping( uniformsGroup, webglProgram );\n\n\t\t// update UBO once per frame\n\n\t\tconst frame = info.render.frame;\n\n\t\tif ( updateList[ uniformsGroup.id ] !== frame ) {\n\n\t\t\tupdateBufferData( uniformsGroup );\n\n\t\t\tupdateList[ uniformsGroup.id ] = frame;\n\n\t\t}\n\n\t}\n\n\tfunction createBuffer( uniformsGroup ) {\n\n\t\t// the setup of an UBO is independent of a particular shader program but global\n\n\t\tconst bindingPointIndex = allocateBindingPointIndex();\n\t\tuniformsGroup.__bindingPointIndex = bindingPointIndex;\n\n\t\tconst buffer = gl.createBuffer();\n\t\tconst size = uniformsGroup.__size;\n\t\tconst usage = uniformsGroup.usage;\n\n\t\tgl.bindBuffer( gl.UNIFORM_BUFFER, buffer );\n\t\tgl.bufferData( gl.UNIFORM_BUFFER, size, usage );\n\t\tgl.bindBuffer( gl.UNIFORM_BUFFER, null );\n\t\tgl.bindBufferBase( gl.UNIFORM_BUFFER, bindingPointIndex, buffer );\n\n\t\treturn buffer;\n\n\t}\n\n\tfunction allocateBindingPointIndex() {\n\n\t\tfor ( let i = 0; i < maxBindingPoints; i ++ ) {\n\n\t\t\tif ( allocatedBindingPoints.indexOf( i ) === -1 ) {\n\n\t\t\t\tallocatedBindingPoints.push( i );\n\t\t\t\treturn i;\n\n\t\t\t}\n\n\t\t}\n\n\t\terror( 'WebGLRenderer: Maximum number of simultaneously usable uniforms groups reached.' );\n\n\t\treturn 0;\n\n\t}\n\n\tfunction updateBufferData( uniformsGroup ) {\n\n\t\tconst buffer = buffers[ uniformsGroup.id ];\n\t\tconst uniforms = uniformsGroup.uniforms;\n\t\tconst cache = uniformsGroup.__cache;\n\n\t\tgl.bindBuffer( gl.UNIFORM_BUFFER, buffer );\n\n\t\tfor ( let i = 0, il = uniforms.length; i < il; i ++ ) {\n\n\t\t\tconst uniformArray = Array.isArray( uniforms[ i ] ) ? uniforms[ i ] : [ uniforms[ i ] ];\n\n\t\t\tfor ( let j = 0, jl = uniformArray.length; j < jl; j ++ ) {\n\n\t\t\t\tconst uniform = uniformArray[ j ];\n\n\t\t\t\tif ( hasUniformChanged( uniform, i, j, cache ) === true ) {\n\n\t\t\t\t\tconst offset = uniform.__offset;\n\n\t\t\t\t\tconst values = Array.isArray( uniform.value ) ? uniform.value : [ uniform.value ];\n\n\t\t\t\t\tlet arrayOffset = 0;\n\n\t\t\t\t\tfor ( let k = 0; k < values.length; k ++ ) {\n\n\t\t\t\t\t\tconst value = values[ k ];\n\n\t\t\t\t\t\tconst info = getUniformSize( value );\n\n\t\t\t\t\t\t// TODO add integer and struct support\n\t\t\t\t\t\tif ( typeof value === 'number' || typeof value === 'boolean' ) {\n\n\t\t\t\t\t\t\tuniform.__data[ 0 ] = value;\n\t\t\t\t\t\t\tgl.bufferSubData( gl.UNIFORM_BUFFER, offset + arrayOffset, uniform.__data );\n\n\t\t\t\t\t\t} else if ( value.isMatrix3 ) {\n\n\t\t\t\t\t\t\t// manually converting 3x3 to 3x4\n\n\t\t\t\t\t\t\tuniform.__data[ 0 ] = value.elements[ 0 ];\n\t\t\t\t\t\t\tuniform.__data[ 1 ] = value.elements[ 1 ];\n\t\t\t\t\t\t\tuniform.__data[ 2 ] = value.elements[ 2 ];\n\t\t\t\t\t\t\tuniform.__data[ 3 ] = 0;\n\t\t\t\t\t\t\tuniform.__data[ 4 ] = value.elements[ 3 ];\n\t\t\t\t\t\t\tuniform.__data[ 5 ] = value.elements[ 4 ];\n\t\t\t\t\t\t\tuniform.__data[ 6 ] = value.elements[ 5 ];\n\t\t\t\t\t\t\tuniform.__data[ 7 ] = 0;\n\t\t\t\t\t\t\tuniform.__data[ 8 ] = value.elements[ 6 ];\n\t\t\t\t\t\t\tuniform.__data[ 9 ] = value.elements[ 7 ];\n\t\t\t\t\t\t\tuniform.__data[ 10 ] = value.elements[ 8 ];\n\t\t\t\t\t\t\tuniform.__data[ 11 ] = 0;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tvalue.toArray( uniform.__data, arrayOffset );\n\n\t\t\t\t\t\t\tarrayOffset += info.storage / Float32Array.BYTES_PER_ELEMENT;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tgl.bufferSubData( gl.UNIFORM_BUFFER, offset, uniform.__data );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tgl.bindBuffer( gl.UNIFORM_BUFFER, null );\n\n\t}\n\n\tfunction hasUniformChanged( uniform, index, indexArray, cache ) {\n\n\t\tconst value = uniform.value;\n\t\tconst indexString = index + '_' + indexArray;\n\n\t\tif ( cache[ indexString ] === undefined ) {\n\n\t\t\t// cache entry does not exist so far\n\n\t\t\tif ( typeof value === 'number' || typeof value === 'boolean' ) {\n\n\t\t\t\tcache[ indexString ] = value;\n\n\t\t\t} else {\n\n\t\t\t\tcache[ indexString ] = value.clone();\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t} else {\n\n\t\t\tconst cachedObject = cache[ indexString ];\n\n\t\t\t// compare current value with cached entry\n\n\t\t\tif ( typeof value === 'number' || typeof value === 'boolean' ) {\n\n\t\t\t\tif ( cachedObject !== value ) {\n\n\t\t\t\t\tcache[ indexString ] = value;\n\t\t\t\t\treturn true;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( cachedObject.equals( value ) === false ) {\n\n\t\t\t\t\tcachedObject.copy( value );\n\t\t\t\t\treturn true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\tfunction prepareUniformsGroup( uniformsGroup ) {\n\n\t\t// determine total buffer size according to the STD140 layout\n\t\t// Hint: STD140 is the only supported layout in WebGL 2\n\n\t\tconst uniforms = uniformsGroup.uniforms;\n\n\t\tlet offset = 0; // global buffer offset in bytes\n\t\tconst chunkSize = 16; // size of a chunk in bytes\n\n\t\tfor ( let i = 0, l = uniforms.length; i < l; i ++ ) {\n\n\t\t\tconst uniformArray = Array.isArray( uniforms[ i ] ) ? uniforms[ i ] : [ uniforms[ i ] ];\n\n\t\t\tfor ( let j = 0, jl = uniformArray.length; j < jl; j ++ ) {\n\n\t\t\t\tconst uniform = uniformArray[ j ];\n\n\t\t\t\tconst values = Array.isArray( uniform.value ) ? uniform.value : [ uniform.value ];\n\n\t\t\t\tfor ( let k = 0, kl = values.length; k < kl; k ++ ) {\n\n\t\t\t\t\tconst value = values[ k ];\n\n\t\t\t\t\tconst info = getUniformSize( value );\n\n\t\t\t\t\tconst chunkOffset = offset % chunkSize; // offset in the current chunk\n\t\t\t\t\tconst chunkPadding = chunkOffset % info.boundary; // required padding to match boundary\n\t\t\t\t\tconst chunkStart = chunkOffset + chunkPadding; // the start position in the current chunk for the data\n\n\t\t\t\t\toffset += chunkPadding;\n\n\t\t\t\t\t// Check for chunk overflow\n\t\t\t\t\tif ( chunkStart !== 0 && ( chunkSize - chunkStart ) < info.storage ) {\n\n\t\t\t\t\t\t// Add padding and adjust offset\n\t\t\t\t\t\toffset += ( chunkSize - chunkStart );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// the following two properties will be used for partial buffer updates\n\t\t\t\t\tuniform.__data = new Float32Array( info.storage / Float32Array.BYTES_PER_ELEMENT );\n\t\t\t\t\tuniform.__offset = offset;\n\n\t\t\t\t\t// Update the global offset\n\t\t\t\t\toffset += info.storage;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// ensure correct final padding\n\n\t\tconst chunkOffset = offset % chunkSize;\n\n\t\tif ( chunkOffset > 0 ) offset += ( chunkSize - chunkOffset );\n\n\t\t//\n\n\t\tuniformsGroup.__size = offset;\n\t\tuniformsGroup.__cache = {};\n\n\t\treturn this;\n\n\t}\n\n\tfunction getUniformSize( value ) {\n\n\t\tconst info = {\n\t\t\tboundary: 0, // bytes\n\t\t\tstorage: 0 // bytes\n\t\t};\n\n\t\t// determine sizes according to STD140\n\n\t\tif ( typeof value === 'number' || typeof value === 'boolean' ) {\n\n\t\t\t// float/int/bool\n\n\t\t\tinfo.boundary = 4;\n\t\t\tinfo.storage = 4;\n\n\t\t} else if ( value.isVector2 ) {\n\n\t\t\t// vec2\n\n\t\t\tinfo.boundary = 8;\n\t\t\tinfo.storage = 8;\n\n\t\t} else if ( value.isVector3 || value.isColor ) {\n\n\t\t\t// vec3\n\n\t\t\tinfo.boundary = 16;\n\t\t\tinfo.storage = 12; // evil: vec3 must start on a 16-byte boundary but it only consumes 12 bytes\n\n\t\t} else if ( value.isVector4 ) {\n\n\t\t\t// vec4\n\n\t\t\tinfo.boundary = 16;\n\t\t\tinfo.storage = 16;\n\n\t\t} else if ( value.isMatrix3 ) {\n\n\t\t\t// mat3 (in STD140 a 3x3 matrix is represented as 3x4)\n\n\t\t\tinfo.boundary = 48;\n\t\t\tinfo.storage = 48;\n\n\t\t} else if ( value.isMatrix4 ) {\n\n\t\t\t// mat4\n\n\t\t\tinfo.boundary = 64;\n\t\t\tinfo.storage = 64;\n\n\t\t} else if ( value.isTexture ) {\n\n\t\t\twarn( 'WebGLRenderer: Texture samplers can not be part of an uniforms group.' );\n\n\t\t} else {\n\n\t\t\twarn( 'WebGLRenderer: Unsupported uniform value type.', value );\n\n\t\t}\n\n\t\treturn info;\n\n\t}\n\n\tfunction onUniformsGroupsDispose( event ) {\n\n\t\tconst uniformsGroup = event.target;\n\n\t\tuniformsGroup.removeEventListener( 'dispose', onUniformsGroupsDispose );\n\n\t\tconst index = allocatedBindingPoints.indexOf( uniformsGroup.__bindingPointIndex );\n\t\tallocatedBindingPoints.splice( index, 1 );\n\n\t\tgl.deleteBuffer( buffers[ uniformsGroup.id ] );\n\n\t\tdelete buffers[ uniformsGroup.id ];\n\t\tdelete updateList[ uniformsGroup.id ];\n\n\t}\n\n\tfunction dispose() {\n\n\t\tfor ( const id in buffers ) {\n\n\t\t\tgl.deleteBuffer( buffers[ id ] );\n\n\t\t}\n\n\t\tallocatedBindingPoints = [];\n\t\tbuffers = {};\n\t\tupdateList = {};\n\n\t}\n\n\treturn {\n\n\t\tbind: bind,\n\t\tupdate: update,\n\n\t\tdispose: dispose\n\n\t};\n\n}\n\n/**\n * Precomputed DFG LUT for Image-Based Lighting\n * Resolution: 32x32\n * Samples: 4096 per texel\n * Format: RG16F (2 half floats per texel: scale, bias)\n */\n\n\nconst DATA = new Uint16Array( [\n\t0x2cd9, 0x3b64, 0x2d0e, 0x3b43, 0x2e20, 0x3aa7, 0x3061, 0x39fb, 0x325e, 0x397c, 0x3454, 0x3908, 0x357d, 0x3893, 0x3698, 0x381e, 0x379d, 0x375b, 0x3845, 0x3689, 0x38af, 0x35ca, 0x390d, 0x351e, 0x395f, 0x3484, 0x39a8, 0x33f9, 0x39e6, 0x330a, 0x3a1c, 0x3239, 0x3a4b, 0x3183, 0x3a73, 0x30e5, 0x3a95, 0x305b, 0x3ab1, 0x2fc6, 0x3ac9, 0x2ef7, 0x3ade, 0x2e43, 0x3aee, 0x2da7, 0x3afc, 0x2d1f, 0x3b07, 0x2ca9, 0x3b10, 0x2c42, 0x3b17, 0x2bd1, 0x3b1c, 0x2b34, 0x3b1f, 0x2aaa, 0x3b22, 0x2a31, 0x3b23, 0x29c7, 0x3b23, 0x2968,\n\t0x32d4, 0x3a4b, 0x32dc, 0x3a45, 0x3308, 0x3a26, 0x3378, 0x39d0, 0x3425, 0x394a, 0x34c9, 0x38be, 0x359c, 0x383e, 0x3688, 0x3796, 0x3778, 0x36c4, 0x382f, 0x3603, 0x3898, 0x3553, 0x38f7, 0x34b3, 0x394b, 0x3424, 0x3994, 0x334c, 0x39d3, 0x326c, 0x3a08, 0x31a9, 0x3a35, 0x30fe, 0x3a5a, 0x306a, 0x3a78, 0x2fd1, 0x3a90, 0x2ef1, 0x3aa2, 0x2e2e, 0x3ab0, 0x2d86, 0x3aba, 0x2cf3, 0x3ac1, 0x2c74, 0x3ac4, 0x2c05, 0x3ac4, 0x2b49, 0x3ac2, 0x2aa1, 0x3abd, 0x2a0c, 0x3ab7, 0x298b, 0x3aaf, 0x2918, 0x3aa6, 0x28b3, 0x3a9b, 0x285a,\n\t0x3559, 0x3954, 0x355a, 0x3951, 0x3566, 0x3944, 0x3582, 0x391e, 0x35b6, 0x38d3, 0x360a, 0x386a, 0x3684, 0x37ed, 0x3720, 0x370d, 0x37d3, 0x3641, 0x3847, 0x3588, 0x38a3, 0x34e2, 0x38fa, 0x344d, 0x3948, 0x3391, 0x398d, 0x32a6, 0x39c8, 0x31d6, 0x39fa, 0x3121, 0x3a22, 0x3082, 0x3a43, 0x2ff0, 0x3a5c, 0x2f01, 0x3a6f, 0x2e32, 0x3a7c, 0x2d7e, 0x3a84, 0x2ce2, 0x3a87, 0x2c5b, 0x3a87, 0x2bcc, 0x3a83, 0x2b00, 0x3a7b, 0x2a4e, 0x3a71, 0x29b3, 0x3a66, 0x292c, 0x3a58, 0x28b4, 0x3a4b, 0x284b, 0x3a3d, 0x27dc, 0x3a2e, 0x2739,\n\t0x3709, 0x387c, 0x370a, 0x387b, 0x3710, 0x3874, 0x3720, 0x385f, 0x373d, 0x3834, 0x376a, 0x37e1, 0x37ac, 0x3732, 0x3805, 0x3675, 0x383f, 0x35bc, 0x3883, 0x3511, 0x38cb, 0x3476, 0x3912, 0x33d8, 0x3955, 0x32e2, 0x3991, 0x3208, 0x39c6, 0x3149, 0x39f1, 0x30a1, 0x3a15, 0x300f, 0x3a30, 0x2f21, 0x3a44, 0x2e45, 0x3a51, 0x2d87, 0x3a59, 0x2ce2, 0x3a5b, 0x2c53, 0x3a58, 0x2bb0, 0x3a52, 0x2ada, 0x3a49, 0x2a1f, 0x3a40, 0x297d, 0x3a34, 0x28f0, 0x3a25, 0x2874, 0x3a13, 0x2807, 0x3a00, 0x274e, 0x39eb, 0x26a6, 0x39d5, 0x2611,\n\t0x3840, 0x3780, 0x3840, 0x377e, 0x3842, 0x3776, 0x3846, 0x375e, 0x384f, 0x372a, 0x385b, 0x36d3, 0x386c, 0x3659, 0x3885, 0x35c7, 0x38a8, 0x352d, 0x38d4, 0x3497, 0x3906, 0x340c, 0x393b, 0x331a, 0x3970, 0x323a, 0x39a0, 0x3172, 0x39cb, 0x30c3, 0x39ef, 0x302a, 0x3a0c, 0x2f4a, 0x3a21, 0x2e63, 0x3a2f, 0x2d9b, 0x3a37, 0x2ced, 0x3a39, 0x2c57, 0x3a37, 0x2baa, 0x3a34, 0x2ac9, 0x3a2c, 0x2a05, 0x3a20, 0x295d, 0x3a11, 0x28ca, 0x39ff, 0x2849, 0x39eb, 0x27b2, 0x39d5, 0x26ed, 0x39be, 0x2640, 0x39a5, 0x25aa, 0x398b, 0x2523,\n\t0x38e2, 0x363b, 0x38e2, 0x363b, 0x38e3, 0x3635, 0x38e6, 0x3626, 0x38ea, 0x3606, 0x38f0, 0x35cd, 0x38f8, 0x3579, 0x3903, 0x350e, 0x3915, 0x3495, 0x392d, 0x3418, 0x394c, 0x3340, 0x3970, 0x3261, 0x3995, 0x3197, 0x39b8, 0x30e4, 0x39d8, 0x3046, 0x39f3, 0x2f76, 0x3a08, 0x2e86, 0x3a16, 0x2db5, 0x3a1e, 0x2cff, 0x3a22, 0x2c61, 0x3a24, 0x2bb3, 0x3a20, 0x2ac7, 0x3a17, 0x29fc, 0x3a0a, 0x294c, 0x39fa, 0x28b2, 0x39e7, 0x282e, 0x39d1, 0x2773, 0x39b9, 0x26a9, 0x399f, 0x25fa, 0x3985, 0x255f, 0x3968, 0x24d6, 0x394a, 0x245d,\n\t0x396e, 0x3524, 0x396e, 0x3524, 0x396e, 0x3520, 0x396f, 0x3517, 0x3971, 0x3502, 0x3973, 0x34dd, 0x3975, 0x34a5, 0x3978, 0x3458, 0x397e, 0x33f9, 0x3987, 0x3332, 0x3997, 0x326b, 0x39aa, 0x31ac, 0x39c0, 0x30fb, 0x39d7, 0x305c, 0x39eb, 0x2f9e, 0x39fc, 0x2ea7, 0x3a07, 0x2dcf, 0x3a0f, 0x2d13, 0x3a16, 0x2c70, 0x3a17, 0x2bc4, 0x3a14, 0x2ad0, 0x3a0a, 0x29fc, 0x39fd, 0x2945, 0x39ed, 0x28a6, 0x39d9, 0x281d, 0x39c2, 0x274a, 0x39a9, 0x267c, 0x398e, 0x25c7, 0x3971, 0x2528, 0x3952, 0x249e, 0x3931, 0x2425, 0x3910, 0x2374,\n\t0x39e5, 0x3436, 0x39e5, 0x3435, 0x39e5, 0x3434, 0x39e5, 0x342e, 0x39e5, 0x3420, 0x39e5, 0x3408, 0x39e3, 0x33c4, 0x39e1, 0x3359, 0x39df, 0x32d3, 0x39de, 0x323a, 0x39e1, 0x319a, 0x39e7, 0x30fb, 0x39f0, 0x3065, 0x39f9, 0x2fb6, 0x3a02, 0x2ec0, 0x3a08, 0x2de6, 0x3a0d, 0x2d26, 0x3a12, 0x2c7e, 0x3a13, 0x2bda, 0x3a0e, 0x2adc, 0x3a05, 0x2a02, 0x39f8, 0x2945, 0x39e7, 0x28a1, 0x39d3, 0x2813, 0x39bc, 0x2730, 0x39a2, 0x265c, 0x3985, 0x25a3, 0x3966, 0x2501, 0x3945, 0x2475, 0x3923, 0x23f3, 0x3901, 0x231c, 0x38dd, 0x225e,\n\t0x3a4b, 0x32d6, 0x3a4a, 0x32d6, 0x3a4a, 0x32d4, 0x3a4a, 0x32cc, 0x3a48, 0x32bb, 0x3a47, 0x329d, 0x3a43, 0x326b, 0x3a3d, 0x3222, 0x3a36, 0x31c2, 0x3a2e, 0x314f, 0x3a28, 0x30d2, 0x3a23, 0x3052, 0x3a20, 0x2fab, 0x3a1e, 0x2ec2, 0x3a1b, 0x2def, 0x3a19, 0x2d31, 0x3a1a, 0x2c89, 0x3a18, 0x2beb, 0x3a11, 0x2aea, 0x3a07, 0x2a0a, 0x39fa, 0x2948, 0x39e9, 0x28a1, 0x39d4, 0x280f, 0x39bd, 0x2721, 0x39a2, 0x2647, 0x3985, 0x258b, 0x3964, 0x24e5, 0x3942, 0x2455, 0x391f, 0x23b3, 0x38fb, 0x22d8, 0x38d4, 0x2219, 0x38ad, 0x2172,\n\t0x3aa0, 0x3180, 0x3aa0, 0x3180, 0x3aa0, 0x317f, 0x3a9f, 0x317b, 0x3a9d, 0x3170, 0x3a99, 0x315d, 0x3a95, 0x313d, 0x3a8d, 0x310c, 0x3a82, 0x30ca, 0x3a76, 0x3077, 0x3a69, 0x3019, 0x3a5c, 0x2f68, 0x3a4f, 0x2e9e, 0x3a42, 0x2dde, 0x3a37, 0x2d2b, 0x3a30, 0x2c89, 0x3a29, 0x2bef, 0x3a1f, 0x2af0, 0x3a12, 0x2a0f, 0x3a03, 0x294a, 0x39f1, 0x28a0, 0x39dc, 0x280c, 0x39c5, 0x2717, 0x39a9, 0x2638, 0x398b, 0x2578, 0x396a, 0x24d0, 0x3947, 0x243f, 0x3923, 0x2380, 0x38fc, 0x22a4, 0x38d4, 0x21e4, 0x38ac, 0x213c, 0x3883, 0x20a8,\n\t0x3ae8, 0x3062, 0x3ae8, 0x3062, 0x3ae7, 0x3061, 0x3ae6, 0x305f, 0x3ae4, 0x305a, 0x3ae0, 0x304f, 0x3ada, 0x303b, 0x3ad1, 0x301b, 0x3ac5, 0x2fdd, 0x3ab6, 0x2f6a, 0x3aa4, 0x2ede, 0x3a91, 0x2e45, 0x3a7c, 0x2da5, 0x3a67, 0x2d0a, 0x3a57, 0x2c77, 0x3a48, 0x2bdc, 0x3a38, 0x2ae5, 0x3a27, 0x2a0a, 0x3a16, 0x2947, 0x3a02, 0x289d, 0x39eb, 0x2808, 0x39d3, 0x270d, 0x39b6, 0x262b, 0x3997, 0x256a, 0x3976, 0x24bf, 0x3952, 0x242b, 0x392d, 0x2358, 0x3904, 0x227a, 0x38db, 0x21b8, 0x38b2, 0x2110, 0x3887, 0x207d, 0x385b, 0x1ff6,\n\t0x3b23, 0x2ee8, 0x3b23, 0x2ee8, 0x3b22, 0x2ee8, 0x3b21, 0x2ee7, 0x3b1f, 0x2ee3, 0x3b1a, 0x2ed6, 0x3b14, 0x2ec1, 0x3b0b, 0x2e99, 0x3afe, 0x2e60, 0x3aee, 0x2e12, 0x3ad8, 0x2dad, 0x3ac1, 0x2d3d, 0x3aa5, 0x2cc3, 0x3a8b, 0x2c48, 0x3a76, 0x2ba2, 0x3a60, 0x2ac0, 0x3a49, 0x29f2, 0x3a32, 0x2938, 0x3a1b, 0x2893, 0x3a02, 0x27ff, 0x39e8, 0x26ff, 0x39ca, 0x261e, 0x39aa, 0x255b, 0x3988, 0x24b0, 0x3964, 0x241c, 0x393d, 0x2336, 0x3913, 0x2257, 0x38e9, 0x2195, 0x38be, 0x20eb, 0x3891, 0x2059, 0x3864, 0x1fae, 0x3837, 0x1ecd,\n\t0x3b54, 0x2d61, 0x3b54, 0x2d61, 0x3b53, 0x2d61, 0x3b52, 0x2d62, 0x3b4f, 0x2d61, 0x3b4b, 0x2d5c, 0x3b45, 0x2d51, 0x3b3b, 0x2d3d, 0x3b2e, 0x2d1a, 0x3b1d, 0x2ce7, 0x3b06, 0x2ca3, 0x3aeb, 0x2c52, 0x3acb, 0x2bee, 0x3ab0, 0x2b31, 0x3a94, 0x2a74, 0x3a77, 0x29bf, 0x3a5a, 0x2915, 0x3a3f, 0x287a, 0x3a22, 0x27de, 0x3a05, 0x26e4, 0x39e5, 0x2609, 0x39c3, 0x2547, 0x39a0, 0x249f, 0x397b, 0x240c, 0x3953, 0x2314, 0x3928, 0x2238, 0x38fd, 0x2175, 0x38d0, 0x20cb, 0x38a2, 0x2038, 0x3873, 0x1f71, 0x3844, 0x1e90, 0x3815, 0x1dce,\n\t0x3b7c, 0x2c22, 0x3b7c, 0x2c22, 0x3b7b, 0x2c23, 0x3b7a, 0x2c25, 0x3b77, 0x2c27, 0x3b73, 0x2c26, 0x3b6d, 0x2c23, 0x3b64, 0x2c1a, 0x3b57, 0x2c07, 0x3b46, 0x2bd1, 0x3b2e, 0x2b79, 0x3b0f, 0x2b07, 0x3aef, 0x2a86, 0x3ad1, 0x29f8, 0x3ab0, 0x2967, 0x3a8e, 0x28d7, 0x3a6d, 0x284e, 0x3a4c, 0x279f, 0x3a2b, 0x26b7, 0x3a08, 0x25e5, 0x39e4, 0x252c, 0x39be, 0x2488, 0x3998, 0x23f0, 0x396f, 0x22f2, 0x3943, 0x2215, 0x3917, 0x2155, 0x38e8, 0x20ae, 0x38b9, 0x201c, 0x3888, 0x1f38, 0x3857, 0x1e5a, 0x3826, 0x1d9a, 0x37eb, 0x1cf0,\n\t0x3b9c, 0x2a43, 0x3b9c, 0x2a43, 0x3b9b, 0x2a46, 0x3b9a, 0x2a4a, 0x3b98, 0x2a50, 0x3b93, 0x2a54, 0x3b8e, 0x2a59, 0x3b85, 0x2a56, 0x3b79, 0x2a45, 0x3b67, 0x2a24, 0x3b4f, 0x29ee, 0x3b2f, 0x29a4, 0x3b10, 0x294b, 0x3aef, 0x28e5, 0x3ac9, 0x2877, 0x3aa4, 0x2809, 0x3a7e, 0x2739, 0x3a59, 0x266d, 0x3a34, 0x25af, 0x3a0c, 0x2503, 0x39e4, 0x2468, 0x39bb, 0x23bb, 0x3990, 0x22c6, 0x3963, 0x21f0, 0x3936, 0x2133, 0x3906, 0x208f, 0x38d5, 0x1ffd, 0x38a3, 0x1f04, 0x3870, 0x1e28, 0x383d, 0x1d69, 0x380b, 0x1cc3, 0x37b0, 0x1c32,\n\t0x3bb5, 0x28aa, 0x3bb5, 0x28ab, 0x3bb5, 0x28ad, 0x3bb4, 0x28b2, 0x3bb2, 0x28b9, 0x3bae, 0x28c2, 0x3ba8, 0x28ca, 0x3ba0, 0x28d1, 0x3b94, 0x28cd, 0x3b83, 0x28c1, 0x3b6a, 0x28a3, 0x3b4b, 0x2876, 0x3b2d, 0x283d, 0x3b09, 0x27ea, 0x3ae1, 0x274b, 0x3ab9, 0x26a6, 0x3a8f, 0x25fe, 0x3a67, 0x255d, 0x3a3d, 0x24c5, 0x3a11, 0x2439, 0x39e6, 0x2371, 0x39b9, 0x228d, 0x398a, 0x21c1, 0x395a, 0x210b, 0x3929, 0x206c, 0x38f7, 0x1fc1, 0x38c3, 0x1ecb, 0x388f, 0x1df6, 0x385a, 0x1d3a, 0x3825, 0x1c99, 0x37e1, 0x1c08, 0x3779, 0x1b1b,\n\t0x3bc9, 0x26d3, 0x3bc9, 0x26d4, 0x3bc9, 0x26d9, 0x3bc8, 0x26e3, 0x3bc6, 0x26ef, 0x3bc2, 0x2705, 0x3bbd, 0x271a, 0x3bb6, 0x2731, 0x3baa, 0x273c, 0x3b9a, 0x273d, 0x3b81, 0x2726, 0x3b65, 0x26f7, 0x3b46, 0x26af, 0x3b20, 0x2650, 0x3af7, 0x25e1, 0x3acd, 0x256a, 0x3aa1, 0x24eb, 0x3a75, 0x246f, 0x3a46, 0x23ee, 0x3a17, 0x230d, 0x39e9, 0x223e, 0x39b7, 0x2183, 0x3985, 0x20d8, 0x3953, 0x2043, 0x391e, 0x1f7a, 0x38e9, 0x1e8d, 0x38b3, 0x1dbf, 0x387c, 0x1d0b, 0x3845, 0x1c6c, 0x380e, 0x1bc4, 0x37b0, 0x1ad2, 0x3745, 0x19fd,\n\t0x3bd9, 0x24e4, 0x3bd9, 0x24e5, 0x3bd9, 0x24e8, 0x3bd8, 0x24f2, 0x3bd5, 0x24fe, 0x3bd2, 0x2512, 0x3bce, 0x252b, 0x3bc6, 0x2544, 0x3bbc, 0x255a, 0x3bac, 0x256b, 0x3b93, 0x2569, 0x3b7a, 0x2557, 0x3b5b, 0x252f, 0x3b34, 0x24f7, 0x3b0c, 0x24ad, 0x3adf, 0x2458, 0x3ab1, 0x23f8, 0x3a82, 0x233f, 0x3a4f, 0x2286, 0x3a1e, 0x21d5, 0x39eb, 0x2130, 0x39b6, 0x2098, 0x3982, 0x200e, 0x394b, 0x1f25, 0x3914, 0x1e45, 0x38dc, 0x1d83, 0x38a3, 0x1cd6, 0x386b, 0x1c3d, 0x3831, 0x1b71, 0x37f2, 0x1a87, 0x3782, 0x19bc, 0x3714, 0x1909,\n\t0x3be5, 0x22d8, 0x3be5, 0x22d9, 0x3be4, 0x22df, 0x3be4, 0x22ef, 0x3be1, 0x2305, 0x3bde, 0x232a, 0x3bda, 0x2358, 0x3bd4, 0x2392, 0x3bcb, 0x23ca, 0x3bbb, 0x23f4, 0x3ba3, 0x2405, 0x3b8c, 0x2405, 0x3b6c, 0x23ec, 0x3b47, 0x23ae, 0x3b1d, 0x2353, 0x3af0, 0x22e2, 0x3ac0, 0x2261, 0x3a8e, 0x21d9, 0x3a5a, 0x214e, 0x3a26, 0x20c7, 0x39ee, 0x2045, 0x39b7, 0x1f97, 0x397f, 0x1eba, 0x3945, 0x1df0, 0x390b, 0x1d3a, 0x38d0, 0x1c9a, 0x3895, 0x1c0a, 0x385a, 0x1b18, 0x381f, 0x1a39, 0x37c9, 0x1975, 0x3756, 0x18cc, 0x36e6, 0x1836,\n\t0x3bed, 0x20a8, 0x3bed, 0x20a9, 0x3bed, 0x20ae, 0x3bed, 0x20bb, 0x3beb, 0x20cf, 0x3be8, 0x20ef, 0x3be4, 0x2119, 0x3bde, 0x214f, 0x3bd6, 0x2189, 0x3bc6, 0x21b8, 0x3bb1, 0x21de, 0x3b9a, 0x21f2, 0x3b7b, 0x21f2, 0x3b57, 0x21d8, 0x3b2d, 0x21a4, 0x3b00, 0x215f, 0x3acf, 0x2108, 0x3a99, 0x20a8, 0x3a64, 0x2043, 0x3a2c, 0x1fba, 0x39f2, 0x1ef3, 0x39b8, 0x1e36, 0x397c, 0x1d86, 0x3940, 0x1ce5, 0x3903, 0x1c52, 0x38c6, 0x1b9e, 0x3888, 0x1ab3, 0x384a, 0x19e4, 0x380e, 0x192b, 0x37a3, 0x188b, 0x372d, 0x17f7, 0x36ba, 0x1701,\n\t0x3bf4, 0x1e23, 0x3bf4, 0x1e25, 0x3bf4, 0x1e2d, 0x3bf3, 0x1e41, 0x3bf1, 0x1e64, 0x3bef, 0x1e9c, 0x3beb, 0x1ee1, 0x3be6, 0x1f40, 0x3bde, 0x1fa7, 0x3bce, 0x2001, 0x3bbd, 0x202f, 0x3ba6, 0x204e, 0x3b88, 0x205f, 0x3b64, 0x205b, 0x3b3b, 0x2044, 0x3b0e, 0x201f, 0x3adb, 0x1fcf, 0x3aa6, 0x1f4e, 0x3a6e, 0x1ec1, 0x3a33, 0x1e2b, 0x39f7, 0x1d95, 0x39ba, 0x1d06, 0x397b, 0x1c7d, 0x393c, 0x1bfc, 0x38fc, 0x1b13, 0x38bc, 0x1a40, 0x387c, 0x1983, 0x383c, 0x18da, 0x37fa, 0x1842, 0x377f, 0x177f, 0x3706, 0x1695, 0x3691, 0x15c8,\n\t0x3bf8, 0x1bca, 0x3bf8, 0x1bcc, 0x3bf8, 0x1bd8, 0x3bf8, 0x1bf7, 0x3bf6, 0x1c1b, 0x3bf4, 0x1c45, 0x3bf1, 0x1c83, 0x3bec, 0x1cce, 0x3be4, 0x1d21, 0x3bd5, 0x1d78, 0x3bc5, 0x1dd1, 0x3bb0, 0x1e17, 0x3b93, 0x1e4a, 0x3b70, 0x1e5f, 0x3b48, 0x1e57, 0x3b1b, 0x1e35, 0x3ae7, 0x1df6, 0x3ab2, 0x1da4, 0x3a77, 0x1d44, 0x3a3a, 0x1cdb, 0x39fc, 0x1c6e, 0x39bb, 0x1c03, 0x397a, 0x1b35, 0x3938, 0x1a72, 0x38f5, 0x19bb, 0x38b3, 0x1914, 0x3870, 0x187d, 0x382e, 0x17eb, 0x37db, 0x16f9, 0x375c, 0x1621, 0x36e1, 0x1565, 0x3669, 0x14be,\n\t0x3bfb, 0x18b9, 0x3bfb, 0x18ba, 0x3bfb, 0x18c3, 0x3bfb, 0x18da, 0x3bf9, 0x190a, 0x3bf7, 0x1948, 0x3bf5, 0x19ac, 0x3bf0, 0x1a20, 0x3be9, 0x1ab3, 0x3bdb, 0x1b49, 0x3bcd, 0x1be6, 0x3bb7, 0x1c34, 0x3b9c, 0x1c6d, 0x3b7a, 0x1c8e, 0x3b54, 0x1c9e, 0x3b26, 0x1c96, 0x3af2, 0x1c75, 0x3abc, 0x1c47, 0x3a80, 0x1c09, 0x3a42, 0x1b85, 0x3a01, 0x1aec, 0x39be, 0x1a50, 0x397a, 0x19b5, 0x3935, 0x1921, 0x38f0, 0x1895, 0x38aa, 0x1814, 0x3866, 0x173a, 0x3821, 0x1665, 0x37be, 0x15a4, 0x373c, 0x14f9, 0x36be, 0x1460, 0x3644, 0x13b3,\n\t0x3bfd, 0x156b, 0x3bfd, 0x156c, 0x3bfd, 0x1578, 0x3bfd, 0x1598, 0x3bfc, 0x15dd, 0x3bfa, 0x163c, 0x3bf7, 0x16cb, 0x3bf3, 0x177b, 0x3beb, 0x1833, 0x3be0, 0x18ad, 0x3bd2, 0x192e, 0x3bbd, 0x19a6, 0x3ba4, 0x1a0c, 0x3b83, 0x1a5a, 0x3b5d, 0x1a8c, 0x3b30, 0x1a9b, 0x3afd, 0x1a86, 0x3ac6, 0x1a5c, 0x3a89, 0x1a11, 0x3a49, 0x19b7, 0x3a06, 0x194f, 0x39c1, 0x18e3, 0x397a, 0x1873, 0x3933, 0x1805, 0x38eb, 0x173a, 0x38a3, 0x1676, 0x385c, 0x15bf, 0x3816, 0x1519, 0x37a2, 0x1482, 0x371d, 0x13f7, 0x369c, 0x1306, 0x3620, 0x1231,\n\t0x3bff, 0x11cb, 0x3bff, 0x11cd, 0x3bfe, 0x11dd, 0x3bfe, 0x1219, 0x3bfd, 0x126b, 0x3bfb, 0x12e9, 0x3bf9, 0x13c5, 0x3bf5, 0x1460, 0x3bee, 0x150f, 0x3be3, 0x15c9, 0x3bd6, 0x168a, 0x3bc3, 0x174f, 0x3baa, 0x1806, 0x3b8b, 0x184f, 0x3b66, 0x1888, 0x3b39, 0x18a6, 0x3b07, 0x18ad, 0x3acf, 0x189c, 0x3a92, 0x1876, 0x3a50, 0x1840, 0x3a0c, 0x17fd, 0x39c4, 0x176a, 0x397b, 0x16ce, 0x3931, 0x1634, 0x38e6, 0x1599, 0x389c, 0x1508, 0x3852, 0x147f, 0x380a, 0x1401, 0x3788, 0x131c, 0x36ff, 0x124a, 0x367c, 0x1190, 0x35fe, 0x10ea,\n\t0x3bff, 0x0daa, 0x3bff, 0x0dad, 0x3bff, 0x0dc0, 0x3bff, 0x0e0e, 0x3bfe, 0x0e87, 0x3bfc, 0x0f14, 0x3bfb, 0x1029, 0x3bf7, 0x10d1, 0x3bf0, 0x11d3, 0x3be6, 0x12c9, 0x3bd9, 0x13fc, 0x3bc7, 0x1499, 0x3bb0, 0x152a, 0x3b92, 0x15ab, 0x3b6e, 0x1615, 0x3b42, 0x165a, 0x3b10, 0x1681, 0x3ad8, 0x1683, 0x3a9a, 0x1665, 0x3a57, 0x1629, 0x3a11, 0x15dd, 0x39c8, 0x1580, 0x397c, 0x1518, 0x3930, 0x14ae, 0x38e3, 0x1441, 0x3896, 0x13b1, 0x384a, 0x12e9, 0x37ff, 0x122f, 0x376f, 0x1182, 0x36e3, 0x10e5, 0x365e, 0x1057, 0x35de, 0x0fac,\n\t0x3c00, 0x08ea, 0x3c00, 0x08ed, 0x3c00, 0x0902, 0x3c00, 0x0961, 0x3bff, 0x09f3, 0x3bfd, 0x0abc, 0x3bfb, 0x0c1f, 0x3bf8, 0x0d15, 0x3bf1, 0x0e5b, 0x3be8, 0x0fb4, 0x3bdc, 0x10b0, 0x3bcb, 0x1190, 0x3bb5, 0x126c, 0x3b97, 0x132c, 0x3b74, 0x13de, 0x3b4a, 0x1432, 0x3b18, 0x145e, 0x3ae0, 0x1472, 0x3aa2, 0x146f, 0x3a5f, 0x1456, 0x3a17, 0x142e, 0x39cc, 0x13ee, 0x397e, 0x136b, 0x392f, 0x12e1, 0x38df, 0x124f, 0x3890, 0x11bd, 0x3842, 0x1131, 0x37eb, 0x10ac, 0x3757, 0x102e, 0x36c9, 0x0f76, 0x3640, 0x0ea3, 0x35bf, 0x0de4,\n\t0x3c00, 0x039b, 0x3c00, 0x039d, 0x3c00, 0x03b2, 0x3c00, 0x041c, 0x3bff, 0x04be, 0x3bfd, 0x05d6, 0x3bfc, 0x0764, 0x3bf8, 0x08e2, 0x3bf2, 0x0a67, 0x3bea, 0x0c1b, 0x3bde, 0x0d41, 0x3bcd, 0x0e5f, 0x3bb8, 0x0f8c, 0x3b9c, 0x1057, 0x3b7a, 0x10e5, 0x3b51, 0x1155, 0x3b20, 0x11a5, 0x3ae8, 0x11da, 0x3aaa, 0x11ef, 0x3a66, 0x11e5, 0x3a1d, 0x11c1, 0x39d0, 0x1185, 0x3980, 0x113b, 0x392e, 0x10e5, 0x38dc, 0x1087, 0x388b, 0x1028, 0x383b, 0x0f94, 0x37d9, 0x0edb, 0x3741, 0x0e2c, 0x36af, 0x0d89, 0x3625, 0x0cf2, 0x35a1, 0x0c69,\n\t0x3c00, 0x0107, 0x3c00, 0x0108, 0x3c00, 0x0110, 0x3c00, 0x0145, 0x3bff, 0x0197, 0x3bfe, 0x0224, 0x3bfc, 0x030c, 0x3bf8, 0x0478, 0x3bf3, 0x062c, 0x3beb, 0x0833, 0x3be0, 0x0979, 0x3bd0, 0x0aeb, 0x3bbc, 0x0c3d, 0x3ba0, 0x0d01, 0x3b80, 0x0dbd, 0x3b57, 0x0e69, 0x3b27, 0x0eeb, 0x3af0, 0x0f53, 0x3ab1, 0x0f8a, 0x3a6c, 0x0f9f, 0x3a22, 0x0f8b, 0x39d4, 0x0f5b, 0x3982, 0x0f0f, 0x392f, 0x0eac, 0x38da, 0x0e3d, 0x3886, 0x0dc9, 0x3834, 0x0d51, 0x37c7, 0x0cd9, 0x372c, 0x0c65, 0x3697, 0x0bef, 0x360a, 0x0b20, 0x3585, 0x0a62,\n\t0x3c00, 0x0031, 0x3c00, 0x0031, 0x3c00, 0x0034, 0x3c00, 0x004b, 0x3bff, 0x006f, 0x3bfe, 0x00c9, 0x3bfc, 0x011b, 0x3bf9, 0x0207, 0x3bf4, 0x02d6, 0x3bec, 0x0415, 0x3be1, 0x0587, 0x3bd2, 0x0703, 0x3bbf, 0x087d, 0x3ba5, 0x096a, 0x3b85, 0x0a59, 0x3b5d, 0x0b32, 0x3b2e, 0x0bee, 0x3af7, 0x0c44, 0x3ab8, 0x0c7c, 0x3a73, 0x0c9c, 0x3a28, 0x0ca4, 0x39d8, 0x0c98, 0x3985, 0x0c77, 0x392f, 0x0c4a, 0x38d9, 0x0c10, 0x3882, 0x0ba0, 0x382e, 0x0b14, 0x37b6, 0x0a84, 0x3717, 0x09f5, 0x3680, 0x0969, 0x35f0, 0x08e6, 0x356a, 0x086a,\n\t0x3c00, 0x0004, 0x3c00, 0x0004, 0x3c00, 0x0004, 0x3c00, 0x000d, 0x3bff, 0x0021, 0x3bfe, 0x003b, 0x3bfd, 0x0070, 0x3bf9, 0x00c7, 0x3bf4, 0x012e, 0x3bed, 0x01c8, 0x3be3, 0x0274, 0x3bd4, 0x033b, 0x3bc1, 0x043a, 0x3ba8, 0x0534, 0x3b89, 0x0641, 0x3b62, 0x073b, 0x3b34, 0x0815, 0x3afd, 0x087c, 0x3abf, 0x08d0, 0x3a7a, 0x090a, 0x3a2e, 0x092c, 0x39dd, 0x0936, 0x3988, 0x0928, 0x3930, 0x0907, 0x38d7, 0x08d7, 0x387f, 0x089b, 0x3828, 0x0855, 0x37a7, 0x080b, 0x3704, 0x077b, 0x366a, 0x06e1, 0x35d8, 0x0649, 0x3550, 0x05b8,\n\t0x3c00, 0x0000, 0x3c00, 0x0000, 0x3c00, 0x0000, 0x3c00, 0x0003, 0x3bff, 0x0012, 0x3bfe, 0x001a, 0x3bfd, 0x0035, 0x3bfa, 0x0050, 0x3bf4, 0x0061, 0x3bed, 0x00a5, 0x3be4, 0x00ee, 0x3bd6, 0x0146, 0x3bc3, 0x01ab, 0x3bab, 0x0211, 0x3b8d, 0x028e, 0x3b67, 0x0303, 0x3b39, 0x0375, 0x3b04, 0x03e2, 0x3ac6, 0x0441, 0x3a80, 0x0492, 0x3a34, 0x04cd, 0x39e1, 0x04f2, 0x398b, 0x0504, 0x3931, 0x0502, 0x38d6, 0x04ec, 0x387c, 0x04c7, 0x3822, 0x0496, 0x3798, 0x045c, 0x36f2, 0x041a, 0x3655, 0x03d5, 0x35c1, 0x038e, 0x3537, 0x0347\n] );\n\nlet lut = null;\n\nfunction getDFGLUT() {\n\n\tif ( lut === null ) {\n\n\t\tlut = new DataTexture( DATA, 32, 32, RGFormat, HalfFloatType );\n\t\tlut.minFilter = LinearFilter;\n\t\tlut.magFilter = LinearFilter;\n\t\tlut.wrapS = ClampToEdgeWrapping;\n\t\tlut.wrapT = ClampToEdgeWrapping;\n\t\tlut.generateMipmaps = false;\n\t\tlut.needsUpdate = true;\n\n\t}\n\n\treturn lut;\n\n}\n\n/**\n * This renderer uses WebGL 2 to display scenes.\n *\n * WebGL 1 is not supported since `r163`.\n */\nclass WebGLRenderer {\n\n\t/**\n\t * Constructs a new WebGL renderer.\n\t *\n\t * @param {WebGLRenderer~Options} [parameters] - The configuration parameter.\n\t */\n\tconstructor( parameters = {} ) {\n\n\t\tconst {\n\t\t\tcanvas = createCanvasElement(),\n\t\t\tcontext = null,\n\t\t\tdepth = true,\n\t\t\tstencil = false,\n\t\t\talpha = false,\n\t\t\tantialias = false,\n\t\t\tpremultipliedAlpha = true,\n\t\t\tpreserveDrawingBuffer = false,\n\t\t\tpowerPreference = 'default',\n\t\t\tfailIfMajorPerformanceCaveat = false,\n\t\t\treversedDepthBuffer = false,\n\t\t} = parameters;\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isWebGLRenderer = true;\n\n\t\tlet _alpha;\n\n\t\tif ( context !== null ) {\n\n\t\t\tif ( typeof WebGLRenderingContext !== 'undefined' && context instanceof WebGLRenderingContext ) {\n\n\t\t\t\tthrow new Error( 'THREE.WebGLRenderer: WebGL 1 is not supported since r163.' );\n\n\t\t\t}\n\n\t\t\t_alpha = context.getContextAttributes().alpha;\n\n\t\t} else {\n\n\t\t\t_alpha = alpha;\n\n\t\t}\n\n\t\tconst INTEGER_FORMATS = new Set( [\n\t\t\tRGBAIntegerFormat,\n\t\t\tRGIntegerFormat,\n\t\t\tRedIntegerFormat\n\t\t] );\n\n\t\tconst UNSIGNED_TYPES = new Set( [\n\t\t\tUnsignedByteType,\n\t\t\tUnsignedIntType,\n\t\t\tUnsignedShortType,\n\t\t\tUnsignedInt248Type,\n\t\t\tUnsignedShort4444Type,\n\t\t\tUnsignedShort5551Type\n\t\t] );\n\n\t\tconst uintClearColor = new Uint32Array( 4 );\n\t\tconst intClearColor = new Int32Array( 4 );\n\n\t\tlet currentRenderList = null;\n\t\tlet currentRenderState = null;\n\n\t\t// render() can be called from within a callback triggered by another render.\n\t\t// We track this so that the nested render call gets its list and state isolated from the parent render call.\n\n\t\tconst renderListStack = [];\n\t\tconst renderStateStack = [];\n\n\t\t// public properties\n\n\t\t/**\n\t\t * A canvas where the renderer draws its output.This is automatically created by the renderer\n\t\t * in the constructor (if not provided already); you just need to add it to your page like so:\n\t\t * ```js\n\t\t * document.body.appendChild( renderer.domElement );\n\t\t * ```\n\t\t *\n\t\t * @type {HTMLCanvasElement|OffscreenCanvas}\n\t\t */\n\t\tthis.domElement = canvas;\n\n\t\t/**\n\t\t * A object with debug configuration settings.\n\t\t *\n\t\t * - `checkShaderErrors`: If it is `true`, defines whether material shader programs are\n\t\t * checked for errors during compilation and linkage process. It may be useful to disable\n\t\t * this check in production for performance gain. It is strongly recommended to keep these\n\t\t * checks enabled during development. If the shader does not compile and link - it will not\n\t\t * work and associated material will not render.\n\t\t * - `onShaderError(gl, program, glVertexShader,glFragmentShader)`: A callback function that\n\t\t * can be used for custom error reporting. The callback receives the WebGL context, an instance\n\t\t * of WebGLProgram as well two instances of WebGLShader representing the vertex and fragment shader.\n\t\t * Assigning a custom function disables the default error reporting.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.debug = {\n\n\t\t\t/**\n\t\t\t * Enables error checking and reporting when shader programs are being compiled.\n\t\t\t * @type {boolean}\n\t\t\t */\n\t\t\tcheckShaderErrors: true,\n\t\t\t/**\n\t\t\t * Callback for custom error reporting.\n\t\t\t * @type {?Function}\n\t\t\t */\n\t\t\tonShaderError: null\n\t\t};\n\n\t\t// clearing\n\n\t\t/**\n\t\t * Whether the renderer should automatically clear its output before rendering a frame or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.autoClear = true;\n\n\t\t/**\n\t\t * If {@link WebGLRenderer#autoClear} set to `true`, whether the renderer should clear\n\t\t * the color buffer or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.autoClearColor = true;\n\n\t\t/**\n\t\t * If {@link WebGLRenderer#autoClear} set to `true`, whether the renderer should clear\n\t\t * the depth buffer or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.autoClearDepth = true;\n\n\t\t/**\n\t\t * If {@link WebGLRenderer#autoClear} set to `true`, whether the renderer should clear\n\t\t * the stencil buffer or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.autoClearStencil = true;\n\n\t\t// scene graph\n\n\t\t/**\n\t\t * Whether the renderer should sort objects or not.\n\t\t *\n\t\t * Note: Sorting is used to attempt to properly render objects that have some\n\t\t * degree of transparency. By definition, sorting objects may not work in all\n\t\t * cases. Depending on the needs of application, it may be necessary to turn\n\t\t * off sorting and use other methods to deal with transparency rendering e.g.\n\t\t * manually determining each object's rendering order.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.sortObjects = true;\n\n\t\t// user-defined clipping\n\n\t\t/**\n\t\t * User-defined clipping planes specified in world space. These planes apply globally.\n\t\t * Points in space whose dot product with the plane is negative are cut away.\n\t\t *\n\t\t * @type {Array<Plane>}\n\t\t */\n\t\tthis.clippingPlanes = [];\n\n\t\t/**\n\t\t * Whether the renderer respects object-level clipping planes or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.localClippingEnabled = false;\n\n\t\t// tone mapping\n\n\t\t/**\n\t\t * The tone mapping technique of the renderer.\n\t\t *\n\t\t * @type {(NoToneMapping|LinearToneMapping|ReinhardToneMapping|CineonToneMapping|ACESFilmicToneMapping|CustomToneMapping|AgXToneMapping|NeutralToneMapping)}\n\t\t * @default NoToneMapping\n\t\t */\n\t\tthis.toneMapping = NoToneMapping;\n\n\t\t/**\n\t\t * Exposure level of tone mapping.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.toneMappingExposure = 1.0;\n\n\t\t// transmission\n\n\t\t/**\n\t\t * The normalized resolution scale for the transmission render target, measured in percentage\n\t\t * of viewport dimensions. Lowering this value can result in significant performance improvements\n\t\t * when using {@link MeshPhysicalMaterial#transmission}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.transmissionResolutionScale = 1.0;\n\n\t\t// internal properties\n\n\t\tconst _this = this;\n\n\t\tlet _isContextLost = false;\n\n\t\t// internal state cache\n\n\t\tthis._outputColorSpace = SRGBColorSpace;\n\n\t\tlet _currentActiveCubeFace = 0;\n\t\tlet _currentActiveMipmapLevel = 0;\n\t\tlet _currentRenderTarget = null;\n\t\tlet _currentMaterialId = -1;\n\n\t\tlet _currentCamera = null;\n\n\t\tconst _currentViewport = new Vector4();\n\t\tconst _currentScissor = new Vector4();\n\t\tlet _currentScissorTest = null;\n\n\t\tconst _currentClearColor = new Color( 0x000000 );\n\t\tlet _currentClearAlpha = 0;\n\n\t\t//\n\n\t\tlet _width = canvas.width;\n\t\tlet _height = canvas.height;\n\n\t\tlet _pixelRatio = 1;\n\t\tlet _opaqueSort = null;\n\t\tlet _transparentSort = null;\n\n\t\tconst _viewport = new Vector4( 0, 0, _width, _height );\n\t\tconst _scissor = new Vector4( 0, 0, _width, _height );\n\t\tlet _scissorTest = false;\n\n\t\t// frustum\n\n\t\tconst _frustum = new Frustum();\n\n\t\t// clipping\n\n\t\tlet _clippingEnabled = false;\n\t\tlet _localClippingEnabled = false;\n\n\t\t// camera matrices cache\n\n\t\tconst _projScreenMatrix = new Matrix4();\n\n\t\tconst _vector3 = new Vector3();\n\n\t\tconst _vector4 = new Vector4();\n\n\t\tconst _emptyScene = { background: null, fog: null, environment: null, overrideMaterial: null, isScene: true };\n\n\t\tlet _renderBackground = false;\n\n\t\tfunction getTargetPixelRatio() {\n\n\t\t\treturn _currentRenderTarget === null ? _pixelRatio : 1;\n\n\t\t}\n\n\t\t// initialize\n\n\t\tlet _gl = context;\n\n\t\tfunction getContext( contextName, contextAttributes ) {\n\n\t\t\treturn canvas.getContext( contextName, contextAttributes );\n\n\t\t}\n\n\t\ttry {\n\n\t\t\tconst contextAttributes = {\n\t\t\t\talpha: true,\n\t\t\t\tdepth,\n\t\t\t\tstencil,\n\t\t\t\tantialias,\n\t\t\t\tpremultipliedAlpha,\n\t\t\t\tpreserveDrawingBuffer,\n\t\t\t\tpowerPreference,\n\t\t\t\tfailIfMajorPerformanceCaveat,\n\t\t\t};\n\n\t\t\t// OffscreenCanvas does not have setAttribute, see #22811\n\t\t\tif ( 'setAttribute' in canvas ) canvas.setAttribute( 'data-engine', `three.js r${REVISION}` );\n\n\t\t\t// event listeners must be registered before WebGL context is created, see #12753\n\t\t\tcanvas.addEventListener( 'webglcontextlost', onContextLost, false );\n\t\t\tcanvas.addEventListener( 'webglcontextrestored', onContextRestore, false );\n\t\t\tcanvas.addEventListener( 'webglcontextcreationerror', onContextCreationError, false );\n\n\t\t\tif ( _gl === null ) {\n\n\t\t\t\tconst contextName = 'webgl2';\n\n\t\t\t\t_gl = getContext( contextName, contextAttributes );\n\n\t\t\t\tif ( _gl === null ) {\n\n\t\t\t\t\tif ( getContext( contextName ) ) {\n\n\t\t\t\t\t\tthrow new Error( 'Error creating WebGL context with your selected attributes.' );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tthrow new Error( 'Error creating WebGL context.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} catch ( error ) {\n\n\t\t\terror( 'WebGLRenderer: ' + error.message );\n\t\t\tthrow error;\n\n\t\t}\n\n\t\tlet extensions, capabilities, state, info;\n\t\tlet properties, textures, cubemaps, cubeuvmaps, attributes, geometries, objects;\n\t\tlet programCache, materials, renderLists, renderStates, clipping, shadowMap;\n\n\t\tlet background, morphtargets, bufferRenderer, indexedBufferRenderer;\n\n\t\tlet utils, bindingStates, uniformsGroups;\n\n\t\tfunction initGLContext() {\n\n\t\t\textensions = new WebGLExtensions( _gl );\n\t\t\textensions.init();\n\n\t\t\tutils = new WebGLUtils( _gl, extensions );\n\n\t\t\tcapabilities = new WebGLCapabilities( _gl, extensions, parameters, utils );\n\n\t\t\tstate = new WebGLState( _gl, extensions );\n\n\t\t\tif ( capabilities.reversedDepthBuffer && reversedDepthBuffer ) {\n\n\t\t\t\tstate.buffers.depth.setReversed( true );\n\n\t\t\t}\n\n\t\t\tinfo = new WebGLInfo( _gl );\n\t\t\tproperties = new WebGLProperties();\n\t\t\ttextures = new WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info );\n\t\t\tcubemaps = new WebGLCubeMaps( _this );\n\t\t\tcubeuvmaps = new WebGLCubeUVMaps( _this );\n\t\t\tattributes = new WebGLAttributes( _gl );\n\t\t\tbindingStates = new WebGLBindingStates( _gl, attributes );\n\t\t\tgeometries = new WebGLGeometries( _gl, attributes, info, bindingStates );\n\t\t\tobjects = new WebGLObjects( _gl, geometries, attributes, info );\n\t\t\tmorphtargets = new WebGLMorphtargets( _gl, capabilities, textures );\n\t\t\tclipping = new WebGLClipping( properties );\n\t\t\tprogramCache = new WebGLPrograms( _this, cubemaps, cubeuvmaps, extensions, capabilities, bindingStates, clipping );\n\t\t\tmaterials = new WebGLMaterials( _this, properties );\n\t\t\trenderLists = new WebGLRenderLists();\n\t\t\trenderStates = new WebGLRenderStates( extensions );\n\t\t\tbackground = new WebGLBackground( _this, cubemaps, cubeuvmaps, state, objects, _alpha, premultipliedAlpha );\n\t\t\tshadowMap = new WebGLShadowMap( _this, objects, capabilities );\n\t\t\tuniformsGroups = new WebGLUniformsGroups( _gl, info, capabilities, state );\n\n\t\t\tbufferRenderer = new WebGLBufferRenderer( _gl, extensions, info );\n\t\t\tindexedBufferRenderer = new WebGLIndexedBufferRenderer( _gl, extensions, info );\n\n\t\t\tinfo.programs = programCache.programs;\n\n\t\t\t/**\n\t\t\t * Holds details about the capabilities of the current rendering context.\n\t\t\t *\n\t\t\t * @name WebGLRenderer#capabilities\n\t\t\t * @type {WebGLRenderer~Capabilities}\n\t\t\t */\n\t\t\t_this.capabilities = capabilities;\n\n\t\t\t/**\n\t\t\t * Provides methods for retrieving and testing WebGL extensions.\n\t\t\t *\n\t\t\t * - `get(extensionName:string)`: Used to check whether a WebGL extension is supported\n\t\t\t * and return the extension object if available.\n\t\t\t * - `has(extensionName:string)`: returns `true` if the extension is supported.\n\t\t\t *\n\t\t\t * @name WebGLRenderer#extensions\n\t\t\t * @type {Object}\n\t\t\t */\n\t\t\t_this.extensions = extensions;\n\n\t\t\t/**\n\t\t\t * Used to track properties of other objects like native WebGL objects.\n\t\t\t *\n\t\t\t * @name WebGLRenderer#properties\n\t\t\t * @type {Object}\n\t\t\t */\n\t\t\t_this.properties = properties;\n\n\t\t\t/**\n\t\t\t * Manages the render lists of the renderer.\n\t\t\t *\n\t\t\t * @name WebGLRenderer#renderLists\n\t\t\t * @type {Object}\n\t\t\t */\n\t\t\t_this.renderLists = renderLists;\n\n\n\n\t\t\t/**\n\t\t\t * Interface for managing shadows.\n\t\t\t *\n\t\t\t * @name WebGLRenderer#shadowMap\n\t\t\t * @type {WebGLRenderer~ShadowMap}\n\t\t\t */\n\t\t\t_this.shadowMap = shadowMap;\n\n\t\t\t/**\n\t\t\t * Interface for managing the WebGL state.\n\t\t\t *\n\t\t\t * @name WebGLRenderer#state\n\t\t\t * @type {Object}\n\t\t\t */\n\t\t\t_this.state = state;\n\n\t\t\t/**\n\t\t\t * Holds a series of statistical information about the GPU memory\n\t\t\t * and the rendering process. Useful for debugging and monitoring.\n\t\t\t *\n\t\t\t * By default these data are reset at each render call but when having\n\t\t\t * multiple render passes per frame (e.g. when using post processing) it can\n\t\t\t * be preferred to reset with a custom pattern. First, set `autoReset` to\n\t\t\t * `false`.\n\t\t\t * ```js\n\t\t\t * renderer.info.autoReset = false;\n\t\t\t * ```\n\t\t\t * Call `reset()` whenever you have finished to render a single frame.\n\t\t\t * ```js\n\t\t\t * renderer.info.reset();\n\t\t\t * ```\n\t\t\t *\n\t\t\t * @name WebGLRenderer#info\n\t\t\t * @type {WebGLRenderer~Info}\n\t\t\t */\n\t\t\t_this.info = info;\n\n\t\t}\n\n\t\tinitGLContext();\n\n\t\t// xr\n\n\t\tconst xr = new WebXRManager( _this, _gl );\n\n\t\t/**\n\t\t * A reference to the XR manager.\n\t\t *\n\t\t * @type {WebXRManager}\n\t\t */\n\t\tthis.xr = xr;\n\n\t\t/**\n\t\t * Returns the rendering context.\n\t\t *\n\t\t * @return {WebGL2RenderingContext} The rendering context.\n\t\t */\n\t\tthis.getContext = function () {\n\n\t\t\treturn _gl;\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the rendering context attributes.\n\t\t *\n\t\t * @return {WebGLContextAttributes} The rendering context attributes.\n\t\t */\n\t\tthis.getContextAttributes = function () {\n\n\t\t\treturn _gl.getContextAttributes();\n\n\t\t};\n\n\t\t/**\n\t\t * Simulates a loss of the WebGL context. This requires support for the `WEBGL_lose_context` extension.\n\t\t */\n\t\tthis.forceContextLoss = function () {\n\n\t\t\tconst extension = extensions.get( 'WEBGL_lose_context' );\n\t\t\tif ( extension ) extension.loseContext();\n\n\t\t};\n\n\t\t/**\n\t\t * Simulates a restore of the WebGL context. This requires support for the `WEBGL_lose_context` extension.\n\t\t */\n\t\tthis.forceContextRestore = function () {\n\n\t\t\tconst extension = extensions.get( 'WEBGL_lose_context' );\n\t\t\tif ( extension ) extension.restoreContext();\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the pixel ratio.\n\t\t *\n\t\t * @return {number} The pixel ratio.\n\t\t */\n\t\tthis.getPixelRatio = function () {\n\n\t\t\treturn _pixelRatio;\n\n\t\t};\n\n\t\t/**\n\t\t * Sets the given pixel ratio and resizes the canvas if necessary.\n\t\t *\n\t\t * @param {number} value - The pixel ratio.\n\t\t */\n\t\tthis.setPixelRatio = function ( value ) {\n\n\t\t\tif ( value === undefined ) return;\n\n\t\t\t_pixelRatio = value;\n\n\t\t\tthis.setSize( _width, _height, false );\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the renderer's size in logical pixels. This method does not honor the pixel ratio.\n\t\t *\n\t\t * @param {Vector2} target - The method writes the result in this target object.\n\t\t * @return {Vector2} The renderer's size in logical pixels.\n\t\t */\n\t\tthis.getSize = function ( target ) {\n\n\t\t\treturn target.set( _width, _height );\n\n\t\t};\n\n\t\t/**\n\t\t * Resizes the output canvas to (width, height) with device pixel ratio taken\n\t\t * into account, and also sets the viewport to fit that size, starting in (0,\n\t\t * 0). Setting `updateStyle` to false prevents any style changes to the output canvas.\n\t\t *\n\t\t * @param {number} width - The width in logical pixels.\n\t\t * @param {number} height - The height in logical pixels.\n\t\t * @param {boolean} [updateStyle=true] - Whether to update the `style` attribute of the canvas or not.\n\t\t */\n\t\tthis.setSize = function ( width, height, updateStyle = true ) {\n\n\t\t\tif ( xr.isPresenting ) {\n\n\t\t\t\twarn( 'WebGLRenderer: Can\\'t change size while VR device is presenting.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\t_width = width;\n\t\t\t_height = height;\n\n\t\t\tcanvas.width = Math.floor( width * _pixelRatio );\n\t\t\tcanvas.height = Math.floor( height * _pixelRatio );\n\n\t\t\tif ( updateStyle === true ) {\n\n\t\t\t\tcanvas.style.width = width + 'px';\n\t\t\t\tcanvas.style.height = height + 'px';\n\n\t\t\t}\n\n\t\t\tthis.setViewport( 0, 0, width, height );\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the drawing buffer size in physical pixels. This method honors the pixel ratio.\n\t\t *\n\t\t * @param {Vector2} target - The method writes the result in this target object.\n\t\t * @return {Vector2} The drawing buffer size.\n\t\t */\n\t\tthis.getDrawingBufferSize = function ( target ) {\n\n\t\t\treturn target.set( _width * _pixelRatio, _height * _pixelRatio ).floor();\n\n\t\t};\n\n\t\t/**\n\t\t * This method allows to define the drawing buffer size by specifying\n\t\t * width, height and pixel ratio all at once. The size of the drawing\n\t\t * buffer is computed with this formula:\n\t\t * ```js\n\t\t * size.x = width * pixelRatio;\n\t\t * size.y = height * pixelRatio;\n\t\t * ```\n\t\t *\n\t\t * @param {number} width - The width in logical pixels.\n\t\t * @param {number} height - The height in logical pixels.\n\t\t * @param {number} pixelRatio - The pixel ratio.\n\t\t */\n\t\tthis.setDrawingBufferSize = function ( width, height, pixelRatio ) {\n\n\t\t\t_width = width;\n\t\t\t_height = height;\n\n\t\t\t_pixelRatio = pixelRatio;\n\n\t\t\tcanvas.width = Math.floor( width * pixelRatio );\n\t\t\tcanvas.height = Math.floor( height * pixelRatio );\n\n\t\t\tthis.setViewport( 0, 0, width, height );\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the current viewport definition.\n\t\t *\n\t\t * @param {Vector2} target - The method writes the result in this target object.\n\t\t * @return {Vector2} The current viewport definition.\n\t\t */\n\t\tthis.getCurrentViewport = function ( target ) {\n\n\t\t\treturn target.copy( _currentViewport );\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the viewport definition.\n\t\t *\n\t\t * @param {Vector4} target - The method writes the result in this target object.\n\t\t * @return {Vector4} The viewport definition.\n\t\t */\n\t\tthis.getViewport = function ( target ) {\n\n\t\t\treturn target.copy( _viewport );\n\n\t\t};\n\n\t\t/**\n\t\t * Sets the viewport to render from `(x, y)` to `(x + width, y + height)`.\n\t\t *\n\t\t * @param {number | Vector4} x - The horizontal coordinate for the lower left corner of the viewport origin in logical pixel unit.\n\t\t * Or alternatively a four-component vector specifying all the parameters of the viewport.\n\t\t * @param {number} y - The vertical coordinate for the lower left corner of the viewport origin  in logical pixel unit.\n\t\t * @param {number} width - The width of the viewport in logical pixel unit.\n\t\t * @param {number} height - The height of the viewport in logical pixel unit.\n\t\t */\n\t\tthis.setViewport = function ( x, y, width, height ) {\n\n\t\t\tif ( x.isVector4 ) {\n\n\t\t\t\t_viewport.set( x.x, x.y, x.z, x.w );\n\n\t\t\t} else {\n\n\t\t\t\t_viewport.set( x, y, width, height );\n\n\t\t\t}\n\n\t\t\tstate.viewport( _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ).round() );\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the scissor region.\n\t\t *\n\t\t * @param {Vector4} target - The method writes the result in this target object.\n\t\t * @return {Vector4} The scissor region.\n\t\t */\n\t\tthis.getScissor = function ( target ) {\n\n\t\t\treturn target.copy( _scissor );\n\n\t\t};\n\n\t\t/**\n\t\t * Sets the scissor region to render from `(x, y)` to `(x + width, y + height)`.\n\t\t *\n\t\t * @param {number | Vector4} x - The horizontal coordinate for the lower left corner of the scissor region origin in logical pixel unit.\n\t\t * Or alternatively a four-component vector specifying all the parameters of the scissor region.\n\t\t * @param {number} y - The vertical coordinate for the lower left corner of the scissor region origin  in logical pixel unit.\n\t\t * @param {number} width - The width of the scissor region in logical pixel unit.\n\t\t * @param {number} height - The height of the scissor region in logical pixel unit.\n\t\t */\n\t\tthis.setScissor = function ( x, y, width, height ) {\n\n\t\t\tif ( x.isVector4 ) {\n\n\t\t\t\t_scissor.set( x.x, x.y, x.z, x.w );\n\n\t\t\t} else {\n\n\t\t\t\t_scissor.set( x, y, width, height );\n\n\t\t\t}\n\n\t\t\tstate.scissor( _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ).round() );\n\n\t\t};\n\n\t\t/**\n\t\t * Returns `true` if the scissor test is enabled.\n\t\t *\n\t\t * @return {boolean} Whether the scissor test is enabled or not.\n\t\t */\n\t\tthis.getScissorTest = function () {\n\n\t\t\treturn _scissorTest;\n\n\t\t};\n\n\t\t/**\n\t\t * Enable or disable the scissor test. When this is enabled, only the pixels\n\t\t * within the defined scissor area will be affected by further renderer\n\t\t * actions.\n\t\t *\n\t\t * @param {boolean} boolean - Whether the scissor test is enabled or not.\n\t\t */\n\t\tthis.setScissorTest = function ( boolean ) {\n\n\t\t\tstate.setScissorTest( _scissorTest = boolean );\n\n\t\t};\n\n\t\t/**\n\t\t * Sets a custom opaque sort function for the render lists. Pass `null`\n\t\t * to use the default `painterSortStable` function.\n\t\t *\n\t\t * @param {?Function} method - The opaque sort function.\n\t\t */\n\t\tthis.setOpaqueSort = function ( method ) {\n\n\t\t\t_opaqueSort = method;\n\n\t\t};\n\n\t\t/**\n\t\t * Sets a custom transparent sort function for the render lists. Pass `null`\n\t\t * to use the default `reversePainterSortStable` function.\n\t\t *\n\t\t * @param {?Function} method - The opaque sort function.\n\t\t */\n\t\tthis.setTransparentSort = function ( method ) {\n\n\t\t\t_transparentSort = method;\n\n\t\t};\n\n\t\t// Clearing\n\n\t\t/**\n\t\t * Returns the clear color.\n\t\t *\n\t\t * @param {Color} target - The method writes the result in this target object.\n\t\t * @return {Color} The clear color.\n\t\t */\n\t\tthis.getClearColor = function ( target ) {\n\n\t\t\treturn target.copy( background.getClearColor() );\n\n\t\t};\n\n\t\t/**\n\t\t * Sets the clear color and alpha.\n\t\t *\n\t\t * @param {Color} color - The clear color.\n\t\t * @param {number} [alpha=1] - The clear alpha.\n\t\t */\n\t\tthis.setClearColor = function () {\n\n\t\t\tbackground.setClearColor( ...arguments );\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the clear alpha. Ranges within `[0,1]`.\n\t\t *\n\t\t * @return {number} The clear alpha.\n\t\t */\n\t\tthis.getClearAlpha = function () {\n\n\t\t\treturn background.getClearAlpha();\n\n\t\t};\n\n\t\t/**\n\t\t * Sets the clear alpha.\n\t\t *\n\t\t * @param {number} alpha - The clear alpha.\n\t\t */\n\t\tthis.setClearAlpha = function () {\n\n\t\t\tbackground.setClearAlpha( ...arguments );\n\n\t\t};\n\n\t\t/**\n\t\t * Tells the renderer to clear its color, depth or stencil drawing buffer(s).\n\t\t * This method initializes the buffers to the current clear color values.\n\t\t *\n\t\t * @param {boolean} [color=true] - Whether the color buffer should be cleared or not.\n\t\t * @param {boolean} [depth=true] - Whether the depth buffer should be cleared or not.\n\t\t * @param {boolean} [stencil=true] - Whether the stencil buffer should be cleared or not.\n\t\t */\n\t\tthis.clear = function ( color = true, depth = true, stencil = true ) {\n\n\t\t\tlet bits = 0;\n\n\t\t\tif ( color ) {\n\n\t\t\t\t// check if we're trying to clear an integer target\n\t\t\t\tlet isIntegerFormat = false;\n\t\t\t\tif ( _currentRenderTarget !== null ) {\n\n\t\t\t\t\tconst targetFormat = _currentRenderTarget.texture.format;\n\t\t\t\t\tisIntegerFormat = INTEGER_FORMATS.has( targetFormat );\n\n\t\t\t\t}\n\n\t\t\t\t// use the appropriate clear functions to clear the target if it's a signed\n\t\t\t\t// or unsigned integer target\n\t\t\t\tif ( isIntegerFormat ) {\n\n\t\t\t\t\tconst targetType = _currentRenderTarget.texture.type;\n\t\t\t\t\tconst isUnsignedType = UNSIGNED_TYPES.has( targetType );\n\n\t\t\t\t\tconst clearColor = background.getClearColor();\n\t\t\t\t\tconst a = background.getClearAlpha();\n\t\t\t\t\tconst r = clearColor.r;\n\t\t\t\t\tconst g = clearColor.g;\n\t\t\t\t\tconst b = clearColor.b;\n\n\t\t\t\t\tif ( isUnsignedType ) {\n\n\t\t\t\t\t\tuintClearColor[ 0 ] = r;\n\t\t\t\t\t\tuintClearColor[ 1 ] = g;\n\t\t\t\t\t\tuintClearColor[ 2 ] = b;\n\t\t\t\t\t\tuintClearColor[ 3 ] = a;\n\t\t\t\t\t\t_gl.clearBufferuiv( _gl.COLOR, 0, uintClearColor );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tintClearColor[ 0 ] = r;\n\t\t\t\t\t\tintClearColor[ 1 ] = g;\n\t\t\t\t\t\tintClearColor[ 2 ] = b;\n\t\t\t\t\t\tintClearColor[ 3 ] = a;\n\t\t\t\t\t\t_gl.clearBufferiv( _gl.COLOR, 0, intClearColor );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbits |= _gl.COLOR_BUFFER_BIT;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( depth ) {\n\n\t\t\t\tbits |= _gl.DEPTH_BUFFER_BIT;\n\n\t\t\t}\n\n\t\t\tif ( stencil ) {\n\n\t\t\t\tbits |= _gl.STENCIL_BUFFER_BIT;\n\t\t\t\tthis.state.buffers.stencil.setMask( 0xffffffff );\n\n\t\t\t}\n\n\t\t\t_gl.clear( bits );\n\n\t\t};\n\n\t\t/**\n\t\t * Clears the color buffer. Equivalent to calling `renderer.clear( true, false, false )`.\n\t\t */\n\t\tthis.clearColor = function () {\n\n\t\t\tthis.clear( true, false, false );\n\n\t\t};\n\n\t\t/**\n\t\t * Clears the depth buffer. Equivalent to calling `renderer.clear( false, true, false )`.\n\t\t */\n\t\tthis.clearDepth = function () {\n\n\t\t\tthis.clear( false, true, false );\n\n\t\t};\n\n\t\t/**\n\t\t * Clears the stencil buffer. Equivalent to calling `renderer.clear( false, false, true )`.\n\t\t */\n\t\tthis.clearStencil = function () {\n\n\t\t\tthis.clear( false, false, true );\n\n\t\t};\n\n\t\t/**\n\t\t * Frees the GPU-related resources allocated by this instance. Call this\n\t\t * method whenever this instance is no longer used in your app.\n\t\t */\n\t\tthis.dispose = function () {\n\n\t\t\tcanvas.removeEventListener( 'webglcontextlost', onContextLost, false );\n\t\t\tcanvas.removeEventListener( 'webglcontextrestored', onContextRestore, false );\n\t\t\tcanvas.removeEventListener( 'webglcontextcreationerror', onContextCreationError, false );\n\n\t\t\tbackground.dispose();\n\t\t\trenderLists.dispose();\n\t\t\trenderStates.dispose();\n\t\t\tproperties.dispose();\n\t\t\tcubemaps.dispose();\n\t\t\tcubeuvmaps.dispose();\n\t\t\tobjects.dispose();\n\t\t\tbindingStates.dispose();\n\t\t\tuniformsGroups.dispose();\n\t\t\tprogramCache.dispose();\n\n\t\t\txr.dispose();\n\n\t\t\txr.removeEventListener( 'sessionstart', onXRSessionStart );\n\t\t\txr.removeEventListener( 'sessionend', onXRSessionEnd );\n\n\t\t\tanimation.stop();\n\n\t\t};\n\n\t\t// Events\n\n\t\tfunction onContextLost( event ) {\n\n\t\t\tevent.preventDefault();\n\n\t\t\tlog( 'WebGLRenderer: Context Lost.' );\n\n\t\t\t_isContextLost = true;\n\n\t\t}\n\n\t\tfunction onContextRestore( /* event */ ) {\n\n\t\t\tlog( 'WebGLRenderer: Context Restored.' );\n\n\t\t\t_isContextLost = false;\n\n\t\t\tconst infoAutoReset = info.autoReset;\n\t\t\tconst shadowMapEnabled = shadowMap.enabled;\n\t\t\tconst shadowMapAutoUpdate = shadowMap.autoUpdate;\n\t\t\tconst shadowMapNeedsUpdate = shadowMap.needsUpdate;\n\t\t\tconst shadowMapType = shadowMap.type;\n\n\t\t\tinitGLContext();\n\n\t\t\tinfo.autoReset = infoAutoReset;\n\t\t\tshadowMap.enabled = shadowMapEnabled;\n\t\t\tshadowMap.autoUpdate = shadowMapAutoUpdate;\n\t\t\tshadowMap.needsUpdate = shadowMapNeedsUpdate;\n\t\t\tshadowMap.type = shadowMapType;\n\n\t\t}\n\n\t\tfunction onContextCreationError( event ) {\n\n\t\t\terror( 'WebGLRenderer: A WebGL context could not be created. Reason: ', event.statusMessage );\n\n\t\t}\n\n\t\tfunction onMaterialDispose( event ) {\n\n\t\t\tconst material = event.target;\n\n\t\t\tmaterial.removeEventListener( 'dispose', onMaterialDispose );\n\n\t\t\tdeallocateMaterial( material );\n\n\t\t}\n\n\t\t// Buffer deallocation\n\n\t\tfunction deallocateMaterial( material ) {\n\n\t\t\treleaseMaterialProgramReferences( material );\n\n\t\t\tproperties.remove( material );\n\n\t\t}\n\n\n\t\tfunction releaseMaterialProgramReferences( material ) {\n\n\t\t\tconst programs = properties.get( material ).programs;\n\n\t\t\tif ( programs !== undefined ) {\n\n\t\t\t\tprograms.forEach( function ( program ) {\n\n\t\t\t\t\tprogramCache.releaseProgram( program );\n\n\t\t\t\t} );\n\n\t\t\t\tif ( material.isShaderMaterial ) {\n\n\t\t\t\t\tprogramCache.releaseShaderCache( material );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Buffer rendering\n\n\t\tthis.renderBufferDirect = function ( camera, scene, geometry, material, object, group ) {\n\n\t\t\tif ( scene === null ) scene = _emptyScene; // renderBufferDirect second parameter used to be fog (could be null)\n\n\t\t\tconst frontFaceCW = ( object.isMesh && object.matrixWorld.determinant() < 0 );\n\n\t\t\tconst program = setProgram( camera, scene, geometry, material, object );\n\n\t\t\tstate.setMaterial( material, frontFaceCW );\n\n\t\t\t//\n\n\t\t\tlet index = geometry.index;\n\t\t\tlet rangeFactor = 1;\n\n\t\t\tif ( material.wireframe === true ) {\n\n\t\t\t\tindex = geometries.getWireframeAttribute( geometry );\n\n\t\t\t\tif ( index === undefined ) return;\n\n\t\t\t\trangeFactor = 2;\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tconst drawRange = geometry.drawRange;\n\t\t\tconst position = geometry.attributes.position;\n\n\t\t\tlet drawStart = drawRange.start * rangeFactor;\n\t\t\tlet drawEnd = ( drawRange.start + drawRange.count ) * rangeFactor;\n\n\t\t\tif ( group !== null ) {\n\n\t\t\t\tdrawStart = Math.max( drawStart, group.start * rangeFactor );\n\t\t\t\tdrawEnd = Math.min( drawEnd, ( group.start + group.count ) * rangeFactor );\n\n\t\t\t}\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tdrawStart = Math.max( drawStart, 0 );\n\t\t\t\tdrawEnd = Math.min( drawEnd, index.count );\n\n\t\t\t} else if ( position !== undefined && position !== null ) {\n\n\t\t\t\tdrawStart = Math.max( drawStart, 0 );\n\t\t\t\tdrawEnd = Math.min( drawEnd, position.count );\n\n\t\t\t}\n\n\t\t\tconst drawCount = drawEnd - drawStart;\n\n\t\t\tif ( drawCount < 0 || drawCount === Infinity ) return;\n\n\t\t\t//\n\n\t\t\tbindingStates.setup( object, material, program, geometry, index );\n\n\t\t\tlet attribute;\n\t\t\tlet renderer = bufferRenderer;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tattribute = attributes.get( index );\n\n\t\t\t\trenderer = indexedBufferRenderer;\n\t\t\t\trenderer.setIndex( attribute );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( object.isMesh ) {\n\n\t\t\t\tif ( material.wireframe === true ) {\n\n\t\t\t\t\tstate.setLineWidth( material.wireframeLinewidth * getTargetPixelRatio() );\n\t\t\t\t\trenderer.setMode( _gl.LINES );\n\n\t\t\t\t} else {\n\n\t\t\t\t\trenderer.setMode( _gl.TRIANGLES );\n\n\t\t\t\t}\n\n\t\t\t} else if ( object.isLine ) {\n\n\t\t\t\tlet lineWidth = material.linewidth;\n\n\t\t\t\tif ( lineWidth === undefined ) lineWidth = 1; // Not using Line*Material\n\n\t\t\t\tstate.setLineWidth( lineWidth * getTargetPixelRatio() );\n\n\t\t\t\tif ( object.isLineSegments ) {\n\n\t\t\t\t\trenderer.setMode( _gl.LINES );\n\n\t\t\t\t} else if ( object.isLineLoop ) {\n\n\t\t\t\t\trenderer.setMode( _gl.LINE_LOOP );\n\n\t\t\t\t} else {\n\n\t\t\t\t\trenderer.setMode( _gl.LINE_STRIP );\n\n\t\t\t\t}\n\n\t\t\t} else if ( object.isPoints ) {\n\n\t\t\t\trenderer.setMode( _gl.POINTS );\n\n\t\t\t} else if ( object.isSprite ) {\n\n\t\t\t\trenderer.setMode( _gl.TRIANGLES );\n\n\t\t\t}\n\n\t\t\tif ( object.isBatchedMesh ) {\n\n\t\t\t\tif ( object._multiDrawInstances !== null ) {\n\n\t\t\t\t\t// @deprecated, r174\n\t\t\t\t\twarnOnce( 'WebGLRenderer: renderMultiDrawInstances has been deprecated and will be removed in r184. Append to renderMultiDraw arguments and use indirection.' );\n\t\t\t\t\trenderer.renderMultiDrawInstances( object._multiDrawStarts, object._multiDrawCounts, object._multiDrawCount, object._multiDrawInstances );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( ! extensions.get( 'WEBGL_multi_draw' ) ) {\n\n\t\t\t\t\t\tconst starts = object._multiDrawStarts;\n\t\t\t\t\t\tconst counts = object._multiDrawCounts;\n\t\t\t\t\t\tconst drawCount = object._multiDrawCount;\n\t\t\t\t\t\tconst bytesPerElement = index ? attributes.get( index ).bytesPerElement : 1;\n\t\t\t\t\t\tconst uniforms = properties.get( material ).currentProgram.getUniforms();\n\t\t\t\t\t\tfor ( let i = 0; i < drawCount; i ++ ) {\n\n\t\t\t\t\t\t\tuniforms.setValue( _gl, '_gl_DrawID', i );\n\t\t\t\t\t\t\trenderer.render( starts[ i ] / bytesPerElement, counts[ i ] );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\trenderer.renderMultiDraw( object._multiDrawStarts, object._multiDrawCounts, object._multiDrawCount );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( object.isInstancedMesh ) {\n\n\t\t\t\trenderer.renderInstances( drawStart, drawCount, object.count );\n\n\t\t\t} else if ( geometry.isInstancedBufferGeometry ) {\n\n\t\t\t\tconst maxInstanceCount = geometry._maxInstanceCount !== undefined ? geometry._maxInstanceCount : Infinity;\n\t\t\t\tconst instanceCount = Math.min( geometry.instanceCount, maxInstanceCount );\n\n\t\t\t\trenderer.renderInstances( drawStart, drawCount, instanceCount );\n\n\t\t\t} else {\n\n\t\t\t\trenderer.render( drawStart, drawCount );\n\n\t\t\t}\n\n\t\t};\n\n\t\t// Compile\n\n\t\tfunction prepareMaterial( material, scene, object ) {\n\n\t\t\tif ( material.transparent === true && material.side === DoubleSide && material.forceSinglePass === false ) {\n\n\t\t\t\tmaterial.side = BackSide;\n\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t\tgetProgram( material, scene, object );\n\n\t\t\t\tmaterial.side = FrontSide;\n\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t\tgetProgram( material, scene, object );\n\n\t\t\t\tmaterial.side = DoubleSide;\n\n\t\t\t} else {\n\n\t\t\t\tgetProgram( material, scene, object );\n\n\t\t\t}\n\n\t\t}\n\n\t\t/**\n\t\t * Compiles all materials in the scene with the camera. This is useful to precompile shaders\n\t\t * before the first rendering. If you want to add a 3D object to an existing scene, use the third\n\t\t * optional parameter for applying the target scene.\n\t\t *\n\t\t * Note that the (target) scene's lighting and environment must be configured before calling this method.\n\t\t *\n\t\t * @param {Object3D} scene - The scene or another type of 3D object to precompile.\n\t\t * @param {Camera} camera - The camera.\n\t\t * @param {?Scene} [targetScene=null] - The target scene.\n\t\t * @return {Set<Material>} The precompiled materials.\n\t\t */\n\t\tthis.compile = function ( scene, camera, targetScene = null ) {\n\n\t\t\tif ( targetScene === null ) targetScene = scene;\n\n\t\t\tcurrentRenderState = renderStates.get( targetScene );\n\t\t\tcurrentRenderState.init( camera );\n\n\t\t\trenderStateStack.push( currentRenderState );\n\n\t\t\t// gather lights from both the target scene and the new object that will be added to the scene.\n\n\t\t\ttargetScene.traverseVisible( function ( object ) {\n\n\t\t\t\tif ( object.isLight && object.layers.test( camera.layers ) ) {\n\n\t\t\t\t\tcurrentRenderState.pushLight( object );\n\n\t\t\t\t\tif ( object.castShadow ) {\n\n\t\t\t\t\t\tcurrentRenderState.pushShadow( object );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t\tif ( scene !== targetScene ) {\n\n\t\t\t\tscene.traverseVisible( function ( object ) {\n\n\t\t\t\t\tif ( object.isLight && object.layers.test( camera.layers ) ) {\n\n\t\t\t\t\t\tcurrentRenderState.pushLight( object );\n\n\t\t\t\t\t\tif ( object.castShadow ) {\n\n\t\t\t\t\t\t\tcurrentRenderState.pushShadow( object );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tcurrentRenderState.setupLights();\n\n\t\t\t// Only initialize materials in the new scene, not the targetScene.\n\n\t\t\tconst materials = new Set();\n\n\t\t\tscene.traverse( function ( object ) {\n\n\t\t\t\tif ( ! ( object.isMesh || object.isPoints || object.isLine || object.isSprite ) ) {\n\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tconst material = object.material;\n\n\t\t\t\tif ( material ) {\n\n\t\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\t\tfor ( let i = 0; i < material.length; i ++ ) {\n\n\t\t\t\t\t\t\tconst material2 = material[ i ];\n\n\t\t\t\t\t\t\tprepareMaterial( material2, targetScene, object );\n\t\t\t\t\t\t\tmaterials.add( material2 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tprepareMaterial( material, targetScene, object );\n\t\t\t\t\t\tmaterials.add( material );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t\tcurrentRenderState = renderStateStack.pop();\n\n\t\t\treturn materials;\n\n\t\t};\n\n\t\t// compileAsync\n\n\t\t/**\n\t\t * Asynchronous version of {@link WebGLRenderer#compile}.\n\t\t *\n\t\t * This method makes use of the `KHR_parallel_shader_compile` WebGL extension. Hence,\n\t\t * it is recommended to use this version of `compile()` whenever possible.\n\t\t *\n\t\t * @async\n\t\t * @param {Object3D} scene - The scene or another type of 3D object to precompile.\n\t\t * @param {Camera} camera - The camera.\n\t\t * @param {?Scene} [targetScene=null] - The target scene.\n\t\t * @return {Promise} A Promise that resolves when the given scene can be rendered without unnecessary stalling due to shader compilation.\n\t\t */\n\t\tthis.compileAsync = function ( scene, camera, targetScene = null ) {\n\n\t\t\tconst materials = this.compile( scene, camera, targetScene );\n\n\t\t\t// Wait for all the materials in the new object to indicate that they're\n\t\t\t// ready to be used before resolving the promise.\n\n\t\t\treturn new Promise( ( resolve ) => {\n\n\t\t\t\tfunction checkMaterialsReady() {\n\n\t\t\t\t\tmaterials.forEach( function ( material ) {\n\n\t\t\t\t\t\tconst materialProperties = properties.get( material );\n\t\t\t\t\t\tconst program = materialProperties.currentProgram;\n\n\t\t\t\t\t\tif ( program.isReady() ) {\n\n\t\t\t\t\t\t\t// remove any programs that report they're ready to use from the list\n\t\t\t\t\t\t\tmaterials.delete( material );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} );\n\n\t\t\t\t\t// once the list of compiling materials is empty, call the callback\n\n\t\t\t\t\tif ( materials.size === 0 ) {\n\n\t\t\t\t\t\tresolve( scene );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// if some materials are still not ready, wait a bit and check again\n\n\t\t\t\t\tsetTimeout( checkMaterialsReady, 10 );\n\n\t\t\t\t}\n\n\t\t\t\tif ( extensions.get( 'KHR_parallel_shader_compile' ) !== null ) {\n\n\t\t\t\t\t// If we can check the compilation status of the materials without\n\t\t\t\t\t// blocking then do so right away.\n\n\t\t\t\t\tcheckMaterialsReady();\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Otherwise start by waiting a bit to give the materials we just\n\t\t\t\t\t// initialized a chance to finish.\n\n\t\t\t\t\tsetTimeout( checkMaterialsReady, 10 );\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t};\n\n\t\t// Animation Loop\n\n\t\tlet onAnimationFrameCallback = null;\n\n\t\tfunction onAnimationFrame( time ) {\n\n\t\t\tif ( onAnimationFrameCallback ) onAnimationFrameCallback( time );\n\n\t\t}\n\n\t\tfunction onXRSessionStart() {\n\n\t\t\tanimation.stop();\n\n\t\t}\n\n\t\tfunction onXRSessionEnd() {\n\n\t\t\tanimation.start();\n\n\t\t}\n\n\t\tconst animation = new WebGLAnimation();\n\t\tanimation.setAnimationLoop( onAnimationFrame );\n\n\t\tif ( typeof self !== 'undefined' ) animation.setContext( self );\n\n\t\t/**\n\t\t * Applications are advised to always define the animation loop\n\t\t * with this method and not manually with `requestAnimationFrame()`\n\t\t * for best compatibility.\n\t\t *\n\t\t * @param {?onAnimationCallback} callback - The application's animation loop.\n\t\t */\n\t\tthis.setAnimationLoop = function ( callback ) {\n\n\t\t\tonAnimationFrameCallback = callback;\n\t\t\txr.setAnimationLoop( callback );\n\n\t\t\t( callback === null ) ? animation.stop() : animation.start();\n\n\t\t};\n\n\t\txr.addEventListener( 'sessionstart', onXRSessionStart );\n\t\txr.addEventListener( 'sessionend', onXRSessionEnd );\n\n\t\t// Rendering\n\n\t\t/**\n\t\t * Renders the given scene (or other type of 3D object) using the given camera.\n\t\t *\n\t\t * The render is done to a previously specified render target set by calling {@link WebGLRenderer#setRenderTarget}\n\t\t * or to the canvas as usual.\n\t\t *\n\t\t * By default render buffers are cleared before rendering but you can prevent\n\t\t * this by setting the property `autoClear` to `false`. If you want to prevent\n\t\t * only certain buffers being cleared you can `autoClearColor`, `autoClearDepth`\n\t\t * or `autoClearStencil` to `false`. To force a clear, use {@link WebGLRenderer#clear}.\n\t\t *\n\t\t * @param {Object3D} scene - The scene to render.\n\t\t * @param {Camera} camera - The camera.\n\t\t */\n\t\tthis.render = function ( scene, camera ) {\n\n\t\t\tif ( camera !== undefined && camera.isCamera !== true ) {\n\n\t\t\t\terror( 'WebGLRenderer.render: camera is not an instance of THREE.Camera.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( _isContextLost === true ) return;\n\n\t\t\t// update scene graph\n\n\t\t\tif ( scene.matrixWorldAutoUpdate === true ) scene.updateMatrixWorld();\n\n\t\t\t// update camera matrices and frustum\n\n\t\t\tif ( camera.parent === null && camera.matrixWorldAutoUpdate === true ) camera.updateMatrixWorld();\n\n\t\t\tif ( xr.enabled === true && xr.isPresenting === true ) {\n\n\t\t\t\tif ( xr.cameraAutoUpdate === true ) xr.updateCamera( camera );\n\n\t\t\t\tcamera = xr.getCamera(); // use XR camera for rendering\n\n\t\t\t}\n\n\t\t\t//\n\t\t\tif ( scene.isScene === true ) scene.onBeforeRender( _this, scene, camera, _currentRenderTarget );\n\n\t\t\tcurrentRenderState = renderStates.get( scene, renderStateStack.length );\n\t\t\tcurrentRenderState.init( camera );\n\n\t\t\trenderStateStack.push( currentRenderState );\n\n\t\t\t_projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );\n\t\t\t_frustum.setFromProjectionMatrix( _projScreenMatrix, WebGLCoordinateSystem, camera.reversedDepth );\n\n\t\t\t_localClippingEnabled = this.localClippingEnabled;\n\t\t\t_clippingEnabled = clipping.init( this.clippingPlanes, _localClippingEnabled );\n\n\t\t\tcurrentRenderList = renderLists.get( scene, renderListStack.length );\n\t\t\tcurrentRenderList.init();\n\n\t\t\trenderListStack.push( currentRenderList );\n\n\t\t\tif ( xr.enabled === true && xr.isPresenting === true ) {\n\n\t\t\t\tconst depthSensingMesh = _this.xr.getDepthSensingMesh();\n\n\t\t\t\tif ( depthSensingMesh !== null ) {\n\n\t\t\t\t\tprojectObject( depthSensingMesh, camera, - Infinity, _this.sortObjects );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tprojectObject( scene, camera, 0, _this.sortObjects );\n\n\t\t\tcurrentRenderList.finish();\n\n\t\t\tif ( _this.sortObjects === true ) {\n\n\t\t\t\tcurrentRenderList.sort( _opaqueSort, _transparentSort );\n\n\t\t\t}\n\n\t\t\t_renderBackground = xr.enabled === false || xr.isPresenting === false || xr.hasDepthSensing() === false;\n\t\t\tif ( _renderBackground ) {\n\n\t\t\t\tbackground.addToRenderList( currentRenderList, scene );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tthis.info.render.frame ++;\n\n\t\t\tif ( _clippingEnabled === true ) clipping.beginShadows();\n\n\t\t\tconst shadowsArray = currentRenderState.state.shadowsArray;\n\n\t\t\tshadowMap.render( shadowsArray, scene, camera );\n\n\t\t\tif ( _clippingEnabled === true ) clipping.endShadows();\n\n\t\t\t//\n\n\t\t\tif ( this.info.autoReset === true ) this.info.reset();\n\n\t\t\t// render scene\n\n\t\t\tconst opaqueObjects = currentRenderList.opaque;\n\t\t\tconst transmissiveObjects = currentRenderList.transmissive;\n\n\t\t\tcurrentRenderState.setupLights();\n\n\t\t\tif ( camera.isArrayCamera ) {\n\n\t\t\t\tconst cameras = camera.cameras;\n\n\t\t\t\tif ( transmissiveObjects.length > 0 ) {\n\n\t\t\t\t\tfor ( let i = 0, l = cameras.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tconst camera2 = cameras[ i ];\n\n\t\t\t\t\t\trenderTransmissionPass( opaqueObjects, transmissiveObjects, scene, camera2 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( _renderBackground ) background.render( scene );\n\n\t\t\t\tfor ( let i = 0, l = cameras.length; i < l; i ++ ) {\n\n\t\t\t\t\tconst camera2 = cameras[ i ];\n\n\t\t\t\t\trenderScene( currentRenderList, scene, camera2, camera2.viewport );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( transmissiveObjects.length > 0 ) renderTransmissionPass( opaqueObjects, transmissiveObjects, scene, camera );\n\n\t\t\t\tif ( _renderBackground ) background.render( scene );\n\n\t\t\t\trenderScene( currentRenderList, scene, camera );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( _currentRenderTarget !== null && _currentActiveMipmapLevel === 0 ) {\n\n\t\t\t\t// resolve multisample renderbuffers to a single-sample texture if necessary\n\n\t\t\t\ttextures.updateMultisampleRenderTarget( _currentRenderTarget );\n\n\t\t\t\t// Generate mipmap if we're using any kind of mipmap filtering\n\n\t\t\t\ttextures.updateRenderTargetMipmap( _currentRenderTarget );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( scene.isScene === true ) scene.onAfterRender( _this, scene, camera );\n\n\t\t\t// _gl.finish();\n\n\t\t\tbindingStates.resetDefaultState();\n\t\t\t_currentMaterialId = -1;\n\t\t\t_currentCamera = null;\n\n\t\t\trenderStateStack.pop();\n\n\t\t\tif ( renderStateStack.length > 0 ) {\n\n\t\t\t\tcurrentRenderState = renderStateStack[ renderStateStack.length - 1 ];\n\n\t\t\t\tif ( _clippingEnabled === true ) clipping.setGlobalState( _this.clippingPlanes, currentRenderState.state.camera );\n\n\t\t\t} else {\n\n\t\t\t\tcurrentRenderState = null;\n\n\t\t\t}\n\n\t\t\trenderListStack.pop();\n\n\t\t\tif ( renderListStack.length > 0 ) {\n\n\t\t\t\tcurrentRenderList = renderListStack[ renderListStack.length - 1 ];\n\n\t\t\t} else {\n\n\t\t\t\tcurrentRenderList = null;\n\n\t\t\t}\n\n\t\t};\n\n\t\tfunction projectObject( object, camera, groupOrder, sortObjects ) {\n\n\t\t\tif ( object.visible === false ) return;\n\n\t\t\tconst visible = object.layers.test( camera.layers );\n\n\t\t\tif ( visible ) {\n\n\t\t\t\tif ( object.isGroup ) {\n\n\t\t\t\t\tgroupOrder = object.renderOrder;\n\n\t\t\t\t} else if ( object.isLOD ) {\n\n\t\t\t\t\tif ( object.autoUpdate === true ) object.update( camera );\n\n\t\t\t\t} else if ( object.isLight ) {\n\n\t\t\t\t\tcurrentRenderState.pushLight( object );\n\n\t\t\t\t\tif ( object.castShadow ) {\n\n\t\t\t\t\t\tcurrentRenderState.pushShadow( object );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( object.isSprite ) {\n\n\t\t\t\t\tif ( ! object.frustumCulled || _frustum.intersectsSprite( object ) ) {\n\n\t\t\t\t\t\tif ( sortObjects ) {\n\n\t\t\t\t\t\t\t_vector4.setFromMatrixPosition( object.matrixWorld )\n\t\t\t\t\t\t\t\t.applyMatrix4( _projScreenMatrix );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst geometry = objects.update( object );\n\t\t\t\t\t\tconst material = object.material;\n\n\t\t\t\t\t\tif ( material.visible ) {\n\n\t\t\t\t\t\t\tcurrentRenderList.push( object, geometry, material, groupOrder, _vector4.z, null );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( object.isMesh || object.isLine || object.isPoints ) {\n\n\t\t\t\t\tif ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) {\n\n\t\t\t\t\t\tconst geometry = objects.update( object );\n\t\t\t\t\t\tconst material = object.material;\n\n\t\t\t\t\t\tif ( sortObjects ) {\n\n\t\t\t\t\t\t\tif ( object.boundingSphere !== undefined ) {\n\n\t\t\t\t\t\t\t\tif ( object.boundingSphere === null ) object.computeBoundingSphere();\n\t\t\t\t\t\t\t\t_vector4.copy( object.boundingSphere.center );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\t\t\t\t\t\t\t\t_vector4.copy( geometry.boundingSphere.center );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t_vector4\n\t\t\t\t\t\t\t\t.applyMatrix4( object.matrixWorld )\n\t\t\t\t\t\t\t\t.applyMatrix4( _projScreenMatrix );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\t\t\tconst groups = geometry.groups;\n\n\t\t\t\t\t\t\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\t\t\t\t\t\tconst group = groups[ i ];\n\t\t\t\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\t\t\t\tif ( groupMaterial && groupMaterial.visible ) {\n\n\t\t\t\t\t\t\t\t\tcurrentRenderList.push( object, geometry, groupMaterial, groupOrder, _vector4.z, group );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else if ( material.visible ) {\n\n\t\t\t\t\t\t\tcurrentRenderList.push( object, geometry, material, groupOrder, _vector4.z, null );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst children = object.children;\n\n\t\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tprojectObject( children[ i ], camera, groupOrder, sortObjects );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction renderScene( currentRenderList, scene, camera, viewport ) {\n\n\t\t\tconst { opaque: opaqueObjects, transmissive: transmissiveObjects, transparent: transparentObjects } = currentRenderList;\n\n\t\t\tcurrentRenderState.setupLightsView( camera );\n\n\t\t\tif ( _clippingEnabled === true ) clipping.setGlobalState( _this.clippingPlanes, camera );\n\n\t\t\tif ( viewport ) state.viewport( _currentViewport.copy( viewport ) );\n\n\t\t\tif ( opaqueObjects.length > 0 ) renderObjects( opaqueObjects, scene, camera );\n\t\t\tif ( transmissiveObjects.length > 0 ) renderObjects( transmissiveObjects, scene, camera );\n\t\t\tif ( transparentObjects.length > 0 ) renderObjects( transparentObjects, scene, camera );\n\n\t\t\t// Ensure depth buffer writing is enabled so it can be cleared on next render\n\n\t\t\tstate.buffers.depth.setTest( true );\n\t\t\tstate.buffers.depth.setMask( true );\n\t\t\tstate.buffers.color.setMask( true );\n\n\t\t\tstate.setPolygonOffset( false );\n\n\t\t}\n\n\t\tfunction renderTransmissionPass( opaqueObjects, transmissiveObjects, scene, camera ) {\n\n\t\t\tconst overrideMaterial = scene.isScene === true ? scene.overrideMaterial : null;\n\n\t\t\tif ( overrideMaterial !== null ) {\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( currentRenderState.state.transmissionRenderTarget[ camera.id ] === undefined ) {\n\n\t\t\t\tcurrentRenderState.state.transmissionRenderTarget[ camera.id ] = new WebGLRenderTarget( 1, 1, {\n\t\t\t\t\tgenerateMipmaps: true,\n\t\t\t\t\ttype: ( extensions.has( 'EXT_color_buffer_half_float' ) || extensions.has( 'EXT_color_buffer_float' ) ) ? HalfFloatType : UnsignedByteType,\n\t\t\t\t\tminFilter: LinearMipmapLinearFilter,\n\t\t\t\t\tsamples: 4,\n\t\t\t\t\tstencilBuffer: stencil,\n\t\t\t\t\tresolveDepthBuffer: false,\n\t\t\t\t\tresolveStencilBuffer: false,\n\t\t\t\t\tcolorSpace: ColorManagement.workingColorSpace,\n\t\t\t\t} );\n\n\t\t\t\t// debug\n\n\t\t\t\t/*\n\t\t\t\tconst geometry = new PlaneGeometry();\n\t\t\t\tconst material = new MeshBasicMaterial( { map: _transmissionRenderTarget.texture } );\n\n\t\t\t\tconst mesh = new Mesh( geometry, material );\n\t\t\t\tscene.add( mesh );\n\t\t\t\t*/\n\n\t\t\t}\n\n\t\t\tconst transmissionRenderTarget = currentRenderState.state.transmissionRenderTarget[ camera.id ];\n\n\t\t\tconst activeViewport = camera.viewport || _currentViewport;\n\t\t\ttransmissionRenderTarget.setSize( activeViewport.z * _this.transmissionResolutionScale, activeViewport.w * _this.transmissionResolutionScale );\n\n\t\t\t//\n\n\t\t\tconst currentRenderTarget = _this.getRenderTarget();\n\t\t\tconst currentActiveCubeFace = _this.getActiveCubeFace();\n\t\t\tconst currentActiveMipmapLevel = _this.getActiveMipmapLevel();\n\n\t\t\t_this.setRenderTarget( transmissionRenderTarget );\n\n\t\t\t_this.getClearColor( _currentClearColor );\n\t\t\t_currentClearAlpha = _this.getClearAlpha();\n\t\t\tif ( _currentClearAlpha < 1 ) _this.setClearColor( 0xffffff, 0.5 );\n\n\t\t\t_this.clear();\n\n\t\t\tif ( _renderBackground ) background.render( scene );\n\n\t\t\t// Turn off the features which can affect the frag color for opaque objects pass.\n\t\t\t// Otherwise they are applied twice in opaque objects pass and transmission objects pass.\n\t\t\tconst currentToneMapping = _this.toneMapping;\n\t\t\t_this.toneMapping = NoToneMapping;\n\n\t\t\t// Remove viewport from camera to avoid nested render calls resetting viewport to it (e.g Reflector).\n\t\t\t// Transmission render pass requires viewport to match the transmissionRenderTarget.\n\t\t\tconst currentCameraViewport = camera.viewport;\n\t\t\tif ( camera.viewport !== undefined ) camera.viewport = undefined;\n\n\t\t\tcurrentRenderState.setupLightsView( camera );\n\n\t\t\tif ( _clippingEnabled === true ) clipping.setGlobalState( _this.clippingPlanes, camera );\n\n\t\t\trenderObjects( opaqueObjects, scene, camera );\n\n\t\t\ttextures.updateMultisampleRenderTarget( transmissionRenderTarget );\n\t\t\ttextures.updateRenderTargetMipmap( transmissionRenderTarget );\n\n\t\t\tif ( extensions.has( 'WEBGL_multisampled_render_to_texture' ) === false ) { // see #28131\n\n\t\t\t\tlet renderTargetNeedsUpdate = false;\n\n\t\t\t\tfor ( let i = 0, l = transmissiveObjects.length; i < l; i ++ ) {\n\n\t\t\t\t\tconst renderItem = transmissiveObjects[ i ];\n\n\t\t\t\t\tconst { object, geometry, material, group } = renderItem;\n\n\t\t\t\t\tif ( material.side === DoubleSide && object.layers.test( camera.layers ) ) {\n\n\t\t\t\t\t\tconst currentSide = material.side;\n\n\t\t\t\t\t\tmaterial.side = BackSide;\n\t\t\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t\t\t\trenderObject( object, scene, camera, geometry, material, group );\n\n\t\t\t\t\t\tmaterial.side = currentSide;\n\t\t\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t\t\t\trenderTargetNeedsUpdate = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( renderTargetNeedsUpdate === true ) {\n\n\t\t\t\t\ttextures.updateMultisampleRenderTarget( transmissionRenderTarget );\n\t\t\t\t\ttextures.updateRenderTargetMipmap( transmissionRenderTarget );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_this.setRenderTarget( currentRenderTarget, currentActiveCubeFace, currentActiveMipmapLevel );\n\n\t\t\t_this.setClearColor( _currentClearColor, _currentClearAlpha );\n\n\t\t\tif ( currentCameraViewport !== undefined ) camera.viewport = currentCameraViewport;\n\n\t\t\t_this.toneMapping = currentToneMapping;\n\n\t\t}\n\n\t\tfunction renderObjects( renderList, scene, camera ) {\n\n\t\t\tconst overrideMaterial = scene.isScene === true ? scene.overrideMaterial : null;\n\n\t\t\tfor ( let i = 0, l = renderList.length; i < l; i ++ ) {\n\n\t\t\t\tconst renderItem = renderList[ i ];\n\n\t\t\t\tconst { object, geometry, group } = renderItem;\n\t\t\t\tlet material = renderItem.material;\n\n\t\t\t\tif ( material.allowOverride === true && overrideMaterial !== null ) {\n\n\t\t\t\t\tmaterial = overrideMaterial;\n\n\t\t\t\t}\n\n\t\t\t\tif ( object.layers.test( camera.layers ) ) {\n\n\t\t\t\t\trenderObject( object, scene, camera, geometry, material, group );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction renderObject( object, scene, camera, geometry, material, group ) {\n\n\t\t\tobject.onBeforeRender( _this, scene, camera, geometry, material, group );\n\n\t\t\tobject.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );\n\t\t\tobject.normalMatrix.getNormalMatrix( object.modelViewMatrix );\n\n\t\t\tmaterial.onBeforeRender( _this, scene, camera, geometry, object, group );\n\n\t\t\tif ( material.transparent === true && material.side === DoubleSide && material.forceSinglePass === false ) {\n\n\t\t\t\tmaterial.side = BackSide;\n\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t\t_this.renderBufferDirect( camera, scene, geometry, material, object, group );\n\n\t\t\t\tmaterial.side = FrontSide;\n\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t\t_this.renderBufferDirect( camera, scene, geometry, material, object, group );\n\n\t\t\t\tmaterial.side = DoubleSide;\n\n\t\t\t} else {\n\n\t\t\t\t_this.renderBufferDirect( camera, scene, geometry, material, object, group );\n\n\t\t\t}\n\n\t\t\tobject.onAfterRender( _this, scene, camera, geometry, material, group );\n\n\t\t}\n\n\t\tfunction getProgram( material, scene, object ) {\n\n\t\t\tif ( scene.isScene !== true ) scene = _emptyScene; // scene could be a Mesh, Line, Points, ...\n\n\t\t\tconst materialProperties = properties.get( material );\n\n\t\t\tconst lights = currentRenderState.state.lights;\n\t\t\tconst shadowsArray = currentRenderState.state.shadowsArray;\n\n\t\t\tconst lightsStateVersion = lights.state.version;\n\n\t\t\tconst parameters = programCache.getParameters( material, lights.state, shadowsArray, scene, object );\n\t\t\tconst programCacheKey = programCache.getProgramCacheKey( parameters );\n\n\t\t\tlet programs = materialProperties.programs;\n\n\t\t\t// always update environment and fog - changing these trigger an getProgram call, but it's possible that the program doesn't change\n\n\t\t\tmaterialProperties.environment = material.isMeshStandardMaterial ? scene.environment : null;\n\t\t\tmaterialProperties.fog = scene.fog;\n\t\t\tmaterialProperties.envMap = ( material.isMeshStandardMaterial ? cubeuvmaps : cubemaps ).get( material.envMap || materialProperties.environment );\n\t\t\tmaterialProperties.envMapRotation = ( materialProperties.environment !== null && material.envMap === null ) ? scene.environmentRotation : material.envMapRotation;\n\n\t\t\tif ( programs === undefined ) {\n\n\t\t\t\t// new material\n\n\t\t\t\tmaterial.addEventListener( 'dispose', onMaterialDispose );\n\n\t\t\t\tprograms = new Map();\n\t\t\t\tmaterialProperties.programs = programs;\n\n\t\t\t}\n\n\t\t\tlet program = programs.get( programCacheKey );\n\n\t\t\tif ( program !== undefined ) {\n\n\t\t\t\t// early out if program and light state is identical\n\n\t\t\t\tif ( materialProperties.currentProgram === program && materialProperties.lightsStateVersion === lightsStateVersion ) {\n\n\t\t\t\t\tupdateCommonMaterialProperties( material, parameters );\n\n\t\t\t\t\treturn program;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tparameters.uniforms = programCache.getUniforms( material );\n\n\t\t\t\tmaterial.onBeforeCompile( parameters, _this );\n\n\t\t\t\tprogram = programCache.acquireProgram( parameters, programCacheKey );\n\t\t\t\tprograms.set( programCacheKey, program );\n\n\t\t\t\tmaterialProperties.uniforms = parameters.uniforms;\n\n\t\t\t}\n\n\t\t\tconst uniforms = materialProperties.uniforms;\n\n\t\t\tif ( ( ! material.isShaderMaterial && ! material.isRawShaderMaterial ) || material.clipping === true ) {\n\n\t\t\t\tuniforms.clippingPlanes = clipping.uniform;\n\n\t\t\t}\n\n\t\t\tupdateCommonMaterialProperties( material, parameters );\n\n\t\t\t// store the light setup it was created for\n\n\t\t\tmaterialProperties.needsLights = materialNeedsLights( material );\n\t\t\tmaterialProperties.lightsStateVersion = lightsStateVersion;\n\n\t\t\tif ( materialProperties.needsLights ) {\n\n\t\t\t\t// wire up the material to this renderer's lighting state\n\n\t\t\t\tuniforms.ambientLightColor.value = lights.state.ambient;\n\t\t\t\tuniforms.lightProbe.value = lights.state.probe;\n\t\t\t\tuniforms.directionalLights.value = lights.state.directional;\n\t\t\t\tuniforms.directionalLightShadows.value = lights.state.directionalShadow;\n\t\t\t\tuniforms.spotLights.value = lights.state.spot;\n\t\t\t\tuniforms.spotLightShadows.value = lights.state.spotShadow;\n\t\t\t\tuniforms.rectAreaLights.value = lights.state.rectArea;\n\t\t\t\tuniforms.ltc_1.value = lights.state.rectAreaLTC1;\n\t\t\t\tuniforms.ltc_2.value = lights.state.rectAreaLTC2;\n\t\t\t\tuniforms.pointLights.value = lights.state.point;\n\t\t\t\tuniforms.pointLightShadows.value = lights.state.pointShadow;\n\t\t\t\tuniforms.hemisphereLights.value = lights.state.hemi;\n\n\t\t\t\tuniforms.directionalShadowMap.value = lights.state.directionalShadowMap;\n\t\t\t\tuniforms.directionalShadowMatrix.value = lights.state.directionalShadowMatrix;\n\t\t\t\tuniforms.spotShadowMap.value = lights.state.spotShadowMap;\n\t\t\t\tuniforms.spotLightMatrix.value = lights.state.spotLightMatrix;\n\t\t\t\tuniforms.spotLightMap.value = lights.state.spotLightMap;\n\t\t\t\tuniforms.pointShadowMap.value = lights.state.pointShadowMap;\n\t\t\t\tuniforms.pointShadowMatrix.value = lights.state.pointShadowMatrix;\n\t\t\t\t// TODO (abelnation): add area lights shadow info to uniforms\n\n\t\t\t}\n\n\t\t\tmaterialProperties.currentProgram = program;\n\t\t\tmaterialProperties.uniformsList = null;\n\n\t\t\treturn program;\n\n\t\t}\n\n\t\tfunction getUniformList( materialProperties ) {\n\n\t\t\tif ( materialProperties.uniformsList === null ) {\n\n\t\t\t\tconst progUniforms = materialProperties.currentProgram.getUniforms();\n\t\t\t\tmaterialProperties.uniformsList = WebGLUniforms.seqWithValue( progUniforms.seq, materialProperties.uniforms );\n\n\t\t\t}\n\n\t\t\treturn materialProperties.uniformsList;\n\n\t\t}\n\n\t\tfunction updateCommonMaterialProperties( material, parameters ) {\n\n\t\t\tconst materialProperties = properties.get( material );\n\n\t\t\tmaterialProperties.outputColorSpace = parameters.outputColorSpace;\n\t\t\tmaterialProperties.batching = parameters.batching;\n\t\t\tmaterialProperties.batchingColor = parameters.batchingColor;\n\t\t\tmaterialProperties.instancing = parameters.instancing;\n\t\t\tmaterialProperties.instancingColor = parameters.instancingColor;\n\t\t\tmaterialProperties.instancingMorph = parameters.instancingMorph;\n\t\t\tmaterialProperties.skinning = parameters.skinning;\n\t\t\tmaterialProperties.morphTargets = parameters.morphTargets;\n\t\t\tmaterialProperties.morphNormals = parameters.morphNormals;\n\t\t\tmaterialProperties.morphColors = parameters.morphColors;\n\t\t\tmaterialProperties.morphTargetsCount = parameters.morphTargetsCount;\n\t\t\tmaterialProperties.numClippingPlanes = parameters.numClippingPlanes;\n\t\t\tmaterialProperties.numIntersection = parameters.numClipIntersection;\n\t\t\tmaterialProperties.vertexAlphas = parameters.vertexAlphas;\n\t\t\tmaterialProperties.vertexTangents = parameters.vertexTangents;\n\t\t\tmaterialProperties.toneMapping = parameters.toneMapping;\n\n\t\t}\n\n\t\tfunction setProgram( camera, scene, geometry, material, object ) {\n\n\t\t\tif ( scene.isScene !== true ) scene = _emptyScene; // scene could be a Mesh, Line, Points, ...\n\n\t\t\ttextures.resetTextureUnits();\n\n\t\t\tconst fog = scene.fog;\n\t\t\tconst environment = material.isMeshStandardMaterial ? scene.environment : null;\n\t\t\tconst colorSpace = ( _currentRenderTarget === null ) ? _this.outputColorSpace : ( _currentRenderTarget.isXRRenderTarget === true ? _currentRenderTarget.texture.colorSpace : LinearSRGBColorSpace );\n\t\t\tconst envMap = ( material.isMeshStandardMaterial ? cubeuvmaps : cubemaps ).get( material.envMap || environment );\n\t\t\tconst vertexAlphas = material.vertexColors === true && !! geometry.attributes.color && geometry.attributes.color.itemSize === 4;\n\t\t\tconst vertexTangents = !! geometry.attributes.tangent && ( !! material.normalMap || material.anisotropy > 0 );\n\t\t\tconst morphTargets = !! geometry.morphAttributes.position;\n\t\t\tconst morphNormals = !! geometry.morphAttributes.normal;\n\t\t\tconst morphColors = !! geometry.morphAttributes.color;\n\n\t\t\tlet toneMapping = NoToneMapping;\n\n\t\t\tif ( material.toneMapped ) {\n\n\t\t\t\tif ( _currentRenderTarget === null || _currentRenderTarget.isXRRenderTarget === true ) {\n\n\t\t\t\t\ttoneMapping = _this.toneMapping;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst morphAttribute = geometry.morphAttributes.position || geometry.morphAttributes.normal || geometry.morphAttributes.color;\n\t\t\tconst morphTargetsCount = ( morphAttribute !== undefined ) ? morphAttribute.length : 0;\n\n\t\t\tconst materialProperties = properties.get( material );\n\t\t\tconst lights = currentRenderState.state.lights;\n\n\t\t\tif ( _clippingEnabled === true ) {\n\n\t\t\t\tif ( _localClippingEnabled === true || camera !== _currentCamera ) {\n\n\t\t\t\t\tconst useCache =\n\t\t\t\t\t\tcamera === _currentCamera &&\n\t\t\t\t\t\tmaterial.id === _currentMaterialId;\n\n\t\t\t\t\t// we might want to call this function with some ClippingGroup\n\t\t\t\t\t// object instead of the material, once it becomes feasible\n\t\t\t\t\t// (#8465, #8379)\n\t\t\t\t\tclipping.setState( material, camera, useCache );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tlet needsProgramChange = false;\n\n\t\t\tif ( material.version === materialProperties.__version ) {\n\n\t\t\t\tif ( materialProperties.needsLights && ( materialProperties.lightsStateVersion !== lights.state.version ) ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.outputColorSpace !== colorSpace ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isBatchedMesh && materialProperties.batching === false ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( ! object.isBatchedMesh && materialProperties.batching === true ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isBatchedMesh && materialProperties.batchingColor === true && object.colorTexture === null ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isBatchedMesh && materialProperties.batchingColor === false && object.colorTexture !== null ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isInstancedMesh && materialProperties.instancing === false ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( ! object.isInstancedMesh && materialProperties.instancing === true ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isSkinnedMesh && materialProperties.skinning === false ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( ! object.isSkinnedMesh && materialProperties.skinning === true ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isInstancedMesh && materialProperties.instancingColor === true && object.instanceColor === null ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isInstancedMesh && materialProperties.instancingColor === false && object.instanceColor !== null ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isInstancedMesh && materialProperties.instancingMorph === true && object.morphTexture === null ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isInstancedMesh && materialProperties.instancingMorph === false && object.morphTexture !== null ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.envMap !== envMap ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( material.fog === true && materialProperties.fog !== fog ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.numClippingPlanes !== undefined &&\n\t\t\t\t\t( materialProperties.numClippingPlanes !== clipping.numPlanes ||\n\t\t\t\t\tmaterialProperties.numIntersection !== clipping.numIntersection ) ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.vertexAlphas !== vertexAlphas ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.vertexTangents !== vertexTangents ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.morphTargets !== morphTargets ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.morphNormals !== morphNormals ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.morphColors !== morphColors ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.toneMapping !== toneMapping ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.morphTargetsCount !== morphTargetsCount ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tneedsProgramChange = true;\n\t\t\t\tmaterialProperties.__version = material.version;\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tlet program = materialProperties.currentProgram;\n\n\t\t\tif ( needsProgramChange === true ) {\n\n\t\t\t\tprogram = getProgram( material, scene, object );\n\n\t\t\t}\n\n\t\t\tlet refreshProgram = false;\n\t\t\tlet refreshMaterial = false;\n\t\t\tlet refreshLights = false;\n\n\t\t\tconst p_uniforms = program.getUniforms(),\n\t\t\t\tm_uniforms = materialProperties.uniforms;\n\n\t\t\tif ( state.useProgram( program.program ) ) {\n\n\t\t\t\trefreshProgram = true;\n\t\t\t\trefreshMaterial = true;\n\t\t\t\trefreshLights = true;\n\n\t\t\t}\n\n\t\t\tif ( material.id !== _currentMaterialId ) {\n\n\t\t\t\t_currentMaterialId = material.id;\n\n\t\t\t\trefreshMaterial = true;\n\n\t\t\t}\n\n\t\t\tif ( refreshProgram || _currentCamera !== camera ) {\n\n\t\t\t\t// common camera uniforms\n\n\t\t\t\tconst reversedDepthBuffer = state.buffers.depth.getReversed();\n\n\t\t\t\tif ( reversedDepthBuffer && camera.reversedDepth !== true ) {\n\n\t\t\t\t\tcamera._reversedDepth = true;\n\t\t\t\t\tcamera.updateProjectionMatrix();\n\n\t\t\t\t}\n\n\t\t\t\tp_uniforms.setValue( _gl, 'projectionMatrix', camera.projectionMatrix );\n\n\t\t\t\tp_uniforms.setValue( _gl, 'viewMatrix', camera.matrixWorldInverse );\n\n\t\t\t\tconst uCamPos = p_uniforms.map.cameraPosition;\n\n\t\t\t\tif ( uCamPos !== undefined ) {\n\n\t\t\t\t\tuCamPos.setValue( _gl, _vector3.setFromMatrixPosition( camera.matrixWorld ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( capabilities.logarithmicDepthBuffer ) {\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'logDepthBufFC',\n\t\t\t\t\t\t2.0 / ( Math.log( camera.far + 1.0 ) / Math.LN2 ) );\n\n\t\t\t\t}\n\n\t\t\t\t// consider moving isOrthographic to UniformLib and WebGLMaterials, see https://github.com/mrdoob/three.js/pull/26467#issuecomment-1645185067\n\n\t\t\t\tif ( material.isMeshPhongMaterial ||\n\t\t\t\t\tmaterial.isMeshToonMaterial ||\n\t\t\t\t\tmaterial.isMeshLambertMaterial ||\n\t\t\t\t\tmaterial.isMeshBasicMaterial ||\n\t\t\t\t\tmaterial.isMeshStandardMaterial ||\n\t\t\t\t\tmaterial.isShaderMaterial ) {\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'isOrthographic', camera.isOrthographicCamera === true );\n\n\t\t\t\t}\n\n\t\t\t\tif ( _currentCamera !== camera ) {\n\n\t\t\t\t\t_currentCamera = camera;\n\n\t\t\t\t\t// lighting uniforms depend on the camera so enforce an update\n\t\t\t\t\t// now, in case this material supports lights - or later, when\n\t\t\t\t\t// the next material that does gets activated:\n\n\t\t\t\t\trefreshMaterial = true;\t\t// set to true on material change\n\t\t\t\t\trefreshLights = true;\t\t// remains set until update done\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// skinning and morph target uniforms must be set even if material didn't change\n\t\t\t// auto-setting of texture unit for bone and morph texture must go before other textures\n\t\t\t// otherwise textures used for skinning and morphing can take over texture units reserved for other material textures\n\n\t\t\tif ( object.isSkinnedMesh ) {\n\n\t\t\t\tp_uniforms.setOptional( _gl, object, 'bindMatrix' );\n\t\t\t\tp_uniforms.setOptional( _gl, object, 'bindMatrixInverse' );\n\n\t\t\t\tconst skeleton = object.skeleton;\n\n\t\t\t\tif ( skeleton ) {\n\n\t\t\t\t\tif ( skeleton.boneTexture === null ) skeleton.computeBoneTexture();\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'boneTexture', skeleton.boneTexture, textures );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( object.isBatchedMesh ) {\n\n\t\t\t\tp_uniforms.setOptional( _gl, object, 'batchingTexture' );\n\t\t\t\tp_uniforms.setValue( _gl, 'batchingTexture', object._matricesTexture, textures );\n\n\t\t\t\tp_uniforms.setOptional( _gl, object, 'batchingIdTexture' );\n\t\t\t\tp_uniforms.setValue( _gl, 'batchingIdTexture', object._indirectTexture, textures );\n\n\t\t\t\tp_uniforms.setOptional( _gl, object, 'batchingColorTexture' );\n\t\t\t\tif ( object._colorsTexture !== null ) {\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'batchingColorTexture', object._colorsTexture, textures );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst morphAttributes = geometry.morphAttributes;\n\n\t\t\tif ( morphAttributes.position !== undefined || morphAttributes.normal !== undefined || ( morphAttributes.color !== undefined ) ) {\n\n\t\t\t\tmorphtargets.update( object, geometry, program );\n\n\t\t\t}\n\n\t\t\tif ( refreshMaterial || materialProperties.receiveShadow !== object.receiveShadow ) {\n\n\t\t\t\tmaterialProperties.receiveShadow = object.receiveShadow;\n\t\t\t\tp_uniforms.setValue( _gl, 'receiveShadow', object.receiveShadow );\n\n\t\t\t}\n\n\t\t\t// https://github.com/mrdoob/three.js/pull/24467#issuecomment-1209031512\n\n\t\t\tif ( material.isMeshGouraudMaterial && material.envMap !== null ) {\n\n\t\t\t\tm_uniforms.envMap.value = envMap;\n\n\t\t\t\tm_uniforms.flipEnvMap.value = ( envMap.isCubeTexture && envMap.isRenderTargetTexture === false ) ? -1 : 1;\n\n\t\t\t}\n\n\t\t\tif ( material.isMeshStandardMaterial && material.envMap === null && scene.environment !== null ) {\n\n\t\t\t\tm_uniforms.envMapIntensity.value = scene.environmentIntensity;\n\n\t\t\t}\n\n\t\t\t// Set DFG LUT for physically-based materials\n\t\t\tif ( m_uniforms.dfgLUT !== undefined ) {\n\n\t\t\t\tm_uniforms.dfgLUT.value = getDFGLUT();\n\n\t\t\t}\n\n\t\t\tif ( refreshMaterial ) {\n\n\t\t\t\tp_uniforms.setValue( _gl, 'toneMappingExposure', _this.toneMappingExposure );\n\n\t\t\t\tif ( materialProperties.needsLights ) {\n\n\t\t\t\t\t// the current material requires lighting info\n\n\t\t\t\t\t// note: all lighting uniforms are always set correctly\n\t\t\t\t\t// they simply reference the renderer's state for their\n\t\t\t\t\t// values\n\t\t\t\t\t//\n\t\t\t\t\t// use the current material's .needsUpdate flags to set\n\t\t\t\t\t// the GL state when required\n\n\t\t\t\t\tmarkUniformsLightsNeedsUpdate( m_uniforms, refreshLights );\n\n\t\t\t\t}\n\n\t\t\t\t// refresh uniforms common to several materials\n\n\t\t\t\tif ( fog && material.fog === true ) {\n\n\t\t\t\t\tmaterials.refreshFogUniforms( m_uniforms, fog );\n\n\t\t\t\t}\n\n\t\t\t\tmaterials.refreshMaterialUniforms( m_uniforms, material, _pixelRatio, _height, currentRenderState.state.transmissionRenderTarget[ camera.id ] );\n\n\t\t\t\tWebGLUniforms.upload( _gl, getUniformList( materialProperties ), m_uniforms, textures );\n\n\t\t\t}\n\n\t\t\tif ( material.isShaderMaterial && material.uniformsNeedUpdate === true ) {\n\n\t\t\t\tWebGLUniforms.upload( _gl, getUniformList( materialProperties ), m_uniforms, textures );\n\t\t\t\tmaterial.uniformsNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( material.isSpriteMaterial ) {\n\n\t\t\t\tp_uniforms.setValue( _gl, 'center', object.center );\n\n\t\t\t}\n\n\t\t\t// common matrices\n\n\t\t\tp_uniforms.setValue( _gl, 'modelViewMatrix', object.modelViewMatrix );\n\t\t\tp_uniforms.setValue( _gl, 'normalMatrix', object.normalMatrix );\n\t\t\tp_uniforms.setValue( _gl, 'modelMatrix', object.matrixWorld );\n\n\t\t\t// UBOs\n\n\t\t\tif ( material.isShaderMaterial || material.isRawShaderMaterial ) {\n\n\t\t\t\tconst groups = material.uniformsGroups;\n\n\t\t\t\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\t\t\tconst group = groups[ i ];\n\n\t\t\t\t\tuniformsGroups.update( group, program );\n\t\t\t\t\tuniformsGroups.bind( group, program );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn program;\n\n\t\t}\n\n\t\t// If uniforms are marked as clean, they don't need to be loaded to the GPU.\n\n\t\tfunction markUniformsLightsNeedsUpdate( uniforms, value ) {\n\n\t\t\tuniforms.ambientLightColor.needsUpdate = value;\n\t\t\tuniforms.lightProbe.needsUpdate = value;\n\n\t\t\tuniforms.directionalLights.needsUpdate = value;\n\t\t\tuniforms.directionalLightShadows.needsUpdate = value;\n\t\t\tuniforms.pointLights.needsUpdate = value;\n\t\t\tuniforms.pointLightShadows.needsUpdate = value;\n\t\t\tuniforms.spotLights.needsUpdate = value;\n\t\t\tuniforms.spotLightShadows.needsUpdate = value;\n\t\t\tuniforms.rectAreaLights.needsUpdate = value;\n\t\t\tuniforms.hemisphereLights.needsUpdate = value;\n\n\t\t}\n\n\t\tfunction materialNeedsLights( material ) {\n\n\t\t\treturn material.isMeshLambertMaterial || material.isMeshToonMaterial || material.isMeshPhongMaterial ||\n\t\t\t\tmaterial.isMeshStandardMaterial || material.isShadowMaterial ||\n\t\t\t\t( material.isShaderMaterial && material.lights === true );\n\n\t\t}\n\n\t\t/**\n\t\t * Returns the active cube face.\n\t\t *\n\t\t * @return {number} The active cube face.\n\t\t */\n\t\tthis.getActiveCubeFace = function () {\n\n\t\t\treturn _currentActiveCubeFace;\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the active mipmap level.\n\t\t *\n\t\t * @return {number} The active mipmap level.\n\t\t */\n\t\tthis.getActiveMipmapLevel = function () {\n\n\t\t\treturn _currentActiveMipmapLevel;\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the active render target.\n\t\t *\n\t\t * @return {?WebGLRenderTarget} The active render target. Returns `null` if no render target\n\t\t * is currently set.\n\t\t */\n\t\tthis.getRenderTarget = function () {\n\n\t\t\treturn _currentRenderTarget;\n\n\t\t};\n\n\t\tthis.setRenderTargetTextures = function ( renderTarget, colorTexture, depthTexture ) {\n\n\t\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\t\trenderTargetProperties.__autoAllocateDepthBuffer = renderTarget.resolveDepthBuffer === false;\n\t\t\tif ( renderTargetProperties.__autoAllocateDepthBuffer === false ) {\n\n\t\t\t\t// The multisample_render_to_texture extension doesn't work properly if there\n\t\t\t\t// are midframe flushes and an external depth buffer. Disable use of the extension.\n\t\t\t\trenderTargetProperties.__useRenderToTexture = false;\n\n\t\t\t}\n\n\t\t\tproperties.get( renderTarget.texture ).__webglTexture = colorTexture;\n\t\t\tproperties.get( renderTarget.depthTexture ).__webglTexture = renderTargetProperties.__autoAllocateDepthBuffer ? undefined : depthTexture;\n\n\t\t\trenderTargetProperties.__hasExternalTextures = true;\n\n\t\t};\n\n\t\tthis.setRenderTargetFramebuffer = function ( renderTarget, defaultFramebuffer ) {\n\n\t\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\t\trenderTargetProperties.__webglFramebuffer = defaultFramebuffer;\n\t\t\trenderTargetProperties.__useDefaultFramebuffer = defaultFramebuffer === undefined;\n\n\t\t};\n\n\t\tconst _scratchFrameBuffer = _gl.createFramebuffer();\n\n\t\t/**\n\t\t * Sets the active rendertarget.\n\t\t *\n\t\t * @param {?WebGLRenderTarget} renderTarget - The render target to set. When `null` is given,\n\t\t * the canvas is set as the active render target instead.\n\t\t * @param {number} [activeCubeFace=0] - The active cube face when using a cube render target.\n\t\t * Indicates the z layer to render in to when using 3D or array render targets.\n\t\t * @param {number} [activeMipmapLevel=0] - The active mipmap level.\n\t\t */\n\t\tthis.setRenderTarget = function ( renderTarget, activeCubeFace = 0, activeMipmapLevel = 0 ) {\n\n\t\t\t_currentRenderTarget = renderTarget;\n\t\t\t_currentActiveCubeFace = activeCubeFace;\n\t\t\t_currentActiveMipmapLevel = activeMipmapLevel;\n\n\t\t\tlet useDefaultFramebuffer = true;\n\t\t\tlet framebuffer = null;\n\t\t\tlet isCube = false;\n\t\t\tlet isRenderTarget3D = false;\n\n\t\t\tif ( renderTarget ) {\n\n\t\t\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\t\t\tif ( renderTargetProperties.__useDefaultFramebuffer !== undefined ) {\n\n\t\t\t\t\t// We need to make sure to rebind the framebuffer.\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\t\t\t\t\tuseDefaultFramebuffer = false;\n\n\t\t\t\t} else if ( renderTargetProperties.__webglFramebuffer === undefined ) {\n\n\t\t\t\t\ttextures.setupRenderTarget( renderTarget );\n\n\t\t\t\t} else if ( renderTargetProperties.__hasExternalTextures ) {\n\n\t\t\t\t\t// Color and depth texture must be rebound in order for the swapchain to update.\n\t\t\t\t\ttextures.rebindTextures( renderTarget, properties.get( renderTarget.texture ).__webglTexture, properties.get( renderTarget.depthTexture ).__webglTexture );\n\n\t\t\t\t} else if ( renderTarget.depthBuffer ) {\n\n\t\t\t\t\t// check if the depth texture is already bound to the frame buffer and that it's been initialized\n\t\t\t\t\tconst depthTexture = renderTarget.depthTexture;\n\t\t\t\t\tif ( renderTargetProperties.__boundDepthTexture !== depthTexture ) {\n\n\t\t\t\t\t\t// check if the depth texture is compatible\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tdepthTexture !== null &&\n\t\t\t\t\t\t\tproperties.has( depthTexture ) &&\n\t\t\t\t\t\t\t( renderTarget.width !== depthTexture.image.width || renderTarget.height !== depthTexture.image.height )\n\t\t\t\t\t\t) {\n\n\t\t\t\t\t\t\tthrow new Error( 'WebGLRenderTarget: Attached DepthTexture is initialized to the incorrect size.' );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Swap the depth buffer to the currently attached one\n\t\t\t\t\t\ttextures.setupDepthRenderbuffer( renderTarget );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tconst texture = renderTarget.texture;\n\n\t\t\t\tif ( texture.isData3DTexture || texture.isDataArrayTexture || texture.isCompressedArrayTexture ) {\n\n\t\t\t\t\tisRenderTarget3D = true;\n\n\t\t\t\t}\n\n\t\t\t\tconst __webglFramebuffer = properties.get( renderTarget ).__webglFramebuffer;\n\n\t\t\t\tif ( renderTarget.isWebGLCubeRenderTarget ) {\n\n\t\t\t\t\tif ( Array.isArray( __webglFramebuffer[ activeCubeFace ] ) ) {\n\n\t\t\t\t\t\tframebuffer = __webglFramebuffer[ activeCubeFace ][ activeMipmapLevel ];\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tframebuffer = __webglFramebuffer[ activeCubeFace ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\tisCube = true;\n\n\t\t\t\t} else if ( ( renderTarget.samples > 0 ) && textures.useMultisampledRTT( renderTarget ) === false ) {\n\n\t\t\t\t\tframebuffer = properties.get( renderTarget ).__webglMultisampledFramebuffer;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( Array.isArray( __webglFramebuffer ) ) {\n\n\t\t\t\t\t\tframebuffer = __webglFramebuffer[ activeMipmapLevel ];\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tframebuffer = __webglFramebuffer;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t_currentViewport.copy( renderTarget.viewport );\n\t\t\t\t_currentScissor.copy( renderTarget.scissor );\n\t\t\t\t_currentScissorTest = renderTarget.scissorTest;\n\n\t\t\t} else {\n\n\t\t\t\t_currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ).floor();\n\t\t\t\t_currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ).floor();\n\t\t\t\t_currentScissorTest = _scissorTest;\n\n\t\t\t}\n\n\t\t\t// Use a scratch frame buffer if rendering to a mip level to avoid depth buffers\n\t\t\t// being bound that are different sizes.\n\t\t\tif ( activeMipmapLevel !== 0 ) {\n\n\t\t\t\tframebuffer = _scratchFrameBuffer;\n\n\t\t\t}\n\n\t\t\tconst framebufferBound = state.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\t\tif ( framebufferBound && useDefaultFramebuffer ) {\n\n\t\t\t\tstate.drawBuffers( renderTarget, framebuffer );\n\n\t\t\t}\n\n\t\t\tstate.viewport( _currentViewport );\n\t\t\tstate.scissor( _currentScissor );\n\t\t\tstate.setScissorTest( _currentScissorTest );\n\n\t\t\tif ( isCube ) {\n\n\t\t\t\tconst textureProperties = properties.get( renderTarget.texture );\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + activeCubeFace, textureProperties.__webglTexture, activeMipmapLevel );\n\n\t\t\t} else if ( isRenderTarget3D ) {\n\n\t\t\t\tconst layer = activeCubeFace;\n\n\t\t\t\tfor ( let i = 0; i < renderTarget.textures.length; i ++ ) {\n\n\t\t\t\t\tconst textureProperties = properties.get( renderTarget.textures[ i ] );\n\n\t\t\t\t\t_gl.framebufferTextureLayer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, textureProperties.__webglTexture, activeMipmapLevel, layer );\n\n\t\t\t\t}\n\n\t\t\t} else if ( renderTarget !== null && activeMipmapLevel !== 0 ) {\n\n\t\t\t\t// Only bind the frame buffer if we are using a scratch frame buffer to render to a mipmap.\n\t\t\t\t// If we rebind the texture when using a multi sample buffer then an error about inconsistent samples will be thrown.\n\t\t\t\tconst textureProperties = properties.get( renderTarget.texture );\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, textureProperties.__webglTexture, activeMipmapLevel );\n\n\t\t\t}\n\n\t\t\t_currentMaterialId = -1; // reset current material to ensure correct uniform bindings\n\n\t\t};\n\n\t\t/**\n\t\t * Reads the pixel data from the given render target into the given buffer.\n\t\t *\n\t\t * @param {WebGLRenderTarget} renderTarget - The render target to read from.\n\t\t * @param {number} x - The `x` coordinate of the copy region's origin.\n\t\t * @param {number} y - The `y` coordinate of the copy region's origin.\n\t\t * @param {number} width - The width of the copy region.\n\t\t * @param {number} height - The height of the copy region.\n\t\t * @param {TypedArray} buffer - The result buffer.\n\t\t * @param {number} [activeCubeFaceIndex] - The active cube face index.\n\t\t * @param {number} [textureIndex=0] - The texture index of an MRT render target.\n\t\t */\n\t\tthis.readRenderTargetPixels = function ( renderTarget, x, y, width, height, buffer, activeCubeFaceIndex, textureIndex = 0 ) {\n\n\t\t\tif ( ! ( renderTarget && renderTarget.isWebGLRenderTarget ) ) {\n\n\t\t\t\terror( 'WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tlet framebuffer = properties.get( renderTarget ).__webglFramebuffer;\n\n\t\t\tif ( renderTarget.isWebGLCubeRenderTarget && activeCubeFaceIndex !== undefined ) {\n\n\t\t\t\tframebuffer = framebuffer[ activeCubeFaceIndex ];\n\n\t\t\t}\n\n\t\t\tif ( framebuffer ) {\n\n\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\t\t\ttry {\n\n\t\t\t\t\tconst texture = renderTarget.textures[ textureIndex ];\n\t\t\t\t\tconst textureFormat = texture.format;\n\t\t\t\t\tconst textureType = texture.type;\n\n\t\t\t\t\tif ( ! capabilities.textureFormatReadable( textureFormat ) ) {\n\n\t\t\t\t\t\terror( 'WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.' );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! capabilities.textureTypeReadable( textureType ) ) {\n\n\t\t\t\t\t\terror( 'WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.' );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// the following if statement ensures valid read requests (no out-of-bounds pixels, see #8604)\n\n\t\t\t\t\tif ( ( x >= 0 && x <= ( renderTarget.width - width ) ) && ( y >= 0 && y <= ( renderTarget.height - height ) ) ) {\n\n\t\t\t\t\t\t// when using MRT, select the correct color buffer for the subsequent read command\n\n\t\t\t\t\t\tif ( renderTarget.textures.length > 1 ) _gl.readBuffer( _gl.COLOR_ATTACHMENT0 + textureIndex );\n\n\t\t\t\t\t\t_gl.readPixels( x, y, width, height, utils.convert( textureFormat ), utils.convert( textureType ), buffer );\n\n\t\t\t\t\t}\n\n\t\t\t\t} finally {\n\n\t\t\t\t\t// restore framebuffer of current render target if necessary\n\n\t\t\t\t\tconst framebuffer = ( _currentRenderTarget !== null ) ? properties.get( _currentRenderTarget ).__webglFramebuffer : null;\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Asynchronous, non-blocking version of {@link WebGLRenderer#readRenderTargetPixels}.\n\t\t *\n\t\t * It is recommended to use this version of `readRenderTargetPixels()` whenever possible.\n\t\t *\n\t\t * @async\n\t\t * @param {WebGLRenderTarget} renderTarget - The render target to read from.\n\t\t * @param {number} x - The `x` coordinate of the copy region's origin.\n\t\t * @param {number} y - The `y` coordinate of the copy region's origin.\n\t\t * @param {number} width - The width of the copy region.\n\t\t * @param {number} height - The height of the copy region.\n\t\t * @param {TypedArray} buffer - The result buffer.\n\t\t * @param {number} [activeCubeFaceIndex] - The active cube face index.\n\t\t * @param {number} [textureIndex=0] - The texture index of an MRT render target.\n\t\t * @return {Promise<TypedArray>} A Promise that resolves when the read has been finished. The resolve provides the read data as a typed array.\n\t\t */\n\t\tthis.readRenderTargetPixelsAsync = async function ( renderTarget, x, y, width, height, buffer, activeCubeFaceIndex, textureIndex = 0 ) {\n\n\t\t\tif ( ! ( renderTarget && renderTarget.isWebGLRenderTarget ) ) {\n\n\t\t\t\tthrow new Error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.' );\n\n\t\t\t}\n\n\t\t\tlet framebuffer = properties.get( renderTarget ).__webglFramebuffer;\n\t\t\tif ( renderTarget.isWebGLCubeRenderTarget && activeCubeFaceIndex !== undefined ) {\n\n\t\t\t\tframebuffer = framebuffer[ activeCubeFaceIndex ];\n\n\t\t\t}\n\n\t\t\tif ( framebuffer ) {\n\n\t\t\t\t// the following if statement ensures valid read requests (no out-of-bounds pixels, see #8604)\n\t\t\t\tif ( ( x >= 0 && x <= ( renderTarget.width - width ) ) && ( y >= 0 && y <= ( renderTarget.height - height ) ) ) {\n\n\t\t\t\t\t// set the active frame buffer to the one we want to read\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\t\t\t\tconst texture = renderTarget.textures[ textureIndex ];\n\t\t\t\t\tconst textureFormat = texture.format;\n\t\t\t\t\tconst textureType = texture.type;\n\n\t\t\t\t\tif ( ! capabilities.textureFormatReadable( textureFormat ) ) {\n\n\t\t\t\t\t\tthrow new Error( 'THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in RGBA or implementation defined format.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! capabilities.textureTypeReadable( textureType ) ) {\n\n\t\t\t\t\t\tthrow new Error( 'THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in UnsignedByteType or implementation defined type.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst glBuffer = _gl.createBuffer();\n\t\t\t\t\t_gl.bindBuffer( _gl.PIXEL_PACK_BUFFER, glBuffer );\n\t\t\t\t\t_gl.bufferData( _gl.PIXEL_PACK_BUFFER, buffer.byteLength, _gl.STREAM_READ );\n\n\t\t\t\t\t// when using MRT, select the correct color buffer for the subsequent read command\n\n\t\t\t\t\tif ( renderTarget.textures.length > 1 ) _gl.readBuffer( _gl.COLOR_ATTACHMENT0 + textureIndex );\n\n\t\t\t\t\t_gl.readPixels( x, y, width, height, utils.convert( textureFormat ), utils.convert( textureType ), 0 );\n\n\t\t\t\t\t// reset the frame buffer to the currently set buffer before waiting\n\t\t\t\t\tconst currFramebuffer = _currentRenderTarget !== null ? properties.get( _currentRenderTarget ).__webglFramebuffer : null;\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, currFramebuffer );\n\n\t\t\t\t\t// check if the commands have finished every 8 ms\n\t\t\t\t\tconst sync = _gl.fenceSync( _gl.SYNC_GPU_COMMANDS_COMPLETE, 0 );\n\n\t\t\t\t\t_gl.flush();\n\n\t\t\t\t\tawait probeAsync( _gl, sync, 4 );\n\n\t\t\t\t\t// read the data and delete the buffer\n\t\t\t\t\t_gl.bindBuffer( _gl.PIXEL_PACK_BUFFER, glBuffer );\n\t\t\t\t\t_gl.getBufferSubData( _gl.PIXEL_PACK_BUFFER, 0, buffer );\n\t\t\t\t\t_gl.deleteBuffer( glBuffer );\n\t\t\t\t\t_gl.deleteSync( sync );\n\n\t\t\t\t\treturn buffer;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new Error( 'THREE.WebGLRenderer.readRenderTargetPixelsAsync: requested read bounds are out of range.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Copies pixels from the current bound framebuffer into the given texture.\n\t\t *\n\t\t * @param {FramebufferTexture} texture - The texture.\n\t\t * @param {?Vector2} [position=null] - The start position of the copy operation.\n\t\t * @param {number} [level=0] - The mip level. The default represents the base mip.\n\t\t */\n\t\tthis.copyFramebufferToTexture = function ( texture, position = null, level = 0 ) {\n\n\t\t\tconst levelScale = Math.pow( 2, - level );\n\t\t\tconst width = Math.floor( texture.image.width * levelScale );\n\t\t\tconst height = Math.floor( texture.image.height * levelScale );\n\n\t\t\tconst x = position !== null ? position.x : 0;\n\t\t\tconst y = position !== null ? position.y : 0;\n\n\t\t\ttextures.setTexture2D( texture, 0 );\n\n\t\t\t_gl.copyTexSubImage2D( _gl.TEXTURE_2D, level, 0, 0, x, y, width, height );\n\n\t\t\tstate.unbindTexture();\n\n\t\t};\n\n\t\tconst _srcFramebuffer = _gl.createFramebuffer();\n\t\tconst _dstFramebuffer = _gl.createFramebuffer();\n\n\t\t/**\n\t\t * Copies data of the given source texture into a destination texture.\n\t\t *\n\t\t * When using render target textures as `srcTexture` and `dstTexture`, you must make sure both render targets are initialized\n\t\t * {@link WebGLRenderer#initRenderTarget}.\n\t\t *\n\t\t * @param {Texture} srcTexture - The source texture.\n\t\t * @param {Texture} dstTexture - The destination texture.\n\t\t * @param {?(Box2|Box3)} [srcRegion=null] - A bounding box which describes the source region. Can be two or three-dimensional.\n\t\t * @param {?(Vector2|Vector3)} [dstPosition=null] - A vector that represents the origin of the destination region. Can be two or three-dimensional.\n\t\t * @param {number} [srcLevel=0] - The source mipmap level to copy.\n\t\t * @param {?number} [dstLevel=null] - The destination mipmap level.\n\t\t */\n\t\tthis.copyTextureToTexture = function ( srcTexture, dstTexture, srcRegion = null, dstPosition = null, srcLevel = 0, dstLevel = null ) {\n\n\t\t\t// support the previous signature with just a single dst mipmap level\n\t\t\tif ( dstLevel === null ) {\n\n\t\t\t\tif ( srcLevel !== 0 ) {\n\n\t\t\t\t\t// @deprecated, r171\n\t\t\t\t\twarnOnce( 'WebGLRenderer: copyTextureToTexture function signature has changed to support src and dst mipmap levels.' );\n\t\t\t\t\tdstLevel = srcLevel;\n\t\t\t\t\tsrcLevel = 0;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tdstLevel = 0;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// gather the necessary dimensions to copy\n\t\t\tlet width, height, depth, minX, minY, minZ;\n\t\t\tlet dstX, dstY, dstZ;\n\t\t\tconst image = srcTexture.isCompressedTexture ? srcTexture.mipmaps[ dstLevel ] : srcTexture.image;\n\t\t\tif ( srcRegion !== null ) {\n\n\t\t\t\twidth = srcRegion.max.x - srcRegion.min.x;\n\t\t\t\theight = srcRegion.max.y - srcRegion.min.y;\n\t\t\t\tdepth = srcRegion.isBox3 ? srcRegion.max.z - srcRegion.min.z : 1;\n\t\t\t\tminX = srcRegion.min.x;\n\t\t\t\tminY = srcRegion.min.y;\n\t\t\t\tminZ = srcRegion.isBox3 ? srcRegion.min.z : 0;\n\n\t\t\t} else {\n\n\t\t\t\tconst levelScale = Math.pow( 2, - srcLevel );\n\t\t\t\twidth = Math.floor( image.width * levelScale );\n\t\t\t\theight = Math.floor( image.height * levelScale );\n\t\t\t\tif ( srcTexture.isDataArrayTexture ) {\n\n\t\t\t\t\tdepth = image.depth;\n\n\t\t\t\t} else if ( srcTexture.isData3DTexture ) {\n\n\t\t\t\t\tdepth = Math.floor( image.depth * levelScale );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tdepth = 1;\n\n\t\t\t\t}\n\n\t\t\t\tminX = 0;\n\t\t\t\tminY = 0;\n\t\t\t\tminZ = 0;\n\n\t\t\t}\n\n\t\t\tif ( dstPosition !== null ) {\n\n\t\t\t\tdstX = dstPosition.x;\n\t\t\t\tdstY = dstPosition.y;\n\t\t\t\tdstZ = dstPosition.z;\n\n\t\t\t} else {\n\n\t\t\t\tdstX = 0;\n\t\t\t\tdstY = 0;\n\t\t\t\tdstZ = 0;\n\n\t\t\t}\n\n\t\t\t// Set up the destination target\n\t\t\tconst glFormat = utils.convert( dstTexture.format );\n\t\t\tconst glType = utils.convert( dstTexture.type );\n\t\t\tlet glTarget;\n\n\t\t\tif ( dstTexture.isData3DTexture ) {\n\n\t\t\t\ttextures.setTexture3D( dstTexture, 0 );\n\t\t\t\tglTarget = _gl.TEXTURE_3D;\n\n\t\t\t} else if ( dstTexture.isDataArrayTexture || dstTexture.isCompressedArrayTexture ) {\n\n\t\t\t\ttextures.setTexture2DArray( dstTexture, 0 );\n\t\t\t\tglTarget = _gl.TEXTURE_2D_ARRAY;\n\n\t\t\t} else {\n\n\t\t\t\ttextures.setTexture2D( dstTexture, 0 );\n\t\t\t\tglTarget = _gl.TEXTURE_2D;\n\n\t\t\t}\n\n\t\t\t_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, dstTexture.flipY );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, dstTexture.premultiplyAlpha );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ALIGNMENT, dstTexture.unpackAlignment );\n\n\t\t\t// used for copying data from cpu\n\t\t\tconst currentUnpackRowLen = _gl.getParameter( _gl.UNPACK_ROW_LENGTH );\n\t\t\tconst currentUnpackImageHeight = _gl.getParameter( _gl.UNPACK_IMAGE_HEIGHT );\n\t\t\tconst currentUnpackSkipPixels = _gl.getParameter( _gl.UNPACK_SKIP_PIXELS );\n\t\t\tconst currentUnpackSkipRows = _gl.getParameter( _gl.UNPACK_SKIP_ROWS );\n\t\t\tconst currentUnpackSkipImages = _gl.getParameter( _gl.UNPACK_SKIP_IMAGES );\n\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ROW_LENGTH, image.width );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_IMAGE_HEIGHT, image.height );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_PIXELS, minX );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_ROWS, minY );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_IMAGES, minZ );\n\n\t\t\t// set up the src texture\n\t\t\tconst isSrc3D = srcTexture.isDataArrayTexture || srcTexture.isData3DTexture;\n\t\t\tconst isDst3D = dstTexture.isDataArrayTexture || dstTexture.isData3DTexture;\n\t\t\tif ( srcTexture.isDepthTexture ) {\n\n\t\t\t\tconst srcTextureProperties = properties.get( srcTexture );\n\t\t\t\tconst dstTextureProperties = properties.get( dstTexture );\n\t\t\t\tconst srcRenderTargetProperties = properties.get( srcTextureProperties.__renderTarget );\n\t\t\t\tconst dstRenderTargetProperties = properties.get( dstTextureProperties.__renderTarget );\n\t\t\t\tstate.bindFramebuffer( _gl.READ_FRAMEBUFFER, srcRenderTargetProperties.__webglFramebuffer );\n\t\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, dstRenderTargetProperties.__webglFramebuffer );\n\n\t\t\t\tfor ( let i = 0; i < depth; i ++ ) {\n\n\t\t\t\t\t// if the source or destination are a 3d target then a layer needs to be bound\n\t\t\t\t\tif ( isSrc3D ) {\n\n\t\t\t\t\t\t_gl.framebufferTextureLayer( _gl.READ_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, properties.get( srcTexture ).__webglTexture, srcLevel, minZ + i );\n\t\t\t\t\t\t_gl.framebufferTextureLayer( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, properties.get( dstTexture ).__webglTexture, dstLevel, dstZ + i );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_gl.blitFramebuffer( minX, minY, width, height, dstX, dstY, width, height, _gl.DEPTH_BUFFER_BIT, _gl.NEAREST );\n\n\t\t\t\t}\n\n\t\t\t\tstate.bindFramebuffer( _gl.READ_FRAMEBUFFER, null );\n\t\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, null );\n\n\t\t\t} else if ( srcLevel !== 0 || srcTexture.isRenderTargetTexture || properties.has( srcTexture ) ) {\n\n\t\t\t\t// get the appropriate frame buffers\n\t\t\t\tconst srcTextureProperties = properties.get( srcTexture );\n\t\t\t\tconst dstTextureProperties = properties.get( dstTexture );\n\n\t\t\t\t// bind the frame buffer targets\n\t\t\t\tstate.bindFramebuffer( _gl.READ_FRAMEBUFFER, _srcFramebuffer );\n\t\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, _dstFramebuffer );\n\n\t\t\t\tfor ( let i = 0; i < depth; i ++ ) {\n\n\t\t\t\t\t// assign the correct layers and mip maps to the frame buffers\n\t\t\t\t\tif ( isSrc3D ) {\n\n\t\t\t\t\t\t_gl.framebufferTextureLayer( _gl.READ_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, srcTextureProperties.__webglTexture, srcLevel, minZ + i );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_gl.framebufferTexture2D( _gl.READ_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, srcTextureProperties.__webglTexture, srcLevel );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( isDst3D ) {\n\n\t\t\t\t\t\t_gl.framebufferTextureLayer( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, dstTextureProperties.__webglTexture, dstLevel, dstZ + i );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_gl.framebufferTexture2D( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, dstTextureProperties.__webglTexture, dstLevel );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// copy the data using the fastest function that can achieve the copy\n\t\t\t\t\tif ( srcLevel !== 0 ) {\n\n\t\t\t\t\t\t_gl.blitFramebuffer( minX, minY, width, height, dstX, dstY, width, height, _gl.COLOR_BUFFER_BIT, _gl.NEAREST );\n\n\t\t\t\t\t} else if ( isDst3D ) {\n\n\t\t\t\t\t\t_gl.copyTexSubImage3D( glTarget, dstLevel, dstX, dstY, dstZ + i, minX, minY, width, height );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_gl.copyTexSubImage2D( glTarget, dstLevel, dstX, dstY, minX, minY, width, height );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// unbind read, draw buffers\n\t\t\t\tstate.bindFramebuffer( _gl.READ_FRAMEBUFFER, null );\n\t\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, null );\n\n\t\t\t} else {\n\n\t\t\t\tif ( isDst3D ) {\n\n\t\t\t\t\t// copy data into the 3d texture\n\t\t\t\t\tif ( srcTexture.isDataTexture || srcTexture.isData3DTexture ) {\n\n\t\t\t\t\t\t_gl.texSubImage3D( glTarget, dstLevel, dstX, dstY, dstZ, width, height, depth, glFormat, glType, image.data );\n\n\t\t\t\t\t} else if ( dstTexture.isCompressedArrayTexture ) {\n\n\t\t\t\t\t\t_gl.compressedTexSubImage3D( glTarget, dstLevel, dstX, dstY, dstZ, width, height, depth, glFormat, image.data );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_gl.texSubImage3D( glTarget, dstLevel, dstX, dstY, dstZ, width, height, depth, glFormat, glType, image );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// copy data into the 2d texture\n\t\t\t\t\tif ( srcTexture.isDataTexture ) {\n\n\t\t\t\t\t\t_gl.texSubImage2D( _gl.TEXTURE_2D, dstLevel, dstX, dstY, width, height, glFormat, glType, image.data );\n\n\t\t\t\t\t} else if ( srcTexture.isCompressedTexture ) {\n\n\t\t\t\t\t\t_gl.compressedTexSubImage2D( _gl.TEXTURE_2D, dstLevel, dstX, dstY, image.width, image.height, glFormat, image.data );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_gl.texSubImage2D( _gl.TEXTURE_2D, dstLevel, dstX, dstY, width, height, glFormat, glType, image );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// reset values\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ROW_LENGTH, currentUnpackRowLen );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_IMAGE_HEIGHT, currentUnpackImageHeight );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_PIXELS, currentUnpackSkipPixels );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_ROWS, currentUnpackSkipRows );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_IMAGES, currentUnpackSkipImages );\n\n\t\t\t// Generate mipmaps only when copying level 0\n\t\t\tif ( dstLevel === 0 && dstTexture.generateMipmaps ) {\n\n\t\t\t\t_gl.generateMipmap( glTarget );\n\n\t\t\t}\n\n\t\t\tstate.unbindTexture();\n\n\t\t};\n\n\t\t/**\n\t\t * Initializes the given WebGLRenderTarget memory. Useful for initializing a render target so data\n\t\t * can be copied into it using {@link WebGLRenderer#copyTextureToTexture} before it has been\n\t\t * rendered to.\n\t\t *\n\t\t * @param {WebGLRenderTarget} target - The render target.\n\t\t */\n\t\tthis.initRenderTarget = function ( target ) {\n\n\t\t\tif ( properties.get( target ).__webglFramebuffer === undefined ) {\n\n\t\t\t\ttextures.setupRenderTarget( target );\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Initializes the given texture. Useful for preloading a texture rather than waiting until first\n\t\t * render (which can cause noticeable lags due to decode and GPU upload overhead).\n\t\t *\n\t\t * @param {Texture} texture - The texture.\n\t\t */\n\t\tthis.initTexture = function ( texture ) {\n\n\t\t\tif ( texture.isCubeTexture ) {\n\n\t\t\t\ttextures.setTextureCube( texture, 0 );\n\n\t\t\t} else if ( texture.isData3DTexture ) {\n\n\t\t\t\ttextures.setTexture3D( texture, 0 );\n\n\t\t\t} else if ( texture.isDataArrayTexture || texture.isCompressedArrayTexture ) {\n\n\t\t\t\ttextures.setTexture2DArray( texture, 0 );\n\n\t\t\t} else {\n\n\t\t\t\ttextures.setTexture2D( texture, 0 );\n\n\t\t\t}\n\n\t\t\tstate.unbindTexture();\n\n\t\t};\n\n\t\t/**\n\t\t * Can be used to reset the internal WebGL state. This method is mostly\n\t\t * relevant for applications which share a single WebGL context across\n\t\t * multiple WebGL libraries.\n\t\t */\n\t\tthis.resetState = function () {\n\n\t\t\t_currentActiveCubeFace = 0;\n\t\t\t_currentActiveMipmapLevel = 0;\n\t\t\t_currentRenderTarget = null;\n\n\t\t\tstate.reset();\n\t\t\tbindingStates.reset();\n\n\t\t};\n\n\t\tif ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) {\n\n\t\t\t__THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'observe', { detail: this } ) );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Defines the coordinate system of the renderer.\n\t *\n\t * In `WebGLRenderer`, the value is always `WebGLCoordinateSystem`.\n\t *\n\t * @type {WebGLCoordinateSystem|WebGPUCoordinateSystem}\n\t * @default WebGLCoordinateSystem\n\t * @readonly\n\t */\n\tget coordinateSystem() {\n\n\t\treturn WebGLCoordinateSystem;\n\n\t}\n\n\t/**\n\t * Defines the output color space of the renderer.\n\t *\n\t * @type {SRGBColorSpace|LinearSRGBColorSpace}\n\t * @default SRGBColorSpace\n\t */\n\tget outputColorSpace() {\n\n\t\treturn this._outputColorSpace;\n\n\t}\n\n\tset outputColorSpace( colorSpace ) {\n\n\t\tthis._outputColorSpace = colorSpace;\n\n\t\tconst gl = this.getContext();\n\t\tgl.drawingBufferColorSpace = ColorManagement._getDrawingBufferColorSpace( colorSpace );\n\t\tgl.unpackColorSpace = ColorManagement._getUnpackColorSpace();\n\n\t}\n\n}\n\nexport { ACESFilmicToneMapping, AddEquation, AddOperation, AdditiveBlending, AgXToneMapping, AlphaFormat, AlwaysCompare, AlwaysDepth, ArrayCamera, BackSide, BoxGeometry, BufferAttribute, BufferGeometry, ByteType, CineonToneMapping, ClampToEdgeWrapping, Color, ColorManagement, ConstantAlphaFactor, ConstantColorFactor, CubeReflectionMapping, CubeRefractionMapping, CubeTexture, CubeUVReflectionMapping, CullFaceBack, CullFaceFront, CullFaceNone, CustomBlending, CustomToneMapping, Data3DTexture, DataArrayTexture, DataTexture, DepthFormat, DepthStencilFormat, DepthTexture, DoubleSide, DstAlphaFactor, DstColorFactor, EqualCompare, EqualDepth, EquirectangularReflectionMapping, EquirectangularRefractionMapping, Euler, EventDispatcher, ExternalTexture, FloatType, FrontSide, Frustum, GLSL3, GreaterCompare, GreaterDepth, GreaterEqualCompare, GreaterEqualDepth, HalfFloatType, IntType, Layers, LessCompare, LessDepth, LessEqualCompare, LessEqualDepth, LinearFilter, LinearMipmapLinearFilter, LinearMipmapNearestFilter, LinearSRGBColorSpace, LinearToneMapping, LinearTransfer, Matrix3, Matrix4, MaxEquation, Mesh, MeshBasicMaterial, MeshDepthMaterial, MeshDistanceMaterial, MinEquation, MirroredRepeatWrapping, MixOperation, MultiplyBlending, MultiplyOperation, NearestFilter, NearestMipmapLinearFilter, NearestMipmapNearestFilter, NeutralToneMapping, NeverCompare, NeverDepth, NoBlending, NoColorSpace, NoToneMapping, NormalBlending, NotEqualCompare, NotEqualDepth, ObjectSpaceNormalMap, OneFactor, OneMinusConstantAlphaFactor, OneMinusConstantColorFactor, OneMinusDstAlphaFactor, OneMinusDstColorFactor, OneMinusSrcAlphaFactor, OneMinusSrcColorFactor, OrthographicCamera, PCFShadowMap, PCFSoftShadowMap, PMREMGenerator, PerspectiveCamera, Plane, PlaneGeometry, RED_GREEN_RGTC2_Format, RED_RGTC1_Format, REVISION, RGBADepthPacking, RGBAFormat, RGBAIntegerFormat, RGBA_ASTC_10x10_Format, RGBA_ASTC_10x5_Format, RGBA_ASTC_10x6_Format, RGBA_ASTC_10x8_Format, RGBA_ASTC_12x10_Format, RGBA_ASTC_12x12_Format, RGBA_ASTC_4x4_Format, RGBA_ASTC_5x4_Format, RGBA_ASTC_5x5_Format, RGBA_ASTC_6x5_Format, RGBA_ASTC_6x6_Format, RGBA_ASTC_8x5_Format, RGBA_ASTC_8x6_Format, RGBA_ASTC_8x8_Format, RGBA_BPTC_Format, RGBA_ETC2_EAC_Format, RGBA_PVRTC_2BPPV1_Format, RGBA_PVRTC_4BPPV1_Format, RGBA_S3TC_DXT1_Format, RGBA_S3TC_DXT3_Format, RGBA_S3TC_DXT5_Format, RGBFormat, RGB_BPTC_SIGNED_Format, RGB_BPTC_UNSIGNED_Format, RGB_ETC1_Format, RGB_ETC2_Format, RGB_PVRTC_2BPPV1_Format, RGB_PVRTC_4BPPV1_Format, RGB_S3TC_DXT1_Format, RGFormat, RGIntegerFormat, RedFormat, RedIntegerFormat, ReinhardToneMapping, RepeatWrapping, ReverseSubtractEquation, SIGNED_RED_GREEN_RGTC2_Format, SIGNED_RED_RGTC1_Format, SRGBColorSpace, SRGBTransfer, ShaderChunk, ShaderLib, ShaderMaterial, ShortType, SrcAlphaFactor, SrcAlphaSaturateFactor, SrcColorFactor, SubtractEquation, SubtractiveBlending, TangentSpaceNormalMap, Texture, Uint16BufferAttribute, Uint32BufferAttribute, UniformsLib, UniformsUtils, UnsignedByteType, UnsignedInt101111Type, UnsignedInt248Type, UnsignedInt5999Type, UnsignedIntType, UnsignedShort4444Type, UnsignedShort5551Type, UnsignedShortType, VSMShadowMap, Vector2, Vector3, Vector4, WebGLCoordinateSystem, WebGLCubeRenderTarget, WebGLRenderTarget, WebGLRenderer, WebGLUtils, WebXRController, ZeroFactor, createCanvasElement, error, log, warn, warnOnce };\n","/**\n * Bridget makes jQuery widgets\n * v3.0.1\n * MIT license\n */\n\n( function( window, factory ) {\n  // module definition\n if ( typeof module == 'object' && module.exports ) {\n   // CommonJS\n   module.exports = factory(\n       window,\n       require('jquery'),\n   );\n } else {\n   // browser global\n   window.jQueryBridget = factory(\n       window,\n       window.jQuery,\n   );\n }\n\n}( window, function factory( window, jQuery ) {\n\n// ----- utils ----- //\n\n// helper function for logging errors\n// $.error breaks jQuery chaining\nlet console = window.console;\nlet logError = typeof console == 'undefined' ? function() {} :\n  function( message ) {\n    console.error( message );\n  };\n\n// ----- jQueryBridget ----- //\n\nfunction jQueryBridget( namespace, PluginClass, $ ) {\n  $ = $ || jQuery || window.jQuery;\n  if ( !$ ) {\n    return;\n  }\n\n  // add option method -> $().plugin('option', {...})\n  if ( !PluginClass.prototype.option ) {\n    // option setter\n    PluginClass.prototype.option = function( opts ) {\n      if ( !opts ) return;\n\n      this.options = Object.assign( this.options || {}, opts );\n    };\n  }\n\n  // make jQuery plugin\n  $.fn[ namespace ] = function( arg0, ...args ) {\n    if ( typeof arg0 == 'string' ) {\n      // method call $().plugin( 'methodName', { options } )\n      return methodCall( this, arg0, args );\n    }\n    // just $().plugin({ options })\n    plainCall( this, arg0 );\n    return this;\n  };\n\n  // $().plugin('methodName')\n  function methodCall( $elems, methodName, args ) {\n    let returnValue;\n    let pluginMethodStr = `$().${namespace}(\"${methodName}\")`;\n\n    $elems.each( function( i, elem ) {\n      // get instance\n      let instance = $.data( elem, namespace );\n      if ( !instance ) {\n        logError( `${namespace} not initialized.` +\n          ` Cannot call method ${pluginMethodStr}` );\n        return;\n      }\n\n      let method = instance[ methodName ];\n      if ( !method || methodName.charAt( 0 ) == '_' ) {\n        logError(`${pluginMethodStr} is not a valid method`);\n        return;\n      }\n\n      // apply method, get return value\n      let value = method.apply( instance, args );\n      // set return value if value is returned, use only first value\n      returnValue = returnValue === undefined ? value : returnValue;\n    } );\n\n    return returnValue !== undefined ? returnValue : $elems;\n  }\n\n  function plainCall( $elems, options ) {\n    $elems.each( function( i, elem ) {\n      let instance = $.data( elem, namespace );\n      if ( instance ) {\n        // set options & init\n        instance.option( options );\n        instance._init();\n      } else {\n        // initialize new instance\n        instance = new PluginClass( elem, options );\n        $.data( elem, namespace, instance );\n      }\n    } );\n  }\n\n}\n\n// -----  ----- //\n\nreturn jQueryBridget;\n\n} ) );\n","// `Symbol.prototype.description` getter\n// https://tc39.es/ecma262/#sec-symbol.prototype.description\n'use strict';\nvar $ = require('../internals/export');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar globalThis = require('../internals/global-this');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar hasOwn = require('../internals/has-own-property');\nvar isCallable = require('../internals/is-callable');\nvar isPrototypeOf = require('../internals/object-is-prototype-of');\nvar toString = require('../internals/to-string');\nvar defineBuiltInAccessor = require('../internals/define-built-in-accessor');\nvar copyConstructorProperties = require('../internals/copy-constructor-properties');\n\nvar NativeSymbol = globalThis.Symbol;\nvar SymbolPrototype = NativeSymbol && NativeSymbol.prototype;\n\nif (DESCRIPTORS && isCallable(NativeSymbol) && (!('description' in SymbolPrototype) ||\n  // Safari 12 bug\n  NativeSymbol().description !== undefined\n)) {\n  var EmptyStringDescriptionStore = {};\n  // wrap Symbol constructor for correct work with undefined description\n  var SymbolWrapper = function Symbol() {\n    var description = arguments.length < 1 || arguments[0] === undefined ? undefined : toString(arguments[0]);\n    var result = isPrototypeOf(SymbolPrototype, this)\n      // eslint-disable-next-line sonarjs/inconsistent-function-call -- ok\n      ? new NativeSymbol(description)\n      // in Edge 13, String(Symbol(undefined)) === 'Symbol(undefined)'\n      : description === undefined ? NativeSymbol() : NativeSymbol(description);\n    if (description === '') EmptyStringDescriptionStore[result] = true;\n    return result;\n  };\n\n  copyConstructorProperties(SymbolWrapper, NativeSymbol);\n  SymbolWrapper.prototype = SymbolPrototype;\n  SymbolPrototype.constructor = SymbolWrapper;\n\n  var NATIVE_SYMBOL = String(NativeSymbol('description detection')) === 'Symbol(description detection)';\n  var thisSymbolValue = uncurryThis(SymbolPrototype.valueOf);\n  var symbolDescriptiveString = uncurryThis(SymbolPrototype.toString);\n  var regexp = /^Symbol\\((.*)\\)[^)]+$/;\n  var replace = uncurryThis(''.replace);\n  var stringSlice = uncurryThis(''.slice);\n\n  defineBuiltInAccessor(SymbolPrototype, 'description', {\n    configurable: true,\n    get: function description() {\n      var symbol = thisSymbolValue(this);\n      if (hasOwn(EmptyStringDescriptionStore, symbol)) return '';\n      var string = symbolDescriptiveString(symbol);\n      var desc = NATIVE_SYMBOL ? stringSlice(string, 7, -1) : replace(string, regexp, '$1');\n      return desc === '' ? undefined : desc;\n    }\n  });\n\n  $({ global: true, constructor: true, forced: true }, {\n    Symbol: SymbolWrapper\n  });\n}\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar apply = require('../internals/function-apply');\nvar isCallable = require('../internals/is-callable');\nvar ENVIRONMENT = require('../internals/environment');\nvar USER_AGENT = require('../internals/environment-user-agent');\nvar arraySlice = require('../internals/array-slice');\nvar validateArgumentsLength = require('../internals/validate-arguments-length');\n\nvar Function = globalThis.Function;\n// dirty IE9- and Bun 0.3.0- checks\nvar WRAP = /MSIE .\\./.test(USER_AGENT) || ENVIRONMENT === 'BUN' && (function () {\n  var version = globalThis.Bun.version.split('.');\n  return version.length < 3 || version[0] === '0' && (version[1] < 3 || version[1] === '3' && version[2] === '0');\n})();\n\n// IE9- / Bun 0.3.0- setTimeout / setInterval / setImmediate additional parameters fix\n// https://html.spec.whatwg.org/multipage/timers-and-user-prompts.html#timers\n// https://github.com/oven-sh/bun/issues/1633\nmodule.exports = function (scheduler, hasTimeArg) {\n  var firstParamIndex = hasTimeArg ? 2 : 1;\n  return WRAP ? function (handler, timeout /* , ...arguments */) {\n    var boundArgs = validateArgumentsLength(arguments.length, 1) > firstParamIndex;\n    var fn = isCallable(handler) ? handler : Function(handler);\n    var params = boundArgs ? arraySlice(arguments, firstParamIndex) : [];\n    var callback = boundArgs ? function () {\n      apply(fn, this, params);\n    } : fn;\n    return hasTimeArg ? scheduler(callback, timeout) : scheduler(callback);\n  } : scheduler;\n};\n","'use strict';\nvar NATIVE_BIND = require('../internals/function-bind-native');\n\nvar FunctionPrototype = Function.prototype;\nvar call = FunctionPrototype.call;\n// eslint-disable-next-line es/no-function-prototype-bind -- safe\nvar uncurryThisWithBind = NATIVE_BIND && FunctionPrototype.bind.bind(call, call);\n\nmodule.exports = NATIVE_BIND ? uncurryThisWithBind : function (fn) {\n  return function () {\n    return call.apply(fn, arguments);\n  };\n};\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar userAgent = require('../internals/environment-user-agent');\n\nvar process = globalThis.process;\nvar Deno = globalThis.Deno;\nvar versions = process && process.versions || Deno && Deno.version;\nvar v8 = versions && versions.v8;\nvar match, version;\n\nif (v8) {\n  match = v8.split('.');\n  // in old Chrome, versions of V8 isn't V8 = Chrome / 10\n  // but their correct versions are not interesting for us\n  version = match[0] > 0 && match[0] < 4 ? 1 : +(match[0] + match[1]);\n}\n\n// BrowserFS NodeJS `process` polyfill incorrectly set `.v8` to `0.0`\n// so check `userAgent` even if `.v8` exists, but 0\nif (!version && userAgent) {\n  match = userAgent.match(/Edge\\/(\\d+)/);\n  if (!match || match[1] >= 74) {\n    match = userAgent.match(/Chrome\\/(\\d+)/);\n    if (match) version = +match[1];\n  }\n}\n\nmodule.exports = version;\n","'use strict';\nvar call = require('../internals/function-call');\nvar anObject = require('../internals/an-object');\nvar getMethod = require('../internals/get-method');\n\nmodule.exports = function (iterator, kind, value) {\n  var innerResult, innerError;\n  anObject(iterator);\n  try {\n    innerResult = getMethod(iterator, 'return');\n    if (!innerResult) {\n      if (kind === 'throw') throw value;\n      return value;\n    }\n    innerResult = call(innerResult, iterator);\n  } catch (error) {\n    innerError = true;\n    innerResult = error;\n  }\n  if (kind === 'throw') throw value;\n  if (innerError) throw innerResult;\n  anObject(innerResult);\n  return value;\n};\n","'use strict';\nvar userAgent = require('../internals/environment-user-agent');\n\n// eslint-disable-next-line redos/no-vulnerable -- safe\nmodule.exports = /(?:ipad|iphone|ipod).*applewebkit/i.test(userAgent);\n","'use strict';\nvar NATIVE_BIND = require('../internals/function-bind-native');\n\nvar call = Function.prototype.call;\n// eslint-disable-next-line es/no-function-prototype-bind -- safe\nmodule.exports = NATIVE_BIND ? call.bind(call) : function () {\n  return call.apply(call, arguments);\n};\n","'use strict';\nvar hasOwn = require('../internals/has-own-property');\nvar defineBuiltIn = require('../internals/define-built-in');\nvar dateToPrimitive = require('../internals/date-to-primitive');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_PRIMITIVE = wellKnownSymbol('toPrimitive');\nvar DatePrototype = Date.prototype;\n\n// `Date.prototype[@@toPrimitive]` method\n// https://tc39.es/ecma262/#sec-date.prototype-@@toprimitive\nif (!hasOwn(DatePrototype, TO_PRIMITIVE)) {\n  defineBuiltIn(DatePrototype, TO_PRIMITIVE, dateToPrimitive);\n}\n","'use strict';\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar toAbsoluteIndex = require('../internals/to-absolute-index');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\n\n// `Array.prototype.{ indexOf, includes }` methods implementation\nvar createMethod = function (IS_INCLUDES) {\n  return function ($this, el, fromIndex) {\n    var O = toIndexedObject($this);\n    var length = lengthOfArrayLike(O);\n    if (length === 0) return !IS_INCLUDES && -1;\n    var index = toAbsoluteIndex(fromIndex, length);\n    var value;\n    // Array#includes uses SameValueZero equality algorithm\n    // eslint-disable-next-line no-self-compare -- NaN check\n    if (IS_INCLUDES && el !== el) while (length > index) {\n      value = O[index++];\n      // eslint-disable-next-line no-self-compare -- NaN check\n      if (value !== value) return true;\n    // Array#indexOf ignores holes, Array#includes - not\n    } else for (;length > index; index++) {\n      if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0;\n    } return !IS_INCLUDES && -1;\n  };\n};\n\nmodule.exports = {\n  // `Array.prototype.includes` method\n  // https://tc39.es/ecma262/#sec-array.prototype.includes\n  includes: createMethod(true),\n  // `Array.prototype.indexOf` method\n  // https://tc39.es/ecma262/#sec-array.prototype.indexof\n  indexOf: createMethod(false)\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nObject.defineProperty(exports, \"default\", {\n    enumerable: true,\n    get: function() {\n        return resolveConfig;\n    }\n});\nconst _resolveConfig = /*#__PURE__*/ _interop_require_default(require(\"../util/resolveConfig\"));\nconst _getAllConfigs = /*#__PURE__*/ _interop_require_default(require(\"../util/getAllConfigs\"));\nfunction _interop_require_default(obj) {\n    return obj && obj.__esModule ? obj : {\n        default: obj\n    };\n}\nfunction resolveConfig(...configs) {\n    let [, ...defaultConfigs] = (0, _getAllConfigs.default)(configs[0]);\n    return (0, _resolveConfig.default)([\n        ...configs,\n        ...defaultConfigs\n    ]);\n}\n","'use strict';\nvar $ = require('../internals/export');\nvar NATIVE_SYMBOL = require('../internals/symbol-constructor-detection');\nvar fails = require('../internals/fails');\nvar getOwnPropertySymbolsModule = require('../internals/object-get-own-property-symbols');\nvar toObject = require('../internals/to-object');\n\n// V8 ~ Chrome 38 and 39 `Object.getOwnPropertySymbols` fails on primitives\n// https://bugs.chromium.org/p/v8/issues/detail?id=3443\nvar FORCED = !NATIVE_SYMBOL || fails(function () { getOwnPropertySymbolsModule.f(1); });\n\n// `Object.getOwnPropertySymbols` method\n// https://tc39.es/ecma262/#sec-object.getownpropertysymbols\n$({ target: 'Object', stat: true, forced: FORCED }, {\n  getOwnPropertySymbols: function getOwnPropertySymbols(it) {\n    var $getOwnPropertySymbols = getOwnPropertySymbolsModule.f;\n    return $getOwnPropertySymbols ? $getOwnPropertySymbols(toObject(it)) : [];\n  }\n});\n","/**\n * matchesSelector v2.0.2\n * matchesSelector( element, '.selector' )\n * MIT license\n */\n\n/*jshint browser: true, strict: true, undef: true, unused: true */\n\n( function( window, factory ) {\n  /*global define: false, module: false */\n  'use strict';\n  // universal module definition\n  if ( typeof define == 'function' && define.amd ) {\n    // AMD\n    define( factory );\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory();\n  } else {\n    // browser global\n    window.matchesSelector = factory();\n  }\n\n}( window, function factory() {\n  'use strict';\n\n  var matchesMethod = ( function() {\n    var ElemProto = window.Element.prototype;\n    // check for the standard method name first\n    if ( ElemProto.matches ) {\n      return 'matches';\n    }\n    // check un-prefixed\n    if ( ElemProto.matchesSelector ) {\n      return 'matchesSelector';\n    }\n    // check vendor prefixes\n    var prefixes = [ 'webkit', 'moz', 'ms', 'o' ];\n\n    for ( var i=0; i < prefixes.length; i++ ) {\n      var prefix = prefixes[i];\n      var method = prefix + 'MatchesSelector';\n      if ( ElemProto[ method ] ) {\n        return method;\n      }\n    }\n  })();\n\n  return function matchesSelector( elem, selector ) {\n    return elem[ matchesMethod ]( selector );\n  };\n\n}));\n","'use strict';\n// Should get iterator record of a set-like object before cloning this\n// https://bugs.webkit.org/show_bug.cgi?id=289430\nmodule.exports = function (METHOD_NAME) {\n  try {\n    // eslint-disable-next-line es/no-set -- needed for test\n    var baseSet = new Set();\n    var setLike = {\n      size: 0,\n      has: function () { return true; },\n      keys: function () {\n        // eslint-disable-next-line es/no-object-defineproperty -- needed for test\n        return Object.defineProperty({}, 'next', {\n          get: function () {\n            baseSet.clear();\n            baseSet.add(4);\n            return function () {\n              return { done: true };\n            };\n          }\n        });\n      }\n    };\n    var result = baseSet[METHOD_NAME](setLike);\n\n    return result.size === 1 && result.values().next().value === 4;\n  } catch (error) {\n    return false;\n  }\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar toIntegerOrInfinity = require('../internals/to-integer-or-infinity');\nvar thisNumberValue = require('../internals/this-number-value');\nvar $repeat = require('../internals/string-repeat');\nvar fails = require('../internals/fails');\n\nvar $RangeError = RangeError;\nvar $String = String;\nvar floor = Math.floor;\nvar repeat = uncurryThis($repeat);\nvar stringSlice = uncurryThis(''.slice);\nvar nativeToFixed = uncurryThis(1.1.toFixed);\n\nvar pow = function (x, n, acc) {\n  return n === 0 ? acc : n % 2 === 1 ? pow(x, n - 1, acc * x) : pow(x * x, n / 2, acc);\n};\n\nvar log = function (x) {\n  var n = 0;\n  var x2 = x;\n  while (x2 >= 4096) {\n    n += 12;\n    x2 /= 4096;\n  }\n  while (x2 >= 2) {\n    n += 1;\n    x2 /= 2;\n  } return n;\n};\n\nvar multiply = function (data, n, c) {\n  var index = -1;\n  var c2 = c;\n  while (++index < 6) {\n    c2 += n * data[index];\n    data[index] = c2 % 1e7;\n    c2 = floor(c2 / 1e7);\n  }\n};\n\nvar divide = function (data, n) {\n  var index = 6;\n  var c = 0;\n  while (--index >= 0) {\n    c += data[index];\n    data[index] = floor(c / n);\n    c = (c % n) * 1e7;\n  }\n};\n\nvar dataToString = function (data) {\n  var index = 6;\n  var s = '';\n  while (--index >= 0) {\n    if (s !== '' || index === 0 || data[index] !== 0) {\n      var t = $String(data[index]);\n      s = s === '' ? t : s + repeat('0', 7 - t.length) + t;\n    }\n  } return s;\n};\n\nvar FORCED = fails(function () {\n  return nativeToFixed(0.00008, 3) !== '0.000' ||\n    nativeToFixed(0.9, 0) !== '1' ||\n    nativeToFixed(1.255, 2) !== '1.25' ||\n    nativeToFixed(1000000000000000128.0, 0) !== '1000000000000000128';\n}) || !fails(function () {\n  // V8 ~ Android 4.3-\n  nativeToFixed({});\n});\n\n// `Number.prototype.toFixed` method\n// https://tc39.es/ecma262/#sec-number.prototype.tofixed\n$({ target: 'Number', proto: true, forced: FORCED }, {\n  toFixed: function toFixed(fractionDigits) {\n    var number = thisNumberValue(this);\n    var fractDigits = toIntegerOrInfinity(fractionDigits);\n    var data = [0, 0, 0, 0, 0, 0];\n    var sign = '';\n    var result = '0';\n    var e, z, j, k;\n\n    // TODO: ES2018 increased the maximum number of fraction digits to 100, need to improve the implementation\n    if (fractDigits < 0 || fractDigits > 20) throw new $RangeError('Incorrect fraction digits');\n    // eslint-disable-next-line no-self-compare -- NaN check\n    if (number !== number) return 'NaN';\n    if (number <= -1e21 || number >= 1e21) return $String(number);\n    if (number < 0) {\n      sign = '-';\n      number = -number;\n    }\n    if (number > 1e-21) {\n      e = log(number * pow(2, 69, 1)) - 69;\n      z = e < 0 ? number * pow(2, -e, 1) : number / pow(2, e, 1);\n      z *= 0x10000000000000;\n      e = 52 - e;\n      if (e > 0) {\n        multiply(data, 0, z);\n        j = fractDigits;\n        while (j >= 7) {\n          multiply(data, 1e7, 0);\n          j -= 7;\n        }\n        multiply(data, pow(10, j, 1), 0);\n        j = e - 1;\n        while (j >= 23) {\n          divide(data, 1 << 23);\n          j -= 23;\n        }\n        divide(data, 1 << j);\n        multiply(data, 1, 1);\n        divide(data, 2);\n        result = dataToString(data);\n      } else {\n        multiply(data, 0, z);\n        multiply(data, 1 << -e, 0);\n        result = dataToString(data) + repeat('0', fractDigits);\n      }\n    }\n    if (fractDigits > 0) {\n      k = result.length;\n      result = sign + (k <= fractDigits\n        ? '0.' + repeat('0', fractDigits - k) + result\n        : stringSlice(result, 0, k - fractDigits) + '.' + stringSlice(result, k - fractDigits));\n    } else {\n      result = sign + result;\n    } return result;\n  }\n});\n","/* eslint-disable */\nfunction type(value) {\n    return Object.prototype.toString\n        .call(value)\n        .replace(/^\\[object (.+)\\]$/, \"$1\")\n        .toLowerCase();\n}\nexport default {\n    isString: function (value) {\n        return type(value) === \"string\";\n    },\n    isFunction: function (value) {\n        return type(value) === \"function\";\n    },\n    isArray: function (value) {\n        return Array.isArray(value);\n    },\n    isNumber: function (value) {\n        return !this.isArray(value) && value - parseFloat(value) + 1 >= 0;\n    },\n    isDomElement: function (value) {\n        return typeof HTMLElement === \"object\" || typeof HTMLElement === \"function\"\n            ? value instanceof HTMLElement || (typeof SVGElement !== \"undefined\" && value instanceof SVGElement)\n            : value &&\n                typeof value === \"object\" &&\n                value !== null &&\n                value.nodeType === 1 &&\n                typeof value.nodeName === \"string\";\n    },\n    isNodeList: function (value) {\n        return type(value) === \"nodelist\";\n    },\n    /**\n     * Method to check if an item is an object. Date and Function are considered\n     * an object, so if you need to exclude those, please update the method accordingly.\n     *\n     * @param item - The item that needs to be checked\n     *\n     * @return {boolean} Whether or not @item is an object\n     */\n    isObject: function (value) {\n        return value === Object(value) && !Array.isArray(value) && !this.isDomElement(value) && !this.isFunction(value);\n    },\n    isAnimationDescriptor: function (obj) {\n        return obj.yoyo !== undefined;\n    },\n    isSceneDescriptor: function (obj) {\n        return obj.hook !== undefined && obj.speed === undefined;\n    },\n    isParallaxDescriptor: function (obj) {\n        return obj.hook !== undefined && obj.speed !== undefined;\n    }\n};\n//# sourceMappingURL=type.helper.js.map","/* eslint-disable */\nimport TypeHelper from \"./helpers/type.helper\";\n/**\n * BreakpointListener\n *\n * Provide information when screen size changes from/to several breakpoints.\n *\n * @param {() => void} callback\n * @param {Breakpoints} breakpoints\n */\nvar BreakpointListener = /** @class */ (function () {\n    function BreakpointListener(callback, breakpoints) {\n        var _this = this;\n        this.windowWidth = window.innerWidth;\n        this.checkView = function () {\n            var keys = Object.keys(breakpoints);\n            var screenSize = keys.slice(-1)[0];\n            for (var i = keys.length - 1; i >= 0; i--) {\n                var value = breakpoints[keys[i]];\n                if (_this.windowWidth < value) {\n                    screenSize = keys[i - 1] || \"xs\";\n                }\n            }\n            var hasChanged = _this.screenSize !== screenSize;\n            _this.screenSize = screenSize;\n            callback({\n                screenSize: _this.screenSize,\n                hasChanged: hasChanged,\n            });\n        };\n        this.listener = function () {\n            if (_this.windowWidth !== window.innerWidth) {\n                _this.windowWidth = window.innerWidth;\n                if (_this.timeout) {\n                    window.clearTimeout(_this.timeout);\n                }\n                _this.timeout = window.setTimeout(_this.checkView, 250);\n            }\n        };\n        window.addEventListener(\"resize\", this.listener);\n        this.checkView();\n    }\n    return BreakpointListener;\n}());\nexport { BreakpointListener };\n/**\n * Method to perform a deep merge of objects\n *\n * @param {Object} target - The targeted object that needs to be merged with the supplied @sources\n * @param {Array<Object>} sources - The source(s) that will be used to update the @target object\n *\n * @return {Object} The final merged object\n */\nexport function merge(target) {\n    var sources = [];\n    for (var _i = 1; _i < arguments.length; _i++) {\n        sources[_i - 1] = arguments[_i];\n    }\n    // Return the target if no sources passed\n    if (!sources.length) {\n        return target;\n    }\n    var result = target;\n    if (TypeHelper.isObject(result)) {\n        var len = sources.length;\n        for (var i = 0; i < len; i += 1) {\n            var elm = sources[i];\n            if (TypeHelper.isObject(elm)) {\n                for (var key in elm) {\n                    if (elm.hasOwnProperty(key)) {\n                        if (TypeHelper.isObject(elm[key])) {\n                            if (!result[key] || !TypeHelper.isObject(result[key])) {\n                                result[key] = {};\n                            }\n                            merge(result[key], elm[key]);\n                        }\n                        else {\n                            if (Array.isArray(result[key]) && Array.isArray(elm[key])) {\n                                // Concatenate the two arrays and remove any duplicate primitive values\n                                result[key] = Array.from(new Set(result[key].concat(elm[key])));\n                            }\n                            else {\n                                result[key] = elm[key];\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    }\n    return result;\n}\n/**\n * Method to erase properties of objects\n *\n * @param {Object} target - The targeted object that needs to be cleared\n * @param {Array<string>} properties - The properties that will be removed from the @target object\n *\n * @return {Object} The final cleared object\n */\nexport function clear(target) {\n    var properties = [];\n    for (var _i = 1; _i < arguments.length; _i++) {\n        properties[_i - 1] = arguments[_i];\n    }\n    if (properties.length) {\n        properties.forEach(function (property) {\n            delete target[property];\n        });\n    }\n    return target;\n}\n//# sourceMappingURL=utils.js.map","/* eslint-disable */\nfunction type(value) {\n    return Object.prototype.toString\n        .call(value)\n        .replace(/^\\[object (.+)\\]$/, \"$1\")\n        .toLowerCase();\n}\nexport default {\n    isString: function (value) {\n        return type(value) === \"string\";\n    },\n    isFunction: function (value) {\n        return type(value) === \"function\";\n    },\n    isArray: function (value) {\n        return Array.isArray(value);\n    },\n    isNumber: function (value) {\n        return !this.isArray(value) && value - parseFloat(value) + 1 >= 0;\n    },\n    isDomElement: function (value) {\n        return typeof HTMLElement === \"object\" || typeof HTMLElement === \"function\"\n            ? value instanceof HTMLElement || (typeof SVGElement !== \"undefined\" && value instanceof SVGElement)\n            : value &&\n                typeof value === \"object\" &&\n                value !== null &&\n                value.nodeType === 1 &&\n                typeof value.nodeName === \"string\";\n    },\n    isNodeList: function (value) {\n        return type(value) === \"nodelist\";\n    },\n};\n//# sourceMappingURL=type.js.map","import type from \"./type\";\nexport var OffsetParam;\n(function (OffsetParam) {\n    OffsetParam[\"Left\"] = \"left\";\n    OffsetParam[\"Top\"] = \"top\";\n})(OffsetParam || (OffsetParam = {}));\n// Parse float and fall back to 0.\nfunction floatval(number) {\n    return parseFloat(number) || 0;\n}\n// Get current style IE safe (otherwise IE would return calculated values for 'auto')\nfunction getComputedStyle(elem) {\n    return elem[\"currentStyle\"] ? elem[\"currentStyle\"] : window.getComputedStyle(elem);\n}\n// Get element dimension (width or height)\nfunction dimension(which, elem, outer, includeMargin) {\n    var e = elem instanceof Document ? window : elem;\n    if (e instanceof Window) {\n        includeMargin = false;\n    }\n    else if (!type.isDomElement(e)) {\n        return 0;\n    }\n    which = which.charAt(0).toUpperCase() + which.substr(1).toLowerCase();\n    var dimension = (outer ? e[\"offset\" + which] || e[\"outer\" + which] : e[\"client\" + which] || e[\"inner\" + which]) || 0;\n    if (type.isDomElement(e) && outer && includeMargin) {\n        var style = getComputedStyle(e);\n        dimension +=\n            which === \"Height\"\n                ? floatval(style.marginTop) + floatval(style.marginBottom)\n                : floatval(style.marginLeft) + floatval(style.marginRight);\n    }\n    return dimension;\n}\n// Converts 'margin-top' into 'marginTop'\nfunction camelCase(str) {\n    return str.replace(/^[^a-z]+([a-z])/g, \"$1\").replace(/-([a-z])/g, function (g) {\n        return g[1].toUpperCase();\n    });\n}\nexport default {\n    getContainer: function (selector) {\n        if (selector instanceof Window || selector instanceof Document) {\n            return selector;\n        }\n        else {\n            return this.getElements(selector)[0];\n        }\n    },\n    // FIXME: This is not entirely translated because it doesn't consider a selector with Window nor Document types, hopefully it won't need it\n    // Always returns a list of matching DOM elements, from a selector, a DOM element or an list of elements or even an array of selectors\n    getElements: function (selector) {\n        var arr = [];\n        // String selector\n        if (type.isString(selector)) {\n            try {\n                selector = Array.from(document.querySelectorAll(selector));\n            }\n            catch (e) {\n                return arr; // Invalid selector\n            }\n        }\n        // List of elements\n        if (type.isArray(selector)) {\n            for (var i = 0, ref = (arr.length = selector.length); i < ref; i++) {\n                arr[i] = type.isDomElement(selector[i]) ? selector[i] : this.getElements(selector[i]); // If not an element, try to resolve recursively\n            }\n        }\n        else if (type.isDomElement(selector)) {\n            arr = [selector]; // Only the element\n        }\n        return arr;\n    },\n    // Get scroll top value\n    getScrollTop: function (elem) {\n        return elem && elem instanceof HTMLElement ? elem.scrollTop : window.pageYOffset || 0;\n    },\n    // Get scroll left value\n    getScrollLeft: function (elem) {\n        return elem && elem instanceof HTMLElement ? elem.scrollLeft : window.pageXOffset || 0;\n    },\n    // Get element width\n    getWidth: function (elem, outer, includeMargin) {\n        return dimension(\"width\", elem, outer, includeMargin);\n    },\n    // Get element height\n    getHeight: function (elem, outer, includeMargin) {\n        return dimension(\"height\", elem, outer, includeMargin);\n    },\n    // Get element position (optionally relative to viewport)\n    getOffset: function (elem, relativeToViewport) {\n        var offset = { top: 0, left: 0 };\n        if (elem && elem instanceof HTMLElement && elem.getBoundingClientRect) {\n            // Check if available\n            var rect = elem.getBoundingClientRect();\n            offset.top = rect.top;\n            offset.left = rect.left;\n            if (!relativeToViewport) {\n                // clientRect is by default relative to viewport...\n                offset.top += this.getScrollTop();\n                offset.left += this.getScrollLeft();\n            }\n        }\n        return offset;\n    },\n    addClass: function (elem, classes) {\n        var _a;\n        if (!elem) {\n            throw new Error(\"[DomUtils] No element passed to add class\");\n        }\n        if (classes) {\n            if (elem.classList) {\n                (_a = elem.classList).add.apply(_a, classes);\n            }\n            else {\n                classes.forEach(function (classname) {\n                    elem.className += \" \" + classname;\n                });\n            }\n        }\n    },\n    removeClass: function (elem, classes) {\n        var _a;\n        if (!elem) {\n            throw new Error(\"[DomUtils] No element passed to remove class\");\n        }\n        if (classes) {\n            if (elem.classList) {\n                (_a = elem.classList).remove.apply(_a, classes);\n            }\n            else {\n                classes.forEach(function (classname) {\n                    elem.className = elem.className.replace(new RegExp(\"(^|\\\\b)\" + classname.split(\" \").join(\"|\") + \"(\\\\b|$)\", \"gi\"), \" \");\n                });\n            }\n        }\n    },\n    // If options is string -> returns css value\n    // If options is array -> returns object with css value pairs\n    // If options is object -> set new css values\n    css: function (elem, options) {\n        if (elem && options) {\n            elem = elem;\n            // String options\n            if (type.isString(options)) {\n                var property = options;\n                return getComputedStyle(elem)[camelCase(property)];\n            }\n            // List of options\n            else if (type.isArray(options)) {\n                var obj_1 = {};\n                var style_1 = getComputedStyle(elem);\n                var properties = options;\n                properties.forEach(function (property) {\n                    obj_1[property] = style_1[camelCase(property)];\n                });\n                return obj_1;\n            }\n            // Object with options\n            else {\n                var properties = options;\n                for (var property in properties) {\n                    var val = properties[property];\n                    if (val == parseFloat(val)) {\n                        val += \"px\"; // Assume pixel for seemingly numerical values\n                    }\n                    elem.style[camelCase(property)] = val;\n                }\n            }\n        }\n    },\n    extend: function () {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments[_i];\n        }\n        if (args.length > 0) {\n            var obj = args[0];\n            for (var i = 1; i < args.length; i++) {\n                if (!args[i]) {\n                    continue;\n                }\n                for (var key in args[i]) {\n                    if (args[i].hasOwnProperty(key)) {\n                        obj[key] = args[i][key];\n                    }\n                }\n            }\n            return obj;\n        }\n        return {};\n    },\n    // Check if a css display type results in margin-collapse or not\n    isMarginCollapseType: function (str) {\n        return [\"block\", \"flex\", \"list-item\", \"table\", \"-webkit-box\"].indexOf(str) > -1;\n    },\n};\n//# sourceMappingURL=dom.js.map","/******************************************************************************\nCopyright (c) Microsoft Corporation.\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\nPERFORMANCE OF THIS SOFTWARE.\n***************************************************************************** */\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\n\nvar extendStatics = function(d, b) {\n  extendStatics = Object.setPrototypeOf ||\n      ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n      function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n  return extendStatics(d, b);\n};\n\nexport function __extends(d, b) {\n  if (typeof b !== \"function\" && b !== null)\n      throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n  extendStatics(d, b);\n  function __() { this.constructor = d; }\n  d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n}\n\nexport var __assign = function() {\n  __assign = Object.assign || function __assign(t) {\n      for (var s, i = 1, n = arguments.length; i < n; i++) {\n          s = arguments[i];\n          for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n      }\n      return t;\n  }\n  return __assign.apply(this, arguments);\n}\n\nexport function __rest(s, e) {\n  var t = {};\n  for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n      t[p] = s[p];\n  if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n      for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n          if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n              t[p[i]] = s[p[i]];\n      }\n  return t;\n}\n\nexport function __decorate(decorators, target, key, desc) {\n  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n  if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n  return c > 3 && r && Object.defineProperty(target, key, r), r;\n}\n\nexport function __param(paramIndex, decorator) {\n  return function (target, key) { decorator(target, key, paramIndex); }\n}\n\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\n  function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\n  var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\n  var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\n  var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\n  var _, done = false;\n  for (var i = decorators.length - 1; i >= 0; i--) {\n      var context = {};\n      for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\n      for (var p in contextIn.access) context.access[p] = contextIn.access[p];\n      context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\n      var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\n      if (kind === \"accessor\") {\n          if (result === void 0) continue;\n          if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\n          if (_ = accept(result.get)) descriptor.get = _;\n          if (_ = accept(result.set)) descriptor.set = _;\n          if (_ = accept(result.init)) initializers.unshift(_);\n      }\n      else if (_ = accept(result)) {\n          if (kind === \"field\") initializers.unshift(_);\n          else descriptor[key] = _;\n      }\n  }\n  if (target) Object.defineProperty(target, contextIn.name, descriptor);\n  done = true;\n};\n\nexport function __runInitializers(thisArg, initializers, value) {\n  var useValue = arguments.length > 2;\n  for (var i = 0; i < initializers.length; i++) {\n      value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\n  }\n  return useValue ? value : void 0;\n};\n\nexport function __propKey(x) {\n  return typeof x === \"symbol\" ? x : \"\".concat(x);\n};\n\nexport function __setFunctionName(f, name, prefix) {\n  if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\n  return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\n};\n\nexport function __metadata(metadataKey, metadataValue) {\n  if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\n}\n\nexport function __awaiter(thisArg, _arguments, P, generator) {\n  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n  return new (P || (P = Promise))(function (resolve, reject) {\n      function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n      function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n      function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n      step((generator = generator.apply(thisArg, _arguments || [])).next());\n  });\n}\n\nexport function __generator(thisArg, body) {\n  var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\n  return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n  function verb(n) { return function (v) { return step([n, v]); }; }\n  function step(op) {\n      if (f) throw new TypeError(\"Generator is already executing.\");\n      while (g && (g = 0, op[0] && (_ = 0)), _) try {\n          if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n          if (y = 0, t) op = [op[0] & 2, t.value];\n          switch (op[0]) {\n              case 0: case 1: t = op; break;\n              case 4: _.label++; return { value: op[1], done: false };\n              case 5: _.label++; y = op[1]; op = [0]; continue;\n              case 7: op = _.ops.pop(); _.trys.pop(); continue;\n              default:\n                  if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n                  if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n                  if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n                  if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n                  if (t[2]) _.ops.pop();\n                  _.trys.pop(); continue;\n          }\n          op = body.call(thisArg, _);\n      } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n      if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n  }\n}\n\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\n  if (k2 === undefined) k2 = k;\n  var desc = Object.getOwnPropertyDescriptor(m, k);\n  if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n      desc = { enumerable: true, get: function() { return m[k]; } };\n  }\n  Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n  if (k2 === undefined) k2 = k;\n  o[k2] = m[k];\n});\n\nexport function __exportStar(m, o) {\n  for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\n}\n\nexport function __values(o) {\n  var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n  if (m) return m.call(o);\n  if (o && typeof o.length === \"number\") return {\n      next: function () {\n          if (o && i >= o.length) o = void 0;\n          return { value: o && o[i++], done: !o };\n      }\n  };\n  throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n}\n\nexport function __read(o, n) {\n  var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n  if (!m) return o;\n  var i = m.call(o), r, ar = [], e;\n  try {\n      while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n  }\n  catch (error) { e = { error: error }; }\n  finally {\n      try {\n          if (r && !r.done && (m = i[\"return\"])) m.call(i);\n      }\n      finally { if (e) throw e.error; }\n  }\n  return ar;\n}\n\n/** @deprecated */\nexport function __spread() {\n  for (var ar = [], i = 0; i < arguments.length; i++)\n      ar = ar.concat(__read(arguments[i]));\n  return ar;\n}\n\n/** @deprecated */\nexport function __spreadArrays() {\n  for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n  for (var r = Array(s), k = 0, i = 0; i < il; i++)\n      for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n          r[k] = a[j];\n  return r;\n}\n\nexport function __spreadArray(to, from, pack) {\n  if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n      if (ar || !(i in from)) {\n          if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n          ar[i] = from[i];\n      }\n  }\n  return to.concat(ar || Array.prototype.slice.call(from));\n}\n\nexport function __await(v) {\n  return this instanceof __await ? (this.v = v, this) : new __await(v);\n}\n\nexport function __asyncGenerator(thisArg, _arguments, generator) {\n  if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n  var g = generator.apply(thisArg, _arguments || []), i, q = [];\n  return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\n  function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\n  function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\n  function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\n  function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\n  function fulfill(value) { resume(\"next\", value); }\n  function reject(value) { resume(\"throw\", value); }\n  function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\n}\n\nexport function __asyncDelegator(o) {\n  var i, p;\n  return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\n  function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\n}\n\nexport function __asyncValues(o) {\n  if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n  var m = o[Symbol.asyncIterator], i;\n  return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\n  function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\n  function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\n}\n\nexport function __makeTemplateObject(cooked, raw) {\n  if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\n  return cooked;\n};\n\nvar __setModuleDefault = Object.create ? (function(o, v) {\n  Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n  o[\"default\"] = v;\n};\n\nvar ownKeys = function(o) {\n  ownKeys = Object.getOwnPropertyNames || function (o) {\n    var ar = [];\n    for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\n    return ar;\n  };\n  return ownKeys(o);\n};\n\nexport function __importStar(mod) {\n  if (mod && mod.__esModule) return mod;\n  var result = {};\n  if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\n  __setModuleDefault(result, mod);\n  return result;\n}\n\nexport function __importDefault(mod) {\n  return (mod && mod.__esModule) ? mod : { default: mod };\n}\n\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\n  if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n  if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n  return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n}\n\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\n  if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n  if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n  if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n  return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n}\n\nexport function __classPrivateFieldIn(state, receiver) {\n  if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\n  return typeof state === \"function\" ? receiver === state : state.has(receiver);\n}\n\nexport function __addDisposableResource(env, value, async) {\n  if (value !== null && value !== void 0) {\n    if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\n    var dispose, inner;\n    if (async) {\n      if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\n      dispose = value[Symbol.asyncDispose];\n    }\n    if (dispose === void 0) {\n      if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\n      dispose = value[Symbol.dispose];\n      if (async) inner = dispose;\n    }\n    if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\n    if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\n    env.stack.push({ value: value, dispose: dispose, async: async });\n  }\n  else if (async) {\n    env.stack.push({ async: true });\n  }\n  return value;\n}\n\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\n  var e = new Error(message);\n  return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\n};\n\nexport function __disposeResources(env) {\n  function fail(e) {\n    env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\n    env.hasError = true;\n  }\n  var r, s = 0;\n  function next() {\n    while (r = env.stack.pop()) {\n      try {\n        if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\n        if (r.dispose) {\n          var result = r.dispose.call(r.value);\n          if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\n        }\n        else s |= 1;\n      }\n      catch (e) {\n        fail(e);\n      }\n    }\n    if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\n    if (env.hasError) throw env.error;\n  }\n  return next();\n}\n\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\n  if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\n      return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\n          return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\n      });\n  }\n  return path;\n}\n\nexport default {\n  __extends,\n  __assign,\n  __rest,\n  __decorate,\n  __param,\n  __esDecorate,\n  __runInitializers,\n  __propKey,\n  __setFunctionName,\n  __metadata,\n  __awaiter,\n  __generator,\n  __createBinding,\n  __exportStar,\n  __values,\n  __read,\n  __spread,\n  __spreadArrays,\n  __spreadArray,\n  __await,\n  __asyncGenerator,\n  __asyncDelegator,\n  __asyncValues,\n  __makeTemplateObject,\n  __importStar,\n  __importDefault,\n  __classPrivateFieldGet,\n  __classPrivateFieldSet,\n  __classPrivateFieldIn,\n  __addDisposableResource,\n  __disposeResources,\n  __rewriteRelativeImportExtension,\n};\n","import { __spreadArray } from \"tslib\";\nvar logLevels = [\"error\", \"warn\", \"info\", \"log\"];\nvar console = window.console || {};\nconsole.log =\n    console.log ||\n        function () {\n            return undefined;\n        }; // No console log, well - do nothing then...\n// Make sure methods for all levels exist.\nfor (var i = 0; i < logLevels.length; i++) {\n    var method = logLevels[i];\n    if (!console[method]) {\n        console[method] = console.log; // Prefer .log over nothing\n    }\n}\nexport default {\n    error: function () {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments[_i];\n        }\n        this.log.apply(this, __spreadArray([1], args, false));\n    },\n    warning: function () {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments[_i];\n        }\n        this.log.apply(this, __spreadArray([2], args, false));\n    },\n    info: function () {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments[_i];\n        }\n        this.log.apply(this, __spreadArray([3], args, false));\n    },\n    verbose: function () {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments[_i];\n        }\n        this.log.apply(this, __spreadArray([4], args, false));\n    },\n    log: function () {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments[_i];\n        }\n        var logLevel = args[0];\n        if (logLevel > logLevels.length || logLevel <= 0) {\n            logLevel = logLevels.length;\n        }\n        var now = new Date();\n        var time = \"[\" +\n            (\"0\" + now.getHours()).slice(-2) +\n            \"h\" +\n            (\"0\" + now.getMinutes()).slice(-2) +\n            \"m\" +\n            (\"0\" + now.getSeconds()).slice(-2) +\n            \"s\" +\n            (\"00\" + now.getMilliseconds()).slice(-3) +\n            \"ms]\";\n        var method = logLevels[logLevel - 1];\n        var newArgs = Array.prototype.splice.call(args, 1);\n        var func = Function.prototype.bind.call(console[method], console);\n        newArgs.unshift(time);\n        func.apply(console, newArgs);\n    },\n};\n//# sourceMappingURL=logger.js.map","import Template from \"./template\";\nimport DomUtils from \"../utils/dom\";\nimport Logger from \"../utils/logger\";\nvar DEFAULT = {\n    colorStart: \"#4385f4\",\n    colorEnd: \"#ff0a16\",\n    colorTrigger: \"#4385f4\",\n};\nvar Indicator = /** @class */ (function () {\n    function Indicator(scene, options, autoIndex) {\n        this.scene = scene;\n        this.options = this.createOptions(options, autoIndex);\n        this.elemBounds = Template.bounds();\n        this.elemStart = Template.start(this.options.colorStart || DEFAULT.colorStart);\n        this.elemEnd = Template.end(this.options.colorEnd || DEFAULT.colorEnd);\n        // Prepare bounds elements\n        if (this.elemStart.firstChild && this.elemStart.firstChild.firstChild) {\n            this.elemStart.firstChild.firstChild.textContent += \" \".concat(this.options.name);\n        }\n        if (this.elemEnd.firstChild && this.elemEnd.firstChild.firstChild) {\n            this.elemEnd.firstChild.firstChild.textContent += \" \".concat(this.options.name);\n        }\n        this.elemBounds.appendChild(this.elemStart);\n        this.elemBounds.appendChild(this.elemEnd);\n        this.bounds = this.elemBounds;\n    }\n    // Add indicators to DOM\n    Indicator.prototype.add = function () {\n        var _this = this;\n        this.controller = this.scene.controller;\n        this.isVertical = this.controller.info().isVertical;\n        var isDocument = this.controller.info().isDocument;\n        // No parent supplied or doesnt exist\n        if (!this.options.parent || DomUtils.getElements(this.options.parent)[0]) {\n            if (isDocument) {\n                this.boundsContainer = document.body; // Check if window/document (then use body)\n            }\n            else if (this.controller.info().smoothScrolling) {\n                // Add indicator inside smooth scrolling container\n                this.boundsContainer = this.controller.info().container.children[0];\n            }\n            else {\n                this.boundsContainer = this.controller.info().container;\n            }\n        }\n        if (!isDocument && DomUtils.css(this.boundsContainer, \"position\") === \"static\") {\n            // Position mode needed for correct positioning of indicators\n            DomUtils.css(this.boundsContainer, { position: \"relative\" });\n        }\n        // Add listeners for updates\n        this.scene.on(\"change.plugin_addIndicators\", this.handleTriggerParamsChange.bind(this));\n        this.scene.on(\"shift.plugin_addIndicators\", this.handleBoundsParamsChange.bind(this));\n        // Updates trigger & bounds (will add elements if needed)\n        this.updateTriggerGroup();\n        this.updateBounds();\n        setTimeout(function () {\n            var _a;\n            // Do after all execution is finished otherwise sometimes size calculations are off\n            (_a = _this.controller) === null || _a === void 0 ? void 0 : _a.indicators.updateBoundsPositions(_this);\n        }, 0);\n        this.log(3, \"Added indicators\");\n    };\n    // Remove indicators from DOM\n    Indicator.prototype.remove = function () {\n        if (this.triggerGroup) {\n            // If not set there's nothing to remove\n            this.scene.off(\"change.plugin_addIndicators\", this.handleTriggerParamsChange);\n            this.scene.off(\"shift.plugin_addIndicators\", this.handleBoundsParamsChange);\n            if (this.triggerGroup.members.length > 1) {\n                // Just remove from memberlist of old group\n                var group = this.triggerGroup;\n                group.members.splice(group.members.indexOf(this), 1);\n                this.controller.indicators.updateTriggerGroupLabel(group);\n                this.controller.indicators.updateTriggerGroupPositions(group);\n                this.triggerGroup = undefined;\n            }\n            else {\n                // Remove complete group\n                this.removeTriggerGroup();\n            }\n            this.removeBounds();\n            this.log(3, \"Removed indicators\");\n        }\n    };\n    /*\n     * ----------------------------------------------------------------\n     * Internal Event Handlers\n     * ----------------------------------------------------------------\n     */\n    // Event handler for when bounds params change\n    Indicator.prototype.handleBoundsParamsChange = function () {\n        this.updateBounds();\n    };\n    // Event handler for when trigger params change\n    Indicator.prototype.handleTriggerParamsChange = function (e) {\n        if (e.what === \"triggerHook\") {\n            this.updateTriggerGroup();\n        }\n    };\n    /*\n     * ----------------------------------------------------------------\n     * Bounds (start / stop) management\n     * ----------------------------------------------------------------\n     */\n    // Adds an new bounds elements to the array and to the DOM\n    Indicator.prototype.addBounds = function () {\n        var _a, _b;\n        var isVertical = this.controller.info().isVertical;\n        // Apply stuff we didn't know before...\n        // ...to start element\n        DomUtils.css(this.elemStart.firstChild, {\n            right: isVertical ? this.options.indent : -1,\n        });\n        DomUtils.css((_a = this.elemStart.firstChild) === null || _a === void 0 ? void 0 : _a.firstChild, {\n            padding: isVertical ? \"4px 8px 6px 8px\" : \"2px 4px\",\n        });\n        // ...to end element\n        DomUtils.css(this.elemEnd, {\n            top: isVertical ? \"100%\" : \"\",\n            left: isVertical ? \"\" : \"100%\",\n        });\n        DomUtils.css(this.elemEnd.firstChild, {\n            right: isVertical ? this.options.indent : \"\",\n            bottom: isVertical ? \"\" : this.options.indent,\n        });\n        DomUtils.css((_b = this.elemEnd.firstChild) === null || _b === void 0 ? void 0 : _b.firstChild, {\n            padding: isVertical ? \"4px 8px 6px 8px\" : \"2px 4px\",\n        });\n        // Append\n        if (this.boundsContainer instanceof HTMLElement) {\n            this.boundsContainer.appendChild(this.elemBounds);\n        }\n    };\n    // Remove bounds from list and DOM\n    Indicator.prototype.removeBounds = function () {\n        if (this.elemBounds.parentNode) {\n            this.elemBounds.parentNode.removeChild(this.elemBounds);\n        }\n    };\n    // Update the start and end positions of the scene\n    Indicator.prototype.updateBounds = function () {\n        if (this.elemBounds.parentNode !== this.boundsContainer) {\n            this.addBounds(); // Add Bounds elements (start/end)\n        }\n        var css = {};\n        css[this.isVertical ? \"top\" : \"left\"] = this.scene.triggerPosition;\n        css[this.isVertical ? \"height\" : \"width\"] = this.scene.duration;\n        DomUtils.css(this.elemBounds, css);\n        var startTag = this.elemStart.firstChild;\n        var startTagBlock = startTag.children[0];\n        var startTagBackArrow = startTag.children[1];\n        var startTagFrontArrow = startTag.children[2];\n        var endTag = this.elemEnd.firstChild;\n        var endTagBlock = endTag.children[0];\n        var endTagBackArrow = endTag.children[1];\n        var endTagFrontArrow = endTag.children[2];\n        // Has duration?\n        if (this.scene.duration > 0) {\n            // Modify start tag style\n            DomUtils.css(startTag, {\n                \"align-items\": \"flex-start\",\n                transform: \"translate3d(-5px, 0, 0)\",\n            });\n            DomUtils.css(startTagBlock, {\n                \"border-top-left-radius\": \"9px\",\n                \"border-top-right-radius\": \"0\",\n                \"border-bottom-left-radius\": \"9px\",\n                \"border-bottom-right-radius\": \"11px\",\n            });\n            DomUtils.css(startTagBackArrow, {\n                top: 0,\n                transform: \"\",\n                \"border-top\": \"0 solid transparent\",\n                \"border-bottom\": \"24px solid transparent\",\n                \"border-left\": \"10px solid currentColor\",\n            });\n            DomUtils.css(startTagFrontArrow, {\n                \"margin-top\": \"2px\",\n                \"border-top\": \"0 solid transparent\",\n                \"border-bottom\": \"19px solid transparent\",\n                \"border-left\": \"8px solid #fff\",\n                \"margin-left\": \"-2px\",\n            });\n            // Modify end tag style\n            DomUtils.css(this.elemEnd, {\n                display: \"\",\n            });\n            DomUtils.css(endTag, {\n                \"align-items\": \"flex-end\",\n                transform: \"translate3d(-5px, -100%, 0)\",\n            });\n            DomUtils.css(endTagBlock, {\n                \"border-top-left-radius\": \"9px\",\n                \"border-bottom-left-radius\": \"9px\",\n                \"border-top-right-radius\": \"11px\",\n            });\n            DomUtils.css(endTagBackArrow, {\n                bottom: 0,\n                \"border-top\": \"24px solid transparent\",\n                \"border-bottom\": \"0 solid transparent\",\n                \"border-left\": \"10px solid currentColor\",\n            });\n            DomUtils.css(endTagFrontArrow, {\n                \"margin-bottom\": \"2px\",\n                \"border-top\": \"19px solid transparent\",\n                \"border-bottom\": \"0 solid transparent\",\n                \"border-left\": \"8px solid #fff\",\n                \"margin-left\": \"-2px\",\n            });\n        }\n        else {\n            // Modify start tag style\n            DomUtils.css(startTag, {\n                \"align-items\": \"center\",\n                transform: \"translate3d(-5px, -50%, 0)\",\n            });\n            DomUtils.css(startTagBlock, {\n                \"border-radius\": \"9px\",\n            });\n            DomUtils.css(startTagBackArrow, {\n                top: \"50%\",\n                transform: \"translate3d(0, -50%, 0)\",\n                \"border-top\": \"12px solid transparent\",\n                \"border-bottom\": \"12px solid transparent\",\n                \"border-left\": \"12px solid currentColor\",\n            });\n            DomUtils.css(startTagFrontArrow, {\n                \"margin-top\": \"\",\n                \"border-top\": \"10px solid transparent\",\n                \"border-bottom\": \"10px solid transparent\",\n                \"border-left\": \"9px solid #fff\",\n                \"margin-left\": \"-3px\",\n            });\n            // Hide end tag\n            DomUtils.css(this.elemEnd, {\n                display: \"none\",\n            });\n        }\n    };\n    /*\n     * ----------------------------------------------------------------\n     * Trigger and trigger group management\n     * ----------------------------------------------------------------\n     */\n    // Adds an new trigger group to the array and to the DOM\n    Indicator.prototype.addTriggerGroup = function () {\n        var _a, _b;\n        var triggerElem = Template.trigger(this.options.colorTrigger || DEFAULT.colorTrigger); // New trigger element\n        var css = {};\n        css[this.isVertical ? \"right\" : \"bottom\"] = 0;\n        DomUtils.css(triggerElem.firstChild, css);\n        DomUtils.css((_a = triggerElem.firstChild) === null || _a === void 0 ? void 0 : _a.lastChild, {\n            padding: this.isVertical ? \"4px 8px 6px 8px\" : \"3px 4px\",\n        });\n        document.body.appendChild(triggerElem); // Directly add to body\n        var newGroup = {\n            triggerHook: this.scene.triggerHook,\n            element: triggerElem,\n            members: [this],\n        };\n        (_b = this.controller.indicators.groups) === null || _b === void 0 ? void 0 : _b.push(newGroup);\n        this.triggerGroup = newGroup;\n        // Update right away\n        this.controller.indicators.updateTriggerGroupLabel(newGroup);\n        this.controller.indicators.updateTriggerGroupPositions(newGroup);\n    };\n    Indicator.prototype.removeTriggerGroup = function () {\n        var _a, _b, _c, _d, _e;\n        if (this.triggerGroup) {\n            (_a = this.controller.indicators.groups) === null || _a === void 0 ? void 0 : _a.splice((_b = this.controller.indicators.groups) === null || _b === void 0 ? void 0 : _b.indexOf(this.triggerGroup), 1);\n        }\n        (_d = (_c = this.triggerGroup) === null || _c === void 0 ? void 0 : _c.element.parentNode) === null || _d === void 0 ? void 0 : _d.removeChild((_e = this.triggerGroup) === null || _e === void 0 ? void 0 : _e.element);\n        this.triggerGroup = undefined;\n    };\n    // Updates the trigger group -> either join existing or add new one\n    /*\n     * Logic:\n     * 1 if a trigger group exist, check if it's in sync with Scene settings – if so, nothing else needs to happen\n     * 2 try to find an existing one that matches Scene parameters\n     * \t 2.1 If a match is found check if already assigned to an existing group\n     *\t\t\t If so:\n     *       A: it was the last member of existing group -> kill whole group\n     *       B: the existing group has other members -> just remove from member list\n     *\t 2.2 Assign to matching group\n     * 3 if no new match could be found, check if assigned to existing group\n     *   A: yes, and it's the only member -> just update parameters and positions and keep using this group\n     *   B: yes but there are other members -> remove from member list and create a new one\n     *   C: no, so create a new one\n     */\n    Indicator.prototype.updateTriggerGroup = function () {\n        var _a;\n        var triggerHook = this.scene.triggerHook;\n        var closeEnough = 0.0001;\n        // Have a group, check if it still matches\n        if (this.triggerGroup) {\n            if (Math.abs(((_a = this.triggerGroup) === null || _a === void 0 ? void 0 : _a.triggerHook) - triggerHook) < closeEnough) {\n                // Logger.log(0, \"trigger\", options.name, \"->\", \"no need to change, still in sync\");\n                return; // all good\n            }\n        }\n        // Don't have a group, check if a matching one exists\n        // Logger.log(0, \"trigger\", options.name, \"->\", \"out of sync!\");\n        var groups = this.controller.indicators.groups || [];\n        var i = groups === null || groups === void 0 ? void 0 : groups.length;\n        var group;\n        while (i--) {\n            group = groups[i];\n            if (Math.abs(group.triggerHook - triggerHook) < closeEnough) {\n                // found a match!\n                // Logger.log(0, \"trigger\", options.name, \"->\", \"found match\");\n                if (this.triggerGroup) {\n                    // do I have an old group that is out of sync?\n                    if (this.triggerGroup.members.length === 1) {\n                        // is it the only remaining group?\n                        // Logger.log(0, \"trigger\", options.name, \"->\", \"kill\");\n                        // was the last member, remove the whole group\n                        this.removeTriggerGroup();\n                    }\n                    else {\n                        this.triggerGroup.members.splice(this.triggerGroup.members.indexOf(this), 1); // Just remove from memberlist of old group\n                        this.controller.indicators.updateTriggerGroupLabel(this.triggerGroup);\n                        this.controller.indicators.updateTriggerGroupPositions(this.triggerGroup);\n                        // Logger.log(0, \"trigger\", options.name, \"->\", \"removing from previous member list\");\n                    }\n                }\n                // Join new group\n                group.members.push(this);\n                this.triggerGroup = group;\n                this.controller.indicators.updateTriggerGroupLabel(group);\n                return;\n            }\n        }\n        // At this point I am obviously out of sync and don't match any other group\n        if (this.triggerGroup) {\n            if (this.triggerGroup.members.length === 1) {\n                // Logger.log(0, \"trigger\", options.name, \"->\", \"updating existing\");\n                // out of sync but i'm the only member => just change and update\n                this.triggerGroup.triggerHook = triggerHook;\n                this.controller.indicators.updateTriggerGroupPositions(this.triggerGroup);\n                return;\n            }\n            else {\n                // Logger.log(0, \"trigger\", options.name, \"->\", \"removing from previous member list\");\n                this.triggerGroup.members.splice(this.triggerGroup.members.indexOf(this), 1); // Just remove from memberlist of old group\n                this.controller.indicators.updateTriggerGroupLabel(this.triggerGroup);\n                this.controller.indicators.updateTriggerGroupPositions(this.triggerGroup);\n                this.triggerGroup = undefined; // Need a brand new group...\n            }\n        }\n        // Logger.log(0, \"trigger\", options.name, \"->\", \"add a new one\")\n        // Did not find any match, make new trigger group\n        this.addTriggerGroup();\n    };\n    /**\n     * Send a debug message to the console.\n     *\n     * @param {number} loglevel - The loglevel required to initiate output for the message.\n     * @param {...mixed} output - One or more variables that should be passed to the console.\n     */\n    Indicator.prototype.log = function (logLevel) {\n        var args = [];\n        for (var _i = 1; _i < arguments.length; _i++) {\n            args[_i - 1] = arguments[_i];\n        }\n        if (this.scene.logLevel && this.scene.logLevel >= logLevel) {\n            Array.prototype.splice.call(args, 1, 0, \"(INDICATOR) ->\");\n            Logger.log.apply(window, args);\n        }\n    };\n    Indicator.prototype.createOptions = function (options, autoIndex) {\n        var newOptions = {\n            name: \"No Name\",\n            colorStart: DEFAULT.colorStart,\n            colorEnd: DEFAULT.colorEnd,\n            colorTrigger: DEFAULT.colorTrigger,\n            parent: undefined,\n            indent: 0,\n        };\n        if ((options === null || options === void 0 ? void 0 : options.name) !== undefined) {\n            newOptions.name = options === null || options === void 0 ? void 0 : options.name;\n        }\n        else if (autoIndex !== undefined) {\n            newOptions.name = \"\".concat(autoIndex);\n        }\n        if ((options === null || options === void 0 ? void 0 : options.colorStart) !== undefined) {\n            newOptions.colorStart = options.colorStart;\n        }\n        if ((options === null || options === void 0 ? void 0 : options.colorEnd) !== undefined) {\n            newOptions.colorEnd = options.colorEnd;\n        }\n        if ((options === null || options === void 0 ? void 0 : options.colorTrigger) !== undefined) {\n            newOptions.colorTrigger = options.colorTrigger;\n        }\n        if ((options === null || options === void 0 ? void 0 : options.parent) !== undefined) {\n            newOptions.parent = options.parent;\n        }\n        if ((options === null || options === void 0 ? void 0 : options.indent) !== undefined) {\n            newOptions.indent = options.indent;\n        }\n        return newOptions;\n    };\n    Indicator.FONT_SIZE = \"14px\";\n    Indicator.LINE_HEIGHT = \"16px\";\n    Indicator.ZINDEX = \"9999\";\n    Indicator.EDGE_OFFSET = 0;\n    return Indicator;\n}());\nexport default Indicator;\n//# sourceMappingURL=index.js.map","import domUtils from \"../utils/dom\";\nimport Indicator from \".\";\nexport default {\n    start: function (color) {\n        var tagBackArrow = document.createElement(\"div\");\n        domUtils.css(tagBackArrow, {\n            width: 0,\n            height: 0,\n            position: \"absolute\",\n            right: \"-3px\",\n            \"z-index\": -1,\n        });\n        var tagFrontArrow = document.createElement(\"div\");\n        domUtils.css(tagFrontArrow, {\n            width: 0,\n            height: 0,\n            position: \"relative\",\n            \"z-index\": 2,\n        });\n        var tagBlock = document.createElement(\"div\");\n        tagBlock.textContent = \"start\";\n        domUtils.css(tagBlock, {\n            \"font-family\": \"Arial, sans-serif\",\n            \"font-weight\": \"bold\",\n            \"font-size\": Indicator.FONT_SIZE,\n            \"line-height\": Indicator.LINE_HEIGHT,\n            \"background-color\": \"#fff\",\n            color: \"currentColor\",\n            border: \"2px solid white\",\n            \"box-shadow\": \"4px 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.1)\",\n            \"border-color\": \"currentColor\",\n        });\n        var tag = document.createElement(\"div\");\n        domUtils.css(tag, {\n            position: \"absolute\",\n            overflow: \"visible\",\n            display: \"flex\",\n            color: color,\n        });\n        tag.appendChild(tagBlock);\n        tag.appendChild(tagBackArrow);\n        tag.appendChild(tagFrontArrow);\n        var elem = document.createElement(\"div\");\n        domUtils.css(elem, {\n            position: \"absolute\",\n            overflow: \"visible\",\n            width: 0,\n            height: 0,\n        });\n        elem.appendChild(tag);\n        return elem;\n    },\n    end: function (color) {\n        var tagBackArrow = document.createElement(\"div\");\n        domUtils.css(tagBackArrow, {\n            width: 0,\n            height: 0,\n            position: \"absolute\",\n            right: \"-3px\",\n            \"z-index\": -1,\n        });\n        var tagFrontArrow = document.createElement(\"div\");\n        domUtils.css(tagFrontArrow, {\n            width: 0,\n            height: 0,\n            position: \"relative\",\n            \"z-index\": 2,\n        });\n        var tagBlock = document.createElement(\"div\");\n        tagBlock.textContent = \"end\";\n        domUtils.css(tagBlock, {\n            \"font-family\": \"Arial, sans-serif\",\n            \"font-weight\": \"bold\",\n            \"font-size\": Indicator.FONT_SIZE,\n            \"line-height\": Indicator.LINE_HEIGHT,\n            \"background-color\": \"#fff\",\n            color: \"currentColor\",\n            border: \"2px solid white\",\n            \"box-shadow\": \"4px 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.1)\",\n            \"border-color\": \"currentColor\",\n        });\n        var tag = document.createElement(\"div\");\n        domUtils.css(tag, {\n            position: \"absolute\",\n            overflow: \"visible\",\n            display: \"flex\",\n            color: color,\n        });\n        tag.appendChild(tagBlock);\n        tag.appendChild(tagBackArrow);\n        tag.appendChild(tagFrontArrow);\n        var elem = document.createElement(\"div\");\n        domUtils.css(elem, {\n            position: \"absolute\",\n            overflow: \"visible\",\n            width: 0,\n            height: 0,\n        });\n        elem.appendChild(tag);\n        return elem;\n    },\n    bounds: function () {\n        var elem = document.createElement(\"div\");\n        domUtils.css(elem, {\n            position: \"absolute\",\n            overflow: \"visible\",\n            \"white-space\": \"nowrap\",\n            \"pointer-events\": \"none\",\n            \"font-size\": Indicator.FONT_SIZE,\n        });\n        elem.style.zIndex = Indicator.ZINDEX;\n        return elem;\n    },\n    trigger: function (color) {\n        var tagBackArrow = document.createElement(\"div\");\n        domUtils.css(tagBackArrow, {\n            width: 0,\n            height: 0,\n            position: \"absolute\",\n            left: \"-3px\",\n            \"z-index\": -1,\n        });\n        var tagFrontArrow = document.createElement(\"div\");\n        domUtils.css(tagFrontArrow, {\n            width: 0,\n            height: 0,\n            position: \"relative\",\n            \"z-index\": 2,\n        });\n        var tagBlock = document.createElement(\"div\");\n        tagBlock.textContent = \"trigger\";\n        domUtils.css(tagBlock, {\n            \"font-family\": \"Arial, sans-serif\",\n            \"font-weight\": \"bold\",\n            \"font-size\": Indicator.FONT_SIZE,\n            \"line-height\": Indicator.LINE_HEIGHT,\n            \"background-color\": color,\n            color: \"#fff\",\n            border: \"2px solid white\",\n            \"box-shadow\": \"4px 4px 6px -1px rgba(0, 0, 0, 0.2), 0 2px 4px -1px rgba(0, 0, 0, 0.2)\",\n        });\n        var tag = document.createElement(\"div\");\n        domUtils.css(tag, {\n            position: \"absolute\",\n            overflow: \"visible\",\n            display: \"flex\",\n        });\n        tag.appendChild(tagBackArrow);\n        tag.appendChild(tagFrontArrow);\n        tag.appendChild(tagBlock);\n        var elem = document.createElement(\"div\");\n        domUtils.css(elem, {\n            position: \"fixed\",\n            overflow: \"visible\",\n            \"white-space\": \"nowrap\",\n            \"pointer-events\": \"none\",\n            color: color,\n        });\n        elem.style.zIndex = Indicator.ZINDEX;\n        elem.appendChild(tag);\n        return elem;\n    },\n};\n//# sourceMappingURL=template.js.map","// Implementation of requestAnimationFrame\n// based on https://gist.github.com/paulirish/1579671\nvar vendors = [\"ms\", \"moz\", \"webkit\", \"o\"];\nvar lastTime = 0;\nvar _requestAnimationFrame = window.requestAnimationFrame;\nvar _cancelAnimationFrame = window.cancelAnimationFrame;\n// Try vendor prefixes if the above doesn't work\nfor (var i = 0; !_requestAnimationFrame && i < vendors.length; ++i) {\n    _requestAnimationFrame = window[vendors[i] + \"RequestAnimationFrame\"];\n    _cancelAnimationFrame =\n        window[vendors[i] + \"CancelAnimationFrame\"] || window[vendors[i] + \"CancelRequestAnimationFrame\"];\n}\n// Fallbacks\nif (!_requestAnimationFrame) {\n    _requestAnimationFrame = function (callback) {\n        var currTime = new Date().getTime(), timeToCall = Math.max(0, 16 - (currTime - lastTime)), id = window.setTimeout(function () {\n            callback(currTime + timeToCall);\n        }, timeToCall);\n        lastTime = currTime + timeToCall;\n        return id;\n    };\n}\nif (!_cancelAnimationFrame) {\n    _cancelAnimationFrame = function (id) {\n        window.clearTimeout(id);\n    };\n}\nexport default {\n    rAF: _requestAnimationFrame.bind(window),\n    cAF: _cancelAnimationFrame.bind(window),\n};\n//# sourceMappingURL=animation.js.map","var SceneEvent = /** @class */ (function () {\n    function SceneEvent(type, namespace, target, vars) {\n        this.type = type;\n        this.namespace = namespace;\n        this.target = target;\n        this.currentTarget = target;\n        this.vars = vars;\n        this.timestamp = Date.now();\n    }\n    return SceneEvent;\n}());\nexport default SceneEvent;\n//# sourceMappingURL=scene-event.js.map","import Indicator from \"./indicator\";\nimport DomUtils from \"./utils/dom\";\nimport Logger from \"./utils/logger\";\nimport Type from \"./utils/type\";\nimport AnimationUtils from \"./utils/animation\";\nimport Scene from \"./scene\";\nimport SceneEvent from \"./scene-event\";\nexport var ScrollDirection;\n(function (ScrollDirection) {\n    ScrollDirection[\"Forward\"] = \"FORWARD\";\n    ScrollDirection[\"Paused\"] = \"PAUSED\";\n    ScrollDirection[\"Reverse\"] = \"REVERSE\";\n})(ScrollDirection || (ScrollDirection = {}));\nvar Controller = /** @class */ (function () {\n    function Controller(options) {\n        var _this = this;\n        this._scrollPos = 0;\n        this.isDocument = true;\n        this.updateScenesOnNextCycle = false;\n        this.scrollDirection = ScrollDirection.Paused;\n        this.sceneObjects = [];\n        this.enabled = true;\n        this.setOptions(options);\n        // Check ScrollContainer\n        // if (!this.container) {\n        //   this.log(1, \"ERROR creating object \" + Controller.NAMESPACE + \": No valid scroll container supplied\")\n        //   throw Controller.NAMESPACE + \" init failed.\" // cancel\n        // }\n        // Update container size immediately\n        this.viewPortSize = this.getViewportSize();\n        // Set event handlers\n        this.container.addEventListener(\"resize\", this.onChange.bind(this));\n        this.container.addEventListener(\"scroll\", this.onChange.bind(this));\n        this.scheduleRefresh();\n        this.log(3, \"Added new \" + Controller.NAMESPACE + \" controller\");\n        // Debug plugin\n        this.container.addEventListener(\"resize\", this.handleTriggerPositionChange.bind(this));\n        if (!this.isDocument) {\n            window.addEventListener(\"resize\", this.handleTriggerPositionChange.bind(this));\n            window.addEventListener(\"scroll\", this.handleTriggerPositionChange.bind(this));\n        }\n        // Update all related bounds containers\n        this.container.addEventListener(\"resize\", this.handleBoundsPositionChange.bind(this));\n        this.container.addEventListener(\"scroll\", this.handleBoundsPositionChange.bind(this));\n        this.indicators = {\n            groups: [],\n            // Updates the position of the bounds container to aligned to the right for vertical containers and to the bottom for horizontal\n            updateBoundsPositions: function (specificIndicator) {\n                // Create a group with only one element or use all\n                var groups;\n                if (specificIndicator && specificIndicator.triggerGroup) {\n                    var indicator = specificIndicator;\n                    if (indicator.triggerGroup) {\n                        indicator.triggerGroup.members = [specificIndicator];\n                    }\n                    groups = [indicator.triggerGroup];\n                }\n                else {\n                    groups = _this.indicators.groups;\n                }\n                if (groups) {\n                    var g = groups.length;\n                    var css = {};\n                    var paramPos = _this.isVertical ? \"left\" : \"top\";\n                    var edge = _this.isVertical\n                        ? DomUtils.getScrollLeft(_this.container) + DomUtils.getWidth(_this.container) - Indicator.EDGE_OFFSET\n                        : DomUtils.getScrollTop(_this.container) + DomUtils.getHeight(_this.container) - Indicator.EDGE_OFFSET;\n                    var b = void 0;\n                    var triggerSize = void 0;\n                    var group = void 0;\n                    while (g--) {\n                        // Group loop\n                        group = groups[g];\n                        b = group.members.length;\n                        triggerSize = _this.isVertical\n                            ? DomUtils.getWidth(group.element.firstChild)\n                            : DomUtils.getHeight(group.element.firstChild);\n                        while (b--) {\n                            // Indicators loop\n                            css[paramPos] = edge - triggerSize;\n                            DomUtils.css(group.members[b].bounds, css);\n                        }\n                    }\n                }\n            },\n            // Updates the position of the bounds container to aligned to the right for vertical containers and to the bottom for horizontal\n            updateTriggerGroupPositions: function (specificGroup) {\n                var groups = specificGroup ? [specificGroup] : _this.indicators.groups;\n                if (groups) {\n                    var container = _this.isDocument ? document.body : _this.container;\n                    var containerOffset = _this.isDocument ? { top: 0, left: 0 } : DomUtils.getOffset(container, true);\n                    var edge = _this.isVertical\n                        ? DomUtils.getWidth(_this.container) - Indicator.EDGE_OFFSET\n                        : DomUtils.getHeight(_this.container) - Indicator.EDGE_OFFSET;\n                    var group = void 0;\n                    var elem = void 0;\n                    var pos = void 0;\n                    var transform = void 0;\n                    var tag = void 0;\n                    var tagBackArrow = void 0;\n                    var tagFrontArrow = void 0;\n                    var tagBlock = void 0;\n                    var i = groups.length;\n                    while (i--) {\n                        group = groups[i];\n                        elem = group.element;\n                        pos = group.triggerHook * _this.info().size;\n                        tag = elem.firstChild;\n                        tagBackArrow = elem.firstChild.children[0];\n                        tagFrontArrow = elem.firstChild.children[1];\n                        tagBlock = elem.firstChild.children[2];\n                        // Indicator on top\n                        if (group.triggerHook == 0) {\n                            transform = \"translate\".concat(_this.isVertical ? \"Y\" : \"X\", \"(0%)\");\n                            DomUtils.css(tag, {\n                                \"align-items\": \"flex-start\",\n                            });\n                            DomUtils.css(tagBackArrow, {\n                                top: 0,\n                                \"border-top\": \"0 solid transparent\",\n                                \"border-bottom\": \"24px solid transparent\",\n                                \"border-right\": \"10px solid white\",\n                            });\n                            DomUtils.css(tagFrontArrow, {\n                                \"margin-top\": \"2px\",\n                                \"border-top\": \"0 solid transparent\",\n                                \"border-bottom\": \"19px solid transparent\",\n                                \"border-right\": \"8px solid currentColor\",\n                                \"margin-right\": \"-2px\",\n                            });\n                            DomUtils.css(tagBlock, {\n                                \"border-top-right-radius\": \"9px\",\n                                \"border-bottom-right-radius\": \"9px\",\n                                \"border-bottom-left-radius\": \"11px\",\n                            });\n                        }\n                        // Indicator on bottom\n                        else if (group.triggerHook == 1) {\n                            transform = \"translate\".concat(_this.isVertical ? \"Y\" : \"X\", \"(-100%)\");\n                            DomUtils.css(tag, {\n                                \"align-items\": \"flex-end\",\n                            });\n                            DomUtils.css(tagBackArrow, {\n                                bottom: 0,\n                                \"border-top\": \"24px solid transparent\",\n                                \"border-bottom\": \"0 solid transparent\",\n                                \"border-right\": \"10px solid white\",\n                            });\n                            DomUtils.css(tagFrontArrow, {\n                                \"margin-bottom\": \"2px\",\n                                \"border-top\": \"19px solid transparent\",\n                                \"border-bottom\": \"0 solid transparent\",\n                                \"border-right\": \"8px solid currentColor\",\n                                \"margin-right\": \"-2px\",\n                            });\n                            DomUtils.css(tagBlock, {\n                                \"border-top-right-radius\": \"9px\",\n                                \"border-bottom-right-radius\": \"9px\",\n                                \"border-top-left-radius\": \"11px\",\n                            });\n                        }\n                        // Indicator between\n                        else {\n                            transform = \"translate\".concat(_this.isVertical ? \"Y\" : \"X\", \"(-50%)\");\n                            DomUtils.css(tag, {\n                                \"align-items\": \"center\",\n                            });\n                            DomUtils.css(tagBackArrow, {\n                                top: \"50%\",\n                                transform: \"translate3d(0, -50%, 0)\",\n                                \"border-top\": \"12px solid transparent\",\n                                \"border-bottom\": \"12px solid transparent\",\n                                \"border-right\": \"12px solid white\",\n                            });\n                            DomUtils.css(tagFrontArrow, {\n                                \"border-top\": \"10px solid transparent\",\n                                \"border-bottom\": \"10px solid transparent\",\n                                \"border-right\": \"9px solid currentColor\",\n                                \"margin-right\": \"-3px\",\n                            });\n                            DomUtils.css(tagBlock, {\n                                \"border-radius\": \"9px\",\n                            });\n                        }\n                        DomUtils.css(elem, {\n                            top: containerOffset.top + (_this.isVertical ? pos : edge - group.members[0].options.indent),\n                            left: containerOffset.left + (_this.isVertical ? edge - group.members[0].options.indent : pos),\n                        });\n                        DomUtils.css(elem.firstChild, {\n                            \"-ms-transform\": transform,\n                            \"-webkit-transform\": transform,\n                            transform: transform,\n                        });\n                    }\n                }\n            },\n            // Updates the label for the group to contain the name, if it only has one member\n            updateTriggerGroupLabel: function (group) {\n                var _a;\n                if (group) {\n                    var text = \"trigger\".concat(group.members.length > 1 ? \"\" : \" \" + group.members[0].options.name);\n                    var elem = (_a = group.element.firstChild) === null || _a === void 0 ? void 0 : _a.lastChild;\n                    var doUpdate = (elem === null || elem === void 0 ? void 0 : elem.textContent) !== text;\n                    if (doUpdate) {\n                        if (elem) {\n                            elem.textContent = text;\n                        }\n                        if (_this.isVertical) {\n                            // Bounds position is dependent on text length, so update\n                            _this.indicators.updateBoundsPositions();\n                        }\n                    }\n                }\n            },\n        };\n    }\n    Object.defineProperty(Controller.prototype, \"scrollbar\", {\n        get: function () {\n            return this._scrollbar;\n        },\n        set: function (newValue) {\n            if (this._scrollbar && this.scrollbarListener) {\n                this._scrollbar.removeListener(this.scrollbarListener);\n                this.scrollbarListener = undefined;\n            }\n            else {\n                this.scrollbarListener = this.onChange.bind(this);\n                this._scrollbar = newValue;\n                if (this._scrollbar && this.scrollbarListener) {\n                    this._scrollbar.addListener(this.scrollbarListener);\n                }\n            }\n        },\n        enumerable: false,\n        configurable: true\n    });\n    /**\n     * Schedule the next execution of the refresh function\n     */\n    Controller.prototype.scheduleRefresh = function () {\n        if (this.refreshInterval > 0) {\n            this.refreshTimeout = window.setTimeout(this.refresh.bind(this), this.refreshInterval);\n        }\n    };\n    /**\n     * Default function to get scroll pos - overwriteable using `Controller.scrollPos(newFunction)`\n     */\n    Controller.prototype.getScrollPos = function () {\n        if (this.smoothScrolling && this.scrollbar) {\n            return this.isVertical ? this.scrollbar.offset.y : this.scrollbar.offset.x;\n        }\n        return this.isVertical ? DomUtils.getScrollTop(this.container) : DomUtils.getScrollLeft(this.container);\n    };\n    /**\n     * Returns the current viewport Size (width vor horizontal, height for vertical)\n     */\n    Controller.prototype.getViewportSize = function () {\n        return this.isVertical ? DomUtils.getHeight(this.container) : DomUtils.getWidth(this.container);\n    };\n    /**\n     * Default function to set scroll pos - overwriteable using `Controller.scrollTo(newFunction)`\n     *\n     * Made available publicly for pinned mousewheel workaround.\n     */\n    Controller.prototype.setScrollPos = function (pos) {\n        if (this.isVertical) {\n            if (this.isDocument) {\n                window.scrollTo(DomUtils.getScrollLeft(), pos);\n            }\n            else {\n                var container = this.container;\n                container.scrollTop = pos;\n            }\n        }\n        else {\n            if (this.isDocument) {\n                window.scrollTo(pos, DomUtils.getScrollTop());\n            }\n            else {\n                var container = this.container;\n                container.scrollLeft = pos;\n            }\n        }\n    };\n    /**\n     * Handle updates in cycles instead of on scroll (performance)\n     */\n    Controller.prototype.updateScenes = function () {\n        var _this = this;\n        if (this.enabled && this.updateScenesOnNextCycle) {\n            // Determine scenes to update\n            var scenesToUpdate_1 = Type.isArray(this.updateScenesOnNextCycle)\n                ? this.updateScenesOnNextCycle\n                : this.sceneObjects.slice(0);\n            // Reset scenes\n            this.updateScenesOnNextCycle = false;\n            // Update scroll pos now instead of onChange, as it might have changed since scheduling (i.e. in-browser smooth scroll)\n            var oldScrollPos = this._scrollPos;\n            this._scrollPos = this.scrollPos();\n            var deltaScroll = this._scrollPos - oldScrollPos;\n            if (deltaScroll !== 0) {\n                // scroll position changed?\n                this.scrollDirection = deltaScroll > 0 ? ScrollDirection.Forward : ScrollDirection.Reverse;\n            }\n            // Reverse order of scenes if scrolling reverse\n            if (this.scrollDirection === ScrollDirection.Reverse) {\n                scenesToUpdate_1.reverse();\n            }\n            // Update scenes\n            scenesToUpdate_1.forEach(function (scene, index) {\n                _this.log(3, \"Updating Scene \" + (index + 1) + \"/\" + scenesToUpdate_1.length + \" (\" + _this.sceneObjects.length + \" total)\");\n                scene.update(true);\n            });\n            if (scenesToUpdate_1.length === 0 && this.logLevel >= 3) {\n                this.log(3, \"Updating 0 Scenes (nothing added to controller)\");\n            }\n        }\n    };\n    /**\n     * Initializes rAF callback\n     */\n    Controller.prototype.debounceUpdate = function () {\n        this.updateTimeout = AnimationUtils.rAF(this.updateScenes.bind(this));\n    };\n    /**\n     * Handles Container changes\n     */\n    Controller.prototype.onChange = function (e) {\n        this.log(3, \"Event fired causing an update:\", e === null || e === void 0 ? void 0 : e.type);\n        if ((e === null || e === void 0 ? void 0 : e.type) == \"resize\") {\n            // Resize\n            this.viewPortSize = this.getViewportSize();\n            this.scrollDirection = ScrollDirection.Paused;\n        }\n        // Schedule update\n        if (this.updateScenesOnNextCycle !== true) {\n            this.updateScenesOnNextCycle = true;\n            this.debounceUpdate();\n        }\n    };\n    Controller.prototype.refresh = function () {\n        if (!this.isDocument) {\n            // Simulate resize event. Only works for viewport relevant param (performance)\n            if (this.viewPortSize != this.getViewportSize()) {\n                var resizeEvent = void 0;\n                try {\n                    resizeEvent = new Event(\"resize\", { bubbles: false, cancelable: false });\n                }\n                catch (e) {\n                    // stupid IE\n                    resizeEvent = document.createEvent(\"Event\");\n                    resizeEvent.initEvent(\"resize\", false, false);\n                }\n                this.container.dispatchEvent(resizeEvent);\n            }\n        }\n        this.sceneObjects.forEach(function (scene) {\n            // Refresh all scenes\n            scene.refresh();\n        });\n        this.scheduleRefresh();\n    };\n    /**\n     * Send a debug message to the console.\n     *\n     * @param {...args[]} args - One or more variables that should be passed to the console.\n     */\n    Controller.prototype.log = function () {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments[_i];\n        }\n        var logLevel = args[0];\n        if (this.logLevel >= logLevel) {\n            Array.prototype.splice.call(args, 1, 0, \"(\".concat(Scene.NAMESPACE, \")\"));\n            Logger.log.apply(window, args);\n        }\n    };\n    /**\n     * Sort scenes in ascending order of their start offset.\n     *\n     * @param {Scene[]} scenesList - an array of ScrollMagic Scenes that should be sorted\n     *\n     * @return {Scene[]} The sorted array of Scenes.\n     */\n    Controller.prototype.sortScenes = function (scenesList) {\n        if (scenesList.length <= 1) {\n            return scenesList;\n        }\n        else {\n            var scenes = scenesList.slice(0);\n            scenes.sort(function (a, b) {\n                return a.scrollOffset > b.scrollOffset ? 1 : -1;\n            });\n            return scenes;\n        }\n    };\n    Controller.prototype.setOptions = function (options) {\n        var newOptions = {\n            container: window,\n            isVertical: true,\n            globalSceneOptions: {},\n            logLevel: 2,\n            refreshInterval: 100,\n            addIndicators: false,\n            smoothScrolling: false,\n        };\n        if (options) {\n            if (options.container !== undefined) {\n                newOptions.container = options.container;\n            }\n            if (options.isVertical !== undefined) {\n                newOptions.isVertical = options.isVertical;\n            }\n            if (options.globalSceneOptions !== undefined) {\n                newOptions.globalSceneOptions = options.globalSceneOptions;\n            }\n            if (options.logLevel !== undefined) {\n                newOptions.logLevel = options.logLevel;\n            }\n            if (options.refreshInterval !== undefined) {\n                newOptions.refreshInterval = options.refreshInterval;\n            }\n            if (options.addIndicators !== undefined) {\n                newOptions.addIndicators = options.addIndicators;\n            }\n            if (options.smoothScrolling !== undefined) {\n                newOptions.smoothScrolling = options.smoothScrolling;\n            }\n        }\n        var container = DomUtils.getContainer(newOptions.container);\n        this.isDocument = container instanceof Window || container === document.body || !document.body.contains(container);\n        if (this.isDocument) {\n            this.container = window;\n        }\n        else if (container instanceof Window) {\n            this.container = container;\n        }\n        else {\n            this.container = container;\n        }\n        this.isVertical = newOptions.isVertical;\n        this.globalSceneOptions = newOptions.globalSceneOptions;\n        this.logLevel = newOptions.logLevel;\n        this.refreshInterval = newOptions.refreshInterval;\n        this.addIndicators = newOptions.addIndicators;\n        this.smoothScrolling = newOptions.smoothScrolling;\n    };\n    Controller.prototype.handleBoundsPositionChange = function () {\n        this.indicators.updateBoundsPositions();\n    };\n    Controller.prototype.handleTriggerPositionChange = function () {\n        this.indicators.updateTriggerGroupPositions();\n    };\n    /**\n     * ----------------------------------------------------------------\n     * Public functions\n     * ----------------------------------------------------------------\n     */\n    /**\n     * Add one ore more scene(s) to the controller.\n     *\n     * This is the equivalent to `Scene.addTo(controller)`.\n     *\n     * @example\n     * // With a previously defined scene\n     * controller.addScene(scene)\n     *\n     * // With a newly created scene.\n     * controller.addScene(new Scene({duration : 0}))\n     *\n     * // Adding multiple scenes\n     * controller.addScene([scene, scene2, new Scene({duration : 0})])\n     *\n     * @param {(Scene|array)} newScene - Scene or Array of Scenes to be added to the controller.\n     *\n     * @return {Controller} Parent object for chaining.\n     */\n    Controller.prototype.addScene = function (newScene) {\n        var _this = this;\n        if (Type.isArray(newScene)) {\n            var scenes = newScene;\n            scenes.forEach(function (scene) {\n                _this.addScene(scene);\n            });\n        }\n        else {\n            var scene = newScene;\n            if (scene.controller !== this) {\n                scene.addTo(this);\n            }\n            else if (this.sceneObjects.indexOf(scene) < 0) {\n                // New scene\n                this.sceneObjects.push(scene); // Add to array\n                this.sceneObjects = this.sortScenes(this.sceneObjects); // Sort\n                scene.on(\"shift.controller_sort\", function () {\n                    // Resort whenever scene moves\n                    _this.sceneObjects = _this.sortScenes(_this.sceneObjects);\n                });\n                // Insert Global defaults.\n                for (var key in this.globalSceneOptions) {\n                    scene.setValue(key, this.globalSceneOptions[key]);\n                }\n                this.log(3, \"Adding Scene (now \" + this.sceneObjects.length + \" total)\");\n            }\n            if (this.addIndicators) {\n                scene.addIndicators();\n            }\n        }\n        return this;\n    };\n    /**\n     * Remove one ore more scene(s) from the controller.\n     *\n     * This is the equivalent to `Scene.remove()`.\n     *\n     * @example\n     * // Remove a scene from the controller\n     * controller.removeScene(scene)\n     *\n     * // Remove multiple scenes from the controller\n     * controller.removeScene([scene, scene2, scene3])\n     *\n     * @param {(Scene|Scene[])} Scene - cene or Array of Scenes to be removed from the controller.\n     *\n     * @returns {Controller} Parent object for chaining.\n     */\n    Controller.prototype.removeScene = function (oldScene) {\n        var _this = this;\n        if (Type.isArray(oldScene)) {\n            var scenes = oldScene;\n            scenes.forEach(function (scene) {\n                _this.removeScene(scene);\n            });\n        }\n        else {\n            var scene = oldScene;\n            var index = this.sceneObjects.indexOf(scene);\n            if (index > -1) {\n                scene.off(\"shift.controller_sort\");\n                this.sceneObjects.splice(index, 1);\n                this.log(3, \"Removing Scene (now \" + this.sceneObjects.length + \" left)\");\n                scene.remove();\n            }\n        }\n        return this;\n    };\n    /**\n     * Update one ore more scene(s) according to the scroll position of the container.\n     *\n     * This is the equivalent to `Scene.update()`.\n     *\n     * The update method calculates the scene's start and end position (based on the trigger element, trigger hook, duration and offset) and checks it against the current scroll position of the container.\n     *\n     * It then updates the current scene state accordingly (or does nothing, if the state is already correct) – Pins will be set to their correct position and tweens will be updated to their correct progress.\n     *\n     * _**Note:** This method gets called constantly whenever Controller detects a change. The only application for you is if you change something outside of the realm of ScrollMagic, like moving the trigger or changing tween parameters._\n     *\n     * @example\n     * // Update a specific scene on next cycle\n     * controller.updateScene(scene)\n     *\n     * // Update a specific scene immediately\n     * controller.updateScene(scene, true)\n     *\n     * // Update multiple scenes scene on next cycle\n     * controller.updateScene([scene1, scene2, scene3])\n     *\n     * @param {Scene|Scene[]} Scene - Scene or Array of Scenes that is/are supposed to be updated.\n     * @param {boolean} [immediately=false] - If `true` the update will be instant, if `false` it will wait until next update cycle.\n                          This is useful when changing multiple properties of the scene - this way it will only be updated once all new properties are set (updateScenes).\n    * @return {Controller} Parent object for chaining.\n    */\n    Controller.prototype.updateScene = function (currentScene, immediately) {\n        var _this = this;\n        if (Type.isArray(currentScene)) {\n            var scenes = currentScene;\n            scenes.forEach(function (scene) {\n                _this.updateScene(scene, immediately);\n            });\n        }\n        else {\n            var scene = currentScene;\n            if (immediately) {\n                scene.update(true);\n            }\n            else if (this.updateScenesOnNextCycle !== true) {\n                // If _updateScenesOnNextCycle is true, all connected scenes are already scheduled for update\n                // Prep array for next update cycle\n                this.updateScenesOnNextCycle = this.updateScenesOnNextCycle || [];\n                if (this.updateScenesOnNextCycle.indexOf(scene) == -1) {\n                    this.updateScenesOnNextCycle.push(scene);\n                }\n                this.updateScenesOnNextCycle = this.sortScenes(this.updateScenesOnNextCycle); // Sort\n                this.debounceUpdate();\n            }\n        }\n        return this;\n    };\n    /**\n     * Updates the controller params and calls updateScene on every scene, that is attached to the controller.\n     *\n     * See `Controller.updateScene()` for more information about what this means.\n     *\n     * In most cases you will not need this function, as it is called constantly, whenever ScrollMagic detects a state change event, like resize or scroll.\n     *\n     * The only application for this method is when ScrollMagic fails to detect these events.\n     *\n     * One application is with some external scroll libraries (like iScroll) that move an internal container to a negative offset instead of actually scrolling. In this case the update on the controller needs to be called whenever the child container's position changes.\n     *\n     * For this case there will also be the need to provide a custom function to calculate the correct scroll position. See `Controller.scrollPos()` for details.\n  \n     * @example\n     * // Update the controller on next cycle (saves performance due to elimination of redundant updates)\n     * controller.update();\n     *\n     * // Update the controller immediately\n     * controller.update(true);\n     *\n     * @param {boolean} [immediately=false] - If `true` the update will be instant, if `false` it will wait until next update cycle (better performance)\n     * @return {Controller} Parent object for chaining.\n     */\n    Controller.prototype.update = function (immediately) {\n        this.onChange(new SceneEvent(\"resize\")); // Will update size and set updateScenesOnNextCycle to true\n        if (immediately) {\n            this.updateScenes();\n        }\n        return this;\n    };\n    /**\n     * Scroll to a numeric scroll offset, a DOM element, the start of a scene or provide an alternate method for scrolling.\n     *\n     * For vertical controllers it will change the top scroll offset and for horizontal applications it will change the left offset.\n     *\n     * @example\n     * // scroll to an offset of 100\n     * controller.scrollTo(100);\n     *\n     * // scroll to a DOM element\n     * controller.scrollTo(\"#anchor\");\n     *\n     * // scroll to the beginning of a scene\n     * var scene = new ScrollMagic.Scene({offset: 200});\n     * controller.scrollTo(scene);\n     *\n     * // define a new scroll position modification function (jQuery animate instead of jump)\n     * controller.scrollTo(function (newScrollPos) {\n     *\t$(\"html, body\").animate({scrollTop: newScrollPos});\n     * });\n     * controller.scrollTo(100); // call as usual, but the new function will be used instead\n     *\n     * // define a new scroll function with an additional parameter\n     * controller.scrollTo(function (newScrollPos, message) {\n     *  console.log(message);\n     *\t$(this).animate({scrollTop: newScrollPos});\n     * });\n     * // call as usual, but supply an extra parameter to the defined custom function\n     * controller.scrollTo(100, \"my message\");\n     *\n     * // define a new scroll function with an additional parameter containing multiple variables\n     * controller.scrollTo(function (newScrollPos, options) {\n     *  someGlobalVar = options.a + options.b;\n     *\t$(this).animate({scrollTop: newScrollPos});\n     * });\n     * // call as usual, but supply an extra parameter containing multiple options\n     * controller.scrollTo(100, {a: 1, b: 2});\n     *\n     * // define a new scroll function with a callback supplied as an additional parameter\n     * controller.scrollTo(function (newScrollPos, callback) {\n     *\t$(this).animate({scrollTop: newScrollPos}, 400, \"swing\", callback);\n     * });\n     * // call as usual, but supply an extra parameter, which is used as a callback in the previously defined custom scroll function\n     * controller.scrollTo(100, function() {\n     *\tconsole.log(\"scroll has finished.\");\n     * });\n     *\n     * @param {mixed} scrollTarget - The supplied argument can be one of these types:\n     * 1. `number` -> The container will scroll to this new scroll offset.\n     * 2. `string` or `object` -> Can be a selector or a DOM object.\n     *  The container will scroll to the position of this element.\n     * 3. `ScrollMagic Scene` -> The container will scroll to the start of this scene.\n     * 4. `function` -> This function will be used for future scroll position modifications.\n     *\n     *  This provides a way for you to change the behaviour of scrolling and adding new behaviour like animation. The function receives the new scroll position as a parameter and a reference to the container element using `this`.\n     *\n     *  It may also optionally receive an optional additional parameter (see below)\n     *\n     *  _**NOTE:**\n     *  All other options will still work as expected, using the new function to scroll._\n     *\n     * @param {mixed} [additionalParameter] - If a custom scroll function was defined (see above 4.), you may want to supply additional parameters to it, when calling it. You can do this using this parameter – see examples for details. Please note, that this parameter will have no effect, if you use the default scrolling function.\n     *\n     * @returns {Controller} Parent object for chaining.\n     */\n    // eslint-disable-next-line\n    Controller.prototype.scrollTo = function (scrollTarget, additionalParameter) {\n        if (Type.isNumber(scrollTarget)) {\n            // Execute\n            this.setScrollPos.call(this.container, scrollTarget, additionalParameter);\n        }\n        else if (scrollTarget instanceof Scene) {\n            var scene = scrollTarget;\n            // Scroll to scene\n            if (scene.controller === this) {\n                // Check if the controller is associated with this scene\n                this.scrollTo(scene.scrollOffset, additionalParameter);\n            }\n            else {\n                this.log(2, \"scrollTo(): The supplied scene does not belong to this controller. Scroll cancelled.\", scene);\n            }\n        }\n        else if (Type.isFunction(scrollTarget)) {\n            // Assign new scroll function\n            var func = scrollTarget;\n            this.setScrollPos = func;\n        }\n        else {\n            // Scroll to element\n            var elem = DomUtils.getElements(scrollTarget)[0];\n            if (elem) {\n                // If parent is pin spacer, use spacer position instead so correct start position is returned for pinned elements.\n                var parent_1 = elem.parentNode;\n                while (parent_1.hasAttribute(Scene.PIN_SPACER_ATTRIBUTE)) {\n                    parent_1 = elem.parentNode;\n                    elem = parent_1;\n                }\n                var param = this.isVertical ? \"top\" : \"left\"; // Which param is of interest ?\n                var containerOffset = DomUtils.getOffset(this.container); // Container position is needed because element offset is returned in relation to document, not in relation to container.\n                var elementOffset = DomUtils.getOffset(elem);\n                if (!this.isDocument) {\n                    // Container is not the document root, so substract scroll Position to get correct trigger element position relative to scrollcontent\n                    containerOffset[param] -= this.scrollPos();\n                }\n                this.scrollTo(elementOffset[param] - containerOffset[param], additionalParameter);\n            }\n            else {\n                this.log(2, \"scrollTo(): The supplied argument is invalid. Scroll cancelled.\", scrollTarget);\n            }\n        }\n        return this;\n    };\n    /**\n     * **Get** the current scrollPosition or **Set** a new method to calculate it.\n     * -> **GET**:\n     * When used as a getter this function will return the current scroll position.\n     * To get a cached value use Controller.info(\"scrollPos\"), which will be updated in the update cycle.\n     * For vertical controllers it will return the top scroll offset and for horizontal applications it will return the left offset.\n     *\n     * -> **SET**:\n     * When used as a setter this method prodes a way to permanently overwrite the controller's scroll position calculation.\n     * A typical usecase is when the scroll position is not reflected by the containers scrollTop or scrollLeft values, but for example by the inner offset of a child container.\n     * Moving a child container inside a parent is a commonly used method for several scrolling frameworks, including iScroll.\n     * By providing an alternate calculation function you can make sure ScrollMagic receives the correct scroll position.\n     * Please also bear in mind that your function should return y values for vertical scrolls an x for horizontals.\n     *\n     * To change the current scroll position please use `Controller.scrollTo()`.\n     * @public\n     *\n     * @example\n     * // get the current scroll Position\n     * var scrollPos = controller.scrollPos();\n     *\n     * // set a new scroll position calculation method\n     * controller.scrollPos(function () {\n     *\treturn this.info(\"vertical\") ? -mychildcontainer.y : -mychildcontainer.x\n     * });\n     *\n     * @param {function} [scrollPosMethod] - The function to be used for the scroll position calculation of the container.\n     * @returns {(number|Controller)} Current scroll position or parent object for chaining.\n     */\n    // TODO: Refactor this, it's horrible\n    Controller.prototype.scrollPos = function () {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments[_i];\n        }\n        if (args.length === 0) {\n            return this.getScrollPos();\n        }\n        else if (Type.isFunction(args[0])) {\n            this.getScrollPos = args[0];\n            return 1;\n        }\n        else {\n            this.log(2, \"Provided value for method 'scrollPos' is not a function. To change the current scroll position use 'scrollTo()'.\");\n            return 0;\n        }\n    };\n    /**\n     * Get all infos or one in particular about the controller.\n     *\n     * @example\n     * // Returns the current scroll position (number)\n     * var scrollPos = controller.info(\"scrollPos\");\n     *\n     * // Returns all infos as an object\n     * var infos = controller.info();\n     *\n     * @param {string} [about] - If passed only this info will be returned instead of an object containing all.\n                   Valid options are:\n                  ** `\"size\"` => the current viewport size of the container\n                  ** `\"isVertical\"` => true if vertical scrolling, otherwise false\n                  ** `\"scrollPos\"` => the current scroll position\n                  ** `\"scrollDirection\"` => the last known direction of the scroll\n                  ** `\"container\"` => the container element\n                  ** `\"isDocument\"` => true if container element is the document.\n    * @returns {(ControllerInfo)} The requested info(s).\n    */\n    Controller.prototype.info = function () {\n        return {\n            size: this.viewPortSize,\n            isVertical: this.isVertical,\n            isDocument: this.isDocument,\n            container: this.container,\n            scrollPos: this._scrollPos,\n            scrollDirection: this.scrollDirection,\n            smoothScrolling: this.smoothScrolling,\n        };\n    };\n    /**\n     * Destroy the Controller, all Scenes and everything.\n     *\n     * @example\n     * // Without resetting the scenes\n     * controller = controller.destroy()\n     *\n     * // With scene reset\n     * controller = controller.destroy(true)\n     *\n     * @param {boolean} [resetScenes=false] - If `true` the pins and tweens (if existent) of all scenes will be reset.\n     *\n     * @returns {null} Null to unset handler variables.\n     */\n    Controller.prototype.destroy = function (resetScenes) {\n        this.container.removeEventListener(\"resize\", this.handleTriggerPositionChange.bind(this));\n        if (!this.isDocument) {\n            window.removeEventListener(\"resize\", this.handleTriggerPositionChange.bind(this));\n            window.removeEventListener(\"scroll\", this.handleTriggerPositionChange.bind(this));\n        }\n        this.container.removeEventListener(\"resize\", this.handleBoundsPositionChange.bind(this));\n        this.container.removeEventListener(\"scroll\", this.handleBoundsPositionChange.bind(this));\n        window.clearTimeout(this.refreshTimeout);\n        var i = this.sceneObjects.length;\n        while (i--) {\n            this.sceneObjects[i].destroy(resetScenes);\n        }\n        this.container.removeEventListener(\"resize\", this.onChange.bind(this));\n        this.container.removeEventListener(\"scroll\", this.onChange.bind(this));\n        AnimationUtils.cAF(this.updateTimeout);\n        this.log(3, \"Destroyed \" + Controller.NAMESPACE + \" (reset: \" + (resetScenes ? \"true\" : \"false\") + \")\");\n        return null;\n    };\n    Controller.NAMESPACE = \"Controller\";\n    return Controller;\n}());\nexport default Controller;\n//# sourceMappingURL=controller.js.map","import { ScrollDirection } from \"./controller\";\nimport Logger from \"./utils/logger\";\nimport SceneEvent from \"./scene-event\";\nimport DomUtils, { OffsetParam } from \"./utils/dom\";\nimport gsap from \"gsap\";\nimport Type from \"./utils/type\";\nimport Indicator from \"./indicator\";\nexport var SceneState;\n(function (SceneState) {\n    SceneState[\"Before\"] = \"BEFORE\";\n    SceneState[\"During\"] = \"DURING\";\n    SceneState[\"After\"] = \"AFTER\";\n})(SceneState || (SceneState = {}));\nvar Scene = /** @class */ (function () {\n    function Scene(options) {\n        var _this = this;\n        this._triggerPosition = 0;\n        this._enabled = true;\n        this._progress = 0;\n        this.listeners = {};\n        this.state = SceneState.Before;\n        this._scrollOffset = { start: 0, end: 0 };\n        this.cssClassElems = [];\n        this.easing = false;\n        // Debug plugin\n        this.autoIndex = 0;\n        this.setOptions(options);\n        // Set event listeners\n        this.on(\"change.internal\", function (e) {\n            if ((e === null || e === void 0 ? void 0 : e.what) !== \"logLevel\" && (e === null || e === void 0 ? void 0 : e.what) !== \"tweenChanges\") {\n                // No need for a scene update scene with these options...\n                if ((e === null || e === void 0 ? void 0 : e.what) === \"triggerElement\") {\n                    _this.updateTriggerElementPosition();\n                }\n                else if ((e === null || e === void 0 ? void 0 : e.what) === \"reverse\") {\n                    // The only property left that may have an impact on the current scene state. Everything else is handled by the shift event.\n                    _this.update();\n                }\n            }\n        }).on(\"shift.internal\", function () {\n            _this.updateScrollOffset();\n            _this.update(); // Update scene to reflect new position\n        });\n        // Pinning feature\n        this.on(\"shift.internal\", function (e) {\n            var durationChanged = (e === null || e === void 0 ? void 0 : e.reason) === \"duration\";\n            // If [duration changed after a scene (inside scene progress updates pin position)] or [duration is 0, we are in pin phase and some other value changed].\n            if ((_this.state === SceneState.After && durationChanged) ||\n                (_this.state === SceneState.During && _this._duration === 0)) {\n                _this.updatePinState();\n            }\n            if (durationChanged) {\n                _this.updatePinDimensions();\n            }\n        })\n            .on(\"progress.internal\", function () {\n            _this.updatePinState();\n        })\n            .on(\"add.internal\", function () {\n            _this.updatePinDimensions();\n        })\n            .on(\"destroy.internal\", function (e) {\n            _this.removePin(e === null || e === void 0 ? void 0 : e.reset);\n        });\n        // Class toggle feature\n        this.on(\"destroy.internal\", function (e) {\n            _this.removeClassToggle(e === null || e === void 0 ? void 0 : e.reset);\n        });\n        // Animation plugin\n        this.on(\"progress.plugin_gsap\", function () {\n            _this.updateTweenProgress();\n        }).on(\"destroy.plugin_gsap\", function (e) {\n            _this.removeTween(e === null || e === void 0 ? void 0 : e.reset);\n        });\n    }\n    Object.defineProperty(Scene.prototype, \"controller\", {\n        get: function () {\n            return this._controller;\n        },\n        set: function (newValue) {\n            this._controller = newValue;\n        },\n        enumerable: false,\n        configurable: true\n    });\n    Object.defineProperty(Scene.prototype, \"duration\", {\n        get: function () {\n            if (this.durationUpdateMethod) {\n                this._duration = this.durationUpdateMethod();\n            }\n            return this._duration;\n        },\n        set: function (newValue) {\n            var changed = this._duration !== newValue;\n            this._duration = newValue;\n            this.durationUpdateMethod = undefined;\n            if (changed) {\n                this.trigger(\"change\", { what: \"duration\", newValue: newValue });\n                this.trigger(\"shift\", { reason: \"duration\" });\n            }\n        },\n        enumerable: false,\n        configurable: true\n    });\n    Object.defineProperty(Scene.prototype, \"offset\", {\n        get: function () {\n            return this._offset;\n        },\n        set: function (newValue) {\n            var changed = this._offset !== newValue;\n            this._offset = newValue;\n            if (changed) {\n                this.trigger(\"change\", { what: \"offset\", newValue: newValue });\n                this.trigger(\"shift\", { reason: \"offset\" });\n            }\n        },\n        enumerable: false,\n        configurable: true\n    });\n    Object.defineProperty(Scene.prototype, \"triggerElement\", {\n        get: function () {\n            return this._triggerElement;\n        },\n        set: function (newValue) {\n            var changed = this._triggerElement !== newValue;\n            this._triggerElement = newValue;\n            if (changed) {\n                this.trigger(\"change\", { what: \"triggerElement\", newValue: newValue });\n            }\n        },\n        enumerable: false,\n        configurable: true\n    });\n    Object.defineProperty(Scene.prototype, \"triggerHook\", {\n        get: function () {\n            return this._triggerHook;\n        },\n        set: function (newValue) {\n            var changed = this._triggerHook !== newValue;\n            this._triggerHook = newValue;\n            if (changed) {\n                this.trigger(\"change\", { what: \"triggerHook\", newValue: newValue });\n                this.trigger(\"shift\", { reason: \"triggerHook\" });\n            }\n        },\n        enumerable: false,\n        configurable: true\n    });\n    Object.defineProperty(Scene.prototype, \"reverse\", {\n        get: function () {\n            return this._reverse;\n        },\n        set: function (newValue) {\n            var changed = this._reverse !== newValue;\n            this._reverse = newValue;\n            if (changed) {\n                this.trigger(\"change\", { what: \"reverse\", newValue: newValue });\n            }\n        },\n        enumerable: false,\n        configurable: true\n    });\n    Object.defineProperty(Scene.prototype, \"logLevel\", {\n        get: function () {\n            return this._logLevel;\n        },\n        set: function (newValue) {\n            var changed = this._logLevel !== newValue;\n            this._logLevel = newValue;\n            if (changed) {\n                this.trigger(\"change\", { what: \"logLevel\", newValue: newValue });\n            }\n        },\n        enumerable: false,\n        configurable: true\n    });\n    Object.defineProperty(Scene.prototype, \"tweenChanges\", {\n        get: function () {\n            return this._tweenChanges;\n        },\n        set: function (newValue) {\n            var changed = this._tweenChanges !== newValue;\n            this._tweenChanges = newValue;\n            if (changed) {\n                this.trigger(\"tweenChanges\", { what: \"tweenChanges\", newValue: newValue });\n            }\n        },\n        enumerable: false,\n        configurable: true\n    });\n    Object.defineProperty(Scene.prototype, \"enabled\", {\n        /**\n         * Get the current enabled state of the scene.\n         *\n         * @example\n         * let enabled = scene.enabled\n         *\n         * @returns {boolean} Current enabled state.\n         */\n        get: function () {\n            return this._enabled;\n        },\n        /**\n         * Set the current enabled state of the scene.\n         *\n         * This can be used to disable this scene without removing or destroying it.\n         *\n         * @example\n         * // Disable the scene\n         * scene.enabled(false)\n         *\n         * @param {boolean} [newValue] - The new enabled state of the scene `true` or `false`.\n         * @returns {Scene} Parent object for chaining.\n         */\n        set: function (newValue) {\n            var changed = this._enabled !== newValue;\n            this._enabled = newValue;\n            if (changed) {\n                this.update(true);\n            }\n        },\n        enumerable: false,\n        configurable: true\n    });\n    Object.defineProperty(Scene.prototype, \"progress\", {\n        /**\n         * Get the scene's progress.\n         *\n         * @example\n         * // Get the current scene progress\n         * let progress = scene.progress\n         *\n         * @returns {number} - Current scene progress.\n         */\n        get: function () {\n            return this._progress;\n        },\n        /**\n         * Set the scene's progress.\n         *\n         * Usually it shouldn't be necessary to use this, as it is set automatically by scene.update().\n         *\n         * The order in which the events are fired depends on the duration of the scene:\n         *   1. Scenes with `duration == 0`:\n         *     Scenes that have no duration by definition have no ending. Thus the `end` event will never be fired.\n         *\n         *     When the trigger position of the scene is passed the events are always fired in this order:\n         *    `enter`, `start`, `progress` when scrolling forward and `progress`, `start`, `leave` when scrolling in reverse\n         *\n         *   2. Scenes with `duration > 0`:\n         *     Scenes with a set duration have a defined start and end point.\n         *\n         *     When scrolling past the start position of the scene it will fire these events in this order:\n         *     `enter`, `start`, `progress`\n         *\n         *     When continuing to scroll and passing the end point it will fire these events:\n         *     `progress`, `end`, `leave`\n         *\n         *     When reversing through the end point these events are fired:\n         *     `enter`, `end`, `progress`\n         *\n         *     And when continuing to scroll past the start position in reverse it will fire:\n         *     `progress`, `start`, `leave`\n         *\n         *     In between start and end the `progress` event will be called constantly, whenever the progress changes.\n         *\n         * In short:\n         *   `enter` events will always trigger **before** the progress update and `leave` envents will trigger **after** the progress update.\n         *   `start` and `end` will always trigger at their respective position.\n         *\n         * Please review the event descriptions for details on the events and the event object that is passed to the callback.\n         *\n         * @fires {@link Scene.enter}\n         * @fires {@link Scene.start}\n         * @fires {@link Scene.progress}\n         * @fires {@link Scene.end}\n         * @fires {@link Scene.leave}\n         *\n         * @example\n         * // Set new scene progress\n         * scene.progress = 0.3\n         *\n         * @param {number} [newValue] - The new progress value of the scene `[0-1]`.\n         */\n        set: function (newValue) {\n            // this._progress = newValue\n            var doUpdate = false;\n            var oldState = this.state;\n            var scrollDirection = this.controller ? this.controller.info().scrollDirection : ScrollDirection.Paused;\n            var reverseOrForward = this._reverse || newValue >= this._progress;\n            if (this._duration === 0) {\n                // Zero duration scenes\n                doUpdate = this._progress != newValue;\n                this._progress = newValue < 1 && reverseOrForward ? 0 : 1;\n                this.state = this._progress === 0 ? SceneState.Before : SceneState.During;\n            }\n            else {\n                // Scenes with start and end\n                if (newValue < 0 && this.state !== SceneState.Before && reverseOrForward) {\n                    // Go back to initial state\n                    this._progress = 0;\n                    this.state = SceneState.Before;\n                    doUpdate = true;\n                }\n                else if (newValue >= 0 && newValue < 1 && reverseOrForward) {\n                    this._progress = newValue;\n                    this.state = SceneState.During;\n                    doUpdate = true;\n                }\n                else if (newValue >= 1 && this.state !== SceneState.After) {\n                    this._progress = 1;\n                    this.state = SceneState.After;\n                    doUpdate = true;\n                }\n                else if (this.state === SceneState.During && !reverseOrForward) {\n                    this.updatePinState(); // In case we scrolled backwards mid-scene and reverse is disabled => update the pin position, so it doesn't move back as well.\n                }\n            }\n            // Fire events\n            if (doUpdate) {\n                var eventVars = { progress: this._progress, state: this.state, scrollDirection: scrollDirection };\n                var stateChanged = this.state != oldState;\n                if (stateChanged) {\n                    // Enter events\n                    if (oldState !== SceneState.During) {\n                        this.trigger(\"enter\", eventVars);\n                        this.trigger(oldState === SceneState.Before ? \"start\" : \"end\", eventVars);\n                    }\n                }\n                this.trigger(\"progress\", eventVars);\n                if (stateChanged) {\n                    // Leave events\n                    if (this.state !== SceneState.During) {\n                        this.trigger(this.state === SceneState.Before ? \"start\" : \"end\", eventVars);\n                        this.trigger(\"leave\", eventVars);\n                    }\n                }\n            }\n        },\n        enumerable: false,\n        configurable: true\n    });\n    Object.defineProperty(Scene.prototype, \"scrollOffset\", {\n        /**\n         * Get the current scroll offset for the start of the scene.\n         *\n         * Mind, that the scrollOffset is related to the size of the container, if `triggerHook` is bigger than `0` (or `\"onLeave\"`).\n         *\n         * This means, that resizing the container or changing the `triggerHook` will influence the scene's start offset.\n         *\n         * @example\n         * // Get the current scroll offset for the start and end of the scene.\n         * let start = scene.scrollOffset\n         * let end = scene.scrollOffset + scene.duration\n         * console.log(\"the scene starts at\", start, \"and ends at\", end)\n         *\n         * @returns {number} The scroll offset (of the container) at which the scene will trigger. Y value for vertical and X value for horizontal scrolls.\n         */\n        get: function () {\n            return this._scrollOffset.start;\n        },\n        enumerable: false,\n        configurable: true\n    });\n    Object.defineProperty(Scene.prototype, \"triggerPosition\", {\n        /**\n         * **Get** the trigger position of the scene (including the value of the `offset` option).\n         * @method ScrollMagic.Scene#triggerPosition\n         * @example\n         * // Get the scene's trigger position\n         * let triggerPosition = scene.triggerPosition\n         *\n         * @returns {number} Start position of the scene. Top position value for vertical and left position value for horizontal scrolls.\n         */\n        get: function () {\n            var pos = this.offset; // The offset is the basis\n            if (this.controller) {\n                // Get the trigger position\n                if (this.triggerElement) {\n                    // Element as trigger\n                    pos += this._triggerPosition;\n                }\n                else {\n                    // Return the height of the triggerHook to start at the beginning\n                    pos += this.controller.info().size * this.triggerHook;\n                }\n            }\n            return pos;\n        },\n        enumerable: false,\n        configurable: true\n    });\n    /*\n     * ----------------------------------------------------------------\n     * Event Management\n     * ----------------------------------------------------------------\n     */\n    /**\n     * Scene start event.\n     * Fires whenever the scroll position its the starting point of the scene.\n     * It will also fire when scrolling back up going over the start position of the scene. If you want something to happen only when scrolling down/right, use the scrollDirection parameter passed to the callback.\n     *\n     * For details on this event and the order in which it is fired, please review the {@link Scene.progress} method.\n     *\n     * @event ScrollMagic.Scene#start\n     *\n     * @example\n     * scene.on(\"start\", function (event) {\n     * \tconsole.log(\"Hit start point of scene.\");\n     * });\n     *\n     * @property {object} event - The event Object passed to each callback\n     * @property {string} event.type - The name of the event\n     * @property {Scene} event.target - The Scene object that triggered this event\n     * @property {number} event.progress - Reflects the current progress of the scene\n     * @property {string} event.state - The current state of the scene `\"BEFORE\"` or `\"DURING\"`\n     * @property {string} event.scrollDirection - Indicates which way we are scrolling `\"PAUSED\"`, `\"FORWARD\"` or `\"REVERSE\"`\n     */\n    /**\n     * Scene end event.\n     * Fires whenever the scroll position its the ending point of the scene.\n     * It will also fire when scrolling back up from after the scene and going over its end position. If you want something to happen only when scrolling down/right, use the scrollDirection parameter passed to the callback.\n     *\n     * For details on this event and the order in which it is fired, please review the {@link Scene.progress} method.\n     *\n     * @event ScrollMagic.Scene#end\n     *\n     * @example\n     * scene.on(\"end\", function (event) {\n     * \tconsole.log(\"Hit end point of scene.\");\n     * });\n     *\n     * @property {object} event - The event Object passed to each callback\n     * @property {string} event.type - The name of the event\n     * @property {Scene} event.target - The Scene object that triggered this event\n     * @property {number} event.progress - Reflects the current progress of the scene\n     * @property {string} event.state - The current state of the scene `\"DURING\"` or `\"AFTER\"`\n     * @property {string} event.scrollDirection - Indicates which way we are scrolling `\"PAUSED\"`, `\"FORWARD\"` or `\"REVERSE\"`\n     */\n    /**\n     * Scene enter event.\n     * Fires whenever the scene enters the \"DURING\" state.\n     * Keep in mind that it doesn't matter if the scene plays forward or backward: This event always fires when the scene enters its active scroll timeframe, regardless of the scroll-direction.\n     *\n     * For details on this event and the order in which it is fired, please review the {@link Scene.progress} method.\n     *\n     * @event ScrollMagic.Scene#enter\n     *\n     * @example\n     * scene.on(\"enter\", function (event) {\n     * \tconsole.log(\"Scene entered.\");\n     * });\n     *\n     * @property {object} event - The event Object passed to each callback\n     * @property {string} event.type - The name of the event\n     * @property {Scene} event.target - The Scene object that triggered this event\n     * @property {number} event.progress - Reflects the current progress of the scene\n     * @property {string} event.state - The current state of the scene - always `\"DURING\"`\n     * @property {string} event.scrollDirection - Indicates which way we are scrolling `\"PAUSED\"`, `\"FORWARD\"` or `\"REVERSE\"`\n     */\n    /**\n     * Scene leave event.\n     * Fires whenever the scene's state goes from \"DURING\" to either \"BEFORE\" or \"AFTER\".\n     * Keep in mind that it doesn't matter if the scene plays forward or backward: This event always fires when the scene leaves its active scroll timeframe, regardless of the scroll-direction.\n     *\n     * For details on this event and the order in which it is fired, please review the {@link Scene.progress} method.\n     *\n     * @event ScrollMagic.Scene#leave\n     *\n     * @example\n     * scene.on(\"leave\", function (event) {\n     * \tconsole.log(\"Scene left.\");\n     * });\n     *\n     * @property {object} event - The event Object passed to each callback\n     * @property {string} event.type - The name of the event\n     * @property {Scene} event.target - The Scene object that triggered this event\n     * @property {number} event.progress - Reflects the current progress of the scene\n     * @property {string} event.state - The current state of the scene `\"BEFORE\"` or `\"AFTER\"`\n     * @property {string} event.scrollDirection - Indicates which way we are scrolling `\"PAUSED\"`, `\"FORWARD\"` or `\"REVERSE\"`\n     */\n    /**\n     * Scene update event.\n     * Fires whenever the scene is updated (but not necessarily changes the progress).\n     *\n     * @event ScrollMagic.Scene#update\n     *\n     * @example\n     * scene.on(\"update\", function (event) {\n     * \tconsole.log(\"Scene updated.\");\n     * });\n     *\n     * @property {object} event - The event Object passed to each callback\n     * @property {string} event.type - The name of the event\n     * @property {Scene} event.target - The Scene object that triggered this event\n     * @property {number} event.startPos - The starting position of the scene (in relation to the conainer)\n     * @property {number} event.endPos - The ending position of the scene (in relation to the conainer)\n     * @property {number} event.scrollPos - The current scroll position of the container\n     */\n    /**\n     * Scene progress event.\n     * Fires whenever the progress of the scene changes.\n     *\n     * For details on this event and the order in which it is fired, please review the {@link Scene.progress} method.\n     *\n     * @event ScrollMagic.Scene#progress\n     *\n     * @example\n     * scene.on(\"progress\", function (event) {\n     * \tconsole.log(\"Scene progress changed to \" + event.progress);\n     * });\n     *\n     * @property {object} event - The event Object passed to each callback\n     * @property {string} event.type - The name of the event\n     * @property {Scene} event.target - The Scene object that triggered this event\n     * @property {number} event.progress - Reflects the current progress of the scene\n     * @property {string} event.state - The current state of the scene `\"BEFORE\"`, `\"DURING\"` or `\"AFTER\"`\n     * @property {string} event.scrollDirection - Indicates which way we are scrolling `\"PAUSED\"`, `\"FORWARD\"` or `\"REVERSE\"`\n     */\n    /**\n     * Scene change event.\n     * Fires whenvever a property of the scene is changed.\n     *\n     * @event ScrollMagic.Scene#change\n     *\n     * @example\n     * scene.on(\"change\", function (event) {\n     * \tconsole.log(\"Scene Property \\\"\" + event.what + \"\\\" changed to \" + event.newval);\n     * });\n     *\n     * @property {object} event - The event Object passed to each callback\n     * @property {string} event.type - The name of the event\n     * @property {Scene} event.target - The Scene object that triggered this event\n     * @property {string} event.what - Indicates what value has been changed\n     * @property {mixed} event.newval - The new value of the changed property\n     */\n    /**\n     * Scene shift event.\n     * Fires whenvever the start or end **scroll offset** of the scene change.\n     * This happens explicitely, when one of these values change: `offset`, `duration` or `triggerHook`.\n     * It will fire implicitly when the `triggerElement` changes, if the new element has a different position (most cases).\n     * It will also fire implicitly when the size of the container changes and the triggerHook is anything other than `onLeave`.\n     *\n     * @event ScrollMagic.Scene#shift\n     * @since 1.1.0\n     *\n     * @example\n     * scene.on(\"shift\", function (event) {\n     * \tconsole.log(\"Scene moved, because the \" + event.reason + \" has changed.)\");\n     * });\n     *\n     * @property {object} event - The event Object passed to each callback\n     * @property {string} event.type - The name of the event\n     * @property {Scene} event.target - The Scene object that triggered this event\n     * @property {string} event.reason - Indicates why the scene has shifted\n     */\n    /**\n     * Scene destroy event.\n     * Fires whenvever the scene is destroyed.\n     * This can be used to tidy up custom behaviour used in events.\n     *\n     * @event ScrollMagic.Scene#destroy\n     * @since 1.1.0\n     *\n     * @example\n     * scene.on(\"enter\", function (event) {\n     *        // add custom action\n     *        $(\"#my-elem\").left(\"200\");\n     *      })\n     *      .on(\"destroy\", function (event) {\n     *        // reset my element to start position\n     *        if (event.reset) {\n     *          $(\"#my-elem\").left(\"0\");\n     *        }\n     *      });\n     *\n     * @property {object} event - The event Object passed to each callback\n     * @property {string} event.type - The name of the event\n     * @property {Scene} event.target - The Scene object that triggered this event\n     * @property {boolean} event.reset - Indicates if the destroy method was called with reset `true` or `false`.\n     */\n    /**\n     * Scene add event.\n     * Fires when the scene is added to a controller.\n     * This is mostly used by plugins to know that change might be due.\n     *\n     * @event ScrollMagic.Scene#add\n     * @since 2.0.0\n     *\n     * @example\n     * scene.on(\"add\", function (event) {\n     * \tconsole.log('Scene was added to a new controller.');\n     * });\n     *\n     * @property {object} event - The event Object passed to each callback\n     * @property {string} event.type - The name of the event\n     * @property {Scene} event.target - The Scene object that triggered this event\n     * @property {boolean} event.controller - The controller object the scene was added to.\n     */\n    /**\n     * Scene remove event.\n     * Fires when the scene is removed from a controller.\n     * This is mostly used by plugins to know that change might be due.\n     *\n     * @event ScrollMagic.Scene#remove\n     * @since 2.0.0\n     *\n     * @example\n     * scene.on(\"remove\", function (event) {\n     * \tconsole.log('Scene was removed from its controller.');\n     * });\n     *\n     * @property {object} event - The event Object passed to each callback\n     * @property {string} event.type - The name of the event\n     * @property {Scene} event.target - The Scene object that triggered this event\n     */\n    /**\n     * Add one ore more event listener.\n     *\n     * The callback function will be fired at the respective event, and an object containing relevant data will be passed to the callback.\n     *\n     * @example\n     * function callback (event) {\n     *   console.log(\"Event fired! (\" + event.type + \")\");\n     * }\n     *\n     * // Add listeners\n     * scene.on(\"change update progress start end enter leave\", callback);\n     *\n     * @param {string} names - The name or names of the event the callback should be attached to.\n     * @param {function} callback - A function that should be executed, when the event is dispatched. An event object will be passed to the callback.\n     *\n     * @returns {Scene} Parent object for chaining.\n     */\n    Scene.prototype.on = function (names, callback) {\n        var _this = this;\n        var allNames = names.trim().split(\" \");\n        allNames.forEach(function (name) {\n            var parts = name.split(\".\");\n            var eventName = parts[0];\n            var namespace = parts[1];\n            if (_this.listeners && eventName !== \"*\") {\n                // Disallow wildcards\n                if (!_this.listeners[eventName]) {\n                    _this.listeners[eventName] = [];\n                }\n                _this.listeners[eventName].push({\n                    namespace: namespace || \"\",\n                    callback: callback,\n                });\n            }\n        });\n        return this;\n    };\n    /**\n     * Remove one or more event listener.\n     *\n     * @example\n     * function callback (event) {\n     *   console.log(\"Event fired! (\" + event.type + \")\");\n     * }\n     *\n     * // Remove listeners\n     * scene.off(\"change update\", callback);\n     *\n     * @param {string} names - The name or names of the event that should be removed.\n     * @param {function} [callback] - A specific callback function that should be removed. If none is passed all callbacks to the event listener will be removed.\n     *\n     * @returns {Scene} Parent object for chaining.\n     */\n    Scene.prototype.off = function (names, callback) {\n        var _this = this;\n        var allNames = names.trim().split(\" \");\n        allNames.forEach(function (name) {\n            var parts = name.split(\".\");\n            var eventName = parts[0];\n            var namespace = parts[1] || \"\";\n            var removeList = eventName === \"*\" ? (_this.listeners ? Object.keys(_this.listeners) : []) : [eventName];\n            removeList.forEach(function (remove) {\n                var list = (_this.listeners ? _this.listeners[remove] : []) || [];\n                var i = list.length;\n                while (i--) {\n                    var listener = list[i];\n                    if (listener &&\n                        (namespace === listener.namespace || namespace === \"*\") &&\n                        (!callback || callback == listener.callback)) {\n                        list.splice(i, 1);\n                    }\n                }\n                if (!list.length && _this.listeners) {\n                    delete _this.listeners[remove];\n                }\n            });\n        });\n        return this;\n    };\n    /**\n     * Add the scene to a controller.\n     *\n     * This is the equivalent to `Controller.addScene(scene)`.\n     *\n     * @example\n     * // Add a scene to a Controller\n     * scene.addTo(controller)\n     *\n     * @param {Controller} controller - The controller to which the scene should be added.\n     *\n     * @returns {Scene} Parent object for chaining.\n     */\n    Scene.prototype.addTo = function (controller) {\n        if (this._controller != controller) {\n            // New controller\n            if (this._controller) {\n                // Was associated to a different controller before, so remove it...\n                this._controller.removeScene(this);\n            }\n            this._controller = controller;\n            // this.validateOption()\n            this.updateDuration(true);\n            this.updateTriggerElementPosition(true);\n            this.updateScrollOffset();\n            this._controller.info().container.addEventListener(\"resize\", this.onContainerResize.bind(this));\n            this._controller.addScene(this);\n            this.trigger(\"add\", { controller: this._controller });\n            this.log(3, \"Added \" + Scene.NAMESPACE + \" to controller\");\n            this.update();\n        }\n        return this;\n    };\n    /**\n     * Remove the scene from the controller.\n     *\n     * This is the equivalent to `Controller.removeScene(scene)`.\n     *\n     * The scene will not be updated anymore until you readd it to a controller.\n     *\n     * To remove the pin or the tween you need to call removeTween() or removePin() respectively.\n     *\n     * @example\n     * // Remove the scene from its controller\n     * scene.remove()\n     *\n     * @returns {Scene} Parent object for chaining.\n     */\n    Scene.prototype.remove = function () {\n        if (this.controller) {\n            this.controller.info().container.removeEventListener(\"resize\", this.onContainerResize.bind(this));\n            var tmpParent = this.controller;\n            // this.controller = undefined\n            tmpParent.removeScene(this);\n            this.trigger(\"remove\");\n            this.log(3, \"Removed \" + Scene.NAMESPACE + \" from controller\");\n        }\n        return this;\n    };\n    /**\n     * Destroy the scene and everything.\n     *\n     * @example\n     * // Destroy the scene without resetting the pin and tween to their initial positions\n     * scene = scene.destroy()\n     *\n     * // Destroy the scene and reset the pin and tween\n     * scene = scene.destroy(true)\n     *\n     * @param {boolean} [reset=false] - If `true` the pin and tween (if existent) will be reset.\n     *\n     * @returns {null} Null to unset handler variables.\n     */\n    Scene.prototype.destroy = function (reset) {\n        this.trigger(\"destroy\", { reset: reset });\n        this.remove();\n        this.off(\"*.*\");\n        this.log(3, \"destroyed \" + Scene.NAMESPACE + \" (reset: \" + (reset ? \"true\" : \"false\") + \")\");\n        return null;\n    };\n    /**\n     * Updates the Scene to reflect the current state.\n     *\n     * This is the equivalent to `Controller.updateScene(scene, immediately)`.\n     *\n     * The update method calculates the scene's start and end position (based on the trigger element, trigger hook, duration and offset) and checks it against the current scroll position of the container.\n     * It then updates the current scene state accordingly (or does nothing, if the state is already correct) – Pins will be set to their correct position and tweens will be updated to their correct progress.\n     *\n     * This means an update doesn't necessarily result in a progress change. The `progress` event will be fired if the progress has indeed changed between this update and the last.\n     *\n     * _**NOTE:** This method gets called constantly whenever ScrollMagic detects a change. The only application for you is if you change something outside of the realm of ScrollMagic, like moving the trigger or changing tween parameters._\n     *\n     * @example\n     * // Update the scene on next tick\n     * scene.update();\n     *\n     * // Update the scene immediately\n     * scene.update(true);\n     *\n     * @fires Scene.update\n     *\n     * @param {boolean} [immediately=false] - If `true` the update will be instant, if `false` it will wait until next update cycle (better performance).\n     * @returns {Scene} Parent object for chaining.\n     */\n    Scene.prototype.update = function (immediately) {\n        if (this.controller) {\n            if (immediately) {\n                if (this.controller.enabled && this._enabled) {\n                    var scrollPos = this.controller.info().scrollPos;\n                    var newProgress = void 0;\n                    if (this._duration > 0) {\n                        newProgress = (scrollPos - this._scrollOffset.start) / (this._scrollOffset.end - this._scrollOffset.start);\n                    }\n                    else {\n                        newProgress = scrollPos >= this._scrollOffset.start ? 1 : 0;\n                    }\n                    this.trigger(\"update\", {\n                        startPos: this._scrollOffset.start,\n                        endPos: this._scrollOffset.end,\n                        scrollPos: scrollPos,\n                    });\n                    this.progress = newProgress;\n                }\n                else if (this.pin && this.state === SceneState.During) {\n                    this.updatePinState(true); // Unpin in position\n                }\n            }\n            else {\n                this.controller.updateScene(this, false);\n            }\n        }\n        return this;\n    };\n    /**\n     * Updates dynamic scene variables like the trigger element position or the duration.\n     *\n     * This method is automatically called in regular intervals from the controller. See {@link Controller} option `refreshInterval`.\n     *\n     * You can call it to minimize lag, for example when you intentionally change the position of the triggerElement.\n     * If you don't it will simply be updated in the next refresh interval of the container, which is usually sufficient.\n     *\n     * @example\n     * scene = new Scene({triggerElement: \"#trigger\"});\n     *\n     * // Change the position of the trigger\n     * $(\"#trigger\").css(\"top\", 500)\n     *\n     * // Immediately let the scene know of this change\n     * scene.refresh()\n     *\n     * @fires {@link Scene.shift}, if the trigger element position or the duration changed\n     * @fires {@link Scene.change}, if the duration changed\n     *\n     * @returns {Scene} Parent object for chaining.\n     */\n    Scene.prototype.refresh = function () {\n        this.updateDuration();\n        this.updateTriggerElementPosition();\n        // Update trigger element position\n        return this;\n    };\n    /**\n     * Pin an element for the duration of the scene.\n     *\n     * If the scene duration is 0 the element will only be unpinned, if the user scrolls back past the start position.\n     *\n     * Make sure only one pin is applied to an element at the same time.\n     *\n     * An element can be pinned multiple times, but only successively.\n     *\n     * _**NOTE:** The option `pushFollowers` has no effect, when the scene duration is 0._\n     *\n     * @example\n     * // Pin element and push all following elements down by the amount of the pin duration.\n     * scene.setPin(\"#pin\");\n     *\n     * // Pin element and keeping all following elements in their place. The pinned element will move past them.\n     * scene.setPin(\"#pin\", {pushFollowers: false});\n     *\n     * @param {(string|HTMLElement)} element - A Selector targeting an element or a DOM object that is supposed to be pinned.\n     * @param {object} [settings] - settings for the pin\n     * @param {boolean} [settings.pushFollowers=true] - If `true` following elements will be \"pushed\" down for the duration of the pin, if `false` the pinned element will just scroll past them.\n                               Ignored, when duration is `0`.\n    * @param {string} [settings.spacerClass=\"scrollmagic-pin-spacer\"] - Classname of the pin spacer element, which is used to replace the element.\n    *\n    * @returns {Scene} Parent object for chaining.\n    */\n    Scene.prototype.setPin = function (element, pushFollowers) {\n        var _a, _b, _c, _d, _e, _f;\n        // Default push followers = true\n        pushFollowers = pushFollowers !== undefined ? pushFollowers : true;\n        // Validate Element\n        element = DomUtils.getElements(element)[0];\n        if (!element) {\n            this.log(1, \"ERROR calling method 'setPin()': Invalid pin element supplied.\");\n            return this; // cancel\n        }\n        else if (DomUtils.css(element, \"position\") === \"fixed\") {\n            this.log(1, \"ERROR calling method 'setPin()': Pin does not work with elements that are positioned 'fixed'.\");\n            return this; // cancel\n        }\n        if (this.pin) {\n            // Preexisting pin?\n            if (this.pin === element) {\n                // Same pin we already have -> do nothing\n                return this; // cancel\n            }\n            else {\n                // Kill old pin\n                this.removePin();\n            }\n        }\n        this.pin = element;\n        var parentDisplay = (_a = this.pin.parentNode) === null || _a === void 0 ? void 0 : _a.style.display;\n        var boundsParams = [\n            \"top\",\n            \"left\",\n            \"bottom\",\n            \"right\",\n            \"margin\",\n            \"marginLeft\",\n            \"marginRight\",\n            \"marginTop\",\n            \"marginBottom\",\n        ];\n        if (this.pin.parentElement) {\n            this.pin.parentElement.style.display = \"none\"; // Hack start to force css to return stylesheet values instead of calculated px values.\n        }\n        var inFlow = DomUtils.css(this.pin, \"position\") != \"absolute\";\n        var pinCSS = DomUtils.css(this.pin, boundsParams.concat([\"display\"]));\n        var sizeCSS = DomUtils.css(this.pin, [\"width\", \"height\"]);\n        if (this.pin.parentElement) {\n            this.pin.parentElement.style.display = parentDisplay; // Hack end\n        }\n        if (!inFlow && pushFollowers) {\n            this.log(2, \"WARNING: If the pinned element is positioned absolutely pushFollowers will be disabled.\");\n            pushFollowers = false;\n        }\n        // Create spacer and insert\n        var spacer = (_b = this.pin.parentNode) === null || _b === void 0 ? void 0 : _b.insertBefore(document.createElement(\"div\"), this.pin);\n        var spacerCSS = DomUtils.extend(pinCSS, {\n            position: inFlow ? \"relative\" : \"absolute\",\n            boxSizing: \"content-box\",\n            mozBoxSizing: \"content-box\",\n            webkitBoxSizing: \"content-box\",\n        });\n        if (!inFlow) {\n            // Copy size if positioned absolutely, to work for bottom/right positioned elements.\n            DomUtils.extend(spacerCSS, DomUtils.css(this.pin, [\"width\", \"height\"]));\n        }\n        DomUtils.css(spacer, spacerCSS);\n        spacer === null || spacer === void 0 ? void 0 : spacer.setAttribute(Scene.PIN_SPACER_ATTRIBUTE, \"\");\n        DomUtils.addClass(spacer, [\"scrollmagic-pin-spacer\"]);\n        // Set the pin Options\n        if (spacer) {\n            this.pinOptions = {\n                spacer: spacer,\n                inFlow: inFlow,\n                pushFollowers: pushFollowers,\n                relSize: {\n                    // Save if size is defined using % values. if so, handle spacer resize differently...\n                    width: sizeCSS[\"width\"].slice(-1) === \"%\",\n                    height: sizeCSS[\"height\"].slice(-1) === \"%\",\n                    autoFullWidth: sizeCSS[\"width\"] === \"auto\" && inFlow && DomUtils.isMarginCollapseType(pinCSS[\"display\"]),\n                },\n            };\n        }\n        // if (!this.pin.___origStyle) {\n        //   this.pin.___origStyle = {}\n        //   const pinInlineCSS = this._pin.style\n        //   const copyStyles = boundsParams.concat([\n        //     \"width\",\n        //     \"height\",\n        //     \"position\",\n        //     \"boxSizing\",\n        //     \"mozBoxSizing\",\n        //     \"webkitBoxSizing\",\n        //   ])\n        //   copyStyles.forEach((val) => {\n        //     this.pin.___origStyle[val] = pinInlineCSS[val] || \"\"\n        //   })\n        // }\n        // If relative size, transfer it to spacer and make pin calculate it...\n        if ((_c = this.pinOptions) === null || _c === void 0 ? void 0 : _c.relSize.width) {\n            DomUtils.css(spacer, { width: sizeCSS[\"width\"] });\n        }\n        if ((_d = this.pinOptions) === null || _d === void 0 ? void 0 : _d.relSize.height) {\n            DomUtils.css(spacer, { height: sizeCSS[\"height\"] });\n        }\n        // Now place the pin element inside the spacer\n        spacer === null || spacer === void 0 ? void 0 : spacer.appendChild(this.pin);\n        // And set new css\n        DomUtils.css(this.pin, {\n            position: inFlow ? \"relative\" : \"absolute\",\n            margin: \"auto\",\n            top: \"auto\",\n            left: \"auto\",\n            bottom: \"auto\",\n            right: \"auto\",\n        });\n        if (((_e = this.pinOptions) === null || _e === void 0 ? void 0 : _e.relSize.width) || ((_f = this.pinOptions) === null || _f === void 0 ? void 0 : _f.relSize.autoFullWidth)) {\n            DomUtils.css(this.pin, {\n                boxSizing: \"border-box\",\n                mozBoxSizing: \"border-box\",\n                webkitBoxSizing: \"border-box\",\n            });\n        }\n        // Add listener to document to update pin position in case controller is not the document.\n        window.addEventListener(\"scroll\", this.updatePinInContainer.bind(this));\n        window.addEventListener(\"resize\", this.updatePinInContainer.bind(this));\n        window.addEventListener(\"resize\", this.updateRelativePinSpacer.bind(this));\n        // Add mousewheel listener to catch scrolls over fixed elements\n        this.pin.addEventListener(\"mousewheel\", this.onMousewheelOverPin.bind(this));\n        this.pin.addEventListener(\"DOMMouseScroll\", this.onMousewheelOverPin.bind(this));\n        this.log(3, \"Added pin\");\n        // Finally update the pin to init\n        this.updatePinState();\n        return this;\n    };\n    /**\n     * Remove the pin from the scene.\n     *\n     * @example\n     * // Remove the pin from the scene without resetting it (the spacer is not removed)\n     * scene.removePin()\n     *\n     * // Remove the pin from the scene and reset the pin element to its initial position (spacer is removed)\n     * scene.removePin(true)\n     *\n     * @param {boolean} [reset=false] - If `false` the spacer will not be removed and the element's position will not be reset.\n     *\n     * @returns {Scene} Parent object for chaining.\n     */\n    Scene.prototype.removePin = function (reset) {\n        var _a, _b, _c, _d, _e, _f;\n        if (this.pin) {\n            if (this.state === SceneState.During) {\n                this.updatePinState(true); // Force unpin at position\n            }\n            if (reset || !this.controller) {\n                // If there's no controller no progress was made anyway...\n                var pinTarget = (_a = this.pinOptions) === null || _a === void 0 ? void 0 : _a.spacer.firstChild; // Usually the pin element, but may be another spacer (cascaded pins)...\n                if (pinTarget === null || pinTarget === void 0 ? void 0 : pinTarget.hasAttribute(Scene.PIN_SPACER_ATTRIBUTE)) {\n                    // Copy margins to child spacer\n                    var style_1 = (_b = this.pinOptions) === null || _b === void 0 ? void 0 : _b.spacer.style;\n                    if (style_1) {\n                        var values = [\"margin\", \"marginLeft\", \"marginRight\", \"marginTop\", \"marginBottom\"];\n                        var margins_1 = {};\n                        values.forEach(function (val) {\n                            margins_1[val] = style_1[val] || \"\";\n                        });\n                        DomUtils.css(pinTarget, margins_1);\n                    }\n                }\n                if (pinTarget) {\n                    (_d = (_c = this.pinOptions) === null || _c === void 0 ? void 0 : _c.spacer.parentNode) === null || _d === void 0 ? void 0 : _d.insertBefore(pinTarget, this.pinOptions.spacer);\n                }\n                (_f = (_e = this.pinOptions) === null || _e === void 0 ? void 0 : _e.spacer.parentNode) === null || _f === void 0 ? void 0 : _f.removeChild(this.pinOptions.spacer);\n                // FIXME: ___origStyle doesn't exist anywhere\n                // if (!(<HTMLElement>this.pin.parentNode)?.hasAttribute(Scene.PIN_SPACER_ATTRIBUTE)) {\n                //   // If it's the last pin for this element -> restore inline styles\n                //   // TODO: only correctly set for first pin (when cascading) - how to fix?\n                //   DomUtils.css(this.pin, this.pin?.___origStyle)\n                //   delete this.pin?.___origStyle\n                // }\n            }\n            window.removeEventListener(\"scroll\", this.updatePinInContainer.bind(this));\n            window.removeEventListener(\"resize\", this.updatePinInContainer.bind(this));\n            window.removeEventListener(\"resize\", this.updateRelativePinSpacer.bind(this));\n            this.pin.removeEventListener(\"mousewheel\", this.onMousewheelOverPin.bind(this));\n            this.pin.removeEventListener(\"DOMMouseScroll\", this.onMousewheelOverPin.bind(this));\n            this.pin = undefined;\n            this.log(3, \"removed pin (reset: \" + (reset ? \"true\" : \"false\") + \")\");\n        }\n        return this;\n    };\n    /**\n     * Add a tween to the scene.\n     *\n     * If you want to add multiple tweens, add them into a GSAP Timeline object and supply it instead (see example below).\n     *\n     * If the scene has a duration, the tween's duration will be projected to the scroll distance of the scene, meaning its progress will be synced to scrollbar movement.\n     * For a scene with a duration of `0`, the tween will be triggered when scrolling forward past the scene's trigger position and reversed, when scrolling back.\n     * To gain better understanding, check out the [Simple Tweening example](../examples/basic/simple_tweening.html).\n     *\n     * Instead of supplying a tween this method can also be used as a shorthand for `gsap.to()` (see example below).\n     *\n     * @example\n     * // Add a single tween via variable\n     * let tween = gsap.to(\"obj\"), 1, {x: 100}\n     * scene.setTween(tween)\n     *\n     * // Add multiple tweens, wrapped in a timeline.\n     * let timeline = gsap.timeline()\n     * let tween1 = gsap.from(\"obj1\", 1, {x: 100})\n     * let tween2 = gsap.to(\"obj2\", 1, {y: 100})\n     * timeline\n     *   .add(tween1)\n     *   .add(tween2);\n     * scene.addTween(timeline)\n     *\n     * // Short hand to add a gsap.to() tween\n     * scene.setTween(\"obj3\", 0.5, {y: 100})\n     *\n     * // Short hand to add a gsap.to() tween for 1 second\n     * // This is useful, when the scene has a duration and the tween duration isn't important anyway\n     * scene.setTween(\"obj3\", {y: 100})\n     *\n     * @param {(GSAPTimeline)} tween - A Timeline object that should be animated in the scene.\n     * @param {(number)} duration - A duration for the tween, or tween parameters. If an object containing parameters are supplied, a default duration of 1 will be used.\n     * @param {object} params - The parameters for the tween\n     * @returns {Scene} Parent object for chaining.\n     */\n    Scene.prototype.setTween = function (tween, easing) {\n        this.easing = !!easing;\n        tween.pause();\n        // Kill old tween?\n        if (this.tween) {\n            this.removeTween();\n        }\n        this.tween = tween;\n        this.log(3, \"Added tween\");\n        this.updateTweenProgress();\n        return this;\n    };\n    /**\n     * Remove the tween from the scene.\n     *\n     * This will terminate the control of the Scene over the tween.\n     *\n     * Using the reset option you can decide if the tween should remain in the current state or be rewound to set the target elements back to the state they were in before the tween was added to the scene.\n     *\n     * @example\n     * // Remove the tween from the scene without resetting it\n     * scene.removeTween()\n     *\n     * // Remove the tween from the scene and reset it to initial position\n     * scene.removeTween(true)\n     *\n     * @param {boolean} [reset=false] - If `true` the tween will be reset to its initial values.\n     *\n     * @returns {Scene} Parent object for chaining.\n     */\n    Scene.prototype.removeTween = function (reset) {\n        if (this.tween) {\n            if (reset) {\n                this.tween.progress(0).pause();\n            }\n            this.tween.kill();\n            this.tween = undefined;\n            this.log(3, \"Removed tween (reset: \" + (reset ? \"true\" : \"false\") + \")\");\n        }\n        return this;\n    };\n    /**\n     * Add visual indicators for a ScrollMagic.Scene.\n     *\n     * @example\n     * // Add basic indicators\n     * scene.addIndicators()\n     *\n     * // Passing options\n     * scene.addIndicators({name: \"pin scene\", colorEnd: \"#FFFFFF\"})\n     *\n     * @param {IndicatorOptions} [options] - An object containing one or more options for the indicators.\n     * @param {(string|HTMLElement)} [options.parent] - A selector or a DOM Object that the indicators should be added to. If undefined, the controller's container will be used.\n     *\n     * @returns {Scene} Parent object for chaining.\n     */\n    Scene.prototype.addIndicators = function (options) {\n        if (!this.indicator) {\n            this.autoIndex++;\n            this.indicator = new Indicator(this, options, this.autoIndex);\n            this.on(\"add.plugin_addIndicators\", this.indicator.add.bind(this.indicator));\n            this.on(\"remove.plugin_addIndicators\", this.indicator.remove.bind(this.indicator));\n            this.on(\"destroy.plugin_addIndicators\", this.removeIndicators.bind(this));\n            // It the scene already has a controller we can start right away.\n            if (this.controller) {\n                this.indicator.add();\n            }\n        }\n        return this;\n    };\n    /**\n     * Removes visual indicators from a ScrollMagic.Scene.\n     *\n     * @example\n     * // Remove previously added indicators\n     * scene.removeIndicators()\n     *\n     * @returns {Scene} Parent object for chaining.\n     */\n    Scene.prototype.removeIndicators = function () {\n        if (this.indicator) {\n            this.indicator.remove();\n            this.off(\"*.plugin_addIndicators\");\n            this.indicator = undefined;\n        }\n        return this;\n    };\n    /**\n     * Updates the duration if set to a dynamic function.\n     *\n     * This method is called when the scene is added to a controller and in regular intervals from the controller through scene.refresh().\n     *\n     * @fires {@link Scene.change}, if the duration changed\n     * @fires {@link Scene.shift}, if the duration changed\n     *\n     * @param {boolean} [suppressEvents=false] - If true the shift event will be suppressed.\n     */\n    Scene.prototype.updateDuration = function (suppressEvents) {\n        // Update duration\n        if (this.durationUpdateMethod) {\n            var newDuration = this.validateDuration(this.durationUpdateMethod());\n            var changed = newDuration !== this._duration;\n            this._duration = newDuration;\n            if (changed && !suppressEvents) {\n                // Set\n                this.trigger(\"change\", { what: \"duration\", newValue: this._duration });\n                this.trigger(\"shift\", { reason: \"duration\" });\n            }\n        }\n    };\n    /**\n     * Updates the position of the triggerElement, if present.\n     *\n     * This method is called ...\n     *  - ... when the triggerElement is changed\n     *  - ... when the scene is added to a (new) controller\n     *  - ... in regular intervals from the controller through scene.refresh().\n     *\n     * @fires {@link Scene.shift}, if the position changed\n     *\n     * @param {boolean} [suppressEvents=false] - If true the shift event will be suppressed.\n     */\n    Scene.prototype.updateTriggerElementPosition = function (suppressEvents) {\n        var elementPos = 0;\n        var triggerElement = this._triggerElement;\n        // Either an element exists or was removed and the _triggerPosition is still > 0\n        if (this.controller && (triggerElement || this._triggerPosition > 0)) {\n            // There currently a triggerElement set\n            if (triggerElement) {\n                // Check if element is still attached to DOM\n                if (triggerElement === null || triggerElement === void 0 ? void 0 : triggerElement.parentNode) {\n                    var controllerInfo = this.controller.info();\n                    var containerOffset = DomUtils.getOffset(controllerInfo.container); // Container position is needed because element offset is returned in relation to document, not in relation to container.\n                    var param = controllerInfo.isVertical ? OffsetParam.Top : OffsetParam.Left; // Which param is of interest?\n                    // If parent is spacer, use spacer position instead so correct start position is returned for pinned elements.\n                    while (triggerElement.parentNode.hasAttribute(Scene.PIN_SPACER_ATTRIBUTE)) {\n                        triggerElement = triggerElement.parentNode;\n                    }\n                    var elementOffset = DomUtils.getOffset(triggerElement);\n                    // Container is not the document root, so substract scroll Position to get correct trigger element position relative to scrollcontent\n                    if (!controllerInfo.isDocument) {\n                        containerOffset[param] -= this.controller.scrollPos();\n                    }\n                    elementPos = elementOffset[param] - containerOffset[param];\n                }\n                else {\n                    // There was an element, but it was removed from DOM\n                    this.log(2, \"WARNING: triggerElement was removed from DOM and will be reset to\", undefined);\n                    this.triggerElement = undefined; // Unset, so a change event is triggered\n                }\n            }\n            var changed = elementPos != this._triggerPosition;\n            this._triggerPosition = elementPos;\n            if (changed && !suppressEvents) {\n                this.trigger(\"shift\", { reason: \"triggerElementPosition\" });\n            }\n        }\n    };\n    /**\n     * Update the start and end scrollOffset of the container.\n     *\n     * The positions reflect what the controller's scroll position will be at the start and end respectively.\n     *\n     * Is called, when:\n     *   - Scene event \"change\" is called with: offset, triggerHook, duration\n     *   - Scroll container event \"resize\" is called\n     *   - The position of the triggerElement changes\n     *   - The controller changes -> addTo()\n     */\n    Scene.prototype.updateScrollOffset = function () {\n        this._scrollOffset = { start: this._triggerPosition + this._offset, end: 0 };\n        // Take away triggerHook portion to get relative to top\n        if (this.controller && this._triggerElement) {\n            this._scrollOffset.start -= this.controller.info().size * this._triggerHook;\n        }\n        this._scrollOffset.end = this._scrollOffset.start + this._duration;\n    };\n    /**\n     * Update the pin state.\n     */\n    Scene.prototype.updatePinState = function (forceUnpin) {\n        if (this.pin && this.pinOptions && this.controller) {\n            var containerInfo = this.controller.info();\n            var pinTarget = this.pinOptions.spacer.firstChild; // May be pin element or another spacer, if cascading pins\n            // During scene or if duration is 0 and we are past the trigger\n            if (!forceUnpin && this.state === SceneState.During) {\n                // Pinned state\n                if (DomUtils.css(pinTarget, \"position\") != \"fixed\") {\n                    // Change state before updating pin spacer (position changes due to fixed collapsing might occur.)\n                    DomUtils.css(pinTarget, { position: \"fixed\" });\n                    // Update pin spacer\n                    this.updatePinDimensions();\n                }\n                var fixedPos = DomUtils.getOffset(this.pinOptions.spacer, true); // Get viewport position of spacer\n                var scrollDistance = this._reverse || this._duration === 0\n                    ? containerInfo.scrollPos - this._scrollOffset.start // Quicker\n                    : Math.round(this._progress * this._duration * 10) / 10; // If no reverse and during pin the position needs to be recalculated using the progress\n                // Add scrollDistance\n                fixedPos[containerInfo.isVertical ? \"top\" : \"left\"] += scrollDistance;\n                // Set new values\n                if (this.pinOptions.spacer.firstChild) {\n                    DomUtils.css(this.pinOptions.spacer.firstChild, {\n                        top: fixedPos.top,\n                        left: fixedPos.left,\n                    });\n                }\n            }\n            else {\n                // Unpinned state\n                var newCSS = {\n                    position: this.pinOptions.inFlow ? \"relative\" : \"absolute\",\n                    top: 0,\n                    left: 0,\n                };\n                var change = DomUtils.css(pinTarget, \"position\") != newCSS.position;\n                if (!this.pinOptions.pushFollowers) {\n                    newCSS[containerInfo.isVertical ? \"top\" : \"left\"] = this._duration * this._progress;\n                }\n                else if (this._duration > 0) {\n                    // Only concerns scenes with duration\n                    if (this.state === SceneState.After &&\n                        parseFloat(DomUtils.css(this.pinOptions.spacer, \"padding-top\")) === 0) {\n                        change = true; // If in after state but havent updated spacer yet (jumped past pin)\n                    }\n                    else if (this.state === SceneState.Before &&\n                        parseFloat(DomUtils.css(this.pinOptions.spacer, \"padding-bottom\")) === 0) {\n                        // Before\n                        change = true; // Jumped past fixed state upward direction\n                    }\n                }\n                // Set new values\n                DomUtils.css(pinTarget, newCSS);\n                if (change) {\n                    // Update pin spacer if state changed\n                    this.updatePinDimensions();\n                }\n            }\n        }\n    };\n    /**\n     * Updates the Pin state (in certain scenarios)\n     *\n     * If the controller container is not the document and we are mid-pin-phase scrolling or resizing the main document can result to wrong pin positions.\n     *\n     * So this function is called on resize and scroll of the document.\n     */\n    Scene.prototype.updatePinInContainer = function () {\n        if (this.controller && this.pin && this.state === SceneState.During && !this.controller.info().isDocument) {\n            this.updatePinState();\n        }\n    };\n    /**\n     * Updates the Pin spacer size state (in certain scenarios)\n     *\n     * If container is resized during pin and relatively sized the size of the pin might need to be updated...\n     *\n     * So this function is called on resize of the container.\n     */\n    Scene.prototype.updateRelativePinSpacer = function () {\n        if (this.controller &&\n            this.pin && // Well, duh\n            this.pinOptions &&\n            this.state === SceneState.During && // element in pinned state? // is width or height relatively sized, but not in relation to body? then we need to recalc.\n            (((this.pinOptions.relSize.width || this.pinOptions.relSize.autoFullWidth) &&\n                this.pinOptions.spacer.parentNode &&\n                DomUtils.getWidth(window) != DomUtils.getWidth(this.pinOptions.spacer.parentNode)) ||\n                (this.pinOptions.relSize.height &&\n                    this.pinOptions.spacer.parentNode &&\n                    DomUtils.getHeight(window) != DomUtils.getHeight(this.pinOptions.spacer.parentNode)))) {\n            this.updatePinDimensions();\n        }\n    };\n    /**\n     * Update the pin spacer and/or element size.\n     *\n     * The size of the spacer needs to be updated whenever the duration of the scene changes, if it is to push down following elements.\n     */\n    Scene.prototype.updatePinDimensions = function () {\n        var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;\n        // No spacerresize, if original position is absolute\n        if (this.pin && this.controller && ((_a = this.pinOptions) === null || _a === void 0 ? void 0 : _a.inFlow)) {\n            var during = this.state === SceneState.During;\n            var isVertical = this.controller.info().isVertical;\n            var pinTarget = (_b = this.pinOptions) === null || _b === void 0 ? void 0 : _b.spacer.firstChild; // Usually the pined element but can also be another spacer (cascaded pins)\n            var marginCollapse = DomUtils.isMarginCollapseType(DomUtils.css((_c = this.pinOptions) === null || _c === void 0 ? void 0 : _c.spacer, \"display\"));\n            var css = {};\n            // Set new size\n            // If relsize: spacer -> pin | else: pin -> spacer\n            if (((_d = this.pinOptions) === null || _d === void 0 ? void 0 : _d.relSize.width) || ((_e = this.pinOptions) === null || _e === void 0 ? void 0 : _e.relSize.autoFullWidth)) {\n                if (during) {\n                    DomUtils.css(this.pin, { width: DomUtils.getWidth((_f = this.pinOptions) === null || _f === void 0 ? void 0 : _f.spacer) });\n                }\n                else {\n                    DomUtils.css(this.pin, { width: \"100%\" });\n                }\n            }\n            else {\n                // minwidth is needed for cascaded pins.\n                css[\"min-width\"] = DomUtils.getWidth(isVertical ? this.pin : pinTarget, true, true);\n                css[\"width\"] = during ? css[\"min-width\"] : \"auto\";\n            }\n            if ((_g = this.pinOptions) === null || _g === void 0 ? void 0 : _g.relSize.height) {\n                if (during) {\n                    // The only padding the spacer should ever include is the duration (if pushFollowers = true), so we need to substract that.\n                    if (this.pinOptions) {\n                        DomUtils.css(this.pin, {\n                            height: DomUtils.getHeight((_h = this.pinOptions) === null || _h === void 0 ? void 0 : _h.spacer) - (((_j = this.pinOptions) === null || _j === void 0 ? void 0 : _j.pushFollowers) ? this._duration : 0),\n                        });\n                    }\n                }\n                else {\n                    DomUtils.css(this.pin, { height: \"100%\" });\n                }\n            }\n            else {\n                // Margin is only included if it's a cascaded pin to resolve an IE9 bug\n                css[\"min-height\"] = DomUtils.getHeight(isVertical ? pinTarget : this.pin, true, !marginCollapse); // Needed for cascading pins\n                css[\"height\"] = during ? css[\"min-height\"] : \"auto\";\n            }\n            // Add space for duration if pushFollowers is true\n            if ((_k = this.pinOptions) === null || _k === void 0 ? void 0 : _k.pushFollowers) {\n                css[\"padding\" + (isVertical ? \"Top\" : \"Left\")] = this._duration * this._progress;\n                css[\"padding\" + (isVertical ? \"Bottom\" : \"Right\")] = this._duration * (1 - this._progress);\n            }\n            DomUtils.css((_l = this.pinOptions) === null || _l === void 0 ? void 0 : _l.spacer, css);\n        }\n    };\n    /**\n     * Is called, when the mousewhel is used while over a pinned element inside a div container.\n     *\n     * If the scene is in fixed state scroll events would be counted towards the body. This forwards the event to the scroll container.\n     */\n    Scene.prototype.onMousewheelOverPin = function (e) {\n        if (this.controller && this.pin && this.state === SceneState.During && !this.controller.info().isDocument) {\n            // Un pin state\n            e.preventDefault();\n            this.controller.setScrollPos(this.controller.info().scrollPos -\n                ((e[\"wheelDelta\"] || e[this.controller.info().isVertical ? \"wheelDeltaY\" : \"wheelDeltaX\"]) / 3 ||\n                    -e[\"detail\"] * 30));\n        }\n    };\n    Scene.prototype.setOptions = function (options) {\n        var newOptions = {\n            duration: 0,\n            offset: 0,\n            triggerElement: undefined,\n            triggerHook: 0.5,\n            reverse: true,\n            logLevel: 2,\n            tweenChanges: false,\n        };\n        if (options.duration !== undefined) {\n            newOptions.duration = options.duration;\n        }\n        this._duration = this.validateDuration(newOptions.duration);\n        if (options.offset !== undefined) {\n            newOptions.offset = options.offset;\n        }\n        this._offset = this.validateOffset(newOptions.offset);\n        if (options.triggerElement !== undefined) {\n            newOptions.triggerElement = options.triggerElement;\n        }\n        this._triggerElement =\n            newOptions.triggerElement !== undefined\n                ? this.validateTriggerElement(newOptions.triggerElement)\n                : newOptions.triggerElement;\n        if (options.triggerHook !== undefined) {\n            newOptions.triggerHook = options.triggerHook;\n        }\n        this._triggerHook = this.validateTriggerHook(newOptions.triggerHook);\n        if (options.reverse !== undefined) {\n            newOptions.reverse = options.reverse;\n        }\n        this._reverse = this.validateReverse(newOptions.reverse);\n        if (options.logLevel !== undefined) {\n            newOptions.logLevel = options.logLevel;\n        }\n        this._logLevel = this.valdiateLogLevel(newOptions.logLevel);\n        if (options.tweenChanges !== undefined) {\n            newOptions.tweenChanges = options.tweenChanges;\n        }\n        this._tweenChanges = this.validateTweenChanges(newOptions.tweenChanges);\n    };\n    /**\n     * Trigger an event.\n     *\n     * @example\n     * this.trigger(\"change\")\n     *\n     * @param {string} name - The name of the event that should be triggered.\n     * @param {SceneEventVars} [vars] - An object containing info that should be passed to the callback.\n     *\n     * @returns {Scene} Parent object for chaining.\n     */\n    Scene.prototype.trigger = function (name, vars) {\n        var _this = this;\n        var parts = name.trim().split(\".\");\n        var eventName = parts[0];\n        var namespace = parts[1];\n        var listeners = this.listeners ? this.listeners[eventName] || [] : [];\n        this.log(3, \"Event fired:\", eventName, vars ? \"->\" : \"\", vars || \"\");\n        if (listeners.length) {\n            listeners.forEach(function (listener) {\n                if (!namespace || namespace === listener.namespace) {\n                    listener.callback.call(_this, new SceneEvent(eventName, listener.namespace, _this, vars));\n                }\n            });\n        }\n        return this;\n    };\n    /**\n     * Define a css class modification while the scene is active.\n     *\n     * When the scene triggers the classes will be added to the supplied element and removed, when the scene is over.\n     *\n     * If the scene duration is 0 the classes will only be removed if the user scrolls back past the start position.\n     *\n     * @example\n     * // Add the class 'myclass' to the element with the id 'my-elem' for the duration of the scene\n     * scene.setClassToggle(\"#my-elem\", \"myclass\")\n     *\n     * // Add multiple classes to multiple elements defined by the selector '.classChange'\n     * scene.setClassToggle(\".classChange\", \"class1 class2 class3\")\n     *\n     * @param {(string|HTMLElement)} element - A Selector targeting one or more elements or a DOM object that is supposed to be modified.\n     * @param {string} classes - One or more Classnames (separated by space) that should be added to the element during the scene.\n     *\n     * @returns {Scene} Parent object for chaining.\n     */\n    Scene.prototype.setClassToggle = function (element, classes) {\n        var _this = this;\n        var elems = DomUtils.getElements(element);\n        if (elems.length === 0 || !Type.isString(classes)) {\n            this.log(1, \"ERROR calling method 'setClassToggle()': Invalid \" +\n                (elems.length === 0 ? \"element\" : \"classes\") +\n                \" supplied.\");\n            return this;\n        }\n        if (this.cssClassElems.length > 0) {\n            // Remove old ones\n            this.removeClassToggle();\n        }\n        this.cssClasses = classes.trim().split(\" \");\n        this.cssClassElems = elems;\n        this.on(\"enter.internal_class leave.internal_class\", function (e) {\n            var toggle = (e === null || e === void 0 ? void 0 : e.type) === \"enter\" ? DomUtils.addClass : DomUtils.removeClass;\n            _this.cssClassElems.forEach(function (elem) {\n                toggle(elem, _this.cssClasses);\n            });\n        });\n        return this;\n    };\n    /**\n     * Remove the class binding from the scene.\n     *\n     * @example\n     * // Remove class binding from the scene without reset\n     * scene.removeClassToggle()\n     *\n     * // Remove class binding and remove the changes it caused\n     * scene.removeClassToggle(true)\n     *\n     * @param {boolean} [reset=false] - If `false` and the classes are currently active, they will remain on the element. If `true` they will be removed.\n     * @returns {Scene} Parent object for chaining.\n     */\n    Scene.prototype.removeClassToggle = function (reset) {\n        var _this = this;\n        if (reset) {\n            this.cssClassElems.forEach(function (elem) {\n                DomUtils.removeClass(elem, _this.cssClasses);\n            });\n        }\n        this.off(\"start.internal_class end.internal_class\");\n        this.cssClasses = undefined;\n        this.cssClassElems = [];\n        return this;\n    };\n    /**\n     * Update the tween progress to current position.\n     */\n    Scene.prototype.updateTweenProgress = function () {\n        if (this.tween) {\n            var progress_1 = this.progress;\n            var state = this.state;\n            if (this.tween.repeat && this.tween.repeat() === -1) {\n                // Infinite loop, so not in relation to progress\n                if (state === SceneState.During && this.tween.paused()) {\n                    this.tween.play();\n                }\n                else if (state !== SceneState.During && !this.tween.paused()) {\n                    this.tween.pause();\n                }\n            }\n            else if (progress_1 != this.tween.progress()) {\n                // Do we even need to update the progress?\n                // No infinite loop - so should we just play or go to a specific point in time?\n                if (this.duration === 0) {\n                    // Play the animation\n                    if (progress_1 > 0) {\n                        // Play from 0 to 1\n                        this.tween.play();\n                    }\n                    else {\n                        // Play from 1 to 0\n                        this.tween.reverse();\n                    }\n                }\n                else {\n                    // Go to a specific point in time\n                    if (this.tweenChanges && this.tween.tweenTo) {\n                        // Go smooth\n                        this.tween.tweenTo(progress_1 * this.tween.duration());\n                    }\n                    else if (this.easing) {\n                        // Apply ease for every tween progress, making the animaton smooth\n                        var tweens = this.tween.getChildren();\n                        tweens.forEach(function (tween) {\n                            var _a, _b;\n                            if (((_a = tween.vars.data) === null || _a === void 0 ? void 0 : _a.ease) && ((_b = tween.vars.data) === null || _b === void 0 ? void 0 : _b.momentum)) {\n                                gsap.to(tween, tween.vars.data.momentum, { progress: progress_1, ease: tween.vars.data.ease });\n                            }\n                            else {\n                                tween.totalProgress(progress_1).pause();\n                            }\n                        });\n                    }\n                    else {\n                        // Just hard set it\n                        this.tween.totalProgress(progress_1).pause(); // Use totalProgress because it considers repeat property\n                    }\n                }\n            }\n        }\n    };\n    /**\n     * Trigger a shift event, when the container is resized and the triggerHook is > 1.\n     */\n    Scene.prototype.onContainerResize = function () {\n        if (this._triggerHook > 0) {\n            this.trigger(\"shift\", { reason: \"containerResize\" });\n        }\n    };\n    /**\n     * Send a debug message to the console.\n     *\n     * @param {...args[]} args - One or more variables that should be passed to the console.\n     */\n    Scene.prototype.log = function () {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments[_i];\n        }\n        var logLevel = args[0];\n        if (this.logLevel >= logLevel) {\n            Array.prototype.splice.call(args, 1, 0, \"(\".concat(Scene.NAMESPACE, \")\"));\n            Logger.log.apply(window, args);\n        }\n    };\n    /**\n     * Valdiators\n     */\n    Scene.prototype.validateDuration = function (value) {\n        var _this = this;\n        // String\n        if (Type.isString(value)) {\n            var str = value;\n            if (str.match(/^(\\.|\\d)*\\d+%$/)) {\n                // Percentage value\n                var perc_1 = parseFloat(str) / 100;\n                value = function () {\n                    return _this._controller ? _this._controller.info().size * perc_1 : 0;\n                };\n            }\n        }\n        // Function\n        if (Type.isFunction(value)) {\n            this.durationUpdateMethod = value;\n            try {\n                value = this.durationUpdateMethod();\n            }\n            catch (e) {\n                value = -1; // Will cause error below\n            }\n        }\n        // Value has to be float\n        if (Type.isString(value)) {\n            value = parseFloat(value);\n        }\n        if (!Type.isNumber(value) || value < 0) {\n            if (this.durationUpdateMethod) {\n                this.durationUpdateMethod = undefined;\n                throw ['Invalid return value of supplied function for option \"duration\": ', value];\n            }\n            else {\n                throw ['Invalid value for option \"duration\":', value];\n            }\n        }\n        return value;\n    };\n    Scene.prototype.validateOffset = function (value) {\n        if (Type.isString(value)) {\n            value = parseFloat(value);\n        }\n        return value;\n    };\n    Scene.prototype.validateTriggerElement = function (value) {\n        var elem = DomUtils.getElements(value)[0];\n        if (elem && elem.parentNode) {\n            return elem;\n        }\n        else {\n            throw ['Element defined in option \"triggerElement\" was not found: ', value];\n        }\n    };\n    Scene.prototype.validateTriggerHook = function (value) {\n        var translate = {\n            onCenter: 0.5,\n            onEnter: 1,\n            onLeave: 0,\n        };\n        if (Type.isNumber(value)) {\n            return Math.max(0, Math.min(value, 1)); // Make sure its betweeen 0 and 1\n        }\n        else if (Type.isString(value) && value in translate) {\n            return translate[value];\n        }\n        throw ['Invalid value for option \"triggerHook\": ', value];\n    };\n    Scene.prototype.validateReverse = function (value) {\n        return !!value; // Force boolean\n    };\n    Scene.prototype.validateTweenChanges = function (value) {\n        return !!value; // Force boolean\n    };\n    Scene.prototype.valdiateLogLevel = function (value) {\n        if (value < 0 || value > 3) {\n            throw ['Invalid value for option \"logLevel\": ', value];\n        }\n        return value;\n    };\n    // Need to trigger the \"change\" event, so that updateScrollOffset gets called\n    // eslint-disable-next-line\n    Scene.prototype.setValue = function (attribute, value) {\n        switch (attribute) {\n            case \"duration\":\n                this.duration = this.validateDuration(value);\n                break;\n            case \"offset\":\n                this.offset = this.validateOffset(value);\n                break;\n            case \"triggerElement\":\n                this.triggerElement = this.validateTriggerElement(value);\n                break;\n            case \"triggerHook\":\n                this.triggerHook = this.validateTriggerHook(value);\n                break;\n            case \"reverse\":\n                this.reverse = this.validateReverse(value);\n                break;\n            case \"tweenChanges\":\n                this.tweenChanges = this.validateTweenChanges(value);\n                break;\n            case \"logLevel\":\n                this.logLevel = this.valdiateLogLevel(value);\n                break;\n            default:\n                throw new Error(\"No validator for attribute \\\"\".concat(attribute, \"\\\"\"));\n        }\n    };\n    Scene.NAMESPACE = \"Scene\";\n    Scene.PIN_SPACER_ATTRIBUTE = \"data-scrollmagic-pin-spacer\";\n    return Scene;\n}());\nexport default Scene;\n//# sourceMappingURL=scene.js.map","import Scene from \"./scrollmagic/scene\";\nvar ScrollScene = /** @class */ (function () {\n    function ScrollScene(options) {\n        this.scene = new Scene(options);\n        return this;\n    }\n    ScrollScene.prototype.triggerElement = function (value) {\n        if (value !== undefined) {\n            this.scene.triggerElement = this.scene.validateTriggerElement(value);\n        }\n        return this.scene.triggerElement;\n    };\n    ScrollScene.prototype.triggerHook = function (value) {\n        if (value !== undefined) {\n            this.scene.triggerHook = this.scene.validateTriggerHook(value);\n        }\n        return this.scene.triggerHook;\n    };\n    ScrollScene.prototype.duration = function (value) {\n        if (value !== undefined) {\n            this.scene.duration = this.scene.validateDuration(value);\n        }\n        return this.scene.duration;\n    };\n    ScrollScene.prototype.offset = function (value) {\n        if (value !== undefined) {\n            this.scene.offset = this.scene.validateOffset(value);\n        }\n        return this.scene.offset;\n    };\n    ScrollScene.prototype.reverse = function (value) {\n        if (value !== undefined) {\n            this.scene.reverse = this.scene.validateReverse(value);\n        }\n        return this.scene.reverse;\n    };\n    ScrollScene.prototype.progress = function (value) {\n        if (value !== undefined) {\n            this.scene.progress = value;\n        }\n        return this.scene.progress;\n    };\n    ScrollScene.prototype.tweenChanges = function (value) {\n        if (value !== undefined) {\n            this.scene.tweenChanges = value;\n        }\n        return this.scene.tweenChanges;\n    };\n    ScrollScene.prototype.setTween = function (tween, easing) {\n        this.scene.setTween(tween, easing);\n        return this;\n    };\n    ScrollScene.prototype.setClassToggle = function (element, classes) {\n        this.scene.setClassToggle(element, classes);\n        return this;\n    };\n    ScrollScene.prototype.setPin = function (element) {\n        this.pinnedElement = element;\n        return this;\n    };\n    ScrollScene.prototype.removePin = function (reset) {\n        this.scene.removePin(reset);\n        return this;\n    };\n    ScrollScene.prototype.on = function (names, callback) {\n        this.scene.on(names, callback);\n        return this;\n    };\n    ScrollScene.prototype.addIndicators = function (options) {\n        this.scene.addIndicators(options);\n        return this;\n    };\n    ScrollScene.prototype.addTo = function (controller) {\n        var _this = this;\n        this.controller = controller;\n        if (this.pinnedElement) {\n            /**\n             * Workaround\n             *\n             * Only in the case we're using smooth scrolling.\n             *\n             * Since transform creates a new local coordinate system, position: fixed is fixed to the origin\n             * of scrollbar content container, i.e. the left: 0, top: 0 point.\n             *\n             * Therefore, we need to apply offsets to make it work properly.\n             * https://github.com/idiotWu/smooth-scrollbar/issues/49#issuecomment-265358197\n             */\n            if (this.controller.smoothScrolling) {\n                var elementPosY_1 = 0;\n                this.pinnedScrollListener = (function (status) {\n                    if (elementPosY_1 === 0 && _this.scene.triggerElement) {\n                        var elementOffsetY = _this.pinnedElement.getBoundingClientRect().top;\n                        var triggerOffsetY = _this.scene.triggerElement.getBoundingClientRect().top;\n                        var triggerPosY = _this.scene.duration * _this.scene.triggerHook;\n                        elementPosY_1 = elementOffsetY - triggerOffsetY + triggerPosY;\n                    }\n                    var scrollPosY = status.offset.y;\n                    var top = elementPosY_1 + scrollPosY;\n                    var width = parseInt(\"\".concat(_this.pinnedElement.getBoundingClientRect().width));\n                    _this.pinnedElement.style.position = \"fixed\";\n                    _this.pinnedElement.style.top = \"\".concat(top, \"px\");\n                    _this.pinnedElement.style.left = \"\";\n                    _this.pinnedElement.style.width = \"\".concat(width, \"px\");\n                }).bind(this);\n                var pinnedEnterListener = function () { var _a; return (_a = _this.controller) === null || _a === void 0 ? void 0 : _a.addScrollbarListener(_this.pinnedScrollListener); };\n                var pinnedLeaveListener = function () { var _a; return (_a = _this.controller) === null || _a === void 0 ? void 0 : _a.removeScrollbarListener(_this.pinnedScrollListener); };\n                this.pinnedEnterListener = pinnedEnterListener.bind(this);\n                this.pinnedLeaveListener = pinnedLeaveListener.bind(this);\n                this.scene.on(\"enter\", this.pinnedEnterListener);\n                this.scene.on(\"leave\", this.pinnedLeaveListener);\n            }\n            else {\n                this.scene.setPin(this.pinnedElement);\n            }\n        }\n        this.scene.addTo(controller.controller);\n        return this;\n    };\n    ScrollScene.prototype.remove = function () {\n        this.scene.remove();\n        /**\n         * Workaround\n         *\n         * Only in the case we're using smooth scrolling.\n         *\n         * Since we're adding listeners to emulate the same pin feature that ScrollMagic has, when removing the scene,\n         * we need to remove these listeners and reset the element position.\n         */\n        if (this.pinnedElement && this.controller && this.controller.smoothScrolling) {\n            this.scene.off(\"enter\", this.pinnedEnterListener);\n            this.scene.off(\"leave\", this.pinnedLeaveListener);\n            this.controller.removeScrollbarListener(this.pinnedScrollListener);\n            this.pinnedElement.style.position = \"\";\n            this.pinnedElement.style.top = \"\";\n            this.pinnedElement.style.width = \"\";\n        }\n        this.controller = undefined;\n        return this;\n    };\n    ScrollScene.prototype.refresh = function () {\n        this.scene.refresh();\n        return this;\n    };\n    return ScrollScene;\n}());\nexport default ScrollScene;\n//# sourceMappingURL=scroll-scene.js.map","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n    extendStatics = Object.setPrototypeOf ||\r\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n    return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n    extendStatics(d, b);\r\n    function __() { this.constructor = d; }\r\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n    __assign = Object.assign || function __assign(t) {\r\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n            s = arguments[i];\r\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n        }\r\n        return t;\r\n    }\r\n    return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n    var t = {};\r\n    for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n        t[p] = s[p];\r\n    if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n        for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n            if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n                t[p[i]] = s[p[i]];\r\n        }\r\n    return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n    return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n    return new (P || (P = Promise))(function (resolve, reject) {\r\n        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n        function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n    });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n    return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n    function verb(n) { return function (v) { return step([n, v]); }; }\r\n    function step(op) {\r\n        if (f) throw new TypeError(\"Generator is already executing.\");\r\n        while (_) try {\r\n            if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n            if (y = 0, t) op = [op[0] & 2, t.value];\r\n            switch (op[0]) {\r\n                case 0: case 1: t = op; break;\r\n                case 4: _.label++; return { value: op[1], done: false };\r\n                case 5: _.label++; y = op[1]; op = [0]; continue;\r\n                case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n                default:\r\n                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n                    if (t[2]) _.ops.pop();\r\n                    _.trys.pop(); continue;\r\n            }\r\n            op = body.call(thisArg, _);\r\n        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n    }\r\n}\r\n\r\nexport function __createBinding(o, m, k, k2) {\r\n    if (k2 === undefined) k2 = k;\r\n    o[k2] = m[k];\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n    for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n    var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n    if (m) return m.call(o);\r\n    if (o && typeof o.length === \"number\") return {\r\n        next: function () {\r\n            if (o && i >= o.length) o = void 0;\r\n            return { value: o && o[i++], done: !o };\r\n        }\r\n    };\r\n    throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n    var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n    if (!m) return o;\r\n    var i = m.call(o), r, ar = [], e;\r\n    try {\r\n        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n    }\r\n    catch (error) { e = { error: error }; }\r\n    finally {\r\n        try {\r\n            if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n        }\r\n        finally { if (e) throw e.error; }\r\n    }\r\n    return ar;\r\n}\r\n\r\nexport function __spread() {\r\n    for (var ar = [], i = 0; i < arguments.length; i++)\r\n        ar = ar.concat(__read(arguments[i]));\r\n    return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n    for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n    for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n        for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n            r[k] = a[j];\r\n    return r;\r\n};\r\n\r\nexport function __await(v) {\r\n    return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n    if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n    var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n    return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n    function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n    function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n    function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n    function fulfill(value) { resume(\"next\", value); }\r\n    function reject(value) { resume(\"throw\", value); }\r\n    function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n    var i, p;\r\n    return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n    function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n    if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n    var m = o[Symbol.asyncIterator], i;\r\n    return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n    function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n    function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n    if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n    return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n    if (mod && mod.__esModule) return mod;\r\n    var result = {};\r\n    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n    result.default = mod;\r\n    return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n    return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n    if (!privateMap.has(receiver)) {\r\n        throw new TypeError(\"attempted to get private field on non-instance\");\r\n    }\r\n    return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n    if (!privateMap.has(receiver)) {\r\n        throw new TypeError(\"attempted to set private field on non-instance\");\r\n    }\r\n    privateMap.set(receiver, value);\r\n    return value;\r\n}\r\n","var eventListenerOptions;\nvar eventMap = new WeakMap();\nfunction getOptions() {\n    if (eventListenerOptions !== undefined) {\n        return eventListenerOptions;\n    }\n    var supportPassiveEvent = false;\n    try {\n        var noop = function () { };\n        var options = Object.defineProperty({}, 'passive', {\n            enumerable: true,\n            get: function () {\n                supportPassiveEvent = true;\n                return true;\n            },\n        });\n        window.addEventListener('testPassive', noop, options);\n        window.removeEventListener('testPassive', noop, options);\n    }\n    catch (e) { }\n    eventListenerOptions = supportPassiveEvent ? { passive: false } : false;\n    return eventListenerOptions;\n}\nexport function eventScope(scrollbar) {\n    var configs = eventMap.get(scrollbar) || [];\n    eventMap.set(scrollbar, configs);\n    return function addEvent(elem, events, fn) {\n        function handler(event) {\n            // ignore default prevented events\n            if (event.defaultPrevented) {\n                return;\n            }\n            fn(event);\n        }\n        events.split(/\\s+/g).forEach(function (eventName) {\n            configs.push({ elem: elem, eventName: eventName, handler: handler });\n            elem.addEventListener(eventName, handler, getOptions());\n        });\n    };\n}\nexport function clearEventsOn(scrollbar) {\n    var configs = eventMap.get(scrollbar);\n    if (!configs) {\n        return;\n    }\n    configs.forEach(function (_a) {\n        var elem = _a.elem, eventName = _a.eventName, handler = _a.handler;\n        elem.removeEventListener(eventName, handler, getOptions());\n    });\n    eventMap.delete(scrollbar);\n}\n//# sourceMappingURL=event-hub.js.map","import { getPointerData } from './get-pointer-data';\n/**\n * Get pointer/finger position\n */\nexport function getPosition(evt) {\n    var data = getPointerData(evt);\n    return {\n        x: data.clientX,\n        y: data.clientY,\n    };\n}\n//# sourceMappingURL=get-position.js.map","/**\n * Get pointer/touch data\n */\nexport function getPointerData(evt) {\n    // if is touch event, return last item in touchList\n    // else return original event\n    return evt.touches ? evt.touches[evt.touches.length - 1] : evt;\n}\n//# sourceMappingURL=get-pointer-data.js.map","/**\n * Check if `a` is one of `[...b]`\n */\nexport function isOneOf(a, b) {\n    if (b === void 0) { b = []; }\n    return b.some(function (v) { return a === v; });\n}\n//# sourceMappingURL=is-one-of.js.map","var VENDOR_PREFIX = [\n    'webkit',\n    'moz',\n    'ms',\n    'o',\n];\nvar RE = new RegExp(\"^-(?!(?:\" + VENDOR_PREFIX.join('|') + \")-)\");\nfunction autoPrefix(styles) {\n    var res = {};\n    Object.keys(styles).forEach(function (prop) {\n        if (!RE.test(prop)) {\n            res[prop] = styles[prop];\n            return;\n        }\n        var val = styles[prop];\n        prop = prop.replace(/^-/, '');\n        res[prop] = val;\n        VENDOR_PREFIX.forEach(function (prefix) {\n            res[\"-\" + prefix + \"-\" + prop] = val;\n        });\n    });\n    return res;\n}\nexport function setStyle(elem, styles) {\n    styles = autoPrefix(styles);\n    Object.keys(styles).forEach(function (prop) {\n        var cssProp = prop.replace(/^-/, '').replace(/-([a-z])/g, function (_, $1) { return $1.toUpperCase(); });\n        elem.style[cssProp] = styles[prop];\n    });\n}\n//# sourceMappingURL=set-style.js.map","import { __assign } from \"tslib\";\nimport { getPosition } from './get-position';\nvar Tracker = /** @class */ (function () {\n    function Tracker(touch) {\n        this.velocityMultiplier = window.devicePixelRatio;\n        this.updateTime = Date.now();\n        this.delta = { x: 0, y: 0 };\n        this.velocity = { x: 0, y: 0 };\n        this.lastPosition = { x: 0, y: 0 };\n        this.lastPosition = getPosition(touch);\n    }\n    Tracker.prototype.update = function (touch) {\n        var _a = this, velocity = _a.velocity, updateTime = _a.updateTime, lastPosition = _a.lastPosition;\n        var now = Date.now();\n        var position = getPosition(touch);\n        var delta = {\n            x: -(position.x - lastPosition.x),\n            y: -(position.y - lastPosition.y),\n        };\n        var duration = (now - updateTime) || 16.7;\n        var vx = delta.x / duration * 16.7;\n        var vy = delta.y / duration * 16.7;\n        velocity.x = vx * this.velocityMultiplier;\n        velocity.y = vy * this.velocityMultiplier;\n        this.delta = delta;\n        this.updateTime = now;\n        this.lastPosition = position;\n    };\n    return Tracker;\n}());\nexport { Tracker };\nvar TouchRecord = /** @class */ (function () {\n    function TouchRecord() {\n        this._touchList = {};\n    }\n    Object.defineProperty(TouchRecord.prototype, \"_primitiveValue\", {\n        get: function () {\n            return { x: 0, y: 0 };\n        },\n        enumerable: true,\n        configurable: true\n    });\n    TouchRecord.prototype.isActive = function () {\n        return this._activeTouchID !== undefined;\n    };\n    TouchRecord.prototype.getDelta = function () {\n        var tracker = this._getActiveTracker();\n        if (!tracker) {\n            return this._primitiveValue;\n        }\n        return __assign({}, tracker.delta);\n    };\n    TouchRecord.prototype.getVelocity = function () {\n        var tracker = this._getActiveTracker();\n        if (!tracker) {\n            return this._primitiveValue;\n        }\n        return __assign({}, tracker.velocity);\n    };\n    TouchRecord.prototype.getEasingDistance = function (damping) {\n        var deAcceleration = 1 - damping;\n        var distance = {\n            x: 0,\n            y: 0,\n        };\n        var vel = this.getVelocity();\n        Object.keys(vel).forEach(function (dir) {\n            // ignore small velocity\n            var v = Math.abs(vel[dir]) <= 10 ? 0 : vel[dir];\n            while (v !== 0) {\n                distance[dir] += v;\n                v = (v * deAcceleration) | 0;\n            }\n        });\n        return distance;\n    };\n    TouchRecord.prototype.track = function (evt) {\n        var _this = this;\n        var targetTouches = evt.targetTouches;\n        Array.from(targetTouches).forEach(function (touch) {\n            _this._add(touch);\n        });\n        return this._touchList;\n    };\n    TouchRecord.prototype.update = function (evt) {\n        var _this = this;\n        var touches = evt.touches, changedTouches = evt.changedTouches;\n        Array.from(touches).forEach(function (touch) {\n            _this._renew(touch);\n        });\n        this._setActiveID(changedTouches);\n        return this._touchList;\n    };\n    TouchRecord.prototype.release = function (evt) {\n        var _this = this;\n        delete this._activeTouchID;\n        Array.from(evt.changedTouches).forEach(function (touch) {\n            _this._delete(touch);\n        });\n    };\n    TouchRecord.prototype._add = function (touch) {\n        if (this._has(touch)) {\n            // reset tracker\n            this._delete(touch);\n        }\n        var tracker = new Tracker(touch);\n        this._touchList[touch.identifier] = tracker;\n    };\n    TouchRecord.prototype._renew = function (touch) {\n        if (!this._has(touch)) {\n            return;\n        }\n        var tracker = this._touchList[touch.identifier];\n        tracker.update(touch);\n    };\n    TouchRecord.prototype._delete = function (touch) {\n        delete this._touchList[touch.identifier];\n    };\n    TouchRecord.prototype._has = function (touch) {\n        return this._touchList.hasOwnProperty(touch.identifier);\n    };\n    TouchRecord.prototype._setActiveID = function (touches) {\n        this._activeTouchID = touches[touches.length - 1].identifier;\n    };\n    TouchRecord.prototype._getActiveTracker = function () {\n        var _a = this, _touchList = _a._touchList, _activeTouchID = _a._activeTouchID;\n        return _touchList[_activeTouchID];\n    };\n    return TouchRecord;\n}());\nexport { TouchRecord };\n//# sourceMappingURL=touch-record.js.map","export function clamp(value, lower, upper) {\n    return Math.max(lower, Math.min(upper, value));\n}\n//# sourceMappingURL=clamp.js.map","export function debounce(fn, wait, leading) {\n    if (wait === void 0) { wait = 0; }\n    var timer;\n    var lastCalledAt = -Infinity;\n    return function debouncedFn() {\n        var _this = this;\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments[_i];\n        }\n        if (leading) {\n            var now = Date.now();\n            var elapsed = now - lastCalledAt;\n            lastCalledAt = now;\n            if (elapsed >= wait) {\n                fn.apply(this, args);\n            }\n        }\n        clearTimeout(timer);\n        timer = setTimeout(function () {\n            fn.apply(_this, args);\n        }, wait);\n    };\n}\n//# sourceMappingURL=debounce.js.map","import { clamp } from '../utils';\nexport function range(min, max) {\n    if (min === void 0) { min = -Infinity; }\n    if (max === void 0) { max = Infinity; }\n    return function (proto, key) {\n        var alias = \"_\" + key;\n        Object.defineProperty(proto, key, {\n            get: function () {\n                return this[alias];\n            },\n            set: function (val) {\n                Object.defineProperty(this, alias, {\n                    value: clamp(val, min, max),\n                    enumerable: false,\n                    writable: true,\n                    configurable: true,\n                });\n            },\n            enumerable: true,\n            configurable: true,\n        });\n    };\n}\n//# sourceMappingURL=range.js.map","export function boolean(proto, key) {\n    var alias = \"_\" + key;\n    Object.defineProperty(proto, key, {\n        get: function () {\n            return this[alias];\n        },\n        set: function (val) {\n            Object.defineProperty(this, alias, {\n                value: !!val,\n                enumerable: false,\n                writable: true,\n                configurable: true,\n            });\n        },\n        enumerable: true,\n        configurable: true,\n    });\n}\n//# sourceMappingURL=boolean.js.map","import { __spreadArrays } from \"tslib\";\nimport { debounce as $debounce } from '../utils';\nexport function debounce() {\n    var options = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        options[_i] = arguments[_i];\n    }\n    return function (_proto, key, descriptor) {\n        var fn = descriptor.value;\n        return {\n            get: function () {\n                if (!this.hasOwnProperty(key)) {\n                    Object.defineProperty(this, key, {\n                        value: $debounce.apply(void 0, __spreadArrays([fn], options)),\n                    });\n                }\n                return this[key];\n            },\n        };\n    };\n}\n//# sourceMappingURL=debounce.js.map","import { __decorate } from \"tslib\";\nimport { range, boolean, } from './decorators/';\nvar Options = /** @class */ (function () {\n    function Options(config) {\n        var _this = this;\n        if (config === void 0) { config = {}; }\n        /**\n         * Momentum reduction damping factor, a float value between `(0, 1)`.\n         * The lower the value is, the more smooth the scrolling will be\n         * (also the more paint frames).\n         */\n        this.damping = 0.1;\n        /**\n         * Minimal size for scrollbar thumbs.\n         */\n        this.thumbMinSize = 20;\n        /**\n         * Render every frame in integer pixel values\n         * set to `true` to improve scrolling performance.\n         */\n        this.renderByPixels = true;\n        /**\n         * Keep scrollbar tracks visible\n         */\n        this.alwaysShowTracks = false;\n        /**\n         * Set to `true` to allow outer scrollbars continue scrolling\n         * when current scrollbar reaches edge.\n         */\n        this.continuousScrolling = true;\n        /**\n         * Delegate wheel events and touch events to the given element.\n         * By default, the container element is used.\n         * This option will be useful for dealing with fixed elements.\n         */\n        this.delegateTo = null;\n        /**\n         * Options for plugins. Syntax:\n         *   plugins[pluginName] = pluginOptions: any\n         */\n        this.plugins = {};\n        Object.keys(config).forEach(function (prop) {\n            _this[prop] = config[prop];\n        });\n    }\n    Object.defineProperty(Options.prototype, \"wheelEventTarget\", {\n        get: function () {\n            return this.delegateTo;\n        },\n        set: function (el) {\n            console.warn('[smooth-scrollbar]: `options.wheelEventTarget` is deprecated and will be removed in the future, use `options.delegateTo` instead.');\n            this.delegateTo = el;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    __decorate([\n        range(0, 1)\n    ], Options.prototype, \"damping\", void 0);\n    __decorate([\n        range(0, Infinity)\n    ], Options.prototype, \"thumbMinSize\", void 0);\n    __decorate([\n        boolean\n    ], Options.prototype, \"renderByPixels\", void 0);\n    __decorate([\n        boolean\n    ], Options.prototype, \"alwaysShowTracks\", void 0);\n    __decorate([\n        boolean\n    ], Options.prototype, \"continuousScrolling\", void 0);\n    return Options;\n}());\nexport { Options };\n//# sourceMappingURL=options.js.map","export var TrackDirection;\n(function (TrackDirection) {\n    TrackDirection[\"X\"] = \"x\";\n    TrackDirection[\"Y\"] = \"y\";\n})(TrackDirection || (TrackDirection = {}));\n//# sourceMappingURL=direction.js.map","import { TrackDirection } from './direction';\nimport { setStyle } from '../utils/';\nvar ScrollbarThumb = /** @class */ (function () {\n    function ScrollbarThumb(_direction, _minSize) {\n        if (_minSize === void 0) { _minSize = 0; }\n        this._direction = _direction;\n        this._minSize = _minSize;\n        /**\n         * Thumb element\n         */\n        this.element = document.createElement('div');\n        /**\n         * Display size of the thumb\n         * will always be greater than `scrollbar.options.thumbMinSize`\n         */\n        this.displaySize = 0;\n        /**\n         * Actual size of the thumb\n         */\n        this.realSize = 0;\n        /**\n         * Thumb offset to the top\n         */\n        this.offset = 0;\n        this.element.className = \"scrollbar-thumb scrollbar-thumb-\" + _direction;\n    }\n    /**\n     * Attach to track element\n     *\n     * @param trackEl Track element\n     */\n    ScrollbarThumb.prototype.attachTo = function (trackEl) {\n        trackEl.appendChild(this.element);\n    };\n    ScrollbarThumb.prototype.update = function (scrollOffset, containerSize, pageSize) {\n        // calculate thumb size\n        // pageSize > containerSize -> scrollable\n        this.realSize = Math.min(containerSize / pageSize, 1) * containerSize;\n        this.displaySize = Math.max(this.realSize, this._minSize);\n        // calculate thumb offset\n        this.offset = scrollOffset / pageSize * (containerSize + (this.realSize - this.displaySize));\n        setStyle(this.element, this._getStyle());\n    };\n    ScrollbarThumb.prototype._getStyle = function () {\n        switch (this._direction) {\n            case TrackDirection.X:\n                return {\n                    width: this.displaySize + \"px\",\n                    '-transform': \"translate3d(\" + this.offset + \"px, 0, 0)\",\n                };\n            case TrackDirection.Y:\n                return {\n                    height: this.displaySize + \"px\",\n                    '-transform': \"translate3d(0, \" + this.offset + \"px, 0)\",\n                };\n            default:\n                return null;\n        }\n    };\n    return ScrollbarThumb;\n}());\nexport { ScrollbarThumb };\n//# sourceMappingURL=thumb.js.map","import { ScrollbarThumb } from './thumb';\nimport { setStyle, } from '../utils/';\nvar ScrollbarTrack = /** @class */ (function () {\n    function ScrollbarTrack(direction, thumbMinSize) {\n        if (thumbMinSize === void 0) { thumbMinSize = 0; }\n        /**\n         * Track element\n         */\n        this.element = document.createElement('div');\n        this._isShown = false;\n        this.element.className = \"scrollbar-track scrollbar-track-\" + direction;\n        this.thumb = new ScrollbarThumb(direction, thumbMinSize);\n        this.thumb.attachTo(this.element);\n    }\n    /**\n     * Attach to scrollbar container element\n     *\n     * @param scrollbarContainer Scrollbar container element\n     */\n    ScrollbarTrack.prototype.attachTo = function (scrollbarContainer) {\n        scrollbarContainer.appendChild(this.element);\n    };\n    /**\n     * Show track immediately\n     */\n    ScrollbarTrack.prototype.show = function () {\n        if (this._isShown) {\n            return;\n        }\n        this._isShown = true;\n        this.element.classList.add('show');\n    };\n    /**\n     * Hide track immediately\n     */\n    ScrollbarTrack.prototype.hide = function () {\n        if (!this._isShown) {\n            return;\n        }\n        this._isShown = false;\n        this.element.classList.remove('show');\n    };\n    ScrollbarTrack.prototype.update = function (scrollOffset, containerSize, pageSize) {\n        setStyle(this.element, {\n            display: pageSize <= containerSize ? 'none' : 'block',\n        });\n        this.thumb.update(scrollOffset, containerSize, pageSize);\n    };\n    return ScrollbarTrack;\n}());\nexport { ScrollbarTrack };\n//# sourceMappingURL=track.js.map","import { __decorate } from \"tslib\";\nimport { ScrollbarTrack } from './track';\nimport { TrackDirection } from './direction';\nimport { debounce, } from '../decorators/';\nvar TrackController = /** @class */ (function () {\n    function TrackController(_scrollbar) {\n        this._scrollbar = _scrollbar;\n        var thumbMinSize = _scrollbar.options.thumbMinSize;\n        this.xAxis = new ScrollbarTrack(TrackDirection.X, thumbMinSize);\n        this.yAxis = new ScrollbarTrack(TrackDirection.Y, thumbMinSize);\n        this.xAxis.attachTo(_scrollbar.containerEl);\n        this.yAxis.attachTo(_scrollbar.containerEl);\n        if (_scrollbar.options.alwaysShowTracks) {\n            this.xAxis.show();\n            this.yAxis.show();\n        }\n    }\n    /**\n     * Updates track appearance\n     */\n    TrackController.prototype.update = function () {\n        var _a = this._scrollbar, size = _a.size, offset = _a.offset;\n        this.xAxis.update(offset.x, size.container.width, size.content.width);\n        this.yAxis.update(offset.y, size.container.height, size.content.height);\n    };\n    /**\n     * Automatically hide tracks when scrollbar is in idle state\n     */\n    TrackController.prototype.autoHideOnIdle = function () {\n        if (this._scrollbar.options.alwaysShowTracks) {\n            return;\n        }\n        this.xAxis.hide();\n        this.yAxis.hide();\n    };\n    __decorate([\n        debounce(300)\n    ], TrackController.prototype, \"autoHideOnIdle\", null);\n    return TrackController;\n}());\nexport { TrackController };\n//# sourceMappingURL=index.js.map","import { clamp } from '../utils';\nvar animationIDStorage = new WeakMap();\nexport function scrollTo(scrollbar, x, y, duration, _a) {\n    if (duration === void 0) { duration = 0; }\n    var _b = _a === void 0 ? {} : _a, _c = _b.easing, easing = _c === void 0 ? defaultEasing : _c, callback = _b.callback;\n    var options = scrollbar.options, offset = scrollbar.offset, limit = scrollbar.limit;\n    if (options.renderByPixels) {\n        // ensure resolved with integer\n        x = Math.round(x);\n        y = Math.round(y);\n    }\n    var startX = offset.x;\n    var startY = offset.y;\n    var disX = clamp(x, 0, limit.x) - startX;\n    var disY = clamp(y, 0, limit.y) - startY;\n    var start = Date.now();\n    function scroll() {\n        var elapse = Date.now() - start;\n        var progress = duration ? easing(Math.min(elapse / duration, 1)) : 1;\n        scrollbar.setPosition(startX + disX * progress, startY + disY * progress);\n        if (elapse >= duration) {\n            if (typeof callback === 'function') {\n                callback.call(scrollbar);\n            }\n        }\n        else {\n            var animationID = requestAnimationFrame(scroll);\n            animationIDStorage.set(scrollbar, animationID);\n        }\n    }\n    cancelAnimationFrame(animationIDStorage.get(scrollbar));\n    scroll();\n}\n/**\n * easeOutCubic\n */\nfunction defaultEasing(t) {\n    return Math.pow((t - 1), 3) + 1;\n}\n//# sourceMappingURL=scroll-to.js.map","import { __assign } from \"tslib\";\nvar ScrollbarPlugin = /** @class */ (function () {\n    function ScrollbarPlugin(scrollbar, options) {\n        var _newTarget = this.constructor;\n        this.scrollbar = scrollbar;\n        this.name = _newTarget.pluginName;\n        this.options = __assign(__assign({}, _newTarget.defaultOptions), options);\n    }\n    ScrollbarPlugin.prototype.onInit = function () { };\n    ScrollbarPlugin.prototype.onDestroy = function () { };\n    ScrollbarPlugin.prototype.onUpdate = function () { };\n    ScrollbarPlugin.prototype.onRender = function (_remainMomentum) { };\n    ScrollbarPlugin.prototype.transformDelta = function (delta, _evt) {\n        return __assign({}, delta);\n    };\n    ScrollbarPlugin.pluginName = '';\n    ScrollbarPlugin.defaultOptions = {};\n    return ScrollbarPlugin;\n}());\nexport { ScrollbarPlugin };\nexport var globalPlugins = {\n    order: new Set(),\n    constructors: {},\n};\nexport function addPlugins() {\n    var Plugins = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        Plugins[_i] = arguments[_i];\n    }\n    Plugins.forEach(function (P) {\n        var pluginName = P.pluginName;\n        if (!pluginName) {\n            throw new TypeError(\"plugin name is required\");\n        }\n        globalPlugins.order.add(pluginName);\n        globalPlugins.constructors[pluginName] = P;\n    });\n}\nexport function initPlugins(scrollbar, options) {\n    return Array.from(globalPlugins.order)\n        .filter(function (pluginName) {\n        return options[pluginName] !== false;\n    })\n        .map(function (pluginName) {\n        var Plugin = globalPlugins.constructors[pluginName];\n        var instance = new Plugin(scrollbar, options[pluginName]);\n        // bind plugin options to `scrollbar.options`\n        options[pluginName] = instance.options;\n        return instance;\n    });\n}\n//# sourceMappingURL=plugin.js.map","import { eventScope, } from '../utils/';\nvar KEY_CODE;\n(function (KEY_CODE) {\n    KEY_CODE[KEY_CODE[\"TAB\"] = 9] = \"TAB\";\n    KEY_CODE[KEY_CODE[\"SPACE\"] = 32] = \"SPACE\";\n    KEY_CODE[KEY_CODE[\"PAGE_UP\"] = 33] = \"PAGE_UP\";\n    KEY_CODE[KEY_CODE[\"PAGE_DOWN\"] = 34] = \"PAGE_DOWN\";\n    KEY_CODE[KEY_CODE[\"END\"] = 35] = \"END\";\n    KEY_CODE[KEY_CODE[\"HOME\"] = 36] = \"HOME\";\n    KEY_CODE[KEY_CODE[\"LEFT\"] = 37] = \"LEFT\";\n    KEY_CODE[KEY_CODE[\"UP\"] = 38] = \"UP\";\n    KEY_CODE[KEY_CODE[\"RIGHT\"] = 39] = \"RIGHT\";\n    KEY_CODE[KEY_CODE[\"DOWN\"] = 40] = \"DOWN\";\n})(KEY_CODE || (KEY_CODE = {}));\nexport function keyboardHandler(scrollbar) {\n    var addEvent = eventScope(scrollbar);\n    var container = scrollbar.containerEl;\n    addEvent(container, 'keydown', function (evt) {\n        var activeElement = document.activeElement;\n        if (activeElement !== container && !container.contains(activeElement)) {\n            return;\n        }\n        if (isEditable(activeElement)) {\n            return;\n        }\n        var delta = getKeyDelta(scrollbar, evt.keyCode || evt.which);\n        if (!delta) {\n            return;\n        }\n        var x = delta[0], y = delta[1];\n        scrollbar.addTransformableMomentum(x, y, evt, function (willScroll) {\n            if (willScroll) {\n                evt.preventDefault();\n            }\n            else {\n                scrollbar.containerEl.blur();\n                if (scrollbar.parent) {\n                    scrollbar.parent.containerEl.focus();\n                }\n            }\n        });\n    });\n}\nfunction getKeyDelta(scrollbar, keyCode) {\n    var size = scrollbar.size, limit = scrollbar.limit, offset = scrollbar.offset;\n    switch (keyCode) {\n        case KEY_CODE.TAB:\n            return handleTabKey(scrollbar);\n        case KEY_CODE.SPACE:\n            return [0, 200];\n        case KEY_CODE.PAGE_UP:\n            return [0, -size.container.height + 40];\n        case KEY_CODE.PAGE_DOWN:\n            return [0, size.container.height - 40];\n        case KEY_CODE.END:\n            return [0, limit.y - offset.y];\n        case KEY_CODE.HOME:\n            return [0, -offset.y];\n        case KEY_CODE.LEFT:\n            return [-40, 0];\n        case KEY_CODE.UP:\n            return [0, -40];\n        case KEY_CODE.RIGHT:\n            return [40, 0];\n        case KEY_CODE.DOWN:\n            return [0, 40];\n        default:\n            return null;\n    }\n}\nfunction handleTabKey(scrollbar) {\n    // handle in next frame\n    requestAnimationFrame(function () {\n        scrollbar.scrollIntoView(document.activeElement, {\n            offsetTop: scrollbar.size.container.height / 2,\n            offsetLeft: scrollbar.size.container.width / 2,\n            onlyScrollIfNeeded: true,\n        });\n    });\n}\nfunction isEditable(elem) {\n    if (elem.tagName === 'INPUT' ||\n        elem.tagName === 'SELECT' ||\n        elem.tagName === 'TEXTAREA' ||\n        elem.isContentEditable) {\n        return !elem.disabled;\n    }\n    return false;\n}\n//# sourceMappingURL=keyboard.js.map","import { clamp } from '../utils';\nimport { isOneOf, getPosition, eventScope, setStyle, } from '../utils/';\nvar Direction;\n(function (Direction) {\n    Direction[Direction[\"X\"] = 0] = \"X\";\n    Direction[Direction[\"Y\"] = 1] = \"Y\";\n})(Direction || (Direction = {}));\nexport function mouseHandler(scrollbar) {\n    var addEvent = eventScope(scrollbar);\n    var container = scrollbar.containerEl;\n    var _a = scrollbar.track, xAxis = _a.xAxis, yAxis = _a.yAxis;\n    function calcMomentum(direction, clickPosition) {\n        var size = scrollbar.size, limit = scrollbar.limit, offset = scrollbar.offset;\n        if (direction === Direction.X) {\n            var totalWidth = size.container.width + (xAxis.thumb.realSize - xAxis.thumb.displaySize);\n            return clamp(clickPosition / totalWidth * size.content.width, 0, limit.x) - offset.x;\n        }\n        if (direction === Direction.Y) {\n            var totalHeight = size.container.height + (yAxis.thumb.realSize - yAxis.thumb.displaySize);\n            return clamp(clickPosition / totalHeight * size.content.height, 0, limit.y) - offset.y;\n        }\n        return 0;\n    }\n    function getTrackDirection(elem) {\n        if (isOneOf(elem, [xAxis.element, xAxis.thumb.element])) {\n            return Direction.X;\n        }\n        if (isOneOf(elem, [yAxis.element, yAxis.thumb.element])) {\n            return Direction.Y;\n        }\n        return void 0;\n    }\n    var isMouseDown;\n    var isMouseMoving;\n    var startOffsetToThumb;\n    var trackDirection;\n    var containerRect;\n    addEvent(container, 'click', function (evt) {\n        if (isMouseMoving || !isOneOf(evt.target, [xAxis.element, yAxis.element])) {\n            return;\n        }\n        var track = evt.target;\n        var direction = getTrackDirection(track);\n        var rect = track.getBoundingClientRect();\n        var clickPos = getPosition(evt);\n        if (direction === Direction.X) {\n            var offsetOnTrack = clickPos.x - rect.left - xAxis.thumb.displaySize / 2;\n            scrollbar.setMomentum(calcMomentum(direction, offsetOnTrack), 0);\n        }\n        if (direction === Direction.Y) {\n            var offsetOnTrack = clickPos.y - rect.top - yAxis.thumb.displaySize / 2;\n            scrollbar.setMomentum(0, calcMomentum(direction, offsetOnTrack));\n        }\n    });\n    addEvent(container, 'mousedown', function (evt) {\n        if (!isOneOf(evt.target, [xAxis.thumb.element, yAxis.thumb.element])) {\n            return;\n        }\n        isMouseDown = true;\n        var thumb = evt.target;\n        var cursorPos = getPosition(evt);\n        var thumbRect = thumb.getBoundingClientRect();\n        trackDirection = getTrackDirection(thumb);\n        // pointer offset to thumb\n        startOffsetToThumb = {\n            x: cursorPos.x - thumbRect.left,\n            y: cursorPos.y - thumbRect.top,\n        };\n        // container bounding rectangle\n        containerRect = container.getBoundingClientRect();\n        // prevent selection, see:\n        // https://github.com/idiotWu/smooth-scrollbar/issues/48\n        setStyle(scrollbar.containerEl, {\n            '-user-select': 'none',\n        });\n    });\n    addEvent(window, 'mousemove', function (evt) {\n        if (!isMouseDown)\n            return;\n        isMouseMoving = true;\n        var cursorPos = getPosition(evt);\n        if (trackDirection === Direction.X) {\n            // get percentage of pointer position in track\n            // then tranform to px\n            // don't need easing\n            var offsetOnTrack = cursorPos.x - startOffsetToThumb.x - containerRect.left;\n            scrollbar.setMomentum(calcMomentum(trackDirection, offsetOnTrack), 0);\n        }\n        if (trackDirection === Direction.Y) {\n            var offsetOnTrack = cursorPos.y - startOffsetToThumb.y - containerRect.top;\n            scrollbar.setMomentum(0, calcMomentum(trackDirection, offsetOnTrack));\n        }\n    });\n    addEvent(window, 'mouseup blur', function () {\n        isMouseDown = isMouseMoving = false;\n        setStyle(scrollbar.containerEl, {\n            '-user-select': '',\n        });\n    });\n}\n//# sourceMappingURL=mouse.js.map","import { eventScope, TouchRecord, } from '../utils/';\nvar activeScrollbar;\nexport function touchHandler(scrollbar) {\n    var target = scrollbar.options.delegateTo || scrollbar.containerEl;\n    var touchRecord = new TouchRecord();\n    var addEvent = eventScope(scrollbar);\n    var damping;\n    var pointerCount = 0;\n    addEvent(target, 'touchstart', function (evt) {\n        // start records\n        touchRecord.track(evt);\n        // stop scrolling\n        scrollbar.setMomentum(0, 0);\n        // save damping\n        if (pointerCount === 0) {\n            damping = scrollbar.options.damping;\n            scrollbar.options.damping = Math.max(damping, 0.5); // less frames on touchmove\n        }\n        pointerCount++;\n    });\n    addEvent(target, 'touchmove', function (evt) {\n        if (activeScrollbar && activeScrollbar !== scrollbar)\n            return;\n        touchRecord.update(evt);\n        var _a = touchRecord.getDelta(), x = _a.x, y = _a.y;\n        scrollbar.addTransformableMomentum(x, y, evt, function (willScroll) {\n            if (willScroll && evt.cancelable) {\n                evt.preventDefault();\n                activeScrollbar = scrollbar;\n            }\n        });\n    });\n    addEvent(target, 'touchcancel touchend', function (evt) {\n        var delta = touchRecord.getEasingDistance(damping);\n        scrollbar.addTransformableMomentum(delta.x, delta.y, evt);\n        pointerCount--;\n        // restore damping\n        if (pointerCount === 0) {\n            scrollbar.options.damping = damping;\n        }\n        touchRecord.release(evt);\n        activeScrollbar = null;\n    });\n}\n//# sourceMappingURL=touch.js.map","import { debounce } from '../utils';\nimport { eventScope, } from '../utils/';\nexport function resizeHandler(scrollbar) {\n    var addEvent = eventScope(scrollbar);\n    addEvent(window, 'resize', debounce(scrollbar.update.bind(scrollbar), 300));\n}\n//# sourceMappingURL=resize.js.map","import { clamp } from '../utils';\nimport { eventScope, getPosition, } from '../utils/';\nexport function selectHandler(scrollbar) {\n    var addEvent = eventScope(scrollbar);\n    var containerEl = scrollbar.containerEl, contentEl = scrollbar.contentEl;\n    var isSelected = false;\n    var isContextMenuOpened = false; // flag to prevent selection when context menu is opened\n    var animationID;\n    function scroll(_a) {\n        var x = _a.x, y = _a.y;\n        if (!x && !y)\n            return;\n        var offset = scrollbar.offset, limit = scrollbar.limit;\n        // DISALLOW delta transformation\n        scrollbar.setMomentum(clamp(offset.x + x, 0, limit.x) - offset.x, clamp(offset.y + y, 0, limit.y) - offset.y);\n        animationID = requestAnimationFrame(function () {\n            scroll({ x: x, y: y });\n        });\n    }\n    addEvent(window, 'mousemove', function (evt) {\n        if (!isSelected)\n            return;\n        cancelAnimationFrame(animationID);\n        var dir = calcMomentum(scrollbar, evt);\n        scroll(dir);\n    });\n    // prevent scrolling when context menu is opened\n    // NOTE: `contextmenu` event may be fired\n    //          1. BEFORE `selectstart`: when user right-clicks on the text content -> prevent future scrolling,\n    //          2. AFTER `selectstart`: when user right-clicks on the blank area -> cancel current scrolling,\n    //        so we need to both set the flag and cancel current scrolling\n    addEvent(contentEl, 'contextmenu', function () {\n        // set the flag to prevent future scrolling\n        isContextMenuOpened = true;\n        // stop current scrolling\n        cancelAnimationFrame(animationID);\n        isSelected = false;\n    });\n    // reset context menu flag on mouse down\n    // to ensure the scrolling is allowed in the next selection\n    addEvent(contentEl, 'mousedown', function () {\n        isContextMenuOpened = false;\n    });\n    addEvent(contentEl, 'selectstart', function () {\n        if (isContextMenuOpened) {\n            return;\n        }\n        cancelAnimationFrame(animationID);\n        isSelected = true;\n    });\n    addEvent(window, 'mouseup blur', function () {\n        cancelAnimationFrame(animationID);\n        isSelected = false;\n        isContextMenuOpened = false;\n    });\n    // patch for touch devices\n    addEvent(containerEl, 'scroll', function (evt) {\n        evt.preventDefault();\n        containerEl.scrollTop = containerEl.scrollLeft = 0;\n    });\n}\nfunction calcMomentum(scrollbar, evt) {\n    var _a = scrollbar.bounding, top = _a.top, right = _a.right, bottom = _a.bottom, left = _a.left;\n    var _b = getPosition(evt), x = _b.x, y = _b.y;\n    var res = {\n        x: 0,\n        y: 0,\n    };\n    var padding = 20;\n    if (x === 0 && y === 0)\n        return res;\n    if (x > right - padding) {\n        res.x = (x - right + padding);\n    }\n    else if (x < left + padding) {\n        res.x = (x - left - padding);\n    }\n    if (y > bottom - padding) {\n        res.y = (y - bottom + padding);\n    }\n    else if (y < top + padding) {\n        res.y = (y - top - padding);\n    }\n    res.x *= 2;\n    res.y *= 2;\n    return res;\n}\n//# sourceMappingURL=select.js.map","import { eventScope, } from '../utils/';\nexport function wheelHandler(scrollbar) {\n    var addEvent = eventScope(scrollbar);\n    var target = scrollbar.options.delegateTo || scrollbar.containerEl;\n    var eventName = ('onwheel' in window || document.implementation.hasFeature('Events.wheel', '3.0')) ? 'wheel' : 'mousewheel';\n    addEvent(target, eventName, function (evt) {\n        var _a = normalizeDelta(evt), x = _a.x, y = _a.y;\n        scrollbar.addTransformableMomentum(x, y, evt, function (willScroll) {\n            if (willScroll) {\n                evt.preventDefault();\n            }\n        });\n    });\n}\n// Normalizing wheel delta\nvar DELTA_SCALE = {\n    STANDARD: 1,\n    OTHERS: -3,\n};\nvar DELTA_MODE = [1.0, 28.0, 500.0];\nvar getDeltaMode = function (mode) { return DELTA_MODE[mode] || DELTA_MODE[0]; };\nfunction normalizeDelta(evt) {\n    if ('deltaX' in evt) {\n        var mode = getDeltaMode(evt.deltaMode);\n        return {\n            x: evt.deltaX / DELTA_SCALE.STANDARD * mode,\n            y: evt.deltaY / DELTA_SCALE.STANDARD * mode,\n        };\n    }\n    if ('wheelDeltaX' in evt) {\n        return {\n            x: evt.wheelDeltaX / DELTA_SCALE.OTHERS,\n            y: evt.wheelDeltaY / DELTA_SCALE.OTHERS,\n        };\n    }\n    // ie with touchpad\n    return {\n        x: 0,\n        y: evt.wheelDelta / DELTA_SCALE.OTHERS,\n    };\n}\n//# sourceMappingURL=wheel.js.map","import { __assign, __decorate } from \"tslib\";\nimport { clamp } from './utils';\nimport { Options } from './options';\nimport { setStyle, clearEventsOn, } from './utils/';\nimport { debounce, } from './decorators/';\nimport { TrackController, } from './track/';\nimport { getSize, update, isVisible, } from './geometry/';\nimport { scrollTo, setPosition, scrollIntoView, } from './scrolling/';\nimport { initPlugins, } from './plugin';\nimport * as eventHandlers from './events/';\n// DO NOT use WeakMap here\n// .getAll() methods requires `scrollbarMap.values()`\nexport var scrollbarMap = new Map();\nvar Scrollbar = /** @class */ (function () {\n    function Scrollbar(containerEl, options) {\n        var _this = this;\n        /**\n         * Current scrolling offsets\n         */\n        this.offset = {\n            x: 0,\n            y: 0,\n        };\n        /**\n         * Max-allowed scrolling offsets\n         */\n        this.limit = {\n            x: Infinity,\n            y: Infinity,\n        };\n        /**\n         * Container bounding rect\n         */\n        this.bounding = {\n            top: 0,\n            right: 0,\n            bottom: 0,\n            left: 0,\n        };\n        // private _observer: ResizeObserver;\n        this._plugins = [];\n        this._momentum = { x: 0, y: 0 };\n        this._listeners = new Set();\n        this.containerEl = containerEl;\n        var contentEl = this.contentEl = document.createElement('div');\n        this.options = new Options(options);\n        // mark as a scroll element\n        containerEl.setAttribute('data-scrollbar', 'true');\n        // make container focusable\n        containerEl.setAttribute('tabindex', '-1');\n        setStyle(containerEl, {\n            overflow: 'hidden',\n            outline: 'none',\n        });\n        // enable touch event capturing in IE, see:\n        // https://github.com/idiotWu/smooth-scrollbar/issues/39\n        if (window.navigator.msPointerEnabled) {\n            containerEl.style.msTouchAction = 'none';\n        }\n        // mount content\n        contentEl.className = 'scroll-content';\n        Array.from(containerEl.childNodes).forEach(function (node) {\n            contentEl.appendChild(node);\n        });\n        containerEl.appendChild(contentEl);\n        // attach track\n        this.track = new TrackController(this);\n        // initial measuring\n        this.size = this.getSize();\n        // init plugins\n        this._plugins = initPlugins(this, this.options.plugins);\n        // preserve scroll offset\n        var scrollLeft = containerEl.scrollLeft, scrollTop = containerEl.scrollTop;\n        containerEl.scrollLeft = containerEl.scrollTop = 0;\n        this.setPosition(scrollLeft, scrollTop, {\n            withoutCallbacks: true,\n        });\n        // FIXME: update typescript\n        var ResizeObserver = window.ResizeObserver;\n        // observe\n        if (typeof ResizeObserver === 'function') {\n            this._observer = new ResizeObserver(function () {\n                _this.update();\n            });\n            this._observer.observe(contentEl);\n        }\n        scrollbarMap.set(containerEl, this);\n        // wait for DOM ready\n        requestAnimationFrame(function () {\n            _this._init();\n        });\n    }\n    Object.defineProperty(Scrollbar.prototype, \"parent\", {\n        /**\n         * Parent scrollbar\n         */\n        get: function () {\n            var elem = this.containerEl.parentElement;\n            while (elem) {\n                var parentScrollbar = scrollbarMap.get(elem);\n                if (parentScrollbar) {\n                    return parentScrollbar;\n                }\n                elem = elem.parentElement;\n            }\n            return null;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(Scrollbar.prototype, \"scrollTop\", {\n        /**\n         * Gets or sets `scrollbar.offset.y`\n         */\n        get: function () {\n            return this.offset.y;\n        },\n        set: function (y) {\n            this.setPosition(this.scrollLeft, y);\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(Scrollbar.prototype, \"scrollLeft\", {\n        /**\n         * Gets or sets `scrollbar.offset.x`\n         */\n        get: function () {\n            return this.offset.x;\n        },\n        set: function (x) {\n            this.setPosition(x, this.scrollTop);\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * Returns the size of the scrollbar container element\n     * and the content wrapper element\n     */\n    Scrollbar.prototype.getSize = function () {\n        return getSize(this);\n    };\n    /**\n     * Forces scrollbar to update geometry infomation.\n     *\n     * By default, scrollbars are automatically updated with `100ms` debounce (or `MutationObserver` fires).\n     * You can call this method to force an update when you modified contents\n     */\n    Scrollbar.prototype.update = function () {\n        update(this);\n        this._plugins.forEach(function (plugin) {\n            plugin.onUpdate();\n        });\n    };\n    /**\n     * Checks if an element is visible in the current view area\n     */\n    Scrollbar.prototype.isVisible = function (elem) {\n        return isVisible(this, elem);\n    };\n    /**\n     * Sets the scrollbar to the given offset without easing\n     */\n    Scrollbar.prototype.setPosition = function (x, y, options) {\n        var _this = this;\n        if (x === void 0) { x = this.offset.x; }\n        if (y === void 0) { y = this.offset.y; }\n        if (options === void 0) { options = {}; }\n        var status = setPosition(this, x, y);\n        if (!status || options.withoutCallbacks) {\n            return;\n        }\n        this._listeners.forEach(function (fn) {\n            fn.call(_this, status);\n        });\n    };\n    /**\n     * Scrolls to given position with easing function\n     */\n    Scrollbar.prototype.scrollTo = function (x, y, duration, options) {\n        if (x === void 0) { x = this.offset.x; }\n        if (y === void 0) { y = this.offset.y; }\n        if (duration === void 0) { duration = 0; }\n        if (options === void 0) { options = {}; }\n        scrollTo(this, x, y, duration, options);\n    };\n    /**\n     * Scrolls the target element into visible area of scrollbar,\n     * likes the DOM method `element.scrollIntoView().\n     */\n    Scrollbar.prototype.scrollIntoView = function (elem, options) {\n        if (options === void 0) { options = {}; }\n        scrollIntoView(this, elem, options);\n    };\n    /**\n     * Adds scrolling listener\n     */\n    Scrollbar.prototype.addListener = function (fn) {\n        if (typeof fn !== 'function') {\n            throw new TypeError('[smooth-scrollbar] scrolling listener should be a function');\n        }\n        this._listeners.add(fn);\n    };\n    /**\n     * Removes listener previously registered with `scrollbar.addListener()`\n     */\n    Scrollbar.prototype.removeListener = function (fn) {\n        this._listeners.delete(fn);\n    };\n    /**\n     * Adds momentum and applys delta transformers.\n     */\n    Scrollbar.prototype.addTransformableMomentum = function (x, y, fromEvent, callback) {\n        this._updateDebounced();\n        var finalDelta = this._plugins.reduce(function (delta, plugin) {\n            return plugin.transformDelta(delta, fromEvent) || delta;\n        }, { x: x, y: y });\n        var willScroll = !this._shouldPropagateMomentum(finalDelta.x, finalDelta.y);\n        if (willScroll) {\n            this.addMomentum(finalDelta.x, finalDelta.y);\n        }\n        if (callback) {\n            callback.call(this, willScroll);\n        }\n    };\n    /**\n     * Increases scrollbar's momentum\n     */\n    Scrollbar.prototype.addMomentum = function (x, y) {\n        this.setMomentum(this._momentum.x + x, this._momentum.y + y);\n    };\n    /**\n     * Sets scrollbar's momentum to given value\n     */\n    Scrollbar.prototype.setMomentum = function (x, y) {\n        if (this.limit.x === 0) {\n            x = 0;\n        }\n        if (this.limit.y === 0) {\n            y = 0;\n        }\n        if (this.options.renderByPixels) {\n            x = Math.round(x);\n            y = Math.round(y);\n        }\n        this._momentum.x = x;\n        this._momentum.y = y;\n    };\n    /**\n     * Update options for specific plugin\n     *\n     * @param pluginName Name of the plugin\n     * @param [options] An object includes the properties that you want to update\n     */\n    Scrollbar.prototype.updatePluginOptions = function (pluginName, options) {\n        this._plugins.forEach(function (plugin) {\n            if (plugin.name === pluginName) {\n                Object.assign(plugin.options, options);\n            }\n        });\n    };\n    Scrollbar.prototype.destroy = function () {\n        var _a = this, containerEl = _a.containerEl, contentEl = _a.contentEl;\n        clearEventsOn(this);\n        this._listeners.clear();\n        this.setMomentum(0, 0);\n        cancelAnimationFrame(this._renderID);\n        if (this._observer) {\n            this._observer.disconnect();\n        }\n        scrollbarMap.delete(this.containerEl);\n        // restore contents\n        var childNodes = Array.from(contentEl.childNodes);\n        while (containerEl.firstChild) {\n            containerEl.removeChild(containerEl.firstChild);\n        }\n        childNodes.forEach(function (el) {\n            containerEl.appendChild(el);\n        });\n        // reset scroll position\n        setStyle(containerEl, {\n            overflow: '',\n        });\n        containerEl.scrollTop = this.scrollTop;\n        containerEl.scrollLeft = this.scrollLeft;\n        // invoke plugin.onDestroy\n        this._plugins.forEach(function (plugin) {\n            plugin.onDestroy();\n        });\n        this._plugins.length = 0;\n    };\n    Scrollbar.prototype._init = function () {\n        var _this = this;\n        this.update();\n        // init evet handlers\n        Object.keys(eventHandlers).forEach(function (prop) {\n            eventHandlers[prop](_this);\n        });\n        // invoke `plugin.onInit`\n        this._plugins.forEach(function (plugin) {\n            plugin.onInit();\n        });\n        this._render();\n    };\n    Scrollbar.prototype._updateDebounced = function () {\n        this.update();\n    };\n    // check whether to propagate monmentum to parent scrollbar\n    // the following situations are considered as `true`:\n    //         1. continuous scrolling is enabled (automatically disabled when overscroll is enabled)\n    //         2. scrollbar reaches one side and is not about to scroll on the other direction\n    Scrollbar.prototype._shouldPropagateMomentum = function (deltaX, deltaY) {\n        if (deltaX === void 0) { deltaX = 0; }\n        if (deltaY === void 0) { deltaY = 0; }\n        var _a = this, options = _a.options, offset = _a.offset, limit = _a.limit;\n        if (!options.continuousScrolling)\n            return false;\n        // force an update when scrollbar is \"unscrollable\", see #106\n        if (limit.x === 0 && limit.y === 0) {\n            this._updateDebounced();\n        }\n        var destX = clamp(deltaX + offset.x, 0, limit.x);\n        var destY = clamp(deltaY + offset.y, 0, limit.y);\n        var res = true;\n        // offsets are not about to change\n        // `&=` operator is not allowed for boolean types\n        res = res && (destX === offset.x);\n        res = res && (destY === offset.y);\n        // current offsets are on the edge\n        res = res && (offset.x === limit.x || offset.x === 0 || offset.y === limit.y || offset.y === 0);\n        return res;\n    };\n    Scrollbar.prototype._render = function () {\n        var _momentum = this._momentum;\n        if (_momentum.x || _momentum.y) {\n            var nextX = this._nextTick('x');\n            var nextY = this._nextTick('y');\n            _momentum.x = nextX.momentum;\n            _momentum.y = nextY.momentum;\n            this.setPosition(nextX.position, nextY.position);\n        }\n        var remain = __assign({}, this._momentum);\n        this._plugins.forEach(function (plugin) {\n            plugin.onRender(remain);\n        });\n        this._renderID = requestAnimationFrame(this._render.bind(this));\n    };\n    Scrollbar.prototype._nextTick = function (direction) {\n        var _a = this, options = _a.options, offset = _a.offset, _momentum = _a._momentum;\n        var current = offset[direction];\n        var remain = _momentum[direction];\n        if (Math.abs(remain) <= 0.1) {\n            return {\n                momentum: 0,\n                position: current + remain,\n            };\n        }\n        var nextMomentum = remain * (1 - options.damping);\n        if (options.renderByPixels) {\n            nextMomentum |= 0;\n        }\n        return {\n            momentum: nextMomentum,\n            position: current + remain - nextMomentum,\n        };\n    };\n    __decorate([\n        debounce(100, true)\n    ], Scrollbar.prototype, \"_updateDebounced\", null);\n    return Scrollbar;\n}());\nexport { Scrollbar };\n//# sourceMappingURL=scrollbar.js.map","export function getSize(scrollbar) {\n    var containerEl = scrollbar.containerEl, contentEl = scrollbar.contentEl;\n    var containerStyles = getComputedStyle(containerEl);\n    var paddings = [\n        'paddingTop',\n        'paddingBottom',\n        'paddingLeft',\n        'paddingRight',\n    ].map(function (prop) {\n        return containerStyles[prop] ? parseFloat(containerStyles[prop]) : 0;\n    });\n    var verticalPadding = paddings[0] + paddings[1];\n    var horizontalPadding = paddings[2] + paddings[3];\n    return {\n        container: {\n            // requires `overflow: hidden`\n            width: containerEl.clientWidth,\n            height: containerEl.clientHeight,\n        },\n        content: {\n            // border width and paddings should be included\n            width: contentEl.offsetWidth - contentEl.clientWidth + contentEl.scrollWidth + horizontalPadding,\n            height: contentEl.offsetHeight - contentEl.clientHeight + contentEl.scrollHeight + verticalPadding,\n        },\n    };\n}\n//# sourceMappingURL=get-size.js.map","export function update(scrollbar) {\n    var newSize = scrollbar.getSize();\n    var limit = {\n        x: Math.max(newSize.content.width - newSize.container.width, 0),\n        y: Math.max(newSize.content.height - newSize.container.height, 0),\n    };\n    // metrics\n    var containerBounding = scrollbar.containerEl.getBoundingClientRect();\n    var bounding = {\n        top: Math.max(containerBounding.top, 0),\n        right: Math.min(containerBounding.right, window.innerWidth),\n        bottom: Math.min(containerBounding.bottom, window.innerHeight),\n        left: Math.max(containerBounding.left, 0),\n    };\n    // assign props\n    scrollbar.size = newSize;\n    scrollbar.limit = limit;\n    scrollbar.bounding = bounding;\n    // update tracks\n    scrollbar.track.update();\n    // re-positioning\n    scrollbar.setPosition();\n}\n//# sourceMappingURL=update.js.map","export function isVisible(scrollbar, elem) {\n    var bounding = scrollbar.bounding;\n    var targetBounding = elem.getBoundingClientRect();\n    // check overlapping\n    var top = Math.max(bounding.top, targetBounding.top);\n    var left = Math.max(bounding.left, targetBounding.left);\n    var right = Math.min(bounding.right, targetBounding.right);\n    var bottom = Math.min(bounding.bottom, targetBounding.bottom);\n    return top < bottom && left < right;\n}\n//# sourceMappingURL=is-visible.js.map","import { __assign } from \"tslib\";\nimport { clamp } from '../utils';\nimport { setStyle, } from '../utils/';\nexport function setPosition(scrollbar, x, y) {\n    var options = scrollbar.options, offset = scrollbar.offset, limit = scrollbar.limit, track = scrollbar.track, contentEl = scrollbar.contentEl;\n    if (options.renderByPixels) {\n        x = Math.round(x);\n        y = Math.round(y);\n    }\n    x = clamp(x, 0, limit.x);\n    y = clamp(y, 0, limit.y);\n    // position changed -> show track for 300ms\n    if (x !== offset.x)\n        track.xAxis.show();\n    if (y !== offset.y)\n        track.yAxis.show();\n    if (!options.alwaysShowTracks) {\n        track.autoHideOnIdle();\n    }\n    if (x === offset.x && y === offset.y) {\n        return null;\n    }\n    offset.x = x;\n    offset.y = y;\n    setStyle(contentEl, {\n        '-transform': \"translate3d(\" + -x + \"px, \" + -y + \"px, 0)\",\n    });\n    track.update();\n    return {\n        offset: __assign({}, offset),\n        limit: __assign({}, limit),\n    };\n}\n//# sourceMappingURL=set-position.js.map","import { clamp } from '../utils';\nexport function scrollIntoView(scrollbar, elem, _a) {\n    var _b = _a === void 0 ? {} : _a, _c = _b.alignToTop, alignToTop = _c === void 0 ? true : _c, _d = _b.onlyScrollIfNeeded, onlyScrollIfNeeded = _d === void 0 ? false : _d, _e = _b.offsetTop, offsetTop = _e === void 0 ? 0 : _e, _f = _b.offsetLeft, offsetLeft = _f === void 0 ? 0 : _f, _g = _b.offsetBottom, offsetBottom = _g === void 0 ? 0 : _g;\n    var containerEl = scrollbar.containerEl, bounding = scrollbar.bounding, offset = scrollbar.offset, limit = scrollbar.limit;\n    if (!elem || !containerEl.contains(elem))\n        return;\n    var targetBounding = elem.getBoundingClientRect();\n    if (onlyScrollIfNeeded && scrollbar.isVisible(elem))\n        return;\n    var delta = alignToTop ? targetBounding.top - bounding.top - offsetTop : targetBounding.bottom - bounding.bottom + offsetBottom;\n    scrollbar.setMomentum(targetBounding.left - bounding.left - offsetLeft, clamp(delta, -offset.y, limit.y - offset.y));\n}\n//# sourceMappingURL=scroll-into-view.js.map","var TRACK_BG = 'rgba(222, 222, 222, .75)';\nvar THUMB_BG = 'rgba(0, 0, 0, .5)';\n// sets content's display type to `flow-root` to suppress margin collapsing\nvar SCROLLBAR_STYLE = \"\\n[data-scrollbar] {\\n  display: block;\\n  position: relative;\\n}\\n\\n.scroll-content {\\n  display: flow-root;\\n  -webkit-transform: translate3d(0, 0, 0);\\n          transform: translate3d(0, 0, 0);\\n}\\n\\n.scrollbar-track {\\n  position: absolute;\\n  opacity: 0;\\n  z-index: 1;\\n  background: \" + TRACK_BG + \";\\n  -webkit-user-select: none;\\n     -moz-user-select: none;\\n      -ms-user-select: none;\\n          user-select: none;\\n  -webkit-transition: opacity 0.5s 0.5s ease-out;\\n          transition: opacity 0.5s 0.5s ease-out;\\n}\\n.scrollbar-track.show,\\n.scrollbar-track:hover {\\n  opacity: 1;\\n  -webkit-transition-delay: 0s;\\n          transition-delay: 0s;\\n}\\n\\n.scrollbar-track-x {\\n  bottom: 0;\\n  left: 0;\\n  width: 100%;\\n  height: 8px;\\n}\\n.scrollbar-track-y {\\n  top: 0;\\n  right: 0;\\n  width: 8px;\\n  height: 100%;\\n}\\n.scrollbar-thumb {\\n  position: absolute;\\n  top: 0;\\n  left: 0;\\n  width: 8px;\\n  height: 8px;\\n  background: \" + THUMB_BG + \";\\n  border-radius: 4px;\\n}\\n\";\nvar STYLE_ID = 'smooth-scrollbar-style';\nvar isStyleAttached = false;\nexport function attachStyle() {\n    if (isStyleAttached || typeof window === 'undefined') {\n        return;\n    }\n    var styleEl = document.createElement('style');\n    styleEl.id = STYLE_ID;\n    styleEl.textContent = SCROLLBAR_STYLE;\n    if (document.head) {\n        document.head.appendChild(styleEl);\n    }\n    isStyleAttached = true;\n}\nexport function detachStyle() {\n    if (!isStyleAttached || typeof window === 'undefined') {\n        return;\n    }\n    var styleEl = document.getElementById(STYLE_ID);\n    if (!styleEl || !styleEl.parentNode) {\n        return;\n    }\n    styleEl.parentNode.removeChild(styleEl);\n    isStyleAttached = false;\n}\n//# sourceMappingURL=style.js.map","import { __extends } from \"tslib\";\nimport './polyfills';\nimport { scrollbarMap, Scrollbar, } from './scrollbar';\nimport { addPlugins, ScrollbarPlugin, } from './plugin';\nimport { attachStyle, detachStyle, } from './style';\nexport { ScrollbarPlugin };\n/**\n * cast `I.Scrollbar` to `Scrollbar` to avoid error\n *\n * `I.Scrollbar` is not assignable to `Scrollbar`:\n *     \"privateProp\" is missing in `I.Scrollbar`\n *\n * @see https://github.com/Microsoft/TypeScript/issues/2672\n */\nvar SmoothScrollbar = /** @class */ (function (_super) {\n    __extends(SmoothScrollbar, _super);\n    function SmoothScrollbar() {\n        return _super !== null && _super.apply(this, arguments) || this;\n    }\n    /**\n     * Initializes a scrollbar on the given element.\n     *\n     * @param elem The DOM element that you want to initialize scrollbar to\n     * @param [options] Initial options\n     */\n    SmoothScrollbar.init = function (elem, options) {\n        if (!elem || elem.nodeType !== 1) {\n            throw new TypeError(\"expect element to be DOM Element, but got \" + elem);\n        }\n        // attach stylesheet\n        attachStyle();\n        if (scrollbarMap.has(elem)) {\n            return scrollbarMap.get(elem);\n        }\n        return new Scrollbar(elem, options);\n    };\n    /**\n     * Automatically init scrollbar on all elements base on the selector `[data-scrollbar]`\n     *\n     * @param options Initial options\n     */\n    SmoothScrollbar.initAll = function (options) {\n        return Array.from(document.querySelectorAll('[data-scrollbar]'), function (elem) {\n            return SmoothScrollbar.init(elem, options);\n        });\n    };\n    /**\n     * Check if there is a scrollbar on given element\n     *\n     * @param elem The DOM element that you want to check\n     */\n    SmoothScrollbar.has = function (elem) {\n        return scrollbarMap.has(elem);\n    };\n    /**\n     * Gets scrollbar on the given element.\n     * If no scrollbar instance exsits, returns `undefined`\n     *\n     * @param elem The DOM element that you want to check.\n     */\n    SmoothScrollbar.get = function (elem) {\n        return scrollbarMap.get(elem);\n    };\n    /**\n     * Returns an array that contains all scrollbar instances\n     */\n    SmoothScrollbar.getAll = function () {\n        return Array.from(scrollbarMap.values());\n    };\n    /**\n     * Removes scrollbar on the given element\n     */\n    SmoothScrollbar.destroy = function (elem) {\n        var scrollbar = scrollbarMap.get(elem);\n        if (scrollbar) {\n            scrollbar.destroy();\n        }\n    };\n    /**\n     * Removes all scrollbar instances from current document\n     */\n    SmoothScrollbar.destroyAll = function () {\n        scrollbarMap.forEach(function (scrollbar) {\n            scrollbar.destroy();\n        });\n    };\n    /**\n     * Attaches plugins to scrollbars\n     *\n     * @param ...Plugins Scrollbar plugin classes\n     */\n    SmoothScrollbar.use = function () {\n        var Plugins = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            Plugins[_i] = arguments[_i];\n        }\n        return addPlugins.apply(void 0, Plugins);\n    };\n    /**\n     * Attaches default style sheets to current document.\n     * You don't need to call this method manually unless\n     * you removed the default styles via `Scrollbar.detachStyle()`\n     */\n    SmoothScrollbar.attachStyle = function () {\n        return attachStyle();\n    };\n    /**\n     * Removes default styles from current document.\n     * Use this method when you want to use your own css for scrollbars.\n     */\n    SmoothScrollbar.detachStyle = function () {\n        return detachStyle();\n    };\n    SmoothScrollbar.version = \"8.8.4\";\n    SmoothScrollbar.ScrollbarPlugin = ScrollbarPlugin;\n    return SmoothScrollbar;\n}(Scrollbar));\nexport default SmoothScrollbar;\n//# sourceMappingURL=index.js.map","import gsap from \"gsap\";\nimport Controller from \"./scrollmagic/controller\";\nimport Scrollbar from \"smooth-scrollbar\";\nvar ScrollController = /** @class */ (function () {\n    function ScrollController(options) {\n        var _this = this;\n        this.scenes = [];\n        this.scrollbarListeners = [];\n        this.isScrollingTo = false;\n        this.options = options;\n        this.container = options.container || window;\n        this.smoothScrolling = options.smoothScrolling || false;\n        // Scroll to when loading page with hashtag\n        // https://github.com/idiotWu/smooth-scrollbar/issues/128#issuecomment-390980479\n        var hash = location.hash;\n        if (hash) {\n            requestAnimationFrame(function () {\n                setTimeout(function () {\n                    var _a;\n                    (_a = _this.container) === null || _a === void 0 ? void 0 : _a.scrollTo(0, 0);\n                    if (_this.smoothScrolling) {\n                        var elem = document.querySelector(hash);\n                        if (elem) {\n                            _this.scrollbar.scrollIntoView(elem, {\n                                offsetTop: -_this.scrollbar.containerEl.scrollTop,\n                            });\n                        }\n                    }\n                    else {\n                        _this.controller.scrollTo(hash);\n                    }\n                }, 0);\n            });\n        }\n    }\n    Object.defineProperty(ScrollController.prototype, \"smoothScrolling\", {\n        get: function () {\n            return this._smoothScrolling;\n        },\n        set: function (newValue) {\n            this.removeAllScenes();\n            this.destroyController();\n            this._smoothScrolling = newValue;\n            if (this._smoothScrolling) {\n                console.debug(\"[ScrollController] Smooth scrolling activated\");\n                this.controller = new Controller(Object.assign(this.options, { smoothScrolling: true, refreshInterval: 0 }));\n                this.createScrollbars();\n            }\n            else {\n                console.debug(\"[ScrollController] Common scrolling activated\");\n                this.controller = new Controller(this.options);\n                this.controller.scrollTo(function (newPos) {\n                    gsap.to(this, {\n                        duration: 2,\n                        scrollTo: {\n                            y: newPos,\n                        },\n                        ease: \"power4.out\",\n                    });\n                });\n                this.removeScrollbars();\n            }\n            this.addAllScenes();\n        },\n        enumerable: false,\n        configurable: true\n    });\n    ScrollController.prototype.scrollTo = function (targetId) {\n        var _this = this;\n        if (this.smoothScrolling) {\n            var element = this.container instanceof Window\n                ? document.body.querySelector(targetId)\n                : this.container.querySelector(targetId);\n            if (element) {\n                this.scrollbar.scrollIntoView(element);\n            }\n        }\n        else {\n            this.latestTargetId = targetId;\n            this.isScrollingTo = true;\n            this.controller.scrollTo(targetId, function () {\n                _this.isScrollingTo = false;\n            });\n        }\n    };\n    ScrollController.prototype.getScrollPos = function () {\n        if (this.smoothScrolling) {\n            return this.scrollbar.offset.y;\n        }\n        return this.controller.scrollPos();\n    };\n    ScrollController.prototype.addScene = function (scene) {\n        scene.addTo(this);\n        this.scenes.push(scene);\n    };\n    ScrollController.prototype.removeScene = function (scene) {\n        scene.remove();\n        this.scenes = this.scenes.filter(function (current) {\n            return current !== scene;\n        });\n    };\n    ScrollController.prototype.addScrollbarListener = function (listener) {\n        if (this.scrollbar) {\n            this.scrollbar.addListener(listener);\n            this.scrollbarListeners.push(listener);\n        }\n    };\n    ScrollController.prototype.removeScrollbarListener = function (listener) {\n        if (this.scrollbar) {\n            this.scrollbar.removeListener(listener);\n            this.scrollbarListeners = this.scrollbarListeners.filter(function (current) {\n                return current !== listener;\n            });\n        }\n    };\n    ScrollController.prototype.setScrollOffset = function (offset) {\n        if (!this._smoothScrolling) {\n            this.controller.scrollTo(function (newPos, callback) {\n                gsap.to(this, {\n                    duration: 2,\n                    scrollTo: {\n                        y: newPos + offset,\n                    },\n                    onComplete: function () {\n                        if (callback)\n                            callback();\n                    },\n                    ease: \"power4.out\",\n                });\n            });\n            // This is necessary because if the offset changes while the page is animating,\n            // it goes to the wrong position. So we need to animate it to the right one.\n            if (this.isScrollingTo && this.latestTargetId) {\n                this.scrollTo(this.latestTargetId);\n                this.latestTargetId = undefined;\n            }\n        }\n    };\n    ScrollController.prototype.createScrollbars = function () {\n        var _this = this;\n        var container;\n        if (this.container instanceof Window) {\n            container = document.body;\n        }\n        else {\n            container = this.container;\n        }\n        this.scrollbar = Scrollbar.init(container, {\n            damping: 0.05,\n        });\n        this.addScrollbarListener(function () {\n            _this.scenes.forEach(function (scene) { return scene.refresh(); });\n        });\n        this.controller.scrollbar = this.scrollbar;\n    };\n    ScrollController.prototype.removeScrollbars = function () {\n        var _this = this;\n        if (this.scrollbar) {\n            this.scrollbarListeners.forEach(function (listener) { return _this.scrollbar.removeListener(listener); });\n            this.scrollbarListeners = [];\n            this.scrollbar.destroy();\n        }\n    };\n    ScrollController.prototype.addAllScenes = function () {\n        var _this = this;\n        this.scenes.forEach(function (scene) { return scene.addTo(_this); });\n    };\n    ScrollController.prototype.removeAllScenes = function () {\n        this.scenes.forEach(function (scene) { return scene.remove(); });\n    };\n    ScrollController.prototype.destroyController = function () {\n        if (this.controller) {\n            if (this.smoothScrolling) {\n                console.debug(\"[Controller] Removed smooth scrolling\");\n            }\n            else {\n                console.debug(\"[Controller] Removed common scrolling\");\n            }\n            this.controller.destroy(true);\n        }\n        return null;\n    };\n    return ScrollController;\n}());\nexport default ScrollController;\n//# sourceMappingURL=scroll-controller.js.map","import gsap from \"gsap\";\nimport Logger from \"../scrollmagic/utils/logger\";\nvar AnimationCreator = /** @class */ (function () {\n    function AnimationCreator() {\n        this.timeline = gsap.timeline().add(\"start\");\n    }\n    /**\n     * Adds animation to Timeline.\n     *\n     * @param {HTMLElement} - The element that will be animated, if a stagger property is set, its children will be animated instead\n     * @param {AnimationDescriptor} - Object with the animation properties\n     *\n     * @returns {AnimationCreator} - Same instance\n     */\n    AnimationCreator.prototype.add = function (element, descriptor) {\n        var target = descriptor.stagger ? element.children : element;\n        if (descriptor.delay !== undefined && descriptor.delay > 0) {\n            this.timeline.delay(descriptor.delay);\n        }\n        if (this.hasFromVars(descriptor) && this.hasToVars(descriptor)) {\n            var fromVars = this.getFromVars(descriptor, true);\n            var toVars = this.getToVars(descriptor);\n            this.timeline.fromTo(target, fromVars, toVars, descriptor.position);\n        }\n        else if (this.hasFromVars(descriptor)) {\n            var fromVars = this.getFromVars(descriptor);\n            this.timeline.from(target, fromVars, descriptor.position);\n        }\n        else if (this.hasToVars(descriptor)) {\n            var toVars = this.getToVars(descriptor);\n            this.timeline.to(target, toVars, descriptor.position);\n        }\n        else {\n            Logger.warning(\"No animation property has been set.\");\n        }\n        if (descriptor.label !== undefined) {\n            if (this.hasFromVars(descriptor) || this.hasToVars(descriptor)) {\n                this.timeline.add(descriptor.label);\n            }\n            else {\n                this.timeline.add(descriptor.label, descriptor.position);\n            }\n        }\n        return this;\n    };\n    AnimationCreator.prototype.create = function () {\n        return this.timeline;\n    };\n    AnimationCreator.prototype.getFromVars = function (descriptor, hasToVars) {\n        var vars = hasToVars ? {} : this.getTweenVars(descriptor);\n        if (descriptor.from.alpha !== undefined) {\n            vars.autoAlpha = descriptor.from.alpha;\n        }\n        if (descriptor.from.x !== undefined) {\n            vars.x = descriptor.from.x;\n        }\n        if (descriptor.from.y !== undefined) {\n            vars.y = descriptor.from.y;\n        }\n        if (descriptor.from.xPercent !== undefined) {\n            vars.xPercent = descriptor.from.xPercent;\n        }\n        if (descriptor.from.yPercent !== undefined) {\n            vars.yPercent = descriptor.from.yPercent;\n        }\n        if (descriptor.from.scale !== undefined) {\n            vars.scale = descriptor.from.scale;\n        }\n        if (descriptor.from.rotation !== undefined) {\n            vars.rotation = descriptor.from.rotation;\n        }\n        if (descriptor.from.width !== undefined) {\n            vars.width = descriptor.from.width;\n        }\n        if (descriptor.from.height !== undefined) {\n            vars.height = descriptor.from.height;\n        }\n        return vars;\n    };\n    AnimationCreator.prototype.getToVars = function (descriptor) {\n        var vars = this.getTweenVars(descriptor);\n        if (descriptor.to.alpha !== undefined) {\n            vars.autoAlpha = descriptor.to.alpha;\n        }\n        if (descriptor.to.x !== undefined) {\n            vars.x = descriptor.to.x;\n        }\n        if (descriptor.to.y !== undefined) {\n            vars.y = descriptor.to.y;\n        }\n        if (descriptor.to.xPercent !== undefined) {\n            vars.xPercent = descriptor.to.xPercent;\n        }\n        if (descriptor.to.yPercent !== undefined) {\n            vars.yPercent = descriptor.to.yPercent;\n        }\n        if (descriptor.to.scale !== undefined) {\n            vars.scale = descriptor.to.scale;\n        }\n        if (descriptor.to.rotation !== undefined) {\n            vars.rotation = descriptor.to.rotation;\n        }\n        if (descriptor.to.width !== undefined) {\n            vars.width = descriptor.to.width;\n        }\n        if (descriptor.to.height !== undefined) {\n            vars.height = descriptor.to.height;\n        }\n        return vars;\n    };\n    AnimationCreator.prototype.hasFromVars = function (descriptor) {\n        return Object.keys(descriptor.from).length > 0;\n    };\n    AnimationCreator.prototype.hasToVars = function (descriptor) {\n        return Object.keys(descriptor.to).length > 0;\n    };\n    AnimationCreator.prototype.getTweenVars = function (descriptor) {\n        var vars = {};\n        vars.duration = descriptor.duration;\n        vars.repeat = descriptor.repeat;\n        vars.yoyo = descriptor.yoyo;\n        vars.stagger = descriptor.stagger;\n        if (descriptor.momentum > 0) {\n            vars.data = {\n                ease: descriptor.ease,\n                momentum: descriptor.momentum,\n            };\n        }\n        else {\n            vars.ease = descriptor.ease;\n        }\n        return vars;\n    };\n    return AnimationCreator;\n}());\nexport default AnimationCreator;\n//# sourceMappingURL=animation.creator.js.map","var Parser = /** @class */ (function () {\n    function Parser(breakpoints) {\n        this.breakpoints = breakpoints || {\n            sm: 576,\n            md: 768,\n            lg: 992,\n            xl: 1200,\n            xxl: 1600,\n        };\n    }\n    Parser.prototype.create = function (parser, defaultOptions) {\n        return new parser(this.breakpoints, defaultOptions);\n    };\n    return Parser;\n}());\nexport default Parser;\n//# sourceMappingURL=parser.js.map","/* eslint-disable */\nfunction type(value) {\n    return Object.prototype.toString\n        .call(value)\n        .replace(/^\\[object (.+)\\]$/, \"$1\")\n        .toLowerCase();\n}\n/**\n * Check if value is string.\n *\n * @example\n * isString(\"bla\") // true\n * isString(\"12\") // false\n * isString(\"true\") // false\n *\n * @param {any} - Value from parameter\n *\n * @returns {boolean}\n */\nfunction isString(value) {\n    return type(value) === \"string\" && !isNumber(value) && !isBoolean(value);\n}\nfunction isNumber(value) {\n    return !isArray(value) && value - parseFloat(value) + 1 >= 0;\n}\nfunction isPercentage(value) {\n    return type(value) === \"string\" && value.match(/^(\\.|\\d)*\\d+%$/);\n}\nfunction isBoolean(value) {\n    return (type(value) === \"boolean\" ||\n        (type(value) === \"string\" && (value.toLowerCase() === \"true\" || value.toLowerCase() === \"false\")));\n}\nfunction isArray(value) {\n    return Array.isArray(value);\n}\nfunction isFunction(value) {\n    return type(value) === \"function\";\n}\nfunction isHookValue(value) {\n    return value === \"onLeave\" || value === \"onCenter\" || value === \"onEnter\";\n}\nfunction isHTMLElement(value) {\n    return typeof HTMLElement === \"object\" || typeof HTMLElement === \"function\"\n        ? value instanceof HTMLElement || (typeof SVGElement !== \"undefined\" && value instanceof SVGElement)\n        : value &&\n            typeof value === \"object\" &&\n            value !== null &&\n            value.nodeType === 1 &&\n            typeof value.nodeName === \"string\";\n}\nfunction toString(value) {\n    return \"\".concat(value);\n}\nfunction toFloat(value) {\n    return parseFloat(toString(value));\n}\nfunction toInteger(value) {\n    return parseInt(toString(value));\n}\nfunction toBoolean(value) {\n    return toString(value).toLowerCase() === \"true\" ? true : false;\n}\nfunction toHookValue(value) {\n    var values = {\n        onLeave: 0,\n        onCenter: 0.5,\n        onEnter: 1,\n    };\n    if (value in values) {\n        return values[value];\n    }\n    return -1;\n}\nfunction toHTMLElement(value) {\n    return value;\n}\n// TODO: Improve this to be independent from breakpoints, maybe using a recursive function\nfunction get(item, breakpoints, type, property) {\n    var screenWidth = window.innerWidth;\n    var key = property === \"name\" ? type : \"\".concat(type, \"-\").concat(property);\n    // xs\n    if (breakpoints.sm && screenWidth < breakpoints.sm) {\n        return item.getAttribute(\"data-xs-\".concat(key)) || item.getAttribute(\"data-\".concat(key)) || undefined;\n    }\n    // sm\n    else if (breakpoints.md && screenWidth < breakpoints.md) {\n        return (item.getAttribute(\"data-sm-\".concat(key)) ||\n            item.getAttribute(\"data-xs-\".concat(key)) ||\n            item.getAttribute(\"data-\".concat(key)) ||\n            undefined);\n    }\n    // md\n    else if (breakpoints.lg && screenWidth < breakpoints.lg) {\n        return (item.getAttribute(\"data-md-\".concat(key)) ||\n            item.getAttribute(\"data-sm-\".concat(key)) ||\n            item.getAttribute(\"data-xs-\".concat(key)) ||\n            item.getAttribute(\"data-\".concat(key)) ||\n            undefined);\n    }\n    // lg\n    else if (breakpoints.xl && screenWidth < breakpoints.xl) {\n        return (item.getAttribute(\"data-lg-\".concat(key)) ||\n            item.getAttribute(\"data-md-\".concat(key)) ||\n            item.getAttribute(\"data-sm-\".concat(key)) ||\n            item.getAttribute(\"data-xs-\".concat(key)) ||\n            item.getAttribute(\"data-\".concat(key)) ||\n            undefined);\n    }\n    // xl\n    else if (breakpoints.xxl && screenWidth < breakpoints.xxl) {\n        return (item.getAttribute(\"data-xl-\".concat(key)) ||\n            item.getAttribute(\"data-lg-\".concat(key)) ||\n            item.getAttribute(\"data-md-\".concat(key)) ||\n            item.getAttribute(\"data-sm-\".concat(key)) ||\n            item.getAttribute(\"data-xs-\".concat(key)) ||\n            item.getAttribute(\"data-\".concat(key)) ||\n            undefined);\n    }\n    // xxl\n    else {\n        return (item.getAttribute(\"data-xxl-\".concat(key)) ||\n            item.getAttribute(\"data-xl-\".concat(key)) ||\n            item.getAttribute(\"data-lg-\".concat(key)) ||\n            item.getAttribute(\"data-md-\".concat(key)) ||\n            item.getAttribute(\"data-sm-\".concat(key)) ||\n            item.getAttribute(\"data-xs-\".concat(key)) ||\n            item.getAttribute(\"data-\".concat(key)) ||\n            undefined);\n    }\n}\nexport default {\n    isString: isString,\n    isNumber: isNumber,\n    isPercentage: isPercentage,\n    isBoolean: isBoolean,\n    isFunction: isFunction,\n    isHookValue: isHookValue,\n    isHTMLElement: isHTMLElement,\n    toString: toString,\n    toInteger: toInteger,\n    toFloat: toFloat,\n    toBoolean: toBoolean,\n    toHookValue: toHookValue,\n    toHTMLElement: toHTMLElement,\n    get: get,\n};\n//# sourceMappingURL=param.helper.js.map","import ParamHelper from \"../helpers/param.helper\";\nvar BaseParser = /** @class */ (function () {\n    function BaseParser(breakpoints, defaultOptions) {\n        this.breakpoints = breakpoints;\n        this.defaultOptions = defaultOptions;\n    }\n    /**\n     * Gets the name of the descriptor.\n     *\n     * @param {HTMLElement} - Element that has or hasn't the name\n     *\n     * @returns {string | undefined} - The name if it exists\n     */\n    BaseParser.prototype.getName = function (el) {\n        return this.get(el, \"name\");\n    };\n    /**\n     * Gets all elements of [data-key] inside the container, casting nodes to @HTMLElement\n     *\n     * @param {HTMLElement} - Container\n     *\n     * @returns {HTMLElement[]} - List of [data-key] elements\n     */\n    BaseParser.prototype.getElements = function (container) {\n        var elements = [];\n        var nodes = container.querySelectorAll(\"[data-\".concat(this.key, \"]\"));\n        nodes.forEach(function (node) { return elements.push(node); });\n        return elements;\n    };\n    BaseParser.prototype.get = function (el, property) {\n        return ParamHelper.get(el, this.breakpoints, this.key, property);\n    };\n    return BaseParser;\n}());\nexport default BaseParser;\n//# sourceMappingURL=base.parser.js.map","import ParamHelper from \"../helpers/param.helper\";\nimport TypeHelper from \"../helpers/type.helper\";\nimport { merge } from \"../utils\";\nvar AnimationBuilder = /** @class */ (function () {\n    function AnimationBuilder(name, defaultOptions) {\n        if (name !== undefined && !ParamHelper.isString(name)) {\n            throw new TypeError(\"[\".concat(AnimationBuilder.NAMESPACE, \"] Animation name isn't a valid string: \\\"\").concat(name, \"\\\"\"));\n        }\n        if (defaultOptions !== undefined && !TypeHelper.isAnimationDescriptor(defaultOptions)) {\n            throw new TypeError(\"[\".concat(AnimationBuilder.NAMESPACE, \"] Animation default options aren't a valid object.\\\"\"));\n        }\n        if (defaultOptions && defaultOptions.name) {\n            throw new Error(\"[\".concat(AnimationBuilder.NAMESPACE, \"] It's not possible to set a default \\\"name\\\".\"));\n        }\n        if (defaultOptions && defaultOptions.label) {\n            throw new Error(\"[\".concat(AnimationBuilder.NAMESPACE, \"] It's not possible to set a default \\\"label\\\".\"));\n        }\n        this.descriptor = merge({\n            name: name,\n            duration: 1,\n            position: \"+=0\",\n            repeat: 0,\n            yoyo: false,\n            delay: 0,\n            ease: \"power1.out\",\n            momentum: 0,\n            transformOrigin: \"center center\",\n            from: {},\n            to: {},\n        }, defaultOptions);\n    }\n    AnimationBuilder.prototype.duration = function (value) {\n        if (value !== undefined) {\n            if (ParamHelper.isNumber(value)) {\n                this.descriptor.duration = ParamHelper.toFloat(value);\n            }\n            else {\n                throw new TypeError(\"[\".concat(AnimationBuilder.NAMESPACE, \"] Value for \\\"duration\\\" isn't a valid number: \\\"\").concat(value, \"\\\"\"));\n            }\n        }\n        return this;\n    };\n    AnimationBuilder.prototype.position = function (value) {\n        if (value !== undefined) {\n            if (ParamHelper.isString(value)) {\n                this.descriptor.position = ParamHelper.toString(value);\n            }\n            else {\n                throw new TypeError(\"[\".concat(AnimationBuilder.NAMESPACE, \"] Value for \\\"position\\\" isn't a valid string: \\\"\").concat(value, \"\\\"\"));\n            }\n        }\n        return this;\n    };\n    AnimationBuilder.prototype.repeat = function (value) {\n        if (value !== undefined) {\n            if (ParamHelper.isNumber(value)) {\n                this.descriptor.repeat = ParamHelper.toInteger(value);\n            }\n            else {\n                throw new TypeError(\"[\".concat(AnimationBuilder.NAMESPACE, \"] Value for \\\"repeat\\\" isn't a valid number: \\\"\").concat(value, \"\\\"\"));\n            }\n        }\n        return this;\n    };\n    AnimationBuilder.prototype.yoyo = function (value) {\n        if (value !== undefined) {\n            if (ParamHelper.isBoolean(value)) {\n                this.descriptor.yoyo = ParamHelper.toBoolean(value);\n            }\n            else {\n                throw new TypeError(\"[\".concat(AnimationBuilder.NAMESPACE, \"] Value for \\\"yoyo\\\" isn't a valid boolean: \\\"\").concat(value, \"\\\"\"));\n            }\n        }\n        return this;\n    };\n    AnimationBuilder.prototype.delay = function (value) {\n        if (value !== undefined) {\n            if (ParamHelper.isNumber(value)) {\n                this.descriptor.delay = ParamHelper.toFloat(value);\n            }\n            else {\n                throw new TypeError(\"[\".concat(AnimationBuilder.NAMESPACE, \"] Value for \\\"delay\\\" isn't a valid number: \\\"\").concat(value, \"\\\"\"));\n            }\n        }\n        return this;\n    };\n    AnimationBuilder.prototype.momentum = function (value) {\n        if (value !== undefined) {\n            if (ParamHelper.isNumber(value)) {\n                this.descriptor.momentum = ParamHelper.toFloat(value);\n            }\n            else {\n                throw new TypeError(\"[\".concat(AnimationBuilder.NAMESPACE, \"] Value for \\\"momentum\\\" isn't a valid number: \\\"\").concat(value, \"\\\"\"));\n            }\n        }\n        return this;\n    };\n    AnimationBuilder.prototype.stagger = function (value) {\n        if (value !== undefined) {\n            if (ParamHelper.isNumber(value)) {\n                this.descriptor.stagger = ParamHelper.toFloat(value);\n            }\n            else {\n                throw new TypeError(\"[\".concat(AnimationBuilder.NAMESPACE, \"] Value for \\\"stagger\\\" isn't a valid number: \\\"\").concat(value, \"\\\"\"));\n            }\n        }\n        return this;\n    };\n    AnimationBuilder.prototype.transformOrigin = function (value) {\n        if (value !== undefined) {\n            if (ParamHelper.isString(value)) {\n                this.descriptor.transformOrigin = ParamHelper.toString(value);\n            }\n            else {\n                throw new TypeError(\"[\".concat(AnimationBuilder.NAMESPACE, \"] Value for \\\"transformOrigin\\\" isn't a valid string: \\\"\").concat(value, \"\\\"\"));\n            }\n        }\n        return this;\n    };\n    AnimationBuilder.prototype.ease = function (value) {\n        if (value !== undefined) {\n            if (ParamHelper.isString(value)) {\n                this.descriptor.ease = ParamHelper.toString(value);\n            }\n            else {\n                throw new TypeError(\"[\".concat(AnimationBuilder.NAMESPACE, \"] Value for \\\"ease\\\" isn't a valid string: \\\"\").concat(value, \"\\\"\"));\n            }\n        }\n        return this;\n    };\n    AnimationBuilder.prototype.label = function (value) {\n        if (value !== undefined) {\n            if (ParamHelper.isString(value)) {\n                this.descriptor.label = ParamHelper.toString(value);\n            }\n            else {\n                throw new TypeError(\"[\".concat(AnimationBuilder.NAMESPACE, \"] Value for \\\"label\\\" isn't a valid string: \\\"\").concat(value, \"\\\"\"));\n            }\n        }\n        return this;\n    };\n    AnimationBuilder.prototype.fromAlpha = function (value) {\n        if (value !== undefined) {\n            if (ParamHelper.isNumber(value)) {\n                this.descriptor.from.alpha = ParamHelper.toFloat(value);\n            }\n            else {\n                throw new TypeError(\"[\".concat(AnimationBuilder.NAMESPACE, \"] Value for \\\"fromAlpha\\\" isn't a valid number: \\\"\").concat(value, \"\\\"\"));\n            }\n        }\n        return this;\n    };\n    AnimationBuilder.prototype.toAlpha = function (value) {\n        if (value !== undefined) {\n            if (ParamHelper.isNumber(value)) {\n                this.descriptor.to.alpha = ParamHelper.toFloat(value);\n            }\n            else {\n                throw new TypeError(\"[\".concat(AnimationBuilder.NAMESPACE, \"] Value for \\\"toAlpha\\\" isn't a valid number: \\\"\").concat(value, \"\\\"\"));\n            }\n        }\n        return this;\n    };\n    AnimationBuilder.prototype.fromX = function (value) {\n        if (value !== undefined) {\n            if (ParamHelper.isNumber(value)) {\n                this.descriptor.from.x = ParamHelper.toInteger(value);\n            }\n            else {\n                throw new TypeError(\"[\".concat(AnimationBuilder.NAMESPACE, \"] Value for \\\"fromX\\\" isn't a valid number: \\\"\").concat(value, \"\\\"\"));\n            }\n        }\n        return this;\n    };\n    AnimationBuilder.prototype.toX = function (value) {\n        if (value !== undefined) {\n            if (ParamHelper.isNumber(value)) {\n                this.descriptor.to.x = ParamHelper.toInteger(value);\n            }\n            else {\n                throw new TypeError(\"[\".concat(AnimationBuilder.NAMESPACE, \"] Value for \\\"toX\\\" isn't a valid number: \\\"\").concat(value, \"\\\"\"));\n            }\n        }\n        return this;\n    };\n    AnimationBuilder.prototype.fromY = function (value) {\n        if (value !== undefined) {\n            if (ParamHelper.isNumber(value)) {\n                this.descriptor.from.y = ParamHelper.toInteger(value);\n            }\n            else {\n                throw new TypeError(\"[\".concat(AnimationBuilder.NAMESPACE, \"] Value for \\\"fromY\\\" isn't a valid number: \\\"\").concat(value, \"\\\"\"));\n            }\n        }\n        return this;\n    };\n    AnimationBuilder.prototype.toY = function (value) {\n        if (value !== undefined) {\n            if (ParamHelper.isNumber(value)) {\n                this.descriptor.to.y = ParamHelper.toInteger(value);\n            }\n            else {\n                throw new TypeError(\"[\".concat(AnimationBuilder.NAMESPACE, \"] Value for \\\"toY\\\" isn't a valid number: \\\"\").concat(value, \"\\\"\"));\n            }\n        }\n        return this;\n    };\n    AnimationBuilder.prototype.fromXPercent = function (value) {\n        if (value !== undefined) {\n            if (ParamHelper.isNumber(value)) {\n                this.descriptor.from.xPercent = ParamHelper.toFloat(value);\n            }\n            else {\n                throw new TypeError(\"[\".concat(AnimationBuilder.NAMESPACE, \"] Value for \\\"fromXPercent\\\" isn't a valid number: \\\"\").concat(value, \"\\\"\"));\n            }\n        }\n        return this;\n    };\n    AnimationBuilder.prototype.toXPercent = function (value) {\n        if (value !== undefined) {\n            if (ParamHelper.isNumber(value)) {\n                this.descriptor.to.xPercent = ParamHelper.toFloat(value);\n            }\n            else {\n                throw new TypeError(\"[\".concat(AnimationBuilder.NAMESPACE, \"] Value for \\\"toXPercent\\\" isn't a valid number: \\\"\").concat(value, \"\\\"\"));\n            }\n        }\n        return this;\n    };\n    AnimationBuilder.prototype.fromYPercent = function (value) {\n        if (value !== undefined) {\n            if (ParamHelper.isNumber(value)) {\n                this.descriptor.from.yPercent = ParamHelper.toFloat(value);\n            }\n            else {\n                throw new TypeError(\"[\".concat(AnimationBuilder.NAMESPACE, \"] Value for \\\"fromYPercent\\\" isn't a valid number: \\\"\").concat(value, \"\\\"\"));\n            }\n        }\n        return this;\n    };\n    AnimationBuilder.prototype.toYPercent = function (value) {\n        if (value !== undefined) {\n            if (ParamHelper.isNumber(value)) {\n                this.descriptor.to.yPercent = ParamHelper.toFloat(value);\n            }\n            else {\n                throw new TypeError(\"[\".concat(AnimationBuilder.NAMESPACE, \"] Value for \\\"toYPercent\\\" isn't a valid number: \\\"\").concat(value, \"\\\"\"));\n            }\n        }\n        return this;\n    };\n    AnimationBuilder.prototype.fromScale = function (value) {\n        if (value !== undefined) {\n            if (ParamHelper.isNumber(value)) {\n                this.descriptor.from.scale = ParamHelper.toFloat(value);\n            }\n            else {\n                throw new TypeError(\"[\".concat(AnimationBuilder.NAMESPACE, \"] Value for \\\"fromScale\\\" isn't a valid number: \\\"\").concat(value, \"\\\"\"));\n            }\n        }\n        return this;\n    };\n    AnimationBuilder.prototype.toScale = function (value) {\n        if (value !== undefined) {\n            if (ParamHelper.isNumber(value)) {\n                this.descriptor.to.scale = ParamHelper.toFloat(value);\n            }\n            else {\n                throw new TypeError(\"[\".concat(AnimationBuilder.NAMESPACE, \"] Value for \\\"toScale\\\" isn't a valid number: \\\"\").concat(value, \"\\\"\"));\n            }\n        }\n        return this;\n    };\n    AnimationBuilder.prototype.fromRotation = function (value) {\n        if (value !== undefined) {\n            if (ParamHelper.isNumber(value)) {\n                this.descriptor.from.rotation = ParamHelper.toFloat(value);\n            }\n            else {\n                throw new TypeError(\"[\".concat(AnimationBuilder.NAMESPACE, \"] Value for \\\"fromRotation\\\" isn't a valid number: \\\"\").concat(value, \"\\\"\"));\n            }\n        }\n        return this;\n    };\n    AnimationBuilder.prototype.toRotation = function (value) {\n        if (value !== undefined) {\n            if (ParamHelper.isNumber(value)) {\n                this.descriptor.to.rotation = ParamHelper.toFloat(value);\n            }\n            else {\n                throw new TypeError(\"[\".concat(AnimationBuilder.NAMESPACE, \"] Value for \\\"toRotation\\\" isn't a valid number: \\\"\").concat(value, \"\\\"\"));\n            }\n        }\n        return this;\n    };\n    AnimationBuilder.prototype.fromWidth = function (value) {\n        if (value !== undefined) {\n            if (ParamHelper.isNumber(value)) {\n                this.descriptor.from.width = ParamHelper.toInteger(value);\n            }\n            else {\n                throw new TypeError(\"[\".concat(AnimationBuilder.NAMESPACE, \"] Value for \\\"fromWidth\\\" isn't a valid number: \\\"\").concat(value, \"\\\"\"));\n            }\n        }\n        return this;\n    };\n    AnimationBuilder.prototype.toWidth = function (value) {\n        if (value !== undefined) {\n            if (ParamHelper.isNumber(value)) {\n                this.descriptor.to.width = ParamHelper.toInteger(value);\n            }\n            else {\n                throw new TypeError(\"[\".concat(AnimationBuilder.NAMESPACE, \"] Value for \\\"toWidth\\\" isn't a valid number: \\\"\").concat(value, \"\\\"\"));\n            }\n        }\n        return this;\n    };\n    AnimationBuilder.prototype.fromHeight = function (value) {\n        if (value !== undefined) {\n            if (ParamHelper.isNumber(value)) {\n                this.descriptor.from.height = ParamHelper.toInteger(value);\n            }\n            else {\n                throw new TypeError(\"[\".concat(AnimationBuilder.NAMESPACE, \"] Value for \\\"fromHeight\\\" isn't a valid number: \\\"\").concat(value, \"\\\"\"));\n            }\n        }\n        return this;\n    };\n    AnimationBuilder.prototype.toHeight = function (value) {\n        if (value !== undefined) {\n            if (ParamHelper.isNumber(value)) {\n                this.descriptor.to.height = ParamHelper.toInteger(value);\n            }\n            else {\n                throw new TypeError(\"[\".concat(AnimationBuilder.NAMESPACE, \"] Value for \\\"toHeight\\\" isn't a valid number: \\\"\").concat(value, \"\\\"\"));\n            }\n        }\n        return this;\n    };\n    AnimationBuilder.prototype.build = function () {\n        return this.descriptor;\n    };\n    AnimationBuilder.NAMESPACE = \"AnimationBuilder\";\n    return AnimationBuilder;\n}());\nexport default AnimationBuilder;\n//# sourceMappingURL=animation.builder.js.map","import { __extends } from \"tslib\";\nimport BaseParser from \"./base.parser\";\nimport AnimationBuilder from \"../builders/animation.builder\";\nvar AnimationParser = /** @class */ (function (_super) {\n    __extends(AnimationParser, _super);\n    function AnimationParser(breakpoints, defaultOptions) {\n        var _this = _super.call(this, breakpoints, defaultOptions) || this;\n        _this.key = \"animate\";\n        return _this;\n    }\n    /**\n     * Parses a [data-animate] element, transforming its [data-animate-*] attributes into an object.\n     *\n     * @example\n     * Input:\n     * <div data-animate data-animate-from-alpha=\"0\" data-animate-to-alpha=\"1\"></div>\n     * Output:\n     * {\n     *   from: {\n     *     alpha: 0\n     *   },\n     *   to: {\n     *     alpha: 1\n     *   }\n     * }\n     *\n     * @param {HTMLElement} - Element with [data-animate-*] attributes\n     *\n     * @returns {AnimationDescriptor} - Object with the parsed information\n     */\n    AnimationParser.prototype.parse = function (el) {\n        var builder = new AnimationBuilder(this.get(el, \"name\"), this.defaultOptions);\n        builder.duration(this.get(el, \"duration\"));\n        builder.position(this.get(el, \"position\"));\n        builder.repeat(this.get(el, \"repeat\"));\n        builder.yoyo(this.get(el, \"yoyo\"));\n        builder.delay(this.get(el, \"delay\"));\n        builder.momentum(this.get(el, \"momentum\"));\n        builder.stagger(this.get(el, \"stagger\"));\n        builder.transformOrigin(this.get(el, \"transformOrigin\"));\n        builder.ease(this.get(el, \"ease\"));\n        builder.label(this.get(el, \"label\"));\n        builder.fromAlpha(this.get(el, \"from-alpha\"));\n        builder.toAlpha(this.get(el, \"to-alpha\"));\n        builder.fromX(this.get(el, \"from-x\"));\n        builder.toX(this.get(el, \"to-x\"));\n        builder.fromY(this.get(el, \"from-y\"));\n        builder.toY(this.get(el, \"to-y\"));\n        builder.fromXPercent(this.get(el, \"from-x-percent\"));\n        builder.toXPercent(this.get(el, \"to-x-percent\"));\n        builder.fromYPercent(this.get(el, \"from-y-percent\"));\n        builder.toYPercent(this.get(el, \"to-y-percent\"));\n        builder.fromScale(this.get(el, \"from-scale\"));\n        builder.toScale(this.get(el, \"to-scale\"));\n        builder.fromRotation(this.get(el, \"from-rotation\"));\n        builder.toRotation(this.get(el, \"to-rotation\"));\n        builder.fromWidth(this.get(el, \"from-width\"));\n        builder.toWidth(this.get(el, \"to-width\"));\n        builder.fromHeight(this.get(el, \"from-height\"));\n        builder.toHeight(this.get(el, \"to-height\"));\n        return builder.build();\n    };\n    return AnimationParser;\n}(BaseParser));\nexport default AnimationParser;\n//# sourceMappingURL=animation.parser.js.map","import ParamHelper from \"../helpers/param.helper\";\nimport Logger from \"../scrollmagic/utils/logger\";\nimport TypeHelper from \"../helpers/type.helper\";\nimport { merge } from \"../utils\";\nvar SceneBuilder = /** @class */ (function () {\n    function SceneBuilder(name, defaultOptions) {\n        if (name !== undefined && !ParamHelper.isString(name)) {\n            throw new TypeError(\"[\".concat(SceneBuilder.NAMESPACE, \"] Scene name isn't a valid string: \\\"\").concat(name, \"\\\"\"));\n        }\n        if (defaultOptions !== undefined && !TypeHelper.isSceneDescriptor(defaultOptions)) {\n            throw new TypeError(\"[\".concat(SceneBuilder.NAMESPACE, \"] Scene default options aren't a valid object.\"));\n        }\n        if (defaultOptions && defaultOptions.name) {\n            throw new Error(\"[\".concat(SceneBuilder.NAMESPACE, \"] It's not possible to set a default name.\"));\n        }\n        this.descriptor = merge({\n            name: name,\n            enabled: true,\n            duration: 0,\n            hook: 0.5,\n            reverse: true,\n            pin: false,\n        }, defaultOptions);\n    }\n    SceneBuilder.prototype.enabled = function (value) {\n        if (value !== undefined) {\n            if (ParamHelper.isBoolean(value)) {\n                this.descriptor.enabled = ParamHelper.toBoolean(value);\n            }\n            else {\n                throw new TypeError(\"[\".concat(SceneBuilder.NAMESPACE, \"] Value for \\\"enabled\\\" isn't a valid boolean: \\\"\").concat(value, \"\\\"\"));\n            }\n        }\n        return this;\n    };\n    SceneBuilder.prototype.trigger = function (value, container) {\n        if (value !== undefined) {\n            if (ParamHelper.isHTMLElement(value)) {\n                this.descriptor.trigger = ParamHelper.toHTMLElement(value);\n            }\n            else if (ParamHelper.isString(value)) {\n                if (container !== undefined && ParamHelper.isHTMLElement(container)) {\n                    var nodes = container.querySelectorAll(ParamHelper.toString(value));\n                    if (nodes.length === 1) {\n                        this.descriptor.trigger = ParamHelper.toHTMLElement(nodes[0]);\n                    }\n                    else if (nodes.length > 1) {\n                        Logger.warning(\"[\".concat(SceneBuilder.NAMESPACE, \"] There are more than 1 element for trigger \\\"\").concat(value, \"\\\" in the given container. Using the first one.\"));\n                    }\n                    else {\n                        throw new Error(\"[\".concat(SceneBuilder.NAMESPACE, \"] Could't find an element with query \\\"\").concat(value, \"\\\" in the given container.\"));\n                    }\n                }\n                else {\n                    var nodes = document.body.querySelectorAll(ParamHelper.toString(value));\n                    if (nodes.length === 1) {\n                        this.descriptor.trigger = ParamHelper.toHTMLElement(nodes[0]);\n                    }\n                    else if (nodes.length > 1) {\n                        Logger.warning(\"[\".concat(SceneBuilder.NAMESPACE, \"] There are more than 1 element for trigger \\\"\").concat(value, \"\\\" in the body. Using the first one.\"));\n                    }\n                    else {\n                        throw new Error(\"[\".concat(SceneBuilder.NAMESPACE, \"] Could't find an element with query \\\"\").concat(value, \"\\\" in the body.\"));\n                    }\n                }\n            }\n            else {\n                throw new TypeError(\"[\".concat(SceneBuilder.NAMESPACE, \"] Value for \\\"trigger\\\" isn't a valid element or selector: \\\"\").concat(value, \"\\\"\"));\n            }\n        }\n        return this;\n    };\n    SceneBuilder.prototype.duration = function (value) {\n        if (value !== undefined) {\n            if (ParamHelper.isNumber(value)) {\n                this.descriptor.duration = ParamHelper.toInteger(value);\n            }\n            else if (ParamHelper.isPercentage(value)) {\n                this.descriptor.duration = ParamHelper.toString(value);\n            }\n            else if (ParamHelper.isFunction(value)) {\n                var durationMethod = value;\n                if (durationMethod && ParamHelper.isNumber(durationMethod())) {\n                    this.descriptor.duration = durationMethod;\n                }\n                else {\n                    throw new TypeError(\"[\".concat(SceneBuilder.NAMESPACE, \"] Function for \\\"duration\\\" should return a number.\"));\n                }\n            }\n            else {\n                throw new TypeError(\"[\".concat(SceneBuilder.NAMESPACE, \"] Value for \\\"duration\\\" isn't valid: \\\"\").concat(value, \"\\\"\"));\n            }\n        }\n        return this;\n    };\n    SceneBuilder.prototype.hook = function (value) {\n        if (value !== undefined) {\n            if (!ParamHelper.isNumber(value) && ParamHelper.isString(value) && !ParamHelper.isHookValue(value)) {\n                throw new TypeError(\"[\".concat(SceneBuilder.NAMESPACE, \"] Value for \\\"hook\\\" isn't valid: \\\"\").concat(value, \"\\\"\"));\n            }\n            else {\n                if (ParamHelper.isString(value)) {\n                    value = ParamHelper.toHookValue(value);\n                }\n                if (ParamHelper.isNumber(value)) {\n                    if (value >= 0 && value <= 1) {\n                        this.descriptor.hook = ParamHelper.toFloat(value);\n                    }\n                    else {\n                        throw new RangeError(\"[\".concat(SceneBuilder.NAMESPACE, \"] Value for \\\"hook\\\" should be between 0 and 1: \\\"\").concat(value, \"\\\"\"));\n                    }\n                }\n            }\n        }\n        return this;\n    };\n    SceneBuilder.prototype.reverse = function (value) {\n        if (value !== undefined) {\n            if (ParamHelper.isBoolean(value)) {\n                this.descriptor.reverse = ParamHelper.toBoolean(value);\n            }\n            else {\n                throw new TypeError(\"[\".concat(SceneBuilder.NAMESPACE, \"] Value for \\\"reverse\\\" isn't a valid boolean: \\\"\").concat(value, \"\\\"\"));\n            }\n        }\n        return this;\n    };\n    SceneBuilder.prototype.pin = function (value) {\n        if (value !== undefined) {\n            if (ParamHelper.isBoolean(value)) {\n                this.descriptor.pin = ParamHelper.toBoolean(value);\n            }\n            else {\n                throw new TypeError(\"[\".concat(SceneBuilder.NAMESPACE, \"] Value for \\\"pin\\\" isn't a valid boolean: \\\"\").concat(value, \"\\\"\"));\n            }\n        }\n        return this;\n    };\n    SceneBuilder.prototype.classToggle = function (value) {\n        if (value !== undefined) {\n            if (ParamHelper.isString(value)) {\n                this.descriptor.classToggle = ParamHelper.toString(value);\n            }\n            else {\n                throw new TypeError(\"[\".concat(SceneBuilder.NAMESPACE, \"] Value for \\\"classToggle\\\" isn't a valid string: \\\"\").concat(value, \"\\\"\"));\n            }\n        }\n        return this;\n    };\n    SceneBuilder.prototype.indicator = function (value) {\n        if (value !== undefined) {\n            if (ParamHelper.isString(value)) {\n                this.descriptor.indicator = ParamHelper.toString(value);\n            }\n            else {\n                throw new TypeError(\"[\".concat(SceneBuilder.NAMESPACE, \"] Value for \\\"indicator\\\" isn't a valid string: \\\"\").concat(value, \"\\\"\"));\n            }\n        }\n        return this;\n    };\n    SceneBuilder.prototype.onEnter = function (value) {\n        if (value !== undefined) {\n            if (ParamHelper.isFunction(value)) {\n                this.descriptor.onEnter = value;\n            }\n            else {\n                throw new TypeError(\"[\".concat(SceneBuilder.NAMESPACE, \"] Value for \\\"onEnter\\\" isn't a valid function: \\\"\").concat(value, \"\\\"\"));\n            }\n        }\n        return this;\n    };\n    SceneBuilder.prototype.onLeave = function (value) {\n        if (value !== undefined) {\n            if (ParamHelper.isFunction(value)) {\n                this.descriptor.onLeave = value;\n            }\n            else {\n                throw new TypeError(\"[\".concat(SceneBuilder.NAMESPACE, \"] Value for \\\"onLeave\\\" isn't a valid function: \\\"\").concat(value, \"\\\"\"));\n            }\n        }\n        return this;\n    };\n    SceneBuilder.prototype.onProgress = function (value) {\n        if (value !== undefined) {\n            if (ParamHelper.isFunction(value)) {\n                this.descriptor.onProgress = value;\n            }\n            else {\n                throw new TypeError(\"[\".concat(SceneBuilder.NAMESPACE, \"] Value for \\\"onProgress\\\" isn't a valid function: \\\"\").concat(value, \"\\\"\"));\n            }\n        }\n        return this;\n    };\n    SceneBuilder.prototype.build = function () {\n        return this.descriptor;\n    };\n    SceneBuilder.NAMESPACE = \"SceneBuilder\";\n    return SceneBuilder;\n}());\nexport default SceneBuilder;\n//# sourceMappingURL=scene.builder.js.map","import { __extends } from \"tslib\";\nimport BaseParser from \"./base.parser\";\nimport SceneBuilder from \"../builders/scene.builder\";\nvar SceneParser = /** @class */ (function (_super) {\n    __extends(SceneParser, _super);\n    function SceneParser(breakpoints, defaultOptions) {\n        var _this = _super.call(this, breakpoints, defaultOptions) || this;\n        _this.key = \"scene\";\n        return _this;\n    }\n    /**\n     * Parses a [data-scene] element, transforming its [data-scene-*] attributes into an object.\n     *\n     * @example\n     * Input:\n     * <div data-scene data-scene-hook=\"0.5\" data-scene-reverse=\"true\"></div>\n     * Output:\n     * {\n     *   hook: 0.5,\n     *   reverse: true\n     * }\n     *\n     * @param {HTMLElement} - Element with [data-animate-*] attributes\n     *\n     * @returns {SceneDescriptor} - Object with the parsed information\n     */\n    SceneParser.prototype.parse = function (el, container) {\n        var builder = new SceneBuilder(this.get(el, \"name\"), this.defaultOptions);\n        builder.enabled(this.get(el, \"enabled\"));\n        builder.trigger(this.get(el, \"trigger\"), container);\n        builder.duration(this.get(el, \"duration\"));\n        builder.hook(this.get(el, \"hook\"));\n        builder.reverse(this.get(el, \"reverse\"));\n        builder.pin(this.get(el, \"pin\"));\n        builder.classToggle(this.get(el, \"class-toggle\"));\n        builder.indicator(this.get(el, \"indicator\"));\n        return builder.build();\n    };\n    return SceneParser;\n}(BaseParser));\nexport default SceneParser;\n//# sourceMappingURL=scene.parser.js.map","import ParamHelper from \"../helpers/param.helper\";\nimport Logger from \"../scrollmagic/utils/logger\";\nimport TypeHelper from \"../helpers/type.helper\";\nimport { merge } from \"../utils\";\nvar ParallaxBuilder = /** @class */ (function () {\n    function ParallaxBuilder(name, defaultOptions) {\n        if (name !== undefined && !ParamHelper.isString(name)) {\n            throw new TypeError(\"[\".concat(ParallaxBuilder.NAMESPACE, \"] Parallax name isn't a valid string: \\\"\").concat(name, \"\\\"\"));\n        }\n        if (defaultOptions !== undefined && !TypeHelper.isParallaxDescriptor(defaultOptions)) {\n            throw new TypeError(\"[\".concat(ParallaxBuilder.NAMESPACE, \"] Parallax default options aren't a valid object.\"));\n        }\n        if (defaultOptions && defaultOptions.name) {\n            throw new Error(\"[\".concat(ParallaxBuilder.NAMESPACE, \"] It's not possible to set a default name.\"));\n        }\n        this.descriptor = merge({\n            name: name,\n            enabled: true,\n            type: \"global\",\n            speed: 1,\n            momentum: 0.3,\n            ease: \"none\",\n            duration: \"100%\",\n            hook: 0.5,\n            offset: 0,\n        }, defaultOptions);\n    }\n    ParallaxBuilder.prototype.element = function (value) {\n        if (value !== undefined) {\n            if (ParamHelper.isHTMLElement(value)) {\n                this.descriptor.element = ParamHelper.toHTMLElement(value);\n            }\n            else {\n                throw new TypeError(\"[\".concat(ParallaxBuilder.NAMESPACE, \"] Value for \\\"element\\\" isn't a valid DOM element: \\\"\").concat(value, \"\\\"\"));\n            }\n        }\n        return this;\n    };\n    ParallaxBuilder.prototype.enabled = function (value) {\n        if (value !== undefined) {\n            if (ParamHelper.isBoolean(value)) {\n                this.descriptor.enabled = ParamHelper.toBoolean(value);\n            }\n            else {\n                throw new TypeError(\"[\".concat(ParallaxBuilder.NAMESPACE, \"] Value for \\\"enabled\\\" isn't a valid boolean: \\\"\").concat(value, \"\\\"\"));\n            }\n        }\n        return this;\n    };\n    ParallaxBuilder.prototype.type = function (value) {\n        if (value !== undefined) {\n            if (ParamHelper.isString(value)) {\n                if (value === \"global\" || value === \"scene\") {\n                    this.descriptor.type = ParamHelper.toString(value);\n                }\n                else {\n                    throw new Error(\"[\".concat(ParallaxBuilder.NAMESPACE, \"] Value for \\\"type\\\" isn't valid, it should be \\\"global\\\" or \\\"scene\\\": \\\"\").concat(value, \"\\\"\"));\n                }\n            }\n            else {\n                throw new TypeError(\"[\".concat(ParallaxBuilder.NAMESPACE, \"] Value for \\\"type\\\" isn't a valid string: \\\"\").concat(value, \"\\\"\"));\n            }\n        }\n        return this;\n    };\n    ParallaxBuilder.prototype.speed = function (value) {\n        if (value !== undefined) {\n            if (ParamHelper.isNumber(value)) {\n                this.descriptor.speed = ParamHelper.toInteger(value);\n            }\n            else {\n                throw new TypeError(\"[\".concat(ParallaxBuilder.NAMESPACE, \"] Value for \\\"speed\\\" isn't a valid number: \\\"\").concat(value, \"\\\"\"));\n            }\n        }\n        return this;\n    };\n    ParallaxBuilder.prototype.momentum = function (value) {\n        if (value !== undefined) {\n            if (ParamHelper.isNumber(value)) {\n                this.descriptor.momentum = ParamHelper.toFloat(value);\n            }\n            else {\n                throw new TypeError(\"[\".concat(ParallaxBuilder.NAMESPACE, \"] Value for \\\"momentum\\\" isn't a valid number: \\\"\").concat(value, \"\\\"\"));\n            }\n        }\n        return this;\n    };\n    ParallaxBuilder.prototype.stagger = function (value) {\n        if (value !== undefined) {\n            if (ParamHelper.isNumber(value)) {\n                this.descriptor.stagger = ParamHelper.toFloat(value);\n            }\n            else {\n                throw new TypeError(\"[\".concat(ParallaxBuilder.NAMESPACE, \"] Value for \\\"stagger\\\" isn't a valid number: \\\"\").concat(value, \"\\\"\"));\n            }\n        }\n        return this;\n    };\n    ParallaxBuilder.prototype.ease = function (value) {\n        if (value !== undefined) {\n            if (ParamHelper.isString(value)) {\n                this.descriptor.ease = ParamHelper.toString(value);\n            }\n            else {\n                throw new TypeError(\"[\".concat(ParallaxBuilder.NAMESPACE, \"] Value for \\\"ease\\\" isn't a valid string: \\\"\").concat(value, \"\\\"\"));\n            }\n        }\n        return this;\n    };\n    ParallaxBuilder.prototype.trigger = function (value, container) {\n        if (value !== undefined) {\n            if (ParamHelper.isHTMLElement(value)) {\n                this.descriptor.trigger = ParamHelper.toHTMLElement(value);\n            }\n            else if (ParamHelper.isString(value)) {\n                if (container !== undefined && ParamHelper.isHTMLElement(container)) {\n                    var nodes = container.querySelectorAll(ParamHelper.toString(value));\n                    if (nodes.length === 1) {\n                        this.descriptor.trigger = ParamHelper.toHTMLElement(nodes[0]);\n                    }\n                    else if (nodes.length > 1) {\n                        Logger.warning(\"[\".concat(ParallaxBuilder.NAMESPACE, \"] There are more than 1 element for trigger \\\"\").concat(value, \"\\\" in the given container. Using the first one.\"));\n                    }\n                    else {\n                        throw new Error(\"[\".concat(ParallaxBuilder.NAMESPACE, \"] Could't find an element with query \\\"\").concat(value, \"\\\" in the given container.\"));\n                    }\n                }\n                else {\n                    var nodes = document.body.querySelectorAll(ParamHelper.toString(value));\n                    if (nodes.length === 1) {\n                        this.descriptor.trigger = ParamHelper.toHTMLElement(nodes[0]);\n                    }\n                    else if (nodes.length > 1) {\n                        Logger.warning(\"[\".concat(ParallaxBuilder.NAMESPACE, \"] There are more than 1 element for trigger \\\"\").concat(value, \"\\\" in the body. Using the first one.\"));\n                    }\n                    else {\n                        throw new Error(\"[\".concat(ParallaxBuilder.NAMESPACE, \"] Could't find an element with query \\\"\").concat(value, \"\\\" in the body.\"));\n                    }\n                }\n            }\n            else {\n                throw new TypeError(\"[\".concat(ParallaxBuilder.NAMESPACE, \"] Value for \\\"trigger\\\" isn't a valid element or selector: \\\"\").concat(value, \"\\\"\"));\n            }\n        }\n        return this;\n    };\n    ParallaxBuilder.prototype.duration = function (value) {\n        if (value !== undefined) {\n            if (ParamHelper.isNumber(value)) {\n                this.descriptor.duration = ParamHelper.toInteger(value);\n            }\n            else if (ParamHelper.isPercentage(value)) {\n                this.descriptor.duration = ParamHelper.toString(value);\n            }\n            else if (ParamHelper.isFunction(value)) {\n                var durationMethod = value;\n                if (durationMethod && ParamHelper.isNumber(durationMethod())) {\n                    this.descriptor.duration = durationMethod;\n                }\n                else {\n                    throw new TypeError(\"[\".concat(ParallaxBuilder.NAMESPACE, \"] Function for \\\"duration\\\" should return a number.\"));\n                }\n            }\n            else {\n                throw new TypeError(\"[\".concat(ParallaxBuilder.NAMESPACE, \"] Value for \\\"duration\\\" isn't valid: \\\"\").concat(value, \"\\\"\"));\n            }\n        }\n        return this;\n    };\n    ParallaxBuilder.prototype.hook = function (value) {\n        if (value !== undefined) {\n            if (!ParamHelper.isNumber(value) && ParamHelper.isString(value) && !ParamHelper.isHookValue(value)) {\n                throw new TypeError(\"[\".concat(ParallaxBuilder.NAMESPACE, \"] Value for \\\"hook\\\" isn't valid: \\\"\").concat(value, \"\\\"\"));\n            }\n            else {\n                if (ParamHelper.isString(value)) {\n                    value = ParamHelper.toHookValue(value);\n                }\n                if (ParamHelper.isNumber(value)) {\n                    if (value >= 0 && value <= 1) {\n                        this.descriptor.hook = ParamHelper.toFloat(value);\n                    }\n                    else {\n                        throw new RangeError(\"[\".concat(ParallaxBuilder.NAMESPACE, \"] Value for \\\"hook\\\" should be between 0 and 1: \\\"\").concat(value, \"\\\"\"));\n                    }\n                }\n            }\n        }\n        return this;\n    };\n    ParallaxBuilder.prototype.offset = function (value) {\n        if (value !== undefined) {\n            if (ParamHelper.isNumber(value)) {\n                this.descriptor.offset = ParamHelper.toInteger(value);\n            }\n            else {\n                throw new TypeError(\"[\".concat(ParallaxBuilder.NAMESPACE, \"] Value for \\\"offset\\\" isn't a valid number: \\\"\").concat(value, \"\\\"\"));\n            }\n        }\n        return this;\n    };\n    ParallaxBuilder.prototype.indicator = function (value) {\n        if (value !== undefined) {\n            if (ParamHelper.isString(value)) {\n                this.descriptor.indicator = ParamHelper.toString(value);\n            }\n            else {\n                throw new TypeError(\"[\".concat(ParallaxBuilder.NAMESPACE, \"] Value for \\\"indicator\\\" isn't a valid string: \\\"\").concat(value, \"\\\"\"));\n            }\n        }\n        return this;\n    };\n    ParallaxBuilder.prototype.build = function () {\n        return this.descriptor;\n    };\n    ParallaxBuilder.NAMESPACE = \"ParallaxBuilder\";\n    return ParallaxBuilder;\n}());\nexport default ParallaxBuilder;\n//# sourceMappingURL=parallax.builder.js.map","import { __extends } from \"tslib\";\nimport BaseParser from \"./base.parser\";\nimport ParallaxBuilder from \"../builders/parallax.builder\";\nvar ParallaxParser = /** @class */ (function (_super) {\n    __extends(ParallaxParser, _super);\n    function ParallaxParser(breakpoints, defaultOptions) {\n        var _this = _super.call(this, breakpoints, defaultOptions) || this;\n        _this.key = \"parallax\";\n        return _this;\n    }\n    /**\n     * Parses a [data-parallax] element, transforming its [data-parallax-*] attributes into an object.\n     *\n     * @example\n     * Input:\n     * <div data-parallax data-parallax-speed=\"2\" data-parallax-enabled=\"true\"></div>\n     * Output:\n     * {\n     *   speed: 2,\n     *   enabled: true\n     * }\n     *\n     * @param {HTMLElement} - Element with [data-parallax-*] attributes\n     *\n     * @returns {ParallaxDescriptor} - Object with the parsed information\n     */\n    ParallaxParser.prototype.parse = function (el, container) {\n        var builder = new ParallaxBuilder(this.get(el, \"name\"), this.defaultOptions);\n        builder.enabled(this.get(el, \"enabled\"));\n        builder.type(this.get(el, \"type\"));\n        builder.speed(this.get(el, \"speed\"));\n        builder.momentum(this.get(el, \"momentum\"));\n        builder.stagger(this.get(el, \"stagger\"));\n        builder.ease(this.get(el, \"ease\"));\n        builder.element(el);\n        builder.trigger(this.get(el, \"trigger\"), container);\n        builder.duration(this.get(el, \"duration\"));\n        builder.hook(this.get(el, \"hook\"));\n        builder.offset(this.get(el, \"offset\"));\n        builder.indicator(this.get(el, \"indicator\"));\n        return builder.build();\n    };\n    return ParallaxParser;\n}(BaseParser));\nexport default ParallaxParser;\n//# sourceMappingURL=parallax.parser.js.map","import gsap from \"gsap\";\nimport { BreakpointListener, clear } from \"./utils\";\nimport ScrollScene from \"./scroll-scene\";\nimport ScrollController from \"./scroll-controller\";\nimport AnimationCreator from \"./creator/animation.creator\";\nimport TypeHelper from \"./helpers/type.helper\";\nimport Parser from \"./parser\";\nimport AnimationParser from \"./parsers/animation.parser\";\nimport SceneParser from \"./parsers/scene.parser\";\nimport ParallaxParser from \"./parsers/parallax.parser\";\nimport AnimationBuilder from \"./builders/animation.builder\";\nimport SceneBuilder from \"./builders/scene.builder\";\nimport ParallaxBuilder from \"./builders/parallax.builder\";\nvar ScrollXP = /** @class */ (function () {\n    function ScrollXP(options) {\n        var _this = this;\n        this.defaults = {};\n        this.registeredScenes = {};\n        this.registeredAnimations = {};\n        this.domElements = [];\n        this.tweens = [];\n        this.scenes = [];\n        this.anchorScenes = [];\n        gsap.config({\n            nullTargetWarn: false,\n        });\n        this.container = options.container || window;\n        this.content =\n            this.container instanceof Window\n                ? document.body.children[0]\n                : this.container.children[0];\n        this.scrollOffset = options.scrollOffset || 0;\n        this._smoothScrolling = options.smoothScrolling || false;\n        this.parser = new Parser(options.breakpoints);\n        // TODO: Instead of checking for xs, check for isMobile somehow (actual devices)\n        new BreakpointListener(function (result) {\n            if (result.hasChanged) {\n                // First load\n                if (!_this.controller) {\n                    _this.controller = new ScrollController({\n                        container: _this.container,\n                        smoothScrolling: _this.smoothScrolling,\n                        addIndicators: options.addIndicators || false,\n                    });\n                }\n                else {\n                    // Disable smooth scrolling on mobile\n                    if (_this.smoothScrolling) {\n                        if (result.screenSize === \"xs\") {\n                            _this.controller.smoothScrolling = false;\n                        }\n                        else {\n                            _this.controller.smoothScrolling = true;\n                        }\n                    }\n                }\n                console.debug(\"[ScrollView] Rebuiling scenes for:\", result.screenSize);\n                _this.rebuild();\n            }\n            // Update content scene duration, so the scroll progress is adjusted\n            // if (this.contentScene) {\n            //   this.contentScene.duration(this.content.offsetHeight)\n            // }\n        }, this.parser.breakpoints);\n        // Set up scrollTo anchors\n        if (options.anchors && options.anchors.length > 0) {\n            var anchors = Array.from(options.anchors).filter(function (anchor) { return anchor.hash.length > 1; });\n            this.setUpScrollTo(anchors);\n        }\n    }\n    ScrollXP.prototype.setUpScrollTo = function (anchors) {\n        var _this = this;\n        anchors.forEach(function (anchor) {\n            anchor.addEventListener(\"click\", function (e) {\n                anchors.forEach(function (anchor) { return anchor.classList.remove(\"is-active\"); });\n                if (e.currentTarget) {\n                    var currentTarget = e.currentTarget;\n                    currentTarget.classList.add(\"is-active\");\n                    var id = currentTarget.getAttribute(\"href\");\n                    if (id && id.length > 0) {\n                        e.preventDefault();\n                        _this.controller.scrollTo(id);\n                    }\n                }\n            });\n        });\n    };\n    ScrollXP.prototype.bindAnchors = function (anchors) {\n        var _this = this;\n        this.setUpScrollTo(anchors);\n        // Bind anchor to scroll scenes\n        anchors.forEach(function (anchor) {\n            var id = anchor.getAttribute(\"href\");\n            if (id) {\n                var section = _this.container instanceof Window ? document.body.querySelector(id) : _this.container.querySelector(id);\n                if (section) {\n                    var elem_1 = section;\n                    var anchorScene = new ScrollScene({\n                        triggerElement: elem_1,\n                        triggerHook: \"0.01\",\n                        offset: _this.scrollOffset,\n                        duration: function () {\n                            return elem_1.offsetHeight;\n                        },\n                    })\n                        .on(\"enter\", function () { return anchor.classList.add(\"is-active\"); })\n                        .on(\"leave\", function () { return anchor.classList.remove(\"is-active\"); });\n                    _this.anchorScenes.push(anchorScene);\n                    _this.controller.addScene(anchorScene);\n                }\n            }\n        });\n    };\n    Object.defineProperty(ScrollXP.prototype, \"smoothScrolling\", {\n        get: function () {\n            return this._smoothScrolling;\n        },\n        set: function (newValue) {\n            this.controller.smoothScrolling = newValue;\n            this.rebuild();\n        },\n        enumerable: false,\n        configurable: true\n    });\n    ScrollXP.prototype.setScrollOffset = function (offset) {\n        this.anchorScenes.forEach(function (scene) { return scene.offset(offset); });\n        this.controller.setScrollOffset(offset);\n    };\n    ScrollXP.prototype.register = function (data) {\n        var _this = this;\n        if (TypeHelper.isSceneDescriptor(data)) {\n            if (data.name === undefined) {\n                throw new Error(\"Scene is missing name, it wasn't possible to register it.\");\n            }\n            this.registeredScenes[data.name] = clear(data, \"name\");\n        }\n        else if (TypeHelper.isAnimationDescriptor(data)) {\n            if (data.name === undefined) {\n                throw new Error(\"Animation is missing name, it wasn't possible to register it.\");\n            }\n            if (data.label !== undefined) {\n                throw new Error(\"Animations can't be registered with a label, it can only be set using data-* attributes. Please, review \\\"\".concat(data.name, \"\\\".\"));\n            }\n            this.registeredAnimations[data.name] = clear(data, \"name\");\n        }\n        else if (data instanceof Array) {\n            data.forEach(function (item) { return _this.register(item); });\n        }\n    };\n    ScrollXP.prototype.setDefault = function (descriptor) {\n        if (TypeHelper.isAnimationDescriptor(descriptor)) {\n            this.defaults.animation = descriptor;\n        }\n        else if (TypeHelper.isSceneDescriptor(descriptor)) {\n            this.defaults.scene = descriptor;\n        }\n        else if (TypeHelper.isParallaxDescriptor(descriptor)) {\n            this.defaults.parallax = descriptor;\n        }\n        else {\n            throw new TypeError(\"Default value is not a valid descriptor: \".concat(descriptor));\n        }\n    };\n    ScrollXP.prototype.getRegisteredScenes = function () {\n        return this.registeredScenes;\n    };\n    ScrollXP.prototype.getRegisteredAnimations = function () {\n        return this.registeredAnimations;\n    };\n    ScrollXP.prototype.rebuild = function () {\n        var _this = this;\n        setTimeout(function () {\n            _this.resetScenes();\n            _this.buildParallaxScenes();\n            _this.buildScenes();\n        }, 0);\n    };\n    ScrollXP.prototype.buildScenes = function () {\n        var _this = this;\n        var parser = this.parser.create(SceneParser, this.defaults.scene);\n        var container = this.container instanceof Window ? document.body : this.container;\n        var elements = parser.getElements(container);\n        elements.forEach(function (element) {\n            var descriptor;\n            // Is registered scene?\n            var name = parser.getName(element);\n            if (name) {\n                // Creates a new parser, so the result is the following composition of descriptors:\n                // Default <- Registered <- Parsed\n                if (name in _this.registeredScenes) {\n                    var newParser = _this.parser.create(SceneParser, _this.registeredScenes[name]);\n                    descriptor = newParser.parse(element, container);\n                }\n                else {\n                    throw new Error(\"Couldn't find scene \\\"\".concat(name, \"\\\". Make sure it's registered.\"));\n                }\n            }\n            else {\n                // Parses the element, so the result is the following composition of descriptors:\n                // Default <- Parsed\n                descriptor = parser.parse(element, container);\n            }\n            if (descriptor.enabled) {\n                var scene_1 = new ScrollScene({\n                    triggerElement: descriptor.trigger || element,\n                    triggerHook: descriptor.hook,\n                    duration: descriptor.duration,\n                    reverse: descriptor.reverse,\n                });\n                // Add indicators?\n                if (descriptor.indicator) {\n                    scene_1.addIndicators({ name: descriptor.indicator });\n                }\n                // onEnter callback\n                if (descriptor.onEnter) {\n                    scene_1.on(\"enter\", function (vars) {\n                        if (descriptor.onEnter) {\n                            descriptor.onEnter(element, scene_1, vars);\n                        }\n                    });\n                }\n                // onLeave callback\n                if (descriptor.onLeave) {\n                    scene_1.on(\"leave\", function (vars) {\n                        if (descriptor.onLeave) {\n                            descriptor.onLeave(element, scene_1, vars);\n                        }\n                    });\n                }\n                // onProgress callback\n                if (descriptor.onProgress) {\n                    scene_1.on(\"progress\", function (vars) {\n                        if (descriptor.onProgress) {\n                            descriptor.onProgress(element, scene_1, vars);\n                        }\n                    });\n                }\n                // 1. Has class toggle?\n                if (descriptor.classToggle) {\n                    scene_1.setClassToggle(element, descriptor.classToggle);\n                }\n                // 2. Is pinned?\n                else if (descriptor.pin) {\n                    scene_1.setPin(element);\n                }\n                // 3. Parse animations\n                else {\n                    _this.createAnimation(scene_1, element);\n                }\n                _this.controller.addScene(scene_1);\n                _this.scenes.push(scene_1);\n            }\n        });\n    };\n    ScrollXP.prototype.createAnimation = function (scene, domScene) {\n        var _this = this;\n        var creator = new AnimationCreator();\n        var parser = this.parser.create(AnimationParser, this.defaults.animation);\n        var easing = false;\n        var elements = parser.getElements(domScene);\n        elements.forEach(function (element) {\n            var descriptor;\n            // Is registered animation?\n            var name = parser.getName(element);\n            if (name) {\n                // Creates a new parser, so the result is the following composition of descriptors:\n                // Default <- Registered <- Parsed\n                if (name in _this.registeredAnimations) {\n                    var newParser = _this.parser.create(AnimationParser, _this.registeredAnimations[name]);\n                    descriptor = newParser.parse(element);\n                }\n                else {\n                    throw new Error(\"Couldn't find animation \\\"\".concat(name, \"\\\". Make sure it's registered.\"));\n                }\n            }\n            else {\n                // Parses the element, so the result is the following composition of descriptors:\n                // Default <- Parsed\n                descriptor = parser.parse(element);\n            }\n            // Sets flag to render scene properly\n            if (descriptor.momentum > 0) {\n                easing = true;\n            }\n            // Adds the animated elements to the elements array\n            if (descriptor.stagger) {\n                for (var i = 0; i < element.children.length; i++) {\n                    _this.domElements.push(element.children[i]);\n                }\n            }\n            else {\n                _this.domElements.push(element);\n            }\n            creator.add(element, descriptor);\n        });\n        var tween = creator.create();\n        scene.setTween(tween, easing);\n        this.tweens.push(tween);\n    };\n    ScrollXP.prototype.buildParallaxScenes = function () {\n        var _this = this;\n        var parser = this.parser.create(ParallaxParser, this.defaults.parallax);\n        var container = this.container instanceof Window ? document.body : this.container;\n        var elements = parser.getElements(container);\n        var globalDescriptors = [];\n        elements.forEach(function (element) {\n            var descriptor = parser.parse(element, container);\n            if (descriptor.enabled) {\n                // Global parallax\n                if (descriptor.type === \"global\") {\n                    globalDescriptors.push(descriptor);\n                    if (globalDescriptors.length === 1) {\n                        var scene = new ScrollScene({\n                            triggerElement: _this.content,\n                            triggerHook: \"onLeave\",\n                            duration: _this.content.offsetHeight,\n                        }).on(\"update\", function () {\n                            _this.updateParallaxElements(globalDescriptors, _this.controller.getScrollPos());\n                        });\n                        _this.scenes.push(scene);\n                        _this.controller.addScene(scene);\n                    }\n                }\n                // Scene parallax\n                else {\n                    var during_1 = false;\n                    var scene = new ScrollScene({\n                        triggerElement: descriptor.trigger,\n                        triggerHook: descriptor.hook,\n                        duration: descriptor.duration,\n                        offset: descriptor.offset,\n                    })\n                        .on(\"update\", function (e) {\n                        var _a, _b;\n                        if (during_1 && ((_a = e === null || e === void 0 ? void 0 : e.vars) === null || _a === void 0 ? void 0 : _a.scrollPos) && ((_b = e === null || e === void 0 ? void 0 : e.vars) === null || _b === void 0 ? void 0 : _b.startPos)) {\n                            var delta = e.vars.scrollPos - e.vars.startPos;\n                            _this.updateParallaxElements(descriptor, delta);\n                        }\n                    })\n                        .on(\"enter\", function () { return (during_1 = true); })\n                        .on(\"leave\", function () { return (during_1 = false); });\n                    if (descriptor.indicator) {\n                        scene.addIndicators({ name: descriptor.indicator });\n                    }\n                    _this.scenes.push(scene);\n                    _this.controller.addScene(scene);\n                }\n            }\n            else {\n                // In the case the parallax was disabled for this element, clear all styles\n                gsap.set(element, { clearProps: \"all\" });\n            }\n        });\n    };\n    ScrollXP.prototype.updateParallaxElements = function (data, offsetY) {\n        var _this = this;\n        if (data instanceof Array) {\n            data.forEach(function (descriptor) { return _this.updateParallaxElements(descriptor, offsetY); });\n        }\n        else if (data.element) {\n            if (data.stagger) {\n                gsap.to(data.element.children, {\n                    duration: data.momentum,\n                    y: offsetY / data.speed,\n                    stagger: {\n                        ease: data.ease,\n                        each: data.stagger,\n                    },\n                });\n            }\n            else {\n                if (data.momentum > 0) {\n                    gsap.to(data.element, data.momentum, {\n                        y: offsetY / data.speed,\n                        ease: data.ease,\n                    });\n                }\n                else {\n                    gsap.set(data.element, {\n                        y: offsetY / data.speed,\n                    });\n                }\n            }\n        }\n    };\n    ScrollXP.prototype.resetScenes = function () {\n        var _this = this;\n        this.tweens.forEach(function (tween) { return tween.clear(); });\n        this.scenes.forEach(function (scene) {\n            scene.removePin(true);\n            _this.controller.removeScene(scene);\n        });\n        gsap.set(this.domElements, {\n            clearProps: \"all\",\n        });\n        this.tweens = [];\n        this.scenes = [];\n        this.domElements = [];\n    };\n    ScrollXP.version = typeof \"2.1.2\" !== \"undefined\" ? \"2.1.2\" : \"test\";\n    ScrollXP.Animation = AnimationBuilder;\n    ScrollXP.Scene = SceneBuilder;\n    ScrollXP.Parallax = ParallaxBuilder;\n    return ScrollXP;\n}());\nexport default ScrollXP;\n//# sourceMappingURL=index.js.map","'use strict';\n// TODO: Remove from `core-js@4`\nvar $ = require('../internals/export');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar create = require('../internals/object-create');\n\n// `Object.create` method\n// https://tc39.es/ecma262/#sec-object.create\n$({ target: 'Object', stat: true, sham: !DESCRIPTORS }, {\n  create: create\n});\n"],"names":["isCallable","module","exports","it","__esModule","obj","_namespace","_types","_setPrototypeOf","o","p","Object","setPrototypeOf","__proto__","Tag","_Namespace","subClass","superClass","opts","_this","call","this","type","TAG","prototype","create","constructor","default","aCallable","anObject","tryToString","getIteratorMethod","$TypeError","TypeError","argument","usingIterator","iteratorMethod","arguments","length","defineProperty","value","target","all","name","enumerable","get","_export","parseColor","formatColor","_colorNames","_interop_require_default","HEX","SHORT_HEX","VALUE","SEP","ALPHA_SEP","CUSTOM_PROPERTY","RGB","RegExp","source","HSL","loose","_match_","_match__toString","trim","mode","color","alpha","map","v","toString","hex","replace","_","r","g","b","a","join","match","parseInt","undefined","_value_match","filter","Boolean","startsWith","some","part","test","hasAlpha","$","$find","addToUnscopables","FIND","SKIPS_HOLES","Array","proto","forced","find","callbackfn","HASH_UNDEFINED","MAX_SAFE_INTEGER","argsTag","funcTag","objectTag","reIsHostCtor","reIsUint","typedArrayTags","uid","func","transform","freeGlobal","freeSelf","self","root","Function","freeExports","nodeType","freeModule","moduleExports","freeProcess","process","nodeUtil","require","types","binding","e","nodeIsTypedArray","isTypedArray","arrayProto","funcProto","objectProto","coreJsData","funcToString","hasOwnProperty","maskSrcKey","exec","keys","IE_PROTO","nativeObjectToString","objectCtorString","reIsNative","Buffer","Symbol","Uint8Array","getPrototype","allocUnsafe","getPrototypeOf","arg","objectCreate","propertyIsEnumerable","splice","symToStringTag","toStringTag","getNative","nativeIsBuffer","isBuffer","nativeMax","Math","max","nativeNow","Date","now","Map","nativeCreate","baseCreate","object","isObject","result","Hash","entries","index","clear","entry","set","ListCache","MapCache","Stack","data","__data__","size","assignMergeValue","key","eq","baseAssignValue","assignValue","objValue","assocIndexOf","array","has","pop","push","getMapData","pairs","LARGE_ARRAY_SIZE","baseGetTag","isOwn","tag","unmasked","getRawTag","objectToString","baseIsArguments","isObjectLike","baseMerge","srcIndex","customizer","stack","iteratee","keysFunc","iterable","props","baseFor","srcValue","mergeFunc","safeGet","stacked","typedArray","buffer","arrayBuffer","newValue","isCommon","isArr","isArray","isBuff","isTyped","isArrayLike","copyArray","slice","cloneBuffer","byteLength","byteOffset","Ctor","isPlainObject","isArguments","isNew","copyObject","keysIn","toPlainObject","isFunction","isPrototype","initCloneObject","baseMergeDeep","baseSetToString","string","identity","getValue","isMasked","toSource","baseIsNative","isIndex","setToString","count","lastCalled","stamp","remaining","apply","shortOut","other","isLength","baseUnary","inherited","isArg","isType","skipIndexes","n","baseTimes","String","arrayLikeKeys","nativeKeysIn","isProto","baseKeysIn","assigner","merge","start","args","otherArgs","thisArg","overRest","baseRest","sources","guard","isIterateeCall","t","parseFloat","round","Number","EPSILON","Element","offsetParent","scrollHeight","clientHeight","i","window","getComputedStyle","overflowY","indexOf","s","document","body","parentElement","DOMParser","parseFromString","childElementCount","createElement","firstChild","appendChild","split","forEach","classList","toggle","configurable","writable","nativePointer","pageX","pageY","clientX","clientY","id","Touch","identifier","time","passive","l","move","end","element","startCallback","moveCallback","endCallback","bind","addEventListener","onPointerStart","onTouchStart","onMove","onTouchEnd","buttons","button","currentPointers","triggerPointerStart","onPointerEnd","onWindowBlur","from","changedTouches","findIndex","triggerPointerEnd","removeEventListener","startPointers","Event","bubbles","cancelable","stop","c","sqrt","pow","h","d","u","assign","reduce","f","setOptions","getOwnPropertyNames","options","defaults","option","on","optionFor","isNaN","cn","classes","localize","toLowerCase","substring","events","includes","off","emit","super","attachPlugins","plugins","detach","attach","detachPlugins","m","Init","Error","Ready","Panning","Mousemove","Destroy","PANUP","PANDOWN","PANLEFT","PANRIGHT","ZOOMIN","ZOOMOUT","TOGGLEZOOM","TOGGLE1TO1","ITERATEZOOM","ROTATECCW","ROTATECW","FLIPX","FLIPY","FITX","FITY","RESET","TOGGLEFS","y","content","width","height","panMode","touch","dragMinThreshold","lockAxis","mouseMoveFactor","mouseMoveFriction","zoom","pinchToZoom","panOnlyZoomed","minScale","maxScale","friction","dragFriction","decelFriction","click","dblClick","wheel","wheelLimit","spinner","bounds","infinite","rubberband","bounce","maxVelocity","transformParent","isLoading","canZoomIn","canZoomOut","isDraggable","isDragging","inFullscreen","htmlHasFullscreen","l10n","w","x","E","S","remove","P","add","C","M","O","A","L","z","R","k","I","fits","contentRect","fitWidth","fitHeight","isTouchDevice","matchMedia","matches","isMobile","navigator","userAgent","isInfinite","angle","atan2","current","PI","targetAngle","scale","targetScale","fullScale","fullWidth","coverScale","containerRect","min","isScaling","abs","isResting","isContentLoading","HTMLImageElement","complete","isBouncingX","isBouncingY","ignoreBounds","checkBounds","inBounds","innerWidth","innerHeight","top","right","bottom","left","fullHeight","container","initContent","Plugins","onLoad","onError","contains","HTMLPictureElement","insertBefore","queueMicrotask","enable","querySelector","firstElementChild","state","updateMetrics","detachEvents","getNextScale","sort","attachObserver","getBoundingClientRect","resizeObserver","ResizeObserver","updateTimer","onResize","setTimeout","clearTimeout","observe","detachObserver","disconnect","attachEvents","onClick","capture","onWheel","pointerTracker","onPointerDown","onPointerMove","onPointerUp","onMouseMove","onKeydown","clickTimer","animate","setTargetForce","velocity","setTransform","setEdgeForce","rAF","requestAnimationFrame","getBounds","xDiff","yDiff","clampTargetBounds","calculateContentDim","maxWidth","maxHeight","getMatrix","DOMPoint","matrixTransform","contentWidth","contentHeight","DOMMatrixReadOnly","detail","dragOffset","trackingPoints","startDecelAnim","defaultPrevented","hasAttribute","preventDefault","stopPropagation","getSelection","closest","dataset","panzoomChange","panzoomAction","JSON","parse","console","warn","applyChange","dragStart","event","clicks","addTrackingPoint","pwt","composedPath","nodeName","removeAllRanges","lockedAxis","originX","originY","panX","panY","cancelAnimationFrame","isTicking","visualViewport","deltaX","deltaY","zoomWithWheel","panWithMouse","toggleFS","requestTick","style","paddingTop","paddingBottom","paddingLeft","paddingRight","naturalWidth","SVGElement","baseVal","offsetWidth","scrollWidth","naturalHeight","offsetHeight","getAttribute","setProperty","T","cssText","zoomTo","updateControls","calculateBounds","querySelectorAll","display","removeAttribute","setAttribute","panTo","flipX","flipY","DOMMatrix","translate","multiply","rotate","pmme","cwd","zoomIn","zoomOut","zoomToFit","zoomToCover","zoomToFull","zoomToMax","toggleZoom","toggleMax","toggleCover","iterateZoom","rotateCCW","rotateCW","fitX","fitY","documentElement","reset","destroy","values","D","F","childNodes","Node","ELEMENT_NODE","B","H","HTMLElement","html","thumb","thumbSrc","thumbEl","thumbElSrc","src","el","isDom","class","customClass","dim","gap","pos","transition","N","slides","W","onRefresh","refresh","build","list","instance","pages","cleanup","isDynamic","children","append","createItem","page","previousElementSibling","nextElementSibling","hasDots","dot","isBeforePrev","isPrev","isCurrent","isNext","isAfterNext","dotTpl","dynamicFrom","maxCount","minCount","X","q","Y","V","prev","next","addBtn","toUpperCase","isRTL","innerHTML","charAt","nextTpl","prevTpl","Z","addAsTargetFor","nav","addAsNavFor","initialSlide","initialPage","onNavReady","onTargetReady","onNavCreateSlide","onNavClick","onNavTouch","onTargetChange","panzoom","getPageForSlide","slideTo","Sync","markSelectedSlide","selectedIndex","prevPage","U","Navigation","Dots","G","K","J","Q","axis","isHorizontal","isEnabled","contentDim","viewportDim","Set","slideNext","slidePrev","userOptions","userPlugins","processOptions","breakpoints","bp","init","initLayout","initSlides","setInitialPosition","initPanzoom","isLTR","isVertical","viewport","slide","prepend","onScroll","track","setInitialPage","setViewportHeight","onDecel","onBeforeTransform","onEndAnimation","onSlideTo","createPages","processPages","getPageFromIndex","getSlideMetrics","parentNode","visibility","boxSizing","removeChild","repositionSlides","inTransition","createSlideEl","nextSibling","removeSlideEl","CustomEvent","dispatchEvent","transitionTo","clearTransitions","onAnimationEnd","onChange","manageSlideVisiblity","getVisibleSlides","lazyLoadSlide","markSelectedSlides","flipInfiniteTrack","lazyLoadImg","lazySrcset","lazySrc","backgroundImage","animationName","delete","setPageFromPosition","pageIndex","getPageFromPosition","carouselPage","carouselNext","carouselPrev","scroll","lp","reInit","floor","slideToClosest","addSlide","prependSlide","appendSlide","removeSlide","getProgress","replaceWith","enabled","preload","slidesPerPage","Panzoom","center","fill","dragFree","adaptiveHeight","direction","isSelected","NEXT","PREV","GOTO","tt","scrollY","et","nt","st","focus","preventScroll","scrollTop","scrollX","scrollLeft","scrollTo","behavior","ot","fullscreenEnabled","webkitFullscreenEnabled","request","ALLOW_KEYBOARD_INPUT","exit","isFullscreen","at","animated","autoFocus","backdropClick","Carousel","closeButton","closeExisting","commonCaption","compact","contentClick","contentDblClick","defaultType","defaultDisplay","dragToClose","Fullscreen","autoStart","groupAll","groupAttr","hideClass","hideScrollbar","idle","keyboard","Escape","Delete","Backspace","PageUp","PageDown","ArrowUp","ArrowDown","ArrowRight","ArrowLeft","CLOSE","MODAL","ERROR","IMAGE_ERROR","ELEMENT_NOT_FOUND","AJAX_NOT_FOUND","AJAX_FORBIDDEN","IFRAME_ERROR","TOGGLE_ZOOM","TOGGLE_THUMBS","TOGGLE_SLIDESHOW","TOGGLE_FULLSCREEN","DOWNLOAD","parentEl","placeFocusBack","showClass","startIndex","tpl","main","trapFocus","rt","lt","Closing","CustomClosing","Loading","Opening","ct","ht","dt","ut","pt","Oe","getInstance","carousel","getSlide","slug","triggerEl","fancybox","hash","ft","URL","gt","mt","jumpTo","close","vt","bt","readyState","yt","wt","onCreateSlide","setImage","onRemoveSlide","imageEl","onClose","contentEl","getZoomInfo","position","offsetTop","offsetLeft","overflow","opacity","then","isClosing","isOpeningSlide","Promise","Image","onload","onerror","hideLoading","done","revealContent","prevMouseMoveEvent","setError","clearContent","showLoading","caption","alt","draggable","srcset","fetchPriority","sizes","setContent","isCompact","ready","error","getPropertyValue","initialSize","protected","zoomOpacity","SuppressedError","xt","Et","St","Pt","Ct","Tt","Mt","URLSearchParams","search","At","Lt","onBeforeInitSlide","processType","onClearContent","xhr","abort","iframeEl","placeholderEl","onSelectSlide","playVideo","onUnselectSlide","pause","method","contentWindow","postMessage","stringify","poller","onDone","isCurrentSlide","resizeIframe","setAspectRatio","onMessage","origin","getElementsByClassName","HTMLIFrameElement","getElementById","loadAjaxContent","XMLHttpRequest","onreadystatechange","DONE","status","responseText","ajax","open","setRequestHeader","send","setInlineContent","cloneNode","setIframeContent","className","autoSize","getElementsByTagName","flex","play","catch","muted","nocookie","getOwnPropertySymbols","encodeURIComponent","videoId","videoFormat","poster","aspectRatio","iframeAttr","allow","scrolling","videoAutoplay","videoRatio","videoTpl","vimeo","byline","controls","dnt","youtube","enablejsapi","rel","fs","zt","Rt","kt","It","isActive","onReady","removeProgressBar","onSettle","resume","onVisibilityChange","visibilityState","onMouseEnter","inHover","onMouseLeave","onTimerEnd","progressBar","createProgressBar","timer","transitionDuration","pauseOnHover","progressParentEl","showProgress","timeout","Dt","onPrepare","Autoplay","endIdle","ref","activeElement","playOnStart","Ft","hasThumbs","thumbTpl","jt","Hidden","Bt","Ht","Nt","_t","$t","isModern","onInitSlide","thumbHeight","onInitSlides","thumbGap","shiftModern","updateProps","resizeModernSlide","isDisabled","getThumb","getSlides","thumbExtraGap","after","setProps","carouselIndex","elementFromPoint","getShift","Wt","showOnStart","Xt","qt","Yt","isHidden","hidden","onInit","footer","hide","show","createSlide","Thumbs","Vt","panLeft","icon","change","panRight","panUp","panDown","action","toggle1to1","Zt","Disabled","Gt","tabindex","viewBox","xmlns","Kt","Jt","Qt","middle","createEl","createContainer","fancyboxToggleThumbs","fancyboxToggleFullscreen","toggleFullscreen","fancyboxToggleSlideshow","downloadSrc","removeContainer","absolute","items","infobar","download","slideshow","fullscreen","thumbs","te","history","title","location","pathname","back","replaceState","parseURL","startFromUrl","Html","Images","Slideshow","Toolbar","ee","ie","ne","se","oe","ae","re","le","ce","he","de","ue","pe","fe","ge","me","ve","be","ye","we","xe","Ee","Se","Pe","Ce","Te","Me","isIdle","userSlides","marginRight","initCarousel","startedFs","manageCaption","idleTimer","setIdle","checkFocus","downloadFilename","onMousemove","onFocus","resetIdle","toggleIdle","blur","isTopmost","isContentEditable","ctrlKey","altKey","shiftKey","clearIdle","manageCloseBtn","closeBtnEl","captionEl","fancyboxCaption","ignoreFocusChange","origTabindex","tabIndex","lastFocus","currentTarget","spinnerEl","proceedClose","resolve","pointerEvents","openers","fromEvent","unbind","metaKey","fancyboxTrigger","fancyboxIndex","reverse","delegate","fromNodes","fromSelector","currentSrc","_node","cache","_getRequireWildcardCache","newObj","hasPropertyDescriptor","getOwnPropertyDescriptor","desc","_interopRequireWildcard","WeakMap","_arrayLikeToArray","arr","len","arr2","_defineProperties","descriptor","Container","_Node","nodes","Constructor","protoProps","_proto","selector","parent","unshift","child","indexes","removeAll","_step","_iterator","allowArrayLike","iterator","minLen","_unsupportedIterableToArray","_createForOfIteratorHelperLoose","empty","insertAfter","oldNode","newNode","oldIndex","_findChildAtPosition","line","col","found","each","node","atPosition","foundChild","isAtPosition","_inferEndPosition","last","callback","lastEach","walk","walkAttributes","_this2","ATTRIBUTE","walkClasses","_this3","CLASS","walkCombinators","_this4","COMBINATOR","walkComments","_this5","COMMENT","walkIds","_this6","ID","walkNesting","_this7","NESTING","walkPseudos","_this8","PSEUDO","walkTags","_this9","walkUniversals","_this10","UNIVERSAL","_this11","memo","every","$forEach","STRICT_METHOD","arrayMethodIsStrict","getBuiltIn","IS_PURE","NativePromiseConstructor","FORCED_PROMISE_CONSTRUCTOR","promiseResolve","PromiseConstructorWrapper","CHECK_WRAPPER","stat","uncurryThis","fails","hasOwn","DESCRIPTORS","CONFIGURABLE_FUNCTION_NAME","inspectSource","InternalStateModule","enforceInternalState","enforce","getInternalState","$String","stringSlice","CONFIGURABLE_LENGTH","TEMPLATE","makeBuiltIn","getter","setter","arity","_cssesc","_interopRequireDefault","_util","ClassName","_constructed","valueToString","_value","escaped","isIdentifier","ensureObject","raws","classof","toIndexedObject","$getOwnPropertyNames","arraySlice","windowNames","getWindowNames","FunctionPrototype","getDescriptor","EXISTS","PROPER","CONFIGURABLE","_parser","Processor","funcRes","_shouldUpdateSelector","rule","updateSelector","_isLossy","lossless","_root","_parseOptions","lossy","_run","reject","_runSync","ast","astSync","transformSync","processSync","createPlugin","plugin","config","handler","_default","withOptions","pluginFunction","configFunction","optionsFunction","__options","__isOptionsFunction","__pluginFunction","__configFunction","Internal","OwnPromiseCapability","PromiseWrapper","nativeThen","IS_NODE","globalThis","path","defineBuiltIn","setToStringTag","setSpecies","anInstance","speciesConstructor","task","microtask","hostReportErrors","perform","Queue","PromiseConstructorDetection","newPromiseCapabilityModule","PROMISE","CONSTRUCTOR","NATIVE_PROMISE_REJECTION_EVENT","REJECTION_EVENT","NATIVE_PROMISE_SUBCLASSING","SUBCLASSING","getInternalPromiseState","getterFor","setInternalState","NativePromisePrototype","PromiseConstructor","PromisePrototype","newPromiseCapability","newGenericPromiseCapability","DISPATCH_EVENT","createEvent","UNHANDLED_REJECTION","isThenable","callReaction","reaction","exited","ok","fail","domain","rejection","onHandleUnhandled","enter","promise","notify","isReject","notified","reactions","onUnhandled","reason","initEvent","facade","isUnhandled","fn","unwrap","internalReject","internalResolve","wrapper","executor","onFulfilled","onRejected","that","unsafe","global","wrap","record","ITERATOR_INSTEAD_OF_RECORD","step","updateAllClasses","asValue","parseColorFormat","asColor","asLookupValue","typeMap","coerceValue","getMatchingTypes","_escapeCommas","_withAlphaVariable","_dataTypes","_negateValue","_validateFormalSyntax","_featureFlags","selectors","updateClass","sel","resolveArbitraryValue","modifier","validate","isArbitraryValue","normalize","_options_values","supportsNegativeValues","lookup","positiveValue","resolved","asNegativeValue","input","endsWith","splitUtilityModifier","slashIdx","lastIndexOf","arbitraryStartIdx","arbitraryEndIdx","oldValue","opacityValue","unwrapArbitraryModifier","tailwindConfig","_options_values1","_options_values2","_tailwindConfig_theme","_tailwindConfig_theme_opacity","_options_values_color","normalizedColor","withAlphaValue","theme","guess","any","url","image","percentage","genericName","familyName","number","lineWidth","absoluteSize","relativeSize","shadow","backgroundSize","supportedTypes","arbitraryValue","explicitType","idx","splitAtFirst","rawModifier","modifiersEnabled","flagEnabled","utilityModifier","modifiers","_options_modifiers","_options_modifiers_utilityModifier","configValue","wrappedWellKnownSymbolModule","NAME","toLength","$repeat","requireObjectCoercible","repeat","ceil","createMethod","IS_END","$this","maxLength","fillString","fillLen","stringFiller","intMaxLength","stringLength","fillStr","checkCorrectnessOfIteration","NATIVE_BIND","$Function","concat","factories","Prototype","partArgs","boundFunction","argsLength","construct","Comment","wellKnownSymbol","V8_VERSION","SPECIES","METHOD_NAME","foo","isPrototypeOf","normalizeConfig","_log","_interop_require_wildcard","nodeInterop","cacheBabelInterop","cacheNodeInterop","_config_prefix","purge","raw","extension","files","extract","relative","safelist","_purge_options","blocklist","item","prefix","_config_purge","_config_content","_config_purge1","_config_purge_extract","DEFAULT","_config_content1","_config_content_extract","_config_purge2","_config_purge_options","extractors","_config_content2","_config_content_options","defaultExtractor","extensions","extractor","_config_purge_transform","_config_content_transform","transformers","file","TO_STRING_TAG","STATIC","PROPER_FUNCTION_NAME","whitespaces","castArray","styles","commonTrailingPseudos","computed","inWhere","prefixedNot","selectorPrefix","trailingPseudo","rebuiltSelector","configToCss","fromEntries","css","addVariant","addComponents","typography","toObject","toPrimitive","NaN","toJSON","toISOString","pv","isFinite","trunc","USE_SYMBOL_AS_UID","$Object","$Symbol","MATCH","isRegExp","aConstructor","nativeConstruct","ObjectPrototype","NEW_TARGET_BUG","ARGS_BUG","FORCED","sham","Target","newTarget","$args","getMethod","isNullOrUndefined","Iterators","ITERATOR","nativeGetPrototypeOf","CORRECT_PROTOTYPE_GETTER","isDataDescriptor","getOwnPropertyDescriptorModule","propertyKey","receiver","isForced","ENVIRONMENT","PromiseRejectionEvent","PROMISE_CONSTRUCTOR_SOURCE","GLOBAL_CORE_JS_PROMISE","FakePromise","IndexedObject","lengthOfArrayLike","REDUCE_EMPTY","IS_RIGHT","argumentsLength","matchesSelector","utils","prop","num","div","makeArray","removeFrom","ary","getParent","elem","getQueryElement","handleEvent","filterFindElements","elems","ffElems","childElems","debounceMethod","_class","methodName","threshold","timeoutName","docReady","toDashed","str","$1","$2","htmlInit","WidgetClass","namespace","dashedNamespace","dataAttr","dataAttrElems","jsDashElems","dataOptionsAttr","jQuery","attr","factory","_container","Pseudo","_Container","params","rawSpaceBefore","stringifyProperty","rawSpaceAfter","regExpFlagsDetection","regExpFlagsGetterImplementation","RegExpPrototype","correct","flags","colors","toFixed","rem","px","em","base","hexToRgb","defaultModifiers","sm","fontSize","lineHeight","marginTop","marginBottom","blockquote","paddingInlineStart","h1","h2","h3","h4","img","picture","video","kbd","borderRadius","paddingInlineEnd","code","pre","ol","ul","li","dl","dd","hr","table","figure","figcaption","lg","xl","slate","white","gray","zinc","neutral","stone","red","orange","amber","yellow","lime","green","emerald","teal","cyan","sky","blue","indigo","violet","purple","fuchsia","pink","rose","invert","textDecoration","fontWeight","strong","listStyleType","borderColor","borderTopWidth","fontStyle","borderInlineStartWidth","borderInlineStartColor","quotes","fontFamily","boxShadow","backgroundColor","overflowX","borderWidth","padding","tableLayout","thead","borderBottomWidth","borderBottomColor","verticalAlign","tfoot","borderTopColor","textAlign","Source","internalObjectKeys","enumBugKeys","FunctionName","createIteratorConstructor","createNonEnumerableProperty","IteratorsCore","IteratorPrototype","BUGGY_SAFARI_ITERATORS","KEYS","VALUES","ENTRIES","returnThis","Iterable","IteratorConstructor","IS_SET","CurrentIteratorPrototype","methods","KEY","getIterationMethod","KIND","defaultIterator","IterablePrototype","INCORRECT_VALUES_NAME","nativeIterator","anyNativeIterator","splitAtTopLevelOnly","separator","parts","lastPos","isEscaped","char","NATIVE_WEAK_MAP","shared","sharedKey","hiddenKeys","OBJECT_ALREADY_INITIALIZED","store","metadata","STATE","TYPE","valueOf","ownKeys","createProperty","getOwnPropertyDescriptors","NATIVE_SYMBOL","keyFor","universal","pseudo","nesting","comment","combinator","attribute","_attribute","_className","_combinator","_comment","_id","_nesting","_pseudo","_selector","_string","_tag","_universal","notARegExp","correctIsRegExpLogic","CORRECT_IS_REGEXP_LOGIC","searchString","_len","_key","shift","regexp","error1","error2","arraySpeciesConstructor","originalArray","capability","capabilityReject","getStyleSize","logError","message","measurements","measurementsLength","getStyle","isBoxSizeOuter","isSetup","getSize","borderStyle","setup","outerWidth","outerHeight","getZeroSize","isBorderBox","measurement","paddingWidth","paddingHeight","marginWidth","marginLeft","marginHeight","borderLeftWidth","borderRightWidth","borderHeight","isBorderBoxSizeOuter","styleWidth","styleHeight","presets","darkMode","accentColor","auto","animation","none","spin","ping","pulse","aria","busy","checked","disabled","expanded","pressed","readonly","required","selected","square","backdropBlur","backdropBrightness","backdropContrast","backdropGrayscale","backdropHueRotate","backdropInvert","backdropOpacity","backdropSaturate","backdropSepia","backgroundOpacity","backgroundPosition","cover","contain","md","borderOpacity","full","borderSpacing","inner","boxShadowColor","brightness","caretColor","inherit","transparent","black","columns","xs","contrast","cursor","pointer","wait","text","help","progress","cell","crosshair","alias","copy","grab","grabbing","divideColor","divideOpacity","divideWidth","dropShadow","initial","flexBasis","flexGrow","flexShrink","sans","serif","mono","thin","extralight","light","normal","medium","semibold","bold","extrabold","gradientColorStops","gradientColorStopPositions","grayscale","gridAutoColumns","fr","gridAutoRows","gridColumn","gridColumnEnd","gridColumnStart","gridRow","gridRowEnd","gridRowStart","gridTemplateColumns","subgrid","gridTemplateRows","screen","svh","lvh","dvh","fit","hueRotate","inset","keyframes","to","animationTimingFunction","letterSpacing","tighter","tight","wide","wider","widest","snug","relaxed","disc","decimal","listStyleImage","margin","lineClamp","prose","minHeight","minWidth","objectPosition","order","first","outlineColor","outlineOffset","outlineWidth","placeholderColor","placeholderOpacity","ringColor","ringOffsetColor","ringOffsetWidth","ringOpacity","ringWidth","saturate","screens","scrollMargin","scrollPadding","sepia","skew","space","spacing","stroke","strokeWidth","supports","textColor","textDecorationColor","textDecorationThickness","textIndent","textOpacity","textUnderlineOffset","transformOrigin","transitionDelay","transitionProperty","transitionTimingFunction","linear","in","out","svw","lvw","dvw","willChange","contents","zIndex","NATIVE_SYMBOL_REGISTRY","StringToSymbolRegistry","SymbolToStringRegistry","symbol","union","setMethodGetKeysBeforeCloning","real","setMethodAcceptSetLike","stringIndexOf","gsap","_coreInitted","_window","_docEl","_body","_toArray","_config","ScrollTrigger","_windowExists","_getGSAP","registerPlugin","_isString","_isFunction","_max","client","_buildGetter","pageXOffset","_getOffset","rect","isRoot","cRect","clientTop","pageYOffset","clientLeft","offsets","_parseVal","currentVal","offset","substr","_initCore","toArray","autoKillThreshold","ScrollToPlugin","version","rawVars","register","core","tween","targets","snapType","getProperty","isWin","_clean","vars","autoKill","getX","getY","xPrev","yPrev","globals","scrollBehavior","snap","snapInline","scrollSnapType","offsetX","_props","skipX","offsetY","skipY","render","ratio","yDif","xDif","_pt","_next","kill","onAutoKill","onAutoKillParams","removeProperty","update","property","both","getOffset","buildGetter","fixRegExpWellKnownSymbolLogic","advanceStringIndex","getRegExpFlags","regExpExec","nativeMatch","maybeCallNative","matcher","rx","res","fullUnicode","lastIndex","matchStr","names","ROOT","SELECTOR","STRING","safeGetBuiltIn","macrotask","IS_IOS","IS_IOS_PEBBLE","IS_WEBOS_WEBKIT","MutationObserver","WebKitMutationObserver","queue","flush","head","nextTick","createTextNode","characterData","unescapeValue","_CSSESC_QUOTE_OPTIONS","_unesc","deprecate","WRAPPED_IN_QUOTES","warnOfDeprecatedValueAssignment","warnOfDeprecatedQuotedAssignment","warnOfDeprecatedConstructor","deprecatedUsage","quoteMark","unescaped","Attribute","_unescapeValue","handleDeprecatedContructorOpts","getQuotedValue","_determineQuoteMark","cssescopts","CSSESC_QUOTE_OPTIONS","smart","smartQuoteMark","preferredQuoteMark","setValue","_quoteMark","_syncRawValue","numSingleQuotes","numDoubleQuotes","NO_QUOTE","pref","quote","DOUBLE_QUOTE","SINGLE_QUOTE","preferCurrentQuoteMark","rawValue","_handleEscapes","_spacesFor","spaces","rawSpaces","before","_stringFor","spaceName","defaultAttrConcat","attrSpaces","offsetOf","attributeSpaces","namespaceString","operatorSpaces","operator","valueSpaces","insensitive","attrValue","quoted","qm","qualifiedName","_unescapeValue2","$filter","arrayMethodHasSpeciesSupport","FUNCTION_NAME_EXISTS","defineBuiltInAccessor","functionToString","nameRE","issueFlagNotices","_picocolors","optimizeUniversalDefaults","generalizedModifiers","disableColorOpacityUtilitiesByDefault","relativeContentPathsByDefault","featureFlags","future","experimental","flag","_config_future","_config_future_flag","_ref","_config_experimental","_config_experimental_flag","_ref1","experimentalFlagsEnabled","env","JEST_WORKER_ID","changes","$map","EvEmitter","eventName","listener","_events","listeners","once","onceEvents","_onceEvents","emitEvent","onceListeners","allOff","MapPrototype","defineWellKnownSymbol","defaultConstructor","toIntegerOrInfinity","$RangeError","RangeError","Infinity","objectGetPrototypeOf","objectKeys","IE_BUG","TO_ENTRIES","IE_WORKAROUND","activeXDocument","definePropertiesModule","documentCreateElement","PROTOTYPE","SCRIPT","EmptyConstructor","scriptTag","LT","NullProtoObjectViaActiveX","write","temp","parentWindow","NullProtoObject","ActiveXObject","iframeDocument","iframe","JS","Properties","collection","_constructors","_guards","isSupersetOf","SUBSTITUTION_SYMBOLS","SUBSTITUTION_SYMBOLS_NO_NAMED","matched","captures","namedCaptures","replacement","tailPos","symbols","ch","LayoutMode","FitRows","_resetLayout","maxY","_getMeasurement","_getItemLayoutPosition","itemWidth","gutter","containerWidth","isotope","_getContainerSize","lazySizes","regDescriptors","regCssFit","regCssObject","regPicture","cfg","parentFit","parentSel","getFit","tmpMatch","parentObj","_lazysizesParentFit","_lazysizesParentContainer","objectFit","getImageRatio","media","elements","srcsetAttr","_lsMedia","customMedia","calculateSize","displayRatio","imageRatio","retWidth","fitObj","fitElem","clientWidth","cloned","j","clone","overrides","appendToPropertyAndEscape","valueEscaped","originalValue","originalEscaped","setPropertyAndEscape","setPropertyWithoutEscape","column","rawSpace","isArrayIteratorMethod","getIterator","iteratorClose","Result","stopped","ResultPrototype","unboundFunction","iterFn","AS_ENTRIES","IS_RECORD","IS_ITERATOR","INTERRUPTED","condition","callFn","$parseInt","radix","alreadyShown","log","messages","info","risk","magenta","$reduce","CHROME_VERSION","isExtensible","preventExtensions","$trim","forcedStringTrimMethod","isSymbol","ordinaryToPrimitive","TO_PRIMITIVE","exoticToPrim","feature","detection","POLYFILL","NATIVE","passed","_WHITESPACE_TOKENS","_Object$assign","_sortAscending","_tokenize","tokens","WHITESPACE_TOKENS","cr","feed","newline","tab","WHITESPACE_EQUIV_TOKENS","tokenStart","token","FIELDS","START_LINE","START_COL","tokenEnd","END_LINE","END_COL","getSource","startLine","startColumn","endLine","endColumn","getTokenSource","getTokenSourceSpan","startToken","endToken","unescapeProp","unesc","indexesOf","Parser","safe","_errorGenerator","rootSource","errorGenerator","loop","errorOptions","startingToken","currToken","closeSquare","expected","START_POS","sourceIndex","word","spaceBefore","commentBefore","lastAdded","spaceAfterMeaningfulToken","prevContent","existingComment","getProp","asterisk","equals","dollar","oldRawValue","caret","_unescaped","_oldRawValue","insensitiveFlag","lastComment","rawLastComment","lastValue","rawLastValue","parseWhitespaceEquivalentTokens","stopPosition","startPosition","firstToken","lastToken","convertWhitespaceNodesToSpace","requiredSpace","lossySpace","isNamedCombinator","slash","namedCombinator","nameRaw","unexpected","nextSigTokenPos","locateNextMeaningfulToken","comma","spaceOrDescendantSelectorNodes","_this$convertWhitespa2","_space","_rawSpace","_this$convertWhitespa3","_space2","_rawSpace2","optionalSpace","_this$convertWhitespa","trailingComma","missingBackslash","missingParenthesis","missingSquareBracket","prevToken","nextToken","parentheses","unbalanced","openParenthesis","closeParenthesis","parenEnd","parenStart","parenValue","parseParenthesisToken","pseudoStr","colon","splitWord","firstCallback","hasClass","escapedDot","isKeyframesPercent","hasId","interpolations","hashIndex","indices","uniqs","ind","classNameOpts","idOpts","tagOpts","throwOnParenthesis","openSquare","ampersand","semicolon","description","an","END_POS","searchPosition","Item","noop","GUID","instances","Outlayer","queryElement","$element","extend","outlayerGUID","_create","_getOption","layout","containerStyle","originLeft","originTop","resize","resizeContainer","hiddenStyle","visibleStyle","subclass","Parent","SubClass","oldOption","compatOptions","horizontal","layoutInstant","reloadItems","stamps","bindResize","_itemize","itemElems","_filterFindItemElements","itemSelector","getItemElements","_manageStamps","isInstant","_isLayoutInited","layoutItems","_init","_getItemsForLayout","_layoutItems","_postLayout","isIgnored","_emitCompleteOnItems","isLayoutInstant","_processLayoutQueue","updateStagger","_positionItem","stagger","unit","msUnits","getMilliseconds","goTo","moveTo","_setContainerMeasure","measure","isWidth","elemSize","onComplete","doneCount","tick","emitArgs","$event","trigger","ignore","getItem","unignore","_find","unstamp","_getBoundingRect","_manageStamp","boundingRect","_boundingRect","_getElementOffset","thisRect","isResizeBound","unbindResize","onresize","needsResizeLayout","addItems","appended","reveal","prepended","previousItems","revealItemElements","getItems","hideItemElements","removeItems","removeData","Layout","bridget","ms","inheritIfRequired","thisNumberValue","NUMBER","NativeNumber","PureNumberNamespace","NumberPrototype","charCodeAt","NumberWrapper","dummy","primValue","third","maxCode","digits","toNumber","toNumeric","copyConstructorProperties","objectExtend","deep","isUnextendable","extenders","extender","isCloneable","val","$parcel$interopDefault","$4040acfd8584338d$export$2e2bcd8739ae039","_callbacks","callbacks","makeEvent","evt","initCustomEvent","$4ca367182776f80b$export$2e2bcd8739ae039","withCredentials","parallelUploads","uploadMultiple","chunking","forceChunking","chunkSize","parallelChunkUploads","retryChunks","retryChunksLimit","maxFilesize","paramName","createImageThumbnails","maxThumbnailFilesize","thumbnailWidth","thumbnailHeight","thumbnailMethod","resizeWidth","resizeHeight","resizeMimeType","resizeQuality","resizeMethod","filesizeBase","maxFiles","headers","defaultHeaders","clickable","ignoreHiddenFiles","acceptedFiles","acceptedMimeTypes","autoProcessQueue","autoQueue","addRemoveLinks","previewsContainer","disablePreviews","hiddenInputContainer","renameFilename","renameFile","forceFallback","dictDefaultMessage","dictFallbackMessage","dictFallbackText","dictFileTooBig","dictInvalidFileType","dictResponseError","dictCancelUpload","dictUploadCanceled","dictCancelUploadConfirmation","dictRemoveFile","dictRemoveFileConfirmation","dictMaxFilesExceeded","dictFileSizeUnits","tb","gb","mb","kb","chunk","dzuuid","upload","uuid","dzchunkindex","dztotalfilesize","dzchunksize","dztotalchunkcount","totalChunkCount","dzchunkbyteoffset","accept","chunksUploaded","binaryBody","fallback","messageElement","$3ed269f2f0fb224b$export$2e2bcd8739ae039","span","textContent","innerText","getFallbackForm","srcX","srcY","srcWidth","srcHeight","srcRatio","trgRatio","trgWidth","trgHeight","transformFile","resizeImage","previewTemplate","drop","dragstart","dragend","dragenter","dragover","dragleave","paste","addedfile","previewElement","filesize","_removeLink","removeFileEvent","UPLOADING","confirm","removeFile","removeLink","removedfile","_updateMaxFilesReachedClass","thumbnail","dataUrl","thumbnailElement","errormultiple","processing","processingmultiple","uploadprogress","bytesSent","totaluploadprogress","sending","sendingmultiple","success","successmultiple","canceled","canceledmultiple","completemultiple","maxfilesexceeded","maxfilesreached","queuecomplete","addedfiles","initClass","Emitter","_thumbnailQueue","_processingThumbnail","getAcceptedFiles","accepted","getRejectedFiles","getFilesWithStatus","getQueuedFiles","QUEUED","getUploadingFiles","getAddedFiles","ADDED","getActiveFiles","tagName","clickableElements","setupHiddenFileInput","hiddenFileInput","getElement","addFile","webkitURL","updateTotalUploadProgress","noPropagation","dataTransfer","containsFiles","returnValue","efct","effectAllowed","dropEffect","clickableElement","elementInside","disable","removeAllFiles","dropzone","totalUploadProgress","totalBytesSent","totalBytes","total","_getParamName","_renameFile","existingFallback","form","getExistingFallback","fieldsString","fields","getFallback","setupEventListeners","elementListeners","removeEventListeners","cancelUpload","selectedSize","selectedUnit","units","webkitGetAsEntry","_addFilesFromItems","handleFiles","clipboardData","isFile","getAsFile","isDirectory","_addFilesFromDirectory","kind","directory","dirReader","createReader","errorHandler","$3ed269f2f0fb224b$var$__guardMethod__","readEntries","fullPath","isValidFile","uuidv4","filename","_enqueueThumbnail","_errorProcessing","enqueueFile","enqueueFiles","processQueue","_processThumbnailQueue","createThumbnail","$3ed269f2f0fb224b$var$without","cancelIfNecessary","canvas","resizedDataURL","toDataURL","$3ed269f2f0fb224b$var$ExifRestore","restore","dataURL","dataURItoBlob","fixOrientation","fileReader","FileReader","createThumbnailFromUrl","readAsDataURL","displayExistingFile","mockFile","imageUrl","crossOrigin","resizeThumbnail","loadExif","EXIF","getData","getTag","orientation","resizeInfo","ctx","getContext","$3ed269f2f0fb224b$var$drawImageIOSFix","trgX","trgY","processingLength","queuedFiles","processFiles","processFile","uploadFiles","_getFilesWithXhr","groupedFiles","groupedFile","CANCELED","groupedFile1","resolveOption","uploadFile","_transformFiles","transformedFiles","transformedFile","chunked","startedChunkCount","chunks","handleNextChunk","chunkIndex","dataBlock","webkitSlice","retries","_uploadData","finishedChunkUpload","response","allFinished","SUCCESS","responseHeaders","getAllResponseHeaders","_finished","dataBlocks","_getChunk","_finishedUploading","ontimeout","_handleUploadError","onprogress","_updateFilesUploadProgress","Accept","headerName","headerValue","submitRequest","formData","FormData","additionalParams","_addFormElementData","doneCounter","inputName","inputType","loaded","responseType","getResponseHeader","random","elementOptions","optionsForElement","isBrowserSupported","getElements","$3ed269f2f0fb224b$var$camelize","forElement","discover","dropzones","checkElements","blockedBrowsers","capableBrowser","File","FileList","Blob","blacklistedBrowsers","regex","dataURI","byteString","atob","mimeString","ab","ArrayBuffer","ia","asc","rejectedItem","els","question","rejected","mimeType","baseMimeType","validType","ACCEPTED","PROCESSING","sx","sy","sw","sh","dx","dy","dw","dh","vertSquashRatio","ih","drawImage","getImageData","ey","py","$3ed269f2f0fb224b$var$detectVerticalSquash","KEY_STR","encode64","chr1","chr2","enc1","enc2","enc3","output","chr3","enc4","origFileBase64","resizedFileBase64","rawImage","decode64","segments","slice2Segments","exifManipulation","exifArray","getExifArray","newImageArray","insertExif","seg","imageData","buf","separatePoint","mae","ato","rawImageArray","endPoint","DOMIterables","DOMTokenListPrototype","ArrayIteratorMethods","ArrayValues","handlePrototype","CollectionPrototype","COLLECTION_NAME","uncurryThisAccessor","aPossiblePrototype","CORRECT_SETTER","Combinator","isRawJSON","parseJSONString","NATIVE_RAW_JSON","$stringify","numberToString","surrogates","lowSurrogates","hiSurrogates","MARK","MARK_LENGTH","WRONG_SYMBOLS_CONVERSION","ILL_FORMED_UNICODE","stringifyWithProperSymbolsConversion","replacer","$replacer","getReplacerFunction","fixIllFormedJSON","rawLength","keysLength","replacerFunction","rawStrings","json","rawJSON","chr","getFullHeight","ScrollBooster","pointerMode","scrollMode","bounceForce","textSelection","inputsFocus","emulateScroll","preventDefaultOnEmulateScroll","preventPointerMoveDefault","lockScrollOnDragDirection","pointerDownPreventDefault","dragDirectionTolerance","onUpdate","shouldScroll","isTargetScroll","isScrolling","isRunning","START_COORDINATES","dragStartPosition","clientOffset","dragPosition","targetPosition","scrollOffset","rafID","handleEvents","updateOptions","getState","startAnimationLoop","edgeX","edgeY","updateScrollPosition","isMoving","setContentPosition","applyEdgeForce","applyDragForce","applyScrollForce","applyTargetForce","inverseFriction","applyForce","force","beyondXFrom","beyondXTo","beyondYFrom","beyondYTo","beyondX","beyondY","edge","distanceToEdge","restPosition","dragVelocity","setPosition","dragAngle","getDragAngle","borderCollision","getDragDirection","tolerance","dragOrigin","clientOrigin","dragDirection","wheelTimer","isTouch","setDragPosition","eventData","touches","pointerdown","textNode","range","createRange","selectNodeContents","textNodeFromPoint","selection","clearTextSelection","pointermove","pointerup","dragOffsetX","dragOffsetY","contentLoad","Wrapper","NewTarget","NewTargetPrototype","docElemStyle","transformProperty","transitionEndEvent","WebkitTransition","vendorProperties","_transn","ingProperties","clean","onEnd","elemStyle","getPosition","isOriginLeft","isOriginTop","xValue","yValue","layoutSize","layoutPosition","xPadding","xProperty","xResetProperty","getXValue","yPadding","yProperty","yResetProperty","getYValue","percentPosition","_transitionTo","curX","curY","didNotMove","isTransitioning","transX","transY","transitionStyle","getTranslate","onTransitionEnd","isCleaning","_nonTransition","_removeStyles","_transition","enableTransition","transitionProps","duration","staggerDelay","onwebkitTransitionEnd","ontransitionend","onotransitionend","dashedVendorProperties","propertyName","isEmptyObj","disableTransition","removeTransitionStyles","cleanStyle","cleanTransitionStyle","delay","removeElem","getHideRevealTransitionEndProperty","onRevealTransitionEnd","styleProperty","optionStyle","onHideTransitionEnd","TO_STRING_TAG_SUPPORT","DatePrototype","INVALID_DATE","TO_STRING","nativeDateToString","thisTimeValue","getTime","Masonry","MasonryMode","keepModeMethods","measureColumns","filteredItems","isFitWidth","sameValue","SEARCH","nativeSearch","searcher","previousLastIndex","postfix","promiseCapability","aSet","SetHelpers","getSetRecord","iterateSet","iterateSimple","otherRec","getOwnPropertyNamesModule","getOwnPropertyNamesExternalModule","FREEZING","REQUIRED","METADATA","setMetadata","objectID","weakData","meta","fastKey","getWeakData","onFreeze","is","isPossiblePrototype","constructorRegExp","INCORRECT_TO_STRING","isConstructorModern","isConstructorLegacy","called","$RegExp","dotAll","hint","keysIter","Nesting","needsVerticalResizeLayout","getColumnWidth","getSegmentSize","getRowHeight","segment","segmentName","outerSize","firstItemSize","getFirstItemSize","firstItem","modes","Mode","getIteratorDirect","INVALID_SIZE","SetRecord","intSize","numSize","defineIterator","createIterResultObject","ARRAY_ITERATOR","iterated","Arguments","ltrim","rtrim","iterate","nativeGetOwnPropertyDescriptor","isDisjointFrom","$parseFloat","trimmedString","createPropertyDescriptor","ENUMERABLE_NEXT","defineBuiltIns","ArrayIterationModule","internalStateGetterFor","uncaughtFrozenStore","frozen","UncaughtFrozenStore","findUncaughtFrozen","getConstructor","CONSTRUCTOR_NAME","IS_MAP","ADDER","define","toTrianglesDrawMode","geometry","drawMode","getIndex","setIndex","numberOfTriangles","newIndices","newGeometry","clearGroups","GLTFLoader","manager","dracoLoader","ktx2Loader","meshoptDecoder","pluginCallbacks","parser","GLTFMaterialsClearcoatExtension","GLTFMaterialsDispersionExtension","GLTFTextureBasisUExtension","GLTFTextureWebPExtension","GLTFTextureAVIFExtension","GLTFMaterialsSheenExtension","GLTFMaterialsTransmissionExtension","GLTFMaterialsVolumeExtension","GLTFMaterialsIorExtension","GLTFMaterialsEmissiveStrengthExtension","GLTFMaterialsSpecularExtension","GLTFMaterialsIridescenceExtension","GLTFMaterialsAnisotropyExtension","GLTFMaterialsBumpExtension","GLTFLightsExtension","GLTFMeshoptCompression","GLTFMeshGpuInstancing","load","onProgress","scope","resourcePath","relativeUrl","extractUrlBase","resolveURL","itemStart","_onError","itemError","itemEnd","loader","setPath","setResponseType","requestHeader","setWithCredentials","gltf","setDRACOLoader","setKTX2Loader","setMeshoptDecoder","unregister","textDecoder","TextDecoder","decode","BINARY_EXTENSION_HEADER_MAGIC","EXTENSIONS","KHR_BINARY_GLTF","GLTFBinaryExtension","asset","GLTFParser","fileLoader","extensionsUsed","extensionName","extensionsRequired","KHR_MATERIALS_UNLIT","GLTFMaterialsUnlitExtension","KHR_DRACO_MESH_COMPRESSION","GLTFDracoMeshCompressionExtension","KHR_TEXTURE_TRANSFORM","GLTFTextureTransformExtension","KHR_MESH_QUANTIZATION","GLTFMeshQuantizationExtension","setExtensions","setPlugins","parseAsync","GLTFRegistry","objects","KHR_LIGHTS_PUNCTUAL","KHR_MATERIALS_CLEARCOAT","KHR_MATERIALS_DISPERSION","KHR_MATERIALS_IOR","KHR_MATERIALS_SHEEN","KHR_MATERIALS_SPECULAR","KHR_MATERIALS_TRANSMISSION","KHR_MATERIALS_IRIDESCENCE","KHR_MATERIALS_ANISOTROPY","KHR_MATERIALS_VOLUME","KHR_TEXTURE_BASISU","KHR_MATERIALS_EMISSIVE_STRENGTH","EXT_MATERIALS_BUMP","EXT_TEXTURE_WEBP","EXT_TEXTURE_AVIF","EXT_MESHOPT_COMPRESSION","EXT_MESH_GPU_INSTANCING","refs","uses","_markDefs","nodeDefs","nodeIndex","nodeLength","nodeDef","_addNodeRef","_loadLight","lightIndex","cacheKey","dependency","lightDef","lights","lightNode","setRGB","distance","spot","innerConeAngle","outerConeAngle","penumbra","assignExtrasToUserData","intensity","createUniqueName","getDependency","createNodeAttachment","_getNodeRef","getMaterialType","extendParams","materialParams","materialDef","pending","metallicRoughness","pbrMetallicRoughness","baseColorFactor","baseColorTexture","assignTexture","extendMaterialParams","materialIndex","materials","emissiveStrength","emissiveIntensity","clearcoatFactor","clearcoat","clearcoatTexture","clearcoatRoughnessFactor","clearcoatRoughness","clearcoatRoughnessTexture","clearcoatNormalTexture","clearcoatNormalScale","dispersion","iridescenceFactor","iridescence","iridescenceTexture","iridescenceIor","iridescenceIOR","iridescenceThicknessRange","iridescenceThicknessMinimum","iridescenceThicknessMaximum","iridescenceThicknessTexture","sheenColor","sheenRoughness","sheen","sheenColorFactor","colorFactor","sheenRoughnessFactor","sheenColorTexture","sheenRoughnessTexture","transmissionFactor","transmission","transmissionTexture","thickness","thicknessFactor","thicknessTexture","attenuationDistance","colorArray","attenuationColor","ior","specularIntensity","specularFactor","specularTexture","specularColorFactor","specularColor","specularColorTexture","bumpScale","bumpFactor","bumpTexture","anisotropyStrength","anisotropy","anisotropyRotation","anisotropyTexture","loadTexture","textureIndex","textureDef","textures","loadTextureImage","images","textureLoader","uri","getHandler","loadBufferView","bufferView","bufferViews","extensionDef","decoder","supported","stride","byteStride","decodeGltfBufferAsync","decodeGltfBuffer","createNodeMesh","mesh","meshDef","meshes","primitive","primitives","WEBGL_CONSTANTS","TRIANGLES","TRIANGLE_STRIP","TRIANGLE_FAN","attributesDef","attributes","accessor","results","nodeObject","isGroup","instancedMeshes","instancedMesh","material","TRANSLATION","fromBufferAttribute","ROTATION","SCALE","setMatrixAt","compose","attributeName","instanceColor","itemSize","normalized","assignFinalMaterial","headerView","DataView","header","magic","getUint32","chunkContentsLength","chunkView","chunkLength","chunkType","contentArray","decodePrimitive","bufferViewIndex","gltfAttributeMap","threeAttributeMap","attributeNormalizedMap","attributeTypeMap","threeAttributeName","ATTRIBUTES","accessorDef","accessors","componentType","WEBGL_COMPONENT_TYPES","decodeDracoFile","extendTexture","texture","texCoord","channel","rotation","fromArray","needsUpdate","GLTFCubicSplineInterpolant","parameterPositions","sampleValues","sampleSize","resultBuffer","copySampleValue_","valueSize","interpolate_","i1","t0","t1","stride2","stride3","td","pp","ppp","offset1","offset0","s2","s3","s0","s1","p0","m0","p1","m1","_quaternion","GLTFCubicSplineQuaternionInterpolant","FLOAT","FLOAT_MAT3","FLOAT_MAT4","FLOAT_VEC2","FLOAT_VEC3","FLOAT_VEC4","LINEAR","REPEAT","SAMPLER_2D","POINTS","LINES","LINE_LOOP","LINE_STRIP","UNSIGNED_BYTE","UNSIGNED_SHORT","Int8Array","Int16Array","Uint16Array","Uint32Array","Float32Array","WEBGL_FILTERS","WEBGL_WRAPPINGS","WEBGL_TYPE_SIZES","POSITION","NORMAL","TANGENT","TEXCOORD_0","TEXCOORD_1","TEXCOORD_2","TEXCOORD_3","COLOR_0","WEIGHTS_0","JOINTS_0","PATH_PROPERTIES","translation","weights","INTERPOLATION","CUBICSPLINE","STEP","createDefaultMaterial","emissive","metalness","roughness","depthTest","side","addUnknownExtensionsToUserData","knownExtensions","objectDef","userData","gltfExtensions","gltfDef","extras","updateMorphTargets","il","morphTargetInfluences","targetNames","morphTargetDictionary","createPrimitiveKey","primitiveDef","geometryKey","dracoExtension","createAttributesKey","attributesKey","getNormalizedComponentScale","_identityMatrix","associations","primitiveCache","nodeCache","meshCache","cameraCache","lightCache","sourceCache","textureCache","nodeNamesUsed","isSafari","safariVersion","isFirefox","firefoxVersion","safariMatch","createImageBitmap","setCrossOrigin","_invokeAll","ext","beforeRoot","getDependencies","dependencies","scene","scenes","animations","cameras","afterRoot","updateMatrixWorld","skinDefs","skins","meshDefs","skinIndex","skinLength","joints","isBone","skin","isSkinnedMesh","camera","updateMappings","original","mappings","_invokeOne","loadScene","loadNode","loadMesh","loadAccessor","loadBuffer","loadMaterial","loadSkin","loadAnimation","loadCamera","defs","def","bufferIndex","bufferDef","buffers","bufferViewDef","accessorIndex","sparse","TypedArray","pendingBufferViews","elementBytes","BYTES_PER_ELEMENT","itemBytes","bufferAttribute","ibSlice","ibCacheKey","ib","itemSizeIndices","SCALAR","TypedArrayIndices","byteOffsetIndices","byteOffsetValues","sparseIndices","sparseValues","setX","setY","setZ","setW","sourceDef","sampler","loadImageSource","samplers","magFilter","minFilter","wrapS","wrapT","generateMipmaps","isCompressedTexture","sourceURI","isObjectURL","blob","createObjectURL","isImageBitmapLoader","imageBitmap","revokeObjectURL","mapName","mapDef","colorSpace","gltfReference","useDerivativeTangents","tangent","useVertexColors","useFlatShading","isPoints","pointsMaterial","sizeAttenuation","isLine","lineMaterial","cachedMaterial","vertexColors","flatShading","normalScale","materialType","kmuExtension","metallicFactor","roughnessFactor","metallicRoughnessTexture","doubleSided","alphaMode","depthWrite","alphaTest","alphaCutoff","normalTexture","occlusionTexture","strength","aoMapIntensity","emissiveFactor","emissiveTexture","originalName","sanitizedName","sanitizeNodeName","loadGeometries","createDracoPrimitive","addPrimitiveAttributes","cached","geometryPromise","meshIndex","geometries","normalizeSkinWeights","morphAttributes","group","cameraIndex","cameraDef","radToDeg","yfov","znear","zfar","xmag","ymag","skinDef","_loadNodeShallow","inverseBindMatrices","jointNodes","bones","boneInverses","jointNode","mat","animationIndex","animationDef","pendingNodes","pendingInputAccessors","pendingOutputAccessors","pendingSamplers","pendingTargets","channels","parameters","inputAccessors","outputAccessors","tracks","inputAccessor","outputAccessor","updateMatrix","createdTracks","_createAnimationTracks","traverse","isMesh","nodePending","childPending","childrenDef","skeletonPending","skeleton","meshPromise","matrix","applyMatrix4","quaternion","mapping","sceneIndex","sceneDef","nodeIds","reducedAssociations","reduceAssociations","targetName","TypedKeyframeTrack","interpolation","outputArray","_getArrayFromAccessor","jl","_createCubicSplineTrackInterpolant","scaled","createInterpolant","times","getValueSize","isInterpolantFactoryMethodGLTFCubicSpline","assignAttributeAccessor","gltfAttributeName","workingColorSpace","box","boxScale","multiplyScalar","maxDisplacement","vector","expandByVector","boundingBox","sphere","getCenter","radius","distanceTo","boundingSphere","computeBounds","hasMorphPosition","hasMorphNormal","hasMorphColor","pendingPositionAccessors","pendingNormalAccessors","pendingColorAccessors","pendingAccessor","morphPositions","morphNormals","morphColors","morphTargetsRelative","addMorphTargets","ARRAY_BUFFER_NON_EXTENSIBLE","$isExtensible","FAILS_ON_PRIMITIVES","ArrayPrototype","getOwnPropertySymbolsModule","propertyIsEnumerableModule","$assign","alphabet","userAgentStartsWith","Bun","Deno","Pebble","stripComments","_getProp","_ensureObject","_stripComments","lazySizesCfg","regWhite","regSplitSet","regSource","regType","regBgUrlEscape","allowedBackgroundSize","setTypeOrMedia","typeMatch","proxyLoad","_lazybgset","bg","useSrc","fire","fullSrc","_lazybgsetLoading","firesLoad","sets","sizesAttr","optimumx","lazyClass","createPicture","unveil","bgSize","getBgSize","gW","_lazysizesWidth","SetPrototype","$includes","SAFE_CLOSING","iteratorWithReturn","SKIP_CLOSING","ITERATION_SUPPORT","comparefn","llength","rlength","lindex","rindex","nativeReverse","check","schedulersFix","localStorage","msg","warned","trace","definePropertyModule","noGlobal","getProto","flat","class2type","fnToString","ObjectFunctionString","support","isWindow","preservedScriptAttributes","nonce","noModule","DOMEval","doc","script","toType","rhtmlSuffix","context","jquery","pushStack","ret","prevObject","even","grep","_elem","odd","copyIsArray","expando","isReady","isEmptyObject","globalEval","nodeValue","inArray","isXMLDoc","namespaceURI","docElem","ownerDocument","second","callbackExpect","guid","_i","whitespace","rtrimCSS","bup","compareDocumentPosition","rcssescape","fcssescape","asCodePoint","escapeSelector","preferredDoc","pushNative","Expr","outermostContext","sortInput","hasDuplicate","documentIsHTML","rbuggyQSA","dirruns","classCache","createCache","tokenCache","compilerCache","nonnativeSelectorCache","sortOrder","booleans","pseudos","rwhitespace","rcomma","rleadingCombinator","rdescend","rpseudo","ridentifier","matchExpr","ATTR","CHILD","bool","needsContext","rinputs","rheader","rquickExpr","rsibling","runescape","funescape","escape","nonHex","high","fromCharCode","unloadHandler","setDocument","inDisabledFieldset","addCombinator","dir","seed","nid","groups","newSelector","newContext","testContext","tokenize","toSelector","qsaError","select","cacheLength","markFunction","assert","createInputPseudo","createButtonPseudo","createDisabledPseudo","createPositionalPseudo","matchIndexes","subWindow","webkitMatchesSelector","msMatchesSelector","defaultView","getById","getElementsByName","disconnectedMatch","cssHas","attrId","getAttributeNode","compare","sortDetached","expr","attrHandle","uniqueSort","duplicates","sortStable","createPseudo","preFilter","excess","unquoted","nodeNameSelector","expectedNodeName","pattern","what","_argument","simple","forward","ofType","_context","xml","outerCache","useCache","diff","lastChild","setFilters","not","compile","unmatched","lang","elemLang","err","safeActiveElement","hasFocus","href","_matchIndexes","nth","radio","checkbox","password","submit","parseOnly","soFar","preFilters","skip","checkNonElements","doneName","oldCache","newCache","elementMatcher","matchers","condense","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","matcherOut","preMap","postMap","preexisting","contexts","multipleContexts","matcherIn","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","setMatchers","elementMatchers","bySet","byElement","superMatcher","outermost","matchedCount","setMatched","contextBackup","dirrunsUnique","matcherFromGroupMatchers","compiled","filters","unique","getText","isXML","until","truncate","siblings","rneedsContext","rsingleTag","winnow","qualifier","rootjQuery","parseHTML","rparentsprev","guaranteedUnique","sibling","cur","prevAll","addBack","parents","parentsUntil","nextAll","nextUntil","prevUntil","contentDocument","rnothtmlwhite","Identity","Thrower","ex","adoptValue","noValue","Callbacks","createOptions","firing","memory","fired","locked","firingIndex","stopOnFalse","lock","fireWith","Deferred","tuples","always","deferred","pipe","fns","newDefer","tuple","returned","maxDepth","depth","special","mightThrow","notifyWith","resolveWith","exceptionHook","rejectWith","getErrorHook","getStackHook","stateString","when","singleValue","resolveContexts","resolveValues","primary","updateFunc","rerrorNames","asyncError","readyException","readyList","completed","readyWait","doScroll","access","chainable","emptyGet","bulk","rmsPrefix","rdashAlpha","fcamelCase","_all","letter","camelCase","acceptData","owner","Data","hasData","dataPriv","dataUser","rbrace","rmultiDash","_data","_removeData","attrs","dequeue","startLength","hooks","_queueHooks","clearQueue","tmp","defer","pnum","rcssNum","cssExpand","isAttached","composed","getRootNode","isHiddenWithinTree","adjustCSS","valueParts","adjusted","maxIterations","currentValue","cssNumber","initialInUnit","defaultDisplayMap","getDefaultDisplay","showHide","rcheckableType","rtagName","rscriptType","createDocumentFragment","checkClone","noCloneChecked","defaultValue","wrapMap","tr","getAll","setGlobalEval","refElements","tbody","colgroup","th","optgroup","rhtml","buildFragment","scripts","ignored","attached","fragment","htmlPrefilter","rtypenamespace","returnTrue","returnFalse","one","origFn","leverageNative","saved","isTrigger","delegateType","stopImmediatePropagation","isImmediatePropagationStopped","handleObjIn","eventHandle","handleObj","handlers","namespaces","origType","elemData","handle","triggered","dispatch","bindType","delegateCount","mappedTypes","origCount","teardown","removeEvent","nativeEvent","handlerQueue","fix","delegateTarget","preDispatch","isPropagationStopped","rnamespace","postDispatch","matchedHandlers","matchedSelectors","addProp","hook","originalEvent","noBubble","beforeunload","isDefaultPrevented","relatedTarget","timeStamp","isSimulated","eventPhase","view","charCode","keyCode","pointerId","pointerType","screenX","screenY","targetTouches","toElement","which","focusMappedHandler","documentMode","simulate","attaches","dataHolder","mouseenter","mouseleave","pointerenter","pointerleave","orig","related","rnoInnerhtml","rchecked","rcleanScript","manipulationTarget","disableScript","restoreScript","cloneCopyEvent","dest","udataOld","udataCur","fixInput","domManip","hasScripts","iNoClone","valueIsFunction","_evalUrl","keepData","cleanData","dataAndEvents","deepDataAndEvents","srcElements","destElements","inPage","replaceChild","appendTo","prependTo","replaceAll","insert","rnumnonpx","rcustomProp","getStyles","opener","swap","old","rboxStyle","curCSS","isCustomProp","pixelBoxStyles","addGetHookIf","conditionFn","hookFn","computeStyleTests","divStyle","pixelPositionVal","reliableMarginLeftVal","roundPixelMeasures","pixelBoxStylesVal","boxSizingReliableVal","scrollboxSizeVal","reliableTrDimensionsVal","backgroundClip","clearCloneStyle","boxSizingReliable","pixelPosition","reliableMarginLeft","scrollboxSize","reliableTrDimensions","trChild","trStyle","cssPrefixes","emptyStyle","vendorProps","finalPropName","cssProps","capName","vendorPropName","rdisplayswap","cssShow","cssNormalTransform","setPositiveNumber","subtract","boxModelAdjustment","dimension","computedVal","extra","delta","marginDelta","getWidthOrHeight","valueIsBorderBox","offsetProp","getClientRects","Tween","easing","cssHooks","animationIterationCount","borderImageSlice","columnCount","gridArea","orphans","widows","fillOpacity","floodOpacity","stopOpacity","strokeMiterlimit","strokeOpacity","origName","scrollboxSizeBuggy","border","suffix","expand","propHooks","run","percent","eased","fx","swing","cos","fxNow","inProgress","rfxtypes","rrun","schedule","interval","createFxNow","genFx","includeWidth","createTween","Animation","tweeners","properties","prefilters","currentTime","startTime","tweens","specialEasing","originalProperties","originalOptions","gotoEnd","propFilter","anim","tweener","oldfire","propTween","restoreDisplay","isBox","dataShow","unqueued","prefilter","speed","opt","speeds","fadeTo","optall","doAnimation","finish","stopQueue","timers","cssFn","slideDown","slideUp","slideToggle","fadeIn","fadeOut","fadeToggle","slow","fast","checkOn","optSelected","radioValue","boolHook","removeAttr","nType","attrHooks","attrNames","lowercaseName","rfocusable","rclickable","stripAndCollapse","getClass","classesToArray","removeProp","propFix","addClass","classNames","curValue","finalValue","removeClass","toggleClass","stateVal","isValidValue","rreturn","valHooks","optionSet","rquery","parseXML","parserErrorElem","rfocusMorph","stopPropagationCallback","onlyHandlers","bubbleType","ontype","lastElement","eventPath","triggerHandler","rbracket","rCRLF","rsubmitterTypes","rsubmittable","buildParams","traditional","param","valueOrFunction","serialize","serializeArray","r20","rhash","rantiCache","rheaders","rnoContent","rprotocol","transports","allTypes","originAnchor","addToPrefiltersOrTransports","structure","dataTypeExpression","dataType","dataTypes","inspectPrefiltersOrTransports","jqXHR","inspected","seekingTransport","inspect","prefilterOrFactory","dataTypeOrTransport","ajaxExtend","flatOptions","ajaxSettings","active","lastModified","etag","isLocal","protocol","processData","async","contentType","accepts","responseFields","converters","ajaxSetup","settings","ajaxPrefilter","ajaxTransport","transport","cacheURL","responseHeadersString","timeoutTimer","urlAnchor","fireGlobals","uncached","callbackContext","globalEventContext","completeDeferred","statusCode","requestHeaders","requestHeadersNames","strAbort","overrideMimeType","statusText","finalText","crossDomain","host","hasContent","ifModified","beforeSend","nativeStatusText","responses","isSuccess","modified","finalDataType","firstDataType","ajaxHandleResponses","conv2","conv","dataFilter","throws","ajaxConvert","getJSON","getScript","wrapAll","wrapInner","htmlIsFunction","visible","xhrSuccessStatus","xhrSupported","cors","errorCallback","username","xhrFields","onabort","binary","scriptAttrs","charset","scriptCharset","oldCallbacks","rjsonp","jsonp","jsonpCallback","originalSettings","callbackName","overwritten","responseContainer","jsonProp","createHTMLDocument","implementation","keepScripts","parsed","setOffset","curPosition","curLeft","curCSSTop","curTop","curOffset","curCSSLeft","curElem","using","win","parentOffset","Height","Width","defaultExtra","funcName","undelegate","hover","fnOver","fnOut","proxy","holdReady","hold","parseJSON","isNumeric","_jQuery","_$","noConflict","isConstructor","toAbsoluteIndex","nativeSlice","HAS_SPECIES_SUPPORT","$Array","fin","getAllConfigs","_configfull","_config_presets","configs","flatMap","preset","features","respectDefaultRingColorOpacity","corePlugins","experimentals","stickyHelpers","proxyAccessor","UNSUPPORTED_DOT_ALL","UNSUPPORTED_NCG","NativeRegExp","SyntaxError","IS_NCG","re1","re2","CORRECT_NEW","MISSED_STICKY","UNSUPPORTED_Y","RegExpWrapper","rawFlags","sticky","handled","thisIsRegExp","patternIsRegExp","flagsAreUndefined","rawPattern","named","brackets","ncg","groupid","groupname","handleNCG","handleDotAll","isNode","isPseudoElement","isPseudoClass","isPseudo","isContainer","isNamespace","isAttribute","isTag","isUniversal","isString","isSelector","isNesting","isComment","isCombinator","isClassName","_IS_TYPE","IS_TYPE","isNodeType","documentAll","backslash","bang","doubleQuote","singleQuote","greaterThan","plus","tilde","lightBlue","warmGray","trueGray","coolGray","blueGray","IE8_DOM_DEFINE","V8_PROTOTYPE_DEFINE_BUG","toPropertyKey","$defineProperty","$getOwnPropertyDescriptor","ENUMERABLE","WRITABLE","Attributes","createSetLike","createSetLikeWithInfinitySize","REVISION","MOUSE","LEFT","MIDDLE","RIGHT","ROTATE","DOLLY","PAN","TOUCH","DOLLY_PAN","DOLLY_ROTATE","CullFaceNone","CullFaceBack","CullFaceFront","PCFShadowMap","PCFSoftShadowMap","VSMShadowMap","FrontSide","BackSide","DoubleSide","NoBlending","NormalBlending","AdditiveBlending","SubtractiveBlending","MultiplyBlending","CustomBlending","AddEquation","SubtractEquation","ReverseSubtractEquation","MinEquation","MaxEquation","ZeroFactor","OneFactor","SrcColorFactor","OneMinusSrcColorFactor","SrcAlphaFactor","OneMinusSrcAlphaFactor","DstAlphaFactor","OneMinusDstAlphaFactor","DstColorFactor","OneMinusDstColorFactor","SrcAlphaSaturateFactor","ConstantColorFactor","OneMinusConstantColorFactor","ConstantAlphaFactor","OneMinusConstantAlphaFactor","NeverDepth","AlwaysDepth","LessDepth","LessEqualDepth","EqualDepth","GreaterEqualDepth","GreaterDepth","NotEqualDepth","MultiplyOperation","MixOperation","AddOperation","NoToneMapping","LinearToneMapping","ReinhardToneMapping","CineonToneMapping","ACESFilmicToneMapping","CustomToneMapping","AgXToneMapping","NeutralToneMapping","AttachedBindMode","CubeReflectionMapping","CubeRefractionMapping","EquirectangularReflectionMapping","EquirectangularRefractionMapping","CubeUVReflectionMapping","RepeatWrapping","ClampToEdgeWrapping","MirroredRepeatWrapping","NearestFilter","NearestMipmapNearestFilter","NearestMipmapLinearFilter","LinearFilter","LinearMipmapNearestFilter","LinearMipmapLinearFilter","UnsignedByteType","ByteType","ShortType","UnsignedShortType","IntType","UnsignedIntType","FloatType","HalfFloatType","UnsignedShort4444Type","UnsignedShort5551Type","UnsignedInt248Type","UnsignedInt5999Type","UnsignedInt101111Type","AlphaFormat","RGBFormat","RGBAFormat","DepthFormat","DepthStencilFormat","RedFormat","RedIntegerFormat","RGFormat","RGIntegerFormat","RGBAIntegerFormat","RGB_S3TC_DXT1_Format","RGBA_S3TC_DXT1_Format","RGBA_S3TC_DXT3_Format","RGBA_S3TC_DXT5_Format","RGB_PVRTC_4BPPV1_Format","RGB_PVRTC_2BPPV1_Format","RGBA_PVRTC_4BPPV1_Format","RGBA_PVRTC_2BPPV1_Format","RGB_ETC1_Format","RGB_ETC2_Format","RGBA_ETC2_EAC_Format","RGBA_ASTC_4x4_Format","RGBA_ASTC_5x4_Format","RGBA_ASTC_5x5_Format","RGBA_ASTC_6x5_Format","RGBA_ASTC_6x6_Format","RGBA_ASTC_8x5_Format","RGBA_ASTC_8x6_Format","RGBA_ASTC_8x8_Format","RGBA_ASTC_10x5_Format","RGBA_ASTC_10x6_Format","RGBA_ASTC_10x8_Format","RGBA_ASTC_10x10_Format","RGBA_ASTC_12x10_Format","RGBA_ASTC_12x12_Format","RGBA_BPTC_Format","RGB_BPTC_SIGNED_Format","RGB_BPTC_UNSIGNED_Format","RED_RGTC1_Format","SIGNED_RED_RGTC1_Format","RED_GREEN_RGTC2_Format","SIGNED_RED_GREEN_RGTC2_Format","InterpolateDiscrete","InterpolateLinear","InterpolateSmooth","TrianglesDrawMode","TriangleStripDrawMode","TriangleFanDrawMode","RGBADepthPacking","TangentSpaceNormalMap","ObjectSpaceNormalMap","NoColorSpace","SRGBColorSpace","LinearSRGBColorSpace","LinearTransfer","SRGBTransfer","KeepStencilOp","NeverCompare","LessCompare","EqualCompare","LessEqualCompare","GreaterCompare","NotEqualCompare","GreaterEqualCompare","AlwaysCompare","StaticDrawUsage","GLSL3","WebGLCoordinateSystem","WebGPUCoordinateSystem","arrayNeedsUint32","createElementNS","createCanvasElement","Uint8ClampedArray","Int32Array","Float64Array","_cache","warnOnce","probeAsync","gl","sync","probe","clientWaitSync","SYNC_FLUSH_COMMANDS_BIT","WAIT_FAILED","TIMEOUT_EXPIRED","EventDispatcher","_listeners","hasEventListener","listenerArray","_lut","_seed","DEG2RAD","RAD2DEG","generateUUID","d0","d1","d2","d3","clamp","euclideanModulo","lerp","denormalize","MathUtils","mapLinear","a1","a2","b1","b2","inverseLerp","damp","lambda","exp","pingpong","smoothstep","smootherstep","randInt","low","randFloat","randFloatSpread","seededRandom","imul","degToRad","degrees","radians","isPowerOfTwo","ceilPowerOfTwo","LN2","floorPowerOfTwo","setQuaternionFromProperEuler","sin","c2","c13","s13","c1_3","s1_3","c3_1","s3_1","Vector2","isVector2","setScalar","scalar","setComponent","getComponent","addScalar","addVectors","addScaledVector","sub","subScalar","subVectors","divide","divideScalar","applyMatrix3","clampScalar","minVal","maxVal","clampLength","roundToZero","negate","cross","lengthSq","manhattanLength","angleTo","denominator","theta","acos","distanceToSquared","manhattanDistanceTo","setLength","lerpVectors","v1","v2","rotateAround","Quaternion","isQuaternion","_x","_y","_z","_w","slerpFlat","dst","dstOffset","src0","srcOffset0","src1","srcOffset1","x0","y0","z0","w0","x1","y1","z1","w1","multiplyQuaternionsFlat","_onChangeCallback","setFromEuler","euler","_order","c1","c3","setFromAxisAngle","halfAngle","setFromRotationMatrix","m11","m12","m13","m21","m22","m23","m31","m32","m33","setFromUnitVectors","vFrom","vTo","rotateTowards","slerp","conjugate","multiplyQuaternions","premultiply","qax","qay","qaz","qaw","qbx","qby","qbz","qbw","qb","slerpQuaternions","qa","theta1","theta2","r1","r2","getZ","getW","_onChange","Vector3","isVector3","multiplyVectors","applyEuler","applyQuaternion","_quaternion$4","applyAxisAngle","applyNormalMatrix","vx","vy","vz","qx","qy","qz","qw","tx","ty","tz","project","matrixWorldInverse","projectionMatrix","unproject","projectionMatrixInverse","matrixWorld","transformDirection","crossVectors","ax","ay","az","bx","by","bz","projectOnVector","projectOnPlane","planeNormal","_vector$c","reflect","dz","setFromSpherical","setFromSphericalCoords","phi","sinPhiRadius","setFromCylindrical","setFromCylindricalCoords","setFromMatrixPosition","setFromMatrixScale","setFromMatrixColumn","sz","setFromMatrix3Column","setFromColor","randomDirection","Matrix3","n11","n12","n13","n21","n22","n23","n31","n32","n33","isMatrix3","extractBasis","xAxis","yAxis","zAxis","setFromMatrix4","multiplyMatrices","a11","a12","a13","a21","a22","a23","a31","a32","a33","b11","b12","b13","b21","b22","b23","b31","b32","b33","determinant","t11","t12","t13","det","detInv","transpose","getNormalMatrix","matrix4","transposeIntoArray","setUvTransform","cx","cy","_m3","makeScale","makeRotation","makeTranslation","LINEAR_REC709_TO_XYZ","XYZ_TO_LINEAR_REC709","createColorManagement","ColorManagement","convert","sourceColorSpace","targetColorSpace","transfer","SRGBToLinear","primaries","toXYZ","fromXYZ","LinearToSRGB","workingToColorSpace","colorSpaceToWorking","getPrimaries","getTransfer","getToneMappingMode","outputColorSpaceConfig","toneMappingMode","getLuminanceCoefficients","luminanceCoefficients","colorSpaces","_getMatrix","targetMatrix","_getDrawingBufferColorSpace","drawingBufferColorSpace","_getUnpackColorSpace","workingColorSpaceConfig","unpackColorSpace","fromWorkingColorSpace","toWorkingColorSpace","REC709_PRIMARIES","REC709_LUMINANCE_COEFFICIENTS","D65","whitePoint","_canvas","ImageUtils","getDataURL","HTMLCanvasElement","ImageData","putImageData","sRGBToLinear","ImageBitmap","_sourceId","isSource","dataReady","HTMLVideoElement","videoWidth","videoHeight","VideoFrame","displayHeight","displayWidth","isRootObject","isDataTexture","serializeImage","_textureId","_tempVec3","Texture","DEFAULT_IMAGE","DEFAULT_MAPPING","format","DEFAULT_ANISOTROPY","isTexture","mipmaps","internalFormat","matrixAutoUpdate","premultiplyAlpha","unpackAlignment","updateRanges","renderTarget","isRenderTargetTexture","isArrayTexture","pmremVersion","addUpdateRange","clearUpdateRanges","setValues","generator","dispose","transformUv","uv","needsPMREMUpdate","Vector4","isVector4","setAxisAngleFromQuaternion","setAxisAngleFromRotationMatrix","epsilon","epsilon2","xx","yy","zz","xy","xz","yz","RenderTarget","depthBuffer","stencilBuffer","resolveDepthBuffer","resolveStencilBuffer","depthTexture","samples","multiview","isRenderTarget","scissor","scissorTest","_setTextureOptions","_depthTexture","wrapR","setSize","isData3DTexture","WebGLRenderTarget","isWebGLRenderTarget","DataArrayTexture","isDataArrayTexture","layerUpdates","addLayerUpdate","layerIndex","clearLayerUpdates","Data3DTexture","Box3","isBox3","setFromArray","makeEmpty","expandByPoint","_vector$b","setFromBufferAttribute","setFromPoints","points","setFromCenterAndSize","halfSize","setFromObject","precise","expandByObject","isEmpty","point","expandByScalar","updateWorldMatrix","positionAttribute","isInstancedMesh","getVertexPosition","computeBoundingBox","_box$4","containsPoint","containsBox","getParameter","intersectsBox","intersectsSphere","clampPoint","intersectsPlane","plane","constant","intersectsTriangle","triangle","_center","_extents","_v0$2","_v1$7","_v2$4","_f0","_f1","_f2","axes","satForAxes","_triangleNormal","distanceToPoint","getBoundingSphere","intersect","_points","fromJSON","_testAxis","v0","extents","p2","_box$3","_v1$6","_v2$3","Sphere","isSphere","optionalCenter","maxRadiusSq","radiusSum","deltaLengthSq","getBoundingBox","getMaxScaleOnAxis","_vector$a","_segCenter","_segDir","_diff","_edge1","_edge2","_normal$1","Ray","ray","lookAt","recast","closestPointToPoint","directionDistance","distanceSqToPoint","distanceSqToSegment","optionalPointOnRay","optionalPointOnSegment","segExtent","a01","b0","sqrDist","extDet","invDet","intersectSphere","tca","radius2","thc","distanceToPlane","intersectPlane","distToPoint","intersectBox","tmin","tmax","tymin","tymax","tzmin","tzmax","invdirx","invdiry","invdirz","intersectTriangle","backfaceCulling","sign","DdN","DdQxE2","DdE1xQ","QdN","Matrix4","n14","n24","n34","n41","n42","n43","n44","isMatrix4","copyPosition","setFromMatrix3","makeBasis","extractRotation","scaleX","_v1$5","scaleY","scaleZ","makeRotationFromEuler","af","bf","cf","df","ac","ad","bc","bd","makeRotationFromQuaternion","_zero","_one","eye","up","a14","a24","a34","a41","a42","a43","a44","b14","b24","b34","b41","b42","b43","b44","t14","scaleXSq","scaleYSq","scaleZSq","makeRotationX","makeRotationY","makeRotationZ","makeRotationAxis","makeShear","yx","zx","zy","x2","y2","z2","wx","wy","wz","decompose","_m1$2","invSX","invSY","invSZ","makePerspective","near","far","coordinateSystem","reversedDepth","makeOrthographic","_matrix$2","_quaternion$3","Euler","DEFAULT_ORDER","isEuler","asin","setFromQuaternion","setFromVector3","reorder","newOrder","Layers","mask","layer","enableAll","disableAll","layers","_object3DId","_v1$4","_q1","_m1$1","_target","_position$3","_scale$2","_quaternion$2","_xAxis","_yAxis","_zAxis","_addedEvent","_removedEvent","_childaddedEvent","_childremovedEvent","Object3D","isObject3D","DEFAULT_UP","defineProperties","modelViewMatrix","normalMatrix","DEFAULT_MATRIX_AUTO_UPDATE","matrixWorldAutoUpdate","DEFAULT_MATRIX_WORLD_AUTO_UPDATE","matrixWorldNeedsUpdate","castShadow","receiveShadow","frustumCulled","renderOrder","customDepthMaterial","customDistanceMaterial","onBeforeShadow","onAfterShadow","onBeforeRender","onAfterRender","setRotationFromAxisAngle","setRotationFromEuler","setRotationFromMatrix","setRotationFromQuaternion","rotateOnAxis","rotateOnWorldAxis","rotateX","rotateY","rotateZ","translateOnAxis","translateX","translateY","translateZ","localToWorld","worldToLocal","isCamera","isLight","removeFromParent","getObjectById","getObjectByProperty","getObjectByName","getObjectsByProperty","getWorldPosition","getWorldQuaternion","getWorldScale","getWorldDirection","raycast","traverseVisible","traverseAncestors","updateParents","updateChildren","shapes","skeletons","library","instanceMatrix","isBatchedMesh","perObjectFrustumCulled","sortObjects","drawRanges","_drawRanges","reservedRanges","_reservedRanges","geometryInfo","_geometryInfo","instanceInfo","_instanceInfo","availableInstanceIds","_availableInstanceIds","availableGeometryIds","_availableGeometryIds","nextIndexStart","_nextIndexStart","nextVertexStart","_nextVertexStart","geometryCount","_geometryCount","maxInstanceCount","_maxInstanceCount","maxVertexCount","_maxVertexCount","maxIndexCount","_maxIndexCount","geometryInitialized","_geometryInitialized","matricesTexture","_matricesTexture","indirectTexture","_indirectTexture","_colorsTexture","colorsTexture","isScene","background","isColor","environment","shape","bindMode","bindMatrix","uuids","extractFromCache","recursive","_v0$1","_v1$3","_v2$2","_v3$2","_vab","_vac","_vbc","_vap","_vbp","_vcp","_v40","_v41","_v42","Triangle","getNormal","targetLengthSq","getBarycoord","dot00","dot01","dot02","dot11","dot12","denom","invDenom","getInterpolation","p3","v3","getInterpolatedAttribute","i2","i3","barycoord","isFrontFacing","setFromPointsAndIndices","i0","setFromAttributeAndIndices","getArea","getMidpoint","getPlane","setFromCoplanarPoints","d4","vc","d5","d6","vb","va","_colorKeywords","_hslA","_hslB","hue2rgb","Color","setHex","setStyle","setHSL","handleAlpha","components","setColorName","copySRGBToLinear","copyLinearToSRGB","convertSRGBToLinear","convertLinearToSRGB","getHex","_color","getHexString","getHSL","hue","saturation","lightness","getRGB","offsetHSL","addColors","color1","color2","lerpColors","lerpHSL","NAMES","_materialId","Material","isMaterial","blending","alphaHash","blendSrc","blendDst","blendEquation","blendSrcAlpha","blendDstAlpha","blendEquationAlpha","blendColor","blendAlpha","depthFunc","stencilWriteMask","stencilFunc","stencilRef","stencilFuncMask","stencilFail","stencilZFail","stencilZPass","stencilWrite","clippingPlanes","clipIntersection","clipShadows","shadowSide","colorWrite","precision","polygonOffset","polygonOffsetFactor","polygonOffsetUnits","dithering","alphaToCoverage","premultipliedAlpha","forceSinglePass","allowOverride","toneMapped","_alphaTest","onBeforeCompile","customProgramCacheKey","specular","shininess","clearcoatMap","clearcoatRoughnessMap","clearcoatNormalMap","sheenColorMap","sheenRoughnessMap","iridescenceMap","iridescenceThicknessMap","anisotropyMap","matcap","alphaMap","lightMap","lightMapIntensity","aoMap","bumpMap","normalMap","normalMapType","displacementMap","displacementScale","displacementBias","roughnessMap","metalnessMap","emissiveMap","specularMap","specularIntensityMap","specularColorMap","envMap","combine","envMapRotation","envMapIntensity","reflectivity","refractionRatio","gradientMap","transmissionMap","thicknessMap","linewidth","dashSize","gapSize","wireframe","wireframeLinewidth","wireframeLinecap","wireframeLinejoin","fog","srcPlanes","dstPlanes","MeshBasicMaterial","isMeshBasicMaterial","_vector$9","_vector2$1","_id$2","BufferAttribute","isBufferAttribute","usage","gpuType","onUploadCallback","setUsage","copyAt","index1","index2","setXY","setXYZ","component","setXYZW","onUpload","Uint16BufferAttribute","Uint32BufferAttribute","Float32BufferAttribute","_id$1","_m1","_obj","_offset","_box$2","_boxMorphTargets","_vector$8","BufferGeometry","isBufferGeometry","indirect","drawRange","setIndirect","getIndirect","deleteAttribute","addGroup","setDrawRange","computeBoundingSphere","morphAttributesPosition","isGLBufferAttribute","morphAttribute","computeTangents","normalAttribute","uvAttribute","tangentAttribute","tan1","tan2","vA","vB","vC","uvA","uvB","uvC","sdir","tdir","handleTriangle","tmp2","n2","handleVertex","computeVertexNormals","pA","pB","pC","nA","nB","nC","cb","normalizeNormals","normals","toNonIndexed","convertBufferAttribute","array2","isInterleavedBufferAttribute","geometry2","newAttribute","morphArray","hasMorphAttributes","attributeArray","_inverseMatrix$3","_ray$3","_sphere$6","_sphereHitAt","_vA$1","_vB$1","_vC$1","_tempA","_morphA","_intersectionPoint","_intersectionPointWorld","Mesh","ml","morphPosition","morphInfluences","influence","raycaster","intersects","_computeIntersections","rayLocalSpace","intersection","uv1","groupMaterial","checkGeometryIntersection","faceIndex","face","checkIntersection$1","BoxGeometry","widthSegments","heightSegments","depthSegments","vertices","uvs","numberOfVertices","groupStart","buildPlane","udir","vdir","gridX","gridY","segmentWidth","segmentHeight","widthHalf","heightHalf","depthHalf","gridX1","gridY1","vertexCounter","groupCount","iy","ix","cloneUniforms","mergeUniforms","uniforms","merged","getUnlitUniformColorSpace","renderer","currentRenderTarget","getRenderTarget","outputColorSpace","isXRRenderTarget","UniformsUtils","ShaderMaterial","isShaderMaterial","defines","uniformsGroups","vertexShader","fragmentShader","clipping","clipCullDistance","multiDraw","defaultAttributeValues","index0AttributeName","uniformsNeedUpdate","glslVersion","cloneUniformsGroups","Camera","_reversedDepth","_v3$1","_minTarget","_maxTarget","PerspectiveCamera","fov","aspect","isPerspectiveCamera","filmGauge","filmOffset","updateProjectionMatrix","setFocalLength","focalLength","vExtentSlope","getFilmHeight","atan","getFocalLength","tan","getEffectiveFOV","getFilmWidth","getViewBounds","minTarget","maxTarget","getViewSize","setViewOffset","clearViewOffset","CubeCamera","activeMipmapLevel","cameraPX","cameraNX","cameraPY","cameraNY","cameraPZ","cameraNZ","updateCoordinateSystem","currentActiveCubeFace","getActiveCubeFace","currentActiveMipmapLevel","getActiveMipmapLevel","currentXrEnabled","xr","setRenderTarget","CubeTexture","isCubeTexture","WebGLCubeRenderTarget","isWebGLCubeRenderTarget","fromEquirectangularTexture","shader","tEquirect","currentMinFilter","stencil","Group","_moveEvent","WebXRController","_targetRay","_grip","_hand","getHandSpace","inputState","pinching","getTargetRaySpace","hasLinearVelocity","linearVelocity","hasAngularVelocity","angularVelocity","getGripSpace","connect","inputSource","hand","inputjoint","_getHandJoint","frame","referenceSpace","inputPose","gripPose","handPose","targetRay","grip","session","jointPose","getJointPose","joint","jointRadius","indexTip","thumbTip","distanceToPinch","handedness","gripSpace","getPose","targetRaySpace","jointName","Scene","backgroundBlurriness","backgroundIntensity","backgroundRotation","environmentIntensity","environmentRotation","overrideMaterial","__THREE_DEVTOOLS__","InterleavedBuffer","isInterleavedBuffer","interleavedBuffer","arrayBuffers","_uuid","_vector$7","InterleavedBufferAttribute","interleavedBuffers","_basePosition","_skinIndex","_skinWeight","_vector3","_matrix4","_vertex","_sphere$5","_inverseMatrix$2","_ray$2","SkinnedMesh","bindMatrixInverse","applyBoneTransform","calculateInverses","pose","skinWeight","weight","boneIndex","Bone","DataTexture","_offsetMatrix","Skeleton","boneMatrices","boneTexture","inverse","bone","computeBoneTexture","getBoneByName","boneInverse","InstancedBufferAttribute","meshPerAttribute","isInstancedBufferAttribute","_instanceLocalMatrix","_instanceWorldMatrix","_instanceIntersects","_box3","_identity","_mesh$1","_sphere$4","InstancedMesh","morphTexture","getMatrixAt","getColorAt","getMorphAt","objectInfluences","dataIndex","raycastTimes","instanceId","setColorAt","setMorphAt","morphInfluencesSum","morphBaseInfluence","_vector1","_vector2","_normalMatrix","Plane","isPlane","setComponents","setFromNormalAndCoplanarPoint","inverseNormalLength","distanceToSphere","projectPoint","intersectLine","intersectsLine","startSign","endSign","coplanarPoint","optionalNormalMatrix","referencePoint","_sphere$3","_defaultSpriteCenter","_vector$6","Frustum","p4","p5","planes","frustum","setFromProjectionMatrix","me0","me1","me2","me3","me4","me5","me6","me7","me8","me9","me10","me11","me12","me13","me14","me15","intersectsObject","intersectsSprite","sprite","negRadius","LineBasicMaterial","isLineBasicMaterial","linecap","linejoin","_vStart","_vEnd","_inverseMatrix$1","_ray$1","_sphere$1","_intersectPointOnRay","_intersectPointOnSegment","Line","computeLineDistances","lineDistances","localThreshold","localThresholdSq","isLineSegments","checkIntersection","isLineLoop","thresholdSq","_start","_end","LineSegments","LineLoop","PointsMaterial","isPointsMaterial","_inverseMatrix","_ray","_sphere","_position$2","Points","testPoint","rayPointDistanceSq","intersectPoint","distanceToRay","DepthTexture","isDepthTexture","compareFunction","ExternalTexture","sourceTexture","isExternalTexture","PlaneGeometry","width_half","height_half","segment_width","segment_height","MeshStandardMaterial","isMeshStandardMaterial","MeshPhysicalMaterial","isMeshPhysicalMaterial","_anisotropy","_clearcoat","_dispersion","_iridescence","_sheen","_transmission","MeshDepthMaterial","isMeshDepthMaterial","depthPacking","MeshDistanceMaterial","isMeshDistanceMaterial","convertArray","getKeyframeOrder","sortedArray","nValues","srcOffset","flattenJSON","jsonKeys","valuePropertyName","Interpolant","_cachedIndex","DefaultSettings_","evaluate","validate_interval","seek","linear_scan","forward_scan","giveUpAt","t1global","mid","intervalChanged_","getSettings_","CubicInterpolant","_weightPrev","_offsetPrev","_weightNext","_offsetNext","endingStart","endingEnd","iPrev","iNext","tPrev","tNext","halfDt","o1","o0","oP","oN","wP","wN","sP","sN","LinearInterpolant","weight1","weight0","DiscreteInterpolant","KeyframeTrack","TimeBufferType","ValueBufferType","setInterpolation","DefaultInterpolation","trackType","ValueTypeName","InterpolantFactoryMethodDiscrete","InterpolantFactoryMethodLinear","InterpolantFactoryMethodSmooth","factoryMethod","timeOffset","timeScale","endTime","nKeys","valid","prevTime","currTime","isView","optimize","smoothInterpolation","writeIndex","keep","offsetP","offsetN","readOffset","writeOffset","BooleanKeyframeTrack","ColorKeyframeTrack","NumberKeyframeTrack","QuaternionLinearInterpolant","QuaternionKeyframeTrack","StringKeyframeTrack","VectorKeyframeTrack","AnimationClip","blendMode","NormalAnimationBlendMode","resetDuration","jsonTracks","frameTime","fps","parseKeyframeTrack","clip","clipTracks","CreateFromMorphTargetSequence","morphTargetSequence","noLoop","numMorphTargets","findByName","objectOrClipArray","clipArray","CreateClipsFromMorphTargetSequences","morphTargets","animationToMorphTargets","morphTarget","animationMorphTargets","clips","parseAnimation","addNonemptyTrack","trackName","animationKeys","destTracks","clipName","hierarchyTracks","hierarchy","morphTargetNames","morphTargetName","animationKey","boneName","typeName","getTrackTypeForValueTypeName","Cache","LoadingManager","urlModifier","itemsLoaded","itemsTotal","onStart","_abortController","setURLModifier","addHandler","removeHandler","abortController","AbortController","DefaultLoadingManager","Loader","loadAsync","setResourcePath","DEFAULT_MATERIAL_NAME","loading","HttpError","FileLoader","req","Request","Headers","credentials","signal","AbortSignal","fetch","ReadableStream","getReader","reader","contentLength","lengthComputable","stream","controller","readData","read","ProgressEvent","enqueue","Response","label","finally","setMimeType","_loading","ImageLoader","onImageLoad","onImageError","TextureLoader","Light","groundColor","decay","_projScreenMatrix$1","_lightPositionWorld$1","_lookTarget$1","LightShadow","bias","normalBias","blurSamples","mapSize","mapType","mapPass","autoUpdate","_frustum","_frameExtents","_viewportCount","_viewports","getViewportCount","getFrustum","updateMatrices","shadowCamera","shadowMatrix","getViewport","viewportIndex","getFrameExtents","SpotLightShadow","isSpotLightShadow","SpotLight","isSpotLight","power","_projScreenMatrix","_lightPositionWorld","_lookTarget","PointLightShadow","isPointLightShadow","_cubeDirections","_cubeUps","PointLight","isPointLight","OrthographicCamera","isOrthographicCamera","scaleW","scaleH","DirectionalLightShadow","isDirectionalLightShadow","DirectionalLight","isDirectionalLight","AmbientLight","isAmbientLight","LoaderUtils","_errorMap","ImageBitmapLoader","fetchOptions","colorSpaceConversion","ArrayCamera","isArrayCamera","isMultiViewCamera","_RESERVED_CHARS_RE","_reservedRe","_wordChar","_wordCharOrDot","_trackRe","_supportedObjectNames","PropertyBinding","rootNode","parsedPath","parseTrackName","findNode","_getValue_unbound","_setValue_unbound","isAnimationObjectGroup","Composite","objectName","objectIndex","propertyIndex","lastDot","searchNodeSubtree","childNode","subTreeNode","_getValue_unavailable","_setValue_unavailable","_getValue_direct","targetObject","_getValue_array","resolvedProperty","_getValue_arrayElement","_getValue_toArray","_setValue_direct","_setValue_direct_setNeedsUpdate","_setValue_direct_setMatrixWorldNeedsUpdate","_setValue_array","_setValue_array_setNeedsUpdate","_setValue_array_setMatrixWorldNeedsUpdate","_setValue_arrayElement","_setValue_arrayElement_setNeedsUpdate","_setValue_arrayElement_setMatrixWorldNeedsUpdate","_setValue_fromArray","_setValue_fromArray_setNeedsUpdate","_setValue_fromArray_setMatrixWorldNeedsUpdate","targetArray","sourceArray","nodeProperty","versioning","Versioning","None","NeedsUpdate","MatrixWorldNeedsUpdate","bindingType","BindingType","Direct","ArrayElement","HasFromToArray","EntireArray","GetterByBindingType","SetterByBindingTypeAndVersioning","targetGroup","optionalParsedPath","_targetGroup","_bindings","subscribe_","firstValidIndex","nCachedObjects_","bindings","Spherical","makeSafe","EPS","setFromCartesianCoords","Controls","domElement","mouseButtons","ONE","TWO","getByteLength","typeByteLength","getTextureTypeByteLength","revision","__THREE__","commentStart","lastEnd","commentEnd","Namespace","ns","symmetricDifference","bgLoad","uniqueUrls","addStyleScript","insertElem","autoplay","er","aC","requireJs","FLAGS_GETTER_IS_CORRECT","INDICES_SUPPORT","calls","addGetter","ignoreCase","multiline","hasIndices","cloneDeep","$indexOf","nativeIndexOf","NEGATIVE_ZERO","searchElement","fromIndex","parseSelector","isUsableColor","trailingPseudos","getSubstitution","REPLACE","maybeToString","REPLACE_KEEPS_$0","REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE","nativeReplace","UNSAFE_SUBSTITUTE","searchValue","replaceValue","functionalReplace","accumulatedResult","nextSourcePosition","replacerArgs","$entries","itemGUID","sortData","updateSortData","getSortData","sorters","_sorters","sorter","_destroy","initialEvent","cloneElementClass","fitSupport","regCssPosition","blankSrc","positionDefaults","onRead","getObject","switchClassesAdded","addedSrc","styleElement","styleElementStyle","lazysizesCfg","rC","loadingClass","loadedClass","rafedOnChange","hideElement","hC","removePrevClone","objectFitClass","generateStyleClass","curSrc","autosizesClass","srcAttr","backgroundRepeat","_objectFitPolyfilledDisplay","initFix","setInterval","integer","defineSymbolToPrimitive","InternalWeakMap","InternalMetadataModule","collectionWeak","isFrozen","isSealed","freeze","seal","IS_IE11","$WeakMap","WeakMapPrototype","nativeSet","nativeDelete","nativeHas","nativeGet","frozenArray","arrayIntegrityLevel","negateValue","numericFunctions","isSubsetOf","_assertThisInitialized","ReferenceError","_inheritsLoose","_suppressOverwrites","_reverting","_globalTimeline","_win","_doc","_coreReady","_lastRenderedFrame","_quickTween","_tickerActive","n1","n3","easeOut","autoSleep","force3D","nullTargetWarn","_defaults","overwrite","_bigNum","_tinyNum","_2PI","_HALF_PI","_gsID","_sqrt","_cos","_sin","_isNumber","_isUndefined","_isObject","_isNotFalse","_isFuncOrString","_isTypedArray","_isArray","_randomExp","_commaDelimExp","_strictNumExp","_numExp","_numWithUnitExp","_complexStringNumExp","_relExp","_delimitedValueExp","_unitExp","_globals","_installScope","_install","_merge","_missingPlugin","_warn","suppress","_addGlobal","_emptyFunc","_startAtRevertConfig","suppressEvents","isStart","_revertConfigNoKill","_revertConfig","_reservedProps","_lazyTweens","_lazyLookup","_plugins","_effects","_nextGCFrame","_harnessPlugins","_callbackNames","_harness","harnessPlugin","_gsap","harness","targetTest","GSCache","_getCache","_getProperty","_forEachName","_round","_roundPrecise","_parseRelative","_arrayContainsAny","toSearch","toFind","_lazyRender","_lazy","_isRevertWorthy","_initted","_startAt","_lazySafeRender","_numericIfPossible","_passThrough","_setDefaults","toMerge","_mergeDeep","_copyExcluding","excluding","_inheritDefaults","excludeDuration","_dp","_addLinkedListItem","firstProp","lastProp","sortBy","_prev","_removeLinkedListItem","_removeFromParent","onlyIfParentHasAutoRemove","autoRemoveChildren","_act","_uncache","_dur","_dirty","_rewindStartAt","totalTime","revert","immediateRender","autoRevert","_hasNoPausedAncestors","_ts","_elapsedCycleDuration","_repeat","_animationCycle","_tTime","_rDelay","tTime","cycleDuration","whole","_parentToChildTotalTime","parentTime","totalDuration","_tDur","_setEnd","_rts","_alignPlayhead","smoothChildTiming","_time","_postAddChecks","timeline","rawTime","_clamp","_zTime","_addToTimeline","skipChecks","_parsePosition","_delay","_sort","_isFromOrFromStart","_recent","_scrollTrigger","_attemptInitTween","_initTween","lazy","_ticker","_parentPlayheadIsBeforeStart","_lock","_ref2","_setDuration","skipUncache","leavePlayhead","dur","totalProgress","_onUpdateTotalDuration","Timeline","_zeroPosition","percentAnimation","isPercent","labels","recent","clippedDuration","_createTweenType","irVars","isLegacy","varsIndex","runBackwards","startAt","_conditionalReturn","getUnit","_slice","_isArrayLike","nonEmpty","leaveStrings","_wake","ar","accumulator","_accumulator","_flatten","nativeElement","shuffle","distribute","ease","_parseEase","isDecimal","ratios","ratioX","ratioY","edges","wrapAt","distances","grid","amount","_invertEase","_roundModifier","snapTo","is2D","increment","roundingIncrement","returnFunction","_wrapArray","_replaceRandom","arIndex","mapRange","inMin","inMax","outMin","outMax","inRange","outRange","_getLabelInDirection","fromTime","backward","_callback","executeLazyFirst","prevContext","_ctx","callbackScope","_interrupt","scrollTrigger","_registerPluginQueue","_createPlugin","headless","isFunc","Plugin","instanceDefaults","_renderPropTweens","_addPropTween","_killPropTweensOf","_addPluginModifier","statics","getSetter","_getSetter","aliases","PropTween","_255","_colorLookup","aqua","silver","maroon","navy","olive","_hue","m2","splitColor","toHSL","forceAlpha","wasHSL","_colorOrderData","_colorExp","_formatColors","orderMatchData","shell","_hslExp","_colorStringFilter","combined","_req","_raf","_self","_delta","_getTime","_lagThreshold","_adjustedLag","_startTime","_lastUpdate","_gap","_nextTime","_tick","overlap","elapsed","manual","deltaRatio","wake","gsapVersions","GreenSockGlobals","sleep","lagSmoothing","adjustedLag","_fps","prioritize","_easeMap","_customEaseExp","_quotesExp","_parseObjectInString","parsedVal","_propagateYoyoEase","isYoyo","_first","yoyoEase","_yoyo","_ease","_yEase","defaultEase","nested","_CE","_configEaseFromString","_insertEase","easeIn","easeInOut","_easeInOutFromOut","_configElastic","amplitude","period","_configBack","overshoot","Linear","easeNone","SteppedEase","steps","immediateStart","repeatDelay","yoyo","_totalTime","_ptLookup","_pTime","iteration","_ps","_recacheAncestors","paused","includeRepeats","wrapRepeats","prevIsReverting","globalTime","_sat","restart","includeDelay","reversed","atTime","invalidate","eventCallback","_onUpdate","prevProm","_prom","_resolve","_then","_Animation","sortChildren","_proto2","fromTo","fromVars","toVars","delayedCall","staggerTo","onCompleteAll","onCompleteAllParams","onCompleteParams","staggerFrom","staggerFromTo","prevPaused","pauseTween","prevStart","prevIteration","tDur","crossingStart","rewinding","doesWrap","repeatRefresh","onRepeat","_hasPause","_forcing","_last","_findNextPauseTween","adjustedTime","addLabel","getChildren","timelines","ignoreBeforeTime","removeLabel","killTweensOf","_totalTime2","addPause","removePause","onlyActive","getTweensOf","_overwritingTween","parsedTargets","isGlobalTime","_targets","tweenTo","initted","tl","_vars","_onStart","onStartParams","tweenFromTo","fromPosition","toPosition","nextLabel","afterTime","previousLabel","beforeTime","currentLabel","shiftChildren","adjustLabels","soft","includeLabels","updateRoot","_forceAllPropTweens","_addComplexStringPropTween","stringFilter","funcParam","startNums","endNum","startNum","hasRandom","_renderComplexString","matchIndex","fp","optional","parsedStart","_setterFuncWithParam","_setterFunc","_setterPlain","_renderBoolean","_renderPlain","_checkPlugin","ptLookup","_parseFuncOrString","_processVars","priority","cleanVars","hasPriority","gsData","harnessVars","prevStartAt","fullTargets","autoOverwrite","_overwrite","_from","_ptCache","_op","_sortPropTweensByPriority","_onInit","_parseKeyframe","allProps","easeEach","_staggerTweenProps","_staggerPropsToSkip","_Animation2","skipInherit","curTarget","staggerFunc","staggerVarsToMerge","_this3$vars","kf","_proto3","isNegative","prevRatio","_renderZeroDurationTween","resetTo","startIsRelative","skipRecursion","rootPT","ptCache","_updatePropTweens","overwrittenProps","curLookup","curOverwriteProps","killingTargets","propTweenLookup","firstPT","_arraysMatch","propertyAliases","_addAliasesToVars","onReverseComplete","onReverseCompleteParams","_setterAttribute","hasNonDependentRemaining","op","dep","_setterWithModifier","mSet","pt2","pr","TweenMax","TweenLite","TimelineLite","TimelineMax","_media","_emptyArray","_lastMediaTime","_contextID","_dispatch","_onMediaChange","anyMatch","toggled","queries","conditions","onMatch","Context","_r","isReverted","_proto5","prevSelector","getTweens","MatchMedia","_proto6","mq","cond","addListener","_len2","_key2","uncache","quickSetter","setters","quickTo","_setDefaults2","isTweening","registerEffect","_ref3","effect","extendTimeline","pluginName","registerEase","parseEase","exportRoot","includeDelayedCalls","matchMediaRefresh","wrapYoyo","functions","unitize","interpolate","mutate","interpolators","master","install","effects","ticker","globalTimeline","getCache","reverting","toAdd","suppressOverwrites","_getPluginPropTween","_buildModifierPlugin","_addModifiers","Power0","Power1","Power2","Power3","Power4","Quad","Cubic","Quart","Quint","Strong","Elastic","Back","Bounce","Sine","Expo","Circ","_docElement","_pluginInitted","_tempDiv","_recentSetterPlugin","_supports3D","_transformProps","_RAD2DEG","_DEG2RAD","_atan2","_capsExp","_horizontalExp","_complexExp","_propertyAliases","autoAlpha","_renderCSSProp","_renderPropWithEnd","_renderCSSPropWithBeginning","_renderCSSPropWithBeginningAndEnd","_renderRoundedCSSProp","_renderNonTweeningValue","_renderNonTweeningValueOnlyAtEnd","_setterCSSStyle","_setterCSSProp","_setterTransform","_setterScale","_setterScaleWithRender","renderTransform","_setterTransformWithRender","_transformProp","_transformOriginProp","_saveStyle","isNotCSS","tfm","_get","zOrigin","svg","svgo","_removeIndependentTransforms","_revertStyle","_getStyleSaver","saver","save","_createElement","_getComputedProperty","skipPrefixFallback","cs","_checkPropPrefix","_prefixes","preferPrefix","_getReparentedCloneBBox","bbox","ownerSVGElement","getBBox","_getAttributeFallbacks","attributesArray","_getBBox","_isSVG","getCTM","_removeProperty","first2Chars","_addNonTweeningPT","beginning","onlySetAtEnd","_nonConvertibleUnits","deg","rad","turn","_nonStandardLayouts","_convertToUnit","isSVG","curUnit","isRootSVG","measureProperty","toPixels","toPercent","_parseTransform","_firstTwoOnly","_specialProps","_tweenComplexCSSString","startValues","startValue","endValue","endUnit","startUnit","_keywordToPercent","_convertKeywordsToPercentages","_renderClearProps","clearTransforms","clearProps","_identity2DMatrix","_rotationalProperties","_isNullTransform","_getComputedTransformMatrixAsArray","matrixString","force2D","addedToDOM","consolidate","_applySVGOrigin","originIsAbsolute","smooth","matrixArray","pluginToAddPropTweensTo","xOriginOld","xOrigin","yOriginOld","yOrigin","xOffsetOld","xOffset","yOffsetOld","yOffset","originSplit","rotationX","rotationY","skewX","skewY","perspective","t2","t3","invertedScaleX","forceCSS","xPercent","yPercent","transformPerspective","_renderSVGTransforms","_renderCSSTransforms","_renderNon3DTransforms","_addPxTranslate","_zeroDeg","_zeroPx","_endParenthesis","transforms","use3D","_addRotationalPropTween","cap","_assign","_addRawTransformPTs","endCache","startCache","CSSPlugin","specialProp","isTransformRelated","transformPropTween","inlineProps","finalTransformValue","origPerspective","parseTransform","smoothOrigin","autoRound","checkPrefix","getStyleSaver","positionAndScale","gsapWithCSS","toPath","$values","PromiseCapability","$$resolve","$$reject","_dereq_","scriptPromiseCache","loadScript","scriptLoadPromise","stringifiedOptions","forceScriptReload","dataAttributes","crossorigin","integrity","clearCache","ua","isEdge","isSamsung","isDuckDuckGo","isOpera","isSilk","detectIncognito","isIos","isGoogleSearchApp","isIosFirefox","webkitRegexp","isWebkit","isIosChrome","isFacebook","isIosGoogleSearchApp","isIosWebview","statusBarVisible","statusbar","isIpadOS","checkIpadOS","iOsTest","isAndroid","isChrome","isSamsungBrowser","isOperaMini","isAndroidWebview","isUnsupportedIosChrome","isOldSamsungBrowserOrSamsungWebview","EventEmitter","eventCallbacks","indexOfCallback","_emit","hasListener","createChild","ChildObject","GlobalPromise","ExtendedPromise","_promise","_resolveFunction","_rejectFunction","_onResolve","onResolve","defaultOnResolve","_onReject","onReject","defaultOnReject","shouldCatchExceptions","_resetState","setPromise","PromiseClass","suppressUnhandledPromiseMessage","allSettled","race","_a","isFulfilled","_setResolved","argForResolveFunction","_setRejected","isResolved","isRejected","set_attributes_1","default_attributes_1","assign_1","defaultAttributes","setAttributes","objs","frameBorder","allowtransparency","promiseOrCallback","deferred_1","once_1","promise_or_callback_1","wrapPromise","wrapPrototype","ignoreMethods","includePrivateMethods","transformPrivateMethods","isNotPrivateMethod","isNonConstructorFunction","isNotAnIgnoredMethod","__awaiter","_arguments","fulfilled","__generator","sent","trys","ops","verb","dist","loadScript$1","loadScript_1$1","loadStylesheet","loadScript_1","stylesheet","_b","FL_NAMESPACE","ASSET_PATH","constants","AXO_ASSET_NAME","minified","unminified","AXO_ASSET_PATH","LOCALE_PATH","CDNX_PROD","AxoSupportedPlatforms","isAmdEnv","amd","safeLoadBtModule","loadConfig","existingVersion","_c","braintree","VERSION","loadBtModule","module_1","amdModule","BtModule","BT_NAMESPACE","BT_ASSET_NAME","btModulesLoadConfig","loadAXOScript","requirejs","paths","moduleName_1","generateAssetUrl","assetUrl","bundleId","loadAxo","btSdkVersion","localeUrl","performance","mark","assetName","bundleIdOverride","getAssetsUrl","getLocaleUrl","platform","hostedFields","__assign","cardTypes","add_matching_cards_to_results_1","is_valid_input_type_1","find_best_match_1","clone_1","customCards","cardNames","VISA","MASTERCARD","AMERICAN_EXPRESS","DINERS_CLUB","DISCOVER","JCB","UNIONPAY","VERVE","MAESTRO","ELO","MIR","HIPER","HIPERCARD","ORIGINAL_TEST_ORDER","testOrder","findType","cardType","getCardPosition","ignoreErrorForNotExisting","creditCardType","cardNumber","isValidInputType","cardConfiguration","addMatchingCardsToResults","bestMatch","findBestMatch","getTypeInfo","removeCard","addCard","existingCardPosition","updateCard","updates","originalObject","clonedCard","changeOrder","currentPosition","resetModifications","matches_1","patternLength","patterns","clonedCardConfiguration","matchStrength","visa","niceType","gaps","lengths","mastercard","jcb","unionpay","maestro","elo","mir","hiper","hipercard","verve","numberOfResultsWithMaxStrengthProperty","hasEnoughResultsToDetermineBestMatch","maxLengthToCheck","integerRepresentationOfCardNumber","matchesRange","matchesPattern","browserName","callbackSettled","__callback","isPrivate","feid","toFixedEngineID","neg","isMSIE","msSaveBlob","eval","assertEvalToString","currentSafariTest","e_1","storage","getDirectory","safariPrivateTest","maxTouchPoints","dbReq","indexedDB","onupgradeneeded","ev","db","priv","createObjectStore","autoIncrement","put","deleteDatabase","safari13to18Test","openDB","openDatabase","setItem","removeItem","oldSafariTest","storageQuotaChromePrivateTest","webkitTemporaryStorage","queryUsageAndQuota","quota","jsHeapSizeLimit","chromePrivateTest","webkitRequestFileSystem","firefoxPrivateTest","e_2","serviceWorker","brave","Framebus","lib_1","DefaultPromise","verifyDomain","targetFrames","limitBroadcastToFramesArray","isDestroyed","hasAdditionalChecksForOnListeners","PromiseGlobal","addTargetFrame","include","childWindow","Window","childWindows","reply","namespaceEvent","isntString","payload","packagePayload","targetFramesAsWindows","sendMessage","broadcast","emitAsPromise","originalHandler","subscriptionArgsInvalid","passesVerifyDomainCheck","hasMatchingTargetFrame","subscribers","subscriberList","checkOrigin","matchingFrame","postMessageOrigin","merchantHost","framebus_1","_1","broadcastToChildWindows","closed","frameToBroadcastTo","hasOpener","frames","__createBinding","k2","__exportStar","unpackPayload","packaged","subscribeReplier","__importDefault","mod","uuid_1","replier","replyOriginHandler","replyOrigin_1","replySource_1","replyEvent_1","replyData","replyPayload","isIE9","isAndroidChrome","isKitKatWebview","UA","isChromeOs","KITKAT_WEBVIEW_REGEX","device_1","BraintreeError","errors","convertMethodsToError","AmericanExpress","_client","getRewardsBalance","_meta","paymentMethodNonce","endpoint","AMEX_NETWORK_ERROR","details","originalError","AMEX_NONCE_REQUIRED","getExpressCheckoutProfile","MERCHANT","NETWORK","basicComponentVerification","createDeferredClient","createAssetsUrl","verify","authorization","debug","assetsUrl","analytics","inIframe","ApplePay","_instantiatedWithClient","useDeferredClient","_createPromise","createPromise","_setMerchantIdentifier","_waitForClient","applePayConfig","getConfiguration","gatewayConfiguration","applePayWeb","merchantIdentifier","createPaymentRequest","paymentRequest","_createPaymentRequestSynchronously","applePay","countryCode","currencyCode","merchantCapabilities","supportedNetworks","network","performValidation","validationURL","applePayWebSession","validationUrl","domainName","hostname","displayName","sendEvent","APPLE_PAY_MERCHANT_VALIDATION_FAILED","APPLE_PAY_MERCHANT_VALIDATION_NETWORK","APPLE_PAY_VALIDATION_URL_REQUIRED","applePaymentToken","paymentData","btoa","applePayCards","APPLE_PAY_TOKENIZATION","APPLE_PAY_PAYMENT_TOKEN_REQUIRED","APPLE_PAY_NOT_ENABLED","applePayInstance","BRAINTREE_VERSION","GraphQL","isVerifiedDomain","convertToBraintreeError","getGatewayConfiguration","createAuthorizationData","GRAPHQL_URLS","assets","FRAUDNET_FNCLS","FRAUDNET_SOURCE","FRAUDNET_URL","cachedClients","Client","configuration","configurationJSON","CLIENT_MISSING_GATEWAY_CONFIGURATION","CLIENT_GATEWAY_CONFIGURATION_INVALID_DOMAIN","_request","_configuration","_clientApiBaseUrl","clientApiUrl","graphQL","_graphQL","initialize","clientInstance","authData","CLIENT_INVALID_AUTHORIZATION","sessionId","isDebug","_findOrCreateFraudnetJSON","clientMetadataId","additionalData","authorizationFingerprint","rda_tenant","merchantId","pieces","cid","bu","requestPromise","optionName","api","baseUrl","requestOptions","shouldCollectData","creditCards","collectDeviceData","CLIENT_OPTION_REQUIRED","analyticsMetadata","addMetadata","CLIENT_OPTION_INVALID","clientSdkMetadata","integration","Authorization","sendAnalyticsEvent","extraFields","sendEventPlus","resolvedData","requestError","CLIENT_REQUEST_TIMEOUT","CLIENT_AUTHORIZATION_INVALID","CLIENT_AUTHORIZATION_INSUFFICIENT","CLIENT_RATE_LIMITED","CLIENT_GATEWAY_NETWORK","CLIENT_REQUEST_ERROR","httpStatus","formatRequestError","CLIENT_GRAPHQL_REQUEST_ERROR","_httpStatus","getVersion","INTERNAL","isDateStringBeforeOrOn","inputSessionId","configUrl","reqOptions","merchantAppId","PLATFORM","sdkVersion","SOURCE","INTEGRATION","integrationType","braintreeLibraryVersion","BRAINTREE_LIBRARY_VERSION","configVersion","date","tokenizationKey","errorTemplate","authorizationType","sharedErrors","INSTANTIATION_OPTION_REQUIRED","querystring","prepBody","parseBody","isXHRAvailable","isAvailable","GraphQLRequest","DefaultRequest","PAYPAL_HERMES_CREATE_PAYMENT_RESOURCE_PATTERN","MERCHANT_ID_PATTERN","_requestWithRetry","tcpRetryCount","resBody","ajaxRequest","parsedBody","analyticsStartTime","getRequestObject","isGraphQLRequest","getUrl","getBody","getHeaders","queryify","adaptResponseBody","determineStatus","cleanedPath","parsedUrl","analyticsConnectionStartTime","analyticsRequestStartTime","analyticsEndTime","finalStartTime","getEntriesByName","connectStart","requestStart","responseEnd","connectionStartTime","requestStartTime","sendApiLatencyAnalytics","errorClass","graphQLRequestShouldRetryWithClientApi","requestShouldRetry","requestOpenError","headerKey","_url","_method","_headers","errorResponseAdapter","cardTypeTransforms","INTERNATIONAL_MAESTRO","SOLO","UK_MAESTRO","UNION_PAY","DINERS","mapCardTypes","cardTypeTransformMap","acc","responseBody","clientConfiguration","analyticsUrl","venmo","supportedFeatures","braintreeApi","supportedCardBrands","fastlane","ideal","creditCard","challenges","challenge","supportedCardTypes","threeDSecureEnabled","threeDSecure","googlePay","androidPay","googleAuthorizationFingerprint","googleAuthorization","paypalClientId","payWithVenmo","accessToken","enrichedCustomerDataEnabled","paypal","paypalEnabled","currencyIsoCode","unionPay","merchantAccountId","visaCheckout","apikey","apiKey","encryptionKey","externalClientId","masterpass","merchantCheckoutId","usBankAccount","routeId","plaid","publicKey","plaidPublicKey","openBanking","businessNames","allowListedDomains","profileId","adaptConfigurationResponseBody","CARD_BRAND_MAP","BIN_DATA_MAP","YES","NO","UNKNOWN","AUTHENTICATION_INSIGHT_MAP","PSDTWO","tokenizeCreditCardForPayPalConnect","paymentMethod","lastTwo","last4","binData","consumed","cardholderName","expirationMonth","expirationYear","bin","brandCode","lastFour","threeDSecureInfo","authenticationInsight","regulationEnvironment","customerAuthenticationRegulationEnvironment","tokenizeCreditCard","addFieldError","inputPath","errorDetail","fieldErrors","fieldError","legacyCode","inputField","candidate","field","getLegacyMessage","buildFieldErrors","userErrorResponseAdapter","errorWithClassResponseAdapter","query","operationName","createCreditCardForFastlaneTokenizationBody","termsAndConditionsVersion","termsAndConditionsCountry","email","optIn","hasBuyerConsent","shippingAddress","variables","cc","billingAddress","expDate","expirationDate","cvv","hasAuthenticationInsight","authenticationInsightInput","addValidationRule","createCreditCardTokenizationBody","ccpcVariables","phone","authAssertion","mutation","tokenize_credit_cards","disallowedInputPaths","getGraphQLEndpoint","featureEnabled","getClientApiPath","_isGraphQLEnabled","containsDisallowedlistedKeys","pathParts","snakeCaseToCamelCase","isFastlaneCheckout","creditCardTokenizationBodyGenerator","creditCardTokenizationResponseAdapter","creditCardTokenizationFastlaneResponseAdapter","creditCardForFastlaneTokenizationBodyGenerator","configurationBodyGenerator","configurationResponseAdapter","generators","isFastlane","adapters","clientApiPath","_clientSdkMetadata","_sendAnalyticsEvent","_generator","_adapter","formatBodyKeys","originalBody","camelCaseKey","formattedBody","generatedBody","parsedResponse","isGraphQLError","AJAXDriver","XDomainRequest","DATA_COLLECTOR_REQUIRES_CREATE_OPTIONS","cachedSessionId","Fraudnet","removeElementIfOnPage","clientSessionId","parameterBlockConfig","beacon","cb1","_parameterBlock","sandbox","block","_thirdPartyBlock","fraudNet","clearSessionIdCache","fraudnet","_instances","_instantiatedWithAClient","fraudnetConfig","riskCorrelationId","correlationId","fraudnetInstance","correlation_id","deviceData","rawDeviceData","createTeardownMethod","getDeviceData","createGetDeviceDataMethod","FASTLANE_SDK_LOAD_ERROR","loadFastlane","platformOptions","_fastlane","GOOGLE_PAYMENT_NOT_ENABLED","GOOGLE_PAYMENT_GATEWAY_ERROR","GOOGLE_PAYMENT_UNSUPPORTED_VERSION","generateGooglePayConfiguration","CREATE_PAYMENT_DATA_REQUEST_METHODS","GooglePayment","_useDeferredClient","_googlePayVersion","googlePayVersion","_googleMerchantId","googleMerchantId","_isUnsupportedGooglePayAPIVersion","_getDefaultConfig","_defaultConfig","_createV1PaymentDataRequest","paymentDataRequest","defaultConfig","overrideCardNetworks","cardRequirements","allowedCardNetworks","defaultConfigCardNetworks","_createV2PaymentDataRequest","allowedPaymentMethods","defaultPaymentMethod","merchantSubmittedPaymentMethod","parameter","applyDefaultsToPaymentMethodConfiguration","createPaymentDataRequest","_createPaymentDataRequestSyncronously","createPaymentDataRequestMethod","transactionInfo","totalPrice","parseResponse","rawResponse","apiVersion","paymentMethodData","tokenizationData","paymentMethodToken","paypalAccounts","androidPayCards","isNetworkTokenized","allowedAttributes","_isValid","HOSTED_FIELDS_ATTRIBUTE_VALUE_NOT_ALLOWED","HOSTED_FIELDS_ATTRIBUTE_NOT_SUPPORTED","useMin","componentId","directions","navigationDirections","browserDetection","focusIntercept","findParentTags","userFocusableTagNames","unfocusedInputTypes","_isUserFocusableElement","hasSoftwareKeyboard","_findFirstFocusableElement","elementsInForm","elementsIndex","removeExtraFocusElements","checkoutForm","onRemoveFocusIntercepts","matchFocusElement","createFocusChangeHandler","hostedFieldsId","currentIndex","targetElement","navHelper","sourceElement","forms","numberOfElementsInForm","BACK","checkIndexBounds","indexChange","FORWARD","_createNavigationHelper","onTriggerInputFocus","allowedStyles","cssClass","computedStyles","Destructor","iFramer","Bus","composeUrl","getStylesFromClass","INTEGRATION_TIMEOUT_MS","injectFrame","allowedFields","findRootNode","getCardTypes","attributeValidationError","focusChange","destroyFocusIntercept","HostedFields","failureTimeout","clientConfig","hostedFieldsUrl","frameReadyPromiseResolveFunctions","frameReadyPromises","_merchantConfigurationOptions","_clientPromise","_injectedNodes","_destructor","_fields","_state","cards","_bus","registerFunctionForTeardown","externalContainer","internalContainer","frameReadyPromise","HOSTED_FIELDS_INVALID_FIELD_KEY","HOSTED_FIELDS_INVALID_FIELD_SELECTOR","fieldSelector","fieldContainer","fieldKey","HOSTED_FIELDS_FIELD_DUPLICATE_IFRAME","isShadowElement","transformToSlot","maxlength","HOSTED_FIELDS_FIELD_PROPERTY_INVALID","minlength","defaultIFrameStyle","iframeTitle","_setupLabelFocus","frameElement","containerElement","isValid","isPotentiallyValid","isFocused","REMOVE_FOCUS_INTERCEPTS","TRIGGER_FOCUS_CHANGE","targetType","READY_FOR_CLIENT","CARD_FORM_ENTRY_HAS_BEGUN","BIN_AVAILABLE","formattedConfig","_cleanUpFocusIntercepts","FRAME_READY","INPUT_EVENT","merchantPayload","emittedBy","externalClasses","FOCUSED","VALID","INVALID","createInputEventHandler","methodNames","triggerFocus","_getAnyFieldContainer","iframeContainer","_attachInvalidFieldContainersToError","invalidFieldKeys","invalidFields","getChallenges","getSupportedCardTypes","TOKENIZATION_REQUEST","classname","ADD_CLASS","HOSTED_FIELDS_FIELD_NOT_PRESENT","HOSTED_FIELDS_FIELD_INVALID","REMOVE_CLASS","attributeErr","SET_ATTRIBUTE","setMonthOptions","errorMessage","merchantOptions","SET_MONTH_OPTIONS","setMessage","SET_MESSAGE","REMOVE_ATTRIBUTE","setPlaceholder","placeholder","CLEAR_FIELD","fieldConfig","TRIGGER_INPUT_FOCUS","verticalMidpoint","horizontalMidpoint","scrollIntoView","focusHandler","frameType","clearboth","focusInterceptBefore","generate","focusInterceptAfter","supportsInputFormatting","HOSTED_FIELDS_TIMEOUT","isChromeOS","isIosSafari","isChromeIos","enumerate","maxExpirationYearAge","externalEvents","FOCUS","BLUR","EMPTY","NOT_EMPTY","VALIDITY_CHANGE","CARD_TYPE_CHANGE","defaultMaxLengths","postalCode","float","tokenizationErrorCodes","HOSTED_FIELDS_TOKENIZATION_FAIL_ON_DUPLICATE","HOSTED_FIELDS_TOKENIZATION_CVV_VERIFICATION_FAILED","allowedBillingAddressFields","allowedShippingAddressFields","autocompleteMappings","expiration","HOSTED_FIELDS_TOKENIZATION_NETWORK_ERROR","CUSTOMER","HOSTED_FIELDS_FAILED_TOKENIZATION","HOSTED_FIELDS_FIELDS_EMPTY","HOSTED_FIELDS_FIELDS_INVALID","idString","focusInputs","idComponents","hasBTPrefix","isAllowedType","isValidDirection","card","americanExpress","dataCollector","localPayment","instantVerification","paymentReady","paypalCheckout","googlePayment","sepa","vaultManager","preferredPaymentMethods","EXPERIENCE_URL","production","ACH_MANDATE_DETAILS_QUERY","INSTANT_VERIFICATION_ERROR","INSTANT_VERIFICATION_NOT_ENABLED","INSTANT_VERIFICATION_CANCELED","INSTANT_VERIFICATION_FAILURE","INSTANT_VERIFICATION_JWT_REQUIRED","INSTANT_VERIFICATION_MANDATE_ID_REQUIRED","INSTANT_VERIFICATION_MANDATE_DETAILS_FAILED","InstantVerification","startPayment","clientAuthFingerprint","redirectUrl","jwt","handleRedirect","tokenizedAccounts","tokenized_account","cancel","getAchMandateDetails","mandateId","accountHolderName","nodeData","accountholderName","accountType","bankName","ownershipType","routingNumber","jsonClone","authAttrs","addEventMetadata","clientInstanceOrPromise","isProd","api_integration_type","app_id","c_sdk_ver","merchant_sdk_env","merchant_id","event_source","platform_version","session_id","client_session_id","tenant_name","product_name","space_key","tokenization_key","auth_fingerprint","sendPaypalEventPlusFields","timestamp","flow","context_type","ANALYTICS_URL","qualifiedEvent","ANALYTICS_PREFIX","tracking","trackingMeta","event_name","level","appendExtraFieldsTo","ANALYTICS_REQUEST_TIMEOUT_MS","allowedExtraFields","ALLOWED_EXTRA_EVENT_FIELDS","loadConnectScript","assignNormalized","assignPolyfill","destination","INCOMPATIBLE_VERSIONS","INVALID_USE_OF_INTERNAL_FUNCTION","findRootError","ASSETS_URLS","CLIENT_API_URLS","BUS_CONFIGURATION_REQUEST_EVENT","METHOD_CALLED_AFTER_TEARDOWN","originalErr","btErrorObject","parsedClientToken","parsedTokenizationKey","CLIENT_SCRIPT_FAILED_TO_LOAD","batchExecuteFunctions","_teardownRegistry","_isTearingDown","enumeration","Popup","PopupBridge","Modal","REQUIRED_CONFIG_KEYS","FrameService","_validateFrameConfiguration","_serviceId","_options","dispatchFrameUrl","openFrameUrl","_setBusEvents","dispatchFrameReadyHandler","DISPATCH_FRAME_READY","_writeDispatchFrame","frameName","DISPATCH_FRAME_NAME","frameSrc","_dispatchFrame","DISPATCH_FRAME_CLASS","DISPATCH_FRAME_REPORT","_onCompleteCallback","_frame","_getFrameForEnvironment","isFrameClosed","_cleanupFrame","FRAME_SERVICE_FRAME_OPEN_FAILED","_pollForPopupClose","redirect","createHandler","beforeClose","beforeFocus","createNoopHandler","isClosed","clearInterval","_popupInterval","FRAME_SERVICE_FRAME_CLOSED","POPUP_POLL_INTERVAL","usePopup","supportsPopups","popupBridgeExists","popupBridge","initOptions","frameService","ELEMENT_STYLES","outline","_closed","iframerConfig","isIosWKWebview","_lockScrolling","_el","_unlockScrolling","_savedBodyProperties","overflowStyle","positionStyle","popupDismissed","calculatePosition","userDefinedPosition","DEFAULT_POPUP_HEIGHT","DEFAULT_POPUP_WIDTH","POPUP_BASE_OPTIONS","composeOptions","windowMetric","popupMetric","screenTop","screenLeft","POPUP_CLOSE_TIMEOUT","generateTokenizationParameters","basicTokenizationParameters","gateway","paypalPaymentMethod","androidPayConfiguration","apiVersionMinor","allowedAuthMethods","tokenizationSpecification","merchantInfo","purchase_context","purchase_units","payee","client_id","recurring_payment","paymentMethodTokenizationParameters","tokenizationType","convertDateStringToDate","dateString","splitDate","firstDate","secondDate","creditCardDetails","isHTTPS","legalHosts","mainDomain","hasQueryParams","toReturn","keyValue","decodeURIComponent","_notEmpty","getShadowHost","styleNode","shadowHost","slotName","slot","slotProvider","sheet","insertRule","snakeString","getUrlParams","atobNormalized","atobPolyfill","base64String","b3","characters","_atob","REQUIRED_OPTIONS_FOR_START_PAYMENT","REQUIRED_OPTIONS_FOR_PAY_UPON_INVOICE_PAYMENT_TYPE","REQUIRED_OPTIONS_FOR_ADDRESS","REQUIRED_OPTIONS_FOR_LINE_ITEMS","REQUIRED_OPTIONS_FOR_BLIK_SEAMLESS_PAYMENT_TYPE","REQUIRED_OPTIONS_FOR_BLIK_OPTIONS_LEVEL_0","REQUIRED_OPTIONS_FOR_BLIK_OPTIONS_ONE_CLICK_FIRST","REQUIRED_OPTIONS_FOR_BLIK_OPTIONS_ONE_CLICK_SUBSEQUENT","base64Data","imageElement","LOCAL_PAYMENT_QR_CODE_INVALID_DATA","LOCAL_PAYMENT_QR_CODE_INVALID_CONTAINER","isMobileDevice","injectQrCode","LocalPayment","_assetsUrl","_isDebug","_loadingFrameUrl","_authorizationInProgress","_paymentType","_merchantAccountId","_redirectUrl","_isRedirectFlow","isDeferredPaymentTypeOptions","blikOptions","paymentType","swishOptions","requestQrCode","hasMissingAddressOption","hasMissingLineItemsOption","hasMissingOption","missingAddressOption","missingLineItemOption","requiredSwishOptions","qrContainer","returnUrl","hasMissingSwishOptions","oneClick","level_0","hasMissingBlikOptions","buttonText","recurrent","customerId","_initialize","service","_frameService","missingOption","missingError","address","windowOptions","onPaymentStartPromise","serviceId","cancelUrl","LOCAL_PAYMENT_START_PAYMENT_MISSING_REQUIRED_OPTION","LOCAL_PAYMENT_QR_CODE_NOT_SUPPORTED","line1","streetAddress","line2","extendedAddress","city","locality","region","birthDate","discountAmount","experienceProfile","brandName","customerServiceInstructions","locale","noShipping","shippingAddressRequired","firstName","givenName","fundingSource","intent","lastName","surname","lineItems","merchantOrPartnerCustomerId","payerEmail","paymentTypeCountryCode","phoneCountryCode","shippingAmount","redirectToApp","wasCanceled","cancelButtonText","LOCAL_PAYMENT_ALREADY_IN_PROGRESS","_startPaymentCallback","_createStartPaymentCallback","paymentResource","_startPaymentOptions","qrDetails","qrImage","isSwishQrFlow","injectError","onPaymentStart","paymentId","paymentToken","LOCAL_PAYMENT_START_PAYMENT_DEFERRED_PAYMENT_FAILED","_redirectToPaymentResource","LOCAL_PAYMENT_START_PAYMENT_FAILED","LOCAL_PAYMENT_INVALID_PAYMENT_OPTION","queryItems","LOCAL_PAYMENT_CANCELED","errorcode","btLpToken","_formatTokenizeData","_formatTokenizePayload","LOCAL_PAYMENT_TOKENIZATION_FAILED","closeWindow","_authoriztionInProgress","focusWindow","LOCAL_PAYMENT_WINDOW_CLOSED","LOCAL_PAYMENT_WINDOW_OPEN_FAILED","account","payerInfo","hasTokenizationParams","btLpPaymentId","btLpPayerId","paypalAccount","payerId","PayerID","unilateral","unvettedMerchant","localPaymentInstance","LOCAL_PAYMENT_NOT_ENABLED","tokenizePayload","LOCAL_PAYMENT_QR_CODE_CONTAINER_NOT_FOUND","Masterpass","_authInProgress","getReturnUrlPrefix","_callbackUrl","LANDING_FRAME_NAME","POPUP_HEIGHT","POPUP_WIDTH","REQUIRED_OPTIONS_FOR_TOKENIZE","MASTERPASS_TOKENIZE_MISSING_REQUIRED_OPTION","MASTERPASS_TOKENIZATION_ALREADY_IN_PROGRESS","_navigateFrameToLoadingPage","frameOptions","_createFrameOpenHandler","requestToken","originUrl","subtotal","callbackUrl","queryParams","allowedCardTypes","MASTERPASS_VERSION","_closeWindow","MASTERPASS_INVALID_PAYMENT_OPTION","MASTERPASS_FLOW_FAILED","popupBridgeErr","MASTERPASS_POPUP_CLOSED","_tokenizeMasterpass","frameServiceErr","MASTERPASS_POPUP_OPEN_FAILED","mpstatus","oauth_verifier","oauth_token","checkout_resource_url","isMissingRequiredPayload","MASTERPASS_POPUP_MISSING_REQUIRED_PARAMETERS","masterpassCard","checkoutResourceUrl","verifierToken","masterpassCards","tokenizeErr","MASTERPASS_ACCOUNT_TOKENIZATION_FAILED","isSupported","MASTERPASS_BROWSER_NOT_SUPPORTED","MASTERPASS_NOT_ENABLED","CREATE_PAYMENT_READY_SESSION_QUERY","BUTTON_ORDER","FIRST","SECOND","THIRD","FOURTH","FIFTH","SIXTH","SEVENTH","EIGHT","OTHER","BUTTON_TYPE","PAYPAL","VENMO","EVENT_BUTTON_PRESENTED","EVENT_BUTTON_SELECTED","EXPERIMENT_TYPE","CONTROL","TEST","PAGE_TYPE","HOMEPAGE","ABOUT","PRODUCT_CATEGORY","PRODUCT_DETAILS","CART","CHECKOUT","ORDER_REVIEW","ORDER_CONFIRMATION","MINICART","UPDATE_PAYMENT_READY_SESSION_QUERY","GENERATE_CUSTOMER_RECOMMENDATIONS_QUERY","REQUIRED_OPTIONS_CREATE_SESSION","REQUIRED_OPTIONS_UPDATE_SESSION","REQUIRED_OPTIONS_GET_RECOMMENDATIONS","PAYMENT_READY_ERROR","PAYMENT_READY_MISSING_REQUIRED_OPTION","PAYMENT_READY_CREATE_SESSION_ERROR","PAYMENT_READY_UPDATE_SESSION_ERROR","PAYMENT_READY_NO_SESSION_ID","PAYMENT_READY_GET_RECOMMENDATIONS_ERROR","PaymentReady","createCustomerSession","customer","updateCustomerSession","getCustomerRecommendations","purchaseUnits","generateCustomerRecommendations","sendPresentedEvent","experimentType","presentmentDetails","pageType","buttonOrder","paymentReadySessionId","buttonType","presentAnalyticFields","buttonSelected","pkg","button_type","payment_ready_session_id","buildPresentmentAnalyticFields","sendSelectedEvent","CARD_TYPE_MAPPINGS","Visa","MasterCard","Discover","UnionPay","Maestro","PaymentRequestComponent","enabledPaymentMethods","_componentId","_enabledPaymentMethods","basicCard","_supportedPaymentMethods","_constructDefaultSupportedPaymentMethods","_defaultSupportedPaymentMethods","supportedPaymentMethods","supportedMethods","allowPaymentRequest","PAYMENT_REQUEST_NO_VALID_SUPPORTED_PAYMENT_METHODS","FRAME_CAN_MAKE_REQUESTS","SHIPPING_ADDRESS_CHANGE","shippingAddressChangeEvent","updateWith","paymentDetails","UPDATE_SHIPPING_ADDRESS","SHIPPING_OPTION_CHANGE","shippingOption","shippingOptionChangeEvent","UPDATE_SHIPPING_OPTION","createSupportedPaymentMethodsConfiguration","PAYMENT_REQUEST_CREATE_SUPPORTED_PAYMENT_METHODS_CONFIGURATION_MUST_INCLUDE_TYPE","PAYMENT_REQUEST_CREATE_SUPPORTED_PAYMENT_METHODS_CONFIGURATION_TYPE_NOT_ENABLED","PAYMENT_REQUEST_INITIALIZED","rawError","_formatTokenizationError","rawPaymentResponse","canMakePayment","unsupportedPaymentMethod","PaymentRequest","SUPPORTED_METHODS","PAYMENT_REQUEST_UNSUPPORTED_PAYMENT_METHOD","CAN_MAKE_PAYMENT","_formatCanMakePaymentError","formattedError","PAYMENT_REQUEST_CANCELED","PAYMENT_REQUEST_INITIALIZATION_MISCONFIGURED","PAYMENT_REQUEST_GOOGLE_PAYMENT_FAILED_TO_TOKENIZE","PAYMENT_REQUEST_GOOGLE_PAYMENT_PARSING_ERROR","PAYMENT_REQUEST_NOT_COMPLETED","PAYMENT_REQUEST_CAN_MAKE_PAYMENT_NOT_ALLOWED","PAYMENT_REQUEST_CAN_MAKE_PAYMENT_FAILED","PAYPAL_NOT_ENABLED","PAYPAL_SANDBOX_ACCOUNT_NOT_LINKED","PAYPAL_ACCOUNT_TOKENIZATION_FAILED","PAYPAL_FLOW_FAILED","PAYPAL_FLOW_OPTION_REQUIRED","PAYPAL_START_VAULT_INITIATED_CHECKOUT_PARAM_REQUIRED","PAYPAL_START_VAULT_INITIATED_CHECKOUT_SETUP_FAILED","PAYPAL_START_VAULT_INITIATED_CHECKOUT_POPUP_OPEN_FAILED","PAYPAL_START_VAULT_INITIATED_CHECKOUT_CANCELED","PAYPAL_START_VAULT_INITIATED_CHECKOUT_IN_PROGRESS","PAYPAL_INVALID_PAYMENT_OPTION","PAYPAL_MISSING_REQUIRED_OPTION","PayPalCheckout","REQUIRED_PARAMS_FOR_START_VAULT_INITIATED_CHECKOUT","_autoSetDataUserIdToken","autoSetDataUserIdToken","_authorizationInformation","fingerprint","environmentNoNetwork","_setupError","_frameServicePromise","_setupFrameService","frameServicePromise","timeoutRef","createPayment","FLOW_ENDPOINTS","_createPaymentResource","flowToken","agreementSetup","tokenId","_contextId","_flow","intentFromCreatePayment","offerCredit","_formatPaymentResourceData","updatePayment","_hasMissingOption","REQUIRED_OPTIONS","context_id","_verifyConsistentCurrency","_formatUpdatePaymentData","startVaultInitiatedCheckout","missingRequiredParam","_vaultInitiatedCheckoutInProgress","_addModalBackdrop","_waitForVaultInitiatedCheckoutDependencies","frameCommunicationPromise","startVaultInitiatedCheckoutPromise","_constructVaultCheckoutUrl","_createFrameServiceCallback","_removeModalBackdrop","optOutOfModalBackdrop","_modalBackdrop","focusVaultInitiatedCheckoutWindow","closeVaultInitiatedCheckoutWindow","tokenizePayment","payerID","paymentID","orderID","orderId","tokenizationError","tokenizeOptions","shouldVault","ecToken","billingToken","shippingOptionsId","vault","creditFinancingOffered","getClientId","clientId","loadPayPalSDK","loadPromise","userIdToken","BT_INTEGRATION_SOURCE","_paypalScript","currency","_attachPreloadPixel","subdomain","preloadOptions","offerPaypalCredit","localeCode","enableShippingAddress","addressOverride","shippingAddressEditable","landingPageType","shippingOptions","payer_email","userAuthenticationEmail","appSwitchPreference","shippingCallbackUrl","amountBreakdown","planType","planMetadata","_formatPlanMetadata","_formatPaymentResourceCheckoutData","_formatPaymentResourceVaultData","_riskCorrelationId","shippingAddressOverride","billingAgreementDescription","userAction","requestBillingAgreement","vaultInitiatedCheckoutPaymentMethodToken","contactPreference","billingAgreementDetails","plan","billingCycle","formattedBillingCycle","planProperties","requiredbillingCycle","formattedPlan","billingCycles","recipientName","isTokenizationKey","isVaultFlow","billingAgreementToken","shippingOptionId","cobrandedCardLabel","PayPal","tokenizePromise","optionError","PAYPAL_TOKENIZATION_REQUEST_ACTIVE","offerPayLater","_navigateFrameToAuth","PAYPAL_POPUP_CLOSED","_tokenizePayPal","PAYPAL_POPUP_OPEN_FAILED","ba_token","approvalUrl","useraction","checkout","stage","teBraintree","PreferredPaymentMethods","fetchPreferredPaymentMethods","paypalPreferred","venmoPreferred","sepaErrors","billingAddressOptions","BILLING_ADDRESS_OPTIONS","handleApproval","sepa_debit_account","last_4","merchant_or_partner_customer_id","bank_reference_token","bankReferenceToken","mandate_type","mandateType","merchant_account_id","SEPA_TRANSACTION_FAILED","ibanLastFour","createMandate","sepa_debit","account_holder_name","billing_address","country_code","iban","cancel_url","return_url","ccOption","sepaDebitAccount","SEPA_CREATE_MANDATE_FAILED","openPopup","assetsBaseUrl","popupLocation","frameServiceInstance","mandateApproved","customerCanceled","SEPA_CUSTOMER_CANCELED","SEPA_TOKENIZATION_FAILED","redirectPage","handleApprovalForFullPageRedirect","cart_id","sepaDebitMandateDetail","mandates","SEPA","_returnUrl","_cancelUrl","popupPromise","createMandateOptions","SEPA_TOKENIZE_MISSING_REQUIRED_OPTION","MANDATE_TYPE_ENUM","mandateResponse","approval","SEPA_INVALID_MANDATE_TYPE","mandate","sepaInstance","BaseFramework","_createOptions","setUpEventListeners","THREEDS_FRAMEWORK_METHOD_NOT_IMPLEMENTED","verifyCard","privateOptions","formattedOptions","_checkForVerifyCardError","_verifyCardInProgress","_formatVerifyCardOptions","_formatLookupData","_performLookup","threeDSecureVersion","_onLookupComplete","initializeChallengeWithLookupResponse","_resetVerificationState","_checkForFrameworkSpecificVerifyCardErrors","_presentChallenge","prepareLookup","_verifyCardPromisePlus","_reloadThreeDSecure","lookupError","analyticsMessage","THREEDS_LOOKUP_TOKENIZED_CARD_NOT_FOUND_ERROR","THREEDS_LOOKUP_VALIDATION_ERROR","THREEDS_LOOKUP_ERROR","_existsAndIsNumeric","errorOption","THREEDS_AUTHENTICATION_IN_PROGRESS","THREEDS_MISSING_VERIFY_CARD_OPTION","lookupResponse","_lookupPaymentMethod","_handleLookupResponse","liabilityShifted","liabilityShiftPossible","challengeShouldBePresented","acsUrl","_formatAuthResponse","verificationDetails","browserColorDepth","colorDepth","browserJavaEnabled","javaEnabled","browserJavascriptEnabled","browserLanguage","language","browserScreenHeight","browserScreenWidth","browserTimeZone","getTimezoneOffset","deviceChannel","_handleV1AuthResponse","authResponse","auth_response","cancelVerifyCard","THREEDS_NO_VERIFICATION_PAYLOAD","_setupV1Bus","parentURL","bus","authenticationCompleteBaseUrl","pareq","termUrl","parentUrl","AUTHENTICATION_COMPLETE","handleAuthResponse","_setupV1Iframe","showLoader","_v1Bus","_setupV1Elements","_v1Iframe","_teardownV1Elements","_onV1Keyup","SongbirdFramework","Bootstrap3ModalFramework","_createV1IframeModalElement","modal","_createCardinalConfigurationOptions","setupOptions","payment","framework","CardinalModalFramework","addCloseButton","cardinalSDKConfig","displayExitButton","InlineIframeFramework","AUTHENTICATION_IFRAME_AVAILABLE","_addV1IframeToPage","_v1Modal","_setupFrameworkSpecificListeners","setCardinalListener","_onInlineSetup","htmlTemplate","hasError","THREEDS_INLINE_IFRAME_DETAILS_INCORRECT","SONGBIRD_UI_EVENTS","SCA_EXEMPTION_TYPES","_songbirdInitFailed","_clientMetadata","requestedThreeDSecureVersion","originalSetupOptions","_getDfReferenceIdPromisePlus","setupSongbird","_cardinalEvents","extractAddressData","line3","countryCodeAlpha2","LOOKUP_COMPLETE","CUSTOMER_CANCELED","getDfReferenceId","dfReferenceId","_triggerCardinalBinProcess","clientMetadata","handleSongbirdError","errorType","_removeSongbirdListeners","_songbirdPromise","issuerStartTime","Cardinal","binResults","issuerDeviceDataCollectionTimeElapsed","issuerDeviceDataCollectionResult","Status","transformBillingAddress","additionalInformation","billingPhoneNumber","phoneNumber","billingGivenName","billingSurname","transformShippingAddress","_createV1IframeModal","btn","backdrop","closeHandler","THREEDS_CARDINAL_SDK_CANCELED","_v2SetupFailureReason","_loadCardinalScript","_configureCardinalSdk","setupStartTime","THREEDS_CARDINAL_SDK_SETUP_FAILED","_songbirdSetupTimeoutReference","threeDSConfig","cardinalAuthenticationJWT","cardinalConfiguration","_createPaymentsSetupCompleteCallback","configure","cardinalDeviceDataCollectionTimeElapsed","_createPaymentsValidatedCallback","paymentSettings","logging","loggingEnabled","displayLoading","identityHash","cardinalSongbirdUrl","cardinalSongbirdIdentityHash","THREEDS_CARDINAL_SDK_SCRIPT_LOAD_FAILED","_performJWTValidation","rawCardinalSDKVerificationData","cancelCode","Payment","ExtendedData","ChallengeCancel","formattedResponse","THREEDS_JWT_AUTHENTICATION_FAILED","validatedJwt","ActionCode","ErrorNumber","THREEDS_CARDINAL_SDK_SETUP_TIMEDOUT","THREEDS_CARDINAL_SDK_RESPONSE_TIMEDOUT","THREEDS_CARDINAL_SDK_BAD_CONFIG","THREEDS_CARDINAL_SDK_BAD_JWT","THREEDS_CARDINAL_SDK_ERROR","ErrorDescription","onLookupComplete","ignoreOnLookupCompleteRequirement","modifiedOptions","mobilePhoneNumber","requiresUserAuthentication","transactionId","continue","AcsUrl","Payload","OrderDetails","TransactionId","additionalInfo","challengeRequested","requestedExemptionType","THREEDS_REQUESTED_EXEMPTION_TYPE_INVALID","customFields","dataOnlyRequested","exemptionRequested","requestVisaDAF","cardAdd","cardAddChallengeRequested","merchantName","verifyCardError","THREEDS_VERIFY_CARD_CANCELED_BY_MERCHANT","FRAMEWORKS","ThreeDSecure","Framework","_framework","THREEDS_UNSUPPORTED_VERSION","THREEDS_UNRECOGNIZED_VERSION","getFramework","gwConfig","THREEDS_NOT_ENABLED","THREEDS_CAN_NOT_USE_TOKENIZATION_KEY","THREEDS_HTTPS_REQUIRED","THREEDS_NOT_ENABLED_FOR_V2","THREEDS_TERM_URL_REQUIRES_BRAINTREE_DOMAIN","UNIONPAY_NOT_ENABLED","HOSTED_FIELDS_FRAME_NAME","UNIONPAY_HOSTED_FIELDS_INSTANCE_INVALID","UNIONPAY_HOSTED_FIELDS_INSTANCE_REQUIRED","UNIONPAY_CARD_OR_HOSTED_FIELDS_INSTANCE_REQUIRED","UNIONPAY_CARD_AND_HOSTED_FIELDS_INSTANCES","UNIONPAY_EXPIRATION_DATE_INCOMPLETE","UNIONPAY_ENROLLMENT_CUSTOMER_INPUT_INVALID","UNIONPAY_ENROLLMENT_NETWORK_ERROR","UNIONPAY_FETCH_CAPABILITIES_NETWORK_ERROR","UNIONPAY_TOKENIZATION_NETWORK_ERROR","UNIONPAY_MISSING_MOBILE_PHONE_DATA","UNIONPAY_FAILED_TOKENIZATION","fetchCapabilities","_initializeHostedFields","HOSTED_FIELDS_FETCH_CAPABILITIES","enroll","mobile","HOSTED_FIELDS_ENROLL","unionPayEnrollment","mobileCountryCode","mobileNumber","enrollmentId","unionPayEnrollmentId","smsCodeRequired","smsCode","tokenizedCard","HOSTED_FIELDS_TOKENIZE","_hostedFieldsFrame","_hostedFieldsInitializePromise","PLAID_LINK_JS","US_BANK_ACCOUNT_OPTION_REQUIRED","US_BANK_ACCOUNT_MUTUALLY_EXCLUSIVE_OPTIONS","US_BANK_ACCOUNT_LOGIN_LOAD_FAILED","US_BANK_ACCOUNT_LOGIN_CLOSED","US_BANK_ACCOUNT_LOGIN_REQUEST_ACTIVE","US_BANK_ACCOUNT_TOKENIZATION_NETWORK_ERROR","US_BANK_ACCOUNT_FAILED_TOKENIZATION","US_BANK_ACCOUNT_NOT_ENABLED","US_BANK_ACCOUNT_BANK_LOGIN_NOT_ENABLED","USBankAccount","TOKENIZE_BANK_DETAILS_MUTATION","createGraphQLMutation","TOKENIZE_BANK_LOGIN_MUTATION","_isTokenizingBankLogin","errorFrom","BRAINTREE_API_ACCESS_RESTRICTED","formatTokenizeResponseFromGraphQL","addLoadListeners","loadHandler","Plaid","formatBillingAddressForGraphQL","zipCode","formatDataForOwnershipType","individualOwner","businessOwner","businessName","mandateText","bankDetails","bankLogin","_tokenizeBankDetails","_tokenizeBankLogin","achMandate","accountNumber","isProduction","plaidConfig","_loadPlaid","plaidLoadErr","clientName","product","selectAccount","onExit","onSuccess","publicToken","accountId","account_id","subtype","usBankLogin","existingScript","_plaidScript","VAULT_MANAGER_DELETE_PAYMENT_METHOD_NONCE_REQUIRES_CLIENT_TOKEN","VAULT_MANAGER_PAYMENT_METHOD_NONCE_NOT_FOUND","VAULT_MANAGER_DELETE_PAYMENT_METHOD_UNKNOWN_ERROR","VaultManager","formatPaymentMethodPayload","formattedPaymentMethod","hasSubscription","fetchPaymentMethods","defaultFirst","paymentMethodsPayload","paymentMethods","deletePaymentMethod","singleUseTokenId","venmo_desktop_1","VENMO_PAYMENT_CONTEXT_STATUS_QUERY","LEGACY_VENMO_PAYMENT_CONTEXT_STATUS_QUERY","UPDATE_PAYMENT_CONTEXT_QUERY","LEGACY_UPDATE_PAYMENT_CONTEXT_QUERY","CREATE_PAYMENT_CONTEXT_QUERY","LEGACY_CREATE_PAYMENT_CONTEXT_QUERY","iframer_1","events_1","queries_1","VenmoDesktop","paymentMethodUsage","shouldUseLegacyQRCodeMutation","frameUrl","apiRequest","alertBox","VENMO_DESKTOP_IFRAME_READY","VENMO_DESKTOP_REQUEST_NEW_QR_CODE","startPolling","launchDesktopFlow","launchDesktopPromiseRejectFunction","removeListeners","VENMO_DESKTOP_CUSTOMER_CANCELED","customerCancelledHandler","VENMO_DESKTOP_UNKNOWN_ERROR","unknownErrorHandler","allowUIToHandleError","updateVenmoDesktopPaymentContext","completedHandler","setAlert","venmoContextId","triggerCompleted","triggerRejected","hideDesktopFlow","VENMO_DESKTOP_CLOSED_FROM_PARENT","displayError","VENMO_DESKTOP_DISPLAY_ERROR","displayQRCode","VENMO_DESKTOP_DISPLAY_QR_CODE","authorize","VENMO_DESKTOP_AUTHORIZE","authorizing","VENMO_DESKTOP_AUTHORIZING","createVenmoDesktopPaymentContext","expiresIn","expiresAt","createdAt","expiredTime","pollForStatusChange","userName","paymentMethodId","lookupVenmoDesktopPaymentContext","newStatus","createPaymentContextFromGraphqlLegacyQRCodeMutation","createVenmoQRCodePaymentContext","venmoQRCodePaymentContext","createPaymentContextFromGraphQL","customerClient","merchantProfileId","createVenmoPaymentContext","venmoPaymentContext","additionalOptions","Venmo","supportsVenmo","incognitoPromise","isIncognito","VENMO_INVALID_PROFILE_ID","deepLinkReturnUrl","VENMO_INVALID_DEEP_LINK_RETURN_URL","VENMO_NOT_ENABLED","_isIncognito","isWebview","isFacebookOwnedBrowserOnAndroid","doesNotSupportWindowOpenInIos","DOCUMENT_VISIBILITY_CHANGE_EVENT_DELAY","DEFAULT_PROCESS_RESULTS_DELAY","VENMO_APP_OR_MOBILE_AUTH_URL","VENMO_MOBILE_APP_AUTH_ONLY_URL","VENMO_WEB_LOGIN_URL","VENMO_TOKENIZATION_REQUEST_ACTIVE","VENMO_TOKENIZATION_REQUEST_NOT_ACTIVE","VENMO_APP_FAILED","VENMO_APP_CANCELED","VENMO_CANCELED","VENMO_CUSTOMER_CANCELED","VENMO_NETWORK_ERROR","VENMO_DESKTOP_CANCELED","VENMO_TOKENIZATION_CANCELED_BY_MERCHANT","VENMO_MOBILE_PAYMENT_CONTEXT_SETUP_FAILED","VENMO_MOBILE_POLLING_TOKENIZATION_NETWORK_ERROR","VENMO_MOBILE_POLLING_TOKENIZATION_EXPIRED","VENMO_MOBILE_POLLING_TOKENIZATION_CANCELED","VENMO_MOBILE_POLLING_TOKENIZATION_TIMEOUT","VENMO_MOBILE_POLLING_TOKENIZATION_NO_CONTEXT_ID","VENMO_MOBILE_POLLING_TOKENIZATION_FAILED","VENMO_TOKENIZATION_FAILED","VENMO_ECD_DISABLED","VENMO_DESKTOP_AUTHORIZATION_TIMED_OUT","venmoConstants","useAllowDesktopWebLogin","mobileWebFallBack","_getBrowserInfo","isMobileDeviceThatSupportsReturnToSameTab","isNonDefaultBrowser","browserInfo","parsedOptions","merchantAllowsDesktopBrowsers","allowDesktopWebLogin","allowDesktop","merchantAllowsReturningToNewBrowserTab","allowNewBrowserTab","merchantAllowsNonDefaultBrowsers","allowNonDefaultBrowsers","merchantAllowsWebviews","allowWebviews","_isUnsupportedWebview","_isUnsupportedMobileBrowser","ELEMENT_IDS","venmoUrl","checkForStatusChange","cancelTokenization","checkPaymentContextStatus","extendedPromise","closeBackdrop","statusCheckError","buildAndStyleElements","styleCspNonce","backdropStylesElement","backdropDiv","backDropContentContainer","venmoLogoDiv","venmoMessageDiv","instructionsDiv","continueButton","cancelButton","alreadyRenderedBackdrop","runWebLogin","setupDesktopWebLogin","getVenmoUrl","desktopWebLogin","urlParams","createVenmoDesktop","graphqlQueries","_allowDesktopWebLogin","_mobileWebFallBack","_allowNewBrowserTab","_allowWebviews","_allowDesktop","_useRedirectForIOS","useRedirectForIOS","_profileId","_displayName","_deepLinkReturnUrl","_ignoreHistoryChanges","ignoreHistoryChanges","_paymentMethodUsage","_shouldUseLegacyFlow","_requireManualReturn","requireManualReturn","_useDesktopQRFlow","_isDesktop","_useAllowDesktopWebLogin","_cannotHaveReturnUrls","_allowAndroidRecreation","allowAndroidRecreation","_allowNonDefaultBrowsers","_maxRetryCount","_collectCustomerBillingAddress","collectCustomerBillingAddress","_collectCustomerShippingAddress","collectCustomerShippingAddress","_cancelOnReturnToBrowser","cancelOnReturnToBrowser","_isFinalAmount","isFinalAmount","_lineItems","_subTotalAmount","subTotalAmount","_discountAmount","_taxAmount","taxAmount","_shippingAmount","_totalAmount","totalAmount","_cspNonce","_mobilePollingInterval","_mobilePollingExpiresThreshold","_pollCount","_shouldCreateVenmoPaymentContext","hasTokenizationResult","venmoDesktopInstance","_venmoDesktopInstance","paymentContextPromise","webLoginPromise","analyticsCategory","_frameServiceInstance","desktopWebErr","_mobilePollingContextEnvironment","_createVenmoPaymentContext","isValidationError","paymentContextResult","promiseErr","getFragmentParameters","parsedParams","decodedKey","resourceId","formatUserName","documentVisibilityChangeEventName","visibilityChange","msHidden","webkitHidden","cancelIfTokenizationInProgress","transactionDetails","venmoConfiguration","transactionDetailsPresent","customerClientChannel","unitTaxAmount","paysheetDetails","refreshIn","_refreshPaymentContextTimeout","_tokenizationInProgress","_venmoPaymentContextStatus","_venmoPaymentContextId","_popupBridgeIsInstalled","_venmoNativeAppIsInstalled","isVenmoInstalled","_handleDeepLinkAppSwitch","_handleIosWebviewDeepLink","_handlePopupBridgeAppSwitch","_handleIFrameBreakout","_venmoWindow","_handleIosWebviewInIframe","_handleBrowserAppSwitch","_shouldUseRedirectStrategy","appSwitch","currentUrl","braintreeData","resource_id","_shouldIncludeReturnUrls","braintree_merchant_id","braintree_access_token","braintree_environment","braintree_sdk_data","_hasTokenizationResult","paramsFromUrl","venmoSuccess","venmoError","venmoCancel","_isIOSIframeWithoutVenmoApp","_tokenizeForDesktopQRFlow","_tokenizeWebLoginWithRedirect","_tokenizeForMobileWithManualReturn","_tokenizeForMobileWithHashChangeListeners","formattedPayload","paymentContextId","formatTokenizePayload","_removeVisibilityEventListener","_tokenizePromise","_cancelMobilePaymentContext","_cancelVenmoDesktopContext","webLoginOptions","_checkPaymentContextStatusAndProcessResult","_checkPaymentContextStatus","_queryPaymentContextStatus","retryCount","resultStatus","networkError","_validatePollingContext","_mobilePollingContextExpiresIn","_handleWindowClosure","_err","_handleCancelOnReturn","minPollsBeforeCancel","_handleStatusChange","_continuePolling","_pollForStatusChange","_queryAndProcessStatus","validationError","resultProcessingInProgress","visibilityChangeListenerTimeout","processHashChangeFlowResults","completeFlow","_previousHash","_onHashChangeListener","newURL","_visibilityChangeListener","processResultsDelay","errorCode","_clearFragmentParameters","pushState","VISA_CHECKOUT_NOT_ENABLED","VISA_CHECKOUT_INIT_OPTIONS_REQUIRED","VISA_CHECKOUT_PAYMENT_REQUIRED","VISA_CHECKOUT_TOKENIZATION","VisaCheckout","createInitOptions","visaCheckoutConfiguration","dataLevel","cardBrands","callid","encKey","encPaymentData","visaCheckoutCard","callId","encryptedPaymentData","encryptedKey","visaCheckoutCards","parseBoxShadowValue","formatBoxShadowValue","_splitAtTopLevelOnly","KEYWORDS","SPACE","LENGTH","seen","keyword","spread","unknown","shadows","resolveConfig","Isotope","layoutMode","isJQueryFiltering","sortAscending","_getSorters","sortHistory","_initLayoutMode","_updateItemsSortData","initialOpts","_layout","arrange","_getIsInstant","filtered","_filter","_bindArrangeComplete","_isInstant","_noTransition","_hideReveal","needReveal","needHide","isLayoutComplete","isHideComplete","isRevealComplete","arrangeParallelCallback","hiddenMatched","visibleUnmatched","_getFilterTest","isMatched","mungeSorter","attrMatch","getValueGetter","sortDataParsers","sortBys","_getIsSameSortBy","itemSorter","sortAsc","itemA","itemB","getItemSorter","_mode","_filterRevealAdded","filteredInsertItems","_remove","getFilteredItemElements","common","IS_WEAK","NativeConstructor","NativePrototype","exported","fixMethod","uncurriedNativeMethod","HASNT_CHAINING","THROWS_ON_PRIMITIVES","ACCEPT_ITERABLES","BUGGY_ZERO","$instance","setStrong","UNSCOPABLES","$promiseResolve","counter","alreadyCalled","defineGlobalProperty","targetProperty","sourceProperty","TARGET","GLOBAL","dontCallGetSet","aliceblue","antiquewhite","aquamarine","azure","beige","bisque","blanchedalmond","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkgrey","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","gainsboro","ghostwhite","gold","goldenrod","greenyellow","grey","honeydew","hotpink","indianred","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightgrey","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","limegreen","linen","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","oldlace","olivedrab","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","plum","powderblue","rebeccapurple","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","thistle","tomato","turquoise","wheat","whitesmoke","yellowgreen","escapePos","lines","nextLine","nextOffset","tokenType","unclosed","consumeWord","_unescapable","_wordDelimiters","unescapable","wordDelimiters","hexChars","consumeEscape","hexDigits","regexpExec","Reflect","Proxy","beforeLeave","leave","afterLeave","beforeEnter","afterEnter","warning","getLevel","setLevel","sensitive","prevent","outerHTML","toDocument","getHtml","getWrapper","getContainer","addContainer","getSibling","getNamespace","getHref","resolveUrl","states","strict","encode","delimiter","prefixes","pathToRegexp","port","getAbsoluteHref","baseURI","getOrigin","getPort","getPath","getQuery","getHash","parseQuery","responseURL","logger","registered","do","checkHref","getRequest","getAction","getStatus","getTarget","suite","tests","checkLink","captureStackTrace","doOnce","doPage","route","byNamespace","schemaPage","Logger","cacheIgnore","cacheFirstPage","prefetchIgnore","preventRunning","transitions","views","dom","helpers","use","schema","logLevel","go","hasSelf","hasOnce","onRequestError","shouldWait","prefetch","$toString","nativeObjectCreate","getOwnPropertyNamesExternal","HIDDEN","SYMBOL","SymbolPrototype","QObject","nativeDefineProperty","nativeGetOwnPropertyNames","nativePropertyIsEnumerable","AllSymbols","ObjectPrototypeSymbols","WellKnownSymbolsStore","USE_SETTER","findChild","fallbackDefineProperty","ObjectPrototypeDescriptor","setSymbolDescriptor","$defineProperties","$getOwnPropertySymbols","$propertyIsEnumerable","IS_OBJECT_PROTOTYPE","useSetter","useSimple","nonConfigurable","nonWritable","lazysizes","lazySizesDefaults","preloadClass","fastLoadedClass","iframeLoadMode","minSize","expFactor","hFac","loadMode","loadHidden","ricTimeout","throttleDelay","lazySizesConfig","lazysizesConfig","noSupport","autosizesElems","sizeElement","getSizeElement","debouncedUpdateElementsSizes","preloadElems","isCompleted","resetPreloadingTimer","started","eLvW","elvH","eLtop","eLleft","eLright","eLbottom","isBodyHidden","regImg","regIframe","supportScroll","currentExpand","lowRuns","resetPreloading","isVisible","isNestedVisible","throttledCheckElements","switchLoadingClass","rafedSwitchLoadingClass","rafSwitchLoadingClass","changeIframeSrc","handleSources","lazyUnveil","unveilElement","afterScroll","altLoadmodeScrollListner","running","waiting","firstFns","secondFns","rafBatch","supportPicture","_addEventListener","_getAttribute","requestIdleCallback","loadEvents","regClassCache","ele","cls","reg","addRemoveLoadEvents","triggerEvent","noBubbles","noCancelable","updatePolyfill","polyfill","picturefill","pf","reevaluate","getCSS","getWidth","_lsFlush","runFns","rAFIt","debounce","later","elemExpand","outerRect","lastTime","gDelay","rICTimeout","idleCallback","isPriority","throttle","eLlen","autoLoadElem","loadedSomething","elemNegativeExpand","elemExpandVal","beforeExpandVal","defaultExpand","preloadExpand","lazyloadElems","_lazyRace","prematureUnveil","_defEx","preloadAfterLoad","_lazyCache","sourceSrcset","isAuto","isImg","isPicture","isLoaded","autoSizer","updateElem","persisted","loadingElements","childList","subtree","checkElems","_aLSL","uP","MiniMasonry","conf","_sizes","_columns","_count","_width","_removeListener","_currentGutterX","_currentGutterY","_resizeTimeout","baseWidth","gutterX","gutterY","minify","ultimateGutter","surroundingGutter","wedge","resizeThrottler","getCount","computeWidth","colWidth","startX","occupiedSpace","nextColumn","getShortest","getNextColumn","childrenGutter","getLongest","shortest","longest","previous","getEntry","removed","ITERATOR_NAME","getInternalCollectionState","getInternalIteratorState","classofRaw","CORRECT_ARGUMENTS","tryGet","callee","bitmap","Vertical","horizontalAlignment","colYs","cols","horizontalColIndex","getContainerWidth","columnWidth","firstItemElem","remainder","colSpan","colPosition","horizontalOrder","setHeight","setMax","_getTopColPosition","colGroup","_getTopColGroup","minimumY","_getColGroupY","groupColYs","_getHorizontalColPosition","hasSize","stampSize","firstX","lastX","firstCol","lastCol","stampMaxY","_getContainerFitWidth","unusedCols","previousWidth","_changeEvent","_startEvent","_endEvent","_plane","_TILT_LIMIT","_v","_twoPI","_STATE","_EPS","OrbitControls","minDistance","maxDistance","minZoom","maxZoom","minTargetRadius","maxTargetRadius","minPolarAngle","maxPolarAngle","minAzimuthAngle","maxAzimuthAngle","enableDamping","dampingFactor","enableZoom","zoomSpeed","enableRotate","rotateSpeed","keyRotateSpeed","enablePan","panSpeed","screenSpacePanning","keyPanSpeed","zoomToCursor","autoRotate","autoRotateSpeed","UP","BOTTOM","target0","position0","zoom0","_domElementKeyEvents","_lastPosition","_lastQuaternion","_lastTargetPosition","_quat","_quatInverse","_spherical","_sphericalDelta","_scale","_panOffset","_rotateStart","_rotateEnd","_rotateDelta","_panStart","_panEnd","_panDelta","_dollyStart","_dollyEnd","_dollyDelta","_dollyDirection","_mouse","_performCursorZoom","_pointers","_pointerPositions","_controlActive","_onPointerMove","_onPointerDown","_onPointerUp","_onContextMenu","onContextMenu","_onMouseWheel","onMouseWheel","_onKeyDown","onKeyDown","_onTouchStart","_onTouchMove","onTouchMove","_onMouseDown","onMouseDown","_onMouseMove","_interceptControlDown","interceptControlDown","_interceptControlUp","interceptControlUp","touchAction","stopListenToKeyEvents","getPolarAngle","getAzimuthalAngle","getDistance","listenToKeyEvents","saveState","deltaTime","_rotateLeft","_getAutoRotationAngle","zoomChanged","_clampDistance","prevRadius","newRadius","radiusDelta","mouseBefore","prevZoom","mouseAfter","_getZoomScale","normalizedDelta","_rotateUp","_panLeft","objectMatrix","_panUp","_pan","targetDistance","_dollyOut","dollyScale","_dollyIn","_updateZoomParameters","_handleMouseDownRotate","_handleMouseDownDolly","_handleMouseDownPan","_handleMouseMoveRotate","_handleMouseMoveDolly","_handleMouseMovePan","_handleMouseWheel","_handleKeyDown","_handleTouchStartRotate","_getSecondPointerPosition","_handleTouchStartPan","_handleTouchStartDolly","_handleTouchStartDollyPan","_handleTouchStartDollyRotate","_handleTouchMoveRotate","_handleTouchMovePan","_handleTouchMoveDolly","centerX","centerY","_handleTouchMoveDollyPan","_handleTouchMoveDollyRotate","_addPointer","_removePointer","_isTrackingPointer","_trackPointer","_customWheelEvent","deltaMode","newEvent","setPointerCapture","releasePointerCapture","mouseAction","MapHelpers","DOES_NOT_WORK_WITH_PRIMITIVES","groupBy","withAlphaVariable","alphaValue","variable","opacityVariable","exportName","VENDOR_PREFIXES","TEST_ELEMENT","setTimeoutContext","bindFn","invokeArrayArg","deprecationMessage","nextKey","childP","baseP","_super","boolOrFn","ifUndefined","val1","val2","addEventListeners","splitStr","hasParent","inStr","findByKey","uniqueArray","prefixed","camelProp","_uniqueId","getWindowForElement","SUPPORT_TOUCH","SUPPORT_POINTER_EVENTS","SUPPORT_ONLY_TOUCH","INPUT_TYPE_TOUCH","INPUT_TYPE_MOUSE","PROPS_XY","PROPS_CLIENT_XY","Input","inputTarget","domHandler","inputHandler","eventType","pointersLen","pointers","changedPointersLen","changedPointers","isFirst","isFinal","pointersLength","firstInput","simpleCloneInputData","firstMultiple","offsetCenter","getAngle","offsetDelta","prevDelta","prevInput","computeDeltaXY","offsetDirection","getDirection","overallVelocity","getVelocity","overallVelocityX","overallVelocityY","getRotation","maxPointers","velocityX","velocityY","lastInterval","computeIntervalInputData","srcEvent","computeInputData","recognize","evEl","evTarget","evWin","MOUSE_INPUT_MAP","mousedown","mousemove","mouseup","MouseInput","POINTER_INPUT_MAP","pointercancel","pointerout","IE10_POINTER_TYPE_ENUM","POINTER_ELEMENT_EVENTS","POINTER_WINDOW_EVENTS","PointerEventInput","MSPointerEvent","PointerEvent","removePointer","eventTypeNormalized","storeIndex","SINGLE_TOUCH_INPUT_MAP","touchstart","touchmove","touchend","touchcancel","SingleTouchInput","normalizeSingleTouches","changed","TOUCH_INPUT_MAP","TouchInput","targetIds","getTouches","allTouches","changedTargetTouches","TouchMouseInput","mouse","primaryTouch","lastTouches","recordTouches","setLastTouch","lastTouch","lts","isSyntheticEvent","inputEvent","inputData","isMouse","sourceCapabilities","firesTouchEvents","PREFIXED_TOUCH_ACTION","NATIVE_TOUCH_ACTION","TOUCH_ACTION_COMPUTE","TOUCH_ACTION_AUTO","TOUCH_ACTION_MANIPULATION","TOUCH_ACTION_NONE","TOUCH_ACTION_PAN_X","TOUCH_ACTION_PAN_Y","TOUCH_ACTION_MAP","touchMap","cssSupports","CSS","getTouchActionProps","TouchAction","compute","actions","recognizers","recognizer","getTouchAction","hasPanX","hasPanY","cleanTouchActions","preventDefaults","prevented","hasNone","isTapPointer","isTapMovement","isTapTouchTime","DIRECTION_LEFT","DIRECTION_UP","preventSrc","STATE_FAILED","Recognizer","simultaneous","requireFail","stateStr","directionStr","getRecognizerByNameIfManager","otherRecognizer","AttrRecognizer","PanRecognizer","pX","pY","PinchRecognizer","PressRecognizer","_timer","_input","RotateRecognizer","SwipeRecognizer","TapRecognizer","pTime","pCenter","Hammer","Manager","oldCssProps","inputClass","toggleCssProps","recognizeWith","requireFailure","dropRecognizeWith","dropRequireFailure","hasRequireFailures","canRecognizeWith","additionalEvent","tryEmit","canEmit","inputDataClone","attrTest","optionPointers","isRecognized","DIRECTION_HORIZONTAL","directionTest","hasMoved","inOut","validPointers","validMovement","validTime","taps","posThreshold","validTouchTime","failTimeout","validInterval","validMultiTap","tapCount","domEvents","userSelect","touchSelect","touchCallout","contentZooming","userDrag","tapHighlightColor","curRecognizer","existing","gestureEvent","gesture","triggerDomEvent","INPUT_START","INPUT_MOVE","INPUT_END","INPUT_CANCEL","STATE_POSSIBLE","STATE_BEGAN","STATE_CHANGED","STATE_ENDED","STATE_RECOGNIZED","STATE_CANCELLED","DIRECTION_NONE","DIRECTION_RIGHT","DIRECTION_DOWN","DIRECTION_VERTICAL","DIRECTION_ALL","Tap","Pan","Swipe","Pinch","Rotate","Press","DetachedBindMode","UVMapping","ZeroCurvatureEnding","ZeroSlopeEnding","WrapAroundEnding","AdditiveAnimationBlendMode","TYPED_ARRAYS","getTypedArray","_setConsoleFunction","_v0$3","_m1$4","_m1$3","_tables","_generateTables","floatView","uint32View","baseTable","shiftTable","mantissaTable","exponentTable","offsetTable","toHalfFloat","fromHalfFloat","_id$3","FogExp2","density","isFogExp2","Fog","isFog","SpriteMaterial","isSpriteMaterial","_geometry","_intersectPoint","_worldScale","_mvPosition","_alignedPosition","_rotatedPosition","_viewWorldMatrix","_vA","_vB","_vC","_uvA","_uvB","_uvC","Sprite","isSprite","float32Array","transformVertex","vertexPosition","mvPosition","_v1$2","_v2$1","LOD","isLOD","_currentLevel","levels","addLevel","hysteresis","removeLevel","removedElements","getCurrentLevel","getObjectForDistance","levelDistance","_projScreenMatrix$2","_frustum$1","FrustumArray","cameraArray","ascIdSort","sortOpaque","sortTransparent","MultiDrawRenderList","pool","_matrix$1","_whiteColor","_frustumArray","_box$1","_sphere$2","_vector$5","_forward$1","_temp","_renderList","_mesh","_batchIntersects","copyAttributeData","targetOffset","vertexCount","copyArrayContents","BatchedMesh","customSort","_visibilityChanged","_multiDrawCounts","_multiDrawStarts","_multiDrawCount","_multiDrawInstances","_initMatricesTexture","_initIndirectTexture","instanceCount","unusedVertexCount","unusedIndexCount","matricesArray","indirectArray","_initColorsTexture","colorsArray","_initializeGeometry","reference","srcAttribute","dstArray","dstAttribute","indexArray","_validateGeometry","batchGeometry","validateInstanceId","validateGeometryId","geometryId","geometryInfoList","setCustomSort","geometryIndex","getBoundingBoxAt","getBoundingSphereAt","addInstance","drawId","addGeometry","reservedVertexCount","reservedIndexCount","vertexStart","indexStart","indexCount","setGeometryAt","hasIndex","dstIndex","deleteGeometry","deleteInstance","elementDelta","copyWithin","iv","setVisibleAt","getVisibleAt","setGeometryIdAt","getGeometryIdAt","getGeometryRangeAt","setInstanceCount","multiDrawCounts","multiDrawStarts","setGeometrySize","validRanges","oldGeometry","batchId","bytesPerElement","multiDrawCount","culled","depthMaterial","VideoTexture","isVideoTexture","_requestVideoFrameCallbackId","requestVideoFrameCallback","updateVideo","HAVE_CURRENT_DATA","cancelVideoFrameCallback","CompressedTexture","CapsuleGeometry","capSegments","radialSegments","halfHeight","capArcLength","cylinderPartLength","totalArcLength","numVerticalSegments","verticesPerRow","vertex","currentArcLength","profileY","profileRadius","normalYComponent","segmentProgress","uOffset","sinTheta","cosTheta","prevIndexRow","i4","CircleGeometry","thetaStart","thetaLength","CylinderGeometry","radiusTop","radiusBottom","openEnded","generateCap","centerIndexStart","centerIndexEnd","slope","indexRow","generateTorso","ConeGeometry","PolyhedronGeometry","vertexBuffer","uvBuffer","subdivideFace","aj","bj","rows","pushVertex","getVertexByIndex","correctUV","azimuth","inclination","subdivide","applyRadius","centroid","azi","correctUVs","correctSeam","generateUVs","DodecahedronGeometry","_v1$1","_normal","_triangle","EdgesGeometry","thresholdAngle","precisionPoints","thresholdDot","indexAttr","positionAttr","indexArr","vertKeys","hashes","edgeData","jNext","vecHash0","vecHash1","reverseHash","index0","Curve","arcLengthDivisions","cacheArcLengths","getPoint","getPointAt","optionalTarget","getUtoTmapping","getPoints","divisions","getSpacedPoints","getLength","getLengths","sum","updateArcLengths","arcLengths","targetArcLength","comparison","lengthBefore","getTangent","pt1","getTangentAt","computeFrenetFrames","tangents","binormals","vec","MAX_VALUE","EllipseCurve","aX","aY","xRadius","yRadius","aStartAngle","aEndAngle","aClockwise","aRotation","isEllipseCurve","twoPi","deltaAngle","samePoints","ArcCurve","aRadius","isArcCurve","CubicPoly","c0","initCatmullRom","x3","tension","initNonuniformCatmullRom","dt0","dt1","dt2","calc","pz","CatmullRomCurve3","curveType","isCatmullRomCurve3","intPoint","CatmullRom","QuadraticBezier","QuadraticBezierP0","QuadraticBezierP1","QuadraticBezierP2","CubicBezier","CubicBezierP0","CubicBezierP1","CubicBezierP2","CubicBezierP3","CubicBezierCurve","isCubicBezierCurve","CubicBezierCurve3","isCubicBezierCurve3","LineCurve","isLineCurve","LineCurve3","isLineCurve3","QuadraticBezierCurve","isQuadraticBezierCurve","QuadraticBezierCurve3","isQuadraticBezierCurve3","SplineCurve","isSplineCurve","Curves","CurvePath","curves","autoClose","curve","closePath","startPoint","lineType","curveLengths","getCurveLengths","segmentLength","lens","cacheLengths","sums","resolution","pts","Path","currentPoint","lineTo","quadraticCurveTo","aCPx","aCPy","bezierCurveTo","aCP1x","aCP1y","aCP2x","aCP2y","splineThru","npts","arc","absarc","absellipse","ellipse","firstPoint","lastPoint","Shape","holes","getPointsHoles","holesPts","extractPoints","hole","linkedList","clockwise","signedArea","insertNode","removeNode","filterPoints","again","steiner","area","earcutLinked","ear","triangles","minX","minY","invSize","pass","zOrder","prevZ","nextZ","numMerges","inSize","tail","pSize","qSize","sortLinked","indexCurve","isEarHashed","isEar","cureLocalIntersections","splitEarcut","pointInTriangleExceptFirst","minZ","maxZ","locallyInside","isValidDiagonal","splitPolygon","compareXYSlope","eliminateHole","outerNode","bridge","hx","hy","mx","my","tanMin","pointInTriangle","sectorContainsSector","findHoleBridge","bridgeReverse","getLeftmost","leftmost","intersectsPolygon","inside","middleInside","q1","q2","o2","o3","o4","onSegment","createNode","Earcut","triangulate","holeIndices","hasHoles","outerLen","eliminateHoles","maxX","earcut","ShapeUtils","contour","isClockWise","triangulateShape","faces","removeDupEndPts","addContour","holeIndex","ExtrudeGeometry","verticesArray","uvArray","addShape","curveSegments","bevelEnabled","bevelThickness","bevelSize","bevelOffset","bevelSegments","extrudePath","uvgen","UVGenerator","WorldUVGenerator","extrudePts","splineTube","binormal","position2","extrudeByPath","shapePoints","hl","ahole","mergeOverlappingPoints","THRESHOLD_SQ","prevPos","currentPos","distSq","scalingFactorSqrt","numHoles","scalePt2","vlen","getBevelVec","inPt","inPrev","inNext","v_trans_x","v_trans_y","shrink_by","v_prev_x","v_prev_y","v_next_x","v_next_y","v_prev_lensq","collinear0","v_prev_len","v_next_len","ptPrevShift_x","ptPrevShift_y","sf","v_trans_lensq","direction_eq","contourMovements","holesMovements","oneHoleMovements","verticesMovements","contractedContourVertices","expandedHoleVertices","bs","vert","oneHoleVertices","flen","sidewalls","layeroffset","sl","slen1","slen2","f4","f3","addVertex","nextIndex","generateTopUV","addUV","generateSideWallUV","vector2","buildLidFaces","buildSideFaces","toJSON$1","geometryShapes","indexA","indexB","indexC","a_x","a_y","b_x","b_y","c_x","c_y","indexD","a_z","b_z","c_z","d_x","d_y","d_z","IcosahedronGeometry","LatheGeometry","phiStart","phiLength","initNormals","inverseSegments","curNormal","prevNormal","OctahedronGeometry","RingGeometry","innerRadius","outerRadius","thetaSegments","phiSegments","radiusStep","thetaSegmentLevel","ShapeGeometry","indexOffset","shapeVertices","shapeHoles","shapeHole","SphereGeometry","thetaEnd","verticesRow","TetrahedronGeometry","TorusGeometry","tube","tubularSegments","TorusKnotGeometry","P1","P2","calculatePositionOnCurve","cu","su","quOverP","TubeGeometry","generateSegment","generateIndices","generateBufferData","WireframeGeometry","isUniqueEdge","hash1","hash2","Geometries","ShadowMaterial","isShadowMaterial","RawShaderMaterial","isRawShaderMaterial","MeshPhongMaterial","isMeshPhongMaterial","MeshToonMaterial","isMeshToonMaterial","MeshNormalMaterial","isMeshNormalMaterial","MeshLambertMaterial","isMeshLambertMaterial","MeshMatcapMaterial","isMeshMatcapMaterial","LineDashedMaterial","isLineDashedMaterial","HemisphereLight","skyColor","isHemisphereLight","RectAreaLight","isRectAreaLight","SphericalHarmonics3","isSphericalHarmonics3","coefficients","zero","getAt","coeff","getIrradianceAt","addScaledSH","getBasisAt","shBasis","LightProbe","isLightProbe","MaterialLoader","getTexture","createMaterialFromType","uniform","setTextures","InstancedBufferGeometry","isInstancedBufferGeometry","BufferGeometryLoader","interleavedBufferMap","arrayBufferMap","getInterleavedBuffer","getArrayBuffer","drawcalls","TEXTURE_MAPPING","TEXTURE_WRAPPING","TEXTURE_FILTER","AudioContext","webkitAudioContext","setContext","_eyeRight","_eyeLeft","_projectionMatrix","Clock","oldTime","elapsedTime","getElapsedTime","getDelta","newTime","_position$1","_quaternion$1","_scale$1","_forward","_up","Audio","gain","createGain","getInput","detune","loopStart","loopEnd","playbackRate","isPlaying","hasPlaybackControl","sourceType","_startedAt","_progress","_connected","getOutput","setNodeSource","audioNode","setMediaElementSource","mediaElement","createMediaElementSource","setMediaStreamSource","mediaStream","createMediaStreamSource","setBuffer","audioBuffer","createBufferSource","onended","onEnded","setDetune","setPlaybackRate","getFilters","setTargetAtTime","getDetune","getFilter","setFilter","getPlaybackRate","getLoop","setLoop","setLoopStart","setLoopEnd","getVolume","setVolume","_position","_orientation","PropertyMixer","mixFunction","mixFunctionAdditive","setIdentity","_slerp","_slerpAdditive","_setAdditiveIdentityQuaternion","_workIndex","_select","_setAdditiveIdentityOther","_lerp","_lerpAdditive","_setAdditiveIdentityNumeric","_mixBufferRegion","_mixBufferRegionAdditive","_setIdentity","_origIndex","_addIndex","cumulativeWeight","cumulativeWeightAdditive","useCount","referenceCount","accumulate","accuIndex","currentWeight","mix","accumulateAdditive","weightAdditive","originalValueOffset","saveOriginalState","restoreOriginalState","endIndex","targetIndex","workOffset","AnimationAction","mixer","localRoot","_mixer","_clip","_localRoot","nTracks","interpolants","interpolantSettings","interpolant","_interpolantSettings","_interpolants","_propertyBindings","_cacheIndex","_byClipCacheIndex","_timeScaleInterpolant","_weightInterpolant","_loopCount","_effectiveTimeScale","_effectiveWeight","repetitions","clampWhenFinished","zeroSlopeAtStart","zeroSlopeAtEnd","_activateAction","_deactivateAction","stopFading","stopWarping","_isActiveAction","isScheduled","setEffectiveWeight","getEffectiveWeight","_scheduleFading","crossFadeFrom","fadeOutAction","warp","fadeInDuration","fadeOutDuration","startEndRatio","endStartRatio","crossFadeTo","fadeInAction","weightInterpolant","_takeBackControlInterpolant","setEffectiveTimeScale","getEffectiveTimeScale","setDuration","syncWith","halt","startTimeScale","endTimeScale","_lendControlInterpolant","timeScaleInterpolant","getMixer","getClip","getRoot","_update","timeDirection","_updateWeight","timeRunning","_updateTimeScale","clipTime","_updateTime","propertyMixers","interpolantValue","loopCount","pingPong","_setEndings","handle_stop","loopDelta","atStart","atEnd","weightNow","weightThen","_controlInterpolantsResultBuffer","Uniform","_matrix","ascSort","propagate","handleVisibilityChange","_document","Matrix2","isMatrix2","_vector$4","_startP","_startEnd","_d1","_d2","_c1","_c2","_vector$3","_vector$2","_boneMatrix","_matrixWorldInv","getBoneList","boneList","_vector$1","_color1","_color2","_v1","_v2","_v3","_vector","_camera","setPoint","pointMap","_box","_axis","_lineGeometry","_coneGeometry","WebGLAnimation","isAnimating","animationLoop","requestId","onAnimationFrame","setAnimationLoop","WebGLAttributes","deleteBuffer","bufferType","elementSize","createBuffer","bindBuffer","bufferData","Float16Array","HALF_FLOAT","isFloat16BufferAttribute","SHORT","UNSIGNED_INT","INT","BYTE","bufferSubData","mergeIndex","previousRange","updateBuffer","ShaderChunk","alphahash_fragment","alphahash_pars_fragment","alphamap_fragment","alphamap_pars_fragment","alphatest_fragment","alphatest_pars_fragment","aomap_fragment","aomap_pars_fragment","batching_pars_vertex","batching_vertex","begin_vertex","beginnormal_vertex","bsdfs","iridescence_fragment","bumpmap_pars_fragment","clipping_planes_fragment","clipping_planes_pars_fragment","clipping_planes_pars_vertex","clipping_planes_vertex","color_fragment","color_pars_fragment","color_pars_vertex","color_vertex","cube_uv_reflection_fragment","defaultnormal_vertex","displacementmap_pars_vertex","displacementmap_vertex","emissivemap_fragment","emissivemap_pars_fragment","colorspace_fragment","colorspace_pars_fragment","envmap_fragment","envmap_common_pars_fragment","envmap_pars_fragment","envmap_pars_vertex","envmap_physical_pars_fragment","envmap_vertex","fog_vertex","fog_pars_vertex","fog_fragment","fog_pars_fragment","gradientmap_pars_fragment","lightmap_pars_fragment","lights_lambert_fragment","lights_lambert_pars_fragment","lights_pars_begin","lights_toon_fragment","lights_toon_pars_fragment","lights_phong_fragment","lights_phong_pars_fragment","lights_physical_fragment","lights_physical_pars_fragment","lights_fragment_begin","lights_fragment_maps","lights_fragment_end","logdepthbuf_fragment","logdepthbuf_pars_fragment","logdepthbuf_pars_vertex","logdepthbuf_vertex","map_fragment","map_pars_fragment","map_particle_fragment","map_particle_pars_fragment","metalnessmap_fragment","metalnessmap_pars_fragment","morphinstance_vertex","morphcolor_vertex","morphnormal_vertex","morphtarget_pars_vertex","morphtarget_vertex","normal_fragment_begin","normal_fragment_maps","normal_pars_fragment","normal_pars_vertex","normal_vertex","normalmap_pars_fragment","clearcoat_normal_fragment_begin","clearcoat_normal_fragment_maps","clearcoat_pars_fragment","iridescence_pars_fragment","opaque_fragment","packing","premultiplied_alpha_fragment","project_vertex","dithering_fragment","dithering_pars_fragment","roughnessmap_fragment","roughnessmap_pars_fragment","shadowmap_pars_fragment","shadowmap_pars_vertex","shadowmap_vertex","shadowmask_pars_fragment","skinbase_vertex","skinning_pars_vertex","skinning_vertex","skinnormal_vertex","specularmap_fragment","specularmap_pars_fragment","tonemapping_fragment","tonemapping_pars_fragment","transmission_fragment","transmission_pars_fragment","uv_pars_fragment","uv_pars_vertex","uv_vertex","worldpos_vertex","background_vert","background_frag","backgroundCube_vert","backgroundCube_frag","cube_vert","cube_frag","depth_vert","depth_frag","distanceRGBA_vert","distanceRGBA_frag","equirect_vert","equirect_frag","linedashed_vert","linedashed_frag","meshbasic_vert","meshbasic_frag","meshlambert_vert","meshlambert_frag","meshmatcap_vert","meshmatcap_frag","meshnormal_vert","meshnormal_frag","meshphong_vert","meshphong_frag","meshphysical_vert","meshphysical_frag","meshtoon_vert","meshtoon_frag","points_vert","points_frag","shadow_vert","shadow_frag","sprite_vert","sprite_frag","UniformsLib","diffuse","mapTransform","alphaMapTransform","specularmap","specularMapTransform","envmap","flipEnvMap","dfgLUT","aomap","aoMapTransform","lightmap","lightMapTransform","bumpmap","bumpMapTransform","normalmap","normalMapTransform","displacementmap","displacementMapTransform","emissivemap","emissiveMapTransform","metalnessmap","metalnessMapTransform","roughnessmap","roughnessMapTransform","gradientmap","fogDensity","fogNear","fogFar","fogColor","ambientLightColor","lightProbe","directionalLights","directionalLightShadows","shadowIntensity","shadowBias","shadowNormalBias","shadowRadius","shadowMapSize","directionalShadowMap","directionalShadowMatrix","spotLights","coneCos","penumbraCos","spotLightShadows","spotLightMap","spotShadowMap","spotLightMatrix","pointLights","pointLightShadows","shadowCameraNear","shadowCameraFar","pointShadowMap","pointShadowMatrix","hemisphereLights","rectAreaLights","ltc_1","ltc_2","uvTransform","ShaderLib","basic","lambert","phong","standard","toon","dashed","totalSize","t2D","backgroundCube","cube","tCube","tFlip","equirect","distanceRGBA","referencePosition","nearDistance","farDistance","physical","clearcoatMapTransform","clearcoatNormalMapTransform","clearcoatRoughnessMapTransform","iridescenceMapTransform","iridescenceThicknessMapTransform","sheenColorMapTransform","sheenRoughnessMapTransform","transmissionMapTransform","transmissionSamplerSize","transmissionSamplerMap","thicknessMapTransform","specularColorMapTransform","specularIntensityMapTransform","anisotropyVector","anisotropyMapTransform","_rgb","_e1$1","WebGLBackground","cubemaps","cubeuvmaps","clearColor","planeMesh","boxMesh","clearAlpha","currentBackground","currentBackgroundVersion","currentTonemapping","getBackground","setClear","getClearColor","setClearColor","getClearAlpha","setClearAlpha","forceClear","environmentBlendMode","getEnvironmentBlendMode","autoClear","setTest","setMask","autoClearColor","autoClearDepth","autoClearStencil","addToRenderList","renderList","toneMapping","WebGLBindingStates","maxVertexAttributes","MAX_VERTEX_ATTRIBS","bindingStates","defaultState","createBindingState","currentState","forceUpdate","bindVertexArrayObject","vao","bindVertexArray","deleteVertexArrayObject","deleteVertexArray","newAttributes","enabledAttributes","attributeDivisors","program","initAttributes","enableAttribute","enableAttributeAndDivisor","enableVertexAttribArray","vertexAttribDivisor","disableUnusedAttributes","disableVertexAttribArray","vertexAttribPointer","vertexAttribIPointer","resetDefaultState","updateBuffers","programMap","stateMap","createVertexArray","getBindingState","cachedAttributes","geometryAttributes","attributesNum","programAttributes","getAttributes","cachedAttribute","geometryAttribute","saveCache","ELEMENT_ARRAY_BUFFER","materialDefaultAttributeValues","programAttribute","isInstancedInterleavedBuffer","locationSize","ARRAY_BUFFER","vertexAttrib2fv","vertexAttrib3fv","vertexAttrib4fv","vertexAttrib1fv","setupVertexAttributes","programId","releaseStatesOfGeometry","releaseStatesOfProgram","WebGLBufferRenderer","renderInstances","primcount","drawArraysInstanced","setMode","drawArrays","renderMultiDraw","starts","counts","drawCount","multiDrawArraysWEBGL","elementCount","renderMultiDrawInstances","multiDrawArraysInstancedWEBGL","WebGLCapabilities","maxAnisotropy","getMaxPrecision","getShaderPrecisionFormat","VERTEX_SHADER","HIGH_FLOAT","FRAGMENT_SHADER","MEDIUM_FLOAT","maxPrecision","logarithmicDepthBuffer","reversedDepthBuffer","maxTextures","MAX_TEXTURE_IMAGE_UNITS","maxVertexTextures","MAX_VERTEX_TEXTURE_IMAGE_UNITS","isWebGL2","getMaxAnisotropy","MAX_TEXTURE_MAX_ANISOTROPY_EXT","textureFormatReadable","textureFormat","IMPLEMENTATION_COLOR_READ_FORMAT","textureTypeReadable","textureType","halfFloatSupportedByExt","IMPLEMENTATION_COLOR_READ_TYPE","maxTextureSize","MAX_TEXTURE_SIZE","maxCubemapSize","MAX_CUBE_MAP_TEXTURE_SIZE","maxAttributes","maxVertexUniforms","MAX_VERTEX_UNIFORM_VECTORS","maxVaryings","MAX_VARYING_VECTORS","maxFragmentUniforms","MAX_FRAGMENT_UNIFORM_VECTORS","vertexTextures","maxSamples","MAX_SAMPLES","WebGLClipping","globalState","numGlobalPlanes","localClippingEnabled","renderingShadows","viewNormalMatrix","projectPlanes","skipTransform","nPlanes","flatSize","viewMatrix","numPlanes","numIntersection","enableLocalClipping","beginShadows","endShadows","setGlobalState","setState","materialProperties","nGlobal","lGlobal","clippingState","WebGLCubeMaps","mapTextureMapping","onTextureDispose","cubemap","EXTRA_LOD_SIGMA","_flatCamera","_clearColor","_oldTarget","_oldActiveCubeFace","_oldActiveMipmapLevel","_oldXrEnabled","_origin","PMREMGenerator","_renderer","_pingPongRenderTarget","_lodMax","_cubeSize","_sizeLods","_sigmas","_lodMeshes","_backgroundBox","_cubemapMaterial","_equirectMaterial","_blurMaterial","_ggxMaterial","fromScene","sigma","_setSize","cubeUVRenderTarget","_allocateTargets","_sceneToCubeUV","_blur","_applyPMREM","_cleanup","fromEquirectangular","equirectangular","_fromTexture","fromCubemap","compileCubemapShader","_getCubemapMaterial","_compileMaterial","compileEquirectangularShader","_getEquirectMaterial","_dispose","cubeSize","log2","outputTarget","_setViewport","_textureToCubeUV","_createRenderTarget","lodMeshes","sizeLods","sigmas","lodMax","lod","totalLods","sizeLod","texelSize","cubeFaces","positionSize","uvSize","faceIndexSize","coordinates","_createPlanes","poleAxis","_getBlurShader","_getGGXShader","cubeCamera","upSign","forwardSign","originalAutoClear","getReversed","clearDepth","backgroundBox","backgroundMaterial","useSolidColor","_applyGGXFilter","lodIn","lodOut","pingPongRenderTarget","ggxMaterial","ggxMesh","ggxUniforms","targetRoughness","sourceRoughness","adjustedRoughness","outputSize","_halfBlur","targetIn","targetOut","sigmaRadians","blurMaterial","blurMesh","blurUniforms","pixels","radiansPerPixel","sigmaPixels","WebGLCubeUVMaps","cubeUVmaps","pmremGenerator","cubemapUV","isEquirectMap","isCubeMap","currentPMREMVersion","isCubeTextureComplete","WebGLExtensions","getExtension","WebGLGeometries","wireframeAttributes","onGeometryDispose","updateWireframeAttribute","geometryPosition","previousAttribute","getWireframeAttribute","currentAttribute","WebGLIndexedBufferRenderer","drawElementsInstanced","drawElements","multiDrawElementsWEBGL","multiDrawElementsInstancedWEBGL","WebGLInfo","programs","autoReset","WebGLMorphtargets","capabilities","morphTextures","morph","morphTargetsCount","hasMorphNormals","hasMorphColors","vertexDataCount","vertexDataStride","morphNormal","morphColor","disposeTexture","getUniforms","WebGLObjects","updateMap","onInstancedMeshDispose","buffergeometry","emptyTexture","emptyShadowTexture","emptyArrayTexture","empty3dTexture","emptyCubeTexture","arrayCacheF32","arrayCacheI32","mat4array","mat3array","mat2array","flatten","nBlocks","blockSize","firstElem","arraysEqual","allocTexUnits","allocateTextureUnit","setValueV1f","uniform1f","addr","setValueV2f","uniform2f","uniform2fv","setValueV3f","uniform3f","uniform3fv","setValueV4f","uniform4f","uniform4fv","setValueM2","uniformMatrix2fv","setValueM3","uniformMatrix3fv","setValueM4","uniformMatrix4fv","setValueV1i","uniform1i","setValueV2i","uniform2i","uniform2iv","setValueV3i","uniform3i","uniform3iv","setValueV4i","uniform4i","uniform4iv","setValueV1ui","uniform1ui","setValueV2ui","uniform2ui","uniform2uiv","setValueV3ui","uniform3ui","uniform3uiv","setValueV4ui","uniform4ui","uniform4uiv","setValueT1","emptyTexture2D","SAMPLER_2D_SHADOW","setTexture2D","setValueT3D1","setTexture3D","setValueT6","setTextureCube","setValueT2DArray1","setTexture2DArray","setValueV1fArray","uniform1fv","setValueV2fArray","setValueV3fArray","setValueV4fArray","setValueM2Array","setValueM3Array","setValueM4Array","setValueV1iArray","uniform1iv","setValueV2iArray","setValueV3iArray","setValueV4iArray","setValueV1uiArray","uniform1uiv","setValueV2uiArray","setValueV3uiArray","setValueV4uiArray","setValueT1Array","setValueT3DArray","setValueT6Array","setValueT2DArrayArray","SingleUniform","activeInfo","getSingularSetter","PureArrayUniform","getPureArraySetter","StructuredUniform","seq","RePathPart","addUniform","uniformObject","parseUniform","pathLength","matchEnd","idIsIndex","subscript","WebGLUniforms","getProgramParameter","ACTIVE_UNIFORMS","getActiveUniform","getUniformLocation","setOptional","seqWithValue","WebGLShader","createShader","shaderSource","compileShader","programIdCount","_m0","getShaderErrors","getShaderParameter","COMPILE_STATUS","getShaderInfoLog","errorMatches","errorLine","lines2","handleSource","getShaderSource","getTexelEncodingFunction","functionName","encodingMatrix","getEncodingComponents","getToneMappingFunction","toneMappingName","_v0","filterEmptyLine","replaceLightNums","numSpotLightCoords","numSpotLightShadows","numSpotLightMaps","numSpotLightShadowsWithMaps","numDirLights","numSpotLights","numRectAreaLights","numPointLights","numHemiLights","numDirLightShadows","numPointLightShadows","replaceClippingPlaneNums","numClippingPlanes","numClipIntersection","includePattern","resolveIncludes","includeReplacer","shaderChunkMap","newInclude","unrollLoopPattern","unrollLoops","loopReplacer","snippet","generatePrecision","precisionstring","WebGLProgram","shadowMapTypeDefine","shadowMapType","generateShadowMapTypeDefine","envMapTypeDefine","envMapMode","generateEnvMapTypeDefine","envMapModeDefine","generateEnvMapModeDefine","envMapBlendingDefine","generateEnvMapBlendingDefine","envMapCubeUVSize","imageHeight","envMapCubeUVHeight","maxMip","texelHeight","texelWidth","generateCubeUVSize","customVertexExtensions","extensionClipCullDistance","extensionMultiDraw","generateVertexExtensions","customDefines","generateDefines","createProgram","prefixVertex","prefixFragment","versionString","shaderType","shaderName","batching","batchingColor","instancing","instancingColor","instancingMorph","useFog","fogExp2","normalMapObjectSpace","normalMapTangentSpace","mapUv","alphaMapUv","lightMapUv","aoMapUv","emissiveMapUv","bumpMapUv","normalMapUv","displacementMapUv","metalnessMapUv","roughnessMapUv","anisotropyMapUv","clearcoatMapUv","clearcoatNormalMapUv","clearcoatRoughnessMapUv","iridescenceMapUv","iridescenceThicknessMapUv","sheenColorMapUv","sheenRoughnessMapUv","specularMapUv","specularColorMapUv","specularIntensityMapUv","transmissionMapUv","thicknessMapUv","vertexTangents","vertexAlphas","vertexUv1s","vertexUv2s","vertexUv3s","pointsUvs","skinning","morphTextureStride","flipSided","shadowMapEnabled","numLightProbes","decodeVideoTexture","decodeVideoTextureEmissive","opaque","useDepthPacking","vertexGlsl","fragmentGlsl","glVertexShader","glFragmentShader","onFirstUse","checkShaderErrors","programInfoLog","getProgramInfoLog","vertexShaderInfoLog","fragmentShaderInfoLog","programLog","vertexLog","fragmentLog","runnable","haveDiagnostics","LINK_STATUS","onShaderError","vertexErrors","fragmentErrors","getError","VALIDATE_STATUS","diagnostics","deleteShader","cachedUniforms","ACTIVE_ATTRIBUTES","getActiveAttrib","FLOAT_MAT2","getAttribLocation","fetchAttributeLocations","attachShader","bindAttribLocation","linkProgram","programReady","rendererExtensionParallelShaderCompile","deleteProgram","usedTimes","WebGLShaderCache","shaderCache","materialCache","vertexShaderStage","_getShaderStage","fragmentShaderStage","materialShaders","_getShaderCacheForMaterial","shaderStage","getVertexShaderID","getFragmentShaderID","WebGLShaderStage","WebGLPrograms","_programLayers","_customShaders","_activeChannels","SUPPORTS_VERTEX_TEXTURES","shaderIDs","getChannel","getParameters","shaderID","customVertexShaderID","customFragmentShaderID","IS_INSTANCEDMESH","IS_BATCHEDMESH","HAS_MAP","HAS_MATCAP","HAS_ENVMAP","HAS_AOMAP","HAS_LIGHTMAP","HAS_BUMPMAP","HAS_NORMALMAP","HAS_DISPLACEMENTMAP","HAS_EMISSIVEMAP","HAS_METALNESSMAP","HAS_ROUGHNESSMAP","HAS_ANISOTROPY","HAS_CLEARCOAT","HAS_DISPERSION","HAS_IRIDESCENCE","HAS_SHEEN","HAS_TRANSMISSION","HAS_ANISOTROPYMAP","HAS_CLEARCOATMAP","HAS_CLEARCOAT_NORMALMAP","HAS_CLEARCOAT_ROUGHNESSMAP","HAS_IRIDESCENCEMAP","HAS_IRIDESCENCE_THICKNESSMAP","HAS_SHEEN_COLORMAP","HAS_SHEEN_ROUGHNESSMAP","HAS_SPECULARMAP","HAS_SPECULAR_COLORMAP","HAS_SPECULAR_INTENSITYMAP","HAS_TRANSMISSIONMAP","HAS_THICKNESSMAP","HAS_GRADIENTMAP","HAS_ALPHAMAP","HAS_ALPHATEST","HAS_ALPHAHASH","HAS_EXTENSIONS","supportsVertexTextures","directional","rectArea","hemi","shadowMap","getProgramCacheKey","morphAttributeCount","getProgramCacheKeyParameters","getProgramCacheKeyBooleans","acquireProgram","pl","preexistingProgram","releaseProgram","releaseShaderCache","WebGLProperties","painterSortStable","groupOrder","reversePainterSortStable","WebGLRenderList","renderItems","renderItemsIndex","transmissive","getNextRenderItem","renderItem","customOpaqueSort","customTransparentSort","WebGLRenderLists","lists","renderCallDepth","listArray","UniformsCache","halfWidth","nextVersion","shadowCastingAndTexturingLightsFirst","lightA","lightB","WebGLLights","shadowCache","ShadowUniformsCache","directionalLength","pointLength","spotLength","rectAreaLength","hemiLength","numDirectionalShadows","numPointShadows","numSpotShadows","numSpotMaps","ambient","directionalShadow","spotShadow","rectAreaLTC1","rectAreaLTC2","pointShadow","vector3","matrix42","numSpotShadowsWithMaps","shadowUniforms","LTC_FLOAT_1","LTC_FLOAT_2","LTC_HALF_1","LTC_HALF_2","setupView","WebGLRenderState","lightsArray","shadowsArray","transmissionRenderTarget","setupLights","setupLightsView","pushLight","pushShadow","shadowLight","WebGLRenderStates","renderStates","renderStateArray","renderState","WebGLShadowMap","_shadowMapSize","_viewportSize","_viewport","_depthMaterial","_distanceMaterial","_materialCache","_maxTextureSize","shadowMaterialVertical","VSM_SAMPLES","shadow_pass","shadowMaterialHorizontal","HORIZONTAL_PASS","fullScreenTri","fullScreenMesh","_previousType","VSMPass","renderBufferDirect","getDepthMaterial","customMaterial","keyA","keyB","materialsForVariant","onMaterialDispose","renderObject","kl","activeCubeFace","setBlending","setScissorTest","toVSM","fromVSM","shadowFrameExtents","pars","viewportCount","vp","reversedFuncs","WebGLState","colorBuffer","currentColorMask","currentColorClear","colorMask","setLocked","currentReversed","currentDepthMask","currentDepthFunc","currentDepthClear","setReversed","clipControlEXT","LOWER_LEFT_EXT","ZERO_TO_ONE_EXT","NEGATIVE_ONE_TO_ONE_EXT","oldDepth","DEPTH_TEST","depthMask","setFunc","NEVER","ALWAYS","LESS","LEQUAL","EQUAL","GEQUAL","GREATER","NOTEQUAL","currentStencilMask","currentStencilFunc","currentStencilRef","currentStencilFuncMask","currentStencilFail","currentStencilZFail","currentStencilZPass","currentStencilClear","stencilTest","STENCIL_TEST","stencilMask","setOp","stencilOp","clearStencil","uboBindings","uboProgramMap","enabledCapabilities","currentBoundFramebuffers","currentDrawbuffers","defaultDrawbuffers","currentProgram","currentBlendingEnabled","currentBlending","currentBlendEquation","currentBlendSrc","currentBlendDst","currentBlendEquationAlpha","currentBlendSrcAlpha","currentBlendDstAlpha","currentBlendColor","currentBlendAlpha","currentPremultipledAlpha","currentFlipSided","currentCullFace","currentLineWidth","currentPolygonOffsetFactor","currentPolygonOffsetUnits","MAX_COMBINED_TEXTURE_IMAGE_UNITS","lineWidthAvailable","glVersion","currentTextureSlot","currentBoundTextures","scissorParam","SCISSOR_BOX","viewportParam","VIEWPORT","currentScissor","currentViewport","createTexture","dimensions","bindTexture","texParameteri","TEXTURE_MIN_FILTER","NEAREST","TEXTURE_MAG_FILTER","TEXTURE_3D","TEXTURE_2D_ARRAY","texImage3D","RGBA","texImage2D","emptyTextures","TEXTURE_2D","TEXTURE_CUBE_MAP","TEXTURE_CUBE_MAP_POSITIVE_X","setFlipSided","setCullFace","CULL_FACE","equationToGL","FUNC_ADD","FUNC_SUBTRACT","FUNC_REVERSE_SUBTRACT","MIN","MAX","factorToGL","ZERO","SRC_COLOR","SRC_ALPHA","SRC_ALPHA_SATURATE","DST_COLOR","DST_ALPHA","ONE_MINUS_SRC_COLOR","ONE_MINUS_SRC_ALPHA","ONE_MINUS_DST_COLOR","ONE_MINUS_DST_ALPHA","CONSTANT_COLOR","ONE_MINUS_CONSTANT_COLOR","CONSTANT_ALPHA","ONE_MINUS_CONSTANT_ALPHA","BLEND","blendEquationSeparate","blendFuncSeparate","blendFunc","frontFace","CW","CCW","cullFace","FRONT","FRONT_AND_BACK","setPolygonOffset","factor","POLYGON_OFFSET_FILL","bindFramebuffer","framebuffer","DRAW_FRAMEBUFFER","FRAMEBUFFER","drawBuffers","COLOR_ATTACHMENT0","useProgram","setMaterial","frontFaceCW","SAMPLE_ALPHA_TO_COVERAGE","setLineWidth","SCISSOR_TEST","activeTexture","webglSlot","TEXTURE0","webglType","webglTexture","boundTexture","unbindTexture","compressedTexImage2D","compressedTexImage3D","updateUBOMapping","uniformsGroup","blockIndex","getUniformBlockIndex","uniformBlockBinding","__bindingPointIndex","texStorage2D","texStorage3D","texSubImage2D","texSubImage3D","compressedTexSubImage2D","compressedTexSubImage3D","KEEP","READ_FRAMEBUFFER","WebGLTextures","_gl","multisampledRTTExt","supportsInvalidateFramebuffer","_imageDimensions","_videoTextures","_sources","useOffscreenCanvas","OffscreenCanvas","createCanvas","needsNewCanvas","maxSize","getDimensions","textureNeedsGenerateMipmaps","generateMipmap","getTargetType","isWebGL3DRenderTarget","isWebGLArrayRenderTarget","isCompressedArrayTexture","getInternalFormat","internalFormatName","glFormat","glType","forceLinearTransfer","RED","R32F","R16F","R8","RED_INTEGER","R8UI","R16UI","R32UI","R8I","R16I","R32I","RG","RG32F","RG16F","RG8","RG_INTEGER","RG8UI","RG16UI","RG32UI","RG8I","RG16I","RG32I","RGB_INTEGER","RGB8UI","RGB16UI","RGB32UI","RGB8I","RGB16I","RGB32I","RGBA_INTEGER","RGBA8UI","RGBA16UI","RGBA32UI","RGBA8I","RGBA16I","RGBA32I","UNSIGNED_INT_5_9_9_9_REV","RGB9_E5","UNSIGNED_INT_10F_11F_11F_REV","R11F_G11F_B10F","RGBA32F","RGBA16F","SRGB8_ALPHA8","RGBA8","UNSIGNED_SHORT_4_4_4_4","RGBA4","UNSIGNED_SHORT_5_5_5_1","RGB5_A1","getInternalDepthFormat","useStencil","depthType","glInternalFormat","DEPTH24_STENCIL8","DEPTH32F_STENCIL8","DEPTH_COMPONENT24","DEPTH_COMPONENT32F","DEPTH_COMPONENT16","getMipLevels","isFramebufferTexture","textureProperties","__webglInit","webglTextures","__cacheKey","deleteTexture","deallocateTexture","onRenderTargetDispose","renderTargetProperties","__webglFramebuffer","deleteFramebuffer","__webglDepthbuffer","deleteRenderbuffer","__webglMultisampledFramebuffer","__webglColorRenderbuffer","__webglDepthRenderbuffer","attachmentProperties","__webglTexture","deallocateRenderTarget","textureUnits","updateVideoTexture","__version","uploadTexture","wrappingToGL","CLAMP_TO_EDGE","MIRRORED_REPEAT","filterToGL","NEAREST_MIPMAP_NEAREST","NEAREST_MIPMAP_LINEAR","LINEAR_MIPMAP_NEAREST","LINEAR_MIPMAP_LINEAR","compareToGL","setTextureParameters","TEXTURE_WRAP_S","TEXTURE_WRAP_T","TEXTURE_WRAP_R","TEXTURE_COMPARE_MODE","COMPARE_REF_TO_TEXTURE","TEXTURE_COMPARE_FUNC","__currentAnisotropy","texParameterf","TEXTURE_MAX_ANISOTROPY_EXT","initTexture","forceUpload","textureCacheKey","getTextureCacheKey","getRow","rowLength","componentStride","sourceProperties","workingPrimaries","texturePrimaries","unpackConversion","NONE","BROWSER_DEFAULT_WEBGL","pixelStorei","UNPACK_FLIP_Y_WEBGL","UNPACK_PREMULTIPLY_ALPHA_WEBGL","UNPACK_ALIGNMENT","UNPACK_COLORSPACE_CONVERSION_WEBGL","verifyColorSpace","mipmap","useTexStorage","allocateMemory","previousEnd","currentRow","previousRow","currentUnpackRowLen","UNPACK_ROW_LENGTH","currentUnpackSkipPixels","UNPACK_SKIP_PIXELS","currentUnpackSkipRows","UNPACK_SKIP_ROWS","pixelStart","pixelCount","updateTexture","layerByteLength","layerData","subarray","setupFrameBufferTexture","attachment","textureTarget","__renderTarget","__hasExternalTextures","useMultisampledRTT","framebufferTexture2DMultisampleEXT","getRenderTargetSamples","TEXTURE_CUBE_MAP_NEGATIVE_Z","framebufferTexture2D","setupRenderBufferStorage","renderbuffer","isMultisample","bindRenderbuffer","RENDERBUFFER","glAttachmentType","DEPTH_STENCIL_ATTACHMENT","DEPTH_ATTACHMENT","renderbufferStorageMultisampleEXT","renderbufferStorageMultisample","renderbufferStorage","framebufferRenderbuffer","setupDepthTexture","webglDepthTexture","setupDepthRenderbuffer","isCube","__boundDepthTexture","__depthDisposeCallback","disposeEvent","__autoAllocateDepthBuffer","createRenderbuffer","invalidationArrayRead","invalidationArrayDraw","__useRenderToTexture","textureUnit","resetTextureUnits","isCompressed","cubeImage","mipmapImage","uploadCubeTexture","rebindTextures","colorTexture","setupRenderTarget","isMultipleRenderTargets","createFramebuffer","glTextureType","updateRenderTargetMipmap","updateMultisampleRenderTarget","COLOR_BUFFER_BIT","depthStyle","DEPTH_BUFFER_BIT","STENCIL_BUFFER_BIT","blitFramebuffer","invalidateFramebuffer","WebGLUtils","ALPHA","DEPTH_COMPONENT","DEPTH_STENCIL","COMPRESSED_SRGB_S3TC_DXT1_EXT","COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT","COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT","COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT","COMPRESSED_RGB_S3TC_DXT1_EXT","COMPRESSED_RGBA_S3TC_DXT1_EXT","COMPRESSED_RGBA_S3TC_DXT3_EXT","COMPRESSED_RGBA_S3TC_DXT5_EXT","COMPRESSED_RGB_PVRTC_4BPPV1_IMG","COMPRESSED_RGB_PVRTC_2BPPV1_IMG","COMPRESSED_RGBA_PVRTC_4BPPV1_IMG","COMPRESSED_RGBA_PVRTC_2BPPV1_IMG","COMPRESSED_SRGB8_ETC2","COMPRESSED_RGB8_ETC2","COMPRESSED_SRGB8_ALPHA8_ETC2_EAC","COMPRESSED_RGBA8_ETC2_EAC","COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR","COMPRESSED_RGBA_ASTC_4x4_KHR","COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR","COMPRESSED_RGBA_ASTC_5x4_KHR","COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR","COMPRESSED_RGBA_ASTC_5x5_KHR","COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR","COMPRESSED_RGBA_ASTC_6x5_KHR","COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR","COMPRESSED_RGBA_ASTC_6x6_KHR","COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR","COMPRESSED_RGBA_ASTC_8x5_KHR","COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR","COMPRESSED_RGBA_ASTC_8x6_KHR","COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR","COMPRESSED_RGBA_ASTC_8x8_KHR","COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR","COMPRESSED_RGBA_ASTC_10x5_KHR","COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR","COMPRESSED_RGBA_ASTC_10x6_KHR","COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR","COMPRESSED_RGBA_ASTC_10x8_KHR","COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR","COMPRESSED_RGBA_ASTC_10x10_KHR","COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR","COMPRESSED_RGBA_ASTC_12x10_KHR","COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR","COMPRESSED_RGBA_ASTC_12x12_KHR","COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT","COMPRESSED_RGBA_BPTC_UNORM_EXT","COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT","COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT","COMPRESSED_RED_RGTC1_EXT","COMPRESSED_SIGNED_RED_RGTC1_EXT","COMPRESSED_RED_GREEN_RGTC2_EXT","COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT","UNSIGNED_INT_24_8","WebXRDepthSensing","depthNear","depthFar","depthData","getMesh","cameraXR","depthColor","depthWidth","depthHeight","getDepthTexture","WebXRManager","framebufferScaleFactor","referenceSpaceType","foveation","customReferenceSpace","glBinding","glProjLayer","glBaseLayer","xrFrame","supportsGlBinding","XRWebGLBinding","depthSensing","cameraAccessTextures","getContextAttributes","initialRenderTarget","newRenderTarget","controllers","controllerInputSources","currentSize","currentPixelRatio","cameraL","cameraR","_currentDepthNear","_currentDepthFar","onSessionEvent","controllerIndex","onSessionEnd","onInputSourcesChange","isPresenting","setPixelRatio","added","cameraAutoUpdate","getController","getControllerGrip","getHand","setFramebufferScaleFactor","setReferenceSpaceType","getReferenceSpace","setReferenceSpace","getBaseLayer","getBinding","getFrame","getSession","setSession","xrCompatible","makeXRCompatible","getPixelRatio","depthFormat","glDepthFormat","projectionlayerInit","colorFormat","scaleFactor","createProjectionLayer","updateRenderState","textureWidth","textureHeight","antialias","ignoreDepthValues","layerInit","XRWebGLLayer","baseLayer","framebufferWidth","framebufferHeight","setFoveation","requestReferenceSpace","cameraLPos","cameraRPos","updateCamera","ipd","projL","projR","topFov","bottomFov","leftFov","rightFov","zOffset","near2","far2","left2","right2","top2","bottom2","setProjectionFromUnion","updateUserCamera","getCamera","getFoveation","fixedFoveation","hasDepthSensing","getDepthSensingMesh","getCameraTexture","xrCamera","onAnimationFrameCallback","getViewerPose","setRenderTargetFramebuffer","cameraXRNeedsUpdate","glSubImage","getViewSubImage","setRenderTargetTextures","depthStencilTexture","enabledFeatures","depthUsage","getDepthInformation","cameraTex","glTexture","getCameraImage","detectedPlanes","_e1","WebGLMaterials","refreshTransformUniform","refreshUniformsCommon","refreshFogUniforms","refreshMaterialUniforms","pixelRatio","refreshUniformsToon","refreshUniformsPhong","refreshUniformsStandard","refreshUniformsPhysical","refreshUniformsMatcap","refreshUniformsDistance","refreshUniformsLine","refreshUniformsDash","refreshUniformsPoints","refreshUniformsSprites","WebGLUniformsGroups","updateList","allocatedBindingPoints","maxBindingPoints","MAX_UNIFORM_BUFFER_BINDINGS","hasUniformChanged","indexString","cachedObject","getUniformSize","boundary","onUniformsGroupsDispose","webglProgram","uniformArray","chunkOffset","chunkPadding","chunkStart","__data","__offset","__size","__cache","prepareUniformsGroup","bindingPointIndex","allocateBindingPointIndex","UNIFORM_BUFFER","bindBufferBase","arrayOffset","updateBufferData","DATA","lut","AlwaysStencilFunc","AnimationLoader","AnimationMixer","_initMemoryManager","_accuIndex","_bindAction","prototypeAction","rootUuid","bindingsByRoot","_bindingsByRootAndName","bindingsByName","_addInactiveBinding","clipUuid","actionsForClip","_actionsByClip","knownActions","_addInactiveAction","_lendBinding","_lendAction","_takeBackBinding","_takeBackAction","_actions","_nActiveActions","_nActiveBindings","_controlInterpolants","_nActiveControlInterpolants","stats","inUse","controlInterpolants","actionsByClip","actionByRoot","_removeInactiveAction","lastInactiveAction","cacheIndex","knownActionsForClip","lastKnownAction","byClipCacheIndex","_removeInactiveBindingsForAction","_removeInactiveBinding","prevIndex","lastActiveIndex","firstInactiveAction","firstInactiveIndex","lastActiveAction","bindingByName","propBinding","lastInactiveBinding","firstInactiveBinding","lastActiveBinding","__cacheIndex","lastActiveInterpolant","clipAction","optionalRoot","clipObject","existingAction","newAction","stopAllAction","nActions","nBindings","setTime","uncacheClip","actionsToRemove","uncacheRoot","uncacheAction","AnimationObjectGroup","_objects","_indicesByUUID","_paths","_parsedPaths","_bindingsIndicesByPath","bindingsPerObject","indicesByUUID","parsedPaths","knownObject","nObjects","nCachedObjects","firstActiveIndex","lastCachedObject","bindingsForPath","lastCached","lastCachedIndex","firstActiveObject","firstActive","lastObject","indicesByPath","unsubscribe_","lastBindingsIndex","lastBindings","AnimationUtils","subclip","sourceClip","startFrame","endFrame","minStartTime","makeClipAdditive","targetClip","referenceFrame","referenceClip","numTracks","referenceTime","referenceTrack","referenceTrackType","targetTrack","referenceOffset","referenceValueSize","targetValueSize","referenceValue","numTimes","valueStart","valueEnd","ArrowHelper","headLength","headWidth","cone","setDirection","setColor","AudioAnalyser","audio","fftSize","analyser","createAnalyser","frequencyBinCount","getFrequencyData","getByteFrequencyData","getAverageFrequency","AudioListener","timeDelta","_clock","removeFilter","getMasterVolume","setMasterVolume","positionX","linearRampToValueAtTime","positionY","positionZ","forwardX","forwardY","forwardZ","upX","upY","upZ","setOrientation","AudioLoader","handleError","bufferCopy","decodeAudioData","AxesHelper","setColors","xAxisColor","yAxisColor","zAxisColor","BasicDepthPacking","BasicShadowMap","Box2","isBox2","Box3Helper","BoxHelper","positions","CameraHelper","addLine","addPoint","colorFrustum","colorCone","colorUp","colorTarget","colorCross","colorAttribute","nearZ","farZ","CanvasTexture","isCanvasTexture","CompressedArrayTexture","CompressedCubeTexture","isCompressedCubeTexture","CompressedTextureLoader","texDatas","mipmapCount","isCubemap","CubeTextureLoader","urls","CullFaceFrontBack","Cylindrical","DataTextureLoader","texData","DataUtils","DecrementStencilOp","DecrementWrapStencilOp","DirectionalLightHelper","lightPlane","targetLine","DynamicCopyUsage","DynamicDrawUsage","DynamicReadUsage","EqualStencilFunc","Float16BufferAttribute","FramebufferTexture","GLBufferAttribute","setType","setItemSize","setCount","GLSL1","GreaterEqualStencilFunc","GreaterStencilFunc","GridHelper","HemisphereLightHelper","IncrementStencilOp","IncrementWrapStencilOp","InstancedInterleavedBuffer","Int16BufferAttribute","Int32BufferAttribute","Int8BufferAttribute","InterpolationSamplingMode","CENTROID","SAMPLE","EITHER","InterpolationSamplingType","PERSPECTIVE","FLAT","InvertStencilOp","LessEqualStencilFunc","LessStencilFunc","Line3","distanceSq","closestPointToPointParameter","clampToLine","startEnd2","distanceSqToLine3","LinearMipMapLinearFilter","LinearMipMapNearestFilter","LoopOnce","LoopPingPong","LoopRepeat","NearestMipMapLinearFilter","NearestMipMapNearestFilter","NeverStencilFunc","NotEqualStencilFunc","ObjectLoader","parseAnimations","parseShapes","parseGeometries","parseImages","parseTextures","parseMaterials","parseObject","parseSkeletons","bindSkeletons","bindLightTargets","hasImages","parseImagesAsync","bufferGeometryLoader","deserializeImage","loadImage","imageArray","deserializedImage","parseConstant","getGeometry","getMaterial","isInteger","objectAnimations","PlaneHelper","PointLightHelper","sphereSize","PolarGridHelper","sectors","rings","PositionalAudio","panner","createPanner","panningModel","getRefDistance","refDistance","setRefDistance","getRolloffFactor","rolloffFactor","setRolloffFactor","getDistanceModel","distanceModel","setDistanceModel","getMaxDistance","setMaxDistance","setDirectionalCone","coneInnerAngle","coneOuterAngle","coneOuterGain","orientationX","orientationY","orientationZ","RGBDepthPacking","RGBIntegerFormat","RGDepthPacking","Raycaster","setFromCamera","coords","setFromXRController","intersectObject","intersectObjects","RenderTarget3D","isRenderTarget3D","ReplaceStencilOp","ShapePath","subPaths","currentPath","toShapes","isCCW","isPointInsidePolygon","inPolygon","polyLen","edgeLowPt","edgeHighPt","edgeDx","edgeDy","perpEdge","solid","tmpPath","tmpShape","holesFirst","betterShapeHoles","newShapes","tmpPoints","tmpHoles","newShapeHoles","mainIdx","inSubpaths","toShapesNoHoles","ambiguous","toChange","sIdx","sLen","sho","hIdx","ho","hole_unassigned","s2Idx","SkeletonHelper","isSkeletonHelper","SpotLightHelper","coneLength","coneWidth","StaticCopyUsage","StaticReadUsage","StereoCamera","eyeSep","eyeSepHalf","eyeSepOnProjection","ymax","xmin","xmax","StreamCopyUsage","StreamDrawUsage","StreamReadUsage","TextureUtils","imageAspect","Timer","_previousTime","_currentTime","_elapsed","_timescale","_pageVisibilityHandler","getElapsed","getTimescale","setTimescale","timescale","TimestampQuery","COMPUTE","RENDER","Uint8BufferAttribute","Uint8ClampedBufferAttribute","UniformsGroup","isUniformsGroup","setName","uniformsSource","VideoFrameTexture","isVideoFrameTexture","setFrame","WebGL3DRenderTarget","WebGLArrayRenderTarget","WebGLRenderer","preserveDrawingBuffer","powerPreference","failIfMajorPerformanceCaveat","_alpha","isWebGLRenderer","WebGLRenderingContext","INTEGER_FORMATS","UNSIGNED_TYPES","uintClearColor","intClearColor","currentRenderList","currentRenderState","renderListStack","renderStateStack","toneMappingExposure","transmissionResolutionScale","_isContextLost","_outputColorSpace","_currentActiveCubeFace","_currentActiveMipmapLevel","_currentRenderTarget","_currentMaterialId","_currentCamera","_currentViewport","_currentScissor","_currentScissorTest","_currentClearColor","_currentClearAlpha","_height","_pixelRatio","_opaqueSort","_transparentSort","_scissor","_scissorTest","_clippingEnabled","_localClippingEnabled","_vector4","_emptyScene","_renderBackground","getTargetPixelRatio","programCache","renderLists","morphtargets","bufferRenderer","indexedBufferRenderer","contextName","contextAttributes","onContextLost","onContextRestore","onContextCreationError","initGLContext","infoAutoReset","shadowMapAutoUpdate","shadowMapNeedsUpdate","statusMessage","releaseMaterialProgramReferences","deallocateMaterial","prepareMaterial","getProgram","forceContextLoss","loseContext","forceContextRestore","restoreContext","updateStyle","setViewport","getDrawingBufferSize","setDrawingBufferSize","getCurrentViewport","getScissor","setScissor","getScissorTest","boolean","setOpaqueSort","setTransparentSort","bits","isIntegerFormat","targetFormat","isUnsignedType","clearBufferuiv","COLOR","clearBufferiv","onXRSessionStart","onXRSessionEnd","needsProgramChange","needsLights","lightsStateVersion","refreshProgram","refreshMaterial","refreshLights","p_uniforms","m_uniforms","uCamPos","cameraPosition","isMeshGouraudMaterial","getUniformList","setProgram","rangeFactor","drawStart","drawEnd","targetScene","material2","compileAsync","checkMaterialsReady","projectObject","renderScene","opaqueObjects","transmissiveObjects","transparentObjects","renderObjects","renderTransmissionPass","activeViewport","currentToneMapping","currentCameraViewport","renderTargetNeedsUpdate","currentSide","programCacheKey","updateCommonMaterialProperties","materialNeedsLights","uniformsList","progUniforms","depthSensingMesh","camera2","defaultFramebuffer","__useDefaultFramebuffer","_scratchFrameBuffer","useDefaultFramebuffer","framebufferTextureLayer","readRenderTargetPixels","activeCubeFaceIndex","readBuffer","readPixels","readRenderTargetPixelsAsync","glBuffer","PIXEL_PACK_BUFFER","STREAM_READ","currFramebuffer","fenceSync","SYNC_GPU_COMMANDS_COMPLETE","getBufferSubData","deleteSync","copyFramebufferToTexture","levelScale","copyTexSubImage2D","_srcFramebuffer","_dstFramebuffer","copyTextureToTexture","srcTexture","dstTexture","srcRegion","dstPosition","srcLevel","dstLevel","dstX","dstY","dstZ","glTarget","currentUnpackImageHeight","UNPACK_IMAGE_HEIGHT","currentUnpackSkipImages","UNPACK_SKIP_IMAGES","isSrc3D","isDst3D","srcTextureProperties","dstTextureProperties","srcRenderTargetProperties","dstRenderTargetProperties","copyTexSubImage3D","initRenderTarget","resetState","ZeroStencilOp","getConsoleFunction","setConsoleFunction","_target_hasOwnProperty","_target_hasOwnProperty1","regexpFlags","nativeExec","patchedExec","UPDATES_LAST_INDEX_WRONG","BROKEN_CARET","NPCG_INCLUDED","reCopy","charsAdded","strCopy","$fromCodePoint","fromCodePoint","CSSRuleList","CSSStyleDeclaration","CSSValueList","ClientRectList","DOMRectList","DOMStringList","DOMTokenList","DataTransferItemList","HTMLAllCollection","HTMLCollection","HTMLFormElement","HTMLSelectElement","MediaList","MimeTypeArray","NamedNodeMap","NodeList","PaintRequestList","PluginArray","SVGLengthList","SVGNumberList","SVGPathSegList","SVGPointList","SVGStringList","SVGTransformList","SourceBufferList","StyleSheetList","TextTrackCueList","TextTrackList","TouchList","searchParams","params2","escapeCommas","SHARED","versions","copyright","license","difference","setLike","baseSet","PrototypeOfArrayIteratorPrototype","arrayIterator","exceptions","STRING_ITERATOR","pluginConfig","sym","unsafeInt","unicode","Root","_error","callWithSafeIterationClosing","arrayLike","IS_CONSTRUCTOR","mapfn","imagesLoaded","ImagesLoaded","onAlways","queryElem","getImages","jqDeferred","addElementImages","elementNodeTypes","addImage","addElementBackgroundImages","childImgs","reURL","LoadingImage","Background","addBackground","loadingImage","progressedCount","hasAnyBroken","isComplete","jqMethod","getIsImageComplete","proxyImage","unbindEvents","makeJQueryPlugin","unicodeSets","$padStart","padStart","_processor","processor","CONVERT_TO_STRING","codeAt","_corePluginList","_configurePlugins","_colors","_toPath","_normalizeConfig","_isPlainObject","_cloneDeep","_pluginUtils","_toColorValue","mergeWith","configUtils","negative","negativeScale","negativeValue","mergeExtensionCustomizer","mergeExtensions","themeValue","resolveThemePath","valueToResolve","resolveFunctionKeys","resolvePath","newPath","toPaths","extractPluginConfigs","allConfigs","_config_plugins","_plugin_config","important","_t_theme","_c_plugins","pluginLists","corePluginConfigs","themes","mergedValue","extendValue","reduceRight","corePluginConfig","pluginList","createWellKnownSymbol","withoutSetter","$SyntaxError","codePoints","IS_4_HEX_DIGITS","IS_C0_CONTROL_CODE","unterminated","twoChars","fourHexDigits","Universal","USE_NATIVE_URL","validateArgumentsLength","arraySort","URL_SEARCH_PARAMS","URL_SEARCH_PARAMS_ITERATOR","getInternalParamsState","nativeFetch","NativeRequest","RequestPrototype","HeadersPrototype","VALID_HEX","parseHexOctet","getLeadingOnes","octet","utf8Decode","octets","codePoint","decodedChar","byteSequenceLength","sequenceIndex","nextByte","replacements","URLSearchParamsIterator","URLSearchParamsState","bindURL","entryIterator","entryNext","updateURL","URLSearchParamsConstructor","URLSearchParamsPrototype","$value","headersHas","headersSet","wrapRequestOptions","RequestConstructor","$every","interruptible","toColorValue","maybeFunction","nativeJoin","keywordValues","isColorSupported","italic","underline","strikethrough","bgBlack","bgRed","bgGreen","bgYellow","bgBlue","bgMagenta","bgCyan","bgWhite","blackBright","redBright","greenBright","yellowBright","blueBright","magentaBright","cyanBright","whiteBright","bgBlackBright","bgRedBright","bgGreenBright","bgYellowBright","bgBlueBright","bgMagentaBright","bgCyanBright","bgWhiteBright","createColors","doesNotExceedSafeInteger","arraySpeciesCreate","IS_CONCAT_SPREADABLE","IS_CONCAT_SPREADABLE_SUPPORT","isConcatSpreadable","spreadable","normalizeAttributeSelectors","gradient","_parseBoxShadowValue","cssFunctions","isCSSFunction","AUTO_VAR_INJECTION_EXCEPTIONS","isVarException","fullMatch","characterBefore","preventFormattingInFunctions","preventFormattingKeywords","lastChar","trimEnd","peek","consumeUntil","chars","minIndex","normalizeMathOperatorSpacing","_fullMatch","trailingCharacter","lengthUnitsPattern","lineWidths","parsedShadows","parsedShadow","gradientTypes","validPositions","fonts","genericNames","absoluteSizes","relativeSizes","NASHORN_BUG","nativeToString","NOT_GENERIC","INCORRECT_NAME","regexAnySingleEscape","regexSingleEscape","regexExcessiveSpaces","cssesc","firstChar","character","escapeEverything","$0","_isTouch","_pointerType","_normalizer","_eventTypes","_startup","_observers","_scrollers","_proxies","_bridge","_getProxyProp","_isViewport","_addListener","_scrollLeft","_scrollTop","_onScroll","isPressed","_scrollCacheFunc","doNotCache","cachingFunc","scrollRestoration","isNormalizing","iOS","cacheID","_horizontal","os","os2","sc","_vertical","_getTarget","_getScrollFunc","scrollingElement","_getVelocityProp","minTimeRefresh","useDelta","dropToZeroTime","latestValue","tOld","vOld","_getEvent","_gsapAllow","_getAbsoluteMax","_setScrollTrigger","scrollers","proxies","Observer","msMaxTouchPoints","eventTypes","dragMinimum","onStop","onStopDelay","wheelSpeed","onDragStart","onDragEnd","onDrag","onPress","onRelease","onRight","onLeft","onUp","onDown","onChangeX","onChangeY","onToggleX","onToggleY","onHover","onHoverEnd","ignoreCheck","isNormalizer","onGestureStart","onGestureEnd","onEnable","onDisable","scrollSpeed","allowClicks","onLockAxis","onStopDelayedCall","dragged","moved","wheeled","prevDeltaX","prevDeltaY","scrollFuncX","scrollFuncY","limitToTouch","isViewport","ownerDoc","onClickTime","clickCapture","_ignoreCheck","isPointerOrTouch","_isWithin","changedX","changedY","onDelta","_vx","_vy","onTouchOrPointerDelta","_onDrag","startY","_onPress","_onRelease","isTrackingDrag","wasDragging","isDragNotClick","syntheticEvent","initMouseEvent","isGesturing","_onGestureStart","_onGestureEnd","_onWheel","multiplier","_onMove","_onHover","_onHoverEnd","_onClick","_dc","_resizeDelay","_time2","_syncInterval","_refreshing","_pointerIsDown","_prevWidth","_prevHeight","_autoRefresh","_ignoreResize","_ignoreMobileResize","_baseScreenHeight","_baseScreenWidth","_fixIOSBug","_scrollRestoration","_div100vh","_100vh","_isReverted","_clampingMax","_limitCallbacks","_rafID","_refreshingAll","_queueRefreshID","_primary","_time1","_lastScrollTime","_enabled","_parseClamp","_keepClamp","_rafBugFix","_pointerDownHandler","_pointerUpHandler","_getViewportDimension","dimensionProperty","_getBoundsFunc","_winOffsets","_getBounds","_maxScroll","_iterateAutoRefresh","_endAnimation","callbackAnimation","_abs","_left","_right","_bottom","_Right","_Left","_Top","_Bottom","_padding","_margin","_Width","_Height","_px","_getComputedStyle","withoutTransforms","_getSize","_getLabelRatioArray","_snapDirectional","snapIncrementOrArray","snapped","_multiListener","nonPassive","_wheelListener","scrollFunc","wheelHandler","_markerDefaults","startColor","endColor","indent","toggleActions","anticipatePin","_keywords","_offsetToPx","eqIndex","_createMarker","_ref4","matchWidthEl","containerAnimation","useFixedPosition","isScroller","_isStart","_positionMarker","marker","flipped","oppositeSide","_isFlipped","_triggers","_ids","_sync","_updateAll","_setBaseDimensions","_onResize","fullscreenElement","webkitFullscreenElement","_softRefresh","_refreshAll","_savedStyles","_revertRecorded","_recordScrollPositions","rec","_revertAll","_clearScrollMemory","_refreshID","_refresh100vh","_hideAllMarkers","skipRevert","isRefreshing","refreshInits","_subPinOffset","pin","adjustPinSpacing","scroller","_dir","endClamp","_endClamp","startClamp","_startClamp","setPositions","_lastScroll","_direction","isUpdating","recordVelocity","_propNamesToCopy","_stateProps","_swapPinIn","spacer","spacerState","swappedIn","spacerStyle","pinStyle","_setState","_getState","scrollerSize","markerScroller","scrollerBounds","scrollerMax","clampZeroProp","localOffset","globalOffset","_caScrollDist","_prefixExp","_reparent","_stOrig","_interruptionTracker","getValueFunc","initialValue","onInterrupt","last1","last2","_shiftMarker","_getTweenCreator","getScroll","getTween","change1","change2","checkForInterruption","pinCache","snapFunc","scroll1","scroll2","markerStart","markerEnd","markerStartTrigger","markerEndTrigger","markerVars","executingOnRefresh","pinOriginalState","pinActiveState","pinState","pinGetter","pinSetter","pinStart","pinChange","spacingStart","markerStartSetter","pinMoves","markerEndSetter","snap1","snap2","scrubTween","scrubSmooth","snapDurClamp","snapDelayedCall","prevScroll","prevAnimProgress","caMarkerSetter","customRevertReturn","onToggle","scrub","pinSpacing","invalidateOnRefresh","onScrubComplete","onSnapComplete","pinReparent","pinSpacer","fastScrollEnd","preventOverlaps","isToggle","scrollerCache","pinType","onEnter","onLeave","onEnterBack","onLeaveBack","markers","onRefreshInit","getScrollerSize","_getSizeFunc","getScrollerOffsets","_getOffsetsFunc","lastSnap","lastRefresh","prevProgress","refreshPriority","tweenScroll","scrubDuration","_getClosestLabel","refreshedRecently","endScroll","naturalEnd","inertia","_snap","_onInterrupt","_onComplete","stRevert","spacerIsNative","oldOnUpdate","oldParams","onUpdateParams","prevRefreshing","_swapPinOut","pinOffset","override","curTrigger","curPin","oppositeScroll","revertedPins","forcedOverflow","markerStartOffset","markerEndOffset","isFirstRefresh","otherPinOffset","parsedEnd","parsedEndTrigger","endTrigger","pinnedContainer","triggerIndex","_pinPush","_pinOffset","omitOffsets","_copyState","endAnimation","labelToScroll","getTrailing","forceFake","toggleState","stateChanged","isAtMax","isTakingAction","clipped","newStart","newEnd","keepClamp","_change","allowAnimation","onKill","_queueRefreshAll","mm","bodyHasStyle","bodyStyle","borderTopStyle","AnimationProto","limitCallbacks","syncInterval","ignoreMobileResize","autoRefreshEvents","scrollerProxy","clearMatchMedia","isInViewport","positionInViewport","killAll","allowListeners","saveStyles","clearScrollMemory","maxScroll","getScrollFunc","snapDirectional","batch","varsCopy","batchMax","proxyCallback","triggers","_inputIsFocused","_clampScrollAndGetDurationMultiplier","_allowNativePanning","_overflow","_nestedScroll","_ref5","_isScrollT","_isScroll","_inputObserver","inputs","_captureInputs","_inputExp","isInput","_sortY","normalizeScroll","normalizer","lastRefreshID","skipTouchMove","startScrollX","startScrollY","_vars2","normalizeScrollX","momentum","allowNestedScroll","smoother","ScrollSmoother","smootherInstance","initialScale","wheelRefresh","resolveMomentumDuration","inputObserver","resumeTouchMove","scrollClampX","scrollClampY","updateClamps","removeContentOffset","ignoreDrag","prevScale","currentScroll","xArray","yArray","yClamped","_getScrollNormalizer","ss","$findIndex","FIND_INDEX","gobbleHex","lower","spaceTerminated","CONTAINS_ESCAPE","gobbled","isHostObject","IS_FILTER","IS_SOME","IS_EVERY","IS_FIND_INDEX","IS_FILTER_REJECT","NO_HOLES","specificCreate","filterReject","$location","setImmediate","clearImmediate","Dispatch","MessageChannel","ONREADYSTATECHANGE","runner","eventListener","globalPostMessageDefer","port2","port1","onmessage","importScripts","SHAM","DELEGATES_TO_SYMBOL","DELEGATES_TO_EXEC","execCalled","nativeRegExpMethod","nativeMethod","arg2","forceStringMethod","$exec","Selector","getWindow","isElement","isHTMLElement","isShadowRoot","ShadowRoot","getUAString","uaData","userAgentData","brands","brand","isLayoutViewport","includeScale","isFixedStrategy","clientRect","addVisualOffsets","getWindowScroll","getNodeName","getDocumentElement","getWindowScrollBarX","isScrollParent","getCompositeRect","elementOrVirtualElement","isFixed","isOffsetParentAnElement","offsetParentIsScaled","isElementScaled","getLayoutRect","getParentNode","assignedSlot","getScrollParent","listScrollParents","_element$ownerDocumen","scrollParent","isBody","updatedList","isTableElement","getTrueOffsetParent","getOffsetParent","currentNode","getContainingBlock","basePlacements","popper","variationPlacements","placement","modifierPhases","visited","requires","requiresIfExists","depModifier","DEFAULT_OPTIONS","strategy","areValidElements","popperGenerator","generatorOptions","_generatorOptions","_generatorOptions$def","_generatorOptions$def2","defaultOptions","orderedModifiers","modifiersData","effectCleanupFns","setOptionsAction","cleanupModifierEffects","scrollParents","contextElement","phase","orderModifiers","_ref$options","cleanupFn","_state$elements","rects","_state$orderedModifie","_state$orderedModifie2","onFirstUpdate","getBasePlacement","getVariation","getMainAxisFromPlacement","computeOffsets","basePlacement","variation","commonX","commonY","mainAxis","unsetSides","mapToStyles","_Object$assign2","popperRect","gpuAcceleration","adaptive","roundOffsets","_offsets$x","_offsets$y","hasX","hasY","sideX","sideY","heightProp","widthProp","commonStyles","dpr","devicePixelRatio","roundOffsetsByDPR","initialStyles","arrow","getOppositePlacement","getOppositeVariationPlacement","isSameNode","rectToClientRect","getClientRectFromMixedType","clippingParent","layoutViewport","getViewportRect","getInnerBoundingClientRect","winScroll","getDocumentRect","mergePaddingObject","paddingObject","expandToHashMap","hashMap","detectOverflow","_options$placement","_options$strategy","_options$boundary","_options$rootBoundary","rootBoundary","_options$elementConte","elementContext","_options$altBoundary","altBoundary","_options$padding","altContext","clippingClientRect","mainClippingParents","clippingParents","clipperElement","getClippingParents","firstClippingParent","clippingRect","accRect","getClippingRect","referenceClientRect","popperOffsets","popperClientRect","elementClientRect","overflowOffsets","offsetData","within","getSideOffsets","preventedOffsets","isAnySideFullyClipped","_options$scroll","_options$resize","_options$gpuAccelerat","_options$adaptive","_options$roundOffsets","_options$offset","invertDistance","skidding","distanceAndSkiddingToXY","_data$state$placement","_skip","_options$mainAxis","checkMainAxis","_options$altAxis","altAxis","checkAltAxis","specifiedFallbackPlacements","fallbackPlacements","_options$flipVariatio","flipVariations","allowedAutoPlacements","preferredPlacement","oppositePlacement","getExpandedFallbackPlacements","placements","_options$allowedAutoP","allowedPlacements","overflows","computeAutoPlacement","referenceRect","checksMap","makeFallbackChecks","firstFittingPlacement","_basePlacement","isStartVariation","mainVariationSide","altVariationSide","checks","_loop","fittingPlacement","_options$tether","tether","_options$tetherOffset","tetherOffset","isBasePlacement","tetherOffsetValue","normalizedTetherOffsetValue","offsetModifierState","_offsetModifierState$","mainSide","altSide","additive","maxLen","arrowElement","arrowRect","arrowPaddingObject","arrowPaddingMin","arrowPaddingMax","arrowLen","minOffset","maxOffset","arrowOffsetParent","offsetModifierValue","tetherMax","preventedOffset","_offsetModifierState$2","_mainSide","_altSide","_min","isOriginSide","_offsetModifierValue","_tetherMin","_tetherMax","_preventedOffset","withinMaxClamp","_state$modifiersData$","toPaddingObject","minProp","maxProp","endDiff","startDiff","clientSize","centerToReference","axisProp","centerOffset","_options$element","preventOverflow","referenceOverflow","popperAltOverflow","referenceClippingOffsets","popperEscapeOffsets","isReferenceHidden","hasPopperEscaped","CONTENT_CLASS","ARROW_CLASS","SVG_ARROW_CLASS","TOUCH_OPTIONS","TIPPY_DEFAULT_APPEND_TO","getValueAtIndexOrReturn","invokeWithArgsOrReturn","normalizeToArray","pushIfUnique","arrayFrom","removeUndefinedProps","setTransitionDuration","setVisibilityState","updateTransitionEndListener","actualContains","_target$getRootNode","currentInput","lastMouseMoveTime","onDocumentTouchStart","onDocumentMouseMove","_tippy","isIE11","msCrypto","defaultProps","getReferenceClientRect","hideOnClick","ignoreAttributes","interactive","interactiveBorder","interactiveDebounce","moveTransition","onAfterUpdate","onBeforeUpdate","onCreate","onDestroy","onHidden","onHide","onMount","onShow","onShown","onTrigger","onUntrigger","onClickOutside","popperOptions","showOnCreate","triggerTarget","animateFill","followCursor","inlinePositioning","allowHTML","role","defaultKeys","getExtendedPassedProps","passedProps","pluginProps","_name","evaluateProps","valueAsString","getDataAttributeProps","dangerouslySetInnerHTML","createArrowElement","boxChildren","prevProps","nextProps","_getChildren","$$tippy","idCounter","mouseMoveListeners","mountedInstances","createTippy","showTimeout","hideTimeout","scheduleHideAnimationFrame","lastTriggerEvent","currentTransitionEndListener","isVisibleFromClick","didHideDueToDocumentMouseDown","didTouchMove","ignoreOnFirstUpdate","debouncedOnMouseMove","popperInstance","isMounted","isShown","clearDelayTimeouts","partialProps","invokeHook","addListeners","cleanupInteractiveMouseListeners","handleAriaExpandedAttribute","handleStyles","createPopperInstance","getNestedPopperTree","nestedPopper","isAlreadyVisible","isTouchAndTouchDisabled","getCurrentTarget","getIsDefaultRenderFn","addDocumentPress","_getDefaultTemplateCh2","getDefaultTemplateChildren","_instance$popperInsta2","_getDefaultTemplateCh3","_content","handleAriaContentAttribute","onTransitionedIn","isAlreadyHidden","removeDocumentPress","_getDefaultTemplateCh4","onTransitionedOut","unmount","hideWithInteractivity","getDocument","destroyPopperInstance","_props$render","pluginsHooks","hasAriaExpanded","scheduleShow","getNormalizedTouchSettings","getIsCustomTouchBehavior","_instance$props$rende","getDelay","isShow","fromHide","shouldInvokePropsHook","_instance$props","pluginHooks","nextValue","onDocumentPress","actualTarget","onBlurOrFocusOut","_lastTriggerEvent","shouldScheduleClickHide","isEventListenerStopped","wasFocused","scheduleHide","isCursorOverReferenceOrPopper","popperTreeData","_instance$popperInsta","popperState","topDistance","bottomDistance","leftDistance","rightDistance","exceedsTop","exceedsBottom","exceedsLeft","exceedsRight","isCursorOutsideInteractiveBorder","_instance$props2","computedReference","_getNormalizedTouchSe","touchValue","touchDelay","tippy","optionalProps","isNodeList","setDefaultProps","onFinally","nativeKeys","jQueryBridget","PluginClass","arg0","$elems","pluginMethodStr","methodCall","NativeSymbol","EmptyStringDescriptionStore","SymbolWrapper","thisSymbolValue","symbolDescriptiveString","USER_AGENT","WRAP","scheduler","hasTimeArg","firstParamIndex","boundArgs","uncurryThisWithBind","v8","innerResult","innerError","dateToPrimitive","IS_INCLUDES","_resolveConfig","_getAllConfigs","defaultConfigs","matchesMethod","ElemProto","nativeToFixed","dataToString","fractionDigits","fractDigits","isNumber","isDomElement","isAnimationDescriptor","isSceneDescriptor","isParallaxDescriptor","BreakpointListener","windowWidth","checkView","screenSize","hasChanged","elm","OffsetParam","floatval","outer","includeMargin","Document","getScrollTop","getScrollLeft","getHeight","relativeToViewport","obj_1","style_1","isMarginCollapseType","extendStatics","__extends","__","__spreadArray","pack","logLevels","verbose","getHours","getMinutes","getSeconds","newArgs","Indicator","autoIndex","elemBounds","FONT_SIZE","ZINDEX","elemStart","tagBackArrow","tagFrontArrow","tagBlock","LINE_HEIGHT","colorStart","elemEnd","colorEnd","isDocument","boundsContainer","smoothScrolling","handleTriggerParamsChange","handleBoundsParamsChange","updateTriggerGroup","updateBounds","indicators","updateBoundsPositions","triggerGroup","members","updateTriggerGroupLabel","updateTriggerGroupPositions","removeTriggerGroup","removeBounds","addBounds","triggerPosition","startTag","startTagBlock","startTagBackArrow","startTagFrontArrow","endTag","endTagBlock","endTagBackArrow","endTagFrontArrow","addTriggerGroup","triggerElem","colorTrigger","newGroup","triggerHook","_d","_e","closeEnough","newOptions","EDGE_OFFSET","vendors","_requestAnimationFrame","_cancelAnimationFrame","timeToCall","cAF","ScrollDirection","Controller","_scrollPos","updateScenesOnNextCycle","scrollDirection","Paused","sceneObjects","viewPortSize","getViewportSize","scheduleRefresh","NAMESPACE","handleTriggerPositionChange","handleBoundsPositionChange","specificIndicator","indicator","paramPos","triggerSize","specificGroup","containerOffset","_scrollbar","scrollbarListener","removeListener","refreshInterval","refreshTimeout","getScrollPos","scrollbar","setScrollPos","updateScenes","scenesToUpdate_1","oldScrollPos","scrollPos","deltaScroll","Forward","Reverse","debounceUpdate","updateTimeout","resizeEvent","sortScenes","scenesList","globalSceneOptions","addIndicators","addScene","newScene","addTo","removeScene","oldScene","updateScene","currentScene","immediately","scrollTarget","additionalParameter","parent_1","PIN_SPACER_ATTRIBUTE","elementOffset","resetScenes","SceneState","_triggerPosition","Before","_scrollOffset","cssClassElems","updateTriggerElementPosition","updateScrollOffset","durationChanged","After","During","_duration","updatePinState","updatePinDimensions","removePin","removeClassToggle","updateTweenProgress","removeTween","_controller","durationUpdateMethod","_triggerElement","_triggerHook","_reverse","_logLevel","_tweenChanges","doUpdate","oldState","reverseOrForward","eventVars","triggerElement","updateDuration","onContainerResize","newProgress","startPos","endPos","setPin","pushFollowers","_f","parentDisplay","inFlow","pinCSS","sizeCSS","spacerCSS","mozBoxSizing","webkitBoxSizing","pinOptions","relSize","autoFullWidth","updatePinInContainer","updateRelativePinSpacer","onMousewheelOverPin","pinTarget","margins_1","setTween","removeIndicators","newDuration","validateDuration","elementPos","controllerInfo","Top","Left","forceUnpin","containerInfo","newCSS","fixedPos","scrollDistance","_g","_h","_j","_k","_l","during","marginCollapse","tweenChanges","validateOffset","validateTriggerElement","validateTriggerHook","validateReverse","valdiateLogLevel","validateTweenChanges","setClassToggle","cssClasses","progress_1","perc_1","onCenter","ScrollScene","pinnedElement","elementPosY_1","pinnedScrollListener","elementOffsetY","triggerOffsetY","triggerPosY","scrollPosY","pinnedEnterListener","addScrollbarListener","pinnedLeaveListener","removeScrollbarListener","decorators","decorate","eventListenerOptions","eventMap","getOptions","supportPassiveEvent","eventScope","getPointerData","isOneOf","VENDOR_PREFIX","RE","autoPrefix","cssProp","Tracker","velocityMultiplier","updateTime","lastPosition","TouchRecord","_touchList","_activeTouchID","tracker","_getActiveTracker","_primitiveValue","getEasingDistance","damping","deAcceleration","vel","_add","_renew","_setActiveID","release","_delete","_has","upper","leading","lastCalledAt","TrackDirection","Options","thumbMinSize","renderByPixels","alwaysShowTracks","continuousScrolling","delegateTo","ScrollbarThumb","_minSize","displaySize","realSize","attachTo","trackEl","containerSize","pageSize","_getStyle","ScrollbarTrack","_isShown","scrollbarContainer","TrackController","containerEl","autoHideOnIdle","animationIDStorage","defaultEasing","KEY_CODE","Direction","activeScrollbar","ScrollbarPlugin","_newTarget","onRender","_remainMomentum","transformDelta","_evt","globalPlugins","constructors","addPlugins","keyboardHandler","addEvent","limit","TAB","onlyScrollIfNeeded","handleTabKey","PAGE_UP","PAGE_DOWN","END","HOME","DOWN","getKeyDelta","addTransformableMomentum","willScroll","mouseHandler","isMouseDown","isMouseMoving","startOffsetToThumb","trackDirection","calcMomentum","clickPosition","getTrackDirection","clickPos","offsetOnTrack","setMomentum","cursorPos","thumbRect","resizeHandler","selectHandler","animationID","isContextMenuOpened","bounding","touchHandler","touchRecord","pointerCount","hasFeature","DELTA_MODE","getDeltaMode","DELTA_SCALE","wheelDeltaX","wheelDeltaY","wheelDelta","normalizeDelta","scrollbarMap","Scrollbar","_momentum","msPointerEnabled","msTouchAction","initPlugins","withoutCallbacks","_observer","parentScrollbar","containerStyles","verticalPadding","paddings","horizontalPadding","newSize","containerBounding","targetBounding","disX","disY","elapse","alignToTop","offsetBottom","_updateDebounced","finalDelta","_shouldPropagateMomentum","addMomentum","updatePluginOptions","_renderID","_render","destX","destY","nextX","_nextTick","nextY","remain","nextMomentum","STYLE_ID","isStyleAttached","attachStyle","styleEl","SmoothScrollbar","initAll","destroyAll","detachStyle","ScrollController","scrollbarListeners","isScrollingTo","_smoothScrolling","removeAllScenes","destroyController","createScrollbars","newPos","removeScrollbars","addAllScenes","targetId","latestTargetId","setScrollOffset","AnimationCreator","hasFromVars","hasToVars","getFromVars","getToVars","getTweenVars","xxl","isBoolean","isPercentage","isHookValue","toInteger","toFloat","toBoolean","toHookValue","toHTMLElement","screenWidth","BaseParser","getName","AnimationBuilder","fromAlpha","toAlpha","fromX","toX","fromY","toY","fromXPercent","toXPercent","fromYPercent","toYPercent","fromScale","toScale","fromRotation","toRotation","fromWidth","toWidth","fromHeight","toHeight","AnimationParser","builder","SceneBuilder","durationMethod","classToggle","SceneParser","ParallaxBuilder","ParallaxParser","ScrollXP","registeredScenes","registeredAnimations","domElements","anchorScenes","rebuild","anchors","anchor","setUpScrollTo","bindAnchors","section","elem_1","anchorScene","setDefault","parallax","getRegisteredScenes","getRegisteredAnimations","buildParallaxScenes","buildScenes","newParser","scene_1","createAnimation","domScene","creator","globalDescriptors","updateParallaxElements","during_1","Parallax"],"ignoreList":[],"sourceRoot":""}